|
@@ -3736,6 +3736,8 @@ static void wma_add_sta_req_ap_mode(tp_wma_handle wma, tpAddStaParams add_sta)
|
|
|
struct wma_target_req *msg;
|
|
|
bool peer_assoc_cnf = false;
|
|
|
void *soc = cds_get_context(QDF_MODULE_ID_SOC);
|
|
|
+ uint32_t mcs_limit, i, j;
|
|
|
+ uint8_t *rate_pos;
|
|
|
|
|
|
pdev = cds_get_context(QDF_MODULE_ID_TXRX);
|
|
|
|
|
@@ -3812,6 +3814,46 @@ static void wma_add_sta_req_ap_mode(tp_wma_handle wma, tpAddStaParams add_sta)
|
|
|
|
|
|
wmi_unified_send_txbf(wma, add_sta);
|
|
|
|
|
|
+ /*
|
|
|
+ * Get MCS limit from ini configure, and map it to rate parameters
|
|
|
+ * This will limit HT rate upper bound. CFG_CTRL_MASK is used to
|
|
|
+ * check whether ini config is enabled and CFG_DATA_MASK to get the
|
|
|
+ * MCS value.
|
|
|
+ */
|
|
|
+#define CFG_CTRL_MASK 0xFF00
|
|
|
+#define CFG_DATA_MASK 0x00FF
|
|
|
+
|
|
|
+ if (wlan_cfg_get_int(wma->mac_context, WNI_CFG_SAP_MAX_MCS_DATA,
|
|
|
+ &mcs_limit) != eSIR_SUCCESS) {
|
|
|
+ mcs_limit = WNI_CFG_SAP_MAX_MCS_DATA_STADEF;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (mcs_limit & CFG_CTRL_MASK) {
|
|
|
+ WMA_LOGD("%s: set mcs_limit %x", __func__, mcs_limit);
|
|
|
+
|
|
|
+ mcs_limit &= CFG_DATA_MASK;
|
|
|
+ rate_pos = (u_int8_t *)add_sta->supportedRates.supportedMCSSet;
|
|
|
+ for (i = 0, j = 0; i < MAX_SUPPORTED_RATES;) {
|
|
|
+ if (j < mcs_limit / 8) {
|
|
|
+ rate_pos[j] = 0xff;
|
|
|
+ j++;
|
|
|
+ i += 8;
|
|
|
+ } else if (j < mcs_limit / 8 + 1) {
|
|
|
+ if (i <= mcs_limit)
|
|
|
+ rate_pos[i / 8] |= 1 << (i % 8);
|
|
|
+ else
|
|
|
+ rate_pos[i / 8] &= ~(1 << (i % 8));
|
|
|
+ i++;
|
|
|
+
|
|
|
+ if (i >= (j + 1) * 8)
|
|
|
+ j++;
|
|
|
+ } else {
|
|
|
+ rate_pos[j++] = 0;
|
|
|
+ i += 8;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
if (WMI_SERVICE_IS_ENABLED(wma->wmi_service_bitmap,
|
|
|
WMI_SERVICE_PEER_ASSOC_CONF)) {
|
|
|
peer_assoc_cnf = true;
|