Selaa lähdekoodia

qcacmn: Enable MU sniffer mode

Enable MU sniffer mode. MU sniffer mode support match and wildcard
mode.

Change-Id: I919b99ccabfba8f2e3b877831f473f8cf674b59d
Kai Chen 3 vuotta sitten
vanhempi
sitoutus
ddc9f472ac

+ 19 - 0
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

+ 12 - 0
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.

+ 1 - 0
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

+ 3 - 0
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);
 

+ 10 - 0
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)

+ 68 - 0
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;
 }
 
 /**