aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-agn.c4
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-core.c9
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-shared.h1
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-trans-tx-pcie.c7
4 files changed, 17 insertions, 4 deletions
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn.c b/drivers/net/wireless/iwlwifi/iwl-agn.c
index 7f6c58ebbc44..1142d85ea881 100644
--- a/drivers/net/wireless/iwlwifi/iwl-agn.c
+++ b/drivers/net/wireless/iwlwifi/iwl-agn.c
@@ -1522,6 +1522,8 @@ static void __iwl_down(struct iwl_priv *priv)
1522 if (priv->shrd->mac80211_registered) 1522 if (priv->shrd->mac80211_registered)
1523 ieee80211_stop_queues(priv->hw); 1523 ieee80211_stop_queues(priv->hw);
1524 1524
1525 iwl_trans_stop_device(trans(priv));
1526
1525 /* Clear out all status bits but a few that are stable across reset */ 1527 /* Clear out all status bits but a few that are stable across reset */
1526 priv->shrd->status &= 1528 priv->shrd->status &=
1527 test_bit(STATUS_RF_KILL_HW, &priv->shrd->status) << 1529 test_bit(STATUS_RF_KILL_HW, &priv->shrd->status) <<
@@ -1533,8 +1535,6 @@ static void __iwl_down(struct iwl_priv *priv)
1533 test_bit(STATUS_EXIT_PENDING, &priv->shrd->status) << 1535 test_bit(STATUS_EXIT_PENDING, &priv->shrd->status) <<
1534 STATUS_EXIT_PENDING; 1536 STATUS_EXIT_PENDING;
1535 1537
1536 iwl_trans_stop_device(trans(priv));
1537
1538 dev_kfree_skb(priv->beacon_skb); 1538 dev_kfree_skb(priv->beacon_skb);
1539 priv->beacon_skb = NULL; 1539 priv->beacon_skb = NULL;
1540} 1540}
diff --git a/drivers/net/wireless/iwlwifi/iwl-core.c b/drivers/net/wireless/iwlwifi/iwl-core.c
index 9270f990b2dd..5e490dbe0d07 100644
--- a/drivers/net/wireless/iwlwifi/iwl-core.c
+++ b/drivers/net/wireless/iwlwifi/iwl-core.c
@@ -1876,3 +1876,12 @@ void iwl_nic_config(struct iwl_priv *priv)
1876 priv->cfg->lib->nic_config(priv); 1876 priv->cfg->lib->nic_config(priv);
1877 1877
1878} 1878}
1879
1880void iwl_free_skb(struct iwl_priv *priv, struct sk_buff *skb)
1881{
1882 struct ieee80211_tx_info *info;
1883
1884 info = IEEE80211_SKB_CB(skb);
1885 kmem_cache_free(priv->tx_cmd_pool, (info->driver_data[1]));
1886 dev_kfree_skb_any(skb);
1887}
diff --git a/drivers/net/wireless/iwlwifi/iwl-shared.h b/drivers/net/wireless/iwlwifi/iwl-shared.h
index d987bee5e6ce..bdfbc6058ba1 100644
--- a/drivers/net/wireless/iwlwifi/iwl-shared.h
+++ b/drivers/net/wireless/iwlwifi/iwl-shared.h
@@ -390,6 +390,7 @@ void iwl_stop_tx_ba_trans_ready(struct iwl_priv *priv,
390 u8 sta_id, u8 tid); 390 u8 sta_id, u8 tid);
391void iwl_set_hw_rfkill_state(struct iwl_priv *priv, bool state); 391void iwl_set_hw_rfkill_state(struct iwl_priv *priv, bool state);
392void iwl_nic_config(struct iwl_priv *priv); 392void iwl_nic_config(struct iwl_priv *priv);
393void iwl_free_skb(struct iwl_priv *priv, struct sk_buff *skb);
393void iwl_apm_stop(struct iwl_priv *priv); 394void iwl_apm_stop(struct iwl_priv *priv);
394int iwl_apm_init(struct iwl_priv *priv); 395int iwl_apm_init(struct iwl_priv *priv);
395void iwlagn_fw_error(struct iwl_priv *priv, bool ondemand); 396void iwlagn_fw_error(struct iwl_priv *priv, bool ondemand);
diff --git a/drivers/net/wireless/iwlwifi/iwl-trans-tx-pcie.c b/drivers/net/wireless/iwlwifi/iwl-trans-tx-pcie.c
index c7ddb2204a6e..15cb0ff2ff18 100644
--- a/drivers/net/wireless/iwlwifi/iwl-trans-tx-pcie.c
+++ b/drivers/net/wireless/iwlwifi/iwl-trans-tx-pcie.c
@@ -225,9 +225,12 @@ void iwlagn_txq_free_tfd(struct iwl_trans *trans, struct iwl_tx_queue *txq,
225 225
226 skb = txq->skbs[index]; 226 skb = txq->skbs[index];
227 227
228 /* can be called from irqs-disabled context */ 228 /* Can be called from irqs-disabled context
229 * If skb is not NULL, it means that the whole queue is being
230 * freed and that the queue is not empty - free the skb
231 */
229 if (skb) { 232 if (skb) {
230 dev_kfree_skb_any(skb); 233 iwl_free_skb(priv(trans), skb);
231 txq->skbs[index] = NULL; 234 txq->skbs[index] = NULL;
232 } 235 }
233 } 236 }