aboutsummaryrefslogtreecommitdiffstats
path: root/package/mac80211
diff options
context:
space:
mode:
Diffstat (limited to 'package/mac80211')
-rw-r--r--package/mac80211/patches/620-rt2x00_soc_led_support.patch75
1 files changed, 75 insertions, 0 deletions
diff --git a/package/mac80211/patches/620-rt2x00_soc_led_support.patch b/package/mac80211/patches/620-rt2x00_soc_led_support.patch
new file mode 100644
index 0000000000..2b87b346d3
--- /dev/null
+++ b/package/mac80211/patches/620-rt2x00_soc_led_support.patch
@@ -0,0 +1,75 @@
+--- a/drivers/net/wireless/rt2x00/rt2800lib.c
++++ b/drivers/net/wireless/rt2x00/rt2800lib.c
+@@ -935,6 +935,7 @@
+ static void rt2800_brightness_set(struct led_classdev *led_cdev,
+ enum led_brightness brightness)
+ {
++ u32 reg;
+ struct rt2x00_led *led =
+ container_of(led_cdev, struct rt2x00_led, led_dev);
+ unsigned int enabled = brightness != LED_OFF;
+@@ -947,24 +948,46 @@
+ rt2x00_get_field16(led->rt2x00dev->led_mcu_reg,
+ EEPROM_FREQ_LED_MODE);
+
+- if (led->type == LED_TYPE_RADIO) {
+- rt2800_mcu_request(led->rt2x00dev, MCU_LED, 0xff, ledmode,
+- enabled ? 0x20 : 0);
+- } else if (led->type == LED_TYPE_ASSOC) {
+- rt2800_mcu_request(led->rt2x00dev, MCU_LED, 0xff, ledmode,
+- enabled ? (bg_mode ? 0x60 : 0xa0) : 0x20);
+- } else if (led->type == LED_TYPE_QUALITY) {
+- /*
+- * The brightness is divided into 6 levels (0 - 5),
+- * The specs tell us the following levels:
+- * 0, 1 ,3, 7, 15, 31
+- * to determine the level in a simple way we can simply
+- * work with bitshifting:
+- * (1 << level) - 1
+- */
+- rt2800_mcu_request(led->rt2x00dev, MCU_LED_STRENGTH, 0xff,
+- (1 << brightness / (LED_FULL / 6)) - 1,
+- polarity);
++ /* Check for SoC (SOC devices don't support MCU requests) */
++ if (rt2x00_is_soc(led->rt2x00dev)) {
++ rt2800_register_read(led->rt2x00dev, LED_CFG, &reg);
++
++ /* Set LED Polarity */
++ rt2x00_set_field32(&reg, LED_CFG_LED_POLAR, polarity);
++
++ /* Set LED Mode */
++ if (led->type == LED_TYPE_RADIO) {
++ rt2x00_set_field32(&reg, LED_CFG_G_LED_MODE,
++ enabled ? 3 : 0);
++ } else if (led->type == LED_TYPE_ASSOC) {
++ rt2x00_set_field32(&reg, LED_CFG_Y_LED_MODE,
++ enabled ? 3 : 0);
++ } else if (led->type == LED_TYPE_QUALITY) {
++ rt2x00_set_field32(&reg, LED_CFG_R_LED_MODE,
++ enabled ? 3 : 0);
++ }
++ rt2800_register_write(led->rt2x00dev, LED_CFG, reg);
++ }
++ else {
++ if (led->type == LED_TYPE_RADIO) {
++ rt2800_mcu_request(led->rt2x00dev, MCU_LED, 0xff, ledmode,
++ enabled ? 0x20 : 0);
++ } else if (led->type == LED_TYPE_ASSOC) {
++ rt2800_mcu_request(led->rt2x00dev, MCU_LED, 0xff, ledmode,
++ enabled ? (bg_mode ? 0x60 : 0xa0) : 0x20);
++ } else if (led->type == LED_TYPE_QUALITY) {
++ /*
++ * The brightness is divided into 6 levels (0 - 5),
++ * The specs tell us the following levels:
++ * 0, 1 ,3, 7, 15, 31
++ * to determine the level in a simple way we can simply
++ * work with bitshifting:
++ * (1 << level) - 1
++ */
++ rt2800_mcu_request(led->rt2x00dev, MCU_LED_STRENGTH, 0xff,
++ (1 << brightness / (LED_FULL / 6)) - 1,
++ polarity);
++ }
+ }
+ }
+