rt2x00: use different txstatus timeouts when flushing
authorStanislaw Gruszka <sgruszka@redhat.com>
Wed, 26 Sep 2018 10:24:56 +0000 (12:24 +0200)
committerKalle Valo <kvalo@codeaurora.org>
Mon, 1 Oct 2018 15:37:34 +0000 (18:37 +0300)
Use different tx status timeouts for normal operation and when flushing.
This increase timeout to 2s for normal operation as when there are bad
radio conditions and frames are reposted many times device can not provide
the status for quite long. With new timeout we can still get valid status
on such bad conditions.

Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
drivers/net/wireless/ralink/rt2x00/rt2800lib.c
drivers/net/wireless/ralink/rt2x00/rt2x00.h
drivers/net/wireless/ralink/rt2x00/rt2x00mac.c

index 0c56c7dca55fea74dec1e27ebbd828bf34497bd0..595cb9c90b8178d1536b737dfc9b215418c406fc 100644 (file)
@@ -1137,36 +1137,47 @@ void rt2800_txdone(struct rt2x00_dev *rt2x00dev)
 }
 EXPORT_SYMBOL_GPL(rt2800_txdone);
 
-static inline bool rt2800_entry_txstatus_timeout(struct queue_entry *entry)
+static inline bool rt2800_entry_txstatus_timeout(struct rt2x00_dev *rt2x00dev,
+                                                struct queue_entry *entry)
 {
-       bool tout;
+       bool ret;
+       unsigned long tout;
 
        if (!test_bit(ENTRY_DATA_STATUS_PENDING, &entry->flags))
                return false;
 
-       tout = time_after(jiffies, entry->last_action + msecs_to_jiffies(500));
-       if (unlikely(tout))
+       if (test_bit(DEVICE_STATE_FLUSHING, &rt2x00dev->flags))
+               tout = msecs_to_jiffies(100);
+       else
+               tout = msecs_to_jiffies(2000);
+
+       ret = time_after(jiffies, entry->last_action + tout);
+       if (unlikely(ret))
                rt2x00_dbg(entry->queue->rt2x00dev,
                           "TX status timeout for entry %d in queue %d\n",
                           entry->entry_idx, entry->queue->qid);
-       return tout;
-
+       return ret;
 }
 
 bool rt2800_txstatus_timeout(struct rt2x00_dev *rt2x00dev)
 {
        struct data_queue *queue;
        struct queue_entry *entry;
+       unsigned long tout;
+
+       if (test_bit(DEVICE_STATE_FLUSHING, &rt2x00dev->flags))
+               tout = msecs_to_jiffies(50);
+       else
+               tout = msecs_to_jiffies(1000);
 
-       if (time_before(jiffies,
-                       rt2x00dev->last_nostatus_check + msecs_to_jiffies(500)))
+       if (time_before(jiffies, rt2x00dev->last_nostatus_check + tout))
                return false;
 
        rt2x00dev->last_nostatus_check = jiffies;
 
        tx_queue_for_each(rt2x00dev, queue) {
                entry = rt2x00queue_get_entry(queue, Q_INDEX_DONE);
-               if (rt2800_entry_txstatus_timeout(entry))
+               if (rt2800_entry_txstatus_timeout(rt2x00dev, entry))
                        return true;
        }
 
@@ -1195,7 +1206,7 @@ void rt2800_txdone_nostatus(struct rt2x00_dev *rt2x00dev)
                                break;
 
                        if (test_bit(ENTRY_DATA_IO_FAILED, &entry->flags) ||
-                           rt2800_entry_txstatus_timeout(entry))
+                           rt2800_entry_txstatus_timeout(rt2x00dev, entry))
                                rt2x00lib_txdone_noinfo(entry, TXDONE_FAILURE);
                        else
                                break;
index af062cda4a233f74125b4b6d3eb9a10fc42bd9af..4b1744e9fb78a08c59fe0ac71d0d9962ae6761be 100644 (file)
@@ -665,6 +665,7 @@ enum rt2x00_state_flags {
        DEVICE_STATE_STARTED,
        DEVICE_STATE_ENABLED_RADIO,
        DEVICE_STATE_SCANNING,
+       DEVICE_STATE_FLUSHING,
 
        /*
         * Driver configuration
index fa2fd64084ac91c497c0b32f9f465af30d5ad076..2825560e2424dbc766c5d5489491ff7dc67c5211 100644 (file)
@@ -720,8 +720,12 @@ void rt2x00mac_flush(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
        if (!test_bit(DEVICE_STATE_PRESENT, &rt2x00dev->flags))
                return;
 
+       set_bit(DEVICE_STATE_FLUSHING, &rt2x00dev->flags);
+
        tx_queue_for_each(rt2x00dev, queue)
                rt2x00queue_flush_queue(queue, drop);
+
+       clear_bit(DEVICE_STATE_FLUSHING, &rt2x00dev->flags);
 }
 EXPORT_SYMBOL_GPL(rt2x00mac_flush);