qcacmn: Add handling for mlo link disable event

Add code changes to handle new wmi_mlo_link_disable_event
Extract the wmi event params and store in host defined
structure.

Change-Id: I6893bfa4da7b27f4a9b1ce2936057bb3576a317c
CRs-Fixed: 3458680
Tento commit je obsažen v:
Amruta Kulkarni
2023-05-02 19:05:09 -07:00
odevzdal Madan Koyyalamudi
rodič 2b2a9fc6c8
revize c16aa9d544
12 změnil soubory, kde provedl 240 přidání a 4 odebrání

Zobrazit soubor

@@ -1532,6 +1532,7 @@ struct wlan_lmac_if_mlo_tx_ops {
* @process_mlo_vdev_tid_to_link_map_event: function pointer to rx T2LM event
* @mlo_link_removal_handler: function pointer for MLO link removal handler
* @process_mlo_link_state_info_event: function pointer for mlo link state
* @mlo_link_disable_request_handler: function ptr for mlo link disable request
*/
struct wlan_lmac_if_mlo_rx_ops {
QDF_STATUS
@@ -1546,6 +1547,9 @@ struct wlan_lmac_if_mlo_rx_ops {
QDF_STATUS (*process_mlo_link_state_info_event)(
struct wlan_objmgr_psoc *psoc,
struct ml_link_state_info_event *event);
QDF_STATUS (*mlo_link_disable_request_handler)(
struct wlan_objmgr_psoc *psoc,
void *evt_params);
};
#endif

Zobrazit soubor

@@ -978,7 +978,8 @@ wlan_lmac_if_mlo_mgr_rx_ops_register(struct wlan_lmac_if_rx_ops *rx_ops)
wlan_mlo_vdev_tid_to_link_map_event;
rx_ops->mlo_rx_ops.process_mlo_link_state_info_event =
wlan_handle_ml_link_state_info_event;
rx_ops->mlo_rx_ops.mlo_link_disable_request_handler =
wlan_mlo_link_disable_request_handler;
}
#else
static void

Zobrazit soubor

@@ -1068,4 +1068,14 @@ struct mgmt_rx_mlo_link_removal_info {
uint16_t tbtt_count;
};
/**
* struct mlo_link_disable_request_evt_params - MLO link disable
* request params
* @mld_addr: disable mld address
* @link_id_bitmap: Disable Link id bitmap
*/
struct mlo_link_disable_request_evt_params {
struct qdf_mac_addr mld_addr;
uint32_t link_id_bitmap;
};
#endif

Zobrazit soubor

@@ -714,6 +714,7 @@ QDF_STATUS wlan_process_bcn_prbrsp_t2lm_ie(struct wlan_objmgr_vdev *vdev,
*/
QDF_STATUS wlan_send_tid_to_link_mapping(struct wlan_objmgr_vdev *vdev,
struct wlan_t2lm_info *t2lm);
/**
* wlan_get_t2lm_mapping_status() - API to get T2LM info
* @vdev: Pointer to vdev
@@ -736,7 +737,6 @@ QDF_STATUS wlan_get_t2lm_mapping_status(struct wlan_objmgr_vdev *vdev,
QDF_STATUS
wlan_send_peer_level_tid_to_link_mapping(struct wlan_objmgr_vdev *vdev,
struct wlan_objmgr_peer *peer);
#else
static inline QDF_STATUS wlan_mlo_parse_t2lm_ie(
struct wlan_t2lm_onging_negotiation_info *t2lm, uint8_t *ie)
@@ -880,10 +880,30 @@ wlan_send_peer_level_tid_to_link_mapping(struct wlan_objmgr_vdev *vdev,
*/
void
wlan_clear_peer_level_tid_to_link_mapping(struct wlan_objmgr_vdev *vdev);
/**
* wlan_mlo_link_disable_request_handler() - API to handle mlo link disable
* request handler.
*
* @psoc: Pointer to psoc
* @evt_params: MLO Link disable request params
*
* Return QDF_STATUS
*/
QDF_STATUS
wlan_mlo_link_disable_request_handler(struct wlan_objmgr_psoc *psoc,
void *evt_params);
#else
static inline void
wlan_clear_peer_level_tid_to_link_mapping(struct wlan_objmgr_vdev *vdev)
{
}
static inline QDF_STATUS
wlan_mlo_link_disable_request_handler(struct wlan_objmgr_psoc *psoc,
void *evt_params)
{
return QDF_STATUS_E_NOSUPPORT;
}
#endif
#endif /* _WLAN_MLO_T2LM_H_ */

Zobrazit soubor

@@ -22,10 +22,10 @@
#include <wlan_objmgr_vdev_obj.h>
#include <wlan_objmgr_peer_obj.h>
#include <wlan_mlo_mgr_public_structs.h>
#include <wlan_mlo_t2lm.h>
#include <wlan_mlo_mgr_cmn.h>
#include <qdf_util.h>
#include <wlan_cm_api.h>
#include "wlan_utility.h"
#if defined(WLAN_FEATURE_11BE_MLO) && defined(WLAN_FEATURE_11BE_MLO_ADV_FEATURE)
#include <wlan_t2lm_api.h>
#endif
@@ -300,7 +300,8 @@ uint8_t *wlan_mlo_add_t2lm_info_ie(uint8_t *frm, struct wlan_t2lm_info *t2lm,
frm += sizeof(*t2lm_ie) + sizeof(uint8_t);
} else {
for (tid_num = 0; tid_num < T2LM_MAX_NUM_TIDS; tid_num++)
if (t2lm->hw_link_map_tid[tid_num])
if (t2lm->hw_link_map_tid[tid_num] ||
t2lm->ieee_link_map_tid[tid_num])
link_mapping_presence_indicator |= BIT(tid_num);
QDF_SET_BITS(t2lm_control,
@@ -1397,3 +1398,60 @@ wlan_mlo_t2lm_timer_deinit(struct wlan_objmgr_vdev *vdev)
t2lm_dev_lock_destroy(&vdev->mlo_dev_ctx->t2lm_ctx);
return QDF_STATUS_SUCCESS;
}
#if defined(WLAN_FEATURE_11BE_MLO_ADV_FEATURE) && defined(WLAN_FEATURE_11BE)
QDF_STATUS
wlan_mlo_link_disable_request_handler(struct wlan_objmgr_psoc *psoc,
void *evt_params)
{
struct wlan_objmgr_vdev *vdev;
QDF_STATUS status = QDF_STATUS_SUCCESS;
uint8_t vdev_id;
bool is_connected = false;
struct mlo_link_disable_request_evt_params *params;
if (!psoc)
return QDF_STATUS_E_NULL_VALUE;
if (!evt_params) {
t2lm_err("event params is null");
return QDF_STATUS_E_NULL_VALUE;
}
params = (struct mlo_link_disable_request_evt_params *)evt_params;
if (qdf_is_macaddr_zero(&params->mld_addr)) {
t2lm_err("mld mac addr in event params is null");
return QDF_STATUS_E_NULL_VALUE;
}
if (!params->link_id_bitmap) {
t2lm_debug("Link id bitmap is 0, no action frame to be sent");
return QDF_STATUS_SUCCESS;
}
is_connected = wlan_get_connected_vdev_by_mld_addr(psoc,
params->mld_addr.bytes,
&vdev_id);
if (!is_connected) {
t2lm_err("Not connected to peer MLD " QDF_MAC_ADDR_FMT,
params->mld_addr.bytes);
return QDF_STATUS_E_FAILURE;
}
vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id,
WLAN_MLO_MGR_ID);
if (!vdev) {
t2lm_err("vdev is null");
return QDF_STATUS_E_NULL_VALUE;
}
status = wlan_populate_link_disable_t2lm_frame(vdev, params);
if (QDF_IS_STATUS_ERROR(status))
t2lm_err("Failed to handle link disable");
wlan_objmgr_vdev_release_ref(vdev, WLAN_MLO_MGR_ID);
return status;
}
#endif