Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6
[safe/jmp/linux-2.6] / drivers / net / usb / cdc_ether.c
index 3547cf1..b3fe0de 100644 (file)
@@ -64,6 +64,11 @@ static int is_wireless_rndis(struct usb_interface_descriptor *desc)
 
 #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
  * 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                             rndis;
        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)
                return -EDOM;
@@ -229,6 +236,34 @@ int usbnet_generic_cdc_bind(struct usbnet *dev, struct usb_interface *intf)
                         * side link address we were given.
                         */
                        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:
                len -= buf [0]; /* bLength */
@@ -543,80 +578,10 @@ static const struct usb_device_id products [] = {
                        USB_CDC_PROTO_NONE),
        .driver_info = (unsigned long) &cdc_info,
 }, {
-       /* Ericsson F3507g */
-       USB_DEVICE_AND_INTERFACE_INFO(0x0bdb, 0x1900, USB_CLASS_COMM,
-                       USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE),
-       .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,
+       USB_INTERFACE_INFO(USB_CLASS_COMM, USB_CDC_SUBCLASS_MDLM,
+                       USB_CDC_PROTO_NONE),
+       .driver_info = (unsigned long)&mbm_info,
+
 },
        { },            // END
 };