aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/iwlwifi/iwl-5000.c
diff options
context:
space:
mode:
authorTomas Winkler <tomas.winkler@intel.com>2008-06-11 21:47:07 -0400
committerJohn W. Linville <linville@tuxdriver.com>2008-06-14 12:18:07 -0400
commit25a6572cc13ba2a3fefc02a63a077ff3664a1ca9 (patch)
tree7c796dc956d9c643d966bd7a09c3d3c6320031f8 /drivers/net/wireless/iwlwifi/iwl-5000.c
parent398f9e765f57c0dca0f6fb13c28ad929c09c68ef (diff)
iwlwifi: refactor tx aggregation response flow
This patch refactors tx aggregation respnse flow and fixes bug revealed by tx_info to cb patch Signed-off-by: Tomas Winkler <tomas.winkler@intel.com> Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com> Signed-off-by: Zhu Yi <yi.zhu@intel.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/iwlwifi/iwl-5000.c')
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-5000.c17
1 files changed, 6 insertions, 11 deletions
diff --git a/drivers/net/wireless/iwlwifi/iwl-5000.c b/drivers/net/wireless/iwlwifi/iwl-5000.c
index d3c0e10397c..2a30306b7ed 100644
--- a/drivers/net/wireless/iwlwifi/iwl-5000.c
+++ b/drivers/net/wireless/iwlwifi/iwl-5000.c
@@ -1126,23 +1126,20 @@ static void iwl5000_txq_set_sched(struct iwl_priv *priv, u32 mask)
1126 1126
1127static inline u32 iwl5000_get_scd_ssn(struct iwl5000_tx_resp *tx_resp) 1127static inline u32 iwl5000_get_scd_ssn(struct iwl5000_tx_resp *tx_resp)
1128{ 1128{
1129 __le32 *scd_ssn = (__le32 *)((u32 *)&tx_resp->status + 1129 return le32_to_cpup((__le32*)&tx_resp->status +
1130 tx_resp->frame_count); 1130 tx_resp->frame_count) & MAX_SN;
1131 return le32_to_cpu(*scd_ssn) & MAX_SN;
1132
1133} 1131}
1134 1132
1135static int iwl5000_tx_status_reply_tx(struct iwl_priv *priv, 1133static int iwl5000_tx_status_reply_tx(struct iwl_priv *priv,
1136 struct iwl_ht_agg *agg, 1134 struct iwl_ht_agg *agg,
1137 struct iwl5000_tx_resp *tx_resp, 1135 struct iwl5000_tx_resp *tx_resp,
1138 u16 start_idx) 1136 int txq_id, u16 start_idx)
1139{ 1137{
1140 u16 status; 1138 u16 status;
1141 struct agg_tx_status *frame_status = &tx_resp->status; 1139 struct agg_tx_status *frame_status = &tx_resp->status;
1142 struct ieee80211_tx_info *info = NULL; 1140 struct ieee80211_tx_info *info = NULL;
1143 struct ieee80211_hdr *hdr = NULL; 1141 struct ieee80211_hdr *hdr = NULL;
1144 int i, sh; 1142 int i, sh, idx;
1145 int txq_id, idx;
1146 u16 seq; 1143 u16 seq;
1147 1144
1148 if (agg->wait_for_ba) 1145 if (agg->wait_for_ba)
@@ -1157,9 +1154,7 @@ static int iwl5000_tx_status_reply_tx(struct iwl_priv *priv,
1157 if (agg->frame_count == 1) { 1154 if (agg->frame_count == 1) {
1158 /* Only one frame was attempted; no block-ack will arrive */ 1155 /* Only one frame was attempted; no block-ack will arrive */
1159 status = le16_to_cpu(frame_status[0].status); 1156 status = le16_to_cpu(frame_status[0].status);
1160 seq = le16_to_cpu(frame_status[0].sequence); 1157 idx = start_idx;
1161 idx = SEQ_TO_INDEX(seq);
1162 txq_id = SEQ_TO_QUEUE(seq);
1163 1158
1164 /* FIXME: code repetition */ 1159 /* FIXME: code repetition */
1165 IWL_DEBUG_TX_REPLY("FrameCnt = %d, StartIdx=%d idx=%d\n", 1160 IWL_DEBUG_TX_REPLY("FrameCnt = %d, StartIdx=%d idx=%d\n",
@@ -1296,7 +1291,7 @@ static void iwl5000_rx_reply_tx(struct iwl_priv *priv,
1296 1291
1297 agg = &priv->stations[sta_id].tid[tid].agg; 1292 agg = &priv->stations[sta_id].tid[tid].agg;
1298 1293
1299 iwl5000_tx_status_reply_tx(priv, agg, tx_resp, index); 1294 iwl5000_tx_status_reply_tx(priv, agg, tx_resp, txq_id, index);
1300 1295
1301 if ((tx_resp->frame_count == 1) && !iwl_is_tx_success(status)) { 1296 if ((tx_resp->frame_count == 1) && !iwl_is_tx_success(status)) {
1302 /* TODO: send BAR */ 1297 /* TODO: send BAR */