Hi, On Tue, May 29, 2012 at 06:40:19PM +0200, Bjørn Mork wrote: > We need to make sure that the USB serial driver we found > matches the USB driver whose probe we are currently > executing. Otherwise we will end up with USB serial > devices bound to the correct serila driver but wrong > USB driver. > > This is a real problem for the generic USB serial driver > because it matches any device. > > Signed-off-by: Bjørn Mork <bjorn@xxxxxxx> > --- > Hello, > > I am not at all sure this is the correct way to fix this, > but at least it solves my problem. I thought about > explicitly matching the generic driver, but the problem > is really more generic. Hence the more generic solution. > > More background: The new serial driver code is acting weird. > First time probing work as expected, resulting in something > like this: > > May 29 18:23:05 nemi kernel: [ 4253.037118] sierra 4-4:1.0: Sierra USB modem converter detected > May 29 18:23:10 nemi kernel: [ 4258.036828] sierra 4-4:1.2: Sierra USB modem converter detected > May 29 18:23:15 nemi kernel: [ 4263.036837] sierra 4-4:1.3: Sierra USB modem converter detected > > and the expected driver attachments: > > bjorn@nemi:~$ ls -l /sys/bus/usb/drivers/sierra/ > total 0 > lrwxrwxrwx 1 root root 0 May 29 18:23 4-4:1.0 -> ../../../../devices/pci0000:00/0000:00:1d.7/usb4/4-4/4-4:1.0 > lrwxrwxrwx 1 root root 0 May 29 18:23 4-4:1.2 -> ../../../../devices/pci0000:00/0000:00:1d.7/usb4/4-4/4-4:1.2 > lrwxrwxrwx 1 root root 0 May 29 18:23 4-4:1.3 -> ../../../../devices/pci0000:00/0000:00:1d.7/usb4/4-4/4-4:1.3 > --w------- 1 root root 4096 May 29 18:23 bind > lrwxrwxrwx 1 root root 0 May 29 18:23 module -> ../../../../module/usbserial > --w------- 1 root root 4096 May 29 18:23 uevent > --w------- 1 root root 4096 May 29 18:23 unbind > bjorn@nemi:~$ ls -l /sys/bus/usb-serial/drivers/sierra/ > total 0 > --w------- 1 root root 4096 May 29 18:23 bind > lrwxrwxrwx 1 root root 0 May 29 18:23 module -> ../../../../module/sierra > -rw-r--r-- 1 root root 4096 May 29 18:23 new_id > lrwxrwxrwx 1 root root 0 May 29 18:23 ttyUSB0 -> ../../../../devices/pci0000:00/0000:00:1d.7/usb4/4-4/4-4:1.0/ttyUSB0 > lrwxrwxrwx 1 root root 0 May 29 18:23 ttyUSB1 -> ../../../../devices/pci0000:00/0000:00:1d.7/usb4/4-4/4-4:1.2/ttyUSB1 > lrwxrwxrwx 1 root root 0 May 29 18:23 ttyUSB2 -> ../../../../devices/pci0000:00/0000:00:1d.7/usb4/4-4/4-4:1.3/ttyUSB2 > --w------- 1 root root 4096 May 29 18:23 uevent > --w------- 1 root root 4096 May 29 18:23 unbind > > > But unplugging and replugging resulted in: > > May 29 18:26:15 nemi kernel: [ 4442.559246] usbserial_generic 4-4:1.0: Sierra USB modem converter detected > May 29 18:26:20 nemi kernel: [ 4447.556747] usbserial_generic 4-4:1.2: Sierra USB modem converter detected > May 29 18:26:25 nemi kernel: [ 4452.557288] usbserial_generic 4-4:1.3: Sierra USB modem converter detected > > Note the driver prefix here. The USB driver is incorrect, but the > USB serial driver is still the same as above. sysfs shows us the > same problem > > bjorn@nemi:~$ ls -l /sys/bus/usb/drivers/sierra/ > total 0 > --w------- 1 root root 4096 May 29 18:23 bind > lrwxrwxrwx 1 root root 0 May 29 18:23 module -> ../../../../module/usbserial > --w------- 1 root root 4096 May 29 18:23 uevent > --w------- 1 root root 4096 May 29 18:23 unbind > bjorn@nemi:~$ ls -l /sys/bus/usb-serial/drivers/sierra/ > total 0 > --w------- 1 root root 4096 May 29 18:23 bind > lrwxrwxrwx 1 root root 0 May 29 18:23 module -> ../../../../module/sierra > -rw-r--r-- 1 root root 4096 May 29 18:23 new_id > lrwxrwxrwx 1 root root 0 May 29 18:32 ttyUSB0 -> ../../../../devices/pci0000:00/0000:00:1d.7/usb4/4-4/4-4:1.0/ttyUSB0 > lrwxrwxrwx 1 root root 0 May 29 18:32 ttyUSB1 -> ../../../../devices/pci0000:00/0000:00:1d.7/usb4/4-4/4-4:1.2/ttyUSB1 > lrwxrwxrwx 1 root root 0 May 29 18:32 ttyUSB2 -> ../../../../devices/pci0000:00/0000:00:1d.7/usb4/4-4/4-4:1.3/ttyUSB2 > --w------- 1 root root 4096 May 29 18:23 uevent > --w------- 1 root root 4096 May 29 18:23 unbind > > bjorn@nemi:~$ ls -l /sys/bus/usb/drivers/usbserial_generic/ > total 0 > lrwxrwxrwx 1 root root 0 May 29 18:33 4-4:1.0 -> ../../../../devices/pci0000:00/0000:00:1d.7/usb4/4-4/4-4:1.0 > lrwxrwxrwx 1 root root 0 May 29 18:33 4-4:1.2 -> ../../../../devices/pci0000:00/0000:00:1d.7/usb4/4-4/4-4:1.2 > lrwxrwxrwx 1 root root 0 May 29 18:33 4-4:1.3 -> ../../../../devices/pci0000:00/0000:00:1d.7/usb4/4-4/4-4:1.3 > --w------- 1 root root 4096 May 29 18:33 bind > lrwxrwxrwx 1 root root 0 May 29 18:33 module -> ../../../../module/usbserial > --w------- 1 root root 4096 May 29 18:22 uevent > --w------- 1 root root 4096 May 29 18:33 unbind > bjorn@nemi:~$ ls -l /sys/bus/usb-serial/drivers/generic/ > total 0 > --w------- 1 root root 4096 May 29 18:33 bind > lrwxrwxrwx 1 root root 0 May 29 18:33 module -> ../../../../module/usbserial > -rw-r--r-- 1 root root 4096 May 29 18:33 new_id > --w------- 1 root root 4096 May 29 18:22 uevent > --w------- 1 root root 4096 May 29 18:33 unbind > > > So we end up with a mismatch between the USB driver and the > USB serial driver. The reason is simple: The probe function > will succeed if *any* registered serial driver matches, and > will use that serial driver so everything works. But we > don't verify which USB driver the probe actually was called > for. The generic driver matches anything, so it will often > be probed for devices handled by other serial drivers. I'm not the best one to comment about the patch, but if the patch is really needed, I think this is valuable information and should go on the commit log. > drivers/usb/serial/usb-serial.c | 6 ++++++ > 1 file changed, 6 insertions(+) > > diff --git a/drivers/usb/serial/usb-serial.c b/drivers/usb/serial/usb-serial.c > index 6a1b609..43bef89 100644 > --- a/drivers/usb/serial/usb-serial.c > +++ b/drivers/usb/serial/usb-serial.c > @@ -732,6 +732,12 @@ static int usb_serial_probe(struct usb_interface *interface, > return -ENODEV; > } > > + /* prevent "cross-probing" - ensure type matches USB driver */ > + if (type->usb_driver != to_usb_driver(interface->dev.driver)) { > + mutex_unlock(&table_lock); > + return -ENODEV; > + } > + > if (!try_module_get(type->driver.owner)) { > mutex_unlock(&table_lock); > dev_err(&interface->dev, "module get failed, exiting\n"); > -- > 1.7.10 > > -- > To unsubscribe from this list: send the line "unsubscribe linux-usb" in > the body of a message to majordomo@xxxxxxxxxxxxxxx > More majordomo info at http://vger.kernel.org/majordomo-info.html -- balbi
Attachment:
signature.asc
Description: Digital signature