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)
diff --git a/core/hdd/inc/qc_sap_ioctl.h b/core/hdd/inc/qc_sap_ioctl.h
index 6301e84..60e61e4 100644
--- a/core/hdd/inc/qc_sap_ioctl.h
+++ b/core/hdd/inc/qc_sap_ioctl.h
@@ -242,7 +242,10 @@
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 b1bad21..8d23b42 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_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 50effda..905ceb2 100644
--- a/core/hdd/src/wlan_hdd_hostapd.c
+++ b/core/hdd/src/wlan_hdd_hostapd.c
@@ -3125,6 +3125,16 @@
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 @@
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;
@@ -5346,6 +5371,18 @@
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"
}, {
@@ -5397,6 +5434,18 @@
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,
"get_txchainmask"
diff --git a/core/hdd/src/wlan_hdd_wext.c b/core/hdd/src/wlan_hdd_wext.c
index 702e62d..325152d 100644
--- a/core/hdd/src/wlan_hdd_wext.c
+++ b/core/hdd/src/wlan_hdd_wext.c
@@ -1710,6 +1710,207 @@
}
/**
+ * 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
* @info: ioctl request information
@@ -5292,100 +5493,19 @@
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 @@
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;
}