qcacld-3.0: Populate vdev mlme with vdev start req

Populate vdev mlme obj and dest chain with vdev start req for
vdev_mgr_start_send.
Remove vdev_start_params from wma_vdev_start.
Remove vdev_mgr_start_param_populate.

Change-Id: I8606441341344fbcd181facf4000942ff94ac00d
CRs-Fixed: 2516590
This commit is contained in:
Jianmin Zhu 2019-09-12 19:30:10 +08:00 • committed by nshrivas
commit e224e5f3bd
2 changed files with 52 additions and 142 deletions

View file

@ -1255,10 +1255,8 @@ struct wma_vdev_start_req {
uint32_t preferred_tx_streams;
uint32_t preferred_rx_streams;
uint16_t beacon_tx_rate;
#ifdef WLAN_FEATURE_11AX
bool he_capable;
uint32_t he_ops;
#endif
uint32_t cac_duration_ms;
uint32_t dfs_regdomain;
};

View file

@ -2673,68 +2673,6 @@ enum mlme_bcn_tx_rate_code wma_get_bcn_rate_code(uint16_t rate)
}
}
static QDF_STATUS vdev_mgr_start_param_populate(struct vdev_mlme_obj *mlme_obj,
struct vdev_start_params *param)
{
struct wlan_channel *des_chan;
struct wlan_objmgr_vdev *vdev;
struct wlan_objmgr_pdev *pdev;
vdev = mlme_obj->vdev;
if (!vdev) {
mlme_err("VDEV is NULL");
return QDF_STATUS_E_INVAL;
}
pdev = wlan_vdev_get_pdev(vdev);
if (!pdev) {
mlme_err("PDEV is NULL");
return QDF_STATUS_E_INVAL;
}
if (wlan_objmgr_pdev_try_get_ref(pdev, WLAN_MLME_SB_ID) !=
QDF_STATUS_SUCCESS) {
mlme_err("Failed to get pdev reference");
return QDF_STATUS_E_FAILURE;
}
des_chan = wlan_vdev_mlme_get_des_chan(vdev);
mlme_obj->proto.generic.beacon_interval = param->beacon_interval;
mlme_obj->proto.generic.dtim_period = param->dtim_period;
mlme_obj->mgmt.generic.disable_hw_ack = param->disable_hw_ack;
mlme_obj->mgmt.chainmask_info.num_rx_chain =
param->preferred_rx_streams;
mlme_obj->mgmt.chainmask_info.num_tx_chain =
param->preferred_tx_streams;
mlme_obj->proto.he_ops_info.he_ops = param->he_ops;
des_chan->ch_ieee = param->channel.chan_id;
mlme_obj->mgmt.generic.tx_power = param->channel.pwr;
des_chan->ch_freq = param->channel.mhz;
mlme_obj->mgmt.rate_info.half_rate = param->channel.half_rate;
mlme_obj->mgmt.rate_info.quarter_rate = param->channel.quarter_rate;
mlme_obj->proto.ht_info.allow_ht = param->channel.allow_ht;
mlme_obj->proto.vht_info.allow_vht = param->channel.allow_vht;
mlme_obj->mgmt.generic.phy_mode = param->channel.phy_mode;
des_chan->ch_cfreq1 = param->channel.cfreq1;
des_chan->ch_cfreq2 = param->channel.cfreq2;
mlme_obj->mgmt.generic.maxpower = param->channel.maxpower;
mlme_obj->mgmt.generic.minpower = param->channel.minpower;
mlme_obj->mgmt.generic.maxregpower = param->channel.maxregpower;
mlme_obj->mgmt.generic.antennamax = param->channel.antennamax;
mlme_obj->mgmt.generic.reg_class_id = param->channel.reg_class_id;
mlme_obj->mgmt.rate_info.bcn_tx_rate = param->bcn_tx_rate_code;
mlme_obj->proto.generic.ldpc = param->ldpc_rx_enabled;
if (mlme_obj->mgmt.generic.type == WLAN_VDEV_MLME_TYPE_AP) {
mlme_obj->mgmt.ap.hidden_ssid = param->hidden_ssid;
mlme_obj->mgmt.ap.cac_duration_ms = param->cac_duration_ms;
}
wlan_vdev_mlme_set_ssid(vdev, param->ssid.mac_ssid,
param->ssid.length);
wlan_objmgr_pdev_release_ref(pdev, WLAN_MLME_SB_ID);
return QDF_STATUS_SUCCESS;
}
/**
* wma_vdev_start() - send vdev start request to fw
* @wma: wma handle
@ -2746,11 +2684,8 @@ static QDF_STATUS vdev_mgr_start_param_populate(struct vdev_mlme_obj *mlme_obj,
QDF_STATUS wma_vdev_start(tp_wma_handle wma,
struct wma_vdev_start_req *req, bool isRestart)
{
struct vdev_start_params params = { 0 };
wmi_vdev_start_request_cmd_fixed_param *cmd;
struct wma_txrx_node *intr = wma->interfaces;
struct mac_context *mac_ctx = NULL;
uint32_t temp_ssid_len = 0;
uint16_t bw_val;
struct wma_txrx_node *iface = &wma->interfaces[req->vdev_id];
uint32_t chan_mode;
@ -2759,6 +2694,16 @@ QDF_STATUS wma_vdev_start(tp_wma_handle wma,
QDF_STATUS status;
uint32_t vdev_stop_type;
struct vdev_mlme_obj *mlme_obj;
uint8_t vdev_id = req->vdev_id;
struct wlan_objmgr_vdev *vdev = intr[vdev_id].vdev;
struct wlan_channel *des_chan;
mlme_obj = wlan_vdev_mlme_get_cmpt_obj(vdev);
if (!mlme_obj) {
pe_err("vdev component object is NULL");
return QDF_STATUS_E_FAILURE;
}
des_chan = vdev->vdev_mlme.des_chan;
ini_cfg = mlme_get_ini_vdev_config(iface->vdev);
if (!ini_cfg) {
@ -2779,31 +2724,31 @@ QDF_STATUS wma_vdev_start(tp_wma_handle wma,
return QDF_STATUS_E_INVAL;
}
params.channel.cfreq1 = req->op_chan_freq;
des_chan->ch_cfreq1 = req->op_chan_freq;
ch_width = req->chan_width;
bw_val = wlan_reg_get_bw_value(req->chan_width);
if (bw_val > 20) {
if (req->chan_freq_seg0) {
params.channel.cfreq1 = req->chan_freq_seg0;
des_chan->ch_cfreq1 = req->chan_freq_seg0;
} else {
WMA_LOGE("%s: invalid cntr_freq for bw %d, drop to 20",
__func__, bw_val);
params.channel.cfreq1 = req->op_chan_freq;
des_chan->ch_cfreq1 = req->op_chan_freq;
ch_width = CH_WIDTH_20MHZ;
bw_val = 20;
}
}
if (bw_val > 80) {
if (req->chan_freq_seg1) {
params.channel.cfreq2 = req->chan_freq_seg1;
des_chan->ch_cfreq2 = req->chan_freq_seg1;
} else {
WMA_LOGE("%s: invalid cntr_freq for bw %d, drop to 80",
__func__, bw_val);
params.channel.cfreq2 = 0;
des_chan->ch_cfreq2 = 0;
ch_width = CH_WIDTH_80MHZ;
}
} else {
params.channel.cfreq2 = 0;
des_chan->ch_cfreq2 = 0;
}
chan_mode = wma_chan_phy_mode(req->op_chan_freq, ch_width,
req->dot11_mode);
@ -2813,19 +2758,19 @@ QDF_STATUS wma_vdev_start(tp_wma_handle wma,
return QDF_STATUS_E_FAILURE;
}
if (!params.channel.cfreq1) {
if (!des_chan->ch_cfreq1) {
WMA_LOGE("%s: invalid center freq1", __func__);
return QDF_STATUS_E_FAILURE;
}
if (((ch_width == CH_WIDTH_160MHZ) ||
(ch_width == CH_WIDTH_80P80MHZ)) && !params.channel.cfreq2) {
(ch_width == CH_WIDTH_80P80MHZ)) && !des_chan->ch_cfreq2) {
WMA_LOGE("%s: invalid center freq2 for 160MHz", __func__);
return QDF_STATUS_E_FAILURE;
}
/* Fill channel info */
params.channel.mhz = req->op_chan_freq;
params.channel.phy_mode = chan_mode;
des_chan->ch_freq = req->op_chan_freq;
mlme_obj->mgmt.generic.phy_mode = chan_mode;
/* For Rome, only supports LFR2, not LFR3, for reassoc, need send vdev
* start cmd to F/W while vdev started first, then send reassoc frame
@ -2848,35 +2793,33 @@ QDF_STATUS wma_vdev_start(tp_wma_handle wma,
WMA_LOGD("%s: Enter isRestart=%d vdev=%d", __func__, isRestart,
req->vdev_id);
params.vdev_id = req->vdev_id;
intr[params.vdev_id].chanmode = chan_mode;
intr[params.vdev_id].config.gtx_info.gtxRTMask[0] =
intr[vdev_id].chanmode = chan_mode;
intr[vdev_id].config.gtx_info.gtxRTMask[0] =
CFG_TGT_DEFAULT_GTX_HT_MASK;
intr[params.vdev_id].config.gtx_info.gtxRTMask[1] =
intr[vdev_id].config.gtx_info.gtxRTMask[1] =
CFG_TGT_DEFAULT_GTX_VHT_MASK;
intr[params.vdev_id].config.gtx_info.gtxUsrcfg =
intr[vdev_id].config.gtx_info.gtxUsrcfg =
mac_ctx->mlme_cfg->sta.tgt_gtx_usr_cfg;
intr[params.vdev_id].config.gtx_info.gtxPERThreshold =
intr[vdev_id].config.gtx_info.gtxPERThreshold =
CFG_TGT_DEFAULT_GTX_PER_THRESHOLD;
intr[params.vdev_id].config.gtx_info.gtxPERMargin =
intr[vdev_id].config.gtx_info.gtxPERMargin =
CFG_TGT_DEFAULT_GTX_PER_MARGIN;
intr[params.vdev_id].config.gtx_info.gtxTPCstep =
intr[vdev_id].config.gtx_info.gtxTPCstep =
CFG_TGT_DEFAULT_GTX_TPC_STEP;
intr[params.vdev_id].config.gtx_info.gtxTPCMin =
intr[vdev_id].config.gtx_info.gtxTPCMin =
CFG_TGT_DEFAULT_GTX_TPC_MIN;
intr[params.vdev_id].config.gtx_info.gtxBWMask =
intr[vdev_id].config.gtx_info.gtxBWMask =
CFG_TGT_DEFAULT_GTX_BW_MASK;
intr[params.vdev_id].mhz = params.channel.mhz;
intr[params.vdev_id].chan_width = ch_width;
intr[params.vdev_id].channel = wlan_reg_freq_to_chan(wma->pdev,
req->op_chan_freq);
/* Set half or quarter rate WMI flags */
params.channel.half_rate = req->is_half_rate;
params.channel.quarter_rate = req->is_quarter_rate;
intr[vdev_id].mhz = des_chan->ch_freq;
intr[vdev_id].chan_width = ch_width;
intr[vdev_id].channel = wlan_reg_freq_to_chan(wma->pdev,
req->op_chan_freq);
/* Set half or quarter rate flags */
mlme_obj->mgmt.rate_info.half_rate = req->is_half_rate;
mlme_obj->mgmt.rate_info.quarter_rate = req->is_quarter_rate;
/*
* If the channel has DFS set, flip on radar reporting.
@ -2888,22 +2831,12 @@ QDF_STATUS wma_vdev_start(tp_wma_handle wma,
* If that is ever the case we would insert the decision whether to
* enable the firmware flag here.
*/
params.is_restart = isRestart;
params.cac_duration_ms = req->cac_duration_ms;
params.regdomain = req->dfs_regdomain;
if ((QDF_GLOBAL_MONITOR_MODE != cds_get_conparam()) && req->is_dfs) {
params.disable_hw_ack = true;
mlme_obj->mgmt.ap.cac_duration_ms = req->cac_duration_ms;
if (QDF_GLOBAL_MONITOR_MODE != cds_get_conparam() && req->is_dfs)
mlme_obj->mgmt.generic.disable_hw_ack = true;
/*
* If channel is DFS and operating in AP mode,
* set the WMI_CHAN_FLAG_DFS flag.
*/
if (wma_is_vdev_in_ap_mode(wma, params.vdev_id) == true)
params.channel.dfs_set = true;
}
params.beacon_interval = req->beacon_intval;
params.dtim_period = req->dtim_period;
mlme_obj->proto.generic.beacon_interval = req->beacon_intval;
mlme_obj->proto.generic.dtim_period = req->dtim_period;
if (req->beacon_tx_rate) {
WMA_LOGD("%s: beacon tx rate [%hu * 100 Kbps]",
@ -2912,55 +2845,34 @@ QDF_STATUS wma_vdev_start(tp_wma_handle wma,
* beacon_tx_rate is in multiples of 100 Kbps.
* Convert the data rate to hw rate code.
*/
params.bcn_tx_rate_code =
mlme_obj->mgmt.rate_info.bcn_tx_rate =
wma_get_bcn_rate_code(req->beacon_tx_rate);
}
/* FIXME: Find out min, max and regulatory power levels */
params.channel.maxregpower = req->max_txpow;
/* TODO: Handle regulatory class, max antenna */
if (!isRestart)
params.pmf_enabled = req->pmf_enabled;
mlme_obj->mgmt.generic.maxregpower = req->max_txpow;
/* Copy the SSID */
if (req->ssid.length) {
params.ssid.length = req->ssid.length;
if (req->ssid.length < sizeof(cmd->ssid.ssid))
temp_ssid_len = req->ssid.length;
else
temp_ssid_len = sizeof(cmd->ssid.ssid);
qdf_mem_copy(params.ssid.mac_ssid, req->ssid.ssId,
temp_ssid_len);
}
wlan_vdev_mlme_set_ssid(vdev, req->ssid.ssId, req->ssid.length);
params.hidden_ssid = req->hidden_ssid;
mlme_obj->mgmt.ap.hidden_ssid = req->hidden_ssid;
mlme_obj->mgmt.chainmask_info.num_rx_chain = req->preferred_rx_streams;
mlme_obj->mgmt.chainmask_info.num_tx_chain = req->preferred_tx_streams;
params.num_noa_descriptors = 0;
params.preferred_rx_streams = req->preferred_rx_streams;
params.preferred_tx_streams = req->preferred_tx_streams;
wma_copy_vdev_start_he_ops(&params, req);
mlme_obj->proto.he_ops_info.he_ops = req->he_ops;
if (!isRestart) {
WMA_LOGD("%s, vdev_id: %d, unpausing tx_ll_queue at VDEV_START",
__func__, params.vdev_id);
__func__, vdev_id);
cdp_fc_vdev_unpause(cds_get_context(QDF_MODULE_ID_SOC),
wma->interfaces[params.vdev_id].handle,
wma->interfaces[vdev_id].handle,
0xffffffff);
wma_vdev_update_pause_bitmap(params.vdev_id, 0);
wma_vdev_update_pause_bitmap(vdev_id, 0);
}
/* Send the dynamic nss chain params before vdev start to fw */
if (wma->dynamic_nss_chains_support)
wma_vdev_nss_chain_params_send(params.vdev_id, ini_cfg);
mlme_obj = wlan_vdev_mlme_get_cmpt_obj(intr[req->vdev_id].vdev);
if (!mlme_obj) {
pe_err("vdev component object is NULL");
return QDF_STATUS_E_FAILURE;
}
vdev_mgr_start_param_populate(mlme_obj, &params);
wma_vdev_nss_chain_params_send(vdev_id, ini_cfg);
return vdev_mgr_start_send(mlme_obj, isRestart);
}