1 #ifndef __RTL8712_LED_H
2 #define __RTL8712_LED_H
3 
4 #include "osdep_service.h"
5 #include "drv_types.h"
6 
7 /*===========================================================================
8  * LED customization.
9  *===========================================================================
10  */
11 enum LED_CTL_MODE {
12 	LED_CTL_POWER_ON = 1,
13 	LED_CTL_LINK = 2,
14 	LED_CTL_NO_LINK = 3,
15 	LED_CTL_TX = 4,
16 	LED_CTL_RX = 5,
17 	LED_CTL_SITE_SURVEY = 6,
18 	LED_CTL_POWER_OFF = 7,
19 	LED_CTL_START_TO_LINK = 8,
20 	LED_CTL_START_WPS = 9,
21 	LED_CTL_STOP_WPS = 10,
22 	LED_CTL_START_WPS_BOTTON = 11,
23 	LED_CTL_STOP_WPS_FAIL = 12,
24 	LED_CTL_STOP_WPS_FAIL_OVERLAP = 13,
25 };
26 
27 #define IS_LED_WPS_BLINKING(_LED_871x)	\
28 	(((struct LED_871x *)_LED_871x)->CurrLedState == LED_BLINK_WPS \
29 	|| ((struct LED_871x *)_LED_871x)->CurrLedState == LED_BLINK_WPS_STOP \
30 	|| ((struct LED_871x *)_LED_871x)->bLedWPSBlinkInProgress)
31 
32 #define IS_LED_BLINKING(_LED_871x)	\
33 		(((struct LED_871x *)_LED_871x)->bLedWPSBlinkInProgress \
34 		|| ((struct LED_871x *)_LED_871x)->bLedScanBlinkInProgress)
35 
36 enum LED_PIN_871x {
37 	LED_PIN_GPIO0,
38 	LED_PIN_LED0,
39 	LED_PIN_LED1
40 };
41 
42 /*===========================================================================
43  * LED customization.
44  *===========================================================================
45  */
46 enum LED_STRATEGY_871x {
47 	SW_LED_MODE0, /* SW control 1 LED via GPIO0. It is default option. */
48 	SW_LED_MODE1, /* 2 LEDs, through LED0 and LED1. For ALPHA. */
49 	SW_LED_MODE2, /* SW control 1 LED via GPIO0,
50 		       * custom for AzWave 8187 minicard. */
51 	SW_LED_MODE3, /* SW control 1 LED via GPIO0,
52 		       *  customized for Sercomm Printer Server case.*/
53 	SW_LED_MODE4, /*for Edimax / Belkin*/
54 	SW_LED_MODE5, /*for Sercomm / Belkin*/
55 	SW_LED_MODE6, /*for WNC / Corega*/
56 	HW_LED, /* HW control 2 LEDs, LED0 and LED1 (there are 4 different
57 		 * control modes, see MAC.CONFIG1 for details.)*/
58 };
59 
60 struct LED_871x {
61 	struct _adapter		*padapter;
62 	enum LED_PIN_871x	LedPin;	/* Implementation for this SW led. */
63 	u32			CurrLedState; /* Current LED state. */
64 	u8			bLedOn; /* true if LED is ON */
65 	u8			bSWLedCtrl;
66 	u8			bLedBlinkInProgress; /*true if blinking */
67 	u8			bLedNoLinkBlinkInProgress;
68 	u8			bLedLinkBlinkInProgress;
69 	u8			bLedStartToLinkBlinkInProgress;
70 	u8			bLedScanBlinkInProgress;
71 	u8			bLedWPSBlinkInProgress;
72 	u32			BlinkTimes; /* No. times to toggle for blink.*/
73 	u32			BlinkingLedState; /* Next state for blinking,
74 						   * either LED_ON or OFF.*/
75 
76 	struct timer_list	BlinkTimer; /* Timer object for led blinking.*/
77 	_workitem		BlinkWorkItem; /* Workitem used by BlinkTimer */
78 };
79 
80 struct led_priv {
81 	/* add for led control */
82 	struct LED_871x		SwLed0;
83 	struct LED_871x		SwLed1;
84 	enum LED_STRATEGY_871x	LedStrategy;
85 	u8			bRegUseLed;
86 	void (*LedControlHandler)(struct _adapter *padapter,
87 				  enum LED_CTL_MODE LedAction);
88 	/* add for led control */
89 };
90 
91 /*===========================================================================
92  * Interface to manipulate LED objects.
93  *===========================================================================*/
94 void r8712_InitSwLeds(struct _adapter *padapter);
95 void r8712_DeInitSwLeds(struct _adapter *padapter);
96 void LedControl871x(struct _adapter *padapter, enum LED_CTL_MODE LedAction);
97 
98 #endif
99 
100