From ddc9f472ac9598b47c9e360ae5600a62ef08eb67 Mon Sep 17 00:00:00 2001 From: Kai Chen Date: Tue, 3 Aug 2021 16:17:56 -0700 Subject: [PATCH] qcacmn: Enable MU sniffer mode Enable MU sniffer mode. MU sniffer mode support match and wildcard mode. Change-Id: I919b99ccabfba8f2e3b877831f473f8cf674b59d --- .../inc/wlan_vdev_mgr_tgt_if_tx_defs.h | 19 ++++++ wmi/inc/wmi_unified_api.h | 12 ++++ wmi/inc/wmi_unified_param.h | 1 + wmi/inc/wmi_unified_priv.h | 3 + wmi/src/wmi_unified_api.c | 10 +++ wmi/src/wmi_unified_tlv.c | 68 +++++++++++++++++++ 6 files changed, 113 insertions(+) diff --git a/umac/mlme/vdev_mgr/dispatcher/inc/wlan_vdev_mgr_tgt_if_tx_defs.h b/umac/mlme/vdev_mgr/dispatcher/inc/wlan_vdev_mgr_tgt_if_tx_defs.h index b9d22b4254..1572875974 100644 --- a/umac/mlme/vdev_mgr/dispatcher/inc/wlan_vdev_mgr_tgt_if_tx_defs.h +++ b/umac/mlme/vdev_mgr/dispatcher/inc/wlan_vdev_mgr_tgt_if_tx_defs.h @@ -36,6 +36,8 @@ /** slot time short */ #define WLAN_MLME_VDEV_SLOT_TIME_SHORT 0x2 +#define WLAN_MU_SNIF_MAX_AIDS 4 + /** * enum MLME_bcn_tx_rate_code - beacon tx rate code */ @@ -611,6 +613,23 @@ struct vdev_set_params { uint32_t param_value; }; +/** + * struct vdev_set_mu_snif_params - vdev set mu sniffer cmd parameter + * @vdev_id: vdev id + * @mode: mu snif mode + * @num_user: max number of user + * @num_aid: number of set sta aid + * @aid: sta aids + */ + +struct vdev_set_mu_snif_param { + uint32_t vdev_id; + uint32_t mode; + uint32_t num_user; + uint32_t num_aid; + uint32_t aid[WLAN_MU_SNIF_MAX_AIDS]; +}; + /** * struct vdev_create_params - vdev create cmd parameter * @vdev_id: interface id diff --git a/wmi/inc/wmi_unified_api.h b/wmi/inc/wmi_unified_api.h index 9a02267320..035ab4f5b1 100644 --- a/wmi/inc/wmi_unified_api.h +++ b/wmi/inc/wmi_unified_api.h @@ -887,6 +887,18 @@ wmi_unified_roam_set_param_send(wmi_unified_t wmi_handle, } #endif +/** + * wmi_unified_vdev_set_param_send() - WMI vdev set parameter function + * @wmi_handle: handle to WMI. + * @macaddr: MAC address + * @param: pointer to hold vdev set parameter + * + * Return: QDF_STATUS_SUCCESS on success and QDF_STATUS_E_FAILURE for failure + */ +QDF_STATUS +wmi_unified_vdev_set_mu_snif_send(wmi_unified_t wmi_handle, + struct vdev_set_mu_snif_param *param); + /** * wmi_unified_sifs_trigger_send() - WMI vdev sifs trigger parameter function * @wmi_handle: handle to WMI. diff --git a/wmi/inc/wmi_unified_param.h b/wmi/inc/wmi_unified_param.h index 95f2201733..4b93a6f536 100644 --- a/wmi/inc/wmi_unified_param.h +++ b/wmi/inc/wmi_unified_param.h @@ -5334,6 +5334,7 @@ typedef enum { wmi_service_mgmt_rx_reo_supported, wmi_service_phy_dma_byte_swap_support, wmi_service_spectral_session_info_support, + wmi_service_mu_snif, wmi_services_max, } wmi_conv_service_ids; #define WMI_SERVICE_UNAVAILABLE 0xFFFF diff --git a/wmi/inc/wmi_unified_priv.h b/wmi/inc/wmi_unified_priv.h index 3c2a0d730c..bd7877401c 100644 --- a/wmi/inc/wmi_unified_priv.h +++ b/wmi/inc/wmi_unified_priv.h @@ -568,6 +568,9 @@ QDF_STATUS QDF_STATUS (*send_vdev_set_param_cmd)(wmi_unified_t wmi_handle, struct vdev_set_params *param); +QDF_STATUS (*send_vdev_set_mu_snif_cmd)(wmi_unified_t wmi_handle, + struct vdev_set_mu_snif_param *param); + QDF_STATUS (*send_vdev_sifs_trigger_cmd)(wmi_unified_t wmi_handle, struct sifs_trigger_param *param); diff --git a/wmi/src/wmi_unified_api.c b/wmi/src/wmi_unified_api.c index 08d569758d..aeb6c10b5b 100644 --- a/wmi/src/wmi_unified_api.c +++ b/wmi/src/wmi_unified_api.c @@ -421,6 +421,16 @@ wmi_unified_roam_set_param_send(wmi_unified_t wmi_handle, return QDF_STATUS_E_FAILURE; } #endif +QDF_STATUS +wmi_unified_vdev_set_mu_snif_send(wmi_unified_t wmi_handle, + struct vdev_set_mu_snif_param *param) +{ + if (wmi_handle->ops->send_vdev_set_mu_snif_cmd) + return wmi_handle->ops->send_vdev_set_mu_snif_cmd(wmi_handle, + param); + + return QDF_STATUS_E_FAILURE; +} QDF_STATUS wmi_unified_sifs_trigger_send(wmi_unified_t wmi_handle, struct sifs_trigger_param *param) diff --git a/wmi/src/wmi_unified_tlv.c b/wmi/src/wmi_unified_tlv.c index 66fb1da049..98c4e3dd53 100644 --- a/wmi/src/wmi_unified_tlv.c +++ b/wmi/src/wmi_unified_tlv.c @@ -2219,6 +2219,71 @@ static QDF_STATUS send_vdev_set_param_cmd_tlv(wmi_unified_t wmi_handle, return ret; } +/** + * send_vdev_set_mu_snif_cmd_tlv() - WMI vdev set mu snif function + * @param wmi_handle : handle to WMI. + * @param param : pointer to hold mu sniffer parameter + * + * Return: 0 on success and -ve on failure. + */ +static +QDF_STATUS send_vdev_set_mu_snif_cmd_tlv(wmi_unified_t wmi_handle, + struct vdev_set_mu_snif_param *param) +{ + QDF_STATUS ret; + wmi_vdev_set_mu_snif_cmd_param *cmd; + wmi_buf_t buf; + uint32_t *tmp_ptr; + uint16_t len = sizeof(*cmd); + uint8_t *buf_ptr; + uint32_t i; + + /* Length TLV placeholder for array of uint32_t */ + len += WMI_TLV_HDR_SIZE; + + if (param->num_aid) + len += param->num_aid * sizeof(uint32_t); + + buf = wmi_buf_alloc(wmi_handle, len); + if (!buf) + return QDF_STATUS_E_NOMEM; + + buf_ptr = (uint8_t *)wmi_buf_data(buf); + cmd = (wmi_vdev_set_mu_snif_cmd_param *)buf_ptr; + + WMITLV_SET_HDR(&cmd->tlv_header, + WMITLV_TAG_STRUC_wmi_vdev_set_mu_snif_cmd_param, + WMITLV_GET_STRUCT_TLVLEN + (wmi_vdev_set_mu_snif_cmd_param)); + + cmd->vdev_id = param->vdev_id; + cmd->mode = param->mode; + cmd->max_num_user = param->num_user; + + buf_ptr += sizeof(*cmd); + + tmp_ptr = (uint32_t *)(buf_ptr + WMI_TLV_HDR_SIZE); + + for (i = 0; i < param->num_aid; ++i) + tmp_ptr[i] = param->aid[i]; + + WMITLV_SET_HDR(buf_ptr, + WMITLV_TAG_ARRAY_UINT32, + (param->num_aid * sizeof(uint32_t))); + + wmi_debug("Setting vdev %d mode = %x, max user = %u aids= %u", + cmd->vdev_id, cmd->mode, cmd->max_num_user, param->num_aid); + wmi_mtrace(WMI_VDEV_SET_PARAM_CMDID, cmd->vdev_id, 0); + ret = wmi_unified_cmd_send(wmi_handle, buf, len, + WMI_VDEV_SET_MU_SNIF_CMDID); + if (QDF_IS_STATUS_ERROR(ret)) { + wmi_err("Failed to send set param command ret = %d", ret); + wmi_buf_free(buf); + } + + return ret; +} + /** * send_peer_based_pktlog_cmd() - Send WMI command to enable packet-log * @wmi_handle: handle to WMI. @@ -5405,6 +5470,7 @@ static bool is_service_enabled_tlv(wmi_unified_t wmi_handle, wmi_err("WMI service ext bit map is not saved yet"); return false; } + return WMI_SERVICE_EXT2_IS_ENABLED(soc->wmi_service_bitmap, soc->wmi_ext_service_bitmap, soc->wmi_ext2_service_bitmap, @@ -16715,6 +16781,7 @@ struct wmi_ops tlv_ops = { .send_crash_inject_cmd = send_crash_inject_cmd_tlv, .send_dbglog_cmd = send_dbglog_cmd_tlv, .send_vdev_set_param_cmd = send_vdev_set_param_cmd_tlv, + .send_vdev_set_mu_snif_cmd = send_vdev_set_mu_snif_cmd_tlv, .send_packet_log_enable_cmd = send_packet_log_enable_cmd_tlv, .send_peer_based_pktlog_cmd = send_peer_based_pktlog_cmd, .send_time_stamp_sync_cmd = send_time_stamp_sync_cmd_tlv, @@ -17971,6 +18038,7 @@ static void populate_tlv_service(uint32_t *wmi_service) WMI_SERVICE_UNAVAILABLE; wmi_service[wmi_service_spectral_session_info_support] = WMI_SERVICE_UNAVAILABLE; + wmi_service[wmi_service_mu_snif] = WMI_SERVICE_MU_SNIF; } /**