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