mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-12 07:37:31 -04:00
qcacld-3.0: [11AX] Add support to configure 11ax rate
Add support for to configure 11ax rates using set_11ax_rate iwpriv command. Change-Id: I55ab5cc3b51f92ab5c2e347d3b17e392456b90b8 CRs-Fixed: 1073481
This commit is contained in:
parent
f567650ade
commit
9e5339da1f
4 changed files with 126 additions and 12 deletions
|
|
@ -191,6 +191,9 @@ typedef struct {
|
|||
#define RC_2_RATE_IDX_11AC(_rc) ((_rc) & 0xf)
|
||||
#define HT_RC_2_STREAMS_11AC(_rc) ((((_rc) & 0x30) >> 4) + 1)
|
||||
|
||||
#define RC_2_RATE_IDX_11AX(_rc) ((_rc) & 0x1f)
|
||||
#define HT_RC_2_STREAMS_11AX(_rc) (((_rc) >> 5) & 0x7)
|
||||
|
||||
enum {
|
||||
QCSAP_PARAM_MAX_ASSOC = 1,
|
||||
QCSAP_PARAM_GET_WLAN_DBG,
|
||||
|
|
@ -252,6 +255,7 @@ enum {
|
|||
QCASAP_PARAM_RX_STBC,
|
||||
QCSAP_PARAM_CHAN_WIDTH,
|
||||
QCSAP_PARAM_SET_TXRX_STATS,
|
||||
QCASAP_SET_11AX_RATE,
|
||||
};
|
||||
|
||||
int iw_get_channel_list(struct net_device *dev,
|
||||
|
|
|
|||
|
|
@ -36,6 +36,8 @@
|
|||
#include <linux/timer.h>
|
||||
#include "qdf_event.h"
|
||||
|
||||
struct sap_Config;
|
||||
|
||||
/*
|
||||
* order of parameters in addTs private ioctl
|
||||
*/
|
||||
|
|
@ -384,6 +386,31 @@ 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);
|
||||
|
||||
/**
|
||||
* hdd_assemble_rate_code() - assemble rate code to be sent to FW
|
||||
* @preamble: rate preamble
|
||||
* @nss: number of streams
|
||||
* @rate: rate index
|
||||
*
|
||||
* Rate code assembling is different for targets which are 11ax capable.
|
||||
* Check for the target support and assemble the rate code accordingly.
|
||||
*
|
||||
* Return: assembled rate code
|
||||
*/
|
||||
int hdd_assemble_rate_code(uint8_t preamble, uint8_t nss, uint8_t rate);
|
||||
|
||||
/**
|
||||
* hdd_set_11ax_rate() - set 11ax rate
|
||||
* @adapter: adapter being modified
|
||||
* @value: new 11ax rate code
|
||||
* @sap_config: pointer to SAP config to check HW mode
|
||||
* this will be NULL for call from STA persona
|
||||
*
|
||||
* Return: 0 on success, negative errno on failure
|
||||
*/
|
||||
int hdd_set_11ax_rate(hdd_adapter_t *adapter, int value,
|
||||
struct sap_Config *sap_config);
|
||||
|
||||
void wlan_hdd_change_country_code_callback(void *pAdapter);
|
||||
|
||||
int hdd_set_band(struct net_device *dev, u8 ui_band);
|
||||
|
|
|
|||
|
|
@ -2990,7 +2990,7 @@ static __iw_softap_setparam(struct net_device *dev,
|
|||
}
|
||||
preamble = WMI_RATE_PREAMBLE_OFDM;
|
||||
}
|
||||
set_value = (preamble << 6) | (nss << 4) | rix;
|
||||
set_value = hdd_assemble_rate_code(preamble, nss, rix);
|
||||
}
|
||||
hdd_notice("SET_HT_RATE val %d rix %d preamble %x nss %d",
|
||||
set_value, rix, preamble, nss);
|
||||
|
|
@ -3015,11 +3015,11 @@ static __iw_softap_setparam(struct net_device *dev,
|
|||
}
|
||||
|
||||
if (set_value != 0xff) {
|
||||
rix = RC_2_RATE_IDX_11AC(set_value);
|
||||
preamble = WMI_RATE_PREAMBLE_VHT;
|
||||
nss = HT_RC_2_STREAMS_11AC(set_value) - 1;
|
||||
rix = RC_2_RATE_IDX_11AC(set_value);
|
||||
preamble = WMI_RATE_PREAMBLE_VHT;
|
||||
nss = HT_RC_2_STREAMS_11AC(set_value) - 1;
|
||||
|
||||
set_value = (preamble << 6) | (nss << 4) | rix;
|
||||
set_value = hdd_assemble_rate_code(preamble, nss, rix);
|
||||
}
|
||||
hdd_notice("SET_VHT_RATE val %d rix %d preamble %x nss %d",
|
||||
set_value, rix, preamble, nss);
|
||||
|
|
@ -3033,7 +3033,6 @@ static __iw_softap_setparam(struct net_device *dev,
|
|||
case QCASAP_SHORT_GI:
|
||||
{
|
||||
hdd_notice("QCASAP_SET_SHORT_GI val %d", set_value);
|
||||
|
||||
/* same as 40MHZ */
|
||||
ret = sme_update_ht_config(hHal, pHostapdAdapter->sessionId,
|
||||
WNI_CFG_HT_CAP_INFO_SHORT_GI_20MHZ,
|
||||
|
|
@ -3302,7 +3301,11 @@ static __iw_softap_setparam(struct net_device *dev,
|
|||
case QCASAP_PARAM_RX_STBC:
|
||||
ret = hdd_set_rx_stbc(pHostapdAdapter, set_value);
|
||||
break;
|
||||
|
||||
case QCASAP_SET_11AX_RATE:
|
||||
ret = hdd_set_11ax_rate(pHostapdAdapter, set_value,
|
||||
&pHostapdAdapter->sessionCtx.ap.
|
||||
sapConfig);
|
||||
break;
|
||||
default:
|
||||
hdd_err("Invalid setparam command %d value %d",
|
||||
sub_cmd, set_value);
|
||||
|
|
@ -3452,8 +3455,7 @@ static __iw_softap_getparam(struct net_device *dev,
|
|||
case QCASAP_SHORT_GI:
|
||||
{
|
||||
*value = (int)sme_get_ht_config(hHal,
|
||||
pHostapdAdapter->
|
||||
sessionId,
|
||||
pHostapdAdapter->sessionId,
|
||||
WNI_CFG_HT_CAP_INFO_SHORT_GI_20MHZ);
|
||||
break;
|
||||
}
|
||||
|
|
@ -5764,7 +5766,12 @@ static const struct iw_priv_args hostapd_private_args[] = {
|
|||
}
|
||||
,
|
||||
#endif
|
||||
|
||||
{
|
||||
QCASAP_SET_11AX_RATE,
|
||||
IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
|
||||
0, "set_11ax_rate"
|
||||
}
|
||||
,
|
||||
};
|
||||
|
||||
static const iw_handler hostapd_private[] = {
|
||||
|
|
|
|||
|
|
@ -1011,6 +1011,26 @@ static const hdd_freq_chan_map_t freq_chan_map[] = {
|
|||
#define WE_SET_CONC_SYSTEM_PREF 89
|
||||
#define WE_SET_TXRX_STATS 90
|
||||
|
||||
/*
|
||||
* <ioctl>
|
||||
* set_11ax_rate - set 11ax rates to FW
|
||||
*
|
||||
* @INPUT: rate code
|
||||
*
|
||||
* @OUTPUT: None
|
||||
*
|
||||
* This IOCTL fixes the Tx data rate of 11AX.
|
||||
*
|
||||
* @E.g: iwpriv wlan0 set_11ax_rate <rate code>
|
||||
*
|
||||
* Supported Feature: STA/SAP
|
||||
*
|
||||
* Usage: Internal
|
||||
*
|
||||
* </ioctl>
|
||||
*/
|
||||
#define WE_SET_11AX_RATE 91
|
||||
|
||||
/* Private ioctls and their sub-ioctls */
|
||||
#define WLAN_PRIV_SET_NONE_GET_INT (SIOCIWFIRSTPRIV + 1)
|
||||
#define WE_GET_11D_STATE 1
|
||||
|
|
@ -3952,6 +3972,54 @@ int hdd_set_rx_stbc(hdd_adapter_t *adapter, int value)
|
|||
return ret;
|
||||
}
|
||||
|
||||
int hdd_assemble_rate_code(uint8_t preamble, uint8_t nss, uint8_t rate)
|
||||
{
|
||||
int set_value;
|
||||
|
||||
if (sme_is_feature_supported_by_fw(DOT11AX))
|
||||
set_value = WMI_ASSEMBLE_RATECODE_V1(rate, nss, preamble);
|
||||
else
|
||||
set_value = (preamble << 6) | (nss << 4) | rate;
|
||||
|
||||
return set_value;
|
||||
}
|
||||
|
||||
int hdd_set_11ax_rate(hdd_adapter_t *adapter, int set_value,
|
||||
struct sap_Config *sap_config)
|
||||
{
|
||||
uint8_t preamble = 0, nss = 0, rix = 0;
|
||||
int ret;
|
||||
|
||||
if (!sap_config) {
|
||||
if (!sme_is_feature_supported_by_fw(DOT11AX)) {
|
||||
hdd_err("Target does not support 11ax");
|
||||
return -EIO;
|
||||
}
|
||||
} else if (sap_config->SapHw_mode != eCSR_DOT11_MODE_11ax &&
|
||||
sap_config->SapHw_mode != eCSR_DOT11_MODE_11ax_ONLY) {
|
||||
hdd_err("Invalid hw mode, SAP hw_mode= 0x%x, ch = %d",
|
||||
sap_config->SapHw_mode, sap_config->channel);
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
if (set_value != 0xff) {
|
||||
rix = RC_2_RATE_IDX_11AX(set_value);
|
||||
preamble = WMI_RATE_PREAMBLE_HE;
|
||||
nss = HT_RC_2_STREAMS_11AX(set_value);
|
||||
|
||||
set_value = hdd_assemble_rate_code(preamble, nss, rix);
|
||||
}
|
||||
|
||||
hdd_notice("SET_11AX_RATE val %d rix %d preamble %x nss %d",
|
||||
set_value, rix, preamble, nss);
|
||||
|
||||
ret = wma_cli_set_command(adapter->sessionId,
|
||||
WMI_VDEV_PARAM_FIXED_RATE,
|
||||
set_value, VDEV_CMD);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* __iw_set_commit() - SIOCSIWCOMMIT ioctl handler
|
||||
* @dev: device upon which the ioctl was received
|
||||
|
|
@ -7863,7 +7931,7 @@ static int __iw_setint_getnone(struct net_device *dev,
|
|||
WMI_RATE_PREAMBLE_OFDM;
|
||||
}
|
||||
}
|
||||
set_value = (preamble << 6) | (nss << 4) | rix;
|
||||
set_value = hdd_assemble_rate_code(preamble, nss, rix);
|
||||
}
|
||||
hdd_info("WMI_VDEV_PARAM_FIXED_RATE val %d rix %d preamble %x nss %d",
|
||||
set_value, rix, preamble, nss);
|
||||
|
|
@ -7883,7 +7951,7 @@ static int __iw_setint_getnone(struct net_device *dev,
|
|||
preamble = WMI_RATE_PREAMBLE_VHT;
|
||||
nss = HT_RC_2_STREAMS_11AC(set_value) - 1;
|
||||
|
||||
set_value = (preamble << 6) | (nss << 4) | rix;
|
||||
set_value = hdd_assemble_rate_code(preamble, nss, rix);
|
||||
}
|
||||
hdd_info("WMI_VDEV_PARAM_FIXED_RATE val %d rix %d preamble %x nss %d",
|
||||
set_value, rix, preamble, nss);
|
||||
|
|
@ -8438,6 +8506,9 @@ static int __iw_setint_getnone(struct net_device *dev,
|
|||
hdd_ctx->config->conc_system_pref = set_value;
|
||||
break;
|
||||
}
|
||||
case WE_SET_11AX_RATE:
|
||||
ret = hdd_set_11ax_rate(pAdapter, set_value, NULL);
|
||||
break;
|
||||
default:
|
||||
{
|
||||
hdd_err("Invalid sub command %d",
|
||||
|
|
@ -13453,6 +13524,11 @@ static const struct iw_priv_args we_private_args[] = {
|
|||
IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
|
||||
"hostroamdelay"}
|
||||
,
|
||||
{WE_SET_11AX_RATE,
|
||||
IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
|
||||
0,
|
||||
"set_11ax_rate"}
|
||||
,
|
||||
};
|
||||
|
||||
const struct iw_handler_def we_handler_def = {
|
||||
|
|
|
|||
Loading…
Reference in a new issue