diff --git a/core/hdd/src/wlan_hdd_wext.c b/core/hdd/src/wlan_hdd_wext.c index 6bacb003decb..a4f91e91688f 100644 --- a/core/hdd/src/wlan_hdd_wext.c +++ b/core/hdd/src/wlan_hdd_wext.c @@ -4148,6 +4148,62 @@ static int hdd_handle_pdev_reset(struct hdd_adapter *adapter, int value) return ret; } +static int hdd_we_set_ch_width(struct hdd_adapter *adapter, int ch_width) +{ + int errno; + struct hdd_context *hdd_ctx = WLAN_HDD_GET_CTX(adapter); + ePhyChanBondState bonding_state; + uint32_t bonding_mode; + tSmeConfigParams *sme_config; + + if (!hdd_ctx->hHal) + return -EINVAL; + + /* updating channel bonding only on 5Ghz */ + hdd_debug("WMI_VDEV_PARAM_CHWIDTH val %d", ch_width); + + switch (ch_width) { + case eHT_CHANNEL_WIDTH_20MHZ: + bonding_mode = WNI_CFG_CHANNEL_BONDING_MODE_DISABLE; + break; + + case eHT_CHANNEL_WIDTH_40MHZ: + case eHT_CHANNEL_WIDTH_80MHZ: + bonding_state = csr_convert_cb_ini_value_to_phy_cb_state( + hdd_ctx->config->nChannelBondingMode5GHz); + + if (bonding_state == WNI_CFG_CHANNEL_BONDING_MODE_DISABLE) + return -EINVAL; + + bonding_mode = hdd_ctx->config->nChannelBondingMode5GHz; + break; + + default: + hdd_err("Invalid channel width 0->20 1->40 2->80"); + return -EINVAL; + } + + sme_config = qdf_mem_malloc(sizeof(*sme_config)); + if (!sme_config) { + hdd_err("failed to allocate memory for sme_config"); + return -ENOMEM; + } + + errno = wma_cli_set_command(adapter->session_id, WMI_VDEV_PARAM_CHWIDTH, + ch_width, VDEV_CMD); + if (errno) + goto free_config; + + sme_get_config_param(hdd_ctx->hHal, sme_config); + sme_config->csrConfig.channelBondingMode5GHz = bonding_mode; + sme_update_config(hdd_ctx->hHal, sme_config); + +free_config: + qdf_mem_free(sme_config); + + return errno; +} + /** * iw_setint_getnone() - Generic "set integer" private ioctl handler * @dev: device upon which the ioctl was received @@ -4576,71 +4632,8 @@ static int __iw_setint_getnone(struct net_device *dev, } case WE_SET_CHWIDTH: - { - bool chwidth = false; - struct hdd_context *phddctx = WLAN_HDD_GET_CTX(adapter); - - if (!hHal) - return -EINVAL; - - /*updating channel bonding only on 5Ghz */ - hdd_debug("WMI_VDEV_PARAM_CHWIDTH val %d", - set_value); - if (set_value > eHT_CHANNEL_WIDTH_80MHZ) { - hdd_err("Invalid channel width 0->20 1->40 2->80"); - ret = -EINVAL; - goto free; - } - - if ((WNI_CFG_CHANNEL_BONDING_MODE_DISABLE != - csr_convert_cb_ini_value_to_phy_cb_state(phddctx->config-> - nChannelBondingMode5GHz))) - chwidth = true; - - sme_get_config_param(hHal, sme_config); - switch (set_value) { - case eHT_CHANNEL_WIDTH_20MHZ: - sme_config->csrConfig.channelBondingMode5GHz = - WNI_CFG_CHANNEL_BONDING_MODE_DISABLE; - break; - case eHT_CHANNEL_WIDTH_40MHZ: - if (chwidth) { - sme_config->csrConfig. - channelBondingMode5GHz = - phddctx->config-> - nChannelBondingMode5GHz; - } else { - ret = -EINVAL; - goto free; - } - - break; - case eHT_CHANNEL_WIDTH_80MHZ: - if (chwidth) { - sme_config->csrConfig. - channelBondingMode5GHz = - phddctx->config-> - nChannelBondingMode5GHz; - } else { - ret = -EINVAL; - goto free; - } - - break; - - default: - ret = -EINVAL; - goto free; - } - - ret = wma_cli_set_command(adapter->session_id, - WMI_VDEV_PARAM_CHWIDTH, - set_value, VDEV_CMD); - if (!ret) - sme_update_config(hHal, sme_config); - + ret = hdd_we_set_ch_width(adapter, set_value); break; - } case WE_SET_ANI_EN_DIS: {