xref: /linux/drivers/net/wireless/intel/iwlwifi/mvm/fw.c (revision 52338415)
1 /******************************************************************************
2  *
3  * This file is provided under a dual BSD/GPLv2 license.  When using or
4  * redistributing this file, you may do so under either license.
5  *
6  * GPL LICENSE SUMMARY
7  *
8  * Copyright(c) 2012 - 2014 Intel Corporation. All rights reserved.
9  * Copyright(c) 2013 - 2015 Intel Mobile Communications GmbH
10  * Copyright(c) 2016 - 2017 Intel Deutschland GmbH
11  * Copyright(c) 2018 - 2019        Intel Corporation
12  *
13  * This program is free software; you can redistribute it and/or modify
14  * it under the terms of version 2 of the GNU General Public License as
15  * published by the Free Software Foundation.
16  *
17  * This program is distributed in the hope that it will be useful, but
18  * WITHOUT ANY WARRANTY; without even the implied warranty of
19  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
20  * General Public License for more details.
21  *
22  * The full GNU General Public License is included in this distribution
23  * in the file called COPYING.
24  *
25  * Contact Information:
26  *  Intel Linux Wireless <linuxwifi@intel.com>
27  * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
28  *
29  * BSD LICENSE
30  *
31  * Copyright(c) 2012 - 2014 Intel Corporation. All rights reserved.
32  * Copyright(c) 2013 - 2015 Intel Mobile Communications GmbH
33  * Copyright(c) 2016 - 2017 Intel Deutschland GmbH
34  * Copyright(c) 2018 - 2019       Intel Corporation
35  * All rights reserved.
36  *
37  * Redistribution and use in source and binary forms, with or without
38  * modification, are permitted provided that the following conditions
39  * are met:
40  *
41  *  * Redistributions of source code must retain the above copyright
42  *    notice, this list of conditions and the following disclaimer.
43  *  * Redistributions in binary form must reproduce the above copyright
44  *    notice, this list of conditions and the following disclaimer in
45  *    the documentation and/or other materials provided with the
46  *    distribution.
47  *  * Neither the name Intel Corporation nor the names of its
48  *    contributors may be used to endorse or promote products derived
49  *    from this software without specific prior written permission.
50  *
51  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
52  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
53  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
54  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
55  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
56  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
57  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
58  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
59  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
60  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
61  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
62  *
63  *****************************************************************************/
64 #include <net/mac80211.h>
65 #include <linux/netdevice.h>
66 
67 #include "iwl-trans.h"
68 #include "iwl-op-mode.h"
69 #include "fw/img.h"
70 #include "iwl-debug.h"
71 #include "iwl-csr.h" /* for iwl_mvm_rx_card_state_notif */
72 #include "iwl-io.h" /* for iwl_mvm_rx_card_state_notif */
73 #include "iwl-prph.h"
74 #include "fw/acpi.h"
75 
76 #include "mvm.h"
77 #include "fw/dbg.h"
78 #include "iwl-phy-db.h"
79 #include "iwl-modparams.h"
80 #include "iwl-nvm-parse.h"
81 
82 #define MVM_UCODE_ALIVE_TIMEOUT	HZ
83 #define MVM_UCODE_CALIB_TIMEOUT	(2*HZ)
84 
85 #define UCODE_VALID_OK	cpu_to_le32(0x1)
86 
87 struct iwl_mvm_alive_data {
88 	bool valid;
89 	u32 scd_base_addr;
90 };
91 
92 static int iwl_send_tx_ant_cfg(struct iwl_mvm *mvm, u8 valid_tx_ant)
93 {
94 	struct iwl_tx_ant_cfg_cmd tx_ant_cmd = {
95 		.valid = cpu_to_le32(valid_tx_ant),
96 	};
97 
98 	IWL_DEBUG_FW(mvm, "select valid tx ant: %u\n", valid_tx_ant);
99 	return iwl_mvm_send_cmd_pdu(mvm, TX_ANT_CONFIGURATION_CMD, 0,
100 				    sizeof(tx_ant_cmd), &tx_ant_cmd);
101 }
102 
103 static int iwl_send_rss_cfg_cmd(struct iwl_mvm *mvm)
104 {
105 	int i;
106 	struct iwl_rss_config_cmd cmd = {
107 		.flags = cpu_to_le32(IWL_RSS_ENABLE),
108 		.hash_mask = BIT(IWL_RSS_HASH_TYPE_IPV4_TCP) |
109 			     BIT(IWL_RSS_HASH_TYPE_IPV4_UDP) |
110 			     BIT(IWL_RSS_HASH_TYPE_IPV4_PAYLOAD) |
111 			     BIT(IWL_RSS_HASH_TYPE_IPV6_TCP) |
112 			     BIT(IWL_RSS_HASH_TYPE_IPV6_UDP) |
113 			     BIT(IWL_RSS_HASH_TYPE_IPV6_PAYLOAD),
114 	};
115 
116 	if (mvm->trans->num_rx_queues == 1)
117 		return 0;
118 
119 	/* Do not direct RSS traffic to Q 0 which is our fallback queue */
120 	for (i = 0; i < ARRAY_SIZE(cmd.indirection_table); i++)
121 		cmd.indirection_table[i] =
122 			1 + (i % (mvm->trans->num_rx_queues - 1));
123 	netdev_rss_key_fill(cmd.secret_key, sizeof(cmd.secret_key));
124 
125 	return iwl_mvm_send_cmd_pdu(mvm, RSS_CONFIG_CMD, 0, sizeof(cmd), &cmd);
126 }
127 
128 static int iwl_configure_rxq(struct iwl_mvm *mvm)
129 {
130 	int i, num_queues, size, ret;
131 	struct iwl_rfh_queue_config *cmd;
132 	struct iwl_host_cmd hcmd = {
133 		.id = WIDE_ID(DATA_PATH_GROUP, RFH_QUEUE_CONFIG_CMD),
134 		.dataflags[0] = IWL_HCMD_DFL_NOCOPY,
135 	};
136 
137 	/* Do not configure default queue, it is configured via context info */
138 	num_queues = mvm->trans->num_rx_queues - 1;
139 
140 	size = struct_size(cmd, data, num_queues);
141 
142 	cmd = kzalloc(size, GFP_KERNEL);
143 	if (!cmd)
144 		return -ENOMEM;
145 
146 	cmd->num_queues = num_queues;
147 
148 	for (i = 0; i < num_queues; i++) {
149 		struct iwl_trans_rxq_dma_data data;
150 
151 		cmd->data[i].q_num = i + 1;
152 		iwl_trans_get_rxq_dma_data(mvm->trans, i + 1, &data);
153 
154 		cmd->data[i].fr_bd_cb = cpu_to_le64(data.fr_bd_cb);
155 		cmd->data[i].urbd_stts_wrptr =
156 			cpu_to_le64(data.urbd_stts_wrptr);
157 		cmd->data[i].ur_bd_cb = cpu_to_le64(data.ur_bd_cb);
158 		cmd->data[i].fr_bd_wid = cpu_to_le32(data.fr_bd_wid);
159 	}
160 
161 	hcmd.data[0] = cmd;
162 	hcmd.len[0] = size;
163 
164 	ret = iwl_mvm_send_cmd(mvm, &hcmd);
165 
166 	kfree(cmd);
167 
168 	return ret;
169 }
170 
171 static int iwl_mvm_send_dqa_cmd(struct iwl_mvm *mvm)
172 {
173 	struct iwl_dqa_enable_cmd dqa_cmd = {
174 		.cmd_queue = cpu_to_le32(IWL_MVM_DQA_CMD_QUEUE),
175 	};
176 	u32 cmd_id = iwl_cmd_id(DQA_ENABLE_CMD, DATA_PATH_GROUP, 0);
177 	int ret;
178 
179 	ret = iwl_mvm_send_cmd_pdu(mvm, cmd_id, 0, sizeof(dqa_cmd), &dqa_cmd);
180 	if (ret)
181 		IWL_ERR(mvm, "Failed to send DQA enabling command: %d\n", ret);
182 	else
183 		IWL_DEBUG_FW(mvm, "Working in DQA mode\n");
184 
185 	return ret;
186 }
187 
188 void iwl_mvm_mfu_assert_dump_notif(struct iwl_mvm *mvm,
189 				   struct iwl_rx_cmd_buffer *rxb)
190 {
191 	struct iwl_rx_packet *pkt = rxb_addr(rxb);
192 	struct iwl_mfu_assert_dump_notif *mfu_dump_notif = (void *)pkt->data;
193 	__le32 *dump_data = mfu_dump_notif->data;
194 	int n_words = le32_to_cpu(mfu_dump_notif->data_size) / sizeof(__le32);
195 	int i;
196 
197 	if (mfu_dump_notif->index_num == 0)
198 		IWL_INFO(mvm, "MFUART assert id 0x%x occurred\n",
199 			 le32_to_cpu(mfu_dump_notif->assert_id));
200 
201 	for (i = 0; i < n_words; i++)
202 		IWL_DEBUG_INFO(mvm,
203 			       "MFUART assert dump, dword %u: 0x%08x\n",
204 			       le16_to_cpu(mfu_dump_notif->index_num) *
205 			       n_words + i,
206 			       le32_to_cpu(dump_data[i]));
207 }
208 
209 static bool iwl_alive_fn(struct iwl_notif_wait_data *notif_wait,
210 			 struct iwl_rx_packet *pkt, void *data)
211 {
212 	struct iwl_mvm *mvm =
213 		container_of(notif_wait, struct iwl_mvm, notif_wait);
214 	struct iwl_mvm_alive_data *alive_data = data;
215 	struct mvm_alive_resp_v3 *palive3;
216 	struct mvm_alive_resp *palive;
217 	struct iwl_umac_alive *umac;
218 	struct iwl_lmac_alive *lmac1;
219 	struct iwl_lmac_alive *lmac2 = NULL;
220 	u16 status;
221 	u32 lmac_error_event_table, umac_error_event_table;
222 
223 	if (iwl_rx_packet_payload_len(pkt) == sizeof(*palive)) {
224 		palive = (void *)pkt->data;
225 		umac = &palive->umac_data;
226 		lmac1 = &palive->lmac_data[0];
227 		lmac2 = &palive->lmac_data[1];
228 		status = le16_to_cpu(palive->status);
229 	} else {
230 		palive3 = (void *)pkt->data;
231 		umac = &palive3->umac_data;
232 		lmac1 = &palive3->lmac_data;
233 		status = le16_to_cpu(palive3->status);
234 	}
235 
236 	lmac_error_event_table =
237 		le32_to_cpu(lmac1->dbg_ptrs.error_event_table_ptr);
238 	iwl_fw_lmac1_set_alive_err_table(mvm->trans, lmac_error_event_table);
239 
240 	if (lmac2)
241 		mvm->trans->dbg.lmac_error_event_table[1] =
242 			le32_to_cpu(lmac2->dbg_ptrs.error_event_table_ptr);
243 
244 	umac_error_event_table = le32_to_cpu(umac->dbg_ptrs.error_info_addr);
245 
246 	if (!umac_error_event_table) {
247 		mvm->support_umac_log = false;
248 	} else if (umac_error_event_table >=
249 		   mvm->trans->cfg->min_umac_error_event_table) {
250 		mvm->support_umac_log = true;
251 	} else {
252 		IWL_ERR(mvm,
253 			"Not valid error log pointer 0x%08X for %s uCode\n",
254 			umac_error_event_table,
255 			(mvm->fwrt.cur_fw_img == IWL_UCODE_INIT) ?
256 			"Init" : "RT");
257 		mvm->support_umac_log = false;
258 	}
259 
260 	if (mvm->support_umac_log)
261 		iwl_fw_umac_set_alive_err_table(mvm->trans,
262 						umac_error_event_table);
263 
264 	alive_data->scd_base_addr = le32_to_cpu(lmac1->dbg_ptrs.scd_base_ptr);
265 	alive_data->valid = status == IWL_ALIVE_STATUS_OK;
266 
267 	IWL_DEBUG_FW(mvm,
268 		     "Alive ucode status 0x%04x revision 0x%01X 0x%01X\n",
269 		     status, lmac1->ver_type, lmac1->ver_subtype);
270 
271 	if (lmac2)
272 		IWL_DEBUG_FW(mvm, "Alive ucode CDB\n");
273 
274 	IWL_DEBUG_FW(mvm,
275 		     "UMAC version: Major - 0x%x, Minor - 0x%x\n",
276 		     le32_to_cpu(umac->umac_major),
277 		     le32_to_cpu(umac->umac_minor));
278 
279 	iwl_fwrt_update_fw_versions(&mvm->fwrt, lmac1, umac);
280 
281 	return true;
282 }
283 
284 static bool iwl_wait_init_complete(struct iwl_notif_wait_data *notif_wait,
285 				   struct iwl_rx_packet *pkt, void *data)
286 {
287 	WARN_ON(pkt->hdr.cmd != INIT_COMPLETE_NOTIF);
288 
289 	return true;
290 }
291 
292 static bool iwl_wait_phy_db_entry(struct iwl_notif_wait_data *notif_wait,
293 				  struct iwl_rx_packet *pkt, void *data)
294 {
295 	struct iwl_phy_db *phy_db = data;
296 
297 	if (pkt->hdr.cmd != CALIB_RES_NOTIF_PHY_DB) {
298 		WARN_ON(pkt->hdr.cmd != INIT_COMPLETE_NOTIF);
299 		return true;
300 	}
301 
302 	WARN_ON(iwl_phy_db_set_section(phy_db, pkt));
303 
304 	return false;
305 }
306 
307 static int iwl_mvm_load_ucode_wait_alive(struct iwl_mvm *mvm,
308 					 enum iwl_ucode_type ucode_type)
309 {
310 	struct iwl_notification_wait alive_wait;
311 	struct iwl_mvm_alive_data alive_data = {};
312 	const struct fw_img *fw;
313 	int ret;
314 	enum iwl_ucode_type old_type = mvm->fwrt.cur_fw_img;
315 	static const u16 alive_cmd[] = { MVM_ALIVE };
316 	bool run_in_rfkill =
317 		ucode_type == IWL_UCODE_INIT || iwl_mvm_has_unified_ucode(mvm);
318 
319 	if (ucode_type == IWL_UCODE_REGULAR &&
320 	    iwl_fw_dbg_conf_usniffer(mvm->fw, FW_DBG_START_FROM_ALIVE) &&
321 	    !(fw_has_capa(&mvm->fw->ucode_capa,
322 			  IWL_UCODE_TLV_CAPA_USNIFFER_UNIFIED)))
323 		fw = iwl_get_ucode_image(mvm->fw, IWL_UCODE_REGULAR_USNIFFER);
324 	else
325 		fw = iwl_get_ucode_image(mvm->fw, ucode_type);
326 	if (WARN_ON(!fw))
327 		return -EINVAL;
328 	iwl_fw_set_current_image(&mvm->fwrt, ucode_type);
329 	clear_bit(IWL_MVM_STATUS_FIRMWARE_RUNNING, &mvm->status);
330 
331 	iwl_init_notification_wait(&mvm->notif_wait, &alive_wait,
332 				   alive_cmd, ARRAY_SIZE(alive_cmd),
333 				   iwl_alive_fn, &alive_data);
334 
335 	/*
336 	 * We want to load the INIT firmware even in RFKILL
337 	 * For the unified firmware case, the ucode_type is not
338 	 * INIT, but we still need to run it.
339 	 */
340 	ret = iwl_trans_start_fw(mvm->trans, fw, run_in_rfkill);
341 	if (ret) {
342 		iwl_fw_set_current_image(&mvm->fwrt, old_type);
343 		iwl_remove_notification(&mvm->notif_wait, &alive_wait);
344 		return ret;
345 	}
346 
347 	/*
348 	 * Some things may run in the background now, but we
349 	 * just wait for the ALIVE notification here.
350 	 */
351 	ret = iwl_wait_notification(&mvm->notif_wait, &alive_wait,
352 				    MVM_UCODE_ALIVE_TIMEOUT);
353 	if (ret) {
354 		struct iwl_trans *trans = mvm->trans;
355 
356 		if (ret == -ETIMEDOUT)
357 			iwl_fw_dbg_error_collect(&mvm->fwrt,
358 						 FW_DBG_TRIGGER_ALIVE_TIMEOUT);
359 
360 		if (trans->trans_cfg->device_family >= IWL_DEVICE_FAMILY_22000)
361 			IWL_ERR(mvm,
362 				"SecBoot CPU1 Status: 0x%x, CPU2 Status: 0x%x\n",
363 				iwl_read_umac_prph(trans, UMAG_SB_CPU_1_STATUS),
364 				iwl_read_umac_prph(trans,
365 						   UMAG_SB_CPU_2_STATUS));
366 		else if (trans->trans_cfg->device_family >=
367 			 IWL_DEVICE_FAMILY_8000)
368 			IWL_ERR(mvm,
369 				"SecBoot CPU1 Status: 0x%x, CPU2 Status: 0x%x\n",
370 				iwl_read_prph(trans, SB_CPU_1_STATUS),
371 				iwl_read_prph(trans, SB_CPU_2_STATUS));
372 		iwl_fw_set_current_image(&mvm->fwrt, old_type);
373 		return ret;
374 	}
375 
376 	if (!alive_data.valid) {
377 		IWL_ERR(mvm, "Loaded ucode is not valid!\n");
378 		iwl_fw_set_current_image(&mvm->fwrt, old_type);
379 		return -EIO;
380 	}
381 
382 	iwl_trans_fw_alive(mvm->trans, alive_data.scd_base_addr);
383 
384 	/*
385 	 * Note: all the queues are enabled as part of the interface
386 	 * initialization, but in firmware restart scenarios they
387 	 * could be stopped, so wake them up. In firmware restart,
388 	 * mac80211 will have the queues stopped as well until the
389 	 * reconfiguration completes. During normal startup, they
390 	 * will be empty.
391 	 */
392 
393 	memset(&mvm->queue_info, 0, sizeof(mvm->queue_info));
394 	/*
395 	 * Set a 'fake' TID for the command queue, since we use the
396 	 * hweight() of the tid_bitmap as a refcount now. Not that
397 	 * we ever even consider the command queue as one we might
398 	 * want to reuse, but be safe nevertheless.
399 	 */
400 	mvm->queue_info[IWL_MVM_DQA_CMD_QUEUE].tid_bitmap =
401 		BIT(IWL_MAX_TID_COUNT + 2);
402 
403 	set_bit(IWL_MVM_STATUS_FIRMWARE_RUNNING, &mvm->status);
404 #ifdef CONFIG_IWLWIFI_DEBUGFS
405 	iwl_fw_set_dbg_rec_on(&mvm->fwrt);
406 #endif
407 
408 	return 0;
409 }
410 
411 static int iwl_run_unified_mvm_ucode(struct iwl_mvm *mvm, bool read_nvm)
412 {
413 	struct iwl_notification_wait init_wait;
414 	struct iwl_nvm_access_complete_cmd nvm_complete = {};
415 	struct iwl_init_extended_cfg_cmd init_cfg = {
416 		.init_flags = cpu_to_le32(BIT(IWL_INIT_NVM)),
417 	};
418 	static const u16 init_complete[] = {
419 		INIT_COMPLETE_NOTIF,
420 	};
421 	int ret;
422 
423 	if (mvm->trans->cfg->tx_with_siso_diversity)
424 		init_cfg.init_flags |= cpu_to_le32(BIT(IWL_INIT_PHY));
425 
426 	lockdep_assert_held(&mvm->mutex);
427 
428 	mvm->rfkill_safe_init_done = false;
429 
430 	iwl_init_notification_wait(&mvm->notif_wait,
431 				   &init_wait,
432 				   init_complete,
433 				   ARRAY_SIZE(init_complete),
434 				   iwl_wait_init_complete,
435 				   NULL);
436 
437 	iwl_dbg_tlv_time_point(&mvm->fwrt, IWL_FW_INI_TIME_POINT_EARLY, NULL);
438 
439 	/* Will also start the device */
440 	ret = iwl_mvm_load_ucode_wait_alive(mvm, IWL_UCODE_REGULAR);
441 	if (ret) {
442 		IWL_ERR(mvm, "Failed to start RT ucode: %d\n", ret);
443 		goto error;
444 	}
445 	iwl_dbg_tlv_time_point(&mvm->fwrt, IWL_FW_INI_TIME_POINT_AFTER_ALIVE,
446 			       NULL);
447 
448 	/* Send init config command to mark that we are sending NVM access
449 	 * commands
450 	 */
451 	ret = iwl_mvm_send_cmd_pdu(mvm, WIDE_ID(SYSTEM_GROUP,
452 						INIT_EXTENDED_CFG_CMD),
453 				   CMD_SEND_IN_RFKILL,
454 				   sizeof(init_cfg), &init_cfg);
455 	if (ret) {
456 		IWL_ERR(mvm, "Failed to run init config command: %d\n",
457 			ret);
458 		goto error;
459 	}
460 
461 	/* Load NVM to NIC if needed */
462 	if (mvm->nvm_file_name) {
463 		iwl_read_external_nvm(mvm->trans, mvm->nvm_file_name,
464 				      mvm->nvm_sections);
465 		iwl_mvm_load_nvm_to_nic(mvm);
466 	}
467 
468 	if (IWL_MVM_PARSE_NVM && read_nvm) {
469 		ret = iwl_nvm_init(mvm);
470 		if (ret) {
471 			IWL_ERR(mvm, "Failed to read NVM: %d\n", ret);
472 			goto error;
473 		}
474 	}
475 
476 	ret = iwl_mvm_send_cmd_pdu(mvm, WIDE_ID(REGULATORY_AND_NVM_GROUP,
477 						NVM_ACCESS_COMPLETE),
478 				   CMD_SEND_IN_RFKILL,
479 				   sizeof(nvm_complete), &nvm_complete);
480 	if (ret) {
481 		IWL_ERR(mvm, "Failed to run complete NVM access: %d\n",
482 			ret);
483 		goto error;
484 	}
485 
486 	/* We wait for the INIT complete notification */
487 	ret = iwl_wait_notification(&mvm->notif_wait, &init_wait,
488 				    MVM_UCODE_ALIVE_TIMEOUT);
489 	if (ret)
490 		return ret;
491 
492 	/* Read the NVM only at driver load time, no need to do this twice */
493 	if (!IWL_MVM_PARSE_NVM && read_nvm) {
494 		mvm->nvm_data = iwl_get_nvm(mvm->trans, mvm->fw);
495 		if (IS_ERR(mvm->nvm_data)) {
496 			ret = PTR_ERR(mvm->nvm_data);
497 			mvm->nvm_data = NULL;
498 			IWL_ERR(mvm, "Failed to read NVM: %d\n", ret);
499 			return ret;
500 		}
501 	}
502 
503 	mvm->rfkill_safe_init_done = true;
504 
505 	return 0;
506 
507 error:
508 	iwl_remove_notification(&mvm->notif_wait, &init_wait);
509 	return ret;
510 }
511 
512 static int iwl_send_phy_cfg_cmd(struct iwl_mvm *mvm)
513 {
514 	struct iwl_phy_cfg_cmd phy_cfg_cmd;
515 	enum iwl_ucode_type ucode_type = mvm->fwrt.cur_fw_img;
516 
517 	/* Set parameters */
518 	phy_cfg_cmd.phy_cfg = cpu_to_le32(iwl_mvm_get_phy_config(mvm));
519 
520 	/* set flags extra PHY configuration flags from the device's cfg */
521 	phy_cfg_cmd.phy_cfg |= cpu_to_le32(mvm->cfg->extra_phy_cfg_flags);
522 
523 	phy_cfg_cmd.calib_control.event_trigger =
524 		mvm->fw->default_calib[ucode_type].event_trigger;
525 	phy_cfg_cmd.calib_control.flow_trigger =
526 		mvm->fw->default_calib[ucode_type].flow_trigger;
527 
528 	IWL_DEBUG_INFO(mvm, "Sending Phy CFG command: 0x%x\n",
529 		       phy_cfg_cmd.phy_cfg);
530 
531 	return iwl_mvm_send_cmd_pdu(mvm, PHY_CONFIGURATION_CMD, 0,
532 				    sizeof(phy_cfg_cmd), &phy_cfg_cmd);
533 }
534 
535 int iwl_run_init_mvm_ucode(struct iwl_mvm *mvm, bool read_nvm)
536 {
537 	struct iwl_notification_wait calib_wait;
538 	static const u16 init_complete[] = {
539 		INIT_COMPLETE_NOTIF,
540 		CALIB_RES_NOTIF_PHY_DB
541 	};
542 	int ret;
543 
544 	if (iwl_mvm_has_unified_ucode(mvm))
545 		return iwl_run_unified_mvm_ucode(mvm, true);
546 
547 	lockdep_assert_held(&mvm->mutex);
548 
549 	mvm->rfkill_safe_init_done = false;
550 
551 	iwl_init_notification_wait(&mvm->notif_wait,
552 				   &calib_wait,
553 				   init_complete,
554 				   ARRAY_SIZE(init_complete),
555 				   iwl_wait_phy_db_entry,
556 				   mvm->phy_db);
557 
558 	/* Will also start the device */
559 	ret = iwl_mvm_load_ucode_wait_alive(mvm, IWL_UCODE_INIT);
560 	if (ret) {
561 		IWL_ERR(mvm, "Failed to start INIT ucode: %d\n", ret);
562 		goto remove_notif;
563 	}
564 
565 	if (mvm->trans->trans_cfg->device_family < IWL_DEVICE_FAMILY_8000) {
566 		ret = iwl_mvm_send_bt_init_conf(mvm);
567 		if (ret)
568 			goto remove_notif;
569 	}
570 
571 	/* Read the NVM only at driver load time, no need to do this twice */
572 	if (read_nvm) {
573 		ret = iwl_nvm_init(mvm);
574 		if (ret) {
575 			IWL_ERR(mvm, "Failed to read NVM: %d\n", ret);
576 			goto remove_notif;
577 		}
578 	}
579 
580 	/* In case we read the NVM from external file, load it to the NIC */
581 	if (mvm->nvm_file_name)
582 		iwl_mvm_load_nvm_to_nic(mvm);
583 
584 	WARN_ONCE(mvm->nvm_data->nvm_version < mvm->trans->cfg->nvm_ver,
585 		  "Too old NVM version (0x%0x, required = 0x%0x)",
586 		  mvm->nvm_data->nvm_version, mvm->trans->cfg->nvm_ver);
587 
588 	/*
589 	 * abort after reading the nvm in case RF Kill is on, we will complete
590 	 * the init seq later when RF kill will switch to off
591 	 */
592 	if (iwl_mvm_is_radio_hw_killed(mvm)) {
593 		IWL_DEBUG_RF_KILL(mvm,
594 				  "jump over all phy activities due to RF kill\n");
595 		goto remove_notif;
596 	}
597 
598 	mvm->rfkill_safe_init_done = true;
599 
600 	/* Send TX valid antennas before triggering calibrations */
601 	ret = iwl_send_tx_ant_cfg(mvm, iwl_mvm_get_valid_tx_ant(mvm));
602 	if (ret)
603 		goto remove_notif;
604 
605 	ret = iwl_send_phy_cfg_cmd(mvm);
606 	if (ret) {
607 		IWL_ERR(mvm, "Failed to run INIT calibrations: %d\n",
608 			ret);
609 		goto remove_notif;
610 	}
611 
612 	/*
613 	 * Some things may run in the background now, but we
614 	 * just wait for the calibration complete notification.
615 	 */
616 	ret = iwl_wait_notification(&mvm->notif_wait, &calib_wait,
617 				    MVM_UCODE_CALIB_TIMEOUT);
618 	if (!ret)
619 		goto out;
620 
621 	if (iwl_mvm_is_radio_hw_killed(mvm)) {
622 		IWL_DEBUG_RF_KILL(mvm, "RFKILL while calibrating.\n");
623 		ret = 0;
624 	} else {
625 		IWL_ERR(mvm, "Failed to run INIT calibrations: %d\n",
626 			ret);
627 	}
628 
629 	goto out;
630 
631 remove_notif:
632 	iwl_remove_notification(&mvm->notif_wait, &calib_wait);
633 out:
634 	mvm->rfkill_safe_init_done = false;
635 	if (iwlmvm_mod_params.init_dbg && !mvm->nvm_data) {
636 		/* we want to debug INIT and we have no NVM - fake */
637 		mvm->nvm_data = kzalloc(sizeof(struct iwl_nvm_data) +
638 					sizeof(struct ieee80211_channel) +
639 					sizeof(struct ieee80211_rate),
640 					GFP_KERNEL);
641 		if (!mvm->nvm_data)
642 			return -ENOMEM;
643 		mvm->nvm_data->bands[0].channels = mvm->nvm_data->channels;
644 		mvm->nvm_data->bands[0].n_channels = 1;
645 		mvm->nvm_data->bands[0].n_bitrates = 1;
646 		mvm->nvm_data->bands[0].bitrates =
647 			(void *)mvm->nvm_data->channels + 1;
648 		mvm->nvm_data->bands[0].bitrates->hw_value = 10;
649 	}
650 
651 	return ret;
652 }
653 
654 static int iwl_mvm_config_ltr(struct iwl_mvm *mvm)
655 {
656 	struct iwl_ltr_config_cmd cmd = {
657 		.flags = cpu_to_le32(LTR_CFG_FLAG_FEATURE_ENABLE),
658 	};
659 
660 	if (!mvm->trans->ltr_enabled)
661 		return 0;
662 
663 	return iwl_mvm_send_cmd_pdu(mvm, LTR_CONFIG, 0,
664 				    sizeof(cmd), &cmd);
665 }
666 
667 #ifdef CONFIG_ACPI
668 static inline int iwl_mvm_sar_set_profile(struct iwl_mvm *mvm,
669 					  union acpi_object *table,
670 					  struct iwl_mvm_sar_profile *profile,
671 					  bool enabled)
672 {
673 	int i;
674 
675 	profile->enabled = enabled;
676 
677 	for (i = 0; i < ACPI_SAR_TABLE_SIZE; i++) {
678 		if ((table[i].type != ACPI_TYPE_INTEGER) ||
679 		    (table[i].integer.value > U8_MAX))
680 			return -EINVAL;
681 
682 		profile->table[i] = table[i].integer.value;
683 	}
684 
685 	return 0;
686 }
687 
688 static int iwl_mvm_sar_get_wrds_table(struct iwl_mvm *mvm)
689 {
690 	union acpi_object *wifi_pkg, *table, *data;
691 	bool enabled;
692 	int ret, tbl_rev;
693 
694 	data = iwl_acpi_get_object(mvm->dev, ACPI_WRDS_METHOD);
695 	if (IS_ERR(data))
696 		return PTR_ERR(data);
697 
698 	wifi_pkg = iwl_acpi_get_wifi_pkg(mvm->dev, data,
699 					 ACPI_WRDS_WIFI_DATA_SIZE, &tbl_rev);
700 	if (IS_ERR(wifi_pkg)) {
701 		ret = PTR_ERR(wifi_pkg);
702 		goto out_free;
703 	}
704 
705 	if (wifi_pkg->package.elements[1].type != ACPI_TYPE_INTEGER ||
706 	    tbl_rev != 0) {
707 		ret = -EINVAL;
708 		goto out_free;
709 	}
710 
711 	enabled = !!(wifi_pkg->package.elements[1].integer.value);
712 
713 	/* position of the actual table */
714 	table = &wifi_pkg->package.elements[2];
715 
716 	/* The profile from WRDS is officially profile 1, but goes
717 	 * into sar_profiles[0] (because we don't have a profile 0).
718 	 */
719 	ret = iwl_mvm_sar_set_profile(mvm, table, &mvm->sar_profiles[0],
720 				      enabled);
721 out_free:
722 	kfree(data);
723 	return ret;
724 }
725 
726 static int iwl_mvm_sar_get_ewrd_table(struct iwl_mvm *mvm)
727 {
728 	union acpi_object *wifi_pkg, *data;
729 	bool enabled;
730 	int i, n_profiles, ret, tbl_rev;
731 
732 	data = iwl_acpi_get_object(mvm->dev, ACPI_EWRD_METHOD);
733 	if (IS_ERR(data))
734 		return PTR_ERR(data);
735 
736 	wifi_pkg = iwl_acpi_get_wifi_pkg(mvm->dev, data,
737 					 ACPI_EWRD_WIFI_DATA_SIZE, &tbl_rev);
738 	if (IS_ERR(wifi_pkg)) {
739 		ret = PTR_ERR(wifi_pkg);
740 		goto out_free;
741 	}
742 
743 	if ((wifi_pkg->package.elements[1].type != ACPI_TYPE_INTEGER) ||
744 	    (wifi_pkg->package.elements[2].type != ACPI_TYPE_INTEGER) ||
745 	    tbl_rev != 0) {
746 		ret = -EINVAL;
747 		goto out_free;
748 	}
749 
750 	enabled = !!(wifi_pkg->package.elements[1].integer.value);
751 	n_profiles = wifi_pkg->package.elements[2].integer.value;
752 
753 	/*
754 	 * Check the validity of n_profiles.  The EWRD profiles start
755 	 * from index 1, so the maximum value allowed here is
756 	 * ACPI_SAR_PROFILES_NUM - 1.
757 	 */
758 	if (n_profiles <= 0 || n_profiles >= ACPI_SAR_PROFILE_NUM) {
759 		ret = -EINVAL;
760 		goto out_free;
761 	}
762 
763 	for (i = 0; i < n_profiles; i++) {
764 		/* the tables start at element 3 */
765 		int pos = 3;
766 
767 		/* The EWRD profiles officially go from 2 to 4, but we
768 		 * save them in sar_profiles[1-3] (because we don't
769 		 * have profile 0).  So in the array we start from 1.
770 		 */
771 		ret = iwl_mvm_sar_set_profile(mvm,
772 					      &wifi_pkg->package.elements[pos],
773 					      &mvm->sar_profiles[i + 1],
774 					      enabled);
775 		if (ret < 0)
776 			break;
777 
778 		/* go to the next table */
779 		pos += ACPI_SAR_TABLE_SIZE;
780 	}
781 
782 out_free:
783 	kfree(data);
784 	return ret;
785 }
786 
787 static int iwl_mvm_sar_get_wgds_table(struct iwl_mvm *mvm)
788 {
789 	union acpi_object *wifi_pkg, *data;
790 	int i, j, ret, tbl_rev;
791 	int idx = 1;
792 
793 	data = iwl_acpi_get_object(mvm->dev, ACPI_WGDS_METHOD);
794 	if (IS_ERR(data))
795 		return PTR_ERR(data);
796 
797 	wifi_pkg = iwl_acpi_get_wifi_pkg(mvm->dev, data,
798 					 ACPI_WGDS_WIFI_DATA_SIZE, &tbl_rev);
799 	if (IS_ERR(wifi_pkg)) {
800 		ret = PTR_ERR(wifi_pkg);
801 		goto out_free;
802 	}
803 
804 	if (tbl_rev != 0) {
805 		ret = -EINVAL;
806 		goto out_free;
807 	}
808 
809 	mvm->geo_rev = tbl_rev;
810 	for (i = 0; i < ACPI_NUM_GEO_PROFILES; i++) {
811 		for (j = 0; j < ACPI_GEO_TABLE_SIZE; j++) {
812 			union acpi_object *entry;
813 
814 			entry = &wifi_pkg->package.elements[idx++];
815 			if ((entry->type != ACPI_TYPE_INTEGER) ||
816 			    (entry->integer.value > U8_MAX)) {
817 				ret = -EINVAL;
818 				goto out_free;
819 			}
820 
821 			mvm->geo_profiles[i].values[j] = entry->integer.value;
822 		}
823 	}
824 	ret = 0;
825 out_free:
826 	kfree(data);
827 	return ret;
828 }
829 
830 int iwl_mvm_sar_select_profile(struct iwl_mvm *mvm, int prof_a, int prof_b)
831 {
832 	union {
833 		struct iwl_dev_tx_power_cmd v5;
834 		struct iwl_dev_tx_power_cmd_v4 v4;
835 	} cmd;
836 	int i, j, idx;
837 	int profs[ACPI_SAR_NUM_CHAIN_LIMITS] = { prof_a, prof_b };
838 	int len;
839 
840 	BUILD_BUG_ON(ACPI_SAR_NUM_CHAIN_LIMITS < 2);
841 	BUILD_BUG_ON(ACPI_SAR_NUM_CHAIN_LIMITS * ACPI_SAR_NUM_SUB_BANDS !=
842 		     ACPI_SAR_TABLE_SIZE);
843 
844 	cmd.v5.v3.set_mode = cpu_to_le32(IWL_TX_POWER_MODE_SET_CHAINS);
845 
846 	if (fw_has_api(&mvm->fw->ucode_capa,
847 		       IWL_UCODE_TLV_API_REDUCE_TX_POWER))
848 		len = sizeof(cmd.v5);
849 	else if (fw_has_capa(&mvm->fw->ucode_capa,
850 			     IWL_UCODE_TLV_CAPA_TX_POWER_ACK))
851 		len = sizeof(cmd.v4);
852 	else
853 		len = sizeof(cmd.v4.v3);
854 
855 	for (i = 0; i < ACPI_SAR_NUM_CHAIN_LIMITS; i++) {
856 		struct iwl_mvm_sar_profile *prof;
857 
858 		/* don't allow SAR to be disabled (profile 0 means disable) */
859 		if (profs[i] == 0)
860 			return -EPERM;
861 
862 		/* we are off by one, so allow up to ACPI_SAR_PROFILE_NUM */
863 		if (profs[i] > ACPI_SAR_PROFILE_NUM)
864 			return -EINVAL;
865 
866 		/* profiles go from 1 to 4, so decrement to access the array */
867 		prof = &mvm->sar_profiles[profs[i] - 1];
868 
869 		/* if the profile is disabled, do nothing */
870 		if (!prof->enabled) {
871 			IWL_DEBUG_RADIO(mvm, "SAR profile %d is disabled.\n",
872 					profs[i]);
873 			/* if one of the profiles is disabled, we fail all */
874 			return -ENOENT;
875 		}
876 
877 		IWL_DEBUG_INFO(mvm,
878 			       "SAR EWRD: chain %d profile index %d\n",
879 			       i, profs[i]);
880 		IWL_DEBUG_RADIO(mvm, "  Chain[%d]:\n", i);
881 		for (j = 0; j < ACPI_SAR_NUM_SUB_BANDS; j++) {
882 			idx = (i * ACPI_SAR_NUM_SUB_BANDS) + j;
883 			cmd.v5.v3.per_chain_restriction[i][j] =
884 				cpu_to_le16(prof->table[idx]);
885 			IWL_DEBUG_RADIO(mvm, "    Band[%d] = %d * .125dBm\n",
886 					j, prof->table[idx]);
887 		}
888 	}
889 
890 	IWL_DEBUG_RADIO(mvm, "Sending REDUCE_TX_POWER_CMD per chain\n");
891 
892 	return iwl_mvm_send_cmd_pdu(mvm, REDUCE_TX_POWER_CMD, 0, len, &cmd);
893 }
894 
895 static bool iwl_mvm_sar_geo_support(struct iwl_mvm *mvm)
896 {
897 	/*
898 	 * The GEO_TX_POWER_LIMIT command is not supported on earlier
899 	 * firmware versions.  Unfortunately, we don't have a TLV API
900 	 * flag to rely on, so rely on the major version which is in
901 	 * the first byte of ucode_ver.  This was implemented
902 	 * initially on version 38 and then backported to 17.  It was
903 	 * also backported to 29, but only for 7265D devices.  The
904 	 * intention was to have it in 36 as well, but not all 8000
905 	 * family got this feature enabled.  The 8000 family is the
906 	 * only one using version 36, so skip this version entirely.
907 	 */
908 	return IWL_UCODE_SERIAL(mvm->fw->ucode_ver) >= 38 ||
909 	       IWL_UCODE_SERIAL(mvm->fw->ucode_ver) == 17 ||
910 	       (IWL_UCODE_SERIAL(mvm->fw->ucode_ver) == 29 &&
911 		((mvm->trans->hw_rev & CSR_HW_REV_TYPE_MSK) ==
912 		 CSR_HW_REV_TYPE_7265D));
913 }
914 
915 int iwl_mvm_get_sar_geo_profile(struct iwl_mvm *mvm)
916 {
917 	struct iwl_geo_tx_power_profiles_resp *resp;
918 	int ret;
919 	u16 len;
920 	void *data;
921 	struct iwl_geo_tx_power_profiles_cmd geo_cmd;
922 	struct iwl_geo_tx_power_profiles_cmd_v1 geo_cmd_v1;
923 	struct iwl_host_cmd cmd;
924 
925 	if (fw_has_api(&mvm->fw->ucode_capa, IWL_UCODE_TLV_API_SAR_TABLE_VER)) {
926 		geo_cmd.ops =
927 			cpu_to_le32(IWL_PER_CHAIN_OFFSET_GET_CURRENT_TABLE);
928 		len = sizeof(geo_cmd);
929 		data = &geo_cmd;
930 	} else {
931 		geo_cmd_v1.ops =
932 			cpu_to_le32(IWL_PER_CHAIN_OFFSET_GET_CURRENT_TABLE);
933 		len = sizeof(geo_cmd_v1);
934 		data = &geo_cmd_v1;
935 	}
936 
937 	cmd = (struct iwl_host_cmd){
938 		.id =  WIDE_ID(PHY_OPS_GROUP, GEO_TX_POWER_LIMIT),
939 		.len = { len, },
940 		.flags = CMD_WANT_SKB,
941 		.data = { data },
942 	};
943 
944 	if (!iwl_mvm_sar_geo_support(mvm))
945 		return -EOPNOTSUPP;
946 
947 	ret = iwl_mvm_send_cmd(mvm, &cmd);
948 	if (ret) {
949 		IWL_ERR(mvm, "Failed to get geographic profile info %d\n", ret);
950 		return ret;
951 	}
952 
953 	resp = (void *)cmd.resp_pkt->data;
954 	ret = le32_to_cpu(resp->profile_idx);
955 	if (WARN_ON(ret > ACPI_NUM_GEO_PROFILES)) {
956 		ret = -EIO;
957 		IWL_WARN(mvm, "Invalid geographic profile idx (%d)\n", ret);
958 	}
959 
960 	iwl_free_resp(&cmd);
961 	return ret;
962 }
963 
964 static int iwl_mvm_sar_geo_init(struct iwl_mvm *mvm)
965 {
966 	struct iwl_geo_tx_power_profiles_cmd cmd = {
967 		.ops = cpu_to_le32(IWL_PER_CHAIN_OFFSET_SET_TABLES),
968 	};
969 	int ret, i, j;
970 	u16 cmd_wide_id =  WIDE_ID(PHY_OPS_GROUP, GEO_TX_POWER_LIMIT);
971 
972 	if (!iwl_mvm_sar_geo_support(mvm))
973 		return 0;
974 
975 	ret = iwl_mvm_sar_get_wgds_table(mvm);
976 	if (ret < 0) {
977 		IWL_DEBUG_RADIO(mvm,
978 				"Geo SAR BIOS table invalid or unavailable. (%d)\n",
979 				ret);
980 		/* we don't fail if the table is not available */
981 		return 0;
982 	}
983 
984 	IWL_DEBUG_RADIO(mvm, "Sending GEO_TX_POWER_LIMIT\n");
985 
986 	BUILD_BUG_ON(ACPI_NUM_GEO_PROFILES * ACPI_WGDS_NUM_BANDS *
987 		     ACPI_WGDS_TABLE_SIZE + 1 !=  ACPI_WGDS_WIFI_DATA_SIZE);
988 
989 	BUILD_BUG_ON(ACPI_NUM_GEO_PROFILES > IWL_NUM_GEO_PROFILES);
990 
991 	for (i = 0; i < ACPI_NUM_GEO_PROFILES; i++) {
992 		struct iwl_per_chain_offset *chain =
993 			(struct iwl_per_chain_offset *)&cmd.table[i];
994 
995 		for (j = 0; j < ACPI_WGDS_NUM_BANDS; j++) {
996 			u8 *value;
997 
998 			value = &mvm->geo_profiles[i].values[j *
999 				ACPI_GEO_PER_CHAIN_SIZE];
1000 			chain[j].max_tx_power = cpu_to_le16(value[0]);
1001 			chain[j].chain_a = value[1];
1002 			chain[j].chain_b = value[2];
1003 			IWL_DEBUG_RADIO(mvm,
1004 					"SAR geographic profile[%d] Band[%d]: chain A = %d chain B = %d max_tx_power = %d\n",
1005 					i, j, value[1], value[2], value[0]);
1006 		}
1007 	}
1008 
1009 	cmd.table_revision = cpu_to_le32(mvm->geo_rev);
1010 
1011 	if (!fw_has_api(&mvm->fw->ucode_capa,
1012 		       IWL_UCODE_TLV_API_SAR_TABLE_VER)) {
1013 		return iwl_mvm_send_cmd_pdu(mvm, cmd_wide_id, 0,
1014 				sizeof(struct iwl_geo_tx_power_profiles_cmd_v1),
1015 				&cmd);
1016 	}
1017 
1018 	return iwl_mvm_send_cmd_pdu(mvm, cmd_wide_id, 0, sizeof(cmd), &cmd);
1019 }
1020 
1021 static int iwl_mvm_get_ppag_table(struct iwl_mvm *mvm)
1022 {
1023 	union acpi_object *wifi_pkg, *data, *enabled;
1024 	int i, j, ret, tbl_rev;
1025 	int idx = 2;
1026 
1027 	mvm->ppag_table.enabled = cpu_to_le32(0);
1028 	data = iwl_acpi_get_object(mvm->dev, ACPI_PPAG_METHOD);
1029 	if (IS_ERR(data))
1030 		return PTR_ERR(data);
1031 
1032 	wifi_pkg = iwl_acpi_get_wifi_pkg(mvm->dev, data,
1033 					 ACPI_PPAG_WIFI_DATA_SIZE, &tbl_rev);
1034 
1035 	if (IS_ERR(wifi_pkg)) {
1036 		ret = PTR_ERR(wifi_pkg);
1037 		goto out_free;
1038 	}
1039 
1040 	if (tbl_rev != 0) {
1041 		ret = -EINVAL;
1042 		goto out_free;
1043 	}
1044 
1045 	enabled = &wifi_pkg->package.elements[1];
1046 	if (enabled->type != ACPI_TYPE_INTEGER ||
1047 	    (enabled->integer.value != 0 && enabled->integer.value != 1)) {
1048 		ret = -EINVAL;
1049 		goto out_free;
1050 	}
1051 
1052 	mvm->ppag_table.enabled = cpu_to_le32(enabled->integer.value);
1053 	if (!mvm->ppag_table.enabled) {
1054 		ret = 0;
1055 		goto out_free;
1056 	}
1057 
1058 	/*
1059 	 * read, verify gain values and save them into the PPAG table.
1060 	 * first sub-band (j=0) corresponds to Low-Band (2.4GHz), and the
1061 	 * following sub-bands to High-Band (5GHz).
1062 	 */
1063 	for (i = 0; i < ACPI_PPAG_NUM_CHAINS; i++) {
1064 		for (j = 0; j < ACPI_PPAG_NUM_SUB_BANDS; j++) {
1065 			union acpi_object *ent;
1066 
1067 			ent = &wifi_pkg->package.elements[idx++];
1068 			if (ent->type != ACPI_TYPE_INTEGER ||
1069 			    (j == 0 && ent->integer.value > ACPI_PPAG_MAX_LB) ||
1070 			    (j == 0 && ent->integer.value < ACPI_PPAG_MIN_LB) ||
1071 			    (j != 0 && ent->integer.value > ACPI_PPAG_MAX_HB) ||
1072 			    (j != 0 && ent->integer.value < ACPI_PPAG_MIN_HB)) {
1073 				mvm->ppag_table.enabled = cpu_to_le32(0);
1074 				ret = -EINVAL;
1075 				goto out_free;
1076 			}
1077 			mvm->ppag_table.gain[i][j] = ent->integer.value;
1078 		}
1079 	}
1080 	ret = 0;
1081 out_free:
1082 	kfree(data);
1083 	return ret;
1084 }
1085 
1086 int iwl_mvm_ppag_send_cmd(struct iwl_mvm *mvm)
1087 {
1088 	int i, j, ret;
1089 
1090 	if (!fw_has_capa(&mvm->fw->ucode_capa, IWL_UCODE_TLV_CAPA_SET_PPAG)) {
1091 		IWL_DEBUG_RADIO(mvm,
1092 				"PPAG capability not supported by FW, command not sent.\n");
1093 		return 0;
1094 	}
1095 
1096 	IWL_DEBUG_RADIO(mvm, "Sending PER_PLATFORM_ANT_GAIN_CMD\n");
1097 	IWL_DEBUG_RADIO(mvm, "PPAG is %s\n",
1098 			mvm->ppag_table.enabled ? "enabled" : "disabled");
1099 
1100 	for (i = 0; i < ACPI_PPAG_NUM_CHAINS; i++) {
1101 		for (j = 0; j < ACPI_PPAG_NUM_SUB_BANDS; j++) {
1102 			IWL_DEBUG_RADIO(mvm,
1103 					"PPAG table: chain[%d] band[%d]: gain = %d\n",
1104 					i, j, mvm->ppag_table.gain[i][j]);
1105 		}
1106 	}
1107 
1108 	ret = iwl_mvm_send_cmd_pdu(mvm, WIDE_ID(PHY_OPS_GROUP,
1109 						PER_PLATFORM_ANT_GAIN_CMD),
1110 				   0, sizeof(mvm->ppag_table),
1111 				   &mvm->ppag_table);
1112 	if (ret < 0)
1113 		IWL_ERR(mvm, "failed to send PER_PLATFORM_ANT_GAIN_CMD (%d)\n",
1114 			ret);
1115 
1116 	return ret;
1117 }
1118 
1119 static int iwl_mvm_ppag_init(struct iwl_mvm *mvm)
1120 {
1121 	int ret;
1122 
1123 	ret = iwl_mvm_get_ppag_table(mvm);
1124 	if (ret < 0) {
1125 		IWL_DEBUG_RADIO(mvm,
1126 				"PPAG BIOS table invalid or unavailable. (%d)\n",
1127 				ret);
1128 		return 0;
1129 	}
1130 	return iwl_mvm_ppag_send_cmd(mvm);
1131 }
1132 
1133 #else /* CONFIG_ACPI */
1134 static int iwl_mvm_sar_get_wrds_table(struct iwl_mvm *mvm)
1135 {
1136 	return -ENOENT;
1137 }
1138 
1139 static int iwl_mvm_sar_get_ewrd_table(struct iwl_mvm *mvm)
1140 {
1141 	return -ENOENT;
1142 }
1143 
1144 static int iwl_mvm_sar_get_wgds_table(struct iwl_mvm *mvm)
1145 {
1146 	return -ENOENT;
1147 }
1148 
1149 static int iwl_mvm_sar_geo_init(struct iwl_mvm *mvm)
1150 {
1151 	return 0;
1152 }
1153 
1154 int iwl_mvm_sar_select_profile(struct iwl_mvm *mvm, int prof_a,
1155 			       int prof_b)
1156 {
1157 	return -ENOENT;
1158 }
1159 
1160 int iwl_mvm_get_sar_geo_profile(struct iwl_mvm *mvm)
1161 {
1162 	return -ENOENT;
1163 }
1164 
1165 int iwl_mvm_ppag_send_cmd(struct iwl_mvm *mvm)
1166 {
1167 	return -ENOENT;
1168 }
1169 
1170 static int iwl_mvm_ppag_init(struct iwl_mvm *mvm)
1171 {
1172 	return -ENOENT;
1173 }
1174 #endif /* CONFIG_ACPI */
1175 
1176 void iwl_mvm_send_recovery_cmd(struct iwl_mvm *mvm, u32 flags)
1177 {
1178 	u32 error_log_size = mvm->fw->ucode_capa.error_log_size;
1179 	int ret;
1180 	u32 resp;
1181 
1182 	struct iwl_fw_error_recovery_cmd recovery_cmd = {
1183 		.flags = cpu_to_le32(flags),
1184 		.buf_size = 0,
1185 	};
1186 	struct iwl_host_cmd host_cmd = {
1187 		.id = WIDE_ID(SYSTEM_GROUP, FW_ERROR_RECOVERY_CMD),
1188 		.flags = CMD_WANT_SKB,
1189 		.data = {&recovery_cmd, },
1190 		.len = {sizeof(recovery_cmd), },
1191 	};
1192 
1193 	/* no error log was defined in TLV */
1194 	if (!error_log_size)
1195 		return;
1196 
1197 	if (flags & ERROR_RECOVERY_UPDATE_DB) {
1198 		/* no buf was allocated while HW reset */
1199 		if (!mvm->error_recovery_buf)
1200 			return;
1201 
1202 		host_cmd.data[1] = mvm->error_recovery_buf;
1203 		host_cmd.len[1] =  error_log_size;
1204 		host_cmd.dataflags[1] = IWL_HCMD_DFL_NOCOPY;
1205 		recovery_cmd.buf_size = cpu_to_le32(error_log_size);
1206 	}
1207 
1208 	ret = iwl_mvm_send_cmd(mvm, &host_cmd);
1209 	kfree(mvm->error_recovery_buf);
1210 	mvm->error_recovery_buf = NULL;
1211 
1212 	if (ret) {
1213 		IWL_ERR(mvm, "Failed to send recovery cmd %d\n", ret);
1214 		return;
1215 	}
1216 
1217 	/* skb respond is only relevant in ERROR_RECOVERY_UPDATE_DB */
1218 	if (flags & ERROR_RECOVERY_UPDATE_DB) {
1219 		resp = le32_to_cpu(*(__le32 *)host_cmd.resp_pkt->data);
1220 		if (resp)
1221 			IWL_ERR(mvm,
1222 				"Failed to send recovery cmd blob was invalid %d\n",
1223 				resp);
1224 	}
1225 }
1226 
1227 static int iwl_mvm_sar_init(struct iwl_mvm *mvm)
1228 {
1229 	int ret;
1230 
1231 	ret = iwl_mvm_sar_get_wrds_table(mvm);
1232 	if (ret < 0) {
1233 		IWL_DEBUG_RADIO(mvm,
1234 				"WRDS SAR BIOS table invalid or unavailable. (%d)\n",
1235 				ret);
1236 		/*
1237 		 * If not available, don't fail and don't bother with EWRD.
1238 		 * Return 1 to tell that we can't use WGDS either.
1239 		 */
1240 		return 1;
1241 	}
1242 
1243 	ret = iwl_mvm_sar_get_ewrd_table(mvm);
1244 	/* if EWRD is not available, we can still use WRDS, so don't fail */
1245 	if (ret < 0)
1246 		IWL_DEBUG_RADIO(mvm,
1247 				"EWRD SAR BIOS table invalid or unavailable. (%d)\n",
1248 				ret);
1249 
1250 	/* choose profile 1 (WRDS) as default for both chains */
1251 	ret = iwl_mvm_sar_select_profile(mvm, 1, 1);
1252 
1253 	/*
1254 	 * If we don't have profile 0 from BIOS, just skip it.  This
1255 	 * means that SAR Geo will not be enabled either, even if we
1256 	 * have other valid profiles.
1257 	 */
1258 	if (ret == -ENOENT)
1259 		return 1;
1260 
1261 	return ret;
1262 }
1263 
1264 static int iwl_mvm_load_rt_fw(struct iwl_mvm *mvm)
1265 {
1266 	int ret;
1267 
1268 	if (iwl_mvm_has_unified_ucode(mvm))
1269 		return iwl_run_unified_mvm_ucode(mvm, false);
1270 
1271 	ret = iwl_run_init_mvm_ucode(mvm, false);
1272 
1273 	if (ret) {
1274 		IWL_ERR(mvm, "Failed to run INIT ucode: %d\n", ret);
1275 
1276 		if (iwlmvm_mod_params.init_dbg)
1277 			return 0;
1278 		return ret;
1279 	}
1280 
1281 	iwl_fw_dbg_stop_sync(&mvm->fwrt);
1282 	iwl_trans_stop_device(mvm->trans);
1283 	ret = iwl_trans_start_hw(mvm->trans);
1284 	if (ret)
1285 		return ret;
1286 
1287 	iwl_dbg_tlv_time_point(&mvm->fwrt, IWL_FW_INI_TIME_POINT_EARLY, NULL);
1288 
1289 	mvm->rfkill_safe_init_done = false;
1290 	ret = iwl_mvm_load_ucode_wait_alive(mvm, IWL_UCODE_REGULAR);
1291 	if (ret)
1292 		return ret;
1293 
1294 	mvm->rfkill_safe_init_done = true;
1295 
1296 	iwl_dbg_tlv_time_point(&mvm->fwrt, IWL_FW_INI_TIME_POINT_AFTER_ALIVE,
1297 			       NULL);
1298 
1299 	return iwl_init_paging(&mvm->fwrt, mvm->fwrt.cur_fw_img);
1300 }
1301 
1302 int iwl_mvm_up(struct iwl_mvm *mvm)
1303 {
1304 	int ret, i;
1305 	struct ieee80211_channel *chan;
1306 	struct cfg80211_chan_def chandef;
1307 	struct ieee80211_supported_band *sband = NULL;
1308 
1309 	lockdep_assert_held(&mvm->mutex);
1310 
1311 	ret = iwl_trans_start_hw(mvm->trans);
1312 	if (ret)
1313 		return ret;
1314 
1315 	ret = iwl_mvm_load_rt_fw(mvm);
1316 	if (ret) {
1317 		IWL_ERR(mvm, "Failed to start RT ucode: %d\n", ret);
1318 		if (ret != -ERFKILL)
1319 			iwl_fw_dbg_error_collect(&mvm->fwrt,
1320 						 FW_DBG_TRIGGER_DRIVER);
1321 		goto error;
1322 	}
1323 
1324 	iwl_get_shared_mem_conf(&mvm->fwrt);
1325 
1326 	ret = iwl_mvm_sf_update(mvm, NULL, false);
1327 	if (ret)
1328 		IWL_ERR(mvm, "Failed to initialize Smart Fifo\n");
1329 
1330 	if (!iwl_trans_dbg_ini_valid(mvm->trans)) {
1331 		mvm->fwrt.dump.conf = FW_DBG_INVALID;
1332 		/* if we have a destination, assume EARLY START */
1333 		if (mvm->fw->dbg.dest_tlv)
1334 			mvm->fwrt.dump.conf = FW_DBG_START_FROM_ALIVE;
1335 		iwl_fw_start_dbg_conf(&mvm->fwrt, FW_DBG_START_FROM_ALIVE);
1336 	}
1337 
1338 	ret = iwl_send_tx_ant_cfg(mvm, iwl_mvm_get_valid_tx_ant(mvm));
1339 	if (ret)
1340 		goto error;
1341 
1342 	if (!iwl_mvm_has_unified_ucode(mvm)) {
1343 		/* Send phy db control command and then phy db calibration */
1344 		ret = iwl_send_phy_db_data(mvm->phy_db);
1345 		if (ret)
1346 			goto error;
1347 
1348 		ret = iwl_send_phy_cfg_cmd(mvm);
1349 		if (ret)
1350 			goto error;
1351 	}
1352 
1353 	ret = iwl_mvm_send_bt_init_conf(mvm);
1354 	if (ret)
1355 		goto error;
1356 
1357 	/* Init RSS configuration */
1358 	if (mvm->trans->trans_cfg->device_family >= IWL_DEVICE_FAMILY_22000) {
1359 		ret = iwl_configure_rxq(mvm);
1360 		if (ret) {
1361 			IWL_ERR(mvm, "Failed to configure RX queues: %d\n",
1362 				ret);
1363 			goto error;
1364 		}
1365 	}
1366 
1367 	if (iwl_mvm_has_new_rx_api(mvm)) {
1368 		ret = iwl_send_rss_cfg_cmd(mvm);
1369 		if (ret) {
1370 			IWL_ERR(mvm, "Failed to configure RSS queues: %d\n",
1371 				ret);
1372 			goto error;
1373 		}
1374 	}
1375 
1376 	/* init the fw <-> mac80211 STA mapping */
1377 	for (i = 0; i < ARRAY_SIZE(mvm->fw_id_to_mac_id); i++)
1378 		RCU_INIT_POINTER(mvm->fw_id_to_mac_id[i], NULL);
1379 
1380 	mvm->tdls_cs.peer.sta_id = IWL_MVM_INVALID_STA;
1381 
1382 	/* reset quota debouncing buffer - 0xff will yield invalid data */
1383 	memset(&mvm->last_quota_cmd, 0xff, sizeof(mvm->last_quota_cmd));
1384 
1385 	if (fw_has_capa(&mvm->fw->ucode_capa, IWL_UCODE_TLV_CAPA_DQA_SUPPORT)) {
1386 		ret = iwl_mvm_send_dqa_cmd(mvm);
1387 		if (ret)
1388 			goto error;
1389 	}
1390 
1391 	/* Add auxiliary station for scanning */
1392 	ret = iwl_mvm_add_aux_sta(mvm);
1393 	if (ret)
1394 		goto error;
1395 
1396 	/* Add all the PHY contexts */
1397 	i = 0;
1398 	while (!sband && i < NUM_NL80211_BANDS)
1399 		sband = mvm->hw->wiphy->bands[i++];
1400 
1401 	if (WARN_ON_ONCE(!sband))
1402 		goto error;
1403 
1404 	chan = &sband->channels[0];
1405 
1406 	cfg80211_chandef_create(&chandef, chan, NL80211_CHAN_NO_HT);
1407 	for (i = 0; i < NUM_PHY_CTX; i++) {
1408 		/*
1409 		 * The channel used here isn't relevant as it's
1410 		 * going to be overwritten in the other flows.
1411 		 * For now use the first channel we have.
1412 		 */
1413 		ret = iwl_mvm_phy_ctxt_add(mvm, &mvm->phy_ctxts[i],
1414 					   &chandef, 1, 1);
1415 		if (ret)
1416 			goto error;
1417 	}
1418 
1419 	if (iwl_mvm_is_tt_in_fw(mvm)) {
1420 		/* in order to give the responsibility of ct-kill and
1421 		 * TX backoff to FW we need to send empty temperature reporting
1422 		 * cmd during init time
1423 		 */
1424 		iwl_mvm_send_temp_report_ths_cmd(mvm);
1425 	} else {
1426 		/* Initialize tx backoffs to the minimal possible */
1427 		iwl_mvm_tt_tx_backoff(mvm, 0);
1428 	}
1429 
1430 #ifdef CONFIG_THERMAL
1431 	/* TODO: read the budget from BIOS / Platform NVM */
1432 
1433 	/*
1434 	 * In case there is no budget from BIOS / Platform NVM the default
1435 	 * budget should be 2000mW (cooling state 0).
1436 	 */
1437 	if (iwl_mvm_is_ctdp_supported(mvm)) {
1438 		ret = iwl_mvm_ctdp_command(mvm, CTDP_CMD_OPERATION_START,
1439 					   mvm->cooling_dev.cur_state);
1440 		if (ret)
1441 			goto error;
1442 	}
1443 #endif
1444 
1445 	if (!fw_has_capa(&mvm->fw->ucode_capa, IWL_UCODE_TLV_CAPA_SET_LTR_GEN2))
1446 		WARN_ON(iwl_mvm_config_ltr(mvm));
1447 
1448 	ret = iwl_mvm_power_update_device(mvm);
1449 	if (ret)
1450 		goto error;
1451 
1452 	/*
1453 	 * RTNL is not taken during Ct-kill, but we don't need to scan/Tx
1454 	 * anyway, so don't init MCC.
1455 	 */
1456 	if (!test_bit(IWL_MVM_STATUS_HW_CTKILL, &mvm->status)) {
1457 		ret = iwl_mvm_init_mcc(mvm);
1458 		if (ret)
1459 			goto error;
1460 	}
1461 
1462 	if (fw_has_capa(&mvm->fw->ucode_capa, IWL_UCODE_TLV_CAPA_UMAC_SCAN)) {
1463 		mvm->scan_type = IWL_SCAN_TYPE_NOT_SET;
1464 		mvm->hb_scan_type = IWL_SCAN_TYPE_NOT_SET;
1465 		ret = iwl_mvm_config_scan(mvm);
1466 		if (ret)
1467 			goto error;
1468 	}
1469 
1470 	if (test_bit(IWL_MVM_STATUS_IN_HW_RESTART, &mvm->status))
1471 		iwl_mvm_send_recovery_cmd(mvm, ERROR_RECOVERY_UPDATE_DB);
1472 
1473 	if (iwl_acpi_get_eckv(mvm->dev, &mvm->ext_clock_valid))
1474 		IWL_DEBUG_INFO(mvm, "ECKV table doesn't exist in BIOS\n");
1475 
1476 	ret = iwl_mvm_ppag_init(mvm);
1477 	if (ret)
1478 		goto error;
1479 
1480 	ret = iwl_mvm_sar_init(mvm);
1481 	if (ret == 0) {
1482 		ret = iwl_mvm_sar_geo_init(mvm);
1483 	} else if (ret > 0 && !iwl_mvm_sar_get_wgds_table(mvm)) {
1484 		/*
1485 		 * If basic SAR is not available, we check for WGDS,
1486 		 * which should *not* be available either.  If it is
1487 		 * available, issue an error, because we can't use SAR
1488 		 * Geo without basic SAR.
1489 		 */
1490 		IWL_ERR(mvm, "BIOS contains WGDS but no WRDS\n");
1491 	}
1492 
1493 	if (ret < 0)
1494 		goto error;
1495 
1496 	iwl_mvm_leds_sync(mvm);
1497 
1498 	IWL_DEBUG_INFO(mvm, "RT uCode started.\n");
1499 	return 0;
1500  error:
1501 	if (!iwlmvm_mod_params.init_dbg || !ret)
1502 		iwl_mvm_stop_device(mvm);
1503 	return ret;
1504 }
1505 
1506 int iwl_mvm_load_d3_fw(struct iwl_mvm *mvm)
1507 {
1508 	int ret, i;
1509 
1510 	lockdep_assert_held(&mvm->mutex);
1511 
1512 	ret = iwl_trans_start_hw(mvm->trans);
1513 	if (ret)
1514 		return ret;
1515 
1516 	ret = iwl_mvm_load_ucode_wait_alive(mvm, IWL_UCODE_WOWLAN);
1517 	if (ret) {
1518 		IWL_ERR(mvm, "Failed to start WoWLAN firmware: %d\n", ret);
1519 		goto error;
1520 	}
1521 
1522 	ret = iwl_send_tx_ant_cfg(mvm, iwl_mvm_get_valid_tx_ant(mvm));
1523 	if (ret)
1524 		goto error;
1525 
1526 	/* Send phy db control command and then phy db calibration*/
1527 	ret = iwl_send_phy_db_data(mvm->phy_db);
1528 	if (ret)
1529 		goto error;
1530 
1531 	ret = iwl_send_phy_cfg_cmd(mvm);
1532 	if (ret)
1533 		goto error;
1534 
1535 	/* init the fw <-> mac80211 STA mapping */
1536 	for (i = 0; i < ARRAY_SIZE(mvm->fw_id_to_mac_id); i++)
1537 		RCU_INIT_POINTER(mvm->fw_id_to_mac_id[i], NULL);
1538 
1539 	/* Add auxiliary station for scanning */
1540 	ret = iwl_mvm_add_aux_sta(mvm);
1541 	if (ret)
1542 		goto error;
1543 
1544 	return 0;
1545  error:
1546 	iwl_mvm_stop_device(mvm);
1547 	return ret;
1548 }
1549 
1550 void iwl_mvm_rx_card_state_notif(struct iwl_mvm *mvm,
1551 				 struct iwl_rx_cmd_buffer *rxb)
1552 {
1553 	struct iwl_rx_packet *pkt = rxb_addr(rxb);
1554 	struct iwl_card_state_notif *card_state_notif = (void *)pkt->data;
1555 	u32 flags = le32_to_cpu(card_state_notif->flags);
1556 
1557 	IWL_DEBUG_RF_KILL(mvm, "Card state received: HW:%s SW:%s CT:%s\n",
1558 			  (flags & HW_CARD_DISABLED) ? "Kill" : "On",
1559 			  (flags & SW_CARD_DISABLED) ? "Kill" : "On",
1560 			  (flags & CT_KILL_CARD_DISABLED) ?
1561 			  "Reached" : "Not reached");
1562 }
1563 
1564 void iwl_mvm_rx_mfuart_notif(struct iwl_mvm *mvm,
1565 			     struct iwl_rx_cmd_buffer *rxb)
1566 {
1567 	struct iwl_rx_packet *pkt = rxb_addr(rxb);
1568 	struct iwl_mfuart_load_notif *mfuart_notif = (void *)pkt->data;
1569 
1570 	IWL_DEBUG_INFO(mvm,
1571 		       "MFUART: installed ver: 0x%08x, external ver: 0x%08x, status: 0x%08x, duration: 0x%08x\n",
1572 		       le32_to_cpu(mfuart_notif->installed_ver),
1573 		       le32_to_cpu(mfuart_notif->external_ver),
1574 		       le32_to_cpu(mfuart_notif->status),
1575 		       le32_to_cpu(mfuart_notif->duration));
1576 
1577 	if (iwl_rx_packet_payload_len(pkt) == sizeof(*mfuart_notif))
1578 		IWL_DEBUG_INFO(mvm,
1579 			       "MFUART: image size: 0x%08x\n",
1580 			       le32_to_cpu(mfuart_notif->image_size));
1581 }
1582