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)
This commit is contained in:
Manjeet Singh 2016-09-02 19:04:41 +05:30 • committed by qcabuildsw
commit e80d6d806e
4 changed files with 267 additions and 94 deletions

View file

@ -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,

View file

@ -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,

View file

@ -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,

View file

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