Эх сурвалжийг харах

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)
Manjeet Singh 8 жил өмнө
parent
commit
e80d6d806e

+ 4 - 1
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,

+ 7 - 0
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,

+ 49 - 0
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,

+ 207 - 93
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;
 	}