aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2008-06-13 23:52:39 -0400
committerDavid S. Miller <davem@davemloft.net>2008-06-13 23:52:39 -0400
commit4ae127d1b6c71f9240dd4245f240e6dd8fc98014 (patch)
treeb7aa27b3e0c655f4613fe2146cb57d7f69e421f6 /drivers/net
parent875ec4333b99144e2589e900a0bcd2c25c757b27 (diff)
parent7775c9753b94fe429dc4323360d6502c95e0dd6e (diff)
Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6
Conflicts: drivers/net/smc911x.c
Diffstat (limited to 'drivers/net')
-rw-r--r--drivers/net/7990.c6
-rw-r--r--drivers/net/Kconfig2
-rw-r--r--drivers/net/atlx/atl1.c17
-rw-r--r--drivers/net/bnx2.c9
-rw-r--r--drivers/net/bnx2.h1
-rw-r--r--drivers/net/bnx2x.c5
-rw-r--r--drivers/net/bnx2x.h3
-rw-r--r--drivers/net/bnx2x_init.h3
-rw-r--r--drivers/net/ehea/ehea_main.c19
-rw-r--r--drivers/net/fec_mpc52xx.c2
-rw-r--r--drivers/net/forcedeth.c20
-rw-r--r--drivers/net/hamradio/baycom_epp.c2
-rw-r--r--drivers/net/ipg.c4
-rw-r--r--drivers/net/ixgbe/ixgbe_82598.c4
-rw-r--r--drivers/net/pppoe.c37
-rw-r--r--drivers/net/pppol2tp.c20
-rw-r--r--drivers/net/r6040.c2
-rw-r--r--drivers/net/s2io.c10
-rw-r--r--drivers/net/sfc/falcon.c4
-rw-r--r--drivers/net/sky2.c2
-rw-r--r--drivers/net/smc911x.c23
-rw-r--r--drivers/net/smc911x.h1
-rw-r--r--drivers/net/smc91x.c17
-rw-r--r--drivers/net/smc91x.h8
-rw-r--r--drivers/net/tulip/tulip_core.c2
-rw-r--r--drivers/net/usb/kaweth.c2
-rw-r--r--drivers/net/virtio_net.c52
-rw-r--r--drivers/net/wireless/hostap/hostap_main.c8
28 files changed, 162 insertions, 123 deletions
diff --git a/drivers/net/7990.c b/drivers/net/7990.c
index 750a46f4bc58..ad6b8a5b6574 100644
--- a/drivers/net/7990.c
+++ b/drivers/net/7990.c
@@ -506,6 +506,7 @@ int lance_open (struct net_device *dev)
506 506
507 return res; 507 return res;
508} 508}
509EXPORT_SYMBOL_GPL(lance_open);
509 510
510int lance_close (struct net_device *dev) 511int lance_close (struct net_device *dev)
511{ 512{
@@ -521,6 +522,7 @@ int lance_close (struct net_device *dev)
521 522
522 return 0; 523 return 0;
523} 524}
525EXPORT_SYMBOL_GPL(lance_close);
524 526
525void lance_tx_timeout(struct net_device *dev) 527void lance_tx_timeout(struct net_device *dev)
526{ 528{
@@ -529,7 +531,7 @@ void lance_tx_timeout(struct net_device *dev)
529 dev->trans_start = jiffies; 531 dev->trans_start = jiffies;
530 netif_wake_queue (dev); 532 netif_wake_queue (dev);
531} 533}
532 534EXPORT_SYMBOL_GPL(lance_tx_timeout);
533 535
534int lance_start_xmit (struct sk_buff *skb, struct net_device *dev) 536int lance_start_xmit (struct sk_buff *skb, struct net_device *dev)
535{ 537{
@@ -586,6 +588,7 @@ int lance_start_xmit (struct sk_buff *skb, struct net_device *dev)
586 588
587 return 0; 589 return 0;
588} 590}
591EXPORT_SYMBOL_GPL(lance_start_xmit);
589 592
590/* taken from the depca driver via a2065.c */ 593/* taken from the depca driver via a2065.c */
591static void lance_load_multicast (struct net_device *dev) 594static void lance_load_multicast (struct net_device *dev)
@@ -654,6 +657,7 @@ void lance_set_multicast (struct net_device *dev)
654 if (!stopped) 657 if (!stopped)
655 netif_start_queue (dev); 658 netif_start_queue (dev);
656} 659}
660EXPORT_SYMBOL_GPL(lance_set_multicast);
657 661
658#ifdef CONFIG_NET_POLL_CONTROLLER 662#ifdef CONFIG_NET_POLL_CONTROLLER
659void lance_poll(struct net_device *dev) 663void lance_poll(struct net_device *dev)
diff --git a/drivers/net/Kconfig b/drivers/net/Kconfig
index 40eb24d6d755..20b5367f7e0b 100644
--- a/drivers/net/Kconfig
+++ b/drivers/net/Kconfig
@@ -2453,7 +2453,7 @@ config CHELSIO_T3
2453 2453
2454config EHEA 2454config EHEA
2455 tristate "eHEA Ethernet support" 2455 tristate "eHEA Ethernet support"
2456 depends on IBMEBUS && INET && SPARSEMEM && MEMORY_HOTPLUG 2456 depends on IBMEBUS && INET && SPARSEMEM
2457 select INET_LRO 2457 select INET_LRO
2458 ---help--- 2458 ---help---
2459 This driver supports the IBM pSeries eHEA ethernet adapter. 2459 This driver supports the IBM pSeries eHEA ethernet adapter.
diff --git a/drivers/net/atlx/atl1.c b/drivers/net/atlx/atl1.c
index 32dc391e63cc..919ffb9bfa4e 100644
--- a/drivers/net/atlx/atl1.c
+++ b/drivers/net/atlx/atl1.c
@@ -637,22 +637,6 @@ static s32 atl1_phy_leave_power_saving(struct atl1_hw *hw)
637} 637}
638 638
639/* 639/*
640 * Force the PHY into power saving mode using vendor magic.
641 */
642#ifdef CONFIG_PM
643static void atl1_phy_enter_power_saving(struct atl1_hw *hw)
644{
645 atl1_write_phy_reg(hw, MII_DBG_ADDR, 0);
646 atl1_write_phy_reg(hw, MII_DBG_DATA, 0x124E);
647 atl1_write_phy_reg(hw, MII_DBG_ADDR, 2);
648 atl1_write_phy_reg(hw, MII_DBG_DATA, 0x3000);
649 atl1_write_phy_reg(hw, MII_DBG_ADDR, 3);
650 atl1_write_phy_reg(hw, MII_DBG_DATA, 0);
651
652}
653#endif
654
655/*
656 * Resets the PHY and make all config validate 640 * Resets the PHY and make all config validate
657 * hw - Struct containing variables accessed by shared code 641 * hw - Struct containing variables accessed by shared code
658 * 642 *
@@ -2861,7 +2845,6 @@ disable_wol:
2861 ctrl |= PCIE_PHYMISC_FORCE_RCV_DET; 2845 ctrl |= PCIE_PHYMISC_FORCE_RCV_DET;
2862 iowrite32(ctrl, hw->hw_addr + REG_PCIE_PHYMISC); 2846 iowrite32(ctrl, hw->hw_addr + REG_PCIE_PHYMISC);
2863 ioread32(hw->hw_addr + REG_PCIE_PHYMISC); 2847 ioread32(hw->hw_addr + REG_PCIE_PHYMISC);
2864 atl1_phy_enter_power_saving(hw);
2865 hw->phy_configured = false; 2848 hw->phy_configured = false;
2866 pci_enable_wake(pdev, pci_choose_state(pdev, state), 0); 2849 pci_enable_wake(pdev, pci_choose_state(pdev, state), 0);
2867exit: 2850exit:
diff --git a/drivers/net/bnx2.c b/drivers/net/bnx2.c
index b32d22762b9b..2c52d2c7c495 100644
--- a/drivers/net/bnx2.c
+++ b/drivers/net/bnx2.c
@@ -5664,14 +5664,12 @@ bnx2_reset_task(struct work_struct *work)
5664 if (!netif_running(bp->dev)) 5664 if (!netif_running(bp->dev))
5665 return; 5665 return;
5666 5666
5667 bp->in_reset_task = 1;
5668 bnx2_netif_stop(bp); 5667 bnx2_netif_stop(bp);
5669 5668
5670 bnx2_init_nic(bp, 1); 5669 bnx2_init_nic(bp, 1);
5671 5670
5672 atomic_set(&bp->intr_sem, 1); 5671 atomic_set(&bp->intr_sem, 1);
5673 bnx2_netif_start(bp); 5672 bnx2_netif_start(bp);
5674 bp->in_reset_task = 0;
5675} 5673}
5676 5674
5677static void 5675static void
@@ -5847,12 +5845,7 @@ bnx2_close(struct net_device *dev)
5847 struct bnx2 *bp = netdev_priv(dev); 5845 struct bnx2 *bp = netdev_priv(dev);
5848 u32 reset_code; 5846 u32 reset_code;
5849 5847
5850 /* Calling flush_scheduled_work() may deadlock because 5848 cancel_work_sync(&bp->reset_task);
5851 * linkwatch_event() may be on the workqueue and it will try to get
5852 * the rtnl_lock which we are holding.
5853 */
5854 while (bp->in_reset_task)
5855 msleep(1);
5856 5849
5857 bnx2_disable_int_sync(bp); 5850 bnx2_disable_int_sync(bp);
5858 bnx2_napi_disable(bp); 5851 bnx2_napi_disable(bp);
diff --git a/drivers/net/bnx2.h b/drivers/net/bnx2.h
index 16020a10bf42..be7ccb5b77da 100644
--- a/drivers/net/bnx2.h
+++ b/drivers/net/bnx2.h
@@ -6656,7 +6656,6 @@ struct bnx2 {
6656 int current_interval; 6656 int current_interval;
6657 struct timer_list timer; 6657 struct timer_list timer;
6658 struct work_struct reset_task; 6658 struct work_struct reset_task;
6659 int in_reset_task;
6660 6659
6661 /* Used to synchronize phy accesses. */ 6660 /* Used to synchronize phy accesses. */
6662 spinlock_t phy_lock; 6661 spinlock_t phy_lock;
diff --git a/drivers/net/bnx2x.c b/drivers/net/bnx2x.c
index 7bdb5af35951..70cba64732ca 100644
--- a/drivers/net/bnx2x.c
+++ b/drivers/net/bnx2x.c
@@ -6,7 +6,8 @@
6 * it under the terms of the GNU General Public License as published by 6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation. 7 * the Free Software Foundation.
8 * 8 *
9 * Written by: Eliezer Tamir <eliezert@broadcom.com> 9 * Maintained by: Eilon Greenstein <eilong@broadcom.com>
10 * Written by: Eliezer Tamir
10 * Based on code from Michael Chan's bnx2 driver 11 * Based on code from Michael Chan's bnx2 driver
11 * UDP CSUM errata workaround by Arik Gendelman 12 * UDP CSUM errata workaround by Arik Gendelman
12 * Slowpath rework by Vladislav Zolotarov 13 * Slowpath rework by Vladislav Zolotarov
@@ -74,7 +75,7 @@ static char version[] __devinitdata =
74 "Broadcom NetXtreme II 5771X 10Gigabit Ethernet Driver " 75 "Broadcom NetXtreme II 5771X 10Gigabit Ethernet Driver "
75 DRV_MODULE_NAME " " DRV_MODULE_VERSION " (" DRV_MODULE_RELDATE ")\n"; 76 DRV_MODULE_NAME " " DRV_MODULE_VERSION " (" DRV_MODULE_RELDATE ")\n";
76 77
77MODULE_AUTHOR("Eliezer Tamir <eliezert@broadcom.com>"); 78MODULE_AUTHOR("Eliezer Tamir");
78MODULE_DESCRIPTION("Broadcom NetXtreme II BCM57710 Driver"); 79MODULE_DESCRIPTION("Broadcom NetXtreme II BCM57710 Driver");
79MODULE_LICENSE("GPL"); 80MODULE_LICENSE("GPL");
80MODULE_VERSION(DRV_MODULE_VERSION); 81MODULE_VERSION(DRV_MODULE_VERSION);
diff --git a/drivers/net/bnx2x.h b/drivers/net/bnx2x.h
index 4f0c0d31e7c1..8e68d06510a6 100644
--- a/drivers/net/bnx2x.h
+++ b/drivers/net/bnx2x.h
@@ -6,7 +6,8 @@
6 * it under the terms of the GNU General Public License as published by 6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation. 7 * the Free Software Foundation.
8 * 8 *
9 * Written by: Eliezer Tamir <eliezert@broadcom.com> 9 * Maintained by: Eilon Greenstein <eilong@broadcom.com>
10 * Written by: Eliezer Tamir
10 * Based on code from Michael Chan's bnx2 driver 11 * Based on code from Michael Chan's bnx2 driver
11 */ 12 */
12 13
diff --git a/drivers/net/bnx2x_init.h b/drivers/net/bnx2x_init.h
index dcaecc53bdb1..370686eef97c 100644
--- a/drivers/net/bnx2x_init.h
+++ b/drivers/net/bnx2x_init.h
@@ -6,7 +6,8 @@
6 * it under the terms of the GNU General Public License as published by 6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation. 7 * the Free Software Foundation.
8 * 8 *
9 * Written by: Eliezer Tamir <eliezert@broadcom.com> 9 * Maintained by: Eilon Greenstein <eilong@broadcom.com>
10 * Written by: Eliezer Tamir
10 */ 11 */
11 12
12#ifndef BNX2X_INIT_H 13#ifndef BNX2X_INIT_H
diff --git a/drivers/net/ehea/ehea_main.c b/drivers/net/ehea/ehea_main.c
index 287a61918739..075fd547421e 100644
--- a/drivers/net/ehea/ehea_main.c
+++ b/drivers/net/ehea/ehea_main.c
@@ -1766,16 +1766,20 @@ static int ehea_set_mac_addr(struct net_device *dev, void *sa)
1766 mutex_lock(&ehea_bcmc_regs.lock); 1766 mutex_lock(&ehea_bcmc_regs.lock);
1767 1767
1768 /* Deregister old MAC in pHYP */ 1768 /* Deregister old MAC in pHYP */
1769 ret = ehea_broadcast_reg_helper(port, H_DEREG_BCMC); 1769 if (port->state == EHEA_PORT_UP) {
1770 if (ret) 1770 ret = ehea_broadcast_reg_helper(port, H_DEREG_BCMC);
1771 goto out_upregs; 1771 if (ret)
1772 goto out_upregs;
1773 }
1772 1774
1773 port->mac_addr = cb0->port_mac_addr << 16; 1775 port->mac_addr = cb0->port_mac_addr << 16;
1774 1776
1775 /* Register new MAC in pHYP */ 1777 /* Register new MAC in pHYP */
1776 ret = ehea_broadcast_reg_helper(port, H_REG_BCMC); 1778 if (port->state == EHEA_PORT_UP) {
1777 if (ret) 1779 ret = ehea_broadcast_reg_helper(port, H_REG_BCMC);
1778 goto out_upregs; 1780 if (ret)
1781 goto out_upregs;
1782 }
1779 1783
1780 ret = 0; 1784 ret = 0;
1781 1785
@@ -2601,7 +2605,8 @@ static int ehea_stop(struct net_device *dev)
2601 if (netif_msg_ifdown(port)) 2605 if (netif_msg_ifdown(port))
2602 ehea_info("disabling port %s", dev->name); 2606 ehea_info("disabling port %s", dev->name);
2603 2607
2604 flush_scheduled_work(); 2608 cancel_work_sync(&port->reset_task);
2609
2605 mutex_lock(&port->port_lock); 2610 mutex_lock(&port->port_lock);
2606 netif_stop_queue(dev); 2611 netif_stop_queue(dev);
2607 port_napi_disable(port); 2612 port_napi_disable(port);
diff --git a/drivers/net/fec_mpc52xx.c b/drivers/net/fec_mpc52xx.c
index 5f9c42e7a7f1..329edd9c08fc 100644
--- a/drivers/net/fec_mpc52xx.c
+++ b/drivers/net/fec_mpc52xx.c
@@ -78,7 +78,7 @@ module_param_array_named(mac, mpc52xx_fec_mac_addr, byte, NULL, 0);
78MODULE_PARM_DESC(mac, "six hex digits, ie. 0x1,0x2,0xc0,0x01,0xba,0xbe"); 78MODULE_PARM_DESC(mac, "six hex digits, ie. 0x1,0x2,0xc0,0x01,0xba,0xbe");
79 79
80#define MPC52xx_MESSAGES_DEFAULT ( NETIF_MSG_DRV | NETIF_MSG_PROBE | \ 80#define MPC52xx_MESSAGES_DEFAULT ( NETIF_MSG_DRV | NETIF_MSG_PROBE | \
81 NETIF_MSG_LINK | NETIF_MSG_IFDOWN | NETIF_MSG_IFDOWN ) 81 NETIF_MSG_LINK | NETIF_MSG_IFDOWN | NETIF_MSG_IFUP)
82static int debug = -1; /* the above default */ 82static int debug = -1; /* the above default */
83module_param(debug, int, 0); 83module_param(debug, int, 0);
84MODULE_PARM_DESC(debug, "debugging messages level"); 84MODULE_PARM_DESC(debug, "debugging messages level");
diff --git a/drivers/net/forcedeth.c b/drivers/net/forcedeth.c
index e4d697894364..c980ce9719af 100644
--- a/drivers/net/forcedeth.c
+++ b/drivers/net/forcedeth.c
@@ -3277,6 +3277,20 @@ static void nv_link_irq(struct net_device *dev)
3277 dprintk(KERN_DEBUG "%s: link change notification done.\n", dev->name); 3277 dprintk(KERN_DEBUG "%s: link change notification done.\n", dev->name);
3278} 3278}
3279 3279
3280static void nv_msi_workaround(struct fe_priv *np)
3281{
3282
3283 /* Need to toggle the msi irq mask within the ethernet device,
3284 * otherwise, future interrupts will not be detected.
3285 */
3286 if (np->msi_flags & NV_MSI_ENABLED) {
3287 u8 __iomem *base = np->base;
3288
3289 writel(0, base + NvRegMSIIrqMask);
3290 writel(NVREG_MSI_VECTOR_0_ENABLED, base + NvRegMSIIrqMask);
3291 }
3292}
3293
3280static irqreturn_t nv_nic_irq(int foo, void *data) 3294static irqreturn_t nv_nic_irq(int foo, void *data)
3281{ 3295{
3282 struct net_device *dev = (struct net_device *) data; 3296 struct net_device *dev = (struct net_device *) data;
@@ -3299,6 +3313,8 @@ static irqreturn_t nv_nic_irq(int foo, void *data)
3299 if (!(events & np->irqmask)) 3313 if (!(events & np->irqmask))
3300 break; 3314 break;
3301 3315
3316 nv_msi_workaround(np);
3317
3302 spin_lock(&np->lock); 3318 spin_lock(&np->lock);
3303 nv_tx_done(dev); 3319 nv_tx_done(dev);
3304 spin_unlock(&np->lock); 3320 spin_unlock(&np->lock);
@@ -3414,6 +3430,8 @@ static irqreturn_t nv_nic_irq_optimized(int foo, void *data)
3414 if (!(events & np->irqmask)) 3430 if (!(events & np->irqmask))
3415 break; 3431 break;
3416 3432
3433 nv_msi_workaround(np);
3434
3417 spin_lock(&np->lock); 3435 spin_lock(&np->lock);
3418 nv_tx_done_optimized(dev, TX_WORK_PER_LOOP); 3436 nv_tx_done_optimized(dev, TX_WORK_PER_LOOP);
3419 spin_unlock(&np->lock); 3437 spin_unlock(&np->lock);
@@ -3754,6 +3772,8 @@ static irqreturn_t nv_nic_irq_test(int foo, void *data)
3754 if (!(events & NVREG_IRQ_TIMER)) 3772 if (!(events & NVREG_IRQ_TIMER))
3755 return IRQ_RETVAL(0); 3773 return IRQ_RETVAL(0);
3756 3774
3775 nv_msi_workaround(np);
3776
3757 spin_lock(&np->lock); 3777 spin_lock(&np->lock);
3758 np->intr_test = 1; 3778 np->intr_test = 1;
3759 spin_unlock(&np->lock); 3779 spin_unlock(&np->lock);
diff --git a/drivers/net/hamradio/baycom_epp.c b/drivers/net/hamradio/baycom_epp.c
index dde9c7e6408a..00bc7fbb6b37 100644
--- a/drivers/net/hamradio/baycom_epp.c
+++ b/drivers/net/hamradio/baycom_epp.c
@@ -959,7 +959,7 @@ static int epp_close(struct net_device *dev)
959 unsigned char tmp[1]; 959 unsigned char tmp[1];
960 960
961 bc->work_running = 0; 961 bc->work_running = 0;
962 flush_scheduled_work(); 962 cancel_delayed_work_sync(&bc->run_work);
963 bc->stat = EPP_DCDBIT; 963 bc->stat = EPP_DCDBIT;
964 tmp[0] = 0; 964 tmp[0] = 0;
965 pp->ops->epp_write_addr(pp, tmp, 1, 0); 965 pp->ops->epp_write_addr(pp, tmp, 1, 0);
diff --git a/drivers/net/ipg.c b/drivers/net/ipg.c
index 9b358f61ed7f..679a0826780e 100644
--- a/drivers/net/ipg.c
+++ b/drivers/net/ipg.c
@@ -577,12 +577,12 @@ static void ipg_nic_set_multicast_list(struct net_device *dev)
577 /* NIC to be configured in promiscuous mode. */ 577 /* NIC to be configured in promiscuous mode. */
578 receivemode = IPG_RM_RECEIVEALLFRAMES; 578 receivemode = IPG_RM_RECEIVEALLFRAMES;
579 } else if ((dev->flags & IFF_ALLMULTI) || 579 } else if ((dev->flags & IFF_ALLMULTI) ||
580 (dev->flags & IFF_MULTICAST & 580 ((dev->flags & IFF_MULTICAST) &&
581 (dev->mc_count > IPG_MULTICAST_HASHTABLE_SIZE))) { 581 (dev->mc_count > IPG_MULTICAST_HASHTABLE_SIZE))) {
582 /* NIC to be configured to receive all multicast 582 /* NIC to be configured to receive all multicast
583 * frames. */ 583 * frames. */
584 receivemode |= IPG_RM_RECEIVEMULTICAST; 584 receivemode |= IPG_RM_RECEIVEMULTICAST;
585 } else if (dev->flags & IFF_MULTICAST & (dev->mc_count > 0)) { 585 } else if ((dev->flags & IFF_MULTICAST) && (dev->mc_count > 0)) {
586 /* NIC to be configured to receive selected 586 /* NIC to be configured to receive selected
587 * multicast addresses. */ 587 * multicast addresses. */
588 receivemode |= IPG_RM_RECEIVEMULTICASTHASH; 588 receivemode |= IPG_RM_RECEIVEMULTICASTHASH;
diff --git a/drivers/net/ixgbe/ixgbe_82598.c b/drivers/net/ixgbe/ixgbe_82598.c
index 6321b059ce13..2f38e847e2cd 100644
--- a/drivers/net/ixgbe/ixgbe_82598.c
+++ b/drivers/net/ixgbe/ixgbe_82598.c
@@ -58,8 +58,8 @@ static s32 ixgbe_reset_hw_82598(struct ixgbe_hw *hw);
58 58
59static s32 ixgbe_get_invariants_82598(struct ixgbe_hw *hw) 59static s32 ixgbe_get_invariants_82598(struct ixgbe_hw *hw)
60{ 60{
61 hw->mac.num_rx_queues = IXGBE_82598_MAX_TX_QUEUES; 61 hw->mac.num_rx_queues = IXGBE_82598_MAX_RX_QUEUES;
62 hw->mac.num_tx_queues = IXGBE_82598_MAX_RX_QUEUES; 62 hw->mac.num_tx_queues = IXGBE_82598_MAX_TX_QUEUES;
63 hw->mac.num_rx_addrs = IXGBE_82598_RAR_ENTRIES; 63 hw->mac.num_rx_addrs = IXGBE_82598_RAR_ENTRIES;
64 64
65 /* PHY ops are filled in by default properly for Fiber only */ 65 /* PHY ops are filled in by default properly for Fiber only */
diff --git a/drivers/net/pppoe.c b/drivers/net/pppoe.c
index 58a26a47af29..bafb69b6f7cb 100644
--- a/drivers/net/pppoe.c
+++ b/drivers/net/pppoe.c
@@ -341,12 +341,6 @@ static int pppoe_rcv_core(struct sock *sk, struct sk_buff *skb)
341 struct pppox_sock *relay_po; 341 struct pppox_sock *relay_po;
342 342
343 if (sk->sk_state & PPPOX_BOUND) { 343 if (sk->sk_state & PPPOX_BOUND) {
344 struct pppoe_hdr *ph = pppoe_hdr(skb);
345 int len = ntohs(ph->length);
346 skb_pull_rcsum(skb, sizeof(struct pppoe_hdr));
347 if (pskb_trim_rcsum(skb, len))
348 goto abort_kfree;
349
350 ppp_input(&po->chan, skb); 344 ppp_input(&po->chan, skb);
351 } else if (sk->sk_state & PPPOX_RELAY) { 345 } else if (sk->sk_state & PPPOX_RELAY) {
352 relay_po = get_item_by_addr(&po->pppoe_relay); 346 relay_po = get_item_by_addr(&po->pppoe_relay);
@@ -357,7 +351,6 @@ static int pppoe_rcv_core(struct sock *sk, struct sk_buff *skb)
357 if ((sk_pppox(relay_po)->sk_state & PPPOX_CONNECTED) == 0) 351 if ((sk_pppox(relay_po)->sk_state & PPPOX_CONNECTED) == 0)
358 goto abort_put; 352 goto abort_put;
359 353
360 skb_pull(skb, sizeof(struct pppoe_hdr));
361 if (!__pppoe_xmit(sk_pppox(relay_po), skb)) 354 if (!__pppoe_xmit(sk_pppox(relay_po), skb))
362 goto abort_put; 355 goto abort_put;
363 } else { 356 } else {
@@ -388,6 +381,7 @@ static int pppoe_rcv(struct sk_buff *skb,
388{ 381{
389 struct pppoe_hdr *ph; 382 struct pppoe_hdr *ph;
390 struct pppox_sock *po; 383 struct pppox_sock *po;
384 int len;
391 385
392 if (!(skb = skb_share_check(skb, GFP_ATOMIC))) 386 if (!(skb = skb_share_check(skb, GFP_ATOMIC)))
393 goto out; 387 goto out;
@@ -399,10 +393,21 @@ static int pppoe_rcv(struct sk_buff *skb,
399 goto drop; 393 goto drop;
400 394
401 ph = pppoe_hdr(skb); 395 ph = pppoe_hdr(skb);
396 len = ntohs(ph->length);
397
398 skb_pull_rcsum(skb, sizeof(*ph));
399 if (skb->len < len)
400 goto drop;
402 401
403 po = get_item(ph->sid, eth_hdr(skb)->h_source, dev->ifindex); 402 po = get_item(ph->sid, eth_hdr(skb)->h_source, dev->ifindex);
404 if (po != NULL) 403 if (!po)
405 return sk_receive_skb(sk_pppox(po), skb, 0); 404 goto drop;
405
406 if (pskb_trim_rcsum(skb, len))
407 goto drop;
408
409 return sk_receive_skb(sk_pppox(po), skb, 0);
410
406drop: 411drop:
407 kfree_skb(skb); 412 kfree_skb(skb);
408out: 413out:
@@ -427,12 +432,12 @@ static int pppoe_disc_rcv(struct sk_buff *skb,
427 if (dev_net(dev) != &init_net) 432 if (dev_net(dev) != &init_net)
428 goto abort; 433 goto abort;
429 434
430 if (!pskb_may_pull(skb, sizeof(struct pppoe_hdr)))
431 goto abort;
432
433 if (!(skb = skb_share_check(skb, GFP_ATOMIC))) 435 if (!(skb = skb_share_check(skb, GFP_ATOMIC)))
434 goto out; 436 goto out;
435 437
438 if (!pskb_may_pull(skb, sizeof(struct pppoe_hdr)))
439 goto abort;
440
436 ph = pppoe_hdr(skb); 441 ph = pppoe_hdr(skb);
437 if (ph->code != PADT_CODE) 442 if (ph->code != PADT_CODE)
438 goto abort; 443 goto abort;
@@ -937,12 +942,10 @@ static int pppoe_recvmsg(struct kiocb *iocb, struct socket *sock,
937 m->msg_namelen = 0; 942 m->msg_namelen = 0;
938 943
939 if (skb) { 944 if (skb) {
940 struct pppoe_hdr *ph = pppoe_hdr(skb); 945 total_len = min(total_len, skb->len);
941 const int len = ntohs(ph->length); 946 error = skb_copy_datagram_iovec(skb, 0, m->msg_iov, total_len);
942
943 error = memcpy_toiovec(m->msg_iov, (unsigned char *) &ph->tag[0], len);
944 if (error == 0) 947 if (error == 0)
945 error = len; 948 error = total_len;
946 } 949 }
947 950
948 kfree_skb(skb); 951 kfree_skb(skb);
diff --git a/drivers/net/pppol2tp.c b/drivers/net/pppol2tp.c
index 70cfdb46aa27..f9298827a76c 100644
--- a/drivers/net/pppol2tp.c
+++ b/drivers/net/pppol2tp.c
@@ -783,14 +783,18 @@ static int pppol2tp_recvmsg(struct kiocb *iocb, struct socket *sock,
783 err = 0; 783 err = 0;
784 skb = skb_recv_datagram(sk, flags & ~MSG_DONTWAIT, 784 skb = skb_recv_datagram(sk, flags & ~MSG_DONTWAIT,
785 flags & MSG_DONTWAIT, &err); 785 flags & MSG_DONTWAIT, &err);
786 if (skb) { 786 if (!skb)
787 err = memcpy_toiovec(msg->msg_iov, (unsigned char *) skb->data, 787 goto end;
788 skb->len); 788
789 if (err < 0) 789 if (len > skb->len)
790 goto do_skb_free; 790 len = skb->len;
791 err = skb->len; 791 else if (len < skb->len)
792 } 792 msg->msg_flags |= MSG_TRUNC;
793do_skb_free: 793
794 err = skb_copy_datagram_iovec(skb, 0, msg->msg_iov, len);
795 if (likely(err == 0))
796 err = len;
797
794 kfree_skb(skb); 798 kfree_skb(skb);
795end: 799end:
796 return err; 800 return err;
diff --git a/drivers/net/r6040.c b/drivers/net/r6040.c
index 169edc154928..858b191517b3 100644
--- a/drivers/net/r6040.c
+++ b/drivers/net/r6040.c
@@ -733,7 +733,7 @@ static void r6040_timer(unsigned long data)
733 } 733 }
734 734
735 /* Timer active again */ 735 /* Timer active again */
736 mod_timer(&lp->timer, jiffies + round_jiffies(HZ)); 736 mod_timer(&lp->timer, round_jiffies(jiffies + HZ));
737} 737}
738 738
739/* Read/set MAC address routines */ 739/* Read/set MAC address routines */
diff --git a/drivers/net/s2io.c b/drivers/net/s2io.c
index dcc953e57ab1..5694e894fc7a 100644
--- a/drivers/net/s2io.c
+++ b/drivers/net/s2io.c
@@ -2861,7 +2861,8 @@ static int s2io_poll_msix(struct napi_struct *napi, int budget)
2861 struct config_param *config; 2861 struct config_param *config;
2862 struct mac_info *mac_control; 2862 struct mac_info *mac_control;
2863 int pkts_processed = 0; 2863 int pkts_processed = 0;
2864 u8 *addr = NULL, val8 = 0; 2864 u8 __iomem *addr = NULL;
2865 u8 val8 = 0;
2865 struct s2io_nic *nic = dev->priv; 2866 struct s2io_nic *nic = dev->priv;
2866 struct XENA_dev_config __iomem *bar0 = nic->bar0; 2867 struct XENA_dev_config __iomem *bar0 = nic->bar0;
2867 int budget_org = budget; 2868 int budget_org = budget;
@@ -2878,7 +2879,7 @@ static int s2io_poll_msix(struct napi_struct *napi, int budget)
2878 if (pkts_processed < budget_org) { 2879 if (pkts_processed < budget_org) {
2879 netif_rx_complete(dev, napi); 2880 netif_rx_complete(dev, napi);
2880 /*Re Enable MSI-Rx Vector*/ 2881 /*Re Enable MSI-Rx Vector*/
2881 addr = (u8 *)&bar0->xmsi_mask_reg; 2882 addr = (u8 __iomem *)&bar0->xmsi_mask_reg;
2882 addr += 7 - ring->ring_no; 2883 addr += 7 - ring->ring_no;
2883 val8 = (ring->ring_no == 0) ? 0x3f : 0xbf; 2884 val8 = (ring->ring_no == 0) ? 0x3f : 0xbf;
2884 writeb(val8, addr); 2885 writeb(val8, addr);
@@ -4364,9 +4365,10 @@ static irqreturn_t s2io_msix_ring_handle(int irq, void *dev_id)
4364 return IRQ_HANDLED; 4365 return IRQ_HANDLED;
4365 4366
4366 if (sp->config.napi) { 4367 if (sp->config.napi) {
4367 u8 *addr = NULL, val8 = 0; 4368 u8 __iomem *addr = NULL;
4369 u8 val8 = 0;
4368 4370
4369 addr = (u8 *)&bar0->xmsi_mask_reg; 4371 addr = (u8 __iomem *)&bar0->xmsi_mask_reg;
4370 addr += (7 - ring->ring_no); 4372 addr += (7 - ring->ring_no);
4371 val8 = (ring->ring_no == 0) ? 0x7f : 0xff; 4373 val8 = (ring->ring_no == 0) ? 0x7f : 0xff;
4372 writeb(val8, addr); 4374 writeb(val8, addr);
diff --git a/drivers/net/sfc/falcon.c b/drivers/net/sfc/falcon.c
index 8cb57987905e..630406e142e5 100644
--- a/drivers/net/sfc/falcon.c
+++ b/drivers/net/sfc/falcon.c
@@ -755,8 +755,10 @@ void falcon_fini_rx(struct efx_rx_queue *rx_queue)
755 continue; 755 continue;
756 break; 756 break;
757 } 757 }
758 if (rc) 758 if (rc) {
759 EFX_ERR(efx, "failed to flush rx queue %d\n", rx_queue->queue); 759 EFX_ERR(efx, "failed to flush rx queue %d\n", rx_queue->queue);
760 efx_schedule_reset(efx, RESET_TYPE_INVISIBLE);
761 }
760 762
761 /* Remove RX descriptor ring from card */ 763 /* Remove RX descriptor ring from card */
762 EFX_ZERO_OWORD(rx_desc_ptr); 764 EFX_ZERO_OWORD(rx_desc_ptr);
diff --git a/drivers/net/sky2.c b/drivers/net/sky2.c
index c83406f4f2a7..7f1cfc48e1b2 100644
--- a/drivers/net/sky2.c
+++ b/drivers/net/sky2.c
@@ -4536,7 +4536,9 @@ static int sky2_resume(struct pci_dev *pdev)
4536 if (err) { 4536 if (err) {
4537 printk(KERN_ERR PFX "%s: could not up: %d\n", 4537 printk(KERN_ERR PFX "%s: could not up: %d\n",
4538 dev->name, err); 4538 dev->name, err);
4539 rtnl_lock();
4539 dev_close(dev); 4540 dev_close(dev);
4541 rtnl_unlock();
4540 goto out; 4542 goto out;
4541 } 4543 }
4542 } 4544 }
diff --git a/drivers/net/smc911x.c b/drivers/net/smc911x.c
index fc605f276c00..c5871624f972 100644
--- a/drivers/net/smc911x.c
+++ b/drivers/net/smc911x.c
@@ -898,11 +898,11 @@ static void smc911x_phy_configure(struct work_struct *work)
898 * We should not be called if phy_type is zero. 898 * We should not be called if phy_type is zero.
899 */ 899 */
900 if (lp->phy_type == 0) 900 if (lp->phy_type == 0)
901 goto smc911x_phy_configure_exit_nolock; 901 return;
902 902
903 if (smc911x_phy_reset(dev, phyaddr)) { 903 if (smc911x_phy_reset(dev, phyaddr)) {
904 printk("%s: PHY reset timed out\n", dev->name); 904 printk("%s: PHY reset timed out\n", dev->name);
905 goto smc911x_phy_configure_exit_nolock; 905 return;
906 } 906 }
907 spin_lock_irqsave(&lp->lock, flags); 907 spin_lock_irqsave(&lp->lock, flags);
908 908
@@ -971,8 +971,6 @@ static void smc911x_phy_configure(struct work_struct *work)
971 971
972smc911x_phy_configure_exit: 972smc911x_phy_configure_exit:
973 spin_unlock_irqrestore(&lp->lock, flags); 973 spin_unlock_irqrestore(&lp->lock, flags);
974smc911x_phy_configure_exit_nolock:
975 lp->work_pending = 0;
976} 974}
977 975
978/* 976/*
@@ -1291,11 +1289,8 @@ static void smc911x_timeout(struct net_device *dev)
1291 * smc911x_phy_configure() calls msleep() which calls schedule_timeout() 1289 * smc911x_phy_configure() calls msleep() which calls schedule_timeout()
1292 * which calls schedule(). Hence we use a work queue. 1290 * which calls schedule(). Hence we use a work queue.
1293 */ 1291 */
1294 if (lp->phy_type != 0) { 1292 if (lp->phy_type != 0)
1295 if (schedule_work(&lp->phy_configure)) { 1293 schedule_work(&lp->phy_configure);
1296 lp->work_pending = 1;
1297 }
1298 }
1299 1294
1300 /* We can accept TX packets again */ 1295 /* We can accept TX packets again */
1301 dev->trans_start = jiffies; 1296 dev->trans_start = jiffies;
@@ -1465,16 +1460,8 @@ static int smc911x_close(struct net_device *dev)
1465 if (lp->phy_type != 0) { 1460 if (lp->phy_type != 0) {
1466 /* We need to ensure that no calls to 1461 /* We need to ensure that no calls to
1467 * smc911x_phy_configure are pending. 1462 * smc911x_phy_configure are pending.
1468
1469 * flush_scheduled_work() cannot be called because we
1470 * are running with the netlink semaphore held (from
1471 * devinet_ioctl()) and the pending work queue
1472 * contains linkwatch_event() (scheduled by
1473 * netif_carrier_off() above). linkwatch_event() also
1474 * wants the netlink semaphore.
1475 */ 1463 */
1476 while (lp->work_pending) 1464 cancel_work_sync(&lp->phy_configure);
1477 schedule();
1478 smc911x_phy_powerdown(dev, lp->mii.phy_id); 1465 smc911x_phy_powerdown(dev, lp->mii.phy_id);
1479 } 1466 }
1480 1467
diff --git a/drivers/net/smc911x.h b/drivers/net/smc911x.h
index 7cc7cd7e99cd..76c17c28fab4 100644
--- a/drivers/net/smc911x.h
+++ b/drivers/net/smc911x.h
@@ -79,7 +79,6 @@ struct smc911x_local {
79 79
80 /* work queue */ 80 /* work queue */
81 struct work_struct phy_configure; 81 struct work_struct phy_configure;
82 int work_pending;
83 82
84 int tx_throttle; 83 int tx_throttle;
85 spinlock_t lock; 84 spinlock_t lock;
diff --git a/drivers/net/smc91x.c b/drivers/net/smc91x.c
index a188e33484e6..f2051b209da2 100644
--- a/drivers/net/smc91x.c
+++ b/drivers/net/smc91x.c
@@ -1016,15 +1016,8 @@ static void smc_phy_powerdown(struct net_device *dev)
1016 1016
1017 /* We need to ensure that no calls to smc_phy_configure are 1017 /* We need to ensure that no calls to smc_phy_configure are
1018 pending. 1018 pending.
1019
1020 flush_scheduled_work() cannot be called because we are
1021 running with the netlink semaphore held (from
1022 devinet_ioctl()) and the pending work queue contains
1023 linkwatch_event() (scheduled by netif_carrier_off()
1024 above). linkwatch_event() also wants the netlink semaphore.
1025 */ 1019 */
1026 while(lp->work_pending) 1020 cancel_work_sync(&lp->phy_configure);
1027 yield();
1028 1021
1029 bmcr = smc_phy_read(dev, phy, MII_BMCR); 1022 bmcr = smc_phy_read(dev, phy, MII_BMCR);
1030 smc_phy_write(dev, phy, MII_BMCR, bmcr | BMCR_PDOWN); 1023 smc_phy_write(dev, phy, MII_BMCR, bmcr | BMCR_PDOWN);
@@ -1161,7 +1154,6 @@ static void smc_phy_configure(struct work_struct *work)
1161smc_phy_configure_exit: 1154smc_phy_configure_exit:
1162 SMC_SELECT_BANK(lp, 2); 1155 SMC_SELECT_BANK(lp, 2);
1163 spin_unlock_irq(&lp->lock); 1156 spin_unlock_irq(&lp->lock);
1164 lp->work_pending = 0;
1165} 1157}
1166 1158
1167/* 1159/*
@@ -1389,11 +1381,8 @@ static void smc_timeout(struct net_device *dev)
1389 * smc_phy_configure() calls msleep() which calls schedule_timeout() 1381 * smc_phy_configure() calls msleep() which calls schedule_timeout()
1390 * which calls schedule(). Hence we use a work queue. 1382 * which calls schedule(). Hence we use a work queue.
1391 */ 1383 */
1392 if (lp->phy_type != 0) { 1384 if (lp->phy_type != 0)
1393 if (schedule_work(&lp->phy_configure)) { 1385 schedule_work(&lp->phy_configure);
1394 lp->work_pending = 1;
1395 }
1396 }
1397 1386
1398 /* We can accept TX packets again */ 1387 /* We can accept TX packets again */
1399 dev->trans_start = jiffies; 1388 dev->trans_start = jiffies;
diff --git a/drivers/net/smc91x.h b/drivers/net/smc91x.h
index 69e97a1cb1c4..8606818653f8 100644
--- a/drivers/net/smc91x.h
+++ b/drivers/net/smc91x.h
@@ -93,14 +93,14 @@
93#define SMC_insw(a, r, p, l) insw ((unsigned long *)((a) + (r)), p, l) 93#define SMC_insw(a, r, p, l) insw ((unsigned long *)((a) + (r)), p, l)
94# endif 94# endif
95/* check if the mac in reg is valid */ 95/* check if the mac in reg is valid */
96#define SMC_GET_MAC_ADDR(addr) \ 96#define SMC_GET_MAC_ADDR(lp, addr) \
97 do { \ 97 do { \
98 unsigned int __v; \ 98 unsigned int __v; \
99 __v = SMC_inw(ioaddr, ADDR0_REG); \ 99 __v = SMC_inw(ioaddr, ADDR0_REG(lp)); \
100 addr[0] = __v; addr[1] = __v >> 8; \ 100 addr[0] = __v; addr[1] = __v >> 8; \
101 __v = SMC_inw(ioaddr, ADDR1_REG); \ 101 __v = SMC_inw(ioaddr, ADDR1_REG(lp)); \
102 addr[2] = __v; addr[3] = __v >> 8; \ 102 addr[2] = __v; addr[3] = __v >> 8; \
103 __v = SMC_inw(ioaddr, ADDR2_REG); \ 103 __v = SMC_inw(ioaddr, ADDR2_REG(lp)); \
104 addr[4] = __v; addr[5] = __v >> 8; \ 104 addr[4] = __v; addr[5] = __v >> 8; \
105 if (*(u32 *)(&addr[0]) == 0xFFFFFFFF) { \ 105 if (*(u32 *)(&addr[0]) == 0xFFFFFFFF) { \
106 random_ether_addr(addr); \ 106 random_ether_addr(addr); \
diff --git a/drivers/net/tulip/tulip_core.c b/drivers/net/tulip/tulip_core.c
index 55670b5eb611..af8d2c436efd 100644
--- a/drivers/net/tulip/tulip_core.c
+++ b/drivers/net/tulip/tulip_core.c
@@ -731,7 +731,7 @@ static void tulip_down (struct net_device *dev)
731 void __iomem *ioaddr = tp->base_addr; 731 void __iomem *ioaddr = tp->base_addr;
732 unsigned long flags; 732 unsigned long flags;
733 733
734 flush_scheduled_work(); 734 cancel_work_sync(&tp->media_work);
735 735
736#ifdef CONFIG_TULIP_NAPI 736#ifdef CONFIG_TULIP_NAPI
737 napi_disable(&tp->napi); 737 napi_disable(&tp->napi);
diff --git a/drivers/net/usb/kaweth.c b/drivers/net/usb/kaweth.c
index 0dcfc0310264..7c66b052f55a 100644
--- a/drivers/net/usb/kaweth.c
+++ b/drivers/net/usb/kaweth.c
@@ -706,7 +706,7 @@ static void kaweth_kill_urbs(struct kaweth_device *kaweth)
706 usb_kill_urb(kaweth->rx_urb); 706 usb_kill_urb(kaweth->rx_urb);
707 usb_kill_urb(kaweth->tx_urb); 707 usb_kill_urb(kaweth->tx_urb);
708 708
709 flush_scheduled_work(); 709 cancel_delayed_work_sync(&kaweth->lowmem_work);
710 710
711 /* a scheduled work may have resubmitted, 711 /* a scheduled work may have resubmitted,
712 we hit them again */ 712 we hit them again */
diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c
index 5450eac9e263..4452306d5328 100644
--- a/drivers/net/virtio_net.c
+++ b/drivers/net/virtio_net.c
@@ -44,11 +44,15 @@ struct virtnet_info
44 /* The skb we couldn't send because buffers were full. */ 44 /* The skb we couldn't send because buffers were full. */
45 struct sk_buff *last_xmit_skb; 45 struct sk_buff *last_xmit_skb;
46 46
47 /* If we need to free in a timer, this is it. */
48 struct timer_list xmit_free_timer;
49
47 /* Number of input buffers, and max we've ever had. */ 50 /* Number of input buffers, and max we've ever had. */
48 unsigned int num, max; 51 unsigned int num, max;
49 52
50 /* For cleaning up after transmission. */ 53 /* For cleaning up after transmission. */
51 struct tasklet_struct tasklet; 54 struct tasklet_struct tasklet;
55 bool free_in_tasklet;
52 56
53 /* Receive & send queues. */ 57 /* Receive & send queues. */
54 struct sk_buff_head recv; 58 struct sk_buff_head recv;
@@ -72,7 +76,7 @@ static void skb_xmit_done(struct virtqueue *svq)
72 /* Suppress further interrupts. */ 76 /* Suppress further interrupts. */
73 svq->vq_ops->disable_cb(svq); 77 svq->vq_ops->disable_cb(svq);
74 78
75 /* We were waiting for more output buffers. */ 79 /* We were probably waiting for more output buffers. */
76 netif_wake_queue(vi->dev); 80 netif_wake_queue(vi->dev);
77 81
78 /* Make sure we re-xmit last_xmit_skb: if there are no more packets 82 /* Make sure we re-xmit last_xmit_skb: if there are no more packets
@@ -94,9 +98,7 @@ static void receive_skb(struct net_device *dev, struct sk_buff *skb,
94 BUG_ON(len > MAX_PACKET_LEN); 98 BUG_ON(len > MAX_PACKET_LEN);
95 99
96 skb_trim(skb, len); 100 skb_trim(skb, len);
97 skb->protocol = eth_type_trans(skb, dev); 101
98 pr_debug("Receiving skb proto 0x%04x len %i type %i\n",
99 ntohs(skb->protocol), skb->len, skb->pkt_type);
100 dev->stats.rx_bytes += skb->len; 102 dev->stats.rx_bytes += skb->len;
101 dev->stats.rx_packets++; 103 dev->stats.rx_packets++;
102 104
@@ -106,6 +108,10 @@ static void receive_skb(struct net_device *dev, struct sk_buff *skb,
106 goto frame_err; 108 goto frame_err;
107 } 109 }
108 110
111 skb->protocol = eth_type_trans(skb, dev);
112 pr_debug("Receiving skb proto 0x%04x len %i type %i\n",
113 ntohs(skb->protocol), skb->len, skb->pkt_type);
114
109 if (hdr->gso_type != VIRTIO_NET_HDR_GSO_NONE) { 115 if (hdr->gso_type != VIRTIO_NET_HDR_GSO_NONE) {
110 pr_debug("GSO!\n"); 116 pr_debug("GSO!\n");
111 switch (hdr->gso_type & ~VIRTIO_NET_HDR_GSO_ECN) { 117 switch (hdr->gso_type & ~VIRTIO_NET_HDR_GSO_ECN) {
@@ -238,9 +244,25 @@ static void free_old_xmit_skbs(struct virtnet_info *vi)
238 } 244 }
239} 245}
240 246
247/* If the virtio transport doesn't always notify us when all in-flight packets
248 * are consumed, we fall back to using this function on a timer to free them. */
249static void xmit_free(unsigned long data)
250{
251 struct virtnet_info *vi = (void *)data;
252
253 netif_tx_lock(vi->dev);
254
255 free_old_xmit_skbs(vi);
256
257 if (!skb_queue_empty(&vi->send))
258 mod_timer(&vi->xmit_free_timer, jiffies + (HZ/10));
259
260 netif_tx_unlock(vi->dev);
261}
262
241static int xmit_skb(struct virtnet_info *vi, struct sk_buff *skb) 263static int xmit_skb(struct virtnet_info *vi, struct sk_buff *skb)
242{ 264{
243 int num; 265 int num, err;
244 struct scatterlist sg[2+MAX_SKB_FRAGS]; 266 struct scatterlist sg[2+MAX_SKB_FRAGS];
245 struct virtio_net_hdr *hdr; 267 struct virtio_net_hdr *hdr;
246 const unsigned char *dest = ((struct ethhdr *)skb->data)->h_dest; 268 const unsigned char *dest = ((struct ethhdr *)skb->data)->h_dest;
@@ -283,7 +305,11 @@ static int xmit_skb(struct virtnet_info *vi, struct sk_buff *skb)
283 vnet_hdr_to_sg(sg, skb); 305 vnet_hdr_to_sg(sg, skb);
284 num = skb_to_sgvec(skb, sg+1, 0, skb->len) + 1; 306 num = skb_to_sgvec(skb, sg+1, 0, skb->len) + 1;
285 307
286 return vi->svq->vq_ops->add_buf(vi->svq, sg, num, 0, skb); 308 err = vi->svq->vq_ops->add_buf(vi->svq, sg, num, 0, skb);
309 if (!err && !vi->free_in_tasklet)
310 mod_timer(&vi->xmit_free_timer, jiffies + (HZ/10));
311
312 return err;
287} 313}
288 314
289static void xmit_tasklet(unsigned long data) 315static void xmit_tasklet(unsigned long data)
@@ -295,6 +321,8 @@ static void xmit_tasklet(unsigned long data)
295 vi->svq->vq_ops->kick(vi->svq); 321 vi->svq->vq_ops->kick(vi->svq);
296 vi->last_xmit_skb = NULL; 322 vi->last_xmit_skb = NULL;
297 } 323 }
324 if (vi->free_in_tasklet)
325 free_old_xmit_skbs(vi);
298 netif_tx_unlock_bh(vi->dev); 326 netif_tx_unlock_bh(vi->dev);
299} 327}
300 328
@@ -435,6 +463,10 @@ static int virtnet_probe(struct virtio_device *vdev)
435 vi->vdev = vdev; 463 vi->vdev = vdev;
436 vdev->priv = vi; 464 vdev->priv = vi;
437 465
466 /* If they give us a callback when all buffers are done, we don't need
467 * the timer. */
468 vi->free_in_tasklet = virtio_has_feature(vdev,VIRTIO_F_NOTIFY_ON_EMPTY);
469
438 /* We expect two virtqueues, receive then send. */ 470 /* We expect two virtqueues, receive then send. */
439 vi->rvq = vdev->config->find_vq(vdev, 0, skb_recv_done); 471 vi->rvq = vdev->config->find_vq(vdev, 0, skb_recv_done);
440 if (IS_ERR(vi->rvq)) { 472 if (IS_ERR(vi->rvq)) {
@@ -454,6 +486,9 @@ static int virtnet_probe(struct virtio_device *vdev)
454 486
455 tasklet_init(&vi->tasklet, xmit_tasklet, (unsigned long)vi); 487 tasklet_init(&vi->tasklet, xmit_tasklet, (unsigned long)vi);
456 488
489 if (!vi->free_in_tasklet)
490 setup_timer(&vi->xmit_free_timer, xmit_free, (unsigned long)vi);
491
457 err = register_netdev(dev); 492 err = register_netdev(dev);
458 if (err) { 493 if (err) {
459 pr_debug("virtio_net: registering device failed\n"); 494 pr_debug("virtio_net: registering device failed\n");
@@ -491,6 +526,9 @@ static void virtnet_remove(struct virtio_device *vdev)
491 /* Stop all the virtqueues. */ 526 /* Stop all the virtqueues. */
492 vdev->config->reset(vdev); 527 vdev->config->reset(vdev);
493 528
529 if (!vi->free_in_tasklet)
530 del_timer_sync(&vi->xmit_free_timer);
531
494 /* Free our skbs in send and recv queues, if any. */ 532 /* Free our skbs in send and recv queues, if any. */
495 while ((skb = __skb_dequeue(&vi->recv)) != NULL) { 533 while ((skb = __skb_dequeue(&vi->recv)) != NULL) {
496 kfree_skb(skb); 534 kfree_skb(skb);
@@ -514,7 +552,7 @@ static struct virtio_device_id id_table[] = {
514static unsigned int features[] = { 552static unsigned int features[] = {
515 VIRTIO_NET_F_CSUM, VIRTIO_NET_F_GSO, VIRTIO_NET_F_MAC, 553 VIRTIO_NET_F_CSUM, VIRTIO_NET_F_GSO, VIRTIO_NET_F_MAC,
516 VIRTIO_NET_F_HOST_TSO4, VIRTIO_NET_F_HOST_UFO, VIRTIO_NET_F_HOST_TSO6, 554 VIRTIO_NET_F_HOST_TSO4, VIRTIO_NET_F_HOST_UFO, VIRTIO_NET_F_HOST_TSO6,
517 VIRTIO_NET_F_HOST_ECN, 555 VIRTIO_NET_F_HOST_ECN, VIRTIO_F_NOTIFY_ON_EMPTY,
518}; 556};
519 557
520static struct virtio_driver virtio_net = { 558static struct virtio_driver virtio_net = {
diff --git a/drivers/net/wireless/hostap/hostap_main.c b/drivers/net/wireless/hostap/hostap_main.c
index 20d387f6658c..f7aec9309d04 100644
--- a/drivers/net/wireless/hostap/hostap_main.c
+++ b/drivers/net/wireless/hostap/hostap_main.c
@@ -682,7 +682,13 @@ static int prism2_close(struct net_device *dev)
682 netif_device_detach(dev); 682 netif_device_detach(dev);
683 } 683 }
684 684
685 flush_scheduled_work(); 685 cancel_work_sync(&local->reset_queue);
686 cancel_work_sync(&local->set_multicast_list_queue);
687 cancel_work_sync(&local->set_tim_queue);
688#ifndef PRISM2_NO_STATION_MODES
689 cancel_work_sync(&local->info_queue);
690#endif
691 cancel_work_sync(&local->comms_qual_update);
686 692
687 module_put(local->hw_module); 693 module_put(local->hw_module);
688 694