1 /******************************************************************************
3 * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved.
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of version 2 of the GNU General Public License as
7 * published by the Free Software Foundation.
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
14 ******************************************************************************/
16 #include <drv_types.h>
17 #include <rtl8723a_led.h>
21 /* Callback function of LED BlinkTimer, */
22 /* it just schedules to corresponding BlinkWorkItem/led_blink_hdl23a */
24 static void BlinkTimerCallback(unsigned long data)
26 struct led_8723a *pLed = (struct led_8723a *)data;
27 struct rtw_adapter *padapter = pLed->padapter;
29 /* DBG_8723A("%s\n", __func__); */
31 if ((padapter->bSurpriseRemoved == true) || (padapter->bDriverStopped == true))
33 /* DBG_8723A("%s bSurpriseRemoved:%d, bDriverStopped:%d\n", __func__, padapter->bSurpriseRemoved, padapter->bDriverStopped); */
36 schedule_work(&pLed->BlinkWorkItem);
41 /* Callback function of LED BlinkWorkItem. */
42 /* We dispatch acture LED blink action according to LedStrategy. */
44 void BlinkWorkItemCallback23a(struct work_struct *work)
46 struct led_8723a *pLed = container_of(work, struct led_8723a, BlinkWorkItem);
48 BlinkHandler23a(pLed);
53 /* Reset status of led_8723a object. */
55 void ResetLedStatus23a(struct led_8723a *pLed)
58 pLed->CurrLedState = RTW_LED_OFF; /* Current LED state. */
59 pLed->bLedOn = false; /* true if LED is ON, false if LED is OFF. */
61 pLed->bLedBlinkInProgress = false; /* true if it is blinking, false o.w.. */
62 pLed->bLedWPSBlinkInProgress = false;
64 pLed->BlinkTimes = 0; /* Number of times to toggle led state for blinking. */
65 pLed->BlinkingLedState = LED_UNKNOWN; /* Next state for blinking, either RTW_LED_ON or RTW_LED_OFF are. */
67 pLed->bLedNoLinkBlinkInProgress = false;
68 pLed->bLedLinkBlinkInProgress = false;
69 pLed->bLedStartToLinkBlinkInProgress = false;
70 pLed->bLedScanBlinkInProgress = false;
75 /* Initialize an led_8723a object. */
78 InitLed871x23a(struct rtw_adapter *padapter, struct led_8723a *pLed, enum led_pin_8723a LedPin)
80 pLed->padapter = padapter;
81 pLed->LedPin = LedPin;
83 ResetLedStatus23a(pLed);
85 setup_timer(&pLed->BlinkTimer, BlinkTimerCallback, (unsigned long)pLed);
87 INIT_WORK(&pLed->BlinkWorkItem, BlinkWorkItemCallback23a);
92 /* DeInitialize an led_8723a object. */
95 DeInitLed871x23a(struct led_8723a *pLed)
97 cancel_work_sync(&pLed->BlinkWorkItem);
98 del_timer_sync(&pLed->BlinkTimer);
99 ResetLedStatus23a(pLed);
103 /* Implementation of LED blinking behavior. */
104 /* It toggle off LED and schedule corresponding timer if necessary. */
106 static void SwLedBlink(struct led_8723a *pLed)
108 struct rtw_adapter *padapter = pLed->padapter;
109 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
110 u8 bStopBlinking = false;
112 /* Change LED according to BlinkingLedState specified. */
113 if (pLed->BlinkingLedState == RTW_LED_ON) {
114 SwLedOn23a(padapter, pLed);
115 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("Blinktimes (%d): turn on\n", pLed->BlinkTimes));
117 SwLedOff23a(padapter, pLed);
118 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("Blinktimes (%d): turn off\n", pLed->BlinkTimes));
121 /* Determine if we shall change LED state again. */
123 switch (pLed->CurrLedState) {
125 case LED_BLINK_NORMAL:
126 if (pLed->BlinkTimes == 0)
127 bStopBlinking = true;
129 case LED_BLINK_StartToBlink:
130 if (check_fwstate(pmlmepriv, _FW_LINKED) &&
131 check_fwstate(pmlmepriv, WIFI_STATION_STATE))
132 bStopBlinking = true;
133 if (check_fwstate(pmlmepriv, _FW_LINKED) &&
134 (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) ||
135 check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE)))
136 bStopBlinking = true;
137 else if (pLed->BlinkTimes == 0)
138 bStopBlinking = true;
141 if (pLed->BlinkTimes == 0)
142 bStopBlinking = true;
145 bStopBlinking = true;
150 if ((check_fwstate(pmlmepriv, _FW_LINKED)) && !pLed->bLedOn)
151 SwLedOn23a(padapter, pLed);
152 else if ((check_fwstate(pmlmepriv, _FW_LINKED)) && pLed->bLedOn)
153 SwLedOff23a(padapter, pLed);
155 pLed->BlinkTimes = 0;
156 pLed->bLedBlinkInProgress = false;
158 /* Assign LED state to toggle. */
159 if (pLed->BlinkingLedState == RTW_LED_ON)
160 pLed->BlinkingLedState = RTW_LED_OFF;
162 pLed->BlinkingLedState = RTW_LED_ON;
164 /* Schedule a timer to toggle LED state. */
165 switch (pLed->CurrLedState) {
166 case LED_BLINK_NORMAL:
167 mod_timer(&pLed->BlinkTimer, jiffies +
168 msecs_to_jiffies(LED_BLINK_NORMAL_INTERVAL));
170 case LED_BLINK_SLOWLY:
171 case LED_BLINK_StartToBlink:
172 mod_timer(&pLed->BlinkTimer, jiffies +
173 msecs_to_jiffies(LED_BLINK_SLOWLY_INTERVAL));
176 mod_timer(&pLed->BlinkTimer, jiffies +
177 msecs_to_jiffies(LED_BLINK_LONG_INTERVAL));
180 mod_timer(&pLed->BlinkTimer, jiffies +
181 msecs_to_jiffies(LED_BLINK_SLOWLY_INTERVAL));
187 static void SwLedBlink1(struct led_8723a *pLed)
189 struct rtw_adapter *padapter = pLed->padapter;
190 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
191 unsigned long delay = 0;
192 u8 bStopBlinking = false;
194 /* Change LED according to BlinkingLedState specified. */
195 if (pLed->BlinkingLedState == RTW_LED_ON) {
196 SwLedOn23a(padapter, pLed);
197 RT_TRACE(_module_rtl8712_led_c_, _drv_info_,
198 ("Blinktimes (%d): turn on\n", pLed->BlinkTimes));
200 SwLedOff23a(padapter, pLed);
201 RT_TRACE(_module_rtl8712_led_c_, _drv_info_,
202 ("Blinktimes (%d): turn off\n", pLed->BlinkTimes));
205 if (padapter->pwrctrlpriv.rf_pwrstate != rf_on) {
206 SwLedOff23a(padapter, pLed);
207 ResetLedStatus23a(pLed);
210 switch (pLed->CurrLedState) {
211 case LED_BLINK_SLOWLY:
213 pLed->BlinkingLedState = RTW_LED_OFF;
215 pLed->BlinkingLedState = RTW_LED_ON;
216 delay = LED_BLINK_NO_LINK_INTERVAL_ALPHA;
218 case LED_BLINK_NORMAL:
220 pLed->BlinkingLedState = RTW_LED_OFF;
222 pLed->BlinkingLedState = RTW_LED_ON;
223 delay = LED_BLINK_LINK_INTERVAL_ALPHA;
227 if (pLed->BlinkTimes == 0)
228 bStopBlinking = true;
230 if (check_fwstate(pmlmepriv, _FW_LINKED)) {
231 pLed->bLedLinkBlinkInProgress = true;
232 pLed->CurrLedState = LED_BLINK_NORMAL;
234 pLed->BlinkingLedState = RTW_LED_OFF;
236 pLed->BlinkingLedState = RTW_LED_ON;
237 delay = LED_BLINK_LINK_INTERVAL_ALPHA;
238 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("CurrLedState %d\n", pLed->CurrLedState));
240 pLed->bLedNoLinkBlinkInProgress = true;
241 pLed->CurrLedState = LED_BLINK_SLOWLY;
243 pLed->BlinkingLedState = RTW_LED_OFF;
245 pLed->BlinkingLedState = RTW_LED_ON;
246 delay = LED_BLINK_NO_LINK_INTERVAL_ALPHA;
247 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("CurrLedState %d\n", pLed->CurrLedState));
249 pLed->bLedScanBlinkInProgress = false;
252 pLed->BlinkingLedState = RTW_LED_OFF;
254 pLed->BlinkingLedState = RTW_LED_ON;
255 delay = LED_BLINK_SCAN_INTERVAL_ALPHA;
260 if (pLed->BlinkTimes == 0)
261 bStopBlinking = true;
263 if (check_fwstate(pmlmepriv, _FW_LINKED)) {
264 pLed->bLedLinkBlinkInProgress = true;
265 pLed->CurrLedState = LED_BLINK_NORMAL;
267 pLed->BlinkingLedState = RTW_LED_OFF;
269 pLed->BlinkingLedState = RTW_LED_ON;
270 delay = LED_BLINK_LINK_INTERVAL_ALPHA;
271 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("CurrLedState %d\n", pLed->CurrLedState));
273 pLed->bLedNoLinkBlinkInProgress = true;
274 pLed->CurrLedState = LED_BLINK_SLOWLY;
276 pLed->BlinkingLedState = RTW_LED_OFF;
278 pLed->BlinkingLedState = RTW_LED_ON;
279 delay = LED_BLINK_NO_LINK_INTERVAL_ALPHA;
280 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("CurrLedState %d\n", pLed->CurrLedState));
282 pLed->BlinkTimes = 0;
283 pLed->bLedBlinkInProgress = false;
286 pLed->BlinkingLedState = RTW_LED_OFF;
288 pLed->BlinkingLedState = RTW_LED_ON;
289 delay = LED_BLINK_FASTER_INTERVAL_ALPHA;
294 pLed->BlinkingLedState = RTW_LED_OFF;
296 pLed->BlinkingLedState = RTW_LED_ON;
297 delay = LED_BLINK_SCAN_INTERVAL_ALPHA;
299 case LED_BLINK_WPS_STOP: /* WPS success */
300 if (pLed->BlinkingLedState == RTW_LED_ON)
301 bStopBlinking = false;
303 bStopBlinking = true;
305 pLed->bLedLinkBlinkInProgress = true;
306 pLed->CurrLedState = LED_BLINK_NORMAL;
308 pLed->BlinkingLedState = RTW_LED_OFF;
310 pLed->BlinkingLedState = RTW_LED_ON;
311 delay = LED_BLINK_LINK_INTERVAL_ALPHA;
312 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("CurrLedState %d\n", pLed->CurrLedState));
314 pLed->bLedWPSBlinkInProgress = false;
316 pLed->BlinkingLedState = RTW_LED_OFF;
317 delay = LED_BLINK_WPS_SUCESS_INTERVAL_ALPHA;
324 mod_timer(&pLed->BlinkTimer, jiffies + msecs_to_jiffies(delay));
327 static void SwLedBlink2(struct led_8723a *pLed)
329 struct rtw_adapter *padapter = pLed->padapter;
330 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
331 u8 bStopBlinking = false;
333 /* Change LED according to BlinkingLedState specified. */
334 if (pLed->BlinkingLedState == RTW_LED_ON) {
335 SwLedOn23a(padapter, pLed);
336 RT_TRACE(_module_rtl8712_led_c_, _drv_info_,
337 ("Blinktimes (%d): turn on\n", pLed->BlinkTimes));
339 SwLedOff23a(padapter, pLed);
340 RT_TRACE(_module_rtl8712_led_c_, _drv_info_,
341 ("Blinktimes (%d): turn off\n", pLed->BlinkTimes));
343 switch (pLed->CurrLedState) {
346 if (pLed->BlinkTimes == 0)
347 bStopBlinking = true;
349 if (padapter->pwrctrlpriv.rf_pwrstate != rf_on) {
350 SwLedOff23a(padapter, pLed);
351 } else if (check_fwstate(pmlmepriv, _FW_LINKED)) {
352 pLed->CurrLedState = RTW_LED_ON;
353 pLed->BlinkingLedState = RTW_LED_ON;
354 SwLedOn23a(padapter, pLed);
355 RT_TRACE(_module_rtl8712_led_c_, _drv_info_,
356 ("stop scan blink CurrLedState %d\n",
357 pLed->CurrLedState));
359 pLed->CurrLedState = RTW_LED_OFF;
360 pLed->BlinkingLedState = RTW_LED_OFF;
361 SwLedOff23a(padapter, pLed);
362 RT_TRACE(_module_rtl8712_led_c_, _drv_info_,
363 ("stop scan blink CurrLedState %d\n",
364 pLed->CurrLedState));
366 pLed->bLedScanBlinkInProgress = false;
368 if (padapter->pwrctrlpriv.rf_pwrstate != rf_on) {
369 SwLedOff23a(padapter, pLed);
372 pLed->BlinkingLedState = RTW_LED_OFF;
374 pLed->BlinkingLedState = RTW_LED_ON;
375 mod_timer(&pLed->BlinkTimer,
376 jiffies + msecs_to_jiffies(LED_BLINK_SCAN_INTERVAL_ALPHA));
382 if (pLed->BlinkTimes == 0)
383 bStopBlinking = true;
385 if (padapter->pwrctrlpriv.rf_pwrstate != rf_on) {
386 SwLedOff23a(padapter, pLed);
387 } else if (check_fwstate(pmlmepriv, _FW_LINKED)) {
388 pLed->CurrLedState = RTW_LED_ON;
389 pLed->BlinkingLedState = RTW_LED_ON;
390 SwLedOn23a(padapter, pLed);
391 RT_TRACE(_module_rtl8712_led_c_, _drv_info_,
392 ("stop CurrLedState %d\n", pLed->CurrLedState));
395 pLed->CurrLedState = RTW_LED_OFF;
396 pLed->BlinkingLedState = RTW_LED_OFF;
397 SwLedOff23a(padapter, pLed);
398 RT_TRACE(_module_rtl8712_led_c_, _drv_info_,
399 ("stop CurrLedState %d\n", pLed->CurrLedState));
401 pLed->bLedBlinkInProgress = false;
403 if (padapter->pwrctrlpriv.rf_pwrstate != rf_on) {
404 SwLedOff23a(padapter, pLed);
407 pLed->BlinkingLedState = RTW_LED_OFF;
409 pLed->BlinkingLedState = RTW_LED_ON;
410 mod_timer(&pLed->BlinkTimer,
411 jiffies + msecs_to_jiffies(LED_BLINK_FASTER_INTERVAL_ALPHA));
420 static void SwLedBlink3(struct led_8723a *pLed)
422 struct rtw_adapter *padapter = pLed->padapter;
423 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
424 u8 bStopBlinking = false;
426 /* Change LED according to BlinkingLedState specified. */
427 if (pLed->BlinkingLedState == RTW_LED_ON) {
428 SwLedOn23a(padapter, pLed);
429 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("Blinktimes (%d): turn on\n", pLed->BlinkTimes));
431 if (pLed->CurrLedState != LED_BLINK_WPS_STOP)
432 SwLedOff23a(padapter, pLed);
433 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("Blinktimes (%d): turn off\n", pLed->BlinkTimes));
436 switch (pLed->CurrLedState) {
439 if (pLed->BlinkTimes == 0) {
440 bStopBlinking = true;
444 if (padapter->pwrctrlpriv.rf_pwrstate != rf_on)
446 SwLedOff23a(padapter, pLed);
448 else if (check_fwstate(pmlmepriv, _FW_LINKED)) {
449 pLed->CurrLedState = RTW_LED_ON;
450 pLed->BlinkingLedState = RTW_LED_ON;
452 SwLedOn23a(padapter, pLed);
454 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("CurrLedState %d\n", pLed->CurrLedState));
456 pLed->CurrLedState = RTW_LED_OFF;
457 pLed->BlinkingLedState = RTW_LED_OFF;
459 SwLedOff23a(padapter, pLed);
461 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("CurrLedState %d\n", pLed->CurrLedState));
463 pLed->bLedScanBlinkInProgress = false;
465 if (padapter->pwrctrlpriv.rf_pwrstate != rf_on)
467 SwLedOff23a(padapter, pLed);
470 pLed->BlinkingLedState = RTW_LED_OFF;
472 pLed->BlinkingLedState = RTW_LED_ON;
473 mod_timer(&pLed->BlinkTimer,
474 jiffies + msecs_to_jiffies(LED_BLINK_SCAN_INTERVAL_ALPHA));
481 if (pLed->BlinkTimes == 0) {
482 bStopBlinking = true;
485 if (padapter->pwrctrlpriv.rf_pwrstate != rf_on)
487 SwLedOff23a(padapter, pLed);
488 } else if (check_fwstate(pmlmepriv,
490 pLed->CurrLedState = RTW_LED_ON;
491 pLed->BlinkingLedState = RTW_LED_ON;
494 SwLedOn23a(padapter, pLed);
496 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("CurrLedState %d\n", pLed->CurrLedState));
498 pLed->CurrLedState = RTW_LED_OFF;
499 pLed->BlinkingLedState = RTW_LED_OFF;
502 SwLedOff23a(padapter, pLed);
504 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("CurrLedState %d\n", pLed->CurrLedState));
506 pLed->bLedBlinkInProgress = false;
508 if (padapter->pwrctrlpriv.rf_pwrstate != rf_on)
510 SwLedOff23a(padapter, pLed);
513 pLed->BlinkingLedState = RTW_LED_OFF;
515 pLed->BlinkingLedState = RTW_LED_ON;
516 mod_timer(&pLed->BlinkTimer,
517 jiffies + msecs_to_jiffies(LED_BLINK_FASTER_INTERVAL_ALPHA));
524 pLed->BlinkingLedState = RTW_LED_OFF;
526 pLed->BlinkingLedState = RTW_LED_ON;
527 mod_timer(&pLed->BlinkTimer, jiffies +
528 msecs_to_jiffies(LED_BLINK_SCAN_INTERVAL_ALPHA));
531 case LED_BLINK_WPS_STOP: /* WPS success */
532 if (pLed->BlinkingLedState == RTW_LED_ON) {
533 pLed->BlinkingLedState = RTW_LED_OFF;
534 mod_timer(&pLed->BlinkTimer, jiffies +
535 msecs_to_jiffies(LED_BLINK_WPS_SUCESS_INTERVAL_ALPHA));
536 bStopBlinking = false;
538 bStopBlinking = true;
542 if (padapter->pwrctrlpriv.rf_pwrstate != rf_on)
544 SwLedOff23a(padapter, pLed);
548 pLed->CurrLedState = RTW_LED_ON;
549 pLed->BlinkingLedState = RTW_LED_ON;
550 SwLedOn23a(padapter, pLed);
551 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("CurrLedState %d\n", pLed->CurrLedState));
553 pLed->bLedWPSBlinkInProgress = false;
562 static void SwLedBlink4(struct led_8723a *pLed)
564 struct rtw_adapter *padapter = pLed->padapter;
565 struct led_priv *ledpriv = &padapter->ledpriv;
566 struct led_8723a *pLed1 = &ledpriv->SwLed1;
567 u8 bStopBlinking = false;
568 unsigned long delay = 0;
570 /* Change LED according to BlinkingLedState specified. */
571 if (pLed->BlinkingLedState == RTW_LED_ON) {
572 SwLedOn23a(padapter, pLed);
573 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("Blinktimes (%d): turn on\n", pLed->BlinkTimes));
575 SwLedOff23a(padapter, pLed);
576 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("Blinktimes (%d): turn off\n", pLed->BlinkTimes));
579 if (!pLed1->bLedWPSBlinkInProgress && pLed1->BlinkingLedState == LED_UNKNOWN)
581 pLed1->BlinkingLedState = RTW_LED_OFF;
582 pLed1->CurrLedState = RTW_LED_OFF;
583 SwLedOff23a(padapter, pLed1);
586 switch (pLed->CurrLedState) {
587 case LED_BLINK_SLOWLY:
589 pLed->BlinkingLedState = RTW_LED_OFF;
591 pLed->BlinkingLedState = RTW_LED_ON;
592 delay = LED_BLINK_NO_LINK_INTERVAL_ALPHA;
595 case LED_BLINK_StartToBlink:
597 pLed->BlinkingLedState = RTW_LED_OFF;
598 delay = LED_BLINK_SLOWLY_INTERVAL;
600 pLed->BlinkingLedState = RTW_LED_ON;
601 delay = LED_BLINK_NORMAL_INTERVAL;
607 if (pLed->BlinkTimes == 0) {
608 bStopBlinking = false;
612 if (padapter->pwrctrlpriv.rf_pwrstate != rf_on && padapter->pwrctrlpriv.rfoff_reason > RF_CHANGE_BY_PS) {
613 SwLedOff23a(padapter, pLed);
615 pLed->bLedNoLinkBlinkInProgress = false;
616 pLed->CurrLedState = LED_BLINK_SLOWLY;
618 pLed->BlinkingLedState = RTW_LED_OFF;
620 pLed->BlinkingLedState = RTW_LED_ON;
621 delay = LED_BLINK_NO_LINK_INTERVAL_ALPHA;
623 pLed->bLedScanBlinkInProgress = false;
625 if (padapter->pwrctrlpriv.rf_pwrstate != rf_on && padapter->pwrctrlpriv.rfoff_reason > RF_CHANGE_BY_PS) {
626 SwLedOff23a(padapter, pLed);
629 pLed->BlinkingLedState = RTW_LED_OFF;
631 pLed->BlinkingLedState = RTW_LED_ON;
632 delay = LED_BLINK_SCAN_INTERVAL_ALPHA;
639 if (pLed->BlinkTimes == 0) {
640 bStopBlinking = true;
643 if (padapter->pwrctrlpriv.rf_pwrstate != rf_on && padapter->pwrctrlpriv.rfoff_reason > RF_CHANGE_BY_PS) {
644 SwLedOff23a(padapter, pLed);
646 pLed->bLedNoLinkBlinkInProgress = true;
647 pLed->CurrLedState = LED_BLINK_SLOWLY;
649 pLed->BlinkingLedState = RTW_LED_OFF;
651 pLed->BlinkingLedState = RTW_LED_ON;
652 delay = LED_BLINK_NO_LINK_INTERVAL_ALPHA;
654 pLed->bLedBlinkInProgress = false;
656 if (padapter->pwrctrlpriv.rf_pwrstate != rf_on && padapter->pwrctrlpriv.rfoff_reason > RF_CHANGE_BY_PS) {
657 SwLedOff23a(padapter, pLed);
660 pLed->BlinkingLedState = RTW_LED_OFF;
662 pLed->BlinkingLedState = RTW_LED_ON;
663 delay = LED_BLINK_FASTER_INTERVAL_ALPHA;
670 pLed->BlinkingLedState = RTW_LED_OFF;
671 delay = LED_BLINK_SLOWLY_INTERVAL;
673 pLed->BlinkingLedState = RTW_LED_ON;
674 delay = LED_BLINK_NORMAL_INTERVAL;
678 case LED_BLINK_WPS_STOP: /* WPS authentication fail */
680 pLed->BlinkingLedState = RTW_LED_OFF;
682 pLed->BlinkingLedState = RTW_LED_ON;
684 delay = LED_BLINK_NORMAL_INTERVAL;
687 case LED_BLINK_WPS_STOP_OVERLAP: /* WPS session overlap */
689 if (pLed->BlinkTimes == 0) {
691 pLed->BlinkTimes = 1;
693 bStopBlinking = true;
698 pLed->BlinkTimes = 10;
699 pLed->BlinkingLedState = RTW_LED_ON;
700 delay = LED_BLINK_LINK_INTERVAL_ALPHA;
703 pLed->BlinkingLedState = RTW_LED_OFF;
705 pLed->BlinkingLedState = RTW_LED_ON;
707 delay = LED_BLINK_NORMAL_INTERVAL;
715 mod_timer(&pLed->BlinkTimer, jiffies + msecs_to_jiffies(delay));
717 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("SwLedBlink4 CurrLedState %d\n", pLed->CurrLedState));
720 static void SwLedBlink5(struct led_8723a *pLed)
722 struct rtw_adapter *padapter = pLed->padapter;
723 u8 bStopBlinking = false;
724 unsigned long delay = 0;
726 /* Change LED according to BlinkingLedState specified. */
727 if (pLed->BlinkingLedState == RTW_LED_ON) {
728 SwLedOn23a(padapter, pLed);
729 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("Blinktimes (%d): turn on\n", pLed->BlinkTimes));
731 SwLedOff23a(padapter, pLed);
732 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("Blinktimes (%d): turn off\n", pLed->BlinkTimes));
735 switch (pLed->CurrLedState) {
738 if (pLed->BlinkTimes == 0) {
739 bStopBlinking = true;
743 if (padapter->pwrctrlpriv.rf_pwrstate != rf_on && padapter->pwrctrlpriv.rfoff_reason > RF_CHANGE_BY_PS) {
744 pLed->CurrLedState = RTW_LED_OFF;
745 pLed->BlinkingLedState = RTW_LED_OFF;
747 SwLedOff23a(padapter, pLed);
749 pLed->CurrLedState = RTW_LED_ON;
750 pLed->BlinkingLedState = RTW_LED_ON;
752 delay = LED_BLINK_FASTER_INTERVAL_ALPHA;
755 pLed->bLedScanBlinkInProgress = false;
757 if (padapter->pwrctrlpriv.rf_pwrstate != rf_on && padapter->pwrctrlpriv.rfoff_reason > RF_CHANGE_BY_PS) {
758 SwLedOff23a(padapter, pLed);
761 pLed->BlinkingLedState = RTW_LED_OFF;
763 pLed->BlinkingLedState = RTW_LED_ON;
764 delay = LED_BLINK_SCAN_INTERVAL_ALPHA;
771 if (pLed->BlinkTimes == 0) {
772 bStopBlinking = true;
776 if (padapter->pwrctrlpriv.rf_pwrstate != rf_on && padapter->pwrctrlpriv.rfoff_reason > RF_CHANGE_BY_PS) {
777 pLed->CurrLedState = RTW_LED_OFF;
778 pLed->BlinkingLedState = RTW_LED_OFF;
780 SwLedOff23a(padapter, pLed);
782 pLed->CurrLedState = RTW_LED_ON;
783 pLed->BlinkingLedState = RTW_LED_ON;
785 delay = LED_BLINK_FASTER_INTERVAL_ALPHA;
788 pLed->bLedBlinkInProgress = false;
790 if (padapter->pwrctrlpriv.rf_pwrstate != rf_on && padapter->pwrctrlpriv.rfoff_reason > RF_CHANGE_BY_PS) {
791 SwLedOff23a(padapter, pLed);
794 pLed->BlinkingLedState = RTW_LED_OFF;
796 pLed->BlinkingLedState = RTW_LED_ON;
797 delay = LED_BLINK_FASTER_INTERVAL_ALPHA;
807 mod_timer(&pLed->BlinkTimer, jiffies + msecs_to_jiffies(delay));
809 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("SwLedBlink5 CurrLedState %d\n", pLed->CurrLedState));
812 static void SwLedBlink6(struct led_8723a *pLed)
814 struct rtw_adapter *padapter = pLed->padapter;
816 /* Change LED according to BlinkingLedState specified. */
817 if (pLed->BlinkingLedState == RTW_LED_ON) {
818 SwLedOn23a(padapter, pLed);
819 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("Blinktimes (%d): turn on\n", pLed->BlinkTimes));
821 SwLedOff23a(padapter, pLed);
822 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("Blinktimes (%d): turn off\n", pLed->BlinkTimes));
824 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("<==== blink6\n"));
827 /* ALPHA, added by chiyoko, 20090106 */
829 SwLedControlMode1(struct rtw_adapter *padapter, enum led_ctl_mode LedAction)
831 struct led_priv *ledpriv = &padapter->ledpriv;
832 struct led_8723a *pLed = &ledpriv->SwLed0;
833 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
838 case LED_CTL_POWER_ON:
839 case LED_CTL_START_TO_LINK:
840 case LED_CTL_NO_LINK:
841 if (pLed->bLedNoLinkBlinkInProgress == false) {
842 if (pLed->CurrLedState == LED_BLINK_SCAN ||
843 IS_LED_WPS_BLINKING(pLed)) {
846 if (pLed->bLedLinkBlinkInProgress == true) {
847 del_timer_sync(&pLed->BlinkTimer);
848 pLed->bLedLinkBlinkInProgress = false;
850 if (pLed->bLedBlinkInProgress == true) {
851 del_timer_sync(&pLed->BlinkTimer);
852 pLed->bLedBlinkInProgress = false;
855 pLed->bLedNoLinkBlinkInProgress = true;
856 pLed->CurrLedState = LED_BLINK_SLOWLY;
858 pLed->BlinkingLedState = RTW_LED_OFF;
860 pLed->BlinkingLedState = RTW_LED_ON;
861 delay = LED_BLINK_NO_LINK_INTERVAL_ALPHA;
866 if (pLed->bLedLinkBlinkInProgress == false) {
867 if (pLed->CurrLedState == LED_BLINK_SCAN ||
868 IS_LED_WPS_BLINKING(pLed)) {
871 if (pLed->bLedNoLinkBlinkInProgress == true) {
872 del_timer_sync(&pLed->BlinkTimer);
873 pLed->bLedNoLinkBlinkInProgress = false;
875 if (pLed->bLedBlinkInProgress == true) {
876 del_timer_sync(&pLed->BlinkTimer);
877 pLed->bLedBlinkInProgress = false;
879 pLed->bLedLinkBlinkInProgress = true;
880 pLed->CurrLedState = LED_BLINK_NORMAL;
882 pLed->BlinkingLedState = RTW_LED_OFF;
884 pLed->BlinkingLedState = RTW_LED_ON;
885 delay = LED_BLINK_LINK_INTERVAL_ALPHA;
889 case LED_CTL_SITE_SURVEY:
890 if (pmlmepriv->LinkDetectInfo.bBusyTraffic &&
891 check_fwstate(pmlmepriv, _FW_LINKED))
893 else if (pLed->bLedScanBlinkInProgress == false) {
894 if (IS_LED_WPS_BLINKING(pLed))
897 if (pLed->bLedNoLinkBlinkInProgress == true) {
898 del_timer_sync(&pLed->BlinkTimer);
899 pLed->bLedNoLinkBlinkInProgress = false;
901 if (pLed->bLedLinkBlinkInProgress == true) {
902 del_timer_sync(&pLed->BlinkTimer);
903 pLed->bLedLinkBlinkInProgress = false;
905 if (pLed->bLedBlinkInProgress == true) {
906 del_timer_sync(&pLed->BlinkTimer);
907 pLed->bLedBlinkInProgress = false;
909 pLed->bLedScanBlinkInProgress = true;
910 pLed->CurrLedState = LED_BLINK_SCAN;
911 pLed->BlinkTimes = 24;
913 pLed->BlinkingLedState = RTW_LED_OFF;
915 pLed->BlinkingLedState = RTW_LED_ON;
916 delay = LED_BLINK_SCAN_INTERVAL_ALPHA;
922 if (pLed->bLedBlinkInProgress == false) {
923 if (pLed->CurrLedState == LED_BLINK_SCAN ||
924 IS_LED_WPS_BLINKING(pLed)) {
927 if (pLed->bLedNoLinkBlinkInProgress == true) {
928 del_timer_sync(&pLed->BlinkTimer);
929 pLed->bLedNoLinkBlinkInProgress = false;
931 if (pLed->bLedLinkBlinkInProgress == true) {
932 del_timer_sync(&pLed->BlinkTimer);
933 pLed->bLedLinkBlinkInProgress = false;
935 pLed->bLedBlinkInProgress = true;
936 pLed->CurrLedState = LED_BLINK_TXRX;
937 pLed->BlinkTimes = 2;
939 pLed->BlinkingLedState = RTW_LED_OFF;
941 pLed->BlinkingLedState = RTW_LED_ON;
942 delay = LED_BLINK_FASTER_INTERVAL_ALPHA;
946 case LED_CTL_START_WPS: /* wait until xinpin finish */
947 case LED_CTL_START_WPS_BOTTON:
948 if (pLed->bLedWPSBlinkInProgress == false) {
949 if (pLed->bLedNoLinkBlinkInProgress == true) {
950 del_timer_sync(&pLed->BlinkTimer);
951 pLed->bLedNoLinkBlinkInProgress = false;
953 if (pLed->bLedLinkBlinkInProgress == true) {
954 del_timer_sync(&pLed->BlinkTimer);
955 pLed->bLedLinkBlinkInProgress = false;
957 if (pLed->bLedBlinkInProgress == true) {
958 del_timer_sync(&pLed->BlinkTimer);
959 pLed->bLedBlinkInProgress = false;
961 if (pLed->bLedScanBlinkInProgress == true) {
962 del_timer_sync(&pLed->BlinkTimer);
963 pLed->bLedScanBlinkInProgress = false;
965 pLed->bLedWPSBlinkInProgress = true;
966 pLed->CurrLedState = LED_BLINK_WPS;
968 pLed->BlinkingLedState = RTW_LED_OFF;
970 pLed->BlinkingLedState = RTW_LED_ON;
971 delay = LED_BLINK_SCAN_INTERVAL_ALPHA;
975 case LED_CTL_STOP_WPS:
976 if (pLed->bLedNoLinkBlinkInProgress == true) {
977 del_timer_sync(&pLed->BlinkTimer);
978 pLed->bLedNoLinkBlinkInProgress = false;
980 if (pLed->bLedLinkBlinkInProgress == true) {
981 del_timer_sync(&pLed->BlinkTimer);
982 pLed->bLedLinkBlinkInProgress = false;
984 if (pLed->bLedBlinkInProgress == true) {
985 del_timer_sync(&pLed->BlinkTimer);
986 pLed->bLedBlinkInProgress = false;
988 if (pLed->bLedScanBlinkInProgress == true) {
989 del_timer_sync(&pLed->BlinkTimer);
990 pLed->bLedScanBlinkInProgress = false;
992 if (pLed->bLedWPSBlinkInProgress) {
993 del_timer_sync(&pLed->BlinkTimer);
995 pLed->bLedWPSBlinkInProgress = true;
998 pLed->CurrLedState = LED_BLINK_WPS_STOP;
1000 pLed->BlinkingLedState = RTW_LED_OFF;
1001 delay = LED_BLINK_WPS_SUCESS_INTERVAL_ALPHA;
1003 pLed->BlinkingLedState = RTW_LED_ON;
1008 case LED_CTL_STOP_WPS_FAIL:
1009 if (pLed->bLedWPSBlinkInProgress) {
1010 del_timer_sync(&pLed->BlinkTimer);
1011 pLed->bLedWPSBlinkInProgress = false;
1014 pLed->bLedNoLinkBlinkInProgress = true;
1015 pLed->CurrLedState = LED_BLINK_SLOWLY;
1017 pLed->BlinkingLedState = RTW_LED_OFF;
1019 pLed->BlinkingLedState = RTW_LED_ON;
1020 delay = LED_BLINK_NO_LINK_INTERVAL_ALPHA;
1023 case LED_CTL_POWER_OFF:
1024 pLed->CurrLedState = RTW_LED_OFF;
1025 pLed->BlinkingLedState = RTW_LED_OFF;
1026 if (pLed->bLedNoLinkBlinkInProgress) {
1027 del_timer_sync(&pLed->BlinkTimer);
1028 pLed->bLedNoLinkBlinkInProgress = false;
1030 if (pLed->bLedLinkBlinkInProgress) {
1031 del_timer_sync(&pLed->BlinkTimer);
1032 pLed->bLedLinkBlinkInProgress = false;
1034 if (pLed->bLedBlinkInProgress) {
1035 del_timer_sync(&pLed->BlinkTimer);
1036 pLed->bLedBlinkInProgress = false;
1038 if (pLed->bLedWPSBlinkInProgress) {
1039 del_timer_sync(&pLed->BlinkTimer);
1040 pLed->bLedWPSBlinkInProgress = false;
1042 if (pLed->bLedScanBlinkInProgress) {
1043 del_timer_sync(&pLed->BlinkTimer);
1044 pLed->bLedScanBlinkInProgress = false;
1047 SwLedOff23a(padapter, pLed);
1056 mod_timer(&pLed->BlinkTimer, jiffies + msecs_to_jiffies(delay));
1058 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("Led %d\n", pLed->CurrLedState));
1061 /* Arcadyan/Sitecom , added by chiyoko, 20090216 */
1063 SwLedControlMode2(struct rtw_adapter *padapter, enum led_ctl_mode LedAction)
1065 struct led_priv *ledpriv = &padapter->ledpriv;
1066 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
1067 struct led_8723a *pLed = &ledpriv->SwLed0;
1070 switch (LedAction) {
1071 case LED_CTL_SITE_SURVEY:
1072 if (pmlmepriv->LinkDetectInfo.bBusyTraffic)
1074 else if (pLed->bLedScanBlinkInProgress == false) {
1075 if (IS_LED_WPS_BLINKING(pLed))
1078 if (pLed->bLedBlinkInProgress == true) {
1079 del_timer_sync(&pLed->BlinkTimer);
1080 pLed->bLedBlinkInProgress = false;
1082 pLed->bLedScanBlinkInProgress = true;
1083 pLed->CurrLedState = LED_BLINK_SCAN;
1084 pLed->BlinkTimes = 24;
1086 pLed->BlinkingLedState = RTW_LED_OFF;
1088 pLed->BlinkingLedState = RTW_LED_ON;
1089 delay = LED_BLINK_SCAN_INTERVAL_ALPHA;
1094 if (pLed->bLedBlinkInProgress == false &&
1095 check_fwstate(pmlmepriv, _FW_LINKED)) {
1096 if (pLed->CurrLedState == LED_BLINK_SCAN ||
1097 IS_LED_WPS_BLINKING(pLed)) {
1101 pLed->bLedBlinkInProgress = true;
1102 pLed->CurrLedState = LED_BLINK_TXRX;
1103 pLed->BlinkTimes = 2;
1105 pLed->BlinkingLedState = RTW_LED_OFF;
1107 pLed->BlinkingLedState = RTW_LED_ON;
1108 delay = LED_BLINK_FASTER_INTERVAL_ALPHA;
1112 pLed->CurrLedState = RTW_LED_ON;
1113 pLed->BlinkingLedState = RTW_LED_ON;
1114 if (pLed->bLedBlinkInProgress) {
1115 del_timer_sync(&pLed->BlinkTimer);
1116 pLed->bLedBlinkInProgress = false;
1118 if (pLed->bLedScanBlinkInProgress) {
1119 del_timer_sync(&pLed->BlinkTimer);
1120 pLed->bLedScanBlinkInProgress = false;
1125 case LED_CTL_START_WPS: /* wait until xinpin finish */
1126 case LED_CTL_START_WPS_BOTTON:
1127 if (pLed->bLedWPSBlinkInProgress == false) {
1128 if (pLed->bLedBlinkInProgress == true) {
1129 del_timer_sync(&pLed->BlinkTimer);
1130 pLed->bLedBlinkInProgress = false;
1132 if (pLed->bLedScanBlinkInProgress == true) {
1133 del_timer_sync(&pLed->BlinkTimer);
1134 pLed->bLedScanBlinkInProgress = false;
1136 pLed->bLedWPSBlinkInProgress = true;
1137 pLed->CurrLedState = RTW_LED_ON;
1138 pLed->BlinkingLedState = RTW_LED_ON;
1142 case LED_CTL_STOP_WPS:
1143 pLed->bLedWPSBlinkInProgress = false;
1144 if (padapter->pwrctrlpriv.rf_pwrstate != rf_on) {
1145 SwLedOff23a(padapter, pLed);
1147 pLed->CurrLedState = RTW_LED_ON;
1148 pLed->BlinkingLedState = RTW_LED_ON;
1150 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("CurrLedState %d\n", pLed->CurrLedState));
1153 case LED_CTL_STOP_WPS_FAIL:
1154 pLed->bLedWPSBlinkInProgress = false;
1155 if (padapter->pwrctrlpriv.rf_pwrstate != rf_on) {
1156 SwLedOff23a(padapter, pLed);
1158 pLed->CurrLedState = RTW_LED_OFF;
1159 pLed->BlinkingLedState = RTW_LED_OFF;
1161 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("CurrLedState %d\n", pLed->CurrLedState));
1164 case LED_CTL_START_TO_LINK:
1165 case LED_CTL_NO_LINK:
1166 if (!IS_LED_BLINKING(pLed)) {
1167 pLed->CurrLedState = RTW_LED_OFF;
1168 pLed->BlinkingLedState = RTW_LED_OFF;
1172 case LED_CTL_POWER_OFF:
1173 pLed->CurrLedState = RTW_LED_OFF;
1174 pLed->BlinkingLedState = RTW_LED_OFF;
1175 if (pLed->bLedBlinkInProgress) {
1176 del_timer_sync(&pLed->BlinkTimer);
1177 pLed->bLedBlinkInProgress = false;
1179 if (pLed->bLedScanBlinkInProgress) {
1180 del_timer_sync(&pLed->BlinkTimer);
1181 pLed->bLedScanBlinkInProgress = false;
1183 if (pLed->bLedWPSBlinkInProgress) {
1184 del_timer_sync(&pLed->BlinkTimer);
1185 pLed->bLedWPSBlinkInProgress = false;
1196 mod_timer(&pLed->BlinkTimer, jiffies + msecs_to_jiffies(delay));
1198 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("CurrLedState %d\n", pLed->CurrLedState));
1201 /* COREGA, added by chiyoko, 20090316 */
1203 SwLedControlMode3(struct rtw_adapter *padapter, enum led_ctl_mode LedAction)
1205 struct led_priv *ledpriv = &padapter->ledpriv;
1206 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
1207 struct led_8723a *pLed = &ledpriv->SwLed0;
1210 switch (LedAction) {
1211 case LED_CTL_SITE_SURVEY:
1212 if (pmlmepriv->LinkDetectInfo.bBusyTraffic)
1214 else if (pLed->bLedScanBlinkInProgress == false) {
1215 if (IS_LED_WPS_BLINKING(pLed))
1218 if (pLed->bLedBlinkInProgress == true) {
1219 del_timer_sync(&pLed->BlinkTimer);
1220 pLed->bLedBlinkInProgress = false;
1222 pLed->bLedScanBlinkInProgress = true;
1223 pLed->CurrLedState = LED_BLINK_SCAN;
1224 pLed->BlinkTimes = 24;
1226 pLed->BlinkingLedState = RTW_LED_OFF;
1228 pLed->BlinkingLedState = RTW_LED_ON;
1229 delay = LED_BLINK_SCAN_INTERVAL_ALPHA;
1235 if (pLed->bLedBlinkInProgress == false &&
1236 check_fwstate(pmlmepriv, _FW_LINKED)) {
1237 if (pLed->CurrLedState == LED_BLINK_SCAN ||
1238 IS_LED_WPS_BLINKING(pLed)) {
1242 pLed->bLedBlinkInProgress = true;
1243 pLed->CurrLedState = LED_BLINK_TXRX;
1244 pLed->BlinkTimes = 2;
1246 pLed->BlinkingLedState = RTW_LED_OFF;
1248 pLed->BlinkingLedState = RTW_LED_ON;
1249 delay = LED_BLINK_FASTER_INTERVAL_ALPHA;
1254 if (IS_LED_WPS_BLINKING(pLed))
1257 pLed->CurrLedState = RTW_LED_ON;
1258 pLed->BlinkingLedState = RTW_LED_ON;
1259 if (pLed->bLedBlinkInProgress) {
1260 del_timer_sync(&pLed->BlinkTimer);
1261 pLed->bLedBlinkInProgress = false;
1263 if (pLed->bLedScanBlinkInProgress) {
1264 del_timer_sync(&pLed->BlinkTimer);
1265 pLed->bLedScanBlinkInProgress = false;
1271 case LED_CTL_START_WPS: /* wait until xinpin finish */
1272 case LED_CTL_START_WPS_BOTTON:
1273 if (pLed->bLedWPSBlinkInProgress == false) {
1274 if (pLed->bLedBlinkInProgress == true) {
1275 del_timer_sync(&pLed->BlinkTimer);
1276 pLed->bLedBlinkInProgress = false;
1278 if (pLed->bLedScanBlinkInProgress == true) {
1279 del_timer_sync(&pLed->BlinkTimer);
1280 pLed->bLedScanBlinkInProgress = false;
1282 pLed->bLedWPSBlinkInProgress = true;
1283 pLed->CurrLedState = LED_BLINK_WPS;
1285 pLed->BlinkingLedState = RTW_LED_OFF;
1287 pLed->BlinkingLedState = RTW_LED_ON;
1288 delay = LED_BLINK_SCAN_INTERVAL_ALPHA;
1292 case LED_CTL_STOP_WPS:
1293 if (pLed->bLedWPSBlinkInProgress) {
1294 del_timer_sync(&pLed->BlinkTimer);
1295 pLed->bLedWPSBlinkInProgress = false;
1297 pLed->bLedWPSBlinkInProgress = true;
1300 pLed->CurrLedState = LED_BLINK_WPS_STOP;
1302 pLed->BlinkingLedState = RTW_LED_OFF;
1303 delay = LED_BLINK_WPS_SUCESS_INTERVAL_ALPHA;
1305 pLed->BlinkingLedState = RTW_LED_ON;
1311 case LED_CTL_STOP_WPS_FAIL:
1312 if (pLed->bLedWPSBlinkInProgress) {
1313 del_timer_sync(&pLed->BlinkTimer);
1314 pLed->bLedWPSBlinkInProgress = false;
1317 pLed->CurrLedState = RTW_LED_OFF;
1318 pLed->BlinkingLedState = RTW_LED_OFF;
1322 case LED_CTL_START_TO_LINK:
1323 case LED_CTL_NO_LINK:
1324 if (!IS_LED_BLINKING(pLed)) {
1325 pLed->CurrLedState = RTW_LED_OFF;
1326 pLed->BlinkingLedState = RTW_LED_OFF;
1331 case LED_CTL_POWER_OFF:
1332 pLed->CurrLedState = RTW_LED_OFF;
1333 pLed->BlinkingLedState = RTW_LED_OFF;
1334 if (pLed->bLedBlinkInProgress) {
1335 del_timer_sync(&pLed->BlinkTimer);
1336 pLed->bLedBlinkInProgress = false;
1338 if (pLed->bLedScanBlinkInProgress) {
1339 del_timer_sync(&pLed->BlinkTimer);
1340 pLed->bLedScanBlinkInProgress = false;
1342 if (pLed->bLedWPSBlinkInProgress) {
1343 del_timer_sync(&pLed->BlinkTimer);
1344 pLed->bLedWPSBlinkInProgress = false;
1356 mod_timer(&pLed->BlinkTimer, jiffies + msecs_to_jiffies(delay));
1358 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("CurrLedState %d\n", pLed->CurrLedState));
1361 /* Edimax-Belkin, added by chiyoko, 20090413 */
1363 SwLedControlMode4(struct rtw_adapter *padapter, enum led_ctl_mode LedAction)
1365 struct led_priv *ledpriv = &padapter->ledpriv;
1366 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
1367 struct led_8723a *pLed = &ledpriv->SwLed0;
1368 struct led_8723a *pLed1 = &ledpriv->SwLed1;
1370 switch (LedAction) {
1371 case LED_CTL_START_TO_LINK:
1372 if (pLed1->bLedWPSBlinkInProgress) {
1373 pLed1->bLedWPSBlinkInProgress = false;
1374 del_timer_sync(&pLed1->BlinkTimer);
1376 pLed1->BlinkingLedState = RTW_LED_OFF;
1377 pLed1->CurrLedState = RTW_LED_OFF;
1380 mod_timer(&pLed->BlinkTimer, jiffies);
1383 if (pLed->bLedStartToLinkBlinkInProgress == false) {
1384 if (pLed->CurrLedState == LED_BLINK_SCAN ||
1385 IS_LED_WPS_BLINKING(pLed)) {
1388 if (pLed->bLedBlinkInProgress == true) {
1389 del_timer_sync(&pLed->BlinkTimer);
1390 pLed->bLedBlinkInProgress = false;
1392 if (pLed->bLedNoLinkBlinkInProgress == true) {
1393 del_timer_sync(&pLed->BlinkTimer);
1394 pLed->bLedNoLinkBlinkInProgress = false;
1397 pLed->bLedStartToLinkBlinkInProgress = true;
1398 pLed->CurrLedState = LED_BLINK_StartToBlink;
1400 pLed->BlinkingLedState = RTW_LED_OFF;
1401 mod_timer(&pLed->BlinkTimer,
1402 jiffies + msecs_to_jiffies(LED_BLINK_SLOWLY_INTERVAL));
1404 pLed->BlinkingLedState = RTW_LED_ON;
1405 mod_timer(&pLed->BlinkTimer,
1406 jiffies + msecs_to_jiffies(LED_BLINK_NORMAL_INTERVAL));
1412 case LED_CTL_NO_LINK:
1414 if (LedAction == LED_CTL_LINK) {
1415 if (pLed1->bLedWPSBlinkInProgress) {
1416 pLed1->bLedWPSBlinkInProgress = false;
1417 del_timer_sync(&pLed1->BlinkTimer);
1419 pLed1->BlinkingLedState = RTW_LED_OFF;
1420 pLed1->CurrLedState = RTW_LED_OFF;
1423 mod_timer(&pLed->BlinkTimer, jiffies);
1427 if (pLed->bLedNoLinkBlinkInProgress == false) {
1428 if (pLed->CurrLedState == LED_BLINK_SCAN ||
1429 IS_LED_WPS_BLINKING(pLed)) {
1432 if (pLed->bLedBlinkInProgress == true) {
1433 del_timer_sync(&pLed->BlinkTimer);
1434 pLed->bLedBlinkInProgress = false;
1437 pLed->bLedNoLinkBlinkInProgress = true;
1438 pLed->CurrLedState = LED_BLINK_SLOWLY;
1440 pLed->BlinkingLedState = RTW_LED_OFF;
1442 pLed->BlinkingLedState = RTW_LED_ON;
1443 mod_timer(&pLed->BlinkTimer, jiffies +
1444 msecs_to_jiffies(LED_BLINK_NO_LINK_INTERVAL_ALPHA));
1448 case LED_CTL_SITE_SURVEY:
1449 if (pmlmepriv->LinkDetectInfo.bBusyTraffic &&
1450 check_fwstate(pmlmepriv, _FW_LINKED))
1452 else if (pLed->bLedScanBlinkInProgress == false) {
1453 if (IS_LED_WPS_BLINKING(pLed))
1456 if (pLed->bLedNoLinkBlinkInProgress == true) {
1457 del_timer_sync(&pLed->BlinkTimer);
1458 pLed->bLedNoLinkBlinkInProgress = false;
1460 if (pLed->bLedBlinkInProgress == true) {
1461 del_timer_sync(&pLed->BlinkTimer);
1462 pLed->bLedBlinkInProgress = false;
1464 pLed->bLedScanBlinkInProgress = true;
1465 pLed->CurrLedState = LED_BLINK_SCAN;
1466 pLed->BlinkTimes = 24;
1468 pLed->BlinkingLedState = RTW_LED_OFF;
1470 pLed->BlinkingLedState = RTW_LED_ON;
1471 mod_timer(&pLed->BlinkTimer, jiffies +
1472 msecs_to_jiffies(LED_BLINK_SCAN_INTERVAL_ALPHA));
1478 if (pLed->bLedBlinkInProgress == false) {
1479 if (pLed->CurrLedState == LED_BLINK_SCAN ||
1480 IS_LED_WPS_BLINKING(pLed)) {
1483 if (pLed->bLedNoLinkBlinkInProgress == true) {
1484 del_timer_sync(&pLed->BlinkTimer);
1485 pLed->bLedNoLinkBlinkInProgress = false;
1487 pLed->bLedBlinkInProgress = true;
1488 pLed->CurrLedState = LED_BLINK_TXRX;
1489 pLed->BlinkTimes = 2;
1491 pLed->BlinkingLedState = RTW_LED_OFF;
1493 pLed->BlinkingLedState = RTW_LED_ON;
1494 mod_timer(&pLed->BlinkTimer, jiffies +
1495 msecs_to_jiffies(LED_BLINK_FASTER_INTERVAL_ALPHA));
1499 case LED_CTL_START_WPS: /* wait until xinpin finish */
1500 case LED_CTL_START_WPS_BOTTON:
1501 if (pLed1->bLedWPSBlinkInProgress) {
1502 pLed1->bLedWPSBlinkInProgress = false;
1503 del_timer_sync(&pLed1->BlinkTimer);
1505 pLed1->BlinkingLedState = RTW_LED_OFF;
1506 pLed1->CurrLedState = RTW_LED_OFF;
1509 mod_timer(&pLed->BlinkTimer, jiffies);
1512 if (pLed->bLedWPSBlinkInProgress == false) {
1513 if (pLed->bLedNoLinkBlinkInProgress == true) {
1514 del_timer_sync(&pLed->BlinkTimer);
1515 pLed->bLedNoLinkBlinkInProgress = false;
1517 if (pLed->bLedBlinkInProgress == true) {
1518 del_timer_sync(&pLed->BlinkTimer);
1519 pLed->bLedBlinkInProgress = false;
1521 if (pLed->bLedScanBlinkInProgress == true) {
1522 del_timer_sync(&pLed->BlinkTimer);
1523 pLed->bLedScanBlinkInProgress = false;
1525 pLed->bLedWPSBlinkInProgress = true;
1526 pLed->CurrLedState = LED_BLINK_WPS;
1528 pLed->BlinkingLedState = RTW_LED_OFF;
1529 mod_timer(&pLed->BlinkTimer, jiffies +
1530 msecs_to_jiffies(LED_BLINK_SLOWLY_INTERVAL));
1532 pLed->BlinkingLedState = RTW_LED_ON;
1533 mod_timer(&pLed->BlinkTimer, jiffies +
1534 msecs_to_jiffies(LED_BLINK_NORMAL_INTERVAL));
1539 case LED_CTL_STOP_WPS: /* WPS connect success */
1540 if (pLed->bLedWPSBlinkInProgress) {
1541 del_timer_sync(&pLed->BlinkTimer);
1542 pLed->bLedWPSBlinkInProgress = false;
1545 pLed->bLedNoLinkBlinkInProgress = true;
1546 pLed->CurrLedState = LED_BLINK_SLOWLY;
1548 pLed->BlinkingLedState = RTW_LED_OFF;
1550 pLed->BlinkingLedState = RTW_LED_ON;
1551 mod_timer(&pLed->BlinkTimer, jiffies +
1552 msecs_to_jiffies(LED_BLINK_NO_LINK_INTERVAL_ALPHA));
1555 case LED_CTL_STOP_WPS_FAIL: /* WPS authentication fail */
1556 if (pLed->bLedWPSBlinkInProgress) {
1557 del_timer_sync(&pLed->BlinkTimer);
1558 pLed->bLedWPSBlinkInProgress = false;
1561 pLed->bLedNoLinkBlinkInProgress = true;
1562 pLed->CurrLedState = LED_BLINK_SLOWLY;
1564 pLed->BlinkingLedState = RTW_LED_OFF;
1566 pLed->BlinkingLedState = RTW_LED_ON;
1567 mod_timer(&pLed->BlinkTimer, jiffies +
1568 msecs_to_jiffies(LED_BLINK_NO_LINK_INTERVAL_ALPHA));
1571 if (pLed1->bLedWPSBlinkInProgress)
1572 del_timer_sync(&pLed1->BlinkTimer);
1574 pLed1->bLedWPSBlinkInProgress = true;
1576 pLed1->CurrLedState = LED_BLINK_WPS_STOP;
1578 pLed1->BlinkingLedState = RTW_LED_OFF;
1580 pLed1->BlinkingLedState = RTW_LED_ON;
1581 mod_timer(&pLed->BlinkTimer, jiffies +
1582 msecs_to_jiffies(LED_BLINK_NORMAL_INTERVAL));
1586 case LED_CTL_STOP_WPS_FAIL_OVERLAP: /* WPS session overlap */
1587 if (pLed->bLedWPSBlinkInProgress) {
1588 del_timer_sync(&pLed->BlinkTimer);
1589 pLed->bLedWPSBlinkInProgress = false;
1592 pLed->bLedNoLinkBlinkInProgress = true;
1593 pLed->CurrLedState = LED_BLINK_SLOWLY;
1595 pLed->BlinkingLedState = RTW_LED_OFF;
1597 pLed->BlinkingLedState = RTW_LED_ON;
1598 mod_timer(&pLed->BlinkTimer, jiffies +
1599 msecs_to_jiffies(LED_BLINK_NO_LINK_INTERVAL_ALPHA));
1602 if (pLed1->bLedWPSBlinkInProgress)
1603 del_timer_sync(&pLed1->BlinkTimer);
1605 pLed1->bLedWPSBlinkInProgress = true;
1607 pLed1->CurrLedState = LED_BLINK_WPS_STOP_OVERLAP;
1608 pLed1->BlinkTimes = 10;
1610 pLed1->BlinkingLedState = RTW_LED_OFF;
1612 pLed1->BlinkingLedState = RTW_LED_ON;
1613 mod_timer(&pLed->BlinkTimer, jiffies +
1614 msecs_to_jiffies(LED_BLINK_NORMAL_INTERVAL));
1618 case LED_CTL_POWER_OFF:
1619 pLed->CurrLedState = RTW_LED_OFF;
1620 pLed->BlinkingLedState = RTW_LED_OFF;
1622 if (pLed->bLedNoLinkBlinkInProgress) {
1623 del_timer_sync(&pLed->BlinkTimer);
1624 pLed->bLedNoLinkBlinkInProgress = false;
1626 if (pLed->bLedLinkBlinkInProgress) {
1627 del_timer_sync(&pLed->BlinkTimer);
1628 pLed->bLedLinkBlinkInProgress = false;
1630 if (pLed->bLedBlinkInProgress) {
1631 del_timer_sync(&pLed->BlinkTimer);
1632 pLed->bLedBlinkInProgress = false;
1634 if (pLed->bLedWPSBlinkInProgress) {
1635 del_timer_sync(&pLed->BlinkTimer);
1636 pLed->bLedWPSBlinkInProgress = false;
1638 if (pLed->bLedScanBlinkInProgress) {
1639 del_timer_sync(&pLed->BlinkTimer);
1640 pLed->bLedScanBlinkInProgress = false;
1642 if (pLed->bLedStartToLinkBlinkInProgress) {
1643 del_timer_sync(&pLed->BlinkTimer);
1644 pLed->bLedStartToLinkBlinkInProgress = false;
1647 if (pLed1->bLedWPSBlinkInProgress) {
1648 del_timer_sync(&pLed1->BlinkTimer);
1649 pLed1->bLedWPSBlinkInProgress = false;
1652 pLed1->BlinkingLedState = LED_UNKNOWN;
1653 SwLedOff23a(padapter, pLed);
1654 SwLedOff23a(padapter, pLed1);
1662 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("Led %d\n", pLed->CurrLedState));
1665 /* Sercomm-Belkin, added by chiyoko, 20090415 */
1667 SwLedControlMode5(struct rtw_adapter *padapter, enum led_ctl_mode LedAction)
1669 struct led_priv *ledpriv = &padapter->ledpriv;
1670 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
1671 struct led_8723a *pLed = &ledpriv->SwLed0;
1673 switch (LedAction) {
1674 case LED_CTL_POWER_ON:
1675 case LED_CTL_NO_LINK:
1676 case LED_CTL_LINK: /* solid blue */
1677 pLed->CurrLedState = RTW_LED_ON;
1678 pLed->BlinkingLedState = RTW_LED_ON;
1680 mod_timer(&pLed->BlinkTimer, jiffies);
1683 case LED_CTL_SITE_SURVEY:
1684 if (pmlmepriv->LinkDetectInfo.bBusyTraffic &&
1685 check_fwstate(pmlmepriv, _FW_LINKED))
1687 else if (pLed->bLedScanBlinkInProgress == false) {
1688 if (pLed->bLedBlinkInProgress == true) {
1689 del_timer_sync(&pLed->BlinkTimer);
1690 pLed->bLedBlinkInProgress = false;
1692 pLed->bLedScanBlinkInProgress = true;
1693 pLed->CurrLedState = LED_BLINK_SCAN;
1694 pLed->BlinkTimes = 24;
1696 pLed->BlinkingLedState = RTW_LED_OFF;
1698 pLed->BlinkingLedState = RTW_LED_ON;
1699 mod_timer(&pLed->BlinkTimer, jiffies +
1700 msecs_to_jiffies(LED_BLINK_SCAN_INTERVAL_ALPHA));
1706 if (pLed->bLedBlinkInProgress == false) {
1707 if (pLed->CurrLedState == LED_BLINK_SCAN) {
1710 pLed->bLedBlinkInProgress = true;
1711 pLed->CurrLedState = LED_BLINK_TXRX;
1712 pLed->BlinkTimes = 2;
1714 pLed->BlinkingLedState = RTW_LED_OFF;
1716 pLed->BlinkingLedState = RTW_LED_ON;
1717 mod_timer(&pLed->BlinkTimer, jiffies +
1718 msecs_to_jiffies(LED_BLINK_FASTER_INTERVAL_ALPHA));
1722 case LED_CTL_POWER_OFF:
1723 pLed->CurrLedState = RTW_LED_OFF;
1724 pLed->BlinkingLedState = RTW_LED_OFF;
1726 if (pLed->bLedBlinkInProgress) {
1727 del_timer_sync(&pLed->BlinkTimer);
1728 pLed->bLedBlinkInProgress = false;
1731 SwLedOff23a(padapter, pLed);
1739 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("Led %d\n", pLed->CurrLedState));
1742 /* WNC-Corega, added by chiyoko, 20090902 */
1743 static void SwLedControlMode6(struct rtw_adapter *padapter,
1744 enum led_ctl_mode LedAction)
1746 struct led_priv *ledpriv = &padapter->ledpriv;
1747 struct led_8723a *pLed0 = &ledpriv->SwLed0;
1749 switch (LedAction) {
1750 case LED_CTL_POWER_ON:
1752 case LED_CTL_NO_LINK:
1753 del_timer_sync(&pLed0->BlinkTimer);
1754 pLed0->CurrLedState = RTW_LED_ON;
1755 pLed0->BlinkingLedState = RTW_LED_ON;
1756 mod_timer(&pLed0->BlinkTimer, jiffies);
1758 case LED_CTL_POWER_OFF:
1759 SwLedOff23a(padapter, pLed0);
1765 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("ledcontrol 6 Led %d\n", pLed0->CurrLedState));
1770 /* Handler function of LED Blinking. */
1771 /* We dispatch acture LED blink action according to LedStrategy. */
1773 void BlinkHandler23a(struct led_8723a *pLed)
1775 struct rtw_adapter *padapter = pLed->padapter;
1776 struct led_priv *ledpriv = &padapter->ledpriv;
1778 /* DBG_8723A("%s (%s:%d)\n", __func__, current->comm, current->pid); */
1780 if ((padapter->bSurpriseRemoved) || (padapter->bDriverStopped))
1783 switch (ledpriv->LedStrategy) {
1811 LedControl871x23a(struct rtw_adapter *padapter, enum led_ctl_mode LedAction) {
1812 struct led_priv *ledpriv = &padapter->ledpriv;
1814 if ((padapter->bSurpriseRemoved == true) ||
1815 (padapter->bDriverStopped == true) ||
1816 (padapter->hw_init_completed == false)) {
1820 if (ledpriv->bRegUseLed == false)
1823 /* if (!priv->up) */
1826 /* if (priv->bInHctTest) */
1829 if ((padapter->pwrctrlpriv.rf_pwrstate != rf_on &&
1830 padapter->pwrctrlpriv.rfoff_reason > RF_CHANGE_BY_PS) &&
1831 (LedAction == LED_CTL_TX || LedAction == LED_CTL_RX ||
1832 LedAction == LED_CTL_SITE_SURVEY ||
1833 LedAction == LED_CTL_LINK ||
1834 LedAction == LED_CTL_NO_LINK ||
1835 LedAction == LED_CTL_POWER_ON)) {
1839 switch (ledpriv->LedStrategy) {
1843 SwLedControlMode1(padapter, LedAction);
1846 SwLedControlMode2(padapter, LedAction);
1849 SwLedControlMode3(padapter, LedAction);
1852 SwLedControlMode4(padapter, LedAction);
1855 SwLedControlMode5(padapter, LedAction);
1858 SwLedControlMode6(padapter, LedAction);
1864 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("LedStrategy:%d, LedAction %d\n", ledpriv->LedStrategy, LedAction));