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 * You should have received a copy of the GNU General Public License along with
15 * this program; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
19 ******************************************************************************/
21 #include <drv_types.h>
26 /* Callback function of LED BlinkTimer, */
27 /* it just schedules to corresponding BlinkWorkItem/led_blink_hdl */
29 void BlinkTimerCallback(void *data)
31 struct LED_871x *pLed = (struct LED_871x *)data;
32 struct adapter *padapter = pLed->padapter;
34 if ((padapter->bSurpriseRemoved) || (padapter->bDriverStopped))
37 schedule_work(&(pLed->BlinkWorkItem));
42 /* Callback function of LED BlinkWorkItem. */
43 /* We dispatch acture LED blink action according to LedStrategy. */
45 void BlinkWorkItemCallback(struct work_struct *work)
47 struct LED_871x *pLed = container_of(work, struct LED_871x, BlinkWorkItem);
53 /* Reset status of LED_871x object. */
55 void ResetLedStatus(struct LED_871x *pLed)
57 pLed->CurrLedState = RTW_LED_OFF; /* Current LED state. */
58 pLed->bLedOn = false; /* true if LED is ON, false if LED is OFF. */
60 pLed->bLedBlinkInProgress = false; /* true if it is blinking, false o.w.. */
61 pLed->bLedWPSBlinkInProgress = false;
63 pLed->BlinkTimes = 0; /* Number of times to toggle led state for blinking. */
64 pLed->BlinkingLedState = LED_UNKNOWN; /* Next state for blinking, either RTW_LED_ON or RTW_LED_OFF are. */
66 pLed->bLedNoLinkBlinkInProgress = false;
67 pLed->bLedLinkBlinkInProgress = false;
68 pLed->bLedStartToLinkBlinkInProgress = false;
69 pLed->bLedScanBlinkInProgress = false;
73 /* Initialize an LED_871x object. */
74 void InitLed871x(struct adapter *padapter, struct LED_871x *pLed, enum LED_PIN_871x LedPin)
76 pLed->padapter = padapter;
77 pLed->LedPin = LedPin;
81 _init_timer(&(pLed->BlinkTimer), padapter->pnetdev, BlinkTimerCallback, pLed);
83 INIT_WORK(&(pLed->BlinkWorkItem), BlinkWorkItemCallback);
89 /* DeInitialize an LED_871x object. */
91 void DeInitLed871x(struct LED_871x *pLed)
93 _cancel_workitem_sync(&(pLed->BlinkWorkItem));
94 _cancel_timer_ex(&(pLed->BlinkTimer));
100 /* Implementation of LED blinking behavior. */
101 /* It toggle off LED and schedule corresponding timer if necessary. */
104 static void SwLedBlink(struct LED_871x *pLed)
106 struct adapter *padapter = pLed->padapter;
107 struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
108 u8 bStopBlinking = false;
110 /* Change LED according to BlinkingLedState specified. */
111 if (pLed->BlinkingLedState == RTW_LED_ON) {
112 SwLedOn(padapter, pLed);
113 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("Blinktimes (%d): turn on\n", pLed->BlinkTimes));
115 SwLedOff(padapter, pLed);
116 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("Blinktimes (%d): turn off\n", pLed->BlinkTimes));
119 /* Determine if we shall change LED state again. */
121 switch (pLed->CurrLedState) {
122 case LED_BLINK_NORMAL:
123 if (pLed->BlinkTimes == 0)
124 bStopBlinking = true;
126 case LED_BLINK_StartToBlink:
127 if (check_fwstate(pmlmepriv, _FW_LINKED) && check_fwstate(pmlmepriv, WIFI_STATION_STATE))
128 bStopBlinking = true;
129 if (check_fwstate(pmlmepriv, _FW_LINKED) &&
130 (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) ||
131 check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE)))
132 bStopBlinking = true;
133 else if (pLed->BlinkTimes == 0)
134 bStopBlinking = true;
137 if (pLed->BlinkTimes == 0)
138 bStopBlinking = true;
141 bStopBlinking = true;
146 /* if (padapter->pwrctrlpriv.cpwm >= PS_STATE_S2) */
148 SwLedOff(padapter, pLed);
149 } else if ((check_fwstate(pmlmepriv, _FW_LINKED)) && (!pLed->bLedOn)) {
150 SwLedOn(padapter, pLed);
151 } else if ((check_fwstate(pmlmepriv, _FW_LINKED)) && pLed->bLedOn) {
152 SwLedOff(padapter, pLed);
154 pLed->BlinkTimes = 0;
155 pLed->bLedBlinkInProgress = false;
157 /* Assign LED state to toggle. */
158 if (pLed->BlinkingLedState == RTW_LED_ON)
159 pLed->BlinkingLedState = RTW_LED_OFF;
161 pLed->BlinkingLedState = RTW_LED_ON;
163 /* Schedule a timer to toggle LED state. */
164 switch (pLed->CurrLedState) {
165 case LED_BLINK_NORMAL:
166 _set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL);
168 case LED_BLINK_SLOWLY:
169 case LED_BLINK_StartToBlink:
170 _set_timer(&(pLed->BlinkTimer), LED_BLINK_SLOWLY_INTERVAL);
173 if (pLed->BlinkingLedState == RTW_LED_ON)
174 _set_timer(&(pLed->BlinkTimer), LED_BLINK_LONG_INTERVAL);
176 _set_timer(&(pLed->BlinkTimer), LED_BLINK_LONG_INTERVAL);
179 _set_timer(&(pLed->BlinkTimer), LED_BLINK_SLOWLY_INTERVAL);
185 static void SwLedBlink1(struct LED_871x *pLed)
187 struct adapter *padapter = pLed->padapter;
188 struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
189 u8 bStopBlinking = false;
191 /* Change LED according to BlinkingLedState specified. */
192 if (pLed->BlinkingLedState == RTW_LED_ON) {
193 SwLedOn(padapter, pLed);
194 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("Blinktimes (%d): turn on\n", pLed->BlinkTimes));
196 SwLedOff(padapter, pLed);
197 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("Blinktimes (%d): turn off\n", pLed->BlinkTimes));
200 if (padapter->pwrctrlpriv.rf_pwrstate != rf_on) {
201 SwLedOff(padapter, pLed);
202 ResetLedStatus(pLed);
206 switch (pLed->CurrLedState) {
207 case LED_BLINK_SLOWLY:
209 pLed->BlinkingLedState = RTW_LED_OFF;
211 pLed->BlinkingLedState = RTW_LED_ON;
212 _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA);
214 case LED_BLINK_NORMAL:
216 pLed->BlinkingLedState = RTW_LED_OFF;
218 pLed->BlinkingLedState = RTW_LED_ON;
219 _set_timer(&(pLed->BlinkTimer), LED_BLINK_LINK_INTERVAL_ALPHA);
223 if (pLed->BlinkTimes == 0)
224 bStopBlinking = true;
226 if (check_fwstate(pmlmepriv, _FW_LINKED)) {
227 pLed->bLedLinkBlinkInProgress = true;
228 pLed->CurrLedState = LED_BLINK_NORMAL;
230 pLed->BlinkingLedState = RTW_LED_OFF;
232 pLed->BlinkingLedState = RTW_LED_ON;
233 _set_timer(&(pLed->BlinkTimer), LED_BLINK_LINK_INTERVAL_ALPHA);
234 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("CurrLedState %d\n", pLed->CurrLedState));
235 } else if (!check_fwstate(pmlmepriv, _FW_LINKED)) {
236 pLed->bLedNoLinkBlinkInProgress = true;
237 pLed->CurrLedState = LED_BLINK_SLOWLY;
239 pLed->BlinkingLedState = RTW_LED_OFF;
241 pLed->BlinkingLedState = RTW_LED_ON;
242 _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA);
243 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("CurrLedState %d\n", pLed->CurrLedState));
245 pLed->bLedScanBlinkInProgress = false;
248 pLed->BlinkingLedState = RTW_LED_OFF;
250 pLed->BlinkingLedState = RTW_LED_ON;
251 _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA);
256 if (pLed->BlinkTimes == 0)
257 bStopBlinking = true;
259 if (check_fwstate(pmlmepriv, _FW_LINKED)) {
260 pLed->bLedLinkBlinkInProgress = true;
261 pLed->CurrLedState = LED_BLINK_NORMAL;
263 pLed->BlinkingLedState = RTW_LED_OFF;
265 pLed->BlinkingLedState = RTW_LED_ON;
266 _set_timer(&(pLed->BlinkTimer), LED_BLINK_LINK_INTERVAL_ALPHA);
267 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("CurrLedState %d\n", pLed->CurrLedState));
268 } else if (!check_fwstate(pmlmepriv, _FW_LINKED)) {
269 pLed->bLedNoLinkBlinkInProgress = true;
270 pLed->CurrLedState = LED_BLINK_SLOWLY;
272 pLed->BlinkingLedState = RTW_LED_OFF;
274 pLed->BlinkingLedState = RTW_LED_ON;
275 _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA);
276 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("CurrLedState %d\n", pLed->CurrLedState));
278 pLed->BlinkTimes = 0;
279 pLed->bLedBlinkInProgress = false;
282 pLed->BlinkingLedState = RTW_LED_OFF;
284 pLed->BlinkingLedState = RTW_LED_ON;
285 _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA);
290 pLed->BlinkingLedState = RTW_LED_OFF;
292 pLed->BlinkingLedState = RTW_LED_ON;
293 _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA);
295 case LED_BLINK_WPS_STOP: /* WPS success */
296 if (pLed->BlinkingLedState == RTW_LED_ON)
297 bStopBlinking = false;
299 bStopBlinking = true;
302 pLed->bLedLinkBlinkInProgress = true;
303 pLed->CurrLedState = LED_BLINK_NORMAL;
305 pLed->BlinkingLedState = RTW_LED_OFF;
307 pLed->BlinkingLedState = RTW_LED_ON;
308 _set_timer(&(pLed->BlinkTimer), LED_BLINK_LINK_INTERVAL_ALPHA);
309 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("CurrLedState %d\n", pLed->CurrLedState));
311 pLed->bLedWPSBlinkInProgress = false;
313 pLed->BlinkingLedState = RTW_LED_OFF;
314 _set_timer(&(pLed->BlinkTimer), LED_BLINK_WPS_SUCESS_INTERVAL_ALPHA);
322 static void SwLedBlink2(struct LED_871x *pLed)
324 struct adapter *padapter = pLed->padapter;
325 struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
326 u8 bStopBlinking = false;
328 /* Change LED according to BlinkingLedState specified. */
329 if (pLed->BlinkingLedState == RTW_LED_ON) {
330 SwLedOn(padapter, pLed);
331 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("Blinktimes (%d): turn on\n", pLed->BlinkTimes));
333 SwLedOff(padapter, pLed);
334 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("Blinktimes (%d): turn off\n", pLed->BlinkTimes));
337 switch (pLed->CurrLedState) {
340 if (pLed->BlinkTimes == 0)
341 bStopBlinking = true;
343 if (padapter->pwrctrlpriv.rf_pwrstate != rf_on) {
344 SwLedOff(padapter, pLed);
345 } else if (check_fwstate(pmlmepriv, _FW_LINKED)) {
346 pLed->CurrLedState = RTW_LED_ON;
347 pLed->BlinkingLedState = RTW_LED_ON;
348 SwLedOn(padapter, pLed);
349 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("stop scan blink CurrLedState %d\n", pLed->CurrLedState));
351 } else if (!check_fwstate(pmlmepriv, _FW_LINKED)) {
352 pLed->CurrLedState = RTW_LED_OFF;
353 pLed->BlinkingLedState = RTW_LED_OFF;
354 SwLedOff(padapter, pLed);
355 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("stop scan blink CurrLedState %d\n", pLed->CurrLedState));
357 pLed->bLedScanBlinkInProgress = false;
359 if (padapter->pwrctrlpriv.rf_pwrstate != rf_on) {
360 SwLedOff(padapter, pLed);
363 pLed->BlinkingLedState = RTW_LED_OFF;
365 pLed->BlinkingLedState = RTW_LED_ON;
366 _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA);
372 if (pLed->BlinkTimes == 0)
373 bStopBlinking = true;
375 if (padapter->pwrctrlpriv.rf_pwrstate != rf_on) {
376 SwLedOff(padapter, pLed);
377 } else if (check_fwstate(pmlmepriv, _FW_LINKED)) {
378 pLed->CurrLedState = RTW_LED_ON;
379 pLed->BlinkingLedState = RTW_LED_ON;
380 SwLedOn(padapter, pLed);
381 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("stop CurrLedState %d\n", pLed->CurrLedState));
382 } else if (!check_fwstate(pmlmepriv, _FW_LINKED)) {
383 pLed->CurrLedState = RTW_LED_OFF;
384 pLed->BlinkingLedState = RTW_LED_OFF;
385 SwLedOff(padapter, pLed);
386 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("stop CurrLedState %d\n", pLed->CurrLedState));
388 pLed->bLedBlinkInProgress = false;
390 if (padapter->pwrctrlpriv.rf_pwrstate != rf_on) {
391 SwLedOff(padapter, pLed);
394 pLed->BlinkingLedState = RTW_LED_OFF;
396 pLed->BlinkingLedState = RTW_LED_ON;
397 _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA);
406 static void SwLedBlink3(struct LED_871x *pLed)
408 struct adapter *padapter = pLed->padapter;
409 struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
410 u8 bStopBlinking = false;
412 /* Change LED according to BlinkingLedState specified. */
413 if (pLed->BlinkingLedState == RTW_LED_ON) {
414 SwLedOn(padapter, pLed);
415 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("Blinktimes (%d): turn on\n", pLed->BlinkTimes));
417 if (pLed->CurrLedState != LED_BLINK_WPS_STOP)
418 SwLedOff(padapter, pLed);
419 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("Blinktimes (%d): turn off\n", pLed->BlinkTimes));
422 switch (pLed->CurrLedState) {
425 if (pLed->BlinkTimes == 0)
426 bStopBlinking = true;
428 if (padapter->pwrctrlpriv.rf_pwrstate != rf_on) {
429 SwLedOff(padapter, pLed);
430 } else if (check_fwstate(pmlmepriv, _FW_LINKED)) {
431 pLed->CurrLedState = RTW_LED_ON;
432 pLed->BlinkingLedState = RTW_LED_ON;
434 SwLedOn(padapter, pLed);
435 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("CurrLedState %d\n", pLed->CurrLedState));
436 } else if (!check_fwstate(pmlmepriv, _FW_LINKED)) {
437 pLed->CurrLedState = RTW_LED_OFF;
438 pLed->BlinkingLedState = RTW_LED_OFF;
440 SwLedOff(padapter, pLed);
441 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("CurrLedState %d\n", pLed->CurrLedState));
443 pLed->bLedScanBlinkInProgress = false;
445 if (padapter->pwrctrlpriv.rf_pwrstate != rf_on) {
446 SwLedOff(padapter, pLed);
449 pLed->BlinkingLedState = RTW_LED_OFF;
451 pLed->BlinkingLedState = RTW_LED_ON;
452 _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA);
458 if (pLed->BlinkTimes == 0)
459 bStopBlinking = true;
461 if (padapter->pwrctrlpriv.rf_pwrstate != rf_on) {
462 SwLedOff(padapter, pLed);
463 } else if (check_fwstate(pmlmepriv, _FW_LINKED)) {
464 pLed->CurrLedState = RTW_LED_ON;
465 pLed->BlinkingLedState = RTW_LED_ON;
467 SwLedOn(padapter, pLed);
468 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("CurrLedState %d\n", pLed->CurrLedState));
469 } else if (!check_fwstate(pmlmepriv, _FW_LINKED)) {
470 pLed->CurrLedState = RTW_LED_OFF;
471 pLed->BlinkingLedState = RTW_LED_OFF;
474 SwLedOff(padapter, pLed);
475 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("CurrLedState %d\n", pLed->CurrLedState));
477 pLed->bLedBlinkInProgress = false;
479 if (padapter->pwrctrlpriv.rf_pwrstate != rf_on) {
480 SwLedOff(padapter, pLed);
483 pLed->BlinkingLedState = RTW_LED_OFF;
485 pLed->BlinkingLedState = RTW_LED_ON;
486 _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA);
492 pLed->BlinkingLedState = RTW_LED_OFF;
494 pLed->BlinkingLedState = RTW_LED_ON;
495 _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA);
497 case LED_BLINK_WPS_STOP: /* WPS success */
498 if (pLed->BlinkingLedState == RTW_LED_ON) {
499 pLed->BlinkingLedState = RTW_LED_OFF;
500 _set_timer(&(pLed->BlinkTimer), LED_BLINK_WPS_SUCESS_INTERVAL_ALPHA);
501 bStopBlinking = false;
503 bStopBlinking = true;
506 if (padapter->pwrctrlpriv.rf_pwrstate != rf_on) {
507 SwLedOff(padapter, pLed);
509 pLed->CurrLedState = RTW_LED_ON;
510 pLed->BlinkingLedState = RTW_LED_ON;
511 SwLedOn(padapter, pLed);
512 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("CurrLedState %d\n", pLed->CurrLedState));
514 pLed->bLedWPSBlinkInProgress = false;
522 static void SwLedBlink4(struct LED_871x *pLed)
524 struct adapter *padapter = pLed->padapter;
525 struct led_priv *ledpriv = &(padapter->ledpriv);
526 struct LED_871x *pLed1 = &(ledpriv->SwLed1);
527 u8 bStopBlinking = false;
529 /* Change LED according to BlinkingLedState specified. */
530 if (pLed->BlinkingLedState == RTW_LED_ON) {
531 SwLedOn(padapter, pLed);
532 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("Blinktimes (%d): turn on\n", pLed->BlinkTimes));
534 SwLedOff(padapter, pLed);
535 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("Blinktimes (%d): turn off\n", pLed->BlinkTimes));
538 if (!pLed1->bLedWPSBlinkInProgress && pLed1->BlinkingLedState == LED_UNKNOWN) {
539 pLed1->BlinkingLedState = RTW_LED_OFF;
540 pLed1->CurrLedState = RTW_LED_OFF;
541 SwLedOff(padapter, pLed1);
544 switch (pLed->CurrLedState) {
545 case LED_BLINK_SLOWLY:
547 pLed->BlinkingLedState = RTW_LED_OFF;
549 pLed->BlinkingLedState = RTW_LED_ON;
550 _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA);
552 case LED_BLINK_StartToBlink:
554 pLed->BlinkingLedState = RTW_LED_OFF;
555 _set_timer(&(pLed->BlinkTimer), LED_BLINK_SLOWLY_INTERVAL);
557 pLed->BlinkingLedState = RTW_LED_ON;
558 _set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL);
563 if (pLed->BlinkTimes == 0)
564 bStopBlinking = false;
566 if (padapter->pwrctrlpriv.rf_pwrstate != rf_on && padapter->pwrctrlpriv.rfoff_reason > RF_CHANGE_BY_PS) {
567 SwLedOff(padapter, pLed);
569 pLed->bLedNoLinkBlinkInProgress = false;
570 pLed->CurrLedState = LED_BLINK_SLOWLY;
572 pLed->BlinkingLedState = RTW_LED_OFF;
574 pLed->BlinkingLedState = RTW_LED_ON;
575 _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA);
577 pLed->bLedScanBlinkInProgress = false;
579 if (padapter->pwrctrlpriv.rf_pwrstate != rf_on && padapter->pwrctrlpriv.rfoff_reason > RF_CHANGE_BY_PS) {
580 SwLedOff(padapter, pLed);
583 pLed->BlinkingLedState = RTW_LED_OFF;
585 pLed->BlinkingLedState = RTW_LED_ON;
586 _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA);
592 if (pLed->BlinkTimes == 0)
593 bStopBlinking = true;
595 if (padapter->pwrctrlpriv.rf_pwrstate != rf_on && padapter->pwrctrlpriv.rfoff_reason > RF_CHANGE_BY_PS) {
596 SwLedOff(padapter, pLed);
598 pLed->bLedNoLinkBlinkInProgress = true;
599 pLed->CurrLedState = LED_BLINK_SLOWLY;
601 pLed->BlinkingLedState = RTW_LED_OFF;
603 pLed->BlinkingLedState = RTW_LED_ON;
604 _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA);
606 pLed->bLedBlinkInProgress = false;
608 if (padapter->pwrctrlpriv.rf_pwrstate != rf_on && padapter->pwrctrlpriv.rfoff_reason > RF_CHANGE_BY_PS) {
609 SwLedOff(padapter, pLed);
612 pLed->BlinkingLedState = RTW_LED_OFF;
614 pLed->BlinkingLedState = RTW_LED_ON;
615 _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA);
621 pLed->BlinkingLedState = RTW_LED_OFF;
622 _set_timer(&(pLed->BlinkTimer), LED_BLINK_SLOWLY_INTERVAL);
624 pLed->BlinkingLedState = RTW_LED_ON;
625 _set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL);
628 case LED_BLINK_WPS_STOP: /* WPS authentication fail */
630 pLed->BlinkingLedState = RTW_LED_OFF;
632 pLed->BlinkingLedState = RTW_LED_ON;
634 _set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL);
636 case LED_BLINK_WPS_STOP_OVERLAP: /* WPS session overlap */
638 if (pLed->BlinkTimes == 0) {
640 pLed->BlinkTimes = 1;
642 bStopBlinking = true;
646 pLed->BlinkTimes = 10;
647 pLed->BlinkingLedState = RTW_LED_ON;
648 _set_timer(&(pLed->BlinkTimer), LED_BLINK_LINK_INTERVAL_ALPHA);
651 pLed->BlinkingLedState = RTW_LED_OFF;
653 pLed->BlinkingLedState = RTW_LED_ON;
655 _set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL);
661 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("SwLedBlink4 CurrLedState %d\n", pLed->CurrLedState));
664 static void SwLedBlink5(struct LED_871x *pLed)
666 struct adapter *padapter = pLed->padapter;
667 u8 bStopBlinking = false;
669 /* Change LED according to BlinkingLedState specified. */
670 if (pLed->BlinkingLedState == RTW_LED_ON) {
671 SwLedOn(padapter, pLed);
672 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("Blinktimes (%d): turn on\n", pLed->BlinkTimes));
674 SwLedOff(padapter, pLed);
675 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("Blinktimes (%d): turn off\n", pLed->BlinkTimes));
678 switch (pLed->CurrLedState) {
681 if (pLed->BlinkTimes == 0)
682 bStopBlinking = true;
685 if (padapter->pwrctrlpriv.rf_pwrstate != rf_on && padapter->pwrctrlpriv.rfoff_reason > RF_CHANGE_BY_PS) {
686 pLed->CurrLedState = RTW_LED_OFF;
687 pLed->BlinkingLedState = RTW_LED_OFF;
689 SwLedOff(padapter, pLed);
691 pLed->CurrLedState = RTW_LED_ON;
692 pLed->BlinkingLedState = RTW_LED_ON;
694 _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA);
697 pLed->bLedScanBlinkInProgress = false;
699 if (padapter->pwrctrlpriv.rf_pwrstate != rf_on && padapter->pwrctrlpriv.rfoff_reason > RF_CHANGE_BY_PS) {
700 SwLedOff(padapter, pLed);
703 pLed->BlinkingLedState = RTW_LED_OFF;
705 pLed->BlinkingLedState = RTW_LED_ON;
706 _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA);
712 if (pLed->BlinkTimes == 0)
713 bStopBlinking = true;
716 if (padapter->pwrctrlpriv.rf_pwrstate != rf_on && padapter->pwrctrlpriv.rfoff_reason > RF_CHANGE_BY_PS) {
717 pLed->CurrLedState = RTW_LED_OFF;
718 pLed->BlinkingLedState = RTW_LED_OFF;
720 SwLedOff(padapter, pLed);
722 pLed->CurrLedState = RTW_LED_ON;
723 pLed->BlinkingLedState = RTW_LED_ON;
725 _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA);
728 pLed->bLedBlinkInProgress = false;
730 if (padapter->pwrctrlpriv.rf_pwrstate != rf_on && padapter->pwrctrlpriv.rfoff_reason > RF_CHANGE_BY_PS) {
731 SwLedOff(padapter, pLed);
734 pLed->BlinkingLedState = RTW_LED_OFF;
736 pLed->BlinkingLedState = RTW_LED_ON;
737 _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA);
746 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("SwLedBlink5 CurrLedState %d\n", pLed->CurrLedState));
749 static void SwLedBlink6(struct LED_871x *pLed)
751 struct adapter *padapter = pLed->padapter;
753 /* Change LED according to BlinkingLedState specified. */
754 if (pLed->BlinkingLedState == RTW_LED_ON) {
755 SwLedOn(padapter, pLed);
756 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("Blinktimes (%d): turn on\n", pLed->BlinkTimes));
758 SwLedOff(padapter, pLed);
759 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("Blinktimes (%d): turn off\n", pLed->BlinkTimes));
762 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("<==== blink6\n"));
765 /* ALPHA, added by chiyoko, 20090106 */
766 static void SwLedControlMode1(struct adapter *padapter, enum LED_CTL_MODE LedAction)
768 struct led_priv *ledpriv = &(padapter->ledpriv);
769 struct LED_871x *pLed = &(ledpriv->SwLed0);
770 struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
773 case LED_CTL_POWER_ON:
774 case LED_CTL_START_TO_LINK:
775 case LED_CTL_NO_LINK:
776 if (!pLed->bLedNoLinkBlinkInProgress) {
777 if (pLed->CurrLedState == LED_BLINK_SCAN || IS_LED_WPS_BLINKING(pLed))
779 if (pLed->bLedLinkBlinkInProgress) {
780 _cancel_timer_ex(&(pLed->BlinkTimer));
781 pLed->bLedLinkBlinkInProgress = false;
783 if (pLed->bLedBlinkInProgress) {
784 _cancel_timer_ex(&(pLed->BlinkTimer));
785 pLed->bLedBlinkInProgress = false;
788 pLed->bLedNoLinkBlinkInProgress = true;
789 pLed->CurrLedState = LED_BLINK_SLOWLY;
791 pLed->BlinkingLedState = RTW_LED_OFF;
793 pLed->BlinkingLedState = RTW_LED_ON;
794 _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA);
798 if (!pLed->bLedLinkBlinkInProgress) {
799 if (pLed->CurrLedState == LED_BLINK_SCAN || IS_LED_WPS_BLINKING(pLed))
801 if (pLed->bLedNoLinkBlinkInProgress) {
802 _cancel_timer_ex(&(pLed->BlinkTimer));
803 pLed->bLedNoLinkBlinkInProgress = false;
805 if (pLed->bLedBlinkInProgress) {
806 _cancel_timer_ex(&(pLed->BlinkTimer));
807 pLed->bLedBlinkInProgress = false;
809 pLed->bLedLinkBlinkInProgress = true;
810 pLed->CurrLedState = LED_BLINK_NORMAL;
812 pLed->BlinkingLedState = RTW_LED_OFF;
814 pLed->BlinkingLedState = RTW_LED_ON;
815 _set_timer(&(pLed->BlinkTimer), LED_BLINK_LINK_INTERVAL_ALPHA);
818 case LED_CTL_SITE_SURVEY:
819 if ((pmlmepriv->LinkDetectInfo.bBusyTraffic) && (check_fwstate(pmlmepriv, _FW_LINKED))) {
821 } else if (!pLed->bLedScanBlinkInProgress) {
822 if (IS_LED_WPS_BLINKING(pLed))
824 if (pLed->bLedNoLinkBlinkInProgress) {
825 _cancel_timer_ex(&(pLed->BlinkTimer));
826 pLed->bLedNoLinkBlinkInProgress = false;
828 if (pLed->bLedLinkBlinkInProgress) {
829 _cancel_timer_ex(&(pLed->BlinkTimer));
830 pLed->bLedLinkBlinkInProgress = false;
832 if (pLed->bLedBlinkInProgress) {
833 _cancel_timer_ex(&(pLed->BlinkTimer));
834 pLed->bLedBlinkInProgress = false;
836 pLed->bLedScanBlinkInProgress = true;
837 pLed->CurrLedState = LED_BLINK_SCAN;
838 pLed->BlinkTimes = 24;
840 pLed->BlinkingLedState = RTW_LED_OFF;
842 pLed->BlinkingLedState = RTW_LED_ON;
843 _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA);
848 if (!pLed->bLedBlinkInProgress) {
849 if (pLed->CurrLedState == LED_BLINK_SCAN || IS_LED_WPS_BLINKING(pLed))
851 if (pLed->bLedNoLinkBlinkInProgress) {
852 _cancel_timer_ex(&(pLed->BlinkTimer));
853 pLed->bLedNoLinkBlinkInProgress = false;
855 if (pLed->bLedLinkBlinkInProgress) {
856 _cancel_timer_ex(&(pLed->BlinkTimer));
857 pLed->bLedLinkBlinkInProgress = false;
859 pLed->bLedBlinkInProgress = true;
860 pLed->CurrLedState = LED_BLINK_TXRX;
861 pLed->BlinkTimes = 2;
863 pLed->BlinkingLedState = RTW_LED_OFF;
865 pLed->BlinkingLedState = RTW_LED_ON;
866 _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA);
869 case LED_CTL_START_WPS: /* wait until xinpin finish */
870 case LED_CTL_START_WPS_BOTTON:
871 if (!pLed->bLedWPSBlinkInProgress) {
872 if (pLed->bLedNoLinkBlinkInProgress) {
873 _cancel_timer_ex(&(pLed->BlinkTimer));
874 pLed->bLedNoLinkBlinkInProgress = false;
876 if (pLed->bLedLinkBlinkInProgress) {
877 _cancel_timer_ex(&(pLed->BlinkTimer));
878 pLed->bLedLinkBlinkInProgress = false;
880 if (pLed->bLedBlinkInProgress) {
881 _cancel_timer_ex(&(pLed->BlinkTimer));
882 pLed->bLedBlinkInProgress = false;
884 if (pLed->bLedScanBlinkInProgress) {
885 _cancel_timer_ex(&(pLed->BlinkTimer));
886 pLed->bLedScanBlinkInProgress = false;
888 pLed->bLedWPSBlinkInProgress = true;
889 pLed->CurrLedState = LED_BLINK_WPS;
891 pLed->BlinkingLedState = RTW_LED_OFF;
893 pLed->BlinkingLedState = RTW_LED_ON;
894 _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA);
897 case LED_CTL_STOP_WPS:
898 if (pLed->bLedNoLinkBlinkInProgress) {
899 _cancel_timer_ex(&(pLed->BlinkTimer));
900 pLed->bLedNoLinkBlinkInProgress = false;
902 if (pLed->bLedLinkBlinkInProgress) {
903 _cancel_timer_ex(&(pLed->BlinkTimer));
904 pLed->bLedLinkBlinkInProgress = false;
906 if (pLed->bLedBlinkInProgress) {
907 _cancel_timer_ex(&(pLed->BlinkTimer));
908 pLed->bLedBlinkInProgress = false;
910 if (pLed->bLedScanBlinkInProgress) {
911 _cancel_timer_ex(&(pLed->BlinkTimer));
912 pLed->bLedScanBlinkInProgress = false;
914 if (pLed->bLedWPSBlinkInProgress)
915 _cancel_timer_ex(&(pLed->BlinkTimer));
917 pLed->bLedWPSBlinkInProgress = true;
918 pLed->CurrLedState = LED_BLINK_WPS_STOP;
920 pLed->BlinkingLedState = RTW_LED_OFF;
921 _set_timer(&(pLed->BlinkTimer), LED_BLINK_WPS_SUCESS_INTERVAL_ALPHA);
923 pLed->BlinkingLedState = RTW_LED_ON;
924 _set_timer(&(pLed->BlinkTimer), 0);
927 case LED_CTL_STOP_WPS_FAIL:
928 if (pLed->bLedWPSBlinkInProgress) {
929 _cancel_timer_ex(&(pLed->BlinkTimer));
930 pLed->bLedWPSBlinkInProgress = false;
932 pLed->bLedNoLinkBlinkInProgress = true;
933 pLed->CurrLedState = LED_BLINK_SLOWLY;
935 pLed->BlinkingLedState = RTW_LED_OFF;
937 pLed->BlinkingLedState = RTW_LED_ON;
938 _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA);
940 case LED_CTL_POWER_OFF:
941 pLed->CurrLedState = RTW_LED_OFF;
942 pLed->BlinkingLedState = RTW_LED_OFF;
943 if (pLed->bLedNoLinkBlinkInProgress) {
944 _cancel_timer_ex(&(pLed->BlinkTimer));
945 pLed->bLedNoLinkBlinkInProgress = false;
947 if (pLed->bLedLinkBlinkInProgress) {
948 _cancel_timer_ex(&(pLed->BlinkTimer));
949 pLed->bLedLinkBlinkInProgress = false;
951 if (pLed->bLedBlinkInProgress) {
952 _cancel_timer_ex(&(pLed->BlinkTimer));
953 pLed->bLedBlinkInProgress = false;
955 if (pLed->bLedWPSBlinkInProgress) {
956 _cancel_timer_ex(&(pLed->BlinkTimer));
957 pLed->bLedWPSBlinkInProgress = false;
959 if (pLed->bLedScanBlinkInProgress) {
960 _cancel_timer_ex(&(pLed->BlinkTimer));
961 pLed->bLedScanBlinkInProgress = false;
963 SwLedOff(padapter, pLed);
969 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("Led %d\n", pLed->CurrLedState));
972 /* Arcadyan/Sitecom , added by chiyoko, 20090216 */
973 static void SwLedControlMode2(struct adapter *padapter, enum LED_CTL_MODE LedAction)
975 struct led_priv *ledpriv = &(padapter->ledpriv);
976 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
977 struct LED_871x *pLed = &(ledpriv->SwLed0);
980 case LED_CTL_SITE_SURVEY:
981 if (pmlmepriv->LinkDetectInfo.bBusyTraffic) {
982 } else if (!pLed->bLedScanBlinkInProgress) {
983 if (IS_LED_WPS_BLINKING(pLed))
986 if (pLed->bLedBlinkInProgress) {
987 _cancel_timer_ex(&(pLed->BlinkTimer));
988 pLed->bLedBlinkInProgress = false;
990 pLed->bLedScanBlinkInProgress = true;
991 pLed->CurrLedState = LED_BLINK_SCAN;
992 pLed->BlinkTimes = 24;
994 pLed->BlinkingLedState = RTW_LED_OFF;
996 pLed->BlinkingLedState = RTW_LED_ON;
997 _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA);
1002 if ((!pLed->bLedBlinkInProgress) && (check_fwstate(pmlmepriv, _FW_LINKED))) {
1003 if (pLed->CurrLedState == LED_BLINK_SCAN || IS_LED_WPS_BLINKING(pLed))
1005 pLed->bLedBlinkInProgress = true;
1006 pLed->CurrLedState = LED_BLINK_TXRX;
1007 pLed->BlinkTimes = 2;
1009 pLed->BlinkingLedState = RTW_LED_OFF;
1011 pLed->BlinkingLedState = RTW_LED_ON;
1012 _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA);
1016 pLed->CurrLedState = RTW_LED_ON;
1017 pLed->BlinkingLedState = RTW_LED_ON;
1018 if (pLed->bLedBlinkInProgress) {
1019 _cancel_timer_ex(&(pLed->BlinkTimer));
1020 pLed->bLedBlinkInProgress = false;
1022 if (pLed->bLedScanBlinkInProgress) {
1023 _cancel_timer_ex(&(pLed->BlinkTimer));
1024 pLed->bLedScanBlinkInProgress = false;
1026 _set_timer(&(pLed->BlinkTimer), 0);
1028 case LED_CTL_START_WPS: /* wait until xinpin finish */
1029 case LED_CTL_START_WPS_BOTTON:
1030 if (!pLed->bLedWPSBlinkInProgress) {
1031 if (pLed->bLedBlinkInProgress) {
1032 _cancel_timer_ex(&(pLed->BlinkTimer));
1033 pLed->bLedBlinkInProgress = false;
1035 if (pLed->bLedScanBlinkInProgress) {
1036 _cancel_timer_ex(&(pLed->BlinkTimer));
1037 pLed->bLedScanBlinkInProgress = false;
1039 pLed->bLedWPSBlinkInProgress = true;
1040 pLed->CurrLedState = RTW_LED_ON;
1041 pLed->BlinkingLedState = RTW_LED_ON;
1042 _set_timer(&(pLed->BlinkTimer), 0);
1045 case LED_CTL_STOP_WPS:
1046 pLed->bLedWPSBlinkInProgress = false;
1047 if (padapter->pwrctrlpriv.rf_pwrstate != rf_on) {
1048 SwLedOff(padapter, pLed);
1050 pLed->CurrLedState = RTW_LED_ON;
1051 pLed->BlinkingLedState = RTW_LED_ON;
1052 _set_timer(&(pLed->BlinkTimer), 0);
1053 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("CurrLedState %d\n", pLed->CurrLedState));
1056 case LED_CTL_STOP_WPS_FAIL:
1057 pLed->bLedWPSBlinkInProgress = false;
1058 if (padapter->pwrctrlpriv.rf_pwrstate != rf_on) {
1059 SwLedOff(padapter, pLed);
1061 pLed->CurrLedState = RTW_LED_OFF;
1062 pLed->BlinkingLedState = RTW_LED_OFF;
1063 _set_timer(&(pLed->BlinkTimer), 0);
1064 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("CurrLedState %d\n", pLed->CurrLedState));
1067 case LED_CTL_START_TO_LINK:
1068 case LED_CTL_NO_LINK:
1069 if (!IS_LED_BLINKING(pLed)) {
1070 pLed->CurrLedState = RTW_LED_OFF;
1071 pLed->BlinkingLedState = RTW_LED_OFF;
1072 _set_timer(&(pLed->BlinkTimer), 0);
1075 case LED_CTL_POWER_OFF:
1076 pLed->CurrLedState = RTW_LED_OFF;
1077 pLed->BlinkingLedState = RTW_LED_OFF;
1078 if (pLed->bLedBlinkInProgress) {
1079 _cancel_timer_ex(&(pLed->BlinkTimer));
1080 pLed->bLedBlinkInProgress = false;
1082 if (pLed->bLedScanBlinkInProgress) {
1083 _cancel_timer_ex(&(pLed->BlinkTimer));
1084 pLed->bLedScanBlinkInProgress = false;
1086 if (pLed->bLedWPSBlinkInProgress) {
1087 _cancel_timer_ex(&(pLed->BlinkTimer));
1088 pLed->bLedWPSBlinkInProgress = false;
1091 _set_timer(&(pLed->BlinkTimer), 0);
1097 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("CurrLedState %d\n", pLed->CurrLedState));
1100 /* COREGA, added by chiyoko, 20090316 */
1101 static void SwLedControlMode3(struct adapter *padapter, enum LED_CTL_MODE LedAction)
1103 struct led_priv *ledpriv = &(padapter->ledpriv);
1104 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
1105 struct LED_871x *pLed = &(ledpriv->SwLed0);
1107 switch (LedAction) {
1108 case LED_CTL_SITE_SURVEY:
1109 if (pmlmepriv->LinkDetectInfo.bBusyTraffic) {
1110 } else if (!pLed->bLedScanBlinkInProgress) {
1111 if (IS_LED_WPS_BLINKING(pLed))
1114 if (pLed->bLedBlinkInProgress) {
1115 _cancel_timer_ex(&(pLed->BlinkTimer));
1116 pLed->bLedBlinkInProgress = false;
1118 pLed->bLedScanBlinkInProgress = true;
1119 pLed->CurrLedState = LED_BLINK_SCAN;
1120 pLed->BlinkTimes = 24;
1122 pLed->BlinkingLedState = RTW_LED_OFF;
1124 pLed->BlinkingLedState = RTW_LED_ON;
1125 _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA);
1130 if ((!pLed->bLedBlinkInProgress) && (check_fwstate(pmlmepriv, _FW_LINKED))) {
1131 if (pLed->CurrLedState == LED_BLINK_SCAN || IS_LED_WPS_BLINKING(pLed))
1133 pLed->bLedBlinkInProgress = true;
1134 pLed->CurrLedState = LED_BLINK_TXRX;
1135 pLed->BlinkTimes = 2;
1137 pLed->BlinkingLedState = RTW_LED_OFF;
1139 pLed->BlinkingLedState = RTW_LED_ON;
1140 _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA);
1144 if (IS_LED_WPS_BLINKING(pLed))
1146 pLed->CurrLedState = RTW_LED_ON;
1147 pLed->BlinkingLedState = RTW_LED_ON;
1148 if (pLed->bLedBlinkInProgress) {
1149 _cancel_timer_ex(&(pLed->BlinkTimer));
1150 pLed->bLedBlinkInProgress = false;
1152 if (pLed->bLedScanBlinkInProgress) {
1153 _cancel_timer_ex(&(pLed->BlinkTimer));
1154 pLed->bLedScanBlinkInProgress = false;
1157 _set_timer(&(pLed->BlinkTimer), 0);
1159 case LED_CTL_START_WPS: /* wait until xinpin finish */
1160 case LED_CTL_START_WPS_BOTTON:
1161 if (!pLed->bLedWPSBlinkInProgress) {
1162 if (pLed->bLedBlinkInProgress) {
1163 _cancel_timer_ex(&(pLed->BlinkTimer));
1164 pLed->bLedBlinkInProgress = false;
1166 if (pLed->bLedScanBlinkInProgress) {
1167 _cancel_timer_ex(&(pLed->BlinkTimer));
1168 pLed->bLedScanBlinkInProgress = false;
1170 pLed->bLedWPSBlinkInProgress = true;
1171 pLed->CurrLedState = LED_BLINK_WPS;
1173 pLed->BlinkingLedState = RTW_LED_OFF;
1175 pLed->BlinkingLedState = RTW_LED_ON;
1176 _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA);
1179 case LED_CTL_STOP_WPS:
1180 if (pLed->bLedWPSBlinkInProgress) {
1181 _cancel_timer_ex(&(pLed->BlinkTimer));
1182 pLed->bLedWPSBlinkInProgress = false;
1184 pLed->bLedWPSBlinkInProgress = true;
1187 pLed->CurrLedState = LED_BLINK_WPS_STOP;
1189 pLed->BlinkingLedState = RTW_LED_OFF;
1190 _set_timer(&(pLed->BlinkTimer), LED_BLINK_WPS_SUCESS_INTERVAL_ALPHA);
1192 pLed->BlinkingLedState = RTW_LED_ON;
1193 _set_timer(&(pLed->BlinkTimer), 0);
1196 case LED_CTL_STOP_WPS_FAIL:
1197 if (pLed->bLedWPSBlinkInProgress) {
1198 _cancel_timer_ex(&(pLed->BlinkTimer));
1199 pLed->bLedWPSBlinkInProgress = false;
1201 pLed->CurrLedState = RTW_LED_OFF;
1202 pLed->BlinkingLedState = RTW_LED_OFF;
1203 _set_timer(&(pLed->BlinkTimer), 0);
1205 case LED_CTL_START_TO_LINK:
1206 case LED_CTL_NO_LINK:
1207 if (!IS_LED_BLINKING(pLed)) {
1208 pLed->CurrLedState = RTW_LED_OFF;
1209 pLed->BlinkingLedState = RTW_LED_OFF;
1210 _set_timer(&(pLed->BlinkTimer), 0);
1213 case LED_CTL_POWER_OFF:
1214 pLed->CurrLedState = RTW_LED_OFF;
1215 pLed->BlinkingLedState = RTW_LED_OFF;
1216 if (pLed->bLedBlinkInProgress) {
1217 _cancel_timer_ex(&(pLed->BlinkTimer));
1218 pLed->bLedBlinkInProgress = false;
1220 if (pLed->bLedScanBlinkInProgress) {
1221 _cancel_timer_ex(&(pLed->BlinkTimer));
1222 pLed->bLedScanBlinkInProgress = false;
1224 if (pLed->bLedWPSBlinkInProgress) {
1225 _cancel_timer_ex(&(pLed->BlinkTimer));
1226 pLed->bLedWPSBlinkInProgress = false;
1229 _set_timer(&(pLed->BlinkTimer), 0);
1234 RT_TRACE(_module_rtl8712_led_c_, _drv_info_,
1235 ("CurrLedState %d\n", pLed->CurrLedState));
1238 /* Edimax-Belkin, added by chiyoko, 20090413 */
1239 static void SwLedControlMode4(struct adapter *padapter, enum LED_CTL_MODE LedAction)
1241 struct led_priv *ledpriv = &(padapter->ledpriv);
1242 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
1243 struct LED_871x *pLed = &(ledpriv->SwLed0);
1244 struct LED_871x *pLed1 = &(ledpriv->SwLed1);
1246 switch (LedAction) {
1247 case LED_CTL_START_TO_LINK:
1248 if (pLed1->bLedWPSBlinkInProgress) {
1249 pLed1->bLedWPSBlinkInProgress = false;
1250 _cancel_timer_ex(&(pLed1->BlinkTimer));
1252 pLed1->BlinkingLedState = RTW_LED_OFF;
1253 pLed1->CurrLedState = RTW_LED_OFF;
1256 _set_timer(&(pLed->BlinkTimer), 0);
1259 if (!pLed->bLedStartToLinkBlinkInProgress) {
1260 if (pLed->CurrLedState == LED_BLINK_SCAN || IS_LED_WPS_BLINKING(pLed))
1262 if (pLed->bLedBlinkInProgress) {
1263 _cancel_timer_ex(&(pLed->BlinkTimer));
1264 pLed->bLedBlinkInProgress = false;
1266 if (pLed->bLedNoLinkBlinkInProgress) {
1267 _cancel_timer_ex(&(pLed->BlinkTimer));
1268 pLed->bLedNoLinkBlinkInProgress = false;
1271 pLed->bLedStartToLinkBlinkInProgress = true;
1272 pLed->CurrLedState = LED_BLINK_StartToBlink;
1274 pLed->BlinkingLedState = RTW_LED_OFF;
1275 _set_timer(&(pLed->BlinkTimer), LED_BLINK_SLOWLY_INTERVAL);
1277 pLed->BlinkingLedState = RTW_LED_ON;
1278 _set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL);
1283 case LED_CTL_NO_LINK:
1285 if (LedAction == LED_CTL_LINK) {
1286 if (pLed1->bLedWPSBlinkInProgress) {
1287 pLed1->bLedWPSBlinkInProgress = false;
1288 _cancel_timer_ex(&(pLed1->BlinkTimer));
1290 pLed1->BlinkingLedState = RTW_LED_OFF;
1291 pLed1->CurrLedState = RTW_LED_OFF;
1294 _set_timer(&(pLed->BlinkTimer), 0);
1298 if (!pLed->bLedNoLinkBlinkInProgress) {
1299 if (pLed->CurrLedState == LED_BLINK_SCAN || IS_LED_WPS_BLINKING(pLed))
1301 if (pLed->bLedBlinkInProgress) {
1302 _cancel_timer_ex(&(pLed->BlinkTimer));
1303 pLed->bLedBlinkInProgress = false;
1306 pLed->bLedNoLinkBlinkInProgress = true;
1307 pLed->CurrLedState = LED_BLINK_SLOWLY;
1309 pLed->BlinkingLedState = RTW_LED_OFF;
1311 pLed->BlinkingLedState = RTW_LED_ON;
1312 _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA);
1315 case LED_CTL_SITE_SURVEY:
1316 if ((pmlmepriv->LinkDetectInfo.bBusyTraffic) && (check_fwstate(pmlmepriv, _FW_LINKED))) {
1317 } else if (!pLed->bLedScanBlinkInProgress) {
1318 if (IS_LED_WPS_BLINKING(pLed))
1321 if (pLed->bLedNoLinkBlinkInProgress) {
1322 _cancel_timer_ex(&(pLed->BlinkTimer));
1323 pLed->bLedNoLinkBlinkInProgress = false;
1325 if (pLed->bLedBlinkInProgress) {
1326 _cancel_timer_ex(&(pLed->BlinkTimer));
1327 pLed->bLedBlinkInProgress = false;
1329 pLed->bLedScanBlinkInProgress = true;
1330 pLed->CurrLedState = LED_BLINK_SCAN;
1331 pLed->BlinkTimes = 24;
1333 pLed->BlinkingLedState = RTW_LED_OFF;
1335 pLed->BlinkingLedState = RTW_LED_ON;
1336 _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA);
1341 if (!pLed->bLedBlinkInProgress) {
1342 if (pLed->CurrLedState == LED_BLINK_SCAN || IS_LED_WPS_BLINKING(pLed))
1344 if (pLed->bLedNoLinkBlinkInProgress) {
1345 _cancel_timer_ex(&(pLed->BlinkTimer));
1346 pLed->bLedNoLinkBlinkInProgress = false;
1348 pLed->bLedBlinkInProgress = true;
1349 pLed->CurrLedState = LED_BLINK_TXRX;
1350 pLed->BlinkTimes = 2;
1352 pLed->BlinkingLedState = RTW_LED_OFF;
1354 pLed->BlinkingLedState = RTW_LED_ON;
1355 _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA);
1358 case LED_CTL_START_WPS: /* wait until xinpin finish */
1359 case LED_CTL_START_WPS_BOTTON:
1360 if (pLed1->bLedWPSBlinkInProgress) {
1361 pLed1->bLedWPSBlinkInProgress = false;
1362 _cancel_timer_ex(&(pLed1->BlinkTimer));
1364 pLed1->BlinkingLedState = RTW_LED_OFF;
1365 pLed1->CurrLedState = RTW_LED_OFF;
1368 _set_timer(&(pLed->BlinkTimer), 0);
1371 if (!pLed->bLedWPSBlinkInProgress) {
1372 if (pLed->bLedNoLinkBlinkInProgress) {
1373 _cancel_timer_ex(&(pLed->BlinkTimer));
1374 pLed->bLedNoLinkBlinkInProgress = false;
1376 if (pLed->bLedBlinkInProgress) {
1377 _cancel_timer_ex(&(pLed->BlinkTimer));
1378 pLed->bLedBlinkInProgress = false;
1380 if (pLed->bLedScanBlinkInProgress) {
1381 _cancel_timer_ex(&(pLed->BlinkTimer));
1382 pLed->bLedScanBlinkInProgress = false;
1384 pLed->bLedWPSBlinkInProgress = true;
1385 pLed->CurrLedState = LED_BLINK_WPS;
1387 pLed->BlinkingLedState = RTW_LED_OFF;
1388 _set_timer(&(pLed->BlinkTimer), LED_BLINK_SLOWLY_INTERVAL);
1390 pLed->BlinkingLedState = RTW_LED_ON;
1391 _set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL);
1395 case LED_CTL_STOP_WPS: /* WPS connect success */
1396 if (pLed->bLedWPSBlinkInProgress) {
1397 _cancel_timer_ex(&(pLed->BlinkTimer));
1398 pLed->bLedWPSBlinkInProgress = false;
1401 pLed->bLedNoLinkBlinkInProgress = true;
1402 pLed->CurrLedState = LED_BLINK_SLOWLY;
1404 pLed->BlinkingLedState = RTW_LED_OFF;
1406 pLed->BlinkingLedState = RTW_LED_ON;
1407 _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA);
1410 case LED_CTL_STOP_WPS_FAIL: /* WPS authentication fail */
1411 if (pLed->bLedWPSBlinkInProgress) {
1412 _cancel_timer_ex(&(pLed->BlinkTimer));
1413 pLed->bLedWPSBlinkInProgress = false;
1415 pLed->bLedNoLinkBlinkInProgress = true;
1416 pLed->CurrLedState = LED_BLINK_SLOWLY;
1418 pLed->BlinkingLedState = RTW_LED_OFF;
1420 pLed->BlinkingLedState = RTW_LED_ON;
1421 _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA);
1424 if (pLed1->bLedWPSBlinkInProgress)
1425 _cancel_timer_ex(&(pLed1->BlinkTimer));
1427 pLed1->bLedWPSBlinkInProgress = true;
1428 pLed1->CurrLedState = LED_BLINK_WPS_STOP;
1430 pLed1->BlinkingLedState = RTW_LED_OFF;
1432 pLed1->BlinkingLedState = RTW_LED_ON;
1433 _set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL);
1435 case LED_CTL_STOP_WPS_FAIL_OVERLAP: /* WPS session overlap */
1436 if (pLed->bLedWPSBlinkInProgress) {
1437 _cancel_timer_ex(&(pLed->BlinkTimer));
1438 pLed->bLedWPSBlinkInProgress = false;
1440 pLed->bLedNoLinkBlinkInProgress = true;
1441 pLed->CurrLedState = LED_BLINK_SLOWLY;
1443 pLed->BlinkingLedState = RTW_LED_OFF;
1445 pLed->BlinkingLedState = RTW_LED_ON;
1446 _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA);
1449 if (pLed1->bLedWPSBlinkInProgress)
1450 _cancel_timer_ex(&(pLed1->BlinkTimer));
1452 pLed1->bLedWPSBlinkInProgress = true;
1453 pLed1->CurrLedState = LED_BLINK_WPS_STOP_OVERLAP;
1454 pLed1->BlinkTimes = 10;
1456 pLed1->BlinkingLedState = RTW_LED_OFF;
1458 pLed1->BlinkingLedState = RTW_LED_ON;
1459 _set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL);
1461 case LED_CTL_POWER_OFF:
1462 pLed->CurrLedState = RTW_LED_OFF;
1463 pLed->BlinkingLedState = RTW_LED_OFF;
1465 if (pLed->bLedNoLinkBlinkInProgress) {
1466 _cancel_timer_ex(&(pLed->BlinkTimer));
1467 pLed->bLedNoLinkBlinkInProgress = false;
1469 if (pLed->bLedLinkBlinkInProgress) {
1470 _cancel_timer_ex(&(pLed->BlinkTimer));
1471 pLed->bLedLinkBlinkInProgress = false;
1473 if (pLed->bLedBlinkInProgress) {
1474 _cancel_timer_ex(&(pLed->BlinkTimer));
1475 pLed->bLedBlinkInProgress = false;
1477 if (pLed->bLedWPSBlinkInProgress) {
1478 _cancel_timer_ex(&(pLed->BlinkTimer));
1479 pLed->bLedWPSBlinkInProgress = false;
1481 if (pLed->bLedScanBlinkInProgress) {
1482 _cancel_timer_ex(&(pLed->BlinkTimer));
1483 pLed->bLedScanBlinkInProgress = false;
1485 if (pLed->bLedStartToLinkBlinkInProgress) {
1486 _cancel_timer_ex(&(pLed->BlinkTimer));
1487 pLed->bLedStartToLinkBlinkInProgress = false;
1489 if (pLed1->bLedWPSBlinkInProgress) {
1490 _cancel_timer_ex(&(pLed1->BlinkTimer));
1491 pLed1->bLedWPSBlinkInProgress = false;
1493 pLed1->BlinkingLedState = LED_UNKNOWN;
1494 SwLedOff(padapter, pLed);
1495 SwLedOff(padapter, pLed1);
1501 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("Led %d\n", pLed->CurrLedState));
1506 /* Sercomm-Belkin, added by chiyoko, 20090415 */
1509 struct adapter *padapter,
1510 enum LED_CTL_MODE LedAction
1513 struct led_priv *ledpriv = &(padapter->ledpriv);
1514 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
1515 struct LED_871x *pLed = &(ledpriv->SwLed0);
1517 switch (LedAction) {
1518 case LED_CTL_POWER_ON:
1519 case LED_CTL_NO_LINK:
1520 case LED_CTL_LINK: /* solid blue */
1521 pLed->CurrLedState = RTW_LED_ON;
1522 pLed->BlinkingLedState = RTW_LED_ON;
1524 _set_timer(&(pLed->BlinkTimer), 0);
1526 case LED_CTL_SITE_SURVEY:
1527 if ((pmlmepriv->LinkDetectInfo.bBusyTraffic) && (check_fwstate(pmlmepriv, _FW_LINKED))) {
1528 } else if (!pLed->bLedScanBlinkInProgress) {
1529 if (pLed->bLedBlinkInProgress) {
1530 _cancel_timer_ex(&(pLed->BlinkTimer));
1531 pLed->bLedBlinkInProgress = false;
1533 pLed->bLedScanBlinkInProgress = true;
1534 pLed->CurrLedState = LED_BLINK_SCAN;
1535 pLed->BlinkTimes = 24;
1537 pLed->BlinkingLedState = RTW_LED_OFF;
1539 pLed->BlinkingLedState = RTW_LED_ON;
1540 _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA);
1545 if (!pLed->bLedBlinkInProgress) {
1546 if (pLed->CurrLedState == LED_BLINK_SCAN)
1548 pLed->bLedBlinkInProgress = true;
1549 pLed->CurrLedState = LED_BLINK_TXRX;
1550 pLed->BlinkTimes = 2;
1552 pLed->BlinkingLedState = RTW_LED_OFF;
1554 pLed->BlinkingLedState = RTW_LED_ON;
1555 _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA);
1558 case LED_CTL_POWER_OFF:
1559 pLed->CurrLedState = RTW_LED_OFF;
1560 pLed->BlinkingLedState = RTW_LED_OFF;
1562 if (pLed->bLedBlinkInProgress) {
1563 _cancel_timer_ex(&(pLed->BlinkTimer));
1564 pLed->bLedBlinkInProgress = false;
1566 SwLedOff(padapter, pLed);
1572 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("Led %d\n", pLed->CurrLedState));
1575 /* WNC-Corega, added by chiyoko, 20090902 */
1578 struct adapter *padapter,
1579 enum LED_CTL_MODE LedAction
1582 struct led_priv *ledpriv = &(padapter->ledpriv);
1583 struct LED_871x *pLed0 = &(ledpriv->SwLed0);
1585 switch (LedAction) {
1586 case LED_CTL_POWER_ON:
1588 case LED_CTL_NO_LINK:
1589 _cancel_timer_ex(&(pLed0->BlinkTimer));
1590 pLed0->CurrLedState = RTW_LED_ON;
1591 pLed0->BlinkingLedState = RTW_LED_ON;
1592 _set_timer(&(pLed0->BlinkTimer), 0);
1594 case LED_CTL_POWER_OFF:
1595 SwLedOff(padapter, pLed0);
1601 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("ledcontrol 6 Led %d\n", pLed0->CurrLedState));
1606 /* Handler function of LED Blinking. */
1607 /* We dispatch acture LED blink action according to LedStrategy. */
1609 void BlinkHandler(struct LED_871x *pLed)
1611 struct adapter *padapter = pLed->padapter;
1612 struct led_priv *ledpriv = &(padapter->ledpriv);
1614 if ((padapter->bSurpriseRemoved) || (padapter->bDriverStopped))
1617 switch (ledpriv->LedStrategy) {
1644 void LedControl8188eu(struct adapter *padapter, enum LED_CTL_MODE LedAction)
1646 struct led_priv *ledpriv = &(padapter->ledpriv);
1648 if ((padapter->bSurpriseRemoved) || (padapter->bDriverStopped) ||
1649 (!padapter->hw_init_completed))
1652 if (!ledpriv->bRegUseLed)
1655 if ((padapter->pwrctrlpriv.rf_pwrstate != rf_on &&
1656 padapter->pwrctrlpriv.rfoff_reason > RF_CHANGE_BY_PS) &&
1657 (LedAction == LED_CTL_TX || LedAction == LED_CTL_RX ||
1658 LedAction == LED_CTL_SITE_SURVEY ||
1659 LedAction == LED_CTL_LINK ||
1660 LedAction == LED_CTL_NO_LINK ||
1661 LedAction == LED_CTL_POWER_ON))
1664 switch (ledpriv->LedStrategy) {
1668 SwLedControlMode1(padapter, LedAction);
1671 SwLedControlMode2(padapter, LedAction);
1674 SwLedControlMode3(padapter, LedAction);
1677 SwLedControlMode4(padapter, LedAction);
1680 SwLedControlMode5(padapter, LedAction);
1683 SwLedControlMode6(padapter, LedAction);
1689 RT_TRACE(_module_rtl8712_led_c_, _drv_info_,
1690 ("LedStrategy:%d, LedAction %d\n",
1691 ledpriv->LedStrategy, LedAction));