summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVidyullatha Kanchanapally <vidyullatha@codeaurora.org>2017-03-23 14:36:21 +0530
committerSandeep Puligilla <spuligil@codeaurora.org>2017-03-23 12:26:10 -0700
commitd1abc315bd32f971280b08a11359f9f27bebf008 (patch)
tree6d646883aaefe9e2b30912ba084a5384bde20966
parent1a0dd38072bfb9796912fd498376d551b97efb78 (diff)
qcacld-3.0: Add handler for new WMI BT event
Add handler for the new WMI BT activity event and propagate the BT event till HDD. These BT activity events will be used for MBO enhancements to decide whether to accept the BTM request from AP or not. This brings in the 'Change-Id: Ib426b2eb62821528d006dacc66e30d167d7bde5d' back with valid author id Change-Id: I687819fd28c693964b42bfb24eb9dae1858b10a5 CRs-Fixed: 2023728
-rw-r--r--core/hdd/inc/wlan_hdd_main.h2
-rw-r--r--core/hdd/src/wlan_hdd_cfg80211.c38
-rw-r--r--core/hdd/src/wlan_hdd_cfg80211.h9
-rw-r--r--core/hdd/src/wlan_hdd_main.c5
-rw-r--r--core/mac/inc/wni_api.h1
-rw-r--r--core/sme/inc/sme_api.h10
-rw-r--r--core/sme/inc/sme_internal.h1
-rw-r--r--core/sme/src/common/sme_api.c23
-rw-r--r--core/wma/inc/wma_internal.h14
-rw-r--r--core/wma/src/wma_features.c35
-rw-r--r--core/wma/src/wma_main.c10
11 files changed, 148 insertions, 0 deletions
diff --git a/core/hdd/inc/wlan_hdd_main.h b/core/hdd/inc/wlan_hdd_main.h
index 28cf0d988e91..925b01824490 100644
--- a/core/hdd/inc/wlan_hdd_main.h
+++ b/core/hdd/inc/wlan_hdd_main.h
@@ -1694,6 +1694,8 @@ struct hdd_context_s {
struct vendor_oui *probe_req_voui;
struct hdd_nud_stats_context nud_stats_context;
uint32_t track_arp_ip;
+ uint8_t bt_a2dp_active:1;
+ uint8_t bt_vo_active:1;
};
/*---------------------------------------------------------------------------
diff --git a/core/hdd/src/wlan_hdd_cfg80211.c b/core/hdd/src/wlan_hdd_cfg80211.c
index 1ef68434a711..268694f60dcf 100644
--- a/core/hdd/src/wlan_hdd_cfg80211.c
+++ b/core/hdd/src/wlan_hdd_cfg80211.c
@@ -8870,6 +8870,44 @@ static int wlan_hdd_cfg80211_get_nud_stats(struct wiphy *wiphy,
#undef QCA_ATTR_NUD_STATS_AP_LINK_ACTIVE
#undef QCA_ATTR_NUD_STATS_GET_MAX
+void hdd_bt_activity_cb(void *context, uint32_t bt_activity)
+{
+ hdd_context_t *hdd_ctx = (hdd_context_t *)context;
+ int status;
+
+ status = wlan_hdd_validate_context(hdd_ctx);
+ if (0 != status)
+ return;
+
+ if (bt_activity == WLAN_COEX_EVENT_BT_A2DP_PROFILE_ADD)
+ hdd_ctx->bt_a2dp_active = 1;
+ else if (bt_activity == WLAN_COEX_EVENT_BT_A2DP_PROFILE_REMOVE)
+ hdd_ctx->bt_a2dp_active = 0;
+ else if (bt_activity == WLAN_COEX_EVENT_BT_VOICE_PROFILE_ADD)
+ hdd_ctx->bt_vo_active = 1;
+ else if (bt_activity == WLAN_COEX_EVENT_BT_VOICE_PROFILE_REMOVE)
+ hdd_ctx->bt_vo_active = 0;
+ else
+ return;
+
+ hdd_info("a2dp_active:%d vo_active:%d", hdd_ctx->bt_a2dp_active,
+ hdd_ctx->bt_vo_active);
+}
+
+/**
+ * wlan_hdd_is_bt_in_progress() - check if bt activity is in progress
+ * @hdd_ctx : HDD context
+ *
+ * Return: true if BT activity is in progress else false
+ */
+static inline bool wlan_hdd_is_bt_in_progress(hdd_context_t *hdd_ctx)
+{
+ if (hdd_ctx->bt_a2dp_active || hdd_ctx->bt_vo_active)
+ return true;
+
+ return false;
+}
+
#ifdef FEATURE_WLAN_CH_AVOID
/**
* wlan_hdd_is_channel_to_avoid() - Check channel to avoid
diff --git a/core/hdd/src/wlan_hdd_cfg80211.h b/core/hdd/src/wlan_hdd_cfg80211.h
index 3a09f049ed0b..de3c37eb1ad9 100644
--- a/core/hdd/src/wlan_hdd_cfg80211.h
+++ b/core/hdd/src/wlan_hdd_cfg80211.h
@@ -3766,4 +3766,13 @@ void hdd_process_defer_disconnect(hdd_adapter_t *adapter);
* Return: 0 for success, non-zero for failure
*/
int wlan_hdd_try_disconnect(hdd_adapter_t *adapter);
+
+/**
+ * hdd_bt_activity_cb() - callback function to receive bt activity
+ * @context: HDD context
+ * @bt_activity: specifies the kind of bt activity
+ *
+ * Return: none
+ */
+void hdd_bt_activity_cb(void *context, uint32_t bt_activity);
#endif
diff --git a/core/hdd/src/wlan_hdd_main.c b/core/hdd/src/wlan_hdd_main.c
index fe032d1cc75a..15c7cfbb243a 100644
--- a/core/hdd/src/wlan_hdd_main.c
+++ b/core/hdd/src/wlan_hdd_main.c
@@ -8959,6 +8959,11 @@ int hdd_register_cb(hdd_context_t *hdd_ctx)
wlan_hdd_dcc_register_for_dcc_stats_event(hdd_ctx);
+ status = sme_set_bt_activity_info_cb(hdd_ctx->hHal,
+ hdd_bt_activity_cb);
+ if (!QDF_IS_STATUS_SUCCESS(status))
+ hdd_err("set bt activity info callback failed");
+
EXIT();
return ret;
diff --git a/core/mac/inc/wni_api.h b/core/mac/inc/wni_api.h
index 37f9b279394c..d27472f6a5c9 100644
--- a/core/mac/inc/wni_api.h
+++ b/core/mac/inc/wni_api.h
@@ -267,6 +267,7 @@ enum eWniMsgTypes {
eWNI_SME_RSO_CMD_STATUS_IND,
eWMI_SME_LL_STATS_IND,
eWNI_SME_DEL_ALL_TDLS_PEERS,
+ eWNI_SME_BT_ACTIVITY_INFO_IND,
eWNI_SME_MSG_TYPES_END
};
diff --git a/core/sme/inc/sme_api.h b/core/sme/inc/sme_api.h
index 80995bebff8b..add07344d121 100644
--- a/core/sme/inc/sme_api.h
+++ b/core/sme/inc/sme_api.h
@@ -1531,6 +1531,16 @@ void sme_set_5g_band_pref(tHalHandle hal_handle,
struct sme_5g_band_pref_params *pref_params);
/**
+ * sme_set_bt_activity_info_cb - set the callback handler for bt events
+ * @hal: handle returned by mac_open
+ * @cb: callback handler
+ *
+ * Return: QDF_STATUS
+ */
+QDF_STATUS sme_set_bt_activity_info_cb(tHalHandle hal,
+ void (*cb)(void *, uint32_t profile_info));
+
+/**
* sme_scan_get_result_for_bssid - gets the scan result from scan cache for the
* bssid specified
* @hal: handle returned by mac_open
diff --git a/core/sme/inc/sme_internal.h b/core/sme/inc/sme_internal.h
index 50f2f8b13633..e149b55f56ba 100644
--- a/core/sme/inc/sme_internal.h
+++ b/core/sme/inc/sme_internal.h
@@ -260,6 +260,7 @@ typedef struct tagSmeStruct {
void (*rso_cmd_status_cb)(void *hdd_context,
struct rso_cmd_status *rso_status);
void (*get_arp_stats_cb)(void *, struct rsp_stats *);
+ void (*bt_activity_info_cb)(void *context, uint32_t bt_activity);
} tSmeStruct, *tpSmeStruct;
#endif /* #if !defined( __SMEINTERNAL_H ) */
diff --git a/core/sme/src/common/sme_api.c b/core/sme/src/common/sme_api.c
index ad24b1222bcc..f2ec7c49a73b 100644
--- a/core/sme/src/common/sme_api.c
+++ b/core/sme/src/common/sme_api.c
@@ -3035,6 +3035,11 @@ QDF_STATUS sme_process_msg(tHalHandle hHal, cds_msg_t *pMsg)
pMsg->bodyptr);
qdf_mem_free(pMsg->bodyptr);
break;
+ case eWNI_SME_BT_ACTIVITY_INFO_IND:
+ if (pMac->sme.bt_activity_info_cb)
+ pMac->sme.bt_activity_info_cb(pMac->hHdd,
+ pMsg->bodyval);
+ break;
default:
if ((pMsg->type >= eWNI_SME_MSG_TYPES_BEGIN)
@@ -17515,3 +17520,21 @@ QDF_STATUS sme_delete_all_tdls_peers(tHalHandle hal, uint8_t session_id)
return status;
}
+
+QDF_STATUS sme_set_bt_activity_info_cb(tHalHandle hal,
+ void (*cb)(void *, uint32_t bt_activity))
+{
+ QDF_STATUS status;
+ tpAniSirGlobal mac = PMAC_STRUCT(hal);
+
+ status = sme_acquire_global_lock(&mac->sme);
+ if (QDF_IS_STATUS_SUCCESS(status)) {
+ mac->sme.bt_activity_info_cb = cb;
+ sme_release_global_lock(&mac->sme);
+ sme_debug("bt activity info callback set");
+ } else {
+ sme_debug("sme_acquire_global_lock failed %d", status);
+ }
+
+ return status;
+}
diff --git a/core/wma/inc/wma_internal.h b/core/wma/inc/wma_internal.h
index 45f1c72f0e90..1471e61c1fda 100644
--- a/core/wma/inc/wma_internal.h
+++ b/core/wma/inc/wma_internal.h
@@ -1350,4 +1350,18 @@ QDF_STATUS wma_send_vdev_stop_to_fw(t_wma_handle *wma, uint8_t vdev_id);
int wma_get_arp_stats_handler(void *handle, uint8_t *data,
uint32_t data_len);
+
+/**
+ * wma_wlan_bt_activity_evt_handler - event handler to handle bt activity
+ * @handle: the WMA handle
+ * @event: buffer with the event parameters
+ * @len: length of the buffer
+ *
+ * This function receives BT activity event from firmware and passes the event
+ * information to upper layers
+ *
+ * Return: 0 on success
+ */
+int wma_wlan_bt_activity_evt_handler(void *handle, uint8_t *event,
+ uint32_t len);
#endif
diff --git a/core/wma/src/wma_features.c b/core/wma/src/wma_features.c
index 67d9708a6263..ad0260f08348 100644
--- a/core/wma/src/wma_features.c
+++ b/core/wma/src/wma_features.c
@@ -8935,3 +8935,38 @@ inline QDF_STATUS wma_send_udp_resp_offload_cmd(tp_wma_handle wma_handle,
return QDF_STATUS_E_FAILURE;
}
#endif
+
+int wma_wlan_bt_activity_evt_handler(void *handle, uint8_t *event, uint32_t len)
+{
+ wmi_coex_bt_activity_event_fixed_param *fixed_param;
+ WMI_WLAN_COEX_BT_ACTIVITY_EVENTID_param_tlvs *param_buf =
+ (WMI_WLAN_COEX_BT_ACTIVITY_EVENTID_param_tlvs *)event;
+ cds_msg_t sme_msg = {0};
+ QDF_STATUS qdf_status;
+
+ if (!param_buf) {
+ WMA_LOGE(FL("Invalid BT activity event buffer"));
+ return -EINVAL;
+ }
+
+ fixed_param = param_buf->fixed_param;
+ if (!fixed_param) {
+ WMA_LOGE(FL("Invalid BT activity event fixed param buffer"));
+ return -EINVAL;
+ }
+
+ WMA_LOGI(FL("Received BT activity event %u"),
+ fixed_param->coex_profile_evt);
+
+ sme_msg.type = eWNI_SME_BT_ACTIVITY_INFO_IND;
+ sme_msg.bodyptr = NULL;
+ sme_msg.bodyval = fixed_param->coex_profile_evt;
+
+ qdf_status = cds_mq_post_message(QDF_MODULE_ID_SME, &sme_msg);
+ if (QDF_IS_STATUS_ERROR(qdf_status)) {
+ WMA_LOGE(FL("Failed to post msg to SME"));
+ return -EINVAL;
+ }
+
+ return 0;
+}
diff --git a/core/wma/src/wma_main.c b/core/wma/src/wma_main.c
index 7475cd99825e..95cd77571c18 100644
--- a/core/wma/src/wma_main.c
+++ b/core/wma/src/wma_main.c
@@ -3249,6 +3249,16 @@ QDF_STATUS wma_start(void *cds_ctx)
goto end;
}
+ status = wmi_unified_register_event_handler(wma_handle->wmi_handle,
+ WMI_WLAN_COEX_BT_ACTIVITY_EVENTID,
+ wma_wlan_bt_activity_evt_handler,
+ WMA_RX_SERIALIZER_CTX);
+ if (!QDF_IS_STATUS_SUCCESS(status)) {
+ WMA_LOGE("Failed to register coex bt activity event handler");
+ qdf_status = QDF_STATUS_E_FAILURE;
+ goto end;
+ }
+
end:
WMA_LOGD("%s: Exit", __func__);
return qdf_status;