diff options
author | Ulrich Kunitz <kune@deine-taler.de> | 2006-09-12 21:42:38 -0400 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2006-09-25 16:52:17 -0400 |
commit | 583afd1e4f25c87000c85ad7d03f5299fd4155dc (patch) | |
tree | e5ceeee697091a1b9a654ae3e6411cd4674a47c2 /drivers/net/wireless/zd1211rw/zd_mac.c | |
parent | bc5f06a8aaa29a79c9da2cedb5b9779b8081289c (diff) |
[PATCH] zd1211rw: Add LED support
This patch includes a big cleanup of the existing unused LED code,
and adds support for controlling the LED.
The link LED will blink if the device is not associated. The LED
switches between 2 seconds on and 1 second off. If the device is
associated the LED is switched on.
The link LED also indicates packet TX. I do a little bit more led
resetting than the vendor driver, but the device works now as
expected for single LED and double LED devices.
Signed-off-by: Ulrich Kunitz <kune@deine-taler.de>
Signed-off-by: Daniel Drake <dsd@gentoo.org>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/zd1211rw/zd_mac.c')
-rw-r--r-- | drivers/net/wireless/zd1211rw/zd_mac.c | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/drivers/net/wireless/zd1211rw/zd_mac.c b/drivers/net/wireless/zd1211rw/zd_mac.c index 1989f1c05fbe..2d12837052b0 100644 --- a/drivers/net/wireless/zd1211rw/zd_mac.c +++ b/drivers/net/wireless/zd1211rw/zd_mac.c | |||
@@ -33,6 +33,10 @@ | |||
33 | static void ieee_init(struct ieee80211_device *ieee); | 33 | static void ieee_init(struct ieee80211_device *ieee); |
34 | static void softmac_init(struct ieee80211softmac_device *sm); | 34 | static void softmac_init(struct ieee80211softmac_device *sm); |
35 | 35 | ||
36 | static void housekeeping_init(struct zd_mac *mac); | ||
37 | static void housekeeping_enable(struct zd_mac *mac); | ||
38 | static void housekeeping_disable(struct zd_mac *mac); | ||
39 | |||
36 | int zd_mac_init(struct zd_mac *mac, | 40 | int zd_mac_init(struct zd_mac *mac, |
37 | struct net_device *netdev, | 41 | struct net_device *netdev, |
38 | struct usb_interface *intf) | 42 | struct usb_interface *intf) |
@@ -46,6 +50,7 @@ int zd_mac_init(struct zd_mac *mac, | |||
46 | ieee_init(ieee); | 50 | ieee_init(ieee); |
47 | softmac_init(ieee80211_priv(netdev)); | 51 | softmac_init(ieee80211_priv(netdev)); |
48 | zd_chip_init(&mac->chip, netdev, intf); | 52 | zd_chip_init(&mac->chip, netdev, intf); |
53 | housekeeping_init(mac); | ||
49 | return 0; | 54 | return 0; |
50 | } | 55 | } |
51 | 56 | ||
@@ -178,6 +183,7 @@ int zd_mac_open(struct net_device *netdev) | |||
178 | if (r < 0) | 183 | if (r < 0) |
179 | goto disable_rx; | 184 | goto disable_rx; |
180 | 185 | ||
186 | housekeeping_enable(mac); | ||
181 | ieee80211softmac_start(netdev); | 187 | ieee80211softmac_start(netdev); |
182 | return 0; | 188 | return 0; |
183 | disable_rx: | 189 | disable_rx: |
@@ -204,6 +210,7 @@ int zd_mac_stop(struct net_device *netdev) | |||
204 | */ | 210 | */ |
205 | 211 | ||
206 | zd_chip_disable_rx(chip); | 212 | zd_chip_disable_rx(chip); |
213 | housekeeping_disable(mac); | ||
207 | ieee80211softmac_stop(netdev); | 214 | ieee80211softmac_stop(netdev); |
208 | 215 | ||
209 | zd_chip_disable_hwint(chip); | 216 | zd_chip_disable_hwint(chip); |
@@ -1080,3 +1087,46 @@ void zd_dump_rx_status(const struct rx_status *status) | |||
1080 | } | 1087 | } |
1081 | } | 1088 | } |
1082 | #endif /* DEBUG */ | 1089 | #endif /* DEBUG */ |
1090 | |||
1091 | #define LINK_LED_WORK_DELAY HZ | ||
1092 | |||
1093 | static void link_led_handler(void *p) | ||
1094 | { | ||
1095 | struct zd_mac *mac = p; | ||
1096 | struct zd_chip *chip = &mac->chip; | ||
1097 | struct ieee80211softmac_device *sm = ieee80211_priv(mac->netdev); | ||
1098 | int is_associated; | ||
1099 | int r; | ||
1100 | |||
1101 | spin_lock_irq(&mac->lock); | ||
1102 | is_associated = sm->associated != 0; | ||
1103 | spin_unlock_irq(&mac->lock); | ||
1104 | |||
1105 | r = zd_chip_control_leds(chip, | ||
1106 | is_associated ? LED_ASSOCIATED : LED_SCANNING); | ||
1107 | if (r) | ||
1108 | dev_err(zd_mac_dev(mac), "zd_chip_control_leds error %d\n", r); | ||
1109 | |||
1110 | queue_delayed_work(zd_workqueue, &mac->housekeeping.link_led_work, | ||
1111 | LINK_LED_WORK_DELAY); | ||
1112 | } | ||
1113 | |||
1114 | static void housekeeping_init(struct zd_mac *mac) | ||
1115 | { | ||
1116 | INIT_WORK(&mac->housekeeping.link_led_work, link_led_handler, mac); | ||
1117 | } | ||
1118 | |||
1119 | static void housekeeping_enable(struct zd_mac *mac) | ||
1120 | { | ||
1121 | dev_dbg_f(zd_mac_dev(mac), "\n"); | ||
1122 | queue_delayed_work(zd_workqueue, &mac->housekeeping.link_led_work, | ||
1123 | 0); | ||
1124 | } | ||
1125 | |||
1126 | static void housekeeping_disable(struct zd_mac *mac) | ||
1127 | { | ||
1128 | dev_dbg_f(zd_mac_dev(mac), "\n"); | ||
1129 | cancel_rearming_delayed_workqueue(zd_workqueue, | ||
1130 | &mac->housekeeping.link_led_work); | ||
1131 | zd_chip_control_leds(&mac->chip, LED_OFF); | ||
1132 | } | ||