aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/iwlwifi/iwl-agn-tx.c
diff options
context:
space:
mode:
authorJohannes Berg <johannes.berg@intel.com>2012-03-07 12:52:16 -0500
committerJohn W. Linville <linville@tuxdriver.com>2012-03-08 13:59:47 -0500
commite755f882b7e72c48da820acc24196532977cfd07 (patch)
tree43fbd47dce75f6c08908f2b4c14e4c72ab565390 /drivers/net/wireless/iwlwifi/iwl-agn-tx.c
parentea886a6014024d027fa207b8765e46d746cd2a18 (diff)
iwlwifi: redesign PASSIVE_NO_RX workaround
The PASSIVE_NO_RX workaround currently crosses through the op_mode and transport layers, which is a bit odd. This also isn't necessary, if the transport simply reports when queues are full (or no longer full) the op_mode can keep track of this state, and report to mac80211 only what *it* thinks is appropriate. What is appropriate can then be based on whether queues should be stopped to wait for RX or not. This significantly simplifies the transport API, it no longer needs to expose anything to stop a queue, nor to wake "any" queue, this can all be handled in the upper layer completely. Also simplify the handling to not be dependent on the context, that makes little sense as the queues are shared and both contexts have to be on the same channel anyway. Signed-off-by: Johannes Berg <johannes.berg@intel.com> Signed-off-by: Wey-Yi Guy <wey-yi.w.guy@intel.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/iwlwifi/iwl-agn-tx.c')
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-agn-tx.c12
1 files changed, 6 insertions, 6 deletions
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn-tx.c b/drivers/net/wireless/iwlwifi/iwl-agn-tx.c
index c454c6782395..a19db4c0c9fa 100644
--- a/drivers/net/wireless/iwlwifi/iwl-agn-tx.c
+++ b/drivers/net/wireless/iwlwifi/iwl-agn-tx.c
@@ -1064,8 +1064,8 @@ int iwlagn_rx_reply_tx(struct iwl_priv *priv, struct iwl_rx_cmd_buffer *rxb,
1064 } 1064 }
1065 1065
1066 /*we can free until ssn % q.n_bd not inclusive */ 1066 /*we can free until ssn % q.n_bd not inclusive */
1067 WARN_ON(iwl_trans_reclaim(trans(priv), sta_id, tid, txq_id, 1067 WARN_ON(iwl_trans_reclaim(trans(priv), sta_id, tid,
1068 ssn, status, &skbs)); 1068 txq_id, ssn, &skbs));
1069 iwlagn_check_ratid_empty(priv, sta_id, tid); 1069 iwlagn_check_ratid_empty(priv, sta_id, tid);
1070 freed = 0; 1070 freed = 0;
1071 1071
@@ -1086,9 +1086,9 @@ int iwlagn_rx_reply_tx(struct iwl_priv *priv, struct iwl_rx_cmd_buffer *rxb,
1086 if (status == TX_STATUS_FAIL_PASSIVE_NO_RX && 1086 if (status == TX_STATUS_FAIL_PASSIVE_NO_RX &&
1087 iwl_is_associated_ctx(ctx) && ctx->vif && 1087 iwl_is_associated_ctx(ctx) && ctx->vif &&
1088 ctx->vif->type == NL80211_IFTYPE_STATION) { 1088 ctx->vif->type == NL80211_IFTYPE_STATION) {
1089 ctx->last_tx_rejected = true; 1089 /* block and stop all queues */
1090 iwl_trans_stop_queue(trans(priv), txq_id, 1090 priv->passive_no_rx = true;
1091 "Tx on passive channel"); 1091 ieee80211_stop_queues(priv->hw);
1092 1092
1093 IWL_DEBUG_TX_REPLY(priv, 1093 IWL_DEBUG_TX_REPLY(priv,
1094 "TXQ %d status %s (0x%08x) " 1094 "TXQ %d status %s (0x%08x) "
@@ -1182,7 +1182,7 @@ int iwlagn_rx_reply_compressed_ba(struct iwl_priv *priv,
1182 * block-ack window (we assume that they've been successfully 1182 * block-ack window (we assume that they've been successfully
1183 * transmitted ... if not, it's too late anyway). */ 1183 * transmitted ... if not, it's too late anyway). */
1184 if (iwl_trans_reclaim(trans(priv), sta_id, tid, scd_flow, 1184 if (iwl_trans_reclaim(trans(priv), sta_id, tid, scd_flow,
1185 ba_resp_scd_ssn, 0, &reclaimed_skbs)) { 1185 ba_resp_scd_ssn, &reclaimed_skbs)) {
1186 spin_unlock(&priv->sta_lock); 1186 spin_unlock(&priv->sta_lock);
1187 return 0; 1187 return 0;
1188 } 1188 }