2
0

704-rt2x00-use-different-txstatus-timeouts-when-flushing.patch 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. From feb87977b6d251fb01a329905719e45908f6c939 Mon Sep 17 00:00:00 2001
  2. From: Stanislaw Gruszka <[email protected]>
  3. Date: Fri, 10 Aug 2018 12:31:55 +0200
  4. Subject: [PATCH 4/5] rt2x00: use different txstatus timeouts when flushing
  5. Use different tx status timeouts for normal operation and when flushing.
  6. This increase timeout to 2s for normal operation as when there are bad
  7. radio conditions and frames are reposted many times device can not provide
  8. the status for quite long. With new timeout we can still get valid status
  9. on such bad conditions.
  10. Signed-off-by: Stanislaw Gruszka <[email protected]>
  11. ---
  12. .../net/wireless/ralink/rt2x00/rt2800lib.c | 31 +++++++++++++------
  13. drivers/net/wireless/ralink/rt2x00/rt2x00.h | 1 +
  14. .../net/wireless/ralink/rt2x00/rt2x00mac.c | 4 +++
  15. 3 files changed, 26 insertions(+), 10 deletions(-)
  16. diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
  17. index 0c56c7dca55f..595cb9c90b81 100644
  18. --- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
  19. +++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
  20. @@ -1137,36 +1137,47 @@ void rt2800_txdone(struct rt2x00_dev *rt2x00dev)
  21. }
  22. EXPORT_SYMBOL_GPL(rt2800_txdone);
  23. -static inline bool rt2800_entry_txstatus_timeout(struct queue_entry *entry)
  24. +static inline bool rt2800_entry_txstatus_timeout(struct rt2x00_dev *rt2x00dev,
  25. + struct queue_entry *entry)
  26. {
  27. - bool tout;
  28. + bool ret;
  29. + unsigned long tout;
  30. if (!test_bit(ENTRY_DATA_STATUS_PENDING, &entry->flags))
  31. return false;
  32. - tout = time_after(jiffies, entry->last_action + msecs_to_jiffies(500));
  33. - if (unlikely(tout))
  34. + if (test_bit(DEVICE_STATE_FLUSHING, &rt2x00dev->flags))
  35. + tout = msecs_to_jiffies(100);
  36. + else
  37. + tout = msecs_to_jiffies(2000);
  38. +
  39. + ret = time_after(jiffies, entry->last_action + tout);
  40. + if (unlikely(ret))
  41. rt2x00_dbg(entry->queue->rt2x00dev,
  42. "TX status timeout for entry %d in queue %d\n",
  43. entry->entry_idx, entry->queue->qid);
  44. - return tout;
  45. -
  46. + return ret;
  47. }
  48. bool rt2800_txstatus_timeout(struct rt2x00_dev *rt2x00dev)
  49. {
  50. struct data_queue *queue;
  51. struct queue_entry *entry;
  52. + unsigned long tout;
  53. +
  54. + if (test_bit(DEVICE_STATE_FLUSHING, &rt2x00dev->flags))
  55. + tout = msecs_to_jiffies(50);
  56. + else
  57. + tout = msecs_to_jiffies(1000);
  58. - if (time_before(jiffies,
  59. - rt2x00dev->last_nostatus_check + msecs_to_jiffies(500)))
  60. + if (time_before(jiffies, rt2x00dev->last_nostatus_check + tout))
  61. return false;
  62. rt2x00dev->last_nostatus_check = jiffies;
  63. tx_queue_for_each(rt2x00dev, queue) {
  64. entry = rt2x00queue_get_entry(queue, Q_INDEX_DONE);
  65. - if (rt2800_entry_txstatus_timeout(entry))
  66. + if (rt2800_entry_txstatus_timeout(rt2x00dev, entry))
  67. return true;
  68. }
  69. @@ -1195,7 +1206,7 @@ void rt2800_txdone_nostatus(struct rt2x00_dev *rt2x00dev)
  70. break;
  71. if (test_bit(ENTRY_DATA_IO_FAILED, &entry->flags) ||
  72. - rt2800_entry_txstatus_timeout(entry))
  73. + rt2800_entry_txstatus_timeout(rt2x00dev, entry))
  74. rt2x00lib_txdone_noinfo(entry, TXDONE_FAILURE);
  75. else
  76. break;
  77. diff --git a/drivers/net/wireless/ralink/rt2x00/rt2x00.h b/drivers/net/wireless/ralink/rt2x00/rt2x00.h
  78. index af062cda4a23..4b1744e9fb78 100644
  79. --- a/drivers/net/wireless/ralink/rt2x00/rt2x00.h
  80. +++ b/drivers/net/wireless/ralink/rt2x00/rt2x00.h
  81. @@ -665,6 +665,7 @@ enum rt2x00_state_flags {
  82. DEVICE_STATE_STARTED,
  83. DEVICE_STATE_ENABLED_RADIO,
  84. DEVICE_STATE_SCANNING,
  85. + DEVICE_STATE_FLUSHING,
  86. /*
  87. * Driver configuration
  88. diff --git a/drivers/net/wireless/ralink/rt2x00/rt2x00mac.c b/drivers/net/wireless/ralink/rt2x00/rt2x00mac.c
  89. index fa2fd64084ac..2825560e2424 100644
  90. --- a/drivers/net/wireless/ralink/rt2x00/rt2x00mac.c
  91. +++ b/drivers/net/wireless/ralink/rt2x00/rt2x00mac.c
  92. @@ -720,8 +720,12 @@ void rt2x00mac_flush(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
  93. if (!test_bit(DEVICE_STATE_PRESENT, &rt2x00dev->flags))
  94. return;
  95. + set_bit(DEVICE_STATE_FLUSHING, &rt2x00dev->flags);
  96. +
  97. tx_queue_for_each(rt2x00dev, queue)
  98. rt2x00queue_flush_queue(queue, drop);
  99. +
  100. + clear_bit(DEVICE_STATE_FLUSHING, &rt2x00dev->flags);
  101. }
  102. EXPORT_SYMBOL_GPL(rt2x00mac_flush);
  103. --
  104. 2.18.0