Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 224274
b: refs/heads/master
c: 2a6cef5
h: refs/heads/master
v: v3
  • Loading branch information
Christian Lamparter authored and John W. Linville committed Nov 15, 2010
1 parent 7e83bd4 commit 3c87398
Show file tree
Hide file tree
Showing 2 changed files with 55 additions and 1 deletion.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: e4a668c59080f862af3ecc28b359533027cbe434
refs/heads/master: 2a6cef513fab525399e484edc9bfb39b6d462f76
54 changes: 54 additions & 0 deletions trunk/drivers/net/wireless/ath/carl9170/tx.c
Original file line number Diff line number Diff line change
Expand Up @@ -524,6 +524,59 @@ static void carl9170_check_queue_stop_timeout(struct ar9170 *ar)
}
}

static void carl9170_tx_ampdu_timeout(struct ar9170 *ar)
{
struct carl9170_sta_tid *iter;
struct sk_buff *skb;
struct ieee80211_tx_info *txinfo;
struct carl9170_tx_info *arinfo;
struct _carl9170_tx_superframe *super;
struct ieee80211_sta *sta;
struct ieee80211_vif *vif;
struct ieee80211_hdr *hdr;
unsigned int vif_id;

rcu_read_lock();
list_for_each_entry_rcu(iter, &ar->tx_ampdu_list, list) {
if (iter->state < CARL9170_TID_STATE_IDLE)
continue;

spin_lock_bh(&iter->lock);
skb = skb_peek(&iter->queue);
if (!skb)
goto unlock;

txinfo = IEEE80211_SKB_CB(skb);
arinfo = (void *)txinfo->rate_driver_data;
if (time_is_after_jiffies(arinfo->timeout +
msecs_to_jiffies(CARL9170_QUEUE_TIMEOUT)))
goto unlock;

super = (void *) skb->data;
hdr = (void *) super->frame_data;

vif_id = (super->s.misc & CARL9170_TX_SUPER_MISC_VIF_ID) >>
CARL9170_TX_SUPER_MISC_VIF_ID_S;

if (WARN_ON(vif_id >= AR9170_MAX_VIRTUAL_MAC))
goto unlock;

vif = rcu_dereference(ar->vif_priv[vif_id].vif);
if (WARN_ON(!vif))
goto unlock;

sta = ieee80211_find_sta(vif, hdr->addr1);
if (WARN_ON(!sta))
goto unlock;

ieee80211_stop_tx_ba_session(sta, iter->tid);
unlock:
spin_unlock_bh(&iter->lock);

}
rcu_read_unlock();
}

void carl9170_tx_janitor(struct work_struct *work)
{
struct ar9170 *ar = container_of(work, struct ar9170,
Expand All @@ -534,6 +587,7 @@ void carl9170_tx_janitor(struct work_struct *work)
ar->tx_janitor_last_run = jiffies;

carl9170_check_queue_stop_timeout(ar);
carl9170_tx_ampdu_timeout(ar);

if (!atomic_read(&ar->tx_total_queued))
return;
Expand Down

0 comments on commit 3c87398

Please sign in to comment.