diff options
-rw-r--r-- | drivers/net/wireless/ath/ar9170/usb.c | 4 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-4965.c | 6 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-agn.c | 12 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl3945-base.c | 4 | ||||
-rw-r--r-- | drivers/net/wireless/libertas/cfg.c | 8 | ||||
-rw-r--r-- | drivers/net/wireless/libertas/dev.h | 1 | ||||
-rw-r--r-- | drivers/net/wireless/mwl8k.c | 1 | ||||
-rw-r--r-- | drivers/net/wireless/p54/p54usb.c | 1 | ||||
-rw-r--r-- | drivers/net/wireless/rt2x00/rt2500usb.c | 5 | ||||
-rw-r--r-- | drivers/net/wireless/rt2x00/rt2800lib.c | 4 | ||||
-rw-r--r-- | net/mac80211/mesh_hwmp.c | 4 | ||||
-rw-r--r-- | net/mac80211/tx.c | 6 | ||||
-rw-r--r-- | net/mac80211/util.c | 18 | ||||
-rw-r--r-- | net/wireless/reg.c | 12 |
14 files changed, 55 insertions, 31 deletions
diff --git a/drivers/net/wireless/ath/ar9170/usb.c b/drivers/net/wireless/ath/ar9170/usb.c index 4e30197afff6..6b1cb706e410 100644 --- a/drivers/net/wireless/ath/ar9170/usb.c +++ b/drivers/net/wireless/ath/ar9170/usb.c | |||
@@ -94,6 +94,8 @@ static struct usb_device_id ar9170_usb_ids[] = { | |||
94 | { USB_DEVICE(0x04bb, 0x093f) }, | 94 | { USB_DEVICE(0x04bb, 0x093f) }, |
95 | /* AVM FRITZ!WLAN USB Stick N */ | 95 | /* AVM FRITZ!WLAN USB Stick N */ |
96 | { USB_DEVICE(0x057C, 0x8401) }, | 96 | { USB_DEVICE(0x057C, 0x8401) }, |
97 | /* NEC WL300NU-G */ | ||
98 | { USB_DEVICE(0x0409, 0x0249) }, | ||
97 | /* AVM FRITZ!WLAN USB Stick N 2.4 */ | 99 | /* AVM FRITZ!WLAN USB Stick N 2.4 */ |
98 | { USB_DEVICE(0x057C, 0x8402), .driver_info = AR9170_REQ_FW1_ONLY }, | 100 | { USB_DEVICE(0x057C, 0x8402), .driver_info = AR9170_REQ_FW1_ONLY }, |
99 | 101 | ||
@@ -416,7 +418,7 @@ static int ar9170_usb_exec_cmd(struct ar9170 *ar, enum ar9170_cmd cmd, | |||
416 | spin_unlock_irqrestore(&aru->common.cmdlock, flags); | 418 | spin_unlock_irqrestore(&aru->common.cmdlock, flags); |
417 | 419 | ||
418 | usb_fill_int_urb(urb, aru->udev, | 420 | usb_fill_int_urb(urb, aru->udev, |
419 | usb_sndbulkpipe(aru->udev, AR9170_EP_CMD), | 421 | usb_sndintpipe(aru->udev, AR9170_EP_CMD), |
420 | aru->common.cmdbuf, plen + 4, | 422 | aru->common.cmdbuf, plen + 4, |
421 | ar9170_usb_tx_urb_complete, NULL, 1); | 423 | ar9170_usb_tx_urb_complete, NULL, 1); |
422 | 424 | ||
diff --git a/drivers/net/wireless/iwlwifi/iwl-4965.c b/drivers/net/wireless/iwlwifi/iwl-4965.c index 1bd2cd836026..83c52a682622 100644 --- a/drivers/net/wireless/iwlwifi/iwl-4965.c +++ b/drivers/net/wireless/iwlwifi/iwl-4965.c | |||
@@ -2041,16 +2041,14 @@ static void iwl4965_rx_reply_tx(struct iwl_priv *priv, | |||
2041 | tx_resp->failure_frame); | 2041 | tx_resp->failure_frame); |
2042 | 2042 | ||
2043 | freed = iwl_tx_queue_reclaim(priv, txq_id, index); | 2043 | freed = iwl_tx_queue_reclaim(priv, txq_id, index); |
2044 | if (qc && likely(sta_id != IWL_INVALID_STATION)) | 2044 | iwl_free_tfds_in_queue(priv, sta_id, tid, freed); |
2045 | priv->stations[sta_id].tid[tid].tfds_in_queue -= freed; | ||
2046 | 2045 | ||
2047 | if (priv->mac80211_registered && | 2046 | if (priv->mac80211_registered && |
2048 | (iwl_queue_space(&txq->q) > txq->q.low_mark)) | 2047 | (iwl_queue_space(&txq->q) > txq->q.low_mark)) |
2049 | iwl_wake_queue(priv, txq_id); | 2048 | iwl_wake_queue(priv, txq_id); |
2050 | } | 2049 | } |
2051 | 2050 | ||
2052 | if (qc && likely(sta_id != IWL_INVALID_STATION)) | 2051 | iwl_txq_check_empty(priv, sta_id, tid, txq_id); |
2053 | iwl_txq_check_empty(priv, sta_id, tid, txq_id); | ||
2054 | 2052 | ||
2055 | if (iwl_check_bits(status, TX_ABORT_REQUIRED_MSK)) | 2053 | if (iwl_check_bits(status, TX_ABORT_REQUIRED_MSK)) |
2056 | IWL_ERR(priv, "TODO: Implement Tx ABORT REQUIRED!!!\n"); | 2054 | IWL_ERR(priv, "TODO: Implement Tx ABORT REQUIRED!!!\n"); |
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn.c b/drivers/net/wireless/iwlwifi/iwl-agn.c index 818367b57bab..e4c2e1e448ad 100644 --- a/drivers/net/wireless/iwlwifi/iwl-agn.c +++ b/drivers/net/wireless/iwlwifi/iwl-agn.c | |||
@@ -1258,7 +1258,15 @@ static void iwl_irq_tasklet(struct iwl_priv *priv) | |||
1258 | /* Ack/clear/reset pending uCode interrupts. | 1258 | /* Ack/clear/reset pending uCode interrupts. |
1259 | * Note: Some bits in CSR_INT are "OR" of bits in CSR_FH_INT_STATUS, | 1259 | * Note: Some bits in CSR_INT are "OR" of bits in CSR_FH_INT_STATUS, |
1260 | */ | 1260 | */ |
1261 | iwl_write32(priv, CSR_INT, priv->inta); | 1261 | /* There is a hardware bug in the interrupt mask function that some |
1262 | * interrupts (i.e. CSR_INT_BIT_SCD) can still be generated even if | ||
1263 | * they are disabled in the CSR_INT_MASK register. Furthermore the | ||
1264 | * ICT interrupt handling mechanism has another bug that might cause | ||
1265 | * these unmasked interrupts fail to be detected. We workaround the | ||
1266 | * hardware bugs here by ACKing all the possible interrupts so that | ||
1267 | * interrupt coalescing can still be achieved. | ||
1268 | */ | ||
1269 | iwl_write32(priv, CSR_INT, priv->inta | ~priv->inta_mask); | ||
1262 | 1270 | ||
1263 | inta = priv->inta; | 1271 | inta = priv->inta; |
1264 | 1272 | ||
@@ -2644,7 +2652,7 @@ static int iwl_mac_setup_register(struct iwl_priv *priv) | |||
2644 | BIT(NL80211_IFTYPE_STATION) | | 2652 | BIT(NL80211_IFTYPE_STATION) | |
2645 | BIT(NL80211_IFTYPE_ADHOC); | 2653 | BIT(NL80211_IFTYPE_ADHOC); |
2646 | 2654 | ||
2647 | hw->wiphy->flags |= WIPHY_FLAG_STRICT_REGULATORY | | 2655 | hw->wiphy->flags |= WIPHY_FLAG_CUSTOM_REGULATORY | |
2648 | WIPHY_FLAG_DISABLE_BEACON_HINTS; | 2656 | WIPHY_FLAG_DISABLE_BEACON_HINTS; |
2649 | 2657 | ||
2650 | /* | 2658 | /* |
diff --git a/drivers/net/wireless/iwlwifi/iwl3945-base.c b/drivers/net/wireless/iwlwifi/iwl3945-base.c index 54daa38ecba3..e276f2a4e835 100644 --- a/drivers/net/wireless/iwlwifi/iwl3945-base.c +++ b/drivers/net/wireless/iwlwifi/iwl3945-base.c | |||
@@ -1955,7 +1955,7 @@ static void iwl3945_init_hw_rates(struct iwl_priv *priv, | |||
1955 | { | 1955 | { |
1956 | int i; | 1956 | int i; |
1957 | 1957 | ||
1958 | for (i = 0; i < IWL_RATE_COUNT; i++) { | 1958 | for (i = 0; i < IWL_RATE_COUNT_LEGACY; i++) { |
1959 | rates[i].bitrate = iwl3945_rates[i].ieee * 5; | 1959 | rates[i].bitrate = iwl3945_rates[i].ieee * 5; |
1960 | rates[i].hw_value = i; /* Rate scaling will work on indexes */ | 1960 | rates[i].hw_value = i; /* Rate scaling will work on indexes */ |
1961 | rates[i].hw_value_short = i; | 1961 | rates[i].hw_value_short = i; |
@@ -3921,7 +3921,7 @@ static int iwl3945_setup_mac(struct iwl_priv *priv) | |||
3921 | BIT(NL80211_IFTYPE_STATION) | | 3921 | BIT(NL80211_IFTYPE_STATION) | |
3922 | BIT(NL80211_IFTYPE_ADHOC); | 3922 | BIT(NL80211_IFTYPE_ADHOC); |
3923 | 3923 | ||
3924 | hw->wiphy->flags |= WIPHY_FLAG_STRICT_REGULATORY | | 3924 | hw->wiphy->flags |= WIPHY_FLAG_CUSTOM_REGULATORY | |
3925 | WIPHY_FLAG_DISABLE_BEACON_HINTS; | 3925 | WIPHY_FLAG_DISABLE_BEACON_HINTS; |
3926 | 3926 | ||
3927 | hw->wiphy->max_scan_ssids = PROBE_OPTION_MAX_3945; | 3927 | hw->wiphy->max_scan_ssids = PROBE_OPTION_MAX_3945; |
diff --git a/drivers/net/wireless/libertas/cfg.c b/drivers/net/wireless/libertas/cfg.c index 4396dccd12ac..82ebe1461a77 100644 --- a/drivers/net/wireless/libertas/cfg.c +++ b/drivers/net/wireless/libertas/cfg.c | |||
@@ -172,6 +172,8 @@ int lbs_cfg_register(struct lbs_private *priv) | |||
172 | if (ret < 0) | 172 | if (ret < 0) |
173 | lbs_pr_err("cannot register wiphy device\n"); | 173 | lbs_pr_err("cannot register wiphy device\n"); |
174 | 174 | ||
175 | priv->wiphy_registered = true; | ||
176 | |||
175 | ret = register_netdev(priv->dev); | 177 | ret = register_netdev(priv->dev); |
176 | if (ret) | 178 | if (ret) |
177 | lbs_pr_err("cannot register network device\n"); | 179 | lbs_pr_err("cannot register network device\n"); |
@@ -190,9 +192,11 @@ void lbs_cfg_free(struct lbs_private *priv) | |||
190 | if (!wdev) | 192 | if (!wdev) |
191 | return; | 193 | return; |
192 | 194 | ||
193 | if (wdev->wiphy) { | 195 | if (priv->wiphy_registered) |
194 | wiphy_unregister(wdev->wiphy); | 196 | wiphy_unregister(wdev->wiphy); |
197 | |||
198 | if (wdev->wiphy) | ||
195 | wiphy_free(wdev->wiphy); | 199 | wiphy_free(wdev->wiphy); |
196 | } | 200 | |
197 | kfree(wdev); | 201 | kfree(wdev); |
198 | } | 202 | } |
diff --git a/drivers/net/wireless/libertas/dev.h b/drivers/net/wireless/libertas/dev.h index 6977ee820214..6875e1498bd5 100644 --- a/drivers/net/wireless/libertas/dev.h +++ b/drivers/net/wireless/libertas/dev.h | |||
@@ -36,6 +36,7 @@ struct lbs_private { | |||
36 | 36 | ||
37 | /* CFG80211 */ | 37 | /* CFG80211 */ |
38 | struct wireless_dev *wdev; | 38 | struct wireless_dev *wdev; |
39 | bool wiphy_registered; | ||
39 | 40 | ||
40 | /* Mesh */ | 41 | /* Mesh */ |
41 | struct net_device *mesh_dev; /* Virtual device */ | 42 | struct net_device *mesh_dev; /* Virtual device */ |
diff --git a/drivers/net/wireless/mwl8k.c b/drivers/net/wireless/mwl8k.c index ac65e13eb0de..4e58ebe15580 100644 --- a/drivers/net/wireless/mwl8k.c +++ b/drivers/net/wireless/mwl8k.c | |||
@@ -3851,6 +3851,7 @@ MODULE_FIRMWARE("mwl8k/helper_8366.fw"); | |||
3851 | MODULE_FIRMWARE("mwl8k/fmimage_8366.fw"); | 3851 | MODULE_FIRMWARE("mwl8k/fmimage_8366.fw"); |
3852 | 3852 | ||
3853 | static DEFINE_PCI_DEVICE_TABLE(mwl8k_pci_id_table) = { | 3853 | static DEFINE_PCI_DEVICE_TABLE(mwl8k_pci_id_table) = { |
3854 | { PCI_VDEVICE(MARVELL, 0x2a0a), .driver_data = MWL8363, }, | ||
3854 | { PCI_VDEVICE(MARVELL, 0x2a0c), .driver_data = MWL8363, }, | 3855 | { PCI_VDEVICE(MARVELL, 0x2a0c), .driver_data = MWL8363, }, |
3855 | { PCI_VDEVICE(MARVELL, 0x2a24), .driver_data = MWL8363, }, | 3856 | { PCI_VDEVICE(MARVELL, 0x2a24), .driver_data = MWL8363, }, |
3856 | { PCI_VDEVICE(MARVELL, 0x2a2b), .driver_data = MWL8687, }, | 3857 | { PCI_VDEVICE(MARVELL, 0x2a2b), .driver_data = MWL8687, }, |
diff --git a/drivers/net/wireless/p54/p54usb.c b/drivers/net/wireless/p54/p54usb.c index b3c4fbd80d8d..e3cfc001d2fd 100644 --- a/drivers/net/wireless/p54/p54usb.c +++ b/drivers/net/wireless/p54/p54usb.c | |||
@@ -35,6 +35,7 @@ MODULE_FIRMWARE("isl3887usb"); | |||
35 | static struct usb_device_id p54u_table[] __devinitdata = { | 35 | static struct usb_device_id p54u_table[] __devinitdata = { |
36 | /* Version 1 devices (pci chip + net2280) */ | 36 | /* Version 1 devices (pci chip + net2280) */ |
37 | {USB_DEVICE(0x0506, 0x0a11)}, /* 3COM 3CRWE254G72 */ | 37 | {USB_DEVICE(0x0506, 0x0a11)}, /* 3COM 3CRWE254G72 */ |
38 | {USB_DEVICE(0x06b9, 0x0120)}, /* Thomson SpeedTouch 120g */ | ||
38 | {USB_DEVICE(0x0707, 0xee06)}, /* SMC 2862W-G */ | 39 | {USB_DEVICE(0x0707, 0xee06)}, /* SMC 2862W-G */ |
39 | {USB_DEVICE(0x07aa, 0x001c)}, /* Corega CG-WLUSB2GT */ | 40 | {USB_DEVICE(0x07aa, 0x001c)}, /* Corega CG-WLUSB2GT */ |
40 | {USB_DEVICE(0x083a, 0x4501)}, /* Accton 802.11g WN4501 USB */ | 41 | {USB_DEVICE(0x083a, 0x4501)}, /* Accton 802.11g WN4501 USB */ |
diff --git a/drivers/net/wireless/rt2x00/rt2500usb.c b/drivers/net/wireless/rt2x00/rt2500usb.c index 9b04964deced..13444b6b3e37 100644 --- a/drivers/net/wireless/rt2x00/rt2500usb.c +++ b/drivers/net/wireless/rt2x00/rt2500usb.c | |||
@@ -1643,6 +1643,11 @@ static int rt2500usb_probe_hw_mode(struct rt2x00_dev *rt2x00dev) | |||
1643 | unsigned int i; | 1643 | unsigned int i; |
1644 | 1644 | ||
1645 | /* | 1645 | /* |
1646 | * Disable powersaving as default. | ||
1647 | */ | ||
1648 | rt2x00dev->hw->wiphy->flags &= ~WIPHY_FLAG_PS_ON_BY_DEFAULT; | ||
1649 | |||
1650 | /* | ||
1646 | * Initialize all hw fields. | 1651 | * Initialize all hw fields. |
1647 | */ | 1652 | */ |
1648 | rt2x00dev->hw->flags = | 1653 | rt2x00dev->hw->flags = |
diff --git a/drivers/net/wireless/rt2x00/rt2800lib.c b/drivers/net/wireless/rt2x00/rt2800lib.c index 18d4d8e4ae6b..326fce78489d 100644 --- a/drivers/net/wireless/rt2x00/rt2800lib.c +++ b/drivers/net/wireless/rt2x00/rt2800lib.c | |||
@@ -812,9 +812,9 @@ static void rt2800_config_channel_rt3x(struct rt2x00_dev *rt2x00dev, | |||
812 | rt2800_rfcsr_write(rt2x00dev, 24, | 812 | rt2800_rfcsr_write(rt2x00dev, 24, |
813 | rt2x00dev->calibration[conf_is_ht40(conf)]); | 813 | rt2x00dev->calibration[conf_is_ht40(conf)]); |
814 | 814 | ||
815 | rt2800_rfcsr_read(rt2x00dev, 23, &rfcsr); | 815 | rt2800_rfcsr_read(rt2x00dev, 7, &rfcsr); |
816 | rt2x00_set_field8(&rfcsr, RFCSR7_RF_TUNING, 1); | 816 | rt2x00_set_field8(&rfcsr, RFCSR7_RF_TUNING, 1); |
817 | rt2800_rfcsr_write(rt2x00dev, 23, rfcsr); | 817 | rt2800_rfcsr_write(rt2x00dev, 7, rfcsr); |
818 | } | 818 | } |
819 | 819 | ||
820 | static void rt2800_config_channel(struct rt2x00_dev *rt2x00dev, | 820 | static void rt2800_config_channel(struct rt2x00_dev *rt2x00dev, |
diff --git a/net/mac80211/mesh_hwmp.c b/net/mac80211/mesh_hwmp.c index ce84237ebad3..ccff6133e19a 100644 --- a/net/mac80211/mesh_hwmp.c +++ b/net/mac80211/mesh_hwmp.c | |||
@@ -391,7 +391,7 @@ static u32 hwmp_route_info_get(struct ieee80211_sub_if_data *sdata, | |||
391 | if (SN_GT(mpath->sn, orig_sn) || | 391 | if (SN_GT(mpath->sn, orig_sn) || |
392 | (mpath->sn == orig_sn && | 392 | (mpath->sn == orig_sn && |
393 | action == MPATH_PREQ && | 393 | action == MPATH_PREQ && |
394 | new_metric > mpath->metric)) { | 394 | new_metric >= mpath->metric)) { |
395 | process = false; | 395 | process = false; |
396 | fresh_info = false; | 396 | fresh_info = false; |
397 | } | 397 | } |
@@ -611,7 +611,7 @@ static void hwmp_prep_frame_process(struct ieee80211_sub_if_data *sdata, | |||
611 | 611 | ||
612 | mesh_path_sel_frame_tx(MPATH_PREP, flags, orig_addr, | 612 | mesh_path_sel_frame_tx(MPATH_PREP, flags, orig_addr, |
613 | cpu_to_le32(orig_sn), 0, target_addr, | 613 | cpu_to_le32(orig_sn), 0, target_addr, |
614 | cpu_to_le32(target_sn), mpath->next_hop->sta.addr, hopcount, | 614 | cpu_to_le32(target_sn), next_hop, hopcount, |
615 | ttl, cpu_to_le32(lifetime), cpu_to_le32(metric), | 615 | ttl, cpu_to_le32(lifetime), cpu_to_le32(metric), |
616 | 0, sdata); | 616 | 0, sdata); |
617 | rcu_read_unlock(); | 617 | rcu_read_unlock(); |
diff --git a/net/mac80211/tx.c b/net/mac80211/tx.c index cbe53ed4fb0b..cfc473e1b050 100644 --- a/net/mac80211/tx.c +++ b/net/mac80211/tx.c | |||
@@ -1991,6 +1991,7 @@ static bool ieee80211_tx_pending_skb(struct ieee80211_local *local, | |||
1991 | void ieee80211_tx_pending(unsigned long data) | 1991 | void ieee80211_tx_pending(unsigned long data) |
1992 | { | 1992 | { |
1993 | struct ieee80211_local *local = (struct ieee80211_local *)data; | 1993 | struct ieee80211_local *local = (struct ieee80211_local *)data; |
1994 | struct ieee80211_sub_if_data *sdata; | ||
1994 | unsigned long flags; | 1995 | unsigned long flags; |
1995 | int i; | 1996 | int i; |
1996 | bool txok; | 1997 | bool txok; |
@@ -2029,6 +2030,11 @@ void ieee80211_tx_pending(unsigned long data) | |||
2029 | if (!txok) | 2030 | if (!txok) |
2030 | break; | 2031 | break; |
2031 | } | 2032 | } |
2033 | |||
2034 | if (skb_queue_empty(&local->pending[i])) | ||
2035 | list_for_each_entry_rcu(sdata, &local->interfaces, list) | ||
2036 | netif_tx_wake_queue( | ||
2037 | netdev_get_tx_queue(sdata->dev, i)); | ||
2032 | } | 2038 | } |
2033 | spin_unlock_irqrestore(&local->queue_stop_reason_lock, flags); | 2039 | spin_unlock_irqrestore(&local->queue_stop_reason_lock, flags); |
2034 | 2040 | ||
diff --git a/net/mac80211/util.c b/net/mac80211/util.c index c453226f06b2..53af57047435 100644 --- a/net/mac80211/util.c +++ b/net/mac80211/util.c | |||
@@ -279,13 +279,13 @@ static void __ieee80211_wake_queue(struct ieee80211_hw *hw, int queue, | |||
279 | /* someone still has this queue stopped */ | 279 | /* someone still has this queue stopped */ |
280 | return; | 280 | return; |
281 | 281 | ||
282 | if (!skb_queue_empty(&local->pending[queue])) | 282 | if (skb_queue_empty(&local->pending[queue])) { |
283 | rcu_read_lock(); | ||
284 | list_for_each_entry_rcu(sdata, &local->interfaces, list) | ||
285 | netif_tx_wake_queue(netdev_get_tx_queue(sdata->dev, queue)); | ||
286 | rcu_read_unlock(); | ||
287 | } else | ||
283 | tasklet_schedule(&local->tx_pending_tasklet); | 288 | tasklet_schedule(&local->tx_pending_tasklet); |
284 | |||
285 | rcu_read_lock(); | ||
286 | list_for_each_entry_rcu(sdata, &local->interfaces, list) | ||
287 | netif_tx_wake_queue(netdev_get_tx_queue(sdata->dev, queue)); | ||
288 | rcu_read_unlock(); | ||
289 | } | 289 | } |
290 | 290 | ||
291 | void ieee80211_wake_queue_by_reason(struct ieee80211_hw *hw, int queue, | 291 | void ieee80211_wake_queue_by_reason(struct ieee80211_hw *hw, int queue, |
@@ -1097,9 +1097,9 @@ int ieee80211_reconfig(struct ieee80211_local *local) | |||
1097 | */ | 1097 | */ |
1098 | res = drv_start(local); | 1098 | res = drv_start(local); |
1099 | if (res) { | 1099 | if (res) { |
1100 | WARN(local->suspended, "Harware became unavailable " | 1100 | WARN(local->suspended, "Hardware became unavailable " |
1101 | "upon resume. This is could be a software issue" | 1101 | "upon resume. This could be a software issue " |
1102 | "prior to suspend or a hardware issue\n"); | 1102 | "prior to suspend or a hardware issue.\n"); |
1103 | return res; | 1103 | return res; |
1104 | } | 1104 | } |
1105 | 1105 | ||
diff --git a/net/wireless/reg.c b/net/wireless/reg.c index ed89c59bb431..81fcafc60150 100644 --- a/net/wireless/reg.c +++ b/net/wireless/reg.c | |||
@@ -324,7 +324,7 @@ struct reg_regdb_search_request { | |||
324 | }; | 324 | }; |
325 | 325 | ||
326 | static LIST_HEAD(reg_regdb_search_list); | 326 | static LIST_HEAD(reg_regdb_search_list); |
327 | static DEFINE_SPINLOCK(reg_regdb_search_lock); | 327 | static DEFINE_MUTEX(reg_regdb_search_mutex); |
328 | 328 | ||
329 | static void reg_regdb_search(struct work_struct *work) | 329 | static void reg_regdb_search(struct work_struct *work) |
330 | { | 330 | { |
@@ -332,7 +332,7 @@ static void reg_regdb_search(struct work_struct *work) | |||
332 | const struct ieee80211_regdomain *curdom, *regdom; | 332 | const struct ieee80211_regdomain *curdom, *regdom; |
333 | int i, r; | 333 | int i, r; |
334 | 334 | ||
335 | spin_lock(®_regdb_search_lock); | 335 | mutex_lock(®_regdb_search_mutex); |
336 | while (!list_empty(®_regdb_search_list)) { | 336 | while (!list_empty(®_regdb_search_list)) { |
337 | request = list_first_entry(®_regdb_search_list, | 337 | request = list_first_entry(®_regdb_search_list, |
338 | struct reg_regdb_search_request, | 338 | struct reg_regdb_search_request, |
@@ -346,18 +346,16 @@ static void reg_regdb_search(struct work_struct *work) | |||
346 | r = reg_copy_regd(®dom, curdom); | 346 | r = reg_copy_regd(®dom, curdom); |
347 | if (r) | 347 | if (r) |
348 | break; | 348 | break; |
349 | spin_unlock(®_regdb_search_lock); | ||
350 | mutex_lock(&cfg80211_mutex); | 349 | mutex_lock(&cfg80211_mutex); |
351 | set_regdom(regdom); | 350 | set_regdom(regdom); |
352 | mutex_unlock(&cfg80211_mutex); | 351 | mutex_unlock(&cfg80211_mutex); |
353 | spin_lock(®_regdb_search_lock); | ||
354 | break; | 352 | break; |
355 | } | 353 | } |
356 | } | 354 | } |
357 | 355 | ||
358 | kfree(request); | 356 | kfree(request); |
359 | } | 357 | } |
360 | spin_unlock(®_regdb_search_lock); | 358 | mutex_unlock(®_regdb_search_mutex); |
361 | } | 359 | } |
362 | 360 | ||
363 | static DECLARE_WORK(reg_regdb_work, reg_regdb_search); | 361 | static DECLARE_WORK(reg_regdb_work, reg_regdb_search); |
@@ -375,9 +373,9 @@ static void reg_regdb_query(const char *alpha2) | |||
375 | 373 | ||
376 | memcpy(request->alpha2, alpha2, 2); | 374 | memcpy(request->alpha2, alpha2, 2); |
377 | 375 | ||
378 | spin_lock(®_regdb_search_lock); | 376 | mutex_lock(®_regdb_search_mutex); |
379 | list_add_tail(&request->list, ®_regdb_search_list); | 377 | list_add_tail(&request->list, ®_regdb_search_list); |
380 | spin_unlock(®_regdb_search_lock); | 378 | mutex_unlock(®_regdb_search_mutex); |
381 | 379 | ||
382 | schedule_work(®_regdb_work); | 380 | schedule_work(®_regdb_work); |
383 | } | 381 | } |