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