diff options
Diffstat (limited to 'drivers/staging/r8188eu/core/rtw_led.c')
-rw-r--r-- | drivers/staging/r8188eu/core/rtw_led.c | 285 |
1 files changed, 131 insertions, 154 deletions
diff --git a/drivers/staging/r8188eu/core/rtw_led.c b/drivers/staging/r8188eu/core/rtw_led.c index 0e3453639a8b..ccd43accb7dc 100644 --- a/drivers/staging/r8188eu/core/rtw_led.c +++ b/drivers/staging/r8188eu/core/rtw_led.c @@ -3,25 +3,20 @@ #include "../include/drv_types.h" #include "../include/rtw_led.h" +#include "../include/rtl8188e_spec.h" -void BlinkTimerCallback(struct timer_list *t) -{ - struct LED_871x *pLed = from_timer(pLed, t, BlinkTimer); - struct adapter *padapter = pLed->padapter; +#define LED_BLINK_NO_LINK_INTVL msecs_to_jiffies(1000) +#define LED_BLINK_LINK_INTVL msecs_to_jiffies(500) +#define LED_BLINK_SCAN_INTVL msecs_to_jiffies(180) +#define LED_BLINK_FASTER_INTVL msecs_to_jiffies(50) +#define LED_BLINK_WPS_SUCESS_INTVL msecs_to_jiffies(5000) - if ((padapter->bSurpriseRemoved) || (padapter->bDriverStopped)) - return; +#define IS_LED_WPS_BLINKING(l) \ + ((l)->CurrLedState == LED_BLINK_WPS || \ + (l)->CurrLedState == LED_BLINK_WPS_STOP || \ + (l)->bLedWPSBlinkInProgress) - _set_workitem(&pLed->BlinkWorkItem); -} - -void BlinkWorkItemCallback(struct work_struct *work) -{ - struct LED_871x *pLed = container_of(work, struct LED_871x, BlinkWorkItem); - BlinkHandler(pLed); -} - -void ResetLedStatus(struct LED_871x *pLed) +static void ResetLedStatus(struct LED_871x *pLed) { pLed->CurrLedState = RTW_LED_OFF; /* Current LED state. */ pLed->bLedOn = false; /* true if LED is ON, false if LED is OFF. */ @@ -34,39 +29,48 @@ void ResetLedStatus(struct LED_871x *pLed) pLed->bLedNoLinkBlinkInProgress = false; pLed->bLedLinkBlinkInProgress = false; - pLed->bLedStartToLinkBlinkInProgress = false; pLed->bLedScanBlinkInProgress = false; } -void InitLed871x(struct adapter *padapter, struct LED_871x *pLed, enum LED_PIN_871x LedPin) +static void SwLedOn(struct adapter *padapter, struct LED_871x *pLed) { - pLed->padapter = padapter; - pLed->LedPin = LedPin; + u8 LedCfg; - ResetLedStatus(pLed); + if (padapter->bSurpriseRemoved || padapter->bDriverStopped) + return; - timer_setup(&pLed->BlinkTimer, BlinkTimerCallback, 0); - _init_workitem(&pLed->BlinkWorkItem, BlinkWorkItemCallback, pLed); + LedCfg = rtw_read8(padapter, REG_LEDCFG2); + rtw_write8(padapter, REG_LEDCFG2, (LedCfg & 0xf0) | BIT(5) | BIT(6)); /* SW control led0 on. */ + pLed->bLedOn = true; } -void DeInitLed871x(struct LED_871x *pLed) +static void SwLedOff(struct adapter *padapter, struct LED_871x *pLed) { - _cancel_workitem_sync(&pLed->BlinkWorkItem); - _cancel_timer_ex(&pLed->BlinkTimer); - ResetLedStatus(pLed); + u8 LedCfg; + + if (padapter->bSurpriseRemoved || padapter->bDriverStopped) + goto exit; + + LedCfg = rtw_read8(padapter, REG_LEDCFG2);/* 0x4E */ + + LedCfg &= 0x90; /* Set to software control. */ + rtw_write8(padapter, REG_LEDCFG2, (LedCfg | BIT(3))); + LedCfg = rtw_read8(padapter, REG_MAC_PINMUX_CFG); + LedCfg &= 0xFE; + rtw_write8(padapter, REG_MAC_PINMUX_CFG, LedCfg); +exit: + pLed->bLedOn = false; } -static void SwLedBlink1(struct LED_871x *pLed) +static void blink_work(struct work_struct *work) { + struct delayed_work *dwork = to_delayed_work(work); + struct LED_871x *pLed = container_of(dwork, struct LED_871x, blink_work); struct adapter *padapter = pLed->padapter; struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - u8 bStopBlinking = false; - /* Change LED according to BlinkingLedState specified. */ - if (pLed->BlinkingLedState == RTW_LED_ON) - SwLedOn(padapter, pLed); - else - SwLedOff(padapter, pLed); + if ((padapter->bSurpriseRemoved) || (padapter->bDriverStopped)) + return; if (padapter->pwrctrlpriv.rf_pwrstate != rf_on) { SwLedOff(padapter, pLed); @@ -74,81 +78,67 @@ static void SwLedBlink1(struct LED_871x *pLed) return; } + /* Change LED according to BlinkingLedState specified. */ + if (pLed->BlinkingLedState == RTW_LED_ON) + SwLedOn(padapter, pLed); + else + SwLedOff(padapter, pLed); + switch (pLed->CurrLedState) { case LED_BLINK_SLOWLY: if (pLed->bLedOn) pLed->BlinkingLedState = RTW_LED_OFF; else pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&pLed->BlinkTimer, LED_BLINK_NO_LINK_INTERVAL_ALPHA); + schedule_delayed_work(&pLed->blink_work, LED_BLINK_NO_LINK_INTVL); break; case LED_BLINK_NORMAL: if (pLed->bLedOn) pLed->BlinkingLedState = RTW_LED_OFF; else pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&pLed->BlinkTimer, LED_BLINK_LINK_INTERVAL_ALPHA); + schedule_delayed_work(&pLed->blink_work, LED_BLINK_LINK_INTVL); break; case LED_BLINK_SCAN: + if (pLed->bLedOn) + pLed->BlinkingLedState = RTW_LED_OFF; + else + pLed->BlinkingLedState = RTW_LED_ON; pLed->BlinkTimes--; - if (pLed->BlinkTimes == 0) - bStopBlinking = true; - if (bStopBlinking) { + if (pLed->BlinkTimes == 0) { if (check_fwstate(pmlmepriv, _FW_LINKED)) { pLed->bLedLinkBlinkInProgress = true; pLed->CurrLedState = LED_BLINK_NORMAL; - if (pLed->bLedOn) - pLed->BlinkingLedState = RTW_LED_OFF; - else - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&pLed->BlinkTimer, LED_BLINK_LINK_INTERVAL_ALPHA); + schedule_delayed_work(&pLed->blink_work, LED_BLINK_LINK_INTVL); } else if (!check_fwstate(pmlmepriv, _FW_LINKED)) { pLed->bLedNoLinkBlinkInProgress = true; pLed->CurrLedState = LED_BLINK_SLOWLY; - if (pLed->bLedOn) - pLed->BlinkingLedState = RTW_LED_OFF; - else - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&pLed->BlinkTimer, LED_BLINK_NO_LINK_INTERVAL_ALPHA); + schedule_delayed_work(&pLed->blink_work, LED_BLINK_NO_LINK_INTVL); } pLed->bLedScanBlinkInProgress = false; } else { - if (pLed->bLedOn) - pLed->BlinkingLedState = RTW_LED_OFF; - else - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&pLed->BlinkTimer, LED_BLINK_SCAN_INTERVAL_ALPHA); + schedule_delayed_work(&pLed->blink_work, LED_BLINK_SCAN_INTVL); } break; case LED_BLINK_TXRX: + if (pLed->bLedOn) + pLed->BlinkingLedState = RTW_LED_OFF; + else + pLed->BlinkingLedState = RTW_LED_ON; pLed->BlinkTimes--; - if (pLed->BlinkTimes == 0) - bStopBlinking = true; - if (bStopBlinking) { + if (pLed->BlinkTimes == 0) { if (check_fwstate(pmlmepriv, _FW_LINKED)) { pLed->bLedLinkBlinkInProgress = true; pLed->CurrLedState = LED_BLINK_NORMAL; - if (pLed->bLedOn) - pLed->BlinkingLedState = RTW_LED_OFF; - else - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&pLed->BlinkTimer, LED_BLINK_LINK_INTERVAL_ALPHA); + schedule_delayed_work(&pLed->blink_work, LED_BLINK_LINK_INTVL); } else if (!check_fwstate(pmlmepriv, _FW_LINKED)) { pLed->bLedNoLinkBlinkInProgress = true; pLed->CurrLedState = LED_BLINK_SLOWLY; - if (pLed->bLedOn) - pLed->BlinkingLedState = RTW_LED_OFF; - else - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&pLed->BlinkTimer, LED_BLINK_NO_LINK_INTERVAL_ALPHA); + schedule_delayed_work(&pLed->blink_work, LED_BLINK_NO_LINK_INTVL); } pLed->bLedBlinkInProgress = false; } else { - if (pLed->bLedOn) - pLed->BlinkingLedState = RTW_LED_OFF; - else - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&pLed->BlinkTimer, LED_BLINK_FASTER_INTERVAL_ALPHA); + schedule_delayed_work(&pLed->blink_work, LED_BLINK_FASTER_INTVL); } break; case LED_BLINK_WPS: @@ -156,27 +146,22 @@ static void SwLedBlink1(struct LED_871x *pLed) pLed->BlinkingLedState = RTW_LED_OFF; else pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&pLed->BlinkTimer, LED_BLINK_SCAN_INTERVAL_ALPHA); + schedule_delayed_work(&pLed->blink_work, LED_BLINK_SCAN_INTVL); break; case LED_BLINK_WPS_STOP: /* WPS success */ - if (pLed->BlinkingLedState == RTW_LED_ON) - bStopBlinking = false; - else - bStopBlinking = true; - - if (bStopBlinking) { + if (pLed->BlinkingLedState != RTW_LED_ON) { pLed->bLedLinkBlinkInProgress = true; pLed->CurrLedState = LED_BLINK_NORMAL; if (pLed->bLedOn) pLed->BlinkingLedState = RTW_LED_OFF; else pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&pLed->BlinkTimer, LED_BLINK_LINK_INTERVAL_ALPHA); + schedule_delayed_work(&pLed->blink_work, LED_BLINK_LINK_INTVL); pLed->bLedWPSBlinkInProgress = false; } else { pLed->BlinkingLedState = RTW_LED_OFF; - _set_timer(&pLed->BlinkTimer, LED_BLINK_WPS_SUCESS_INTERVAL_ALPHA); + schedule_delayed_work(&pLed->blink_work, LED_BLINK_WPS_SUCESS_INTVL); } break; default: @@ -184,25 +169,56 @@ static void SwLedBlink1(struct LED_871x *pLed) } } -static void SwLedControlMode1(struct adapter *padapter, enum LED_CTL_MODE LedAction) +void rtl8188eu_InitSwLeds(struct adapter *padapter) +{ + struct led_priv *pledpriv = &padapter->ledpriv; + struct LED_871x *pLed = &pledpriv->SwLed0; + + pLed->padapter = padapter; + ResetLedStatus(pLed); + INIT_DELAYED_WORK(&pLed->blink_work, blink_work); +} + +void rtl8188eu_DeInitSwLeds(struct adapter *padapter) +{ + struct led_priv *ledpriv = &padapter->ledpriv; + struct LED_871x *pLed = &ledpriv->SwLed0; + + cancel_delayed_work_sync(&pLed->blink_work); + ResetLedStatus(pLed); + SwLedOff(padapter, pLed); +} + +void rtw_led_control(struct adapter *padapter, enum LED_CTL_MODE LedAction) { struct led_priv *ledpriv = &padapter->ledpriv; + struct registry_priv *registry_par; struct LED_871x *pLed = &ledpriv->SwLed0; struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + if ((padapter->bSurpriseRemoved) || (padapter->bDriverStopped) || + (!padapter->hw_init_completed)) + return; + + if (!ledpriv->bRegUseLed) + return; + + registry_par = &padapter->registrypriv; + if (!registry_par->led_enable) + return; + switch (LedAction) { - case LED_CTL_POWER_ON: case LED_CTL_START_TO_LINK: case LED_CTL_NO_LINK: if (!pLed->bLedNoLinkBlinkInProgress) { if (pLed->CurrLedState == LED_BLINK_SCAN || IS_LED_WPS_BLINKING(pLed)) return; if (pLed->bLedLinkBlinkInProgress) { - _cancel_timer_ex(&pLed->BlinkTimer); + cancel_delayed_work(&pLed->blink_work); pLed->bLedLinkBlinkInProgress = false; } if (pLed->bLedBlinkInProgress) { - _cancel_timer_ex(&pLed->BlinkTimer); + cancel_delayed_work(&pLed->blink_work); pLed->bLedBlinkInProgress = false; } @@ -212,7 +228,7 @@ static void SwLedControlMode1(struct adapter *padapter, enum LED_CTL_MODE LedAct pLed->BlinkingLedState = RTW_LED_OFF; else pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&pLed->BlinkTimer, LED_BLINK_NO_LINK_INTERVAL_ALPHA); + schedule_delayed_work(&pLed->blink_work, LED_BLINK_NO_LINK_INTVL); } break; case LED_CTL_LINK: @@ -220,11 +236,11 @@ static void SwLedControlMode1(struct adapter *padapter, enum LED_CTL_MODE LedAct if (pLed->CurrLedState == LED_BLINK_SCAN || IS_LED_WPS_BLINKING(pLed)) return; if (pLed->bLedNoLinkBlinkInProgress) { - _cancel_timer_ex(&pLed->BlinkTimer); + cancel_delayed_work(&pLed->blink_work); pLed->bLedNoLinkBlinkInProgress = false; } if (pLed->bLedBlinkInProgress) { - _cancel_timer_ex(&pLed->BlinkTimer); + cancel_delayed_work(&pLed->blink_work); pLed->bLedBlinkInProgress = false; } pLed->bLedLinkBlinkInProgress = true; @@ -233,7 +249,7 @@ static void SwLedControlMode1(struct adapter *padapter, enum LED_CTL_MODE LedAct pLed->BlinkingLedState = RTW_LED_OFF; else pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&pLed->BlinkTimer, LED_BLINK_LINK_INTERVAL_ALPHA); + schedule_delayed_work(&pLed->blink_work, LED_BLINK_LINK_INTVL); } break; case LED_CTL_SITE_SURVEY: @@ -243,15 +259,15 @@ static void SwLedControlMode1(struct adapter *padapter, enum LED_CTL_MODE LedAct if (IS_LED_WPS_BLINKING(pLed)) return; if (pLed->bLedNoLinkBlinkInProgress) { - _cancel_timer_ex(&pLed->BlinkTimer); + cancel_delayed_work(&pLed->blink_work); pLed->bLedNoLinkBlinkInProgress = false; } if (pLed->bLedLinkBlinkInProgress) { - _cancel_timer_ex(&pLed->BlinkTimer); + cancel_delayed_work(&pLed->blink_work); pLed->bLedLinkBlinkInProgress = false; } if (pLed->bLedBlinkInProgress) { - _cancel_timer_ex(&pLed->BlinkTimer); + cancel_delayed_work(&pLed->blink_work); pLed->bLedBlinkInProgress = false; } pLed->bLedScanBlinkInProgress = true; @@ -261,7 +277,7 @@ static void SwLedControlMode1(struct adapter *padapter, enum LED_CTL_MODE LedAct pLed->BlinkingLedState = RTW_LED_OFF; else pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&pLed->BlinkTimer, LED_BLINK_SCAN_INTERVAL_ALPHA); + schedule_delayed_work(&pLed->blink_work, LED_BLINK_SCAN_INTVL); } break; case LED_CTL_TX: @@ -270,11 +286,11 @@ static void SwLedControlMode1(struct adapter *padapter, enum LED_CTL_MODE LedAct if (pLed->CurrLedState == LED_BLINK_SCAN || IS_LED_WPS_BLINKING(pLed)) return; if (pLed->bLedNoLinkBlinkInProgress) { - _cancel_timer_ex(&pLed->BlinkTimer); + cancel_delayed_work(&pLed->blink_work); pLed->bLedNoLinkBlinkInProgress = false; } if (pLed->bLedLinkBlinkInProgress) { - _cancel_timer_ex(&pLed->BlinkTimer); + cancel_delayed_work(&pLed->blink_work); pLed->bLedLinkBlinkInProgress = false; } pLed->bLedBlinkInProgress = true; @@ -284,26 +300,25 @@ static void SwLedControlMode1(struct adapter *padapter, enum LED_CTL_MODE LedAct pLed->BlinkingLedState = RTW_LED_OFF; else pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&pLed->BlinkTimer, LED_BLINK_FASTER_INTERVAL_ALPHA); + schedule_delayed_work(&pLed->blink_work, LED_BLINK_FASTER_INTVL); } break; case LED_CTL_START_WPS: /* wait until xinpin finish */ - case LED_CTL_START_WPS_BOTTON: if (!pLed->bLedWPSBlinkInProgress) { if (pLed->bLedNoLinkBlinkInProgress) { - _cancel_timer_ex(&pLed->BlinkTimer); + cancel_delayed_work(&pLed->blink_work); pLed->bLedNoLinkBlinkInProgress = false; } if (pLed->bLedLinkBlinkInProgress) { - _cancel_timer_ex(&pLed->BlinkTimer); + cancel_delayed_work(&pLed->blink_work); pLed->bLedLinkBlinkInProgress = false; } if (pLed->bLedBlinkInProgress) { - _cancel_timer_ex(&pLed->BlinkTimer); + cancel_delayed_work(&pLed->blink_work); pLed->bLedBlinkInProgress = false; } if (pLed->bLedScanBlinkInProgress) { - _cancel_timer_ex(&pLed->BlinkTimer); + cancel_delayed_work(&pLed->blink_work); pLed->bLedScanBlinkInProgress = false; } pLed->bLedWPSBlinkInProgress = true; @@ -312,42 +327,42 @@ static void SwLedControlMode1(struct adapter *padapter, enum LED_CTL_MODE LedAct pLed->BlinkingLedState = RTW_LED_OFF; else pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&pLed->BlinkTimer, LED_BLINK_SCAN_INTERVAL_ALPHA); + schedule_delayed_work(&pLed->blink_work, LED_BLINK_SCAN_INTVL); } break; case LED_CTL_STOP_WPS: if (pLed->bLedNoLinkBlinkInProgress) { - _cancel_timer_ex(&pLed->BlinkTimer); + cancel_delayed_work(&pLed->blink_work); pLed->bLedNoLinkBlinkInProgress = false; } if (pLed->bLedLinkBlinkInProgress) { - _cancel_timer_ex(&pLed->BlinkTimer); + cancel_delayed_work(&pLed->blink_work); pLed->bLedLinkBlinkInProgress = false; } if (pLed->bLedBlinkInProgress) { - _cancel_timer_ex(&pLed->BlinkTimer); + cancel_delayed_work(&pLed->blink_work); pLed->bLedBlinkInProgress = false; } if (pLed->bLedScanBlinkInProgress) { - _cancel_timer_ex(&pLed->BlinkTimer); + cancel_delayed_work(&pLed->blink_work); pLed->bLedScanBlinkInProgress = false; } if (pLed->bLedWPSBlinkInProgress) - _cancel_timer_ex(&pLed->BlinkTimer); + cancel_delayed_work(&pLed->blink_work); else pLed->bLedWPSBlinkInProgress = true; pLed->CurrLedState = LED_BLINK_WPS_STOP; if (pLed->bLedOn) { pLed->BlinkingLedState = RTW_LED_OFF; - _set_timer(&pLed->BlinkTimer, LED_BLINK_WPS_SUCESS_INTERVAL_ALPHA); + schedule_delayed_work(&pLed->blink_work, LED_BLINK_WPS_SUCESS_INTVL); } else { pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&pLed->BlinkTimer, 0); + schedule_delayed_work(&pLed->blink_work, 0); } break; case LED_CTL_STOP_WPS_FAIL: if (pLed->bLedWPSBlinkInProgress) { - _cancel_timer_ex(&pLed->BlinkTimer); + cancel_delayed_work(&pLed->blink_work); pLed->bLedWPSBlinkInProgress = false; } pLed->bLedNoLinkBlinkInProgress = true; @@ -356,29 +371,29 @@ static void SwLedControlMode1(struct adapter *padapter, enum LED_CTL_MODE LedAct pLed->BlinkingLedState = RTW_LED_OFF; else pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&pLed->BlinkTimer, LED_BLINK_NO_LINK_INTERVAL_ALPHA); + schedule_delayed_work(&pLed->blink_work, LED_BLINK_NO_LINK_INTVL); break; case LED_CTL_POWER_OFF: pLed->CurrLedState = RTW_LED_OFF; pLed->BlinkingLedState = RTW_LED_OFF; if (pLed->bLedNoLinkBlinkInProgress) { - _cancel_timer_ex(&pLed->BlinkTimer); + cancel_delayed_work(&pLed->blink_work); pLed->bLedNoLinkBlinkInProgress = false; } if (pLed->bLedLinkBlinkInProgress) { - _cancel_timer_ex(&pLed->BlinkTimer); + cancel_delayed_work(&pLed->blink_work); pLed->bLedLinkBlinkInProgress = false; } if (pLed->bLedBlinkInProgress) { - _cancel_timer_ex(&pLed->BlinkTimer); + cancel_delayed_work(&pLed->blink_work); pLed->bLedBlinkInProgress = false; } if (pLed->bLedWPSBlinkInProgress) { - _cancel_timer_ex(&pLed->BlinkTimer); + cancel_delayed_work(&pLed->blink_work); pLed->bLedWPSBlinkInProgress = false; } if (pLed->bLedScanBlinkInProgress) { - _cancel_timer_ex(&pLed->BlinkTimer); + cancel_delayed_work(&pLed->blink_work); pLed->bLedScanBlinkInProgress = false; } SwLedOff(padapter, pLed); @@ -387,41 +402,3 @@ static void SwLedControlMode1(struct adapter *padapter, enum LED_CTL_MODE LedAct break; } } - -void BlinkHandler(struct LED_871x *pLed) -{ - struct adapter *padapter = pLed->padapter; - - if ((padapter->bSurpriseRemoved) || (padapter->bDriverStopped)) - return; - - SwLedBlink1(pLed); -} - -void LedControl8188eu(struct adapter *padapter, enum LED_CTL_MODE LedAction) -{ - struct led_priv *ledpriv = &padapter->ledpriv; - struct registry_priv *registry_par; - - if ((padapter->bSurpriseRemoved) || (padapter->bDriverStopped) || - (!padapter->hw_init_completed)) - return; - - if (!ledpriv->bRegUseLed) - return; - - registry_par = &padapter->registrypriv; - if (!registry_par->led_enable) - return; - - if ((padapter->pwrctrlpriv.rf_pwrstate != rf_on && - padapter->pwrctrlpriv.rfoff_reason > RF_CHANGE_BY_PS) && - (LedAction == LED_CTL_TX || LedAction == LED_CTL_RX || - LedAction == LED_CTL_SITE_SURVEY || - LedAction == LED_CTL_LINK || - LedAction == LED_CTL_NO_LINK || - LedAction == LED_CTL_POWER_ON)) - return; - - SwLedControlMode1(padapter, LedAction); -} |