prima: extscan: Support for SSID hotlist
Code changes to support SSID hotlist.
Change-Id: Iec3ecd109a454e606f41e12cd2cdffaae9e91b12
CRs-Fixed: 834122
diff --git a/CORE/HDD/src/wlan_hdd_cfg80211.c b/CORE/HDD/src/wlan_hdd_cfg80211.c
index 89dbb1e..83cea54 100644
--- a/CORE/HDD/src/wlan_hdd_cfg80211.c
+++ b/CORE/HDD/src/wlan_hdd_cfg80211.c
@@ -2693,6 +2693,70 @@
return;
}
+static void wlan_hdd_cfg80211_extscan_set_ssid_hotlist_rsp(void *ctx,
+ void *pMsg)
+{
+ hdd_context_t *pHddCtx = (hdd_context_t *)ctx;
+ tpSirEXTScanSetSsidHotListRspParams pData =
+ (tpSirEXTScanSetSsidHotListRspParams) pMsg;
+ struct hdd_ext_scan_context *context;
+
+ if (wlan_hdd_validate_context(pHddCtx)){
+ return;
+ }
+
+ if (!pMsg)
+ {
+ hddLog(VOS_TRACE_LEVEL_ERROR, FL("pMsg is null"));
+ return;
+ }
+
+ hddLog(VOS_TRACE_LEVEL_INFO, "Req Id %u Status %u", pData->requestId,
+ pData->status);
+
+ context = &pHddCtx->ext_scan_context;
+ spin_lock(&hdd_context_lock);
+ if (context->request_id == pData->requestId) {
+ context->response_status = pData->status ? -EINVAL : 0;
+ complete(&context->response_event);
+ }
+ spin_unlock(&hdd_context_lock);
+
+ return;
+}
+
+static void wlan_hdd_cfg80211_extscan_reset_ssid_hotlist_rsp(void *ctx,
+ void *pMsg)
+{
+ hdd_context_t *pHddCtx = (hdd_context_t *)ctx;
+ tpSirEXTScanResetSsidHotlistRspParams pData =
+ (tpSirEXTScanResetSsidHotlistRspParams) pMsg;
+ struct hdd_ext_scan_context *context;
+
+ if (wlan_hdd_validate_context(pHddCtx)) {
+ return;
+ }
+ if (!pMsg)
+ {
+ hddLog(VOS_TRACE_LEVEL_ERROR, FL("pMsg is null"));
+ return;
+ }
+
+ hddLog(VOS_TRACE_LEVEL_INFO, "Req Id %u Status %u", pData->requestId,
+ pData->status);
+
+ context = &pHddCtx->ext_scan_context;
+ spin_lock(&hdd_context_lock);
+ if (context->request_id == pData->requestId) {
+ context->response_status = pData->status ? -EINVAL : 0;
+ complete(&context->response_event);
+ }
+ spin_unlock(&hdd_context_lock);
+
+ return;
+}
+
+
static void wlan_hdd_cfg80211_extscan_cached_results_ind(void *ctx,
void *pMsg)
{
@@ -2992,6 +3056,156 @@
}
+/**
+ * wlan_hdd_cfg80211_extscan_hotlist_ssid_match_ind() -
+ * Handle an SSID hotlist match event
+ * @ctx: HDD context registered with SME
+ * @event: The SSID hotlist match event
+ *
+ * This function will take an SSID match event that was generated by
+ * firmware and will convert it into a cfg80211 vendor event which is
+ * sent to userspace.
+ *
+ * Return: none
+ */
+static void
+wlan_hdd_cfg80211_extscan_hotlist_ssid_match_ind(void *ctx,
+ void *pMsg)
+{
+ hdd_context_t *hdd_ctx = ctx;
+ struct sk_buff *skb;
+ tANI_U32 i, index;
+ tpSirEXTScanSsidHotlistMatch pData = (tpSirEXTScanSsidHotlistMatch) pMsg;
+
+ ENTER();
+
+ if (wlan_hdd_validate_context(hdd_ctx)) {
+ hddLog(LOGE,
+ FL("HDD context is not valid or response"));
+ return;
+ }
+ if (!pMsg)
+ {
+ hddLog(VOS_TRACE_LEVEL_ERROR, FL("pMsg is null"));
+ return;
+ }
+
+ if (pData->ssid_found) {
+ index = QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_HOTLIST_SSID_FOUND_INDEX;
+ hddLog(LOG1, "SSID hotlist found");
+ } else {
+ index = QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_HOTLIST_SSID_LOST_INDEX;
+ hddLog(LOG1, "SSID hotlist lost");
+ }
+
+ skb = cfg80211_vendor_event_alloc(hdd_ctx->wiphy,
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 18, 0))
+ NULL,
+#endif
+ EXTSCAN_EVENT_BUF_SIZE + NLMSG_HDRLEN,
+ index, GFP_KERNEL);
+
+ if (!skb) {
+ hddLog(LOGE, FL("cfg80211_vendor_event_alloc failed"));
+ return;
+ }
+ hddLog(LOG1, "Req Id %u, Num of SSIDs %u, More Data (%u)",
+ pData->requestId, pData->numHotlistSsid, pData->moreData);
+
+ for (i = 0; i < pData->numHotlistSsid; i++) {
+ hddLog(LOG1, "[i=%d] Timestamp %llu "
+ "Ssid: %s "
+ "Bssid (" MAC_ADDRESS_STR ") "
+ "Channel %u "
+ "Rssi %d "
+ "RTT %u "
+ "RTT_SD %u",
+ i,
+ pData->ssidHotlist[i].ts,
+ pData->ssidHotlist[i].ssid,
+ MAC_ADDR_ARRAY(pData->ssidHotlist[i].bssid),
+ pData->ssidHotlist[i].channel,
+ pData->ssidHotlist[i].rssi,
+ pData->ssidHotlist[i].rtt,
+ pData->ssidHotlist[i].rtt_sd);
+ }
+
+ if (nla_put_u32(skb,
+ QCA_WLAN_VENDOR_ATTR_EXTSCAN_RESULTS_REQUEST_ID,
+ pData->requestId) ||
+ nla_put_u32(skb,
+ QCA_WLAN_VENDOR_ATTR_EXTSCAN_RESULTS_NUM_RESULTS_AVAILABLE,
+ pData->numHotlistSsid)) {
+ hddLog(LOGE, FL("put fail"));
+ goto fail;
+ }
+
+ if (pData->numHotlistSsid) {
+ struct nlattr *aps;
+ aps = nla_nest_start(skb,
+ QCA_WLAN_VENDOR_ATTR_EXTSCAN_RESULTS_LIST);
+ if (!aps) {
+ hddLog(LOGE, FL("nest fail"));
+ goto fail;
+ }
+
+ for (i = 0; i < pData->numHotlistSsid; i++) {
+ struct nlattr *ap;
+
+ ap = nla_nest_start(skb, i);
+ if (!ap) {
+ hddLog(LOGE, FL("nest fail"));
+ goto fail;
+ }
+
+ if (nla_put_u64(skb,
+ QCA_WLAN_VENDOR_ATTR_EXTSCAN_RESULTS_SCAN_RESULT_TIME_STAMP,
+ pData->ssidHotlist[i].ts) ||
+ nla_put(skb,
+ QCA_WLAN_VENDOR_ATTR_EXTSCAN_RESULTS_SCAN_RESULT_SSID,
+ sizeof(pData->ssidHotlist[i].ssid),
+ pData->ssidHotlist[i].ssid) ||
+ nla_put(skb,
+ QCA_WLAN_VENDOR_ATTR_EXTSCAN_RESULTS_SCAN_RESULT_BSSID,
+ sizeof(pData->ssidHotlist[i].bssid),
+ pData->ssidHotlist[i].bssid) ||
+ nla_put_u32(skb,
+ QCA_WLAN_VENDOR_ATTR_EXTSCAN_RESULTS_SCAN_RESULT_CHANNEL,
+ pData->ssidHotlist[i].channel) ||
+ nla_put_s32(skb,
+ QCA_WLAN_VENDOR_ATTR_EXTSCAN_RESULTS_SCAN_RESULT_RSSI,
+ pData->ssidHotlist[i].rssi) ||
+ nla_put_u32(skb,
+ QCA_WLAN_VENDOR_ATTR_EXTSCAN_RESULTS_SCAN_RESULT_RTT,
+ pData->ssidHotlist[i].rtt) ||
+ nla_put_u32(skb,
+ QCA_WLAN_VENDOR_ATTR_EXTSCAN_RESULTS_SCAN_RESULT_RTT_SD,
+ pData->ssidHotlist[i].rtt_sd)) {
+ hddLog(LOGE, FL("put fail"));
+ goto fail;
+ }
+ nla_nest_end(skb, ap);
+ }
+ nla_nest_end(skb, aps);
+
+ if (nla_put_u8(skb,
+ QCA_WLAN_VENDOR_ATTR_EXTSCAN_RESULTS_SCAN_RESULT_MORE_DATA,
+ pData->moreData)) {
+ hddLog(LOGE, FL("put fail"));
+ goto fail;
+ }
+ }
+
+ cfg80211_vendor_event(skb, GFP_KERNEL);
+ return;
+
+fail:
+ kfree_skb(skb);
+ return;
+
+}
+
+
static void wlan_hdd_cfg80211_extscan_full_scan_result_event(void *ctx,
void *pMsg)
{
@@ -3243,6 +3457,14 @@
wlan_hdd_cfg80211_extscan_reset_bss_hotlist_rsp(ctx, pMsg);
break;
+ case SIR_HAL_EXTSCAN_SET_SSID_HOTLIST_RSP:
+ wlan_hdd_cfg80211_extscan_set_ssid_hotlist_rsp(ctx, pMsg);
+ break;
+
+ case SIR_HAL_EXTSCAN_RESET_SSID_HOTLIST_RSP:
+ wlan_hdd_cfg80211_extscan_reset_ssid_hotlist_rsp(ctx, pMsg);
+ break;
+
case SIR_HAL_EXTSCAN_GET_CAPABILITIES_RSP:
wlan_hdd_cfg80211_extscan_get_capabilities_rsp(ctx, pMsg);
break;
@@ -3258,6 +3480,9 @@
case SIR_HAL_EXTSCAN_HOTLIST_MATCH_IND:
wlan_hdd_cfg80211_extscan_hotlist_match_ind(ctx, pMsg);
break;
+ case SIR_HAL_EXTSCAN_SSID_HOTLIST_MATCH_IND:
+ wlan_hdd_cfg80211_extscan_hotlist_ssid_match_ind(ctx, pMsg);
+ break;
case SIR_HAL_EXTSCAN_FULL_SCAN_RESULT_IND:
wlan_hdd_cfg80211_extscan_full_scan_result_event(ctx, pMsg);
break;
@@ -3629,6 +3854,355 @@
return ret;
}
+/*
+ * define short names for the global vendor params
+ * used by wlan_hdd_cfg80211_extscan_set_ssid_hotlist()
+ */
+#define PARAM_MAX \
+QCA_WLAN_VENDOR_ATTR_EXTSCAN_SUBCMD_CONFIG_PARAM_MAX
+#define PARAM_REQUEST_ID \
+QCA_WLAN_VENDOR_ATTR_EXTSCAN_SUBCMD_CONFIG_PARAM_REQUEST_ID
+#define PARAMS_LOST_SSID_SAMPLE_SIZE \
+QCA_WLAN_VENDOR_ATTR_EXTSCAN_SSID_HOTLIST_PARAMS_LOST_SSID_SAMPLE_SIZE
+#define PARAMS_NUM_SSID \
+QCA_WLAN_VENDOR_ATTR_EXTSCAN_SSID_HOTLIST_PARAMS_NUM_SSID
+#define THRESHOLD_PARAM \
+QCA_WLAN_VENDOR_ATTR_EXTSCAN_SSID_THRESHOLD_PARAM
+#define PARAM_SSID \
+QCA_WLAN_VENDOR_ATTR_EXTSCAN_SSID_THRESHOLD_PARAM_SSID
+#define PARAM_BAND \
+QCA_WLAN_VENDOR_ATTR_EXTSCAN_SSID_THRESHOLD_PARAM_BAND
+#define PARAM_RSSI_LOW \
+QCA_WLAN_VENDOR_ATTR_EXTSCAN_SSID_THRESHOLD_PARAM_RSSI_LOW
+#define PARAM_RSSI_HIGH \
+QCA_WLAN_VENDOR_ATTR_EXTSCAN_SSID_THRESHOLD_PARAM_RSSI_HIGH
+
+/**
+ * __wlan_hdd_cfg80211_extscan_set_ssid_hotlist() - set ssid hot list
+ * @wiphy: Pointer to wireless phy
+ * @wdev: Pointer to wireless device
+ * @data: Pointer to data
+ * @data_len: Data length
+ *
+ * Return: 0 on success, negative errno on failure
+ */
+static int
+__wlan_hdd_cfg80211_extscan_set_ssid_hotlist(struct wiphy *wiphy,
+ struct wireless_dev *wdev,
+ const void *data,
+ int data_len)
+{
+ tSirEXTScanSetSsidHotListReqParams *request;
+ struct net_device *dev = wdev->netdev;
+ hdd_adapter_t *adapter = WLAN_HDD_GET_PRIV_PTR(dev);
+ hdd_context_t *hdd_ctx = wiphy_priv(wiphy);
+ struct nlattr *tb[PARAM_MAX + 1];
+ struct nlattr *tb2[PARAM_MAX + 1];
+ struct nlattr *ssids;
+ struct hdd_ext_scan_context *context;
+ uint32_t request_id;
+ char ssid_string[SIR_MAC_MAX_SSID_LENGTH + 1] = {'\0'};
+ int ssid_len;
+ eHalStatus status;
+ int i, rem, retval;
+ unsigned long rc;
+
+ ENTER();
+
+ if (VOS_FTM_MODE == hdd_get_conparam()) {
+ hddLog(LOGE, FL("Command not allowed in FTM mode"));
+ return -EINVAL;
+ }
+
+ retval = wlan_hdd_validate_context(hdd_ctx);
+ if (0 != retval) {
+ hddLog(LOGE, FL("HDD context is not valid"));
+ return -EINVAL;
+ }
+
+ /* check the EXTScan Capability */
+ if ( (TRUE != hdd_ctx->cfg_ini->fEnableEXTScan) ||
+ (TRUE != sme_IsFeatureSupportedByFW(EXTENDED_SCAN)))
+ {
+ hddLog(VOS_TRACE_LEVEL_ERROR,
+ FL("EXTScan not enabled/supported by Firmware"));
+ return -EINVAL;
+ }
+
+ if (nla_parse(tb, PARAM_MAX,
+ data, data_len,
+ wlan_hdd_extscan_config_policy)) {
+ hddLog(LOGE, FL("Invalid ATTR"));
+ return -EINVAL;
+ }
+
+ request = vos_mem_malloc(sizeof(*request));
+ if (!request) {
+ hddLog(LOGE, FL("vos_mem_malloc failed"));
+ return -ENOMEM;
+ }
+
+ /* Parse and fetch request Id */
+ if (!tb[PARAM_REQUEST_ID]) {
+ hddLog(LOGE, FL("attr request id failed"));
+ goto fail;
+ }
+
+ request->request_id = nla_get_u32(tb[PARAM_REQUEST_ID]);
+ hddLog(LOG1, FL("Request Id %d"), request->request_id);
+
+ /* Parse and fetch lost SSID sample size */
+ if (!tb[PARAMS_LOST_SSID_SAMPLE_SIZE]) {
+ hddLog(LOGE, FL("attr number of Ssid failed"));
+ goto fail;
+ }
+ request->lost_ssid_sample_size =
+ nla_get_u32(tb[PARAMS_LOST_SSID_SAMPLE_SIZE]);
+ hddLog(LOG1, FL("Lost SSID Sample Size %d"),
+ request->lost_ssid_sample_size);
+
+ /* Parse and fetch number of hotlist SSID */
+ if (!tb[PARAMS_NUM_SSID]) {
+ hddLog(LOGE, FL("attr number of Ssid failed"));
+ goto fail;
+ }
+ request->ssid_count = nla_get_u32(tb[PARAMS_NUM_SSID]);
+ hddLog(LOG1, FL("Number of SSID %d"), request->ssid_count);
+
+ request->session_id = adapter->sessionId;
+ hddLog(LOG1, FL("Session Id (%d)"), request->session_id);
+
+ i = 0;
+ nla_for_each_nested(ssids, tb[THRESHOLD_PARAM], rem) {
+ if (i >= WLAN_EXTSCAN_MAX_HOTLIST_SSIDS) {
+ hddLog(LOGE,
+ FL("Too Many SSIDs, %d exceeds %d"),
+ i, WLAN_EXTSCAN_MAX_HOTLIST_SSIDS);
+ break;
+ }
+ if (nla_parse(tb2, PARAM_MAX,
+ nla_data(ssids), nla_len(ssids),
+ wlan_hdd_extscan_config_policy)) {
+ hddLog(LOGE, FL("nla_parse failed"));
+ goto fail;
+ }
+
+ /* Parse and fetch SSID */
+ if (!tb2[PARAM_SSID]) {
+ hddLog(LOGE, FL("attr ssid failed"));
+ goto fail;
+ }
+ nla_memcpy(ssid_string,
+ tb2[PARAM_SSID],
+ sizeof(ssid_string));
+ hddLog(LOG1, FL("SSID %s"),
+ ssid_string);
+ ssid_len = strlen(ssid_string);
+ memcpy(request->ssid[i].ssid.ssId, ssid_string, ssid_len);
+ request->ssid[i].ssid.length = ssid_len;
+ request->ssid[i].ssid.ssId[ssid_len] = '\0';
+ hddLog(LOG1, FL("After copying SSID %s"),
+ request->ssid[i].ssid.ssId);
+ hddLog(LOG1, FL("After copying length: %d"),
+ ssid_len);
+
+ /* Parse and fetch low RSSI */
+ if (!tb2[PARAM_BAND]) {
+ hddLog(LOGE, FL("attr band failed"));
+ goto fail;
+ }
+ request->ssid[i].band = nla_get_u8(tb2[PARAM_BAND]);
+ hddLog(LOG1, FL("band %d"), request->ssid[i].band);
+
+ /* Parse and fetch low RSSI */
+ if (!tb2[PARAM_RSSI_LOW]) {
+ hddLog(LOGE, FL("attr low RSSI failed"));
+ goto fail;
+ }
+ request->ssid[i].rssi_low = nla_get_s32(tb2[PARAM_RSSI_LOW]);
+ hddLog(LOG1, FL("RSSI low %d"), request->ssid[i].rssi_low);
+
+ /* Parse and fetch high RSSI */
+ if (!tb2[PARAM_RSSI_HIGH]) {
+ hddLog(LOGE, FL("attr high RSSI failed"));
+ goto fail;
+ }
+ request->ssid[i].rssi_high = nla_get_u32(tb2[PARAM_RSSI_HIGH]);
+ hddLog(LOG1, FL("RSSI high %d"), request->ssid[i].rssi_high);
+ i++;
+ }
+
+ context = &hdd_ctx->ext_scan_context;
+ spin_lock(&hdd_context_lock);
+ INIT_COMPLETION(context->response_event);
+ context->request_id = request_id = request->request_id;
+ spin_unlock(&hdd_context_lock);
+
+ status = sme_set_ssid_hotlist(hdd_ctx->hHal, request);
+ if (!HAL_STATUS_SUCCESS(status)) {
+ hddLog(LOGE,
+ FL("sme_set_ssid_hotlist failed(err=%d)"), status);
+ goto fail;
+ }
+
+ vos_mem_free(request);
+
+ /* request was sent -- wait for the response */
+ rc = wait_for_completion_timeout(&context->response_event,
+ msecs_to_jiffies
+ (WLAN_WAIT_TIME_EXTSCAN));
+ if (!rc) {
+ hddLog(LOGE, FL("sme_set_ssid_hotlist timed out"));
+ retval = -ETIMEDOUT;
+ } else {
+ spin_lock(&hdd_context_lock);
+ if (context->request_id == request_id)
+ retval = context->response_status;
+ else
+ retval = -EINVAL;
+ spin_unlock(&hdd_context_lock);
+ }
+
+ return retval;
+
+fail:
+ vos_mem_free(request);
+ return -EINVAL;
+}
+
+/*
+ * done with short names for the global vendor params
+ * used by wlan_hdd_cfg80211_extscan_set_ssid_hotlist()
+ */
+#undef PARAM_MAX
+#undef PARAM_REQUEST_ID
+#undef PARAMS_NUM_SSID
+#undef THRESHOLD_PARAM
+#undef PARAM_SSID
+#undef PARAM_BAND
+#undef PARAM_RSSI_LOW
+#undef PARAM_RSSI_HIGH
+
+static int wlan_hdd_cfg80211_extscan_set_ssid_hotlist(struct wiphy *wiphy,
+ struct wireless_dev *wdev,
+ const void *data, int dataLen)
+{
+ int ret = 0;
+
+ vos_ssr_protect(__func__);
+ ret = __wlan_hdd_cfg80211_extscan_set_ssid_hotlist(wiphy, wdev, data,
+ dataLen);
+ vos_ssr_unprotect(__func__);
+
+ return ret;
+}
+
+static int
+__wlan_hdd_cfg80211_extscan_reset_ssid_hotlist(struct wiphy *wiphy,
+ struct wireless_dev *wdev,
+ const void *data,
+ int data_len)
+{
+ tSirEXTScanResetSsidHotlistReqParams request;
+ struct net_device *dev = wdev->netdev;
+ hdd_adapter_t *adapter = WLAN_HDD_GET_PRIV_PTR(dev);
+ hdd_context_t *hdd_ctx = wiphy_priv(wiphy);
+ struct nlattr *tb[QCA_WLAN_VENDOR_ATTR_EXTSCAN_SUBCMD_CONFIG_PARAM_MAX + 1];
+ struct hdd_ext_scan_context *context;
+ uint32_t request_id;
+ eHalStatus status;
+ int retval;
+ unsigned long rc;
+
+ ENTER();
+
+ if (VOS_FTM_MODE == hdd_get_conparam()) {
+ hddLog(LOGE, FL("Command not allowed in FTM mode"));
+ return -EINVAL;
+ }
+
+ retval = wlan_hdd_validate_context(hdd_ctx);
+ if (0 != retval) {
+ hddLog(LOGE, FL("HDD context is not valid"));
+ return -EINVAL;
+ }
+
+ /* check the EXTScan Capability */
+ if ( (TRUE != hdd_ctx->cfg_ini->fEnableEXTScan) ||
+ (TRUE != sme_IsFeatureSupportedByFW(EXTENDED_SCAN)))
+ {
+ hddLog(LOGE,
+ FL("EXTScan not enabled/supported by Firmware"));
+ return -EINVAL;
+ }
+
+ if (nla_parse(tb, QCA_WLAN_VENDOR_ATTR_EXTSCAN_SUBCMD_CONFIG_PARAM_MAX,
+ data, data_len,
+ wlan_hdd_extscan_config_policy)) {
+ hddLog(LOGE, FL("Invalid ATTR"));
+ return -EINVAL;
+ }
+
+ /* Parse and fetch request Id */
+ if (!tb[QCA_WLAN_VENDOR_ATTR_EXTSCAN_SUBCMD_CONFIG_PARAM_REQUEST_ID]) {
+ hddLog(LOGE, FL("attr request id failed"));
+ return -EINVAL;
+ }
+
+ request.requestId = nla_get_u32(
+ tb[QCA_WLAN_VENDOR_ATTR_EXTSCAN_SUBCMD_CONFIG_PARAM_REQUEST_ID]);
+ request.sessionId = adapter->sessionId;
+ hddLog(LOG1, FL("Request Id %d Session Id %d"), request.requestId,
+ request.sessionId);
+
+ context = &hdd_ctx->ext_scan_context;
+ spin_lock(&hdd_context_lock);
+ INIT_COMPLETION(context->response_event);
+ context->request_id = request_id = request.requestId;
+ spin_unlock(&hdd_context_lock);
+
+ status = sme_reset_ssid_hotlist(hdd_ctx->hHal, &request);
+ if (!HAL_STATUS_SUCCESS(status)) {
+ hddLog(LOGE,
+ FL("sme_reset_ssid_hotlist failed(err=%d)"), status);
+ return -EINVAL;
+ }
+
+ /* request was sent -- wait for the response */
+ rc = wait_for_completion_timeout(&context->response_event,
+ msecs_to_jiffies
+ (WLAN_WAIT_TIME_EXTSCAN));
+ if (!rc) {
+ hddLog(LOGE, FL("sme_reset_ssid_hotlist timed out"));
+ retval = -ETIMEDOUT;
+ } else {
+ spin_lock(&hdd_context_lock);
+ if (context->request_id == request_id)
+ retval = context->response_status;
+ else
+ retval = -EINVAL;
+ spin_unlock(&hdd_context_lock);
+ }
+
+ return retval;
+}
+
+static int
+wlan_hdd_cfg80211_extscan_reset_ssid_hotlist(struct wiphy *wiphy,
+ struct wireless_dev *wdev,
+ const void *data,
+ int data_len)
+{
+ int ret;
+
+ vos_ssr_protect(__func__);
+ ret = __wlan_hdd_cfg80211_extscan_reset_ssid_hotlist(wiphy, wdev,
+ data, data_len);
+ vos_ssr_unprotect(__func__);
+
+ return ret;
+}
+
static int __wlan_hdd_cfg80211_extscan_get_valid_channels(struct wiphy *wiphy,
struct wireless_dev *wdev,
const void *data, int dataLen)
@@ -5462,6 +6036,22 @@
WIPHY_VENDOR_CMD_NEED_RUNNING,
.doit = wlan_hdd_cfg80211_extscan_reset_bssid_hotlist
},
+ {
+ .info.vendor_id = QCA_NL80211_VENDOR_ID,
+ .info.subcmd = QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_SET_SSID_HOTLIST,
+ .flags = WIPHY_VENDOR_CMD_NEED_WDEV |
+ WIPHY_VENDOR_CMD_NEED_NETDEV |
+ WIPHY_VENDOR_CMD_NEED_RUNNING,
+ .doit = wlan_hdd_cfg80211_extscan_set_ssid_hotlist
+ },
+ {
+ .info.vendor_id = QCA_NL80211_VENDOR_ID,
+ .info.subcmd = QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_RESET_SSID_HOTLIST,
+ .flags = WIPHY_VENDOR_CMD_NEED_WDEV |
+ WIPHY_VENDOR_CMD_NEED_NETDEV |
+ WIPHY_VENDOR_CMD_NEED_RUNNING,
+ .doit = wlan_hdd_cfg80211_extscan_reset_ssid_hotlist
+ },
#endif /* WLAN_FEATURE_EXTSCAN */
/*EXT TDLS*/
{
@@ -5608,6 +6198,22 @@
.vendor_id = QCA_NL80211_VENDOR_ID,
.subcmd = QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_RESET_BSSID_HOTLIST
},
+ {
+ .vendor_id = QCA_NL80211_VENDOR_ID,
+ .subcmd = QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_SET_SSID_HOTLIST
+ },
+ {
+ .vendor_id = QCA_NL80211_VENDOR_ID,
+ .subcmd = QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_RESET_SSID_HOTLIST
+ },
+ [QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_HOTLIST_SSID_FOUND_INDEX] = {
+ .vendor_id = QCA_NL80211_VENDOR_ID,
+ .subcmd = QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_HOTLIST_SSID_FOUND
+ },
+ [QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_HOTLIST_SSID_LOST_INDEX] = {
+ .vendor_id = QCA_NL80211_VENDOR_ID,
+ .subcmd = QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_HOTLIST_SSID_LOST
+ },
#endif /* WLAN_FEATURE_EXTSCAN */
/*EXT TDLS*/
{
diff --git a/CORE/MAC/inc/sirApi.h b/CORE/MAC/inc/sirApi.h
index f65a68a..a707a9c 100644
--- a/CORE/MAC/inc/sirApi.h
+++ b/CORE/MAC/inc/sirApi.h
@@ -143,6 +143,7 @@
#define WLAN_EXTSCAN_MAX_BUCKETS 16
#define WLAN_EXTSCAN_MAX_HOTLIST_APS 128
#define WLAN_EXTSCAN_MAX_RSSI_SAMPLE_SIZE 8
+#define WLAN_EXTSCAN_MAX_HOTLIST_SSIDS 8
#endif /* WLAN_FEATURE_EXTSCAN */
#define WLAN_DISA_MAX_PAYLOAD_SIZE 1600
@@ -5213,6 +5214,23 @@
tSirWifiScanResult ap[1];
} tSirWifiScanResultEvent, *tpSirWifiScanResultEvent;
+/* WLAN_HAL_SSID_HOTLIST_RESULT_IND */
+
+typedef PACKED_PRE struct PACKED_POST
+{
+ tANI_U32 requestId;
+ tANI_BOOLEAN ssid_found;
+ tANI_U32 numHotlistSsid; // numbers of SSIDs
+
+ /*
+ * 0 for last fragment
+ * 1 still more fragment(s) coming
+ */
+ tANI_BOOLEAN moreData;
+ tSirWifiScanResult ssidHotlist[1];
+} tSirEXTScanSsidHotlistMatch, *tpSirEXTScanSsidHotlistMatch;
+
+
typedef PACKED_PRE struct PACKED_POST
{
tANI_U8 elemId; // Element Identifier
@@ -5342,6 +5360,49 @@
tANI_U32 status;
} tSirEXTScanResetBssidHotlistRspParams, *tpSirEXTScanResetBssidHotlistRspParams;
+typedef struct
+{
+ tANI_U32 requestId;
+ tANI_U8 sessionId;
+} tSirEXTScanResetSsidHotlistReqParams, *tpSirEXTScanResetSsidHotlistReqParams;
+
+typedef PACKED_PRE struct PACKED_POST
+{
+ tANI_U32 requestId;
+ tANI_U32 status;
+} tSirEXTScanResetSsidHotlistRspParams, *tpSirEXTScanResetSsidHotlistRspParams;
+
+
+/**
+ * struct sir_ssid_hotlist_param - param for SSID Hotlist
+ * @ssid: SSID which is being hotlisted
+ * @band: Band in which the given SSID should be scanned
+ * @rssi_low: Low bound on RSSI
+ * @rssi_high: High bound on RSSI
+ */
+typedef struct
+{
+ tSirMacSSid ssid;
+ tANI_U8 band;
+ tANI_S32 rssi_low;
+ tANI_S32 rssi_high;
+}tSirSsidThresholdParam, *tpSirSsidThresholdParam;
+
+typedef struct
+{
+ tANI_U32 request_id;
+ tANI_U8 session_id;
+ tANI_U32 lost_ssid_sample_size;
+ tANI_U32 ssid_count;
+ tSirSsidThresholdParam ssid[WLAN_EXTSCAN_MAX_HOTLIST_SSIDS];
+}tSirEXTScanSetSsidHotListReqParams, *tpSirEXTScanSetSsidHotListReqParams;
+
+typedef PACKED_PRE struct PACKED_POST
+{
+ tANI_U32 requestId;
+ tANI_U32 status;
+} tSirEXTScanSetSsidHotListRspParams, *tpSirEXTScanSetSsidHotListRspParams;
+
/*---------------------------------------------------------------------------
* * WLAN_HAL_EXTSCAN_RESULT_AVAILABLE_IND
* *-------------------------------------------------------------------------*/
diff --git a/CORE/MAC/src/include/sirParams.h b/CORE/MAC/src/include/sirParams.h
index eb40aa1..4933df2 100644
--- a/CORE/MAC/src/include/sirParams.h
+++ b/CORE/MAC/src/include/sirParams.h
@@ -673,6 +673,11 @@
#define SIR_HAL_EXTSCAN_SET_BSS_HOTLIST_RSP (SIR_HAL_ITC_MSG_TYPES_BEGIN + 243)
#define SIR_HAL_EXTSCAN_RESET_BSS_HOTLIST_REQ (SIR_HAL_ITC_MSG_TYPES_BEGIN + 244)
#define SIR_HAL_EXTSCAN_RESET_BSS_HOTLIST_RSP (SIR_HAL_ITC_MSG_TYPES_BEGIN + 245)
+#define SIR_HAL_EXTSCAN_SET_SSID_HOTLIST_REQ (SIR_HAL_ITC_MSG_TYPES_BEGIN + 246)
+#define SIR_HAL_EXTSCAN_SET_SSID_HOTLIST_RSP (SIR_HAL_ITC_MSG_TYPES_BEGIN + 247)
+#define SIR_HAL_EXTSCAN_RESET_SSID_HOTLIST_REQ (SIR_HAL_ITC_MSG_TYPES_BEGIN + 248)
+#define SIR_HAL_EXTSCAN_RESET_SSID_HOTLIST_RSP (SIR_HAL_ITC_MSG_TYPES_BEGIN + 249)
+
#define SIR_HAL_EXTSCAN_GET_CACHED_RESULTS_REQ (SIR_HAL_ITC_MSG_TYPES_BEGIN + 250)
#define SIR_HAL_EXTSCAN_GET_CACHED_RESULTS_RSP (SIR_HAL_ITC_MSG_TYPES_BEGIN + 251)
@@ -680,6 +685,8 @@
#define SIR_HAL_EXTSCAN_SCAN_AVAILABLE_IND (SIR_HAL_ITC_MSG_TYPES_BEGIN + 253)
#define SIR_HAL_EXTSCAN_SCAN_RESULT_IND (SIR_HAL_ITC_MSG_TYPES_BEGIN + 254)
#define SIR_HAL_EXTSCAN_HOTLIST_MATCH_IND (SIR_HAL_ITC_MSG_TYPES_BEGIN + 255)
+#define SIR_HAL_EXTSCAN_SSID_HOTLIST_MATCH_IND (SIR_HAL_ITC_MSG_TYPES_BEGIN + 256)
+
#define SIR_HAL_EXTSCAN_FULL_SCAN_RESULT_IND (SIR_HAL_ITC_MSG_TYPES_BEGIN + 257)
#endif /* WLAN_FEATURE_EXTSCAN */
diff --git a/CORE/SME/inc/sme_Api.h b/CORE/SME/inc/sme_Api.h
index ec4f57d..ef237dc 100644
--- a/CORE/SME/inc/sme_Api.h
+++ b/CORE/SME/inc/sme_Api.h
@@ -240,6 +240,27 @@
eHalStatus sme_ResetBssHotlist (tHalHandle hHal,
tSirEXTScanResetBssidHotlistReqParams *pResetReq);
+/**
+ * sme_set_ssid_hotlist() - Set the SSID hotlist
+ * @hal: SME handle
+ * @request: set ssid hotlist request
+ *
+ * Return: eHalStatus
+ */
+eHalStatus sme_set_ssid_hotlist(tHalHandle hal,
+ tSirEXTScanSetSsidHotListReqParams *request);
+
+/* ---------------------------------------------------------------------------
+ \fn sme_ResetBssHotlist
+ \brief SME API to reset BSSID hotlist
+ \param hHal
+ \param pSetHotListReq: Extented Scan set hotlist structure
+ \- return eHalStatus
+ -------------------------------------------------------------------------*/
+eHalStatus sme_reset_ssid_hotlist (tHalHandle hHal,
+ tSirEXTScanResetSsidHotlistReqParams *pResetReq);
+
+
/* ---------------------------------------------------------------------------
\fn sme_getCachedResults
\brief SME API to get cached results
diff --git a/CORE/SME/inc/sme_Trace.h b/CORE/SME/inc/sme_Trace.h
index 05ce6f5..d5dfc9a 100644
--- a/CORE/SME/inc/sme_Trace.h
+++ b/CORE/SME/inc/sme_Trace.h
@@ -138,6 +138,8 @@
TRACE_CODE_SME_RX_HDD_EXTSCAN_SET_BSS_HOTLIST,
TRACE_CODE_SME_RX_HDD_EXTSCAN_RESET_BSS_HOTLIST,
TRACE_CODE_SME_RX_HDD_EXTSCAN_GET_CACHED_RESULTS,
+ TRACE_CODE_SME_RX_HDD_EXTSCAN_SET_SSID_HOTLIST,
+ TRACE_CODE_SME_RX_HDD_EXTSCAN_RESET_SSID_HOTLIST,
TRACE_CODE_SME_RX_HDD_MSG_DEAUTH_STA,
#ifdef FEATURE_WLAN_TDLS
TRACE_CODE_SME_RX_HDD_TDLS_LINK_ESTABLISH_PARAM,
diff --git a/CORE/SME/src/sme_common/sme_Api.c b/CORE/SME/src/sme_common/sme_Api.c
index 97cea29..a8fafc0 100644
--- a/CORE/SME/src/sme_common/sme_Api.c
+++ b/CORE/SME/src/sme_common/sme_Api.c
@@ -12308,6 +12308,117 @@
return(status);
}
+/**
+ * sme_set_ssid_hotlist() - Set the SSID hotlist
+ * @hal: SME handle
+ * @request: set ssid hotlist request
+ *
+ * Return: eHalStatus
+ */
+eHalStatus
+sme_set_ssid_hotlist(tHalHandle hal,
+ tSirEXTScanSetSsidHotListReqParams *request)
+{
+ eHalStatus status;
+ VOS_STATUS vstatus;
+ tpAniSirGlobal mac = PMAC_STRUCT(hal);
+ vos_msg_t vos_message;
+ tSirEXTScanSetSsidHotListReqParams *set_req;
+ int i;
+
+ set_req = vos_mem_malloc(sizeof(*set_req));
+ if (!set_req) {
+ VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_ERROR,
+ "%s: Not able to allocate memory for WDA_EXTSCAN_SET_SSID_HOTLIST_REQ",
+ __func__);
+ return eHAL_STATUS_FAILURE;
+ }
+
+ *set_req = *request;
+
+
+
+ for( i = 0; i < set_req->ssid_count; i++){
+
+ VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_ERROR,
+ "%s: SSID %s \n length: %d",
+ __func__, set_req->ssid[i].ssid.ssId, set_req->ssid[i].ssid.length);
+ }
+
+ MTRACE(vos_trace(VOS_MODULE_ID_SME,
+ TRACE_CODE_SME_RX_HDD_EXTSCAN_SET_SSID_HOTLIST, NO_SESSION, 0));
+
+ status = sme_AcquireGlobalLock(&mac->sme);
+ if (eHAL_STATUS_SUCCESS == status) {
+ /* Serialize the req through MC thread */
+ vos_message.bodyptr = set_req;
+ vos_message.type = WDA_EXTSCAN_SET_SSID_HOTLIST_REQ;
+ vstatus = vos_mq_post_message(VOS_MQ_ID_WDA, &vos_message);
+ sme_ReleaseGlobalLock(&mac->sme);
+ if (!VOS_IS_STATUS_SUCCESS(vstatus)) {
+ vos_mem_free(set_req);
+ status = eHAL_STATUS_FAILURE;
+ }
+ } else {
+ VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_ERROR,
+ "%s: sme_AcquireGlobalLock error", __func__);
+ vos_mem_free(set_req);
+ status = eHAL_STATUS_FAILURE;
+ }
+ return status;
+}
+
+/**
+ * sme_reset_ssid_hotlist() - Set the SSID hotlist
+ * @hal: SME handle
+ * @request: reset ssid hotlist request
+ *
+ * Return: eHalStatus
+ */
+eHalStatus
+sme_reset_ssid_hotlist(tHalHandle hal,
+ tSirEXTScanResetSsidHotlistReqParams *request)
+{
+ eHalStatus status;
+ VOS_STATUS vstatus;
+ tpAniSirGlobal mac = PMAC_STRUCT(hal);
+ vos_msg_t vos_message;
+ tSirEXTScanResetSsidHotlistReqParams *set_req;
+
+ set_req = vos_mem_malloc(sizeof(*set_req));
+ if (!set_req) {
+ VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_ERROR,
+ "%s: Not able to allocate memory for WDA_EXTSCAN_SET_SSID_HOTLIST_REQ",
+ __func__);
+ return eHAL_STATUS_FAILURE;
+ }
+
+ *set_req = *request;
+
+ MTRACE(vos_trace(VOS_MODULE_ID_SME,
+ TRACE_CODE_SME_RX_HDD_EXTSCAN_RESET_SSID_HOTLIST, NO_SESSION, 0));
+
+ status = sme_AcquireGlobalLock(&mac->sme);
+ if (eHAL_STATUS_SUCCESS == status) {
+ /* Serialize the req through MC thread */
+ vos_message.bodyptr = set_req;
+ vos_message.type = WDA_EXTSCAN_RESET_SSID_HOTLIST_REQ;
+ vstatus = vos_mq_post_message(VOS_MQ_ID_WDA, &vos_message);
+ sme_ReleaseGlobalLock(&mac->sme);
+ if (!VOS_IS_STATUS_SUCCESS(vstatus)) {
+ vos_mem_free(set_req);
+ status = eHAL_STATUS_FAILURE;
+ }
+ } else {
+ VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_ERROR,
+ "%s: sme_AcquireGlobalLock error", __func__);
+ vos_mem_free(set_req);
+ status = eHAL_STATUS_FAILURE;
+ }
+ return status;
+}
+
+
/* ---------------------------------------------------------------------------
\fn sme_getCachedResults
\brief SME API to get cached results
diff --git a/CORE/WDA/inc/wlan_qct_wda.h b/CORE/WDA/inc/wlan_qct_wda.h
index 934eed9..357007d 100644
--- a/CORE/WDA/inc/wlan_qct_wda.h
+++ b/CORE/WDA/inc/wlan_qct_wda.h
@@ -1264,6 +1264,11 @@
#define WDA_EXTSCAN_SET_BSSID_HOTLIST_RSP SIR_HAL_EXTSCAN_SET_BSS_HOTLIST_RSP
#define WDA_EXTSCAN_RESET_BSSID_HOTLIST_REQ SIR_HAL_EXTSCAN_RESET_BSS_HOTLIST_REQ
#define WDA_EXTSCAN_RESET_BSSID_HOTLIST_RSP SIR_HAL_EXTSCAN_RESET_BSS_HOTLIST_RSP
+#define WDA_EXTSCAN_SET_SSID_HOTLIST_REQ SIR_HAL_EXTSCAN_SET_SSID_HOTLIST_REQ
+#define WDA_EXTSCAN_SET_SSID_HOTLIST_RSP SIR_HAL_EXTSCAN_SET_SSID_HOTLIST_RSP
+#define WDA_EXTSCAN_RESET_SSID_HOTLIST_REQ SIR_HAL_EXTSCAN_RESET_SSID_HOTLIST_REQ
+#define WDA_EXTSCAN_RESET_SSID_HOTLIST_RSP SIR_HAL_EXTSCAN_RESET_SSID_HOTLIST_RSP
+
#define WDA_EXTSCAN_GET_CACHED_RESULTS_REQ SIR_HAL_EXTSCAN_GET_CACHED_RESULTS_REQ
#define WDA_EXTSCAN_GET_CACHED_RESULTS_RSP SIR_HAL_EXTSCAN_GET_CACHED_RESULTS_RSP
@@ -1271,6 +1276,7 @@
#define WDA_EXTSCAN_SCAN_AVAILABLE_IND SIR_HAL_EXTSCAN_SCAN_AVAILABLE_IND
#define WDA_EXTSCAN_SCAN_RESULT_IND SIR_HAL_EXTSCAN_SCAN_RESULT_IND
#define WDA_EXTSCAN_BSSID_HOTLIST_RESULT_IND SIR_HAL_EXTSCAN_HOTLIST_MATCH_IND
+#define WDA_EXTSCAN_SSID_HOTLIST_RESULT_IND SIR_HAL_EXTSCAN_SSID_HOTLIST_MATCH_IND
#endif /* WLAN_FEATURE_EXTSCAN */
#define WDA_SPOOF_MAC_ADDR_REQ SIR_HAL_SPOOF_MAC_ADDR_REQ
diff --git a/CORE/WDA/src/wlan_qct_wda.c b/CORE/WDA/src/wlan_qct_wda.c
index a73d337..89e77e5 100644
--- a/CORE/WDA/src/wlan_qct_wda.c
+++ b/CORE/WDA/src/wlan_qct_wda.c
@@ -233,6 +233,11 @@
tSirEXTScanSetBssidHotListReqParams *wdaRequest);
VOS_STATUS WDA_ProcessEXTScanResetBSSIDHotlistReq(tWDA_CbContext *pWDA,
tSirEXTScanResetBssidHotlistReqParams *wdaRequest);
+VOS_STATUS WDA_ProcessEXTScanSetSSIDHotlistReq(tWDA_CbContext *pWDA,
+ tSirEXTScanSetSsidHotListReqParams *wdaRequest);
+VOS_STATUS WDA_ProcessEXTScanResetSSIDHotlistReq(tWDA_CbContext *pWDA,
+ tSirEXTScanResetSsidHotlistReqParams *wdaRequest);
+
#endif /* WLAN_FEATURE_EXTSCAN */
#ifdef WLAN_FEATURE_LINK_LAYER_STATS
@@ -14219,6 +14224,18 @@
(tSirEXTScanResetBssidHotlistReqParams *)pMsg->bodyptr);
break;
}
+ case WDA_EXTSCAN_SET_SSID_HOTLIST_REQ:
+ {
+ WDA_ProcessEXTScanSetSSIDHotlistReq(pWDA,
+ (tSirEXTScanSetSsidHotListReqParams *)pMsg->bodyptr);
+ break;
+ }
+ case WDA_EXTSCAN_RESET_SSID_HOTLIST_REQ:
+ {
+ WDA_ProcessEXTScanResetSSIDHotlistReq(pWDA,
+ (tSirEXTScanResetSsidHotlistReqParams *)pMsg->bodyptr);
+ break;
+ }
#endif /* WLAN_FEATURE_EXTSCAN */
#ifdef WDA_UT
case WDA_WDI_EVENT_MSG:
@@ -15290,6 +15307,7 @@
case WDI_EXTSCAN_SCAN_AVAILABLE_IND:
case WDI_EXTSCAN_SCAN_RESULT_IND:
case WDI_EXTSCAN_BSSID_HOTLIST_RESULT_IND:
+ case WDI_EXTSCAN_SSID_HOTLIST_RESULT_IND:
{
void *pEXTScanData;
void *pCallbackContext;
@@ -15336,6 +15354,14 @@
VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
"WDI_EXTSCAN Indication is WDI_EXTSCAN_BSSID_HOTLIST_RESULT_IND");
}
+ if (wdiLowLevelInd->wdiIndicationType ==
+ WDI_EXTSCAN_SSID_HOTLIST_RESULT_IND)
+ {
+ indType = WDA_EXTSCAN_SSID_HOTLIST_RESULT_IND;
+
+ VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
+ "WDI_EXTSCAN Indication is WDI_EXTSCAN_SSID_HOTLIST_RESULT_IND");
+ }
pEXTScanData =
(void *)wdiLowLevelInd->wdiIndicationData.pEXTScanIndData;
@@ -18519,6 +18545,162 @@
}
/*==========================================================================
+ FUNCTION WDA_EXTScanSetSSIDHotlistRspCallback
+
+ DESCRIPTION
+ API to send EXTScan Set SSID Hotlist Response to HDD
+
+ PARAMETERS
+ pEventData: Response from FW
+ pUserData:
+===========================================================================*/
+void WDA_EXTScanSetSSIDHotlistRspCallback(void *pEventData, void* pUserData)
+{
+ tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
+ tWDA_CbContext *pWDA = NULL;
+ void *pCallbackContext;
+ tpAniSirGlobal pMac;
+
+ VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
+ "%s: ", __func__);
+ if (NULL == pWdaParams)
+ {
+ VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
+ "%s: pWdaParams received NULL", __func__);
+ VOS_ASSERT(0) ;
+ return;
+ }
+
+ pWDA = (tWDA_CbContext *) pWdaParams->pWdaContext;
+
+ if (NULL == pWDA)
+ {
+ VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
+ "%s: pWDA received NULL", __func__);
+ VOS_ASSERT(0);
+ goto error;
+ }
+
+ pMac = (tpAniSirGlobal )VOS_GET_MAC_CTXT(pWDA->pVosContext);
+ if (NULL == pMac)
+ {
+ VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
+ "%s:pMac is NULL", __func__);
+ VOS_ASSERT(0);
+ goto error;
+ }
+
+ pCallbackContext = pMac->sme.pEXTScanCallbackContext;
+
+ if (pMac->sme.pEXTScanIndCb)
+ {
+ pMac->sme.pEXTScanIndCb(pCallbackContext,
+ WDA_EXTSCAN_SET_SSID_HOTLIST_RSP,
+ pEventData);
+ }
+ else
+ {
+ VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
+ "%s:HDD callback is null", __func__);
+ VOS_ASSERT(0);
+ }
+
+
+error:
+
+ if (pWdaParams->wdaWdiApiMsgParam != NULL)
+ {
+ vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
+ }
+ if (pWdaParams->wdaMsgParam != NULL)
+ {
+ vos_mem_free(pWdaParams->wdaMsgParam);
+ }
+ vos_mem_free(pWdaParams) ;
+
+ return;
+}
+
+/*==========================================================================
+ FUNCTION WDA_EXTScanResetSSIDHotlistRspCallback
+
+ DESCRIPTION
+ API to send EXTScan ReSet SSID Hotlist Response to HDD
+
+ PARAMETERS
+ pEventData: Response from FW
+ pUserData:
+===========================================================================*/
+void WDA_EXTScanResetSSIDHotlistRspCallback(void *pEventData, void* pUserData)
+{
+ tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
+ tWDA_CbContext *pWDA = NULL;
+ void *pCallbackContext;
+ tpAniSirGlobal pMac;
+
+ VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
+ "%s:", __func__);
+ if (NULL == pWdaParams)
+ {
+ VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
+ "%s: pWdaParams received NULL", __func__);
+ VOS_ASSERT(0) ;
+ return;
+ }
+
+ pWDA = (tWDA_CbContext *) pWdaParams->pWdaContext;
+
+ if (NULL == pWDA)
+ {
+ VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
+ "%s: pWDA received NULL", __func__);
+ VOS_ASSERT(0);
+ goto error;
+ }
+
+ pMac = (tpAniSirGlobal )VOS_GET_MAC_CTXT(pWDA->pVosContext);
+ if (NULL == pMac)
+ {
+ VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
+ "%s:pMac is NULL", __func__);
+ VOS_ASSERT(0);
+ goto error;
+ }
+
+ pCallbackContext = pMac->sme.pEXTScanCallbackContext;
+
+ if (pMac->sme.pEXTScanIndCb)
+ {
+ pMac->sme.pEXTScanIndCb(pCallbackContext,
+ WDA_EXTSCAN_RESET_SSID_HOTLIST_RSP,
+ pEventData);
+ }
+ else
+ {
+ VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
+ "%s:HDD callback is null", __func__);
+ VOS_ASSERT(0);
+ }
+
+
+error:
+
+ if (pWdaParams->wdaWdiApiMsgParam != NULL)
+ {
+ vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
+ }
+ if (pWdaParams->wdaMsgParam != NULL)
+ {
+ vos_mem_free(pWdaParams->wdaMsgParam);
+ }
+ vos_mem_free(pWdaParams) ;
+
+ return;
+}
+
+
+
+/*==========================================================================
FUNCTION WDA_ProcessEXTScanStartReq
DESCRIPTION
@@ -18775,6 +18957,94 @@
}
return CONVERT_WDI2VOS_STATUS(status);
}
+
+/*==========================================================================
+ FUNCTION WDA_ProcessEXTScanSetSSIDHotlistReq
+
+ DESCRIPTION
+ API to send Set SSID Hotlist Request to WDI
+
+ PARAMETERS
+ pWDA: Pointer to WDA context
+ wdaRequest: Pointer to EXTScan req parameters
+===========================================================================*/
+VOS_STATUS WDA_ProcessEXTScanSetSSIDHotlistReq(tWDA_CbContext *pWDA,
+ tSirEXTScanSetSsidHotListReqParams *wdaRequest)
+{
+ WDI_Status status = WDI_STATUS_SUCCESS;
+ tWDA_ReqParams *pWdaParams;
+
+ VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
+ "%s: ", __func__);
+ pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams));
+ if (NULL == pWdaParams)
+ {
+ VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
+ "%s: VOS MEM Alloc Failure", __func__);
+ VOS_ASSERT(0);
+ return VOS_STATUS_E_NOMEM;
+ }
+ pWdaParams->pWdaContext = pWDA;
+ pWdaParams->wdaMsgParam = wdaRequest;
+ pWdaParams->wdaWdiApiMsgParam = NULL;
+
+ status = WDI_EXTScanSetSSIDHotlistReq((void *)wdaRequest,
+ (WDI_EXTScanSetSSIDHotlistRspCb)WDA_EXTScanSetSSIDHotlistRspCallback,
+ (void *)pWdaParams);
+ if (IS_WDI_STATUS_FAILURE(status))
+ {
+ VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
+ "Failure to request. Free all the memory " );
+ vos_mem_free(pWdaParams->wdaMsgParam);
+ vos_mem_free(pWdaParams);
+ }
+ return CONVERT_WDI2VOS_STATUS(status);
+}
+
+/*==========================================================================
+ FUNCTION WDA_ProcessEXTScanReSetSSIDHotlistReq
+
+ DESCRIPTION
+ API to send Reset SSID Hotlist Request to WDI
+
+ PARAMETERS
+ pWDA: Pointer to WDA context
+ wdaRequest: Pointer to EXTScan req parameters
+===========================================================================*/
+VOS_STATUS WDA_ProcessEXTScanResetSSIDHotlistReq(tWDA_CbContext *pWDA,
+ tSirEXTScanResetSsidHotlistReqParams *wdaRequest)
+{
+ WDI_Status status = WDI_STATUS_SUCCESS;
+ tWDA_ReqParams *pWdaParams;
+
+ VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
+ "%s:", __func__);
+ pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams));
+ if (NULL == pWdaParams)
+ {
+ VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
+ "%s: VOS MEM Alloc Failure", __func__);
+ VOS_ASSERT(0);
+ return VOS_STATUS_E_NOMEM;
+ }
+ pWdaParams->pWdaContext = pWDA;
+ pWdaParams->wdaMsgParam = wdaRequest;
+ pWdaParams->wdaWdiApiMsgParam = NULL;
+
+ status = WDI_EXTScanResetSSIDHotlistReq((void *)wdaRequest,
+ (WDI_EXTScanResetSSIDHotlistRspCb)WDA_EXTScanResetSSIDHotlistRspCallback,
+ (void *)pWdaParams);
+ if (IS_WDI_STATUS_FAILURE(status))
+ {
+ VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
+ "Failure to request. Free all the memory " );
+ vos_mem_free(pWdaParams->wdaMsgParam);
+ vos_mem_free(pWdaParams);
+ }
+ return CONVERT_WDI2VOS_STATUS(status);
+}
+
+
#endif /* WLAN_FEATURE_EXTSCAN */
#ifdef WLAN_FEATURE_LINK_LAYER_STATS
diff --git a/CORE/WDI/CP/inc/wlan_qct_wdi.h b/CORE/WDI/CP/inc/wlan_qct_wdi.h
index 1d6a655..679819c 100644
--- a/CORE/WDI/CP/inc/wlan_qct_wdi.h
+++ b/CORE/WDI/CP/inc/wlan_qct_wdi.h
@@ -413,6 +413,7 @@
WDI_EXTSCAN_SCAN_RESULT_IND,
WDI_EXTSCAN_GET_CAPABILITIES_IND,
WDI_EXTSCAN_BSSID_HOTLIST_RESULT_IND,
+ WDI_EXTSCAN_SSID_HOTLIST_RESULT_IND,
#endif
/*Delete BA Ind*/
WDI_DEL_BA_IND,
@@ -5841,6 +5842,7 @@
#define WDI_WLAN_EXTSCAN_MAX_CHANNELS 16
#define WDI_WLAN_EXTSCAN_MAX_BUCKETS 16
#define WDI_WLAN_EXTSCAN_MAX_HOTLIST_APS 128
+#define WDI_WLAN_EXTSCAN_MAX_HOTLIST_SSID 8
typedef enum
{
@@ -5948,6 +5950,14 @@
typedef struct
{
+ WDI_MacSSid ssid; /* SSID */
+ wpt_uint8 band; /* band */
+ wpt_int32 lowRssiThreshold; /* low threshold */
+ wpt_int32 highRssiThreshold; /* high threshold */
+} WDI_SSIDThresholdParam;
+
+typedef struct
+{
wpt_int32 requestId;
wpt_int8 sessionId; // session Id mapped to vdev_id
wpt_uint32 lostBssidSampleSize;
@@ -5961,6 +5971,21 @@
wpt_uint8 sessionId;
} WDI_EXTScanResetBSSIDHotlistReqParams;
+typedef struct
+{
+ wpt_uint32 requestId;
+ wpt_uint8 sessionId; // session Id mapped to vdev_id
+ wpt_uint32 lostSsidSampleSize;
+ wpt_uint32 numSsid; // number of hotlist APs
+ WDI_SSIDThresholdParam ssid[WDI_WLAN_EXTSCAN_MAX_HOTLIST_SSID]; // hotlist SSIDs
+} WDI_EXTScanSetSSIDHotlistReqParams;
+
+typedef struct
+{
+ wpt_uint32 requestId;
+ wpt_uint8 sessionId;
+} WDI_EXTScanResetSSIDHotlistReqParams;
+
#endif /* WLAN_FEATURE_EXTSCAN */
#ifdef WLAN_FEATURE_LINK_LAYER_STATS
@@ -8009,6 +8034,12 @@
void *pUserData);
typedef void (*WDI_EXTScanResetBSSIDHotlistRspCb)(void *pEventData,
void *pUserData);
+typedef void (*WDI_EXTScanSetSSIDHotlistRspCb)(void *pEventData,
+ void *pUserData);
+typedef void (*WDI_EXTScanResetSSIDHotlistRspCb)(void *pEventData,
+ void *pUserData);
+
+
#endif /* WLAN_FEATURE_EXTSCAN */
#ifdef WLAN_FEATURE_LINK_LAYER_STATS
@@ -11321,6 +11352,41 @@
WDI_EXTScanResetBSSIDHotlistRspCb wdiEXTScanResetBSSIDHotlistRspCb,
void* pUserData
);
+
+/**
+ @brief WDI_EXTScanSetSSIDHotlistReq
+ This API is called to send Set SSID Hotlist Request FW
+
+ @param pwdiEXTScanSetBssidHotlistReqParams : pointer to the request params.
+ wdiEXTScanSetBSSIDHotlistRspCb : callback on getting the response.
+ usrData : Client context
+ @see
+ @return SUCCESS or FAIL
+*/
+WDI_Status WDI_EXTScanSetSSIDHotlistReq
+(
+ WDI_EXTScanSetSSIDHotlistReqParams* pwdiEXTScanSetSSIDHotlistReqParams,
+ WDI_EXTScanSetSSIDHotlistRspCb wdiEXTScanSetSSIDHotlistRspCb,
+ void* pUserData
+);
+
+/**
+ @brief WDI_EXTScanResetSSIDHotlistReq
+ This API is called to send Reset SSID Hotlist Request FW
+
+ @param pwdiEXTScanResetSsidHotlistReqParams : pointer to the request params.
+ wdiEXTScanGetCachedResultsRspCb : callback on getting the response.
+ usrData : Client context
+ @see
+ @return SUCCESS or FAIL
+*/
+WDI_Status WDI_EXTScanResetSSIDHotlistReq
+(
+ WDI_EXTScanResetSSIDHotlistReqParams* pwdiEXTScanResetSSIDHotlistReqParams,
+ WDI_EXTScanResetSSIDHotlistRspCb wdiEXTScanResetSSIDHotlistRspCb,
+ void* pUserData
+);
+
#endif /* WLAN_FEATURE_EXTSCAN */
#ifdef WLAN_FEATURE_LINK_LAYER_STATS
diff --git a/CORE/WDI/CP/inc/wlan_qct_wdi_i.h b/CORE/WDI/CP/inc/wlan_qct_wdi_i.h
index 6cbd653..a8e9ccf 100644
--- a/CORE/WDI/CP/inc/wlan_qct_wdi_i.h
+++ b/CORE/WDI/CP/inc/wlan_qct_wdi_i.h
@@ -459,6 +459,8 @@
WDI_EXTSCAN_GET_CAPABILITIES_REQ = 96,
WDI_EXTSCAN_SET_BSSID_HOTLIST_REQ = 97,
WDI_EXTSCAN_RESET_BSSID_HOTLIST_REQ = 98,
+ WDI_EXTSCAN_SET_SSID_HOTLIST_REQ = 99,
+ WDI_EXTSCAN_RESET_SSID_HOTLIST_REQ = 100,
#endif
WDI_SPOOF_MAC_ADDR_REQ = 101,
@@ -802,6 +804,8 @@
WDI_EXTSCAN_GET_CAPABILITIES_RSP = 96,
WDI_EXTSCAN_SET_HOTLIST_BSSID_RSP = 97,
WDI_EXTSCAN_RESET_HOTLIST_BSSID_RSP = 98,
+ WDI_EXTSCAN_SET_HOTLIST_SSID_RSP = 99,
+ WDI_EXTSCAN_RESET_HOTLIST_SSID_RSP = 100,
#endif
WDI_SPOOF_MAC_ADDR_RSP = 101,
WDI_GET_FW_STATS_RSP = 102,
@@ -892,6 +896,7 @@
WDI_HAL_EXTSCAN_SCAN_AVAILABLE_IND = WDI_HAL_IND_MIN + 22,
WDI_HAL_EXTSCAN_RESULT_IND = WDI_HAL_IND_MIN + 23,
WDI_HAL_EXTSCAN_BSSID_HOTLIST_RESULT_IND = WDI_HAL_IND_MIN + 24,
+ WDI_HAL_EXTSCAN_SSID_HOTLIST_RESULT_IND = WDI_HAL_IND_MIN + 25,
#endif
WDI_TDLS_CHAN_SWITCH_REQ_RESP = WDI_HAL_IND_MIN + 26,
WDI_HAL_DEL_BA_IND = WDI_HAL_IND_MIN + 27,
@@ -5994,6 +5999,34 @@
);
WDI_Status
+WDI_ProcessEXTScanSetSSIDHotlistReq
+(
+ WDI_ControlBlockType* pWDICtx,
+ WDI_EventInfoType* pEventData
+);
+
+WDI_Status
+WDI_ProcessEXTScanSetHotlistSSIDRsp
+(
+ WDI_ControlBlockType* pWDICtx,
+ WDI_EventInfoType* pEventData
+);
+
+WDI_Status
+WDI_ProcessEXTScanResetSSIDHotlistReq
+(
+ WDI_ControlBlockType* pWDICtx,
+ WDI_EventInfoType* pEventData
+);
+
+WDI_Status
+WDI_ProcessEXTScanResetHotlistSSIDRsp
+(
+ WDI_ControlBlockType* pWDICtx,
+ WDI_EventInfoType* pEventData
+);
+
+WDI_Status
WDI_ProcessEXTScanScanAvailableInd
(
WDI_ControlBlockType* pWDICtx,
@@ -6014,6 +6047,14 @@
WDI_EventInfoType* pEventData
);
+WDI_Status
+WDI_ProcessEXTScanSsidHotListResultInd
+(
+ WDI_ControlBlockType* pWDICtx,
+ WDI_EventInfoType* pEventData
+);
+
+
#endif /* WLAN_FEATURE_EXTSCAN */
#ifdef WLAN_FEATURE_LINK_LAYER_STATS
diff --git a/CORE/WDI/CP/src/wlan_qct_wdi.c b/CORE/WDI/CP/src/wlan_qct_wdi.c
index 7cf597b..0587351 100644
--- a/CORE/WDI/CP/src/wlan_qct_wdi.c
+++ b/CORE/WDI/CP/src/wlan_qct_wdi.c
@@ -454,6 +454,8 @@
WDI_ProcessEXTScanGetCapabilitiesReq, /* WDI_EXTSCAN_GET_CAPABILITIES_REQ */
WDI_ProcessEXTScanSetBSSIDHotlistReq, /* WDI_EXTSCAN_SET_BSSID_HOTLIST_REQ */
WDI_ProcessEXTScanResetBSSIDHotlistReq, /* WDI_EXTSCAN_RESET_BSSID_HOTLIST_REQ */
+ WDI_ProcessEXTScanSetSSIDHotlistReq, /* WDI_EXTSCAN_SET_SSID_HOTLIST_REQ */
+ WDI_ProcessEXTScanResetSSIDHotlistReq, /* WDI_EXTSCAN_RESET_SSID_HOTLIST_REQ */
#else
NULL,
NULL,
@@ -461,6 +463,8 @@
NULL,
NULL,
NULL,
+ NULL,
+ NULL,
#endif /* WLAN_FEATURE_EXTSCAN */
WDI_ProcessSpoofMacAddrReq, /* WDI_SPOOF_MAC_ADDR_REQ */
@@ -724,6 +728,8 @@
WDI_ProcessEXTScanGetCapabilitiesRsp, /* WDI_EXTSCAN_GET_CAPABILITIES_RSP */
WDI_ProcessEXTScanSetHotlistBSSIDRsp, /* WDI_EXTSCAN_SET_HOTLIST_BSSID_RSP */
WDI_ProcessEXTScanResetHotlistBSSIDRsp, /* WDI_EXTSCAN_RESET_HOTLIST_BSSID_RSP */
+ WDI_ProcessEXTScanSetHotlistSSIDRsp, /* WDI_EXTSCAN_SET_HOTLIST_SSID_RSP */
+ WDI_ProcessEXTScanResetHotlistSSIDRsp, /* WDI_EXTSCAN_RESET_HOTLIST_SSID_RSP */
#else
NULL,
NULL,
@@ -731,6 +737,8 @@
NULL,
NULL,
NULL,
+ NULL,
+ NULL,
#endif /* WLAN_FEATURE_EXTSCAN */
WDI_ProcessSpoofMacAddrRsp, /* WDI_SPOOF_MAC_ADDR_RSP */
@@ -815,11 +823,13 @@
WDI_ProcessEXTScanScanAvailableInd, /* WDI_HAL_EXTSCAN_SCAN_AVAILABLE_IND */
WDI_ProcessEXTScanResultInd, /* WDI_HAL_EXTSCAN_RESULT_IND */
WDI_ProcessEXTScanBssidHotListResultInd, /* WDI_HAL_EXTSCAN_BSSID_HOTLIST_RESULT_IND */
+ WDI_ProcessEXTScanSsidHotListResultInd, /* WDI_HAL_EXTSCAN_SSID_HOTLIST_RESULT_IND */
#else
NULL,
NULL,
NULL,
NULL,
+ NULL,
#endif /* WLAN_FEATURE_EXTSCAN */
#ifdef FEATURE_WLAN_TDLS
WDI_ProcessChanSwitchReqRsp, /*WDI_TDLS_CHAN_SWITCH_REQ_RESP*/
@@ -1159,6 +1169,8 @@
CASE_RETURN_STRING( WDI_EXTSCAN_GET_CAPABILITIES_REQ);
CASE_RETURN_STRING( WDI_EXTSCAN_SET_BSSID_HOTLIST_REQ);
CASE_RETURN_STRING( WDI_EXTSCAN_RESET_BSSID_HOTLIST_REQ);
+ CASE_RETURN_STRING( WDI_EXTSCAN_SET_SSID_HOTLIST_REQ);
+ CASE_RETURN_STRING( WDI_EXTSCAN_RESET_SSID_HOTLIST_REQ);
#endif /* WLAN_FEATURE_EXTSCAN */
CASE_RETURN_STRING( WDI_SPOOF_MAC_ADDR_REQ);
CASE_RETURN_STRING( WDI_GET_FW_STATS_REQ);
@@ -1293,10 +1305,13 @@
CASE_RETURN_STRING( WDI_EXTSCAN_GET_CAPABILITIES_RSP);
CASE_RETURN_STRING( WDI_EXTSCAN_SET_HOTLIST_BSSID_RSP);
CASE_RETURN_STRING( WDI_EXTSCAN_RESET_HOTLIST_BSSID_RSP);
+ CASE_RETURN_STRING( WDI_EXTSCAN_SET_HOTLIST_SSID_RSP);
+ CASE_RETURN_STRING( WDI_EXTSCAN_RESET_HOTLIST_SSID_RSP);
CASE_RETURN_STRING( WDI_HAL_EXTSCAN_PROGRESS_IND);
CASE_RETURN_STRING( WDI_HAL_EXTSCAN_SCAN_AVAILABLE_IND);
CASE_RETURN_STRING( WDI_HAL_EXTSCAN_RESULT_IND);
CASE_RETURN_STRING( WDI_HAL_EXTSCAN_BSSID_HOTLIST_RESULT_IND);
+ CASE_RETURN_STRING( WDI_HAL_EXTSCAN_SSID_HOTLIST_RESULT_IND);
#endif /* WLAN_FEATURE_EXTSCAN */
CASE_RETURN_STRING( WDI_GET_FW_STATS_RSP);
@@ -24232,6 +24247,11 @@
return WLAN_HAL_BSSID_HOTLIST_SET_REQ;
case WDI_EXTSCAN_RESET_BSSID_HOTLIST_REQ:
return WLAN_HAL_BSSID_HOTLIST_RESET_REQ;
+ case WDI_EXTSCAN_SET_SSID_HOTLIST_REQ:
+ return WLAN_HAL_SSID_HOTLIST_SET_REQ;
+ case WDI_EXTSCAN_RESET_SSID_HOTLIST_REQ:
+ return WLAN_HAL_SSID_HOTLIST_RESET_REQ;
+
#endif /* WLAN_FEATURE_EXTSCAN */
case WDI_SPOOF_MAC_ADDR_REQ:
return WLAN_HAL_MAC_SPOOFED_SCAN_REQ;
@@ -24553,6 +24573,10 @@
return WDI_EXTSCAN_SET_HOTLIST_BSSID_RSP;
case WLAN_HAL_BSSID_HOTLIST_RESET_RSP:
return WDI_EXTSCAN_RESET_HOTLIST_BSSID_RSP;
+ case WLAN_HAL_SSID_HOTLIST_SET_RSP:
+ return WDI_EXTSCAN_SET_HOTLIST_SSID_RSP;
+ case WLAN_HAL_SSID_HOTLIST_RESET_RSP:
+ return WDI_EXTSCAN_RESET_HOTLIST_SSID_RSP;
case WLAN_HAL_EXT_SCAN_PROGRESS_IND:
return WDI_HAL_EXTSCAN_PROGRESS_IND;
case WLAN_HAL_EXT_SCAN_RESULT_AVAILABLE_IND:
@@ -24561,6 +24585,9 @@
return WDI_HAL_EXTSCAN_RESULT_IND;
case WLAN_HAL_BSSID_HOTLIST_RESULT_IND:
return WDI_HAL_EXTSCAN_BSSID_HOTLIST_RESULT_IND;
+ case WLAN_HAL_SSID_HOTLIST_RESULT_IND:
+ return WDI_HAL_EXTSCAN_SSID_HOTLIST_RESULT_IND;
+
#endif /* WLAN_FEATURE_EXTSCAN */
case WLAN_HAL_MAC_SPOOFED_SCAN_RSP:
return WDI_SPOOF_MAC_ADDR_RSP;
@@ -32610,6 +32637,60 @@
} /* End of WDI_ProcessEXTScanBssidHotListResultInd */
/**
+ @brief Process EXTScan SSID Hotlist Result Indication indication 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_ProcessEXTScanSsidHotListResultInd
+(
+ WDI_ControlBlockType* pWDICtx,
+ WDI_EventInfoType* pEventData
+)
+{
+ WDI_LowLevelIndType wdiInd;
+ /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+
+ VOS_TRACE( VOS_MODULE_ID_WDI, VOS_TRACE_LEVEL_INFO,
+ "%s: ", __func__);
+
+ /* sanity check */
+ if (( NULL == pWDICtx ) || ( NULL == pEventData ) ||
+ ( NULL == pEventData->pEventData))
+ {
+ WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_ERROR,
+ "%s: Invalid parameters", __func__);
+ WDI_ASSERT(0);
+ return WDI_STATUS_E_FAILURE;
+ }
+
+ /* Fill in the indication parameters */
+ wdiInd.wdiIndicationType = WDI_EXTSCAN_SSID_HOTLIST_RESULT_IND;
+
+ /* extract response and send it to UMAC */
+ wdiInd.wdiIndicationData.pEXTScanIndData = (void *)pEventData->pEventData;
+
+ /* Notify UMAC */
+ if (pWDICtx->wdiLowLevelIndCB)
+ {
+ pWDICtx->wdiLowLevelIndCB( &wdiInd, pWDICtx->pIndUserData );
+ }
+ else
+ {
+ VOS_TRACE( VOS_MODULE_ID_WDI, VOS_TRACE_LEVEL_INFO,
+ "%s: WDILowLevelIndCb is null", __func__);
+ WDI_ASSERT(0);
+ return WDI_STATUS_E_FAILURE;
+ }
+ return WDI_STATUS_SUCCESS;
+} /* End of WDI_ProcessEXTScanSsidHotListResultInd */
+
+
+/**
@brief WDI_EXTScanGetCapabilitiesReq
@param WDI_EXTScanGetCapabilitiesReqParams: Req parameter for the FW
@@ -33462,6 +33543,286 @@
WDI_EXTSCAN_RESET_HOTLIST_BSSID_RSP);
}
+
+/**
+ @brief WDI_EXTScanSetSSIDHotlistReq
+
+ @param WDI_EXTScanSetSSIDHotlistReqParams: Req parameter for the FW
+ WDI_EXTScanSetSSIDHotlistRspCb: callback for passing back the response
+ of the Req operation received from the device
+ pUserData: user data will be passed back with the callback
+
+ @return SUCCESS or FAIL
+*/
+WDI_Status
+WDI_EXTScanSetSSIDHotlistReq(
+ WDI_EXTScanSetSSIDHotlistReqParams* pwdiEXTScanSetSSIDHotlistReqParams,
+ WDI_EXTScanSetSSIDHotlistRspCb wdiEXTScanSetSSIDHotlistRspCb,
+ void* pUserData)
+{
+ WDI_EventInfoType wdiEventData;
+
+ VOS_TRACE( VOS_MODULE_ID_WDI, VOS_TRACE_LEVEL_INFO,
+ "%s: %d Enter ",__func__, __LINE__);
+ /*------------------------------------------------------------------------
+ Sanity Check
+ ------------------------------------------------------------------------*/
+ if ( eWLAN_PAL_FALSE == gWDIInitialized )
+ {
+ VOS_TRACE( VOS_MODULE_ID_WDI, VOS_TRACE_LEVEL_ERROR,
+ "WDI API call before module is initialized - Fail request");
+
+ return WDI_STATUS_E_NOT_ALLOWED;
+ }
+
+ wdiEventData.wdiRequest = WDI_EXTSCAN_SET_SSID_HOTLIST_REQ;
+ wdiEventData.pEventData = pwdiEXTScanSetSSIDHotlistReqParams;
+ wdiEventData.uEventDataSize = sizeof(*pwdiEXTScanSetSSIDHotlistReqParams);
+ wdiEventData.pCBfnc = wdiEXTScanSetSSIDHotlistRspCb;
+ wdiEventData.pUserData = pUserData;
+
+ return WDI_PostMainEvent(&gWDICb, WDI_REQUEST_EVENT, &wdiEventData);
+}
+
+/**
+ @brief WDI_ProcessEXTScanSetSSIDHotlistReq -
+ Extended Scan Set SSSID Hotlist Request to FW
+
+ @param pWDICtx : wdi context
+ pEventData : indication data
+
+ @see
+ @return none
+*/
+WDI_Status
+WDI_ProcessEXTScanSetSSIDHotlistReq
+(
+ WDI_ControlBlockType* pWDICtx,
+ WDI_EventInfoType* pEventData
+)
+{
+ WDI_EXTScanSetSSIDHotlistReqParams* pwdiEXTScanSetSSIDHotlistReqParams;
+ WDI_EXTScanSetSSIDHotlistRspCb wdiEXTScanSetSSIDHotlistRspCb;
+ wpt_uint8* pSendBuffer = NULL;
+ wpt_uint16 usSendSize = 0;
+ wpt_uint16 usDataOffset = 0;
+ tpHalSsidHotlistSetReq pHalSsidHotlistSetReqParams;
+ int i;
+
+ VOS_TRACE( VOS_MODULE_ID_WDI, VOS_TRACE_LEVEL_INFO,
+ "%s: %d Enter",__func__, __LINE__);
+
+ 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;
+ }
+
+ pwdiEXTScanSetSSIDHotlistReqParams =
+ (WDI_EXTScanSetSSIDHotlistReqParams *)pEventData->pEventData;
+ wdiEXTScanSetSSIDHotlistRspCb =
+ (WDI_EXTScanSetSSIDHotlistRspCb)pEventData->pCBfnc;
+
+ /*-----------------------------------------------------------------------
+ Get message buffer
+ ! TO DO : proper conversion into the HAL Message Request Format
+ -----------------------------------------------------------------------*/
+ if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer(
+ pWDICtx,
+ WDI_EXTSCAN_SET_SSID_HOTLIST_REQ,
+ sizeof(tHalSsidHotlistSetReq),
+ &pSendBuffer, &usDataOffset,
+ &usSendSize))||
+ ( usSendSize < (usDataOffset + sizeof(tHalSsidHotlistSetReq) )))
+ {
+ WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
+ "Unable to get send buffer in %s %p %p %p", __func__,
+ pEventData, pwdiEXTScanSetSSIDHotlistReqParams,
+ wdiEXTScanSetSSIDHotlistRspCb);
+ WDI_ASSERT(0);
+ return WDI_STATUS_E_FAILURE;
+ }
+ pHalSsidHotlistSetReqParams =
+ (tpHalSsidHotlistSetReq) (pSendBuffer + usDataOffset);
+
+ pHalSsidHotlistSetReqParams->requestId =
+ pwdiEXTScanSetSSIDHotlistReqParams->requestId;
+
+ pHalSsidHotlistSetReqParams->sessionId =
+ pwdiEXTScanSetSSIDHotlistReqParams->sessionId;
+
+ pHalSsidHotlistSetReqParams->lostSsidSampleSize =
+ pwdiEXTScanSetSSIDHotlistReqParams->lostSsidSampleSize;;
+
+ pHalSsidHotlistSetReqParams->numSsid =
+ pwdiEXTScanSetSSIDHotlistReqParams->numSsid;
+
+ for( i = 0; i < pHalSsidHotlistSetReqParams->numSsid; i++){
+
+ wpalMemoryZero(pHalSsidHotlistSetReqParams->ssid[i].ssid, 33);
+ wpalMemoryCopy(pHalSsidHotlistSetReqParams->ssid[i].ssid,
+ pwdiEXTScanSetSSIDHotlistReqParams->ssid[i].ssid.sSSID,
+ pwdiEXTScanSetSSIDHotlistReqParams->ssid[i].ssid.ucLength);
+
+ pHalSsidHotlistSetReqParams->ssid[i].lowRssiThreshold =
+ pwdiEXTScanSetSSIDHotlistReqParams->ssid[i].lowRssiThreshold;
+
+ pHalSsidHotlistSetReqParams->ssid[i].highRssiThreshold =
+ pwdiEXTScanSetSSIDHotlistReqParams->ssid[i].highRssiThreshold;
+
+ pHalSsidHotlistSetReqParams->ssid[i].band =
+ pwdiEXTScanSetSSIDHotlistReqParams->ssid[i].band;
+ }
+
+ VOS_TRACE( VOS_MODULE_ID_WDI, VOS_TRACE_LEVEL_INFO,
+ "ReqID %u sessionId %u numSsid %u lost_ssid_sample_size: %u",
+ pHalSsidHotlistSetReqParams->requestId,
+ pHalSsidHotlistSetReqParams->sessionId,
+ pHalSsidHotlistSetReqParams->numSsid,
+ pHalSsidHotlistSetReqParams->lostSsidSampleSize);
+
+ for( i = 0; i < pHalSsidHotlistSetReqParams->numSsid; i++){
+
+ VOS_TRACE( VOS_MODULE_ID_WDI, VOS_TRACE_LEVEL_INFO,
+ "%s %d %d) SSID = %s lowRssiThreshold %d highRssiThreshold %d band: %d",
+ __func__, __LINE__, i,
+ pHalSsidHotlistSetReqParams->ssid[i].ssid,
+ pHalSsidHotlistSetReqParams->ssid[i].lowRssiThreshold,
+ pHalSsidHotlistSetReqParams->ssid[i].highRssiThreshold,
+ pHalSsidHotlistSetReqParams->ssid[i].band);
+ }
+
+ pWDICtx->pReqStatusUserData = pEventData->pUserData;
+
+
+ /*-------------------------------------------------------------------------
+ Send EXTScan Stop Request to HAL
+ -------------------------------------------------------------------------*/
+ return WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize,
+ wdiEXTScanSetSSIDHotlistRspCb, pEventData->pUserData,
+ WDI_EXTSCAN_SET_HOTLIST_SSID_RSP);
+}
+
+/**
+ @brief WDI_EXTScanResetSSIDHotlistReq
+
+ @param WDI_EXTScanResetSSIDHotlistReqParams: Req parameter for the FW
+ WDI_EXTScanResetSSIDHotlistRspCb: callback for passing back the response
+ of the Req operation received from the device
+ pUserData: user data will be passed back with the callback
+
+ @return SUCCESS or FAIL
+*/
+WDI_Status
+WDI_EXTScanResetSSIDHotlistReq(
+ WDI_EXTScanResetSSIDHotlistReqParams* pwdiEXTScanResetSSIDHotlistReqParams,
+ WDI_EXTScanResetSSIDHotlistRspCb wdiEXTScanResetSSIDHotlistRspCb,
+ void* pUserData)
+{
+ WDI_EventInfoType wdiEventData;
+
+ VOS_TRACE( VOS_MODULE_ID_WDI, VOS_TRACE_LEVEL_INFO,
+ "%s: %d",__func__, __LINE__);
+ /*------------------------------------------------------------------------
+ Sanity Check
+ ------------------------------------------------------------------------*/
+ if ( eWLAN_PAL_FALSE == gWDIInitialized )
+ {
+ VOS_TRACE( VOS_MODULE_ID_WDI, VOS_TRACE_LEVEL_ERROR,
+ "WDI API call before module is initialized - Fail request");
+
+ return WDI_STATUS_E_NOT_ALLOWED;
+ }
+
+ wdiEventData.wdiRequest = WDI_EXTSCAN_RESET_SSID_HOTLIST_REQ;
+ wdiEventData.pEventData = pwdiEXTScanResetSSIDHotlistReqParams;
+ wdiEventData.uEventDataSize = sizeof(*pwdiEXTScanResetSSIDHotlistReqParams);
+ wdiEventData.pCBfnc = wdiEXTScanResetSSIDHotlistRspCb;
+ wdiEventData.pUserData = pUserData;
+
+ return WDI_PostMainEvent(&gWDICb, WDI_REQUEST_EVENT, &wdiEventData);
+}
+
+/**
+ @brief WDI_ProcessEXTScanResetSSIDHotlistReq -
+ Extended Scan reset SSID hotlist Request to FW
+
+ @param pWDICtx : wdi context
+ pEventData : indication data
+
+ @see
+ @return none
+*/
+WDI_Status
+WDI_ProcessEXTScanResetSSIDHotlistReq
+(
+ WDI_ControlBlockType* pWDICtx,
+ WDI_EventInfoType* pEventData
+)
+{
+ WDI_EXTScanResetSSIDHotlistReqParams* pwdiEXTScanResetSSIDHotlistReqParams;
+ WDI_EXTScanResetSSIDHotlistRspCb wdiEXTScanResetSSIDHotlistRspCb;
+ wpt_uint8* pSendBuffer = NULL;
+ wpt_uint16 usSendSize = 0;
+ wpt_uint16 usDataOffset = 0;
+ tpHalSsidHotlistResetReq pHalSsidHotlistResetReqParams;
+
+ VOS_TRACE( VOS_MODULE_ID_WDI, VOS_TRACE_LEVEL_INFO,
+ "%s: %d",__func__, __LINE__);
+
+ 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;
+ }
+
+ pwdiEXTScanResetSSIDHotlistReqParams =
+ (WDI_EXTScanResetSSIDHotlistReqParams *)pEventData->pEventData;
+ wdiEXTScanResetSSIDHotlistRspCb =
+ (WDI_EXTScanResetSSIDHotlistRspCb)pEventData->pCBfnc;
+
+ /*-----------------------------------------------------------------------
+ Get message buffer
+ ! TO DO : proper conversion into the HAL Message Request Format
+ -----------------------------------------------------------------------*/
+ if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer(
+ pWDICtx,
+ WDI_EXTSCAN_RESET_SSID_HOTLIST_REQ,
+ sizeof(tHalSsidHotlistResetReq),
+ &pSendBuffer, &usDataOffset,
+ &usSendSize))||
+ ( usSendSize < (usDataOffset + sizeof(tHalSsidHotlistResetReq) )))
+ {
+ WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
+ "Unable to get send buffer in %s %p %p %p", __func__,
+ pEventData, pwdiEXTScanResetSSIDHotlistReqParams,
+ wdiEXTScanResetSSIDHotlistRspCb);
+ WDI_ASSERT(0);
+ return WDI_STATUS_E_FAILURE;
+ }
+ pHalSsidHotlistResetReqParams =
+ (tpHalSsidHotlistResetReq) (pSendBuffer+usDataOffset);
+
+ pHalSsidHotlistResetReqParams->requestId =
+ pwdiEXTScanResetSSIDHotlistReqParams->requestId;
+
+ pWDICtx->pReqStatusUserData = pEventData->pUserData;
+
+ /*-------------------------------------------------------------------------
+ Send RESET_HOTLIST_SSID Request to HAL
+ -------------------------------------------------------------------------*/
+ return WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize,
+ wdiEXTScanResetSSIDHotlistRspCb, pEventData->pUserData,
+ WDI_EXTSCAN_RESET_HOTLIST_SSID_RSP);
+}
+
+
/**
@brief Process Extended Scan Start Rsp function (called when a response
is being received over the bus from HAL)
@@ -33761,6 +34122,110 @@
return WDI_STATUS_SUCCESS;
}
+
+/**
+ @brief Process Extended Scan Set hotlist SSID Rsp function (called when a
+ response is being received over the bus from HAL)
+
+ @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_ProcessEXTScanSetHotlistSSIDRsp
+(
+ WDI_ControlBlockType* pWDICtx,
+ WDI_EventInfoType* pEventData
+)
+{
+ WDI_EXTScanSetSSIDHotlistRspCb wdiEXTScanSetSSIDHotlistRspCb;
+
+ VOS_TRACE( VOS_MODULE_ID_WDI, VOS_TRACE_LEVEL_INFO,
+ "%s: %d ",__func__, __LINE__);
+
+
+ /*-------------------------------------------------------------------------
+ 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;
+ }
+
+ wdiEXTScanSetSSIDHotlistRspCb =
+ (WDI_EXTScanSetSSIDHotlistRspCb)pWDICtx->pfncRspCB;
+ if ( NULL == wdiEXTScanSetSSIDHotlistRspCb)
+ {
+ WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
+ "%s: Callback function Invalid", __func__);
+ WDI_ASSERT(0);
+ return WDI_STATUS_E_FAILURE;
+ }
+
+ wdiEXTScanSetSSIDHotlistRspCb(
+ (void *) pEventData->pEventData, pWDICtx->pRspCBUserData);
+
+ return WDI_STATUS_SUCCESS;
+}
+
+
+/**
+ @brief Process Extended Scan Reset Hotlist BSSID Rsp function (called
+ when a response is being received over the bus from HAL)
+
+ @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_ProcessEXTScanResetHotlistSSIDRsp
+(
+ WDI_ControlBlockType* pWDICtx,
+ WDI_EventInfoType* pEventData
+)
+{
+ WDI_EXTScanResetSSIDHotlistRspCb wdiEXTScanResetSSIDHotlistRspCb;
+
+ VOS_TRACE( VOS_MODULE_ID_WDI, VOS_TRACE_LEVEL_INFO,
+ "%s: %d ",__func__, __LINE__);
+
+
+ /*-------------------------------------------------------------------------
+ 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;
+ }
+
+ wdiEXTScanResetSSIDHotlistRspCb =
+ (WDI_EXTScanResetSSIDHotlistRspCb)pWDICtx->pfncRspCB;
+ if ( NULL == wdiEXTScanResetSSIDHotlistRspCb)
+ {
+ WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
+ "%s: Callback function Invalid", __func__);
+ WDI_ASSERT(0);
+ return WDI_STATUS_E_FAILURE;
+ }
+
+ wdiEXTScanResetSSIDHotlistRspCb(
+ (void *) pEventData->pEventData, pWDICtx->pRspCBUserData);
+
+ return WDI_STATUS_SUCCESS;
+}
+
#endif /* WLAN_FEATURE_EXTSCAN */
/**
diff --git a/riva/inc/wlan_hal_msg.h b/riva/inc/wlan_hal_msg.h
index 49aecb9..60b579f 100644
--- a/riva/inc/wlan_hal_msg.h
+++ b/riva/inc/wlan_hal_msg.h
@@ -127,6 +127,7 @@
#define WLAN_HAL_EXT_SCAN_MAX_CHANNELS 16
#define WLAN_HAL_EXT_SCAN_MAX_BUCKETS 16
#define WLAN_HAL_EXT_SCAN_MAX_HOTLIST_APS 128
+
#define WLAN_HAL_EXT_SCAN_MAX_RSSI_SAMPLE_SIZE 8
/* For Logging enhancement feature currently max 2 address will be passed */
@@ -8038,13 +8039,19 @@
tExtScanChannelBandMask channelBand;
/* period (milliseconds) for each bucket defines the periodicity of bucket */
tANI_U32 period;
- /* 0 => normal reporting (reporting rssi history only,
- when rssi history buffer is % full)
- * 1 => same as 0 + report a scan completion event after scanning this bucket
- * 2 => same as 1 + forward scan results (beacons/probe responses + IEs) in
- real time to HAL (Required for L = P0)
- * 3 => same as 2 + forward scan results (beacons/probe responses + IEs) in
- real time to host (Not required for L = P3) */
+ /* This is a bit field; which defines following bits -
+ * REPORT_EVENTS_BUFFER_FULL => report only when scan history
+ is % full
+ * REPORT_EVENTS_EACH_SCAN => report a scan completion event
+ after scan
+ * REPORT_EVENTS_FULL_RESULTS => forward scan results
+ (beacons/probe responses + IEs) in real time to HAL, in addition
+ to completion events
+ Note: To keep backward compatibility, fire completion events
+ regardless of REPORT_EVENTS_EACH_SCAN.
+ * REPORT_EVENTS_NO_BATCH => controls batching,
+ 0 => batching, 1 => no batching
+ */
tANI_U8 reportEvents;
/* number of channels */
tANI_U8 numChannels;
@@ -8374,7 +8381,6 @@
tANI_U8 bssHotlist[1];
}tHalHotlistResultIndMsg, *tpHalHotlistResultIndMsg;
-
/*---------------------------------------------------------------------------
*WLAN_HAL_MAC_SPOOFED_SCAN_REQ
*--------------------------------------------------------------------------*/