qcacld-3.0: Factor out common parts in change_iface
Some common parts of __wlan_hdd_cfg80211_change_iface are repeated in multiple places. Factor out these common sections to reduce redundant code and ensure they stay synchronized in the future. Change-Id: I80d47f1c9a14342f777bfc169d85287a3e709a58 CRs-Fixed: 2332780
This commit is contained in:
@@ -13069,6 +13069,56 @@ static int wlan_hdd_cfg80211_change_bss(struct wiphy *wiphy,
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* hdd_nl_to_policy_mgr_iface_type() - map nl80211_iftype to policy_mgr_con_mode
|
||||||
|
* @type: the input NL80211 interface type to map
|
||||||
|
*
|
||||||
|
* Return: policy_mgr_con_mode
|
||||||
|
*/
|
||||||
|
static enum policy_mgr_con_mode
|
||||||
|
hdd_nl_to_policy_mgr_iface_type(enum nl80211_iftype type)
|
||||||
|
{
|
||||||
|
switch (type) {
|
||||||
|
case NL80211_IFTYPE_STATION:
|
||||||
|
return PM_STA_MODE;
|
||||||
|
case NL80211_IFTYPE_P2P_CLIENT:
|
||||||
|
return PM_P2P_CLIENT_MODE;
|
||||||
|
case NL80211_IFTYPE_P2P_GO:
|
||||||
|
return PM_P2P_GO_MODE;
|
||||||
|
case NL80211_IFTYPE_AP:
|
||||||
|
return PM_SAP_MODE;
|
||||||
|
case NL80211_IFTYPE_ADHOC:
|
||||||
|
return PM_IBSS_MODE;
|
||||||
|
default:
|
||||||
|
hdd_err("Unsupported interface type: %d", type);
|
||||||
|
return PM_MAX_NUM_OF_MODE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool hdd_is_client_mode(enum QDF_OPMODE mode)
|
||||||
|
{
|
||||||
|
switch (mode) {
|
||||||
|
case QDF_STA_MODE:
|
||||||
|
case QDF_P2P_CLIENT_MODE:
|
||||||
|
case QDF_P2P_DEVICE_MODE:
|
||||||
|
case QDF_IBSS_MODE:
|
||||||
|
return true;
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool hdd_is_ap_mode(enum QDF_OPMODE mode)
|
||||||
|
{
|
||||||
|
switch (mode) {
|
||||||
|
case QDF_SAP_MODE:
|
||||||
|
case QDF_P2P_GO_MODE:
|
||||||
|
return true;
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* __wlan_hdd_cfg80211_change_iface() - change interface cfg80211 op
|
* __wlan_hdd_cfg80211_change_iface() - change interface cfg80211 op
|
||||||
* @wiphy: Pointer to the wiphy structure
|
* @wiphy: Pointer to the wiphy structure
|
||||||
@@ -13085,17 +13135,16 @@ static int __wlan_hdd_cfg80211_change_iface(struct wiphy *wiphy,
|
|||||||
u32 *flags,
|
u32 *flags,
|
||||||
struct vif_params *params)
|
struct vif_params *params)
|
||||||
{
|
{
|
||||||
struct wireless_dev *wdev;
|
|
||||||
struct hdd_adapter *adapter = WLAN_HDD_GET_PRIV_PTR(ndev);
|
struct hdd_adapter *adapter = WLAN_HDD_GET_PRIV_PTR(ndev);
|
||||||
struct hdd_context *hdd_ctx;
|
struct hdd_context *hdd_ctx;
|
||||||
int errno;
|
|
||||||
bool iff_up = ndev->flags & IFF_UP;
|
bool iff_up = ndev->flags & IFF_UP;
|
||||||
enum QDF_OPMODE new_mode;
|
enum QDF_OPMODE new_mode;
|
||||||
QDF_STATUS status;
|
QDF_STATUS status;
|
||||||
|
int errno;
|
||||||
|
|
||||||
hdd_enter();
|
hdd_enter();
|
||||||
|
|
||||||
if (QDF_GLOBAL_FTM_MODE == hdd_get_conparam()) {
|
if (hdd_get_conparam() == QDF_GLOBAL_FTM_MODE) {
|
||||||
hdd_err("Command not allowed in FTM mode");
|
hdd_err("Command not allowed in FTM mode");
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
@@ -13109,12 +13158,6 @@ static int __wlan_hdd_cfg80211_change_iface(struct wiphy *wiphy,
|
|||||||
TRACE_CODE_HDD_CFG80211_CHANGE_IFACE,
|
TRACE_CODE_HDD_CFG80211_CHANGE_IFACE,
|
||||||
adapter->session_id, type));
|
adapter->session_id, type));
|
||||||
|
|
||||||
wdev = ndev->ieee80211_ptr;
|
|
||||||
if (!wdev) {
|
|
||||||
hdd_err("Wireless dev is NULL");
|
|
||||||
return -EINVAL;
|
|
||||||
}
|
|
||||||
|
|
||||||
status = hdd_nl_to_qdf_iface_type(type, &new_mode);
|
status = hdd_nl_to_qdf_iface_type(type, &new_mode);
|
||||||
if (QDF_IS_STATUS_ERROR(status))
|
if (QDF_IS_STATUS_ERROR(status))
|
||||||
return qdf_status_to_os_return(status);
|
return qdf_status_to_os_return(status);
|
||||||
@@ -13131,7 +13174,7 @@ static int __wlan_hdd_cfg80211_change_iface(struct wiphy *wiphy,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!policy_mgr_allow_concurrency(hdd_ctx->psoc,
|
if (!policy_mgr_allow_concurrency(hdd_ctx->psoc,
|
||||||
wlan_hdd_convert_nl_iftype_to_hdd_type(type),
|
hdd_nl_to_policy_mgr_iface_type(type),
|
||||||
0, HW_MODE_20_MHZ)) {
|
0, HW_MODE_20_MHZ)) {
|
||||||
hdd_debug("This concurrency combination is not allowed");
|
hdd_debug("This concurrency combination is not allowed");
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
@@ -13146,38 +13189,18 @@ static int __wlan_hdd_cfg80211_change_iface(struct wiphy *wiphy,
|
|||||||
hdd_notify_teardown_tdls_links(adapter->vdev);
|
hdd_notify_teardown_tdls_links(adapter->vdev);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (adapter->device_mode == QDF_STA_MODE ||
|
if (hdd_is_client_mode(adapter->device_mode)) {
|
||||||
adapter->device_mode == QDF_P2P_CLIENT_MODE ||
|
if (hdd_is_client_mode(new_mode)) {
|
||||||
adapter->device_mode == QDF_P2P_DEVICE_MODE ||
|
|
||||||
adapter->device_mode == QDF_IBSS_MODE) {
|
|
||||||
switch (new_mode) {
|
|
||||||
case QDF_STA_MODE:
|
|
||||||
case QDF_P2P_CLIENT_MODE:
|
|
||||||
case QDF_IBSS_MODE:
|
|
||||||
if (new_mode == QDF_IBSS_MODE)
|
if (new_mode == QDF_IBSS_MODE)
|
||||||
hdd_deregister_tx_flow_control(adapter);
|
hdd_deregister_tx_flow_control(adapter);
|
||||||
|
|
||||||
errno = hdd_change_adapter_mode(adapter, new_mode);
|
errno = hdd_change_adapter_mode(adapter, new_mode);
|
||||||
if (errno)
|
if (errno)
|
||||||
return errno;
|
return errno;
|
||||||
|
} else if (hdd_is_ap_mode(new_mode)) {
|
||||||
if (iff_up) {
|
if (new_mode == QDF_P2P_GO_MODE)
|
||||||
errno = hdd_start_adapter(adapter);
|
|
||||||
if (errno) {
|
|
||||||
hdd_err("Failed to start adapter");
|
|
||||||
return -EINVAL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
wdev->iftype = type;
|
|
||||||
|
|
||||||
goto done;
|
|
||||||
case QDF_SAP_MODE:
|
|
||||||
case QDF_P2P_GO_MODE:
|
|
||||||
if (new_mode == QDF_P2P_GO_MODE) {
|
|
||||||
wlan_hdd_cancel_existing_remain_on_channel
|
wlan_hdd_cancel_existing_remain_on_channel
|
||||||
(adapter);
|
(adapter);
|
||||||
}
|
|
||||||
|
|
||||||
hdd_stop_adapter(hdd_ctx, adapter);
|
hdd_stop_adapter(hdd_ctx, adapter);
|
||||||
hdd_deinit_adapter(hdd_ctx, adapter, true);
|
hdd_deinit_adapter(hdd_ctx, adapter, true);
|
||||||
@@ -13203,51 +13226,22 @@ static int __wlan_hdd_cfg80211_change_iface(struct wiphy *wiphy,
|
|||||||
}
|
}
|
||||||
|
|
||||||
hdd_set_ap_ops(adapter->dev);
|
hdd_set_ap_ops(adapter->dev);
|
||||||
|
} else {
|
||||||
if (iff_up) {
|
|
||||||
errno = hdd_start_adapter(adapter);
|
|
||||||
if (errno) {
|
|
||||||
hdd_err("Failed to start adapter");
|
|
||||||
return errno;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
wdev->iftype = type;
|
|
||||||
|
|
||||||
goto done;
|
|
||||||
default:
|
|
||||||
hdd_err("Changing to device mode '%s' is not supported",
|
hdd_err("Changing to device mode '%s' is not supported",
|
||||||
qdf_opmode_str(new_mode));
|
qdf_opmode_str(new_mode));
|
||||||
return -EOPNOTSUPP;
|
return -EOPNOTSUPP;
|
||||||
}
|
}
|
||||||
} else if (adapter->device_mode == QDF_SAP_MODE ||
|
} else if (hdd_is_ap_mode(adapter->device_mode)) {
|
||||||
adapter->device_mode == QDF_P2P_GO_MODE) {
|
if (hdd_is_client_mode(new_mode)) {
|
||||||
switch (new_mode) {
|
|
||||||
case QDF_STA_MODE:
|
|
||||||
case QDF_P2P_CLIENT_MODE:
|
|
||||||
case QDF_IBSS_MODE:
|
|
||||||
errno = hdd_change_adapter_mode(adapter, new_mode);
|
errno = hdd_change_adapter_mode(adapter, new_mode);
|
||||||
if (errno)
|
if (errno)
|
||||||
return errno;
|
return errno;
|
||||||
|
} else if (hdd_is_ap_mode(new_mode)) {
|
||||||
if (iff_up) {
|
|
||||||
errno = hdd_start_adapter(adapter);
|
|
||||||
if (errno) {
|
|
||||||
hdd_err("Failed to start adapter");
|
|
||||||
return -EINVAL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
wdev->iftype = type;
|
|
||||||
|
|
||||||
goto done;
|
|
||||||
case QDF_SAP_MODE:
|
|
||||||
case QDF_P2P_GO_MODE:
|
|
||||||
wdev->iftype = type;
|
|
||||||
adapter->device_mode = new_mode;
|
adapter->device_mode = new_mode;
|
||||||
|
|
||||||
goto done;
|
/* avoid starting the adapter, since it never stopped */
|
||||||
default:
|
iff_up = false;
|
||||||
|
} else {
|
||||||
hdd_err("Changing to device mode '%s' is not supported",
|
hdd_err("Changing to device mode '%s' is not supported",
|
||||||
qdf_opmode_str(new_mode));
|
qdf_opmode_str(new_mode));
|
||||||
return -EOPNOTSUPP;
|
return -EOPNOTSUPP;
|
||||||
@@ -13258,7 +13252,17 @@ static int __wlan_hdd_cfg80211_change_iface(struct wiphy *wiphy,
|
|||||||
return -EOPNOTSUPP;
|
return -EOPNOTSUPP;
|
||||||
}
|
}
|
||||||
|
|
||||||
done:
|
/* restart the adapter if it was up before the change iface request */
|
||||||
|
if (iff_up) {
|
||||||
|
errno = hdd_start_adapter(adapter);
|
||||||
|
if (errno) {
|
||||||
|
hdd_err("Failed to start adapter");
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ndev->ieee80211_ptr->iftype = type;
|
||||||
|
|
||||||
/* Set bitmask based on updated value */
|
/* Set bitmask based on updated value */
|
||||||
policy_mgr_set_concurrency_mode(hdd_ctx->psoc, adapter->device_mode);
|
policy_mgr_set_concurrency_mode(hdd_ctx->psoc, adapter->device_mode);
|
||||||
|
|
||||||
@@ -19198,43 +19202,6 @@ static int wlan_hdd_cfg80211_channel_switch(struct wiphy *wiphy,
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/**
|
|
||||||
* wlan_hdd_convert_nl_iftype_to_hdd_type() - provides the type
|
|
||||||
* translation from NL to policy manager type
|
|
||||||
* @type: Generic connection mode type defined in NL
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* This function provides the type translation
|
|
||||||
*
|
|
||||||
* Return: cds_con_mode enum
|
|
||||||
*/
|
|
||||||
enum policy_mgr_con_mode wlan_hdd_convert_nl_iftype_to_hdd_type(
|
|
||||||
enum nl80211_iftype type)
|
|
||||||
{
|
|
||||||
enum policy_mgr_con_mode mode = PM_MAX_NUM_OF_MODE;
|
|
||||||
|
|
||||||
switch (type) {
|
|
||||||
case NL80211_IFTYPE_STATION:
|
|
||||||
mode = PM_STA_MODE;
|
|
||||||
break;
|
|
||||||
case NL80211_IFTYPE_P2P_CLIENT:
|
|
||||||
mode = PM_P2P_CLIENT_MODE;
|
|
||||||
break;
|
|
||||||
case NL80211_IFTYPE_P2P_GO:
|
|
||||||
mode = PM_P2P_GO_MODE;
|
|
||||||
break;
|
|
||||||
case NL80211_IFTYPE_AP:
|
|
||||||
mode = PM_SAP_MODE;
|
|
||||||
break;
|
|
||||||
case NL80211_IFTYPE_ADHOC:
|
|
||||||
mode = PM_IBSS_MODE;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
hdd_err("Unsupported interface type: %d", type);
|
|
||||||
}
|
|
||||||
return mode;
|
|
||||||
}
|
|
||||||
|
|
||||||
int wlan_hdd_change_hw_mode_for_given_chnl(struct hdd_adapter *adapter,
|
int wlan_hdd_change_hw_mode_for_given_chnl(struct hdd_adapter *adapter,
|
||||||
uint8_t channel,
|
uint8_t channel,
|
||||||
enum policy_mgr_conn_update_reason reason)
|
enum policy_mgr_conn_update_reason reason)
|
||||||
|
@@ -394,9 +394,6 @@ int wlan_hdd_cfg80211_update_apies(struct hdd_adapter *adapter);
|
|||||||
int wlan_hdd_request_pre_cac(uint8_t channel);
|
int wlan_hdd_request_pre_cac(uint8_t channel);
|
||||||
int wlan_hdd_sap_cfg_dfs_override(struct hdd_adapter *adapter);
|
int wlan_hdd_sap_cfg_dfs_override(struct hdd_adapter *adapter);
|
||||||
|
|
||||||
enum policy_mgr_con_mode wlan_hdd_convert_nl_iftype_to_hdd_type(
|
|
||||||
enum nl80211_iftype type);
|
|
||||||
|
|
||||||
int wlan_hdd_enable_dfs_chan_scan(struct hdd_context *hdd_ctx,
|
int wlan_hdd_enable_dfs_chan_scan(struct hdd_context *hdd_ctx,
|
||||||
bool enable_dfs_channels);
|
bool enable_dfs_channels);
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user