wlan: Implemented ioctl to get beacon miss count.
Implemented ioctl, GETBCNMISSRATE, which provides continuous beacon
miss rate, from firmware.
Change-Id: I596aad1d534e81c534a15bb25cd0d8785c79ae48
CRs-Fixed: 656075.
diff --git a/CORE/WDI/CP/src/wlan_qct_wdi.c b/CORE/WDI/CP/src/wlan_qct_wdi.c
index 3a089b5..9921e5c 100644
--- a/CORE/WDI/CP/src/wlan_qct_wdi.c
+++ b/CORE/WDI/CP/src/wlan_qct_wdi.c
@@ -399,6 +399,8 @@
WDI_ProcessSetMaxTxPowerPerBandReq, /* WDI_SET_MAX_TX_POWER_PER_BAND_REQ*/
WDI_ProcessUpdateChannelParamsReq, /* WDI_UPDATE_CHAN_REQ */
+
+ WDI_ProcessGetBcnMissRateReq, /* WDI_GET_BCN_MISS_RATE_REQ */
/*-------------------------------------------------------------------------
Indications
-------------------------------------------------------------------------*/
@@ -618,9 +620,11 @@
#endif /*FEATURE_WLAN_BATCH_SCAN*/
WDI_ProcessSetMaxTxPowerPerBandRsp, /* WDI_SET_MAX_TX_POWER_PER_BAND_RSP */
- WDI_ProcessUpdateChanRsp, /* WDI_UPDATE_CHAN_RESP */
+ WDI_ProcessUpdateChanRsp, /* WDI_UPDATE_CHAN_RESP */
- WDI_ProcessChannelSwitchRsp_V1, /* WDI_CH_SWITCH_RESP_V1 */
+ WDI_ProcessChannelSwitchRsp_V1, /* WDI_CH_SWITCH_RESP_V1 */
+
+ WDI_ProcessGetBcnMissRateRsp, /*WDI_GET_BCN_MISS_RATE_RSP*/
/*---------------------------------------------------------------------
Indications
@@ -985,6 +989,7 @@
CASE_RETURN_STRING( WDI_HAL_DUMP_CMD_REQ );
CASE_RETURN_STRING( WDI_SHUTDOWN_REQ );
CASE_RETURN_STRING( WDI_SET_POWER_PARAMS_REQ );
+ CASE_RETURN_STRING( WDI_GET_BCN_MISS_RATE_REQ );
CASE_RETURN_STRING( WDI_TRAFFIC_STATS_IND );
CASE_RETURN_STRING( WDI_GET_ROAM_RSSI_REQ );
#ifdef WLAN_FEATURE_11W
@@ -1105,6 +1110,7 @@
CASE_RETURN_STRING( WDI_SET_BATCH_SCAN_RESP);
#endif
CASE_RETURN_STRING( WDI_UPDATE_CHAN_RESP);
+ CASE_RETURN_STRING( WDI_GET_BCN_MISS_RATE_RSP );
default:
return "Unknown WDI MessageId";
}
@@ -6396,7 +6402,6 @@
WDI_ControlBlockType* pWDICtx,
WDI_MainEventType wdiEV,
WDI_EventInfoType* pEventData
-
)
{
WDI_Status wdiStatus;
@@ -23283,6 +23288,8 @@
return WLAN_HAL_UPDATE_CHANNEL_LIST_REQ;
case WDI_CH_SWITCH_REQ_V1:
return WLAN_HAL_CH_SWITCH_V1_REQ;
+ case WDI_GET_BCN_MISS_RATE_REQ:
+ return WLAN_HAL_GET_BCN_MISS_RATE_REQ;
default:
return WLAN_HAL_MSG_MAX;
}
@@ -23548,6 +23555,8 @@
return WDI_UPDATE_CHAN_RESP;
case WLAN_HAL_PRINT_REG_INFO_IND:
return WDI_PRINT_REG_INFO_IND;
+ case WLAN_HAL_GET_BCN_MISS_RATE_RSP:
+ return WDI_GET_BCN_MISS_RATE_RSP;
default:
return eDRIVER_TYPE_MAX;
}
@@ -30120,3 +30129,166 @@
return WDI_STATUS_SUCCESS;
}
+
+/*
+ * FUNCTION: WDI_ProcessGetBcnMissRateRsp
+ * send the response to PE with beacon miss count
+ * received from WDI.
+ */
+WDI_Status
+WDI_ProcessGetBcnMissRateRsp
+(
+ WDI_ControlBlockType* pWDICtx,
+ WDI_EventInfoType* pEventData
+)
+{
+ WDI_GetBcnMissRateCb wdiGetBcnMissRateCb;
+ tpHalBcnMissRateRspParams pHalBcnMissRateRsp;
+
+ WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_INFO,
+ "In %s",__func__);
+ /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+
+ /*-------------------------------------------------------------------------
+ Sanity check
+ -------------------------------------------------------------------------*/
+ if (( NULL == pWDICtx ) || ( NULL == pEventData ) ||
+ ( NULL == pEventData->pEventData))
+ {
+ WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
+ "%s: Invalid parameters", __func__);
+ WDI_ASSERT(0);
+ return WDI_STATUS_E_FAILURE;
+ }
+
+ pHalBcnMissRateRsp = (tHalBcnMissRateRspParams *)pEventData->pEventData;
+ wdiGetBcnMissRateCb = (WDI_GetBcnMissRateCb)pWDICtx->pfncRspCB;
+
+ /*Notify UMAC*/
+ wdiGetBcnMissRateCb(pHalBcnMissRateRsp->status,
+ pHalBcnMissRateRsp->bcnMissCnt, pWDICtx->pRspCBUserData);
+ return WDI_STATUS_SUCCESS;
+}
+
+/*
+ * FUNCTION: WDI_ProcessGetBcnMissRateReq
+ * Request to WDI to get missed beacon rate.
+ */
+WDI_Status
+WDI_ProcessGetBcnMissRateReq
+(
+ WDI_ControlBlockType* pWDICtx,
+ WDI_EventInfoType* pEventData
+)
+{
+ wpt_uint8* pSendBuffer = NULL;
+ wpt_uint16 usDataOffset = 0;
+ wpt_uint16 usSendSize = 0;
+ wpt_uint8 ucCurrentBSSSesIdx = 0;
+ WDI_BSSSessionType* pBSSSes = NULL;
+ wpt_macAddr macBSSID;
+ WDI_GetBcnMissRateCb *wdiGetBcnMissRateCb;
+ tHalBcnMissRateReqParams halBcnMissRateReq;
+
+/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+
+ /*-------------------------------------------------------------------------
+ Sanity check
+ -------------------------------------------------------------------------*/
+ if (( NULL == pEventData ) || ( NULL == pEventData->pEventData) ||
+ ( NULL == pEventData->pCBfnc ) )
+ {
+ WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
+ "%s: Invalid parameters", __func__);
+ WDI_ASSERT(0);
+ return WDI_STATUS_E_FAILURE;
+ }
+
+ wdiGetBcnMissRateCb = (WDI_GetBcnMissRateCb *)pEventData->pCBfnc;
+
+ wpalMutexAcquire(&pWDICtx->wptMutex);
+
+ ucCurrentBSSSesIdx = WDI_FindAssocSession(pWDICtx,
+ pEventData->pEventData, &pBSSSes);
+ if ( NULL == pBSSSes )
+ {
+ WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_ERROR,
+ "%s: Association sequence for this BSS does not yet exist. macBSSID"
+ MAC_ADDRESS_STR, __func__, MAC_ADDR_ARRAY(macBSSID));
+ wpalMutexRelease(&pWDICtx->wptMutex);
+ return WDI_STATUS_E_NOT_ALLOWED;
+ }
+ wpalMutexRelease(&pWDICtx->wptMutex);
+
+ /*-----------------------------------------------------------------------
+ Get message buffer
+ -----------------------------------------------------------------------*/
+ if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer(
+ pWDICtx, WDI_GET_BCN_MISS_RATE_REQ,
+ sizeof(tHalBcnMissRateReqParams),
+ &pSendBuffer, &usDataOffset, &usSendSize)) ||
+ ( usSendSize < (usDataOffset + sizeof(tHalBcnMissRateReqParams))))
+ {
+ WPAL_TRACE(eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
+ "Unable to get send buffer in get WDI_GET_BCN_MISS_RATE_REQ %p",
+ pEventData);
+ WDI_ASSERT(0);
+ return WDI_STATUS_E_FAILURE;
+ }
+
+ pWDICtx->wdiReqStatusCB = NULL;
+ pWDICtx->pReqStatusUserData = pEventData->pUserData;
+
+ halBcnMissRateReq.bssIdx = ucCurrentBSSSesIdx;
+
+ wpalMemoryCopy( pSendBuffer+usDataOffset,
+ &halBcnMissRateReq,
+ sizeof(tHalBcnMissRateReqParams));
+ /*-------------------------------------------------------------------------
+ Send Get STA Request to HAL
+ -------------------------------------------------------------------------*/
+ return WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize, wdiGetBcnMissRateCb,
+ pEventData->pUserData, WDI_GET_BCN_MISS_RATE_RSP);
+}
+
+/**
+ @brief WDI_GetBcnMissRate
+
+ @param pUserData: user data will be passed back with the
+ callback
+ WDI_GetBcnMissRateCb: callback for passing back the response
+ of the get stats operation received from the device
+ bssid: bssid, to send bssIdx to FW
+
+ @return SUCCESS or FAIL
+*/
+WDI_Status WDI_GetBcnMissRate( void *pUserData,
+ WDI_GetBcnMissRateCb wdiGetBcnMissRateCb,
+ tANI_U8 *bssid )
+{
+ WDI_EventInfoType wdiEventData;
+
+ /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+
+ /*------------------------------------------------------------------------
+ Sanity Check
+ ------------------------------------------------------------------------*/
+ if ( eWLAN_PAL_FALSE == gWDIInitialized )
+ {
+ WPAL_TRACE(eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_ERROR,
+ "WDI API call before module is initialized - Fail request");
+
+ return WDI_STATUS_E_NOT_ALLOWED;
+ }
+
+ /*------------------------------------------------------------------------
+ Fill in Event data and post to the Main FSM
+ ------------------------------------------------------------------------*/
+ wdiEventData.wdiRequest = WDI_GET_BCN_MISS_RATE_REQ;
+ wdiEventData.pEventData = bssid;
+ wdiEventData.uEventDataSize = sizeof(tSirMacAddr);
+ wdiEventData.pCBfnc = wdiGetBcnMissRateCb;
+ wdiEventData.pUserData = pUserData;
+
+ return WDI_PostMainEvent(&gWDICb, WDI_REQUEST_EVENT, &wdiEventData);
+}