]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - sys/dev/iwm/if_iwm.c
Import to 0.6.1
[FreeBSD/FreeBSD.git] / sys / dev / iwm / if_iwm.c
1 /*      $OpenBSD: if_iwm.c,v 1.39 2015/03/23 00:35:19 jsg 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 <sys/param.h>
109 #include <sys/bus.h>
110 #include <sys/conf.h>
111 #include <sys/endian.h>
112 #include <sys/firmware.h>
113 #include <sys/kernel.h>
114 #include <sys/malloc.h>
115 #include <sys/mbuf.h>
116 #include <sys/mutex.h>
117 #include <sys/module.h>
118 #include <sys/proc.h>
119 #include <sys/rman.h>
120 #include <sys/socket.h>
121 #include <sys/sockio.h>
122 #include <sys/sysctl.h>
123 #include <sys/linker.h>
124
125 #include <machine/bus.h>
126 #include <machine/endian.h>
127 #include <machine/resource.h>
128
129 #include <dev/pci/pcivar.h>
130 #include <dev/pci/pcireg.h>
131
132 #include <net/bpf.h>
133
134 #include <net/if.h>
135 #include <net/if_var.h>
136 #include <net/if_arp.h>
137 #include <net/if_dl.h>
138 #include <net/if_media.h>
139 #include <net/if_types.h>
140
141 #include <netinet/in.h>
142 #include <netinet/in_systm.h>
143 #include <netinet/if_ether.h>
144 #include <netinet/ip.h>
145
146 #include <net80211/ieee80211_var.h>
147 #include <net80211/ieee80211_regdomain.h>
148 #include <net80211/ieee80211_ratectl.h>
149 #include <net80211/ieee80211_radiotap.h>
150
151 #include <dev/iwm/if_iwmreg.h>
152 #include <dev/iwm/if_iwmvar.h>
153 #include <dev/iwm/if_iwm_debug.h>
154 #include <dev/iwm/if_iwm_util.h>
155 #include <dev/iwm/if_iwm_binding.h>
156 #include <dev/iwm/if_iwm_phy_db.h>
157 #include <dev/iwm/if_iwm_mac_ctxt.h>
158 #include <dev/iwm/if_iwm_phy_ctxt.h>
159 #include <dev/iwm/if_iwm_time_event.h>
160 #include <dev/iwm/if_iwm_power.h>
161 #include <dev/iwm/if_iwm_scan.h>
162
163 #include <dev/iwm/if_iwm_pcie_trans.h>
164
165 const uint8_t iwm_nvm_channels[] = {
166         /* 2.4 GHz */
167         1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
168         /* 5 GHz */
169         36, 40, 44 , 48, 52, 56, 60, 64,
170         100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140, 144,
171         149, 153, 157, 161, 165
172 };
173 #define IWM_NUM_2GHZ_CHANNELS   14
174
175 /*
176  * XXX For now, there's simply a fixed set of rate table entries
177  * that are populated.
178  */
179 const struct iwm_rate {
180         uint8_t rate;
181         uint8_t plcp;
182 } iwm_rates[] = {
183         {   2,  IWM_RATE_1M_PLCP  },
184         {   4,  IWM_RATE_2M_PLCP  },
185         {  11,  IWM_RATE_5M_PLCP  },
186         {  22,  IWM_RATE_11M_PLCP },
187         {  12,  IWM_RATE_6M_PLCP  },
188         {  18,  IWM_RATE_9M_PLCP  },
189         {  24,  IWM_RATE_12M_PLCP },
190         {  36,  IWM_RATE_18M_PLCP },
191         {  48,  IWM_RATE_24M_PLCP },
192         {  72,  IWM_RATE_36M_PLCP },
193         {  96,  IWM_RATE_48M_PLCP },
194         { 108,  IWM_RATE_54M_PLCP },
195 };
196 #define IWM_RIDX_CCK    0
197 #define IWM_RIDX_OFDM   4
198 #define IWM_RIDX_MAX    (nitems(iwm_rates)-1)
199 #define IWM_RIDX_IS_CCK(_i_) ((_i_) < IWM_RIDX_OFDM)
200 #define IWM_RIDX_IS_OFDM(_i_) ((_i_) >= IWM_RIDX_OFDM)
201
202 static int      iwm_store_cscheme(struct iwm_softc *, const uint8_t *, size_t);
203 static int      iwm_firmware_store_section(struct iwm_softc *,
204                                            enum iwm_ucode_type,
205                                            const uint8_t *, size_t);
206 static int      iwm_set_default_calib(struct iwm_softc *, const void *);
207 static void     iwm_fw_info_free(struct iwm_fw_info *);
208 static int      iwm_read_firmware(struct iwm_softc *, enum iwm_ucode_type);
209 static void     iwm_dma_map_addr(void *, bus_dma_segment_t *, int, int);
210 static int      iwm_dma_contig_alloc(bus_dma_tag_t, struct iwm_dma_info *,
211                                      bus_size_t, bus_size_t);
212 static void     iwm_dma_contig_free(struct iwm_dma_info *);
213 static int      iwm_alloc_fwmem(struct iwm_softc *);
214 static void     iwm_free_fwmem(struct iwm_softc *);
215 static int      iwm_alloc_sched(struct iwm_softc *);
216 static void     iwm_free_sched(struct iwm_softc *);
217 static int      iwm_alloc_kw(struct iwm_softc *);
218 static void     iwm_free_kw(struct iwm_softc *);
219 static int      iwm_alloc_ict(struct iwm_softc *);
220 static void     iwm_free_ict(struct iwm_softc *);
221 static int      iwm_alloc_rx_ring(struct iwm_softc *, struct iwm_rx_ring *);
222 static void     iwm_reset_rx_ring(struct iwm_softc *, struct iwm_rx_ring *);
223 static void     iwm_free_rx_ring(struct iwm_softc *, struct iwm_rx_ring *);
224 static int      iwm_alloc_tx_ring(struct iwm_softc *, struct iwm_tx_ring *,
225                                   int);
226 static void     iwm_reset_tx_ring(struct iwm_softc *, struct iwm_tx_ring *);
227 static void     iwm_free_tx_ring(struct iwm_softc *, struct iwm_tx_ring *);
228 static void     iwm_enable_interrupts(struct iwm_softc *);
229 static void     iwm_restore_interrupts(struct iwm_softc *);
230 static void     iwm_disable_interrupts(struct iwm_softc *);
231 static void     iwm_ict_reset(struct iwm_softc *);
232 static int      iwm_allow_mcast(struct ieee80211vap *, struct iwm_softc *);
233 static void     iwm_stop_device(struct iwm_softc *);
234 static void     iwm_mvm_nic_config(struct iwm_softc *);
235 static int      iwm_nic_rx_init(struct iwm_softc *);
236 static int      iwm_nic_tx_init(struct iwm_softc *);
237 static int      iwm_nic_init(struct iwm_softc *);
238 static void     iwm_enable_txq(struct iwm_softc *, int, int);
239 static int      iwm_post_alive(struct iwm_softc *);
240 static int      iwm_nvm_read_chunk(struct iwm_softc *, uint16_t, uint16_t,
241                                    uint16_t, uint8_t *, uint16_t *);
242 static int      iwm_nvm_read_section(struct iwm_softc *, uint16_t, uint8_t *,
243                                      uint16_t *);
244 static void     iwm_init_channel_map(struct iwm_softc *,
245                                      const uint16_t * const);
246 static int      iwm_parse_nvm_data(struct iwm_softc *, const uint16_t *,
247                                    const uint16_t *, const uint16_t *, uint8_t,
248                                    uint8_t);
249 struct iwm_nvm_section;
250 static int      iwm_parse_nvm_sections(struct iwm_softc *,
251                                        struct iwm_nvm_section *);
252 static int      iwm_nvm_init(struct iwm_softc *);
253 static int      iwm_firmware_load_chunk(struct iwm_softc *, uint32_t,
254                                         const uint8_t *, uint32_t);
255 static int      iwm_load_firmware(struct iwm_softc *, enum iwm_ucode_type);
256 static int      iwm_start_fw(struct iwm_softc *, enum iwm_ucode_type);
257 static int      iwm_fw_alive(struct iwm_softc *, uint32_t);
258 static int      iwm_send_tx_ant_cfg(struct iwm_softc *, uint8_t);
259 static int      iwm_send_phy_cfg_cmd(struct iwm_softc *);
260 static int      iwm_mvm_load_ucode_wait_alive(struct iwm_softc *,
261                                               enum iwm_ucode_type);
262 static int      iwm_run_init_mvm_ucode(struct iwm_softc *, int);
263 static int      iwm_rx_addbuf(struct iwm_softc *, int, int);
264 static int      iwm_mvm_calc_rssi(struct iwm_softc *, struct iwm_rx_phy_info *);
265 static int      iwm_mvm_get_signal_strength(struct iwm_softc *,
266                                             struct iwm_rx_phy_info *);
267 static void     iwm_mvm_rx_rx_phy_cmd(struct iwm_softc *,
268                                       struct iwm_rx_packet *,
269                                       struct iwm_rx_data *);
270 static int      iwm_get_noise(const struct iwm_mvm_statistics_rx_non_phy *);
271 static void     iwm_mvm_rx_rx_mpdu(struct iwm_softc *, struct iwm_rx_packet *,
272                                    struct iwm_rx_data *);
273 static int      iwm_mvm_rx_tx_cmd_single(struct iwm_softc *,
274                                          struct iwm_rx_packet *,
275                                          struct iwm_node *);
276 static void     iwm_mvm_rx_tx_cmd(struct iwm_softc *, struct iwm_rx_packet *,
277                                   struct iwm_rx_data *);
278 static void     iwm_cmd_done(struct iwm_softc *, struct iwm_rx_packet *);
279 #if 0
280 static void     iwm_update_sched(struct iwm_softc *, int, int, uint8_t,
281                                  uint16_t);
282 #endif
283 static const struct iwm_rate *
284         iwm_tx_fill_cmd(struct iwm_softc *, struct iwm_node *,
285                         struct ieee80211_frame *, struct iwm_tx_cmd *);
286 static int      iwm_tx(struct iwm_softc *, struct mbuf *,
287                        struct ieee80211_node *, int);
288 static int      iwm_raw_xmit(struct ieee80211_node *, struct mbuf *,
289                              const struct ieee80211_bpf_params *);
290 static void     iwm_mvm_add_sta_cmd_v6_to_v5(struct iwm_mvm_add_sta_cmd_v6 *,
291                                              struct iwm_mvm_add_sta_cmd_v5 *);
292 static int      iwm_mvm_send_add_sta_cmd_status(struct iwm_softc *,
293                                                 struct iwm_mvm_add_sta_cmd_v6 *,
294                                                 int *);
295 static int      iwm_mvm_sta_send_to_fw(struct iwm_softc *, struct iwm_node *,
296                                        int);
297 static int      iwm_mvm_add_sta(struct iwm_softc *, struct iwm_node *);
298 static int      iwm_mvm_update_sta(struct iwm_softc *, struct iwm_node *);
299 static int      iwm_mvm_add_int_sta_common(struct iwm_softc *,
300                                            struct iwm_int_sta *,
301                                            const uint8_t *, uint16_t, uint16_t);
302 static int      iwm_mvm_add_aux_sta(struct iwm_softc *);
303 static int      iwm_mvm_update_quotas(struct iwm_softc *, struct iwm_node *);
304 static int      iwm_auth(struct ieee80211vap *, struct iwm_softc *);
305 static int      iwm_assoc(struct ieee80211vap *, struct iwm_softc *);
306 static int      iwm_release(struct iwm_softc *, struct iwm_node *);
307 static struct ieee80211_node *
308                 iwm_node_alloc(struct ieee80211vap *,
309                                const uint8_t[IEEE80211_ADDR_LEN]);
310 static void     iwm_setrates(struct iwm_softc *, struct iwm_node *);
311 static int      iwm_media_change(struct ifnet *);
312 static int      iwm_newstate(struct ieee80211vap *, enum ieee80211_state, int);
313 static void     iwm_endscan_cb(void *, int);
314 static int      iwm_init_hw(struct iwm_softc *);
315 static void     iwm_init(struct iwm_softc *);
316 static void     iwm_start(struct iwm_softc *);
317 static void     iwm_stop(struct iwm_softc *);
318 static void     iwm_watchdog(void *);
319 static void     iwm_parent(struct ieee80211com *);
320 #ifdef IWM_DEBUG
321 static const char *
322                 iwm_desc_lookup(uint32_t);
323 static void     iwm_nic_error(struct iwm_softc *);
324 #endif
325 static void     iwm_notif_intr(struct iwm_softc *);
326 static void     iwm_intr(void *);
327 static int      iwm_attach(device_t);
328 static void     iwm_preinit(void *);
329 static int      iwm_detach_local(struct iwm_softc *sc, int);
330 static void     iwm_init_task(void *);
331 static void     iwm_radiotap_attach(struct iwm_softc *);
332 static struct ieee80211vap *
333                 iwm_vap_create(struct ieee80211com *,
334                                const char [IFNAMSIZ], int,
335                                enum ieee80211_opmode, int,
336                                const uint8_t [IEEE80211_ADDR_LEN],
337                                const uint8_t [IEEE80211_ADDR_LEN]);
338 static void     iwm_vap_delete(struct ieee80211vap *);
339 static void     iwm_scan_start(struct ieee80211com *);
340 static void     iwm_scan_end(struct ieee80211com *);
341 static void     iwm_update_mcast(struct ieee80211com *);
342 static void     iwm_set_channel(struct ieee80211com *);
343 static void     iwm_scan_curchan(struct ieee80211_scan_state *, unsigned long);
344 static void     iwm_scan_mindwell(struct ieee80211_scan_state *);
345 static int      iwm_detach(device_t);
346
347 /*
348  * Firmware parser.
349  */
350
351 static int
352 iwm_store_cscheme(struct iwm_softc *sc, const uint8_t *data, size_t dlen)
353 {
354         const struct iwm_fw_cscheme_list *l = (const void *)data;
355
356         if (dlen < sizeof(*l) ||
357             dlen < sizeof(l->size) + l->size * sizeof(*l->cs))
358                 return EINVAL;
359
360         /* we don't actually store anything for now, always use s/w crypto */
361
362         return 0;
363 }
364
365 static int
366 iwm_firmware_store_section(struct iwm_softc *sc,
367     enum iwm_ucode_type type, const uint8_t *data, size_t dlen)
368 {
369         struct iwm_fw_sects *fws;
370         struct iwm_fw_onesect *fwone;
371
372         if (type >= IWM_UCODE_TYPE_MAX)
373                 return EINVAL;
374         if (dlen < sizeof(uint32_t))
375                 return EINVAL;
376
377         fws = &sc->sc_fw.fw_sects[type];
378         if (fws->fw_count >= IWM_UCODE_SECT_MAX)
379                 return EINVAL;
380
381         fwone = &fws->fw_sect[fws->fw_count];
382
383         /* first 32bit are device load offset */
384         memcpy(&fwone->fws_devoff, data, sizeof(uint32_t));
385
386         /* rest is data */
387         fwone->fws_data = data + sizeof(uint32_t);
388         fwone->fws_len = dlen - sizeof(uint32_t);
389
390         fws->fw_count++;
391         fws->fw_totlen += fwone->fws_len;
392
393         return 0;
394 }
395
396 /* iwlwifi: iwl-drv.c */
397 struct iwm_tlv_calib_data {
398         uint32_t ucode_type;
399         struct iwm_tlv_calib_ctrl calib;
400 } __packed;
401
402 static int
403 iwm_set_default_calib(struct iwm_softc *sc, const void *data)
404 {
405         const struct iwm_tlv_calib_data *def_calib = data;
406         uint32_t ucode_type = le32toh(def_calib->ucode_type);
407
408         if (ucode_type >= IWM_UCODE_TYPE_MAX) {
409                 device_printf(sc->sc_dev,
410                     "Wrong ucode_type %u for default "
411                     "calibration.\n", ucode_type);
412                 return EINVAL;
413         }
414
415         sc->sc_default_calib[ucode_type].flow_trigger =
416             def_calib->calib.flow_trigger;
417         sc->sc_default_calib[ucode_type].event_trigger =
418             def_calib->calib.event_trigger;
419
420         return 0;
421 }
422
423 static void
424 iwm_fw_info_free(struct iwm_fw_info *fw)
425 {
426         firmware_put(fw->fw_fp, FIRMWARE_UNLOAD);
427         fw->fw_fp = NULL;
428         /* don't touch fw->fw_status */
429         memset(fw->fw_sects, 0, sizeof(fw->fw_sects));
430 }
431
432 static int
433 iwm_read_firmware(struct iwm_softc *sc, enum iwm_ucode_type ucode_type)
434 {
435         struct iwm_fw_info *fw = &sc->sc_fw;
436         const struct iwm_tlv_ucode_header *uhdr;
437         struct iwm_ucode_tlv tlv;
438         enum iwm_ucode_tlv_type tlv_type;
439         const struct firmware *fwp;
440         const uint8_t *data;
441         int error = 0;
442         size_t len;
443
444         if (fw->fw_status == IWM_FW_STATUS_DONE &&
445             ucode_type != IWM_UCODE_TYPE_INIT)
446                 return 0;
447
448         while (fw->fw_status == IWM_FW_STATUS_INPROGRESS)
449                 msleep(&sc->sc_fw, &sc->sc_mtx, 0, "iwmfwp", 0);
450         fw->fw_status = IWM_FW_STATUS_INPROGRESS;
451
452         if (fw->fw_fp != NULL)
453                 iwm_fw_info_free(fw);
454
455         /*
456          * Load firmware into driver memory.
457          * fw_fp will be set.
458          */
459         IWM_UNLOCK(sc);
460         fwp = firmware_get(sc->sc_fwname);
461         IWM_LOCK(sc);
462         if (fwp == NULL) {
463                 device_printf(sc->sc_dev,
464                     "could not read firmware %s (error %d)\n",
465                     sc->sc_fwname, error);
466                 goto out;
467         }
468         fw->fw_fp = fwp;
469
470         /*
471          * Parse firmware contents
472          */
473
474         uhdr = (const void *)fw->fw_fp->data;
475         if (*(const uint32_t *)fw->fw_fp->data != 0
476             || le32toh(uhdr->magic) != IWM_TLV_UCODE_MAGIC) {
477                 device_printf(sc->sc_dev, "invalid firmware %s\n",
478                     sc->sc_fwname);
479                 error = EINVAL;
480                 goto out;
481         }
482
483         sc->sc_fwver = le32toh(uhdr->ver);
484         data = uhdr->data;
485         len = fw->fw_fp->datasize - sizeof(*uhdr);
486
487         while (len >= sizeof(tlv)) {
488                 size_t tlv_len;
489                 const void *tlv_data;
490
491                 memcpy(&tlv, data, sizeof(tlv));
492                 tlv_len = le32toh(tlv.length);
493                 tlv_type = le32toh(tlv.type);
494
495                 len -= sizeof(tlv);
496                 data += sizeof(tlv);
497                 tlv_data = data;
498
499                 if (len < tlv_len) {
500                         device_printf(sc->sc_dev,
501                             "firmware too short: %zu bytes\n",
502                             len);
503                         error = EINVAL;
504                         goto parse_out;
505                 }
506
507                 switch ((int)tlv_type) {
508                 case IWM_UCODE_TLV_PROBE_MAX_LEN:
509                         if (tlv_len < sizeof(uint32_t)) {
510                                 device_printf(sc->sc_dev,
511                                     "%s: PROBE_MAX_LEN (%d) < sizeof(uint32_t)\n",
512                                     __func__,
513                                     (int) tlv_len);
514                                 error = EINVAL;
515                                 goto parse_out;
516                         }
517                         sc->sc_capa_max_probe_len
518                             = le32toh(*(const uint32_t *)tlv_data);
519                         /* limit it to something sensible */
520                         if (sc->sc_capa_max_probe_len > (1<<16)) {
521                                 IWM_DPRINTF(sc, IWM_DEBUG_FIRMWARE_TLV,
522                                     "%s: IWM_UCODE_TLV_PROBE_MAX_LEN "
523                                     "ridiculous\n", __func__);
524                                 error = EINVAL;
525                                 goto parse_out;
526                         }
527                         break;
528                 case IWM_UCODE_TLV_PAN:
529                         if (tlv_len) {
530                                 device_printf(sc->sc_dev,
531                                     "%s: IWM_UCODE_TLV_PAN: tlv_len (%d) > 0\n",
532                                     __func__,
533                                     (int) tlv_len);
534                                 error = EINVAL;
535                                 goto parse_out;
536                         }
537                         sc->sc_capaflags |= IWM_UCODE_TLV_FLAGS_PAN;
538                         break;
539                 case IWM_UCODE_TLV_FLAGS:
540                         if (tlv_len < sizeof(uint32_t)) {
541                                 device_printf(sc->sc_dev,
542                                     "%s: IWM_UCODE_TLV_FLAGS: tlv_len (%d) < sizeof(uint32_t)\n",
543                                     __func__,
544                                     (int) tlv_len);
545                                 error = EINVAL;
546                                 goto parse_out;
547                         }
548                         /*
549                          * Apparently there can be many flags, but Linux driver
550                          * parses only the first one, and so do we.
551                          *
552                          * XXX: why does this override IWM_UCODE_TLV_PAN?
553                          * Intentional or a bug?  Observations from
554                          * current firmware file:
555                          *  1) TLV_PAN is parsed first
556                          *  2) TLV_FLAGS contains TLV_FLAGS_PAN
557                          * ==> this resets TLV_PAN to itself... hnnnk
558                          */
559                         sc->sc_capaflags = le32toh(*(const uint32_t *)tlv_data);
560                         break;
561                 case IWM_UCODE_TLV_CSCHEME:
562                         if ((error = iwm_store_cscheme(sc,
563                             tlv_data, tlv_len)) != 0) {
564                                 device_printf(sc->sc_dev,
565                                     "%s: iwm_store_cscheme(): returned %d\n",
566                                     __func__,
567                                     error);
568                                 goto parse_out;
569                         }
570                         break;
571                 case IWM_UCODE_TLV_NUM_OF_CPU:
572                         if (tlv_len != sizeof(uint32_t)) {
573                                 device_printf(sc->sc_dev,
574                                     "%s: IWM_UCODE_TLV_NUM_OF_CPU: tlv_len (%d) < sizeof(uint32_t)\n",
575                                     __func__,
576                                     (int) tlv_len);
577                                 error = EINVAL;
578                                 goto parse_out;
579                         }
580                         if (le32toh(*(const uint32_t*)tlv_data) != 1) {
581                                 device_printf(sc->sc_dev,
582                                     "%s: driver supports "
583                                     "only TLV_NUM_OF_CPU == 1",
584                                     __func__);
585                                 error = EINVAL;
586                                 goto parse_out;
587                         }
588                         break;
589                 case IWM_UCODE_TLV_SEC_RT:
590                         if ((error = iwm_firmware_store_section(sc,
591                             IWM_UCODE_TYPE_REGULAR, tlv_data, tlv_len)) != 0) {
592                                 device_printf(sc->sc_dev,
593                                     "%s: IWM_UCODE_TYPE_REGULAR: iwm_firmware_store_section() failed; %d\n",
594                                     __func__,
595                                     error);
596                                 goto parse_out;
597                         }
598                         break;
599                 case IWM_UCODE_TLV_SEC_INIT:
600                         if ((error = iwm_firmware_store_section(sc,
601                             IWM_UCODE_TYPE_INIT, tlv_data, tlv_len)) != 0) {
602                                 device_printf(sc->sc_dev,
603                                     "%s: IWM_UCODE_TYPE_INIT: iwm_firmware_store_section() failed; %d\n",
604                                     __func__,
605                                     error);
606                                 goto parse_out;
607                         }
608                         break;
609                 case IWM_UCODE_TLV_SEC_WOWLAN:
610                         if ((error = iwm_firmware_store_section(sc,
611                             IWM_UCODE_TYPE_WOW, tlv_data, tlv_len)) != 0) {
612                                 device_printf(sc->sc_dev,
613                                     "%s: IWM_UCODE_TYPE_WOW: iwm_firmware_store_section() failed; %d\n",
614                                     __func__,
615                                     error);
616                                 goto parse_out;
617                         }
618                         break;
619                 case IWM_UCODE_TLV_DEF_CALIB:
620                         if (tlv_len != sizeof(struct iwm_tlv_calib_data)) {
621                                 device_printf(sc->sc_dev,
622                                     "%s: IWM_UCODE_TLV_DEV_CALIB: tlv_len (%d) < sizeof(iwm_tlv_calib_data) (%d)\n",
623                                     __func__,
624                                     (int) tlv_len,
625                                     (int) sizeof(struct iwm_tlv_calib_data));
626                                 error = EINVAL;
627                                 goto parse_out;
628                         }
629                         if ((error = iwm_set_default_calib(sc, tlv_data)) != 0) {
630                                 device_printf(sc->sc_dev,
631                                     "%s: iwm_set_default_calib() failed: %d\n",
632                                     __func__,
633                                     error);
634                                 goto parse_out;
635                         }
636                         break;
637                 case IWM_UCODE_TLV_PHY_SKU:
638                         if (tlv_len != sizeof(uint32_t)) {
639                                 error = EINVAL;
640                                 device_printf(sc->sc_dev,
641                                     "%s: IWM_UCODE_TLV_PHY_SKU: tlv_len (%d) < sizeof(uint32_t)\n",
642                                     __func__,
643                                     (int) tlv_len);
644                                 goto parse_out;
645                         }
646                         sc->sc_fw_phy_config =
647                             le32toh(*(const uint32_t *)tlv_data);
648                         break;
649
650                 case IWM_UCODE_TLV_API_CHANGES_SET:
651                 case IWM_UCODE_TLV_ENABLED_CAPABILITIES:
652                         /* ignore, not used by current driver */
653                         break;
654
655                 default:
656                         device_printf(sc->sc_dev,
657                             "%s: unknown firmware section %d, abort\n",
658                             __func__, tlv_type);
659                         error = EINVAL;
660                         goto parse_out;
661                 }
662
663                 len -= roundup(tlv_len, 4);
664                 data += roundup(tlv_len, 4);
665         }
666
667         KASSERT(error == 0, ("unhandled error"));
668
669  parse_out:
670         if (error) {
671                 device_printf(sc->sc_dev, "firmware parse error %d, "
672                     "section type %d\n", error, tlv_type);
673         }
674
675         if (!(sc->sc_capaflags & IWM_UCODE_TLV_FLAGS_PM_CMD_SUPPORT)) {
676                 device_printf(sc->sc_dev,
677                     "device uses unsupported power ops\n");
678                 error = ENOTSUP;
679         }
680
681  out:
682         if (error) {
683                 fw->fw_status = IWM_FW_STATUS_NONE;
684                 if (fw->fw_fp != NULL)
685                         iwm_fw_info_free(fw);
686         } else
687                 fw->fw_status = IWM_FW_STATUS_DONE;
688         wakeup(&sc->sc_fw);
689
690         return error;
691 }
692
693 /*
694  * DMA resource routines
695  */
696
697 static void
698 iwm_dma_map_addr(void *arg, bus_dma_segment_t *segs, int nsegs, int error)
699 {
700         if (error != 0)
701                 return;
702         KASSERT(nsegs == 1, ("too many DMA segments, %d should be 1", nsegs));
703         *(bus_addr_t *)arg = segs[0].ds_addr;
704 }
705
706 static int
707 iwm_dma_contig_alloc(bus_dma_tag_t tag, struct iwm_dma_info *dma,
708     bus_size_t size, bus_size_t alignment)
709 {
710         int error;
711
712         dma->tag = NULL;
713         dma->size = size;
714
715         error = bus_dma_tag_create(tag, alignment,
716             0, BUS_SPACE_MAXADDR_32BIT, BUS_SPACE_MAXADDR, NULL, NULL, size,
717             1, size, 0, NULL, NULL, &dma->tag);
718         if (error != 0)
719                 goto fail;
720
721         error = bus_dmamem_alloc(dma->tag, (void **)&dma->vaddr,
722             BUS_DMA_NOWAIT | BUS_DMA_ZERO | BUS_DMA_COHERENT, &dma->map);
723         if (error != 0)
724                 goto fail;
725
726         error = bus_dmamap_load(dma->tag, dma->map, dma->vaddr, size,
727             iwm_dma_map_addr, &dma->paddr, BUS_DMA_NOWAIT);
728         if (error != 0)
729                 goto fail;
730
731         bus_dmamap_sync(dma->tag, dma->map, BUS_DMASYNC_PREWRITE);
732
733         return 0;
734
735 fail:   iwm_dma_contig_free(dma);
736         return error;
737 }
738
739 static void
740 iwm_dma_contig_free(struct iwm_dma_info *dma)
741 {
742         if (dma->map != NULL) {
743                 if (dma->vaddr != NULL) {
744                         bus_dmamap_sync(dma->tag, dma->map,
745                             BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE);
746                         bus_dmamap_unload(dma->tag, dma->map);
747                         bus_dmamem_free(dma->tag, dma->vaddr, dma->map);
748                         dma->vaddr = NULL;
749                 }
750                 bus_dmamap_destroy(dma->tag, dma->map);
751                 dma->map = NULL;
752         }
753         if (dma->tag != NULL) {
754                 bus_dma_tag_destroy(dma->tag);
755                 dma->tag = NULL;
756         }
757
758 }
759
760 /* fwmem is used to load firmware onto the card */
761 static int
762 iwm_alloc_fwmem(struct iwm_softc *sc)
763 {
764         /* Must be aligned on a 16-byte boundary. */
765         return iwm_dma_contig_alloc(sc->sc_dmat, &sc->fw_dma,
766             sc->sc_fwdmasegsz, 16);
767 }
768
769 static void
770 iwm_free_fwmem(struct iwm_softc *sc)
771 {
772         iwm_dma_contig_free(&sc->fw_dma);
773 }
774
775 /* tx scheduler rings.  not used? */
776 static int
777 iwm_alloc_sched(struct iwm_softc *sc)
778 {
779         int rv;
780
781         /* TX scheduler rings must be aligned on a 1KB boundary. */
782         rv = iwm_dma_contig_alloc(sc->sc_dmat, &sc->sched_dma,
783             nitems(sc->txq) * sizeof(struct iwm_agn_scd_bc_tbl), 1024);
784         return rv;
785 }
786
787 static void
788 iwm_free_sched(struct iwm_softc *sc)
789 {
790         iwm_dma_contig_free(&sc->sched_dma);
791 }
792
793 /* keep-warm page is used internally by the card.  see iwl-fh.h for more info */
794 static int
795 iwm_alloc_kw(struct iwm_softc *sc)
796 {
797         return iwm_dma_contig_alloc(sc->sc_dmat, &sc->kw_dma, 4096, 4096);
798 }
799
800 static void
801 iwm_free_kw(struct iwm_softc *sc)
802 {
803         iwm_dma_contig_free(&sc->kw_dma);
804 }
805
806 /* interrupt cause table */
807 static int
808 iwm_alloc_ict(struct iwm_softc *sc)
809 {
810         return iwm_dma_contig_alloc(sc->sc_dmat, &sc->ict_dma,
811             IWM_ICT_SIZE, 1<<IWM_ICT_PADDR_SHIFT);
812 }
813
814 static void
815 iwm_free_ict(struct iwm_softc *sc)
816 {
817         iwm_dma_contig_free(&sc->ict_dma);
818 }
819
820 static int
821 iwm_alloc_rx_ring(struct iwm_softc *sc, struct iwm_rx_ring *ring)
822 {
823         bus_size_t size;
824         int i, error;
825
826         ring->cur = 0;
827
828         /* Allocate RX descriptors (256-byte aligned). */
829         size = IWM_RX_RING_COUNT * sizeof(uint32_t);
830         error = iwm_dma_contig_alloc(sc->sc_dmat, &ring->desc_dma, size, 256);
831         if (error != 0) {
832                 device_printf(sc->sc_dev,
833                     "could not allocate RX ring DMA memory\n");
834                 goto fail;
835         }
836         ring->desc = ring->desc_dma.vaddr;
837
838         /* Allocate RX status area (16-byte aligned). */
839         error = iwm_dma_contig_alloc(sc->sc_dmat, &ring->stat_dma,
840             sizeof(*ring->stat), 16);
841         if (error != 0) {
842                 device_printf(sc->sc_dev,
843                     "could not allocate RX status DMA memory\n");
844                 goto fail;
845         }
846         ring->stat = ring->stat_dma.vaddr;
847
848         /* Create RX buffer DMA tag. */
849         error = bus_dma_tag_create(sc->sc_dmat, 1, 0,
850             BUS_SPACE_MAXADDR_32BIT, BUS_SPACE_MAXADDR, NULL, NULL,
851             IWM_RBUF_SIZE, 1, IWM_RBUF_SIZE, 0, NULL, NULL, &ring->data_dmat);
852         if (error != 0) {
853                 device_printf(sc->sc_dev,
854                     "%s: could not create RX buf DMA tag, error %d\n",
855                     __func__, error);
856                 goto fail;
857         }
858
859         /*
860          * Allocate and map RX buffers.
861          */
862         for (i = 0; i < IWM_RX_RING_COUNT; i++) {
863                 if ((error = iwm_rx_addbuf(sc, IWM_RBUF_SIZE, i)) != 0) {
864                         goto fail;
865                 }
866         }
867         return 0;
868
869 fail:   iwm_free_rx_ring(sc, ring);
870         return error;
871 }
872
873 static void
874 iwm_reset_rx_ring(struct iwm_softc *sc, struct iwm_rx_ring *ring)
875 {
876
877         /* XXX print out if we can't lock the NIC? */
878         if (iwm_nic_lock(sc)) {
879                 /* XXX handle if RX stop doesn't finish? */
880                 (void) iwm_pcie_rx_stop(sc);
881                 iwm_nic_unlock(sc);
882         }
883         /* Reset the ring state */
884         ring->cur = 0;
885         memset(sc->rxq.stat, 0, sizeof(*sc->rxq.stat));
886 }
887
888 static void
889 iwm_free_rx_ring(struct iwm_softc *sc, struct iwm_rx_ring *ring)
890 {
891         int i;
892
893         iwm_dma_contig_free(&ring->desc_dma);
894         iwm_dma_contig_free(&ring->stat_dma);
895
896         for (i = 0; i < IWM_RX_RING_COUNT; i++) {
897                 struct iwm_rx_data *data = &ring->data[i];
898
899                 if (data->m != NULL) {
900                         bus_dmamap_sync(ring->data_dmat, data->map,
901                             BUS_DMASYNC_POSTREAD);
902                         bus_dmamap_unload(ring->data_dmat, data->map);
903                         m_freem(data->m);
904                         data->m = NULL;
905                 }
906                 if (data->map != NULL) {
907                         bus_dmamap_destroy(ring->data_dmat, data->map);
908                         data->map = NULL;
909                 }
910         }
911         if (ring->data_dmat != NULL) {
912                 bus_dma_tag_destroy(ring->data_dmat);
913                 ring->data_dmat = NULL;
914         }
915 }
916
917 static int
918 iwm_alloc_tx_ring(struct iwm_softc *sc, struct iwm_tx_ring *ring, int qid)
919 {
920         bus_addr_t paddr;
921         bus_size_t size;
922         int i, error;
923
924         ring->qid = qid;
925         ring->queued = 0;
926         ring->cur = 0;
927
928         /* Allocate TX descriptors (256-byte aligned). */
929         size = IWM_TX_RING_COUNT * sizeof (struct iwm_tfd);
930         error = iwm_dma_contig_alloc(sc->sc_dmat, &ring->desc_dma, size, 256);
931         if (error != 0) {
932                 device_printf(sc->sc_dev,
933                     "could not allocate TX ring DMA memory\n");
934                 goto fail;
935         }
936         ring->desc = ring->desc_dma.vaddr;
937
938         /*
939          * We only use rings 0 through 9 (4 EDCA + cmd) so there is no need
940          * to allocate commands space for other rings.
941          */
942         if (qid > IWM_MVM_CMD_QUEUE)
943                 return 0;
944
945         size = IWM_TX_RING_COUNT * sizeof(struct iwm_device_cmd);
946         error = iwm_dma_contig_alloc(sc->sc_dmat, &ring->cmd_dma, size, 4);
947         if (error != 0) {
948                 device_printf(sc->sc_dev,
949                     "could not allocate TX cmd DMA memory\n");
950                 goto fail;
951         }
952         ring->cmd = ring->cmd_dma.vaddr;
953
954         error = bus_dma_tag_create(sc->sc_dmat, 1, 0,
955             BUS_SPACE_MAXADDR_32BIT, BUS_SPACE_MAXADDR, NULL, NULL, MCLBYTES,
956             IWM_MAX_SCATTER - 2, MCLBYTES, 0, NULL, NULL, &ring->data_dmat);
957         if (error != 0) {
958                 device_printf(sc->sc_dev, "could not create TX buf DMA tag\n");
959                 goto fail;
960         }
961
962         paddr = ring->cmd_dma.paddr;
963         for (i = 0; i < IWM_TX_RING_COUNT; i++) {
964                 struct iwm_tx_data *data = &ring->data[i];
965
966                 data->cmd_paddr = paddr;
967                 data->scratch_paddr = paddr + sizeof(struct iwm_cmd_header)
968                     + offsetof(struct iwm_tx_cmd, scratch);
969                 paddr += sizeof(struct iwm_device_cmd);
970
971                 error = bus_dmamap_create(ring->data_dmat, 0, &data->map);
972                 if (error != 0) {
973                         device_printf(sc->sc_dev,
974                             "could not create TX buf DMA map\n");
975                         goto fail;
976                 }
977         }
978         KASSERT(paddr == ring->cmd_dma.paddr + size,
979             ("invalid physical address"));
980         return 0;
981
982 fail:   iwm_free_tx_ring(sc, ring);
983         return error;
984 }
985
986 static void
987 iwm_reset_tx_ring(struct iwm_softc *sc, struct iwm_tx_ring *ring)
988 {
989         int i;
990
991         for (i = 0; i < IWM_TX_RING_COUNT; i++) {
992                 struct iwm_tx_data *data = &ring->data[i];
993
994                 if (data->m != NULL) {
995                         bus_dmamap_sync(ring->data_dmat, data->map,
996                             BUS_DMASYNC_POSTWRITE);
997                         bus_dmamap_unload(ring->data_dmat, data->map);
998                         m_freem(data->m);
999                         data->m = NULL;
1000                 }
1001         }
1002         /* Clear TX descriptors. */
1003         memset(ring->desc, 0, ring->desc_dma.size);
1004         bus_dmamap_sync(ring->desc_dma.tag, ring->desc_dma.map,
1005             BUS_DMASYNC_PREWRITE);
1006         sc->qfullmsk &= ~(1 << ring->qid);
1007         ring->queued = 0;
1008         ring->cur = 0;
1009 }
1010
1011 static void
1012 iwm_free_tx_ring(struct iwm_softc *sc, struct iwm_tx_ring *ring)
1013 {
1014         int i;
1015
1016         iwm_dma_contig_free(&ring->desc_dma);
1017         iwm_dma_contig_free(&ring->cmd_dma);
1018
1019         for (i = 0; i < IWM_TX_RING_COUNT; i++) {
1020                 struct iwm_tx_data *data = &ring->data[i];
1021
1022                 if (data->m != NULL) {
1023                         bus_dmamap_sync(ring->data_dmat, data->map,
1024                             BUS_DMASYNC_POSTWRITE);
1025                         bus_dmamap_unload(ring->data_dmat, data->map);
1026                         m_freem(data->m);
1027                         data->m = NULL;
1028                 }
1029                 if (data->map != NULL) {
1030                         bus_dmamap_destroy(ring->data_dmat, data->map);
1031                         data->map = NULL;
1032                 }
1033         }
1034         if (ring->data_dmat != NULL) {
1035                 bus_dma_tag_destroy(ring->data_dmat);
1036                 ring->data_dmat = NULL;
1037         }
1038 }
1039
1040 /*
1041  * High-level hardware frobbing routines
1042  */
1043
1044 static void
1045 iwm_enable_interrupts(struct iwm_softc *sc)
1046 {
1047         sc->sc_intmask = IWM_CSR_INI_SET_MASK;
1048         IWM_WRITE(sc, IWM_CSR_INT_MASK, sc->sc_intmask);
1049 }
1050
1051 static void
1052 iwm_restore_interrupts(struct iwm_softc *sc)
1053 {
1054         IWM_WRITE(sc, IWM_CSR_INT_MASK, sc->sc_intmask);
1055 }
1056
1057 static void
1058 iwm_disable_interrupts(struct iwm_softc *sc)
1059 {
1060         /* disable interrupts */
1061         IWM_WRITE(sc, IWM_CSR_INT_MASK, 0);
1062
1063         /* acknowledge all interrupts */
1064         IWM_WRITE(sc, IWM_CSR_INT, ~0);
1065         IWM_WRITE(sc, IWM_CSR_FH_INT_STATUS, ~0);
1066 }
1067
1068 static void
1069 iwm_ict_reset(struct iwm_softc *sc)
1070 {
1071         iwm_disable_interrupts(sc);
1072
1073         /* Reset ICT table. */
1074         memset(sc->ict_dma.vaddr, 0, IWM_ICT_SIZE);
1075         sc->ict_cur = 0;
1076
1077         /* Set physical address of ICT table (4KB aligned). */
1078         IWM_WRITE(sc, IWM_CSR_DRAM_INT_TBL_REG,
1079             IWM_CSR_DRAM_INT_TBL_ENABLE
1080             | IWM_CSR_DRAM_INIT_TBL_WRAP_CHECK
1081             | sc->ict_dma.paddr >> IWM_ICT_PADDR_SHIFT);
1082
1083         /* Switch to ICT interrupt mode in driver. */
1084         sc->sc_flags |= IWM_FLAG_USE_ICT;
1085
1086         /* Re-enable interrupts. */
1087         IWM_WRITE(sc, IWM_CSR_INT, ~0);
1088         iwm_enable_interrupts(sc);
1089 }
1090
1091 /* iwlwifi pcie/trans.c */
1092
1093 /*
1094  * Since this .. hard-resets things, it's time to actually
1095  * mark the first vap (if any) as having no mac context.
1096  * It's annoying, but since the driver is potentially being
1097  * stop/start'ed whilst active (thanks openbsd port!) we
1098  * have to correctly track this.
1099  */
1100 static void
1101 iwm_stop_device(struct iwm_softc *sc)
1102 {
1103         struct ieee80211com *ic = &sc->sc_ic;
1104         struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps);
1105         int chnl, ntries;
1106         int qid;
1107
1108         /* tell the device to stop sending interrupts */
1109         iwm_disable_interrupts(sc);
1110
1111         /*
1112          * FreeBSD-local: mark the first vap as not-uploaded,
1113          * so the next transition through auth/assoc
1114          * will correctly populate the MAC context.
1115          */
1116         if (vap) {
1117                 struct iwm_vap *iv = IWM_VAP(vap);
1118                 iv->is_uploaded = 0;
1119         }
1120
1121         /* device going down, Stop using ICT table */
1122         sc->sc_flags &= ~IWM_FLAG_USE_ICT;
1123
1124         /* stop tx and rx.  tx and rx bits, as usual, are from if_iwn */
1125
1126         iwm_write_prph(sc, IWM_SCD_TXFACT, 0);
1127
1128         /* Stop all DMA channels. */
1129         if (iwm_nic_lock(sc)) {
1130                 for (chnl = 0; chnl < IWM_FH_TCSR_CHNL_NUM; chnl++) {
1131                         IWM_WRITE(sc,
1132                             IWM_FH_TCSR_CHNL_TX_CONFIG_REG(chnl), 0);
1133                         for (ntries = 0; ntries < 200; ntries++) {
1134                                 uint32_t r;
1135
1136                                 r = IWM_READ(sc, IWM_FH_TSSR_TX_STATUS_REG);
1137                                 if (r & IWM_FH_TSSR_TX_STATUS_REG_MSK_CHNL_IDLE(
1138                                     chnl))
1139                                         break;
1140                                 DELAY(20);
1141                         }
1142                 }
1143                 iwm_nic_unlock(sc);
1144         }
1145
1146         /* Stop RX ring. */
1147         iwm_reset_rx_ring(sc, &sc->rxq);
1148
1149         /* Reset all TX rings. */
1150         for (qid = 0; qid < nitems(sc->txq); qid++)
1151                 iwm_reset_tx_ring(sc, &sc->txq[qid]);
1152
1153         /*
1154          * Power-down device's busmaster DMA clocks
1155          */
1156         iwm_write_prph(sc, IWM_APMG_CLK_DIS_REG, IWM_APMG_CLK_VAL_DMA_CLK_RQT);
1157         DELAY(5);
1158
1159         /* Make sure (redundant) we've released our request to stay awake */
1160         IWM_CLRBITS(sc, IWM_CSR_GP_CNTRL,
1161             IWM_CSR_GP_CNTRL_REG_FLAG_MAC_ACCESS_REQ);
1162
1163         /* Stop the device, and put it in low power state */
1164         iwm_apm_stop(sc);
1165
1166         /* Upon stop, the APM issues an interrupt if HW RF kill is set.
1167          * Clean again the interrupt here
1168          */
1169         iwm_disable_interrupts(sc);
1170         /* stop and reset the on-board processor */
1171         IWM_WRITE(sc, IWM_CSR_RESET, IWM_CSR_RESET_REG_FLAG_NEVO_RESET);
1172
1173         /*
1174          * Even if we stop the HW, we still want the RF kill
1175          * interrupt
1176          */
1177         iwm_enable_rfkill_int(sc);
1178         iwm_check_rfkill(sc);
1179 }
1180
1181 /* iwlwifi: mvm/ops.c */
1182 static void
1183 iwm_mvm_nic_config(struct iwm_softc *sc)
1184 {
1185         uint8_t radio_cfg_type, radio_cfg_step, radio_cfg_dash;
1186         uint32_t reg_val = 0;
1187
1188         radio_cfg_type = (sc->sc_fw_phy_config & IWM_FW_PHY_CFG_RADIO_TYPE) >>
1189             IWM_FW_PHY_CFG_RADIO_TYPE_POS;
1190         radio_cfg_step = (sc->sc_fw_phy_config & IWM_FW_PHY_CFG_RADIO_STEP) >>
1191             IWM_FW_PHY_CFG_RADIO_STEP_POS;
1192         radio_cfg_dash = (sc->sc_fw_phy_config & IWM_FW_PHY_CFG_RADIO_DASH) >>
1193             IWM_FW_PHY_CFG_RADIO_DASH_POS;
1194
1195         /* SKU control */
1196         reg_val |= IWM_CSR_HW_REV_STEP(sc->sc_hw_rev) <<
1197             IWM_CSR_HW_IF_CONFIG_REG_POS_MAC_STEP;
1198         reg_val |= IWM_CSR_HW_REV_DASH(sc->sc_hw_rev) <<
1199             IWM_CSR_HW_IF_CONFIG_REG_POS_MAC_DASH;
1200
1201         /* radio configuration */
1202         reg_val |= radio_cfg_type << IWM_CSR_HW_IF_CONFIG_REG_POS_PHY_TYPE;
1203         reg_val |= radio_cfg_step << IWM_CSR_HW_IF_CONFIG_REG_POS_PHY_STEP;
1204         reg_val |= radio_cfg_dash << IWM_CSR_HW_IF_CONFIG_REG_POS_PHY_DASH;
1205
1206         IWM_WRITE(sc, IWM_CSR_HW_IF_CONFIG_REG, reg_val);
1207
1208         IWM_DPRINTF(sc, IWM_DEBUG_RESET,
1209             "Radio type=0x%x-0x%x-0x%x\n", radio_cfg_type,
1210             radio_cfg_step, radio_cfg_dash);
1211
1212         /*
1213          * W/A : NIC is stuck in a reset state after Early PCIe power off
1214          * (PCIe power is lost before PERST# is asserted), causing ME FW
1215          * to lose ownership and not being able to obtain it back.
1216          */
1217         iwm_set_bits_mask_prph(sc, IWM_APMG_PS_CTRL_REG,
1218             IWM_APMG_PS_CTRL_EARLY_PWR_OFF_RESET_DIS,
1219             ~IWM_APMG_PS_CTRL_EARLY_PWR_OFF_RESET_DIS);
1220 }
1221
1222 static int
1223 iwm_nic_rx_init(struct iwm_softc *sc)
1224 {
1225         if (!iwm_nic_lock(sc))
1226                 return EBUSY;
1227
1228         /*
1229          * Initialize RX ring.  This is from the iwn driver.
1230          */
1231         memset(sc->rxq.stat, 0, sizeof(*sc->rxq.stat));
1232
1233         /* stop DMA */
1234         IWM_WRITE(sc, IWM_FH_MEM_RCSR_CHNL0_CONFIG_REG, 0);
1235         IWM_WRITE(sc, IWM_FH_MEM_RCSR_CHNL0_RBDCB_WPTR, 0);
1236         IWM_WRITE(sc, IWM_FH_MEM_RCSR_CHNL0_FLUSH_RB_REQ, 0);
1237         IWM_WRITE(sc, IWM_FH_RSCSR_CHNL0_RDPTR, 0);
1238         IWM_WRITE(sc, IWM_FH_RSCSR_CHNL0_RBDCB_WPTR_REG, 0);
1239
1240         /* Set physical address of RX ring (256-byte aligned). */
1241         IWM_WRITE(sc,
1242             IWM_FH_RSCSR_CHNL0_RBDCB_BASE_REG, sc->rxq.desc_dma.paddr >> 8);
1243
1244         /* Set physical address of RX status (16-byte aligned). */
1245         IWM_WRITE(sc,
1246             IWM_FH_RSCSR_CHNL0_STTS_WPTR_REG, sc->rxq.stat_dma.paddr >> 4);
1247
1248         /* Enable RX. */
1249         /*
1250          * Note: Linux driver also sets this:
1251          *  (IWM_RX_RB_TIMEOUT << IWM_FH_RCSR_RX_CONFIG_REG_IRQ_RBTH_POS) |
1252          *
1253          * It causes weird behavior.  YMMV.
1254          */
1255         IWM_WRITE(sc, IWM_FH_MEM_RCSR_CHNL0_CONFIG_REG,
1256             IWM_FH_RCSR_RX_CONFIG_CHNL_EN_ENABLE_VAL            |
1257             IWM_FH_RCSR_CHNL0_RX_IGNORE_RXF_EMPTY               |  /* HW bug */
1258             IWM_FH_RCSR_CHNL0_RX_CONFIG_IRQ_DEST_INT_HOST_VAL   |
1259             IWM_FH_RCSR_RX_CONFIG_REG_VAL_RB_SIZE_4K            |
1260             IWM_RX_QUEUE_SIZE_LOG << IWM_FH_RCSR_RX_CONFIG_RBDCB_SIZE_POS);
1261
1262         IWM_WRITE_1(sc, IWM_CSR_INT_COALESCING, IWM_HOST_INT_TIMEOUT_DEF);
1263
1264         /* W/A for interrupt coalescing bug in 7260 and 3160 */
1265         if (sc->host_interrupt_operation_mode)
1266                 IWM_SETBITS(sc, IWM_CSR_INT_COALESCING, IWM_HOST_INT_OPER_MODE);
1267
1268         /*
1269          * Thus sayeth el jefe (iwlwifi) via a comment:
1270          *
1271          * This value should initially be 0 (before preparing any
1272          * RBs), should be 8 after preparing the first 8 RBs (for example)
1273          */
1274         IWM_WRITE(sc, IWM_FH_RSCSR_CHNL0_WPTR, 8);
1275
1276         iwm_nic_unlock(sc);
1277
1278         return 0;
1279 }
1280
1281 static int
1282 iwm_nic_tx_init(struct iwm_softc *sc)
1283 {
1284         int qid;
1285
1286         if (!iwm_nic_lock(sc))
1287                 return EBUSY;
1288
1289         /* Deactivate TX scheduler. */
1290         iwm_write_prph(sc, IWM_SCD_TXFACT, 0);
1291
1292         /* Set physical address of "keep warm" page (16-byte aligned). */
1293         IWM_WRITE(sc, IWM_FH_KW_MEM_ADDR_REG, sc->kw_dma.paddr >> 4);
1294
1295         /* Initialize TX rings. */
1296         for (qid = 0; qid < nitems(sc->txq); qid++) {
1297                 struct iwm_tx_ring *txq = &sc->txq[qid];
1298
1299                 /* Set physical address of TX ring (256-byte aligned). */
1300                 IWM_WRITE(sc, IWM_FH_MEM_CBBC_QUEUE(qid),
1301                     txq->desc_dma.paddr >> 8);
1302                 IWM_DPRINTF(sc, IWM_DEBUG_XMIT,
1303                     "%s: loading ring %d descriptors (%p) at %lx\n",
1304                     __func__,
1305                     qid, txq->desc,
1306                     (unsigned long) (txq->desc_dma.paddr >> 8));
1307         }
1308         iwm_nic_unlock(sc);
1309
1310         return 0;
1311 }
1312
1313 static int
1314 iwm_nic_init(struct iwm_softc *sc)
1315 {
1316         int error;
1317
1318         iwm_apm_init(sc);
1319         iwm_set_pwr(sc);
1320
1321         iwm_mvm_nic_config(sc);
1322
1323         if ((error = iwm_nic_rx_init(sc)) != 0)
1324                 return error;
1325
1326         /*
1327          * Ditto for TX, from iwn
1328          */
1329         if ((error = iwm_nic_tx_init(sc)) != 0)
1330                 return error;
1331
1332         IWM_DPRINTF(sc, IWM_DEBUG_RESET,
1333             "%s: shadow registers enabled\n", __func__);
1334         IWM_SETBITS(sc, IWM_CSR_MAC_SHADOW_REG_CTRL, 0x800fffff);
1335
1336         return 0;
1337 }
1338
1339 enum iwm_mvm_tx_fifo {
1340         IWM_MVM_TX_FIFO_BK = 0,
1341         IWM_MVM_TX_FIFO_BE,
1342         IWM_MVM_TX_FIFO_VI,
1343         IWM_MVM_TX_FIFO_VO,
1344         IWM_MVM_TX_FIFO_MCAST = 5,
1345 };
1346
1347 const uint8_t iwm_mvm_ac_to_tx_fifo[] = {
1348         IWM_MVM_TX_FIFO_VO,
1349         IWM_MVM_TX_FIFO_VI,
1350         IWM_MVM_TX_FIFO_BE,
1351         IWM_MVM_TX_FIFO_BK,
1352 };
1353
1354 static void
1355 iwm_enable_txq(struct iwm_softc *sc, int qid, int fifo)
1356 {
1357         if (!iwm_nic_lock(sc)) {
1358                 device_printf(sc->sc_dev,
1359                     "%s: cannot enable txq %d\n",
1360                     __func__,
1361                     qid);
1362                 return; /* XXX return EBUSY */
1363         }
1364
1365         /* unactivate before configuration */
1366         iwm_write_prph(sc, IWM_SCD_QUEUE_STATUS_BITS(qid),
1367             (0 << IWM_SCD_QUEUE_STTS_REG_POS_ACTIVE)
1368             | (1 << IWM_SCD_QUEUE_STTS_REG_POS_SCD_ACT_EN));
1369
1370         if (qid != IWM_MVM_CMD_QUEUE) {
1371                 iwm_set_bits_prph(sc, IWM_SCD_QUEUECHAIN_SEL, (1 << qid));
1372         }
1373
1374         iwm_clear_bits_prph(sc, IWM_SCD_AGGR_SEL, (1 << qid));
1375
1376         IWM_WRITE(sc, IWM_HBUS_TARG_WRPTR, qid << 8 | 0);
1377         iwm_write_prph(sc, IWM_SCD_QUEUE_RDPTR(qid), 0);
1378
1379         iwm_write_mem32(sc, sc->sched_base + IWM_SCD_CONTEXT_QUEUE_OFFSET(qid), 0);
1380         /* Set scheduler window size and frame limit. */
1381         iwm_write_mem32(sc,
1382             sc->sched_base + IWM_SCD_CONTEXT_QUEUE_OFFSET(qid) +
1383             sizeof(uint32_t),
1384             ((IWM_FRAME_LIMIT << IWM_SCD_QUEUE_CTX_REG2_WIN_SIZE_POS) &
1385             IWM_SCD_QUEUE_CTX_REG2_WIN_SIZE_MSK) |
1386             ((IWM_FRAME_LIMIT << IWM_SCD_QUEUE_CTX_REG2_FRAME_LIMIT_POS) &
1387             IWM_SCD_QUEUE_CTX_REG2_FRAME_LIMIT_MSK));
1388
1389         iwm_write_prph(sc, IWM_SCD_QUEUE_STATUS_BITS(qid),
1390             (1 << IWM_SCD_QUEUE_STTS_REG_POS_ACTIVE) |
1391             (fifo << IWM_SCD_QUEUE_STTS_REG_POS_TXF) |
1392             (1 << IWM_SCD_QUEUE_STTS_REG_POS_WSL) |
1393             IWM_SCD_QUEUE_STTS_REG_MSK);
1394
1395         iwm_nic_unlock(sc);
1396
1397         IWM_DPRINTF(sc, IWM_DEBUG_XMIT,
1398             "%s: enabled txq %d FIFO %d\n",
1399             __func__, qid, fifo);
1400 }
1401
1402 static int
1403 iwm_post_alive(struct iwm_softc *sc)
1404 {
1405         int nwords;
1406         int error, chnl;
1407
1408         if (!iwm_nic_lock(sc))
1409                 return EBUSY;
1410
1411         if (sc->sched_base != iwm_read_prph(sc, IWM_SCD_SRAM_BASE_ADDR)) {
1412                 device_printf(sc->sc_dev,
1413                     "%s: sched addr mismatch",
1414                     __func__);
1415                 error = EINVAL;
1416                 goto out;
1417         }
1418
1419         iwm_ict_reset(sc);
1420
1421         /* Clear TX scheduler state in SRAM. */
1422         nwords = (IWM_SCD_TRANS_TBL_MEM_UPPER_BOUND -
1423             IWM_SCD_CONTEXT_MEM_LOWER_BOUND)
1424             / sizeof(uint32_t);
1425         error = iwm_write_mem(sc,
1426             sc->sched_base + IWM_SCD_CONTEXT_MEM_LOWER_BOUND,
1427             NULL, nwords);
1428         if (error)
1429                 goto out;
1430
1431         /* Set physical address of TX scheduler rings (1KB aligned). */
1432         iwm_write_prph(sc, IWM_SCD_DRAM_BASE_ADDR, sc->sched_dma.paddr >> 10);
1433
1434         iwm_write_prph(sc, IWM_SCD_CHAINEXT_EN, 0);
1435
1436         /* enable command channel */
1437         iwm_enable_txq(sc, IWM_MVM_CMD_QUEUE, 7);
1438
1439         iwm_write_prph(sc, IWM_SCD_TXFACT, 0xff);
1440
1441         /* Enable DMA channels. */
1442         for (chnl = 0; chnl < IWM_FH_TCSR_CHNL_NUM; chnl++) {
1443                 IWM_WRITE(sc, IWM_FH_TCSR_CHNL_TX_CONFIG_REG(chnl),
1444                     IWM_FH_TCSR_TX_CONFIG_REG_VAL_DMA_CHNL_ENABLE |
1445                     IWM_FH_TCSR_TX_CONFIG_REG_VAL_DMA_CREDIT_ENABLE);
1446         }
1447
1448         IWM_SETBITS(sc, IWM_FH_TX_CHICKEN_BITS_REG,
1449             IWM_FH_TX_CHICKEN_BITS_SCD_AUTO_RETRY_EN);
1450
1451         /* Enable L1-Active */
1452         iwm_clear_bits_prph(sc, IWM_APMG_PCIDEV_STT_REG,
1453             IWM_APMG_PCIDEV_STT_VAL_L1_ACT_DIS);
1454
1455  out:
1456         iwm_nic_unlock(sc);
1457         return error;
1458 }
1459
1460 /*
1461  * NVM read access and content parsing.  We do not support
1462  * external NVM or writing NVM.
1463  * iwlwifi/mvm/nvm.c
1464  */
1465
1466 /* list of NVM sections we are allowed/need to read */
1467 const int nvm_to_read[] = {
1468         IWM_NVM_SECTION_TYPE_HW,
1469         IWM_NVM_SECTION_TYPE_SW,
1470         IWM_NVM_SECTION_TYPE_CALIBRATION,
1471         IWM_NVM_SECTION_TYPE_PRODUCTION,
1472 };
1473
1474 /* Default NVM size to read */
1475 #define IWM_NVM_DEFAULT_CHUNK_SIZE (2*1024)
1476 #define IWM_MAX_NVM_SECTION_SIZE 7000
1477
1478 #define IWM_NVM_WRITE_OPCODE 1
1479 #define IWM_NVM_READ_OPCODE 0
1480
1481 static int
1482 iwm_nvm_read_chunk(struct iwm_softc *sc, uint16_t section,
1483         uint16_t offset, uint16_t length, uint8_t *data, uint16_t *len)
1484 {
1485         offset = 0;
1486         struct iwm_nvm_access_cmd nvm_access_cmd = {
1487                 .offset = htole16(offset),
1488                 .length = htole16(length),
1489                 .type = htole16(section),
1490                 .op_code = IWM_NVM_READ_OPCODE,
1491         };
1492         struct iwm_nvm_access_resp *nvm_resp;
1493         struct iwm_rx_packet *pkt;
1494         struct iwm_host_cmd cmd = {
1495                 .id = IWM_NVM_ACCESS_CMD,
1496                 .flags = IWM_CMD_SYNC | IWM_CMD_WANT_SKB |
1497                     IWM_CMD_SEND_IN_RFKILL,
1498                 .data = { &nvm_access_cmd, },
1499         };
1500         int ret, bytes_read, offset_read;
1501         uint8_t *resp_data;
1502
1503         cmd.len[0] = sizeof(struct iwm_nvm_access_cmd);
1504
1505         ret = iwm_send_cmd(sc, &cmd);
1506         if (ret)
1507                 return ret;
1508
1509         pkt = cmd.resp_pkt;
1510         if (pkt->hdr.flags & IWM_CMD_FAILED_MSK) {
1511                 device_printf(sc->sc_dev,
1512                     "%s: Bad return from IWM_NVM_ACCES_COMMAND (0x%08X)\n",
1513                     __func__, pkt->hdr.flags);
1514                 ret = EIO;
1515                 goto exit;
1516         }
1517
1518         /* Extract NVM response */
1519         nvm_resp = (void *)pkt->data;
1520
1521         ret = le16toh(nvm_resp->status);
1522         bytes_read = le16toh(nvm_resp->length);
1523         offset_read = le16toh(nvm_resp->offset);
1524         resp_data = nvm_resp->data;
1525         if (ret) {
1526                 device_printf(sc->sc_dev,
1527                     "%s: NVM access command failed with status %d\n",
1528                     __func__, ret);
1529                 ret = EINVAL;
1530                 goto exit;
1531         }
1532
1533         if (offset_read != offset) {
1534                 device_printf(sc->sc_dev,
1535                     "%s: NVM ACCESS response with invalid offset %d\n",
1536                     __func__, offset_read);
1537                 ret = EINVAL;
1538                 goto exit;
1539         }
1540
1541         memcpy(data + offset, resp_data, bytes_read);
1542         *len = bytes_read;
1543
1544  exit:
1545         iwm_free_resp(sc, &cmd);
1546         return ret;
1547 }
1548
1549 /*
1550  * Reads an NVM section completely.
1551  * NICs prior to 7000 family doesn't have a real NVM, but just read
1552  * section 0 which is the EEPROM. Because the EEPROM reading is unlimited
1553  * by uCode, we need to manually check in this case that we don't
1554  * overflow and try to read more than the EEPROM size.
1555  * For 7000 family NICs, we supply the maximal size we can read, and
1556  * the uCode fills the response with as much data as we can,
1557  * without overflowing, so no check is needed.
1558  */
1559 static int
1560 iwm_nvm_read_section(struct iwm_softc *sc,
1561         uint16_t section, uint8_t *data, uint16_t *len)
1562 {
1563         uint16_t length, seglen;
1564         int error;
1565
1566         /* Set nvm section read length */
1567         length = seglen = IWM_NVM_DEFAULT_CHUNK_SIZE;
1568         *len = 0;
1569
1570         /* Read the NVM until exhausted (reading less than requested) */
1571         while (seglen == length) {
1572                 error = iwm_nvm_read_chunk(sc,
1573                     section, *len, length, data, &seglen);
1574                 if (error) {
1575                         device_printf(sc->sc_dev,
1576                             "Cannot read NVM from section "
1577                             "%d offset %d, length %d\n",
1578                             section, *len, length);
1579                         return error;
1580                 }
1581                 *len += seglen;
1582         }
1583
1584         IWM_DPRINTF(sc, IWM_DEBUG_RESET,
1585             "NVM section %d read completed\n", section);
1586         return 0;
1587 }
1588
1589 /*
1590  * BEGIN IWM_NVM_PARSE
1591  */
1592
1593 /* iwlwifi/iwl-nvm-parse.c */
1594
1595 /* NVM offsets (in words) definitions */
1596 enum wkp_nvm_offsets {
1597         /* NVM HW-Section offset (in words) definitions */
1598         IWM_HW_ADDR = 0x15,
1599
1600 /* NVM SW-Section offset (in words) definitions */
1601         IWM_NVM_SW_SECTION = 0x1C0,
1602         IWM_NVM_VERSION = 0,
1603         IWM_RADIO_CFG = 1,
1604         IWM_SKU = 2,
1605         IWM_N_HW_ADDRS = 3,
1606         IWM_NVM_CHANNELS = 0x1E0 - IWM_NVM_SW_SECTION,
1607
1608 /* NVM calibration section offset (in words) definitions */
1609         IWM_NVM_CALIB_SECTION = 0x2B8,
1610         IWM_XTAL_CALIB = 0x316 - IWM_NVM_CALIB_SECTION
1611 };
1612
1613 /* SKU Capabilities (actual values from NVM definition) */
1614 enum nvm_sku_bits {
1615         IWM_NVM_SKU_CAP_BAND_24GHZ      = (1 << 0),
1616         IWM_NVM_SKU_CAP_BAND_52GHZ      = (1 << 1),
1617         IWM_NVM_SKU_CAP_11N_ENABLE      = (1 << 2),
1618         IWM_NVM_SKU_CAP_11AC_ENABLE     = (1 << 3),
1619 };
1620
1621 /* radio config bits (actual values from NVM definition) */
1622 #define IWM_NVM_RF_CFG_DASH_MSK(x)   (x & 0x3)         /* bits 0-1   */
1623 #define IWM_NVM_RF_CFG_STEP_MSK(x)   ((x >> 2)  & 0x3) /* bits 2-3   */
1624 #define IWM_NVM_RF_CFG_TYPE_MSK(x)   ((x >> 4)  & 0x3) /* bits 4-5   */
1625 #define IWM_NVM_RF_CFG_PNUM_MSK(x)   ((x >> 6)  & 0x3) /* bits 6-7   */
1626 #define IWM_NVM_RF_CFG_TX_ANT_MSK(x) ((x >> 8)  & 0xF) /* bits 8-11  */
1627 #define IWM_NVM_RF_CFG_RX_ANT_MSK(x) ((x >> 12) & 0xF) /* bits 12-15 */
1628
1629 #define DEFAULT_MAX_TX_POWER 16
1630
1631 /**
1632  * enum iwm_nvm_channel_flags - channel flags in NVM
1633  * @IWM_NVM_CHANNEL_VALID: channel is usable for this SKU/geo
1634  * @IWM_NVM_CHANNEL_IBSS: usable as an IBSS channel
1635  * @IWM_NVM_CHANNEL_ACTIVE: active scanning allowed
1636  * @IWM_NVM_CHANNEL_RADAR: radar detection required
1637  * @IWM_NVM_CHANNEL_DFS: dynamic freq selection candidate
1638  * @IWM_NVM_CHANNEL_WIDE: 20 MHz channel okay (?)
1639  * @IWM_NVM_CHANNEL_40MHZ: 40 MHz channel okay (?)
1640  * @IWM_NVM_CHANNEL_80MHZ: 80 MHz channel okay (?)
1641  * @IWM_NVM_CHANNEL_160MHZ: 160 MHz channel okay (?)
1642  */
1643 enum iwm_nvm_channel_flags {
1644         IWM_NVM_CHANNEL_VALID = (1 << 0),
1645         IWM_NVM_CHANNEL_IBSS = (1 << 1),
1646         IWM_NVM_CHANNEL_ACTIVE = (1 << 3),
1647         IWM_NVM_CHANNEL_RADAR = (1 << 4),
1648         IWM_NVM_CHANNEL_DFS = (1 << 7),
1649         IWM_NVM_CHANNEL_WIDE = (1 << 8),
1650         IWM_NVM_CHANNEL_40MHZ = (1 << 9),
1651         IWM_NVM_CHANNEL_80MHZ = (1 << 10),
1652         IWM_NVM_CHANNEL_160MHZ = (1 << 11),
1653 };
1654
1655 /*
1656  * Add a channel to the net80211 channel list.
1657  *
1658  * ieee is the ieee channel number
1659  * ch_idx is channel index.
1660  * mode is the channel mode - CHAN_A, CHAN_B, CHAN_G.
1661  * ch_flags is the iwm channel flags.
1662  *
1663  * Return 0 on OK, < 0 on error.
1664  */
1665 static int
1666 iwm_init_net80211_channel(struct iwm_softc *sc, int ieee, int ch_idx,
1667     int mode, uint16_t ch_flags)
1668 {
1669         /* XXX for now, no overflow checking! */
1670         struct ieee80211com *ic = &sc->sc_ic;
1671         int is_5ghz, flags;
1672         struct ieee80211_channel *channel;
1673
1674         channel = &ic->ic_channels[ic->ic_nchans++];
1675         channel->ic_ieee = ieee;
1676
1677         is_5ghz = ch_idx >= IWM_NUM_2GHZ_CHANNELS;
1678         if (!is_5ghz) {
1679                 flags = IEEE80211_CHAN_2GHZ;
1680                 channel->ic_flags = mode;
1681         } else {
1682                 flags = IEEE80211_CHAN_5GHZ;
1683                 channel->ic_flags = mode;
1684         }
1685         channel->ic_freq = ieee80211_ieee2mhz(ieee, flags);
1686
1687         if (!(ch_flags & IWM_NVM_CHANNEL_ACTIVE))
1688                 channel->ic_flags |= IEEE80211_CHAN_PASSIVE;
1689         return (0);
1690 }
1691
1692 static void
1693 iwm_init_channel_map(struct iwm_softc *sc, const uint16_t * const nvm_ch_flags)
1694 {
1695         struct ieee80211com *ic = &sc->sc_ic;
1696         struct iwm_nvm_data *data = &sc->sc_nvm;
1697         int ch_idx;
1698         uint16_t ch_flags;
1699         int hw_value;
1700
1701         for (ch_idx = 0; ch_idx < nitems(iwm_nvm_channels); ch_idx++) {
1702                 ch_flags = le16_to_cpup(nvm_ch_flags + ch_idx);
1703
1704                 if (ch_idx >= IWM_NUM_2GHZ_CHANNELS &&
1705                     !data->sku_cap_band_52GHz_enable)
1706                         ch_flags &= ~IWM_NVM_CHANNEL_VALID;
1707
1708                 if (!(ch_flags & IWM_NVM_CHANNEL_VALID)) {
1709                         IWM_DPRINTF(sc, IWM_DEBUG_EEPROM,
1710                             "Ch. %d Flags %x [%sGHz] - No traffic\n",
1711                             iwm_nvm_channels[ch_idx],
1712                             ch_flags,
1713                             (ch_idx >= IWM_NUM_2GHZ_CHANNELS) ?
1714                             "5.2" : "2.4");
1715                         continue;
1716                 }
1717
1718                 hw_value = iwm_nvm_channels[ch_idx];
1719
1720                 /* 5GHz? */
1721                 if (ch_idx >= IWM_NUM_2GHZ_CHANNELS) {
1722                         (void) iwm_init_net80211_channel(sc, hw_value,
1723                             ch_idx,
1724                             IEEE80211_CHAN_A,
1725                             ch_flags);
1726                 } else {
1727                         (void) iwm_init_net80211_channel(sc, hw_value,
1728                             ch_idx,
1729                             IEEE80211_CHAN_B,
1730                             ch_flags);
1731                         /* If it's not channel 13, also add 11g */
1732                         if (hw_value != 13)
1733                                 (void) iwm_init_net80211_channel(sc, hw_value,
1734                                     ch_idx,
1735                                     IEEE80211_CHAN_G,
1736                                     ch_flags);
1737                 }
1738
1739                 IWM_DPRINTF(sc, IWM_DEBUG_EEPROM,
1740                     "Ch. %d Flags %x [%sGHz] - Added\n",
1741                     iwm_nvm_channels[ch_idx],
1742                     ch_flags,
1743                     (ch_idx >= IWM_NUM_2GHZ_CHANNELS) ?
1744                     "5.2" : "2.4");
1745         }
1746         ieee80211_sort_channels(ic->ic_channels, ic->ic_nchans);
1747 }
1748
1749 static int
1750 iwm_parse_nvm_data(struct iwm_softc *sc,
1751         const uint16_t *nvm_hw, const uint16_t *nvm_sw,
1752         const uint16_t *nvm_calib, uint8_t tx_chains, uint8_t rx_chains)
1753 {
1754         struct iwm_nvm_data *data = &sc->sc_nvm;
1755         uint8_t hw_addr[IEEE80211_ADDR_LEN];
1756         uint16_t radio_cfg, sku;
1757
1758         data->nvm_version = le16_to_cpup(nvm_sw + IWM_NVM_VERSION);
1759
1760         radio_cfg = le16_to_cpup(nvm_sw + IWM_RADIO_CFG);
1761         data->radio_cfg_type = IWM_NVM_RF_CFG_TYPE_MSK(radio_cfg);
1762         data->radio_cfg_step = IWM_NVM_RF_CFG_STEP_MSK(radio_cfg);
1763         data->radio_cfg_dash = IWM_NVM_RF_CFG_DASH_MSK(radio_cfg);
1764         data->radio_cfg_pnum = IWM_NVM_RF_CFG_PNUM_MSK(radio_cfg);
1765         data->valid_tx_ant = IWM_NVM_RF_CFG_TX_ANT_MSK(radio_cfg);
1766         data->valid_rx_ant = IWM_NVM_RF_CFG_RX_ANT_MSK(radio_cfg);
1767
1768         sku = le16_to_cpup(nvm_sw + IWM_SKU);
1769         data->sku_cap_band_24GHz_enable = sku & IWM_NVM_SKU_CAP_BAND_24GHZ;
1770         data->sku_cap_band_52GHz_enable = sku & IWM_NVM_SKU_CAP_BAND_52GHZ;
1771         data->sku_cap_11n_enable = 0;
1772
1773         if (!data->valid_tx_ant || !data->valid_rx_ant) {
1774                 device_printf(sc->sc_dev,
1775                     "%s: invalid antennas (0x%x, 0x%x)\n",
1776                     __func__, data->valid_tx_ant,
1777                     data->valid_rx_ant);
1778                 return EINVAL;
1779         }
1780
1781         data->n_hw_addrs = le16_to_cpup(nvm_sw + IWM_N_HW_ADDRS);
1782
1783         data->xtal_calib[0] = *(nvm_calib + IWM_XTAL_CALIB);
1784         data->xtal_calib[1] = *(nvm_calib + IWM_XTAL_CALIB + 1);
1785
1786         /* The byte order is little endian 16 bit, meaning 214365 */
1787         IEEE80211_ADDR_COPY(hw_addr, nvm_hw + IWM_HW_ADDR);
1788         data->hw_addr[0] = hw_addr[1];
1789         data->hw_addr[1] = hw_addr[0];
1790         data->hw_addr[2] = hw_addr[3];
1791         data->hw_addr[3] = hw_addr[2];
1792         data->hw_addr[4] = hw_addr[5];
1793         data->hw_addr[5] = hw_addr[4];
1794
1795         iwm_init_channel_map(sc, &nvm_sw[IWM_NVM_CHANNELS]);
1796         data->calib_version = 255;   /* TODO:
1797                                         this value will prevent some checks from
1798                                         failing, we need to check if this
1799                                         field is still needed, and if it does,
1800                                         where is it in the NVM */
1801
1802         return 0;
1803 }
1804
1805 /*
1806  * END NVM PARSE
1807  */
1808
1809 struct iwm_nvm_section {
1810         uint16_t length;
1811         const uint8_t *data;
1812 };
1813
1814 static int
1815 iwm_parse_nvm_sections(struct iwm_softc *sc, struct iwm_nvm_section *sections)
1816 {
1817         const uint16_t *hw, *sw, *calib;
1818
1819         /* Checking for required sections */
1820         if (!sections[IWM_NVM_SECTION_TYPE_SW].data ||
1821             !sections[IWM_NVM_SECTION_TYPE_HW].data) {
1822                 device_printf(sc->sc_dev,
1823                     "%s: Can't parse empty NVM sections\n",
1824                     __func__);
1825                 return ENOENT;
1826         }
1827
1828         hw = (const uint16_t *)sections[IWM_NVM_SECTION_TYPE_HW].data;
1829         sw = (const uint16_t *)sections[IWM_NVM_SECTION_TYPE_SW].data;
1830         calib = (const uint16_t *)sections[IWM_NVM_SECTION_TYPE_CALIBRATION].data;
1831         return iwm_parse_nvm_data(sc, hw, sw, calib,
1832             IWM_FW_VALID_TX_ANT(sc), IWM_FW_VALID_RX_ANT(sc));
1833 }
1834
1835 static int
1836 iwm_nvm_init(struct iwm_softc *sc)
1837 {
1838         struct iwm_nvm_section nvm_sections[IWM_NVM_NUM_OF_SECTIONS];
1839         int i, section, error;
1840         uint16_t len;
1841         uint8_t *nvm_buffer, *temp;
1842
1843         /* Read From FW NVM */
1844         IWM_DPRINTF(sc, IWM_DEBUG_EEPROM,
1845             "%s: Read NVM\n",
1846             __func__);
1847
1848         /* TODO: find correct NVM max size for a section */
1849         nvm_buffer = malloc(IWM_OTP_LOW_IMAGE_SIZE, M_DEVBUF, M_NOWAIT);
1850         if (nvm_buffer == NULL)
1851                 return (ENOMEM);
1852         for (i = 0; i < nitems(nvm_to_read); i++) {
1853                 section = nvm_to_read[i];
1854                 KASSERT(section <= nitems(nvm_sections),
1855                     ("too many sections"));
1856
1857                 error = iwm_nvm_read_section(sc, section, nvm_buffer, &len);
1858                 if (error)
1859                         break;
1860
1861                 temp = malloc(len, M_DEVBUF, M_NOWAIT);
1862                 if (temp == NULL) {
1863                         error = ENOMEM;
1864                         break;
1865                 }
1866                 memcpy(temp, nvm_buffer, len);
1867                 nvm_sections[section].data = temp;
1868                 nvm_sections[section].length = len;
1869         }
1870         free(nvm_buffer, M_DEVBUF);
1871         if (error)
1872                 return error;
1873
1874         return iwm_parse_nvm_sections(sc, nvm_sections);
1875 }
1876
1877 /*
1878  * Firmware loading gunk.  This is kind of a weird hybrid between the
1879  * iwn driver and the Linux iwlwifi driver.
1880  */
1881
1882 static int
1883 iwm_firmware_load_chunk(struct iwm_softc *sc, uint32_t dst_addr,
1884         const uint8_t *section, uint32_t byte_cnt)
1885 {
1886         struct iwm_dma_info *dma = &sc->fw_dma;
1887         int error;
1888
1889         /* Copy firmware section into pre-allocated DMA-safe memory. */
1890         memcpy(dma->vaddr, section, byte_cnt);
1891         bus_dmamap_sync(dma->tag, dma->map, BUS_DMASYNC_PREWRITE);
1892
1893         if (!iwm_nic_lock(sc))
1894                 return EBUSY;
1895
1896         sc->sc_fw_chunk_done = 0;
1897
1898         IWM_WRITE(sc, IWM_FH_TCSR_CHNL_TX_CONFIG_REG(IWM_FH_SRVC_CHNL),
1899             IWM_FH_TCSR_TX_CONFIG_REG_VAL_DMA_CHNL_PAUSE);
1900         IWM_WRITE(sc, IWM_FH_SRVC_CHNL_SRAM_ADDR_REG(IWM_FH_SRVC_CHNL),
1901             dst_addr);
1902         IWM_WRITE(sc, IWM_FH_TFDIB_CTRL0_REG(IWM_FH_SRVC_CHNL),
1903             dma->paddr & IWM_FH_MEM_TFDIB_DRAM_ADDR_LSB_MSK);
1904         IWM_WRITE(sc, IWM_FH_TFDIB_CTRL1_REG(IWM_FH_SRVC_CHNL),
1905             (iwm_get_dma_hi_addr(dma->paddr)
1906               << IWM_FH_MEM_TFDIB_REG1_ADDR_BITSHIFT) | byte_cnt);
1907         IWM_WRITE(sc, IWM_FH_TCSR_CHNL_TX_BUF_STS_REG(IWM_FH_SRVC_CHNL),
1908             1 << IWM_FH_TCSR_CHNL_TX_BUF_STS_REG_POS_TB_NUM |
1909             1 << IWM_FH_TCSR_CHNL_TX_BUF_STS_REG_POS_TB_IDX |
1910             IWM_FH_TCSR_CHNL_TX_BUF_STS_REG_VAL_TFDB_VALID);
1911         IWM_WRITE(sc, IWM_FH_TCSR_CHNL_TX_CONFIG_REG(IWM_FH_SRVC_CHNL),
1912             IWM_FH_TCSR_TX_CONFIG_REG_VAL_DMA_CHNL_ENABLE    |
1913             IWM_FH_TCSR_TX_CONFIG_REG_VAL_DMA_CREDIT_DISABLE |
1914             IWM_FH_TCSR_TX_CONFIG_REG_VAL_CIRQ_HOST_ENDTFD);
1915
1916         iwm_nic_unlock(sc);
1917
1918         /* wait 1s for this segment to load */
1919         while (!sc->sc_fw_chunk_done)
1920                 if ((error = msleep(&sc->sc_fw, &sc->sc_mtx, 0, "iwmfw", hz)) != 0)
1921                         break;
1922
1923         return error;
1924 }
1925
1926 static int
1927 iwm_load_firmware(struct iwm_softc *sc, enum iwm_ucode_type ucode_type)
1928 {
1929         struct iwm_fw_sects *fws;
1930         int error, i, w;
1931         const void *data;
1932         uint32_t dlen;
1933         uint32_t offset;
1934
1935         sc->sc_uc.uc_intr = 0;
1936
1937         fws = &sc->sc_fw.fw_sects[ucode_type];
1938         for (i = 0; i < fws->fw_count; i++) {
1939                 data = fws->fw_sect[i].fws_data;
1940                 dlen = fws->fw_sect[i].fws_len;
1941                 offset = fws->fw_sect[i].fws_devoff;
1942                 IWM_DPRINTF(sc, IWM_DEBUG_FIRMWARE_TLV,
1943                     "LOAD FIRMWARE type %d offset %u len %d\n",
1944                     ucode_type, offset, dlen);
1945                 error = iwm_firmware_load_chunk(sc, offset, data, dlen);
1946                 if (error) {
1947                         device_printf(sc->sc_dev,
1948                             "%s: chunk %u of %u returned error %02d\n",
1949                             __func__, i, fws->fw_count, error);
1950                         return error;
1951                 }
1952         }
1953
1954         /* wait for the firmware to load */
1955         IWM_WRITE(sc, IWM_CSR_RESET, 0);
1956
1957         for (w = 0; !sc->sc_uc.uc_intr && w < 10; w++) {
1958                 error = msleep(&sc->sc_uc, &sc->sc_mtx, 0, "iwmuc", hz/10);
1959         }
1960
1961         return error;
1962 }
1963
1964 /* iwlwifi: pcie/trans.c */
1965 static int
1966 iwm_start_fw(struct iwm_softc *sc, enum iwm_ucode_type ucode_type)
1967 {
1968         int error;
1969
1970         IWM_WRITE(sc, IWM_CSR_INT, ~0);
1971
1972         if ((error = iwm_nic_init(sc)) != 0) {
1973                 device_printf(sc->sc_dev, "unable to init nic\n");
1974                 return error;
1975         }
1976
1977         /* make sure rfkill handshake bits are cleared */
1978         IWM_WRITE(sc, IWM_CSR_UCODE_DRV_GP1_CLR, IWM_CSR_UCODE_SW_BIT_RFKILL);
1979         IWM_WRITE(sc, IWM_CSR_UCODE_DRV_GP1_CLR,
1980             IWM_CSR_UCODE_DRV_GP1_BIT_CMD_BLOCKED);
1981
1982         /* clear (again), then enable host interrupts */
1983         IWM_WRITE(sc, IWM_CSR_INT, ~0);
1984         iwm_enable_interrupts(sc);
1985
1986         /* really make sure rfkill handshake bits are cleared */
1987         /* maybe we should write a few times more?  just to make sure */
1988         IWM_WRITE(sc, IWM_CSR_UCODE_DRV_GP1_CLR, IWM_CSR_UCODE_SW_BIT_RFKILL);
1989         IWM_WRITE(sc, IWM_CSR_UCODE_DRV_GP1_CLR, IWM_CSR_UCODE_SW_BIT_RFKILL);
1990
1991         /* Load the given image to the HW */
1992         return iwm_load_firmware(sc, ucode_type);
1993 }
1994
1995 static int
1996 iwm_fw_alive(struct iwm_softc *sc, uint32_t sched_base)
1997 {
1998         return iwm_post_alive(sc);
1999 }
2000
2001 static int
2002 iwm_send_tx_ant_cfg(struct iwm_softc *sc, uint8_t valid_tx_ant)
2003 {
2004         struct iwm_tx_ant_cfg_cmd tx_ant_cmd = {
2005                 .valid = htole32(valid_tx_ant),
2006         };
2007
2008         return iwm_mvm_send_cmd_pdu(sc, IWM_TX_ANT_CONFIGURATION_CMD,
2009             IWM_CMD_SYNC, sizeof(tx_ant_cmd), &tx_ant_cmd);
2010 }
2011
2012 /* iwlwifi: mvm/fw.c */
2013 static int
2014 iwm_send_phy_cfg_cmd(struct iwm_softc *sc)
2015 {
2016         struct iwm_phy_cfg_cmd phy_cfg_cmd;
2017         enum iwm_ucode_type ucode_type = sc->sc_uc_current;
2018
2019         /* Set parameters */
2020         phy_cfg_cmd.phy_cfg = htole32(sc->sc_fw_phy_config);
2021         phy_cfg_cmd.calib_control.event_trigger =
2022             sc->sc_default_calib[ucode_type].event_trigger;
2023         phy_cfg_cmd.calib_control.flow_trigger =
2024             sc->sc_default_calib[ucode_type].flow_trigger;
2025
2026         IWM_DPRINTF(sc, IWM_DEBUG_CMD | IWM_DEBUG_RESET,
2027             "Sending Phy CFG command: 0x%x\n", phy_cfg_cmd.phy_cfg);
2028         return iwm_mvm_send_cmd_pdu(sc, IWM_PHY_CONFIGURATION_CMD, IWM_CMD_SYNC,
2029             sizeof(phy_cfg_cmd), &phy_cfg_cmd);
2030 }
2031
2032 static int
2033 iwm_mvm_load_ucode_wait_alive(struct iwm_softc *sc,
2034         enum iwm_ucode_type ucode_type)
2035 {
2036         enum iwm_ucode_type old_type = sc->sc_uc_current;
2037         int error;
2038
2039         if ((error = iwm_read_firmware(sc, ucode_type)) != 0)
2040                 return error;
2041
2042         sc->sc_uc_current = ucode_type;
2043         error = iwm_start_fw(sc, ucode_type);
2044         if (error) {
2045                 sc->sc_uc_current = old_type;
2046                 return error;
2047         }
2048
2049         return iwm_fw_alive(sc, sc->sched_base);
2050 }
2051
2052 /*
2053  * mvm misc bits
2054  */
2055
2056 /*
2057  * follows iwlwifi/fw.c
2058  */
2059 static int
2060 iwm_run_init_mvm_ucode(struct iwm_softc *sc, int justnvm)
2061 {
2062         int error;
2063
2064         /* do not operate with rfkill switch turned on */
2065         if ((sc->sc_flags & IWM_FLAG_RFKILL) && !justnvm) {
2066                 device_printf(sc->sc_dev,
2067                     "radio is disabled by hardware switch\n");
2068                 return EPERM;
2069         }
2070
2071         sc->sc_init_complete = 0;
2072         if ((error = iwm_mvm_load_ucode_wait_alive(sc,
2073             IWM_UCODE_TYPE_INIT)) != 0)
2074                 return error;
2075
2076         if (justnvm) {
2077                 if ((error = iwm_nvm_init(sc)) != 0) {
2078                         device_printf(sc->sc_dev, "failed to read nvm\n");
2079                         return error;
2080                 }
2081                 IEEE80211_ADDR_COPY(sc->sc_ic.ic_macaddr, sc->sc_nvm.hw_addr);
2082
2083                 sc->sc_scan_cmd_len = sizeof(struct iwm_scan_cmd)
2084                     + sc->sc_capa_max_probe_len
2085                     + IWM_MAX_NUM_SCAN_CHANNELS
2086                     * sizeof(struct iwm_scan_channel);
2087                 sc->sc_scan_cmd = malloc(sc->sc_scan_cmd_len, M_DEVBUF,
2088                     M_NOWAIT);
2089                 if (sc->sc_scan_cmd == NULL)
2090                         return (ENOMEM);
2091
2092                 return 0;
2093         }
2094
2095         /* Send TX valid antennas before triggering calibrations */
2096         if ((error = iwm_send_tx_ant_cfg(sc, IWM_FW_VALID_TX_ANT(sc))) != 0)
2097                 return error;
2098
2099         /*
2100         * Send phy configurations command to init uCode
2101         * to start the 16.0 uCode init image internal calibrations.
2102         */
2103         if ((error = iwm_send_phy_cfg_cmd(sc)) != 0 ) {
2104                 device_printf(sc->sc_dev,
2105                     "%s: failed to run internal calibration: %d\n",
2106                     __func__, error);
2107                 return error;
2108         }
2109
2110         /*
2111          * Nothing to do but wait for the init complete notification
2112          * from the firmware
2113          */
2114         while (!sc->sc_init_complete)
2115                 if ((error = msleep(&sc->sc_init_complete, &sc->sc_mtx,
2116                     0, "iwminit", 2*hz)) != 0)
2117                         break;
2118
2119         return error;
2120 }
2121
2122 /*
2123  * receive side
2124  */
2125
2126 /* (re)stock rx ring, called at init-time and at runtime */
2127 static int
2128 iwm_rx_addbuf(struct iwm_softc *sc, int size, int idx)
2129 {
2130         struct iwm_rx_ring *ring = &sc->rxq;
2131         struct iwm_rx_data *data = &ring->data[idx];
2132         struct mbuf *m;
2133         int error;
2134         bus_addr_t paddr;
2135
2136         m = m_getjcl(M_NOWAIT, MT_DATA, M_PKTHDR, IWM_RBUF_SIZE);
2137         if (m == NULL)
2138                 return ENOBUFS;
2139
2140         if (data->m != NULL)
2141                 bus_dmamap_unload(ring->data_dmat, data->map);
2142
2143         m->m_len = m->m_pkthdr.len = m->m_ext.ext_size;
2144         error = bus_dmamap_create(ring->data_dmat, 0, &data->map);
2145         if (error != 0) {
2146                 device_printf(sc->sc_dev,
2147                     "%s: could not create RX buf DMA map, error %d\n",
2148                     __func__, error);
2149                 goto fail;
2150         }
2151         data->m = m;
2152         error = bus_dmamap_load(ring->data_dmat, data->map,
2153             mtod(data->m, void *), IWM_RBUF_SIZE, iwm_dma_map_addr,
2154             &paddr, BUS_DMA_NOWAIT);
2155         if (error != 0 && error != EFBIG) {
2156                 device_printf(sc->sc_dev,
2157                     "%s: can't not map mbuf, error %d\n", __func__,
2158                     error);
2159                 goto fail;
2160         }
2161         bus_dmamap_sync(ring->data_dmat, data->map, BUS_DMASYNC_PREREAD);
2162
2163         /* Update RX descriptor. */
2164         ring->desc[idx] = htole32(paddr >> 8);
2165         bus_dmamap_sync(ring->desc_dma.tag, ring->desc_dma.map,
2166             BUS_DMASYNC_PREWRITE);
2167
2168         return 0;
2169 fail:
2170         return error;
2171 }
2172
2173 /* iwlwifi: mvm/rx.c */
2174 #define IWM_RSSI_OFFSET 50
2175 static int
2176 iwm_mvm_calc_rssi(struct iwm_softc *sc, struct iwm_rx_phy_info *phy_info)
2177 {
2178         int rssi_a, rssi_b, rssi_a_dbm, rssi_b_dbm, max_rssi_dbm;
2179         uint32_t agc_a, agc_b;
2180         uint32_t val;
2181
2182         val = le32toh(phy_info->non_cfg_phy[IWM_RX_INFO_AGC_IDX]);
2183         agc_a = (val & IWM_OFDM_AGC_A_MSK) >> IWM_OFDM_AGC_A_POS;
2184         agc_b = (val & IWM_OFDM_AGC_B_MSK) >> IWM_OFDM_AGC_B_POS;
2185
2186         val = le32toh(phy_info->non_cfg_phy[IWM_RX_INFO_RSSI_AB_IDX]);
2187         rssi_a = (val & IWM_OFDM_RSSI_INBAND_A_MSK) >> IWM_OFDM_RSSI_A_POS;
2188         rssi_b = (val & IWM_OFDM_RSSI_INBAND_B_MSK) >> IWM_OFDM_RSSI_B_POS;
2189
2190         /*
2191          * dBm = rssi dB - agc dB - constant.
2192          * Higher AGC (higher radio gain) means lower signal.
2193          */
2194         rssi_a_dbm = rssi_a - IWM_RSSI_OFFSET - agc_a;
2195         rssi_b_dbm = rssi_b - IWM_RSSI_OFFSET - agc_b;
2196         max_rssi_dbm = MAX(rssi_a_dbm, rssi_b_dbm);
2197
2198         IWM_DPRINTF(sc, IWM_DEBUG_RECV,
2199             "Rssi In A %d B %d Max %d AGCA %d AGCB %d\n",
2200             rssi_a_dbm, rssi_b_dbm, max_rssi_dbm, agc_a, agc_b);
2201
2202         return max_rssi_dbm;
2203 }
2204
2205 /* iwlwifi: mvm/rx.c */
2206 /*
2207  * iwm_mvm_get_signal_strength - use new rx PHY INFO API
2208  * values are reported by the fw as positive values - need to negate
2209  * to obtain their dBM.  Account for missing antennas by replacing 0
2210  * values by -256dBm: practically 0 power and a non-feasible 8 bit value.
2211  */
2212 static int
2213 iwm_mvm_get_signal_strength(struct iwm_softc *sc, struct iwm_rx_phy_info *phy_info)
2214 {
2215         int energy_a, energy_b, energy_c, max_energy;
2216         uint32_t val;
2217
2218         val = le32toh(phy_info->non_cfg_phy[IWM_RX_INFO_ENERGY_ANT_ABC_IDX]);
2219         energy_a = (val & IWM_RX_INFO_ENERGY_ANT_A_MSK) >>
2220             IWM_RX_INFO_ENERGY_ANT_A_POS;
2221         energy_a = energy_a ? -energy_a : -256;
2222         energy_b = (val & IWM_RX_INFO_ENERGY_ANT_B_MSK) >>
2223             IWM_RX_INFO_ENERGY_ANT_B_POS;
2224         energy_b = energy_b ? -energy_b : -256;
2225         energy_c = (val & IWM_RX_INFO_ENERGY_ANT_C_MSK) >>
2226             IWM_RX_INFO_ENERGY_ANT_C_POS;
2227         energy_c = energy_c ? -energy_c : -256;
2228         max_energy = MAX(energy_a, energy_b);
2229         max_energy = MAX(max_energy, energy_c);
2230
2231         IWM_DPRINTF(sc, IWM_DEBUG_RECV,
2232             "energy In A %d B %d C %d , and max %d\n",
2233             energy_a, energy_b, energy_c, max_energy);
2234
2235         return max_energy;
2236 }
2237
2238 static void
2239 iwm_mvm_rx_rx_phy_cmd(struct iwm_softc *sc,
2240         struct iwm_rx_packet *pkt, struct iwm_rx_data *data)
2241 {
2242         struct iwm_rx_phy_info *phy_info = (void *)pkt->data;
2243
2244         IWM_DPRINTF(sc, IWM_DEBUG_RECV, "received PHY stats\n");
2245         bus_dmamap_sync(sc->rxq.data_dmat, data->map, BUS_DMASYNC_POSTREAD);
2246
2247         memcpy(&sc->sc_last_phy_info, phy_info, sizeof(sc->sc_last_phy_info));
2248 }
2249
2250 /*
2251  * Retrieve the average noise (in dBm) among receivers.
2252  */
2253 static int
2254 iwm_get_noise(const struct iwm_mvm_statistics_rx_non_phy *stats)
2255 {
2256         int i, total, nbant, noise;
2257
2258         total = nbant = noise = 0;
2259         for (i = 0; i < 3; i++) {
2260                 noise = le32toh(stats->beacon_silence_rssi[i]) & 0xff;
2261                 if (noise) {
2262                         total += noise;
2263                         nbant++;
2264                 }
2265         }
2266
2267         /* There should be at least one antenna but check anyway. */
2268         return (nbant == 0) ? -127 : (total / nbant) - 107;
2269 }
2270
2271 /*
2272  * iwm_mvm_rx_rx_mpdu - IWM_REPLY_RX_MPDU_CMD handler
2273  *
2274  * Handles the actual data of the Rx packet from the fw
2275  */
2276 static void
2277 iwm_mvm_rx_rx_mpdu(struct iwm_softc *sc,
2278         struct iwm_rx_packet *pkt, struct iwm_rx_data *data)
2279 {
2280         struct ieee80211com *ic = &sc->sc_ic;
2281         struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps);
2282         struct ieee80211_frame *wh;
2283         struct ieee80211_node *ni;
2284         struct ieee80211_rx_stats rxs;
2285         struct mbuf *m;
2286         struct iwm_rx_phy_info *phy_info;
2287         struct iwm_rx_mpdu_res_start *rx_res;
2288         uint32_t len;
2289         uint32_t rx_pkt_status;
2290         int rssi;
2291
2292         bus_dmamap_sync(sc->rxq.data_dmat, data->map, BUS_DMASYNC_POSTREAD);
2293
2294         phy_info = &sc->sc_last_phy_info;
2295         rx_res = (struct iwm_rx_mpdu_res_start *)pkt->data;
2296         wh = (struct ieee80211_frame *)(pkt->data + sizeof(*rx_res));
2297         len = le16toh(rx_res->byte_count);
2298         rx_pkt_status = le32toh(*(uint32_t *)(pkt->data + sizeof(*rx_res) + len));
2299
2300         m = data->m;
2301         m->m_data = pkt->data + sizeof(*rx_res);
2302         m->m_pkthdr.len = m->m_len = len;
2303
2304         if (__predict_false(phy_info->cfg_phy_cnt > 20)) {
2305                 device_printf(sc->sc_dev,
2306                     "dsp size out of range [0,20]: %d\n",
2307                     phy_info->cfg_phy_cnt);
2308                 return;
2309         }
2310
2311         if (!(rx_pkt_status & IWM_RX_MPDU_RES_STATUS_CRC_OK) ||
2312             !(rx_pkt_status & IWM_RX_MPDU_RES_STATUS_OVERRUN_OK)) {
2313                 IWM_DPRINTF(sc, IWM_DEBUG_RECV,
2314                     "Bad CRC or FIFO: 0x%08X.\n", rx_pkt_status);
2315                 return; /* drop */
2316         }
2317
2318         if (sc->sc_capaflags & IWM_UCODE_TLV_FLAGS_RX_ENERGY_API) {
2319                 rssi = iwm_mvm_get_signal_strength(sc, phy_info);
2320         } else {
2321                 rssi = iwm_mvm_calc_rssi(sc, phy_info);
2322         }
2323         rssi = (0 - IWM_MIN_DBM) + rssi;        /* normalize */
2324         rssi = MIN(rssi, sc->sc_max_rssi);      /* clip to max. 100% */
2325
2326         /* replenish ring for the buffer we're going to feed to the sharks */
2327         if (iwm_rx_addbuf(sc, IWM_RBUF_SIZE, sc->rxq.cur) != 0) {
2328                 device_printf(sc->sc_dev, "%s: unable to add more buffers\n",
2329                     __func__);
2330                 return;
2331         }
2332
2333         ni = ieee80211_find_rxnode(ic, (struct ieee80211_frame_min *)wh);
2334
2335         IWM_DPRINTF(sc, IWM_DEBUG_RECV,
2336             "%s: phy_info: channel=%d, flags=0x%08x\n",
2337             __func__,
2338             le16toh(phy_info->channel),
2339             le16toh(phy_info->phy_flags));
2340
2341         /*
2342          * Populate an RX state struct with the provided information.
2343          */
2344         bzero(&rxs, sizeof(rxs));
2345         rxs.r_flags |= IEEE80211_R_IEEE | IEEE80211_R_FREQ;
2346         rxs.r_flags |= IEEE80211_R_NF | IEEE80211_R_RSSI;
2347         rxs.c_ieee = le16toh(phy_info->channel);
2348         if (le16toh(phy_info->phy_flags & IWM_RX_RES_PHY_FLAGS_BAND_24)) {
2349                 rxs.c_freq = ieee80211_ieee2mhz(rxs.c_ieee, IEEE80211_CHAN_2GHZ);
2350         } else {
2351                 rxs.c_freq = ieee80211_ieee2mhz(rxs.c_ieee, IEEE80211_CHAN_5GHZ);
2352         }
2353         rxs.rssi = rssi - sc->sc_noise;
2354         rxs.nf = sc->sc_noise;
2355
2356         if (ieee80211_radiotap_active_vap(vap)) {
2357                 struct iwm_rx_radiotap_header *tap = &sc->sc_rxtap;
2358
2359                 tap->wr_flags = 0;
2360                 if (phy_info->phy_flags & htole16(IWM_PHY_INFO_FLAG_SHPREAMBLE))
2361                         tap->wr_flags |= IEEE80211_RADIOTAP_F_SHORTPRE;
2362                 tap->wr_chan_freq = htole16(rxs.c_freq);
2363                 /* XXX only if ic->ic_curchan->ic_ieee == rxs.c_ieee */
2364                 tap->wr_chan_flags = htole16(ic->ic_curchan->ic_flags);
2365                 tap->wr_dbm_antsignal = (int8_t)rssi;
2366                 tap->wr_dbm_antnoise = (int8_t)sc->sc_noise;
2367                 tap->wr_tsft = phy_info->system_timestamp;
2368                 switch (phy_info->rate) {
2369                 /* CCK rates. */
2370                 case  10: tap->wr_rate =   2; break;
2371                 case  20: tap->wr_rate =   4; break;
2372                 case  55: tap->wr_rate =  11; break;
2373                 case 110: tap->wr_rate =  22; break;
2374                 /* OFDM rates. */
2375                 case 0xd: tap->wr_rate =  12; break;
2376                 case 0xf: tap->wr_rate =  18; break;
2377                 case 0x5: tap->wr_rate =  24; break;
2378                 case 0x7: tap->wr_rate =  36; break;
2379                 case 0x9: tap->wr_rate =  48; break;
2380                 case 0xb: tap->wr_rate =  72; break;
2381                 case 0x1: tap->wr_rate =  96; break;
2382                 case 0x3: tap->wr_rate = 108; break;
2383                 /* Unknown rate: should not happen. */
2384                 default:  tap->wr_rate =   0;
2385                 }
2386         }
2387
2388         IWM_UNLOCK(sc);
2389         if (ni != NULL) {
2390                 IWM_DPRINTF(sc, IWM_DEBUG_RECV, "input m %p\n", m);
2391                 ieee80211_input_mimo(ni, m, &rxs);
2392                 ieee80211_free_node(ni);
2393         } else {
2394                 IWM_DPRINTF(sc, IWM_DEBUG_RECV, "inputall m %p\n", m);
2395                 ieee80211_input_mimo_all(ic, m, &rxs);
2396         }
2397         IWM_LOCK(sc);
2398 }
2399
2400 static int
2401 iwm_mvm_rx_tx_cmd_single(struct iwm_softc *sc, struct iwm_rx_packet *pkt,
2402         struct iwm_node *in)
2403 {
2404         struct iwm_mvm_tx_resp *tx_resp = (void *)pkt->data;
2405         struct ieee80211_node *ni = &in->in_ni;
2406         struct ieee80211vap *vap = ni->ni_vap;
2407         int status = le16toh(tx_resp->status.status) & IWM_TX_STATUS_MSK;
2408         int failack = tx_resp->failure_frame;
2409
2410         KASSERT(tx_resp->frame_count == 1, ("too many frames"));
2411
2412         /* Update rate control statistics. */
2413         if (status != IWM_TX_STATUS_SUCCESS &&
2414             status != IWM_TX_STATUS_DIRECT_DONE) {
2415                 ieee80211_ratectl_tx_complete(vap, ni,
2416                     IEEE80211_RATECTL_TX_FAILURE, &failack, NULL);
2417                 return (1);
2418         } else {
2419                 ieee80211_ratectl_tx_complete(vap, ni,
2420                     IEEE80211_RATECTL_TX_SUCCESS, &failack, NULL);
2421                 return (0);
2422         }
2423 }
2424
2425 static void
2426 iwm_mvm_rx_tx_cmd(struct iwm_softc *sc,
2427         struct iwm_rx_packet *pkt, struct iwm_rx_data *data)
2428 {
2429         struct iwm_cmd_header *cmd_hdr = &pkt->hdr;
2430         int idx = cmd_hdr->idx;
2431         int qid = cmd_hdr->qid;
2432         struct iwm_tx_ring *ring = &sc->txq[qid];
2433         struct iwm_tx_data *txd = &ring->data[idx];
2434         struct iwm_node *in = txd->in;
2435         struct mbuf *m = txd->m;
2436         int status;
2437
2438         KASSERT(txd->done == 0, ("txd not done"));
2439         KASSERT(txd->in != NULL, ("txd without node"));
2440         KASSERT(txd->m != NULL, ("txd without mbuf"));
2441
2442         bus_dmamap_sync(ring->data_dmat, data->map, BUS_DMASYNC_POSTREAD);
2443
2444         sc->sc_tx_timer = 0;
2445
2446         status = iwm_mvm_rx_tx_cmd_single(sc, pkt, in);
2447
2448         /* Unmap and free mbuf. */
2449         bus_dmamap_sync(ring->data_dmat, txd->map, BUS_DMASYNC_POSTWRITE);
2450         bus_dmamap_unload(ring->data_dmat, txd->map);
2451
2452         IWM_DPRINTF(sc, IWM_DEBUG_XMIT,
2453             "free txd %p, in %p\n", txd, txd->in);
2454         txd->done = 1;
2455         txd->m = NULL;
2456         txd->in = NULL;
2457
2458         ieee80211_tx_complete(&in->in_ni, m, status);
2459
2460         if (--ring->queued < IWM_TX_RING_LOMARK) {
2461                 sc->qfullmsk &= ~(1 << ring->qid);
2462                 if (sc->qfullmsk == 0) {
2463                         /*
2464                          * Well, we're in interrupt context, but then again
2465                          * I guess net80211 does all sorts of stunts in
2466                          * interrupt context, so maybe this is no biggie.
2467                          */
2468                         iwm_start(sc);
2469                 }
2470         }
2471 }
2472
2473 /*
2474  * transmit side
2475  */
2476
2477 /*
2478  * Process a "command done" firmware notification.  This is where we wakeup
2479  * processes waiting for a synchronous command completion.
2480  * from if_iwn
2481  */
2482 static void
2483 iwm_cmd_done(struct iwm_softc *sc, struct iwm_rx_packet *pkt)
2484 {
2485         struct iwm_tx_ring *ring = &sc->txq[IWM_MVM_CMD_QUEUE];
2486         struct iwm_tx_data *data;
2487
2488         if (pkt->hdr.qid != IWM_MVM_CMD_QUEUE) {
2489                 return; /* Not a command ack. */
2490         }
2491
2492         data = &ring->data[pkt->hdr.idx];
2493
2494         /* If the command was mapped in an mbuf, free it. */
2495         if (data->m != NULL) {
2496                 bus_dmamap_sync(ring->data_dmat, data->map,
2497                     BUS_DMASYNC_POSTWRITE);
2498                 bus_dmamap_unload(ring->data_dmat, data->map);
2499                 m_freem(data->m);
2500                 data->m = NULL;
2501         }
2502         wakeup(&ring->desc[pkt->hdr.idx]);
2503 }
2504
2505 #if 0
2506 /*
2507  * necessary only for block ack mode
2508  */
2509 void
2510 iwm_update_sched(struct iwm_softc *sc, int qid, int idx, uint8_t sta_id,
2511         uint16_t len)
2512 {
2513         struct iwm_agn_scd_bc_tbl *scd_bc_tbl;
2514         uint16_t w_val;
2515
2516         scd_bc_tbl = sc->sched_dma.vaddr;
2517
2518         len += 8; /* magic numbers came naturally from paris */
2519         if (sc->sc_capaflags & IWM_UCODE_TLV_FLAGS_DW_BC_TABLE)
2520                 len = roundup(len, 4) / 4;
2521
2522         w_val = htole16(sta_id << 12 | len);
2523
2524         /* Update TX scheduler. */
2525         scd_bc_tbl[qid].tfd_offset[idx] = w_val;
2526         bus_dmamap_sync(sc->sched_dma.tag, sc->sched_dma.map,
2527             BUS_DMASYNC_PREWRITE);
2528
2529         /* I really wonder what this is ?!? */
2530         if (idx < IWM_TFD_QUEUE_SIZE_BC_DUP) {
2531                 scd_bc_tbl[qid].tfd_offset[IWM_TFD_QUEUE_SIZE_MAX + idx] = w_val;
2532                 bus_dmamap_sync(sc->sched_dma.tag, sc->sched_dma.map,
2533                     BUS_DMASYNC_PREWRITE);
2534         }
2535 }
2536 #endif
2537
2538 /*
2539  * Take an 802.11 (non-n) rate, find the relevant rate
2540  * table entry.  return the index into in_ridx[].
2541  *
2542  * The caller then uses that index back into in_ridx
2543  * to figure out the rate index programmed /into/
2544  * the firmware for this given node.
2545  */
2546 static int
2547 iwm_tx_rateidx_lookup(struct iwm_softc *sc, struct iwm_node *in,
2548     uint8_t rate)
2549 {
2550         int i;
2551         uint8_t r;
2552
2553         for (i = 0; i < nitems(in->in_ridx); i++) {
2554                 r = iwm_rates[in->in_ridx[i]].rate;
2555                 if (rate == r)
2556                         return (i);
2557         }
2558         /* XXX Return the first */
2559         /* XXX TODO: have it return the /lowest/ */
2560         return (0);
2561 }
2562
2563 /*
2564  * Fill in various bit for management frames, and leave them
2565  * unfilled for data frames (firmware takes care of that).
2566  * Return the selected TX rate.
2567  */
2568 static const struct iwm_rate *
2569 iwm_tx_fill_cmd(struct iwm_softc *sc, struct iwm_node *in,
2570         struct ieee80211_frame *wh, struct iwm_tx_cmd *tx)
2571 {
2572         struct ieee80211com *ic = &sc->sc_ic;
2573         struct ieee80211_node *ni = &in->in_ni;
2574         const struct iwm_rate *rinfo;
2575         int type = wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK;
2576         int ridx, rate_flags;
2577
2578         tx->rts_retry_limit = IWM_RTS_DFAULT_RETRY_LIMIT;
2579         tx->data_retry_limit = IWM_DEFAULT_TX_RETRY;
2580
2581         /*
2582          * XXX TODO: everything about the rate selection here is terrible!
2583          */
2584
2585         if (type == IEEE80211_FC0_TYPE_DATA) {
2586                 int i;
2587                 /* for data frames, use RS table */
2588                 (void) ieee80211_ratectl_rate(ni, NULL, 0);
2589                 i = iwm_tx_rateidx_lookup(sc, in, ni->ni_txrate);
2590                 ridx = in->in_ridx[i];
2591
2592                 /* This is the index into the programmed table */
2593                 tx->initial_rate_index = i;
2594                 tx->tx_flags |= htole32(IWM_TX_CMD_FLG_STA_RATE);
2595                 IWM_DPRINTF(sc, IWM_DEBUG_XMIT | IWM_DEBUG_TXRATE,
2596                     "%s: start with i=%d, txrate %d\n",
2597                     __func__, i, iwm_rates[ridx].rate);
2598                 /* XXX no rate_n_flags? */
2599                 return &iwm_rates[ridx];
2600         }
2601
2602         /*
2603          * For non-data, use the lowest supported rate for the given
2604          * operational mode.
2605          *
2606          * Note: there may not be any rate control information available.
2607          * This driver currently assumes if we're transmitting data
2608          * frames, use the rate control table.  Grr.
2609          *
2610          * XXX TODO: use the configured rate for the traffic type!
2611          */
2612         if (ic->ic_curmode == IEEE80211_MODE_11A) {
2613                 /*
2614                  * XXX this assumes the mode is either 11a or not 11a;
2615                  * definitely won't work for 11n.
2616                  */
2617                 ridx = IWM_RIDX_OFDM;
2618         } else {
2619                 ridx = IWM_RIDX_CCK;
2620         }
2621
2622         rinfo = &iwm_rates[ridx];
2623
2624         IWM_DPRINTF(sc, IWM_DEBUG_TXRATE, "%s: ridx=%d; rate=%d, CCK=%d\n",
2625             __func__, ridx,
2626             rinfo->rate,
2627             !! (IWM_RIDX_IS_CCK(ridx))
2628             );
2629
2630         /* XXX TODO: hard-coded TX antenna? */
2631         rate_flags = 1 << IWM_RATE_MCS_ANT_POS;
2632         if (IWM_RIDX_IS_CCK(ridx))
2633                 rate_flags |= IWM_RATE_MCS_CCK_MSK;
2634         /* XXX hard-coded tx rate */
2635         tx->rate_n_flags = htole32(rate_flags | rinfo->plcp);
2636
2637         return rinfo;
2638 }
2639
2640 #define TB0_SIZE 16
2641 static int
2642 iwm_tx(struct iwm_softc *sc, struct mbuf *m, struct ieee80211_node *ni, int ac)
2643 {
2644         struct ieee80211com *ic = &sc->sc_ic;
2645         struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps);
2646         struct iwm_node *in = IWM_NODE(ni);
2647         struct iwm_tx_ring *ring;
2648         struct iwm_tx_data *data;
2649         struct iwm_tfd *desc;
2650         struct iwm_device_cmd *cmd;
2651         struct iwm_tx_cmd *tx;
2652         struct ieee80211_frame *wh;
2653         struct ieee80211_key *k = NULL;
2654         struct mbuf *m1;
2655         const struct iwm_rate *rinfo;
2656         uint32_t flags;
2657         u_int hdrlen;
2658         bus_dma_segment_t *seg, segs[IWM_MAX_SCATTER];
2659         int nsegs;
2660         uint8_t tid, type;
2661         int i, totlen, error, pad;
2662
2663         wh = mtod(m, struct ieee80211_frame *);
2664         hdrlen = ieee80211_anyhdrsize(wh);
2665         type = wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK;
2666         tid = 0;
2667         ring = &sc->txq[ac];
2668         desc = &ring->desc[ring->cur];
2669         memset(desc, 0, sizeof(*desc));
2670         data = &ring->data[ring->cur];
2671
2672         /* Fill out iwm_tx_cmd to send to the firmware */
2673         cmd = &ring->cmd[ring->cur];
2674         cmd->hdr.code = IWM_TX_CMD;
2675         cmd->hdr.flags = 0;
2676         cmd->hdr.qid = ring->qid;
2677         cmd->hdr.idx = ring->cur;
2678
2679         tx = (void *)cmd->data;
2680         memset(tx, 0, sizeof(*tx));
2681
2682         rinfo = iwm_tx_fill_cmd(sc, in, wh, tx);
2683
2684         /* Encrypt the frame if need be. */
2685         if (wh->i_fc[1] & IEEE80211_FC1_PROTECTED) {
2686                 /* Retrieve key for TX && do software encryption. */
2687                 k = ieee80211_crypto_encap(ni, m);
2688                 if (k == NULL) {
2689                         m_freem(m);
2690                         return (ENOBUFS);
2691                 }
2692                 /* 802.11 header may have moved. */
2693                 wh = mtod(m, struct ieee80211_frame *);
2694         }
2695
2696         if (ieee80211_radiotap_active_vap(vap)) {
2697                 struct iwm_tx_radiotap_header *tap = &sc->sc_txtap;
2698
2699                 tap->wt_flags = 0;
2700                 tap->wt_chan_freq = htole16(ni->ni_chan->ic_freq);
2701                 tap->wt_chan_flags = htole16(ni->ni_chan->ic_flags);
2702                 tap->wt_rate = rinfo->rate;
2703                 if (k != NULL)
2704                         tap->wt_flags |= IEEE80211_RADIOTAP_F_WEP;
2705                 ieee80211_radiotap_tx(vap, m);
2706         }
2707
2708
2709         totlen = m->m_pkthdr.len;
2710
2711         flags = 0;
2712         if (!IEEE80211_IS_MULTICAST(wh->i_addr1)) {
2713                 flags |= IWM_TX_CMD_FLG_ACK;
2714         }
2715
2716         if (type != IEEE80211_FC0_TYPE_DATA
2717             && (totlen + IEEE80211_CRC_LEN > vap->iv_rtsthreshold)
2718             && !IEEE80211_IS_MULTICAST(wh->i_addr1)) {
2719                 flags |= IWM_TX_CMD_FLG_PROT_REQUIRE;
2720         }
2721
2722         if (IEEE80211_IS_MULTICAST(wh->i_addr1) ||
2723             type != IEEE80211_FC0_TYPE_DATA)
2724                 tx->sta_id = sc->sc_aux_sta.sta_id;
2725         else
2726                 tx->sta_id = IWM_STATION_ID;
2727
2728         if (type == IEEE80211_FC0_TYPE_MGT) {
2729                 uint8_t subtype = wh->i_fc[0] & IEEE80211_FC0_SUBTYPE_MASK;
2730
2731                 if (subtype == IEEE80211_FC0_SUBTYPE_ASSOC_REQ ||
2732                     subtype == IEEE80211_FC0_SUBTYPE_REASSOC_REQ)
2733                         tx->pm_frame_timeout = htole16(3);
2734                 else
2735                         tx->pm_frame_timeout = htole16(2);
2736         } else {
2737                 tx->pm_frame_timeout = htole16(0);
2738         }
2739
2740         if (hdrlen & 3) {
2741                 /* First segment length must be a multiple of 4. */
2742                 flags |= IWM_TX_CMD_FLG_MH_PAD;
2743                 pad = 4 - (hdrlen & 3);
2744         } else
2745                 pad = 0;
2746
2747         tx->driver_txop = 0;
2748         tx->next_frame_len = 0;
2749
2750         tx->len = htole16(totlen);
2751         tx->tid_tspec = tid;
2752         tx->life_time = htole32(IWM_TX_CMD_LIFE_TIME_INFINITE);
2753
2754         /* Set physical address of "scratch area". */
2755         tx->dram_lsb_ptr = htole32(data->scratch_paddr);
2756         tx->dram_msb_ptr = iwm_get_dma_hi_addr(data->scratch_paddr);
2757
2758         /* Copy 802.11 header in TX command. */
2759         memcpy(((uint8_t *)tx) + sizeof(*tx), wh, hdrlen);
2760
2761         flags |= IWM_TX_CMD_FLG_BT_DIS | IWM_TX_CMD_FLG_SEQ_CTL;
2762
2763         tx->sec_ctl = 0;
2764         tx->tx_flags |= htole32(flags);
2765
2766         /* Trim 802.11 header. */
2767         m_adj(m, hdrlen);
2768         error = bus_dmamap_load_mbuf_sg(ring->data_dmat, data->map, m,
2769             segs, &nsegs, BUS_DMA_NOWAIT);
2770         if (error != 0) {
2771                 if (error != EFBIG) {
2772                         device_printf(sc->sc_dev, "can't map mbuf (error %d)\n",
2773                             error);
2774                         m_freem(m);
2775                         return error;
2776                 }
2777                 /* Too many DMA segments, linearize mbuf. */
2778                 m1 = m_collapse(m, M_NOWAIT, IWM_MAX_SCATTER - 2);
2779                 if (m1 == NULL) {
2780                         device_printf(sc->sc_dev,
2781                             "%s: could not defrag mbuf\n", __func__);
2782                         m_freem(m);
2783                         return (ENOBUFS);
2784                 }
2785                 m = m1;
2786
2787                 error = bus_dmamap_load_mbuf_sg(ring->data_dmat, data->map, m,
2788                     segs, &nsegs, BUS_DMA_NOWAIT);
2789                 if (error != 0) {
2790                         device_printf(sc->sc_dev, "can't map mbuf (error %d)\n",
2791                             error);
2792                         m_freem(m);
2793                         return error;
2794                 }
2795         }
2796         data->m = m;
2797         data->in = in;
2798         data->done = 0;
2799
2800         IWM_DPRINTF(sc, IWM_DEBUG_XMIT,
2801             "sending txd %p, in %p\n", data, data->in);
2802         KASSERT(data->in != NULL, ("node is NULL"));
2803
2804         IWM_DPRINTF(sc, IWM_DEBUG_XMIT,
2805             "sending data: qid=%d idx=%d len=%d nsegs=%d\n",
2806             ring->qid, ring->cur, totlen, nsegs);
2807
2808         /* Fill TX descriptor. */
2809         desc->num_tbs = 2 + nsegs;
2810
2811         desc->tbs[0].lo = htole32(data->cmd_paddr);
2812         desc->tbs[0].hi_n_len = htole16(iwm_get_dma_hi_addr(data->cmd_paddr)) |
2813             (TB0_SIZE << 4);
2814         desc->tbs[1].lo = htole32(data->cmd_paddr + TB0_SIZE);
2815         desc->tbs[1].hi_n_len = htole16(iwm_get_dma_hi_addr(data->cmd_paddr)) |
2816             ((sizeof(struct iwm_cmd_header) + sizeof(*tx)
2817               + hdrlen + pad - TB0_SIZE) << 4);
2818
2819         /* Other DMA segments are for data payload. */
2820         for (i = 0; i < nsegs; i++) {
2821                 seg = &segs[i];
2822                 desc->tbs[i+2].lo = htole32(seg->ds_addr);
2823                 desc->tbs[i+2].hi_n_len = \
2824                     htole16(iwm_get_dma_hi_addr(seg->ds_addr))
2825                     | ((seg->ds_len) << 4);
2826         }
2827
2828         bus_dmamap_sync(ring->data_dmat, data->map,
2829             BUS_DMASYNC_PREWRITE);
2830         bus_dmamap_sync(ring->cmd_dma.tag, ring->cmd_dma.map,
2831             BUS_DMASYNC_PREWRITE);
2832         bus_dmamap_sync(ring->desc_dma.tag, ring->desc_dma.map,
2833             BUS_DMASYNC_PREWRITE);
2834
2835 #if 0
2836         iwm_update_sched(sc, ring->qid, ring->cur, tx->sta_id, le16toh(tx->len));
2837 #endif
2838
2839         /* Kick TX ring. */
2840         ring->cur = (ring->cur + 1) % IWM_TX_RING_COUNT;
2841         IWM_WRITE(sc, IWM_HBUS_TARG_WRPTR, ring->qid << 8 | ring->cur);
2842
2843         /* Mark TX ring as full if we reach a certain threshold. */
2844         if (++ring->queued > IWM_TX_RING_HIMARK) {
2845                 sc->qfullmsk |= 1 << ring->qid;
2846         }
2847
2848         return 0;
2849 }
2850
2851 static int
2852 iwm_raw_xmit(struct ieee80211_node *ni, struct mbuf *m,
2853     const struct ieee80211_bpf_params *params)
2854 {
2855         struct ieee80211com *ic = ni->ni_ic;
2856         struct iwm_softc *sc = ic->ic_softc;
2857         int error = 0;
2858
2859         IWM_DPRINTF(sc, IWM_DEBUG_XMIT,
2860             "->%s begin\n", __func__);
2861
2862         if ((sc->sc_flags & IWM_FLAG_HW_INITED) == 0) {
2863                 m_freem(m);
2864                 IWM_DPRINTF(sc, IWM_DEBUG_XMIT,
2865                     "<-%s not RUNNING\n", __func__);
2866                 return (ENETDOWN);
2867         }
2868
2869         IWM_LOCK(sc);
2870         /* XXX fix this */
2871         if (params == NULL) {
2872                 error = iwm_tx(sc, m, ni, 0);
2873         } else {
2874                 error = iwm_tx(sc, m, ni, 0);
2875         }
2876         sc->sc_tx_timer = 5;
2877         IWM_UNLOCK(sc);
2878
2879         return (error);
2880 }
2881
2882 /*
2883  * mvm/tx.c
2884  */
2885
2886 #if 0
2887 /*
2888  * Note that there are transports that buffer frames before they reach
2889  * the firmware. This means that after flush_tx_path is called, the
2890  * queue might not be empty. The race-free way to handle this is to:
2891  * 1) set the station as draining
2892  * 2) flush the Tx path
2893  * 3) wait for the transport queues to be empty
2894  */
2895 int
2896 iwm_mvm_flush_tx_path(struct iwm_softc *sc, int tfd_msk, int sync)
2897 {
2898         struct iwm_tx_path_flush_cmd flush_cmd = {
2899                 .queues_ctl = htole32(tfd_msk),
2900                 .flush_ctl = htole16(IWM_DUMP_TX_FIFO_FLUSH),
2901         };
2902         int ret;
2903
2904         ret = iwm_mvm_send_cmd_pdu(sc, IWM_TXPATH_FLUSH,
2905             sync ? IWM_CMD_SYNC : IWM_CMD_ASYNC,
2906             sizeof(flush_cmd), &flush_cmd);
2907         if (ret)
2908                 device_printf(sc->sc_dev,
2909                     "Flushing tx queue failed: %d\n", ret);
2910         return ret;
2911 }
2912 #endif
2913
2914 /*
2915  * BEGIN mvm/sta.c
2916  */
2917
2918 static void
2919 iwm_mvm_add_sta_cmd_v6_to_v5(struct iwm_mvm_add_sta_cmd_v6 *cmd_v6,
2920         struct iwm_mvm_add_sta_cmd_v5 *cmd_v5)
2921 {
2922         memset(cmd_v5, 0, sizeof(*cmd_v5));
2923
2924         cmd_v5->add_modify = cmd_v6->add_modify;
2925         cmd_v5->tid_disable_tx = cmd_v6->tid_disable_tx;
2926         cmd_v5->mac_id_n_color = cmd_v6->mac_id_n_color;
2927         IEEE80211_ADDR_COPY(cmd_v5->addr, cmd_v6->addr);
2928         cmd_v5->sta_id = cmd_v6->sta_id;
2929         cmd_v5->modify_mask = cmd_v6->modify_mask;
2930         cmd_v5->station_flags = cmd_v6->station_flags;
2931         cmd_v5->station_flags_msk = cmd_v6->station_flags_msk;
2932         cmd_v5->add_immediate_ba_tid = cmd_v6->add_immediate_ba_tid;
2933         cmd_v5->remove_immediate_ba_tid = cmd_v6->remove_immediate_ba_tid;
2934         cmd_v5->add_immediate_ba_ssn = cmd_v6->add_immediate_ba_ssn;
2935         cmd_v5->sleep_tx_count = cmd_v6->sleep_tx_count;
2936         cmd_v5->sleep_state_flags = cmd_v6->sleep_state_flags;
2937         cmd_v5->assoc_id = cmd_v6->assoc_id;
2938         cmd_v5->beamform_flags = cmd_v6->beamform_flags;
2939         cmd_v5->tfd_queue_msk = cmd_v6->tfd_queue_msk;
2940 }
2941
2942 static int
2943 iwm_mvm_send_add_sta_cmd_status(struct iwm_softc *sc,
2944         struct iwm_mvm_add_sta_cmd_v6 *cmd, int *status)
2945 {
2946         struct iwm_mvm_add_sta_cmd_v5 cmd_v5;
2947
2948         if (sc->sc_capaflags & IWM_UCODE_TLV_FLAGS_STA_KEY_CMD) {
2949                 return iwm_mvm_send_cmd_pdu_status(sc, IWM_ADD_STA,
2950                     sizeof(*cmd), cmd, status);
2951         }
2952
2953         iwm_mvm_add_sta_cmd_v6_to_v5(cmd, &cmd_v5);
2954
2955         return iwm_mvm_send_cmd_pdu_status(sc, IWM_ADD_STA, sizeof(cmd_v5),
2956             &cmd_v5, status);
2957 }
2958
2959 /* send station add/update command to firmware */
2960 static int
2961 iwm_mvm_sta_send_to_fw(struct iwm_softc *sc, struct iwm_node *in, int update)
2962 {
2963         struct iwm_mvm_add_sta_cmd_v6 add_sta_cmd;
2964         int ret;
2965         uint32_t status;
2966
2967         memset(&add_sta_cmd, 0, sizeof(add_sta_cmd));
2968
2969         add_sta_cmd.sta_id = IWM_STATION_ID;
2970         add_sta_cmd.mac_id_n_color
2971             = htole32(IWM_FW_CMD_ID_AND_COLOR(IWM_DEFAULT_MACID,
2972                 IWM_DEFAULT_COLOR));
2973         if (!update) {
2974                 add_sta_cmd.tfd_queue_msk = htole32(0xf);
2975                 IEEE80211_ADDR_COPY(&add_sta_cmd.addr, in->in_ni.ni_bssid);
2976         }
2977         add_sta_cmd.add_modify = update ? 1 : 0;
2978         add_sta_cmd.station_flags_msk
2979             |= htole32(IWM_STA_FLG_FAT_EN_MSK | IWM_STA_FLG_MIMO_EN_MSK);
2980
2981         status = IWM_ADD_STA_SUCCESS;
2982         ret = iwm_mvm_send_add_sta_cmd_status(sc, &add_sta_cmd, &status);
2983         if (ret)
2984                 return ret;
2985
2986         switch (status) {
2987         case IWM_ADD_STA_SUCCESS:
2988                 break;
2989         default:
2990                 ret = EIO;
2991                 device_printf(sc->sc_dev, "IWM_ADD_STA failed\n");
2992                 break;
2993         }
2994
2995         return ret;
2996 }
2997
2998 static int
2999 iwm_mvm_add_sta(struct iwm_softc *sc, struct iwm_node *in)
3000 {
3001         int ret;
3002
3003         ret = iwm_mvm_sta_send_to_fw(sc, in, 0);
3004         if (ret)
3005                 return ret;
3006
3007         return 0;
3008 }
3009
3010 static int
3011 iwm_mvm_update_sta(struct iwm_softc *sc, struct iwm_node *in)
3012 {
3013         return iwm_mvm_sta_send_to_fw(sc, in, 1);
3014 }
3015
3016 static int
3017 iwm_mvm_add_int_sta_common(struct iwm_softc *sc, struct iwm_int_sta *sta,
3018         const uint8_t *addr, uint16_t mac_id, uint16_t color)
3019 {
3020         struct iwm_mvm_add_sta_cmd_v6 cmd;
3021         int ret;
3022         uint32_t status;
3023
3024         memset(&cmd, 0, sizeof(cmd));
3025         cmd.sta_id = sta->sta_id;
3026         cmd.mac_id_n_color = htole32(IWM_FW_CMD_ID_AND_COLOR(mac_id, color));
3027
3028         cmd.tfd_queue_msk = htole32(sta->tfd_queue_msk);
3029
3030         if (addr)
3031                 IEEE80211_ADDR_COPY(cmd.addr, addr);
3032
3033         ret = iwm_mvm_send_add_sta_cmd_status(sc, &cmd, &status);
3034         if (ret)
3035                 return ret;
3036
3037         switch (status) {
3038         case IWM_ADD_STA_SUCCESS:
3039                 IWM_DPRINTF(sc, IWM_DEBUG_RESET,
3040                     "%s: Internal station added.\n", __func__);
3041                 return 0;
3042         default:
3043                 device_printf(sc->sc_dev,
3044                     "%s: Add internal station failed, status=0x%x\n",
3045                     __func__, status);
3046                 ret = EIO;
3047                 break;
3048         }
3049         return ret;
3050 }
3051
3052 static int
3053 iwm_mvm_add_aux_sta(struct iwm_softc *sc)
3054 {
3055         int ret;
3056
3057         sc->sc_aux_sta.sta_id = 3;
3058         sc->sc_aux_sta.tfd_queue_msk = 0;
3059
3060         ret = iwm_mvm_add_int_sta_common(sc,
3061             &sc->sc_aux_sta, NULL, IWM_MAC_INDEX_AUX, 0);
3062
3063         if (ret)
3064                 memset(&sc->sc_aux_sta, 0, sizeof(sc->sc_aux_sta));
3065         return ret;
3066 }
3067
3068 /*
3069  * END mvm/sta.c
3070  */
3071
3072 /*
3073  * BEGIN mvm/quota.c
3074  */
3075
3076 static int
3077 iwm_mvm_update_quotas(struct iwm_softc *sc, struct iwm_node *in)
3078 {
3079         struct iwm_time_quota_cmd cmd;
3080         int i, idx, ret, num_active_macs, quota, quota_rem;
3081         int colors[IWM_MAX_BINDINGS] = { -1, -1, -1, -1, };
3082         int n_ifs[IWM_MAX_BINDINGS] = {0, };
3083         uint16_t id;
3084
3085         memset(&cmd, 0, sizeof(cmd));
3086
3087         /* currently, PHY ID == binding ID */
3088         if (in) {
3089                 id = in->in_phyctxt->id;
3090                 KASSERT(id < IWM_MAX_BINDINGS, ("invalid id"));
3091                 colors[id] = in->in_phyctxt->color;
3092
3093                 if (1)
3094                         n_ifs[id] = 1;
3095         }
3096
3097         /*
3098          * The FW's scheduling session consists of
3099          * IWM_MVM_MAX_QUOTA fragments. Divide these fragments
3100          * equally between all the bindings that require quota
3101          */
3102         num_active_macs = 0;
3103         for (i = 0; i < IWM_MAX_BINDINGS; i++) {
3104                 cmd.quotas[i].id_and_color = htole32(IWM_FW_CTXT_INVALID);
3105                 num_active_macs += n_ifs[i];
3106         }
3107
3108         quota = 0;
3109         quota_rem = 0;
3110         if (num_active_macs) {
3111                 quota = IWM_MVM_MAX_QUOTA / num_active_macs;
3112                 quota_rem = IWM_MVM_MAX_QUOTA % num_active_macs;
3113         }
3114
3115         for (idx = 0, i = 0; i < IWM_MAX_BINDINGS; i++) {
3116                 if (colors[i] < 0)
3117                         continue;
3118
3119                 cmd.quotas[idx].id_and_color =
3120                         htole32(IWM_FW_CMD_ID_AND_COLOR(i, colors[i]));
3121
3122                 if (n_ifs[i] <= 0) {
3123                         cmd.quotas[idx].quota = htole32(0);
3124                         cmd.quotas[idx].max_duration = htole32(0);
3125                 } else {
3126                         cmd.quotas[idx].quota = htole32(quota * n_ifs[i]);
3127                         cmd.quotas[idx].max_duration = htole32(0);
3128                 }
3129                 idx++;
3130         }
3131
3132         /* Give the remainder of the session to the first binding */
3133         cmd.quotas[0].quota = htole32(le32toh(cmd.quotas[0].quota) + quota_rem);
3134
3135         ret = iwm_mvm_send_cmd_pdu(sc, IWM_TIME_QUOTA_CMD, IWM_CMD_SYNC,
3136             sizeof(cmd), &cmd);
3137         if (ret)
3138                 device_printf(sc->sc_dev,
3139                     "%s: Failed to send quota: %d\n", __func__, ret);
3140         return ret;
3141 }
3142
3143 /*
3144  * END mvm/quota.c
3145  */
3146
3147 /*
3148  * ieee80211 routines
3149  */
3150
3151 /*
3152  * Change to AUTH state in 80211 state machine.  Roughly matches what
3153  * Linux does in bss_info_changed().
3154  */
3155 static int
3156 iwm_auth(struct ieee80211vap *vap, struct iwm_softc *sc)
3157 {
3158         struct ieee80211_node *ni;
3159         struct iwm_node *in;
3160         struct iwm_vap *iv = IWM_VAP(vap);
3161         uint32_t duration;
3162         uint32_t min_duration;
3163         int error;
3164
3165         /*
3166          * XXX i have a feeling that the vap node is being
3167          * freed from underneath us. Grr.
3168          */
3169         ni = ieee80211_ref_node(vap->iv_bss);
3170         in = IWM_NODE(ni);
3171         IWM_DPRINTF(sc, IWM_DEBUG_RESET | IWM_DEBUG_STATE,
3172             "%s: called; vap=%p, bss ni=%p\n",
3173             __func__,
3174             vap,
3175             ni);
3176
3177         in->in_assoc = 0;
3178
3179         error = iwm_allow_mcast(vap, sc);
3180         if (error) {
3181                 device_printf(sc->sc_dev,
3182                     "%s: failed to set multicast\n", __func__);
3183                 goto out;
3184         }
3185
3186         /*
3187          * This is where it deviates from what Linux does.
3188          *
3189          * Linux iwlwifi doesn't reset the nic each time, nor does it
3190          * call ctxt_add() here.  Instead, it adds it during vap creation,
3191          * and always does does a mac_ctx_changed().
3192          *
3193          * The openbsd port doesn't attempt to do that - it reset things
3194          * at odd states and does the add here.
3195          *
3196          * So, until the state handling is fixed (ie, we never reset
3197          * the NIC except for a firmware failure, which should drag
3198          * the NIC back to IDLE, re-setup and re-add all the mac/phy
3199          * contexts that are required), let's do a dirty hack here.
3200          */
3201         if (iv->is_uploaded) {
3202                 if ((error = iwm_mvm_mac_ctxt_changed(sc, vap)) != 0) {
3203                         device_printf(sc->sc_dev,
3204                             "%s: failed to add MAC\n", __func__);
3205                         goto out;
3206                 }
3207         } else {
3208                 if ((error = iwm_mvm_mac_ctxt_add(sc, vap)) != 0) {
3209                         device_printf(sc->sc_dev,
3210                             "%s: failed to add MAC\n", __func__);
3211                         goto out;
3212                 }
3213         }
3214
3215         if ((error = iwm_mvm_phy_ctxt_changed(sc, &sc->sc_phyctxt[0],
3216             in->in_ni.ni_chan, 1, 1)) != 0) {
3217                 device_printf(sc->sc_dev,
3218                     "%s: failed add phy ctxt\n", __func__);
3219                 goto out;
3220         }
3221         in->in_phyctxt = &sc->sc_phyctxt[0];
3222
3223         if ((error = iwm_mvm_binding_add_vif(sc, in)) != 0) {
3224                 device_printf(sc->sc_dev,
3225                     "%s: binding cmd\n", __func__);
3226                 goto out;
3227         }
3228
3229         if ((error = iwm_mvm_add_sta(sc, in)) != 0) {
3230                 device_printf(sc->sc_dev,
3231                     "%s: failed to add MAC\n", __func__);
3232                 goto out;
3233         }
3234
3235         /* a bit superfluous? */
3236         while (sc->sc_auth_prot)
3237                 msleep(&sc->sc_auth_prot, &sc->sc_mtx, 0, "iwmauth", 0);
3238         sc->sc_auth_prot = 1;
3239
3240         duration = min(IWM_MVM_TE_SESSION_PROTECTION_MAX_TIME_MS,
3241             200 + in->in_ni.ni_intval);
3242         min_duration = min(IWM_MVM_TE_SESSION_PROTECTION_MIN_TIME_MS,
3243             100 + in->in_ni.ni_intval);
3244         iwm_mvm_protect_session(sc, in, duration, min_duration, 500);
3245
3246         IWM_DPRINTF(sc, IWM_DEBUG_RESET,
3247             "%s: waiting for auth_prot\n", __func__);
3248         while (sc->sc_auth_prot != 2) {
3249                 /*
3250                  * well, meh, but if the kernel is sleeping for half a
3251                  * second, we have bigger problems
3252                  */
3253                 if (sc->sc_auth_prot == 0) {
3254                         device_printf(sc->sc_dev,
3255                             "%s: missed auth window!\n", __func__);
3256                         error = ETIMEDOUT;
3257                         goto out;
3258                 } else if (sc->sc_auth_prot == -1) {
3259                         device_printf(sc->sc_dev,
3260                             "%s: no time event, denied!\n", __func__);
3261                         sc->sc_auth_prot = 0;
3262                         error = EAUTH;
3263                         goto out;
3264                 }
3265                 msleep(&sc->sc_auth_prot, &sc->sc_mtx, 0, "iwmau2", 0);
3266         }
3267         IWM_DPRINTF(sc, IWM_DEBUG_RESET, "<-%s\n", __func__);
3268         error = 0;
3269 out:
3270         ieee80211_free_node(ni);
3271         return (error);
3272 }
3273
3274 static int
3275 iwm_assoc(struct ieee80211vap *vap, struct iwm_softc *sc)
3276 {
3277         struct iwm_node *in = IWM_NODE(vap->iv_bss);
3278         int error;
3279
3280         if ((error = iwm_mvm_update_sta(sc, in)) != 0) {
3281                 device_printf(sc->sc_dev,
3282                     "%s: failed to update STA\n", __func__);
3283                 return error;
3284         }
3285
3286         in->in_assoc = 1;
3287         if ((error = iwm_mvm_mac_ctxt_changed(sc, vap)) != 0) {
3288                 device_printf(sc->sc_dev,
3289                     "%s: failed to update MAC\n", __func__);
3290                 return error;
3291         }
3292
3293         return 0;
3294 }
3295
3296 static int
3297 iwm_release(struct iwm_softc *sc, struct iwm_node *in)
3298 {
3299         /*
3300          * Ok, so *technically* the proper set of calls for going
3301          * from RUN back to SCAN is:
3302          *
3303          * iwm_mvm_power_mac_disable(sc, in);
3304          * iwm_mvm_mac_ctxt_changed(sc, in);
3305          * iwm_mvm_rm_sta(sc, in);
3306          * iwm_mvm_update_quotas(sc, NULL);
3307          * iwm_mvm_mac_ctxt_changed(sc, in);
3308          * iwm_mvm_binding_remove_vif(sc, in);
3309          * iwm_mvm_mac_ctxt_remove(sc, in);
3310          *
3311          * However, that freezes the device not matter which permutations
3312          * and modifications are attempted.  Obviously, this driver is missing
3313          * something since it works in the Linux driver, but figuring out what
3314          * is missing is a little more complicated.  Now, since we're going
3315          * back to nothing anyway, we'll just do a complete device reset.
3316          * Up your's, device!
3317          */
3318         //iwm_mvm_flush_tx_path(sc, 0xf, 1);
3319         iwm_stop_device(sc);
3320         iwm_init_hw(sc);
3321         if (in)
3322                 in->in_assoc = 0;
3323         return 0;
3324
3325 #if 0
3326         int error;
3327
3328         iwm_mvm_power_mac_disable(sc, in);
3329
3330         if ((error = iwm_mvm_mac_ctxt_changed(sc, in)) != 0) {
3331                 device_printf(sc->sc_dev, "mac ctxt change fail 1 %d\n", error);
3332                 return error;
3333         }
3334
3335         if ((error = iwm_mvm_rm_sta(sc, in)) != 0) {
3336                 device_printf(sc->sc_dev, "sta remove fail %d\n", error);
3337                 return error;
3338         }
3339         error = iwm_mvm_rm_sta(sc, in);
3340         in->in_assoc = 0;
3341         iwm_mvm_update_quotas(sc, NULL);
3342         if ((error = iwm_mvm_mac_ctxt_changed(sc, in)) != 0) {
3343                 device_printf(sc->sc_dev, "mac ctxt change fail 2 %d\n", error);
3344                 return error;
3345         }
3346         iwm_mvm_binding_remove_vif(sc, in);
3347
3348         iwm_mvm_mac_ctxt_remove(sc, in);
3349
3350         return error;
3351 #endif
3352 }
3353
3354 static struct ieee80211_node *
3355 iwm_node_alloc(struct ieee80211vap *vap, const uint8_t mac[IEEE80211_ADDR_LEN])
3356 {
3357         return malloc(sizeof (struct iwm_node), M_80211_NODE,
3358             M_NOWAIT | M_ZERO);
3359 }
3360
3361 static void
3362 iwm_setrates(struct iwm_softc *sc, struct iwm_node *in)
3363 {
3364         struct ieee80211_node *ni = &in->in_ni;
3365         struct iwm_lq_cmd *lq = &in->in_lq;
3366         int nrates = ni->ni_rates.rs_nrates;
3367         int i, ridx, tab = 0;
3368         int txant = 0;
3369
3370         if (nrates > nitems(lq->rs_table)) {
3371                 device_printf(sc->sc_dev,
3372                     "%s: node supports %d rates, driver handles "
3373                     "only %zu\n", __func__, nrates, nitems(lq->rs_table));
3374                 return;
3375         }
3376         if (nrates == 0) {
3377                 device_printf(sc->sc_dev,
3378                     "%s: node supports 0 rates, odd!\n", __func__);
3379                 return;
3380         }
3381
3382         /*
3383          * XXX .. and most of iwm_node is not initialised explicitly;
3384          * it's all just 0x0 passed to the firmware.
3385          */
3386
3387         /* first figure out which rates we should support */
3388         /* XXX TODO: this isn't 11n aware /at all/ */
3389         memset(&in->in_ridx, -1, sizeof(in->in_ridx));
3390         IWM_DPRINTF(sc, IWM_DEBUG_TXRATE,
3391             "%s: nrates=%d\n", __func__, nrates);
3392
3393         /*
3394          * Loop over nrates and populate in_ridx from the highest
3395          * rate to the lowest rate.  Remember, in_ridx[] has
3396          * IEEE80211_RATE_MAXSIZE entries!
3397          */
3398         for (i = 0; i < min(nrates, IEEE80211_RATE_MAXSIZE); i++) {
3399                 int rate = ni->ni_rates.rs_rates[(nrates - 1) - i] & IEEE80211_RATE_VAL;
3400
3401                 /* Map 802.11 rate to HW rate index. */
3402                 for (ridx = 0; ridx <= IWM_RIDX_MAX; ridx++)
3403                         if (iwm_rates[ridx].rate == rate)
3404                                 break;
3405                 if (ridx > IWM_RIDX_MAX) {
3406                         device_printf(sc->sc_dev,
3407                             "%s: WARNING: device rate for %d not found!\n",
3408                             __func__, rate);
3409                 } else {
3410                         IWM_DPRINTF(sc, IWM_DEBUG_TXRATE,
3411                             "%s: rate: i: %d, rate=%d, ridx=%d\n",
3412                             __func__,
3413                             i,
3414                             rate,
3415                             ridx);
3416                         in->in_ridx[i] = ridx;
3417                 }
3418         }
3419
3420         /* then construct a lq_cmd based on those */
3421         memset(lq, 0, sizeof(*lq));
3422         lq->sta_id = IWM_STATION_ID;
3423
3424         /*
3425          * are these used? (we don't do SISO or MIMO)
3426          * need to set them to non-zero, though, or we get an error.
3427          */
3428         lq->single_stream_ant_msk = 1;
3429         lq->dual_stream_ant_msk = 1;
3430
3431         /*
3432          * Build the actual rate selection table.
3433          * The lowest bits are the rates.  Additionally,
3434          * CCK needs bit 9 to be set.  The rest of the bits
3435          * we add to the table select the tx antenna
3436          * Note that we add the rates in the highest rate first
3437          * (opposite of ni_rates).
3438          */
3439         /*
3440          * XXX TODO: this should be looping over the min of nrates
3441          * and LQ_MAX_RETRY_NUM.  Sigh.
3442          */
3443         for (i = 0; i < nrates; i++) {
3444                 int nextant;
3445
3446                 if (txant == 0)
3447                         txant = IWM_FW_VALID_TX_ANT(sc);
3448                 nextant = 1<<(ffs(txant)-1);
3449                 txant &= ~nextant;
3450
3451                 /*
3452                  * Map the rate id into a rate index into
3453                  * our hardware table containing the
3454                  * configuration to use for this rate.
3455                  */
3456                 ridx = in->in_ridx[i];
3457                 tab = iwm_rates[ridx].plcp;
3458                 tab |= nextant << IWM_RATE_MCS_ANT_POS;
3459                 if (IWM_RIDX_IS_CCK(ridx))
3460                         tab |= IWM_RATE_MCS_CCK_MSK;
3461                 IWM_DPRINTF(sc, IWM_DEBUG_TXRATE,
3462                     "station rate i=%d, rate=%d, hw=%x\n",
3463                     i, iwm_rates[ridx].rate, tab);
3464                 lq->rs_table[i] = htole32(tab);
3465         }
3466         /* then fill the rest with the lowest possible rate */
3467         for (i = nrates; i < nitems(lq->rs_table); i++) {
3468                 KASSERT(tab != 0, ("invalid tab"));
3469                 lq->rs_table[i] = htole32(tab);
3470         }
3471 }
3472
3473 static int
3474 iwm_media_change(struct ifnet *ifp)
3475 {
3476         struct ieee80211vap *vap = ifp->if_softc;
3477         struct ieee80211com *ic = vap->iv_ic;
3478         struct iwm_softc *sc = ic->ic_softc;
3479         int error;
3480
3481         error = ieee80211_media_change(ifp);
3482         if (error != ENETRESET)
3483                 return error;
3484
3485         IWM_LOCK(sc);
3486         if (ic->ic_nrunning > 0) {
3487                 iwm_stop(sc);
3488                 iwm_init(sc);
3489         }
3490         IWM_UNLOCK(sc);
3491         return error;
3492 }
3493
3494
3495 static int
3496 iwm_newstate(struct ieee80211vap *vap, enum ieee80211_state nstate, int arg)
3497 {
3498         struct iwm_vap *ivp = IWM_VAP(vap);
3499         struct ieee80211com *ic = vap->iv_ic;
3500         struct iwm_softc *sc = ic->ic_softc;
3501         struct iwm_node *in;
3502         int error;
3503
3504         IWM_DPRINTF(sc, IWM_DEBUG_STATE,
3505             "switching state %s -> %s\n",
3506             ieee80211_state_name[vap->iv_state],
3507             ieee80211_state_name[nstate]);
3508         IEEE80211_UNLOCK(ic);
3509         IWM_LOCK(sc);
3510         /* disable beacon filtering if we're hopping out of RUN */
3511         if (vap->iv_state == IEEE80211_S_RUN && nstate != vap->iv_state) {
3512                 iwm_mvm_disable_beacon_filter(sc);
3513
3514                 if (((in = IWM_NODE(vap->iv_bss)) != NULL))
3515                         in->in_assoc = 0;
3516
3517                 iwm_release(sc, NULL);
3518
3519                 /*
3520                  * It's impossible to directly go RUN->SCAN. If we iwm_release()
3521                  * above then the card will be completely reinitialized,
3522                  * so the driver must do everything necessary to bring the card
3523                  * from INIT to SCAN.
3524                  *
3525                  * Additionally, upon receiving deauth frame from AP,
3526                  * OpenBSD 802.11 stack puts the driver in IEEE80211_S_AUTH
3527                  * state. This will also fail with this driver, so bring the FSM
3528                  * from IEEE80211_S_RUN to IEEE80211_S_SCAN in this case as well.
3529                  *
3530                  * XXX TODO: fix this for FreeBSD!
3531                  */
3532                 if (nstate == IEEE80211_S_SCAN ||
3533                     nstate == IEEE80211_S_AUTH ||
3534                     nstate == IEEE80211_S_ASSOC) {
3535                         IWM_DPRINTF(sc, IWM_DEBUG_STATE,
3536                             "Force transition to INIT; MGT=%d\n", arg);
3537                         IWM_UNLOCK(sc);
3538                         IEEE80211_LOCK(ic);
3539                         vap->iv_newstate(vap, IEEE80211_S_INIT, arg);
3540                         IWM_DPRINTF(sc, IWM_DEBUG_STATE,
3541                             "Going INIT->SCAN\n");
3542                         nstate = IEEE80211_S_SCAN;
3543                         IEEE80211_UNLOCK(ic);
3544                         IWM_LOCK(sc);
3545                 }
3546         }
3547
3548         switch (nstate) {
3549         case IEEE80211_S_INIT:
3550                 sc->sc_scanband = 0;
3551                 break;
3552
3553         case IEEE80211_S_AUTH:
3554                 if ((error = iwm_auth(vap, sc)) != 0) {
3555                         device_printf(sc->sc_dev,
3556                             "%s: could not move to auth state: %d\n",
3557                             __func__, error);
3558                         break;
3559                 }
3560                 break;
3561
3562         case IEEE80211_S_ASSOC:
3563                 if ((error = iwm_assoc(vap, sc)) != 0) {
3564                         device_printf(sc->sc_dev,
3565                             "%s: failed to associate: %d\n", __func__,
3566                             error);
3567                         break;
3568                 }
3569                 break;
3570
3571         case IEEE80211_S_RUN:
3572         {
3573                 struct iwm_host_cmd cmd = {
3574                         .id = IWM_LQ_CMD,
3575                         .len = { sizeof(in->in_lq), },
3576                         .flags = IWM_CMD_SYNC,
3577                 };
3578
3579                 /* Update the association state, now we have it all */
3580                 /* (eg associd comes in at this point */
3581                 error = iwm_assoc(vap, sc);
3582                 if (error != 0) {
3583                         device_printf(sc->sc_dev,
3584                             "%s: failed to update association state: %d\n",
3585                             __func__,
3586                             error);
3587                         break;
3588                 }
3589
3590                 in = IWM_NODE(vap->iv_bss);
3591                 iwm_mvm_power_mac_update_mode(sc, in);
3592                 iwm_mvm_enable_beacon_filter(sc, in);
3593                 iwm_mvm_update_quotas(sc, in);
3594                 iwm_setrates(sc, in);
3595
3596                 cmd.data[0] = &in->in_lq;
3597                 if ((error = iwm_send_cmd(sc, &cmd)) != 0) {
3598                         device_printf(sc->sc_dev,
3599                             "%s: IWM_LQ_CMD failed\n", __func__);
3600                 }
3601
3602                 break;
3603         }
3604
3605         default:
3606                 break;
3607         }
3608         IWM_UNLOCK(sc);
3609         IEEE80211_LOCK(ic);
3610
3611         return (ivp->iv_newstate(vap, nstate, arg));
3612 }
3613
3614 void
3615 iwm_endscan_cb(void *arg, int pending)
3616 {
3617         struct iwm_softc *sc = arg;
3618         struct ieee80211com *ic = &sc->sc_ic;
3619         int done;
3620         int error;
3621
3622         IWM_DPRINTF(sc, IWM_DEBUG_SCAN | IWM_DEBUG_TRACE,
3623             "%s: scan ended\n",
3624             __func__);
3625
3626         IWM_LOCK(sc);
3627         if (sc->sc_scanband == IEEE80211_CHAN_2GHZ &&
3628             sc->sc_nvm.sku_cap_band_52GHz_enable) {
3629                 done = 0;
3630                 if ((error = iwm_mvm_scan_request(sc,
3631                     IEEE80211_CHAN_5GHZ, 0, NULL, 0)) != 0) {
3632                         device_printf(sc->sc_dev, "could not initiate scan\n");
3633                         done = 1;
3634                 }
3635         } else {
3636                 done = 1;
3637         }
3638
3639         if (done) {
3640                 IWM_UNLOCK(sc);
3641                 ieee80211_scan_done(TAILQ_FIRST(&ic->ic_vaps));
3642                 IWM_LOCK(sc);
3643                 sc->sc_scanband = 0;
3644         }
3645         IWM_UNLOCK(sc);
3646 }
3647
3648 static int
3649 iwm_init_hw(struct iwm_softc *sc)
3650 {
3651         struct ieee80211com *ic = &sc->sc_ic;
3652         int error, i, qid;
3653
3654         if ((error = iwm_start_hw(sc)) != 0)
3655                 return error;
3656
3657         if ((error = iwm_run_init_mvm_ucode(sc, 0)) != 0) {
3658                 return error;
3659         }
3660
3661         /*
3662          * should stop and start HW since that INIT
3663          * image just loaded
3664          */
3665         iwm_stop_device(sc);
3666         if ((error = iwm_start_hw(sc)) != 0) {
3667                 device_printf(sc->sc_dev, "could not initialize hardware\n");
3668                 return error;
3669         }
3670
3671         /* omstart, this time with the regular firmware */
3672         error = iwm_mvm_load_ucode_wait_alive(sc, IWM_UCODE_TYPE_REGULAR);
3673         if (error) {
3674                 device_printf(sc->sc_dev, "could not load firmware\n");
3675                 goto error;
3676         }
3677
3678         if ((error = iwm_send_tx_ant_cfg(sc, IWM_FW_VALID_TX_ANT(sc))) != 0)
3679                 goto error;
3680
3681         /* Send phy db control command and then phy db calibration*/
3682         if ((error = iwm_send_phy_db_data(sc)) != 0)
3683                 goto error;
3684
3685         if ((error = iwm_send_phy_cfg_cmd(sc)) != 0)
3686                 goto error;
3687
3688         /* Add auxiliary station for scanning */
3689         if ((error = iwm_mvm_add_aux_sta(sc)) != 0)
3690                 goto error;
3691
3692         for (i = 0; i < IWM_NUM_PHY_CTX; i++) {
3693                 /*
3694                  * The channel used here isn't relevant as it's
3695                  * going to be overwritten in the other flows.
3696                  * For now use the first channel we have.
3697                  */
3698                 if ((error = iwm_mvm_phy_ctxt_add(sc,
3699                     &sc->sc_phyctxt[i], &ic->ic_channels[1], 1, 1)) != 0)
3700                         goto error;
3701         }
3702
3703         error = iwm_mvm_power_update_device(sc);
3704         if (error)
3705                 goto error;
3706
3707         /* Mark TX rings as active. */
3708         for (qid = 0; qid < 4; qid++) {
3709                 iwm_enable_txq(sc, qid, qid);
3710         }
3711
3712         return 0;
3713
3714  error:
3715         iwm_stop_device(sc);
3716         return error;
3717 }
3718
3719 /* Allow multicast from our BSSID. */
3720 static int
3721 iwm_allow_mcast(struct ieee80211vap *vap, struct iwm_softc *sc)
3722 {
3723         struct ieee80211_node *ni = vap->iv_bss;
3724         struct iwm_mcast_filter_cmd *cmd;
3725         size_t size;
3726         int error;
3727
3728         size = roundup(sizeof(*cmd), 4);
3729         cmd = malloc(size, M_DEVBUF, M_NOWAIT | M_ZERO);
3730         if (cmd == NULL)
3731                 return ENOMEM;
3732         cmd->filter_own = 1;
3733         cmd->port_id = 0;
3734         cmd->count = 0;
3735         cmd->pass_all = 1;
3736         IEEE80211_ADDR_COPY(cmd->bssid, ni->ni_bssid);
3737
3738         error = iwm_mvm_send_cmd_pdu(sc, IWM_MCAST_FILTER_CMD,
3739             IWM_CMD_SYNC, size, cmd);
3740         free(cmd, M_DEVBUF);
3741
3742         return (error);
3743 }
3744
3745 static void
3746 iwm_init(struct iwm_softc *sc)
3747 {
3748         int error;
3749
3750         if (sc->sc_flags & IWM_FLAG_HW_INITED) {
3751                 return;
3752         }
3753         sc->sc_generation++;
3754         sc->sc_flags &= ~IWM_FLAG_STOPPED;
3755
3756         if ((error = iwm_init_hw(sc)) != 0) {
3757                 iwm_stop(sc);
3758                 return;
3759         }
3760
3761         /*
3762          * Ok, firmware loaded and we are jogging
3763          */
3764         sc->sc_flags |= IWM_FLAG_HW_INITED;
3765         callout_reset(&sc->sc_watchdog_to, hz, iwm_watchdog, sc);
3766 }
3767
3768 static int
3769 iwm_transmit(struct ieee80211com *ic, struct mbuf *m)
3770 {
3771         struct iwm_softc *sc;
3772         int error;
3773
3774         sc = ic->ic_softc;
3775
3776         IWM_LOCK(sc);
3777         if ((sc->sc_flags & IWM_FLAG_HW_INITED) == 0) {
3778                 IWM_UNLOCK(sc);
3779                 return (ENXIO);
3780         }
3781         error = mbufq_enqueue(&sc->sc_snd, m);
3782         if (error) {
3783                 IWM_UNLOCK(sc);
3784                 return (error);
3785         }
3786         iwm_start(sc);
3787         IWM_UNLOCK(sc);
3788         return (0);
3789 }
3790
3791 /*
3792  * Dequeue packets from sendq and call send.
3793  */
3794 static void
3795 iwm_start(struct iwm_softc *sc)
3796 {
3797         struct ieee80211_node *ni;
3798         struct mbuf *m;
3799         int ac = 0;
3800
3801         IWM_DPRINTF(sc, IWM_DEBUG_XMIT | IWM_DEBUG_TRACE, "->%s\n", __func__);
3802         while (sc->qfullmsk == 0 &&
3803                 (m = mbufq_dequeue(&sc->sc_snd)) != NULL) {
3804                 ni = (struct ieee80211_node *)m->m_pkthdr.rcvif;
3805                 if (iwm_tx(sc, m, ni, ac) != 0) {
3806                         if_inc_counter(ni->ni_vap->iv_ifp,
3807                             IFCOUNTER_OERRORS, 1);
3808                         ieee80211_free_node(ni);
3809                         continue;
3810                 }
3811                 sc->sc_tx_timer = 15;
3812         }
3813         IWM_DPRINTF(sc, IWM_DEBUG_XMIT | IWM_DEBUG_TRACE, "<-%s\n", __func__);
3814 }
3815
3816 static void
3817 iwm_stop(struct iwm_softc *sc)
3818 {
3819
3820         sc->sc_flags &= ~IWM_FLAG_HW_INITED;
3821         sc->sc_flags |= IWM_FLAG_STOPPED;
3822         sc->sc_generation++;
3823         sc->sc_scanband = 0;
3824         sc->sc_auth_prot = 0;
3825         sc->sc_tx_timer = 0;
3826         iwm_stop_device(sc);
3827 }
3828
3829 static void
3830 iwm_watchdog(void *arg)
3831 {
3832         struct iwm_softc *sc = arg;
3833
3834         if (sc->sc_tx_timer > 0) {
3835                 if (--sc->sc_tx_timer == 0) {
3836                         device_printf(sc->sc_dev, "device timeout\n");
3837 #ifdef IWM_DEBUG
3838                         iwm_nic_error(sc);
3839 #endif
3840                         iwm_stop(sc);
3841                         counter_u64_add(sc->sc_ic.ic_oerrors, 1);
3842                         return;
3843                 }
3844         }
3845         callout_reset(&sc->sc_watchdog_to, hz, iwm_watchdog, sc);
3846 }
3847
3848 static void
3849 iwm_parent(struct ieee80211com *ic)
3850 {
3851         struct iwm_softc *sc = ic->ic_softc;
3852         int startall = 0;
3853
3854         IWM_LOCK(sc);
3855         if (ic->ic_nrunning > 0) {
3856                 if (!(sc->sc_flags & IWM_FLAG_HW_INITED)) {
3857                         iwm_init(sc);
3858                         startall = 1;
3859                 }
3860         } else if (sc->sc_flags & IWM_FLAG_HW_INITED)
3861                 iwm_stop(sc);
3862         IWM_UNLOCK(sc);
3863         if (startall)
3864                 ieee80211_start_all(ic);
3865 }
3866
3867 /*
3868  * The interrupt side of things
3869  */
3870
3871 /*
3872  * error dumping routines are from iwlwifi/mvm/utils.c
3873  */
3874
3875 /*
3876  * Note: This structure is read from the device with IO accesses,
3877  * and the reading already does the endian conversion. As it is
3878  * read with uint32_t-sized accesses, any members with a different size
3879  * need to be ordered correctly though!
3880  */
3881 struct iwm_error_event_table {
3882         uint32_t valid;         /* (nonzero) valid, (0) log is empty */
3883         uint32_t error_id;              /* type of error */
3884         uint32_t pc;                    /* program counter */
3885         uint32_t blink1;                /* branch link */
3886         uint32_t blink2;                /* branch link */
3887         uint32_t ilink1;                /* interrupt link */
3888         uint32_t ilink2;                /* interrupt link */
3889         uint32_t data1;         /* error-specific data */
3890         uint32_t data2;         /* error-specific data */
3891         uint32_t data3;         /* error-specific data */
3892         uint32_t bcon_time;             /* beacon timer */
3893         uint32_t tsf_low;               /* network timestamp function timer */
3894         uint32_t tsf_hi;                /* network timestamp function timer */
3895         uint32_t gp1;           /* GP1 timer register */
3896         uint32_t gp2;           /* GP2 timer register */
3897         uint32_t gp3;           /* GP3 timer register */
3898         uint32_t ucode_ver;             /* uCode version */
3899         uint32_t hw_ver;                /* HW Silicon version */
3900         uint32_t brd_ver;               /* HW board version */
3901         uint32_t log_pc;                /* log program counter */
3902         uint32_t frame_ptr;             /* frame pointer */
3903         uint32_t stack_ptr;             /* stack pointer */
3904         uint32_t hcmd;          /* last host command header */
3905         uint32_t isr0;          /* isr status register LMPM_NIC_ISR0:
3906                                  * rxtx_flag */
3907         uint32_t isr1;          /* isr status register LMPM_NIC_ISR1:
3908                                  * host_flag */
3909         uint32_t isr2;          /* isr status register LMPM_NIC_ISR2:
3910                                  * enc_flag */
3911         uint32_t isr3;          /* isr status register LMPM_NIC_ISR3:
3912                                  * time_flag */
3913         uint32_t isr4;          /* isr status register LMPM_NIC_ISR4:
3914                                  * wico interrupt */
3915         uint32_t isr_pref;              /* isr status register LMPM_NIC_PREF_STAT */
3916         uint32_t wait_event;            /* wait event() caller address */
3917         uint32_t l2p_control;   /* L2pControlField */
3918         uint32_t l2p_duration;  /* L2pDurationField */
3919         uint32_t l2p_mhvalid;   /* L2pMhValidBits */
3920         uint32_t l2p_addr_match;        /* L2pAddrMatchStat */
3921         uint32_t lmpm_pmg_sel;  /* indicate which clocks are turned on
3922                                  * (LMPM_PMG_SEL) */
3923         uint32_t u_timestamp;   /* indicate when the date and time of the
3924                                  * compilation */
3925         uint32_t flow_handler;  /* FH read/write pointers, RX credit */
3926 } __packed;
3927
3928 #define ERROR_START_OFFSET  (1 * sizeof(uint32_t))
3929 #define ERROR_ELEM_SIZE     (7 * sizeof(uint32_t))
3930
3931 #ifdef IWM_DEBUG
3932 struct {
3933         const char *name;
3934         uint8_t num;
3935 } advanced_lookup[] = {
3936         { "NMI_INTERRUPT_WDG", 0x34 },
3937         { "SYSASSERT", 0x35 },
3938         { "UCODE_VERSION_MISMATCH", 0x37 },
3939         { "BAD_COMMAND", 0x38 },
3940         { "NMI_INTERRUPT_DATA_ACTION_PT", 0x3C },
3941         { "FATAL_ERROR", 0x3D },
3942         { "NMI_TRM_HW_ERR", 0x46 },
3943         { "NMI_INTERRUPT_TRM", 0x4C },
3944         { "NMI_INTERRUPT_BREAK_POINT", 0x54 },
3945         { "NMI_INTERRUPT_WDG_RXF_FULL", 0x5C },
3946         { "NMI_INTERRUPT_WDG_NO_RBD_RXF_FULL", 0x64 },
3947         { "NMI_INTERRUPT_HOST", 0x66 },
3948         { "NMI_INTERRUPT_ACTION_PT", 0x7C },
3949         { "NMI_INTERRUPT_UNKNOWN", 0x84 },
3950         { "NMI_INTERRUPT_INST_ACTION_PT", 0x86 },
3951         { "ADVANCED_SYSASSERT", 0 },
3952 };
3953
3954 static const char *
3955 iwm_desc_lookup(uint32_t num)
3956 {
3957         int i;
3958
3959         for (i = 0; i < nitems(advanced_lookup) - 1; i++)
3960                 if (advanced_lookup[i].num == num)
3961                         return advanced_lookup[i].name;
3962
3963         /* No entry matches 'num', so it is the last: ADVANCED_SYSASSERT */
3964         return advanced_lookup[i].name;
3965 }
3966
3967 /*
3968  * Support for dumping the error log seemed like a good idea ...
3969  * but it's mostly hex junk and the only sensible thing is the
3970  * hw/ucode revision (which we know anyway).  Since it's here,
3971  * I'll just leave it in, just in case e.g. the Intel guys want to
3972  * help us decipher some "ADVANCED_SYSASSERT" later.
3973  */
3974 static void
3975 iwm_nic_error(struct iwm_softc *sc)
3976 {
3977         struct iwm_error_event_table table;
3978         uint32_t base;
3979
3980         device_printf(sc->sc_dev, "dumping device error log\n");
3981         base = sc->sc_uc.uc_error_event_table;
3982         if (base < 0x800000 || base >= 0x80C000) {
3983                 device_printf(sc->sc_dev,
3984                     "Not valid error log pointer 0x%08x\n", base);
3985                 return;
3986         }
3987
3988         if (iwm_read_mem(sc, base, &table, sizeof(table)/sizeof(uint32_t)) != 0) {
3989                 device_printf(sc->sc_dev, "reading errlog failed\n");
3990                 return;
3991         }
3992
3993         if (!table.valid) {
3994                 device_printf(sc->sc_dev, "errlog not found, skipping\n");
3995                 return;
3996         }
3997
3998         if (ERROR_START_OFFSET <= table.valid * ERROR_ELEM_SIZE) {
3999                 device_printf(sc->sc_dev, "Start IWL Error Log Dump:\n");
4000                 device_printf(sc->sc_dev, "Status: 0x%x, count: %d\n",
4001                     sc->sc_flags, table.valid);
4002         }
4003
4004         device_printf(sc->sc_dev, "0x%08X | %-28s\n", table.error_id,
4005                 iwm_desc_lookup(table.error_id));
4006         device_printf(sc->sc_dev, "%08X | uPc\n", table.pc);
4007         device_printf(sc->sc_dev, "%08X | branchlink1\n", table.blink1);
4008         device_printf(sc->sc_dev, "%08X | branchlink2\n", table.blink2);
4009         device_printf(sc->sc_dev, "%08X | interruptlink1\n", table.ilink1);
4010         device_printf(sc->sc_dev, "%08X | interruptlink2\n", table.ilink2);
4011         device_printf(sc->sc_dev, "%08X | data1\n", table.data1);
4012         device_printf(sc->sc_dev, "%08X | data2\n", table.data2);
4013         device_printf(sc->sc_dev, "%08X | data3\n", table.data3);
4014         device_printf(sc->sc_dev, "%08X | beacon time\n", table.bcon_time);
4015         device_printf(sc->sc_dev, "%08X | tsf low\n", table.tsf_low);
4016         device_printf(sc->sc_dev, "%08X | tsf hi\n", table.tsf_hi);
4017         device_printf(sc->sc_dev, "%08X | time gp1\n", table.gp1);
4018         device_printf(sc->sc_dev, "%08X | time gp2\n", table.gp2);
4019         device_printf(sc->sc_dev, "%08X | time gp3\n", table.gp3);
4020         device_printf(sc->sc_dev, "%08X | uCode version\n", table.ucode_ver);
4021         device_printf(sc->sc_dev, "%08X | hw version\n", table.hw_ver);
4022         device_printf(sc->sc_dev, "%08X | board version\n", table.brd_ver);
4023         device_printf(sc->sc_dev, "%08X | hcmd\n", table.hcmd);
4024         device_printf(sc->sc_dev, "%08X | isr0\n", table.isr0);
4025         device_printf(sc->sc_dev, "%08X | isr1\n", table.isr1);
4026         device_printf(sc->sc_dev, "%08X | isr2\n", table.isr2);
4027         device_printf(sc->sc_dev, "%08X | isr3\n", table.isr3);
4028         device_printf(sc->sc_dev, "%08X | isr4\n", table.isr4);
4029         device_printf(sc->sc_dev, "%08X | isr_pref\n", table.isr_pref);
4030         device_printf(sc->sc_dev, "%08X | wait_event\n", table.wait_event);
4031         device_printf(sc->sc_dev, "%08X | l2p_control\n", table.l2p_control);
4032         device_printf(sc->sc_dev, "%08X | l2p_duration\n", table.l2p_duration);
4033         device_printf(sc->sc_dev, "%08X | l2p_mhvalid\n", table.l2p_mhvalid);
4034         device_printf(sc->sc_dev, "%08X | l2p_addr_match\n", table.l2p_addr_match);
4035         device_printf(sc->sc_dev, "%08X | lmpm_pmg_sel\n", table.lmpm_pmg_sel);
4036         device_printf(sc->sc_dev, "%08X | timestamp\n", table.u_timestamp);
4037         device_printf(sc->sc_dev, "%08X | flow_handler\n", table.flow_handler);
4038 }
4039 #endif
4040
4041 #define SYNC_RESP_STRUCT(_var_, _pkt_)                                  \
4042 do {                                                                    \
4043         bus_dmamap_sync(ring->data_dmat, data->map, BUS_DMASYNC_POSTREAD);\
4044         _var_ = (void *)((_pkt_)+1);                                    \
4045 } while (/*CONSTCOND*/0)
4046
4047 #define SYNC_RESP_PTR(_ptr_, _len_, _pkt_)                              \
4048 do {                                                                    \
4049         bus_dmamap_sync(ring->data_dmat, data->map, BUS_DMASYNC_POSTREAD);\
4050         _ptr_ = (void *)((_pkt_)+1);                                    \
4051 } while (/*CONSTCOND*/0)
4052
4053 #define ADVANCE_RXQ(sc) (sc->rxq.cur = (sc->rxq.cur + 1) % IWM_RX_RING_COUNT);
4054
4055 /*
4056  * Process an IWM_CSR_INT_BIT_FH_RX or IWM_CSR_INT_BIT_SW_RX interrupt.
4057  * Basic structure from if_iwn
4058  */
4059 static void
4060 iwm_notif_intr(struct iwm_softc *sc)
4061 {
4062         uint16_t hw;
4063
4064         bus_dmamap_sync(sc->rxq.stat_dma.tag, sc->rxq.stat_dma.map,
4065             BUS_DMASYNC_POSTREAD);
4066
4067         hw = le16toh(sc->rxq.stat->closed_rb_num) & 0xfff;
4068         while (sc->rxq.cur != hw) {
4069                 struct iwm_rx_ring *ring = &sc->rxq;
4070                 struct iwm_rx_data *data = &sc->rxq.data[sc->rxq.cur];
4071                 struct iwm_rx_packet *pkt;
4072                 struct iwm_cmd_response *cresp;
4073                 int qid, idx;
4074
4075                 bus_dmamap_sync(sc->rxq.data_dmat, data->map,
4076                     BUS_DMASYNC_POSTREAD);
4077                 pkt = mtod(data->m, struct iwm_rx_packet *);
4078
4079                 qid = pkt->hdr.qid & ~0x80;
4080                 idx = pkt->hdr.idx;
4081
4082                 IWM_DPRINTF(sc, IWM_DEBUG_INTR,
4083                     "rx packet qid=%d idx=%d flags=%x type=%x %d %d\n",
4084                     pkt->hdr.qid & ~0x80, pkt->hdr.idx, pkt->hdr.flags,
4085                     pkt->hdr.code, sc->rxq.cur, hw);
4086
4087                 /*
4088                  * randomly get these from the firmware, no idea why.
4089                  * they at least seem harmless, so just ignore them for now
4090                  */
4091                 if (__predict_false((pkt->hdr.code == 0 && qid == 0 && idx == 0)
4092                     || pkt->len_n_flags == htole32(0x55550000))) {
4093                         ADVANCE_RXQ(sc);
4094                         continue;
4095                 }
4096
4097                 switch (pkt->hdr.code) {
4098                 case IWM_REPLY_RX_PHY_CMD:
4099                         iwm_mvm_rx_rx_phy_cmd(sc, pkt, data);
4100                         break;
4101
4102                 case IWM_REPLY_RX_MPDU_CMD:
4103                         iwm_mvm_rx_rx_mpdu(sc, pkt, data);
4104                         break;
4105
4106                 case IWM_TX_CMD:
4107                         iwm_mvm_rx_tx_cmd(sc, pkt, data);
4108                         break;
4109
4110                 case IWM_MISSED_BEACONS_NOTIFICATION: {
4111                         struct iwm_missed_beacons_notif *resp;
4112                         int missed;
4113
4114                         /* XXX look at mac_id to determine interface ID */
4115                         struct ieee80211com *ic = &sc->sc_ic;
4116                         struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps);
4117
4118                         SYNC_RESP_STRUCT(resp, pkt);
4119                         missed = le32toh(resp->consec_missed_beacons);
4120
4121                         IWM_DPRINTF(sc, IWM_DEBUG_BEACON | IWM_DEBUG_STATE,
4122                             "%s: MISSED_BEACON: mac_id=%d, "
4123                             "consec_since_last_rx=%d, consec=%d, num_expect=%d "
4124                             "num_rx=%d\n",
4125                             __func__,
4126                             le32toh(resp->mac_id),
4127                             le32toh(resp->consec_missed_beacons_since_last_rx),
4128                             le32toh(resp->consec_missed_beacons),
4129                             le32toh(resp->num_expected_beacons),
4130                             le32toh(resp->num_recvd_beacons));
4131
4132                         /* Be paranoid */
4133                         if (vap == NULL)
4134                                 break;
4135
4136                         /* XXX no net80211 locking? */
4137                         if (vap->iv_state == IEEE80211_S_RUN &&
4138                             (ic->ic_flags & IEEE80211_F_SCAN) == 0) {
4139                                 if (missed > vap->iv_bmissthreshold) {
4140                                         /* XXX bad locking; turn into task */
4141                                         IWM_UNLOCK(sc);
4142                                         ieee80211_beacon_miss(ic);
4143                                         IWM_LOCK(sc);
4144                                 }
4145                         }
4146
4147                         break; }
4148
4149                 case IWM_MVM_ALIVE: {
4150                         struct iwm_mvm_alive_resp *resp;
4151                         SYNC_RESP_STRUCT(resp, pkt);
4152
4153                         sc->sc_uc.uc_error_event_table
4154                             = le32toh(resp->error_event_table_ptr);
4155                         sc->sc_uc.uc_log_event_table
4156                             = le32toh(resp->log_event_table_ptr);
4157                         sc->sched_base = le32toh(resp->scd_base_ptr);
4158                         sc->sc_uc.uc_ok = resp->status == IWM_ALIVE_STATUS_OK;
4159
4160                         sc->sc_uc.uc_intr = 1;
4161                         wakeup(&sc->sc_uc);
4162                         break; }
4163
4164                 case IWM_CALIB_RES_NOTIF_PHY_DB: {
4165                         struct iwm_calib_res_notif_phy_db *phy_db_notif;
4166                         SYNC_RESP_STRUCT(phy_db_notif, pkt);
4167
4168                         iwm_phy_db_set_section(sc, phy_db_notif);
4169
4170                         break; }
4171
4172                 case IWM_STATISTICS_NOTIFICATION: {
4173                         struct iwm_notif_statistics *stats;
4174                         SYNC_RESP_STRUCT(stats, pkt);
4175                         memcpy(&sc->sc_stats, stats, sizeof(sc->sc_stats));
4176                         sc->sc_noise = iwm_get_noise(&stats->rx.general);
4177                         break; }
4178
4179                 case IWM_NVM_ACCESS_CMD:
4180                         if (sc->sc_wantresp == ((qid << 16) | idx)) {
4181                                 bus_dmamap_sync(sc->rxq.data_dmat, data->map,
4182                                     BUS_DMASYNC_POSTREAD);
4183                                 memcpy(sc->sc_cmd_resp,
4184                                     pkt, sizeof(sc->sc_cmd_resp));
4185                         }
4186                         break;
4187
4188                 case IWM_PHY_CONFIGURATION_CMD:
4189                 case IWM_TX_ANT_CONFIGURATION_CMD:
4190                 case IWM_ADD_STA:
4191                 case IWM_MAC_CONTEXT_CMD:
4192                 case IWM_REPLY_SF_CFG_CMD:
4193                 case IWM_POWER_TABLE_CMD:
4194                 case IWM_PHY_CONTEXT_CMD:
4195                 case IWM_BINDING_CONTEXT_CMD:
4196                 case IWM_TIME_EVENT_CMD:
4197                 case IWM_SCAN_REQUEST_CMD:
4198                 case IWM_REPLY_BEACON_FILTERING_CMD:
4199                 case IWM_MAC_PM_POWER_TABLE:
4200                 case IWM_TIME_QUOTA_CMD:
4201                 case IWM_REMOVE_STA:
4202                 case IWM_TXPATH_FLUSH:
4203                 case IWM_LQ_CMD:
4204                         SYNC_RESP_STRUCT(cresp, pkt);
4205                         if (sc->sc_wantresp == ((qid << 16) | idx)) {
4206                                 memcpy(sc->sc_cmd_resp,
4207                                     pkt, sizeof(*pkt)+sizeof(*cresp));
4208                         }
4209                         break;
4210
4211                 /* ignore */
4212                 case 0x6c: /* IWM_PHY_DB_CMD, no idea why it's not in fw-api.h */
4213                         break;
4214
4215                 case IWM_INIT_COMPLETE_NOTIF:
4216                         sc->sc_init_complete = 1;
4217                         wakeup(&sc->sc_init_complete);
4218                         break;
4219
4220                 case IWM_SCAN_COMPLETE_NOTIFICATION: {
4221                         struct iwm_scan_complete_notif *notif;
4222                         SYNC_RESP_STRUCT(notif, pkt);
4223                         taskqueue_enqueue(sc->sc_tq, &sc->sc_es_task);
4224                         break; }
4225
4226                 case IWM_REPLY_ERROR: {
4227                         struct iwm_error_resp *resp;
4228                         SYNC_RESP_STRUCT(resp, pkt);
4229
4230                         device_printf(sc->sc_dev,
4231                             "firmware error 0x%x, cmd 0x%x\n",
4232                             le32toh(resp->error_type),
4233                             resp->cmd_id);
4234                         break; }
4235
4236                 case IWM_TIME_EVENT_NOTIFICATION: {
4237                         struct iwm_time_event_notif *notif;
4238                         SYNC_RESP_STRUCT(notif, pkt);
4239
4240                         if (notif->status) {
4241                                 if (le32toh(notif->action) &
4242                                     IWM_TE_V2_NOTIF_HOST_EVENT_START)
4243                                         sc->sc_auth_prot = 2;
4244                                 else
4245                                         sc->sc_auth_prot = 0;
4246                         } else {
4247                                 sc->sc_auth_prot = -1;
4248                         }
4249                         IWM_DPRINTF(sc, IWM_DEBUG_INTR,
4250                             "%s: time event notification auth_prot=%d\n",
4251                                 __func__, sc->sc_auth_prot);
4252
4253                         wakeup(&sc->sc_auth_prot);
4254                         break; }
4255
4256                 case IWM_MCAST_FILTER_CMD:
4257                         break;
4258
4259                 default:
4260                         device_printf(sc->sc_dev,
4261                             "frame %d/%d %x UNHANDLED (this should "
4262                             "not happen)\n", qid, idx,
4263                             pkt->len_n_flags);
4264                         break;
4265                 }
4266
4267                 /*
4268                  * Why test bit 0x80?  The Linux driver:
4269                  *
4270                  * There is one exception:  uCode sets bit 15 when it
4271                  * originates the response/notification, i.e. when the
4272                  * response/notification is not a direct response to a
4273                  * command sent by the driver.  For example, uCode issues
4274                  * IWM_REPLY_RX when it sends a received frame to the driver;
4275                  * it is not a direct response to any driver command.
4276                  *
4277                  * Ok, so since when is 7 == 15?  Well, the Linux driver
4278                  * uses a slightly different format for pkt->hdr, and "qid"
4279                  * is actually the upper byte of a two-byte field.
4280                  */
4281                 if (!(pkt->hdr.qid & (1 << 7))) {
4282                         iwm_cmd_done(sc, pkt);
4283                 }
4284
4285                 ADVANCE_RXQ(sc);
4286         }
4287
4288         IWM_CLRBITS(sc, IWM_CSR_GP_CNTRL,
4289             IWM_CSR_GP_CNTRL_REG_FLAG_MAC_ACCESS_REQ);
4290
4291         /*
4292          * Tell the firmware what we have processed.
4293          * Seems like the hardware gets upset unless we align
4294          * the write by 8??
4295          */
4296         hw = (hw == 0) ? IWM_RX_RING_COUNT - 1 : hw - 1;
4297         IWM_WRITE(sc, IWM_FH_RSCSR_CHNL0_WPTR, hw & ~7);
4298 }
4299
4300 static void
4301 iwm_intr(void *arg)
4302 {
4303         struct iwm_softc *sc = arg;
4304         int handled = 0;
4305         int r1, r2, rv = 0;
4306         int isperiodic = 0;
4307
4308         IWM_LOCK(sc);
4309         IWM_WRITE(sc, IWM_CSR_INT_MASK, 0);
4310
4311         if (sc->sc_flags & IWM_FLAG_USE_ICT) {
4312                 uint32_t *ict = sc->ict_dma.vaddr;
4313                 int tmp;
4314
4315                 tmp = htole32(ict[sc->ict_cur]);
4316                 if (!tmp)
4317                         goto out_ena;
4318
4319                 /*
4320                  * ok, there was something.  keep plowing until we have all.
4321                  */
4322                 r1 = r2 = 0;
4323                 while (tmp) {
4324                         r1 |= tmp;
4325                         ict[sc->ict_cur] = 0;
4326                         sc->ict_cur = (sc->ict_cur+1) % IWM_ICT_COUNT;
4327                         tmp = htole32(ict[sc->ict_cur]);
4328                 }
4329
4330                 /* this is where the fun begins.  don't ask */
4331                 if (r1 == 0xffffffff)
4332                         r1 = 0;
4333
4334                 /* i am not expected to understand this */
4335                 if (r1 & 0xc0000)
4336                         r1 |= 0x8000;
4337                 r1 = (0xff & r1) | ((0xff00 & r1) << 16);
4338         } else {
4339                 r1 = IWM_READ(sc, IWM_CSR_INT);
4340                 /* "hardware gone" (where, fishing?) */
4341                 if (r1 == 0xffffffff || (r1 & 0xfffffff0) == 0xa5a5a5a0)
4342                         goto out;
4343                 r2 = IWM_READ(sc, IWM_CSR_FH_INT_STATUS);
4344         }
4345         if (r1 == 0 && r2 == 0) {
4346                 goto out_ena;
4347         }
4348
4349         IWM_WRITE(sc, IWM_CSR_INT, r1 | ~sc->sc_intmask);
4350
4351         /* ignored */
4352         handled |= (r1 & (IWM_CSR_INT_BIT_ALIVE /*| IWM_CSR_INT_BIT_SCD*/));
4353
4354         if (r1 & IWM_CSR_INT_BIT_SW_ERR) {
4355 #ifdef IWM_DEBUG
4356                 int i;
4357                 struct ieee80211com *ic = &sc->sc_ic;
4358                 struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps);
4359
4360                 iwm_nic_error(sc);
4361
4362                 /* Dump driver status (TX and RX rings) while we're here. */
4363                 device_printf(sc->sc_dev, "driver status:\n");
4364                 for (i = 0; i < IWM_MVM_MAX_QUEUES; i++) {
4365                         struct iwm_tx_ring *ring = &sc->txq[i];
4366                         device_printf(sc->sc_dev,
4367                             "  tx ring %2d: qid=%-2d cur=%-3d "
4368                             "queued=%-3d\n",
4369                             i, ring->qid, ring->cur, ring->queued);
4370                 }
4371                 device_printf(sc->sc_dev,
4372                     "  rx ring: cur=%d\n", sc->rxq.cur);
4373                 device_printf(sc->sc_dev,
4374                     "  802.11 state %d\n", vap->iv_state);
4375 #endif
4376
4377                 device_printf(sc->sc_dev, "fatal firmware error\n");
4378                 iwm_stop(sc);
4379                 rv = 1;
4380                 goto out;
4381
4382         }
4383
4384         if (r1 & IWM_CSR_INT_BIT_HW_ERR) {
4385                 handled |= IWM_CSR_INT_BIT_HW_ERR;
4386                 device_printf(sc->sc_dev, "hardware error, stopping device\n");
4387                 iwm_stop(sc);
4388                 rv = 1;
4389                 goto out;
4390         }
4391
4392         /* firmware chunk loaded */
4393         if (r1 & IWM_CSR_INT_BIT_FH_TX) {
4394                 IWM_WRITE(sc, IWM_CSR_FH_INT_STATUS, IWM_CSR_FH_INT_TX_MASK);
4395                 handled |= IWM_CSR_INT_BIT_FH_TX;
4396                 sc->sc_fw_chunk_done = 1;
4397                 wakeup(&sc->sc_fw);
4398         }
4399
4400         if (r1 & IWM_CSR_INT_BIT_RF_KILL) {
4401                 handled |= IWM_CSR_INT_BIT_RF_KILL;
4402                 if (iwm_check_rfkill(sc)) {
4403                         device_printf(sc->sc_dev,
4404                             "%s: rfkill switch, disabling interface\n",
4405                             __func__);
4406                         iwm_stop(sc);
4407                 }
4408         }
4409
4410         /*
4411          * The Linux driver uses periodic interrupts to avoid races.
4412          * We cargo-cult like it's going out of fashion.
4413          */
4414         if (r1 & IWM_CSR_INT_BIT_RX_PERIODIC) {
4415                 handled |= IWM_CSR_INT_BIT_RX_PERIODIC;
4416                 IWM_WRITE(sc, IWM_CSR_INT, IWM_CSR_INT_BIT_RX_PERIODIC);
4417                 if ((r1 & (IWM_CSR_INT_BIT_FH_RX | IWM_CSR_INT_BIT_SW_RX)) == 0)
4418                         IWM_WRITE_1(sc,
4419                             IWM_CSR_INT_PERIODIC_REG, IWM_CSR_INT_PERIODIC_DIS);
4420                 isperiodic = 1;
4421         }
4422
4423         if ((r1 & (IWM_CSR_INT_BIT_FH_RX | IWM_CSR_INT_BIT_SW_RX)) || isperiodic) {
4424                 handled |= (IWM_CSR_INT_BIT_FH_RX | IWM_CSR_INT_BIT_SW_RX);
4425                 IWM_WRITE(sc, IWM_CSR_FH_INT_STATUS, IWM_CSR_FH_INT_RX_MASK);
4426
4427                 iwm_notif_intr(sc);
4428
4429                 /* enable periodic interrupt, see above */
4430                 if (r1 & (IWM_CSR_INT_BIT_FH_RX | IWM_CSR_INT_BIT_SW_RX) && !isperiodic)
4431                         IWM_WRITE_1(sc, IWM_CSR_INT_PERIODIC_REG,
4432                             IWM_CSR_INT_PERIODIC_ENA);
4433         }
4434
4435         if (__predict_false(r1 & ~handled))
4436                 IWM_DPRINTF(sc, IWM_DEBUG_INTR,
4437                     "%s: unhandled interrupts: %x\n", __func__, r1);
4438         rv = 1;
4439
4440  out_ena:
4441         iwm_restore_interrupts(sc);
4442  out:
4443         IWM_UNLOCK(sc);
4444         return;
4445 }
4446
4447 /*
4448  * Autoconf glue-sniffing
4449  */
4450 #define PCI_VENDOR_INTEL                0x8086
4451 #define PCI_PRODUCT_INTEL_WL_3160_1     0x08b3
4452 #define PCI_PRODUCT_INTEL_WL_3160_2     0x08b4
4453 #define PCI_PRODUCT_INTEL_WL_7260_1     0x08b1
4454 #define PCI_PRODUCT_INTEL_WL_7260_2     0x08b2
4455 #define PCI_PRODUCT_INTEL_WL_7265_1     0x095a
4456 #define PCI_PRODUCT_INTEL_WL_7265_2     0x095b
4457
4458 static const struct iwm_devices {
4459         uint16_t        device;
4460         const char      *name;
4461 } iwm_devices[] = {
4462         { PCI_PRODUCT_INTEL_WL_3160_1, "Intel Dual Band Wireless AC 3160" },
4463         { PCI_PRODUCT_INTEL_WL_3160_2, "Intel Dual Band Wireless AC 3160" },
4464         { PCI_PRODUCT_INTEL_WL_7260_1, "Intel Dual Band Wireless AC 7260" },
4465         { PCI_PRODUCT_INTEL_WL_7260_2, "Intel Dual Band Wireless AC 7260" },
4466         { PCI_PRODUCT_INTEL_WL_7265_1, "Intel Dual Band Wireless AC 7265" },
4467         { PCI_PRODUCT_INTEL_WL_7265_2, "Intel Dual Band Wireless AC 7265" },
4468 };
4469
4470 static int
4471 iwm_probe(device_t dev)
4472 {
4473         int i;
4474
4475         for (i = 0; i < nitems(iwm_devices); i++)
4476                 if (pci_get_vendor(dev) == PCI_VENDOR_INTEL &&
4477                     pci_get_device(dev) == iwm_devices[i].device) {
4478                         device_set_desc(dev, iwm_devices[i].name);
4479                         return (BUS_PROBE_DEFAULT);
4480                 }
4481
4482         return (ENXIO);
4483 }
4484
4485 static int
4486 iwm_dev_check(device_t dev)
4487 {
4488         struct iwm_softc *sc;
4489
4490         sc = device_get_softc(dev);
4491
4492         switch (pci_get_device(dev)) {
4493         case PCI_PRODUCT_INTEL_WL_3160_1:
4494         case PCI_PRODUCT_INTEL_WL_3160_2:
4495                 sc->sc_fwname = "iwm3160fw";
4496                 sc->host_interrupt_operation_mode = 1;
4497                 return (0);
4498         case PCI_PRODUCT_INTEL_WL_7260_1:
4499         case PCI_PRODUCT_INTEL_WL_7260_2:
4500                 sc->sc_fwname = "iwm7260fw";
4501                 sc->host_interrupt_operation_mode = 1;
4502                 return (0);
4503         case PCI_PRODUCT_INTEL_WL_7265_1:
4504         case PCI_PRODUCT_INTEL_WL_7265_2:
4505                 sc->sc_fwname = "iwm7265fw";
4506                 sc->host_interrupt_operation_mode = 0;
4507                 return (0);
4508         default:
4509                 device_printf(dev, "unknown adapter type\n");
4510                 return ENXIO;
4511         }
4512 }
4513
4514 static int
4515 iwm_pci_attach(device_t dev)
4516 {
4517         struct iwm_softc *sc;
4518         int count, error, rid;
4519         uint16_t reg;
4520
4521         sc = device_get_softc(dev);
4522
4523         /* Clear device-specific "PCI retry timeout" register (41h). */
4524         reg = pci_read_config(dev, 0x40, sizeof(reg));
4525         pci_write_config(dev, 0x40, reg & ~0xff00, sizeof(reg));
4526
4527         /* Enable bus-mastering and hardware bug workaround. */
4528         pci_enable_busmaster(dev);
4529         reg = pci_read_config(dev, PCIR_STATUS, sizeof(reg));
4530         /* if !MSI */
4531         if (reg & PCIM_STATUS_INTxSTATE) {
4532                 reg &= ~PCIM_STATUS_INTxSTATE;
4533         }
4534         pci_write_config(dev, PCIR_STATUS, reg, sizeof(reg));
4535
4536         rid = PCIR_BAR(0);
4537         sc->sc_mem = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid,
4538             RF_ACTIVE);
4539         if (sc->sc_mem == NULL) {
4540                 device_printf(sc->sc_dev, "can't map mem space\n");
4541                 return (ENXIO);
4542         }
4543         sc->sc_st = rman_get_bustag(sc->sc_mem);
4544         sc->sc_sh = rman_get_bushandle(sc->sc_mem);
4545
4546         /* Install interrupt handler. */
4547         count = 1;
4548         rid = 0;
4549         if (pci_alloc_msi(dev, &count) == 0)
4550                 rid = 1;
4551         sc->sc_irq = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid, RF_ACTIVE |
4552             (rid != 0 ? 0 : RF_SHAREABLE));
4553         if (sc->sc_irq == NULL) {
4554                 device_printf(dev, "can't map interrupt\n");
4555                         return (ENXIO);
4556         }
4557         error = bus_setup_intr(dev, sc->sc_irq, INTR_TYPE_NET | INTR_MPSAFE,
4558             NULL, iwm_intr, sc, &sc->sc_ih);
4559         if (sc->sc_ih == NULL) {
4560                 device_printf(dev, "can't establish interrupt");
4561                         return (ENXIO);
4562         }
4563         sc->sc_dmat = bus_get_dma_tag(sc->sc_dev);
4564
4565         return (0);
4566 }
4567
4568 static void
4569 iwm_pci_detach(device_t dev)
4570 {
4571         struct iwm_softc *sc = device_get_softc(dev);
4572
4573         if (sc->sc_irq != NULL) {
4574                 bus_teardown_intr(dev, sc->sc_irq, sc->sc_ih);
4575                 bus_release_resource(dev, SYS_RES_IRQ,
4576                     rman_get_rid(sc->sc_irq), sc->sc_irq);
4577                 pci_release_msi(dev);
4578         }
4579         if (sc->sc_mem != NULL)
4580                 bus_release_resource(dev, SYS_RES_MEMORY,
4581                     rman_get_rid(sc->sc_mem), sc->sc_mem);
4582 }
4583
4584
4585
4586 static int
4587 iwm_attach(device_t dev)
4588 {
4589         struct iwm_softc *sc = device_get_softc(dev);
4590         struct ieee80211com *ic = &sc->sc_ic;
4591         int error;
4592         int txq_i, i;
4593
4594         sc->sc_dev = dev;
4595         IWM_LOCK_INIT(sc);
4596         mbufq_init(&sc->sc_snd, ifqmaxlen);
4597         callout_init_mtx(&sc->sc_watchdog_to, &sc->sc_mtx, 0);
4598         TASK_INIT(&sc->sc_es_task, 0, iwm_endscan_cb, sc);
4599         sc->sc_tq = taskqueue_create("iwm_taskq", M_WAITOK,
4600             taskqueue_thread_enqueue, &sc->sc_tq);
4601         error = taskqueue_start_threads(&sc->sc_tq, 1, 0, "iwm_taskq");
4602         if (error != 0) {
4603                 device_printf(dev, "can't start threads, error %d\n",
4604                     error);
4605                 goto fail;
4606         }
4607
4608         /* PCI attach */
4609         error = iwm_pci_attach(dev);
4610         if (error != 0)
4611                 goto fail;
4612
4613         sc->sc_wantresp = -1;
4614
4615         /* Check device type */
4616         error = iwm_dev_check(dev);
4617         if (error != 0)
4618                 goto fail;
4619
4620         sc->sc_fwdmasegsz = IWM_FWDMASEGSZ;
4621
4622         /*
4623          * We now start fiddling with the hardware
4624          */
4625         sc->sc_hw_rev = IWM_READ(sc, IWM_CSR_HW_REV);
4626         if (iwm_prepare_card_hw(sc) != 0) {
4627                 device_printf(dev, "could not initialize hardware\n");
4628                 goto fail;
4629         }
4630
4631         /* Allocate DMA memory for firmware transfers. */
4632         if ((error = iwm_alloc_fwmem(sc)) != 0) {
4633                 device_printf(dev, "could not allocate memory for firmware\n");
4634                 goto fail;
4635         }
4636
4637         /* Allocate "Keep Warm" page. */
4638         if ((error = iwm_alloc_kw(sc)) != 0) {
4639                 device_printf(dev, "could not allocate keep warm page\n");
4640                 goto fail;
4641         }
4642
4643         /* We use ICT interrupts */
4644         if ((error = iwm_alloc_ict(sc)) != 0) {
4645                 device_printf(dev, "could not allocate ICT table\n");
4646                 goto fail;
4647         }
4648
4649         /* Allocate TX scheduler "rings". */
4650         if ((error = iwm_alloc_sched(sc)) != 0) {
4651                 device_printf(dev, "could not allocate TX scheduler rings\n");
4652                 goto fail;
4653         }
4654
4655         /* Allocate TX rings */
4656         for (txq_i = 0; txq_i < nitems(sc->txq); txq_i++) {
4657                 if ((error = iwm_alloc_tx_ring(sc,
4658                     &sc->txq[txq_i], txq_i)) != 0) {
4659                         device_printf(dev,
4660                             "could not allocate TX ring %d\n",
4661                             txq_i);
4662                         goto fail;
4663                 }
4664         }
4665
4666         /* Allocate RX ring. */
4667         if ((error = iwm_alloc_rx_ring(sc, &sc->rxq)) != 0) {
4668                 device_printf(dev, "could not allocate RX ring\n");
4669                 goto fail;
4670         }
4671
4672         /* Clear pending interrupts. */
4673         IWM_WRITE(sc, IWM_CSR_INT, 0xffffffff);
4674
4675         ic->ic_softc = sc;
4676         ic->ic_name = device_get_nameunit(sc->sc_dev);
4677         ic->ic_phytype = IEEE80211_T_OFDM;      /* not only, but not used */
4678         ic->ic_opmode = IEEE80211_M_STA;        /* default to BSS mode */
4679
4680         /* Set device capabilities. */
4681         ic->ic_caps =
4682             IEEE80211_C_STA |
4683             IEEE80211_C_WPA |           /* WPA/RSN */
4684             IEEE80211_C_WME |
4685             IEEE80211_C_SHSLOT |        /* short slot time supported */
4686             IEEE80211_C_SHPREAMBLE      /* short preamble supported */
4687 //          IEEE80211_C_BGSCAN          /* capable of bg scanning */
4688             ;
4689         for (i = 0; i < nitems(sc->sc_phyctxt); i++) {
4690                 sc->sc_phyctxt[i].id = i;
4691                 sc->sc_phyctxt[i].color = 0;
4692                 sc->sc_phyctxt[i].ref = 0;
4693                 sc->sc_phyctxt[i].channel = NULL;
4694         }
4695
4696         /* Max RSSI */
4697         sc->sc_max_rssi = IWM_MAX_DBM - IWM_MIN_DBM;
4698         sc->sc_preinit_hook.ich_func = iwm_preinit;
4699         sc->sc_preinit_hook.ich_arg = sc;
4700         if (config_intrhook_establish(&sc->sc_preinit_hook) != 0) {
4701                 device_printf(dev, "config_intrhook_establish failed\n");
4702                 goto fail;
4703         }
4704
4705 #ifdef IWM_DEBUG
4706         SYSCTL_ADD_INT(device_get_sysctl_ctx(dev),
4707             SYSCTL_CHILDREN(device_get_sysctl_tree(dev)), OID_AUTO, "debug",
4708             CTLFLAG_RW, &sc->sc_debug, 0, "control debugging");
4709 #endif
4710
4711         IWM_DPRINTF(sc, IWM_DEBUG_RESET | IWM_DEBUG_TRACE,
4712             "<-%s\n", __func__);
4713
4714         return 0;
4715
4716         /* Free allocated memory if something failed during attachment. */
4717 fail:
4718         iwm_detach_local(sc, 0);
4719
4720         return ENXIO;
4721 }
4722
4723 static int
4724 iwm_update_edca(struct ieee80211com *ic)
4725 {
4726         struct iwm_softc *sc = ic->ic_softc;
4727
4728         device_printf(sc->sc_dev, "%s: called\n", __func__);
4729         return (0);
4730 }
4731
4732 static void
4733 iwm_preinit(void *arg)
4734 {
4735         struct iwm_softc *sc = arg;
4736         device_t dev = sc->sc_dev;
4737         struct ieee80211com *ic = &sc->sc_ic;
4738         int error;
4739
4740         IWM_DPRINTF(sc, IWM_DEBUG_RESET | IWM_DEBUG_TRACE,
4741             "->%s\n", __func__);
4742
4743         IWM_LOCK(sc);
4744         if ((error = iwm_start_hw(sc)) != 0) {
4745                 device_printf(dev, "could not initialize hardware\n");
4746                 IWM_UNLOCK(sc);
4747                 goto fail;
4748         }
4749
4750         error = iwm_run_init_mvm_ucode(sc, 1);
4751         iwm_stop_device(sc);
4752         if (error) {
4753                 IWM_UNLOCK(sc);
4754                 goto fail;
4755         }
4756         device_printf(dev,
4757             "revision: 0x%x, firmware %d.%d (API ver. %d)\n",
4758             sc->sc_hw_rev & IWM_CSR_HW_REV_TYPE_MSK,
4759             IWM_UCODE_MAJOR(sc->sc_fwver),
4760             IWM_UCODE_MINOR(sc->sc_fwver),
4761             IWM_UCODE_API(sc->sc_fwver));
4762
4763         /* not all hardware can do 5GHz band */
4764         if (!sc->sc_nvm.sku_cap_band_52GHz_enable)
4765                 memset(&ic->ic_sup_rates[IEEE80211_MODE_11A], 0,
4766                     sizeof(ic->ic_sup_rates[IEEE80211_MODE_11A]));
4767         IWM_UNLOCK(sc);
4768
4769         /*
4770          * At this point we've committed - if we fail to do setup,
4771          * we now also have to tear down the net80211 state.
4772          */
4773         ieee80211_ifattach(ic);
4774         ic->ic_vap_create = iwm_vap_create;
4775         ic->ic_vap_delete = iwm_vap_delete;
4776         ic->ic_raw_xmit = iwm_raw_xmit;
4777         ic->ic_node_alloc = iwm_node_alloc;
4778         ic->ic_scan_start = iwm_scan_start;
4779         ic->ic_scan_end = iwm_scan_end;
4780         ic->ic_update_mcast = iwm_update_mcast;
4781         ic->ic_set_channel = iwm_set_channel;
4782         ic->ic_scan_curchan = iwm_scan_curchan;
4783         ic->ic_scan_mindwell = iwm_scan_mindwell;
4784         ic->ic_wme.wme_update = iwm_update_edca;
4785         ic->ic_parent = iwm_parent;
4786         ic->ic_transmit = iwm_transmit;
4787         iwm_radiotap_attach(sc);
4788         if (bootverbose)
4789                 ieee80211_announce(ic);
4790
4791         IWM_DPRINTF(sc, IWM_DEBUG_RESET | IWM_DEBUG_TRACE,
4792             "<-%s\n", __func__);
4793         config_intrhook_disestablish(&sc->sc_preinit_hook);
4794
4795         return;
4796 fail:
4797         config_intrhook_disestablish(&sc->sc_preinit_hook);
4798         iwm_detach_local(sc, 0);
4799 }
4800
4801 /*
4802  * Attach the interface to 802.11 radiotap.
4803  */
4804 static void
4805 iwm_radiotap_attach(struct iwm_softc *sc)
4806 {
4807         struct ieee80211com *ic = &sc->sc_ic;
4808
4809         IWM_DPRINTF(sc, IWM_DEBUG_RESET | IWM_DEBUG_TRACE,
4810             "->%s begin\n", __func__);
4811         ieee80211_radiotap_attach(ic,
4812             &sc->sc_txtap.wt_ihdr, sizeof(sc->sc_txtap),
4813                 IWM_TX_RADIOTAP_PRESENT,
4814             &sc->sc_rxtap.wr_ihdr, sizeof(sc->sc_rxtap),
4815                 IWM_RX_RADIOTAP_PRESENT);
4816         IWM_DPRINTF(sc, IWM_DEBUG_RESET | IWM_DEBUG_TRACE,
4817             "->%s end\n", __func__);
4818 }
4819
4820 static struct ieee80211vap *
4821 iwm_vap_create(struct ieee80211com *ic, const char name[IFNAMSIZ], int unit,
4822     enum ieee80211_opmode opmode, int flags,
4823     const uint8_t bssid[IEEE80211_ADDR_LEN],
4824     const uint8_t mac[IEEE80211_ADDR_LEN])
4825 {
4826         struct iwm_vap *ivp;
4827         struct ieee80211vap *vap;
4828
4829         if (!TAILQ_EMPTY(&ic->ic_vaps))         /* only one at a time */
4830                 return NULL;
4831         ivp = malloc(sizeof(struct iwm_vap), M_80211_VAP, M_WAITOK | M_ZERO);
4832         vap = &ivp->iv_vap;
4833         ieee80211_vap_setup(ic, vap, name, unit, opmode, flags, bssid);
4834         vap->iv_bmissthreshold = 10;            /* override default */
4835         /* Override with driver methods. */
4836         ivp->iv_newstate = vap->iv_newstate;
4837         vap->iv_newstate = iwm_newstate;
4838
4839         ieee80211_ratectl_init(vap);
4840         /* Complete setup. */
4841         ieee80211_vap_attach(vap, iwm_media_change, ieee80211_media_status,
4842             mac);
4843         ic->ic_opmode = opmode;
4844
4845         return vap;
4846 }
4847
4848 static void
4849 iwm_vap_delete(struct ieee80211vap *vap)
4850 {
4851         struct iwm_vap *ivp = IWM_VAP(vap);
4852
4853         ieee80211_ratectl_deinit(vap);
4854         ieee80211_vap_detach(vap);
4855         free(ivp, M_80211_VAP);
4856 }
4857
4858 static void
4859 iwm_scan_start(struct ieee80211com *ic)
4860 {
4861         struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps);
4862         struct iwm_softc *sc = ic->ic_softc;
4863         int error;
4864
4865         if (sc->sc_scanband)
4866                 return;
4867         IWM_LOCK(sc);
4868         error = iwm_mvm_scan_request(sc, IEEE80211_CHAN_2GHZ, 0, NULL, 0);
4869         if (error) {
4870                 device_printf(sc->sc_dev, "could not initiate scan\n");
4871                 IWM_UNLOCK(sc);
4872                 ieee80211_cancel_scan(vap);
4873         } else
4874                 IWM_UNLOCK(sc);
4875 }
4876
4877 static void
4878 iwm_scan_end(struct ieee80211com *ic)
4879 {
4880 }
4881
4882 static void
4883 iwm_update_mcast(struct ieee80211com *ic)
4884 {
4885 }
4886
4887 static void
4888 iwm_set_channel(struct ieee80211com *ic)
4889 {
4890 }
4891
4892 static void
4893 iwm_scan_curchan(struct ieee80211_scan_state *ss, unsigned long maxdwell)
4894 {
4895 }
4896
4897 static void
4898 iwm_scan_mindwell(struct ieee80211_scan_state *ss)
4899 {
4900         return;
4901 }
4902
4903 void
4904 iwm_init_task(void *arg1)
4905 {
4906         struct iwm_softc *sc = arg1;
4907
4908         IWM_LOCK(sc);
4909         while (sc->sc_flags & IWM_FLAG_BUSY)
4910                 msleep(&sc->sc_flags, &sc->sc_mtx, 0, "iwmpwr", 0);
4911         sc->sc_flags |= IWM_FLAG_BUSY;
4912         iwm_stop(sc);
4913         if (sc->sc_ic.ic_nrunning > 0)
4914                 iwm_init(sc);
4915         sc->sc_flags &= ~IWM_FLAG_BUSY;
4916         wakeup(&sc->sc_flags);
4917         IWM_UNLOCK(sc);
4918 }
4919
4920 static int
4921 iwm_resume(device_t dev)
4922 {
4923         uint16_t reg;
4924
4925         /* Clear device-specific "PCI retry timeout" register (41h). */
4926         reg = pci_read_config(dev, 0x40, sizeof(reg));
4927         pci_write_config(dev, 0x40, reg & ~0xff00, sizeof(reg));
4928         iwm_init_task(device_get_softc(dev));
4929
4930         return 0;
4931 }
4932
4933 static int
4934 iwm_suspend(device_t dev)
4935 {
4936         struct iwm_softc *sc = device_get_softc(dev);
4937
4938         if (sc->sc_ic.ic_nrunning > 0) {
4939                 IWM_LOCK(sc);
4940                 iwm_stop(sc);
4941                 IWM_UNLOCK(sc);
4942         }
4943
4944         return (0);
4945 }
4946
4947 static int
4948 iwm_detach_local(struct iwm_softc *sc, int do_net80211)
4949 {
4950         struct iwm_fw_info *fw = &sc->sc_fw;
4951         device_t dev = sc->sc_dev;
4952         int i;
4953
4954         if (sc->sc_tq) {
4955                 taskqueue_drain_all(sc->sc_tq);
4956                 taskqueue_free(sc->sc_tq);
4957         }
4958         callout_drain(&sc->sc_watchdog_to);
4959         iwm_stop_device(sc);
4960         if (do_net80211)
4961                 ieee80211_ifdetach(&sc->sc_ic);
4962
4963         /* Free descriptor rings */
4964         for (i = 0; i < nitems(sc->txq); i++)
4965                 iwm_free_tx_ring(sc, &sc->txq[i]);
4966
4967         /* Free firmware */
4968         if (fw->fw_fp != NULL)
4969                 iwm_fw_info_free(fw);
4970
4971         /* Free scheduler */
4972         iwm_free_sched(sc);
4973         if (sc->ict_dma.vaddr != NULL)
4974                 iwm_free_ict(sc);
4975         if (sc->kw_dma.vaddr != NULL)
4976                 iwm_free_kw(sc);
4977         if (sc->fw_dma.vaddr != NULL)
4978                 iwm_free_fwmem(sc);
4979
4980         /* Finished with the hardware - detach things */
4981         iwm_pci_detach(dev);
4982
4983         mbufq_drain(&sc->sc_snd);
4984         IWM_LOCK_DESTROY(sc);
4985
4986         return (0);
4987 }
4988
4989 static int
4990 iwm_detach(device_t dev)
4991 {
4992         struct iwm_softc *sc = device_get_softc(dev);
4993
4994         return (iwm_detach_local(sc, 1));
4995 }
4996
4997 static device_method_t iwm_pci_methods[] = {
4998         /* Device interface */
4999         DEVMETHOD(device_probe,         iwm_probe),
5000         DEVMETHOD(device_attach,        iwm_attach),
5001         DEVMETHOD(device_detach,        iwm_detach),
5002         DEVMETHOD(device_suspend,       iwm_suspend),
5003         DEVMETHOD(device_resume,        iwm_resume),
5004
5005         DEVMETHOD_END
5006 };
5007
5008 static driver_t iwm_pci_driver = {
5009         "iwm",
5010         iwm_pci_methods,
5011         sizeof (struct iwm_softc)
5012 };
5013
5014 static devclass_t iwm_devclass;
5015
5016 DRIVER_MODULE(iwm, pci, iwm_pci_driver, iwm_devclass, NULL, NULL);
5017 MODULE_DEPEND(iwm, firmware, 1, 1, 1);
5018 MODULE_DEPEND(iwm, pci, 1, 1, 1);
5019 MODULE_DEPEND(iwm, wlan, 1, 1, 1);