rt2x00: Remove MAC80211_LEDS dependency
Implement triggers inside rt2x00 itself based on input from mac80211. This replaces the method of using the mac80211 trigger events which do not work for USB drivers due to the scheduling requirement. After this patch RT2500USB_LEDS and RT73USB_LEDS no longer need to be tagged as broken since they now support LED handling again without having to check for in_atomic(). Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:
parent
e0b005fa14
commit
a2e1d52a32
|
@ -38,10 +38,6 @@ config RT2X00_LIB_RFKILL
|
||||||
config RT2X00_LIB_LEDS
|
config RT2X00_LIB_LEDS
|
||||||
boolean
|
boolean
|
||||||
depends on RT2X00_LIB
|
depends on RT2X00_LIB
|
||||||
select NEW_LEDS
|
|
||||||
select LEDS_CLASS
|
|
||||||
select LEDS_TRIGGERS
|
|
||||||
select MAC80211_LEDS
|
|
||||||
|
|
||||||
config RT2400PCI
|
config RT2400PCI
|
||||||
tristate "Ralink rt2400 pci/pcmcia support"
|
tristate "Ralink rt2400 pci/pcmcia support"
|
||||||
|
@ -64,7 +60,7 @@ config RT2400PCI_RFKILL
|
||||||
|
|
||||||
config RT2400PCI_LEDS
|
config RT2400PCI_LEDS
|
||||||
bool "RT2400 leds support"
|
bool "RT2400 leds support"
|
||||||
depends on RT2400PCI
|
depends on RT2400PCI && LEDS_CLASS
|
||||||
select RT2X00_LIB_LEDS
|
select RT2X00_LIB_LEDS
|
||||||
---help---
|
---help---
|
||||||
This adds support for led triggers provided my mac80211.
|
This adds support for led triggers provided my mac80211.
|
||||||
|
@ -90,7 +86,7 @@ config RT2500PCI_RFKILL
|
||||||
|
|
||||||
config RT2500PCI_LEDS
|
config RT2500PCI_LEDS
|
||||||
bool "RT2500 leds support"
|
bool "RT2500 leds support"
|
||||||
depends on RT2500PCI
|
depends on RT2500PCI && LEDS_CLASS
|
||||||
select RT2X00_LIB_LEDS
|
select RT2X00_LIB_LEDS
|
||||||
---help---
|
---help---
|
||||||
This adds support for led triggers provided my mac80211.
|
This adds support for led triggers provided my mac80211.
|
||||||
|
@ -118,7 +114,7 @@ config RT61PCI_RFKILL
|
||||||
|
|
||||||
config RT61PCI_LEDS
|
config RT61PCI_LEDS
|
||||||
bool "RT61 leds support"
|
bool "RT61 leds support"
|
||||||
depends on RT61PCI
|
depends on RT61PCI && LEDS_CLASS
|
||||||
select RT2X00_LIB_LEDS
|
select RT2X00_LIB_LEDS
|
||||||
---help---
|
---help---
|
||||||
This adds support for led triggers provided my mac80211.
|
This adds support for led triggers provided my mac80211.
|
||||||
|
@ -134,7 +130,7 @@ config RT2500USB
|
||||||
|
|
||||||
config RT2500USB_LEDS
|
config RT2500USB_LEDS
|
||||||
bool "RT2500 leds support"
|
bool "RT2500 leds support"
|
||||||
depends on RT2500USB && BROKEN
|
depends on RT2500USB && LEDS_CLASS
|
||||||
select RT2X00_LIB_LEDS
|
select RT2X00_LIB_LEDS
|
||||||
---help---
|
---help---
|
||||||
This adds support for led triggers provided my mac80211.
|
This adds support for led triggers provided my mac80211.
|
||||||
|
@ -152,7 +148,7 @@ config RT73USB
|
||||||
|
|
||||||
config RT73USB_LEDS
|
config RT73USB_LEDS
|
||||||
bool "RT73 leds support"
|
bool "RT73 leds support"
|
||||||
depends on RT73USB && BROKEN
|
depends on RT73USB && LEDS_CLASS
|
||||||
select RT2X00_LIB_LEDS
|
select RT2X00_LIB_LEDS
|
||||||
---help---
|
---help---
|
||||||
This adds support for led triggers provided my mac80211.
|
This adds support for led triggers provided my mac80211.
|
||||||
|
|
|
@ -244,27 +244,39 @@ static int rt2400pci_rfkill_poll(struct rt2x00_dev *rt2x00dev)
|
||||||
#endif /* CONFIG_RT2400PCI_RFKILL */
|
#endif /* CONFIG_RT2400PCI_RFKILL */
|
||||||
|
|
||||||
#ifdef CONFIG_RT2400PCI_LEDS
|
#ifdef CONFIG_RT2400PCI_LEDS
|
||||||
static void rt2400pci_led_brightness(struct led_classdev *led_cdev,
|
static void rt2400pci_brightness_set(struct led_classdev *led_cdev,
|
||||||
enum led_brightness brightness)
|
enum led_brightness brightness)
|
||||||
{
|
{
|
||||||
struct rt2x00_led *led =
|
struct rt2x00_led *led =
|
||||||
container_of(led_cdev, struct rt2x00_led, led_dev);
|
container_of(led_cdev, struct rt2x00_led, led_dev);
|
||||||
unsigned int enabled = brightness != LED_OFF;
|
unsigned int enabled = brightness != LED_OFF;
|
||||||
unsigned int activity =
|
|
||||||
led->rt2x00dev->led_flags & LED_SUPPORT_ACTIVITY;
|
|
||||||
u32 reg;
|
u32 reg;
|
||||||
|
|
||||||
rt2x00pci_register_read(led->rt2x00dev, LEDCSR, ®);
|
rt2x00pci_register_read(led->rt2x00dev, LEDCSR, ®);
|
||||||
|
|
||||||
if (led->type == LED_TYPE_RADIO || led->type == LED_TYPE_ASSOC) {
|
if (led->type == LED_TYPE_RADIO || led->type == LED_TYPE_ASSOC)
|
||||||
rt2x00_set_field32(®, LEDCSR_LINK, enabled);
|
rt2x00_set_field32(®, LEDCSR_LINK, enabled);
|
||||||
rt2x00_set_field32(®, LEDCSR_ACTIVITY, enabled && activity);
|
else if (led->type == LED_TYPE_ACTIVITY)
|
||||||
}
|
rt2x00_set_field32(®, LEDCSR_ACTIVITY, enabled);
|
||||||
|
|
||||||
rt2x00pci_register_write(led->rt2x00dev, LEDCSR, reg);
|
rt2x00pci_register_write(led->rt2x00dev, LEDCSR, reg);
|
||||||
}
|
}
|
||||||
#else
|
|
||||||
#define rt2400pci_led_brightness NULL
|
static int rt2400pci_blink_set(struct led_classdev *led_cdev,
|
||||||
|
unsigned long *delay_on,
|
||||||
|
unsigned long *delay_off)
|
||||||
|
{
|
||||||
|
struct rt2x00_led *led =
|
||||||
|
container_of(led_cdev, struct rt2x00_led, led_dev);
|
||||||
|
u32 reg;
|
||||||
|
|
||||||
|
rt2x00pci_register_read(led->rt2x00dev, LEDCSR, ®);
|
||||||
|
rt2x00_set_field32(®, LEDCSR_ON_PERIOD, *delay_on);
|
||||||
|
rt2x00_set_field32(®, LEDCSR_OFF_PERIOD, *delay_off);
|
||||||
|
rt2x00pci_register_write(led->rt2x00dev, LEDCSR, reg);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
#endif /* CONFIG_RT2400PCI_LEDS */
|
#endif /* CONFIG_RT2400PCI_LEDS */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -719,11 +731,6 @@ static int rt2400pci_init_registers(struct rt2x00_dev *rt2x00dev)
|
||||||
(rt2x00dev->rx->data_size / 128));
|
(rt2x00dev->rx->data_size / 128));
|
||||||
rt2x00pci_register_write(rt2x00dev, CSR9, reg);
|
rt2x00pci_register_write(rt2x00dev, CSR9, reg);
|
||||||
|
|
||||||
rt2x00pci_register_read(rt2x00dev, LEDCSR, ®);
|
|
||||||
rt2x00_set_field32(®, LEDCSR_ON_PERIOD, 70);
|
|
||||||
rt2x00_set_field32(®, LEDCSR_OFF_PERIOD, 30);
|
|
||||||
rt2x00pci_register_write(rt2x00dev, LEDCSR, reg);
|
|
||||||
|
|
||||||
rt2x00pci_register_write(rt2x00dev, CNT3, 0x3f080000);
|
rt2x00pci_register_write(rt2x00dev, CNT3, 0x3f080000);
|
||||||
|
|
||||||
rt2x00pci_register_read(rt2x00dev, ARCSR0, ®);
|
rt2x00pci_register_read(rt2x00dev, ARCSR0, ®);
|
||||||
|
@ -1291,19 +1298,22 @@ static int rt2400pci_init_eeprom(struct rt2x00_dev *rt2x00dev)
|
||||||
#ifdef CONFIG_RT2400PCI_LEDS
|
#ifdef CONFIG_RT2400PCI_LEDS
|
||||||
value = rt2x00_get_field16(eeprom, EEPROM_ANTENNA_LED_MODE);
|
value = rt2x00_get_field16(eeprom, EEPROM_ANTENNA_LED_MODE);
|
||||||
|
|
||||||
switch (value) {
|
rt2x00dev->led_radio.rt2x00dev = rt2x00dev;
|
||||||
case LED_MODE_ASUS:
|
rt2x00dev->led_radio.type = LED_TYPE_RADIO;
|
||||||
case LED_MODE_ALPHA:
|
rt2x00dev->led_radio.led_dev.brightness_set =
|
||||||
case LED_MODE_DEFAULT:
|
rt2400pci_brightness_set;
|
||||||
rt2x00dev->led_flags = LED_SUPPORT_RADIO;
|
rt2x00dev->led_radio.led_dev.blink_set =
|
||||||
break;
|
rt2400pci_blink_set;
|
||||||
case LED_MODE_TXRX_ACTIVITY:
|
rt2x00dev->led_radio.flags = LED_INITIALIZED;
|
||||||
rt2x00dev->led_flags =
|
|
||||||
LED_SUPPORT_RADIO | LED_SUPPORT_ACTIVITY;
|
if (value == LED_MODE_TXRX_ACTIVITY) {
|
||||||
break;
|
rt2x00dev->led_qual.rt2x00dev = rt2x00dev;
|
||||||
case LED_MODE_SIGNAL_STRENGTH:
|
rt2x00dev->led_radio.type = LED_TYPE_ACTIVITY;
|
||||||
rt2x00dev->led_flags = LED_SUPPORT_RADIO;
|
rt2x00dev->led_qual.led_dev.brightness_set =
|
||||||
break;
|
rt2400pci_brightness_set;
|
||||||
|
rt2x00dev->led_qual.led_dev.blink_set =
|
||||||
|
rt2400pci_blink_set;
|
||||||
|
rt2x00dev->led_qual.flags = LED_INITIALIZED;
|
||||||
}
|
}
|
||||||
#endif /* CONFIG_RT2400PCI_LEDS */
|
#endif /* CONFIG_RT2400PCI_LEDS */
|
||||||
|
|
||||||
|
@ -1569,7 +1579,6 @@ static const struct rt2x00lib_ops rt2400pci_rt2x00_ops = {
|
||||||
.link_stats = rt2400pci_link_stats,
|
.link_stats = rt2400pci_link_stats,
|
||||||
.reset_tuner = rt2400pci_reset_tuner,
|
.reset_tuner = rt2400pci_reset_tuner,
|
||||||
.link_tuner = rt2400pci_link_tuner,
|
.link_tuner = rt2400pci_link_tuner,
|
||||||
.led_brightness = rt2400pci_led_brightness,
|
|
||||||
.write_tx_desc = rt2400pci_write_tx_desc,
|
.write_tx_desc = rt2400pci_write_tx_desc,
|
||||||
.write_tx_data = rt2x00pci_write_tx_data,
|
.write_tx_data = rt2x00pci_write_tx_data,
|
||||||
.kick_tx_queue = rt2400pci_kick_tx_queue,
|
.kick_tx_queue = rt2400pci_kick_tx_queue,
|
||||||
|
|
|
@ -244,27 +244,39 @@ static int rt2500pci_rfkill_poll(struct rt2x00_dev *rt2x00dev)
|
||||||
#endif /* CONFIG_RT2500PCI_RFKILL */
|
#endif /* CONFIG_RT2500PCI_RFKILL */
|
||||||
|
|
||||||
#ifdef CONFIG_RT2500PCI_LEDS
|
#ifdef CONFIG_RT2500PCI_LEDS
|
||||||
static void rt2500pci_led_brightness(struct led_classdev *led_cdev,
|
static void rt2500pci_brightness_set(struct led_classdev *led_cdev,
|
||||||
enum led_brightness brightness)
|
enum led_brightness brightness)
|
||||||
{
|
{
|
||||||
struct rt2x00_led *led =
|
struct rt2x00_led *led =
|
||||||
container_of(led_cdev, struct rt2x00_led, led_dev);
|
container_of(led_cdev, struct rt2x00_led, led_dev);
|
||||||
unsigned int enabled = brightness != LED_OFF;
|
unsigned int enabled = brightness != LED_OFF;
|
||||||
unsigned int activity =
|
|
||||||
led->rt2x00dev->led_flags & LED_SUPPORT_ACTIVITY;
|
|
||||||
u32 reg;
|
u32 reg;
|
||||||
|
|
||||||
rt2x00pci_register_read(led->rt2x00dev, LEDCSR, ®);
|
rt2x00pci_register_read(led->rt2x00dev, LEDCSR, ®);
|
||||||
|
|
||||||
if (led->type == LED_TYPE_RADIO || led->type == LED_TYPE_ASSOC) {
|
if (led->type == LED_TYPE_RADIO || led->type == LED_TYPE_ASSOC)
|
||||||
rt2x00_set_field32(®, LEDCSR_LINK, enabled);
|
rt2x00_set_field32(®, LEDCSR_LINK, enabled);
|
||||||
rt2x00_set_field32(®, LEDCSR_ACTIVITY, enabled && activity);
|
else if (led->type == LED_TYPE_ACTIVITY)
|
||||||
}
|
rt2x00_set_field32(®, LEDCSR_ACTIVITY, enabled);
|
||||||
|
|
||||||
rt2x00pci_register_write(led->rt2x00dev, LEDCSR, reg);
|
rt2x00pci_register_write(led->rt2x00dev, LEDCSR, reg);
|
||||||
}
|
}
|
||||||
#else
|
|
||||||
#define rt2500pci_led_brightness NULL
|
static int rt2500pci_blink_set(struct led_classdev *led_cdev,
|
||||||
|
unsigned long *delay_on,
|
||||||
|
unsigned long *delay_off)
|
||||||
|
{
|
||||||
|
struct rt2x00_led *led =
|
||||||
|
container_of(led_cdev, struct rt2x00_led, led_dev);
|
||||||
|
u32 reg;
|
||||||
|
|
||||||
|
rt2x00pci_register_read(led->rt2x00dev, LEDCSR, ®);
|
||||||
|
rt2x00_set_field32(®, LEDCSR_ON_PERIOD, *delay_on);
|
||||||
|
rt2x00_set_field32(®, LEDCSR_OFF_PERIOD, *delay_off);
|
||||||
|
rt2x00pci_register_write(led->rt2x00dev, LEDCSR, reg);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
#endif /* CONFIG_RT2500PCI_LEDS */
|
#endif /* CONFIG_RT2500PCI_LEDS */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -812,11 +824,6 @@ static int rt2500pci_init_registers(struct rt2x00_dev *rt2x00dev)
|
||||||
rt2x00_set_field32(®, CSR11_CW_SELECT, 0);
|
rt2x00_set_field32(®, CSR11_CW_SELECT, 0);
|
||||||
rt2x00pci_register_write(rt2x00dev, CSR11, reg);
|
rt2x00pci_register_write(rt2x00dev, CSR11, reg);
|
||||||
|
|
||||||
rt2x00pci_register_read(rt2x00dev, LEDCSR, ®);
|
|
||||||
rt2x00_set_field32(®, LEDCSR_ON_PERIOD, 70);
|
|
||||||
rt2x00_set_field32(®, LEDCSR_OFF_PERIOD, 30);
|
|
||||||
rt2x00pci_register_write(rt2x00dev, LEDCSR, reg);
|
|
||||||
|
|
||||||
rt2x00pci_register_write(rt2x00dev, CNT3, 0);
|
rt2x00pci_register_write(rt2x00dev, CNT3, 0);
|
||||||
|
|
||||||
rt2x00pci_register_read(rt2x00dev, TXCSR8, ®);
|
rt2x00pci_register_read(rt2x00dev, TXCSR8, ®);
|
||||||
|
@ -1468,19 +1475,22 @@ static int rt2500pci_init_eeprom(struct rt2x00_dev *rt2x00dev)
|
||||||
#ifdef CONFIG_RT2500PCI_LEDS
|
#ifdef CONFIG_RT2500PCI_LEDS
|
||||||
value = rt2x00_get_field16(eeprom, EEPROM_ANTENNA_LED_MODE);
|
value = rt2x00_get_field16(eeprom, EEPROM_ANTENNA_LED_MODE);
|
||||||
|
|
||||||
switch (value) {
|
rt2x00dev->led_radio.rt2x00dev = rt2x00dev;
|
||||||
case LED_MODE_ASUS:
|
rt2x00dev->led_radio.type = LED_TYPE_RADIO;
|
||||||
case LED_MODE_ALPHA:
|
rt2x00dev->led_radio.led_dev.brightness_set =
|
||||||
case LED_MODE_DEFAULT:
|
rt2500pci_brightness_set;
|
||||||
rt2x00dev->led_flags = LED_SUPPORT_RADIO;
|
rt2x00dev->led_radio.led_dev.blink_set =
|
||||||
break;
|
rt2500pci_blink_set;
|
||||||
case LED_MODE_TXRX_ACTIVITY:
|
rt2x00dev->led_radio.flags = LED_INITIALIZED;
|
||||||
rt2x00dev->led_flags =
|
|
||||||
LED_SUPPORT_RADIO | LED_SUPPORT_ACTIVITY;
|
if (value == LED_MODE_TXRX_ACTIVITY) {
|
||||||
break;
|
rt2x00dev->led_qual.rt2x00dev = rt2x00dev;
|
||||||
case LED_MODE_SIGNAL_STRENGTH:
|
rt2x00dev->led_radio.type = LED_TYPE_ACTIVITY;
|
||||||
rt2x00dev->led_flags = LED_SUPPORT_RADIO;
|
rt2x00dev->led_qual.led_dev.brightness_set =
|
||||||
break;
|
rt2500pci_brightness_set;
|
||||||
|
rt2x00dev->led_qual.led_dev.blink_set =
|
||||||
|
rt2500pci_blink_set;
|
||||||
|
rt2x00dev->led_qual.flags = LED_INITIALIZED;
|
||||||
}
|
}
|
||||||
#endif /* CONFIG_RT2500PCI_LEDS */
|
#endif /* CONFIG_RT2500PCI_LEDS */
|
||||||
|
|
||||||
|
@ -1882,7 +1892,6 @@ static const struct rt2x00lib_ops rt2500pci_rt2x00_ops = {
|
||||||
.link_stats = rt2500pci_link_stats,
|
.link_stats = rt2500pci_link_stats,
|
||||||
.reset_tuner = rt2500pci_reset_tuner,
|
.reset_tuner = rt2500pci_reset_tuner,
|
||||||
.link_tuner = rt2500pci_link_tuner,
|
.link_tuner = rt2500pci_link_tuner,
|
||||||
.led_brightness = rt2500pci_led_brightness,
|
|
||||||
.write_tx_desc = rt2500pci_write_tx_desc,
|
.write_tx_desc = rt2500pci_write_tx_desc,
|
||||||
.write_tx_data = rt2x00pci_write_tx_data,
|
.write_tx_data = rt2x00pci_write_tx_data,
|
||||||
.kick_tx_queue = rt2500pci_kick_tx_queue,
|
.kick_tx_queue = rt2500pci_kick_tx_queue,
|
||||||
|
|
|
@ -283,34 +283,39 @@ static const struct rt2x00debug rt2500usb_rt2x00debug = {
|
||||||
#endif /* CONFIG_RT2X00_LIB_DEBUGFS */
|
#endif /* CONFIG_RT2X00_LIB_DEBUGFS */
|
||||||
|
|
||||||
#ifdef CONFIG_RT2500USB_LEDS
|
#ifdef CONFIG_RT2500USB_LEDS
|
||||||
static void rt2500usb_led_brightness(struct led_classdev *led_cdev,
|
static void rt2500usb_brightness_set(struct led_classdev *led_cdev,
|
||||||
enum led_brightness brightness)
|
enum led_brightness brightness)
|
||||||
{
|
{
|
||||||
struct rt2x00_led *led =
|
struct rt2x00_led *led =
|
||||||
container_of(led_cdev, struct rt2x00_led, led_dev);
|
container_of(led_cdev, struct rt2x00_led, led_dev);
|
||||||
unsigned int enabled = brightness != LED_OFF;
|
unsigned int enabled = brightness != LED_OFF;
|
||||||
unsigned int activity =
|
u16 reg;
|
||||||
led->rt2x00dev->led_flags & LED_SUPPORT_ACTIVITY;
|
|
||||||
|
|
||||||
if (in_atomic()) {
|
rt2500usb_register_read(led->rt2x00dev, MAC_CSR20, ®);
|
||||||
NOTICE(led->rt2x00dev,
|
|
||||||
"Ignoring LED brightness command for led %d\n",
|
if (led->type == LED_TYPE_RADIO || led->type == LED_TYPE_ASSOC)
|
||||||
led->type);
|
rt2x00_set_field16(®, MAC_CSR20_LINK, enabled);
|
||||||
return;
|
else if (led->type == LED_TYPE_ACTIVITY)
|
||||||
|
rt2x00_set_field16(®, MAC_CSR20_ACTIVITY, enabled);
|
||||||
|
|
||||||
|
rt2500usb_register_write(led->rt2x00dev, MAC_CSR20, reg);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (led->type == LED_TYPE_RADIO || led->type == LED_TYPE_ASSOC) {
|
static int rt2500usb_blink_set(struct led_classdev *led_cdev,
|
||||||
rt2x00_set_field16(&led->rt2x00dev->led_mcu_reg,
|
unsigned long *delay_on,
|
||||||
MAC_CSR20_LINK, enabled);
|
unsigned long *delay_off)
|
||||||
rt2x00_set_field16(&led->rt2x00dev->led_mcu_reg,
|
{
|
||||||
MAC_CSR20_ACTIVITY, enabled && activity);
|
struct rt2x00_led *led =
|
||||||
}
|
container_of(led_cdev, struct rt2x00_led, led_dev);
|
||||||
|
u16 reg;
|
||||||
|
|
||||||
rt2500usb_register_write(led->rt2x00dev, MAC_CSR20,
|
rt2500usb_register_read(led->rt2x00dev, MAC_CSR21, ®);
|
||||||
led->rt2x00dev->led_mcu_reg);
|
rt2x00_set_field16(®, MAC_CSR21_ON_PERIOD, *delay_on);
|
||||||
|
rt2x00_set_field16(®, MAC_CSR21_OFF_PERIOD, *delay_off);
|
||||||
|
rt2500usb_register_write(led->rt2x00dev, MAC_CSR21, reg);
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
#else
|
|
||||||
#define rt2500usb_led_brightness NULL
|
|
||||||
#endif /* CONFIG_RT2500USB_LEDS */
|
#endif /* CONFIG_RT2500USB_LEDS */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -762,11 +767,6 @@ static int rt2500usb_init_registers(struct rt2x00_dev *rt2x00dev)
|
||||||
rt2x00_set_field16(®, MAC_CSR1_HOST_READY, 0);
|
rt2x00_set_field16(®, MAC_CSR1_HOST_READY, 0);
|
||||||
rt2500usb_register_write(rt2x00dev, MAC_CSR1, reg);
|
rt2500usb_register_write(rt2x00dev, MAC_CSR1, reg);
|
||||||
|
|
||||||
rt2500usb_register_read(rt2x00dev, MAC_CSR21, ®);
|
|
||||||
rt2x00_set_field16(®, MAC_CSR21_ON_PERIOD, 70);
|
|
||||||
rt2x00_set_field16(®, MAC_CSR21_OFF_PERIOD, 30);
|
|
||||||
rt2500usb_register_write(rt2x00dev, MAC_CSR21, reg);
|
|
||||||
|
|
||||||
rt2500usb_register_read(rt2x00dev, TXRX_CSR5, ®);
|
rt2500usb_register_read(rt2x00dev, TXRX_CSR5, ®);
|
||||||
rt2x00_set_field16(®, TXRX_CSR5_BBP_ID0, 13);
|
rt2x00_set_field16(®, TXRX_CSR5_BBP_ID0, 13);
|
||||||
rt2x00_set_field16(®, TXRX_CSR5_BBP_ID0_VALID, 1);
|
rt2x00_set_field16(®, TXRX_CSR5_BBP_ID0_VALID, 1);
|
||||||
|
@ -1384,27 +1384,23 @@ static int rt2500usb_init_eeprom(struct rt2x00_dev *rt2x00dev)
|
||||||
#ifdef CONFIG_RT2500USB_LEDS
|
#ifdef CONFIG_RT2500USB_LEDS
|
||||||
value = rt2x00_get_field16(eeprom, EEPROM_ANTENNA_LED_MODE);
|
value = rt2x00_get_field16(eeprom, EEPROM_ANTENNA_LED_MODE);
|
||||||
|
|
||||||
switch (value) {
|
rt2x00dev->led_radio.rt2x00dev = rt2x00dev;
|
||||||
case LED_MODE_ASUS:
|
rt2x00dev->led_radio.type = LED_TYPE_RADIO;
|
||||||
case LED_MODE_ALPHA:
|
rt2x00dev->led_radio.led_dev.brightness_set =
|
||||||
case LED_MODE_DEFAULT:
|
rt2500usb_brightness_set;
|
||||||
rt2x00dev->led_flags = LED_SUPPORT_RADIO;
|
rt2x00dev->led_radio.led_dev.blink_set =
|
||||||
break;
|
rt2500usb_blink_set;
|
||||||
case LED_MODE_TXRX_ACTIVITY:
|
rt2x00dev->led_radio.flags = LED_INITIALIZED;
|
||||||
rt2x00dev->led_flags =
|
|
||||||
LED_SUPPORT_RADIO | LED_SUPPORT_ACTIVITY;
|
|
||||||
break;
|
|
||||||
case LED_MODE_SIGNAL_STRENGTH:
|
|
||||||
rt2x00dev->led_flags = LED_SUPPORT_RADIO;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
if (value == LED_MODE_TXRX_ACTIVITY) {
|
||||||
* Store the current led register value, we need it later
|
rt2x00dev->led_qual.rt2x00dev = rt2x00dev;
|
||||||
* in set_brightness but that is called in irq context which
|
rt2x00dev->led_radio.type = LED_TYPE_ACTIVITY;
|
||||||
* means we can't use rt2500usb_register_read() at that time.
|
rt2x00dev->led_qual.led_dev.brightness_set =
|
||||||
*/
|
rt2500usb_brightness_set;
|
||||||
rt2500usb_register_read(rt2x00dev, MAC_CSR20, &rt2x00dev->led_mcu_reg);
|
rt2x00dev->led_qual.led_dev.blink_set =
|
||||||
|
rt2500usb_blink_set;
|
||||||
|
rt2x00dev->led_qual.flags = LED_INITIALIZED;
|
||||||
|
}
|
||||||
#endif /* CONFIG_RT2500USB_LEDS */
|
#endif /* CONFIG_RT2500USB_LEDS */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -1792,7 +1788,6 @@ static const struct rt2x00lib_ops rt2500usb_rt2x00_ops = {
|
||||||
.link_stats = rt2500usb_link_stats,
|
.link_stats = rt2500usb_link_stats,
|
||||||
.reset_tuner = rt2500usb_reset_tuner,
|
.reset_tuner = rt2500usb_reset_tuner,
|
||||||
.link_tuner = rt2500usb_link_tuner,
|
.link_tuner = rt2500usb_link_tuner,
|
||||||
.led_brightness = rt2500usb_led_brightness,
|
|
||||||
.write_tx_desc = rt2500usb_write_tx_desc,
|
.write_tx_desc = rt2500usb_write_tx_desc,
|
||||||
.write_tx_data = rt2x00usb_write_tx_data,
|
.write_tx_data = rt2x00usb_write_tx_data,
|
||||||
.get_tx_data_len = rt2500usb_get_tx_data_len,
|
.get_tx_data_len = rt2500usb_get_tx_data_len,
|
||||||
|
|
|
@ -385,6 +385,7 @@ struct rt2x00_intf {
|
||||||
unsigned int delayed_flags;
|
unsigned int delayed_flags;
|
||||||
#define DELAYED_UPDATE_BEACON 0x00000001
|
#define DELAYED_UPDATE_BEACON 0x00000001
|
||||||
#define DELAYED_CONFIG_ERP 0x00000002
|
#define DELAYED_CONFIG_ERP 0x00000002
|
||||||
|
#define DELAYED_LED_ASSOC 0x00000004
|
||||||
};
|
};
|
||||||
|
|
||||||
static inline struct rt2x00_intf* vif_to_intf(struct ieee80211_vif *vif)
|
static inline struct rt2x00_intf* vif_to_intf(struct ieee80211_vif *vif)
|
||||||
|
@ -533,8 +534,6 @@ struct rt2x00lib_ops {
|
||||||
struct link_qual *qual);
|
struct link_qual *qual);
|
||||||
void (*reset_tuner) (struct rt2x00_dev *rt2x00dev);
|
void (*reset_tuner) (struct rt2x00_dev *rt2x00dev);
|
||||||
void (*link_tuner) (struct rt2x00_dev *rt2x00dev);
|
void (*link_tuner) (struct rt2x00_dev *rt2x00dev);
|
||||||
void (*led_brightness) (struct led_classdev *led_cdev,
|
|
||||||
enum led_brightness brightness);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* TX control handlers
|
* TX control handlers
|
||||||
|
@ -694,8 +693,6 @@ struct rt2x00_dev {
|
||||||
* by mac8011 or the kernel.
|
* by mac8011 or the kernel.
|
||||||
*/
|
*/
|
||||||
#ifdef CONFIG_RT2X00_LIB_LEDS
|
#ifdef CONFIG_RT2X00_LIB_LEDS
|
||||||
unsigned int led_flags;
|
|
||||||
struct rt2x00_trigger trigger_qual;
|
|
||||||
struct rt2x00_led led_radio;
|
struct rt2x00_led led_radio;
|
||||||
struct rt2x00_led led_assoc;
|
struct rt2x00_led led_assoc;
|
||||||
struct rt2x00_led led_qual;
|
struct rt2x00_led led_qual;
|
||||||
|
|
|
@ -108,11 +108,13 @@ int rt2x00lib_enable_radio(struct rt2x00_dev *rt2x00dev)
|
||||||
/*
|
/*
|
||||||
* Enable radio.
|
* Enable radio.
|
||||||
*/
|
*/
|
||||||
status = rt2x00dev->ops->lib->set_device_state(rt2x00dev,
|
status =
|
||||||
STATE_RADIO_ON);
|
rt2x00dev->ops->lib->set_device_state(rt2x00dev, STATE_RADIO_ON);
|
||||||
if (status)
|
if (status)
|
||||||
return status;
|
return status;
|
||||||
|
|
||||||
|
rt2x00leds_led_radio(rt2x00dev, true);
|
||||||
|
|
||||||
__set_bit(DEVICE_ENABLED_RADIO, &rt2x00dev->flags);
|
__set_bit(DEVICE_ENABLED_RADIO, &rt2x00dev->flags);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -155,6 +157,7 @@ void rt2x00lib_disable_radio(struct rt2x00_dev *rt2x00dev)
|
||||||
* Disable radio.
|
* Disable radio.
|
||||||
*/
|
*/
|
||||||
rt2x00dev->ops->lib->set_device_state(rt2x00dev, STATE_RADIO_OFF);
|
rt2x00dev->ops->lib->set_device_state(rt2x00dev, STATE_RADIO_OFF);
|
||||||
|
rt2x00leds_led_radio(rt2x00dev, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
void rt2x00lib_toggle_rx(struct rt2x00_dev *rt2x00dev, enum dev_state state)
|
void rt2x00lib_toggle_rx(struct rt2x00_dev *rt2x00dev, enum dev_state state)
|
||||||
|
@ -449,6 +452,9 @@ static void rt2x00lib_intf_scheduled_iter(void *data, u8 *mac,
|
||||||
|
|
||||||
if (delayed_flags & DELAYED_CONFIG_ERP)
|
if (delayed_flags & DELAYED_CONFIG_ERP)
|
||||||
rt2x00lib_config_erp(rt2x00dev, intf, &intf->conf);
|
rt2x00lib_config_erp(rt2x00dev, intf, &intf->conf);
|
||||||
|
|
||||||
|
if (delayed_flags & DELAYED_LED_ASSOC)
|
||||||
|
rt2x00leds_led_assoc(rt2x00dev, !!rt2x00dev->intf_associated);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void rt2x00lib_intf_scheduled(struct work_struct *work)
|
static void rt2x00lib_intf_scheduled(struct work_struct *work)
|
||||||
|
|
|
@ -31,7 +31,10 @@
|
||||||
|
|
||||||
void rt2x00leds_led_quality(struct rt2x00_dev *rt2x00dev, int rssi)
|
void rt2x00leds_led_quality(struct rt2x00_dev *rt2x00dev, int rssi)
|
||||||
{
|
{
|
||||||
if (!rt2x00dev->trigger_qual.registered)
|
struct rt2x00_led *led = &rt2x00dev->led_qual;
|
||||||
|
unsigned int brightness;
|
||||||
|
|
||||||
|
if ((led->type != LED_TYPE_QUALITY) || !(led->flags & LED_REGISTERED))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -62,39 +65,51 @@ void rt2x00leds_led_quality(struct rt2x00_dev *rt2x00dev, int rssi)
|
||||||
* is going to calculate the value and might use it in a
|
* is going to calculate the value and might use it in a
|
||||||
* division.
|
* division.
|
||||||
*/
|
*/
|
||||||
led_trigger_event(&rt2x00dev->trigger_qual.trigger,
|
brightness = ((LED_FULL / 6) * rssi) + 1;
|
||||||
((LED_FULL / 6) * rssi) + 1);
|
if (brightness != led->led_dev.brightness) {
|
||||||
|
led->led_dev.brightness_set(&led->led_dev, brightness);
|
||||||
|
led->led_dev.brightness = brightness;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int rt2x00leds_register_trigger(struct rt2x00_dev *rt2x00dev,
|
void rt2x00leds_led_assoc(struct rt2x00_dev *rt2x00dev, bool enabled)
|
||||||
struct rt2x00_trigger *trigger,
|
|
||||||
const char *name)
|
|
||||||
{
|
{
|
||||||
int retval;
|
struct rt2x00_led *led = &rt2x00dev->led_assoc;
|
||||||
|
unsigned int brightness;
|
||||||
|
|
||||||
trigger->trigger.name = name;
|
if ((led->type != LED_TYPE_ASSOC) || !(led->flags & LED_REGISTERED))
|
||||||
retval = led_trigger_register(&trigger->trigger);
|
return;
|
||||||
if (retval) {
|
|
||||||
ERROR(rt2x00dev, "Failed to register led trigger.\n");
|
brightness = enabled ? LED_FULL : LED_OFF;
|
||||||
return retval;
|
if (brightness != led->led_dev.brightness) {
|
||||||
|
led->led_dev.brightness_set(&led->led_dev, brightness);
|
||||||
|
led->led_dev.brightness = brightness;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
trigger->registered = 1;
|
void rt2x00leds_led_radio(struct rt2x00_dev *rt2x00dev, bool enabled)
|
||||||
|
{
|
||||||
|
struct rt2x00_led *led = &rt2x00dev->led_radio;
|
||||||
|
unsigned int brightness;
|
||||||
|
|
||||||
return 0;
|
if ((led->type != LED_TYPE_RADIO) || !(led->flags & LED_REGISTERED))
|
||||||
|
return;
|
||||||
|
|
||||||
|
brightness = enabled ? LED_FULL : LED_OFF;
|
||||||
|
if (brightness != led->led_dev.brightness) {
|
||||||
|
led->led_dev.brightness_set(&led->led_dev, brightness);
|
||||||
|
led->led_dev.brightness = brightness;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int rt2x00leds_register_led(struct rt2x00_dev *rt2x00dev,
|
static int rt2x00leds_register_led(struct rt2x00_dev *rt2x00dev,
|
||||||
struct rt2x00_led *led,
|
struct rt2x00_led *led,
|
||||||
enum led_type type,
|
const char *name)
|
||||||
const char *name, char *trigger)
|
|
||||||
{
|
{
|
||||||
struct device *device = wiphy_dev(rt2x00dev->hw->wiphy);
|
struct device *device = wiphy_dev(rt2x00dev->hw->wiphy);
|
||||||
int retval;
|
int retval;
|
||||||
|
|
||||||
led->led_dev.name = name;
|
led->led_dev.name = name;
|
||||||
led->led_dev.brightness_set = rt2x00dev->ops->lib->led_brightness;
|
|
||||||
led->led_dev.default_trigger = trigger;
|
|
||||||
|
|
||||||
retval = led_classdev_register(device, &led->led_dev);
|
retval = led_classdev_register(device, &led->led_dev);
|
||||||
if (retval) {
|
if (retval) {
|
||||||
|
@ -102,115 +117,103 @@ static int rt2x00leds_register_led(struct rt2x00_dev *rt2x00dev,
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
led->rt2x00dev = rt2x00dev;
|
led->flags |= LED_REGISTERED;
|
||||||
led->type = type;
|
|
||||||
led->registered = 1;
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void rt2x00leds_register(struct rt2x00_dev *rt2x00dev)
|
void rt2x00leds_register(struct rt2x00_dev *rt2x00dev)
|
||||||
{
|
{
|
||||||
char *trigger;
|
|
||||||
char dev_name[16];
|
char dev_name[16];
|
||||||
char name[32];
|
char name[32];
|
||||||
int retval;
|
int retval;
|
||||||
|
unsigned long on_period;
|
||||||
if (!rt2x00dev->ops->lib->led_brightness)
|
unsigned long off_period;
|
||||||
return;
|
|
||||||
|
|
||||||
snprintf(dev_name, sizeof(dev_name), "%s-%s",
|
snprintf(dev_name, sizeof(dev_name), "%s-%s",
|
||||||
rt2x00dev->ops->name, wiphy_name(rt2x00dev->hw->wiphy));
|
rt2x00dev->ops->name, wiphy_name(rt2x00dev->hw->wiphy));
|
||||||
|
|
||||||
if (rt2x00dev->led_flags & LED_SUPPORT_RADIO) {
|
if (rt2x00dev->led_radio.flags & LED_INITIALIZED) {
|
||||||
trigger = ieee80211_get_radio_led_name(rt2x00dev->hw);
|
|
||||||
snprintf(name, sizeof(name), "%s:radio", dev_name);
|
snprintf(name, sizeof(name), "%s:radio", dev_name);
|
||||||
|
|
||||||
retval = rt2x00leds_register_led(rt2x00dev,
|
retval = rt2x00leds_register_led(rt2x00dev,
|
||||||
&rt2x00dev->led_radio,
|
&rt2x00dev->led_radio,
|
||||||
LED_TYPE_RADIO,
|
name);
|
||||||
name, trigger);
|
|
||||||
if (retval)
|
if (retval)
|
||||||
goto exit_fail;
|
goto exit_fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (rt2x00dev->led_flags & LED_SUPPORT_ASSOC) {
|
if (rt2x00dev->led_assoc.flags & LED_INITIALIZED) {
|
||||||
trigger = ieee80211_get_assoc_led_name(rt2x00dev->hw);
|
|
||||||
snprintf(name, sizeof(name), "%s:assoc", dev_name);
|
snprintf(name, sizeof(name), "%s:assoc", dev_name);
|
||||||
|
|
||||||
retval = rt2x00leds_register_led(rt2x00dev,
|
retval = rt2x00leds_register_led(rt2x00dev,
|
||||||
&rt2x00dev->led_assoc,
|
&rt2x00dev->led_assoc,
|
||||||
LED_TYPE_ASSOC,
|
name);
|
||||||
name, trigger);
|
|
||||||
if (retval)
|
if (retval)
|
||||||
goto exit_fail;
|
goto exit_fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (rt2x00dev->led_flags & LED_SUPPORT_QUALITY) {
|
if (rt2x00dev->led_qual.flags & LED_INITIALIZED) {
|
||||||
snprintf(name, sizeof(name), "%s:quality", dev_name);
|
snprintf(name, sizeof(name), "%s:quality", dev_name);
|
||||||
|
|
||||||
retval = rt2x00leds_register_trigger(rt2x00dev,
|
|
||||||
&rt2x00dev->trigger_qual,
|
|
||||||
name);
|
|
||||||
|
|
||||||
retval = rt2x00leds_register_led(rt2x00dev,
|
retval = rt2x00leds_register_led(rt2x00dev,
|
||||||
&rt2x00dev->led_qual,
|
&rt2x00dev->led_qual,
|
||||||
LED_TYPE_QUALITY,
|
name);
|
||||||
name, name);
|
|
||||||
if (retval)
|
if (retval)
|
||||||
goto exit_fail;
|
goto exit_fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Initialize blink time to default value:
|
||||||
|
* On period: 70ms
|
||||||
|
* Off period: 30ms
|
||||||
|
*/
|
||||||
|
if (rt2x00dev->led_radio.led_dev.blink_set) {
|
||||||
|
on_period = 70;
|
||||||
|
off_period = 30;
|
||||||
|
rt2x00dev->led_radio.led_dev.blink_set(
|
||||||
|
&rt2x00dev->led_radio.led_dev, &on_period, &off_period);
|
||||||
|
}
|
||||||
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
exit_fail:
|
exit_fail:
|
||||||
rt2x00leds_unregister(rt2x00dev);
|
rt2x00leds_unregister(rt2x00dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void rt2x00leds_unregister_trigger(struct rt2x00_trigger *trigger)
|
|
||||||
{
|
|
||||||
if (!trigger->registered)
|
|
||||||
return;
|
|
||||||
|
|
||||||
led_trigger_unregister(&trigger->trigger);
|
|
||||||
trigger->registered = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void rt2x00leds_unregister_led(struct rt2x00_led *led)
|
static void rt2x00leds_unregister_led(struct rt2x00_led *led)
|
||||||
{
|
{
|
||||||
if (!led->registered)
|
|
||||||
return;
|
|
||||||
|
|
||||||
led_classdev_unregister(&led->led_dev);
|
led_classdev_unregister(&led->led_dev);
|
||||||
|
|
||||||
led->led_dev.brightness_set(&led->led_dev, LED_OFF);
|
led->led_dev.brightness_set(&led->led_dev, LED_OFF);
|
||||||
led->registered = 0;
|
led->flags &= ~LED_REGISTERED;
|
||||||
}
|
}
|
||||||
|
|
||||||
void rt2x00leds_unregister(struct rt2x00_dev *rt2x00dev)
|
void rt2x00leds_unregister(struct rt2x00_dev *rt2x00dev)
|
||||||
{
|
{
|
||||||
rt2x00leds_unregister_trigger(&rt2x00dev->trigger_qual);
|
if (rt2x00dev->led_qual.flags & LED_REGISTERED)
|
||||||
rt2x00leds_unregister_led(&rt2x00dev->led_qual);
|
rt2x00leds_unregister_led(&rt2x00dev->led_qual);
|
||||||
|
if (rt2x00dev->led_assoc.flags & LED_REGISTERED)
|
||||||
rt2x00leds_unregister_led(&rt2x00dev->led_assoc);
|
rt2x00leds_unregister_led(&rt2x00dev->led_assoc);
|
||||||
|
if (rt2x00dev->led_radio.flags & LED_REGISTERED)
|
||||||
rt2x00leds_unregister_led(&rt2x00dev->led_radio);
|
rt2x00leds_unregister_led(&rt2x00dev->led_radio);
|
||||||
}
|
}
|
||||||
|
|
||||||
void rt2x00leds_suspend(struct rt2x00_dev *rt2x00dev)
|
void rt2x00leds_suspend(struct rt2x00_dev *rt2x00dev)
|
||||||
{
|
{
|
||||||
if (rt2x00dev->led_qual.registered)
|
if (rt2x00dev->led_qual.flags & LED_REGISTERED)
|
||||||
led_classdev_suspend(&rt2x00dev->led_qual.led_dev);
|
led_classdev_suspend(&rt2x00dev->led_qual.led_dev);
|
||||||
if (rt2x00dev->led_assoc.registered)
|
if (rt2x00dev->led_assoc.flags & LED_REGISTERED)
|
||||||
led_classdev_suspend(&rt2x00dev->led_assoc.led_dev);
|
led_classdev_suspend(&rt2x00dev->led_assoc.led_dev);
|
||||||
if (rt2x00dev->led_radio.registered)
|
if (rt2x00dev->led_radio.flags & LED_REGISTERED)
|
||||||
led_classdev_suspend(&rt2x00dev->led_radio.led_dev);
|
led_classdev_suspend(&rt2x00dev->led_radio.led_dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
void rt2x00leds_resume(struct rt2x00_dev *rt2x00dev)
|
void rt2x00leds_resume(struct rt2x00_dev *rt2x00dev)
|
||||||
{
|
{
|
||||||
if (rt2x00dev->led_radio.registered)
|
if (rt2x00dev->led_radio.flags & LED_REGISTERED)
|
||||||
led_classdev_resume(&rt2x00dev->led_radio.led_dev);
|
led_classdev_resume(&rt2x00dev->led_radio.led_dev);
|
||||||
if (rt2x00dev->led_assoc.registered)
|
if (rt2x00dev->led_assoc.flags & LED_REGISTERED)
|
||||||
led_classdev_resume(&rt2x00dev->led_assoc.led_dev);
|
led_classdev_resume(&rt2x00dev->led_assoc.led_dev);
|
||||||
if (rt2x00dev->led_qual.registered)
|
if (rt2x00dev->led_qual.flags & LED_REGISTERED)
|
||||||
led_classdev_resume(&rt2x00dev->led_qual.led_dev);
|
led_classdev_resume(&rt2x00dev->led_qual.led_dev);
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,18 +26,10 @@
|
||||||
#ifndef RT2X00LEDS_H
|
#ifndef RT2X00LEDS_H
|
||||||
#define RT2X00LEDS_H
|
#define RT2X00LEDS_H
|
||||||
|
|
||||||
/*
|
|
||||||
* Flags used by driver to indicate which
|
|
||||||
* which led types are supported.
|
|
||||||
*/
|
|
||||||
#define LED_SUPPORT_RADIO 0x000001
|
|
||||||
#define LED_SUPPORT_ASSOC 0x000002
|
|
||||||
#define LED_SUPPORT_ACTIVITY 0x000004
|
|
||||||
#define LED_SUPPORT_QUALITY 0x000008
|
|
||||||
|
|
||||||
enum led_type {
|
enum led_type {
|
||||||
LED_TYPE_RADIO,
|
LED_TYPE_RADIO,
|
||||||
LED_TYPE_ASSOC,
|
LED_TYPE_ASSOC,
|
||||||
|
LED_TYPE_ACTIVITY,
|
||||||
LED_TYPE_QUALITY,
|
LED_TYPE_QUALITY,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -48,14 +40,9 @@ struct rt2x00_led {
|
||||||
struct led_classdev led_dev;
|
struct led_classdev led_dev;
|
||||||
|
|
||||||
enum led_type type;
|
enum led_type type;
|
||||||
unsigned int registered;
|
unsigned int flags;
|
||||||
};
|
#define LED_INITIALIZED ( 1 << 0 )
|
||||||
|
#define LED_REGISTERED ( 1 << 1 )
|
||||||
struct rt2x00_trigger {
|
|
||||||
struct led_trigger trigger;
|
|
||||||
|
|
||||||
enum led_type type;
|
|
||||||
unsigned int registered;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* CONFIG_RT2X00_LIB_LEDS */
|
#endif /* CONFIG_RT2X00_LIB_LEDS */
|
||||||
|
|
|
@ -185,6 +185,8 @@ static inline void rt2x00rfkill_resume(struct rt2x00_dev *rt2x00dev)
|
||||||
*/
|
*/
|
||||||
#ifdef CONFIG_RT2X00_LIB_LEDS
|
#ifdef CONFIG_RT2X00_LIB_LEDS
|
||||||
void rt2x00leds_led_quality(struct rt2x00_dev *rt2x00dev, int rssi);
|
void rt2x00leds_led_quality(struct rt2x00_dev *rt2x00dev, int rssi);
|
||||||
|
void rt2x00leds_led_assoc(struct rt2x00_dev *rt2x00dev, bool enabled);
|
||||||
|
void rt2x00leds_led_radio(struct rt2x00_dev *rt2x00dev, bool enabled);
|
||||||
void rt2x00leds_register(struct rt2x00_dev *rt2x00dev);
|
void rt2x00leds_register(struct rt2x00_dev *rt2x00dev);
|
||||||
void rt2x00leds_unregister(struct rt2x00_dev *rt2x00dev);
|
void rt2x00leds_unregister(struct rt2x00_dev *rt2x00dev);
|
||||||
void rt2x00leds_suspend(struct rt2x00_dev *rt2x00dev);
|
void rt2x00leds_suspend(struct rt2x00_dev *rt2x00dev);
|
||||||
|
@ -195,6 +197,16 @@ static inline void rt2x00leds_led_quality(struct rt2x00_dev *rt2x00dev,
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline void rt2x00leds_led_assoc(struct rt2x00_dev *rt2x00dev,
|
||||||
|
bool enabled)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void rt2x00leds_led_radio(struct rt2x00_dev *rt2x00dev,
|
||||||
|
bool enabled)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
static inline void rt2x00leds_register(struct rt2x00_dev *rt2x00dev)
|
static inline void rt2x00leds_register(struct rt2x00_dev *rt2x00dev)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
|
@ -485,6 +485,12 @@ void rt2x00mac_bss_info_changed(struct ieee80211_hw *hw,
|
||||||
rt2x00dev->intf_associated++;
|
rt2x00dev->intf_associated++;
|
||||||
else
|
else
|
||||||
rt2x00dev->intf_associated--;
|
rt2x00dev->intf_associated--;
|
||||||
|
|
||||||
|
if (!test_bit(DRIVER_REQUIRE_SCHEDULED, &rt2x00dev->flags))
|
||||||
|
rt2x00leds_led_assoc(rt2x00dev,
|
||||||
|
!!rt2x00dev->intf_associated);
|
||||||
|
else
|
||||||
|
delayed |= DELAYED_LED_ASSOC;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -277,7 +277,7 @@ static int rt61pci_rfkill_poll(struct rt2x00_dev *rt2x00dev)
|
||||||
#endif /* CONFIG_RT61PCI_RFKILL */
|
#endif /* CONFIG_RT61PCI_RFKILL */
|
||||||
|
|
||||||
#ifdef CONFIG_RT61PCI_LEDS
|
#ifdef CONFIG_RT61PCI_LEDS
|
||||||
static void rt61pci_led_brightness(struct led_classdev *led_cdev,
|
static void rt61pci_brightness_set(struct led_classdev *led_cdev,
|
||||||
enum led_brightness brightness)
|
enum led_brightness brightness)
|
||||||
{
|
{
|
||||||
struct rt2x00_led *led =
|
struct rt2x00_led *led =
|
||||||
|
@ -314,8 +314,22 @@ static void rt61pci_led_brightness(struct led_classdev *led_cdev,
|
||||||
brightness / (LED_FULL / 6), 0);
|
brightness / (LED_FULL / 6), 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#else
|
|
||||||
#define rt61pci_led_brightness NULL
|
static int rt61pci_blink_set(struct led_classdev *led_cdev,
|
||||||
|
unsigned long *delay_on,
|
||||||
|
unsigned long *delay_off)
|
||||||
|
{
|
||||||
|
struct rt2x00_led *led =
|
||||||
|
container_of(led_cdev, struct rt2x00_led, led_dev);
|
||||||
|
u32 reg;
|
||||||
|
|
||||||
|
rt2x00pci_register_read(led->rt2x00dev, MAC_CSR14, ®);
|
||||||
|
rt2x00_set_field32(®, MAC_CSR14_ON_PERIOD, *delay_on);
|
||||||
|
rt2x00_set_field32(®, MAC_CSR14_OFF_PERIOD, *delay_off);
|
||||||
|
rt2x00pci_register_write(led->rt2x00dev, MAC_CSR14, reg);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
#endif /* CONFIG_RT61PCI_LEDS */
|
#endif /* CONFIG_RT61PCI_LEDS */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -1202,11 +1216,6 @@ static int rt61pci_init_registers(struct rt2x00_dev *rt2x00dev)
|
||||||
|
|
||||||
rt2x00pci_register_write(rt2x00dev, MAC_CSR13, 0x0000e000);
|
rt2x00pci_register_write(rt2x00dev, MAC_CSR13, 0x0000e000);
|
||||||
|
|
||||||
rt2x00pci_register_read(rt2x00dev, MAC_CSR14, ®);
|
|
||||||
rt2x00_set_field32(®, MAC_CSR14_ON_PERIOD, 70);
|
|
||||||
rt2x00_set_field32(®, MAC_CSR14_OFF_PERIOD, 30);
|
|
||||||
rt2x00pci_register_write(rt2x00dev, MAC_CSR14, reg);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Invalidate all Shared Keys (SEC_CSR0),
|
* Invalidate all Shared Keys (SEC_CSR0),
|
||||||
* and clear the Shared key Cipher algorithms (SEC_CSR1 & SEC_CSR5)
|
* and clear the Shared key Cipher algorithms (SEC_CSR1 & SEC_CSR5)
|
||||||
|
@ -2058,22 +2067,32 @@ static int rt61pci_init_eeprom(struct rt2x00_dev *rt2x00dev)
|
||||||
*/
|
*/
|
||||||
#ifdef CONFIG_RT61PCI_LEDS
|
#ifdef CONFIG_RT61PCI_LEDS
|
||||||
rt2x00_eeprom_read(rt2x00dev, EEPROM_LED, &eeprom);
|
rt2x00_eeprom_read(rt2x00dev, EEPROM_LED, &eeprom);
|
||||||
|
|
||||||
value = rt2x00_get_field16(eeprom, EEPROM_LED_LED_MODE);
|
value = rt2x00_get_field16(eeprom, EEPROM_LED_LED_MODE);
|
||||||
|
|
||||||
switch (value) {
|
rt2x00dev->led_radio.rt2x00dev = rt2x00dev;
|
||||||
case LED_MODE_TXRX_ACTIVITY:
|
rt2x00dev->led_radio.type = LED_TYPE_RADIO;
|
||||||
case LED_MODE_ASUS:
|
rt2x00dev->led_radio.led_dev.brightness_set =
|
||||||
case LED_MODE_ALPHA:
|
rt61pci_brightness_set;
|
||||||
case LED_MODE_DEFAULT:
|
rt2x00dev->led_radio.led_dev.blink_set =
|
||||||
rt2x00dev->led_flags =
|
rt61pci_blink_set;
|
||||||
LED_SUPPORT_RADIO | LED_SUPPORT_ASSOC;
|
rt2x00dev->led_radio.flags = LED_INITIALIZED;
|
||||||
break;
|
|
||||||
case LED_MODE_SIGNAL_STRENGTH:
|
rt2x00dev->led_assoc.rt2x00dev = rt2x00dev;
|
||||||
rt2x00dev->led_flags =
|
rt2x00dev->led_assoc.type = LED_TYPE_ASSOC;
|
||||||
LED_SUPPORT_RADIO | LED_SUPPORT_ASSOC |
|
rt2x00dev->led_assoc.led_dev.brightness_set =
|
||||||
LED_SUPPORT_QUALITY;
|
rt61pci_brightness_set;
|
||||||
break;
|
rt2x00dev->led_assoc.led_dev.blink_set =
|
||||||
|
rt61pci_blink_set;
|
||||||
|
rt2x00dev->led_assoc.flags = LED_INITIALIZED;
|
||||||
|
|
||||||
|
if (value == LED_MODE_SIGNAL_STRENGTH) {
|
||||||
|
rt2x00dev->led_qual.rt2x00dev = rt2x00dev;
|
||||||
|
rt2x00dev->led_radio.type = LED_TYPE_QUALITY;
|
||||||
|
rt2x00dev->led_qual.led_dev.brightness_set =
|
||||||
|
rt61pci_brightness_set;
|
||||||
|
rt2x00dev->led_qual.led_dev.blink_set =
|
||||||
|
rt61pci_blink_set;
|
||||||
|
rt2x00dev->led_qual.flags = LED_INITIALIZED;
|
||||||
}
|
}
|
||||||
|
|
||||||
rt2x00_set_field16(&rt2x00dev->led_mcu_reg, MCU_LEDCS_LED_MODE, value);
|
rt2x00_set_field16(&rt2x00dev->led_mcu_reg, MCU_LEDCS_LED_MODE, value);
|
||||||
|
@ -2447,7 +2466,6 @@ static const struct rt2x00lib_ops rt61pci_rt2x00_ops = {
|
||||||
.link_stats = rt61pci_link_stats,
|
.link_stats = rt61pci_link_stats,
|
||||||
.reset_tuner = rt61pci_reset_tuner,
|
.reset_tuner = rt61pci_reset_tuner,
|
||||||
.link_tuner = rt61pci_link_tuner,
|
.link_tuner = rt61pci_link_tuner,
|
||||||
.led_brightness = rt61pci_led_brightness,
|
|
||||||
.write_tx_desc = rt61pci_write_tx_desc,
|
.write_tx_desc = rt61pci_write_tx_desc,
|
||||||
.write_tx_data = rt2x00pci_write_tx_data,
|
.write_tx_data = rt2x00pci_write_tx_data,
|
||||||
.kick_tx_queue = rt61pci_kick_tx_queue,
|
.kick_tx_queue = rt61pci_kick_tx_queue,
|
||||||
|
|
|
@ -280,7 +280,7 @@ static const struct rt2x00debug rt73usb_rt2x00debug = {
|
||||||
#endif /* CONFIG_RT2X00_LIB_DEBUGFS */
|
#endif /* CONFIG_RT2X00_LIB_DEBUGFS */
|
||||||
|
|
||||||
#ifdef CONFIG_RT73USB_LEDS
|
#ifdef CONFIG_RT73USB_LEDS
|
||||||
static void rt73usb_led_brightness(struct led_classdev *led_cdev,
|
static void rt73usb_brightness_set(struct led_classdev *led_cdev,
|
||||||
enum led_brightness brightness)
|
enum led_brightness brightness)
|
||||||
{
|
{
|
||||||
struct rt2x00_led *led =
|
struct rt2x00_led *led =
|
||||||
|
@ -291,13 +291,6 @@ static void rt73usb_led_brightness(struct led_classdev *led_cdev,
|
||||||
unsigned int bg_mode =
|
unsigned int bg_mode =
|
||||||
(enabled && led->rt2x00dev->curr_band == IEEE80211_BAND_2GHZ);
|
(enabled && led->rt2x00dev->curr_band == IEEE80211_BAND_2GHZ);
|
||||||
|
|
||||||
if (in_atomic()) {
|
|
||||||
NOTICE(led->rt2x00dev,
|
|
||||||
"Ignoring LED brightness command for led %d\n",
|
|
||||||
led->type);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (led->type == LED_TYPE_RADIO) {
|
if (led->type == LED_TYPE_RADIO) {
|
||||||
rt2x00_set_field16(&led->rt2x00dev->led_mcu_reg,
|
rt2x00_set_field16(&led->rt2x00dev->led_mcu_reg,
|
||||||
MCU_LEDCS_RADIO_STATUS, enabled);
|
MCU_LEDCS_RADIO_STATUS, enabled);
|
||||||
|
@ -326,8 +319,22 @@ static void rt73usb_led_brightness(struct led_classdev *led_cdev,
|
||||||
REGISTER_TIMEOUT);
|
REGISTER_TIMEOUT);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#else
|
|
||||||
#define rt73usb_led_brightness NULL
|
static int rt73usb_blink_set(struct led_classdev *led_cdev,
|
||||||
|
unsigned long *delay_on,
|
||||||
|
unsigned long *delay_off)
|
||||||
|
{
|
||||||
|
struct rt2x00_led *led =
|
||||||
|
container_of(led_cdev, struct rt2x00_led, led_dev);
|
||||||
|
u32 reg;
|
||||||
|
|
||||||
|
rt73usb_register_read(led->rt2x00dev, MAC_CSR14, ®);
|
||||||
|
rt2x00_set_field32(®, MAC_CSR14_ON_PERIOD, *delay_on);
|
||||||
|
rt2x00_set_field32(®, MAC_CSR14_OFF_PERIOD, *delay_off);
|
||||||
|
rt73usb_register_write(led->rt2x00dev, MAC_CSR14, reg);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
#endif /* CONFIG_RT73USB_LEDS */
|
#endif /* CONFIG_RT73USB_LEDS */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -1006,11 +1013,6 @@ static int rt73usb_init_registers(struct rt2x00_dev *rt2x00dev)
|
||||||
|
|
||||||
rt73usb_register_write(rt2x00dev, MAC_CSR13, 0x00007f00);
|
rt73usb_register_write(rt2x00dev, MAC_CSR13, 0x00007f00);
|
||||||
|
|
||||||
rt73usb_register_read(rt2x00dev, MAC_CSR14, ®);
|
|
||||||
rt2x00_set_field32(®, MAC_CSR14_ON_PERIOD, 70);
|
|
||||||
rt2x00_set_field32(®, MAC_CSR14_OFF_PERIOD, 30);
|
|
||||||
rt73usb_register_write(rt2x00dev, MAC_CSR14, reg);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Invalidate all Shared Keys (SEC_CSR0),
|
* Invalidate all Shared Keys (SEC_CSR0),
|
||||||
* and clear the Shared key Cipher algorithms (SEC_CSR1 & SEC_CSR5)
|
* and clear the Shared key Cipher algorithms (SEC_CSR1 & SEC_CSR5)
|
||||||
|
@ -1627,19 +1629,30 @@ static int rt73usb_init_eeprom(struct rt2x00_dev *rt2x00dev)
|
||||||
#ifdef CONFIG_RT73USB_LEDS
|
#ifdef CONFIG_RT73USB_LEDS
|
||||||
rt2x00_eeprom_read(rt2x00dev, EEPROM_LED, &eeprom);
|
rt2x00_eeprom_read(rt2x00dev, EEPROM_LED, &eeprom);
|
||||||
|
|
||||||
switch (value) {
|
rt2x00dev->led_radio.rt2x00dev = rt2x00dev;
|
||||||
case LED_MODE_TXRX_ACTIVITY:
|
rt2x00dev->led_radio.type = LED_TYPE_RADIO;
|
||||||
case LED_MODE_ASUS:
|
rt2x00dev->led_radio.led_dev.brightness_set =
|
||||||
case LED_MODE_ALPHA:
|
rt73usb_brightness_set;
|
||||||
case LED_MODE_DEFAULT:
|
rt2x00dev->led_radio.led_dev.blink_set =
|
||||||
rt2x00dev->led_flags =
|
rt73usb_blink_set;
|
||||||
LED_SUPPORT_RADIO | LED_SUPPORT_ASSOC;
|
rt2x00dev->led_radio.flags = LED_INITIALIZED;
|
||||||
break;
|
|
||||||
case LED_MODE_SIGNAL_STRENGTH:
|
rt2x00dev->led_assoc.rt2x00dev = rt2x00dev;
|
||||||
rt2x00dev->led_flags =
|
rt2x00dev->led_assoc.type = LED_TYPE_ASSOC;
|
||||||
LED_SUPPORT_RADIO | LED_SUPPORT_ASSOC |
|
rt2x00dev->led_assoc.led_dev.brightness_set =
|
||||||
LED_SUPPORT_QUALITY;
|
rt73usb_brightness_set;
|
||||||
break;
|
rt2x00dev->led_assoc.led_dev.blink_set =
|
||||||
|
rt73usb_blink_set;
|
||||||
|
rt2x00dev->led_assoc.flags = LED_INITIALIZED;
|
||||||
|
|
||||||
|
if (value == LED_MODE_SIGNAL_STRENGTH) {
|
||||||
|
rt2x00dev->led_qual.rt2x00dev = rt2x00dev;
|
||||||
|
rt2x00dev->led_radio.type = LED_TYPE_QUALITY;
|
||||||
|
rt2x00dev->led_qual.led_dev.brightness_set =
|
||||||
|
rt73usb_brightness_set;
|
||||||
|
rt2x00dev->led_qual.led_dev.blink_set =
|
||||||
|
rt73usb_blink_set;
|
||||||
|
rt2x00dev->led_qual.flags = LED_INITIALIZED;
|
||||||
}
|
}
|
||||||
|
|
||||||
rt2x00_set_field16(&rt2x00dev->led_mcu_reg, MCU_LEDCS_LED_MODE, value);
|
rt2x00_set_field16(&rt2x00dev->led_mcu_reg, MCU_LEDCS_LED_MODE, value);
|
||||||
|
@ -2040,7 +2053,6 @@ static const struct rt2x00lib_ops rt73usb_rt2x00_ops = {
|
||||||
.link_stats = rt73usb_link_stats,
|
.link_stats = rt73usb_link_stats,
|
||||||
.reset_tuner = rt73usb_reset_tuner,
|
.reset_tuner = rt73usb_reset_tuner,
|
||||||
.link_tuner = rt73usb_link_tuner,
|
.link_tuner = rt73usb_link_tuner,
|
||||||
.led_brightness = rt73usb_led_brightness,
|
|
||||||
.write_tx_desc = rt73usb_write_tx_desc,
|
.write_tx_desc = rt73usb_write_tx_desc,
|
||||||
.write_tx_data = rt2x00usb_write_tx_data,
|
.write_tx_data = rt2x00usb_write_tx_data,
|
||||||
.get_tx_data_len = rt73usb_get_tx_data_len,
|
.get_tx_data_len = rt73usb_get_tx_data_len,
|
||||||
|
|
Loading…
Reference in a new issue