|
@@ -583,6 +583,49 @@ static inline void wma_get_link_probe_timeout(struct sAniSirGlobal *mac,
|
|
|
*max_unresponsive_time = *max_inactive_time + keep_alive;
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ * wma_verify_rate_code() - verify if rate code is valid.
|
|
|
+ * @rate_code: rate code
|
|
|
+ *
|
|
|
+ * Return: verify result
|
|
|
+ */
|
|
|
+static bool wma_verify_rate_code(u_int32_t rate_code)
|
|
|
+{
|
|
|
+ uint8_t preamble, nss, rate;
|
|
|
+ bool valid = true;
|
|
|
+
|
|
|
+ preamble = (rate_code & 0xc0) >> 6;
|
|
|
+ nss = (rate_code & 0x30) >> 4;
|
|
|
+ rate = rate_code & 0xf;
|
|
|
+
|
|
|
+ switch (preamble) {
|
|
|
+ case WMI_RATE_PREAMBLE_CCK:
|
|
|
+ if (nss != 0 || rate > 3)
|
|
|
+ valid = false;
|
|
|
+ break;
|
|
|
+ case WMI_RATE_PREAMBLE_OFDM:
|
|
|
+ if (nss != 0 || rate > 7)
|
|
|
+ valid = false;
|
|
|
+ break;
|
|
|
+ case WMI_RATE_PREAMBLE_HT:
|
|
|
+ if (nss > 1 || rate > 7)
|
|
|
+ valid = false;
|
|
|
+ break;
|
|
|
+ case WMI_RATE_PREAMBLE_VHT:
|
|
|
+ if (nss > 1 || rate > 9)
|
|
|
+ valid = false;
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ return valid;
|
|
|
+}
|
|
|
+
|
|
|
+#define TX_MGMT_RATE_2G_ENABLE_OFFSET 30
|
|
|
+#define TX_MGMT_RATE_5G_ENABLE_OFFSET 31
|
|
|
+#define TX_MGMT_RATE_2G_OFFSET 0
|
|
|
+#define TX_MGMT_RATE_5G_OFFSET 12
|
|
|
+
|
|
|
/**
|
|
|
* wma_set_mgmt_rate() - set vdev mgmt rate.
|
|
|
* @wma: wma handle
|
|
@@ -594,6 +637,7 @@ void wma_set_vdev_mgmt_rate(tp_wma_handle wma, uint8_t vdev_id)
|
|
|
{
|
|
|
uint32_t cfg_val;
|
|
|
int ret;
|
|
|
+ uint32_t per_band_mgmt_tx_rate = 0;
|
|
|
struct sAniSirGlobal *mac = cds_get_context(QDF_MODULE_ID_PE);
|
|
|
|
|
|
if (NULL == mac) {
|
|
@@ -603,7 +647,8 @@ void wma_set_vdev_mgmt_rate(tp_wma_handle wma, uint8_t vdev_id)
|
|
|
|
|
|
if (wlan_cfg_get_int(mac, WNI_CFG_RATE_FOR_TX_MGMT,
|
|
|
&cfg_val) == eSIR_SUCCESS) {
|
|
|
- if (cfg_val == WNI_CFG_RATE_FOR_TX_MGMT_STADEF) {
|
|
|
+ if ((cfg_val == WNI_CFG_RATE_FOR_TX_MGMT_STADEF) ||
|
|
|
+ !wma_verify_rate_code(cfg_val)) {
|
|
|
WMA_LOGD("default WNI_CFG_RATE_FOR_TX_MGMT, ignore");
|
|
|
} else {
|
|
|
ret = wma_vdev_set_param(
|
|
@@ -619,6 +664,47 @@ void wma_set_vdev_mgmt_rate(tp_wma_handle wma, uint8_t vdev_id)
|
|
|
} else {
|
|
|
WMA_LOGE("Failed to get value of WNI_CFG_RATE_FOR_TX_MGMT");
|
|
|
}
|
|
|
+
|
|
|
+ if (wlan_cfg_get_int(mac, WNI_CFG_RATE_FOR_TX_MGMT_2G,
|
|
|
+ &cfg_val) == eSIR_SUCCESS) {
|
|
|
+ if ((cfg_val == WNI_CFG_RATE_FOR_TX_MGMT_2G_STADEF) ||
|
|
|
+ !wma_verify_rate_code(cfg_val)) {
|
|
|
+ per_band_mgmt_tx_rate &=
|
|
|
+ ~(1 << TX_MGMT_RATE_2G_ENABLE_OFFSET);
|
|
|
+ } else {
|
|
|
+ per_band_mgmt_tx_rate |=
|
|
|
+ (1 << TX_MGMT_RATE_2G_ENABLE_OFFSET);
|
|
|
+ per_band_mgmt_tx_rate |=
|
|
|
+ ((cfg_val & 0x7FF) << TX_MGMT_RATE_2G_OFFSET);
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ WMA_LOGE("Failed to get value of WNI_CFG_RATE_FOR_TX_MGMT_2G");
|
|
|
+ }
|
|
|
+
|
|
|
+ if (wlan_cfg_get_int(mac, WNI_CFG_RATE_FOR_TX_MGMT_5G,
|
|
|
+ &cfg_val) == eSIR_SUCCESS) {
|
|
|
+ if ((cfg_val == WNI_CFG_RATE_FOR_TX_MGMT_5G_STADEF) ||
|
|
|
+ !wma_verify_rate_code(cfg_val)) {
|
|
|
+ per_band_mgmt_tx_rate &=
|
|
|
+ ~(1 << TX_MGMT_RATE_5G_ENABLE_OFFSET);
|
|
|
+ } else {
|
|
|
+ per_band_mgmt_tx_rate |=
|
|
|
+ (1 << TX_MGMT_RATE_5G_ENABLE_OFFSET);
|
|
|
+ per_band_mgmt_tx_rate |=
|
|
|
+ ((cfg_val & 0x7FF) << TX_MGMT_RATE_5G_OFFSET);
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ WMA_LOGE("Failed to get value of WNI_CFG_RATE_FOR_TX_MGMT_5G");
|
|
|
+ }
|
|
|
+
|
|
|
+ ret = wma_vdev_set_param(
|
|
|
+ wma->wmi_handle,
|
|
|
+ vdev_id,
|
|
|
+ WMI_VDEV_PARAM_PER_BAND_MGMT_TX_RATE,
|
|
|
+ per_band_mgmt_tx_rate);
|
|
|
+ if (ret)
|
|
|
+ WMA_LOGE("Failed to set WMI_VDEV_PARAM_PER_BAND_MGMT_TX_RATE");
|
|
|
+
|
|
|
}
|
|
|
|
|
|
/**
|