1
0

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
Este cometimento está contido em:
Srinivas Pitla
2020-07-27 11:10:11 -07:00
cometido por snandini
ascendente 376724d4f9
cometimento bf0f1c90b3
8 ficheiros modificados com 83 adições e 0 eliminações

Ver ficheiro

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

Ver ficheiro

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

Ver ficheiro

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

Ver ficheiro

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

Ver ficheiro

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

Ver ficheiro

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

Ver ficheiro

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

Ver ficheiro

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