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