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