| From ece6444c2fe80dab679beb5f0d58b091f1933b00 Mon Sep 17 00:00:00 2001 |
| From: Wey-Yi Guy <wey-yi.w.guy@intel.com> |
| Date: Thu, 8 Apr 2010 13:17:37 -0700 |
| Subject: iwlwifi: need check for valid qos packet before free |
| |
| From: Wey-Yi Guy <wey-yi.w.guy@intel.com> |
| |
| commit ece6444c2fe80dab679beb5f0d58b091f1933b00 upstream. |
| |
| For 4965, need to check it is valid qos frame before free, only valid |
| QoS frame has the tid used to free the packets. |
| |
| Signed-off-by: Wey-Yi Guy <wey-yi.w.guy@intel.com> |
| Signed-off-by: John W. Linville <linville@tuxdriver.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| drivers/net/wireless/iwlwifi/iwl-4965.c | 13 +++++++++---- |
| 1 file changed, 9 insertions(+), 4 deletions(-) |
| |
| --- a/drivers/net/wireless/iwlwifi/iwl-4965.c |
| +++ b/drivers/net/wireless/iwlwifi/iwl-4965.c |
| @@ -2134,7 +2134,9 @@ static void iwl4965_rx_reply_tx(struct i |
| IWL_DEBUG_TX_REPLY(priv, "Retry scheduler reclaim scd_ssn " |
| "%d index %d\n", scd_ssn , index); |
| freed = iwl_tx_queue_reclaim(priv, txq_id, index); |
| - iwl_free_tfds_in_queue(priv, sta_id, tid, freed); |
| + if (qc) |
| + iwl_free_tfds_in_queue(priv, sta_id, |
| + tid, freed); |
| |
| if (priv->mac80211_registered && |
| (iwl_queue_space(&txq->q) > txq->q.low_mark) && |
| @@ -2161,14 +2163,17 @@ static void iwl4965_rx_reply_tx(struct i |
| tx_resp->failure_frame); |
| |
| freed = iwl_tx_queue_reclaim(priv, txq_id, index); |
| - iwl_free_tfds_in_queue(priv, sta_id, tid, freed); |
| + if (qc && likely(sta_id != IWL_INVALID_STATION)) |
| + iwl_free_tfds_in_queue(priv, sta_id, tid, freed); |
| + else if (sta_id == IWL_INVALID_STATION) |
| + IWL_DEBUG_TX_REPLY(priv, "Station not known\n"); |
| |
| if (priv->mac80211_registered && |
| (iwl_queue_space(&txq->q) > txq->q.low_mark)) |
| iwl_wake_queue(priv, txq_id); |
| } |
| - |
| - iwl_txq_check_empty(priv, sta_id, tid, txq_id); |
| + if (qc && likely(sta_id != IWL_INVALID_STATION)) |
| + iwl_txq_check_empty(priv, sta_id, tid, txq_id); |
| |
| if (iwl_check_bits(status, TX_ABORT_REQUIRED_MSK)) |
| IWL_ERR(priv, "TODO: Implement Tx ABORT REQUIRED!!!\n"); |