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;
 	}