1 // SPDX-License-Identifier: GPL-2.0-only
2 /******************************************************************************
4 * Copyright(c) 2008 - 2014, 2022 Intel Corporation. All rights reserved.
5 *****************************************************************************/
6 #include <linux/etherdevice.h>
7 #include <linux/kernel.h>
8 #include <linux/module.h>
9 #include <linux/sched.h>
10 #include <net/mac80211.h>
13 #include "iwl-agn-hw.h"
14 #include "iwl-trans.h"
15 #include "iwl-modparams.h"
20 int iwlagn_hw_valid_rtc_data_addr(u32 addr
)
22 return (addr
>= IWLAGN_RTC_DATA_LOWER_BOUND
) &&
23 (addr
< IWLAGN_RTC_DATA_UPPER_BOUND
);
26 int iwlagn_send_tx_power(struct iwl_priv
*priv
)
28 struct iwlagn_tx_power_dbm_cmd tx_power_cmd
;
31 if (WARN_ONCE(test_bit(STATUS_SCAN_HW
, &priv
->status
),
32 "TX Power requested while scanning!\n"))
35 /* half dBm need to multiply */
36 tx_power_cmd
.global_lmt
= (s8
)(2 * priv
->tx_power_user_lmt
);
38 if (tx_power_cmd
.global_lmt
> priv
->nvm_data
->max_tx_pwr_half_dbm
) {
40 * For the newer devices which using enhanced/extend tx power
41 * table in EEPROM, the format is in half dBm. driver need to
42 * convert to dBm format before report to mac80211.
43 * By doing so, there is a possibility of 1/2 dBm resolution
44 * lost. driver will perform "round-up" operation before
45 * reporting, but it will cause 1/2 dBm tx power over the
46 * regulatory limit. Perform the checking here, if the
47 * "tx_power_user_lmt" is higher than EEPROM value (in
48 * half-dBm format), lower the tx power based on EEPROM
50 tx_power_cmd
.global_lmt
=
51 priv
->nvm_data
->max_tx_pwr_half_dbm
;
53 tx_power_cmd
.flags
= IWLAGN_TX_POWER_NO_CLOSED
;
54 tx_power_cmd
.srv_chan_lmt
= IWLAGN_TX_POWER_AUTO
;
56 if (IWL_UCODE_API(priv
->fw
->ucode_ver
) == 1)
57 tx_ant_cfg_cmd
= REPLY_TX_POWER_DBM_CMD_V1
;
59 tx_ant_cfg_cmd
= REPLY_TX_POWER_DBM_CMD
;
61 return iwl_dvm_send_cmd_pdu(priv
, tx_ant_cfg_cmd
, 0,
62 sizeof(tx_power_cmd
), &tx_power_cmd
);
65 void iwlagn_temperature(struct iwl_priv
*priv
)
67 lockdep_assert_held(&priv
->statistics
.lock
);
69 /* store temperature from correct statistics (in Celsius) */
70 priv
->temperature
= le32_to_cpu(priv
->statistics
.common
.temperature
);
74 int iwlagn_hwrate_to_mac80211_idx(u32 rate_n_flags
, enum nl80211_band band
)
79 /* HT rate format: mac80211 wants an MCS number, which is just LSB */
80 if (rate_n_flags
& RATE_MCS_HT_MSK
) {
81 idx
= (rate_n_flags
& 0xff);
83 /* Legacy rate format, search for match in table */
85 if (band
== NL80211_BAND_5GHZ
)
86 band_offset
= IWL_FIRST_OFDM_RATE
;
87 for (idx
= band_offset
; idx
< IWL_RATE_COUNT_LEGACY
; idx
++)
88 if (iwl_rates
[idx
].plcp
== (rate_n_flags
& 0xFF))
89 return idx
- band_offset
;
95 int iwlagn_manage_ibss_station(struct iwl_priv
*priv
,
96 struct ieee80211_vif
*vif
, bool add
)
98 struct iwl_vif_priv
*vif_priv
= (void *)vif
->drv_priv
;
101 return iwlagn_add_bssid_station(priv
, vif_priv
->ctx
,
103 &vif_priv
->ibss_bssid_sta_id
);
104 return iwl_remove_station(priv
, vif_priv
->ibss_bssid_sta_id
,
105 vif
->bss_conf
.bssid
);
109 * iwlagn_txfifo_flush: send REPLY_TXFIFO_FLUSH command to uCode
112 * 1. acquire mutex before calling
113 * 2. make sure rf is on and not in exit state
115 int iwlagn_txfifo_flush(struct iwl_priv
*priv
, u32 scd_q_msk
)
117 struct iwl_txfifo_flush_cmd_v3 flush_cmd_v3
= {
118 .flush_control
= cpu_to_le16(IWL_DROP_ALL
),
120 struct iwl_txfifo_flush_cmd_v2 flush_cmd_v2
= {
121 .flush_control
= cpu_to_le16(IWL_DROP_ALL
),
124 u32 queue_control
= IWL_SCD_VO_MSK
| IWL_SCD_VI_MSK
|
125 IWL_SCD_BE_MSK
| IWL_SCD_BK_MSK
| IWL_SCD_MGMT_MSK
;
127 if ((priv
->valid_contexts
!= BIT(IWL_RXON_CTX_BSS
)))
128 queue_control
|= IWL_PAN_SCD_VO_MSK
| IWL_PAN_SCD_VI_MSK
|
129 IWL_PAN_SCD_BE_MSK
| IWL_PAN_SCD_BK_MSK
|
130 IWL_PAN_SCD_MGMT_MSK
|
131 IWL_PAN_SCD_MULTICAST_MSK
;
133 if (priv
->nvm_data
->sku_cap_11n_enable
)
134 queue_control
|= IWL_AGG_TX_QUEUE_MSK
;
137 queue_control
= scd_q_msk
;
139 IWL_DEBUG_INFO(priv
, "queue control: 0x%x\n", queue_control
);
140 flush_cmd_v3
.queue_control
= cpu_to_le32(queue_control
);
141 flush_cmd_v2
.queue_control
= cpu_to_le16((u16
)queue_control
);
143 if (IWL_UCODE_API(priv
->fw
->ucode_ver
) > 2)
144 return iwl_dvm_send_cmd_pdu(priv
, REPLY_TXFIFO_FLUSH
, 0,
145 sizeof(flush_cmd_v3
),
147 return iwl_dvm_send_cmd_pdu(priv
, REPLY_TXFIFO_FLUSH
, 0,
148 sizeof(flush_cmd_v2
), &flush_cmd_v2
);
151 void iwlagn_dev_txfifo_flush(struct iwl_priv
*priv
)
153 mutex_lock(&priv
->mutex
);
154 ieee80211_stop_queues(priv
->hw
);
155 if (iwlagn_txfifo_flush(priv
, 0)) {
156 IWL_ERR(priv
, "flush request fail\n");
159 IWL_DEBUG_INFO(priv
, "wait transmit/flush all frames\n");
160 iwl_trans_wait_tx_queues_empty(priv
->trans
, 0xffffffff);
162 ieee80211_wake_queues(priv
->hw
);
163 mutex_unlock(&priv
->mutex
);
170 static const __le32 iwlagn_def_3w_lookup
[IWLAGN_BT_DECISION_LUT_SIZE
] = {
171 cpu_to_le32(0xaaaaaaaa),
172 cpu_to_le32(0xaaaaaaaa),
173 cpu_to_le32(0xaeaaaaaa),
174 cpu_to_le32(0xaaaaaaaa),
175 cpu_to_le32(0xcc00ff28),
176 cpu_to_le32(0x0000aaaa),
177 cpu_to_le32(0xcc00aaaa),
178 cpu_to_le32(0x0000aaaa),
179 cpu_to_le32(0xc0004000),
180 cpu_to_le32(0x00004000),
181 cpu_to_le32(0xf0005000),
182 cpu_to_le32(0xf0005000),
185 /* Full concurrency */
186 static const __le32 iwlagn_concurrent_lookup
[IWLAGN_BT_DECISION_LUT_SIZE
] = {
187 cpu_to_le32(0xaaaaaaaa),
188 cpu_to_le32(0xaaaaaaaa),
189 cpu_to_le32(0xaaaaaaaa),
190 cpu_to_le32(0xaaaaaaaa),
191 cpu_to_le32(0xaaaaaaaa),
192 cpu_to_le32(0xaaaaaaaa),
193 cpu_to_le32(0xaaaaaaaa),
194 cpu_to_le32(0xaaaaaaaa),
195 cpu_to_le32(0x00000000),
196 cpu_to_le32(0x00000000),
197 cpu_to_le32(0x00000000),
198 cpu_to_le32(0x00000000),
201 void iwlagn_send_advance_bt_config(struct iwl_priv
*priv
)
203 struct iwl_basic_bt_cmd basic
= {
204 .max_kill
= IWLAGN_BT_MAX_KILL_DEFAULT
,
205 .bt3_timer_t7_value
= IWLAGN_BT3_T7_DEFAULT
,
206 .bt3_prio_sample_time
= IWLAGN_BT3_PRIO_SAMPLE_DEFAULT
,
207 .bt3_timer_t2_value
= IWLAGN_BT3_T2_DEFAULT
,
209 struct iwl_bt_cmd_v1 bt_cmd_v1
;
210 struct iwl_bt_cmd_v2 bt_cmd_v2
;
213 BUILD_BUG_ON(sizeof(iwlagn_def_3w_lookup
) !=
214 sizeof(basic
.bt3_lookup_table
));
216 if (priv
->lib
->bt_params
) {
218 * newer generation of devices (2000 series and newer)
219 * use the version 2 of the bt command
220 * we need to make sure sending the host command
221 * with correct data structure to avoid uCode assert
223 if (priv
->lib
->bt_params
->bt_session_2
) {
224 bt_cmd_v2
.prio_boost
= cpu_to_le32(
225 priv
->lib
->bt_params
->bt_prio_boost
);
226 bt_cmd_v2
.tx_prio_boost
= 0;
227 bt_cmd_v2
.rx_prio_boost
= 0;
229 /* older version only has 8 bits */
230 WARN_ON(priv
->lib
->bt_params
->bt_prio_boost
& ~0xFF);
231 bt_cmd_v1
.prio_boost
=
232 priv
->lib
->bt_params
->bt_prio_boost
;
233 bt_cmd_v1
.tx_prio_boost
= 0;
234 bt_cmd_v1
.rx_prio_boost
= 0;
237 IWL_ERR(priv
, "failed to construct BT Coex Config\n");
242 * Possible situations when BT needs to take over for receive,
243 * at the same time where STA needs to response to AP's frame(s),
244 * reduce the tx power of the required response frames, by that,
245 * allow the concurrent BT receive & WiFi transmit
246 * (BT - ANT A, WiFi -ANT B), without interference to one another
248 * Reduced tx power apply to control frames only (ACK/Back/CTS)
249 * when indicated by the BT config command
251 basic
.kill_ack_mask
= priv
->kill_ack_mask
;
252 basic
.kill_cts_mask
= priv
->kill_cts_mask
;
253 if (priv
->reduced_txpower
)
254 basic
.reduce_txpower
= IWLAGN_BT_REDUCED_TX_PWR
;
255 basic
.valid
= priv
->bt_valid
;
258 * Configure BT coex mode to "no coexistence" when the
259 * user disabled BT coexistence, we have no interface
260 * (might be in monitor mode), or the interface is in
261 * IBSS mode (no proper uCode support for coex then).
263 if (!iwlwifi_mod_params
.bt_coex_active
||
264 priv
->iw_mode
== NL80211_IFTYPE_ADHOC
) {
265 basic
.flags
= IWLAGN_BT_FLAG_COEX_MODE_DISABLED
;
267 basic
.flags
= IWLAGN_BT_FLAG_COEX_MODE_3W
<<
268 IWLAGN_BT_FLAG_COEX_MODE_SHIFT
;
270 if (!priv
->bt_enable_pspoll
)
271 basic
.flags
|= IWLAGN_BT_FLAG_SYNC_2_BT_DISABLE
;
273 basic
.flags
&= ~IWLAGN_BT_FLAG_SYNC_2_BT_DISABLE
;
275 if (priv
->bt_ch_announce
)
276 basic
.flags
|= IWLAGN_BT_FLAG_CHANNEL_INHIBITION
;
277 IWL_DEBUG_COEX(priv
, "BT coex flag: 0X%x\n", basic
.flags
);
279 priv
->bt_enable_flag
= basic
.flags
;
280 if (priv
->bt_full_concurrent
)
281 memcpy(basic
.bt3_lookup_table
, iwlagn_concurrent_lookup
,
282 sizeof(iwlagn_concurrent_lookup
));
284 memcpy(basic
.bt3_lookup_table
, iwlagn_def_3w_lookup
,
285 sizeof(iwlagn_def_3w_lookup
));
287 IWL_DEBUG_COEX(priv
, "BT coex %s in %s mode\n",
288 basic
.flags
? "active" : "disabled",
289 priv
->bt_full_concurrent
?
290 "full concurrency" : "3-wire");
292 if (priv
->lib
->bt_params
->bt_session_2
) {
293 memcpy(&bt_cmd_v2
.basic
, &basic
,
295 ret
= iwl_dvm_send_cmd_pdu(priv
, REPLY_BT_CONFIG
,
296 0, sizeof(bt_cmd_v2
), &bt_cmd_v2
);
298 memcpy(&bt_cmd_v1
.basic
, &basic
,
300 ret
= iwl_dvm_send_cmd_pdu(priv
, REPLY_BT_CONFIG
,
301 0, sizeof(bt_cmd_v1
), &bt_cmd_v1
);
304 IWL_ERR(priv
, "failed to send BT Coex Config\n");
308 void iwlagn_bt_adjust_rssi_monitor(struct iwl_priv
*priv
, bool rssi_ena
)
310 struct iwl_rxon_context
*ctx
, *found_ctx
= NULL
;
311 bool found_ap
= false;
313 lockdep_assert_held(&priv
->mutex
);
315 /* Check whether AP or GO mode is active. */
317 for_each_context(priv
, ctx
) {
318 if (ctx
->vif
&& ctx
->vif
->type
== NL80211_IFTYPE_AP
&&
319 iwl_is_associated_ctx(ctx
)) {
327 * If disable was received or If GO/AP mode, disable RSSI
330 if (!rssi_ena
|| found_ap
) {
331 if (priv
->cur_rssi_ctx
) {
332 ctx
= priv
->cur_rssi_ctx
;
333 ieee80211_disable_rssi_reports(ctx
->vif
);
334 priv
->cur_rssi_ctx
= NULL
;
340 * If rssi measurements need to be enabled, consider all cases now.
341 * Figure out how many contexts are active.
343 for_each_context(priv
, ctx
) {
344 if (ctx
->vif
&& ctx
->vif
->type
== NL80211_IFTYPE_STATION
&&
345 iwl_is_associated_ctx(ctx
)) {
352 * rssi monitor already enabled for the correct interface...nothing
355 if (found_ctx
== priv
->cur_rssi_ctx
)
359 * Figure out if rssi monitor is currently enabled, and needs
360 * to be changed. If rssi monitor is already enabled, disable
361 * it first else just enable rssi measurements on the
362 * interface found above.
364 if (priv
->cur_rssi_ctx
) {
365 ctx
= priv
->cur_rssi_ctx
;
367 ieee80211_disable_rssi_reports(ctx
->vif
);
370 priv
->cur_rssi_ctx
= found_ctx
;
375 ieee80211_enable_rssi_reports(found_ctx
->vif
,
376 IWLAGN_BT_PSP_MIN_RSSI_THRESHOLD
,
377 IWLAGN_BT_PSP_MAX_RSSI_THRESHOLD
);
380 static bool iwlagn_bt_traffic_is_sco(struct iwl_bt_uart_msg
*uart_msg
)
382 return (BT_UART_MSG_FRAME3SCOESCO_MSK
& uart_msg
->frame3
) >>
383 BT_UART_MSG_FRAME3SCOESCO_POS
;
386 static void iwlagn_bt_traffic_change_work(struct work_struct
*work
)
388 struct iwl_priv
*priv
=
389 container_of(work
, struct iwl_priv
, bt_traffic_change_work
);
390 struct iwl_rxon_context
*ctx
;
391 int smps_request
= -1;
393 if (priv
->bt_enable_flag
== IWLAGN_BT_FLAG_COEX_MODE_DISABLED
) {
394 /* bt coex disabled */
399 * Note: bt_traffic_load can be overridden by scan complete and
400 * coex profile notifications. Ignore that since only bad consequence
401 * can be not matching debug print with actual state.
403 IWL_DEBUG_COEX(priv
, "BT traffic load changes: %d\n",
404 priv
->bt_traffic_load
);
406 switch (priv
->bt_traffic_load
) {
407 case IWL_BT_COEX_TRAFFIC_LOAD_NONE
:
409 smps_request
= IEEE80211_SMPS_DYNAMIC
;
411 smps_request
= IEEE80211_SMPS_AUTOMATIC
;
413 case IWL_BT_COEX_TRAFFIC_LOAD_LOW
:
414 smps_request
= IEEE80211_SMPS_DYNAMIC
;
416 case IWL_BT_COEX_TRAFFIC_LOAD_HIGH
:
417 case IWL_BT_COEX_TRAFFIC_LOAD_CONTINUOUS
:
418 smps_request
= IEEE80211_SMPS_STATIC
;
421 IWL_ERR(priv
, "Invalid BT traffic load: %d\n",
422 priv
->bt_traffic_load
);
426 mutex_lock(&priv
->mutex
);
429 * We can not send command to firmware while scanning. When the scan
430 * complete we will schedule this work again. We do check with mutex
431 * locked to prevent new scan request to arrive. We do not check
432 * STATUS_SCANNING to avoid race when queue_work two times from
433 * different notifications, but quit and not perform any work at all.
435 if (test_bit(STATUS_SCAN_HW
, &priv
->status
))
438 iwl_update_chain_flags(priv
);
440 if (smps_request
!= -1) {
441 priv
->current_ht_config
.smps
= smps_request
;
442 for_each_context(priv
, ctx
) {
443 if (ctx
->vif
&& ctx
->vif
->type
== NL80211_IFTYPE_STATION
)
444 ieee80211_request_smps(ctx
->vif
, 0, smps_request
);
449 * Dynamic PS poll related functionality. Adjust RSSI measurements if
452 iwlagn_bt_coex_rssi_monitor(priv
);
454 mutex_unlock(&priv
->mutex
);
458 * If BT sco traffic, and RSSI monitor is enabled, move measurements to the
459 * correct interface or disable it if this is the last interface to be
462 void iwlagn_bt_coex_rssi_monitor(struct iwl_priv
*priv
)
464 if (priv
->bt_is_sco
&&
465 priv
->bt_traffic_load
== IWL_BT_COEX_TRAFFIC_LOAD_CONTINUOUS
)
466 iwlagn_bt_adjust_rssi_monitor(priv
, true);
468 iwlagn_bt_adjust_rssi_monitor(priv
, false);
471 static void iwlagn_print_uartmsg(struct iwl_priv
*priv
,
472 struct iwl_bt_uart_msg
*uart_msg
)
474 IWL_DEBUG_COEX(priv
, "Message Type = 0x%X, SSN = 0x%X, "
475 "Update Req = 0x%X\n",
476 (BT_UART_MSG_FRAME1MSGTYPE_MSK
& uart_msg
->frame1
) >>
477 BT_UART_MSG_FRAME1MSGTYPE_POS
,
478 (BT_UART_MSG_FRAME1SSN_MSK
& uart_msg
->frame1
) >>
479 BT_UART_MSG_FRAME1SSN_POS
,
480 (BT_UART_MSG_FRAME1UPDATEREQ_MSK
& uart_msg
->frame1
) >>
481 BT_UART_MSG_FRAME1UPDATEREQ_POS
);
483 IWL_DEBUG_COEX(priv
, "Open connections = 0x%X, Traffic load = 0x%X, "
484 "Chl_SeqN = 0x%X, In band = 0x%X\n",
485 (BT_UART_MSG_FRAME2OPENCONNECTIONS_MSK
& uart_msg
->frame2
) >>
486 BT_UART_MSG_FRAME2OPENCONNECTIONS_POS
,
487 (BT_UART_MSG_FRAME2TRAFFICLOAD_MSK
& uart_msg
->frame2
) >>
488 BT_UART_MSG_FRAME2TRAFFICLOAD_POS
,
489 (BT_UART_MSG_FRAME2CHLSEQN_MSK
& uart_msg
->frame2
) >>
490 BT_UART_MSG_FRAME2CHLSEQN_POS
,
491 (BT_UART_MSG_FRAME2INBAND_MSK
& uart_msg
->frame2
) >>
492 BT_UART_MSG_FRAME2INBAND_POS
);
494 IWL_DEBUG_COEX(priv
, "SCO/eSCO = 0x%X, Sniff = 0x%X, A2DP = 0x%X, "
495 "ACL = 0x%X, Master = 0x%X, OBEX = 0x%X\n",
496 (BT_UART_MSG_FRAME3SCOESCO_MSK
& uart_msg
->frame3
) >>
497 BT_UART_MSG_FRAME3SCOESCO_POS
,
498 (BT_UART_MSG_FRAME3SNIFF_MSK
& uart_msg
->frame3
) >>
499 BT_UART_MSG_FRAME3SNIFF_POS
,
500 (BT_UART_MSG_FRAME3A2DP_MSK
& uart_msg
->frame3
) >>
501 BT_UART_MSG_FRAME3A2DP_POS
,
502 (BT_UART_MSG_FRAME3ACL_MSK
& uart_msg
->frame3
) >>
503 BT_UART_MSG_FRAME3ACL_POS
,
504 (BT_UART_MSG_FRAME3MASTER_MSK
& uart_msg
->frame3
) >>
505 BT_UART_MSG_FRAME3MASTER_POS
,
506 (BT_UART_MSG_FRAME3OBEX_MSK
& uart_msg
->frame3
) >>
507 BT_UART_MSG_FRAME3OBEX_POS
);
509 IWL_DEBUG_COEX(priv
, "Idle duration = 0x%X\n",
510 (BT_UART_MSG_FRAME4IDLEDURATION_MSK
& uart_msg
->frame4
) >>
511 BT_UART_MSG_FRAME4IDLEDURATION_POS
);
513 IWL_DEBUG_COEX(priv
, "Tx Activity = 0x%X, Rx Activity = 0x%X, "
514 "eSCO Retransmissions = 0x%X\n",
515 (BT_UART_MSG_FRAME5TXACTIVITY_MSK
& uart_msg
->frame5
) >>
516 BT_UART_MSG_FRAME5TXACTIVITY_POS
,
517 (BT_UART_MSG_FRAME5RXACTIVITY_MSK
& uart_msg
->frame5
) >>
518 BT_UART_MSG_FRAME5RXACTIVITY_POS
,
519 (BT_UART_MSG_FRAME5ESCORETRANSMIT_MSK
& uart_msg
->frame5
) >>
520 BT_UART_MSG_FRAME5ESCORETRANSMIT_POS
);
522 IWL_DEBUG_COEX(priv
, "Sniff Interval = 0x%X, Discoverable = 0x%X\n",
523 (BT_UART_MSG_FRAME6SNIFFINTERVAL_MSK
& uart_msg
->frame6
) >>
524 BT_UART_MSG_FRAME6SNIFFINTERVAL_POS
,
525 (BT_UART_MSG_FRAME6DISCOVERABLE_MSK
& uart_msg
->frame6
) >>
526 BT_UART_MSG_FRAME6DISCOVERABLE_POS
);
528 IWL_DEBUG_COEX(priv
, "Sniff Activity = 0x%X, Page = "
529 "0x%X, Inquiry = 0x%X, Connectable = 0x%X\n",
530 (BT_UART_MSG_FRAME7SNIFFACTIVITY_MSK
& uart_msg
->frame7
) >>
531 BT_UART_MSG_FRAME7SNIFFACTIVITY_POS
,
532 (BT_UART_MSG_FRAME7PAGE_MSK
& uart_msg
->frame7
) >>
533 BT_UART_MSG_FRAME7PAGE_POS
,
534 (BT_UART_MSG_FRAME7INQUIRY_MSK
& uart_msg
->frame7
) >>
535 BT_UART_MSG_FRAME7INQUIRY_POS
,
536 (BT_UART_MSG_FRAME7CONNECTABLE_MSK
& uart_msg
->frame7
) >>
537 BT_UART_MSG_FRAME7CONNECTABLE_POS
);
540 static bool iwlagn_set_kill_msk(struct iwl_priv
*priv
,
541 struct iwl_bt_uart_msg
*uart_msg
)
543 bool need_update
= false;
544 u8 kill_msk
= IWL_BT_KILL_REDUCE
;
545 static const __le32 bt_kill_ack_msg
[3] = {
546 IWLAGN_BT_KILL_ACK_MASK_DEFAULT
,
547 IWLAGN_BT_KILL_ACK_CTS_MASK_SCO
,
548 IWLAGN_BT_KILL_ACK_CTS_MASK_REDUCE
};
549 static const __le32 bt_kill_cts_msg
[3] = {
550 IWLAGN_BT_KILL_CTS_MASK_DEFAULT
,
551 IWLAGN_BT_KILL_ACK_CTS_MASK_SCO
,
552 IWLAGN_BT_KILL_ACK_CTS_MASK_REDUCE
};
554 if (!priv
->reduced_txpower
)
555 kill_msk
= (BT_UART_MSG_FRAME3SCOESCO_MSK
& uart_msg
->frame3
)
556 ? IWL_BT_KILL_OVERRIDE
: IWL_BT_KILL_DEFAULT
;
557 if (priv
->kill_ack_mask
!= bt_kill_ack_msg
[kill_msk
] ||
558 priv
->kill_cts_mask
!= bt_kill_cts_msg
[kill_msk
]) {
559 priv
->bt_valid
|= IWLAGN_BT_VALID_KILL_ACK_MASK
;
560 priv
->kill_ack_mask
= bt_kill_ack_msg
[kill_msk
];
561 priv
->bt_valid
|= IWLAGN_BT_VALID_KILL_CTS_MASK
;
562 priv
->kill_cts_mask
= bt_kill_cts_msg
[kill_msk
];
569 * Upon RSSI changes, sends a bt config command with following changes
570 * 1. enable/disable "reduced control frames tx power
571 * 2. update the "kill)ack_mask" and "kill_cts_mask"
573 * If "reduced tx power" is enabled, uCode shall
574 * 1. ACK/Back/CTS rate shall reduced to 6Mbps
575 * 2. not use duplciate 20/40MHz mode
577 static bool iwlagn_fill_txpower_mode(struct iwl_priv
*priv
,
578 struct iwl_bt_uart_msg
*uart_msg
)
580 bool need_update
= false;
581 struct iwl_rxon_context
*ctx
= &priv
->contexts
[IWL_RXON_CTX_BSS
];
584 if (!ctx
->vif
|| (ctx
->vif
->type
!= NL80211_IFTYPE_STATION
)) {
585 IWL_DEBUG_INFO(priv
, "BSS ctx not active or not in sta mode\n");
589 ave_rssi
= ieee80211_ave_rssi(ctx
->vif
);
591 /* no rssi data, no changes to reduce tx power */
592 IWL_DEBUG_COEX(priv
, "no rssi data available\n");
595 if (!priv
->reduced_txpower
&&
596 !iwl_is_associated(priv
, IWL_RXON_CTX_PAN
) &&
597 (ave_rssi
> BT_ENABLE_REDUCED_TXPOWER_THRESHOLD
) &&
598 (uart_msg
->frame3
& (BT_UART_MSG_FRAME3ACL_MSK
|
599 BT_UART_MSG_FRAME3OBEX_MSK
)) &&
600 !(uart_msg
->frame3
& (BT_UART_MSG_FRAME3SCOESCO_MSK
|
601 BT_UART_MSG_FRAME3SNIFF_MSK
| BT_UART_MSG_FRAME3A2DP_MSK
))) {
602 /* enabling reduced tx power */
603 priv
->reduced_txpower
= true;
604 priv
->bt_valid
|= IWLAGN_BT_VALID_REDUCED_TX_PWR
;
606 } else if (priv
->reduced_txpower
&&
607 (iwl_is_associated(priv
, IWL_RXON_CTX_PAN
) ||
608 (ave_rssi
< BT_DISABLE_REDUCED_TXPOWER_THRESHOLD
) ||
609 (uart_msg
->frame3
& (BT_UART_MSG_FRAME3SCOESCO_MSK
|
610 BT_UART_MSG_FRAME3SNIFF_MSK
| BT_UART_MSG_FRAME3A2DP_MSK
)) ||
611 !(uart_msg
->frame3
& (BT_UART_MSG_FRAME3ACL_MSK
|
612 BT_UART_MSG_FRAME3OBEX_MSK
)))) {
613 /* disable reduced tx power */
614 priv
->reduced_txpower
= false;
615 priv
->bt_valid
|= IWLAGN_BT_VALID_REDUCED_TX_PWR
;
622 static void iwlagn_bt_coex_profile_notif(struct iwl_priv
*priv
,
623 struct iwl_rx_cmd_buffer
*rxb
)
625 struct iwl_rx_packet
*pkt
= rxb_addr(rxb
);
626 struct iwl_bt_coex_profile_notif
*coex
= (void *)pkt
->data
;
627 struct iwl_bt_uart_msg
*uart_msg
= &coex
->last_bt_uart_msg
;
629 if (priv
->bt_enable_flag
== IWLAGN_BT_FLAG_COEX_MODE_DISABLED
) {
630 /* bt coex disabled */
634 IWL_DEBUG_COEX(priv
, "BT Coex notification:\n");
635 IWL_DEBUG_COEX(priv
, " status: %d\n", coex
->bt_status
);
636 IWL_DEBUG_COEX(priv
, " traffic load: %d\n", coex
->bt_traffic_load
);
637 IWL_DEBUG_COEX(priv
, " CI compliance: %d\n",
638 coex
->bt_ci_compliance
);
639 iwlagn_print_uartmsg(priv
, uart_msg
);
641 priv
->last_bt_traffic_load
= priv
->bt_traffic_load
;
642 priv
->bt_is_sco
= iwlagn_bt_traffic_is_sco(uart_msg
);
644 if (priv
->iw_mode
!= NL80211_IFTYPE_ADHOC
) {
645 if (priv
->bt_status
!= coex
->bt_status
||
646 priv
->last_bt_traffic_load
!= coex
->bt_traffic_load
) {
647 if (coex
->bt_status
) {
649 if (!priv
->bt_ch_announce
)
650 priv
->bt_traffic_load
=
651 IWL_BT_COEX_TRAFFIC_LOAD_HIGH
;
653 priv
->bt_traffic_load
=
654 coex
->bt_traffic_load
;
657 priv
->bt_traffic_load
=
658 IWL_BT_COEX_TRAFFIC_LOAD_NONE
;
660 priv
->bt_status
= coex
->bt_status
;
661 queue_work(priv
->workqueue
,
662 &priv
->bt_traffic_change_work
);
666 /* schedule to send runtime bt_config */
667 /* check reduce power before change ack/cts kill mask */
668 if (iwlagn_fill_txpower_mode(priv
, uart_msg
) ||
669 iwlagn_set_kill_msk(priv
, uart_msg
))
670 queue_work(priv
->workqueue
, &priv
->bt_runtime_config
);
673 /* FIXME: based on notification, adjust the prio_boost */
675 priv
->bt_ci_compliance
= coex
->bt_ci_compliance
;
678 void iwlagn_bt_rx_handler_setup(struct iwl_priv
*priv
)
680 priv
->rx_handlers
[REPLY_BT_COEX_PROFILE_NOTIF
] =
681 iwlagn_bt_coex_profile_notif
;
684 void iwlagn_bt_setup_deferred_work(struct iwl_priv
*priv
)
686 INIT_WORK(&priv
->bt_traffic_change_work
,
687 iwlagn_bt_traffic_change_work
);
690 void iwlagn_bt_cancel_deferred_work(struct iwl_priv
*priv
)
692 cancel_work_sync(&priv
->bt_traffic_change_work
);
695 static bool is_single_rx_stream(struct iwl_priv
*priv
)
697 return priv
->current_ht_config
.smps
== IEEE80211_SMPS_STATIC
||
698 priv
->current_ht_config
.single_chain_sufficient
;
701 #define IWL_NUM_RX_CHAINS_MULTIPLE 3
702 #define IWL_NUM_RX_CHAINS_SINGLE 2
703 #define IWL_NUM_IDLE_CHAINS_DUAL 2
704 #define IWL_NUM_IDLE_CHAINS_SINGLE 1
707 * Determine how many receiver/antenna chains to use.
709 * More provides better reception via diversity. Fewer saves power
710 * at the expense of throughput, but only when not in powersave to
713 * MIMO (dual stream) requires at least 2, but works better with 3.
714 * This does not determine *which* chains to use, just how many.
716 static int iwl_get_active_rx_chain_count(struct iwl_priv
*priv
)
718 if (priv
->lib
->bt_params
&&
719 priv
->lib
->bt_params
->advanced_bt_coexist
&&
720 (priv
->bt_full_concurrent
||
721 priv
->bt_traffic_load
>= IWL_BT_COEX_TRAFFIC_LOAD_HIGH
)) {
723 * only use chain 'A' in bt high traffic load or
724 * full concurrency mode
726 return IWL_NUM_RX_CHAINS_SINGLE
;
728 /* # of Rx chains to use when expecting MIMO. */
729 if (is_single_rx_stream(priv
))
730 return IWL_NUM_RX_CHAINS_SINGLE
;
732 return IWL_NUM_RX_CHAINS_MULTIPLE
;
736 * When we are in power saving mode, unless device support spatial
737 * multiplexing power save, use the active count for rx chain count.
739 static int iwl_get_idle_rx_chain_count(struct iwl_priv
*priv
, int active_cnt
)
741 /* # Rx chains when idling, depending on SMPS mode */
742 switch (priv
->current_ht_config
.smps
) {
743 case IEEE80211_SMPS_STATIC
:
744 case IEEE80211_SMPS_DYNAMIC
:
745 return IWL_NUM_IDLE_CHAINS_SINGLE
;
746 case IEEE80211_SMPS_AUTOMATIC
:
747 case IEEE80211_SMPS_OFF
:
750 WARN(1, "invalid SMPS mode %d",
751 priv
->current_ht_config
.smps
);
757 static u8
iwl_count_chain_bitmap(u32 chain_bitmap
)
760 res
= (chain_bitmap
& BIT(0)) >> 0;
761 res
+= (chain_bitmap
& BIT(1)) >> 1;
762 res
+= (chain_bitmap
& BIT(2)) >> 2;
763 res
+= (chain_bitmap
& BIT(3)) >> 3;
768 * iwlagn_set_rxon_chain - Set up Rx chain usage in "staging" RXON image
770 * Selects how many and which Rx receivers/antennas/chains to use.
771 * This should not be used for scan command ... it puts data in wrong place.
773 void iwlagn_set_rxon_chain(struct iwl_priv
*priv
, struct iwl_rxon_context
*ctx
)
775 bool is_single
= is_single_rx_stream(priv
);
776 bool is_cam
= !test_bit(STATUS_POWER_PMI
, &priv
->status
);
777 u8 idle_rx_cnt
, active_rx_cnt
, valid_rx_cnt
;
781 /* Tell uCode which antennas are actually connected.
782 * Before first association, we assume all antennas are connected.
783 * Just after first association, iwl_chain_noise_calibration()
784 * checks which antennas actually *are* connected. */
785 if (priv
->chain_noise_data
.active_chains
)
786 active_chains
= priv
->chain_noise_data
.active_chains
;
788 active_chains
= priv
->nvm_data
->valid_rx_ant
;
790 if (priv
->lib
->bt_params
&&
791 priv
->lib
->bt_params
->advanced_bt_coexist
&&
792 (priv
->bt_full_concurrent
||
793 priv
->bt_traffic_load
>= IWL_BT_COEX_TRAFFIC_LOAD_HIGH
)) {
795 * only use chain 'A' in bt high traffic load or
796 * full concurrency mode
798 active_chains
= first_antenna(active_chains
);
801 rx_chain
= active_chains
<< RXON_RX_CHAIN_VALID_POS
;
803 /* How many receivers should we use? */
804 active_rx_cnt
= iwl_get_active_rx_chain_count(priv
);
805 idle_rx_cnt
= iwl_get_idle_rx_chain_count(priv
, active_rx_cnt
);
808 /* correct rx chain count according hw settings
809 * and chain noise calibration
811 valid_rx_cnt
= iwl_count_chain_bitmap(active_chains
);
812 if (valid_rx_cnt
< active_rx_cnt
)
813 active_rx_cnt
= valid_rx_cnt
;
815 if (valid_rx_cnt
< idle_rx_cnt
)
816 idle_rx_cnt
= valid_rx_cnt
;
818 rx_chain
|= active_rx_cnt
<< RXON_RX_CHAIN_MIMO_CNT_POS
;
819 rx_chain
|= idle_rx_cnt
<< RXON_RX_CHAIN_CNT_POS
;
821 ctx
->staging
.rx_chain
= cpu_to_le16(rx_chain
);
823 if (!is_single
&& (active_rx_cnt
>= IWL_NUM_RX_CHAINS_SINGLE
) && is_cam
)
824 ctx
->staging
.rx_chain
|= RXON_RX_CHAIN_MIMO_FORCE_MSK
;
826 ctx
->staging
.rx_chain
&= ~RXON_RX_CHAIN_MIMO_FORCE_MSK
;
828 IWL_DEBUG_ASSOC(priv
, "rx_chain=0x%X active=%d idle=%d\n",
829 ctx
->staging
.rx_chain
,
830 active_rx_cnt
, idle_rx_cnt
);
832 WARN_ON(active_rx_cnt
== 0 || idle_rx_cnt
== 0 ||
833 active_rx_cnt
< idle_rx_cnt
);
836 u8
iwl_toggle_tx_ant(struct iwl_priv
*priv
, u8 ant
, u8 valid
)
841 if (priv
->band
== NL80211_BAND_2GHZ
&&
842 priv
->bt_traffic_load
>= IWL_BT_COEX_TRAFFIC_LOAD_HIGH
)
845 for (i
= 0; i
< RATE_ANT_NUM
- 1; i
++) {
846 ind
= (ind
+ 1) < RATE_ANT_NUM
? ind
+ 1 : 0;
847 if (valid
& BIT(ind
))
853 #ifdef CONFIG_PM_SLEEP
854 static void iwlagn_convert_p1k(u16
*p1k
, __le16
*out
)
858 for (i
= 0; i
< IWLAGN_P1K_SIZE
; i
++)
859 out
[i
] = cpu_to_le16(p1k
[i
]);
862 struct wowlan_key_data
{
863 struct iwl_rxon_context
*ctx
;
864 struct iwlagn_wowlan_rsc_tsc_params_cmd
*rsc_tsc
;
865 struct iwlagn_wowlan_tkip_params_cmd
*tkip
;
867 bool error
, use_rsc_tsc
, use_tkip
;
871 static void iwlagn_wowlan_program_keys(struct ieee80211_hw
*hw
,
872 struct ieee80211_vif
*vif
,
873 struct ieee80211_sta
*sta
,
874 struct ieee80211_key_conf
*key
,
877 struct iwl_priv
*priv
= IWL_MAC80211_GET_DVM(hw
);
878 struct wowlan_key_data
*data
= _data
;
879 struct iwl_rxon_context
*ctx
= data
->ctx
;
880 struct aes_sc
*aes_sc
, *aes_tx_sc
= NULL
;
881 struct tkip_sc
*tkip_sc
, *tkip_tx_sc
= NULL
;
882 struct iwlagn_p1k_cache
*rx_p1ks
;
884 struct ieee80211_key_seq seq
;
886 u16 p1k
[IWLAGN_P1K_SIZE
];
889 mutex_lock(&priv
->mutex
);
891 if ((key
->cipher
== WLAN_CIPHER_SUITE_WEP40
||
892 key
->cipher
== WLAN_CIPHER_SUITE_WEP104
) &&
893 !sta
&& !ctx
->key_mapping_keys
)
894 ret
= iwl_set_default_wep_key(priv
, ctx
, key
);
896 ret
= iwl_set_dynamic_key(priv
, ctx
, key
, sta
);
899 IWL_ERR(priv
, "Error setting key during suspend!\n");
903 switch (key
->cipher
) {
904 case WLAN_CIPHER_SUITE_TKIP
:
908 tkip_sc
= data
->rsc_tsc
->all_tsc_rsc
.tkip
.unicast_rsc
;
909 tkip_tx_sc
= &data
->rsc_tsc
->all_tsc_rsc
.tkip
.tsc
;
911 rx_p1ks
= data
->tkip
->rx_uni
;
913 pn64
= atomic64_read(&key
->tx_pn
);
914 tkip_tx_sc
->iv16
= cpu_to_le16(TKIP_PN_TO_IV16(pn64
));
915 tkip_tx_sc
->iv32
= cpu_to_le32(TKIP_PN_TO_IV32(pn64
));
917 ieee80211_get_tkip_p1k_iv(key
, seq
.tkip
.iv32
, p1k
);
918 iwlagn_convert_p1k(p1k
, data
->tkip
->tx
.p1k
);
920 memcpy(data
->tkip
->mic_keys
.tx
,
921 &key
->key
[NL80211_TKIP_DATA_OFFSET_TX_MIC_KEY
],
922 IWLAGN_MIC_KEY_SIZE
);
924 rx_mic_key
= data
->tkip
->mic_keys
.rx_unicast
;
927 data
->rsc_tsc
->all_tsc_rsc
.tkip
.multicast_rsc
;
928 rx_p1ks
= data
->tkip
->rx_multi
;
929 rx_mic_key
= data
->tkip
->mic_keys
.rx_mcast
;
933 * For non-QoS this relies on the fact that both the uCode and
934 * mac80211 use TID 0 (as they need to to avoid replay attacks)
935 * for checking the IV in the frames.
937 for (i
= 0; i
< IWLAGN_NUM_RSC
; i
++) {
938 ieee80211_get_key_rx_seq(key
, i
, &seq
);
939 tkip_sc
[i
].iv16
= cpu_to_le16(seq
.tkip
.iv16
);
940 tkip_sc
[i
].iv32
= cpu_to_le32(seq
.tkip
.iv32
);
941 /* wrapping isn't allowed, AP must rekey */
942 if (seq
.tkip
.iv32
> cur_rx_iv32
)
943 cur_rx_iv32
= seq
.tkip
.iv32
;
946 ieee80211_get_tkip_rx_p1k(key
, data
->bssid
, cur_rx_iv32
, p1k
);
947 iwlagn_convert_p1k(p1k
, rx_p1ks
[0].p1k
);
948 ieee80211_get_tkip_rx_p1k(key
, data
->bssid
,
949 cur_rx_iv32
+ 1, p1k
);
950 iwlagn_convert_p1k(p1k
, rx_p1ks
[1].p1k
);
953 &key
->key
[NL80211_TKIP_DATA_OFFSET_RX_MIC_KEY
],
954 IWLAGN_MIC_KEY_SIZE
);
956 data
->use_tkip
= true;
957 data
->use_rsc_tsc
= true;
959 case WLAN_CIPHER_SUITE_CCMP
:
963 aes_sc
= data
->rsc_tsc
->all_tsc_rsc
.aes
.unicast_rsc
;
964 aes_tx_sc
= &data
->rsc_tsc
->all_tsc_rsc
.aes
.tsc
;
966 pn64
= atomic64_read(&key
->tx_pn
);
967 aes_tx_sc
->pn
= cpu_to_le64(pn64
);
969 aes_sc
= data
->rsc_tsc
->all_tsc_rsc
.aes
.multicast_rsc
;
972 * For non-QoS this relies on the fact that both the uCode and
973 * mac80211 use TID 0 for checking the IV in the frames.
975 for (i
= 0; i
< IWLAGN_NUM_RSC
; i
++) {
976 u8
*pn
= seq
.ccmp
.pn
;
978 ieee80211_get_key_rx_seq(key
, i
, &seq
);
979 aes_sc
[i
].pn
= cpu_to_le64(
987 data
->use_rsc_tsc
= true;
991 mutex_unlock(&priv
->mutex
);
994 int iwlagn_send_patterns(struct iwl_priv
*priv
,
995 struct cfg80211_wowlan
*wowlan
)
997 struct iwlagn_wowlan_patterns_cmd
*pattern_cmd
;
998 struct iwl_host_cmd cmd
= {
999 .id
= REPLY_WOWLAN_PATTERNS
,
1000 .dataflags
[0] = IWL_HCMD_DFL_NOCOPY
,
1004 if (!wowlan
->n_patterns
)
1007 cmd
.len
[0] = struct_size(pattern_cmd
, patterns
, wowlan
->n_patterns
);
1009 pattern_cmd
= kmalloc(cmd
.len
[0], GFP_KERNEL
);
1013 pattern_cmd
->n_patterns
= cpu_to_le32(wowlan
->n_patterns
);
1015 for (i
= 0; i
< wowlan
->n_patterns
; i
++) {
1016 int mask_len
= DIV_ROUND_UP(wowlan
->patterns
[i
].pattern_len
, 8);
1018 memcpy(&pattern_cmd
->patterns
[i
].mask
,
1019 wowlan
->patterns
[i
].mask
, mask_len
);
1020 memcpy(&pattern_cmd
->patterns
[i
].pattern
,
1021 wowlan
->patterns
[i
].pattern
,
1022 wowlan
->patterns
[i
].pattern_len
);
1023 pattern_cmd
->patterns
[i
].mask_size
= mask_len
;
1024 pattern_cmd
->patterns
[i
].pattern_size
=
1025 wowlan
->patterns
[i
].pattern_len
;
1028 cmd
.data
[0] = pattern_cmd
;
1029 err
= iwl_dvm_send_cmd(priv
, &cmd
);
1034 int iwlagn_suspend(struct iwl_priv
*priv
, struct cfg80211_wowlan
*wowlan
)
1036 struct iwlagn_wowlan_wakeup_filter_cmd wakeup_filter_cmd
;
1037 struct iwl_rxon_cmd rxon
;
1038 struct iwl_rxon_context
*ctx
= &priv
->contexts
[IWL_RXON_CTX_BSS
];
1039 struct iwlagn_wowlan_kek_kck_material_cmd kek_kck_cmd
;
1040 struct iwlagn_wowlan_tkip_params_cmd tkip_cmd
= {};
1041 struct iwlagn_d3_config_cmd d3_cfg_cmd
= {
1043 * Program the minimum sleep time to 10 seconds, as many
1044 * platforms have issues processing a wakeup signal while
1045 * still being in the process of suspending.
1047 .min_sleep_time
= cpu_to_le32(10 * 1000 * 1000),
1049 struct wowlan_key_data key_data
= {
1051 .bssid
= ctx
->active
.bssid_addr
,
1052 .use_rsc_tsc
= false,
1059 key_data
.rsc_tsc
= kzalloc(sizeof(*key_data
.rsc_tsc
), GFP_KERNEL
);
1060 if (!key_data
.rsc_tsc
)
1063 memset(&wakeup_filter_cmd
, 0, sizeof(wakeup_filter_cmd
));
1066 * We know the last used seqno, and the uCode expects to know that
1067 * one, it will increment before TX.
1069 seq
= le16_to_cpu(priv
->last_seq_ctl
) & IEEE80211_SCTL_SEQ
;
1070 wakeup_filter_cmd
.non_qos_seq
= cpu_to_le16(seq
);
1073 * For QoS counters, we store the one to use next, so subtract 0x10
1074 * since the uCode will add 0x10 before using the value.
1076 for (i
= 0; i
< IWL_MAX_TID_COUNT
; i
++) {
1077 seq
= priv
->tid_data
[IWL_AP_ID
][i
].seq_number
;
1079 wakeup_filter_cmd
.qos_seq
[i
] = cpu_to_le16(seq
);
1082 if (wowlan
->disconnect
)
1083 wakeup_filter_cmd
.enabled
|=
1084 cpu_to_le32(IWLAGN_WOWLAN_WAKEUP_BEACON_MISS
|
1085 IWLAGN_WOWLAN_WAKEUP_LINK_CHANGE
);
1086 if (wowlan
->magic_pkt
)
1087 wakeup_filter_cmd
.enabled
|=
1088 cpu_to_le32(IWLAGN_WOWLAN_WAKEUP_MAGIC_PACKET
);
1089 if (wowlan
->gtk_rekey_failure
)
1090 wakeup_filter_cmd
.enabled
|=
1091 cpu_to_le32(IWLAGN_WOWLAN_WAKEUP_GTK_REKEY_FAIL
);
1092 if (wowlan
->eap_identity_req
)
1093 wakeup_filter_cmd
.enabled
|=
1094 cpu_to_le32(IWLAGN_WOWLAN_WAKEUP_EAP_IDENT_REQ
);
1095 if (wowlan
->four_way_handshake
)
1096 wakeup_filter_cmd
.enabled
|=
1097 cpu_to_le32(IWLAGN_WOWLAN_WAKEUP_4WAY_HANDSHAKE
);
1098 if (wowlan
->n_patterns
)
1099 wakeup_filter_cmd
.enabled
|=
1100 cpu_to_le32(IWLAGN_WOWLAN_WAKEUP_PATTERN_MATCH
);
1102 if (wowlan
->rfkill_release
)
1103 d3_cfg_cmd
.wakeup_flags
|=
1104 cpu_to_le32(IWLAGN_D3_WAKEUP_RFKILL
);
1106 iwl_scan_cancel_timeout(priv
, 200);
1108 memcpy(&rxon
, &ctx
->active
, sizeof(rxon
));
1110 priv
->ucode_loaded
= false;
1111 iwl_trans_stop_device(priv
->trans
);
1112 ret
= iwl_trans_start_hw(priv
->trans
);
1116 priv
->wowlan
= true;
1118 ret
= iwl_load_ucode_wait_alive(priv
, IWL_UCODE_WOWLAN
);
1122 /* now configure WoWLAN ucode */
1123 ret
= iwl_alive_start(priv
);
1127 memcpy(&ctx
->staging
, &rxon
, sizeof(rxon
));
1128 ret
= iwlagn_commit_rxon(priv
, ctx
);
1132 ret
= iwl_power_update_mode(priv
, true);
1136 if (!iwlwifi_mod_params
.swcrypto
) {
1137 /* mark all keys clear */
1138 priv
->ucode_key_table
= 0;
1139 ctx
->key_mapping_keys
= 0;
1142 * This needs to be unlocked due to lock ordering
1143 * constraints. Since we're in the suspend path
1144 * that isn't really a problem though.
1146 mutex_unlock(&priv
->mutex
);
1147 ieee80211_iter_keys(priv
->hw
, ctx
->vif
,
1148 iwlagn_wowlan_program_keys
,
1150 mutex_lock(&priv
->mutex
);
1151 if (key_data
.error
) {
1156 if (key_data
.use_rsc_tsc
) {
1157 struct iwl_host_cmd rsc_tsc_cmd
= {
1158 .id
= REPLY_WOWLAN_TSC_RSC_PARAMS
,
1159 .data
[0] = key_data
.rsc_tsc
,
1160 .dataflags
[0] = IWL_HCMD_DFL_NOCOPY
,
1161 .len
[0] = sizeof(*key_data
.rsc_tsc
),
1164 ret
= iwl_dvm_send_cmd(priv
, &rsc_tsc_cmd
);
1169 if (key_data
.use_tkip
) {
1170 ret
= iwl_dvm_send_cmd_pdu(priv
,
1171 REPLY_WOWLAN_TKIP_PARAMS
,
1172 0, sizeof(tkip_cmd
),
1178 if (priv
->have_rekey_data
) {
1179 memset(&kek_kck_cmd
, 0, sizeof(kek_kck_cmd
));
1180 memcpy(kek_kck_cmd
.kck
, priv
->kck
, NL80211_KCK_LEN
);
1181 kek_kck_cmd
.kck_len
= cpu_to_le16(NL80211_KCK_LEN
);
1182 memcpy(kek_kck_cmd
.kek
, priv
->kek
, NL80211_KEK_LEN
);
1183 kek_kck_cmd
.kek_len
= cpu_to_le16(NL80211_KEK_LEN
);
1184 kek_kck_cmd
.replay_ctr
= priv
->replay_ctr
;
1186 ret
= iwl_dvm_send_cmd_pdu(priv
,
1187 REPLY_WOWLAN_KEK_KCK_MATERIAL
,
1188 0, sizeof(kek_kck_cmd
),
1195 ret
= iwl_dvm_send_cmd_pdu(priv
, REPLY_D3_CONFIG
, 0,
1196 sizeof(d3_cfg_cmd
), &d3_cfg_cmd
);
1200 ret
= iwl_dvm_send_cmd_pdu(priv
, REPLY_WOWLAN_WAKEUP_FILTER
,
1201 0, sizeof(wakeup_filter_cmd
),
1202 &wakeup_filter_cmd
);
1206 ret
= iwlagn_send_patterns(priv
, wowlan
);
1208 kfree(key_data
.rsc_tsc
);
1213 int iwl_dvm_send_cmd(struct iwl_priv
*priv
, struct iwl_host_cmd
*cmd
)
1215 if (iwl_is_rfkill(priv
) || iwl_is_ctkill(priv
)) {
1216 IWL_WARN(priv
, "Not sending command - %s KILL\n",
1217 iwl_is_rfkill(priv
) ? "RF" : "CT");
1221 if (test_bit(STATUS_FW_ERROR
, &priv
->status
)) {
1222 IWL_ERR(priv
, "Command %s failed: FW Error\n",
1223 iwl_get_cmd_string(priv
->trans
, cmd
->id
));
1228 * This can happen upon FW ASSERT: we clear the STATUS_FW_ERROR flag
1229 * in iwl_down but cancel the workers only later.
1231 if (!priv
->ucode_loaded
) {
1232 IWL_ERR(priv
, "Fw not loaded - dropping CMD: %x\n", cmd
->id
);
1237 * Synchronous commands from this op-mode must hold
1238 * the mutex, this ensures we don't try to send two
1239 * (or more) synchronous commands at a time.
1241 if (!(cmd
->flags
& CMD_ASYNC
))
1242 lockdep_assert_held(&priv
->mutex
);
1244 return iwl_trans_send_cmd(priv
->trans
, cmd
);
1247 int iwl_dvm_send_cmd_pdu(struct iwl_priv
*priv
, u8 id
,
1248 u32 flags
, u16 len
, const void *data
)
1250 struct iwl_host_cmd cmd
= {
1257 return iwl_dvm_send_cmd(priv
, &cmd
);