mt7603: add timeout handling for status skbs

Signed-off-by: Felix Fietkau <[email protected]>
This commit is contained in:
Felix Fietkau
2016-03-03 22:01:08 +01:00
parent 371bb8ce55
commit 43a868c68a
2 changed files with 16 additions and 0 deletions
+2
View File
@@ -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;
+14
View File
@@ -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,