RE: [linux-usb-devel] [PATCH] (linux 2.4.25) hangup on disconnect for usbserial module

From: Robert White
Date: Mon Apr 05 2004 - 00:51:23 EST


Pasting the whole program is impractical, so here is the psudocode

Open /dev/usb/ttyUSB0
Build Poll structure with events = POLLIN for this descriptor
Call poll(&structure,1,-1)

(Without the patch) If you pull the usb cable out of the computer, the program above
will never return from the poll. I was quite surprised, especially since this didn't
match the behavior of the ACM device that we alternately use in our box. The hang is
semi-terminal too, as nothing can reattach to the file descriptor from below.

If you use /dev/usb/ttyACM0 in the identical program (obviously also against a
different device 8-) when you pull the plug poll returns immediately and revents has
the (I think) POLLHUP bit set. (I am not certain this is the value, the actual
program considers all three of POLLHUP, POLLNVAL and POLLERR equally terminal in this
case and doesn't emit the actual value, but it is at least one of those. 8-)

The hangup semantic with all its ramifications (sighup if the device is a controlling
terminal etc.) is "good for me", and matches other kinds of (USB and non-USB)
devices, but I have no opinion on particular apps. I considered adding an IOCTL and
flag to control this but decided against for the following reasons:

The poll management happens at the far side of the tty layer, and this was the only
non-intrusive and portable way I could figure out to pass the disconnect event
through the that layer.

The CLOCAL flag already acts as a means to enable/disable tty_hangup()'s effects and
is mature and well documented as an interface feature.

There was no clear way to propagate this event that wasn't either far more delicate,
far reaching, or disruptive.


Rob.


-----Original Message-----
From: Pete Zaitcev [mailto:zaitcev@xxxxxxxxxx]
Sent: Sunday, April 04, 2004 10:15 PM
To: Robert White
Cc: linux-usb-devel@xxxxxxxxxxxxxxxxxxxxx; linux-kernel@xxxxxxxxxxxxxxx
Subject: Re: [linux-usb-devel] [PATCH] (linux 2.4.25) hangup on disconnect for
usbserial module

On Sun, 4 Apr 2004 21:46:52 -0700
"Robert White" <rwhite@xxxxxxxxxxxx> wrote:

> This is "reasonably well tested" on the x86 platform.
>
> This patch fixes a problem where the usbserial code would not notify
> connected programs that the serial port was going away.

> @@ -1404,9 +1408,11 @@ static void usb_serial_disconnect(struct
> for (i = 0; i < serial->num_ports; ++i) {
> port = &serial->port[i];
> down (&port->sem);
> - if (port->tty != NULL)
> + if (port->tty != NULL) {
> + tty_hangup(port->tty);
> while (port->open_count > 0)
> __serial_close(port, NULL);
> + }

I'll think about it.

If Greg approves and takes, it's fine, too.

What is the actual symptom? Did you expect a SIGHUP?

-- Pete



-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/