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/iwlwifi | |
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/iwlwifi')
-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 |
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 | ||
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); |