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
2020-07-27 11:10:11 -07:00
committed by snandini
コミット bf0f1c90b3
8個のファイルの変更83行の追加0行の削除

ファイルの表示

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

ファイルの表示

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

ファイルの表示

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

ファイルの表示

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

ファイルの表示

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

ファイルの表示

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

ファイルの表示

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

ファイルの表示

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