From e80d6d806ee9d5cb2e8f36d101369d972b715ac0 Mon Sep 17 00:00:00 2001 From: Manjeet Singh Date: Fri, 2 Sep 2016 19:04:41 +0530 Subject: [PATCH] qcacld-3.0: Support LDPC and STBC ioctls on SAP qcacld-2.0 to qcacld-3.0 propagation Currently the following private ioctls are only supported on STA-type interfaces: set_ldpc, get_ldpc, set_tx_stbc, get_tx_stbc, set_rx_stbc and get_rx_stbc. Update the driver to support these commands on SAP-type interfaces as well. Change-Id: Ic135dcbd74918a2d27802e3edc34444545aa18ff CRs-Fixed: 844097 (cherry picked from commit bf5ed2ca492bbe66b8825ad68ce975454f989dd6) --- core/hdd/inc/qc_sap_ioctl.h | 5 +- core/hdd/inc/wlan_hdd_wext.h | 7 + core/hdd/src/wlan_hdd_hostapd.c | 49 ++++++ core/hdd/src/wlan_hdd_wext.c | 300 ++++++++++++++++++++++---------- 4 files changed, 267 insertions(+), 94 deletions(-) diff --git a/core/hdd/inc/qc_sap_ioctl.h b/core/hdd/inc/qc_sap_ioctl.h index 6301e84b726f..60e61e42bb01 100644 --- a/core/hdd/inc/qc_sap_ioctl.h +++ b/core/hdd/inc/qc_sap_ioctl.h @@ -242,7 +242,10 @@ enum { QCSAP_START_FW_PROFILING, QCSAP_CAP_TSF, QCSAP_GET_TSF, - QCSAP_PARAM_CONC_SYSTEM_PREF + QCSAP_PARAM_CONC_SYSTEM_PREF, + QCASAP_PARAM_LDPC, + QCASAP_PARAM_TX_STBC, + QCASAP_PARAM_RX_STBC, }; int iw_get_channel_list(struct net_device *dev, diff --git a/core/hdd/inc/wlan_hdd_wext.h b/core/hdd/inc/wlan_hdd_wext.h index b1bad21c4fde..8d23b42cdad5 100644 --- a/core/hdd/inc/wlan_hdd_wext.h +++ b/core/hdd/inc/wlan_hdd_wext.h @@ -353,6 +353,13 @@ QDF_STATUS wlan_hdd_get_rssi(hdd_adapter_t *pAdapter, int8_t *rssi_value); QDF_STATUS wlan_hdd_get_snr(hdd_adapter_t *pAdapter, int8_t *snr); +int hdd_get_ldpc(hdd_adapter_t *adapter, int *value); +int hdd_set_ldpc(hdd_adapter_t *adapter, int value); +int hdd_get_tx_stbc(hdd_adapter_t *adapter, int *value); +int hdd_set_tx_stbc(hdd_adapter_t *adapter, int value); +int hdd_get_rx_stbc(hdd_adapter_t *adapter, int *value); +int hdd_set_rx_stbc(hdd_adapter_t *adapter, int value); + #ifdef FEATURE_WLAN_TDLS QDF_STATUS iw_set_tdls_params(struct net_device *dev, struct iw_request_info *info, diff --git a/core/hdd/src/wlan_hdd_hostapd.c b/core/hdd/src/wlan_hdd_hostapd.c index 50effdaf96c5..905ceb2e0f15 100644 --- a/core/hdd/src/wlan_hdd_hostapd.c +++ b/core/hdd/src/wlan_hdd_hostapd.c @@ -3125,6 +3125,16 @@ static __iw_softap_setparam(struct net_device *dev, WMI_WLAN_PROFILE_TRIGGER_CMDID, set_value, DBG_CMD); break; + case QCASAP_PARAM_LDPC: + ret = hdd_set_ldpc(pHostapdAdapter, set_value); + break; + case QCASAP_PARAM_TX_STBC: + ret = hdd_set_tx_stbc(pHostapdAdapter, set_value); + break; + case QCASAP_PARAM_RX_STBC: + ret = hdd_set_rx_stbc(pHostapdAdapter, set_value); + break; + default: hdd_err("Invalid setparam command %d value %d", sub_cmd, set_value); @@ -3410,6 +3420,21 @@ static __iw_softap_getparam(struct net_device *dev, WMI_WLAN_PROFILE_GET_PROFILE_DATA_CMDID, 0, DBG_CMD); break; + case QCASAP_PARAM_LDPC: + { + ret = hdd_get_ldpc(pHostapdAdapter, value); + break; + } + case QCASAP_PARAM_TX_STBC: + { + ret = hdd_get_tx_stbc(pHostapdAdapter, value); + break; + } + case QCASAP_PARAM_RX_STBC: + { + ret = hdd_get_rx_stbc(pHostapdAdapter, value); + break; + } default: hdd_err("Invalid getparam command %d", sub_cmd); ret = -EINVAL; @@ -5345,6 +5370,18 @@ static const struct iw_priv_args hostapd_private_args[] = { QCSAP_START_FW_PROFILING, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "startProfile" + }, { + QCASAP_PARAM_LDPC, + IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, + 0, "set_ldpc" + }, { + QCASAP_PARAM_TX_STBC, + IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, + 0, "set_tx_stbc" + }, { + QCASAP_PARAM_RX_STBC, + IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, + 0, "set_rx_stbc" }, { QCSAP_IOCTL_GETPARAM, 0, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, "getparam" @@ -5396,6 +5433,18 @@ static const struct iw_priv_args hostapd_private_args[] = { }, { QCSAP_GET_ACL, 0, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, "get_acl_list" + }, { + QCASAP_PARAM_LDPC, 0, + IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, + "get_ldpc" + }, { + QCASAP_PARAM_TX_STBC, 0, + IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, + "get_tx_stbc" + }, { + QCASAP_PARAM_RX_STBC, 0, + IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, + "get_rx_stbc" }, { QCASAP_TX_CHAINMASK_CMD, 0, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, diff --git a/core/hdd/src/wlan_hdd_wext.c b/core/hdd/src/wlan_hdd_wext.c index 702e62da6725..325152d3da28 100644 --- a/core/hdd/src/wlan_hdd_wext.c +++ b/core/hdd/src/wlan_hdd_wext.c @@ -1709,6 +1709,207 @@ uint8_t *wlan_hdd_get_vendor_oui_ie_ptr(uint8_t *oui, uint8_t oui_size, return NULL; } +/** + * hdd_get_ldpc() - Get adapter LDPC + * @adapter: adapter being queried + * @value: where to store the value + * + * Return: 0 on success, negative errno on failure + */ +int hdd_get_ldpc(hdd_adapter_t *adapter, int *value) +{ + tHalHandle hal = WLAN_HDD_GET_HAL_CTX(adapter); + int ret; + + ENTER(); + ret = sme_get_ht_config(hal, adapter->sessionId, + WNI_CFG_HT_CAP_INFO_ADVANCE_CODING); + if (ret < 0) { + hdd_alert("Failed to get LDPC value"); + } else { + *value = ret; + ret = 0; + } + return ret; +} + +/** + * hdd_set_ldpc() - Set adapter LDPC + * @adapter: adapter being modified + * @value: new LDPC value + * + * Return: 0 on success, negative errno on failure + */ +int hdd_set_ldpc(hdd_adapter_t *adapter, int value) +{ + tHalHandle hal = WLAN_HDD_GET_HAL_CTX(adapter); + int ret; + + hdd_alert("%d", value); + if (value) { + /* make sure HT capabilities allow this */ + QDF_STATUS status; + uint32_t cfg_value; + union { + uint16_t cfg_value16; + tSirMacHTCapabilityInfo ht_cap_info; + } u; + + status = sme_cfg_get_int(hal, WNI_CFG_HT_CAP_INFO, &cfg_value); + if (QDF_STATUS_SUCCESS != status) { + hdd_alert("Failed to get HT capability info"); + return -EIO; + } + u.cfg_value16 = cfg_value & 0xFFFF; + if (!u.ht_cap_info.advCodingCap) { + hdd_alert("LDCP not supported"); + return -EINVAL; + } + } + + ret = sme_update_ht_config(hal, adapter->sessionId, + WNI_CFG_HT_CAP_INFO_ADVANCE_CODING, + value); + if (ret) + hdd_alert("Failed to set LDPC value"); + + return ret; +} + +/** + * hdd_get_tx_stbc() - Get adapter TX STBC + * @adapter: adapter being queried + * @value: where to store the value + * + * Return: 0 on success, negative errno on failure + */ +int hdd_get_tx_stbc(hdd_adapter_t *adapter, int *value) +{ + tHalHandle hal = WLAN_HDD_GET_HAL_CTX(adapter); + int ret; + + ENTER(); + ret = sme_get_ht_config(hal, adapter->sessionId, + WNI_CFG_HT_CAP_INFO_TX_STBC); + if (ret < 0) { + hdd_alert("Failed to get TX STBC value"); + } else { + *value = ret; + ret = 0; + } + + return ret; +} + +/** + * hdd_set_tx_stbc() - Set adapter TX STBC + * @adapter: adapter being modified + * @value: new TX STBC value + * + * Return: 0 on success, negative errno on failure + */ +int hdd_set_tx_stbc(hdd_adapter_t *adapter, int value) +{ + tHalHandle hal = WLAN_HDD_GET_HAL_CTX(adapter); + int ret; + + hdd_alert("%d", value); + if (value) { + /* make sure HT capabilities allow this */ + QDF_STATUS status; + uint32_t cfg_value; + union { + uint16_t cfg_value16; + tSirMacHTCapabilityInfo ht_cap_info; + } u; + + status = sme_cfg_get_int(hal, WNI_CFG_HT_CAP_INFO, &cfg_value); + if (QDF_STATUS_SUCCESS != status) { + hdd_alert("Failed to get HT capability info"); + return -EIO; + } + u.cfg_value16 = cfg_value & 0xFFFF; + if (!u.ht_cap_info.txSTBC) { + hdd_alert("TX STBC not supported"); + return -EINVAL; + } + } + ret = sme_update_ht_config(hal, adapter->sessionId, + WNI_CFG_HT_CAP_INFO_TX_STBC, + value); + if (ret) + hdd_alert("Failed to set TX STBC value"); + + return ret; +} + +/** + * hdd_get_rx_stbc() - Get adapter RX STBC + * @adapter: adapter being queried + * @value: where to store the value + * + * Return: 0 on success, negative errno on failure + */ +int hdd_get_rx_stbc(hdd_adapter_t *adapter, int *value) +{ + tHalHandle hal = WLAN_HDD_GET_HAL_CTX(adapter); + int ret; + + ENTER(); + ret = sme_get_ht_config(hal, adapter->sessionId, + WNI_CFG_HT_CAP_INFO_RX_STBC); + if (ret < 0) { + hdd_alert("Failed to get RX STBC value"); + } else { + *value = ret; + ret = 0; + } + + return ret; +} + +/** + * hdd_set_rx_stbc() - Set adapter RX STBC + * @adapter: adapter being modified + * @value: new RX STBC value + * + * Return: 0 on success, negative errno on failure + */ +int hdd_set_rx_stbc(hdd_adapter_t *adapter, int value) +{ + tHalHandle hal = WLAN_HDD_GET_HAL_CTX(adapter); + int ret; + + hdd_alert("%d", value); + if (value) { + /* make sure HT capabilities allow this */ + QDF_STATUS status; + uint32_t cfg_value; + union { + uint16_t cfg_value16; + tSirMacHTCapabilityInfo ht_cap_info; + } u; + + status = sme_cfg_get_int(hal, WNI_CFG_HT_CAP_INFO, &cfg_value); + if (QDF_STATUS_SUCCESS != status) { + hdd_alert("Failed to get HT capability info"); + return -EIO; + } + u.cfg_value16 = cfg_value & 0xFFFF; + if (!u.ht_cap_info.rxSTBC) { + hdd_alert("RX STBC not supported"); + return -EINVAL; + } + } + ret = sme_update_ht_config(hal, adapter->sessionId, + WNI_CFG_HT_CAP_INFO_RX_STBC, + value); + if (ret) + hdd_alert("Failed to set RX STBC value"); + + return ret; +} + /** * __iw_set_commit() - SIOCSIWCOMMIT ioctl handler * @dev: device upon which the ioctl was received @@ -5292,100 +5493,19 @@ static int __iw_setint_getnone(struct net_device *dev, case WE_SET_LDPC: { - uint32_t value; - union { - uint16_t nCfgValue16; - tSirMacHTCapabilityInfo htCapInfo; - } uHTCapabilityInfo; - - hdd_notice("LDPC val %d", set_value); - /* get the HT capability info */ - ret = sme_cfg_get_int(hHal, WNI_CFG_HT_CAP_INFO, &value); - if (QDF_STATUS_SUCCESS != ret) { - hdd_err("could not get HT capability info"); - return -EIO; - } - - uHTCapabilityInfo.nCfgValue16 = 0xFFFF & value; - if ((set_value - && (uHTCapabilityInfo.htCapInfo.advCodingCap)) - || (!set_value)) { - ret = - sme_update_ht_config(hHal, - pAdapter->sessionId, - WNI_CFG_HT_CAP_INFO_ADVANCE_CODING, - set_value); - } - - if (ret) - hdd_err("Failed to set LDPC value"); - + ret = hdd_set_ldpc(pAdapter, set_value); break; } case WE_SET_TX_STBC: { - uint32_t value; - union { - uint16_t nCfgValue16; - tSirMacHTCapabilityInfo htCapInfo; - } uHTCapabilityInfo; - - hdd_notice("TX_STBC val %d", set_value); - /* get the HT capability info */ - ret = sme_cfg_get_int(hHal, WNI_CFG_HT_CAP_INFO, &value); - if (QDF_STATUS_SUCCESS != ret) { - hdd_err("could not get HT capability info"); - return -EIO; - } - - uHTCapabilityInfo.nCfgValue16 = 0xFFFF & value; - if ((set_value && (uHTCapabilityInfo.htCapInfo.txSTBC)) - || (!set_value)) { - ret = - sme_update_ht_config(hHal, - pAdapter->sessionId, - WNI_CFG_HT_CAP_INFO_TX_STBC, - set_value); - } - - if (ret) - hdd_err("Failed to set TX STBC value"); - + ret = hdd_set_tx_stbc(pAdapter, set_value); break; } case WE_SET_RX_STBC: { - uint32_t value; - union { - uint16_t nCfgValue16; - tSirMacHTCapabilityInfo htCapInfo; - } uHTCapabilityInfo; - - hdd_notice("WMI_VDEV_PARAM_RX_STBC val %d", - set_value); - /* get the HT capability info */ - ret = sme_cfg_get_int(hHal, WNI_CFG_HT_CAP_INFO, &value); - if (QDF_STATUS_SUCCESS != ret) { - hdd_err("could not get HT capability info"); - return -EIO; - } - - uHTCapabilityInfo.nCfgValue16 = 0xFFFF & value; - if ((set_value && (uHTCapabilityInfo.htCapInfo.rxSTBC)) - || (!set_value)) { - ret = - sme_update_ht_config(hHal, - pAdapter->sessionId, - WNI_CFG_HT_CAP_INFO_RX_STBC, - (!set_value) ? set_value - : uHTCapabilityInfo. - htCapInfo.rxSTBC); - } - - if (ret) - hdd_err("Failed to set RX STBC value"); + ret = hdd_set_rx_stbc(pAdapter, set_value); break; } @@ -6521,25 +6641,19 @@ static int __iw_setnone_getint(struct net_device *dev, case WE_GET_LDPC: { - hdd_notice("GET WMI_VDEV_PARAM_LDPC"); - *value = sme_get_ht_config(hHal, pAdapter->sessionId, - WNI_CFG_HT_CAP_INFO_ADVANCE_CODING); + ret = hdd_get_ldpc(pAdapter, value); break; } case WE_GET_TX_STBC: { - hdd_notice("GET WMI_VDEV_PARAM_TX_STBC"); - *value = sme_get_ht_config(hHal, pAdapter->sessionId, - WNI_CFG_HT_CAP_INFO_TX_STBC); + ret = hdd_get_tx_stbc(pAdapter, value); break; } case WE_GET_RX_STBC: { - hdd_notice("GET WMI_VDEV_PARAM_RX_STBC"); - *value = sme_get_ht_config(hHal, pAdapter->sessionId, - WNI_CFG_HT_CAP_INFO_RX_STBC); + ret = hdd_get_rx_stbc(pAdapter, value); break; }