diff options
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-agn.c | 4 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-core.c | 9 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-shared.h | 1 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-trans-tx-pcie.c | 7 |
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 | |||
1880 | void 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); |
391 | void iwl_set_hw_rfkill_state(struct iwl_priv *priv, bool state); | 391 | void iwl_set_hw_rfkill_state(struct iwl_priv *priv, bool state); |
392 | void iwl_nic_config(struct iwl_priv *priv); | 392 | void iwl_nic_config(struct iwl_priv *priv); |
393 | void iwl_free_skb(struct iwl_priv *priv, struct sk_buff *skb); | ||
393 | void iwl_apm_stop(struct iwl_priv *priv); | 394 | void iwl_apm_stop(struct iwl_priv *priv); |
394 | int iwl_apm_init(struct iwl_priv *priv); | 395 | int iwl_apm_init(struct iwl_priv *priv); |
395 | void iwlagn_fw_error(struct iwl_priv *priv, bool ondemand); | 396 | void 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 | } |