xref: /freebsd/sys/dev/iwm/if_iwm.c (revision d34048812292b714a0bf99967270d18fe3097c62)
1 /*	$OpenBSD: if_iwm.c,v 1.167 2017/04/04 00:40:52 claudio Exp $	*/
2 
3 /*
4  * Copyright (c) 2014 genua mbh <info@genua.de>
5  * Copyright (c) 2014 Fixup Software Ltd.
6  *
7  * Permission to use, copy, modify, and distribute this software for any
8  * purpose with or without fee is hereby granted, provided that the above
9  * copyright notice and this permission notice appear in all copies.
10  *
11  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
12  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
13  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
14  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
15  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
16  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
17  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
18  */
19 
20 /*-
21  * Based on BSD-licensed source modules in the Linux iwlwifi driver,
22  * which were used as the reference documentation for this implementation.
23  *
24  * Driver version we are currently based off of is
25  * Linux 3.14.3 (tag id a2df521e42b1d9a23f620ac79dbfe8655a8391dd)
26  *
27  ***********************************************************************
28  *
29  * This file is provided under a dual BSD/GPLv2 license.  When using or
30  * redistributing this file, you may do so under either license.
31  *
32  * GPL LICENSE SUMMARY
33  *
34  * Copyright(c) 2007 - 2013 Intel Corporation. All rights reserved.
35  *
36  * This program is free software; you can redistribute it and/or modify
37  * it under the terms of version 2 of the GNU General Public License as
38  * published by the Free Software Foundation.
39  *
40  * This program is distributed in the hope that it will be useful, but
41  * WITHOUT ANY WARRANTY; without even the implied warranty of
42  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
43  * General Public License for more details.
44  *
45  * You should have received a copy of the GNU General Public License
46  * along with this program; if not, write to the Free Software
47  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110,
48  * USA
49  *
50  * The full GNU General Public License is included in this distribution
51  * in the file called COPYING.
52  *
53  * Contact Information:
54  *  Intel Linux Wireless <ilw@linux.intel.com>
55  * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
56  *
57  *
58  * BSD LICENSE
59  *
60  * Copyright(c) 2005 - 2013 Intel Corporation. All rights reserved.
61  * All rights reserved.
62  *
63  * Redistribution and use in source and binary forms, with or without
64  * modification, are permitted provided that the following conditions
65  * are met:
66  *
67  *  * Redistributions of source code must retain the above copyright
68  *    notice, this list of conditions and the following disclaimer.
69  *  * Redistributions in binary form must reproduce the above copyright
70  *    notice, this list of conditions and the following disclaimer in
71  *    the documentation and/or other materials provided with the
72  *    distribution.
73  *  * Neither the name Intel Corporation nor the names of its
74  *    contributors may be used to endorse or promote products derived
75  *    from this software without specific prior written permission.
76  *
77  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
78  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
79  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
80  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
81  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
82  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
83  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
84  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
85  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
86  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
87  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
88  */
89 
90 /*-
91  * Copyright (c) 2007-2010 Damien Bergamini <damien.bergamini@free.fr>
92  *
93  * Permission to use, copy, modify, and distribute this software for any
94  * purpose with or without fee is hereby granted, provided that the above
95  * copyright notice and this permission notice appear in all copies.
96  *
97  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
98  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
99  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
100  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
101  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
102  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
103  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
104  */
105 #include <sys/cdefs.h>
106 __FBSDID("$FreeBSD$");
107 
108 #include "opt_wlan.h"
109 #include "opt_iwm.h"
110 
111 #include <sys/param.h>
112 #include <sys/bus.h>
113 #include <sys/conf.h>
114 #include <sys/endian.h>
115 #include <sys/firmware.h>
116 #include <sys/kernel.h>
117 #include <sys/malloc.h>
118 #include <sys/mbuf.h>
119 #include <sys/mutex.h>
120 #include <sys/module.h>
121 #include <sys/proc.h>
122 #include <sys/rman.h>
123 #include <sys/socket.h>
124 #include <sys/sockio.h>
125 #include <sys/sysctl.h>
126 #include <sys/linker.h>
127 
128 #include <machine/bus.h>
129 #include <machine/endian.h>
130 #include <machine/resource.h>
131 
132 #include <dev/pci/pcivar.h>
133 #include <dev/pci/pcireg.h>
134 
135 #include <net/bpf.h>
136 
137 #include <net/if.h>
138 #include <net/if_var.h>
139 #include <net/if_arp.h>
140 #include <net/if_dl.h>
141 #include <net/if_media.h>
142 #include <net/if_types.h>
143 
144 #include <netinet/in.h>
145 #include <netinet/in_systm.h>
146 #include <netinet/if_ether.h>
147 #include <netinet/ip.h>
148 
149 #include <net80211/ieee80211_var.h>
150 #include <net80211/ieee80211_regdomain.h>
151 #include <net80211/ieee80211_ratectl.h>
152 #include <net80211/ieee80211_radiotap.h>
153 
154 #include <dev/iwm/if_iwmreg.h>
155 #include <dev/iwm/if_iwmvar.h>
156 #include <dev/iwm/if_iwm_config.h>
157 #include <dev/iwm/if_iwm_debug.h>
158 #include <dev/iwm/if_iwm_notif_wait.h>
159 #include <dev/iwm/if_iwm_util.h>
160 #include <dev/iwm/if_iwm_binding.h>
161 #include <dev/iwm/if_iwm_phy_db.h>
162 #include <dev/iwm/if_iwm_mac_ctxt.h>
163 #include <dev/iwm/if_iwm_phy_ctxt.h>
164 #include <dev/iwm/if_iwm_time_event.h>
165 #include <dev/iwm/if_iwm_power.h>
166 #include <dev/iwm/if_iwm_scan.h>
167 #include <dev/iwm/if_iwm_sf.h>
168 #include <dev/iwm/if_iwm_sta.h>
169 
170 #include <dev/iwm/if_iwm_pcie_trans.h>
171 #include <dev/iwm/if_iwm_led.h>
172 #include <dev/iwm/if_iwm_fw.h>
173 
174 /* From DragonflyBSD */
175 #define mtodoff(m, t, off)      ((t)((m)->m_data + (off)))
176 
177 const uint8_t iwm_nvm_channels[] = {
178 	/* 2.4 GHz */
179 	1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
180 	/* 5 GHz */
181 	36, 40, 44, 48, 52, 56, 60, 64,
182 	100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140, 144,
183 	149, 153, 157, 161, 165
184 };
185 _Static_assert(nitems(iwm_nvm_channels) <= IWM_NUM_CHANNELS,
186     "IWM_NUM_CHANNELS is too small");
187 
188 const uint8_t iwm_nvm_channels_8000[] = {
189 	/* 2.4 GHz */
190 	1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
191 	/* 5 GHz */
192 	36, 40, 44, 48, 52, 56, 60, 64, 68, 72, 76, 80, 84, 88, 92,
193 	96, 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140, 144,
194 	149, 153, 157, 161, 165, 169, 173, 177, 181
195 };
196 _Static_assert(nitems(iwm_nvm_channels_8000) <= IWM_NUM_CHANNELS_8000,
197     "IWM_NUM_CHANNELS_8000 is too small");
198 
199 #define IWM_NUM_2GHZ_CHANNELS	14
200 #define IWM_N_HW_ADDR_MASK	0xF
201 
202 /*
203  * XXX For now, there's simply a fixed set of rate table entries
204  * that are populated.
205  */
206 const struct iwm_rate {
207 	uint8_t rate;
208 	uint8_t plcp;
209 } iwm_rates[] = {
210 	{   2,	IWM_RATE_1M_PLCP  },
211 	{   4,	IWM_RATE_2M_PLCP  },
212 	{  11,	IWM_RATE_5M_PLCP  },
213 	{  22,	IWM_RATE_11M_PLCP },
214 	{  12,	IWM_RATE_6M_PLCP  },
215 	{  18,	IWM_RATE_9M_PLCP  },
216 	{  24,	IWM_RATE_12M_PLCP },
217 	{  36,	IWM_RATE_18M_PLCP },
218 	{  48,	IWM_RATE_24M_PLCP },
219 	{  72,	IWM_RATE_36M_PLCP },
220 	{  96,	IWM_RATE_48M_PLCP },
221 	{ 108,	IWM_RATE_54M_PLCP },
222 };
223 #define IWM_RIDX_CCK	0
224 #define IWM_RIDX_OFDM	4
225 #define IWM_RIDX_MAX	(nitems(iwm_rates)-1)
226 #define IWM_RIDX_IS_CCK(_i_) ((_i_) < IWM_RIDX_OFDM)
227 #define IWM_RIDX_IS_OFDM(_i_) ((_i_) >= IWM_RIDX_OFDM)
228 
229 struct iwm_nvm_section {
230 	uint16_t length;
231 	uint8_t *data;
232 };
233 
234 #define IWM_MVM_UCODE_ALIVE_TIMEOUT	hz
235 #define IWM_MVM_UCODE_CALIB_TIMEOUT	(2*hz)
236 
237 struct iwm_mvm_alive_data {
238 	int valid;
239 	uint32_t scd_base_addr;
240 };
241 
242 static int	iwm_store_cscheme(struct iwm_softc *, const uint8_t *, size_t);
243 static int	iwm_firmware_store_section(struct iwm_softc *,
244                                            enum iwm_ucode_type,
245                                            const uint8_t *, size_t);
246 static int	iwm_set_default_calib(struct iwm_softc *, const void *);
247 static void	iwm_fw_info_free(struct iwm_fw_info *);
248 static int	iwm_read_firmware(struct iwm_softc *, enum iwm_ucode_type);
249 static int	iwm_alloc_fwmem(struct iwm_softc *);
250 static int	iwm_alloc_sched(struct iwm_softc *);
251 static int	iwm_alloc_kw(struct iwm_softc *);
252 static int	iwm_alloc_ict(struct iwm_softc *);
253 static int	iwm_alloc_rx_ring(struct iwm_softc *, struct iwm_rx_ring *);
254 static void	iwm_reset_rx_ring(struct iwm_softc *, struct iwm_rx_ring *);
255 static void	iwm_free_rx_ring(struct iwm_softc *, struct iwm_rx_ring *);
256 static int	iwm_alloc_tx_ring(struct iwm_softc *, struct iwm_tx_ring *,
257                                   int);
258 static void	iwm_reset_tx_ring(struct iwm_softc *, struct iwm_tx_ring *);
259 static void	iwm_free_tx_ring(struct iwm_softc *, struct iwm_tx_ring *);
260 static void	iwm_enable_interrupts(struct iwm_softc *);
261 static void	iwm_restore_interrupts(struct iwm_softc *);
262 static void	iwm_disable_interrupts(struct iwm_softc *);
263 static void	iwm_ict_reset(struct iwm_softc *);
264 static int	iwm_allow_mcast(struct ieee80211vap *, struct iwm_softc *);
265 static void	iwm_stop_device(struct iwm_softc *);
266 static void	iwm_mvm_nic_config(struct iwm_softc *);
267 static int	iwm_nic_rx_init(struct iwm_softc *);
268 static int	iwm_nic_tx_init(struct iwm_softc *);
269 static int	iwm_nic_init(struct iwm_softc *);
270 static int	iwm_trans_pcie_fw_alive(struct iwm_softc *, uint32_t);
271 static int	iwm_nvm_read_chunk(struct iwm_softc *, uint16_t, uint16_t,
272                                    uint16_t, uint8_t *, uint16_t *);
273 static int	iwm_nvm_read_section(struct iwm_softc *, uint16_t, uint8_t *,
274 				     uint16_t *, uint32_t);
275 static uint32_t	iwm_eeprom_channel_flags(uint16_t);
276 static void	iwm_add_channel_band(struct iwm_softc *,
277 		    struct ieee80211_channel[], int, int *, int, size_t,
278 		    const uint8_t[]);
279 static void	iwm_init_channel_map(struct ieee80211com *, int, int *,
280 		    struct ieee80211_channel[]);
281 static struct iwm_nvm_data *
282 	iwm_parse_nvm_data(struct iwm_softc *, const uint16_t *,
283 			   const uint16_t *, const uint16_t *,
284 			   const uint16_t *, const uint16_t *,
285 			   const uint16_t *);
286 static void	iwm_free_nvm_data(struct iwm_nvm_data *);
287 static void	iwm_set_hw_address_family_8000(struct iwm_softc *,
288 					       struct iwm_nvm_data *,
289 					       const uint16_t *,
290 					       const uint16_t *);
291 static int	iwm_get_sku(const struct iwm_softc *, const uint16_t *,
292 			    const uint16_t *);
293 static int	iwm_get_nvm_version(const struct iwm_softc *, const uint16_t *);
294 static int	iwm_get_radio_cfg(const struct iwm_softc *, const uint16_t *,
295 				  const uint16_t *);
296 static int	iwm_get_n_hw_addrs(const struct iwm_softc *,
297 				   const uint16_t *);
298 static void	iwm_set_radio_cfg(const struct iwm_softc *,
299 				  struct iwm_nvm_data *, uint32_t);
300 static struct iwm_nvm_data *
301 	iwm_parse_nvm_sections(struct iwm_softc *, struct iwm_nvm_section *);
302 static int	iwm_nvm_init(struct iwm_softc *);
303 static int	iwm_pcie_load_section(struct iwm_softc *, uint8_t,
304 				      const struct iwm_fw_desc *);
305 static int	iwm_pcie_load_firmware_chunk(struct iwm_softc *, uint32_t,
306 					     bus_addr_t, uint32_t);
307 static int	iwm_pcie_load_cpu_sections_8000(struct iwm_softc *sc,
308 						const struct iwm_fw_sects *,
309 						int, int *);
310 static int	iwm_pcie_load_cpu_sections(struct iwm_softc *,
311 					   const struct iwm_fw_sects *,
312 					   int, int *);
313 static int	iwm_pcie_load_given_ucode_8000(struct iwm_softc *,
314 					       const struct iwm_fw_sects *);
315 static int	iwm_pcie_load_given_ucode(struct iwm_softc *,
316 					  const struct iwm_fw_sects *);
317 static int	iwm_start_fw(struct iwm_softc *, const struct iwm_fw_sects *);
318 static int	iwm_send_tx_ant_cfg(struct iwm_softc *, uint8_t);
319 static int	iwm_send_phy_cfg_cmd(struct iwm_softc *);
320 static int	iwm_mvm_load_ucode_wait_alive(struct iwm_softc *,
321                                               enum iwm_ucode_type);
322 static int	iwm_run_init_mvm_ucode(struct iwm_softc *, int);
323 static int	iwm_rx_addbuf(struct iwm_softc *, int, int);
324 static int	iwm_mvm_get_signal_strength(struct iwm_softc *,
325 					    struct iwm_rx_phy_info *);
326 static void	iwm_mvm_rx_rx_phy_cmd(struct iwm_softc *,
327                                       struct iwm_rx_packet *);
328 static int	iwm_get_noise(struct iwm_softc *,
329 		    const struct iwm_mvm_statistics_rx_non_phy *);
330 static void	iwm_mvm_handle_rx_statistics(struct iwm_softc *,
331 		    struct iwm_rx_packet *);
332 static boolean_t iwm_mvm_rx_rx_mpdu(struct iwm_softc *, struct mbuf *,
333 				    uint32_t, boolean_t);
334 static int	iwm_mvm_rx_tx_cmd_single(struct iwm_softc *,
335                                          struct iwm_rx_packet *,
336 				         struct iwm_node *);
337 static void	iwm_mvm_rx_tx_cmd(struct iwm_softc *, struct iwm_rx_packet *);
338 static void	iwm_cmd_done(struct iwm_softc *, struct iwm_rx_packet *);
339 #if 0
340 static void	iwm_update_sched(struct iwm_softc *, int, int, uint8_t,
341                                  uint16_t);
342 #endif
343 static const struct iwm_rate *
344 	iwm_tx_fill_cmd(struct iwm_softc *, struct iwm_node *,
345 			struct mbuf *, struct iwm_tx_cmd *);
346 static int	iwm_tx(struct iwm_softc *, struct mbuf *,
347                        struct ieee80211_node *, int);
348 static int	iwm_raw_xmit(struct ieee80211_node *, struct mbuf *,
349 			     const struct ieee80211_bpf_params *);
350 static int	iwm_mvm_update_quotas(struct iwm_softc *, struct iwm_vap *);
351 static int	iwm_auth(struct ieee80211vap *, struct iwm_softc *);
352 static int	iwm_release(struct iwm_softc *, struct iwm_node *);
353 static struct ieee80211_node *
354 		iwm_node_alloc(struct ieee80211vap *,
355 		               const uint8_t[IEEE80211_ADDR_LEN]);
356 static void	iwm_setrates(struct iwm_softc *, struct iwm_node *);
357 static int	iwm_media_change(struct ifnet *);
358 static int	iwm_newstate(struct ieee80211vap *, enum ieee80211_state, int);
359 static void	iwm_endscan_cb(void *, int);
360 static int	iwm_send_bt_init_conf(struct iwm_softc *);
361 static boolean_t iwm_mvm_is_lar_supported(struct iwm_softc *);
362 static boolean_t iwm_mvm_is_wifi_mcc_supported(struct iwm_softc *);
363 static int	iwm_send_update_mcc_cmd(struct iwm_softc *, const char *);
364 static void	iwm_mvm_tt_tx_backoff(struct iwm_softc *, uint32_t);
365 static int	iwm_init_hw(struct iwm_softc *);
366 static void	iwm_init(struct iwm_softc *);
367 static void	iwm_start(struct iwm_softc *);
368 static void	iwm_stop(struct iwm_softc *);
369 static void	iwm_watchdog(void *);
370 static void	iwm_parent(struct ieee80211com *);
371 #ifdef IWM_DEBUG
372 static const char *
373 		iwm_desc_lookup(uint32_t);
374 static void	iwm_nic_error(struct iwm_softc *);
375 static void	iwm_nic_umac_error(struct iwm_softc *);
376 #endif
377 static void	iwm_handle_rxb(struct iwm_softc *, struct mbuf *);
378 static void	iwm_notif_intr(struct iwm_softc *);
379 static void	iwm_intr(void *);
380 static int	iwm_attach(device_t);
381 static int	iwm_is_valid_ether_addr(uint8_t *);
382 static void	iwm_preinit(void *);
383 static int	iwm_detach_local(struct iwm_softc *sc, int);
384 static void	iwm_init_task(void *);
385 static void	iwm_radiotap_attach(struct iwm_softc *);
386 static struct ieee80211vap *
387 		iwm_vap_create(struct ieee80211com *,
388 		               const char [IFNAMSIZ], int,
389 		               enum ieee80211_opmode, int,
390 		               const uint8_t [IEEE80211_ADDR_LEN],
391 		               const uint8_t [IEEE80211_ADDR_LEN]);
392 static void	iwm_vap_delete(struct ieee80211vap *);
393 static void	iwm_xmit_queue_drain(struct iwm_softc *);
394 static void	iwm_scan_start(struct ieee80211com *);
395 static void	iwm_scan_end(struct ieee80211com *);
396 static void	iwm_update_mcast(struct ieee80211com *);
397 static void	iwm_set_channel(struct ieee80211com *);
398 static void	iwm_scan_curchan(struct ieee80211_scan_state *, unsigned long);
399 static void	iwm_scan_mindwell(struct ieee80211_scan_state *);
400 static int	iwm_detach(device_t);
401 
402 static int	iwm_lar_disable = 0;
403 TUNABLE_INT("hw.iwm.lar.disable", &iwm_lar_disable);
404 
405 /*
406  * Firmware parser.
407  */
408 
409 static int
410 iwm_store_cscheme(struct iwm_softc *sc, const uint8_t *data, size_t dlen)
411 {
412 	const struct iwm_fw_cscheme_list *l = (const void *)data;
413 
414 	if (dlen < sizeof(*l) ||
415 	    dlen < sizeof(l->size) + l->size * sizeof(*l->cs))
416 		return EINVAL;
417 
418 	/* we don't actually store anything for now, always use s/w crypto */
419 
420 	return 0;
421 }
422 
423 static int
424 iwm_firmware_store_section(struct iwm_softc *sc,
425     enum iwm_ucode_type type, const uint8_t *data, size_t dlen)
426 {
427 	struct iwm_fw_sects *fws;
428 	struct iwm_fw_desc *fwone;
429 
430 	if (type >= IWM_UCODE_TYPE_MAX)
431 		return EINVAL;
432 	if (dlen < sizeof(uint32_t))
433 		return EINVAL;
434 
435 	fws = &sc->sc_fw.fw_sects[type];
436 	if (fws->fw_count >= IWM_UCODE_SECTION_MAX)
437 		return EINVAL;
438 
439 	fwone = &fws->fw_sect[fws->fw_count];
440 
441 	/* first 32bit are device load offset */
442 	memcpy(&fwone->offset, data, sizeof(uint32_t));
443 
444 	/* rest is data */
445 	fwone->data = data + sizeof(uint32_t);
446 	fwone->len = dlen - sizeof(uint32_t);
447 
448 	fws->fw_count++;
449 
450 	return 0;
451 }
452 
453 #define IWM_DEFAULT_SCAN_CHANNELS 40
454 
455 /* iwlwifi: iwl-drv.c */
456 struct iwm_tlv_calib_data {
457 	uint32_t ucode_type;
458 	struct iwm_tlv_calib_ctrl calib;
459 } __packed;
460 
461 static int
462 iwm_set_default_calib(struct iwm_softc *sc, const void *data)
463 {
464 	const struct iwm_tlv_calib_data *def_calib = data;
465 	uint32_t ucode_type = le32toh(def_calib->ucode_type);
466 
467 	if (ucode_type >= IWM_UCODE_TYPE_MAX) {
468 		device_printf(sc->sc_dev,
469 		    "Wrong ucode_type %u for default "
470 		    "calibration.\n", ucode_type);
471 		return EINVAL;
472 	}
473 
474 	sc->sc_default_calib[ucode_type].flow_trigger =
475 	    def_calib->calib.flow_trigger;
476 	sc->sc_default_calib[ucode_type].event_trigger =
477 	    def_calib->calib.event_trigger;
478 
479 	return 0;
480 }
481 
482 static int
483 iwm_set_ucode_api_flags(struct iwm_softc *sc, const uint8_t *data,
484 			struct iwm_ucode_capabilities *capa)
485 {
486 	const struct iwm_ucode_api *ucode_api = (const void *)data;
487 	uint32_t api_index = le32toh(ucode_api->api_index);
488 	uint32_t api_flags = le32toh(ucode_api->api_flags);
489 	int i;
490 
491 	if (api_index >= howmany(IWM_NUM_UCODE_TLV_API, 32)) {
492 		device_printf(sc->sc_dev,
493 		    "api flags index %d larger than supported by driver\n",
494 		    api_index);
495 		/* don't return an error so we can load FW that has more bits */
496 		return 0;
497 	}
498 
499 	for (i = 0; i < 32; i++) {
500 		if (api_flags & (1U << i))
501 			setbit(capa->enabled_api, i + 32 * api_index);
502 	}
503 
504 	return 0;
505 }
506 
507 static int
508 iwm_set_ucode_capabilities(struct iwm_softc *sc, const uint8_t *data,
509 			   struct iwm_ucode_capabilities *capa)
510 {
511 	const struct iwm_ucode_capa *ucode_capa = (const void *)data;
512 	uint32_t api_index = le32toh(ucode_capa->api_index);
513 	uint32_t api_flags = le32toh(ucode_capa->api_capa);
514 	int i;
515 
516 	if (api_index >= howmany(IWM_NUM_UCODE_TLV_CAPA, 32)) {
517 		device_printf(sc->sc_dev,
518 		    "capa flags index %d larger than supported by driver\n",
519 		    api_index);
520 		/* don't return an error so we can load FW that has more bits */
521 		return 0;
522 	}
523 
524 	for (i = 0; i < 32; i++) {
525 		if (api_flags & (1U << i))
526 			setbit(capa->enabled_capa, i + 32 * api_index);
527 	}
528 
529 	return 0;
530 }
531 
532 static void
533 iwm_fw_info_free(struct iwm_fw_info *fw)
534 {
535 	firmware_put(fw->fw_fp, FIRMWARE_UNLOAD);
536 	fw->fw_fp = NULL;
537 	/* don't touch fw->fw_status */
538 	memset(fw->fw_sects, 0, sizeof(fw->fw_sects));
539 }
540 
541 static int
542 iwm_read_firmware(struct iwm_softc *sc, enum iwm_ucode_type ucode_type)
543 {
544 	struct iwm_fw_info *fw = &sc->sc_fw;
545 	const struct iwm_tlv_ucode_header *uhdr;
546 	const struct iwm_ucode_tlv *tlv;
547 	struct iwm_ucode_capabilities *capa = &sc->ucode_capa;
548 	enum iwm_ucode_tlv_type tlv_type;
549 	const struct firmware *fwp;
550 	const uint8_t *data;
551 	uint32_t tlv_len;
552 	uint32_t usniffer_img;
553 	const uint8_t *tlv_data;
554 	uint32_t paging_mem_size;
555 	int num_of_cpus;
556 	int error = 0;
557 	size_t len;
558 
559 	if (fw->fw_status == IWM_FW_STATUS_DONE &&
560 	    ucode_type != IWM_UCODE_INIT)
561 		return 0;
562 
563 	while (fw->fw_status == IWM_FW_STATUS_INPROGRESS)
564 		msleep(&sc->sc_fw, &sc->sc_mtx, 0, "iwmfwp", 0);
565 	fw->fw_status = IWM_FW_STATUS_INPROGRESS;
566 
567 	if (fw->fw_fp != NULL)
568 		iwm_fw_info_free(fw);
569 
570 	/*
571 	 * Load firmware into driver memory.
572 	 * fw_fp will be set.
573 	 */
574 	IWM_UNLOCK(sc);
575 	fwp = firmware_get(sc->cfg->fw_name);
576 	IWM_LOCK(sc);
577 	if (fwp == NULL) {
578 		device_printf(sc->sc_dev,
579 		    "could not read firmware %s (error %d)\n",
580 		    sc->cfg->fw_name, error);
581 		goto out;
582 	}
583 	fw->fw_fp = fwp;
584 
585 	/* (Re-)Initialize default values. */
586 	capa->flags = 0;
587 	capa->max_probe_length = IWM_DEFAULT_MAX_PROBE_LENGTH;
588 	capa->n_scan_channels = IWM_DEFAULT_SCAN_CHANNELS;
589 	memset(capa->enabled_capa, 0, sizeof(capa->enabled_capa));
590 	memset(capa->enabled_api, 0, sizeof(capa->enabled_api));
591 	memset(sc->sc_fw_mcc, 0, sizeof(sc->sc_fw_mcc));
592 
593 	/*
594 	 * Parse firmware contents
595 	 */
596 
597 	uhdr = (const void *)fw->fw_fp->data;
598 	if (*(const uint32_t *)fw->fw_fp->data != 0
599 	    || le32toh(uhdr->magic) != IWM_TLV_UCODE_MAGIC) {
600 		device_printf(sc->sc_dev, "invalid firmware %s\n",
601 		    sc->cfg->fw_name);
602 		error = EINVAL;
603 		goto out;
604 	}
605 
606 	snprintf(sc->sc_fwver, sizeof(sc->sc_fwver), "%u.%u (API ver %u)",
607 	    IWM_UCODE_MAJOR(le32toh(uhdr->ver)),
608 	    IWM_UCODE_MINOR(le32toh(uhdr->ver)),
609 	    IWM_UCODE_API(le32toh(uhdr->ver)));
610 	data = uhdr->data;
611 	len = fw->fw_fp->datasize - sizeof(*uhdr);
612 
613 	while (len >= sizeof(*tlv)) {
614 		len -= sizeof(*tlv);
615 		tlv = (const void *)data;
616 
617 		tlv_len = le32toh(tlv->length);
618 		tlv_type = le32toh(tlv->type);
619 		tlv_data = tlv->data;
620 
621 		if (len < tlv_len) {
622 			device_printf(sc->sc_dev,
623 			    "firmware too short: %zu bytes\n",
624 			    len);
625 			error = EINVAL;
626 			goto parse_out;
627 		}
628 		len -= roundup2(tlv_len, 4);
629 		data += sizeof(tlv) + roundup2(tlv_len, 4);
630 
631 		switch ((int)tlv_type) {
632 		case IWM_UCODE_TLV_PROBE_MAX_LEN:
633 			if (tlv_len != sizeof(uint32_t)) {
634 				device_printf(sc->sc_dev,
635 				    "%s: PROBE_MAX_LEN (%d) != sizeof(uint32_t)\n",
636 				    __func__,
637 				    (int) tlv_len);
638 				error = EINVAL;
639 				goto parse_out;
640 			}
641 			capa->max_probe_length =
642 			    le32_to_cpup((const uint32_t *)tlv_data);
643 			/* limit it to something sensible */
644 			if (capa->max_probe_length >
645 			    IWM_SCAN_OFFLOAD_PROBE_REQ_SIZE) {
646 				IWM_DPRINTF(sc, IWM_DEBUG_FIRMWARE_TLV,
647 				    "%s: IWM_UCODE_TLV_PROBE_MAX_LEN "
648 				    "ridiculous\n", __func__);
649 				error = EINVAL;
650 				goto parse_out;
651 			}
652 			break;
653 		case IWM_UCODE_TLV_PAN:
654 			if (tlv_len) {
655 				device_printf(sc->sc_dev,
656 				    "%s: IWM_UCODE_TLV_PAN: tlv_len (%d) > 0\n",
657 				    __func__,
658 				    (int) tlv_len);
659 				error = EINVAL;
660 				goto parse_out;
661 			}
662 			capa->flags |= IWM_UCODE_TLV_FLAGS_PAN;
663 			break;
664 		case IWM_UCODE_TLV_FLAGS:
665 			if (tlv_len < sizeof(uint32_t)) {
666 				device_printf(sc->sc_dev,
667 				    "%s: IWM_UCODE_TLV_FLAGS: tlv_len (%d) < sizeof(uint32_t)\n",
668 				    __func__,
669 				    (int) tlv_len);
670 				error = EINVAL;
671 				goto parse_out;
672 			}
673 			if (tlv_len % sizeof(uint32_t)) {
674 				device_printf(sc->sc_dev,
675 				    "%s: IWM_UCODE_TLV_FLAGS: tlv_len (%d) %% sizeof(uint32_t)\n",
676 				    __func__,
677 				    (int) tlv_len);
678 				error = EINVAL;
679 				goto parse_out;
680 			}
681 			/*
682 			 * Apparently there can be many flags, but Linux driver
683 			 * parses only the first one, and so do we.
684 			 *
685 			 * XXX: why does this override IWM_UCODE_TLV_PAN?
686 			 * Intentional or a bug?  Observations from
687 			 * current firmware file:
688 			 *  1) TLV_PAN is parsed first
689 			 *  2) TLV_FLAGS contains TLV_FLAGS_PAN
690 			 * ==> this resets TLV_PAN to itself... hnnnk
691 			 */
692 			capa->flags = le32_to_cpup((const uint32_t *)tlv_data);
693 			break;
694 		case IWM_UCODE_TLV_CSCHEME:
695 			if ((error = iwm_store_cscheme(sc,
696 			    tlv_data, tlv_len)) != 0) {
697 				device_printf(sc->sc_dev,
698 				    "%s: iwm_store_cscheme(): returned %d\n",
699 				    __func__,
700 				    error);
701 				goto parse_out;
702 			}
703 			break;
704 		case IWM_UCODE_TLV_NUM_OF_CPU:
705 			if (tlv_len != sizeof(uint32_t)) {
706 				device_printf(sc->sc_dev,
707 				    "%s: IWM_UCODE_TLV_NUM_OF_CPU: tlv_len (%d) != sizeof(uint32_t)\n",
708 				    __func__,
709 				    (int) tlv_len);
710 				error = EINVAL;
711 				goto parse_out;
712 			}
713 			num_of_cpus = le32_to_cpup((const uint32_t *)tlv_data);
714 			if (num_of_cpus == 2) {
715 				fw->fw_sects[IWM_UCODE_REGULAR].is_dual_cpus =
716 					TRUE;
717 				fw->fw_sects[IWM_UCODE_INIT].is_dual_cpus =
718 					TRUE;
719 				fw->fw_sects[IWM_UCODE_WOWLAN].is_dual_cpus =
720 					TRUE;
721 			} else if ((num_of_cpus > 2) || (num_of_cpus < 1)) {
722 				device_printf(sc->sc_dev,
723 				    "%s: Driver supports only 1 or 2 CPUs\n",
724 				    __func__);
725 				error = EINVAL;
726 				goto parse_out;
727 			}
728 			break;
729 		case IWM_UCODE_TLV_SEC_RT:
730 			if ((error = iwm_firmware_store_section(sc,
731 			    IWM_UCODE_REGULAR, tlv_data, tlv_len)) != 0) {
732 				device_printf(sc->sc_dev,
733 				    "%s: IWM_UCODE_REGULAR: iwm_firmware_store_section() failed; %d\n",
734 				    __func__,
735 				    error);
736 				goto parse_out;
737 			}
738 			break;
739 		case IWM_UCODE_TLV_SEC_INIT:
740 			if ((error = iwm_firmware_store_section(sc,
741 			    IWM_UCODE_INIT, tlv_data, tlv_len)) != 0) {
742 				device_printf(sc->sc_dev,
743 				    "%s: IWM_UCODE_INIT: iwm_firmware_store_section() failed; %d\n",
744 				    __func__,
745 				    error);
746 				goto parse_out;
747 			}
748 			break;
749 		case IWM_UCODE_TLV_SEC_WOWLAN:
750 			if ((error = iwm_firmware_store_section(sc,
751 			    IWM_UCODE_WOWLAN, tlv_data, tlv_len)) != 0) {
752 				device_printf(sc->sc_dev,
753 				    "%s: IWM_UCODE_WOWLAN: iwm_firmware_store_section() failed; %d\n",
754 				    __func__,
755 				    error);
756 				goto parse_out;
757 			}
758 			break;
759 		case IWM_UCODE_TLV_DEF_CALIB:
760 			if (tlv_len != sizeof(struct iwm_tlv_calib_data)) {
761 				device_printf(sc->sc_dev,
762 				    "%s: IWM_UCODE_TLV_DEV_CALIB: tlv_len (%d) < sizeof(iwm_tlv_calib_data) (%d)\n",
763 				    __func__,
764 				    (int) tlv_len,
765 				    (int) sizeof(struct iwm_tlv_calib_data));
766 				error = EINVAL;
767 				goto parse_out;
768 			}
769 			if ((error = iwm_set_default_calib(sc, tlv_data)) != 0) {
770 				device_printf(sc->sc_dev,
771 				    "%s: iwm_set_default_calib() failed: %d\n",
772 				    __func__,
773 				    error);
774 				goto parse_out;
775 			}
776 			break;
777 		case IWM_UCODE_TLV_PHY_SKU:
778 			if (tlv_len != sizeof(uint32_t)) {
779 				error = EINVAL;
780 				device_printf(sc->sc_dev,
781 				    "%s: IWM_UCODE_TLV_PHY_SKU: tlv_len (%d) < sizeof(uint32_t)\n",
782 				    __func__,
783 				    (int) tlv_len);
784 				goto parse_out;
785 			}
786 			sc->sc_fw.phy_config =
787 			    le32_to_cpup((const uint32_t *)tlv_data);
788 			sc->sc_fw.valid_tx_ant = (sc->sc_fw.phy_config &
789 						  IWM_FW_PHY_CFG_TX_CHAIN) >>
790 						  IWM_FW_PHY_CFG_TX_CHAIN_POS;
791 			sc->sc_fw.valid_rx_ant = (sc->sc_fw.phy_config &
792 						  IWM_FW_PHY_CFG_RX_CHAIN) >>
793 						  IWM_FW_PHY_CFG_RX_CHAIN_POS;
794 			break;
795 
796 		case IWM_UCODE_TLV_API_CHANGES_SET: {
797 			if (tlv_len != sizeof(struct iwm_ucode_api)) {
798 				error = EINVAL;
799 				goto parse_out;
800 			}
801 			if (iwm_set_ucode_api_flags(sc, tlv_data, capa)) {
802 				error = EINVAL;
803 				goto parse_out;
804 			}
805 			break;
806 		}
807 
808 		case IWM_UCODE_TLV_ENABLED_CAPABILITIES: {
809 			if (tlv_len != sizeof(struct iwm_ucode_capa)) {
810 				error = EINVAL;
811 				goto parse_out;
812 			}
813 			if (iwm_set_ucode_capabilities(sc, tlv_data, capa)) {
814 				error = EINVAL;
815 				goto parse_out;
816 			}
817 			break;
818 		}
819 
820 		case 48: /* undocumented TLV */
821 		case IWM_UCODE_TLV_SDIO_ADMA_ADDR:
822 		case IWM_UCODE_TLV_FW_GSCAN_CAPA:
823 			/* ignore, not used by current driver */
824 			break;
825 
826 		case IWM_UCODE_TLV_SEC_RT_USNIFFER:
827 			if ((error = iwm_firmware_store_section(sc,
828 			    IWM_UCODE_REGULAR_USNIFFER, tlv_data,
829 			    tlv_len)) != 0)
830 				goto parse_out;
831 			break;
832 
833 		case IWM_UCODE_TLV_PAGING:
834 			if (tlv_len != sizeof(uint32_t)) {
835 				error = EINVAL;
836 				goto parse_out;
837 			}
838 			paging_mem_size = le32_to_cpup((const uint32_t *)tlv_data);
839 
840 			IWM_DPRINTF(sc, IWM_DEBUG_FIRMWARE_TLV,
841 			    "%s: Paging: paging enabled (size = %u bytes)\n",
842 			    __func__, paging_mem_size);
843 			if (paging_mem_size > IWM_MAX_PAGING_IMAGE_SIZE) {
844 				device_printf(sc->sc_dev,
845 					"%s: Paging: driver supports up to %u bytes for paging image\n",
846 					__func__, IWM_MAX_PAGING_IMAGE_SIZE);
847 				error = EINVAL;
848 				goto out;
849 			}
850 			if (paging_mem_size & (IWM_FW_PAGING_SIZE - 1)) {
851 				device_printf(sc->sc_dev,
852 				    "%s: Paging: image isn't multiple %u\n",
853 				    __func__, IWM_FW_PAGING_SIZE);
854 				error = EINVAL;
855 				goto out;
856 			}
857 
858 			sc->sc_fw.fw_sects[IWM_UCODE_REGULAR].paging_mem_size =
859 			    paging_mem_size;
860 			usniffer_img = IWM_UCODE_REGULAR_USNIFFER;
861 			sc->sc_fw.fw_sects[usniffer_img].paging_mem_size =
862 			    paging_mem_size;
863 			break;
864 
865 		case IWM_UCODE_TLV_N_SCAN_CHANNELS:
866 			if (tlv_len != sizeof(uint32_t)) {
867 				error = EINVAL;
868 				goto parse_out;
869 			}
870 			capa->n_scan_channels =
871 			    le32_to_cpup((const uint32_t *)tlv_data);
872 			break;
873 
874 		case IWM_UCODE_TLV_FW_VERSION:
875 			if (tlv_len != sizeof(uint32_t) * 3) {
876 				error = EINVAL;
877 				goto parse_out;
878 			}
879 			snprintf(sc->sc_fwver, sizeof(sc->sc_fwver),
880 			    "%d.%d.%d",
881 			    le32toh(((const uint32_t *)tlv_data)[0]),
882 			    le32toh(((const uint32_t *)tlv_data)[1]),
883 			    le32toh(((const uint32_t *)tlv_data)[2]));
884 			break;
885 
886 		case IWM_UCODE_TLV_FW_MEM_SEG:
887 			break;
888 
889 		default:
890 			device_printf(sc->sc_dev,
891 			    "%s: unknown firmware section %d, abort\n",
892 			    __func__, tlv_type);
893 			error = EINVAL;
894 			goto parse_out;
895 		}
896 	}
897 
898 	KASSERT(error == 0, ("unhandled error"));
899 
900  parse_out:
901 	if (error) {
902 		device_printf(sc->sc_dev, "firmware parse error %d, "
903 		    "section type %d\n", error, tlv_type);
904 	}
905 
906  out:
907 	if (error) {
908 		fw->fw_status = IWM_FW_STATUS_NONE;
909 		if (fw->fw_fp != NULL)
910 			iwm_fw_info_free(fw);
911 	} else
912 		fw->fw_status = IWM_FW_STATUS_DONE;
913 	wakeup(&sc->sc_fw);
914 
915 	return error;
916 }
917 
918 /*
919  * DMA resource routines
920  */
921 
922 /* fwmem is used to load firmware onto the card */
923 static int
924 iwm_alloc_fwmem(struct iwm_softc *sc)
925 {
926 	/* Must be aligned on a 16-byte boundary. */
927 	return iwm_dma_contig_alloc(sc->sc_dmat, &sc->fw_dma,
928 	    IWM_FH_MEM_TB_MAX_LENGTH, 16);
929 }
930 
931 /* tx scheduler rings.  not used? */
932 static int
933 iwm_alloc_sched(struct iwm_softc *sc)
934 {
935 	/* TX scheduler rings must be aligned on a 1KB boundary. */
936 	return iwm_dma_contig_alloc(sc->sc_dmat, &sc->sched_dma,
937 	    nitems(sc->txq) * sizeof(struct iwm_agn_scd_bc_tbl), 1024);
938 }
939 
940 /* keep-warm page is used internally by the card.  see iwl-fh.h for more info */
941 static int
942 iwm_alloc_kw(struct iwm_softc *sc)
943 {
944 	return iwm_dma_contig_alloc(sc->sc_dmat, &sc->kw_dma, 4096, 4096);
945 }
946 
947 /* interrupt cause table */
948 static int
949 iwm_alloc_ict(struct iwm_softc *sc)
950 {
951 	return iwm_dma_contig_alloc(sc->sc_dmat, &sc->ict_dma,
952 	    IWM_ICT_SIZE, 1<<IWM_ICT_PADDR_SHIFT);
953 }
954 
955 static int
956 iwm_alloc_rx_ring(struct iwm_softc *sc, struct iwm_rx_ring *ring)
957 {
958 	bus_size_t size;
959 	int i, error;
960 
961 	ring->cur = 0;
962 
963 	/* Allocate RX descriptors (256-byte aligned). */
964 	size = IWM_RX_RING_COUNT * sizeof(uint32_t);
965 	error = iwm_dma_contig_alloc(sc->sc_dmat, &ring->desc_dma, size, 256);
966 	if (error != 0) {
967 		device_printf(sc->sc_dev,
968 		    "could not allocate RX ring DMA memory\n");
969 		goto fail;
970 	}
971 	ring->desc = ring->desc_dma.vaddr;
972 
973 	/* Allocate RX status area (16-byte aligned). */
974 	error = iwm_dma_contig_alloc(sc->sc_dmat, &ring->stat_dma,
975 	    sizeof(*ring->stat), 16);
976 	if (error != 0) {
977 		device_printf(sc->sc_dev,
978 		    "could not allocate RX status DMA memory\n");
979 		goto fail;
980 	}
981 	ring->stat = ring->stat_dma.vaddr;
982 
983         /* Create RX buffer DMA tag. */
984         error = bus_dma_tag_create(sc->sc_dmat, 1, 0,
985             BUS_SPACE_MAXADDR_32BIT, BUS_SPACE_MAXADDR, NULL, NULL,
986             IWM_RBUF_SIZE, 1, IWM_RBUF_SIZE, 0, NULL, NULL, &ring->data_dmat);
987         if (error != 0) {
988                 device_printf(sc->sc_dev,
989                     "%s: could not create RX buf DMA tag, error %d\n",
990                     __func__, error);
991                 goto fail;
992         }
993 
994 	/* Allocate spare bus_dmamap_t for iwm_rx_addbuf() */
995 	error = bus_dmamap_create(ring->data_dmat, 0, &ring->spare_map);
996 	if (error != 0) {
997 		device_printf(sc->sc_dev,
998 		    "%s: could not create RX buf DMA map, error %d\n",
999 		    __func__, error);
1000 		goto fail;
1001 	}
1002 	/*
1003 	 * Allocate and map RX buffers.
1004 	 */
1005 	for (i = 0; i < IWM_RX_RING_COUNT; i++) {
1006 		struct iwm_rx_data *data = &ring->data[i];
1007 		error = bus_dmamap_create(ring->data_dmat, 0, &data->map);
1008 		if (error != 0) {
1009 			device_printf(sc->sc_dev,
1010 			    "%s: could not create RX buf DMA map, error %d\n",
1011 			    __func__, error);
1012 			goto fail;
1013 		}
1014 		data->m = NULL;
1015 
1016 		if ((error = iwm_rx_addbuf(sc, IWM_RBUF_SIZE, i)) != 0) {
1017 			goto fail;
1018 		}
1019 	}
1020 	return 0;
1021 
1022 fail:	iwm_free_rx_ring(sc, ring);
1023 	return error;
1024 }
1025 
1026 static void
1027 iwm_reset_rx_ring(struct iwm_softc *sc, struct iwm_rx_ring *ring)
1028 {
1029 	/* Reset the ring state */
1030 	ring->cur = 0;
1031 
1032 	/*
1033 	 * The hw rx ring index in shared memory must also be cleared,
1034 	 * otherwise the discrepancy can cause reprocessing chaos.
1035 	 */
1036 	memset(sc->rxq.stat, 0, sizeof(*sc->rxq.stat));
1037 }
1038 
1039 static void
1040 iwm_free_rx_ring(struct iwm_softc *sc, struct iwm_rx_ring *ring)
1041 {
1042 	int i;
1043 
1044 	iwm_dma_contig_free(&ring->desc_dma);
1045 	iwm_dma_contig_free(&ring->stat_dma);
1046 
1047 	for (i = 0; i < IWM_RX_RING_COUNT; i++) {
1048 		struct iwm_rx_data *data = &ring->data[i];
1049 
1050 		if (data->m != NULL) {
1051 			bus_dmamap_sync(ring->data_dmat, data->map,
1052 			    BUS_DMASYNC_POSTREAD);
1053 			bus_dmamap_unload(ring->data_dmat, data->map);
1054 			m_freem(data->m);
1055 			data->m = NULL;
1056 		}
1057 		if (data->map != NULL) {
1058 			bus_dmamap_destroy(ring->data_dmat, data->map);
1059 			data->map = NULL;
1060 		}
1061 	}
1062 	if (ring->spare_map != NULL) {
1063 		bus_dmamap_destroy(ring->data_dmat, ring->spare_map);
1064 		ring->spare_map = NULL;
1065 	}
1066 	if (ring->data_dmat != NULL) {
1067 		bus_dma_tag_destroy(ring->data_dmat);
1068 		ring->data_dmat = NULL;
1069 	}
1070 }
1071 
1072 static int
1073 iwm_alloc_tx_ring(struct iwm_softc *sc, struct iwm_tx_ring *ring, int qid)
1074 {
1075 	bus_addr_t paddr;
1076 	bus_size_t size;
1077 	size_t maxsize;
1078 	int nsegments;
1079 	int i, error;
1080 
1081 	ring->qid = qid;
1082 	ring->queued = 0;
1083 	ring->cur = 0;
1084 
1085 	/* Allocate TX descriptors (256-byte aligned). */
1086 	size = IWM_TX_RING_COUNT * sizeof (struct iwm_tfd);
1087 	error = iwm_dma_contig_alloc(sc->sc_dmat, &ring->desc_dma, size, 256);
1088 	if (error != 0) {
1089 		device_printf(sc->sc_dev,
1090 		    "could not allocate TX ring DMA memory\n");
1091 		goto fail;
1092 	}
1093 	ring->desc = ring->desc_dma.vaddr;
1094 
1095 	/*
1096 	 * We only use rings 0 through 9 (4 EDCA + cmd) so there is no need
1097 	 * to allocate commands space for other rings.
1098 	 */
1099 	if (qid > IWM_MVM_CMD_QUEUE)
1100 		return 0;
1101 
1102 	size = IWM_TX_RING_COUNT * sizeof(struct iwm_device_cmd);
1103 	error = iwm_dma_contig_alloc(sc->sc_dmat, &ring->cmd_dma, size, 4);
1104 	if (error != 0) {
1105 		device_printf(sc->sc_dev,
1106 		    "could not allocate TX cmd DMA memory\n");
1107 		goto fail;
1108 	}
1109 	ring->cmd = ring->cmd_dma.vaddr;
1110 
1111 	/* FW commands may require more mapped space than packets. */
1112 	if (qid == IWM_MVM_CMD_QUEUE) {
1113 		maxsize = IWM_RBUF_SIZE;
1114 		nsegments = 1;
1115 	} else {
1116 		maxsize = MCLBYTES;
1117 		nsegments = IWM_MAX_SCATTER - 2;
1118 	}
1119 
1120 	error = bus_dma_tag_create(sc->sc_dmat, 1, 0,
1121 	    BUS_SPACE_MAXADDR_32BIT, BUS_SPACE_MAXADDR, NULL, NULL, maxsize,
1122             nsegments, maxsize, 0, NULL, NULL, &ring->data_dmat);
1123 	if (error != 0) {
1124 		device_printf(sc->sc_dev, "could not create TX buf DMA tag\n");
1125 		goto fail;
1126 	}
1127 
1128 	paddr = ring->cmd_dma.paddr;
1129 	for (i = 0; i < IWM_TX_RING_COUNT; i++) {
1130 		struct iwm_tx_data *data = &ring->data[i];
1131 
1132 		data->cmd_paddr = paddr;
1133 		data->scratch_paddr = paddr + sizeof(struct iwm_cmd_header)
1134 		    + offsetof(struct iwm_tx_cmd, scratch);
1135 		paddr += sizeof(struct iwm_device_cmd);
1136 
1137 		error = bus_dmamap_create(ring->data_dmat, 0, &data->map);
1138 		if (error != 0) {
1139 			device_printf(sc->sc_dev,
1140 			    "could not create TX buf DMA map\n");
1141 			goto fail;
1142 		}
1143 	}
1144 	KASSERT(paddr == ring->cmd_dma.paddr + size,
1145 	    ("invalid physical address"));
1146 	return 0;
1147 
1148 fail:	iwm_free_tx_ring(sc, ring);
1149 	return error;
1150 }
1151 
1152 static void
1153 iwm_reset_tx_ring(struct iwm_softc *sc, struct iwm_tx_ring *ring)
1154 {
1155 	int i;
1156 
1157 	for (i = 0; i < IWM_TX_RING_COUNT; i++) {
1158 		struct iwm_tx_data *data = &ring->data[i];
1159 
1160 		if (data->m != NULL) {
1161 			bus_dmamap_sync(ring->data_dmat, data->map,
1162 			    BUS_DMASYNC_POSTWRITE);
1163 			bus_dmamap_unload(ring->data_dmat, data->map);
1164 			m_freem(data->m);
1165 			data->m = NULL;
1166 		}
1167 	}
1168 	/* Clear TX descriptors. */
1169 	memset(ring->desc, 0, ring->desc_dma.size);
1170 	bus_dmamap_sync(ring->desc_dma.tag, ring->desc_dma.map,
1171 	    BUS_DMASYNC_PREWRITE);
1172 	sc->qfullmsk &= ~(1 << ring->qid);
1173 	ring->queued = 0;
1174 	ring->cur = 0;
1175 
1176 	if (ring->qid == IWM_MVM_CMD_QUEUE && sc->cmd_hold_nic_awake)
1177 		iwm_pcie_clear_cmd_in_flight(sc);
1178 }
1179 
1180 static void
1181 iwm_free_tx_ring(struct iwm_softc *sc, struct iwm_tx_ring *ring)
1182 {
1183 	int i;
1184 
1185 	iwm_dma_contig_free(&ring->desc_dma);
1186 	iwm_dma_contig_free(&ring->cmd_dma);
1187 
1188 	for (i = 0; i < IWM_TX_RING_COUNT; i++) {
1189 		struct iwm_tx_data *data = &ring->data[i];
1190 
1191 		if (data->m != NULL) {
1192 			bus_dmamap_sync(ring->data_dmat, data->map,
1193 			    BUS_DMASYNC_POSTWRITE);
1194 			bus_dmamap_unload(ring->data_dmat, data->map);
1195 			m_freem(data->m);
1196 			data->m = NULL;
1197 		}
1198 		if (data->map != NULL) {
1199 			bus_dmamap_destroy(ring->data_dmat, data->map);
1200 			data->map = NULL;
1201 		}
1202 	}
1203 	if (ring->data_dmat != NULL) {
1204 		bus_dma_tag_destroy(ring->data_dmat);
1205 		ring->data_dmat = NULL;
1206 	}
1207 }
1208 
1209 /*
1210  * High-level hardware frobbing routines
1211  */
1212 
1213 static void
1214 iwm_enable_interrupts(struct iwm_softc *sc)
1215 {
1216 	sc->sc_intmask = IWM_CSR_INI_SET_MASK;
1217 	IWM_WRITE(sc, IWM_CSR_INT_MASK, sc->sc_intmask);
1218 }
1219 
1220 static void
1221 iwm_restore_interrupts(struct iwm_softc *sc)
1222 {
1223 	IWM_WRITE(sc, IWM_CSR_INT_MASK, sc->sc_intmask);
1224 }
1225 
1226 static void
1227 iwm_disable_interrupts(struct iwm_softc *sc)
1228 {
1229 	/* disable interrupts */
1230 	IWM_WRITE(sc, IWM_CSR_INT_MASK, 0);
1231 
1232 	/* acknowledge all interrupts */
1233 	IWM_WRITE(sc, IWM_CSR_INT, ~0);
1234 	IWM_WRITE(sc, IWM_CSR_FH_INT_STATUS, ~0);
1235 }
1236 
1237 static void
1238 iwm_ict_reset(struct iwm_softc *sc)
1239 {
1240 	iwm_disable_interrupts(sc);
1241 
1242 	/* Reset ICT table. */
1243 	memset(sc->ict_dma.vaddr, 0, IWM_ICT_SIZE);
1244 	sc->ict_cur = 0;
1245 
1246 	/* Set physical address of ICT table (4KB aligned). */
1247 	IWM_WRITE(sc, IWM_CSR_DRAM_INT_TBL_REG,
1248 	    IWM_CSR_DRAM_INT_TBL_ENABLE
1249 	    | IWM_CSR_DRAM_INIT_TBL_WRITE_POINTER
1250 	    | IWM_CSR_DRAM_INIT_TBL_WRAP_CHECK
1251 	    | sc->ict_dma.paddr >> IWM_ICT_PADDR_SHIFT);
1252 
1253 	/* Switch to ICT interrupt mode in driver. */
1254 	sc->sc_flags |= IWM_FLAG_USE_ICT;
1255 
1256 	/* Re-enable interrupts. */
1257 	IWM_WRITE(sc, IWM_CSR_INT, ~0);
1258 	iwm_enable_interrupts(sc);
1259 }
1260 
1261 /* iwlwifi pcie/trans.c */
1262 
1263 /*
1264  * Since this .. hard-resets things, it's time to actually
1265  * mark the first vap (if any) as having no mac context.
1266  * It's annoying, but since the driver is potentially being
1267  * stop/start'ed whilst active (thanks openbsd port!) we
1268  * have to correctly track this.
1269  */
1270 static void
1271 iwm_stop_device(struct iwm_softc *sc)
1272 {
1273 	struct ieee80211com *ic = &sc->sc_ic;
1274 	struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps);
1275 	int chnl, qid;
1276 	uint32_t mask = 0;
1277 
1278 	/* tell the device to stop sending interrupts */
1279 	iwm_disable_interrupts(sc);
1280 
1281 	/*
1282 	 * FreeBSD-local: mark the first vap as not-uploaded,
1283 	 * so the next transition through auth/assoc
1284 	 * will correctly populate the MAC context.
1285 	 */
1286 	if (vap) {
1287 		struct iwm_vap *iv = IWM_VAP(vap);
1288 		iv->phy_ctxt = NULL;
1289 		iv->is_uploaded = 0;
1290 	}
1291 
1292 	/* device going down, Stop using ICT table */
1293 	sc->sc_flags &= ~IWM_FLAG_USE_ICT;
1294 
1295 	/* stop tx and rx.  tx and rx bits, as usual, are from if_iwn */
1296 
1297 	if (iwm_nic_lock(sc)) {
1298 		iwm_write_prph(sc, IWM_SCD_TXFACT, 0);
1299 
1300 		/* Stop each Tx DMA channel */
1301 		for (chnl = 0; chnl < IWM_FH_TCSR_CHNL_NUM; chnl++) {
1302 			IWM_WRITE(sc,
1303 			    IWM_FH_TCSR_CHNL_TX_CONFIG_REG(chnl), 0);
1304 			mask |= IWM_FH_TSSR_TX_STATUS_REG_MSK_CHNL_IDLE(chnl);
1305 		}
1306 
1307 		/* Wait for DMA channels to be idle */
1308 		if (!iwm_poll_bit(sc, IWM_FH_TSSR_TX_STATUS_REG, mask, mask,
1309 		    5000)) {
1310 			device_printf(sc->sc_dev,
1311 			    "Failing on timeout while stopping DMA channel: [0x%08x]\n",
1312 			    IWM_READ(sc, IWM_FH_TSSR_TX_STATUS_REG));
1313 		}
1314 		iwm_nic_unlock(sc);
1315 	}
1316 	iwm_pcie_rx_stop(sc);
1317 
1318 	/* Stop RX ring. */
1319 	iwm_reset_rx_ring(sc, &sc->rxq);
1320 
1321 	/* Reset all TX rings. */
1322 	for (qid = 0; qid < nitems(sc->txq); qid++)
1323 		iwm_reset_tx_ring(sc, &sc->txq[qid]);
1324 
1325 	if (sc->cfg->device_family == IWM_DEVICE_FAMILY_7000) {
1326 		/* Power-down device's busmaster DMA clocks */
1327 		if (iwm_nic_lock(sc)) {
1328 			iwm_write_prph(sc, IWM_APMG_CLK_DIS_REG,
1329 			    IWM_APMG_CLK_VAL_DMA_CLK_RQT);
1330 			iwm_nic_unlock(sc);
1331 		}
1332 		DELAY(5);
1333 	}
1334 
1335 	/* Make sure (redundant) we've released our request to stay awake */
1336 	IWM_CLRBITS(sc, IWM_CSR_GP_CNTRL,
1337 	    IWM_CSR_GP_CNTRL_REG_FLAG_MAC_ACCESS_REQ);
1338 
1339 	/* Stop the device, and put it in low power state */
1340 	iwm_apm_stop(sc);
1341 
1342 	/* Upon stop, the APM issues an interrupt if HW RF kill is set.
1343 	 * Clean again the interrupt here
1344 	 */
1345 	iwm_disable_interrupts(sc);
1346 	/* stop and reset the on-board processor */
1347 	IWM_WRITE(sc, IWM_CSR_RESET, IWM_CSR_RESET_REG_FLAG_SW_RESET);
1348 
1349 	/*
1350 	 * Even if we stop the HW, we still want the RF kill
1351 	 * interrupt
1352 	 */
1353 	iwm_enable_rfkill_int(sc);
1354 	iwm_check_rfkill(sc);
1355 }
1356 
1357 /* iwlwifi: mvm/ops.c */
1358 static void
1359 iwm_mvm_nic_config(struct iwm_softc *sc)
1360 {
1361 	uint8_t radio_cfg_type, radio_cfg_step, radio_cfg_dash;
1362 	uint32_t reg_val = 0;
1363 	uint32_t phy_config = iwm_mvm_get_phy_config(sc);
1364 
1365 	radio_cfg_type = (phy_config & IWM_FW_PHY_CFG_RADIO_TYPE) >>
1366 	    IWM_FW_PHY_CFG_RADIO_TYPE_POS;
1367 	radio_cfg_step = (phy_config & IWM_FW_PHY_CFG_RADIO_STEP) >>
1368 	    IWM_FW_PHY_CFG_RADIO_STEP_POS;
1369 	radio_cfg_dash = (phy_config & IWM_FW_PHY_CFG_RADIO_DASH) >>
1370 	    IWM_FW_PHY_CFG_RADIO_DASH_POS;
1371 
1372 	/* SKU control */
1373 	reg_val |= IWM_CSR_HW_REV_STEP(sc->sc_hw_rev) <<
1374 	    IWM_CSR_HW_IF_CONFIG_REG_POS_MAC_STEP;
1375 	reg_val |= IWM_CSR_HW_REV_DASH(sc->sc_hw_rev) <<
1376 	    IWM_CSR_HW_IF_CONFIG_REG_POS_MAC_DASH;
1377 
1378 	/* radio configuration */
1379 	reg_val |= radio_cfg_type << IWM_CSR_HW_IF_CONFIG_REG_POS_PHY_TYPE;
1380 	reg_val |= radio_cfg_step << IWM_CSR_HW_IF_CONFIG_REG_POS_PHY_STEP;
1381 	reg_val |= radio_cfg_dash << IWM_CSR_HW_IF_CONFIG_REG_POS_PHY_DASH;
1382 
1383 	IWM_WRITE(sc, IWM_CSR_HW_IF_CONFIG_REG, reg_val);
1384 
1385 	IWM_DPRINTF(sc, IWM_DEBUG_RESET,
1386 	    "Radio type=0x%x-0x%x-0x%x\n", radio_cfg_type,
1387 	    radio_cfg_step, radio_cfg_dash);
1388 
1389 	/*
1390 	 * W/A : NIC is stuck in a reset state after Early PCIe power off
1391 	 * (PCIe power is lost before PERST# is asserted), causing ME FW
1392 	 * to lose ownership and not being able to obtain it back.
1393 	 */
1394 	if (sc->cfg->device_family == IWM_DEVICE_FAMILY_7000) {
1395 		iwm_set_bits_mask_prph(sc, IWM_APMG_PS_CTRL_REG,
1396 		    IWM_APMG_PS_CTRL_EARLY_PWR_OFF_RESET_DIS,
1397 		    ~IWM_APMG_PS_CTRL_EARLY_PWR_OFF_RESET_DIS);
1398 	}
1399 }
1400 
1401 static int
1402 iwm_nic_rx_init(struct iwm_softc *sc)
1403 {
1404 	/*
1405 	 * Initialize RX ring.  This is from the iwn driver.
1406 	 */
1407 	memset(sc->rxq.stat, 0, sizeof(*sc->rxq.stat));
1408 
1409 	/* Stop Rx DMA */
1410 	iwm_pcie_rx_stop(sc);
1411 
1412 	if (!iwm_nic_lock(sc))
1413 		return EBUSY;
1414 
1415 	/* reset and flush pointers */
1416 	IWM_WRITE(sc, IWM_FH_MEM_RCSR_CHNL0_RBDCB_WPTR, 0);
1417 	IWM_WRITE(sc, IWM_FH_MEM_RCSR_CHNL0_FLUSH_RB_REQ, 0);
1418 	IWM_WRITE(sc, IWM_FH_RSCSR_CHNL0_RDPTR, 0);
1419 	IWM_WRITE(sc, IWM_FH_RSCSR_CHNL0_RBDCB_WPTR_REG, 0);
1420 
1421 	/* Set physical address of RX ring (256-byte aligned). */
1422 	IWM_WRITE(sc,
1423 	    IWM_FH_RSCSR_CHNL0_RBDCB_BASE_REG, sc->rxq.desc_dma.paddr >> 8);
1424 
1425 	/* Set physical address of RX status (16-byte aligned). */
1426 	IWM_WRITE(sc,
1427 	    IWM_FH_RSCSR_CHNL0_STTS_WPTR_REG, sc->rxq.stat_dma.paddr >> 4);
1428 
1429 	/* Enable Rx DMA
1430 	 * XXX 5000 HW isn't supported by the iwm(4) driver.
1431 	 * IWM_FH_RCSR_CHNL0_RX_IGNORE_RXF_EMPTY is set because of HW bug in
1432 	 *      the credit mechanism in 5000 HW RX FIFO
1433 	 * Direct rx interrupts to hosts
1434 	 * Rx buffer size 4 or 8k or 12k
1435 	 * RB timeout 0x10
1436 	 * 256 RBDs
1437 	 */
1438 	IWM_WRITE(sc, IWM_FH_MEM_RCSR_CHNL0_CONFIG_REG,
1439 	    IWM_FH_RCSR_RX_CONFIG_CHNL_EN_ENABLE_VAL		|
1440 	    IWM_FH_RCSR_CHNL0_RX_IGNORE_RXF_EMPTY		|  /* HW bug */
1441 	    IWM_FH_RCSR_CHNL0_RX_CONFIG_IRQ_DEST_INT_HOST_VAL	|
1442 	    IWM_FH_RCSR_RX_CONFIG_REG_VAL_RB_SIZE_4K		|
1443 	    (IWM_RX_RB_TIMEOUT << IWM_FH_RCSR_RX_CONFIG_REG_IRQ_RBTH_POS) |
1444 	    IWM_RX_QUEUE_SIZE_LOG << IWM_FH_RCSR_RX_CONFIG_RBDCB_SIZE_POS);
1445 
1446 	IWM_WRITE_1(sc, IWM_CSR_INT_COALESCING, IWM_HOST_INT_TIMEOUT_DEF);
1447 
1448 	/* W/A for interrupt coalescing bug in 7260 and 3160 */
1449 	if (sc->cfg->host_interrupt_operation_mode)
1450 		IWM_SETBITS(sc, IWM_CSR_INT_COALESCING, IWM_HOST_INT_OPER_MODE);
1451 
1452 	/*
1453 	 * Thus sayeth el jefe (iwlwifi) via a comment:
1454 	 *
1455 	 * This value should initially be 0 (before preparing any
1456 	 * RBs), should be 8 after preparing the first 8 RBs (for example)
1457 	 */
1458 	IWM_WRITE(sc, IWM_FH_RSCSR_CHNL0_WPTR, 8);
1459 
1460 	iwm_nic_unlock(sc);
1461 
1462 	return 0;
1463 }
1464 
1465 static int
1466 iwm_nic_tx_init(struct iwm_softc *sc)
1467 {
1468 	int qid;
1469 
1470 	if (!iwm_nic_lock(sc))
1471 		return EBUSY;
1472 
1473 	/* Deactivate TX scheduler. */
1474 	iwm_write_prph(sc, IWM_SCD_TXFACT, 0);
1475 
1476 	/* Set physical address of "keep warm" page (16-byte aligned). */
1477 	IWM_WRITE(sc, IWM_FH_KW_MEM_ADDR_REG, sc->kw_dma.paddr >> 4);
1478 
1479 	/* Initialize TX rings. */
1480 	for (qid = 0; qid < nitems(sc->txq); qid++) {
1481 		struct iwm_tx_ring *txq = &sc->txq[qid];
1482 
1483 		/* Set physical address of TX ring (256-byte aligned). */
1484 		IWM_WRITE(sc, IWM_FH_MEM_CBBC_QUEUE(qid),
1485 		    txq->desc_dma.paddr >> 8);
1486 		IWM_DPRINTF(sc, IWM_DEBUG_XMIT,
1487 		    "%s: loading ring %d descriptors (%p) at %lx\n",
1488 		    __func__,
1489 		    qid, txq->desc,
1490 		    (unsigned long) (txq->desc_dma.paddr >> 8));
1491 	}
1492 
1493 	iwm_write_prph(sc, IWM_SCD_GP_CTRL, IWM_SCD_GP_CTRL_AUTO_ACTIVE_MODE);
1494 
1495 	iwm_nic_unlock(sc);
1496 
1497 	return 0;
1498 }
1499 
1500 static int
1501 iwm_nic_init(struct iwm_softc *sc)
1502 {
1503 	int error;
1504 
1505 	iwm_apm_init(sc);
1506 	if (sc->cfg->device_family == IWM_DEVICE_FAMILY_7000)
1507 		iwm_set_pwr(sc);
1508 
1509 	iwm_mvm_nic_config(sc);
1510 
1511 	if ((error = iwm_nic_rx_init(sc)) != 0)
1512 		return error;
1513 
1514 	/*
1515 	 * Ditto for TX, from iwn
1516 	 */
1517 	if ((error = iwm_nic_tx_init(sc)) != 0)
1518 		return error;
1519 
1520 	IWM_DPRINTF(sc, IWM_DEBUG_RESET,
1521 	    "%s: shadow registers enabled\n", __func__);
1522 	IWM_SETBITS(sc, IWM_CSR_MAC_SHADOW_REG_CTRL, 0x800fffff);
1523 
1524 	return 0;
1525 }
1526 
1527 int
1528 iwm_enable_txq(struct iwm_softc *sc, int sta_id, int qid, int fifo)
1529 {
1530 	if (!iwm_nic_lock(sc)) {
1531 		device_printf(sc->sc_dev,
1532 		    "%s: cannot enable txq %d\n",
1533 		    __func__,
1534 		    qid);
1535 		return EBUSY;
1536 	}
1537 
1538 	IWM_WRITE(sc, IWM_HBUS_TARG_WRPTR, qid << 8 | 0);
1539 
1540 	if (qid == IWM_MVM_CMD_QUEUE) {
1541 		/* unactivate before configuration */
1542 		iwm_write_prph(sc, IWM_SCD_QUEUE_STATUS_BITS(qid),
1543 		    (0 << IWM_SCD_QUEUE_STTS_REG_POS_ACTIVE)
1544 		    | (1 << IWM_SCD_QUEUE_STTS_REG_POS_SCD_ACT_EN));
1545 
1546 		iwm_nic_unlock(sc);
1547 
1548 		iwm_clear_bits_prph(sc, IWM_SCD_AGGR_SEL, (1 << qid));
1549 
1550 		if (!iwm_nic_lock(sc)) {
1551 			device_printf(sc->sc_dev,
1552 			    "%s: cannot enable txq %d\n", __func__, qid);
1553 			return EBUSY;
1554 		}
1555 		iwm_write_prph(sc, IWM_SCD_QUEUE_RDPTR(qid), 0);
1556 		iwm_nic_unlock(sc);
1557 
1558 		iwm_write_mem32(sc, sc->scd_base_addr + IWM_SCD_CONTEXT_QUEUE_OFFSET(qid), 0);
1559 		/* Set scheduler window size and frame limit. */
1560 		iwm_write_mem32(sc,
1561 		    sc->scd_base_addr + IWM_SCD_CONTEXT_QUEUE_OFFSET(qid) +
1562 		    sizeof(uint32_t),
1563 		    ((IWM_FRAME_LIMIT << IWM_SCD_QUEUE_CTX_REG2_WIN_SIZE_POS) &
1564 		    IWM_SCD_QUEUE_CTX_REG2_WIN_SIZE_MSK) |
1565 		    ((IWM_FRAME_LIMIT << IWM_SCD_QUEUE_CTX_REG2_FRAME_LIMIT_POS) &
1566 		    IWM_SCD_QUEUE_CTX_REG2_FRAME_LIMIT_MSK));
1567 
1568 		if (!iwm_nic_lock(sc)) {
1569 			device_printf(sc->sc_dev,
1570 			    "%s: cannot enable txq %d\n", __func__, qid);
1571 			return EBUSY;
1572 		}
1573 		iwm_write_prph(sc, IWM_SCD_QUEUE_STATUS_BITS(qid),
1574 		    (1 << IWM_SCD_QUEUE_STTS_REG_POS_ACTIVE) |
1575 		    (fifo << IWM_SCD_QUEUE_STTS_REG_POS_TXF) |
1576 		    (1 << IWM_SCD_QUEUE_STTS_REG_POS_WSL) |
1577 		    IWM_SCD_QUEUE_STTS_REG_MSK);
1578 	} else {
1579 		struct iwm_scd_txq_cfg_cmd cmd;
1580 		int error;
1581 
1582 		iwm_nic_unlock(sc);
1583 
1584 		memset(&cmd, 0, sizeof(cmd));
1585 		cmd.scd_queue = qid;
1586 		cmd.enable = 1;
1587 		cmd.sta_id = sta_id;
1588 		cmd.tx_fifo = fifo;
1589 		cmd.aggregate = 0;
1590 		cmd.window = IWM_FRAME_LIMIT;
1591 
1592 		error = iwm_mvm_send_cmd_pdu(sc, IWM_SCD_QUEUE_CFG, IWM_CMD_SYNC,
1593 		    sizeof(cmd), &cmd);
1594 		if (error) {
1595 			device_printf(sc->sc_dev,
1596 			    "cannot enable txq %d\n", qid);
1597 			return error;
1598 		}
1599 
1600 		if (!iwm_nic_lock(sc))
1601 			return EBUSY;
1602 	}
1603 
1604 	iwm_write_prph(sc, IWM_SCD_EN_CTRL,
1605 	    iwm_read_prph(sc, IWM_SCD_EN_CTRL) | qid);
1606 
1607 	iwm_nic_unlock(sc);
1608 
1609 	IWM_DPRINTF(sc, IWM_DEBUG_XMIT, "%s: enabled txq %d FIFO %d\n",
1610 	    __func__, qid, fifo);
1611 
1612 	return 0;
1613 }
1614 
1615 static int
1616 iwm_trans_pcie_fw_alive(struct iwm_softc *sc, uint32_t scd_base_addr)
1617 {
1618 	int error, chnl;
1619 
1620 	int clear_dwords = (IWM_SCD_TRANS_TBL_MEM_UPPER_BOUND -
1621 	    IWM_SCD_CONTEXT_MEM_LOWER_BOUND) / sizeof(uint32_t);
1622 
1623 	if (!iwm_nic_lock(sc))
1624 		return EBUSY;
1625 
1626 	iwm_ict_reset(sc);
1627 
1628 	sc->scd_base_addr = iwm_read_prph(sc, IWM_SCD_SRAM_BASE_ADDR);
1629 	if (scd_base_addr != 0 &&
1630 	    scd_base_addr != sc->scd_base_addr) {
1631 		device_printf(sc->sc_dev,
1632 		    "%s: sched addr mismatch: alive: 0x%x prph: 0x%x\n",
1633 		    __func__, sc->scd_base_addr, scd_base_addr);
1634 	}
1635 
1636 	iwm_nic_unlock(sc);
1637 
1638 	/* reset context data, TX status and translation data */
1639 	error = iwm_write_mem(sc,
1640 	    sc->scd_base_addr + IWM_SCD_CONTEXT_MEM_LOWER_BOUND,
1641 	    NULL, clear_dwords);
1642 	if (error)
1643 		return EBUSY;
1644 
1645 	if (!iwm_nic_lock(sc))
1646 		return EBUSY;
1647 
1648 	/* Set physical address of TX scheduler rings (1KB aligned). */
1649 	iwm_write_prph(sc, IWM_SCD_DRAM_BASE_ADDR, sc->sched_dma.paddr >> 10);
1650 
1651 	iwm_write_prph(sc, IWM_SCD_CHAINEXT_EN, 0);
1652 
1653 	iwm_nic_unlock(sc);
1654 
1655 	/* enable command channel */
1656 	error = iwm_enable_txq(sc, 0 /* unused */, IWM_MVM_CMD_QUEUE, 7);
1657 	if (error)
1658 		return error;
1659 
1660 	if (!iwm_nic_lock(sc))
1661 		return EBUSY;
1662 
1663 	iwm_write_prph(sc, IWM_SCD_TXFACT, 0xff);
1664 
1665 	/* Enable DMA channels. */
1666 	for (chnl = 0; chnl < IWM_FH_TCSR_CHNL_NUM; chnl++) {
1667 		IWM_WRITE(sc, IWM_FH_TCSR_CHNL_TX_CONFIG_REG(chnl),
1668 		    IWM_FH_TCSR_TX_CONFIG_REG_VAL_DMA_CHNL_ENABLE |
1669 		    IWM_FH_TCSR_TX_CONFIG_REG_VAL_DMA_CREDIT_ENABLE);
1670 	}
1671 
1672 	IWM_SETBITS(sc, IWM_FH_TX_CHICKEN_BITS_REG,
1673 	    IWM_FH_TX_CHICKEN_BITS_SCD_AUTO_RETRY_EN);
1674 
1675 	iwm_nic_unlock(sc);
1676 
1677 	/* Enable L1-Active */
1678 	if (sc->cfg->device_family != IWM_DEVICE_FAMILY_8000) {
1679 		iwm_clear_bits_prph(sc, IWM_APMG_PCIDEV_STT_REG,
1680 		    IWM_APMG_PCIDEV_STT_VAL_L1_ACT_DIS);
1681 	}
1682 
1683 	return error;
1684 }
1685 
1686 /*
1687  * NVM read access and content parsing.  We do not support
1688  * external NVM or writing NVM.
1689  * iwlwifi/mvm/nvm.c
1690  */
1691 
1692 /* Default NVM size to read */
1693 #define IWM_NVM_DEFAULT_CHUNK_SIZE	(2*1024)
1694 
1695 #define IWM_NVM_WRITE_OPCODE 1
1696 #define IWM_NVM_READ_OPCODE 0
1697 
1698 /* load nvm chunk response */
1699 enum {
1700 	IWM_READ_NVM_CHUNK_SUCCEED = 0,
1701 	IWM_READ_NVM_CHUNK_NOT_VALID_ADDRESS = 1
1702 };
1703 
1704 static int
1705 iwm_nvm_read_chunk(struct iwm_softc *sc, uint16_t section,
1706 	uint16_t offset, uint16_t length, uint8_t *data, uint16_t *len)
1707 {
1708 	struct iwm_nvm_access_cmd nvm_access_cmd = {
1709 		.offset = htole16(offset),
1710 		.length = htole16(length),
1711 		.type = htole16(section),
1712 		.op_code = IWM_NVM_READ_OPCODE,
1713 	};
1714 	struct iwm_nvm_access_resp *nvm_resp;
1715 	struct iwm_rx_packet *pkt;
1716 	struct iwm_host_cmd cmd = {
1717 		.id = IWM_NVM_ACCESS_CMD,
1718 		.flags = IWM_CMD_WANT_SKB | IWM_CMD_SEND_IN_RFKILL,
1719 		.data = { &nvm_access_cmd, },
1720 	};
1721 	int ret, bytes_read, offset_read;
1722 	uint8_t *resp_data;
1723 
1724 	cmd.len[0] = sizeof(struct iwm_nvm_access_cmd);
1725 
1726 	ret = iwm_send_cmd(sc, &cmd);
1727 	if (ret) {
1728 		device_printf(sc->sc_dev,
1729 		    "Could not send NVM_ACCESS command (error=%d)\n", ret);
1730 		return ret;
1731 	}
1732 
1733 	pkt = cmd.resp_pkt;
1734 
1735 	/* Extract NVM response */
1736 	nvm_resp = (void *)pkt->data;
1737 	ret = le16toh(nvm_resp->status);
1738 	bytes_read = le16toh(nvm_resp->length);
1739 	offset_read = le16toh(nvm_resp->offset);
1740 	resp_data = nvm_resp->data;
1741 	if (ret) {
1742 		if ((offset != 0) &&
1743 		    (ret == IWM_READ_NVM_CHUNK_NOT_VALID_ADDRESS)) {
1744 			/*
1745 			 * meaning of NOT_VALID_ADDRESS:
1746 			 * driver try to read chunk from address that is
1747 			 * multiple of 2K and got an error since addr is empty.
1748 			 * meaning of (offset != 0): driver already
1749 			 * read valid data from another chunk so this case
1750 			 * is not an error.
1751 			 */
1752 			IWM_DPRINTF(sc, IWM_DEBUG_EEPROM | IWM_DEBUG_RESET,
1753 				    "NVM access command failed on offset 0x%x since that section size is multiple 2K\n",
1754 				    offset);
1755 			*len = 0;
1756 			ret = 0;
1757 		} else {
1758 			IWM_DPRINTF(sc, IWM_DEBUG_EEPROM | IWM_DEBUG_RESET,
1759 				    "NVM access command failed with status %d\n", ret);
1760 			ret = EIO;
1761 		}
1762 		goto exit;
1763 	}
1764 
1765 	if (offset_read != offset) {
1766 		device_printf(sc->sc_dev,
1767 		    "NVM ACCESS response with invalid offset %d\n",
1768 		    offset_read);
1769 		ret = EINVAL;
1770 		goto exit;
1771 	}
1772 
1773 	if (bytes_read > length) {
1774 		device_printf(sc->sc_dev,
1775 		    "NVM ACCESS response with too much data "
1776 		    "(%d bytes requested, %d bytes received)\n",
1777 		    length, bytes_read);
1778 		ret = EINVAL;
1779 		goto exit;
1780 	}
1781 
1782 	/* Write data to NVM */
1783 	memcpy(data + offset, resp_data, bytes_read);
1784 	*len = bytes_read;
1785 
1786  exit:
1787 	iwm_free_resp(sc, &cmd);
1788 	return ret;
1789 }
1790 
1791 /*
1792  * Reads an NVM section completely.
1793  * NICs prior to 7000 family don't have a real NVM, but just read
1794  * section 0 which is the EEPROM. Because the EEPROM reading is unlimited
1795  * by uCode, we need to manually check in this case that we don't
1796  * overflow and try to read more than the EEPROM size.
1797  * For 7000 family NICs, we supply the maximal size we can read, and
1798  * the uCode fills the response with as much data as we can,
1799  * without overflowing, so no check is needed.
1800  */
1801 static int
1802 iwm_nvm_read_section(struct iwm_softc *sc,
1803 	uint16_t section, uint8_t *data, uint16_t *len, uint32_t size_read)
1804 {
1805 	uint16_t seglen, length, offset = 0;
1806 	int ret;
1807 
1808 	/* Set nvm section read length */
1809 	length = IWM_NVM_DEFAULT_CHUNK_SIZE;
1810 
1811 	seglen = length;
1812 
1813 	/* Read the NVM until exhausted (reading less than requested) */
1814 	while (seglen == length) {
1815 		/* Check no memory assumptions fail and cause an overflow */
1816 		if ((size_read + offset + length) >
1817 		    sc->cfg->eeprom_size) {
1818 			device_printf(sc->sc_dev,
1819 			    "EEPROM size is too small for NVM\n");
1820 			return ENOBUFS;
1821 		}
1822 
1823 		ret = iwm_nvm_read_chunk(sc, section, offset, length, data, &seglen);
1824 		if (ret) {
1825 			IWM_DPRINTF(sc, IWM_DEBUG_EEPROM | IWM_DEBUG_RESET,
1826 				    "Cannot read NVM from section %d offset %d, length %d\n",
1827 				    section, offset, length);
1828 			return ret;
1829 		}
1830 		offset += seglen;
1831 	}
1832 
1833 	IWM_DPRINTF(sc, IWM_DEBUG_EEPROM | IWM_DEBUG_RESET,
1834 		    "NVM section %d read completed\n", section);
1835 	*len = offset;
1836 	return 0;
1837 }
1838 
1839 /*
1840  * BEGIN IWM_NVM_PARSE
1841  */
1842 
1843 /* iwlwifi/iwl-nvm-parse.c */
1844 
1845 /* NVM offsets (in words) definitions */
1846 enum iwm_nvm_offsets {
1847 	/* NVM HW-Section offset (in words) definitions */
1848 	IWM_HW_ADDR = 0x15,
1849 
1850 /* NVM SW-Section offset (in words) definitions */
1851 	IWM_NVM_SW_SECTION = 0x1C0,
1852 	IWM_NVM_VERSION = 0,
1853 	IWM_RADIO_CFG = 1,
1854 	IWM_SKU = 2,
1855 	IWM_N_HW_ADDRS = 3,
1856 	IWM_NVM_CHANNELS = 0x1E0 - IWM_NVM_SW_SECTION,
1857 
1858 /* NVM calibration section offset (in words) definitions */
1859 	IWM_NVM_CALIB_SECTION = 0x2B8,
1860 	IWM_XTAL_CALIB = 0x316 - IWM_NVM_CALIB_SECTION
1861 };
1862 
1863 enum iwm_8000_nvm_offsets {
1864 	/* NVM HW-Section offset (in words) definitions */
1865 	IWM_HW_ADDR0_WFPM_8000 = 0x12,
1866 	IWM_HW_ADDR1_WFPM_8000 = 0x16,
1867 	IWM_HW_ADDR0_PCIE_8000 = 0x8A,
1868 	IWM_HW_ADDR1_PCIE_8000 = 0x8E,
1869 	IWM_MAC_ADDRESS_OVERRIDE_8000 = 1,
1870 
1871 	/* NVM SW-Section offset (in words) definitions */
1872 	IWM_NVM_SW_SECTION_8000 = 0x1C0,
1873 	IWM_NVM_VERSION_8000 = 0,
1874 	IWM_RADIO_CFG_8000 = 0,
1875 	IWM_SKU_8000 = 2,
1876 	IWM_N_HW_ADDRS_8000 = 3,
1877 
1878 	/* NVM REGULATORY -Section offset (in words) definitions */
1879 	IWM_NVM_CHANNELS_8000 = 0,
1880 	IWM_NVM_LAR_OFFSET_8000_OLD = 0x4C7,
1881 	IWM_NVM_LAR_OFFSET_8000 = 0x507,
1882 	IWM_NVM_LAR_ENABLED_8000 = 0x7,
1883 
1884 	/* NVM calibration section offset (in words) definitions */
1885 	IWM_NVM_CALIB_SECTION_8000 = 0x2B8,
1886 	IWM_XTAL_CALIB_8000 = 0x316 - IWM_NVM_CALIB_SECTION_8000
1887 };
1888 
1889 /* SKU Capabilities (actual values from NVM definition) */
1890 enum nvm_sku_bits {
1891 	IWM_NVM_SKU_CAP_BAND_24GHZ	= (1 << 0),
1892 	IWM_NVM_SKU_CAP_BAND_52GHZ	= (1 << 1),
1893 	IWM_NVM_SKU_CAP_11N_ENABLE	= (1 << 2),
1894 	IWM_NVM_SKU_CAP_11AC_ENABLE	= (1 << 3),
1895 };
1896 
1897 /* radio config bits (actual values from NVM definition) */
1898 #define IWM_NVM_RF_CFG_DASH_MSK(x)   (x & 0x3)         /* bits 0-1   */
1899 #define IWM_NVM_RF_CFG_STEP_MSK(x)   ((x >> 2)  & 0x3) /* bits 2-3   */
1900 #define IWM_NVM_RF_CFG_TYPE_MSK(x)   ((x >> 4)  & 0x3) /* bits 4-5   */
1901 #define IWM_NVM_RF_CFG_PNUM_MSK(x)   ((x >> 6)  & 0x3) /* bits 6-7   */
1902 #define IWM_NVM_RF_CFG_TX_ANT_MSK(x) ((x >> 8)  & 0xF) /* bits 8-11  */
1903 #define IWM_NVM_RF_CFG_RX_ANT_MSK(x) ((x >> 12) & 0xF) /* bits 12-15 */
1904 
1905 #define IWM_NVM_RF_CFG_FLAVOR_MSK_8000(x)	(x & 0xF)
1906 #define IWM_NVM_RF_CFG_DASH_MSK_8000(x)		((x >> 4) & 0xF)
1907 #define IWM_NVM_RF_CFG_STEP_MSK_8000(x)		((x >> 8) & 0xF)
1908 #define IWM_NVM_RF_CFG_TYPE_MSK_8000(x)		((x >> 12) & 0xFFF)
1909 #define IWM_NVM_RF_CFG_TX_ANT_MSK_8000(x)	((x >> 24) & 0xF)
1910 #define IWM_NVM_RF_CFG_RX_ANT_MSK_8000(x)	((x >> 28) & 0xF)
1911 
1912 #define DEFAULT_MAX_TX_POWER 16
1913 
1914 /**
1915  * enum iwm_nvm_channel_flags - channel flags in NVM
1916  * @IWM_NVM_CHANNEL_VALID: channel is usable for this SKU/geo
1917  * @IWM_NVM_CHANNEL_IBSS: usable as an IBSS channel
1918  * @IWM_NVM_CHANNEL_ACTIVE: active scanning allowed
1919  * @IWM_NVM_CHANNEL_RADAR: radar detection required
1920  * XXX cannot find this (DFS) flag in iwm-nvm-parse.c
1921  * @IWM_NVM_CHANNEL_DFS: dynamic freq selection candidate
1922  * @IWM_NVM_CHANNEL_WIDE: 20 MHz channel okay (?)
1923  * @IWM_NVM_CHANNEL_40MHZ: 40 MHz channel okay (?)
1924  * @IWM_NVM_CHANNEL_80MHZ: 80 MHz channel okay (?)
1925  * @IWM_NVM_CHANNEL_160MHZ: 160 MHz channel okay (?)
1926  */
1927 enum iwm_nvm_channel_flags {
1928 	IWM_NVM_CHANNEL_VALID = (1 << 0),
1929 	IWM_NVM_CHANNEL_IBSS = (1 << 1),
1930 	IWM_NVM_CHANNEL_ACTIVE = (1 << 3),
1931 	IWM_NVM_CHANNEL_RADAR = (1 << 4),
1932 	IWM_NVM_CHANNEL_DFS = (1 << 7),
1933 	IWM_NVM_CHANNEL_WIDE = (1 << 8),
1934 	IWM_NVM_CHANNEL_40MHZ = (1 << 9),
1935 	IWM_NVM_CHANNEL_80MHZ = (1 << 10),
1936 	IWM_NVM_CHANNEL_160MHZ = (1 << 11),
1937 };
1938 
1939 /*
1940  * Translate EEPROM flags to net80211.
1941  */
1942 static uint32_t
1943 iwm_eeprom_channel_flags(uint16_t ch_flags)
1944 {
1945 	uint32_t nflags;
1946 
1947 	nflags = 0;
1948 	if ((ch_flags & IWM_NVM_CHANNEL_ACTIVE) == 0)
1949 		nflags |= IEEE80211_CHAN_PASSIVE;
1950 	if ((ch_flags & IWM_NVM_CHANNEL_IBSS) == 0)
1951 		nflags |= IEEE80211_CHAN_NOADHOC;
1952 	if (ch_flags & IWM_NVM_CHANNEL_RADAR) {
1953 		nflags |= IEEE80211_CHAN_DFS;
1954 		/* Just in case. */
1955 		nflags |= IEEE80211_CHAN_NOADHOC;
1956 	}
1957 
1958 	return (nflags);
1959 }
1960 
1961 static void
1962 iwm_add_channel_band(struct iwm_softc *sc, struct ieee80211_channel chans[],
1963     int maxchans, int *nchans, int ch_idx, size_t ch_num,
1964     const uint8_t bands[])
1965 {
1966 	const uint16_t * const nvm_ch_flags = sc->nvm_data->nvm_ch_flags;
1967 	uint32_t nflags;
1968 	uint16_t ch_flags;
1969 	uint8_t ieee;
1970 	int error;
1971 
1972 	for (; ch_idx < ch_num; ch_idx++) {
1973 		ch_flags = le16_to_cpup(nvm_ch_flags + ch_idx);
1974 		if (sc->cfg->device_family == IWM_DEVICE_FAMILY_7000)
1975 			ieee = iwm_nvm_channels[ch_idx];
1976 		else
1977 			ieee = iwm_nvm_channels_8000[ch_idx];
1978 
1979 		if (!(ch_flags & IWM_NVM_CHANNEL_VALID)) {
1980 			IWM_DPRINTF(sc, IWM_DEBUG_EEPROM,
1981 			    "Ch. %d Flags %x [%sGHz] - No traffic\n",
1982 			    ieee, ch_flags,
1983 			    (ch_idx >= IWM_NUM_2GHZ_CHANNELS) ?
1984 			    "5.2" : "2.4");
1985 			continue;
1986 		}
1987 
1988 		nflags = iwm_eeprom_channel_flags(ch_flags);
1989 		error = ieee80211_add_channel(chans, maxchans, nchans,
1990 		    ieee, 0, 0, nflags, bands);
1991 		if (error != 0)
1992 			break;
1993 
1994 		IWM_DPRINTF(sc, IWM_DEBUG_EEPROM,
1995 		    "Ch. %d Flags %x [%sGHz] - Added\n",
1996 		    ieee, ch_flags,
1997 		    (ch_idx >= IWM_NUM_2GHZ_CHANNELS) ?
1998 		    "5.2" : "2.4");
1999 	}
2000 }
2001 
2002 static void
2003 iwm_init_channel_map(struct ieee80211com *ic, int maxchans, int *nchans,
2004     struct ieee80211_channel chans[])
2005 {
2006 	struct iwm_softc *sc = ic->ic_softc;
2007 	struct iwm_nvm_data *data = sc->nvm_data;
2008 	uint8_t bands[IEEE80211_MODE_BYTES];
2009 	size_t ch_num;
2010 
2011 	memset(bands, 0, sizeof(bands));
2012 	/* 1-13: 11b/g channels. */
2013 	setbit(bands, IEEE80211_MODE_11B);
2014 	setbit(bands, IEEE80211_MODE_11G);
2015 	iwm_add_channel_band(sc, chans, maxchans, nchans, 0,
2016 	    IWM_NUM_2GHZ_CHANNELS - 1, bands);
2017 
2018 	/* 14: 11b channel only. */
2019 	clrbit(bands, IEEE80211_MODE_11G);
2020 	iwm_add_channel_band(sc, chans, maxchans, nchans,
2021 	    IWM_NUM_2GHZ_CHANNELS - 1, IWM_NUM_2GHZ_CHANNELS, bands);
2022 
2023 	if (data->sku_cap_band_52GHz_enable) {
2024 		if (sc->cfg->device_family == IWM_DEVICE_FAMILY_7000)
2025 			ch_num = nitems(iwm_nvm_channels);
2026 		else
2027 			ch_num = nitems(iwm_nvm_channels_8000);
2028 		memset(bands, 0, sizeof(bands));
2029 		setbit(bands, IEEE80211_MODE_11A);
2030 		iwm_add_channel_band(sc, chans, maxchans, nchans,
2031 		    IWM_NUM_2GHZ_CHANNELS, ch_num, bands);
2032 	}
2033 }
2034 
2035 static void
2036 iwm_set_hw_address_family_8000(struct iwm_softc *sc, struct iwm_nvm_data *data,
2037 	const uint16_t *mac_override, const uint16_t *nvm_hw)
2038 {
2039 	const uint8_t *hw_addr;
2040 
2041 	if (mac_override) {
2042 		static const uint8_t reserved_mac[] = {
2043 			0x02, 0xcc, 0xaa, 0xff, 0xee, 0x00
2044 		};
2045 
2046 		hw_addr = (const uint8_t *)(mac_override +
2047 				 IWM_MAC_ADDRESS_OVERRIDE_8000);
2048 
2049 		/*
2050 		 * Store the MAC address from MAO section.
2051 		 * No byte swapping is required in MAO section
2052 		 */
2053 		IEEE80211_ADDR_COPY(data->hw_addr, hw_addr);
2054 
2055 		/*
2056 		 * Force the use of the OTP MAC address in case of reserved MAC
2057 		 * address in the NVM, or if address is given but invalid.
2058 		 */
2059 		if (!IEEE80211_ADDR_EQ(reserved_mac, hw_addr) &&
2060 		    !IEEE80211_ADDR_EQ(ieee80211broadcastaddr, data->hw_addr) &&
2061 		    iwm_is_valid_ether_addr(data->hw_addr) &&
2062 		    !IEEE80211_IS_MULTICAST(data->hw_addr))
2063 			return;
2064 
2065 		IWM_DPRINTF(sc, IWM_DEBUG_RESET,
2066 		    "%s: mac address from nvm override section invalid\n",
2067 		    __func__);
2068 	}
2069 
2070 	if (nvm_hw) {
2071 		/* read the mac address from WFMP registers */
2072 		uint32_t mac_addr0 =
2073 		    htole32(iwm_read_prph(sc, IWM_WFMP_MAC_ADDR_0));
2074 		uint32_t mac_addr1 =
2075 		    htole32(iwm_read_prph(sc, IWM_WFMP_MAC_ADDR_1));
2076 
2077 		hw_addr = (const uint8_t *)&mac_addr0;
2078 		data->hw_addr[0] = hw_addr[3];
2079 		data->hw_addr[1] = hw_addr[2];
2080 		data->hw_addr[2] = hw_addr[1];
2081 		data->hw_addr[3] = hw_addr[0];
2082 
2083 		hw_addr = (const uint8_t *)&mac_addr1;
2084 		data->hw_addr[4] = hw_addr[1];
2085 		data->hw_addr[5] = hw_addr[0];
2086 
2087 		return;
2088 	}
2089 
2090 	device_printf(sc->sc_dev, "%s: mac address not found\n", __func__);
2091 	memset(data->hw_addr, 0, sizeof(data->hw_addr));
2092 }
2093 
2094 static int
2095 iwm_get_sku(const struct iwm_softc *sc, const uint16_t *nvm_sw,
2096 	    const uint16_t *phy_sku)
2097 {
2098 	if (sc->cfg->device_family != IWM_DEVICE_FAMILY_8000)
2099 		return le16_to_cpup(nvm_sw + IWM_SKU);
2100 
2101 	return le32_to_cpup((const uint32_t *)(phy_sku + IWM_SKU_8000));
2102 }
2103 
2104 static int
2105 iwm_get_nvm_version(const struct iwm_softc *sc, const uint16_t *nvm_sw)
2106 {
2107 	if (sc->cfg->device_family != IWM_DEVICE_FAMILY_8000)
2108 		return le16_to_cpup(nvm_sw + IWM_NVM_VERSION);
2109 	else
2110 		return le32_to_cpup((const uint32_t *)(nvm_sw +
2111 						IWM_NVM_VERSION_8000));
2112 }
2113 
2114 static int
2115 iwm_get_radio_cfg(const struct iwm_softc *sc, const uint16_t *nvm_sw,
2116 		  const uint16_t *phy_sku)
2117 {
2118         if (sc->cfg->device_family != IWM_DEVICE_FAMILY_8000)
2119                 return le16_to_cpup(nvm_sw + IWM_RADIO_CFG);
2120 
2121         return le32_to_cpup((const uint32_t *)(phy_sku + IWM_RADIO_CFG_8000));
2122 }
2123 
2124 static int
2125 iwm_get_n_hw_addrs(const struct iwm_softc *sc, const uint16_t *nvm_sw)
2126 {
2127 	int n_hw_addr;
2128 
2129 	if (sc->cfg->device_family != IWM_DEVICE_FAMILY_8000)
2130 		return le16_to_cpup(nvm_sw + IWM_N_HW_ADDRS);
2131 
2132 	n_hw_addr = le32_to_cpup((const uint32_t *)(nvm_sw + IWM_N_HW_ADDRS_8000));
2133 
2134         return n_hw_addr & IWM_N_HW_ADDR_MASK;
2135 }
2136 
2137 static void
2138 iwm_set_radio_cfg(const struct iwm_softc *sc, struct iwm_nvm_data *data,
2139 		  uint32_t radio_cfg)
2140 {
2141 	if (sc->cfg->device_family != IWM_DEVICE_FAMILY_8000) {
2142 		data->radio_cfg_type = IWM_NVM_RF_CFG_TYPE_MSK(radio_cfg);
2143 		data->radio_cfg_step = IWM_NVM_RF_CFG_STEP_MSK(radio_cfg);
2144 		data->radio_cfg_dash = IWM_NVM_RF_CFG_DASH_MSK(radio_cfg);
2145 		data->radio_cfg_pnum = IWM_NVM_RF_CFG_PNUM_MSK(radio_cfg);
2146 		return;
2147 	}
2148 
2149 	/* set the radio configuration for family 8000 */
2150 	data->radio_cfg_type = IWM_NVM_RF_CFG_TYPE_MSK_8000(radio_cfg);
2151 	data->radio_cfg_step = IWM_NVM_RF_CFG_STEP_MSK_8000(radio_cfg);
2152 	data->radio_cfg_dash = IWM_NVM_RF_CFG_DASH_MSK_8000(radio_cfg);
2153 	data->radio_cfg_pnum = IWM_NVM_RF_CFG_FLAVOR_MSK_8000(radio_cfg);
2154 	data->valid_tx_ant = IWM_NVM_RF_CFG_TX_ANT_MSK_8000(radio_cfg);
2155 	data->valid_rx_ant = IWM_NVM_RF_CFG_RX_ANT_MSK_8000(radio_cfg);
2156 }
2157 
2158 static int
2159 iwm_set_hw_address(struct iwm_softc *sc, struct iwm_nvm_data *data,
2160 		   const uint16_t *nvm_hw, const uint16_t *mac_override)
2161 {
2162 #ifdef notyet /* for FAMILY 9000 */
2163 	if (cfg->mac_addr_from_csr) {
2164 		iwm_set_hw_address_from_csr(sc, data);
2165         } else
2166 #endif
2167 	if (sc->cfg->device_family != IWM_DEVICE_FAMILY_8000) {
2168 		const uint8_t *hw_addr = (const uint8_t *)(nvm_hw + IWM_HW_ADDR);
2169 
2170 		/* The byte order is little endian 16 bit, meaning 214365 */
2171 		data->hw_addr[0] = hw_addr[1];
2172 		data->hw_addr[1] = hw_addr[0];
2173 		data->hw_addr[2] = hw_addr[3];
2174 		data->hw_addr[3] = hw_addr[2];
2175 		data->hw_addr[4] = hw_addr[5];
2176 		data->hw_addr[5] = hw_addr[4];
2177 	} else {
2178 		iwm_set_hw_address_family_8000(sc, data, mac_override, nvm_hw);
2179 	}
2180 
2181 	if (!iwm_is_valid_ether_addr(data->hw_addr)) {
2182 		device_printf(sc->sc_dev, "no valid mac address was found\n");
2183 		return EINVAL;
2184 	}
2185 
2186 	return 0;
2187 }
2188 
2189 static struct iwm_nvm_data *
2190 iwm_parse_nvm_data(struct iwm_softc *sc,
2191 		   const uint16_t *nvm_hw, const uint16_t *nvm_sw,
2192 		   const uint16_t *nvm_calib, const uint16_t *mac_override,
2193 		   const uint16_t *phy_sku, const uint16_t *regulatory)
2194 {
2195 	struct iwm_nvm_data *data;
2196 	uint32_t sku, radio_cfg;
2197 	uint16_t lar_config;
2198 
2199 	if (sc->cfg->device_family != IWM_DEVICE_FAMILY_8000) {
2200 		data = malloc(sizeof(*data) +
2201 		    IWM_NUM_CHANNELS * sizeof(uint16_t),
2202 		    M_DEVBUF, M_NOWAIT | M_ZERO);
2203 	} else {
2204 		data = malloc(sizeof(*data) +
2205 		    IWM_NUM_CHANNELS_8000 * sizeof(uint16_t),
2206 		    M_DEVBUF, M_NOWAIT | M_ZERO);
2207 	}
2208 	if (!data)
2209 		return NULL;
2210 
2211 	data->nvm_version = iwm_get_nvm_version(sc, nvm_sw);
2212 
2213 	radio_cfg = iwm_get_radio_cfg(sc, nvm_sw, phy_sku);
2214 	iwm_set_radio_cfg(sc, data, radio_cfg);
2215 
2216 	sku = iwm_get_sku(sc, nvm_sw, phy_sku);
2217 	data->sku_cap_band_24GHz_enable = sku & IWM_NVM_SKU_CAP_BAND_24GHZ;
2218 	data->sku_cap_band_52GHz_enable = sku & IWM_NVM_SKU_CAP_BAND_52GHZ;
2219 	data->sku_cap_11n_enable = 0;
2220 
2221 	data->n_hw_addrs = iwm_get_n_hw_addrs(sc, nvm_sw);
2222 
2223 	if (sc->cfg->device_family == IWM_DEVICE_FAMILY_8000) {
2224 		uint16_t lar_offset = data->nvm_version < 0xE39 ?
2225 				       IWM_NVM_LAR_OFFSET_8000_OLD :
2226 				       IWM_NVM_LAR_OFFSET_8000;
2227 
2228 		lar_config = le16_to_cpup(regulatory + lar_offset);
2229 		data->lar_enabled = !!(lar_config &
2230 				       IWM_NVM_LAR_ENABLED_8000);
2231 	}
2232 
2233 	/* If no valid mac address was found - bail out */
2234 	if (iwm_set_hw_address(sc, data, nvm_hw, mac_override)) {
2235 		free(data, M_DEVBUF);
2236 		return NULL;
2237 	}
2238 
2239 	if (sc->cfg->device_family == IWM_DEVICE_FAMILY_7000) {
2240 		memcpy(data->nvm_ch_flags, &nvm_sw[IWM_NVM_CHANNELS],
2241 		    IWM_NUM_CHANNELS * sizeof(uint16_t));
2242 	} else {
2243 		memcpy(data->nvm_ch_flags, &regulatory[IWM_NVM_CHANNELS_8000],
2244 		    IWM_NUM_CHANNELS_8000 * sizeof(uint16_t));
2245 	}
2246 
2247 	return data;
2248 }
2249 
2250 static void
2251 iwm_free_nvm_data(struct iwm_nvm_data *data)
2252 {
2253 	if (data != NULL)
2254 		free(data, M_DEVBUF);
2255 }
2256 
2257 static struct iwm_nvm_data *
2258 iwm_parse_nvm_sections(struct iwm_softc *sc, struct iwm_nvm_section *sections)
2259 {
2260 	const uint16_t *hw, *sw, *calib, *regulatory, *mac_override, *phy_sku;
2261 
2262 	/* Checking for required sections */
2263 	if (sc->cfg->device_family == IWM_DEVICE_FAMILY_7000) {
2264 		if (!sections[IWM_NVM_SECTION_TYPE_SW].data ||
2265 		    !sections[sc->cfg->nvm_hw_section_num].data) {
2266 			device_printf(sc->sc_dev,
2267 			    "Can't parse empty OTP/NVM sections\n");
2268 			return NULL;
2269 		}
2270 	} else if (sc->cfg->device_family == IWM_DEVICE_FAMILY_8000) {
2271 		/* SW and REGULATORY sections are mandatory */
2272 		if (!sections[IWM_NVM_SECTION_TYPE_SW].data ||
2273 		    !sections[IWM_NVM_SECTION_TYPE_REGULATORY].data) {
2274 			device_printf(sc->sc_dev,
2275 			    "Can't parse empty OTP/NVM sections\n");
2276 			return NULL;
2277 		}
2278 		/* MAC_OVERRIDE or at least HW section must exist */
2279 		if (!sections[sc->cfg->nvm_hw_section_num].data &&
2280 		    !sections[IWM_NVM_SECTION_TYPE_MAC_OVERRIDE].data) {
2281 			device_printf(sc->sc_dev,
2282 			    "Can't parse mac_address, empty sections\n");
2283 			return NULL;
2284 		}
2285 
2286 		/* PHY_SKU section is mandatory in B0 */
2287 		if (!sections[IWM_NVM_SECTION_TYPE_PHY_SKU].data) {
2288 			device_printf(sc->sc_dev,
2289 			    "Can't parse phy_sku in B0, empty sections\n");
2290 			return NULL;
2291 		}
2292 	} else {
2293 		panic("unknown device family %d\n", sc->cfg->device_family);
2294 	}
2295 
2296 	hw = (const uint16_t *) sections[sc->cfg->nvm_hw_section_num].data;
2297 	sw = (const uint16_t *)sections[IWM_NVM_SECTION_TYPE_SW].data;
2298 	calib = (const uint16_t *)
2299 	    sections[IWM_NVM_SECTION_TYPE_CALIBRATION].data;
2300 	regulatory = (const uint16_t *)
2301 	    sections[IWM_NVM_SECTION_TYPE_REGULATORY].data;
2302 	mac_override = (const uint16_t *)
2303 	    sections[IWM_NVM_SECTION_TYPE_MAC_OVERRIDE].data;
2304 	phy_sku = (const uint16_t *)sections[IWM_NVM_SECTION_TYPE_PHY_SKU].data;
2305 
2306 	return iwm_parse_nvm_data(sc, hw, sw, calib, mac_override,
2307 	    phy_sku, regulatory);
2308 }
2309 
2310 static int
2311 iwm_nvm_init(struct iwm_softc *sc)
2312 {
2313 	struct iwm_nvm_section nvm_sections[IWM_NVM_MAX_NUM_SECTIONS];
2314 	int i, ret, section;
2315 	uint32_t size_read = 0;
2316 	uint8_t *nvm_buffer, *temp;
2317 	uint16_t len;
2318 
2319 	memset(nvm_sections, 0, sizeof(nvm_sections));
2320 
2321 	if (sc->cfg->nvm_hw_section_num >= IWM_NVM_MAX_NUM_SECTIONS)
2322 		return EINVAL;
2323 
2324 	/* load NVM values from nic */
2325 	/* Read From FW NVM */
2326 	IWM_DPRINTF(sc, IWM_DEBUG_EEPROM, "Read from NVM\n");
2327 
2328 	nvm_buffer = malloc(sc->cfg->eeprom_size, M_DEVBUF, M_NOWAIT | M_ZERO);
2329 	if (!nvm_buffer)
2330 		return ENOMEM;
2331 	for (section = 0; section < IWM_NVM_MAX_NUM_SECTIONS; section++) {
2332 		/* we override the constness for initial read */
2333 		ret = iwm_nvm_read_section(sc, section, nvm_buffer,
2334 					   &len, size_read);
2335 		if (ret)
2336 			continue;
2337 		size_read += len;
2338 		temp = malloc(len, M_DEVBUF, M_NOWAIT);
2339 		if (!temp) {
2340 			ret = ENOMEM;
2341 			break;
2342 		}
2343 		memcpy(temp, nvm_buffer, len);
2344 
2345 		nvm_sections[section].data = temp;
2346 		nvm_sections[section].length = len;
2347 	}
2348 	if (!size_read)
2349 		device_printf(sc->sc_dev, "OTP is blank\n");
2350 	free(nvm_buffer, M_DEVBUF);
2351 
2352 	sc->nvm_data = iwm_parse_nvm_sections(sc, nvm_sections);
2353 	if (!sc->nvm_data)
2354 		return EINVAL;
2355 	IWM_DPRINTF(sc, IWM_DEBUG_EEPROM | IWM_DEBUG_RESET,
2356 		    "nvm version = %x\n", sc->nvm_data->nvm_version);
2357 
2358 	for (i = 0; i < IWM_NVM_MAX_NUM_SECTIONS; i++) {
2359 		if (nvm_sections[i].data != NULL)
2360 			free(nvm_sections[i].data, M_DEVBUF);
2361 	}
2362 
2363 	return 0;
2364 }
2365 
2366 static int
2367 iwm_pcie_load_section(struct iwm_softc *sc, uint8_t section_num,
2368 	const struct iwm_fw_desc *section)
2369 {
2370 	struct iwm_dma_info *dma = &sc->fw_dma;
2371 	uint8_t *v_addr;
2372 	bus_addr_t p_addr;
2373 	uint32_t offset, chunk_sz = MIN(IWM_FH_MEM_TB_MAX_LENGTH, section->len);
2374 	int ret = 0;
2375 
2376 	IWM_DPRINTF(sc, IWM_DEBUG_RESET,
2377 		    "%s: [%d] uCode section being loaded...\n",
2378 		    __func__, section_num);
2379 
2380 	v_addr = dma->vaddr;
2381 	p_addr = dma->paddr;
2382 
2383 	for (offset = 0; offset < section->len; offset += chunk_sz) {
2384 		uint32_t copy_size, dst_addr;
2385 		int extended_addr = FALSE;
2386 
2387 		copy_size = MIN(chunk_sz, section->len - offset);
2388 		dst_addr = section->offset + offset;
2389 
2390 		if (dst_addr >= IWM_FW_MEM_EXTENDED_START &&
2391 		    dst_addr <= IWM_FW_MEM_EXTENDED_END)
2392 			extended_addr = TRUE;
2393 
2394 		if (extended_addr)
2395 			iwm_set_bits_prph(sc, IWM_LMPM_CHICK,
2396 					  IWM_LMPM_CHICK_EXTENDED_ADDR_SPACE);
2397 
2398 		memcpy(v_addr, (const uint8_t *)section->data + offset,
2399 		    copy_size);
2400 		bus_dmamap_sync(dma->tag, dma->map, BUS_DMASYNC_PREWRITE);
2401 		ret = iwm_pcie_load_firmware_chunk(sc, dst_addr, p_addr,
2402 						   copy_size);
2403 
2404 		if (extended_addr)
2405 			iwm_clear_bits_prph(sc, IWM_LMPM_CHICK,
2406 					    IWM_LMPM_CHICK_EXTENDED_ADDR_SPACE);
2407 
2408 		if (ret) {
2409 			device_printf(sc->sc_dev,
2410 			    "%s: Could not load the [%d] uCode section\n",
2411 			    __func__, section_num);
2412 			break;
2413 		}
2414 	}
2415 
2416 	return ret;
2417 }
2418 
2419 /*
2420  * ucode
2421  */
2422 static int
2423 iwm_pcie_load_firmware_chunk(struct iwm_softc *sc, uint32_t dst_addr,
2424 			     bus_addr_t phy_addr, uint32_t byte_cnt)
2425 {
2426 	int ret;
2427 
2428 	sc->sc_fw_chunk_done = 0;
2429 
2430 	if (!iwm_nic_lock(sc))
2431 		return EBUSY;
2432 
2433 	IWM_WRITE(sc, IWM_FH_TCSR_CHNL_TX_CONFIG_REG(IWM_FH_SRVC_CHNL),
2434 	    IWM_FH_TCSR_TX_CONFIG_REG_VAL_DMA_CHNL_PAUSE);
2435 
2436 	IWM_WRITE(sc, IWM_FH_SRVC_CHNL_SRAM_ADDR_REG(IWM_FH_SRVC_CHNL),
2437 	    dst_addr);
2438 
2439 	IWM_WRITE(sc, IWM_FH_TFDIB_CTRL0_REG(IWM_FH_SRVC_CHNL),
2440 	    phy_addr & IWM_FH_MEM_TFDIB_DRAM_ADDR_LSB_MSK);
2441 
2442 	IWM_WRITE(sc, IWM_FH_TFDIB_CTRL1_REG(IWM_FH_SRVC_CHNL),
2443 	    (iwm_get_dma_hi_addr(phy_addr)
2444 	     << IWM_FH_MEM_TFDIB_REG1_ADDR_BITSHIFT) | byte_cnt);
2445 
2446 	IWM_WRITE(sc, IWM_FH_TCSR_CHNL_TX_BUF_STS_REG(IWM_FH_SRVC_CHNL),
2447 	    1 << IWM_FH_TCSR_CHNL_TX_BUF_STS_REG_POS_TB_NUM |
2448 	    1 << IWM_FH_TCSR_CHNL_TX_BUF_STS_REG_POS_TB_IDX |
2449 	    IWM_FH_TCSR_CHNL_TX_BUF_STS_REG_VAL_TFDB_VALID);
2450 
2451 	IWM_WRITE(sc, IWM_FH_TCSR_CHNL_TX_CONFIG_REG(IWM_FH_SRVC_CHNL),
2452 	    IWM_FH_TCSR_TX_CONFIG_REG_VAL_DMA_CHNL_ENABLE    |
2453 	    IWM_FH_TCSR_TX_CONFIG_REG_VAL_DMA_CREDIT_DISABLE |
2454 	    IWM_FH_TCSR_TX_CONFIG_REG_VAL_CIRQ_HOST_ENDTFD);
2455 
2456 	iwm_nic_unlock(sc);
2457 
2458 	/* wait up to 5s for this segment to load */
2459 	ret = 0;
2460 	while (!sc->sc_fw_chunk_done) {
2461 		ret = msleep(&sc->sc_fw, &sc->sc_mtx, 0, "iwmfw", hz);
2462 		if (ret)
2463 			break;
2464 	}
2465 
2466 	if (ret != 0) {
2467 		device_printf(sc->sc_dev,
2468 		    "fw chunk addr 0x%x len %d failed to load\n",
2469 		    dst_addr, byte_cnt);
2470 		return ETIMEDOUT;
2471 	}
2472 
2473 	return 0;
2474 }
2475 
2476 static int
2477 iwm_pcie_load_cpu_sections_8000(struct iwm_softc *sc,
2478 	const struct iwm_fw_sects *image, int cpu, int *first_ucode_section)
2479 {
2480 	int shift_param;
2481 	int i, ret = 0, sec_num = 0x1;
2482 	uint32_t val, last_read_idx = 0;
2483 
2484 	if (cpu == 1) {
2485 		shift_param = 0;
2486 		*first_ucode_section = 0;
2487 	} else {
2488 		shift_param = 16;
2489 		(*first_ucode_section)++;
2490 	}
2491 
2492 	for (i = *first_ucode_section; i < IWM_UCODE_SECTION_MAX; i++) {
2493 		last_read_idx = i;
2494 
2495 		/*
2496 		 * CPU1_CPU2_SEPARATOR_SECTION delimiter - separate between
2497 		 * CPU1 to CPU2.
2498 		 * PAGING_SEPARATOR_SECTION delimiter - separate between
2499 		 * CPU2 non paged to CPU2 paging sec.
2500 		 */
2501 		if (!image->fw_sect[i].data ||
2502 		    image->fw_sect[i].offset == IWM_CPU1_CPU2_SEPARATOR_SECTION ||
2503 		    image->fw_sect[i].offset == IWM_PAGING_SEPARATOR_SECTION) {
2504 			IWM_DPRINTF(sc, IWM_DEBUG_RESET,
2505 				    "Break since Data not valid or Empty section, sec = %d\n",
2506 				    i);
2507 			break;
2508 		}
2509 		ret = iwm_pcie_load_section(sc, i, &image->fw_sect[i]);
2510 		if (ret)
2511 			return ret;
2512 
2513 		/* Notify the ucode of the loaded section number and status */
2514 		if (iwm_nic_lock(sc)) {
2515 			val = IWM_READ(sc, IWM_FH_UCODE_LOAD_STATUS);
2516 			val = val | (sec_num << shift_param);
2517 			IWM_WRITE(sc, IWM_FH_UCODE_LOAD_STATUS, val);
2518 			sec_num = (sec_num << 1) | 0x1;
2519 			iwm_nic_unlock(sc);
2520 		}
2521 	}
2522 
2523 	*first_ucode_section = last_read_idx;
2524 
2525 	iwm_enable_interrupts(sc);
2526 
2527 	if (iwm_nic_lock(sc)) {
2528 		if (cpu == 1)
2529 			IWM_WRITE(sc, IWM_FH_UCODE_LOAD_STATUS, 0xFFFF);
2530 		else
2531 			IWM_WRITE(sc, IWM_FH_UCODE_LOAD_STATUS, 0xFFFFFFFF);
2532 		iwm_nic_unlock(sc);
2533 	}
2534 
2535 	return 0;
2536 }
2537 
2538 static int
2539 iwm_pcie_load_cpu_sections(struct iwm_softc *sc,
2540 	const struct iwm_fw_sects *image, int cpu, int *first_ucode_section)
2541 {
2542 	int shift_param;
2543 	int i, ret = 0;
2544 	uint32_t last_read_idx = 0;
2545 
2546 	if (cpu == 1) {
2547 		shift_param = 0;
2548 		*first_ucode_section = 0;
2549 	} else {
2550 		shift_param = 16;
2551 		(*first_ucode_section)++;
2552 	}
2553 
2554 	for (i = *first_ucode_section; i < IWM_UCODE_SECTION_MAX; i++) {
2555 		last_read_idx = i;
2556 
2557 		/*
2558 		 * CPU1_CPU2_SEPARATOR_SECTION delimiter - separate between
2559 		 * CPU1 to CPU2.
2560 		 * PAGING_SEPARATOR_SECTION delimiter - separate between
2561 		 * CPU2 non paged to CPU2 paging sec.
2562 		 */
2563 		if (!image->fw_sect[i].data ||
2564 		    image->fw_sect[i].offset == IWM_CPU1_CPU2_SEPARATOR_SECTION ||
2565 		    image->fw_sect[i].offset == IWM_PAGING_SEPARATOR_SECTION) {
2566 			IWM_DPRINTF(sc, IWM_DEBUG_RESET,
2567 				    "Break since Data not valid or Empty section, sec = %d\n",
2568 				     i);
2569 			break;
2570 		}
2571 
2572 		ret = iwm_pcie_load_section(sc, i, &image->fw_sect[i]);
2573 		if (ret)
2574 			return ret;
2575 	}
2576 
2577 	*first_ucode_section = last_read_idx;
2578 
2579 	return 0;
2580 
2581 }
2582 
2583 static int
2584 iwm_pcie_load_given_ucode(struct iwm_softc *sc,
2585 	const struct iwm_fw_sects *image)
2586 {
2587 	int ret = 0;
2588 	int first_ucode_section;
2589 
2590 	IWM_DPRINTF(sc, IWM_DEBUG_RESET, "working with %s CPU\n",
2591 		     image->is_dual_cpus ? "Dual" : "Single");
2592 
2593 	/* load to FW the binary non secured sections of CPU1 */
2594 	ret = iwm_pcie_load_cpu_sections(sc, image, 1, &first_ucode_section);
2595 	if (ret)
2596 		return ret;
2597 
2598 	if (image->is_dual_cpus) {
2599 		/* set CPU2 header address */
2600 		if (iwm_nic_lock(sc)) {
2601 			iwm_write_prph(sc,
2602 				       IWM_LMPM_SECURE_UCODE_LOAD_CPU2_HDR_ADDR,
2603 				       IWM_LMPM_SECURE_CPU2_HDR_MEM_SPACE);
2604 			iwm_nic_unlock(sc);
2605 		}
2606 
2607 		/* load to FW the binary sections of CPU2 */
2608 		ret = iwm_pcie_load_cpu_sections(sc, image, 2,
2609 						 &first_ucode_section);
2610 		if (ret)
2611 			return ret;
2612 	}
2613 
2614 	iwm_enable_interrupts(sc);
2615 
2616 	/* release CPU reset */
2617 	IWM_WRITE(sc, IWM_CSR_RESET, 0);
2618 
2619 	return 0;
2620 }
2621 
2622 int
2623 iwm_pcie_load_given_ucode_8000(struct iwm_softc *sc,
2624 	const struct iwm_fw_sects *image)
2625 {
2626 	int ret = 0;
2627 	int first_ucode_section;
2628 
2629 	IWM_DPRINTF(sc, IWM_DEBUG_RESET, "working with %s CPU\n",
2630 		    image->is_dual_cpus ? "Dual" : "Single");
2631 
2632 	/* configure the ucode to be ready to get the secured image */
2633 	/* release CPU reset */
2634 	if (iwm_nic_lock(sc)) {
2635 		iwm_write_prph(sc, IWM_RELEASE_CPU_RESET,
2636 		    IWM_RELEASE_CPU_RESET_BIT);
2637 		iwm_nic_unlock(sc);
2638 	}
2639 
2640 	/* load to FW the binary Secured sections of CPU1 */
2641 	ret = iwm_pcie_load_cpu_sections_8000(sc, image, 1,
2642 	    &first_ucode_section);
2643 	if (ret)
2644 		return ret;
2645 
2646 	/* load to FW the binary sections of CPU2 */
2647 	return iwm_pcie_load_cpu_sections_8000(sc, image, 2,
2648 	    &first_ucode_section);
2649 }
2650 
2651 /* XXX Get rid of this definition */
2652 static inline void
2653 iwm_enable_fw_load_int(struct iwm_softc *sc)
2654 {
2655 	IWM_DPRINTF(sc, IWM_DEBUG_INTR, "Enabling FW load interrupt\n");
2656 	sc->sc_intmask = IWM_CSR_INT_BIT_FH_TX;
2657 	IWM_WRITE(sc, IWM_CSR_INT_MASK, sc->sc_intmask);
2658 }
2659 
2660 /* XXX Add proper rfkill support code */
2661 static int
2662 iwm_start_fw(struct iwm_softc *sc,
2663 	const struct iwm_fw_sects *fw)
2664 {
2665 	int ret;
2666 
2667 	/* This may fail if AMT took ownership of the device */
2668 	if (iwm_prepare_card_hw(sc)) {
2669 		device_printf(sc->sc_dev,
2670 		    "%s: Exit HW not ready\n", __func__);
2671 		ret = EIO;
2672 		goto out;
2673 	}
2674 
2675 	IWM_WRITE(sc, IWM_CSR_INT, 0xFFFFFFFF);
2676 
2677 	iwm_disable_interrupts(sc);
2678 
2679 	/* make sure rfkill handshake bits are cleared */
2680 	IWM_WRITE(sc, IWM_CSR_UCODE_DRV_GP1_CLR, IWM_CSR_UCODE_SW_BIT_RFKILL);
2681 	IWM_WRITE(sc, IWM_CSR_UCODE_DRV_GP1_CLR,
2682 	    IWM_CSR_UCODE_DRV_GP1_BIT_CMD_BLOCKED);
2683 
2684 	/* clear (again), then enable host interrupts */
2685 	IWM_WRITE(sc, IWM_CSR_INT, 0xFFFFFFFF);
2686 
2687 	ret = iwm_nic_init(sc);
2688 	if (ret) {
2689 		device_printf(sc->sc_dev, "%s: Unable to init nic\n", __func__);
2690 		goto out;
2691 	}
2692 
2693 	/*
2694 	 * Now, we load the firmware and don't want to be interrupted, even
2695 	 * by the RF-Kill interrupt (hence mask all the interrupt besides the
2696 	 * FH_TX interrupt which is needed to load the firmware). If the
2697 	 * RF-Kill switch is toggled, we will find out after having loaded
2698 	 * the firmware and return the proper value to the caller.
2699 	 */
2700 	iwm_enable_fw_load_int(sc);
2701 
2702 	/* really make sure rfkill handshake bits are cleared */
2703 	/* maybe we should write a few times more?  just to make sure */
2704 	IWM_WRITE(sc, IWM_CSR_UCODE_DRV_GP1_CLR, IWM_CSR_UCODE_SW_BIT_RFKILL);
2705 	IWM_WRITE(sc, IWM_CSR_UCODE_DRV_GP1_CLR, IWM_CSR_UCODE_SW_BIT_RFKILL);
2706 
2707 	/* Load the given image to the HW */
2708 	if (sc->cfg->device_family == IWM_DEVICE_FAMILY_8000)
2709 		ret = iwm_pcie_load_given_ucode_8000(sc, fw);
2710 	else
2711 		ret = iwm_pcie_load_given_ucode(sc, fw);
2712 
2713 	/* XXX re-check RF-Kill state */
2714 
2715 out:
2716 	return ret;
2717 }
2718 
2719 static int
2720 iwm_send_tx_ant_cfg(struct iwm_softc *sc, uint8_t valid_tx_ant)
2721 {
2722 	struct iwm_tx_ant_cfg_cmd tx_ant_cmd = {
2723 		.valid = htole32(valid_tx_ant),
2724 	};
2725 
2726 	return iwm_mvm_send_cmd_pdu(sc, IWM_TX_ANT_CONFIGURATION_CMD,
2727 	    IWM_CMD_SYNC, sizeof(tx_ant_cmd), &tx_ant_cmd);
2728 }
2729 
2730 /* iwlwifi: mvm/fw.c */
2731 static int
2732 iwm_send_phy_cfg_cmd(struct iwm_softc *sc)
2733 {
2734 	struct iwm_phy_cfg_cmd phy_cfg_cmd;
2735 	enum iwm_ucode_type ucode_type = sc->cur_ucode;
2736 
2737 	/* Set parameters */
2738 	phy_cfg_cmd.phy_cfg = htole32(iwm_mvm_get_phy_config(sc));
2739 	phy_cfg_cmd.calib_control.event_trigger =
2740 	    sc->sc_default_calib[ucode_type].event_trigger;
2741 	phy_cfg_cmd.calib_control.flow_trigger =
2742 	    sc->sc_default_calib[ucode_type].flow_trigger;
2743 
2744 	IWM_DPRINTF(sc, IWM_DEBUG_CMD | IWM_DEBUG_RESET,
2745 	    "Sending Phy CFG command: 0x%x\n", phy_cfg_cmd.phy_cfg);
2746 	return iwm_mvm_send_cmd_pdu(sc, IWM_PHY_CONFIGURATION_CMD, IWM_CMD_SYNC,
2747 	    sizeof(phy_cfg_cmd), &phy_cfg_cmd);
2748 }
2749 
2750 static int
2751 iwm_alive_fn(struct iwm_softc *sc, struct iwm_rx_packet *pkt, void *data)
2752 {
2753 	struct iwm_mvm_alive_data *alive_data = data;
2754 	struct iwm_mvm_alive_resp_ver1 *palive1;
2755 	struct iwm_mvm_alive_resp_ver2 *palive2;
2756 	struct iwm_mvm_alive_resp *palive;
2757 
2758 	if (iwm_rx_packet_payload_len(pkt) == sizeof(*palive1)) {
2759 		palive1 = (void *)pkt->data;
2760 
2761 		sc->support_umac_log = FALSE;
2762                 sc->error_event_table =
2763                         le32toh(palive1->error_event_table_ptr);
2764                 sc->log_event_table =
2765                         le32toh(palive1->log_event_table_ptr);
2766                 alive_data->scd_base_addr = le32toh(palive1->scd_base_ptr);
2767 
2768                 alive_data->valid = le16toh(palive1->status) ==
2769                                     IWM_ALIVE_STATUS_OK;
2770                 IWM_DPRINTF(sc, IWM_DEBUG_RESET,
2771 			    "Alive VER1 ucode status 0x%04x revision 0x%01X 0x%01X flags 0x%01X\n",
2772 			     le16toh(palive1->status), palive1->ver_type,
2773                              palive1->ver_subtype, palive1->flags);
2774 	} else if (iwm_rx_packet_payload_len(pkt) == sizeof(*palive2)) {
2775 		palive2 = (void *)pkt->data;
2776 		sc->error_event_table =
2777 			le32toh(palive2->error_event_table_ptr);
2778 		sc->log_event_table =
2779 			le32toh(palive2->log_event_table_ptr);
2780 		alive_data->scd_base_addr = le32toh(palive2->scd_base_ptr);
2781 		sc->umac_error_event_table =
2782                         le32toh(palive2->error_info_addr);
2783 
2784 		alive_data->valid = le16toh(palive2->status) ==
2785 				    IWM_ALIVE_STATUS_OK;
2786 		if (sc->umac_error_event_table)
2787 			sc->support_umac_log = TRUE;
2788 
2789 		IWM_DPRINTF(sc, IWM_DEBUG_RESET,
2790 			    "Alive VER2 ucode status 0x%04x revision 0x%01X 0x%01X flags 0x%01X\n",
2791 			    le16toh(palive2->status), palive2->ver_type,
2792 			    palive2->ver_subtype, palive2->flags);
2793 
2794 		IWM_DPRINTF(sc, IWM_DEBUG_RESET,
2795 			    "UMAC version: Major - 0x%x, Minor - 0x%x\n",
2796 			    palive2->umac_major, palive2->umac_minor);
2797 	} else if (iwm_rx_packet_payload_len(pkt) == sizeof(*palive)) {
2798 		palive = (void *)pkt->data;
2799 
2800 		sc->error_event_table =
2801 			le32toh(palive->error_event_table_ptr);
2802 		sc->log_event_table =
2803 			le32toh(palive->log_event_table_ptr);
2804 		alive_data->scd_base_addr = le32toh(palive->scd_base_ptr);
2805 		sc->umac_error_event_table =
2806 			le32toh(palive->error_info_addr);
2807 
2808 		alive_data->valid = le16toh(palive->status) ==
2809 				    IWM_ALIVE_STATUS_OK;
2810 		if (sc->umac_error_event_table)
2811 			sc->support_umac_log = TRUE;
2812 
2813 		IWM_DPRINTF(sc, IWM_DEBUG_RESET,
2814 			    "Alive VER3 ucode status 0x%04x revision 0x%01X 0x%01X flags 0x%01X\n",
2815 			    le16toh(palive->status), palive->ver_type,
2816 			    palive->ver_subtype, palive->flags);
2817 
2818 		IWM_DPRINTF(sc, IWM_DEBUG_RESET,
2819 			    "UMAC version: Major - 0x%x, Minor - 0x%x\n",
2820 			    le32toh(palive->umac_major),
2821 			    le32toh(palive->umac_minor));
2822 	}
2823 
2824 	return TRUE;
2825 }
2826 
2827 static int
2828 iwm_wait_phy_db_entry(struct iwm_softc *sc,
2829 	struct iwm_rx_packet *pkt, void *data)
2830 {
2831 	struct iwm_phy_db *phy_db = data;
2832 
2833 	if (pkt->hdr.code != IWM_CALIB_RES_NOTIF_PHY_DB) {
2834 		if(pkt->hdr.code != IWM_INIT_COMPLETE_NOTIF) {
2835 			device_printf(sc->sc_dev, "%s: Unexpected cmd: %d\n",
2836 			    __func__, pkt->hdr.code);
2837 		}
2838 		return TRUE;
2839 	}
2840 
2841 	if (iwm_phy_db_set_section(phy_db, pkt)) {
2842 		device_printf(sc->sc_dev,
2843 		    "%s: iwm_phy_db_set_section failed\n", __func__);
2844 	}
2845 
2846 	return FALSE;
2847 }
2848 
2849 static int
2850 iwm_mvm_load_ucode_wait_alive(struct iwm_softc *sc,
2851 	enum iwm_ucode_type ucode_type)
2852 {
2853 	struct iwm_notification_wait alive_wait;
2854 	struct iwm_mvm_alive_data alive_data;
2855 	const struct iwm_fw_sects *fw;
2856 	enum iwm_ucode_type old_type = sc->cur_ucode;
2857 	int error;
2858 	static const uint16_t alive_cmd[] = { IWM_MVM_ALIVE };
2859 
2860 	if ((error = iwm_read_firmware(sc, ucode_type)) != 0) {
2861 		device_printf(sc->sc_dev, "iwm_read_firmware: failed %d\n",
2862 			error);
2863 		return error;
2864 	}
2865 	fw = &sc->sc_fw.fw_sects[ucode_type];
2866 	sc->cur_ucode = ucode_type;
2867 	sc->ucode_loaded = FALSE;
2868 
2869 	memset(&alive_data, 0, sizeof(alive_data));
2870 	iwm_init_notification_wait(sc->sc_notif_wait, &alive_wait,
2871 				   alive_cmd, nitems(alive_cmd),
2872 				   iwm_alive_fn, &alive_data);
2873 
2874 	error = iwm_start_fw(sc, fw);
2875 	if (error) {
2876 		device_printf(sc->sc_dev, "iwm_start_fw: failed %d\n", error);
2877 		sc->cur_ucode = old_type;
2878 		iwm_remove_notification(sc->sc_notif_wait, &alive_wait);
2879 		return error;
2880 	}
2881 
2882 	/*
2883 	 * Some things may run in the background now, but we
2884 	 * just wait for the ALIVE notification here.
2885 	 */
2886 	IWM_UNLOCK(sc);
2887 	error = iwm_wait_notification(sc->sc_notif_wait, &alive_wait,
2888 				      IWM_MVM_UCODE_ALIVE_TIMEOUT);
2889 	IWM_LOCK(sc);
2890 	if (error) {
2891 		if (sc->cfg->device_family == IWM_DEVICE_FAMILY_8000) {
2892 			uint32_t a = 0x5a5a5a5a, b = 0x5a5a5a5a;
2893 			if (iwm_nic_lock(sc)) {
2894 				a = iwm_read_prph(sc, IWM_SB_CPU_1_STATUS);
2895 				b = iwm_read_prph(sc, IWM_SB_CPU_2_STATUS);
2896 				iwm_nic_unlock(sc);
2897 			}
2898 			device_printf(sc->sc_dev,
2899 			    "SecBoot CPU1 Status: 0x%x, CPU2 Status: 0x%x\n",
2900 			    a, b);
2901 		}
2902 		sc->cur_ucode = old_type;
2903 		return error;
2904 	}
2905 
2906 	if (!alive_data.valid) {
2907 		device_printf(sc->sc_dev, "%s: Loaded ucode is not valid\n",
2908 		    __func__);
2909 		sc->cur_ucode = old_type;
2910 		return EIO;
2911 	}
2912 
2913 	iwm_trans_pcie_fw_alive(sc, alive_data.scd_base_addr);
2914 
2915 	/*
2916 	 * configure and operate fw paging mechanism.
2917 	 * driver configures the paging flow only once, CPU2 paging image
2918 	 * included in the IWM_UCODE_INIT image.
2919 	 */
2920 	if (fw->paging_mem_size) {
2921 		error = iwm_save_fw_paging(sc, fw);
2922 		if (error) {
2923 			device_printf(sc->sc_dev,
2924 			    "%s: failed to save the FW paging image\n",
2925 			    __func__);
2926 			return error;
2927 		}
2928 
2929 		error = iwm_send_paging_cmd(sc, fw);
2930 		if (error) {
2931 			device_printf(sc->sc_dev,
2932 			    "%s: failed to send the paging cmd\n", __func__);
2933 			iwm_free_fw_paging(sc);
2934 			return error;
2935 		}
2936 	}
2937 
2938 	if (!error)
2939 		sc->ucode_loaded = TRUE;
2940 	return error;
2941 }
2942 
2943 /*
2944  * mvm misc bits
2945  */
2946 
2947 /*
2948  * follows iwlwifi/fw.c
2949  */
2950 static int
2951 iwm_run_init_mvm_ucode(struct iwm_softc *sc, int justnvm)
2952 {
2953 	struct iwm_notification_wait calib_wait;
2954 	static const uint16_t init_complete[] = {
2955 		IWM_INIT_COMPLETE_NOTIF,
2956 		IWM_CALIB_RES_NOTIF_PHY_DB
2957 	};
2958 	int ret;
2959 
2960 	/* do not operate with rfkill switch turned on */
2961 	if ((sc->sc_flags & IWM_FLAG_RFKILL) && !justnvm) {
2962 		device_printf(sc->sc_dev,
2963 		    "radio is disabled by hardware switch\n");
2964 		return EPERM;
2965 	}
2966 
2967 	iwm_init_notification_wait(sc->sc_notif_wait,
2968 				   &calib_wait,
2969 				   init_complete,
2970 				   nitems(init_complete),
2971 				   iwm_wait_phy_db_entry,
2972 				   sc->sc_phy_db);
2973 
2974 	/* Will also start the device */
2975 	ret = iwm_mvm_load_ucode_wait_alive(sc, IWM_UCODE_INIT);
2976 	if (ret) {
2977 		device_printf(sc->sc_dev, "Failed to start INIT ucode: %d\n",
2978 		    ret);
2979 		goto error;
2980 	}
2981 
2982 	if (justnvm) {
2983 		/* Read nvm */
2984 		ret = iwm_nvm_init(sc);
2985 		if (ret) {
2986 			device_printf(sc->sc_dev, "failed to read nvm\n");
2987 			goto error;
2988 		}
2989 		IEEE80211_ADDR_COPY(sc->sc_ic.ic_macaddr, sc->nvm_data->hw_addr);
2990 		goto error;
2991 	}
2992 
2993 	ret = iwm_send_bt_init_conf(sc);
2994 	if (ret) {
2995 		device_printf(sc->sc_dev,
2996 		    "failed to send bt coex configuration: %d\n", ret);
2997 		goto error;
2998 	}
2999 
3000 	/* Send TX valid antennas before triggering calibrations */
3001 	ret = iwm_send_tx_ant_cfg(sc, iwm_mvm_get_valid_tx_ant(sc));
3002 	if (ret) {
3003 		device_printf(sc->sc_dev,
3004 		    "failed to send antennas before calibration: %d\n", ret);
3005 		goto error;
3006 	}
3007 
3008 	/*
3009 	 * Send phy configurations command to init uCode
3010 	 * to start the 16.0 uCode init image internal calibrations.
3011 	 */
3012 	ret = iwm_send_phy_cfg_cmd(sc);
3013 	if (ret) {
3014 		device_printf(sc->sc_dev,
3015 		    "%s: Failed to run INIT calibrations: %d\n",
3016 		    __func__, ret);
3017 		goto error;
3018 	}
3019 
3020 	/*
3021 	 * Nothing to do but wait for the init complete notification
3022 	 * from the firmware.
3023 	 */
3024 	IWM_UNLOCK(sc);
3025 	ret = iwm_wait_notification(sc->sc_notif_wait, &calib_wait,
3026 	    IWM_MVM_UCODE_CALIB_TIMEOUT);
3027 	IWM_LOCK(sc);
3028 
3029 
3030 	goto out;
3031 
3032 error:
3033 	iwm_remove_notification(sc->sc_notif_wait, &calib_wait);
3034 out:
3035 	return ret;
3036 }
3037 
3038 /*
3039  * receive side
3040  */
3041 
3042 /* (re)stock rx ring, called at init-time and at runtime */
3043 static int
3044 iwm_rx_addbuf(struct iwm_softc *sc, int size, int idx)
3045 {
3046 	struct iwm_rx_ring *ring = &sc->rxq;
3047 	struct iwm_rx_data *data = &ring->data[idx];
3048 	struct mbuf *m;
3049 	bus_dmamap_t dmamap;
3050 	bus_dma_segment_t seg;
3051 	int nsegs, error;
3052 
3053 	m = m_getjcl(M_NOWAIT, MT_DATA, M_PKTHDR, IWM_RBUF_SIZE);
3054 	if (m == NULL)
3055 		return ENOBUFS;
3056 
3057 	m->m_len = m->m_pkthdr.len = m->m_ext.ext_size;
3058 	error = bus_dmamap_load_mbuf_sg(ring->data_dmat, ring->spare_map, m,
3059 	    &seg, &nsegs, BUS_DMA_NOWAIT);
3060 	if (error != 0) {
3061 		device_printf(sc->sc_dev,
3062 		    "%s: can't map mbuf, error %d\n", __func__, error);
3063 		m_freem(m);
3064 		return error;
3065 	}
3066 
3067 	if (data->m != NULL)
3068 		bus_dmamap_unload(ring->data_dmat, data->map);
3069 
3070 	/* Swap ring->spare_map with data->map */
3071 	dmamap = data->map;
3072 	data->map = ring->spare_map;
3073 	ring->spare_map = dmamap;
3074 
3075 	bus_dmamap_sync(ring->data_dmat, data->map, BUS_DMASYNC_PREREAD);
3076 	data->m = m;
3077 
3078 	/* Update RX descriptor. */
3079 	KASSERT((seg.ds_addr & 255) == 0, ("seg.ds_addr not aligned"));
3080 	ring->desc[idx] = htole32(seg.ds_addr >> 8);
3081 	bus_dmamap_sync(ring->desc_dma.tag, ring->desc_dma.map,
3082 	    BUS_DMASYNC_PREWRITE);
3083 
3084 	return 0;
3085 }
3086 
3087 /* iwlwifi: mvm/rx.c */
3088 /*
3089  * iwm_mvm_get_signal_strength - use new rx PHY INFO API
3090  * values are reported by the fw as positive values - need to negate
3091  * to obtain their dBM.  Account for missing antennas by replacing 0
3092  * values by -256dBm: practically 0 power and a non-feasible 8 bit value.
3093  */
3094 static int
3095 iwm_mvm_get_signal_strength(struct iwm_softc *sc, struct iwm_rx_phy_info *phy_info)
3096 {
3097 	int energy_a, energy_b, energy_c, max_energy;
3098 	uint32_t val;
3099 
3100 	val = le32toh(phy_info->non_cfg_phy[IWM_RX_INFO_ENERGY_ANT_ABC_IDX]);
3101 	energy_a = (val & IWM_RX_INFO_ENERGY_ANT_A_MSK) >>
3102 	    IWM_RX_INFO_ENERGY_ANT_A_POS;
3103 	energy_a = energy_a ? -energy_a : -256;
3104 	energy_b = (val & IWM_RX_INFO_ENERGY_ANT_B_MSK) >>
3105 	    IWM_RX_INFO_ENERGY_ANT_B_POS;
3106 	energy_b = energy_b ? -energy_b : -256;
3107 	energy_c = (val & IWM_RX_INFO_ENERGY_ANT_C_MSK) >>
3108 	    IWM_RX_INFO_ENERGY_ANT_C_POS;
3109 	energy_c = energy_c ? -energy_c : -256;
3110 	max_energy = MAX(energy_a, energy_b);
3111 	max_energy = MAX(max_energy, energy_c);
3112 
3113 	IWM_DPRINTF(sc, IWM_DEBUG_RECV,
3114 	    "energy In A %d B %d C %d , and max %d\n",
3115 	    energy_a, energy_b, energy_c, max_energy);
3116 
3117 	return max_energy;
3118 }
3119 
3120 static void
3121 iwm_mvm_rx_rx_phy_cmd(struct iwm_softc *sc, struct iwm_rx_packet *pkt)
3122 {
3123 	struct iwm_rx_phy_info *phy_info = (void *)pkt->data;
3124 
3125 	IWM_DPRINTF(sc, IWM_DEBUG_RECV, "received PHY stats\n");
3126 
3127 	memcpy(&sc->sc_last_phy_info, phy_info, sizeof(sc->sc_last_phy_info));
3128 }
3129 
3130 /*
3131  * Retrieve the average noise (in dBm) among receivers.
3132  */
3133 static int
3134 iwm_get_noise(struct iwm_softc *sc,
3135     const struct iwm_mvm_statistics_rx_non_phy *stats)
3136 {
3137 	int i, total, nbant, noise;
3138 
3139 	total = nbant = noise = 0;
3140 	for (i = 0; i < 3; i++) {
3141 		noise = le32toh(stats->beacon_silence_rssi[i]) & 0xff;
3142 		IWM_DPRINTF(sc, IWM_DEBUG_RECV, "%s: i=%d, noise=%d\n",
3143 		    __func__,
3144 		    i,
3145 		    noise);
3146 
3147 		if (noise) {
3148 			total += noise;
3149 			nbant++;
3150 		}
3151 	}
3152 
3153 	IWM_DPRINTF(sc, IWM_DEBUG_RECV, "%s: nbant=%d, total=%d\n",
3154 	    __func__, nbant, total);
3155 #if 0
3156 	/* There should be at least one antenna but check anyway. */
3157 	return (nbant == 0) ? -127 : (total / nbant) - 107;
3158 #else
3159 	/* For now, just hard-code it to -96 to be safe */
3160 	return (-96);
3161 #endif
3162 }
3163 
3164 static void
3165 iwm_mvm_handle_rx_statistics(struct iwm_softc *sc, struct iwm_rx_packet *pkt)
3166 {
3167 	struct iwm_notif_statistics_v10 *stats = (void *)&pkt->data;
3168 
3169 	memcpy(&sc->sc_stats, stats, sizeof(sc->sc_stats));
3170 	sc->sc_noise = iwm_get_noise(sc, &stats->rx.general);
3171 }
3172 
3173 /*
3174  * iwm_mvm_rx_rx_mpdu - IWM_REPLY_RX_MPDU_CMD handler
3175  *
3176  * Handles the actual data of the Rx packet from the fw
3177  */
3178 static boolean_t
3179 iwm_mvm_rx_rx_mpdu(struct iwm_softc *sc, struct mbuf *m, uint32_t offset,
3180 	boolean_t stolen)
3181 {
3182 	struct ieee80211com *ic = &sc->sc_ic;
3183 	struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps);
3184 	struct ieee80211_frame *wh;
3185 	struct ieee80211_node *ni;
3186 	struct ieee80211_rx_stats rxs;
3187 	struct iwm_rx_phy_info *phy_info;
3188 	struct iwm_rx_mpdu_res_start *rx_res;
3189 	struct iwm_rx_packet *pkt = mtodoff(m, struct iwm_rx_packet *, offset);
3190 	uint32_t len;
3191 	uint32_t rx_pkt_status;
3192 	int rssi;
3193 
3194 	phy_info = &sc->sc_last_phy_info;
3195 	rx_res = (struct iwm_rx_mpdu_res_start *)pkt->data;
3196 	wh = (struct ieee80211_frame *)(pkt->data + sizeof(*rx_res));
3197 	len = le16toh(rx_res->byte_count);
3198 	rx_pkt_status = le32toh(*(uint32_t *)(pkt->data + sizeof(*rx_res) + len));
3199 
3200 	if (__predict_false(phy_info->cfg_phy_cnt > 20)) {
3201 		device_printf(sc->sc_dev,
3202 		    "dsp size out of range [0,20]: %d\n",
3203 		    phy_info->cfg_phy_cnt);
3204 		goto fail;
3205 	}
3206 
3207 	if (!(rx_pkt_status & IWM_RX_MPDU_RES_STATUS_CRC_OK) ||
3208 	    !(rx_pkt_status & IWM_RX_MPDU_RES_STATUS_OVERRUN_OK)) {
3209 		IWM_DPRINTF(sc, IWM_DEBUG_RECV,
3210 		    "Bad CRC or FIFO: 0x%08X.\n", rx_pkt_status);
3211 		goto fail;
3212 	}
3213 
3214 	rssi = iwm_mvm_get_signal_strength(sc, phy_info);
3215 
3216 	/* Map it to relative value */
3217 	rssi = rssi - sc->sc_noise;
3218 
3219 	/* replenish ring for the buffer we're going to feed to the sharks */
3220 	if (!stolen && iwm_rx_addbuf(sc, IWM_RBUF_SIZE, sc->rxq.cur) != 0) {
3221 		device_printf(sc->sc_dev, "%s: unable to add more buffers\n",
3222 		    __func__);
3223 		goto fail;
3224 	}
3225 
3226 	m->m_data = pkt->data + sizeof(*rx_res);
3227 	m->m_pkthdr.len = m->m_len = len;
3228 
3229 	IWM_DPRINTF(sc, IWM_DEBUG_RECV,
3230 	    "%s: rssi=%d, noise=%d\n", __func__, rssi, sc->sc_noise);
3231 
3232 	ni = ieee80211_find_rxnode(ic, (struct ieee80211_frame_min *)wh);
3233 
3234 	IWM_DPRINTF(sc, IWM_DEBUG_RECV,
3235 	    "%s: phy_info: channel=%d, flags=0x%08x\n",
3236 	    __func__,
3237 	    le16toh(phy_info->channel),
3238 	    le16toh(phy_info->phy_flags));
3239 
3240 	/*
3241 	 * Populate an RX state struct with the provided information.
3242 	 */
3243 	bzero(&rxs, sizeof(rxs));
3244 	rxs.r_flags |= IEEE80211_R_IEEE | IEEE80211_R_FREQ;
3245 	rxs.r_flags |= IEEE80211_R_NF | IEEE80211_R_RSSI;
3246 	rxs.c_ieee = le16toh(phy_info->channel);
3247 	if (le16toh(phy_info->phy_flags & IWM_RX_RES_PHY_FLAGS_BAND_24)) {
3248 		rxs.c_freq = ieee80211_ieee2mhz(rxs.c_ieee, IEEE80211_CHAN_2GHZ);
3249 	} else {
3250 		rxs.c_freq = ieee80211_ieee2mhz(rxs.c_ieee, IEEE80211_CHAN_5GHZ);
3251 	}
3252 
3253 	/* rssi is in 1/2db units */
3254 	rxs.c_rssi = rssi * 2;
3255 	rxs.c_nf = sc->sc_noise;
3256 	if (ieee80211_add_rx_params(m, &rxs) == 0) {
3257 		if (ni)
3258 			ieee80211_free_node(ni);
3259 		goto fail;
3260 	}
3261 
3262 	if (ieee80211_radiotap_active_vap(vap)) {
3263 		struct iwm_rx_radiotap_header *tap = &sc->sc_rxtap;
3264 
3265 		tap->wr_flags = 0;
3266 		if (phy_info->phy_flags & htole16(IWM_PHY_INFO_FLAG_SHPREAMBLE))
3267 			tap->wr_flags |= IEEE80211_RADIOTAP_F_SHORTPRE;
3268 		tap->wr_chan_freq = htole16(rxs.c_freq);
3269 		/* XXX only if ic->ic_curchan->ic_ieee == rxs.c_ieee */
3270 		tap->wr_chan_flags = htole16(ic->ic_curchan->ic_flags);
3271 		tap->wr_dbm_antsignal = (int8_t)rssi;
3272 		tap->wr_dbm_antnoise = (int8_t)sc->sc_noise;
3273 		tap->wr_tsft = phy_info->system_timestamp;
3274 		switch (phy_info->rate) {
3275 		/* CCK rates. */
3276 		case  10: tap->wr_rate =   2; break;
3277 		case  20: tap->wr_rate =   4; break;
3278 		case  55: tap->wr_rate =  11; break;
3279 		case 110: tap->wr_rate =  22; break;
3280 		/* OFDM rates. */
3281 		case 0xd: tap->wr_rate =  12; break;
3282 		case 0xf: tap->wr_rate =  18; break;
3283 		case 0x5: tap->wr_rate =  24; break;
3284 		case 0x7: tap->wr_rate =  36; break;
3285 		case 0x9: tap->wr_rate =  48; break;
3286 		case 0xb: tap->wr_rate =  72; break;
3287 		case 0x1: tap->wr_rate =  96; break;
3288 		case 0x3: tap->wr_rate = 108; break;
3289 		/* Unknown rate: should not happen. */
3290 		default:  tap->wr_rate =   0;
3291 		}
3292 	}
3293 
3294 	IWM_UNLOCK(sc);
3295 	if (ni != NULL) {
3296 		IWM_DPRINTF(sc, IWM_DEBUG_RECV, "input m %p\n", m);
3297 		ieee80211_input_mimo(ni, m);
3298 		ieee80211_free_node(ni);
3299 	} else {
3300 		IWM_DPRINTF(sc, IWM_DEBUG_RECV, "inputall m %p\n", m);
3301 		ieee80211_input_mimo_all(ic, m);
3302 	}
3303 	IWM_LOCK(sc);
3304 
3305 	return TRUE;
3306 
3307 fail:
3308 	counter_u64_add(ic->ic_ierrors, 1);
3309 	return FALSE;
3310 }
3311 
3312 static int
3313 iwm_mvm_rx_tx_cmd_single(struct iwm_softc *sc, struct iwm_rx_packet *pkt,
3314 	struct iwm_node *in)
3315 {
3316 	struct iwm_mvm_tx_resp *tx_resp = (void *)pkt->data;
3317 	struct ieee80211_ratectl_tx_status *txs = &sc->sc_txs;
3318 	struct ieee80211_node *ni = &in->in_ni;
3319 	int status = le16toh(tx_resp->status.status) & IWM_TX_STATUS_MSK;
3320 
3321 	KASSERT(tx_resp->frame_count == 1, ("too many frames"));
3322 
3323 	/* Update rate control statistics. */
3324 	IWM_DPRINTF(sc, IWM_DEBUG_XMIT, "%s: status=0x%04x, seq=%d, fc=%d, btc=%d, frts=%d, ff=%d, irate=%08x, wmt=%d\n",
3325 	    __func__,
3326 	    (int) le16toh(tx_resp->status.status),
3327 	    (int) le16toh(tx_resp->status.sequence),
3328 	    tx_resp->frame_count,
3329 	    tx_resp->bt_kill_count,
3330 	    tx_resp->failure_rts,
3331 	    tx_resp->failure_frame,
3332 	    le32toh(tx_resp->initial_rate),
3333 	    (int) le16toh(tx_resp->wireless_media_time));
3334 
3335 	txs->flags = IEEE80211_RATECTL_STATUS_SHORT_RETRY |
3336 		     IEEE80211_RATECTL_STATUS_LONG_RETRY;
3337 	txs->short_retries = tx_resp->failure_rts;
3338 	txs->long_retries = tx_resp->failure_frame;
3339 	if (status != IWM_TX_STATUS_SUCCESS &&
3340 	    status != IWM_TX_STATUS_DIRECT_DONE) {
3341 		switch (status) {
3342 		case IWM_TX_STATUS_FAIL_SHORT_LIMIT:
3343 			txs->status = IEEE80211_RATECTL_TX_FAIL_SHORT;
3344 			break;
3345 		case IWM_TX_STATUS_FAIL_LONG_LIMIT:
3346 			txs->status = IEEE80211_RATECTL_TX_FAIL_LONG;
3347 			break;
3348 		case IWM_TX_STATUS_FAIL_LIFE_EXPIRE:
3349 			txs->status = IEEE80211_RATECTL_TX_FAIL_EXPIRED;
3350 			break;
3351 		default:
3352 			txs->status = IEEE80211_RATECTL_TX_FAIL_UNSPECIFIED;
3353 			break;
3354 		}
3355 	} else {
3356 		txs->status = IEEE80211_RATECTL_TX_SUCCESS;
3357 	}
3358 	ieee80211_ratectl_tx_complete(ni, txs);
3359 
3360 	return (txs->status != IEEE80211_RATECTL_TX_SUCCESS);
3361 }
3362 
3363 static void
3364 iwm_mvm_rx_tx_cmd(struct iwm_softc *sc, struct iwm_rx_packet *pkt)
3365 {
3366 	struct iwm_cmd_header *cmd_hdr = &pkt->hdr;
3367 	int idx = cmd_hdr->idx;
3368 	int qid = cmd_hdr->qid;
3369 	struct iwm_tx_ring *ring = &sc->txq[qid];
3370 	struct iwm_tx_data *txd = &ring->data[idx];
3371 	struct iwm_node *in = txd->in;
3372 	struct mbuf *m = txd->m;
3373 	int status;
3374 
3375 	KASSERT(txd->done == 0, ("txd not done"));
3376 	KASSERT(txd->in != NULL, ("txd without node"));
3377 	KASSERT(txd->m != NULL, ("txd without mbuf"));
3378 
3379 	sc->sc_tx_timer = 0;
3380 
3381 	status = iwm_mvm_rx_tx_cmd_single(sc, pkt, in);
3382 
3383 	/* Unmap and free mbuf. */
3384 	bus_dmamap_sync(ring->data_dmat, txd->map, BUS_DMASYNC_POSTWRITE);
3385 	bus_dmamap_unload(ring->data_dmat, txd->map);
3386 
3387 	IWM_DPRINTF(sc, IWM_DEBUG_XMIT,
3388 	    "free txd %p, in %p\n", txd, txd->in);
3389 	txd->done = 1;
3390 	txd->m = NULL;
3391 	txd->in = NULL;
3392 
3393 	ieee80211_tx_complete(&in->in_ni, m, status);
3394 
3395 	if (--ring->queued < IWM_TX_RING_LOMARK) {
3396 		sc->qfullmsk &= ~(1 << ring->qid);
3397 		if (sc->qfullmsk == 0) {
3398 			iwm_start(sc);
3399 		}
3400 	}
3401 }
3402 
3403 /*
3404  * transmit side
3405  */
3406 
3407 /*
3408  * Process a "command done" firmware notification.  This is where we wakeup
3409  * processes waiting for a synchronous command completion.
3410  * from if_iwn
3411  */
3412 static void
3413 iwm_cmd_done(struct iwm_softc *sc, struct iwm_rx_packet *pkt)
3414 {
3415 	struct iwm_tx_ring *ring = &sc->txq[IWM_MVM_CMD_QUEUE];
3416 	struct iwm_tx_data *data;
3417 
3418 	if (pkt->hdr.qid != IWM_MVM_CMD_QUEUE) {
3419 		return;	/* Not a command ack. */
3420 	}
3421 
3422 	/* XXX wide commands? */
3423 	IWM_DPRINTF(sc, IWM_DEBUG_CMD,
3424 	    "cmd notification type 0x%x qid %d idx %d\n",
3425 	    pkt->hdr.code, pkt->hdr.qid, pkt->hdr.idx);
3426 
3427 	data = &ring->data[pkt->hdr.idx];
3428 
3429 	/* If the command was mapped in an mbuf, free it. */
3430 	if (data->m != NULL) {
3431 		bus_dmamap_sync(ring->data_dmat, data->map,
3432 		    BUS_DMASYNC_POSTWRITE);
3433 		bus_dmamap_unload(ring->data_dmat, data->map);
3434 		m_freem(data->m);
3435 		data->m = NULL;
3436 	}
3437 	wakeup(&ring->desc[pkt->hdr.idx]);
3438 
3439 	if (((pkt->hdr.idx + ring->queued) % IWM_TX_RING_COUNT) != ring->cur) {
3440 		device_printf(sc->sc_dev,
3441 		    "%s: Some HCMDs skipped?: idx=%d queued=%d cur=%d\n",
3442 		    __func__, pkt->hdr.idx, ring->queued, ring->cur);
3443 		/* XXX call iwm_force_nmi() */
3444 	}
3445 
3446 	KASSERT(ring->queued > 0, ("ring->queued is empty?"));
3447 	ring->queued--;
3448 	if (ring->queued == 0)
3449 		iwm_pcie_clear_cmd_in_flight(sc);
3450 }
3451 
3452 #if 0
3453 /*
3454  * necessary only for block ack mode
3455  */
3456 void
3457 iwm_update_sched(struct iwm_softc *sc, int qid, int idx, uint8_t sta_id,
3458 	uint16_t len)
3459 {
3460 	struct iwm_agn_scd_bc_tbl *scd_bc_tbl;
3461 	uint16_t w_val;
3462 
3463 	scd_bc_tbl = sc->sched_dma.vaddr;
3464 
3465 	len += 8; /* magic numbers came naturally from paris */
3466 	len = roundup(len, 4) / 4;
3467 
3468 	w_val = htole16(sta_id << 12 | len);
3469 
3470 	/* Update TX scheduler. */
3471 	scd_bc_tbl[qid].tfd_offset[idx] = w_val;
3472 	bus_dmamap_sync(sc->sched_dma.tag, sc->sched_dma.map,
3473 	    BUS_DMASYNC_PREWRITE);
3474 
3475 	/* I really wonder what this is ?!? */
3476 	if (idx < IWM_TFD_QUEUE_SIZE_BC_DUP) {
3477 		scd_bc_tbl[qid].tfd_offset[IWM_TFD_QUEUE_SIZE_MAX + idx] = w_val;
3478 		bus_dmamap_sync(sc->sched_dma.tag, sc->sched_dma.map,
3479 		    BUS_DMASYNC_PREWRITE);
3480 	}
3481 }
3482 #endif
3483 
3484 /*
3485  * Take an 802.11 (non-n) rate, find the relevant rate
3486  * table entry.  return the index into in_ridx[].
3487  *
3488  * The caller then uses that index back into in_ridx
3489  * to figure out the rate index programmed /into/
3490  * the firmware for this given node.
3491  */
3492 static int
3493 iwm_tx_rateidx_lookup(struct iwm_softc *sc, struct iwm_node *in,
3494     uint8_t rate)
3495 {
3496 	int i;
3497 	uint8_t r;
3498 
3499 	for (i = 0; i < nitems(in->in_ridx); i++) {
3500 		r = iwm_rates[in->in_ridx[i]].rate;
3501 		if (rate == r)
3502 			return (i);
3503 	}
3504 
3505 	IWM_DPRINTF(sc, IWM_DEBUG_XMIT | IWM_DEBUG_TXRATE,
3506 	    "%s: couldn't find an entry for rate=%d\n",
3507 	    __func__,
3508 	    rate);
3509 
3510 	/* XXX Return the first */
3511 	/* XXX TODO: have it return the /lowest/ */
3512 	return (0);
3513 }
3514 
3515 static int
3516 iwm_tx_rateidx_global_lookup(struct iwm_softc *sc, uint8_t rate)
3517 {
3518 	int i;
3519 
3520 	for (i = 0; i < nitems(iwm_rates); i++) {
3521 		if (iwm_rates[i].rate == rate)
3522 			return (i);
3523 	}
3524 	/* XXX error? */
3525 	IWM_DPRINTF(sc, IWM_DEBUG_XMIT | IWM_DEBUG_TXRATE,
3526 	    "%s: couldn't find an entry for rate=%d\n",
3527 	    __func__,
3528 	    rate);
3529 	return (0);
3530 }
3531 
3532 /*
3533  * Fill in the rate related information for a transmit command.
3534  */
3535 static const struct iwm_rate *
3536 iwm_tx_fill_cmd(struct iwm_softc *sc, struct iwm_node *in,
3537 	struct mbuf *m, struct iwm_tx_cmd *tx)
3538 {
3539 	struct ieee80211_node *ni = &in->in_ni;
3540 	struct ieee80211_frame *wh;
3541 	const struct ieee80211_txparam *tp = ni->ni_txparms;
3542 	const struct iwm_rate *rinfo;
3543 	int type;
3544 	int ridx, rate_flags;
3545 
3546 	wh = mtod(m, struct ieee80211_frame *);
3547 	type = wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK;
3548 
3549 	tx->rts_retry_limit = IWM_RTS_DFAULT_RETRY_LIMIT;
3550 	tx->data_retry_limit = IWM_DEFAULT_TX_RETRY;
3551 
3552 	if (type == IEEE80211_FC0_TYPE_MGT ||
3553 	    type == IEEE80211_FC0_TYPE_CTL ||
3554 	    (m->m_flags & M_EAPOL) != 0) {
3555 		ridx = iwm_tx_rateidx_global_lookup(sc, tp->mgmtrate);
3556 		IWM_DPRINTF(sc, IWM_DEBUG_TXRATE,
3557 		    "%s: MGT (%d)\n", __func__, tp->mgmtrate);
3558 	} else if (IEEE80211_IS_MULTICAST(wh->i_addr1)) {
3559 		ridx = iwm_tx_rateidx_global_lookup(sc, tp->mcastrate);
3560 		IWM_DPRINTF(sc, IWM_DEBUG_TXRATE,
3561 		    "%s: MCAST (%d)\n", __func__, tp->mcastrate);
3562 	} else if (tp->ucastrate != IEEE80211_FIXED_RATE_NONE) {
3563 		ridx = iwm_tx_rateidx_global_lookup(sc, tp->ucastrate);
3564 		IWM_DPRINTF(sc, IWM_DEBUG_TXRATE,
3565 		    "%s: FIXED_RATE (%d)\n", __func__, tp->ucastrate);
3566 	} else {
3567 		int i;
3568 
3569 		/* for data frames, use RS table */
3570 		IWM_DPRINTF(sc, IWM_DEBUG_TXRATE, "%s: DATA\n", __func__);
3571 		/* XXX pass pktlen */
3572 		(void) ieee80211_ratectl_rate(ni, NULL, 0);
3573 		i = iwm_tx_rateidx_lookup(sc, in, ni->ni_txrate);
3574 		ridx = in->in_ridx[i];
3575 
3576 		/* This is the index into the programmed table */
3577 		tx->initial_rate_index = i;
3578 		tx->tx_flags |= htole32(IWM_TX_CMD_FLG_STA_RATE);
3579 
3580 		IWM_DPRINTF(sc, IWM_DEBUG_XMIT | IWM_DEBUG_TXRATE,
3581 		    "%s: start with i=%d, txrate %d\n",
3582 		    __func__, i, iwm_rates[ridx].rate);
3583 	}
3584 
3585 	IWM_DPRINTF(sc, IWM_DEBUG_XMIT | IWM_DEBUG_TXRATE,
3586 	    "%s: frame type=%d txrate %d\n",
3587 	        __func__, type, iwm_rates[ridx].rate);
3588 
3589 	rinfo = &iwm_rates[ridx];
3590 
3591 	IWM_DPRINTF(sc, IWM_DEBUG_TXRATE, "%s: ridx=%d; rate=%d, CCK=%d\n",
3592 	    __func__, ridx,
3593 	    rinfo->rate,
3594 	    !! (IWM_RIDX_IS_CCK(ridx))
3595 	    );
3596 
3597 	/* XXX TODO: hard-coded TX antenna? */
3598 	rate_flags = 1 << IWM_RATE_MCS_ANT_POS;
3599 	if (IWM_RIDX_IS_CCK(ridx))
3600 		rate_flags |= IWM_RATE_MCS_CCK_MSK;
3601 	tx->rate_n_flags = htole32(rate_flags | rinfo->plcp);
3602 
3603 	return rinfo;
3604 }
3605 
3606 #define TB0_SIZE 16
3607 static int
3608 iwm_tx(struct iwm_softc *sc, struct mbuf *m, struct ieee80211_node *ni, int ac)
3609 {
3610 	struct ieee80211com *ic = &sc->sc_ic;
3611 	struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps);
3612 	struct iwm_node *in = IWM_NODE(ni);
3613 	struct iwm_tx_ring *ring;
3614 	struct iwm_tx_data *data;
3615 	struct iwm_tfd *desc;
3616 	struct iwm_device_cmd *cmd;
3617 	struct iwm_tx_cmd *tx;
3618 	struct ieee80211_frame *wh;
3619 	struct ieee80211_key *k = NULL;
3620 	struct mbuf *m1;
3621 	const struct iwm_rate *rinfo;
3622 	uint32_t flags;
3623 	u_int hdrlen;
3624 	bus_dma_segment_t *seg, segs[IWM_MAX_SCATTER];
3625 	int nsegs;
3626 	uint8_t tid, type;
3627 	int i, totlen, error, pad;
3628 
3629 	wh = mtod(m, struct ieee80211_frame *);
3630 	hdrlen = ieee80211_anyhdrsize(wh);
3631 	type = wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK;
3632 	tid = 0;
3633 	ring = &sc->txq[ac];
3634 	desc = &ring->desc[ring->cur];
3635 	memset(desc, 0, sizeof(*desc));
3636 	data = &ring->data[ring->cur];
3637 
3638 	/* Fill out iwm_tx_cmd to send to the firmware */
3639 	cmd = &ring->cmd[ring->cur];
3640 	cmd->hdr.code = IWM_TX_CMD;
3641 	cmd->hdr.flags = 0;
3642 	cmd->hdr.qid = ring->qid;
3643 	cmd->hdr.idx = ring->cur;
3644 
3645 	tx = (void *)cmd->data;
3646 	memset(tx, 0, sizeof(*tx));
3647 
3648 	rinfo = iwm_tx_fill_cmd(sc, in, m, tx);
3649 
3650 	/* Encrypt the frame if need be. */
3651 	if (wh->i_fc[1] & IEEE80211_FC1_PROTECTED) {
3652 		/* Retrieve key for TX && do software encryption. */
3653 		k = ieee80211_crypto_encap(ni, m);
3654 		if (k == NULL) {
3655 			m_freem(m);
3656 			return (ENOBUFS);
3657 		}
3658 		/* 802.11 header may have moved. */
3659 		wh = mtod(m, struct ieee80211_frame *);
3660 	}
3661 
3662 	if (ieee80211_radiotap_active_vap(vap)) {
3663 		struct iwm_tx_radiotap_header *tap = &sc->sc_txtap;
3664 
3665 		tap->wt_flags = 0;
3666 		tap->wt_chan_freq = htole16(ni->ni_chan->ic_freq);
3667 		tap->wt_chan_flags = htole16(ni->ni_chan->ic_flags);
3668 		tap->wt_rate = rinfo->rate;
3669 		if (k != NULL)
3670 			tap->wt_flags |= IEEE80211_RADIOTAP_F_WEP;
3671 		ieee80211_radiotap_tx(vap, m);
3672 	}
3673 
3674 
3675 	totlen = m->m_pkthdr.len;
3676 
3677 	flags = 0;
3678 	if (!IEEE80211_IS_MULTICAST(wh->i_addr1)) {
3679 		flags |= IWM_TX_CMD_FLG_ACK;
3680 	}
3681 
3682 	if (type == IEEE80211_FC0_TYPE_DATA
3683 	    && (totlen + IEEE80211_CRC_LEN > vap->iv_rtsthreshold)
3684 	    && !IEEE80211_IS_MULTICAST(wh->i_addr1)) {
3685 		flags |= IWM_TX_CMD_FLG_PROT_REQUIRE;
3686 	}
3687 
3688 	if (IEEE80211_IS_MULTICAST(wh->i_addr1) ||
3689 	    type != IEEE80211_FC0_TYPE_DATA)
3690 		tx->sta_id = sc->sc_aux_sta.sta_id;
3691 	else
3692 		tx->sta_id = IWM_STATION_ID;
3693 
3694 	if (type == IEEE80211_FC0_TYPE_MGT) {
3695 		uint8_t subtype = wh->i_fc[0] & IEEE80211_FC0_SUBTYPE_MASK;
3696 
3697 		if (subtype == IEEE80211_FC0_SUBTYPE_ASSOC_REQ ||
3698 		    subtype == IEEE80211_FC0_SUBTYPE_REASSOC_REQ) {
3699 			tx->pm_frame_timeout = htole16(IWM_PM_FRAME_ASSOC);
3700 		} else if (subtype == IEEE80211_FC0_SUBTYPE_ACTION) {
3701 			tx->pm_frame_timeout = htole16(IWM_PM_FRAME_NONE);
3702 		} else {
3703 			tx->pm_frame_timeout = htole16(IWM_PM_FRAME_MGMT);
3704 		}
3705 	} else {
3706 		tx->pm_frame_timeout = htole16(IWM_PM_FRAME_NONE);
3707 	}
3708 
3709 	if (hdrlen & 3) {
3710 		/* First segment length must be a multiple of 4. */
3711 		flags |= IWM_TX_CMD_FLG_MH_PAD;
3712 		pad = 4 - (hdrlen & 3);
3713 	} else
3714 		pad = 0;
3715 
3716 	tx->driver_txop = 0;
3717 	tx->next_frame_len = 0;
3718 
3719 	tx->len = htole16(totlen);
3720 	tx->tid_tspec = tid;
3721 	tx->life_time = htole32(IWM_TX_CMD_LIFE_TIME_INFINITE);
3722 
3723 	/* Set physical address of "scratch area". */
3724 	tx->dram_lsb_ptr = htole32(data->scratch_paddr);
3725 	tx->dram_msb_ptr = iwm_get_dma_hi_addr(data->scratch_paddr);
3726 
3727 	/* Copy 802.11 header in TX command. */
3728 	memcpy(((uint8_t *)tx) + sizeof(*tx), wh, hdrlen);
3729 
3730 	flags |= IWM_TX_CMD_FLG_BT_DIS | IWM_TX_CMD_FLG_SEQ_CTL;
3731 
3732 	tx->sec_ctl = 0;
3733 	tx->tx_flags |= htole32(flags);
3734 
3735 	/* Trim 802.11 header. */
3736 	m_adj(m, hdrlen);
3737 	error = bus_dmamap_load_mbuf_sg(ring->data_dmat, data->map, m,
3738 	    segs, &nsegs, BUS_DMA_NOWAIT);
3739 	if (error != 0) {
3740 		if (error != EFBIG) {
3741 			device_printf(sc->sc_dev, "can't map mbuf (error %d)\n",
3742 			    error);
3743 			m_freem(m);
3744 			return error;
3745 		}
3746 		/* Too many DMA segments, linearize mbuf. */
3747 		m1 = m_collapse(m, M_NOWAIT, IWM_MAX_SCATTER - 2);
3748 		if (m1 == NULL) {
3749 			device_printf(sc->sc_dev,
3750 			    "%s: could not defrag mbuf\n", __func__);
3751 			m_freem(m);
3752 			return (ENOBUFS);
3753 		}
3754 		m = m1;
3755 
3756 		error = bus_dmamap_load_mbuf_sg(ring->data_dmat, data->map, m,
3757 		    segs, &nsegs, BUS_DMA_NOWAIT);
3758 		if (error != 0) {
3759 			device_printf(sc->sc_dev, "can't map mbuf (error %d)\n",
3760 			    error);
3761 			m_freem(m);
3762 			return error;
3763 		}
3764 	}
3765 	data->m = m;
3766 	data->in = in;
3767 	data->done = 0;
3768 
3769 	IWM_DPRINTF(sc, IWM_DEBUG_XMIT,
3770 	    "sending txd %p, in %p\n", data, data->in);
3771 	KASSERT(data->in != NULL, ("node is NULL"));
3772 
3773 	IWM_DPRINTF(sc, IWM_DEBUG_XMIT,
3774 	    "sending data: qid=%d idx=%d len=%d nsegs=%d txflags=0x%08x rate_n_flags=0x%08x rateidx=%u\n",
3775 	    ring->qid, ring->cur, totlen, nsegs,
3776 	    le32toh(tx->tx_flags),
3777 	    le32toh(tx->rate_n_flags),
3778 	    tx->initial_rate_index
3779 	    );
3780 
3781 	/* Fill TX descriptor. */
3782 	desc->num_tbs = 2 + nsegs;
3783 
3784 	desc->tbs[0].lo = htole32(data->cmd_paddr);
3785 	desc->tbs[0].hi_n_len = htole16(iwm_get_dma_hi_addr(data->cmd_paddr)) |
3786 	    (TB0_SIZE << 4);
3787 	desc->tbs[1].lo = htole32(data->cmd_paddr + TB0_SIZE);
3788 	desc->tbs[1].hi_n_len = htole16(iwm_get_dma_hi_addr(data->cmd_paddr)) |
3789 	    ((sizeof(struct iwm_cmd_header) + sizeof(*tx)
3790 	      + hdrlen + pad - TB0_SIZE) << 4);
3791 
3792 	/* Other DMA segments are for data payload. */
3793 	for (i = 0; i < nsegs; i++) {
3794 		seg = &segs[i];
3795 		desc->tbs[i+2].lo = htole32(seg->ds_addr);
3796 		desc->tbs[i+2].hi_n_len = \
3797 		    htole16(iwm_get_dma_hi_addr(seg->ds_addr))
3798 		    | ((seg->ds_len) << 4);
3799 	}
3800 
3801 	bus_dmamap_sync(ring->data_dmat, data->map,
3802 	    BUS_DMASYNC_PREWRITE);
3803 	bus_dmamap_sync(ring->cmd_dma.tag, ring->cmd_dma.map,
3804 	    BUS_DMASYNC_PREWRITE);
3805 	bus_dmamap_sync(ring->desc_dma.tag, ring->desc_dma.map,
3806 	    BUS_DMASYNC_PREWRITE);
3807 
3808 #if 0
3809 	iwm_update_sched(sc, ring->qid, ring->cur, tx->sta_id, le16toh(tx->len));
3810 #endif
3811 
3812 	/* Kick TX ring. */
3813 	ring->cur = (ring->cur + 1) % IWM_TX_RING_COUNT;
3814 	IWM_WRITE(sc, IWM_HBUS_TARG_WRPTR, ring->qid << 8 | ring->cur);
3815 
3816 	/* Mark TX ring as full if we reach a certain threshold. */
3817 	if (++ring->queued > IWM_TX_RING_HIMARK) {
3818 		sc->qfullmsk |= 1 << ring->qid;
3819 	}
3820 
3821 	return 0;
3822 }
3823 
3824 static int
3825 iwm_raw_xmit(struct ieee80211_node *ni, struct mbuf *m,
3826     const struct ieee80211_bpf_params *params)
3827 {
3828 	struct ieee80211com *ic = ni->ni_ic;
3829 	struct iwm_softc *sc = ic->ic_softc;
3830 	int error = 0;
3831 
3832 	IWM_DPRINTF(sc, IWM_DEBUG_XMIT,
3833 	    "->%s begin\n", __func__);
3834 
3835 	if ((sc->sc_flags & IWM_FLAG_HW_INITED) == 0) {
3836 		m_freem(m);
3837 		IWM_DPRINTF(sc, IWM_DEBUG_XMIT,
3838 		    "<-%s not RUNNING\n", __func__);
3839 		return (ENETDOWN);
3840         }
3841 
3842 	IWM_LOCK(sc);
3843 	/* XXX fix this */
3844         if (params == NULL) {
3845 		error = iwm_tx(sc, m, ni, 0);
3846 	} else {
3847 		error = iwm_tx(sc, m, ni, 0);
3848 	}
3849 	sc->sc_tx_timer = 5;
3850 	IWM_UNLOCK(sc);
3851 
3852         return (error);
3853 }
3854 
3855 /*
3856  * mvm/tx.c
3857  */
3858 
3859 /*
3860  * Note that there are transports that buffer frames before they reach
3861  * the firmware. This means that after flush_tx_path is called, the
3862  * queue might not be empty. The race-free way to handle this is to:
3863  * 1) set the station as draining
3864  * 2) flush the Tx path
3865  * 3) wait for the transport queues to be empty
3866  */
3867 int
3868 iwm_mvm_flush_tx_path(struct iwm_softc *sc, uint32_t tfd_msk, uint32_t flags)
3869 {
3870 	int ret;
3871 	struct iwm_tx_path_flush_cmd flush_cmd = {
3872 		.queues_ctl = htole32(tfd_msk),
3873 		.flush_ctl = htole16(IWM_DUMP_TX_FIFO_FLUSH),
3874 	};
3875 
3876 	ret = iwm_mvm_send_cmd_pdu(sc, IWM_TXPATH_FLUSH, flags,
3877 	    sizeof(flush_cmd), &flush_cmd);
3878 	if (ret)
3879                 device_printf(sc->sc_dev,
3880 		    "Flushing tx queue failed: %d\n", ret);
3881 	return ret;
3882 }
3883 
3884 /*
3885  * BEGIN mvm/quota.c
3886  */
3887 
3888 static int
3889 iwm_mvm_update_quotas(struct iwm_softc *sc, struct iwm_vap *ivp)
3890 {
3891 	struct iwm_time_quota_cmd cmd;
3892 	int i, idx, ret, num_active_macs, quota, quota_rem;
3893 	int colors[IWM_MAX_BINDINGS] = { -1, -1, -1, -1, };
3894 	int n_ifs[IWM_MAX_BINDINGS] = {0, };
3895 	uint16_t id;
3896 
3897 	memset(&cmd, 0, sizeof(cmd));
3898 
3899 	/* currently, PHY ID == binding ID */
3900 	if (ivp) {
3901 		id = ivp->phy_ctxt->id;
3902 		KASSERT(id < IWM_MAX_BINDINGS, ("invalid id"));
3903 		colors[id] = ivp->phy_ctxt->color;
3904 
3905 		if (1)
3906 			n_ifs[id] = 1;
3907 	}
3908 
3909 	/*
3910 	 * The FW's scheduling session consists of
3911 	 * IWM_MVM_MAX_QUOTA fragments. Divide these fragments
3912 	 * equally between all the bindings that require quota
3913 	 */
3914 	num_active_macs = 0;
3915 	for (i = 0; i < IWM_MAX_BINDINGS; i++) {
3916 		cmd.quotas[i].id_and_color = htole32(IWM_FW_CTXT_INVALID);
3917 		num_active_macs += n_ifs[i];
3918 	}
3919 
3920 	quota = 0;
3921 	quota_rem = 0;
3922 	if (num_active_macs) {
3923 		quota = IWM_MVM_MAX_QUOTA / num_active_macs;
3924 		quota_rem = IWM_MVM_MAX_QUOTA % num_active_macs;
3925 	}
3926 
3927 	for (idx = 0, i = 0; i < IWM_MAX_BINDINGS; i++) {
3928 		if (colors[i] < 0)
3929 			continue;
3930 
3931 		cmd.quotas[idx].id_and_color =
3932 			htole32(IWM_FW_CMD_ID_AND_COLOR(i, colors[i]));
3933 
3934 		if (n_ifs[i] <= 0) {
3935 			cmd.quotas[idx].quota = htole32(0);
3936 			cmd.quotas[idx].max_duration = htole32(0);
3937 		} else {
3938 			cmd.quotas[idx].quota = htole32(quota * n_ifs[i]);
3939 			cmd.quotas[idx].max_duration = htole32(0);
3940 		}
3941 		idx++;
3942 	}
3943 
3944 	/* Give the remainder of the session to the first binding */
3945 	cmd.quotas[0].quota = htole32(le32toh(cmd.quotas[0].quota) + quota_rem);
3946 
3947 	ret = iwm_mvm_send_cmd_pdu(sc, IWM_TIME_QUOTA_CMD, IWM_CMD_SYNC,
3948 	    sizeof(cmd), &cmd);
3949 	if (ret)
3950 		device_printf(sc->sc_dev,
3951 		    "%s: Failed to send quota: %d\n", __func__, ret);
3952 	return ret;
3953 }
3954 
3955 /*
3956  * END mvm/quota.c
3957  */
3958 
3959 /*
3960  * ieee80211 routines
3961  */
3962 
3963 /*
3964  * Change to AUTH state in 80211 state machine.  Roughly matches what
3965  * Linux does in bss_info_changed().
3966  */
3967 static int
3968 iwm_auth(struct ieee80211vap *vap, struct iwm_softc *sc)
3969 {
3970 	struct ieee80211_node *ni;
3971 	struct iwm_node *in;
3972 	struct iwm_vap *iv = IWM_VAP(vap);
3973 	uint32_t duration;
3974 	int error;
3975 
3976 	/*
3977 	 * XXX i have a feeling that the vap node is being
3978 	 * freed from underneath us. Grr.
3979 	 */
3980 	ni = ieee80211_ref_node(vap->iv_bss);
3981 	in = IWM_NODE(ni);
3982 	IWM_DPRINTF(sc, IWM_DEBUG_RESET | IWM_DEBUG_STATE,
3983 	    "%s: called; vap=%p, bss ni=%p\n",
3984 	    __func__,
3985 	    vap,
3986 	    ni);
3987 
3988 	in->in_assoc = 0;
3989 
3990 	/*
3991 	 * Firmware bug - it'll crash if the beacon interval is less
3992 	 * than 16. We can't avoid connecting at all, so refuse the
3993 	 * station state change, this will cause net80211 to abandon
3994 	 * attempts to connect to this AP, and eventually wpa_s will
3995 	 * blacklist the AP...
3996 	 */
3997 	if (ni->ni_intval < 16) {
3998 		device_printf(sc->sc_dev,
3999 		    "AP %s beacon interval is %d, refusing due to firmware bug!\n",
4000 		    ether_sprintf(ni->ni_bssid), ni->ni_intval);
4001 		error = EINVAL;
4002 		goto out;
4003 	}
4004 
4005 	error = iwm_allow_mcast(vap, sc);
4006 	if (error) {
4007 		device_printf(sc->sc_dev,
4008 		    "%s: failed to set multicast\n", __func__);
4009 		goto out;
4010 	}
4011 
4012 	/*
4013 	 * This is where it deviates from what Linux does.
4014 	 *
4015 	 * Linux iwlwifi doesn't reset the nic each time, nor does it
4016 	 * call ctxt_add() here.  Instead, it adds it during vap creation,
4017 	 * and always does a mac_ctx_changed().
4018 	 *
4019 	 * The openbsd port doesn't attempt to do that - it reset things
4020 	 * at odd states and does the add here.
4021 	 *
4022 	 * So, until the state handling is fixed (ie, we never reset
4023 	 * the NIC except for a firmware failure, which should drag
4024 	 * the NIC back to IDLE, re-setup and re-add all the mac/phy
4025 	 * contexts that are required), let's do a dirty hack here.
4026 	 */
4027 	if (iv->is_uploaded) {
4028 		if ((error = iwm_mvm_mac_ctxt_changed(sc, vap)) != 0) {
4029 			device_printf(sc->sc_dev,
4030 			    "%s: failed to update MAC\n", __func__);
4031 			goto out;
4032 		}
4033 	} else {
4034 		if ((error = iwm_mvm_mac_ctxt_add(sc, vap)) != 0) {
4035 			device_printf(sc->sc_dev,
4036 			    "%s: failed to add MAC\n", __func__);
4037 			goto out;
4038 		}
4039 	}
4040 
4041 	if ((error = iwm_mvm_phy_ctxt_changed(sc, &sc->sc_phyctxt[0],
4042 	    in->in_ni.ni_chan, 1, 1)) != 0) {
4043 		device_printf(sc->sc_dev,
4044 		    "%s: failed update phy ctxt\n", __func__);
4045 		goto out;
4046 	}
4047 	iv->phy_ctxt = &sc->sc_phyctxt[0];
4048 
4049 	if ((error = iwm_mvm_binding_add_vif(sc, iv)) != 0) {
4050 		device_printf(sc->sc_dev,
4051 		    "%s: binding update cmd\n", __func__);
4052 		goto out;
4053 	}
4054 	/*
4055 	 * Authentication becomes unreliable when powersaving is left enabled
4056 	 * here. Powersaving will be activated again when association has
4057 	 * finished or is aborted.
4058 	 */
4059 	iv->ps_disabled = TRUE;
4060 	error = iwm_mvm_power_update_mac(sc);
4061 	iv->ps_disabled = FALSE;
4062 	if (error != 0) {
4063 		device_printf(sc->sc_dev,
4064 		    "%s: failed to update power management\n",
4065 		    __func__);
4066 		goto out;
4067 	}
4068 	if ((error = iwm_mvm_add_sta(sc, in)) != 0) {
4069 		device_printf(sc->sc_dev,
4070 		    "%s: failed to add sta\n", __func__);
4071 		goto out;
4072 	}
4073 
4074 	/*
4075 	 * Prevent the FW from wandering off channel during association
4076 	 * by "protecting" the session with a time event.
4077 	 */
4078 	/* XXX duration is in units of TU, not MS */
4079 	duration = IWM_MVM_TE_SESSION_PROTECTION_MAX_TIME_MS;
4080 	iwm_mvm_protect_session(sc, iv, duration, 500 /* XXX magic number */);
4081 	DELAY(100);
4082 
4083 	error = 0;
4084 out:
4085 	ieee80211_free_node(ni);
4086 	return (error);
4087 }
4088 
4089 static int
4090 iwm_release(struct iwm_softc *sc, struct iwm_node *in)
4091 {
4092 	uint32_t tfd_msk;
4093 
4094 	/*
4095 	 * Ok, so *technically* the proper set of calls for going
4096 	 * from RUN back to SCAN is:
4097 	 *
4098 	 * iwm_mvm_power_mac_disable(sc, in);
4099 	 * iwm_mvm_mac_ctxt_changed(sc, vap);
4100 	 * iwm_mvm_rm_sta(sc, in);
4101 	 * iwm_mvm_update_quotas(sc, NULL);
4102 	 * iwm_mvm_mac_ctxt_changed(sc, in);
4103 	 * iwm_mvm_binding_remove_vif(sc, IWM_VAP(in->in_ni.ni_vap));
4104 	 * iwm_mvm_mac_ctxt_remove(sc, in);
4105 	 *
4106 	 * However, that freezes the device not matter which permutations
4107 	 * and modifications are attempted.  Obviously, this driver is missing
4108 	 * something since it works in the Linux driver, but figuring out what
4109 	 * is missing is a little more complicated.  Now, since we're going
4110 	 * back to nothing anyway, we'll just do a complete device reset.
4111 	 * Up your's, device!
4112 	 */
4113 	/*
4114 	 * Just using 0xf for the queues mask is fine as long as we only
4115 	 * get here from RUN state.
4116 	 */
4117 	tfd_msk = 0xf;
4118 	iwm_xmit_queue_drain(sc);
4119 	iwm_mvm_flush_tx_path(sc, tfd_msk, IWM_CMD_SYNC);
4120 	/*
4121 	 * We seem to get away with just synchronously sending the
4122 	 * IWM_TXPATH_FLUSH command.
4123 	 */
4124 //	iwm_trans_wait_tx_queue_empty(sc, tfd_msk);
4125 	iwm_stop_device(sc);
4126 	iwm_init_hw(sc);
4127 	if (in)
4128 		in->in_assoc = 0;
4129 	return 0;
4130 
4131 #if 0
4132 	int error;
4133 
4134 	iwm_mvm_power_mac_disable(sc, in);
4135 
4136 	if ((error = iwm_mvm_mac_ctxt_changed(sc, vap)) != 0) {
4137 		device_printf(sc->sc_dev, "mac ctxt change fail 1 %d\n", error);
4138 		return error;
4139 	}
4140 
4141 	if ((error = iwm_mvm_rm_sta(sc, in)) != 0) {
4142 		device_printf(sc->sc_dev, "sta remove fail %d\n", error);
4143 		return error;
4144 	}
4145 	error = iwm_mvm_rm_sta(sc, in);
4146 	in->in_assoc = 0;
4147 	iwm_mvm_update_quotas(sc, NULL);
4148 	if ((error = iwm_mvm_mac_ctxt_changed(sc, vap)) != 0) {
4149 		device_printf(sc->sc_dev, "mac ctxt change fail 2 %d\n", error);
4150 		return error;
4151 	}
4152 	iwm_mvm_binding_remove_vif(sc, IWM_VAP(in->in_ni.ni_vap));
4153 
4154 	iwm_mvm_mac_ctxt_remove(sc, in);
4155 
4156 	return error;
4157 #endif
4158 }
4159 
4160 static struct ieee80211_node *
4161 iwm_node_alloc(struct ieee80211vap *vap, const uint8_t mac[IEEE80211_ADDR_LEN])
4162 {
4163 	return malloc(sizeof (struct iwm_node), M_80211_NODE,
4164 	    M_NOWAIT | M_ZERO);
4165 }
4166 
4167 uint8_t
4168 iwm_ridx2rate(struct ieee80211_rateset *rs, int ridx)
4169 {
4170 	int i;
4171 	uint8_t rval;
4172 
4173 	for (i = 0; i < rs->rs_nrates; i++) {
4174 		rval = (rs->rs_rates[i] & IEEE80211_RATE_VAL);
4175 		if (rval == iwm_rates[ridx].rate)
4176 			return rs->rs_rates[i];
4177 	}
4178 
4179 	return 0;
4180 }
4181 
4182 static void
4183 iwm_setrates(struct iwm_softc *sc, struct iwm_node *in)
4184 {
4185 	struct ieee80211_node *ni = &in->in_ni;
4186 	struct iwm_lq_cmd *lq = &in->in_lq;
4187 	int nrates = ni->ni_rates.rs_nrates;
4188 	int i, ridx, tab = 0;
4189 //	int txant = 0;
4190 
4191 	if (nrates > nitems(lq->rs_table)) {
4192 		device_printf(sc->sc_dev,
4193 		    "%s: node supports %d rates, driver handles "
4194 		    "only %zu\n", __func__, nrates, nitems(lq->rs_table));
4195 		return;
4196 	}
4197 	if (nrates == 0) {
4198 		device_printf(sc->sc_dev,
4199 		    "%s: node supports 0 rates, odd!\n", __func__);
4200 		return;
4201 	}
4202 
4203 	/*
4204 	 * XXX .. and most of iwm_node is not initialised explicitly;
4205 	 * it's all just 0x0 passed to the firmware.
4206 	 */
4207 
4208 	/* first figure out which rates we should support */
4209 	/* XXX TODO: this isn't 11n aware /at all/ */
4210 	memset(&in->in_ridx, -1, sizeof(in->in_ridx));
4211 	IWM_DPRINTF(sc, IWM_DEBUG_TXRATE,
4212 	    "%s: nrates=%d\n", __func__, nrates);
4213 
4214 	/*
4215 	 * Loop over nrates and populate in_ridx from the highest
4216 	 * rate to the lowest rate.  Remember, in_ridx[] has
4217 	 * IEEE80211_RATE_MAXSIZE entries!
4218 	 */
4219 	for (i = 0; i < min(nrates, IEEE80211_RATE_MAXSIZE); i++) {
4220 		int rate = ni->ni_rates.rs_rates[(nrates - 1) - i] & IEEE80211_RATE_VAL;
4221 
4222 		/* Map 802.11 rate to HW rate index. */
4223 		for (ridx = 0; ridx <= IWM_RIDX_MAX; ridx++)
4224 			if (iwm_rates[ridx].rate == rate)
4225 				break;
4226 		if (ridx > IWM_RIDX_MAX) {
4227 			device_printf(sc->sc_dev,
4228 			    "%s: WARNING: device rate for %d not found!\n",
4229 			    __func__, rate);
4230 		} else {
4231 			IWM_DPRINTF(sc, IWM_DEBUG_TXRATE,
4232 			    "%s: rate: i: %d, rate=%d, ridx=%d\n",
4233 			    __func__,
4234 			    i,
4235 			    rate,
4236 			    ridx);
4237 			in->in_ridx[i] = ridx;
4238 		}
4239 	}
4240 
4241 	/* then construct a lq_cmd based on those */
4242 	memset(lq, 0, sizeof(*lq));
4243 	lq->sta_id = IWM_STATION_ID;
4244 
4245 	/* For HT, always enable RTS/CTS to avoid excessive retries. */
4246 	if (ni->ni_flags & IEEE80211_NODE_HT)
4247 		lq->flags |= IWM_LQ_FLAG_USE_RTS_MSK;
4248 
4249 	/*
4250 	 * are these used? (we don't do SISO or MIMO)
4251 	 * need to set them to non-zero, though, or we get an error.
4252 	 */
4253 	lq->single_stream_ant_msk = 1;
4254 	lq->dual_stream_ant_msk = 1;
4255 
4256 	/*
4257 	 * Build the actual rate selection table.
4258 	 * The lowest bits are the rates.  Additionally,
4259 	 * CCK needs bit 9 to be set.  The rest of the bits
4260 	 * we add to the table select the tx antenna
4261 	 * Note that we add the rates in the highest rate first
4262 	 * (opposite of ni_rates).
4263 	 */
4264 	/*
4265 	 * XXX TODO: this should be looping over the min of nrates
4266 	 * and LQ_MAX_RETRY_NUM.  Sigh.
4267 	 */
4268 	for (i = 0; i < nrates; i++) {
4269 		int nextant;
4270 
4271 #if 0
4272 		if (txant == 0)
4273 			txant = iwm_mvm_get_valid_tx_ant(sc);
4274 		nextant = 1<<(ffs(txant)-1);
4275 		txant &= ~nextant;
4276 #else
4277 		nextant = iwm_mvm_get_valid_tx_ant(sc);
4278 #endif
4279 		/*
4280 		 * Map the rate id into a rate index into
4281 		 * our hardware table containing the
4282 		 * configuration to use for this rate.
4283 		 */
4284 		ridx = in->in_ridx[i];
4285 		tab = iwm_rates[ridx].plcp;
4286 		tab |= nextant << IWM_RATE_MCS_ANT_POS;
4287 		if (IWM_RIDX_IS_CCK(ridx))
4288 			tab |= IWM_RATE_MCS_CCK_MSK;
4289 		IWM_DPRINTF(sc, IWM_DEBUG_TXRATE,
4290 		    "station rate i=%d, rate=%d, hw=%x\n",
4291 		    i, iwm_rates[ridx].rate, tab);
4292 		lq->rs_table[i] = htole32(tab);
4293 	}
4294 	/* then fill the rest with the lowest possible rate */
4295 	for (i = nrates; i < nitems(lq->rs_table); i++) {
4296 		KASSERT(tab != 0, ("invalid tab"));
4297 		lq->rs_table[i] = htole32(tab);
4298 	}
4299 }
4300 
4301 static int
4302 iwm_media_change(struct ifnet *ifp)
4303 {
4304 	struct ieee80211vap *vap = ifp->if_softc;
4305 	struct ieee80211com *ic = vap->iv_ic;
4306 	struct iwm_softc *sc = ic->ic_softc;
4307 	int error;
4308 
4309 	error = ieee80211_media_change(ifp);
4310 	if (error != ENETRESET)
4311 		return error;
4312 
4313 	IWM_LOCK(sc);
4314 	if (ic->ic_nrunning > 0) {
4315 		iwm_stop(sc);
4316 		iwm_init(sc);
4317 	}
4318 	IWM_UNLOCK(sc);
4319 	return error;
4320 }
4321 
4322 
4323 static int
4324 iwm_newstate(struct ieee80211vap *vap, enum ieee80211_state nstate, int arg)
4325 {
4326 	struct iwm_vap *ivp = IWM_VAP(vap);
4327 	struct ieee80211com *ic = vap->iv_ic;
4328 	struct iwm_softc *sc = ic->ic_softc;
4329 	struct iwm_node *in;
4330 	int error;
4331 
4332 	IWM_DPRINTF(sc, IWM_DEBUG_STATE,
4333 	    "switching state %s -> %s\n",
4334 	    ieee80211_state_name[vap->iv_state],
4335 	    ieee80211_state_name[nstate]);
4336 	IEEE80211_UNLOCK(ic);
4337 	IWM_LOCK(sc);
4338 
4339 	if (vap->iv_state == IEEE80211_S_SCAN && nstate != vap->iv_state)
4340 		iwm_led_blink_stop(sc);
4341 
4342 	/* disable beacon filtering if we're hopping out of RUN */
4343 	if (vap->iv_state == IEEE80211_S_RUN && nstate != vap->iv_state) {
4344 		iwm_mvm_disable_beacon_filter(sc);
4345 
4346 		if (((in = IWM_NODE(vap->iv_bss)) != NULL))
4347 			in->in_assoc = 0;
4348 
4349 		if (nstate == IEEE80211_S_INIT) {
4350 			IWM_UNLOCK(sc);
4351 			IEEE80211_LOCK(ic);
4352 			error = ivp->iv_newstate(vap, nstate, arg);
4353 			IEEE80211_UNLOCK(ic);
4354 			IWM_LOCK(sc);
4355 			iwm_release(sc, NULL);
4356 			IWM_UNLOCK(sc);
4357 			IEEE80211_LOCK(ic);
4358 			return error;
4359 		}
4360 
4361 		/*
4362 		 * It's impossible to directly go RUN->SCAN. If we iwm_release()
4363 		 * above then the card will be completely reinitialized,
4364 		 * so the driver must do everything necessary to bring the card
4365 		 * from INIT to SCAN.
4366 		 *
4367 		 * Additionally, upon receiving deauth frame from AP,
4368 		 * OpenBSD 802.11 stack puts the driver in IEEE80211_S_AUTH
4369 		 * state. This will also fail with this driver, so bring the FSM
4370 		 * from IEEE80211_S_RUN to IEEE80211_S_SCAN in this case as well.
4371 		 *
4372 		 * XXX TODO: fix this for FreeBSD!
4373 		 */
4374 		if (nstate == IEEE80211_S_SCAN ||
4375 		    nstate == IEEE80211_S_AUTH ||
4376 		    nstate == IEEE80211_S_ASSOC) {
4377 			IWM_DPRINTF(sc, IWM_DEBUG_STATE,
4378 			    "Force transition to INIT; MGT=%d\n", arg);
4379 			IWM_UNLOCK(sc);
4380 			IEEE80211_LOCK(ic);
4381 			/* Always pass arg as -1 since we can't Tx right now. */
4382 			/*
4383 			 * XXX arg is just ignored anyway when transitioning
4384 			 *     to IEEE80211_S_INIT.
4385 			 */
4386 			vap->iv_newstate(vap, IEEE80211_S_INIT, -1);
4387 			IWM_DPRINTF(sc, IWM_DEBUG_STATE,
4388 			    "Going INIT->SCAN\n");
4389 			nstate = IEEE80211_S_SCAN;
4390 			IEEE80211_UNLOCK(ic);
4391 			IWM_LOCK(sc);
4392 		}
4393 	}
4394 
4395 	switch (nstate) {
4396 	case IEEE80211_S_INIT:
4397 	case IEEE80211_S_SCAN:
4398 		if (vap->iv_state == IEEE80211_S_AUTH ||
4399 		    vap->iv_state == IEEE80211_S_ASSOC) {
4400 			int myerr;
4401 			IWM_UNLOCK(sc);
4402 			IEEE80211_LOCK(ic);
4403 			myerr = ivp->iv_newstate(vap, nstate, arg);
4404 			IEEE80211_UNLOCK(ic);
4405 			IWM_LOCK(sc);
4406 			error = iwm_mvm_rm_sta(sc, vap, FALSE);
4407                         if (error) {
4408                                 device_printf(sc->sc_dev,
4409 				    "%s: Failed to remove station: %d\n",
4410 				    __func__, error);
4411 			}
4412 			error = iwm_mvm_mac_ctxt_changed(sc, vap);
4413                         if (error) {
4414                                 device_printf(sc->sc_dev,
4415                                     "%s: Failed to change mac context: %d\n",
4416                                     __func__, error);
4417                         }
4418                         error = iwm_mvm_binding_remove_vif(sc, ivp);
4419                         if (error) {
4420                                 device_printf(sc->sc_dev,
4421                                     "%s: Failed to remove channel ctx: %d\n",
4422                                     __func__, error);
4423                         }
4424 			ivp->phy_ctxt = NULL;
4425 			error = iwm_mvm_power_update_mac(sc);
4426 			if (error != 0) {
4427 				device_printf(sc->sc_dev,
4428 				    "%s: failed to update power management\n",
4429 				    __func__);
4430 			}
4431 			IWM_UNLOCK(sc);
4432 			IEEE80211_LOCK(ic);
4433 			return myerr;
4434 		}
4435 		break;
4436 
4437 	case IEEE80211_S_AUTH:
4438 		if ((error = iwm_auth(vap, sc)) != 0) {
4439 			device_printf(sc->sc_dev,
4440 			    "%s: could not move to auth state: %d\n",
4441 			    __func__, error);
4442 		}
4443 		break;
4444 
4445 	case IEEE80211_S_ASSOC:
4446 		/*
4447 		 * EBS may be disabled due to previous failures reported by FW.
4448 		 * Reset EBS status here assuming environment has been changed.
4449 		 */
4450 		sc->last_ebs_successful = TRUE;
4451 		break;
4452 
4453 	case IEEE80211_S_RUN:
4454 		in = IWM_NODE(vap->iv_bss);
4455 		/* Update the association state, now we have it all */
4456 		/* (eg associd comes in at this point */
4457 		error = iwm_mvm_update_sta(sc, in);
4458 		if (error != 0) {
4459 			device_printf(sc->sc_dev,
4460 			    "%s: failed to update STA\n", __func__);
4461 			IWM_UNLOCK(sc);
4462 			IEEE80211_LOCK(ic);
4463 			return error;
4464 		}
4465 		in->in_assoc = 1;
4466 		error = iwm_mvm_mac_ctxt_changed(sc, vap);
4467 		if (error != 0) {
4468 			device_printf(sc->sc_dev,
4469 			    "%s: failed to update MAC: %d\n", __func__, error);
4470 		}
4471 
4472 		iwm_mvm_sf_update(sc, vap, FALSE);
4473 		iwm_mvm_enable_beacon_filter(sc, ivp);
4474 		iwm_mvm_power_update_mac(sc);
4475 		iwm_mvm_update_quotas(sc, ivp);
4476 		iwm_setrates(sc, in);
4477 
4478 		if ((error = iwm_mvm_send_lq_cmd(sc, &in->in_lq, TRUE)) != 0) {
4479 			device_printf(sc->sc_dev,
4480 			    "%s: IWM_LQ_CMD failed: %d\n", __func__, error);
4481 		}
4482 
4483 		iwm_mvm_led_enable(sc);
4484 		break;
4485 
4486 	default:
4487 		break;
4488 	}
4489 	IWM_UNLOCK(sc);
4490 	IEEE80211_LOCK(ic);
4491 
4492 	return (ivp->iv_newstate(vap, nstate, arg));
4493 }
4494 
4495 void
4496 iwm_endscan_cb(void *arg, int pending)
4497 {
4498 	struct iwm_softc *sc = arg;
4499 	struct ieee80211com *ic = &sc->sc_ic;
4500 
4501 	IWM_DPRINTF(sc, IWM_DEBUG_SCAN | IWM_DEBUG_TRACE,
4502 	    "%s: scan ended\n",
4503 	    __func__);
4504 
4505 	ieee80211_scan_done(TAILQ_FIRST(&ic->ic_vaps));
4506 }
4507 
4508 static int
4509 iwm_send_bt_init_conf(struct iwm_softc *sc)
4510 {
4511 	struct iwm_bt_coex_cmd bt_cmd;
4512 
4513 	bt_cmd.mode = htole32(IWM_BT_COEX_WIFI);
4514 	bt_cmd.enabled_modules = htole32(IWM_BT_COEX_HIGH_BAND_RET);
4515 
4516 	return iwm_mvm_send_cmd_pdu(sc, IWM_BT_CONFIG, 0, sizeof(bt_cmd),
4517 	    &bt_cmd);
4518 }
4519 
4520 static boolean_t
4521 iwm_mvm_is_lar_supported(struct iwm_softc *sc)
4522 {
4523 	boolean_t nvm_lar = sc->nvm_data->lar_enabled;
4524 	boolean_t tlv_lar = fw_has_capa(&sc->ucode_capa,
4525 					IWM_UCODE_TLV_CAPA_LAR_SUPPORT);
4526 
4527 	if (iwm_lar_disable)
4528 		return FALSE;
4529 
4530 	/*
4531 	 * Enable LAR only if it is supported by the FW (TLV) &&
4532 	 * enabled in the NVM
4533 	 */
4534 	if (sc->cfg->device_family == IWM_DEVICE_FAMILY_8000)
4535 		return nvm_lar && tlv_lar;
4536 	else
4537 		return tlv_lar;
4538 }
4539 
4540 static boolean_t
4541 iwm_mvm_is_wifi_mcc_supported(struct iwm_softc *sc)
4542 {
4543 	return fw_has_api(&sc->ucode_capa,
4544 			  IWM_UCODE_TLV_API_WIFI_MCC_UPDATE) ||
4545 	       fw_has_capa(&sc->ucode_capa,
4546 			   IWM_UCODE_TLV_CAPA_LAR_MULTI_MCC);
4547 }
4548 
4549 static int
4550 iwm_send_update_mcc_cmd(struct iwm_softc *sc, const char *alpha2)
4551 {
4552 	struct iwm_mcc_update_cmd mcc_cmd;
4553 	struct iwm_host_cmd hcmd = {
4554 		.id = IWM_MCC_UPDATE_CMD,
4555 		.flags = (IWM_CMD_SYNC | IWM_CMD_WANT_SKB),
4556 		.data = { &mcc_cmd },
4557 	};
4558 	int ret;
4559 #ifdef IWM_DEBUG
4560 	struct iwm_rx_packet *pkt;
4561 	struct iwm_mcc_update_resp_v1 *mcc_resp_v1 = NULL;
4562 	struct iwm_mcc_update_resp *mcc_resp;
4563 	int n_channels;
4564 	uint16_t mcc;
4565 #endif
4566 	int resp_v2 = fw_has_capa(&sc->ucode_capa,
4567 	    IWM_UCODE_TLV_CAPA_LAR_SUPPORT_V2);
4568 
4569 	if (!iwm_mvm_is_lar_supported(sc)) {
4570 		IWM_DPRINTF(sc, IWM_DEBUG_LAR, "%s: no LAR support\n",
4571 		    __func__);
4572 		return 0;
4573 	}
4574 
4575 	memset(&mcc_cmd, 0, sizeof(mcc_cmd));
4576 	mcc_cmd.mcc = htole16(alpha2[0] << 8 | alpha2[1]);
4577 	if (iwm_mvm_is_wifi_mcc_supported(sc))
4578 		mcc_cmd.source_id = IWM_MCC_SOURCE_GET_CURRENT;
4579 	else
4580 		mcc_cmd.source_id = IWM_MCC_SOURCE_OLD_FW;
4581 
4582 	if (resp_v2)
4583 		hcmd.len[0] = sizeof(struct iwm_mcc_update_cmd);
4584 	else
4585 		hcmd.len[0] = sizeof(struct iwm_mcc_update_cmd_v1);
4586 
4587 	IWM_DPRINTF(sc, IWM_DEBUG_LAR,
4588 	    "send MCC update to FW with '%c%c' src = %d\n",
4589 	    alpha2[0], alpha2[1], mcc_cmd.source_id);
4590 
4591 	ret = iwm_send_cmd(sc, &hcmd);
4592 	if (ret)
4593 		return ret;
4594 
4595 #ifdef IWM_DEBUG
4596 	pkt = hcmd.resp_pkt;
4597 
4598 	/* Extract MCC response */
4599 	if (resp_v2) {
4600 		mcc_resp = (void *)pkt->data;
4601 		mcc = mcc_resp->mcc;
4602 		n_channels =  le32toh(mcc_resp->n_channels);
4603 	} else {
4604 		mcc_resp_v1 = (void *)pkt->data;
4605 		mcc = mcc_resp_v1->mcc;
4606 		n_channels =  le32toh(mcc_resp_v1->n_channels);
4607 	}
4608 
4609 	/* W/A for a FW/NVM issue - returns 0x00 for the world domain */
4610 	if (mcc == 0)
4611 		mcc = 0x3030;  /* "00" - world */
4612 
4613 	IWM_DPRINTF(sc, IWM_DEBUG_LAR,
4614 	    "regulatory domain '%c%c' (%d channels available)\n",
4615 	    mcc >> 8, mcc & 0xff, n_channels);
4616 #endif
4617 	iwm_free_resp(sc, &hcmd);
4618 
4619 	return 0;
4620 }
4621 
4622 static void
4623 iwm_mvm_tt_tx_backoff(struct iwm_softc *sc, uint32_t backoff)
4624 {
4625 	struct iwm_host_cmd cmd = {
4626 		.id = IWM_REPLY_THERMAL_MNG_BACKOFF,
4627 		.len = { sizeof(uint32_t), },
4628 		.data = { &backoff, },
4629 	};
4630 
4631 	if (iwm_send_cmd(sc, &cmd) != 0) {
4632 		device_printf(sc->sc_dev,
4633 		    "failed to change thermal tx backoff\n");
4634 	}
4635 }
4636 
4637 static int
4638 iwm_init_hw(struct iwm_softc *sc)
4639 {
4640 	struct ieee80211com *ic = &sc->sc_ic;
4641 	int error, i, ac;
4642 
4643 	sc->sf_state = IWM_SF_UNINIT;
4644 
4645 	if ((error = iwm_start_hw(sc)) != 0) {
4646 		printf("iwm_start_hw: failed %d\n", error);
4647 		return error;
4648 	}
4649 
4650 	if ((error = iwm_run_init_mvm_ucode(sc, 0)) != 0) {
4651 		printf("iwm_run_init_mvm_ucode: failed %d\n", error);
4652 		return error;
4653 	}
4654 
4655 	/*
4656 	 * should stop and start HW since that INIT
4657 	 * image just loaded
4658 	 */
4659 	iwm_stop_device(sc);
4660 	sc->sc_ps_disabled = FALSE;
4661 	if ((error = iwm_start_hw(sc)) != 0) {
4662 		device_printf(sc->sc_dev, "could not initialize hardware\n");
4663 		return error;
4664 	}
4665 
4666 	/* omstart, this time with the regular firmware */
4667 	error = iwm_mvm_load_ucode_wait_alive(sc, IWM_UCODE_REGULAR);
4668 	if (error) {
4669 		device_printf(sc->sc_dev, "could not load firmware\n");
4670 		goto error;
4671 	}
4672 
4673 	error = iwm_mvm_sf_update(sc, NULL, FALSE);
4674 	if (error)
4675 		device_printf(sc->sc_dev, "Failed to initialize Smart Fifo\n");
4676 
4677 	if ((error = iwm_send_bt_init_conf(sc)) != 0) {
4678 		device_printf(sc->sc_dev, "bt init conf failed\n");
4679 		goto error;
4680 	}
4681 
4682 	error = iwm_send_tx_ant_cfg(sc, iwm_mvm_get_valid_tx_ant(sc));
4683 	if (error != 0) {
4684 		device_printf(sc->sc_dev, "antenna config failed\n");
4685 		goto error;
4686 	}
4687 
4688 	/* Send phy db control command and then phy db calibration */
4689 	if ((error = iwm_send_phy_db_data(sc->sc_phy_db)) != 0)
4690 		goto error;
4691 
4692 	if ((error = iwm_send_phy_cfg_cmd(sc)) != 0) {
4693 		device_printf(sc->sc_dev, "phy_cfg_cmd failed\n");
4694 		goto error;
4695 	}
4696 
4697 	/* Add auxiliary station for scanning */
4698 	if ((error = iwm_mvm_add_aux_sta(sc)) != 0) {
4699 		device_printf(sc->sc_dev, "add_aux_sta failed\n");
4700 		goto error;
4701 	}
4702 
4703 	for (i = 0; i < IWM_NUM_PHY_CTX; i++) {
4704 		/*
4705 		 * The channel used here isn't relevant as it's
4706 		 * going to be overwritten in the other flows.
4707 		 * For now use the first channel we have.
4708 		 */
4709 		if ((error = iwm_mvm_phy_ctxt_add(sc,
4710 		    &sc->sc_phyctxt[i], &ic->ic_channels[1], 1, 1)) != 0)
4711 			goto error;
4712 	}
4713 
4714 	/* Initialize tx backoffs to the minimum. */
4715 	if (sc->cfg->device_family == IWM_DEVICE_FAMILY_7000)
4716 		iwm_mvm_tt_tx_backoff(sc, 0);
4717 
4718 	error = iwm_mvm_power_update_device(sc);
4719 	if (error)
4720 		goto error;
4721 
4722 	if ((error = iwm_send_update_mcc_cmd(sc, "ZZ")) != 0)
4723 		goto error;
4724 
4725 	if (fw_has_capa(&sc->ucode_capa, IWM_UCODE_TLV_CAPA_UMAC_SCAN)) {
4726 		if ((error = iwm_mvm_config_umac_scan(sc)) != 0)
4727 			goto error;
4728 	}
4729 
4730 	/* Enable Tx queues. */
4731 	for (ac = 0; ac < WME_NUM_AC; ac++) {
4732 		error = iwm_enable_txq(sc, IWM_STATION_ID, ac,
4733 		    iwm_mvm_ac_to_tx_fifo[ac]);
4734 		if (error)
4735 			goto error;
4736 	}
4737 
4738 	if ((error = iwm_mvm_disable_beacon_filter(sc)) != 0) {
4739 		device_printf(sc->sc_dev, "failed to disable beacon filter\n");
4740 		goto error;
4741 	}
4742 
4743 	return 0;
4744 
4745  error:
4746 	iwm_stop_device(sc);
4747 	return error;
4748 }
4749 
4750 /* Allow multicast from our BSSID. */
4751 static int
4752 iwm_allow_mcast(struct ieee80211vap *vap, struct iwm_softc *sc)
4753 {
4754 	struct ieee80211_node *ni = vap->iv_bss;
4755 	struct iwm_mcast_filter_cmd *cmd;
4756 	size_t size;
4757 	int error;
4758 
4759 	size = roundup(sizeof(*cmd), 4);
4760 	cmd = malloc(size, M_DEVBUF, M_NOWAIT | M_ZERO);
4761 	if (cmd == NULL)
4762 		return ENOMEM;
4763 	cmd->filter_own = 1;
4764 	cmd->port_id = 0;
4765 	cmd->count = 0;
4766 	cmd->pass_all = 1;
4767 	IEEE80211_ADDR_COPY(cmd->bssid, ni->ni_bssid);
4768 
4769 	error = iwm_mvm_send_cmd_pdu(sc, IWM_MCAST_FILTER_CMD,
4770 	    IWM_CMD_SYNC, size, cmd);
4771 	free(cmd, M_DEVBUF);
4772 
4773 	return (error);
4774 }
4775 
4776 /*
4777  * ifnet interfaces
4778  */
4779 
4780 static void
4781 iwm_init(struct iwm_softc *sc)
4782 {
4783 	int error;
4784 
4785 	if (sc->sc_flags & IWM_FLAG_HW_INITED) {
4786 		return;
4787 	}
4788 	sc->sc_generation++;
4789 	sc->sc_flags &= ~IWM_FLAG_STOPPED;
4790 
4791 	if ((error = iwm_init_hw(sc)) != 0) {
4792 		printf("iwm_init_hw failed %d\n", error);
4793 		iwm_stop(sc);
4794 		return;
4795 	}
4796 
4797 	/*
4798 	 * Ok, firmware loaded and we are jogging
4799 	 */
4800 	sc->sc_flags |= IWM_FLAG_HW_INITED;
4801 	callout_reset(&sc->sc_watchdog_to, hz, iwm_watchdog, sc);
4802 }
4803 
4804 static int
4805 iwm_transmit(struct ieee80211com *ic, struct mbuf *m)
4806 {
4807 	struct iwm_softc *sc;
4808 	int error;
4809 
4810 	sc = ic->ic_softc;
4811 
4812 	IWM_LOCK(sc);
4813 	if ((sc->sc_flags & IWM_FLAG_HW_INITED) == 0) {
4814 		IWM_UNLOCK(sc);
4815 		return (ENXIO);
4816 	}
4817 	error = mbufq_enqueue(&sc->sc_snd, m);
4818 	if (error) {
4819 		IWM_UNLOCK(sc);
4820 		return (error);
4821 	}
4822 	iwm_start(sc);
4823 	IWM_UNLOCK(sc);
4824 	return (0);
4825 }
4826 
4827 /*
4828  * Dequeue packets from sendq and call send.
4829  */
4830 static void
4831 iwm_start(struct iwm_softc *sc)
4832 {
4833 	struct ieee80211_node *ni;
4834 	struct mbuf *m;
4835 	int ac = 0;
4836 
4837 	IWM_DPRINTF(sc, IWM_DEBUG_XMIT | IWM_DEBUG_TRACE, "->%s\n", __func__);
4838 	while (sc->qfullmsk == 0 &&
4839 		(m = mbufq_dequeue(&sc->sc_snd)) != NULL) {
4840 		ni = (struct ieee80211_node *)m->m_pkthdr.rcvif;
4841 		if (iwm_tx(sc, m, ni, ac) != 0) {
4842 			if_inc_counter(ni->ni_vap->iv_ifp,
4843 			    IFCOUNTER_OERRORS, 1);
4844 			ieee80211_free_node(ni);
4845 			continue;
4846 		}
4847 		sc->sc_tx_timer = 15;
4848 	}
4849 	IWM_DPRINTF(sc, IWM_DEBUG_XMIT | IWM_DEBUG_TRACE, "<-%s\n", __func__);
4850 }
4851 
4852 static void
4853 iwm_stop(struct iwm_softc *sc)
4854 {
4855 
4856 	sc->sc_flags &= ~IWM_FLAG_HW_INITED;
4857 	sc->sc_flags |= IWM_FLAG_STOPPED;
4858 	sc->sc_generation++;
4859 	iwm_led_blink_stop(sc);
4860 	sc->sc_tx_timer = 0;
4861 	iwm_stop_device(sc);
4862 	sc->sc_flags &= ~IWM_FLAG_SCAN_RUNNING;
4863 }
4864 
4865 static void
4866 iwm_watchdog(void *arg)
4867 {
4868 	struct iwm_softc *sc = arg;
4869 	struct ieee80211com *ic = &sc->sc_ic;
4870 
4871 	if (sc->sc_tx_timer > 0) {
4872 		if (--sc->sc_tx_timer == 0) {
4873 			device_printf(sc->sc_dev, "device timeout\n");
4874 #ifdef IWM_DEBUG
4875 			iwm_nic_error(sc);
4876 #endif
4877 			ieee80211_restart_all(ic);
4878 			counter_u64_add(sc->sc_ic.ic_oerrors, 1);
4879 			return;
4880 		}
4881 	}
4882 	callout_reset(&sc->sc_watchdog_to, hz, iwm_watchdog, sc);
4883 }
4884 
4885 static void
4886 iwm_parent(struct ieee80211com *ic)
4887 {
4888 	struct iwm_softc *sc = ic->ic_softc;
4889 	int startall = 0;
4890 
4891 	IWM_LOCK(sc);
4892 	if (ic->ic_nrunning > 0) {
4893 		if (!(sc->sc_flags & IWM_FLAG_HW_INITED)) {
4894 			iwm_init(sc);
4895 			startall = 1;
4896 		}
4897 	} else if (sc->sc_flags & IWM_FLAG_HW_INITED)
4898 		iwm_stop(sc);
4899 	IWM_UNLOCK(sc);
4900 	if (startall)
4901 		ieee80211_start_all(ic);
4902 }
4903 
4904 /*
4905  * The interrupt side of things
4906  */
4907 
4908 /*
4909  * error dumping routines are from iwlwifi/mvm/utils.c
4910  */
4911 
4912 /*
4913  * Note: This structure is read from the device with IO accesses,
4914  * and the reading already does the endian conversion. As it is
4915  * read with uint32_t-sized accesses, any members with a different size
4916  * need to be ordered correctly though!
4917  */
4918 struct iwm_error_event_table {
4919 	uint32_t valid;		/* (nonzero) valid, (0) log is empty */
4920 	uint32_t error_id;		/* type of error */
4921 	uint32_t trm_hw_status0;	/* TRM HW status */
4922 	uint32_t trm_hw_status1;	/* TRM HW status */
4923 	uint32_t blink2;		/* branch link */
4924 	uint32_t ilink1;		/* interrupt link */
4925 	uint32_t ilink2;		/* interrupt link */
4926 	uint32_t data1;		/* error-specific data */
4927 	uint32_t data2;		/* error-specific data */
4928 	uint32_t data3;		/* error-specific data */
4929 	uint32_t bcon_time;		/* beacon timer */
4930 	uint32_t tsf_low;		/* network timestamp function timer */
4931 	uint32_t tsf_hi;		/* network timestamp function timer */
4932 	uint32_t gp1;		/* GP1 timer register */
4933 	uint32_t gp2;		/* GP2 timer register */
4934 	uint32_t fw_rev_type;	/* firmware revision type */
4935 	uint32_t major;		/* uCode version major */
4936 	uint32_t minor;		/* uCode version minor */
4937 	uint32_t hw_ver;		/* HW Silicon version */
4938 	uint32_t brd_ver;		/* HW board version */
4939 	uint32_t log_pc;		/* log program counter */
4940 	uint32_t frame_ptr;		/* frame pointer */
4941 	uint32_t stack_ptr;		/* stack pointer */
4942 	uint32_t hcmd;		/* last host command header */
4943 	uint32_t isr0;		/* isr status register LMPM_NIC_ISR0:
4944 				 * rxtx_flag */
4945 	uint32_t isr1;		/* isr status register LMPM_NIC_ISR1:
4946 				 * host_flag */
4947 	uint32_t isr2;		/* isr status register LMPM_NIC_ISR2:
4948 				 * enc_flag */
4949 	uint32_t isr3;		/* isr status register LMPM_NIC_ISR3:
4950 				 * time_flag */
4951 	uint32_t isr4;		/* isr status register LMPM_NIC_ISR4:
4952 				 * wico interrupt */
4953 	uint32_t last_cmd_id;	/* last HCMD id handled by the firmware */
4954 	uint32_t wait_event;		/* wait event() caller address */
4955 	uint32_t l2p_control;	/* L2pControlField */
4956 	uint32_t l2p_duration;	/* L2pDurationField */
4957 	uint32_t l2p_mhvalid;	/* L2pMhValidBits */
4958 	uint32_t l2p_addr_match;	/* L2pAddrMatchStat */
4959 	uint32_t lmpm_pmg_sel;	/* indicate which clocks are turned on
4960 				 * (LMPM_PMG_SEL) */
4961 	uint32_t u_timestamp;	/* indicate when the date and time of the
4962 				 * compilation */
4963 	uint32_t flow_handler;	/* FH read/write pointers, RX credit */
4964 } __packed /* LOG_ERROR_TABLE_API_S_VER_3 */;
4965 
4966 /*
4967  * UMAC error struct - relevant starting from family 8000 chip.
4968  * Note: This structure is read from the device with IO accesses,
4969  * and the reading already does the endian conversion. As it is
4970  * read with u32-sized accesses, any members with a different size
4971  * need to be ordered correctly though!
4972  */
4973 struct iwm_umac_error_event_table {
4974 	uint32_t valid;		/* (nonzero) valid, (0) log is empty */
4975 	uint32_t error_id;	/* type of error */
4976 	uint32_t blink1;	/* branch link */
4977 	uint32_t blink2;	/* branch link */
4978 	uint32_t ilink1;	/* interrupt link */
4979 	uint32_t ilink2;	/* interrupt link */
4980 	uint32_t data1;		/* error-specific data */
4981 	uint32_t data2;		/* error-specific data */
4982 	uint32_t data3;		/* error-specific data */
4983 	uint32_t umac_major;
4984 	uint32_t umac_minor;
4985 	uint32_t frame_pointer;	/* core register 27*/
4986 	uint32_t stack_pointer;	/* core register 28 */
4987 	uint32_t cmd_header;	/* latest host cmd sent to UMAC */
4988 	uint32_t nic_isr_pref;	/* ISR status register */
4989 } __packed;
4990 
4991 #define ERROR_START_OFFSET  (1 * sizeof(uint32_t))
4992 #define ERROR_ELEM_SIZE     (7 * sizeof(uint32_t))
4993 
4994 #ifdef IWM_DEBUG
4995 struct {
4996 	const char *name;
4997 	uint8_t num;
4998 } advanced_lookup[] = {
4999 	{ "NMI_INTERRUPT_WDG", 0x34 },
5000 	{ "SYSASSERT", 0x35 },
5001 	{ "UCODE_VERSION_MISMATCH", 0x37 },
5002 	{ "BAD_COMMAND", 0x38 },
5003 	{ "NMI_INTERRUPT_DATA_ACTION_PT", 0x3C },
5004 	{ "FATAL_ERROR", 0x3D },
5005 	{ "NMI_TRM_HW_ERR", 0x46 },
5006 	{ "NMI_INTERRUPT_TRM", 0x4C },
5007 	{ "NMI_INTERRUPT_BREAK_POINT", 0x54 },
5008 	{ "NMI_INTERRUPT_WDG_RXF_FULL", 0x5C },
5009 	{ "NMI_INTERRUPT_WDG_NO_RBD_RXF_FULL", 0x64 },
5010 	{ "NMI_INTERRUPT_HOST", 0x66 },
5011 	{ "NMI_INTERRUPT_ACTION_PT", 0x7C },
5012 	{ "NMI_INTERRUPT_UNKNOWN", 0x84 },
5013 	{ "NMI_INTERRUPT_INST_ACTION_PT", 0x86 },
5014 	{ "ADVANCED_SYSASSERT", 0 },
5015 };
5016 
5017 static const char *
5018 iwm_desc_lookup(uint32_t num)
5019 {
5020 	int i;
5021 
5022 	for (i = 0; i < nitems(advanced_lookup) - 1; i++)
5023 		if (advanced_lookup[i].num == num)
5024 			return advanced_lookup[i].name;
5025 
5026 	/* No entry matches 'num', so it is the last: ADVANCED_SYSASSERT */
5027 	return advanced_lookup[i].name;
5028 }
5029 
5030 static void
5031 iwm_nic_umac_error(struct iwm_softc *sc)
5032 {
5033 	struct iwm_umac_error_event_table table;
5034 	uint32_t base;
5035 
5036 	base = sc->umac_error_event_table;
5037 
5038 	if (base < 0x800000) {
5039 		device_printf(sc->sc_dev, "Invalid error log pointer 0x%08x\n",
5040 		    base);
5041 		return;
5042 	}
5043 
5044 	if (iwm_read_mem(sc, base, &table, sizeof(table)/sizeof(uint32_t))) {
5045 		device_printf(sc->sc_dev, "reading errlog failed\n");
5046 		return;
5047 	}
5048 
5049 	if (ERROR_START_OFFSET <= table.valid * ERROR_ELEM_SIZE) {
5050 		device_printf(sc->sc_dev, "Start UMAC Error Log Dump:\n");
5051 		device_printf(sc->sc_dev, "Status: 0x%x, count: %d\n",
5052 		    sc->sc_flags, table.valid);
5053 	}
5054 
5055 	device_printf(sc->sc_dev, "0x%08X | %s\n", table.error_id,
5056 		iwm_desc_lookup(table.error_id));
5057 	device_printf(sc->sc_dev, "0x%08X | umac branchlink1\n", table.blink1);
5058 	device_printf(sc->sc_dev, "0x%08X | umac branchlink2\n", table.blink2);
5059 	device_printf(sc->sc_dev, "0x%08X | umac interruptlink1\n",
5060 	    table.ilink1);
5061 	device_printf(sc->sc_dev, "0x%08X | umac interruptlink2\n",
5062 	    table.ilink2);
5063 	device_printf(sc->sc_dev, "0x%08X | umac data1\n", table.data1);
5064 	device_printf(sc->sc_dev, "0x%08X | umac data2\n", table.data2);
5065 	device_printf(sc->sc_dev, "0x%08X | umac data3\n", table.data3);
5066 	device_printf(sc->sc_dev, "0x%08X | umac major\n", table.umac_major);
5067 	device_printf(sc->sc_dev, "0x%08X | umac minor\n", table.umac_minor);
5068 	device_printf(sc->sc_dev, "0x%08X | frame pointer\n",
5069 	    table.frame_pointer);
5070 	device_printf(sc->sc_dev, "0x%08X | stack pointer\n",
5071 	    table.stack_pointer);
5072 	device_printf(sc->sc_dev, "0x%08X | last host cmd\n", table.cmd_header);
5073 	device_printf(sc->sc_dev, "0x%08X | isr status reg\n",
5074 	    table.nic_isr_pref);
5075 }
5076 
5077 /*
5078  * Support for dumping the error log seemed like a good idea ...
5079  * but it's mostly hex junk and the only sensible thing is the
5080  * hw/ucode revision (which we know anyway).  Since it's here,
5081  * I'll just leave it in, just in case e.g. the Intel guys want to
5082  * help us decipher some "ADVANCED_SYSASSERT" later.
5083  */
5084 static void
5085 iwm_nic_error(struct iwm_softc *sc)
5086 {
5087 	struct iwm_error_event_table table;
5088 	uint32_t base;
5089 
5090 	device_printf(sc->sc_dev, "dumping device error log\n");
5091 	base = sc->error_event_table;
5092 	if (base < 0x800000) {
5093 		device_printf(sc->sc_dev,
5094 		    "Invalid error log pointer 0x%08x\n", base);
5095 		return;
5096 	}
5097 
5098 	if (iwm_read_mem(sc, base, &table, sizeof(table)/sizeof(uint32_t))) {
5099 		device_printf(sc->sc_dev, "reading errlog failed\n");
5100 		return;
5101 	}
5102 
5103 	if (!table.valid) {
5104 		device_printf(sc->sc_dev, "errlog not found, skipping\n");
5105 		return;
5106 	}
5107 
5108 	if (ERROR_START_OFFSET <= table.valid * ERROR_ELEM_SIZE) {
5109 		device_printf(sc->sc_dev, "Start Error Log Dump:\n");
5110 		device_printf(sc->sc_dev, "Status: 0x%x, count: %d\n",
5111 		    sc->sc_flags, table.valid);
5112 	}
5113 
5114 	device_printf(sc->sc_dev, "0x%08X | %-28s\n", table.error_id,
5115 	    iwm_desc_lookup(table.error_id));
5116 	device_printf(sc->sc_dev, "%08X | trm_hw_status0\n",
5117 	    table.trm_hw_status0);
5118 	device_printf(sc->sc_dev, "%08X | trm_hw_status1\n",
5119 	    table.trm_hw_status1);
5120 	device_printf(sc->sc_dev, "%08X | branchlink2\n", table.blink2);
5121 	device_printf(sc->sc_dev, "%08X | interruptlink1\n", table.ilink1);
5122 	device_printf(sc->sc_dev, "%08X | interruptlink2\n", table.ilink2);
5123 	device_printf(sc->sc_dev, "%08X | data1\n", table.data1);
5124 	device_printf(sc->sc_dev, "%08X | data2\n", table.data2);
5125 	device_printf(sc->sc_dev, "%08X | data3\n", table.data3);
5126 	device_printf(sc->sc_dev, "%08X | beacon time\n", table.bcon_time);
5127 	device_printf(sc->sc_dev, "%08X | tsf low\n", table.tsf_low);
5128 	device_printf(sc->sc_dev, "%08X | tsf hi\n", table.tsf_hi);
5129 	device_printf(sc->sc_dev, "%08X | time gp1\n", table.gp1);
5130 	device_printf(sc->sc_dev, "%08X | time gp2\n", table.gp2);
5131 	device_printf(sc->sc_dev, "%08X | uCode revision type\n",
5132 	    table.fw_rev_type);
5133 	device_printf(sc->sc_dev, "%08X | uCode version major\n", table.major);
5134 	device_printf(sc->sc_dev, "%08X | uCode version minor\n", table.minor);
5135 	device_printf(sc->sc_dev, "%08X | hw version\n", table.hw_ver);
5136 	device_printf(sc->sc_dev, "%08X | board version\n", table.brd_ver);
5137 	device_printf(sc->sc_dev, "%08X | hcmd\n", table.hcmd);
5138 	device_printf(sc->sc_dev, "%08X | isr0\n", table.isr0);
5139 	device_printf(sc->sc_dev, "%08X | isr1\n", table.isr1);
5140 	device_printf(sc->sc_dev, "%08X | isr2\n", table.isr2);
5141 	device_printf(sc->sc_dev, "%08X | isr3\n", table.isr3);
5142 	device_printf(sc->sc_dev, "%08X | isr4\n", table.isr4);
5143 	device_printf(sc->sc_dev, "%08X | last cmd Id\n", table.last_cmd_id);
5144 	device_printf(sc->sc_dev, "%08X | wait_event\n", table.wait_event);
5145 	device_printf(sc->sc_dev, "%08X | l2p_control\n", table.l2p_control);
5146 	device_printf(sc->sc_dev, "%08X | l2p_duration\n", table.l2p_duration);
5147 	device_printf(sc->sc_dev, "%08X | l2p_mhvalid\n", table.l2p_mhvalid);
5148 	device_printf(sc->sc_dev, "%08X | l2p_addr_match\n", table.l2p_addr_match);
5149 	device_printf(sc->sc_dev, "%08X | lmpm_pmg_sel\n", table.lmpm_pmg_sel);
5150 	device_printf(sc->sc_dev, "%08X | timestamp\n", table.u_timestamp);
5151 	device_printf(sc->sc_dev, "%08X | flow_handler\n", table.flow_handler);
5152 
5153 	if (sc->umac_error_event_table)
5154 		iwm_nic_umac_error(sc);
5155 }
5156 #endif
5157 
5158 static void
5159 iwm_handle_rxb(struct iwm_softc *sc, struct mbuf *m)
5160 {
5161 	struct ieee80211com *ic = &sc->sc_ic;
5162 	struct iwm_cmd_response *cresp;
5163 	struct mbuf *m1;
5164 	uint32_t offset = 0;
5165 	uint32_t maxoff = IWM_RBUF_SIZE;
5166 	uint32_t nextoff;
5167 	boolean_t stolen = FALSE;
5168 
5169 #define HAVEROOM(a)	\
5170     ((a) + sizeof(uint32_t) + sizeof(struct iwm_cmd_header) < maxoff)
5171 
5172 	while (HAVEROOM(offset)) {
5173 		struct iwm_rx_packet *pkt = mtodoff(m, struct iwm_rx_packet *,
5174 		    offset);
5175 		int qid, idx, code, len;
5176 
5177 		qid = pkt->hdr.qid;
5178 		idx = pkt->hdr.idx;
5179 
5180 		code = IWM_WIDE_ID(pkt->hdr.flags, pkt->hdr.code);
5181 
5182 		/*
5183 		 * randomly get these from the firmware, no idea why.
5184 		 * they at least seem harmless, so just ignore them for now
5185 		 */
5186 		if ((pkt->hdr.code == 0 && (qid & ~0x80) == 0 && idx == 0) ||
5187 		    pkt->len_n_flags == htole32(IWM_FH_RSCSR_FRAME_INVALID)) {
5188 			break;
5189 		}
5190 
5191 		IWM_DPRINTF(sc, IWM_DEBUG_INTR,
5192 		    "rx packet qid=%d idx=%d type=%x\n",
5193 		    qid & ~0x80, pkt->hdr.idx, code);
5194 
5195 		len = iwm_rx_packet_len(pkt);
5196 		len += sizeof(uint32_t); /* account for status word */
5197 		nextoff = offset + roundup2(len, IWM_FH_RSCSR_FRAME_ALIGN);
5198 
5199 		iwm_notification_wait_notify(sc->sc_notif_wait, code, pkt);
5200 
5201 		switch (code) {
5202 		case IWM_REPLY_RX_PHY_CMD:
5203 			iwm_mvm_rx_rx_phy_cmd(sc, pkt);
5204 			break;
5205 
5206 		case IWM_REPLY_RX_MPDU_CMD: {
5207 			/*
5208 			 * If this is the last frame in the RX buffer, we
5209 			 * can directly feed the mbuf to the sharks here.
5210 			 */
5211 			struct iwm_rx_packet *nextpkt = mtodoff(m,
5212 			    struct iwm_rx_packet *, nextoff);
5213 			if (!HAVEROOM(nextoff) ||
5214 			    (nextpkt->hdr.code == 0 &&
5215 			     (nextpkt->hdr.qid & ~0x80) == 0 &&
5216 			     nextpkt->hdr.idx == 0) ||
5217 			    (nextpkt->len_n_flags ==
5218 			     htole32(IWM_FH_RSCSR_FRAME_INVALID))) {
5219 				if (iwm_mvm_rx_rx_mpdu(sc, m, offset, stolen)) {
5220 					stolen = FALSE;
5221 					/* Make sure we abort the loop */
5222 					nextoff = maxoff;
5223 				}
5224 				break;
5225 			}
5226 
5227 			/*
5228 			 * Use m_copym instead of m_split, because that
5229 			 * makes it easier to keep a valid rx buffer in
5230 			 * the ring, when iwm_mvm_rx_rx_mpdu() fails.
5231 			 *
5232 			 * We need to start m_copym() at offset 0, to get the
5233 			 * M_PKTHDR flag preserved.
5234 			 */
5235 			m1 = m_copym(m, 0, M_COPYALL, M_NOWAIT);
5236 			if (m1) {
5237 				if (iwm_mvm_rx_rx_mpdu(sc, m1, offset, stolen))
5238 					stolen = TRUE;
5239 				else
5240 					m_freem(m1);
5241 			}
5242 			break;
5243 		}
5244 
5245 		case IWM_TX_CMD:
5246 			iwm_mvm_rx_tx_cmd(sc, pkt);
5247 			break;
5248 
5249 		case IWM_MISSED_BEACONS_NOTIFICATION: {
5250 			struct iwm_missed_beacons_notif *resp;
5251 			int missed;
5252 
5253 			/* XXX look at mac_id to determine interface ID */
5254 			struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps);
5255 
5256 			resp = (void *)pkt->data;
5257 			missed = le32toh(resp->consec_missed_beacons);
5258 
5259 			IWM_DPRINTF(sc, IWM_DEBUG_BEACON | IWM_DEBUG_STATE,
5260 			    "%s: MISSED_BEACON: mac_id=%d, "
5261 			    "consec_since_last_rx=%d, consec=%d, num_expect=%d "
5262 			    "num_rx=%d\n",
5263 			    __func__,
5264 			    le32toh(resp->mac_id),
5265 			    le32toh(resp->consec_missed_beacons_since_last_rx),
5266 			    le32toh(resp->consec_missed_beacons),
5267 			    le32toh(resp->num_expected_beacons),
5268 			    le32toh(resp->num_recvd_beacons));
5269 
5270 			/* Be paranoid */
5271 			if (vap == NULL)
5272 				break;
5273 
5274 			/* XXX no net80211 locking? */
5275 			if (vap->iv_state == IEEE80211_S_RUN &&
5276 			    (ic->ic_flags & IEEE80211_F_SCAN) == 0) {
5277 				if (missed > vap->iv_bmissthreshold) {
5278 					/* XXX bad locking; turn into task */
5279 					IWM_UNLOCK(sc);
5280 					ieee80211_beacon_miss(ic);
5281 					IWM_LOCK(sc);
5282 				}
5283 			}
5284 
5285 			break;
5286 		}
5287 
5288 		case IWM_MFUART_LOAD_NOTIFICATION:
5289 			break;
5290 
5291 		case IWM_MVM_ALIVE:
5292 			break;
5293 
5294 		case IWM_CALIB_RES_NOTIF_PHY_DB:
5295 			break;
5296 
5297 		case IWM_STATISTICS_NOTIFICATION:
5298 			iwm_mvm_handle_rx_statistics(sc, pkt);
5299 			break;
5300 
5301 		case IWM_NVM_ACCESS_CMD:
5302 		case IWM_MCC_UPDATE_CMD:
5303 			if (sc->sc_wantresp == (((qid & ~0x80) << 16) | idx)) {
5304 				memcpy(sc->sc_cmd_resp,
5305 				    pkt, sizeof(sc->sc_cmd_resp));
5306 			}
5307 			break;
5308 
5309 		case IWM_MCC_CHUB_UPDATE_CMD: {
5310 			struct iwm_mcc_chub_notif *notif;
5311 			notif = (void *)pkt->data;
5312 
5313 			sc->sc_fw_mcc[0] = (notif->mcc & 0xff00) >> 8;
5314 			sc->sc_fw_mcc[1] = notif->mcc & 0xff;
5315 			sc->sc_fw_mcc[2] = '\0';
5316 			IWM_DPRINTF(sc, IWM_DEBUG_LAR,
5317 			    "fw source %d sent CC '%s'\n",
5318 			    notif->source_id, sc->sc_fw_mcc);
5319 			break;
5320 		}
5321 
5322 		case IWM_DTS_MEASUREMENT_NOTIFICATION:
5323 		case IWM_WIDE_ID(IWM_PHY_OPS_GROUP,
5324 				 IWM_DTS_MEASUREMENT_NOTIF_WIDE): {
5325 			struct iwm_dts_measurement_notif_v1 *notif;
5326 
5327 			if (iwm_rx_packet_payload_len(pkt) < sizeof(*notif)) {
5328 				device_printf(sc->sc_dev,
5329 				    "Invalid DTS_MEASUREMENT_NOTIFICATION\n");
5330 				break;
5331 			}
5332 			notif = (void *)pkt->data;
5333 			IWM_DPRINTF(sc, IWM_DEBUG_TEMP,
5334 			    "IWM_DTS_MEASUREMENT_NOTIFICATION - %d\n",
5335 			    notif->temp);
5336 			break;
5337 		}
5338 
5339 		case IWM_PHY_CONFIGURATION_CMD:
5340 		case IWM_TX_ANT_CONFIGURATION_CMD:
5341 		case IWM_ADD_STA:
5342 		case IWM_MAC_CONTEXT_CMD:
5343 		case IWM_REPLY_SF_CFG_CMD:
5344 		case IWM_POWER_TABLE_CMD:
5345 		case IWM_PHY_CONTEXT_CMD:
5346 		case IWM_BINDING_CONTEXT_CMD:
5347 		case IWM_TIME_EVENT_CMD:
5348 		case IWM_WIDE_ID(IWM_ALWAYS_LONG_GROUP, IWM_SCAN_CFG_CMD):
5349 		case IWM_WIDE_ID(IWM_ALWAYS_LONG_GROUP, IWM_SCAN_REQ_UMAC):
5350 		case IWM_WIDE_ID(IWM_ALWAYS_LONG_GROUP, IWM_SCAN_ABORT_UMAC):
5351 		case IWM_SCAN_OFFLOAD_REQUEST_CMD:
5352 		case IWM_SCAN_OFFLOAD_ABORT_CMD:
5353 		case IWM_REPLY_BEACON_FILTERING_CMD:
5354 		case IWM_MAC_PM_POWER_TABLE:
5355 		case IWM_TIME_QUOTA_CMD:
5356 		case IWM_REMOVE_STA:
5357 		case IWM_TXPATH_FLUSH:
5358 		case IWM_LQ_CMD:
5359 		case IWM_WIDE_ID(IWM_ALWAYS_LONG_GROUP,
5360 				 IWM_FW_PAGING_BLOCK_CMD):
5361 		case IWM_BT_CONFIG:
5362 		case IWM_REPLY_THERMAL_MNG_BACKOFF:
5363 			cresp = (void *)pkt->data;
5364 			if (sc->sc_wantresp == (((qid & ~0x80) << 16) | idx)) {
5365 				memcpy(sc->sc_cmd_resp,
5366 				    pkt, sizeof(*pkt)+sizeof(*cresp));
5367 			}
5368 			break;
5369 
5370 		/* ignore */
5371 		case IWM_PHY_DB_CMD:
5372 			break;
5373 
5374 		case IWM_INIT_COMPLETE_NOTIF:
5375 			break;
5376 
5377 		case IWM_SCAN_OFFLOAD_COMPLETE:
5378 			iwm_mvm_rx_lmac_scan_complete_notif(sc, pkt);
5379 			if (sc->sc_flags & IWM_FLAG_SCAN_RUNNING) {
5380 				sc->sc_flags &= ~IWM_FLAG_SCAN_RUNNING;
5381 				ieee80211_runtask(ic, &sc->sc_es_task);
5382 			}
5383 			break;
5384 
5385 		case IWM_SCAN_ITERATION_COMPLETE: {
5386 			struct iwm_lmac_scan_complete_notif *notif;
5387 			notif = (void *)pkt->data;
5388 			break;
5389 		}
5390 
5391 		case IWM_SCAN_COMPLETE_UMAC:
5392 			iwm_mvm_rx_umac_scan_complete_notif(sc, pkt);
5393 			if (sc->sc_flags & IWM_FLAG_SCAN_RUNNING) {
5394 				sc->sc_flags &= ~IWM_FLAG_SCAN_RUNNING;
5395 				ieee80211_runtask(ic, &sc->sc_es_task);
5396 			}
5397 			break;
5398 
5399 		case IWM_SCAN_ITERATION_COMPLETE_UMAC: {
5400 			struct iwm_umac_scan_iter_complete_notif *notif;
5401 			notif = (void *)pkt->data;
5402 
5403 			IWM_DPRINTF(sc, IWM_DEBUG_SCAN, "UMAC scan iteration "
5404 			    "complete, status=0x%x, %d channels scanned\n",
5405 			    notif->status, notif->scanned_channels);
5406 			break;
5407 		}
5408 
5409 		case IWM_REPLY_ERROR: {
5410 			struct iwm_error_resp *resp;
5411 			resp = (void *)pkt->data;
5412 
5413 			device_printf(sc->sc_dev,
5414 			    "firmware error 0x%x, cmd 0x%x\n",
5415 			    le32toh(resp->error_type),
5416 			    resp->cmd_id);
5417 			break;
5418 		}
5419 
5420 		case IWM_TIME_EVENT_NOTIFICATION: {
5421 			struct iwm_time_event_notif *notif;
5422 			notif = (void *)pkt->data;
5423 
5424 			IWM_DPRINTF(sc, IWM_DEBUG_INTR,
5425 			    "TE notif status = 0x%x action = 0x%x\n",
5426 			    notif->status, notif->action);
5427 			break;
5428 		}
5429 
5430 		/*
5431 		 * Firmware versions 21 and 22 generate some DEBUG_LOG_MSG
5432 		 * messages. Just ignore them for now.
5433 		 */
5434 		case IWM_DEBUG_LOG_MSG:
5435 			break;
5436 
5437 		case IWM_MCAST_FILTER_CMD:
5438 			break;
5439 
5440 		case IWM_SCD_QUEUE_CFG: {
5441 			struct iwm_scd_txq_cfg_rsp *rsp;
5442 			rsp = (void *)pkt->data;
5443 
5444 			IWM_DPRINTF(sc, IWM_DEBUG_CMD,
5445 			    "queue cfg token=0x%x sta_id=%d "
5446 			    "tid=%d scd_queue=%d\n",
5447 			    rsp->token, rsp->sta_id, rsp->tid,
5448 			    rsp->scd_queue);
5449 			break;
5450 		}
5451 
5452 		default:
5453 			device_printf(sc->sc_dev,
5454 			    "frame %d/%d %x UNHANDLED (this should "
5455 			    "not happen)\n", qid & ~0x80, idx,
5456 			    pkt->len_n_flags);
5457 			break;
5458 		}
5459 
5460 		/*
5461 		 * Why test bit 0x80?  The Linux driver:
5462 		 *
5463 		 * There is one exception:  uCode sets bit 15 when it
5464 		 * originates the response/notification, i.e. when the
5465 		 * response/notification is not a direct response to a
5466 		 * command sent by the driver.  For example, uCode issues
5467 		 * IWM_REPLY_RX when it sends a received frame to the driver;
5468 		 * it is not a direct response to any driver command.
5469 		 *
5470 		 * Ok, so since when is 7 == 15?  Well, the Linux driver
5471 		 * uses a slightly different format for pkt->hdr, and "qid"
5472 		 * is actually the upper byte of a two-byte field.
5473 		 */
5474 		if (!(qid & (1 << 7)))
5475 			iwm_cmd_done(sc, pkt);
5476 
5477 		offset = nextoff;
5478 	}
5479 	if (stolen)
5480 		m_freem(m);
5481 #undef HAVEROOM
5482 }
5483 
5484 /*
5485  * Process an IWM_CSR_INT_BIT_FH_RX or IWM_CSR_INT_BIT_SW_RX interrupt.
5486  * Basic structure from if_iwn
5487  */
5488 static void
5489 iwm_notif_intr(struct iwm_softc *sc)
5490 {
5491 	uint16_t hw;
5492 
5493 	bus_dmamap_sync(sc->rxq.stat_dma.tag, sc->rxq.stat_dma.map,
5494 	    BUS_DMASYNC_POSTREAD);
5495 
5496 	hw = le16toh(sc->rxq.stat->closed_rb_num) & 0xfff;
5497 
5498 	/*
5499 	 * Process responses
5500 	 */
5501 	while (sc->rxq.cur != hw) {
5502 		struct iwm_rx_ring *ring = &sc->rxq;
5503 		struct iwm_rx_data *data = &ring->data[ring->cur];
5504 
5505 		bus_dmamap_sync(ring->data_dmat, data->map,
5506 		    BUS_DMASYNC_POSTREAD);
5507 
5508 		IWM_DPRINTF(sc, IWM_DEBUG_INTR,
5509 		    "%s: hw = %d cur = %d\n", __func__, hw, ring->cur);
5510 		iwm_handle_rxb(sc, data->m);
5511 
5512 		ring->cur = (ring->cur + 1) % IWM_RX_RING_COUNT;
5513 	}
5514 
5515 	/*
5516 	 * Tell the firmware that it can reuse the ring entries that
5517 	 * we have just processed.
5518 	 * Seems like the hardware gets upset unless we align
5519 	 * the write by 8??
5520 	 */
5521 	hw = (hw == 0) ? IWM_RX_RING_COUNT - 1 : hw - 1;
5522 	IWM_WRITE(sc, IWM_FH_RSCSR_CHNL0_WPTR, rounddown2(hw, 8));
5523 }
5524 
5525 static void
5526 iwm_intr(void *arg)
5527 {
5528 	struct iwm_softc *sc = arg;
5529 	int handled = 0;
5530 	int r1, r2, rv = 0;
5531 	int isperiodic = 0;
5532 
5533 	IWM_LOCK(sc);
5534 	IWM_WRITE(sc, IWM_CSR_INT_MASK, 0);
5535 
5536 	if (sc->sc_flags & IWM_FLAG_USE_ICT) {
5537 		uint32_t *ict = sc->ict_dma.vaddr;
5538 		int tmp;
5539 
5540 		tmp = htole32(ict[sc->ict_cur]);
5541 		if (!tmp)
5542 			goto out_ena;
5543 
5544 		/*
5545 		 * ok, there was something.  keep plowing until we have all.
5546 		 */
5547 		r1 = r2 = 0;
5548 		while (tmp) {
5549 			r1 |= tmp;
5550 			ict[sc->ict_cur] = 0;
5551 			sc->ict_cur = (sc->ict_cur+1) % IWM_ICT_COUNT;
5552 			tmp = htole32(ict[sc->ict_cur]);
5553 		}
5554 
5555 		/* this is where the fun begins.  don't ask */
5556 		if (r1 == 0xffffffff)
5557 			r1 = 0;
5558 
5559 		/* i am not expected to understand this */
5560 		if (r1 & 0xc0000)
5561 			r1 |= 0x8000;
5562 		r1 = (0xff & r1) | ((0xff00 & r1) << 16);
5563 	} else {
5564 		r1 = IWM_READ(sc, IWM_CSR_INT);
5565 		/* "hardware gone" (where, fishing?) */
5566 		if (r1 == 0xffffffff || (r1 & 0xfffffff0) == 0xa5a5a5a0)
5567 			goto out;
5568 		r2 = IWM_READ(sc, IWM_CSR_FH_INT_STATUS);
5569 	}
5570 	if (r1 == 0 && r2 == 0) {
5571 		goto out_ena;
5572 	}
5573 
5574 	IWM_WRITE(sc, IWM_CSR_INT, r1 | ~sc->sc_intmask);
5575 
5576 	/* Safely ignore these bits for debug checks below */
5577 	r1 &= ~(IWM_CSR_INT_BIT_ALIVE | IWM_CSR_INT_BIT_SCD);
5578 
5579 	if (r1 & IWM_CSR_INT_BIT_SW_ERR) {
5580 		int i;
5581 		struct ieee80211com *ic = &sc->sc_ic;
5582 		struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps);
5583 
5584 #ifdef IWM_DEBUG
5585 		iwm_nic_error(sc);
5586 #endif
5587 		/* Dump driver status (TX and RX rings) while we're here. */
5588 		device_printf(sc->sc_dev, "driver status:\n");
5589 		for (i = 0; i < IWM_MVM_MAX_QUEUES; i++) {
5590 			struct iwm_tx_ring *ring = &sc->txq[i];
5591 			device_printf(sc->sc_dev,
5592 			    "  tx ring %2d: qid=%-2d cur=%-3d "
5593 			    "queued=%-3d\n",
5594 			    i, ring->qid, ring->cur, ring->queued);
5595 		}
5596 		device_printf(sc->sc_dev,
5597 		    "  rx ring: cur=%d\n", sc->rxq.cur);
5598 		device_printf(sc->sc_dev,
5599 		    "  802.11 state %d\n", (vap == NULL) ? -1 : vap->iv_state);
5600 
5601 		/* Don't stop the device; just do a VAP restart */
5602 		IWM_UNLOCK(sc);
5603 
5604 		if (vap == NULL) {
5605 			printf("%s: null vap\n", __func__);
5606 			return;
5607 		}
5608 
5609 		device_printf(sc->sc_dev, "%s: controller panicked, iv_state = %d; "
5610 		    "restarting\n", __func__, vap->iv_state);
5611 
5612 		ieee80211_restart_all(ic);
5613 		return;
5614 	}
5615 
5616 	if (r1 & IWM_CSR_INT_BIT_HW_ERR) {
5617 		handled |= IWM_CSR_INT_BIT_HW_ERR;
5618 		device_printf(sc->sc_dev, "hardware error, stopping device\n");
5619 		iwm_stop(sc);
5620 		rv = 1;
5621 		goto out;
5622 	}
5623 
5624 	/* firmware chunk loaded */
5625 	if (r1 & IWM_CSR_INT_BIT_FH_TX) {
5626 		IWM_WRITE(sc, IWM_CSR_FH_INT_STATUS, IWM_CSR_FH_INT_TX_MASK);
5627 		handled |= IWM_CSR_INT_BIT_FH_TX;
5628 		sc->sc_fw_chunk_done = 1;
5629 		wakeup(&sc->sc_fw);
5630 	}
5631 
5632 	if (r1 & IWM_CSR_INT_BIT_RF_KILL) {
5633 		handled |= IWM_CSR_INT_BIT_RF_KILL;
5634 		if (iwm_check_rfkill(sc)) {
5635 			device_printf(sc->sc_dev,
5636 			    "%s: rfkill switch, disabling interface\n",
5637 			    __func__);
5638 			iwm_stop(sc);
5639 		}
5640 	}
5641 
5642 	/*
5643 	 * The Linux driver uses periodic interrupts to avoid races.
5644 	 * We cargo-cult like it's going out of fashion.
5645 	 */
5646 	if (r1 & IWM_CSR_INT_BIT_RX_PERIODIC) {
5647 		handled |= IWM_CSR_INT_BIT_RX_PERIODIC;
5648 		IWM_WRITE(sc, IWM_CSR_INT, IWM_CSR_INT_BIT_RX_PERIODIC);
5649 		if ((r1 & (IWM_CSR_INT_BIT_FH_RX | IWM_CSR_INT_BIT_SW_RX)) == 0)
5650 			IWM_WRITE_1(sc,
5651 			    IWM_CSR_INT_PERIODIC_REG, IWM_CSR_INT_PERIODIC_DIS);
5652 		isperiodic = 1;
5653 	}
5654 
5655 	if ((r1 & (IWM_CSR_INT_BIT_FH_RX | IWM_CSR_INT_BIT_SW_RX)) || isperiodic) {
5656 		handled |= (IWM_CSR_INT_BIT_FH_RX | IWM_CSR_INT_BIT_SW_RX);
5657 		IWM_WRITE(sc, IWM_CSR_FH_INT_STATUS, IWM_CSR_FH_INT_RX_MASK);
5658 
5659 		iwm_notif_intr(sc);
5660 
5661 		/* enable periodic interrupt, see above */
5662 		if (r1 & (IWM_CSR_INT_BIT_FH_RX | IWM_CSR_INT_BIT_SW_RX) && !isperiodic)
5663 			IWM_WRITE_1(sc, IWM_CSR_INT_PERIODIC_REG,
5664 			    IWM_CSR_INT_PERIODIC_ENA);
5665 	}
5666 
5667 	if (__predict_false(r1 & ~handled))
5668 		IWM_DPRINTF(sc, IWM_DEBUG_INTR,
5669 		    "%s: unhandled interrupts: %x\n", __func__, r1);
5670 	rv = 1;
5671 
5672  out_ena:
5673 	iwm_restore_interrupts(sc);
5674  out:
5675 	IWM_UNLOCK(sc);
5676 	return;
5677 }
5678 
5679 /*
5680  * Autoconf glue-sniffing
5681  */
5682 #define	PCI_VENDOR_INTEL		0x8086
5683 #define	PCI_PRODUCT_INTEL_WL_3160_1	0x08b3
5684 #define	PCI_PRODUCT_INTEL_WL_3160_2	0x08b4
5685 #define	PCI_PRODUCT_INTEL_WL_3165_1	0x3165
5686 #define	PCI_PRODUCT_INTEL_WL_3165_2	0x3166
5687 #define	PCI_PRODUCT_INTEL_WL_3168_1	0x24fb
5688 #define	PCI_PRODUCT_INTEL_WL_7260_1	0x08b1
5689 #define	PCI_PRODUCT_INTEL_WL_7260_2	0x08b2
5690 #define	PCI_PRODUCT_INTEL_WL_7265_1	0x095a
5691 #define	PCI_PRODUCT_INTEL_WL_7265_2	0x095b
5692 #define	PCI_PRODUCT_INTEL_WL_8260_1	0x24f3
5693 #define	PCI_PRODUCT_INTEL_WL_8260_2	0x24f4
5694 #define	PCI_PRODUCT_INTEL_WL_8265_1	0x24fd
5695 
5696 static const struct iwm_devices {
5697 	uint16_t		device;
5698 	const struct iwm_cfg	*cfg;
5699 } iwm_devices[] = {
5700 	{ PCI_PRODUCT_INTEL_WL_3160_1, &iwm3160_cfg },
5701 	{ PCI_PRODUCT_INTEL_WL_3160_2, &iwm3160_cfg },
5702 	{ PCI_PRODUCT_INTEL_WL_3165_1, &iwm3165_cfg },
5703 	{ PCI_PRODUCT_INTEL_WL_3165_2, &iwm3165_cfg },
5704 	{ PCI_PRODUCT_INTEL_WL_3168_1, &iwm3168_cfg },
5705 	{ PCI_PRODUCT_INTEL_WL_7260_1, &iwm7260_cfg },
5706 	{ PCI_PRODUCT_INTEL_WL_7260_2, &iwm7260_cfg },
5707 	{ PCI_PRODUCT_INTEL_WL_7265_1, &iwm7265_cfg },
5708 	{ PCI_PRODUCT_INTEL_WL_7265_2, &iwm7265_cfg },
5709 	{ PCI_PRODUCT_INTEL_WL_8260_1, &iwm8260_cfg },
5710 	{ PCI_PRODUCT_INTEL_WL_8260_2, &iwm8260_cfg },
5711 	{ PCI_PRODUCT_INTEL_WL_8265_1, &iwm8265_cfg },
5712 };
5713 
5714 static int
5715 iwm_probe(device_t dev)
5716 {
5717 	int i;
5718 
5719 	for (i = 0; i < nitems(iwm_devices); i++) {
5720 		if (pci_get_vendor(dev) == PCI_VENDOR_INTEL &&
5721 		    pci_get_device(dev) == iwm_devices[i].device) {
5722 			device_set_desc(dev, iwm_devices[i].cfg->name);
5723 			return (BUS_PROBE_DEFAULT);
5724 		}
5725 	}
5726 
5727 	return (ENXIO);
5728 }
5729 
5730 static int
5731 iwm_dev_check(device_t dev)
5732 {
5733 	struct iwm_softc *sc;
5734 	uint16_t devid;
5735 	int i;
5736 
5737 	sc = device_get_softc(dev);
5738 
5739 	devid = pci_get_device(dev);
5740 	for (i = 0; i < nitems(iwm_devices); i++) {
5741 		if (iwm_devices[i].device == devid) {
5742 			sc->cfg = iwm_devices[i].cfg;
5743 			return (0);
5744 		}
5745 	}
5746 	device_printf(dev, "unknown adapter type\n");
5747 	return ENXIO;
5748 }
5749 
5750 /* PCI registers */
5751 #define PCI_CFG_RETRY_TIMEOUT	0x041
5752 
5753 static int
5754 iwm_pci_attach(device_t dev)
5755 {
5756 	struct iwm_softc *sc;
5757 	int count, error, rid;
5758 	uint16_t reg;
5759 
5760 	sc = device_get_softc(dev);
5761 
5762 	/* We disable the RETRY_TIMEOUT register (0x41) to keep
5763 	 * PCI Tx retries from interfering with C3 CPU state */
5764 	pci_write_config(dev, PCI_CFG_RETRY_TIMEOUT, 0x00, 1);
5765 
5766 	/* Enable bus-mastering and hardware bug workaround. */
5767 	pci_enable_busmaster(dev);
5768 	reg = pci_read_config(dev, PCIR_STATUS, sizeof(reg));
5769 	/* if !MSI */
5770 	if (reg & PCIM_STATUS_INTxSTATE) {
5771 		reg &= ~PCIM_STATUS_INTxSTATE;
5772 	}
5773 	pci_write_config(dev, PCIR_STATUS, reg, sizeof(reg));
5774 
5775 	rid = PCIR_BAR(0);
5776 	sc->sc_mem = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid,
5777 	    RF_ACTIVE);
5778 	if (sc->sc_mem == NULL) {
5779 		device_printf(sc->sc_dev, "can't map mem space\n");
5780 		return (ENXIO);
5781 	}
5782 	sc->sc_st = rman_get_bustag(sc->sc_mem);
5783 	sc->sc_sh = rman_get_bushandle(sc->sc_mem);
5784 
5785 	/* Install interrupt handler. */
5786 	count = 1;
5787 	rid = 0;
5788 	if (pci_alloc_msi(dev, &count) == 0)
5789 		rid = 1;
5790 	sc->sc_irq = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid, RF_ACTIVE |
5791 	    (rid != 0 ? 0 : RF_SHAREABLE));
5792 	if (sc->sc_irq == NULL) {
5793 		device_printf(dev, "can't map interrupt\n");
5794 			return (ENXIO);
5795 	}
5796 	error = bus_setup_intr(dev, sc->sc_irq, INTR_TYPE_NET | INTR_MPSAFE,
5797 	    NULL, iwm_intr, sc, &sc->sc_ih);
5798 	if (sc->sc_ih == NULL) {
5799 		device_printf(dev, "can't establish interrupt");
5800 			return (ENXIO);
5801 	}
5802 	sc->sc_dmat = bus_get_dma_tag(sc->sc_dev);
5803 
5804 	return (0);
5805 }
5806 
5807 static void
5808 iwm_pci_detach(device_t dev)
5809 {
5810 	struct iwm_softc *sc = device_get_softc(dev);
5811 
5812 	if (sc->sc_irq != NULL) {
5813 		bus_teardown_intr(dev, sc->sc_irq, sc->sc_ih);
5814 		bus_release_resource(dev, SYS_RES_IRQ,
5815 		    rman_get_rid(sc->sc_irq), sc->sc_irq);
5816 		pci_release_msi(dev);
5817         }
5818 	if (sc->sc_mem != NULL)
5819 		bus_release_resource(dev, SYS_RES_MEMORY,
5820 		    rman_get_rid(sc->sc_mem), sc->sc_mem);
5821 }
5822 
5823 
5824 
5825 static int
5826 iwm_attach(device_t dev)
5827 {
5828 	struct iwm_softc *sc = device_get_softc(dev);
5829 	struct ieee80211com *ic = &sc->sc_ic;
5830 	int error;
5831 	int txq_i, i;
5832 
5833 	sc->sc_dev = dev;
5834 	sc->sc_attached = 1;
5835 	IWM_LOCK_INIT(sc);
5836 	mbufq_init(&sc->sc_snd, ifqmaxlen);
5837 	callout_init_mtx(&sc->sc_watchdog_to, &sc->sc_mtx, 0);
5838 	callout_init_mtx(&sc->sc_led_blink_to, &sc->sc_mtx, 0);
5839 	TASK_INIT(&sc->sc_es_task, 0, iwm_endscan_cb, sc);
5840 
5841 	sc->sc_notif_wait = iwm_notification_wait_init(sc);
5842 	if (sc->sc_notif_wait == NULL) {
5843 		device_printf(dev, "failed to init notification wait struct\n");
5844 		goto fail;
5845 	}
5846 
5847 	sc->sf_state = IWM_SF_UNINIT;
5848 
5849 	/* Init phy db */
5850 	sc->sc_phy_db = iwm_phy_db_init(sc);
5851 	if (!sc->sc_phy_db) {
5852 		device_printf(dev, "Cannot init phy_db\n");
5853 		goto fail;
5854 	}
5855 
5856 	/* Set EBS as successful as long as not stated otherwise by the FW. */
5857 	sc->last_ebs_successful = TRUE;
5858 
5859 	/* PCI attach */
5860 	error = iwm_pci_attach(dev);
5861 	if (error != 0)
5862 		goto fail;
5863 
5864 	sc->sc_wantresp = -1;
5865 
5866 	/* Check device type */
5867 	error = iwm_dev_check(dev);
5868 	if (error != 0)
5869 		goto fail;
5870 
5871 	sc->sc_hw_rev = IWM_READ(sc, IWM_CSR_HW_REV);
5872 	/*
5873 	 * In the 8000 HW family the format of the 4 bytes of CSR_HW_REV have
5874 	 * changed, and now the revision step also includes bit 0-1 (no more
5875 	 * "dash" value). To keep hw_rev backwards compatible - we'll store it
5876 	 * in the old format.
5877 	 */
5878 	if (sc->cfg->device_family == IWM_DEVICE_FAMILY_8000)
5879 		sc->sc_hw_rev = (sc->sc_hw_rev & 0xfff0) |
5880 				(IWM_CSR_HW_REV_STEP(sc->sc_hw_rev << 2) << 2);
5881 
5882 	if (iwm_prepare_card_hw(sc) != 0) {
5883 		device_printf(dev, "could not initialize hardware\n");
5884 		goto fail;
5885 	}
5886 
5887 	if (sc->cfg->device_family == IWM_DEVICE_FAMILY_8000) {
5888 		int ret;
5889 		uint32_t hw_step;
5890 
5891 		/*
5892 		 * In order to recognize C step the driver should read the
5893 		 * chip version id located at the AUX bus MISC address.
5894 		 */
5895 		IWM_SETBITS(sc, IWM_CSR_GP_CNTRL,
5896 			    IWM_CSR_GP_CNTRL_REG_FLAG_INIT_DONE);
5897 		DELAY(2);
5898 
5899 		ret = iwm_poll_bit(sc, IWM_CSR_GP_CNTRL,
5900 				   IWM_CSR_GP_CNTRL_REG_FLAG_MAC_CLOCK_READY,
5901 				   IWM_CSR_GP_CNTRL_REG_FLAG_MAC_CLOCK_READY,
5902 				   25000);
5903 		if (!ret) {
5904 			device_printf(sc->sc_dev,
5905 			    "Failed to wake up the nic\n");
5906 			goto fail;
5907 		}
5908 
5909 		if (iwm_nic_lock(sc)) {
5910 			hw_step = iwm_read_prph(sc, IWM_WFPM_CTRL_REG);
5911 			hw_step |= IWM_ENABLE_WFPM;
5912 			iwm_write_prph(sc, IWM_WFPM_CTRL_REG, hw_step);
5913 			hw_step = iwm_read_prph(sc, IWM_AUX_MISC_REG);
5914 			hw_step = (hw_step >> IWM_HW_STEP_LOCATION_BITS) & 0xF;
5915 			if (hw_step == 0x3)
5916 				sc->sc_hw_rev = (sc->sc_hw_rev & 0xFFFFFFF3) |
5917 						(IWM_SILICON_C_STEP << 2);
5918 			iwm_nic_unlock(sc);
5919 		} else {
5920 			device_printf(sc->sc_dev, "Failed to lock the nic\n");
5921 			goto fail;
5922 		}
5923 	}
5924 
5925 	/* special-case 7265D, it has the same PCI IDs. */
5926 	if (sc->cfg == &iwm7265_cfg &&
5927 	    (sc->sc_hw_rev & IWM_CSR_HW_REV_TYPE_MSK) == IWM_CSR_HW_REV_TYPE_7265D) {
5928 		sc->cfg = &iwm7265d_cfg;
5929 	}
5930 
5931 	/* Allocate DMA memory for firmware transfers. */
5932 	if ((error = iwm_alloc_fwmem(sc)) != 0) {
5933 		device_printf(dev, "could not allocate memory for firmware\n");
5934 		goto fail;
5935 	}
5936 
5937 	/* Allocate "Keep Warm" page. */
5938 	if ((error = iwm_alloc_kw(sc)) != 0) {
5939 		device_printf(dev, "could not allocate keep warm page\n");
5940 		goto fail;
5941 	}
5942 
5943 	/* We use ICT interrupts */
5944 	if ((error = iwm_alloc_ict(sc)) != 0) {
5945 		device_printf(dev, "could not allocate ICT table\n");
5946 		goto fail;
5947 	}
5948 
5949 	/* Allocate TX scheduler "rings". */
5950 	if ((error = iwm_alloc_sched(sc)) != 0) {
5951 		device_printf(dev, "could not allocate TX scheduler rings\n");
5952 		goto fail;
5953 	}
5954 
5955 	/* Allocate TX rings */
5956 	for (txq_i = 0; txq_i < nitems(sc->txq); txq_i++) {
5957 		if ((error = iwm_alloc_tx_ring(sc,
5958 		    &sc->txq[txq_i], txq_i)) != 0) {
5959 			device_printf(dev,
5960 			    "could not allocate TX ring %d\n",
5961 			    txq_i);
5962 			goto fail;
5963 		}
5964 	}
5965 
5966 	/* Allocate RX ring. */
5967 	if ((error = iwm_alloc_rx_ring(sc, &sc->rxq)) != 0) {
5968 		device_printf(dev, "could not allocate RX ring\n");
5969 		goto fail;
5970 	}
5971 
5972 	/* Clear pending interrupts. */
5973 	IWM_WRITE(sc, IWM_CSR_INT, 0xffffffff);
5974 
5975 	ic->ic_softc = sc;
5976 	ic->ic_name = device_get_nameunit(sc->sc_dev);
5977 	ic->ic_phytype = IEEE80211_T_OFDM;	/* not only, but not used */
5978 	ic->ic_opmode = IEEE80211_M_STA;	/* default to BSS mode */
5979 
5980 	/* Set device capabilities. */
5981 	ic->ic_caps =
5982 	    IEEE80211_C_STA |
5983 	    IEEE80211_C_WPA |		/* WPA/RSN */
5984 	    IEEE80211_C_WME |
5985 	    IEEE80211_C_PMGT |
5986 	    IEEE80211_C_SHSLOT |	/* short slot time supported */
5987 	    IEEE80211_C_SHPREAMBLE	/* short preamble supported */
5988 //	    IEEE80211_C_BGSCAN		/* capable of bg scanning */
5989 	    ;
5990 	/* Advertise full-offload scanning */
5991 	ic->ic_flags_ext = IEEE80211_FEXT_SCAN_OFFLOAD;
5992 	for (i = 0; i < nitems(sc->sc_phyctxt); i++) {
5993 		sc->sc_phyctxt[i].id = i;
5994 		sc->sc_phyctxt[i].color = 0;
5995 		sc->sc_phyctxt[i].ref = 0;
5996 		sc->sc_phyctxt[i].channel = NULL;
5997 	}
5998 
5999 	/* Default noise floor */
6000 	sc->sc_noise = -96;
6001 
6002 	/* Max RSSI */
6003 	sc->sc_max_rssi = IWM_MAX_DBM - IWM_MIN_DBM;
6004 
6005 	sc->sc_preinit_hook.ich_func = iwm_preinit;
6006 	sc->sc_preinit_hook.ich_arg = sc;
6007 	if (config_intrhook_establish(&sc->sc_preinit_hook) != 0) {
6008 		device_printf(dev, "config_intrhook_establish failed\n");
6009 		goto fail;
6010 	}
6011 
6012 #ifdef IWM_DEBUG
6013 	SYSCTL_ADD_INT(device_get_sysctl_ctx(dev),
6014 	    SYSCTL_CHILDREN(device_get_sysctl_tree(dev)), OID_AUTO, "debug",
6015 	    CTLFLAG_RW, &sc->sc_debug, 0, "control debugging");
6016 #endif
6017 
6018 	IWM_DPRINTF(sc, IWM_DEBUG_RESET | IWM_DEBUG_TRACE,
6019 	    "<-%s\n", __func__);
6020 
6021 	return 0;
6022 
6023 	/* Free allocated memory if something failed during attachment. */
6024 fail:
6025 	iwm_detach_local(sc, 0);
6026 
6027 	return ENXIO;
6028 }
6029 
6030 static int
6031 iwm_is_valid_ether_addr(uint8_t *addr)
6032 {
6033 	char zero_addr[IEEE80211_ADDR_LEN] = { 0, 0, 0, 0, 0, 0 };
6034 
6035 	if ((addr[0] & 1) || IEEE80211_ADDR_EQ(zero_addr, addr))
6036 		return (FALSE);
6037 
6038 	return (TRUE);
6039 }
6040 
6041 static int
6042 iwm_wme_update(struct ieee80211com *ic)
6043 {
6044 #define IWM_EXP2(x)	((1 << (x)) - 1)	/* CWmin = 2^ECWmin - 1 */
6045 	struct iwm_softc *sc = ic->ic_softc;
6046 	struct chanAccParams chp;
6047 	struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps);
6048 	struct iwm_vap *ivp = IWM_VAP(vap);
6049 	struct iwm_node *in;
6050 	struct wmeParams tmp[WME_NUM_AC];
6051 	int aci, error;
6052 
6053 	if (vap == NULL)
6054 		return (0);
6055 
6056 	ieee80211_wme_ic_getparams(ic, &chp);
6057 
6058 	IEEE80211_LOCK(ic);
6059 	for (aci = 0; aci < WME_NUM_AC; aci++)
6060 		tmp[aci] = chp.cap_wmeParams[aci];
6061 	IEEE80211_UNLOCK(ic);
6062 
6063 	IWM_LOCK(sc);
6064 	for (aci = 0; aci < WME_NUM_AC; aci++) {
6065 		const struct wmeParams *ac = &tmp[aci];
6066 		ivp->queue_params[aci].aifsn = ac->wmep_aifsn;
6067 		ivp->queue_params[aci].cw_min = IWM_EXP2(ac->wmep_logcwmin);
6068 		ivp->queue_params[aci].cw_max = IWM_EXP2(ac->wmep_logcwmax);
6069 		ivp->queue_params[aci].edca_txop =
6070 		    IEEE80211_TXOP_TO_US(ac->wmep_txopLimit);
6071 	}
6072 	ivp->have_wme = TRUE;
6073 	if (ivp->is_uploaded && vap->iv_bss != NULL) {
6074 		in = IWM_NODE(vap->iv_bss);
6075 		if (in->in_assoc) {
6076 			if ((error = iwm_mvm_mac_ctxt_changed(sc, vap)) != 0) {
6077 				device_printf(sc->sc_dev,
6078 				    "%s: failed to update MAC\n", __func__);
6079 			}
6080 		}
6081 	}
6082 	IWM_UNLOCK(sc);
6083 
6084 	return (0);
6085 #undef IWM_EXP2
6086 }
6087 
6088 static void
6089 iwm_preinit(void *arg)
6090 {
6091 	struct iwm_softc *sc = arg;
6092 	device_t dev = sc->sc_dev;
6093 	struct ieee80211com *ic = &sc->sc_ic;
6094 	int error;
6095 
6096 	IWM_DPRINTF(sc, IWM_DEBUG_RESET | IWM_DEBUG_TRACE,
6097 	    "->%s\n", __func__);
6098 
6099 	IWM_LOCK(sc);
6100 	if ((error = iwm_start_hw(sc)) != 0) {
6101 		device_printf(dev, "could not initialize hardware\n");
6102 		IWM_UNLOCK(sc);
6103 		goto fail;
6104 	}
6105 
6106 	error = iwm_run_init_mvm_ucode(sc, 1);
6107 	iwm_stop_device(sc);
6108 	if (error) {
6109 		IWM_UNLOCK(sc);
6110 		goto fail;
6111 	}
6112 	device_printf(dev,
6113 	    "hw rev 0x%x, fw ver %s, address %s\n",
6114 	    sc->sc_hw_rev & IWM_CSR_HW_REV_TYPE_MSK,
6115 	    sc->sc_fwver, ether_sprintf(sc->nvm_data->hw_addr));
6116 
6117 	/* not all hardware can do 5GHz band */
6118 	if (!sc->nvm_data->sku_cap_band_52GHz_enable)
6119 		memset(&ic->ic_sup_rates[IEEE80211_MODE_11A], 0,
6120 		    sizeof(ic->ic_sup_rates[IEEE80211_MODE_11A]));
6121 	IWM_UNLOCK(sc);
6122 
6123 	iwm_init_channel_map(ic, IEEE80211_CHAN_MAX, &ic->ic_nchans,
6124 	    ic->ic_channels);
6125 
6126 	/*
6127 	 * At this point we've committed - if we fail to do setup,
6128 	 * we now also have to tear down the net80211 state.
6129 	 */
6130 	ieee80211_ifattach(ic);
6131 	ic->ic_vap_create = iwm_vap_create;
6132 	ic->ic_vap_delete = iwm_vap_delete;
6133 	ic->ic_raw_xmit = iwm_raw_xmit;
6134 	ic->ic_node_alloc = iwm_node_alloc;
6135 	ic->ic_scan_start = iwm_scan_start;
6136 	ic->ic_scan_end = iwm_scan_end;
6137 	ic->ic_update_mcast = iwm_update_mcast;
6138 	ic->ic_getradiocaps = iwm_init_channel_map;
6139 	ic->ic_set_channel = iwm_set_channel;
6140 	ic->ic_scan_curchan = iwm_scan_curchan;
6141 	ic->ic_scan_mindwell = iwm_scan_mindwell;
6142 	ic->ic_wme.wme_update = iwm_wme_update;
6143 	ic->ic_parent = iwm_parent;
6144 	ic->ic_transmit = iwm_transmit;
6145 	iwm_radiotap_attach(sc);
6146 	if (bootverbose)
6147 		ieee80211_announce(ic);
6148 
6149 	IWM_DPRINTF(sc, IWM_DEBUG_RESET | IWM_DEBUG_TRACE,
6150 	    "<-%s\n", __func__);
6151 	config_intrhook_disestablish(&sc->sc_preinit_hook);
6152 
6153 	return;
6154 fail:
6155 	config_intrhook_disestablish(&sc->sc_preinit_hook);
6156 	iwm_detach_local(sc, 0);
6157 }
6158 
6159 /*
6160  * Attach the interface to 802.11 radiotap.
6161  */
6162 static void
6163 iwm_radiotap_attach(struct iwm_softc *sc)
6164 {
6165         struct ieee80211com *ic = &sc->sc_ic;
6166 
6167 	IWM_DPRINTF(sc, IWM_DEBUG_RESET | IWM_DEBUG_TRACE,
6168 	    "->%s begin\n", __func__);
6169         ieee80211_radiotap_attach(ic,
6170             &sc->sc_txtap.wt_ihdr, sizeof(sc->sc_txtap),
6171                 IWM_TX_RADIOTAP_PRESENT,
6172             &sc->sc_rxtap.wr_ihdr, sizeof(sc->sc_rxtap),
6173                 IWM_RX_RADIOTAP_PRESENT);
6174 	IWM_DPRINTF(sc, IWM_DEBUG_RESET | IWM_DEBUG_TRACE,
6175 	    "->%s end\n", __func__);
6176 }
6177 
6178 static struct ieee80211vap *
6179 iwm_vap_create(struct ieee80211com *ic, const char name[IFNAMSIZ], int unit,
6180     enum ieee80211_opmode opmode, int flags,
6181     const uint8_t bssid[IEEE80211_ADDR_LEN],
6182     const uint8_t mac[IEEE80211_ADDR_LEN])
6183 {
6184 	struct iwm_vap *ivp;
6185 	struct ieee80211vap *vap;
6186 
6187 	if (!TAILQ_EMPTY(&ic->ic_vaps))         /* only one at a time */
6188 		return NULL;
6189 	ivp = malloc(sizeof(struct iwm_vap), M_80211_VAP, M_WAITOK | M_ZERO);
6190 	vap = &ivp->iv_vap;
6191 	ieee80211_vap_setup(ic, vap, name, unit, opmode, flags, bssid);
6192 	vap->iv_bmissthreshold = 10;            /* override default */
6193 	/* Override with driver methods. */
6194 	ivp->iv_newstate = vap->iv_newstate;
6195 	vap->iv_newstate = iwm_newstate;
6196 
6197 	ivp->id = IWM_DEFAULT_MACID;
6198 	ivp->color = IWM_DEFAULT_COLOR;
6199 
6200 	ivp->have_wme = FALSE;
6201 	ivp->ps_disabled = FALSE;
6202 
6203 	ieee80211_ratectl_init(vap);
6204 	/* Complete setup. */
6205 	ieee80211_vap_attach(vap, iwm_media_change, ieee80211_media_status,
6206 	    mac);
6207 	ic->ic_opmode = opmode;
6208 
6209 	return vap;
6210 }
6211 
6212 static void
6213 iwm_vap_delete(struct ieee80211vap *vap)
6214 {
6215 	struct iwm_vap *ivp = IWM_VAP(vap);
6216 
6217 	ieee80211_ratectl_deinit(vap);
6218 	ieee80211_vap_detach(vap);
6219 	free(ivp, M_80211_VAP);
6220 }
6221 
6222 static void
6223 iwm_xmit_queue_drain(struct iwm_softc *sc)
6224 {
6225 	struct mbuf *m;
6226 	struct ieee80211_node *ni;
6227 
6228 	while ((m = mbufq_dequeue(&sc->sc_snd)) != NULL) {
6229 		ni = (struct ieee80211_node *)m->m_pkthdr.rcvif;
6230 		ieee80211_free_node(ni);
6231 		m_freem(m);
6232 	}
6233 }
6234 
6235 static void
6236 iwm_scan_start(struct ieee80211com *ic)
6237 {
6238 	struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps);
6239 	struct iwm_softc *sc = ic->ic_softc;
6240 	int error;
6241 
6242 	IWM_LOCK(sc);
6243 	if (sc->sc_flags & IWM_FLAG_SCAN_RUNNING) {
6244 		/* This should not be possible */
6245 		device_printf(sc->sc_dev,
6246 		    "%s: Previous scan not completed yet\n", __func__);
6247 	}
6248 	if (fw_has_capa(&sc->ucode_capa, IWM_UCODE_TLV_CAPA_UMAC_SCAN))
6249 		error = iwm_mvm_umac_scan(sc);
6250 	else
6251 		error = iwm_mvm_lmac_scan(sc);
6252 	if (error != 0) {
6253 		device_printf(sc->sc_dev, "could not initiate scan\n");
6254 		IWM_UNLOCK(sc);
6255 		ieee80211_cancel_scan(vap);
6256 	} else {
6257 		sc->sc_flags |= IWM_FLAG_SCAN_RUNNING;
6258 		iwm_led_blink_start(sc);
6259 		IWM_UNLOCK(sc);
6260 	}
6261 }
6262 
6263 static void
6264 iwm_scan_end(struct ieee80211com *ic)
6265 {
6266 	struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps);
6267 	struct iwm_softc *sc = ic->ic_softc;
6268 
6269 	IWM_LOCK(sc);
6270 	iwm_led_blink_stop(sc);
6271 	if (vap->iv_state == IEEE80211_S_RUN)
6272 		iwm_mvm_led_enable(sc);
6273 	if (sc->sc_flags & IWM_FLAG_SCAN_RUNNING) {
6274 		/*
6275 		 * Removing IWM_FLAG_SCAN_RUNNING now, is fine because
6276 		 * both iwm_scan_end and iwm_scan_start run in the ic->ic_tq
6277 		 * taskqueue.
6278 		 */
6279 		sc->sc_flags &= ~IWM_FLAG_SCAN_RUNNING;
6280 		iwm_mvm_scan_stop_wait(sc);
6281 	}
6282 	IWM_UNLOCK(sc);
6283 
6284 	/*
6285 	 * Make sure we don't race, if sc_es_task is still enqueued here.
6286 	 * This is to make sure that it won't call ieee80211_scan_done
6287 	 * when we have already started the next scan.
6288 	 */
6289 	taskqueue_cancel(ic->ic_tq, &sc->sc_es_task, NULL);
6290 }
6291 
6292 static void
6293 iwm_update_mcast(struct ieee80211com *ic)
6294 {
6295 }
6296 
6297 static void
6298 iwm_set_channel(struct ieee80211com *ic)
6299 {
6300 }
6301 
6302 static void
6303 iwm_scan_curchan(struct ieee80211_scan_state *ss, unsigned long maxdwell)
6304 {
6305 }
6306 
6307 static void
6308 iwm_scan_mindwell(struct ieee80211_scan_state *ss)
6309 {
6310 	return;
6311 }
6312 
6313 void
6314 iwm_init_task(void *arg1)
6315 {
6316 	struct iwm_softc *sc = arg1;
6317 
6318 	IWM_LOCK(sc);
6319 	while (sc->sc_flags & IWM_FLAG_BUSY)
6320 		msleep(&sc->sc_flags, &sc->sc_mtx, 0, "iwmpwr", 0);
6321 	sc->sc_flags |= IWM_FLAG_BUSY;
6322 	iwm_stop(sc);
6323 	if (sc->sc_ic.ic_nrunning > 0)
6324 		iwm_init(sc);
6325 	sc->sc_flags &= ~IWM_FLAG_BUSY;
6326 	wakeup(&sc->sc_flags);
6327 	IWM_UNLOCK(sc);
6328 }
6329 
6330 static int
6331 iwm_resume(device_t dev)
6332 {
6333 	struct iwm_softc *sc = device_get_softc(dev);
6334 	int do_reinit = 0;
6335 
6336 	/*
6337 	 * We disable the RETRY_TIMEOUT register (0x41) to keep
6338 	 * PCI Tx retries from interfering with C3 CPU state.
6339 	 */
6340 	pci_write_config(dev, PCI_CFG_RETRY_TIMEOUT, 0x00, 1);
6341 	iwm_init_task(device_get_softc(dev));
6342 
6343 	IWM_LOCK(sc);
6344 	if (sc->sc_flags & IWM_FLAG_SCANNING) {
6345 		sc->sc_flags &= ~IWM_FLAG_SCANNING;
6346 		do_reinit = 1;
6347 	}
6348 	IWM_UNLOCK(sc);
6349 
6350 	if (do_reinit)
6351 		ieee80211_resume_all(&sc->sc_ic);
6352 
6353 	return 0;
6354 }
6355 
6356 static int
6357 iwm_suspend(device_t dev)
6358 {
6359 	int do_stop = 0;
6360 	struct iwm_softc *sc = device_get_softc(dev);
6361 
6362 	do_stop = !! (sc->sc_ic.ic_nrunning > 0);
6363 
6364 	ieee80211_suspend_all(&sc->sc_ic);
6365 
6366 	if (do_stop) {
6367 		IWM_LOCK(sc);
6368 		iwm_stop(sc);
6369 		sc->sc_flags |= IWM_FLAG_SCANNING;
6370 		IWM_UNLOCK(sc);
6371 	}
6372 
6373 	return (0);
6374 }
6375 
6376 static int
6377 iwm_detach_local(struct iwm_softc *sc, int do_net80211)
6378 {
6379 	struct iwm_fw_info *fw = &sc->sc_fw;
6380 	device_t dev = sc->sc_dev;
6381 	int i;
6382 
6383 	if (!sc->sc_attached)
6384 		return 0;
6385 	sc->sc_attached = 0;
6386 
6387 	if (do_net80211)
6388 		ieee80211_draintask(&sc->sc_ic, &sc->sc_es_task);
6389 
6390 	callout_drain(&sc->sc_led_blink_to);
6391 	callout_drain(&sc->sc_watchdog_to);
6392 	iwm_stop_device(sc);
6393 	if (do_net80211) {
6394 		IWM_LOCK(sc);
6395 		iwm_xmit_queue_drain(sc);
6396 		IWM_UNLOCK(sc);
6397 		ieee80211_ifdetach(&sc->sc_ic);
6398 	}
6399 
6400 	iwm_phy_db_free(sc->sc_phy_db);
6401 	sc->sc_phy_db = NULL;
6402 
6403 	iwm_free_nvm_data(sc->nvm_data);
6404 
6405 	/* Free descriptor rings */
6406 	iwm_free_rx_ring(sc, &sc->rxq);
6407 	for (i = 0; i < nitems(sc->txq); i++)
6408 		iwm_free_tx_ring(sc, &sc->txq[i]);
6409 
6410 	/* Free firmware */
6411 	if (fw->fw_fp != NULL)
6412 		iwm_fw_info_free(fw);
6413 
6414 	/* Free scheduler */
6415 	iwm_dma_contig_free(&sc->sched_dma);
6416 	iwm_dma_contig_free(&sc->ict_dma);
6417 	iwm_dma_contig_free(&sc->kw_dma);
6418 	iwm_dma_contig_free(&sc->fw_dma);
6419 
6420 	iwm_free_fw_paging(sc);
6421 
6422 	/* Finished with the hardware - detach things */
6423 	iwm_pci_detach(dev);
6424 
6425 	if (sc->sc_notif_wait != NULL) {
6426 		iwm_notification_wait_free(sc->sc_notif_wait);
6427 		sc->sc_notif_wait = NULL;
6428 	}
6429 
6430 	IWM_LOCK_DESTROY(sc);
6431 
6432 	return (0);
6433 }
6434 
6435 static int
6436 iwm_detach(device_t dev)
6437 {
6438 	struct iwm_softc *sc = device_get_softc(dev);
6439 
6440 	return (iwm_detach_local(sc, 1));
6441 }
6442 
6443 static device_method_t iwm_pci_methods[] = {
6444         /* Device interface */
6445         DEVMETHOD(device_probe,         iwm_probe),
6446         DEVMETHOD(device_attach,        iwm_attach),
6447         DEVMETHOD(device_detach,        iwm_detach),
6448         DEVMETHOD(device_suspend,       iwm_suspend),
6449         DEVMETHOD(device_resume,        iwm_resume),
6450 
6451         DEVMETHOD_END
6452 };
6453 
6454 static driver_t iwm_pci_driver = {
6455         "iwm",
6456         iwm_pci_methods,
6457         sizeof (struct iwm_softc)
6458 };
6459 
6460 static devclass_t iwm_devclass;
6461 
6462 DRIVER_MODULE(iwm, pci, iwm_pci_driver, iwm_devclass, NULL, NULL);
6463 MODULE_PNP_INFO("U16:device;P:#;T:vendor=0x8086", pci, iwm_pci_driver,
6464     iwm_devices, nitems(iwm_devices));
6465 MODULE_DEPEND(iwm, firmware, 1, 1, 1);
6466 MODULE_DEPEND(iwm, pci, 1, 1, 1);
6467 MODULE_DEPEND(iwm, wlan, 1, 1, 1);
6468