wlan: Add support to fetch currently used antenna using ioctl
Add provision to fetch currently used antenna index with
an ioctl.
Change-Id: If46ca874138da690cc4a74bd980ac1e693f3686a
CRs-Fixed: 951762
diff --git a/CORE/HDD/inc/wlan_hdd_main.h b/CORE/HDD/inc/wlan_hdd_main.h
index 9b155ee..54ab3e1 100644
--- a/CORE/HDD/inc/wlan_hdd_main.h
+++ b/CORE/HDD/inc/wlan_hdd_main.h
@@ -295,7 +295,7 @@
#define FW_STATS_CONTEXT_MAGIC 0x5022474E //FW STATS
#define GET_FRAME_LOG_MAGIC 0x464c4f47 //FLOG
#define MON_MODE_MSG_MAGIC 0x51436B3A //MON_MODE
-
+#define ANTENNA_CONTEXT_MAGIC 0x414E544E //ANTN
#define MON_MODE_MSG_TIMEOUT 5000
#define MON_MODE_START 1
#define MON_MODE_STOP 0
@@ -1166,6 +1166,9 @@
/* Wireless statistics */
struct iw_statistics iwStats;
+
+ /* Currently used antenna Index*/
+ int antennaIndex;
};
#define WLAN_HDD_GET_STATION_CTX_PTR(pAdapter) (&(pAdapter)->sessionCtx.station)
diff --git a/CORE/HDD/src/wlan_hdd_wext.c b/CORE/HDD/src/wlan_hdd_wext.c
index 54dfe69..7375f4d 100644
--- a/CORE/HDD/src/wlan_hdd_wext.c
+++ b/CORE/HDD/src/wlan_hdd_wext.c
@@ -186,6 +186,7 @@
#define WE_GET_SAP_AUTO_CHANNEL_SELECTION 8
#define WE_GET_CONCURRENCY_MODE 9
#define WE_GET_SCAN_BAND_PREFERENCE 10
+#define WE_GET_ANTENA_DIVERSITY_SELECTION 11
/* Private ioctls and their sub-ioctls */
#define WLAN_PRIV_SET_INT_GET_INT (SIOCIWFIRSTPRIV + 2)
@@ -6319,6 +6320,113 @@
return ret;
}
+static void hdd_GetCurrentAntennaIndex(int antennaId, void *pContext)
+{
+ struct statsContext *context;
+ hdd_adapter_t *pAdapter;
+
+ if (NULL == pContext)
+ {
+ hddLog(VOS_TRACE_LEVEL_ERROR,
+ "%s: Bad param, pContext [%p]",
+ __func__, pContext);
+ return;
+ }
+
+ context = pContext;
+ pAdapter = context->pAdapter;
+
+ spin_lock(&hdd_context_lock);
+
+ if ((NULL == pAdapter) || (ANTENNA_CONTEXT_MAGIC != context->magic))
+ {
+ /* the caller presumably timed out so there is nothing we can do */
+ spin_unlock(&hdd_context_lock);
+ hddLog(VOS_TRACE_LEVEL_WARN,
+ "%s: Invalid context, pAdapter [%p] magic [%08x]",
+ __func__, pAdapter, context->magic);
+ return;
+ }
+
+ context->magic = 0;
+ pAdapter->antennaIndex = antennaId;
+
+ complete(&context->completion);
+ spin_unlock(&hdd_context_lock);
+}
+
+static VOS_STATUS wlan_hdd_get_current_antenna_index(hdd_adapter_t *pAdapter,
+ int *antennaIndex)
+{
+ hdd_context_t *pHddCtx;
+ eHalStatus halStatus;
+ struct statsContext context;
+ long lrc;
+
+ ENTER();
+ if (NULL == pAdapter)
+ {
+ hddLog(VOS_TRACE_LEVEL_WARN,
+ "%s: Invalid context, pAdapter", __func__);
+ return VOS_STATUS_E_FAULT;
+ }
+ pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
+ if (0 != (wlan_hdd_validate_context(pHddCtx)))
+ {
+ return VOS_STATUS_E_FAULT;
+ }
+ if (TRUE != sme_IsFeatureSupportedByFW(ANTENNA_DIVERSITY_SELECTION))
+ {
+ hddLog(VOS_TRACE_LEVEL_ERROR,
+ "%s: ANTENNA_DIVERSITY_SELECTION is not supported by Firwmare",
+ __func__);
+ return VOS_STATUS_E_NOSUPPORT;
+ }
+ init_completion(&context.completion);
+ context.pAdapter = pAdapter;
+ context.magic = ANTENNA_CONTEXT_MAGIC;
+
+ halStatus = sme_GetCurrentAntennaIndex(pHddCtx->hHal,
+ hdd_GetCurrentAntennaIndex,
+ &context, pAdapter->sessionId);
+ if (eHAL_STATUS_SUCCESS != halStatus)
+ {
+ spin_lock(&hdd_context_lock);
+ context.magic = 0;
+ spin_unlock(&hdd_context_lock);
+ hddLog(VOS_TRACE_LEVEL_ERROR,"%s: Unable to retrieve Antenna Index",
+ __func__);
+ /* we'll returned a cached value below */
+ *antennaIndex = -1;
+ return VOS_STATUS_E_FAILURE;
+ }
+ else
+ {
+ /* request was sent -- wait for the response */
+ lrc = wait_for_completion_interruptible_timeout(&context.completion,
+ msecs_to_jiffies(WLAN_WAIT_TIME_STATS));
+ if (lrc <= 0)
+ {
+ spin_lock(&hdd_context_lock);
+ context.magic = 0;
+ spin_unlock(&hdd_context_lock);
+ hddLog(VOS_TRACE_LEVEL_ERROR, "%s:SME %s while retrieving Antenna"
+ " Index",
+ __func__, (0 == lrc) ? "timeout" : "interrupt");
+ *antennaIndex = -1;
+ return VOS_STATUS_E_FAILURE;
+ }
+ }
+ spin_lock(&hdd_context_lock);
+ context.magic = 0;
+ spin_unlock(&hdd_context_lock);
+
+ *antennaIndex = pAdapter->antennaIndex;
+
+ EXIT();
+ return VOS_STATUS_SUCCESS;
+}
+
/* get param sub-ioctls */
static int __iw_setnone_getint(struct net_device *dev,
struct iw_request_info *info,
@@ -6454,7 +6562,11 @@
"scanBandPreference = %d\n", *value);
break;
}
-
+ case WE_GET_ANTENA_DIVERSITY_SELECTION:
+ {
+ wlan_hdd_get_current_antenna_index(pAdapter, value);
+ break;
+ }
default:
{
hddLog(LOGE, "Invalid IOCTL get_value command %d ",value[0]);
@@ -10677,6 +10789,11 @@
IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
"get_scan_pref"},
+ { WE_GET_ANTENA_DIVERSITY_SELECTION,
+ 0,
+ IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
+ "getCurAnt"},
+
/* handlers for main ioctl */
{ WLAN_PRIV_SET_CHAR_GET_NONE,
IW_PRIV_TYPE_CHAR| 512,
diff --git a/CORE/MAC/inc/sirApi.h b/CORE/MAC/inc/sirApi.h
index a39069e..105f642 100644
--- a/CORE/MAC/inc/sirApi.h
+++ b/CORE/MAC/inc/sirApi.h
@@ -4788,6 +4788,7 @@
tSirFwStatsResult *fwStatsRsp, void *pContext);
typedef void (*sir_mgmt_frame_ind_callback)(tSirSmeMgmtFrameInd *frame_ind);
+typedef void (*tAntennaDivSelCB)(int antennaId, void *pContext);
/**
* struct sir_sme_mgmt_frame_cb_req - Register a
@@ -4855,6 +4856,26 @@
void *data;
}tSirFWStatsInfo;
+typedef PACKED_PRE struct PACKED_POST
+{
+ tANI_U16 status;
+ tANI_U32 selectedAntennaId;
+ tANI_U32 reserved;
+} tSirAntennaDivSelRsp, *tpSirntennaDivSelRsp;
+
+typedef PACKED_PRE struct PACKED_POST
+{
+ tAntennaDivSelCB callback;
+ void *data;
+ tANI_U32 reserved;
+}tSirAntennaDiversitySelectionReq;
+
+typedef PACKED_PRE struct PACKED_POST
+{
+ tAntennaDivSelCB callback;
+ void *data;
+}tSirAntennaDiversitySelectionInfo;
+
/*---------------------------------------------------------------------------
WLAN_HAL_LL_NOTIFY_STATS
---------------------------------------------------------------------------*/
diff --git a/CORE/MAC/src/include/sirParams.h b/CORE/MAC/src/include/sirParams.h
index 57acd51..f6f08fc 100644
--- a/CORE/MAC/src/include/sirParams.h
+++ b/CORE/MAC/src/include/sirParams.h
@@ -140,6 +140,7 @@
PER_PKT_STATS_SUPPORTED = 58,
EXT_LL_STAT = 60,
WIFI_CONFIG = 61,
+ ANTENNA_DIVERSITY_SELECTION = 62,
//MAX_FEATURE_SUPPORTED = 128
} placeHolderInCapBitmap;
@@ -736,6 +737,7 @@
#define SIR_HAL_WIFI_CONFIG_PARAMS (SIR_HAL_ITC_MSG_TYPES_BEGIN + 280)
#define SIR_HAL_START_OEM_DATA_REQ_IND_NEW (SIR_HAL_ITC_MSG_TYPES_BEGIN + 281)
#define SIR_HAL_START_OEM_DATA_RSP_IND_NEW (SIR_HAL_ITC_MSG_TYPES_BEGIN + 282)
+#define SIR_HAL_ANTENNA_DIVERSITY_SELECTION_REQ (SIR_HAL_ITC_MSG_TYPES_BEGIN + 283)
#define SIR_HAL_MSG_TYPES_END (SIR_HAL_MSG_TYPES_BEGIN + 0x1FF)
// CFG message types
diff --git a/CORE/SME/inc/csrApi.h b/CORE/SME/inc/csrApi.h
index 0579929..c5cd2d1 100644
--- a/CORE/SME/inc/csrApi.h
+++ b/CORE/SME/inc/csrApi.h
@@ -1668,6 +1668,18 @@
---------------------------------------------------------------------------*/
typedef void (*tCsrSnrCallback) (v_S7_t snr, tANI_U32 staId, void *pContext);
+/*---------------------------------------------------------------------------
+ This is the type for a get current antenna callback to be registered with SME
+ for getting cuurently used antenna index
+
+ \param antennaId to be filled by firmware.
+ \param pContext - any user data given at callback registration.
+ \return None
+
+---------------------------------------------------------------------------*/
+typedef void ( *tCsrAntennaIndexCallback) (int antennaId, void *pContext);
+
+
#ifdef WLAN_FEATURE_VOWIFI_11R
eHalStatus csrRoamIssueFTPreauthReq(tHalHandle hHal, tANI_U32 sessionId, tpSirBssDescription pBssDescription);
#endif
diff --git a/CORE/SME/inc/sme_Api.h b/CORE/SME/inc/sme_Api.h
index d43f670..5fe1fa5 100644
--- a/CORE/SME/inc/sme_Api.h
+++ b/CORE/SME/inc/sme_Api.h
@@ -3842,5 +3842,8 @@
eHalStatus sme_set_wificonfig_params(tHalHandle hHal, tSetWifiConfigParams *req);
eHalStatus sme_getRegInfo(tHalHandle hHal, tANI_U8 chanId,
tANI_U32 *regInfo1, tANI_U32 *regInfo2);
+eHalStatus sme_GetCurrentAntennaIndex(tHalHandle hHal,
+ tCsrAntennaIndexCallback callback,
+ void *pContext, tANI_U8 sessionId);
#endif //#if !defined( __SME_API_H )
diff --git a/CORE/SME/src/sme_common/sme_Api.c b/CORE/SME/src/sme_common/sme_Api.c
index 1ebf884..362858f 100644
--- a/CORE/SME/src/sme_common/sme_Api.c
+++ b/CORE/SME/src/sme_common/sme_Api.c
@@ -13692,3 +13692,54 @@
}
return status;
}
+
+eHalStatus sme_GetCurrentAntennaIndex(tHalHandle hHal,
+ tCsrAntennaIndexCallback callback,
+ void *pContext, tANI_U8 sessionId)
+{
+ tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
+ eHalStatus status = eHAL_STATUS_SUCCESS;
+ tSirAntennaDiversitySelectionReq *pMsg;
+ tCsrRoamSession *pSession;
+ VOS_STATUS vosStatus = VOS_STATUS_E_FAILURE;
+ vos_msg_t vosMessage;
+
+ status = sme_AcquireGlobalLock(&pMac->sme);
+ if (HAL_STATUS_SUCCESS(status))
+ {
+ pSession = CSR_GET_SESSION( pMac, sessionId );
+ if (!pSession)
+ {
+ smsLog(pMac, LOGE, FL("session %d not found"), sessionId);
+ sme_ReleaseGlobalLock( &pMac->sme );
+ return eHAL_STATUS_FAILURE;
+ }
+
+ pMsg = (tSirAntennaDiversitySelectionReq*)vos_mem_malloc(sizeof(*pMsg));
+ if (NULL == pMsg)
+ {
+ smsLog(pMac, LOGE, FL("failed to allocated memory"));
+ sme_ReleaseGlobalLock( &pMac->sme );
+ return eHAL_STATUS_FAILURE;
+ }
+ pMsg->callback = callback;
+ pMsg->data = pContext;
+
+ vosMessage.type = WDA_ANTENNA_DIVERSITY_SELECTION_REQ;
+ vosMessage.bodyptr = pMsg;
+ vosMessage.reserved = 0;
+
+ vosStatus = vos_mq_post_message( VOS_MQ_ID_WDA, &vosMessage );
+ if ( !VOS_IS_STATUS_SUCCESS(vosStatus) )
+ {
+ VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_ERROR,
+ "%s: Failed to post message to WDA", __func__);
+ vos_mem_free(pMsg);
+ sme_ReleaseGlobalLock( &pMac->sme );
+ return eHAL_STATUS_FAILURE;
+ }
+ sme_ReleaseGlobalLock( &pMac->sme);
+ return eHAL_STATUS_SUCCESS;
+ }
+ return eHAL_STATUS_FAILURE;
+}
diff --git a/CORE/WDA/inc/wlan_qct_wda.h b/CORE/WDA/inc/wlan_qct_wda.h
index 209c616..ff3ecf6 100644
--- a/CORE/WDA/inc/wlan_qct_wda.h
+++ b/CORE/WDA/inc/wlan_qct_wda.h
@@ -1314,6 +1314,7 @@
#define WDA_WIFI_CONFIG_REQ SIR_HAL_WIFI_CONFIG_PARAMS
+#define WDA_ANTENNA_DIVERSITY_SELECTION_REQ SIR_HAL_ANTENNA_DIVERSITY_SELECTION_REQ
#ifdef FEATURE_OEM_DATA_SUPPORT
#define WDA_START_OEM_DATA_REQ_IND_NEW SIR_HAL_START_OEM_DATA_REQ_IND_NEW
#define WDA_START_OEM_DATA_RSP_IND_NEW SIR_HAL_START_OEM_DATA_RSP_IND_NEW
diff --git a/CORE/WDA/src/wlan_qct_wda.c b/CORE/WDA/src/wlan_qct_wda.c
index 86453c0..ea3a920 100644
--- a/CORE/WDA/src/wlan_qct_wda.c
+++ b/CORE/WDA/src/wlan_qct_wda.c
@@ -282,6 +282,10 @@
VOS_STATUS WDA_ProcessStartOemDataReqIndNew(tWDA_CbContext *pWDA,
tOemDataReqNewConfig *pOemDataReqNewConfig);
+
+v_VOID_t WDA_ProcessAntennaDiversitySelectionReq(tWDA_CbContext *pWDA,
+ tSirAntennaDiversitySelectionReq *pData);
+
/*
* FUNCTION: WDA_ProcessNanRequest
* Process NAN request
@@ -15371,6 +15375,12 @@
break;
}
#endif
+ case WDA_ANTENNA_DIVERSITY_SELECTION_REQ:
+ {
+ WDA_ProcessAntennaDiversitySelectionReq(pWDA,
+ (tSirAntennaDiversitySelectionReq *)pMsg->bodyptr);
+ break;
+ }
default:
{
VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
@@ -20781,5 +20791,94 @@
return status;
}
-#endif
+void WDA_GetCurrentAntennaIndexCallback(WDI_Status status, void *params,
+ void *pUserData)
+{
+ tSirAntennaDiversitySelectionInfo *pAntennaDivSelInfo =
+ (tSirAntennaDiversitySelectionInfo *)pUserData;
+
+ tSirAntennaDivSelRsp *resParams = (tSirAntennaDivSelRsp *)params;
+ VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
+ "<------ %s " ,__func__);
+ if (NULL == pAntennaDivSelInfo)
+ {
+ VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
+ "%s: pWdaParams received NULL", __func__);
+ VOS_ASSERT(0) ;
+ return ;
+ }
+ if (NULL == resParams)
+ {
+ VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
+ "%s: resParams received NULL", __func__);
+ VOS_ASSERT(0) ;
+ return ;
+ }
+
+ if (pAntennaDivSelInfo->callback)
+ {
+ if (WDI_STATUS_SUCCESS == status)
+ {
+ pAntennaDivSelInfo->callback(resParams->selectedAntennaId,
+ pAntennaDivSelInfo->data);
+ }
+ else
+ {
+ pAntennaDivSelInfo->callback(-1,
+ pAntennaDivSelInfo->data);
+ }
+ }
+
+ vos_mem_free(pUserData);
+ return;
+}
+
+/*
+ * FUNCTION: WDA_ProcessAntennaDiversitySelectionReq
+ * Request to WDI.
+ */
+v_VOID_t WDA_ProcessAntennaDiversitySelectionReq(tWDA_CbContext *pWDA,
+ tSirAntennaDiversitySelectionReq *pData)
+{
+ WDI_Status wdiStatus;
+ tSirAntennaDiversitySelectionInfo *pAntennaDivSelInfo;
+
+ VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
+ "------> %s " , __func__);
+
+ pAntennaDivSelInfo = (tSirAntennaDiversitySelectionInfo *)
+ vos_mem_malloc(sizeof(tSirAntennaDiversitySelectionInfo));
+ if (NULL == pAntennaDivSelInfo)
+ {
+ VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
+ "%s: VOS MEM Alloc Failure", __func__);
+ VOS_ASSERT(0);
+ vos_mem_free(pData);
+ return;
+ }
+
+ pAntennaDivSelInfo->callback = (tAntennaDivSelCB)(pData->callback);
+ pAntennaDivSelInfo->data = pData->data;
+
+ wdiStatus = WDI_GetCurrentAntennaIndex(pAntennaDivSelInfo,
+ WDA_GetCurrentAntennaIndexCallback, pData->reserved);
+
+ if (WDI_STATUS_PENDING == wdiStatus)
+ {
+ VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
+ "Pending received for %s:%d ", __func__, __LINE__);
+ }
+ else if (WDI_STATUS_SUCCESS != wdiStatus)
+ {
+ if (pAntennaDivSelInfo->callback)
+ {
+ pAntennaDivSelInfo->callback(-1, pAntennaDivSelInfo->data);
+ }
+ }
+
+ vos_mem_free(pData);
+ return;
+}
+
+#endif
diff --git a/CORE/WDI/CP/inc/wlan_qct_wdi.h b/CORE/WDI/CP/inc/wlan_qct_wdi.h
index ae5c766..c8863f8 100644
--- a/CORE/WDI/CP/inc/wlan_qct_wdi.h
+++ b/CORE/WDI/CP/inc/wlan_qct_wdi.h
@@ -8196,6 +8196,9 @@
typedef void (*WDI_WifiConfigSetRspCb) (WDI_WifconfigSetRsp *wdiRsp, void *pUserData);
+typedef void (*WDI_AntennaDivSelRspCb)(WDI_Status status,
+ void *resp, void *pUserData);
+
/*========================================================================
* Function Declarations and Documentation
==========================================================================*/
@@ -11866,4 +11869,23 @@
WDI_WifiConfigSetRspCb wdiWifiConfigSetRspCb,
void* pUserData);
+/**
+ @brief WDI_GetCurrentAntennaIndex
+ This API is called to send getCurretAntennaIndex request to FW
+
+ @param pUserData: pointer to request params
+ wdiLLStatsSetRspCb : set wificonfig response callback
+ reserved: request parameter
+ @see
+ @return SUCCESS or FAIL
+*/
+WDI_Status
+WDI_GetCurrentAntennaIndex
+(
+ void *pUserData,
+ WDI_AntennaDivSelRspCb wdiAntennaDivSelRspCb,
+ wpt_uint32 reserved
+);
+
+
#endif /* #ifndef WLAN_QCT_WDI_H */
diff --git a/CORE/WDI/CP/inc/wlan_qct_wdi_i.h b/CORE/WDI/CP/inc/wlan_qct_wdi_i.h
index 8dcdf80..db378ef 100644
--- a/CORE/WDI/CP/inc/wlan_qct_wdi_i.h
+++ b/CORE/WDI/CP/inc/wlan_qct_wdi_i.h
@@ -537,7 +537,9 @@
/*Keep adding the indications to the max request
such that we keep them separate */
+ WDI_ANTENNA_DIVERSITY_SELECTION_REQ,
WDI_MAX_UMAC_IND
+
}WDI_RequestEnumType;
/*---------------------------------------------------------------------------
@@ -922,6 +924,7 @@
WDI_HAL_LOST_LINK_PARAMS_IND = WDI_HAL_IND_MIN + 29,
WDI_HAL_RSSI_BREACHED_IND = WDI_HAL_IND_MIN + 30,
WDI_HAL_START_OEM_DATA_RSP_IND_NEW = WDI_HAL_IND_MIN + 31,
+ WDI_ANTENNA_DIVERSITY_SELECTION_RSP = WDI_HAL_IND_MIN + 32,
WDI_MAX_RESP
}WDI_ResponseEnumType;
@@ -6441,6 +6444,37 @@
);
#endif
+/**
+ @brief Process get current antenna index command
+
+ @param pWDICtx: pointer to the WLAN DAL context
+ pEventData: pointer to the event information structure
+
+ @see
+ @return Result of the function call
+*/
+WDI_Status
+WDI_ProcessGetCurrentAntennaIndex
+(
+ WDI_ControlBlockType* pWDICtx,
+ WDI_EventInfoType* pEventData
+);
+
+/**
+ @brief Process get current antenna index response from FW
+
+ @param pWDICtx: pointer to the WLAN DAL context
+ pEventData: pointer to the event information structure
+
+ @see
+ @return Result of the function call
+*/
+WDI_Status
+WDI_ProcessGetCurrentAntennaIndexRsp
+(
+ WDI_ControlBlockType* pWDICtx,
+ WDI_EventInfoType* pEventData
+);
#endif /*WLAN_QCT_WDI_I_H*/
diff --git a/CORE/WDI/CP/src/wlan_qct_wdi.c b/CORE/WDI/CP/src/wlan_qct_wdi.c
index 908f5e2..2fdc31d 100644
--- a/CORE/WDI/CP/src/wlan_qct_wdi.c
+++ b/CORE/WDI/CP/src/wlan_qct_wdi.c
@@ -218,6 +218,7 @@
,FEATURE_NOT_SUPPORTED
#endif
,WIFI_CONFIG //61
+ ,ANTENNA_DIVERSITY_SELECTION //62
};
/*--------------------------------------------------------------------------
@@ -547,7 +548,7 @@
#else
NULL,
#endif /* FEATURE_OEM_DATA_SUPPORT */
-
+ WDI_ProcessGetCurrentAntennaIndex, /* WDI_ANTENNA_DIVERSITY_SELECTION_REQ */
};
@@ -883,6 +884,7 @@
#else
NULL,
#endif
+ WDI_ProcessGetCurrentAntennaIndexRsp, /* WDI_ANTENNA_DIVERSITY_SELECTION_RSP */
};
@@ -1232,6 +1234,7 @@
CASE_RETURN_STRING( WDI_START_RSSI_MONITOR_REQ );
CASE_RETURN_STRING( WDI_STOP_RSSI_MONITOR_REQ );
CASE_RETURN_STRING( WDI_START_OEM_DATA_REQ_IND_NEW );
+ CASE_RETURN_STRING( WDI_ANTENNA_DIVERSITY_SELECTION_REQ );
default:
return "Unknown WDI MessageId";
}
@@ -1374,6 +1377,7 @@
#ifdef FEATURE_OEM_DATA_SUPPORT
CASE_RETURN_STRING (WDI_HAL_START_OEM_DATA_RSP_IND_NEW);
#endif
+ CASE_RETURN_STRING (WDI_ANTENNA_DIVERSITY_SELECTION_RSP);
default:
return "Unknown WDI MessageId";
}
@@ -1554,7 +1558,12 @@
case RTT3: snprintf(pCapStr, sizeof("RTT3"), "%s", "RTT3");
pCapStr += strlen("RTT3");
break;
-
+ case ANTENNA_DIVERSITY_SELECTION:
+ snprintf(pCapStr,
+ sizeof("ANTENNA_DIVERSITY_SELECTION"), "%s",
+ "ANTENNA_DIVERSITY_SELECTION");
+ pCapStr += strlen("ANTENNA_DIVERSITY_SELECTION");
+ break;
}
*pCapStr++ = ',';
*pCapStr++ = ' ';
@@ -24565,6 +24574,8 @@
return WLAN_HAL_WIFI_CONFIG_SET_PARAMS_REQ;
case WDI_START_OEM_DATA_REQ_IND_NEW:
return WLAN_HAL_START_OEM_DATA_REQ_IND_NEW;
+ case WDI_ANTENNA_DIVERSITY_SELECTION_REQ:
+ return WLAN_HAL_ANTENNA_DIVERSITY_SELECTION_REQ;
default:
return WLAN_HAL_MSG_MAX;
}
@@ -24912,6 +24923,8 @@
case WLAN_HAL_START_OEM_DATA_RSP_IND_NEW:
return WDI_HAL_START_OEM_DATA_RSP_IND_NEW;
#endif /* FEATURE_OEM_DATA_SUPPORT */
+ case WLAN_HAL_ANTENNA_DIVERSITY_SELECTION_RSP:
+ return WDI_ANTENNA_DIVERSITY_SELECTION_RSP;
default:
return eDRIVER_TYPE_MAX;
}
@@ -36656,4 +36669,159 @@
return WDI_STATUS_SUCCESS;
} /* End of WDI_ProcessEXTScanResultInd */
+/**
+ @brief Process Current Antenna Index information from FW
+
+ @param pWDICtx: pointer to the WLAN DAL context
+ pEventData: pointer to the event information structure
+
+ @see
+ @return Result of the function call
+*/
+WDI_Status
+WDI_ProcessGetCurrentAntennaIndexRsp
+(
+ WDI_ControlBlockType* pWDICtx,
+ WDI_EventInfoType* pEventData
+)
+{
+ WDI_AntennaDivSelRspCb wdiGetCurrentAntennaIndexRspCb;
+ tHalAntennaDiversitySelectionRspParams *pHalAntDivSelRsp;
+
+ /*-------------------------------------------------------------------------
+ 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;
+ }
+ pHalAntDivSelRsp =
+ (tHalAntennaDiversitySelectionRspParams*)pEventData->pEventData;
+ wdiGetCurrentAntennaIndexRspCb = (WDI_AntennaDivSelRspCb)pWDICtx->pfncRspCB;
+
+ if (pHalAntDivSelRsp->status != 0)
+ {
+ wdiGetCurrentAntennaIndexRspCb(WDI_STATUS_E_FAILURE,
+ (void *)pHalAntDivSelRsp, pWDICtx->pRspCBUserData);
+ }
+ else
+ {
+ wdiGetCurrentAntennaIndexRspCb(WDI_STATUS_SUCCESS,
+ (void *)pHalAntDivSelRsp,
+ pWDICtx->pRspCBUserData);
+ }
+
+ return WDI_STATUS_SUCCESS;
+}
+
+/**
+ @brief Process Get Current Antenna Index request command
+
+ @param pWDICtx: pointer to the WLAN DAL context
+ pEventData: pointer to the event information structure
+
+ @see
+ @return Result of the function call
+*/
+WDI_Status
+WDI_ProcessGetCurrentAntennaIndex
+(
+ WDI_ControlBlockType* pWDICtx,
+ WDI_EventInfoType* pEventData
+)
+{
+ wpt_uint8* pSendBuffer = NULL;
+ wpt_uint16 usDataOffset = 0;
+ wpt_uint16 usSendSize = 0;
+ tHalAntennaDiversitySelectionReqParams halAntDivSelReq;
+ WDI_AntennaDivSelRspCb wdiGetCurrentAntennaIndexRspCb;
+
+ WPAL_TRACE(eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_INFO,
+ "%s", __func__);
+
+ /*-------------------------------------------------------------------------
+ Sanity check
+ -------------------------------------------------------------------------*/
+ if (( NULL == pEventData ) || ( NULL == pEventData->pEventData ) ||
+ ( NULL == pEventData->pCBfnc ))
+ {
+ WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_FATAL,
+ "%s: Invalid parameters", __func__);
+ WDI_ASSERT(0);
+ return WDI_STATUS_E_FAILURE;
+ }
+ wdiGetCurrentAntennaIndexRspCb = (WDI_AntennaDivSelRspCb)pEventData->pCBfnc;
+
+ if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx,
+ WDI_ANTENNA_DIVERSITY_SELECTION_REQ,
+ sizeof(tHalAntennaDiversitySelectionReqParams),
+ &pSendBuffer, &usDataOffset, &usSendSize))||
+ ( usSendSize < (usDataOffset +
+ sizeof(tHalAntennaDiversitySelectionReqParams) )))
+ {
+ WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_FATAL,
+ "Unable to get send buffer in GetCurrentAntennaIndex %p",
+ pEventData);
+ WDI_ASSERT(0);
+ return WDI_STATUS_E_FAILURE;
+ }
+ pWDICtx->wdiReqStatusCB = NULL;
+ pWDICtx->pReqStatusUserData = pEventData->pEventData;
+ halAntDivSelReq.reserved = *((wpt_uint32 *)(pEventData->pEventData));
+ wpalMemoryCopy( pSendBuffer+usDataOffset,
+ &halAntDivSelReq,
+ sizeof(tHalAntennaDiversitySelectionReqParams));
+
+ /*-------------------------------------------------------------------------
+ Send Get STA Request to HAL
+ -------------------------------------------------------------------------*/
+ return WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize,
+ wdiGetCurrentAntennaIndexRspCb,
+ pEventData->pUserData,
+ WDI_ANTENNA_DIVERSITY_SELECTION_RSP);
+}
+
+/**
+ @brief WDI_GetCurrentAntennaIndex
+
+ @param pOemDataReqNewConfig: Req parameter for the FW
+
+ @return SUCCESS or FAIL
+*/
+WDI_Status
+WDI_GetCurrentAntennaIndex
+(
+ void *pUserData,
+ WDI_AntennaDivSelRspCb wdiAntennaDivSelRspCb,
+ wpt_uint32 reserved
+)
+{
+ 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_ANTENNA_DIVERSITY_SELECTION_REQ;
+ wdiEventData.pEventData = (void *)&reserved;
+ wdiEventData.uEventDataSize = sizeof(wpt_uint32);
+ wdiEventData.pCBfnc = wdiAntennaDivSelRspCb;
+ wdiEventData.pUserData = pUserData;
+
+ return WDI_PostMainEvent(&gWDICb, WDI_REQUEST_EVENT, &wdiEventData);
+}
#endif