qcacmn: Add support for MLO stats
As part of MLO stats feature, add support to send ll_stats and get_station stats request to firmware for all the MLO vdevs. Change-Id: Ic50a6294f868f0604d4cfc0d4b657b6085da2fb4 CRs-Fixed: 3181020
This commit is contained in:

gecommit door
Madan Koyyalamudi

bovenliggende
7e099c5668
commit
16c15a6499
@@ -1599,7 +1599,7 @@ bool wlan_vdev_mlme_is_mlo_mcast_vdev(struct wlan_objmgr_vdev *vdev)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* wlan_vdev_mlme_is_mlo_vdev() - whether it is mlo sta link vdev or not
|
* wlan_vdev_mlme_is_mlo_link_vdev() - whether it is mlo sta link vdev or not
|
||||||
* @vdev: VDEV object
|
* @vdev: VDEV object
|
||||||
*
|
*
|
||||||
* Return: True if it is mlo sta link, otherwise false.
|
* Return: True if it is mlo sta link, otherwise false.
|
||||||
|
@@ -409,9 +409,8 @@ QDF_STATUS mlo_ser_set_link_req(struct mlo_link_set_active_req *req);
|
|||||||
typedef void (*mlo_vdev_ops_handler)(struct wlan_objmgr_vdev *vdev,
|
typedef void (*mlo_vdev_ops_handler)(struct wlan_objmgr_vdev *vdev,
|
||||||
void *arg);
|
void *arg);
|
||||||
|
|
||||||
/*
|
/**
|
||||||
* mlo_iterate_ml_vdev_list: Iterate on ML vdevs of MLD
|
* mlo_iterate_ml_vdev_list() - Iterate on ML vdevs of MLD
|
||||||
*
|
|
||||||
* @vdev: vdev object
|
* @vdev: vdev object
|
||||||
* @handler: the handler will be called for each object in ML list
|
* @handler: the handler will be called for each object in ML list
|
||||||
* @arg: argument to be passed to handler
|
* @arg: argument to be passed to handler
|
||||||
@@ -458,5 +457,27 @@ void mlo_iterate_ml_vdev_list(struct wlan_objmgr_vdev *vdev,
|
|||||||
mlo_dev_lock_release(mlo_dev_ctx);
|
mlo_dev_lock_release(mlo_dev_ctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* struct mlo_stats_vdev_params - vdev params for MLO stats request
|
||||||
|
* @ml_vdev_count: Num of connected mlo vdevs
|
||||||
|
* @ml_vdev_id: vdev_ids of ml vdevs
|
||||||
|
*/
|
||||||
|
struct mlo_stats_vdev_params {
|
||||||
|
uint8_t ml_vdev_count;
|
||||||
|
uint8_t ml_vdev_id[WLAN_UMAC_MLO_MAX_VDEVS];
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* mlo_get_mlstats_vdev_params() - Get vdev params for MLO stats
|
||||||
|
* @psoc: psoc object
|
||||||
|
* @vdev_id: vdev id
|
||||||
|
* @ml_vdev_info: pointer to mlo_stats_vdev_params
|
||||||
|
*
|
||||||
|
* Return: QDF_STATUS
|
||||||
|
*/
|
||||||
|
QDF_STATUS
|
||||||
|
mlo_get_mlstats_vdev_params(struct wlan_objmgr_psoc *psoc,
|
||||||
|
struct mlo_stats_vdev_params *ml_vdev_info,
|
||||||
|
uint8_t vdev_id);
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
@@ -625,3 +625,31 @@ void mlo_mlme_handle_sta_csa_param(struct wlan_objmgr_vdev *vdev,
|
|||||||
|
|
||||||
mlo_ctx->mlme_ops->mlo_mlme_ext_handle_sta_csa_param(vdev, csa_param);
|
mlo_ctx->mlme_ops->mlo_mlme_ext_handle_sta_csa_param(vdev, csa_param);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QDF_STATUS
|
||||||
|
mlo_get_mlstats_vdev_params(struct wlan_objmgr_psoc *psoc,
|
||||||
|
struct mlo_stats_vdev_params *info,
|
||||||
|
uint8_t vdev_id)
|
||||||
|
{
|
||||||
|
struct wlan_objmgr_vdev *ml_vdev_list[WLAN_UMAC_MLO_MAX_VDEVS] = {0};
|
||||||
|
struct wlan_objmgr_vdev *vdev;
|
||||||
|
int i;
|
||||||
|
uint16_t ml_vdev_cnt = 0;
|
||||||
|
|
||||||
|
vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id,
|
||||||
|
WLAN_MLO_MGR_ID);
|
||||||
|
if (!vdev) {
|
||||||
|
mlo_err("vdev object is NULL for vdev %d", vdev_id);
|
||||||
|
return QDF_STATUS_E_INVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
mlo_get_ml_vdev_list(vdev, &ml_vdev_cnt, ml_vdev_list);
|
||||||
|
for (i = 0; i < ml_vdev_cnt; i++) {
|
||||||
|
info->ml_vdev_id[i] = wlan_vdev_get_id(ml_vdev_list[i]);
|
||||||
|
mlo_release_vdev_ref(ml_vdev_list[i]);
|
||||||
|
}
|
||||||
|
info->ml_vdev_count = ml_vdev_cnt;
|
||||||
|
mlo_release_vdev_ref(vdev);
|
||||||
|
|
||||||
|
return QDF_STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
@@ -579,7 +579,7 @@ mlo_send_link_connect(struct wlan_objmgr_vdev *vdev,
|
|||||||
&ssid.length);
|
&ssid.length);
|
||||||
|
|
||||||
if (!ml_parnter_info->num_partner_links) {
|
if (!ml_parnter_info->num_partner_links) {
|
||||||
mlo_err("No patner info in connect resp");
|
mlo_err("No partner info in connect resp");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -619,7 +619,7 @@ mlo_send_link_connect(struct wlan_objmgr_vdev *vdev,
|
|||||||
uint8_t j = 0;
|
uint8_t j = 0;
|
||||||
|
|
||||||
if (!ml_parnter_info->num_partner_links) {
|
if (!ml_parnter_info->num_partner_links) {
|
||||||
mlo_err("No patner info in connect resp");
|
mlo_err("No partner info in connect resp");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -1222,7 +1222,7 @@ struct peer_assoc_ml_partner_links {
|
|||||||
* @peer_bss_max_idle_option: Peer BSS Max Idle option update
|
* @peer_bss_max_idle_option: Peer BSS Max Idle option update
|
||||||
* @akm: AKM info
|
* @akm: AKM info
|
||||||
* @peer_assoc_mlo_params mlo_params: MLO assoc params
|
* @peer_assoc_mlo_params mlo_params: MLO assoc params
|
||||||
* @peer_assoc_ml_partner_links: MLO patner links
|
* @peer_assoc_ml_partner_links: MLO partner links
|
||||||
* @t2lm_params: TID-to-link mapping params
|
* @t2lm_params: TID-to-link mapping params
|
||||||
*/
|
*/
|
||||||
struct peer_assoc_params {
|
struct peer_assoc_params {
|
||||||
@@ -2338,12 +2338,20 @@ struct ll_stats_set_params {
|
|||||||
* @vdev_id: vdev id
|
* @vdev_id: vdev id
|
||||||
* @param_id_mask: param is mask
|
* @param_id_mask: param is mask
|
||||||
* @peer_macaddr: MAC address of the peer for which stats are desired
|
* @peer_macaddr: MAC address of the peer for which stats are desired
|
||||||
|
* @is_mlo_req: is the request for mlo vdev
|
||||||
|
* @vdev_id_bitmap: vdev_id_bitmap of all the connected mlo vdevs
|
||||||
|
* @mld_macaddr: MLD MAC address
|
||||||
*/
|
*/
|
||||||
struct ll_stats_get_params {
|
struct ll_stats_get_params {
|
||||||
uint32_t req_id;
|
uint32_t req_id;
|
||||||
uint8_t vdev_id;
|
uint8_t vdev_id;
|
||||||
uint32_t param_id_mask;
|
uint32_t param_id_mask;
|
||||||
struct qdf_mac_addr peer_macaddr;
|
struct qdf_mac_addr peer_macaddr;
|
||||||
|
#ifdef WLAN_FEATURE_11BE_MLO
|
||||||
|
bool is_mlo_req;
|
||||||
|
uint32_t vdev_id_bitmap;
|
||||||
|
struct qdf_mac_addr mld_macaddr;
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@@ -5812,6 +5812,77 @@ static QDF_STATUS send_process_ll_stats_get_cmd_tlv(wmi_unified_t wmi_handle,
|
|||||||
return QDF_STATUS_SUCCESS;
|
return QDF_STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef WLAN_FEATURE_11BE_MLO
|
||||||
|
static int
|
||||||
|
wmi_get_tlv_length_for_mlo_stats(const struct ll_stats_get_params *get_req)
|
||||||
|
{
|
||||||
|
int32_t len = 0;
|
||||||
|
|
||||||
|
/* In case of MLO connection, update the length of the buffer.
|
||||||
|
* The wmi_inst_rssi_stats_params structure is not needed for MLO stats,
|
||||||
|
* hence just update the TLV header, but allocate no memory for it.
|
||||||
|
*/
|
||||||
|
if (!get_req->is_mlo_req)
|
||||||
|
return len;
|
||||||
|
|
||||||
|
len += WMI_TLV_HDR_SIZE + 0 * sizeof(wmi_inst_rssi_stats_params) +
|
||||||
|
WMI_TLV_HDR_SIZE + 1 * sizeof(uint32_t) +
|
||||||
|
WMI_TLV_HDR_SIZE + 1 * sizeof(wmi_mac_addr);
|
||||||
|
|
||||||
|
return len;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
wmi_update_tlv_headers_for_mlo_stats(const struct ll_stats_get_params *get_req,
|
||||||
|
void *buf_ptr)
|
||||||
|
{
|
||||||
|
wmi_request_unified_ll_get_sta_cmd_fixed_param *unified_cmd;
|
||||||
|
uint32_t *vdev_id_bitmap;
|
||||||
|
wmi_mac_addr *mld_mac;
|
||||||
|
|
||||||
|
/* In case of MLO connection, update the TLV Headers */
|
||||||
|
if (!get_req->is_mlo_req)
|
||||||
|
return;
|
||||||
|
|
||||||
|
buf_ptr += sizeof(*unified_cmd);
|
||||||
|
|
||||||
|
/* Fill TLV but no data for wmi_inst_rssi_stats_params */
|
||||||
|
WMITLV_SET_HDR(buf_ptr, WMITLV_TAG_ARRAY_STRUC, 0);
|
||||||
|
buf_ptr += WMI_TLV_HDR_SIZE;
|
||||||
|
|
||||||
|
/* Adding vdev_bitmap_id array TLV */
|
||||||
|
WMITLV_SET_HDR(buf_ptr, WMITLV_TAG_ARRAY_UINT32,
|
||||||
|
sizeof(*vdev_id_bitmap));
|
||||||
|
buf_ptr += WMI_TLV_HDR_SIZE;
|
||||||
|
vdev_id_bitmap = buf_ptr;
|
||||||
|
*(vdev_id_bitmap) = get_req->vdev_id_bitmap;
|
||||||
|
buf_ptr += sizeof(*vdev_id_bitmap);
|
||||||
|
|
||||||
|
/* Adding mld_macaddr array TLV */
|
||||||
|
WMITLV_SET_HDR(buf_ptr, WMITLV_TAG_ARRAY_FIXED_STRUC,
|
||||||
|
sizeof(*mld_mac));
|
||||||
|
buf_ptr += WMI_TLV_HDR_SIZE;
|
||||||
|
mld_mac = buf_ptr;
|
||||||
|
WMI_CHAR_ARRAY_TO_MAC_ADDR(get_req->mld_macaddr.bytes, mld_mac);
|
||||||
|
|
||||||
|
wmi_debug("MLO vdev_id_bitmap: 0x%x MLD MAC Addr: "
|
||||||
|
QDF_MAC_ADDR_FMT, get_req->vdev_id_bitmap,
|
||||||
|
QDF_MAC_ADDR_REF(get_req->mld_macaddr.bytes));
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
static inline int
|
||||||
|
wmi_get_tlv_length_for_mlo_stats(const struct ll_stats_get_params *get_req)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void
|
||||||
|
wmi_update_tlv_headers_for_mlo_stats(const struct ll_stats_get_params *get_req,
|
||||||
|
void *buf_ptr)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef FEATURE_CLUB_LL_STATS_AND_GET_STATION
|
#ifdef FEATURE_CLUB_LL_STATS_AND_GET_STATION
|
||||||
/**
|
/**
|
||||||
* send_unified_ll_stats_get_sta_cmd_tlv() - unified link layer stats and get
|
* send_unified_ll_stats_get_sta_cmd_tlv() - unified link layer stats and get
|
||||||
@@ -5833,8 +5904,9 @@ static QDF_STATUS send_unified_ll_stats_get_sta_cmd_tlv(
|
|||||||
bool is_ll_get_sta_stats_over_qmi;
|
bool is_ll_get_sta_stats_over_qmi;
|
||||||
|
|
||||||
len = sizeof(*unified_cmd);
|
len = sizeof(*unified_cmd);
|
||||||
buf = wmi_buf_alloc(wmi_handle, len);
|
len += wmi_get_tlv_length_for_mlo_stats(get_req);
|
||||||
|
|
||||||
|
buf = wmi_buf_alloc(wmi_handle, len);
|
||||||
if (!buf)
|
if (!buf)
|
||||||
return QDF_STATUS_E_NOMEM;
|
return QDF_STATUS_E_NOMEM;
|
||||||
|
|
||||||
@@ -5868,6 +5940,7 @@ static QDF_STATUS send_unified_ll_stats_get_sta_cmd_tlv(
|
|||||||
get_req->req_id, get_req->param_id_mask, get_req->vdev_id,
|
get_req->req_id, get_req->param_id_mask, get_req->vdev_id,
|
||||||
QDF_MAC_ADDR_REF(get_req->peer_macaddr.bytes));
|
QDF_MAC_ADDR_REF(get_req->peer_macaddr.bytes));
|
||||||
|
|
||||||
|
wmi_update_tlv_headers_for_mlo_stats(get_req, buf_ptr);
|
||||||
wmi_mtrace(WMI_REQUEST_UNIFIED_LL_GET_STA_CMDID, get_req->vdev_id, 0);
|
wmi_mtrace(WMI_REQUEST_UNIFIED_LL_GET_STA_CMDID, get_req->vdev_id, 0);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Verwijs in nieuw issue
Block a user