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:
Aditya Kodukula
2022-03-25 16:28:28 -07:00
gecommit door Madan Koyyalamudi
bovenliggende 7e099c5668
commit 16c15a6499
6 gewijzigde bestanden met toevoegingen van 138 en 8 verwijderingen

Bestand weergeven

@@ -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.

Bestand weergeven

@@ -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

Bestand weergeven

@@ -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;
}

Bestand weergeven

@@ -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;
} }

Bestand weergeven

@@ -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
}; };

Bestand weergeven

@@ -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);
/** /**