Browse Source

qcacmn: Dynamic Tx VDEV config

This change allow Tx VDEV of MBSS mode to configured
dynamically by reset the VDEVs.

This change includes FW service bit parsing, checking
VDEV state of all VDEVs, sending MBSS information in
VDEV start command

Change-Id: I46b13629bd1c07be86b408d72c2967642ce8542e
CRs-Fixed: 2759229
Srinivas Pitla 5 years ago
parent
commit
bf0f1c90b3

+ 5 - 0
target_if/init_deinit/src/init_event_handler.c

@@ -124,6 +124,11 @@ static int init_deinit_service_ready_event_handler(ol_scn_t scn_handle,
 	if (wmi_service_enabled(wmi_handle, wmi_service_infra_mbssid))
 		wlan_psoc_nif_fw_ext_cap_set(psoc, WLAN_SOC_CEXT_MBSS_IE);
 
+	if (wmi_service_enabled(wmi_handle,
+				wmi_service_mbss_param_in_vdev_start_support))
+		wlan_psoc_nif_fw_ext_cap_set(psoc,
+					     WLAN_SOC_CEXT_MBSS_PARAM_IN_START);
+
 	if (wmi_service_enabled(wmi_handle, wmi_service_dynamic_hw_mode))
 		wlan_psoc_nif_fw_ext_cap_set(psoc, WLAN_SOC_CEXT_DYNAMIC_HW_MODE);
 

+ 2 - 0
umac/cmn_services/obj_mgr/inc/wlan_objmgr_psoc_obj.h

@@ -140,6 +140,8 @@
 #define WLAN_SOC_NSS_RATIO_TO_HOST_SUPPORT 0x00200000
 	/* EMA AP Support */
 #define WLAN_SOC_CEXT_EMA_AP           0x00400000
+	/* MBSS PARAM IN START REQ Support */
+#define WLAN_SOC_CEXT_MBSS_PARAM_IN_START   0x00800000
 
 /* feature_flags */
 	/* CONF: ATH FF enabled */

+ 17 - 0
umac/cmn_services/utils/inc/wlan_utility.h

@@ -253,6 +253,23 @@ QDF_STATUS wlan_pdev_chan_change_pending_vdevs_down(
 					unsigned long *vdev_id_map,
 					wlan_objmgr_ref_dbgid dbg_id);
 
+/**
+ * wlan_pdev_chan_change_pending_ap_vdevs_down() - function to test/set channel
+ *                                            change pending flag for AP VDEVs
+ * @pdev: pdev object
+ * @vdev_id_map: bitmap to derive channel change AP vdevs
+ * @ref_id: object manager ref id
+ *
+ * This function test/set channel change pending flag for AP vdevs
+ *
+ * Return: QDF_STATUS_SUCCESS, if it iterates through all vdevs,
+ *         otherwise QDF_STATUS_E_FAILURE
+ */
+QDF_STATUS wlan_pdev_chan_change_pending_ap_vdevs_down(
+					struct wlan_objmgr_pdev *pdev,
+					unsigned long *vdev_id_map,
+					wlan_objmgr_ref_dbgid dbg_id);
+
 /**
  * wlan_chan_eq() - function to check whether both channels are same
  * @chan1: channel1 object

+ 43 - 0
umac/cmn_services/utils/src/wlan_utility.c

@@ -306,7 +306,35 @@ static void wlan_vdev_down_pending(struct wlan_objmgr_pdev *pdev,
 			wlan_vdev_obj_unlock(vdev);
 			return;
 		}
+		wlan_util_change_map_index(vdev_id_map, id, 1);
+	}
+
+	wlan_vdev_obj_unlock(vdev);
+}
+
+static void wlan_vdev_ap_down_pending(struct wlan_objmgr_pdev *pdev,
+				      void *object, void *arg)
+{
+	struct wlan_objmgr_vdev *vdev = (struct wlan_objmgr_vdev *)object;
+	unsigned long *vdev_id_map = (unsigned long *)arg;
+	uint8_t id = 0;
+	struct wlan_objmgr_psoc *psoc;
 
+	psoc = wlan_pdev_get_psoc(pdev);
+	if (!psoc)
+		return;
+
+	if (wlan_vdev_mlme_get_opmode(vdev) != QDF_SAP_MODE)
+		return;
+
+	wlan_vdev_obj_lock(vdev);
+	if (wlan_vdev_mlme_is_init_state(vdev) != QDF_STATUS_SUCCESS) {
+		id = wlan_vdev_get_id(vdev);
+		/* Invalid vdev id */
+		if (id >= wlan_psoc_get_max_vdev_count(psoc)) {
+			wlan_vdev_obj_unlock(vdev);
+			return;
+		}
 		wlan_util_change_map_index(vdev_id_map, id, 1);
 	}
 
@@ -328,6 +356,21 @@ QDF_STATUS wlan_pdev_chan_change_pending_vdevs_down(
 	return QDF_STATUS_SUCCESS;
 }
 
+QDF_STATUS wlan_pdev_chan_change_pending_ap_vdevs_down(
+						struct wlan_objmgr_pdev *pdev,
+						unsigned long *vdev_id_map,
+						wlan_objmgr_ref_dbgid dbg_id)
+{
+	if (!pdev)
+		return QDF_STATUS_E_INVAL;
+
+	wlan_objmgr_pdev_iterate_obj_list(pdev, WLAN_VDEV_OP,
+					  wlan_vdev_ap_down_pending,
+					  vdev_id_map, 0, dbg_id);
+
+	return QDF_STATUS_SUCCESS;
+}
+
 QDF_STATUS wlan_chan_eq(struct wlan_channel *chan1, struct wlan_channel *chan2)
 {
 	if ((chan1->ch_ieee == chan2->ch_ieee) &&

+ 6 - 0
umac/mlme/vdev_mgr/core/src/vdev_mgr_ops.c

@@ -126,6 +126,7 @@ static QDF_STATUS vdev_mgr_start_param_update(
 	struct wlan_objmgr_pdev *pdev;
 	enum QDF_OPMODE op_mode;
 	bool is_dfs_chan_updated = false;
+	struct vdev_mlme_mbss_11ax *mbss;
 
 	vdev = mlme_obj->vdev;
 	if (!vdev) {
@@ -203,6 +204,11 @@ static QDF_STATUS vdev_mgr_start_param_update(
 	param->channel.reg_class_id = mlme_obj->mgmt.generic.reg_class_id;
 	param->bcn_tx_rate_code = vdev_mgr_fetch_ratecode(mlme_obj);
 	param->ldpc_rx_enabled = mlme_obj->proto.generic.ldpc;
+
+	mbss = &mlme_obj->mgmt.mbss_11ax;
+	param->mbssid_flags = mbss->mbssid_flags;
+	param->vdevid_trans = mbss->vdevid_trans;
+
 	if (mlme_obj->mgmt.generic.type == WLAN_VDEV_MLME_TYPE_AP) {
 		param->hidden_ssid = mlme_obj->mgmt.ap.hidden_ssid;
 		param->cac_duration_ms = mlme_obj->mgmt.ap.cac_duration_ms;

+ 4 - 0
umac/mlme/vdev_mgr/dispatcher/inc/wlan_vdev_mgr_tgt_if_tx_defs.h

@@ -448,6 +448,8 @@ struct vdev_scan_nac_rssi_params {
  * @channel_param: Channel params required by target.
  * @bcn_tx_rate_code: Beacon tx rate code.
  * @ldpc_rx_enabled: Enable/Disable LDPC RX for this vdev
+ * @mbssid_flags: MBSSID flags to FW
+ * @vdevid_trans: Tx VDEV ID
  */
 struct vdev_start_params {
 	uint8_t vdev_id;
@@ -467,6 +469,8 @@ struct vdev_start_params {
 	struct mlme_channel_param channel;
 	enum mlme_bcn_tx_rate_code bcn_tx_rate_code;
 	bool ldpc_rx_enabled;
+	uint32_t mbssid_flags;
+	uint8_t vdevid_trans;
 };
 
 /**

+ 1 - 0
wmi/inc/wmi_unified_param.h

@@ -5247,6 +5247,7 @@ typedef enum {
 	wmi_service_cfr_capture_count_support,
 	wmi_service_ll_stats_per_chan_rx_tx_time,
 	wmi_service_thermal_multi_client_support,
+	wmi_service_mbss_param_in_vdev_start_support,
 	wmi_services_max,
 } wmi_conv_service_ids;
 #define WMI_SERVICE_UNAVAILABLE 0xFFFF

+ 5 - 0
wmi/src/wmi_unified_tlv.c

@@ -1040,6 +1040,9 @@ static QDF_STATUS send_vdev_start_cmd_tlv(wmi_unified_t wmi_handle,
 	if (!req->is_restart) {
 		if (req->pmf_enabled)
 			cmd->flags |= WMI_UNIFIED_VDEV_START_PMF_ENABLED;
+
+		cmd->mbss_capability_flags = req->mbssid_flags;
+		cmd->vdevid_trans = req->vdevid_trans;
 	}
 
 	/* Copy the SSID */
@@ -14780,6 +14783,8 @@ static void populate_tlv_service(uint32_t *wmi_service)
 			WMI_SERVICE_LL_STATS_PER_CHAN_RX_TX_TIME_SUPPORT;
 	wmi_service[wmi_service_thermal_multi_client_support] =
 			WMI_SERVICE_THERMAL_MULTI_CLIENT_SUPPORT;
+	wmi_service[wmi_service_mbss_param_in_vdev_start_support] =
+			WMI_SERVICE_MBSS_PARAM_IN_VDEV_START_SUPPORT;
 }
 
 /**