diff options
author | John W. Linville <linville@tuxdriver.com> | 2012-11-21 12:57:56 -0500 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2012-11-21 12:57:56 -0500 |
commit | b3117494772d8f906625905c6e203af745ee3530 (patch) | |
tree | cc8960455f9e1f18d0939fddd0e96f349613f753 /drivers/net/wireless | |
parent | e2ff0498409af6f2023f91aba07b281e5e87ee15 (diff) | |
parent | 400e020892a9a20eea5d2c9bce8bfb312075c4ba (diff) |
Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless
Conflicts:
drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c
drivers/net/wireless/iwlwifi/pcie/tx.c
Diffstat (limited to 'drivers/net/wireless')
-rw-r--r-- | drivers/net/wireless/ath/ath9k/hw.c | 2 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath9k/xmit.c | 8 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/dvm/mac80211.c | 16 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/dvm/main.c | 2 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/pcie/rx.c | 23 | ||||
-rw-r--r-- | drivers/net/wireless/mwifiex/cmdevt.c | 11 | ||||
-rw-r--r-- | drivers/net/wireless/mwifiex/sdio.c | 11 | ||||
-rw-r--r-- | drivers/net/wireless/rt2x00/rt2800lib.c | 2 | ||||
-rw-r--r-- | drivers/net/wireless/rtlwifi/rtl8192cu/sw.c | 1 |
9 files changed, 60 insertions, 16 deletions
diff --git a/drivers/net/wireless/ath/ath9k/hw.c b/drivers/net/wireless/ath/ath9k/hw.c index 756191b9eeda..e06bcec655a7 100644 --- a/drivers/net/wireless/ath/ath9k/hw.c +++ b/drivers/net/wireless/ath/ath9k/hw.c | |||
@@ -1456,7 +1456,7 @@ static bool ath9k_hw_set_reset_reg(struct ath_hw *ah, u32 type) | |||
1456 | switch (type) { | 1456 | switch (type) { |
1457 | case ATH9K_RESET_POWER_ON: | 1457 | case ATH9K_RESET_POWER_ON: |
1458 | ret = ath9k_hw_set_reset_power_on(ah); | 1458 | ret = ath9k_hw_set_reset_power_on(ah); |
1459 | if (!ret) | 1459 | if (ret) |
1460 | ah->reset_power_on = true; | 1460 | ah->reset_power_on = true; |
1461 | break; | 1461 | break; |
1462 | case ATH9K_RESET_WARM: | 1462 | case ATH9K_RESET_WARM: |
diff --git a/drivers/net/wireless/ath/ath9k/xmit.c b/drivers/net/wireless/ath/ath9k/xmit.c index 1ffca7511fa8..741918a2027b 100644 --- a/drivers/net/wireless/ath/ath9k/xmit.c +++ b/drivers/net/wireless/ath/ath9k/xmit.c | |||
@@ -394,7 +394,7 @@ static void ath_tx_complete_aggr(struct ath_softc *sc, struct ath_txq *txq, | |||
394 | u16 seq_st = 0, acked_cnt = 0, txfail_cnt = 0, seq_first; | 394 | u16 seq_st = 0, acked_cnt = 0, txfail_cnt = 0, seq_first; |
395 | u32 ba[WME_BA_BMP_SIZE >> 5]; | 395 | u32 ba[WME_BA_BMP_SIZE >> 5]; |
396 | int isaggr, txfail, txpending, sendbar = 0, needreset = 0, nbad = 0; | 396 | int isaggr, txfail, txpending, sendbar = 0, needreset = 0, nbad = 0; |
397 | bool rc_update = true; | 397 | bool rc_update = true, isba; |
398 | struct ieee80211_tx_rate rates[4]; | 398 | struct ieee80211_tx_rate rates[4]; |
399 | struct ath_frame_info *fi; | 399 | struct ath_frame_info *fi; |
400 | int nframes; | 400 | int nframes; |
@@ -438,13 +438,17 @@ static void ath_tx_complete_aggr(struct ath_softc *sc, struct ath_txq *txq, | |||
438 | tidno = ieee80211_get_qos_ctl(hdr)[0] & IEEE80211_QOS_CTL_TID_MASK; | 438 | tidno = ieee80211_get_qos_ctl(hdr)[0] & IEEE80211_QOS_CTL_TID_MASK; |
439 | tid = ATH_AN_2_TID(an, tidno); | 439 | tid = ATH_AN_2_TID(an, tidno); |
440 | seq_first = tid->seq_start; | 440 | seq_first = tid->seq_start; |
441 | isba = ts->ts_flags & ATH9K_TX_BA; | ||
441 | 442 | ||
442 | /* | 443 | /* |
443 | * The hardware occasionally sends a tx status for the wrong TID. | 444 | * The hardware occasionally sends a tx status for the wrong TID. |
444 | * In this case, the BA status cannot be considered valid and all | 445 | * In this case, the BA status cannot be considered valid and all |
445 | * subframes need to be retransmitted | 446 | * subframes need to be retransmitted |
447 | * | ||
448 | * Only BlockAcks have a TID and therefore normal Acks cannot be | ||
449 | * checked | ||
446 | */ | 450 | */ |
447 | if (tidno != ts->tid) | 451 | if (isba && tidno != ts->tid) |
448 | txok = false; | 452 | txok = false; |
449 | 453 | ||
450 | isaggr = bf_isaggr(bf); | 454 | isaggr = bf_isaggr(bf); |
diff --git a/drivers/net/wireless/iwlwifi/dvm/mac80211.c b/drivers/net/wireless/iwlwifi/dvm/mac80211.c index cb443d54f9b9..bf189f115413 100644 --- a/drivers/net/wireless/iwlwifi/dvm/mac80211.c +++ b/drivers/net/wireless/iwlwifi/dvm/mac80211.c | |||
@@ -519,7 +519,7 @@ static void iwlagn_mac_tx(struct ieee80211_hw *hw, | |||
519 | ieee80211_get_tx_rate(hw, IEEE80211_SKB_CB(skb))->bitrate); | 519 | ieee80211_get_tx_rate(hw, IEEE80211_SKB_CB(skb))->bitrate); |
520 | 520 | ||
521 | if (iwlagn_tx_skb(priv, control->sta, skb)) | 521 | if (iwlagn_tx_skb(priv, control->sta, skb)) |
522 | dev_kfree_skb_any(skb); | 522 | ieee80211_free_txskb(hw, skb); |
523 | } | 523 | } |
524 | 524 | ||
525 | static void iwlagn_mac_update_tkip_key(struct ieee80211_hw *hw, | 525 | static void iwlagn_mac_update_tkip_key(struct ieee80211_hw *hw, |
@@ -1352,6 +1352,20 @@ static int iwlagn_mac_add_interface(struct ieee80211_hw *hw, | |||
1352 | vif_priv->ctx = ctx; | 1352 | vif_priv->ctx = ctx; |
1353 | ctx->vif = vif; | 1353 | ctx->vif = vif; |
1354 | 1354 | ||
1355 | /* | ||
1356 | * In SNIFFER device type, the firmware reports the FCS to | ||
1357 | * the host, rather than snipping it off. Unfortunately, | ||
1358 | * mac80211 doesn't (yet) provide a per-packet flag for | ||
1359 | * this, so that we have to set the hardware flag based | ||
1360 | * on the interfaces added. As the monitor interface can | ||
1361 | * only be present by itself, and will be removed before | ||
1362 | * other interfaces are added, this is safe. | ||
1363 | */ | ||
1364 | if (vif->type == NL80211_IFTYPE_MONITOR) | ||
1365 | priv->hw->flags |= IEEE80211_HW_RX_INCLUDES_FCS; | ||
1366 | else | ||
1367 | priv->hw->flags &= ~IEEE80211_HW_RX_INCLUDES_FCS; | ||
1368 | |||
1355 | err = iwl_setup_interface(priv, ctx); | 1369 | err = iwl_setup_interface(priv, ctx); |
1356 | if (!err || reset) | 1370 | if (!err || reset) |
1357 | goto out; | 1371 | goto out; |
diff --git a/drivers/net/wireless/iwlwifi/dvm/main.c b/drivers/net/wireless/iwlwifi/dvm/main.c index 03cbfa765f87..37bb4575ad8d 100644 --- a/drivers/net/wireless/iwlwifi/dvm/main.c +++ b/drivers/net/wireless/iwlwifi/dvm/main.c | |||
@@ -2107,7 +2107,7 @@ static void iwl_free_skb(struct iwl_op_mode *op_mode, struct sk_buff *skb) | |||
2107 | 2107 | ||
2108 | info = IEEE80211_SKB_CB(skb); | 2108 | info = IEEE80211_SKB_CB(skb); |
2109 | iwl_trans_free_tx_cmd(priv->trans, info->driver_data[1]); | 2109 | iwl_trans_free_tx_cmd(priv->trans, info->driver_data[1]); |
2110 | dev_kfree_skb_any(skb); | 2110 | ieee80211_free_txskb(priv->hw, skb); |
2111 | } | 2111 | } |
2112 | 2112 | ||
2113 | static void iwl_set_hw_rfkill_state(struct iwl_op_mode *op_mode, bool state) | 2113 | static void iwl_set_hw_rfkill_state(struct iwl_op_mode *op_mode, bool state) |
diff --git a/drivers/net/wireless/iwlwifi/pcie/rx.c b/drivers/net/wireless/iwlwifi/pcie/rx.c index 11a93eddc84f..323079769567 100644 --- a/drivers/net/wireless/iwlwifi/pcie/rx.c +++ b/drivers/net/wireless/iwlwifi/pcie/rx.c | |||
@@ -318,6 +318,14 @@ static void iwl_rx_allocate(struct iwl_trans *trans, gfp_t priority) | |||
318 | dma_map_page(trans->dev, page, 0, | 318 | dma_map_page(trans->dev, page, 0, |
319 | PAGE_SIZE << trans_pcie->rx_page_order, | 319 | PAGE_SIZE << trans_pcie->rx_page_order, |
320 | DMA_FROM_DEVICE); | 320 | DMA_FROM_DEVICE); |
321 | if (dma_mapping_error(trans->dev, rxb->page_dma)) { | ||
322 | rxb->page = NULL; | ||
323 | spin_lock_irqsave(&rxq->lock, flags); | ||
324 | list_add(&rxb->list, &rxq->rx_used); | ||
325 | spin_unlock_irqrestore(&rxq->lock, flags); | ||
326 | __free_pages(page, trans_pcie->rx_page_order); | ||
327 | return; | ||
328 | } | ||
321 | /* dma address must be no more than 36 bits */ | 329 | /* dma address must be no more than 36 bits */ |
322 | BUG_ON(rxb->page_dma & ~DMA_BIT_MASK(36)); | 330 | BUG_ON(rxb->page_dma & ~DMA_BIT_MASK(36)); |
323 | /* and also 256 byte aligned! */ | 331 | /* and also 256 byte aligned! */ |
@@ -489,8 +497,19 @@ static void iwl_rx_handle_rxbuf(struct iwl_trans *trans, | |||
489 | dma_map_page(trans->dev, rxb->page, 0, | 497 | dma_map_page(trans->dev, rxb->page, 0, |
490 | PAGE_SIZE << trans_pcie->rx_page_order, | 498 | PAGE_SIZE << trans_pcie->rx_page_order, |
491 | DMA_FROM_DEVICE); | 499 | DMA_FROM_DEVICE); |
492 | list_add_tail(&rxb->list, &rxq->rx_free); | 500 | if (dma_mapping_error(trans->dev, rxb->page_dma)) { |
493 | rxq->free_count++; | 501 | /* |
502 | * free the page(s) as well to not break | ||
503 | * the invariant that the items on the used | ||
504 | * list have no page(s) | ||
505 | */ | ||
506 | __free_pages(rxb->page, trans_pcie->rx_page_order); | ||
507 | rxb->page = NULL; | ||
508 | list_add_tail(&rxb->list, &rxq->rx_used); | ||
509 | } else { | ||
510 | list_add_tail(&rxb->list, &rxq->rx_free); | ||
511 | rxq->free_count++; | ||
512 | } | ||
494 | } else | 513 | } else |
495 | list_add_tail(&rxb->list, &rxq->rx_used); | 514 | list_add_tail(&rxb->list, &rxq->rx_used); |
496 | spin_unlock_irqrestore(&rxq->lock, flags); | 515 | spin_unlock_irqrestore(&rxq->lock, flags); |
diff --git a/drivers/net/wireless/mwifiex/cmdevt.c b/drivers/net/wireless/mwifiex/cmdevt.c index c9528b3e9e9a..5f438e6c2155 100644 --- a/drivers/net/wireless/mwifiex/cmdevt.c +++ b/drivers/net/wireless/mwifiex/cmdevt.c | |||
@@ -890,9 +890,6 @@ mwifiex_cmd_timeout_func(unsigned long function_context) | |||
890 | return; | 890 | return; |
891 | } | 891 | } |
892 | cmd_node = adapter->curr_cmd; | 892 | cmd_node = adapter->curr_cmd; |
893 | if (cmd_node->wait_q_enabled) | ||
894 | adapter->cmd_wait_q.status = -ETIMEDOUT; | ||
895 | |||
896 | if (cmd_node) { | 893 | if (cmd_node) { |
897 | adapter->dbg.timeout_cmd_id = | 894 | adapter->dbg.timeout_cmd_id = |
898 | adapter->dbg.last_cmd_id[adapter->dbg.last_cmd_index]; | 895 | adapter->dbg.last_cmd_id[adapter->dbg.last_cmd_index]; |
@@ -941,6 +938,14 @@ mwifiex_cmd_timeout_func(unsigned long function_context) | |||
941 | 938 | ||
942 | dev_err(adapter->dev, "ps_mode=%d ps_state=%d\n", | 939 | dev_err(adapter->dev, "ps_mode=%d ps_state=%d\n", |
943 | adapter->ps_mode, adapter->ps_state); | 940 | adapter->ps_mode, adapter->ps_state); |
941 | |||
942 | if (cmd_node->wait_q_enabled) { | ||
943 | adapter->cmd_wait_q.status = -ETIMEDOUT; | ||
944 | wake_up_interruptible(&adapter->cmd_wait_q.wait); | ||
945 | mwifiex_cancel_pending_ioctl(adapter); | ||
946 | /* reset cmd_sent flag to unblock new commands */ | ||
947 | adapter->cmd_sent = false; | ||
948 | } | ||
944 | } | 949 | } |
945 | if (adapter->hw_status == MWIFIEX_HW_STATUS_INITIALIZING) | 950 | if (adapter->hw_status == MWIFIEX_HW_STATUS_INITIALIZING) |
946 | mwifiex_init_fw_complete(adapter); | 951 | mwifiex_init_fw_complete(adapter); |
diff --git a/drivers/net/wireless/mwifiex/sdio.c b/drivers/net/wireless/mwifiex/sdio.c index 4fbbd611f630..5a1c1d0e5599 100644 --- a/drivers/net/wireless/mwifiex/sdio.c +++ b/drivers/net/wireless/mwifiex/sdio.c | |||
@@ -161,7 +161,6 @@ static int mwifiex_sdio_suspend(struct device *dev) | |||
161 | struct sdio_mmc_card *card; | 161 | struct sdio_mmc_card *card; |
162 | struct mwifiex_adapter *adapter; | 162 | struct mwifiex_adapter *adapter; |
163 | mmc_pm_flag_t pm_flag = 0; | 163 | mmc_pm_flag_t pm_flag = 0; |
164 | int hs_actived = 0; | ||
165 | int i; | 164 | int i; |
166 | int ret = 0; | 165 | int ret = 0; |
167 | 166 | ||
@@ -188,12 +187,14 @@ static int mwifiex_sdio_suspend(struct device *dev) | |||
188 | adapter = card->adapter; | 187 | adapter = card->adapter; |
189 | 188 | ||
190 | /* Enable the Host Sleep */ | 189 | /* Enable the Host Sleep */ |
191 | hs_actived = mwifiex_enable_hs(adapter); | 190 | if (!mwifiex_enable_hs(adapter)) { |
192 | if (hs_actived) { | 191 | dev_err(adapter->dev, "cmd: failed to suspend\n"); |
193 | pr_debug("cmd: suspend with MMC_PM_KEEP_POWER\n"); | 192 | return -EFAULT; |
194 | ret = sdio_set_host_pm_flags(func, MMC_PM_KEEP_POWER); | ||
195 | } | 193 | } |
196 | 194 | ||
195 | dev_dbg(adapter->dev, "cmd: suspend with MMC_PM_KEEP_POWER\n"); | ||
196 | ret = sdio_set_host_pm_flags(func, MMC_PM_KEEP_POWER); | ||
197 | |||
197 | /* Indicate device suspended */ | 198 | /* Indicate device suspended */ |
198 | adapter->is_suspended = true; | 199 | adapter->is_suspended = true; |
199 | 200 | ||
diff --git a/drivers/net/wireless/rt2x00/rt2800lib.c b/drivers/net/wireless/rt2x00/rt2800lib.c index 3bc206d06cd1..c0441a715c96 100644 --- a/drivers/net/wireless/rt2x00/rt2800lib.c +++ b/drivers/net/wireless/rt2x00/rt2800lib.c | |||
@@ -2449,7 +2449,7 @@ static int rt2800_get_gain_calibration_delta(struct rt2x00_dev *rt2x00dev) | |||
2449 | /* | 2449 | /* |
2450 | * Check if temperature compensation is supported. | 2450 | * Check if temperature compensation is supported. |
2451 | */ | 2451 | */ |
2452 | if (tssi_bounds[4] == 0xff) | 2452 | if (tssi_bounds[4] == 0xff || step == 0xff) |
2453 | return 0; | 2453 | return 0; |
2454 | 2454 | ||
2455 | /* | 2455 | /* |
diff --git a/drivers/net/wireless/rtlwifi/rtl8192cu/sw.c b/drivers/net/wireless/rtlwifi/rtl8192cu/sw.c index 9970c2b1b199..b7e6607e6b6d 100644 --- a/drivers/net/wireless/rtlwifi/rtl8192cu/sw.c +++ b/drivers/net/wireless/rtlwifi/rtl8192cu/sw.c | |||
@@ -297,6 +297,7 @@ static struct usb_device_id rtl8192c_usb_ids[] = { | |||
297 | /*=== Customer ID ===*/ | 297 | /*=== Customer ID ===*/ |
298 | /****** 8188CU ********/ | 298 | /****** 8188CU ********/ |
299 | {RTL_USB_DEVICE(0x050d, 0x1102, rtl92cu_hal_cfg)}, /*Belkin - Edimax*/ | 299 | {RTL_USB_DEVICE(0x050d, 0x1102, rtl92cu_hal_cfg)}, /*Belkin - Edimax*/ |
300 | {RTL_USB_DEVICE(0x050d, 0x11f2, rtl92cu_hal_cfg)}, /*Belkin - ISY*/ | ||
300 | {RTL_USB_DEVICE(0x06f8, 0xe033, rtl92cu_hal_cfg)}, /*Hercules - Edimax*/ | 301 | {RTL_USB_DEVICE(0x06f8, 0xe033, rtl92cu_hal_cfg)}, /*Hercules - Edimax*/ |
301 | {RTL_USB_DEVICE(0x07b8, 0x8188, rtl92cu_hal_cfg)}, /*Abocom - Abocom*/ | 302 | {RTL_USB_DEVICE(0x07b8, 0x8188, rtl92cu_hal_cfg)}, /*Abocom - Abocom*/ |
302 | {RTL_USB_DEVICE(0x07b8, 0x8189, rtl92cu_hal_cfg)}, /*Funai - Abocom*/ | 303 | {RTL_USB_DEVICE(0x07b8, 0x8189, rtl92cu_hal_cfg)}, /*Funai - Abocom*/ |