qcacld-3.0: Associate in 1x1 when connected to a certain Vendor AP

When connected to a certain Vendor AP that cannot handle SMPS frame, only
connect in 1x1.

Change-Id: Ieae25191df8340a582e81dc716b9a1aee6a71921
CRs-Fixed: 2047347
This commit is contained in:
Paul Zhang 2017-05-12 19:20:37 +08:00 • committed by snandini
commit 42dade0dd8
4 changed files with 54 additions and 3 deletions

View file

@ -9281,6 +9281,10 @@ int hdd_wlan_startup(struct device *dev)
set_value, PDEV_CMD);
}
if (hdd_ctx->config->is_force_1x1)
wma_cli_set_command(0, (int)WMI_PDEV_PARAM_SET_IOT_PATTERN,
1, PDEV_CMD);
qdf_mc_timer_start(&hdd_ctx->iface_change_timer,
hdd_ctx->config->iface_change_wait_time * 5000);

View file

@ -617,6 +617,8 @@
#define BA_INITIATOR 2
#define BA_BOTH_DIRECTIONS 3
#define SIR_MAC_VENDOR_AP_1_OUI "\x00\x0C\x43"
#define SIR_MAC_VENDOR_AP_1_OUI_LEN 3
/* / Status Code (present in Management response frames) enum */
typedef enum eSirMacStatusCodes {

View file

@ -88,6 +88,39 @@ static void get_local_power_constraint_probe_response(
}
#endif
/**
* lim_get_nss_supported_by_beacon() - finds out nss from beacom
* @bcn: beacon structure pointer
* @session: pointer to pe session
*
* Return: number of nss advertised by beacon
*/
static uint8_t lim_get_nss_supported_by_beacon(tpSchBeaconStruct bcn,
tpPESession session)
{
if (session->vhtCapability && bcn->VHTCaps.present) {
if ((bcn->VHTCaps.rxMCSMap & 0xC0) != 0xC0)
return 4;
if ((bcn->VHTCaps.rxMCSMap & 0x30) != 0x30)
return 3;
if ((bcn->VHTCaps.rxMCSMap & 0x0C) != 0x0C)
return 2;
} else if (session->htCapability && bcn->HTCaps.present) {
if (bcn->HTCaps.supportedMCSSet[3])
return 4;
if (bcn->HTCaps.supportedMCSSet[2])
return 3;
if (bcn->HTCaps.supportedMCSSet[1])
return 2;
}
return 1;
}
/**
* lim_extract_ap_capability() - extract AP's HCF/WME/WSM capability
* @mac_ctx: Pointer to Global MAC structure
@ -138,6 +171,18 @@ lim_extract_ap_capability(tpAniSirGlobal mac_ctx, uint8_t *p_ie,
qdf_mem_free(beacon_struct);
return;
}
if (mac_ctx->roam.configParam.is_force_1x1 &&
cfg_get_vendor_ie_ptr_from_oui(mac_ctx, SIR_MAC_VENDOR_AP_1_OUI,
SIR_MAC_VENDOR_AP_1_OUI_LEN, p_ie, ie_len) &&
lim_get_nss_supported_by_beacon(beacon_struct, session) == 2) {
session->supported_nss_1x1 = true;
session->vdev_nss = 1;
session->nss = 1;
pe_debug("For special ap, NSS: %d", session->nss);
}
if (beacon_struct->wmeInfoPresent ||
beacon_struct->wmeEdcaPresent ||
beacon_struct->HTCaps.present)

View file

@ -3157,7 +3157,7 @@ static void wma_add_bss_ap_mode(tp_wma_handle wma, tpAddBssParams add_bss)
if (!QDF_IS_STATUS_SUCCESS(status))
WMA_LOGE("policy_mgr_get_current_hw_mode failed");
if ((add_bss->nss == 2) && !hw_mode.dbs_cap) {
if (add_bss->nss == 2) {
req.preferred_rx_streams = 2;
req.preferred_tx_streams = 2;
} else {
@ -3306,7 +3306,7 @@ static void wma_add_bss_ibss_mode(tp_wma_handle wma, tpAddBssParams add_bss)
if (!QDF_IS_STATUS_SUCCESS(status))
WMA_LOGE("policy_mgr_get_current_hw_mode failed");
if ((add_bss->nss == 2) && !hw_mode.dbs_cap) {
if (add_bss->nss == 2) {
req.preferred_rx_streams = 2;
req.preferred_tx_streams = 2;
} else {
@ -3491,7 +3491,7 @@ static void wma_add_bss_sta_mode(tp_wma_handle wma, tpAddBssParams add_bss)
if (!QDF_IS_STATUS_SUCCESS(status))
WMA_LOGE("policy_mgr_get_current_hw_mode failed");
if ((add_bss->nss == 2) && !hw_mode.dbs_cap) {
if (add_bss->nss == 2) {
req.preferred_rx_streams = 2;
req.preferred_tx_streams = 2;
} else {