Re: [PATCH] USB: serial: Enforce USB driver and USB serial driver match

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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


[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux