qcacmn: Add a Regulatory API to compute channel list after HW Mode Switch

Add regulatory API and a dispatcher function to compute current channel
list after dynamic HW Mode Switch. range_5g_low, range_5g_high and wireless
modes are extracted from wlan_psoc_host_mac_phy_caps based on the new
HW mode configured and are used to derive the current channel list.

Change-Id: I799712da8992ede0b5896dd2eb438cffea5fe048
CRs-Fixed: 2481535
Цей коміт міститься в:
Priyadarshnee S
2019-07-23 14:37:06 +05:30
зафіксовано nshrivas
джерело 4ae200caad
коміт aa4fe41237
4 змінених файлів з 113 додано та 0 видалено

Переглянути файл

@@ -2023,3 +2023,87 @@ bool reg_is_regdmn_en302502_applicable(struct wlan_objmgr_pdev *pdev)
return reg_en302_502_regdmn(cur_reg_dmn.regdmn_pair_id);
}
QDF_STATUS reg_modify_pdev_chan_range(struct wlan_objmgr_pdev *pdev)
{
struct wlan_regulatory_pdev_priv_obj *pdev_priv_obj;
struct wlan_regulatory_psoc_priv_obj *psoc_priv_obj;
struct wlan_objmgr_psoc *psoc;
struct wlan_lmac_if_reg_tx_ops *reg_tx_ops;
struct wlan_psoc_host_hal_reg_capabilities_ext *reg_cap_ptr;
uint32_t cnt;
uint32_t pdev_id;
enum direction dir;
QDF_STATUS status = QDF_STATUS_SUCCESS;
pdev_id = wlan_objmgr_pdev_get_pdev_id(pdev);
pdev_priv_obj = reg_get_pdev_obj(pdev);
if (!IS_VALID_PDEV_REG_OBJ(pdev_priv_obj)) {
reg_err("pdev reg component is NULL");
return QDF_STATUS_E_INVAL;
}
psoc = wlan_pdev_get_psoc(pdev);
if (!psoc) {
reg_err("psoc is NULL");
return QDF_STATUS_E_INVAL;
}
psoc_priv_obj = reg_get_psoc_obj(psoc);
if (!IS_VALID_PSOC_REG_OBJ(psoc_priv_obj)) {
reg_err("psoc reg component is NULL");
return QDF_STATUS_E_INVAL;
}
reg_cap_ptr = psoc_priv_obj->reg_cap;
for (cnt = 0; cnt < PSOC_MAX_PHY_REG_CAP; cnt++) {
if (!reg_cap_ptr) {
qdf_mem_free(pdev_priv_obj);
reg_err("reg cap ptr is NULL");
return QDF_STATUS_E_FAULT;
}
if (reg_cap_ptr->phy_id == pdev_id)
break;
reg_cap_ptr++;
}
if (cnt == PSOC_MAX_PHY_REG_CAP) {
qdf_mem_free(pdev_priv_obj);
reg_err("extended capabilities not found for pdev");
return QDF_STATUS_E_FAULT;
}
if (psoc_priv_obj->offload_enabled) {
dir = NORTHBOUND;
} else {
dir = SOUTHBOUND;
}
pdev_priv_obj->range_2g_low = reg_cap_ptr->low_2ghz_chan;
pdev_priv_obj->range_2g_high = reg_cap_ptr->high_2ghz_chan;
pdev_priv_obj->range_5g_low = reg_cap_ptr->low_5ghz_chan;
pdev_priv_obj->range_5g_high = reg_cap_ptr->high_5ghz_chan;
pdev_priv_obj->wireless_modes = reg_cap_ptr->wireless_modes;
reg_compute_pdev_current_chan_list(pdev_priv_obj);
reg_tx_ops = reg_get_psoc_tx_ops(psoc);
/* Fill the ic channel list with the updated current channel
* chan list.
*/
if (reg_tx_ops->fill_umac_legacy_chanlist) {
reg_tx_ops->fill_umac_legacy_chanlist(pdev,
pdev_priv_obj->cur_chan_list);
} else {
if (dir == NORTHBOUND)
status = reg_send_scheduler_msg_nb(psoc, pdev);
else
status = reg_send_scheduler_msg_sb(psoc, pdev);
}
return status;
}

Переглянути файл

@@ -514,4 +514,13 @@ QDF_STATUS reg_enable_dfs_channels(struct wlan_objmgr_pdev *pdev, bool enable);
* Return: True if en302_502 is applicable, else false.
*/
bool reg_is_regdmn_en302502_applicable(struct wlan_objmgr_pdev *pdev);
/**
* reg_modify_pdev_chan_range() - Compute current channel list
* in accordance with the modified reg caps.
* @pdev: The physical dev for which channel list must be built.
*
* Return: QDF_STATUS
*/
QDF_STATUS reg_modify_pdev_chan_range(struct wlan_objmgr_pdev *pdev);
#endif

Переглянути файл

@@ -703,4 +703,13 @@ void wlan_reg_update_nol_history_ch(struct wlan_objmgr_pdev *pdev,
* False: otherwise.
*/
bool wlan_reg_is_regdmn_en302502_applicable(struct wlan_objmgr_pdev *pdev);
/**
* wlan_reg_modify_pdev_chan_range() - Compute current channel list for the
* modified channel range in the regcap.
* @pdev: pointer to wlan_objmgr_pdev.
*
* Return : QDF_STATUS
*/
QDF_STATUS wlan_reg_modify_pdev_chan_range(struct wlan_objmgr_pdev *pdev);
#endif

Переглянути файл

@@ -713,3 +713,14 @@ bool wlan_reg_is_regdmn_en302502_applicable(struct wlan_objmgr_pdev *pdev)
{
return reg_is_regdmn_en302502_applicable(pdev);
}
/**
* wlan_reg_modify_pdev_chan_range() - Compute current channel list for the
* modified regcap.
* @pdev: pointer to struct wlan_objmgr_pdev
*
*/
QDF_STATUS wlan_reg_modify_pdev_chan_range(struct wlan_objmgr_pdev *pdev)
{
return reg_modify_pdev_chan_range(pdev);
}