diff options
Diffstat (limited to 'drivers/net/usb')
| -rw-r--r-- | drivers/net/usb/cdc_ether.c | 45 | ||||
| -rw-r--r-- | drivers/net/usb/cdc_ncm.c | 10 | ||||
| -rw-r--r-- | drivers/net/usb/qmi_wwan.c | 15 | ||||
| -rw-r--r-- | drivers/net/usb/usbnet.c | 25 |
4 files changed, 56 insertions, 39 deletions
diff --git a/drivers/net/usb/cdc_ether.c b/drivers/net/usb/cdc_ether.c index d0129827602b..3f3d12d766e7 100644 --- a/drivers/net/usb/cdc_ether.c +++ b/drivers/net/usb/cdc_ether.c | |||
| @@ -457,12 +457,6 @@ int usbnet_cdc_bind(struct usbnet *dev, struct usb_interface *intf) | |||
| 457 | } | 457 | } |
| 458 | EXPORT_SYMBOL_GPL(usbnet_cdc_bind); | 458 | EXPORT_SYMBOL_GPL(usbnet_cdc_bind); |
| 459 | 459 | ||
| 460 | static int cdc_manage_power(struct usbnet *dev, int on) | ||
| 461 | { | ||
| 462 | dev->intf->needs_remote_wakeup = on; | ||
| 463 | return 0; | ||
| 464 | } | ||
| 465 | |||
| 466 | static const struct driver_info cdc_info = { | 460 | static const struct driver_info cdc_info = { |
| 467 | .description = "CDC Ethernet Device", | 461 | .description = "CDC Ethernet Device", |
| 468 | .flags = FLAG_ETHER | FLAG_POINTTOPOINT, | 462 | .flags = FLAG_ETHER | FLAG_POINTTOPOINT, |
| @@ -470,7 +464,7 @@ static const struct driver_info cdc_info = { | |||
| 470 | .bind = usbnet_cdc_bind, | 464 | .bind = usbnet_cdc_bind, |
| 471 | .unbind = usbnet_cdc_unbind, | 465 | .unbind = usbnet_cdc_unbind, |
| 472 | .status = usbnet_cdc_status, | 466 | .status = usbnet_cdc_status, |
| 473 | .manage_power = cdc_manage_power, | 467 | .manage_power = usbnet_manage_power, |
| 474 | }; | 468 | }; |
| 475 | 469 | ||
| 476 | static const struct driver_info wwan_info = { | 470 | static const struct driver_info wwan_info = { |
| @@ -479,7 +473,7 @@ static const struct driver_info wwan_info = { | |||
| 479 | .bind = usbnet_cdc_bind, | 473 | .bind = usbnet_cdc_bind, |
| 480 | .unbind = usbnet_cdc_unbind, | 474 | .unbind = usbnet_cdc_unbind, |
| 481 | .status = usbnet_cdc_status, | 475 | .status = usbnet_cdc_status, |
| 482 | .manage_power = cdc_manage_power, | 476 | .manage_power = usbnet_manage_power, |
| 483 | }; | 477 | }; |
| 484 | 478 | ||
| 485 | /*-------------------------------------------------------------------------*/ | 479 | /*-------------------------------------------------------------------------*/ |
| @@ -487,6 +481,7 @@ static const struct driver_info wwan_info = { | |||
| 487 | #define HUAWEI_VENDOR_ID 0x12D1 | 481 | #define HUAWEI_VENDOR_ID 0x12D1 |
| 488 | #define NOVATEL_VENDOR_ID 0x1410 | 482 | #define NOVATEL_VENDOR_ID 0x1410 |
| 489 | #define ZTE_VENDOR_ID 0x19D2 | 483 | #define ZTE_VENDOR_ID 0x19D2 |
| 484 | #define DELL_VENDOR_ID 0x413C | ||
| 490 | 485 | ||
| 491 | static const struct usb_device_id products [] = { | 486 | static const struct usb_device_id products [] = { |
| 492 | /* | 487 | /* |
| @@ -594,27 +589,29 @@ static const struct usb_device_id products [] = { | |||
| 594 | 589 | ||
| 595 | /* Novatel USB551L and MC551 - handled by qmi_wwan */ | 590 | /* Novatel USB551L and MC551 - handled by qmi_wwan */ |
| 596 | { | 591 | { |
| 597 | .match_flags = USB_DEVICE_ID_MATCH_VENDOR | 592 | USB_DEVICE_AND_INTERFACE_INFO(NOVATEL_VENDOR_ID, 0xB001, USB_CLASS_COMM, |
| 598 | | USB_DEVICE_ID_MATCH_PRODUCT | 593 | USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE), |
| 599 | | USB_DEVICE_ID_MATCH_INT_INFO, | ||
| 600 | .idVendor = NOVATEL_VENDOR_ID, | ||
| 601 | .idProduct = 0xB001, | ||
| 602 | .bInterfaceClass = USB_CLASS_COMM, | ||
| 603 | .bInterfaceSubClass = USB_CDC_SUBCLASS_ETHERNET, | ||
| 604 | .bInterfaceProtocol = USB_CDC_PROTO_NONE, | ||
| 605 | .driver_info = 0, | 594 | .driver_info = 0, |
| 606 | }, | 595 | }, |
| 607 | 596 | ||
| 608 | /* Novatel E362 - handled by qmi_wwan */ | 597 | /* Novatel E362 - handled by qmi_wwan */ |
| 609 | { | 598 | { |
| 610 | .match_flags = USB_DEVICE_ID_MATCH_VENDOR | 599 | USB_DEVICE_AND_INTERFACE_INFO(NOVATEL_VENDOR_ID, 0x9010, USB_CLASS_COMM, |
| 611 | | USB_DEVICE_ID_MATCH_PRODUCT | 600 | USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE), |
| 612 | | USB_DEVICE_ID_MATCH_INT_INFO, | 601 | .driver_info = 0, |
| 613 | .idVendor = NOVATEL_VENDOR_ID, | 602 | }, |
| 614 | .idProduct = 0x9010, | 603 | |
| 615 | .bInterfaceClass = USB_CLASS_COMM, | 604 | /* Dell Wireless 5800 (Novatel E362) - handled by qmi_wwan */ |
| 616 | .bInterfaceSubClass = USB_CDC_SUBCLASS_ETHERNET, | 605 | { |
| 617 | .bInterfaceProtocol = USB_CDC_PROTO_NONE, | 606 | USB_DEVICE_AND_INTERFACE_INFO(DELL_VENDOR_ID, 0x8195, USB_CLASS_COMM, |
| 607 | USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE), | ||
| 608 | .driver_info = 0, | ||
| 609 | }, | ||
| 610 | |||
| 611 | /* Dell Wireless 5800 (Novatel E362) - handled by qmi_wwan */ | ||
| 612 | { | ||
| 613 | USB_DEVICE_AND_INTERFACE_INFO(DELL_VENDOR_ID, 0x8196, USB_CLASS_COMM, | ||
| 614 | USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE), | ||
| 618 | .driver_info = 0, | 615 | .driver_info = 0, |
| 619 | }, | 616 | }, |
| 620 | 617 | ||
diff --git a/drivers/net/usb/cdc_ncm.c b/drivers/net/usb/cdc_ncm.c index d38bc20a60e2..71b6e92b8e9b 100644 --- a/drivers/net/usb/cdc_ncm.c +++ b/drivers/net/usb/cdc_ncm.c | |||
| @@ -1129,19 +1129,13 @@ static void cdc_ncm_disconnect(struct usb_interface *intf) | |||
| 1129 | usbnet_disconnect(intf); | 1129 | usbnet_disconnect(intf); |
| 1130 | } | 1130 | } |
| 1131 | 1131 | ||
| 1132 | static int cdc_ncm_manage_power(struct usbnet *dev, int status) | ||
| 1133 | { | ||
| 1134 | dev->intf->needs_remote_wakeup = status; | ||
| 1135 | return 0; | ||
| 1136 | } | ||
| 1137 | |||
| 1138 | static const struct driver_info cdc_ncm_info = { | 1132 | static const struct driver_info cdc_ncm_info = { |
| 1139 | .description = "CDC NCM", | 1133 | .description = "CDC NCM", |
| 1140 | .flags = FLAG_POINTTOPOINT | FLAG_NO_SETINT | FLAG_MULTI_PACKET, | 1134 | .flags = FLAG_POINTTOPOINT | FLAG_NO_SETINT | FLAG_MULTI_PACKET, |
| 1141 | .bind = cdc_ncm_bind, | 1135 | .bind = cdc_ncm_bind, |
| 1142 | .unbind = cdc_ncm_unbind, | 1136 | .unbind = cdc_ncm_unbind, |
| 1143 | .check_connect = cdc_ncm_check_connect, | 1137 | .check_connect = cdc_ncm_check_connect, |
| 1144 | .manage_power = cdc_ncm_manage_power, | 1138 | .manage_power = usbnet_manage_power, |
| 1145 | .status = cdc_ncm_status, | 1139 | .status = cdc_ncm_status, |
| 1146 | .rx_fixup = cdc_ncm_rx_fixup, | 1140 | .rx_fixup = cdc_ncm_rx_fixup, |
| 1147 | .tx_fixup = cdc_ncm_tx_fixup, | 1141 | .tx_fixup = cdc_ncm_tx_fixup, |
| @@ -1155,7 +1149,7 @@ static const struct driver_info wwan_info = { | |||
| 1155 | .bind = cdc_ncm_bind, | 1149 | .bind = cdc_ncm_bind, |
| 1156 | .unbind = cdc_ncm_unbind, | 1150 | .unbind = cdc_ncm_unbind, |
| 1157 | .check_connect = cdc_ncm_check_connect, | 1151 | .check_connect = cdc_ncm_check_connect, |
| 1158 | .manage_power = cdc_ncm_manage_power, | 1152 | .manage_power = usbnet_manage_power, |
| 1159 | .status = cdc_ncm_status, | 1153 | .status = cdc_ncm_status, |
| 1160 | .rx_fixup = cdc_ncm_rx_fixup, | 1154 | .rx_fixup = cdc_ncm_rx_fixup, |
| 1161 | .tx_fixup = cdc_ncm_tx_fixup, | 1155 | .tx_fixup = cdc_ncm_tx_fixup, |
diff --git a/drivers/net/usb/qmi_wwan.c b/drivers/net/usb/qmi_wwan.c index 1ea91f4237f0..91d7cb9728eb 100644 --- a/drivers/net/usb/qmi_wwan.c +++ b/drivers/net/usb/qmi_wwan.c | |||
| @@ -383,6 +383,20 @@ static const struct usb_device_id products[] = { | |||
| 383 | USB_CDC_PROTO_NONE), | 383 | USB_CDC_PROTO_NONE), |
| 384 | .driver_info = (unsigned long)&qmi_wwan_info, | 384 | .driver_info = (unsigned long)&qmi_wwan_info, |
| 385 | }, | 385 | }, |
| 386 | { /* Dell Wireless 5800 (Novatel E362) */ | ||
| 387 | USB_DEVICE_AND_INTERFACE_INFO(0x413C, 0x8195, | ||
| 388 | USB_CLASS_COMM, | ||
| 389 | USB_CDC_SUBCLASS_ETHERNET, | ||
| 390 | USB_CDC_PROTO_NONE), | ||
| 391 | .driver_info = (unsigned long)&qmi_wwan_info, | ||
| 392 | }, | ||
| 393 | { /* Dell Wireless 5800 V2 (Novatel E362) */ | ||
| 394 | USB_DEVICE_AND_INTERFACE_INFO(0x413C, 0x8196, | ||
| 395 | USB_CLASS_COMM, | ||
| 396 | USB_CDC_SUBCLASS_ETHERNET, | ||
| 397 | USB_CDC_PROTO_NONE), | ||
| 398 | .driver_info = (unsigned long)&qmi_wwan_info, | ||
| 399 | }, | ||
| 386 | 400 | ||
| 387 | /* 3. Combined interface devices matching on interface number */ | 401 | /* 3. Combined interface devices matching on interface number */ |
| 388 | {QMI_FIXED_INTF(0x12d1, 0x140c, 1)}, /* Huawei E173 */ | 402 | {QMI_FIXED_INTF(0x12d1, 0x140c, 1)}, /* Huawei E173 */ |
| @@ -419,6 +433,7 @@ static const struct usb_device_id products[] = { | |||
| 419 | {QMI_FIXED_INTF(0x19d2, 0x0199, 1)}, /* ZTE MF820S */ | 433 | {QMI_FIXED_INTF(0x19d2, 0x0199, 1)}, /* ZTE MF820S */ |
| 420 | {QMI_FIXED_INTF(0x19d2, 0x0200, 1)}, | 434 | {QMI_FIXED_INTF(0x19d2, 0x0200, 1)}, |
| 421 | {QMI_FIXED_INTF(0x19d2, 0x0257, 3)}, /* ZTE MF821 */ | 435 | {QMI_FIXED_INTF(0x19d2, 0x0257, 3)}, /* ZTE MF821 */ |
| 436 | {QMI_FIXED_INTF(0x19d2, 0x0284, 4)}, /* ZTE MF880 */ | ||
| 422 | {QMI_FIXED_INTF(0x19d2, 0x0326, 4)}, /* ZTE MF821D */ | 437 | {QMI_FIXED_INTF(0x19d2, 0x0326, 4)}, /* ZTE MF821D */ |
| 423 | {QMI_FIXED_INTF(0x19d2, 0x1008, 4)}, /* ZTE (Vodafone) K3570-Z */ | 438 | {QMI_FIXED_INTF(0x19d2, 0x1008, 4)}, /* ZTE (Vodafone) K3570-Z */ |
| 424 | {QMI_FIXED_INTF(0x19d2, 0x1010, 4)}, /* ZTE (Vodafone) K3571-Z */ | 439 | {QMI_FIXED_INTF(0x19d2, 0x1010, 4)}, /* ZTE (Vodafone) K3571-Z */ |
diff --git a/drivers/net/usb/usbnet.c b/drivers/net/usb/usbnet.c index c04110ba677f..3d4bf01641b4 100644 --- a/drivers/net/usb/usbnet.c +++ b/drivers/net/usb/usbnet.c | |||
| @@ -719,7 +719,8 @@ int usbnet_stop (struct net_device *net) | |||
| 719 | dev->flags = 0; | 719 | dev->flags = 0; |
| 720 | del_timer_sync (&dev->delay); | 720 | del_timer_sync (&dev->delay); |
| 721 | tasklet_kill (&dev->bh); | 721 | tasklet_kill (&dev->bh); |
| 722 | if (info->manage_power) | 722 | if (info->manage_power && |
| 723 | !test_and_clear_bit(EVENT_NO_RUNTIME_PM, &dev->flags)) | ||
| 723 | info->manage_power(dev, 0); | 724 | info->manage_power(dev, 0); |
| 724 | else | 725 | else |
| 725 | usb_autopm_put_interface(dev->intf); | 726 | usb_autopm_put_interface(dev->intf); |
| @@ -794,14 +795,14 @@ int usbnet_open (struct net_device *net) | |||
| 794 | tasklet_schedule (&dev->bh); | 795 | tasklet_schedule (&dev->bh); |
| 795 | if (info->manage_power) { | 796 | if (info->manage_power) { |
| 796 | retval = info->manage_power(dev, 1); | 797 | retval = info->manage_power(dev, 1); |
| 797 | if (retval < 0) | 798 | if (retval < 0) { |
| 798 | goto done_manage_power_error; | 799 | retval = 0; |
| 799 | usb_autopm_put_interface(dev->intf); | 800 | set_bit(EVENT_NO_RUNTIME_PM, &dev->flags); |
| 801 | } else { | ||
| 802 | usb_autopm_put_interface(dev->intf); | ||
| 803 | } | ||
| 800 | } | 804 | } |
| 801 | return retval; | 805 | return retval; |
| 802 | |||
| 803 | done_manage_power_error: | ||
| 804 | clear_bit(EVENT_DEV_OPEN, &dev->flags); | ||
| 805 | done: | 806 | done: |
| 806 | usb_autopm_put_interface(dev->intf); | 807 | usb_autopm_put_interface(dev->intf); |
| 807 | done_nopm: | 808 | done_nopm: |
| @@ -1615,6 +1616,16 @@ void usbnet_device_suggests_idle(struct usbnet *dev) | |||
| 1615 | } | 1616 | } |
| 1616 | EXPORT_SYMBOL(usbnet_device_suggests_idle); | 1617 | EXPORT_SYMBOL(usbnet_device_suggests_idle); |
| 1617 | 1618 | ||
| 1619 | /* | ||
| 1620 | * For devices that can do without special commands | ||
| 1621 | */ | ||
| 1622 | int usbnet_manage_power(struct usbnet *dev, int on) | ||
| 1623 | { | ||
| 1624 | dev->intf->needs_remote_wakeup = on; | ||
| 1625 | return 0; | ||
| 1626 | } | ||
| 1627 | EXPORT_SYMBOL(usbnet_manage_power); | ||
| 1628 | |||
| 1618 | /*-------------------------------------------------------------------------*/ | 1629 | /*-------------------------------------------------------------------------*/ |
| 1619 | static int __usbnet_read_cmd(struct usbnet *dev, u8 cmd, u8 reqtype, | 1630 | static int __usbnet_read_cmd(struct usbnet *dev, u8 cmd, u8 reqtype, |
| 1620 | u16 value, u16 index, void *data, u16 size) | 1631 | u16 value, u16 index, void *data, u16 size) |
