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:
Dustin Brown
2018-10-12 15:02:26 -07:00
committed by nshrivas
父節點 56377e1ebe
當前提交 63fe49239f
共有 2 個文件被更改,包括 76 次插入112 次删除

查看文件

@@ -13069,6 +13069,56 @@ static int wlan_hdd_cfg80211_change_bss(struct wiphy *wiphy,
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
* @wiphy: Pointer to the wiphy structure
@@ -13085,17 +13135,16 @@ static int __wlan_hdd_cfg80211_change_iface(struct wiphy *wiphy,
u32 *flags,
struct vif_params *params)
{
struct wireless_dev *wdev;
struct hdd_adapter *adapter = WLAN_HDD_GET_PRIV_PTR(ndev);
struct hdd_context *hdd_ctx;
int errno;
bool iff_up = ndev->flags & IFF_UP;
enum QDF_OPMODE new_mode;
QDF_STATUS status;
int errno;
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");
return -EINVAL;
}
@@ -13109,12 +13158,6 @@ static int __wlan_hdd_cfg80211_change_iface(struct wiphy *wiphy,
TRACE_CODE_HDD_CFG80211_CHANGE_IFACE,
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);
if (QDF_IS_STATUS_ERROR(status))
return qdf_status_to_os_return(status);
@@ -13131,8 +13174,8 @@ static int __wlan_hdd_cfg80211_change_iface(struct wiphy *wiphy,
}
if (!policy_mgr_allow_concurrency(hdd_ctx->psoc,
wlan_hdd_convert_nl_iftype_to_hdd_type(type),
0, HW_MODE_20_MHZ)) {
hdd_nl_to_policy_mgr_iface_type(type),
0, HW_MODE_20_MHZ)) {
hdd_debug("This concurrency combination is not allowed");
return -EINVAL;
}
@@ -13146,38 +13189,18 @@ static int __wlan_hdd_cfg80211_change_iface(struct wiphy *wiphy,
hdd_notify_teardown_tdls_links(adapter->vdev);
}
if (adapter->device_mode == QDF_STA_MODE ||
adapter->device_mode == QDF_P2P_CLIENT_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 (hdd_is_client_mode(adapter->device_mode)) {
if (hdd_is_client_mode(new_mode)) {
if (new_mode == QDF_IBSS_MODE)
hdd_deregister_tx_flow_control(adapter);
errno = hdd_change_adapter_mode(adapter, new_mode);
if (errno)
return errno;
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:
if (new_mode == QDF_P2P_GO_MODE) {
} else if (hdd_is_ap_mode(new_mode)) {
if (new_mode == QDF_P2P_GO_MODE)
wlan_hdd_cancel_existing_remain_on_channel
(adapter);
}
hdd_stop_adapter(hdd_ctx, adapter);
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);
if (iff_up) {
errno = hdd_start_adapter(adapter);
if (errno) {
hdd_err("Failed to start adapter");
return errno;
}
}
wdev->iftype = type;
goto done;
default:
} else {
hdd_err("Changing to device mode '%s' is not supported",
qdf_opmode_str(new_mode));
return -EOPNOTSUPP;
}
} else if (adapter->device_mode == QDF_SAP_MODE ||
adapter->device_mode == QDF_P2P_GO_MODE) {
switch (new_mode) {
case QDF_STA_MODE:
case QDF_P2P_CLIENT_MODE:
case QDF_IBSS_MODE:
} else if (hdd_is_ap_mode(adapter->device_mode)) {
if (hdd_is_client_mode(new_mode)) {
errno = hdd_change_adapter_mode(adapter, new_mode);
if (errno)
return errno;
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;
} else if (hdd_is_ap_mode(new_mode)) {
adapter->device_mode = new_mode;
goto done;
default:
/* avoid starting the adapter, since it never stopped */
iff_up = false;
} else {
hdd_err("Changing to device mode '%s' is not supported",
qdf_opmode_str(new_mode));
return -EOPNOTSUPP;
@@ -13258,7 +13252,17 @@ static int __wlan_hdd_cfg80211_change_iface(struct wiphy *wiphy,
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 */
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
/**
* 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,
uint8_t channel,
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_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,
bool enable_dfs_channels);