cdc_ether: Identify MBM devices by GUID in MDLM descriptor
This patch removes vid/pid for Ericsson MBM devices from the whitelist set of devices. The MBM devices are instead identified by GUID. In order for cdc_ether to handle these devices the GUID in the MDLM descriptor is tested. All MBM devices currently handled by cdc_ether as well as future CDC Ethernet MBM devices can be identified by the GUID. This is the same solution used in Carl Nordbeck's mbm driver, http://kerneltrap.org/mailarchive/linux-usb/2008/11/17/4141384/thread I post this as RFC to get feedback on however cdc_ether is the correct place to do the binding, or if it should be done in a separate driver, e.g. zaurus. Signed-off-by: Jonas Sjöquist <jonas.sjoquist@ericsson.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
81a2e36df7
commit
2185126412
1 changed files with 39 additions and 74 deletions
|
@ -64,6 +64,11 @@ static int is_wireless_rndis(struct usb_interface_descriptor *desc)
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
static const u8 mbm_guid[16] = {
|
||||||
|
0xa3, 0x17, 0xa8, 0x8b, 0x04, 0x5e, 0x4f, 0x01,
|
||||||
|
0xa6, 0x07, 0xc0, 0xff, 0xcb, 0x7e, 0x39, 0x2a,
|
||||||
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* probes control interface, claims data interface, collects the bulk
|
* probes control interface, claims data interface, collects the bulk
|
||||||
* endpoints, activates data interface (if needed), maybe sets MTU.
|
* endpoints, activates data interface (if needed), maybe sets MTU.
|
||||||
|
@ -79,6 +84,8 @@ int usbnet_generic_cdc_bind(struct usbnet *dev, struct usb_interface *intf)
|
||||||
int status;
|
int status;
|
||||||
int rndis;
|
int rndis;
|
||||||
struct usb_driver *driver = driver_of(intf);
|
struct usb_driver *driver = driver_of(intf);
|
||||||
|
struct usb_cdc_mdlm_desc *desc = NULL;
|
||||||
|
struct usb_cdc_mdlm_detail_desc *detail = NULL;
|
||||||
|
|
||||||
if (sizeof dev->data < sizeof *info)
|
if (sizeof dev->data < sizeof *info)
|
||||||
return -EDOM;
|
return -EDOM;
|
||||||
|
@ -229,6 +236,34 @@ int usbnet_generic_cdc_bind(struct usbnet *dev, struct usb_interface *intf)
|
||||||
* side link address we were given.
|
* side link address we were given.
|
||||||
*/
|
*/
|
||||||
break;
|
break;
|
||||||
|
case USB_CDC_MDLM_TYPE:
|
||||||
|
if (desc) {
|
||||||
|
dev_dbg(&intf->dev, "extra MDLM descriptor\n");
|
||||||
|
goto bad_desc;
|
||||||
|
}
|
||||||
|
|
||||||
|
desc = (void *)buf;
|
||||||
|
|
||||||
|
if (desc->bLength != sizeof(*desc))
|
||||||
|
goto bad_desc;
|
||||||
|
|
||||||
|
if (memcmp(&desc->bGUID, mbm_guid, 16))
|
||||||
|
goto bad_desc;
|
||||||
|
break;
|
||||||
|
case USB_CDC_MDLM_DETAIL_TYPE:
|
||||||
|
if (detail) {
|
||||||
|
dev_dbg(&intf->dev, "extra MDLM detail descriptor\n");
|
||||||
|
goto bad_desc;
|
||||||
|
}
|
||||||
|
|
||||||
|
detail = (void *)buf;
|
||||||
|
|
||||||
|
if (detail->bGuidDescriptorType == 0) {
|
||||||
|
if (detail->bLength < (sizeof(*detail) + 1))
|
||||||
|
goto bad_desc;
|
||||||
|
} else
|
||||||
|
goto bad_desc;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
next_desc:
|
next_desc:
|
||||||
len -= buf [0]; /* bLength */
|
len -= buf [0]; /* bLength */
|
||||||
|
@ -542,80 +577,10 @@ static const struct usb_device_id products [] = {
|
||||||
USB_CDC_PROTO_NONE),
|
USB_CDC_PROTO_NONE),
|
||||||
.driver_info = (unsigned long) &cdc_info,
|
.driver_info = (unsigned long) &cdc_info,
|
||||||
}, {
|
}, {
|
||||||
/* Ericsson F3507g */
|
USB_INTERFACE_INFO(USB_CLASS_COMM, USB_CDC_SUBCLASS_MDLM,
|
||||||
USB_DEVICE_AND_INTERFACE_INFO(0x0bdb, 0x1900, USB_CLASS_COMM,
|
USB_CDC_PROTO_NONE),
|
||||||
USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE),
|
.driver_info = (unsigned long)&mbm_info,
|
||||||
.driver_info = (unsigned long) &mbm_info,
|
|
||||||
}, {
|
|
||||||
/* Ericsson F3507g ver. 2 */
|
|
||||||
USB_DEVICE_AND_INTERFACE_INFO(0x0bdb, 0x1902, USB_CLASS_COMM,
|
|
||||||
USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE),
|
|
||||||
.driver_info = (unsigned long) &mbm_info,
|
|
||||||
}, {
|
|
||||||
/* Ericsson F3607gw */
|
|
||||||
USB_DEVICE_AND_INTERFACE_INFO(0x0bdb, 0x1904, USB_CLASS_COMM,
|
|
||||||
USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE),
|
|
||||||
.driver_info = (unsigned long) &mbm_info,
|
|
||||||
}, {
|
|
||||||
/* Ericsson F3607gw ver 2 */
|
|
||||||
USB_DEVICE_AND_INTERFACE_INFO(0x0bdb, 0x1905, USB_CLASS_COMM,
|
|
||||||
USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE),
|
|
||||||
.driver_info = (unsigned long) &mbm_info,
|
|
||||||
}, {
|
|
||||||
/* Ericsson F3607gw ver 3 */
|
|
||||||
USB_DEVICE_AND_INTERFACE_INFO(0x0bdb, 0x1906, USB_CLASS_COMM,
|
|
||||||
USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE),
|
|
||||||
.driver_info = (unsigned long) &mbm_info,
|
|
||||||
}, {
|
|
||||||
/* Ericsson F3307 */
|
|
||||||
USB_DEVICE_AND_INTERFACE_INFO(0x0bdb, 0x190a, USB_CLASS_COMM,
|
|
||||||
USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE),
|
|
||||||
.driver_info = (unsigned long) &mbm_info,
|
|
||||||
}, {
|
|
||||||
/* Ericsson F3307 ver 2 */
|
|
||||||
USB_DEVICE_AND_INTERFACE_INFO(0x0bdb, 0x1909, USB_CLASS_COMM,
|
|
||||||
USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE),
|
|
||||||
.driver_info = (unsigned long) &mbm_info,
|
|
||||||
}, {
|
|
||||||
/* Ericsson C3607w */
|
|
||||||
USB_DEVICE_AND_INTERFACE_INFO(0x0bdb, 0x1049, USB_CLASS_COMM,
|
|
||||||
USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE),
|
|
||||||
.driver_info = (unsigned long) &mbm_info,
|
|
||||||
}, {
|
|
||||||
/* Ericsson C3607w ver 2 */
|
|
||||||
USB_DEVICE_AND_INTERFACE_INFO(0x0bdb, 0x190b, USB_CLASS_COMM,
|
|
||||||
USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE),
|
|
||||||
.driver_info = (unsigned long) &mbm_info,
|
|
||||||
}, {
|
|
||||||
/* Toshiba F3507g */
|
|
||||||
USB_DEVICE_AND_INTERFACE_INFO(0x0930, 0x130b, USB_CLASS_COMM,
|
|
||||||
USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE),
|
|
||||||
.driver_info = (unsigned long) &mbm_info,
|
|
||||||
}, {
|
|
||||||
/* Toshiba F3607gw */
|
|
||||||
USB_DEVICE_AND_INTERFACE_INFO(0x0930, 0x130c, USB_CLASS_COMM,
|
|
||||||
USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE),
|
|
||||||
.driver_info = (unsigned long) &mbm_info,
|
|
||||||
}, {
|
|
||||||
/* Toshiba F3607gw ver 2 */
|
|
||||||
USB_DEVICE_AND_INTERFACE_INFO(0x0930, 0x1311, USB_CLASS_COMM,
|
|
||||||
USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE),
|
|
||||||
.driver_info = (unsigned long) &mbm_info,
|
|
||||||
}, {
|
|
||||||
/* Dell F3507g */
|
|
||||||
USB_DEVICE_AND_INTERFACE_INFO(0x413c, 0x8147, USB_CLASS_COMM,
|
|
||||||
USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE),
|
|
||||||
.driver_info = (unsigned long) &mbm_info,
|
|
||||||
}, {
|
|
||||||
/* Dell F3607gw */
|
|
||||||
USB_DEVICE_AND_INTERFACE_INFO(0x413c, 0x8183, USB_CLASS_COMM,
|
|
||||||
USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE),
|
|
||||||
.driver_info = (unsigned long) &mbm_info,
|
|
||||||
}, {
|
|
||||||
/* Dell F3607gw ver 2 */
|
|
||||||
USB_DEVICE_AND_INTERFACE_INFO(0x413c, 0x8184, USB_CLASS_COMM,
|
|
||||||
USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE),
|
|
||||||
.driver_info = (unsigned long) &mbm_info,
|
|
||||||
},
|
},
|
||||||
{ }, // END
|
{ }, // END
|
||||||
};
|
};
|
||||||
|
|
Loading…
Add table
Reference in a new issue