M7350/wlan/8192es/DriverSrcPkg/Driver/rtl8192cd_92es/8192cd_led.c
2024-09-09 08:59:52 +00:00

647 lines
19 KiB
C
Executable File

/*
* Handling routines for LED lightening functions
*
* $Id: 8192cd_led.c,v 1.1 2012/05/04 12:49:07 jimmylin Exp $
*
* Copyright (c) 2012 Realtek Semiconductor Corp.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*/
#define _8192CD_LED_C_
#include "./8192cd_cfg.h"
#include "./8192cd.h"
#include "./8192cd_headers.h"
#include "./8192cd_debug.h"
// for SW LED ----------------------------------------------------
#ifdef RTL8190_SWGPIO_LED
static void set_swGpio_LED(struct rtl8192cd_priv *priv, unsigned int ledNum, int flag)
{
unsigned int ledItem; /* parameter to decode GPIO item */
if (ledNum >= SWLED_GPIORT_CNT)
return;
ledItem = SWLED_GPIORT_ITEM(LED_ROUTE, ledNum);
if (ledItem & SWLED_GPIORT_ENABLEMSK)
{
/* get the corresponding information (GPIO number/Active high or low) of LED */
int gpio;
int activeMode; /* !=0 : Active High, ==0 : Active Low */
gpio = ledItem & SWLED_GPIORT_RTBITMSK;
activeMode = ledItem & SWLED_GPIORT_HLMSK;
if (flag) { /* Turn ON LED */
if (activeMode) /* Active High */
RTL_W8(0x90, RTL_R8(0x90) | BIT(gpio));
else /* Active Low */
RTL_W8(0x90, RTL_R8(0x90) &~ BIT(gpio));
}
else { /* Turn OFF LED */
if (activeMode) /* Active High */
RTL_W8(0x90, RTL_R8(0x90) &~ BIT(gpio));
else /* Active Low */
RTL_W8(0x90, RTL_R8(0x90) | BIT(gpio));
}
}
}
#endif // RTL8190_SWGPIO_LED
static void set_sw_LED0(struct rtl8192cd_priv *priv, int flag)
{
#ifdef RTL8190_SWGPIO_LED
if (LED_ROUTE)
set_swGpio_LED(priv, 0, flag);
#elif defined(CONFIG_RTL8672) || defined(NOT_RTK_BSP)
if (flag)
RTL_W32(LEDCFG, (RTL_R32(LEDCFG) & 0xfffffff0) | LED0SV);
else
RTL_W32(LEDCFG, RTL_R32(LEDCFG) & 0xfffffff0);
#else
if ((GET_CHIP_VER(priv) == VERSION_8188E)||(GET_CHIP_VER(priv) == VERSION_8192E)) {
#ifdef RTLWIFINIC_GPIO_CONTROL
if (flag)
RTLWIFINIC_GPIO_write(5, 0);
else
RTLWIFINIC_GPIO_write(5, 1);
#endif
}
else if ((GET_CHIP_VER(priv) == VERSION_8812E)) {
if (flag)
RTL_W32(LEDCFG, (RTL_R32(LEDCFG) & 0xfffff0ff) | LED1SV);
else
RTL_W32(LEDCFG, RTL_R32(LEDCFG) & 0xfffff0ff);
}
else if (GET_CHIP_VER(priv) == VERSION_8881A) {
if (flag)
writel(readl(IO_TYPE_CAST(0xb800350c)) | BIT(24), IO_TYPE_CAST(0xb800350c));
else
writel(readl(IO_TYPE_CAST(0xb800350c)) & ~BIT(24), IO_TYPE_CAST(0xb800350c));
}
else {
if (flag)
RTL_W32(LEDCFG, (RTL_R32(LEDCFG) & 0xfffffff0) | LED0SV);
else
RTL_W32(LEDCFG, RTL_R32(LEDCFG) & 0xfffffff0);
}
#endif
}
static void set_sw_LED1(struct rtl8192cd_priv *priv, int flag)
{
#ifdef RTL8190_SWGPIO_LED
if (LED_ROUTE)
set_swGpio_LED(priv, 1, flag);
#elif defined(CONFIG_RTL8672) || defined(NOT_RTK_BSP)
if (flag)
RTL_W32(LEDCFG, (RTL_R32(LEDCFG) & 0xfffff0ff) | LED1SV);
else
RTL_W32(LEDCFG, RTL_R32(LEDCFG) & 0xfffff0ff);
#else
if ((GET_CHIP_VER(priv) == VERSION_8188E)||(GET_CHIP_VER(priv) == VERSION_8192E)) {
#ifdef RTLWIFINIC_GPIO_CONTROL
if (flag)
RTLWIFINIC_GPIO_write(5, 0);
else
RTLWIFINIC_GPIO_write(5, 1);
#endif
}
#if defined(CONFIG_RTL_92D_SUPPORT)
else if (GET_CHIP_VER(priv) == VERSION_8192D) {
if (flag)
RTL_W32(LEDCFG, (RTL_R32(LEDCFG) & 0xfffff0ff) | LED1SV_92D);
else
RTL_W32(LEDCFG, RTL_R32(LEDCFG) & 0xfffff0ff);
}
#endif
else if (GET_CHIP_VER(priv) == VERSION_8192C){
if (flag)
RTL_W32(LEDCFG, (RTL_R32(LEDCFG) & 0xfffff0ff) | LED1SV);
else
RTL_W32(LEDCFG, RTL_R32(LEDCFG) & 0xfffff0ff);
}
#endif
}
static void set_sw_LED2(struct rtl8192cd_priv *priv, int flag)
{
#ifdef RTL8190_SWGPIO_LED
if (LED_ROUTE)
set_swGpio_LED(priv, 2, flag);
#elif defined(CONFIG_RTL8672) || defined(NOT_RTK_BSP)
if (flag)
RTL_W32(LEDCFG, (RTL_R32(LEDCFG) & 0xfff0ffff) | LED2SV);
else
RTL_W32(LEDCFG, RTL_R32(LEDCFG) & 0xfff0ffff);
#else
if ((GET_CHIP_VER(priv) == VERSION_8188E)||(GET_CHIP_VER(priv) == VERSION_8192E)) {
#ifdef RTLWIFINIC_GPIO_CONTROL
if (flag)
RTLWIFINIC_GPIO_write(5, 0);
else
RTLWIFINIC_GPIO_write(5, 1);
#endif
}
#if defined(CONFIG_RTL_92D_SUPPORT)
else if (GET_CHIP_VER(priv) == VERSION_8192D) {
if (flag)
RTL_W32(LEDCFG, (RTL_R32(LEDCFG) & 0xfff0ffff) | LED2SV_92D);
else
RTL_W32(LEDCFG, RTL_R32(LEDCFG) & 0xfff0ffff);
}
#endif
else if (GET_CHIP_VER(priv) == VERSION_8192C){
if (flag)
RTL_W32(LEDCFG, (RTL_R32(LEDCFG) & 0xfff0ffff) | LED2SV);
else
RTL_W32(LEDCFG, RTL_R32(LEDCFG) & 0xfff0ffff);
}
#endif
}
static void LED_Interval_timeout(unsigned long task_priv)
{
struct rtl8192cd_priv *priv = (struct rtl8192cd_priv *)task_priv;
int led_on_time= LED_ON_TIME;
if (!(priv->drv_state & DRV_STATE_OPEN))
return;
#ifdef PCIE_POWER_SAVING
if ((priv->pwr_state != L1) && (priv->pwr_state != L2))
#endif
{
if (!priv->pshare->set_led_in_progress) {
#if defined(CONFIG_RTL8672) || defined(NOT_RTK_BSP)
#ifdef CONFIG_RTL_88E_SUPPORT
if (GET_CHIP_VER(priv) == VERSION_8188E)
set_sw_LED2(priv, priv->pshare->LED_Toggle);
else
#endif
#ifdef CONFIG_WLAN_HAL_8192EE
if (GET_CHIP_VER(priv) == VERSION_8192E)
set_sw_LED0(priv, priv->pshare->LED_Toggle);
else
#endif
#ifdef CONFIG_RTL_8812_SUPPORT
if (GET_CHIP_VER(priv) == VERSION_8812E)
set_sw_LED1(priv, priv->pshare->LED_Toggle);
else
#endif
#endif // CONFIG_RTL8672 || NOT_RTK_BSP
if ((LED_TYPE == LEDTYPE_SW_LINKTXRX) ||
(LED_TYPE == LEDTYPE_SW_LINKTXRXDATA) ||
(LED_TYPE == LEDTYPE_SW_ENABLETXRXDATA) ||
((LED_TYPE == LEDTYPE_SW_ADATA_GDATA) && (priv->pshare->curr_band == BAND_5G)) ||
(LED_TYPE == LEDTYPE_SW_LED2_GPIO8_LINKTXRX) ||
(LED_TYPE == LEDTYPE_SW_LED2_GPIO8_ENABLETXRXDATA) ||
(LED_TYPE == LEDTYPE_SW_LED2_GPIO10_LINKTXRX) ||
(LED_TYPE == LEDTYPE_SW_LED2_GPIO8_LINKTXRXDATA) ||
(LED_TYPE == LEDTYPE_SW_LED2_GPIO8_ASOCTXRXDATA) ||
(LED_TYPE == LEDTYPE_SW_LED2_GPIO10_ENABLETXRXDATA) ||
(LED_TYPE == LEDTYPE_SW_LED2_GPIO10_ENABLETXRXDATA_92D) ||
(LED_TYPE == LEDTYPE_SW_LED1_GPIO9_LINKTXRX_92D) ||
(LED_TYPE == LEDTYPE_SW_LED2_GPIO10_LINKTXRX_92D))
{
if ((LED_TYPE == LEDTYPE_SW_LED2_GPIO8_LINKTXRX) ||
(LED_TYPE == LEDTYPE_SW_LED2_GPIO8_ENABLETXRXDATA) ||
(LED_TYPE == LEDTYPE_SW_LED2_GPIO10_LINKTXRX) ||
(LED_TYPE == LEDTYPE_SW_LED2_GPIO8_LINKTXRXDATA) ||
(LED_TYPE == LEDTYPE_SW_LED2_GPIO8_ASOCTXRXDATA) ||
(LED_TYPE == LEDTYPE_SW_LED2_GPIO10_ENABLETXRXDATA) ||
(LED_TYPE == LEDTYPE_SW_LED2_GPIO10_ENABLETXRXDATA_92D) ||
(LED_TYPE == LEDTYPE_SW_LED2_GPIO10_LINKTXRX_92D))
set_sw_LED2(priv, priv->pshare->LED_Toggle);
else if (LED_TYPE == LEDTYPE_SW_LED1_GPIO9_LINKTXRX_92D)
set_sw_LED1(priv, priv->pshare->LED_Toggle);
else
set_sw_LED0(priv, priv->pshare->LED_Toggle);
} else {
set_sw_LED1(priv, priv->pshare->LED_Toggle);
}
}
}
if( (LED_TYPE == LEDTYPE_SW_LED2_GPIO8_ASOCTXRXDATA) &&
(!(OPMODE & WIFI_ASOC_STATE))) //client not assco , mark_led
{
led_on_time = LED_NOBLINK_TIME;
}
if ( priv->pshare->LED_Toggle == priv->pshare->LED_ToggleStart) {
mod_timer(&priv->pshare->LED_Timer, jiffies + priv->pshare->LED_Interval);
} else {
if (LED_TYPE == LEDTYPE_SW_CUSTOM1)
mod_timer(&priv->pshare->LED_Timer, jiffies + priv->pshare->LED_Interval);
else
mod_timer(&priv->pshare->LED_Timer, jiffies + led_on_time);
}
priv->pshare->LED_Toggle = (priv->pshare->LED_Toggle + 1) % 2;
}
void enable_sw_LED(struct rtl8192cd_priv *priv, int init)
{
#if (defined(HW_ANT_SWITCH) || defined(SW_ANT_SWITCH))&&( defined(CONFIG_RTL_92C_SUPPORT) || defined(CONFIG_RTL_92D_SUPPORT))
int b23 = RTL_R32(LEDCFG) & BIT(23);
#endif
if (LED_TYPE == LEDTYPE_SW_LED2_GPIO8_ASOCTXRXDATA)
if (!(OPMODE & WIFI_STATION_STATE)) // if it is not Client mode , then run orignal 12 type
LED_TYPE = LEDTYPE_SW_LED2_GPIO8_ENABLETXRXDATA ;
// configure mac to use SW LED
#if defined(CONFIG_RTL8672) || defined(NOT_RTK_BSP)
#ifdef CONFIG_RTL_88E_SUPPORT
if (GET_CHIP_VER(priv) == VERSION_8188E)
RTL_W32(LEDCFG, (RTL_R32(LEDCFG)&0xFF00FFFF) | LED2EN | LED2SV);
else
#endif
#ifdef CONFIG_WLAN_HAL_8192EE
if (GET_CHIP_VER(priv) == VERSION_8192E)
RTL_W32(LEDCFG, (RTL_R32(LEDCFG)&0xFFFFFF00) | LED0SV);
else
#endif
#else // !CONFIG_RTL8672 && !NOT_RTK_BSP
#if defined(CONFIG_RTL_88E_SUPPORT) || defined(CONFIG_WLAN_HAL_8192EE) //mark_ecos
if ((GET_CHIP_VER(priv) == VERSION_8188E)||(GET_CHIP_VER(priv) == VERSION_8192E))
{
#ifdef RTLWIFINIC_GPIO_CONTROL
RTLWIFINIC_GPIO_config(5, 0x10);
#endif
}
else
#endif
#endif // CONFIG_RTL8672 || NOT_RTK_BSP
if (GET_CHIP_VER(priv) == VERSION_8812E)
RTL_W32(LEDCFG, BIT(13) | LED1SV);
else
#ifdef CONFIG_WLAN_HAL_8881A
if (GET_CHIP_VER(priv) == VERSION_8881A) {
writel(readl(IO_TYPE_CAST(0xb8000044)) | BIT(15) | BIT(16), IO_TYPE_CAST(0xb8000044));
writel(readl(IO_TYPE_CAST(0xb8003500)) & ~BIT(24), IO_TYPE_CAST(0xb8003500));
writel(readl(IO_TYPE_CAST(0xb8003508)) | BIT(24), IO_TYPE_CAST(0xb8003508));
writel(readl(IO_TYPE_CAST(0xb800350c)) | BIT(24), IO_TYPE_CAST(0xb800350c));
} else
#endif
{
if (LED_TYPE == LEDTYPE_SW_LED2_GPIO10_LINKTXRX)
RTL_W32(LEDCFG, (RTL_R32(LEDCFG)&0xFF00FFFF) | LED2EN | LED2SV);
else if (LED_TYPE == LEDTYPE_SW_LED2_GPIO10_ENABLETXRXDATA)
RTL_W32(LEDCFG, (RTL_R32(LEDCFG)&0xFF00FFFF) | LED2EN | LED2SV);
#ifdef CONFIG_RTL_92D_SUPPORT
else if ((LED_TYPE == LEDTYPE_SW_LED2_GPIO10_LINKTXRX_92D) ||
(LED_TYPE == LEDTYPE_SW_LED2_GPIO10_ENABLETXRXDATA_92D))
RTL_W32(LEDCFG,(RTL_R32(LEDCFG)&0xFF00FFFF)| LED2DIS_92D | LED2SV_92D);
else if (LED_TYPE == LEDTYPE_SW_LED1_GPIO9_LINKTXRX_92D)
RTL_W32(LEDCFG, (RTL_R32(LEDCFG)&0xFFFF00FF)|LED1DIS_92D | LED1SV_92D);
#endif
else if ((LED_TYPE == LEDTYPE_SW_LED2_GPIO8_LINKTXRX) ||
(LED_TYPE == LEDTYPE_SW_LED2_GPIO8_ENABLETXRXDATA) ||
(LED_TYPE == LEDTYPE_SW_LED2_GPIO8_ASOCTXRXDATA) ||
(LED_TYPE == LEDTYPE_SW_LED2_GPIO8_LINKTXRXDATA))
RTL_W32(LEDCFG, (RTL_R32(LEDCFG)&0xFF00FFFF) | GP8_LED | LED2EN | LED2SV);
else
RTL_W32(LEDCFG, LED2SV | LED1SV | LED0SV);
}
priv->pshare->LED_Interval = LED_INTERVAL_TIME;
priv->pshare->LED_Toggle = 0;
priv->pshare->LED_ToggleStart = LED_OFF;
priv->pshare->LED_tx_cnt_log = 0;
priv->pshare->LED_rx_cnt_log = 0;
priv->pshare->LED_tx_cnt = 0;
priv->pshare->LED_rx_cnt = 0;
if ((LED_TYPE == LEDTYPE_SW_ENABLE_TXRXDATA) ||
(LED_TYPE == LEDTYPE_SW_ENABLETXRXDATA)) {
set_sw_LED0(priv, LED_ON);
set_sw_LED1(priv, LED_OFF);
if (LED_TYPE == LEDTYPE_SW_ENABLETXRXDATA)
priv->pshare->LED_ToggleStart = LED_ON;
} else if ((LED_TYPE == LEDTYPE_SW_LED2_GPIO10_ENABLETXRXDATA) ||
(LED_TYPE == LEDTYPE_SW_LED2_GPIO10_ENABLETXRXDATA_92D)) {
set_sw_LED2(priv, LED_ON);
priv->pshare->LED_ToggleStart = LED_ON;
} else if (LED_TYPE == LEDTYPE_SW_ADATA_GDATA) {
priv->pshare->LED_ToggleStart = LED_ON;
if (priv->pshare->curr_band == BAND_5G) {
set_sw_LED0(priv, LED_ON);
set_sw_LED1(priv, LED_OFF);
}
else { // 11G
set_sw_LED0(priv, LED_OFF);
set_sw_LED1(priv, LED_ON);
}
}
else if (LED_TYPE == LEDTYPE_SW_ENABLETXRXDATA_1) {
set_sw_LED0(priv, LED_OFF);
set_sw_LED1(priv, LED_ON);
priv->pshare->LED_ToggleStart = LED_ON;
}
else if ((LED_TYPE == LEDTYPE_SW_LED2_GPIO8_ENABLETXRXDATA) ||
(LED_TYPE == LEDTYPE_SW_LED2_GPIO8_ASOCTXRXDATA) ) {
set_sw_LED2(priv, LED_ON);
priv->pshare->LED_ToggleStart = LED_ON;
}
else if ((LED_TYPE == LEDTYPE_SW_LED2_GPIO8_LINKTXRX) ||
(LED_TYPE == LEDTYPE_SW_LED2_GPIO10_LINKTXRX) ||
(LED_TYPE == LEDTYPE_SW_LED2_GPIO8_LINKTXRXDATA)) {
set_sw_LED2(priv, LED_OFF);
}
else {
set_sw_LED0(priv, LED_OFF);
set_sw_LED1(priv, LED_OFF);
set_sw_LED2(priv, LED_OFF);
}
#if (defined(HW_ANT_SWITCH) || defined(SW_ANT_SWITCH))&&( defined(CONFIG_RTL_92C_SUPPORT) || defined(CONFIG_RTL_92D_SUPPORT))
RTL_W32(LEDCFG, b23 | RTL_R32(LEDCFG));
#endif
if (init) {
init_timer(&priv->pshare->LED_Timer);
#if defined(CONFIG_PCI_HCI)
priv->pshare->LED_Timer.data = (unsigned long) priv;
priv->pshare->LED_Timer.function = &LED_Interval_timeout;
#elif defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI)
priv->pshare->LED_Timer.data = (unsigned long) &priv->pshare->LED_Timer_event;
priv->pshare->LED_Timer.function = timer_event_timer_fn;
INIT_TIMER_EVENT_ENTRY(&priv->pshare->LED_Timer_event,
LED_Interval_timeout, (unsigned long)priv);
#endif
mod_timer(&priv->pshare->LED_Timer, jiffies + priv->pshare->LED_Interval);
}
}
void disable_sw_LED(struct rtl8192cd_priv *priv)
{
if (timer_pending(&priv->pshare->LED_Timer))
del_timer_sync(&priv->pshare->LED_Timer);
if ((LED_TYPE == LEDTYPE_SW_LED2_GPIO8_LINKTXRX) ||
(LED_TYPE == LEDTYPE_SW_LED2_GPIO8_ENABLETXRXDATA) ||
(LED_TYPE == LEDTYPE_SW_LED2_GPIO10_LINKTXRX) ||
(LED_TYPE == LEDTYPE_SW_LED2_GPIO8_LINKTXRXDATA) ||
(LED_TYPE == LEDTYPE_SW_LED2_GPIO8_ASOCTXRXDATA)) {
set_sw_LED2(priv, LED_OFF);
} else {
set_sw_LED0(priv, LED_OFF);
set_sw_LED1(priv, LED_OFF);
set_sw_LED2(priv, LED_OFF);
}
}
void calculate_sw_LED_interval(struct rtl8192cd_priv *priv)
{
unsigned int delta = 0;
int i, scale_num=0;
if (priv->pshare->set_led_in_progress)
return;
if( (LED_TYPE == LEDTYPE_SW_LED2_GPIO8_ASOCTXRXDATA) &&
(!(OPMODE & WIFI_ASOC_STATE))) //client not assco , mark_led
{
priv->pshare->LED_Interval = LED_NOBLINK_TIME; // force one second
priv->pshare->LED_tx_cnt_log = priv->pshare->LED_tx_cnt; // sync tx/rx cnt
priv->pshare->LED_rx_cnt_log = priv->pshare->LED_rx_cnt;
return ;
}
// calculate counter delta
delta += UINT32_DIFF(priv->pshare->LED_tx_cnt, priv->pshare->LED_tx_cnt_log);
delta += UINT32_DIFF(priv->pshare->LED_rx_cnt, priv->pshare->LED_rx_cnt_log);
priv->pshare->LED_tx_cnt_log = priv->pshare->LED_tx_cnt;
priv->pshare->LED_rx_cnt_log = priv->pshare->LED_rx_cnt;
// update interval according to delta
if (delta == 0) {
if (LED_TYPE == LEDTYPE_SW_CUSTOM1) {
if (priv->pshare->LED_Interval != RTL_SECONDS_TO_JIFFIES(1)) {
priv->pshare->LED_Interval = RTL_SECONDS_TO_JIFFIES(1);
mod_timer(&priv->pshare->LED_Timer, jiffies + priv->pshare->LED_Interval);
}
} else {
if (priv->pshare->LED_Interval == LED_NOBLINK_TIME)
mod_timer(&priv->pshare->LED_Timer, jiffies + priv->pshare->LED_Interval);
else {
priv->pshare->LED_Interval = LED_NOBLINK_TIME;
if (LED_TYPE == LEDTYPE_SW_ENABLETXRXDATA)
priv->pshare->LED_Toggle = LED_ON;
}
}
} else {
if ((priv->pmib->dot11BssType.net_work_type & WIRELESS_11G) ||
(priv->pmib->dot11BssType.net_work_type & WIRELESS_11A))
scale_num = LED_MAX_PACKET_CNT_AG / LED_MAX_SCALE;
else
scale_num = LED_MAX_PACKET_CNT_B / LED_MAX_SCALE;
if ((LED_TYPE == LEDTYPE_SW_LINK_TXRX) ||
(LED_TYPE == LEDTYPE_SW_LINKTXRX) ||
(LED_TYPE == LEDTYPE_SW_LED2_GPIO8_LINKTXRX) ||
(LED_TYPE == LEDTYPE_SW_LED2_GPIO10_LINKTXRX) ||
(LED_TYPE == LEDTYPE_SW_LED2_GPIO8_LINKTXRXDATA) ||
(LED_TYPE == LEDTYPE_SW_LED1_GPIO9_LINKTXRX_92D) ||
(LED_TYPE == LEDTYPE_SW_LED2_GPIO10_LINKTXRX_92D) ||
(LED_TYPE == LEDTYPE_SW_CUSTOM1))
scale_num = scale_num*2;
for (i=1; i<=LED_MAX_SCALE; i++) {
if (delta < i*scale_num)
break;
}
if (priv->pshare->rf_ft_var.ledBlinkingFreq > 1) {
i = i*priv->pshare->rf_ft_var.ledBlinkingFreq;
if (i > LED_MAX_SCALE)
i = LED_MAX_SCALE;
}
priv->pshare->LED_Interval = ((LED_MAX_SCALE-i+1)*LED_INTERVAL_TIME)/LED_MAX_SCALE;
if (priv->pshare->LED_Interval < LED_ON_TIME)
priv->pshare->LED_Interval = LED_ON_TIME;
}
if ((LED_TYPE == LEDTYPE_SW_LINKTXRX) ||
(LED_TYPE == LEDTYPE_SW_LINKTXRXDATA) ||
(LED_TYPE == LEDTYPE_SW_LED2_GPIO8_LINKTXRX) ||
(LED_TYPE == LEDTYPE_SW_LED2_GPIO10_LINKTXRX) ||
(LED_TYPE == LEDTYPE_SW_LED2_GPIO8_LINKTXRXDATA) ||
(LED_TYPE == LEDTYPE_SW_LED1_GPIO9_LINKTXRX_92D) ||
(LED_TYPE == LEDTYPE_SW_LED2_GPIO10_LINKTXRX_92D)) {
if (priv->link_status)
priv->pshare->LED_ToggleStart = LED_ON;
else
priv->pshare->LED_ToggleStart = LED_OFF;
} else {
if (priv->pshare->set_led_in_progress)
return;
if ((LED_TYPE == LEDTYPE_SW_LINK_TXRX) ||
(LED_TYPE == LEDTYPE_SW_LINK_TXRXDATA)) {
if (priv->link_status)
set_sw_LED0(priv, LED_ON);
else
set_sw_LED0(priv, LED_OFF);
} else if (LED_TYPE == LEDTYPE_SW_ADATA_GDATA) {
if (priv->pshare->curr_band == BAND_5G) {
set_sw_LED0(priv, LED_ON);
set_sw_LED1(priv, LED_OFF);
} else { // 11A
set_sw_LED0(priv, LED_OFF);
set_sw_LED1(priv, LED_ON);
}
}
}
}
#if 0
void set_wireless_LED_steady_on(int led_num, struct net_device *dev)
{
struct rtl8192cd_priv *priv;
if (led_num != LED_0 && led_num != LED_1 && led_num != LED_2)
return;
#ifdef NETDEV_NO_PRIV
if (dev == NULL || netdev_priv(dev) == NULL)
return;
priv = ((struct rtl8192cd_priv *)netdev_priv(dev))->wlan_priv;
#else
if (dev == NULL || dev->priv == NULL)
return;
priv = (struct rtl8192cd_priv *)dev->priv;
#endif
if (priv->pshare == NULL)
return;
priv->pshare->set_led_in_progress = 1;
if ((LED_TYPE >= LEDTYPE_HW_TX_RX) && (LED_TYPE <= LEDTYPE_HW_LINKACT_INFRA)) {
enable_sw_LED(priv, 0);
}
else if ((LED_TYPE >= LEDTYPE_SW_LINK_TXRX) && (LED_TYPE < LEDTYPE_SW_MAX)) {
if (timer_pending(&priv->pshare->LED_Timer))
del_timer_sync(&priv->pshare->LED_Timer);
}
if (led_num == LED_0)
set_sw_LED0(priv, LED_ON);
else if (led_num == LED_1)
set_sw_LED1(priv, LED_ON);
else
set_sw_LED2(priv, LED_ON);
}
void recover_wireless_LED(struct net_device *dev)
{
struct rtl8192cd_priv *priv;
#ifdef NETDEV_NO_PRIV
if (dev == NULL || netdev_priv(dev) == NULL)
return;
priv = ((struct rtl8192cd_priv *)netdev_priv(dev))->wlan_priv;
#else
if (dev == NULL || dev->priv == NULL)
return;
priv = (struct rtl8192cd_priv *)dev->priv;
#endif
if (!priv->pshare->set_led_in_progress)
return;
// for HW/SW LED
if ((LED_TYPE >= LEDTYPE_HW_TX_RX) && (LED_TYPE <= LEDTYPE_HW_LINKACT_INFRA)) {
set_sw_LED0(priv, LED_OFF);
set_sw_LED1(priv, LED_OFF);
set_sw_LED2(priv, LED_OFF);
enable_hw_LED(priv, LED_TYPE);
}
else if ((LED_TYPE >= LEDTYPE_SW_LINK_TXRX) && (LED_TYPE < LEDTYPE_SW_MAX)) {
enable_sw_LED(priv, 0);
mod_timer(&priv->pshare->LED_Timer, jiffies + priv->pshare->LED_Interval);
}
priv->pshare->set_led_in_progress = 0;
}
#endif
void control_wireless_led(struct rtl8192cd_priv *priv, int enable)
{
if (enable == 0) {
priv->pshare->set_led_in_progress = 1;
set_sw_LED0(priv, LED_OFF);
set_sw_LED1(priv, LED_OFF);
set_sw_LED2(priv, LED_OFF);
}
else if (enable == 1) {
priv->pshare->set_led_in_progress = 1;
set_sw_LED0(priv, LED_ON);
set_sw_LED1(priv, LED_ON);
set_sw_LED2(priv, LED_ON);
}
else if (enable == 2) {
set_sw_LED0(priv, priv->pshare->LED_ToggleStart);
set_sw_LED1(priv, priv->pshare->LED_ToggleStart);
set_sw_LED2(priv, priv->pshare->LED_ToggleStart);
priv->pshare->set_led_in_progress = 0;
}
}
#ifdef CONFIG_RTL_ULINKER
static struct rtl8192cd_priv *root_priv = NULL;
void enable_sys_LED(struct rtl8192cd_priv *priv)
{
#ifdef RTLWIFINIC_GPIO_CONTROL
RTLWIFINIC_GPIO_config(4, 0x10);
#endif
root_priv = priv;
}
void renable_sw_LED(void)
{
struct rtl8192cd_priv *priv = root_priv;
if ((LED_TYPE >= LEDTYPE_SW_LINK_TXRX) && (LED_TYPE < LEDTYPE_SW_MAX)) {
priv->pshare->set_led_in_progress = 1;
disable_sw_LED(priv);
priv->pshare->set_led_in_progress = 0;
enable_sw_LED(priv, 1);
}
}
#endif /* #ifdef CONFIG_RTL_ULINKER */