1 /******************************************************************************
2  *
3  * Copyright(c) 2003 - 2012 Intel Corporation. All rights reserved.
4  *
5  * This program is free software; you can redistribute it and/or modify it
6  * under the terms of version 2 of the GNU General Public License as
7  * published by the Free Software Foundation.
8  *
9  * This program is distributed in the hope that it will be useful, but WITHOUT
10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
12  * more details.
13  *
14  * You should have received a copy of the GNU General Public License along with
15  * this program; if not, write to the Free Software Foundation, Inc.,
16  * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
17  *
18  * The full GNU General Public License is included in this distribution in the
19  * file called LICENSE.
20  *
21  * Contact Information:
22  * Intel Linux Wireless <ilw@linux.intel.com>
23  * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
24  *
25  *****************************************************************************/
26 
27 #include "iwl-dev.h"
28 #include "iwl-agn.h"
29 #include "iwl-core.h"
30 #include "iwl-agn-calib.h"
31 #include "iwl-trans.h"
32 #include "iwl-shared.h"
33 
iwlagn_disable_bss(struct iwl_priv * priv,struct iwl_rxon_context * ctx,struct iwl_rxon_cmd * send)34 static int iwlagn_disable_bss(struct iwl_priv *priv,
35 			      struct iwl_rxon_context *ctx,
36 			      struct iwl_rxon_cmd *send)
37 {
38 	__le32 old_filter = send->filter_flags;
39 	int ret;
40 
41 	send->filter_flags &= ~RXON_FILTER_ASSOC_MSK;
42 	ret = iwl_dvm_send_cmd_pdu(priv, ctx->rxon_cmd,
43 				CMD_SYNC, sizeof(*send), send);
44 
45 	send->filter_flags = old_filter;
46 
47 	if (ret)
48 		IWL_DEBUG_QUIET_RFKILL(priv,
49 			"Error clearing ASSOC_MSK on BSS (%d)\n", ret);
50 
51 	return ret;
52 }
53 
iwlagn_disable_pan(struct iwl_priv * priv,struct iwl_rxon_context * ctx,struct iwl_rxon_cmd * send)54 static int iwlagn_disable_pan(struct iwl_priv *priv,
55 			      struct iwl_rxon_context *ctx,
56 			      struct iwl_rxon_cmd *send)
57 {
58 	struct iwl_notification_wait disable_wait;
59 	__le32 old_filter = send->filter_flags;
60 	u8 old_dev_type = send->dev_type;
61 	int ret;
62 
63 	iwl_init_notification_wait(&priv->notif_wait, &disable_wait,
64 				   REPLY_WIPAN_DEACTIVATION_COMPLETE,
65 				   NULL, NULL);
66 
67 	send->filter_flags &= ~RXON_FILTER_ASSOC_MSK;
68 	send->dev_type = RXON_DEV_TYPE_P2P;
69 	ret = iwl_dvm_send_cmd_pdu(priv, ctx->rxon_cmd,
70 				CMD_SYNC, sizeof(*send), send);
71 
72 	send->filter_flags = old_filter;
73 	send->dev_type = old_dev_type;
74 
75 	if (ret) {
76 		IWL_ERR(priv, "Error disabling PAN (%d)\n", ret);
77 		iwl_remove_notification(&priv->notif_wait, &disable_wait);
78 	} else {
79 		ret = iwl_wait_notification(&priv->notif_wait,
80 					    &disable_wait, HZ);
81 		if (ret)
82 			IWL_ERR(priv, "Timed out waiting for PAN disable\n");
83 	}
84 
85 	return ret;
86 }
87 
iwlagn_disconn_pan(struct iwl_priv * priv,struct iwl_rxon_context * ctx,struct iwl_rxon_cmd * send)88 static int iwlagn_disconn_pan(struct iwl_priv *priv,
89 			      struct iwl_rxon_context *ctx,
90 			      struct iwl_rxon_cmd *send)
91 {
92 	__le32 old_filter = send->filter_flags;
93 	int ret;
94 
95 	send->filter_flags &= ~RXON_FILTER_ASSOC_MSK;
96 	ret = iwl_dvm_send_cmd_pdu(priv, ctx->rxon_cmd, CMD_SYNC,
97 				sizeof(*send), send);
98 
99 	send->filter_flags = old_filter;
100 
101 	return ret;
102 }
103 
iwlagn_update_qos(struct iwl_priv * priv,struct iwl_rxon_context * ctx)104 static void iwlagn_update_qos(struct iwl_priv *priv,
105 			      struct iwl_rxon_context *ctx)
106 {
107 	int ret;
108 
109 	if (!ctx->is_active)
110 		return;
111 
112 	ctx->qos_data.def_qos_parm.qos_flags = 0;
113 
114 	if (ctx->qos_data.qos_active)
115 		ctx->qos_data.def_qos_parm.qos_flags |=
116 			QOS_PARAM_FLG_UPDATE_EDCA_MSK;
117 
118 	if (ctx->ht.enabled)
119 		ctx->qos_data.def_qos_parm.qos_flags |= QOS_PARAM_FLG_TGN_MSK;
120 
121 	IWL_DEBUG_INFO(priv, "send QoS cmd with Qos active=%d FLAGS=0x%X\n",
122 		      ctx->qos_data.qos_active,
123 		      ctx->qos_data.def_qos_parm.qos_flags);
124 
125 	ret = iwl_dvm_send_cmd_pdu(priv, ctx->qos_cmd, CMD_SYNC,
126 			       sizeof(struct iwl_qosparam_cmd),
127 			       &ctx->qos_data.def_qos_parm);
128 	if (ret)
129 		IWL_DEBUG_QUIET_RFKILL(priv, "Failed to update QoS\n");
130 }
131 
iwlagn_update_beacon(struct iwl_priv * priv,struct ieee80211_vif * vif)132 static int iwlagn_update_beacon(struct iwl_priv *priv,
133 				struct ieee80211_vif *vif)
134 {
135 	lockdep_assert_held(&priv->mutex);
136 
137 	dev_kfree_skb(priv->beacon_skb);
138 	priv->beacon_skb = ieee80211_beacon_get(priv->hw, vif);
139 	if (!priv->beacon_skb)
140 		return -ENOMEM;
141 	return iwlagn_send_beacon_cmd(priv);
142 }
143 
iwlagn_send_rxon_assoc(struct iwl_priv * priv,struct iwl_rxon_context * ctx)144 static int iwlagn_send_rxon_assoc(struct iwl_priv *priv,
145 			   struct iwl_rxon_context *ctx)
146 {
147 	int ret = 0;
148 	struct iwl_rxon_assoc_cmd rxon_assoc;
149 	const struct iwl_rxon_cmd *rxon1 = &ctx->staging;
150 	const struct iwl_rxon_cmd *rxon2 = &ctx->active;
151 
152 	if ((rxon1->flags == rxon2->flags) &&
153 	    (rxon1->filter_flags == rxon2->filter_flags) &&
154 	    (rxon1->cck_basic_rates == rxon2->cck_basic_rates) &&
155 	    (rxon1->ofdm_ht_single_stream_basic_rates ==
156 	     rxon2->ofdm_ht_single_stream_basic_rates) &&
157 	    (rxon1->ofdm_ht_dual_stream_basic_rates ==
158 	     rxon2->ofdm_ht_dual_stream_basic_rates) &&
159 	    (rxon1->ofdm_ht_triple_stream_basic_rates ==
160 	     rxon2->ofdm_ht_triple_stream_basic_rates) &&
161 	    (rxon1->acquisition_data == rxon2->acquisition_data) &&
162 	    (rxon1->rx_chain == rxon2->rx_chain) &&
163 	    (rxon1->ofdm_basic_rates == rxon2->ofdm_basic_rates)) {
164 		IWL_DEBUG_INFO(priv, "Using current RXON_ASSOC.  Not resending.\n");
165 		return 0;
166 	}
167 
168 	rxon_assoc.flags = ctx->staging.flags;
169 	rxon_assoc.filter_flags = ctx->staging.filter_flags;
170 	rxon_assoc.ofdm_basic_rates = ctx->staging.ofdm_basic_rates;
171 	rxon_assoc.cck_basic_rates = ctx->staging.cck_basic_rates;
172 	rxon_assoc.reserved1 = 0;
173 	rxon_assoc.reserved2 = 0;
174 	rxon_assoc.reserved3 = 0;
175 	rxon_assoc.ofdm_ht_single_stream_basic_rates =
176 	    ctx->staging.ofdm_ht_single_stream_basic_rates;
177 	rxon_assoc.ofdm_ht_dual_stream_basic_rates =
178 	    ctx->staging.ofdm_ht_dual_stream_basic_rates;
179 	rxon_assoc.rx_chain_select_flags = ctx->staging.rx_chain;
180 	rxon_assoc.ofdm_ht_triple_stream_basic_rates =
181 		 ctx->staging.ofdm_ht_triple_stream_basic_rates;
182 	rxon_assoc.acquisition_data = ctx->staging.acquisition_data;
183 
184 	ret = iwl_dvm_send_cmd_pdu(priv, ctx->rxon_assoc_cmd,
185 				CMD_ASYNC, sizeof(rxon_assoc), &rxon_assoc);
186 	return ret;
187 }
188 
iwlagn_rxon_disconn(struct iwl_priv * priv,struct iwl_rxon_context * ctx)189 static int iwlagn_rxon_disconn(struct iwl_priv *priv,
190 			       struct iwl_rxon_context *ctx)
191 {
192 	int ret;
193 	struct iwl_rxon_cmd *active = (void *)&ctx->active;
194 
195 	if (ctx->ctxid == IWL_RXON_CTX_BSS) {
196 		ret = iwlagn_disable_bss(priv, ctx, &ctx->staging);
197 	} else {
198 		ret = iwlagn_disable_pan(priv, ctx, &ctx->staging);
199 		if (ret)
200 			return ret;
201 		if (ctx->vif) {
202 			ret = iwl_send_rxon_timing(priv, ctx);
203 			if (ret) {
204 				IWL_ERR(priv, "Failed to send timing (%d)!\n", ret);
205 				return ret;
206 			}
207 			ret = iwlagn_disconn_pan(priv, ctx, &ctx->staging);
208 		}
209 	}
210 	if (ret)
211 		return ret;
212 
213 	/*
214 	 * Un-assoc RXON clears the station table and WEP
215 	 * keys, so we have to restore those afterwards.
216 	 */
217 	iwl_clear_ucode_stations(priv, ctx);
218 	/* update -- might need P2P now */
219 	iwl_update_bcast_station(priv, ctx);
220 	iwl_restore_stations(priv, ctx);
221 	ret = iwl_restore_default_wep_keys(priv, ctx);
222 	if (ret) {
223 		IWL_ERR(priv, "Failed to restore WEP keys (%d)\n", ret);
224 		return ret;
225 	}
226 
227 	memcpy(active, &ctx->staging, sizeof(*active));
228 	return 0;
229 }
230 
iwlagn_rxon_connect(struct iwl_priv * priv,struct iwl_rxon_context * ctx)231 static int iwlagn_rxon_connect(struct iwl_priv *priv,
232 			       struct iwl_rxon_context *ctx)
233 {
234 	int ret;
235 	struct iwl_rxon_cmd *active = (void *)&ctx->active;
236 
237 	/* RXON timing must be before associated RXON */
238 	if (ctx->ctxid == IWL_RXON_CTX_BSS) {
239 		ret = iwl_send_rxon_timing(priv, ctx);
240 		if (ret) {
241 			IWL_ERR(priv, "Failed to send timing (%d)!\n", ret);
242 			return ret;
243 		}
244 	}
245 	/* QoS info may be cleared by previous un-assoc RXON */
246 	iwlagn_update_qos(priv, ctx);
247 
248 	/*
249 	 * We'll run into this code path when beaconing is
250 	 * enabled, but then we also need to send the beacon
251 	 * to the device.
252 	 */
253 	if (ctx->vif && (ctx->vif->type == NL80211_IFTYPE_AP)) {
254 		ret = iwlagn_update_beacon(priv, ctx->vif);
255 		if (ret) {
256 			IWL_ERR(priv,
257 				"Error sending required beacon (%d)!\n",
258 				ret);
259 			return ret;
260 		}
261 	}
262 
263 	priv->start_calib = 0;
264 	/*
265 	 * Apply the new configuration.
266 	 *
267 	 * Associated RXON doesn't clear the station table in uCode,
268 	 * so we don't need to restore stations etc. after this.
269 	 */
270 	ret = iwl_dvm_send_cmd_pdu(priv, ctx->rxon_cmd, CMD_SYNC,
271 		      sizeof(struct iwl_rxon_cmd), &ctx->staging);
272 	if (ret) {
273 		IWL_ERR(priv, "Error setting new RXON (%d)\n", ret);
274 		return ret;
275 	}
276 	memcpy(active, &ctx->staging, sizeof(*active));
277 
278 	/* IBSS beacon needs to be sent after setting assoc */
279 	if (ctx->vif && (ctx->vif->type == NL80211_IFTYPE_ADHOC))
280 		if (iwlagn_update_beacon(priv, ctx->vif))
281 			IWL_ERR(priv, "Error sending IBSS beacon\n");
282 	iwl_init_sensitivity(priv);
283 
284 	/*
285 	 * If we issue a new RXON command which required a tune then
286 	 * we must send a new TXPOWER command or we won't be able to
287 	 * Tx any frames.
288 	 *
289 	 * It's expected we set power here if channel is changing.
290 	 */
291 	ret = iwl_set_tx_power(priv, priv->tx_power_next, true);
292 	if (ret) {
293 		IWL_ERR(priv, "Error sending TX power (%d)\n", ret);
294 		return ret;
295 	}
296 
297 	if (ctx->vif && ctx->vif->type == NL80211_IFTYPE_STATION &&
298 	    cfg(priv)->ht_params && cfg(priv)->ht_params->smps_mode)
299 		ieee80211_request_smps(ctx->vif,
300 				       cfg(priv)->ht_params->smps_mode);
301 
302 	return 0;
303 }
304 
iwlagn_set_pan_params(struct iwl_priv * priv)305 int iwlagn_set_pan_params(struct iwl_priv *priv)
306 {
307 	struct iwl_wipan_params_cmd cmd;
308 	struct iwl_rxon_context *ctx_bss, *ctx_pan;
309 	int slot0 = 300, slot1 = 0;
310 	int ret;
311 
312 	if (priv->shrd->valid_contexts == BIT(IWL_RXON_CTX_BSS))
313 		return 0;
314 
315 	BUILD_BUG_ON(NUM_IWL_RXON_CTX != 2);
316 
317 	lockdep_assert_held(&priv->mutex);
318 
319 	ctx_bss = &priv->contexts[IWL_RXON_CTX_BSS];
320 	ctx_pan = &priv->contexts[IWL_RXON_CTX_PAN];
321 
322 	/*
323 	 * If the PAN context is inactive, then we don't need
324 	 * to update the PAN parameters, the last thing we'll
325 	 * have done before it goes inactive is making the PAN
326 	 * parameters be WLAN-only.
327 	 */
328 	if (!ctx_pan->is_active)
329 		return 0;
330 
331 	memset(&cmd, 0, sizeof(cmd));
332 
333 	/* only 2 slots are currently allowed */
334 	cmd.num_slots = 2;
335 
336 	cmd.slots[0].type = 0; /* BSS */
337 	cmd.slots[1].type = 1; /* PAN */
338 
339 	if (priv->hw_roc_setup) {
340 		/* both contexts must be used for this to happen */
341 		slot1 = IWL_MIN_SLOT_TIME;
342 		slot0 = 3000;
343 	} else if (ctx_bss->vif && ctx_pan->vif) {
344 		int bcnint = ctx_pan->beacon_int;
345 		int dtim = ctx_pan->vif->bss_conf.dtim_period ?: 1;
346 
347 		/* should be set, but seems unused?? */
348 		cmd.flags |= cpu_to_le16(IWL_WIPAN_PARAMS_FLG_SLOTTED_MODE);
349 
350 		if (ctx_pan->vif->type == NL80211_IFTYPE_AP &&
351 		    bcnint &&
352 		    bcnint != ctx_bss->beacon_int) {
353 			IWL_ERR(priv,
354 				"beacon intervals don't match (%d, %d)\n",
355 				ctx_bss->beacon_int, ctx_pan->beacon_int);
356 		} else
357 			bcnint = max_t(int, bcnint,
358 				       ctx_bss->beacon_int);
359 		if (!bcnint)
360 			bcnint = DEFAULT_BEACON_INTERVAL;
361 		slot0 = bcnint / 2;
362 		slot1 = bcnint - slot0;
363 
364 		if (test_bit(STATUS_SCAN_HW, &priv->status) ||
365 		    (!ctx_bss->vif->bss_conf.idle &&
366 		     !ctx_bss->vif->bss_conf.assoc)) {
367 			slot0 = dtim * bcnint * 3 - IWL_MIN_SLOT_TIME;
368 			slot1 = IWL_MIN_SLOT_TIME;
369 		} else if (!ctx_pan->vif->bss_conf.idle &&
370 			   !ctx_pan->vif->bss_conf.assoc) {
371 			slot1 = dtim * bcnint * 3 - IWL_MIN_SLOT_TIME;
372 			slot0 = IWL_MIN_SLOT_TIME;
373 		}
374 	} else if (ctx_pan->vif) {
375 		slot0 = 0;
376 		slot1 = max_t(int, 1, ctx_pan->vif->bss_conf.dtim_period) *
377 					ctx_pan->beacon_int;
378 		slot1 = max_t(int, DEFAULT_BEACON_INTERVAL, slot1);
379 
380 		if (test_bit(STATUS_SCAN_HW, &priv->status)) {
381 			slot0 = slot1 * 3 - IWL_MIN_SLOT_TIME;
382 			slot1 = IWL_MIN_SLOT_TIME;
383 		}
384 	}
385 
386 	cmd.slots[0].width = cpu_to_le16(slot0);
387 	cmd.slots[1].width = cpu_to_le16(slot1);
388 
389 	ret = iwl_dvm_send_cmd_pdu(priv, REPLY_WIPAN_PARAMS, CMD_SYNC,
390 			sizeof(cmd), &cmd);
391 	if (ret)
392 		IWL_ERR(priv, "Error setting PAN parameters (%d)\n", ret);
393 
394 	return ret;
395 }
396 
397 /**
398  * iwlagn_commit_rxon - commit staging_rxon to hardware
399  *
400  * The RXON command in staging_rxon is committed to the hardware and
401  * the active_rxon structure is updated with the new data.  This
402  * function correctly transitions out of the RXON_ASSOC_MSK state if
403  * a HW tune is required based on the RXON structure changes.
404  *
405  * The connect/disconnect flow should be as the following:
406  *
407  * 1. make sure send RXON command with association bit unset if not connect
408  *	this should include the channel and the band for the candidate
409  *	to be connected to
410  * 2. Add Station before RXON association with the AP
411  * 3. RXON_timing has to send before RXON for connection
412  * 4. full RXON command - associated bit set
413  * 5. use RXON_ASSOC command to update any flags changes
414  */
iwlagn_commit_rxon(struct iwl_priv * priv,struct iwl_rxon_context * ctx)415 int iwlagn_commit_rxon(struct iwl_priv *priv, struct iwl_rxon_context *ctx)
416 {
417 	/* cast away the const for active_rxon in this function */
418 	struct iwl_rxon_cmd *active = (void *)&ctx->active;
419 	bool new_assoc = !!(ctx->staging.filter_flags & RXON_FILTER_ASSOC_MSK);
420 	int ret;
421 
422 	lockdep_assert_held(&priv->mutex);
423 
424 	if (!iwl_is_alive(priv))
425 		return -EBUSY;
426 
427 	/* This function hardcodes a bunch of dual-mode assumptions */
428 	BUILD_BUG_ON(NUM_IWL_RXON_CTX != 2);
429 
430 	if (!ctx->is_active)
431 		return 0;
432 
433 	/* always get timestamp with Rx frame */
434 	ctx->staging.flags |= RXON_FLG_TSF2HOST_MSK;
435 
436 	/*
437 	 * force CTS-to-self frames protection if RTS-CTS is not preferred
438 	 * one aggregation protection method
439 	 */
440 	if (!hw_params(priv).use_rts_for_aggregation)
441 		ctx->staging.flags |= RXON_FLG_SELF_CTS_EN;
442 
443 	if ((ctx->vif && ctx->vif->bss_conf.use_short_slot) ||
444 	    !(ctx->staging.flags & RXON_FLG_BAND_24G_MSK))
445 		ctx->staging.flags |= RXON_FLG_SHORT_SLOT_MSK;
446 	else
447 		ctx->staging.flags &= ~RXON_FLG_SHORT_SLOT_MSK;
448 
449 	iwl_print_rx_config_cmd(priv, ctx->ctxid);
450 	ret = iwl_check_rxon_cmd(priv, ctx);
451 	if (ret) {
452 		IWL_ERR(priv, "Invalid RXON configuration. Not committing.\n");
453 		return -EINVAL;
454 	}
455 
456 	/*
457 	 * receive commit_rxon request
458 	 * abort any previous channel switch if still in process
459 	 */
460 	if (test_bit(STATUS_CHANNEL_SWITCH_PENDING, &priv->status) &&
461 	    (priv->switch_channel != ctx->staging.channel)) {
462 		IWL_DEBUG_11H(priv, "abort channel switch on %d\n",
463 			      le16_to_cpu(priv->switch_channel));
464 		iwl_chswitch_done(priv, false);
465 	}
466 
467 	/*
468 	 * If we don't need to send a full RXON, we can use
469 	 * iwl_rxon_assoc_cmd which is used to reconfigure filter
470 	 * and other flags for the current radio configuration.
471 	 */
472 	if (!iwl_full_rxon_required(priv, ctx)) {
473 		ret = iwlagn_send_rxon_assoc(priv, ctx);
474 		if (ret) {
475 			IWL_ERR(priv, "Error setting RXON_ASSOC (%d)\n", ret);
476 			return ret;
477 		}
478 
479 		memcpy(active, &ctx->staging, sizeof(*active));
480 		/*
481 		 * We do not commit tx power settings while channel changing,
482 		 * do it now if after settings changed.
483 		 */
484 		iwl_set_tx_power(priv, priv->tx_power_next, false);
485 
486 		/* make sure we are in the right PS state */
487 		iwl_power_update_mode(priv, true);
488 
489 		return 0;
490 	}
491 
492 	iwl_set_rxon_hwcrypto(priv, ctx, !iwlagn_mod_params.sw_crypto);
493 
494 	IWL_DEBUG_INFO(priv,
495 		       "Going to commit RXON\n"
496 		       "  * with%s RXON_FILTER_ASSOC_MSK\n"
497 		       "  * channel = %d\n"
498 		       "  * bssid = %pM\n",
499 		       (new_assoc ? "" : "out"),
500 		       le16_to_cpu(ctx->staging.channel),
501 		       ctx->staging.bssid_addr);
502 
503 	/*
504 	 * Always clear associated first, but with the correct config.
505 	 * This is required as for example station addition for the
506 	 * AP station must be done after the BSSID is set to correctly
507 	 * set up filters in the device.
508 	 */
509 	ret = iwlagn_rxon_disconn(priv, ctx);
510 	if (ret)
511 		return ret;
512 
513 	ret = iwlagn_set_pan_params(priv);
514 	if (ret)
515 		return ret;
516 
517 	if (new_assoc)
518 		return iwlagn_rxon_connect(priv, ctx);
519 
520 	return 0;
521 }
522 
iwlagn_config_ht40(struct ieee80211_conf * conf,struct iwl_rxon_context * ctx)523 void iwlagn_config_ht40(struct ieee80211_conf *conf,
524 	struct iwl_rxon_context *ctx)
525 {
526 	if (conf_is_ht40_minus(conf)) {
527 		ctx->ht.extension_chan_offset =
528 			IEEE80211_HT_PARAM_CHA_SEC_BELOW;
529 		ctx->ht.is_40mhz = true;
530 	} else if (conf_is_ht40_plus(conf)) {
531 		ctx->ht.extension_chan_offset =
532 			IEEE80211_HT_PARAM_CHA_SEC_ABOVE;
533 		ctx->ht.is_40mhz = true;
534 	} else {
535 		ctx->ht.extension_chan_offset =
536 			IEEE80211_HT_PARAM_CHA_SEC_NONE;
537 		ctx->ht.is_40mhz = false;
538 	}
539 }
540 
iwlagn_mac_config(struct ieee80211_hw * hw,u32 changed)541 int iwlagn_mac_config(struct ieee80211_hw *hw, u32 changed)
542 {
543 	struct iwl_priv *priv = IWL_MAC80211_GET_DVM(hw);
544 	struct iwl_rxon_context *ctx;
545 	struct ieee80211_conf *conf = &hw->conf;
546 	struct ieee80211_channel *channel = conf->channel;
547 	const struct iwl_channel_info *ch_info;
548 	int ret = 0;
549 
550 	IWL_DEBUG_MAC80211(priv, "enter: changed %#x", changed);
551 
552 	mutex_lock(&priv->mutex);
553 
554 	if (unlikely(test_bit(STATUS_SCANNING, &priv->status))) {
555 		IWL_DEBUG_MAC80211(priv, "leave - scanning\n");
556 		goto out;
557 	}
558 
559 	if (!iwl_is_ready(priv)) {
560 		IWL_DEBUG_MAC80211(priv, "leave - not ready\n");
561 		goto out;
562 	}
563 
564 	if (changed & (IEEE80211_CONF_CHANGE_SMPS |
565 		       IEEE80211_CONF_CHANGE_CHANNEL)) {
566 		/* mac80211 uses static for non-HT which is what we want */
567 		priv->current_ht_config.smps = conf->smps_mode;
568 
569 		/*
570 		 * Recalculate chain counts.
571 		 *
572 		 * If monitor mode is enabled then mac80211 will
573 		 * set up the SM PS mode to OFF if an HT channel is
574 		 * configured.
575 		 */
576 		for_each_context(priv, ctx)
577 			iwlagn_set_rxon_chain(priv, ctx);
578 	}
579 
580 	if (changed & IEEE80211_CONF_CHANGE_CHANNEL) {
581 		ch_info = iwl_get_channel_info(priv, channel->band,
582 					       channel->hw_value);
583 		if (!is_channel_valid(ch_info)) {
584 			IWL_DEBUG_MAC80211(priv, "leave - invalid channel\n");
585 			ret = -EINVAL;
586 			goto out;
587 		}
588 
589 		for_each_context(priv, ctx) {
590 			/* Configure HT40 channels */
591 			if (ctx->ht.enabled != conf_is_ht(conf))
592 				ctx->ht.enabled = conf_is_ht(conf);
593 
594 			if (ctx->ht.enabled) {
595 				/* if HT40 is used, it should not change
596 				 * after associated except channel switch */
597 				if (!ctx->ht.is_40mhz ||
598 						!iwl_is_associated_ctx(ctx))
599 					iwlagn_config_ht40(conf, ctx);
600 			} else
601 				ctx->ht.is_40mhz = false;
602 
603 			/*
604 			 * Default to no protection. Protection mode will
605 			 * later be set from BSS config in iwl_ht_conf
606 			 */
607 			ctx->ht.protection = IEEE80211_HT_OP_MODE_PROTECTION_NONE;
608 
609 			/* if we are switching from ht to 2.4 clear flags
610 			 * from any ht related info since 2.4 does not
611 			 * support ht */
612 			if (le16_to_cpu(ctx->staging.channel) !=
613 			    channel->hw_value)
614 				ctx->staging.flags = 0;
615 
616 			iwl_set_rxon_channel(priv, channel, ctx);
617 			iwl_set_rxon_ht(priv, &priv->current_ht_config);
618 
619 			iwl_set_flags_for_band(priv, ctx, channel->band,
620 					       ctx->vif);
621 		}
622 
623 		iwl_update_bcast_stations(priv);
624 
625 		/*
626 		 * The list of supported rates and rate mask can be different
627 		 * for each band; since the band may have changed, reset
628 		 * the rate mask to what mac80211 lists.
629 		 */
630 		iwl_set_rate(priv);
631 	}
632 
633 	if (changed & (IEEE80211_CONF_CHANGE_PS |
634 			IEEE80211_CONF_CHANGE_IDLE)) {
635 		ret = iwl_power_update_mode(priv, false);
636 		if (ret)
637 			IWL_DEBUG_MAC80211(priv, "Error setting sleep level\n");
638 	}
639 
640 	if (changed & IEEE80211_CONF_CHANGE_POWER) {
641 		IWL_DEBUG_MAC80211(priv, "TX Power old=%d new=%d\n",
642 			priv->tx_power_user_lmt, conf->power_level);
643 
644 		iwl_set_tx_power(priv, conf->power_level, false);
645 	}
646 
647 	for_each_context(priv, ctx) {
648 		if (!memcmp(&ctx->staging, &ctx->active, sizeof(ctx->staging)))
649 			continue;
650 		iwlagn_commit_rxon(priv, ctx);
651 	}
652  out:
653 	mutex_unlock(&priv->mutex);
654 	IWL_DEBUG_MAC80211(priv, "leave\n");
655 
656 	return ret;
657 }
658 
iwlagn_check_needed_chains(struct iwl_priv * priv,struct iwl_rxon_context * ctx,struct ieee80211_bss_conf * bss_conf)659 static void iwlagn_check_needed_chains(struct iwl_priv *priv,
660 				       struct iwl_rxon_context *ctx,
661 				       struct ieee80211_bss_conf *bss_conf)
662 {
663 	struct ieee80211_vif *vif = ctx->vif;
664 	struct iwl_rxon_context *tmp;
665 	struct ieee80211_sta *sta;
666 	struct iwl_ht_config *ht_conf = &priv->current_ht_config;
667 	struct ieee80211_sta_ht_cap *ht_cap;
668 	bool need_multiple;
669 
670 	lockdep_assert_held(&priv->mutex);
671 
672 	switch (vif->type) {
673 	case NL80211_IFTYPE_STATION:
674 		rcu_read_lock();
675 		sta = ieee80211_find_sta(vif, bss_conf->bssid);
676 		if (!sta) {
677 			/*
678 			 * If at all, this can only happen through a race
679 			 * when the AP disconnects us while we're still
680 			 * setting up the connection, in that case mac80211
681 			 * will soon tell us about that.
682 			 */
683 			need_multiple = false;
684 			rcu_read_unlock();
685 			break;
686 		}
687 
688 		ht_cap = &sta->ht_cap;
689 
690 		need_multiple = true;
691 
692 		/*
693 		 * If the peer advertises no support for receiving 2 and 3
694 		 * stream MCS rates, it can't be transmitting them either.
695 		 */
696 		if (ht_cap->mcs.rx_mask[1] == 0 &&
697 		    ht_cap->mcs.rx_mask[2] == 0) {
698 			need_multiple = false;
699 		} else if (!(ht_cap->mcs.tx_params &
700 						IEEE80211_HT_MCS_TX_DEFINED)) {
701 			/* If it can't TX MCS at all ... */
702 			need_multiple = false;
703 		} else if (ht_cap->mcs.tx_params &
704 						IEEE80211_HT_MCS_TX_RX_DIFF) {
705 			int maxstreams;
706 
707 			/*
708 			 * But if it can receive them, it might still not
709 			 * be able to transmit them, which is what we need
710 			 * to check here -- so check the number of streams
711 			 * it advertises for TX (if different from RX).
712 			 */
713 
714 			maxstreams = (ht_cap->mcs.tx_params &
715 				 IEEE80211_HT_MCS_TX_MAX_STREAMS_MASK);
716 			maxstreams >>=
717 				IEEE80211_HT_MCS_TX_MAX_STREAMS_SHIFT;
718 			maxstreams += 1;
719 
720 			if (maxstreams <= 1)
721 				need_multiple = false;
722 		}
723 
724 		rcu_read_unlock();
725 		break;
726 	case NL80211_IFTYPE_ADHOC:
727 		/* currently */
728 		need_multiple = false;
729 		break;
730 	default:
731 		/* only AP really */
732 		need_multiple = true;
733 		break;
734 	}
735 
736 	ctx->ht_need_multiple_chains = need_multiple;
737 
738 	if (!need_multiple) {
739 		/* check all contexts */
740 		for_each_context(priv, tmp) {
741 			if (!tmp->vif)
742 				continue;
743 			if (tmp->ht_need_multiple_chains) {
744 				need_multiple = true;
745 				break;
746 			}
747 		}
748 	}
749 
750 	ht_conf->single_chain_sufficient = !need_multiple;
751 }
752 
iwlagn_chain_noise_reset(struct iwl_priv * priv)753 static void iwlagn_chain_noise_reset(struct iwl_priv *priv)
754 {
755 	struct iwl_chain_noise_data *data = &priv->chain_noise_data;
756 	int ret;
757 
758 	if ((data->state == IWL_CHAIN_NOISE_ALIVE) &&
759 	    iwl_is_any_associated(priv)) {
760 		struct iwl_calib_chain_noise_reset_cmd cmd;
761 
762 		/* clear data for chain noise calibration algorithm */
763 		data->chain_noise_a = 0;
764 		data->chain_noise_b = 0;
765 		data->chain_noise_c = 0;
766 		data->chain_signal_a = 0;
767 		data->chain_signal_b = 0;
768 		data->chain_signal_c = 0;
769 		data->beacon_count = 0;
770 
771 		memset(&cmd, 0, sizeof(cmd));
772 		iwl_set_calib_hdr(&cmd.hdr,
773 			priv->phy_calib_chain_noise_reset_cmd);
774 		ret = iwl_dvm_send_cmd_pdu(priv,
775 					REPLY_PHY_CALIBRATION_CMD,
776 					CMD_SYNC, sizeof(cmd), &cmd);
777 		if (ret)
778 			IWL_ERR(priv,
779 				"Could not send REPLY_PHY_CALIBRATION_CMD\n");
780 		data->state = IWL_CHAIN_NOISE_ACCUMULATE;
781 		IWL_DEBUG_CALIB(priv, "Run chain_noise_calibrate\n");
782 	}
783 }
784 
iwlagn_bss_info_changed(struct ieee80211_hw * hw,struct ieee80211_vif * vif,struct ieee80211_bss_conf * bss_conf,u32 changes)785 void iwlagn_bss_info_changed(struct ieee80211_hw *hw,
786 			     struct ieee80211_vif *vif,
787 			     struct ieee80211_bss_conf *bss_conf,
788 			     u32 changes)
789 {
790 	struct iwl_priv *priv = IWL_MAC80211_GET_DVM(hw);
791 	struct iwl_rxon_context *ctx = iwl_rxon_ctx_from_vif(vif);
792 	int ret;
793 	bool force = false;
794 
795 	mutex_lock(&priv->mutex);
796 
797 	if (unlikely(!iwl_is_ready(priv))) {
798 		IWL_DEBUG_MAC80211(priv, "leave - not ready\n");
799 		mutex_unlock(&priv->mutex);
800 		return;
801         }
802 
803 	if (unlikely(!ctx->vif)) {
804 		IWL_DEBUG_MAC80211(priv, "leave - vif is NULL\n");
805 		mutex_unlock(&priv->mutex);
806 		return;
807 	}
808 
809 	if (changes & BSS_CHANGED_BEACON_INT)
810 		force = true;
811 
812 	if (changes & BSS_CHANGED_QOS) {
813 		ctx->qos_data.qos_active = bss_conf->qos;
814 		iwlagn_update_qos(priv, ctx);
815 	}
816 
817 	ctx->staging.assoc_id = cpu_to_le16(vif->bss_conf.aid);
818 	if (vif->bss_conf.use_short_preamble)
819 		ctx->staging.flags |= RXON_FLG_SHORT_PREAMBLE_MSK;
820 	else
821 		ctx->staging.flags &= ~RXON_FLG_SHORT_PREAMBLE_MSK;
822 
823 	if (changes & BSS_CHANGED_ASSOC) {
824 		if (bss_conf->assoc) {
825 			priv->timestamp = bss_conf->last_tsf;
826 			ctx->staging.filter_flags |= RXON_FILTER_ASSOC_MSK;
827 		} else {
828 			/*
829 			 * If we disassociate while there are pending
830 			 * frames, just wake up the queues and let the
831 			 * frames "escape" ... This shouldn't really
832 			 * be happening to start with, but we should
833 			 * not get stuck in this case either since it
834 			 * can happen if userspace gets confused.
835 			 */
836 			iwlagn_lift_passive_no_rx(priv);
837 
838 			ctx->staging.filter_flags &= ~RXON_FILTER_ASSOC_MSK;
839 
840 			if (ctx->ctxid == IWL_RXON_CTX_BSS)
841 				priv->have_rekey_data = false;
842 		}
843 
844 		iwlagn_bt_coex_rssi_monitor(priv);
845 	}
846 
847 	if (ctx->ht.enabled) {
848 		ctx->ht.protection = bss_conf->ht_operation_mode &
849 					IEEE80211_HT_OP_MODE_PROTECTION;
850 		ctx->ht.non_gf_sta_present = !!(bss_conf->ht_operation_mode &
851 					IEEE80211_HT_OP_MODE_NON_GF_STA_PRSNT);
852 		iwlagn_check_needed_chains(priv, ctx, bss_conf);
853 		iwl_set_rxon_ht(priv, &priv->current_ht_config);
854 	}
855 
856 	iwlagn_set_rxon_chain(priv, ctx);
857 
858 	if (bss_conf->use_cts_prot && (priv->band != IEEE80211_BAND_5GHZ))
859 		ctx->staging.flags |= RXON_FLG_TGG_PROTECT_MSK;
860 	else
861 		ctx->staging.flags &= ~RXON_FLG_TGG_PROTECT_MSK;
862 
863 	if (bss_conf->use_cts_prot)
864 		ctx->staging.flags |= RXON_FLG_SELF_CTS_EN;
865 	else
866 		ctx->staging.flags &= ~RXON_FLG_SELF_CTS_EN;
867 
868 	memcpy(ctx->staging.bssid_addr, bss_conf->bssid, ETH_ALEN);
869 
870 	if (vif->type == NL80211_IFTYPE_AP ||
871 	    vif->type == NL80211_IFTYPE_ADHOC) {
872 		if (vif->bss_conf.enable_beacon) {
873 			ctx->staging.filter_flags |= RXON_FILTER_ASSOC_MSK;
874 			priv->beacon_ctx = ctx;
875 		} else {
876 			ctx->staging.filter_flags &= ~RXON_FILTER_ASSOC_MSK;
877 			priv->beacon_ctx = NULL;
878 		}
879 	}
880 
881 	/*
882 	 * If the ucode decides to do beacon filtering before
883 	 * association, it will lose beacons that are needed
884 	 * before sending frames out on passive channels. This
885 	 * causes association failures on those channels. Enable
886 	 * receiving beacons in such cases.
887 	 */
888 
889 	if (vif->type == NL80211_IFTYPE_STATION) {
890 		if (!bss_conf->assoc)
891 			ctx->staging.filter_flags |= RXON_FILTER_BCON_AWARE_MSK;
892 		else
893 			ctx->staging.filter_flags &=
894 						    ~RXON_FILTER_BCON_AWARE_MSK;
895 	}
896 
897 	if (force || memcmp(&ctx->staging, &ctx->active, sizeof(ctx->staging)))
898 		iwlagn_commit_rxon(priv, ctx);
899 
900 	if (changes & BSS_CHANGED_ASSOC && bss_conf->assoc) {
901 		/*
902 		 * The chain noise calibration will enable PM upon
903 		 * completion. If calibration has already been run
904 		 * then we need to enable power management here.
905 		 */
906 		if (priv->chain_noise_data.state == IWL_CHAIN_NOISE_DONE)
907 			iwl_power_update_mode(priv, false);
908 
909 		/* Enable RX differential gain and sensitivity calibrations */
910 		if (!priv->disable_chain_noise_cal)
911 			iwlagn_chain_noise_reset(priv);
912 		priv->start_calib = 1;
913 	}
914 
915 	if (changes & BSS_CHANGED_IBSS) {
916 		ret = iwlagn_manage_ibss_station(priv, vif,
917 						 bss_conf->ibss_joined);
918 		if (ret)
919 			IWL_ERR(priv, "failed to %s IBSS station %pM\n",
920 				bss_conf->ibss_joined ? "add" : "remove",
921 				bss_conf->bssid);
922 	}
923 
924 	if (changes & BSS_CHANGED_BEACON && vif->type == NL80211_IFTYPE_ADHOC &&
925 	    priv->beacon_ctx) {
926 		if (iwlagn_update_beacon(priv, vif))
927 			IWL_ERR(priv, "Error sending IBSS beacon\n");
928 	}
929 
930 	mutex_unlock(&priv->mutex);
931 }
932 
iwlagn_post_scan(struct iwl_priv * priv)933 void iwlagn_post_scan(struct iwl_priv *priv)
934 {
935 	struct iwl_rxon_context *ctx;
936 
937 	/*
938 	 * We do not commit power settings while scan is pending,
939 	 * do it now if the settings changed.
940 	 */
941 	iwl_power_set_mode(priv, &priv->power_data.sleep_cmd_next, false);
942 	iwl_set_tx_power(priv, priv->tx_power_next, false);
943 
944 	/*
945 	 * Since setting the RXON may have been deferred while
946 	 * performing the scan, fire one off if needed
947 	 */
948 	for_each_context(priv, ctx)
949 		if (memcmp(&ctx->staging, &ctx->active, sizeof(ctx->staging)))
950 			iwlagn_commit_rxon(priv, ctx);
951 
952 	iwlagn_set_pan_params(priv);
953 }
954