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;
|
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);
|
||||||
|
|
Loading…
Reference in a new issue