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