mac80211: add WLAN LED support for Ralink RT305x SoC Devices
authorGabor Juhos <juhosg@openwrt.org>
Mon, 4 Apr 2011 08:42:58 +0000 (08:42 +0000)
committerGabor Juhos <juhosg@openwrt.org>
Mon, 4 Apr 2011 08:42:58 +0000 (08:42 +0000)
This patch adds WLAN LED support to the mac80211 driver for Ralink
rt2x00/rt2800 (rt305x) SoC devices. The current driver in
kmod-rt2800-lib is based upon PCI, not SoC. The WLAN LED drivers in
rt2800lib.c set the LED brightness via an MCU request, but do nothing
for SoC. This patch checks for SoC and sets the register to enable the
WLAN LED (instead of an MCU request).  This fixes the WLAN LED for
RT305x devices (such as the HW550-3G).

Signed-off-by: Layne Edwards <ledwards76@gmail.com>
SVN-Revision: 26463

mac80211/patches/620-rt2x00_soc_led_support.patch [new file with mode: 0644]
package/mac80211/Makefile

diff --git a/mac80211/patches/620-rt2x00_soc_led_support.patch b/mac80211/patches/620-rt2x00_soc_led_support.patch
new file mode 100644 (file)
index 0000000..2b87b34
--- /dev/null
@@ -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);
++              }
+       }
+ }
+
index 4c6e60a..b2f8a12 100644 (file)
@@ -11,7 +11,7 @@ include $(INCLUDE_DIR)/kernel.mk
 PKG_NAME:=mac80211
 
 PKG_VERSION:=2011-03-24
-PKG_RELEASE:=1
+PKG_RELEASE:=2
 PKG_SOURCE_URL:=http://mirror2.openwrt.org/sources
 PKG_MD5SUM:=f5713fb3ab59bdd3d0ce931b813ef960