diff options
Diffstat (limited to 'drivers/net')
103 files changed, 1244 insertions, 714 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/bonding/bond_sysfs.c b/drivers/net/bonding/bond_sysfs.c index dc15d248443f..ef8d2a080d17 100644 --- a/drivers/net/bonding/bond_sysfs.c +++ b/drivers/net/bonding/bond_sysfs.c | |||
@@ -1060,7 +1060,7 @@ static ssize_t bonding_store_primary(struct device *d, | |||
1060 | goto out; | 1060 | goto out; |
1061 | } | 1061 | } |
1062 | 1062 | ||
1063 | sscanf(buf, "%16s", ifname); /* IFNAMSIZ */ | 1063 | sscanf(buf, "%15s", ifname); /* IFNAMSIZ */ |
1064 | 1064 | ||
1065 | /* check to see if we are clearing primary */ | 1065 | /* check to see if we are clearing primary */ |
1066 | if (!strlen(ifname) || buf[0] == '\n') { | 1066 | if (!strlen(ifname) || buf[0] == '\n') { |
@@ -1237,7 +1237,7 @@ static ssize_t bonding_store_active_slave(struct device *d, | |||
1237 | goto out; | 1237 | goto out; |
1238 | } | 1238 | } |
1239 | 1239 | ||
1240 | sscanf(buf, "%16s", ifname); /* IFNAMSIZ */ | 1240 | sscanf(buf, "%15s", ifname); /* IFNAMSIZ */ |
1241 | 1241 | ||
1242 | /* check to see if we are clearing active */ | 1242 | /* check to see if we are clearing active */ |
1243 | if (!strlen(ifname) || buf[0] == '\n') { | 1243 | if (!strlen(ifname) || buf[0] == '\n') { |
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/amd/amd8111e.c b/drivers/net/ethernet/amd/amd8111e.c index 64d0d9c1afa2..3491d4312fc9 100644 --- a/drivers/net/ethernet/amd/amd8111e.c +++ b/drivers/net/ethernet/amd/amd8111e.c | |||
@@ -1845,6 +1845,7 @@ static int __devinit amd8111e_probe_one(struct pci_dev *pdev, | |||
1845 | if((pm_cap = pci_find_capability(pdev, PCI_CAP_ID_PM))==0){ | 1845 | if((pm_cap = pci_find_capability(pdev, PCI_CAP_ID_PM))==0){ |
1846 | printk(KERN_ERR "amd8111e: No Power Management capability, " | 1846 | printk(KERN_ERR "amd8111e: No Power Management capability, " |
1847 | "exiting.\n"); | 1847 | "exiting.\n"); |
1848 | err = -ENODEV; | ||
1848 | goto err_free_reg; | 1849 | goto err_free_reg; |
1849 | } | 1850 | } |
1850 | 1851 | ||
@@ -1852,6 +1853,7 @@ static int __devinit amd8111e_probe_one(struct pci_dev *pdev, | |||
1852 | if (pci_set_dma_mask(pdev, DMA_BIT_MASK(32)) < 0) { | 1853 | if (pci_set_dma_mask(pdev, DMA_BIT_MASK(32)) < 0) { |
1853 | printk(KERN_ERR "amd8111e: DMA not supported," | 1854 | printk(KERN_ERR "amd8111e: DMA not supported," |
1854 | "exiting.\n"); | 1855 | "exiting.\n"); |
1856 | err = -ENODEV; | ||
1855 | goto err_free_reg; | 1857 | goto err_free_reg; |
1856 | } | 1858 | } |
1857 | 1859 | ||
diff --git a/drivers/net/ethernet/amd/au1000_eth.c b/drivers/net/ethernet/amd/au1000_eth.c index 397596b078d9..f195acfa2df7 100644 --- a/drivers/net/ethernet/amd/au1000_eth.c +++ b/drivers/net/ethernet/amd/au1000_eth.c | |||
@@ -1174,8 +1174,10 @@ static int __devinit au1000_probe(struct platform_device *pdev) | |||
1174 | snprintf(aup->mii_bus->id, MII_BUS_ID_SIZE, "%s-%x", | 1174 | snprintf(aup->mii_bus->id, MII_BUS_ID_SIZE, "%s-%x", |
1175 | pdev->name, aup->mac_id); | 1175 | pdev->name, aup->mac_id); |
1176 | aup->mii_bus->irq = kmalloc(sizeof(int)*PHY_MAX_ADDR, GFP_KERNEL); | 1176 | aup->mii_bus->irq = kmalloc(sizeof(int)*PHY_MAX_ADDR, GFP_KERNEL); |
1177 | if (aup->mii_bus->irq == NULL) | 1177 | if (aup->mii_bus->irq == NULL) { |
1178 | err = -ENOMEM; | ||
1178 | goto err_out; | 1179 | goto err_out; |
1180 | } | ||
1179 | 1181 | ||
1180 | for (i = 0; i < PHY_MAX_ADDR; ++i) | 1182 | for (i = 0; i < PHY_MAX_ADDR; ++i) |
1181 | aup->mii_bus->irq[i] = PHY_POLL; | 1183 | aup->mii_bus->irq[i] = PHY_POLL; |
@@ -1190,7 +1192,8 @@ static int __devinit au1000_probe(struct platform_device *pdev) | |||
1190 | goto err_mdiobus_reg; | 1192 | goto err_mdiobus_reg; |
1191 | } | 1193 | } |
1192 | 1194 | ||
1193 | if (au1000_mii_probe(dev) != 0) | 1195 | err = au1000_mii_probe(dev); |
1196 | if (err != 0) | ||
1194 | goto err_out; | 1197 | goto err_out; |
1195 | 1198 | ||
1196 | pDBfree = NULL; | 1199 | pDBfree = NULL; |
@@ -1205,6 +1208,7 @@ static int __devinit au1000_probe(struct platform_device *pdev) | |||
1205 | } | 1208 | } |
1206 | aup->pDBfree = pDBfree; | 1209 | aup->pDBfree = pDBfree; |
1207 | 1210 | ||
1211 | err = -ENODEV; | ||
1208 | for (i = 0; i < NUM_RX_DMA; i++) { | 1212 | for (i = 0; i < NUM_RX_DMA; i++) { |
1209 | pDB = au1000_GetFreeDB(aup); | 1213 | pDB = au1000_GetFreeDB(aup); |
1210 | if (!pDB) | 1214 | if (!pDB) |
@@ -1213,6 +1217,8 @@ static int __devinit au1000_probe(struct platform_device *pdev) | |||
1213 | aup->rx_dma_ring[i]->buff_stat = (unsigned)pDB->dma_addr; | 1217 | aup->rx_dma_ring[i]->buff_stat = (unsigned)pDB->dma_addr; |
1214 | aup->rx_db_inuse[i] = pDB; | 1218 | aup->rx_db_inuse[i] = pDB; |
1215 | } | 1219 | } |
1220 | |||
1221 | err = -ENODEV; | ||
1216 | for (i = 0; i < NUM_TX_DMA; i++) { | 1222 | for (i = 0; i < NUM_TX_DMA; i++) { |
1217 | pDB = au1000_GetFreeDB(aup); | 1223 | pDB = au1000_GetFreeDB(aup); |
1218 | if (!pDB) | 1224 | if (!pDB) |
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_link.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_link.c index e2e45ee5df33..6dd0dd076cc5 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_link.c +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_link.c | |||
@@ -137,7 +137,16 @@ | |||
137 | #define LINK_20GTFD LINK_STATUS_SPEED_AND_DUPLEX_20GTFD | 137 | #define LINK_20GTFD LINK_STATUS_SPEED_AND_DUPLEX_20GTFD |
138 | #define LINK_20GXFD LINK_STATUS_SPEED_AND_DUPLEX_20GXFD | 138 | #define LINK_20GXFD LINK_STATUS_SPEED_AND_DUPLEX_20GXFD |
139 | 139 | ||
140 | 140 | #define LINK_UPDATE_MASK \ | |
141 | (LINK_STATUS_SPEED_AND_DUPLEX_MASK | \ | ||
142 | LINK_STATUS_LINK_UP | \ | ||
143 | LINK_STATUS_PHYSICAL_LINK_FLAG | \ | ||
144 | LINK_STATUS_AUTO_NEGOTIATE_COMPLETE | \ | ||
145 | LINK_STATUS_RX_FLOW_CONTROL_FLAG_MASK | \ | ||
146 | LINK_STATUS_TX_FLOW_CONTROL_FLAG_MASK | \ | ||
147 | LINK_STATUS_PARALLEL_DETECTION_FLAG_MASK | \ | ||
148 | LINK_STATUS_LINK_PARTNER_SYMMETRIC_PAUSE | \ | ||
149 | LINK_STATUS_LINK_PARTNER_ASYMMETRIC_PAUSE) | ||
141 | 150 | ||
142 | #define SFP_EEPROM_CON_TYPE_ADDR 0x2 | 151 | #define SFP_EEPROM_CON_TYPE_ADDR 0x2 |
143 | #define SFP_EEPROM_CON_TYPE_VAL_LC 0x7 | 152 | #define SFP_EEPROM_CON_TYPE_VAL_LC 0x7 |
@@ -3295,6 +3304,21 @@ static void bnx2x_serdes_deassert(struct bnx2x *bp, u8 port) | |||
3295 | DEFAULT_PHY_DEV_ADDR); | 3304 | DEFAULT_PHY_DEV_ADDR); |
3296 | } | 3305 | } |
3297 | 3306 | ||
3307 | static void bnx2x_xgxs_specific_func(struct bnx2x_phy *phy, | ||
3308 | struct link_params *params, | ||
3309 | u32 action) | ||
3310 | { | ||
3311 | struct bnx2x *bp = params->bp; | ||
3312 | switch (action) { | ||
3313 | case PHY_INIT: | ||
3314 | /* Set correct devad */ | ||
3315 | REG_WR(bp, NIG_REG_XGXS0_CTRL_MD_ST + params->port*0x18, 0); | ||
3316 | REG_WR(bp, NIG_REG_XGXS0_CTRL_MD_DEVAD + params->port*0x18, | ||
3317 | phy->def_md_devad); | ||
3318 | break; | ||
3319 | } | ||
3320 | } | ||
3321 | |||
3298 | static void bnx2x_xgxs_deassert(struct link_params *params) | 3322 | static void bnx2x_xgxs_deassert(struct link_params *params) |
3299 | { | 3323 | { |
3300 | struct bnx2x *bp = params->bp; | 3324 | struct bnx2x *bp = params->bp; |
@@ -3309,10 +3333,8 @@ static void bnx2x_xgxs_deassert(struct link_params *params) | |||
3309 | REG_WR(bp, GRCBASE_MISC + MISC_REGISTERS_RESET_REG_3_CLEAR, val); | 3333 | REG_WR(bp, GRCBASE_MISC + MISC_REGISTERS_RESET_REG_3_CLEAR, val); |
3310 | udelay(500); | 3334 | udelay(500); |
3311 | REG_WR(bp, GRCBASE_MISC + MISC_REGISTERS_RESET_REG_3_SET, val); | 3335 | REG_WR(bp, GRCBASE_MISC + MISC_REGISTERS_RESET_REG_3_SET, val); |
3312 | 3336 | bnx2x_xgxs_specific_func(¶ms->phy[INT_PHY], params, | |
3313 | REG_WR(bp, NIG_REG_XGXS0_CTRL_MD_ST + port*0x18, 0); | 3337 | PHY_INIT); |
3314 | REG_WR(bp, NIG_REG_XGXS0_CTRL_MD_DEVAD + port*0x18, | ||
3315 | params->phy[INT_PHY].def_md_devad); | ||
3316 | } | 3338 | } |
3317 | 3339 | ||
3318 | static void bnx2x_calc_ieee_aneg_adv(struct bnx2x_phy *phy, | 3340 | static void bnx2x_calc_ieee_aneg_adv(struct bnx2x_phy *phy, |
@@ -3545,14 +3567,11 @@ static void bnx2x_warpcore_set_lpi_passthrough(struct bnx2x_phy *phy, | |||
3545 | static void bnx2x_warpcore_enable_AN_KR(struct bnx2x_phy *phy, | 3567 | static void bnx2x_warpcore_enable_AN_KR(struct bnx2x_phy *phy, |
3546 | struct link_params *params, | 3568 | struct link_params *params, |
3547 | struct link_vars *vars) { | 3569 | struct link_vars *vars) { |
3548 | u16 val16 = 0, lane, i; | 3570 | u16 lane, i, cl72_ctrl, an_adv = 0; |
3571 | u16 ucode_ver; | ||
3549 | struct bnx2x *bp = params->bp; | 3572 | struct bnx2x *bp = params->bp; |
3550 | static struct bnx2x_reg_set reg_set[] = { | 3573 | static struct bnx2x_reg_set reg_set[] = { |
3551 | {MDIO_WC_DEVAD, MDIO_WC_REG_SERDESDIGITAL_CONTROL1000X2, 0x7}, | 3574 | {MDIO_WC_DEVAD, MDIO_WC_REG_SERDESDIGITAL_CONTROL1000X2, 0x7}, |
3552 | {MDIO_AN_DEVAD, MDIO_WC_REG_PAR_DET_10G_CTRL, 0}, | ||
3553 | {MDIO_WC_DEVAD, MDIO_WC_REG_CL72_USERB0_CL72_MISC1_CONTROL, 0}, | ||
3554 | {MDIO_WC_DEVAD, MDIO_WC_REG_XGXSBLK1_LANECTRL0, 0xff}, | ||
3555 | {MDIO_WC_DEVAD, MDIO_WC_REG_XGXSBLK1_LANECTRL1, 0x5555}, | ||
3556 | {MDIO_PMA_DEVAD, MDIO_WC_REG_IEEE0BLK_AUTONEGNP, 0x0}, | 3575 | {MDIO_PMA_DEVAD, MDIO_WC_REG_IEEE0BLK_AUTONEGNP, 0x0}, |
3557 | {MDIO_WC_DEVAD, MDIO_WC_REG_RX66_CONTROL, 0x7415}, | 3576 | {MDIO_WC_DEVAD, MDIO_WC_REG_RX66_CONTROL, 0x7415}, |
3558 | {MDIO_WC_DEVAD, MDIO_WC_REG_SERDESDIGITAL_MISC2, 0x6190}, | 3577 | {MDIO_WC_DEVAD, MDIO_WC_REG_SERDESDIGITAL_MISC2, 0x6190}, |
@@ -3565,12 +3584,19 @@ static void bnx2x_warpcore_enable_AN_KR(struct bnx2x_phy *phy, | |||
3565 | bnx2x_cl45_write(bp, phy, reg_set[i].devad, reg_set[i].reg, | 3584 | bnx2x_cl45_write(bp, phy, reg_set[i].devad, reg_set[i].reg, |
3566 | reg_set[i].val); | 3585 | reg_set[i].val); |
3567 | 3586 | ||
3587 | bnx2x_cl45_read(bp, phy, MDIO_WC_DEVAD, | ||
3588 | MDIO_WC_REG_CL72_USERB0_CL72_MISC1_CONTROL, &cl72_ctrl); | ||
3589 | cl72_ctrl &= 0xf8ff; | ||
3590 | cl72_ctrl |= 0x3800; | ||
3591 | bnx2x_cl45_write(bp, phy, MDIO_WC_DEVAD, | ||
3592 | MDIO_WC_REG_CL72_USERB0_CL72_MISC1_CONTROL, cl72_ctrl); | ||
3593 | |||
3568 | /* Check adding advertisement for 1G KX */ | 3594 | /* Check adding advertisement for 1G KX */ |
3569 | if (((vars->line_speed == SPEED_AUTO_NEG) && | 3595 | if (((vars->line_speed == SPEED_AUTO_NEG) && |
3570 | (phy->speed_cap_mask & PORT_HW_CFG_SPEED_CAPABILITY_D0_1G)) || | 3596 | (phy->speed_cap_mask & PORT_HW_CFG_SPEED_CAPABILITY_D0_1G)) || |
3571 | (vars->line_speed == SPEED_1000)) { | 3597 | (vars->line_speed == SPEED_1000)) { |
3572 | u32 addr = MDIO_WC_REG_SERDESDIGITAL_CONTROL1000X2; | 3598 | u32 addr = MDIO_WC_REG_SERDESDIGITAL_CONTROL1000X2; |
3573 | val16 |= (1<<5); | 3599 | an_adv |= (1<<5); |
3574 | 3600 | ||
3575 | /* Enable CL37 1G Parallel Detect */ | 3601 | /* Enable CL37 1G Parallel Detect */ |
3576 | bnx2x_cl45_read_or_write(bp, phy, MDIO_WC_DEVAD, addr, 0x1); | 3602 | bnx2x_cl45_read_or_write(bp, phy, MDIO_WC_DEVAD, addr, 0x1); |
@@ -3580,11 +3606,14 @@ static void bnx2x_warpcore_enable_AN_KR(struct bnx2x_phy *phy, | |||
3580 | (phy->speed_cap_mask & PORT_HW_CFG_SPEED_CAPABILITY_D0_10G)) || | 3606 | (phy->speed_cap_mask & PORT_HW_CFG_SPEED_CAPABILITY_D0_10G)) || |
3581 | (vars->line_speed == SPEED_10000)) { | 3607 | (vars->line_speed == SPEED_10000)) { |
3582 | /* Check adding advertisement for 10G KR */ | 3608 | /* Check adding advertisement for 10G KR */ |
3583 | val16 |= (1<<7); | 3609 | an_adv |= (1<<7); |
3584 | /* Enable 10G Parallel Detect */ | 3610 | /* Enable 10G Parallel Detect */ |
3611 | CL22_WR_OVER_CL45(bp, phy, MDIO_REG_BANK_AER_BLOCK, | ||
3612 | MDIO_AER_BLOCK_AER_REG, 0); | ||
3613 | |||
3585 | bnx2x_cl45_write(bp, phy, MDIO_AN_DEVAD, | 3614 | bnx2x_cl45_write(bp, phy, MDIO_AN_DEVAD, |
3586 | MDIO_WC_REG_PAR_DET_10G_CTRL, 1); | 3615 | MDIO_WC_REG_PAR_DET_10G_CTRL, 1); |
3587 | 3616 | bnx2x_set_aer_mmd(params, phy); | |
3588 | DP(NETIF_MSG_LINK, "Advertize 10G\n"); | 3617 | DP(NETIF_MSG_LINK, "Advertize 10G\n"); |
3589 | } | 3618 | } |
3590 | 3619 | ||
@@ -3604,7 +3633,7 @@ static void bnx2x_warpcore_enable_AN_KR(struct bnx2x_phy *phy, | |||
3604 | 3633 | ||
3605 | /* Advertised speeds */ | 3634 | /* Advertised speeds */ |
3606 | bnx2x_cl45_write(bp, phy, MDIO_AN_DEVAD, | 3635 | bnx2x_cl45_write(bp, phy, MDIO_AN_DEVAD, |
3607 | MDIO_WC_REG_AN_IEEE1BLK_AN_ADVERTISEMENT1, val16); | 3636 | MDIO_WC_REG_AN_IEEE1BLK_AN_ADVERTISEMENT1, an_adv); |
3608 | 3637 | ||
3609 | /* Advertised and set FEC (Forward Error Correction) */ | 3638 | /* Advertised and set FEC (Forward Error Correction) */ |
3610 | bnx2x_cl45_write(bp, phy, MDIO_AN_DEVAD, | 3639 | bnx2x_cl45_write(bp, phy, MDIO_AN_DEVAD, |
@@ -3628,9 +3657,10 @@ static void bnx2x_warpcore_enable_AN_KR(struct bnx2x_phy *phy, | |||
3628 | /* Set KR Autoneg Work-Around flag for Warpcore version older than D108 | 3657 | /* Set KR Autoneg Work-Around flag for Warpcore version older than D108 |
3629 | */ | 3658 | */ |
3630 | bnx2x_cl45_read(bp, phy, MDIO_WC_DEVAD, | 3659 | bnx2x_cl45_read(bp, phy, MDIO_WC_DEVAD, |
3631 | MDIO_WC_REG_UC_INFO_B1_VERSION, &val16); | 3660 | MDIO_WC_REG_UC_INFO_B1_VERSION, &ucode_ver); |
3632 | if (val16 < 0xd108) { | 3661 | if (ucode_ver < 0xd108) { |
3633 | DP(NETIF_MSG_LINK, "Enable AN KR work-around\n"); | 3662 | DP(NETIF_MSG_LINK, "Enable AN KR work-around. WC ver:0x%x\n", |
3663 | ucode_ver); | ||
3634 | vars->rx_tx_asic_rst = MAX_KR_LINK_RETRY; | 3664 | vars->rx_tx_asic_rst = MAX_KR_LINK_RETRY; |
3635 | } | 3665 | } |
3636 | bnx2x_cl45_read_or_write(bp, phy, MDIO_WC_DEVAD, | 3666 | bnx2x_cl45_read_or_write(bp, phy, MDIO_WC_DEVAD, |
@@ -3651,21 +3681,16 @@ static void bnx2x_warpcore_set_10G_KR(struct bnx2x_phy *phy, | |||
3651 | struct link_vars *vars) | 3681 | struct link_vars *vars) |
3652 | { | 3682 | { |
3653 | struct bnx2x *bp = params->bp; | 3683 | struct bnx2x *bp = params->bp; |
3654 | u16 i; | 3684 | u16 val16, i, lane; |
3655 | static struct bnx2x_reg_set reg_set[] = { | 3685 | static struct bnx2x_reg_set reg_set[] = { |
3656 | /* Disable Autoneg */ | 3686 | /* Disable Autoneg */ |
3657 | {MDIO_WC_DEVAD, MDIO_WC_REG_SERDESDIGITAL_CONTROL1000X2, 0x7}, | 3687 | {MDIO_WC_DEVAD, MDIO_WC_REG_SERDESDIGITAL_CONTROL1000X2, 0x7}, |
3658 | {MDIO_AN_DEVAD, MDIO_WC_REG_PAR_DET_10G_CTRL, 0}, | ||
3659 | {MDIO_WC_DEVAD, MDIO_WC_REG_CL72_USERB0_CL72_MISC1_CONTROL, | 3688 | {MDIO_WC_DEVAD, MDIO_WC_REG_CL72_USERB0_CL72_MISC1_CONTROL, |
3660 | 0x3f00}, | 3689 | 0x3f00}, |
3661 | {MDIO_AN_DEVAD, MDIO_WC_REG_AN_IEEE1BLK_AN_ADVERTISEMENT1, 0}, | 3690 | {MDIO_AN_DEVAD, MDIO_WC_REG_AN_IEEE1BLK_AN_ADVERTISEMENT1, 0}, |
3662 | {MDIO_AN_DEVAD, MDIO_WC_REG_IEEE0BLK_MIICNTL, 0x0}, | 3691 | {MDIO_AN_DEVAD, MDIO_WC_REG_IEEE0BLK_MIICNTL, 0x0}, |
3663 | {MDIO_WC_DEVAD, MDIO_WC_REG_DIGITAL3_UP1, 0x1}, | 3692 | {MDIO_WC_DEVAD, MDIO_WC_REG_DIGITAL3_UP1, 0x1}, |
3664 | {MDIO_WC_DEVAD, MDIO_WC_REG_DIGITAL5_MISC7, 0xa}, | 3693 | {MDIO_WC_DEVAD, MDIO_WC_REG_DIGITAL5_MISC7, 0xa}, |
3665 | /* Disable CL36 PCS Tx */ | ||
3666 | {MDIO_WC_DEVAD, MDIO_WC_REG_XGXSBLK1_LANECTRL0, 0x0}, | ||
3667 | /* Double Wide Single Data Rate @ pll rate */ | ||
3668 | {MDIO_WC_DEVAD, MDIO_WC_REG_XGXSBLK1_LANECTRL1, 0xFFFF}, | ||
3669 | /* Leave cl72 training enable, needed for KR */ | 3694 | /* Leave cl72 training enable, needed for KR */ |
3670 | {MDIO_PMA_DEVAD, | 3695 | {MDIO_PMA_DEVAD, |
3671 | MDIO_WC_REG_PMD_IEEE9BLK_TENGBASE_KR_PMD_CONTROL_REGISTER_150, | 3696 | MDIO_WC_REG_PMD_IEEE9BLK_TENGBASE_KR_PMD_CONTROL_REGISTER_150, |
@@ -3676,11 +3701,24 @@ static void bnx2x_warpcore_set_10G_KR(struct bnx2x_phy *phy, | |||
3676 | bnx2x_cl45_write(bp, phy, reg_set[i].devad, reg_set[i].reg, | 3701 | bnx2x_cl45_write(bp, phy, reg_set[i].devad, reg_set[i].reg, |
3677 | reg_set[i].val); | 3702 | reg_set[i].val); |
3678 | 3703 | ||
3679 | /* Leave CL72 enabled */ | 3704 | lane = bnx2x_get_warpcore_lane(phy, params); |
3680 | bnx2x_cl45_read_or_write(bp, phy, MDIO_WC_DEVAD, | 3705 | /* Global registers */ |
3681 | MDIO_WC_REG_CL72_USERB0_CL72_MISC1_CONTROL, | 3706 | CL22_WR_OVER_CL45(bp, phy, MDIO_REG_BANK_AER_BLOCK, |
3682 | 0x3800); | 3707 | MDIO_AER_BLOCK_AER_REG, 0); |
3708 | /* Disable CL36 PCS Tx */ | ||
3709 | bnx2x_cl45_read(bp, phy, MDIO_WC_DEVAD, | ||
3710 | MDIO_WC_REG_XGXSBLK1_LANECTRL0, &val16); | ||
3711 | val16 &= ~(0x0011 << lane); | ||
3712 | bnx2x_cl45_write(bp, phy, MDIO_WC_DEVAD, | ||
3713 | MDIO_WC_REG_XGXSBLK1_LANECTRL0, val16); | ||
3683 | 3714 | ||
3715 | bnx2x_cl45_read(bp, phy, MDIO_WC_DEVAD, | ||
3716 | MDIO_WC_REG_XGXSBLK1_LANECTRL1, &val16); | ||
3717 | val16 |= (0x0303 << (lane << 1)); | ||
3718 | bnx2x_cl45_write(bp, phy, MDIO_WC_DEVAD, | ||
3719 | MDIO_WC_REG_XGXSBLK1_LANECTRL1, val16); | ||
3720 | /* Restore AER */ | ||
3721 | bnx2x_set_aer_mmd(params, phy); | ||
3684 | /* Set speed via PMA/PMD register */ | 3722 | /* Set speed via PMA/PMD register */ |
3685 | bnx2x_cl45_write(bp, phy, MDIO_PMA_DEVAD, | 3723 | bnx2x_cl45_write(bp, phy, MDIO_PMA_DEVAD, |
3686 | MDIO_WC_REG_IEEE0BLK_MIICNTL, 0x2040); | 3724 | MDIO_WC_REG_IEEE0BLK_MIICNTL, 0x2040); |
@@ -4303,7 +4341,7 @@ static void bnx2x_warpcore_link_reset(struct bnx2x_phy *phy, | |||
4303 | struct link_params *params) | 4341 | struct link_params *params) |
4304 | { | 4342 | { |
4305 | struct bnx2x *bp = params->bp; | 4343 | struct bnx2x *bp = params->bp; |
4306 | u16 val16; | 4344 | u16 val16, lane; |
4307 | bnx2x_sfp_e3_set_transmitter(params, phy, 0); | 4345 | bnx2x_sfp_e3_set_transmitter(params, phy, 0); |
4308 | bnx2x_set_mdio_clk(bp, params->chip_id, params->port); | 4346 | bnx2x_set_mdio_clk(bp, params->chip_id, params->port); |
4309 | bnx2x_set_aer_mmd(params, phy); | 4347 | bnx2x_set_aer_mmd(params, phy); |
@@ -4340,6 +4378,30 @@ static void bnx2x_warpcore_link_reset(struct bnx2x_phy *phy, | |||
4340 | MDIO_WC_REG_XGXSBLK1_LANECTRL2, | 4378 | MDIO_WC_REG_XGXSBLK1_LANECTRL2, |
4341 | val16 & 0xff00); | 4379 | val16 & 0xff00); |
4342 | 4380 | ||
4381 | lane = bnx2x_get_warpcore_lane(phy, params); | ||
4382 | /* Disable CL36 PCS Tx */ | ||
4383 | bnx2x_cl45_read(bp, phy, MDIO_WC_DEVAD, | ||
4384 | MDIO_WC_REG_XGXSBLK1_LANECTRL0, &val16); | ||
4385 | val16 |= (0x11 << lane); | ||
4386 | if (phy->flags & FLAGS_WC_DUAL_MODE) | ||
4387 | val16 |= (0x22 << lane); | ||
4388 | bnx2x_cl45_write(bp, phy, MDIO_WC_DEVAD, | ||
4389 | MDIO_WC_REG_XGXSBLK1_LANECTRL0, val16); | ||
4390 | |||
4391 | bnx2x_cl45_read(bp, phy, MDIO_WC_DEVAD, | ||
4392 | MDIO_WC_REG_XGXSBLK1_LANECTRL1, &val16); | ||
4393 | val16 &= ~(0x0303 << (lane << 1)); | ||
4394 | val16 |= (0x0101 << (lane << 1)); | ||
4395 | if (phy->flags & FLAGS_WC_DUAL_MODE) { | ||
4396 | val16 &= ~(0x0c0c << (lane << 1)); | ||
4397 | val16 |= (0x0404 << (lane << 1)); | ||
4398 | } | ||
4399 | |||
4400 | bnx2x_cl45_write(bp, phy, MDIO_WC_DEVAD, | ||
4401 | MDIO_WC_REG_XGXSBLK1_LANECTRL1, val16); | ||
4402 | /* Restore AER */ | ||
4403 | bnx2x_set_aer_mmd(params, phy); | ||
4404 | |||
4343 | } | 4405 | } |
4344 | 4406 | ||
4345 | static void bnx2x_set_warpcore_loopback(struct bnx2x_phy *phy, | 4407 | static void bnx2x_set_warpcore_loopback(struct bnx2x_phy *phy, |
@@ -6296,15 +6358,7 @@ static int bnx2x_update_link_down(struct link_params *params, | |||
6296 | vars->mac_type = MAC_TYPE_NONE; | 6358 | vars->mac_type = MAC_TYPE_NONE; |
6297 | 6359 | ||
6298 | /* Update shared memory */ | 6360 | /* Update shared memory */ |
6299 | vars->link_status &= ~(LINK_STATUS_SPEED_AND_DUPLEX_MASK | | 6361 | vars->link_status &= ~LINK_UPDATE_MASK; |
6300 | LINK_STATUS_LINK_UP | | ||
6301 | LINK_STATUS_PHYSICAL_LINK_FLAG | | ||
6302 | LINK_STATUS_AUTO_NEGOTIATE_COMPLETE | | ||
6303 | LINK_STATUS_RX_FLOW_CONTROL_FLAG_MASK | | ||
6304 | LINK_STATUS_TX_FLOW_CONTROL_FLAG_MASK | | ||
6305 | LINK_STATUS_PARALLEL_DETECTION_FLAG_MASK | | ||
6306 | LINK_STATUS_LINK_PARTNER_SYMMETRIC_PAUSE | | ||
6307 | LINK_STATUS_LINK_PARTNER_ASYMMETRIC_PAUSE); | ||
6308 | vars->line_speed = 0; | 6362 | vars->line_speed = 0; |
6309 | bnx2x_update_mng(params, vars->link_status); | 6363 | bnx2x_update_mng(params, vars->link_status); |
6310 | 6364 | ||
@@ -6452,6 +6506,7 @@ int bnx2x_link_update(struct link_params *params, struct link_vars *vars) | |||
6452 | u16 ext_phy_line_speed = 0, prev_line_speed = vars->line_speed; | 6506 | u16 ext_phy_line_speed = 0, prev_line_speed = vars->line_speed; |
6453 | u8 active_external_phy = INT_PHY; | 6507 | u8 active_external_phy = INT_PHY; |
6454 | vars->phy_flags &= ~PHY_HALF_OPEN_CONN_FLAG; | 6508 | vars->phy_flags &= ~PHY_HALF_OPEN_CONN_FLAG; |
6509 | vars->link_status &= ~LINK_UPDATE_MASK; | ||
6455 | for (phy_index = INT_PHY; phy_index < params->num_phys; | 6510 | for (phy_index = INT_PHY; phy_index < params->num_phys; |
6456 | phy_index++) { | 6511 | phy_index++) { |
6457 | phy_vars[phy_index].flow_ctrl = 0; | 6512 | phy_vars[phy_index].flow_ctrl = 0; |
@@ -7579,7 +7634,7 @@ static void bnx2x_warpcore_power_module(struct link_params *params, | |||
7579 | static int bnx2x_warpcore_read_sfp_module_eeprom(struct bnx2x_phy *phy, | 7634 | static int bnx2x_warpcore_read_sfp_module_eeprom(struct bnx2x_phy *phy, |
7580 | struct link_params *params, | 7635 | struct link_params *params, |
7581 | u16 addr, u8 byte_cnt, | 7636 | u16 addr, u8 byte_cnt, |
7582 | u8 *o_buf) | 7637 | u8 *o_buf, u8 is_init) |
7583 | { | 7638 | { |
7584 | int rc = 0; | 7639 | int rc = 0; |
7585 | u8 i, j = 0, cnt = 0; | 7640 | u8 i, j = 0, cnt = 0; |
@@ -7596,10 +7651,10 @@ static int bnx2x_warpcore_read_sfp_module_eeprom(struct bnx2x_phy *phy, | |||
7596 | /* 4 byte aligned address */ | 7651 | /* 4 byte aligned address */ |
7597 | addr32 = addr & (~0x3); | 7652 | addr32 = addr & (~0x3); |
7598 | do { | 7653 | do { |
7599 | if (cnt == I2C_WA_PWR_ITER) { | 7654 | if ((!is_init) && (cnt == I2C_WA_PWR_ITER)) { |
7600 | bnx2x_warpcore_power_module(params, phy, 0); | 7655 | bnx2x_warpcore_power_module(params, phy, 0); |
7601 | /* Note that 100us are not enough here */ | 7656 | /* Note that 100us are not enough here */ |
7602 | usleep_range(1000,1000); | 7657 | usleep_range(1000, 2000); |
7603 | bnx2x_warpcore_power_module(params, phy, 1); | 7658 | bnx2x_warpcore_power_module(params, phy, 1); |
7604 | } | 7659 | } |
7605 | rc = bnx2x_bsc_read(params, phy, 0xa0, addr32, 0, byte_cnt, | 7660 | rc = bnx2x_bsc_read(params, phy, 0xa0, addr32, 0, byte_cnt, |
@@ -7719,7 +7774,7 @@ int bnx2x_read_sfp_module_eeprom(struct bnx2x_phy *phy, | |||
7719 | break; | 7774 | break; |
7720 | case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_DIRECT: | 7775 | case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_DIRECT: |
7721 | rc = bnx2x_warpcore_read_sfp_module_eeprom(phy, params, addr, | 7776 | rc = bnx2x_warpcore_read_sfp_module_eeprom(phy, params, addr, |
7722 | byte_cnt, o_buf); | 7777 | byte_cnt, o_buf, 0); |
7723 | break; | 7778 | break; |
7724 | } | 7779 | } |
7725 | return rc; | 7780 | return rc; |
@@ -7923,6 +7978,7 @@ static int bnx2x_wait_for_sfp_module_initialized(struct bnx2x_phy *phy, | |||
7923 | 7978 | ||
7924 | { | 7979 | { |
7925 | u8 val; | 7980 | u8 val; |
7981 | int rc; | ||
7926 | struct bnx2x *bp = params->bp; | 7982 | struct bnx2x *bp = params->bp; |
7927 | u16 timeout; | 7983 | u16 timeout; |
7928 | /* Initialization time after hot-plug may take up to 300ms for | 7984 | /* Initialization time after hot-plug may take up to 300ms for |
@@ -7930,8 +7986,14 @@ static int bnx2x_wait_for_sfp_module_initialized(struct bnx2x_phy *phy, | |||
7930 | */ | 7986 | */ |
7931 | 7987 | ||
7932 | for (timeout = 0; timeout < 60; timeout++) { | 7988 | for (timeout = 0; timeout < 60; timeout++) { |
7933 | if (bnx2x_read_sfp_module_eeprom(phy, params, 1, 1, &val) | 7989 | if (phy->type == PORT_HW_CFG_XGXS_EXT_PHY_TYPE_DIRECT) |
7934 | == 0) { | 7990 | rc = bnx2x_warpcore_read_sfp_module_eeprom(phy, |
7991 | params, 1, | ||
7992 | 1, &val, 1); | ||
7993 | else | ||
7994 | rc = bnx2x_read_sfp_module_eeprom(phy, params, 1, 1, | ||
7995 | &val); | ||
7996 | if (rc == 0) { | ||
7935 | DP(NETIF_MSG_LINK, | 7997 | DP(NETIF_MSG_LINK, |
7936 | "SFP+ module initialization took %d ms\n", | 7998 | "SFP+ module initialization took %d ms\n", |
7937 | timeout * 5); | 7999 | timeout * 5); |
@@ -7939,7 +8001,8 @@ static int bnx2x_wait_for_sfp_module_initialized(struct bnx2x_phy *phy, | |||
7939 | } | 8001 | } |
7940 | usleep_range(5000, 10000); | 8002 | usleep_range(5000, 10000); |
7941 | } | 8003 | } |
7942 | return -EINVAL; | 8004 | rc = bnx2x_read_sfp_module_eeprom(phy, params, 1, 1, &val); |
8005 | return rc; | ||
7943 | } | 8006 | } |
7944 | 8007 | ||
7945 | static void bnx2x_8727_power_module(struct bnx2x *bp, | 8008 | static void bnx2x_8727_power_module(struct bnx2x *bp, |
@@ -10993,7 +11056,7 @@ static struct bnx2x_phy phy_xgxs = { | |||
10993 | .format_fw_ver = (format_fw_ver_t)NULL, | 11056 | .format_fw_ver = (format_fw_ver_t)NULL, |
10994 | .hw_reset = (hw_reset_t)NULL, | 11057 | .hw_reset = (hw_reset_t)NULL, |
10995 | .set_link_led = (set_link_led_t)NULL, | 11058 | .set_link_led = (set_link_led_t)NULL, |
10996 | .phy_specific_func = (phy_specific_func_t)NULL | 11059 | .phy_specific_func = (phy_specific_func_t)bnx2x_xgxs_specific_func |
10997 | }; | 11060 | }; |
10998 | static struct bnx2x_phy phy_warpcore = { | 11061 | static struct bnx2x_phy phy_warpcore = { |
10999 | .type = PORT_HW_CFG_XGXS_EXT_PHY_TYPE_DIRECT, | 11062 | .type = PORT_HW_CFG_XGXS_EXT_PHY_TYPE_DIRECT, |
@@ -11465,6 +11528,11 @@ static int bnx2x_populate_int_phy(struct bnx2x *bp, u32 shmem_base, u8 port, | |||
11465 | phy->media_type = ETH_PHY_BASE_T; | 11528 | phy->media_type = ETH_PHY_BASE_T; |
11466 | break; | 11529 | break; |
11467 | case PORT_HW_CFG_NET_SERDES_IF_XFI: | 11530 | case PORT_HW_CFG_NET_SERDES_IF_XFI: |
11531 | phy->supported &= (SUPPORTED_1000baseT_Full | | ||
11532 | SUPPORTED_10000baseT_Full | | ||
11533 | SUPPORTED_FIBRE | | ||
11534 | SUPPORTED_Pause | | ||
11535 | SUPPORTED_Asym_Pause); | ||
11468 | phy->media_type = ETH_PHY_XFP_FIBER; | 11536 | phy->media_type = ETH_PHY_XFP_FIBER; |
11469 | break; | 11537 | break; |
11470 | case PORT_HW_CFG_NET_SERDES_IF_SFI: | 11538 | case PORT_HW_CFG_NET_SERDES_IF_SFI: |
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c index d5648fc666bd..bd1fd3d87c24 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c | |||
@@ -6794,8 +6794,9 @@ static int bnx2x_init_hw_port(struct bnx2x *bp) | |||
6794 | 6794 | ||
6795 | bnx2x_init_block(bp, BLOCK_DORQ, init_phase); | 6795 | bnx2x_init_block(bp, BLOCK_DORQ, init_phase); |
6796 | 6796 | ||
6797 | bnx2x_init_block(bp, BLOCK_BRB1, init_phase); | ||
6798 | |||
6797 | if (CHIP_IS_E1(bp) || CHIP_IS_E1H(bp)) { | 6799 | if (CHIP_IS_E1(bp) || CHIP_IS_E1H(bp)) { |
6798 | bnx2x_init_block(bp, BLOCK_BRB1, init_phase); | ||
6799 | 6800 | ||
6800 | if (IS_MF(bp)) | 6801 | if (IS_MF(bp)) |
6801 | low = ((bp->flags & ONE_PORT_FLAG) ? 160 : 246); | 6802 | low = ((bp->flags & ONE_PORT_FLAG) ? 160 : 246); |
@@ -11902,7 +11903,15 @@ static int __devinit bnx2x_init_one(struct pci_dev *pdev, | |||
11902 | /* disable FCOE L2 queue for E1x */ | 11903 | /* disable FCOE L2 queue for E1x */ |
11903 | if (CHIP_IS_E1x(bp)) | 11904 | if (CHIP_IS_E1x(bp)) |
11904 | bp->flags |= NO_FCOE_FLAG; | 11905 | bp->flags |= NO_FCOE_FLAG; |
11905 | 11906 | /* disable FCOE for 57840 device, until FW supports it */ | |
11907 | switch (ent->driver_data) { | ||
11908 | case BCM57840_O: | ||
11909 | case BCM57840_4_10: | ||
11910 | case BCM57840_2_20: | ||
11911 | case BCM57840_MFO: | ||
11912 | case BCM57840_MF: | ||
11913 | bp->flags |= NO_FCOE_FLAG; | ||
11914 | } | ||
11906 | #endif | 11915 | #endif |
11907 | 11916 | ||
11908 | 11917 | ||
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/calxeda/xgmac.c b/drivers/net/ethernet/calxeda/xgmac.c index 2b4b4f529ab4..16814b34d4b6 100644 --- a/drivers/net/ethernet/calxeda/xgmac.c +++ b/drivers/net/ethernet/calxeda/xgmac.c | |||
@@ -375,7 +375,6 @@ struct xgmac_priv { | |||
375 | unsigned int tx_tail; | 375 | unsigned int tx_tail; |
376 | 376 | ||
377 | void __iomem *base; | 377 | void __iomem *base; |
378 | struct sk_buff_head rx_recycle; | ||
379 | unsigned int dma_buf_sz; | 378 | unsigned int dma_buf_sz; |
380 | dma_addr_t dma_rx_phy; | 379 | dma_addr_t dma_rx_phy; |
381 | dma_addr_t dma_tx_phy; | 380 | dma_addr_t dma_tx_phy; |
@@ -672,9 +671,7 @@ static void xgmac_rx_refill(struct xgmac_priv *priv) | |||
672 | p = priv->dma_rx + entry; | 671 | p = priv->dma_rx + entry; |
673 | 672 | ||
674 | if (priv->rx_skbuff[entry] == NULL) { | 673 | if (priv->rx_skbuff[entry] == NULL) { |
675 | skb = __skb_dequeue(&priv->rx_recycle); | 674 | skb = netdev_alloc_skb(priv->dev, priv->dma_buf_sz); |
676 | if (skb == NULL) | ||
677 | skb = netdev_alloc_skb(priv->dev, priv->dma_buf_sz); | ||
678 | if (unlikely(skb == NULL)) | 675 | if (unlikely(skb == NULL)) |
679 | break; | 676 | break; |
680 | 677 | ||
@@ -887,17 +884,7 @@ static void xgmac_tx_complete(struct xgmac_priv *priv) | |||
887 | desc_get_buf_len(p), DMA_TO_DEVICE); | 884 | desc_get_buf_len(p), DMA_TO_DEVICE); |
888 | } | 885 | } |
889 | 886 | ||
890 | /* | 887 | dev_kfree_skb(skb); |
891 | * If there's room in the queue (limit it to size) | ||
892 | * we add this skb back into the pool, | ||
893 | * if it's the right size. | ||
894 | */ | ||
895 | if ((skb_queue_len(&priv->rx_recycle) < | ||
896 | DMA_RX_RING_SZ) && | ||
897 | skb_recycle_check(skb, priv->dma_buf_sz)) | ||
898 | __skb_queue_head(&priv->rx_recycle, skb); | ||
899 | else | ||
900 | dev_kfree_skb(skb); | ||
901 | } | 888 | } |
902 | 889 | ||
903 | if (dma_ring_space(priv->tx_head, priv->tx_tail, DMA_TX_RING_SZ) > | 890 | if (dma_ring_space(priv->tx_head, priv->tx_tail, DMA_TX_RING_SZ) > |
@@ -1016,7 +1003,6 @@ static int xgmac_open(struct net_device *dev) | |||
1016 | dev->dev_addr); | 1003 | dev->dev_addr); |
1017 | } | 1004 | } |
1018 | 1005 | ||
1019 | skb_queue_head_init(&priv->rx_recycle); | ||
1020 | memset(&priv->xstats, 0, sizeof(struct xgmac_extra_stats)); | 1006 | memset(&priv->xstats, 0, sizeof(struct xgmac_extra_stats)); |
1021 | 1007 | ||
1022 | /* Initialize the XGMAC and descriptors */ | 1008 | /* Initialize the XGMAC and descriptors */ |
@@ -1053,7 +1039,6 @@ static int xgmac_stop(struct net_device *dev) | |||
1053 | napi_disable(&priv->napi); | 1039 | napi_disable(&priv->napi); |
1054 | 1040 | ||
1055 | writel(0, priv->base + XGMAC_DMA_INTR_ENA); | 1041 | writel(0, priv->base + XGMAC_DMA_INTR_ENA); |
1056 | skb_queue_purge(&priv->rx_recycle); | ||
1057 | 1042 | ||
1058 | /* Disable the MAC core */ | 1043 | /* Disable the MAC core */ |
1059 | xgmac_mac_disable(priv->base); | 1044 | xgmac_mac_disable(priv->base); |
diff --git a/drivers/net/ethernet/chelsio/cxgb4/cxgb4.h b/drivers/net/ethernet/chelsio/cxgb4/cxgb4.h index 31752b24434e..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; |
@@ -696,6 +715,7 @@ int t4_seeprom_wp(struct adapter *adapter, bool enable); | |||
696 | int get_vpd_params(struct adapter *adapter, struct vpd_params *p); | 715 | int get_vpd_params(struct adapter *adapter, struct vpd_params *p); |
697 | int t4_load_fw(struct adapter *adapter, const u8 *fw_data, unsigned int size); | 716 | int t4_load_fw(struct adapter *adapter, const u8 *fw_data, unsigned int size); |
698 | unsigned int t4_flash_cfg_addr(struct adapter *adapter); | 717 | unsigned int t4_flash_cfg_addr(struct adapter *adapter); |
718 | int t4_load_cfg(struct adapter *adapter, const u8 *cfg_data, unsigned int size); | ||
699 | int t4_check_fw_version(struct adapter *adapter); | 719 | int t4_check_fw_version(struct adapter *adapter); |
700 | int t4_prep_adapter(struct adapter *adapter); | 720 | int t4_prep_adapter(struct adapter *adapter); |
701 | int t4_port_init(struct adapter *adap, int mbox, int pf, int vf); | 721 | int t4_port_init(struct adapter *adap, int mbox, int pf, int vf); |
diff --git a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c index 6b9f6bb2f7ed..0df1284df497 100644 --- a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c +++ b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c | |||
@@ -443,7 +443,10 @@ int dbfifo_int_thresh = 10; /* 10 == 640 entry threshold */ | |||
443 | module_param(dbfifo_int_thresh, int, 0644); | 443 | module_param(dbfifo_int_thresh, int, 0644); |
444 | MODULE_PARM_DESC(dbfifo_int_thresh, "doorbell fifo interrupt threshold"); | 444 | MODULE_PARM_DESC(dbfifo_int_thresh, "doorbell fifo interrupt threshold"); |
445 | 445 | ||
446 | int dbfifo_drain_delay = 1000; /* usecs to sleep while draining the dbfifo */ | 446 | /* |
447 | * usecs to sleep while draining the dbfifo | ||
448 | */ | ||
449 | static int dbfifo_drain_delay = 1000; | ||
447 | module_param(dbfifo_drain_delay, int, 0644); | 450 | module_param(dbfifo_drain_delay, int, 0644); |
448 | MODULE_PARM_DESC(dbfifo_drain_delay, | 451 | MODULE_PARM_DESC(dbfifo_drain_delay, |
449 | "usecs to sleep while draining the dbfifo"); | 452 | "usecs to sleep while draining the dbfifo"); |
@@ -636,7 +639,7 @@ static void name_msix_vecs(struct adapter *adap) | |||
636 | static int request_msix_queue_irqs(struct adapter *adap) | 639 | static int request_msix_queue_irqs(struct adapter *adap) |
637 | { | 640 | { |
638 | struct sge *s = &adap->sge; | 641 | struct sge *s = &adap->sge; |
639 | int err, ethqidx, ofldqidx = 0, rdmaqidx = 0, msi = 2; | 642 | int err, ethqidx, ofldqidx = 0, rdmaqidx = 0, msi_index = 2; |
640 | 643 | ||
641 | err = request_irq(adap->msix_info[1].vec, t4_sge_intr_msix, 0, | 644 | err = request_irq(adap->msix_info[1].vec, t4_sge_intr_msix, 0, |
642 | adap->msix_info[1].desc, &s->fw_evtq); | 645 | adap->msix_info[1].desc, &s->fw_evtq); |
@@ -644,56 +647,60 @@ static int request_msix_queue_irqs(struct adapter *adap) | |||
644 | return err; | 647 | return err; |
645 | 648 | ||
646 | for_each_ethrxq(s, ethqidx) { | 649 | for_each_ethrxq(s, ethqidx) { |
647 | err = request_irq(adap->msix_info[msi].vec, t4_sge_intr_msix, 0, | 650 | err = request_irq(adap->msix_info[msi_index].vec, |
648 | adap->msix_info[msi].desc, | 651 | t4_sge_intr_msix, 0, |
652 | adap->msix_info[msi_index].desc, | ||
649 | &s->ethrxq[ethqidx].rspq); | 653 | &s->ethrxq[ethqidx].rspq); |
650 | if (err) | 654 | if (err) |
651 | goto unwind; | 655 | goto unwind; |
652 | msi++; | 656 | msi_index++; |
653 | } | 657 | } |
654 | for_each_ofldrxq(s, ofldqidx) { | 658 | for_each_ofldrxq(s, ofldqidx) { |
655 | err = request_irq(adap->msix_info[msi].vec, t4_sge_intr_msix, 0, | 659 | err = request_irq(adap->msix_info[msi_index].vec, |
656 | adap->msix_info[msi].desc, | 660 | t4_sge_intr_msix, 0, |
661 | adap->msix_info[msi_index].desc, | ||
657 | &s->ofldrxq[ofldqidx].rspq); | 662 | &s->ofldrxq[ofldqidx].rspq); |
658 | if (err) | 663 | if (err) |
659 | goto unwind; | 664 | goto unwind; |
660 | msi++; | 665 | msi_index++; |
661 | } | 666 | } |
662 | for_each_rdmarxq(s, rdmaqidx) { | 667 | for_each_rdmarxq(s, rdmaqidx) { |
663 | err = request_irq(adap->msix_info[msi].vec, t4_sge_intr_msix, 0, | 668 | err = request_irq(adap->msix_info[msi_index].vec, |
664 | adap->msix_info[msi].desc, | 669 | t4_sge_intr_msix, 0, |
670 | adap->msix_info[msi_index].desc, | ||
665 | &s->rdmarxq[rdmaqidx].rspq); | 671 | &s->rdmarxq[rdmaqidx].rspq); |
666 | if (err) | 672 | if (err) |
667 | goto unwind; | 673 | goto unwind; |
668 | msi++; | 674 | msi_index++; |
669 | } | 675 | } |
670 | return 0; | 676 | return 0; |
671 | 677 | ||
672 | unwind: | 678 | unwind: |
673 | while (--rdmaqidx >= 0) | 679 | while (--rdmaqidx >= 0) |
674 | free_irq(adap->msix_info[--msi].vec, | 680 | free_irq(adap->msix_info[--msi_index].vec, |
675 | &s->rdmarxq[rdmaqidx].rspq); | 681 | &s->rdmarxq[rdmaqidx].rspq); |
676 | while (--ofldqidx >= 0) | 682 | while (--ofldqidx >= 0) |
677 | free_irq(adap->msix_info[--msi].vec, | 683 | free_irq(adap->msix_info[--msi_index].vec, |
678 | &s->ofldrxq[ofldqidx].rspq); | 684 | &s->ofldrxq[ofldqidx].rspq); |
679 | while (--ethqidx >= 0) | 685 | while (--ethqidx >= 0) |
680 | free_irq(adap->msix_info[--msi].vec, &s->ethrxq[ethqidx].rspq); | 686 | free_irq(adap->msix_info[--msi_index].vec, |
687 | &s->ethrxq[ethqidx].rspq); | ||
681 | free_irq(adap->msix_info[1].vec, &s->fw_evtq); | 688 | free_irq(adap->msix_info[1].vec, &s->fw_evtq); |
682 | return err; | 689 | return err; |
683 | } | 690 | } |
684 | 691 | ||
685 | static void free_msix_queue_irqs(struct adapter *adap) | 692 | static void free_msix_queue_irqs(struct adapter *adap) |
686 | { | 693 | { |
687 | int i, msi = 2; | 694 | int i, msi_index = 2; |
688 | struct sge *s = &adap->sge; | 695 | struct sge *s = &adap->sge; |
689 | 696 | ||
690 | free_irq(adap->msix_info[1].vec, &s->fw_evtq); | 697 | free_irq(adap->msix_info[1].vec, &s->fw_evtq); |
691 | for_each_ethrxq(s, i) | 698 | for_each_ethrxq(s, i) |
692 | free_irq(adap->msix_info[msi++].vec, &s->ethrxq[i].rspq); | 699 | free_irq(adap->msix_info[msi_index++].vec, &s->ethrxq[i].rspq); |
693 | for_each_ofldrxq(s, i) | 700 | for_each_ofldrxq(s, i) |
694 | free_irq(adap->msix_info[msi++].vec, &s->ofldrxq[i].rspq); | 701 | free_irq(adap->msix_info[msi_index++].vec, &s->ofldrxq[i].rspq); |
695 | for_each_rdmarxq(s, i) | 702 | for_each_rdmarxq(s, i) |
696 | free_irq(adap->msix_info[msi++].vec, &s->rdmarxq[i].rspq); | 703 | free_irq(adap->msix_info[msi_index++].vec, &s->rdmarxq[i].rspq); |
697 | } | 704 | } |
698 | 705 | ||
699 | /** | 706 | /** |
@@ -2535,9 +2542,8 @@ static int read_eq_indices(struct adapter *adap, u16 qid, u16 *pidx, u16 *cidx) | |||
2535 | 2542 | ||
2536 | ret = t4_mem_win_read_len(adap, addr, (__be32 *)&indices, 8); | 2543 | ret = t4_mem_win_read_len(adap, addr, (__be32 *)&indices, 8); |
2537 | if (!ret) { | 2544 | if (!ret) { |
2538 | indices = be64_to_cpu(indices); | 2545 | *cidx = (be64_to_cpu(indices) >> 25) & 0xffff; |
2539 | *cidx = (indices >> 25) & 0xffff; | 2546 | *pidx = (be64_to_cpu(indices) >> 9) & 0xffff; |
2540 | *pidx = (indices >> 9) & 0xffff; | ||
2541 | } | 2547 | } |
2542 | return ret; | 2548 | return ret; |
2543 | } | 2549 | } |
@@ -3410,16 +3416,6 @@ static int adap_init0_config(struct adapter *adapter, int reset) | |||
3410 | finicsum, cfcsum); | 3416 | finicsum, cfcsum); |
3411 | 3417 | ||
3412 | /* | 3418 | /* |
3413 | * If we're a pure NIC driver then disable all offloading facilities. | ||
3414 | * This will allow the firmware to optimize aspects of the hardware | ||
3415 | * configuration which will result in improved performance. | ||
3416 | */ | ||
3417 | caps_cmd.ofldcaps = 0; | ||
3418 | caps_cmd.iscsicaps = 0; | ||
3419 | caps_cmd.rdmacaps = 0; | ||
3420 | caps_cmd.fcoecaps = 0; | ||
3421 | |||
3422 | /* | ||
3423 | * And now tell the firmware to use the configuration we just loaded. | 3419 | * And now tell the firmware to use the configuration we just loaded. |
3424 | */ | 3420 | */ |
3425 | caps_cmd.op_to_write = | 3421 | caps_cmd.op_to_write = |
@@ -3507,18 +3503,6 @@ static int adap_init0_no_config(struct adapter *adapter, int reset) | |||
3507 | if (ret < 0) | 3503 | if (ret < 0) |
3508 | goto bye; | 3504 | goto bye; |
3509 | 3505 | ||
3510 | #ifndef CONFIG_CHELSIO_T4_OFFLOAD | ||
3511 | /* | ||
3512 | * If we're a pure NIC driver then disable all offloading facilities. | ||
3513 | * This will allow the firmware to optimize aspects of the hardware | ||
3514 | * configuration which will result in improved performance. | ||
3515 | */ | ||
3516 | caps_cmd.ofldcaps = 0; | ||
3517 | caps_cmd.iscsicaps = 0; | ||
3518 | caps_cmd.rdmacaps = 0; | ||
3519 | caps_cmd.fcoecaps = 0; | ||
3520 | #endif | ||
3521 | |||
3522 | if (caps_cmd.niccaps & htons(FW_CAPS_CONFIG_NIC_VM)) { | 3506 | if (caps_cmd.niccaps & htons(FW_CAPS_CONFIG_NIC_VM)) { |
3523 | if (!vf_acls) | 3507 | if (!vf_acls) |
3524 | caps_cmd.niccaps ^= htons(FW_CAPS_CONFIG_NIC_VM); | 3508 | caps_cmd.niccaps ^= htons(FW_CAPS_CONFIG_NIC_VM); |
@@ -3634,10 +3618,10 @@ static int adap_init0_no_config(struct adapter *adapter, int reset) | |||
3634 | * field selections will fit in the 36-bit budget. | 3618 | * field selections will fit in the 36-bit budget. |
3635 | */ | 3619 | */ |
3636 | if (tp_vlan_pri_map != TP_VLAN_PRI_MAP_DEFAULT) { | 3620 | if (tp_vlan_pri_map != TP_VLAN_PRI_MAP_DEFAULT) { |
3637 | int i, bits = 0; | 3621 | int j, bits = 0; |
3638 | 3622 | ||
3639 | for (i = TP_VLAN_PRI_MAP_FIRST; i <= TP_VLAN_PRI_MAP_LAST; i++) | 3623 | for (j = TP_VLAN_PRI_MAP_FIRST; j <= TP_VLAN_PRI_MAP_LAST; j++) |
3640 | switch (tp_vlan_pri_map & (1 << i)) { | 3624 | switch (tp_vlan_pri_map & (1 << j)) { |
3641 | case 0: | 3625 | case 0: |
3642 | /* compressed filter field not enabled */ | 3626 | /* compressed filter field not enabled */ |
3643 | break; | 3627 | break; |
@@ -3739,6 +3723,7 @@ static int adap_init0(struct adapter *adap) | |||
3739 | u32 v, port_vec; | 3723 | u32 v, port_vec; |
3740 | enum dev_state state; | 3724 | enum dev_state state; |
3741 | u32 params[7], val[7]; | 3725 | u32 params[7], val[7]; |
3726 | struct fw_caps_config_cmd caps_cmd; | ||
3742 | int reset = 1, j; | 3727 | int reset = 1, j; |
3743 | 3728 | ||
3744 | /* | 3729 | /* |
@@ -3892,6 +3877,9 @@ static int adap_init0(struct adapter *adap) | |||
3892 | goto bye; | 3877 | goto bye; |
3893 | } | 3878 | } |
3894 | 3879 | ||
3880 | if (is_bypass_device(adap->pdev->device)) | ||
3881 | adap->params.bypass = 1; | ||
3882 | |||
3895 | /* | 3883 | /* |
3896 | * Grab some of our basic fundamental operating parameters. | 3884 | * Grab some of our basic fundamental operating parameters. |
3897 | */ | 3885 | */ |
@@ -3934,13 +3922,12 @@ static int adap_init0(struct adapter *adap) | |||
3934 | adap->tids.aftid_end = val[1]; | 3922 | adap->tids.aftid_end = val[1]; |
3935 | } | 3923 | } |
3936 | 3924 | ||
3937 | #ifdef CONFIG_CHELSIO_T4_OFFLOAD | ||
3938 | /* | 3925 | /* |
3939 | * Get device capabilities so we can determine what resources we need | 3926 | * Get device capabilities so we can determine what resources we need |
3940 | * to manage. | 3927 | * to manage. |
3941 | */ | 3928 | */ |
3942 | memset(&caps_cmd, 0, sizeof(caps_cmd)); | 3929 | memset(&caps_cmd, 0, sizeof(caps_cmd)); |
3943 | caps_cmd.op_to_write = htonl(V_FW_CMD_OP(FW_CAPS_CONFIG_CMD) | | 3930 | caps_cmd.op_to_write = htonl(FW_CMD_OP(FW_CAPS_CONFIG_CMD) | |
3944 | FW_CMD_REQUEST | FW_CMD_READ); | 3931 | FW_CMD_REQUEST | FW_CMD_READ); |
3945 | caps_cmd.retval_len16 = htonl(FW_LEN16(caps_cmd)); | 3932 | caps_cmd.retval_len16 = htonl(FW_LEN16(caps_cmd)); |
3946 | ret = t4_wr_mbox(adap, adap->mbox, &caps_cmd, sizeof(caps_cmd), | 3933 | ret = t4_wr_mbox(adap, adap->mbox, &caps_cmd, sizeof(caps_cmd), |
@@ -3985,15 +3972,6 @@ static int adap_init0(struct adapter *adap) | |||
3985 | adap->vres.ddp.size = val[4] - val[3] + 1; | 3972 | adap->vres.ddp.size = val[4] - val[3] + 1; |
3986 | adap->params.ofldq_wr_cred = val[5]; | 3973 | adap->params.ofldq_wr_cred = val[5]; |
3987 | 3974 | ||
3988 | params[0] = FW_PARAM_PFVF(ETHOFLD_START); | ||
3989 | params[1] = FW_PARAM_PFVF(ETHOFLD_END); | ||
3990 | ret = t4_query_params(adap, adap->mbox, adap->fn, 0, 2, | ||
3991 | params, val); | ||
3992 | if ((val[0] != val[1]) && (ret >= 0)) { | ||
3993 | adap->tids.uotid_base = val[0]; | ||
3994 | adap->tids.nuotids = val[1] - val[0] + 1; | ||
3995 | } | ||
3996 | |||
3997 | adap->params.offload = 1; | 3975 | adap->params.offload = 1; |
3998 | } | 3976 | } |
3999 | if (caps_cmd.rdmacaps) { | 3977 | if (caps_cmd.rdmacaps) { |
@@ -4042,7 +4020,6 @@ static int adap_init0(struct adapter *adap) | |||
4042 | } | 4020 | } |
4043 | #undef FW_PARAM_PFVF | 4021 | #undef FW_PARAM_PFVF |
4044 | #undef FW_PARAM_DEV | 4022 | #undef FW_PARAM_DEV |
4045 | #endif /* CONFIG_CHELSIO_T4_OFFLOAD */ | ||
4046 | 4023 | ||
4047 | /* | 4024 | /* |
4048 | * These are finalized by FW initialization, load their values now. | 4025 | * 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/chelsio/cxgb4/t4_hw.c b/drivers/net/ethernet/chelsio/cxgb4/t4_hw.c index 137a24438d9c..32eec15fe4c2 100644 --- a/drivers/net/ethernet/chelsio/cxgb4/t4_hw.c +++ b/drivers/net/ethernet/chelsio/cxgb4/t4_hw.c | |||
@@ -380,9 +380,11 @@ static int t4_mem_win_rw(struct adapter *adap, u32 addr, __be32 *data, int dir) | |||
380 | /* Collecting data 4 bytes at a time upto MEMWIN0_APERTURE */ | 380 | /* Collecting data 4 bytes at a time upto MEMWIN0_APERTURE */ |
381 | for (i = 0; i < MEMWIN0_APERTURE; i = i+0x4) { | 381 | for (i = 0; i < MEMWIN0_APERTURE; i = i+0x4) { |
382 | if (dir) | 382 | if (dir) |
383 | *data++ = t4_read_reg(adap, (MEMWIN0_BASE + i)); | 383 | *data++ = (__force __be32) t4_read_reg(adap, |
384 | (MEMWIN0_BASE + i)); | ||
384 | else | 385 | else |
385 | t4_write_reg(adap, (MEMWIN0_BASE + i), *data++); | 386 | t4_write_reg(adap, (MEMWIN0_BASE + i), |
387 | (__force u32) *data++); | ||
386 | } | 388 | } |
387 | 389 | ||
388 | return 0; | 390 | return 0; |
@@ -417,7 +419,7 @@ static int t4_memory_rw(struct adapter *adap, int mtype, u32 addr, u32 len, | |||
417 | if ((addr & 0x3) || (len & 0x3)) | 419 | if ((addr & 0x3) || (len & 0x3)) |
418 | return -EINVAL; | 420 | return -EINVAL; |
419 | 421 | ||
420 | data = vmalloc(MEMWIN0_APERTURE/sizeof(__be32)); | 422 | data = vmalloc(MEMWIN0_APERTURE); |
421 | if (!data) | 423 | if (!data) |
422 | return -ENOMEM; | 424 | return -ENOMEM; |
423 | 425 | ||
@@ -744,7 +746,7 @@ static int t4_read_flash(struct adapter *adapter, unsigned int addr, | |||
744 | if (ret) | 746 | if (ret) |
745 | return ret; | 747 | return ret; |
746 | if (byte_oriented) | 748 | if (byte_oriented) |
747 | *data = htonl(*data); | 749 | *data = (__force __u32) (htonl(*data)); |
748 | } | 750 | } |
749 | return 0; | 751 | return 0; |
750 | } | 752 | } |
@@ -992,7 +994,7 @@ int t4_load_fw(struct adapter *adap, const u8 *fw_data, unsigned int size) | |||
992 | int ret, addr; | 994 | int ret, addr; |
993 | unsigned int i; | 995 | unsigned int i; |
994 | u8 first_page[SF_PAGE_SIZE]; | 996 | u8 first_page[SF_PAGE_SIZE]; |
995 | const u32 *p = (const u32 *)fw_data; | 997 | const __be32 *p = (const __be32 *)fw_data; |
996 | const struct fw_hdr *hdr = (const struct fw_hdr *)fw_data; | 998 | const struct fw_hdr *hdr = (const struct fw_hdr *)fw_data; |
997 | unsigned int sf_sec_size = adap->params.sf_size / adap->params.sf_nsec; | 999 | unsigned int sf_sec_size = adap->params.sf_size / adap->params.sf_nsec; |
998 | unsigned int fw_img_start = adap->params.sf_fw_start; | 1000 | unsigned int fw_img_start = adap->params.sf_fw_start; |
@@ -2315,7 +2317,8 @@ int t4_mem_win_read_len(struct adapter *adap, u32 addr, __be32 *data, int len) | |||
2315 | t4_read_reg(adap, PCIE_MEM_ACCESS_OFFSET); | 2317 | t4_read_reg(adap, PCIE_MEM_ACCESS_OFFSET); |
2316 | 2318 | ||
2317 | for (i = 0; i < len; i += 4) | 2319 | for (i = 0; i < len; i += 4) |
2318 | *data++ = t4_read_reg(adap, (MEMWIN0_BASE + off + i)); | 2320 | *data++ = (__force __be32) t4_read_reg(adap, |
2321 | (MEMWIN0_BASE + off + i)); | ||
2319 | 2322 | ||
2320 | return 0; | 2323 | return 0; |
2321 | } | 2324 | } |
diff --git a/drivers/net/ethernet/dec/tulip/dmfe.c b/drivers/net/ethernet/dec/tulip/dmfe.c index 4d6fe604fa64..d23755ea9bc7 100644 --- a/drivers/net/ethernet/dec/tulip/dmfe.c +++ b/drivers/net/ethernet/dec/tulip/dmfe.c | |||
@@ -446,13 +446,17 @@ static int __devinit dmfe_init_one (struct pci_dev *pdev, | |||
446 | /* Allocate Tx/Rx descriptor memory */ | 446 | /* Allocate Tx/Rx descriptor memory */ |
447 | db->desc_pool_ptr = pci_alloc_consistent(pdev, sizeof(struct tx_desc) * | 447 | db->desc_pool_ptr = pci_alloc_consistent(pdev, sizeof(struct tx_desc) * |
448 | DESC_ALL_CNT + 0x20, &db->desc_pool_dma_ptr); | 448 | DESC_ALL_CNT + 0x20, &db->desc_pool_dma_ptr); |
449 | if (!db->desc_pool_ptr) | 449 | if (!db->desc_pool_ptr) { |
450 | err = -ENOMEM; | ||
450 | goto err_out_res; | 451 | goto err_out_res; |
452 | } | ||
451 | 453 | ||
452 | db->buf_pool_ptr = pci_alloc_consistent(pdev, TX_BUF_ALLOC * | 454 | db->buf_pool_ptr = pci_alloc_consistent(pdev, TX_BUF_ALLOC * |
453 | TX_DESC_CNT + 4, &db->buf_pool_dma_ptr); | 455 | TX_DESC_CNT + 4, &db->buf_pool_dma_ptr); |
454 | if (!db->buf_pool_ptr) | 456 | if (!db->buf_pool_ptr) { |
457 | err = -ENOMEM; | ||
455 | goto err_out_free_desc; | 458 | goto err_out_free_desc; |
459 | } | ||
456 | 460 | ||
457 | db->first_tx_desc = (struct tx_desc *) db->desc_pool_ptr; | 461 | db->first_tx_desc = (struct tx_desc *) db->desc_pool_ptr; |
458 | db->first_tx_desc_dma = db->desc_pool_dma_ptr; | 462 | db->first_tx_desc_dma = db->desc_pool_dma_ptr; |
@@ -462,8 +466,10 @@ static int __devinit dmfe_init_one (struct pci_dev *pdev, | |||
462 | db->chip_id = ent->driver_data; | 466 | db->chip_id = ent->driver_data; |
463 | /* IO type range. */ | 467 | /* IO type range. */ |
464 | db->ioaddr = pci_iomap(pdev, 0, 0); | 468 | db->ioaddr = pci_iomap(pdev, 0, 0); |
465 | if (!db->ioaddr) | 469 | if (!db->ioaddr) { |
470 | err = -ENOMEM; | ||
466 | goto err_out_free_buf; | 471 | goto err_out_free_buf; |
472 | } | ||
467 | 473 | ||
468 | db->chip_revision = pdev->revision; | 474 | db->chip_revision = pdev->revision; |
469 | db->wol_mode = 0; | 475 | db->wol_mode = 0; |
diff --git a/drivers/net/ethernet/emulex/benet/be_main.c b/drivers/net/ethernet/emulex/benet/be_main.c index eb3f2cb3b93b..d1b6cc587639 100644 --- a/drivers/net/ethernet/emulex/benet/be_main.c +++ b/drivers/net/ethernet/emulex/benet/be_main.c | |||
@@ -2129,8 +2129,11 @@ void be_detect_error(struct be_adapter *adapter) | |||
2129 | ue_hi = (ue_hi & ~ue_hi_mask); | 2129 | ue_hi = (ue_hi & ~ue_hi_mask); |
2130 | } | 2130 | } |
2131 | 2131 | ||
2132 | if (ue_lo || ue_hi || | 2132 | /* On certain platforms BE hardware can indicate spurious UEs. |
2133 | sliport_status & SLIPORT_STATUS_ERR_MASK) { | 2133 | * Allow the h/w to stop working completely in case of a real UE. |
2134 | * Hence not setting the hw_error for UE detection. | ||
2135 | */ | ||
2136 | if (sliport_status & SLIPORT_STATUS_ERR_MASK) { | ||
2134 | adapter->hw_error = true; | 2137 | adapter->hw_error = true; |
2135 | dev_err(&adapter->pdev->dev, | 2138 | dev_err(&adapter->pdev->dev, |
2136 | "Error detected in the card\n"); | 2139 | "Error detected in the card\n"); |
diff --git a/drivers/net/ethernet/freescale/gianfar.c b/drivers/net/ethernet/freescale/gianfar.c index a1b52ec3b930..1d03dcdd5e56 100644 --- a/drivers/net/ethernet/freescale/gianfar.c +++ b/drivers/net/ethernet/freescale/gianfar.c | |||
@@ -1765,7 +1765,6 @@ static void free_skb_resources(struct gfar_private *priv) | |||
1765 | sizeof(struct rxbd8) * priv->total_rx_ring_size, | 1765 | sizeof(struct rxbd8) * priv->total_rx_ring_size, |
1766 | priv->tx_queue[0]->tx_bd_base, | 1766 | priv->tx_queue[0]->tx_bd_base, |
1767 | priv->tx_queue[0]->tx_bd_dma_base); | 1767 | priv->tx_queue[0]->tx_bd_dma_base); |
1768 | skb_queue_purge(&priv->rx_recycle); | ||
1769 | } | 1768 | } |
1770 | 1769 | ||
1771 | void gfar_start(struct net_device *dev) | 1770 | void gfar_start(struct net_device *dev) |
@@ -1943,8 +1942,6 @@ static int gfar_enet_open(struct net_device *dev) | |||
1943 | 1942 | ||
1944 | enable_napi(priv); | 1943 | enable_napi(priv); |
1945 | 1944 | ||
1946 | skb_queue_head_init(&priv->rx_recycle); | ||
1947 | |||
1948 | /* Initialize a bunch of registers */ | 1945 | /* Initialize a bunch of registers */ |
1949 | init_registers(dev); | 1946 | init_registers(dev); |
1950 | 1947 | ||
@@ -2533,16 +2530,7 @@ static int gfar_clean_tx_ring(struct gfar_priv_tx_q *tx_queue) | |||
2533 | 2530 | ||
2534 | bytes_sent += skb->len; | 2531 | bytes_sent += skb->len; |
2535 | 2532 | ||
2536 | /* If there's room in the queue (limit it to rx_buffer_size) | 2533 | dev_kfree_skb_any(skb); |
2537 | * we add this skb back into the pool, if it's the right size | ||
2538 | */ | ||
2539 | if (skb_queue_len(&priv->rx_recycle) < rx_queue->rx_ring_size && | ||
2540 | skb_recycle_check(skb, priv->rx_buffer_size + | ||
2541 | RXBUF_ALIGNMENT)) { | ||
2542 | gfar_align_skb(skb); | ||
2543 | skb_queue_head(&priv->rx_recycle, skb); | ||
2544 | } else | ||
2545 | dev_kfree_skb_any(skb); | ||
2546 | 2534 | ||
2547 | tx_queue->tx_skbuff[skb_dirtytx] = NULL; | 2535 | tx_queue->tx_skbuff[skb_dirtytx] = NULL; |
2548 | 2536 | ||
@@ -2608,7 +2596,7 @@ static void gfar_new_rxbdp(struct gfar_priv_rx_q *rx_queue, struct rxbd8 *bdp, | |||
2608 | static struct sk_buff *gfar_alloc_skb(struct net_device *dev) | 2596 | static struct sk_buff *gfar_alloc_skb(struct net_device *dev) |
2609 | { | 2597 | { |
2610 | struct gfar_private *priv = netdev_priv(dev); | 2598 | struct gfar_private *priv = netdev_priv(dev); |
2611 | struct sk_buff *skb = NULL; | 2599 | struct sk_buff *skb; |
2612 | 2600 | ||
2613 | skb = netdev_alloc_skb(dev, priv->rx_buffer_size + RXBUF_ALIGNMENT); | 2601 | skb = netdev_alloc_skb(dev, priv->rx_buffer_size + RXBUF_ALIGNMENT); |
2614 | if (!skb) | 2602 | if (!skb) |
@@ -2621,14 +2609,7 @@ static struct sk_buff *gfar_alloc_skb(struct net_device *dev) | |||
2621 | 2609 | ||
2622 | struct sk_buff *gfar_new_skb(struct net_device *dev) | 2610 | struct sk_buff *gfar_new_skb(struct net_device *dev) |
2623 | { | 2611 | { |
2624 | struct gfar_private *priv = netdev_priv(dev); | 2612 | return gfar_alloc_skb(dev); |
2625 | struct sk_buff *skb = NULL; | ||
2626 | |||
2627 | skb = skb_dequeue(&priv->rx_recycle); | ||
2628 | if (!skb) | ||
2629 | skb = gfar_alloc_skb(dev); | ||
2630 | |||
2631 | return skb; | ||
2632 | } | 2613 | } |
2633 | 2614 | ||
2634 | static inline void count_errors(unsigned short status, struct net_device *dev) | 2615 | static inline void count_errors(unsigned short status, struct net_device *dev) |
@@ -2787,7 +2768,7 @@ int gfar_clean_rx_ring(struct gfar_priv_rx_q *rx_queue, int rx_work_limit) | |||
2787 | if (unlikely(!newskb)) | 2768 | if (unlikely(!newskb)) |
2788 | newskb = skb; | 2769 | newskb = skb; |
2789 | else if (skb) | 2770 | else if (skb) |
2790 | skb_queue_head(&priv->rx_recycle, skb); | 2771 | dev_kfree_skb(skb); |
2791 | } else { | 2772 | } else { |
2792 | /* Increment the number of packets */ | 2773 | /* Increment the number of packets */ |
2793 | rx_queue->stats.rx_packets++; | 2774 | rx_queue->stats.rx_packets++; |
diff --git a/drivers/net/ethernet/freescale/gianfar.h b/drivers/net/ethernet/freescale/gianfar.h index 4141ef2ddafc..22eabc13ca99 100644 --- a/drivers/net/ethernet/freescale/gianfar.h +++ b/drivers/net/ethernet/freescale/gianfar.h | |||
@@ -1080,8 +1080,6 @@ struct gfar_private { | |||
1080 | 1080 | ||
1081 | u32 cur_filer_idx; | 1081 | u32 cur_filer_idx; |
1082 | 1082 | ||
1083 | struct sk_buff_head rx_recycle; | ||
1084 | |||
1085 | /* RX queue filer rule set*/ | 1083 | /* RX queue filer rule set*/ |
1086 | struct ethtool_rx_list rx_list; | 1084 | struct ethtool_rx_list rx_list; |
1087 | struct mutex rx_queue_access; | 1085 | struct mutex rx_queue_access; |
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/freescale/ucc_geth.c b/drivers/net/ethernet/freescale/ucc_geth.c index 164288439220..0a70bb55d1b0 100644 --- a/drivers/net/ethernet/freescale/ucc_geth.c +++ b/drivers/net/ethernet/freescale/ucc_geth.c | |||
@@ -209,14 +209,12 @@ static struct list_head *dequeue(struct list_head *lh) | |||
209 | static struct sk_buff *get_new_skb(struct ucc_geth_private *ugeth, | 209 | static struct sk_buff *get_new_skb(struct ucc_geth_private *ugeth, |
210 | u8 __iomem *bd) | 210 | u8 __iomem *bd) |
211 | { | 211 | { |
212 | struct sk_buff *skb = NULL; | 212 | struct sk_buff *skb; |
213 | 213 | ||
214 | skb = __skb_dequeue(&ugeth->rx_recycle); | 214 | skb = netdev_alloc_skb(ugeth->ndev, |
215 | ugeth->ug_info->uf_info.max_rx_buf_length + | ||
216 | UCC_GETH_RX_DATA_BUF_ALIGNMENT); | ||
215 | if (!skb) | 217 | if (!skb) |
216 | skb = netdev_alloc_skb(ugeth->ndev, | ||
217 | ugeth->ug_info->uf_info.max_rx_buf_length + | ||
218 | UCC_GETH_RX_DATA_BUF_ALIGNMENT); | ||
219 | if (skb == NULL) | ||
220 | return NULL; | 218 | return NULL; |
221 | 219 | ||
222 | /* We need the data buffer to be aligned properly. We will reserve | 220 | /* We need the data buffer to be aligned properly. We will reserve |
@@ -2020,8 +2018,6 @@ static void ucc_geth_memclean(struct ucc_geth_private *ugeth) | |||
2020 | iounmap(ugeth->ug_regs); | 2018 | iounmap(ugeth->ug_regs); |
2021 | ugeth->ug_regs = NULL; | 2019 | ugeth->ug_regs = NULL; |
2022 | } | 2020 | } |
2023 | |||
2024 | skb_queue_purge(&ugeth->rx_recycle); | ||
2025 | } | 2021 | } |
2026 | 2022 | ||
2027 | static void ucc_geth_set_multi(struct net_device *dev) | 2023 | static void ucc_geth_set_multi(struct net_device *dev) |
@@ -2230,8 +2226,6 @@ static int ucc_struct_init(struct ucc_geth_private *ugeth) | |||
2230 | return -ENOMEM; | 2226 | return -ENOMEM; |
2231 | } | 2227 | } |
2232 | 2228 | ||
2233 | skb_queue_head_init(&ugeth->rx_recycle); | ||
2234 | |||
2235 | return 0; | 2229 | return 0; |
2236 | } | 2230 | } |
2237 | 2231 | ||
@@ -3274,12 +3268,7 @@ static int ucc_geth_rx(struct ucc_geth_private *ugeth, u8 rxQ, int rx_work_limit | |||
3274 | if (netif_msg_rx_err(ugeth)) | 3268 | if (netif_msg_rx_err(ugeth)) |
3275 | ugeth_err("%s, %d: ERROR!!! skb - 0x%08x", | 3269 | ugeth_err("%s, %d: ERROR!!! skb - 0x%08x", |
3276 | __func__, __LINE__, (u32) skb); | 3270 | __func__, __LINE__, (u32) skb); |
3277 | if (skb) { | 3271 | dev_kfree_skb(skb); |
3278 | skb->data = skb->head + NET_SKB_PAD; | ||
3279 | skb->len = 0; | ||
3280 | skb_reset_tail_pointer(skb); | ||
3281 | __skb_queue_head(&ugeth->rx_recycle, skb); | ||
3282 | } | ||
3283 | 3272 | ||
3284 | ugeth->rx_skbuff[rxQ][ugeth->skb_currx[rxQ]] = NULL; | 3273 | ugeth->rx_skbuff[rxQ][ugeth->skb_currx[rxQ]] = NULL; |
3285 | dev->stats.rx_dropped++; | 3274 | dev->stats.rx_dropped++; |
@@ -3349,13 +3338,7 @@ static int ucc_geth_tx(struct net_device *dev, u8 txQ) | |||
3349 | 3338 | ||
3350 | dev->stats.tx_packets++; | 3339 | dev->stats.tx_packets++; |
3351 | 3340 | ||
3352 | if (skb_queue_len(&ugeth->rx_recycle) < RX_BD_RING_LEN && | 3341 | dev_kfree_skb(skb); |
3353 | skb_recycle_check(skb, | ||
3354 | ugeth->ug_info->uf_info.max_rx_buf_length + | ||
3355 | UCC_GETH_RX_DATA_BUF_ALIGNMENT)) | ||
3356 | __skb_queue_head(&ugeth->rx_recycle, skb); | ||
3357 | else | ||
3358 | dev_kfree_skb(skb); | ||
3359 | 3342 | ||
3360 | ugeth->tx_skbuff[txQ][ugeth->skb_dirtytx[txQ]] = NULL; | 3343 | ugeth->tx_skbuff[txQ][ugeth->skb_dirtytx[txQ]] = NULL; |
3361 | ugeth->skb_dirtytx[txQ] = | 3344 | ugeth->skb_dirtytx[txQ] = |
diff --git a/drivers/net/ethernet/freescale/ucc_geth.h b/drivers/net/ethernet/freescale/ucc_geth.h index f71b3e7b12de..75f337163ce3 100644 --- a/drivers/net/ethernet/freescale/ucc_geth.h +++ b/drivers/net/ethernet/freescale/ucc_geth.h | |||
@@ -1214,8 +1214,6 @@ struct ucc_geth_private { | |||
1214 | /* index of the first skb which hasn't been transmitted yet. */ | 1214 | /* index of the first skb which hasn't been transmitted yet. */ |
1215 | u16 skb_dirtytx[NUM_TX_QUEUES]; | 1215 | u16 skb_dirtytx[NUM_TX_QUEUES]; |
1216 | 1216 | ||
1217 | struct sk_buff_head rx_recycle; | ||
1218 | |||
1219 | struct ugeth_mii_info *mii_info; | 1217 | struct ugeth_mii_info *mii_info; |
1220 | struct phy_device *phydev; | 1218 | struct phy_device *phydev; |
1221 | phy_interface_t phy_interface; | 1219 | phy_interface_t phy_interface; |
diff --git a/drivers/net/ethernet/intel/e1000e/e1000.h b/drivers/net/ethernet/intel/e1000e/e1000.h index cb3356c9af80..04668b47a1df 100644 --- a/drivers/net/ethernet/intel/e1000e/e1000.h +++ b/drivers/net/ethernet/intel/e1000e/e1000.h | |||
@@ -175,13 +175,13 @@ struct e1000_info; | |||
175 | /* | 175 | /* |
176 | * in the case of WTHRESH, it appears at least the 82571/2 hardware | 176 | * in the case of WTHRESH, it appears at least the 82571/2 hardware |
177 | * writes back 4 descriptors when WTHRESH=5, and 3 descriptors when | 177 | * writes back 4 descriptors when WTHRESH=5, and 3 descriptors when |
178 | * WTHRESH=4, and since we want 64 bytes at a time written back, set | 178 | * WTHRESH=4, so a setting of 5 gives the most efficient bus |
179 | * it to 5 | 179 | * utilization but to avoid possible Tx stalls, set it to 1 |
180 | */ | 180 | */ |
181 | #define E1000_TXDCTL_DMA_BURST_ENABLE \ | 181 | #define E1000_TXDCTL_DMA_BURST_ENABLE \ |
182 | (E1000_TXDCTL_GRAN | /* set descriptor granularity */ \ | 182 | (E1000_TXDCTL_GRAN | /* set descriptor granularity */ \ |
183 | E1000_TXDCTL_COUNT_DESC | \ | 183 | E1000_TXDCTL_COUNT_DESC | \ |
184 | (5 << 16) | /* wthresh must be +1 more than desired */\ | 184 | (1 << 16) | /* wthresh must be +1 more than desired */\ |
185 | (1 << 8) | /* hthresh */ \ | 185 | (1 << 8) | /* hthresh */ \ |
186 | 0x1f) /* pthresh */ | 186 | 0x1f) /* pthresh */ |
187 | 187 | ||
diff --git a/drivers/net/ethernet/intel/e1000e/hw.h b/drivers/net/ethernet/intel/e1000e/hw.h index ed5b40985edb..d37bfd96c987 100644 --- a/drivers/net/ethernet/intel/e1000e/hw.h +++ b/drivers/net/ethernet/intel/e1000e/hw.h | |||
@@ -412,6 +412,8 @@ enum e1e_registers { | |||
412 | #define E1000_DEV_ID_PCH2_LV_V 0x1503 | 412 | #define E1000_DEV_ID_PCH2_LV_V 0x1503 |
413 | #define E1000_DEV_ID_PCH_LPT_I217_LM 0x153A | 413 | #define E1000_DEV_ID_PCH_LPT_I217_LM 0x153A |
414 | #define E1000_DEV_ID_PCH_LPT_I217_V 0x153B | 414 | #define E1000_DEV_ID_PCH_LPT_I217_V 0x153B |
415 | #define E1000_DEV_ID_PCH_LPTLP_I218_LM 0x155A | ||
416 | #define E1000_DEV_ID_PCH_LPTLP_I218_V 0x1559 | ||
415 | 417 | ||
416 | #define E1000_REVISION_4 4 | 418 | #define E1000_REVISION_4 4 |
417 | 419 | ||
diff --git a/drivers/net/ethernet/intel/e1000e/netdev.c b/drivers/net/ethernet/intel/e1000e/netdev.c index fb659dd8db03..f444eb0b76d8 100644 --- a/drivers/net/ethernet/intel/e1000e/netdev.c +++ b/drivers/net/ethernet/intel/e1000e/netdev.c | |||
@@ -2831,7 +2831,7 @@ static void e1000_configure_tx(struct e1000_adapter *adapter) | |||
2831 | * set up some performance related parameters to encourage the | 2831 | * set up some performance related parameters to encourage the |
2832 | * hardware to use the bus more efficiently in bursts, depends | 2832 | * hardware to use the bus more efficiently in bursts, depends |
2833 | * on the tx_int_delay to be enabled, | 2833 | * on the tx_int_delay to be enabled, |
2834 | * wthresh = 5 ==> burst write a cacheline (64 bytes) at a time | 2834 | * wthresh = 1 ==> burst write is disabled to avoid Tx stalls |
2835 | * hthresh = 1 ==> prefetch when one or more available | 2835 | * hthresh = 1 ==> prefetch when one or more available |
2836 | * pthresh = 0x1f ==> prefetch if internal cache 31 or less | 2836 | * pthresh = 0x1f ==> prefetch if internal cache 31 or less |
2837 | * BEWARE: this seems to work but should be considered first if | 2837 | * BEWARE: this seems to work but should be considered first if |
@@ -6558,6 +6558,8 @@ static DEFINE_PCI_DEVICE_TABLE(e1000_pci_tbl) = { | |||
6558 | 6558 | ||
6559 | { PCI_VDEVICE(INTEL, E1000_DEV_ID_PCH_LPT_I217_LM), board_pch_lpt }, | 6559 | { PCI_VDEVICE(INTEL, E1000_DEV_ID_PCH_LPT_I217_LM), board_pch_lpt }, |
6560 | { PCI_VDEVICE(INTEL, E1000_DEV_ID_PCH_LPT_I217_V), board_pch_lpt }, | 6560 | { PCI_VDEVICE(INTEL, E1000_DEV_ID_PCH_LPT_I217_V), board_pch_lpt }, |
6561 | { PCI_VDEVICE(INTEL, E1000_DEV_ID_PCH_LPTLP_I218_LM), board_pch_lpt }, | ||
6562 | { PCI_VDEVICE(INTEL, E1000_DEV_ID_PCH_LPTLP_I218_V), board_pch_lpt }, | ||
6561 | 6563 | ||
6562 | { 0, 0, 0, 0, 0, 0, 0 } /* terminate list */ | 6564 | { 0, 0, 0, 0, 0, 0, 0 } /* terminate list */ |
6563 | }; | 6565 | }; |
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe.h b/drivers/net/ethernet/intel/ixgbe/ixgbe.h index 5bd26763554c..30efc9f0f47a 100644 --- a/drivers/net/ethernet/intel/ixgbe/ixgbe.h +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe.h | |||
@@ -410,7 +410,7 @@ static inline u16 ixgbe_desc_unused(struct ixgbe_ring *ring) | |||
410 | #define IXGBE_TX_CTXTDESC(R, i) \ | 410 | #define IXGBE_TX_CTXTDESC(R, i) \ |
411 | (&(((struct ixgbe_adv_tx_context_desc *)((R)->desc))[i])) | 411 | (&(((struct ixgbe_adv_tx_context_desc *)((R)->desc))[i])) |
412 | 412 | ||
413 | #define IXGBE_MAX_JUMBO_FRAME_SIZE 16128 | 413 | #define IXGBE_MAX_JUMBO_FRAME_SIZE 9728 /* Maximum Supported Size 9.5KB */ |
414 | #ifdef IXGBE_FCOE | 414 | #ifdef IXGBE_FCOE |
415 | /* Use 3K as the baby jumbo frame size for FCoE */ | 415 | /* Use 3K as the baby jumbo frame size for FCoE */ |
416 | #define IXGBE_FCOE_JUMBO_FRAME_SIZE 3072 | 416 | #define IXGBE_FCOE_JUMBO_FRAME_SIZE 3072 |
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c index 56b20d17d0e4..116f0e901bee 100644 --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c | |||
@@ -2673,6 +2673,9 @@ static int ixgbe_get_ts_info(struct net_device *dev, | |||
2673 | case ixgbe_mac_X540: | 2673 | case ixgbe_mac_X540: |
2674 | case ixgbe_mac_82599EB: | 2674 | case ixgbe_mac_82599EB: |
2675 | info->so_timestamping = | 2675 | info->so_timestamping = |
2676 | SOF_TIMESTAMPING_TX_SOFTWARE | | ||
2677 | SOF_TIMESTAMPING_RX_SOFTWARE | | ||
2678 | SOF_TIMESTAMPING_SOFTWARE | | ||
2676 | SOF_TIMESTAMPING_TX_HARDWARE | | 2679 | SOF_TIMESTAMPING_TX_HARDWARE | |
2677 | SOF_TIMESTAMPING_RX_HARDWARE | | 2680 | SOF_TIMESTAMPING_RX_HARDWARE | |
2678 | SOF_TIMESTAMPING_RAW_HARDWARE; | 2681 | SOF_TIMESTAMPING_RAW_HARDWARE; |
diff --git a/drivers/net/ethernet/intel/ixgbevf/ixgbevf.h b/drivers/net/ethernet/intel/ixgbevf/ixgbevf.h index 383b4e1cd175..4a9c9c285685 100644 --- a/drivers/net/ethernet/intel/ixgbevf/ixgbevf.h +++ b/drivers/net/ethernet/intel/ixgbevf/ixgbevf.h | |||
@@ -175,7 +175,7 @@ struct ixgbevf_q_vector { | |||
175 | #define IXGBEVF_TX_CTXTDESC(R, i) \ | 175 | #define IXGBEVF_TX_CTXTDESC(R, i) \ |
176 | (&(((struct ixgbe_adv_tx_context_desc *)((R)->desc))[i])) | 176 | (&(((struct ixgbe_adv_tx_context_desc *)((R)->desc))[i])) |
177 | 177 | ||
178 | #define IXGBE_MAX_JUMBO_FRAME_SIZE 16128 | 178 | #define IXGBE_MAX_JUMBO_FRAME_SIZE 9728 /* Maximum Supported Size 9.5KB */ |
179 | 179 | ||
180 | #define OTHER_VECTOR 1 | 180 | #define OTHER_VECTOR 1 |
181 | #define NON_Q_VECTORS (OTHER_VECTOR) | 181 | #define NON_Q_VECTORS (OTHER_VECTOR) |
diff --git a/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c b/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c index 0ee9bd4819f4..de1ad506665d 100644 --- a/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c +++ b/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c | |||
@@ -1747,6 +1747,7 @@ err_tx_ring_allocation: | |||
1747 | **/ | 1747 | **/ |
1748 | static int ixgbevf_set_interrupt_capability(struct ixgbevf_adapter *adapter) | 1748 | static int ixgbevf_set_interrupt_capability(struct ixgbevf_adapter *adapter) |
1749 | { | 1749 | { |
1750 | struct net_device *netdev = adapter->netdev; | ||
1750 | int err = 0; | 1751 | int err = 0; |
1751 | int vector, v_budget; | 1752 | int vector, v_budget; |
1752 | 1753 | ||
@@ -1775,6 +1776,12 @@ static int ixgbevf_set_interrupt_capability(struct ixgbevf_adapter *adapter) | |||
1775 | 1776 | ||
1776 | ixgbevf_acquire_msix_vectors(adapter, v_budget); | 1777 | ixgbevf_acquire_msix_vectors(adapter, v_budget); |
1777 | 1778 | ||
1779 | err = netif_set_real_num_tx_queues(netdev, adapter->num_tx_queues); | ||
1780 | if (err) | ||
1781 | goto out; | ||
1782 | |||
1783 | err = netif_set_real_num_rx_queues(netdev, adapter->num_rx_queues); | ||
1784 | |||
1778 | out: | 1785 | out: |
1779 | return err; | 1786 | return err; |
1780 | } | 1787 | } |
diff --git a/drivers/net/ethernet/jme.c b/drivers/net/ethernet/jme.c index c911d883c27e..f8064df10cc4 100644 --- a/drivers/net/ethernet/jme.c +++ b/drivers/net/ethernet/jme.c | |||
@@ -27,6 +27,7 @@ | |||
27 | #include <linux/module.h> | 27 | #include <linux/module.h> |
28 | #include <linux/kernel.h> | 28 | #include <linux/kernel.h> |
29 | #include <linux/pci.h> | 29 | #include <linux/pci.h> |
30 | #include <linux/pci-aspm.h> | ||
30 | #include <linux/netdevice.h> | 31 | #include <linux/netdevice.h> |
31 | #include <linux/etherdevice.h> | 32 | #include <linux/etherdevice.h> |
32 | #include <linux/ethtool.h> | 33 | #include <linux/ethtool.h> |
@@ -2973,6 +2974,9 @@ jme_init_one(struct pci_dev *pdev, | |||
2973 | /* | 2974 | /* |
2974 | * set up PCI device basics | 2975 | * set up PCI device basics |
2975 | */ | 2976 | */ |
2977 | pci_disable_link_state(pdev, PCIE_LINK_STATE_L0S | PCIE_LINK_STATE_L1 | | ||
2978 | PCIE_LINK_STATE_CLKPM); | ||
2979 | |||
2976 | rc = pci_enable_device(pdev); | 2980 | rc = pci_enable_device(pdev); |
2977 | if (rc) { | 2981 | if (rc) { |
2978 | pr_err("Cannot enable PCI device\n"); | 2982 | pr_err("Cannot enable PCI device\n"); |
diff --git a/drivers/net/ethernet/marvell/mv643xx_eth.c b/drivers/net/ethernet/marvell/mv643xx_eth.c index 087b9e0669f1..84c13263c514 100644 --- a/drivers/net/ethernet/marvell/mv643xx_eth.c +++ b/drivers/net/ethernet/marvell/mv643xx_eth.c | |||
@@ -412,7 +412,6 @@ struct mv643xx_eth_private { | |||
412 | u8 work_rx_refill; | 412 | u8 work_rx_refill; |
413 | 413 | ||
414 | int skb_size; | 414 | int skb_size; |
415 | struct sk_buff_head rx_recycle; | ||
416 | 415 | ||
417 | /* | 416 | /* |
418 | * RX state. | 417 | * RX state. |
@@ -673,9 +672,7 @@ static int rxq_refill(struct rx_queue *rxq, int budget) | |||
673 | struct rx_desc *rx_desc; | 672 | struct rx_desc *rx_desc; |
674 | int size; | 673 | int size; |
675 | 674 | ||
676 | skb = __skb_dequeue(&mp->rx_recycle); | 675 | skb = netdev_alloc_skb(mp->dev, mp->skb_size); |
677 | if (skb == NULL) | ||
678 | skb = netdev_alloc_skb(mp->dev, mp->skb_size); | ||
679 | 676 | ||
680 | if (skb == NULL) { | 677 | if (skb == NULL) { |
681 | mp->oom = 1; | 678 | mp->oom = 1; |
@@ -989,14 +986,7 @@ static int txq_reclaim(struct tx_queue *txq, int budget, int force) | |||
989 | desc->byte_cnt, DMA_TO_DEVICE); | 986 | desc->byte_cnt, DMA_TO_DEVICE); |
990 | } | 987 | } |
991 | 988 | ||
992 | if (skb != NULL) { | 989 | dev_kfree_skb(skb); |
993 | if (skb_queue_len(&mp->rx_recycle) < | ||
994 | mp->rx_ring_size && | ||
995 | skb_recycle_check(skb, mp->skb_size)) | ||
996 | __skb_queue_head(&mp->rx_recycle, skb); | ||
997 | else | ||
998 | dev_kfree_skb(skb); | ||
999 | } | ||
1000 | } | 990 | } |
1001 | 991 | ||
1002 | __netif_tx_unlock(nq); | 992 | __netif_tx_unlock(nq); |
@@ -2349,8 +2339,6 @@ static int mv643xx_eth_open(struct net_device *dev) | |||
2349 | 2339 | ||
2350 | napi_enable(&mp->napi); | 2340 | napi_enable(&mp->napi); |
2351 | 2341 | ||
2352 | skb_queue_head_init(&mp->rx_recycle); | ||
2353 | |||
2354 | mp->int_mask = INT_EXT; | 2342 | mp->int_mask = INT_EXT; |
2355 | 2343 | ||
2356 | for (i = 0; i < mp->rxq_count; i++) { | 2344 | for (i = 0; i < mp->rxq_count; i++) { |
@@ -2445,8 +2433,6 @@ static int mv643xx_eth_stop(struct net_device *dev) | |||
2445 | mib_counters_update(mp); | 2433 | mib_counters_update(mp); |
2446 | del_timer_sync(&mp->mib_counters_timer); | 2434 | del_timer_sync(&mp->mib_counters_timer); |
2447 | 2435 | ||
2448 | skb_queue_purge(&mp->rx_recycle); | ||
2449 | |||
2450 | for (i = 0; i < mp->rxq_count; i++) | 2436 | for (i = 0; i < mp->rxq_count; i++) |
2451 | rxq_deinit(mp->rxq + i); | 2437 | rxq_deinit(mp->rxq + i); |
2452 | for (i = 0; i < mp->txq_count; i++) | 2438 | for (i = 0; i < mp->txq_count; i++) |
diff --git a/drivers/net/ethernet/marvell/skge.c b/drivers/net/ethernet/marvell/skge.c index 5a30bf823099..9b9c2ac5c4c2 100644 --- a/drivers/net/ethernet/marvell/skge.c +++ b/drivers/net/ethernet/marvell/skge.c | |||
@@ -3189,7 +3189,7 @@ static int skge_poll(struct napi_struct *napi, int to_do) | |||
3189 | if (work_done < to_do) { | 3189 | if (work_done < to_do) { |
3190 | unsigned long flags; | 3190 | unsigned long flags; |
3191 | 3191 | ||
3192 | napi_gro_flush(napi); | 3192 | napi_gro_flush(napi, false); |
3193 | spin_lock_irqsave(&hw->hw_lock, flags); | 3193 | spin_lock_irqsave(&hw->hw_lock, flags); |
3194 | __napi_complete(napi); | 3194 | __napi_complete(napi); |
3195 | hw->intr_mask |= napimask[skge->port]; | 3195 | hw->intr_mask |= napimask[skge->port]; |
@@ -3945,8 +3945,10 @@ static int __devinit skge_probe(struct pci_dev *pdev, | |||
3945 | skge_board_name(hw), hw->chip_rev); | 3945 | skge_board_name(hw), hw->chip_rev); |
3946 | 3946 | ||
3947 | dev = skge_devinit(hw, 0, using_dac); | 3947 | dev = skge_devinit(hw, 0, using_dac); |
3948 | if (!dev) | 3948 | if (!dev) { |
3949 | err = -ENOMEM; | ||
3949 | goto err_out_led_off; | 3950 | goto err_out_led_off; |
3951 | } | ||
3950 | 3952 | ||
3951 | /* Some motherboards are broken and has zero in ROM. */ | 3953 | /* Some motherboards are broken and has zero in ROM. */ |
3952 | if (!is_valid_ether_addr(dev->dev_addr)) | 3954 | if (!is_valid_ether_addr(dev->dev_addr)) |
@@ -4153,6 +4155,13 @@ static struct dmi_system_id skge_32bit_dma_boards[] = { | |||
4153 | DMI_MATCH(DMI_BOARD_NAME, "nForce"), | 4155 | DMI_MATCH(DMI_BOARD_NAME, "nForce"), |
4154 | }, | 4156 | }, |
4155 | }, | 4157 | }, |
4158 | { | ||
4159 | .ident = "ASUS P5NSLI", | ||
4160 | .matches = { | ||
4161 | DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."), | ||
4162 | DMI_MATCH(DMI_BOARD_NAME, "P5NSLI") | ||
4163 | }, | ||
4164 | }, | ||
4156 | {} | 4165 | {} |
4157 | }; | 4166 | }; |
4158 | 4167 | ||
diff --git a/drivers/net/ethernet/marvell/sky2.c b/drivers/net/ethernet/marvell/sky2.c index 2b0748dba8b8..78946feab4a2 100644 --- a/drivers/net/ethernet/marvell/sky2.c +++ b/drivers/net/ethernet/marvell/sky2.c | |||
@@ -4924,6 +4924,7 @@ static int __devinit sky2_probe(struct pci_dev *pdev, | |||
4924 | 4924 | ||
4925 | if (~reg == 0) { | 4925 | if (~reg == 0) { |
4926 | dev_err(&pdev->dev, "PCI configuration read error\n"); | 4926 | dev_err(&pdev->dev, "PCI configuration read error\n"); |
4927 | err = -EIO; | ||
4927 | goto err_out; | 4928 | goto err_out; |
4928 | } | 4929 | } |
4929 | 4930 | ||
@@ -4993,8 +4994,10 @@ static int __devinit sky2_probe(struct pci_dev *pdev, | |||
4993 | hw->st_size = hw->ports * roundup_pow_of_two(3*RX_MAX_PENDING + TX_MAX_PENDING); | 4994 | hw->st_size = hw->ports * roundup_pow_of_two(3*RX_MAX_PENDING + TX_MAX_PENDING); |
4994 | hw->st_le = pci_alloc_consistent(pdev, hw->st_size * sizeof(struct sky2_status_le), | 4995 | hw->st_le = pci_alloc_consistent(pdev, hw->st_size * sizeof(struct sky2_status_le), |
4995 | &hw->st_dma); | 4996 | &hw->st_dma); |
4996 | if (!hw->st_le) | 4997 | if (!hw->st_le) { |
4998 | err = -ENOMEM; | ||
4997 | goto err_out_reset; | 4999 | goto err_out_reset; |
5000 | } | ||
4998 | 5001 | ||
4999 | dev_info(&pdev->dev, "Yukon-2 %s chip revision %d\n", | 5002 | dev_info(&pdev->dev, "Yukon-2 %s chip revision %d\n", |
5000 | sky2_name(hw->chip_id, buf1, sizeof(buf1)), hw->chip_rev); | 5003 | sky2_name(hw->chip_id, buf1, sizeof(buf1)), hw->chip_rev); |
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/natsemi/natsemi.c b/drivers/net/ethernet/natsemi/natsemi.c index 5b61d12f8b91..dbaaa99a0d43 100644 --- a/drivers/net/ethernet/natsemi/natsemi.c +++ b/drivers/net/ethernet/natsemi/natsemi.c | |||
@@ -947,8 +947,8 @@ static int __devinit natsemi_probe1 (struct pci_dev *pdev, | |||
947 | i = register_netdev(dev); | 947 | i = register_netdev(dev); |
948 | if (i) | 948 | if (i) |
949 | goto err_register_netdev; | 949 | goto err_register_netdev; |
950 | 950 | i = NATSEMI_CREATE_FILE(pdev, dspcfg_workaround); | |
951 | if (NATSEMI_CREATE_FILE(pdev, dspcfg_workaround)) | 951 | if (i) |
952 | goto err_create_file; | 952 | goto err_create_file; |
953 | 953 | ||
954 | if (netif_msg_drv(np)) { | 954 | if (netif_msg_drv(np)) { |
diff --git a/drivers/net/ethernet/natsemi/xtsonic.c b/drivers/net/ethernet/natsemi/xtsonic.c index e01c0a07a93a..7dfe88398d7d 100644 --- a/drivers/net/ethernet/natsemi/xtsonic.c +++ b/drivers/net/ethernet/natsemi/xtsonic.c | |||
@@ -205,6 +205,7 @@ static int __init sonic_probe1(struct net_device *dev) | |||
205 | if (lp->descriptors == NULL) { | 205 | if (lp->descriptors == NULL) { |
206 | printk(KERN_ERR "%s: couldn't alloc DMA memory for " | 206 | printk(KERN_ERR "%s: couldn't alloc DMA memory for " |
207 | " descriptors.\n", dev_name(lp->device)); | 207 | " descriptors.\n", dev_name(lp->device)); |
208 | err = -ENOMEM; | ||
208 | goto out; | 209 | goto out; |
209 | } | 210 | } |
210 | 211 | ||
diff --git a/drivers/net/ethernet/nxp/lpc_eth.c b/drivers/net/ethernet/nxp/lpc_eth.c index 53743f7a2ca9..af8b4142088c 100644 --- a/drivers/net/ethernet/nxp/lpc_eth.c +++ b/drivers/net/ethernet/nxp/lpc_eth.c | |||
@@ -1524,6 +1524,7 @@ static int lpc_eth_drv_remove(struct platform_device *pdev) | |||
1524 | pldat->dma_buff_base_p); | 1524 | pldat->dma_buff_base_p); |
1525 | free_irq(ndev->irq, ndev); | 1525 | free_irq(ndev->irq, ndev); |
1526 | iounmap(pldat->net_base); | 1526 | iounmap(pldat->net_base); |
1527 | mdiobus_unregister(pldat->mii_bus); | ||
1527 | mdiobus_free(pldat->mii_bus); | 1528 | mdiobus_free(pldat->mii_bus); |
1528 | clk_disable(pldat->clk); | 1529 | clk_disable(pldat->clk); |
1529 | clk_put(pldat->clk); | 1530 | clk_put(pldat->clk); |
diff --git a/drivers/net/ethernet/oki-semi/pch_gbe/Kconfig b/drivers/net/ethernet/oki-semi/pch_gbe/Kconfig index 97302419a377..5296cc8d3cba 100644 --- a/drivers/net/ethernet/oki-semi/pch_gbe/Kconfig +++ b/drivers/net/ethernet/oki-semi/pch_gbe/Kconfig | |||
@@ -26,6 +26,9 @@ if PCH_GBE | |||
26 | config PCH_PTP | 26 | config PCH_PTP |
27 | bool "PCH PTP clock support" | 27 | bool "PCH PTP clock support" |
28 | default n | 28 | default n |
29 | depends on EXPERIMENTAL | ||
30 | select PPS | ||
31 | select PTP_1588_CLOCK | ||
29 | select PTP_1588_CLOCK_PCH | 32 | select PTP_1588_CLOCK_PCH |
30 | ---help--- | 33 | ---help--- |
31 | Say Y here if you want to use Precision Time Protocol (PTP) in the | 34 | Say Y here if you want to use Precision Time Protocol (PTP) in the |
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/qlogic/qlcnic/qlcnic_main.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c index 473ce134ca63..24ad17ec7fcd 100644 --- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c +++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c | |||
@@ -1601,7 +1601,8 @@ qlcnic_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
1601 | adapter->netdev = netdev; | 1601 | adapter->netdev = netdev; |
1602 | adapter->pdev = pdev; | 1602 | adapter->pdev = pdev; |
1603 | 1603 | ||
1604 | if (qlcnic_alloc_adapter_resources(adapter)) | 1604 | err = qlcnic_alloc_adapter_resources(adapter); |
1605 | if (err) | ||
1605 | goto err_out_free_netdev; | 1606 | goto err_out_free_netdev; |
1606 | 1607 | ||
1607 | adapter->dev_rst_time = jiffies; | 1608 | adapter->dev_rst_time = jiffies; |
diff --git a/drivers/net/ethernet/realtek/8139cp.c b/drivers/net/ethernet/realtek/8139cp.c index 995d0cfc4c06..1c818254b7be 100644 --- a/drivers/net/ethernet/realtek/8139cp.c +++ b/drivers/net/ethernet/realtek/8139cp.c | |||
@@ -563,7 +563,7 @@ rx_next: | |||
563 | if (cpr16(IntrStatus) & cp_rx_intr_mask) | 563 | if (cpr16(IntrStatus) & cp_rx_intr_mask) |
564 | goto rx_status_loop; | 564 | goto rx_status_loop; |
565 | 565 | ||
566 | napi_gro_flush(napi); | 566 | napi_gro_flush(napi, false); |
567 | spin_lock_irqsave(&cp->lock, flags); | 567 | spin_lock_irqsave(&cp->lock, flags); |
568 | __napi_complete(napi); | 568 | __napi_complete(napi); |
569 | cpw16_f(IntrMask, cp_intr_mask); | 569 | cpw16_f(IntrMask, cp_intr_mask); |
diff --git a/drivers/net/ethernet/renesas/sh_eth.c b/drivers/net/ethernet/renesas/sh_eth.c index bad8f2eec9b4..c8bfea0524dd 100644 --- a/drivers/net/ethernet/renesas/sh_eth.c +++ b/drivers/net/ethernet/renesas/sh_eth.c | |||
@@ -2438,6 +2438,7 @@ static int sh_eth_drv_probe(struct platform_device *pdev) | |||
2438 | rtsu = platform_get_resource(pdev, IORESOURCE_MEM, 1); | 2438 | rtsu = platform_get_resource(pdev, IORESOURCE_MEM, 1); |
2439 | if (!rtsu) { | 2439 | if (!rtsu) { |
2440 | dev_err(&pdev->dev, "Not found TSU resource\n"); | 2440 | dev_err(&pdev->dev, "Not found TSU resource\n"); |
2441 | ret = -ENODEV; | ||
2441 | goto out_release; | 2442 | goto out_release; |
2442 | } | 2443 | } |
2443 | mdp->tsu_addr = ioremap(rtsu->start, | 2444 | mdp->tsu_addr = ioremap(rtsu->start, |
diff --git a/drivers/net/ethernet/sfc/ptp.c b/drivers/net/ethernet/sfc/ptp.c index 5b3dd028ce85..0767043f44a4 100644 --- a/drivers/net/ethernet/sfc/ptp.c +++ b/drivers/net/ethernet/sfc/ptp.c | |||
@@ -640,8 +640,7 @@ static void efx_ptp_drop_time_expired_events(struct efx_nic *efx) | |||
640 | evt = list_entry(cursor, struct efx_ptp_event_rx, | 640 | evt = list_entry(cursor, struct efx_ptp_event_rx, |
641 | link); | 641 | link); |
642 | if (time_after(jiffies, evt->expiry)) { | 642 | if (time_after(jiffies, evt->expiry)) { |
643 | list_del(&evt->link); | 643 | list_move(&evt->link, &ptp->evt_free_list); |
644 | list_add(&evt->link, &ptp->evt_free_list); | ||
645 | netif_warn(efx, hw, efx->net_dev, | 644 | netif_warn(efx, hw, efx->net_dev, |
646 | "PTP rx event dropped\n"); | 645 | "PTP rx event dropped\n"); |
647 | } | 646 | } |
@@ -684,8 +683,7 @@ static enum ptp_packet_state efx_ptp_match_rx(struct efx_nic *efx, | |||
684 | 683 | ||
685 | match->state = PTP_PACKET_STATE_MATCHED; | 684 | match->state = PTP_PACKET_STATE_MATCHED; |
686 | rc = PTP_PACKET_STATE_MATCHED; | 685 | rc = PTP_PACKET_STATE_MATCHED; |
687 | list_del(&evt->link); | 686 | list_move(&evt->link, &ptp->evt_free_list); |
688 | list_add(&evt->link, &ptp->evt_free_list); | ||
689 | break; | 687 | break; |
690 | } | 688 | } |
691 | } | 689 | } |
@@ -820,8 +818,7 @@ static int efx_ptp_stop(struct efx_nic *efx) | |||
820 | /* Drop any pending receive events */ | 818 | /* Drop any pending receive events */ |
821 | spin_lock_bh(&efx->ptp_data->evt_lock); | 819 | spin_lock_bh(&efx->ptp_data->evt_lock); |
822 | list_for_each_safe(cursor, next, &efx->ptp_data->evt_list) { | 820 | list_for_each_safe(cursor, next, &efx->ptp_data->evt_list) { |
823 | list_del(cursor); | 821 | list_move(cursor, &efx->ptp_data->evt_free_list); |
824 | list_add(cursor, &efx->ptp_data->evt_free_list); | ||
825 | } | 822 | } |
826 | spin_unlock_bh(&efx->ptp_data->evt_lock); | 823 | spin_unlock_bh(&efx->ptp_data->evt_lock); |
827 | 824 | ||
diff --git a/drivers/net/ethernet/sis/sis900.c b/drivers/net/ethernet/sis/sis900.c index 203d9c6ec23a..fb9f6b38511f 100644 --- a/drivers/net/ethernet/sis/sis900.c +++ b/drivers/net/ethernet/sis/sis900.c | |||
@@ -478,8 +478,10 @@ static int __devinit sis900_probe(struct pci_dev *pci_dev, | |||
478 | 478 | ||
479 | /* IO region. */ | 479 | /* IO region. */ |
480 | ioaddr = pci_iomap(pci_dev, 0, 0); | 480 | ioaddr = pci_iomap(pci_dev, 0, 0); |
481 | if (!ioaddr) | 481 | if (!ioaddr) { |
482 | ret = -ENOMEM; | ||
482 | goto err_out_cleardev; | 483 | goto err_out_cleardev; |
484 | } | ||
483 | 485 | ||
484 | sis_priv = netdev_priv(net_dev); | 486 | sis_priv = netdev_priv(net_dev); |
485 | sis_priv->ioaddr = ioaddr; | 487 | sis_priv->ioaddr = ioaddr; |
diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac.h b/drivers/net/ethernet/stmicro/stmmac/stmmac.h index e872e1da3137..7d51a65ab099 100644 --- a/drivers/net/ethernet/stmicro/stmmac/stmmac.h +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac.h | |||
@@ -50,7 +50,6 @@ struct stmmac_priv { | |||
50 | unsigned int dirty_rx; | 50 | unsigned int dirty_rx; |
51 | struct sk_buff **rx_skbuff; | 51 | struct sk_buff **rx_skbuff; |
52 | dma_addr_t *rx_skbuff_dma; | 52 | dma_addr_t *rx_skbuff_dma; |
53 | struct sk_buff_head rx_recycle; | ||
54 | 53 | ||
55 | struct net_device *dev; | 54 | struct net_device *dev; |
56 | dma_addr_t dma_rx_phy; | 55 | dma_addr_t dma_rx_phy; |
diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c index 3be88331d17a..c6cdbc4eb05e 100644 --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | |||
@@ -747,18 +747,7 @@ static void stmmac_tx(struct stmmac_priv *priv) | |||
747 | priv->hw->ring->clean_desc3(p); | 747 | priv->hw->ring->clean_desc3(p); |
748 | 748 | ||
749 | if (likely(skb != NULL)) { | 749 | if (likely(skb != NULL)) { |
750 | /* | 750 | dev_kfree_skb(skb); |
751 | * If there's room in the queue (limit it to size) | ||
752 | * we add this skb back into the pool, | ||
753 | * if it's the right size. | ||
754 | */ | ||
755 | if ((skb_queue_len(&priv->rx_recycle) < | ||
756 | priv->dma_rx_size) && | ||
757 | skb_recycle_check(skb, priv->dma_buf_sz)) | ||
758 | __skb_queue_head(&priv->rx_recycle, skb); | ||
759 | else | ||
760 | dev_kfree_skb(skb); | ||
761 | |||
762 | priv->tx_skbuff[entry] = NULL; | 751 | priv->tx_skbuff[entry] = NULL; |
763 | } | 752 | } |
764 | 753 | ||
@@ -1169,7 +1158,6 @@ static int stmmac_open(struct net_device *dev) | |||
1169 | priv->eee_enabled = stmmac_eee_init(priv); | 1158 | priv->eee_enabled = stmmac_eee_init(priv); |
1170 | 1159 | ||
1171 | napi_enable(&priv->napi); | 1160 | napi_enable(&priv->napi); |
1172 | skb_queue_head_init(&priv->rx_recycle); | ||
1173 | netif_start_queue(dev); | 1161 | netif_start_queue(dev); |
1174 | 1162 | ||
1175 | return 0; | 1163 | return 0; |
@@ -1222,7 +1210,6 @@ static int stmmac_release(struct net_device *dev) | |||
1222 | kfree(priv->tm); | 1210 | kfree(priv->tm); |
1223 | #endif | 1211 | #endif |
1224 | napi_disable(&priv->napi); | 1212 | napi_disable(&priv->napi); |
1225 | skb_queue_purge(&priv->rx_recycle); | ||
1226 | 1213 | ||
1227 | /* Free the IRQ lines */ | 1214 | /* Free the IRQ lines */ |
1228 | free_irq(dev->irq, dev); | 1215 | free_irq(dev->irq, dev); |
@@ -1388,10 +1375,7 @@ static inline void stmmac_rx_refill(struct stmmac_priv *priv) | |||
1388 | if (likely(priv->rx_skbuff[entry] == NULL)) { | 1375 | if (likely(priv->rx_skbuff[entry] == NULL)) { |
1389 | struct sk_buff *skb; | 1376 | struct sk_buff *skb; |
1390 | 1377 | ||
1391 | skb = __skb_dequeue(&priv->rx_recycle); | 1378 | skb = netdev_alloc_skb_ip_align(priv->dev, bfsize); |
1392 | if (skb == NULL) | ||
1393 | skb = netdev_alloc_skb_ip_align(priv->dev, | ||
1394 | bfsize); | ||
1395 | 1379 | ||
1396 | if (unlikely(skb == NULL)) | 1380 | if (unlikely(skb == NULL)) |
1397 | break; | 1381 | break; |
diff --git a/drivers/net/ethernet/sun/niu.c b/drivers/net/ethernet/sun/niu.c index 8419bf385e08..275b430aeb75 100644 --- a/drivers/net/ethernet/sun/niu.c +++ b/drivers/net/ethernet/sun/niu.c | |||
@@ -9788,6 +9788,7 @@ static int __devinit niu_pci_init_one(struct pci_dev *pdev, | |||
9788 | 9788 | ||
9789 | if (!pci_is_pcie(pdev)) { | 9789 | if (!pci_is_pcie(pdev)) { |
9790 | dev_err(&pdev->dev, "Cannot find PCI Express capability, aborting\n"); | 9790 | dev_err(&pdev->dev, "Cannot find PCI Express capability, aborting\n"); |
9791 | err = -ENODEV; | ||
9791 | goto err_out_free_res; | 9792 | goto err_out_free_res; |
9792 | } | 9793 | } |
9793 | 9794 | ||
diff --git a/drivers/net/ethernet/sun/sungem.c b/drivers/net/ethernet/sun/sungem.c index 9ae12d0c9632..6c8695ec7cb9 100644 --- a/drivers/net/ethernet/sun/sungem.c +++ b/drivers/net/ethernet/sun/sungem.c | |||
@@ -2963,7 +2963,8 @@ static int __devinit gem_init_one(struct pci_dev *pdev, | |||
2963 | goto err_out_iounmap; | 2963 | goto err_out_iounmap; |
2964 | } | 2964 | } |
2965 | 2965 | ||
2966 | if (gem_get_device_address(gp)) | 2966 | err = gem_get_device_address(gp); |
2967 | if (err) | ||
2967 | goto err_out_free_consistent; | 2968 | goto err_out_free_consistent; |
2968 | 2969 | ||
2969 | dev->netdev_ops = &gem_netdev_ops; | 2970 | dev->netdev_ops = &gem_netdev_ops; |
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/irda/irtty-sir.c b/drivers/net/irda/irtty-sir.c index 30087ca23a0f..6e4d4b62c9a8 100644 --- a/drivers/net/irda/irtty-sir.c +++ b/drivers/net/irda/irtty-sir.c | |||
@@ -459,8 +459,10 @@ static int irtty_open(struct tty_struct *tty) | |||
459 | 459 | ||
460 | /* allocate private device info block */ | 460 | /* allocate private device info block */ |
461 | priv = kzalloc(sizeof(*priv), GFP_KERNEL); | 461 | priv = kzalloc(sizeof(*priv), GFP_KERNEL); |
462 | if (!priv) | 462 | if (!priv) { |
463 | ret = -ENOMEM; | ||
463 | goto out_put; | 464 | goto out_put; |
465 | } | ||
464 | 466 | ||
465 | priv->magic = IRTTY_MAGIC; | 467 | priv->magic = IRTTY_MAGIC; |
466 | priv->tty = tty; | 468 | priv->tty = tty; |
diff --git a/drivers/net/irda/mcs7780.c b/drivers/net/irda/mcs7780.c index 1a00b5990cb8..f07c340990da 100644 --- a/drivers/net/irda/mcs7780.c +++ b/drivers/net/irda/mcs7780.c | |||
@@ -920,8 +920,10 @@ static int mcs_probe(struct usb_interface *intf, | |||
920 | 920 | ||
921 | ndev->netdev_ops = &mcs_netdev_ops; | 921 | ndev->netdev_ops = &mcs_netdev_ops; |
922 | 922 | ||
923 | if (!intf->cur_altsetting) | 923 | if (!intf->cur_altsetting) { |
924 | ret = -ENOMEM; | ||
924 | goto error2; | 925 | goto error2; |
926 | } | ||
925 | 927 | ||
926 | ret = mcs_find_endpoints(mcs, intf->cur_altsetting->endpoint, | 928 | ret = mcs_find_endpoints(mcs, intf->cur_altsetting->endpoint, |
927 | intf->cur_altsetting->desc.bNumEndpoints); | 929 | intf->cur_altsetting->desc.bNumEndpoints); |
diff --git a/drivers/net/irda/pxaficp_ir.c b/drivers/net/irda/pxaficp_ir.c index 002a442bf73f..858de05bdb7d 100644 --- a/drivers/net/irda/pxaficp_ir.c +++ b/drivers/net/irda/pxaficp_ir.c | |||
@@ -846,8 +846,10 @@ static int pxa_irda_probe(struct platform_device *pdev) | |||
846 | goto err_mem_2; | 846 | goto err_mem_2; |
847 | 847 | ||
848 | dev = alloc_irdadev(sizeof(struct pxa_irda)); | 848 | dev = alloc_irdadev(sizeof(struct pxa_irda)); |
849 | if (!dev) | 849 | if (!dev) { |
850 | err = -ENOMEM; | ||
850 | goto err_mem_3; | 851 | goto err_mem_3; |
852 | } | ||
851 | 853 | ||
852 | SET_NETDEV_DEV(dev, &pdev->dev); | 854 | SET_NETDEV_DEV(dev, &pdev->dev); |
853 | si = netdev_priv(dev); | 855 | si = netdev_priv(dev); |
diff --git a/drivers/net/irda/sa1100_ir.c b/drivers/net/irda/sa1100_ir.c index e25067552b20..42fde9ed23e1 100644 --- a/drivers/net/irda/sa1100_ir.c +++ b/drivers/net/irda/sa1100_ir.c | |||
@@ -940,8 +940,10 @@ static int sa1100_irda_probe(struct platform_device *pdev) | |||
940 | goto err_mem_3; | 940 | goto err_mem_3; |
941 | 941 | ||
942 | dev = alloc_irdadev(sizeof(struct sa1100_irda)); | 942 | dev = alloc_irdadev(sizeof(struct sa1100_irda)); |
943 | if (!dev) | 943 | if (!dev) { |
944 | err = -ENOMEM; | ||
944 | goto err_mem_4; | 945 | goto err_mem_4; |
946 | } | ||
945 | 947 | ||
946 | SET_NETDEV_DEV(dev, &pdev->dev); | 948 | SET_NETDEV_DEV(dev, &pdev->dev); |
947 | 949 | ||
diff --git a/drivers/net/irda/sh_irda.c b/drivers/net/irda/sh_irda.c index eb315b8d07a3..4b746d9bd8e7 100644 --- a/drivers/net/irda/sh_irda.c +++ b/drivers/net/irda/sh_irda.c | |||
@@ -808,8 +808,8 @@ static int __devinit sh_irda_probe(struct platform_device *pdev) | |||
808 | goto err_mem_4; | 808 | goto err_mem_4; |
809 | 809 | ||
810 | platform_set_drvdata(pdev, ndev); | 810 | platform_set_drvdata(pdev, ndev); |
811 | 811 | err = request_irq(irq, sh_irda_irq, IRQF_DISABLED, "sh_irda", self); | |
812 | if (request_irq(irq, sh_irda_irq, IRQF_DISABLED, "sh_irda", self)) { | 812 | if (err) { |
813 | dev_warn(&pdev->dev, "Unable to attach sh_irda interrupt\n"); | 813 | dev_warn(&pdev->dev, "Unable to attach sh_irda interrupt\n"); |
814 | goto err_mem_4; | 814 | goto err_mem_4; |
815 | } | 815 | } |
diff --git a/drivers/net/irda/sh_sir.c b/drivers/net/irda/sh_sir.c index 795109425568..624ac1939e85 100644 --- a/drivers/net/irda/sh_sir.c +++ b/drivers/net/irda/sh_sir.c | |||
@@ -741,6 +741,7 @@ static int __devinit sh_sir_probe(struct platform_device *pdev) | |||
741 | self->clk = clk_get(&pdev->dev, clk_name); | 741 | self->clk = clk_get(&pdev->dev, clk_name); |
742 | if (IS_ERR(self->clk)) { | 742 | if (IS_ERR(self->clk)) { |
743 | dev_err(&pdev->dev, "cannot get clock \"%s\"\n", clk_name); | 743 | dev_err(&pdev->dev, "cannot get clock \"%s\"\n", clk_name); |
744 | err = -ENODEV; | ||
744 | goto err_mem_3; | 745 | goto err_mem_3; |
745 | } | 746 | } |
746 | 747 | ||
@@ -760,8 +761,8 @@ static int __devinit sh_sir_probe(struct platform_device *pdev) | |||
760 | goto err_mem_4; | 761 | goto err_mem_4; |
761 | 762 | ||
762 | platform_set_drvdata(pdev, ndev); | 763 | platform_set_drvdata(pdev, ndev); |
763 | 764 | err = request_irq(irq, sh_sir_irq, IRQF_DISABLED, "sh_sir", self); | |
764 | if (request_irq(irq, sh_sir_irq, IRQF_DISABLED, "sh_sir", self)) { | 765 | if (err) { |
765 | dev_warn(&pdev->dev, "Unable to attach sh_sir interrupt\n"); | 766 | dev_warn(&pdev->dev, "Unable to attach sh_sir interrupt\n"); |
766 | goto err_mem_4; | 767 | goto err_mem_4; |
767 | } | 768 | } |
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/phy/mdio-bitbang.c b/drivers/net/phy/mdio-bitbang.c index daec9b05d168..6428fcbbdd4b 100644 --- a/drivers/net/phy/mdio-bitbang.c +++ b/drivers/net/phy/mdio-bitbang.c | |||
@@ -234,6 +234,7 @@ void free_mdio_bitbang(struct mii_bus *bus) | |||
234 | struct mdiobb_ctrl *ctrl = bus->priv; | 234 | struct mdiobb_ctrl *ctrl = bus->priv; |
235 | 235 | ||
236 | module_put(ctrl->ops->owner); | 236 | module_put(ctrl->ops->owner); |
237 | mdiobus_unregister(bus); | ||
237 | mdiobus_free(bus); | 238 | mdiobus_free(bus); |
238 | } | 239 | } |
239 | EXPORT_SYMBOL(free_mdio_bitbang); | 240 | EXPORT_SYMBOL(free_mdio_bitbang); |
diff --git a/drivers/net/phy/mdio_bus.c b/drivers/net/phy/mdio_bus.c index 170eb411ab5d..c1ef3000ea60 100644 --- a/drivers/net/phy/mdio_bus.c +++ b/drivers/net/phy/mdio_bus.c | |||
@@ -26,6 +26,7 @@ | |||
26 | #include <linux/delay.h> | 26 | #include <linux/delay.h> |
27 | #include <linux/device.h> | 27 | #include <linux/device.h> |
28 | #include <linux/of_device.h> | 28 | #include <linux/of_device.h> |
29 | #include <linux/of_mdio.h> | ||
29 | #include <linux/netdevice.h> | 30 | #include <linux/netdevice.h> |
30 | #include <linux/etherdevice.h> | 31 | #include <linux/etherdevice.h> |
31 | #include <linux/skbuff.h> | 32 | #include <linux/skbuff.h> |
diff --git a/drivers/net/usb/cdc_eem.c b/drivers/net/usb/cdc_eem.c index 434d5af8e6fb..c81e278629ff 100644 --- a/drivers/net/usb/cdc_eem.c +++ b/drivers/net/usb/cdc_eem.c | |||
@@ -244,8 +244,12 @@ static int eem_rx_fixup(struct usbnet *dev, struct sk_buff *skb) | |||
244 | * - suspend: peripheral ready to suspend | 244 | * - suspend: peripheral ready to suspend |
245 | * - response: suggest N millisec polling | 245 | * - response: suggest N millisec polling |
246 | * - response complete: suggest N sec polling | 246 | * - response complete: suggest N sec polling |
247 | * | ||
248 | * Suspend is reported and maybe heeded. | ||
247 | */ | 249 | */ |
248 | case 2: /* Suspend hint */ | 250 | case 2: /* Suspend hint */ |
251 | usbnet_device_suggests_idle(dev); | ||
252 | continue; | ||
249 | case 3: /* Response hint */ | 253 | case 3: /* Response hint */ |
250 | case 4: /* Response complete hint */ | 254 | case 4: /* Response complete hint */ |
251 | continue; | 255 | continue; |
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/kaweth.c b/drivers/net/usb/kaweth.c index c75e11e1b385..afb117c16d2d 100644 --- a/drivers/net/usb/kaweth.c +++ b/drivers/net/usb/kaweth.c | |||
@@ -424,7 +424,7 @@ static int kaweth_download_firmware(struct kaweth_device *kaweth, | |||
424 | 424 | ||
425 | netdev_dbg(kaweth->net, | 425 | netdev_dbg(kaweth->net, |
426 | "Downloading firmware at %p to kaweth device at %p\n", | 426 | "Downloading firmware at %p to kaweth device at %p\n", |
427 | fw->data, kaweth); | 427 | kaweth->firmware_buf, kaweth); |
428 | netdev_dbg(kaweth->net, "Firmware length: %d\n", data_len); | 428 | netdev_dbg(kaweth->net, "Firmware length: %d\n", data_len); |
429 | 429 | ||
430 | return kaweth_control(kaweth, | 430 | return kaweth_control(kaweth, |
diff --git a/drivers/net/usb/mcs7830.c b/drivers/net/usb/mcs7830.c index 03c2d8d653df..cc7e72010ac3 100644 --- a/drivers/net/usb/mcs7830.c +++ b/drivers/net/usb/mcs7830.c | |||
@@ -117,6 +117,7 @@ enum { | |||
117 | struct mcs7830_data { | 117 | struct mcs7830_data { |
118 | u8 multi_filter[8]; | 118 | u8 multi_filter[8]; |
119 | u8 config; | 119 | u8 config; |
120 | u8 link_counter; | ||
120 | }; | 121 | }; |
121 | 122 | ||
122 | static const char driver_name[] = "MOSCHIP usb-ethernet driver"; | 123 | static const char driver_name[] = "MOSCHIP usb-ethernet driver"; |
@@ -632,20 +633,31 @@ static int mcs7830_rx_fixup(struct usbnet *dev, struct sk_buff *skb) | |||
632 | static void mcs7830_status(struct usbnet *dev, struct urb *urb) | 633 | static void mcs7830_status(struct usbnet *dev, struct urb *urb) |
633 | { | 634 | { |
634 | u8 *buf = urb->transfer_buffer; | 635 | u8 *buf = urb->transfer_buffer; |
635 | bool link; | 636 | bool link, link_changed; |
637 | struct mcs7830_data *data = mcs7830_get_data(dev); | ||
636 | 638 | ||
637 | if (urb->actual_length < 16) | 639 | if (urb->actual_length < 16) |
638 | return; | 640 | return; |
639 | 641 | ||
640 | link = !(buf[1] & 0x20); | 642 | link = !(buf[1] & 0x20); |
641 | if (netif_carrier_ok(dev->net) != link) { | 643 | link_changed = netif_carrier_ok(dev->net) != link; |
642 | if (link) { | 644 | if (link_changed) { |
643 | netif_carrier_on(dev->net); | 645 | data->link_counter++; |
644 | usbnet_defer_kevent(dev, EVENT_LINK_RESET); | 646 | /* |
645 | } else | 647 | track link state 20 times to guard against erroneous |
646 | netif_carrier_off(dev->net); | 648 | link state changes reported sometimes by the chip |
647 | netdev_dbg(dev->net, "Link Status is: %d\n", link); | 649 | */ |
648 | } | 650 | if (data->link_counter > 20) { |
651 | data->link_counter = 0; | ||
652 | if (link) { | ||
653 | netif_carrier_on(dev->net); | ||
654 | usbnet_defer_kevent(dev, EVENT_LINK_RESET); | ||
655 | } else | ||
656 | netif_carrier_off(dev->net); | ||
657 | netdev_dbg(dev->net, "Link Status is: %d\n", link); | ||
658 | } | ||
659 | } else | ||
660 | data->link_counter = 0; | ||
649 | } | 661 | } |
650 | 662 | ||
651 | static const struct driver_info moschip_info = { | 663 | static const struct driver_info moschip_info = { |
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 fc9f578a1e25..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 | ||
@@ -1588,10 +1591,27 @@ int usbnet_resume (struct usb_interface *intf) | |||
1588 | tasklet_schedule (&dev->bh); | 1591 | tasklet_schedule (&dev->bh); |
1589 | } | 1592 | } |
1590 | } | 1593 | } |
1594 | |||
1595 | if (test_and_clear_bit(EVENT_DEVICE_REPORT_IDLE, &dev->flags)) | ||
1596 | usb_autopm_get_interface_no_resume(intf); | ||
1597 | |||
1591 | return 0; | 1598 | return 0; |
1592 | } | 1599 | } |
1593 | EXPORT_SYMBOL_GPL(usbnet_resume); | 1600 | EXPORT_SYMBOL_GPL(usbnet_resume); |
1594 | 1601 | ||
1602 | /* | ||
1603 | * Either a subdriver implements manage_power, then it is assumed to always | ||
1604 | * be ready to be suspended or it reports the readiness to be suspended | ||
1605 | * explicitly | ||
1606 | */ | ||
1607 | void usbnet_device_suggests_idle(struct usbnet *dev) | ||
1608 | { | ||
1609 | if (!test_and_set_bit(EVENT_DEVICE_REPORT_IDLE, &dev->flags)) { | ||
1610 | dev->intf->needs_remote_wakeup = 1; | ||
1611 | usb_autopm_put_interface_async(dev->intf); | ||
1612 | } | ||
1613 | } | ||
1614 | EXPORT_SYMBOL(usbnet_device_suggests_idle); | ||
1595 | 1615 | ||
1596 | /*-------------------------------------------------------------------------*/ | 1616 | /*-------------------------------------------------------------------------*/ |
1597 | 1617 | ||
diff --git a/drivers/net/vmxnet3/vmxnet3_drv.c b/drivers/net/vmxnet3/vmxnet3_drv.c index ce9d4f2c9776..0ae1bcc6da73 100644 --- a/drivers/net/vmxnet3/vmxnet3_drv.c +++ b/drivers/net/vmxnet3/vmxnet3_drv.c | |||
@@ -744,28 +744,43 @@ vmxnet3_map_pkt(struct sk_buff *skb, struct vmxnet3_tx_ctx *ctx, | |||
744 | 744 | ||
745 | for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) { | 745 | for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) { |
746 | const struct skb_frag_struct *frag = &skb_shinfo(skb)->frags[i]; | 746 | const struct skb_frag_struct *frag = &skb_shinfo(skb)->frags[i]; |
747 | u32 buf_size; | ||
747 | 748 | ||
748 | tbi = tq->buf_info + tq->tx_ring.next2fill; | 749 | buf_offset = 0; |
749 | tbi->map_type = VMXNET3_MAP_PAGE; | 750 | len = skb_frag_size(frag); |
750 | tbi->dma_addr = skb_frag_dma_map(&adapter->pdev->dev, frag, | 751 | while (len) { |
751 | 0, skb_frag_size(frag), | 752 | tbi = tq->buf_info + tq->tx_ring.next2fill; |
752 | DMA_TO_DEVICE); | 753 | if (len < VMXNET3_MAX_TX_BUF_SIZE) { |
754 | buf_size = len; | ||
755 | dw2 |= len; | ||
756 | } else { | ||
757 | buf_size = VMXNET3_MAX_TX_BUF_SIZE; | ||
758 | /* spec says that for TxDesc.len, 0 == 2^14 */ | ||
759 | } | ||
760 | tbi->map_type = VMXNET3_MAP_PAGE; | ||
761 | tbi->dma_addr = skb_frag_dma_map(&adapter->pdev->dev, frag, | ||
762 | buf_offset, buf_size, | ||
763 | DMA_TO_DEVICE); | ||
753 | 764 | ||
754 | tbi->len = skb_frag_size(frag); | 765 | tbi->len = buf_size; |
755 | 766 | ||
756 | gdesc = tq->tx_ring.base + tq->tx_ring.next2fill; | 767 | gdesc = tq->tx_ring.base + tq->tx_ring.next2fill; |
757 | BUG_ON(gdesc->txd.gen == tq->tx_ring.gen); | 768 | BUG_ON(gdesc->txd.gen == tq->tx_ring.gen); |
758 | 769 | ||
759 | gdesc->txd.addr = cpu_to_le64(tbi->dma_addr); | 770 | gdesc->txd.addr = cpu_to_le64(tbi->dma_addr); |
760 | gdesc->dword[2] = cpu_to_le32(dw2 | skb_frag_size(frag)); | 771 | gdesc->dword[2] = cpu_to_le32(dw2); |
761 | gdesc->dword[3] = 0; | 772 | gdesc->dword[3] = 0; |
762 | 773 | ||
763 | dev_dbg(&adapter->netdev->dev, | 774 | dev_dbg(&adapter->netdev->dev, |
764 | "txd[%u]: 0x%llu %u %u\n", | 775 | "txd[%u]: 0x%llu %u %u\n", |
765 | tq->tx_ring.next2fill, le64_to_cpu(gdesc->txd.addr), | 776 | tq->tx_ring.next2fill, le64_to_cpu(gdesc->txd.addr), |
766 | le32_to_cpu(gdesc->dword[2]), gdesc->dword[3]); | 777 | le32_to_cpu(gdesc->dword[2]), gdesc->dword[3]); |
767 | vmxnet3_cmd_ring_adv_next2fill(&tq->tx_ring); | 778 | vmxnet3_cmd_ring_adv_next2fill(&tq->tx_ring); |
768 | dw2 = tq->tx_ring.gen << VMXNET3_TXD_GEN_SHIFT; | 779 | dw2 = tq->tx_ring.gen << VMXNET3_TXD_GEN_SHIFT; |
780 | |||
781 | len -= buf_size; | ||
782 | buf_offset += buf_size; | ||
783 | } | ||
769 | } | 784 | } |
770 | 785 | ||
771 | ctx->eop_txd = gdesc; | 786 | ctx->eop_txd = gdesc; |
@@ -886,6 +901,18 @@ vmxnet3_prepare_tso(struct sk_buff *skb, | |||
886 | } | 901 | } |
887 | } | 902 | } |
888 | 903 | ||
904 | static int txd_estimate(const struct sk_buff *skb) | ||
905 | { | ||
906 | int count = VMXNET3_TXD_NEEDED(skb_headlen(skb)) + 1; | ||
907 | int i; | ||
908 | |||
909 | for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) { | ||
910 | const struct skb_frag_struct *frag = &skb_shinfo(skb)->frags[i]; | ||
911 | |||
912 | count += VMXNET3_TXD_NEEDED(skb_frag_size(frag)); | ||
913 | } | ||
914 | return count; | ||
915 | } | ||
889 | 916 | ||
890 | /* | 917 | /* |
891 | * Transmits a pkt thru a given tq | 918 | * Transmits a pkt thru a given tq |
@@ -914,9 +941,7 @@ vmxnet3_tq_xmit(struct sk_buff *skb, struct vmxnet3_tx_queue *tq, | |||
914 | union Vmxnet3_GenericDesc tempTxDesc; | 941 | union Vmxnet3_GenericDesc tempTxDesc; |
915 | #endif | 942 | #endif |
916 | 943 | ||
917 | /* conservatively estimate # of descriptors to use */ | 944 | count = txd_estimate(skb); |
918 | count = VMXNET3_TXD_NEEDED(skb_headlen(skb)) + | ||
919 | skb_shinfo(skb)->nr_frags + 1; | ||
920 | 945 | ||
921 | ctx.ipv4 = (vlan_get_protocol(skb) == cpu_to_be16(ETH_P_IP)); | 946 | ctx.ipv4 = (vlan_get_protocol(skb) == cpu_to_be16(ETH_P_IP)); |
922 | 947 | ||
diff --git a/drivers/net/vxlan.c b/drivers/net/vxlan.c index 51de9edb55f5..7b4adde93c01 100644 --- a/drivers/net/vxlan.c +++ b/drivers/net/vxlan.c | |||
@@ -28,7 +28,6 @@ | |||
28 | #include <linux/igmp.h> | 28 | #include <linux/igmp.h> |
29 | #include <linux/etherdevice.h> | 29 | #include <linux/etherdevice.h> |
30 | #include <linux/if_ether.h> | 30 | #include <linux/if_ether.h> |
31 | #include <linux/version.h> | ||
32 | #include <linux/hash.h> | 31 | #include <linux/hash.h> |
33 | #include <net/ip.h> | 32 | #include <net/ip.h> |
34 | #include <net/icmp.h> | 33 | #include <net/icmp.h> |
@@ -107,6 +106,8 @@ struct vxlan_dev { | |||
107 | __be32 gaddr; /* multicast group */ | 106 | __be32 gaddr; /* multicast group */ |
108 | __be32 saddr; /* source address */ | 107 | __be32 saddr; /* source address */ |
109 | unsigned int link; /* link to multicast over */ | 108 | unsigned int link; /* link to multicast over */ |
109 | __u16 port_min; /* source port range */ | ||
110 | __u16 port_max; | ||
110 | __u8 tos; /* TOS override */ | 111 | __u8 tos; /* TOS override */ |
111 | __u8 ttl; | 112 | __u8 ttl; |
112 | bool learn; | 113 | bool learn; |
@@ -229,9 +230,9 @@ static u32 eth_hash(const unsigned char *addr) | |||
229 | 230 | ||
230 | /* only want 6 bytes */ | 231 | /* only want 6 bytes */ |
231 | #ifdef __BIG_ENDIAN | 232 | #ifdef __BIG_ENDIAN |
232 | value <<= 16; | ||
233 | #else | ||
234 | value >>= 16; | 233 | value >>= 16; |
234 | #else | ||
235 | value <<= 16; | ||
235 | #endif | 236 | #endif |
236 | return hash_64(value, FDB_HASH_BITS); | 237 | return hash_64(value, FDB_HASH_BITS); |
237 | } | 238 | } |
@@ -536,7 +537,6 @@ static int vxlan_udp_encap_recv(struct sock *sk, struct sk_buff *skb) | |||
536 | } | 537 | } |
537 | 538 | ||
538 | __skb_pull(skb, sizeof(struct vxlanhdr)); | 539 | __skb_pull(skb, sizeof(struct vxlanhdr)); |
539 | skb_postpull_rcsum(skb, eth_hdr(skb), sizeof(struct vxlanhdr)); | ||
540 | 540 | ||
541 | /* Is this VNI defined? */ | 541 | /* Is this VNI defined? */ |
542 | vni = ntohl(vxh->vx_vni) >> 8; | 542 | vni = ntohl(vxh->vx_vni) >> 8; |
@@ -555,7 +555,6 @@ static int vxlan_udp_encap_recv(struct sock *sk, struct sk_buff *skb) | |||
555 | /* Re-examine inner Ethernet packet */ | 555 | /* Re-examine inner Ethernet packet */ |
556 | oip = ip_hdr(skb); | 556 | oip = ip_hdr(skb); |
557 | skb->protocol = eth_type_trans(skb, vxlan->dev); | 557 | skb->protocol = eth_type_trans(skb, vxlan->dev); |
558 | skb_postpull_rcsum(skb, eth_hdr(skb), ETH_HLEN); | ||
559 | 558 | ||
560 | /* Ignore packet loops (and multicast echo) */ | 559 | /* Ignore packet loops (and multicast echo) */ |
561 | if (compare_ether_addr(eth_hdr(skb)->h_source, | 560 | if (compare_ether_addr(eth_hdr(skb)->h_source, |
@@ -567,6 +566,7 @@ static int vxlan_udp_encap_recv(struct sock *sk, struct sk_buff *skb) | |||
567 | 566 | ||
568 | __skb_tunnel_rx(skb, vxlan->dev); | 567 | __skb_tunnel_rx(skb, vxlan->dev); |
569 | skb_reset_network_header(skb); | 568 | skb_reset_network_header(skb); |
569 | skb->ip_summed = CHECKSUM_NONE; | ||
570 | 570 | ||
571 | err = IP_ECN_decapsulate(oip, skb); | 571 | err = IP_ECN_decapsulate(oip, skb); |
572 | if (unlikely(err)) { | 572 | if (unlikely(err)) { |
@@ -622,46 +622,89 @@ static inline u8 vxlan_ecn_encap(u8 tos, | |||
622 | return INET_ECN_encapsulate(tos, inner); | 622 | return INET_ECN_encapsulate(tos, inner); |
623 | } | 623 | } |
624 | 624 | ||
625 | static __be32 vxlan_find_dst(struct vxlan_dev *vxlan, struct sk_buff *skb) | ||
626 | { | ||
627 | const struct ethhdr *eth = (struct ethhdr *) skb->data; | ||
628 | const struct vxlan_fdb *f; | ||
629 | |||
630 | if (is_multicast_ether_addr(eth->h_dest)) | ||
631 | return vxlan->gaddr; | ||
632 | |||
633 | f = vxlan_find_mac(vxlan, eth->h_dest); | ||
634 | if (f) | ||
635 | return f->remote_ip; | ||
636 | else | ||
637 | return vxlan->gaddr; | ||
638 | |||
639 | } | ||
640 | |||
641 | static void vxlan_sock_free(struct sk_buff *skb) | ||
642 | { | ||
643 | sock_put(skb->sk); | ||
644 | } | ||
645 | |||
646 | /* On transmit, associate with the tunnel socket */ | ||
647 | static void vxlan_set_owner(struct net_device *dev, struct sk_buff *skb) | ||
648 | { | ||
649 | struct vxlan_net *vn = net_generic(dev_net(dev), vxlan_net_id); | ||
650 | struct sock *sk = vn->sock->sk; | ||
651 | |||
652 | skb_orphan(skb); | ||
653 | sock_hold(sk); | ||
654 | skb->sk = sk; | ||
655 | skb->destructor = vxlan_sock_free; | ||
656 | } | ||
657 | |||
658 | /* Compute source port for outgoing packet | ||
659 | * first choice to use L4 flow hash since it will spread | ||
660 | * better and maybe available from hardware | ||
661 | * secondary choice is to use jhash on the Ethernet header | ||
662 | */ | ||
663 | static u16 vxlan_src_port(const struct vxlan_dev *vxlan, struct sk_buff *skb) | ||
664 | { | ||
665 | unsigned int range = (vxlan->port_max - vxlan->port_min) + 1; | ||
666 | u32 hash; | ||
667 | |||
668 | hash = skb_get_rxhash(skb); | ||
669 | if (!hash) | ||
670 | hash = jhash(skb->data, 2 * ETH_ALEN, | ||
671 | (__force u32) skb->protocol); | ||
672 | |||
673 | return (((u64) hash * range) >> 32) + vxlan->port_min; | ||
674 | } | ||
675 | |||
625 | /* Transmit local packets over Vxlan | 676 | /* Transmit local packets over Vxlan |
626 | * | 677 | * |
627 | * Outer IP header inherits ECN and DF from inner header. | 678 | * Outer IP header inherits ECN and DF from inner header. |
628 | * Outer UDP destination is the VXLAN assigned port. | 679 | * Outer UDP destination is the VXLAN assigned port. |
629 | * source port is based on hash of flow if available | 680 | * source port is based on hash of flow |
630 | * otherwise use a random value | ||
631 | */ | 681 | */ |
632 | static netdev_tx_t vxlan_xmit(struct sk_buff *skb, struct net_device *dev) | 682 | static netdev_tx_t vxlan_xmit(struct sk_buff *skb, struct net_device *dev) |
633 | { | 683 | { |
634 | struct vxlan_dev *vxlan = netdev_priv(dev); | 684 | struct vxlan_dev *vxlan = netdev_priv(dev); |
635 | struct rtable *rt; | 685 | struct rtable *rt; |
636 | const struct ethhdr *eth; | ||
637 | const struct iphdr *old_iph; | 686 | const struct iphdr *old_iph; |
638 | struct iphdr *iph; | 687 | struct iphdr *iph; |
639 | struct vxlanhdr *vxh; | 688 | struct vxlanhdr *vxh; |
640 | struct udphdr *uh; | 689 | struct udphdr *uh; |
641 | struct flowi4 fl4; | 690 | struct flowi4 fl4; |
642 | struct vxlan_fdb *f; | ||
643 | unsigned int pkt_len = skb->len; | 691 | unsigned int pkt_len = skb->len; |
644 | u32 hash; | ||
645 | __be32 dst; | 692 | __be32 dst; |
693 | __u16 src_port; | ||
646 | __be16 df = 0; | 694 | __be16 df = 0; |
647 | __u8 tos, ttl; | 695 | __u8 tos, ttl; |
648 | int err; | 696 | int err; |
649 | 697 | ||
698 | dst = vxlan_find_dst(vxlan, skb); | ||
699 | if (!dst) | ||
700 | goto drop; | ||
701 | |||
650 | /* Need space for new headers (invalidates iph ptr) */ | 702 | /* Need space for new headers (invalidates iph ptr) */ |
651 | if (skb_cow_head(skb, VXLAN_HEADROOM)) | 703 | if (skb_cow_head(skb, VXLAN_HEADROOM)) |
652 | goto drop; | 704 | goto drop; |
653 | 705 | ||
654 | eth = (void *)skb->data; | ||
655 | old_iph = ip_hdr(skb); | 706 | old_iph = ip_hdr(skb); |
656 | 707 | ||
657 | if (!is_multicast_ether_addr(eth->h_dest) && | ||
658 | (f = vxlan_find_mac(vxlan, eth->h_dest))) | ||
659 | dst = f->remote_ip; | ||
660 | else if (vxlan->gaddr) { | ||
661 | dst = vxlan->gaddr; | ||
662 | } else | ||
663 | goto drop; | ||
664 | |||
665 | ttl = vxlan->ttl; | 708 | ttl = vxlan->ttl; |
666 | if (!ttl && IN_MULTICAST(ntohl(dst))) | 709 | if (!ttl && IN_MULTICAST(ntohl(dst))) |
667 | ttl = 1; | 710 | ttl = 1; |
@@ -670,11 +713,15 @@ static netdev_tx_t vxlan_xmit(struct sk_buff *skb, struct net_device *dev) | |||
670 | if (tos == 1) | 713 | if (tos == 1) |
671 | tos = vxlan_get_dsfield(old_iph, skb); | 714 | tos = vxlan_get_dsfield(old_iph, skb); |
672 | 715 | ||
673 | hash = skb_get_rxhash(skb); | 716 | src_port = vxlan_src_port(vxlan, skb); |
717 | |||
718 | memset(&fl4, 0, sizeof(fl4)); | ||
719 | fl4.flowi4_oif = vxlan->link; | ||
720 | fl4.flowi4_tos = RT_TOS(tos); | ||
721 | fl4.daddr = dst; | ||
722 | fl4.saddr = vxlan->saddr; | ||
674 | 723 | ||
675 | rt = ip_route_output_gre(dev_net(dev), &fl4, dst, | 724 | rt = ip_route_output_key(dev_net(dev), &fl4); |
676 | vxlan->saddr, vxlan->vni, | ||
677 | RT_TOS(tos), vxlan->link); | ||
678 | if (IS_ERR(rt)) { | 725 | if (IS_ERR(rt)) { |
679 | netdev_dbg(dev, "no route to %pI4\n", &dst); | 726 | netdev_dbg(dev, "no route to %pI4\n", &dst); |
680 | dev->stats.tx_carrier_errors++; | 727 | dev->stats.tx_carrier_errors++; |
@@ -703,7 +750,7 @@ static netdev_tx_t vxlan_xmit(struct sk_buff *skb, struct net_device *dev) | |||
703 | uh = udp_hdr(skb); | 750 | uh = udp_hdr(skb); |
704 | 751 | ||
705 | uh->dest = htons(vxlan_port); | 752 | uh->dest = htons(vxlan_port); |
706 | uh->source = hash ? :random32(); | 753 | uh->source = htons(src_port); |
707 | 754 | ||
708 | uh->len = htons(skb->len); | 755 | uh->len = htons(skb->len); |
709 | uh->check = 0; | 756 | uh->check = 0; |
@@ -716,10 +763,12 @@ static netdev_tx_t vxlan_xmit(struct sk_buff *skb, struct net_device *dev) | |||
716 | iph->frag_off = df; | 763 | iph->frag_off = df; |
717 | iph->protocol = IPPROTO_UDP; | 764 | iph->protocol = IPPROTO_UDP; |
718 | iph->tos = vxlan_ecn_encap(tos, old_iph, skb); | 765 | iph->tos = vxlan_ecn_encap(tos, old_iph, skb); |
719 | iph->daddr = fl4.daddr; | 766 | iph->daddr = dst; |
720 | iph->saddr = fl4.saddr; | 767 | iph->saddr = fl4.saddr; |
721 | iph->ttl = ttl ? : ip4_dst_hoplimit(&rt->dst); | 768 | iph->ttl = ttl ? : ip4_dst_hoplimit(&rt->dst); |
722 | 769 | ||
770 | vxlan_set_owner(dev, skb); | ||
771 | |||
723 | /* See __IPTUNNEL_XMIT */ | 772 | /* See __IPTUNNEL_XMIT */ |
724 | skb->ip_summed = CHECKSUM_NONE; | 773 | skb->ip_summed = CHECKSUM_NONE; |
725 | ip_select_ident(iph, &rt->dst, NULL); | 774 | ip_select_ident(iph, &rt->dst, NULL); |
@@ -767,7 +816,7 @@ static void vxlan_cleanup(unsigned long arg) | |||
767 | = container_of(p, struct vxlan_fdb, hlist); | 816 | = container_of(p, struct vxlan_fdb, hlist); |
768 | unsigned long timeout; | 817 | unsigned long timeout; |
769 | 818 | ||
770 | if (f->state == NUD_PERMANENT) | 819 | if (f->state & NUD_PERMANENT) |
771 | continue; | 820 | continue; |
772 | 821 | ||
773 | timeout = f->used + vxlan->age_interval * HZ; | 822 | timeout = f->used + vxlan->age_interval * HZ; |
@@ -929,9 +978,11 @@ static void vxlan_setup(struct net_device *dev) | |||
929 | { | 978 | { |
930 | struct vxlan_dev *vxlan = netdev_priv(dev); | 979 | struct vxlan_dev *vxlan = netdev_priv(dev); |
931 | unsigned h; | 980 | unsigned h; |
981 | int low, high; | ||
932 | 982 | ||
933 | eth_hw_addr_random(dev); | 983 | eth_hw_addr_random(dev); |
934 | ether_setup(dev); | 984 | ether_setup(dev); |
985 | dev->hard_header_len = ETH_HLEN + VXLAN_HEADROOM; | ||
935 | 986 | ||
936 | dev->netdev_ops = &vxlan_netdev_ops; | 987 | dev->netdev_ops = &vxlan_netdev_ops; |
937 | dev->destructor = vxlan_free; | 988 | dev->destructor = vxlan_free; |
@@ -948,6 +999,10 @@ static void vxlan_setup(struct net_device *dev) | |||
948 | vxlan->age_timer.function = vxlan_cleanup; | 999 | vxlan->age_timer.function = vxlan_cleanup; |
949 | vxlan->age_timer.data = (unsigned long) vxlan; | 1000 | vxlan->age_timer.data = (unsigned long) vxlan; |
950 | 1001 | ||
1002 | inet_get_local_port_range(&low, &high); | ||
1003 | vxlan->port_min = low; | ||
1004 | vxlan->port_max = high; | ||
1005 | |||
951 | vxlan->dev = dev; | 1006 | vxlan->dev = dev; |
952 | 1007 | ||
953 | for (h = 0; h < FDB_HASH_SIZE; ++h) | 1008 | for (h = 0; h < FDB_HASH_SIZE; ++h) |
@@ -964,6 +1019,7 @@ static const struct nla_policy vxlan_policy[IFLA_VXLAN_MAX + 1] = { | |||
964 | [IFLA_VXLAN_LEARNING] = { .type = NLA_U8 }, | 1019 | [IFLA_VXLAN_LEARNING] = { .type = NLA_U8 }, |
965 | [IFLA_VXLAN_AGEING] = { .type = NLA_U32 }, | 1020 | [IFLA_VXLAN_AGEING] = { .type = NLA_U32 }, |
966 | [IFLA_VXLAN_LIMIT] = { .type = NLA_U32 }, | 1021 | [IFLA_VXLAN_LIMIT] = { .type = NLA_U32 }, |
1022 | [IFLA_VXLAN_PORT_RANGE] = { .len = sizeof(struct ifla_vxlan_port_range) }, | ||
967 | }; | 1023 | }; |
968 | 1024 | ||
969 | static int vxlan_validate(struct nlattr *tb[], struct nlattr *data[]) | 1025 | static int vxlan_validate(struct nlattr *tb[], struct nlattr *data[]) |
@@ -996,6 +1052,18 @@ static int vxlan_validate(struct nlattr *tb[], struct nlattr *data[]) | |||
996 | return -EADDRNOTAVAIL; | 1052 | return -EADDRNOTAVAIL; |
997 | } | 1053 | } |
998 | } | 1054 | } |
1055 | |||
1056 | if (data[IFLA_VXLAN_PORT_RANGE]) { | ||
1057 | const struct ifla_vxlan_port_range *p | ||
1058 | = nla_data(data[IFLA_VXLAN_PORT_RANGE]); | ||
1059 | |||
1060 | if (ntohs(p->high) < ntohs(p->low)) { | ||
1061 | pr_debug("port range %u .. %u not valid\n", | ||
1062 | ntohs(p->low), ntohs(p->high)); | ||
1063 | return -EINVAL; | ||
1064 | } | ||
1065 | } | ||
1066 | |||
999 | return 0; | 1067 | return 0; |
1000 | } | 1068 | } |
1001 | 1069 | ||
@@ -1022,14 +1090,18 @@ static int vxlan_newlink(struct net *net, struct net_device *dev, | |||
1022 | if (data[IFLA_VXLAN_LOCAL]) | 1090 | if (data[IFLA_VXLAN_LOCAL]) |
1023 | vxlan->saddr = nla_get_be32(data[IFLA_VXLAN_LOCAL]); | 1091 | vxlan->saddr = nla_get_be32(data[IFLA_VXLAN_LOCAL]); |
1024 | 1092 | ||
1025 | if (data[IFLA_VXLAN_LINK]) { | 1093 | if (data[IFLA_VXLAN_LINK] && |
1026 | vxlan->link = nla_get_u32(data[IFLA_VXLAN_LINK]); | 1094 | (vxlan->link = nla_get_u32(data[IFLA_VXLAN_LINK]))) { |
1095 | struct net_device *lowerdev | ||
1096 | = __dev_get_by_index(net, vxlan->link); | ||
1027 | 1097 | ||
1028 | if (!tb[IFLA_MTU]) { | 1098 | if (!lowerdev) { |
1029 | struct net_device *lowerdev; | 1099 | pr_info("ifindex %d does not exist\n", vxlan->link); |
1030 | lowerdev = __dev_get_by_index(net, vxlan->link); | 1100 | return -ENODEV; |
1031 | dev->mtu = lowerdev->mtu - VXLAN_HEADROOM; | ||
1032 | } | 1101 | } |
1102 | |||
1103 | if (!tb[IFLA_MTU]) | ||
1104 | dev->mtu = lowerdev->mtu - VXLAN_HEADROOM; | ||
1033 | } | 1105 | } |
1034 | 1106 | ||
1035 | if (data[IFLA_VXLAN_TOS]) | 1107 | if (data[IFLA_VXLAN_TOS]) |
@@ -1046,6 +1118,13 @@ static int vxlan_newlink(struct net *net, struct net_device *dev, | |||
1046 | if (data[IFLA_VXLAN_LIMIT]) | 1118 | if (data[IFLA_VXLAN_LIMIT]) |
1047 | vxlan->addrmax = nla_get_u32(data[IFLA_VXLAN_LIMIT]); | 1119 | vxlan->addrmax = nla_get_u32(data[IFLA_VXLAN_LIMIT]); |
1048 | 1120 | ||
1121 | if (data[IFLA_VXLAN_PORT_RANGE]) { | ||
1122 | const struct ifla_vxlan_port_range *p | ||
1123 | = nla_data(data[IFLA_VXLAN_PORT_RANGE]); | ||
1124 | vxlan->port_min = ntohs(p->low); | ||
1125 | vxlan->port_max = ntohs(p->high); | ||
1126 | } | ||
1127 | |||
1049 | err = register_netdevice(dev); | 1128 | err = register_netdevice(dev); |
1050 | if (!err) | 1129 | if (!err) |
1051 | hlist_add_head_rcu(&vxlan->hlist, vni_head(net, vxlan->vni)); | 1130 | hlist_add_head_rcu(&vxlan->hlist, vni_head(net, vxlan->vni)); |
@@ -1074,23 +1153,28 @@ static size_t vxlan_get_size(const struct net_device *dev) | |||
1074 | nla_total_size(sizeof(__u8)) + /* IFLA_VXLAN_LEARNING */ | 1153 | nla_total_size(sizeof(__u8)) + /* IFLA_VXLAN_LEARNING */ |
1075 | nla_total_size(sizeof(__u32)) + /* IFLA_VXLAN_AGEING */ | 1154 | nla_total_size(sizeof(__u32)) + /* IFLA_VXLAN_AGEING */ |
1076 | nla_total_size(sizeof(__u32)) + /* IFLA_VXLAN_LIMIT */ | 1155 | nla_total_size(sizeof(__u32)) + /* IFLA_VXLAN_LIMIT */ |
1156 | nla_total_size(sizeof(struct ifla_vxlan_port_range)) + | ||
1077 | 0; | 1157 | 0; |
1078 | } | 1158 | } |
1079 | 1159 | ||
1080 | static int vxlan_fill_info(struct sk_buff *skb, const struct net_device *dev) | 1160 | static int vxlan_fill_info(struct sk_buff *skb, const struct net_device *dev) |
1081 | { | 1161 | { |
1082 | const struct vxlan_dev *vxlan = netdev_priv(dev); | 1162 | const struct vxlan_dev *vxlan = netdev_priv(dev); |
1163 | struct ifla_vxlan_port_range ports = { | ||
1164 | .low = htons(vxlan->port_min), | ||
1165 | .high = htons(vxlan->port_max), | ||
1166 | }; | ||
1083 | 1167 | ||
1084 | if (nla_put_u32(skb, IFLA_VXLAN_ID, vxlan->vni)) | 1168 | if (nla_put_u32(skb, IFLA_VXLAN_ID, vxlan->vni)) |
1085 | goto nla_put_failure; | 1169 | goto nla_put_failure; |
1086 | 1170 | ||
1087 | if (vxlan->gaddr && nla_put_u32(skb, IFLA_VXLAN_GROUP, vxlan->gaddr)) | 1171 | if (vxlan->gaddr && nla_put_be32(skb, IFLA_VXLAN_GROUP, vxlan->gaddr)) |
1088 | goto nla_put_failure; | 1172 | goto nla_put_failure; |
1089 | 1173 | ||
1090 | if (vxlan->link && nla_put_u32(skb, IFLA_VXLAN_LINK, vxlan->link)) | 1174 | if (vxlan->link && nla_put_u32(skb, IFLA_VXLAN_LINK, vxlan->link)) |
1091 | goto nla_put_failure; | 1175 | goto nla_put_failure; |
1092 | 1176 | ||
1093 | if (vxlan->saddr && nla_put_u32(skb, IFLA_VXLAN_LOCAL, vxlan->saddr)) | 1177 | if (vxlan->saddr && nla_put_be32(skb, IFLA_VXLAN_LOCAL, vxlan->saddr)) |
1094 | goto nla_put_failure; | 1178 | goto nla_put_failure; |
1095 | 1179 | ||
1096 | if (nla_put_u8(skb, IFLA_VXLAN_TTL, vxlan->ttl) || | 1180 | if (nla_put_u8(skb, IFLA_VXLAN_TTL, vxlan->ttl) || |
@@ -1100,6 +1184,9 @@ static int vxlan_fill_info(struct sk_buff *skb, const struct net_device *dev) | |||
1100 | nla_put_u32(skb, IFLA_VXLAN_LIMIT, vxlan->addrmax)) | 1184 | nla_put_u32(skb, IFLA_VXLAN_LIMIT, vxlan->addrmax)) |
1101 | goto nla_put_failure; | 1185 | goto nla_put_failure; |
1102 | 1186 | ||
1187 | if (nla_put(skb, IFLA_VXLAN_PORT_RANGE, sizeof(ports), &ports)) | ||
1188 | goto nla_put_failure; | ||
1189 | |||
1103 | return 0; | 1190 | return 0; |
1104 | 1191 | ||
1105 | nla_put_failure: | 1192 | nla_put_failure: |
diff --git a/drivers/net/wan/farsync.c b/drivers/net/wan/farsync.c index 1a623183cbe5..b6271325f803 100644 --- a/drivers/net/wan/farsync.c +++ b/drivers/net/wan/farsync.c | |||
@@ -597,7 +597,7 @@ fst_q_work_item(u64 * queue, int card_index) | |||
597 | * bottom half for the card. Note the limitation of 64 cards. | 597 | * bottom half for the card. Note the limitation of 64 cards. |
598 | * That ought to be enough | 598 | * That ought to be enough |
599 | */ | 599 | */ |
600 | mask = 1 << card_index; | 600 | mask = (u64)1 << card_index; |
601 | *queue |= mask; | 601 | *queue |= mask; |
602 | spin_unlock_irqrestore(&fst_work_q_lock, flags); | 602 | spin_unlock_irqrestore(&fst_work_q_lock, flags); |
603 | } | 603 | } |
diff --git a/drivers/net/wireless/ath/ath5k/base.c b/drivers/net/wireless/ath/ath5k/base.c index 9fd6d9a9942e..9f31cfa56cc0 100644 --- a/drivers/net/wireless/ath/ath5k/base.c +++ b/drivers/net/wireless/ath/ath5k/base.c | |||
@@ -1804,7 +1804,7 @@ ath5k_beacon_update(struct ieee80211_hw *hw, struct ieee80211_vif *vif) | |||
1804 | { | 1804 | { |
1805 | int ret; | 1805 | int ret; |
1806 | struct ath5k_hw *ah = hw->priv; | 1806 | struct ath5k_hw *ah = hw->priv; |
1807 | struct ath5k_vif *avf = (void *)vif->drv_priv; | 1807 | struct ath5k_vif *avf; |
1808 | struct sk_buff *skb; | 1808 | struct sk_buff *skb; |
1809 | 1809 | ||
1810 | if (WARN_ON(!vif)) { | 1810 | if (WARN_ON(!vif)) { |
@@ -1819,6 +1819,7 @@ ath5k_beacon_update(struct ieee80211_hw *hw, struct ieee80211_vif *vif) | |||
1819 | goto out; | 1819 | goto out; |
1820 | } | 1820 | } |
1821 | 1821 | ||
1822 | avf = (void *)vif->drv_priv; | ||
1822 | ath5k_txbuf_free_skb(ah, avf->bbuf); | 1823 | ath5k_txbuf_free_skb(ah, avf->bbuf); |
1823 | avf->bbuf->skb = skb; | 1824 | avf->bbuf->skb = skb; |
1824 | ret = ath5k_beacon_setup(ah, avf->bbuf); | 1825 | ret = ath5k_beacon_setup(ah, avf->bbuf); |
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/beacon.c b/drivers/net/wireless/ath/ath9k/beacon.c index 76f07d8c272d..1b48414dca95 100644 --- a/drivers/net/wireless/ath/ath9k/beacon.c +++ b/drivers/net/wireless/ath/ath9k/beacon.c | |||
@@ -120,7 +120,7 @@ static void ath9k_tx_cabq(struct ieee80211_hw *hw, struct sk_buff *skb) | |||
120 | 120 | ||
121 | if (ath_tx_start(hw, skb, &txctl) != 0) { | 121 | if (ath_tx_start(hw, skb, &txctl) != 0) { |
122 | ath_dbg(common, XMIT, "CABQ TX failed\n"); | 122 | ath_dbg(common, XMIT, "CABQ TX failed\n"); |
123 | dev_kfree_skb_any(skb); | 123 | ieee80211_free_txskb(hw, skb); |
124 | } | 124 | } |
125 | } | 125 | } |
126 | 126 | ||
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/ath/ath9k/hw.c b/drivers/net/wireless/ath/ath9k/hw.c index f9a6ec5cf470..8e1559aba495 100644 --- a/drivers/net/wireless/ath/ath9k/hw.c +++ b/drivers/net/wireless/ath/ath9k/hw.c | |||
@@ -1450,9 +1450,14 @@ static bool ath9k_hw_set_reset_reg(struct ath_hw *ah, u32 type) | |||
1450 | REG_WRITE(ah, AR_RTC_FORCE_WAKE, | 1450 | REG_WRITE(ah, AR_RTC_FORCE_WAKE, |
1451 | AR_RTC_FORCE_WAKE_EN | AR_RTC_FORCE_WAKE_ON_INT); | 1451 | AR_RTC_FORCE_WAKE_EN | AR_RTC_FORCE_WAKE_ON_INT); |
1452 | 1452 | ||
1453 | if (!ah->reset_power_on) | ||
1454 | type = ATH9K_RESET_POWER_ON; | ||
1455 | |||
1453 | switch (type) { | 1456 | switch (type) { |
1454 | case ATH9K_RESET_POWER_ON: | 1457 | case ATH9K_RESET_POWER_ON: |
1455 | ret = ath9k_hw_set_reset_power_on(ah); | 1458 | ret = ath9k_hw_set_reset_power_on(ah); |
1459 | if (!ret) | ||
1460 | ah->reset_power_on = true; | ||
1456 | break; | 1461 | break; |
1457 | case ATH9K_RESET_WARM: | 1462 | case ATH9K_RESET_WARM: |
1458 | case ATH9K_RESET_COLD: | 1463 | case ATH9K_RESET_COLD: |
diff --git a/drivers/net/wireless/ath/ath9k/hw.h b/drivers/net/wireless/ath/ath9k/hw.h index 566a4ce4f156..dbc1b7a4cbfd 100644 --- a/drivers/net/wireless/ath/ath9k/hw.h +++ b/drivers/net/wireless/ath/ath9k/hw.h | |||
@@ -741,6 +741,7 @@ struct ath_hw { | |||
741 | u32 rfkill_polarity; | 741 | u32 rfkill_polarity; |
742 | u32 ah_flags; | 742 | u32 ah_flags; |
743 | 743 | ||
744 | bool reset_power_on; | ||
744 | bool htc_reset_init; | 745 | bool htc_reset_init; |
745 | 746 | ||
746 | enum nl80211_iftype opmode; | 747 | enum nl80211_iftype opmode; |
diff --git a/drivers/net/wireless/ath/ath9k/main.c b/drivers/net/wireless/ath/ath9k/main.c index 31ab82e3ba85..dd45edfa6bae 100644 --- a/drivers/net/wireless/ath/ath9k/main.c +++ b/drivers/net/wireless/ath/ath9k/main.c | |||
@@ -639,8 +639,7 @@ static int ath9k_start(struct ieee80211_hw *hw) | |||
639 | ath_err(common, | 639 | ath_err(common, |
640 | "Unable to reset hardware; reset status %d (freq %u MHz)\n", | 640 | "Unable to reset hardware; reset status %d (freq %u MHz)\n", |
641 | r, curchan->center_freq); | 641 | r, curchan->center_freq); |
642 | spin_unlock_bh(&sc->sc_pcu_lock); | 642 | ah->reset_power_on = false; |
643 | goto mutex_unlock; | ||
644 | } | 643 | } |
645 | 644 | ||
646 | /* Setup our intr mask. */ | 645 | /* Setup our intr mask. */ |
@@ -665,11 +664,8 @@ static int ath9k_start(struct ieee80211_hw *hw) | |||
665 | clear_bit(SC_OP_INVALID, &sc->sc_flags); | 664 | clear_bit(SC_OP_INVALID, &sc->sc_flags); |
666 | sc->sc_ah->is_monitoring = false; | 665 | sc->sc_ah->is_monitoring = false; |
667 | 666 | ||
668 | if (!ath_complete_reset(sc, false)) { | 667 | if (!ath_complete_reset(sc, false)) |
669 | r = -EIO; | 668 | ah->reset_power_on = false; |
670 | spin_unlock_bh(&sc->sc_pcu_lock); | ||
671 | goto mutex_unlock; | ||
672 | } | ||
673 | 669 | ||
674 | if (ah->led_pin >= 0) { | 670 | if (ah->led_pin >= 0) { |
675 | ath9k_hw_cfg_output(ah, ah->led_pin, | 671 | ath9k_hw_cfg_output(ah, ah->led_pin, |
@@ -688,12 +684,11 @@ static int ath9k_start(struct ieee80211_hw *hw) | |||
688 | if (ah->caps.pcie_lcr_extsync_en && common->bus_ops->extn_synch_en) | 684 | if (ah->caps.pcie_lcr_extsync_en && common->bus_ops->extn_synch_en) |
689 | common->bus_ops->extn_synch_en(common); | 685 | common->bus_ops->extn_synch_en(common); |
690 | 686 | ||
691 | mutex_unlock: | ||
692 | mutex_unlock(&sc->mutex); | 687 | mutex_unlock(&sc->mutex); |
693 | 688 | ||
694 | ath9k_ps_restore(sc); | 689 | ath9k_ps_restore(sc); |
695 | 690 | ||
696 | return r; | 691 | return 0; |
697 | } | 692 | } |
698 | 693 | ||
699 | static void ath9k_tx(struct ieee80211_hw *hw, | 694 | static void ath9k_tx(struct ieee80211_hw *hw, |
@@ -770,7 +765,7 @@ static void ath9k_tx(struct ieee80211_hw *hw, | |||
770 | 765 | ||
771 | return; | 766 | return; |
772 | exit: | 767 | exit: |
773 | dev_kfree_skb_any(skb); | 768 | ieee80211_free_txskb(hw, skb); |
774 | } | 769 | } |
775 | 770 | ||
776 | static void ath9k_stop(struct ieee80211_hw *hw) | 771 | static void ath9k_stop(struct ieee80211_hw *hw) |
diff --git a/drivers/net/wireless/ath/ath9k/pci.c b/drivers/net/wireless/ath/ath9k/pci.c index 0e630a99b68b..f088f4bf9a26 100644 --- a/drivers/net/wireless/ath/ath9k/pci.c +++ b/drivers/net/wireless/ath/ath9k/pci.c | |||
@@ -324,6 +324,10 @@ static int ath_pci_suspend(struct device *device) | |||
324 | static int ath_pci_resume(struct device *device) | 324 | static int ath_pci_resume(struct device *device) |
325 | { | 325 | { |
326 | struct pci_dev *pdev = to_pci_dev(device); | 326 | struct pci_dev *pdev = to_pci_dev(device); |
327 | struct ieee80211_hw *hw = pci_get_drvdata(pdev); | ||
328 | struct ath_softc *sc = hw->priv; | ||
329 | struct ath_hw *ah = sc->sc_ah; | ||
330 | struct ath_common *common = ath9k_hw_common(ah); | ||
327 | u32 val; | 331 | u32 val; |
328 | 332 | ||
329 | /* | 333 | /* |
@@ -335,6 +339,9 @@ static int ath_pci_resume(struct device *device) | |||
335 | if ((val & 0x0000ff00) != 0) | 339 | if ((val & 0x0000ff00) != 0) |
336 | pci_write_config_dword(pdev, 0x40, val & 0xffff00ff); | 340 | pci_write_config_dword(pdev, 0x40, val & 0xffff00ff); |
337 | 341 | ||
342 | ath_pci_aspm_init(common); | ||
343 | ah->reset_power_on = false; | ||
344 | |||
338 | return 0; | 345 | return 0; |
339 | } | 346 | } |
340 | 347 | ||
diff --git a/drivers/net/wireless/ath/ath9k/xmit.c b/drivers/net/wireless/ath/ath9k/xmit.c index 36618e3a5e60..741918a2027b 100644 --- a/drivers/net/wireless/ath/ath9k/xmit.c +++ b/drivers/net/wireless/ath/ath9k/xmit.c | |||
@@ -66,8 +66,7 @@ static void ath_tx_update_baw(struct ath_softc *sc, struct ath_atx_tid *tid, | |||
66 | static struct ath_buf *ath_tx_setup_buffer(struct ath_softc *sc, | 66 | static struct ath_buf *ath_tx_setup_buffer(struct ath_softc *sc, |
67 | struct ath_txq *txq, | 67 | struct ath_txq *txq, |
68 | struct ath_atx_tid *tid, | 68 | struct ath_atx_tid *tid, |
69 | struct sk_buff *skb, | 69 | struct sk_buff *skb); |
70 | bool dequeue); | ||
71 | 70 | ||
72 | enum { | 71 | enum { |
73 | MCS_HT20, | 72 | MCS_HT20, |
@@ -176,7 +175,15 @@ static void ath_tx_flush_tid(struct ath_softc *sc, struct ath_atx_tid *tid) | |||
176 | fi = get_frame_info(skb); | 175 | fi = get_frame_info(skb); |
177 | bf = fi->bf; | 176 | bf = fi->bf; |
178 | 177 | ||
179 | if (bf && fi->retries) { | 178 | if (!bf) { |
179 | bf = ath_tx_setup_buffer(sc, txq, tid, skb); | ||
180 | if (!bf) { | ||
181 | ieee80211_free_txskb(sc->hw, skb); | ||
182 | continue; | ||
183 | } | ||
184 | } | ||
185 | |||
186 | if (fi->retries) { | ||
180 | list_add_tail(&bf->list, &bf_head); | 187 | list_add_tail(&bf->list, &bf_head); |
181 | ath_tx_update_baw(sc, tid, bf->bf_state.seqno); | 188 | ath_tx_update_baw(sc, tid, bf->bf_state.seqno); |
182 | ath_tx_complete_buf(sc, bf, txq, &bf_head, &ts, 0); | 189 | ath_tx_complete_buf(sc, bf, txq, &bf_head, &ts, 0); |
@@ -305,6 +312,7 @@ static struct ath_buf *ath_tx_get_buffer(struct ath_softc *sc) | |||
305 | } | 312 | } |
306 | 313 | ||
307 | bf = list_first_entry(&sc->tx.txbuf, struct ath_buf, list); | 314 | bf = list_first_entry(&sc->tx.txbuf, struct ath_buf, list); |
315 | bf->bf_next = NULL; | ||
308 | list_del(&bf->list); | 316 | list_del(&bf->list); |
309 | 317 | ||
310 | spin_unlock_bh(&sc->tx.txbuflock); | 318 | spin_unlock_bh(&sc->tx.txbuflock); |
@@ -386,7 +394,7 @@ static void ath_tx_complete_aggr(struct ath_softc *sc, struct ath_txq *txq, | |||
386 | u16 seq_st = 0, acked_cnt = 0, txfail_cnt = 0, seq_first; | 394 | u16 seq_st = 0, acked_cnt = 0, txfail_cnt = 0, seq_first; |
387 | u32 ba[WME_BA_BMP_SIZE >> 5]; | 395 | u32 ba[WME_BA_BMP_SIZE >> 5]; |
388 | int isaggr, txfail, txpending, sendbar = 0, needreset = 0, nbad = 0; | 396 | int isaggr, txfail, txpending, sendbar = 0, needreset = 0, nbad = 0; |
389 | bool rc_update = true; | 397 | bool rc_update = true, isba; |
390 | struct ieee80211_tx_rate rates[4]; | 398 | struct ieee80211_tx_rate rates[4]; |
391 | struct ath_frame_info *fi; | 399 | struct ath_frame_info *fi; |
392 | int nframes; | 400 | int nframes; |
@@ -430,13 +438,17 @@ static void ath_tx_complete_aggr(struct ath_softc *sc, struct ath_txq *txq, | |||
430 | tidno = ieee80211_get_qos_ctl(hdr)[0] & IEEE80211_QOS_CTL_TID_MASK; | 438 | tidno = ieee80211_get_qos_ctl(hdr)[0] & IEEE80211_QOS_CTL_TID_MASK; |
431 | tid = ATH_AN_2_TID(an, tidno); | 439 | tid = ATH_AN_2_TID(an, tidno); |
432 | seq_first = tid->seq_start; | 440 | seq_first = tid->seq_start; |
441 | isba = ts->ts_flags & ATH9K_TX_BA; | ||
433 | 442 | ||
434 | /* | 443 | /* |
435 | * The hardware occasionally sends a tx status for the wrong TID. | 444 | * The hardware occasionally sends a tx status for the wrong TID. |
436 | * In this case, the BA status cannot be considered valid and all | 445 | * In this case, the BA status cannot be considered valid and all |
437 | * subframes need to be retransmitted | 446 | * subframes need to be retransmitted |
447 | * | ||
448 | * Only BlockAcks have a TID and therefore normal Acks cannot be | ||
449 | * checked | ||
438 | */ | 450 | */ |
439 | if (tidno != ts->tid) | 451 | if (isba && tidno != ts->tid) |
440 | txok = false; | 452 | txok = false; |
441 | 453 | ||
442 | isaggr = bf_isaggr(bf); | 454 | isaggr = bf_isaggr(bf); |
@@ -785,10 +797,13 @@ static enum ATH_AGGR_STATUS ath_tx_form_aggr(struct ath_softc *sc, | |||
785 | fi = get_frame_info(skb); | 797 | fi = get_frame_info(skb); |
786 | bf = fi->bf; | 798 | bf = fi->bf; |
787 | if (!fi->bf) | 799 | if (!fi->bf) |
788 | bf = ath_tx_setup_buffer(sc, txq, tid, skb, true); | 800 | bf = ath_tx_setup_buffer(sc, txq, tid, skb); |
789 | 801 | ||
790 | if (!bf) | 802 | if (!bf) { |
803 | __skb_unlink(skb, &tid->buf_q); | ||
804 | ieee80211_free_txskb(sc->hw, skb); | ||
791 | continue; | 805 | continue; |
806 | } | ||
792 | 807 | ||
793 | bf->bf_state.bf_type = BUF_AMPDU | BUF_AGGR; | 808 | bf->bf_state.bf_type = BUF_AMPDU | BUF_AGGR; |
794 | seqno = bf->bf_state.seqno; | 809 | seqno = bf->bf_state.seqno; |
@@ -1731,9 +1746,11 @@ static void ath_tx_send_ampdu(struct ath_softc *sc, struct ath_atx_tid *tid, | |||
1731 | return; | 1746 | return; |
1732 | } | 1747 | } |
1733 | 1748 | ||
1734 | bf = ath_tx_setup_buffer(sc, txctl->txq, tid, skb, false); | 1749 | bf = ath_tx_setup_buffer(sc, txctl->txq, tid, skb); |
1735 | if (!bf) | 1750 | if (!bf) { |
1751 | ieee80211_free_txskb(sc->hw, skb); | ||
1736 | return; | 1752 | return; |
1753 | } | ||
1737 | 1754 | ||
1738 | bf->bf_state.bf_type = BUF_AMPDU; | 1755 | bf->bf_state.bf_type = BUF_AMPDU; |
1739 | INIT_LIST_HEAD(&bf_head); | 1756 | INIT_LIST_HEAD(&bf_head); |
@@ -1757,16 +1774,12 @@ static void ath_tx_send_normal(struct ath_softc *sc, struct ath_txq *txq, | |||
1757 | struct ath_buf *bf; | 1774 | struct ath_buf *bf; |
1758 | 1775 | ||
1759 | bf = fi->bf; | 1776 | bf = fi->bf; |
1760 | if (!bf) | ||
1761 | bf = ath_tx_setup_buffer(sc, txq, tid, skb, false); | ||
1762 | |||
1763 | if (!bf) | ||
1764 | return; | ||
1765 | 1777 | ||
1766 | INIT_LIST_HEAD(&bf_head); | 1778 | INIT_LIST_HEAD(&bf_head); |
1767 | list_add_tail(&bf->list, &bf_head); | 1779 | list_add_tail(&bf->list, &bf_head); |
1768 | bf->bf_state.bf_type = 0; | 1780 | bf->bf_state.bf_type = 0; |
1769 | 1781 | ||
1782 | bf->bf_next = NULL; | ||
1770 | bf->bf_lastbf = bf; | 1783 | bf->bf_lastbf = bf; |
1771 | ath_tx_fill_desc(sc, bf, txq, fi->framelen); | 1784 | ath_tx_fill_desc(sc, bf, txq, fi->framelen); |
1772 | ath_tx_txqaddbuf(sc, txq, &bf_head, false); | 1785 | ath_tx_txqaddbuf(sc, txq, &bf_head, false); |
@@ -1839,8 +1852,7 @@ u8 ath_txchainmask_reduction(struct ath_softc *sc, u8 chainmask, u32 rate) | |||
1839 | static struct ath_buf *ath_tx_setup_buffer(struct ath_softc *sc, | 1852 | static struct ath_buf *ath_tx_setup_buffer(struct ath_softc *sc, |
1840 | struct ath_txq *txq, | 1853 | struct ath_txq *txq, |
1841 | struct ath_atx_tid *tid, | 1854 | struct ath_atx_tid *tid, |
1842 | struct sk_buff *skb, | 1855 | struct sk_buff *skb) |
1843 | bool dequeue) | ||
1844 | { | 1856 | { |
1845 | struct ath_common *common = ath9k_hw_common(sc->sc_ah); | 1857 | struct ath_common *common = ath9k_hw_common(sc->sc_ah); |
1846 | struct ath_frame_info *fi = get_frame_info(skb); | 1858 | struct ath_frame_info *fi = get_frame_info(skb); |
@@ -1852,7 +1864,7 @@ static struct ath_buf *ath_tx_setup_buffer(struct ath_softc *sc, | |||
1852 | bf = ath_tx_get_buffer(sc); | 1864 | bf = ath_tx_get_buffer(sc); |
1853 | if (!bf) { | 1865 | if (!bf) { |
1854 | ath_dbg(common, XMIT, "TX buffers are full\n"); | 1866 | ath_dbg(common, XMIT, "TX buffers are full\n"); |
1855 | goto error; | 1867 | return NULL; |
1856 | } | 1868 | } |
1857 | 1869 | ||
1858 | ATH_TXBUF_RESET(bf); | 1870 | ATH_TXBUF_RESET(bf); |
@@ -1881,18 +1893,12 @@ static struct ath_buf *ath_tx_setup_buffer(struct ath_softc *sc, | |||
1881 | ath_err(ath9k_hw_common(sc->sc_ah), | 1893 | ath_err(ath9k_hw_common(sc->sc_ah), |
1882 | "dma_mapping_error() on TX\n"); | 1894 | "dma_mapping_error() on TX\n"); |
1883 | ath_tx_return_buffer(sc, bf); | 1895 | ath_tx_return_buffer(sc, bf); |
1884 | goto error; | 1896 | return NULL; |
1885 | } | 1897 | } |
1886 | 1898 | ||
1887 | fi->bf = bf; | 1899 | fi->bf = bf; |
1888 | 1900 | ||
1889 | return bf; | 1901 | return bf; |
1890 | |||
1891 | error: | ||
1892 | if (dequeue) | ||
1893 | __skb_unlink(skb, &tid->buf_q); | ||
1894 | dev_kfree_skb_any(skb); | ||
1895 | return NULL; | ||
1896 | } | 1902 | } |
1897 | 1903 | ||
1898 | /* FIXME: tx power */ | 1904 | /* FIXME: tx power */ |
@@ -1921,9 +1927,14 @@ static void ath_tx_start_dma(struct ath_softc *sc, struct sk_buff *skb, | |||
1921 | */ | 1927 | */ |
1922 | ath_tx_send_ampdu(sc, tid, skb, txctl); | 1928 | ath_tx_send_ampdu(sc, tid, skb, txctl); |
1923 | } else { | 1929 | } else { |
1924 | bf = ath_tx_setup_buffer(sc, txctl->txq, tid, skb, false); | 1930 | bf = ath_tx_setup_buffer(sc, txctl->txq, tid, skb); |
1925 | if (!bf) | 1931 | if (!bf) { |
1932 | if (txctl->paprd) | ||
1933 | dev_kfree_skb_any(skb); | ||
1934 | else | ||
1935 | ieee80211_free_txskb(sc->hw, skb); | ||
1926 | return; | 1936 | return; |
1937 | } | ||
1927 | 1938 | ||
1928 | bf->bf_state.bfs_paprd = txctl->paprd; | 1939 | bf->bf_state.bfs_paprd = txctl->paprd; |
1929 | 1940 | ||
diff --git a/drivers/net/wireless/ath/carl9170/carl9170.h b/drivers/net/wireless/ath/carl9170/carl9170.h index 2aa4a59c72c8..2df17f1e49ef 100644 --- a/drivers/net/wireless/ath/carl9170/carl9170.h +++ b/drivers/net/wireless/ath/carl9170/carl9170.h | |||
@@ -303,6 +303,7 @@ struct ar9170 { | |||
303 | unsigned long queue_stop_timeout[__AR9170_NUM_TXQ]; | 303 | unsigned long queue_stop_timeout[__AR9170_NUM_TXQ]; |
304 | unsigned long max_queue_stop_timeout[__AR9170_NUM_TXQ]; | 304 | unsigned long max_queue_stop_timeout[__AR9170_NUM_TXQ]; |
305 | bool needs_full_reset; | 305 | bool needs_full_reset; |
306 | bool force_usb_reset; | ||
306 | atomic_t pending_restarts; | 307 | atomic_t pending_restarts; |
307 | 308 | ||
308 | /* interface mode settings */ | 309 | /* interface mode settings */ |
diff --git a/drivers/net/wireless/ath/carl9170/main.c b/drivers/net/wireless/ath/carl9170/main.c index 67997b39aba7..25a1e2f4f738 100644 --- a/drivers/net/wireless/ath/carl9170/main.c +++ b/drivers/net/wireless/ath/carl9170/main.c | |||
@@ -465,27 +465,26 @@ static void carl9170_restart_work(struct work_struct *work) | |||
465 | { | 465 | { |
466 | struct ar9170 *ar = container_of(work, struct ar9170, | 466 | struct ar9170 *ar = container_of(work, struct ar9170, |
467 | restart_work); | 467 | restart_work); |
468 | int err; | 468 | int err = -EIO; |
469 | 469 | ||
470 | ar->usedkeys = 0; | 470 | ar->usedkeys = 0; |
471 | ar->filter_state = 0; | 471 | ar->filter_state = 0; |
472 | carl9170_cancel_worker(ar); | 472 | carl9170_cancel_worker(ar); |
473 | 473 | ||
474 | mutex_lock(&ar->mutex); | 474 | mutex_lock(&ar->mutex); |
475 | err = carl9170_usb_restart(ar); | 475 | if (!ar->force_usb_reset) { |
476 | if (net_ratelimit()) { | 476 | err = carl9170_usb_restart(ar); |
477 | if (err) { | 477 | if (net_ratelimit()) { |
478 | dev_err(&ar->udev->dev, "Failed to restart device " | 478 | if (err) |
479 | " (%d).\n", err); | 479 | dev_err(&ar->udev->dev, "Failed to restart device (%d).\n", err); |
480 | } else { | 480 | else |
481 | dev_info(&ar->udev->dev, "device restarted " | 481 | dev_info(&ar->udev->dev, "device restarted successfully.\n"); |
482 | "successfully.\n"); | ||
483 | } | 482 | } |
484 | } | 483 | } |
485 | |||
486 | carl9170_zap_queues(ar); | 484 | carl9170_zap_queues(ar); |
487 | mutex_unlock(&ar->mutex); | 485 | mutex_unlock(&ar->mutex); |
488 | if (!err) { | 486 | |
487 | if (!err && !ar->force_usb_reset) { | ||
489 | ar->restart_counter++; | 488 | ar->restart_counter++; |
490 | atomic_set(&ar->pending_restarts, 0); | 489 | atomic_set(&ar->pending_restarts, 0); |
491 | 490 | ||
@@ -526,10 +525,10 @@ void carl9170_restart(struct ar9170 *ar, const enum carl9170_restart_reasons r) | |||
526 | if (!ar->registered) | 525 | if (!ar->registered) |
527 | return; | 526 | return; |
528 | 527 | ||
529 | if (IS_ACCEPTING_CMD(ar) && !ar->needs_full_reset) | 528 | if (!IS_ACCEPTING_CMD(ar) || ar->needs_full_reset) |
530 | ieee80211_queue_work(ar->hw, &ar->restart_work); | 529 | ar->force_usb_reset = true; |
531 | else | 530 | |
532 | carl9170_usb_reset(ar); | 531 | ieee80211_queue_work(ar->hw, &ar->restart_work); |
533 | 532 | ||
534 | /* | 533 | /* |
535 | * At this point, the device instance might have vanished/disabled. | 534 | * At this point, the device instance might have vanished/disabled. |
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 2691620393ea..780d3e168297 100644 --- a/drivers/net/wireless/mwifiex/cfg80211.c +++ b/drivers/net/wireless/mwifiex/cfg80211.c | |||
@@ -1596,8 +1596,9 @@ done: | |||
1596 | } | 1596 | } |
1597 | } | 1597 | } |
1598 | 1598 | ||
1599 | if (mwifiex_bss_start(priv, bss, &req_ssid)) | 1599 | ret = mwifiex_bss_start(priv, bss, &req_ssid); |
1600 | return -EFAULT; | 1600 | if (ret) |
1601 | return ret; | ||
1601 | 1602 | ||
1602 | if (mode == NL80211_IFTYPE_ADHOC) { | 1603 | if (mode == NL80211_IFTYPE_ADHOC) { |
1603 | /* Inform the BSS information to kernel, otherwise | 1604 | /* Inform the BSS information to kernel, otherwise |
@@ -1652,9 +1653,19 @@ done: | |||
1652 | "info: association to bssid %pM failed\n", | 1653 | "info: association to bssid %pM failed\n", |
1653 | priv->cfg_bssid); | 1654 | priv->cfg_bssid); |
1654 | memset(priv->cfg_bssid, 0, ETH_ALEN); | 1655 | memset(priv->cfg_bssid, 0, ETH_ALEN); |
1656 | |||
1657 | if (ret > 0) | ||
1658 | cfg80211_connect_result(priv->netdev, priv->cfg_bssid, | ||
1659 | NULL, 0, NULL, 0, ret, | ||
1660 | GFP_KERNEL); | ||
1661 | else | ||
1662 | cfg80211_connect_result(priv->netdev, priv->cfg_bssid, | ||
1663 | NULL, 0, NULL, 0, | ||
1664 | WLAN_STATUS_UNSPECIFIED_FAILURE, | ||
1665 | GFP_KERNEL); | ||
1655 | } | 1666 | } |
1656 | 1667 | ||
1657 | return ret; | 1668 | return 0; |
1658 | } | 1669 | } |
1659 | 1670 | ||
1660 | /* | 1671 | /* |
@@ -1802,7 +1813,7 @@ mwifiex_cfg80211_scan(struct wiphy *wiphy, | |||
1802 | { | 1813 | { |
1803 | struct net_device *dev = request->wdev->netdev; | 1814 | struct net_device *dev = request->wdev->netdev; |
1804 | struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev); | 1815 | struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev); |
1805 | int i, offset; | 1816 | int i, offset, ret; |
1806 | struct ieee80211_channel *chan; | 1817 | struct ieee80211_channel *chan; |
1807 | struct ieee_types_header *ie; | 1818 | struct ieee_types_header *ie; |
1808 | 1819 | ||
@@ -1814,8 +1825,6 @@ mwifiex_cfg80211_scan(struct wiphy *wiphy, | |||
1814 | return -EBUSY; | 1825 | return -EBUSY; |
1815 | } | 1826 | } |
1816 | 1827 | ||
1817 | priv->scan_request = request; | ||
1818 | |||
1819 | priv->user_scan_cfg = kzalloc(sizeof(struct mwifiex_user_scan_cfg), | 1828 | priv->user_scan_cfg = kzalloc(sizeof(struct mwifiex_user_scan_cfg), |
1820 | GFP_KERNEL); | 1829 | GFP_KERNEL); |
1821 | if (!priv->user_scan_cfg) { | 1830 | if (!priv->user_scan_cfg) { |
@@ -1823,6 +1832,8 @@ mwifiex_cfg80211_scan(struct wiphy *wiphy, | |||
1823 | return -ENOMEM; | 1832 | return -ENOMEM; |
1824 | } | 1833 | } |
1825 | 1834 | ||
1835 | priv->scan_request = request; | ||
1836 | |||
1826 | priv->user_scan_cfg->num_ssids = request->n_ssids; | 1837 | priv->user_scan_cfg->num_ssids = request->n_ssids; |
1827 | priv->user_scan_cfg->ssid_list = request->ssids; | 1838 | priv->user_scan_cfg->ssid_list = request->ssids; |
1828 | 1839 | ||
@@ -1855,8 +1866,15 @@ mwifiex_cfg80211_scan(struct wiphy *wiphy, | |||
1855 | 1866 | ||
1856 | priv->user_scan_cfg->chan_list[i].scan_time = 0; | 1867 | priv->user_scan_cfg->chan_list[i].scan_time = 0; |
1857 | } | 1868 | } |
1858 | if (mwifiex_scan_networks(priv, priv->user_scan_cfg)) | 1869 | |
1859 | return -EFAULT; | 1870 | ret = mwifiex_scan_networks(priv, priv->user_scan_cfg); |
1871 | if (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; | ||
1876 | return ret; | ||
1877 | } | ||
1860 | 1878 | ||
1861 | if (request->ie && request->ie_len) { | 1879 | if (request->ie && request->ie_len) { |
1862 | for (i = 0; i < MWIFIEX_MAX_VSIE_NUM; i++) { | 1880 | for (i = 0; i < MWIFIEX_MAX_VSIE_NUM; i++) { |
diff --git a/drivers/net/wireless/mwifiex/join.c b/drivers/net/wireless/mwifiex/join.c index 82e63cee1e97..7b0858af8f5d 100644 --- a/drivers/net/wireless/mwifiex/join.c +++ b/drivers/net/wireless/mwifiex/join.c | |||
@@ -1180,16 +1180,18 @@ int mwifiex_ret_802_11_ad_hoc(struct mwifiex_private *priv, | |||
1180 | struct mwifiex_adapter *adapter = priv->adapter; | 1180 | struct mwifiex_adapter *adapter = priv->adapter; |
1181 | struct host_cmd_ds_802_11_ad_hoc_result *adhoc_result; | 1181 | struct host_cmd_ds_802_11_ad_hoc_result *adhoc_result; |
1182 | struct mwifiex_bssdescriptor *bss_desc; | 1182 | struct mwifiex_bssdescriptor *bss_desc; |
1183 | u16 reason_code; | ||
1183 | 1184 | ||
1184 | adhoc_result = &resp->params.adhoc_result; | 1185 | adhoc_result = &resp->params.adhoc_result; |
1185 | 1186 | ||
1186 | bss_desc = priv->attempted_bss_desc; | 1187 | bss_desc = priv->attempted_bss_desc; |
1187 | 1188 | ||
1188 | /* Join result code 0 --> SUCCESS */ | 1189 | /* Join result code 0 --> SUCCESS */ |
1189 | if (le16_to_cpu(resp->result)) { | 1190 | reason_code = le16_to_cpu(resp->result); |
1191 | if (reason_code) { | ||
1190 | dev_err(priv->adapter->dev, "ADHOC_RESP: failed\n"); | 1192 | dev_err(priv->adapter->dev, "ADHOC_RESP: failed\n"); |
1191 | if (priv->media_connected) | 1193 | if (priv->media_connected) |
1192 | mwifiex_reset_connect_state(priv); | 1194 | mwifiex_reset_connect_state(priv, reason_code); |
1193 | 1195 | ||
1194 | memset(&priv->curr_bss_params.bss_descriptor, | 1196 | memset(&priv->curr_bss_params.bss_descriptor, |
1195 | 0x00, sizeof(struct mwifiex_bssdescriptor)); | 1197 | 0x00, sizeof(struct mwifiex_bssdescriptor)); |
diff --git a/drivers/net/wireless/mwifiex/main.h b/drivers/net/wireless/mwifiex/main.h index bfb3fa69805c..c2d0ab146af5 100644 --- a/drivers/net/wireless/mwifiex/main.h +++ b/drivers/net/wireless/mwifiex/main.h | |||
@@ -847,7 +847,7 @@ int mwifiex_cmd_802_11_associate(struct mwifiex_private *priv, | |||
847 | struct mwifiex_bssdescriptor *bss_desc); | 847 | struct mwifiex_bssdescriptor *bss_desc); |
848 | int mwifiex_ret_802_11_associate(struct mwifiex_private *priv, | 848 | int mwifiex_ret_802_11_associate(struct mwifiex_private *priv, |
849 | struct host_cmd_ds_command *resp); | 849 | struct host_cmd_ds_command *resp); |
850 | void mwifiex_reset_connect_state(struct mwifiex_private *priv); | 850 | void mwifiex_reset_connect_state(struct mwifiex_private *priv, u16 reason); |
851 | u8 mwifiex_band_to_radio_type(u8 band); | 851 | u8 mwifiex_band_to_radio_type(u8 band); |
852 | int mwifiex_deauthenticate(struct mwifiex_private *priv, u8 *mac); | 852 | int mwifiex_deauthenticate(struct mwifiex_private *priv, u8 *mac); |
853 | int mwifiex_adhoc_start(struct mwifiex_private *priv, | 853 | int mwifiex_adhoc_start(struct mwifiex_private *priv, |
diff --git a/drivers/net/wireless/mwifiex/scan.c b/drivers/net/wireless/mwifiex/scan.c index e36a75988f87..9171aaedbccd 100644 --- a/drivers/net/wireless/mwifiex/scan.c +++ b/drivers/net/wireless/mwifiex/scan.c | |||
@@ -1296,7 +1296,7 @@ mwifiex_radio_type_to_band(u8 radio_type) | |||
1296 | int mwifiex_scan_networks(struct mwifiex_private *priv, | 1296 | int mwifiex_scan_networks(struct mwifiex_private *priv, |
1297 | const struct mwifiex_user_scan_cfg *user_scan_in) | 1297 | const struct mwifiex_user_scan_cfg *user_scan_in) |
1298 | { | 1298 | { |
1299 | int ret = 0; | 1299 | int ret; |
1300 | struct mwifiex_adapter *adapter = priv->adapter; | 1300 | struct mwifiex_adapter *adapter = priv->adapter; |
1301 | struct cmd_ctrl_node *cmd_node; | 1301 | struct cmd_ctrl_node *cmd_node; |
1302 | union mwifiex_scan_cmd_config_tlv *scan_cfg_out; | 1302 | union mwifiex_scan_cmd_config_tlv *scan_cfg_out; |
@@ -1309,25 +1309,26 @@ int mwifiex_scan_networks(struct mwifiex_private *priv, | |||
1309 | unsigned long flags; | 1309 | unsigned long flags; |
1310 | 1310 | ||
1311 | if (adapter->scan_processing) { | 1311 | if (adapter->scan_processing) { |
1312 | dev_dbg(adapter->dev, "cmd: Scan already in process...\n"); | 1312 | dev_err(adapter->dev, "cmd: Scan already in process...\n"); |
1313 | return ret; | 1313 | return -EBUSY; |
1314 | } | 1314 | } |
1315 | 1315 | ||
1316 | spin_lock_irqsave(&adapter->mwifiex_cmd_lock, flags); | ||
1317 | adapter->scan_processing = true; | ||
1318 | spin_unlock_irqrestore(&adapter->mwifiex_cmd_lock, flags); | ||
1319 | |||
1320 | if (priv->scan_block) { | 1316 | if (priv->scan_block) { |
1321 | dev_dbg(adapter->dev, | 1317 | dev_err(adapter->dev, |
1322 | "cmd: Scan is blocked during association...\n"); | 1318 | "cmd: Scan is blocked during association...\n"); |
1323 | return ret; | 1319 | return -EBUSY; |
1324 | } | 1320 | } |
1325 | 1321 | ||
1322 | spin_lock_irqsave(&adapter->mwifiex_cmd_lock, flags); | ||
1323 | adapter->scan_processing = true; | ||
1324 | spin_unlock_irqrestore(&adapter->mwifiex_cmd_lock, flags); | ||
1325 | |||
1326 | scan_cfg_out = kzalloc(sizeof(union mwifiex_scan_cmd_config_tlv), | 1326 | scan_cfg_out = kzalloc(sizeof(union mwifiex_scan_cmd_config_tlv), |
1327 | GFP_KERNEL); | 1327 | GFP_KERNEL); |
1328 | if (!scan_cfg_out) { | 1328 | if (!scan_cfg_out) { |
1329 | dev_err(adapter->dev, "failed to alloc scan_cfg_out\n"); | 1329 | dev_err(adapter->dev, "failed to alloc scan_cfg_out\n"); |
1330 | return -ENOMEM; | 1330 | ret = -ENOMEM; |
1331 | goto done; | ||
1331 | } | 1332 | } |
1332 | 1333 | ||
1333 | buf_size = sizeof(struct mwifiex_chan_scan_param_set) * | 1334 | buf_size = sizeof(struct mwifiex_chan_scan_param_set) * |
@@ -1336,7 +1337,8 @@ int mwifiex_scan_networks(struct mwifiex_private *priv, | |||
1336 | if (!scan_chan_list) { | 1337 | if (!scan_chan_list) { |
1337 | dev_err(adapter->dev, "failed to alloc scan_chan_list\n"); | 1338 | dev_err(adapter->dev, "failed to alloc scan_chan_list\n"); |
1338 | kfree(scan_cfg_out); | 1339 | kfree(scan_cfg_out); |
1339 | return -ENOMEM; | 1340 | ret = -ENOMEM; |
1341 | goto done; | ||
1340 | } | 1342 | } |
1341 | 1343 | ||
1342 | mwifiex_config_scan(priv, user_scan_in, &scan_cfg_out->config, | 1344 | mwifiex_config_scan(priv, user_scan_in, &scan_cfg_out->config, |
@@ -1364,14 +1366,16 @@ int mwifiex_scan_networks(struct mwifiex_private *priv, | |||
1364 | spin_unlock_irqrestore(&adapter->scan_pending_q_lock, | 1366 | spin_unlock_irqrestore(&adapter->scan_pending_q_lock, |
1365 | flags); | 1367 | flags); |
1366 | } | 1368 | } |
1367 | } else { | ||
1368 | spin_lock_irqsave(&adapter->mwifiex_cmd_lock, flags); | ||
1369 | adapter->scan_processing = true; | ||
1370 | spin_unlock_irqrestore(&adapter->mwifiex_cmd_lock, flags); | ||
1371 | } | 1369 | } |
1372 | 1370 | ||
1373 | kfree(scan_cfg_out); | 1371 | kfree(scan_cfg_out); |
1374 | kfree(scan_chan_list); | 1372 | kfree(scan_chan_list); |
1373 | done: | ||
1374 | if (ret) { | ||
1375 | spin_lock_irqsave(&adapter->mwifiex_cmd_lock, flags); | ||
1376 | adapter->scan_processing = false; | ||
1377 | spin_unlock_irqrestore(&adapter->mwifiex_cmd_lock, flags); | ||
1378 | } | ||
1375 | return ret; | 1379 | return ret; |
1376 | } | 1380 | } |
1377 | 1381 | ||
@@ -1430,8 +1434,8 @@ int mwifiex_check_network_compatibility(struct mwifiex_private *priv, | |||
1430 | ret = mwifiex_is_network_compatible(priv, bss_desc, | 1434 | ret = mwifiex_is_network_compatible(priv, bss_desc, |
1431 | priv->bss_mode); | 1435 | priv->bss_mode); |
1432 | if (ret) | 1436 | if (ret) |
1433 | dev_err(priv->adapter->dev, "cannot find ssid " | 1437 | dev_err(priv->adapter->dev, |
1434 | "%s\n", bss_desc->ssid.ssid); | 1438 | "Incompatible network settings\n"); |
1435 | break; | 1439 | break; |
1436 | default: | 1440 | default: |
1437 | ret = 0; | 1441 | ret = 0; |
@@ -1839,21 +1843,18 @@ static int mwifiex_scan_specific_ssid(struct mwifiex_private *priv, | |||
1839 | struct cfg80211_ssid *req_ssid) | 1843 | struct cfg80211_ssid *req_ssid) |
1840 | { | 1844 | { |
1841 | struct mwifiex_adapter *adapter = priv->adapter; | 1845 | struct mwifiex_adapter *adapter = priv->adapter; |
1842 | int ret = 0; | 1846 | int ret; |
1843 | struct mwifiex_user_scan_cfg *scan_cfg; | 1847 | struct mwifiex_user_scan_cfg *scan_cfg; |
1844 | 1848 | ||
1845 | if (!req_ssid) | ||
1846 | return -1; | ||
1847 | |||
1848 | if (adapter->scan_processing) { | 1849 | if (adapter->scan_processing) { |
1849 | dev_dbg(adapter->dev, "cmd: Scan already in process...\n"); | 1850 | dev_err(adapter->dev, "cmd: Scan already in process...\n"); |
1850 | return ret; | 1851 | return -EBUSY; |
1851 | } | 1852 | } |
1852 | 1853 | ||
1853 | if (priv->scan_block) { | 1854 | if (priv->scan_block) { |
1854 | dev_dbg(adapter->dev, | 1855 | dev_err(adapter->dev, |
1855 | "cmd: Scan is blocked during association...\n"); | 1856 | "cmd: Scan is blocked during association...\n"); |
1856 | return ret; | 1857 | return -EBUSY; |
1857 | } | 1858 | } |
1858 | 1859 | ||
1859 | 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/mwifiex/sta_cmdresp.c b/drivers/net/wireless/mwifiex/sta_cmdresp.c index e380171c4c5d..09e6a267f566 100644 --- a/drivers/net/wireless/mwifiex/sta_cmdresp.c +++ b/drivers/net/wireless/mwifiex/sta_cmdresp.c | |||
@@ -545,7 +545,7 @@ static int mwifiex_ret_802_11_deauthenticate(struct mwifiex_private *priv, | |||
545 | if (!memcmp(resp->params.deauth.mac_addr, | 545 | if (!memcmp(resp->params.deauth.mac_addr, |
546 | &priv->curr_bss_params.bss_descriptor.mac_address, | 546 | &priv->curr_bss_params.bss_descriptor.mac_address, |
547 | sizeof(resp->params.deauth.mac_addr))) | 547 | sizeof(resp->params.deauth.mac_addr))) |
548 | mwifiex_reset_connect_state(priv); | 548 | mwifiex_reset_connect_state(priv, WLAN_REASON_DEAUTH_LEAVING); |
549 | 549 | ||
550 | return 0; | 550 | return 0; |
551 | } | 551 | } |
@@ -558,7 +558,7 @@ static int mwifiex_ret_802_11_deauthenticate(struct mwifiex_private *priv, | |||
558 | static int mwifiex_ret_802_11_ad_hoc_stop(struct mwifiex_private *priv, | 558 | static int mwifiex_ret_802_11_ad_hoc_stop(struct mwifiex_private *priv, |
559 | struct host_cmd_ds_command *resp) | 559 | struct host_cmd_ds_command *resp) |
560 | { | 560 | { |
561 | mwifiex_reset_connect_state(priv); | 561 | mwifiex_reset_connect_state(priv, WLAN_REASON_DEAUTH_LEAVING); |
562 | return 0; | 562 | return 0; |
563 | } | 563 | } |
564 | 564 | ||
diff --git a/drivers/net/wireless/mwifiex/sta_event.c b/drivers/net/wireless/mwifiex/sta_event.c index aafde30e714a..8132119e1a21 100644 --- a/drivers/net/wireless/mwifiex/sta_event.c +++ b/drivers/net/wireless/mwifiex/sta_event.c | |||
@@ -41,7 +41,7 @@ | |||
41 | * - Sends a disconnect event to upper layers/applications. | 41 | * - Sends a disconnect event to upper layers/applications. |
42 | */ | 42 | */ |
43 | void | 43 | void |
44 | mwifiex_reset_connect_state(struct mwifiex_private *priv) | 44 | mwifiex_reset_connect_state(struct mwifiex_private *priv, u16 reason_code) |
45 | { | 45 | { |
46 | struct mwifiex_adapter *adapter = priv->adapter; | 46 | struct mwifiex_adapter *adapter = priv->adapter; |
47 | 47 | ||
@@ -117,10 +117,10 @@ mwifiex_reset_connect_state(struct mwifiex_private *priv) | |||
117 | priv->media_connected = false; | 117 | priv->media_connected = false; |
118 | dev_dbg(adapter->dev, | 118 | dev_dbg(adapter->dev, |
119 | "info: successfully disconnected from %pM: reason code %d\n", | 119 | "info: successfully disconnected from %pM: reason code %d\n", |
120 | priv->cfg_bssid, WLAN_REASON_DEAUTH_LEAVING); | 120 | priv->cfg_bssid, reason_code); |
121 | if (priv->bss_mode == NL80211_IFTYPE_STATION) { | 121 | if (priv->bss_mode == NL80211_IFTYPE_STATION) { |
122 | cfg80211_disconnected(priv->netdev, WLAN_REASON_DEAUTH_LEAVING, | 122 | cfg80211_disconnected(priv->netdev, reason_code, NULL, 0, |
123 | NULL, 0, GFP_KERNEL); | 123 | GFP_KERNEL); |
124 | } | 124 | } |
125 | memset(priv->cfg_bssid, 0, ETH_ALEN); | 125 | memset(priv->cfg_bssid, 0, ETH_ALEN); |
126 | 126 | ||
@@ -186,7 +186,7 @@ int mwifiex_process_sta_event(struct mwifiex_private *priv) | |||
186 | struct mwifiex_adapter *adapter = priv->adapter; | 186 | struct mwifiex_adapter *adapter = priv->adapter; |
187 | int ret = 0; | 187 | int ret = 0; |
188 | u32 eventcause = adapter->event_cause; | 188 | u32 eventcause = adapter->event_cause; |
189 | u16 ctrl; | 189 | u16 ctrl, reason_code; |
190 | 190 | ||
191 | switch (eventcause) { | 191 | switch (eventcause) { |
192 | case EVENT_DUMMY_HOST_WAKEUP_SIGNAL: | 192 | case EVENT_DUMMY_HOST_WAKEUP_SIGNAL: |
@@ -204,22 +204,31 @@ int mwifiex_process_sta_event(struct mwifiex_private *priv) | |||
204 | case EVENT_DEAUTHENTICATED: | 204 | case EVENT_DEAUTHENTICATED: |
205 | dev_dbg(adapter->dev, "event: Deauthenticated\n"); | 205 | dev_dbg(adapter->dev, "event: Deauthenticated\n"); |
206 | adapter->dbg.num_event_deauth++; | 206 | adapter->dbg.num_event_deauth++; |
207 | if (priv->media_connected) | 207 | if (priv->media_connected) { |
208 | mwifiex_reset_connect_state(priv); | 208 | reason_code = |
209 | le16_to_cpu(*(__le16 *)adapter->event_body); | ||
210 | mwifiex_reset_connect_state(priv, reason_code); | ||
211 | } | ||
209 | break; | 212 | break; |
210 | 213 | ||
211 | case EVENT_DISASSOCIATED: | 214 | case EVENT_DISASSOCIATED: |
212 | dev_dbg(adapter->dev, "event: Disassociated\n"); | 215 | dev_dbg(adapter->dev, "event: Disassociated\n"); |
213 | adapter->dbg.num_event_disassoc++; | 216 | adapter->dbg.num_event_disassoc++; |
214 | if (priv->media_connected) | 217 | if (priv->media_connected) { |
215 | mwifiex_reset_connect_state(priv); | 218 | reason_code = |
219 | le16_to_cpu(*(__le16 *)adapter->event_body); | ||
220 | mwifiex_reset_connect_state(priv, reason_code); | ||
221 | } | ||
216 | break; | 222 | break; |
217 | 223 | ||
218 | case EVENT_LINK_LOST: | 224 | case EVENT_LINK_LOST: |
219 | dev_dbg(adapter->dev, "event: Link lost\n"); | 225 | dev_dbg(adapter->dev, "event: Link lost\n"); |
220 | adapter->dbg.num_event_link_lost++; | 226 | adapter->dbg.num_event_link_lost++; |
221 | if (priv->media_connected) | 227 | if (priv->media_connected) { |
222 | mwifiex_reset_connect_state(priv); | 228 | reason_code = |
229 | le16_to_cpu(*(__le16 *)adapter->event_body); | ||
230 | mwifiex_reset_connect_state(priv, reason_code); | ||
231 | } | ||
223 | break; | 232 | break; |
224 | 233 | ||
225 | case EVENT_PS_SLEEP: | 234 | case EVENT_PS_SLEEP: |
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/rt2800lib.c b/drivers/net/wireless/rt2x00/rt2800lib.c index 540c94f8505a..59474ae0aec0 100644 --- a/drivers/net/wireless/rt2x00/rt2800lib.c +++ b/drivers/net/wireless/rt2x00/rt2800lib.c | |||
@@ -2252,9 +2252,9 @@ static void rt2800_config_channel(struct rt2x00_dev *rt2x00dev, | |||
2252 | */ | 2252 | */ |
2253 | if (rt2x00_rt(rt2x00dev, RT3352)) { | 2253 | if (rt2x00_rt(rt2x00dev, RT3352)) { |
2254 | rt2800_bbp_write(rt2x00dev, 27, 0x0); | 2254 | rt2800_bbp_write(rt2x00dev, 27, 0x0); |
2255 | rt2800_bbp_write(rt2x00dev, 62, 0x26 + rt2x00dev->lna_gain); | 2255 | rt2800_bbp_write(rt2x00dev, 66, 0x26 + rt2x00dev->lna_gain); |
2256 | rt2800_bbp_write(rt2x00dev, 27, 0x20); | 2256 | rt2800_bbp_write(rt2x00dev, 27, 0x20); |
2257 | rt2800_bbp_write(rt2x00dev, 62, 0x26 + rt2x00dev->lna_gain); | 2257 | rt2800_bbp_write(rt2x00dev, 66, 0x26 + rt2x00dev->lna_gain); |
2258 | } else { | 2258 | } else { |
2259 | rt2800_bbp_write(rt2x00dev, 62, 0x37 - rt2x00dev->lna_gain); | 2259 | rt2800_bbp_write(rt2x00dev, 62, 0x37 - rt2x00dev->lna_gain); |
2260 | rt2800_bbp_write(rt2x00dev, 63, 0x37 - rt2x00dev->lna_gain); | 2260 | rt2800_bbp_write(rt2x00dev, 63, 0x37 - rt2x00dev->lna_gain); |
@@ -2449,7 +2449,7 @@ static int rt2800_get_gain_calibration_delta(struct rt2x00_dev *rt2x00dev) | |||
2449 | /* | 2449 | /* |
2450 | * Check if temperature compensation is supported. | 2450 | * Check if temperature compensation is supported. |
2451 | */ | 2451 | */ |
2452 | if (tssi_bounds[4] == 0xff) | 2452 | if (tssi_bounds[4] == 0xff || step == 0xff) |
2453 | return 0; | 2453 | return 0; |
2454 | 2454 | ||
2455 | /* | 2455 | /* |
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; |
diff --git a/drivers/net/xen-netback/netback.c b/drivers/net/xen-netback/netback.c index 4ebfcf3d8a3b..f2d6b78d901d 100644 --- a/drivers/net/xen-netback/netback.c +++ b/drivers/net/xen-netback/netback.c | |||
@@ -335,21 +335,35 @@ unsigned int xen_netbk_count_skb_slots(struct xenvif *vif, struct sk_buff *skb) | |||
335 | 335 | ||
336 | for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) { | 336 | for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) { |
337 | unsigned long size = skb_frag_size(&skb_shinfo(skb)->frags[i]); | 337 | unsigned long size = skb_frag_size(&skb_shinfo(skb)->frags[i]); |
338 | unsigned long offset = skb_shinfo(skb)->frags[i].page_offset; | ||
338 | unsigned long bytes; | 339 | unsigned long bytes; |
340 | |||
341 | offset &= ~PAGE_MASK; | ||
342 | |||
339 | while (size > 0) { | 343 | while (size > 0) { |
344 | BUG_ON(offset >= PAGE_SIZE); | ||
340 | BUG_ON(copy_off > MAX_BUFFER_OFFSET); | 345 | BUG_ON(copy_off > MAX_BUFFER_OFFSET); |
341 | 346 | ||
342 | if (start_new_rx_buffer(copy_off, size, 0)) { | 347 | bytes = PAGE_SIZE - offset; |
348 | |||
349 | if (bytes > size) | ||
350 | bytes = size; | ||
351 | |||
352 | if (start_new_rx_buffer(copy_off, bytes, 0)) { | ||
343 | count++; | 353 | count++; |
344 | copy_off = 0; | 354 | copy_off = 0; |
345 | } | 355 | } |
346 | 356 | ||
347 | bytes = size; | ||
348 | if (copy_off + bytes > MAX_BUFFER_OFFSET) | 357 | if (copy_off + bytes > MAX_BUFFER_OFFSET) |
349 | bytes = MAX_BUFFER_OFFSET - copy_off; | 358 | bytes = MAX_BUFFER_OFFSET - copy_off; |
350 | 359 | ||
351 | copy_off += bytes; | 360 | copy_off += bytes; |
361 | |||
362 | offset += bytes; | ||
352 | size -= bytes; | 363 | size -= bytes; |
364 | |||
365 | if (offset == PAGE_SIZE) | ||
366 | offset = 0; | ||
353 | } | 367 | } |
354 | } | 368 | } |
355 | return count; | 369 | return count; |
@@ -403,14 +417,24 @@ static void netbk_gop_frag_copy(struct xenvif *vif, struct sk_buff *skb, | |||
403 | unsigned long bytes; | 417 | unsigned long bytes; |
404 | 418 | ||
405 | /* Data must not cross a page boundary. */ | 419 | /* Data must not cross a page boundary. */ |
406 | BUG_ON(size + offset > PAGE_SIZE); | 420 | BUG_ON(size + offset > PAGE_SIZE<<compound_order(page)); |
407 | 421 | ||
408 | meta = npo->meta + npo->meta_prod - 1; | 422 | meta = npo->meta + npo->meta_prod - 1; |
409 | 423 | ||
424 | /* Skip unused frames from start of page */ | ||
425 | page += offset >> PAGE_SHIFT; | ||
426 | offset &= ~PAGE_MASK; | ||
427 | |||
410 | while (size > 0) { | 428 | while (size > 0) { |
429 | BUG_ON(offset >= PAGE_SIZE); | ||
411 | BUG_ON(npo->copy_off > MAX_BUFFER_OFFSET); | 430 | BUG_ON(npo->copy_off > MAX_BUFFER_OFFSET); |
412 | 431 | ||
413 | if (start_new_rx_buffer(npo->copy_off, size, *head)) { | 432 | bytes = PAGE_SIZE - offset; |
433 | |||
434 | if (bytes > size) | ||
435 | bytes = size; | ||
436 | |||
437 | if (start_new_rx_buffer(npo->copy_off, bytes, *head)) { | ||
414 | /* | 438 | /* |
415 | * Netfront requires there to be some data in the head | 439 | * Netfront requires there to be some data in the head |
416 | * buffer. | 440 | * buffer. |
@@ -420,7 +444,6 @@ static void netbk_gop_frag_copy(struct xenvif *vif, struct sk_buff *skb, | |||
420 | meta = get_next_rx_buffer(vif, npo); | 444 | meta = get_next_rx_buffer(vif, npo); |
421 | } | 445 | } |
422 | 446 | ||
423 | bytes = size; | ||
424 | if (npo->copy_off + bytes > MAX_BUFFER_OFFSET) | 447 | if (npo->copy_off + bytes > MAX_BUFFER_OFFSET) |
425 | bytes = MAX_BUFFER_OFFSET - npo->copy_off; | 448 | bytes = MAX_BUFFER_OFFSET - npo->copy_off; |
426 | 449 | ||
@@ -453,6 +476,13 @@ static void netbk_gop_frag_copy(struct xenvif *vif, struct sk_buff *skb, | |||
453 | offset += bytes; | 476 | offset += bytes; |
454 | size -= bytes; | 477 | size -= bytes; |
455 | 478 | ||
479 | /* Next frame */ | ||
480 | if (offset == PAGE_SIZE && size) { | ||
481 | BUG_ON(!PageCompound(page)); | ||
482 | page++; | ||
483 | offset = 0; | ||
484 | } | ||
485 | |||
456 | /* Leave a gap for the GSO descriptor. */ | 486 | /* Leave a gap for the GSO descriptor. */ |
457 | if (*head && skb_shinfo(skb)->gso_size && !vif->gso_prefix) | 487 | if (*head && skb_shinfo(skb)->gso_size && !vif->gso_prefix) |
458 | vif->rx.req_cons++; | 488 | vif->rx.req_cons++; |