aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/iwlwifi
diff options
context:
space:
mode:
authorJohn W. Linville <linville@tuxdriver.com>2012-11-21 12:57:56 -0500
committerJohn W. Linville <linville@tuxdriver.com>2012-11-21 12:57:56 -0500
commitb3117494772d8f906625905c6e203af745ee3530 (patch)
treecc8960455f9e1f18d0939fddd0e96f349613f753 /drivers/net/wireless/iwlwifi
parente2ff0498409af6f2023f91aba07b281e5e87ee15 (diff)
parent400e020892a9a20eea5d2c9bce8bfb312075c4ba (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/iwlwifi')
-rw-r--r--drivers/net/wireless/iwlwifi/dvm/mac80211.c16
-rw-r--r--drivers/net/wireless/iwlwifi/dvm/main.c2
-rw-r--r--drivers/net/wireless/iwlwifi/pcie/rx.c23
3 files changed, 37 insertions, 4 deletions
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
525static void iwlagn_mac_update_tkip_key(struct ieee80211_hw *hw, 525static 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
2113static void iwl_set_hw_rfkill_state(struct iwl_op_mode *op_mode, bool state) 2113static 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);