Commit c5be1b52 authored by Pascal Terjan's avatar Pascal Terjan Committed by Greg Kroah-Hartman

USB: Ignore storage device in modem mode on DWN-652

D-Link DWN-652 in Modem mode exposes 3 interfaces
- First one is the USB storage one
- Second one is for both control and connection
- Third one is unknown

This patch avoids usb-storage trying to switch again when already in
modem mode, and exposes only 2 ttyUSB instead of 3 by not attaching
to the storage interface
Signed-off-by: default avatarPascal Terjan <pterjan@mandriva.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent cc71329b
...@@ -43,6 +43,8 @@ ...@@ -43,6 +43,8 @@
#include <linux/usb/serial.h> #include <linux/usb/serial.h>
/* Function prototypes */ /* Function prototypes */
static int option_probe(struct usb_serial *serial,
const struct usb_device_id *id);
static int option_open(struct tty_struct *tty, struct usb_serial_port *port, static int option_open(struct tty_struct *tty, struct usb_serial_port *port,
struct file *filp); struct file *filp);
static void option_close(struct usb_serial_port *port); static void option_close(struct usb_serial_port *port);
...@@ -555,6 +557,7 @@ static struct usb_serial_driver option_1port_device = { ...@@ -555,6 +557,7 @@ static struct usb_serial_driver option_1port_device = {
.usb_driver = &option_driver, .usb_driver = &option_driver,
.id_table = option_ids, .id_table = option_ids,
.num_ports = 1, .num_ports = 1,
.probe = option_probe,
.open = option_open, .open = option_open,
.close = option_close, .close = option_close,
.dtr_rts = option_dtr_rts, .dtr_rts = option_dtr_rts,
...@@ -631,6 +634,18 @@ static void __exit option_exit(void) ...@@ -631,6 +634,18 @@ static void __exit option_exit(void)
module_init(option_init); module_init(option_init);
module_exit(option_exit); module_exit(option_exit);
static int option_probe(struct usb_serial *serial,
const struct usb_device_id *id)
{
/* D-Link DWM 652 still exposes CD-Rom emulation interface in modem mode */
if (serial->dev->descriptor.idVendor == DLINK_VENDOR_ID &&
serial->dev->descriptor.idProduct == DLINK_PRODUCT_DWM_652 &&
serial->interface->cur_altsetting->desc.bInterfaceClass == 0x8)
return -ENODEV;
return 0;
}
static void option_set_termios(struct tty_struct *tty, static void option_set_termios(struct tty_struct *tty,
struct usb_serial_port *port, struct ktermios *old_termios) struct usb_serial_port *port, struct ktermios *old_termios)
{ {
......
...@@ -94,7 +94,8 @@ int option_ms_init(struct us_data *us) ...@@ -94,7 +94,8 @@ int option_ms_init(struct us_data *us)
*/ */
if (udev->descriptor.bDeviceClass != 0 || if (udev->descriptor.bDeviceClass != 0 ||
udev->descriptor.bDeviceSubClass != 0 || udev->descriptor.bDeviceSubClass != 0 ||
udev->descriptor.bDeviceProtocol != 0) udev->descriptor.bDeviceProtocol != 0 ||
udev->actconfig->desc.bNumInterfaces == 3)
return USB_STOR_TRANSPORT_GOOD; return USB_STOR_TRANSPORT_GOOD;
US_DEBUGP("Option MS: option_ms_init called\n"); US_DEBUGP("Option MS: option_ms_init called\n");
......
...@@ -1385,7 +1385,7 @@ UNUSUAL_DEV( 0x10d6, 0x2200, 0x0100, 0x0100, ...@@ -1385,7 +1385,7 @@ UNUSUAL_DEV( 0x10d6, 0x2200, 0x0100, 0x0100,
UNUSUAL_DEV( 0x1186, 0x3e04, 0x0000, 0x0000, UNUSUAL_DEV( 0x1186, 0x3e04, 0x0000, 0x0000,
"D-Link", "D-Link",
"USB Mass Storage", "USB Mass Storage",
US_SC_DEVICE, US_PR_DEVICE, option_ms_init, 0), US_SC_DEVICE, US_PR_DEVICE, option_ms_init, US_FL_IGNORE_DEVICE),
/* Reported by Kevin Lloyd <linux@sierrawireless.com> /* Reported by Kevin Lloyd <linux@sierrawireless.com>
* Entry is needed for the initializer function override, * Entry is needed for the initializer function override,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment