diff options
Diffstat (limited to 'drivers/net/wireless/iwlegacy/4965-mac.c')
| -rw-r--r-- | drivers/net/wireless/iwlegacy/4965-mac.c | 17 | 
1 files changed, 14 insertions, 3 deletions
diff --git a/drivers/net/wireless/iwlegacy/4965-mac.c b/drivers/net/wireless/iwlegacy/4965-mac.c index 509301a5e7e..34f61a0581a 100644 --- a/drivers/net/wireless/iwlegacy/4965-mac.c +++ b/drivers/net/wireless/iwlegacy/4965-mac.c @@ -3405,7 +3405,7 @@ il4965_remove_dynamic_key(struct il_priv *il,  		return 0;  	} -	if (il->stations[sta_id].sta.key.key_offset == WEP_INVALID_OFFSET) { +	if (il->stations[sta_id].sta.key.key_flags & STA_KEY_FLG_INVALID) {  		IL_WARN("Removing wrong key %d 0x%x\n", keyconf->keyidx,  			key_flags);  		spin_unlock_irqrestore(&il->sta_lock, flags); @@ -3420,7 +3420,7 @@ il4965_remove_dynamic_key(struct il_priv *il,  	memset(&il->stations[sta_id].sta.key, 0, sizeof(struct il4965_keyinfo));  	il->stations[sta_id].sta.key.key_flags =  	    STA_KEY_FLG_NO_ENC | STA_KEY_FLG_INVALID; -	il->stations[sta_id].sta.key.key_offset = WEP_INVALID_OFFSET; +	il->stations[sta_id].sta.key.key_offset = keyconf->hw_key_idx;  	il->stations[sta_id].sta.sta.modify_mask = STA_MODIFY_KEY_MASK;  	il->stations[sta_id].sta.mode = STA_CONTROL_MODIFY_MSK; @@ -5724,7 +5724,8 @@ il4965_mac_setup_register(struct il_priv *il, u32 max_probe_length)  	    BIT(NL80211_IFTYPE_STATION) | BIT(NL80211_IFTYPE_ADHOC);  	hw->wiphy->flags |= -	    WIPHY_FLAG_CUSTOM_REGULATORY | WIPHY_FLAG_DISABLE_BEACON_HINTS; +	    WIPHY_FLAG_CUSTOM_REGULATORY | WIPHY_FLAG_DISABLE_BEACON_HINTS | +	    WIPHY_FLAG_IBSS_RSN;  	/*  	 * For now, disable PS by default because it affects @@ -5873,6 +5874,16 @@ il4965_mac_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,  		return -EOPNOTSUPP;  	} +	/* +	 * To support IBSS RSN, don't program group keys in IBSS, the +	 * hardware will then not attempt to decrypt the frames. +	 */ +	if (vif->type == NL80211_IFTYPE_ADHOC && +	    !(key->flags & IEEE80211_KEY_FLAG_PAIRWISE)) { +		D_MAC80211("leave - ad-hoc group key\n"); +		return -EOPNOTSUPP; +	} +  	sta_id = il_sta_id_or_broadcast(il, sta);  	if (sta_id == IL_INVALID_STATION)  		return -EINVAL;  |