Ejemplo n.º 1
0
A_STATUS ar6000_suspend_ev(void *context)
{
    A_STATUS status = A_OK;
    AR_SOFTC_T *ar = (AR_SOFTC_T *)context;
    A_INT16 pmmode = ar->arSuspendConfig;
    A_BOOL cutPower;

wow_not_connected:
    switch (pmmode) {
    case WLAN_SUSPEND_DEEP_SLEEP:
        ar->arWlanState = WLAN_DISABLED;
        ar6000_enter_exit_deep_sleep_state(ar, FALSE);
        AR_DEBUG_PRINTF(ATH_DEBUG_PM,("%s:Suspend for deep sleep mode %d\n", __func__, ar->arWlanPowerState));
        break;
    case WLAN_SUSPEND_WOW:
        if (ar->arWmiReady && ar->arWlanState==WLAN_ENABLED && ar->arConnected) {
            ar6000_wow_suspend(ar);
            AR_DEBUG_PRINTF(ATH_DEBUG_PM,("%s:Suspend for wow mode %d\n", __func__, ar->arWlanPowerState));
            /* leave for pm_device to setup wow */
        } else {
            pmmode = ar->arWow2Config;
            goto wow_not_connected;
        }
        break;
    case WLAN_SUSPEND_CUT_PWR:
        /* fall through */
    default:
        ar->arWlanState = WLAN_DISABLED;
        cutPower = TRUE;
        if (ar->arSuspendCutPwrConfig == CUT_POWER_ALWAYS) {
            cutPower = TRUE;
        } else {
            /* 
             * Both radio's are OFF, enter cut power 
             * Check BT only for BT clock sharing designs 
             */
            if ((ar->arWlanOff) &&
                ((ar->arBTOff) || (!ar->arBTSharing)))
            {
                cutPower = TRUE;
            } else {
                cutPower = FALSE;
            }
        }
        if (cutPower) {
            ar6000_enter_exit_cut_power_state(ar, FALSE);
        } else {
            ar6000_enter_exit_deep_sleep_state(ar, FALSE);
        }
        AR_DEBUG_PRINTF(ATH_DEBUG_PM,("%s:Suspend for cut power mode %d\n", __func__, ar->arWlanPowerState));
        break;
    }

    ar->scan_triggered = 0;
    return status;
}
Ejemplo n.º 2
0
static A_STATUS ar6000_suspend_ev(void *context)
{
    A_STATUS status = A_OK;
    int pmmode = buspm;
    AR_SOFTC_T *ar = (AR_SOFTC_T *)context;
wow_not_connected:

    switch (pmmode) {
    case WLAN_PWR_CTRL_DEEP_SLEEP:
        if (ar->arWlanState == WLAN_DISABLED) {
            ar->arOsPowerCtrl = WLAN_PWR_CTRL_DEEP_SLEEP_DISABLED;
            AR_DEBUG_PRINTF(ATH_DEBUG_SUSPEND,("%s:Suspend for deep sleep disabled mode %d\n", __func__, ar->arOsPowerCtrl));
        } else {
            ar6000_set_wlan_state(ar, WLAN_DISABLED);
            ar->arOsPowerCtrl = WLAN_PWR_CTRL_DEEP_SLEEP;
            AR_DEBUG_PRINTF(ATH_DEBUG_SUSPEND,("%s:Suspend for deep sleep mode %d\n", __func__, ar->arOsPowerCtrl));
        }              
        status = A_EBUSY;
        break;
    case WLAN_PWR_CTRL_WOW:
        if (ar->arWmiReady && ar->arWlanState==WLAN_ENABLED && ar->arConnected) {
            ar->arOsPowerCtrl = WLAN_PWR_CTRL_WOW;
            AR_DEBUG_PRINTF(ATH_DEBUG_SUSPEND,("%s:Suspend for wow mode %d\n", __func__, ar->arOsPowerCtrl));
            ar6000_wow_suspend(ar);
            /* leave for pm_device to setup wow */
            status = A_EBUSY;
        } else {
            pmmode = wow2mode;
            goto wow_not_connected;
        }
        break;
    case WLAN_PWR_CTRL_CUT_PWR:
        /* fall through */
    default:        
        ar->arOsPowerCtrl = WLAN_PWR_CTRL_CUT_PWR;
        AR_DEBUG_PRINTF(ATH_DEBUG_SUSPEND,("%s: Suspend for cut off mode %d\n", __func__, ar->arOsPowerCtrl));
        ar6000_stop_endpoint(ar->arNetDev, TRUE);
        status = A_OK;
        break;
    }

    ar->scan_triggered = 0;
    return status;
}