diff options
Diffstat (limited to 'drivers/net')
37 files changed, 570 insertions, 322 deletions
diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c index b721902bb6b4..b2530b002125 100644 --- a/drivers/net/bonding/bond_main.c +++ b/drivers/net/bonding/bond_main.c | |||
| @@ -1519,7 +1519,7 @@ int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev) | |||
| 1519 | /* no need to lock since we're protected by rtnl_lock */ | 1519 | /* no need to lock since we're protected by rtnl_lock */ |
| 1520 | if (slave_dev->features & NETIF_F_VLAN_CHALLENGED) { | 1520 | if (slave_dev->features & NETIF_F_VLAN_CHALLENGED) { |
| 1521 | pr_debug("%s: NETIF_F_VLAN_CHALLENGED\n", slave_dev->name); | 1521 | pr_debug("%s: NETIF_F_VLAN_CHALLENGED\n", slave_dev->name); |
| 1522 | if (bond_vlan_used(bond)) { | 1522 | if (vlan_uses_dev(bond_dev)) { |
| 1523 | pr_err("%s: Error: cannot enslave VLAN challenged slave %s on VLAN enabled bond %s\n", | 1523 | pr_err("%s: Error: cannot enslave VLAN challenged slave %s on VLAN enabled bond %s\n", |
| 1524 | bond_dev->name, slave_dev->name, bond_dev->name); | 1524 | bond_dev->name, slave_dev->name, bond_dev->name); |
| 1525 | return -EPERM; | 1525 | return -EPERM; |
diff --git a/drivers/net/can/flexcan.c b/drivers/net/can/flexcan.c index c78ecfca1e45..a412bf6d73ef 100644 --- a/drivers/net/can/flexcan.c +++ b/drivers/net/can/flexcan.c | |||
| @@ -144,9 +144,22 @@ | |||
| 144 | 144 | ||
| 145 | #define FLEXCAN_MB_CODE_MASK (0xf0ffffff) | 145 | #define FLEXCAN_MB_CODE_MASK (0xf0ffffff) |
| 146 | 146 | ||
| 147 | /* FLEXCAN hardware feature flags */ | 147 | /* |
| 148 | * FLEXCAN hardware feature flags | ||
| 149 | * | ||
| 150 | * Below is some version info we got: | ||
| 151 | * SOC Version IP-Version Glitch- [TR]WRN_INT | ||
| 152 | * Filter? connected? | ||
| 153 | * MX25 FlexCAN2 03.00.00.00 no no | ||
| 154 | * MX28 FlexCAN2 03.00.04.00 yes yes | ||
| 155 | * MX35 FlexCAN2 03.00.00.00 no no | ||
| 156 | * MX53 FlexCAN2 03.00.00.00 yes no | ||
| 157 | * MX6s FlexCAN3 10.00.12.00 yes yes | ||
| 158 | * | ||
| 159 | * Some SOCs do not have the RX_WARN & TX_WARN interrupt line connected. | ||
| 160 | */ | ||
| 148 | #define FLEXCAN_HAS_V10_FEATURES BIT(1) /* For core version >= 10 */ | 161 | #define FLEXCAN_HAS_V10_FEATURES BIT(1) /* For core version >= 10 */ |
| 149 | #define FLEXCAN_HAS_BROKEN_ERR_STATE BIT(2) /* Broken error state handling */ | 162 | #define FLEXCAN_HAS_BROKEN_ERR_STATE BIT(2) /* [TR]WRN_INT not connected */ |
| 150 | 163 | ||
| 151 | /* Structure of the message buffer */ | 164 | /* Structure of the message buffer */ |
| 152 | struct flexcan_mb { | 165 | struct flexcan_mb { |
| @@ -205,7 +218,7 @@ static struct flexcan_devtype_data fsl_p1010_devtype_data = { | |||
| 205 | }; | 218 | }; |
| 206 | static struct flexcan_devtype_data fsl_imx28_devtype_data; | 219 | static struct flexcan_devtype_data fsl_imx28_devtype_data; |
| 207 | static struct flexcan_devtype_data fsl_imx6q_devtype_data = { | 220 | static struct flexcan_devtype_data fsl_imx6q_devtype_data = { |
| 208 | .features = FLEXCAN_HAS_V10_FEATURES | FLEXCAN_HAS_BROKEN_ERR_STATE, | 221 | .features = FLEXCAN_HAS_V10_FEATURES, |
| 209 | }; | 222 | }; |
| 210 | 223 | ||
| 211 | static const struct can_bittiming_const flexcan_bittiming_const = { | 224 | static const struct can_bittiming_const flexcan_bittiming_const = { |
diff --git a/drivers/net/can/sja1000/peak_pci.c b/drivers/net/can/sja1000/peak_pci.c index f5b82aeb2540..6525dbcca4e3 100644 --- a/drivers/net/can/sja1000/peak_pci.c +++ b/drivers/net/can/sja1000/peak_pci.c | |||
| @@ -30,9 +30,10 @@ | |||
| 30 | 30 | ||
| 31 | #include "sja1000.h" | 31 | #include "sja1000.h" |
| 32 | 32 | ||
| 33 | MODULE_AUTHOR("Wolfgang Grandegger <wg@grandegger.com>"); | 33 | MODULE_AUTHOR("Stephane Grosjean <s.grosjean@peak-system.com>"); |
| 34 | MODULE_DESCRIPTION("Socket-CAN driver for PEAK PCAN PCI family cards"); | 34 | MODULE_DESCRIPTION("Socket-CAN driver for PEAK PCAN PCI family cards"); |
| 35 | MODULE_SUPPORTED_DEVICE("PEAK PCAN PCI/PCIe/PCIeC miniPCI CAN cards"); | 35 | MODULE_SUPPORTED_DEVICE("PEAK PCAN PCI/PCIe/PCIeC miniPCI CAN cards"); |
| 36 | MODULE_SUPPORTED_DEVICE("PEAK PCAN miniPCIe/cPCI PC/104+ PCI/104e CAN Cards"); | ||
| 36 | MODULE_LICENSE("GPL v2"); | 37 | MODULE_LICENSE("GPL v2"); |
| 37 | 38 | ||
| 38 | #define DRV_NAME "peak_pci" | 39 | #define DRV_NAME "peak_pci" |
| @@ -64,7 +65,11 @@ struct peak_pci_chan { | |||
| 64 | #define PEAK_PCI_DEVICE_ID 0x0001 /* for PCI/PCIe slot cards */ | 65 | #define PEAK_PCI_DEVICE_ID 0x0001 /* for PCI/PCIe slot cards */ |
| 65 | #define PEAK_PCIEC_DEVICE_ID 0x0002 /* for ExpressCard slot cards */ | 66 | #define PEAK_PCIEC_DEVICE_ID 0x0002 /* for ExpressCard slot cards */ |
| 66 | #define PEAK_PCIE_DEVICE_ID 0x0003 /* for nextgen PCIe slot cards */ | 67 | #define PEAK_PCIE_DEVICE_ID 0x0003 /* for nextgen PCIe slot cards */ |
| 67 | #define PEAK_MPCI_DEVICE_ID 0x0008 /* The miniPCI slot cards */ | 68 | #define PEAK_CPCI_DEVICE_ID 0x0004 /* for nextgen cPCI slot cards */ |
| 69 | #define PEAK_MPCI_DEVICE_ID 0x0005 /* for nextgen miniPCI slot cards */ | ||
| 70 | #define PEAK_PC_104P_DEVICE_ID 0x0006 /* PCAN-PC/104+ cards */ | ||
| 71 | #define PEAK_PCI_104E_DEVICE_ID 0x0007 /* PCAN-PCI/104 Express cards */ | ||
| 72 | #define PEAK_MPCIE_DEVICE_ID 0x0008 /* The miniPCIe slot cards */ | ||
| 68 | 73 | ||
| 69 | #define PEAK_PCI_CHAN_MAX 4 | 74 | #define PEAK_PCI_CHAN_MAX 4 |
| 70 | 75 | ||
| @@ -76,6 +81,10 @@ static DEFINE_PCI_DEVICE_TABLE(peak_pci_tbl) = { | |||
| 76 | {PEAK_PCI_VENDOR_ID, PEAK_PCI_DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID,}, | 81 | {PEAK_PCI_VENDOR_ID, PEAK_PCI_DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID,}, |
| 77 | {PEAK_PCI_VENDOR_ID, PEAK_PCIE_DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID,}, | 82 | {PEAK_PCI_VENDOR_ID, PEAK_PCIE_DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID,}, |
| 78 | {PEAK_PCI_VENDOR_ID, PEAK_MPCI_DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID,}, | 83 | {PEAK_PCI_VENDOR_ID, PEAK_MPCI_DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID,}, |
| 84 | {PEAK_PCI_VENDOR_ID, PEAK_MPCIE_DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID,}, | ||
| 85 | {PEAK_PCI_VENDOR_ID, PEAK_PC_104P_DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID,}, | ||
| 86 | {PEAK_PCI_VENDOR_ID, PEAK_PCI_104E_DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID,}, | ||
| 87 | {PEAK_PCI_VENDOR_ID, PEAK_CPCI_DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID,}, | ||
| 79 | #ifdef CONFIG_CAN_PEAK_PCIEC | 88 | #ifdef CONFIG_CAN_PEAK_PCIEC |
| 80 | {PEAK_PCI_VENDOR_ID, PEAK_PCIEC_DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID,}, | 89 | {PEAK_PCI_VENDOR_ID, PEAK_PCIEC_DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID,}, |
| 81 | #endif | 90 | #endif |
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c index 24220992413f..4833b6a9031c 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c | |||
| @@ -2957,9 +2957,13 @@ netdev_tx_t bnx2x_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
| 2957 | skb_shinfo(skb)->nr_frags + | 2957 | skb_shinfo(skb)->nr_frags + |
| 2958 | BDS_PER_TX_PKT + | 2958 | BDS_PER_TX_PKT + |
| 2959 | NEXT_CNT_PER_TX_PKT(MAX_BDS_PER_TX_PKT))) { | 2959 | NEXT_CNT_PER_TX_PKT(MAX_BDS_PER_TX_PKT))) { |
| 2960 | bnx2x_fp_qstats(bp, txdata->parent_fp)->driver_xoff++; | 2960 | /* Handle special storage cases separately */ |
| 2961 | netif_tx_stop_queue(txq); | 2961 | if (txdata->tx_ring_size != 0) { |
| 2962 | BNX2X_ERR("BUG! Tx ring full when queue awake!\n"); | 2962 | BNX2X_ERR("BUG! Tx ring full when queue awake!\n"); |
| 2963 | bnx2x_fp_qstats(bp, txdata->parent_fp)->driver_xoff++; | ||
| 2964 | netif_tx_stop_queue(txq); | ||
| 2965 | } | ||
| 2966 | |||
| 2963 | return NETDEV_TX_BUSY; | 2967 | return NETDEV_TX_BUSY; |
| 2964 | } | 2968 | } |
| 2965 | 2969 | ||
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sp.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sp.c index 71971a161bd1..614981c02264 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sp.c +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sp.c | |||
| @@ -126,7 +126,7 @@ static inline int bnx2x_exe_queue_add(struct bnx2x *bp, | |||
| 126 | /* Check if this request is ok */ | 126 | /* Check if this request is ok */ |
| 127 | rc = o->validate(bp, o->owner, elem); | 127 | rc = o->validate(bp, o->owner, elem); |
| 128 | if (rc) { | 128 | if (rc) { |
| 129 | BNX2X_ERR("Preamble failed: %d\n", rc); | 129 | DP(BNX2X_MSG_SP, "Preamble failed: %d\n", rc); |
| 130 | goto free_and_exit; | 130 | goto free_and_exit; |
| 131 | } | 131 | } |
| 132 | } | 132 | } |
diff --git a/drivers/net/ethernet/chelsio/cxgb4/cxgb4.h b/drivers/net/ethernet/chelsio/cxgb4/cxgb4.h index a4da893ac1e1..378988b5709a 100644 --- a/drivers/net/ethernet/chelsio/cxgb4/cxgb4.h +++ b/drivers/net/ethernet/chelsio/cxgb4/cxgb4.h | |||
| @@ -251,6 +251,8 @@ struct adapter_params { | |||
| 251 | unsigned char rev; /* chip revision */ | 251 | unsigned char rev; /* chip revision */ |
| 252 | unsigned char offload; | 252 | unsigned char offload; |
| 253 | 253 | ||
| 254 | unsigned char bypass; | ||
| 255 | |||
| 254 | unsigned int ofldq_wr_cred; | 256 | unsigned int ofldq_wr_cred; |
| 255 | }; | 257 | }; |
| 256 | 258 | ||
| @@ -642,6 +644,23 @@ extern int dbfifo_int_thresh; | |||
| 642 | #define for_each_port(adapter, iter) \ | 644 | #define for_each_port(adapter, iter) \ |
| 643 | for (iter = 0; iter < (adapter)->params.nports; ++iter) | 645 | for (iter = 0; iter < (adapter)->params.nports; ++iter) |
| 644 | 646 | ||
| 647 | static inline int is_bypass(struct adapter *adap) | ||
| 648 | { | ||
| 649 | return adap->params.bypass; | ||
| 650 | } | ||
| 651 | |||
| 652 | static inline int is_bypass_device(int device) | ||
| 653 | { | ||
| 654 | /* this should be set based upon device capabilities */ | ||
| 655 | switch (device) { | ||
| 656 | case 0x440b: | ||
| 657 | case 0x440c: | ||
| 658 | return 1; | ||
| 659 | default: | ||
| 660 | return 0; | ||
| 661 | } | ||
| 662 | } | ||
| 663 | |||
| 645 | static inline unsigned int core_ticks_per_usec(const struct adapter *adap) | 664 | static inline unsigned int core_ticks_per_usec(const struct adapter *adap) |
| 646 | { | 665 | { |
| 647 | return adap->params.vpd.cclk / 1000; | 666 | return adap->params.vpd.cclk / 1000; |
diff --git a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c index 604f4f87f550..c1cde11b0c6d 100644 --- a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c +++ b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c | |||
| @@ -3513,18 +3513,6 @@ static int adap_init0_no_config(struct adapter *adapter, int reset) | |||
| 3513 | if (ret < 0) | 3513 | if (ret < 0) |
| 3514 | goto bye; | 3514 | goto bye; |
| 3515 | 3515 | ||
| 3516 | #ifndef CONFIG_CHELSIO_T4_OFFLOAD | ||
| 3517 | /* | ||
| 3518 | * If we're a pure NIC driver then disable all offloading facilities. | ||
| 3519 | * This will allow the firmware to optimize aspects of the hardware | ||
| 3520 | * configuration which will result in improved performance. | ||
| 3521 | */ | ||
| 3522 | caps_cmd.ofldcaps = 0; | ||
| 3523 | caps_cmd.iscsicaps = 0; | ||
| 3524 | caps_cmd.rdmacaps = 0; | ||
| 3525 | caps_cmd.fcoecaps = 0; | ||
| 3526 | #endif | ||
| 3527 | |||
| 3528 | if (caps_cmd.niccaps & htons(FW_CAPS_CONFIG_NIC_VM)) { | 3516 | if (caps_cmd.niccaps & htons(FW_CAPS_CONFIG_NIC_VM)) { |
| 3529 | if (!vf_acls) | 3517 | if (!vf_acls) |
| 3530 | caps_cmd.niccaps ^= htons(FW_CAPS_CONFIG_NIC_VM); | 3518 | caps_cmd.niccaps ^= htons(FW_CAPS_CONFIG_NIC_VM); |
| @@ -3745,6 +3733,7 @@ static int adap_init0(struct adapter *adap) | |||
| 3745 | u32 v, port_vec; | 3733 | u32 v, port_vec; |
| 3746 | enum dev_state state; | 3734 | enum dev_state state; |
| 3747 | u32 params[7], val[7]; | 3735 | u32 params[7], val[7]; |
| 3736 | struct fw_caps_config_cmd caps_cmd; | ||
| 3748 | int reset = 1, j; | 3737 | int reset = 1, j; |
| 3749 | 3738 | ||
| 3750 | /* | 3739 | /* |
| @@ -3898,6 +3887,9 @@ static int adap_init0(struct adapter *adap) | |||
| 3898 | goto bye; | 3887 | goto bye; |
| 3899 | } | 3888 | } |
| 3900 | 3889 | ||
| 3890 | if (is_bypass_device(adap->pdev->device)) | ||
| 3891 | adap->params.bypass = 1; | ||
| 3892 | |||
| 3901 | /* | 3893 | /* |
| 3902 | * Grab some of our basic fundamental operating parameters. | 3894 | * Grab some of our basic fundamental operating parameters. |
| 3903 | */ | 3895 | */ |
| @@ -3940,13 +3932,12 @@ static int adap_init0(struct adapter *adap) | |||
| 3940 | adap->tids.aftid_end = val[1]; | 3932 | adap->tids.aftid_end = val[1]; |
| 3941 | } | 3933 | } |
| 3942 | 3934 | ||
| 3943 | #ifdef CONFIG_CHELSIO_T4_OFFLOAD | ||
| 3944 | /* | 3935 | /* |
| 3945 | * Get device capabilities so we can determine what resources we need | 3936 | * Get device capabilities so we can determine what resources we need |
| 3946 | * to manage. | 3937 | * to manage. |
| 3947 | */ | 3938 | */ |
| 3948 | memset(&caps_cmd, 0, sizeof(caps_cmd)); | 3939 | memset(&caps_cmd, 0, sizeof(caps_cmd)); |
| 3949 | caps_cmd.op_to_write = htonl(V_FW_CMD_OP(FW_CAPS_CONFIG_CMD) | | 3940 | caps_cmd.op_to_write = htonl(FW_CMD_OP(FW_CAPS_CONFIG_CMD) | |
| 3950 | FW_CMD_REQUEST | FW_CMD_READ); | 3941 | FW_CMD_REQUEST | FW_CMD_READ); |
| 3951 | caps_cmd.retval_len16 = htonl(FW_LEN16(caps_cmd)); | 3942 | caps_cmd.retval_len16 = htonl(FW_LEN16(caps_cmd)); |
| 3952 | ret = t4_wr_mbox(adap, adap->mbox, &caps_cmd, sizeof(caps_cmd), | 3943 | ret = t4_wr_mbox(adap, adap->mbox, &caps_cmd, sizeof(caps_cmd), |
| @@ -3991,15 +3982,6 @@ static int adap_init0(struct adapter *adap) | |||
| 3991 | adap->vres.ddp.size = val[4] - val[3] + 1; | 3982 | adap->vres.ddp.size = val[4] - val[3] + 1; |
| 3992 | adap->params.ofldq_wr_cred = val[5]; | 3983 | adap->params.ofldq_wr_cred = val[5]; |
| 3993 | 3984 | ||
| 3994 | params[0] = FW_PARAM_PFVF(ETHOFLD_START); | ||
| 3995 | params[1] = FW_PARAM_PFVF(ETHOFLD_END); | ||
| 3996 | ret = t4_query_params(adap, adap->mbox, adap->fn, 0, 2, | ||
| 3997 | params, val); | ||
| 3998 | if ((val[0] != val[1]) && (ret >= 0)) { | ||
| 3999 | adap->tids.uotid_base = val[0]; | ||
| 4000 | adap->tids.nuotids = val[1] - val[0] + 1; | ||
| 4001 | } | ||
| 4002 | |||
| 4003 | adap->params.offload = 1; | 3985 | adap->params.offload = 1; |
| 4004 | } | 3986 | } |
| 4005 | if (caps_cmd.rdmacaps) { | 3987 | if (caps_cmd.rdmacaps) { |
| @@ -4048,7 +4030,6 @@ static int adap_init0(struct adapter *adap) | |||
| 4048 | } | 4030 | } |
| 4049 | #undef FW_PARAM_PFVF | 4031 | #undef FW_PARAM_PFVF |
| 4050 | #undef FW_PARAM_DEV | 4032 | #undef FW_PARAM_DEV |
| 4051 | #endif /* CONFIG_CHELSIO_T4_OFFLOAD */ | ||
| 4052 | 4033 | ||
| 4053 | /* | 4034 | /* |
| 4054 | * These are finalized by FW initialization, load their values now. | 4035 | * These are finalized by FW initialization, load their values now. |
diff --git a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_uld.h b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_uld.h index 1b899fea1a91..39bec73ff87c 100644 --- a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_uld.h +++ b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_uld.h | |||
| @@ -102,6 +102,9 @@ struct tid_info { | |||
| 102 | unsigned int ftid_base; | 102 | unsigned int ftid_base; |
| 103 | unsigned int aftid_base; | 103 | unsigned int aftid_base; |
| 104 | unsigned int aftid_end; | 104 | unsigned int aftid_end; |
| 105 | /* Server filter region */ | ||
| 106 | unsigned int sftid_base; | ||
| 107 | unsigned int nsftids; | ||
| 105 | 108 | ||
| 106 | spinlock_t atid_lock ____cacheline_aligned_in_smp; | 109 | spinlock_t atid_lock ____cacheline_aligned_in_smp; |
| 107 | union aopen_entry *afree; | 110 | union aopen_entry *afree; |
diff --git a/drivers/net/ethernet/freescale/gianfar_ptp.c b/drivers/net/ethernet/freescale/gianfar_ptp.c index b9db0e040563..2e5daee0438a 100644 --- a/drivers/net/ethernet/freescale/gianfar_ptp.c +++ b/drivers/net/ethernet/freescale/gianfar_ptp.c | |||
| @@ -478,7 +478,7 @@ static int gianfar_ptp_probe(struct platform_device *dev) | |||
| 478 | pr_err("no resource\n"); | 478 | pr_err("no resource\n"); |
| 479 | goto no_resource; | 479 | goto no_resource; |
| 480 | } | 480 | } |
| 481 | if (request_resource(&ioport_resource, etsects->rsrc)) { | 481 | if (request_resource(&iomem_resource, etsects->rsrc)) { |
| 482 | pr_err("resource busy\n"); | 482 | pr_err("resource busy\n"); |
| 483 | goto no_resource; | 483 | goto no_resource; |
| 484 | } | 484 | } |
diff --git a/drivers/net/ethernet/mellanox/mlx4/en_tx.c b/drivers/net/ethernet/mellanox/mlx4/en_tx.c index c10e3a6de09f..b35094c590ba 100644 --- a/drivers/net/ethernet/mellanox/mlx4/en_tx.c +++ b/drivers/net/ethernet/mellanox/mlx4/en_tx.c | |||
| @@ -143,7 +143,6 @@ void mlx4_en_destroy_tx_ring(struct mlx4_en_priv *priv, | |||
| 143 | mlx4_bf_free(mdev->dev, &ring->bf); | 143 | mlx4_bf_free(mdev->dev, &ring->bf); |
| 144 | mlx4_qp_remove(mdev->dev, &ring->qp); | 144 | mlx4_qp_remove(mdev->dev, &ring->qp); |
| 145 | mlx4_qp_free(mdev->dev, &ring->qp); | 145 | mlx4_qp_free(mdev->dev, &ring->qp); |
| 146 | mlx4_qp_release_range(mdev->dev, ring->qpn, 1); | ||
| 147 | mlx4_en_unmap_buffer(&ring->wqres.buf); | 146 | mlx4_en_unmap_buffer(&ring->wqres.buf); |
| 148 | mlx4_free_hwq_res(mdev->dev, &ring->wqres, ring->buf_size); | 147 | mlx4_free_hwq_res(mdev->dev, &ring->wqres, ring->buf_size); |
| 149 | kfree(ring->bounce_buf); | 148 | kfree(ring->bounce_buf); |
| @@ -712,7 +711,7 @@ netdev_tx_t mlx4_en_xmit(struct sk_buff *skb, struct net_device *dev) | |||
| 712 | if (bounce) | 711 | if (bounce) |
| 713 | tx_desc = mlx4_en_bounce_to_desc(priv, ring, index, desc_size); | 712 | tx_desc = mlx4_en_bounce_to_desc(priv, ring, index, desc_size); |
| 714 | 713 | ||
| 715 | if (ring->bf_enabled && desc_size <= MAX_BF && !bounce && !vlan_tag) { | 714 | if (ring->bf_enabled && desc_size <= MAX_BF && !bounce && !vlan_tx_tag_present(skb)) { |
| 716 | *(__be32 *) (&tx_desc->ctrl.vlan_tag) |= cpu_to_be32(ring->doorbell_qpn); | 715 | *(__be32 *) (&tx_desc->ctrl.vlan_tag) |= cpu_to_be32(ring->doorbell_qpn); |
| 717 | op_own |= htonl((bf_index & 0xffff) << 8); | 716 | op_own |= htonl((bf_index & 0xffff) << 8); |
| 718 | /* Ensure new descirptor hits memory | 717 | /* Ensure new descirptor hits memory |
diff --git a/drivers/net/ethernet/mellanox/mlx4/eq.c b/drivers/net/ethernet/mellanox/mlx4/eq.c index 51c764901ad2..b84a88bc44dc 100644 --- a/drivers/net/ethernet/mellanox/mlx4/eq.c +++ b/drivers/net/ethernet/mellanox/mlx4/eq.c | |||
| @@ -329,9 +329,6 @@ int set_and_calc_slave_port_state(struct mlx4_dev *dev, int slave, | |||
| 329 | ctx = &priv->mfunc.master.slave_state[slave]; | 329 | ctx = &priv->mfunc.master.slave_state[slave]; |
| 330 | spin_lock_irqsave(&ctx->lock, flags); | 330 | spin_lock_irqsave(&ctx->lock, flags); |
| 331 | 331 | ||
| 332 | mlx4_dbg(dev, "%s: slave: %d, current state: %d new event :%d\n", | ||
| 333 | __func__, slave, cur_state, event); | ||
| 334 | |||
| 335 | switch (cur_state) { | 332 | switch (cur_state) { |
| 336 | case SLAVE_PORT_DOWN: | 333 | case SLAVE_PORT_DOWN: |
| 337 | if (MLX4_PORT_STATE_DEV_EVENT_PORT_UP == event) | 334 | if (MLX4_PORT_STATE_DEV_EVENT_PORT_UP == event) |
| @@ -366,9 +363,6 @@ int set_and_calc_slave_port_state(struct mlx4_dev *dev, int slave, | |||
| 366 | goto out; | 363 | goto out; |
| 367 | } | 364 | } |
| 368 | ret = mlx4_get_slave_port_state(dev, slave, port); | 365 | ret = mlx4_get_slave_port_state(dev, slave, port); |
| 369 | mlx4_dbg(dev, "%s: slave: %d, current state: %d new event" | ||
| 370 | " :%d gen_event: %d\n", | ||
| 371 | __func__, slave, cur_state, event, *gen_event); | ||
| 372 | 366 | ||
| 373 | out: | 367 | out: |
| 374 | spin_unlock_irqrestore(&ctx->lock, flags); | 368 | spin_unlock_irqrestore(&ctx->lock, flags); |
| @@ -843,6 +837,18 @@ static void __iomem *mlx4_get_eq_uar(struct mlx4_dev *dev, struct mlx4_eq *eq) | |||
| 843 | return priv->eq_table.uar_map[index] + 0x800 + 8 * (eq->eqn % 4); | 837 | return priv->eq_table.uar_map[index] + 0x800 + 8 * (eq->eqn % 4); |
| 844 | } | 838 | } |
| 845 | 839 | ||
| 840 | static void mlx4_unmap_uar(struct mlx4_dev *dev) | ||
| 841 | { | ||
| 842 | struct mlx4_priv *priv = mlx4_priv(dev); | ||
| 843 | int i; | ||
| 844 | |||
| 845 | for (i = 0; i < mlx4_num_eq_uar(dev); ++i) | ||
| 846 | if (priv->eq_table.uar_map[i]) { | ||
| 847 | iounmap(priv->eq_table.uar_map[i]); | ||
| 848 | priv->eq_table.uar_map[i] = NULL; | ||
| 849 | } | ||
| 850 | } | ||
| 851 | |||
| 846 | static int mlx4_create_eq(struct mlx4_dev *dev, int nent, | 852 | static int mlx4_create_eq(struct mlx4_dev *dev, int nent, |
| 847 | u8 intr, struct mlx4_eq *eq) | 853 | u8 intr, struct mlx4_eq *eq) |
| 848 | { | 854 | { |
| @@ -1207,6 +1213,7 @@ err_out_unmap: | |||
| 1207 | mlx4_free_irqs(dev); | 1213 | mlx4_free_irqs(dev); |
| 1208 | 1214 | ||
| 1209 | err_out_bitmap: | 1215 | err_out_bitmap: |
| 1216 | mlx4_unmap_uar(dev); | ||
| 1210 | mlx4_bitmap_cleanup(&priv->eq_table.bitmap); | 1217 | mlx4_bitmap_cleanup(&priv->eq_table.bitmap); |
| 1211 | 1218 | ||
| 1212 | err_out_free: | 1219 | err_out_free: |
| @@ -1231,10 +1238,7 @@ void mlx4_cleanup_eq_table(struct mlx4_dev *dev) | |||
| 1231 | if (!mlx4_is_slave(dev)) | 1238 | if (!mlx4_is_slave(dev)) |
| 1232 | mlx4_unmap_clr_int(dev); | 1239 | mlx4_unmap_clr_int(dev); |
| 1233 | 1240 | ||
| 1234 | for (i = 0; i < mlx4_num_eq_uar(dev); ++i) | 1241 | mlx4_unmap_uar(dev); |
| 1235 | if (priv->eq_table.uar_map[i]) | ||
| 1236 | iounmap(priv->eq_table.uar_map[i]); | ||
| 1237 | |||
| 1238 | mlx4_bitmap_cleanup(&priv->eq_table.bitmap); | 1242 | mlx4_bitmap_cleanup(&priv->eq_table.bitmap); |
| 1239 | 1243 | ||
| 1240 | kfree(priv->eq_table.uar_map); | 1244 | kfree(priv->eq_table.uar_map); |
diff --git a/drivers/net/ethernet/mellanox/mlx4/main.c b/drivers/net/ethernet/mellanox/mlx4/main.c index 80df2ab0177c..2aa80afd98d2 100644 --- a/drivers/net/ethernet/mellanox/mlx4/main.c +++ b/drivers/net/ethernet/mellanox/mlx4/main.c | |||
| @@ -1405,7 +1405,10 @@ unmap_bf: | |||
| 1405 | unmap_bf_area(dev); | 1405 | unmap_bf_area(dev); |
| 1406 | 1406 | ||
| 1407 | err_close: | 1407 | err_close: |
| 1408 | mlx4_close_hca(dev); | 1408 | if (mlx4_is_slave(dev)) |
| 1409 | mlx4_slave_exit(dev); | ||
| 1410 | else | ||
| 1411 | mlx4_CLOSE_HCA(dev, 0); | ||
| 1409 | 1412 | ||
| 1410 | err_free_icm: | 1413 | err_free_icm: |
| 1411 | if (!mlx4_is_slave(dev)) | 1414 | if (!mlx4_is_slave(dev)) |
diff --git a/drivers/net/ethernet/mellanox/mlx4/resource_tracker.c b/drivers/net/ethernet/mellanox/mlx4/resource_tracker.c index 926c911c0ac4..b05705f50f0f 100644 --- a/drivers/net/ethernet/mellanox/mlx4/resource_tracker.c +++ b/drivers/net/ethernet/mellanox/mlx4/resource_tracker.c | |||
| @@ -330,9 +330,6 @@ static void update_pkey_index(struct mlx4_dev *dev, int slave, | |||
| 330 | 330 | ||
| 331 | new_index = priv->virt2phys_pkey[slave][port - 1][orig_index]; | 331 | new_index = priv->virt2phys_pkey[slave][port - 1][orig_index]; |
| 332 | *(u8 *)(inbox->buf + 35) = new_index; | 332 | *(u8 *)(inbox->buf + 35) = new_index; |
| 333 | |||
| 334 | mlx4_dbg(dev, "port = %d, orig pkey index = %d, " | ||
| 335 | "new pkey index = %d\n", port, orig_index, new_index); | ||
| 336 | } | 333 | } |
| 337 | 334 | ||
| 338 | static void update_gid(struct mlx4_dev *dev, struct mlx4_cmd_mailbox *inbox, | 335 | static void update_gid(struct mlx4_dev *dev, struct mlx4_cmd_mailbox *inbox, |
| @@ -351,9 +348,6 @@ static void update_gid(struct mlx4_dev *dev, struct mlx4_cmd_mailbox *inbox, | |||
| 351 | if (optpar & MLX4_QP_OPTPAR_ALT_ADDR_PATH) | 348 | if (optpar & MLX4_QP_OPTPAR_ALT_ADDR_PATH) |
| 352 | qp_ctx->alt_path.mgid_index = slave & 0x7F; | 349 | qp_ctx->alt_path.mgid_index = slave & 0x7F; |
| 353 | } | 350 | } |
| 354 | |||
| 355 | mlx4_dbg(dev, "slave %d, new gid index: 0x%x ", | ||
| 356 | slave, qp_ctx->pri_path.mgid_index); | ||
| 357 | } | 351 | } |
| 358 | 352 | ||
| 359 | static int mpt_mask(struct mlx4_dev *dev) | 353 | static int mpt_mask(struct mlx4_dev *dev) |
diff --git a/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_main.c b/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_main.c index b2a94d02a521..4c4fe5b1a29a 100644 --- a/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_main.c +++ b/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_main.c | |||
| @@ -339,26 +339,6 @@ static void pch_gbe_wait_clr_bit(void *reg, u32 bit) | |||
| 339 | } | 339 | } |
| 340 | 340 | ||
| 341 | /** | 341 | /** |
| 342 | * pch_gbe_wait_clr_bit_irq - Wait to clear a bit for interrupt context | ||
| 343 | * @reg: Pointer of register | ||
| 344 | * @busy: Busy bit | ||
| 345 | */ | ||
| 346 | static int pch_gbe_wait_clr_bit_irq(void *reg, u32 bit) | ||
| 347 | { | ||
| 348 | u32 tmp; | ||
| 349 | int ret = -1; | ||
| 350 | /* wait busy */ | ||
| 351 | tmp = 20; | ||
| 352 | while ((ioread32(reg) & bit) && --tmp) | ||
| 353 | udelay(5); | ||
| 354 | if (!tmp) | ||
| 355 | pr_err("Error: busy bit is not cleared\n"); | ||
| 356 | else | ||
| 357 | ret = 0; | ||
| 358 | return ret; | ||
| 359 | } | ||
| 360 | |||
| 361 | /** | ||
| 362 | * pch_gbe_mac_mar_set - Set MAC address register | 342 | * pch_gbe_mac_mar_set - Set MAC address register |
| 363 | * @hw: Pointer to the HW structure | 343 | * @hw: Pointer to the HW structure |
| 364 | * @addr: Pointer to the MAC address | 344 | * @addr: Pointer to the MAC address |
| @@ -409,15 +389,20 @@ static void pch_gbe_mac_reset_hw(struct pch_gbe_hw *hw) | |||
| 409 | return; | 389 | return; |
| 410 | } | 390 | } |
| 411 | 391 | ||
| 412 | static void pch_gbe_mac_reset_rx(struct pch_gbe_hw *hw) | 392 | static void pch_gbe_disable_mac_rx(struct pch_gbe_hw *hw) |
| 413 | { | 393 | { |
| 414 | /* Read the MAC addresses. and store to the private data */ | 394 | u32 rctl; |
| 415 | pch_gbe_mac_read_mac_addr(hw); | 395 | /* Disables Receive MAC */ |
| 416 | iowrite32(PCH_GBE_RX_RST, &hw->reg->RESET); | 396 | rctl = ioread32(&hw->reg->MAC_RX_EN); |
| 417 | pch_gbe_wait_clr_bit_irq(&hw->reg->RESET, PCH_GBE_RX_RST); | 397 | iowrite32((rctl & ~PCH_GBE_MRE_MAC_RX_EN), &hw->reg->MAC_RX_EN); |
| 418 | /* Setup the MAC addresses */ | 398 | } |
| 419 | pch_gbe_mac_mar_set(hw, hw->mac.addr, 0); | 399 | |
| 420 | return; | 400 | static void pch_gbe_enable_mac_rx(struct pch_gbe_hw *hw) |
| 401 | { | ||
| 402 | u32 rctl; | ||
| 403 | /* Enables Receive MAC */ | ||
| 404 | rctl = ioread32(&hw->reg->MAC_RX_EN); | ||
| 405 | iowrite32((rctl | PCH_GBE_MRE_MAC_RX_EN), &hw->reg->MAC_RX_EN); | ||
| 421 | } | 406 | } |
| 422 | 407 | ||
| 423 | /** | 408 | /** |
| @@ -913,7 +898,7 @@ static void pch_gbe_setup_rctl(struct pch_gbe_adapter *adapter) | |||
| 913 | static void pch_gbe_configure_rx(struct pch_gbe_adapter *adapter) | 898 | static void pch_gbe_configure_rx(struct pch_gbe_adapter *adapter) |
| 914 | { | 899 | { |
| 915 | struct pch_gbe_hw *hw = &adapter->hw; | 900 | struct pch_gbe_hw *hw = &adapter->hw; |
| 916 | u32 rdba, rdlen, rctl, rxdma; | 901 | u32 rdba, rdlen, rxdma; |
| 917 | 902 | ||
| 918 | pr_debug("dma adr = 0x%08llx size = 0x%08x\n", | 903 | pr_debug("dma adr = 0x%08llx size = 0x%08x\n", |
| 919 | (unsigned long long)adapter->rx_ring->dma, | 904 | (unsigned long long)adapter->rx_ring->dma, |
| @@ -921,9 +906,7 @@ static void pch_gbe_configure_rx(struct pch_gbe_adapter *adapter) | |||
| 921 | 906 | ||
| 922 | pch_gbe_mac_force_mac_fc(hw); | 907 | pch_gbe_mac_force_mac_fc(hw); |
| 923 | 908 | ||
| 924 | /* Disables Receive MAC */ | 909 | pch_gbe_disable_mac_rx(hw); |
| 925 | rctl = ioread32(&hw->reg->MAC_RX_EN); | ||
| 926 | iowrite32((rctl & ~PCH_GBE_MRE_MAC_RX_EN), &hw->reg->MAC_RX_EN); | ||
| 927 | 910 | ||
| 928 | /* Disables Receive DMA */ | 911 | /* Disables Receive DMA */ |
| 929 | rxdma = ioread32(&hw->reg->DMA_CTRL); | 912 | rxdma = ioread32(&hw->reg->DMA_CTRL); |
| @@ -1316,38 +1299,17 @@ void pch_gbe_update_stats(struct pch_gbe_adapter *adapter) | |||
| 1316 | spin_unlock_irqrestore(&adapter->stats_lock, flags); | 1299 | spin_unlock_irqrestore(&adapter->stats_lock, flags); |
| 1317 | } | 1300 | } |
| 1318 | 1301 | ||
| 1319 | static void pch_gbe_stop_receive(struct pch_gbe_adapter *adapter) | 1302 | static void pch_gbe_disable_dma_rx(struct pch_gbe_hw *hw) |
| 1320 | { | 1303 | { |
| 1321 | struct pch_gbe_hw *hw = &adapter->hw; | ||
| 1322 | u32 rxdma; | 1304 | u32 rxdma; |
| 1323 | u16 value; | ||
| 1324 | int ret; | ||
| 1325 | 1305 | ||
| 1326 | /* Disable Receive DMA */ | 1306 | /* Disable Receive DMA */ |
| 1327 | rxdma = ioread32(&hw->reg->DMA_CTRL); | 1307 | rxdma = ioread32(&hw->reg->DMA_CTRL); |
| 1328 | rxdma &= ~PCH_GBE_RX_DMA_EN; | 1308 | rxdma &= ~PCH_GBE_RX_DMA_EN; |
| 1329 | iowrite32(rxdma, &hw->reg->DMA_CTRL); | 1309 | iowrite32(rxdma, &hw->reg->DMA_CTRL); |
| 1330 | /* Wait Rx DMA BUS is IDLE */ | ||
| 1331 | ret = pch_gbe_wait_clr_bit_irq(&hw->reg->RX_DMA_ST, PCH_GBE_IDLE_CHECK); | ||
| 1332 | if (ret) { | ||
| 1333 | /* Disable Bus master */ | ||
| 1334 | pci_read_config_word(adapter->pdev, PCI_COMMAND, &value); | ||
| 1335 | value &= ~PCI_COMMAND_MASTER; | ||
| 1336 | pci_write_config_word(adapter->pdev, PCI_COMMAND, value); | ||
| 1337 | /* Stop Receive */ | ||
| 1338 | pch_gbe_mac_reset_rx(hw); | ||
| 1339 | /* Enable Bus master */ | ||
| 1340 | value |= PCI_COMMAND_MASTER; | ||
| 1341 | pci_write_config_word(adapter->pdev, PCI_COMMAND, value); | ||
| 1342 | } else { | ||
| 1343 | /* Stop Receive */ | ||
| 1344 | pch_gbe_mac_reset_rx(hw); | ||
| 1345 | } | ||
| 1346 | /* reprogram multicast address register after reset */ | ||
| 1347 | pch_gbe_set_multi(adapter->netdev); | ||
| 1348 | } | 1310 | } |
| 1349 | 1311 | ||
| 1350 | static void pch_gbe_start_receive(struct pch_gbe_hw *hw) | 1312 | static void pch_gbe_enable_dma_rx(struct pch_gbe_hw *hw) |
| 1351 | { | 1313 | { |
| 1352 | u32 rxdma; | 1314 | u32 rxdma; |
| 1353 | 1315 | ||
| @@ -1355,9 +1317,6 @@ static void pch_gbe_start_receive(struct pch_gbe_hw *hw) | |||
| 1355 | rxdma = ioread32(&hw->reg->DMA_CTRL); | 1317 | rxdma = ioread32(&hw->reg->DMA_CTRL); |
| 1356 | rxdma |= PCH_GBE_RX_DMA_EN; | 1318 | rxdma |= PCH_GBE_RX_DMA_EN; |
| 1357 | iowrite32(rxdma, &hw->reg->DMA_CTRL); | 1319 | iowrite32(rxdma, &hw->reg->DMA_CTRL); |
| 1358 | /* Enables Receive */ | ||
| 1359 | iowrite32(PCH_GBE_MRE_MAC_RX_EN, &hw->reg->MAC_RX_EN); | ||
| 1360 | return; | ||
| 1361 | } | 1320 | } |
| 1362 | 1321 | ||
| 1363 | /** | 1322 | /** |
| @@ -1393,7 +1352,7 @@ static irqreturn_t pch_gbe_intr(int irq, void *data) | |||
| 1393 | int_en = ioread32(&hw->reg->INT_EN); | 1352 | int_en = ioread32(&hw->reg->INT_EN); |
| 1394 | iowrite32((int_en & ~PCH_GBE_INT_RX_FIFO_ERR), | 1353 | iowrite32((int_en & ~PCH_GBE_INT_RX_FIFO_ERR), |
| 1395 | &hw->reg->INT_EN); | 1354 | &hw->reg->INT_EN); |
| 1396 | pch_gbe_stop_receive(adapter); | 1355 | pch_gbe_disable_dma_rx(&adapter->hw); |
| 1397 | int_st |= ioread32(&hw->reg->INT_ST); | 1356 | int_st |= ioread32(&hw->reg->INT_ST); |
| 1398 | int_st = int_st & ioread32(&hw->reg->INT_EN); | 1357 | int_st = int_st & ioread32(&hw->reg->INT_EN); |
| 1399 | } | 1358 | } |
| @@ -1971,12 +1930,12 @@ int pch_gbe_up(struct pch_gbe_adapter *adapter) | |||
| 1971 | struct net_device *netdev = adapter->netdev; | 1930 | struct net_device *netdev = adapter->netdev; |
| 1972 | struct pch_gbe_tx_ring *tx_ring = adapter->tx_ring; | 1931 | struct pch_gbe_tx_ring *tx_ring = adapter->tx_ring; |
| 1973 | struct pch_gbe_rx_ring *rx_ring = adapter->rx_ring; | 1932 | struct pch_gbe_rx_ring *rx_ring = adapter->rx_ring; |
| 1974 | int err; | 1933 | int err = -EINVAL; |
| 1975 | 1934 | ||
| 1976 | /* Ensure we have a valid MAC */ | 1935 | /* Ensure we have a valid MAC */ |
| 1977 | if (!is_valid_ether_addr(adapter->hw.mac.addr)) { | 1936 | if (!is_valid_ether_addr(adapter->hw.mac.addr)) { |
| 1978 | pr_err("Error: Invalid MAC address\n"); | 1937 | pr_err("Error: Invalid MAC address\n"); |
| 1979 | return -EINVAL; | 1938 | goto out; |
| 1980 | } | 1939 | } |
| 1981 | 1940 | ||
| 1982 | /* hardware has been reset, we need to reload some things */ | 1941 | /* hardware has been reset, we need to reload some things */ |
| @@ -1989,18 +1948,19 @@ int pch_gbe_up(struct pch_gbe_adapter *adapter) | |||
| 1989 | 1948 | ||
| 1990 | err = pch_gbe_request_irq(adapter); | 1949 | err = pch_gbe_request_irq(adapter); |
| 1991 | if (err) { | 1950 | if (err) { |
| 1992 | pr_err("Error: can't bring device up\n"); | 1951 | pr_err("Error: can't bring device up - irq request failed\n"); |
| 1993 | return err; | 1952 | goto out; |
| 1994 | } | 1953 | } |
| 1995 | err = pch_gbe_alloc_rx_buffers_pool(adapter, rx_ring, rx_ring->count); | 1954 | err = pch_gbe_alloc_rx_buffers_pool(adapter, rx_ring, rx_ring->count); |
| 1996 | if (err) { | 1955 | if (err) { |
| 1997 | pr_err("Error: can't bring device up\n"); | 1956 | pr_err("Error: can't bring device up - alloc rx buffers pool failed\n"); |
| 1998 | return err; | 1957 | goto freeirq; |
| 1999 | } | 1958 | } |
| 2000 | pch_gbe_alloc_tx_buffers(adapter, tx_ring); | 1959 | pch_gbe_alloc_tx_buffers(adapter, tx_ring); |
| 2001 | pch_gbe_alloc_rx_buffers(adapter, rx_ring, rx_ring->count); | 1960 | pch_gbe_alloc_rx_buffers(adapter, rx_ring, rx_ring->count); |
| 2002 | adapter->tx_queue_len = netdev->tx_queue_len; | 1961 | adapter->tx_queue_len = netdev->tx_queue_len; |
| 2003 | pch_gbe_start_receive(&adapter->hw); | 1962 | pch_gbe_enable_dma_rx(&adapter->hw); |
| 1963 | pch_gbe_enable_mac_rx(&adapter->hw); | ||
| 2004 | 1964 | ||
| 2005 | mod_timer(&adapter->watchdog_timer, jiffies); | 1965 | mod_timer(&adapter->watchdog_timer, jiffies); |
| 2006 | 1966 | ||
| @@ -2009,6 +1969,11 @@ int pch_gbe_up(struct pch_gbe_adapter *adapter) | |||
| 2009 | netif_start_queue(adapter->netdev); | 1969 | netif_start_queue(adapter->netdev); |
| 2010 | 1970 | ||
| 2011 | return 0; | 1971 | return 0; |
| 1972 | |||
| 1973 | freeirq: | ||
| 1974 | pch_gbe_free_irq(adapter); | ||
| 1975 | out: | ||
| 1976 | return err; | ||
| 2012 | } | 1977 | } |
| 2013 | 1978 | ||
| 2014 | /** | 1979 | /** |
| @@ -2405,7 +2370,6 @@ static int pch_gbe_napi_poll(struct napi_struct *napi, int budget) | |||
| 2405 | int work_done = 0; | 2370 | int work_done = 0; |
| 2406 | bool poll_end_flag = false; | 2371 | bool poll_end_flag = false; |
| 2407 | bool cleaned = false; | 2372 | bool cleaned = false; |
| 2408 | u32 int_en; | ||
| 2409 | 2373 | ||
| 2410 | pr_debug("budget : %d\n", budget); | 2374 | pr_debug("budget : %d\n", budget); |
| 2411 | 2375 | ||
| @@ -2422,19 +2386,13 @@ static int pch_gbe_napi_poll(struct napi_struct *napi, int budget) | |||
| 2422 | 2386 | ||
| 2423 | if (poll_end_flag) { | 2387 | if (poll_end_flag) { |
| 2424 | napi_complete(napi); | 2388 | napi_complete(napi); |
| 2425 | if (adapter->rx_stop_flag) { | ||
| 2426 | adapter->rx_stop_flag = false; | ||
| 2427 | pch_gbe_start_receive(&adapter->hw); | ||
| 2428 | } | ||
| 2429 | pch_gbe_irq_enable(adapter); | 2389 | pch_gbe_irq_enable(adapter); |
| 2430 | } else | 2390 | } |
| 2431 | if (adapter->rx_stop_flag) { | 2391 | |
| 2432 | adapter->rx_stop_flag = false; | 2392 | if (adapter->rx_stop_flag) { |
| 2433 | pch_gbe_start_receive(&adapter->hw); | 2393 | adapter->rx_stop_flag = false; |
| 2434 | int_en = ioread32(&adapter->hw.reg->INT_EN); | 2394 | pch_gbe_enable_dma_rx(&adapter->hw); |
| 2435 | iowrite32((int_en | PCH_GBE_INT_RX_FIFO_ERR), | 2395 | } |
| 2436 | &adapter->hw.reg->INT_EN); | ||
| 2437 | } | ||
| 2438 | 2396 | ||
| 2439 | pr_debug("poll_end_flag : %d work_done : %d budget : %d\n", | 2397 | pr_debug("poll_end_flag : %d work_done : %d budget : %d\n", |
| 2440 | poll_end_flag, work_done, budget); | 2398 | poll_end_flag, work_done, budget); |
diff --git a/drivers/net/ethernet/qlogic/qla3xxx.c b/drivers/net/ethernet/qlogic/qla3xxx.c index df09b1cb742f..6407d0d77e81 100644 --- a/drivers/net/ethernet/qlogic/qla3xxx.c +++ b/drivers/net/ethernet/qlogic/qla3xxx.c | |||
| @@ -2525,6 +2525,13 @@ static int ql_alloc_net_req_rsp_queues(struct ql3_adapter *qdev) | |||
| 2525 | qdev->req_q_size = | 2525 | qdev->req_q_size = |
| 2526 | (u32) (NUM_REQ_Q_ENTRIES * sizeof(struct ob_mac_iocb_req)); | 2526 | (u32) (NUM_REQ_Q_ENTRIES * sizeof(struct ob_mac_iocb_req)); |
| 2527 | 2527 | ||
| 2528 | qdev->rsp_q_size = NUM_RSP_Q_ENTRIES * sizeof(struct net_rsp_iocb); | ||
| 2529 | |||
| 2530 | /* The barrier is required to ensure request and response queue | ||
| 2531 | * addr writes to the registers. | ||
| 2532 | */ | ||
| 2533 | wmb(); | ||
| 2534 | |||
| 2528 | qdev->req_q_virt_addr = | 2535 | qdev->req_q_virt_addr = |
| 2529 | pci_alloc_consistent(qdev->pdev, | 2536 | pci_alloc_consistent(qdev->pdev, |
| 2530 | (size_t) qdev->req_q_size, | 2537 | (size_t) qdev->req_q_size, |
| @@ -2536,8 +2543,6 @@ static int ql_alloc_net_req_rsp_queues(struct ql3_adapter *qdev) | |||
| 2536 | return -ENOMEM; | 2543 | return -ENOMEM; |
| 2537 | } | 2544 | } |
| 2538 | 2545 | ||
| 2539 | qdev->rsp_q_size = NUM_RSP_Q_ENTRIES * sizeof(struct net_rsp_iocb); | ||
| 2540 | |||
| 2541 | qdev->rsp_q_virt_addr = | 2546 | qdev->rsp_q_virt_addr = |
| 2542 | pci_alloc_consistent(qdev->pdev, | 2547 | pci_alloc_consistent(qdev->pdev, |
| 2543 | (size_t) qdev->rsp_q_size, | 2548 | (size_t) qdev->rsp_q_size, |
diff --git a/drivers/net/ethernet/ti/Kconfig b/drivers/net/ethernet/ti/Kconfig index b26cbda5efa9..2c41894d5472 100644 --- a/drivers/net/ethernet/ti/Kconfig +++ b/drivers/net/ethernet/ti/Kconfig | |||
| @@ -5,7 +5,7 @@ | |||
| 5 | config NET_VENDOR_TI | 5 | config NET_VENDOR_TI |
| 6 | bool "Texas Instruments (TI) devices" | 6 | bool "Texas Instruments (TI) devices" |
| 7 | default y | 7 | default y |
| 8 | depends on PCI || EISA || AR7 || (ARM && (ARCH_DAVINCI || ARCH_OMAP3)) | 8 | depends on PCI || EISA || AR7 || (ARM && (ARCH_DAVINCI || ARCH_OMAP3 || SOC_AM33XX)) |
| 9 | ---help--- | 9 | ---help--- |
| 10 | If you have a network (Ethernet) card belonging to this class, say Y | 10 | If you have a network (Ethernet) card belonging to this class, say Y |
| 11 | and read the Ethernet-HOWTO, available from | 11 | and read the Ethernet-HOWTO, available from |
diff --git a/drivers/net/ethernet/tile/tilegx.c b/drivers/net/ethernet/tile/tilegx.c index 4e2a1628484d..4e9810013850 100644 --- a/drivers/net/ethernet/tile/tilegx.c +++ b/drivers/net/ethernet/tile/tilegx.c | |||
| @@ -1334,11 +1334,11 @@ static int tso_count_edescs(struct sk_buff *skb) | |||
| 1334 | { | 1334 | { |
| 1335 | struct skb_shared_info *sh = skb_shinfo(skb); | 1335 | struct skb_shared_info *sh = skb_shinfo(skb); |
| 1336 | unsigned int sh_len = skb_transport_offset(skb) + tcp_hdrlen(skb); | 1336 | unsigned int sh_len = skb_transport_offset(skb) + tcp_hdrlen(skb); |
| 1337 | unsigned int data_len = skb->data_len + skb->hdr_len - sh_len; | 1337 | unsigned int data_len = skb->len - sh_len; |
| 1338 | unsigned int p_len = sh->gso_size; | 1338 | unsigned int p_len = sh->gso_size; |
| 1339 | long f_id = -1; /* id of the current fragment */ | 1339 | long f_id = -1; /* id of the current fragment */ |
| 1340 | long f_size = skb->hdr_len; /* size of the current fragment */ | 1340 | long f_size = skb_headlen(skb) - sh_len; /* current fragment size */ |
| 1341 | long f_used = sh_len; /* bytes used from the current fragment */ | 1341 | long f_used = 0; /* bytes used from the current fragment */ |
| 1342 | long n; /* size of the current piece of payload */ | 1342 | long n; /* size of the current piece of payload */ |
| 1343 | int num_edescs = 0; | 1343 | int num_edescs = 0; |
| 1344 | int segment; | 1344 | int segment; |
| @@ -1353,7 +1353,7 @@ static int tso_count_edescs(struct sk_buff *skb) | |||
| 1353 | /* Advance as needed. */ | 1353 | /* Advance as needed. */ |
| 1354 | while (f_used >= f_size) { | 1354 | while (f_used >= f_size) { |
| 1355 | f_id++; | 1355 | f_id++; |
| 1356 | f_size = sh->frags[f_id].size; | 1356 | f_size = skb_frag_size(&sh->frags[f_id]); |
| 1357 | f_used = 0; | 1357 | f_used = 0; |
| 1358 | } | 1358 | } |
| 1359 | 1359 | ||
| @@ -1384,13 +1384,13 @@ static void tso_headers_prepare(struct sk_buff *skb, unsigned char *headers, | |||
| 1384 | struct iphdr *ih; | 1384 | struct iphdr *ih; |
| 1385 | struct tcphdr *th; | 1385 | struct tcphdr *th; |
| 1386 | unsigned int sh_len = skb_transport_offset(skb) + tcp_hdrlen(skb); | 1386 | unsigned int sh_len = skb_transport_offset(skb) + tcp_hdrlen(skb); |
| 1387 | unsigned int data_len = skb->data_len + skb->hdr_len - sh_len; | 1387 | unsigned int data_len = skb->len - sh_len; |
| 1388 | unsigned char *data = skb->data; | 1388 | unsigned char *data = skb->data; |
| 1389 | unsigned int ih_off, th_off, p_len; | 1389 | unsigned int ih_off, th_off, p_len; |
| 1390 | unsigned int isum_seed, tsum_seed, id, seq; | 1390 | unsigned int isum_seed, tsum_seed, id, seq; |
| 1391 | long f_id = -1; /* id of the current fragment */ | 1391 | long f_id = -1; /* id of the current fragment */ |
| 1392 | long f_size = skb->hdr_len; /* size of the current fragment */ | 1392 | long f_size = skb_headlen(skb) - sh_len; /* current fragment size */ |
| 1393 | long f_used = sh_len; /* bytes used from the current fragment */ | 1393 | long f_used = 0; /* bytes used from the current fragment */ |
| 1394 | long n; /* size of the current piece of payload */ | 1394 | long n; /* size of the current piece of payload */ |
| 1395 | int segment; | 1395 | int segment; |
| 1396 | 1396 | ||
| @@ -1405,7 +1405,7 @@ static void tso_headers_prepare(struct sk_buff *skb, unsigned char *headers, | |||
| 1405 | isum_seed = ((0xFFFF - ih->check) + | 1405 | isum_seed = ((0xFFFF - ih->check) + |
| 1406 | (0xFFFF - ih->tot_len) + | 1406 | (0xFFFF - ih->tot_len) + |
| 1407 | (0xFFFF - ih->id)); | 1407 | (0xFFFF - ih->id)); |
| 1408 | tsum_seed = th->check + (0xFFFF ^ htons(sh_len + data_len)); | 1408 | tsum_seed = th->check + (0xFFFF ^ htons(skb->len)); |
| 1409 | id = ntohs(ih->id); | 1409 | id = ntohs(ih->id); |
| 1410 | seq = ntohl(th->seq); | 1410 | seq = ntohl(th->seq); |
| 1411 | 1411 | ||
| @@ -1444,7 +1444,7 @@ static void tso_headers_prepare(struct sk_buff *skb, unsigned char *headers, | |||
| 1444 | /* Advance as needed. */ | 1444 | /* Advance as needed. */ |
| 1445 | while (f_used >= f_size) { | 1445 | while (f_used >= f_size) { |
| 1446 | f_id++; | 1446 | f_id++; |
| 1447 | f_size = sh->frags[f_id].size; | 1447 | f_size = skb_frag_size(&sh->frags[f_id]); |
| 1448 | f_used = 0; | 1448 | f_used = 0; |
| 1449 | } | 1449 | } |
| 1450 | 1450 | ||
| @@ -1478,14 +1478,14 @@ static void tso_egress(struct net_device *dev, gxio_mpipe_equeue_t *equeue, | |||
| 1478 | struct tile_net_priv *priv = netdev_priv(dev); | 1478 | struct tile_net_priv *priv = netdev_priv(dev); |
| 1479 | struct skb_shared_info *sh = skb_shinfo(skb); | 1479 | struct skb_shared_info *sh = skb_shinfo(skb); |
| 1480 | unsigned int sh_len = skb_transport_offset(skb) + tcp_hdrlen(skb); | 1480 | unsigned int sh_len = skb_transport_offset(skb) + tcp_hdrlen(skb); |
| 1481 | unsigned int data_len = skb->data_len + skb->hdr_len - sh_len; | 1481 | unsigned int data_len = skb->len - sh_len; |
| 1482 | unsigned int p_len = sh->gso_size; | 1482 | unsigned int p_len = sh->gso_size; |
| 1483 | gxio_mpipe_edesc_t edesc_head = { { 0 } }; | 1483 | gxio_mpipe_edesc_t edesc_head = { { 0 } }; |
| 1484 | gxio_mpipe_edesc_t edesc_body = { { 0 } }; | 1484 | gxio_mpipe_edesc_t edesc_body = { { 0 } }; |
| 1485 | long f_id = -1; /* id of the current fragment */ | 1485 | long f_id = -1; /* id of the current fragment */ |
| 1486 | long f_size = skb->hdr_len; /* size of the current fragment */ | 1486 | long f_size = skb_headlen(skb) - sh_len; /* current fragment size */ |
| 1487 | long f_used = sh_len; /* bytes used from the current fragment */ | 1487 | long f_used = 0; /* bytes used from the current fragment */ |
| 1488 | void *f_data = skb->data; | 1488 | void *f_data = skb->data + sh_len; |
| 1489 | long n; /* size of the current piece of payload */ | 1489 | long n; /* size of the current piece of payload */ |
| 1490 | unsigned long tx_packets = 0, tx_bytes = 0; | 1490 | unsigned long tx_packets = 0, tx_bytes = 0; |
| 1491 | unsigned int csum_start; | 1491 | unsigned int csum_start; |
| @@ -1516,15 +1516,18 @@ static void tso_egress(struct net_device *dev, gxio_mpipe_equeue_t *equeue, | |||
| 1516 | 1516 | ||
| 1517 | /* Egress the payload. */ | 1517 | /* Egress the payload. */ |
| 1518 | while (p_used < p_len) { | 1518 | while (p_used < p_len) { |
| 1519 | void *va; | ||
| 1519 | 1520 | ||
| 1520 | /* Advance as needed. */ | 1521 | /* Advance as needed. */ |
| 1521 | while (f_used >= f_size) { | 1522 | while (f_used >= f_size) { |
| 1522 | f_id++; | 1523 | f_id++; |
| 1523 | f_size = sh->frags[f_id].size; | 1524 | f_size = skb_frag_size(&sh->frags[f_id]); |
| 1524 | f_used = 0; | ||
| 1525 | f_data = tile_net_frag_buf(&sh->frags[f_id]); | 1525 | f_data = tile_net_frag_buf(&sh->frags[f_id]); |
| 1526 | f_used = 0; | ||
| 1526 | } | 1527 | } |
| 1527 | 1528 | ||
| 1529 | va = f_data + f_used; | ||
| 1530 | |||
| 1528 | /* Use bytes from the current fragment. */ | 1531 | /* Use bytes from the current fragment. */ |
| 1529 | n = p_len - p_used; | 1532 | n = p_len - p_used; |
| 1530 | if (n > f_size - f_used) | 1533 | if (n > f_size - f_used) |
| @@ -1533,7 +1536,7 @@ static void tso_egress(struct net_device *dev, gxio_mpipe_equeue_t *equeue, | |||
| 1533 | p_used += n; | 1536 | p_used += n; |
| 1534 | 1537 | ||
| 1535 | /* Egress a piece of the payload. */ | 1538 | /* Egress a piece of the payload. */ |
| 1536 | edesc_body.va = va_to_tile_io_addr(f_data) + f_used; | 1539 | edesc_body.va = va_to_tile_io_addr(va); |
| 1537 | edesc_body.xfer_size = n; | 1540 | edesc_body.xfer_size = n; |
| 1538 | edesc_body.bound = !(p_used < p_len); | 1541 | edesc_body.bound = !(p_used < p_len); |
| 1539 | gxio_mpipe_equeue_put_at(equeue, edesc_body, slot); | 1542 | gxio_mpipe_equeue_put_at(equeue, edesc_body, slot); |
diff --git a/drivers/net/phy/Kconfig b/drivers/net/phy/Kconfig index 983bbf4d5ef6..961f0b293913 100644 --- a/drivers/net/phy/Kconfig +++ b/drivers/net/phy/Kconfig | |||
| @@ -15,6 +15,11 @@ if PHYLIB | |||
| 15 | 15 | ||
| 16 | comment "MII PHY device drivers" | 16 | comment "MII PHY device drivers" |
| 17 | 17 | ||
| 18 | config AT803X_PHY | ||
| 19 | tristate "Drivers for Atheros AT803X PHYs" | ||
| 20 | ---help--- | ||
| 21 | Currently supports the AT8030 and AT8035 model | ||
| 22 | |||
| 18 | config AMD_PHY | 23 | config AMD_PHY |
| 19 | tristate "Drivers for the AMD PHYs" | 24 | tristate "Drivers for the AMD PHYs" |
| 20 | ---help--- | 25 | ---help--- |
diff --git a/drivers/net/phy/Makefile b/drivers/net/phy/Makefile index 426674debae4..9645e389a58d 100644 --- a/drivers/net/phy/Makefile +++ b/drivers/net/phy/Makefile | |||
| @@ -25,6 +25,7 @@ obj-$(CONFIG_STE10XP) += ste10Xp.o | |||
| 25 | obj-$(CONFIG_MICREL_PHY) += micrel.o | 25 | obj-$(CONFIG_MICREL_PHY) += micrel.o |
| 26 | obj-$(CONFIG_MDIO_OCTEON) += mdio-octeon.o | 26 | obj-$(CONFIG_MDIO_OCTEON) += mdio-octeon.o |
| 27 | obj-$(CONFIG_MICREL_KS8995MA) += spi_ks8995.o | 27 | obj-$(CONFIG_MICREL_KS8995MA) += spi_ks8995.o |
| 28 | obj-$(CONFIG_AT803X_PHY) += at803x.o | ||
| 28 | obj-$(CONFIG_AMD_PHY) += amd.o | 29 | obj-$(CONFIG_AMD_PHY) += amd.o |
| 29 | obj-$(CONFIG_MDIO_BUS_MUX) += mdio-mux.o | 30 | obj-$(CONFIG_MDIO_BUS_MUX) += mdio-mux.o |
| 30 | obj-$(CONFIG_MDIO_BUS_MUX_GPIO) += mdio-mux-gpio.o | 31 | obj-$(CONFIG_MDIO_BUS_MUX_GPIO) += mdio-mux-gpio.o |
diff --git a/drivers/net/phy/at803x.c b/drivers/net/phy/at803x.c new file mode 100644 index 000000000000..45cbc10de01c --- /dev/null +++ b/drivers/net/phy/at803x.c | |||
| @@ -0,0 +1,176 @@ | |||
| 1 | /* | ||
| 2 | * drivers/net/phy/at803x.c | ||
| 3 | * | ||
| 4 | * Driver for Atheros 803x PHY | ||
| 5 | * | ||
| 6 | * Author: Matus Ujhelyi <ujhelyi.m@gmail.com> | ||
| 7 | * | ||
| 8 | * This program is free software; you can redistribute it and/or modify it | ||
| 9 | * under the terms of the GNU General Public License as published by the | ||
| 10 | * Free Software Foundation; either version 2 of the License, or (at your | ||
| 11 | * option) any later version. | ||
| 12 | */ | ||
| 13 | |||
| 14 | #include <linux/phy.h> | ||
| 15 | #include <linux/module.h> | ||
| 16 | #include <linux/string.h> | ||
| 17 | #include <linux/netdevice.h> | ||
| 18 | #include <linux/etherdevice.h> | ||
| 19 | |||
| 20 | #define AT803X_INTR_ENABLE 0x12 | ||
| 21 | #define AT803X_INTR_STATUS 0x13 | ||
| 22 | #define AT803X_WOL_ENABLE 0x01 | ||
| 23 | #define AT803X_DEVICE_ADDR 0x03 | ||
| 24 | #define AT803X_LOC_MAC_ADDR_0_15_OFFSET 0x804C | ||
| 25 | #define AT803X_LOC_MAC_ADDR_16_31_OFFSET 0x804B | ||
| 26 | #define AT803X_LOC_MAC_ADDR_32_47_OFFSET 0x804A | ||
| 27 | #define AT803X_MMD_ACCESS_CONTROL 0x0D | ||
| 28 | #define AT803X_MMD_ACCESS_CONTROL_DATA 0x0E | ||
| 29 | #define AT803X_FUNC_DATA 0x4003 | ||
| 30 | |||
| 31 | MODULE_DESCRIPTION("Atheros 803x PHY driver"); | ||
| 32 | MODULE_AUTHOR("Matus Ujhelyi"); | ||
| 33 | MODULE_LICENSE("GPL"); | ||
| 34 | |||
| 35 | static void at803x_set_wol_mac_addr(struct phy_device *phydev) | ||
| 36 | { | ||
| 37 | struct net_device *ndev = phydev->attached_dev; | ||
| 38 | const u8 *mac; | ||
| 39 | unsigned int i, offsets[] = { | ||
| 40 | AT803X_LOC_MAC_ADDR_32_47_OFFSET, | ||
| 41 | AT803X_LOC_MAC_ADDR_16_31_OFFSET, | ||
| 42 | AT803X_LOC_MAC_ADDR_0_15_OFFSET, | ||
| 43 | }; | ||
| 44 | |||
| 45 | if (!ndev) | ||
| 46 | return; | ||
| 47 | |||
| 48 | mac = (const u8 *) ndev->dev_addr; | ||
| 49 | |||
| 50 | if (!is_valid_ether_addr(mac)) | ||
| 51 | return; | ||
| 52 | |||
| 53 | for (i = 0; i < 3; i++) { | ||
| 54 | phy_write(phydev, AT803X_MMD_ACCESS_CONTROL, | ||
| 55 | AT803X_DEVICE_ADDR); | ||
| 56 | phy_write(phydev, AT803X_MMD_ACCESS_CONTROL_DATA, | ||
| 57 | offsets[i]); | ||
| 58 | phy_write(phydev, AT803X_MMD_ACCESS_CONTROL, | ||
| 59 | AT803X_FUNC_DATA); | ||
| 60 | phy_write(phydev, AT803X_MMD_ACCESS_CONTROL_DATA, | ||
| 61 | mac[(i * 2) + 1] | (mac[(i * 2)] << 8)); | ||
| 62 | } | ||
| 63 | } | ||
| 64 | |||
| 65 | static int at803x_config_init(struct phy_device *phydev) | ||
| 66 | { | ||
| 67 | int val; | ||
| 68 | u32 features; | ||
| 69 | int status; | ||
| 70 | |||
| 71 | features = SUPPORTED_TP | SUPPORTED_MII | SUPPORTED_AUI | | ||
| 72 | SUPPORTED_FIBRE | SUPPORTED_BNC; | ||
| 73 | |||
| 74 | val = phy_read(phydev, MII_BMSR); | ||
| 75 | if (val < 0) | ||
| 76 | return val; | ||
| 77 | |||
| 78 | if (val & BMSR_ANEGCAPABLE) | ||
| 79 | features |= SUPPORTED_Autoneg; | ||
| 80 | if (val & BMSR_100FULL) | ||
| 81 | features |= SUPPORTED_100baseT_Full; | ||
| 82 | if (val & BMSR_100HALF) | ||
| 83 | features |= SUPPORTED_100baseT_Half; | ||
| 84 | if (val & BMSR_10FULL) | ||
| 85 | features |= SUPPORTED_10baseT_Full; | ||
| 86 | if (val & BMSR_10HALF) | ||
| 87 | features |= SUPPORTED_10baseT_Half; | ||
| 88 | |||
| 89 | if (val & BMSR_ESTATEN) { | ||
| 90 | val = phy_read(phydev, MII_ESTATUS); | ||
| 91 | if (val < 0) | ||
| 92 | return val; | ||
| 93 | |||
| 94 | if (val & ESTATUS_1000_TFULL) | ||
| 95 | features |= SUPPORTED_1000baseT_Full; | ||
| 96 | if (val & ESTATUS_1000_THALF) | ||
| 97 | features |= SUPPORTED_1000baseT_Half; | ||
| 98 | } | ||
| 99 | |||
| 100 | phydev->supported = features; | ||
| 101 | phydev->advertising = features; | ||
| 102 | |||
| 103 | /* enable WOL */ | ||
| 104 | at803x_set_wol_mac_addr(phydev); | ||
| 105 | status = phy_write(phydev, AT803X_INTR_ENABLE, AT803X_WOL_ENABLE); | ||
| 106 | status = phy_read(phydev, AT803X_INTR_STATUS); | ||
| 107 | |||
| 108 | return 0; | ||
| 109 | } | ||
| 110 | |||
| 111 | /* ATHEROS 8035 */ | ||
| 112 | static struct phy_driver at8035_driver = { | ||
| 113 | .phy_id = 0x004dd072, | ||
| 114 | .name = "Atheros 8035 ethernet", | ||
| 115 | .phy_id_mask = 0xffffffef, | ||
| 116 | .config_init = at803x_config_init, | ||
| 117 | .features = PHY_GBIT_FEATURES, | ||
| 118 | .flags = PHY_HAS_INTERRUPT, | ||
| 119 | .config_aneg = &genphy_config_aneg, | ||
| 120 | .read_status = &genphy_read_status, | ||
| 121 | .driver = { | ||
| 122 | .owner = THIS_MODULE, | ||
| 123 | }, | ||
| 124 | }; | ||
| 125 | |||
| 126 | /* ATHEROS 8030 */ | ||
| 127 | static struct phy_driver at8030_driver = { | ||
| 128 | .phy_id = 0x004dd076, | ||
| 129 | .name = "Atheros 8030 ethernet", | ||
| 130 | .phy_id_mask = 0xffffffef, | ||
| 131 | .config_init = at803x_config_init, | ||
| 132 | .features = PHY_GBIT_FEATURES, | ||
| 133 | .flags = PHY_HAS_INTERRUPT, | ||
| 134 | .config_aneg = &genphy_config_aneg, | ||
| 135 | .read_status = &genphy_read_status, | ||
| 136 | .driver = { | ||
| 137 | .owner = THIS_MODULE, | ||
| 138 | }, | ||
| 139 | }; | ||
| 140 | |||
| 141 | static int __init atheros_init(void) | ||
| 142 | { | ||
| 143 | int ret; | ||
| 144 | |||
| 145 | ret = phy_driver_register(&at8035_driver); | ||
| 146 | if (ret) | ||
| 147 | goto err1; | ||
| 148 | |||
| 149 | ret = phy_driver_register(&at8030_driver); | ||
| 150 | if (ret) | ||
| 151 | goto err2; | ||
| 152 | |||
| 153 | return 0; | ||
| 154 | |||
| 155 | err2: | ||
| 156 | phy_driver_unregister(&at8035_driver); | ||
| 157 | err1: | ||
| 158 | return ret; | ||
| 159 | } | ||
| 160 | |||
| 161 | static void __exit atheros_exit(void) | ||
| 162 | { | ||
| 163 | phy_driver_unregister(&at8035_driver); | ||
| 164 | phy_driver_unregister(&at8030_driver); | ||
| 165 | } | ||
| 166 | |||
| 167 | module_init(atheros_init); | ||
| 168 | module_exit(atheros_exit); | ||
| 169 | |||
| 170 | static struct mdio_device_id __maybe_unused atheros_tbl[] = { | ||
| 171 | { 0x004dd076, 0xffffffef }, | ||
| 172 | { 0x004dd072, 0xffffffef }, | ||
| 173 | { } | ||
| 174 | }; | ||
| 175 | |||
| 176 | MODULE_DEVICE_TABLE(mdio, atheros_tbl); | ||
diff --git a/drivers/net/usb/cdc_ether.c b/drivers/net/usb/cdc_ether.c index a03de7197049..d0129827602b 100644 --- a/drivers/net/usb/cdc_ether.c +++ b/drivers/net/usb/cdc_ether.c | |||
| @@ -592,6 +592,32 @@ static const struct usb_device_id products [] = { | |||
| 592 | .driver_info = 0, | 592 | .driver_info = 0, |
| 593 | }, | 593 | }, |
| 594 | 594 | ||
| 595 | /* Novatel USB551L and MC551 - handled by qmi_wwan */ | ||
| 596 | { | ||
| 597 | .match_flags = USB_DEVICE_ID_MATCH_VENDOR | ||
| 598 | | USB_DEVICE_ID_MATCH_PRODUCT | ||
| 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, | ||
| 606 | }, | ||
| 607 | |||
| 608 | /* Novatel E362 - handled by qmi_wwan */ | ||
| 609 | { | ||
| 610 | .match_flags = USB_DEVICE_ID_MATCH_VENDOR | ||
| 611 | | USB_DEVICE_ID_MATCH_PRODUCT | ||
| 612 | | USB_DEVICE_ID_MATCH_INT_INFO, | ||
| 613 | .idVendor = NOVATEL_VENDOR_ID, | ||
| 614 | .idProduct = 0x9010, | ||
| 615 | .bInterfaceClass = USB_CLASS_COMM, | ||
| 616 | .bInterfaceSubClass = USB_CDC_SUBCLASS_ETHERNET, | ||
| 617 | .bInterfaceProtocol = USB_CDC_PROTO_NONE, | ||
| 618 | .driver_info = 0, | ||
| 619 | }, | ||
| 620 | |||
| 595 | /* | 621 | /* |
| 596 | * WHITELIST!!! | 622 | * WHITELIST!!! |
| 597 | * | 623 | * |
| @@ -604,21 +630,6 @@ static const struct usb_device_id products [] = { | |||
| 604 | * because of bugs/quirks in a given product (like Zaurus, above). | 630 | * because of bugs/quirks in a given product (like Zaurus, above). |
| 605 | */ | 631 | */ |
| 606 | { | 632 | { |
| 607 | /* Novatel USB551L */ | ||
| 608 | /* This match must come *before* the generic CDC-ETHER match so that | ||
| 609 | * we get FLAG_WWAN set on the device, since it's descriptors are | ||
| 610 | * generic CDC-ETHER. | ||
| 611 | */ | ||
| 612 | .match_flags = USB_DEVICE_ID_MATCH_VENDOR | ||
| 613 | | USB_DEVICE_ID_MATCH_PRODUCT | ||
| 614 | | USB_DEVICE_ID_MATCH_INT_INFO, | ||
| 615 | .idVendor = NOVATEL_VENDOR_ID, | ||
| 616 | .idProduct = 0xB001, | ||
| 617 | .bInterfaceClass = USB_CLASS_COMM, | ||
| 618 | .bInterfaceSubClass = USB_CDC_SUBCLASS_ETHERNET, | ||
| 619 | .bInterfaceProtocol = USB_CDC_PROTO_NONE, | ||
| 620 | .driver_info = (unsigned long)&wwan_info, | ||
| 621 | }, { | ||
| 622 | /* ZTE (Vodafone) K3805-Z */ | 633 | /* ZTE (Vodafone) K3805-Z */ |
| 623 | .match_flags = USB_DEVICE_ID_MATCH_VENDOR | 634 | .match_flags = USB_DEVICE_ID_MATCH_VENDOR |
| 624 | | USB_DEVICE_ID_MATCH_PRODUCT | 635 | | USB_DEVICE_ID_MATCH_PRODUCT |
diff --git a/drivers/net/usb/ipheth.c b/drivers/net/usb/ipheth.c index a28a983d465e..534d8becbbdc 100644 --- a/drivers/net/usb/ipheth.c +++ b/drivers/net/usb/ipheth.c | |||
| @@ -62,6 +62,7 @@ | |||
| 62 | #define USB_PRODUCT_IPAD 0x129a | 62 | #define USB_PRODUCT_IPAD 0x129a |
| 63 | #define USB_PRODUCT_IPHONE_4_VZW 0x129c | 63 | #define USB_PRODUCT_IPHONE_4_VZW 0x129c |
| 64 | #define USB_PRODUCT_IPHONE_4S 0x12a0 | 64 | #define USB_PRODUCT_IPHONE_4S 0x12a0 |
| 65 | #define USB_PRODUCT_IPHONE_5 0x12a8 | ||
| 65 | 66 | ||
| 66 | #define IPHETH_USBINTF_CLASS 255 | 67 | #define IPHETH_USBINTF_CLASS 255 |
| 67 | #define IPHETH_USBINTF_SUBCLASS 253 | 68 | #define IPHETH_USBINTF_SUBCLASS 253 |
| @@ -113,6 +114,10 @@ static struct usb_device_id ipheth_table[] = { | |||
| 113 | USB_VENDOR_APPLE, USB_PRODUCT_IPHONE_4S, | 114 | USB_VENDOR_APPLE, USB_PRODUCT_IPHONE_4S, |
| 114 | IPHETH_USBINTF_CLASS, IPHETH_USBINTF_SUBCLASS, | 115 | IPHETH_USBINTF_CLASS, IPHETH_USBINTF_SUBCLASS, |
| 115 | IPHETH_USBINTF_PROTO) }, | 116 | IPHETH_USBINTF_PROTO) }, |
| 117 | { USB_DEVICE_AND_INTERFACE_INFO( | ||
| 118 | USB_VENDOR_APPLE, USB_PRODUCT_IPHONE_5, | ||
| 119 | IPHETH_USBINTF_CLASS, IPHETH_USBINTF_SUBCLASS, | ||
| 120 | IPHETH_USBINTF_PROTO) }, | ||
| 116 | { } | 121 | { } |
| 117 | }; | 122 | }; |
| 118 | MODULE_DEVICE_TABLE(usb, ipheth_table); | 123 | MODULE_DEVICE_TABLE(usb, ipheth_table); |
diff --git a/drivers/net/usb/qmi_wwan.c b/drivers/net/usb/qmi_wwan.c index 6883c371c59f..3b566fa0f8e6 100644 --- a/drivers/net/usb/qmi_wwan.c +++ b/drivers/net/usb/qmi_wwan.c | |||
| @@ -369,18 +369,73 @@ static const struct usb_device_id products[] = { | |||
| 369 | USB_VENDOR_AND_INTERFACE_INFO(0x106c, USB_CLASS_VENDOR_SPEC, 0xf1, 0xff), | 369 | USB_VENDOR_AND_INTERFACE_INFO(0x106c, USB_CLASS_VENDOR_SPEC, 0xf1, 0xff), |
| 370 | .driver_info = (unsigned long)&qmi_wwan_info, | 370 | .driver_info = (unsigned long)&qmi_wwan_info, |
| 371 | }, | 371 | }, |
| 372 | { /* Novatel USB551L and MC551 */ | ||
| 373 | USB_DEVICE_AND_INTERFACE_INFO(0x1410, 0xb001, | ||
| 374 | USB_CLASS_COMM, | ||
| 375 | USB_CDC_SUBCLASS_ETHERNET, | ||
| 376 | USB_CDC_PROTO_NONE), | ||
| 377 | .driver_info = (unsigned long)&qmi_wwan_info, | ||
| 378 | }, | ||
| 379 | { /* Novatel E362 */ | ||
| 380 | USB_DEVICE_AND_INTERFACE_INFO(0x1410, 0x9010, | ||
| 381 | USB_CLASS_COMM, | ||
| 382 | USB_CDC_SUBCLASS_ETHERNET, | ||
| 383 | USB_CDC_PROTO_NONE), | ||
| 384 | .driver_info = (unsigned long)&qmi_wwan_info, | ||
| 385 | }, | ||
| 372 | 386 | ||
| 373 | /* 3. Combined interface devices matching on interface number */ | 387 | /* 3. Combined interface devices matching on interface number */ |
| 388 | {QMI_FIXED_INTF(0x19d2, 0x0002, 1)}, | ||
| 389 | {QMI_FIXED_INTF(0x19d2, 0x0012, 1)}, | ||
| 390 | {QMI_FIXED_INTF(0x19d2, 0x0017, 3)}, | ||
| 391 | {QMI_FIXED_INTF(0x19d2, 0x0021, 4)}, | ||
| 392 | {QMI_FIXED_INTF(0x19d2, 0x0025, 1)}, | ||
| 393 | {QMI_FIXED_INTF(0x19d2, 0x0031, 4)}, | ||
| 394 | {QMI_FIXED_INTF(0x19d2, 0x0042, 4)}, | ||
| 395 | {QMI_FIXED_INTF(0x19d2, 0x0049, 5)}, | ||
| 396 | {QMI_FIXED_INTF(0x19d2, 0x0052, 4)}, | ||
| 374 | {QMI_FIXED_INTF(0x19d2, 0x0055, 1)}, /* ZTE (Vodafone) K3520-Z */ | 397 | {QMI_FIXED_INTF(0x19d2, 0x0055, 1)}, /* ZTE (Vodafone) K3520-Z */ |
| 398 | {QMI_FIXED_INTF(0x19d2, 0x0058, 4)}, | ||
| 375 | {QMI_FIXED_INTF(0x19d2, 0x0063, 4)}, /* ZTE (Vodafone) K3565-Z */ | 399 | {QMI_FIXED_INTF(0x19d2, 0x0063, 4)}, /* ZTE (Vodafone) K3565-Z */ |
| 376 | {QMI_FIXED_INTF(0x19d2, 0x0104, 4)}, /* ZTE (Vodafone) K4505-Z */ | 400 | {QMI_FIXED_INTF(0x19d2, 0x0104, 4)}, /* ZTE (Vodafone) K4505-Z */ |
| 401 | {QMI_FIXED_INTF(0x19d2, 0x0113, 5)}, | ||
| 402 | {QMI_FIXED_INTF(0x19d2, 0x0118, 5)}, | ||
| 403 | {QMI_FIXED_INTF(0x19d2, 0x0121, 5)}, | ||
| 404 | {QMI_FIXED_INTF(0x19d2, 0x0123, 4)}, | ||
| 405 | {QMI_FIXED_INTF(0x19d2, 0x0124, 5)}, | ||
| 406 | {QMI_FIXED_INTF(0x19d2, 0x0125, 6)}, | ||
| 407 | {QMI_FIXED_INTF(0x19d2, 0x0126, 5)}, | ||
| 408 | {QMI_FIXED_INTF(0x19d2, 0x0130, 1)}, | ||
| 409 | {QMI_FIXED_INTF(0x19d2, 0x0133, 3)}, | ||
| 410 | {QMI_FIXED_INTF(0x19d2, 0x0141, 5)}, | ||
| 377 | {QMI_FIXED_INTF(0x19d2, 0x0157, 5)}, /* ZTE MF683 */ | 411 | {QMI_FIXED_INTF(0x19d2, 0x0157, 5)}, /* ZTE MF683 */ |
| 412 | {QMI_FIXED_INTF(0x19d2, 0x0158, 3)}, | ||
| 378 | {QMI_FIXED_INTF(0x19d2, 0x0167, 4)}, /* ZTE MF820D */ | 413 | {QMI_FIXED_INTF(0x19d2, 0x0167, 4)}, /* ZTE MF820D */ |
| 414 | {QMI_FIXED_INTF(0x19d2, 0x0168, 4)}, | ||
| 415 | {QMI_FIXED_INTF(0x19d2, 0x0176, 3)}, | ||
| 416 | {QMI_FIXED_INTF(0x19d2, 0x0178, 3)}, | ||
| 417 | {QMI_FIXED_INTF(0x19d2, 0x0191, 4)}, /* ZTE EuFi890 */ | ||
| 418 | {QMI_FIXED_INTF(0x19d2, 0x0199, 1)}, /* ZTE MF820S */ | ||
| 419 | {QMI_FIXED_INTF(0x19d2, 0x0200, 1)}, | ||
| 420 | {QMI_FIXED_INTF(0x19d2, 0x0257, 3)}, /* ZTE MF821 */ | ||
| 379 | {QMI_FIXED_INTF(0x19d2, 0x0326, 4)}, /* ZTE MF821D */ | 421 | {QMI_FIXED_INTF(0x19d2, 0x0326, 4)}, /* ZTE MF821D */ |
| 380 | {QMI_FIXED_INTF(0x19d2, 0x1008, 4)}, /* ZTE (Vodafone) K3570-Z */ | 422 | {QMI_FIXED_INTF(0x19d2, 0x1008, 4)}, /* ZTE (Vodafone) K3570-Z */ |
| 381 | {QMI_FIXED_INTF(0x19d2, 0x1010, 4)}, /* ZTE (Vodafone) K3571-Z */ | 423 | {QMI_FIXED_INTF(0x19d2, 0x1010, 4)}, /* ZTE (Vodafone) K3571-Z */ |
| 424 | {QMI_FIXED_INTF(0x19d2, 0x1012, 4)}, | ||
| 382 | {QMI_FIXED_INTF(0x19d2, 0x1018, 3)}, /* ZTE (Vodafone) K5006-Z */ | 425 | {QMI_FIXED_INTF(0x19d2, 0x1018, 3)}, /* ZTE (Vodafone) K5006-Z */ |
| 426 | {QMI_FIXED_INTF(0x19d2, 0x1021, 2)}, | ||
| 427 | {QMI_FIXED_INTF(0x19d2, 0x1245, 4)}, | ||
| 428 | {QMI_FIXED_INTF(0x19d2, 0x1247, 4)}, | ||
| 429 | {QMI_FIXED_INTF(0x19d2, 0x1252, 4)}, | ||
| 430 | {QMI_FIXED_INTF(0x19d2, 0x1254, 4)}, | ||
| 431 | {QMI_FIXED_INTF(0x19d2, 0x1255, 3)}, | ||
| 432 | {QMI_FIXED_INTF(0x19d2, 0x1255, 4)}, | ||
| 433 | {QMI_FIXED_INTF(0x19d2, 0x1256, 4)}, | ||
| 434 | {QMI_FIXED_INTF(0x19d2, 0x1401, 2)}, | ||
| 383 | {QMI_FIXED_INTF(0x19d2, 0x1402, 2)}, /* ZTE MF60 */ | 435 | {QMI_FIXED_INTF(0x19d2, 0x1402, 2)}, /* ZTE MF60 */ |
| 436 | {QMI_FIXED_INTF(0x19d2, 0x1424, 2)}, | ||
| 437 | {QMI_FIXED_INTF(0x19d2, 0x1425, 2)}, | ||
| 438 | {QMI_FIXED_INTF(0x19d2, 0x1426, 2)}, /* ZTE MF91 */ | ||
| 384 | {QMI_FIXED_INTF(0x19d2, 0x2002, 4)}, /* ZTE (Vodafone) K3765-Z */ | 439 | {QMI_FIXED_INTF(0x19d2, 0x2002, 4)}, /* ZTE (Vodafone) K3765-Z */ |
| 385 | {QMI_FIXED_INTF(0x0f3d, 0x68a2, 8)}, /* Sierra Wireless MC7700 */ | 440 | {QMI_FIXED_INTF(0x0f3d, 0x68a2, 8)}, /* Sierra Wireless MC7700 */ |
| 386 | {QMI_FIXED_INTF(0x114f, 0x68a2, 8)}, /* Sierra Wireless MC7750 */ | 441 | {QMI_FIXED_INTF(0x114f, 0x68a2, 8)}, /* Sierra Wireless MC7750 */ |
diff --git a/drivers/net/usb/usbnet.c b/drivers/net/usb/usbnet.c index f9819d10b1f9..cb04f900cc46 100644 --- a/drivers/net/usb/usbnet.c +++ b/drivers/net/usb/usbnet.c | |||
| @@ -1158,6 +1158,7 @@ netdev_tx_t usbnet_start_xmit (struct sk_buff *skb, | |||
| 1158 | usb_anchor_urb(urb, &dev->deferred); | 1158 | usb_anchor_urb(urb, &dev->deferred); |
| 1159 | /* no use to process more packets */ | 1159 | /* no use to process more packets */ |
| 1160 | netif_stop_queue(net); | 1160 | netif_stop_queue(net); |
| 1161 | usb_put_urb(urb); | ||
| 1161 | spin_unlock_irqrestore(&dev->txq.lock, flags); | 1162 | spin_unlock_irqrestore(&dev->txq.lock, flags); |
| 1162 | netdev_dbg(dev->net, "Delaying transmission for resumption\n"); | 1163 | netdev_dbg(dev->net, "Delaying transmission for resumption\n"); |
| 1163 | goto deferred; | 1164 | goto deferred; |
| @@ -1310,6 +1311,8 @@ void usbnet_disconnect (struct usb_interface *intf) | |||
| 1310 | 1311 | ||
| 1311 | cancel_work_sync(&dev->kevent); | 1312 | cancel_work_sync(&dev->kevent); |
| 1312 | 1313 | ||
| 1314 | usb_scuttle_anchored_urbs(&dev->deferred); | ||
| 1315 | |||
| 1313 | if (dev->driver_info->unbind) | 1316 | if (dev->driver_info->unbind) |
| 1314 | dev->driver_info->unbind (dev, intf); | 1317 | dev->driver_info->unbind (dev, intf); |
| 1315 | 1318 | ||
diff --git a/drivers/net/wireless/ath/ath9k/ar9003_2p2_initvals.h b/drivers/net/wireless/ath/ath9k/ar9003_2p2_initvals.h index 89bf94d4d8a1..6f7cf49eff4d 100644 --- a/drivers/net/wireless/ath/ath9k/ar9003_2p2_initvals.h +++ b/drivers/net/wireless/ath/ath9k/ar9003_2p2_initvals.h | |||
| @@ -534,107 +534,107 @@ static const u32 ar9300_2p2_baseband_core[][2] = { | |||
| 534 | 534 | ||
| 535 | static const u32 ar9300Modes_high_power_tx_gain_table_2p2[][5] = { | 535 | static const u32 ar9300Modes_high_power_tx_gain_table_2p2[][5] = { |
| 536 | /* Addr 5G_HT20 5G_HT40 2G_HT40 2G_HT20 */ | 536 | /* Addr 5G_HT20 5G_HT40 2G_HT40 2G_HT20 */ |
| 537 | {0x0000a2dc, 0x000cfff0, 0x000cfff0, 0x03aaa352, 0x03aaa352}, | 537 | {0x0000a2dc, 0x00033800, 0x00033800, 0x03aaa352, 0x03aaa352}, |
| 538 | {0x0000a2e0, 0x000f0000, 0x000f0000, 0x03ccc584, 0x03ccc584}, | 538 | {0x0000a2e0, 0x0003c000, 0x0003c000, 0x03ccc584, 0x03ccc584}, |
| 539 | {0x0000a2e4, 0x03f00000, 0x03f00000, 0x03f0f800, 0x03f0f800}, | 539 | {0x0000a2e4, 0x03fc0000, 0x03fc0000, 0x03f0f800, 0x03f0f800}, |
| 540 | {0x0000a2e8, 0x00000000, 0x00000000, 0x03ff0000, 0x03ff0000}, | 540 | {0x0000a2e8, 0x00000000, 0x00000000, 0x03ff0000, 0x03ff0000}, |
| 541 | {0x0000a410, 0x000050d9, 0x000050d9, 0x000050d9, 0x000050d9}, | 541 | {0x0000a410, 0x000050d9, 0x000050d9, 0x000050d9, 0x000050d9}, |
| 542 | {0x0000a500, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, | 542 | {0x0000a500, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, |
| 543 | {0x0000a504, 0x06000003, 0x06000003, 0x04000002, 0x04000002}, | 543 | {0x0000a504, 0x06000003, 0x06000003, 0x04000002, 0x04000002}, |
| 544 | {0x0000a508, 0x0a000020, 0x0a000020, 0x08000004, 0x08000004}, | 544 | {0x0000a508, 0x0a000020, 0x0a000020, 0x08000004, 0x08000004}, |
| 545 | {0x0000a50c, 0x10000023, 0x10000023, 0x0b000200, 0x0b000200}, | 545 | {0x0000a50c, 0x10000023, 0x10000023, 0x0b000200, 0x0b000200}, |
| 546 | {0x0000a510, 0x15000028, 0x15000028, 0x0f000202, 0x0f000202}, | 546 | {0x0000a510, 0x16000220, 0x16000220, 0x0f000202, 0x0f000202}, |
| 547 | {0x0000a514, 0x1b00002b, 0x1b00002b, 0x12000400, 0x12000400}, | 547 | {0x0000a514, 0x1c000223, 0x1c000223, 0x12000400, 0x12000400}, |
| 548 | {0x0000a518, 0x1f020028, 0x1f020028, 0x16000402, 0x16000402}, | 548 | {0x0000a518, 0x21002220, 0x21002220, 0x16000402, 0x16000402}, |
| 549 | {0x0000a51c, 0x2502002b, 0x2502002b, 0x19000404, 0x19000404}, | 549 | {0x0000a51c, 0x27002223, 0x27002223, 0x19000404, 0x19000404}, |
| 550 | {0x0000a520, 0x2a04002a, 0x2a04002a, 0x1c000603, 0x1c000603}, | 550 | {0x0000a520, 0x2b022220, 0x2b022220, 0x1c000603, 0x1c000603}, |
| 551 | {0x0000a524, 0x2e06002a, 0x2e06002a, 0x21000a02, 0x21000a02}, | 551 | {0x0000a524, 0x2f022222, 0x2f022222, 0x21000a02, 0x21000a02}, |
| 552 | {0x0000a528, 0x3302202d, 0x3302202d, 0x25000a04, 0x25000a04}, | 552 | {0x0000a528, 0x34022225, 0x34022225, 0x25000a04, 0x25000a04}, |
| 553 | {0x0000a52c, 0x3804202c, 0x3804202c, 0x28000a20, 0x28000a20}, | 553 | {0x0000a52c, 0x3a02222a, 0x3a02222a, 0x28000a20, 0x28000a20}, |
| 554 | {0x0000a530, 0x3c06202c, 0x3c06202c, 0x2c000e20, 0x2c000e20}, | 554 | {0x0000a530, 0x3e02222c, 0x3e02222c, 0x2c000e20, 0x2c000e20}, |
| 555 | {0x0000a534, 0x4108202d, 0x4108202d, 0x30000e22, 0x30000e22}, | 555 | {0x0000a534, 0x4202242a, 0x4202242a, 0x30000e22, 0x30000e22}, |
| 556 | {0x0000a538, 0x4506402d, 0x4506402d, 0x34000e24, 0x34000e24}, | 556 | {0x0000a538, 0x4702244a, 0x4702244a, 0x34000e24, 0x34000e24}, |
| 557 | {0x0000a53c, 0x4906222d, 0x4906222d, 0x38001640, 0x38001640}, | 557 | {0x0000a53c, 0x4b02244c, 0x4b02244c, 0x38001640, 0x38001640}, |
| 558 | {0x0000a540, 0x4d062231, 0x4d062231, 0x3c001660, 0x3c001660}, | 558 | {0x0000a540, 0x4e02246c, 0x4e02246c, 0x3c001660, 0x3c001660}, |
| 559 | {0x0000a544, 0x50082231, 0x50082231, 0x3f001861, 0x3f001861}, | 559 | {0x0000a544, 0x52022470, 0x52022470, 0x3f001861, 0x3f001861}, |
| 560 | {0x0000a548, 0x5608422e, 0x5608422e, 0x43001a81, 0x43001a81}, | 560 | {0x0000a548, 0x55022490, 0x55022490, 0x43001a81, 0x43001a81}, |
| 561 | {0x0000a54c, 0x5a08442e, 0x5a08442e, 0x47001a83, 0x47001a83}, | 561 | {0x0000a54c, 0x59022492, 0x59022492, 0x47001a83, 0x47001a83}, |
| 562 | {0x0000a550, 0x5e0a4431, 0x5e0a4431, 0x4a001c84, 0x4a001c84}, | 562 | {0x0000a550, 0x5d022692, 0x5d022692, 0x4a001c84, 0x4a001c84}, |
| 563 | {0x0000a554, 0x640a4432, 0x640a4432, 0x4e001ce3, 0x4e001ce3}, | 563 | {0x0000a554, 0x61022892, 0x61022892, 0x4e001ce3, 0x4e001ce3}, |
| 564 | {0x0000a558, 0x680a4434, 0x680a4434, 0x52001ce5, 0x52001ce5}, | 564 | {0x0000a558, 0x65024890, 0x65024890, 0x52001ce5, 0x52001ce5}, |
| 565 | {0x0000a55c, 0x6c0a6434, 0x6c0a6434, 0x56001ce9, 0x56001ce9}, | 565 | {0x0000a55c, 0x69024892, 0x69024892, 0x56001ce9, 0x56001ce9}, |
| 566 | {0x0000a560, 0x6f0a6633, 0x6f0a6633, 0x5a001ceb, 0x5a001ceb}, | 566 | {0x0000a560, 0x6e024c92, 0x6e024c92, 0x5a001ceb, 0x5a001ceb}, |
| 567 | {0x0000a564, 0x730c6634, 0x730c6634, 0x5d001eec, 0x5d001eec}, | 567 | {0x0000a564, 0x74026e92, 0x74026e92, 0x5d001eec, 0x5d001eec}, |
| 568 | {0x0000a568, 0x730c6634, 0x730c6634, 0x5d001eec, 0x5d001eec}, | 568 | {0x0000a568, 0x74026e92, 0x74026e92, 0x5d001eec, 0x5d001eec}, |
| 569 | {0x0000a56c, 0x730c6634, 0x730c6634, 0x5d001eec, 0x5d001eec}, | 569 | {0x0000a56c, 0x74026e92, 0x74026e92, 0x5d001eec, 0x5d001eec}, |
| 570 | {0x0000a570, 0x730c6634, 0x730c6634, 0x5d001eec, 0x5d001eec}, | 570 | {0x0000a570, 0x74026e92, 0x74026e92, 0x5d001eec, 0x5d001eec}, |
| 571 | {0x0000a574, 0x730c6634, 0x730c6634, 0x5d001eec, 0x5d001eec}, | 571 | {0x0000a574, 0x74026e92, 0x74026e92, 0x5d001eec, 0x5d001eec}, |
| 572 | {0x0000a578, 0x730c6634, 0x730c6634, 0x5d001eec, 0x5d001eec}, | 572 | {0x0000a578, 0x74026e92, 0x74026e92, 0x5d001eec, 0x5d001eec}, |
| 573 | {0x0000a57c, 0x730c6634, 0x730c6634, 0x5d001eec, 0x5d001eec}, | 573 | {0x0000a57c, 0x74026e92, 0x74026e92, 0x5d001eec, 0x5d001eec}, |
| 574 | {0x0000a580, 0x00800000, 0x00800000, 0x00800000, 0x00800000}, | 574 | {0x0000a580, 0x00800000, 0x00800000, 0x00800000, 0x00800000}, |
| 575 | {0x0000a584, 0x06800003, 0x06800003, 0x04800002, 0x04800002}, | 575 | {0x0000a584, 0x06800003, 0x06800003, 0x04800002, 0x04800002}, |
| 576 | {0x0000a588, 0x0a800020, 0x0a800020, 0x08800004, 0x08800004}, | 576 | {0x0000a588, 0x0a800020, 0x0a800020, 0x08800004, 0x08800004}, |
| 577 | {0x0000a58c, 0x10800023, 0x10800023, 0x0b800200, 0x0b800200}, | 577 | {0x0000a58c, 0x10800023, 0x10800023, 0x0b800200, 0x0b800200}, |
| 578 | {0x0000a590, 0x15800028, 0x15800028, 0x0f800202, 0x0f800202}, | 578 | {0x0000a590, 0x16800220, 0x16800220, 0x0f800202, 0x0f800202}, |
| 579 | {0x0000a594, 0x1b80002b, 0x1b80002b, 0x12800400, 0x12800400}, | 579 | {0x0000a594, 0x1c800223, 0x1c800223, 0x12800400, 0x12800400}, |
| 580 | {0x0000a598, 0x1f820028, 0x1f820028, 0x16800402, 0x16800402}, | 580 | {0x0000a598, 0x21802220, 0x21802220, 0x16800402, 0x16800402}, |
| 581 | {0x0000a59c, 0x2582002b, 0x2582002b, 0x19800404, 0x19800404}, | 581 | {0x0000a59c, 0x27802223, 0x27802223, 0x19800404, 0x19800404}, |
| 582 | {0x0000a5a0, 0x2a84002a, 0x2a84002a, 0x1c800603, 0x1c800603}, | 582 | {0x0000a5a0, 0x2b822220, 0x2b822220, 0x1c800603, 0x1c800603}, |
| 583 | {0x0000a5a4, 0x2e86002a, 0x2e86002a, 0x21800a02, 0x21800a02}, | 583 | {0x0000a5a4, 0x2f822222, 0x2f822222, 0x21800a02, 0x21800a02}, |
| 584 | {0x0000a5a8, 0x3382202d, 0x3382202d, 0x25800a04, 0x25800a04}, | 584 | {0x0000a5a8, 0x34822225, 0x34822225, 0x25800a04, 0x25800a04}, |
| 585 | {0x0000a5ac, 0x3884202c, 0x3884202c, 0x28800a20, 0x28800a20}, | 585 | {0x0000a5ac, 0x3a82222a, 0x3a82222a, 0x28800a20, 0x28800a20}, |
| 586 | {0x0000a5b0, 0x3c86202c, 0x3c86202c, 0x2c800e20, 0x2c800e20}, | 586 | {0x0000a5b0, 0x3e82222c, 0x3e82222c, 0x2c800e20, 0x2c800e20}, |
| 587 | {0x0000a5b4, 0x4188202d, 0x4188202d, 0x30800e22, 0x30800e22}, | 587 | {0x0000a5b4, 0x4282242a, 0x4282242a, 0x30800e22, 0x30800e22}, |
| 588 | {0x0000a5b8, 0x4586402d, 0x4586402d, 0x34800e24, 0x34800e24}, | 588 | {0x0000a5b8, 0x4782244a, 0x4782244a, 0x34800e24, 0x34800e24}, |
| 589 | {0x0000a5bc, 0x4986222d, 0x4986222d, 0x38801640, 0x38801640}, | 589 | {0x0000a5bc, 0x4b82244c, 0x4b82244c, 0x38801640, 0x38801640}, |
| 590 | {0x0000a5c0, 0x4d862231, 0x4d862231, 0x3c801660, 0x3c801660}, | 590 | {0x0000a5c0, 0x4e82246c, 0x4e82246c, 0x3c801660, 0x3c801660}, |
| 591 | {0x0000a5c4, 0x50882231, 0x50882231, 0x3f801861, 0x3f801861}, | 591 | {0x0000a5c4, 0x52822470, 0x52822470, 0x3f801861, 0x3f801861}, |
| 592 | {0x0000a5c8, 0x5688422e, 0x5688422e, 0x43801a81, 0x43801a81}, | 592 | {0x0000a5c8, 0x55822490, 0x55822490, 0x43801a81, 0x43801a81}, |
| 593 | {0x0000a5cc, 0x5a88442e, 0x5a88442e, 0x47801a83, 0x47801a83}, | 593 | {0x0000a5cc, 0x59822492, 0x59822492, 0x47801a83, 0x47801a83}, |
| 594 | {0x0000a5d0, 0x5e8a4431, 0x5e8a4431, 0x4a801c84, 0x4a801c84}, | 594 | {0x0000a5d0, 0x5d822692, 0x5d822692, 0x4a801c84, 0x4a801c84}, |
| 595 | {0x0000a5d4, 0x648a4432, 0x648a4432, 0x4e801ce3, 0x4e801ce3}, | 595 | {0x0000a5d4, 0x61822892, 0x61822892, 0x4e801ce3, 0x4e801ce3}, |
| 596 | {0x0000a5d8, 0x688a4434, 0x688a4434, 0x52801ce5, 0x52801ce5}, | 596 | {0x0000a5d8, 0x65824890, 0x65824890, 0x52801ce5, 0x52801ce5}, |
| 597 | {0x0000a5dc, 0x6c8a6434, 0x6c8a6434, 0x56801ce9, 0x56801ce9}, | 597 | {0x0000a5dc, 0x69824892, 0x69824892, 0x56801ce9, 0x56801ce9}, |
| 598 | {0x0000a5e0, 0x6f8a6633, 0x6f8a6633, 0x5a801ceb, 0x5a801ceb}, | 598 | {0x0000a5e0, 0x6e824c92, 0x6e824c92, 0x5a801ceb, 0x5a801ceb}, |
| 599 | {0x0000a5e4, 0x738c6634, 0x738c6634, 0x5d801eec, 0x5d801eec}, | 599 | {0x0000a5e4, 0x74826e92, 0x74826e92, 0x5d801eec, 0x5d801eec}, |
| 600 | {0x0000a5e8, 0x738c6634, 0x738c6634, 0x5d801eec, 0x5d801eec}, | 600 | {0x0000a5e8, 0x74826e92, 0x74826e92, 0x5d801eec, 0x5d801eec}, |
| 601 | {0x0000a5ec, 0x738c6634, 0x738c6634, 0x5d801eec, 0x5d801eec}, | 601 | {0x0000a5ec, 0x74826e92, 0x74826e92, 0x5d801eec, 0x5d801eec}, |
| 602 | {0x0000a5f0, 0x738c6634, 0x738c6634, 0x5d801eec, 0x5d801eec}, | 602 | {0x0000a5f0, 0x74826e92, 0x74826e92, 0x5d801eec, 0x5d801eec}, |
| 603 | {0x0000a5f4, 0x738c6634, 0x738c6634, 0x5d801eec, 0x5d801eec}, | 603 | {0x0000a5f4, 0x74826e92, 0x74826e92, 0x5d801eec, 0x5d801eec}, |
| 604 | {0x0000a5f8, 0x738c6634, 0x738c6634, 0x5d801eec, 0x5d801eec}, | 604 | {0x0000a5f8, 0x74826e92, 0x74826e92, 0x5d801eec, 0x5d801eec}, |
| 605 | {0x0000a5fc, 0x738c6634, 0x738c6634, 0x5d801eec, 0x5d801eec}, | 605 | {0x0000a5fc, 0x74826e92, 0x74826e92, 0x5d801eec, 0x5d801eec}, |
| 606 | {0x0000a600, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, | 606 | {0x0000a600, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, |
| 607 | {0x0000a604, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, | 607 | {0x0000a604, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, |
| 608 | {0x0000a608, 0x01804601, 0x01804601, 0x00000000, 0x00000000}, | 608 | {0x0000a608, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, |
| 609 | {0x0000a60c, 0x01804601, 0x01804601, 0x00000000, 0x00000000}, | 609 | {0x0000a60c, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, |
| 610 | {0x0000a610, 0x01804601, 0x01804601, 0x00000000, 0x00000000}, | 610 | {0x0000a610, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, |
| 611 | {0x0000a614, 0x01804601, 0x01804601, 0x01404000, 0x01404000}, | 611 | {0x0000a614, 0x02004000, 0x02004000, 0x01404000, 0x01404000}, |
| 612 | {0x0000a618, 0x01804601, 0x01804601, 0x01404501, 0x01404501}, | 612 | {0x0000a618, 0x02004801, 0x02004801, 0x01404501, 0x01404501}, |
| 613 | {0x0000a61c, 0x01804601, 0x01804601, 0x02008501, 0x02008501}, | 613 | {0x0000a61c, 0x02808a02, 0x02808a02, 0x02008501, 0x02008501}, |
| 614 | {0x0000a620, 0x03408d02, 0x03408d02, 0x0280ca03, 0x0280ca03}, | 614 | {0x0000a620, 0x0380ce03, 0x0380ce03, 0x0280ca03, 0x0280ca03}, |
| 615 | {0x0000a624, 0x0300cc03, 0x0300cc03, 0x03010c04, 0x03010c04}, | 615 | {0x0000a624, 0x04411104, 0x04411104, 0x03010c04, 0x03010c04}, |
| 616 | {0x0000a628, 0x03410d04, 0x03410d04, 0x04014c04, 0x04014c04}, | 616 | {0x0000a628, 0x04411104, 0x04411104, 0x04014c04, 0x04014c04}, |
| 617 | {0x0000a62c, 0x03410d04, 0x03410d04, 0x04015005, 0x04015005}, | 617 | {0x0000a62c, 0x04411104, 0x04411104, 0x04015005, 0x04015005}, |
| 618 | {0x0000a630, 0x03410d04, 0x03410d04, 0x04015005, 0x04015005}, | 618 | {0x0000a630, 0x04411104, 0x04411104, 0x04015005, 0x04015005}, |
| 619 | {0x0000a634, 0x03410d04, 0x03410d04, 0x04015005, 0x04015005}, | 619 | {0x0000a634, 0x04411104, 0x04411104, 0x04015005, 0x04015005}, |
| 620 | {0x0000a638, 0x03410d04, 0x03410d04, 0x04015005, 0x04015005}, | 620 | {0x0000a638, 0x04411104, 0x04411104, 0x04015005, 0x04015005}, |
| 621 | {0x0000a63c, 0x03410d04, 0x03410d04, 0x04015005, 0x04015005}, | 621 | {0x0000a63c, 0x04411104, 0x04411104, 0x04015005, 0x04015005}, |
| 622 | {0x0000b2dc, 0x000cfff0, 0x000cfff0, 0x03aaa352, 0x03aaa352}, | 622 | {0x0000b2dc, 0x00033800, 0x00033800, 0x03aaa352, 0x03aaa352}, |
| 623 | {0x0000b2e0, 0x000f0000, 0x000f0000, 0x03ccc584, 0x03ccc584}, | 623 | {0x0000b2e0, 0x0003c000, 0x0003c000, 0x03ccc584, 0x03ccc584}, |
| 624 | {0x0000b2e4, 0x03f00000, 0x03f00000, 0x03f0f800, 0x03f0f800}, | 624 | {0x0000b2e4, 0x03fc0000, 0x03fc0000, 0x03f0f800, 0x03f0f800}, |
| 625 | {0x0000b2e8, 0x00000000, 0x00000000, 0x03ff0000, 0x03ff0000}, | 625 | {0x0000b2e8, 0x00000000, 0x00000000, 0x03ff0000, 0x03ff0000}, |
| 626 | {0x0000c2dc, 0x000cfff0, 0x000cfff0, 0x03aaa352, 0x03aaa352}, | 626 | {0x0000c2dc, 0x00033800, 0x00033800, 0x03aaa352, 0x03aaa352}, |
| 627 | {0x0000c2e0, 0x000f0000, 0x000f0000, 0x03ccc584, 0x03ccc584}, | 627 | {0x0000c2e0, 0x0003c000, 0x0003c000, 0x03ccc584, 0x03ccc584}, |
| 628 | {0x0000c2e4, 0x03f00000, 0x03f00000, 0x03f0f800, 0x03f0f800}, | 628 | {0x0000c2e4, 0x03fc0000, 0x03fc0000, 0x03f0f800, 0x03f0f800}, |
| 629 | {0x0000c2e8, 0x00000000, 0x00000000, 0x03ff0000, 0x03ff0000}, | 629 | {0x0000c2e8, 0x00000000, 0x00000000, 0x03ff0000, 0x03ff0000}, |
| 630 | {0x00016044, 0x012492d4, 0x012492d4, 0x012492d4, 0x012492d4}, | 630 | {0x00016044, 0x012492d4, 0x012492d4, 0x012492d4, 0x012492d4}, |
| 631 | {0x00016048, 0x61200001, 0x61200001, 0x66480001, 0x66480001}, | 631 | {0x00016048, 0x66480001, 0x66480001, 0x66480001, 0x66480001}, |
| 632 | {0x00016068, 0x6db6db6c, 0x6db6db6c, 0x6db6db6c, 0x6db6db6c}, | 632 | {0x00016068, 0x6db6db6c, 0x6db6db6c, 0x6db6db6c, 0x6db6db6c}, |
| 633 | {0x00016444, 0x012492d4, 0x012492d4, 0x012492d4, 0x012492d4}, | 633 | {0x00016444, 0x012492d4, 0x012492d4, 0x012492d4, 0x012492d4}, |
| 634 | {0x00016448, 0x61200001, 0x61200001, 0x66480001, 0x66480001}, | 634 | {0x00016448, 0x66480001, 0x66480001, 0x66480001, 0x66480001}, |
| 635 | {0x00016468, 0x6db6db6c, 0x6db6db6c, 0x6db6db6c, 0x6db6db6c}, | 635 | {0x00016468, 0x6db6db6c, 0x6db6db6c, 0x6db6db6c, 0x6db6db6c}, |
| 636 | {0x00016844, 0x012492d4, 0x012492d4, 0x012492d4, 0x012492d4}, | 636 | {0x00016844, 0x012492d4, 0x012492d4, 0x012492d4, 0x012492d4}, |
| 637 | {0x00016848, 0x61200001, 0x61200001, 0x66480001, 0x66480001}, | 637 | {0x00016848, 0x66480001, 0x66480001, 0x66480001, 0x66480001}, |
| 638 | {0x00016868, 0x6db6db6c, 0x6db6db6c, 0x6db6db6c, 0x6db6db6c}, | 638 | {0x00016868, 0x6db6db6c, 0x6db6db6c, 0x6db6db6c, 0x6db6db6c}, |
| 639 | }; | 639 | }; |
| 640 | 640 | ||
diff --git a/drivers/net/wireless/ath/ath9k/hif_usb.c b/drivers/net/wireless/ath/ath9k/hif_usb.c index 924c4616c3d9..f5dda84176c3 100644 --- a/drivers/net/wireless/ath/ath9k/hif_usb.c +++ b/drivers/net/wireless/ath/ath9k/hif_usb.c | |||
| @@ -38,6 +38,7 @@ static struct usb_device_id ath9k_hif_usb_ids[] = { | |||
| 38 | { USB_DEVICE(0x04CA, 0x4605) }, /* Liteon */ | 38 | { USB_DEVICE(0x04CA, 0x4605) }, /* Liteon */ |
| 39 | { USB_DEVICE(0x040D, 0x3801) }, /* VIA */ | 39 | { USB_DEVICE(0x040D, 0x3801) }, /* VIA */ |
| 40 | { USB_DEVICE(0x0cf3, 0xb003) }, /* Ubiquiti WifiStation Ext */ | 40 | { USB_DEVICE(0x0cf3, 0xb003) }, /* Ubiquiti WifiStation Ext */ |
| 41 | { USB_DEVICE(0x0cf3, 0xb002) }, /* Ubiquiti WifiStation */ | ||
| 41 | { USB_DEVICE(0x057c, 0x8403) }, /* AVM FRITZ!WLAN 11N v2 USB */ | 42 | { USB_DEVICE(0x057c, 0x8403) }, /* AVM FRITZ!WLAN 11N v2 USB */ |
| 42 | 43 | ||
| 43 | { USB_DEVICE(0x0cf3, 0x7015), | 44 | { USB_DEVICE(0x0cf3, 0x7015), |
diff --git a/drivers/net/wireless/b43/main.c b/drivers/net/wireless/b43/main.c index 73730e94e0ac..c5a99c8c8168 100644 --- a/drivers/net/wireless/b43/main.c +++ b/drivers/net/wireless/b43/main.c | |||
| @@ -5404,6 +5404,8 @@ static void b43_bcma_remove(struct bcma_device *core) | |||
| 5404 | cancel_work_sync(&wldev->restart_work); | 5404 | cancel_work_sync(&wldev->restart_work); |
| 5405 | 5405 | ||
| 5406 | B43_WARN_ON(!wl); | 5406 | B43_WARN_ON(!wl); |
| 5407 | if (!wldev->fw.ucode.data) | ||
| 5408 | return; /* NULL if firmware never loaded */ | ||
| 5407 | if (wl->current_dev == wldev && wl->hw_registred) { | 5409 | if (wl->current_dev == wldev && wl->hw_registred) { |
| 5408 | b43_leds_stop(wldev); | 5410 | b43_leds_stop(wldev); |
| 5409 | ieee80211_unregister_hw(wl->hw); | 5411 | ieee80211_unregister_hw(wl->hw); |
| @@ -5478,6 +5480,8 @@ static void b43_ssb_remove(struct ssb_device *sdev) | |||
| 5478 | cancel_work_sync(&wldev->restart_work); | 5480 | cancel_work_sync(&wldev->restart_work); |
| 5479 | 5481 | ||
| 5480 | B43_WARN_ON(!wl); | 5482 | B43_WARN_ON(!wl); |
| 5483 | if (!wldev->fw.ucode.data) | ||
| 5484 | return; /* NULL if firmware never loaded */ | ||
| 5481 | if (wl->current_dev == wldev && wl->hw_registred) { | 5485 | if (wl->current_dev == wldev && wl->hw_registred) { |
| 5482 | b43_leds_stop(wldev); | 5486 | b43_leds_stop(wldev); |
| 5483 | ieee80211_unregister_hw(wl->hw); | 5487 | ieee80211_unregister_hw(wl->hw); |
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/usb.c b/drivers/net/wireless/brcm80211/brcmfmac/usb.c index a2b4b1e71017..7a6dfdc67b6c 100644 --- a/drivers/net/wireless/brcm80211/brcmfmac/usb.c +++ b/drivers/net/wireless/brcm80211/brcmfmac/usb.c | |||
| @@ -1339,7 +1339,7 @@ static int brcmf_usb_probe_cb(struct brcmf_usbdev_info *devinfo, | |||
| 1339 | } | 1339 | } |
| 1340 | 1340 | ||
| 1341 | ret = brcmf_bus_start(dev); | 1341 | ret = brcmf_bus_start(dev); |
| 1342 | if (ret == -ENOLINK) { | 1342 | if (ret) { |
| 1343 | brcmf_dbg(ERROR, "dongle is not responding\n"); | 1343 | brcmf_dbg(ERROR, "dongle is not responding\n"); |
| 1344 | brcmf_detach(dev); | 1344 | brcmf_detach(dev); |
| 1345 | goto fail; | 1345 | goto fail; |
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c b/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c index c1abaa6db59e..a6f1e8166008 100644 --- a/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c +++ b/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c | |||
| @@ -3569,7 +3569,7 @@ brcmf_cfg80211_sched_scan_start(struct wiphy *wiphy, | |||
| 3569 | 3569 | ||
| 3570 | if (!request || !request->n_ssids || !request->n_match_sets) { | 3570 | if (!request || !request->n_ssids || !request->n_match_sets) { |
| 3571 | WL_ERR("Invalid sched scan req!! n_ssids:%d\n", | 3571 | WL_ERR("Invalid sched scan req!! n_ssids:%d\n", |
| 3572 | request->n_ssids); | 3572 | request ? request->n_ssids : 0); |
| 3573 | return -EINVAL; | 3573 | return -EINVAL; |
| 3574 | } | 3574 | } |
| 3575 | 3575 | ||
| @@ -3972,7 +3972,7 @@ brcmf_set_management_ie(struct brcmf_cfg80211_info *cfg, | |||
| 3972 | u8 *iovar_ie_buf; | 3972 | u8 *iovar_ie_buf; |
| 3973 | u8 *curr_ie_buf; | 3973 | u8 *curr_ie_buf; |
| 3974 | u8 *mgmt_ie_buf = NULL; | 3974 | u8 *mgmt_ie_buf = NULL; |
| 3975 | u32 mgmt_ie_buf_len = 0; | 3975 | int mgmt_ie_buf_len; |
| 3976 | u32 *mgmt_ie_len = 0; | 3976 | u32 *mgmt_ie_len = 0; |
| 3977 | u32 del_add_ie_buf_len = 0; | 3977 | u32 del_add_ie_buf_len = 0; |
| 3978 | u32 total_ie_buf_len = 0; | 3978 | u32 total_ie_buf_len = 0; |
| @@ -3982,7 +3982,7 @@ brcmf_set_management_ie(struct brcmf_cfg80211_info *cfg, | |||
| 3982 | struct parsed_vndr_ie_info *vndrie_info; | 3982 | struct parsed_vndr_ie_info *vndrie_info; |
| 3983 | s32 i; | 3983 | s32 i; |
| 3984 | u8 *ptr; | 3984 | u8 *ptr; |
| 3985 | u32 remained_buf_len; | 3985 | int remained_buf_len; |
| 3986 | 3986 | ||
| 3987 | WL_TRACE("bssidx %d, pktflag : 0x%02X\n", bssidx, pktflag); | 3987 | WL_TRACE("bssidx %d, pktflag : 0x%02X\n", bssidx, pktflag); |
| 3988 | iovar_ie_buf = kzalloc(WL_EXTRA_BUF_MAX, GFP_KERNEL); | 3988 | iovar_ie_buf = kzalloc(WL_EXTRA_BUF_MAX, GFP_KERNEL); |
| @@ -4606,12 +4606,13 @@ brcmf_bss_roaming_done(struct brcmf_cfg80211_info *cfg, | |||
| 4606 | struct brcmf_cfg80211_profile *profile = cfg->profile; | 4606 | struct brcmf_cfg80211_profile *profile = cfg->profile; |
| 4607 | struct brcmf_cfg80211_connect_info *conn_info = cfg_to_conn(cfg); | 4607 | struct brcmf_cfg80211_connect_info *conn_info = cfg_to_conn(cfg); |
| 4608 | struct wiphy *wiphy = cfg_to_wiphy(cfg); | 4608 | struct wiphy *wiphy = cfg_to_wiphy(cfg); |
| 4609 | struct brcmf_channel_info_le channel_le; | 4609 | struct ieee80211_channel *notify_channel = NULL; |
| 4610 | struct ieee80211_channel *notify_channel; | ||
| 4611 | struct ieee80211_supported_band *band; | 4610 | struct ieee80211_supported_band *band; |
| 4611 | struct brcmf_bss_info_le *bi; | ||
| 4612 | u32 freq; | 4612 | u32 freq; |
| 4613 | s32 err = 0; | 4613 | s32 err = 0; |
| 4614 | u32 target_channel; | 4614 | u32 target_channel; |
| 4615 | u8 *buf; | ||
| 4615 | 4616 | ||
| 4616 | WL_TRACE("Enter\n"); | 4617 | WL_TRACE("Enter\n"); |
| 4617 | 4618 | ||
| @@ -4619,11 +4620,22 @@ brcmf_bss_roaming_done(struct brcmf_cfg80211_info *cfg, | |||
| 4619 | memcpy(profile->bssid, e->addr, ETH_ALEN); | 4620 | memcpy(profile->bssid, e->addr, ETH_ALEN); |
| 4620 | brcmf_update_bss_info(cfg); | 4621 | brcmf_update_bss_info(cfg); |
| 4621 | 4622 | ||
| 4622 | brcmf_exec_dcmd(ndev, BRCMF_C_GET_CHANNEL, &channel_le, | 4623 | buf = kzalloc(WL_BSS_INFO_MAX, GFP_KERNEL); |
| 4623 | sizeof(channel_le)); | 4624 | if (buf == NULL) { |
| 4625 | err = -ENOMEM; | ||
| 4626 | goto done; | ||
| 4627 | } | ||
| 4628 | |||
| 4629 | /* data sent to dongle has to be little endian */ | ||
| 4630 | *(__le32 *)buf = cpu_to_le32(WL_BSS_INFO_MAX); | ||
| 4631 | err = brcmf_exec_dcmd(ndev, BRCMF_C_GET_BSS_INFO, buf, WL_BSS_INFO_MAX); | ||
| 4632 | |||
| 4633 | if (err) | ||
| 4634 | goto done; | ||
| 4624 | 4635 | ||
| 4625 | target_channel = le32_to_cpu(channel_le.target_channel); | 4636 | bi = (struct brcmf_bss_info_le *)(buf + 4); |
| 4626 | WL_CONN("Roamed to channel %d\n", target_channel); | 4637 | target_channel = bi->ctl_ch ? bi->ctl_ch : |
| 4638 | CHSPEC_CHANNEL(le16_to_cpu(bi->chanspec)); | ||
| 4627 | 4639 | ||
| 4628 | if (target_channel <= CH_MAX_2G_CHANNEL) | 4640 | if (target_channel <= CH_MAX_2G_CHANNEL) |
| 4629 | band = wiphy->bands[IEEE80211_BAND_2GHZ]; | 4641 | band = wiphy->bands[IEEE80211_BAND_2GHZ]; |
| @@ -4633,6 +4645,8 @@ brcmf_bss_roaming_done(struct brcmf_cfg80211_info *cfg, | |||
| 4633 | freq = ieee80211_channel_to_frequency(target_channel, band->band); | 4645 | freq = ieee80211_channel_to_frequency(target_channel, band->band); |
| 4634 | notify_channel = ieee80211_get_channel(wiphy, freq); | 4646 | notify_channel = ieee80211_get_channel(wiphy, freq); |
| 4635 | 4647 | ||
| 4648 | done: | ||
| 4649 | kfree(buf); | ||
| 4636 | cfg80211_roamed(ndev, notify_channel, (u8 *)profile->bssid, | 4650 | cfg80211_roamed(ndev, notify_channel, (u8 *)profile->bssid, |
| 4637 | conn_info->req_ie, conn_info->req_ie_len, | 4651 | conn_info->req_ie, conn_info->req_ie_len, |
| 4638 | conn_info->resp_ie, conn_info->resp_ie_len, GFP_KERNEL); | 4652 | conn_info->resp_ie, conn_info->resp_ie_len, GFP_KERNEL); |
| @@ -5186,41 +5200,6 @@ brcmf_cfg80211_event(struct net_device *ndev, | |||
| 5186 | schedule_work(&cfg->event_work); | 5200 | schedule_work(&cfg->event_work); |
| 5187 | } | 5201 | } |
| 5188 | 5202 | ||
| 5189 | static s32 brcmf_dongle_mode(struct net_device *ndev, s32 iftype) | ||
| 5190 | { | ||
| 5191 | s32 infra = 0; | ||
| 5192 | s32 err = 0; | ||
| 5193 | |||
| 5194 | switch (iftype) { | ||
| 5195 | case NL80211_IFTYPE_MONITOR: | ||
| 5196 | case NL80211_IFTYPE_WDS: | ||
| 5197 | WL_ERR("type (%d) : currently we do not support this mode\n", | ||
| 5198 | iftype); | ||
| 5199 | err = -EINVAL; | ||
| 5200 | return err; | ||
| 5201 | case NL80211_IFTYPE_ADHOC: | ||
| 5202 | infra = 0; | ||
| 5203 | break; | ||
| 5204 | case NL80211_IFTYPE_STATION: | ||
| 5205 | infra = 1; | ||
| 5206 | break; | ||
| 5207 | case NL80211_IFTYPE_AP: | ||
| 5208 | infra = 1; | ||
| 5209 | break; | ||
| 5210 | default: | ||
| 5211 | err = -EINVAL; | ||
| 5212 | WL_ERR("invalid type (%d)\n", iftype); | ||
| 5213 | return err; | ||
| 5214 | } | ||
| 5215 | err = brcmf_exec_dcmd_u32(ndev, BRCMF_C_SET_INFRA, &infra); | ||
| 5216 | if (err) { | ||
| 5217 | WL_ERR("WLC_SET_INFRA error (%d)\n", err); | ||
| 5218 | return err; | ||
| 5219 | } | ||
| 5220 | |||
| 5221 | return 0; | ||
| 5222 | } | ||
| 5223 | |||
| 5224 | static s32 brcmf_dongle_eventmsg(struct net_device *ndev) | 5203 | static s32 brcmf_dongle_eventmsg(struct net_device *ndev) |
| 5225 | { | 5204 | { |
| 5226 | /* Room for "event_msgs" + '\0' + bitvec */ | 5205 | /* Room for "event_msgs" + '\0' + bitvec */ |
| @@ -5439,7 +5418,8 @@ static s32 brcmf_config_dongle(struct brcmf_cfg80211_info *cfg) | |||
| 5439 | WL_BEACON_TIMEOUT); | 5418 | WL_BEACON_TIMEOUT); |
| 5440 | if (err) | 5419 | if (err) |
| 5441 | goto default_conf_out; | 5420 | goto default_conf_out; |
| 5442 | err = brcmf_dongle_mode(ndev, wdev->iftype); | 5421 | err = brcmf_cfg80211_change_iface(wdev->wiphy, ndev, wdev->iftype, |
| 5422 | NULL, NULL); | ||
| 5443 | if (err && err != -EINPROGRESS) | 5423 | if (err && err != -EINPROGRESS) |
| 5444 | goto default_conf_out; | 5424 | goto default_conf_out; |
| 5445 | err = brcmf_dongle_probecap(cfg); | 5425 | err = brcmf_dongle_probecap(cfg); |
diff --git a/drivers/net/wireless/ipw2x00/ipw2200.c b/drivers/net/wireless/ipw2x00/ipw2200.c index 935120fc8c93..768bf612533e 100644 --- a/drivers/net/wireless/ipw2x00/ipw2200.c +++ b/drivers/net/wireless/ipw2x00/ipw2200.c | |||
| @@ -10472,7 +10472,7 @@ static void ipw_handle_promiscuous_tx(struct ipw_priv *priv, | |||
| 10472 | } else | 10472 | } else |
| 10473 | len = src->len; | 10473 | len = src->len; |
| 10474 | 10474 | ||
| 10475 | dst = alloc_skb(len + sizeof(*rt_hdr), GFP_ATOMIC); | 10475 | dst = alloc_skb(len + sizeof(*rt_hdr) + sizeof(u16)*2, GFP_ATOMIC); |
| 10476 | if (!dst) | 10476 | if (!dst) |
| 10477 | continue; | 10477 | continue; |
| 10478 | 10478 | ||
diff --git a/drivers/net/wireless/iwlwifi/dvm/devices.c b/drivers/net/wireless/iwlwifi/dvm/devices.c index 349c205d5f62..da5862064195 100644 --- a/drivers/net/wireless/iwlwifi/dvm/devices.c +++ b/drivers/net/wireless/iwlwifi/dvm/devices.c | |||
| @@ -518,7 +518,7 @@ static int iwl6000_hw_channel_switch(struct iwl_priv *priv, | |||
| 518 | * See iwlagn_mac_channel_switch. | 518 | * See iwlagn_mac_channel_switch. |
| 519 | */ | 519 | */ |
| 520 | struct iwl_rxon_context *ctx = &priv->contexts[IWL_RXON_CTX_BSS]; | 520 | struct iwl_rxon_context *ctx = &priv->contexts[IWL_RXON_CTX_BSS]; |
| 521 | struct iwl6000_channel_switch_cmd cmd; | 521 | struct iwl6000_channel_switch_cmd *cmd; |
| 522 | u32 switch_time_in_usec, ucode_switch_time; | 522 | u32 switch_time_in_usec, ucode_switch_time; |
| 523 | u16 ch; | 523 | u16 ch; |
| 524 | u32 tsf_low; | 524 | u32 tsf_low; |
| @@ -527,18 +527,25 @@ static int iwl6000_hw_channel_switch(struct iwl_priv *priv, | |||
| 527 | struct ieee80211_vif *vif = ctx->vif; | 527 | struct ieee80211_vif *vif = ctx->vif; |
| 528 | struct iwl_host_cmd hcmd = { | 528 | struct iwl_host_cmd hcmd = { |
| 529 | .id = REPLY_CHANNEL_SWITCH, | 529 | .id = REPLY_CHANNEL_SWITCH, |
| 530 | .len = { sizeof(cmd), }, | 530 | .len = { sizeof(*cmd), }, |
| 531 | .flags = CMD_SYNC, | 531 | .flags = CMD_SYNC, |
| 532 | .data = { &cmd, }, | 532 | .dataflags[0] = IWL_HCMD_DFL_NOCOPY, |
| 533 | }; | 533 | }; |
| 534 | int err; | ||
| 534 | 535 | ||
| 535 | cmd.band = priv->band == IEEE80211_BAND_2GHZ; | 536 | cmd = kzalloc(sizeof(*cmd), GFP_KERNEL); |
| 537 | if (!cmd) | ||
| 538 | return -ENOMEM; | ||
| 539 | |||
| 540 | hcmd.data[0] = cmd; | ||
| 541 | |||
| 542 | cmd->band = priv->band == IEEE80211_BAND_2GHZ; | ||
| 536 | ch = ch_switch->channel->hw_value; | 543 | ch = ch_switch->channel->hw_value; |
| 537 | IWL_DEBUG_11H(priv, "channel switch from %u to %u\n", | 544 | IWL_DEBUG_11H(priv, "channel switch from %u to %u\n", |
| 538 | ctx->active.channel, ch); | 545 | ctx->active.channel, ch); |
| 539 | cmd.channel = cpu_to_le16(ch); | 546 | cmd->channel = cpu_to_le16(ch); |
| 540 | cmd.rxon_flags = ctx->staging.flags; | 547 | cmd->rxon_flags = ctx->staging.flags; |
| 541 | cmd.rxon_filter_flags = ctx->staging.filter_flags; | 548 | cmd->rxon_filter_flags = ctx->staging.filter_flags; |
| 542 | switch_count = ch_switch->count; | 549 | switch_count = ch_switch->count; |
| 543 | tsf_low = ch_switch->timestamp & 0x0ffffffff; | 550 | tsf_low = ch_switch->timestamp & 0x0ffffffff; |
| 544 | /* | 551 | /* |
| @@ -554,23 +561,25 @@ static int iwl6000_hw_channel_switch(struct iwl_priv *priv, | |||
| 554 | switch_count = 0; | 561 | switch_count = 0; |
| 555 | } | 562 | } |
| 556 | if (switch_count <= 1) | 563 | if (switch_count <= 1) |
| 557 | cmd.switch_time = cpu_to_le32(priv->ucode_beacon_time); | 564 | cmd->switch_time = cpu_to_le32(priv->ucode_beacon_time); |
| 558 | else { | 565 | else { |
| 559 | switch_time_in_usec = | 566 | switch_time_in_usec = |
| 560 | vif->bss_conf.beacon_int * switch_count * TIME_UNIT; | 567 | vif->bss_conf.beacon_int * switch_count * TIME_UNIT; |
| 561 | ucode_switch_time = iwl_usecs_to_beacons(priv, | 568 | ucode_switch_time = iwl_usecs_to_beacons(priv, |
| 562 | switch_time_in_usec, | 569 | switch_time_in_usec, |
| 563 | beacon_interval); | 570 | beacon_interval); |
| 564 | cmd.switch_time = iwl_add_beacon_time(priv, | 571 | cmd->switch_time = iwl_add_beacon_time(priv, |
| 565 | priv->ucode_beacon_time, | 572 | priv->ucode_beacon_time, |
| 566 | ucode_switch_time, | 573 | ucode_switch_time, |
| 567 | beacon_interval); | 574 | beacon_interval); |
| 568 | } | 575 | } |
| 569 | IWL_DEBUG_11H(priv, "uCode time for the switch is 0x%x\n", | 576 | IWL_DEBUG_11H(priv, "uCode time for the switch is 0x%x\n", |
| 570 | cmd.switch_time); | 577 | cmd->switch_time); |
| 571 | cmd.expect_beacon = ch_switch->channel->flags & IEEE80211_CHAN_RADAR; | 578 | cmd->expect_beacon = ch_switch->channel->flags & IEEE80211_CHAN_RADAR; |
| 572 | 579 | ||
| 573 | return iwl_dvm_send_cmd(priv, &hcmd); | 580 | err = iwl_dvm_send_cmd(priv, &hcmd); |
| 581 | kfree(cmd); | ||
| 582 | return err; | ||
| 574 | } | 583 | } |
| 575 | 584 | ||
| 576 | struct iwl_lib_ops iwl6000_lib = { | 585 | struct iwl_lib_ops iwl6000_lib = { |
diff --git a/drivers/net/wireless/mwifiex/cfg80211.c b/drivers/net/wireless/mwifiex/cfg80211.c index 0679458a1bac..780d3e168297 100644 --- a/drivers/net/wireless/mwifiex/cfg80211.c +++ b/drivers/net/wireless/mwifiex/cfg80211.c | |||
| @@ -1825,8 +1825,6 @@ mwifiex_cfg80211_scan(struct wiphy *wiphy, | |||
| 1825 | return -EBUSY; | 1825 | return -EBUSY; |
| 1826 | } | 1826 | } |
| 1827 | 1827 | ||
| 1828 | priv->scan_request = request; | ||
| 1829 | |||
| 1830 | priv->user_scan_cfg = kzalloc(sizeof(struct mwifiex_user_scan_cfg), | 1828 | priv->user_scan_cfg = kzalloc(sizeof(struct mwifiex_user_scan_cfg), |
| 1831 | GFP_KERNEL); | 1829 | GFP_KERNEL); |
| 1832 | if (!priv->user_scan_cfg) { | 1830 | if (!priv->user_scan_cfg) { |
| @@ -1834,6 +1832,8 @@ mwifiex_cfg80211_scan(struct wiphy *wiphy, | |||
| 1834 | return -ENOMEM; | 1832 | return -ENOMEM; |
| 1835 | } | 1833 | } |
| 1836 | 1834 | ||
| 1835 | priv->scan_request = request; | ||
| 1836 | |||
| 1837 | priv->user_scan_cfg->num_ssids = request->n_ssids; | 1837 | priv->user_scan_cfg->num_ssids = request->n_ssids; |
| 1838 | priv->user_scan_cfg->ssid_list = request->ssids; | 1838 | priv->user_scan_cfg->ssid_list = request->ssids; |
| 1839 | 1839 | ||
| @@ -1870,6 +1870,9 @@ mwifiex_cfg80211_scan(struct wiphy *wiphy, | |||
| 1870 | ret = mwifiex_scan_networks(priv, priv->user_scan_cfg); | 1870 | ret = mwifiex_scan_networks(priv, priv->user_scan_cfg); |
| 1871 | if (ret) { | 1871 | if (ret) { |
| 1872 | dev_err(priv->adapter->dev, "scan failed: %d\n", ret); | 1872 | dev_err(priv->adapter->dev, "scan failed: %d\n", ret); |
| 1873 | priv->scan_request = NULL; | ||
| 1874 | kfree(priv->user_scan_cfg); | ||
| 1875 | priv->user_scan_cfg = NULL; | ||
| 1873 | return ret; | 1876 | return ret; |
| 1874 | } | 1877 | } |
| 1875 | 1878 | ||
diff --git a/drivers/net/wireless/mwifiex/scan.c b/drivers/net/wireless/mwifiex/scan.c index 00b658d3b6ec..9171aaedbccd 100644 --- a/drivers/net/wireless/mwifiex/scan.c +++ b/drivers/net/wireless/mwifiex/scan.c | |||
| @@ -1843,21 +1843,18 @@ static int mwifiex_scan_specific_ssid(struct mwifiex_private *priv, | |||
| 1843 | struct cfg80211_ssid *req_ssid) | 1843 | struct cfg80211_ssid *req_ssid) |
| 1844 | { | 1844 | { |
| 1845 | struct mwifiex_adapter *adapter = priv->adapter; | 1845 | struct mwifiex_adapter *adapter = priv->adapter; |
| 1846 | int ret = 0; | 1846 | int ret; |
| 1847 | struct mwifiex_user_scan_cfg *scan_cfg; | 1847 | struct mwifiex_user_scan_cfg *scan_cfg; |
| 1848 | 1848 | ||
| 1849 | if (!req_ssid) | ||
| 1850 | return -1; | ||
| 1851 | |||
| 1852 | if (adapter->scan_processing) { | 1849 | if (adapter->scan_processing) { |
| 1853 | dev_dbg(adapter->dev, "cmd: Scan already in process...\n"); | 1850 | dev_err(adapter->dev, "cmd: Scan already in process...\n"); |
| 1854 | return ret; | 1851 | return -EBUSY; |
| 1855 | } | 1852 | } |
| 1856 | 1853 | ||
| 1857 | if (priv->scan_block) { | 1854 | if (priv->scan_block) { |
| 1858 | dev_dbg(adapter->dev, | 1855 | dev_err(adapter->dev, |
| 1859 | "cmd: Scan is blocked during association...\n"); | 1856 | "cmd: Scan is blocked during association...\n"); |
| 1860 | return ret; | 1857 | return -EBUSY; |
| 1861 | } | 1858 | } |
| 1862 | 1859 | ||
| 1863 | scan_cfg = kzalloc(sizeof(struct mwifiex_user_scan_cfg), GFP_KERNEL); | 1860 | scan_cfg = kzalloc(sizeof(struct mwifiex_user_scan_cfg), GFP_KERNEL); |
diff --git a/drivers/net/wireless/rt2x00/rt2500usb.c b/drivers/net/wireless/rt2x00/rt2500usb.c index a12e84f892be..6b2e1e431dd2 100644 --- a/drivers/net/wireless/rt2x00/rt2500usb.c +++ b/drivers/net/wireless/rt2x00/rt2500usb.c | |||
| @@ -1988,6 +1988,7 @@ static struct usb_driver rt2500usb_driver = { | |||
| 1988 | .disconnect = rt2x00usb_disconnect, | 1988 | .disconnect = rt2x00usb_disconnect, |
| 1989 | .suspend = rt2x00usb_suspend, | 1989 | .suspend = rt2x00usb_suspend, |
| 1990 | .resume = rt2x00usb_resume, | 1990 | .resume = rt2x00usb_resume, |
| 1991 | .reset_resume = rt2x00usb_resume, | ||
| 1991 | .disable_hub_initiated_lpm = 1, | 1992 | .disable_hub_initiated_lpm = 1, |
| 1992 | }; | 1993 | }; |
| 1993 | 1994 | ||
diff --git a/drivers/net/wireless/rt2x00/rt2800usb.c b/drivers/net/wireless/rt2x00/rt2800usb.c index c9e9370eb789..3b8fb5a603f2 100644 --- a/drivers/net/wireless/rt2x00/rt2800usb.c +++ b/drivers/net/wireless/rt2x00/rt2800usb.c | |||
| @@ -1282,6 +1282,7 @@ static struct usb_driver rt2800usb_driver = { | |||
| 1282 | .disconnect = rt2x00usb_disconnect, | 1282 | .disconnect = rt2x00usb_disconnect, |
| 1283 | .suspend = rt2x00usb_suspend, | 1283 | .suspend = rt2x00usb_suspend, |
| 1284 | .resume = rt2x00usb_resume, | 1284 | .resume = rt2x00usb_resume, |
| 1285 | .reset_resume = rt2x00usb_resume, | ||
| 1285 | .disable_hub_initiated_lpm = 1, | 1286 | .disable_hub_initiated_lpm = 1, |
| 1286 | }; | 1287 | }; |
| 1287 | 1288 | ||
diff --git a/drivers/net/wireless/rt2x00/rt73usb.c b/drivers/net/wireless/rt2x00/rt73usb.c index e5eb43b3eee7..24eec66e9fd2 100644 --- a/drivers/net/wireless/rt2x00/rt73usb.c +++ b/drivers/net/wireless/rt2x00/rt73usb.c | |||
| @@ -2535,6 +2535,7 @@ static struct usb_driver rt73usb_driver = { | |||
| 2535 | .disconnect = rt2x00usb_disconnect, | 2535 | .disconnect = rt2x00usb_disconnect, |
| 2536 | .suspend = rt2x00usb_suspend, | 2536 | .suspend = rt2x00usb_suspend, |
| 2537 | .resume = rt2x00usb_resume, | 2537 | .resume = rt2x00usb_resume, |
| 2538 | .reset_resume = rt2x00usb_resume, | ||
| 2538 | .disable_hub_initiated_lpm = 1, | 2539 | .disable_hub_initiated_lpm = 1, |
| 2539 | }; | 2540 | }; |
| 2540 | 2541 | ||
diff --git a/drivers/net/wireless/rtlwifi/usb.c b/drivers/net/wireless/rtlwifi/usb.c index 030beb45d8b0..e3ea4b346889 100644 --- a/drivers/net/wireless/rtlwifi/usb.c +++ b/drivers/net/wireless/rtlwifi/usb.c | |||
| @@ -673,7 +673,7 @@ static int rtl_usb_start(struct ieee80211_hw *hw) | |||
| 673 | set_hal_start(rtlhal); | 673 | set_hal_start(rtlhal); |
| 674 | 674 | ||
| 675 | /* Start bulk IN */ | 675 | /* Start bulk IN */ |
| 676 | _rtl_usb_receive(hw); | 676 | err = _rtl_usb_receive(hw); |
| 677 | } | 677 | } |
| 678 | 678 | ||
| 679 | return err; | 679 | return err; |
