carl9170: tx path review

This patch fixes a few shortcomings in the tx path.

 * move temp. ampdu_[ack]_len out of txinfo->pad.

 * fix WARN_ON from tx.c:line 300 when tx_ampdu_queue
   fails to queue the frame.

 * In tx_prepare, we already have a local pointer
   to the station's ieee80211_sta struct.

 * remove a second !sta check, tx_prepare already takes
   care of that.

Signed-off-by: Christian Lamparter <chunkeey@googlemail.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:
Christian Lamparter 2010-11-06 14:07:10 +01:00 committed by John W. Linville
parent ffa56e540c
commit 041fb8f504

View file

@ -242,9 +242,11 @@ static void carl9170_tx_release(struct kref *ref)
ar->tx_ampdu_schedule = true; ar->tx_ampdu_schedule = true;
if (txinfo->flags & IEEE80211_TX_STAT_AMPDU) { if (txinfo->flags & IEEE80211_TX_STAT_AMPDU) {
txinfo->status.ampdu_len = txinfo->pad[0]; struct _carl9170_tx_superframe *super;
txinfo->status.ampdu_ack_len = txinfo->pad[1];
txinfo->pad[0] = txinfo->pad[1] = 0; super = (void *)skb->data;
txinfo->status.ampdu_len = super->s.rix;
txinfo->status.ampdu_ack_len = super->s.cnt;
} else if (txinfo->flags & IEEE80211_TX_STAT_ACK) { } else if (txinfo->flags & IEEE80211_TX_STAT_ACK) {
/* /*
* drop redundant tx_status reports: * drop redundant tx_status reports:
@ -337,7 +339,8 @@ static void carl9170_tx_status_process_ampdu(struct ar9170 *ar,
u8 tid; u8 tid;
if (!(txinfo->flags & IEEE80211_TX_CTL_AMPDU) || if (!(txinfo->flags & IEEE80211_TX_CTL_AMPDU) ||
txinfo->flags & IEEE80211_TX_CTL_INJECTED) txinfo->flags & IEEE80211_TX_CTL_INJECTED ||
(!(super->f.mac_control & cpu_to_le16(AR9170_TX_MAC_AGGR))))
return; return;
tx_info = IEEE80211_SKB_CB(skb); tx_info = IEEE80211_SKB_CB(skb);
@ -389,8 +392,8 @@ static void carl9170_tx_status_process_ampdu(struct ar9170 *ar,
sta_info->stats[tid].ampdu_ack_len++; sta_info->stats[tid].ampdu_ack_len++;
if (super->f.mac_control & cpu_to_le16(AR9170_TX_MAC_IMM_BA)) { if (super->f.mac_control & cpu_to_le16(AR9170_TX_MAC_IMM_BA)) {
txinfo->pad[0] = sta_info->stats[tid].ampdu_len; super->s.rix = sta_info->stats[tid].ampdu_len;
txinfo->pad[1] = sta_info->stats[tid].ampdu_ack_len; super->s.cnt = sta_info->stats[tid].ampdu_ack_len;
txinfo->flags |= IEEE80211_TX_STAT_AMPDU; txinfo->flags |= IEEE80211_TX_STAT_AMPDU;
sta_info->stats[tid].clear = true; sta_info->stats[tid].clear = true;
} }
@ -896,10 +899,8 @@ static int carl9170_tx_prepare(struct ar9170 *ar, struct sk_buff *skb)
if (unlikely(!sta || !cvif)) if (unlikely(!sta || !cvif))
goto err_out; goto err_out;
factor = min_t(unsigned int, 1u, factor = min_t(unsigned int, 1u, sta->ht_cap.ampdu_factor);
info->control.sta->ht_cap.ampdu_factor); density = sta->ht_cap.ampdu_density;
density = info->control.sta->ht_cap.ampdu_density;
if (density) { if (density) {
/* /*
@ -1260,6 +1261,7 @@ static void carl9170_tx(struct ar9170 *ar)
static bool carl9170_tx_ampdu_queue(struct ar9170 *ar, static bool carl9170_tx_ampdu_queue(struct ar9170 *ar,
struct ieee80211_sta *sta, struct sk_buff *skb) struct ieee80211_sta *sta, struct sk_buff *skb)
{ {
struct _carl9170_tx_superframe *super = (void *) super;
struct carl9170_sta_info *sta_info; struct carl9170_sta_info *sta_info;
struct carl9170_sta_tid *agg; struct carl9170_sta_tid *agg;
struct sk_buff *iter; struct sk_buff *iter;
@ -1328,6 +1330,7 @@ err_unlock:
err_unlock_rcu: err_unlock_rcu:
rcu_read_unlock(); rcu_read_unlock();
super->f.mac_control &= ~cpu_to_le16(AR9170_TX_MAC_AGGR);
carl9170_tx_status(ar, skb, false); carl9170_tx_status(ar, skb, false);
ar->tx_dropped++; ar->tx_dropped++;
return false; return false;
@ -1356,9 +1359,6 @@ int carl9170_op_tx(struct ieee80211_hw *hw, struct sk_buff *skb)
*/ */
if (info->flags & IEEE80211_TX_CTL_AMPDU) { if (info->flags & IEEE80211_TX_CTL_AMPDU) {
if (WARN_ON_ONCE(!sta))
goto err_free;
run = carl9170_tx_ampdu_queue(ar, sta, skb); run = carl9170_tx_ampdu_queue(ar, sta, skb);
if (run) if (run)
carl9170_tx_ampdu(ar); carl9170_tx_ampdu(ar);