From 43a868c68ad9f93152fb1174a359be65a3a0cb28 Mon Sep 17 00:00:00 2001 From: Felix Fietkau Date: Thu, 3 Mar 2016 22:01:08 +0100 Subject: [PATCH] mt7603: add timeout handling for status skbs Signed-off-by: Felix Fietkau --- mt7603.h | 2 ++ mt7603_mac.c | 14 ++++++++++++++ 2 files changed, 16 insertions(+) diff --git a/mt7603.h b/mt7603.h index e8549280..8a6836b9 100644 --- a/mt7603.h +++ b/mt7603.h @@ -35,6 +35,7 @@ #define MT7603_PRE_TBTT_TIME 5000 /* ms */ +#define MT7603_STATUS_TIMEOUT (10 * HZ) #define MT7603_WATCHDOG_TIME 100 /* ms */ #define MT7603_WATCHDOG_TIMEOUT 10 /* number of checks */ @@ -85,6 +86,7 @@ struct mt7603_vif { #define MT7603_CB_TXS_FAILED BIT(2) struct mt7603_cb { + unsigned long jiffies; u8 wcid; u8 pktid; u8 flags; diff --git a/mt7603_mac.c b/mt7603_mac.c index c0122d32..df33e2dc 100644 --- a/mt7603_mac.c +++ b/mt7603_mac.c @@ -704,6 +704,7 @@ mt7603_add_tx_status_skb(struct mt7603_dev *dev, struct mt7603_sta *msta, pid = msta->pid; cb->wcid = msta->wcid.idx; cb->pktid = pid; + cb->jiffies = jiffies; __skb_queue_tail(&dev->status_list, skb); @@ -1123,8 +1124,21 @@ mt7603_watchdog_check(struct mt7603_dev *dev, u8 *counter, void mt7603_mac_work(struct work_struct *work) { struct mt7603_dev *dev = container_of(work, struct mt7603_dev, mac_work.work); + struct sk_buff *skb; int time = MT7603_WATCHDOG_TIME; + spin_lock_bh(&dev->status_lock); + while ((skb = skb_peek(&dev->status_list)) != NULL) { + struct mt7603_cb *cb = mt7603_skb_cb(skb); + if (time_is_after_jiffies(cb->jiffies + MT7603_STATUS_TIMEOUT)) + break; + + __skb_unlink(skb, &dev->status_list); + mt7603_skb_done(dev, skb, + MT7603_CB_TXS_FAILED | MT7603_CB_TXS_DONE); + } + spin_unlock_bh(&dev->status_lock); + mutex_lock(&dev->mutex); if (WARN_ON_ONCE(mt7603_watchdog_check(dev, &dev->tx_check,