mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-11 23:24:22 -04:00
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:
parent
0f2ce5c0c4
commit
e80d6d806e
4 changed files with 267 additions and 94 deletions
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue