mac80211: rt2x00: backport accepted and pending patches from upstream
[openwrt/openwrt.git] / package / kernel / mac80211 / patches / rt2x00 / 005-rt2x00-use-different-txstatus-timeouts-when-flushing.patch
diff --git a/package/kernel/mac80211/patches/rt2x00/005-rt2x00-use-different-txstatus-timeouts-when-flushing.patch b/package/kernel/mac80211/patches/rt2x00/005-rt2x00-use-different-txstatus-timeouts-when-flushing.patch
new file mode 100644 (file)
index 0000000..0f29026
--- /dev/null
@@ -0,0 +1,112 @@
+From adf26a356f132e35093585521ea3e36cd185af83 Mon Sep 17 00:00:00 2001
+From: Stanislaw Gruszka <sgruszka@redhat.com>
+Date: Wed, 26 Sep 2018 12:24:56 +0200
+Subject: [PATCH 05/28] rt2x00: use different txstatus timeouts when flushing
+
+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>
+---
+ .../net/wireless/ralink/rt2x00/rt2800lib.c    | 31 +++++++++++++------
+ drivers/net/wireless/ralink/rt2x00/rt2x00.h   |  1 +
+ .../net/wireless/ralink/rt2x00/rt2x00mac.c    |  4 +++
+ 3 files changed, 26 insertions(+), 10 deletions(-)
+
+--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
++++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+@@ -1137,36 +1137,47 @@ void rt2800_txdone(struct rt2x00_dev *rt
+ }
+ 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 rt2x0
+                               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;
+--- a/drivers/net/wireless/ralink/rt2x00/rt2x00.h
++++ b/drivers/net/wireless/ralink/rt2x00/rt2x00.h
+@@ -665,6 +665,7 @@ enum rt2x00_state_flags {
+       DEVICE_STATE_STARTED,
+       DEVICE_STATE_ENABLED_RADIO,
+       DEVICE_STATE_SCANNING,
++      DEVICE_STATE_FLUSHING,
+       /*
+        * Driver configuration
+--- a/drivers/net/wireless/ralink/rt2x00/rt2x00mac.c
++++ b/drivers/net/wireless/ralink/rt2x00/rt2x00mac.c
+@@ -720,8 +720,12 @@ void rt2x00mac_flush(struct ieee80211_hw
+       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);