cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

rtl8712_led.c (52969B)


      1// SPDX-License-Identifier: GPL-2.0
      2/******************************************************************************
      3 * rtl8712_led.c
      4 *
      5 * Copyright(c) 2007 - 2010  Realtek Corporation. All rights reserved.
      6 * Linux device driver for RTL8192SU
      7 *
      8 * Modifications for inclusion into the Linux staging tree are
      9 * Copyright(c) 2010 Larry Finger. All rights reserved.
     10 *
     11 * Contact information:
     12 * WLAN FAE <wlanfae@realtek.com>
     13 * Larry Finger <Larry.Finger@lwfinger.net>
     14 *
     15 ******************************************************************************/
     16
     17#include "drv_types.h"
     18
     19/*===========================================================================
     20 *	Constant.
     21 *===========================================================================
     22
     23 *
     24 * Default LED behavior.
     25 */
     26#define LED_BLINK_NORMAL_INTERVAL	100
     27#define LED_BLINK_SLOWLY_INTERVAL	200
     28#define LED_BLINK_LONG_INTERVAL	400
     29
     30#define LED_BLINK_NO_LINK_INTERVAL_ALPHA	1000
     31#define LED_BLINK_LINK_INTERVAL_ALPHA		500
     32#define LED_BLINK_SCAN_INTERVAL_ALPHA		180
     33#define LED_BLINK_FASTER_INTERVAL_ALPHA		50
     34#define LED_BLINK_WPS_SUCCESS_INTERVAL_ALPHA	5000
     35
     36/*===========================================================================
     37 * LED object.
     38 *===========================================================================
     39 */
     40enum _LED_STATE_871x {
     41	LED_UNKNOWN = 0,
     42	LED_STATE_ON = 1,
     43	LED_STATE_OFF = 2,
     44	LED_BLINK_NORMAL = 3,
     45	LED_BLINK_SLOWLY = 4,
     46	LED_POWER_ON_BLINK = 5,
     47	LED_SCAN_BLINK = 6, /* LED is blinking during scanning period,
     48			     * the # of times to blink is depend on time
     49			     * for scanning.
     50			     */
     51	LED_NO_LINK_BLINK = 7, /* LED is blinking during no link state. */
     52	LED_BLINK_StartToBlink = 8,/* Customized for Sercomm Printer
     53				    * Server case
     54				    */
     55	LED_BLINK_WPS = 9,	/* LED is blinkg during WPS communication */
     56	LED_TXRX_BLINK = 10,
     57	LED_BLINK_WPS_STOP = 11,	/*for ALPHA */
     58	LED_BLINK_WPS_STOP_OVERLAP = 12,	/*for BELKIN */
     59};
     60
     61/*===========================================================================
     62 *	Prototype of protected function.
     63 *===========================================================================
     64 */
     65static void BlinkTimerCallback(struct timer_list *t);
     66
     67static void BlinkWorkItemCallback(struct work_struct *work);
     68/*===========================================================================
     69 * LED_819xUsb routines.
     70 *===========================================================================
     71 *
     72 *
     73 *
     74 *	Description:
     75 *		Initialize an LED_871x object.
     76 */
     77static void InitLed871x(struct _adapter *padapter, struct LED_871x *pLed,
     78			enum LED_PIN_871x	LedPin)
     79{
     80	pLed->padapter = padapter;
     81	pLed->LedPin = LedPin;
     82	pLed->CurrLedState = LED_STATE_OFF;
     83	pLed->bLedOn = false;
     84	pLed->bLedBlinkInProgress = false;
     85	pLed->BlinkTimes = 0;
     86	pLed->BlinkingLedState = LED_UNKNOWN;
     87	timer_setup(&pLed->BlinkTimer, BlinkTimerCallback, 0);
     88	INIT_WORK(&pLed->BlinkWorkItem, BlinkWorkItemCallback);
     89}
     90
     91/*
     92 *	Description:
     93 *		DeInitialize an LED_871x object.
     94 */
     95static void DeInitLed871x(struct LED_871x *pLed)
     96{
     97	del_timer_sync(&pLed->BlinkTimer);
     98	/* We should reset bLedBlinkInProgress if we cancel
     99	 * the LedControlTimer,
    100	 */
    101	pLed->bLedBlinkInProgress = false;
    102}
    103
    104/*
    105 *	Description:
    106 *		Turn on LED according to LedPin specified.
    107 */
    108static void SwLedOn(struct _adapter *padapter, struct LED_871x *pLed)
    109{
    110	u8	LedCfg;
    111
    112	if (padapter->surprise_removed || padapter->driver_stopped)
    113		return;
    114	LedCfg = r8712_read8(padapter, LEDCFG);
    115	switch (pLed->LedPin) {
    116	case LED_PIN_GPIO0:
    117		break;
    118	case LED_PIN_LED0:
    119		/* SW control led0 on.*/
    120		r8712_write8(padapter, LEDCFG, LedCfg & 0xf0);
    121		break;
    122	case LED_PIN_LED1:
    123		/* SW control led1 on.*/
    124		r8712_write8(padapter, LEDCFG, LedCfg & 0x0f);
    125		break;
    126	default:
    127		break;
    128	}
    129	pLed->bLedOn = true;
    130}
    131
    132/*
    133 *	Description:
    134 *		Turn off LED according to LedPin specified.
    135 */
    136static void SwLedOff(struct _adapter *padapter, struct LED_871x *pLed)
    137{
    138	u8	LedCfg;
    139
    140	if (padapter->surprise_removed || padapter->driver_stopped)
    141		return;
    142	LedCfg = r8712_read8(padapter, LEDCFG);
    143	switch (pLed->LedPin) {
    144	case LED_PIN_GPIO0:
    145		break;
    146	case LED_PIN_LED0:
    147		LedCfg &= 0xf0; /* Set to software control.*/
    148		r8712_write8(padapter, LEDCFG, (LedCfg | BIT(3)));
    149		break;
    150	case LED_PIN_LED1:
    151		LedCfg &= 0x0f; /* Set to software control.*/
    152		r8712_write8(padapter, LEDCFG, (LedCfg | BIT(7)));
    153		break;
    154	default:
    155		break;
    156	}
    157	pLed->bLedOn = false;
    158}
    159
    160/*===========================================================================
    161 * Interface to manipulate LED objects.
    162 *===========================================================================
    163 *
    164 *	Description:
    165 *		Initialize all LED_871x objects.
    166 */
    167void r8712_InitSwLeds(struct _adapter *padapter)
    168{
    169	struct led_priv	*pledpriv = &padapter->ledpriv;
    170
    171	pledpriv->LedControlHandler = LedControl871x;
    172	InitLed871x(padapter, &pledpriv->SwLed0, LED_PIN_LED0);
    173	InitLed871x(padapter, &pledpriv->SwLed1, LED_PIN_LED1);
    174}
    175
    176/*	Description:
    177 *		DeInitialize all LED_819xUsb objects.
    178 */
    179void r8712_DeInitSwLeds(struct _adapter *padapter)
    180{
    181	struct led_priv	*ledpriv = &padapter->ledpriv;
    182
    183	DeInitLed871x(&ledpriv->SwLed0);
    184	DeInitLed871x(&ledpriv->SwLed1);
    185}
    186
    187/*	Description:
    188 *		Implementation of LED blinking behavior.
    189 *		It toggle off LED and schedule corresponding timer if necessary.
    190 */
    191static void SwLedBlink(struct LED_871x *pLed)
    192{
    193	struct _adapter *padapter = pLed->padapter;
    194	struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
    195	u8 bStopBlinking = false;
    196
    197	/* Change LED according to BlinkingLedState specified. */
    198	if (pLed->BlinkingLedState == LED_STATE_ON)
    199		SwLedOn(padapter, pLed);
    200	else
    201		SwLedOff(padapter, pLed);
    202	/* Determine if we shall change LED state again. */
    203	pLed->BlinkTimes--;
    204	switch (pLed->CurrLedState) {
    205	case LED_BLINK_NORMAL:
    206		if (pLed->BlinkTimes == 0)
    207			bStopBlinking = true;
    208		break;
    209	case LED_BLINK_StartToBlink:
    210		if (check_fwstate(pmlmepriv, _FW_LINKED) &&
    211		    (pmlmepriv->fw_state & WIFI_STATION_STATE))
    212			bStopBlinking = true;
    213		if (check_fwstate(pmlmepriv, _FW_LINKED) &&
    214		    ((pmlmepriv->fw_state & WIFI_ADHOC_STATE) ||
    215		    (pmlmepriv->fw_state & WIFI_ADHOC_MASTER_STATE)))
    216			bStopBlinking = true;
    217		else if (pLed->BlinkTimes == 0)
    218			bStopBlinking = true;
    219		break;
    220	case LED_BLINK_WPS:
    221		if (pLed->BlinkTimes == 0)
    222			bStopBlinking = true;
    223		break;
    224	default:
    225		bStopBlinking = true;
    226		break;
    227	}
    228	if (bStopBlinking) {
    229		if (check_fwstate(pmlmepriv, _FW_LINKED) &&
    230		    !pLed->bLedOn)
    231			SwLedOn(padapter, pLed);
    232		else if (check_fwstate(pmlmepriv, _FW_LINKED) &&  pLed->bLedOn)
    233			SwLedOff(padapter, pLed);
    234		pLed->BlinkTimes = 0;
    235		pLed->bLedBlinkInProgress = false;
    236	} else {
    237		/* Assign LED state to toggle. */
    238		if (pLed->BlinkingLedState == LED_STATE_ON)
    239			pLed->BlinkingLedState = LED_STATE_OFF;
    240		else
    241			pLed->BlinkingLedState = LED_STATE_ON;
    242
    243		/* Schedule a timer to toggle LED state. */
    244		switch (pLed->CurrLedState) {
    245		case LED_BLINK_NORMAL:
    246			mod_timer(&pLed->BlinkTimer, jiffies +
    247				  msecs_to_jiffies(LED_BLINK_NORMAL_INTERVAL));
    248			break;
    249		case LED_BLINK_SLOWLY:
    250		case LED_BLINK_StartToBlink:
    251			mod_timer(&pLed->BlinkTimer, jiffies +
    252				  msecs_to_jiffies(LED_BLINK_SLOWLY_INTERVAL));
    253			break;
    254		case LED_BLINK_WPS:
    255			mod_timer(&pLed->BlinkTimer, jiffies +
    256				  msecs_to_jiffies(LED_BLINK_LONG_INTERVAL));
    257			break;
    258		default:
    259			mod_timer(&pLed->BlinkTimer, jiffies +
    260				  msecs_to_jiffies(LED_BLINK_SLOWLY_INTERVAL));
    261			break;
    262		}
    263	}
    264}
    265
    266static void SwLedBlink1(struct LED_871x *pLed)
    267{
    268	struct _adapter *padapter = pLed->padapter;
    269	struct led_priv *ledpriv = &padapter->ledpriv;
    270	struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
    271	struct eeprom_priv *peeprompriv = &padapter->eeprompriv;
    272	struct LED_871x *pLed1 = &ledpriv->SwLed1;
    273	u8 bStopBlinking = false;
    274
    275	if (peeprompriv->CustomerID == RT_CID_819x_CAMEO)
    276		pLed = &ledpriv->SwLed1;
    277	/* Change LED according to BlinkingLedState specified. */
    278	if (pLed->BlinkingLedState == LED_STATE_ON)
    279		SwLedOn(padapter, pLed);
    280	else
    281		SwLedOff(padapter, pLed);
    282	if (peeprompriv->CustomerID == RT_CID_DEFAULT) {
    283		if (check_fwstate(pmlmepriv, _FW_LINKED)) {
    284			if (!pLed1->bSWLedCtrl) {
    285				SwLedOn(padapter, pLed1);
    286				pLed1->bSWLedCtrl = true;
    287			} else if (!pLed1->bLedOn) {
    288				SwLedOn(padapter, pLed1);
    289			}
    290		} else {
    291			if (!pLed1->bSWLedCtrl) {
    292				SwLedOff(padapter, pLed1);
    293				pLed1->bSWLedCtrl = true;
    294			} else if (pLed1->bLedOn) {
    295				SwLedOff(padapter, pLed1);
    296			}
    297		}
    298	}
    299	switch (pLed->CurrLedState) {
    300	case LED_BLINK_SLOWLY:
    301		if (pLed->bLedOn)
    302			pLed->BlinkingLedState = LED_STATE_OFF;
    303		else
    304			pLed->BlinkingLedState = LED_STATE_ON;
    305		mod_timer(&pLed->BlinkTimer, jiffies +
    306			  msecs_to_jiffies(LED_BLINK_NO_LINK_INTERVAL_ALPHA));
    307		break;
    308	case LED_BLINK_NORMAL:
    309		if (pLed->bLedOn)
    310			pLed->BlinkingLedState = LED_STATE_OFF;
    311		else
    312			pLed->BlinkingLedState = LED_STATE_ON;
    313		mod_timer(&pLed->BlinkTimer, jiffies +
    314			  msecs_to_jiffies(LED_BLINK_LINK_INTERVAL_ALPHA));
    315		break;
    316	case LED_SCAN_BLINK:
    317		pLed->BlinkTimes--;
    318		if (pLed->BlinkTimes == 0)
    319			bStopBlinking = true;
    320		if (bStopBlinking) {
    321			if (check_fwstate(pmlmepriv, _FW_LINKED)) {
    322				pLed->bLedLinkBlinkInProgress = true;
    323				pLed->CurrLedState = LED_BLINK_NORMAL;
    324				if (pLed->bLedOn)
    325					pLed->BlinkingLedState = LED_STATE_OFF;
    326				else
    327					pLed->BlinkingLedState = LED_STATE_ON;
    328				mod_timer(&pLed->BlinkTimer, jiffies +
    329					  msecs_to_jiffies(LED_BLINK_LINK_INTERVAL_ALPHA));
    330			} else if (!check_fwstate(pmlmepriv, _FW_LINKED)) {
    331				pLed->bLedNoLinkBlinkInProgress = true;
    332				pLed->CurrLedState = LED_BLINK_SLOWLY;
    333				if (pLed->bLedOn)
    334					pLed->BlinkingLedState = LED_STATE_OFF;
    335				else
    336					pLed->BlinkingLedState = LED_STATE_ON;
    337				mod_timer(&pLed->BlinkTimer, jiffies +
    338					  msecs_to_jiffies(LED_BLINK_NO_LINK_INTERVAL_ALPHA));
    339			}
    340			pLed->bLedScanBlinkInProgress = false;
    341		} else {
    342			if (pLed->bLedOn)
    343				pLed->BlinkingLedState = LED_STATE_OFF;
    344			else
    345				pLed->BlinkingLedState = LED_STATE_ON;
    346			mod_timer(&pLed->BlinkTimer, jiffies +
    347				  msecs_to_jiffies(LED_BLINK_SCAN_INTERVAL_ALPHA));
    348		}
    349		break;
    350	case LED_TXRX_BLINK:
    351		pLed->BlinkTimes--;
    352		if (pLed->BlinkTimes == 0)
    353			bStopBlinking = true;
    354		if (bStopBlinking) {
    355			if (check_fwstate(pmlmepriv, _FW_LINKED)) {
    356				pLed->bLedLinkBlinkInProgress = true;
    357				pLed->CurrLedState = LED_BLINK_NORMAL;
    358				if (pLed->bLedOn)
    359					pLed->BlinkingLedState = LED_STATE_OFF;
    360				else
    361					pLed->BlinkingLedState = LED_STATE_ON;
    362				mod_timer(&pLed->BlinkTimer, jiffies +
    363					  msecs_to_jiffies(LED_BLINK_LINK_INTERVAL_ALPHA));
    364			} else if (!check_fwstate(pmlmepriv, _FW_LINKED)) {
    365				pLed->bLedNoLinkBlinkInProgress = true;
    366				pLed->CurrLedState = LED_BLINK_SLOWLY;
    367				if (pLed->bLedOn)
    368					pLed->BlinkingLedState = LED_STATE_OFF;
    369				else
    370					pLed->BlinkingLedState = LED_STATE_ON;
    371				mod_timer(&pLed->BlinkTimer, jiffies +
    372					  msecs_to_jiffies(LED_BLINK_NO_LINK_INTERVAL_ALPHA));
    373			}
    374			pLed->BlinkTimes = 0;
    375			pLed->bLedBlinkInProgress = false;
    376		} else {
    377			if (pLed->bLedOn)
    378				pLed->BlinkingLedState = LED_STATE_OFF;
    379			else
    380				pLed->BlinkingLedState = LED_STATE_ON;
    381			mod_timer(&pLed->BlinkTimer, jiffies +
    382				  msecs_to_jiffies(LED_BLINK_FASTER_INTERVAL_ALPHA));
    383		}
    384		break;
    385	case LED_BLINK_WPS:
    386		if (pLed->bLedOn)
    387			pLed->BlinkingLedState = LED_STATE_OFF;
    388		else
    389			pLed->BlinkingLedState = LED_STATE_ON;
    390		mod_timer(&pLed->BlinkTimer, jiffies +
    391			  msecs_to_jiffies(LED_BLINK_SCAN_INTERVAL_ALPHA));
    392		break;
    393	case LED_BLINK_WPS_STOP:	/* WPS success */
    394		if (pLed->BlinkingLedState == LED_STATE_ON) {
    395			pLed->BlinkingLedState = LED_STATE_OFF;
    396			mod_timer(&pLed->BlinkTimer, jiffies +
    397				  msecs_to_jiffies(LED_BLINK_WPS_SUCCESS_INTERVAL_ALPHA));
    398			bStopBlinking = false;
    399		} else {
    400			bStopBlinking = true;
    401		}
    402		if (bStopBlinking) {
    403			pLed->bLedLinkBlinkInProgress = true;
    404			pLed->CurrLedState = LED_BLINK_NORMAL;
    405			if (pLed->bLedOn)
    406				pLed->BlinkingLedState = LED_STATE_OFF;
    407			else
    408				pLed->BlinkingLedState = LED_STATE_ON;
    409			mod_timer(&pLed->BlinkTimer, jiffies +
    410				  msecs_to_jiffies(LED_BLINK_LINK_INTERVAL_ALPHA));
    411		}
    412		pLed->bLedWPSBlinkInProgress = false;
    413		break;
    414	default:
    415		break;
    416	}
    417}
    418
    419static void SwLedBlink2(struct LED_871x *pLed)
    420{
    421	struct _adapter *padapter = pLed->padapter;
    422	struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
    423	u8 bStopBlinking = false;
    424
    425	/* Change LED according to BlinkingLedState specified. */
    426	if (pLed->BlinkingLedState == LED_STATE_ON)
    427		SwLedOn(padapter, pLed);
    428	else
    429		SwLedOff(padapter, pLed);
    430	switch (pLed->CurrLedState) {
    431	case LED_SCAN_BLINK:
    432		pLed->BlinkTimes--;
    433		if (pLed->BlinkTimes == 0)
    434			bStopBlinking = true;
    435		if (bStopBlinking) {
    436			if (check_fwstate(pmlmepriv, _FW_LINKED)) {
    437				pLed->CurrLedState = LED_STATE_ON;
    438				pLed->BlinkingLedState = LED_STATE_ON;
    439				SwLedOn(padapter, pLed);
    440			} else if (!check_fwstate(pmlmepriv, _FW_LINKED)) {
    441				pLed->CurrLedState = LED_STATE_OFF;
    442				pLed->BlinkingLedState = LED_STATE_OFF;
    443				SwLedOff(padapter, pLed);
    444			}
    445			pLed->bLedScanBlinkInProgress = false;
    446		} else {
    447			if (pLed->bLedOn)
    448				pLed->BlinkingLedState = LED_STATE_OFF;
    449			else
    450				pLed->BlinkingLedState = LED_STATE_ON;
    451			mod_timer(&pLed->BlinkTimer, jiffies +
    452				  msecs_to_jiffies(LED_BLINK_SCAN_INTERVAL_ALPHA));
    453		}
    454		break;
    455	case LED_TXRX_BLINK:
    456		pLed->BlinkTimes--;
    457		if (pLed->BlinkTimes == 0)
    458			bStopBlinking = true;
    459		if (bStopBlinking) {
    460			if (check_fwstate(pmlmepriv, _FW_LINKED)) {
    461				pLed->CurrLedState = LED_STATE_ON;
    462				pLed->BlinkingLedState = LED_STATE_ON;
    463				SwLedOn(padapter, pLed);
    464			} else if (!check_fwstate(pmlmepriv, _FW_LINKED)) {
    465				pLed->CurrLedState = LED_STATE_OFF;
    466				pLed->BlinkingLedState = LED_STATE_OFF;
    467				SwLedOff(padapter, pLed);
    468			}
    469			pLed->bLedBlinkInProgress = false;
    470		} else {
    471			if (pLed->bLedOn)
    472				pLed->BlinkingLedState = LED_STATE_OFF;
    473			else
    474				pLed->BlinkingLedState = LED_STATE_ON;
    475			mod_timer(&pLed->BlinkTimer, jiffies +
    476				  msecs_to_jiffies(LED_BLINK_FASTER_INTERVAL_ALPHA));
    477		}
    478		break;
    479	default:
    480		break;
    481	}
    482}
    483
    484static void SwLedBlink3(struct LED_871x *pLed)
    485{
    486	struct _adapter *padapter = pLed->padapter;
    487	struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
    488	u8 bStopBlinking = false;
    489
    490	/* Change LED according to BlinkingLedState specified. */
    491	if (pLed->BlinkingLedState == LED_STATE_ON)
    492		SwLedOn(padapter, pLed);
    493	else
    494		if (pLed->CurrLedState != LED_BLINK_WPS_STOP)
    495			SwLedOff(padapter, pLed);
    496	switch (pLed->CurrLedState) {
    497	case LED_SCAN_BLINK:
    498		pLed->BlinkTimes--;
    499		if (pLed->BlinkTimes == 0)
    500			bStopBlinking = true;
    501		if (bStopBlinking) {
    502			if (check_fwstate(pmlmepriv, _FW_LINKED)) {
    503				pLed->CurrLedState = LED_STATE_ON;
    504				pLed->BlinkingLedState = LED_STATE_ON;
    505				if (!pLed->bLedOn)
    506					SwLedOn(padapter, pLed);
    507			} else if (!check_fwstate(pmlmepriv, _FW_LINKED)) {
    508				pLed->CurrLedState = LED_STATE_OFF;
    509				pLed->BlinkingLedState = LED_STATE_OFF;
    510				if (pLed->bLedOn)
    511					SwLedOff(padapter, pLed);
    512			}
    513			pLed->bLedScanBlinkInProgress = false;
    514		} else {
    515			if (pLed->bLedOn)
    516				pLed->BlinkingLedState = LED_STATE_OFF;
    517			else
    518				pLed->BlinkingLedState = LED_STATE_ON;
    519			mod_timer(&pLed->BlinkTimer, jiffies +
    520				  msecs_to_jiffies(LED_BLINK_SCAN_INTERVAL_ALPHA));
    521		}
    522		break;
    523	case LED_TXRX_BLINK:
    524		pLed->BlinkTimes--;
    525		if (pLed->BlinkTimes == 0)
    526			bStopBlinking = true;
    527		if (bStopBlinking) {
    528			if (check_fwstate(pmlmepriv, _FW_LINKED)) {
    529				pLed->CurrLedState = LED_STATE_ON;
    530				pLed->BlinkingLedState = LED_STATE_ON;
    531				if (!pLed->bLedOn)
    532					SwLedOn(padapter, pLed);
    533			} else if (!check_fwstate(pmlmepriv, _FW_LINKED)) {
    534				pLed->CurrLedState = LED_STATE_OFF;
    535				pLed->BlinkingLedState = LED_STATE_OFF;
    536				if (pLed->bLedOn)
    537					SwLedOff(padapter, pLed);
    538			}
    539			pLed->bLedBlinkInProgress = false;
    540		} else {
    541			if (pLed->bLedOn)
    542				pLed->BlinkingLedState = LED_STATE_OFF;
    543			else
    544				pLed->BlinkingLedState = LED_STATE_ON;
    545			mod_timer(&pLed->BlinkTimer, jiffies +
    546				  msecs_to_jiffies(LED_BLINK_FASTER_INTERVAL_ALPHA));
    547		}
    548		break;
    549	case LED_BLINK_WPS:
    550		if (pLed->bLedOn)
    551			pLed->BlinkingLedState = LED_STATE_OFF;
    552		else
    553			pLed->BlinkingLedState = LED_STATE_ON;
    554		mod_timer(&pLed->BlinkTimer, jiffies +
    555			  msecs_to_jiffies(LED_BLINK_SCAN_INTERVAL_ALPHA));
    556		break;
    557	case LED_BLINK_WPS_STOP:	/*WPS success*/
    558		if (pLed->BlinkingLedState == LED_STATE_ON) {
    559			pLed->BlinkingLedState = LED_STATE_OFF;
    560			mod_timer(&pLed->BlinkTimer, jiffies +
    561				  msecs_to_jiffies(LED_BLINK_WPS_SUCCESS_INTERVAL_ALPHA));
    562			bStopBlinking = false;
    563		} else {
    564			bStopBlinking = true;
    565		}
    566		if (bStopBlinking) {
    567			pLed->CurrLedState = LED_STATE_ON;
    568			pLed->BlinkingLedState = LED_STATE_ON;
    569			SwLedOn(padapter, pLed);
    570			pLed->bLedWPSBlinkInProgress = false;
    571		}
    572		break;
    573	default:
    574		break;
    575	}
    576}
    577
    578static void SwLedBlink4(struct LED_871x *pLed)
    579{
    580	struct _adapter *padapter = pLed->padapter;
    581	struct led_priv	*ledpriv = &padapter->ledpriv;
    582	struct LED_871x *pLed1 = &ledpriv->SwLed1;
    583	u8 bStopBlinking = false;
    584
    585	/* Change LED according to BlinkingLedState specified. */
    586	if (pLed->BlinkingLedState == LED_STATE_ON)
    587		SwLedOn(padapter, pLed);
    588	else
    589		SwLedOff(padapter, pLed);
    590	if (!pLed1->bLedWPSBlinkInProgress &&
    591	    pLed1->BlinkingLedState == LED_UNKNOWN) {
    592		pLed1->BlinkingLedState = LED_STATE_OFF;
    593		pLed1->CurrLedState = LED_STATE_OFF;
    594		SwLedOff(padapter, pLed1);
    595	}
    596	switch (pLed->CurrLedState) {
    597	case LED_BLINK_SLOWLY:
    598		if (pLed->bLedOn)
    599			pLed->BlinkingLedState = LED_STATE_OFF;
    600		else
    601			pLed->BlinkingLedState = LED_STATE_ON;
    602		mod_timer(&pLed->BlinkTimer, jiffies +
    603			  msecs_to_jiffies(LED_BLINK_NO_LINK_INTERVAL_ALPHA));
    604		break;
    605	case LED_BLINK_StartToBlink:
    606		if (pLed->bLedOn) {
    607			pLed->BlinkingLedState = LED_STATE_OFF;
    608			mod_timer(&pLed->BlinkTimer, jiffies +
    609				  msecs_to_jiffies(LED_BLINK_SLOWLY_INTERVAL));
    610		} else {
    611			pLed->BlinkingLedState = LED_STATE_ON;
    612			mod_timer(&pLed->BlinkTimer, jiffies +
    613				  msecs_to_jiffies(LED_BLINK_NORMAL_INTERVAL));
    614		}
    615		break;
    616	case LED_SCAN_BLINK:
    617		pLed->BlinkTimes--;
    618		if (pLed->BlinkTimes == 0)
    619			bStopBlinking = true;
    620		if (bStopBlinking) {
    621			pLed->bLedNoLinkBlinkInProgress = true;
    622			pLed->CurrLedState = LED_BLINK_SLOWLY;
    623			if (pLed->bLedOn)
    624				pLed->BlinkingLedState = LED_STATE_OFF;
    625			else
    626				pLed->BlinkingLedState = LED_STATE_ON;
    627			mod_timer(&pLed->BlinkTimer, jiffies +
    628				  msecs_to_jiffies(LED_BLINK_NO_LINK_INTERVAL_ALPHA));
    629			pLed->bLedScanBlinkInProgress = false;
    630		} else {
    631			if (pLed->bLedOn)
    632				pLed->BlinkingLedState = LED_STATE_OFF;
    633			else
    634				pLed->BlinkingLedState = LED_STATE_ON;
    635			mod_timer(&pLed->BlinkTimer, jiffies +
    636				  msecs_to_jiffies(LED_BLINK_SCAN_INTERVAL_ALPHA));
    637		}
    638		break;
    639	case LED_TXRX_BLINK:
    640		pLed->BlinkTimes--;
    641		if (pLed->BlinkTimes == 0)
    642			bStopBlinking = true;
    643		if (bStopBlinking) {
    644			pLed->bLedNoLinkBlinkInProgress = true;
    645			pLed->CurrLedState = LED_BLINK_SLOWLY;
    646			if (pLed->bLedOn)
    647				pLed->BlinkingLedState = LED_STATE_OFF;
    648			else
    649				pLed->BlinkingLedState = LED_STATE_ON;
    650			mod_timer(&pLed->BlinkTimer, jiffies +
    651				  msecs_to_jiffies(LED_BLINK_NO_LINK_INTERVAL_ALPHA));
    652			pLed->bLedBlinkInProgress = false;
    653		} else {
    654			if (pLed->bLedOn)
    655				pLed->BlinkingLedState = LED_STATE_OFF;
    656			else
    657				pLed->BlinkingLedState = LED_STATE_ON;
    658			mod_timer(&pLed->BlinkTimer, jiffies +
    659				  msecs_to_jiffies(LED_BLINK_FASTER_INTERVAL_ALPHA));
    660		}
    661		break;
    662	case LED_BLINK_WPS:
    663		if (pLed->bLedOn) {
    664			pLed->BlinkingLedState = LED_STATE_OFF;
    665			mod_timer(&pLed->BlinkTimer, jiffies +
    666				  msecs_to_jiffies(LED_BLINK_SLOWLY_INTERVAL));
    667		} else {
    668			pLed->BlinkingLedState = LED_STATE_ON;
    669			mod_timer(&pLed->BlinkTimer, jiffies +
    670				  msecs_to_jiffies(LED_BLINK_NORMAL_INTERVAL));
    671		}
    672		break;
    673	case LED_BLINK_WPS_STOP:	/*WPS authentication fail*/
    674		if (pLed->bLedOn)
    675			pLed->BlinkingLedState = LED_STATE_OFF;
    676		else
    677			pLed->BlinkingLedState = LED_STATE_ON;
    678		mod_timer(&pLed->BlinkTimer, jiffies +
    679			  msecs_to_jiffies(LED_BLINK_NORMAL_INTERVAL));
    680		break;
    681	case LED_BLINK_WPS_STOP_OVERLAP:	/*WPS session overlap */
    682		pLed->BlinkTimes--;
    683		if (pLed->BlinkTimes == 0) {
    684			if (pLed->bLedOn)
    685				pLed->BlinkTimes = 1;
    686			else
    687				bStopBlinking = true;
    688		}
    689		if (bStopBlinking) {
    690			pLed->BlinkTimes = 10;
    691			pLed->BlinkingLedState = LED_STATE_ON;
    692			mod_timer(&pLed->BlinkTimer, jiffies +
    693				  msecs_to_jiffies(LED_BLINK_LINK_INTERVAL_ALPHA));
    694		} else {
    695			if (pLed->bLedOn)
    696				pLed->BlinkingLedState = LED_STATE_OFF;
    697			else
    698				pLed->BlinkingLedState = LED_STATE_ON;
    699			mod_timer(&pLed->BlinkTimer, jiffies +
    700				  msecs_to_jiffies(LED_BLINK_NORMAL_INTERVAL));
    701		}
    702		break;
    703	default:
    704		break;
    705	}
    706}
    707
    708static void SwLedBlink5(struct LED_871x *pLed)
    709{
    710	struct _adapter *padapter = pLed->padapter;
    711	u8 bStopBlinking = false;
    712
    713	/* Change LED according to BlinkingLedState specified. */
    714	if (pLed->BlinkingLedState == LED_STATE_ON)
    715		SwLedOn(padapter, pLed);
    716	else
    717		SwLedOff(padapter, pLed);
    718	switch (pLed->CurrLedState) {
    719	case LED_SCAN_BLINK:
    720		pLed->BlinkTimes--;
    721		if (pLed->BlinkTimes == 0)
    722			bStopBlinking = true;
    723		if (bStopBlinking) {
    724			pLed->CurrLedState = LED_STATE_ON;
    725			pLed->BlinkingLedState = LED_STATE_ON;
    726			if (!pLed->bLedOn)
    727				mod_timer(&pLed->BlinkTimer, jiffies +
    728					  msecs_to_jiffies(LED_BLINK_FASTER_INTERVAL_ALPHA));
    729			pLed->bLedScanBlinkInProgress = false;
    730		} else {
    731			if (pLed->bLedOn)
    732				pLed->BlinkingLedState = LED_STATE_OFF;
    733			else
    734				pLed->BlinkingLedState = LED_STATE_ON;
    735			mod_timer(&pLed->BlinkTimer, jiffies +
    736				  msecs_to_jiffies(LED_BLINK_SCAN_INTERVAL_ALPHA));
    737		}
    738		break;
    739	case LED_TXRX_BLINK:
    740		pLed->BlinkTimes--;
    741		if (pLed->BlinkTimes == 0)
    742			bStopBlinking = true;
    743		if (bStopBlinking) {
    744			pLed->CurrLedState = LED_STATE_ON;
    745			pLed->BlinkingLedState = LED_STATE_ON;
    746			if (!pLed->bLedOn)
    747				mod_timer(&pLed->BlinkTimer, jiffies +
    748					  msecs_to_jiffies(LED_BLINK_FASTER_INTERVAL_ALPHA));
    749			pLed->bLedBlinkInProgress = false;
    750		} else {
    751			if (pLed->bLedOn)
    752				pLed->BlinkingLedState = LED_STATE_OFF;
    753			else
    754				pLed->BlinkingLedState = LED_STATE_ON;
    755			mod_timer(&pLed->BlinkTimer, jiffies +
    756				  msecs_to_jiffies(LED_BLINK_FASTER_INTERVAL_ALPHA));
    757		}
    758		break;
    759	default:
    760		break;
    761	}
    762}
    763
    764static void SwLedBlink6(struct LED_871x *pLed)
    765{
    766	struct _adapter *padapter = pLed->padapter;
    767	u8 bStopBlinking = false;
    768
    769	/* Change LED according to BlinkingLedState specified. */
    770	if (pLed->BlinkingLedState == LED_STATE_ON)
    771		SwLedOn(padapter, pLed);
    772	else
    773		SwLedOff(padapter, pLed);
    774	switch (pLed->CurrLedState) {
    775	case LED_TXRX_BLINK:
    776		pLed->BlinkTimes--;
    777		if (pLed->BlinkTimes == 0)
    778			bStopBlinking = true;
    779		if (bStopBlinking) {
    780			pLed->CurrLedState = LED_STATE_ON;
    781			pLed->BlinkingLedState = LED_STATE_ON;
    782			if (!pLed->bLedOn)
    783				SwLedOn(padapter, pLed);
    784			pLed->bLedBlinkInProgress = false;
    785		} else {
    786			if (pLed->bLedOn)
    787				pLed->BlinkingLedState = LED_STATE_OFF;
    788			else
    789				pLed->BlinkingLedState = LED_STATE_ON;
    790			mod_timer(&pLed->BlinkTimer, jiffies +
    791				  msecs_to_jiffies(LED_BLINK_FASTER_INTERVAL_ALPHA));
    792		}
    793		break;
    794	case LED_BLINK_WPS:
    795		if (pLed->bLedOn)
    796			pLed->BlinkingLedState = LED_STATE_OFF;
    797		else
    798			pLed->BlinkingLedState = LED_STATE_ON;
    799		mod_timer(&pLed->BlinkTimer, jiffies +
    800			  msecs_to_jiffies(LED_BLINK_SCAN_INTERVAL_ALPHA));
    801		break;
    802
    803	default:
    804		break;
    805	}
    806}
    807
    808/*	Description:
    809 *		Callback function of LED BlinkTimer,
    810 *		it just schedules to corresponding BlinkWorkItem.
    811 */
    812static void BlinkTimerCallback(struct timer_list *t)
    813{
    814	struct LED_871x  *pLed = from_timer(pLed, t, BlinkTimer);
    815
    816	/* This fixed the crash problem on Fedora 12 when trying to do the
    817	 * insmod;ifconfig up;rmmod commands.
    818	 */
    819	if (pLed->padapter->surprise_removed || pLed->padapter->driver_stopped)
    820		return;
    821	schedule_work(&pLed->BlinkWorkItem);
    822}
    823
    824/*	Description:
    825 *		Callback function of LED BlinkWorkItem.
    826 *		We dispatch actual LED blink action according to LedStrategy.
    827 */
    828static void BlinkWorkItemCallback(struct work_struct *work)
    829{
    830	struct LED_871x *pLed = container_of(work, struct LED_871x,
    831				BlinkWorkItem);
    832	struct led_priv	*ledpriv = &pLed->padapter->ledpriv;
    833
    834	switch (ledpriv->LedStrategy) {
    835	case SW_LED_MODE0:
    836		SwLedBlink(pLed);
    837		break;
    838	case SW_LED_MODE1:
    839		SwLedBlink1(pLed);
    840		break;
    841	case SW_LED_MODE2:
    842		SwLedBlink2(pLed);
    843		break;
    844	case SW_LED_MODE3:
    845		SwLedBlink3(pLed);
    846		break;
    847	case SW_LED_MODE4:
    848		SwLedBlink4(pLed);
    849		break;
    850	case SW_LED_MODE5:
    851		SwLedBlink5(pLed);
    852		break;
    853	case SW_LED_MODE6:
    854		SwLedBlink6(pLed);
    855		break;
    856	default:
    857		SwLedBlink(pLed);
    858		break;
    859	}
    860}
    861
    862/*============================================================================
    863 * Default LED behavior.
    864 *============================================================================
    865 *
    866 *	Description:
    867 *		Implement each led action for SW_LED_MODE0.
    868 *		This is default strategy.
    869 */
    870
    871static void SwLedControlMode1(struct _adapter *padapter,
    872			      enum LED_CTL_MODE LedAction)
    873{
    874	struct led_priv *ledpriv = &padapter->ledpriv;
    875	struct LED_871x *pLed = &ledpriv->SwLed0;
    876	struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
    877	struct sitesurvey_ctrl *psitesurveyctrl = &pmlmepriv->sitesurveyctrl;
    878
    879	if (padapter->eeprompriv.CustomerID == RT_CID_819x_CAMEO)
    880		pLed = &ledpriv->SwLed1;
    881	switch (LedAction) {
    882	case LED_CTL_START_TO_LINK:
    883	case LED_CTL_NO_LINK:
    884		if (!pLed->bLedNoLinkBlinkInProgress) {
    885			if (pLed->CurrLedState == LED_SCAN_BLINK ||
    886			    IS_LED_WPS_BLINKING(pLed))
    887				return;
    888			if (pLed->bLedLinkBlinkInProgress) {
    889				del_timer(&pLed->BlinkTimer);
    890				pLed->bLedLinkBlinkInProgress = false;
    891			}
    892			if (pLed->bLedBlinkInProgress) {
    893				del_timer(&pLed->BlinkTimer);
    894				pLed->bLedBlinkInProgress = false;
    895			}
    896			pLed->bLedNoLinkBlinkInProgress = true;
    897			pLed->CurrLedState = LED_BLINK_SLOWLY;
    898			if (pLed->bLedOn)
    899				pLed->BlinkingLedState = LED_STATE_OFF;
    900			else
    901				pLed->BlinkingLedState = LED_STATE_ON;
    902			mod_timer(&pLed->BlinkTimer, jiffies +
    903				  msecs_to_jiffies(LED_BLINK_NO_LINK_INTERVAL_ALPHA));
    904		}
    905		break;
    906	case LED_CTL_LINK:
    907		if (!pLed->bLedLinkBlinkInProgress) {
    908			if (pLed->CurrLedState == LED_SCAN_BLINK ||
    909			    IS_LED_WPS_BLINKING(pLed))
    910				return;
    911			if (pLed->bLedNoLinkBlinkInProgress) {
    912				del_timer(&pLed->BlinkTimer);
    913				pLed->bLedNoLinkBlinkInProgress = false;
    914			}
    915			if (pLed->bLedBlinkInProgress) {
    916				del_timer(&pLed->BlinkTimer);
    917				pLed->bLedBlinkInProgress = false;
    918			}
    919			pLed->bLedLinkBlinkInProgress = true;
    920			pLed->CurrLedState = LED_BLINK_NORMAL;
    921			if (pLed->bLedOn)
    922				pLed->BlinkingLedState = LED_STATE_OFF;
    923			else
    924				pLed->BlinkingLedState = LED_STATE_ON;
    925			mod_timer(&pLed->BlinkTimer, jiffies +
    926				  msecs_to_jiffies(LED_BLINK_LINK_INTERVAL_ALPHA));
    927		}
    928		break;
    929	case LED_CTL_SITE_SURVEY:
    930		if (psitesurveyctrl->traffic_busy &&
    931		    check_fwstate(pmlmepriv, _FW_LINKED))
    932			; /* dummy branch */
    933		else if (!pLed->bLedScanBlinkInProgress) {
    934			if (IS_LED_WPS_BLINKING(pLed))
    935				return;
    936			if (pLed->bLedNoLinkBlinkInProgress) {
    937				del_timer(&pLed->BlinkTimer);
    938				pLed->bLedNoLinkBlinkInProgress = false;
    939			}
    940			if (pLed->bLedLinkBlinkInProgress) {
    941				del_timer(&pLed->BlinkTimer);
    942				pLed->bLedLinkBlinkInProgress = false;
    943			}
    944			if (pLed->bLedBlinkInProgress) {
    945				del_timer(&pLed->BlinkTimer);
    946				pLed->bLedBlinkInProgress = false;
    947			}
    948			pLed->bLedScanBlinkInProgress = true;
    949			pLed->CurrLedState = LED_SCAN_BLINK;
    950			pLed->BlinkTimes = 24;
    951			if (pLed->bLedOn)
    952				pLed->BlinkingLedState = LED_STATE_OFF;
    953			else
    954				pLed->BlinkingLedState = LED_STATE_ON;
    955			mod_timer(&pLed->BlinkTimer, jiffies +
    956				  msecs_to_jiffies(LED_BLINK_SCAN_INTERVAL_ALPHA));
    957		}
    958		break;
    959	case LED_CTL_TX:
    960	case LED_CTL_RX:
    961		if (!pLed->bLedBlinkInProgress) {
    962			if (pLed->CurrLedState == LED_SCAN_BLINK ||
    963			    IS_LED_WPS_BLINKING(pLed))
    964				return;
    965			if (pLed->bLedNoLinkBlinkInProgress) {
    966				del_timer(&pLed->BlinkTimer);
    967				pLed->bLedNoLinkBlinkInProgress = false;
    968			}
    969			if (pLed->bLedLinkBlinkInProgress) {
    970				del_timer(&pLed->BlinkTimer);
    971				pLed->bLedLinkBlinkInProgress = false;
    972			}
    973			pLed->bLedBlinkInProgress = true;
    974			pLed->CurrLedState = LED_TXRX_BLINK;
    975			pLed->BlinkTimes = 2;
    976			if (pLed->bLedOn)
    977				pLed->BlinkingLedState = LED_STATE_OFF;
    978			else
    979				pLed->BlinkingLedState = LED_STATE_ON;
    980			mod_timer(&pLed->BlinkTimer, jiffies +
    981				  msecs_to_jiffies(LED_BLINK_FASTER_INTERVAL_ALPHA));
    982		}
    983		break;
    984
    985	case LED_CTL_START_WPS: /*wait until xinpin finish */
    986	case LED_CTL_START_WPS_BOTTON:
    987		if (!pLed->bLedWPSBlinkInProgress) {
    988			if (pLed->bLedNoLinkBlinkInProgress) {
    989				del_timer(&pLed->BlinkTimer);
    990				pLed->bLedNoLinkBlinkInProgress = false;
    991			}
    992			if (pLed->bLedLinkBlinkInProgress) {
    993				del_timer(&pLed->BlinkTimer);
    994				pLed->bLedLinkBlinkInProgress = false;
    995			}
    996			if (pLed->bLedBlinkInProgress) {
    997				del_timer(&pLed->BlinkTimer);
    998				pLed->bLedBlinkInProgress = false;
    999			}
   1000			if (pLed->bLedScanBlinkInProgress) {
   1001				del_timer(&pLed->BlinkTimer);
   1002				pLed->bLedScanBlinkInProgress = false;
   1003			}
   1004			pLed->bLedWPSBlinkInProgress = true;
   1005			pLed->CurrLedState = LED_BLINK_WPS;
   1006			if (pLed->bLedOn)
   1007				pLed->BlinkingLedState = LED_STATE_OFF;
   1008			else
   1009				pLed->BlinkingLedState = LED_STATE_ON;
   1010			mod_timer(&pLed->BlinkTimer, jiffies +
   1011				  msecs_to_jiffies(LED_BLINK_SCAN_INTERVAL_ALPHA));
   1012		}
   1013		break;
   1014	case LED_CTL_STOP_WPS:
   1015		if (pLed->bLedNoLinkBlinkInProgress) {
   1016			del_timer(&pLed->BlinkTimer);
   1017			pLed->bLedNoLinkBlinkInProgress = false;
   1018		}
   1019		if (pLed->bLedLinkBlinkInProgress) {
   1020			del_timer(&pLed->BlinkTimer);
   1021			pLed->bLedLinkBlinkInProgress = false;
   1022		}
   1023		if (pLed->bLedBlinkInProgress) {
   1024			del_timer(&pLed->BlinkTimer);
   1025			pLed->bLedBlinkInProgress = false;
   1026		}
   1027		if (pLed->bLedScanBlinkInProgress) {
   1028			del_timer(&pLed->BlinkTimer);
   1029			pLed->bLedScanBlinkInProgress = false;
   1030		}
   1031		if (pLed->bLedWPSBlinkInProgress)
   1032			del_timer(&pLed->BlinkTimer);
   1033		else
   1034			pLed->bLedWPSBlinkInProgress = true;
   1035		pLed->CurrLedState = LED_BLINK_WPS_STOP;
   1036		if (pLed->bLedOn) {
   1037			pLed->BlinkingLedState = LED_STATE_OFF;
   1038			mod_timer(&pLed->BlinkTimer, jiffies +
   1039				  msecs_to_jiffies(LED_BLINK_WPS_SUCCESS_INTERVAL_ALPHA));
   1040		} else {
   1041			pLed->BlinkingLedState = LED_STATE_ON;
   1042			mod_timer(&pLed->BlinkTimer,
   1043				  jiffies + msecs_to_jiffies(0));
   1044		}
   1045		break;
   1046	case LED_CTL_STOP_WPS_FAIL:
   1047		if (pLed->bLedWPSBlinkInProgress) {
   1048			del_timer(&pLed->BlinkTimer);
   1049			pLed->bLedWPSBlinkInProgress = false;
   1050		}
   1051		pLed->bLedNoLinkBlinkInProgress = true;
   1052		pLed->CurrLedState = LED_BLINK_SLOWLY;
   1053		if (pLed->bLedOn)
   1054			pLed->BlinkingLedState = LED_STATE_OFF;
   1055		else
   1056			pLed->BlinkingLedState = LED_STATE_ON;
   1057		mod_timer(&pLed->BlinkTimer, jiffies +
   1058			  msecs_to_jiffies(LED_BLINK_NO_LINK_INTERVAL_ALPHA));
   1059		break;
   1060	case LED_CTL_POWER_OFF:
   1061		pLed->CurrLedState = LED_STATE_OFF;
   1062		pLed->BlinkingLedState = LED_STATE_OFF;
   1063		if (pLed->bLedNoLinkBlinkInProgress) {
   1064			del_timer(&pLed->BlinkTimer);
   1065			pLed->bLedNoLinkBlinkInProgress = false;
   1066		}
   1067		if (pLed->bLedLinkBlinkInProgress) {
   1068			del_timer(&pLed->BlinkTimer);
   1069			pLed->bLedLinkBlinkInProgress = false;
   1070		}
   1071		if (pLed->bLedBlinkInProgress) {
   1072			del_timer(&pLed->BlinkTimer);
   1073			pLed->bLedBlinkInProgress = false;
   1074		}
   1075		if (pLed->bLedWPSBlinkInProgress) {
   1076			del_timer(&pLed->BlinkTimer);
   1077			pLed->bLedWPSBlinkInProgress = false;
   1078		}
   1079		if (pLed->bLedScanBlinkInProgress) {
   1080			del_timer(&pLed->BlinkTimer);
   1081			pLed->bLedScanBlinkInProgress = false;
   1082		}
   1083		mod_timer(&pLed->BlinkTimer,
   1084			  jiffies + msecs_to_jiffies(0));
   1085		break;
   1086	default:
   1087		break;
   1088	}
   1089}
   1090
   1091static void SwLedControlMode2(struct _adapter *padapter,
   1092			      enum LED_CTL_MODE LedAction)
   1093{
   1094	struct led_priv	 *ledpriv = &padapter->ledpriv;
   1095	struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
   1096	struct LED_871x *pLed = &ledpriv->SwLed0;
   1097
   1098	switch (LedAction) {
   1099	case LED_CTL_SITE_SURVEY:
   1100		if (pmlmepriv->sitesurveyctrl.traffic_busy)
   1101			; /* dummy branch */
   1102		else if (!pLed->bLedScanBlinkInProgress) {
   1103			if (IS_LED_WPS_BLINKING(pLed))
   1104				return;
   1105
   1106			if (pLed->bLedBlinkInProgress) {
   1107				del_timer(&pLed->BlinkTimer);
   1108				pLed->bLedBlinkInProgress = false;
   1109			}
   1110			pLed->bLedScanBlinkInProgress = true;
   1111			pLed->CurrLedState = LED_SCAN_BLINK;
   1112			pLed->BlinkTimes = 24;
   1113			if (pLed->bLedOn)
   1114				pLed->BlinkingLedState = LED_STATE_OFF;
   1115			else
   1116				pLed->BlinkingLedState = LED_STATE_ON;
   1117			mod_timer(&pLed->BlinkTimer, jiffies +
   1118				  msecs_to_jiffies(LED_BLINK_SCAN_INTERVAL_ALPHA));
   1119		}
   1120		break;
   1121
   1122	case LED_CTL_TX:
   1123	case LED_CTL_RX:
   1124		if (!pLed->bLedBlinkInProgress &&
   1125		    check_fwstate(pmlmepriv, _FW_LINKED)) {
   1126			if (pLed->CurrLedState == LED_SCAN_BLINK ||
   1127			    IS_LED_WPS_BLINKING(pLed))
   1128				return;
   1129			pLed->bLedBlinkInProgress = true;
   1130			pLed->CurrLedState = LED_TXRX_BLINK;
   1131			pLed->BlinkTimes = 2;
   1132			if (pLed->bLedOn)
   1133				pLed->BlinkingLedState = LED_STATE_OFF;
   1134			else
   1135				pLed->BlinkingLedState = LED_STATE_ON;
   1136			mod_timer(&pLed->BlinkTimer, jiffies +
   1137				  msecs_to_jiffies(LED_BLINK_FASTER_INTERVAL_ALPHA));
   1138		}
   1139		break;
   1140
   1141	case LED_CTL_LINK:
   1142		pLed->CurrLedState = LED_STATE_ON;
   1143		pLed->BlinkingLedState = LED_STATE_ON;
   1144		if (pLed->bLedBlinkInProgress) {
   1145			del_timer(&pLed->BlinkTimer);
   1146			pLed->bLedBlinkInProgress = false;
   1147		}
   1148		if (pLed->bLedScanBlinkInProgress) {
   1149			del_timer(&pLed->BlinkTimer);
   1150			pLed->bLedScanBlinkInProgress = false;
   1151		}
   1152
   1153		mod_timer(&pLed->BlinkTimer,
   1154			  jiffies + msecs_to_jiffies(0));
   1155		break;
   1156
   1157	case LED_CTL_START_WPS: /*wait until xinpin finish*/
   1158	case LED_CTL_START_WPS_BOTTON:
   1159		if (!pLed->bLedWPSBlinkInProgress) {
   1160			if (pLed->bLedBlinkInProgress) {
   1161				del_timer(&pLed->BlinkTimer);
   1162				pLed->bLedBlinkInProgress = false;
   1163			}
   1164			if (pLed->bLedScanBlinkInProgress) {
   1165				del_timer(&pLed->BlinkTimer);
   1166				pLed->bLedScanBlinkInProgress = false;
   1167			}
   1168			pLed->bLedWPSBlinkInProgress = true;
   1169			pLed->CurrLedState = LED_STATE_ON;
   1170			pLed->BlinkingLedState = LED_STATE_ON;
   1171			mod_timer(&pLed->BlinkTimer,
   1172				  jiffies + msecs_to_jiffies(0));
   1173		}
   1174		break;
   1175
   1176	case LED_CTL_STOP_WPS:
   1177		pLed->bLedWPSBlinkInProgress = false;
   1178		pLed->CurrLedState = LED_STATE_ON;
   1179		pLed->BlinkingLedState = LED_STATE_ON;
   1180		mod_timer(&pLed->BlinkTimer,
   1181			  jiffies + msecs_to_jiffies(0));
   1182		break;
   1183
   1184	case LED_CTL_STOP_WPS_FAIL:
   1185		pLed->bLedWPSBlinkInProgress = false;
   1186		pLed->CurrLedState = LED_STATE_OFF;
   1187		pLed->BlinkingLedState = LED_STATE_OFF;
   1188		mod_timer(&pLed->BlinkTimer,
   1189			  jiffies + msecs_to_jiffies(0));
   1190		break;
   1191
   1192	case LED_CTL_START_TO_LINK:
   1193	case LED_CTL_NO_LINK:
   1194		if (!IS_LED_BLINKING(pLed)) {
   1195			pLed->CurrLedState = LED_STATE_OFF;
   1196			pLed->BlinkingLedState = LED_STATE_OFF;
   1197			mod_timer(&pLed->BlinkTimer,
   1198				  jiffies + msecs_to_jiffies(0));
   1199		}
   1200		break;
   1201	case LED_CTL_POWER_OFF:
   1202		pLed->CurrLedState = LED_STATE_OFF;
   1203		pLed->BlinkingLedState = LED_STATE_OFF;
   1204		if (pLed->bLedBlinkInProgress) {
   1205			del_timer(&pLed->BlinkTimer);
   1206			pLed->bLedBlinkInProgress = false;
   1207		}
   1208		if (pLed->bLedScanBlinkInProgress) {
   1209			del_timer(&pLed->BlinkTimer);
   1210			pLed->bLedScanBlinkInProgress = false;
   1211		}
   1212		if (pLed->bLedWPSBlinkInProgress) {
   1213			del_timer(&pLed->BlinkTimer);
   1214			pLed->bLedWPSBlinkInProgress = false;
   1215		}
   1216		mod_timer(&pLed->BlinkTimer,
   1217			  jiffies + msecs_to_jiffies(0));
   1218		break;
   1219	default:
   1220		break;
   1221	}
   1222}
   1223
   1224static void SwLedControlMode3(struct _adapter *padapter,
   1225			      enum LED_CTL_MODE LedAction)
   1226{
   1227	struct led_priv	*ledpriv = &padapter->ledpriv;
   1228	struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
   1229	struct LED_871x *pLed = &ledpriv->SwLed0;
   1230
   1231	switch (LedAction) {
   1232	case LED_CTL_SITE_SURVEY:
   1233		if (pmlmepriv->sitesurveyctrl.traffic_busy)
   1234			; /* dummy branch */
   1235		else if (!pLed->bLedScanBlinkInProgress) {
   1236			if (IS_LED_WPS_BLINKING(pLed))
   1237				return;
   1238			if (pLed->bLedBlinkInProgress) {
   1239				del_timer(&pLed->BlinkTimer);
   1240				pLed->bLedBlinkInProgress = false;
   1241			}
   1242			pLed->bLedScanBlinkInProgress = true;
   1243			pLed->CurrLedState = LED_SCAN_BLINK;
   1244			pLed->BlinkTimes = 24;
   1245			if (pLed->bLedOn)
   1246				pLed->BlinkingLedState = LED_STATE_OFF;
   1247			else
   1248				pLed->BlinkingLedState = LED_STATE_ON;
   1249			mod_timer(&pLed->BlinkTimer, jiffies +
   1250				  msecs_to_jiffies(LED_BLINK_SCAN_INTERVAL_ALPHA));
   1251		}
   1252		break;
   1253	case LED_CTL_TX:
   1254	case LED_CTL_RX:
   1255		if (!pLed->bLedBlinkInProgress &&
   1256		    check_fwstate(pmlmepriv, _FW_LINKED)) {
   1257			if (pLed->CurrLedState == LED_SCAN_BLINK ||
   1258			    IS_LED_WPS_BLINKING(pLed))
   1259				return;
   1260			pLed->bLedBlinkInProgress = true;
   1261			pLed->CurrLedState = LED_TXRX_BLINK;
   1262			pLed->BlinkTimes = 2;
   1263			if (pLed->bLedOn)
   1264				pLed->BlinkingLedState = LED_STATE_OFF;
   1265			else
   1266				pLed->BlinkingLedState = LED_STATE_ON;
   1267			mod_timer(&pLed->BlinkTimer, jiffies +
   1268				  msecs_to_jiffies(LED_BLINK_FASTER_INTERVAL_ALPHA));
   1269		}
   1270		break;
   1271	case LED_CTL_LINK:
   1272		if (IS_LED_WPS_BLINKING(pLed))
   1273			return;
   1274		pLed->CurrLedState = LED_STATE_ON;
   1275		pLed->BlinkingLedState = LED_STATE_ON;
   1276		if (pLed->bLedBlinkInProgress) {
   1277			del_timer(&pLed->BlinkTimer);
   1278			pLed->bLedBlinkInProgress = false;
   1279		}
   1280		if (pLed->bLedScanBlinkInProgress) {
   1281			del_timer(&pLed->BlinkTimer);
   1282			pLed->bLedScanBlinkInProgress = false;
   1283		}
   1284		mod_timer(&pLed->BlinkTimer,
   1285			  jiffies + msecs_to_jiffies(0));
   1286		break;
   1287	case LED_CTL_START_WPS: /* wait until xinpin finish */
   1288	case LED_CTL_START_WPS_BOTTON:
   1289		if (!pLed->bLedWPSBlinkInProgress) {
   1290			if (pLed->bLedBlinkInProgress) {
   1291				del_timer(&pLed->BlinkTimer);
   1292				pLed->bLedBlinkInProgress = false;
   1293			}
   1294			if (pLed->bLedScanBlinkInProgress) {
   1295				del_timer(&pLed->BlinkTimer);
   1296				pLed->bLedScanBlinkInProgress = false;
   1297			}
   1298			pLed->bLedWPSBlinkInProgress = true;
   1299			pLed->CurrLedState = LED_BLINK_WPS;
   1300			if (pLed->bLedOn)
   1301				pLed->BlinkingLedState = LED_STATE_OFF;
   1302			else
   1303				pLed->BlinkingLedState = LED_STATE_ON;
   1304			mod_timer(&pLed->BlinkTimer, jiffies +
   1305				  msecs_to_jiffies(LED_BLINK_SCAN_INTERVAL_ALPHA));
   1306		}
   1307		break;
   1308	case LED_CTL_STOP_WPS:
   1309		if (pLed->bLedWPSBlinkInProgress) {
   1310			del_timer(&pLed->BlinkTimer);
   1311			pLed->bLedWPSBlinkInProgress = false;
   1312		} else {
   1313			pLed->bLedWPSBlinkInProgress = true;
   1314		}
   1315		pLed->CurrLedState = LED_BLINK_WPS_STOP;
   1316		if (pLed->bLedOn) {
   1317			pLed->BlinkingLedState = LED_STATE_OFF;
   1318			mod_timer(&pLed->BlinkTimer, jiffies +
   1319				  msecs_to_jiffies(LED_BLINK_WPS_SUCCESS_INTERVAL_ALPHA));
   1320		} else {
   1321			pLed->BlinkingLedState = LED_STATE_ON;
   1322			mod_timer(&pLed->BlinkTimer,
   1323				  jiffies + msecs_to_jiffies(0));
   1324		}
   1325		break;
   1326	case LED_CTL_STOP_WPS_FAIL:
   1327		if (pLed->bLedWPSBlinkInProgress) {
   1328			del_timer(&pLed->BlinkTimer);
   1329			pLed->bLedWPSBlinkInProgress = false;
   1330		}
   1331		pLed->CurrLedState = LED_STATE_OFF;
   1332		pLed->BlinkingLedState = LED_STATE_OFF;
   1333		mod_timer(&pLed->BlinkTimer,
   1334			  jiffies + msecs_to_jiffies(0));
   1335		break;
   1336	case LED_CTL_START_TO_LINK:
   1337	case LED_CTL_NO_LINK:
   1338		if (!IS_LED_BLINKING(pLed)) {
   1339			pLed->CurrLedState = LED_STATE_OFF;
   1340			pLed->BlinkingLedState = LED_STATE_OFF;
   1341			mod_timer(&pLed->BlinkTimer,
   1342				  jiffies + msecs_to_jiffies(0));
   1343		}
   1344		break;
   1345	case LED_CTL_POWER_OFF:
   1346		pLed->CurrLedState = LED_STATE_OFF;
   1347		pLed->BlinkingLedState = LED_STATE_OFF;
   1348		if (pLed->bLedBlinkInProgress) {
   1349			del_timer(&pLed->BlinkTimer);
   1350			pLed->bLedBlinkInProgress = false;
   1351		}
   1352		if (pLed->bLedScanBlinkInProgress) {
   1353			del_timer(&pLed->BlinkTimer);
   1354			pLed->bLedScanBlinkInProgress = false;
   1355		}
   1356		if (pLed->bLedWPSBlinkInProgress) {
   1357			del_timer(&pLed->BlinkTimer);
   1358			pLed->bLedWPSBlinkInProgress = false;
   1359		}
   1360		mod_timer(&pLed->BlinkTimer,
   1361			  jiffies + msecs_to_jiffies(0));
   1362		break;
   1363	default:
   1364		break;
   1365	}
   1366}
   1367
   1368static void SwLedControlMode4(struct _adapter *padapter,
   1369			      enum LED_CTL_MODE LedAction)
   1370{
   1371	struct led_priv	*ledpriv = &padapter->ledpriv;
   1372	struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
   1373	struct LED_871x *pLed = &ledpriv->SwLed0;
   1374	struct LED_871x *pLed1 = &ledpriv->SwLed1;
   1375
   1376	switch (LedAction) {
   1377	case LED_CTL_START_TO_LINK:
   1378		if (pLed1->bLedWPSBlinkInProgress) {
   1379			pLed1->bLedWPSBlinkInProgress = false;
   1380			del_timer(&pLed1->BlinkTimer);
   1381			pLed1->BlinkingLedState = LED_STATE_OFF;
   1382			pLed1->CurrLedState = LED_STATE_OFF;
   1383			if (pLed1->bLedOn)
   1384				mod_timer(&pLed->BlinkTimer,
   1385					  jiffies + msecs_to_jiffies(0));
   1386		}
   1387		if (!pLed->bLedStartToLinkBlinkInProgress) {
   1388			if (pLed->CurrLedState == LED_SCAN_BLINK ||
   1389			    IS_LED_WPS_BLINKING(pLed))
   1390				return;
   1391			if (pLed->bLedBlinkInProgress) {
   1392				del_timer(&pLed->BlinkTimer);
   1393				pLed->bLedBlinkInProgress = false;
   1394			}
   1395			if (pLed->bLedNoLinkBlinkInProgress) {
   1396				del_timer(&pLed->BlinkTimer);
   1397				pLed->bLedNoLinkBlinkInProgress = false;
   1398			}
   1399			pLed->bLedStartToLinkBlinkInProgress = true;
   1400			pLed->CurrLedState = LED_BLINK_StartToBlink;
   1401			if (pLed->bLedOn) {
   1402				pLed->BlinkingLedState = LED_STATE_OFF;
   1403				mod_timer(&pLed->BlinkTimer, jiffies +
   1404					  msecs_to_jiffies(LED_BLINK_SLOWLY_INTERVAL));
   1405			} else {
   1406				pLed->BlinkingLedState = LED_STATE_ON;
   1407				mod_timer(&pLed->BlinkTimer, jiffies +
   1408					  msecs_to_jiffies(LED_BLINK_NORMAL_INTERVAL));
   1409			}
   1410		}
   1411		break;
   1412	case LED_CTL_LINK:
   1413	case LED_CTL_NO_LINK:
   1414		/*LED1 settings*/
   1415		if (LedAction == LED_CTL_LINK) {
   1416			if (pLed1->bLedWPSBlinkInProgress) {
   1417				pLed1->bLedWPSBlinkInProgress = false;
   1418				del_timer(&pLed1->BlinkTimer);
   1419				pLed1->BlinkingLedState = LED_STATE_OFF;
   1420				pLed1->CurrLedState = LED_STATE_OFF;
   1421				if (pLed1->bLedOn)
   1422					mod_timer(&pLed->BlinkTimer,
   1423						  jiffies + msecs_to_jiffies(0));
   1424			}
   1425		}
   1426		if (!pLed->bLedNoLinkBlinkInProgress) {
   1427			if (pLed->CurrLedState == LED_SCAN_BLINK ||
   1428			    IS_LED_WPS_BLINKING(pLed))
   1429				return;
   1430			if (pLed->bLedBlinkInProgress) {
   1431				del_timer(&pLed->BlinkTimer);
   1432				pLed->bLedBlinkInProgress = false;
   1433			}
   1434			pLed->bLedNoLinkBlinkInProgress = true;
   1435			pLed->CurrLedState = LED_BLINK_SLOWLY;
   1436			if (pLed->bLedOn)
   1437				pLed->BlinkingLedState = LED_STATE_OFF;
   1438			else
   1439				pLed->BlinkingLedState = LED_STATE_ON;
   1440			mod_timer(&pLed->BlinkTimer, jiffies +
   1441				  msecs_to_jiffies(LED_BLINK_NO_LINK_INTERVAL_ALPHA));
   1442		}
   1443		break;
   1444	case LED_CTL_SITE_SURVEY:
   1445		if (pmlmepriv->sitesurveyctrl.traffic_busy &&
   1446		    check_fwstate(pmlmepriv, _FW_LINKED))
   1447			;
   1448		else if (!pLed->bLedScanBlinkInProgress) {
   1449			if (IS_LED_WPS_BLINKING(pLed))
   1450				return;
   1451			if (pLed->bLedNoLinkBlinkInProgress) {
   1452				del_timer(&pLed->BlinkTimer);
   1453				pLed->bLedNoLinkBlinkInProgress = false;
   1454			}
   1455			if (pLed->bLedBlinkInProgress) {
   1456				del_timer(&pLed->BlinkTimer);
   1457				pLed->bLedBlinkInProgress = false;
   1458			}
   1459			pLed->bLedScanBlinkInProgress = true;
   1460			pLed->CurrLedState = LED_SCAN_BLINK;
   1461			pLed->BlinkTimes = 24;
   1462			if (pLed->bLedOn)
   1463				pLed->BlinkingLedState = LED_STATE_OFF;
   1464			else
   1465				pLed->BlinkingLedState = LED_STATE_ON;
   1466			mod_timer(&pLed->BlinkTimer, jiffies +
   1467				  msecs_to_jiffies(LED_BLINK_SCAN_INTERVAL_ALPHA));
   1468		}
   1469		break;
   1470	case LED_CTL_TX:
   1471	case LED_CTL_RX:
   1472		if (!pLed->bLedBlinkInProgress) {
   1473			if (pLed->CurrLedState == LED_SCAN_BLINK ||
   1474			    IS_LED_WPS_BLINKING(pLed))
   1475				return;
   1476			if (pLed->bLedNoLinkBlinkInProgress) {
   1477				del_timer(&pLed->BlinkTimer);
   1478				pLed->bLedNoLinkBlinkInProgress = false;
   1479			}
   1480			pLed->bLedBlinkInProgress = true;
   1481			pLed->CurrLedState = LED_TXRX_BLINK;
   1482			pLed->BlinkTimes = 2;
   1483			if (pLed->bLedOn)
   1484				pLed->BlinkingLedState = LED_STATE_OFF;
   1485			else
   1486				pLed->BlinkingLedState = LED_STATE_ON;
   1487			mod_timer(&pLed->BlinkTimer, jiffies +
   1488				  msecs_to_jiffies(LED_BLINK_FASTER_INTERVAL_ALPHA));
   1489		}
   1490		break;
   1491	case LED_CTL_START_WPS: /*wait until xinpin finish*/
   1492	case LED_CTL_START_WPS_BOTTON:
   1493		if (pLed1->bLedWPSBlinkInProgress) {
   1494			pLed1->bLedWPSBlinkInProgress = false;
   1495			del_timer(&pLed1->BlinkTimer);
   1496			pLed1->BlinkingLedState = LED_STATE_OFF;
   1497			pLed1->CurrLedState = LED_STATE_OFF;
   1498			if (pLed1->bLedOn)
   1499				mod_timer(&pLed->BlinkTimer,
   1500					  jiffies + msecs_to_jiffies(0));
   1501		}
   1502		if (!pLed->bLedWPSBlinkInProgress) {
   1503			if (pLed->bLedNoLinkBlinkInProgress) {
   1504				del_timer(&pLed->BlinkTimer);
   1505				pLed->bLedNoLinkBlinkInProgress = false;
   1506			}
   1507			if (pLed->bLedBlinkInProgress) {
   1508				del_timer(&pLed->BlinkTimer);
   1509				pLed->bLedBlinkInProgress = false;
   1510			}
   1511			if (pLed->bLedScanBlinkInProgress) {
   1512				del_timer(&pLed->BlinkTimer);
   1513				pLed->bLedScanBlinkInProgress = false;
   1514			}
   1515			pLed->bLedWPSBlinkInProgress = true;
   1516			pLed->CurrLedState = LED_BLINK_WPS;
   1517			if (pLed->bLedOn) {
   1518				pLed->BlinkingLedState = LED_STATE_OFF;
   1519				mod_timer(&pLed->BlinkTimer, jiffies +
   1520					  msecs_to_jiffies(LED_BLINK_SLOWLY_INTERVAL));
   1521			} else {
   1522				pLed->BlinkingLedState = LED_STATE_ON;
   1523				mod_timer(&pLed->BlinkTimer, jiffies +
   1524					  msecs_to_jiffies(LED_BLINK_NORMAL_INTERVAL));
   1525			}
   1526		}
   1527		break;
   1528	case LED_CTL_STOP_WPS:	/*WPS connect success*/
   1529		if (pLed->bLedWPSBlinkInProgress) {
   1530			del_timer(&pLed->BlinkTimer);
   1531			pLed->bLedWPSBlinkInProgress = false;
   1532		}
   1533		pLed->bLedNoLinkBlinkInProgress = true;
   1534		pLed->CurrLedState = LED_BLINK_SLOWLY;
   1535		if (pLed->bLedOn)
   1536			pLed->BlinkingLedState = LED_STATE_OFF;
   1537		else
   1538			pLed->BlinkingLedState = LED_STATE_ON;
   1539		mod_timer(&pLed->BlinkTimer, jiffies +
   1540			  msecs_to_jiffies(LED_BLINK_NO_LINK_INTERVAL_ALPHA));
   1541		break;
   1542	case LED_CTL_STOP_WPS_FAIL:	/*WPS authentication fail*/
   1543		if (pLed->bLedWPSBlinkInProgress) {
   1544			del_timer(&pLed->BlinkTimer);
   1545			pLed->bLedWPSBlinkInProgress = false;
   1546		}
   1547		pLed->bLedNoLinkBlinkInProgress = true;
   1548		pLed->CurrLedState = LED_BLINK_SLOWLY;
   1549		if (pLed->bLedOn)
   1550			pLed->BlinkingLedState = LED_STATE_OFF;
   1551		else
   1552			pLed->BlinkingLedState = LED_STATE_ON;
   1553		mod_timer(&pLed->BlinkTimer, jiffies +
   1554			  msecs_to_jiffies(LED_BLINK_NO_LINK_INTERVAL_ALPHA));
   1555		/*LED1 settings*/
   1556		if (pLed1->bLedWPSBlinkInProgress)
   1557			del_timer(&pLed1->BlinkTimer);
   1558		else
   1559			pLed1->bLedWPSBlinkInProgress = true;
   1560		pLed1->CurrLedState = LED_BLINK_WPS_STOP;
   1561		if (pLed1->bLedOn)
   1562			pLed1->BlinkingLedState = LED_STATE_OFF;
   1563		else
   1564			pLed1->BlinkingLedState = LED_STATE_ON;
   1565		mod_timer(&pLed->BlinkTimer, jiffies +
   1566			  msecs_to_jiffies(LED_BLINK_NORMAL_INTERVAL));
   1567		break;
   1568	case LED_CTL_STOP_WPS_FAIL_OVERLAP:	/*WPS session overlap*/
   1569		if (pLed->bLedWPSBlinkInProgress) {
   1570			del_timer(&pLed->BlinkTimer);
   1571			pLed->bLedWPSBlinkInProgress = false;
   1572		}
   1573		pLed->bLedNoLinkBlinkInProgress = true;
   1574		pLed->CurrLedState = LED_BLINK_SLOWLY;
   1575		if (pLed->bLedOn)
   1576			pLed->BlinkingLedState = LED_STATE_OFF;
   1577		else
   1578			pLed->BlinkingLedState = LED_STATE_ON;
   1579		mod_timer(&pLed->BlinkTimer, jiffies +
   1580			  msecs_to_jiffies(LED_BLINK_NO_LINK_INTERVAL_ALPHA));
   1581		/*LED1 settings*/
   1582		if (pLed1->bLedWPSBlinkInProgress)
   1583			del_timer(&pLed1->BlinkTimer);
   1584		else
   1585			pLed1->bLedWPSBlinkInProgress = true;
   1586		pLed1->CurrLedState = LED_BLINK_WPS_STOP_OVERLAP;
   1587		pLed1->BlinkTimes = 10;
   1588		if (pLed1->bLedOn)
   1589			pLed1->BlinkingLedState = LED_STATE_OFF;
   1590		else
   1591			pLed1->BlinkingLedState = LED_STATE_ON;
   1592		mod_timer(&pLed->BlinkTimer, jiffies +
   1593			  msecs_to_jiffies(LED_BLINK_NORMAL_INTERVAL));
   1594		break;
   1595	case LED_CTL_POWER_OFF:
   1596		pLed->CurrLedState = LED_STATE_OFF;
   1597		pLed->BlinkingLedState = LED_STATE_OFF;
   1598		if (pLed->bLedNoLinkBlinkInProgress) {
   1599			del_timer(&pLed->BlinkTimer);
   1600			pLed->bLedNoLinkBlinkInProgress = false;
   1601		}
   1602		if (pLed->bLedLinkBlinkInProgress) {
   1603			del_timer(&pLed->BlinkTimer);
   1604			pLed->bLedLinkBlinkInProgress = false;
   1605		}
   1606		if (pLed->bLedBlinkInProgress) {
   1607			del_timer(&pLed->BlinkTimer);
   1608			pLed->bLedBlinkInProgress = false;
   1609		}
   1610		if (pLed->bLedWPSBlinkInProgress) {
   1611			del_timer(&pLed->BlinkTimer);
   1612			pLed->bLedWPSBlinkInProgress = false;
   1613		}
   1614		if (pLed->bLedScanBlinkInProgress) {
   1615			del_timer(&pLed->BlinkTimer);
   1616			pLed->bLedScanBlinkInProgress = false;
   1617		}
   1618		if (pLed->bLedStartToLinkBlinkInProgress) {
   1619			del_timer(&pLed->BlinkTimer);
   1620			pLed->bLedStartToLinkBlinkInProgress = false;
   1621		}
   1622		if (pLed1->bLedWPSBlinkInProgress) {
   1623			del_timer(&pLed1->BlinkTimer);
   1624			pLed1->bLedWPSBlinkInProgress = false;
   1625		}
   1626		pLed1->BlinkingLedState = LED_UNKNOWN;
   1627		SwLedOff(padapter, pLed);
   1628		SwLedOff(padapter, pLed1);
   1629		break;
   1630	default:
   1631		break;
   1632	}
   1633}
   1634
   1635static void SwLedControlMode5(struct _adapter *padapter,
   1636			      enum LED_CTL_MODE LedAction)
   1637{
   1638	struct led_priv	*ledpriv = &padapter->ledpriv;
   1639	struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
   1640	struct LED_871x *pLed = &ledpriv->SwLed0;
   1641
   1642	if (padapter->eeprompriv.CustomerID == RT_CID_819x_CAMEO)
   1643		pLed = &ledpriv->SwLed1;
   1644
   1645	switch (LedAction) {
   1646	case LED_CTL_POWER_ON:
   1647	case LED_CTL_NO_LINK:
   1648	case LED_CTL_LINK:	/* solid blue */
   1649		if (pLed->CurrLedState == LED_SCAN_BLINK)
   1650			return;
   1651		pLed->CurrLedState = LED_STATE_ON;
   1652		pLed->BlinkingLedState = LED_STATE_ON;
   1653		pLed->bLedBlinkInProgress = false;
   1654		mod_timer(&pLed->BlinkTimer,
   1655			  jiffies + msecs_to_jiffies(0));
   1656		break;
   1657	case LED_CTL_SITE_SURVEY:
   1658		if (pmlmepriv->sitesurveyctrl.traffic_busy &&
   1659		    check_fwstate(pmlmepriv, _FW_LINKED))
   1660			; /* dummy branch */
   1661		else if (!pLed->bLedScanBlinkInProgress) {
   1662			if (pLed->bLedBlinkInProgress) {
   1663				del_timer(&pLed->BlinkTimer);
   1664				pLed->bLedBlinkInProgress = false;
   1665			}
   1666			pLed->bLedScanBlinkInProgress = true;
   1667			pLed->CurrLedState = LED_SCAN_BLINK;
   1668			pLed->BlinkTimes = 24;
   1669			if (pLed->bLedOn)
   1670				pLed->BlinkingLedState = LED_STATE_OFF;
   1671			else
   1672				pLed->BlinkingLedState = LED_STATE_ON;
   1673			mod_timer(&pLed->BlinkTimer, jiffies +
   1674				  msecs_to_jiffies(LED_BLINK_SCAN_INTERVAL_ALPHA));
   1675		}
   1676		break;
   1677	case LED_CTL_TX:
   1678	case LED_CTL_RX:
   1679		if (!pLed->bLedBlinkInProgress) {
   1680			if (pLed->CurrLedState == LED_SCAN_BLINK)
   1681				return;
   1682			pLed->bLedBlinkInProgress = true;
   1683			pLed->CurrLedState = LED_TXRX_BLINK;
   1684			pLed->BlinkTimes = 2;
   1685			if (pLed->bLedOn)
   1686				pLed->BlinkingLedState = LED_STATE_OFF;
   1687			else
   1688				pLed->BlinkingLedState = LED_STATE_ON;
   1689			mod_timer(&pLed->BlinkTimer, jiffies +
   1690				  msecs_to_jiffies(LED_BLINK_FASTER_INTERVAL_ALPHA));
   1691		}
   1692		break;
   1693	case LED_CTL_POWER_OFF:
   1694		pLed->CurrLedState = LED_STATE_OFF;
   1695		pLed->BlinkingLedState = LED_STATE_OFF;
   1696		if (pLed->bLedBlinkInProgress) {
   1697			del_timer(&pLed->BlinkTimer);
   1698			pLed->bLedBlinkInProgress = false;
   1699		}
   1700		SwLedOff(padapter, pLed);
   1701		break;
   1702	default:
   1703		break;
   1704	}
   1705}
   1706
   1707static void SwLedControlMode6(struct _adapter *padapter,
   1708			      enum LED_CTL_MODE LedAction)
   1709{
   1710	struct led_priv	*ledpriv = &padapter->ledpriv;
   1711	struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
   1712	struct LED_871x *pLed = &ledpriv->SwLed0;
   1713
   1714	switch (LedAction) {
   1715	case LED_CTL_POWER_ON:
   1716	case LED_CTL_NO_LINK:
   1717	case LED_CTL_LINK:	/*solid blue*/
   1718	case LED_CTL_SITE_SURVEY:
   1719		if (IS_LED_WPS_BLINKING(pLed))
   1720			return;
   1721		pLed->CurrLedState = LED_STATE_ON;
   1722		pLed->BlinkingLedState = LED_STATE_ON;
   1723		pLed->bLedBlinkInProgress = false;
   1724		mod_timer(&pLed->BlinkTimer, jiffies + msecs_to_jiffies(0));
   1725		break;
   1726	case LED_CTL_TX:
   1727	case LED_CTL_RX:
   1728		if (!pLed->bLedBlinkInProgress &&
   1729		    check_fwstate(pmlmepriv, _FW_LINKED)) {
   1730			if (IS_LED_WPS_BLINKING(pLed))
   1731				return;
   1732			pLed->bLedBlinkInProgress = true;
   1733			pLed->CurrLedState = LED_TXRX_BLINK;
   1734			pLed->BlinkTimes = 2;
   1735			if (pLed->bLedOn)
   1736				pLed->BlinkingLedState = LED_STATE_OFF;
   1737			else
   1738				pLed->BlinkingLedState = LED_STATE_ON;
   1739			mod_timer(&pLed->BlinkTimer, jiffies +
   1740				  msecs_to_jiffies(LED_BLINK_FASTER_INTERVAL_ALPHA));
   1741		}
   1742		break;
   1743	case LED_CTL_START_WPS: /*wait until xinpin finish*/
   1744	case LED_CTL_START_WPS_BOTTON:
   1745		if (!pLed->bLedWPSBlinkInProgress) {
   1746			if (pLed->bLedBlinkInProgress) {
   1747				del_timer(&pLed->BlinkTimer);
   1748				pLed->bLedBlinkInProgress = false;
   1749			}
   1750			pLed->bLedWPSBlinkInProgress = true;
   1751			pLed->CurrLedState = LED_BLINK_WPS;
   1752			if (pLed->bLedOn)
   1753				pLed->BlinkingLedState = LED_STATE_OFF;
   1754			else
   1755				pLed->BlinkingLedState = LED_STATE_ON;
   1756			mod_timer(&pLed->BlinkTimer, jiffies +
   1757				  msecs_to_jiffies(LED_BLINK_SCAN_INTERVAL_ALPHA));
   1758		}
   1759		break;
   1760	case LED_CTL_STOP_WPS_FAIL:
   1761	case LED_CTL_STOP_WPS:
   1762		if (pLed->bLedWPSBlinkInProgress) {
   1763			del_timer(&pLed->BlinkTimer);
   1764			pLed->bLedWPSBlinkInProgress = false;
   1765		}
   1766		pLed->CurrLedState = LED_STATE_ON;
   1767		pLed->BlinkingLedState = LED_STATE_ON;
   1768		mod_timer(&pLed->BlinkTimer,
   1769			  jiffies + msecs_to_jiffies(0));
   1770		break;
   1771	case LED_CTL_POWER_OFF:
   1772		pLed->CurrLedState = LED_STATE_OFF;
   1773		pLed->BlinkingLedState = LED_STATE_OFF;
   1774		if (pLed->bLedBlinkInProgress) {
   1775			del_timer(&pLed->BlinkTimer);
   1776			pLed->bLedBlinkInProgress = false;
   1777		}
   1778		if (pLed->bLedWPSBlinkInProgress) {
   1779			del_timer(&pLed->BlinkTimer);
   1780			pLed->bLedWPSBlinkInProgress = false;
   1781		}
   1782		SwLedOff(padapter, pLed);
   1783		break;
   1784	default:
   1785		break;
   1786	}
   1787}
   1788
   1789/*	Description:
   1790 *		Dispatch LED action according to pHalData->LedStrategy.
   1791 */
   1792void LedControl871x(struct _adapter *padapter, enum LED_CTL_MODE LedAction)
   1793{
   1794	struct led_priv	*ledpriv = &padapter->ledpriv;
   1795
   1796	if (!ledpriv->bRegUseLed)
   1797		return;
   1798	switch (ledpriv->LedStrategy) {
   1799	case SW_LED_MODE0:
   1800		break;
   1801	case SW_LED_MODE1:
   1802		SwLedControlMode1(padapter, LedAction);
   1803		break;
   1804	case SW_LED_MODE2:
   1805		SwLedControlMode2(padapter, LedAction);
   1806		break;
   1807	case SW_LED_MODE3:
   1808		SwLedControlMode3(padapter, LedAction);
   1809		break;
   1810	case SW_LED_MODE4:
   1811		SwLedControlMode4(padapter, LedAction);
   1812		break;
   1813	case SW_LED_MODE5:
   1814		SwLedControlMode5(padapter, LedAction);
   1815		break;
   1816	case SW_LED_MODE6:
   1817		SwLedControlMode6(padapter, LedAction);
   1818		break;
   1819	default:
   1820		break;
   1821	}
   1822}
   1823
   1824void r8712_flush_led_works(struct _adapter *padapter)
   1825{
   1826	struct led_priv *pledpriv = &padapter->ledpriv;
   1827
   1828	flush_work(&pledpriv->SwLed0.BlinkWorkItem);
   1829	flush_work(&pledpriv->SwLed1.BlinkWorkItem);
   1830}