wlan: Changes for supporting RSSI Monitoring feature
Framework should get a indication whenever AP breaches rssi range.
Add support to set the rssi range in FW and forward the breach
event from FW to framework.
Change-Id: I08248d15fde966aad2ba54614d444b7310b3775a
CRs-Fixed: 916888
diff --git a/CORE/HDD/inc/wlan_hdd_cfg80211.h b/CORE/HDD/inc/wlan_hdd_cfg80211.h
index abbabe6..f4072f1 100644
--- a/CORE/HDD/inc/wlan_hdd_cfg80211.h
+++ b/CORE/HDD/inc/wlan_hdd_cfg80211.h
@@ -177,6 +177,8 @@
QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_HOTLIST_SSID_LOST = 68,
QCA_NL80211_VENDOR_SUBCMD_GET_RING_DATA = 77,
+ QCA_NL80211_VENDOR_SUBCMD_MONITOR_RSSI = 80,
+
QCA_NL80211_VENDOR_SUBCMD_SETBAND = 105,
};
@@ -211,6 +213,8 @@
QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_RESET_SSID_HOTLIST_INDEX,
QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_HOTLIST_SSID_FOUND_INDEX,
QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_HOTLIST_SSID_LOST_INDEX,
+
+ QCA_NL80211_VENDOR_SUBCMD_MONITOR_RSSI_INDEX,
};
enum qca_wlan_vendor_attr
@@ -1123,6 +1127,49 @@
} tHddAvoidFreqList;
#endif /* FEATURE_WLAN_CH_AVOID */
+
+/**
+ * enum qca_wlan_rssi_monitoring_control - rssi control commands
+ * @QCA_WLAN_RSSI_MONITORING_CONTROL_INVALID: invalid
+ * @QCA_WLAN_RSSI_MONITORING_START: rssi monitoring start
+ * @QCA_WLAN_RSSI_MONITORING_STOP: rssi monitoring stop
+ */
+enum qca_wlan_rssi_monitoring_control {
+ QCA_WLAN_RSSI_MONITORING_CONTROL_INVALID = 0,
+ QCA_WLAN_RSSI_MONITORING_START,
+ QCA_WLAN_RSSI_MONITORING_STOP,
+};
+
+/**
+ * enum qca_wlan_vendor_attr_rssi_monitoring - rssi monitoring
+ * @QCA_WLAN_VENDOR_ATTR_RSSI_MONITORING_INVALID: Invalid
+ * @QCA_WLAN_VENDOR_ATTR_RSSI_MONITORING_CONTROL: control
+ * @QCA_WLAN_VENDOR_ATTR_RSSI_MONITORING_MAX_RSSI: max rssi
+ * @QCA_WLAN_VENDOR_ATTR_RSSI_MONITORING_MIN_RSSI: min rssi
+ * @QCA_WLAN_VENDOR_ATTR_RSSI_MONITORING_CUR_BSSID: current bssid
+ * @QCA_WLAN_VENDOR_ATTR_RSSI_MONITORING_CUR_RSSI: current rssi
+ * @QCA_WLAN_VENDOR_ATTR_RSSI_MONITORING_AFTER_LAST: after last
+ * @QCA_WLAN_VENDOR_ATTR_RSSI_MONITORING_MAX: max
+ */
+enum qca_wlan_vendor_attr_rssi_monitoring {
+ QCA_WLAN_VENDOR_ATTR_RSSI_MONITORING_INVALID = 0,
+
+ QCA_WLAN_VENDOR_ATTR_RSSI_MONITORING_CONTROL,
+ QCA_WLAN_VENDOR_ATTR_RSSI_MONITORING_REQUEST_ID,
+
+ QCA_WLAN_VENDOR_ATTR_RSSI_MONITORING_MAX_RSSI,
+ QCA_WLAN_VENDOR_ATTR_RSSI_MONITORING_MIN_RSSI,
+
+ /* attributes to be used/received in callback */
+ QCA_WLAN_VENDOR_ATTR_RSSI_MONITORING_CUR_BSSID,
+ QCA_WLAN_VENDOR_ATTR_RSSI_MONITORING_CUR_RSSI,
+
+ /* keep last */
+ QCA_WLAN_VENDOR_ATTR_RSSI_MONITORING_AFTER_LAST,
+ QCA_WLAN_VENDOR_ATTR_RSSI_MONITORING_MAX =
+ QCA_WLAN_VENDOR_ATTR_RSSI_MONITORING_AFTER_LAST - 1,
+};
+
struct cfg80211_bss* wlan_hdd_cfg80211_update_bss_db( hdd_adapter_t *pAdapter,
tCsrRoamInfo *pRoamInfo
);
@@ -1213,6 +1260,9 @@
void *pMsg);
#endif /* WLAN_FEATURE_EXTSCAN */
+void hdd_rssi_threshold_breached_cb(void *hddctx,
+ struct rssi_breach_event *data);
+
void wlan_hdd_cfg80211_nan_init(hdd_context_t *pHddCtx);
#if !(defined (SUPPORT_WDEV_CFG80211_VENDOR_EVENT_ALLOC))
diff --git a/CORE/HDD/src/wlan_hdd_cfg80211.c b/CORE/HDD/src/wlan_hdd_cfg80211.c
index 6e1e29d..9840645 100644
--- a/CORE/HDD/src/wlan_hdd_cfg80211.c
+++ b/CORE/HDD/src/wlan_hdd_cfg80211.c
@@ -6201,6 +6201,301 @@
}
+/*
+ * define short names for the global vendor params
+ * used by __wlan_hdd_cfg80211_monitor_rssi()
+ */
+#define PARAM_MAX QCA_WLAN_VENDOR_ATTR_RSSI_MONITORING_MAX
+#define PARAM_REQUEST_ID QCA_WLAN_VENDOR_ATTR_RSSI_MONITORING_REQUEST_ID
+#define PARAM_CONTROL QCA_WLAN_VENDOR_ATTR_RSSI_MONITORING_CONTROL
+#define PARAM_MIN_RSSI QCA_WLAN_VENDOR_ATTR_RSSI_MONITORING_MIN_RSSI
+#define PARAM_MAX_RSSI QCA_WLAN_VENDOR_ATTR_RSSI_MONITORING_MAX_RSSI
+
+/**---------------------------------------------------------------------------
+
+ \brief hdd_rssi_monitor_start_done - callback to be executed when rssi
+ monitor start is completed successfully.
+
+ \return - None
+
+ --------------------------------------------------------------------------*/
+void hdd_rssi_monitor_start_done(void *fwRssiMonitorCbContext, VOS_STATUS status)
+{
+ hdd_context_t* pHddCtx = (hdd_context_t*)fwRssiMonitorCbContext;
+
+ if (NULL == pHddCtx)
+ {
+ hddLog(VOS_TRACE_LEVEL_ERROR,
+ "%s: HDD context is NULL",__func__);
+ return;
+ }
+
+ if (VOS_STATUS_SUCCESS == status)
+ {
+ hddLog(VOS_TRACE_LEVEL_INFO, FL("Rssi Monitor start successful"));
+ }
+ else
+ {
+ hddLog(VOS_TRACE_LEVEL_ERROR, FL("Rssi Monitor start not successful"));
+ }
+
+ return;
+}
+
+/**---------------------------------------------------------------------------
+
+ \brief hdd_rssi_monitor_stop_done - callback to be executed when rssi monitor
+ stop is completed successfully.
+
+ \return - None
+
+ --------------------------------------------------------------------------*/
+void hdd_rssi_monitor_stop_done(void *fwRssiMonitorCbContext, VOS_STATUS status)
+{
+ hdd_context_t* pHddCtx = (hdd_context_t*)fwRssiMonitorCbContext;
+
+ if (NULL == pHddCtx)
+ {
+ hddLog(VOS_TRACE_LEVEL_ERROR,
+ "%s: HDD context is NULL",__func__);
+ return;
+ }
+
+ if (VOS_STATUS_SUCCESS == status)
+ {
+ hddLog(VOS_TRACE_LEVEL_INFO, FL("Rssi Monitor stop successful"));
+ }
+ else
+ {
+ hddLog(VOS_TRACE_LEVEL_ERROR, FL("Rssi Monitor stop not successful"));
+ }
+
+ return;
+}
+
+/**
+ * __wlan_hdd_cfg80211_monitor_rssi() - monitor rssi
+ * @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_monitor_rssi(struct wiphy *wiphy,
+ struct wireless_dev *wdev,
+ const void *data,
+ int data_len)
+{
+ struct net_device *dev = wdev->netdev;
+ hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
+ hdd_context_t *hdd_ctx = wiphy_priv(wiphy);
+ hdd_station_ctx_t *pHddStaCtx;
+ struct nlattr *tb[PARAM_MAX + 1];
+ tpSirRssiMonitorReq pReq;
+ eHalStatus status;
+ int ret;
+ uint32_t control;
+ static const struct nla_policy policy[PARAM_MAX + 1] = {
+ [PARAM_REQUEST_ID] = { .type = NLA_U32 },
+ [PARAM_CONTROL] = { .type = NLA_U32 },
+ [PARAM_MIN_RSSI] = { .type = NLA_S8 },
+ [PARAM_MAX_RSSI] = { .type = NLA_S8 },
+ };
+
+ ENTER();
+
+ ret = wlan_hdd_validate_context(hdd_ctx);
+ if (0 != ret) {
+ return -EINVAL;
+ }
+
+ if (!hdd_connIsConnected(WLAN_HDD_GET_STATION_CTX_PTR(pAdapter))) {
+ hddLog(LOGE, FL("Not in Connected state!"));
+ return -ENOTSUPP;
+ }
+
+ if (nla_parse(tb, PARAM_MAX, data, data_len, policy)) {
+ hddLog(LOGE, FL("Invalid ATTR"));
+ return -EINVAL;
+ }
+
+ if (!tb[PARAM_REQUEST_ID]) {
+ hddLog(LOGE, FL("attr request id failed"));
+ return -EINVAL;
+ }
+
+ if (!tb[PARAM_CONTROL]) {
+ hddLog(LOGE, FL("attr control failed"));
+ return -EINVAL;
+ }
+
+ pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);
+
+ pReq = vos_mem_malloc(sizeof(tSirRssiMonitorReq));
+ if(NULL == pReq)
+ {
+ hddLog(LOGE,
+ FL("vos_mem_alloc failed "));
+ return eHAL_STATUS_FAILED_ALLOC;
+ }
+ vos_mem_set(pReq, sizeof(tSirRssiMonitorReq), 0);
+
+ pReq->requestId = nla_get_u32(tb[PARAM_REQUEST_ID]);
+ pReq->sessionId = pAdapter->sessionId;
+ pReq->rssiMonitorCbContext = hdd_ctx;
+ control = nla_get_u32(tb[PARAM_CONTROL]);
+ vos_mem_copy( &pReq->currentBssId, pHddStaCtx->conn_info.bssId, WNI_CFG_BSSID_LEN);
+
+ hddLog(LOG1, FL("Request Id: %u Session_id: %d Control: %d"),
+ pReq->requestId, pReq->sessionId, control);
+
+ if (control == QCA_WLAN_RSSI_MONITORING_START) {
+ if (!tb[PARAM_MIN_RSSI]) {
+ hddLog(LOGE, FL("attr min rssi failed"));
+ return -EINVAL;
+ }
+
+ if (!tb[PARAM_MAX_RSSI]) {
+ hddLog(LOGE, FL("attr max rssi failed"));
+ return -EINVAL;
+ }
+
+ pReq->minRssi = nla_get_s8(tb[PARAM_MIN_RSSI]);
+ pReq->maxRssi = nla_get_s8(tb[PARAM_MAX_RSSI]);
+ pReq->rssiMonitorCallback = hdd_rssi_monitor_start_done;
+
+ if (!(pReq->minRssi < pReq->maxRssi)) {
+ hddLog(LOGW, FL("min_rssi: %d must be less than max_rssi: %d"),
+ pReq->minRssi, pReq->maxRssi);
+ return -EINVAL;
+ }
+ hddLog(LOG1, FL("Min_rssi: %d Max_rssi: %d"),
+ pReq->minRssi, pReq->maxRssi);
+ status = sme_StartRssiMonitoring(hdd_ctx->hHal, pReq);
+
+ }
+ else if (control == QCA_WLAN_RSSI_MONITORING_STOP) {
+ pReq->rssiMonitorCallback = hdd_rssi_monitor_stop_done;
+ status = sme_StopRssiMonitoring(hdd_ctx->hHal, pReq);
+ }
+ else {
+ hddLog(LOGE, FL("Invalid control cmd: %d"), control);
+ return -EINVAL;
+ }
+
+ if (!HAL_STATUS_SUCCESS(status)) {
+ hddLog(LOGE,
+ FL("sme_set_rssi_monitoring failed(err=%d)"), status);
+ return -EINVAL;
+ }
+
+ return 0;
+}
+
+/*
+ * done with short names for the global vendor params
+ * used by __wlan_hdd_cfg80211_monitor_rssi()
+ */
+#undef PARAM_MAX
+#undef PARAM_CONTROL
+#undef PARAM_REQUEST_ID
+#undef PARAM_MAX_RSSI
+#undef PARAM_MIN_RSSI
+
+/**
+ * wlan_hdd_cfg80211_monitor_rssi() - SSR wrapper to rssi monitoring
+ * @wiphy: wiphy structure pointer
+ * @wdev: Wireless device structure pointer
+ * @data: Pointer to the data received
+ * @data_len: Length of @data
+ *
+ * Return: 0 on success; errno on failure
+ */
+static int
+wlan_hdd_cfg80211_monitor_rssi(struct wiphy *wiphy, struct wireless_dev *wdev,
+ const void *data, int data_len)
+{
+ int ret;
+
+ vos_ssr_protect(__func__);
+ ret = __wlan_hdd_cfg80211_monitor_rssi(wiphy, wdev, data, data_len);
+ vos_ssr_unprotect(__func__);
+
+ return ret;
+}
+
+/**
+ * hdd_rssi_threshold_breached_cb() - rssi breached NL event
+ * @hddctx: HDD context
+ * @data: rssi breached event data
+ *
+ * This function reads the rssi breached event %data and fill in the skb with
+ * NL attributes and send up the NL event.
+ * This callback execute in atomic context and must not invoke any
+ * blocking calls.
+ *
+ * Return: none
+ */
+void hdd_rssi_threshold_breached_cb(void *hddctx,
+ struct rssi_breach_event *data)
+{
+ hdd_context_t *pHddCtx = (hdd_context_t *)hddctx;
+ int status;
+ struct sk_buff *skb;
+
+ ENTER();
+ status = wlan_hdd_validate_context(pHddCtx);
+
+ if (0 != status) {
+ return;
+ }
+
+ if (!data) {
+ hddLog(LOGE, FL("data is null"));
+ return;
+ }
+
+ skb = cfg80211_vendor_event_alloc(pHddCtx->wiphy,
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 18, 0))
+ NULL,
+#endif
+ EXTSCAN_EVENT_BUF_SIZE + NLMSG_HDRLEN,
+ QCA_NL80211_VENDOR_SUBCMD_MONITOR_RSSI_INDEX,
+ GFP_KERNEL);
+
+ if (!skb) {
+ hddLog(LOGE, FL("cfg80211_vendor_event_alloc failed"));
+ return;
+ }
+
+ hddLog(LOG1, "Req Id: %u Current rssi: %d",
+ data->request_id, data->curr_rssi);
+ hddLog(LOG1, "Current BSSID: "MAC_ADDRESS_STR,
+ MAC_ADDR_ARRAY(data->curr_bssid.bytes));
+
+ if (nla_put_u32(skb, QCA_WLAN_VENDOR_ATTR_RSSI_MONITORING_REQUEST_ID,
+ data->request_id) ||
+ nla_put(skb, QCA_WLAN_VENDOR_ATTR_RSSI_MONITORING_CUR_BSSID,
+ sizeof(data->curr_bssid), data->curr_bssid.bytes) ||
+ nla_put_s8(skb, QCA_WLAN_VENDOR_ATTR_RSSI_MONITORING_CUR_RSSI,
+ data->curr_rssi)) {
+ hddLog(LOGE, FL("nla put fail"));
+ goto fail;
+ }
+
+ cfg80211_vendor_event(skb, GFP_KERNEL);
+ return;
+
+fail:
+ kfree_skb(skb);
+ return;
+}
+
+
+
/**
* __wlan_hdd_cfg80211_setband() - set band
* @wiphy: Pointer to wireless phy
@@ -6486,6 +6781,14 @@
WIPHY_VENDOR_CMD_NEED_NETDEV |
WIPHY_VENDOR_CMD_NEED_RUNNING,
.doit = wlan_hdd_cfg80211_wifi_logger_get_ring_data
+ },
+ {
+ .info.vendor_id = QCA_NL80211_VENDOR_ID,
+ .info.subcmd = QCA_NL80211_VENDOR_SUBCMD_MONITOR_RSSI,
+ .flags = WIPHY_VENDOR_CMD_NEED_WDEV |
+ WIPHY_VENDOR_CMD_NEED_NETDEV |
+ WIPHY_VENDOR_CMD_NEED_RUNNING,
+ .doit = wlan_hdd_cfg80211_monitor_rssi
}
};
@@ -6608,8 +6911,11 @@
{
.vendor_id = QCA_NL80211_VENDOR_ID,
.subcmd = QCA_NL80211_VENDOR_SUBCMD_GET_WIFI_INFO,
- }
-
+ },
+ [QCA_NL80211_VENDOR_SUBCMD_MONITOR_RSSI_INDEX] = {
+ .vendor_id = QCA_NL80211_VENDOR_ID,
+ .subcmd = QCA_NL80211_VENDOR_SUBCMD_MONITOR_RSSI
+ },
};
diff --git a/CORE/HDD/src/wlan_hdd_early_suspend.c b/CORE/HDD/src/wlan_hdd_early_suspend.c
index 06be08b..9bacff4 100644
--- a/CORE/HDD/src/wlan_hdd_early_suspend.c
+++ b/CORE/HDD/src/wlan_hdd_early_suspend.c
@@ -2276,6 +2276,7 @@
__func__);
goto err_unregister_pmops;
}
+ sme_set_rssi_threshold_breached_cb(pHddCtx->hHal, hdd_rssi_threshold_breached_cb);
vos_set_reinit_in_progress(VOS_MODULE_ID_VOSS, FALSE);
#ifdef WLAN_FEATURE_EXTSCAN
sme_EXTScanRegisterCallback(pHddCtx->hHal,
diff --git a/CORE/HDD/src/wlan_hdd_main.c b/CORE/HDD/src/wlan_hdd_main.c
index d0d70bf..e0a34f5 100755
--- a/CORE/HDD/src/wlan_hdd_main.c
+++ b/CORE/HDD/src/wlan_hdd_main.c
@@ -10394,6 +10394,7 @@
pHddCtx);
#endif /* WLAN_FEATURE_EXTSCAN */
+ sme_set_rssi_threshold_breached_cb(pHddCtx->hHal, hdd_rssi_threshold_breached_cb);
#ifdef WLAN_NS_OFFLOAD
// Register IPv6 notifier to notify if any change in IP
// So that we can reconfigure the offload parameters
diff --git a/CORE/MAC/inc/sirApi.h b/CORE/MAC/inc/sirApi.h
index 2293f5a..5f88449 100644
--- a/CORE/MAC/inc/sirApi.h
+++ b/CORE/MAC/inc/sirApi.h
@@ -3756,6 +3756,7 @@
typedef void(*FWLoggingInitReqCb)(void *fwlogInitCbContext, tAniLoggingInitRsp *pRsp);
typedef void ( *tGetFrameLogCallback) (void *pContext);
+typedef void(*RssiMonitorReqCb)(void *rssiMonitorCbContext, VOS_STATUS status);
typedef struct sAniGetFrameLogReq
{
@@ -3778,6 +3779,39 @@
void *fwlogInitCbContext;
}tSirFWLoggingInitParam,*tpSirFWLoggingInitParam;
+
+/*
+ * struct rssi_monitor_req - rssi monitoring
+ * @request_id: request id
+ * @session_id: session id
+ * @min_rssi: minimum rssi
+ * @max_rssi: maximum rssi
+ * @control: flag to indicate start or stop
+ */
+typedef struct sSirRssiMonitorReq
+{
+ tANI_U32 requestId;
+ tANI_U32 sessionId;
+ tANI_S8 minRssi;
+ tANI_S8 maxRssi;
+ tANI_U8 currentBssId[6];
+ RssiMonitorReqCb rssiMonitorCallback;
+ void *rssiMonitorCbContext;
+}tSirRssiMonitorReq, *tpSirRssiMonitorReq;
+
+
+/**
+ * struct rssi_breach_event - rssi breached event structure
+ * @request_id: request id
+ * @curr_rssi: current rssi
+ * @curr_bssid: current bssid
+ */
+struct rssi_breach_event {
+ tANI_U32 request_id;
+ v_MACADDR_t curr_bssid;
+ tANI_S8 curr_rssi;
+};
+
typedef struct sSirFatalEventLogsReqParam
{
tANI_U32 reason_code;
diff --git a/CORE/MAC/src/include/sirParams.h b/CORE/MAC/src/include/sirParams.h
index 7954ce0..428909d 100644
--- a/CORE/MAC/src/include/sirParams.h
+++ b/CORE/MAC/src/include/sirParams.h
@@ -720,8 +720,10 @@
#define SIR_HAL_SEND_LOG_DONE_IND (SIR_HAL_ITC_MSG_TYPES_BEGIN + 273)
#define SIR_HAL_LOST_LINK_PARAMS_IND (SIR_HAL_ITC_MSG_TYPES_BEGIN + 274)
#define SIR_HAL_SEND_FREQ_RANGE_CONTROL_IND (SIR_HAL_ITC_MSG_TYPES_BEGIN + 275)
+#define SIR_HAL_FW_MEM_DUMP_REQ (SIR_HAL_ITC_MSG_TYPES_BEGIN + 276)
+#define SIR_HAL_RSSI_MON_START_REQ (SIR_HAL_ITC_MSG_TYPES_BEGIN + 277)
+#define SIR_HAL_RSSI_MON_STOP_REQ (SIR_HAL_ITC_MSG_TYPES_BEGIN + 278)
-#define SIR_HAL_FW_MEM_DUMP_REQ (SIR_HAL_ITC_MSG_TYPES_BEGIN + 275)
#define SIR_HAL_MSG_TYPES_END (SIR_HAL_MSG_TYPES_BEGIN + 0x1FF)
diff --git a/CORE/SME/inc/smeInternal.h b/CORE/SME/inc/smeInternal.h
index b4dd819..7ca02b5 100644
--- a/CORE/SME/inc/smeInternal.h
+++ b/CORE/SME/inc/smeInternal.h
@@ -165,6 +165,7 @@
tSmeEncMsgHddCbkInfo pEncMsgInfoParams;
void (*pBtCoexTDLSNotification) (void *pAdapter, int);
void (*nanCallback) (void*, tSirNanEvent*);
+ void (*rssiThresholdBreachedCb)(void *, struct rssi_breach_event *);
} tSmeStruct, *tpSmeStruct;
diff --git a/CORE/SME/inc/sme_Api.h b/CORE/SME/inc/sme_Api.h
index b6a4d8b..8ce6cf8 100644
--- a/CORE/SME/inc/sme_Api.h
+++ b/CORE/SME/inc/sme_Api.h
@@ -2217,6 +2217,48 @@
eHalStatus sme_InitMgmtFrameLogging( tHalHandle hHal,
tpSirFWLoggingInitParam wlanFWLoggingInitParam);
+
+/* ---------------------------------------------------------------------------
+
+ \fn sme_StopRssiMonitoring
+
+ \brief
+ SME will pass this request to lower mac to stop monitoring rssi range on
+ a bssid.
+
+ \param
+
+ hHal - The handle returned by macOpen.
+
+ tSirRssiMonitorReq req- depict the monitor req params.
+
+ \return eHalStatus
+
+--------------------------------------------------------------------------- */
+eHalStatus sme_StopRssiMonitoring(tHalHandle hHal,
+ tSirRssiMonitorReq *req);
+
+/* ---------------------------------------------------------------------------
+
+ \fn sme_StartRssiMonitoring
+
+ \brief
+ SME will pass this request to lower mac to start monitoring rssi range on
+ a bssid.
+
+ \param
+
+ hHal - The handle returned by macOpen.
+
+ tSirRssiMonitorReq req- depict the monitor req params.
+
+ \return eHalStatus
+
+--------------------------------------------------------------------------- */
+eHalStatus sme_StartRssiMonitoring(tHalHandle hHal,
+ tSirRssiMonitorReq *req);
+
+
/* ---------------------------------------------------------------------------
\fn sme_ConfigureRxpFilter
@@ -3658,6 +3700,9 @@
tANI_U8 sessionId, tANI_U8 cbMode);
#endif
+eHalStatus sme_set_rssi_threshold_breached_cb(tHalHandle hal,
+ void (*cb)(void *, struct rssi_breach_event *));
+
void sme_disable_dfs_channel(tHalHandle hHal, bool disable_dfs);
/* HDD Callback function */
diff --git a/CORE/SME/src/sme_common/sme_Api.c b/CORE/SME/src/sme_common/sme_Api.c
index dc2463b..1b2266a 100644
--- a/CORE/SME/src/sme_common/sme_Api.c
+++ b/CORE/SME/src/sme_common/sme_Api.c
@@ -7655,6 +7655,91 @@
}
return(status);
}
+/* ---------------------------------------------------------------------------
+
+ \fn sme_StartRssiMonitoring
+
+ \brief
+ SME will pass this request to lower mac to start monitoring rssi range on
+ a bssid.
+
+ \param
+
+ hHal - The handle returned by macOpen.
+
+ tSirRssiMonitorReq req- depict the monitor req params.
+
+ \return eHalStatus
+
+--------------------------------------------------------------------------- */
+eHalStatus sme_StartRssiMonitoring( tHalHandle hHal,
+ tSirRssiMonitorReq *req)
+{
+ eHalStatus status = eHAL_STATUS_SUCCESS;
+ VOS_STATUS vosStatus = VOS_STATUS_SUCCESS;
+ tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
+ vos_msg_t vosMessage;
+
+ if ( eHAL_STATUS_SUCCESS == ( status =
+ sme_AcquireGlobalLock( &pMac->sme ) ) )
+ {
+ /* serialize the req through MC thread */
+ vosMessage.bodyptr = req;
+ vosMessage.type = WDA_START_RSSI_MONITOR_REQ;
+ MTRACE(vos_trace(VOS_MODULE_ID_SME,
+ TRACE_CODE_SME_TX_WDA_MSG, NO_SESSION, vosMessage.type));
+ vosStatus = vos_mq_post_message( VOS_MQ_ID_WDA, &vosMessage );
+ if ( !VOS_IS_STATUS_SUCCESS(vosStatus) )
+ {
+ status = eHAL_STATUS_FAILURE;
+ }
+ sme_ReleaseGlobalLock( &pMac->sme );
+ }
+ return(status);
+}
+
+/* ---------------------------------------------------------------------------
+
+ \fn sme_StopRssiMonitoring
+
+ \brief
+ SME will pass this request to lower mac to stop monitoring rssi range on
+ a bssid.
+
+ \param
+
+ hHal - The handle returned by macOpen.
+
+ tSirRssiMonitorReq req- depict the monitor req params.
+
+ \return eHalStatus
+
+--------------------------------------------------------------------------- */
+eHalStatus sme_StopRssiMonitoring(tHalHandle hHal,
+ tSirRssiMonitorReq *req)
+{
+ eHalStatus status = eHAL_STATUS_SUCCESS;
+ VOS_STATUS vosStatus = VOS_STATUS_SUCCESS;
+ tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
+ vos_msg_t vosMessage;
+
+ if ( eHAL_STATUS_SUCCESS == ( status =
+ sme_AcquireGlobalLock( &pMac->sme ) ) )
+ {
+ /* serialize the req through MC thread */
+ vosMessage.bodyptr = req;
+ vosMessage.type = WDA_STOP_RSSI_MONITOR_REQ;
+ MTRACE(vos_trace(VOS_MODULE_ID_SME,
+ TRACE_CODE_SME_TX_WDA_MSG, NO_SESSION, vosMessage.type));
+ vosStatus = vos_mq_post_message( VOS_MQ_ID_WDA, &vosMessage );
+ if ( !VOS_IS_STATUS_SUCCESS(vosStatus) )
+ {
+ status = eHAL_STATUS_FAILURE;
+ }
+ sme_ReleaseGlobalLock( &pMac->sme );
+ }
+ return(status);
+}
/* ---------------------------------------------------------------------------
@@ -11827,6 +11912,35 @@
}
#endif /* FEATURE_WLAN_CH_AVOID */
+
+/**
+ * sme_set_rssi_threshold_breached_cb() - set rssi threshold breached callback
+ * @hal: global hal handle
+ * @cb: callback function pointer
+ *
+ * This function stores the rssi threshold breached callback function.
+ *
+ * Return: eHalStatus enumeration.
+ */
+eHalStatus sme_set_rssi_threshold_breached_cb(tHalHandle hal,
+ void (*cb)(void *, struct rssi_breach_event *))
+{
+ eHalStatus status = eHAL_STATUS_SUCCESS;
+ tpAniSirGlobal mac = PMAC_STRUCT(hal);
+
+ status = sme_AcquireGlobalLock(&mac->sme);
+ if (status != eHAL_STATUS_SUCCESS) {
+ smsLog(mac, LOGE,
+ FL("sme_AcquireGlobalLock failed!(status=%d)"),
+ status);
+ return status;
+ }
+
+ mac->sme.rssiThresholdBreachedCb = cb;
+ sme_ReleaseGlobalLock(&mac->sme);
+ return status;
+}
+
#ifdef WLAN_FEATURE_LINK_LAYER_STATS
/* ---------------------------------------------------------------------------
diff --git a/CORE/WDA/inc/wlan_qct_wda.h b/CORE/WDA/inc/wlan_qct_wda.h
index 35c162f..381d879 100644
--- a/CORE/WDA/inc/wlan_qct_wda.h
+++ b/CORE/WDA/inc/wlan_qct_wda.h
@@ -1259,6 +1259,8 @@
#define WDA_SET_RTS_CTS_HTVHT SIR_HAL_SET_RTS_CTS_HTVHT
#define WDA_MON_START_REQ SIR_HAL_MON_START_REQ
#define WDA_MON_STOP_REQ SIR_HAL_MON_STOP_REQ
+#define WDA_START_RSSI_MONITOR_REQ SIR_HAL_RSSI_MON_START_REQ
+#define WDA_STOP_RSSI_MONITOR_REQ SIR_HAL_RSSI_MON_STOP_REQ
tSirRetStatus wdaPostCtrlMsg(tpAniSirGlobal pMac, tSirMsgQ *pMsg);
diff --git a/CORE/WDA/src/wlan_qct_wda.c b/CORE/WDA/src/wlan_qct_wda.c
index 562229c..2a714dd 100644
--- a/CORE/WDA/src/wlan_qct_wda.c
+++ b/CORE/WDA/src/wlan_qct_wda.c
@@ -5572,6 +5572,109 @@
return ;
}
+
+/*
+ * FUNCTION: WDA_RssiMonitorStopRspCallback
+ * recieves Rssi Monitor stop response from FW
+ */
+void WDA_RssiMonitorStopRspCallback(WDI_RssiMonitorStopRspParamType *wdiRsp,
+ void* pUserData)
+{
+ tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
+ tSirRssiMonitorReq *pRssiMonitorReqParams;
+
+ 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 ;
+ }
+
+ if(NULL == pWdaParams->wdaMsgParam)
+ {
+ VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
+ "%s: pWdaParams->wdaMsgParam is NULL", __func__);
+ VOS_ASSERT(0);
+ vos_mem_free(pWdaParams);
+ return ;
+ }
+
+ pRssiMonitorReqParams = (tSirRssiMonitorReq *)pWdaParams->wdaMsgParam;
+
+ if(pRssiMonitorReqParams->rssiMonitorCallback)
+ {
+ pRssiMonitorReqParams->rssiMonitorCallback(
+ pRssiMonitorReqParams->rssiMonitorCbContext,
+ CONVERT_WDI2VOS_STATUS(wdiRsp->status));
+ }
+ else
+ {
+ VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
+ "%s: pFWLoggingInitParams callback is NULL", __func__);
+ }
+
+ vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
+ vos_mem_free(pWdaParams->wdaMsgParam);
+ vos_mem_free(pWdaParams);
+
+ return;
+}
+
+/*
+ * FUNCTION: WDA_RssiMonitorStartRspCallback
+ * recieves Rssi Monitor start response from FW
+ */
+void WDA_RssiMonitorStartRspCallback(WDI_RssiMonitorStartRspParamType* wdiRsp,
+ void* pUserData)
+{
+ tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
+ tSirRssiMonitorReq *pRssiMonitorReqParams;
+
+ 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 ;
+ }
+
+ if(NULL == pWdaParams->wdaMsgParam)
+ {
+ VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
+ "%s: pWdaParams->wdaMsgParam is NULL", __func__);
+ VOS_ASSERT(0);
+ vos_mem_free(pWdaParams);
+ return ;
+ }
+
+ pRssiMonitorReqParams = (tSirRssiMonitorReq *)pWdaParams->wdaMsgParam;
+
+ if(pRssiMonitorReqParams->rssiMonitorCallback)
+ {
+ pRssiMonitorReqParams->rssiMonitorCallback(
+ pRssiMonitorReqParams->rssiMonitorCbContext,
+ CONVERT_WDI2VOS_STATUS(wdiRsp->status));
+ }
+ else
+ {
+ VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
+ "%s: pFWLoggingInitParams callback is NULL", __func__);
+ }
+
+ vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
+ vos_mem_free(pWdaParams->wdaMsgParam);
+ vos_mem_free(pWdaParams);
+
+ return;
+}
+
/*
* FUNCTION: WDA_FWLoggingInitRspCallback
* recieves Mgmt Logging init response from FW
@@ -10427,6 +10530,149 @@
}
/*
+ * FUNCTION: WDA_ProcessStartRssiMonitorReq
+ *
+ */
+VOS_STATUS WDA_ProcessStartRssiMonitorReq(tWDA_CbContext *pWDA,
+ tSirRssiMonitorReq *pRssiMonitorReqParam)
+{
+ VOS_STATUS status = VOS_STATUS_SUCCESS;
+ WDI_Status wstatus;
+ WDI_RssiMonitorReqInfoType *wdiRssiMonitorInfo;
+ tWDA_ReqParams *pWdaParams ;
+
+ VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
+ "------> %s " ,__func__);
+
+ /* Sanity Check*/
+ if(NULL == pRssiMonitorReqParam)
+ {
+ VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
+ "%s: pRssiMonitorReqParam received NULL", __func__);
+ VOS_ASSERT(0) ;
+ return VOS_STATUS_E_FAULT;
+ }
+
+ wdiRssiMonitorInfo = (WDI_RssiMonitorReqInfoType *)vos_mem_malloc(
+ sizeof(WDI_RssiMonitorReqInfoType));
+ if(NULL == wdiRssiMonitorInfo)
+ {
+ VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
+ "%s: VOS MEM Alloc Failure", __func__);
+ VOS_ASSERT(0);
+ vos_mem_free(pRssiMonitorReqParam);
+ return VOS_STATUS_E_NOMEM;
+ }
+
+ 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);
+ vos_mem_free(wdiRssiMonitorInfo);
+ vos_mem_free(pRssiMonitorReqParam);
+ return VOS_STATUS_E_NOMEM;
+ }
+
+ wdiRssiMonitorInfo->requestId = pRssiMonitorReqParam->requestId;
+ wdiRssiMonitorInfo->minRssi = pRssiMonitorReqParam->minRssi;
+ wdiRssiMonitorInfo->maxRssi = pRssiMonitorReqParam->maxRssi;
+ vos_mem_copy(wdiRssiMonitorInfo->currentBssId,
+ &(pRssiMonitorReqParam->currentBssId), sizeof(tSirMacAddr));
+
+ pWdaParams->pWdaContext = pWDA;
+ pWdaParams->wdaMsgParam = pRssiMonitorReqParam;
+ pWdaParams->wdaWdiApiMsgParam = (void *)wdiRssiMonitorInfo;
+
+ wstatus = WDI_StartRssiMonitorReq(wdiRssiMonitorInfo,
+ (WDI_RssiMonitorStartRspCb)WDA_RssiMonitorStartRspCallback,
+ pWdaParams);
+ if(IS_WDI_STATUS_FAILURE(wstatus))
+ {
+ VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
+ "Failure in Mgmt Logging init REQ WDI API, free all the memory" );
+ status = CONVERT_WDI2VOS_STATUS(wstatus);
+ vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
+ vos_mem_free(pWdaParams->wdaMsgParam);
+ vos_mem_free(pWdaParams);
+ }
+
+ return status;
+}
+
+/*
+ * FUNCTION: WDA_ProcessStopRssiMonitorReq
+ *
+ */
+VOS_STATUS WDA_ProcessStopRssiMonitorReq(tWDA_CbContext *pWDA,
+ tSirRssiMonitorReq *pRssiMonitorReqParam)
+{
+ VOS_STATUS status = VOS_STATUS_SUCCESS;
+ WDI_Status wstatus;
+ WDI_RssiMonitorReqInfoType *wdiRssiMonitorInfo;
+ tWDA_ReqParams *pWdaParams ;
+
+ VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
+ "------> %s " ,__func__);
+
+ /* Sanity Check*/
+ if(NULL == pRssiMonitorReqParam)
+ {
+ VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
+ "%s: pRssiMonitorReqParam received NULL", __func__);
+ VOS_ASSERT(0) ;
+ return VOS_STATUS_E_FAULT;
+ }
+
+ wdiRssiMonitorInfo = (WDI_RssiMonitorReqInfoType *)vos_mem_malloc(
+ sizeof(WDI_RssiMonitorReqInfoType));
+ if(NULL == wdiRssiMonitorInfo)
+ {
+ VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
+ "%s: VOS MEM Alloc Failure", __func__);
+ VOS_ASSERT(0);
+ vos_mem_free(pRssiMonitorReqParam);
+ return VOS_STATUS_E_NOMEM;
+ }
+
+ 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);
+ vos_mem_free(wdiRssiMonitorInfo);
+ vos_mem_free(pRssiMonitorReqParam);
+ return VOS_STATUS_E_NOMEM;
+ }
+
+ wdiRssiMonitorInfo->requestId = pRssiMonitorReqParam->requestId;
+ vos_mem_copy(wdiRssiMonitorInfo->currentBssId,
+ &(pRssiMonitorReqParam->currentBssId), sizeof(tSirMacAddr));
+
+ pWdaParams->pWdaContext = pWDA;
+ pWdaParams->wdaMsgParam = pRssiMonitorReqParam;
+ pWdaParams->wdaWdiApiMsgParam = (void *)wdiRssiMonitorInfo;
+
+ wstatus = WDI_StopRssiMonitorReq(wdiRssiMonitorInfo,
+ (WDI_RssiMonitorStopRspCb)WDA_RssiMonitorStopRspCallback,
+ pWdaParams);
+ if(IS_WDI_STATUS_FAILURE(wstatus))
+ {
+ VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
+ "Failure in Mgmt Logging init REQ WDI API, free all the memory" );
+ status = CONVERT_WDI2VOS_STATUS(wstatus);
+ vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
+ vos_mem_free(pWdaParams->wdaMsgParam);
+ vos_mem_free(pWdaParams);
+ }
+
+ return status;
+}
+
+
+/*
* FUNCTION: WDA_WdiIndicationCallback
*
*/
@@ -14473,6 +14719,16 @@
(tAniGetFrameLogReq *)pMsg->bodyptr);
break;
}
+ case WDA_START_RSSI_MONITOR_REQ:
+ {
+ WDA_ProcessStartRssiMonitorReq(pWDA,(tSirRssiMonitorReq *)pMsg->bodyptr);
+ break;
+ }
+ case WDA_STOP_RSSI_MONITOR_REQ:
+ {
+ WDA_ProcessStopRssiMonitorReq(pWDA,(tSirRssiMonitorReq *)pMsg->bodyptr);
+ break;
+ }
case WDA_SEND_LOG_DONE_IND:
{
WDA_FWLoggingDXEdoneInd(pMsg->bodyval);
@@ -15896,6 +16152,61 @@
(void *)pLostLinkParamInd , 0) ;
break;
}
+ case WDI_RSSI_BREACHED_IND:
+ {
+ WDI_RssiBreachedIndType *pRssiBreachedInd;
+ tpAniSirGlobal pMac;
+
+ pRssiBreachedInd =
+ (WDI_RssiBreachedIndType *)vos_mem_malloc(sizeof(WDI_RssiBreachedIndType));
+ VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
+ "Received WDI_RSSI_BREACHED_IND from FW");
+
+ vos_mem_copy(pRssiBreachedInd,
+ &wdiLowLevelInd->wdiIndicationData.wdiRssiBreachedInd,
+ sizeof(WDI_RssiBreachedIndType));
+
+ /*sanity check*/
+ if (NULL == pWDA)
+ {
+ VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
+ "%s:pWDA is NULL", __func__);
+ vos_mem_free(pRssiBreachedInd);
+ VOS_ASSERT(0);
+ return;
+ }
+
+ if (NULL == pRssiBreachedInd)
+ {
+ VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
+ "%s:Breach indication from FW is null can't invoke HDD callback",
+ __func__);
+ VOS_ASSERT(0);
+ return;
+ }
+
+ 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);
+ vos_mem_free(pRssiBreachedInd);
+ return;
+ }
+
+ if (pMac->sme.rssiThresholdBreachedCb)
+ {
+ pMac->sme.rssiThresholdBreachedCb(pMac->pAdapter, (void *)pRssiBreachedInd);
+ }
+ else
+ {
+ VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
+ "%s:HDD callback is null", __func__);
+ }
+ vos_mem_free(pRssiBreachedInd);
+ break;
+ }
default:
{
/* TODO error */
diff --git a/CORE/WDI/CP/inc/wlan_qct_wdi.h b/CORE/WDI/CP/inc/wlan_qct_wdi.h
index 20ee417..c89f731 100644
--- a/CORE/WDI/CP/inc/wlan_qct_wdi.h
+++ b/CORE/WDI/CP/inc/wlan_qct_wdi.h
@@ -419,6 +419,7 @@
WDI_DEL_BA_IND,
WDI_NAN_EVENT_IND,
WDI_LOST_LINK_PARAMS_IND,
+ WDI_RSSI_BREACHED_IND,
WDI_MAX_IND
}WDI_LowLevelIndEnumType;
@@ -749,6 +750,13 @@
}WDI_LostLinkParamsIndType;
+typedef struct
+{
+ wpt_uint32 request_id;
+ wpt_uint8 bssId[WDI_MAC_ADDR_LEN];
+ wpt_int8 rssi;
+}WDI_RssiBreachedIndType;
+
/*---------------------------------------------------------------------------
WDI_IbssPeerInactivityIndType
-----------------------------------------------------------------------------*/
@@ -980,6 +988,7 @@
WDI_TxBDStatus wdiTxBdInd;
WDI_LostLinkParamsIndType wdiLostLinkParamsInd;
+ WDI_RssiBreachedIndType wdiRssiBreachedInd;
} wdiIndicationData;
}WDI_LowLevelIndType;
@@ -2710,7 +2719,17 @@
wpt_uint32 reserved2;
}WDI_FWLoggingInitRspParamType;
+typedef struct
+{
+ /* wdi status */
+ wpt_uint32 status;
+}WDI_RssiMonitorStartRspParamType;
+typedef struct
+{
+ /* wdi status */
+ wpt_uint32 status;
+}WDI_RssiMonitorStopRspParamType;
/*---------------------------------------------------------------------------
WDI_FatalEventLogsRspParamType
---------------------------------------------------------------------------*/
@@ -4105,6 +4124,14 @@
typedef struct
{
+ wpt_uint32 requestId;
+ wpt_uint8 minRssi;
+ wpt_uint8 maxRssi;
+ wpt_macAddr currentBssId;
+}WDI_RssiMonitorReqInfoType;
+
+typedef struct
+{
wpt_uint32 reason_code;
}WDI_FatalEventLogsReqInfoType;
@@ -8113,6 +8140,8 @@
WDI_FatalEventLogsRspParamType *wdiRsp, void *pUserData);
typedef void (*WDI_MonModeRspCb)(void *pEventData,void *pUserData);
+typedef void (*WDI_RssiMonitorStartRspCb)(void *pEventData,void *pUserData);
+typedef void (*WDI_RssiMonitorStopRspCb)(void *pEventData,void *pUserData);
typedef void (*WDI_FwrMemDumpRspCb)(WDI_FwrMemDumpRsp *wdiRsp, void *pUserData);
@@ -9640,6 +9669,69 @@
);
/**
+ @brief WDI_StartRssiMonitorReq will be called when the upper
+ MAC wants to initialize Rssi Monitor on a bssid.
+ Upon the call of this API the WLAN DAL will pack and
+ send a HAL Rssi Monitor init request message to
+ the lower RIVA sub-system.
+
+ In state BUSY this request will be queued. Request won't
+ be allowed in any other state.
+
+
+ @param pwdiRssiMonitorInfo: the Rssi Monitor params
+ as specified by the Device Interface
+
+ wdiRssiMonitorStartRspCb: callback for passing back the
+ response of the rssi monitor operation received
+ from the device
+
+ pUserData: user data will be passed back with the
+ callback
+
+ @return Result of the function call
+*/
+WDI_Status
+WDI_StartRssiMonitorReq
+(
+ WDI_RssiMonitorReqInfoType *pwdiRssiMonitorInfo,
+ WDI_RssiMonitorStartRspCb wdiRssiMonitorStartRspCb,
+ void* pUserData
+);
+
+
+/**
+ @brief WDI_StopRssiMonitorReq will be called when the upper
+ MAC wants to stop Rssi Monitor on a bssid.
+ Upon the call of this API the WLAN DAL will pack and
+ send a HAL Rssi Monitor stop request message to
+ the lower RIVA sub-system.
+
+ In state BUSY this request will be queued. Request won't
+ be allowed in any other state.
+
+
+ @param pwdiRssiMonitorInfo: the Rssi Monitor params
+ as specified by the Device Interface
+
+ wdiRssiMonitorStopRspCb: callback for passing back the
+ response of the rssi monitor operation received
+ from the device
+
+ pUserData: user data will be passed back with the
+ callback
+
+ @return Result of the function call
+*/
+WDI_Status
+WDI_StopRssiMonitorReq
+(
+ WDI_RssiMonitorReqInfoType *pwdiRssiMonitorInfo,
+ WDI_RssiMonitorStopRspCb wdiRssiMonitorStopRspCb,
+ void* pUserData
+);
+
+/**
@brief WDI_ConfigureRxpFilterReq will be called when the upper
MAC wants to set/reset the RXP filters for received pkts
(MC, BC etc.). Upon the call of this API the WLAN DAL will pack
diff --git a/CORE/WDI/CP/inc/wlan_qct_wdi_i.h b/CORE/WDI/CP/inc/wlan_qct_wdi_i.h
index a968b61..3aef6b6 100644
--- a/CORE/WDI/CP/inc/wlan_qct_wdi_i.h
+++ b/CORE/WDI/CP/inc/wlan_qct_wdi_i.h
@@ -480,6 +480,8 @@
WDI_MON_STOP_REQ = 108,
WDI_FATAL_EVENT_LOGGING_REQ = 109,
WDI_FWR_MEM_DUMP_REQ = 110,
+ WDI_START_RSSI_MONITOR_REQ = 111,
+ WDI_STOP_RSSI_MONITOR_REQ = 112,
WDI_MAX_REQ,
@@ -823,6 +825,8 @@
WDI_MON_STOP_RSP = 108,
WDI_FATAL_EVENT_LOGGING_RSP = 109,
WDI_FWR_MEM_DUMP_RSP = 110,
+ WDI_START_RSSI_MONITOR_RSP = 111,
+ WDI_STOP_RSSI_MONITOR_RSP = 112,
/*-------------------------------------------------------------------------
Indications
@@ -904,6 +908,7 @@
WDI_HAL_DEL_BA_IND = WDI_HAL_IND_MIN + 27,
WDI_HAL_NAN_EVENT = WDI_HAL_IND_MIN + 28,
WDI_HAL_LOST_LINK_PARAMS_IND = WDI_HAL_IND_MIN + 29,
+ WDI_HAL_RSSI_BREACHED_IND = WDI_HAL_IND_MIN + 30,
WDI_MAX_RESP
}WDI_ResponseEnumType;
@@ -6181,6 +6186,34 @@
);
WDI_Status
+WDI_ProcessRssiMonitorStartReq
+(
+ WDI_ControlBlockType* pWDICtx,
+ WDI_EventInfoType* pEventData
+);
+
+WDI_Status
+WDI_ProcessRssiMonitorStartRsp
+(
+ WDI_ControlBlockType* pWDICtx,
+ WDI_EventInfoType* pEventData
+);
+
+WDI_Status
+WDI_ProcessRssiMonitorStopReq
+(
+ WDI_ControlBlockType* pWDICtx,
+ WDI_EventInfoType* pEventData
+);
+
+WDI_Status
+WDI_ProcessRssiMonitorStopRsp
+(
+ WDI_ControlBlockType* pWDICtx,
+ WDI_EventInfoType* pEventData
+);
+
+WDI_Status
WDI_ProcessEncryptMsgReq
(
WDI_ControlBlockType* pWDICtx,
@@ -6264,6 +6297,13 @@
WDI_EventInfoType* pEventData
);
+WDI_Status
+WDI_Process_RssiBreachedInd
+(
+ WDI_ControlBlockType* pWDICtx,
+ WDI_EventInfoType* pEventData
+);
+
/**
@brief WDI_ProcessSetRtsCtsHtvhtInd
diff --git a/CORE/WDI/CP/src/wlan_qct_wdi.c b/CORE/WDI/CP/src/wlan_qct_wdi.c
index 8127230..8370a51 100644
--- a/CORE/WDI/CP/src/wlan_qct_wdi.c
+++ b/CORE/WDI/CP/src/wlan_qct_wdi.c
@@ -485,6 +485,8 @@
WDI_ProcessFatalEventLogsReq, /*WDI_FATAL_EVENT_LOGGING_REQ*/
WDI_ProcessFwrMemDumpReq, /* WDI_FWR_MEM_DUMP_REQ*/
+ WDI_ProcessRssiMonitorStartReq, /* WDI_START_RSSI_MONITOR_REQ */
+ WDI_ProcessRssiMonitorStopReq, /* WDI_STOP_RSSI_MONITOR_REQ */
/*-------------------------------------------------------------------------
Indications
-------------------------------------------------------------------------*/
@@ -759,6 +761,8 @@
WDI_ProcessMonStopRsp, /* WDI_MON_STOP_RSP*/
WDI_ProcessFatalEventLogsRsp, /*WDI_FATAL_EVENT_LOGGING_RSP*/
WDI_ProcessFwrMemDumpRsp, /* WDI_FWR_MEM_DUMP_RSP */
+ WDI_ProcessRssiMonitorStartRsp, /* WDI_START_RSSI_MONITOR_RSP*/
+ WDI_ProcessRssiMonitorStopRsp, /* WDI_STOP_RSSI_MONITOR_RSP*/
/*---------------------------------------------------------------------
Indications
---------------------------------------------------------------------*/
@@ -845,6 +849,7 @@
WDI_delBaInd, /* WDI_HAL_DEL_BA_IND*/
WDI_ProcessNanEvent, /* WDI_HAL_NAN_EVENT */
WDI_Process_LostLinkParamInd, /* WDI_HAL_LOST_LINK_PARAMS_IND*/
+ WDI_Process_RssiBreachedInd, /* WDI_HAL_RSSI_BREACHED_IND */
};
@@ -1190,6 +1195,8 @@
CASE_RETURN_STRING( WDI_FATAL_EVENT_LOGGING_REQ );
CASE_RETURN_STRING( WDI_SEND_FREQ_RANGE_CONTROL_IND );
CASE_RETURN_STRING( WDI_FWR_MEM_DUMP_REQ);
+ CASE_RETURN_STRING( WDI_START_RSSI_MONITOR_REQ );
+ CASE_RETURN_STRING( WDI_STOP_RSSI_MONITOR_REQ );
default:
return "Unknown WDI MessageId";
}
@@ -1327,6 +1334,8 @@
CASE_RETURN_STRING( WDI_GET_FRAME_LOG_RSP);
CASE_RETURN_STRING (WDI_FATAL_EVENT_LOGGING_RSP);
CASE_RETURN_STRING( WDI_FWR_MEM_DUMP_RSP);
+ CASE_RETURN_STRING (WDI_START_RSSI_MONITOR_RSP);
+ CASE_RETURN_STRING (WDI_STOP_RSSI_MONITOR_RSP);
default:
return "Unknown WDI MessageId";
}
@@ -4524,6 +4533,119 @@
/**
+ @brief WDI_StartRssiMonitorReq will be called when the upper
+ MAC wants to initialize Rssi Monitor on a bssid.
+ Upon the call of this API the WLAN DAL will pack and
+ send a HAL Rssi Monitor init request message to
+ the lower RIVA sub-system.
+
+ In state BUSY this request will be queued. Request won't
+ be allowed in any other state.
+
+
+ @param pwdiRssiMonitorInfo: the Rssi Monitor params
+ as specified by the Device Interface
+
+ wdiRssiMonitorStartRspCb: callback for passing back the
+ response of the rssi monitor operation received
+ from the device
+
+ pUserData: user data will be passed back with the
+ callback
+
+ @return Result of the function call
+*/
+WDI_Status
+WDI_StartRssiMonitorReq
+(
+ WDI_RssiMonitorReqInfoType *pwdiRssiMonitorInfo,
+ WDI_RssiMonitorStartRspCb wdiRssiMonitorStartRspCb,
+ void* pUserData
+)
+{
+ 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_START_RSSI_MONITOR_REQ;
+ wdiEventData.pEventData = pwdiRssiMonitorInfo;
+ wdiEventData.uEventDataSize = sizeof(*pwdiRssiMonitorInfo);
+ wdiEventData.pCBfnc = wdiRssiMonitorStartRspCb;
+ wdiEventData.pUserData = pUserData;
+
+ return WDI_PostMainEvent(&gWDICb, WDI_REQUEST_EVENT, &wdiEventData);
+}
+
+/**
+ @brief WDI_StopRssiMonitorReq will be called when the upper
+ MAC wants to stop Rssi Monitor on a bssid.
+ Upon the call of this API the WLAN DAL will pack and
+ send a HAL Rssi Monitor stop request message to
+ the lower RIVA sub-system.
+
+ In state BUSY this request will be queued. Request won't
+ be allowed in any other state.
+
+
+ @param pwdiRssiMonitorInfo: the Rssi Monitor params
+ as specified by the Device Interface
+
+ wdiRssiMonitorStopRspCb: callback for passing back the
+ response of the rssi monitor operation received
+ from the device
+
+ pUserData: user data will be passed back with the
+ callback
+
+ @return Result of the function call
+*/
+WDI_Status
+WDI_StopRssiMonitorReq
+(
+ WDI_RssiMonitorReqInfoType *pwdiRssiMonitorInfo,
+ WDI_RssiMonitorStopRspCb wdiRssiMonitorStopRspCb,
+ void* pUserData
+)
+{
+ 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_STOP_RSSI_MONITOR_REQ;
+ wdiEventData.pEventData = pwdiRssiMonitorInfo;
+ wdiEventData.uEventDataSize = sizeof(*pwdiRssiMonitorInfo);
+ wdiEventData.pCBfnc = wdiRssiMonitorStopRspCb;
+ wdiEventData.pUserData = pUserData;
+
+ return WDI_PostMainEvent(&gWDICb, WDI_REQUEST_EVENT, &wdiEventData);
+}
+
+
+/**
@brief WDI_ConfigureRxpFilterReq will be called when the upper
MAC wants to set/reset the RXP filters for received pkts
(MC, BC etc.). Upon the call of this API the WLAN DAL will pack
@@ -23027,7 +23149,7 @@
}/*switch ( pEventData->wdiRequest )*/
if (!(WDI_STATUS_SUCCESS == wdiStatus || WDI_STATUS_PENDING == wdiStatus
- || WDI_STATUS_SUCCESS_SYNC == wdiStatus))
+ || WDI_STATUS_SUCCESS_SYNC == wdiStatus))
{
WDI_ExtractRequestCBFromEvent(pEventData, &pfnReqStatusCB, &pUserData);
@@ -24355,7 +24477,10 @@
return WLAN_HAL_SEND_FREQ_RANGE_CONTROL_IND;
case WDI_FWR_MEM_DUMP_REQ:
return WLAN_HAL_FW_MEMORY_DUMP_REQ;
-
+ case WDI_START_RSSI_MONITOR_REQ:
+ return WLAN_HAL_START_RSSI_MONITORING_REQ;
+ case WDI_STOP_RSSI_MONITOR_REQ:
+ return WLAN_HAL_STOP_RSSI_MONITORING_REQ;
default:
return WLAN_HAL_MSG_MAX;
}
@@ -24692,6 +24817,12 @@
return WDI_FATAL_EVENT_LOGGING_RSP;
case WLAN_HAL_FW_MEMORY_DUMP_RSP:
return WDI_FWR_MEM_DUMP_RSP;
+ case WLAN_HAL_START_RSSI_MONITORING_RSP:
+ return WDI_START_RSSI_MONITOR_RSP;
+ case WLAN_HAL_STOP_RSSI_MONITORING_RSP:
+ return WDI_STOP_RSSI_MONITOR_RSP;
+ case WLAN_HAL_RSSI_MONITORING_IND:
+ return WDI_HAL_RSSI_BREACHED_IND;
default:
return eDRIVER_TYPE_MAX;
}
@@ -34529,6 +34660,273 @@
return WDI_STATUS_SUCCESS;
}
+
+/**
+ @brief Process RssiMonitorStartReq Request
+
+ @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_ProcessRssiMonitorStartReq
+(
+ WDI_ControlBlockType* pWDICtx,
+ WDI_EventInfoType* pEventData
+)
+{
+ WDI_RssiMonitorReqInfoType* wdiRssiMonitorStartReq;
+ wpt_uint8* pSendBuffer = NULL;
+ wpt_uint16 usDataOffset = 0;
+ wpt_uint16 usSendSize = 0;
+ WDI_Status wdiStatus;
+ tHalStartRssimonitoringReq halStartRssiMonitorReq;
+ WDI_RssiMonitorStartRspCb wdiRssiMonitorStartReqCb;
+
+
+ VOS_TRACE( VOS_MODULE_ID_WDI, VOS_TRACE_LEVEL_INFO,
+ "%s: %d Enter",__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;
+ }
+
+ wdiRssiMonitorStartReq = (WDI_RssiMonitorReqInfoType *)pEventData->pEventData;
+
+ /*-----------------------------------------------------------------------
+ Get message buffer
+ -----------------------------------------------------------------------*/
+ if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx,
+ WDI_START_RSSI_MONITOR_REQ,
+ sizeof(halStartRssiMonitorReq.startRssiMonitoringReqParams),
+ &pSendBuffer, &usDataOffset, &usSendSize))||
+ (usSendSize < (usDataOffset +
+ sizeof(halStartRssiMonitorReq.startRssiMonitoringReqParams))))
+ {
+ WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_FATAL,
+ "Unable to get send buffer in GetFrameLog Req");
+ WDI_ASSERT(0);
+ return WDI_STATUS_E_FAILURE;
+ }
+
+ halStartRssiMonitorReq.startRssiMonitoringReqParams.request_id =
+ wdiRssiMonitorStartReq->requestId;
+
+ halStartRssiMonitorReq.startRssiMonitoringReqParams.min_rssi =
+ wdiRssiMonitorStartReq->minRssi;
+
+ halStartRssiMonitorReq.startRssiMonitoringReqParams.max_rssi =
+ wdiRssiMonitorStartReq->maxRssi;
+ wpalMemoryCopy(halStartRssiMonitorReq.startRssiMonitoringReqParams.bssId,
+ &(wdiRssiMonitorStartReq->currentBssId),
+ sizeof(halStartRssiMonitorReq.startRssiMonitoringReqParams.bssId));
+
+ wdiRssiMonitorStartReqCb = (WDI_RssiMonitorStartRspCb)pEventData->pCBfnc;
+
+ wpalMemoryCopy(pSendBuffer+usDataOffset,
+ &halStartRssiMonitorReq.startRssiMonitoringReqParams,
+ sizeof(halStartRssiMonitorReq.startRssiMonitoringReqParams));
+
+ /*-------------------------------------------------------------------------
+ Send Suspend Request to HAL
+ ------------------------------------------------------------------------*/
+ wdiStatus = WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize,
+ wdiRssiMonitorStartReqCb, pEventData->pUserData, WDI_START_RSSI_MONITOR_RSP);
+
+ return wdiStatus;
+}
+
+
+/**
+ @brief Process FWLoggingInit Request
+
+ @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_ProcessRssiMonitorStopReq
+(
+ WDI_ControlBlockType* pWDICtx,
+ WDI_EventInfoType* pEventData
+)
+{
+ WDI_RssiMonitorReqInfoType* wdiRssiMonitorStopReq;
+ wpt_uint8* pSendBuffer = NULL;
+ wpt_uint16 usDataOffset = 0;
+ wpt_uint16 usSendSize = 0;
+ WDI_Status wdiStatus;
+ tHalStopRssimonitoringReq halStopRssiMonitorReq;
+ WDI_RssiMonitorStopRspCb wdiRssiMonitorStopReqCb;
+
+
+ VOS_TRACE( VOS_MODULE_ID_WDI, VOS_TRACE_LEVEL_INFO,
+ "%s: %d Enter",__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;
+ }
+ wdiRssiMonitorStopReq = (WDI_RssiMonitorReqInfoType *)pEventData->pEventData;
+
+ /*-----------------------------------------------------------------------
+ Get message buffer
+ -----------------------------------------------------------------------*/
+ if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx,
+ WDI_STOP_RSSI_MONITOR_REQ,
+ sizeof(halStopRssiMonitorReq.stopRssiMonitoringParams),
+ &pSendBuffer, &usDataOffset, &usSendSize))||
+ (usSendSize < (usDataOffset +
+ sizeof(halStopRssiMonitorReq.stopRssiMonitoringParams))))
+ {
+ WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_FATAL,
+ "Unable to get send buffer in GetFrameLog Req");
+ WDI_ASSERT(0);
+ return WDI_STATUS_E_FAILURE;
+ }
+
+ halStopRssiMonitorReq.stopRssiMonitoringParams.request_id =
+ wdiRssiMonitorStopReq->requestId;
+
+ wpalMemoryCopy(halStopRssiMonitorReq.stopRssiMonitoringParams.bssId,
+ &(wdiRssiMonitorStopReq->currentBssId),
+ sizeof(halStopRssiMonitorReq.stopRssiMonitoringParams.bssId));
+
+ wdiRssiMonitorStopReqCb = (WDI_RssiMonitorStopRspCb)pEventData->pCBfnc;
+
+ wpalMemoryCopy(pSendBuffer+usDataOffset,
+ &halStopRssiMonitorReq.stopRssiMonitoringParams,
+ sizeof(halStopRssiMonitorReq.stopRssiMonitoringParams));
+
+ /*-------------------------------------------------------------------------
+ Send Suspend Request to HAL
+ ------------------------------------------------------------------------*/
+ wdiStatus = WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize,
+ wdiRssiMonitorStopReqCb, pEventData->pUserData, WDI_STOP_RSSI_MONITOR_RSP);
+
+ return wdiStatus;
+}
+
+/**
+ @brief Process MgmtFrame Logging Init 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_ProcessRssiMonitorStopRsp
+(
+ WDI_ControlBlockType* pWDICtx,
+ WDI_EventInfoType* pEventData
+)
+{
+ tHalStopRssimonitoringRspParams halRsp;
+ WDI_RssiMonitorStopRspCb wdiRssiMonitorStopRspCb;
+ WDI_RssiMonitorStopRspParamType wdiRssiMonitorStopRsp;
+
+ VOS_TRACE( VOS_MODULE_ID_WDI, VOS_TRACE_LEVEL_INFO,
+ "%s: %d Enter",__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;
+ }
+ wdiRssiMonitorStopRspCb = (WDI_RssiMonitorStopRspCb)pWDICtx->pfncRspCB;
+
+ /*-------------------------------------------------------------------------
+ Extract response and send it to UMAC
+ -------------------------------------------------------------------------*/
+ wpalMemoryCopy( &halRsp, pEventData->pEventData, sizeof(halRsp));
+
+ wdiRssiMonitorStopRsp.status = WDI_HAL_2_WDI_STATUS(halRsp.status);
+
+ /*Notify UMAC*/
+ wdiRssiMonitorStopRspCb( &wdiRssiMonitorStopRsp, pWDICtx->pRspCBUserData);
+
+ return WDI_STATUS_SUCCESS;
+}
+
+
+/**
+ @brief Process MgmtFrame Logging Init 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_ProcessRssiMonitorStartRsp
+(
+ WDI_ControlBlockType* pWDICtx,
+ WDI_EventInfoType* pEventData
+)
+{
+ tHalStartRssimonitoringRspParams halRsp;
+ WDI_RssiMonitorStartRspCb wdiRssiMonitorStartRspCb;
+ WDI_RssiMonitorStartRspParamType wdiRssiMonitorStartRsp;
+
+ VOS_TRACE( VOS_MODULE_ID_WDI, VOS_TRACE_LEVEL_INFO,
+ "%s: %d Enter",__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;
+ }
+ wdiRssiMonitorStartRspCb = (WDI_RssiMonitorStopRspCb)pWDICtx->pfncRspCB;
+
+ /*-------------------------------------------------------------------------
+ Extract response and send it to UMAC
+ -------------------------------------------------------------------------*/
+ wpalMemoryCopy( &halRsp, pEventData->pEventData, sizeof(halRsp));
+
+ wdiRssiMonitorStartRsp.status = WDI_HAL_2_WDI_STATUS(halRsp.status);
+
+ /*Notify UMAC*/
+ wdiRssiMonitorStartRspCb( &wdiRssiMonitorStartRsp, pWDICtx->pRspCBUserData);
+
+ return WDI_STATUS_SUCCESS;
+}
+
/**
@brief Process FWLoggingInit Request
@@ -35437,6 +35835,57 @@
}/*WDI_ProcessNanEvent*/
+WDI_Status
+WDI_Process_RssiBreachedInd
+(
+ WDI_ControlBlockType* pWDICtx,
+ WDI_EventInfoType* pEventData
+)
+{
+ WDI_LowLevelIndType wdiInd;
+ tHalRssiMonitorIndParams halRssiBreachedInd;
+ /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+
+ /*-------------------------------------------------------------------------
+ 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;
+ }
+
+ /*-------------------------------------------------------------------------
+ Extract indication and send it to UMAC
+ -------------------------------------------------------------------------*/
+ wpalMemoryCopy( &halRssiBreachedInd,
+ pEventData->pEventData,
+ sizeof(halRssiBreachedInd));
+
+
+ /*Fill in the indication parameters*/
+ wdiInd.wdiIndicationType = WDI_RSSI_BREACHED_IND;
+ wpalMemoryCopy((void *)&wdiInd.wdiIndicationData.wdiRssiBreachedInd,
+ (void *)&halRssiBreachedInd,
+ sizeof(WDI_RssiBreachedIndType));
+ WPAL_TRACE(eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_INFO,
+ "%s: session_id %d, rssi : %d, bssId: " MAC_ADDRESS_STR" ", __func__,
+ wdiInd.wdiIndicationData.wdiRssiBreachedInd.request_id,
+ wdiInd.wdiIndicationData.wdiRssiBreachedInd.rssi,
+ MAC_ADDR_ARRAY(wdiInd.wdiIndicationData.wdiRssiBreachedInd.bssId));
+ /*Notify UMAC*/
+ if (pWDICtx->wdiLowLevelIndCB)
+ {
+ pWDICtx->wdiLowLevelIndCB(&wdiInd, pWDICtx->pIndUserData);
+ }
+
+ return WDI_STATUS_SUCCESS;
+
+}
+
WDI_Status
WDI_Process_LostLinkParamInd