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