1 // SPDX-License-Identifier: GPL-2.0
2 /* Copyright(c) 2007 - 2012 Realtek Corporation. */
9 /* Callback function of LED BlinkTimer, */
10 /* it just schedules to corresponding BlinkWorkItem/led_blink_hdl */
12 void BlinkTimerCallback(struct timer_list *t)
14 struct LED_871x *pLed = from_timer(pLed, t, BlinkTimer);
15 struct adapter *padapter = pLed->padapter;
17 if ((padapter->bSurpriseRemoved) || (padapter->bDriverStopped))
20 _set_workitem(&(pLed->BlinkWorkItem));
25 /* Callback function of LED BlinkWorkItem. */
26 /* We dispatch acture LED blink action according to LedStrategy. */
28 void BlinkWorkItemCallback(struct work_struct *work)
30 struct LED_871x *pLed = container_of(work, struct LED_871x, BlinkWorkItem);
36 /* Reset status of LED_871x object. */
38 void ResetLedStatus(struct LED_871x *pLed)
40 pLed->CurrLedState = RTW_LED_OFF; /* Current LED state. */
41 pLed->bLedOn = false; /* true if LED is ON, false if LED is OFF. */
43 pLed->bLedBlinkInProgress = false; /* true if it is blinking, false o.w.. */
44 pLed->bLedWPSBlinkInProgress = false;
46 pLed->BlinkTimes = 0; /* Number of times to toggle led state for blinking. */
47 pLed->BlinkingLedState = LED_UNKNOWN; /* Next state for blinking, either RTW_LED_ON or RTW_LED_OFF are. */
49 pLed->bLedNoLinkBlinkInProgress = false;
50 pLed->bLedLinkBlinkInProgress = false;
51 pLed->bLedStartToLinkBlinkInProgress = false;
52 pLed->bLedScanBlinkInProgress = false;
56 /* Initialize an LED_871x object. */
57 void InitLed871x(struct adapter *padapter, struct LED_871x *pLed, enum LED_PIN_871x LedPin)
59 pLed->padapter = padapter;
60 pLed->LedPin = LedPin;
64 timer_setup(&pLed->BlinkTimer, BlinkTimerCallback, 0);
65 _init_workitem(&(pLed->BlinkWorkItem), BlinkWorkItemCallback, pLed);
70 /* DeInitialize an LED_871x object. */
72 void DeInitLed871x(struct LED_871x *pLed)
74 _cancel_workitem_sync(&(pLed->BlinkWorkItem));
75 _cancel_timer_ex(&(pLed->BlinkTimer));
81 /* Implementation of LED blinking behavior. */
82 /* It toggle off LED and schedule corresponding timer if necessary. */
85 static void SwLedBlink(struct LED_871x *pLed)
87 struct adapter *padapter = pLed->padapter;
88 struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
89 u8 bStopBlinking = false;
91 /* Change LED according to BlinkingLedState specified. */
92 if (pLed->BlinkingLedState == RTW_LED_ON) {
93 SwLedOn(padapter, pLed);
94 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("Blinktimes (%d): turn on\n", pLed->BlinkTimes));
96 SwLedOff(padapter, pLed);
97 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("Blinktimes (%d): turn off\n", pLed->BlinkTimes));
100 /* Determine if we shall change LED state again. */
102 switch (pLed->CurrLedState) {
103 case LED_BLINK_NORMAL:
104 if (pLed->BlinkTimes == 0)
105 bStopBlinking = true;
107 case LED_BLINK_StartToBlink:
108 if (check_fwstate(pmlmepriv, _FW_LINKED) && check_fwstate(pmlmepriv, WIFI_STATION_STATE))
109 bStopBlinking = true;
110 if (check_fwstate(pmlmepriv, _FW_LINKED) &&
111 (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) ||
112 check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE)))
113 bStopBlinking = true;
114 else if (pLed->BlinkTimes == 0)
115 bStopBlinking = true;
118 if (pLed->BlinkTimes == 0)
119 bStopBlinking = true;
122 bStopBlinking = true;
127 /* if (padapter->pwrctrlpriv.cpwm >= PS_STATE_S2) */
129 SwLedOff(padapter, pLed);
130 } else if ((check_fwstate(pmlmepriv, _FW_LINKED)) && (!pLed->bLedOn)) {
131 SwLedOn(padapter, pLed);
132 } else if ((check_fwstate(pmlmepriv, _FW_LINKED)) && pLed->bLedOn) {
133 SwLedOff(padapter, pLed);
135 pLed->BlinkTimes = 0;
136 pLed->bLedBlinkInProgress = false;
138 /* Assign LED state to toggle. */
139 if (pLed->BlinkingLedState == RTW_LED_ON)
140 pLed->BlinkingLedState = RTW_LED_OFF;
142 pLed->BlinkingLedState = RTW_LED_ON;
144 /* Schedule a timer to toggle LED state. */
145 switch (pLed->CurrLedState) {
146 case LED_BLINK_NORMAL:
147 _set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL);
149 case LED_BLINK_SLOWLY:
150 case LED_BLINK_StartToBlink:
151 _set_timer(&(pLed->BlinkTimer), LED_BLINK_SLOWLY_INTERVAL);
154 if (pLed->BlinkingLedState == RTW_LED_ON)
155 _set_timer(&(pLed->BlinkTimer), LED_BLINK_LONG_INTERVAL);
157 _set_timer(&(pLed->BlinkTimer), LED_BLINK_LONG_INTERVAL);
160 _set_timer(&(pLed->BlinkTimer), LED_BLINK_SLOWLY_INTERVAL);
166 static void SwLedBlink1(struct LED_871x *pLed)
168 struct adapter *padapter = pLed->padapter;
169 struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
170 u8 bStopBlinking = false;
172 /* Change LED according to BlinkingLedState specified. */
173 if (pLed->BlinkingLedState == RTW_LED_ON) {
174 SwLedOn(padapter, pLed);
175 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("Blinktimes (%d): turn on\n", pLed->BlinkTimes));
177 SwLedOff(padapter, pLed);
178 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("Blinktimes (%d): turn off\n", pLed->BlinkTimes));
181 if (padapter->pwrctrlpriv.rf_pwrstate != rf_on) {
182 SwLedOff(padapter, pLed);
183 ResetLedStatus(pLed);
187 switch (pLed->CurrLedState) {
188 case LED_BLINK_SLOWLY:
190 pLed->BlinkingLedState = RTW_LED_OFF;
192 pLed->BlinkingLedState = RTW_LED_ON;
193 _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA);
195 case LED_BLINK_NORMAL:
197 pLed->BlinkingLedState = RTW_LED_OFF;
199 pLed->BlinkingLedState = RTW_LED_ON;
200 _set_timer(&(pLed->BlinkTimer), LED_BLINK_LINK_INTERVAL_ALPHA);
204 if (pLed->BlinkTimes == 0)
205 bStopBlinking = true;
207 if (check_fwstate(pmlmepriv, _FW_LINKED)) {
208 pLed->bLedLinkBlinkInProgress = true;
209 pLed->CurrLedState = LED_BLINK_NORMAL;
211 pLed->BlinkingLedState = RTW_LED_OFF;
213 pLed->BlinkingLedState = RTW_LED_ON;
214 _set_timer(&(pLed->BlinkTimer), LED_BLINK_LINK_INTERVAL_ALPHA);
215 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("CurrLedState %d\n", pLed->CurrLedState));
216 } else if (!check_fwstate(pmlmepriv, _FW_LINKED)) {
217 pLed->bLedNoLinkBlinkInProgress = true;
218 pLed->CurrLedState = LED_BLINK_SLOWLY;
220 pLed->BlinkingLedState = RTW_LED_OFF;
222 pLed->BlinkingLedState = RTW_LED_ON;
223 _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA);
224 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("CurrLedState %d\n", pLed->CurrLedState));
226 pLed->bLedScanBlinkInProgress = false;
229 pLed->BlinkingLedState = RTW_LED_OFF;
231 pLed->BlinkingLedState = RTW_LED_ON;
232 _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA);
237 if (pLed->BlinkTimes == 0)
238 bStopBlinking = true;
240 if (check_fwstate(pmlmepriv, _FW_LINKED)) {
241 pLed->bLedLinkBlinkInProgress = true;
242 pLed->CurrLedState = LED_BLINK_NORMAL;
244 pLed->BlinkingLedState = RTW_LED_OFF;
246 pLed->BlinkingLedState = RTW_LED_ON;
247 _set_timer(&(pLed->BlinkTimer), LED_BLINK_LINK_INTERVAL_ALPHA);
248 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("CurrLedState %d\n", pLed->CurrLedState));
249 } else if (!check_fwstate(pmlmepriv, _FW_LINKED)) {
250 pLed->bLedNoLinkBlinkInProgress = true;
251 pLed->CurrLedState = LED_BLINK_SLOWLY;
253 pLed->BlinkingLedState = RTW_LED_OFF;
255 pLed->BlinkingLedState = RTW_LED_ON;
256 _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA);
257 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("CurrLedState %d\n", pLed->CurrLedState));
259 pLed->BlinkTimes = 0;
260 pLed->bLedBlinkInProgress = false;
263 pLed->BlinkingLedState = RTW_LED_OFF;
265 pLed->BlinkingLedState = RTW_LED_ON;
266 _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA);
271 pLed->BlinkingLedState = RTW_LED_OFF;
273 pLed->BlinkingLedState = RTW_LED_ON;
274 _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA);
276 case LED_BLINK_WPS_STOP: /* WPS success */
277 if (pLed->BlinkingLedState == RTW_LED_ON)
278 bStopBlinking = false;
280 bStopBlinking = true;
283 pLed->bLedLinkBlinkInProgress = true;
284 pLed->CurrLedState = LED_BLINK_NORMAL;
286 pLed->BlinkingLedState = RTW_LED_OFF;
288 pLed->BlinkingLedState = RTW_LED_ON;
289 _set_timer(&(pLed->BlinkTimer), LED_BLINK_LINK_INTERVAL_ALPHA);
290 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("CurrLedState %d\n", pLed->CurrLedState));
292 pLed->bLedWPSBlinkInProgress = false;
294 pLed->BlinkingLedState = RTW_LED_OFF;
295 _set_timer(&(pLed->BlinkTimer), LED_BLINK_WPS_SUCESS_INTERVAL_ALPHA);
303 static void SwLedBlink2(struct LED_871x *pLed)
305 struct adapter *padapter = pLed->padapter;
306 struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
307 u8 bStopBlinking = false;
309 /* Change LED according to BlinkingLedState specified. */
310 if (pLed->BlinkingLedState == RTW_LED_ON) {
311 SwLedOn(padapter, pLed);
312 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("Blinktimes (%d): turn on\n", pLed->BlinkTimes));
314 SwLedOff(padapter, pLed);
315 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("Blinktimes (%d): turn off\n", pLed->BlinkTimes));
318 switch (pLed->CurrLedState) {
321 if (pLed->BlinkTimes == 0)
322 bStopBlinking = true;
324 if (padapter->pwrctrlpriv.rf_pwrstate != rf_on) {
325 SwLedOff(padapter, pLed);
326 } else if (check_fwstate(pmlmepriv, _FW_LINKED)) {
327 pLed->CurrLedState = RTW_LED_ON;
328 pLed->BlinkingLedState = RTW_LED_ON;
329 SwLedOn(padapter, pLed);
330 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("stop scan blink CurrLedState %d\n", pLed->CurrLedState));
332 } else if (!check_fwstate(pmlmepriv, _FW_LINKED)) {
333 pLed->CurrLedState = RTW_LED_OFF;
334 pLed->BlinkingLedState = RTW_LED_OFF;
335 SwLedOff(padapter, pLed);
336 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("stop scan blink CurrLedState %d\n", pLed->CurrLedState));
338 pLed->bLedScanBlinkInProgress = false;
340 if (padapter->pwrctrlpriv.rf_pwrstate != rf_on) {
341 SwLedOff(padapter, pLed);
344 pLed->BlinkingLedState = RTW_LED_OFF;
346 pLed->BlinkingLedState = RTW_LED_ON;
347 _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA);
353 if (pLed->BlinkTimes == 0)
354 bStopBlinking = true;
356 if (padapter->pwrctrlpriv.rf_pwrstate != rf_on) {
357 SwLedOff(padapter, pLed);
358 } else if (check_fwstate(pmlmepriv, _FW_LINKED)) {
359 pLed->CurrLedState = RTW_LED_ON;
360 pLed->BlinkingLedState = RTW_LED_ON;
361 SwLedOn(padapter, pLed);
362 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("stop CurrLedState %d\n", pLed->CurrLedState));
363 } else if (!check_fwstate(pmlmepriv, _FW_LINKED)) {
364 pLed->CurrLedState = RTW_LED_OFF;
365 pLed->BlinkingLedState = RTW_LED_OFF;
366 SwLedOff(padapter, pLed);
367 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("stop CurrLedState %d\n", pLed->CurrLedState));
369 pLed->bLedBlinkInProgress = false;
371 if (padapter->pwrctrlpriv.rf_pwrstate != rf_on) {
372 SwLedOff(padapter, pLed);
375 pLed->BlinkingLedState = RTW_LED_OFF;
377 pLed->BlinkingLedState = RTW_LED_ON;
378 _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA);
387 static void SwLedBlink3(struct LED_871x *pLed)
389 struct adapter *padapter = pLed->padapter;
390 struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
391 u8 bStopBlinking = false;
393 /* Change LED according to BlinkingLedState specified. */
394 if (pLed->BlinkingLedState == RTW_LED_ON) {
395 SwLedOn(padapter, pLed);
396 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("Blinktimes (%d): turn on\n", pLed->BlinkTimes));
398 if (pLed->CurrLedState != LED_BLINK_WPS_STOP)
399 SwLedOff(padapter, pLed);
400 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("Blinktimes (%d): turn off\n", pLed->BlinkTimes));
403 switch (pLed->CurrLedState) {
406 if (pLed->BlinkTimes == 0)
407 bStopBlinking = true;
409 if (padapter->pwrctrlpriv.rf_pwrstate != rf_on) {
410 SwLedOff(padapter, pLed);
411 } else if (check_fwstate(pmlmepriv, _FW_LINKED)) {
412 pLed->CurrLedState = RTW_LED_ON;
413 pLed->BlinkingLedState = RTW_LED_ON;
415 SwLedOn(padapter, pLed);
416 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("CurrLedState %d\n", pLed->CurrLedState));
417 } else if (!check_fwstate(pmlmepriv, _FW_LINKED)) {
418 pLed->CurrLedState = RTW_LED_OFF;
419 pLed->BlinkingLedState = RTW_LED_OFF;
421 SwLedOff(padapter, pLed);
422 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("CurrLedState %d\n", pLed->CurrLedState));
424 pLed->bLedScanBlinkInProgress = false;
426 if (padapter->pwrctrlpriv.rf_pwrstate != rf_on) {
427 SwLedOff(padapter, pLed);
430 pLed->BlinkingLedState = RTW_LED_OFF;
432 pLed->BlinkingLedState = RTW_LED_ON;
433 _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA);
439 if (pLed->BlinkTimes == 0)
440 bStopBlinking = true;
442 if (padapter->pwrctrlpriv.rf_pwrstate != rf_on) {
443 SwLedOff(padapter, pLed);
444 } else if (check_fwstate(pmlmepriv, _FW_LINKED)) {
445 pLed->CurrLedState = RTW_LED_ON;
446 pLed->BlinkingLedState = RTW_LED_ON;
448 SwLedOn(padapter, pLed);
449 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("CurrLedState %d\n", pLed->CurrLedState));
450 } else if (!check_fwstate(pmlmepriv, _FW_LINKED)) {
451 pLed->CurrLedState = RTW_LED_OFF;
452 pLed->BlinkingLedState = RTW_LED_OFF;
455 SwLedOff(padapter, pLed);
456 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("CurrLedState %d\n", pLed->CurrLedState));
458 pLed->bLedBlinkInProgress = false;
460 if (padapter->pwrctrlpriv.rf_pwrstate != rf_on) {
461 SwLedOff(padapter, pLed);
464 pLed->BlinkingLedState = RTW_LED_OFF;
466 pLed->BlinkingLedState = RTW_LED_ON;
467 _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA);
473 pLed->BlinkingLedState = RTW_LED_OFF;
475 pLed->BlinkingLedState = RTW_LED_ON;
476 _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA);
478 case LED_BLINK_WPS_STOP: /* WPS success */
479 if (pLed->BlinkingLedState == RTW_LED_ON) {
480 pLed->BlinkingLedState = RTW_LED_OFF;
481 _set_timer(&(pLed->BlinkTimer), LED_BLINK_WPS_SUCESS_INTERVAL_ALPHA);
482 bStopBlinking = false;
484 bStopBlinking = true;
487 if (padapter->pwrctrlpriv.rf_pwrstate != rf_on) {
488 SwLedOff(padapter, pLed);
490 pLed->CurrLedState = RTW_LED_ON;
491 pLed->BlinkingLedState = RTW_LED_ON;
492 SwLedOn(padapter, pLed);
493 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("CurrLedState %d\n", pLed->CurrLedState));
495 pLed->bLedWPSBlinkInProgress = false;
503 static void SwLedBlink4(struct LED_871x *pLed)
505 struct adapter *padapter = pLed->padapter;
506 struct led_priv *ledpriv = &(padapter->ledpriv);
507 struct LED_871x *pLed1 = &(ledpriv->SwLed1);
508 u8 bStopBlinking = false;
510 /* Change LED according to BlinkingLedState specified. */
511 if (pLed->BlinkingLedState == RTW_LED_ON) {
512 SwLedOn(padapter, pLed);
513 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("Blinktimes (%d): turn on\n", pLed->BlinkTimes));
515 SwLedOff(padapter, pLed);
516 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("Blinktimes (%d): turn off\n", pLed->BlinkTimes));
519 if (!pLed1->bLedWPSBlinkInProgress && pLed1->BlinkingLedState == LED_UNKNOWN) {
520 pLed1->BlinkingLedState = RTW_LED_OFF;
521 pLed1->CurrLedState = RTW_LED_OFF;
522 SwLedOff(padapter, pLed1);
525 switch (pLed->CurrLedState) {
526 case LED_BLINK_SLOWLY:
528 pLed->BlinkingLedState = RTW_LED_OFF;
530 pLed->BlinkingLedState = RTW_LED_ON;
531 _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA);
533 case LED_BLINK_StartToBlink:
535 pLed->BlinkingLedState = RTW_LED_OFF;
536 _set_timer(&(pLed->BlinkTimer), LED_BLINK_SLOWLY_INTERVAL);
538 pLed->BlinkingLedState = RTW_LED_ON;
539 _set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL);
544 if (pLed->BlinkTimes == 0)
545 bStopBlinking = false;
547 if (padapter->pwrctrlpriv.rf_pwrstate != rf_on && padapter->pwrctrlpriv.rfoff_reason > RF_CHANGE_BY_PS) {
548 SwLedOff(padapter, pLed);
550 pLed->bLedNoLinkBlinkInProgress = false;
551 pLed->CurrLedState = LED_BLINK_SLOWLY;
553 pLed->BlinkingLedState = RTW_LED_OFF;
555 pLed->BlinkingLedState = RTW_LED_ON;
556 _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA);
558 pLed->bLedScanBlinkInProgress = false;
560 if (padapter->pwrctrlpriv.rf_pwrstate != rf_on && padapter->pwrctrlpriv.rfoff_reason > RF_CHANGE_BY_PS) {
561 SwLedOff(padapter, pLed);
564 pLed->BlinkingLedState = RTW_LED_OFF;
566 pLed->BlinkingLedState = RTW_LED_ON;
567 _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA);
573 if (pLed->BlinkTimes == 0)
574 bStopBlinking = true;
576 if (padapter->pwrctrlpriv.rf_pwrstate != rf_on && padapter->pwrctrlpriv.rfoff_reason > RF_CHANGE_BY_PS) {
577 SwLedOff(padapter, pLed);
579 pLed->bLedNoLinkBlinkInProgress = true;
580 pLed->CurrLedState = LED_BLINK_SLOWLY;
582 pLed->BlinkingLedState = RTW_LED_OFF;
584 pLed->BlinkingLedState = RTW_LED_ON;
585 _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA);
587 pLed->bLedBlinkInProgress = false;
589 if (padapter->pwrctrlpriv.rf_pwrstate != rf_on && padapter->pwrctrlpriv.rfoff_reason > RF_CHANGE_BY_PS) {
590 SwLedOff(padapter, pLed);
593 pLed->BlinkingLedState = RTW_LED_OFF;
595 pLed->BlinkingLedState = RTW_LED_ON;
596 _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA);
602 pLed->BlinkingLedState = RTW_LED_OFF;
603 _set_timer(&(pLed->BlinkTimer), LED_BLINK_SLOWLY_INTERVAL);
605 pLed->BlinkingLedState = RTW_LED_ON;
606 _set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL);
609 case LED_BLINK_WPS_STOP: /* WPS authentication fail */
611 pLed->BlinkingLedState = RTW_LED_OFF;
613 pLed->BlinkingLedState = RTW_LED_ON;
615 _set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL);
617 case LED_BLINK_WPS_STOP_OVERLAP: /* WPS session overlap */
619 if (pLed->BlinkTimes == 0) {
621 pLed->BlinkTimes = 1;
623 bStopBlinking = true;
627 pLed->BlinkTimes = 10;
628 pLed->BlinkingLedState = RTW_LED_ON;
629 _set_timer(&(pLed->BlinkTimer), LED_BLINK_LINK_INTERVAL_ALPHA);
632 pLed->BlinkingLedState = RTW_LED_OFF;
634 pLed->BlinkingLedState = RTW_LED_ON;
636 _set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL);
642 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("SwLedBlink4 CurrLedState %d\n", pLed->CurrLedState));
645 static void SwLedBlink5(struct LED_871x *pLed)
647 struct adapter *padapter = pLed->padapter;
648 u8 bStopBlinking = false;
650 /* Change LED according to BlinkingLedState specified. */
651 if (pLed->BlinkingLedState == RTW_LED_ON) {
652 SwLedOn(padapter, pLed);
653 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("Blinktimes (%d): turn on\n", pLed->BlinkTimes));
655 SwLedOff(padapter, pLed);
656 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("Blinktimes (%d): turn off\n", pLed->BlinkTimes));
659 switch (pLed->CurrLedState) {
662 if (pLed->BlinkTimes == 0)
663 bStopBlinking = true;
666 if (padapter->pwrctrlpriv.rf_pwrstate != rf_on && padapter->pwrctrlpriv.rfoff_reason > RF_CHANGE_BY_PS) {
667 pLed->CurrLedState = RTW_LED_OFF;
668 pLed->BlinkingLedState = RTW_LED_OFF;
670 SwLedOff(padapter, pLed);
672 pLed->CurrLedState = RTW_LED_ON;
673 pLed->BlinkingLedState = RTW_LED_ON;
675 _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA);
678 pLed->bLedScanBlinkInProgress = false;
680 if (padapter->pwrctrlpriv.rf_pwrstate != rf_on && padapter->pwrctrlpriv.rfoff_reason > RF_CHANGE_BY_PS) {
681 SwLedOff(padapter, pLed);
684 pLed->BlinkingLedState = RTW_LED_OFF;
686 pLed->BlinkingLedState = RTW_LED_ON;
687 _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA);
693 if (pLed->BlinkTimes == 0)
694 bStopBlinking = true;
697 if (padapter->pwrctrlpriv.rf_pwrstate != rf_on && padapter->pwrctrlpriv.rfoff_reason > RF_CHANGE_BY_PS) {
698 pLed->CurrLedState = RTW_LED_OFF;
699 pLed->BlinkingLedState = RTW_LED_OFF;
701 SwLedOff(padapter, pLed);
703 pLed->CurrLedState = RTW_LED_ON;
704 pLed->BlinkingLedState = RTW_LED_ON;
706 _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA);
709 pLed->bLedBlinkInProgress = false;
711 if (padapter->pwrctrlpriv.rf_pwrstate != rf_on && padapter->pwrctrlpriv.rfoff_reason > RF_CHANGE_BY_PS) {
712 SwLedOff(padapter, pLed);
715 pLed->BlinkingLedState = RTW_LED_OFF;
717 pLed->BlinkingLedState = RTW_LED_ON;
718 _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA);
727 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("SwLedBlink5 CurrLedState %d\n", pLed->CurrLedState));
730 static void SwLedBlink6(struct LED_871x *pLed)
732 struct adapter *padapter = pLed->padapter;
734 /* Change LED according to BlinkingLedState specified. */
735 if (pLed->BlinkingLedState == RTW_LED_ON) {
736 SwLedOn(padapter, pLed);
737 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("Blinktimes (%d): turn on\n", pLed->BlinkTimes));
739 SwLedOff(padapter, pLed);
740 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("Blinktimes (%d): turn off\n", pLed->BlinkTimes));
743 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("<==== blink6\n"));
746 /* ALPHA, added by chiyoko, 20090106 */
747 static void SwLedControlMode1(struct adapter *padapter, enum LED_CTL_MODE LedAction)
749 struct led_priv *ledpriv = &(padapter->ledpriv);
750 struct LED_871x *pLed = &(ledpriv->SwLed0);
751 struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
754 case LED_CTL_POWER_ON:
755 case LED_CTL_START_TO_LINK:
756 case LED_CTL_NO_LINK:
757 if (!pLed->bLedNoLinkBlinkInProgress) {
758 if (pLed->CurrLedState == LED_BLINK_SCAN || IS_LED_WPS_BLINKING(pLed))
760 if (pLed->bLedLinkBlinkInProgress) {
761 _cancel_timer_ex(&(pLed->BlinkTimer));
762 pLed->bLedLinkBlinkInProgress = false;
764 if (pLed->bLedBlinkInProgress) {
765 _cancel_timer_ex(&(pLed->BlinkTimer));
766 pLed->bLedBlinkInProgress = false;
769 pLed->bLedNoLinkBlinkInProgress = true;
770 pLed->CurrLedState = LED_BLINK_SLOWLY;
772 pLed->BlinkingLedState = RTW_LED_OFF;
774 pLed->BlinkingLedState = RTW_LED_ON;
775 _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA);
779 if (!pLed->bLedLinkBlinkInProgress) {
780 if (pLed->CurrLedState == LED_BLINK_SCAN || IS_LED_WPS_BLINKING(pLed))
782 if (pLed->bLedNoLinkBlinkInProgress) {
783 _cancel_timer_ex(&(pLed->BlinkTimer));
784 pLed->bLedNoLinkBlinkInProgress = false;
786 if (pLed->bLedBlinkInProgress) {
787 _cancel_timer_ex(&(pLed->BlinkTimer));
788 pLed->bLedBlinkInProgress = false;
790 pLed->bLedLinkBlinkInProgress = true;
791 pLed->CurrLedState = LED_BLINK_NORMAL;
793 pLed->BlinkingLedState = RTW_LED_OFF;
795 pLed->BlinkingLedState = RTW_LED_ON;
796 _set_timer(&(pLed->BlinkTimer), LED_BLINK_LINK_INTERVAL_ALPHA);
799 case LED_CTL_SITE_SURVEY:
800 if ((pmlmepriv->LinkDetectInfo.bBusyTraffic) && (check_fwstate(pmlmepriv, _FW_LINKED))) {
802 } else if (!pLed->bLedScanBlinkInProgress) {
803 if (IS_LED_WPS_BLINKING(pLed))
805 if (pLed->bLedNoLinkBlinkInProgress) {
806 _cancel_timer_ex(&(pLed->BlinkTimer));
807 pLed->bLedNoLinkBlinkInProgress = false;
809 if (pLed->bLedLinkBlinkInProgress) {
810 _cancel_timer_ex(&(pLed->BlinkTimer));
811 pLed->bLedLinkBlinkInProgress = false;
813 if (pLed->bLedBlinkInProgress) {
814 _cancel_timer_ex(&(pLed->BlinkTimer));
815 pLed->bLedBlinkInProgress = false;
817 pLed->bLedScanBlinkInProgress = true;
818 pLed->CurrLedState = LED_BLINK_SCAN;
819 pLed->BlinkTimes = 24;
821 pLed->BlinkingLedState = RTW_LED_OFF;
823 pLed->BlinkingLedState = RTW_LED_ON;
824 _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA);
829 if (!pLed->bLedBlinkInProgress) {
830 if (pLed->CurrLedState == LED_BLINK_SCAN || IS_LED_WPS_BLINKING(pLed))
832 if (pLed->bLedNoLinkBlinkInProgress) {
833 _cancel_timer_ex(&(pLed->BlinkTimer));
834 pLed->bLedNoLinkBlinkInProgress = false;
836 if (pLed->bLedLinkBlinkInProgress) {
837 _cancel_timer_ex(&(pLed->BlinkTimer));
838 pLed->bLedLinkBlinkInProgress = false;
840 pLed->bLedBlinkInProgress = true;
841 pLed->CurrLedState = LED_BLINK_TXRX;
842 pLed->BlinkTimes = 2;
844 pLed->BlinkingLedState = RTW_LED_OFF;
846 pLed->BlinkingLedState = RTW_LED_ON;
847 _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA);
850 case LED_CTL_START_WPS: /* wait until xinpin finish */
851 case LED_CTL_START_WPS_BOTTON:
852 if (!pLed->bLedWPSBlinkInProgress) {
853 if (pLed->bLedNoLinkBlinkInProgress) {
854 _cancel_timer_ex(&(pLed->BlinkTimer));
855 pLed->bLedNoLinkBlinkInProgress = false;
857 if (pLed->bLedLinkBlinkInProgress) {
858 _cancel_timer_ex(&(pLed->BlinkTimer));
859 pLed->bLedLinkBlinkInProgress = false;
861 if (pLed->bLedBlinkInProgress) {
862 _cancel_timer_ex(&(pLed->BlinkTimer));
863 pLed->bLedBlinkInProgress = false;
865 if (pLed->bLedScanBlinkInProgress) {
866 _cancel_timer_ex(&(pLed->BlinkTimer));
867 pLed->bLedScanBlinkInProgress = false;
869 pLed->bLedWPSBlinkInProgress = true;
870 pLed->CurrLedState = LED_BLINK_WPS;
872 pLed->BlinkingLedState = RTW_LED_OFF;
874 pLed->BlinkingLedState = RTW_LED_ON;
875 _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA);
878 case LED_CTL_STOP_WPS:
879 if (pLed->bLedNoLinkBlinkInProgress) {
880 _cancel_timer_ex(&(pLed->BlinkTimer));
881 pLed->bLedNoLinkBlinkInProgress = false;
883 if (pLed->bLedLinkBlinkInProgress) {
884 _cancel_timer_ex(&(pLed->BlinkTimer));
885 pLed->bLedLinkBlinkInProgress = false;
887 if (pLed->bLedBlinkInProgress) {
888 _cancel_timer_ex(&(pLed->BlinkTimer));
889 pLed->bLedBlinkInProgress = false;
891 if (pLed->bLedScanBlinkInProgress) {
892 _cancel_timer_ex(&(pLed->BlinkTimer));
893 pLed->bLedScanBlinkInProgress = false;
895 if (pLed->bLedWPSBlinkInProgress)
896 _cancel_timer_ex(&(pLed->BlinkTimer));
898 pLed->bLedWPSBlinkInProgress = true;
899 pLed->CurrLedState = LED_BLINK_WPS_STOP;
901 pLed->BlinkingLedState = RTW_LED_OFF;
902 _set_timer(&(pLed->BlinkTimer), LED_BLINK_WPS_SUCESS_INTERVAL_ALPHA);
904 pLed->BlinkingLedState = RTW_LED_ON;
905 _set_timer(&(pLed->BlinkTimer), 0);
908 case LED_CTL_STOP_WPS_FAIL:
909 if (pLed->bLedWPSBlinkInProgress) {
910 _cancel_timer_ex(&(pLed->BlinkTimer));
911 pLed->bLedWPSBlinkInProgress = false;
913 pLed->bLedNoLinkBlinkInProgress = true;
914 pLed->CurrLedState = LED_BLINK_SLOWLY;
916 pLed->BlinkingLedState = RTW_LED_OFF;
918 pLed->BlinkingLedState = RTW_LED_ON;
919 _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA);
921 case LED_CTL_POWER_OFF:
922 pLed->CurrLedState = RTW_LED_OFF;
923 pLed->BlinkingLedState = RTW_LED_OFF;
924 if (pLed->bLedNoLinkBlinkInProgress) {
925 _cancel_timer_ex(&(pLed->BlinkTimer));
926 pLed->bLedNoLinkBlinkInProgress = false;
928 if (pLed->bLedLinkBlinkInProgress) {
929 _cancel_timer_ex(&(pLed->BlinkTimer));
930 pLed->bLedLinkBlinkInProgress = false;
932 if (pLed->bLedBlinkInProgress) {
933 _cancel_timer_ex(&(pLed->BlinkTimer));
934 pLed->bLedBlinkInProgress = false;
936 if (pLed->bLedWPSBlinkInProgress) {
937 _cancel_timer_ex(&(pLed->BlinkTimer));
938 pLed->bLedWPSBlinkInProgress = false;
940 if (pLed->bLedScanBlinkInProgress) {
941 _cancel_timer_ex(&(pLed->BlinkTimer));
942 pLed->bLedScanBlinkInProgress = false;
944 SwLedOff(padapter, pLed);
950 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("Led %d\n", pLed->CurrLedState));
953 /* Arcadyan/Sitecom , added by chiyoko, 20090216 */
954 static void SwLedControlMode2(struct adapter *padapter, enum LED_CTL_MODE LedAction)
956 struct led_priv *ledpriv = &(padapter->ledpriv);
957 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
958 struct LED_871x *pLed = &(ledpriv->SwLed0);
961 case LED_CTL_SITE_SURVEY:
962 if (pmlmepriv->LinkDetectInfo.bBusyTraffic) {
963 } else if (!pLed->bLedScanBlinkInProgress) {
964 if (IS_LED_WPS_BLINKING(pLed))
967 if (pLed->bLedBlinkInProgress) {
968 _cancel_timer_ex(&(pLed->BlinkTimer));
969 pLed->bLedBlinkInProgress = false;
971 pLed->bLedScanBlinkInProgress = true;
972 pLed->CurrLedState = LED_BLINK_SCAN;
973 pLed->BlinkTimes = 24;
975 pLed->BlinkingLedState = RTW_LED_OFF;
977 pLed->BlinkingLedState = RTW_LED_ON;
978 _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA);
983 if ((!pLed->bLedBlinkInProgress) && (check_fwstate(pmlmepriv, _FW_LINKED))) {
984 if (pLed->CurrLedState == LED_BLINK_SCAN || IS_LED_WPS_BLINKING(pLed))
986 pLed->bLedBlinkInProgress = true;
987 pLed->CurrLedState = LED_BLINK_TXRX;
988 pLed->BlinkTimes = 2;
990 pLed->BlinkingLedState = RTW_LED_OFF;
992 pLed->BlinkingLedState = RTW_LED_ON;
993 _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA);
997 pLed->CurrLedState = RTW_LED_ON;
998 pLed->BlinkingLedState = RTW_LED_ON;
999 if (pLed->bLedBlinkInProgress) {
1000 _cancel_timer_ex(&(pLed->BlinkTimer));
1001 pLed->bLedBlinkInProgress = false;
1003 if (pLed->bLedScanBlinkInProgress) {
1004 _cancel_timer_ex(&(pLed->BlinkTimer));
1005 pLed->bLedScanBlinkInProgress = false;
1007 _set_timer(&(pLed->BlinkTimer), 0);
1009 case LED_CTL_START_WPS: /* wait until xinpin finish */
1010 case LED_CTL_START_WPS_BOTTON:
1011 if (!pLed->bLedWPSBlinkInProgress) {
1012 if (pLed->bLedBlinkInProgress) {
1013 _cancel_timer_ex(&(pLed->BlinkTimer));
1014 pLed->bLedBlinkInProgress = false;
1016 if (pLed->bLedScanBlinkInProgress) {
1017 _cancel_timer_ex(&(pLed->BlinkTimer));
1018 pLed->bLedScanBlinkInProgress = false;
1020 pLed->bLedWPSBlinkInProgress = true;
1021 pLed->CurrLedState = RTW_LED_ON;
1022 pLed->BlinkingLedState = RTW_LED_ON;
1023 _set_timer(&(pLed->BlinkTimer), 0);
1026 case LED_CTL_STOP_WPS:
1027 pLed->bLedWPSBlinkInProgress = false;
1028 if (padapter->pwrctrlpriv.rf_pwrstate != rf_on) {
1029 SwLedOff(padapter, pLed);
1031 pLed->CurrLedState = RTW_LED_ON;
1032 pLed->BlinkingLedState = RTW_LED_ON;
1033 _set_timer(&(pLed->BlinkTimer), 0);
1034 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("CurrLedState %d\n", pLed->CurrLedState));
1037 case LED_CTL_STOP_WPS_FAIL:
1038 pLed->bLedWPSBlinkInProgress = false;
1039 if (padapter->pwrctrlpriv.rf_pwrstate != rf_on) {
1040 SwLedOff(padapter, pLed);
1042 pLed->CurrLedState = RTW_LED_OFF;
1043 pLed->BlinkingLedState = RTW_LED_OFF;
1044 _set_timer(&(pLed->BlinkTimer), 0);
1045 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("CurrLedState %d\n", pLed->CurrLedState));
1048 case LED_CTL_START_TO_LINK:
1049 case LED_CTL_NO_LINK:
1050 if (!IS_LED_BLINKING(pLed)) {
1051 pLed->CurrLedState = RTW_LED_OFF;
1052 pLed->BlinkingLedState = RTW_LED_OFF;
1053 _set_timer(&(pLed->BlinkTimer), 0);
1056 case LED_CTL_POWER_OFF:
1057 pLed->CurrLedState = RTW_LED_OFF;
1058 pLed->BlinkingLedState = RTW_LED_OFF;
1059 if (pLed->bLedBlinkInProgress) {
1060 _cancel_timer_ex(&(pLed->BlinkTimer));
1061 pLed->bLedBlinkInProgress = false;
1063 if (pLed->bLedScanBlinkInProgress) {
1064 _cancel_timer_ex(&(pLed->BlinkTimer));
1065 pLed->bLedScanBlinkInProgress = false;
1067 if (pLed->bLedWPSBlinkInProgress) {
1068 _cancel_timer_ex(&(pLed->BlinkTimer));
1069 pLed->bLedWPSBlinkInProgress = false;
1072 _set_timer(&(pLed->BlinkTimer), 0);
1078 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("CurrLedState %d\n", pLed->CurrLedState));
1081 /* COREGA, added by chiyoko, 20090316 */
1082 static void SwLedControlMode3(struct adapter *padapter, enum LED_CTL_MODE LedAction)
1084 struct led_priv *ledpriv = &(padapter->ledpriv);
1085 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
1086 struct LED_871x *pLed = &(ledpriv->SwLed0);
1088 switch (LedAction) {
1089 case LED_CTL_SITE_SURVEY:
1090 if (pmlmepriv->LinkDetectInfo.bBusyTraffic) {
1091 } else if (!pLed->bLedScanBlinkInProgress) {
1092 if (IS_LED_WPS_BLINKING(pLed))
1095 if (pLed->bLedBlinkInProgress) {
1096 _cancel_timer_ex(&(pLed->BlinkTimer));
1097 pLed->bLedBlinkInProgress = false;
1099 pLed->bLedScanBlinkInProgress = true;
1100 pLed->CurrLedState = LED_BLINK_SCAN;
1101 pLed->BlinkTimes = 24;
1103 pLed->BlinkingLedState = RTW_LED_OFF;
1105 pLed->BlinkingLedState = RTW_LED_ON;
1106 _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA);
1111 if ((!pLed->bLedBlinkInProgress) && (check_fwstate(pmlmepriv, _FW_LINKED))) {
1112 if (pLed->CurrLedState == LED_BLINK_SCAN || IS_LED_WPS_BLINKING(pLed))
1114 pLed->bLedBlinkInProgress = true;
1115 pLed->CurrLedState = LED_BLINK_TXRX;
1116 pLed->BlinkTimes = 2;
1118 pLed->BlinkingLedState = RTW_LED_OFF;
1120 pLed->BlinkingLedState = RTW_LED_ON;
1121 _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA);
1125 if (IS_LED_WPS_BLINKING(pLed))
1127 pLed->CurrLedState = RTW_LED_ON;
1128 pLed->BlinkingLedState = RTW_LED_ON;
1129 if (pLed->bLedBlinkInProgress) {
1130 _cancel_timer_ex(&(pLed->BlinkTimer));
1131 pLed->bLedBlinkInProgress = false;
1133 if (pLed->bLedScanBlinkInProgress) {
1134 _cancel_timer_ex(&(pLed->BlinkTimer));
1135 pLed->bLedScanBlinkInProgress = false;
1138 _set_timer(&(pLed->BlinkTimer), 0);
1140 case LED_CTL_START_WPS: /* wait until xinpin finish */
1141 case LED_CTL_START_WPS_BOTTON:
1142 if (!pLed->bLedWPSBlinkInProgress) {
1143 if (pLed->bLedBlinkInProgress) {
1144 _cancel_timer_ex(&(pLed->BlinkTimer));
1145 pLed->bLedBlinkInProgress = false;
1147 if (pLed->bLedScanBlinkInProgress) {
1148 _cancel_timer_ex(&(pLed->BlinkTimer));
1149 pLed->bLedScanBlinkInProgress = false;
1151 pLed->bLedWPSBlinkInProgress = true;
1152 pLed->CurrLedState = LED_BLINK_WPS;
1154 pLed->BlinkingLedState = RTW_LED_OFF;
1156 pLed->BlinkingLedState = RTW_LED_ON;
1157 _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA);
1160 case LED_CTL_STOP_WPS:
1161 if (pLed->bLedWPSBlinkInProgress) {
1162 _cancel_timer_ex(&(pLed->BlinkTimer));
1163 pLed->bLedWPSBlinkInProgress = false;
1165 pLed->bLedWPSBlinkInProgress = true;
1168 pLed->CurrLedState = LED_BLINK_WPS_STOP;
1170 pLed->BlinkingLedState = RTW_LED_OFF;
1171 _set_timer(&(pLed->BlinkTimer), LED_BLINK_WPS_SUCESS_INTERVAL_ALPHA);
1173 pLed->BlinkingLedState = RTW_LED_ON;
1174 _set_timer(&(pLed->BlinkTimer), 0);
1177 case LED_CTL_STOP_WPS_FAIL:
1178 if (pLed->bLedWPSBlinkInProgress) {
1179 _cancel_timer_ex(&(pLed->BlinkTimer));
1180 pLed->bLedWPSBlinkInProgress = false;
1182 pLed->CurrLedState = RTW_LED_OFF;
1183 pLed->BlinkingLedState = RTW_LED_OFF;
1184 _set_timer(&(pLed->BlinkTimer), 0);
1186 case LED_CTL_START_TO_LINK:
1187 case LED_CTL_NO_LINK:
1188 if (!IS_LED_BLINKING(pLed)) {
1189 pLed->CurrLedState = RTW_LED_OFF;
1190 pLed->BlinkingLedState = RTW_LED_OFF;
1191 _set_timer(&(pLed->BlinkTimer), 0);
1194 case LED_CTL_POWER_OFF:
1195 pLed->CurrLedState = RTW_LED_OFF;
1196 pLed->BlinkingLedState = RTW_LED_OFF;
1197 if (pLed->bLedBlinkInProgress) {
1198 _cancel_timer_ex(&(pLed->BlinkTimer));
1199 pLed->bLedBlinkInProgress = false;
1201 if (pLed->bLedScanBlinkInProgress) {
1202 _cancel_timer_ex(&(pLed->BlinkTimer));
1203 pLed->bLedScanBlinkInProgress = false;
1205 if (pLed->bLedWPSBlinkInProgress) {
1206 _cancel_timer_ex(&(pLed->BlinkTimer));
1207 pLed->bLedWPSBlinkInProgress = false;
1210 _set_timer(&(pLed->BlinkTimer), 0);
1215 RT_TRACE(_module_rtl8712_led_c_, _drv_info_,
1216 ("CurrLedState %d\n", pLed->CurrLedState));
1219 /* Edimax-Belkin, added by chiyoko, 20090413 */
1220 static void SwLedControlMode4(struct adapter *padapter, enum LED_CTL_MODE LedAction)
1222 struct led_priv *ledpriv = &(padapter->ledpriv);
1223 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
1224 struct LED_871x *pLed = &(ledpriv->SwLed0);
1225 struct LED_871x *pLed1 = &(ledpriv->SwLed1);
1227 switch (LedAction) {
1228 case LED_CTL_START_TO_LINK:
1229 if (pLed1->bLedWPSBlinkInProgress) {
1230 pLed1->bLedWPSBlinkInProgress = false;
1231 _cancel_timer_ex(&(pLed1->BlinkTimer));
1233 pLed1->BlinkingLedState = RTW_LED_OFF;
1234 pLed1->CurrLedState = RTW_LED_OFF;
1237 _set_timer(&(pLed->BlinkTimer), 0);
1240 if (!pLed->bLedStartToLinkBlinkInProgress) {
1241 if (pLed->CurrLedState == LED_BLINK_SCAN || IS_LED_WPS_BLINKING(pLed))
1243 if (pLed->bLedBlinkInProgress) {
1244 _cancel_timer_ex(&(pLed->BlinkTimer));
1245 pLed->bLedBlinkInProgress = false;
1247 if (pLed->bLedNoLinkBlinkInProgress) {
1248 _cancel_timer_ex(&(pLed->BlinkTimer));
1249 pLed->bLedNoLinkBlinkInProgress = false;
1252 pLed->bLedStartToLinkBlinkInProgress = true;
1253 pLed->CurrLedState = LED_BLINK_StartToBlink;
1255 pLed->BlinkingLedState = RTW_LED_OFF;
1256 _set_timer(&(pLed->BlinkTimer), LED_BLINK_SLOWLY_INTERVAL);
1258 pLed->BlinkingLedState = RTW_LED_ON;
1259 _set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL);
1264 case LED_CTL_NO_LINK:
1266 if (LedAction == LED_CTL_LINK) {
1267 if (pLed1->bLedWPSBlinkInProgress) {
1268 pLed1->bLedWPSBlinkInProgress = false;
1269 _cancel_timer_ex(&(pLed1->BlinkTimer));
1271 pLed1->BlinkingLedState = RTW_LED_OFF;
1272 pLed1->CurrLedState = RTW_LED_OFF;
1275 _set_timer(&(pLed->BlinkTimer), 0);
1279 if (!pLed->bLedNoLinkBlinkInProgress) {
1280 if (pLed->CurrLedState == LED_BLINK_SCAN || IS_LED_WPS_BLINKING(pLed))
1282 if (pLed->bLedBlinkInProgress) {
1283 _cancel_timer_ex(&(pLed->BlinkTimer));
1284 pLed->bLedBlinkInProgress = false;
1287 pLed->bLedNoLinkBlinkInProgress = true;
1288 pLed->CurrLedState = LED_BLINK_SLOWLY;
1290 pLed->BlinkingLedState = RTW_LED_OFF;
1292 pLed->BlinkingLedState = RTW_LED_ON;
1293 _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA);
1296 case LED_CTL_SITE_SURVEY:
1297 if ((pmlmepriv->LinkDetectInfo.bBusyTraffic) && (check_fwstate(pmlmepriv, _FW_LINKED))) {
1298 } else if (!pLed->bLedScanBlinkInProgress) {
1299 if (IS_LED_WPS_BLINKING(pLed))
1302 if (pLed->bLedNoLinkBlinkInProgress) {
1303 _cancel_timer_ex(&(pLed->BlinkTimer));
1304 pLed->bLedNoLinkBlinkInProgress = false;
1306 if (pLed->bLedBlinkInProgress) {
1307 _cancel_timer_ex(&(pLed->BlinkTimer));
1308 pLed->bLedBlinkInProgress = false;
1310 pLed->bLedScanBlinkInProgress = true;
1311 pLed->CurrLedState = LED_BLINK_SCAN;
1312 pLed->BlinkTimes = 24;
1314 pLed->BlinkingLedState = RTW_LED_OFF;
1316 pLed->BlinkingLedState = RTW_LED_ON;
1317 _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA);
1322 if (!pLed->bLedBlinkInProgress) {
1323 if (pLed->CurrLedState == LED_BLINK_SCAN || IS_LED_WPS_BLINKING(pLed))
1325 if (pLed->bLedNoLinkBlinkInProgress) {
1326 _cancel_timer_ex(&(pLed->BlinkTimer));
1327 pLed->bLedNoLinkBlinkInProgress = false;
1329 pLed->bLedBlinkInProgress = true;
1330 pLed->CurrLedState = LED_BLINK_TXRX;
1331 pLed->BlinkTimes = 2;
1333 pLed->BlinkingLedState = RTW_LED_OFF;
1335 pLed->BlinkingLedState = RTW_LED_ON;
1336 _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA);
1339 case LED_CTL_START_WPS: /* wait until xinpin finish */
1340 case LED_CTL_START_WPS_BOTTON:
1341 if (pLed1->bLedWPSBlinkInProgress) {
1342 pLed1->bLedWPSBlinkInProgress = false;
1343 _cancel_timer_ex(&(pLed1->BlinkTimer));
1345 pLed1->BlinkingLedState = RTW_LED_OFF;
1346 pLed1->CurrLedState = RTW_LED_OFF;
1349 _set_timer(&(pLed->BlinkTimer), 0);
1352 if (!pLed->bLedWPSBlinkInProgress) {
1353 if (pLed->bLedNoLinkBlinkInProgress) {
1354 _cancel_timer_ex(&(pLed->BlinkTimer));
1355 pLed->bLedNoLinkBlinkInProgress = false;
1357 if (pLed->bLedBlinkInProgress) {
1358 _cancel_timer_ex(&(pLed->BlinkTimer));
1359 pLed->bLedBlinkInProgress = false;
1361 if (pLed->bLedScanBlinkInProgress) {
1362 _cancel_timer_ex(&(pLed->BlinkTimer));
1363 pLed->bLedScanBlinkInProgress = false;
1365 pLed->bLedWPSBlinkInProgress = true;
1366 pLed->CurrLedState = LED_BLINK_WPS;
1368 pLed->BlinkingLedState = RTW_LED_OFF;
1369 _set_timer(&(pLed->BlinkTimer), LED_BLINK_SLOWLY_INTERVAL);
1371 pLed->BlinkingLedState = RTW_LED_ON;
1372 _set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL);
1376 case LED_CTL_STOP_WPS: /* WPS connect success */
1377 if (pLed->bLedWPSBlinkInProgress) {
1378 _cancel_timer_ex(&(pLed->BlinkTimer));
1379 pLed->bLedWPSBlinkInProgress = false;
1382 pLed->bLedNoLinkBlinkInProgress = true;
1383 pLed->CurrLedState = LED_BLINK_SLOWLY;
1385 pLed->BlinkingLedState = RTW_LED_OFF;
1387 pLed->BlinkingLedState = RTW_LED_ON;
1388 _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA);
1391 case LED_CTL_STOP_WPS_FAIL: /* WPS authentication fail */
1392 if (pLed->bLedWPSBlinkInProgress) {
1393 _cancel_timer_ex(&(pLed->BlinkTimer));
1394 pLed->bLedWPSBlinkInProgress = false;
1396 pLed->bLedNoLinkBlinkInProgress = true;
1397 pLed->CurrLedState = LED_BLINK_SLOWLY;
1399 pLed->BlinkingLedState = RTW_LED_OFF;
1401 pLed->BlinkingLedState = RTW_LED_ON;
1402 _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA);
1405 if (pLed1->bLedWPSBlinkInProgress)
1406 _cancel_timer_ex(&(pLed1->BlinkTimer));
1408 pLed1->bLedWPSBlinkInProgress = true;
1409 pLed1->CurrLedState = LED_BLINK_WPS_STOP;
1411 pLed1->BlinkingLedState = RTW_LED_OFF;
1413 pLed1->BlinkingLedState = RTW_LED_ON;
1414 _set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL);
1416 case LED_CTL_STOP_WPS_FAIL_OVERLAP: /* WPS session overlap */
1417 if (pLed->bLedWPSBlinkInProgress) {
1418 _cancel_timer_ex(&(pLed->BlinkTimer));
1419 pLed->bLedWPSBlinkInProgress = false;
1421 pLed->bLedNoLinkBlinkInProgress = true;
1422 pLed->CurrLedState = LED_BLINK_SLOWLY;
1424 pLed->BlinkingLedState = RTW_LED_OFF;
1426 pLed->BlinkingLedState = RTW_LED_ON;
1427 _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA);
1430 if (pLed1->bLedWPSBlinkInProgress)
1431 _cancel_timer_ex(&(pLed1->BlinkTimer));
1433 pLed1->bLedWPSBlinkInProgress = true;
1434 pLed1->CurrLedState = LED_BLINK_WPS_STOP_OVERLAP;
1435 pLed1->BlinkTimes = 10;
1437 pLed1->BlinkingLedState = RTW_LED_OFF;
1439 pLed1->BlinkingLedState = RTW_LED_ON;
1440 _set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL);
1442 case LED_CTL_POWER_OFF:
1443 pLed->CurrLedState = RTW_LED_OFF;
1444 pLed->BlinkingLedState = RTW_LED_OFF;
1446 if (pLed->bLedNoLinkBlinkInProgress) {
1447 _cancel_timer_ex(&(pLed->BlinkTimer));
1448 pLed->bLedNoLinkBlinkInProgress = false;
1450 if (pLed->bLedLinkBlinkInProgress) {
1451 _cancel_timer_ex(&(pLed->BlinkTimer));
1452 pLed->bLedLinkBlinkInProgress = false;
1454 if (pLed->bLedBlinkInProgress) {
1455 _cancel_timer_ex(&(pLed->BlinkTimer));
1456 pLed->bLedBlinkInProgress = false;
1458 if (pLed->bLedWPSBlinkInProgress) {
1459 _cancel_timer_ex(&(pLed->BlinkTimer));
1460 pLed->bLedWPSBlinkInProgress = false;
1462 if (pLed->bLedScanBlinkInProgress) {
1463 _cancel_timer_ex(&(pLed->BlinkTimer));
1464 pLed->bLedScanBlinkInProgress = false;
1466 if (pLed->bLedStartToLinkBlinkInProgress) {
1467 _cancel_timer_ex(&(pLed->BlinkTimer));
1468 pLed->bLedStartToLinkBlinkInProgress = false;
1470 if (pLed1->bLedWPSBlinkInProgress) {
1471 _cancel_timer_ex(&(pLed1->BlinkTimer));
1472 pLed1->bLedWPSBlinkInProgress = false;
1474 pLed1->BlinkingLedState = LED_UNKNOWN;
1475 SwLedOff(padapter, pLed);
1476 SwLedOff(padapter, pLed1);
1482 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("Led %d\n", pLed->CurrLedState));
1485 /* Sercomm-Belkin, added by chiyoko, 20090415 */
1488 struct adapter *padapter,
1489 enum LED_CTL_MODE LedAction
1492 struct led_priv *ledpriv = &(padapter->ledpriv);
1493 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
1494 struct LED_871x *pLed = &(ledpriv->SwLed0);
1496 switch (LedAction) {
1497 case LED_CTL_POWER_ON:
1498 case LED_CTL_NO_LINK:
1499 case LED_CTL_LINK: /* solid blue */
1500 pLed->CurrLedState = RTW_LED_ON;
1501 pLed->BlinkingLedState = RTW_LED_ON;
1503 _set_timer(&(pLed->BlinkTimer), 0);
1505 case LED_CTL_SITE_SURVEY:
1506 if ((pmlmepriv->LinkDetectInfo.bBusyTraffic) && (check_fwstate(pmlmepriv, _FW_LINKED))) {
1507 } else if (!pLed->bLedScanBlinkInProgress) {
1508 if (pLed->bLedBlinkInProgress) {
1509 _cancel_timer_ex(&(pLed->BlinkTimer));
1510 pLed->bLedBlinkInProgress = false;
1512 pLed->bLedScanBlinkInProgress = true;
1513 pLed->CurrLedState = LED_BLINK_SCAN;
1514 pLed->BlinkTimes = 24;
1516 pLed->BlinkingLedState = RTW_LED_OFF;
1518 pLed->BlinkingLedState = RTW_LED_ON;
1519 _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA);
1524 if (!pLed->bLedBlinkInProgress) {
1525 if (pLed->CurrLedState == LED_BLINK_SCAN)
1527 pLed->bLedBlinkInProgress = true;
1528 pLed->CurrLedState = LED_BLINK_TXRX;
1529 pLed->BlinkTimes = 2;
1531 pLed->BlinkingLedState = RTW_LED_OFF;
1533 pLed->BlinkingLedState = RTW_LED_ON;
1534 _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA);
1537 case LED_CTL_POWER_OFF:
1538 pLed->CurrLedState = RTW_LED_OFF;
1539 pLed->BlinkingLedState = RTW_LED_OFF;
1541 if (pLed->bLedBlinkInProgress) {
1542 _cancel_timer_ex(&(pLed->BlinkTimer));
1543 pLed->bLedBlinkInProgress = false;
1545 SwLedOff(padapter, pLed);
1551 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("Led %d\n", pLed->CurrLedState));
1554 /* WNC-Corega, added by chiyoko, 20090902 */
1557 struct adapter *padapter,
1558 enum LED_CTL_MODE LedAction
1561 struct led_priv *ledpriv = &(padapter->ledpriv);
1562 struct LED_871x *pLed0 = &(ledpriv->SwLed0);
1564 switch (LedAction) {
1565 case LED_CTL_POWER_ON:
1567 case LED_CTL_NO_LINK:
1568 _cancel_timer_ex(&(pLed0->BlinkTimer));
1569 pLed0->CurrLedState = RTW_LED_ON;
1570 pLed0->BlinkingLedState = RTW_LED_ON;
1571 _set_timer(&(pLed0->BlinkTimer), 0);
1573 case LED_CTL_POWER_OFF:
1574 SwLedOff(padapter, pLed0);
1580 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("ledcontrol 6 Led %d\n", pLed0->CurrLedState));
1585 /* Handler function of LED Blinking. */
1586 /* We dispatch acture LED blink action according to LedStrategy. */
1588 void BlinkHandler(struct LED_871x *pLed)
1590 struct adapter *padapter = pLed->padapter;
1591 struct led_priv *ledpriv = &(padapter->ledpriv);
1593 if ((padapter->bSurpriseRemoved) || (padapter->bDriverStopped))
1596 switch (ledpriv->LedStrategy) {
1623 void LedControl8188eu(struct adapter *padapter, enum LED_CTL_MODE LedAction)
1625 struct led_priv *ledpriv = &(padapter->ledpriv);
1626 struct registry_priv *registry_par;
1628 if ((padapter->bSurpriseRemoved) || (padapter->bDriverStopped) ||
1629 (!padapter->hw_init_completed))
1632 if (!ledpriv->bRegUseLed)
1635 registry_par = &padapter->registrypriv;
1636 if (!registry_par->led_enable)
1639 if ((padapter->pwrctrlpriv.rf_pwrstate != rf_on &&
1640 padapter->pwrctrlpriv.rfoff_reason > RF_CHANGE_BY_PS) &&
1641 (LedAction == LED_CTL_TX || LedAction == LED_CTL_RX ||
1642 LedAction == LED_CTL_SITE_SURVEY ||
1643 LedAction == LED_CTL_LINK ||
1644 LedAction == LED_CTL_NO_LINK ||
1645 LedAction == LED_CTL_POWER_ON))
1648 switch (ledpriv->LedStrategy) {
1652 SwLedControlMode1(padapter, LedAction);
1655 SwLedControlMode2(padapter, LedAction);
1658 SwLedControlMode3(padapter, LedAction);
1661 SwLedControlMode4(padapter, LedAction);
1664 SwLedControlMode5(padapter, LedAction);
1667 SwLedControlMode6(padapter, LedAction);
1673 RT_TRACE(_module_rtl8712_led_c_, _drv_info_,
1674 ("LedStrategy:%d, LedAction %d\n",
1675 ledpriv->LedStrategy, LedAction));