xref: /OK3568_Linux_fs/external/rkwifibt/drivers/rtl8188fu/include/hal_com_led.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /******************************************************************************
2*4882a593Smuzhiyun  *
3*4882a593Smuzhiyun  * Copyright(c) 2007 - 2017 Realtek Corporation.
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * This program is free software; you can redistribute it and/or modify it
6*4882a593Smuzhiyun  * under the terms of version 2 of the GNU General Public License as
7*4882a593Smuzhiyun  * published by the Free Software Foundation.
8*4882a593Smuzhiyun  *
9*4882a593Smuzhiyun  * This program is distributed in the hope that it will be useful, but WITHOUT
10*4882a593Smuzhiyun  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11*4882a593Smuzhiyun  * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12*4882a593Smuzhiyun  * more details.
13*4882a593Smuzhiyun  *
14*4882a593Smuzhiyun  *****************************************************************************/
15*4882a593Smuzhiyun #ifndef __HAL_COMMON_LED_H_
16*4882a593Smuzhiyun #define __HAL_COMMON_LED_H_
17*4882a593Smuzhiyun 
18*4882a593Smuzhiyun #define NO_LED 0
19*4882a593Smuzhiyun #define HW_LED 1
20*4882a593Smuzhiyun 
21*4882a593Smuzhiyun #ifdef CONFIG_RTW_LED
22*4882a593Smuzhiyun #define MSECS(t)        (HZ * ((t) / 1000) + (HZ * ((t) % 1000)) / 1000)
23*4882a593Smuzhiyun 
24*4882a593Smuzhiyun /* ********************************************************************************
25*4882a593Smuzhiyun  *	LED Behavior Constant.
26*4882a593Smuzhiyun  * ********************************************************************************
27*4882a593Smuzhiyun  * Default LED behavior.
28*4882a593Smuzhiyun  *   */
29*4882a593Smuzhiyun #define LED_BLINK_NORMAL_INTERVAL	100
30*4882a593Smuzhiyun #define LED_BLINK_SLOWLY_INTERVAL	200
31*4882a593Smuzhiyun #define LED_BLINK_LONG_INTERVAL	400
32*4882a593Smuzhiyun #define LED_INITIAL_INTERVAL		1800
33*4882a593Smuzhiyun 
34*4882a593Smuzhiyun /* LED Customerization */
35*4882a593Smuzhiyun 
36*4882a593Smuzhiyun /* NETTRONIX */
37*4882a593Smuzhiyun #define LED_BLINK_NORMAL_INTERVAL_NETTRONIX	100
38*4882a593Smuzhiyun #define LED_BLINK_SLOWLY_INTERVAL_NETTRONIX	2000
39*4882a593Smuzhiyun 
40*4882a593Smuzhiyun /* PORNET */
41*4882a593Smuzhiyun #define LED_BLINK_SLOWLY_INTERVAL_PORNET	1000
42*4882a593Smuzhiyun #define LED_BLINK_NORMAL_INTERVAL_PORNET	100
43*4882a593Smuzhiyun #define LED_BLINK_FAST_INTERVAL_BITLAND		30
44*4882a593Smuzhiyun 
45*4882a593Smuzhiyun /* AzWave. */
46*4882a593Smuzhiyun #define LED_CM2_BLINK_ON_INTERVAL		250
47*4882a593Smuzhiyun #define LED_CM2_BLINK_OFF_INTERVAL		4750
48*4882a593Smuzhiyun #define LED_CM8_BLINK_OFF_INTERVAL		3750	/* for QMI */
49*4882a593Smuzhiyun 
50*4882a593Smuzhiyun /* RunTop */
51*4882a593Smuzhiyun #define LED_RunTop_BLINK_INTERVAL		300
52*4882a593Smuzhiyun 
53*4882a593Smuzhiyun /* ALPHA */
54*4882a593Smuzhiyun #define LED_BLINK_NO_LINK_INTERVAL_ALPHA	1000
55*4882a593Smuzhiyun #define LED_BLINK_NO_LINK_INTERVAL_ALPHA_500MS 500 /* add by ylb 20121012 for customer led for alpha */
56*4882a593Smuzhiyun #define LED_BLINK_LINK_INTERVAL_ALPHA		500	/* 500 */
57*4882a593Smuzhiyun #define LED_BLINK_SCAN_INTERVAL_ALPHA		180	/* 150 */
58*4882a593Smuzhiyun #define LED_BLINK_FASTER_INTERVAL_ALPHA		50
59*4882a593Smuzhiyun #define LED_BLINK_WPS_SUCESS_INTERVAL_ALPHA	5000
60*4882a593Smuzhiyun 
61*4882a593Smuzhiyun /* 111122 by hpfan: Customized for Xavi */
62*4882a593Smuzhiyun #define LED_CM11_BLINK_INTERVAL			300
63*4882a593Smuzhiyun #define LED_CM11_LINK_ON_INTERVEL		3000
64*4882a593Smuzhiyun 
65*4882a593Smuzhiyun /* Netgear */
66*4882a593Smuzhiyun #define LED_BLINK_LINK_INTERVAL_NETGEAR		500
67*4882a593Smuzhiyun #define LED_BLINK_LINK_SLOWLY_INTERVAL_NETGEAR		1000
68*4882a593Smuzhiyun 
69*4882a593Smuzhiyun #define LED_WPS_BLINK_OFF_INTERVAL_NETGEAR		100
70*4882a593Smuzhiyun #define LED_WPS_BLINK_ON_INTERVAL_NETGEAR		500
71*4882a593Smuzhiyun 
72*4882a593Smuzhiyun /* Belkin AC950 */
73*4882a593Smuzhiyun #define LED_BLINK_LINK_INTERVAL_ON_BELKIN		200
74*4882a593Smuzhiyun #define LED_BLINK_LINK_INTERVAL_OFF_BELKIN		100
75*4882a593Smuzhiyun #define LED_BLINK_ERROR_INTERVAL_BELKIN		100
76*4882a593Smuzhiyun 
77*4882a593Smuzhiyun /* by chiyokolin for Azurewave */
78*4882a593Smuzhiyun #define LED_CM12_BLINK_INTERVAL_5Mbps		160
79*4882a593Smuzhiyun #define LED_CM12_BLINK_INTERVAL_10Mbps		80
80*4882a593Smuzhiyun #define LED_CM12_BLINK_INTERVAL_20Mbps		50
81*4882a593Smuzhiyun #define LED_CM12_BLINK_INTERVAL_40Mbps		40
82*4882a593Smuzhiyun #define LED_CM12_BLINK_INTERVAL_80Mbps		30
83*4882a593Smuzhiyun #define LED_CM12_BLINK_INTERVAL_MAXMbps		25
84*4882a593Smuzhiyun 
85*4882a593Smuzhiyun /* Dlink */
86*4882a593Smuzhiyun #define	LED_BLINK_NO_LINK_INTERVAL		1000
87*4882a593Smuzhiyun #define	LED_BLINK_LINK_IDEL_INTERVAL		100
88*4882a593Smuzhiyun 
89*4882a593Smuzhiyun #define	LED_BLINK_SCAN_ON_INTERVAL		30
90*4882a593Smuzhiyun #define	LED_BLINK_SCAN_OFF_INTERVAL		300
91*4882a593Smuzhiyun 
92*4882a593Smuzhiyun #define LED_WPS_BLINK_ON_INTERVAL_DLINK		30
93*4882a593Smuzhiyun #define LED_WPS_BLINK_OFF_INTERVAL_DLINK			300
94*4882a593Smuzhiyun #define LED_WPS_BLINK_LINKED_ON_INTERVAL_DLINK			5000
95*4882a593Smuzhiyun 
96*4882a593Smuzhiyun /* ********************************************************************************
97*4882a593Smuzhiyun  * LED object.
98*4882a593Smuzhiyun  * ******************************************************************************** */
99*4882a593Smuzhiyun 
100*4882a593Smuzhiyun typedef enum _LED_CTL_MODE {
101*4882a593Smuzhiyun 	LED_CTL_POWER_ON = 1,
102*4882a593Smuzhiyun 	LED_CTL_LINK = 2,
103*4882a593Smuzhiyun 	LED_CTL_NO_LINK = 3,
104*4882a593Smuzhiyun 	LED_CTL_TX = 4, /* unspecific data TX, including single & group addressed */
105*4882a593Smuzhiyun 	LED_CTL_RX = 5, /* unspecific data RX, including single & group addressed */
106*4882a593Smuzhiyun 	LED_CTL_UC_TX = 6, /* single addressed data TX */
107*4882a593Smuzhiyun 	LED_CTL_UC_RX = 7, /* single addressed data RX */
108*4882a593Smuzhiyun 	LED_CTL_BMC_TX = 8, /* group addressed data TX */
109*4882a593Smuzhiyun 	LED_CTL_BMC_RX = 9, /* group addressed data RX */
110*4882a593Smuzhiyun 	LED_CTL_SITE_SURVEY = 10,
111*4882a593Smuzhiyun 	LED_CTL_POWER_OFF = 11,
112*4882a593Smuzhiyun 	LED_CTL_START_TO_LINK = 12,
113*4882a593Smuzhiyun 	LED_CTL_START_WPS = 13,
114*4882a593Smuzhiyun 	LED_CTL_STOP_WPS = 14,
115*4882a593Smuzhiyun 	LED_CTL_START_WPS_BOTTON = 15, /* added for runtop */
116*4882a593Smuzhiyun 	LED_CTL_STOP_WPS_FAIL = 16, /* added for ALPHA	 */
117*4882a593Smuzhiyun 	LED_CTL_STOP_WPS_FAIL_OVERLAP = 17, /* added for BELKIN */
118*4882a593Smuzhiyun 	LED_CTL_CONNECTION_NO_TRANSFER = 18,
119*4882a593Smuzhiyun } LED_CTL_MODE;
120*4882a593Smuzhiyun 
121*4882a593Smuzhiyun typedef	enum _LED_STATE {
122*4882a593Smuzhiyun 	LED_UNKNOWN = 0,
123*4882a593Smuzhiyun 	RTW_LED_ON = 1,
124*4882a593Smuzhiyun 	RTW_LED_OFF = 2,
125*4882a593Smuzhiyun 	LED_BLINK_NORMAL = 3,
126*4882a593Smuzhiyun 	LED_BLINK_SLOWLY = 4,
127*4882a593Smuzhiyun 	LED_BLINK_POWER_ON = 5,
128*4882a593Smuzhiyun 	LED_BLINK_SCAN = 6,	/* LED is blinking during scanning period, the # of times to blink is depend on time for scanning. */
129*4882a593Smuzhiyun 	LED_BLINK_NO_LINK = 7, /* LED is blinking during no link state. */
130*4882a593Smuzhiyun 	LED_BLINK_StartToBlink = 8, /* Customzied for Sercomm Printer Server case */
131*4882a593Smuzhiyun 	LED_BLINK_TXRX = 9,
132*4882a593Smuzhiyun 	LED_BLINK_WPS = 10,	/* LED is blinkg during WPS communication */
133*4882a593Smuzhiyun 	LED_BLINK_WPS_STOP = 11,	/* for ALPHA */
134*4882a593Smuzhiyun 	LED_BLINK_WPS_STOP_OVERLAP = 12,	/* for BELKIN */
135*4882a593Smuzhiyun 	LED_BLINK_RUNTOP = 13,	/* Customized for RunTop */
136*4882a593Smuzhiyun 	LED_BLINK_CAMEO = 14,
137*4882a593Smuzhiyun 	LED_BLINK_XAVI = 15,
138*4882a593Smuzhiyun 	LED_BLINK_ALWAYS_ON = 16,
139*4882a593Smuzhiyun 	LED_BLINK_LINK_IN_PROCESS = 17,  /* Customized for Belkin AC950 */
140*4882a593Smuzhiyun 	LED_BLINK_AUTH_ERROR = 18,  /* Customized for Belkin AC950 */
141*4882a593Smuzhiyun 	LED_BLINK_Azurewave_5Mbps = 19,
142*4882a593Smuzhiyun 	LED_BLINK_Azurewave_10Mbps = 20,
143*4882a593Smuzhiyun 	LED_BLINK_Azurewave_20Mbps = 21,
144*4882a593Smuzhiyun 	LED_BLINK_Azurewave_40Mbps = 22,
145*4882a593Smuzhiyun 	LED_BLINK_Azurewave_80Mbps = 23,
146*4882a593Smuzhiyun 	LED_BLINK_Azurewave_MAXMbps = 24,
147*4882a593Smuzhiyun 	LED_BLINK_LINK_IDEL = 25,
148*4882a593Smuzhiyun 	LED_BLINK_WPS_LINKED = 26,
149*4882a593Smuzhiyun } LED_STATE;
150*4882a593Smuzhiyun 
151*4882a593Smuzhiyun typedef enum _LED_PIN {
152*4882a593Smuzhiyun 	LED_PIN_GPIO0,
153*4882a593Smuzhiyun 	LED_PIN_LED0,
154*4882a593Smuzhiyun 	LED_PIN_LED1,
155*4882a593Smuzhiyun 	LED_PIN_LED2
156*4882a593Smuzhiyun } LED_PIN;
157*4882a593Smuzhiyun 
158*4882a593Smuzhiyun 
159*4882a593Smuzhiyun /* ********************************************************************************
160*4882a593Smuzhiyun  * PCIE LED Definition.
161*4882a593Smuzhiyun  * ******************************************************************************** */
162*4882a593Smuzhiyun #ifdef CONFIG_PCI_HCI
163*4882a593Smuzhiyun typedef	enum _LED_STRATEGY_PCIE {
164*4882a593Smuzhiyun 	/* start from 2 */
165*4882a593Smuzhiyun 	SW_LED_MODE_UC_TRX_ONLY = 2,
166*4882a593Smuzhiyun 	SW_LED_MODE0, /* SW control 1 LED via GPIO0. It is default option. */
167*4882a593Smuzhiyun 	SW_LED_MODE1, /* SW control for PCI Express */
168*4882a593Smuzhiyun 	SW_LED_MODE2, /* SW control for Cameo. */
169*4882a593Smuzhiyun 	SW_LED_MODE3, /* SW contorl for RunTop. */
170*4882a593Smuzhiyun 	SW_LED_MODE4, /* SW control for Netcore */
171*4882a593Smuzhiyun 	SW_LED_MODE5, /* added by vivi, for led new mode, DLINK */
172*4882a593Smuzhiyun 	SW_LED_MODE6, /* added by vivi, for led new mode, PRONET */
173*4882a593Smuzhiyun 	SW_LED_MODE7, /* added by chiyokolin, for Lenovo, PCI Express Minicard Spec Rev.1.2 spec */
174*4882a593Smuzhiyun 	SW_LED_MODE8, /* added by chiyokolin, for QMI */
175*4882a593Smuzhiyun 	SW_LED_MODE9, /* added by chiyokolin, for BITLAND-LENOVO, PCI Express Minicard Spec Rev.1.1	 */
176*4882a593Smuzhiyun 	SW_LED_MODE10, /* added by chiyokolin, for Edimax-ASUS */
177*4882a593Smuzhiyun 	SW_LED_MODE11,	/* added by hpfan, for Xavi */
178*4882a593Smuzhiyun 	SW_LED_MODE12,	/* added by chiyokolin, for Azurewave */
179*4882a593Smuzhiyun } LED_STRATEGY_PCIE, *PLED_STRATEGY_PCIE;
180*4882a593Smuzhiyun 
181*4882a593Smuzhiyun typedef struct _LED_PCIE {
182*4882a593Smuzhiyun 	PADAPTER		padapter;
183*4882a593Smuzhiyun 
184*4882a593Smuzhiyun 	LED_PIN			LedPin;	/* Identify how to implement this SW led. */
185*4882a593Smuzhiyun 
186*4882a593Smuzhiyun 	LED_STATE		CurrLedState; /* Current LED state. */
187*4882a593Smuzhiyun 	BOOLEAN			bLedOn; /* TRUE if LED is ON, FALSE if LED is OFF. */
188*4882a593Smuzhiyun 
189*4882a593Smuzhiyun 	BOOLEAN			bLedBlinkInProgress; /* TRUE if it is blinking, FALSE o.w.. */
190*4882a593Smuzhiyun 	BOOLEAN			bLedWPSBlinkInProgress; /* TRUE if it is blinking, FALSE o.w.. */
191*4882a593Smuzhiyun 
192*4882a593Smuzhiyun 	BOOLEAN			bLedSlowBlinkInProgress;/* added by vivi, for led new mode */
193*4882a593Smuzhiyun 	u32				BlinkTimes; /* Number of times to toggle led state for blinking. */
194*4882a593Smuzhiyun 	LED_STATE		BlinkingLedState; /* Next state for blinking, either LED_ON or LED_OFF are. */
195*4882a593Smuzhiyun 
196*4882a593Smuzhiyun 	_timer			BlinkTimer; /* Timer object for led blinking. */
197*4882a593Smuzhiyun } LED_PCIE, *PLED_PCIE;
198*4882a593Smuzhiyun 
199*4882a593Smuzhiyun typedef struct _LED_PCIE	LED_DATA, *PLED_DATA;
200*4882a593Smuzhiyun typedef enum _LED_STRATEGY_PCIE	LED_STRATEGY, *PLED_STRATEGY;
201*4882a593Smuzhiyun 
202*4882a593Smuzhiyun void
203*4882a593Smuzhiyun LedControlPCIE(
204*4882a593Smuzhiyun 		PADAPTER		Adapter,
205*4882a593Smuzhiyun 		LED_CTL_MODE		LedAction
206*4882a593Smuzhiyun );
207*4882a593Smuzhiyun 
208*4882a593Smuzhiyun void
209*4882a593Smuzhiyun gen_RefreshLedState(
210*4882a593Smuzhiyun 		PADAPTER		Adapter);
211*4882a593Smuzhiyun 
212*4882a593Smuzhiyun /* ********************************************************************************
213*4882a593Smuzhiyun  * USB  LED Definition.
214*4882a593Smuzhiyun  * ******************************************************************************** */
215*4882a593Smuzhiyun #elif defined(CONFIG_USB_HCI)
216*4882a593Smuzhiyun 
217*4882a593Smuzhiyun #define IS_LED_WPS_BLINKING(_LED_USB)	(((PLED_USB)_LED_USB)->CurrLedState == LED_BLINK_WPS \
218*4882a593Smuzhiyun 		|| ((PLED_USB)_LED_USB)->CurrLedState == LED_BLINK_WPS_STOP \
219*4882a593Smuzhiyun 		|| ((PLED_USB)_LED_USB)->bLedWPSBlinkInProgress)
220*4882a593Smuzhiyun 
221*4882a593Smuzhiyun #define IS_LED_BLINKING(_LED_USB)	(((PLED_USB)_LED_USB)->bLedWPSBlinkInProgress \
222*4882a593Smuzhiyun 		|| ((PLED_USB)_LED_USB)->bLedScanBlinkInProgress)
223*4882a593Smuzhiyun 
224*4882a593Smuzhiyun 
225*4882a593Smuzhiyun typedef	enum _LED_STRATEGY_USB {
226*4882a593Smuzhiyun 	/* start from 2 */
227*4882a593Smuzhiyun 	SW_LED_MODE_UC_TRX_ONLY = 2,
228*4882a593Smuzhiyun 	SW_LED_MODE0, /* SW control 1 LED via GPIO0. It is default option. */
229*4882a593Smuzhiyun 	SW_LED_MODE1, /* 2 LEDs, through LED0 and LED1. For ALPHA. */
230*4882a593Smuzhiyun 	SW_LED_MODE2, /* SW control 1 LED via GPIO0, customized for AzWave 8187 minicard. */
231*4882a593Smuzhiyun 	SW_LED_MODE3, /* SW control 1 LED via GPIO0, customized for Sercomm Printer Server case. */
232*4882a593Smuzhiyun 	SW_LED_MODE4, /* for Edimax / Belkin */
233*4882a593Smuzhiyun 	SW_LED_MODE5, /* for Sercomm / Belkin	 */
234*4882a593Smuzhiyun 	SW_LED_MODE6,	/* for 88CU minicard, porting from ce SW_LED_MODE7 */
235*4882a593Smuzhiyun 	SW_LED_MODE7,	/* for Netgear special requirement */
236*4882a593Smuzhiyun 	SW_LED_MODE8, /* for LC */
237*4882a593Smuzhiyun 	SW_LED_MODE9, /* for Belkin AC950 */
238*4882a593Smuzhiyun 	SW_LED_MODE10, /* for Netgear A6200V2 */
239*4882a593Smuzhiyun 	SW_LED_MODE11, /* for Edimax / ASUS */
240*4882a593Smuzhiyun 	SW_LED_MODE12, /* for WNC/NEC */
241*4882a593Smuzhiyun 	SW_LED_MODE13, /* for Netgear A6100, 8811Au */
242*4882a593Smuzhiyun 	SW_LED_MODE14, /* for Buffalo, DNI, 8811Au */
243*4882a593Smuzhiyun 	SW_LED_MODE15, /* for DLINK,  8811Au/8812AU	 */
244*4882a593Smuzhiyun } LED_STRATEGY_USB, *PLED_STRATEGY_USB;
245*4882a593Smuzhiyun 
246*4882a593Smuzhiyun 
247*4882a593Smuzhiyun typedef struct _LED_USB {
248*4882a593Smuzhiyun 	PADAPTER			padapter;
249*4882a593Smuzhiyun 
250*4882a593Smuzhiyun 	LED_PIN				LedPin;	/* Identify how to implement this SW led. */
251*4882a593Smuzhiyun 
252*4882a593Smuzhiyun 	LED_STATE			CurrLedState; /* Current LED state. */
253*4882a593Smuzhiyun 	BOOLEAN				bLedOn; /* TRUE if LED is ON, FALSE if LED is OFF. */
254*4882a593Smuzhiyun 
255*4882a593Smuzhiyun 	BOOLEAN				bSWLedCtrl;
256*4882a593Smuzhiyun 
257*4882a593Smuzhiyun 	BOOLEAN				bLedBlinkInProgress; /* TRUE if it is blinking, FALSE o.w.. */
258*4882a593Smuzhiyun 	/* ALPHA, added by chiyoko, 20090106 */
259*4882a593Smuzhiyun 	BOOLEAN				bLedNoLinkBlinkInProgress;
260*4882a593Smuzhiyun 	BOOLEAN				bLedLinkBlinkInProgress;
261*4882a593Smuzhiyun 	BOOLEAN				bLedStartToLinkBlinkInProgress;
262*4882a593Smuzhiyun 	BOOLEAN				bLedScanBlinkInProgress;
263*4882a593Smuzhiyun 	BOOLEAN				bLedWPSBlinkInProgress;
264*4882a593Smuzhiyun 
265*4882a593Smuzhiyun 	u32					BlinkTimes; /* Number of times to toggle led state for blinking. */
266*4882a593Smuzhiyun 	u8					BlinkCounter; /* Added for turn off overlap led after blinking a while, by page, 20120821 */
267*4882a593Smuzhiyun 	LED_STATE			BlinkingLedState; /* Next state for blinking, either LED_ON or LED_OFF are. */
268*4882a593Smuzhiyun 
269*4882a593Smuzhiyun 	_timer				BlinkTimer; /* Timer object for led blinking. */
270*4882a593Smuzhiyun 
271*4882a593Smuzhiyun 	_workitem			BlinkWorkItem; /* Workitem used by BlinkTimer to manipulate H/W to blink LED.' */
272*4882a593Smuzhiyun } LED_USB, *PLED_USB;
273*4882a593Smuzhiyun 
274*4882a593Smuzhiyun typedef struct _LED_USB	LED_DATA, *PLED_DATA;
275*4882a593Smuzhiyun typedef enum _LED_STRATEGY_USB	LED_STRATEGY, *PLED_STRATEGY;
276*4882a593Smuzhiyun #ifdef CONFIG_RTW_SW_LED
277*4882a593Smuzhiyun void
278*4882a593Smuzhiyun LedControlUSB(
279*4882a593Smuzhiyun 		PADAPTER		Adapter,
280*4882a593Smuzhiyun 		LED_CTL_MODE		LedAction
281*4882a593Smuzhiyun );
282*4882a593Smuzhiyun #endif
283*4882a593Smuzhiyun 
284*4882a593Smuzhiyun 
285*4882a593Smuzhiyun /* ********************************************************************************
286*4882a593Smuzhiyun  * SDIO LED Definition.
287*4882a593Smuzhiyun  * ******************************************************************************** */
288*4882a593Smuzhiyun #elif defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)
289*4882a593Smuzhiyun 
290*4882a593Smuzhiyun #define IS_LED_WPS_BLINKING(_LED_SDIO)	(((PLED_SDIO)_LED_SDIO)->CurrLedState == LED_BLINK_WPS \
291*4882a593Smuzhiyun 		|| ((PLED_SDIO)_LED_SDIO)->CurrLedState == LED_BLINK_WPS_STOP \
292*4882a593Smuzhiyun 		|| ((PLED_SDIO)_LED_SDIO)->bLedWPSBlinkInProgress)
293*4882a593Smuzhiyun 
294*4882a593Smuzhiyun #define IS_LED_BLINKING(_LED_SDIO)	(((PLED_SDIO)_LED_SDIO)->bLedWPSBlinkInProgress \
295*4882a593Smuzhiyun 		|| ((PLED_SDIO)_LED_SDIO)->bLedScanBlinkInProgress)
296*4882a593Smuzhiyun 
297*4882a593Smuzhiyun 
298*4882a593Smuzhiyun typedef	enum _LED_STRATEGY_SDIO {
299*4882a593Smuzhiyun 	/* start from 2 */
300*4882a593Smuzhiyun 	SW_LED_MODE_UC_TRX_ONLY = 2,
301*4882a593Smuzhiyun 	SW_LED_MODE0, /* SW control 1 LED via GPIO0. It is default option. */
302*4882a593Smuzhiyun 	SW_LED_MODE1, /* 2 LEDs, through LED0 and LED1. For ALPHA. */
303*4882a593Smuzhiyun 	SW_LED_MODE2, /* SW control 1 LED via GPIO0, customized for AzWave 8187 minicard. */
304*4882a593Smuzhiyun 	SW_LED_MODE3, /* SW control 1 LED via GPIO0, customized for Sercomm Printer Server case. */
305*4882a593Smuzhiyun 	SW_LED_MODE4, /* for Edimax / Belkin */
306*4882a593Smuzhiyun 	SW_LED_MODE5, /* for Sercomm / Belkin	 */
307*4882a593Smuzhiyun 	SW_LED_MODE6,	/* for 88CU minicard, porting from ce SW_LED_MODE7 */
308*4882a593Smuzhiyun } LED_STRATEGY_SDIO, *PLED_STRATEGY_SDIO;
309*4882a593Smuzhiyun 
310*4882a593Smuzhiyun typedef struct _LED_SDIO {
311*4882a593Smuzhiyun 	PADAPTER			padapter;
312*4882a593Smuzhiyun 
313*4882a593Smuzhiyun 	LED_PIN				LedPin;	/* Identify how to implement this SW led. */
314*4882a593Smuzhiyun 
315*4882a593Smuzhiyun 	LED_STATE			CurrLedState; /* Current LED state. */
316*4882a593Smuzhiyun 	BOOLEAN				bLedOn; /* TRUE if LED is ON, FALSE if LED is OFF. */
317*4882a593Smuzhiyun 
318*4882a593Smuzhiyun 	BOOLEAN				bSWLedCtrl;
319*4882a593Smuzhiyun 
320*4882a593Smuzhiyun 	BOOLEAN				bLedBlinkInProgress; /* TRUE if it is blinking, FALSE o.w.. */
321*4882a593Smuzhiyun 	/* ALPHA, added by chiyoko, 20090106 */
322*4882a593Smuzhiyun 	BOOLEAN				bLedNoLinkBlinkInProgress;
323*4882a593Smuzhiyun 	BOOLEAN				bLedLinkBlinkInProgress;
324*4882a593Smuzhiyun 	BOOLEAN				bLedStartToLinkBlinkInProgress;
325*4882a593Smuzhiyun 	BOOLEAN				bLedScanBlinkInProgress;
326*4882a593Smuzhiyun 	BOOLEAN				bLedWPSBlinkInProgress;
327*4882a593Smuzhiyun 
328*4882a593Smuzhiyun 	u32					BlinkTimes; /* Number of times to toggle led state for blinking. */
329*4882a593Smuzhiyun 	LED_STATE			BlinkingLedState; /* Next state for blinking, either LED_ON or LED_OFF are. */
330*4882a593Smuzhiyun 
331*4882a593Smuzhiyun 	_timer				BlinkTimer; /* Timer object for led blinking. */
332*4882a593Smuzhiyun 
333*4882a593Smuzhiyun 	_workitem			BlinkWorkItem; /* Workitem used by BlinkTimer to manipulate H/W to blink LED. */
334*4882a593Smuzhiyun } LED_SDIO, *PLED_SDIO;
335*4882a593Smuzhiyun 
336*4882a593Smuzhiyun typedef struct _LED_SDIO	LED_DATA, *PLED_DATA;
337*4882a593Smuzhiyun typedef enum _LED_STRATEGY_SDIO	LED_STRATEGY, *PLED_STRATEGY;
338*4882a593Smuzhiyun 
339*4882a593Smuzhiyun void
340*4882a593Smuzhiyun LedControlSDIO(
341*4882a593Smuzhiyun 		PADAPTER		Adapter,
342*4882a593Smuzhiyun 		LED_CTL_MODE		LedAction
343*4882a593Smuzhiyun );
344*4882a593Smuzhiyun 
345*4882a593Smuzhiyun #endif
346*4882a593Smuzhiyun 
347*4882a593Smuzhiyun struct led_priv {
348*4882a593Smuzhiyun 	LED_STRATEGY		LedStrategy;
349*4882a593Smuzhiyun #ifdef CONFIG_RTW_SW_LED
350*4882a593Smuzhiyun 	LED_DATA			SwLed0;
351*4882a593Smuzhiyun 	LED_DATA			SwLed1;
352*4882a593Smuzhiyun 	LED_DATA			SwLed2;
353*4882a593Smuzhiyun 	u8					bRegUseLed;
354*4882a593Smuzhiyun 	u8 iface_en_mask;
355*4882a593Smuzhiyun 	u32 ctl_en_mask[CONFIG_IFACE_NUMBER];
356*4882a593Smuzhiyun 	void (*LedControlHandler)(_adapter *padapter, LED_CTL_MODE LedAction);
357*4882a593Smuzhiyun 	void (*SwLedOn)(_adapter *padapter, PLED_DATA pLed);
358*4882a593Smuzhiyun 	void (*SwLedOff)(_adapter *padapter, PLED_DATA pLed);
359*4882a593Smuzhiyun #endif
360*4882a593Smuzhiyun };
361*4882a593Smuzhiyun 
362*4882a593Smuzhiyun #define SwLedOn(adapter, pLed) \
363*4882a593Smuzhiyun 	do { \
364*4882a593Smuzhiyun 		if (adapter_to_led(adapter)->SwLedOn) \
365*4882a593Smuzhiyun 			adapter_to_led(adapter)->SwLedOn((adapter), (pLed)); \
366*4882a593Smuzhiyun 	} while (0)
367*4882a593Smuzhiyun 
368*4882a593Smuzhiyun #define SwLedOff(adapter, pLed) \
369*4882a593Smuzhiyun 	do { \
370*4882a593Smuzhiyun 		if (adapter_to_led(adapter)->SwLedOff) \
371*4882a593Smuzhiyun 			adapter_to_led(adapter)->SwLedOff((adapter), (pLed)); \
372*4882a593Smuzhiyun 	} while (0)
373*4882a593Smuzhiyun 
374*4882a593Smuzhiyun void BlinkTimerCallback(void *data);
375*4882a593Smuzhiyun void BlinkWorkItemCallback(_workitem *work);
376*4882a593Smuzhiyun 
377*4882a593Smuzhiyun void ResetLedStatus(PLED_DATA pLed);
378*4882a593Smuzhiyun 
379*4882a593Smuzhiyun void
380*4882a593Smuzhiyun InitLed(
381*4882a593Smuzhiyun 	_adapter			*padapter,
382*4882a593Smuzhiyun 	PLED_DATA		pLed,
383*4882a593Smuzhiyun 	LED_PIN			LedPin
384*4882a593Smuzhiyun );
385*4882a593Smuzhiyun 
386*4882a593Smuzhiyun void
387*4882a593Smuzhiyun DeInitLed(
388*4882a593Smuzhiyun 	PLED_DATA		pLed
389*4882a593Smuzhiyun );
390*4882a593Smuzhiyun 
391*4882a593Smuzhiyun /* hal... */
392*4882a593Smuzhiyun extern void BlinkHandler(PLED_DATA	pLed);
393*4882a593Smuzhiyun void dump_led_config(void *sel, _adapter *adapter);
394*4882a593Smuzhiyun void rtw_led_set_strategy(_adapter *adapter, u8 strategy);
395*4882a593Smuzhiyun #endif /* CONFIG_RTW_LED */
396*4882a593Smuzhiyun 
397*4882a593Smuzhiyun #if defined(CONFIG_RTW_LED)
398*4882a593Smuzhiyun #define rtw_led_get_strategy(adapter) (adapter_to_led(adapter)->LedStrategy)
399*4882a593Smuzhiyun #else
400*4882a593Smuzhiyun #define rtw_led_get_strategy(adapter) NO_LED
401*4882a593Smuzhiyun #endif
402*4882a593Smuzhiyun 
403*4882a593Smuzhiyun #define IS_NO_LED_STRATEGY(s) ((s) == NO_LED)
404*4882a593Smuzhiyun #define IS_HW_LED_STRATEGY(s) ((s) == HW_LED)
405*4882a593Smuzhiyun #define IS_SW_LED_STRATEGY(s) ((s) != NO_LED && (s) != HW_LED)
406*4882a593Smuzhiyun 
407*4882a593Smuzhiyun #if defined(CONFIG_RTW_LED) && defined(CONFIG_RTW_SW_LED)
408*4882a593Smuzhiyun 
409*4882a593Smuzhiyun #ifndef CONFIG_RTW_SW_LED_TRX_DA_CLASSIFY
410*4882a593Smuzhiyun #define CONFIG_RTW_SW_LED_TRX_DA_CLASSIFY 0
411*4882a593Smuzhiyun #endif
412*4882a593Smuzhiyun 
413*4882a593Smuzhiyun #if CONFIG_RTW_SW_LED_TRX_DA_CLASSIFY
414*4882a593Smuzhiyun void rtw_sw_led_blink_uc_trx_only(LED_DATA *led);
415*4882a593Smuzhiyun void rtw_sw_led_ctl_mode_uc_trx_only(_adapter *adapter, LED_CTL_MODE ctl);
416*4882a593Smuzhiyun #endif
417*4882a593Smuzhiyun void rtw_led_control(_adapter *adapter, LED_CTL_MODE ctl);
418*4882a593Smuzhiyun void rtw_led_tx_control(_adapter *adapter, const u8 *da);
419*4882a593Smuzhiyun void rtw_led_rx_control(_adapter *adapter, const u8 *da);
420*4882a593Smuzhiyun void rtw_led_set_iface_en(_adapter *adapter, u8 en);
421*4882a593Smuzhiyun void rtw_led_set_iface_en_mask(_adapter *adapter, u8 mask);
422*4882a593Smuzhiyun void rtw_led_set_ctl_en_mask(_adapter *adapter, u32 ctl_mask);
423*4882a593Smuzhiyun void rtw_led_set_ctl_en_mask_primary(_adapter *adapter);
424*4882a593Smuzhiyun void rtw_led_set_ctl_en_mask_virtual(_adapter *adapter);
425*4882a593Smuzhiyun #else
426*4882a593Smuzhiyun #define rtw_led_control(adapter, ctl) do {} while (0)
427*4882a593Smuzhiyun #define rtw_led_tx_control(adapter, da) do {} while (0)
428*4882a593Smuzhiyun #define rtw_led_rx_control(adapter, da) do {} while (0)
429*4882a593Smuzhiyun #define rtw_led_set_iface_en(adapter, en) do {} while (0)
430*4882a593Smuzhiyun #define rtw_led_set_iface_en_mask(adapter, mask) do {} while (0)
431*4882a593Smuzhiyun #define rtw_led_set_ctl_en_mask(adapter, ctl_mask) do {} while (0)
432*4882a593Smuzhiyun #define rtw_led_set_ctl_en_mask_primary(adapter) do {} while (0)
433*4882a593Smuzhiyun #define rtw_led_set_ctl_en_mask_virtual(adapter) do {} while (0)
434*4882a593Smuzhiyun #endif /* defined(CONFIG_RTW_LED) && defined(CONFIG_RTW_SW_LED) */
435*4882a593Smuzhiyun 
436*4882a593Smuzhiyun #endif /*__HAL_COMMON_LED_H_*/
437*4882a593Smuzhiyun 
438