blob: 82ee15ea3c12871bbacc61a3b9c5994a48ed8104 [file] [log] [blame]
/*
* Copyright (c) 2011-2016 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
*
* Permission to use, copy, modify, and/or distribute this software for
* any purpose with or without fee is hereby granted, provided that the
* above copyright notice and this permission notice appear in all
* copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
* WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
* AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
* DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
* PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE.
*/
/*
* This file was originally distributed by Qualcomm Atheros, Inc.
* under proprietary terms before Copyright ownership was assigned
* to the Linux Foundation.
*/
/******************************************************************************
*
* Name: pmcApi.h
*
* Description: Power Management Control (PMC) API definitions.
*
******************************************************************************/
#ifndef __PMC_API_H__
#define __PMC_API_H__
/*
* This timer value determines the default periodicity at which BMPS retries
* will happen; this default value is overwritten typically by OS specific
* registry/INI values.
*/
#define BMPS_TRAFFIC_TIMER_DEFAULT 5000 //unit = ms
#define DHCP_REMAIN_POWER_ACTIVE_THRESHOLD 12 // (12 * 5) sec = 60 seconds = 1 min
//This timer value is used when starting the timer right after association. This value
//should be large enough to allow the auth, DHCP handshake to complete
#define BMPS_TRAFFIC_TIMER_ALLOW_SECURITY_DHCP 8000 //unit = ms
/*
* This timer value is used to start the timer right after key completion
* during roaming. This should be small enough to allow STA to enter PS
* immediately after key completion as no DHCP phase during roaming.
*/
#define TRAFFIC_TIMER_ROAMING 100
#define PMC_IS_CHIP_ACCESSIBLE(pmcState) ( (IMPS != (pmcState)) && (REQUEST_IMPS != (pmcState)) && \
(STANDBY != (pmcState)) && (REQUEST_STANDBY != (pmcState)) )
/* Power events that are signaled to PMC. */
typedef enum ePmcPowerEvent
{
ePMC_SYSTEM_HIBERNATE, /* host is entering hibernation */
ePMC_SYSTEM_RESUME, /* host is resuming after hibernation */
ePMC_HW_WLAN_SWITCH_OFF, /* Hardware WLAN Switch has been turned off */
ePMC_HW_WLAN_SWITCH_ON, /* Hardware WLAN Switch has been turned on */
ePMC_SW_WLAN_SWITCH_OFF, /* Software WLAN Switch has been turned off */
ePMC_SW_WLAN_SWITCH_ON, /* Software WLAN Switch has been turned on */
ePMC_BATTERY_OPERATION, /* host is now operating on battery power */
ePMC_AC_OPERATION /* host is now operating on AC power */
} tPmcPowerEvent;
/* Power saving modes. */
typedef enum ePmcPowerSavingMode
{
ePMC_IDLE_MODE_POWER_SAVE, /* Idle Mode Power Save (IMPS) */
ePMC_BEACON_MODE_POWER_SAVE, /* Beacon Mode Power Save (BMPS) */
ePMC_SPATIAL_MULTIPLEX_POWER_SAVE, /* Spatial Multiplexing Power Save (SMPS) */
ePMC_UAPSD_MODE_POWER_SAVE, /* Unscheduled Automatic Power Save Delivery Mode */
ePMC_STANDBY_MODE_POWER_SAVE, /* Standby Power Save Mode */
ePMC_WOWL_MODE_POWER_SAVE /* Wake-on-Wireless LAN Power Save Mode */
} tPmcPowerSavingMode;
/* Switch states. */
typedef enum ePmcSwitchState
{
ePMC_SWITCH_OFF, /* switch off */
ePMC_SWITCH_ON /* switch on */
} tPmcSwitchState;
/* Device power states. */
typedef enum ePmcPowerState
{
ePMC_FULL_POWER, /* full power */
ePMC_LOW_POWER, /* low power */
} tPmcPowerState;
/* PMC states. */
typedef enum ePmcState
{
STOPPED, /* PMC is stopped */
FULL_POWER, /* full power */
LOW_POWER, /* low power */
REQUEST_IMPS, /* requesting IMPS */
IMPS, /* in IMPS */
REQUEST_BMPS, /* requesting BMPS */
BMPS, /* in BMPS */
REQUEST_FULL_POWER, /* requesting full power */
REQUEST_START_UAPSD, /* requesting Start UAPSD */
REQUEST_STOP_UAPSD, /* requesting Stop UAPSD */
UAPSD, /* in UAPSD */
REQUEST_STANDBY, /* requesting standby mode */
STANDBY, /* in standby mode */
REQUEST_ENTER_WOWL, /* requesting enter WOWL */
REQUEST_EXIT_WOWL, /* requesting exit WOWL */
WOWL /* Chip in WOWL mode */
} tPmcState;
/* Which beacons should be forwarded to the host. */
typedef enum ePmcBeaconsToForward
{
ePMC_NO_BEACONS, /* none */
ePMC_BEACONS_WITH_TIM_SET, /* with TIM set */
ePMC_BEACONS_WITH_DTIM_SET, /* with DTIM set */
ePMC_NTH_BEACON, /* every Nth beacon */
ePMC_ALL_BEACONS /* all beacons */
} tPmcBeaconsToForward;
/* The Spatial Multiplexing Power Save modes. */
typedef enum ePmcSmpsMode
{
ePMC_DYNAMIC_SMPS, /* dynamic SMPS */
ePMC_STATIC_SMPS /* static SMPS */
} tPmcSmpsMode;
/* Configuration parameters for Idle Mode Power Save (IMPS). */
typedef struct sPmcImpsConfigParams
{
tANI_BOOLEAN enterOnAc; /* FALSE if device should enter IMPS only when host operating
on battery power, TRUE if device should enter always */
} tPmcImpsConfigParams, *tpPmcImpsConfigParams;
/* Configuration parameters for Beacon Mode Power Save (BMPS). */
typedef struct sPmcBmpsConfigParams
{
tANI_BOOLEAN enterOnAc; /* FALSE if device should enter BMPS only when host operating on
battery power, TRUE if device should enter always */
tANI_U32 txThreshold; /* transmit rate under which BMPS should be entered (frames / traffic measurement period) */
tANI_U32 rxThreshold; /* receive rate under which BMPS should be entered (frames / traffic measurement period) */
tANI_U32 trafficMeasurePeriod; /* period for BMPS traffic measurement (milliseconds) */
tANI_U32 bmpsPeriod; /* amount of time in low power (beacon intervals) */
tPmcBeaconsToForward forwardBeacons; /* which beacons should be forwarded to the host */
tANI_U32 valueOfN; /* the value of N when forwardBeacons is set to ePMC_NTH_BEACON */
tANI_BOOLEAN usePsPoll; /* TRUE if PS-POLL should be used to retrieve frames from AP, FALSE if a
null data frame with the PM bit reset should be used */
tANI_BOOLEAN setPmOnLastFrame; /* TRUE to keep device in BMPS as much as possible, FALSE otherwise, TRUE means:
1) PM bit should be set on last pending transmit data frame
2) null frame with PM bit set should be transmitted after last pending receive
frame has been processed */
tANI_BOOLEAN enableBeaconEarlyTermination; /* if TRUE, BET feature in RIVA
will be enabled, FALSE otherwise, TRUE means:
RXP will read the beacon header for the
TIM bit & discard the rest if set to 0,
while in BMPS */
tANI_U8 bcnEarlyTermWakeInterval; /* This specifies how often in terms
of LI we will disable BET in order to sync
up TSF*/
} tPmcBmpsConfigParams, *tpPmcBmpsConfigParams;
/* Configuration parameters for Spatial Multiplexing Power Save (SMPS). */
typedef struct sPmcSmpsConfigParams
{
tPmcSmpsMode mode; /* mode to use */
tANI_BOOLEAN enterOnAc; /* FALSE if device should enter SMPS only when host operating on
battery power, TRUE if device should enter always */
} tPmcSmpsConfigParams, *tpPmcSmpsConfigParams;
/* Routine definitions. */
extern eHalStatus pmcOpen (tHalHandle hHal);
extern eHalStatus pmcStart (tHalHandle hHal);
extern eHalStatus pmcStop (tHalHandle hHal);
extern eHalStatus pmcClose (tHalHandle hHal );
extern eHalStatus pmcSetConfigPowerSave (tHalHandle hHal, tPmcPowerSavingMode psMode, void *pConfigParams);
extern eHalStatus pmcGetConfigPowerSave (tHalHandle hHal, tPmcPowerSavingMode psMode, void *pConfigParams);
extern eHalStatus pmcEnablePowerSave (tHalHandle hHal, tPmcPowerSavingMode psMode);
extern eHalStatus pmcStartAutoBmpsTimer (tHalHandle hHal);
extern eHalStatus pmcStopAutoBmpsTimer (tHalHandle hHal);
extern eHalStatus pmcDisablePowerSave (tHalHandle hHal, tPmcPowerSavingMode psMode);
extern eHalStatus pmcQueryPowerState (tHalHandle hHal, tPmcPowerState *pPowerState, tPmcSwitchState *pHwWlanSwitchState,
tPmcSwitchState *pSwWlanSwitchState);
extern tANI_BOOLEAN pmcIsPowerSaveEnabled (tHalHandle hHal, tPmcPowerSavingMode psMode);
extern eHalStatus pmcRequestFullPower (tHalHandle hHal, void (*callbackRoutine) (void *callbackContext, eHalStatus status),
void *callbackContext, tRequestFullPowerReason fullPowerReason);
extern eHalStatus pmcRequestImps (tHalHandle hHal, tANI_U32 impsPeriod,
void (*callbackRoutine) (void *callbackContext, eHalStatus status),
void *callbackContext);
extern eHalStatus pmcRegisterPowerSaveCheck (tHalHandle hHal, tANI_BOOLEAN (*checkRoutine) (void *checkContext),
void *checkContext);
extern eHalStatus pmcDeregisterPowerSaveCheck (tHalHandle hHal, tANI_BOOLEAN (*checkRoutine) (void *checkContext));
extern void pmcMessageProcessor (tHalHandle hHal, tSirSmeRsp *pMsg);
extern void pmcResetImpsFailStatus (tHalHandle hHal);
extern v_BOOL_t IsPmcImpsReqFailed (tHalHandle hHal);
extern eHalStatus pmcRequestBmps (
tHalHandle hHal,
void (*callbackRoutine) (void *callbackContext, eHalStatus status),
void *callbackContext);
extern eHalStatus pmcStartUapsd (
tHalHandle hHal,
void (*callbackRoutine) (void *callbackContext, eHalStatus status),
void *callbackContext);
extern eHalStatus pmcStopUapsd (tHalHandle hHal);
extern eHalStatus pmcRequestStandby (
tHalHandle hHal,
void (*callbackRoutine) (void *callbackContext, eHalStatus status),
void *callbackContext);
extern eHalStatus pmcRegisterDeviceStateUpdateInd (tHalHandle hHal,
void (*callbackRoutine) (void *callbackContext, tPmcState pmcState),
void *callbackContext);
extern eHalStatus pmcDeregisterDeviceStateUpdateInd (tHalHandle hHal,
void (*callbackRoutine) (void *callbackContext, tPmcState pmcState));
extern eHalStatus pmcReady(tHalHandle hHal);
void pmcDumpInit(tHalHandle hHal);
extern eHalStatus pmcWowlAddBcastPattern (
tHalHandle hHal,
tpSirWowlAddBcastPtrn pattern,
tANI_U8 sessionId);
extern eHalStatus pmcWowlDelBcastPattern (
tHalHandle hHal,
tpSirWowlDelBcastPtrn pattern,
tANI_U8 sessionId);
extern eHalStatus pmcEnterWowl (
tHalHandle hHal,
void (*enterWowlCallbackRoutine) (void *callbackContext, eHalStatus status),
void *enterWowlCallbackContext,
#ifdef WLAN_WAKEUP_EVENTS
void (*wakeReasonIndCB) (void *callbackContext, tpSirWakeReasonInd pWakeReasonInd),
void *wakeReasonIndCBContext,
#endif // WLAN_WAKEUP_EVENTS
tpSirSmeWowlEnterParams wowlEnterParams, tANI_U8 sessionId);
extern eHalStatus pmcExitWowl (tHalHandle hHal,
tpSirSmeWowlExitParams wowlExitParams);
extern eHalStatus pmcSetHostOffload (tHalHandle hHal, tpSirHostOffloadReq pRequest,
tANI_U8 sessionId);
/* ---------------------------------------------------------------------------
\fn pmcSetKeepAlive
\brief Set the Keep Alive feature.
\param hHal - The handle returned by macOpen.
\param pRequest - Pointer to the Keep Alive.
\return eHalStatus
eHAL_STATUS_FAILURE Cannot set the keep alive.
eHAL_STATUS_SUCCESS Request accepted.
---------------------------------------------------------------------------*/
extern eHalStatus pmcSetKeepAlive (tHalHandle hHal, tpSirKeepAliveReq pRequest, tANI_U8 sessionId);
extern tANI_BOOLEAN pmcValidateConnectState( tHalHandle hHal );
extern tANI_BOOLEAN pmcAllowImps( tHalHandle hHal );
#ifdef FEATURE_WLAN_SCAN_PNO
/*Pref netw found Cb declaration*/
typedef void(*preferredNetworkFoundIndCallback)(void *callbackContext, tpSirPrefNetworkFoundInd pPrefNetworkFoundInd);
extern eHalStatus pmcSetPreferredNetworkList(tHalHandle hHal, tpSirPNOScanReq pRequest, tANI_U8 sessionId, preferredNetworkFoundIndCallback callbackRoutine, void *callbackContext);
#endif // FEATURE_WLAN_SCAN_PNO
#ifdef WLAN_FEATURE_PACKET_FILTERING
// Packet Coalescing Filter Match Count Callback declaration
typedef void(*FilterMatchCountCallback)(void *callbackContext,
tpSirRcvFltPktMatchRsp pRcvFltPktMatchRsp);
extern eHalStatus pmcGetFilterMatchCount(tHalHandle hHal, FilterMatchCountCallback callbackRoutine,
void *callbackContext, tANI_U8 sessionId);
#endif // WLAN_FEATURE_PACKET_FILTERING
#ifdef WLAN_FEATURE_GTK_OFFLOAD
// GTK Offload Information Callback declaration
typedef void(*GTKOffloadGetInfoCallback)(void *callbackContext, tpSirGtkOffloadGetInfoRspParams pGtkOffloadGetInfoRsp);
/* ---------------------------------------------------------------------------
\fn pmcSetGTKOffload
\brief Set GTK offload feature.
\param hHal - The handle returned by macOpen.
\param pGtkOffload - Pointer to the GTK offload request.
\return eHalStatus
eHAL_STATUS_FAILURE Cannot set the offload.
eHAL_STATUS_SUCCESS Request accepted.
---------------------------------------------------------------------------*/
extern eHalStatus pmcSetGTKOffload (tHalHandle hHal, tpSirGtkOffloadParams pGtkOffload, tANI_U8 sessionId);
/* ---------------------------------------------------------------------------
\fn pmcGetGTKOffload
\brief Get GTK offload information.
\param hHal - The handle returned by macOpen.
\param callbackRoutine - Pointer to the GTK Offload Get Info response callback routine.
\return eHalStatus
eHAL_STATUS_FAILURE Cannot set the offload.
eHAL_STATUS_SUCCESS Request accepted.
---------------------------------------------------------------------------*/
extern eHalStatus pmcGetGTKOffload(tHalHandle hHal,
GTKOffloadGetInfoCallback callbackRoutine,
void *callbackContext, tANI_U8 sessionId);
#endif // WLAN_FEATURE_GTK_OFFLOAD
/* Power Save Offload Changes */
typedef enum eUapsdStatus
{
PMC_UAPSD_DISABLED,
PMC_UAPSD_ENABLED,
PMC_UAPSD_DISABLE_PENDING,
PMC_UAPSD_ENABLE_PENDING
}tUapsdStatus;
/* Power save Check Routine */
typedef tANI_BOOLEAN (*PwrSaveCheckRoutine)(void *checkContext,
tANI_U32 sessionId);
/* Power State Change Indication */
typedef void (*PwrSaveStateChangeIndCb)(void *callbackContext,
tANI_U32 sessionId,
tPmcState pmcState);
/* Full Power Req Callback */
typedef void (*FullPowerReqCb)(void *callbackContext,
tANI_U32 sessionId,
eHalStatus status);
/* Full Power Req Callback */
typedef void (*UapsdStartIndCb)(void *callbackContext,
tANI_U32 sessionId,
eHalStatus status);
eHalStatus pmcOffloadOpen(tHalHandle hHal);
eHalStatus pmcOffloadStart(tHalHandle hHal);
eHalStatus pmcOffloadStop(tHalHandle hHal);
eHalStatus pmcOffloadClose(tHalHandle hHal);
eHalStatus pmcOffloadCleanup(tHalHandle hHal, tANI_U32 sessionId);
eHalStatus pmcOffloadConfigEnablePowerSave(tHalHandle hHal,
tPmcPowerSavingMode psMode);
eHalStatus pmcOffloadConfigDisablePowerSave(tHalHandle hHal,
tPmcPowerSavingMode psMode);
tPmcState pmcOffloadGetPmcState(tHalHandle hHal, tANI_U32 sessionId);
void pmcOffloadMessageProcessor(tHalHandle hHal, tSirSmeRsp *pMsg);
eHalStatus pmcOffloadRegisterPowerSaveCheck(tHalHandle hHal,
tANI_U32 sessionId, PwrSaveCheckRoutine checkRoutine,
void *checkContext);
eHalStatus pmcOffloadDeregisterPowerSaveCheck(tHalHandle hHal,
tANI_U32 sessionId, PwrSaveCheckRoutine checkRoutine);
eHalStatus pmcOffloadRegisterDeviceStateUpdateInd(tHalHandle hHal,
tANI_U32 sessionId, PwrSaveStateChangeIndCb stateChangeCb,
void *callbackContext);
eHalStatus pmcOffloadDeregisterDeviceStateUpdateInd(tHalHandle hHal,
tANI_U32 sessionId, PwrSaveStateChangeIndCb stateChangeCb);
eHalStatus PmcOffloadEnableStaModePowerSave(tHalHandle hHal,
tANI_U32 sessionId);
eHalStatus PmcOffloadDisableStaModePowerSave(tHalHandle hHal,
FullPowerReqCb callback_routine,
void *callback_context,
tANI_U32 sessionId);
eHalStatus pmcOffloadRequestFullPower(tHalHandle hHal, tANI_U32 sessionId,
FullPowerReqCb fullpwrReqCb,void *callbackContext,
tRequestFullPowerReason fullPowerReason);
eHalStatus pmcOffloadStartUapsd(tHalHandle hHal, tANI_U32 sessionId,
UapsdStartIndCb uapsdStartIndCb,
void *callbackContext);
eHalStatus pmcOffloadStopUapsd(tHalHandle hHal, tANI_U32 sessionId);
#ifdef FEATURE_WLAN_TDLS
eHalStatus pmcOffloadSetTdlsProhibitBmpsStatus(tHalHandle hHal,
tANI_U32 sessionId,
v_BOOL_t val);
#endif
tANI_BOOLEAN pmcOffloadIsPowerSaveEnabled (tHalHandle hHal, tANI_U32 sessionId,
tPmcPowerSavingMode psMode);
eHalStatus PmcOffloadEnableDeferredStaModePowerSave(tHalHandle hHal,
tANI_U32 sessionId,
tANI_BOOLEAN isReassoc);
eHalStatus PmcOffloadDisableDeferredStaModePowerSave(tHalHandle hHal,
tANI_U32 sessionId);
#endif