diff options
Diffstat (limited to 'mac80211')
-rw-r--r-- | mac80211/patches/620-rt2x00_soc_led_support.patch | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/mac80211/patches/620-rt2x00_soc_led_support.patch b/mac80211/patches/620-rt2x00_soc_led_support.patch new file mode 100644 index 000000000..2b87b346d --- /dev/null +++ b/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, ®); ++ ++ /* Set LED Polarity */ ++ rt2x00_set_field32(®, LED_CFG_LED_POLAR, polarity); ++ ++ /* Set LED Mode */ ++ if (led->type == LED_TYPE_RADIO) { ++ rt2x00_set_field32(®, LED_CFG_G_LED_MODE, ++ enabled ? 3 : 0); ++ } else if (led->type == LED_TYPE_ASSOC) { ++ rt2x00_set_field32(®, LED_CFG_Y_LED_MODE, ++ enabled ? 3 : 0); ++ } else if (led->type == LED_TYPE_QUALITY) { ++ rt2x00_set_field32(®, 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); ++ } + } + } + |