mirror of
https://github.com/torvalds/linux.git
synced 2024-12-30 06:41:43 +00:00
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:
parent
ffa56e540c
commit
041fb8f504
@ -242,9 +242,11 @@ static void carl9170_tx_release(struct kref *ref)
|
||||
ar->tx_ampdu_schedule = true;
|
||||
|
||||
if (txinfo->flags & IEEE80211_TX_STAT_AMPDU) {
|
||||
txinfo->status.ampdu_len = txinfo->pad[0];
|
||||
txinfo->status.ampdu_ack_len = txinfo->pad[1];
|
||||
txinfo->pad[0] = txinfo->pad[1] = 0;
|
||||
struct _carl9170_tx_superframe *super;
|
||||
|
||||
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) {
|
||||
/*
|
||||
* drop redundant tx_status reports:
|
||||
@ -337,7 +339,8 @@ static void carl9170_tx_status_process_ampdu(struct ar9170 *ar,
|
||||
u8 tid;
|
||||
|
||||
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;
|
||||
|
||||
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++;
|
||||
|
||||
if (super->f.mac_control & cpu_to_le16(AR9170_TX_MAC_IMM_BA)) {
|
||||
txinfo->pad[0] = sta_info->stats[tid].ampdu_len;
|
||||
txinfo->pad[1] = sta_info->stats[tid].ampdu_ack_len;
|
||||
super->s.rix = sta_info->stats[tid].ampdu_len;
|
||||
super->s.cnt = sta_info->stats[tid].ampdu_ack_len;
|
||||
txinfo->flags |= IEEE80211_TX_STAT_AMPDU;
|
||||
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))
|
||||
goto err_out;
|
||||
|
||||
factor = min_t(unsigned int, 1u,
|
||||
info->control.sta->ht_cap.ampdu_factor);
|
||||
|
||||
density = info->control.sta->ht_cap.ampdu_density;
|
||||
factor = min_t(unsigned int, 1u, sta->ht_cap.ampdu_factor);
|
||||
density = sta->ht_cap.ampdu_density;
|
||||
|
||||
if (density) {
|
||||
/*
|
||||
@ -1260,6 +1261,7 @@ static void carl9170_tx(struct ar9170 *ar)
|
||||
static bool carl9170_tx_ampdu_queue(struct ar9170 *ar,
|
||||
struct ieee80211_sta *sta, struct sk_buff *skb)
|
||||
{
|
||||
struct _carl9170_tx_superframe *super = (void *) super;
|
||||
struct carl9170_sta_info *sta_info;
|
||||
struct carl9170_sta_tid *agg;
|
||||
struct sk_buff *iter;
|
||||
@ -1328,6 +1330,7 @@ err_unlock:
|
||||
|
||||
err_unlock_rcu:
|
||||
rcu_read_unlock();
|
||||
super->f.mac_control &= ~cpu_to_le16(AR9170_TX_MAC_AGGR);
|
||||
carl9170_tx_status(ar, skb, false);
|
||||
ar->tx_dropped++;
|
||||
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 (WARN_ON_ONCE(!sta))
|
||||
goto err_free;
|
||||
|
||||
run = carl9170_tx_ampdu_queue(ar, sta, skb);
|
||||
if (run)
|
||||
carl9170_tx_ampdu(ar);
|
||||
|
Loading…
Reference in New Issue
Block a user