mirror of
https://github.com/openwrt/openwrt.git
synced 2025-01-05 05:24:20 +00:00
439ac8104b
Import patches from upstream to sync 19.07 with master: 9f3e3323e996 rt2x00: allow to specify watchdog interval 2034afe4db4a rt2800: add helpers for reading dma done index 759c5b599cf4 rt2800: initial watchdog implementation 09db3b000619 rt2800: add pre_reset_hw callback 710e6cc1595e rt2800: do not nullify initialization vector data e403fa31ed71 rt2x00: add restart hw 0f47aeeada2a rt2800: do not enable watchdog by default 41a531ffa4c5 rt2x00usb: fix rx queue hang 3b902fa811cf rt2x00usb: remove unnecessary rx flag checks 1dc244064c47 rt2x00: no need to check return value of debugfs_create functions 706f0182b1ad rt2800usb: Add new rt2800usb device PLANEX GW-USMicroN 95844124385e rt2x00: clear IV's on start to fix AP mode regression 567a9b766b47 rt2x00: do not set IEEE80211_TX_STAT_AMPDU_NO_BACK on tx status 14d5e14c8a6c rt2x00: clear up IV's on key removal 13fa451568ab Revert "rt2800: enable TX_PIN_CFG_LNA_PE_ bits per band" --pending-- rt2800: remove errornous duplicate condition Signed-off-by: Daniel Golle <daniel@makrotopia.org>
103 lines
3.1 KiB
Diff
103 lines
3.1 KiB
Diff
From 95844124385eae4bd9ca5f9514a0fc33d561ac3c Mon Sep 17 00:00:00 2001
|
|
From: Stanislaw Gruszka <sgruszka@redhat.com>
|
|
Date: Mon, 19 Aug 2019 13:20:07 +0200
|
|
Subject: [PATCH 12/15] rt2x00: clear IV's on start to fix AP mode regression
|
|
|
|
To do not brake HW restart we should keep initialization vectors data.
|
|
I assumed that on start the data is already initialized to zeros, but
|
|
that not true on some scenarios and we should clear it. So add
|
|
additional flag to check if we are under HW restart and clear IV's
|
|
data if we are not.
|
|
|
|
Patch fixes AP mode regression.
|
|
|
|
Reported-and-tested-by: Emil Karlson <jekarl@iki.fi>
|
|
Fixes: 710e6cc1595e ("rt2800: do not nullify initialization vector data")
|
|
Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com>
|
|
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
|
---
|
|
drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 9 +++++++++
|
|
drivers/net/wireless/ralink/rt2x00/rt2x00.h | 1 +
|
|
drivers/net/wireless/ralink/rt2x00/rt2x00dev.c | 13 ++++++++-----
|
|
3 files changed, 18 insertions(+), 5 deletions(-)
|
|
|
|
--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
|
|
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
|
|
@@ -6106,6 +6106,15 @@ static int rt2800_init_registers(struct
|
|
}
|
|
|
|
/*
|
|
+ * Clear encryption initialization vectors on start, but keep them
|
|
+ * for watchdog reset. Otherwise we will have wrong IVs and not be
|
|
+ * able to keep connections after reset.
|
|
+ */
|
|
+ if (!test_bit(DEVICE_STATE_RESET, &rt2x00dev->flags))
|
|
+ for (i = 0; i < 256; i++)
|
|
+ rt2800_register_write(rt2x00dev, MAC_IVEIV_ENTRY(i), 0);
|
|
+
|
|
+ /*
|
|
* Clear all beacons
|
|
*/
|
|
for (i = 0; i < 8; i++)
|
|
--- a/drivers/net/wireless/ralink/rt2x00/rt2x00.h
|
|
+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00.h
|
|
@@ -669,6 +669,7 @@ enum rt2x00_state_flags {
|
|
DEVICE_STATE_ENABLED_RADIO,
|
|
DEVICE_STATE_SCANNING,
|
|
DEVICE_STATE_FLUSHING,
|
|
+ DEVICE_STATE_RESET,
|
|
|
|
/*
|
|
* Driver configuration
|
|
--- a/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c
|
|
+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c
|
|
@@ -1267,13 +1267,14 @@ static int rt2x00lib_initialize(struct r
|
|
|
|
int rt2x00lib_start(struct rt2x00_dev *rt2x00dev)
|
|
{
|
|
- int retval;
|
|
+ int retval = 0;
|
|
|
|
if (test_bit(DEVICE_STATE_STARTED, &rt2x00dev->flags)) {
|
|
/*
|
|
* This is special case for ieee80211_restart_hw(), otherwise
|
|
* mac80211 never call start() two times in row without stop();
|
|
*/
|
|
+ set_bit(DEVICE_STATE_RESET, &rt2x00dev->flags);
|
|
rt2x00dev->ops->lib->pre_reset_hw(rt2x00dev);
|
|
rt2x00lib_stop(rt2x00dev);
|
|
}
|
|
@@ -1284,14 +1285,14 @@ int rt2x00lib_start(struct rt2x00_dev *r
|
|
*/
|
|
retval = rt2x00lib_load_firmware(rt2x00dev);
|
|
if (retval)
|
|
- return retval;
|
|
+ goto out;
|
|
|
|
/*
|
|
* Initialize the device.
|
|
*/
|
|
retval = rt2x00lib_initialize(rt2x00dev);
|
|
if (retval)
|
|
- return retval;
|
|
+ goto out;
|
|
|
|
rt2x00dev->intf_ap_count = 0;
|
|
rt2x00dev->intf_sta_count = 0;
|
|
@@ -1300,11 +1301,13 @@ int rt2x00lib_start(struct rt2x00_dev *r
|
|
/* Enable the radio */
|
|
retval = rt2x00lib_enable_radio(rt2x00dev);
|
|
if (retval)
|
|
- return retval;
|
|
+ goto out;
|
|
|
|
set_bit(DEVICE_STATE_STARTED, &rt2x00dev->flags);
|
|
|
|
- return 0;
|
|
+out:
|
|
+ clear_bit(DEVICE_STATE_RESET, &rt2x00dev->flags);
|
|
+ return retval;
|
|
}
|
|
|
|
void rt2x00lib_stop(struct rt2x00_dev *rt2x00dev)
|