diff options
Diffstat (limited to 'drivers/net/usb')
| -rw-r--r-- | drivers/net/usb/Kconfig | 13 | ||||
| -rw-r--r-- | drivers/net/usb/ax88179_178a.c | 264 | ||||
| -rw-r--r-- | drivers/net/usb/cdc-phonet.c | 2 | ||||
| -rw-r--r-- | drivers/net/usb/cdc_ether.c | 16 | ||||
| -rw-r--r-- | drivers/net/usb/cdc_subset.c | 27 | ||||
| -rw-r--r-- | drivers/net/usb/hso.c | 4 | ||||
| -rw-r--r-- | drivers/net/usb/huawei_cdc_ncm.c | 3 | ||||
| -rw-r--r-- | drivers/net/usb/qmi_wwan.c | 2 | ||||
| -rw-r--r-- | drivers/net/usb/r8152.c | 45 | ||||
| -rw-r--r-- | drivers/net/usb/usbnet.c | 8 |
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 | # |
| 4 | comment "Networking support is needed for USB Network Adapter support" | 4 | comment "Host-side USB support is needed for USB Network Adapter support" |
| 5 | depends on USB && !NET | 5 | depends on !USB && NET |
| 6 | 6 | ||
| 7 | menu "USB Network Adapters" | 7 | menuconfig 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 | ||
| 12 | if USB_NET_DRIVERS | ||
| 13 | |||
| 10 | config USB_CATC | 14 | config 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 | 575 | endif # USB_NET_DRIVERS | |
| 572 | endmenu | ||
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 | ||
| 174 | struct ax88179_data { | 178 | struct 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 | ||
| 382 | static 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 | |||
| 403 | static int | ||
| 404 | ax88179_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 | |||
| 419 | static int | ||
| 420 | ax88179_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 | |||
| 376 | static int ax88179_suspend(struct usb_interface *intf, pm_message_t message) | 436 | static 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 | ||
| 635 | static int | ||
| 636 | ax88179_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 | |||
| 664 | static int | ||
| 665 | ax88179_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 | |||
| 673 | static 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 | |||
| 734 | static 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 | |||
| 751 | static 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 | |||
| 776 | static 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 | |||
| 787 | static 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 | ||
| 576 | static int ax88179_ioctl(struct net_device *net, struct ifreq *rq, int cmd) | 815 | static 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 | ||
| 346 | bad_desc: | 362 | bad_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 | ||
| 88 | static 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 | |||
| 88 | static const struct driver_info ali_m5632_info = { | 102 | static 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 [] = { | |||
| 326 | MODULE_DEVICE_TABLE(usb, products); | 340 | MODULE_DEVICE_TABLE(usb, products); |
| 327 | 341 | ||
| 328 | /*-------------------------------------------------------------------------*/ | 342 | /*-------------------------------------------------------------------------*/ |
| 343 | static int dummy_prereset(struct usb_interface *intf) | ||
| 344 | { | ||
| 345 | return 0; | ||
| 346 | } | ||
| 347 | |||
| 348 | static int dummy_postreset(struct usb_interface *intf) | ||
| 349 | { | ||
| 350 | return 0; | ||
| 351 | } | ||
| 329 | 352 | ||
| 330 | static struct usb_driver cdc_subset_driver = { | 353 | static 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 */ |
| 447 | enum rtl8152_flags { | 455 | enum 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 | ||
| 3300 | static 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 | |||
| 3292 | static const struct net_device_ops rtl8152_netdev_ops = { | 3320 | static 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 | } |
| 1224 | EXPORT_SYMBOL_GPL(usbnet_tx_timeout); | 1228 | EXPORT_SYMBOL_GPL(usbnet_tx_timeout); |
| 1225 | 1229 | ||
