aboutsummaryrefslogtreecommitdiffstats
path: root/package/kernel/mac80211/patches/903-wlcore-block-read-writes-to-FW-during-ELP.patch
diff options
context:
space:
mode:
Diffstat (limited to 'package/kernel/mac80211/patches/903-wlcore-block-read-writes-to-FW-during-ELP.patch')
-rw-r--r--package/kernel/mac80211/patches/903-wlcore-block-read-writes-to-FW-during-ELP.patch36
1 files changed, 36 insertions, 0 deletions
diff --git a/package/kernel/mac80211/patches/903-wlcore-block-read-writes-to-FW-during-ELP.patch b/package/kernel/mac80211/patches/903-wlcore-block-read-writes-to-FW-during-ELP.patch
new file mode 100644
index 0000000000..1aafb32968
--- /dev/null
+++ b/package/kernel/mac80211/patches/903-wlcore-block-read-writes-to-FW-during-ELP.patch
@@ -0,0 +1,36 @@
+When the chip is in ELP mode read/write to FW is invalid and may cause
+the lower layers to get stuck. The reads/writes concerning ELP wakeup
+are the exception here and are checked for. In addition to blocking the
+IO, produce a warning.
+
+Signed-off-by: Barak Bercovitz <barak@wizery.com>
+Signed-off-by: Eliad Peller <eliad@wizery.com>
+
+---
+drivers/net/wireless/ti/wlcore/io.h | 8 ++++++--
+ 1 file changed, 6 insertions(+), 2 deletions(-)
+
+--- a/drivers/net/wireless/ti/wlcore/io.h
++++ b/drivers/net/wireless/ti/wlcore/io.h
+@@ -60,7 +60,9 @@ static inline int __must_check wlcore_ra
+ {
+ int ret;
+
+- if (test_bit(WL1271_FLAG_IO_FAILED, &wl->flags))
++ if (test_bit(WL1271_FLAG_IO_FAILED, &wl->flags) ||
++ WARN_ON((test_bit(WL1271_FLAG_IN_ELP, &wl->flags) &&
++ addr != HW_ACCESS_ELP_CTRL_REG)))
+ return -EIO;
+
+ ret = wl->if_ops->write(wl->dev, addr, buf, len, fixed);
+@@ -76,7 +78,9 @@ static inline int __must_check wlcore_ra
+ {
+ int ret;
+
+- if (test_bit(WL1271_FLAG_IO_FAILED, &wl->flags))
++ if (test_bit(WL1271_FLAG_IO_FAILED, &wl->flags) ||
++ WARN_ON((test_bit(WL1271_FLAG_IN_ELP, &wl->flags) &&
++ addr != HW_ACCESS_ELP_CTRL_REG)))
+ return -EIO;
+
+ ret = wl->if_ops->read(wl->dev, addr, buf, len, fixed);