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: Pascal Terjan <pterjan@mandriva.com> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
cc71329b3b
commit
c5be1b52d9
@@ -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 = {
|
|||||||
.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)
|
|||||||
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)
|
|||||||
*/
|
*/
|
||||||
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,
|
|||||||
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,
|
||||||
|
Reference in New Issue
Block a user