diff options
Diffstat (limited to 'drivers/net/wireless/ath/ar9170/led.c')
-rw-r--r-- | drivers/net/wireless/ath/ar9170/led.c | 17 |
1 files changed, 12 insertions, 5 deletions
diff --git a/drivers/net/wireless/ath/ar9170/led.c b/drivers/net/wireless/ath/ar9170/led.c index 341cead7f606..63fda6cd2101 100644 --- a/drivers/net/wireless/ath/ar9170/led.c +++ b/drivers/net/wireless/ath/ar9170/led.c | |||
@@ -74,7 +74,7 @@ static void ar9170_update_leds(struct work_struct *work) | |||
74 | 74 | ||
75 | mutex_lock(&ar->mutex); | 75 | mutex_lock(&ar->mutex); |
76 | for (i = 0; i < AR9170_NUM_LEDS; i++) | 76 | for (i = 0; i < AR9170_NUM_LEDS; i++) |
77 | if (ar->leds[i].toggled) { | 77 | if (ar->leds[i].registered && ar->leds[i].toggled) { |
78 | led_val |= 1 << i; | 78 | led_val |= 1 << i; |
79 | 79 | ||
80 | tmp = 70 + 200 / (ar->leds[i].toggled); | 80 | tmp = 70 + 200 / (ar->leds[i].toggled); |
@@ -101,9 +101,15 @@ static void ar9170_led_brightness_set(struct led_classdev *led, | |||
101 | struct ar9170_led *arl = container_of(led, struct ar9170_led, l); | 101 | struct ar9170_led *arl = container_of(led, struct ar9170_led, l); |
102 | struct ar9170 *ar = arl->ar; | 102 | struct ar9170 *ar = arl->ar; |
103 | 103 | ||
104 | arl->toggled++; | 104 | if (unlikely(!arl->registered)) |
105 | return ; | ||
106 | |||
107 | if (arl->last_state != !!brightness) { | ||
108 | arl->toggled++; | ||
109 | arl->last_state = !!brightness; | ||
110 | } | ||
105 | 111 | ||
106 | if (likely(IS_ACCEPTING_CMD(ar) && brightness)) | 112 | if (likely(IS_ACCEPTING_CMD(ar) && arl->toggled)) |
107 | queue_delayed_work(ar->hw->workqueue, &ar->led_work, HZ/10); | 113 | queue_delayed_work(ar->hw->workqueue, &ar->led_work, HZ/10); |
108 | } | 114 | } |
109 | 115 | ||
@@ -136,13 +142,14 @@ void ar9170_unregister_leds(struct ar9170 *ar) | |||
136 | { | 142 | { |
137 | int i; | 143 | int i; |
138 | 144 | ||
139 | cancel_delayed_work_sync(&ar->led_work); | ||
140 | |||
141 | for (i = 0; i < AR9170_NUM_LEDS; i++) | 145 | for (i = 0; i < AR9170_NUM_LEDS; i++) |
142 | if (ar->leds[i].registered) { | 146 | if (ar->leds[i].registered) { |
143 | led_classdev_unregister(&ar->leds[i].l); | 147 | led_classdev_unregister(&ar->leds[i].l); |
144 | ar->leds[i].registered = false; | 148 | ar->leds[i].registered = false; |
149 | ar->leds[i].toggled = 0; | ||
145 | } | 150 | } |
151 | |||
152 | cancel_delayed_work_sync(&ar->led_work); | ||
146 | } | 153 | } |
147 | 154 | ||
148 | int ar9170_register_leds(struct ar9170 *ar) | 155 | int ar9170_register_leds(struct ar9170 *ar) |