On Thu, 13 Apr 2006, Paul Fulghum wrote:
> On Thu, 2006-04-13 at 22:25 +0200, Guennadi Liakhovetski wrote:
> > +void usb_serial_console_disconnect(struct usb_serial *serial)
> > +{
> > + if (serial && serial->port && serial->port[0] && serial->port[0] ==
> > usbcons_info.port) {
> > + usbcons_info.port->open_count--;
> > + usbcons_info.port = NULL;
> > + }
> > +}
>
> I think you need unregister_console(&usbcons);
> on disconnect. If the device is reinstalled later,
> the console is registered again in usb_serial_console_init().
> Until it is unregistered, the console subsystem keeps trying
> to write to an ejected usb console.
>
> The check for disconnected state prevents the write call
> from causing harm, but it is still making unnecessary calls.
Well, looked through the code again - I think, you are right. An updated
version below. I just used your initial (slightly modified to my
tastes:-)) approach - calling usb_serial_console_exit() from
usb_serial_console_disconnect().
Thanks
Guennadi
---
Guennadi Liakhovetski
Prevent sending further output to a USB-serial console after the dongle is
disconnected.
Signed-off-by: Guennadi Liakhovetski <[EMAIL PROTECTED]>
diff -u a/drivers/usb/serial/console.c b/drivers/usb/serial/console.c
--- a/drivers/usb/serial/console.c 13 Jan 2005 21:09:08 -0000
+++ b/drivers/usb/serial/console.c 11 Apr 2006 18:03:29 -0000
@@ -202,7 +202,7 @@
struct usb_serial *serial;
int retval = -ENODEV;
- if (!port)
+ if (!port || port->serial->dev->state == USB_STATE_NOTATTACHED)
return;
serial = port->serial;
@@ -234,6 +234,12 @@
.index = -1,
};
+void usb_serial_console_disconnect(struct usb_serial *serial)
+{
+ if (serial && serial->port && serial->port[0] && serial->port[0] ==
usbcons_info.port)
+ usb_serial_console_exit();
+}
+
void usb_serial_console_init (int serial_debug, int minor)
{
debug = serial_debug;
@@ -259,6 +265,11 @@
void usb_serial_console_exit (void)
{
- unregister_console(&usbcons);
+ if (usbcons_info.port) {
+ unregister_console(&usbcons);
+ if (usbcons_info.port->open_count)
+ usbcons_info.port->open_count--;
+ usbcons_info.port = NULL;
+ }
}
diff -u a/drivers/usb/serial/usb-serial.c b/drivers/usb/serial/usb-serial.c
--- a/drivers/usb/serial/usb-serial.c 30 Mar 2006 19:18:07 -0000
+++ b/drivers/usb/serial/usb-serial.c 11 Apr 2006 18:02:12 -0000
@@ -271,7 +271,7 @@
struct usb_serial_port *port = tty->driver_data;
int retval = -EINVAL;
- if (!port)
+ if (!port || port->serial->dev->state == USB_STATE_NOTATTACHED)
goto exit;
dbg("%s - port %d, %d byte(s)", __FUNCTION__, port->number, count);
@@ -982,6 +982,7 @@
struct device *dev = &interface->dev;
struct usb_serial_port *port;
+ usb_serial_console_disconnect(serial);
dbg ("%s", __FUNCTION__);
usb_set_intfdata (interface, NULL);
diff -u a/drivers/usb/serial/usb-serial.h b/drivers/usb/serial/usb-serial.h
--- a/drivers/usb/serial/usb-serial.h 30 Mar 2006 19:18:07 -0000
+++ b/drivers/usb/serial/usb-serial.h 11 Apr 2006 18:02:12 -0000
@@ -248,9 +248,11 @@
#ifdef CONFIG_USB_SERIAL_CONSOLE
extern void usb_serial_console_init (int debug, int minor);
extern void usb_serial_console_exit (void);
+extern void usb_serial_console_disconnect(struct usb_serial *serial);
#else
static inline void usb_serial_console_init (int debug, int minor) { }
static inline void usb_serial_console_exit (void) { }
+static inline void usb_serial_console_disconnect(struct usb_serial *serial) {}
#endif
/* Functions needed by other parts of the usbserial core */
-------------------------------------------------------
This SF.Net email is sponsored by xPML, a groundbreaking scripting language
that extends applications into web and mobile media. Attend the live webcast
and join the prime developer group breaking into this new coding territory!
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=110944&bid=241720&dat=121642
_______________________________________________
[email protected]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel