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