aboutsummaryrefslogtreecommitdiffstats
path: root/package/kernel/mac80211/patches/530-ath9k_extra_leds.patch
diff options
context:
space:
mode:
authorFelix Fietkau <nbd@nbd.name>2017-01-25 15:32:18 +0100
committerFelix Fietkau <nbd@nbd.name>2017-01-25 16:25:48 +0100
commitb94177e10fc72f9309eae7459c3570e5c080e960 (patch)
tree26efa9c6172b394c2113926cfa7b6aad6c9ebc1f /package/kernel/mac80211/patches/530-ath9k_extra_leds.patch
parent4cacc1c5f5e01594d4e9148a7b34946845424e24 (diff)
downloadupstream-b94177e10fc72f9309eae7459c3570e5c080e960.tar.gz
upstream-b94177e10fc72f9309eae7459c3570e5c080e960.tar.bz2
upstream-b94177e10fc72f9309eae7459c3570e5c080e960.zip
ath9k: add stability fixes for long standing hang issues (FS#13, #34, #373, #383)
The radio would stop communicating completely. This issue was easiest to trigger on AR913x devices, e.g. the TP-Link TL-WR1043ND, but other hardware was occasionally affected as well. The most critical issue was a race condition in disabling/enabling IRQs between the IRQ handler and the IRQ processing tasklet Signed-off-by: Felix Fietkau <nbd@nbd.name>
Diffstat (limited to 'package/kernel/mac80211/patches/530-ath9k_extra_leds.patch')
-rw-r--r--package/kernel/mac80211/patches/530-ath9k_extra_leds.patch20
1 files changed, 10 insertions, 10 deletions
diff --git a/package/kernel/mac80211/patches/530-ath9k_extra_leds.patch b/package/kernel/mac80211/patches/530-ath9k_extra_leds.patch
index bbef79d9f6..061288dd87 100644
--- a/package/kernel/mac80211/patches/530-ath9k_extra_leds.patch
+++ b/package/kernel/mac80211/patches/530-ath9k_extra_leds.patch
@@ -24,7 +24,7 @@
struct ath_softc {
struct ieee80211_hw *hw;
struct device *dev;
-@@ -1045,9 +1055,8 @@ struct ath_softc {
+@@ -1047,9 +1057,8 @@ struct ath_softc {
spinlock_t chan_lock;
#ifdef CPTCFG_MAC80211_LEDS
@@ -103,7 +103,8 @@
+ GFP_KERNEL);
+ if (!led)
+ return -ENOMEM;
-+
+
+- ath9k_hw_set_gpio(sc->sc_ah, sc->sc_ah->led_pin, val);
+ led->gpio = gpio = (struct gpio_led *) (led + 1);
+ _name = (char *) (led->gpio + 1);
+
@@ -116,8 +117,7 @@
+ ret = ath_add_led(sc, led);
+ if (unlikely(ret < 0))
+ kfree(led);
-
-- ath9k_hw_set_gpio(sc->sc_ah, sc->sc_ah->led_pin, val);
++
+ return ret;
}
@@ -125,11 +125,11 @@
{
- if (!sc->led_registered)
- return;
-+ struct ath_led *led;
-
+-
- ath_led_brightness(&sc->led_cdev, LED_OFF);
- led_classdev_unregister(&sc->led_cdev);
--
++ struct ath_led *led;
+
- ath9k_hw_gpio_free(sc->sc_ah, sc->sc_ah->led_pin);
+ while (!list_empty(&sc->leds)) {
+ led = list_first_entry(&sc->leds, struct ath_led, list);
@@ -181,7 +181,7 @@
--- a/drivers/net/wireless/ath/ath9k/init.c
+++ b/drivers/net/wireless/ath/ath9k/init.c
-@@ -990,7 +990,7 @@ int ath9k_init_device(u16 devid, struct
+@@ -992,7 +992,7 @@ int ath9k_init_device(u16 devid, struct
#ifdef CPTCFG_MAC80211_LEDS
/* must be initialized before ieee80211_register_hw */
@@ -192,7 +192,7 @@
#endif
--- a/drivers/net/wireless/ath/ath9k/debug.c
+++ b/drivers/net/wireless/ath/ath9k/debug.c
-@@ -1407,6 +1407,61 @@ static const struct file_operations fops
+@@ -1408,6 +1408,61 @@ static const struct file_operations fops
.llseek = default_llseek,
};
@@ -254,7 +254,7 @@
int ath9k_init_debug(struct ath_hw *ah)
{
-@@ -1431,6 +1486,10 @@ int ath9k_init_debug(struct ath_hw *ah)
+@@ -1432,6 +1487,10 @@ int ath9k_init_debug(struct ath_hw *ah)
&fops_eeprom);
debugfs_create_file("chanbw", S_IRUSR | S_IWUSR, sc->debug.debugfs_phy,
sc, &fops_chanbw);