2019-02-13 18:47:18 +00:00
|
|
|
From adf26a356f132e35093585521ea3e36cd185af83 Mon Sep 17 00:00:00 2001
|
2018-08-15 14:02:18 +00:00
|
|
|
From: Stanislaw Gruszka <sgruszka@redhat.com>
|
2019-02-13 18:47:18 +00:00
|
|
|
Date: Wed, 26 Sep 2018 12:24:56 +0200
|
|
|
|
Subject: [PATCH 05/28] rt2x00: use different txstatus timeouts when flushing
|
2018-08-15 14:02:18 +00:00
|
|
|
|
|
|
|
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>
|
2019-02-13 18:47:18 +00:00
|
|
|
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
2018-08-15 14:02:18 +00:00
|
|
|
---
|
|
|
|
.../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
|
2019-02-13 18:47:18 +00:00
|
|
|
@@ -1137,36 +1137,47 @@ void rt2800_txdone(struct rt2x00_dev *rt
|
2018-08-15 14:02:18 +00:00
|
|
|
}
|
|
|
|
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;
|
|
|
|
}
|
|
|
|
|
2019-02-13 18:47:18 +00:00
|
|
|
@@ -1195,7 +1206,7 @@ void rt2800_txdone_nostatus(struct rt2x0
|
2018-08-15 14:02:18 +00:00
|
|
|
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
|
2019-02-13 18:47:18 +00:00
|
|
|
@@ -665,6 +665,7 @@ enum rt2x00_state_flags {
|
2018-08-15 14:02:18 +00:00
|
|
|
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
|
2019-07-06 22:08:20 +00:00
|
|
|
@@ -710,8 +710,12 @@ void rt2x00mac_flush(struct ieee80211_hw
|
2018-08-15 14:02:18 +00:00
|
|
|
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);
|
|
|
|
|