iwlwifi: return 0 for AMPDU_TX/RX_STOP request if NIC is going down
authorWey-Yi Guy <wey-yi.w.guy@intel.com>
Wed, 18 Mar 2009 04:51:43 +0000 (21:51 -0700)
committerJohn W. Linville <linville@tuxdriver.com>
Sat, 28 Mar 2009 00:12:57 +0000 (20:12 -0400)
When receive IEEE80211_AMPDU_RX_STOP or IEEE80211_AMPDU_TX_STOP request
in iwl_mac_ampdu_action() from mac80211; check STATUS_EXIT_PENDING bit,
if NIC is on the way out, then return 0 back to mac80211, this can
prevent mac80211 report HW error incorrectly.

Signed-off-by: Wey-Yi Guy <wey-yi.w.guy@intel.com>
Signed-off-by: Reinette Chatre <reinette.chatre@intel.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/iwlwifi/iwl-agn.c

index 4d2ed52af160ccb9bc4e567c6b221573db957f18..c1482852ea414dc246e4bb4168175e4db1dd1027 100644 (file)
@@ -2683,6 +2683,7 @@ static int iwl_mac_ampdu_action(struct ieee80211_hw *hw,
                             struct ieee80211_sta *sta, u16 tid, u16 *ssn)
 {
        struct iwl_priv *priv = hw->priv;
+       int ret;
 
        IWL_DEBUG_HT(priv, "A-MPDU action on addr %pM tid %d\n",
                     sta->addr, tid);
@@ -2696,13 +2697,21 @@ static int iwl_mac_ampdu_action(struct ieee80211_hw *hw,
                return iwl_sta_rx_agg_start(priv, sta->addr, tid, *ssn);
        case IEEE80211_AMPDU_RX_STOP:
                IWL_DEBUG_HT(priv, "stop Rx\n");
-               return iwl_sta_rx_agg_stop(priv, sta->addr, tid);
+               ret = iwl_sta_rx_agg_stop(priv, sta->addr, tid);
+               if (test_bit(STATUS_EXIT_PENDING, &priv->status))
+                       return 0;
+               else
+                       return ret;
        case IEEE80211_AMPDU_TX_START:
                IWL_DEBUG_HT(priv, "start Tx\n");
                return iwl_tx_agg_start(priv, sta->addr, tid, ssn);
        case IEEE80211_AMPDU_TX_STOP:
                IWL_DEBUG_HT(priv, "stop Tx\n");
-               return iwl_tx_agg_stop(priv, sta->addr, tid);
+               ret = iwl_tx_agg_stop(priv, sta->addr, tid);
+               if (test_bit(STATUS_EXIT_PENDING, &priv->status))
+                       return 0;
+               else
+                       return ret;
        default:
                IWL_DEBUG_HT(priv, "unknown\n");
                return -EINVAL;