diff options
40 files changed, 192 insertions, 60 deletions
diff --git a/Documentation/DocBook/mac80211.tmpl b/Documentation/DocBook/mac80211.tmpl index e36986663570..f3f37f141dbd 100644 --- a/Documentation/DocBook/mac80211.tmpl +++ b/Documentation/DocBook/mac80211.tmpl | |||
| @@ -184,8 +184,6 @@ usage should require reading the full document. | |||
| 184 | !Finclude/net/mac80211.h ieee80211_ctstoself_get | 184 | !Finclude/net/mac80211.h ieee80211_ctstoself_get |
| 185 | !Finclude/net/mac80211.h ieee80211_ctstoself_duration | 185 | !Finclude/net/mac80211.h ieee80211_ctstoself_duration |
| 186 | !Finclude/net/mac80211.h ieee80211_generic_frame_duration | 186 | !Finclude/net/mac80211.h ieee80211_generic_frame_duration |
| 187 | !Finclude/net/mac80211.h ieee80211_get_hdrlen_from_skb | ||
| 188 | !Finclude/net/mac80211.h ieee80211_hdrlen | ||
| 189 | !Finclude/net/mac80211.h ieee80211_wake_queue | 187 | !Finclude/net/mac80211.h ieee80211_wake_queue |
| 190 | !Finclude/net/mac80211.h ieee80211_stop_queue | 188 | !Finclude/net/mac80211.h ieee80211_stop_queue |
| 191 | !Finclude/net/mac80211.h ieee80211_wake_queues | 189 | !Finclude/net/mac80211.h ieee80211_wake_queues |
diff --git a/arch/x86/include/asm/spinlock.h b/arch/x86/include/asm/spinlock.h index b7e5db876399..4e77853321db 100644 --- a/arch/x86/include/asm/spinlock.h +++ b/arch/x86/include/asm/spinlock.h | |||
| @@ -302,4 +302,8 @@ static inline void __raw_write_unlock(raw_rwlock_t *rw) | |||
| 302 | #define _raw_read_relax(lock) cpu_relax() | 302 | #define _raw_read_relax(lock) cpu_relax() |
| 303 | #define _raw_write_relax(lock) cpu_relax() | 303 | #define _raw_write_relax(lock) cpu_relax() |
| 304 | 304 | ||
| 305 | /* The {read|write|spin}_lock() on x86 are full memory barriers. */ | ||
| 306 | static inline void smp_mb__after_lock(void) { } | ||
| 307 | #define ARCH_HAS_SMP_MB_AFTER_LOCK | ||
| 308 | |||
| 305 | #endif /* _ASM_X86_SPINLOCK_H */ | 309 | #endif /* _ASM_X86_SPINLOCK_H */ |
diff --git a/drivers/net/cxgb3/cxgb3_main.c b/drivers/net/cxgb3/cxgb3_main.c index 538dda4422dc..fb5df5c6203e 100644 --- a/drivers/net/cxgb3/cxgb3_main.c +++ b/drivers/net/cxgb3/cxgb3_main.c | |||
| @@ -642,8 +642,7 @@ static int setup_sge_qsets(struct adapter *adap) | |||
| 642 | struct port_info *pi = netdev_priv(dev); | 642 | struct port_info *pi = netdev_priv(dev); |
| 643 | 643 | ||
| 644 | pi->qs = &adap->sge.qs[pi->first_qset]; | 644 | pi->qs = &adap->sge.qs[pi->first_qset]; |
| 645 | for (j = pi->first_qset; j < pi->first_qset + pi->nqsets; | 645 | for (j = 0; j < pi->nqsets; ++j, ++qset_idx) { |
| 646 | ++j, ++qset_idx) { | ||
| 647 | set_qset_lro(dev, qset_idx, pi->rx_offload & T3_LRO); | 646 | set_qset_lro(dev, qset_idx, pi->rx_offload & T3_LRO); |
| 648 | err = t3_sge_alloc_qset(adap, qset_idx, 1, | 647 | err = t3_sge_alloc_qset(adap, qset_idx, 1, |
| 649 | (adap->flags & USING_MSIX) ? qset_idx + 1 : | 648 | (adap->flags & USING_MSIX) ? qset_idx + 1 : |
diff --git a/drivers/net/davinci_emac.c b/drivers/net/davinci_emac.c index 2df8fb0af701..12fd446f9895 100644 --- a/drivers/net/davinci_emac.c +++ b/drivers/net/davinci_emac.c | |||
| @@ -1820,11 +1820,19 @@ static int emac_dev_setmac_addr(struct net_device *ndev, void *addr) | |||
| 1820 | struct device *emac_dev = &priv->ndev->dev; | 1820 | struct device *emac_dev = &priv->ndev->dev; |
| 1821 | struct sockaddr *sa = addr; | 1821 | struct sockaddr *sa = addr; |
| 1822 | 1822 | ||
| 1823 | if (!is_valid_ether_addr(sa->sa_data)) | ||
| 1824 | return -EINVAL; | ||
| 1825 | |||
| 1823 | /* Store mac addr in priv and rx channel and set it in EMAC hw */ | 1826 | /* Store mac addr in priv and rx channel and set it in EMAC hw */ |
| 1824 | memcpy(priv->mac_addr, sa->sa_data, ndev->addr_len); | 1827 | memcpy(priv->mac_addr, sa->sa_data, ndev->addr_len); |
| 1825 | memcpy(rxch->mac_addr, sa->sa_data, ndev->addr_len); | ||
| 1826 | memcpy(ndev->dev_addr, sa->sa_data, ndev->addr_len); | 1828 | memcpy(ndev->dev_addr, sa->sa_data, ndev->addr_len); |
| 1827 | emac_setmac(priv, EMAC_DEF_RX_CH, rxch->mac_addr); | 1829 | |
| 1830 | /* If the interface is down - rxch is NULL. */ | ||
| 1831 | /* MAC address is configured only after the interface is enabled. */ | ||
| 1832 | if (netif_running(ndev)) { | ||
| 1833 | memcpy(rxch->mac_addr, sa->sa_data, ndev->addr_len); | ||
| 1834 | emac_setmac(priv, EMAC_DEF_RX_CH, rxch->mac_addr); | ||
| 1835 | } | ||
| 1828 | 1836 | ||
| 1829 | if (netif_msg_drv(priv)) | 1837 | if (netif_msg_drv(priv)) |
| 1830 | dev_notice(emac_dev, "DaVinci EMAC: emac_dev_setmac_addr %pM\n", | 1838 | dev_notice(emac_dev, "DaVinci EMAC: emac_dev_setmac_addr %pM\n", |
diff --git a/drivers/net/fec.h b/drivers/net/fec.h index 30b7dd671336..cc47f3f057c7 100644 --- a/drivers/net/fec.h +++ b/drivers/net/fec.h | |||
| @@ -46,12 +46,12 @@ | |||
| 46 | 46 | ||
| 47 | #else | 47 | #else |
| 48 | 48 | ||
| 49 | #define FEC_ECNTRL; 0x000 /* Ethernet control reg */ | 49 | #define FEC_ECNTRL 0x000 /* Ethernet control reg */ |
| 50 | #define FEC_IEVENT; 0x004 /* Interrupt even reg */ | 50 | #define FEC_IEVENT 0x004 /* Interrupt even reg */ |
| 51 | #define FEC_IMASK; 0x008 /* Interrupt mask reg */ | 51 | #define FEC_IMASK 0x008 /* Interrupt mask reg */ |
| 52 | #define FEC_IVEC; 0x00c /* Interrupt vec status reg */ | 52 | #define FEC_IVEC 0x00c /* Interrupt vec status reg */ |
| 53 | #define FEC_R_DES_ACTIVE; 0x010 /* Receive descriptor reg */ | 53 | #define FEC_R_DES_ACTIVE 0x010 /* Receive descriptor reg */ |
| 54 | #define FEC_X_DES_ACTIVE; 0x01c /* Transmit descriptor reg */ | 54 | #define FEC_X_DES_ACTIVE 0x014 /* Transmit descriptor reg */ |
| 55 | #define FEC_MII_DATA 0x040 /* MII manage frame reg */ | 55 | #define FEC_MII_DATA 0x040 /* MII manage frame reg */ |
| 56 | #define FEC_MII_SPEED 0x044 /* MII speed control reg */ | 56 | #define FEC_MII_SPEED 0x044 /* MII speed control reg */ |
| 57 | #define FEC_R_BOUND 0x08c /* FIFO receive bound reg */ | 57 | #define FEC_R_BOUND 0x08c /* FIFO receive bound reg */ |
diff --git a/drivers/net/igb/e1000_82575.c b/drivers/net/igb/e1000_82575.c index efd9be214885..ac28dd5a4fd1 100644 --- a/drivers/net/igb/e1000_82575.c +++ b/drivers/net/igb/e1000_82575.c | |||
| @@ -190,6 +190,10 @@ static s32 igb_get_invariants_82575(struct e1000_hw *hw) | |||
| 190 | phy->ops.write_reg = igb_write_phy_reg_igp; | 190 | phy->ops.write_reg = igb_write_phy_reg_igp; |
| 191 | } | 191 | } |
| 192 | 192 | ||
| 193 | /* set lan id */ | ||
| 194 | hw->bus.func = (rd32(E1000_STATUS) & E1000_STATUS_FUNC_MASK) >> | ||
| 195 | E1000_STATUS_FUNC_SHIFT; | ||
| 196 | |||
| 193 | /* Set phy->phy_addr and phy->id. */ | 197 | /* Set phy->phy_addr and phy->id. */ |
| 194 | ret_val = igb_get_phy_id_82575(hw); | 198 | ret_val = igb_get_phy_id_82575(hw); |
| 195 | if (ret_val) | 199 | if (ret_val) |
diff --git a/drivers/net/ixgbe/ixgbe_dcb_nl.c b/drivers/net/ixgbe/ixgbe_dcb_nl.c index d56890f5c9d5..7c5978ad929a 100644 --- a/drivers/net/ixgbe/ixgbe_dcb_nl.c +++ b/drivers/net/ixgbe/ixgbe_dcb_nl.c | |||
| @@ -138,6 +138,10 @@ static u8 ixgbe_dcbnl_set_state(struct net_device *netdev, u8 state) | |||
| 138 | adapter->hw.fc.requested_mode = ixgbe_fc_none; | 138 | adapter->hw.fc.requested_mode = ixgbe_fc_none; |
| 139 | } | 139 | } |
| 140 | adapter->flags &= ~IXGBE_FLAG_RSS_ENABLED; | 140 | adapter->flags &= ~IXGBE_FLAG_RSS_ENABLED; |
| 141 | if (adapter->hw.mac.type == ixgbe_mac_82599EB) { | ||
| 142 | adapter->flags &= ~IXGBE_FLAG_FDIR_HASH_CAPABLE; | ||
| 143 | adapter->flags &= ~IXGBE_FLAG_FDIR_PERFECT_CAPABLE; | ||
| 144 | } | ||
| 141 | adapter->flags |= IXGBE_FLAG_DCB_ENABLED; | 145 | adapter->flags |= IXGBE_FLAG_DCB_ENABLED; |
| 142 | ixgbe_init_interrupt_scheme(adapter); | 146 | ixgbe_init_interrupt_scheme(adapter); |
| 143 | if (netif_running(netdev)) | 147 | if (netif_running(netdev)) |
| @@ -154,6 +158,8 @@ static u8 ixgbe_dcbnl_set_state(struct net_device *netdev, u8 state) | |||
| 154 | adapter->dcb_cfg.pfc_mode_enable = false; | 158 | adapter->dcb_cfg.pfc_mode_enable = false; |
| 155 | adapter->flags &= ~IXGBE_FLAG_DCB_ENABLED; | 159 | adapter->flags &= ~IXGBE_FLAG_DCB_ENABLED; |
| 156 | adapter->flags |= IXGBE_FLAG_RSS_ENABLED; | 160 | adapter->flags |= IXGBE_FLAG_RSS_ENABLED; |
| 161 | if (adapter->hw.mac.type == ixgbe_mac_82599EB) | ||
| 162 | adapter->flags |= IXGBE_FLAG_FDIR_HASH_CAPABLE; | ||
| 157 | ixgbe_init_interrupt_scheme(adapter); | 163 | ixgbe_init_interrupt_scheme(adapter); |
| 158 | if (netif_running(netdev)) | 164 | if (netif_running(netdev)) |
| 159 | netdev->netdev_ops->ndo_open(netdev); | 165 | netdev->netdev_ops->ndo_open(netdev); |
diff --git a/drivers/net/ixgbe/ixgbe_main.c b/drivers/net/ixgbe/ixgbe_main.c index a3061aacffd8..e3442f47f932 100644 --- a/drivers/net/ixgbe/ixgbe_main.c +++ b/drivers/net/ixgbe/ixgbe_main.c | |||
| @@ -3130,7 +3130,11 @@ static inline bool ixgbe_set_fcoe_queues(struct ixgbe_adapter *adapter) | |||
| 3130 | #endif | 3130 | #endif |
| 3131 | if (adapter->flags & IXGBE_FLAG_RSS_ENABLED) { | 3131 | if (adapter->flags & IXGBE_FLAG_RSS_ENABLED) { |
| 3132 | DPRINTK(PROBE, INFO, "FCOE enabled with RSS \n"); | 3132 | DPRINTK(PROBE, INFO, "FCOE enabled with RSS \n"); |
| 3133 | ixgbe_set_rss_queues(adapter); | 3133 | if ((adapter->flags & IXGBE_FLAG_FDIR_HASH_CAPABLE) || |
| 3134 | (adapter->flags & IXGBE_FLAG_FDIR_PERFECT_CAPABLE)) | ||
| 3135 | ixgbe_set_fdir_queues(adapter); | ||
| 3136 | else | ||
| 3137 | ixgbe_set_rss_queues(adapter); | ||
| 3134 | } | 3138 | } |
| 3135 | /* adding FCoE rx rings to the end */ | 3139 | /* adding FCoE rx rings to the end */ |
| 3136 | f->mask = adapter->num_rx_queues; | 3140 | f->mask = adapter->num_rx_queues; |
| @@ -3388,7 +3392,12 @@ static inline bool ixgbe_cache_ring_fcoe(struct ixgbe_adapter *adapter) | |||
| 3388 | } | 3392 | } |
| 3389 | #endif /* CONFIG_IXGBE_DCB */ | 3393 | #endif /* CONFIG_IXGBE_DCB */ |
| 3390 | if (adapter->flags & IXGBE_FLAG_RSS_ENABLED) { | 3394 | if (adapter->flags & IXGBE_FLAG_RSS_ENABLED) { |
| 3391 | ixgbe_cache_ring_rss(adapter); | 3395 | if ((adapter->flags & IXGBE_FLAG_FDIR_HASH_CAPABLE) || |
| 3396 | (adapter->flags & IXGBE_FLAG_FDIR_PERFECT_CAPABLE)) | ||
| 3397 | ixgbe_cache_ring_fdir(adapter); | ||
| 3398 | else | ||
| 3399 | ixgbe_cache_ring_rss(adapter); | ||
| 3400 | |||
| 3392 | fcoe_i = f->mask; | 3401 | fcoe_i = f->mask; |
| 3393 | } | 3402 | } |
| 3394 | for (i = 0; i < f->indices; i++, fcoe_i++) | 3403 | for (i = 0; i < f->indices; i++, fcoe_i++) |
| @@ -5578,12 +5587,6 @@ static int __devinit ixgbe_probe(struct pci_dev *pdev, | |||
| 5578 | netdev->features |= NETIF_F_FCOE_CRC; | 5587 | netdev->features |= NETIF_F_FCOE_CRC; |
| 5579 | netdev->features |= NETIF_F_FSO; | 5588 | netdev->features |= NETIF_F_FSO; |
| 5580 | netdev->fcoe_ddp_xid = IXGBE_FCOE_DDP_MAX - 1; | 5589 | netdev->fcoe_ddp_xid = IXGBE_FCOE_DDP_MAX - 1; |
| 5581 | DPRINTK(DRV, INFO, "FCoE enabled, " | ||
| 5582 | "disabling Flow Director\n"); | ||
| 5583 | adapter->flags &= ~IXGBE_FLAG_FDIR_HASH_CAPABLE; | ||
| 5584 | adapter->flags &= | ||
| 5585 | ~IXGBE_FLAG_FDIR_PERFECT_CAPABLE; | ||
| 5586 | adapter->atr_sample_rate = 0; | ||
| 5587 | } else { | 5590 | } else { |
| 5588 | adapter->flags &= ~IXGBE_FLAG_FCOE_ENABLED; | 5591 | adapter->flags &= ~IXGBE_FLAG_FCOE_ENABLED; |
| 5589 | } | 5592 | } |
diff --git a/drivers/net/r6040.c b/drivers/net/r6040.c index ed63d23a6452..961b5397a531 100644 --- a/drivers/net/r6040.c +++ b/drivers/net/r6040.c | |||
| @@ -49,8 +49,8 @@ | |||
| 49 | #include <asm/processor.h> | 49 | #include <asm/processor.h> |
| 50 | 50 | ||
| 51 | #define DRV_NAME "r6040" | 51 | #define DRV_NAME "r6040" |
| 52 | #define DRV_VERSION "0.23" | 52 | #define DRV_VERSION "0.24" |
| 53 | #define DRV_RELDATE "05May2009" | 53 | #define DRV_RELDATE "08Jul2009" |
| 54 | 54 | ||
| 55 | /* PHY CHIP Address */ | 55 | /* PHY CHIP Address */ |
| 56 | #define PHY1_ADDR 1 /* For MAC1 */ | 56 | #define PHY1_ADDR 1 /* For MAC1 */ |
| @@ -704,8 +704,11 @@ static irqreturn_t r6040_interrupt(int irq, void *dev_id) | |||
| 704 | /* Read MISR status and clear */ | 704 | /* Read MISR status and clear */ |
| 705 | status = ioread16(ioaddr + MISR); | 705 | status = ioread16(ioaddr + MISR); |
| 706 | 706 | ||
| 707 | if (status == 0x0000 || status == 0xffff) | 707 | if (status == 0x0000 || status == 0xffff) { |
| 708 | /* Restore RDC MAC interrupt */ | ||
| 709 | iowrite16(misr, ioaddr + MIER); | ||
| 708 | return IRQ_NONE; | 710 | return IRQ_NONE; |
| 711 | } | ||
| 709 | 712 | ||
| 710 | /* RX interrupt request */ | 713 | /* RX interrupt request */ |
| 711 | if (status & RX_INTS) { | 714 | if (status & RX_INTS) { |
diff --git a/drivers/net/wireless/ath/Kconfig b/drivers/net/wireless/ath/Kconfig index d26e7b485315..eb0337c49546 100644 --- a/drivers/net/wireless/ath/Kconfig +++ b/drivers/net/wireless/ath/Kconfig | |||
| @@ -1,5 +1,6 @@ | |||
| 1 | config ATH_COMMON | 1 | config ATH_COMMON |
| 2 | tristate "Atheros Wireless Cards" | 2 | tristate "Atheros Wireless Cards" |
| 3 | depends on WLAN_80211 | ||
| 3 | depends on ATH5K || ATH9K || AR9170_USB | 4 | depends on ATH5K || ATH9K || AR9170_USB |
| 4 | 5 | ||
| 5 | source "drivers/net/wireless/ath/ath5k/Kconfig" | 6 | source "drivers/net/wireless/ath/ath5k/Kconfig" |
diff --git a/drivers/net/wireless/ath/ath9k/xmit.c b/drivers/net/wireless/ath/ath9k/xmit.c index b61a071788a5..4ccf48e396df 100644 --- a/drivers/net/wireless/ath/ath9k/xmit.c +++ b/drivers/net/wireless/ath/ath9k/xmit.c | |||
| @@ -355,7 +355,14 @@ static void ath_tx_complete_aggr(struct ath_softc *sc, struct ath_txq *txq, | |||
| 355 | } | 355 | } |
| 356 | 356 | ||
| 357 | if (bf_next == NULL) { | 357 | if (bf_next == NULL) { |
| 358 | INIT_LIST_HEAD(&bf_head); | 358 | /* |
| 359 | * Make sure the last desc is reclaimed if it | ||
| 360 | * not a holding desc. | ||
| 361 | */ | ||
| 362 | if (!bf_last->bf_stale) | ||
| 363 | list_move_tail(&bf->list, &bf_head); | ||
| 364 | else | ||
| 365 | INIT_LIST_HEAD(&bf_head); | ||
| 359 | } else { | 366 | } else { |
| 360 | ASSERT(!list_empty(bf_q)); | 367 | ASSERT(!list_empty(bf_q)); |
| 361 | list_move_tail(&bf->list, &bf_head); | 368 | list_move_tail(&bf->list, &bf_head); |
diff --git a/drivers/net/wireless/b43/b43.h b/drivers/net/wireless/b43/b43.h index f580c2812d91..40448067e4cc 100644 --- a/drivers/net/wireless/b43/b43.h +++ b/drivers/net/wireless/b43/b43.h | |||
| @@ -648,6 +648,7 @@ struct b43_wl { | |||
| 648 | u8 nr_devs; | 648 | u8 nr_devs; |
| 649 | 649 | ||
| 650 | bool radiotap_enabled; | 650 | bool radiotap_enabled; |
| 651 | bool radio_enabled; | ||
| 651 | 652 | ||
| 652 | /* The beacon we are currently using (AP or IBSS mode). | 653 | /* The beacon we are currently using (AP or IBSS mode). |
| 653 | * This beacon stuff is protected by the irq_lock. */ | 654 | * This beacon stuff is protected by the irq_lock. */ |
diff --git a/drivers/net/wireless/b43/main.c b/drivers/net/wireless/b43/main.c index 6456afebdba1..e71c8d9cd706 100644 --- a/drivers/net/wireless/b43/main.c +++ b/drivers/net/wireless/b43/main.c | |||
| @@ -3497,8 +3497,8 @@ static int b43_op_config(struct ieee80211_hw *hw, u32 changed) | |||
| 3497 | if (phy->ops->set_rx_antenna) | 3497 | if (phy->ops->set_rx_antenna) |
| 3498 | phy->ops->set_rx_antenna(dev, antenna); | 3498 | phy->ops->set_rx_antenna(dev, antenna); |
| 3499 | 3499 | ||
| 3500 | if (!!conf->radio_enabled != phy->radio_on) { | 3500 | if (wl->radio_enabled != phy->radio_on) { |
| 3501 | if (conf->radio_enabled) { | 3501 | if (wl->radio_enabled) { |
| 3502 | b43_software_rfkill(dev, false); | 3502 | b43_software_rfkill(dev, false); |
| 3503 | b43info(dev->wl, "Radio turned on by software\n"); | 3503 | b43info(dev->wl, "Radio turned on by software\n"); |
| 3504 | if (!dev->radio_hw_enable) { | 3504 | if (!dev->radio_hw_enable) { |
| @@ -4339,6 +4339,7 @@ static int b43_op_start(struct ieee80211_hw *hw) | |||
| 4339 | wl->beacon0_uploaded = 0; | 4339 | wl->beacon0_uploaded = 0; |
| 4340 | wl->beacon1_uploaded = 0; | 4340 | wl->beacon1_uploaded = 0; |
| 4341 | wl->beacon_templates_virgin = 1; | 4341 | wl->beacon_templates_virgin = 1; |
| 4342 | wl->radio_enabled = 1; | ||
| 4342 | 4343 | ||
| 4343 | mutex_lock(&wl->mutex); | 4344 | mutex_lock(&wl->mutex); |
| 4344 | 4345 | ||
| @@ -4378,6 +4379,7 @@ static void b43_op_stop(struct ieee80211_hw *hw) | |||
| 4378 | if (b43_status(dev) >= B43_STAT_STARTED) | 4379 | if (b43_status(dev) >= B43_STAT_STARTED) |
| 4379 | b43_wireless_core_stop(dev); | 4380 | b43_wireless_core_stop(dev); |
| 4380 | b43_wireless_core_exit(dev); | 4381 | b43_wireless_core_exit(dev); |
| 4382 | wl->radio_enabled = 0; | ||
| 4381 | mutex_unlock(&wl->mutex); | 4383 | mutex_unlock(&wl->mutex); |
| 4382 | 4384 | ||
| 4383 | cancel_work_sync(&(wl->txpower_adjust_work)); | 4385 | cancel_work_sync(&(wl->txpower_adjust_work)); |
| @@ -4560,6 +4562,7 @@ static int b43_wireless_core_attach(struct b43_wldev *dev) | |||
| 4560 | B43_WARN_ON(1); | 4562 | B43_WARN_ON(1); |
| 4561 | 4563 | ||
| 4562 | dev->phy.gmode = have_2ghz_phy; | 4564 | dev->phy.gmode = have_2ghz_phy; |
| 4565 | dev->phy.radio_on = 1; | ||
| 4563 | tmp = dev->phy.gmode ? B43_TMSLOW_GMODE : 0; | 4566 | tmp = dev->phy.gmode ? B43_TMSLOW_GMODE : 0; |
| 4564 | b43_wireless_core_reset(dev, tmp); | 4567 | b43_wireless_core_reset(dev, tmp); |
| 4565 | 4568 | ||
diff --git a/drivers/net/wireless/b43/pcmcia.c b/drivers/net/wireless/b43/pcmcia.c index 3cfc30307a27..6c3a74964ab8 100644 --- a/drivers/net/wireless/b43/pcmcia.c +++ b/drivers/net/wireless/b43/pcmcia.c | |||
| @@ -35,6 +35,7 @@ | |||
| 35 | 35 | ||
| 36 | static /*const */ struct pcmcia_device_id b43_pcmcia_tbl[] = { | 36 | static /*const */ struct pcmcia_device_id b43_pcmcia_tbl[] = { |
| 37 | PCMCIA_DEVICE_MANF_CARD(0x2D0, 0x448), | 37 | PCMCIA_DEVICE_MANF_CARD(0x2D0, 0x448), |
| 38 | PCMCIA_DEVICE_MANF_CARD(0x2D0, 0x476), | ||
| 38 | PCMCIA_DEVICE_NULL, | 39 | PCMCIA_DEVICE_NULL, |
| 39 | }; | 40 | }; |
| 40 | 41 | ||
diff --git a/drivers/net/wireless/b43legacy/b43legacy.h b/drivers/net/wireless/b43legacy/b43legacy.h index 77fda148ac46..038baa8869e2 100644 --- a/drivers/net/wireless/b43legacy/b43legacy.h +++ b/drivers/net/wireless/b43legacy/b43legacy.h | |||
| @@ -607,6 +607,7 @@ struct b43legacy_wl { | |||
| 607 | u8 nr_devs; | 607 | u8 nr_devs; |
| 608 | 608 | ||
| 609 | bool radiotap_enabled; | 609 | bool radiotap_enabled; |
| 610 | bool radio_enabled; | ||
| 610 | 611 | ||
| 611 | /* The beacon we are currently using (AP or IBSS mode). | 612 | /* The beacon we are currently using (AP or IBSS mode). |
| 612 | * This beacon stuff is protected by the irq_lock. */ | 613 | * This beacon stuff is protected by the irq_lock. */ |
diff --git a/drivers/net/wireless/b43legacy/main.c b/drivers/net/wireless/b43legacy/main.c index e5136fb65ddd..c4973c1942bf 100644 --- a/drivers/net/wireless/b43legacy/main.c +++ b/drivers/net/wireless/b43legacy/main.c | |||
| @@ -2689,8 +2689,8 @@ static int b43legacy_op_dev_config(struct ieee80211_hw *hw, | |||
| 2689 | /* Antennas for RX and management frame TX. */ | 2689 | /* Antennas for RX and management frame TX. */ |
| 2690 | b43legacy_mgmtframe_txantenna(dev, antenna_tx); | 2690 | b43legacy_mgmtframe_txantenna(dev, antenna_tx); |
| 2691 | 2691 | ||
| 2692 | if (!!conf->radio_enabled != phy->radio_on) { | 2692 | if (wl->radio_enabled != phy->radio_on) { |
| 2693 | if (conf->radio_enabled) { | 2693 | if (wl->radio_enabled) { |
| 2694 | b43legacy_radio_turn_on(dev); | 2694 | b43legacy_radio_turn_on(dev); |
| 2695 | b43legacyinfo(dev->wl, "Radio turned on by software\n"); | 2695 | b43legacyinfo(dev->wl, "Radio turned on by software\n"); |
| 2696 | if (!dev->radio_hw_enable) | 2696 | if (!dev->radio_hw_enable) |
| @@ -3441,6 +3441,7 @@ static int b43legacy_op_start(struct ieee80211_hw *hw) | |||
| 3441 | wl->beacon0_uploaded = 0; | 3441 | wl->beacon0_uploaded = 0; |
| 3442 | wl->beacon1_uploaded = 0; | 3442 | wl->beacon1_uploaded = 0; |
| 3443 | wl->beacon_templates_virgin = 1; | 3443 | wl->beacon_templates_virgin = 1; |
| 3444 | wl->radio_enabled = 1; | ||
| 3444 | 3445 | ||
| 3445 | mutex_lock(&wl->mutex); | 3446 | mutex_lock(&wl->mutex); |
| 3446 | 3447 | ||
| @@ -3479,6 +3480,7 @@ static void b43legacy_op_stop(struct ieee80211_hw *hw) | |||
| 3479 | if (b43legacy_status(dev) >= B43legacy_STAT_STARTED) | 3480 | if (b43legacy_status(dev) >= B43legacy_STAT_STARTED) |
| 3480 | b43legacy_wireless_core_stop(dev); | 3481 | b43legacy_wireless_core_stop(dev); |
| 3481 | b43legacy_wireless_core_exit(dev); | 3482 | b43legacy_wireless_core_exit(dev); |
| 3483 | wl->radio_enabled = 0; | ||
| 3482 | mutex_unlock(&wl->mutex); | 3484 | mutex_unlock(&wl->mutex); |
| 3483 | } | 3485 | } |
| 3484 | 3486 | ||
| @@ -3620,6 +3622,7 @@ static int b43legacy_wireless_core_attach(struct b43legacy_wldev *dev) | |||
| 3620 | have_bphy = 1; | 3622 | have_bphy = 1; |
| 3621 | 3623 | ||
| 3622 | dev->phy.gmode = (have_gphy || have_bphy); | 3624 | dev->phy.gmode = (have_gphy || have_bphy); |
| 3625 | dev->phy.radio_on = 1; | ||
| 3623 | tmp = dev->phy.gmode ? B43legacy_TMSLOW_GMODE : 0; | 3626 | tmp = dev->phy.gmode ? B43legacy_TMSLOW_GMODE : 0; |
| 3624 | b43legacy_wireless_core_reset(dev, tmp); | 3627 | b43legacy_wireless_core_reset(dev, tmp); |
| 3625 | 3628 | ||
diff --git a/drivers/net/wireless/iwmc3200wifi/Kconfig b/drivers/net/wireless/iwmc3200wifi/Kconfig index 1eccb6df46dd..030401d367d3 100644 --- a/drivers/net/wireless/iwmc3200wifi/Kconfig +++ b/drivers/net/wireless/iwmc3200wifi/Kconfig | |||
| @@ -4,6 +4,15 @@ config IWM | |||
| 4 | depends on CFG80211 | 4 | depends on CFG80211 |
| 5 | select WIRELESS_EXT | 5 | select WIRELESS_EXT |
| 6 | select FW_LOADER | 6 | select FW_LOADER |
| 7 | help | ||
| 8 | The Intel Wireless Multicomm 3200 hardware is a combo | ||
| 9 | card with GPS, Bluetooth, WiMax and 802.11 radios. It | ||
| 10 | runs over SDIO and is typically found on Moorestown | ||
| 11 | based platform. This driver takes care of the 802.11 | ||
| 12 | part, which is a fullmac one. | ||
| 13 | |||
| 14 | If you choose to build it as a module, it'll be called | ||
| 15 | iwmc3200wifi.ko. | ||
| 7 | 16 | ||
| 8 | config IWM_DEBUG | 17 | config IWM_DEBUG |
| 9 | bool "Enable full debugging output in iwmc3200wifi" | 18 | bool "Enable full debugging output in iwmc3200wifi" |
diff --git a/drivers/net/wireless/mac80211_hwsim.c b/drivers/net/wireless/mac80211_hwsim.c index e789c6e9938c..a111bda392e2 100644 --- a/drivers/net/wireless/mac80211_hwsim.c +++ b/drivers/net/wireless/mac80211_hwsim.c | |||
| @@ -418,6 +418,7 @@ static bool mac80211_hwsim_tx_frame(struct ieee80211_hw *hw, | |||
| 418 | continue; | 418 | continue; |
| 419 | 419 | ||
| 420 | if (!data2->started || !hwsim_ps_rx_ok(data2, skb) || | 420 | if (!data2->started || !hwsim_ps_rx_ok(data2, skb) || |
| 421 | !data->channel || !data2->channel || | ||
| 421 | data->channel->center_freq != data2->channel->center_freq || | 422 | data->channel->center_freq != data2->channel->center_freq || |
| 422 | !(data->group & data2->group)) | 423 | !(data->group & data2->group)) |
| 423 | continue; | 424 | continue; |
diff --git a/drivers/net/wireless/p54/p54common.c b/drivers/net/wireless/p54/p54common.c index 48d81d98e12d..22ca122bd798 100644 --- a/drivers/net/wireless/p54/p54common.c +++ b/drivers/net/wireless/p54/p54common.c | |||
| @@ -912,13 +912,14 @@ static void p54_rx_frame_sent(struct ieee80211_hw *dev, struct sk_buff *skb) | |||
| 912 | } | 912 | } |
| 913 | 913 | ||
| 914 | __skb_unlink(entry, &priv->tx_queue); | 914 | __skb_unlink(entry, &priv->tx_queue); |
| 915 | spin_unlock_irqrestore(&priv->tx_queue.lock, flags); | ||
| 916 | 915 | ||
| 917 | frame_len = entry->len; | 916 | frame_len = entry->len; |
| 918 | entry_hdr = (struct p54_hdr *) entry->data; | 917 | entry_hdr = (struct p54_hdr *) entry->data; |
| 919 | entry_data = (struct p54_tx_data *) entry_hdr->data; | 918 | entry_data = (struct p54_tx_data *) entry_hdr->data; |
| 920 | priv->tx_stats[entry_data->hw_queue].len--; | 919 | if (priv->tx_stats[entry_data->hw_queue].len) |
| 920 | priv->tx_stats[entry_data->hw_queue].len--; | ||
| 921 | priv->stats.dot11ACKFailureCount += payload->tries - 1; | 921 | priv->stats.dot11ACKFailureCount += payload->tries - 1; |
| 922 | spin_unlock_irqrestore(&priv->tx_queue.lock, flags); | ||
| 922 | 923 | ||
| 923 | /* | 924 | /* |
| 924 | * Frames in P54_QUEUE_FWSCAN and P54_QUEUE_BEACON are | 925 | * Frames in P54_QUEUE_FWSCAN and P54_QUEUE_BEACON are |
diff --git a/drivers/net/wireless/zd1211rw/zd_usb.c b/drivers/net/wireless/zd1211rw/zd_usb.c index 14a19baff214..0e6e44689cc6 100644 --- a/drivers/net/wireless/zd1211rw/zd_usb.c +++ b/drivers/net/wireless/zd1211rw/zd_usb.c | |||
| @@ -38,7 +38,6 @@ static struct usb_device_id usb_ids[] = { | |||
| 38 | /* ZD1211 */ | 38 | /* ZD1211 */ |
| 39 | { USB_DEVICE(0x0ace, 0x1211), .driver_info = DEVICE_ZD1211 }, | 39 | { USB_DEVICE(0x0ace, 0x1211), .driver_info = DEVICE_ZD1211 }, |
| 40 | { USB_DEVICE(0x0ace, 0xa211), .driver_info = DEVICE_ZD1211 }, | 40 | { USB_DEVICE(0x0ace, 0xa211), .driver_info = DEVICE_ZD1211 }, |
| 41 | { USB_DEVICE(0x07b8, 0x6001), .driver_info = DEVICE_ZD1211 }, | ||
| 42 | { USB_DEVICE(0x126f, 0xa006), .driver_info = DEVICE_ZD1211 }, | 41 | { USB_DEVICE(0x126f, 0xa006), .driver_info = DEVICE_ZD1211 }, |
| 43 | { USB_DEVICE(0x6891, 0xa727), .driver_info = DEVICE_ZD1211 }, | 42 | { USB_DEVICE(0x6891, 0xa727), .driver_info = DEVICE_ZD1211 }, |
| 44 | { USB_DEVICE(0x0df6, 0x9071), .driver_info = DEVICE_ZD1211 }, | 43 | { USB_DEVICE(0x0df6, 0x9071), .driver_info = DEVICE_ZD1211 }, |
| @@ -61,6 +60,7 @@ static struct usb_device_id usb_ids[] = { | |||
| 61 | { USB_DEVICE(0x157e, 0x300a), .driver_info = DEVICE_ZD1211 }, | 60 | { USB_DEVICE(0x157e, 0x300a), .driver_info = DEVICE_ZD1211 }, |
| 62 | { USB_DEVICE(0x0105, 0x145f), .driver_info = DEVICE_ZD1211 }, | 61 | { USB_DEVICE(0x0105, 0x145f), .driver_info = DEVICE_ZD1211 }, |
| 63 | /* ZD1211B */ | 62 | /* ZD1211B */ |
| 63 | { USB_DEVICE(0x054c, 0x0257), .driver_info = DEVICE_ZD1211B }, | ||
| 64 | { USB_DEVICE(0x0ace, 0x1215), .driver_info = DEVICE_ZD1211B }, | 64 | { USB_DEVICE(0x0ace, 0x1215), .driver_info = DEVICE_ZD1211B }, |
| 65 | { USB_DEVICE(0x0ace, 0xb215), .driver_info = DEVICE_ZD1211B }, | 65 | { USB_DEVICE(0x0ace, 0xb215), .driver_info = DEVICE_ZD1211B }, |
| 66 | { USB_DEVICE(0x157e, 0x300d), .driver_info = DEVICE_ZD1211B }, | 66 | { USB_DEVICE(0x157e, 0x300d), .driver_info = DEVICE_ZD1211B }, |
| @@ -87,6 +87,7 @@ static struct usb_device_id usb_ids[] = { | |||
| 87 | { USB_DEVICE(0x0471, 0x1237), .driver_info = DEVICE_ZD1211B }, | 87 | { USB_DEVICE(0x0471, 0x1237), .driver_info = DEVICE_ZD1211B }, |
| 88 | { USB_DEVICE(0x07fa, 0x1196), .driver_info = DEVICE_ZD1211B }, | 88 | { USB_DEVICE(0x07fa, 0x1196), .driver_info = DEVICE_ZD1211B }, |
| 89 | { USB_DEVICE(0x0df6, 0x0036), .driver_info = DEVICE_ZD1211B }, | 89 | { USB_DEVICE(0x0df6, 0x0036), .driver_info = DEVICE_ZD1211B }, |
| 90 | { USB_DEVICE(0x07b8, 0x6001), .driver_info = DEVICE_ZD1211B }, | ||
| 90 | /* "Driverless" devices that need ejecting */ | 91 | /* "Driverless" devices that need ejecting */ |
| 91 | { USB_DEVICE(0x0ace, 0x2011), .driver_info = DEVICE_INSTALLER }, | 92 | { USB_DEVICE(0x0ace, 0x2011), .driver_info = DEVICE_INSTALLER }, |
| 92 | { USB_DEVICE(0x0ace, 0x20ff), .driver_info = DEVICE_INSTALLER }, | 93 | { USB_DEVICE(0x0ace, 0x20ff), .driver_info = DEVICE_INSTALLER }, |
diff --git a/drivers/platform/x86/hp-wmi.c b/drivers/platform/x86/hp-wmi.c index 4ac2311c00af..ca508564a181 100644 --- a/drivers/platform/x86/hp-wmi.c +++ b/drivers/platform/x86/hp-wmi.c | |||
| @@ -171,7 +171,7 @@ static int hp_wmi_tablet_state(void) | |||
| 171 | static int hp_wmi_set_block(void *data, bool blocked) | 171 | static int hp_wmi_set_block(void *data, bool blocked) |
| 172 | { | 172 | { |
| 173 | unsigned long b = (unsigned long) data; | 173 | unsigned long b = (unsigned long) data; |
| 174 | int query = BIT(b + 8) | ((!!blocked) << b); | 174 | int query = BIT(b + 8) | ((!blocked) << b); |
| 175 | 175 | ||
| 176 | return hp_wmi_perform_query(HPWMI_WIRELESS_QUERY, 1, query); | 176 | return hp_wmi_perform_query(HPWMI_WIRELESS_QUERY, 1, query); |
| 177 | } | 177 | } |
diff --git a/drivers/ssb/pcmcia.c b/drivers/ssb/pcmcia.c index 131030f693c7..100e7a5c5ea1 100644 --- a/drivers/ssb/pcmcia.c +++ b/drivers/ssb/pcmcia.c | |||
| @@ -678,7 +678,8 @@ int ssb_pcmcia_get_invariants(struct ssb_bus *bus, | |||
| 678 | sprom->board_rev = tuple.TupleData[1]; | 678 | sprom->board_rev = tuple.TupleData[1]; |
| 679 | break; | 679 | break; |
| 680 | case SSB_PCMCIA_CIS_PA: | 680 | case SSB_PCMCIA_CIS_PA: |
| 681 | GOTO_ERROR_ON(tuple.TupleDataLen != 9, | 681 | GOTO_ERROR_ON((tuple.TupleDataLen != 9) && |
| 682 | (tuple.TupleDataLen != 10), | ||
| 682 | "pa tpl size"); | 683 | "pa tpl size"); |
| 683 | sprom->pa0b0 = tuple.TupleData[1] | | 684 | sprom->pa0b0 = tuple.TupleData[1] | |
| 684 | ((u16)tuple.TupleData[2] << 8); | 685 | ((u16)tuple.TupleData[2] << 8); |
| @@ -718,7 +719,8 @@ int ssb_pcmcia_get_invariants(struct ssb_bus *bus, | |||
| 718 | sprom->antenna_gain.ghz5.a3 = tuple.TupleData[1]; | 719 | sprom->antenna_gain.ghz5.a3 = tuple.TupleData[1]; |
| 719 | break; | 720 | break; |
| 720 | case SSB_PCMCIA_CIS_BFLAGS: | 721 | case SSB_PCMCIA_CIS_BFLAGS: |
| 721 | GOTO_ERROR_ON(tuple.TupleDataLen != 3, | 722 | GOTO_ERROR_ON((tuple.TupleDataLen != 3) && |
| 723 | (tuple.TupleDataLen != 5), | ||
| 722 | "bfl tpl size"); | 724 | "bfl tpl size"); |
| 723 | sprom->boardflags_lo = tuple.TupleData[1] | | 725 | sprom->boardflags_lo = tuple.TupleData[1] | |
| 724 | ((u16)tuple.TupleData[2] << 8); | 726 | ((u16)tuple.TupleData[2] << 8); |
diff --git a/include/linux/rfkill.h b/include/linux/rfkill.h index e73e2429a1b1..2ce29831feb6 100644 --- a/include/linux/rfkill.h +++ b/include/linux/rfkill.h | |||
| @@ -99,7 +99,6 @@ enum rfkill_user_states { | |||
| 99 | #undef RFKILL_STATE_UNBLOCKED | 99 | #undef RFKILL_STATE_UNBLOCKED |
| 100 | #undef RFKILL_STATE_HARD_BLOCKED | 100 | #undef RFKILL_STATE_HARD_BLOCKED |
| 101 | 101 | ||
| 102 | #include <linux/types.h> | ||
| 103 | #include <linux/kernel.h> | 102 | #include <linux/kernel.h> |
| 104 | #include <linux/list.h> | 103 | #include <linux/list.h> |
| 105 | #include <linux/mutex.h> | 104 | #include <linux/mutex.h> |
diff --git a/include/linux/spinlock.h b/include/linux/spinlock.h index 252b245cfcf4..4be57ab03478 100644 --- a/include/linux/spinlock.h +++ b/include/linux/spinlock.h | |||
| @@ -132,6 +132,11 @@ do { \ | |||
| 132 | #endif /*__raw_spin_is_contended*/ | 132 | #endif /*__raw_spin_is_contended*/ |
| 133 | #endif | 133 | #endif |
| 134 | 134 | ||
| 135 | /* The lock does not imply full memory barrier. */ | ||
| 136 | #ifndef ARCH_HAS_SMP_MB_AFTER_LOCK | ||
| 137 | static inline void smp_mb__after_lock(void) { smp_mb(); } | ||
| 138 | #endif | ||
| 139 | |||
| 135 | /** | 140 | /** |
| 136 | * spin_unlock_wait - wait until the spinlock gets unlocked | 141 | * spin_unlock_wait - wait until the spinlock gets unlocked |
| 137 | * @lock: the spinlock in question. | 142 | * @lock: the spinlock in question. |
diff --git a/include/net/sock.h b/include/net/sock.h index 352f06bbd7a9..2c0da9239b95 100644 --- a/include/net/sock.h +++ b/include/net/sock.h | |||
| @@ -54,6 +54,7 @@ | |||
| 54 | 54 | ||
| 55 | #include <linux/filter.h> | 55 | #include <linux/filter.h> |
| 56 | #include <linux/rculist_nulls.h> | 56 | #include <linux/rculist_nulls.h> |
| 57 | #include <linux/poll.h> | ||
| 57 | 58 | ||
| 58 | #include <asm/atomic.h> | 59 | #include <asm/atomic.h> |
| 59 | #include <net/dst.h> | 60 | #include <net/dst.h> |
| @@ -1241,6 +1242,74 @@ static inline int sk_has_allocations(const struct sock *sk) | |||
| 1241 | return sk_wmem_alloc_get(sk) || sk_rmem_alloc_get(sk); | 1242 | return sk_wmem_alloc_get(sk) || sk_rmem_alloc_get(sk); |
| 1242 | } | 1243 | } |
| 1243 | 1244 | ||
| 1245 | /** | ||
| 1246 | * sk_has_sleeper - check if there are any waiting processes | ||
| 1247 | * @sk: socket | ||
| 1248 | * | ||
| 1249 | * Returns true if socket has waiting processes | ||
| 1250 | * | ||
| 1251 | * The purpose of the sk_has_sleeper and sock_poll_wait is to wrap the memory | ||
| 1252 | * barrier call. They were added due to the race found within the tcp code. | ||
| 1253 | * | ||
| 1254 | * Consider following tcp code paths: | ||
| 1255 | * | ||
| 1256 | * CPU1 CPU2 | ||
| 1257 | * | ||
| 1258 | * sys_select receive packet | ||
| 1259 | * ... ... | ||
| 1260 | * __add_wait_queue update tp->rcv_nxt | ||
| 1261 | * ... ... | ||
| 1262 | * tp->rcv_nxt check sock_def_readable | ||
| 1263 | * ... { | ||
| 1264 | * schedule ... | ||
| 1265 | * if (sk->sk_sleep && waitqueue_active(sk->sk_sleep)) | ||
| 1266 | * wake_up_interruptible(sk->sk_sleep) | ||
| 1267 | * ... | ||
| 1268 | * } | ||
| 1269 | * | ||
| 1270 | * The race for tcp fires when the __add_wait_queue changes done by CPU1 stay | ||
| 1271 | * in its cache, and so does the tp->rcv_nxt update on CPU2 side. The CPU1 | ||
| 1272 | * could then endup calling schedule and sleep forever if there are no more | ||
| 1273 | * data on the socket. | ||
| 1274 | * | ||
| 1275 | * The sk_has_sleeper is always called right after a call to read_lock, so we | ||
| 1276 | * can use smp_mb__after_lock barrier. | ||
| 1277 | */ | ||
| 1278 | static inline int sk_has_sleeper(struct sock *sk) | ||
| 1279 | { | ||
| 1280 | /* | ||
| 1281 | * We need to be sure we are in sync with the | ||
| 1282 | * add_wait_queue modifications to the wait queue. | ||
| 1283 | * | ||
| 1284 | * This memory barrier is paired in the sock_poll_wait. | ||
| 1285 | */ | ||
| 1286 | smp_mb__after_lock(); | ||
| 1287 | return sk->sk_sleep && waitqueue_active(sk->sk_sleep); | ||
| 1288 | } | ||
| 1289 | |||
| 1290 | /** | ||
| 1291 | * sock_poll_wait - place memory barrier behind the poll_wait call. | ||
| 1292 | * @filp: file | ||
| 1293 | * @wait_address: socket wait queue | ||
| 1294 | * @p: poll_table | ||
| 1295 | * | ||
| 1296 | * See the comments in the sk_has_sleeper function. | ||
| 1297 | */ | ||
| 1298 | static inline void sock_poll_wait(struct file *filp, | ||
| 1299 | wait_queue_head_t *wait_address, poll_table *p) | ||
| 1300 | { | ||
| 1301 | if (p && wait_address) { | ||
| 1302 | poll_wait(filp, wait_address, p); | ||
| 1303 | /* | ||
| 1304 | * We need to be sure we are in sync with the | ||
| 1305 | * socket flags modification. | ||
| 1306 | * | ||
| 1307 | * This memory barrier is paired in the sk_has_sleeper. | ||
| 1308 | */ | ||
| 1309 | smp_mb(); | ||
| 1310 | } | ||
| 1311 | } | ||
| 1312 | |||
| 1244 | /* | 1313 | /* |
| 1245 | * Queue a received datagram if it will fit. Stream and sequenced | 1314 | * Queue a received datagram if it will fit. Stream and sequenced |
| 1246 | * protocols can't normally use this as they need to fit buffers in | 1315 | * protocols can't normally use this as they need to fit buffers in |
diff --git a/net/atm/common.c b/net/atm/common.c index c1c97936192c..8c4d843eb17f 100644 --- a/net/atm/common.c +++ b/net/atm/common.c | |||
| @@ -92,7 +92,7 @@ static void vcc_sock_destruct(struct sock *sk) | |||
| 92 | static void vcc_def_wakeup(struct sock *sk) | 92 | static void vcc_def_wakeup(struct sock *sk) |
| 93 | { | 93 | { |
| 94 | read_lock(&sk->sk_callback_lock); | 94 | read_lock(&sk->sk_callback_lock); |
| 95 | if (sk->sk_sleep && waitqueue_active(sk->sk_sleep)) | 95 | if (sk_has_sleeper(sk)) |
| 96 | wake_up(sk->sk_sleep); | 96 | wake_up(sk->sk_sleep); |
| 97 | read_unlock(&sk->sk_callback_lock); | 97 | read_unlock(&sk->sk_callback_lock); |
| 98 | } | 98 | } |
| @@ -110,7 +110,7 @@ static void vcc_write_space(struct sock *sk) | |||
| 110 | read_lock(&sk->sk_callback_lock); | 110 | read_lock(&sk->sk_callback_lock); |
| 111 | 111 | ||
| 112 | if (vcc_writable(sk)) { | 112 | if (vcc_writable(sk)) { |
| 113 | if (sk->sk_sleep && waitqueue_active(sk->sk_sleep)) | 113 | if (sk_has_sleeper(sk)) |
| 114 | wake_up_interruptible(sk->sk_sleep); | 114 | wake_up_interruptible(sk->sk_sleep); |
| 115 | 115 | ||
| 116 | sk_wake_async(sk, SOCK_WAKE_SPACE, POLL_OUT); | 116 | sk_wake_async(sk, SOCK_WAKE_SPACE, POLL_OUT); |
| @@ -594,7 +594,7 @@ unsigned int vcc_poll(struct file *file, struct socket *sock, poll_table *wait) | |||
| 594 | struct atm_vcc *vcc; | 594 | struct atm_vcc *vcc; |
| 595 | unsigned int mask; | 595 | unsigned int mask; |
| 596 | 596 | ||
| 597 | poll_wait(file, sk->sk_sleep, wait); | 597 | sock_poll_wait(file, sk->sk_sleep, wait); |
| 598 | mask = 0; | 598 | mask = 0; |
| 599 | 599 | ||
| 600 | vcc = ATM_SD(sock); | 600 | vcc = ATM_SD(sock); |
diff --git a/net/core/datagram.c b/net/core/datagram.c index 58abee1f1df1..b0fe69211eef 100644 --- a/net/core/datagram.c +++ b/net/core/datagram.c | |||
| @@ -712,7 +712,7 @@ unsigned int datagram_poll(struct file *file, struct socket *sock, | |||
| 712 | struct sock *sk = sock->sk; | 712 | struct sock *sk = sock->sk; |
| 713 | unsigned int mask; | 713 | unsigned int mask; |
| 714 | 714 | ||
| 715 | poll_wait(file, sk->sk_sleep, wait); | 715 | sock_poll_wait(file, sk->sk_sleep, wait); |
| 716 | mask = 0; | 716 | mask = 0; |
| 717 | 717 | ||
| 718 | /* exceptional events? */ | 718 | /* exceptional events? */ |
diff --git a/net/core/netpoll.c b/net/core/netpoll.c index 9675f312830d..df30feb2fc72 100644 --- a/net/core/netpoll.c +++ b/net/core/netpoll.c | |||
| @@ -740,7 +740,7 @@ int netpoll_setup(struct netpoll *np) | |||
| 740 | np->name); | 740 | np->name); |
| 741 | break; | 741 | break; |
| 742 | } | 742 | } |
| 743 | cond_resched(); | 743 | msleep(1); |
| 744 | } | 744 | } |
| 745 | 745 | ||
| 746 | /* If carrier appears to come up instantly, we don't | 746 | /* If carrier appears to come up instantly, we don't |
diff --git a/net/core/sock.c b/net/core/sock.c index b0ba569bc973..6354863b1c68 100644 --- a/net/core/sock.c +++ b/net/core/sock.c | |||
| @@ -1715,7 +1715,7 @@ EXPORT_SYMBOL(sock_no_sendpage); | |||
| 1715 | static void sock_def_wakeup(struct sock *sk) | 1715 | static void sock_def_wakeup(struct sock *sk) |
| 1716 | { | 1716 | { |
| 1717 | read_lock(&sk->sk_callback_lock); | 1717 | read_lock(&sk->sk_callback_lock); |
| 1718 | if (sk->sk_sleep && waitqueue_active(sk->sk_sleep)) | 1718 | if (sk_has_sleeper(sk)) |
| 1719 | wake_up_interruptible_all(sk->sk_sleep); | 1719 | wake_up_interruptible_all(sk->sk_sleep); |
| 1720 | read_unlock(&sk->sk_callback_lock); | 1720 | read_unlock(&sk->sk_callback_lock); |
| 1721 | } | 1721 | } |
| @@ -1723,7 +1723,7 @@ static void sock_def_wakeup(struct sock *sk) | |||
| 1723 | static void sock_def_error_report(struct sock *sk) | 1723 | static void sock_def_error_report(struct sock *sk) |
| 1724 | { | 1724 | { |
| 1725 | read_lock(&sk->sk_callback_lock); | 1725 | read_lock(&sk->sk_callback_lock); |
| 1726 | if (sk->sk_sleep && waitqueue_active(sk->sk_sleep)) | 1726 | if (sk_has_sleeper(sk)) |
| 1727 | wake_up_interruptible_poll(sk->sk_sleep, POLLERR); | 1727 | wake_up_interruptible_poll(sk->sk_sleep, POLLERR); |
| 1728 | sk_wake_async(sk, SOCK_WAKE_IO, POLL_ERR); | 1728 | sk_wake_async(sk, SOCK_WAKE_IO, POLL_ERR); |
| 1729 | read_unlock(&sk->sk_callback_lock); | 1729 | read_unlock(&sk->sk_callback_lock); |
| @@ -1732,7 +1732,7 @@ static void sock_def_error_report(struct sock *sk) | |||
| 1732 | static void sock_def_readable(struct sock *sk, int len) | 1732 | static void sock_def_readable(struct sock *sk, int len) |
| 1733 | { | 1733 | { |
| 1734 | read_lock(&sk->sk_callback_lock); | 1734 | read_lock(&sk->sk_callback_lock); |
| 1735 | if (sk->sk_sleep && waitqueue_active(sk->sk_sleep)) | 1735 | if (sk_has_sleeper(sk)) |
| 1736 | wake_up_interruptible_sync_poll(sk->sk_sleep, POLLIN | | 1736 | wake_up_interruptible_sync_poll(sk->sk_sleep, POLLIN | |
| 1737 | POLLRDNORM | POLLRDBAND); | 1737 | POLLRDNORM | POLLRDBAND); |
| 1738 | sk_wake_async(sk, SOCK_WAKE_WAITD, POLL_IN); | 1738 | sk_wake_async(sk, SOCK_WAKE_WAITD, POLL_IN); |
| @@ -1747,7 +1747,7 @@ static void sock_def_write_space(struct sock *sk) | |||
| 1747 | * progress. --DaveM | 1747 | * progress. --DaveM |
| 1748 | */ | 1748 | */ |
| 1749 | if ((atomic_read(&sk->sk_wmem_alloc) << 1) <= sk->sk_sndbuf) { | 1749 | if ((atomic_read(&sk->sk_wmem_alloc) << 1) <= sk->sk_sndbuf) { |
| 1750 | if (sk->sk_sleep && waitqueue_active(sk->sk_sleep)) | 1750 | if (sk_has_sleeper(sk)) |
| 1751 | wake_up_interruptible_sync_poll(sk->sk_sleep, POLLOUT | | 1751 | wake_up_interruptible_sync_poll(sk->sk_sleep, POLLOUT | |
| 1752 | POLLWRNORM | POLLWRBAND); | 1752 | POLLWRNORM | POLLWRBAND); |
| 1753 | 1753 | ||
diff --git a/net/dccp/output.c b/net/dccp/output.c index c0e88c16d088..c96119fda688 100644 --- a/net/dccp/output.c +++ b/net/dccp/output.c | |||
| @@ -196,7 +196,7 @@ void dccp_write_space(struct sock *sk) | |||
| 196 | { | 196 | { |
| 197 | read_lock(&sk->sk_callback_lock); | 197 | read_lock(&sk->sk_callback_lock); |
| 198 | 198 | ||
| 199 | if (sk->sk_sleep && waitqueue_active(sk->sk_sleep)) | 199 | if (sk_has_sleeper(sk)) |
| 200 | wake_up_interruptible(sk->sk_sleep); | 200 | wake_up_interruptible(sk->sk_sleep); |
| 201 | /* Should agree with poll, otherwise some programs break */ | 201 | /* Should agree with poll, otherwise some programs break */ |
| 202 | if (sock_writeable(sk)) | 202 | if (sock_writeable(sk)) |
diff --git a/net/dccp/proto.c b/net/dccp/proto.c index 314a1b5c033c..94ca8eaace7d 100644 --- a/net/dccp/proto.c +++ b/net/dccp/proto.c | |||
| @@ -311,7 +311,7 @@ unsigned int dccp_poll(struct file *file, struct socket *sock, | |||
| 311 | unsigned int mask; | 311 | unsigned int mask; |
| 312 | struct sock *sk = sock->sk; | 312 | struct sock *sk = sock->sk; |
| 313 | 313 | ||
| 314 | poll_wait(file, sk->sk_sleep, wait); | 314 | sock_poll_wait(file, sk->sk_sleep, wait); |
| 315 | if (sk->sk_state == DCCP_LISTEN) | 315 | if (sk->sk_state == DCCP_LISTEN) |
| 316 | return inet_csk_listen_poll(sk); | 316 | return inet_csk_listen_poll(sk); |
| 317 | 317 | ||
diff --git a/net/ipv4/fib_trie.c b/net/ipv4/fib_trie.c index 00a54b246dfe..63c2fa7b68c4 100644 --- a/net/ipv4/fib_trie.c +++ b/net/ipv4/fib_trie.c | |||
| @@ -316,8 +316,8 @@ static inline void check_tnode(const struct tnode *tn) | |||
| 316 | 316 | ||
| 317 | static const int halve_threshold = 25; | 317 | static const int halve_threshold = 25; |
| 318 | static const int inflate_threshold = 50; | 318 | static const int inflate_threshold = 50; |
| 319 | static const int halve_threshold_root = 8; | 319 | static const int halve_threshold_root = 15; |
| 320 | static const int inflate_threshold_root = 15; | 320 | static const int inflate_threshold_root = 25; |
| 321 | 321 | ||
| 322 | 322 | ||
| 323 | static void __alias_free_mem(struct rcu_head *head) | 323 | static void __alias_free_mem(struct rcu_head *head) |
diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c index 7870a535dac6..91145244ea63 100644 --- a/net/ipv4/tcp.c +++ b/net/ipv4/tcp.c | |||
| @@ -339,7 +339,7 @@ unsigned int tcp_poll(struct file *file, struct socket *sock, poll_table *wait) | |||
| 339 | struct sock *sk = sock->sk; | 339 | struct sock *sk = sock->sk; |
| 340 | struct tcp_sock *tp = tcp_sk(sk); | 340 | struct tcp_sock *tp = tcp_sk(sk); |
| 341 | 341 | ||
| 342 | poll_wait(file, sk->sk_sleep, wait); | 342 | sock_poll_wait(file, sk->sk_sleep, wait); |
| 343 | if (sk->sk_state == TCP_LISTEN) | 343 | if (sk->sk_state == TCP_LISTEN) |
| 344 | return inet_csk_listen_poll(sk); | 344 | return inet_csk_listen_poll(sk); |
| 345 | 345 | ||
diff --git a/net/iucv/af_iucv.c b/net/iucv/af_iucv.c index 6be5f92d1094..49c15b48408e 100644 --- a/net/iucv/af_iucv.c +++ b/net/iucv/af_iucv.c | |||
| @@ -306,7 +306,7 @@ static inline int iucv_below_msglim(struct sock *sk) | |||
| 306 | static void iucv_sock_wake_msglim(struct sock *sk) | 306 | static void iucv_sock_wake_msglim(struct sock *sk) |
| 307 | { | 307 | { |
| 308 | read_lock(&sk->sk_callback_lock); | 308 | read_lock(&sk->sk_callback_lock); |
| 309 | if (sk->sk_sleep && waitqueue_active(sk->sk_sleep)) | 309 | if (sk_has_sleeper(sk)) |
| 310 | wake_up_interruptible_all(sk->sk_sleep); | 310 | wake_up_interruptible_all(sk->sk_sleep); |
| 311 | sk_wake_async(sk, SOCK_WAKE_SPACE, POLL_OUT); | 311 | sk_wake_async(sk, SOCK_WAKE_SPACE, POLL_OUT); |
| 312 | read_unlock(&sk->sk_callback_lock); | 312 | read_unlock(&sk->sk_callback_lock); |
| @@ -1256,7 +1256,7 @@ unsigned int iucv_sock_poll(struct file *file, struct socket *sock, | |||
| 1256 | struct sock *sk = sock->sk; | 1256 | struct sock *sk = sock->sk; |
| 1257 | unsigned int mask = 0; | 1257 | unsigned int mask = 0; |
| 1258 | 1258 | ||
| 1259 | poll_wait(file, sk->sk_sleep, wait); | 1259 | sock_poll_wait(file, sk->sk_sleep, wait); |
| 1260 | 1260 | ||
| 1261 | if (sk->sk_state == IUCV_LISTEN) | 1261 | if (sk->sk_state == IUCV_LISTEN) |
| 1262 | return iucv_accept_poll(sk); | 1262 | return iucv_accept_poll(sk); |
diff --git a/net/mac80211/mesh_hwmp.c b/net/mac80211/mesh_hwmp.c index 003cb470ac84..f49ef288e2e2 100644 --- a/net/mac80211/mesh_hwmp.c +++ b/net/mac80211/mesh_hwmp.c | |||
| @@ -637,7 +637,7 @@ static void mesh_queue_preq(struct mesh_path *mpath, u8 flags) | |||
| 637 | struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh; | 637 | struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh; |
| 638 | struct mesh_preq_queue *preq_node; | 638 | struct mesh_preq_queue *preq_node; |
| 639 | 639 | ||
| 640 | preq_node = kmalloc(sizeof(struct mesh_preq_queue), GFP_KERNEL); | 640 | preq_node = kmalloc(sizeof(struct mesh_preq_queue), GFP_ATOMIC); |
| 641 | if (!preq_node) { | 641 | if (!preq_node) { |
| 642 | printk(KERN_DEBUG "Mesh HWMP: could not allocate PREQ node\n"); | 642 | printk(KERN_DEBUG "Mesh HWMP: could not allocate PREQ node\n"); |
| 643 | return; | 643 | return; |
diff --git a/net/mac80211/rc80211_minstrel.c b/net/mac80211/rc80211_minstrel.c index b218b98fba7f..37771abd8f5a 100644 --- a/net/mac80211/rc80211_minstrel.c +++ b/net/mac80211/rc80211_minstrel.c | |||
| @@ -66,7 +66,7 @@ rix_to_ndx(struct minstrel_sta_info *mi, int rix) | |||
| 66 | for (i = rix; i >= 0; i--) | 66 | for (i = rix; i >= 0; i--) |
| 67 | if (mi->r[i].rix == rix) | 67 | if (mi->r[i].rix == rix) |
| 68 | break; | 68 | break; |
| 69 | WARN_ON(mi->r[i].rix != rix); | 69 | WARN_ON(i < 0); |
| 70 | return i; | 70 | return i; |
| 71 | } | 71 | } |
| 72 | 72 | ||
| @@ -181,6 +181,9 @@ minstrel_tx_status(void *priv, struct ieee80211_supported_band *sband, | |||
| 181 | break; | 181 | break; |
| 182 | 182 | ||
| 183 | ndx = rix_to_ndx(mi, ar[i].idx); | 183 | ndx = rix_to_ndx(mi, ar[i].idx); |
| 184 | if (ndx < 0) | ||
| 185 | continue; | ||
| 186 | |||
| 184 | mi->r[ndx].attempts += ar[i].count; | 187 | mi->r[ndx].attempts += ar[i].count; |
| 185 | 188 | ||
| 186 | if ((i != IEEE80211_TX_MAX_RATES - 1) && (ar[i + 1].idx < 0)) | 189 | if ((i != IEEE80211_TX_MAX_RATES - 1) && (ar[i + 1].idx < 0)) |
diff --git a/net/rxrpc/af_rxrpc.c b/net/rxrpc/af_rxrpc.c index eac5e7bb7365..bfe493ebf27c 100644 --- a/net/rxrpc/af_rxrpc.c +++ b/net/rxrpc/af_rxrpc.c | |||
| @@ -63,7 +63,7 @@ static void rxrpc_write_space(struct sock *sk) | |||
| 63 | _enter("%p", sk); | 63 | _enter("%p", sk); |
| 64 | read_lock(&sk->sk_callback_lock); | 64 | read_lock(&sk->sk_callback_lock); |
| 65 | if (rxrpc_writable(sk)) { | 65 | if (rxrpc_writable(sk)) { |
| 66 | if (sk->sk_sleep && waitqueue_active(sk->sk_sleep)) | 66 | if (sk_has_sleeper(sk)) |
| 67 | wake_up_interruptible(sk->sk_sleep); | 67 | wake_up_interruptible(sk->sk_sleep); |
| 68 | sk_wake_async(sk, SOCK_WAKE_SPACE, POLL_OUT); | 68 | sk_wake_async(sk, SOCK_WAKE_SPACE, POLL_OUT); |
| 69 | } | 69 | } |
| @@ -588,7 +588,7 @@ static unsigned int rxrpc_poll(struct file *file, struct socket *sock, | |||
| 588 | unsigned int mask; | 588 | unsigned int mask; |
| 589 | struct sock *sk = sock->sk; | 589 | struct sock *sk = sock->sk; |
| 590 | 590 | ||
| 591 | poll_wait(file, sk->sk_sleep, wait); | 591 | sock_poll_wait(file, sk->sk_sleep, wait); |
| 592 | mask = 0; | 592 | mask = 0; |
| 593 | 593 | ||
| 594 | /* the socket is readable if there are any messages waiting on the Rx | 594 | /* the socket is readable if there are any messages waiting on the Rx |
diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c index 36d4e44d6233..fc3ebb906911 100644 --- a/net/unix/af_unix.c +++ b/net/unix/af_unix.c | |||
| @@ -315,7 +315,7 @@ static void unix_write_space(struct sock *sk) | |||
| 315 | { | 315 | { |
| 316 | read_lock(&sk->sk_callback_lock); | 316 | read_lock(&sk->sk_callback_lock); |
| 317 | if (unix_writable(sk)) { | 317 | if (unix_writable(sk)) { |
| 318 | if (sk->sk_sleep && waitqueue_active(sk->sk_sleep)) | 318 | if (sk_has_sleeper(sk)) |
| 319 | wake_up_interruptible_sync(sk->sk_sleep); | 319 | wake_up_interruptible_sync(sk->sk_sleep); |
| 320 | sk_wake_async(sk, SOCK_WAKE_SPACE, POLL_OUT); | 320 | sk_wake_async(sk, SOCK_WAKE_SPACE, POLL_OUT); |
| 321 | } | 321 | } |
| @@ -1985,7 +1985,7 @@ static unsigned int unix_poll(struct file *file, struct socket *sock, poll_table | |||
| 1985 | struct sock *sk = sock->sk; | 1985 | struct sock *sk = sock->sk; |
| 1986 | unsigned int mask; | 1986 | unsigned int mask; |
| 1987 | 1987 | ||
| 1988 | poll_wait(file, sk->sk_sleep, wait); | 1988 | sock_poll_wait(file, sk->sk_sleep, wait); |
| 1989 | mask = 0; | 1989 | mask = 0; |
| 1990 | 1990 | ||
| 1991 | /* exceptional events? */ | 1991 | /* exceptional events? */ |
| @@ -2022,7 +2022,7 @@ static unsigned int unix_dgram_poll(struct file *file, struct socket *sock, | |||
| 2022 | struct sock *sk = sock->sk, *other; | 2022 | struct sock *sk = sock->sk, *other; |
| 2023 | unsigned int mask, writable; | 2023 | unsigned int mask, writable; |
| 2024 | 2024 | ||
| 2025 | poll_wait(file, sk->sk_sleep, wait); | 2025 | sock_poll_wait(file, sk->sk_sleep, wait); |
| 2026 | mask = 0; | 2026 | mask = 0; |
| 2027 | 2027 | ||
| 2028 | /* exceptional events? */ | 2028 | /* exceptional events? */ |
| @@ -2053,7 +2053,7 @@ static unsigned int unix_dgram_poll(struct file *file, struct socket *sock, | |||
| 2053 | other = unix_peer_get(sk); | 2053 | other = unix_peer_get(sk); |
| 2054 | if (other) { | 2054 | if (other) { |
| 2055 | if (unix_peer(other) != sk) { | 2055 | if (unix_peer(other) != sk) { |
| 2056 | poll_wait(file, &unix_sk(other)->peer_wait, | 2056 | sock_poll_wait(file, &unix_sk(other)->peer_wait, |
| 2057 | wait); | 2057 | wait); |
| 2058 | if (unix_recvq_full(other)) | 2058 | if (unix_recvq_full(other)) |
| 2059 | writable = 0; | 2059 | writable = 0; |
diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c index 241bddd0b4f1..43bdb1372cae 100644 --- a/net/wireless/nl80211.c +++ b/net/wireless/nl80211.c | |||
| @@ -447,6 +447,7 @@ static int nl80211_set_wiphy(struct sk_buff *skb, struct genl_info *info) | |||
| 447 | 447 | ||
| 448 | rdev = __cfg80211_drv_from_info(info); | 448 | rdev = __cfg80211_drv_from_info(info); |
| 449 | if (IS_ERR(rdev)) { | 449 | if (IS_ERR(rdev)) { |
| 450 | mutex_unlock(&cfg80211_mutex); | ||
| 450 | result = PTR_ERR(rdev); | 451 | result = PTR_ERR(rdev); |
| 451 | goto unlock; | 452 | goto unlock; |
| 452 | } | 453 | } |
diff --git a/net/wireless/scan.c b/net/wireless/scan.c index e95b638b919f..f8e71b300001 100644 --- a/net/wireless/scan.c +++ b/net/wireless/scan.c | |||
| @@ -366,7 +366,6 @@ cfg80211_bss_update(struct cfg80211_registered_device *dev, | |||
| 366 | found = rb_find_bss(dev, res); | 366 | found = rb_find_bss(dev, res); |
| 367 | 367 | ||
| 368 | if (found) { | 368 | if (found) { |
| 369 | kref_get(&found->ref); | ||
| 370 | found->pub.beacon_interval = res->pub.beacon_interval; | 369 | found->pub.beacon_interval = res->pub.beacon_interval; |
| 371 | found->pub.tsf = res->pub.tsf; | 370 | found->pub.tsf = res->pub.tsf; |
| 372 | found->pub.signal = res->pub.signal; | 371 | found->pub.signal = res->pub.signal; |
