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