qcacld-3.0: Add handling to disable vdev for miracast

Add handling to disable second vdev of mac if miracast
is set for one vdev. In case high throughput or low latency
is required for particular vdev then another vdev on same
mac should be disabled, if present in MCC.

Change-Id: I36cc19f442130b098c4a02ec0ebcf69b89dd2a3c
CRs-Fixed: 3219512
此提交包含在:
Sheenam Monga
2022-06-13 18:56:10 +05:30
提交者 Madan Koyyalamudi
父節點 f18f044e74
當前提交 56cde67530
共有 8 個檔案被更改,包括 349 行新增194 行删除

查看文件

@@ -1027,19 +1027,6 @@ void policy_mgr_move_vdev_from_connection_to_disabled_tbl(
bool
policy_mgr_ml_link_vdev_need_to_be_disabled(struct wlan_objmgr_psoc *psoc,
struct wlan_objmgr_vdev *vdev);
/**
* policy_mgr_handle_link_enable_disable_resp() - enable/disable a ml link
* @vdev: vdev
* @arg: req structure
* evt: response event
*
* Return: None
*/
void
policy_mgr_handle_link_enable_disable_resp(struct wlan_objmgr_vdev *vdev,
void *arg,
struct mlo_link_set_active_resp *evt);
#else
static inline bool
policy_mgr_is_ml_vdev_id(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id)
@@ -4300,6 +4287,21 @@ policy_mgr_handle_ml_sta_links_on_vdev_up_csa(struct wlan_objmgr_psoc *psoc,
enum QDF_OPMODE mode,
uint8_t vdev_id);
/*
* policy_mgr_handle_ml_sta_link_on_traffic_type_change() - Handle
* enable/disable link on vdev traffic type change on SAP/P2P vdev
* @psoc: objmgr psoc
* @vdev: vdev on which traffic type change
*
* Context: Should be called only from north bound context and never from
* schedular thread as it has wait for completed.
*
* Return: void
*/
void policy_mgr_handle_ml_sta_link_on_traffic_type_change(
struct wlan_objmgr_psoc *psoc,
struct wlan_objmgr_vdev *vdev);
/*
* policy_mgr_handle_ml_sta_links_on_vdev_down() - Handle enable
* link on any vdev down
@@ -4347,6 +4349,13 @@ policy_mgr_handle_ml_sta_links_on_vdev_up_csa(struct wlan_objmgr_psoc *psoc,
{
}
static inline void
policy_mgr_handle_ml_sta_link_on_traffic_type_change(
struct wlan_objmgr_psoc *psoc,
struct wlan_objmgr_vdev *vdev)
{
}
static inline
void policy_mgr_handle_ml_sta_links_on_vdev_down(struct wlan_objmgr_psoc *psoc,
enum QDF_OPMODE mode,

查看文件

@@ -648,7 +648,6 @@ void policy_mgr_update_conc_list(struct wlan_objmgr_psoc *psoc,
if (pm_ctx->mode_change_cb && update_conn)
pm_ctx->mode_change_cb();
policy_mgr_dump_connection_status_info(psoc);
if (pm_ctx->cdp_cbacks.cdp_update_mac_id)
pm_ctx->cdp_cbacks.cdp_update_mac_id(psoc, vdev_id, mac);
@@ -1093,7 +1092,6 @@ void policy_mgr_update_hw_mode_conn_info(struct wlan_objmgr_psoc *psoc,
}
qdf_mutex_release(&pm_ctx->qdf_conc_list_lock);
policy_mgr_dump_connection_status_info(psoc);
policy_mgr_dump_current_concurrency(psoc);
}
@@ -1552,7 +1550,8 @@ policy_mgr_dump_disabled_ml_links(struct policy_mgr_psoc_priv_obj *pm_ctx)
}
}
qdf_mutex_release(&pm_ctx->qdf_conc_list_lock);
policy_mgr_debug("Disabled links(%d): %s", count, buf);
if (count)
policy_mgr_debug("Disabled links(%d): %s", count, buf);
}
#endif
@@ -1689,6 +1688,7 @@ void policy_mgr_dump_current_concurrency(struct wlan_objmgr_psoc *psoc)
if (!cc_mode)
return;
policy_mgr_dump_connection_status_info(psoc);
switch (num_connections) {
case 1:
policy_mgr_dump_current_concurrency_one_connection(cc_mode,

查看文件

@@ -3331,7 +3331,36 @@ policy_mgr_enable_disable_link_from_vdev_bitmask(struct wlan_objmgr_psoc *psoc,
}
}
void
static void
policy_mgr_set_link_in_progress(struct policy_mgr_psoc_priv_obj *pm_ctx,
bool value)
{
qdf_mutex_acquire(&pm_ctx->qdf_conc_list_lock);
pm_ctx->set_link_in_progress = value;
/* if set link has started reset the event, else complete the event */
if (pm_ctx->set_link_in_progress)
qdf_event_reset(&pm_ctx->set_link_update_done_evt);
else
qdf_event_set(&pm_ctx->set_link_update_done_evt);
policy_mgr_debug("set_link_in_progress %d",
pm_ctx->set_link_in_progress);
qdf_mutex_release(&pm_ctx->qdf_conc_list_lock);
}
static bool
policy_mgr_get_link_in_progress(struct policy_mgr_psoc_priv_obj *pm_ctx)
{
bool value;
qdf_mutex_acquire(&pm_ctx->qdf_conc_list_lock);
value = pm_ctx->set_link_in_progress;
qdf_mutex_release(&pm_ctx->qdf_conc_list_lock);
policy_mgr_debug("set_link_in_progress %d", value);
return value;
}
static void
policy_mgr_handle_link_enable_disable_resp(struct wlan_objmgr_vdev *vdev,
void *arg,
struct mlo_link_set_active_resp *resp)
@@ -3339,23 +3368,31 @@ policy_mgr_handle_link_enable_disable_resp(struct wlan_objmgr_vdev *vdev,
struct mlo_link_set_active_req *req = arg;
uint8_t i;
struct wlan_objmgr_psoc *psoc;
struct policy_mgr_psoc_priv_obj *pm_ctx;
psoc = wlan_vdev_get_psoc(vdev);
if (!psoc) {
policy_mgr_err("Psoc is Null");
return;
}
pm_ctx = policy_mgr_get_context(psoc);
if (!pm_ctx) {
policy_mgr_err("Invalid Context");
return;
}
qdf_mutex_acquire(&pm_ctx->qdf_conc_list_lock);
if (!req || !resp) {
policy_mgr_err("arguments or event empty for vdev %d",
wlan_vdev_get_id(vdev));
return;
goto complete_evnt;
}
if (resp->status) {
policy_mgr_err("Set link status %d, for mode %d reason %d vdev bitmask 0x%x",
resp->status, req->param.force_mode,
req->param.reason, req->param.vdev_bitmap[0]);
return;
goto complete_evnt;
}
policy_mgr_debug("Req mode %d reason %d, bitmask[0] = 0x%x, resp: active %d inactive %d, active[0] 0x%x inactive[0] 0x%x",
@@ -3408,6 +3445,10 @@ policy_mgr_handle_link_enable_disable_resp(struct wlan_objmgr_vdev *vdev,
req->param.force_mode);
break;
}
complete_evnt:
policy_mgr_set_link_in_progress(pm_ctx, false);
qdf_mutex_release(&pm_ctx->qdf_conc_list_lock);
}
#else
@@ -4274,6 +4315,106 @@ static bool policy_mgr_is_6g_channel_allowed(
}
#ifdef WLAN_FEATURE_11BE_MLO
static void
policy_mgr_fill_ml_active_link_vdev_bitmap(struct mlo_link_set_active_req *req,
uint8_t *mlo_vdev_lst,
uint32_t num_mlo_vdev)
{
uint32_t entry_idx, entry_offset, vdev_idx;
uint8_t vdev_id;
for (vdev_idx = 0; vdev_idx < num_mlo_vdev; vdev_idx++) {
vdev_id = mlo_vdev_lst[vdev_idx];
entry_idx = vdev_id / 32;
entry_offset = vdev_id % 32;
if (entry_idx >= MLO_LINK_NUM_SZ) {
policy_mgr_err("Invalid entry_idx %d num_mlo_vdev %d vdev %d",
entry_idx, num_mlo_vdev, vdev_id);
continue;
}
req->param.vdev_bitmap[entry_idx] |= (1 << entry_offset);
/* update entry number if entry index changed */
if (req->param.num_vdev_bitmap < entry_idx + 1)
req->param.num_vdev_bitmap = entry_idx + 1;
}
policy_mgr_debug("num_vdev_bitmap %d vdev_bitmap[0] = 0x%x, vdev_bitmap[1] = 0x%x",
req->param.num_vdev_bitmap, req->param.vdev_bitmap[0],
req->param.vdev_bitmap[1]);
}
/**
* policy_mgr_mlo_sta_set_link() - Set links for MLO STA
*
* @vdev: vdev object
* @reason: Reason for which link is forced
* @mode: Force reason
* @num_mlo_vdev: number of mlo vdev
* @mlo_vdev_lst: MLO STA vdev list
* Interface manager Set links for MLO STA
*
* Return: void
*/
static void
policy_mgr_mlo_sta_set_link(struct wlan_objmgr_vdev *vdev,
enum mlo_link_force_reason reason,
enum mlo_link_force_mode mode,
uint8_t num_mlo_vdev, uint8_t *mlo_vdev_lst)
{
struct mlo_link_set_active_req *req;
QDF_STATUS status;
struct wlan_objmgr_psoc *psoc;
struct policy_mgr_psoc_priv_obj *pm_ctx;
psoc = wlan_vdev_get_psoc(vdev);
if (!psoc) {
policy_mgr_err("Psoc is Null");
return;
}
pm_ctx = policy_mgr_get_context(psoc);
if (!pm_ctx) {
policy_mgr_err("Invalid Context");
return;
}
req = qdf_mem_malloc(sizeof(*req));
if (!req)
return;
policy_mgr_set_link_in_progress(pm_ctx, true);
policy_mgr_debug("vdev %d: mode %d num_mlo_vdev %d reason %d",
wlan_vdev_get_id(vdev), mode, num_mlo_vdev, reason);
req->ctx.vdev = vdev;
req->param.reason = reason;
req->param.force_mode = mode;
req->ctx.set_mlo_link_cb = policy_mgr_handle_link_enable_disable_resp;
req->ctx.cb_arg = req;
/* set MLO vdev bit mask for all case */
policy_mgr_fill_ml_active_link_vdev_bitmap(req, mlo_vdev_lst,
num_mlo_vdev);
/* fill num of links for MLO_LINK_FORCE_MODE_ACTIVE_NUM */
if (mode == MLO_LINK_FORCE_MODE_ACTIVE_NUM) {
req->param.force_mode = MLO_LINK_FORCE_MODE_ACTIVE_NUM;
req->param.num_link_entry = 1;
req->param.link_num[0].num_of_link = num_mlo_vdev - 1;
}
status = mlo_ser_set_link_req(req);
if (QDF_IS_STATUS_ERROR(status)) {
policy_mgr_err("vdev %d: Failed to set link mode %d num_mlo_vdev %d reason %d",
wlan_vdev_get_id(vdev), mode, num_mlo_vdev,
reason);
qdf_mem_free(req);
policy_mgr_set_link_in_progress(pm_ctx, false);
}
}
uint32_t
policy_mgr_get_conc_ext_flags(struct wlan_objmgr_vdev *vdev, bool force_mlo)
{
@@ -4775,10 +4916,8 @@ policy_mgr_ml_sta_concurency_on_connect(struct wlan_objmgr_psoc *psoc,
}
}
wlan_mlo_sta_mlo_concurency_set_link(vdev,
MLO_LINK_FORCE_REASON_CONNECT,
mode, affected_links,
ml_vdev_lst);
policy_mgr_mlo_sta_set_link(vdev, MLO_LINK_FORCE_REASON_CONNECT,
mode, affected_links, ml_vdev_lst);
}
static void
@@ -4808,10 +4947,9 @@ policy_mgr_ml_sta_concurency_on_disconnect(struct wlan_objmgr_vdev *vdev,
i++;
}
wlan_mlo_sta_mlo_concurency_set_link(vdev,
MLO_LINK_FORCE_REASON_DISCONNECT,
MLO_LINK_FORCE_MODE_NO_FORCE,
num_ml, ml_vdev_list);
policy_mgr_mlo_sta_set_link(vdev, MLO_LINK_FORCE_REASON_DISCONNECT,
MLO_LINK_FORCE_MODE_NO_FORCE,
num_ml, ml_vdev_list);
}
/**
@@ -5146,10 +5284,9 @@ policy_mgr_handle_sap_cli_go_ml_sta_up_csa(struct wlan_objmgr_psoc *psoc,
return;
}
wlan_mlo_sta_mlo_concurency_set_link(vdev,
MLO_LINK_FORCE_REASON_CONNECT,
MLO_LINK_FORCE_MODE_ACTIVE_NUM,
num_ml_sta, ml_sta_vdev_lst);
policy_mgr_mlo_sta_set_link(vdev, MLO_LINK_FORCE_REASON_CONNECT,
MLO_LINK_FORCE_MODE_ACTIVE_NUM,
num_ml_sta, ml_sta_vdev_lst);
return;
enable_link:
@@ -5161,10 +5298,10 @@ enable_link:
if (policy_mgr_sta_ml_link_enable_allowed(psoc, num_disabled_ml_sta,
num_ml_sta, ml_freq_lst,
ml_sta_vdev_lst))
wlan_mlo_sta_mlo_concurency_set_link(vdev,
MLO_LINK_FORCE_REASON_DISCONNECT,
MLO_LINK_FORCE_MODE_NO_FORCE,
num_ml_sta, ml_sta_vdev_lst);
policy_mgr_mlo_sta_set_link(vdev,
MLO_LINK_FORCE_REASON_DISCONNECT,
MLO_LINK_FORCE_MODE_NO_FORCE,
num_ml_sta, ml_sta_vdev_lst);
}
void
@@ -5190,6 +5327,50 @@ policy_mgr_handle_ml_sta_links_on_vdev_up_csa(struct wlan_objmgr_psoc *psoc,
wlan_objmgr_vdev_release_ref(vdev, WLAN_POLICY_MGR_ID);
}
#define SET_LINK_TIMEOUT 6000
static void
policy_mgr_wait_for_set_link_update(struct policy_mgr_psoc_priv_obj *pm_ctx)
{
QDF_STATUS status;
if (!policy_mgr_get_link_in_progress(pm_ctx))
return;
status =
qdf_wait_for_event_completion(&pm_ctx->set_link_update_done_evt,
SET_LINK_TIMEOUT);
if (QDF_IS_STATUS_ERROR(status)) {
policy_mgr_set_link_in_progress(pm_ctx, false);
policy_mgr_err("wait for set_link_in_progress failed");
return;
}
}
void policy_mgr_handle_ml_sta_link_on_traffic_type_change(
struct wlan_objmgr_psoc *psoc,
struct wlan_objmgr_vdev *vdev)
{
struct policy_mgr_psoc_priv_obj *pm_ctx;
pm_ctx = policy_mgr_get_context(psoc);
if (!pm_ctx) {
policy_mgr_err("Invalid Context");
return;
}
/* Check if any set link is already progress and thus wait */
policy_mgr_wait_for_set_link_update(pm_ctx);
policy_mgr_handle_sap_cli_go_ml_sta_up_csa(psoc, vdev);
/*
* Check if traffic type change lead to set link is progress and
* thus wait for it to complete.
*/
policy_mgr_wait_for_set_link_update(pm_ctx);
}
/*
* policy_mgr_re_enable_ml_sta_on_p2p_sap_down() - Handle enable
* link on P2P/SAP/ML_STA vdev down
@@ -5255,10 +5436,10 @@ void policy_mgr_re_enable_ml_sta_on_p2p_sap_down(struct wlan_objmgr_psoc *psoc,
policy_mgr_debug("vdev %d: Affected link present, dont reanabe ML link",
vdev_id);
else
wlan_mlo_sta_mlo_concurency_set_link(vdev,
MLO_LINK_FORCE_REASON_DISCONNECT,
MLO_LINK_FORCE_MODE_NO_FORCE,
num_ml_sta, ml_sta_vdev_lst);
policy_mgr_mlo_sta_set_link(vdev,
MLO_LINK_FORCE_REASON_DISCONNECT,
MLO_LINK_FORCE_MODE_NO_FORCE,
num_ml_sta, ml_sta_vdev_lst);
}
void policy_mgr_handle_ml_sta_links_on_vdev_down(struct wlan_objmgr_psoc *psoc,

查看文件

@@ -353,6 +353,8 @@ struct policy_mgr_cfg {
* @cfg: Policy manager config data
* @dynamic_mcc_adaptive_sched: disable/enable mcc adaptive scheduler feature
* @dynamic_dfs_master_disabled: current state of dynamic dfs master
* @set_link_in_progress: To track if set link is in progress
* @set_link_update_done_evt: qdf event to synchronize set link
*/
struct policy_mgr_psoc_priv_obj {
struct wlan_objmgr_psoc *psoc;
@@ -395,6 +397,10 @@ struct policy_mgr_psoc_priv_obj {
uint32_t valid_ch_freq_list_count;
bool dynamic_mcc_adaptive_sched;
bool dynamic_dfs_master_disabled;
#ifdef WLAN_FEATURE_11BE_MLO
bool set_link_in_progress;
qdf_event_t set_link_update_done_evt;
#endif
};
/**

查看文件

@@ -429,8 +429,51 @@ static inline void policy_mgr_memzero_disabled_ml_list(void)
{
qdf_mem_zero(pm_disabled_ml_links, sizeof(pm_disabled_ml_links));
}
static QDF_STATUS
policy_mgr_init_ml_link_update(struct policy_mgr_psoc_priv_obj *pm_ctx)
{
QDF_STATUS qdf_status;
pm_ctx->set_link_in_progress = false;
qdf_status = qdf_event_create(&pm_ctx->set_link_update_done_evt);
if (QDF_IS_STATUS_ERROR(qdf_status)) {
policy_mgr_err("init event failed for for set_link_update_done_evt");
return QDF_STATUS_E_FAILURE;
}
return QDF_STATUS_SUCCESS;
}
static QDF_STATUS
policy_mgr_deinit_ml_link_update(struct policy_mgr_psoc_priv_obj *pm_ctx)
{
QDF_STATUS qdf_status;
pm_ctx->set_link_in_progress = false;
qdf_status = qdf_event_destroy(&pm_ctx->set_link_update_done_evt);
if (QDF_IS_STATUS_ERROR(qdf_status)) {
policy_mgr_err("deinit event failed for set_link_update_done_evt");
return QDF_STATUS_E_FAILURE;
}
return QDF_STATUS_SUCCESS;
}
#else
static inline void policy_mgr_memzero_disabled_ml_list(void) {}
static inline QDF_STATUS
policy_mgr_init_ml_link_update(struct policy_mgr_psoc_priv_obj *pm_ctx)
{
return QDF_STATUS_SUCCESS;
}
static inline QDF_STATUS
policy_mgr_deinit_ml_link_update(struct policy_mgr_psoc_priv_obj *pm_ctx)
{
return QDF_STATUS_SUCCESS;
}
#endif
QDF_STATUS policy_mgr_psoc_enable(struct wlan_objmgr_psoc *psoc)
@@ -461,6 +504,10 @@ QDF_STATUS policy_mgr_psoc_enable(struct wlan_objmgr_psoc *psoc)
return status;
}
status = policy_mgr_init_ml_link_update(pm_ctx);
if (QDF_IS_STATUS_ERROR(status))
return status;
/* init connection_update_done_evt */
status = policy_mgr_init_connection_update(pm_ctx);
if (!QDF_IS_STATUS_SUCCESS(status)) {
@@ -615,6 +662,11 @@ QDF_STATUS policy_mgr_psoc_disable(struct wlan_objmgr_psoc *psoc)
QDF_ASSERT(0);
}
if (QDF_IS_STATUS_ERROR(policy_mgr_deinit_ml_link_update(pm_ctx))) {
status = QDF_STATUS_E_FAILURE;
QDF_ASSERT(0);
}
/* deallocate dbs_opportunistic_timer */
if (QDF_TIMER_STATE_RUNNING ==
qdf_mc_timer_get_current_state(