diff options
author | David S. Miller <davem@davemloft.net> | 2009-05-19 00:08:20 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2009-05-19 00:08:20 -0400 |
commit | bb803cfbecb03a0cf8dc7e1864f18dda6631af00 (patch) | |
tree | 6c0989693bea6f50cfa5c6bb14f52ec19668def3 /drivers/net | |
parent | 3878fb6fdbceecca20b15748f807340854220f06 (diff) | |
parent | 511e11e396dc596825ce04d53d7f6d579404bc01 (diff) |
Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6
Conflicts:
drivers/scsi/fcoe/fcoe.c
Diffstat (limited to 'drivers/net')
25 files changed, 190 insertions, 116 deletions
diff --git a/drivers/net/arm/ep93xx_eth.c b/drivers/net/arm/ep93xx_eth.c index 41736772c1dd..b72b3d639f6e 100644 --- a/drivers/net/arm/ep93xx_eth.c +++ b/drivers/net/arm/ep93xx_eth.c | |||
@@ -153,7 +153,7 @@ struct ep93xx_descs | |||
153 | struct ep93xx_priv | 153 | struct ep93xx_priv |
154 | { | 154 | { |
155 | struct resource *res; | 155 | struct resource *res; |
156 | void *base_addr; | 156 | void __iomem *base_addr; |
157 | int irq; | 157 | int irq; |
158 | 158 | ||
159 | struct ep93xx_descs *descs; | 159 | struct ep93xx_descs *descs; |
diff --git a/drivers/net/arm/ixp4xx_eth.c b/drivers/net/arm/ixp4xx_eth.c index 448487e22fa3..a740053d3af3 100644 --- a/drivers/net/arm/ixp4xx_eth.c +++ b/drivers/net/arm/ixp4xx_eth.c | |||
@@ -338,12 +338,12 @@ static int ixp4xx_mdio_register(void) | |||
338 | if (cpu_is_ixp43x()) { | 338 | if (cpu_is_ixp43x()) { |
339 | /* IXP43x lacks NPE-B and uses NPE-C for MII PHY access */ | 339 | /* IXP43x lacks NPE-B and uses NPE-C for MII PHY access */ |
340 | if (!(ixp4xx_read_feature_bits() & IXP4XX_FEATURE_NPEC_ETH)) | 340 | if (!(ixp4xx_read_feature_bits() & IXP4XX_FEATURE_NPEC_ETH)) |
341 | return -ENOSYS; | 341 | return -ENODEV; |
342 | mdio_regs = (struct eth_regs __iomem *)IXP4XX_EthC_BASE_VIRT; | 342 | mdio_regs = (struct eth_regs __iomem *)IXP4XX_EthC_BASE_VIRT; |
343 | } else { | 343 | } else { |
344 | /* All MII PHY accesses use NPE-B Ethernet registers */ | 344 | /* All MII PHY accesses use NPE-B Ethernet registers */ |
345 | if (!(ixp4xx_read_feature_bits() & IXP4XX_FEATURE_NPEB_ETH0)) | 345 | if (!(ixp4xx_read_feature_bits() & IXP4XX_FEATURE_NPEB_ETH0)) |
346 | return -ENOSYS; | 346 | return -ENODEV; |
347 | mdio_regs = (struct eth_regs __iomem *)IXP4XX_EthB_BASE_VIRT; | 347 | mdio_regs = (struct eth_regs __iomem *)IXP4XX_EthB_BASE_VIRT; |
348 | } | 348 | } |
349 | 349 | ||
@@ -1174,7 +1174,7 @@ static int __devinit eth_init_one(struct platform_device *pdev) | |||
1174 | regs_phys = IXP4XX_EthC_BASE_PHYS; | 1174 | regs_phys = IXP4XX_EthC_BASE_PHYS; |
1175 | break; | 1175 | break; |
1176 | default: | 1176 | default: |
1177 | err = -ENOSYS; | 1177 | err = -ENODEV; |
1178 | goto err_free; | 1178 | goto err_free; |
1179 | } | 1179 | } |
1180 | 1180 | ||
@@ -1189,15 +1189,10 @@ static int __devinit eth_init_one(struct platform_device *pdev) | |||
1189 | goto err_free; | 1189 | goto err_free; |
1190 | } | 1190 | } |
1191 | 1191 | ||
1192 | if (register_netdev(dev)) { | ||
1193 | err = -EIO; | ||
1194 | goto err_npe_rel; | ||
1195 | } | ||
1196 | |||
1197 | port->mem_res = request_mem_region(regs_phys, REGS_SIZE, dev->name); | 1192 | port->mem_res = request_mem_region(regs_phys, REGS_SIZE, dev->name); |
1198 | if (!port->mem_res) { | 1193 | if (!port->mem_res) { |
1199 | err = -EBUSY; | 1194 | err = -EBUSY; |
1200 | goto err_unreg; | 1195 | goto err_npe_rel; |
1201 | } | 1196 | } |
1202 | 1197 | ||
1203 | port->plat = plat; | 1198 | port->plat = plat; |
@@ -1215,20 +1210,25 @@ static int __devinit eth_init_one(struct platform_device *pdev) | |||
1215 | snprintf(phy_id, BUS_ID_SIZE, PHY_ID_FMT, "0", plat->phy); | 1210 | snprintf(phy_id, BUS_ID_SIZE, PHY_ID_FMT, "0", plat->phy); |
1216 | port->phydev = phy_connect(dev, phy_id, &ixp4xx_adjust_link, 0, | 1211 | port->phydev = phy_connect(dev, phy_id, &ixp4xx_adjust_link, 0, |
1217 | PHY_INTERFACE_MODE_MII); | 1212 | PHY_INTERFACE_MODE_MII); |
1218 | if (IS_ERR(port->phydev)) { | 1213 | if ((err = IS_ERR(port->phydev))) |
1219 | printk(KERN_ERR "%s: Could not attach to PHY\n", dev->name); | 1214 | goto err_free_mem; |
1220 | return PTR_ERR(port->phydev); | ||
1221 | } | ||
1222 | 1215 | ||
1223 | port->phydev->irq = PHY_POLL; | 1216 | port->phydev->irq = PHY_POLL; |
1224 | 1217 | ||
1218 | if ((err = register_netdev(dev))) | ||
1219 | goto err_phy_dis; | ||
1220 | |||
1225 | printk(KERN_INFO "%s: MII PHY %i on %s\n", dev->name, plat->phy, | 1221 | printk(KERN_INFO "%s: MII PHY %i on %s\n", dev->name, plat->phy, |
1226 | npe_name(port->npe)); | 1222 | npe_name(port->npe)); |
1227 | 1223 | ||
1228 | return 0; | 1224 | return 0; |
1229 | 1225 | ||
1230 | err_unreg: | 1226 | err_phy_dis: |
1231 | unregister_netdev(dev); | 1227 | phy_disconnect(port->phydev); |
1228 | err_free_mem: | ||
1229 | npe_port_tab[NPE_ID(port->id)] = NULL; | ||
1230 | platform_set_drvdata(pdev, NULL); | ||
1231 | release_resource(port->mem_res); | ||
1232 | err_npe_rel: | 1232 | err_npe_rel: |
1233 | npe_release(port->npe); | 1233 | npe_release(port->npe); |
1234 | err_free: | 1234 | err_free: |
@@ -1242,6 +1242,7 @@ static int __devexit eth_remove_one(struct platform_device *pdev) | |||
1242 | struct port *port = netdev_priv(dev); | 1242 | struct port *port = netdev_priv(dev); |
1243 | 1243 | ||
1244 | unregister_netdev(dev); | 1244 | unregister_netdev(dev); |
1245 | phy_disconnect(port->phydev); | ||
1245 | npe_port_tab[NPE_ID(port->id)] = NULL; | 1246 | npe_port_tab[NPE_ID(port->id)] = NULL; |
1246 | platform_set_drvdata(pdev, NULL); | 1247 | platform_set_drvdata(pdev, NULL); |
1247 | npe_release(port->npe); | 1248 | npe_release(port->npe); |
diff --git a/drivers/net/atl1c/atl1c_main.c b/drivers/net/atl1c/atl1c_main.c index 8b17278c4a58..fc1092b835d2 100644 --- a/drivers/net/atl1c/atl1c_main.c +++ b/drivers/net/atl1c/atl1c_main.c | |||
@@ -2522,8 +2522,8 @@ static int __devinit atl1c_probe(struct pci_dev *pdev, | |||
2522 | * various kernel subsystems to support the mechanics required by a | 2522 | * various kernel subsystems to support the mechanics required by a |
2523 | * fixed-high-32-bit system. | 2523 | * fixed-high-32-bit system. |
2524 | */ | 2524 | */ |
2525 | if ((pci_set_dma_mask(pdev, DMA_32BIT_MASK) != 0) || | 2525 | if ((pci_set_dma_mask(pdev, DMA_BIT_MASK(32)) != 0) || |
2526 | (pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK) != 0)) { | 2526 | (pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(32)) != 0)) { |
2527 | dev_err(&pdev->dev, "No usable DMA configuration,aborting\n"); | 2527 | dev_err(&pdev->dev, "No usable DMA configuration,aborting\n"); |
2528 | goto err_dma; | 2528 | goto err_dma; |
2529 | } | 2529 | } |
diff --git a/drivers/net/benet/be.h b/drivers/net/benet/be.h index c49ddd08b2aa..b4bb06fdf307 100644 --- a/drivers/net/benet/be.h +++ b/drivers/net/benet/be.h | |||
@@ -35,8 +35,22 @@ | |||
35 | #define DRV_VER "2.0.348" | 35 | #define DRV_VER "2.0.348" |
36 | #define DRV_NAME "be2net" | 36 | #define DRV_NAME "be2net" |
37 | #define BE_NAME "ServerEngines BladeEngine2 10Gbps NIC" | 37 | #define BE_NAME "ServerEngines BladeEngine2 10Gbps NIC" |
38 | #define OC_NAME "Emulex OneConnect 10Gbps NIC" | ||
38 | #define DRV_DESC BE_NAME "Driver" | 39 | #define DRV_DESC BE_NAME "Driver" |
39 | 40 | ||
41 | #define BE_VENDOR_ID 0x19a2 | ||
42 | #define BE_DEVICE_ID1 0x211 | ||
43 | #define OC_DEVICE_ID1 0x700 | ||
44 | #define OC_DEVICE_ID2 0x701 | ||
45 | |||
46 | static inline char *nic_name(struct pci_dev *pdev) | ||
47 | { | ||
48 | if (pdev->device == OC_DEVICE_ID1 || pdev->device == OC_DEVICE_ID2) | ||
49 | return OC_NAME; | ||
50 | else | ||
51 | return BE_NAME; | ||
52 | } | ||
53 | |||
40 | /* Number of bytes of an RX frame that are copied to skb->data */ | 54 | /* Number of bytes of an RX frame that are copied to skb->data */ |
41 | #define BE_HDR_LEN 64 | 55 | #define BE_HDR_LEN 64 |
42 | #define BE_MAX_JUMBO_FRAME_SIZE 9018 | 56 | #define BE_MAX_JUMBO_FRAME_SIZE 9018 |
diff --git a/drivers/net/benet/be_main.c b/drivers/net/benet/be_main.c index 8994b03d80ac..ae2f6b58ba25 100644 --- a/drivers/net/benet/be_main.c +++ b/drivers/net/benet/be_main.c | |||
@@ -28,10 +28,10 @@ static unsigned int rx_frag_size = 2048; | |||
28 | module_param(rx_frag_size, uint, S_IRUGO); | 28 | module_param(rx_frag_size, uint, S_IRUGO); |
29 | MODULE_PARM_DESC(rx_frag_size, "Size of a fragment that holds rcvd data."); | 29 | MODULE_PARM_DESC(rx_frag_size, "Size of a fragment that holds rcvd data."); |
30 | 30 | ||
31 | #define BE_VENDOR_ID 0x19a2 | ||
32 | #define BE2_DEVICE_ID_1 0x0211 | ||
33 | static DEFINE_PCI_DEVICE_TABLE(be_dev_ids) = { | 31 | static DEFINE_PCI_DEVICE_TABLE(be_dev_ids) = { |
34 | { PCI_DEVICE(BE_VENDOR_ID, BE2_DEVICE_ID_1) }, | 32 | { PCI_DEVICE(BE_VENDOR_ID, BE_DEVICE_ID1) }, |
33 | { PCI_DEVICE(BE_VENDOR_ID, OC_DEVICE_ID1) }, | ||
34 | { PCI_DEVICE(BE_VENDOR_ID, OC_DEVICE_ID2) }, | ||
35 | { 0 } | 35 | { 0 } |
36 | }; | 36 | }; |
37 | MODULE_DEVICE_TABLE(pci, be_dev_ids); | 37 | MODULE_DEVICE_TABLE(pci, be_dev_ids); |
@@ -1837,11 +1837,11 @@ static int __devinit be_probe(struct pci_dev *pdev, | |||
1837 | 1837 | ||
1838 | be_msix_enable(adapter); | 1838 | be_msix_enable(adapter); |
1839 | 1839 | ||
1840 | status = pci_set_dma_mask(pdev, DMA_64BIT_MASK); | 1840 | status = pci_set_dma_mask(pdev, DMA_BIT_MASK(64)); |
1841 | if (!status) { | 1841 | if (!status) { |
1842 | netdev->features |= NETIF_F_HIGHDMA; | 1842 | netdev->features |= NETIF_F_HIGHDMA; |
1843 | } else { | 1843 | } else { |
1844 | status = pci_set_dma_mask(pdev, DMA_32BIT_MASK); | 1844 | status = pci_set_dma_mask(pdev, DMA_BIT_MASK(32)); |
1845 | if (status) { | 1845 | if (status) { |
1846 | dev_err(&pdev->dev, "Could not set PCI DMA Mask\n"); | 1846 | dev_err(&pdev->dev, "Could not set PCI DMA Mask\n"); |
1847 | goto free_netdev; | 1847 | goto free_netdev; |
@@ -1875,7 +1875,7 @@ static int __devinit be_probe(struct pci_dev *pdev, | |||
1875 | if (status != 0) | 1875 | if (status != 0) |
1876 | goto stats_clean; | 1876 | goto stats_clean; |
1877 | 1877 | ||
1878 | dev_info(&pdev->dev, BE_NAME " port %d\n", adapter->port_num); | 1878 | dev_info(&pdev->dev, "%s port %d\n", nic_name(pdev), adapter->port_num); |
1879 | return 0; | 1879 | return 0; |
1880 | 1880 | ||
1881 | stats_clean: | 1881 | stats_clean: |
@@ -1889,7 +1889,7 @@ rel_reg: | |||
1889 | disable_dev: | 1889 | disable_dev: |
1890 | pci_disable_device(pdev); | 1890 | pci_disable_device(pdev); |
1891 | do_none: | 1891 | do_none: |
1892 | dev_warn(&pdev->dev, BE_NAME " initialization failed\n"); | 1892 | dev_err(&pdev->dev, "%s initialization failed\n", nic_name(pdev)); |
1893 | return status; | 1893 | return status; |
1894 | } | 1894 | } |
1895 | 1895 | ||
diff --git a/drivers/net/bonding/bond_3ad.c b/drivers/net/bonding/bond_3ad.c index 06009dc50b19..d4b570886c6e 100644 --- a/drivers/net/bonding/bond_3ad.c +++ b/drivers/net/bonding/bond_3ad.c | |||
@@ -1465,6 +1465,12 @@ static struct aggregator *ad_agg_selection_test(struct aggregator *best, | |||
1465 | return best; | 1465 | return best; |
1466 | } | 1466 | } |
1467 | 1467 | ||
1468 | static int agg_device_up(const struct aggregator *agg) | ||
1469 | { | ||
1470 | return (netif_running(agg->slave->dev) && | ||
1471 | netif_carrier_ok(agg->slave->dev)); | ||
1472 | } | ||
1473 | |||
1468 | /** | 1474 | /** |
1469 | * ad_agg_selection_logic - select an aggregation group for a team | 1475 | * ad_agg_selection_logic - select an aggregation group for a team |
1470 | * @aggregator: the aggregator we're looking at | 1476 | * @aggregator: the aggregator we're looking at |
@@ -1496,14 +1502,13 @@ static void ad_agg_selection_logic(struct aggregator *agg) | |||
1496 | struct port *port; | 1502 | struct port *port; |
1497 | 1503 | ||
1498 | origin = agg; | 1504 | origin = agg; |
1499 | |||
1500 | active = __get_active_agg(agg); | 1505 | active = __get_active_agg(agg); |
1501 | best = active; | 1506 | best = (active && agg_device_up(active)) ? active : NULL; |
1502 | 1507 | ||
1503 | do { | 1508 | do { |
1504 | agg->is_active = 0; | 1509 | agg->is_active = 0; |
1505 | 1510 | ||
1506 | if (agg->num_of_ports) | 1511 | if (agg->num_of_ports && agg_device_up(agg)) |
1507 | best = ad_agg_selection_test(best, agg); | 1512 | best = ad_agg_selection_test(best, agg); |
1508 | 1513 | ||
1509 | } while ((agg = __get_next_agg(agg))); | 1514 | } while ((agg = __get_next_agg(agg))); |
diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c index 30b9ea6d62b0..96d7689995cd 100644 --- a/drivers/net/bonding/bond_main.c +++ b/drivers/net/bonding/bond_main.c | |||
@@ -5199,7 +5199,6 @@ static int __init bonding_init(void) | |||
5199 | { | 5199 | { |
5200 | int i; | 5200 | int i; |
5201 | int res; | 5201 | int res; |
5202 | struct bonding *bond; | ||
5203 | 5202 | ||
5204 | printk(KERN_INFO "%s", version); | 5203 | printk(KERN_INFO "%s", version); |
5205 | 5204 | ||
@@ -5228,13 +5227,6 @@ static int __init bonding_init(void) | |||
5228 | 5227 | ||
5229 | goto out; | 5228 | goto out; |
5230 | err: | 5229 | err: |
5231 | list_for_each_entry(bond, &bond_dev_list, bond_list) { | ||
5232 | bond_work_cancel_all(bond); | ||
5233 | destroy_workqueue(bond->wq); | ||
5234 | } | ||
5235 | |||
5236 | bond_destroy_sysfs(); | ||
5237 | |||
5238 | rtnl_lock(); | 5230 | rtnl_lock(); |
5239 | bond_free_all(); | 5231 | bond_free_all(); |
5240 | rtnl_unlock(); | 5232 | rtnl_unlock(); |
diff --git a/drivers/net/jme.c b/drivers/net/jme.c index ece35040288c..621a7c0c46ba 100644 --- a/drivers/net/jme.c +++ b/drivers/net/jme.c | |||
@@ -2591,13 +2591,13 @@ static int | |||
2591 | jme_pci_dma64(struct pci_dev *pdev) | 2591 | jme_pci_dma64(struct pci_dev *pdev) |
2592 | { | 2592 | { |
2593 | if (pdev->device == PCI_DEVICE_ID_JMICRON_JMC250 && | 2593 | if (pdev->device == PCI_DEVICE_ID_JMICRON_JMC250 && |
2594 | !pci_set_dma_mask(pdev, DMA_64BIT_MASK)) | 2594 | !pci_set_dma_mask(pdev, DMA_BIT_MASK(64))) |
2595 | if (!pci_set_consistent_dma_mask(pdev, DMA_64BIT_MASK)) | 2595 | if (!pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(64))) |
2596 | return 1; | 2596 | return 1; |
2597 | 2597 | ||
2598 | if (pdev->device == PCI_DEVICE_ID_JMICRON_JMC250 && | 2598 | if (pdev->device == PCI_DEVICE_ID_JMICRON_JMC250 && |
2599 | !pci_set_dma_mask(pdev, DMA_40BIT_MASK)) | 2599 | !pci_set_dma_mask(pdev, DMA_BIT_MASK(40))) |
2600 | if (!pci_set_consistent_dma_mask(pdev, DMA_40BIT_MASK)) | 2600 | if (!pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(40))) |
2601 | return 1; | 2601 | return 1; |
2602 | 2602 | ||
2603 | if (!pci_set_dma_mask(pdev, DMA_BIT_MASK(32))) | 2603 | if (!pci_set_dma_mask(pdev, DMA_BIT_MASK(32))) |
diff --git a/drivers/net/meth.c b/drivers/net/meth.c index 46ffdb464ac4..5d04d94f2a21 100644 --- a/drivers/net/meth.c +++ b/drivers/net/meth.c | |||
@@ -127,11 +127,11 @@ static unsigned long mdio_read(struct meth_private *priv, unsigned long phyreg) | |||
127 | static int mdio_probe(struct meth_private *priv) | 127 | static int mdio_probe(struct meth_private *priv) |
128 | { | 128 | { |
129 | int i; | 129 | int i; |
130 | unsigned long p2, p3; | 130 | unsigned long p2, p3, flags; |
131 | /* check if phy is detected already */ | 131 | /* check if phy is detected already */ |
132 | if(priv->phy_addr>=0&&priv->phy_addr<32) | 132 | if(priv->phy_addr>=0&&priv->phy_addr<32) |
133 | return 0; | 133 | return 0; |
134 | spin_lock(&priv->meth_lock); | 134 | spin_lock_irqsave(&priv->meth_lock, flags); |
135 | for (i=0;i<32;++i){ | 135 | for (i=0;i<32;++i){ |
136 | priv->phy_addr=i; | 136 | priv->phy_addr=i; |
137 | p2=mdio_read(priv,2); | 137 | p2=mdio_read(priv,2); |
@@ -157,7 +157,7 @@ static int mdio_probe(struct meth_private *priv) | |||
157 | break; | 157 | break; |
158 | } | 158 | } |
159 | } | 159 | } |
160 | spin_unlock(&priv->meth_lock); | 160 | spin_unlock_irqrestore(&priv->meth_lock, flags); |
161 | if(priv->phy_addr<32) { | 161 | if(priv->phy_addr<32) { |
162 | return 0; | 162 | return 0; |
163 | } | 163 | } |
@@ -373,14 +373,14 @@ static int meth_release(struct net_device *dev) | |||
373 | static void meth_rx(struct net_device* dev, unsigned long int_status) | 373 | static void meth_rx(struct net_device* dev, unsigned long int_status) |
374 | { | 374 | { |
375 | struct sk_buff *skb; | 375 | struct sk_buff *skb; |
376 | unsigned long status; | 376 | unsigned long status, flags; |
377 | struct meth_private *priv = netdev_priv(dev); | 377 | struct meth_private *priv = netdev_priv(dev); |
378 | unsigned long fifo_rptr = (int_status & METH_INT_RX_RPTR_MASK) >> 8; | 378 | unsigned long fifo_rptr = (int_status & METH_INT_RX_RPTR_MASK) >> 8; |
379 | 379 | ||
380 | spin_lock(&priv->meth_lock); | 380 | spin_lock_irqsave(&priv->meth_lock, flags); |
381 | priv->dma_ctrl &= ~METH_DMA_RX_INT_EN; | 381 | priv->dma_ctrl &= ~METH_DMA_RX_INT_EN; |
382 | mace->eth.dma_ctrl = priv->dma_ctrl; | 382 | mace->eth.dma_ctrl = priv->dma_ctrl; |
383 | spin_unlock(&priv->meth_lock); | 383 | spin_unlock_irqrestore(&priv->meth_lock, flags); |
384 | 384 | ||
385 | if (int_status & METH_INT_RX_UNDERFLOW) { | 385 | if (int_status & METH_INT_RX_UNDERFLOW) { |
386 | fifo_rptr = (fifo_rptr - 1) & 0x0f; | 386 | fifo_rptr = (fifo_rptr - 1) & 0x0f; |
@@ -452,12 +452,12 @@ static void meth_rx(struct net_device* dev, unsigned long int_status) | |||
452 | mace->eth.rx_fifo = priv->rx_ring_dmas[priv->rx_write]; | 452 | mace->eth.rx_fifo = priv->rx_ring_dmas[priv->rx_write]; |
453 | ADVANCE_RX_PTR(priv->rx_write); | 453 | ADVANCE_RX_PTR(priv->rx_write); |
454 | } | 454 | } |
455 | spin_lock(&priv->meth_lock); | 455 | spin_lock_irqsave(&priv->meth_lock, flags); |
456 | /* In case there was underflow, and Rx DMA was disabled */ | 456 | /* In case there was underflow, and Rx DMA was disabled */ |
457 | priv->dma_ctrl |= METH_DMA_RX_INT_EN | METH_DMA_RX_EN; | 457 | priv->dma_ctrl |= METH_DMA_RX_INT_EN | METH_DMA_RX_EN; |
458 | mace->eth.dma_ctrl = priv->dma_ctrl; | 458 | mace->eth.dma_ctrl = priv->dma_ctrl; |
459 | mace->eth.int_stat = METH_INT_RX_THRESHOLD; | 459 | mace->eth.int_stat = METH_INT_RX_THRESHOLD; |
460 | spin_unlock(&priv->meth_lock); | 460 | spin_unlock_irqrestore(&priv->meth_lock, flags); |
461 | } | 461 | } |
462 | 462 | ||
463 | static int meth_tx_full(struct net_device *dev) | 463 | static int meth_tx_full(struct net_device *dev) |
@@ -470,11 +470,11 @@ static int meth_tx_full(struct net_device *dev) | |||
470 | static void meth_tx_cleanup(struct net_device* dev, unsigned long int_status) | 470 | static void meth_tx_cleanup(struct net_device* dev, unsigned long int_status) |
471 | { | 471 | { |
472 | struct meth_private *priv = netdev_priv(dev); | 472 | struct meth_private *priv = netdev_priv(dev); |
473 | unsigned long status; | 473 | unsigned long status, flags; |
474 | struct sk_buff *skb; | 474 | struct sk_buff *skb; |
475 | unsigned long rptr = (int_status&TX_INFO_RPTR) >> 16; | 475 | unsigned long rptr = (int_status&TX_INFO_RPTR) >> 16; |
476 | 476 | ||
477 | spin_lock(&priv->meth_lock); | 477 | spin_lock_irqsave(&priv->meth_lock, flags); |
478 | 478 | ||
479 | /* Stop DMA notification */ | 479 | /* Stop DMA notification */ |
480 | priv->dma_ctrl &= ~(METH_DMA_TX_INT_EN); | 480 | priv->dma_ctrl &= ~(METH_DMA_TX_INT_EN); |
@@ -527,12 +527,13 @@ static void meth_tx_cleanup(struct net_device* dev, unsigned long int_status) | |||
527 | } | 527 | } |
528 | 528 | ||
529 | mace->eth.int_stat = METH_INT_TX_EMPTY | METH_INT_TX_PKT; | 529 | mace->eth.int_stat = METH_INT_TX_EMPTY | METH_INT_TX_PKT; |
530 | spin_unlock(&priv->meth_lock); | 530 | spin_unlock_irqrestore(&priv->meth_lock, flags); |
531 | } | 531 | } |
532 | 532 | ||
533 | static void meth_error(struct net_device* dev, unsigned status) | 533 | static void meth_error(struct net_device* dev, unsigned status) |
534 | { | 534 | { |
535 | struct meth_private *priv = netdev_priv(dev); | 535 | struct meth_private *priv = netdev_priv(dev); |
536 | unsigned long flags; | ||
536 | 537 | ||
537 | printk(KERN_WARNING "meth: error status: 0x%08x\n",status); | 538 | printk(KERN_WARNING "meth: error status: 0x%08x\n",status); |
538 | /* check for errors too... */ | 539 | /* check for errors too... */ |
@@ -547,7 +548,7 @@ static void meth_error(struct net_device* dev, unsigned status) | |||
547 | printk(KERN_WARNING "meth: Rx overflow\n"); | 548 | printk(KERN_WARNING "meth: Rx overflow\n"); |
548 | if (status & (METH_INT_RX_UNDERFLOW)) { | 549 | if (status & (METH_INT_RX_UNDERFLOW)) { |
549 | printk(KERN_WARNING "meth: Rx underflow\n"); | 550 | printk(KERN_WARNING "meth: Rx underflow\n"); |
550 | spin_lock(&priv->meth_lock); | 551 | spin_lock_irqsave(&priv->meth_lock, flags); |
551 | mace->eth.int_stat = METH_INT_RX_UNDERFLOW; | 552 | mace->eth.int_stat = METH_INT_RX_UNDERFLOW; |
552 | /* more underflow interrupts will be delivered, | 553 | /* more underflow interrupts will be delivered, |
553 | * effectively throwing us into an infinite loop. | 554 | * effectively throwing us into an infinite loop. |
@@ -555,7 +556,7 @@ static void meth_error(struct net_device* dev, unsigned status) | |||
555 | priv->dma_ctrl &= ~METH_DMA_RX_EN; | 556 | priv->dma_ctrl &= ~METH_DMA_RX_EN; |
556 | mace->eth.dma_ctrl = priv->dma_ctrl; | 557 | mace->eth.dma_ctrl = priv->dma_ctrl; |
557 | DPRINTK("Disabled meth Rx DMA temporarily\n"); | 558 | DPRINTK("Disabled meth Rx DMA temporarily\n"); |
558 | spin_unlock(&priv->meth_lock); | 559 | spin_unlock_irqrestore(&priv->meth_lock, flags); |
559 | } | 560 | } |
560 | mace->eth.int_stat = METH_INT_ERROR; | 561 | mace->eth.int_stat = METH_INT_ERROR; |
561 | } | 562 | } |
diff --git a/drivers/net/mlx4/en_cq.c b/drivers/net/mlx4/en_cq.c index 91f50de84be9..a276125b709b 100644 --- a/drivers/net/mlx4/en_cq.c +++ b/drivers/net/mlx4/en_cq.c | |||
@@ -125,8 +125,10 @@ void mlx4_en_deactivate_cq(struct mlx4_en_priv *priv, struct mlx4_en_cq *cq) | |||
125 | 125 | ||
126 | if (cq->is_tx) | 126 | if (cq->is_tx) |
127 | del_timer(&cq->timer); | 127 | del_timer(&cq->timer); |
128 | else | 128 | else { |
129 | napi_disable(&cq->napi); | 129 | napi_disable(&cq->napi); |
130 | netif_napi_del(&cq->napi); | ||
131 | } | ||
130 | 132 | ||
131 | mlx4_cq_free(mdev->dev, &cq->mcq); | 133 | mlx4_cq_free(mdev->dev, &cq->mcq); |
132 | } | 134 | } |
diff --git a/drivers/net/mlx4/en_rx.c b/drivers/net/mlx4/en_rx.c index 7942c4d3cd88..9ee873e872b3 100644 --- a/drivers/net/mlx4/en_rx.c +++ b/drivers/net/mlx4/en_rx.c | |||
@@ -951,7 +951,6 @@ static int mlx4_en_config_rss_qp(struct mlx4_en_priv *priv, | |||
951 | if (err) { | 951 | if (err) { |
952 | mlx4_err(mdev, "Failed to allocate qp #%d\n", qpn); | 952 | mlx4_err(mdev, "Failed to allocate qp #%d\n", qpn); |
953 | goto out; | 953 | goto out; |
954 | return err; | ||
955 | } | 954 | } |
956 | qp->event = mlx4_en_sqp_event; | 955 | qp->event = mlx4_en_sqp_event; |
957 | 956 | ||
diff --git a/drivers/net/mlx4/main.c b/drivers/net/mlx4/main.c index 102bac90a302..30bea9689694 100644 --- a/drivers/net/mlx4/main.c +++ b/drivers/net/mlx4/main.c | |||
@@ -976,7 +976,7 @@ static void mlx4_enable_msi_x(struct mlx4_dev *dev) | |||
976 | nreq = err; | 976 | nreq = err; |
977 | goto retry; | 977 | goto retry; |
978 | } | 978 | } |
979 | 979 | kfree(entries); | |
980 | goto no_msi; | 980 | goto no_msi; |
981 | } | 981 | } |
982 | 982 | ||
diff --git a/drivers/net/mv643xx_eth.c b/drivers/net/mv643xx_eth.c index d5838528791f..1361ddc8d31f 100644 --- a/drivers/net/mv643xx_eth.c +++ b/drivers/net/mv643xx_eth.c | |||
@@ -571,7 +571,7 @@ static int rxq_process(struct rx_queue *rxq, int budget) | |||
571 | if (rxq->rx_curr_desc == rxq->rx_ring_size) | 571 | if (rxq->rx_curr_desc == rxq->rx_ring_size) |
572 | rxq->rx_curr_desc = 0; | 572 | rxq->rx_curr_desc = 0; |
573 | 573 | ||
574 | dma_unmap_single(NULL, rx_desc->buf_ptr, | 574 | dma_unmap_single(mp->dev->dev.parent, rx_desc->buf_ptr, |
575 | rx_desc->buf_size, DMA_FROM_DEVICE); | 575 | rx_desc->buf_size, DMA_FROM_DEVICE); |
576 | rxq->rx_desc_count--; | 576 | rxq->rx_desc_count--; |
577 | rx++; | 577 | rx++; |
@@ -677,8 +677,9 @@ static int rxq_refill(struct rx_queue *rxq, int budget) | |||
677 | 677 | ||
678 | rx_desc = rxq->rx_desc_area + rx; | 678 | rx_desc = rxq->rx_desc_area + rx; |
679 | 679 | ||
680 | rx_desc->buf_ptr = dma_map_single(NULL, skb->data, | 680 | rx_desc->buf_ptr = dma_map_single(mp->dev->dev.parent, |
681 | mp->skb_size, DMA_FROM_DEVICE); | 681 | skb->data, mp->skb_size, |
682 | DMA_FROM_DEVICE); | ||
682 | rx_desc->buf_size = mp->skb_size; | 683 | rx_desc->buf_size = mp->skb_size; |
683 | rxq->rx_skb[rx] = skb; | 684 | rxq->rx_skb[rx] = skb; |
684 | wmb(); | 685 | wmb(); |
@@ -717,6 +718,7 @@ static inline unsigned int has_tiny_unaligned_frags(struct sk_buff *skb) | |||
717 | 718 | ||
718 | static void txq_submit_frag_skb(struct tx_queue *txq, struct sk_buff *skb) | 719 | static void txq_submit_frag_skb(struct tx_queue *txq, struct sk_buff *skb) |
719 | { | 720 | { |
721 | struct mv643xx_eth_private *mp = txq_to_mp(txq); | ||
720 | int nr_frags = skb_shinfo(skb)->nr_frags; | 722 | int nr_frags = skb_shinfo(skb)->nr_frags; |
721 | int frag; | 723 | int frag; |
722 | 724 | ||
@@ -745,10 +747,10 @@ static void txq_submit_frag_skb(struct tx_queue *txq, struct sk_buff *skb) | |||
745 | 747 | ||
746 | desc->l4i_chk = 0; | 748 | desc->l4i_chk = 0; |
747 | desc->byte_cnt = this_frag->size; | 749 | desc->byte_cnt = this_frag->size; |
748 | desc->buf_ptr = dma_map_page(NULL, this_frag->page, | 750 | desc->buf_ptr = dma_map_page(mp->dev->dev.parent, |
749 | this_frag->page_offset, | 751 | this_frag->page, |
750 | this_frag->size, | 752 | this_frag->page_offset, |
751 | DMA_TO_DEVICE); | 753 | this_frag->size, DMA_TO_DEVICE); |
752 | } | 754 | } |
753 | } | 755 | } |
754 | 756 | ||
@@ -825,7 +827,8 @@ no_csum: | |||
825 | 827 | ||
826 | desc->l4i_chk = l4i_chk; | 828 | desc->l4i_chk = l4i_chk; |
827 | desc->byte_cnt = length; | 829 | desc->byte_cnt = length; |
828 | desc->buf_ptr = dma_map_single(NULL, skb->data, length, DMA_TO_DEVICE); | 830 | desc->buf_ptr = dma_map_single(mp->dev->dev.parent, skb->data, |
831 | length, DMA_TO_DEVICE); | ||
829 | 832 | ||
830 | __skb_queue_tail(&txq->tx_skb, skb); | 833 | __skb_queue_tail(&txq->tx_skb, skb); |
831 | 834 | ||
@@ -955,10 +958,10 @@ static int txq_reclaim(struct tx_queue *txq, int budget, int force) | |||
955 | } | 958 | } |
956 | 959 | ||
957 | if (cmd_sts & TX_FIRST_DESC) { | 960 | if (cmd_sts & TX_FIRST_DESC) { |
958 | dma_unmap_single(NULL, desc->buf_ptr, | 961 | dma_unmap_single(mp->dev->dev.parent, desc->buf_ptr, |
959 | desc->byte_cnt, DMA_TO_DEVICE); | 962 | desc->byte_cnt, DMA_TO_DEVICE); |
960 | } else { | 963 | } else { |
961 | dma_unmap_page(NULL, desc->buf_ptr, | 964 | dma_unmap_page(mp->dev->dev.parent, desc->buf_ptr, |
962 | desc->byte_cnt, DMA_TO_DEVICE); | 965 | desc->byte_cnt, DMA_TO_DEVICE); |
963 | } | 966 | } |
964 | 967 | ||
@@ -1891,9 +1894,9 @@ static int rxq_init(struct mv643xx_eth_private *mp, int index) | |||
1891 | mp->rx_desc_sram_size); | 1894 | mp->rx_desc_sram_size); |
1892 | rxq->rx_desc_dma = mp->rx_desc_sram_addr; | 1895 | rxq->rx_desc_dma = mp->rx_desc_sram_addr; |
1893 | } else { | 1896 | } else { |
1894 | rxq->rx_desc_area = dma_alloc_coherent(NULL, size, | 1897 | rxq->rx_desc_area = dma_alloc_coherent(mp->dev->dev.parent, |
1895 | &rxq->rx_desc_dma, | 1898 | size, &rxq->rx_desc_dma, |
1896 | GFP_KERNEL); | 1899 | GFP_KERNEL); |
1897 | } | 1900 | } |
1898 | 1901 | ||
1899 | if (rxq->rx_desc_area == NULL) { | 1902 | if (rxq->rx_desc_area == NULL) { |
@@ -1944,7 +1947,7 @@ out_free: | |||
1944 | if (index == 0 && size <= mp->rx_desc_sram_size) | 1947 | if (index == 0 && size <= mp->rx_desc_sram_size) |
1945 | iounmap(rxq->rx_desc_area); | 1948 | iounmap(rxq->rx_desc_area); |
1946 | else | 1949 | else |
1947 | dma_free_coherent(NULL, size, | 1950 | dma_free_coherent(mp->dev->dev.parent, size, |
1948 | rxq->rx_desc_area, | 1951 | rxq->rx_desc_area, |
1949 | rxq->rx_desc_dma); | 1952 | rxq->rx_desc_dma); |
1950 | 1953 | ||
@@ -1976,7 +1979,7 @@ static void rxq_deinit(struct rx_queue *rxq) | |||
1976 | rxq->rx_desc_area_size <= mp->rx_desc_sram_size) | 1979 | rxq->rx_desc_area_size <= mp->rx_desc_sram_size) |
1977 | iounmap(rxq->rx_desc_area); | 1980 | iounmap(rxq->rx_desc_area); |
1978 | else | 1981 | else |
1979 | dma_free_coherent(NULL, rxq->rx_desc_area_size, | 1982 | dma_free_coherent(mp->dev->dev.parent, rxq->rx_desc_area_size, |
1980 | rxq->rx_desc_area, rxq->rx_desc_dma); | 1983 | rxq->rx_desc_area, rxq->rx_desc_dma); |
1981 | 1984 | ||
1982 | kfree(rxq->rx_skb); | 1985 | kfree(rxq->rx_skb); |
@@ -2004,9 +2007,9 @@ static int txq_init(struct mv643xx_eth_private *mp, int index) | |||
2004 | mp->tx_desc_sram_size); | 2007 | mp->tx_desc_sram_size); |
2005 | txq->tx_desc_dma = mp->tx_desc_sram_addr; | 2008 | txq->tx_desc_dma = mp->tx_desc_sram_addr; |
2006 | } else { | 2009 | } else { |
2007 | txq->tx_desc_area = dma_alloc_coherent(NULL, size, | 2010 | txq->tx_desc_area = dma_alloc_coherent(mp->dev->dev.parent, |
2008 | &txq->tx_desc_dma, | 2011 | size, &txq->tx_desc_dma, |
2009 | GFP_KERNEL); | 2012 | GFP_KERNEL); |
2010 | } | 2013 | } |
2011 | 2014 | ||
2012 | if (txq->tx_desc_area == NULL) { | 2015 | if (txq->tx_desc_area == NULL) { |
@@ -2050,7 +2053,7 @@ static void txq_deinit(struct tx_queue *txq) | |||
2050 | txq->tx_desc_area_size <= mp->tx_desc_sram_size) | 2053 | txq->tx_desc_area_size <= mp->tx_desc_sram_size) |
2051 | iounmap(txq->tx_desc_area); | 2054 | iounmap(txq->tx_desc_area); |
2052 | else | 2055 | else |
2053 | dma_free_coherent(NULL, txq->tx_desc_area_size, | 2056 | dma_free_coherent(mp->dev->dev.parent, txq->tx_desc_area_size, |
2054 | txq->tx_desc_area, txq->tx_desc_dma); | 2057 | txq->tx_desc_area, txq->tx_desc_dma); |
2055 | } | 2058 | } |
2056 | 2059 | ||
diff --git a/drivers/net/vxge/vxge-traffic.c b/drivers/net/vxge/vxge-traffic.c index 506625b180ac..370f55cbbad7 100644 --- a/drivers/net/vxge/vxge-traffic.c +++ b/drivers/net/vxge/vxge-traffic.c | |||
@@ -115,7 +115,7 @@ enum vxge_hw_status vxge_hw_vpath_intr_enable(struct __vxge_hw_vpath_handle *vp) | |||
115 | VXGE_HW_KDFCCTL_ERRORS_REG_KDFCCTL_FIFO1_POISON| | 115 | VXGE_HW_KDFCCTL_ERRORS_REG_KDFCCTL_FIFO1_POISON| |
116 | VXGE_HW_KDFCCTL_ERRORS_REG_KDFCCTL_FIFO2_POISON| | 116 | VXGE_HW_KDFCCTL_ERRORS_REG_KDFCCTL_FIFO2_POISON| |
117 | VXGE_HW_KDFCCTL_ERRORS_REG_KDFCCTL_FIFO1_DMA_ERR| | 117 | VXGE_HW_KDFCCTL_ERRORS_REG_KDFCCTL_FIFO1_DMA_ERR| |
118 | VXGE_HW_KDFCCTL_ERRORS_REG_KDFCCTL_FIFO1_DMA_ERR), 0, 32), | 118 | VXGE_HW_KDFCCTL_ERRORS_REG_KDFCCTL_FIFO2_DMA_ERR), 0, 32), |
119 | &vp_reg->kdfcctl_errors_mask); | 119 | &vp_reg->kdfcctl_errors_mask); |
120 | 120 | ||
121 | __vxge_hw_pio_mem_write32_upper(0, &vp_reg->vpath_ppif_int_mask); | 121 | __vxge_hw_pio_mem_write32_upper(0, &vp_reg->vpath_ppif_int_mask); |
diff --git a/drivers/net/wan/ixp4xx_hss.c b/drivers/net/wan/ixp4xx_hss.c index 3bf7d3f447db..765a7f5d6aa4 100644 --- a/drivers/net/wan/ixp4xx_hss.c +++ b/drivers/net/wan/ixp4xx_hss.c | |||
@@ -1249,7 +1249,7 @@ static int __devinit hss_init_one(struct platform_device *pdev) | |||
1249 | return -ENOMEM; | 1249 | return -ENOMEM; |
1250 | 1250 | ||
1251 | if ((port->npe = npe_request(0)) == NULL) { | 1251 | if ((port->npe = npe_request(0)) == NULL) { |
1252 | err = -ENOSYS; | 1252 | err = -ENODEV; |
1253 | goto err_free; | 1253 | goto err_free; |
1254 | } | 1254 | } |
1255 | 1255 | ||
@@ -1311,7 +1311,7 @@ static int __init hss_init_module(void) | |||
1311 | if ((ixp4xx_read_feature_bits() & | 1311 | if ((ixp4xx_read_feature_bits() & |
1312 | (IXP4XX_FEATURE_HDLC | IXP4XX_FEATURE_HSS)) != | 1312 | (IXP4XX_FEATURE_HDLC | IXP4XX_FEATURE_HSS)) != |
1313 | (IXP4XX_FEATURE_HDLC | IXP4XX_FEATURE_HSS)) | 1313 | (IXP4XX_FEATURE_HDLC | IXP4XX_FEATURE_HSS)) |
1314 | return -ENOSYS; | 1314 | return -ENODEV; |
1315 | 1315 | ||
1316 | spin_lock_init(&npe_lock); | 1316 | spin_lock_init(&npe_lock); |
1317 | 1317 | ||
diff --git a/drivers/net/wimax/i2400m/rx.c b/drivers/net/wimax/i2400m/rx.c index 02419bfd64b5..f9fc38902322 100644 --- a/drivers/net/wimax/i2400m/rx.c +++ b/drivers/net/wimax/i2400m/rx.c | |||
@@ -819,10 +819,9 @@ void i2400m_roq_queue_update_ws(struct i2400m *i2400m, struct i2400m_roq *roq, | |||
819 | roq_data = (struct i2400m_roq_data *) &skb->cb; | 819 | roq_data = (struct i2400m_roq_data *) &skb->cb; |
820 | i2400m_net_erx(i2400m, skb, roq_data->cs); | 820 | i2400m_net_erx(i2400m, skb, roq_data->cs); |
821 | } | 821 | } |
822 | else { | 822 | else |
823 | __i2400m_roq_queue(i2400m, roq, skb, sn, nsn); | 823 | __i2400m_roq_queue(i2400m, roq, skb, sn, nsn); |
824 | __i2400m_roq_update_ws(i2400m, roq, sn + 1); | 824 | __i2400m_roq_update_ws(i2400m, roq, sn + 1); |
825 | } | ||
826 | i2400m_roq_log_add(i2400m, roq, I2400M_RO_TYPE_PACKET_WS, | 825 | i2400m_roq_log_add(i2400m, roq, I2400M_RO_TYPE_PACKET_WS, |
827 | old_ws, len, sn, nsn, roq->ws); | 826 | old_ws, len, sn, nsn, roq->ws); |
828 | } | 827 | } |
diff --git a/drivers/net/wireless/airo.c b/drivers/net/wireless/airo.c index c36d3a3d655f..d73475739127 100644 --- a/drivers/net/wireless/airo.c +++ b/drivers/net/wireless/airo.c | |||
@@ -6501,7 +6501,10 @@ static int airo_get_encode(struct net_device *dev, | |||
6501 | 6501 | ||
6502 | /* Copy the key to the user buffer */ | 6502 | /* Copy the key to the user buffer */ |
6503 | dwrq->length = get_wep_key(local, index, &buf[0], sizeof(buf)); | 6503 | dwrq->length = get_wep_key(local, index, &buf[0], sizeof(buf)); |
6504 | memcpy(extra, buf, dwrq->length); | 6504 | if (dwrq->length != -1) |
6505 | memcpy(extra, buf, dwrq->length); | ||
6506 | else | ||
6507 | dwrq->length = 0; | ||
6505 | 6508 | ||
6506 | return 0; | 6509 | return 0; |
6507 | } | 6510 | } |
@@ -6659,7 +6662,10 @@ static int airo_get_encodeext(struct net_device *dev, | |||
6659 | 6662 | ||
6660 | /* Copy the key to the user buffer */ | 6663 | /* Copy the key to the user buffer */ |
6661 | ext->key_len = get_wep_key(local, idx, &buf[0], sizeof(buf)); | 6664 | ext->key_len = get_wep_key(local, idx, &buf[0], sizeof(buf)); |
6662 | memcpy(extra, buf, ext->key_len); | 6665 | if (ext->key_len != -1) |
6666 | memcpy(extra, buf, ext->key_len); | ||
6667 | else | ||
6668 | ext->key_len = 0; | ||
6663 | 6669 | ||
6664 | return 0; | 6670 | return 0; |
6665 | } | 6671 | } |
diff --git a/drivers/net/wireless/ath/ath5k/base.c b/drivers/net/wireless/ath/ath5k/base.c index 6789c5dfcc76..dbfe9f45050e 100644 --- a/drivers/net/wireless/ath/ath5k/base.c +++ b/drivers/net/wireless/ath/ath5k/base.c | |||
@@ -218,7 +218,7 @@ static struct pci_driver ath5k_pci_driver = { | |||
218 | * Prototypes - MAC 802.11 stack related functions | 218 | * Prototypes - MAC 802.11 stack related functions |
219 | */ | 219 | */ |
220 | static int ath5k_tx(struct ieee80211_hw *hw, struct sk_buff *skb); | 220 | static int ath5k_tx(struct ieee80211_hw *hw, struct sk_buff *skb); |
221 | static int ath5k_reset(struct ath5k_softc *sc, bool stop, bool change_channel); | 221 | static int ath5k_reset(struct ath5k_softc *sc, struct ieee80211_channel *chan); |
222 | static int ath5k_reset_wake(struct ath5k_softc *sc); | 222 | static int ath5k_reset_wake(struct ath5k_softc *sc); |
223 | static int ath5k_start(struct ieee80211_hw *hw); | 223 | static int ath5k_start(struct ieee80211_hw *hw); |
224 | static void ath5k_stop(struct ieee80211_hw *hw); | 224 | static void ath5k_stop(struct ieee80211_hw *hw); |
@@ -1076,16 +1076,13 @@ ath5k_chan_set(struct ath5k_softc *sc, struct ieee80211_channel *chan) | |||
1076 | if (chan->center_freq != sc->curchan->center_freq || | 1076 | if (chan->center_freq != sc->curchan->center_freq || |
1077 | chan->hw_value != sc->curchan->hw_value) { | 1077 | chan->hw_value != sc->curchan->hw_value) { |
1078 | 1078 | ||
1079 | sc->curchan = chan; | ||
1080 | sc->curband = &sc->sbands[chan->band]; | ||
1081 | |||
1082 | /* | 1079 | /* |
1083 | * To switch channels clear any pending DMA operations; | 1080 | * To switch channels clear any pending DMA operations; |
1084 | * wait long enough for the RX fifo to drain, reset the | 1081 | * wait long enough for the RX fifo to drain, reset the |
1085 | * hardware at the new frequency, and then re-enable | 1082 | * hardware at the new frequency, and then re-enable |
1086 | * the relevant bits of the h/w. | 1083 | * the relevant bits of the h/w. |
1087 | */ | 1084 | */ |
1088 | return ath5k_reset(sc, true, true); | 1085 | return ath5k_reset(sc, chan); |
1089 | } | 1086 | } |
1090 | 1087 | ||
1091 | return 0; | 1088 | return 0; |
@@ -2350,7 +2347,7 @@ ath5k_init(struct ath5k_softc *sc) | |||
2350 | sc->imask = AR5K_INT_RXOK | AR5K_INT_RXERR | AR5K_INT_RXEOL | | 2347 | sc->imask = AR5K_INT_RXOK | AR5K_INT_RXERR | AR5K_INT_RXEOL | |
2351 | AR5K_INT_RXORN | AR5K_INT_TXDESC | AR5K_INT_TXEOL | | 2348 | AR5K_INT_RXORN | AR5K_INT_TXDESC | AR5K_INT_TXEOL | |
2352 | AR5K_INT_FATAL | AR5K_INT_GLOBAL; | 2349 | AR5K_INT_FATAL | AR5K_INT_GLOBAL; |
2353 | ret = ath5k_reset(sc, false, false); | 2350 | ret = ath5k_reset(sc, NULL); |
2354 | if (ret) | 2351 | if (ret) |
2355 | goto done; | 2352 | goto done; |
2356 | 2353 | ||
@@ -2635,18 +2632,25 @@ drop_packet: | |||
2635 | return NETDEV_TX_OK; | 2632 | return NETDEV_TX_OK; |
2636 | } | 2633 | } |
2637 | 2634 | ||
2635 | /* | ||
2636 | * Reset the hardware. If chan is not NULL, then also pause rx/tx | ||
2637 | * and change to the given channel. | ||
2638 | */ | ||
2638 | static int | 2639 | static int |
2639 | ath5k_reset(struct ath5k_softc *sc, bool stop, bool change_channel) | 2640 | ath5k_reset(struct ath5k_softc *sc, struct ieee80211_channel *chan) |
2640 | { | 2641 | { |
2641 | struct ath5k_hw *ah = sc->ah; | 2642 | struct ath5k_hw *ah = sc->ah; |
2642 | int ret; | 2643 | int ret; |
2643 | 2644 | ||
2644 | ATH5K_DBG(sc, ATH5K_DEBUG_RESET, "resetting\n"); | 2645 | ATH5K_DBG(sc, ATH5K_DEBUG_RESET, "resetting\n"); |
2645 | 2646 | ||
2646 | if (stop) { | 2647 | if (chan) { |
2647 | ath5k_hw_set_imr(ah, 0); | 2648 | ath5k_hw_set_imr(ah, 0); |
2648 | ath5k_txq_cleanup(sc); | 2649 | ath5k_txq_cleanup(sc); |
2649 | ath5k_rx_stop(sc); | 2650 | ath5k_rx_stop(sc); |
2651 | |||
2652 | sc->curchan = chan; | ||
2653 | sc->curband = &sc->sbands[chan->band]; | ||
2650 | } | 2654 | } |
2651 | ret = ath5k_hw_reset(ah, sc->opmode, sc->curchan, true); | 2655 | ret = ath5k_hw_reset(ah, sc->opmode, sc->curchan, true); |
2652 | if (ret) { | 2656 | if (ret) { |
@@ -2684,7 +2688,7 @@ ath5k_reset_wake(struct ath5k_softc *sc) | |||
2684 | { | 2688 | { |
2685 | int ret; | 2689 | int ret; |
2686 | 2690 | ||
2687 | ret = ath5k_reset(sc, true, true); | 2691 | ret = ath5k_reset(sc, sc->curchan); |
2688 | if (!ret) | 2692 | if (!ret) |
2689 | ieee80211_wake_queues(sc->hw); | 2693 | ieee80211_wake_queues(sc->hw); |
2690 | 2694 | ||
diff --git a/drivers/net/wireless/ath/ath9k/pci.c b/drivers/net/wireless/ath/ath9k/pci.c index 6dbc58580abb..168411d322a2 100644 --- a/drivers/net/wireless/ath/ath9k/pci.c +++ b/drivers/net/wireless/ath/ath9k/pci.c | |||
@@ -93,14 +93,14 @@ static int ath_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id) | |||
93 | if (pci_enable_device(pdev)) | 93 | if (pci_enable_device(pdev)) |
94 | return -EIO; | 94 | return -EIO; |
95 | 95 | ||
96 | ret = pci_set_dma_mask(pdev, DMA_32BIT_MASK); | 96 | ret = pci_set_dma_mask(pdev, DMA_BIT_MASK(32)); |
97 | 97 | ||
98 | if (ret) { | 98 | if (ret) { |
99 | printk(KERN_ERR "ath9k: 32-bit DMA not available\n"); | 99 | printk(KERN_ERR "ath9k: 32-bit DMA not available\n"); |
100 | goto bad; | 100 | goto bad; |
101 | } | 101 | } |
102 | 102 | ||
103 | ret = pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK); | 103 | ret = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(32)); |
104 | 104 | ||
105 | if (ret) { | 105 | if (ret) { |
106 | printk(KERN_ERR "ath9k: 32-bit DMA consistent " | 106 | printk(KERN_ERR "ath9k: 32-bit DMA consistent " |
diff --git a/drivers/net/wireless/iwlwifi/iwl-6000.c b/drivers/net/wireless/iwlwifi/iwl-6000.c index ee271d7f6120..7236382aeaa6 100644 --- a/drivers/net/wireless/iwlwifi/iwl-6000.c +++ b/drivers/net/wireless/iwlwifi/iwl-6000.c | |||
@@ -102,8 +102,8 @@ struct iwl_cfg iwl6000_2agn_cfg = { | |||
102 | .eeprom_ver = EEPROM_5000_EEPROM_VERSION, | 102 | .eeprom_ver = EEPROM_5000_EEPROM_VERSION, |
103 | .eeprom_calib_ver = EEPROM_5000_TX_POWER_VERSION, | 103 | .eeprom_calib_ver = EEPROM_5000_TX_POWER_VERSION, |
104 | .mod_params = &iwl50_mod_params, | 104 | .mod_params = &iwl50_mod_params, |
105 | .valid_tx_ant = ANT_BC, | 105 | .valid_tx_ant = ANT_AB, |
106 | .valid_rx_ant = ANT_BC, | 106 | .valid_rx_ant = ANT_AB, |
107 | .need_pll_cfg = false, | 107 | .need_pll_cfg = false, |
108 | }; | 108 | }; |
109 | 109 | ||
@@ -118,8 +118,8 @@ struct iwl_cfg iwl6050_2agn_cfg = { | |||
118 | .eeprom_ver = EEPROM_5000_EEPROM_VERSION, | 118 | .eeprom_ver = EEPROM_5000_EEPROM_VERSION, |
119 | .eeprom_calib_ver = EEPROM_5000_TX_POWER_VERSION, | 119 | .eeprom_calib_ver = EEPROM_5000_TX_POWER_VERSION, |
120 | .mod_params = &iwl50_mod_params, | 120 | .mod_params = &iwl50_mod_params, |
121 | .valid_tx_ant = ANT_BC, | 121 | .valid_tx_ant = ANT_AB, |
122 | .valid_rx_ant = ANT_BC, | 122 | .valid_rx_ant = ANT_AB, |
123 | .need_pll_cfg = false, | 123 | .need_pll_cfg = false, |
124 | }; | 124 | }; |
125 | 125 | ||
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn.c b/drivers/net/wireless/iwlwifi/iwl-agn.c index 3ebf6cf53a51..596977d71c94 100644 --- a/drivers/net/wireless/iwlwifi/iwl-agn.c +++ b/drivers/net/wireless/iwlwifi/iwl-agn.c | |||
@@ -2944,7 +2944,9 @@ static struct pci_device_id iwl_hw_card_ids[] = { | |||
2944 | {IWL_PCI_DEVICE(0x0085, 0x1112, iwl6000_2ag_cfg)}, | 2944 | {IWL_PCI_DEVICE(0x0085, 0x1112, iwl6000_2ag_cfg)}, |
2945 | {IWL_PCI_DEVICE(0x0082, 0x1122, iwl6000_2ag_cfg)}, | 2945 | {IWL_PCI_DEVICE(0x0082, 0x1122, iwl6000_2ag_cfg)}, |
2946 | {IWL_PCI_DEVICE(0x422B, PCI_ANY_ID, iwl6000_3agn_cfg)}, | 2946 | {IWL_PCI_DEVICE(0x422B, PCI_ANY_ID, iwl6000_3agn_cfg)}, |
2947 | {IWL_PCI_DEVICE(0x422C, PCI_ANY_ID, iwl6000_2agn_cfg)}, | ||
2947 | {IWL_PCI_DEVICE(0x4238, PCI_ANY_ID, iwl6000_3agn_cfg)}, | 2948 | {IWL_PCI_DEVICE(0x4238, PCI_ANY_ID, iwl6000_3agn_cfg)}, |
2949 | {IWL_PCI_DEVICE(0x4239, PCI_ANY_ID, iwl6000_2agn_cfg)}, | ||
2948 | {IWL_PCI_DEVICE(0x0082, PCI_ANY_ID, iwl6000_2agn_cfg)}, | 2950 | {IWL_PCI_DEVICE(0x0082, PCI_ANY_ID, iwl6000_2agn_cfg)}, |
2949 | {IWL_PCI_DEVICE(0x0085, PCI_ANY_ID, iwl6000_3agn_cfg)}, | 2951 | {IWL_PCI_DEVICE(0x0085, PCI_ANY_ID, iwl6000_3agn_cfg)}, |
2950 | {IWL_PCI_DEVICE(0x0086, PCI_ANY_ID, iwl6050_3agn_cfg)}, | 2952 | {IWL_PCI_DEVICE(0x0086, PCI_ANY_ID, iwl6050_3agn_cfg)}, |
diff --git a/drivers/net/wireless/p54/p54pci.c b/drivers/net/wireless/p54/p54pci.c index e3569a0a952d..b1610ea4bb3d 100644 --- a/drivers/net/wireless/p54/p54pci.c +++ b/drivers/net/wireless/p54/p54pci.c | |||
@@ -492,8 +492,8 @@ static int __devinit p54p_probe(struct pci_dev *pdev, | |||
492 | goto err_disable_dev; | 492 | goto err_disable_dev; |
493 | } | 493 | } |
494 | 494 | ||
495 | if (pci_set_dma_mask(pdev, DMA_32BIT_MASK) || | 495 | if (pci_set_dma_mask(pdev, DMA_BIT_MASK(32)) || |
496 | pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK)) { | 496 | pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(32))) { |
497 | dev_err(&pdev->dev, "No suitable DMA available\n"); | 497 | dev_err(&pdev->dev, "No suitable DMA available\n"); |
498 | goto err_free_reg; | 498 | goto err_free_reg; |
499 | } | 499 | } |
diff --git a/drivers/net/wireless/rtl818x/rtl8187.h b/drivers/net/wireless/rtl818x/rtl8187.h index 622196dc078e..c09bfefc70f3 100644 --- a/drivers/net/wireless/rtl818x/rtl8187.h +++ b/drivers/net/wireless/rtl818x/rtl8187.h | |||
@@ -127,6 +127,12 @@ struct rtl8187_priv { | |||
127 | __le64 buf; | 127 | __le64 buf; |
128 | struct sk_buff_head queue; | 128 | struct sk_buff_head queue; |
129 | } b_tx_status; /* This queue is used by both -b and non-b devices */ | 129 | } b_tx_status; /* This queue is used by both -b and non-b devices */ |
130 | struct mutex io_mutex; | ||
131 | union { | ||
132 | u8 bits8; | ||
133 | __le16 bits16; | ||
134 | __le32 bits32; | ||
135 | } *io_dmabuf; | ||
130 | }; | 136 | }; |
131 | 137 | ||
132 | void rtl8187_write_phy(struct ieee80211_hw *dev, u8 addr, u32 data); | 138 | void rtl8187_write_phy(struct ieee80211_hw *dev, u8 addr, u32 data); |
@@ -136,10 +142,14 @@ static inline u8 rtl818x_ioread8_idx(struct rtl8187_priv *priv, | |||
136 | { | 142 | { |
137 | u8 val; | 143 | u8 val; |
138 | 144 | ||
145 | mutex_lock(&priv->io_mutex); | ||
139 | usb_control_msg(priv->udev, usb_rcvctrlpipe(priv->udev, 0), | 146 | usb_control_msg(priv->udev, usb_rcvctrlpipe(priv->udev, 0), |
140 | RTL8187_REQ_GET_REG, RTL8187_REQT_READ, | 147 | RTL8187_REQ_GET_REG, RTL8187_REQT_READ, |
141 | (unsigned long)addr, idx & 0x03, &val, | 148 | (unsigned long)addr, idx & 0x03, |
142 | sizeof(val), HZ / 2); | 149 | &priv->io_dmabuf->bits8, sizeof(val), HZ / 2); |
150 | |||
151 | val = priv->io_dmabuf->bits8; | ||
152 | mutex_unlock(&priv->io_mutex); | ||
143 | 153 | ||
144 | return val; | 154 | return val; |
145 | } | 155 | } |
@@ -154,10 +164,14 @@ static inline u16 rtl818x_ioread16_idx(struct rtl8187_priv *priv, | |||
154 | { | 164 | { |
155 | __le16 val; | 165 | __le16 val; |
156 | 166 | ||
167 | mutex_lock(&priv->io_mutex); | ||
157 | usb_control_msg(priv->udev, usb_rcvctrlpipe(priv->udev, 0), | 168 | usb_control_msg(priv->udev, usb_rcvctrlpipe(priv->udev, 0), |
158 | RTL8187_REQ_GET_REG, RTL8187_REQT_READ, | 169 | RTL8187_REQ_GET_REG, RTL8187_REQT_READ, |
159 | (unsigned long)addr, idx & 0x03, &val, | 170 | (unsigned long)addr, idx & 0x03, |
160 | sizeof(val), HZ / 2); | 171 | &priv->io_dmabuf->bits16, sizeof(val), HZ / 2); |
172 | |||
173 | val = priv->io_dmabuf->bits16; | ||
174 | mutex_unlock(&priv->io_mutex); | ||
161 | 175 | ||
162 | return le16_to_cpu(val); | 176 | return le16_to_cpu(val); |
163 | } | 177 | } |
@@ -172,10 +186,14 @@ static inline u32 rtl818x_ioread32_idx(struct rtl8187_priv *priv, | |||
172 | { | 186 | { |
173 | __le32 val; | 187 | __le32 val; |
174 | 188 | ||
189 | mutex_lock(&priv->io_mutex); | ||
175 | usb_control_msg(priv->udev, usb_rcvctrlpipe(priv->udev, 0), | 190 | usb_control_msg(priv->udev, usb_rcvctrlpipe(priv->udev, 0), |
176 | RTL8187_REQ_GET_REG, RTL8187_REQT_READ, | 191 | RTL8187_REQ_GET_REG, RTL8187_REQT_READ, |
177 | (unsigned long)addr, idx & 0x03, &val, | 192 | (unsigned long)addr, idx & 0x03, |
178 | sizeof(val), HZ / 2); | 193 | &priv->io_dmabuf->bits32, sizeof(val), HZ / 2); |
194 | |||
195 | val = priv->io_dmabuf->bits32; | ||
196 | mutex_unlock(&priv->io_mutex); | ||
179 | 197 | ||
180 | return le32_to_cpu(val); | 198 | return le32_to_cpu(val); |
181 | } | 199 | } |
@@ -188,10 +206,15 @@ static inline u32 rtl818x_ioread32(struct rtl8187_priv *priv, __le32 *addr) | |||
188 | static inline void rtl818x_iowrite8_idx(struct rtl8187_priv *priv, | 206 | static inline void rtl818x_iowrite8_idx(struct rtl8187_priv *priv, |
189 | u8 *addr, u8 val, u8 idx) | 207 | u8 *addr, u8 val, u8 idx) |
190 | { | 208 | { |
209 | mutex_lock(&priv->io_mutex); | ||
210 | |||
211 | priv->io_dmabuf->bits8 = val; | ||
191 | usb_control_msg(priv->udev, usb_sndctrlpipe(priv->udev, 0), | 212 | usb_control_msg(priv->udev, usb_sndctrlpipe(priv->udev, 0), |
192 | RTL8187_REQ_SET_REG, RTL8187_REQT_WRITE, | 213 | RTL8187_REQ_SET_REG, RTL8187_REQT_WRITE, |
193 | (unsigned long)addr, idx & 0x03, &val, | 214 | (unsigned long)addr, idx & 0x03, |
194 | sizeof(val), HZ / 2); | 215 | &priv->io_dmabuf->bits8, sizeof(val), HZ / 2); |
216 | |||
217 | mutex_unlock(&priv->io_mutex); | ||
195 | } | 218 | } |
196 | 219 | ||
197 | static inline void rtl818x_iowrite8(struct rtl8187_priv *priv, u8 *addr, u8 val) | 220 | static inline void rtl818x_iowrite8(struct rtl8187_priv *priv, u8 *addr, u8 val) |
@@ -202,12 +225,15 @@ static inline void rtl818x_iowrite8(struct rtl8187_priv *priv, u8 *addr, u8 val) | |||
202 | static inline void rtl818x_iowrite16_idx(struct rtl8187_priv *priv, | 225 | static inline void rtl818x_iowrite16_idx(struct rtl8187_priv *priv, |
203 | __le16 *addr, u16 val, u8 idx) | 226 | __le16 *addr, u16 val, u8 idx) |
204 | { | 227 | { |
205 | __le16 buf = cpu_to_le16(val); | 228 | mutex_lock(&priv->io_mutex); |
206 | 229 | ||
230 | priv->io_dmabuf->bits16 = cpu_to_le16(val); | ||
207 | usb_control_msg(priv->udev, usb_sndctrlpipe(priv->udev, 0), | 231 | usb_control_msg(priv->udev, usb_sndctrlpipe(priv->udev, 0), |
208 | RTL8187_REQ_SET_REG, RTL8187_REQT_WRITE, | 232 | RTL8187_REQ_SET_REG, RTL8187_REQT_WRITE, |
209 | (unsigned long)addr, idx & 0x03, &buf, sizeof(buf), | 233 | (unsigned long)addr, idx & 0x03, |
210 | HZ / 2); | 234 | &priv->io_dmabuf->bits16, sizeof(val), HZ / 2); |
235 | |||
236 | mutex_unlock(&priv->io_mutex); | ||
211 | } | 237 | } |
212 | 238 | ||
213 | static inline void rtl818x_iowrite16(struct rtl8187_priv *priv, __le16 *addr, | 239 | static inline void rtl818x_iowrite16(struct rtl8187_priv *priv, __le16 *addr, |
@@ -219,12 +245,15 @@ static inline void rtl818x_iowrite16(struct rtl8187_priv *priv, __le16 *addr, | |||
219 | static inline void rtl818x_iowrite32_idx(struct rtl8187_priv *priv, | 245 | static inline void rtl818x_iowrite32_idx(struct rtl8187_priv *priv, |
220 | __le32 *addr, u32 val, u8 idx) | 246 | __le32 *addr, u32 val, u8 idx) |
221 | { | 247 | { |
222 | __le32 buf = cpu_to_le32(val); | 248 | mutex_lock(&priv->io_mutex); |
223 | 249 | ||
250 | priv->io_dmabuf->bits32 = cpu_to_le32(val); | ||
224 | usb_control_msg(priv->udev, usb_sndctrlpipe(priv->udev, 0), | 251 | usb_control_msg(priv->udev, usb_sndctrlpipe(priv->udev, 0), |
225 | RTL8187_REQ_SET_REG, RTL8187_REQT_WRITE, | 252 | RTL8187_REQ_SET_REG, RTL8187_REQT_WRITE, |
226 | (unsigned long)addr, idx & 0x03, &buf, sizeof(buf), | 253 | (unsigned long)addr, idx & 0x03, |
227 | HZ / 2); | 254 | &priv->io_dmabuf->bits32, sizeof(val), HZ / 2); |
255 | |||
256 | mutex_unlock(&priv->io_mutex); | ||
228 | } | 257 | } |
229 | 258 | ||
230 | static inline void rtl818x_iowrite32(struct rtl8187_priv *priv, __le32 *addr, | 259 | static inline void rtl818x_iowrite32(struct rtl8187_priv *priv, __le32 *addr, |
diff --git a/drivers/net/wireless/rtl818x/rtl8187_dev.c b/drivers/net/wireless/rtl818x/rtl8187_dev.c index 158827e50c55..6499ccc34c94 100644 --- a/drivers/net/wireless/rtl818x/rtl8187_dev.c +++ b/drivers/net/wireless/rtl818x/rtl8187_dev.c | |||
@@ -1326,6 +1326,14 @@ static int __devinit rtl8187_probe(struct usb_interface *intf, | |||
1326 | priv = dev->priv; | 1326 | priv = dev->priv; |
1327 | priv->is_rtl8187b = (id->driver_info == DEVICE_RTL8187B); | 1327 | priv->is_rtl8187b = (id->driver_info == DEVICE_RTL8187B); |
1328 | 1328 | ||
1329 | /* allocate "DMA aware" buffer for register accesses */ | ||
1330 | priv->io_dmabuf = kmalloc(sizeof(*priv->io_dmabuf), GFP_KERNEL); | ||
1331 | if (!priv->io_dmabuf) { | ||
1332 | err = -ENOMEM; | ||
1333 | goto err_free_dev; | ||
1334 | } | ||
1335 | mutex_init(&priv->io_mutex); | ||
1336 | |||
1329 | SET_IEEE80211_DEV(dev, &intf->dev); | 1337 | SET_IEEE80211_DEV(dev, &intf->dev); |
1330 | usb_set_intfdata(intf, dev); | 1338 | usb_set_intfdata(intf, dev); |
1331 | priv->udev = udev; | 1339 | priv->udev = udev; |
@@ -1489,7 +1497,7 @@ static int __devinit rtl8187_probe(struct usb_interface *intf, | |||
1489 | err = ieee80211_register_hw(dev); | 1497 | err = ieee80211_register_hw(dev); |
1490 | if (err) { | 1498 | if (err) { |
1491 | printk(KERN_ERR "rtl8187: Cannot register device\n"); | 1499 | printk(KERN_ERR "rtl8187: Cannot register device\n"); |
1492 | goto err_free_dev; | 1500 | goto err_free_dmabuf; |
1493 | } | 1501 | } |
1494 | mutex_init(&priv->conf_mutex); | 1502 | mutex_init(&priv->conf_mutex); |
1495 | skb_queue_head_init(&priv->b_tx_status.queue); | 1503 | skb_queue_head_init(&priv->b_tx_status.queue); |
@@ -1506,6 +1514,8 @@ static int __devinit rtl8187_probe(struct usb_interface *intf, | |||
1506 | 1514 | ||
1507 | return 0; | 1515 | return 0; |
1508 | 1516 | ||
1517 | err_free_dmabuf: | ||
1518 | kfree(priv->io_dmabuf); | ||
1509 | err_free_dev: | 1519 | err_free_dev: |
1510 | ieee80211_free_hw(dev); | 1520 | ieee80211_free_hw(dev); |
1511 | usb_set_intfdata(intf, NULL); | 1521 | usb_set_intfdata(intf, NULL); |
@@ -1529,6 +1539,7 @@ static void __devexit rtl8187_disconnect(struct usb_interface *intf) | |||
1529 | priv = dev->priv; | 1539 | priv = dev->priv; |
1530 | usb_reset_device(priv->udev); | 1540 | usb_reset_device(priv->udev); |
1531 | usb_put_dev(interface_to_usbdev(intf)); | 1541 | usb_put_dev(interface_to_usbdev(intf)); |
1542 | kfree(priv->io_dmabuf); | ||
1532 | ieee80211_free_hw(dev); | 1543 | ieee80211_free_hw(dev); |
1533 | } | 1544 | } |
1534 | 1545 | ||
diff --git a/drivers/net/wireless/rtl818x/rtl8187_rtl8225.c b/drivers/net/wireless/rtl818x/rtl8187_rtl8225.c index 78df281b297a..a09819386a1e 100644 --- a/drivers/net/wireless/rtl818x/rtl8187_rtl8225.c +++ b/drivers/net/wireless/rtl818x/rtl8187_rtl8225.c | |||
@@ -88,9 +88,15 @@ static void rtl8225_write_8051(struct ieee80211_hw *dev, u8 addr, __le16 data) | |||
88 | rtl818x_iowrite16(priv, &priv->map->RFPinsOutput, reg80); | 88 | rtl818x_iowrite16(priv, &priv->map->RFPinsOutput, reg80); |
89 | udelay(10); | 89 | udelay(10); |
90 | 90 | ||
91 | mutex_lock(&priv->io_mutex); | ||
92 | |||
93 | priv->io_dmabuf->bits16 = data; | ||
91 | usb_control_msg(priv->udev, usb_sndctrlpipe(priv->udev, 0), | 94 | usb_control_msg(priv->udev, usb_sndctrlpipe(priv->udev, 0), |
92 | RTL8187_REQ_SET_REG, RTL8187_REQT_WRITE, | 95 | RTL8187_REQ_SET_REG, RTL8187_REQT_WRITE, |
93 | addr, 0x8225, &data, sizeof(data), HZ / 2); | 96 | addr, 0x8225, &priv->io_dmabuf->bits16, sizeof(data), |
97 | HZ / 2); | ||
98 | |||
99 | mutex_unlock(&priv->io_mutex); | ||
94 | 100 | ||
95 | rtl818x_iowrite16(priv, &priv->map->RFPinsOutput, reg80 | (1 << 2)); | 101 | rtl818x_iowrite16(priv, &priv->map->RFPinsOutput, reg80 | (1 << 2)); |
96 | udelay(10); | 102 | udelay(10); |