summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRajesh Chauhan <rajeshc@qca.qualcomm.com>2014-01-13 23:54:09 -0800
committerPrakash Dhavali <pdhavali@qca.qualcomm.com>2014-01-29 12:06:34 -0800
commitd4374b528cda4ed79f1da5d5e09ab0f415f36538 (patch)
tree755c599ebceccbb97747d0031a51b872690b0dbd
parentf714bec17c141885736c4b503f6ab75b867c45e2 (diff)
qcacld: fix issues in oem capability ioctl and oem data req/resp
Fixed issue in oem capability ioctl. Moved this ioctl as a sub-ioctl under id 5. Fixed issue in oem data request and response such that in case when there is no response from target then pending command gets cleared from SME and PE. CRs-Fixed: 599897 Change-Id: I105ae81232d7f04761fb9148fa3aac65cd9c636e
-rw-r--r--CORE/HDD/inc/wlan_hdd_oemdata.h14
-rw-r--r--CORE/HDD/src/wlan_hdd_oemdata.c42
-rw-r--r--CORE/HDD/src/wlan_hdd_wext.c37
-rw-r--r--CORE/SERVICES/COMMON/wmi_unified.h5
-rw-r--r--CORE/SERVICES/WMA/wma.c34
-rw-r--r--CORE/SME/inc/oemDataApi.h5
-rw-r--r--CORE/SME/inc/sme_Api.h2
-rw-r--r--CORE/SME/src/oemData/oemDataApi.c22
-rw-r--r--CORE/SME/src/sme_common/sme_Api.c19
9 files changed, 116 insertions, 64 deletions
diff --git a/CORE/HDD/inc/wlan_hdd_oemdata.h b/CORE/HDD/inc/wlan_hdd_oemdata.h
index 4b7a46782dcd..2bc38737e9f3 100644
--- a/CORE/HDD/inc/wlan_hdd_oemdata.h
+++ b/CORE/HDD/inc/wlan_hdd_oemdata.h
@@ -61,6 +61,8 @@
#define OEM_TARGET_SIGNATURE_LEN 8
#define OEM_TARGET_SIGNATURE "QUALCOMM"
+#define OEM_CAP_MAX_NUM_CHANNELS 128
+
typedef enum
{
/* Error null context */
@@ -87,7 +89,7 @@ int oem_activate_service(void *pAdapter);
int iw_get_oem_data_cap(struct net_device *dev, struct iw_request_info *info,
union iwreq_data *wrqu, char *extra);
-typedef struct sDriverVersion
+typedef PACKED_PRE struct PACKED_POST
{
tANI_U8 major;
tANI_U8 minor;
@@ -95,7 +97,7 @@ typedef struct sDriverVersion
tANI_U8 build;
} tDriverVersion;
-struct iw_oem_data_cap
+typedef PACKED_PRE struct PACKED_POST
{
/* Signature of chipset vendor, e.g. QUALCOMM */
tANI_U8 oem_target_signature[OEM_TARGET_SIGNATURE_LEN];
@@ -106,10 +108,10 @@ struct iw_oem_data_cap
tANI_U16 allowed_dwell_time_max; /* Channel dwell time - allowed max */
tANI_U16 curr_dwell_time_min; /* Channel dwell time - current min */
tANI_U16 curr_dwell_time_max; /* Channel dwell time - current max */
- tANI_U8 supported_bands; /* 2.4G or 5G Hz */
- tANI_U8 num_channels; /* Num of channels IDs to follow */
- tANI_U8 *channel_list; /* List of channel IDs */
-};
+ tANI_U16 supported_bands; /* 2.4G or 5G Hz */
+ tANI_U16 num_channels; /* Num of channels IDs to follow */
+ tANI_U8 channel_list[OEM_CAP_MAX_NUM_CHANNELS]; /* List of channel IDs */
+} t_iw_oem_data_cap;
#endif /* QCA_WIFI_2_0 */
struct iw_oem_data_req
diff --git a/CORE/HDD/src/wlan_hdd_oemdata.c b/CORE/HDD/src/wlan_hdd_oemdata.c
index ea587a5e42ae..ac0a9a2b7632 100644
--- a/CORE/HDD/src/wlan_hdd_oemdata.c
+++ b/CORE/HDD/src/wlan_hdd_oemdata.c
@@ -251,7 +251,7 @@ static int oem_msg_callback(struct sk_buff *skb);
and Response.
\param - dev - Pointer to the net device
- - info - Pointer to the iw_oem_data_cap
+ - info - Pointer to the t_iw_oem_data_cap
- wrqu - Pointer to the iwreq data
- extra - Pointer to the data
@@ -265,11 +265,14 @@ int iw_get_oem_data_cap(
char *extra)
{
eHalStatus status = eHAL_STATUS_SUCCESS;
- struct iw_oem_data_cap oemDataCap;
- struct iw_oem_data_cap *pHddOemDataCap;
+ t_iw_oem_data_cap oemDataCap;
+ t_iw_oem_data_cap *pHddOemDataCap;
hdd_adapter_t *pAdapter = (netdev_priv(dev));
hdd_context_t *pHddContext;
hdd_config_t *pConfig;
+ tANI_U32 numChannels;
+ tANI_U8 chanList[OEM_CAP_MAX_NUM_CHANNELS];
+ tANI_U32 i;
ENTER();
@@ -305,6 +308,7 @@ int iw_get_oem_data_cap(
do
{
+ vos_mem_zero(&oemDataCap, sizeof(oemDataCap));
strlcpy(oemDataCap.oem_target_signature, OEM_TARGET_SIGNATURE,
OEM_TARGET_SIGNATURE_LEN);
oemDataCap.oem_target_type = pHddContext->target_type;
@@ -321,19 +325,37 @@ int iw_get_oem_data_cap(
sme_getNeighborScanMaxChanTime(pHddContext->hHal);
oemDataCap.supported_bands = pConfig->nBandCapability;
- status = sme_getValidChannelList(pHddContext->hHal,
- &oemDataCap.num_channels,
- &oemDataCap.channel_list);
- if (eHAL_STATUS_SUCCESS == status)
+ /* request for max num of channels */
+ numChannels = WNI_CFG_VALID_CHANNEL_LIST_LEN;
+ status = sme_GetCfgValidChannels(pHddContext->hHal,
+ &chanList[0],
+ &numChannels);
+ if (eHAL_STATUS_SUCCESS != status)
{
VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
"%s:failed to get valid channel list", __func__);
return -ENOENT;
}
+ else
+ {
+ /* make sure num channels is not more than chan list array */
+ if (numChannels > OEM_CAP_MAX_NUM_CHANNELS)
+ {
+ VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
+ "%s:Num of channels(%d) more than length(%d) of chanlist",
+ __func__, numChannels, OEM_CAP_MAX_NUM_CHANNELS);
+ return -ENOMEM;
+ }
+
+ oemDataCap.num_channels = numChannels;
+ for (i = 0; i < numChannels; i++)
+ {
+ oemDataCap.channel_list[i] = chanList[i];
+ }
+ }
- pHddOemDataCap = (struct iw_oem_data_cap *)(extra);
- vos_mem_copy(pHddOemDataCap, &oemDataCap,
- sizeof(struct iw_oem_data_cap));
+ pHddOemDataCap = (t_iw_oem_data_cap *)(extra);
+ vos_mem_copy(pHddOemDataCap, &oemDataCap, sizeof(*pHddOemDataCap));
} while(0);
EXIT();
diff --git a/CORE/HDD/src/wlan_hdd_wext.c b/CORE/HDD/src/wlan_hdd_wext.c
index 324405e0ee8e..910b9b983965 100644
--- a/CORE/HDD/src/wlan_hdd_wext.c
+++ b/CORE/HDD/src/wlan_hdd_wext.c
@@ -325,6 +325,9 @@ static const hdd_freq_chan_map_t freq_chan_map[] = { {2412, 1}, {2417, 2},
#define WE_GET_STATES 10
#ifdef QCA_WIFI_2_0
#define WE_GET_PHYMODE 12
+#ifdef FEATURE_OEM_DATA_SUPPORT
+#define WE_GET_OEM_DATA_CAP 13
+#endif
#endif
/* Private ioctls and their sub-ioctls */
@@ -426,12 +429,7 @@ static const hdd_freq_chan_map_t freq_chan_map[] = { {2412, 1}, {2417, 2},
/* Private ioctl to trigger reassociation */
#define WLAN_SET_POWER_PARAMS (SIOCIWFIRSTPRIV + 29)
-#ifdef FEATURE_OEM_DATA_SUPPORT
-#ifdef QCA_WIFI_2_0
-/* Private ioctl to get capability information for OEM Data Request/Response */
-#define WLAN_PRIV_GET_OEM_DATA_CAP (SIOCIWFIRSTPRIV + 30)
-#endif
-#endif
+
#define WLAN_GET_LINK_SPEED (SIOCIWFIRSTPRIV + 31)
/* Private ioctls and their sub-ioctls */
@@ -6647,6 +6645,13 @@ static int iw_get_char_setnone(struct net_device *dev, struct iw_request_info *i
wrqu->data.length = strlen(extra)+1;
break;
}
+
+#ifdef FEATURE_OEM_DATA_SUPPORT
+ case WE_GET_OEM_DATA_CAP:
+ {
+ return iw_get_oem_data_cap(dev, info, wrqu, extra);
+ }
+#endif /* FEATURE_OEM_DATA_SUPPORT */
#endif
default:
{
@@ -9295,11 +9300,6 @@ static const iw_handler we_private[] = {
[WLAN_PRIV_SET_MCBC_FILTER - SIOCIWFIRSTPRIV] = iw_set_dynamic_mcbc_filter,
[WLAN_PRIV_CLEAR_MCBC_FILTER - SIOCIWFIRSTPRIV] = iw_clear_dynamic_mcbc_filter,
[WLAN_SET_POWER_PARAMS - SIOCIWFIRSTPRIV] = iw_set_power_params_priv,
-#ifdef FEATURE_OEM_DATA_SUPPORT
-#ifdef QCA_WIFI_2_0
- [WLAN_PRIV_GET_OEM_DATA_CAP - SIOCIWFIRSTPRIV] = iw_get_oem_data_cap,
-#endif
-#endif
[WLAN_GET_LINK_SPEED - SIOCIWFIRSTPRIV] = iw_get_linkspeed,
[WLAN_PRIV_SET_TWO_INT_GET_NONE - SIOCIWFIRSTPRIV] = iw_set_two_ints_getnone,
};
@@ -10078,6 +10078,12 @@ static const struct iw_priv_args we_private_args[] = {
0,
IW_PRIV_TYPE_CHAR| WE_MAX_STR_LEN,
"getphymode" },
+#ifdef FEATURE_OEM_DATA_SUPPORT
+ { WE_GET_OEM_DATA_CAP,
+ 0,
+ IW_PRIV_TYPE_CHAR| WE_MAX_STR_LEN,
+ "getOemDataCap" },
+#endif /* FEATURE_OEM_DATA_SUPPORT */
#endif
/* handlers for main ioctl */
@@ -10315,15 +10321,6 @@ static const struct iw_priv_args we_private_args[] = {
IW_PRIV_TYPE_CHAR| WE_MAX_STR_LEN,
0,
"setpowerparams" },
-#ifdef FEATURE_OEM_DATA_SUPPORT
-#ifdef QCA_WIFI_2_0
- {
- WLAN_PRIV_GET_OEM_DATA_CAP,
- 0,
- IW_PRIV_TYPE_BYTE | sizeof(struct iw_oem_data_cap),
- "getOemDataCap" },
-#endif
-#endif
{
WLAN_GET_LINK_SPEED,
IW_PRIV_TYPE_CHAR | 18,
diff --git a/CORE/SERVICES/COMMON/wmi_unified.h b/CORE/SERVICES/COMMON/wmi_unified.h
index b6768ee7ddc1..d6fa7f374c0d 100644
--- a/CORE/SERVICES/COMMON/wmi_unified.h
+++ b/CORE/SERVICES/COMMON/wmi_unified.h
@@ -777,6 +777,11 @@ typedef enum {
#define WMI_OEM_MEASUREMENT_RSP 0x04
#define WMI_OEM_ERROR_REPORT_RSP 0x05
+/* below message subtype is internal to CLD. Target should
+ * never use internal response type
+ */
+#define WMI_OEM_INTERNAL_RSP 0xdeadbeef
+
#define WMI_CHAN_LIST_TAG 0x1
#define WMI_SSID_LIST_TAG 0x2
#define WMI_BSSID_LIST_TAG 0x3
diff --git a/CORE/SERVICES/WMA/wma.c b/CORE/SERVICES/WMA/wma.c
index a072c15b6754..10cbeba69c2e 100644
--- a/CORE/SERVICES/WMA/wma.c
+++ b/CORE/SERVICES/WMA/wma.c
@@ -1758,7 +1758,7 @@ static int wma_oem_measurement_report_event_callback(void *handle,
WMA_LOGI("%s: Sending WDA_START_OEM_DATA_RSP, data len (%d)",
__func__, datalen);
- wma_send_msg(wma, WDA_START_OEM_DATA_RSP, (void *)data, 0);
+ wma_send_msg(wma, WDA_START_OEM_DATA_RSP, (void *)pStartOemDataRsp, 0);
return 0;
}
@@ -1810,7 +1810,7 @@ static int wma_oem_error_report_event_callback(void *handle,
WMA_LOGI("%s: Sending WDA_START_OEM_DATA_RSP, data len (%d)",
__func__, datalen);
- wma_send_msg(wma, WDA_START_OEM_DATA_RSP, (void *)data, 0);
+ wma_send_msg(wma, WDA_START_OEM_DATA_RSP, (void *)pStartOemDataRsp, 0);
return 0;
}
#endif /* FEATURE_OEM_DATA_SUPPORT */
@@ -11990,12 +11990,14 @@ static void wma_start_oem_data_req(tp_wma_handle wma_handle,
wmi_buf_t buf;
u_int8_t *cmd;
int ret = 0;
+ u_int32_t *msg_subtype;
+ tStartOemDataRsp *pStartOemDataRsp;
WMA_LOGD("%s: Send OEM Data Request to target", __func__);
if (!startOemDataReq) {
WMA_LOGE("%s: startOemDataReq is null", __func__);
- return;
+ goto out;
}
if (!wma_handle || !wma_handle->wmi_handle) {
@@ -12007,7 +12009,7 @@ static void wma_start_oem_data_req(tp_wma_handle wma_handle,
(OEM_DATA_REQ_SIZE + WMI_TLV_HDR_SIZE));
if (!buf) {
WMA_LOGE("%s:wmi_buf_alloc failed", __func__);
- return;
+ goto out;
}
cmd = (u_int8_t *)wmi_buf_data(buf);
@@ -12028,9 +12030,31 @@ static void wma_start_oem_data_req(tp_wma_handle wma_handle,
if (ret != EOK) {
WMA_LOGE("%s:wmi cmd send failed", __func__);
adf_nbuf_free(buf);
- return;
}
+out:
+ /* Now send data resp back to PE/SME with message sub-type of
+ * WMI_OEM_INTERNAL_RSP. This is required so that PE/SME clears
+ * up pending active command. Later when desired oem response(s)
+ * comes as wmi event from target then those shall be passed
+ * to oem application
+ */
+ pStartOemDataRsp = vos_mem_malloc(sizeof(*pStartOemDataRsp));
+ if (!pStartOemDataRsp)
+ {
+ WMA_LOGE("%s:failed to allocate memory for OEM Data Resp to PE",
+ __func__);
+ return;
+ }
+ vos_mem_zero(pStartOemDataRsp, sizeof(tStartOemDataRsp));
+ msg_subtype = (u_int32_t *)(&pStartOemDataRsp->oemDataRsp[0]);
+ *msg_subtype = WMI_OEM_INTERNAL_RSP;
+
+ WMA_LOGI("%s: Sending WDA_START_OEM_DATA_RSP to clear up PE/SME pending cmd",
+ __func__);
+
+ wma_send_msg(wma_handle, WDA_START_OEM_DATA_RSP, (void *)pStartOemDataRsp, 0);
+
return;
}
#endif /* FEATURE_OEM_DATA_SUPPORT */
diff --git a/CORE/SME/inc/oemDataApi.h b/CORE/SME/inc/oemDataApi.h
index a2446dcdb439..a89191a9582b 100644
--- a/CORE/SME/inc/oemDataApi.h
+++ b/CORE/SME/inc/oemDataApi.h
@@ -58,6 +58,11 @@
#endif
#endif
+#ifdef QCA_WIFI_2_0
+/* message subtype for internal purpose */
+#define OEM_MESSAGE_SUBTYPE_INTERNAL 0xdeadbeef
+#endif
+
/*************************************************************************************************************
OEM DATA REQ/RSP - DATA STRUCTURES
*************************************************************************************************************/
diff --git a/CORE/SME/inc/sme_Api.h b/CORE/SME/inc/sme_Api.h
index c51d79e77084..73bea8197c1f 100644
--- a/CORE/SME/inc/sme_Api.h
+++ b/CORE/SME/inc/sme_Api.h
@@ -3289,8 +3289,6 @@ ePhyChanBondState sme_GetCBPhyStateFromCBIniValue(tANI_U32 cb_ini_value);
int sme_UpdateHTConfig(tHalHandle hHal, tANI_U8 sessionId, tANI_U16 htCapab,
int value);
tANI_S16 sme_GetHTConfig(tHalHandle hHal, tANI_U8 session_id, tANI_U16 ht_capab);
-eHalStatus sme_getValidChannelList(tHalHandle hHal, tANI_U8 *numChannels,
- tANI_U8 **chanList);
#ifdef FEATURE_WLAN_SCAN_PNO
eHalStatus sme_MoveCsrToScanStateForPno (tHalHandle hHal, tANI_U8 sessionId);
#endif
diff --git a/CORE/SME/src/oemData/oemDataApi.c b/CORE/SME/src/oemData/oemDataApi.c
index 8d332af60470..1b9c0b0f5c9e 100644
--- a/CORE/SME/src/oemData/oemDataApi.c
+++ b/CORE/SME/src/oemData/oemDataApi.c
@@ -110,8 +110,10 @@ eHalStatus oemData_OemDataReqClose(tHalHandle hHal)
-------------------------------------------------------------------------------*/
void oemData_ReleaseOemDataReqCommand(tpAniSirGlobal pMac, tSmeCmd *pOemDataCmd, eOemDataReqStatus oemDataReqStatus)
{
+#ifndef QCA_WIFI_2_0
//Do the callback
pOemDataCmd->u.oemDataCmd.callback(pMac, pOemDataCmd->u.oemDataCmd.pContext, pOemDataCmd->u.oemDataCmd.oemDataReqID, oemDataReqStatus);
+#endif
//First take this command out of the active list
if(csrLLRemoveEntry(&pMac->sme.smeCmdActiveList, &pOemDataCmd->Link, LL_ACCESS_LOCK))
@@ -291,6 +293,10 @@ eHalStatus sme_HandleOemDataRsp(tHalHandle hHal, tANI_U8* pMsg)
tListElem *pEntry = NULL;
tSmeCmd *pCommand = NULL;
tSirOemDataRsp* pOemDataRsp = NULL;
+#ifdef QCA_WIFI_2_0
+ tANI_U32 *msgSubType;
+#endif
+
pMac = PMAC_STRUCT(hHal);
smsLog(pMac, LOG1, "%s: OEM_DATA Entering", __func__);
@@ -383,8 +389,20 @@ eHalStatus sme_HandleOemDataRsp(tHalHandle hHal, tANI_U8* pMsg)
pOemDataRsp = (tSirOemDataRsp *)pMsg;
- smsLog(pMac, LOG1, "calling send_oem_data_rsp_msg");
- send_oem_data_rsp_msg(sizeof(tOemDataRsp), &pOemDataRsp->oemDataRsp[0]);
+ /* check if message is to be forwarded to oem application or not */
+ msgSubType = (tANI_U32 *) (&pOemDataRsp->oemDataRsp[0]);
+ if (*msgSubType != OEM_MESSAGE_SUBTYPE_INTERNAL)
+ {
+ VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_INFO,
+ "%s: calling send_oem_data_rsp_msg, msgSubType(0x%x)",
+ __func__, *msgSubType);
+ send_oem_data_rsp_msg(sizeof(tOemDataRsp),
+ &pOemDataRsp->oemDataRsp[0]);
+ }
+ else
+ VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_INFO,
+ "%s: received internal oem data resp, msgSubType (0x%x)",
+ __func__, *msgSubType);
#endif /* QCA_WIFI_2_0 */
} while(0);
diff --git a/CORE/SME/src/sme_common/sme_Api.c b/CORE/SME/src/sme_common/sme_Api.c
index d93f7a228829..28cd9257abcf 100644
--- a/CORE/SME/src/sme_common/sme_Api.c
+++ b/CORE/SME/src/sme_common/sme_Api.c
@@ -10939,25 +10939,6 @@ eHalStatus sme_SendRateUpdateInd(tHalHandle hHal, tSirRateUpdateInd *rateUpdateP
return status;
}
-eHalStatus sme_getValidChannelList(tHalHandle hHal, tANI_U8 *numChannels,
- tANI_U8 **chanList)
-{
- tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
- eHalStatus status;
-
- status = sme_AcquireGlobalLock(&pMac->sme);
- if (HAL_STATUS_SUCCESS(status))
- {
- *numChannels =
- pMac->roam.neighborRoamInfo.cfgParams.channelInfo.numOfChannels;
- vos_mem_copy(*chanList,
- &pMac->roam.neighborRoamInfo.cfgParams.channelInfo.ChannelList,
- *numChannels);
- sme_ReleaseGlobalLock(&pMac->sme);
- }
- return status;
-}
-
#ifdef QCA_WIFI_2_0
eHalStatus sme_getChannelInfo(tHalHandle hHal, tANI_U8 chanId,
tSmeChannelInfo *chanInfo)