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>
25 /* Callback function of LED BlinkTimer, */
26 /* it just schedules to corresponding BlinkWorkItem/led_blink_hdl */
28 void BlinkTimerCallback(void *data)
30 PLED_871x pLed = (PLED_871x)data;
31 _adapter *padapter = pLed->padapter;
34 if ((padapter->bSurpriseRemoved == true) || (padapter->bDriverStopped == true))
36 #ifdef CONFIG_LED_HANDLED_BY_CMD_THREAD
37 rtw_led_blink_cmd(padapter, pLed);
39 _set_workitem(&(pLed->BlinkWorkItem));
45 /* Callback function of LED BlinkWorkItem. */
46 /* We dispatch acture LED blink action according to LedStrategy. */
48 void BlinkWorkItemCallback(struct work_struct *work)
50 PLED_871x pLed = container_of(work, LED_871x, BlinkWorkItem);
56 /* Reset status of LED_871x object. */
58 void ResetLedStatus(PLED_871x pLed)
60 pLed->CurrLedState = RTW_LED_OFF; /* Current LED state. */
61 pLed->bLedOn = false; /* true if LED is ON, false if LED is OFF. */
63 pLed->bLedBlinkInProgress = false; /* true if it is blinking, false o.w.. */
64 pLed->bLedWPSBlinkInProgress = false;
66 pLed->BlinkTimes = 0; /* Number of times to toggle led state for blinking. */
67 pLed->BlinkingLedState = LED_UNKNOWN; /* Next state for blinking, either RTW_LED_ON or RTW_LED_OFF are. */
68 pLed->bLedNoLinkBlinkInProgress = false;
69 pLed->bLedLinkBlinkInProgress = false;
70 pLed->bLedStartToLinkBlinkInProgress = false;
71 pLed->bLedScanBlinkInProgress = false;
76 /* Initialize an LED_871x object. */
85 pLed->padapter = padapter;
86 pLed->LedPin = LedPin;
90 _init_timer(&(pLed->BlinkTimer), padapter->pnetdev, BlinkTimerCallback, pLed);
92 #if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI)
93 _init_workitem(&(pLed->BlinkWorkItem), BlinkWorkItemCallback, pLed);
100 /* DeInitialize an LED_871x object. */
107 _cancel_timer_ex(&(pLed->BlinkTimer));
108 _cancel_workitem_sync(&(pLed->BlinkWorkItem));
109 ResetLedStatus(pLed);
114 /* Implementation of LED blinking behavior. */
115 /* It toggle off LED and schedule corresponding timer if necessary. */
118 void SwLedOn(_adapter *padapter, PLED_871x pLed);
119 void SwLedOff(_adapter *padapter, PLED_871x pLed);
121 #define CONFIG_LED_REMOVE_HAL
123 void SwLedBlink(PLED_871x pLed)
125 _adapter *padapter = pLed->padapter;
126 struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
127 u8 stopblink = false;
129 /* Change LED according to BlinkingLedState specified. */
130 if (pLed->BlinkingLedState == RTW_LED_ON) {
131 SwLedOn(padapter, pLed);
132 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("Blinktimes (%d): turn on\n", pLed->BlinkTimes));
134 SwLedOff(padapter, pLed);
135 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("Blinktimes (%d): turn off\n", pLed->BlinkTimes));
137 /* Determine if we shall change LED state again. */
139 switch (pLed->CurrLedState) {
140 case LED_BLINK_NORMAL:
141 if (pLed->BlinkTimes == 0)
144 case LED_BLINK_StartToBlink:
145 if (check_fwstate(pmlmepriv, _FW_LINKED) && check_fwstate(pmlmepriv, WIFI_STATION_STATE))
147 if (check_fwstate(pmlmepriv, _FW_LINKED) &&
148 (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) ||
149 check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE)))
151 else if (pLed->BlinkTimes == 0)
155 if (pLed->BlinkTimes == 0)
164 SwLedOff(padapter, pLed);
165 else if ((check_fwstate(pmlmepriv, _FW_LINKED) == true) && (pLed->bLedOn == false))
166 SwLedOn(padapter, pLed);
167 else if ((check_fwstate(pmlmepriv, _FW_LINKED) == true) && pLed->bLedOn == true)
168 SwLedOff(padapter, pLed);
169 pLed->BlinkTimes = 0;
170 pLed->bLedBlinkInProgress = false;
172 /* Assign LED state to toggle. */
173 if (pLed->BlinkingLedState == RTW_LED_ON)
174 pLed->BlinkingLedState = RTW_LED_OFF;
176 pLed->BlinkingLedState = RTW_LED_ON;
177 /* Schedule a timer to toggle LED state. */
178 switch (pLed->CurrLedState) {
179 case LED_BLINK_NORMAL:
180 _set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL);
182 case LED_BLINK_SLOWLY:
183 case LED_BLINK_StartToBlink:
184 _set_timer(&(pLed->BlinkTimer), LED_BLINK_SLOWLY_INTERVAL);
187 if (pLed->BlinkingLedState == RTW_LED_ON)
188 _set_timer(&(pLed->BlinkTimer), LED_BLINK_LONG_INTERVAL);
190 _set_timer(&(pLed->BlinkTimer), LED_BLINK_LONG_INTERVAL);
193 _set_timer(&(pLed->BlinkTimer), LED_BLINK_SLOWLY_INTERVAL);
199 void SwLedBlink1(PLED_871x pLed)
201 _adapter *padapter = pLed->padapter;
202 #ifndef CONFIG_LED_REMOVE_HAL
203 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
205 struct led_priv *ledpriv = &(padapter->ledpriv);
206 struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
207 PLED_871x pLed1 = &(ledpriv->SwLed1);
208 u8 stopblink = false;
210 #ifndef CONFIG_LED_REMOVE_HAL
211 if (pHalData->EEPROMCustomerID == RT_CID_819x_CAMEO)
212 pLed = &(ledpriv->SwLed1);
214 /* Change LED according to BlinkingLedState specified. */
215 if (pLed->BlinkingLedState == RTW_LED_ON) {
216 SwLedOn(padapter, pLed);
217 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("Blinktimes (%d): turn on\n", pLed->BlinkTimes));
219 SwLedOff(padapter, pLed);
220 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("Blinktimes (%d): turn off\n", pLed->BlinkTimes));
222 #ifndef CONFIG_LED_REMOVE_HAL
223 if (pHalData->EEPROMCustomerID == RT_CID_DEFAULT) {
224 if (check_fwstate(pmlmepriv, _FW_LINKED) == true) {
225 if (!pLed1->bSWLedCtrl) {
226 SwLedOn(padapter, pLed1);
227 pLed1->bSWLedCtrl = true;
228 } else if (!pLed1->bLedOn) {
229 SwLedOn(padapter, pLed1);
231 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("Blinktimes (): turn on pLed1\n"));
233 if (!pLed1->bSWLedCtrl) {
234 SwLedOff(padapter, pLed1);
235 pLed1->bSWLedCtrl = true;
236 } else if (pLed1->bLedOn) {
237 SwLedOff(padapter, pLed1);
239 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("Blinktimes (): turn off pLed1\n"));
243 if (padapter->pwrctrlpriv.rf_pwrstate != rf_on) {
244 SwLedOff(padapter, pLed);
245 ResetLedStatus(pLed);
249 switch (pLed->CurrLedState) {
250 case LED_BLINK_SLOWLY:
252 pLed->BlinkingLedState = RTW_LED_OFF;
254 pLed->BlinkingLedState = RTW_LED_ON;
255 _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA);
257 case LED_BLINK_NORMAL:
259 pLed->BlinkingLedState = RTW_LED_OFF;
261 pLed->BlinkingLedState = RTW_LED_ON;
262 _set_timer(&(pLed->BlinkTimer), LED_BLINK_LINK_INTERVAL_ALPHA);
266 if (pLed->BlinkTimes == 0)
269 if (check_fwstate(pmlmepriv, _FW_LINKED) == true) {
270 pLed->bLedLinkBlinkInProgress = true;
271 pLed->CurrLedState = LED_BLINK_NORMAL;
273 pLed->BlinkingLedState = RTW_LED_OFF;
275 pLed->BlinkingLedState = RTW_LED_ON;
276 _set_timer(&(pLed->BlinkTimer), LED_BLINK_LINK_INTERVAL_ALPHA);
277 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("CurrLedState %d\n", pLed->CurrLedState));
278 } else if (check_fwstate(pmlmepriv, _FW_LINKED) == false) {
279 pLed->bLedNoLinkBlinkInProgress = true;
280 pLed->CurrLedState = LED_BLINK_SLOWLY;
282 pLed->BlinkingLedState = RTW_LED_OFF;
284 pLed->BlinkingLedState = RTW_LED_ON;
285 _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA);
286 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("CurrLedState %d\n", pLed->CurrLedState));
288 pLed->bLedScanBlinkInProgress = false;
291 pLed->BlinkingLedState = RTW_LED_OFF;
293 pLed->BlinkingLedState = RTW_LED_ON;
294 _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA);
299 if (pLed->BlinkTimes == 0)
302 if (check_fwstate(pmlmepriv, _FW_LINKED) == true) {
303 pLed->bLedLinkBlinkInProgress = true;
304 pLed->CurrLedState = LED_BLINK_NORMAL;
306 pLed->BlinkingLedState = RTW_LED_OFF;
308 pLed->BlinkingLedState = RTW_LED_ON;
309 _set_timer(&(pLed->BlinkTimer), LED_BLINK_LINK_INTERVAL_ALPHA);
310 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("CurrLedState %d\n", pLed->CurrLedState));
311 } else if (check_fwstate(pmlmepriv, _FW_LINKED) == false) {
312 pLed->bLedNoLinkBlinkInProgress = true;
313 pLed->CurrLedState = LED_BLINK_SLOWLY;
315 pLed->BlinkingLedState = RTW_LED_OFF;
317 pLed->BlinkingLedState = RTW_LED_ON;
318 _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA);
319 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("CurrLedState %d\n", pLed->CurrLedState));
321 pLed->BlinkTimes = 0;
322 pLed->bLedBlinkInProgress = false;
325 pLed->BlinkingLedState = RTW_LED_OFF;
327 pLed->BlinkingLedState = RTW_LED_ON;
328 _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA);
333 pLed->BlinkingLedState = RTW_LED_OFF;
335 pLed->BlinkingLedState = RTW_LED_ON;
336 _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA);
338 case LED_BLINK_WPS_STOP: /* WPS success */
339 if (pLed->BlinkingLedState == RTW_LED_ON)
344 pLed->bLedLinkBlinkInProgress = true;
345 pLed->CurrLedState = LED_BLINK_NORMAL;
347 pLed->BlinkingLedState = RTW_LED_OFF;
349 pLed->BlinkingLedState = RTW_LED_ON;
350 _set_timer(&(pLed->BlinkTimer), LED_BLINK_LINK_INTERVAL_ALPHA);
351 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("CurrLedState %d\n", pLed->CurrLedState));
353 pLed->bLedWPSBlinkInProgress = false;
355 pLed->BlinkingLedState = RTW_LED_OFF;
356 _set_timer(&(pLed->BlinkTimer), LED_BLINK_WPS_SUCESS_INTERVAL_ALPHA);
369 _adapter *padapter = pLed->padapter;
370 struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
371 u8 stopblink = false;
373 /* Change LED according to BlinkingLedState specified. */
374 if (pLed->BlinkingLedState == RTW_LED_ON) {
375 SwLedOn(padapter, pLed);
376 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("Blinktimes (%d): turn on\n", pLed->BlinkTimes));
378 SwLedOff(padapter, pLed);
379 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("Blinktimes (%d): turn off\n", pLed->BlinkTimes));
381 switch (pLed->CurrLedState) {
384 if (pLed->BlinkTimes == 0)
387 if (padapter->pwrctrlpriv.rf_pwrstate != rf_on) {
388 SwLedOff(padapter, pLed);
389 } else if (check_fwstate(pmlmepriv, _FW_LINKED) == true) {
390 pLed->CurrLedState = RTW_LED_ON;
391 pLed->BlinkingLedState = RTW_LED_ON;
392 SwLedOn(padapter, pLed);
393 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("stop scan blink CurrLedState %d\n", pLed->CurrLedState));
395 } else if (check_fwstate(pmlmepriv, _FW_LINKED) == false) {
396 pLed->CurrLedState = RTW_LED_OFF;
397 pLed->BlinkingLedState = RTW_LED_OFF;
398 SwLedOff(padapter, pLed);
399 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("stop scan blink CurrLedState %d\n", pLed->CurrLedState));
401 pLed->bLedScanBlinkInProgress = false;
403 if (padapter->pwrctrlpriv.rf_pwrstate != rf_on) {
404 SwLedOff(padapter, pLed);
407 pLed->BlinkingLedState = RTW_LED_OFF;
409 pLed->BlinkingLedState = RTW_LED_ON;
410 _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA);
416 if (pLed->BlinkTimes == 0)
419 if (padapter->pwrctrlpriv.rf_pwrstate != rf_on) {
420 SwLedOff(padapter, pLed);
421 } else if (check_fwstate(pmlmepriv, _FW_LINKED) == true) {
422 pLed->CurrLedState = RTW_LED_ON;
423 pLed->BlinkingLedState = RTW_LED_ON;
424 SwLedOn(padapter, pLed);
425 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("stop CurrLedState %d\n", pLed->CurrLedState));
427 } else if (check_fwstate(pmlmepriv, _FW_LINKED) == false) {
428 pLed->CurrLedState = RTW_LED_OFF;
429 pLed->BlinkingLedState = RTW_LED_OFF;
430 SwLedOff(padapter, pLed);
431 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("stop CurrLedState %d\n", pLed->CurrLedState));
433 pLed->bLedBlinkInProgress = false;
435 if (padapter->pwrctrlpriv.rf_pwrstate != rf_on) {
436 SwLedOff(padapter, pLed);
439 pLed->BlinkingLedState = RTW_LED_OFF;
441 pLed->BlinkingLedState = RTW_LED_ON;
442 _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA);
451 void SwLedBlink3(PLED_871x pLed)
453 _adapter *padapter = pLed->padapter;
454 struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
455 u8 stopblink = false;
457 /* Change LED according to BlinkingLedState specified. */
458 if (pLed->BlinkingLedState == RTW_LED_ON) {
459 SwLedOn(padapter, pLed);
460 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("Blinktimes (%d): turn on\n", pLed->BlinkTimes));
462 if (pLed->CurrLedState != LED_BLINK_WPS_STOP)
463 SwLedOff(padapter, pLed);
464 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("Blinktimes (%d): turn off\n", pLed->BlinkTimes));
466 switch (pLed->CurrLedState) {
469 if (pLed->BlinkTimes == 0)
472 if (padapter->pwrctrlpriv.rf_pwrstate != rf_on) {
473 SwLedOff(padapter, pLed);
474 } else if (check_fwstate(pmlmepriv, _FW_LINKED) == true) {
475 pLed->CurrLedState = RTW_LED_ON;
476 pLed->BlinkingLedState = RTW_LED_ON;
478 SwLedOn(padapter, pLed);
479 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("CurrLedState %d\n", pLed->CurrLedState));
480 } else if (check_fwstate(pmlmepriv, _FW_LINKED) == false) {
481 pLed->CurrLedState = RTW_LED_OFF;
482 pLed->BlinkingLedState = RTW_LED_OFF;
484 SwLedOff(padapter, pLed);
486 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("CurrLedState %d\n", pLed->CurrLedState));
488 pLed->bLedScanBlinkInProgress = false;
490 if (padapter->pwrctrlpriv.rf_pwrstate != rf_on) {
491 SwLedOff(padapter, pLed);
494 pLed->BlinkingLedState = RTW_LED_OFF;
496 pLed->BlinkingLedState = RTW_LED_ON;
497 _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA);
503 if (pLed->BlinkTimes == 0)
506 if (padapter->pwrctrlpriv.rf_pwrstate != rf_on) {
507 SwLedOff(padapter, pLed);
508 } else if (check_fwstate(pmlmepriv, _FW_LINKED) == true) {
509 pLed->CurrLedState = RTW_LED_ON;
510 pLed->BlinkingLedState = RTW_LED_ON;
512 SwLedOn(padapter, pLed);
513 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("CurrLedState %d\n", pLed->CurrLedState));
514 } else if (check_fwstate(pmlmepriv, _FW_LINKED) == false) {
515 pLed->CurrLedState = RTW_LED_OFF;
516 pLed->BlinkingLedState = RTW_LED_OFF;
518 SwLedOff(padapter, pLed);
519 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("CurrLedState %d\n", pLed->CurrLedState));
521 pLed->bLedBlinkInProgress = false;
523 if (padapter->pwrctrlpriv.rf_pwrstate != rf_on) {
524 SwLedOff(padapter, pLed);
527 pLed->BlinkingLedState = RTW_LED_OFF;
529 pLed->BlinkingLedState = RTW_LED_ON;
530 _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA);
536 pLed->BlinkingLedState = RTW_LED_OFF;
538 pLed->BlinkingLedState = RTW_LED_ON;
539 _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA);
541 case LED_BLINK_WPS_STOP: /* WPS success */
542 if (pLed->BlinkingLedState == RTW_LED_ON) {
543 pLed->BlinkingLedState = RTW_LED_OFF;
544 _set_timer(&(pLed->BlinkTimer), LED_BLINK_WPS_SUCESS_INTERVAL_ALPHA);
550 if (padapter->pwrctrlpriv.rf_pwrstate != rf_on) {
551 SwLedOff(padapter, pLed);
553 pLed->CurrLedState = RTW_LED_ON;
554 pLed->BlinkingLedState = RTW_LED_ON;
555 SwLedOn(padapter, pLed);
556 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("CurrLedState %d\n", pLed->CurrLedState));
558 pLed->bLedWPSBlinkInProgress = false;
566 void SwLedBlink4(PLED_871x pLed)
568 _adapter *padapter = pLed->padapter;
569 struct led_priv *ledpriv = &(padapter->ledpriv);
570 struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
571 PLED_871x pLed1 = &(ledpriv->SwLed1);
572 u8 stopblink = false;
574 /* Change LED according to BlinkingLedState specified. */
575 if (pLed->BlinkingLedState == RTW_LED_ON) {
576 SwLedOn(padapter, pLed);
577 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("Blinktimes (%d): turn on\n", pLed->BlinkTimes));
579 SwLedOff(padapter, pLed);
580 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("Blinktimes (%d): turn off\n", pLed->BlinkTimes));
583 if (!pLed1->bLedWPSBlinkInProgress && pLed1->BlinkingLedState == LED_UNKNOWN) {
584 pLed1->BlinkingLedState = RTW_LED_OFF;
585 pLed1->CurrLedState = RTW_LED_OFF;
586 SwLedOff(padapter, pLed1);
589 switch (pLed->CurrLedState) {
590 case LED_BLINK_SLOWLY:
592 pLed->BlinkingLedState = RTW_LED_OFF;
594 pLed->BlinkingLedState = RTW_LED_ON;
595 _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA);
597 case LED_BLINK_StartToBlink:
599 pLed->BlinkingLedState = RTW_LED_OFF;
600 _set_timer(&(pLed->BlinkTimer), LED_BLINK_SLOWLY_INTERVAL);
602 pLed->BlinkingLedState = RTW_LED_ON;
603 _set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL);
608 if (pLed->BlinkTimes == 0)
611 if (padapter->pwrctrlpriv.rf_pwrstate != rf_on && padapter->pwrctrlpriv.rfoff_reason > RF_CHANGE_BY_PS) {
612 SwLedOff(padapter, pLed);
614 pLed->bLedNoLinkBlinkInProgress = false;
615 pLed->CurrLedState = LED_BLINK_SLOWLY;
617 pLed->BlinkingLedState = RTW_LED_OFF;
619 pLed->BlinkingLedState = RTW_LED_ON;
620 _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA);
622 pLed->bLedScanBlinkInProgress = false;
624 if (padapter->pwrctrlpriv.rf_pwrstate != rf_on && padapter->pwrctrlpriv.rfoff_reason > RF_CHANGE_BY_PS) {
625 SwLedOff(padapter, pLed);
628 pLed->BlinkingLedState = RTW_LED_OFF;
630 pLed->BlinkingLedState = RTW_LED_ON;
631 _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA);
637 if (pLed->BlinkTimes == 0)
640 if (padapter->pwrctrlpriv.rf_pwrstate != rf_on && padapter->pwrctrlpriv.rfoff_reason > RF_CHANGE_BY_PS) {
641 SwLedOff(padapter, pLed);
643 pLed->bLedNoLinkBlinkInProgress = true;
644 pLed->CurrLedState = LED_BLINK_SLOWLY;
646 pLed->BlinkingLedState = RTW_LED_OFF;
648 pLed->BlinkingLedState = RTW_LED_ON;
649 _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA);
651 pLed->bLedBlinkInProgress = false;
653 if (padapter->pwrctrlpriv.rf_pwrstate != rf_on && padapter->pwrctrlpriv.rfoff_reason > RF_CHANGE_BY_PS) {
654 SwLedOff(padapter, pLed);
657 pLed->BlinkingLedState = RTW_LED_OFF;
659 pLed->BlinkingLedState = RTW_LED_ON;
660 _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA);
666 pLed->BlinkingLedState = RTW_LED_OFF;
667 _set_timer(&(pLed->BlinkTimer), LED_BLINK_SLOWLY_INTERVAL);
669 pLed->BlinkingLedState = RTW_LED_ON;
670 _set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL);
673 case LED_BLINK_WPS_STOP: /* WPS authentication fail */
675 pLed->BlinkingLedState = RTW_LED_OFF;
677 pLed->BlinkingLedState = RTW_LED_ON;
678 _set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL);
680 case LED_BLINK_WPS_STOP_OVERLAP: /* WPS session overlap */
682 if (pLed->BlinkTimes == 0) {
684 pLed->BlinkTimes = 1;
689 pLed->BlinkTimes = 10;
690 pLed->BlinkingLedState = RTW_LED_ON;
691 _set_timer(&(pLed->BlinkTimer), LED_BLINK_LINK_INTERVAL_ALPHA);
694 pLed->BlinkingLedState = RTW_LED_OFF;
696 pLed->BlinkingLedState = RTW_LED_ON;
697 _set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL);
703 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("SwLedBlink4 CurrLedState %d\n", pLed->CurrLedState));
706 void SwLedBlink5(PLED_871x pLed)
708 _adapter *padapter = pLed->padapter;
709 struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
710 u8 stopblink = false;
712 /* Change LED according to BlinkingLedState specified. */
713 if (pLed->BlinkingLedState == RTW_LED_ON) {
714 SwLedOn(padapter, pLed);
715 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("Blinktimes (%d): turn on\n", pLed->BlinkTimes));
717 SwLedOff(padapter, pLed);
718 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("Blinktimes (%d): turn off\n", pLed->BlinkTimes));
721 switch (pLed->CurrLedState) {
724 if (pLed->BlinkTimes == 0)
727 if (padapter->pwrctrlpriv.rf_pwrstate != rf_on && padapter->pwrctrlpriv.rfoff_reason > RF_CHANGE_BY_PS) {
728 pLed->CurrLedState = RTW_LED_OFF;
729 pLed->BlinkingLedState = RTW_LED_OFF;
731 SwLedOff(padapter, pLed);
733 pLed->CurrLedState = RTW_LED_ON;
734 pLed->BlinkingLedState = RTW_LED_ON;
736 _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA);
738 pLed->bLedScanBlinkInProgress = false;
740 if (padapter->pwrctrlpriv.rf_pwrstate != rf_on && padapter->pwrctrlpriv.rfoff_reason > RF_CHANGE_BY_PS) {
741 SwLedOff(padapter, pLed);
744 pLed->BlinkingLedState = RTW_LED_OFF;
746 pLed->BlinkingLedState = RTW_LED_ON;
747 _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA);
753 if (pLed->BlinkTimes == 0)
756 if (padapter->pwrctrlpriv.rf_pwrstate != rf_on && padapter->pwrctrlpriv.rfoff_reason > RF_CHANGE_BY_PS) {
757 pLed->CurrLedState = RTW_LED_OFF;
758 pLed->BlinkingLedState = RTW_LED_OFF;
760 SwLedOff(padapter, pLed);
762 pLed->CurrLedState = RTW_LED_ON;
763 pLed->BlinkingLedState = RTW_LED_ON;
765 _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA);
768 pLed->bLedBlinkInProgress = false;
770 if (padapter->pwrctrlpriv.rf_pwrstate != rf_on && padapter->pwrctrlpriv.rfoff_reason > RF_CHANGE_BY_PS) {
771 SwLedOff(padapter, pLed);
774 pLed->BlinkingLedState = RTW_LED_OFF;
776 pLed->BlinkingLedState = RTW_LED_ON;
777 _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA);
784 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("SwLedBlink5 CurrLedState %d\n", pLed->CurrLedState));
787 void SwLedBlink6(PLED_871x pLed)
789 _adapter *padapter = pLed->padapter;
790 struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
791 u8 stopblink = false;
793 /* Change LED according to BlinkingLedState specified. */
794 if (pLed->BlinkingLedState == RTW_LED_ON) {
795 SwLedOn(padapter, pLed);
796 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("Blinktimes (%d): turn on\n", pLed->BlinkTimes));
798 SwLedOff(padapter, pLed);
799 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("Blinktimes (%d): turn off\n", pLed->BlinkTimes));
801 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("<==== blink6\n"));
804 static void SwLedControlMode0(_adapter *padapter, LED_CTL_MODE LedAction)
806 struct led_priv *ledpriv = &(padapter->ledpriv);
807 PLED_871x pLed = &(ledpriv->SwLed1);
809 /* Decide led state */
813 if (pLed->bLedBlinkInProgress == false) {
814 pLed->bLedBlinkInProgress = true;
816 pLed->CurrLedState = LED_BLINK_NORMAL;
817 pLed->BlinkTimes = 2;
820 pLed->BlinkingLedState = RTW_LED_OFF;
822 pLed->BlinkingLedState = RTW_LED_ON;
823 _set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL);
826 case LED_CTL_START_TO_LINK:
827 if (pLed->bLedBlinkInProgress == false) {
828 pLed->bLedBlinkInProgress = true;
829 pLed->CurrLedState = LED_BLINK_StartToBlink;
830 pLed->BlinkTimes = 24;
832 pLed->BlinkingLedState = RTW_LED_OFF;
834 pLed->BlinkingLedState = RTW_LED_ON;
835 _set_timer(&(pLed->BlinkTimer), LED_BLINK_SLOWLY_INTERVAL);
837 pLed->CurrLedState = LED_BLINK_StartToBlink;
841 pLed->CurrLedState = RTW_LED_ON;
842 if (pLed->bLedBlinkInProgress == false)
843 SwLedOn(padapter, pLed);
845 case LED_CTL_NO_LINK:
846 pLed->CurrLedState = RTW_LED_OFF;
847 if (pLed->bLedBlinkInProgress == false)
848 SwLedOff(padapter, pLed);
850 case LED_CTL_POWER_OFF:
851 pLed->CurrLedState = RTW_LED_OFF;
852 if (pLed->bLedBlinkInProgress) {
853 _cancel_timer_ex(&(pLed->BlinkTimer));
854 pLed->bLedBlinkInProgress = false;
856 SwLedOff(padapter, pLed);
858 case LED_CTL_START_WPS:
859 if (pLed->bLedBlinkInProgress == false || pLed->CurrLedState == RTW_LED_ON) {
860 pLed->bLedBlinkInProgress = true;
862 pLed->CurrLedState = LED_BLINK_WPS;
863 pLed->BlinkTimes = 20;
866 pLed->BlinkingLedState = RTW_LED_OFF;
867 _set_timer(&(pLed->BlinkTimer), LED_BLINK_LONG_INTERVAL);
869 pLed->BlinkingLedState = RTW_LED_ON;
870 _set_timer(&(pLed->BlinkTimer), LED_BLINK_LONG_INTERVAL);
874 case LED_CTL_STOP_WPS:
875 if (pLed->bLedBlinkInProgress) {
876 pLed->CurrLedState = RTW_LED_OFF;
877 _cancel_timer_ex(&(pLed->BlinkTimer));
878 pLed->bLedBlinkInProgress = false;
884 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("Led %d\n", pLed->CurrLedState));
887 /* ALPHA, added by chiyoko, 20090106 */
891 LED_CTL_MODE LedAction
894 #ifndef CONFIG_LED_REMOVE_HAL
895 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
897 struct led_priv *ledpriv = &(padapter->ledpriv);
898 PLED_871x pLed = &(ledpriv->SwLed0);
899 struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
901 #ifndef CONFIG_LED_REMOVE_HAL
902 if (pHalData->EEPROMCustomerID == RT_CID_819x_CAMEO)
903 pLed = &(ledpriv->SwLed1);
907 case LED_CTL_POWER_ON:
908 case LED_CTL_START_TO_LINK:
909 case LED_CTL_NO_LINK:
910 if (pLed->bLedNoLinkBlinkInProgress == false) {
911 if (pLed->CurrLedState == LED_BLINK_SCAN || IS_LED_WPS_BLINKING(pLed))
913 if (pLed->bLedLinkBlinkInProgress == true) {
914 _cancel_timer_ex(&(pLed->BlinkTimer));
915 pLed->bLedLinkBlinkInProgress = false;
917 if (pLed->bLedBlinkInProgress == true) {
918 _cancel_timer_ex(&(pLed->BlinkTimer));
919 pLed->bLedBlinkInProgress = false;
922 pLed->bLedNoLinkBlinkInProgress = true;
923 pLed->CurrLedState = LED_BLINK_SLOWLY;
925 pLed->BlinkingLedState = RTW_LED_OFF;
927 pLed->BlinkingLedState = RTW_LED_ON;
928 _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA);
932 if (pLed->bLedLinkBlinkInProgress == false) {
933 if (pLed->CurrLedState == LED_BLINK_SCAN || IS_LED_WPS_BLINKING(pLed))
935 if (pLed->bLedNoLinkBlinkInProgress == true) {
936 _cancel_timer_ex(&(pLed->BlinkTimer));
937 pLed->bLedNoLinkBlinkInProgress = false;
939 if (pLed->bLedBlinkInProgress == true) {
940 _cancel_timer_ex(&(pLed->BlinkTimer));
941 pLed->bLedBlinkInProgress = false;
943 pLed->bLedLinkBlinkInProgress = true;
944 pLed->CurrLedState = LED_BLINK_NORMAL;
946 pLed->BlinkingLedState = RTW_LED_OFF;
948 pLed->BlinkingLedState = RTW_LED_ON;
949 _set_timer(&(pLed->BlinkTimer), LED_BLINK_LINK_INTERVAL_ALPHA);
952 case LED_CTL_SITE_SURVEY:
953 if ((pmlmepriv->LinkDetectInfo.bBusyTraffic) && (check_fwstate(pmlmepriv, _FW_LINKED) == true)) {
955 } else if (pLed->bLedScanBlinkInProgress == false) {
956 if (IS_LED_WPS_BLINKING(pLed))
958 if (pLed->bLedNoLinkBlinkInProgress == true) {
959 _cancel_timer_ex(&(pLed->BlinkTimer));
960 pLed->bLedNoLinkBlinkInProgress = false;
962 if (pLed->bLedLinkBlinkInProgress == true) {
963 _cancel_timer_ex(&(pLed->BlinkTimer));
964 pLed->bLedLinkBlinkInProgress = false;
966 if (pLed->bLedBlinkInProgress == true) {
967 _cancel_timer_ex(&(pLed->BlinkTimer));
968 pLed->bLedBlinkInProgress = false;
970 pLed->bLedScanBlinkInProgress = true;
971 pLed->CurrLedState = LED_BLINK_SCAN;
972 pLed->BlinkTimes = 24;
974 pLed->BlinkingLedState = RTW_LED_OFF;
976 pLed->BlinkingLedState = RTW_LED_ON;
977 _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA);
982 if (pLed->bLedBlinkInProgress == false) {
983 if (pLed->CurrLedState == LED_BLINK_SCAN || IS_LED_WPS_BLINKING(pLed))
985 if (pLed->bLedNoLinkBlinkInProgress == true) {
986 _cancel_timer_ex(&(pLed->BlinkTimer));
987 pLed->bLedNoLinkBlinkInProgress = false;
989 if (pLed->bLedLinkBlinkInProgress == true) {
990 _cancel_timer_ex(&(pLed->BlinkTimer));
991 pLed->bLedLinkBlinkInProgress = false;
993 pLed->bLedBlinkInProgress = true;
994 pLed->CurrLedState = LED_BLINK_TXRX;
995 pLed->BlinkTimes = 2;
997 pLed->BlinkingLedState = RTW_LED_OFF;
999 pLed->BlinkingLedState = RTW_LED_ON;
1000 _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA);
1003 case LED_CTL_START_WPS: /* wait until xinpin finish */
1004 case LED_CTL_START_WPS_BOTTON:
1005 if (pLed->bLedWPSBlinkInProgress == false) {
1006 if (pLed->bLedNoLinkBlinkInProgress == true) {
1007 _cancel_timer_ex(&(pLed->BlinkTimer));
1008 pLed->bLedNoLinkBlinkInProgress = false;
1010 if (pLed->bLedLinkBlinkInProgress == true) {
1011 _cancel_timer_ex(&(pLed->BlinkTimer));
1012 pLed->bLedLinkBlinkInProgress = false;
1014 if (pLed->bLedBlinkInProgress == true) {
1015 _cancel_timer_ex(&(pLed->BlinkTimer));
1016 pLed->bLedBlinkInProgress = false;
1018 if (pLed->bLedScanBlinkInProgress == true) {
1019 _cancel_timer_ex(&(pLed->BlinkTimer));
1020 pLed->bLedScanBlinkInProgress = false;
1022 pLed->bLedWPSBlinkInProgress = true;
1023 pLed->CurrLedState = LED_BLINK_WPS;
1025 pLed->BlinkingLedState = RTW_LED_OFF;
1027 pLed->BlinkingLedState = RTW_LED_ON;
1028 _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA);
1031 case LED_CTL_STOP_WPS:
1032 if (pLed->bLedNoLinkBlinkInProgress == true) {
1033 _cancel_timer_ex(&(pLed->BlinkTimer));
1034 pLed->bLedNoLinkBlinkInProgress = false;
1036 if (pLed->bLedLinkBlinkInProgress == true) {
1037 _cancel_timer_ex(&(pLed->BlinkTimer));
1038 pLed->bLedLinkBlinkInProgress = false;
1040 if (pLed->bLedBlinkInProgress == true) {
1041 _cancel_timer_ex(&(pLed->BlinkTimer));
1042 pLed->bLedBlinkInProgress = false;
1044 if (pLed->bLedScanBlinkInProgress == true) {
1045 _cancel_timer_ex(&(pLed->BlinkTimer));
1046 pLed->bLedScanBlinkInProgress = false;
1048 if (pLed->bLedWPSBlinkInProgress)
1049 _cancel_timer_ex(&(pLed->BlinkTimer));
1051 pLed->bLedWPSBlinkInProgress = true;
1052 pLed->CurrLedState = LED_BLINK_WPS_STOP;
1054 pLed->BlinkingLedState = RTW_LED_OFF;
1055 _set_timer(&(pLed->BlinkTimer), LED_BLINK_WPS_SUCESS_INTERVAL_ALPHA);
1057 pLed->BlinkingLedState = RTW_LED_ON;
1058 _set_timer(&(pLed->BlinkTimer), 0);
1061 case LED_CTL_STOP_WPS_FAIL:
1062 if (pLed->bLedWPSBlinkInProgress) {
1063 _cancel_timer_ex(&(pLed->BlinkTimer));
1064 pLed->bLedWPSBlinkInProgress = false;
1066 pLed->bLedNoLinkBlinkInProgress = true;
1067 pLed->CurrLedState = LED_BLINK_SLOWLY;
1069 pLed->BlinkingLedState = RTW_LED_OFF;
1071 pLed->BlinkingLedState = RTW_LED_ON;
1072 _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA);
1074 case LED_CTL_POWER_OFF:
1075 pLed->CurrLedState = RTW_LED_OFF;
1076 pLed->BlinkingLedState = RTW_LED_OFF;
1077 if (pLed->bLedNoLinkBlinkInProgress) {
1078 _cancel_timer_ex(&(pLed->BlinkTimer));
1079 pLed->bLedNoLinkBlinkInProgress = false;
1081 if (pLed->bLedLinkBlinkInProgress) {
1082 _cancel_timer_ex(&(pLed->BlinkTimer));
1083 pLed->bLedLinkBlinkInProgress = false;
1085 if (pLed->bLedBlinkInProgress) {
1086 _cancel_timer_ex(&(pLed->BlinkTimer));
1087 pLed->bLedBlinkInProgress = false;
1089 if (pLed->bLedWPSBlinkInProgress) {
1090 _cancel_timer_ex(&(pLed->BlinkTimer));
1091 pLed->bLedWPSBlinkInProgress = false;
1093 if (pLed->bLedScanBlinkInProgress) {
1094 _cancel_timer_ex(&(pLed->BlinkTimer));
1095 pLed->bLedScanBlinkInProgress = false;
1098 SwLedOff(padapter, pLed);
1103 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("Led %d\n", pLed->CurrLedState));
1106 /* Arcadyan/Sitecom , added by chiyoko, 20090216 */
1110 LED_CTL_MODE LedAction
1113 struct led_priv *ledpriv = &(padapter->ledpriv);
1114 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
1115 PLED_871x pLed = &(ledpriv->SwLed0);
1117 switch (LedAction) {
1118 case LED_CTL_SITE_SURVEY:
1119 if (pmlmepriv->LinkDetectInfo.bBusyTraffic) {
1121 } else if (pLed->bLedScanBlinkInProgress == false) {
1122 if (IS_LED_WPS_BLINKING(pLed))
1124 if (pLed->bLedBlinkInProgress == true) {
1125 _cancel_timer_ex(&(pLed->BlinkTimer));
1126 pLed->bLedBlinkInProgress = false;
1128 pLed->bLedScanBlinkInProgress = true;
1129 pLed->CurrLedState = LED_BLINK_SCAN;
1130 pLed->BlinkTimes = 24;
1132 pLed->BlinkingLedState = RTW_LED_OFF;
1134 pLed->BlinkingLedState = RTW_LED_ON;
1135 _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA);
1140 if ((pLed->bLedBlinkInProgress == false) && (check_fwstate(pmlmepriv, _FW_LINKED) == true)) {
1141 if (pLed->CurrLedState == LED_BLINK_SCAN || IS_LED_WPS_BLINKING(pLed))
1143 pLed->bLedBlinkInProgress = true;
1144 pLed->CurrLedState = LED_BLINK_TXRX;
1145 pLed->BlinkTimes = 2;
1147 pLed->BlinkingLedState = RTW_LED_OFF;
1149 pLed->BlinkingLedState = RTW_LED_ON;
1150 _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA);
1154 pLed->CurrLedState = RTW_LED_ON;
1155 pLed->BlinkingLedState = RTW_LED_ON;
1156 if (pLed->bLedBlinkInProgress) {
1157 _cancel_timer_ex(&(pLed->BlinkTimer));
1158 pLed->bLedBlinkInProgress = false;
1160 if (pLed->bLedScanBlinkInProgress) {
1161 _cancel_timer_ex(&(pLed->BlinkTimer));
1162 pLed->bLedScanBlinkInProgress = false;
1164 _set_timer(&(pLed->BlinkTimer), 0);
1166 case LED_CTL_START_WPS: /* wait until xinpin finish */
1167 case LED_CTL_START_WPS_BOTTON:
1168 if (pLed->bLedWPSBlinkInProgress == false) {
1169 if (pLed->bLedBlinkInProgress == true) {
1170 _cancel_timer_ex(&(pLed->BlinkTimer));
1171 pLed->bLedBlinkInProgress = false;
1173 if (pLed->bLedScanBlinkInProgress == true) {
1174 _cancel_timer_ex(&(pLed->BlinkTimer));
1175 pLed->bLedScanBlinkInProgress = false;
1177 pLed->bLedWPSBlinkInProgress = true;
1178 pLed->CurrLedState = RTW_LED_ON;
1179 pLed->BlinkingLedState = RTW_LED_ON;
1180 _set_timer(&(pLed->BlinkTimer), 0);
1183 case LED_CTL_STOP_WPS:
1184 pLed->bLedWPSBlinkInProgress = false;
1185 if (padapter->pwrctrlpriv.rf_pwrstate != rf_on) {
1186 SwLedOff(padapter, pLed);
1188 pLed->CurrLedState = RTW_LED_ON;
1189 pLed->BlinkingLedState = RTW_LED_ON;
1190 _set_timer(&(pLed->BlinkTimer), 0);
1191 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("CurrLedState %d\n", pLed->CurrLedState));
1194 case LED_CTL_STOP_WPS_FAIL:
1195 pLed->bLedWPSBlinkInProgress = false;
1196 if (padapter->pwrctrlpriv.rf_pwrstate != rf_on) {
1197 SwLedOff(padapter, pLed);
1199 pLed->CurrLedState = RTW_LED_OFF;
1200 pLed->BlinkingLedState = RTW_LED_OFF;
1201 _set_timer(&(pLed->BlinkTimer), 0);
1202 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("CurrLedState %d\n", pLed->CurrLedState));
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;
1228 _set_timer(&(pLed->BlinkTimer), 0);
1234 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("CurrLedState %d\n", pLed->CurrLedState));
1237 /* COREGA, added by chiyoko, 20090316 */
1241 LED_CTL_MODE LedAction
1244 struct led_priv *ledpriv = &(padapter->ledpriv);
1245 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
1246 PLED_871x pLed = &(ledpriv->SwLed0);
1248 switch (LedAction) {
1249 case LED_CTL_SITE_SURVEY:
1250 if (pmlmepriv->LinkDetectInfo.bBusyTraffic) {
1252 } else if (pLed->bLedScanBlinkInProgress == false) {
1253 if (IS_LED_WPS_BLINKING(pLed))
1256 if (pLed->bLedBlinkInProgress == true) {
1257 _cancel_timer_ex(&(pLed->BlinkTimer));
1258 pLed->bLedBlinkInProgress = false;
1260 pLed->bLedScanBlinkInProgress = true;
1261 pLed->CurrLedState = LED_BLINK_SCAN;
1262 pLed->BlinkTimes = 24;
1264 pLed->BlinkingLedState = RTW_LED_OFF;
1266 pLed->BlinkingLedState = RTW_LED_ON;
1267 _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA);
1272 if ((pLed->bLedBlinkInProgress == false) && (check_fwstate(pmlmepriv, _FW_LINKED) == true)) {
1273 if (pLed->CurrLedState == LED_BLINK_SCAN || IS_LED_WPS_BLINKING(pLed))
1275 pLed->bLedBlinkInProgress = true;
1276 pLed->CurrLedState = LED_BLINK_TXRX;
1277 pLed->BlinkTimes = 2;
1279 pLed->BlinkingLedState = RTW_LED_OFF;
1281 pLed->BlinkingLedState = RTW_LED_ON;
1282 _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA);
1286 if (IS_LED_WPS_BLINKING(pLed))
1288 pLed->CurrLedState = RTW_LED_ON;
1289 pLed->BlinkingLedState = RTW_LED_ON;
1290 if (pLed->bLedBlinkInProgress) {
1291 _cancel_timer_ex(&(pLed->BlinkTimer));
1292 pLed->bLedBlinkInProgress = false;
1294 if (pLed->bLedScanBlinkInProgress) {
1295 _cancel_timer_ex(&(pLed->BlinkTimer));
1296 pLed->bLedScanBlinkInProgress = false;
1298 _set_timer(&(pLed->BlinkTimer), 0);
1300 case LED_CTL_START_WPS: /* wait until xinpin finish */
1301 case LED_CTL_START_WPS_BOTTON:
1302 if (pLed->bLedWPSBlinkInProgress == false) {
1303 if (pLed->bLedBlinkInProgress == true) {
1304 _cancel_timer_ex(&(pLed->BlinkTimer));
1305 pLed->bLedBlinkInProgress = false;
1307 if (pLed->bLedScanBlinkInProgress == true) {
1308 _cancel_timer_ex(&(pLed->BlinkTimer));
1309 pLed->bLedScanBlinkInProgress = false;
1311 pLed->bLedWPSBlinkInProgress = true;
1312 pLed->CurrLedState = LED_BLINK_WPS;
1314 pLed->BlinkingLedState = RTW_LED_OFF;
1316 pLed->BlinkingLedState = RTW_LED_ON;
1317 _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA);
1320 case LED_CTL_STOP_WPS:
1321 if (pLed->bLedWPSBlinkInProgress) {
1322 _cancel_timer_ex(&(pLed->BlinkTimer));
1323 pLed->bLedWPSBlinkInProgress = false;
1325 pLed->bLedWPSBlinkInProgress = true;
1327 pLed->CurrLedState = LED_BLINK_WPS_STOP;
1329 pLed->BlinkingLedState = RTW_LED_OFF;
1330 _set_timer(&(pLed->BlinkTimer), LED_BLINK_WPS_SUCESS_INTERVAL_ALPHA);
1332 pLed->BlinkingLedState = RTW_LED_ON;
1333 _set_timer(&(pLed->BlinkTimer), 0);
1336 case LED_CTL_STOP_WPS_FAIL:
1337 if (pLed->bLedWPSBlinkInProgress) {
1338 _cancel_timer_ex(&(pLed->BlinkTimer));
1339 pLed->bLedWPSBlinkInProgress = false;
1341 pLed->CurrLedState = RTW_LED_OFF;
1342 pLed->BlinkingLedState = RTW_LED_OFF;
1343 _set_timer(&(pLed->BlinkTimer), 0);
1345 case LED_CTL_START_TO_LINK:
1346 case LED_CTL_NO_LINK:
1347 if (!IS_LED_BLINKING(pLed)) {
1348 pLed->CurrLedState = RTW_LED_OFF;
1349 pLed->BlinkingLedState = RTW_LED_OFF;
1350 _set_timer(&(pLed->BlinkTimer), 0);
1353 case LED_CTL_POWER_OFF:
1354 pLed->CurrLedState = RTW_LED_OFF;
1355 pLed->BlinkingLedState = RTW_LED_OFF;
1356 if (pLed->bLedBlinkInProgress) {
1357 _cancel_timer_ex(&(pLed->BlinkTimer));
1358 pLed->bLedBlinkInProgress = false;
1360 if (pLed->bLedScanBlinkInProgress) {
1361 _cancel_timer_ex(&(pLed->BlinkTimer));
1362 pLed->bLedScanBlinkInProgress = false;
1364 if (pLed->bLedWPSBlinkInProgress) {
1365 _cancel_timer_ex(&(pLed->BlinkTimer));
1366 pLed->bLedWPSBlinkInProgress = false;
1369 _set_timer(&(pLed->BlinkTimer), 0);
1374 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("CurrLedState %d\n", pLed->CurrLedState));
1378 /* Edimax-Belkin, added by chiyoko, 20090413 */
1382 LED_CTL_MODE LedAction
1385 struct led_priv *ledpriv = &(padapter->ledpriv);
1386 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
1387 PLED_871x pLed = &(ledpriv->SwLed0);
1388 PLED_871x pLed1 = &(ledpriv->SwLed1);
1390 switch (LedAction) {
1391 case LED_CTL_START_TO_LINK:
1392 if (pLed1->bLedWPSBlinkInProgress) {
1393 pLed1->bLedWPSBlinkInProgress = false;
1394 _cancel_timer_ex(&(pLed1->BlinkTimer));
1395 pLed1->BlinkingLedState = RTW_LED_OFF;
1396 pLed1->CurrLedState = RTW_LED_OFF;
1398 _set_timer(&(pLed->BlinkTimer), 0);
1400 if (pLed->bLedStartToLinkBlinkInProgress == false) {
1401 if (pLed->CurrLedState == LED_BLINK_SCAN || IS_LED_WPS_BLINKING(pLed))
1403 if (pLed->bLedBlinkInProgress == true) {
1404 _cancel_timer_ex(&(pLed->BlinkTimer));
1405 pLed->bLedBlinkInProgress = false;
1407 if (pLed->bLedNoLinkBlinkInProgress == true) {
1408 _cancel_timer_ex(&(pLed->BlinkTimer));
1409 pLed->bLedNoLinkBlinkInProgress = false;
1411 pLed->bLedStartToLinkBlinkInProgress = true;
1412 pLed->CurrLedState = LED_BLINK_StartToBlink;
1414 pLed->BlinkingLedState = RTW_LED_OFF;
1415 _set_timer(&(pLed->BlinkTimer), LED_BLINK_SLOWLY_INTERVAL);
1417 pLed->BlinkingLedState = RTW_LED_ON;
1418 _set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL);
1423 case LED_CTL_NO_LINK:
1425 if (LedAction == LED_CTL_LINK) {
1426 if (pLed1->bLedWPSBlinkInProgress) {
1427 pLed1->bLedWPSBlinkInProgress = false;
1428 _cancel_timer_ex(&(pLed1->BlinkTimer));
1429 pLed1->BlinkingLedState = RTW_LED_OFF;
1430 pLed1->CurrLedState = RTW_LED_OFF;
1432 _set_timer(&(pLed->BlinkTimer), 0);
1435 if (pLed->bLedNoLinkBlinkInProgress == false) {
1436 if (pLed->CurrLedState == LED_BLINK_SCAN || IS_LED_WPS_BLINKING(pLed))
1438 if (pLed->bLedBlinkInProgress == true) {
1439 _cancel_timer_ex(&(pLed->BlinkTimer));
1440 pLed->bLedBlinkInProgress = false;
1442 pLed->bLedNoLinkBlinkInProgress = true;
1443 pLed->CurrLedState = LED_BLINK_SLOWLY;
1445 pLed->BlinkingLedState = RTW_LED_OFF;
1447 pLed->BlinkingLedState = RTW_LED_ON;
1448 _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA);
1451 case LED_CTL_SITE_SURVEY:
1452 if ((pmlmepriv->LinkDetectInfo.bBusyTraffic) &&
1453 (check_fwstate(pmlmepriv, _FW_LINKED) == true)) {
1455 } else if (pLed->bLedScanBlinkInProgress == false) {
1456 if (IS_LED_WPS_BLINKING(pLed))
1458 if (pLed->bLedNoLinkBlinkInProgress == true) {
1459 _cancel_timer_ex(&(pLed->BlinkTimer));
1460 pLed->bLedNoLinkBlinkInProgress = false;
1462 if (pLed->bLedBlinkInProgress == true) {
1463 _cancel_timer_ex(&(pLed->BlinkTimer));
1464 pLed->bLedBlinkInProgress = false;
1466 pLed->bLedScanBlinkInProgress = true;
1467 pLed->CurrLedState = LED_BLINK_SCAN;
1468 pLed->BlinkTimes = 24;
1470 pLed->BlinkingLedState = RTW_LED_OFF;
1472 pLed->BlinkingLedState = RTW_LED_ON;
1473 _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA);
1478 if (pLed->bLedBlinkInProgress == false) {
1479 if (pLed->CurrLedState == LED_BLINK_SCAN || IS_LED_WPS_BLINKING(pLed))
1481 if (pLed->bLedNoLinkBlinkInProgress == true) {
1482 _cancel_timer_ex(&(pLed->BlinkTimer));
1483 pLed->bLedNoLinkBlinkInProgress = false;
1485 pLed->bLedBlinkInProgress = true;
1486 pLed->CurrLedState = LED_BLINK_TXRX;
1487 pLed->BlinkTimes = 2;
1489 pLed->BlinkingLedState = RTW_LED_OFF;
1491 pLed->BlinkingLedState = RTW_LED_ON;
1492 _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA);
1495 case LED_CTL_START_WPS: /* wait until xinpin finish */
1496 case LED_CTL_START_WPS_BOTTON:
1497 if (pLed1->bLedWPSBlinkInProgress) {
1498 pLed1->bLedWPSBlinkInProgress = false;
1499 _cancel_timer_ex(&(pLed1->BlinkTimer));
1500 pLed1->BlinkingLedState = RTW_LED_OFF;
1501 pLed1->CurrLedState = RTW_LED_OFF;
1503 _set_timer(&(pLed->BlinkTimer), 0);
1505 if (pLed->bLedWPSBlinkInProgress == false) {
1506 if (pLed->bLedNoLinkBlinkInProgress == true) {
1507 _cancel_timer_ex(&(pLed->BlinkTimer));
1508 pLed->bLedNoLinkBlinkInProgress = false;
1510 if (pLed->bLedBlinkInProgress == true) {
1511 _cancel_timer_ex(&(pLed->BlinkTimer));
1512 pLed->bLedBlinkInProgress = false;
1514 if (pLed->bLedScanBlinkInProgress == true) {
1515 _cancel_timer_ex(&(pLed->BlinkTimer));
1516 pLed->bLedScanBlinkInProgress = false;
1518 pLed->bLedWPSBlinkInProgress = true;
1519 pLed->CurrLedState = LED_BLINK_WPS;
1521 pLed->BlinkingLedState = RTW_LED_OFF;
1522 _set_timer(&(pLed->BlinkTimer), LED_BLINK_SLOWLY_INTERVAL);
1524 pLed->BlinkingLedState = RTW_LED_ON;
1525 _set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL);
1529 case LED_CTL_STOP_WPS: /* WPS connect success */
1530 if (pLed->bLedWPSBlinkInProgress) {
1531 _cancel_timer_ex(&(pLed->BlinkTimer));
1532 pLed->bLedWPSBlinkInProgress = false;
1534 pLed->bLedNoLinkBlinkInProgress = true;
1535 pLed->CurrLedState = LED_BLINK_SLOWLY;
1537 pLed->BlinkingLedState = RTW_LED_OFF;
1539 pLed->BlinkingLedState = RTW_LED_ON;
1540 _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA);
1542 case LED_CTL_STOP_WPS_FAIL: /* WPS authentication fail */
1543 if (pLed->bLedWPSBlinkInProgress) {
1544 _cancel_timer_ex(&(pLed->BlinkTimer));
1545 pLed->bLedWPSBlinkInProgress = false;
1547 pLed->bLedNoLinkBlinkInProgress = true;
1548 pLed->CurrLedState = LED_BLINK_SLOWLY;
1550 pLed->BlinkingLedState = RTW_LED_OFF;
1552 pLed->BlinkingLedState = RTW_LED_ON;
1553 _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA);
1555 if (pLed1->bLedWPSBlinkInProgress)
1556 _cancel_timer_ex(&(pLed1->BlinkTimer));
1558 pLed1->bLedWPSBlinkInProgress = true;
1559 pLed1->CurrLedState = LED_BLINK_WPS_STOP;
1561 pLed1->BlinkingLedState = RTW_LED_OFF;
1563 pLed1->BlinkingLedState = RTW_LED_ON;
1564 _set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL);
1566 case LED_CTL_STOP_WPS_FAIL_OVERLAP: /* WPS session overlap */
1567 if (pLed->bLedWPSBlinkInProgress) {
1568 _cancel_timer_ex(&(pLed->BlinkTimer));
1569 pLed->bLedWPSBlinkInProgress = false;
1571 pLed->bLedNoLinkBlinkInProgress = true;
1572 pLed->CurrLedState = LED_BLINK_SLOWLY;
1574 pLed->BlinkingLedState = RTW_LED_OFF;
1576 pLed->BlinkingLedState = RTW_LED_ON;
1577 _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA);
1579 if (pLed1->bLedWPSBlinkInProgress)
1580 _cancel_timer_ex(&(pLed1->BlinkTimer));
1582 pLed1->bLedWPSBlinkInProgress = true;
1583 pLed1->CurrLedState = LED_BLINK_WPS_STOP_OVERLAP;
1584 pLed1->BlinkTimes = 10;
1586 pLed1->BlinkingLedState = RTW_LED_OFF;
1588 pLed1->BlinkingLedState = RTW_LED_ON;
1589 _set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL);
1591 case LED_CTL_POWER_OFF:
1592 pLed->CurrLedState = RTW_LED_OFF;
1593 pLed->BlinkingLedState = RTW_LED_OFF;
1595 if (pLed->bLedNoLinkBlinkInProgress) {
1596 _cancel_timer_ex(&(pLed->BlinkTimer));
1597 pLed->bLedNoLinkBlinkInProgress = false;
1599 if (pLed->bLedLinkBlinkInProgress) {
1600 _cancel_timer_ex(&(pLed->BlinkTimer));
1601 pLed->bLedLinkBlinkInProgress = false;
1603 if (pLed->bLedBlinkInProgress) {
1604 _cancel_timer_ex(&(pLed->BlinkTimer));
1605 pLed->bLedBlinkInProgress = false;
1607 if (pLed->bLedWPSBlinkInProgress) {
1608 _cancel_timer_ex(&(pLed->BlinkTimer));
1609 pLed->bLedWPSBlinkInProgress = false;
1611 if (pLed->bLedScanBlinkInProgress) {
1612 _cancel_timer_ex(&(pLed->BlinkTimer));
1613 pLed->bLedScanBlinkInProgress = false;
1615 if (pLed->bLedStartToLinkBlinkInProgress) {
1616 _cancel_timer_ex(&(pLed->BlinkTimer));
1617 pLed->bLedStartToLinkBlinkInProgress = false;
1619 if (pLed1->bLedWPSBlinkInProgress) {
1620 _cancel_timer_ex(&(pLed1->BlinkTimer));
1621 pLed1->bLedWPSBlinkInProgress = false;
1623 pLed1->BlinkingLedState = LED_UNKNOWN;
1624 SwLedOff(padapter, pLed);
1625 SwLedOff(padapter, pLed1);
1630 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("Led %d\n", pLed->CurrLedState));
1633 /* Sercomm-Belkin, added by chiyoko, 20090415 */
1634 static void SwLedControlMode5(_adapter *padapter, LED_CTL_MODE LedAction)
1636 #ifndef CONFIG_LED_REMOVE_HAL
1637 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
1639 struct led_priv *ledpriv = &(padapter->ledpriv);
1640 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
1641 PLED_871x pLed = &(ledpriv->SwLed0);
1643 #ifndef CONFIG_LED_REMOVE_HAL
1644 if (pHalData->EEPROMCustomerID == RT_CID_819x_CAMEO)
1645 pLed = &(ledpriv->SwLed1);
1647 switch (LedAction) {
1648 case LED_CTL_POWER_ON:
1649 case LED_CTL_NO_LINK:
1650 case LED_CTL_LINK: /* solid blue */
1651 pLed->CurrLedState = RTW_LED_ON;
1652 pLed->BlinkingLedState = RTW_LED_ON;
1653 _set_timer(&(pLed->BlinkTimer), 0);
1655 case LED_CTL_SITE_SURVEY:
1656 if ((pmlmepriv->LinkDetectInfo.bBusyTraffic) &&
1657 (check_fwstate(pmlmepriv, _FW_LINKED) == true)) {
1659 } else if (pLed->bLedScanBlinkInProgress == false) {
1660 if (pLed->bLedBlinkInProgress == true) {
1661 _cancel_timer_ex(&(pLed->BlinkTimer));
1662 pLed->bLedBlinkInProgress = false;
1664 pLed->bLedScanBlinkInProgress = true;
1665 pLed->CurrLedState = LED_BLINK_SCAN;
1666 pLed->BlinkTimes = 24;
1668 pLed->BlinkingLedState = RTW_LED_OFF;
1670 pLed->BlinkingLedState = RTW_LED_ON;
1671 _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA);
1676 if (pLed->bLedBlinkInProgress == false) {
1677 if (pLed->CurrLedState == LED_BLINK_SCAN)
1679 pLed->bLedBlinkInProgress = true;
1680 pLed->CurrLedState = LED_BLINK_TXRX;
1681 pLed->BlinkTimes = 2;
1683 pLed->BlinkingLedState = RTW_LED_OFF;
1685 pLed->BlinkingLedState = RTW_LED_ON;
1686 _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA);
1689 case LED_CTL_POWER_OFF:
1690 pLed->CurrLedState = RTW_LED_OFF;
1691 pLed->BlinkingLedState = RTW_LED_OFF;
1692 if (pLed->bLedBlinkInProgress) {
1693 _cancel_timer_ex(&(pLed->BlinkTimer));
1694 pLed->bLedBlinkInProgress = false;
1696 SwLedOff(padapter, pLed);
1702 RT_TRACE(_module_rtl8712_led_c_, _drv_info_, ("Led %d\n", pLed->CurrLedState));
1705 /* WNC-Corega, added by chiyoko, 20090902 */
1706 static void SwLedControlMode6(_adapter *padapter, LED_CTL_MODE LedAction)
1708 struct led_priv *ledpriv = &(padapter->ledpriv);
1709 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
1710 PLED_871x pLed0 = &(ledpriv->SwLed0);
1712 switch (LedAction) {
1713 case LED_CTL_POWER_ON:
1715 case LED_CTL_NO_LINK:
1716 _cancel_timer_ex(&(pLed0->BlinkTimer));
1717 pLed0->CurrLedState = RTW_LED_ON;
1718 pLed0->BlinkingLedState = RTW_LED_ON;
1719 _set_timer(&(pLed0->BlinkTimer), 0);
1721 case LED_CTL_POWER_OFF:
1722 SwLedOff(padapter, pLed0);
1728 RT_TRACE(_module_rtl8712_led_c_, _drv_info_,
1729 ("ledcontrol 6 Led %d\n", pLed0->CurrLedState));
1733 /* Handler function of LED Blinking. */
1734 /* We dispatch acture LED blink action according to LedStrategy. */
1735 void BlinkHandler(PLED_871x pLed)
1737 _adapter *padapter = pLed->padapter;
1738 struct led_priv *ledpriv = &(padapter->ledpriv);
1740 if ((padapter->bSurpriseRemoved == true) ||
1741 (padapter->bDriverStopped == true))
1744 switch (ledpriv->LedStrategy) {
1771 void LedControl871x(_adapter *padapter, LED_CTL_MODE LedAction)
1773 struct led_priv *ledpriv = &(padapter->ledpriv);
1775 if ((padapter->bSurpriseRemoved == true) ||
1776 (padapter->bDriverStopped == true) ||
1777 (padapter->hw_init_completed == false))
1780 if (ledpriv->bRegUseLed == false)
1783 if ((padapter->pwrctrlpriv.rf_pwrstate != rf_on &&
1784 padapter->pwrctrlpriv.rfoff_reason > RF_CHANGE_BY_PS) &&
1785 (LedAction == LED_CTL_TX || LedAction == LED_CTL_RX ||
1786 LedAction == LED_CTL_SITE_SURVEY ||
1787 LedAction == LED_CTL_LINK ||
1788 LedAction == LED_CTL_NO_LINK ||
1789 LedAction == LED_CTL_POWER_ON))
1792 switch (ledpriv->LedStrategy) {
1796 SwLedControlMode1(padapter, LedAction);
1799 SwLedControlMode2(padapter, LedAction);
1802 SwLedControlMode3(padapter, LedAction);
1805 SwLedControlMode4(padapter, LedAction);
1808 SwLedControlMode5(padapter, LedAction);
1811 SwLedControlMode6(padapter, LedAction);
1816 RT_TRACE(_module_rtl8712_led_c_, _drv_info_,
1817 ("LedStrategy:%d, LedAction %d\n", ledpriv->LedStrategy, LedAction));