aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/usb
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/usb')
-rw-r--r--drivers/net/usb/Kconfig13
-rw-r--r--drivers/net/usb/ax88179_178a.c264
-rw-r--r--drivers/net/usb/cdc-phonet.c2
-rw-r--r--drivers/net/usb/cdc_ether.c16
-rw-r--r--drivers/net/usb/cdc_subset.c27
-rw-r--r--drivers/net/usb/hso.c4
-rw-r--r--drivers/net/usb/huawei_cdc_ncm.c3
-rw-r--r--drivers/net/usb/qmi_wwan.c2
-rw-r--r--drivers/net/usb/r8152.c45
-rw-r--r--drivers/net/usb/usbnet.c8
10 files changed, 365 insertions, 19 deletions
diff --git a/drivers/net/usb/Kconfig b/drivers/net/usb/Kconfig
index 7e7269fd3707..37eed4d84e9c 100644
--- a/drivers/net/usb/Kconfig
+++ b/drivers/net/usb/Kconfig
@@ -1,12 +1,16 @@
1# 1#
2# USB Network devices configuration 2# USB Network devices configuration
3# 3#
4comment "Networking support is needed for USB Network Adapter support" 4comment "Host-side USB support is needed for USB Network Adapter support"
5 depends on USB && !NET 5 depends on !USB && NET
6 6
7menu "USB Network Adapters" 7menuconfig USB_NET_DRIVERS
8 tristate "USB Network Adapters"
9 default USB if USB
8 depends on USB && NET 10 depends on USB && NET
9 11
12if USB_NET_DRIVERS
13
10config USB_CATC 14config USB_CATC
11 tristate "USB CATC NetMate-based Ethernet device support" 15 tristate "USB CATC NetMate-based Ethernet device support"
12 select CRC32 16 select CRC32
@@ -568,5 +572,4 @@ config USB_VL600
568 572
569 http://ubuntuforums.org/showpost.php?p=10589647&postcount=17 573 http://ubuntuforums.org/showpost.php?p=10589647&postcount=17
570 574
571 575endif # USB_NET_DRIVERS
572endmenu
diff --git a/drivers/net/usb/ax88179_178a.c b/drivers/net/usb/ax88179_178a.c
index 054e59ca6946..be4275721039 100644
--- a/drivers/net/usb/ax88179_178a.c
+++ b/drivers/net/usb/ax88179_178a.c
@@ -23,6 +23,8 @@
23#include <linux/usb.h> 23#include <linux/usb.h>
24#include <linux/crc32.h> 24#include <linux/crc32.h>
25#include <linux/usb/usbnet.h> 25#include <linux/usb/usbnet.h>
26#include <uapi/linux/mdio.h>
27#include <linux/mdio.h>
26 28
27#define AX88179_PHY_ID 0x03 29#define AX88179_PHY_ID 0x03
28#define AX_EEPROM_LEN 0x100 30#define AX_EEPROM_LEN 0x100
@@ -170,8 +172,12 @@
170#define GMII_PHY_PAGE_SELECT 0x1f 172#define GMII_PHY_PAGE_SELECT 0x1f
171 #define GMII_PHY_PGSEL_EXT 0x0007 173 #define GMII_PHY_PGSEL_EXT 0x0007
172 #define GMII_PHY_PGSEL_PAGE0 0x0000 174 #define GMII_PHY_PGSEL_PAGE0 0x0000
175 #define GMII_PHY_PGSEL_PAGE3 0x0003
176 #define GMII_PHY_PGSEL_PAGE5 0x0005
173 177
174struct ax88179_data { 178struct ax88179_data {
179 u8 eee_enabled;
180 u8 eee_active;
175 u16 rxctl; 181 u16 rxctl;
176 u16 reserved; 182 u16 reserved;
177}; 183};
@@ -373,6 +379,60 @@ static void ax88179_mdio_write(struct net_device *netdev, int phy_id, int loc,
373 ax88179_write_cmd(dev, AX_ACCESS_PHY, phy_id, (__u16)loc, 2, &res); 379 ax88179_write_cmd(dev, AX_ACCESS_PHY, phy_id, (__u16)loc, 2, &res);
374} 380}
375 381
382static inline int ax88179_phy_mmd_indirect(struct usbnet *dev, u16 prtad,
383 u16 devad)
384{
385 u16 tmp16;
386 int ret;
387
388 tmp16 = devad;
389 ret = ax88179_write_cmd(dev, AX_ACCESS_PHY, AX88179_PHY_ID,
390 MII_MMD_CTRL, 2, &tmp16);
391
392 tmp16 = prtad;
393 ret = ax88179_write_cmd(dev, AX_ACCESS_PHY, AX88179_PHY_ID,
394 MII_MMD_DATA, 2, &tmp16);
395
396 tmp16 = devad | MII_MMD_CTRL_NOINCR;
397 ret = ax88179_write_cmd(dev, AX_ACCESS_PHY, AX88179_PHY_ID,
398 MII_MMD_CTRL, 2, &tmp16);
399
400 return ret;
401}
402
403static int
404ax88179_phy_read_mmd_indirect(struct usbnet *dev, u16 prtad, u16 devad)
405{
406 int ret;
407 u16 tmp16;
408
409 ax88179_phy_mmd_indirect(dev, prtad, devad);
410
411 ret = ax88179_read_cmd(dev, AX_ACCESS_PHY, AX88179_PHY_ID,
412 MII_MMD_DATA, 2, &tmp16);
413 if (ret < 0)
414 return ret;
415
416 return tmp16;
417}
418
419static int
420ax88179_phy_write_mmd_indirect(struct usbnet *dev, u16 prtad, u16 devad,
421 u16 data)
422{
423 int ret;
424
425 ax88179_phy_mmd_indirect(dev, prtad, devad);
426
427 ret = ax88179_write_cmd(dev, AX_ACCESS_PHY, AX88179_PHY_ID,
428 MII_MMD_DATA, 2, &data);
429
430 if (ret < 0)
431 return ret;
432
433 return 0;
434}
435
376static int ax88179_suspend(struct usb_interface *intf, pm_message_t message) 436static int ax88179_suspend(struct usb_interface *intf, pm_message_t message)
377{ 437{
378 struct usbnet *dev = usb_get_intfdata(intf); 438 struct usbnet *dev = usb_get_intfdata(intf);
@@ -572,6 +632,185 @@ static int ax88179_set_settings(struct net_device *net, struct ethtool_cmd *cmd)
572 return mii_ethtool_sset(&dev->mii, cmd); 632 return mii_ethtool_sset(&dev->mii, cmd);
573} 633}
574 634
635static int
636ax88179_ethtool_get_eee(struct usbnet *dev, struct ethtool_eee *data)
637{
638 int val;
639
640 /* Get Supported EEE */
641 val = ax88179_phy_read_mmd_indirect(dev, MDIO_PCS_EEE_ABLE,
642 MDIO_MMD_PCS);
643 if (val < 0)
644 return val;
645 data->supported = mmd_eee_cap_to_ethtool_sup_t(val);
646
647 /* Get advertisement EEE */
648 val = ax88179_phy_read_mmd_indirect(dev, MDIO_AN_EEE_ADV,
649 MDIO_MMD_AN);
650 if (val < 0)
651 return val;
652 data->advertised = mmd_eee_adv_to_ethtool_adv_t(val);
653
654 /* Get LP advertisement EEE */
655 val = ax88179_phy_read_mmd_indirect(dev, MDIO_AN_EEE_LPABLE,
656 MDIO_MMD_AN);
657 if (val < 0)
658 return val;
659 data->lp_advertised = mmd_eee_adv_to_ethtool_adv_t(val);
660
661 return 0;
662}
663
664static int
665ax88179_ethtool_set_eee(struct usbnet *dev, struct ethtool_eee *data)
666{
667 u16 tmp16 = ethtool_adv_to_mmd_eee_adv_t(data->advertised);
668
669 return ax88179_phy_write_mmd_indirect(dev, MDIO_AN_EEE_ADV,
670 MDIO_MMD_AN, tmp16);
671}
672
673static int ax88179_chk_eee(struct usbnet *dev)
674{
675 struct ethtool_cmd ecmd = { .cmd = ETHTOOL_GSET };
676 struct ax88179_data *priv = (struct ax88179_data *)dev->data;
677
678 mii_ethtool_gset(&dev->mii, &ecmd);
679
680 if (ecmd.duplex & DUPLEX_FULL) {
681 int eee_lp, eee_cap, eee_adv;
682 u32 lp, cap, adv, supported = 0;
683
684 eee_cap = ax88179_phy_read_mmd_indirect(dev,
685 MDIO_PCS_EEE_ABLE,
686 MDIO_MMD_PCS);
687 if (eee_cap < 0) {
688 priv->eee_active = 0;
689 return false;
690 }
691
692 cap = mmd_eee_cap_to_ethtool_sup_t(eee_cap);
693 if (!cap) {
694 priv->eee_active = 0;
695 return false;
696 }
697
698 eee_lp = ax88179_phy_read_mmd_indirect(dev,
699 MDIO_AN_EEE_LPABLE,
700 MDIO_MMD_AN);
701 if (eee_lp < 0) {
702 priv->eee_active = 0;
703 return false;
704 }
705
706 eee_adv = ax88179_phy_read_mmd_indirect(dev,
707 MDIO_AN_EEE_ADV,
708 MDIO_MMD_AN);
709
710 if (eee_adv < 0) {
711 priv->eee_active = 0;
712 return false;
713 }
714
715 adv = mmd_eee_adv_to_ethtool_adv_t(eee_adv);
716 lp = mmd_eee_adv_to_ethtool_adv_t(eee_lp);
717 supported = (ecmd.speed == SPEED_1000) ?
718 SUPPORTED_1000baseT_Full :
719 SUPPORTED_100baseT_Full;
720
721 if (!(lp & adv & supported)) {
722 priv->eee_active = 0;
723 return false;
724 }
725
726 priv->eee_active = 1;
727 return true;
728 }
729
730 priv->eee_active = 0;
731 return false;
732}
733
734static void ax88179_disable_eee(struct usbnet *dev)
735{
736 u16 tmp16;
737
738 tmp16 = GMII_PHY_PGSEL_PAGE3;
739 ax88179_write_cmd(dev, AX_ACCESS_PHY, AX88179_PHY_ID,
740 GMII_PHY_PAGE_SELECT, 2, &tmp16);
741
742 tmp16 = 0x3246;
743 ax88179_write_cmd(dev, AX_ACCESS_PHY, AX88179_PHY_ID,
744 MII_PHYADDR, 2, &tmp16);
745
746 tmp16 = GMII_PHY_PGSEL_PAGE0;
747 ax88179_write_cmd(dev, AX_ACCESS_PHY, AX88179_PHY_ID,
748 GMII_PHY_PAGE_SELECT, 2, &tmp16);
749}
750
751static void ax88179_enable_eee(struct usbnet *dev)
752{
753 u16 tmp16;
754
755 tmp16 = GMII_PHY_PGSEL_PAGE3;
756 ax88179_write_cmd(dev, AX_ACCESS_PHY, AX88179_PHY_ID,
757 GMII_PHY_PAGE_SELECT, 2, &tmp16);
758
759 tmp16 = 0x3247;
760 ax88179_write_cmd(dev, AX_ACCESS_PHY, AX88179_PHY_ID,
761 MII_PHYADDR, 2, &tmp16);
762
763 tmp16 = GMII_PHY_PGSEL_PAGE5;
764 ax88179_write_cmd(dev, AX_ACCESS_PHY, AX88179_PHY_ID,
765 GMII_PHY_PAGE_SELECT, 2, &tmp16);
766
767 tmp16 = 0x0680;
768 ax88179_write_cmd(dev, AX_ACCESS_PHY, AX88179_PHY_ID,
769 MII_BMSR, 2, &tmp16);
770
771 tmp16 = GMII_PHY_PGSEL_PAGE0;
772 ax88179_write_cmd(dev, AX_ACCESS_PHY, AX88179_PHY_ID,
773 GMII_PHY_PAGE_SELECT, 2, &tmp16);
774}
775
776static int ax88179_get_eee(struct net_device *net, struct ethtool_eee *edata)
777{
778 struct usbnet *dev = netdev_priv(net);
779 struct ax88179_data *priv = (struct ax88179_data *)dev->data;
780
781 edata->eee_enabled = priv->eee_enabled;
782 edata->eee_active = priv->eee_active;
783
784 return ax88179_ethtool_get_eee(dev, edata);
785}
786
787static int ax88179_set_eee(struct net_device *net, struct ethtool_eee *edata)
788{
789 struct usbnet *dev = netdev_priv(net);
790 struct ax88179_data *priv = (struct ax88179_data *)dev->data;
791 int ret = -EOPNOTSUPP;
792
793 priv->eee_enabled = edata->eee_enabled;
794 if (!priv->eee_enabled) {
795 ax88179_disable_eee(dev);
796 } else {
797 priv->eee_enabled = ax88179_chk_eee(dev);
798 if (!priv->eee_enabled)
799 return -EOPNOTSUPP;
800
801 ax88179_enable_eee(dev);
802 }
803
804 ret = ax88179_ethtool_set_eee(dev, edata);
805 if (ret)
806 return ret;
807
808 mii_nway_restart(&dev->mii);
809
810 usbnet_link_change(dev, 0, 0);
811
812 return ret;
813}
575 814
576static int ax88179_ioctl(struct net_device *net, struct ifreq *rq, int cmd) 815static int ax88179_ioctl(struct net_device *net, struct ifreq *rq, int cmd)
577{ 816{
@@ -589,6 +828,8 @@ static const struct ethtool_ops ax88179_ethtool_ops = {
589 .get_eeprom = ax88179_get_eeprom, 828 .get_eeprom = ax88179_get_eeprom,
590 .get_settings = ax88179_get_settings, 829 .get_settings = ax88179_get_settings,
591 .set_settings = ax88179_set_settings, 830 .set_settings = ax88179_set_settings,
831 .get_eee = ax88179_get_eee,
832 .set_eee = ax88179_set_eee,
592 .nway_reset = usbnet_nway_reset, 833 .nway_reset = usbnet_nway_reset,
593}; 834};
594 835
@@ -980,6 +1221,7 @@ static int ax88179_bind(struct usbnet *dev, struct usb_interface *intf)
980 u16 *tmp16; 1221 u16 *tmp16;
981 u8 *tmp; 1222 u8 *tmp;
982 struct ax88179_data *ax179_data = (struct ax88179_data *)dev->data; 1223 struct ax88179_data *ax179_data = (struct ax88179_data *)dev->data;
1224 struct ethtool_eee eee_data;
983 1225
984 usbnet_get_endpoints(dev, intf); 1226 usbnet_get_endpoints(dev, intf);
985 1227
@@ -1062,6 +1304,15 @@ static int ax88179_bind(struct usbnet *dev, struct usb_interface *intf)
1062 1304
1063 ax88179_led_setting(dev); 1305 ax88179_led_setting(dev);
1064 1306
1307 ax179_data->eee_enabled = 0;
1308 ax179_data->eee_active = 0;
1309
1310 ax88179_disable_eee(dev);
1311
1312 ax88179_ethtool_get_eee(dev, &eee_data);
1313 eee_data.advertised = 0;
1314 ax88179_ethtool_set_eee(dev, &eee_data);
1315
1065 /* Restart autoneg */ 1316 /* Restart autoneg */
1066 mii_nway_restart(&dev->mii); 1317 mii_nway_restart(&dev->mii);
1067 1318
@@ -1261,6 +1512,8 @@ static int ax88179_link_reset(struct usbnet *dev)
1261 ax88179_write_cmd(dev, AX_ACCESS_MAC, AX_MEDIUM_STATUS_MODE, 1512 ax88179_write_cmd(dev, AX_ACCESS_MAC, AX_MEDIUM_STATUS_MODE,
1262 2, 2, &mode); 1513 2, 2, &mode);
1263 1514
1515 ax179_data->eee_enabled = ax88179_chk_eee(dev);
1516
1264 netif_carrier_on(dev->net); 1517 netif_carrier_on(dev->net);
1265 1518
1266 return 0; 1519 return 0;
@@ -1271,6 +1524,8 @@ static int ax88179_reset(struct usbnet *dev)
1271 u8 buf[5]; 1524 u8 buf[5];
1272 u16 *tmp16; 1525 u16 *tmp16;
1273 u8 *tmp; 1526 u8 *tmp;
1527 struct ax88179_data *ax179_data = (struct ax88179_data *)dev->data;
1528 struct ethtool_eee eee_data;
1274 1529
1275 tmp16 = (u16 *)buf; 1530 tmp16 = (u16 *)buf;
1276 tmp = (u8 *)buf; 1531 tmp = (u8 *)buf;
@@ -1340,6 +1595,15 @@ static int ax88179_reset(struct usbnet *dev)
1340 1595
1341 ax88179_led_setting(dev); 1596 ax88179_led_setting(dev);
1342 1597
1598 ax179_data->eee_enabled = 0;
1599 ax179_data->eee_active = 0;
1600
1601 ax88179_disable_eee(dev);
1602
1603 ax88179_ethtool_get_eee(dev, &eee_data);
1604 eee_data.advertised = 0;
1605 ax88179_ethtool_set_eee(dev, &eee_data);
1606
1343 /* Restart autoneg */ 1607 /* Restart autoneg */
1344 mii_nway_restart(&dev->mii); 1608 mii_nway_restart(&dev->mii);
1345 1609
diff --git a/drivers/net/usb/cdc-phonet.c b/drivers/net/usb/cdc-phonet.c
index 6358d420e185..2ec1500d0077 100644
--- a/drivers/net/usb/cdc-phonet.c
+++ b/drivers/net/usb/cdc-phonet.c
@@ -387,7 +387,7 @@ static int usbpn_probe(struct usb_interface *intf, const struct usb_device_id *i
387 return -EINVAL; 387 return -EINVAL;
388 388
389 dev = alloc_netdev(sizeof(*pnd) + sizeof(pnd->urbs[0]) * rxq_size, 389 dev = alloc_netdev(sizeof(*pnd) + sizeof(pnd->urbs[0]) * rxq_size,
390 ifname, usbpn_setup); 390 ifname, NET_NAME_UNKNOWN, usbpn_setup);
391 if (!dev) 391 if (!dev)
392 return -ENOMEM; 392 return -ENOMEM;
393 393
diff --git a/drivers/net/usb/cdc_ether.c b/drivers/net/usb/cdc_ether.c
index 9ea4bfe5d318..2a32d9167d3b 100644
--- a/drivers/net/usb/cdc_ether.c
+++ b/drivers/net/usb/cdc_ether.c
@@ -341,6 +341,22 @@ next_desc:
341 usb_driver_release_interface(driver, info->data); 341 usb_driver_release_interface(driver, info->data);
342 return -ENODEV; 342 return -ENODEV;
343 } 343 }
344
345 /* Some devices don't initialise properly. In particular
346 * the packet filter is not reset. There are devices that
347 * don't do reset all the way. So the packet filter should
348 * be set to a sane initial value.
349 */
350 usb_control_msg(dev->udev,
351 usb_sndctrlpipe(dev->udev, 0),
352 USB_CDC_SET_ETHERNET_PACKET_FILTER,
353 USB_TYPE_CLASS | USB_RECIP_INTERFACE,
354 USB_CDC_PACKET_TYPE_ALL_MULTICAST | USB_CDC_PACKET_TYPE_DIRECTED | USB_CDC_PACKET_TYPE_BROADCAST,
355 intf->cur_altsetting->desc.bInterfaceNumber,
356 NULL,
357 0,
358 USB_CTRL_SET_TIMEOUT
359 );
344 return 0; 360 return 0;
345 361
346bad_desc: 362bad_desc:
diff --git a/drivers/net/usb/cdc_subset.c b/drivers/net/usb/cdc_subset.c
index 91f0919fe278..6ea98cff2d3b 100644
--- a/drivers/net/usb/cdc_subset.c
+++ b/drivers/net/usb/cdc_subset.c
@@ -85,14 +85,28 @@ static int always_connected (struct usbnet *dev)
85 * 85 *
86 *-------------------------------------------------------------------------*/ 86 *-------------------------------------------------------------------------*/
87 87
88static void m5632_recover(struct usbnet *dev)
89{
90 struct usb_device *udev = dev->udev;
91 struct usb_interface *intf = dev->intf;
92 int r;
93
94 r = usb_lock_device_for_reset(udev, intf);
95 if (r < 0)
96 return;
97
98 usb_reset_device(udev);
99 usb_unlock_device(udev);
100}
101
88static const struct driver_info ali_m5632_info = { 102static const struct driver_info ali_m5632_info = {
89 .description = "ALi M5632", 103 .description = "ALi M5632",
90 .flags = FLAG_POINTTOPOINT, 104 .flags = FLAG_POINTTOPOINT,
105 .recover = m5632_recover,
91}; 106};
92 107
93#endif 108#endif
94 109
95
96#ifdef CONFIG_USB_AN2720 110#ifdef CONFIG_USB_AN2720
97#define HAVE_HARDWARE 111#define HAVE_HARDWARE
98 112
@@ -326,12 +340,23 @@ static const struct usb_device_id products [] = {
326MODULE_DEVICE_TABLE(usb, products); 340MODULE_DEVICE_TABLE(usb, products);
327 341
328/*-------------------------------------------------------------------------*/ 342/*-------------------------------------------------------------------------*/
343static int dummy_prereset(struct usb_interface *intf)
344{
345 return 0;
346}
347
348static int dummy_postreset(struct usb_interface *intf)
349{
350 return 0;
351}
329 352
330static struct usb_driver cdc_subset_driver = { 353static struct usb_driver cdc_subset_driver = {
331 .name = "cdc_subset", 354 .name = "cdc_subset",
332 .probe = usbnet_probe, 355 .probe = usbnet_probe,
333 .suspend = usbnet_suspend, 356 .suspend = usbnet_suspend,
334 .resume = usbnet_resume, 357 .resume = usbnet_resume,
358 .pre_reset = dummy_prereset,
359 .post_reset = dummy_postreset,
335 .disconnect = usbnet_disconnect, 360 .disconnect = usbnet_disconnect,
336 .id_table = products, 361 .id_table = products,
337 .disable_hub_initiated_lpm = 1, 362 .disable_hub_initiated_lpm = 1,
diff --git a/drivers/net/usb/hso.c b/drivers/net/usb/hso.c
index a4272ed62da8..babda7d8693e 100644
--- a/drivers/net/usb/hso.c
+++ b/drivers/net/usb/hso.c
@@ -467,6 +467,7 @@ static const struct usb_device_id hso_ids[] = {
467 {USB_DEVICE(0x0af0, 0x8800)}, 467 {USB_DEVICE(0x0af0, 0x8800)},
468 {USB_DEVICE(0x0af0, 0x8900)}, 468 {USB_DEVICE(0x0af0, 0x8900)},
469 {USB_DEVICE(0x0af0, 0x9000)}, 469 {USB_DEVICE(0x0af0, 0x9000)},
470 {USB_DEVICE(0x0af0, 0x9200)}, /* Option GTM671WFS */
470 {USB_DEVICE(0x0af0, 0xd035)}, 471 {USB_DEVICE(0x0af0, 0xd035)},
471 {USB_DEVICE(0x0af0, 0xd055)}, 472 {USB_DEVICE(0x0af0, 0xd055)},
472 {USB_DEVICE(0x0af0, 0xd155)}, 473 {USB_DEVICE(0x0af0, 0xd155)},
@@ -2504,7 +2505,8 @@ static struct hso_device *hso_create_net_device(struct usb_interface *interface,
2504 2505
2505 /* allocate our network device, then we can put in our private data */ 2506 /* allocate our network device, then we can put in our private data */
2506 /* call hso_net_init to do the basic initialization */ 2507 /* call hso_net_init to do the basic initialization */
2507 net = alloc_netdev(sizeof(struct hso_net), "hso%d", hso_net_init); 2508 net = alloc_netdev(sizeof(struct hso_net), "hso%d", NET_NAME_UNKNOWN,
2509 hso_net_init);
2508 if (!net) { 2510 if (!net) {
2509 dev_err(&interface->dev, "Unable to create ethernet device\n"); 2511 dev_err(&interface->dev, "Unable to create ethernet device\n");
2510 goto exit; 2512 goto exit;
diff --git a/drivers/net/usb/huawei_cdc_ncm.c b/drivers/net/usb/huawei_cdc_ncm.c
index 5d95a13dbe2a..735f7dadb9a0 100644
--- a/drivers/net/usb/huawei_cdc_ncm.c
+++ b/drivers/net/usb/huawei_cdc_ncm.c
@@ -194,6 +194,9 @@ static const struct usb_device_id huawei_cdc_ncm_devs[] = {
194 { USB_VENDOR_AND_INTERFACE_INFO(0x12d1, 0xff, 0x02, 0x76), 194 { USB_VENDOR_AND_INTERFACE_INFO(0x12d1, 0xff, 0x02, 0x76),
195 .driver_info = (unsigned long)&huawei_cdc_ncm_info, 195 .driver_info = (unsigned long)&huawei_cdc_ncm_info,
196 }, 196 },
197 { USB_VENDOR_AND_INTERFACE_INFO(0x12d1, 0xff, 0x03, 0x16),
198 .driver_info = (unsigned long)&huawei_cdc_ncm_info,
199 },
197 200
198 /* Terminating entry */ 201 /* Terminating entry */
199 { 202 {
diff --git a/drivers/net/usb/qmi_wwan.c b/drivers/net/usb/qmi_wwan.c
index c4638c67f6b9..22756db53dca 100644
--- a/drivers/net/usb/qmi_wwan.c
+++ b/drivers/net/usb/qmi_wwan.c
@@ -667,6 +667,7 @@ static const struct usb_device_id products[] = {
667 {QMI_FIXED_INTF(0x05c6, 0x9084, 4)}, 667 {QMI_FIXED_INTF(0x05c6, 0x9084, 4)},
668 {QMI_FIXED_INTF(0x05c6, 0x920d, 0)}, 668 {QMI_FIXED_INTF(0x05c6, 0x920d, 0)},
669 {QMI_FIXED_INTF(0x05c6, 0x920d, 5)}, 669 {QMI_FIXED_INTF(0x05c6, 0x920d, 5)},
670 {QMI_FIXED_INTF(0x0846, 0x68a2, 8)},
670 {QMI_FIXED_INTF(0x12d1, 0x140c, 1)}, /* Huawei E173 */ 671 {QMI_FIXED_INTF(0x12d1, 0x140c, 1)}, /* Huawei E173 */
671 {QMI_FIXED_INTF(0x12d1, 0x14ac, 1)}, /* Huawei E1820 */ 672 {QMI_FIXED_INTF(0x12d1, 0x14ac, 1)}, /* Huawei E1820 */
672 {QMI_FIXED_INTF(0x16d8, 0x6003, 0)}, /* CMOTech 6003 */ 673 {QMI_FIXED_INTF(0x16d8, 0x6003, 0)}, /* CMOTech 6003 */
@@ -757,6 +758,7 @@ static const struct usb_device_id products[] = {
757 {QMI_FIXED_INTF(0x1199, 0x9054, 8)}, /* Sierra Wireless Modem */ 758 {QMI_FIXED_INTF(0x1199, 0x9054, 8)}, /* Sierra Wireless Modem */
758 {QMI_FIXED_INTF(0x1199, 0x9055, 8)}, /* Netgear AirCard 341U */ 759 {QMI_FIXED_INTF(0x1199, 0x9055, 8)}, /* Netgear AirCard 341U */
759 {QMI_FIXED_INTF(0x1199, 0x9056, 8)}, /* Sierra Wireless Modem */ 760 {QMI_FIXED_INTF(0x1199, 0x9056, 8)}, /* Sierra Wireless Modem */
761 {QMI_FIXED_INTF(0x1199, 0x9057, 8)},
760 {QMI_FIXED_INTF(0x1199, 0x9061, 8)}, /* Sierra Wireless Modem */ 762 {QMI_FIXED_INTF(0x1199, 0x9061, 8)}, /* Sierra Wireless Modem */
761 {QMI_FIXED_INTF(0x1bbb, 0x011e, 4)}, /* Telekom Speedstick LTE II (Alcatel One Touch L100V LTE) */ 763 {QMI_FIXED_INTF(0x1bbb, 0x011e, 4)}, /* Telekom Speedstick LTE II (Alcatel One Touch L100V LTE) */
762 {QMI_FIXED_INTF(0x1bbb, 0x0203, 2)}, /* Alcatel L800MA */ 764 {QMI_FIXED_INTF(0x1bbb, 0x0203, 2)}, /* Alcatel L800MA */
diff --git a/drivers/net/usb/r8152.c b/drivers/net/usb/r8152.c
index 7bad2d316637..87f710476217 100644
--- a/drivers/net/usb/r8152.c
+++ b/drivers/net/usb/r8152.c
@@ -59,6 +59,7 @@
59#define PLA_WDT6_CTRL 0xe428 59#define PLA_WDT6_CTRL 0xe428
60#define PLA_TCR0 0xe610 60#define PLA_TCR0 0xe610
61#define PLA_TCR1 0xe612 61#define PLA_TCR1 0xe612
62#define PLA_MTPS 0xe615
62#define PLA_TXFIFO_CTRL 0xe618 63#define PLA_TXFIFO_CTRL 0xe618
63#define PLA_RSTTALLY 0xe800 64#define PLA_RSTTALLY 0xe800
64#define PLA_CR 0xe813 65#define PLA_CR 0xe813
@@ -180,6 +181,10 @@
180/* PLA_TCR1 */ 181/* PLA_TCR1 */
181#define VERSION_MASK 0x7cf0 182#define VERSION_MASK 0x7cf0
182 183
184/* PLA_MTPS */
185#define MTPS_JUMBO (12 * 1024 / 64)
186#define MTPS_DEFAULT (6 * 1024 / 64)
187
183/* PLA_RSTTALLY */ 188/* PLA_RSTTALLY */
184#define TALLY_RESET 0x0001 189#define TALLY_RESET 0x0001
185 190
@@ -282,7 +287,7 @@
282/* USB_DEV_STAT */ 287/* USB_DEV_STAT */
283#define STAT_SPEED_MASK 0x0006 288#define STAT_SPEED_MASK 0x0006
284#define STAT_SPEED_HIGH 0x0000 289#define STAT_SPEED_HIGH 0x0000
285#define STAT_SPEED_FULL 0x0001 290#define STAT_SPEED_FULL 0x0002
286 291
287/* USB_TX_AGG */ 292/* USB_TX_AGG */
288#define TX_AGG_MAX_THRESHOLD 0x03 293#define TX_AGG_MAX_THRESHOLD 0x03
@@ -440,8 +445,11 @@ enum rtl_register_content {
440#define BYTE_EN_START_MASK 0x0f 445#define BYTE_EN_START_MASK 0x0f
441#define BYTE_EN_END_MASK 0xf0 446#define BYTE_EN_END_MASK 0xf0
442 447
448#define RTL8153_MAX_PACKET 9216 /* 9K */
449#define RTL8153_MAX_MTU (RTL8153_MAX_PACKET - VLAN_ETH_HLEN - VLAN_HLEN)
443#define RTL8152_RMS (VLAN_ETH_FRAME_LEN + VLAN_HLEN) 450#define RTL8152_RMS (VLAN_ETH_FRAME_LEN + VLAN_HLEN)
444#define RTL8152_TX_TIMEOUT (HZ) 451#define RTL8153_RMS RTL8153_MAX_PACKET
452#define RTL8152_TX_TIMEOUT (5 * HZ)
445 453
446/* rtl8152 flags */ 454/* rtl8152 flags */
447enum rtl8152_flags { 455enum rtl8152_flags {
@@ -2292,9 +2300,8 @@ static void r8152b_exit_oob(struct r8152 *tp)
2292 /* rx share fifo credit full threshold */ 2300 /* rx share fifo credit full threshold */
2293 ocp_write_dword(tp, MCU_TYPE_PLA, PLA_RXFIFO_CTRL0, RXFIFO_THR1_NORMAL); 2301 ocp_write_dword(tp, MCU_TYPE_PLA, PLA_RXFIFO_CTRL0, RXFIFO_THR1_NORMAL);
2294 2302
2295 ocp_data = ocp_read_word(tp, MCU_TYPE_USB, USB_DEV_STAT); 2303 if (tp->udev->speed == USB_SPEED_FULL ||
2296 ocp_data &= STAT_SPEED_MASK; 2304 tp->udev->speed == USB_SPEED_LOW) {
2297 if (ocp_data == STAT_SPEED_FULL) {
2298 /* rx share fifo credit near full threshold */ 2305 /* rx share fifo credit near full threshold */
2299 ocp_write_dword(tp, MCU_TYPE_PLA, PLA_RXFIFO_CTRL1, 2306 ocp_write_dword(tp, MCU_TYPE_PLA, PLA_RXFIFO_CTRL1,
2300 RXFIFO_THR2_FULL); 2307 RXFIFO_THR2_FULL);
@@ -2522,7 +2529,8 @@ static void r8153_first_init(struct r8152 *tp)
2522 ocp_data &= ~CPCR_RX_VLAN; 2529 ocp_data &= ~CPCR_RX_VLAN;
2523 ocp_write_word(tp, MCU_TYPE_PLA, PLA_CPCR, ocp_data); 2530 ocp_write_word(tp, MCU_TYPE_PLA, PLA_CPCR, ocp_data);
2524 2531
2525 ocp_write_word(tp, MCU_TYPE_PLA, PLA_RMS, RTL8152_RMS); 2532 ocp_write_word(tp, MCU_TYPE_PLA, PLA_RMS, RTL8153_RMS);
2533 ocp_write_byte(tp, MCU_TYPE_PLA, PLA_MTPS, MTPS_JUMBO);
2526 2534
2527 ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_TCR0); 2535 ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_TCR0);
2528 ocp_data |= TCR0_AUTO_FIFO; 2536 ocp_data |= TCR0_AUTO_FIFO;
@@ -2572,7 +2580,7 @@ static void r8153_enter_oob(struct r8152 *tp)
2572 mdelay(1); 2580 mdelay(1);
2573 } 2581 }
2574 2582
2575 ocp_write_word(tp, MCU_TYPE_PLA, PLA_RMS, RTL8152_RMS); 2583 ocp_write_word(tp, MCU_TYPE_PLA, PLA_RMS, RTL8153_RMS);
2576 2584
2577 ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_TEREDO_CFG); 2585 ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_TEREDO_CFG);
2578 ocp_data &= ~TEREDO_WAKE_MASK; 2586 ocp_data &= ~TEREDO_WAKE_MASK;
@@ -3289,6 +3297,26 @@ out:
3289 return res; 3297 return res;
3290} 3298}
3291 3299
3300static int rtl8152_change_mtu(struct net_device *dev, int new_mtu)
3301{
3302 struct r8152 *tp = netdev_priv(dev);
3303
3304 switch (tp->version) {
3305 case RTL_VER_01:
3306 case RTL_VER_02:
3307 return eth_change_mtu(dev, new_mtu);
3308 default:
3309 break;
3310 }
3311
3312 if (new_mtu < 68 || new_mtu > RTL8153_MAX_MTU)
3313 return -EINVAL;
3314
3315 dev->mtu = new_mtu;
3316
3317 return 0;
3318}
3319
3292static const struct net_device_ops rtl8152_netdev_ops = { 3320static const struct net_device_ops rtl8152_netdev_ops = {
3293 .ndo_open = rtl8152_open, 3321 .ndo_open = rtl8152_open,
3294 .ndo_stop = rtl8152_close, 3322 .ndo_stop = rtl8152_close,
@@ -3297,8 +3325,7 @@ static const struct net_device_ops rtl8152_netdev_ops = {
3297 .ndo_tx_timeout = rtl8152_tx_timeout, 3325 .ndo_tx_timeout = rtl8152_tx_timeout,
3298 .ndo_set_rx_mode = rtl8152_set_rx_mode, 3326 .ndo_set_rx_mode = rtl8152_set_rx_mode,
3299 .ndo_set_mac_address = rtl8152_set_mac_address, 3327 .ndo_set_mac_address = rtl8152_set_mac_address,
3300 3328 .ndo_change_mtu = rtl8152_change_mtu,
3301 .ndo_change_mtu = eth_change_mtu,
3302 .ndo_validate_addr = eth_validate_addr, 3329 .ndo_validate_addr = eth_validate_addr,
3303}; 3330};
3304 3331
diff --git a/drivers/net/usb/usbnet.c b/drivers/net/usb/usbnet.c
index f9e96c427558..5173821a9575 100644
--- a/drivers/net/usb/usbnet.c
+++ b/drivers/net/usb/usbnet.c
@@ -1218,8 +1218,12 @@ void usbnet_tx_timeout (struct net_device *net)
1218 1218
1219 unlink_urbs (dev, &dev->txq); 1219 unlink_urbs (dev, &dev->txq);
1220 tasklet_schedule (&dev->bh); 1220 tasklet_schedule (&dev->bh);
1221 1221 /* this needs to be handled individually because the generic layer
1222 // FIXME: device recovery -- reset? 1222 * doesn't know what is sufficient and could not restore private
1223 * information if a remedy of an unconditional reset were used.
1224 */
1225 if (dev->driver_info->recover)
1226 (dev->driver_info->recover)(dev);
1223} 1227}
1224EXPORT_SYMBOL_GPL(usbnet_tx_timeout); 1228EXPORT_SYMBOL_GPL(usbnet_tx_timeout);
1225 1229