diff options
author | Emmanuel Grumbach <emmanuel.grumbach@intel.com> | 2013-01-02 05:12:25 -0500 |
---|---|---|
committer | Johannes Berg <johannes.berg@intel.com> | 2013-01-16 08:23:57 -0500 |
commit | 1c3fea82d6ebf33edadefed2d9ce3efa1a654338 (patch) | |
tree | 58c8269e2275f8ea47f8a48a22c063d8ed1ed267 /drivers/net/wireless/iwlwifi/dvm/tx.c | |
parent | ddaf5a5b300b8f9d3591b509fd8bedab1c9887be (diff) |
iwlwifi: improve the reports in TX path
Also when things go wrong (queues don't get emtpy), try to
get some data from the HW.
Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Diffstat (limited to 'drivers/net/wireless/iwlwifi/dvm/tx.c')
-rw-r--r-- | drivers/net/wireless/iwlwifi/dvm/tx.c | 28 |
1 files changed, 16 insertions, 12 deletions
diff --git a/drivers/net/wireless/iwlwifi/dvm/tx.c b/drivers/net/wireless/iwlwifi/dvm/tx.c index df76881385ae..b0aad71c12a0 100644 --- a/drivers/net/wireless/iwlwifi/dvm/tx.c +++ b/drivers/net/wireless/iwlwifi/dvm/tx.c | |||
@@ -231,13 +231,11 @@ static void iwlagn_tx_cmd_build_hwcrypto(struct iwl_priv *priv, | |||
231 | memcpy(tx_cmd->key, keyconf->key, keyconf->keylen); | 231 | memcpy(tx_cmd->key, keyconf->key, keyconf->keylen); |
232 | if (info->flags & IEEE80211_TX_CTL_AMPDU) | 232 | if (info->flags & IEEE80211_TX_CTL_AMPDU) |
233 | tx_cmd->tx_flags |= TX_CMD_FLG_AGG_CCMP_MSK; | 233 | tx_cmd->tx_flags |= TX_CMD_FLG_AGG_CCMP_MSK; |
234 | IWL_DEBUG_TX(priv, "tx_cmd with AES hwcrypto\n"); | ||
235 | break; | 234 | break; |
236 | 235 | ||
237 | case WLAN_CIPHER_SUITE_TKIP: | 236 | case WLAN_CIPHER_SUITE_TKIP: |
238 | tx_cmd->sec_ctl = TX_CMD_SEC_TKIP; | 237 | tx_cmd->sec_ctl = TX_CMD_SEC_TKIP; |
239 | ieee80211_get_tkip_p2k(keyconf, skb_frag, tx_cmd->key); | 238 | ieee80211_get_tkip_p2k(keyconf, skb_frag, tx_cmd->key); |
240 | IWL_DEBUG_TX(priv, "tx_cmd with tkip hwcrypto\n"); | ||
241 | break; | 239 | break; |
242 | 240 | ||
243 | case WLAN_CIPHER_SUITE_WEP104: | 241 | case WLAN_CIPHER_SUITE_WEP104: |
@@ -355,8 +353,6 @@ int iwlagn_tx_skb(struct iwl_priv *priv, | |||
355 | } | 353 | } |
356 | } | 354 | } |
357 | 355 | ||
358 | IWL_DEBUG_TX(priv, "station Id %d\n", sta_id); | ||
359 | |||
360 | if (sta) | 356 | if (sta) |
361 | sta_priv = (void *)sta->drv_priv; | 357 | sta_priv = (void *)sta->drv_priv; |
362 | 358 | ||
@@ -472,6 +468,9 @@ int iwlagn_tx_skb(struct iwl_priv *priv, | |||
472 | WARN_ON_ONCE(is_agg && | 468 | WARN_ON_ONCE(is_agg && |
473 | priv->queue_to_mac80211[txq_id] != info->hw_queue); | 469 | priv->queue_to_mac80211[txq_id] != info->hw_queue); |
474 | 470 | ||
471 | IWL_DEBUG_TX(priv, "TX to [%d|%d] Q:%d - seq: 0x%x\n", sta_id, tid, | ||
472 | txq_id, seq_number); | ||
473 | |||
475 | if (iwl_trans_tx(priv->trans, skb, dev_cmd, txq_id)) | 474 | if (iwl_trans_tx(priv->trans, skb, dev_cmd, txq_id)) |
476 | goto drop_unlock_sta; | 475 | goto drop_unlock_sta; |
477 | 476 | ||
@@ -953,12 +952,6 @@ static void iwl_rx_reply_tx_agg(struct iwl_priv *priv, | |||
953 | if (status & (AGG_TX_STATE_FEW_BYTES_MSK | | 952 | if (status & (AGG_TX_STATE_FEW_BYTES_MSK | |
954 | AGG_TX_STATE_ABORT_MSK)) | 953 | AGG_TX_STATE_ABORT_MSK)) |
955 | continue; | 954 | continue; |
956 | |||
957 | IWL_DEBUG_TX_REPLY(priv, "status %s (0x%08x), " | ||
958 | "try-count (0x%08x)\n", | ||
959 | iwl_get_agg_tx_fail_reason(fstatus), | ||
960 | fstatus & AGG_TX_STATUS_MSK, | ||
961 | fstatus & AGG_TX_TRY_MSK); | ||
962 | } | 955 | } |
963 | } | 956 | } |
964 | 957 | ||
@@ -1212,16 +1205,27 @@ int iwlagn_rx_reply_tx(struct iwl_priv *priv, struct iwl_rx_cmd_buffer *rxb, | |||
1212 | freed++; | 1205 | freed++; |
1213 | } | 1206 | } |
1214 | 1207 | ||
1215 | WARN_ON(!is_agg && freed != 1); | 1208 | if (!is_agg && freed != 1) |
1209 | IWL_ERR(priv, "Q: %d, freed %d\n", txq_id, freed); | ||
1216 | 1210 | ||
1217 | /* | 1211 | /* |
1218 | * An offchannel frame can be send only on the AUX queue, where | 1212 | * An offchannel frame can be send only on the AUX queue, where |
1219 | * there is no aggregation (and reordering) so it only is single | 1213 | * there is no aggregation (and reordering) so it only is single |
1220 | * skb is expected to be processed. | 1214 | * skb is expected to be processed. |
1221 | */ | 1215 | */ |
1222 | WARN_ON(is_offchannel_skb && freed != 1); | 1216 | if (is_offchannel_skb && freed != 1) |
1217 | IWL_ERR(priv, "OFFCHANNEL SKB freed %d\n", freed); | ||
1223 | } | 1218 | } |
1224 | 1219 | ||
1220 | IWL_DEBUG_TX_REPLY(priv, "TXQ %d status %s (0x%08x)\n", txq_id, | ||
1221 | iwl_get_tx_fail_reason(status), status); | ||
1222 | |||
1223 | IWL_DEBUG_TX_REPLY(priv, | ||
1224 | "\t\t\t\tinitial_rate 0x%x retries %d, idx=%d ssn=%d seq_ctl=0x%x\n", | ||
1225 | le32_to_cpu(tx_resp->rate_n_flags), | ||
1226 | tx_resp->failure_frame, SEQ_TO_INDEX(sequence), ssn, | ||
1227 | le16_to_cpu(tx_resp->seq_ctl)); | ||
1228 | |||
1225 | iwl_check_abort_status(priv, tx_resp->frame_count, status); | 1229 | iwl_check_abort_status(priv, tx_resp->frame_count, status); |
1226 | spin_unlock(&priv->sta_lock); | 1230 | spin_unlock(&priv->sta_lock); |
1227 | 1231 | ||