diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2009-08-24 15:25:03 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-08-24 15:25:03 -0400 |
| commit | 1cac6ec9b7f9c48a26309380656f399a0587b860 (patch) | |
| tree | dac346c856ce2a41641152c0bf9c13935bd65175 | |
| parent | ce0cfd4ca817dbfd5f8267e7a6a235ed2041bf4a (diff) | |
| parent | 8ff499e43c537648399fca8ba39d24c0768b3fab (diff) | |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6:
smc91x: let smc91x work well under netpoll
pxaficp-ir: remove incorrect net_device_ops
NET: llc, zero sockaddr_llc struct
drivers/net: fixed drivers that support netpoll use ndo_start_xmit()
netpoll: warning for ndo_start_xmit returns with interrupts enabled
net: Fix Micrel KSZ8842 Kconfig description
netfilter: xt_quota: fix wrong return value (error case)
ipv6: Fix commit 63d9950b08184e6531adceb65f64b429909cc101 (ipv6: Make v4-mapped bindings consistent with IPv4)
E100: fix interaction with swiotlb on X86.
pkt_sched: Convert CBQ to tasklet_hrtimer.
pkt_sched: Convert qdisc_watchdog to tasklet_hrtimer
rtl8187: always set MSR_LINK_ENEDCA flag with RTL8187B
ibm_newemac: emac_close() needs to call netif_carrier_off()
net: fix ks8851 build errors
net: Rename MAC platform driver for w90p910 platform
yellowfin: Fix buffer underrun after dev_alloc_skb() failure
orinoco: correct key bounds check in orinoco_hw_get_tkip_iv
mac80211: fix todo lock
| -rw-r--r-- | drivers/net/Kconfig | 4 | ||||
| -rw-r--r-- | drivers/net/arm/w90p910_ether.c | 4 | ||||
| -rw-r--r-- | drivers/net/e100.c | 2 | ||||
| -rw-r--r-- | drivers/net/fec_mpc52xx.c | 5 | ||||
| -rw-r--r-- | drivers/net/ibm_newemac/core.c | 2 | ||||
| -rw-r--r-- | drivers/net/irda/pxaficp_ir.c | 4 | ||||
| -rw-r--r-- | drivers/net/ixp2000/ixpdev.c | 5 | ||||
| -rw-r--r-- | drivers/net/macb.c | 7 | ||||
| -rw-r--r-- | drivers/net/mlx4/en_tx.c | 5 | ||||
| -rw-r--r-- | drivers/net/smc91x.c | 40 | ||||
| -rw-r--r-- | drivers/net/wireless/orinoco/hw.c | 2 | ||||
| -rw-r--r-- | drivers/net/wireless/rtl818x/rtl8187_dev.c | 14 | ||||
| -rw-r--r-- | drivers/net/yellowfin.c | 28 | ||||
| -rw-r--r-- | include/net/pkt_sched.h | 4 | ||||
| -rw-r--r-- | net/core/netpoll.c | 5 | ||||
| -rw-r--r-- | net/ipv6/af_inet6.c | 4 | ||||
| -rw-r--r-- | net/llc/af_llc.c | 1 | ||||
| -rw-r--r-- | net/mac80211/key.c | 28 | ||||
| -rw-r--r-- | net/netfilter/xt_quota.c | 2 | ||||
| -rw-r--r-- | net/sched/sch_api.c | 8 | ||||
| -rw-r--r-- | net/sched/sch_cbq.c | 23 |
21 files changed, 117 insertions, 80 deletions
diff --git a/drivers/net/Kconfig b/drivers/net/Kconfig index 5f6509a5f640..5ce7cbabd7a7 100644 --- a/drivers/net/Kconfig +++ b/drivers/net/Kconfig | |||
| @@ -1727,12 +1727,14 @@ config KS8842 | |||
| 1727 | tristate "Micrel KSZ8842" | 1727 | tristate "Micrel KSZ8842" |
| 1728 | depends on HAS_IOMEM | 1728 | depends on HAS_IOMEM |
| 1729 | help | 1729 | help |
| 1730 | This platform driver is for Micrel KSZ8842 chip. | 1730 | This platform driver is for Micrel KSZ8842 / KS8842 |
| 1731 | 2-port ethernet switch chip (managed, VLAN, QoS). | ||
| 1731 | 1732 | ||
| 1732 | config KS8851 | 1733 | config KS8851 |
| 1733 | tristate "Micrel KS8851 SPI" | 1734 | tristate "Micrel KS8851 SPI" |
| 1734 | depends on SPI | 1735 | depends on SPI |
| 1735 | select MII | 1736 | select MII |
| 1737 | select CRC32 | ||
| 1736 | help | 1738 | help |
| 1737 | SPI driver for Micrel KS8851 SPI attached network chip. | 1739 | SPI driver for Micrel KS8851 SPI attached network chip. |
| 1738 | 1740 | ||
diff --git a/drivers/net/arm/w90p910_ether.c b/drivers/net/arm/w90p910_ether.c index 616fb7985a34..ddd231cb54b7 100644 --- a/drivers/net/arm/w90p910_ether.c +++ b/drivers/net/arm/w90p910_ether.c | |||
| @@ -1080,7 +1080,7 @@ static struct platform_driver w90p910_ether_driver = { | |||
| 1080 | .probe = w90p910_ether_probe, | 1080 | .probe = w90p910_ether_probe, |
| 1081 | .remove = __devexit_p(w90p910_ether_remove), | 1081 | .remove = __devexit_p(w90p910_ether_remove), |
| 1082 | .driver = { | 1082 | .driver = { |
| 1083 | .name = "w90p910-emc", | 1083 | .name = "nuc900-emc", |
| 1084 | .owner = THIS_MODULE, | 1084 | .owner = THIS_MODULE, |
| 1085 | }, | 1085 | }, |
| 1086 | }; | 1086 | }; |
| @@ -1101,5 +1101,5 @@ module_exit(w90p910_ether_exit); | |||
| 1101 | MODULE_AUTHOR("Wan ZongShun <mcuos.com@gmail.com>"); | 1101 | MODULE_AUTHOR("Wan ZongShun <mcuos.com@gmail.com>"); |
| 1102 | MODULE_DESCRIPTION("w90p910 MAC driver!"); | 1102 | MODULE_DESCRIPTION("w90p910 MAC driver!"); |
| 1103 | MODULE_LICENSE("GPL"); | 1103 | MODULE_LICENSE("GPL"); |
| 1104 | MODULE_ALIAS("platform:w90p910-emc"); | 1104 | MODULE_ALIAS("platform:nuc900-emc"); |
| 1105 | 1105 | ||
diff --git a/drivers/net/e100.c b/drivers/net/e100.c index 41b648a67fec..3a6735dc9f6a 100644 --- a/drivers/net/e100.c +++ b/drivers/net/e100.c | |||
| @@ -1899,7 +1899,7 @@ static int e100_rx_indicate(struct nic *nic, struct rx *rx, | |||
| 1899 | nic->ru_running = RU_SUSPENDED; | 1899 | nic->ru_running = RU_SUSPENDED; |
| 1900 | pci_dma_sync_single_for_device(nic->pdev, rx->dma_addr, | 1900 | pci_dma_sync_single_for_device(nic->pdev, rx->dma_addr, |
| 1901 | sizeof(struct rfd), | 1901 | sizeof(struct rfd), |
| 1902 | PCI_DMA_BIDIRECTIONAL); | 1902 | PCI_DMA_FROMDEVICE); |
| 1903 | return -ENODATA; | 1903 | return -ENODATA; |
| 1904 | } | 1904 | } |
| 1905 | 1905 | ||
diff --git a/drivers/net/fec_mpc52xx.c b/drivers/net/fec_mpc52xx.c index cc786333d95c..c40113f58963 100644 --- a/drivers/net/fec_mpc52xx.c +++ b/drivers/net/fec_mpc52xx.c | |||
| @@ -309,6 +309,7 @@ static int mpc52xx_fec_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
| 309 | { | 309 | { |
| 310 | struct mpc52xx_fec_priv *priv = netdev_priv(dev); | 310 | struct mpc52xx_fec_priv *priv = netdev_priv(dev); |
| 311 | struct bcom_fec_bd *bd; | 311 | struct bcom_fec_bd *bd; |
| 312 | unsigned long flags; | ||
| 312 | 313 | ||
| 313 | if (bcom_queue_full(priv->tx_dmatsk)) { | 314 | if (bcom_queue_full(priv->tx_dmatsk)) { |
| 314 | if (net_ratelimit()) | 315 | if (net_ratelimit()) |
| @@ -316,7 +317,7 @@ static int mpc52xx_fec_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
| 316 | return NETDEV_TX_BUSY; | 317 | return NETDEV_TX_BUSY; |
| 317 | } | 318 | } |
| 318 | 319 | ||
| 319 | spin_lock_irq(&priv->lock); | 320 | spin_lock_irqsave(&priv->lock, flags); |
| 320 | dev->trans_start = jiffies; | 321 | dev->trans_start = jiffies; |
| 321 | 322 | ||
| 322 | bd = (struct bcom_fec_bd *) | 323 | bd = (struct bcom_fec_bd *) |
| @@ -332,7 +333,7 @@ static int mpc52xx_fec_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
| 332 | netif_stop_queue(dev); | 333 | netif_stop_queue(dev); |
| 333 | } | 334 | } |
| 334 | 335 | ||
| 335 | spin_unlock_irq(&priv->lock); | 336 | spin_unlock_irqrestore(&priv->lock, flags); |
| 336 | 337 | ||
| 337 | return NETDEV_TX_OK; | 338 | return NETDEV_TX_OK; |
| 338 | } | 339 | } |
diff --git a/drivers/net/ibm_newemac/core.c b/drivers/net/ibm_newemac/core.c index beb84213b671..f0f890803710 100644 --- a/drivers/net/ibm_newemac/core.c +++ b/drivers/net/ibm_newemac/core.c | |||
| @@ -1305,6 +1305,8 @@ static int emac_close(struct net_device *ndev) | |||
| 1305 | 1305 | ||
| 1306 | free_irq(dev->emac_irq, dev); | 1306 | free_irq(dev->emac_irq, dev); |
| 1307 | 1307 | ||
| 1308 | netif_carrier_off(ndev); | ||
| 1309 | |||
| 1308 | return 0; | 1310 | return 0; |
| 1309 | } | 1311 | } |
| 1310 | 1312 | ||
diff --git a/drivers/net/irda/pxaficp_ir.c b/drivers/net/irda/pxaficp_ir.c index 3376a4f39e0a..77d10edefd25 100644 --- a/drivers/net/irda/pxaficp_ir.c +++ b/drivers/net/irda/pxaficp_ir.c | |||
| @@ -803,9 +803,6 @@ static const struct net_device_ops pxa_irda_netdev_ops = { | |||
| 803 | .ndo_stop = pxa_irda_stop, | 803 | .ndo_stop = pxa_irda_stop, |
| 804 | .ndo_start_xmit = pxa_irda_hard_xmit, | 804 | .ndo_start_xmit = pxa_irda_hard_xmit, |
| 805 | .ndo_do_ioctl = pxa_irda_ioctl, | 805 | .ndo_do_ioctl = pxa_irda_ioctl, |
| 806 | .ndo_change_mtu = eth_change_mtu, | ||
| 807 | .ndo_validate_addr = eth_validate_addr, | ||
| 808 | .ndo_set_mac_address = eth_mac_addr, | ||
| 809 | }; | 806 | }; |
| 810 | 807 | ||
| 811 | static int pxa_irda_probe(struct platform_device *pdev) | 808 | static int pxa_irda_probe(struct platform_device *pdev) |
| @@ -830,6 +827,7 @@ static int pxa_irda_probe(struct platform_device *pdev) | |||
| 830 | if (!dev) | 827 | if (!dev) |
| 831 | goto err_mem_3; | 828 | goto err_mem_3; |
| 832 | 829 | ||
| 830 | SET_NETDEV_DEV(dev, &pdev->dev); | ||
| 833 | si = netdev_priv(dev); | 831 | si = netdev_priv(dev); |
| 834 | si->dev = &pdev->dev; | 832 | si->dev = &pdev->dev; |
| 835 | si->pdata = pdev->dev.platform_data; | 833 | si->pdata = pdev->dev.platform_data; |
diff --git a/drivers/net/ixp2000/ixpdev.c b/drivers/net/ixp2000/ixpdev.c index 2a0174b62e96..92fb8235c766 100644 --- a/drivers/net/ixp2000/ixpdev.c +++ b/drivers/net/ixp2000/ixpdev.c | |||
| @@ -41,6 +41,7 @@ static int ixpdev_xmit(struct sk_buff *skb, struct net_device *dev) | |||
| 41 | struct ixpdev_priv *ip = netdev_priv(dev); | 41 | struct ixpdev_priv *ip = netdev_priv(dev); |
| 42 | struct ixpdev_tx_desc *desc; | 42 | struct ixpdev_tx_desc *desc; |
| 43 | int entry; | 43 | int entry; |
| 44 | unsigned long flags; | ||
| 44 | 45 | ||
| 45 | if (unlikely(skb->len > PAGE_SIZE)) { | 46 | if (unlikely(skb->len > PAGE_SIZE)) { |
| 46 | /* @@@ Count drops. */ | 47 | /* @@@ Count drops. */ |
| @@ -63,11 +64,11 @@ static int ixpdev_xmit(struct sk_buff *skb, struct net_device *dev) | |||
| 63 | 64 | ||
| 64 | dev->trans_start = jiffies; | 65 | dev->trans_start = jiffies; |
| 65 | 66 | ||
| 66 | local_irq_disable(); | 67 | local_irq_save(flags); |
| 67 | ip->tx_queue_entries++; | 68 | ip->tx_queue_entries++; |
| 68 | if (ip->tx_queue_entries == TX_BUF_COUNT_PER_CHAN) | 69 | if (ip->tx_queue_entries == TX_BUF_COUNT_PER_CHAN) |
| 69 | netif_stop_queue(dev); | 70 | netif_stop_queue(dev); |
| 70 | local_irq_enable(); | 71 | local_irq_restore(flags); |
| 71 | 72 | ||
| 72 | return 0; | 73 | return 0; |
| 73 | } | 74 | } |
diff --git a/drivers/net/macb.c b/drivers/net/macb.c index 5b5c25368d1e..e3601cf3f931 100644 --- a/drivers/net/macb.c +++ b/drivers/net/macb.c | |||
| @@ -620,6 +620,7 @@ static int macb_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
| 620 | dma_addr_t mapping; | 620 | dma_addr_t mapping; |
| 621 | unsigned int len, entry; | 621 | unsigned int len, entry; |
| 622 | u32 ctrl; | 622 | u32 ctrl; |
| 623 | unsigned long flags; | ||
| 623 | 624 | ||
| 624 | #ifdef DEBUG | 625 | #ifdef DEBUG |
| 625 | int i; | 626 | int i; |
| @@ -635,12 +636,12 @@ static int macb_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
| 635 | #endif | 636 | #endif |
| 636 | 637 | ||
| 637 | len = skb->len; | 638 | len = skb->len; |
| 638 | spin_lock_irq(&bp->lock); | 639 | spin_lock_irqsave(&bp->lock, flags); |
| 639 | 640 | ||
| 640 | /* This is a hard error, log it. */ | 641 | /* This is a hard error, log it. */ |
| 641 | if (TX_BUFFS_AVAIL(bp) < 1) { | 642 | if (TX_BUFFS_AVAIL(bp) < 1) { |
| 642 | netif_stop_queue(dev); | 643 | netif_stop_queue(dev); |
| 643 | spin_unlock_irq(&bp->lock); | 644 | spin_unlock_irqrestore(&bp->lock, flags); |
| 644 | dev_err(&bp->pdev->dev, | 645 | dev_err(&bp->pdev->dev, |
| 645 | "BUG! Tx Ring full when queue awake!\n"); | 646 | "BUG! Tx Ring full when queue awake!\n"); |
| 646 | dev_dbg(&bp->pdev->dev, "tx_head = %u, tx_tail = %u\n", | 647 | dev_dbg(&bp->pdev->dev, "tx_head = %u, tx_tail = %u\n", |
| @@ -674,7 +675,7 @@ static int macb_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
| 674 | if (TX_BUFFS_AVAIL(bp) < 1) | 675 | if (TX_BUFFS_AVAIL(bp) < 1) |
| 675 | netif_stop_queue(dev); | 676 | netif_stop_queue(dev); |
| 676 | 677 | ||
| 677 | spin_unlock_irq(&bp->lock); | 678 | spin_unlock_irqrestore(&bp->lock, flags); |
| 678 | 679 | ||
| 679 | dev->trans_start = jiffies; | 680 | dev->trans_start = jiffies; |
| 680 | 681 | ||
diff --git a/drivers/net/mlx4/en_tx.c b/drivers/net/mlx4/en_tx.c index 5a88b3f57693..62208401c4df 100644 --- a/drivers/net/mlx4/en_tx.c +++ b/drivers/net/mlx4/en_tx.c | |||
| @@ -437,6 +437,7 @@ static inline void mlx4_en_xmit_poll(struct mlx4_en_priv *priv, int tx_ind) | |||
| 437 | { | 437 | { |
| 438 | struct mlx4_en_cq *cq = &priv->tx_cq[tx_ind]; | 438 | struct mlx4_en_cq *cq = &priv->tx_cq[tx_ind]; |
| 439 | struct mlx4_en_tx_ring *ring = &priv->tx_ring[tx_ind]; | 439 | struct mlx4_en_tx_ring *ring = &priv->tx_ring[tx_ind]; |
| 440 | unsigned long flags; | ||
| 440 | 441 | ||
| 441 | /* If we don't have a pending timer, set one up to catch our recent | 442 | /* If we don't have a pending timer, set one up to catch our recent |
| 442 | post in case the interface becomes idle */ | 443 | post in case the interface becomes idle */ |
| @@ -445,9 +446,9 @@ static inline void mlx4_en_xmit_poll(struct mlx4_en_priv *priv, int tx_ind) | |||
| 445 | 446 | ||
| 446 | /* Poll the CQ every mlx4_en_TX_MODER_POLL packets */ | 447 | /* Poll the CQ every mlx4_en_TX_MODER_POLL packets */ |
| 447 | if ((++ring->poll_cnt & (MLX4_EN_TX_POLL_MODER - 1)) == 0) | 448 | if ((++ring->poll_cnt & (MLX4_EN_TX_POLL_MODER - 1)) == 0) |
| 448 | if (spin_trylock_irq(&ring->comp_lock)) { | 449 | if (spin_trylock_irqsave(&ring->comp_lock, flags)) { |
| 449 | mlx4_en_process_tx_cq(priv->dev, cq); | 450 | mlx4_en_process_tx_cq(priv->dev, cq); |
| 450 | spin_unlock_irq(&ring->comp_lock); | 451 | spin_unlock_irqrestore(&ring->comp_lock, flags); |
| 451 | } | 452 | } |
| 452 | } | 453 | } |
| 453 | 454 | ||
diff --git a/drivers/net/smc91x.c b/drivers/net/smc91x.c index 1c70e999cc50..9da1fa12a67c 100644 --- a/drivers/net/smc91x.c +++ b/drivers/net/smc91x.c | |||
| @@ -196,21 +196,23 @@ static void PRINT_PKT(u_char *buf, int length) | |||
| 196 | /* this enables an interrupt in the interrupt mask register */ | 196 | /* this enables an interrupt in the interrupt mask register */ |
| 197 | #define SMC_ENABLE_INT(lp, x) do { \ | 197 | #define SMC_ENABLE_INT(lp, x) do { \ |
| 198 | unsigned char mask; \ | 198 | unsigned char mask; \ |
| 199 | spin_lock_irq(&lp->lock); \ | 199 | unsigned long smc_enable_flags; \ |
| 200 | spin_lock_irqsave(&lp->lock, smc_enable_flags); \ | ||
| 200 | mask = SMC_GET_INT_MASK(lp); \ | 201 | mask = SMC_GET_INT_MASK(lp); \ |
| 201 | mask |= (x); \ | 202 | mask |= (x); \ |
| 202 | SMC_SET_INT_MASK(lp, mask); \ | 203 | SMC_SET_INT_MASK(lp, mask); \ |
| 203 | spin_unlock_irq(&lp->lock); \ | 204 | spin_unlock_irqrestore(&lp->lock, smc_enable_flags); \ |
| 204 | } while (0) | 205 | } while (0) |
| 205 | 206 | ||
| 206 | /* this disables an interrupt from the interrupt mask register */ | 207 | /* this disables an interrupt from the interrupt mask register */ |
| 207 | #define SMC_DISABLE_INT(lp, x) do { \ | 208 | #define SMC_DISABLE_INT(lp, x) do { \ |
| 208 | unsigned char mask; \ | 209 | unsigned char mask; \ |
| 209 | spin_lock_irq(&lp->lock); \ | 210 | unsigned long smc_disable_flags; \ |
| 211 | spin_lock_irqsave(&lp->lock, smc_disable_flags); \ | ||
| 210 | mask = SMC_GET_INT_MASK(lp); \ | 212 | mask = SMC_GET_INT_MASK(lp); \ |
| 211 | mask &= ~(x); \ | 213 | mask &= ~(x); \ |
| 212 | SMC_SET_INT_MASK(lp, mask); \ | 214 | SMC_SET_INT_MASK(lp, mask); \ |
| 213 | spin_unlock_irq(&lp->lock); \ | 215 | spin_unlock_irqrestore(&lp->lock, smc_disable_flags); \ |
| 214 | } while (0) | 216 | } while (0) |
| 215 | 217 | ||
| 216 | /* | 218 | /* |
| @@ -520,21 +522,21 @@ static inline void smc_rcv(struct net_device *dev) | |||
| 520 | * any other concurrent access and C would always interrupt B. But life | 522 | * any other concurrent access and C would always interrupt B. But life |
| 521 | * isn't that easy in a SMP world... | 523 | * isn't that easy in a SMP world... |
| 522 | */ | 524 | */ |
| 523 | #define smc_special_trylock(lock) \ | 525 | #define smc_special_trylock(lock, flags) \ |
| 524 | ({ \ | 526 | ({ \ |
| 525 | int __ret; \ | 527 | int __ret; \ |
| 526 | local_irq_disable(); \ | 528 | local_irq_save(flags); \ |
| 527 | __ret = spin_trylock(lock); \ | 529 | __ret = spin_trylock(lock); \ |
| 528 | if (!__ret) \ | 530 | if (!__ret) \ |
| 529 | local_irq_enable(); \ | 531 | local_irq_restore(flags); \ |
| 530 | __ret; \ | 532 | __ret; \ |
| 531 | }) | 533 | }) |
| 532 | #define smc_special_lock(lock) spin_lock_irq(lock) | 534 | #define smc_special_lock(lock, flags) spin_lock_irq(lock, flags) |
| 533 | #define smc_special_unlock(lock) spin_unlock_irq(lock) | 535 | #define smc_special_unlock(lock, flags) spin_unlock_irqrestore(lock, flags) |
| 534 | #else | 536 | #else |
| 535 | #define smc_special_trylock(lock) (1) | 537 | #define smc_special_trylock(lock, flags) (1) |
| 536 | #define smc_special_lock(lock) do { } while (0) | 538 | #define smc_special_lock(lock, flags) do { } while (0) |
| 537 | #define smc_special_unlock(lock) do { } while (0) | 539 | #define smc_special_unlock(lock, flags) do { } while (0) |
| 538 | #endif | 540 | #endif |
| 539 | 541 | ||
| 540 | /* | 542 | /* |
| @@ -548,10 +550,11 @@ static void smc_hardware_send_pkt(unsigned long data) | |||
| 548 | struct sk_buff *skb; | 550 | struct sk_buff *skb; |
| 549 | unsigned int packet_no, len; | 551 | unsigned int packet_no, len; |
| 550 | unsigned char *buf; | 552 | unsigned char *buf; |
| 553 | unsigned long flags; | ||
| 551 | 554 | ||
| 552 | DBG(3, "%s: %s\n", dev->name, __func__); | 555 | DBG(3, "%s: %s\n", dev->name, __func__); |
| 553 | 556 | ||
| 554 | if (!smc_special_trylock(&lp->lock)) { | 557 | if (!smc_special_trylock(&lp->lock, flags)) { |
| 555 | netif_stop_queue(dev); | 558 | netif_stop_queue(dev); |
| 556 | tasklet_schedule(&lp->tx_task); | 559 | tasklet_schedule(&lp->tx_task); |
| 557 | return; | 560 | return; |
| @@ -559,7 +562,7 @@ static void smc_hardware_send_pkt(unsigned long data) | |||
| 559 | 562 | ||
| 560 | skb = lp->pending_tx_skb; | 563 | skb = lp->pending_tx_skb; |
| 561 | if (unlikely(!skb)) { | 564 | if (unlikely(!skb)) { |
| 562 | smc_special_unlock(&lp->lock); | 565 | smc_special_unlock(&lp->lock, flags); |
| 563 | return; | 566 | return; |
| 564 | } | 567 | } |
| 565 | lp->pending_tx_skb = NULL; | 568 | lp->pending_tx_skb = NULL; |
| @@ -569,7 +572,7 @@ static void smc_hardware_send_pkt(unsigned long data) | |||
| 569 | printk("%s: Memory allocation failed.\n", dev->name); | 572 | printk("%s: Memory allocation failed.\n", dev->name); |
| 570 | dev->stats.tx_errors++; | 573 | dev->stats.tx_errors++; |
| 571 | dev->stats.tx_fifo_errors++; | 574 | dev->stats.tx_fifo_errors++; |
| 572 | smc_special_unlock(&lp->lock); | 575 | smc_special_unlock(&lp->lock, flags); |
| 573 | goto done; | 576 | goto done; |
| 574 | } | 577 | } |
| 575 | 578 | ||
| @@ -608,7 +611,7 @@ static void smc_hardware_send_pkt(unsigned long data) | |||
| 608 | 611 | ||
| 609 | /* queue the packet for TX */ | 612 | /* queue the packet for TX */ |
| 610 | SMC_SET_MMU_CMD(lp, MC_ENQUEUE); | 613 | SMC_SET_MMU_CMD(lp, MC_ENQUEUE); |
| 611 | smc_special_unlock(&lp->lock); | 614 | smc_special_unlock(&lp->lock, flags); |
| 612 | 615 | ||
| 613 | dev->trans_start = jiffies; | 616 | dev->trans_start = jiffies; |
| 614 | dev->stats.tx_packets++; | 617 | dev->stats.tx_packets++; |
| @@ -633,6 +636,7 @@ static int smc_hard_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
| 633 | struct smc_local *lp = netdev_priv(dev); | 636 | struct smc_local *lp = netdev_priv(dev); |
| 634 | void __iomem *ioaddr = lp->base; | 637 | void __iomem *ioaddr = lp->base; |
| 635 | unsigned int numPages, poll_count, status; | 638 | unsigned int numPages, poll_count, status; |
| 639 | unsigned long flags; | ||
| 636 | 640 | ||
| 637 | DBG(3, "%s: %s\n", dev->name, __func__); | 641 | DBG(3, "%s: %s\n", dev->name, __func__); |
| 638 | 642 | ||
| @@ -658,7 +662,7 @@ static int smc_hard_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
| 658 | return 0; | 662 | return 0; |
| 659 | } | 663 | } |
| 660 | 664 | ||
| 661 | smc_special_lock(&lp->lock); | 665 | smc_special_lock(&lp->lock, flags); |
| 662 | 666 | ||
| 663 | /* now, try to allocate the memory */ | 667 | /* now, try to allocate the memory */ |
| 664 | SMC_SET_MMU_CMD(lp, MC_ALLOC | numPages); | 668 | SMC_SET_MMU_CMD(lp, MC_ALLOC | numPages); |
| @@ -676,7 +680,7 @@ static int smc_hard_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
| 676 | } | 680 | } |
| 677 | } while (--poll_count); | 681 | } while (--poll_count); |
| 678 | 682 | ||
| 679 | smc_special_unlock(&lp->lock); | 683 | smc_special_unlock(&lp->lock, flags); |
| 680 | 684 | ||
| 681 | lp->pending_tx_skb = skb; | 685 | lp->pending_tx_skb = skb; |
| 682 | if (!poll_count) { | 686 | if (!poll_count) { |
diff --git a/drivers/net/wireless/orinoco/hw.c b/drivers/net/wireless/orinoco/hw.c index 632fac86a308..b3946272c72e 100644 --- a/drivers/net/wireless/orinoco/hw.c +++ b/drivers/net/wireless/orinoco/hw.c | |||
| @@ -70,7 +70,7 @@ int orinoco_hw_get_tkip_iv(struct orinoco_private *priv, int key, u8 *tsc) | |||
| 70 | int err = 0; | 70 | int err = 0; |
| 71 | u8 tsc_arr[4][IW_ENCODE_SEQ_MAX_SIZE]; | 71 | u8 tsc_arr[4][IW_ENCODE_SEQ_MAX_SIZE]; |
| 72 | 72 | ||
| 73 | if ((key < 0) || (key > 4)) | 73 | if ((key < 0) || (key >= 4)) |
| 74 | return -EINVAL; | 74 | return -EINVAL; |
| 75 | 75 | ||
| 76 | err = hermes_read_ltv(hw, USER_BAP, HERMES_RID_CURRENT_TKIP_IV, | 76 | err = hermes_read_ltv(hw, USER_BAP, HERMES_RID_CURRENT_TKIP_IV, |
diff --git a/drivers/net/wireless/rtl818x/rtl8187_dev.c b/drivers/net/wireless/rtl818x/rtl8187_dev.c index 294250e294dd..87a95588a8e3 100644 --- a/drivers/net/wireless/rtl818x/rtl8187_dev.c +++ b/drivers/net/wireless/rtl818x/rtl8187_dev.c | |||
| @@ -869,6 +869,9 @@ static int rtl8187b_init_hw(struct ieee80211_hw *dev) | |||
| 869 | priv->aifsn[3] = 3; /* AIFSN[AC_BE] */ | 869 | priv->aifsn[3] = 3; /* AIFSN[AC_BE] */ |
| 870 | rtl818x_iowrite8(priv, &priv->map->ACM_CONTROL, 0); | 870 | rtl818x_iowrite8(priv, &priv->map->ACM_CONTROL, 0); |
| 871 | 871 | ||
| 872 | /* ENEDCA flag must always be set, transmit issues? */ | ||
| 873 | rtl818x_iowrite8(priv, &priv->map->MSR, RTL818X_MSR_ENEDCA); | ||
| 874 | |||
| 872 | return 0; | 875 | return 0; |
| 873 | } | 876 | } |
| 874 | 877 | ||
| @@ -1173,13 +1176,16 @@ static void rtl8187_bss_info_changed(struct ieee80211_hw *dev, | |||
| 1173 | rtl818x_iowrite8(priv, &priv->map->BSSID[i], | 1176 | rtl818x_iowrite8(priv, &priv->map->BSSID[i], |
| 1174 | info->bssid[i]); | 1177 | info->bssid[i]); |
| 1175 | 1178 | ||
| 1179 | if (priv->is_rtl8187b) | ||
| 1180 | reg = RTL818X_MSR_ENEDCA; | ||
| 1181 | else | ||
| 1182 | reg = 0; | ||
| 1183 | |||
| 1176 | if (is_valid_ether_addr(info->bssid)) { | 1184 | if (is_valid_ether_addr(info->bssid)) { |
| 1177 | reg = RTL818X_MSR_INFRA; | 1185 | reg |= RTL818X_MSR_INFRA; |
| 1178 | if (priv->is_rtl8187b) | ||
| 1179 | reg |= RTL818X_MSR_ENEDCA; | ||
| 1180 | rtl818x_iowrite8(priv, &priv->map->MSR, reg); | 1186 | rtl818x_iowrite8(priv, &priv->map->MSR, reg); |
| 1181 | } else { | 1187 | } else { |
| 1182 | reg = RTL818X_MSR_NO_LINK; | 1188 | reg |= RTL818X_MSR_NO_LINK; |
| 1183 | rtl818x_iowrite8(priv, &priv->map->MSR, reg); | 1189 | rtl818x_iowrite8(priv, &priv->map->MSR, reg); |
| 1184 | } | 1190 | } |
| 1185 | 1191 | ||
diff --git a/drivers/net/yellowfin.c b/drivers/net/yellowfin.c index a07580138e81..c2fd6187773f 100644 --- a/drivers/net/yellowfin.c +++ b/drivers/net/yellowfin.c | |||
| @@ -346,7 +346,7 @@ static int netdev_ioctl(struct net_device *dev, struct ifreq *rq, int cmd); | |||
| 346 | static int yellowfin_open(struct net_device *dev); | 346 | static int yellowfin_open(struct net_device *dev); |
| 347 | static void yellowfin_timer(unsigned long data); | 347 | static void yellowfin_timer(unsigned long data); |
| 348 | static void yellowfin_tx_timeout(struct net_device *dev); | 348 | static void yellowfin_tx_timeout(struct net_device *dev); |
| 349 | static void yellowfin_init_ring(struct net_device *dev); | 349 | static int yellowfin_init_ring(struct net_device *dev); |
| 350 | static int yellowfin_start_xmit(struct sk_buff *skb, struct net_device *dev); | 350 | static int yellowfin_start_xmit(struct sk_buff *skb, struct net_device *dev); |
| 351 | static irqreturn_t yellowfin_interrupt(int irq, void *dev_instance); | 351 | static irqreturn_t yellowfin_interrupt(int irq, void *dev_instance); |
| 352 | static int yellowfin_rx(struct net_device *dev); | 352 | static int yellowfin_rx(struct net_device *dev); |
| @@ -573,19 +573,24 @@ static int yellowfin_open(struct net_device *dev) | |||
| 573 | { | 573 | { |
| 574 | struct yellowfin_private *yp = netdev_priv(dev); | 574 | struct yellowfin_private *yp = netdev_priv(dev); |
| 575 | void __iomem *ioaddr = yp->base; | 575 | void __iomem *ioaddr = yp->base; |
| 576 | int i; | 576 | int i, ret; |
| 577 | 577 | ||
| 578 | /* Reset the chip. */ | 578 | /* Reset the chip. */ |
| 579 | iowrite32(0x80000000, ioaddr + DMACtrl); | 579 | iowrite32(0x80000000, ioaddr + DMACtrl); |
| 580 | 580 | ||
| 581 | i = request_irq(dev->irq, &yellowfin_interrupt, IRQF_SHARED, dev->name, dev); | 581 | ret = request_irq(dev->irq, &yellowfin_interrupt, IRQF_SHARED, dev->name, dev); |
| 582 | if (i) return i; | 582 | if (ret) |
| 583 | return ret; | ||
| 583 | 584 | ||
| 584 | if (yellowfin_debug > 1) | 585 | if (yellowfin_debug > 1) |
| 585 | printk(KERN_DEBUG "%s: yellowfin_open() irq %d.\n", | 586 | printk(KERN_DEBUG "%s: yellowfin_open() irq %d.\n", |
| 586 | dev->name, dev->irq); | 587 | dev->name, dev->irq); |
| 587 | 588 | ||
| 588 | yellowfin_init_ring(dev); | 589 | ret = yellowfin_init_ring(dev); |
| 590 | if (ret) { | ||
| 591 | free_irq(dev->irq, dev); | ||
| 592 | return ret; | ||
| 593 | } | ||
| 589 | 594 | ||
| 590 | iowrite32(yp->rx_ring_dma, ioaddr + RxPtr); | 595 | iowrite32(yp->rx_ring_dma, ioaddr + RxPtr); |
| 591 | iowrite32(yp->tx_ring_dma, ioaddr + TxPtr); | 596 | iowrite32(yp->tx_ring_dma, ioaddr + TxPtr); |
| @@ -725,10 +730,10 @@ static void yellowfin_tx_timeout(struct net_device *dev) | |||
| 725 | } | 730 | } |
| 726 | 731 | ||
| 727 | /* Initialize the Rx and Tx rings, along with various 'dev' bits. */ | 732 | /* Initialize the Rx and Tx rings, along with various 'dev' bits. */ |
| 728 | static void yellowfin_init_ring(struct net_device *dev) | 733 | static int yellowfin_init_ring(struct net_device *dev) |
| 729 | { | 734 | { |
| 730 | struct yellowfin_private *yp = netdev_priv(dev); | 735 | struct yellowfin_private *yp = netdev_priv(dev); |
| 731 | int i; | 736 | int i, j; |
| 732 | 737 | ||
| 733 | yp->tx_full = 0; | 738 | yp->tx_full = 0; |
| 734 | yp->cur_rx = yp->cur_tx = 0; | 739 | yp->cur_rx = yp->cur_tx = 0; |
| @@ -753,6 +758,11 @@ static void yellowfin_init_ring(struct net_device *dev) | |||
| 753 | yp->rx_ring[i].addr = cpu_to_le32(pci_map_single(yp->pci_dev, | 758 | yp->rx_ring[i].addr = cpu_to_le32(pci_map_single(yp->pci_dev, |
| 754 | skb->data, yp->rx_buf_sz, PCI_DMA_FROMDEVICE)); | 759 | skb->data, yp->rx_buf_sz, PCI_DMA_FROMDEVICE)); |
| 755 | } | 760 | } |
| 761 | if (i != RX_RING_SIZE) { | ||
| 762 | for (j = 0; j < i; j++) | ||
| 763 | dev_kfree_skb(yp->rx_skbuff[j]); | ||
| 764 | return -ENOMEM; | ||
| 765 | } | ||
| 756 | yp->rx_ring[i-1].dbdma_cmd = cpu_to_le32(CMD_STOP); | 766 | yp->rx_ring[i-1].dbdma_cmd = cpu_to_le32(CMD_STOP); |
| 757 | yp->dirty_rx = (unsigned int)(i - RX_RING_SIZE); | 767 | yp->dirty_rx = (unsigned int)(i - RX_RING_SIZE); |
| 758 | 768 | ||
| @@ -769,8 +779,6 @@ static void yellowfin_init_ring(struct net_device *dev) | |||
| 769 | yp->tx_ring[--i].dbdma_cmd = cpu_to_le32(CMD_STOP | BRANCH_ALWAYS); | 779 | yp->tx_ring[--i].dbdma_cmd = cpu_to_le32(CMD_STOP | BRANCH_ALWAYS); |
| 770 | #else | 780 | #else |
| 771 | { | 781 | { |
| 772 | int j; | ||
| 773 | |||
| 774 | /* Tx ring needs a pair of descriptors, the second for the status. */ | 782 | /* Tx ring needs a pair of descriptors, the second for the status. */ |
| 775 | for (i = 0; i < TX_RING_SIZE; i++) { | 783 | for (i = 0; i < TX_RING_SIZE; i++) { |
| 776 | j = 2*i; | 784 | j = 2*i; |
| @@ -805,7 +813,7 @@ static void yellowfin_init_ring(struct net_device *dev) | |||
| 805 | } | 813 | } |
| 806 | #endif | 814 | #endif |
| 807 | yp->tx_tail_desc = &yp->tx_status[0]; | 815 | yp->tx_tail_desc = &yp->tx_status[0]; |
| 808 | return; | 816 | return 0; |
| 809 | } | 817 | } |
| 810 | 818 | ||
| 811 | static int yellowfin_start_xmit(struct sk_buff *skb, struct net_device *dev) | 819 | static int yellowfin_start_xmit(struct sk_buff *skb, struct net_device *dev) |
diff --git a/include/net/pkt_sched.h b/include/net/pkt_sched.h index 82a3191375f5..7eafb8d54470 100644 --- a/include/net/pkt_sched.h +++ b/include/net/pkt_sched.h | |||
| @@ -61,8 +61,8 @@ psched_tdiff_bounded(psched_time_t tv1, psched_time_t tv2, psched_time_t bound) | |||
| 61 | } | 61 | } |
| 62 | 62 | ||
| 63 | struct qdisc_watchdog { | 63 | struct qdisc_watchdog { |
| 64 | struct hrtimer timer; | 64 | struct tasklet_hrtimer timer; |
| 65 | struct Qdisc *qdisc; | 65 | struct Qdisc *qdisc; |
| 66 | }; | 66 | }; |
| 67 | 67 | ||
| 68 | extern void qdisc_watchdog_init(struct qdisc_watchdog *wd, struct Qdisc *qdisc); | 68 | extern void qdisc_watchdog_init(struct qdisc_watchdog *wd, struct Qdisc *qdisc); |
diff --git a/net/core/netpoll.c b/net/core/netpoll.c index df30feb2fc72..1b76eb11deb4 100644 --- a/net/core/netpoll.c +++ b/net/core/netpoll.c | |||
| @@ -319,6 +319,11 @@ static void netpoll_send_skb(struct netpoll *np, struct sk_buff *skb) | |||
| 319 | 319 | ||
| 320 | udelay(USEC_PER_POLL); | 320 | udelay(USEC_PER_POLL); |
| 321 | } | 321 | } |
| 322 | |||
| 323 | WARN_ONCE(!irqs_disabled(), | ||
| 324 | "netpoll_send_skb(): %s enabled interrupts in poll (%pF)\n", | ||
| 325 | dev->name, ops->ndo_start_xmit); | ||
| 326 | |||
| 322 | local_irq_restore(flags); | 327 | local_irq_restore(flags); |
| 323 | } | 328 | } |
| 324 | 329 | ||
diff --git a/net/ipv6/af_inet6.c b/net/ipv6/af_inet6.c index caa0278d30a9..45f9a2a42d56 100644 --- a/net/ipv6/af_inet6.c +++ b/net/ipv6/af_inet6.c | |||
| @@ -306,8 +306,10 @@ int inet6_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len) | |||
| 306 | v4addr != htonl(INADDR_ANY) && | 306 | v4addr != htonl(INADDR_ANY) && |
| 307 | chk_addr_ret != RTN_LOCAL && | 307 | chk_addr_ret != RTN_LOCAL && |
| 308 | chk_addr_ret != RTN_MULTICAST && | 308 | chk_addr_ret != RTN_MULTICAST && |
| 309 | chk_addr_ret != RTN_BROADCAST) | 309 | chk_addr_ret != RTN_BROADCAST) { |
| 310 | err = -EADDRNOTAVAIL; | ||
| 310 | goto out; | 311 | goto out; |
| 312 | } | ||
| 311 | } else { | 313 | } else { |
| 312 | if (addr_type != IPV6_ADDR_ANY) { | 314 | if (addr_type != IPV6_ADDR_ANY) { |
| 313 | struct net_device *dev = NULL; | 315 | struct net_device *dev = NULL; |
diff --git a/net/llc/af_llc.c b/net/llc/af_llc.c index 9208cf5f2bd5..c45eee1c0e8d 100644 --- a/net/llc/af_llc.c +++ b/net/llc/af_llc.c | |||
| @@ -914,6 +914,7 @@ static int llc_ui_getname(struct socket *sock, struct sockaddr *uaddr, | |||
| 914 | struct llc_sock *llc = llc_sk(sk); | 914 | struct llc_sock *llc = llc_sk(sk); |
| 915 | int rc = 0; | 915 | int rc = 0; |
| 916 | 916 | ||
| 917 | memset(&sllc, 0, sizeof(sllc)); | ||
| 917 | lock_sock(sk); | 918 | lock_sock(sk); |
| 918 | if (sock_flag(sk, SOCK_ZAPPED)) | 919 | if (sock_flag(sk, SOCK_ZAPPED)) |
| 919 | goto out; | 920 | goto out; |
diff --git a/net/mac80211/key.c b/net/mac80211/key.c index ce267565e180..659a42d529e3 100644 --- a/net/mac80211/key.c +++ b/net/mac80211/key.c | |||
| @@ -67,6 +67,8 @@ static DECLARE_WORK(todo_work, key_todo); | |||
| 67 | * | 67 | * |
| 68 | * @key: key to add to do item for | 68 | * @key: key to add to do item for |
| 69 | * @flag: todo flag(s) | 69 | * @flag: todo flag(s) |
| 70 | * | ||
| 71 | * Must be called with IRQs or softirqs disabled. | ||
| 70 | */ | 72 | */ |
| 71 | static void add_todo(struct ieee80211_key *key, u32 flag) | 73 | static void add_todo(struct ieee80211_key *key, u32 flag) |
| 72 | { | 74 | { |
| @@ -140,9 +142,9 @@ static void ieee80211_key_enable_hw_accel(struct ieee80211_key *key) | |||
| 140 | ret = drv_set_key(key->local, SET_KEY, &sdata->vif, sta, &key->conf); | 142 | ret = drv_set_key(key->local, SET_KEY, &sdata->vif, sta, &key->conf); |
| 141 | 143 | ||
| 142 | if (!ret) { | 144 | if (!ret) { |
| 143 | spin_lock(&todo_lock); | 145 | spin_lock_bh(&todo_lock); |
| 144 | key->flags |= KEY_FLAG_UPLOADED_TO_HARDWARE; | 146 | key->flags |= KEY_FLAG_UPLOADED_TO_HARDWARE; |
| 145 | spin_unlock(&todo_lock); | 147 | spin_unlock_bh(&todo_lock); |
| 146 | } | 148 | } |
| 147 | 149 | ||
| 148 | if (ret && ret != -ENOSPC && ret != -EOPNOTSUPP) | 150 | if (ret && ret != -ENOSPC && ret != -EOPNOTSUPP) |
| @@ -164,12 +166,12 @@ static void ieee80211_key_disable_hw_accel(struct ieee80211_key *key) | |||
| 164 | if (!key || !key->local->ops->set_key) | 166 | if (!key || !key->local->ops->set_key) |
| 165 | return; | 167 | return; |
| 166 | 168 | ||
| 167 | spin_lock(&todo_lock); | 169 | spin_lock_bh(&todo_lock); |
| 168 | if (!(key->flags & KEY_FLAG_UPLOADED_TO_HARDWARE)) { | 170 | if (!(key->flags & KEY_FLAG_UPLOADED_TO_HARDWARE)) { |
| 169 | spin_unlock(&todo_lock); | 171 | spin_unlock_bh(&todo_lock); |
| 170 | return; | 172 | return; |
| 171 | } | 173 | } |
| 172 | spin_unlock(&todo_lock); | 174 | spin_unlock_bh(&todo_lock); |
| 173 | 175 | ||
| 174 | sta = get_sta_for_key(key); | 176 | sta = get_sta_for_key(key); |
| 175 | sdata = key->sdata; | 177 | sdata = key->sdata; |
| @@ -188,9 +190,9 @@ static void ieee80211_key_disable_hw_accel(struct ieee80211_key *key) | |||
| 188 | wiphy_name(key->local->hw.wiphy), | 190 | wiphy_name(key->local->hw.wiphy), |
| 189 | key->conf.keyidx, sta ? sta->addr : bcast_addr, ret); | 191 | key->conf.keyidx, sta ? sta->addr : bcast_addr, ret); |
| 190 | 192 | ||
| 191 | spin_lock(&todo_lock); | 193 | spin_lock_bh(&todo_lock); |
| 192 | key->flags &= ~KEY_FLAG_UPLOADED_TO_HARDWARE; | 194 | key->flags &= ~KEY_FLAG_UPLOADED_TO_HARDWARE; |
| 193 | spin_unlock(&todo_lock); | 195 | spin_unlock_bh(&todo_lock); |
| 194 | } | 196 | } |
| 195 | 197 | ||
| 196 | static void __ieee80211_set_default_key(struct ieee80211_sub_if_data *sdata, | 198 | static void __ieee80211_set_default_key(struct ieee80211_sub_if_data *sdata, |
| @@ -437,14 +439,14 @@ void ieee80211_key_link(struct ieee80211_key *key, | |||
| 437 | 439 | ||
| 438 | __ieee80211_key_replace(sdata, sta, old_key, key); | 440 | __ieee80211_key_replace(sdata, sta, old_key, key); |
| 439 | 441 | ||
| 440 | spin_unlock_irqrestore(&sdata->local->key_lock, flags); | ||
| 441 | |||
| 442 | /* free old key later */ | 442 | /* free old key later */ |
| 443 | add_todo(old_key, KEY_FLAG_TODO_DELETE); | 443 | add_todo(old_key, KEY_FLAG_TODO_DELETE); |
| 444 | 444 | ||
| 445 | add_todo(key, KEY_FLAG_TODO_ADD_DEBUGFS); | 445 | add_todo(key, KEY_FLAG_TODO_ADD_DEBUGFS); |
| 446 | if (netif_running(sdata->dev)) | 446 | if (netif_running(sdata->dev)) |
| 447 | add_todo(key, KEY_FLAG_TODO_HWACCEL_ADD); | 447 | add_todo(key, KEY_FLAG_TODO_HWACCEL_ADD); |
| 448 | |||
| 449 | spin_unlock_irqrestore(&sdata->local->key_lock, flags); | ||
| 448 | } | 450 | } |
| 449 | 451 | ||
| 450 | static void __ieee80211_key_free(struct ieee80211_key *key) | 452 | static void __ieee80211_key_free(struct ieee80211_key *key) |
| @@ -547,7 +549,7 @@ static void __ieee80211_key_todo(void) | |||
| 547 | */ | 549 | */ |
| 548 | synchronize_rcu(); | 550 | synchronize_rcu(); |
| 549 | 551 | ||
| 550 | spin_lock(&todo_lock); | 552 | spin_lock_bh(&todo_lock); |
| 551 | while (!list_empty(&todo_list)) { | 553 | while (!list_empty(&todo_list)) { |
| 552 | key = list_first_entry(&todo_list, struct ieee80211_key, todo); | 554 | key = list_first_entry(&todo_list, struct ieee80211_key, todo); |
| 553 | list_del_init(&key->todo); | 555 | list_del_init(&key->todo); |
| @@ -558,7 +560,7 @@ static void __ieee80211_key_todo(void) | |||
| 558 | KEY_FLAG_TODO_HWACCEL_REMOVE | | 560 | KEY_FLAG_TODO_HWACCEL_REMOVE | |
| 559 | KEY_FLAG_TODO_DELETE); | 561 | KEY_FLAG_TODO_DELETE); |
| 560 | key->flags &= ~todoflags; | 562 | key->flags &= ~todoflags; |
| 561 | spin_unlock(&todo_lock); | 563 | spin_unlock_bh(&todo_lock); |
| 562 | 564 | ||
| 563 | work_done = false; | 565 | work_done = false; |
| 564 | 566 | ||
| @@ -591,9 +593,9 @@ static void __ieee80211_key_todo(void) | |||
| 591 | 593 | ||
| 592 | WARN_ON(!work_done); | 594 | WARN_ON(!work_done); |
| 593 | 595 | ||
| 594 | spin_lock(&todo_lock); | 596 | spin_lock_bh(&todo_lock); |
| 595 | } | 597 | } |
| 596 | spin_unlock(&todo_lock); | 598 | spin_unlock_bh(&todo_lock); |
| 597 | } | 599 | } |
| 598 | 600 | ||
| 599 | void ieee80211_key_todo(void) | 601 | void ieee80211_key_todo(void) |
diff --git a/net/netfilter/xt_quota.c b/net/netfilter/xt_quota.c index 98fc190e8f0e..390b7d09fe51 100644 --- a/net/netfilter/xt_quota.c +++ b/net/netfilter/xt_quota.c | |||
| @@ -52,7 +52,7 @@ static bool quota_mt_check(const struct xt_mtchk_param *par) | |||
| 52 | 52 | ||
| 53 | q->master = kmalloc(sizeof(*q->master), GFP_KERNEL); | 53 | q->master = kmalloc(sizeof(*q->master), GFP_KERNEL); |
| 54 | if (q->master == NULL) | 54 | if (q->master == NULL) |
| 55 | return -ENOMEM; | 55 | return false; |
| 56 | 56 | ||
| 57 | q->master->quota = q->quota; | 57 | q->master->quota = q->quota; |
| 58 | return true; | 58 | return true; |
diff --git a/net/sched/sch_api.c b/net/sched/sch_api.c index 24d17ce9c294..e1c2bf7e9ba4 100644 --- a/net/sched/sch_api.c +++ b/net/sched/sch_api.c | |||
| @@ -468,8 +468,8 @@ static enum hrtimer_restart qdisc_watchdog(struct hrtimer *timer) | |||
| 468 | 468 | ||
| 469 | void qdisc_watchdog_init(struct qdisc_watchdog *wd, struct Qdisc *qdisc) | 469 | void qdisc_watchdog_init(struct qdisc_watchdog *wd, struct Qdisc *qdisc) |
| 470 | { | 470 | { |
| 471 | hrtimer_init(&wd->timer, CLOCK_MONOTONIC, HRTIMER_MODE_ABS); | 471 | tasklet_hrtimer_init(&wd->timer, qdisc_watchdog, |
| 472 | wd->timer.function = qdisc_watchdog; | 472 | CLOCK_MONOTONIC, HRTIMER_MODE_ABS); |
| 473 | wd->qdisc = qdisc; | 473 | wd->qdisc = qdisc; |
| 474 | } | 474 | } |
| 475 | EXPORT_SYMBOL(qdisc_watchdog_init); | 475 | EXPORT_SYMBOL(qdisc_watchdog_init); |
| @@ -485,13 +485,13 @@ void qdisc_watchdog_schedule(struct qdisc_watchdog *wd, psched_time_t expires) | |||
| 485 | wd->qdisc->flags |= TCQ_F_THROTTLED; | 485 | wd->qdisc->flags |= TCQ_F_THROTTLED; |
| 486 | time = ktime_set(0, 0); | 486 | time = ktime_set(0, 0); |
| 487 | time = ktime_add_ns(time, PSCHED_TICKS2NS(expires)); | 487 | time = ktime_add_ns(time, PSCHED_TICKS2NS(expires)); |
| 488 | hrtimer_start(&wd->timer, time, HRTIMER_MODE_ABS); | 488 | tasklet_hrtimer_start(&wd->timer, time, HRTIMER_MODE_ABS); |
| 489 | } | 489 | } |
| 490 | EXPORT_SYMBOL(qdisc_watchdog_schedule); | 490 | EXPORT_SYMBOL(qdisc_watchdog_schedule); |
| 491 | 491 | ||
| 492 | void qdisc_watchdog_cancel(struct qdisc_watchdog *wd) | 492 | void qdisc_watchdog_cancel(struct qdisc_watchdog *wd) |
| 493 | { | 493 | { |
| 494 | hrtimer_cancel(&wd->timer); | 494 | tasklet_hrtimer_cancel(&wd->timer); |
| 495 | wd->qdisc->flags &= ~TCQ_F_THROTTLED; | 495 | wd->qdisc->flags &= ~TCQ_F_THROTTLED; |
| 496 | } | 496 | } |
| 497 | EXPORT_SYMBOL(qdisc_watchdog_cancel); | 497 | EXPORT_SYMBOL(qdisc_watchdog_cancel); |
diff --git a/net/sched/sch_cbq.c b/net/sched/sch_cbq.c index d5798e17a832..81652d6ccd36 100644 --- a/net/sched/sch_cbq.c +++ b/net/sched/sch_cbq.c | |||
| @@ -163,7 +163,7 @@ struct cbq_sched_data | |||
| 163 | psched_time_t now_rt; /* Cached real time */ | 163 | psched_time_t now_rt; /* Cached real time */ |
| 164 | unsigned pmask; | 164 | unsigned pmask; |
| 165 | 165 | ||
| 166 | struct hrtimer delay_timer; | 166 | struct tasklet_hrtimer delay_timer; |
| 167 | struct qdisc_watchdog watchdog; /* Watchdog timer, | 167 | struct qdisc_watchdog watchdog; /* Watchdog timer, |
| 168 | started when CBQ has | 168 | started when CBQ has |
| 169 | backlog, but cannot | 169 | backlog, but cannot |
| @@ -503,6 +503,8 @@ static void cbq_ovl_delay(struct cbq_class *cl) | |||
| 503 | cl->undertime = q->now + delay; | 503 | cl->undertime = q->now + delay; |
| 504 | 504 | ||
| 505 | if (delay > 0) { | 505 | if (delay > 0) { |
| 506 | struct hrtimer *ht; | ||
| 507 | |||
| 506 | sched += delay + cl->penalty; | 508 | sched += delay + cl->penalty; |
| 507 | cl->penalized = sched; | 509 | cl->penalized = sched; |
| 508 | cl->cpriority = TC_CBQ_MAXPRIO; | 510 | cl->cpriority = TC_CBQ_MAXPRIO; |
| @@ -510,12 +512,12 @@ static void cbq_ovl_delay(struct cbq_class *cl) | |||
| 510 | 512 | ||
| 511 | expires = ktime_set(0, 0); | 513 | expires = ktime_set(0, 0); |
| 512 | expires = ktime_add_ns(expires, PSCHED_TICKS2NS(sched)); | 514 | expires = ktime_add_ns(expires, PSCHED_TICKS2NS(sched)); |
| 513 | if (hrtimer_try_to_cancel(&q->delay_timer) && | 515 | ht = &q->delay_timer.timer; |
| 514 | ktime_to_ns(ktime_sub( | 516 | if (hrtimer_try_to_cancel(ht) && |
| 515 | hrtimer_get_expires(&q->delay_timer), | 517 | ktime_to_ns(ktime_sub(hrtimer_get_expires(ht), |
| 516 | expires)) > 0) | 518 | expires)) > 0) |
| 517 | hrtimer_set_expires(&q->delay_timer, expires); | 519 | hrtimer_set_expires(ht, expires); |
| 518 | hrtimer_restart(&q->delay_timer); | 520 | hrtimer_restart(ht); |
| 519 | cl->delayed = 1; | 521 | cl->delayed = 1; |
| 520 | cl->xstats.overactions++; | 522 | cl->xstats.overactions++; |
| 521 | return; | 523 | return; |
| @@ -621,7 +623,7 @@ static enum hrtimer_restart cbq_undelay(struct hrtimer *timer) | |||
| 621 | 623 | ||
| 622 | time = ktime_set(0, 0); | 624 | time = ktime_set(0, 0); |
| 623 | time = ktime_add_ns(time, PSCHED_TICKS2NS(now + delay)); | 625 | time = ktime_add_ns(time, PSCHED_TICKS2NS(now + delay)); |
| 624 | hrtimer_start(&q->delay_timer, time, HRTIMER_MODE_ABS); | 626 | tasklet_hrtimer_start(&q->delay_timer, time, HRTIMER_MODE_ABS); |
| 625 | } | 627 | } |
| 626 | 628 | ||
| 627 | sch->flags &= ~TCQ_F_THROTTLED; | 629 | sch->flags &= ~TCQ_F_THROTTLED; |
| @@ -1214,7 +1216,7 @@ cbq_reset(struct Qdisc* sch) | |||
| 1214 | q->tx_class = NULL; | 1216 | q->tx_class = NULL; |
| 1215 | q->tx_borrowed = NULL; | 1217 | q->tx_borrowed = NULL; |
| 1216 | qdisc_watchdog_cancel(&q->watchdog); | 1218 | qdisc_watchdog_cancel(&q->watchdog); |
| 1217 | hrtimer_cancel(&q->delay_timer); | 1219 | tasklet_hrtimer_cancel(&q->delay_timer); |
| 1218 | q->toplevel = TC_CBQ_MAXLEVEL; | 1220 | q->toplevel = TC_CBQ_MAXLEVEL; |
| 1219 | q->now = psched_get_time(); | 1221 | q->now = psched_get_time(); |
| 1220 | q->now_rt = q->now; | 1222 | q->now_rt = q->now; |
| @@ -1397,7 +1399,8 @@ static int cbq_init(struct Qdisc *sch, struct nlattr *opt) | |||
| 1397 | q->link.minidle = -0x7FFFFFFF; | 1399 | q->link.minidle = -0x7FFFFFFF; |
| 1398 | 1400 | ||
| 1399 | qdisc_watchdog_init(&q->watchdog, sch); | 1401 | qdisc_watchdog_init(&q->watchdog, sch); |
| 1400 | hrtimer_init(&q->delay_timer, CLOCK_MONOTONIC, HRTIMER_MODE_ABS); | 1402 | tasklet_hrtimer_init(&q->delay_timer, cbq_undelay, |
| 1403 | CLOCK_MONOTONIC, HRTIMER_MODE_ABS); | ||
| 1401 | q->delay_timer.function = cbq_undelay; | 1404 | q->delay_timer.function = cbq_undelay; |
| 1402 | q->toplevel = TC_CBQ_MAXLEVEL; | 1405 | q->toplevel = TC_CBQ_MAXLEVEL; |
| 1403 | q->now = psched_get_time(); | 1406 | q->now = psched_get_time(); |
