diff options
Diffstat (limited to 'drivers/net/wireless/mwifiex/join.c')
| -rw-r--r-- | drivers/net/wireless/mwifiex/join.c | 44 | 
1 files changed, 35 insertions, 9 deletions
diff --git a/drivers/net/wireless/mwifiex/join.c b/drivers/net/wireless/mwifiex/join.c index 88664ae667b..246aa62a481 100644 --- a/drivers/net/wireless/mwifiex/join.c +++ b/drivers/net/wireless/mwifiex/join.c @@ -24,6 +24,7 @@  #include "main.h"  #include "wmm.h"  #include "11n.h" +#include "11ac.h"  #define CAPINFO_MASK    (~(BIT(15) | BIT(14) | BIT(12) | BIT(11) | BIT(9))) @@ -157,8 +158,8 @@ static int mwifiex_get_common_rates(struct mwifiex_private *priv, u8 *rate1,  	memset(rate1, 0, rate1_size); -	for (i = 0; rate2[i] && i < rate2_size; i++) { -		for (j = 0; tmp[j] && j < rate1_size; j++) { +	for (i = 0; i < rate2_size && rate2[i]; i++) { +		for (j = 0; j < rate1_size && tmp[j]; j++) {  			/* Check common rate, excluding the bit for  			   basic rate */  			if ((rate2[i] & 0x7F) == (tmp[j] & 0x7F)) { @@ -398,8 +399,6 @@ int mwifiex_cmd_802_11_associate(struct mwifiex_private *priv,  	pos = (u8 *) assoc; -	mwifiex_cfg_tx_buf(priv, bss_desc); -  	cmd->command = cpu_to_le16(HostCmd_CMD_802_11_ASSOCIATE);  	/* Save so we know which BSS Desc to use in the response handler */ @@ -514,6 +513,12 @@ int mwifiex_cmd_802_11_associate(struct mwifiex_private *priv,  	     priv->adapter->config_bands & BAND_AN))  		mwifiex_cmd_append_11n_tlv(priv, bss_desc, &pos); +	if (ISSUPP_11ACENABLED(priv->adapter->fw_cap_info) && +	    !bss_desc->disable_11n && !bss_desc->disable_11ac && +	    (priv->adapter->config_bands & BAND_GAC || +	     priv->adapter->config_bands & BAND_AAC)) +		mwifiex_cmd_append_11ac_tlv(priv, bss_desc, &pos); +  	/* Append vendor specific IE TLV */  	mwifiex_cmd_append_vsie_tlv(priv, MWIFIEX_VSIE_MASK_ASSOC, &pos); @@ -615,23 +620,33 @@ int mwifiex_ret_802_11_associate(struct mwifiex_private *priv,  	struct ieee_types_assoc_rsp *assoc_rsp;  	struct mwifiex_bssdescriptor *bss_desc;  	u8 enable_data = true; +	u16 cap_info, status_code;  	assoc_rsp = (struct ieee_types_assoc_rsp *) &resp->params; +	cap_info = le16_to_cpu(assoc_rsp->cap_info_bitmap); +	status_code = le16_to_cpu(assoc_rsp->status_code); +  	priv->assoc_rsp_size = min(le16_to_cpu(resp->size) - S_DS_GEN,  				   sizeof(priv->assoc_rsp_buf));  	memcpy(priv->assoc_rsp_buf, &resp->params, priv->assoc_rsp_size); -	if (le16_to_cpu(assoc_rsp->status_code)) { +	if (status_code) {  		priv->adapter->dbg.num_cmd_assoc_failure++;  		dev_err(priv->adapter->dev,  			"ASSOC_RESP: failed, status code=%d err=%#x a_id=%#x\n", -			le16_to_cpu(assoc_rsp->status_code), -			le16_to_cpu(assoc_rsp->cap_info_bitmap), -			le16_to_cpu(assoc_rsp->a_id)); +			status_code, cap_info, le16_to_cpu(assoc_rsp->a_id)); + +		if (cap_info == MWIFIEX_TIMEOUT_FOR_AP_RESP) { +			if (status_code == MWIFIEX_STATUS_CODE_AUTH_TIMEOUT) +				ret = WLAN_STATUS_AUTH_TIMEOUT; +			else +				ret = WLAN_STATUS_UNSPECIFIED_FAILURE; +		} else { +			ret = status_code; +		} -		ret = le16_to_cpu(assoc_rsp->status_code);  		goto done;  	} @@ -969,6 +984,16 @@ mwifiex_cmd_802_11_ad_hoc_start(struct mwifiex_private *priv,  					priv->adapter->config_bands);  		mwifiex_fill_cap_info(priv, radio_type, ht_cap); +		if (adapter->sec_chan_offset == +					IEEE80211_HT_PARAM_CHA_SEC_NONE) { +			u16 tmp_ht_cap; + +			tmp_ht_cap = le16_to_cpu(ht_cap->ht_cap.cap_info); +			tmp_ht_cap &= ~IEEE80211_HT_CAP_SUP_WIDTH_20_40; +			tmp_ht_cap &= ~IEEE80211_HT_CAP_SGI_40; +			ht_cap->ht_cap.cap_info = cpu_to_le16(tmp_ht_cap); +		} +  		pos += sizeof(struct mwifiex_ie_types_htcap);  		cmd_append_size += sizeof(struct mwifiex_ie_types_htcap); @@ -1403,6 +1428,7 @@ mwifiex_band_to_radio_type(u8 band)  	case BAND_A:  	case BAND_AN:  	case BAND_A | BAND_AN: +	case BAND_A | BAND_AN | BAND_AAC:  		return HostCmd_SCAN_RADIO_TYPE_A;  	case BAND_B:  	case BAND_G:  |