1/*	$NetBSD: if_iwm.c,v 1.89 2024/02/09 06:01:03 mlelstv Exp $	*/
2/*	OpenBSD: if_iwm.c,v 1.148 2016/11/19 21:07:08 stsp Exp	*/
3#define IEEE80211_NO_HT
4/*
5 * Copyright (c) 2014, 2016 genua gmbh <info@genua.de>
6 *   Author: Stefan Sperling <stsp@openbsd.org>
7 * Copyright (c) 2014 Fixup Software Ltd.
8 *
9 * Permission to use, copy, modify, and distribute this software for any
10 * purpose with or without fee is hereby granted, provided that the above
11 * copyright notice and this permission notice appear in all copies.
12 *
13 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
14 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
15 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
16 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
17 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
18 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
19 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
20 */
21
22/*-
23 * Based on BSD-licensed source modules in the Linux iwlwifi driver,
24 * which were used as the reference documentation for this implementation.
25 *
26 ***********************************************************************
27 *
28 * This file is provided under a dual BSD/GPLv2 license.  When using or
29 * redistributing this file, you may do so under either license.
30 *
31 * GPL LICENSE SUMMARY
32 *
33 * Copyright(c) 2008 - 2014 Intel Corporation. All rights reserved.
34 * Copyright(c) 2013 - 2015 Intel Mobile Communications GmbH
35 * Copyright(c) 2016        Intel Deutschland GmbH
36 *
37 * This program is free software; you can redistribute it and/or modify
38 * it under the terms of version 2 of the GNU General Public License as
39 * published by the Free Software Foundation.
40 *
41 * This program is distributed in the hope that it will be useful, but
42 * WITHOUT ANY WARRANTY; without even the implied warranty of
43 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
44 * General Public License for more details.
45 *
46 * You should have received a copy of the GNU General Public License
47 * along with this program; if not, write to the Free Software
48 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110,
49 * USA
50 *
51 * The full GNU General Public License is included in this distribution
52 * in the file called COPYING.
53 *
54 * Contact Information:
55 *  Intel Linux Wireless <linuxwifi@intel.com>
56 * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
57 *
58 * BSD LICENSE
59 *
60 * Copyright(c) 2005 - 2014 Intel Corporation. All rights reserved.
61 * Copyright(c) 2013 - 2015 Intel Mobile Communications GmbH
62 * Copyright(c) 2016        Intel Deutschland GmbH
63 * All rights reserved.
64 *
65 * Redistribution and use in source and binary forms, with or without
66 * modification, are permitted provided that the following conditions
67 * are met:
68 *
69 *  * Redistributions of source code must retain the above copyright
70 *    notice, this list of conditions and the following disclaimer.
71 *  * Redistributions in binary form must reproduce the above copyright
72 *    notice, this list of conditions and the following disclaimer in
73 *    the documentation and/or other materials provided with the
74 *    distribution.
75 *  * Neither the name Intel Corporation nor the names of its
76 *    contributors may be used to endorse or promote products derived
77 *    from this software without specific prior written permission.
78 *
79 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
80 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
81 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
82 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
83 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
84 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
85 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
86 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
87 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
88 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
89 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
90 */
91
92/*-
93 * Copyright (c) 2007-2010 Damien Bergamini <damien.bergamini@free.fr>
94 *
95 * Permission to use, copy, modify, and distribute this software for any
96 * purpose with or without fee is hereby granted, provided that the above
97 * copyright notice and this permission notice appear in all copies.
98 *
99 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
100 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
101 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
102 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
103 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
104 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
105 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
106 */
107
108#include <sys/cdefs.h>
109__KERNEL_RCSID(0, "$NetBSD: if_iwm.c,v 1.89 2024/02/09 06:01:03 mlelstv Exp $");
110
111#include <sys/param.h>
112#include <sys/conf.h>
113#include <sys/kernel.h>
114#include <sys/kmem.h>
115#include <sys/mbuf.h>
116#include <sys/mutex.h>
117#include <sys/proc.h>
118#include <sys/socket.h>
119#include <sys/sockio.h>
120#include <sys/sysctl.h>
121#include <sys/systm.h>
122
123#include <sys/cpu.h>
124#include <sys/bus.h>
125#include <sys/workqueue.h>
126#include <machine/endian.h>
127#include <sys/intr.h>
128
129#include <dev/pci/pcireg.h>
130#include <dev/pci/pcivar.h>
131#include <dev/pci/pcidevs.h>
132#include <dev/firmload.h>
133
134#include <net/bpf.h>
135#include <net/if.h>
136#include <net/if_dl.h>
137#include <net/if_media.h>
138#include <net/if_ether.h>
139
140#include <netinet/in.h>
141#include <netinet/ip.h>
142
143#include <net80211/ieee80211_var.h>
144#include <net80211/ieee80211_amrr.h>
145#include <net80211/ieee80211_radiotap.h>
146
147#define DEVNAME(_s)	device_xname((_s)->sc_dev)
148#define IC2IFP(_ic_)	((_ic_)->ic_ifp)
149
150#define le16_to_cpup(_a_) (le16toh(*(const uint16_t *)(_a_)))
151#define le32_to_cpup(_a_) (le32toh(*(const uint32_t *)(_a_)))
152
153#ifdef IWM_DEBUG
154#define DPRINTF(x)	do { if (iwm_debug > 0) printf x; } while (0)
155#define DPRINTFN(n, x)	do { if (iwm_debug >= (n)) printf x; } while (0)
156int iwm_debug = 0;
157#else
158#define DPRINTF(x)	do { ; } while (0)
159#define DPRINTFN(n, x)	do { ; } while (0)
160#endif
161
162#include <dev/pci/if_iwmreg.h>
163#include <dev/pci/if_iwmvar.h>
164
165static const uint8_t iwm_nvm_channels[] = {
166	/* 2.4 GHz */
167	1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
168	/* 5 GHz */
169	36, 40, 44, 48, 52, 56, 60, 64,
170	100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140, 144,
171	149, 153, 157, 161, 165
172};
173
174static const uint8_t iwm_nvm_channels_8000[] = {
175	/* 2.4 GHz */
176	1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
177	/* 5 GHz */
178	36, 40, 44, 48, 52, 56, 60, 64, 68, 72, 76, 80, 84, 88, 92,
179	96, 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140, 144,
180	149, 153, 157, 161, 165, 169, 173, 177, 181
181};
182
183#define IWM_NUM_2GHZ_CHANNELS	14
184
185static const struct iwm_rate {
186	uint8_t rate;
187	uint8_t plcp;
188	uint8_t ht_plcp;
189} iwm_rates[] = {
190		/* Legacy */		/* HT */
191	{   2,	IWM_RATE_1M_PLCP,	IWM_RATE_HT_SISO_MCS_INV_PLCP  },
192	{   4,	IWM_RATE_2M_PLCP,	IWM_RATE_HT_SISO_MCS_INV_PLCP },
193	{  11,	IWM_RATE_5M_PLCP,	IWM_RATE_HT_SISO_MCS_INV_PLCP  },
194	{  22,	IWM_RATE_11M_PLCP,	IWM_RATE_HT_SISO_MCS_INV_PLCP },
195	{  12,	IWM_RATE_6M_PLCP,	IWM_RATE_HT_SISO_MCS_0_PLCP },
196	{  18,	IWM_RATE_9M_PLCP,	IWM_RATE_HT_SISO_MCS_INV_PLCP  },
197	{  24,	IWM_RATE_12M_PLCP,	IWM_RATE_HT_SISO_MCS_1_PLCP },
198	{  36,	IWM_RATE_18M_PLCP,	IWM_RATE_HT_SISO_MCS_2_PLCP },
199	{  48,	IWM_RATE_24M_PLCP,	IWM_RATE_HT_SISO_MCS_3_PLCP },
200	{  72,	IWM_RATE_36M_PLCP,	IWM_RATE_HT_SISO_MCS_4_PLCP },
201	{  96,	IWM_RATE_48M_PLCP,	IWM_RATE_HT_SISO_MCS_5_PLCP },
202	{ 108,	IWM_RATE_54M_PLCP,	IWM_RATE_HT_SISO_MCS_6_PLCP },
203	{ 128,	IWM_RATE_INVM_PLCP,	IWM_RATE_HT_SISO_MCS_7_PLCP },
204};
205#define IWM_RIDX_CCK	0
206#define IWM_RIDX_OFDM	4
207#define IWM_RIDX_MAX	(__arraycount(iwm_rates)-1)
208#define IWM_RIDX_IS_CCK(_i_) ((_i_) < IWM_RIDX_OFDM)
209#define IWM_RIDX_IS_OFDM(_i_) ((_i_) >= IWM_RIDX_OFDM)
210
211#ifndef IEEE80211_NO_HT
212/* Convert an MCS index into an iwm_rates[] index. */
213static const int iwm_mcs2ridx[] = {
214	IWM_RATE_MCS_0_INDEX,
215	IWM_RATE_MCS_1_INDEX,
216	IWM_RATE_MCS_2_INDEX,
217	IWM_RATE_MCS_3_INDEX,
218	IWM_RATE_MCS_4_INDEX,
219	IWM_RATE_MCS_5_INDEX,
220	IWM_RATE_MCS_6_INDEX,
221	IWM_RATE_MCS_7_INDEX,
222};
223#endif
224
225struct iwm_nvm_section {
226	uint16_t length;
227	uint8_t *data;
228};
229
230struct iwm_newstate_state {
231	struct work ns_wk;
232	enum ieee80211_state ns_nstate;
233	int ns_arg;
234	int ns_generation;
235};
236
237static int	iwm_store_cscheme(struct iwm_softc *, uint8_t *, size_t);
238static int	iwm_firmware_store_section(struct iwm_softc *,
239		    enum iwm_ucode_type, uint8_t *, size_t);
240static int	iwm_set_default_calib(struct iwm_softc *, const void *);
241static int	iwm_read_firmware(struct iwm_softc *, enum iwm_ucode_type);
242static uint32_t iwm_read_prph(struct iwm_softc *, uint32_t);
243static void	iwm_write_prph(struct iwm_softc *, uint32_t, uint32_t);
244#ifdef IWM_DEBUG
245static int	iwm_read_mem(struct iwm_softc *, uint32_t, void *, int);
246#endif
247static int	iwm_write_mem(struct iwm_softc *, uint32_t, const void *, int);
248static int	iwm_write_mem32(struct iwm_softc *, uint32_t, uint32_t);
249static int	iwm_poll_bit(struct iwm_softc *, int, uint32_t, uint32_t, int);
250static int	iwm_nic_lock(struct iwm_softc *);
251static void	iwm_nic_unlock(struct iwm_softc *);
252static void	iwm_set_bits_mask_prph(struct iwm_softc *, uint32_t, uint32_t,
253		    uint32_t);
254static void	iwm_set_bits_prph(struct iwm_softc *, uint32_t, uint32_t);
255static void	iwm_clear_bits_prph(struct iwm_softc *, uint32_t, uint32_t);
256static int	iwm_dma_contig_alloc(bus_dma_tag_t, struct iwm_dma_info *,
257		    bus_size_t, bus_size_t);
258static void	iwm_dma_contig_free(struct iwm_dma_info *);
259static int	iwm_alloc_rx_ring(struct iwm_softc *, struct iwm_rx_ring *);
260static void	iwm_disable_rx_dma(struct iwm_softc *);
261static void	iwm_reset_rx_ring(struct iwm_softc *, struct iwm_rx_ring *);
262static void	iwm_free_rx_ring(struct iwm_softc *, struct iwm_rx_ring *);
263static int	iwm_alloc_tx_ring(struct iwm_softc *, struct iwm_tx_ring *,
264		    int);
265static void	iwm_reset_tx_ring(struct iwm_softc *, struct iwm_tx_ring *);
266static void	iwm_free_tx_ring(struct iwm_softc *, struct iwm_tx_ring *);
267static void	iwm_enable_rfkill_int(struct iwm_softc *);
268static int	iwm_check_rfkill(struct iwm_softc *);
269static void	iwm_enable_interrupts(struct iwm_softc *);
270static void	iwm_restore_interrupts(struct iwm_softc *);
271static void	iwm_disable_interrupts(struct iwm_softc *);
272static void	iwm_ict_reset(struct iwm_softc *);
273static int	iwm_set_hw_ready(struct iwm_softc *);
274static int	iwm_prepare_card_hw(struct iwm_softc *);
275static void	iwm_apm_config(struct iwm_softc *);
276static int	iwm_apm_init(struct iwm_softc *);
277static void	iwm_apm_stop(struct iwm_softc *);
278static int	iwm_allow_mcast(struct iwm_softc *);
279static int	iwm_start_hw(struct iwm_softc *);
280static void	iwm_stop_device(struct iwm_softc *);
281static void	iwm_nic_config(struct iwm_softc *);
282static int	iwm_nic_rx_init(struct iwm_softc *);
283static int	iwm_nic_tx_init(struct iwm_softc *);
284static int	iwm_nic_init(struct iwm_softc *);
285static int	iwm_enable_txq(struct iwm_softc *, int, int, int);
286static int	iwm_post_alive(struct iwm_softc *);
287static struct iwm_phy_db_entry *
288		iwm_phy_db_get_section(struct iwm_softc *,
289		    enum iwm_phy_db_section_type, uint16_t);
290static int	iwm_phy_db_set_section(struct iwm_softc *,
291		    struct iwm_calib_res_notif_phy_db *, uint16_t);
292static int	iwm_is_valid_channel(uint16_t);
293static uint8_t	iwm_ch_id_to_ch_index(uint16_t);
294static uint16_t iwm_channel_id_to_papd(uint16_t);
295static uint16_t iwm_channel_id_to_txp(struct iwm_softc *, uint16_t);
296static int	iwm_phy_db_get_section_data(struct iwm_softc *, uint32_t,
297		    uint8_t **, uint16_t *, uint16_t);
298static int	iwm_send_phy_db_cmd(struct iwm_softc *, uint16_t, uint16_t,
299		    void *);
300static int	iwm_phy_db_send_all_channel_groups(struct iwm_softc *,
301		    enum iwm_phy_db_section_type, uint8_t);
302static int	iwm_send_phy_db_data(struct iwm_softc *);
303static void	iwm_te_v2_to_v1(const struct iwm_time_event_cmd_v2 *,
304		    struct iwm_time_event_cmd_v1 *);
305static int	iwm_send_time_event_cmd(struct iwm_softc *,
306		    const struct iwm_time_event_cmd_v2 *);
307static void	iwm_protect_session(struct iwm_softc *, struct iwm_node *,
308		    uint32_t, uint32_t);
309static int	iwm_nvm_read_chunk(struct iwm_softc *, uint16_t, uint16_t,
310		    uint16_t, uint8_t *, uint16_t *);
311static int	iwm_nvm_read_section(struct iwm_softc *, uint16_t, uint8_t *,
312		    uint16_t *, size_t);
313static void	iwm_init_channel_map(struct iwm_softc *, const uint16_t * const,
314		    const uint8_t *, size_t);
315#ifndef IEEE80211_NO_HT
316static void	iwm_setup_ht_rates(struct iwm_softc *);
317static void	iwm_htprot_task(void *);
318static void	iwm_update_htprot(struct ieee80211com *,
319		    struct ieee80211_node *);
320static int	iwm_ampdu_rx_start(struct ieee80211com *,
321		    struct ieee80211_node *, uint8_t);
322static void	iwm_ampdu_rx_stop(struct ieee80211com *,
323		    struct ieee80211_node *, uint8_t);
324static void	iwm_sta_rx_agg(struct iwm_softc *, struct ieee80211_node *,
325		    uint8_t, uint16_t, int);
326#ifdef notyet
327static int	iwm_ampdu_tx_start(struct ieee80211com *,
328		    struct ieee80211_node *, uint8_t);
329static void	iwm_ampdu_tx_stop(struct ieee80211com *,
330		    struct ieee80211_node *, uint8_t);
331#endif
332static void	iwm_ba_task(void *);
333#endif
334
335static int	iwm_parse_nvm_data(struct iwm_softc *, const uint16_t *,
336		    const uint16_t *, const uint16_t *, const uint16_t *,
337		    const uint16_t *, const uint16_t *);
338static void	iwm_set_hw_address_8000(struct iwm_softc *,
339		    struct iwm_nvm_data *, const uint16_t *, const uint16_t *);
340static int	iwm_parse_nvm_sections(struct iwm_softc *,
341		    struct iwm_nvm_section *);
342static int	iwm_nvm_init(struct iwm_softc *);
343static int	iwm_firmware_load_sect(struct iwm_softc *, uint32_t,
344		    const uint8_t *, uint32_t);
345static int	iwm_firmware_load_chunk(struct iwm_softc *, uint32_t,
346		    const uint8_t *, uint32_t);
347static int	iwm_load_cpu_sections_7000(struct iwm_softc *,
348		    struct iwm_fw_sects *, int , int *);
349static int	iwm_load_firmware_7000(struct iwm_softc *, enum iwm_ucode_type);
350static int	iwm_load_cpu_sections_8000(struct iwm_softc *,
351		    struct iwm_fw_sects *, int , int *);
352static int	iwm_load_firmware_8000(struct iwm_softc *, enum iwm_ucode_type);
353static int	iwm_load_firmware(struct iwm_softc *, enum iwm_ucode_type);
354static int	iwm_start_fw(struct iwm_softc *, enum iwm_ucode_type);
355static int	iwm_send_tx_ant_cfg(struct iwm_softc *, uint8_t);
356static int	iwm_send_phy_cfg_cmd(struct iwm_softc *);
357static int	iwm_load_ucode_wait_alive(struct iwm_softc *,
358		    enum iwm_ucode_type);
359static int	iwm_run_init_mvm_ucode(struct iwm_softc *, int);
360static int	iwm_rx_addbuf(struct iwm_softc *, int, int);
361static int	iwm_calc_rssi(struct iwm_softc *, struct iwm_rx_phy_info *);
362static int	iwm_get_signal_strength(struct iwm_softc *,
363		    struct iwm_rx_phy_info *);
364static void	iwm_rx_rx_phy_cmd(struct iwm_softc *,
365		    struct iwm_rx_packet *, struct iwm_rx_data *);
366static int	iwm_get_noise(const struct iwm_statistics_rx_non_phy *);
367static void	iwm_rx_rx_mpdu(struct iwm_softc *, struct iwm_rx_packet *,
368		    struct iwm_rx_data *);
369static void	iwm_rx_tx_cmd_single(struct iwm_softc *, struct iwm_rx_packet *,		    struct iwm_node *);
370static void	iwm_rx_tx_cmd(struct iwm_softc *, struct iwm_rx_packet *,
371		    struct iwm_rx_data *);
372static int	iwm_binding_cmd(struct iwm_softc *, struct iwm_node *,
373		    uint32_t);
374#if 0
375static int	iwm_binding_update(struct iwm_softc *, struct iwm_node *, int);
376static int	iwm_binding_add_vif(struct iwm_softc *, struct iwm_node *);
377#endif
378static void	iwm_phy_ctxt_cmd_hdr(struct iwm_softc *, struct iwm_phy_ctxt *,
379		    struct iwm_phy_context_cmd *, uint32_t, uint32_t);
380static void	iwm_phy_ctxt_cmd_data(struct iwm_softc *,
381		    struct iwm_phy_context_cmd *, struct ieee80211_channel *,
382		    uint8_t, uint8_t);
383static int	iwm_phy_ctxt_cmd(struct iwm_softc *, struct iwm_phy_ctxt *,
384		    uint8_t, uint8_t, uint32_t, uint32_t);
385static int	iwm_send_cmd(struct iwm_softc *, struct iwm_host_cmd *);
386static int	iwm_send_cmd_pdu(struct iwm_softc *, uint32_t, uint32_t,
387		    uint16_t, const void *);
388static int	iwm_send_cmd_status(struct iwm_softc *, struct iwm_host_cmd *,
389		    uint32_t *);
390static int	iwm_send_cmd_pdu_status(struct iwm_softc *, uint32_t, uint16_t,
391		    const void *, uint32_t *);
392static void	iwm_free_resp(struct iwm_softc *, struct iwm_host_cmd *);
393static void	iwm_cmd_done(struct iwm_softc *, int qid, int idx);
394#if 0
395static void	iwm_update_sched(struct iwm_softc *, int, int, uint8_t,
396		    uint16_t);
397#endif
398static const struct iwm_rate *
399		iwm_tx_fill_cmd(struct iwm_softc *, struct iwm_node *,
400		    struct ieee80211_frame *, struct iwm_tx_cmd *);
401static int	iwm_tx(struct iwm_softc *, struct mbuf *,
402		    struct ieee80211_node *, int);
403static void	iwm_led_enable(struct iwm_softc *);
404static void	iwm_led_disable(struct iwm_softc *);
405static int	iwm_led_is_enabled(struct iwm_softc *);
406static void	iwm_led_blink_timeout(void *);
407static void	iwm_led_blink_start(struct iwm_softc *);
408static void	iwm_led_blink_stop(struct iwm_softc *);
409static int	iwm_beacon_filter_send_cmd(struct iwm_softc *,
410		    struct iwm_beacon_filter_cmd *);
411static void	iwm_beacon_filter_set_cqm_params(struct iwm_softc *,
412		    struct iwm_node *, struct iwm_beacon_filter_cmd *);
413static int	iwm_update_beacon_abort(struct iwm_softc *, struct iwm_node *,
414		    int);
415static void	iwm_power_build_cmd(struct iwm_softc *, struct iwm_node *,
416		    struct iwm_mac_power_cmd *);
417static int	iwm_power_mac_update_mode(struct iwm_softc *,
418		    struct iwm_node *);
419static int	iwm_power_update_device(struct iwm_softc *);
420#ifdef notyet
421static int	iwm_enable_beacon_filter(struct iwm_softc *, struct iwm_node *);
422#endif
423static int	iwm_disable_beacon_filter(struct iwm_softc *);
424static int	iwm_add_sta_cmd(struct iwm_softc *, struct iwm_node *, int);
425static int	iwm_add_aux_sta(struct iwm_softc *);
426static uint16_t iwm_scan_rx_chain(struct iwm_softc *);
427static uint32_t iwm_scan_rate_n_flags(struct iwm_softc *, int, int);
428#ifdef notyet
429static uint16_t iwm_get_active_dwell(struct iwm_softc *, int, int);
430static uint16_t iwm_get_passive_dwell(struct iwm_softc *, int);
431#endif
432static uint8_t	iwm_lmac_scan_fill_channels(struct iwm_softc *,
433		    struct iwm_scan_channel_cfg_lmac *, int);
434static int	iwm_fill_probe_req(struct iwm_softc *,
435		    struct iwm_scan_probe_req *);
436static int	iwm_lmac_scan(struct iwm_softc *);
437static int	iwm_config_umac_scan(struct iwm_softc *);
438static int	iwm_umac_scan(struct iwm_softc *);
439static uint8_t	iwm_ridx2rate(struct ieee80211_rateset *, int);
440static void	iwm_ack_rates(struct iwm_softc *, struct iwm_node *, int *,
441		    int *);
442static void	iwm_mac_ctxt_cmd_common(struct iwm_softc *, struct iwm_node *,
443		    struct iwm_mac_ctx_cmd *, uint32_t, int);
444static void	iwm_mac_ctxt_cmd_fill_sta(struct iwm_softc *, struct iwm_node *,
445		    struct iwm_mac_data_sta *, int);
446static int	iwm_mac_ctxt_cmd(struct iwm_softc *, struct iwm_node *,
447		    uint32_t, int);
448static int	iwm_update_quotas(struct iwm_softc *, struct iwm_node *);
449static int	iwm_auth(struct iwm_softc *);
450static int	iwm_assoc(struct iwm_softc *);
451static void	iwm_calib_timeout(void *);
452#ifndef IEEE80211_NO_HT
453static void	iwm_setrates_task(void *);
454static int	iwm_setrates(struct iwm_node *);
455#endif
456static int	iwm_media_change(struct ifnet *);
457static int	iwm_do_newstate(struct ieee80211com *, enum ieee80211_state,
458		    int);
459static void	iwm_newstate_cb(struct work *, void *);
460static int	iwm_newstate(struct ieee80211com *, enum ieee80211_state, int);
461static void	iwm_endscan(struct iwm_softc *);
462static void	iwm_fill_sf_command(struct iwm_softc *, struct iwm_sf_cfg_cmd *,
463		    struct ieee80211_node *);
464static int	iwm_sf_config(struct iwm_softc *, int);
465static int	iwm_send_bt_init_conf(struct iwm_softc *);
466static int	iwm_send_update_mcc_cmd(struct iwm_softc *, const char *);
467static void	iwm_tt_tx_backoff(struct iwm_softc *, uint32_t);
468static int	iwm_init_hw(struct iwm_softc *);
469static int	iwm_init(struct ifnet *);
470static void	iwm_start(struct ifnet *);
471static void	iwm_stop(struct ifnet *, int);
472static void	iwm_watchdog(struct ifnet *);
473static int	iwm_ioctl(struct ifnet *, u_long, void *);
474#ifdef IWM_DEBUG
475static const char *iwm_desc_lookup(uint32_t);
476static void	iwm_nic_error(struct iwm_softc *);
477static void	iwm_nic_umac_error(struct iwm_softc *);
478#endif
479static void	iwm_notif_intr(struct iwm_softc *);
480static int	iwm_intr(void *);
481static void	iwm_softintr(void *);
482static int	iwm_preinit(struct iwm_softc *);
483static void	iwm_attach_hook(device_t);
484static void	iwm_attach(device_t, device_t, void *);
485static int	iwm_config_complete(struct iwm_softc *);
486#if 0
487static void	iwm_init_task(void *);
488static int	iwm_activate(device_t, enum devact);
489static void	iwm_wakeup(struct iwm_softc *);
490#endif
491static void	iwm_radiotap_attach(struct iwm_softc *);
492static int	iwm_sysctl_fw_loaded_handler(SYSCTLFN_PROTO);
493
494static int iwm_sysctl_root_num;
495static int iwm_lar_disable;
496
497#ifndef	IWM_DEFAULT_MCC
498#define	IWM_DEFAULT_MCC	"ZZ"
499#endif
500static char iwm_default_mcc[3] = IWM_DEFAULT_MCC;
501
502static int
503iwm_firmload(struct iwm_softc *sc)
504{
505	struct iwm_fw_info *fw = &sc->sc_fw;
506	firmware_handle_t fwh;
507	int err;
508
509	if (ISSET(sc->sc_flags, IWM_FLAG_FW_LOADED))
510		return 0;
511
512	/* Open firmware image. */
513	err = firmware_open("if_iwm", sc->sc_fwname, &fwh);
514	if (err) {
515		aprint_error_dev(sc->sc_dev,
516		    "could not get firmware handle %s\n", sc->sc_fwname);
517		return err;
518	}
519
520	if (fw->fw_rawdata != NULL && fw->fw_rawsize > 0) {
521		kmem_free(fw->fw_rawdata, fw->fw_rawsize);
522		fw->fw_rawdata = NULL;
523	}
524
525	fw->fw_rawsize = firmware_get_size(fwh);
526	/*
527	 * Well, this is how the Linux driver checks it ....
528	 */
529	if (fw->fw_rawsize < sizeof(uint32_t)) {
530		aprint_error_dev(sc->sc_dev,
531		    "firmware too short: %zd bytes\n", fw->fw_rawsize);
532		err = EINVAL;
533		goto out;
534	}
535
536	/* Read the firmware. */
537	fw->fw_rawdata = kmem_alloc(fw->fw_rawsize, KM_SLEEP);
538	err = firmware_read(fwh, 0, fw->fw_rawdata, fw->fw_rawsize);
539	if (err) {
540		aprint_error_dev(sc->sc_dev,
541		    "could not read firmware %s\n", sc->sc_fwname);
542		goto out;
543	}
544
545	SET(sc->sc_flags, IWM_FLAG_FW_LOADED);
546 out:
547	/* caller will release memory, if necessary */
548
549	firmware_close(fwh);
550	return err;
551}
552
553/*
554 * just maintaining status quo.
555 */
556static void
557iwm_fix_channel(struct iwm_softc *sc, struct mbuf *m)
558{
559	struct ieee80211com *ic = &sc->sc_ic;
560	struct ieee80211_frame *wh;
561	uint8_t subtype;
562
563	wh = mtod(m, struct ieee80211_frame *);
564
565	if ((wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK) != IEEE80211_FC0_TYPE_MGT)
566		return;
567
568	subtype = wh->i_fc[0] & IEEE80211_FC0_SUBTYPE_MASK;
569
570	if (subtype != IEEE80211_FC0_SUBTYPE_BEACON &&
571	    subtype != IEEE80211_FC0_SUBTYPE_PROBE_RESP)
572		return;
573
574	int chan = le32toh(sc->sc_last_phy_info.channel);
575	if (chan < __arraycount(ic->ic_channels))
576		ic->ic_curchan = &ic->ic_channels[chan];
577}
578
579static int
580iwm_store_cscheme(struct iwm_softc *sc, uint8_t *data, size_t dlen)
581{
582	struct iwm_fw_cscheme_list *l = (struct iwm_fw_cscheme_list *)data;
583
584	if (dlen < sizeof(*l) ||
585	    dlen < sizeof(l->size) + l->size * sizeof(*l->cs))
586		return EINVAL;
587
588	/* we don't actually store anything for now, always use s/w crypto */
589
590	return 0;
591}
592
593static int
594iwm_firmware_store_section(struct iwm_softc *sc, enum iwm_ucode_type type,
595    uint8_t *data, size_t dlen)
596{
597	struct iwm_fw_sects *fws;
598	struct iwm_fw_onesect *fwone;
599
600	if (type >= IWM_UCODE_TYPE_MAX)
601		return EINVAL;
602	if (dlen < sizeof(uint32_t))
603		return EINVAL;
604
605	fws = &sc->sc_fw.fw_sects[type];
606	if (fws->fw_count >= IWM_UCODE_SECT_MAX)
607		return EINVAL;
608
609	fwone = &fws->fw_sect[fws->fw_count];
610
611	/* first 32bit are device load offset */
612	memcpy(&fwone->fws_devoff, data, sizeof(uint32_t));
613
614	/* rest is data */
615	fwone->fws_data = data + sizeof(uint32_t);
616	fwone->fws_len = dlen - sizeof(uint32_t);
617
618	/* for freeing the buffer during driver unload */
619	fwone->fws_alloc = data;
620	fwone->fws_allocsize = dlen;
621
622	fws->fw_count++;
623	fws->fw_totlen += fwone->fws_len;
624
625	return 0;
626}
627
628struct iwm_tlv_calib_data {
629	uint32_t ucode_type;
630	struct iwm_tlv_calib_ctrl calib;
631} __packed;
632
633static int
634iwm_set_default_calib(struct iwm_softc *sc, const void *data)
635{
636	const struct iwm_tlv_calib_data *def_calib = data;
637	uint32_t ucode_type = le32toh(def_calib->ucode_type);
638
639	if (ucode_type >= IWM_UCODE_TYPE_MAX) {
640		DPRINTF(("%s: Wrong ucode_type %u for default calibration.\n",
641		    DEVNAME(sc), ucode_type));
642		return EINVAL;
643	}
644
645	sc->sc_default_calib[ucode_type].flow_trigger =
646	    def_calib->calib.flow_trigger;
647	sc->sc_default_calib[ucode_type].event_trigger =
648	    def_calib->calib.event_trigger;
649
650	return 0;
651}
652
653static int
654iwm_read_firmware(struct iwm_softc *sc, enum iwm_ucode_type ucode_type)
655{
656	struct iwm_fw_info *fw = &sc->sc_fw;
657	struct iwm_tlv_ucode_header *uhdr;
658	struct iwm_ucode_tlv tlv;
659	enum iwm_ucode_tlv_type tlv_type;
660	uint8_t *data;
661	int err, status;
662	size_t len;
663
664	if (ucode_type != IWM_UCODE_TYPE_INIT &&
665	    fw->fw_status == IWM_FW_STATUS_DONE)
666		return 0;
667
668	if (fw->fw_status == IWM_FW_STATUS_NONE) {
669		fw->fw_status = IWM_FW_STATUS_INPROGRESS;
670	} else {
671		while (fw->fw_status == IWM_FW_STATUS_INPROGRESS)
672			tsleep(&sc->sc_fw, 0, "iwmfwp", 0);
673	}
674	status = fw->fw_status;
675
676	if (status == IWM_FW_STATUS_DONE)
677		return 0;
678
679	err = iwm_firmload(sc);
680	if (err) {
681		aprint_error_dev(sc->sc_dev,
682		    "could not read firmware %s (error %d)\n",
683		    sc->sc_fwname, err);
684		goto out;
685	}
686
687	sc->sc_capaflags = 0;
688	sc->sc_capa_n_scan_channels = IWM_MAX_NUM_SCAN_CHANNELS;
689	memset(sc->sc_enabled_capa, 0, sizeof(sc->sc_enabled_capa));
690	memset(sc->sc_fw_mcc, 0, sizeof(sc->sc_fw_mcc));
691
692	uhdr = (void *)fw->fw_rawdata;
693	if (*(uint32_t *)fw->fw_rawdata != 0
694	    || le32toh(uhdr->magic) != IWM_TLV_UCODE_MAGIC) {
695		aprint_error_dev(sc->sc_dev, "invalid firmware %s\n",
696		    sc->sc_fwname);
697		err = EINVAL;
698		goto out;
699	}
700
701	snprintf(sc->sc_fwver, sizeof(sc->sc_fwver), "%d.%d (API ver %d)",
702	    IWM_UCODE_MAJOR(le32toh(uhdr->ver)),
703	    IWM_UCODE_MINOR(le32toh(uhdr->ver)),
704	    IWM_UCODE_API(le32toh(uhdr->ver)));
705	data = uhdr->data;
706	len = fw->fw_rawsize - sizeof(*uhdr);
707
708	while (len >= sizeof(tlv)) {
709		size_t tlv_len;
710		void *tlv_data;
711
712		memcpy(&tlv, data, sizeof(tlv));
713		tlv_len = le32toh(tlv.length);
714		tlv_type = le32toh(tlv.type);
715
716		len -= sizeof(tlv);
717		data += sizeof(tlv);
718		tlv_data = data;
719
720		if (len < tlv_len) {
721			aprint_error_dev(sc->sc_dev,
722			    "firmware too short: %zu bytes\n", len);
723			err = EINVAL;
724			goto parse_out;
725		}
726
727		switch (tlv_type) {
728		case IWM_UCODE_TLV_PROBE_MAX_LEN:
729			if (tlv_len < sizeof(uint32_t)) {
730				err = EINVAL;
731				goto parse_out;
732			}
733			sc->sc_capa_max_probe_len
734			    = le32toh(*(uint32_t *)tlv_data);
735			/* limit it to something sensible */
736			if (sc->sc_capa_max_probe_len >
737			    IWM_SCAN_OFFLOAD_PROBE_REQ_SIZE) {
738				err = EINVAL;
739				goto parse_out;
740			}
741			break;
742		case IWM_UCODE_TLV_PAN:
743			if (tlv_len) {
744				err = EINVAL;
745				goto parse_out;
746			}
747			sc->sc_capaflags |= IWM_UCODE_TLV_FLAGS_PAN;
748			break;
749		case IWM_UCODE_TLV_FLAGS:
750			if (tlv_len < sizeof(uint32_t)) {
751				err = EINVAL;
752				goto parse_out;
753			}
754			if (tlv_len % sizeof(uint32_t)) {
755				err = EINVAL;
756				goto parse_out;
757			}
758			/*
759			 * Apparently there can be many flags, but Linux driver
760			 * parses only the first one, and so do we.
761			 *
762			 * XXX: why does this override IWM_UCODE_TLV_PAN?
763			 * Intentional or a bug?  Observations from
764			 * current firmware file:
765			 *  1) TLV_PAN is parsed first
766			 *  2) TLV_FLAGS contains TLV_FLAGS_PAN
767			 * ==> this resets TLV_PAN to itself... hnnnk
768			 */
769			sc->sc_capaflags = le32toh(*(uint32_t *)tlv_data);
770			break;
771		case IWM_UCODE_TLV_CSCHEME:
772			err = iwm_store_cscheme(sc, tlv_data, tlv_len);
773			if (err)
774				goto parse_out;
775			break;
776		case IWM_UCODE_TLV_NUM_OF_CPU: {
777			uint32_t num_cpu;
778			if (tlv_len != sizeof(uint32_t)) {
779				err = EINVAL;
780				goto parse_out;
781			}
782			num_cpu = le32toh(*(uint32_t *)tlv_data);
783			if (num_cpu == 2) {
784				fw->fw_sects[IWM_UCODE_TYPE_REGULAR].is_dual_cpus =
785				    true;
786				fw->fw_sects[IWM_UCODE_TYPE_INIT].is_dual_cpus =
787				    true;
788				fw->fw_sects[IWM_UCODE_TYPE_WOW].is_dual_cpus =
789				    true;
790			} else if (num_cpu < 1 || num_cpu > 2) {
791				err = EINVAL;
792				goto parse_out;
793			}
794			break;
795		}
796		case IWM_UCODE_TLV_SEC_RT:
797			err = iwm_firmware_store_section(sc,
798			    IWM_UCODE_TYPE_REGULAR, tlv_data, tlv_len);
799			if (err)
800				goto parse_out;
801			break;
802		case IWM_UCODE_TLV_SEC_INIT:
803			err = iwm_firmware_store_section(sc,
804			    IWM_UCODE_TYPE_INIT, tlv_data, tlv_len);
805			if (err)
806				goto parse_out;
807			break;
808		case IWM_UCODE_TLV_SEC_WOWLAN:
809			err = iwm_firmware_store_section(sc,
810			    IWM_UCODE_TYPE_WOW, tlv_data, tlv_len);
811			if (err)
812				goto parse_out;
813			break;
814		case IWM_UCODE_TLV_DEF_CALIB:
815			if (tlv_len != sizeof(struct iwm_tlv_calib_data)) {
816				err = EINVAL;
817				goto parse_out;
818			}
819			err = iwm_set_default_calib(sc, tlv_data);
820			if (err)
821				goto parse_out;
822			break;
823		case IWM_UCODE_TLV_PHY_SKU:
824			if (tlv_len != sizeof(uint32_t)) {
825				err = EINVAL;
826				goto parse_out;
827			}
828			sc->sc_fw_phy_config = le32toh(*(uint32_t *)tlv_data);
829			break;
830
831		case IWM_UCODE_TLV_API_CHANGES_SET: {
832			struct iwm_ucode_api *api;
833			uint32_t idx, bits;
834			int i;
835			if (tlv_len != sizeof(*api)) {
836				err = EINVAL;
837				goto parse_out;
838			}
839			api = (struct iwm_ucode_api *)tlv_data;
840			idx = le32toh(api->api_index);
841			bits = le32toh(api->api_flags);
842			if (idx >= howmany(IWM_NUM_UCODE_TLV_API, 32)) {
843				err = EINVAL;
844				goto parse_out;
845			}
846			for (i = 0; i < 32; i++) {
847				if (!ISSET(bits, __BIT(i)))
848					continue;
849				setbit(sc->sc_ucode_api, i + (32 * idx));
850			}
851			break;
852		}
853
854		case IWM_UCODE_TLV_ENABLED_CAPABILITIES: {
855			struct iwm_ucode_capa *capa;
856			uint32_t idx, bits;
857			int i;
858			if (tlv_len != sizeof(*capa)) {
859				err = EINVAL;
860				goto parse_out;
861			}
862			capa = (struct iwm_ucode_capa *)tlv_data;
863			idx = le32toh(capa->api_index);
864			bits = le32toh(capa->api_capa);
865			if (idx >= howmany(IWM_NUM_UCODE_TLV_CAPA, 32)) {
866				err = EINVAL;
867				goto parse_out;
868			}
869			for (i = 0; i < 32; i++) {
870				if (!ISSET(bits, __BIT(i)))
871					continue;
872				setbit(sc->sc_enabled_capa, i + (32 * idx));
873			}
874			break;
875		}
876
877		case IWM_UCODE_TLV_FW_UNDOCUMENTED1:
878		case IWM_UCODE_TLV_SDIO_ADMA_ADDR:
879		case IWM_UCODE_TLV_FW_GSCAN_CAPA:
880		case IWM_UCODE_TLV_FW_MEM_SEG:
881			/* ignore, not used by current driver */
882			break;
883
884		case IWM_UCODE_TLV_SEC_RT_USNIFFER:
885			err = iwm_firmware_store_section(sc,
886			    IWM_UCODE_TYPE_REGULAR_USNIFFER, tlv_data,
887			    tlv_len);
888			if (err)
889				goto parse_out;
890			break;
891
892		case IWM_UCODE_TLV_PAGING: {
893			uint32_t paging_mem_size;
894			if (tlv_len != sizeof(paging_mem_size)) {
895				err = EINVAL;
896				goto parse_out;
897			}
898			paging_mem_size = le32toh(*(uint32_t *)tlv_data);
899			if (paging_mem_size > IWM_MAX_PAGING_IMAGE_SIZE) {
900				err = EINVAL;
901				goto parse_out;
902			}
903			if (paging_mem_size & (IWM_FW_PAGING_SIZE - 1)) {
904				err = EINVAL;
905				goto parse_out;
906			}
907			fw->fw_sects[IWM_UCODE_TYPE_REGULAR].paging_mem_size =
908			    paging_mem_size;
909			fw->fw_sects[IWM_UCODE_TYPE_REGULAR_USNIFFER].paging_mem_size =
910			    paging_mem_size;
911			break;
912		}
913
914		case IWM_UCODE_TLV_N_SCAN_CHANNELS:
915			if (tlv_len != sizeof(uint32_t)) {
916				err = EINVAL;
917				goto parse_out;
918			}
919			sc->sc_capa_n_scan_channels =
920			  le32toh(*(uint32_t *)tlv_data);
921			break;
922
923		case IWM_UCODE_TLV_FW_VERSION:
924			if (tlv_len != sizeof(uint32_t) * 3) {
925				err = EINVAL;
926				goto parse_out;
927			}
928			snprintf(sc->sc_fwver, sizeof(sc->sc_fwver),
929			    "%d.%d.%d",
930			    le32toh(((uint32_t *)tlv_data)[0]),
931			    le32toh(((uint32_t *)tlv_data)[1]),
932			    le32toh(((uint32_t *)tlv_data)[2]));
933			break;
934
935		default:
936			DPRINTF(("%s: unknown firmware section %d, abort\n",
937			    DEVNAME(sc), tlv_type));
938			err = EINVAL;
939			goto parse_out;
940		}
941
942		len -= roundup(tlv_len, 4);
943		data += roundup(tlv_len, 4);
944	}
945
946	KASSERT(err == 0);
947
948 parse_out:
949	if (err) {
950		aprint_error_dev(sc->sc_dev,
951		    "firmware parse error, section type %d\n", tlv_type);
952	}
953
954	if (!(sc->sc_capaflags & IWM_UCODE_TLV_FLAGS_PM_CMD_SUPPORT)) {
955		aprint_error_dev(sc->sc_dev,
956		    "device uses unsupported power ops\n");
957		err = ENOTSUP;
958	}
959
960 out:
961	if (err)
962		fw->fw_status = IWM_FW_STATUS_NONE;
963	else
964		fw->fw_status = IWM_FW_STATUS_DONE;
965	wakeup(&sc->sc_fw);
966
967	if (err && fw->fw_rawdata != NULL) {
968		kmem_free(fw->fw_rawdata, fw->fw_rawsize);
969		fw->fw_rawdata = NULL;
970		CLR(sc->sc_flags, IWM_FLAG_FW_LOADED);
971		/* don't touch fw->fw_status */
972		memset(fw->fw_sects, 0, sizeof(fw->fw_sects));
973	}
974	return err;
975}
976
977static uint32_t
978iwm_read_prph(struct iwm_softc *sc, uint32_t addr)
979{
980	IWM_WRITE(sc,
981	    IWM_HBUS_TARG_PRPH_RADDR, ((addr & 0x000fffff) | (3 << 24)));
982	IWM_BARRIER_READ_WRITE(sc);
983	return IWM_READ(sc, IWM_HBUS_TARG_PRPH_RDAT);
984}
985
986static void
987iwm_write_prph(struct iwm_softc *sc, uint32_t addr, uint32_t val)
988{
989	IWM_WRITE(sc,
990	    IWM_HBUS_TARG_PRPH_WADDR, ((addr & 0x000fffff) | (3 << 24)));
991	IWM_BARRIER_WRITE(sc);
992	IWM_WRITE(sc, IWM_HBUS_TARG_PRPH_WDAT, val);
993}
994
995#ifdef IWM_DEBUG
996static int
997iwm_read_mem(struct iwm_softc *sc, uint32_t addr, void *buf, int dwords)
998{
999	int offs;
1000	uint32_t *vals = buf;
1001
1002	if (iwm_nic_lock(sc)) {
1003		IWM_WRITE(sc, IWM_HBUS_TARG_MEM_RADDR, addr);
1004		for (offs = 0; offs < dwords; offs++)
1005			vals[offs] = IWM_READ(sc, IWM_HBUS_TARG_MEM_RDAT);
1006		iwm_nic_unlock(sc);
1007		return 0;
1008	}
1009	return EBUSY;
1010}
1011#endif
1012
1013static int
1014iwm_write_mem(struct iwm_softc *sc, uint32_t addr, const void *buf, int dwords)
1015{
1016	int offs;
1017	const uint32_t *vals = buf;
1018
1019	if (iwm_nic_lock(sc)) {
1020		IWM_WRITE(sc, IWM_HBUS_TARG_MEM_WADDR, addr);
1021		/* WADDR auto-increments */
1022		for (offs = 0; offs < dwords; offs++) {
1023			uint32_t val = vals ? vals[offs] : 0;
1024			IWM_WRITE(sc, IWM_HBUS_TARG_MEM_WDAT, val);
1025		}
1026		iwm_nic_unlock(sc);
1027		return 0;
1028	}
1029	return EBUSY;
1030}
1031
1032static int
1033iwm_write_mem32(struct iwm_softc *sc, uint32_t addr, uint32_t val)
1034{
1035	return iwm_write_mem(sc, addr, &val, 1);
1036}
1037
1038static int
1039iwm_poll_bit(struct iwm_softc *sc, int reg, uint32_t bits, uint32_t mask,
1040    int timo)
1041{
1042	for (;;) {
1043		if ((IWM_READ(sc, reg) & mask) == (bits & mask)) {
1044			return 1;
1045		}
1046		if (timo < 10) {
1047			return 0;
1048		}
1049		timo -= 10;
1050		DELAY(10);
1051	}
1052}
1053
1054static int
1055iwm_nic_lock(struct iwm_softc *sc)
1056{
1057	int rv = 0;
1058
1059	if (sc->sc_cmd_hold_nic_awake)
1060		return 1;
1061
1062	IWM_SETBITS(sc, IWM_CSR_GP_CNTRL,
1063	    IWM_CSR_GP_CNTRL_REG_FLAG_MAC_ACCESS_REQ);
1064
1065	if (sc->sc_device_family == IWM_DEVICE_FAMILY_8000)
1066		DELAY(2);
1067
1068	if (iwm_poll_bit(sc, IWM_CSR_GP_CNTRL,
1069	    IWM_CSR_GP_CNTRL_REG_VAL_MAC_ACCESS_EN,
1070	    IWM_CSR_GP_CNTRL_REG_FLAG_MAC_CLOCK_READY
1071	     | IWM_CSR_GP_CNTRL_REG_FLAG_GOING_TO_SLEEP, 15000)) {
1072		rv = 1;
1073	} else {
1074		DPRINTF(("%s: resetting device via NMI\n", DEVNAME(sc)));
1075		IWM_WRITE(sc, IWM_CSR_RESET, IWM_CSR_RESET_REG_FLAG_FORCE_NMI);
1076	}
1077
1078	return rv;
1079}
1080
1081static void
1082iwm_nic_unlock(struct iwm_softc *sc)
1083{
1084
1085	if (sc->sc_cmd_hold_nic_awake)
1086		return;
1087
1088	IWM_CLRBITS(sc, IWM_CSR_GP_CNTRL,
1089	    IWM_CSR_GP_CNTRL_REG_FLAG_MAC_ACCESS_REQ);
1090}
1091
1092static void
1093iwm_set_bits_mask_prph(struct iwm_softc *sc, uint32_t reg, uint32_t bits,
1094    uint32_t mask)
1095{
1096	uint32_t val;
1097
1098	/* XXX: no error path? */
1099	if (iwm_nic_lock(sc)) {
1100		val = iwm_read_prph(sc, reg) & mask;
1101		val |= bits;
1102		iwm_write_prph(sc, reg, val);
1103		iwm_nic_unlock(sc);
1104	}
1105}
1106
1107static void
1108iwm_set_bits_prph(struct iwm_softc *sc, uint32_t reg, uint32_t bits)
1109{
1110	iwm_set_bits_mask_prph(sc, reg, bits, ~0);
1111}
1112
1113static void
1114iwm_clear_bits_prph(struct iwm_softc *sc, uint32_t reg, uint32_t bits)
1115{
1116	iwm_set_bits_mask_prph(sc, reg, 0, ~bits);
1117}
1118
1119static int
1120iwm_dma_contig_alloc(bus_dma_tag_t tag, struct iwm_dma_info *dma,
1121    bus_size_t size, bus_size_t alignment)
1122{
1123	int nsegs, err;
1124	void *va;
1125
1126	dma->tag = tag;
1127	dma->size = size;
1128
1129	err = bus_dmamap_create(tag, size, 1, size, 0, BUS_DMA_NOWAIT,
1130	    &dma->map);
1131	if (err)
1132		goto fail;
1133
1134	err = bus_dmamem_alloc(tag, size, alignment, 0, &dma->seg, 1, &nsegs,
1135	    BUS_DMA_NOWAIT);
1136	if (err)
1137		goto fail;
1138
1139	err = bus_dmamem_map(tag, &dma->seg, 1, size, &va, BUS_DMA_NOWAIT);
1140	if (err)
1141		goto fail;
1142	dma->vaddr = va;
1143
1144	err = bus_dmamap_load(tag, dma->map, dma->vaddr, size, NULL,
1145	    BUS_DMA_NOWAIT);
1146	if (err)
1147		goto fail;
1148
1149	memset(dma->vaddr, 0, size);
1150	bus_dmamap_sync(tag, dma->map, 0, size, BUS_DMASYNC_PREWRITE);
1151	dma->paddr = dma->map->dm_segs[0].ds_addr;
1152
1153	return 0;
1154
1155fail:	iwm_dma_contig_free(dma);
1156	return err;
1157}
1158
1159static void
1160iwm_dma_contig_free(struct iwm_dma_info *dma)
1161{
1162	if (dma->map != NULL) {
1163		if (dma->vaddr != NULL) {
1164			bus_dmamap_sync(dma->tag, dma->map, 0, dma->size,
1165			    BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE);
1166			bus_dmamap_unload(dma->tag, dma->map);
1167			bus_dmamem_unmap(dma->tag, dma->vaddr, dma->size);
1168			bus_dmamem_free(dma->tag, &dma->seg, 1);
1169			dma->vaddr = NULL;
1170		}
1171		bus_dmamap_destroy(dma->tag, dma->map);
1172		dma->map = NULL;
1173	}
1174}
1175
1176static int
1177iwm_alloc_rx_ring(struct iwm_softc *sc, struct iwm_rx_ring *ring)
1178{
1179	bus_size_t size;
1180	int i, err;
1181
1182	ring->cur = 0;
1183
1184	/* Allocate RX descriptors (256-byte aligned). */
1185	size = IWM_RX_RING_COUNT * sizeof(uint32_t);
1186	err = iwm_dma_contig_alloc(sc->sc_dmat, &ring->desc_dma, size, 256);
1187	if (err) {
1188		aprint_error_dev(sc->sc_dev,
1189		    "could not allocate RX ring DMA memory\n");
1190		goto fail;
1191	}
1192	ring->desc = ring->desc_dma.vaddr;
1193
1194	/* Allocate RX status area (16-byte aligned). */
1195	err = iwm_dma_contig_alloc(sc->sc_dmat, &ring->stat_dma,
1196	    sizeof(*ring->stat), 16);
1197	if (err) {
1198		aprint_error_dev(sc->sc_dev,
1199		    "could not allocate RX status DMA memory\n");
1200		goto fail;
1201	}
1202	ring->stat = ring->stat_dma.vaddr;
1203
1204	for (i = 0; i < IWM_RX_RING_COUNT; i++) {
1205		struct iwm_rx_data *data = &ring->data[i];
1206
1207		memset(data, 0, sizeof(*data));
1208		err = bus_dmamap_create(sc->sc_dmat, IWM_RBUF_SIZE, 1,
1209		    IWM_RBUF_SIZE, 0, BUS_DMA_NOWAIT | BUS_DMA_ALLOCNOW,
1210		    &data->map);
1211		if (err) {
1212			aprint_error_dev(sc->sc_dev,
1213			    "could not create RX buf DMA map\n");
1214			goto fail;
1215		}
1216
1217		err = iwm_rx_addbuf(sc, IWM_RBUF_SIZE, i);
1218		if (err)
1219			goto fail;
1220	}
1221	return 0;
1222
1223fail:	iwm_free_rx_ring(sc, ring);
1224	return err;
1225}
1226
1227static void
1228iwm_disable_rx_dma(struct iwm_softc *sc)
1229{
1230	int ntries;
1231
1232	if (iwm_nic_lock(sc)) {
1233		IWM_WRITE(sc, IWM_FH_MEM_RCSR_CHNL0_CONFIG_REG, 0);
1234		for (ntries = 0; ntries < 1000; ntries++) {
1235			if (IWM_READ(sc, IWM_FH_MEM_RSSR_RX_STATUS_REG) &
1236			    IWM_FH_RSSR_CHNL0_RX_STATUS_CHNL_IDLE)
1237				break;
1238			DELAY(10);
1239		}
1240		iwm_nic_unlock(sc);
1241	}
1242}
1243
1244void
1245iwm_reset_rx_ring(struct iwm_softc *sc, struct iwm_rx_ring *ring)
1246{
1247	ring->cur = 0;
1248	memset(ring->stat, 0, sizeof(*ring->stat));
1249	bus_dmamap_sync(sc->sc_dmat, ring->stat_dma.map, 0,
1250	    ring->stat_dma.size, BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
1251}
1252
1253static void
1254iwm_free_rx_ring(struct iwm_softc *sc, struct iwm_rx_ring *ring)
1255{
1256	int i;
1257
1258	iwm_dma_contig_free(&ring->desc_dma);
1259	iwm_dma_contig_free(&ring->stat_dma);
1260
1261	for (i = 0; i < IWM_RX_RING_COUNT; i++) {
1262		struct iwm_rx_data *data = &ring->data[i];
1263
1264		if (data->m != NULL) {
1265			bus_size_t sz = data->m->m_pkthdr.len;
1266			bus_dmamap_sync(sc->sc_dmat, data->map, 0,
1267			    sz, BUS_DMASYNC_POSTREAD);
1268			bus_dmamap_unload(sc->sc_dmat, data->map);
1269			m_freem(data->m);
1270			data->m = NULL;
1271		}
1272		if (data->map != NULL) {
1273			bus_dmamap_destroy(sc->sc_dmat, data->map);
1274			data->map = NULL;
1275		}
1276	}
1277}
1278
1279static int
1280iwm_alloc_tx_ring(struct iwm_softc *sc, struct iwm_tx_ring *ring, int qid)
1281{
1282	bus_addr_t paddr;
1283	bus_size_t size;
1284	int i, err, nsegs;
1285
1286	ring->qid = qid;
1287	ring->queued = 0;
1288	ring->cur = 0;
1289
1290	/* Allocate TX descriptors (256-byte aligned). */
1291	size = IWM_TX_RING_COUNT * sizeof (struct iwm_tfd);
1292	err = iwm_dma_contig_alloc(sc->sc_dmat, &ring->desc_dma, size, 256);
1293	if (err) {
1294		aprint_error_dev(sc->sc_dev,
1295		    "could not allocate TX ring DMA memory\n");
1296		goto fail;
1297	}
1298	ring->desc = ring->desc_dma.vaddr;
1299
1300	/*
1301	 * We only use rings 0 through 9 (4 EDCA + cmd) so there is no need
1302	 * to allocate commands space for other rings.
1303	 */
1304	if (qid > IWM_CMD_QUEUE)
1305		return 0;
1306
1307	size = IWM_TX_RING_COUNT * sizeof(struct iwm_device_cmd);
1308	err = iwm_dma_contig_alloc(sc->sc_dmat, &ring->cmd_dma, size, 4);
1309	if (err) {
1310		aprint_error_dev(sc->sc_dev,
1311		    "could not allocate TX cmd DMA memory\n");
1312		goto fail;
1313	}
1314	ring->cmd = ring->cmd_dma.vaddr;
1315
1316	paddr = ring->cmd_dma.paddr;
1317	for (i = 0; i < IWM_TX_RING_COUNT; i++) {
1318		struct iwm_tx_data *data = &ring->data[i];
1319		size_t mapsize;
1320
1321		data->cmd_paddr = paddr;
1322		data->scratch_paddr = paddr + sizeof(struct iwm_cmd_header)
1323		    + offsetof(struct iwm_tx_cmd, scratch);
1324		paddr += sizeof(struct iwm_device_cmd);
1325
1326		/* FW commands may require more mapped space than packets. */
1327		if (qid == IWM_CMD_QUEUE) {
1328			mapsize = IWM_RBUF_SIZE;
1329			nsegs = 1;
1330		} else {
1331			mapsize = MCLBYTES;
1332			nsegs = IWM_NUM_OF_TBS - 2;
1333		}
1334		err = bus_dmamap_create(sc->sc_dmat, mapsize, nsegs, mapsize,
1335		    0, BUS_DMA_NOWAIT, &data->map);
1336		if (err) {
1337			aprint_error_dev(sc->sc_dev,
1338			    "could not create TX buf DMA map\n");
1339			goto fail;
1340		}
1341	}
1342	KASSERT(paddr == ring->cmd_dma.paddr + size);
1343	return 0;
1344
1345fail:	iwm_free_tx_ring(sc, ring);
1346	return err;
1347}
1348
1349static void
1350iwm_clear_cmd_in_flight(struct iwm_softc *sc)
1351{
1352
1353	if (!sc->apmg_wake_up_wa)
1354		return;
1355
1356	if (!sc->sc_cmd_hold_nic_awake) {
1357		aprint_error_dev(sc->sc_dev,
1358		    "cmd_hold_nic_awake not set\n");
1359		return;
1360	}
1361
1362	sc->sc_cmd_hold_nic_awake = 0;
1363	IWM_CLRBITS(sc, IWM_CSR_GP_CNTRL,
1364	    IWM_CSR_GP_CNTRL_REG_FLAG_MAC_ACCESS_REQ);
1365}
1366
1367static int
1368iwm_set_cmd_in_flight(struct iwm_softc *sc)
1369{
1370	int ret;
1371
1372	/*
1373	 * wake up the NIC to make sure that the firmware will see the host
1374	 * command - we will let the NIC sleep once all the host commands
1375	 * returned. This needs to be done only on NICs that have
1376	 * apmg_wake_up_wa set.
1377	 */
1378	if (sc->apmg_wake_up_wa && !sc->sc_cmd_hold_nic_awake) {
1379
1380		IWM_SETBITS(sc, IWM_CSR_GP_CNTRL,
1381		    IWM_CSR_GP_CNTRL_REG_FLAG_MAC_ACCESS_REQ);
1382
1383		ret = iwm_poll_bit(sc, IWM_CSR_GP_CNTRL,
1384		    IWM_CSR_GP_CNTRL_REG_VAL_MAC_ACCESS_EN,
1385		    (IWM_CSR_GP_CNTRL_REG_FLAG_MAC_CLOCK_READY |
1386		     IWM_CSR_GP_CNTRL_REG_FLAG_GOING_TO_SLEEP),
1387		    15000);
1388		if (ret == 0) {
1389			IWM_CLRBITS(sc, IWM_CSR_GP_CNTRL,
1390			    IWM_CSR_GP_CNTRL_REG_FLAG_MAC_ACCESS_REQ);
1391			aprint_error_dev(sc->sc_dev,
1392			    "failed to wake NIC for hcmd\n");
1393			return EIO;
1394		}
1395		sc->sc_cmd_hold_nic_awake = 1;
1396	}
1397
1398	return 0;
1399}
1400static void
1401iwm_reset_tx_ring(struct iwm_softc *sc, struct iwm_tx_ring *ring)
1402{
1403	int i;
1404
1405	for (i = 0; i < IWM_TX_RING_COUNT; i++) {
1406		struct iwm_tx_data *data = &ring->data[i];
1407
1408		if (data->m != NULL) {
1409			bus_size_t sz = data->m->m_pkthdr.len;
1410			bus_dmamap_sync(sc->sc_dmat, data->map, 0,
1411			    sz, BUS_DMASYNC_POSTWRITE);
1412			bus_dmamap_unload(sc->sc_dmat, data->map);
1413			m_freem(data->m);
1414			data->m = NULL;
1415		}
1416	}
1417	/* Clear TX descriptors. */
1418	memset(ring->desc, 0, ring->desc_dma.size);
1419	bus_dmamap_sync(sc->sc_dmat, ring->desc_dma.map, 0,
1420	    ring->desc_dma.size, BUS_DMASYNC_PREWRITE);
1421	sc->qfullmsk &= ~(1 << ring->qid);
1422	ring->queued = 0;
1423	ring->cur = 0;
1424
1425	if (ring->qid == IWM_CMD_QUEUE && sc->sc_cmd_hold_nic_awake)
1426		iwm_clear_cmd_in_flight(sc);
1427}
1428
1429static void
1430iwm_free_tx_ring(struct iwm_softc *sc, struct iwm_tx_ring *ring)
1431{
1432	int i;
1433
1434	iwm_dma_contig_free(&ring->desc_dma);
1435	iwm_dma_contig_free(&ring->cmd_dma);
1436
1437	for (i = 0; i < IWM_TX_RING_COUNT; i++) {
1438		struct iwm_tx_data *data = &ring->data[i];
1439
1440		if (data->m != NULL) {
1441			bus_size_t sz = data->m->m_pkthdr.len;
1442			bus_dmamap_sync(sc->sc_dmat, data->map, 0,
1443			    sz, BUS_DMASYNC_POSTWRITE);
1444			bus_dmamap_unload(sc->sc_dmat, data->map);
1445			m_freem(data->m);
1446			data->m = NULL;
1447		}
1448		if (data->map != NULL) {
1449			bus_dmamap_destroy(sc->sc_dmat, data->map);
1450			data->map = NULL;
1451		}
1452	}
1453}
1454
1455static void
1456iwm_enable_rfkill_int(struct iwm_softc *sc)
1457{
1458	sc->sc_intmask = IWM_CSR_INT_BIT_RF_KILL;
1459	IWM_WRITE(sc, IWM_CSR_INT_MASK, sc->sc_intmask);
1460}
1461
1462static int
1463iwm_check_rfkill(struct iwm_softc *sc)
1464{
1465	uint32_t v;
1466	int s;
1467	int rv;
1468
1469	s = splnet();
1470
1471	/*
1472	 * "documentation" is not really helpful here:
1473	 *  27:	HW_RF_KILL_SW
1474	 *	Indicates state of (platform's) hardware RF-Kill switch
1475	 *
1476	 * But apparently when it's off, it's on ...
1477	 */
1478	v = IWM_READ(sc, IWM_CSR_GP_CNTRL);
1479	rv = (v & IWM_CSR_GP_CNTRL_REG_FLAG_HW_RF_KILL_SW) == 0;
1480	if (rv) {
1481		sc->sc_flags |= IWM_FLAG_RFKILL;
1482	} else {
1483		sc->sc_flags &= ~IWM_FLAG_RFKILL;
1484	}
1485
1486	splx(s);
1487	return rv;
1488}
1489
1490static void
1491iwm_enable_interrupts(struct iwm_softc *sc)
1492{
1493	sc->sc_intmask = IWM_CSR_INI_SET_MASK;
1494	IWM_WRITE(sc, IWM_CSR_INT_MASK, sc->sc_intmask);
1495}
1496
1497static void
1498iwm_restore_interrupts(struct iwm_softc *sc)
1499{
1500	IWM_WRITE(sc, IWM_CSR_INT_MASK, sc->sc_intmask);
1501}
1502
1503static void
1504iwm_disable_interrupts(struct iwm_softc *sc)
1505{
1506	int s = splnet();
1507
1508	IWM_WRITE(sc, IWM_CSR_INT_MASK, 0);
1509
1510	/* acknowledge all interrupts */
1511	IWM_WRITE(sc, IWM_CSR_INT, ~0);
1512	IWM_WRITE(sc, IWM_CSR_FH_INT_STATUS, ~0);
1513
1514	splx(s);
1515}
1516
1517static void
1518iwm_ict_reset(struct iwm_softc *sc)
1519{
1520	iwm_disable_interrupts(sc);
1521
1522	memset(sc->ict_dma.vaddr, 0, IWM_ICT_SIZE);
1523	bus_dmamap_sync(sc->sc_dmat, sc->ict_dma.map, 0, sc->ict_dma.size,
1524	    BUS_DMASYNC_PREWRITE);
1525	sc->ict_cur = 0;
1526
1527	/* Set physical address of ICT (4KB aligned). */
1528	IWM_WRITE(sc, IWM_CSR_DRAM_INT_TBL_REG,
1529	    IWM_CSR_DRAM_INT_TBL_ENABLE
1530	    | IWM_CSR_DRAM_INIT_TBL_WRAP_CHECK
1531	    | IWM_CSR_DRAM_INIT_TBL_WRITE_POINTER
1532	    | sc->ict_dma.paddr >> IWM_ICT_PADDR_SHIFT);
1533
1534	/* Switch to ICT interrupt mode in driver. */
1535	sc->sc_flags |= IWM_FLAG_USE_ICT;
1536
1537	IWM_WRITE(sc, IWM_CSR_INT, ~0);
1538	iwm_enable_interrupts(sc);
1539}
1540
1541#define IWM_HW_READY_TIMEOUT 50
1542static int
1543iwm_set_hw_ready(struct iwm_softc *sc)
1544{
1545	int ready;
1546
1547	IWM_SETBITS(sc, IWM_CSR_HW_IF_CONFIG_REG,
1548	    IWM_CSR_HW_IF_CONFIG_REG_BIT_NIC_READY);
1549
1550	ready = iwm_poll_bit(sc, IWM_CSR_HW_IF_CONFIG_REG,
1551	    IWM_CSR_HW_IF_CONFIG_REG_BIT_NIC_READY,
1552	    IWM_CSR_HW_IF_CONFIG_REG_BIT_NIC_READY,
1553	    IWM_HW_READY_TIMEOUT);
1554	if (ready)
1555		IWM_SETBITS(sc, IWM_CSR_MBOX_SET_REG,
1556		    IWM_CSR_MBOX_SET_REG_OS_ALIVE);
1557
1558	return ready;
1559}
1560#undef IWM_HW_READY_TIMEOUT
1561
1562static int
1563iwm_prepare_card_hw(struct iwm_softc *sc)
1564{
1565	int t = 0;
1566
1567	if (iwm_set_hw_ready(sc))
1568		return 0;
1569
1570	DELAY(100);
1571
1572	/* If HW is not ready, prepare the conditions to check again */
1573	IWM_SETBITS(sc, IWM_CSR_HW_IF_CONFIG_REG,
1574	    IWM_CSR_HW_IF_CONFIG_REG_PREPARE);
1575
1576	do {
1577		if (iwm_set_hw_ready(sc))
1578			return 0;
1579		DELAY(200);
1580		t += 200;
1581	} while (t < 150000);
1582
1583	return ETIMEDOUT;
1584}
1585
1586static void
1587iwm_apm_config(struct iwm_softc *sc)
1588{
1589	pcireg_t reg;
1590
1591	reg = pci_conf_read(sc->sc_pct, sc->sc_pcitag,
1592	    sc->sc_cap_off + PCIE_LCSR);
1593	if (reg & PCIE_LCSR_ASPM_L1) {
1594		/* Um the Linux driver prints "Disabling L0S for this one ... */
1595		IWM_SETBITS(sc, IWM_CSR_GIO_REG,
1596		    IWM_CSR_GIO_REG_VAL_L0S_ENABLED);
1597	} else {
1598		/* ... and "Enabling" here */
1599		IWM_CLRBITS(sc, IWM_CSR_GIO_REG,
1600		    IWM_CSR_GIO_REG_VAL_L0S_ENABLED);
1601	}
1602}
1603
1604/*
1605 * Start up NIC's basic functionality after it has been reset
1606 * e.g. after platform boot or shutdown.
1607 * NOTE:  This does not load uCode nor start the embedded processor
1608 */
1609static int
1610iwm_apm_init(struct iwm_softc *sc)
1611{
1612	int err = 0;
1613
1614	/* Disable L0S exit timer (platform NMI workaround) */
1615	if (sc->sc_device_family != IWM_DEVICE_FAMILY_8000) {
1616		IWM_SETBITS(sc, IWM_CSR_GIO_CHICKEN_BITS,
1617		    IWM_CSR_GIO_CHICKEN_BITS_REG_BIT_DIS_L0S_EXIT_TIMER);
1618	}
1619
1620	/*
1621	 * Disable L0s without affecting L1;
1622	 *  don't wait for ICH L0s (ICH bug W/A)
1623	 */
1624	IWM_SETBITS(sc, IWM_CSR_GIO_CHICKEN_BITS,
1625	    IWM_CSR_GIO_CHICKEN_BITS_REG_BIT_L1A_NO_L0S_RX);
1626
1627	/* Set FH wait threshold to maximum (HW error during stress W/A) */
1628	IWM_SETBITS(sc, IWM_CSR_DBG_HPET_MEM_REG, IWM_CSR_DBG_HPET_MEM_REG_VAL);
1629
1630	/*
1631	 * Enable HAP INTA (interrupt from management bus) to
1632	 * wake device's PCI Express link L1a -> L0s
1633	 */
1634	IWM_SETBITS(sc, IWM_CSR_HW_IF_CONFIG_REG,
1635	    IWM_CSR_HW_IF_CONFIG_REG_BIT_HAP_WAKE_L1A);
1636
1637	iwm_apm_config(sc);
1638
1639#if 0 /* not for 7k/8k */
1640	/* Configure analog phase-lock-loop before activating to D0A */
1641	if (trans->cfg->base_params->pll_cfg_val)
1642		IWM_SETBITS(trans, IWM_CSR_ANA_PLL_CFG,
1643		    trans->cfg->base_params->pll_cfg_val);
1644#endif
1645
1646	/*
1647	 * Set "initialization complete" bit to move adapter from
1648	 * D0U* --> D0A* (powered-up active) state.
1649	 */
1650	IWM_SETBITS(sc, IWM_CSR_GP_CNTRL, IWM_CSR_GP_CNTRL_REG_FLAG_INIT_DONE);
1651
1652	/*
1653	 * Wait for clock stabilization; once stabilized, access to
1654	 * device-internal resources is supported, e.g. iwm_write_prph()
1655	 * and accesses to uCode SRAM.
1656	 */
1657	if (!iwm_poll_bit(sc, IWM_CSR_GP_CNTRL,
1658	    IWM_CSR_GP_CNTRL_REG_FLAG_MAC_CLOCK_READY,
1659	    IWM_CSR_GP_CNTRL_REG_FLAG_MAC_CLOCK_READY, 25000)) {
1660		aprint_error_dev(sc->sc_dev,
1661		    "timeout waiting for clock stabilization\n");
1662		err = ETIMEDOUT;
1663		goto out;
1664	}
1665
1666	if (sc->host_interrupt_operation_mode) {
1667		/*
1668		 * This is a bit of an abuse - This is needed for 7260 / 3160
1669		 * only check host_interrupt_operation_mode even if this is
1670		 * not related to host_interrupt_operation_mode.
1671		 *
1672		 * Enable the oscillator to count wake up time for L1 exit. This
1673		 * consumes slightly more power (100uA) - but allows to be sure
1674		 * that we wake up from L1 on time.
1675		 *
1676		 * This looks weird: read twice the same register, discard the
1677		 * value, set a bit, and yet again, read that same register
1678		 * just to discard the value. But that's the way the hardware
1679		 * seems to like it.
1680		 */
1681		iwm_read_prph(sc, IWM_OSC_CLK);
1682		iwm_read_prph(sc, IWM_OSC_CLK);
1683		iwm_set_bits_prph(sc, IWM_OSC_CLK, IWM_OSC_CLK_FORCE_CONTROL);
1684		iwm_read_prph(sc, IWM_OSC_CLK);
1685		iwm_read_prph(sc, IWM_OSC_CLK);
1686	}
1687
1688	/*
1689	 * Enable DMA clock and wait for it to stabilize.
1690	 *
1691	 * Write to "CLK_EN_REG"; "1" bits enable clocks, while "0" bits
1692	 * do not disable clocks.  This preserves any hardware bits already
1693	 * set by default in "CLK_CTRL_REG" after reset.
1694	 */
1695	if (sc->sc_device_family == IWM_DEVICE_FAMILY_7000) {
1696		iwm_write_prph(sc, IWM_APMG_CLK_EN_REG,
1697		    IWM_APMG_CLK_VAL_DMA_CLK_RQT);
1698		DELAY(20);
1699
1700		/* Disable L1-Active */
1701		iwm_set_bits_prph(sc, IWM_APMG_PCIDEV_STT_REG,
1702		    IWM_APMG_PCIDEV_STT_VAL_L1_ACT_DIS);
1703
1704		/* Clear the interrupt in APMG if the NIC is in RFKILL */
1705		iwm_write_prph(sc, IWM_APMG_RTC_INT_STT_REG,
1706		    IWM_APMG_RTC_INT_STT_RFKILL);
1707	}
1708 out:
1709	if (err)
1710		aprint_error_dev(sc->sc_dev, "apm init error %d\n", err);
1711	return err;
1712}
1713
1714static void
1715iwm_apm_stop(struct iwm_softc *sc)
1716{
1717	/* stop device's busmaster DMA activity */
1718	IWM_SETBITS(sc, IWM_CSR_RESET, IWM_CSR_RESET_REG_FLAG_STOP_MASTER);
1719
1720	if (!iwm_poll_bit(sc, IWM_CSR_RESET,
1721	    IWM_CSR_RESET_REG_FLAG_MASTER_DISABLED,
1722	    IWM_CSR_RESET_REG_FLAG_MASTER_DISABLED, 100))
1723		aprint_error_dev(sc->sc_dev, "timeout waiting for master\n");
1724	DPRINTF(("iwm apm stop\n"));
1725}
1726
1727static int
1728iwm_start_hw(struct iwm_softc *sc)
1729{
1730	int err;
1731
1732	err = iwm_prepare_card_hw(sc);
1733	if (err)
1734		return err;
1735
1736	/* Reset the entire device */
1737	IWM_WRITE(sc, IWM_CSR_RESET, IWM_CSR_RESET_REG_FLAG_SW_RESET);
1738	DELAY(10);
1739
1740	err = iwm_apm_init(sc);
1741	if (err)
1742		return err;
1743
1744	iwm_enable_rfkill_int(sc);
1745	iwm_check_rfkill(sc);
1746
1747	return 0;
1748}
1749
1750static void
1751iwm_stop_device(struct iwm_softc *sc)
1752{
1753	int chnl, ntries;
1754	int qid;
1755
1756	iwm_disable_interrupts(sc);
1757	sc->sc_flags &= ~IWM_FLAG_USE_ICT;
1758
1759	/* Deactivate TX scheduler. */
1760	iwm_write_prph(sc, IWM_SCD_TXFACT, 0);
1761
1762	/* Stop all DMA channels. */
1763	if (iwm_nic_lock(sc)) {
1764		for (chnl = 0; chnl < IWM_FH_TCSR_CHNL_NUM; chnl++) {
1765			IWM_WRITE(sc,
1766			    IWM_FH_TCSR_CHNL_TX_CONFIG_REG(chnl), 0);
1767			for (ntries = 0; ntries < 200; ntries++) {
1768				uint32_t r;
1769
1770				r = IWM_READ(sc, IWM_FH_TSSR_TX_STATUS_REG);
1771				if (r & IWM_FH_TSSR_TX_STATUS_REG_MSK_CHNL_IDLE(
1772				    chnl))
1773					break;
1774				DELAY(20);
1775			}
1776		}
1777		iwm_nic_unlock(sc);
1778	}
1779	iwm_disable_rx_dma(sc);
1780
1781	iwm_reset_rx_ring(sc, &sc->rxq);
1782
1783	for (qid = 0; qid < __arraycount(sc->txq); qid++)
1784		iwm_reset_tx_ring(sc, &sc->txq[qid]);
1785
1786	if (sc->sc_device_family == IWM_DEVICE_FAMILY_7000) {
1787		/* Power-down device's busmaster DMA clocks */
1788		if (iwm_nic_lock(sc)) {
1789			iwm_write_prph(sc, IWM_APMG_CLK_DIS_REG,
1790			    IWM_APMG_CLK_VAL_DMA_CLK_RQT);
1791			DELAY(5);
1792			iwm_nic_unlock(sc);
1793		}
1794	}
1795
1796	/* Make sure (redundant) we've released our request to stay awake */
1797	IWM_CLRBITS(sc, IWM_CSR_GP_CNTRL,
1798	    IWM_CSR_GP_CNTRL_REG_FLAG_MAC_ACCESS_REQ);
1799
1800	/* Stop the device, and put it in low power state */
1801	iwm_apm_stop(sc);
1802
1803	/*
1804	 * Upon stop, the APM issues an interrupt if HW RF kill is set.
1805	 * Clean again the interrupt here
1806	 */
1807	iwm_disable_interrupts(sc);
1808
1809	/* Reset the on-board processor. */
1810	IWM_WRITE(sc, IWM_CSR_RESET, IWM_CSR_RESET_REG_FLAG_SW_RESET);
1811
1812	/* Even though we stop the HW we still want the RF kill interrupt. */
1813	iwm_enable_rfkill_int(sc);
1814	iwm_check_rfkill(sc);
1815}
1816
1817static void
1818iwm_nic_config(struct iwm_softc *sc)
1819{
1820	uint8_t radio_cfg_type, radio_cfg_step, radio_cfg_dash;
1821	uint32_t reg_val = 0;
1822
1823	radio_cfg_type = (sc->sc_fw_phy_config & IWM_FW_PHY_CFG_RADIO_TYPE) >>
1824	    IWM_FW_PHY_CFG_RADIO_TYPE_POS;
1825	radio_cfg_step = (sc->sc_fw_phy_config & IWM_FW_PHY_CFG_RADIO_STEP) >>
1826	    IWM_FW_PHY_CFG_RADIO_STEP_POS;
1827	radio_cfg_dash = (sc->sc_fw_phy_config & IWM_FW_PHY_CFG_RADIO_DASH) >>
1828	    IWM_FW_PHY_CFG_RADIO_DASH_POS;
1829
1830	reg_val |= IWM_CSR_HW_REV_STEP(sc->sc_hw_rev) <<
1831	    IWM_CSR_HW_IF_CONFIG_REG_POS_MAC_STEP;
1832	reg_val |= IWM_CSR_HW_REV_DASH(sc->sc_hw_rev) <<
1833	    IWM_CSR_HW_IF_CONFIG_REG_POS_MAC_DASH;
1834
1835	/* radio configuration */
1836	reg_val |= radio_cfg_type << IWM_CSR_HW_IF_CONFIG_REG_POS_PHY_TYPE;
1837	reg_val |= radio_cfg_step << IWM_CSR_HW_IF_CONFIG_REG_POS_PHY_STEP;
1838	reg_val |= radio_cfg_dash << IWM_CSR_HW_IF_CONFIG_REG_POS_PHY_DASH;
1839
1840	IWM_WRITE(sc, IWM_CSR_HW_IF_CONFIG_REG, reg_val);
1841
1842	DPRINTF(("Radio type=0x%x-0x%x-0x%x\n", radio_cfg_type,
1843	    radio_cfg_step, radio_cfg_dash));
1844
1845	/*
1846	 * W/A : NIC is stuck in a reset state after Early PCIe power off
1847	 * (PCIe power is lost before PERST# is asserted), causing ME FW
1848	 * to lose ownership and not being able to obtain it back.
1849	 */
1850	if (sc->sc_device_family == IWM_DEVICE_FAMILY_7000) {
1851		iwm_set_bits_mask_prph(sc, IWM_APMG_PS_CTRL_REG,
1852		    IWM_APMG_PS_CTRL_EARLY_PWR_OFF_RESET_DIS,
1853		    ~IWM_APMG_PS_CTRL_EARLY_PWR_OFF_RESET_DIS);
1854	}
1855}
1856
1857static int
1858iwm_nic_rx_init(struct iwm_softc *sc)
1859{
1860	if (!iwm_nic_lock(sc))
1861		return EBUSY;
1862
1863	memset(sc->rxq.stat, 0, sizeof(*sc->rxq.stat));
1864	bus_dmamap_sync(sc->sc_dmat, sc->rxq.stat_dma.map,
1865	    0, sc->rxq.stat_dma.size,
1866	    BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
1867
1868	iwm_disable_rx_dma(sc);
1869	IWM_WRITE(sc, IWM_FH_MEM_RCSR_CHNL0_RBDCB_WPTR, 0);
1870	IWM_WRITE(sc, IWM_FH_MEM_RCSR_CHNL0_FLUSH_RB_REQ, 0);
1871	IWM_WRITE(sc, IWM_FH_RSCSR_CHNL0_RDPTR, 0);
1872	IWM_WRITE(sc, IWM_FH_RSCSR_CHNL0_RBDCB_WPTR_REG, 0);
1873
1874	/* Set physical address of RX ring (256-byte aligned). */
1875	IWM_WRITE(sc,
1876	    IWM_FH_RSCSR_CHNL0_RBDCB_BASE_REG, sc->rxq.desc_dma.paddr >> 8);
1877
1878	/* Set physical address of RX status (16-byte aligned). */
1879	IWM_WRITE(sc,
1880	    IWM_FH_RSCSR_CHNL0_STTS_WPTR_REG, sc->rxq.stat_dma.paddr >> 4);
1881
1882	/* Enable RX. */
1883	IWM_WRITE(sc, IWM_FH_MEM_RCSR_CHNL0_CONFIG_REG,
1884	    IWM_FH_RCSR_RX_CONFIG_CHNL_EN_ENABLE_VAL		|
1885	    IWM_FH_RCSR_CHNL0_RX_IGNORE_RXF_EMPTY		|  /* HW bug */
1886	    IWM_FH_RCSR_CHNL0_RX_CONFIG_IRQ_DEST_INT_HOST_VAL	|
1887	    IWM_FH_RCSR_CHNL0_RX_CONFIG_SINGLE_FRAME_MSK	|
1888	    IWM_FH_RCSR_RX_CONFIG_REG_VAL_RB_SIZE_4K		|
1889	    (IWM_RX_RB_TIMEOUT << IWM_FH_RCSR_RX_CONFIG_REG_IRQ_RBTH_POS) |
1890	    IWM_RX_QUEUE_SIZE_LOG << IWM_FH_RCSR_RX_CONFIG_RBDCB_SIZE_POS);
1891
1892	IWM_WRITE_1(sc, IWM_CSR_INT_COALESCING, IWM_HOST_INT_TIMEOUT_DEF);
1893
1894	/* W/A for interrupt coalescing bug in 7260 and 3160 */
1895	if (sc->host_interrupt_operation_mode)
1896		IWM_SETBITS(sc, IWM_CSR_INT_COALESCING, IWM_HOST_INT_OPER_MODE);
1897
1898	/*
1899	 * This value should initially be 0 (before preparing any RBs),
1900	 * and should be 8 after preparing the first 8 RBs (for example).
1901	 */
1902	IWM_WRITE(sc, IWM_FH_RSCSR_CHNL0_WPTR, 8);
1903
1904	iwm_nic_unlock(sc);
1905
1906	return 0;
1907}
1908
1909static int
1910iwm_nic_tx_init(struct iwm_softc *sc)
1911{
1912	int qid;
1913
1914	if (!iwm_nic_lock(sc))
1915		return EBUSY;
1916
1917	/* Deactivate TX scheduler. */
1918	iwm_write_prph(sc, IWM_SCD_TXFACT, 0);
1919
1920	/* Set physical address of "keep warm" page (16-byte aligned). */
1921	IWM_WRITE(sc, IWM_FH_KW_MEM_ADDR_REG, sc->kw_dma.paddr >> 4);
1922
1923	for (qid = 0; qid < __arraycount(sc->txq); qid++) {
1924		struct iwm_tx_ring *txq = &sc->txq[qid];
1925
1926		/* Set physical address of TX ring (256-byte aligned). */
1927		IWM_WRITE(sc, IWM_FH_MEM_CBBC_QUEUE(qid),
1928		    txq->desc_dma.paddr >> 8);
1929		DPRINTF(("loading ring %d descriptors (%p) at %"PRIxMAX"\n",
1930		    qid, txq->desc, (uintmax_t)(txq->desc_dma.paddr >> 8)));
1931	}
1932
1933	iwm_write_prph(sc, IWM_SCD_GP_CTRL, IWM_SCD_GP_CTRL_AUTO_ACTIVE_MODE);
1934
1935	iwm_nic_unlock(sc);
1936
1937	return 0;
1938}
1939
1940static int
1941iwm_nic_init(struct iwm_softc *sc)
1942{
1943	int err;
1944
1945	iwm_apm_init(sc);
1946	if (sc->sc_device_family == IWM_DEVICE_FAMILY_7000) {
1947		iwm_set_bits_mask_prph(sc, IWM_APMG_PS_CTRL_REG,
1948		    IWM_APMG_PS_CTRL_VAL_PWR_SRC_VMAIN,
1949		    ~IWM_APMG_PS_CTRL_MSK_PWR_SRC);
1950	}
1951
1952	iwm_nic_config(sc);
1953
1954	err = iwm_nic_rx_init(sc);
1955	if (err)
1956		return err;
1957
1958	err = iwm_nic_tx_init(sc);
1959	if (err)
1960		return err;
1961
1962	DPRINTF(("shadow registers enabled\n"));
1963	IWM_SETBITS(sc, IWM_CSR_MAC_SHADOW_REG_CTRL, 0x800fffff);
1964
1965	return 0;
1966}
1967
1968static const uint8_t iwm_ac_to_tx_fifo[] = {
1969	IWM_TX_FIFO_VO,
1970	IWM_TX_FIFO_VI,
1971	IWM_TX_FIFO_BE,
1972	IWM_TX_FIFO_BK,
1973};
1974
1975static int
1976iwm_enable_txq(struct iwm_softc *sc, int sta_id, int qid, int fifo)
1977{
1978	if (!iwm_nic_lock(sc)) {
1979		DPRINTF(("%s: cannot enable txq %d\n", DEVNAME(sc), qid));
1980		return EBUSY;
1981	}
1982
1983	IWM_WRITE(sc, IWM_HBUS_TARG_WRPTR, qid << 8 | 0);
1984
1985	if (qid == IWM_CMD_QUEUE) {
1986		iwm_write_prph(sc, IWM_SCD_QUEUE_STATUS_BITS(qid),
1987		    (0 << IWM_SCD_QUEUE_STTS_REG_POS_ACTIVE)
1988		    | (1 << IWM_SCD_QUEUE_STTS_REG_POS_SCD_ACT_EN));
1989
1990		iwm_nic_unlock(sc);
1991
1992		iwm_clear_bits_prph(sc, IWM_SCD_AGGR_SEL, (1 << qid));
1993
1994		if (!iwm_nic_lock(sc))
1995			return EBUSY;
1996		iwm_write_prph(sc, IWM_SCD_QUEUE_RDPTR(qid), 0);
1997		iwm_nic_unlock(sc);
1998
1999		iwm_write_mem32(sc,
2000		    sc->sched_base + IWM_SCD_CONTEXT_QUEUE_OFFSET(qid), 0);
2001
2002		/* Set scheduler window size and frame limit. */
2003		iwm_write_mem32(sc,
2004		    sc->sched_base + IWM_SCD_CONTEXT_QUEUE_OFFSET(qid) +
2005		    sizeof(uint32_t),
2006		    ((IWM_FRAME_LIMIT << IWM_SCD_QUEUE_CTX_REG2_WIN_SIZE_POS) &
2007		    IWM_SCD_QUEUE_CTX_REG2_WIN_SIZE_MSK) |
2008		    ((IWM_FRAME_LIMIT
2009		        << IWM_SCD_QUEUE_CTX_REG2_FRAME_LIMIT_POS) &
2010		    IWM_SCD_QUEUE_CTX_REG2_FRAME_LIMIT_MSK));
2011
2012		if (!iwm_nic_lock(sc))
2013			return EBUSY;
2014		iwm_write_prph(sc, IWM_SCD_QUEUE_STATUS_BITS(qid),
2015		    (1 << IWM_SCD_QUEUE_STTS_REG_POS_ACTIVE) |
2016		    (fifo << IWM_SCD_QUEUE_STTS_REG_POS_TXF) |
2017		    (1 << IWM_SCD_QUEUE_STTS_REG_POS_WSL) |
2018		    IWM_SCD_QUEUE_STTS_REG_MSK);
2019	} else {
2020		struct iwm_scd_txq_cfg_cmd cmd;
2021		int err;
2022
2023		iwm_nic_unlock(sc);
2024
2025		memset(&cmd, 0, sizeof(cmd));
2026		cmd.scd_queue = qid;
2027		cmd.enable = 1;
2028		cmd.sta_id = sta_id;
2029		cmd.tx_fifo = fifo;
2030		cmd.aggregate = 0;
2031		cmd.window = IWM_FRAME_LIMIT;
2032
2033		err = iwm_send_cmd_pdu(sc, IWM_SCD_QUEUE_CFG, 0, sizeof(cmd),
2034		    &cmd);
2035		if (err)
2036			return err;
2037
2038		if (!iwm_nic_lock(sc))
2039			return EBUSY;
2040	}
2041
2042	iwm_write_prph(sc, IWM_SCD_EN_CTRL,
2043	    iwm_read_prph(sc, IWM_SCD_EN_CTRL) | qid);
2044
2045	iwm_nic_unlock(sc);
2046
2047	DPRINTF(("enabled txq %d FIFO %d\n", qid, fifo));
2048
2049	return 0;
2050}
2051
2052static int
2053iwm_post_alive(struct iwm_softc *sc)
2054{
2055	int nwords = (IWM_SCD_TRANS_TBL_MEM_UPPER_BOUND -
2056	    IWM_SCD_CONTEXT_MEM_LOWER_BOUND) / sizeof(uint32_t);
2057	int err, chnl;
2058	uint32_t base;
2059
2060	if (!iwm_nic_lock(sc))
2061		return EBUSY;
2062
2063	base = iwm_read_prph(sc, IWM_SCD_SRAM_BASE_ADDR);
2064	if (sc->sched_base != base) {
2065		DPRINTF(("%s: sched addr mismatch: 0x%08x != 0x%08x\n",
2066		    DEVNAME(sc), sc->sched_base, base));
2067		sc->sched_base = base;
2068	}
2069
2070	iwm_nic_unlock(sc);
2071
2072	iwm_ict_reset(sc);
2073
2074	/* Clear TX scheduler state in SRAM. */
2075	err = iwm_write_mem(sc,
2076	    sc->sched_base + IWM_SCD_CONTEXT_MEM_LOWER_BOUND, NULL, nwords);
2077	if (err)
2078		return err;
2079
2080	if (!iwm_nic_lock(sc))
2081		return EBUSY;
2082
2083	/* Set physical address of TX scheduler rings (1KB aligned). */
2084	iwm_write_prph(sc, IWM_SCD_DRAM_BASE_ADDR, sc->sched_dma.paddr >> 10);
2085
2086	iwm_write_prph(sc, IWM_SCD_CHAINEXT_EN, 0);
2087
2088	iwm_nic_unlock(sc);
2089
2090	/* enable command channel */
2091	err = iwm_enable_txq(sc, 0 /* unused */, IWM_CMD_QUEUE, 7);
2092	if (err)
2093		return err;
2094
2095	if (!iwm_nic_lock(sc))
2096		return EBUSY;
2097
2098	/* Activate TX scheduler. */
2099	iwm_write_prph(sc, IWM_SCD_TXFACT, 0xff);
2100
2101	/* Enable DMA channels. */
2102	for (chnl = 0; chnl < IWM_FH_TCSR_CHNL_NUM; chnl++) {
2103		IWM_WRITE(sc, IWM_FH_TCSR_CHNL_TX_CONFIG_REG(chnl),
2104		    IWM_FH_TCSR_TX_CONFIG_REG_VAL_DMA_CHNL_ENABLE |
2105		    IWM_FH_TCSR_TX_CONFIG_REG_VAL_DMA_CREDIT_ENABLE);
2106	}
2107
2108	IWM_SETBITS(sc, IWM_FH_TX_CHICKEN_BITS_REG,
2109	    IWM_FH_TX_CHICKEN_BITS_SCD_AUTO_RETRY_EN);
2110
2111	/* Enable L1-Active */
2112	if (sc->sc_device_family != IWM_DEVICE_FAMILY_8000) {
2113		iwm_clear_bits_prph(sc, IWM_APMG_PCIDEV_STT_REG,
2114		    IWM_APMG_PCIDEV_STT_VAL_L1_ACT_DIS);
2115	}
2116
2117	iwm_nic_unlock(sc);
2118
2119	return 0;
2120}
2121
2122static struct iwm_phy_db_entry *
2123iwm_phy_db_get_section(struct iwm_softc *sc, enum iwm_phy_db_section_type type,
2124    uint16_t chg_id)
2125{
2126	struct iwm_phy_db *phy_db = &sc->sc_phy_db;
2127
2128	if (type >= IWM_PHY_DB_MAX)
2129		return NULL;
2130
2131	switch (type) {
2132	case IWM_PHY_DB_CFG:
2133		return &phy_db->cfg;
2134	case IWM_PHY_DB_CALIB_NCH:
2135		return &phy_db->calib_nch;
2136	case IWM_PHY_DB_CALIB_CHG_PAPD:
2137		if (chg_id >= IWM_NUM_PAPD_CH_GROUPS)
2138			return NULL;
2139		return &phy_db->calib_ch_group_papd[chg_id];
2140	case IWM_PHY_DB_CALIB_CHG_TXP:
2141		if (chg_id >= IWM_NUM_TXP_CH_GROUPS)
2142			return NULL;
2143		return &phy_db->calib_ch_group_txp[chg_id];
2144	default:
2145		return NULL;
2146	}
2147	return NULL;
2148}
2149
2150static int
2151iwm_phy_db_set_section(struct iwm_softc *sc,
2152    struct iwm_calib_res_notif_phy_db *phy_db_notif, uint16_t size)
2153{
2154	struct iwm_phy_db_entry *entry;
2155	enum iwm_phy_db_section_type type = le16toh(phy_db_notif->type);
2156	uint16_t chg_id = 0;
2157
2158	if (type == IWM_PHY_DB_CALIB_CHG_PAPD ||
2159	    type == IWM_PHY_DB_CALIB_CHG_TXP)
2160		chg_id = le16toh(*(uint16_t *)phy_db_notif->data);
2161
2162	entry = iwm_phy_db_get_section(sc, type, chg_id);
2163	if (!entry)
2164		return EINVAL;
2165
2166	if (entry->data)
2167		kmem_intr_free(entry->data, entry->size);
2168	entry->data = kmem_intr_alloc(size, KM_NOSLEEP);
2169	if (!entry->data) {
2170		entry->size = 0;
2171		return ENOMEM;
2172	}
2173	memcpy(entry->data, phy_db_notif->data, size);
2174	entry->size = size;
2175
2176	DPRINTFN(10, ("%s(%d): [PHYDB]SET: Type %d, Size: %d, data: %p\n",
2177	    __func__, __LINE__, type, size, entry->data));
2178
2179	return 0;
2180}
2181
2182static int
2183iwm_is_valid_channel(uint16_t ch_id)
2184{
2185	if (ch_id <= 14 ||
2186	    (36 <= ch_id && ch_id <= 64 && ch_id % 4 == 0) ||
2187	    (100 <= ch_id && ch_id <= 140 && ch_id % 4 == 0) ||
2188	    (145 <= ch_id && ch_id <= 165 && ch_id % 4 == 1))
2189		return 1;
2190	return 0;
2191}
2192
2193static uint8_t
2194iwm_ch_id_to_ch_index(uint16_t ch_id)
2195{
2196	if (!iwm_is_valid_channel(ch_id))
2197		return 0xff;
2198
2199	if (ch_id <= 14)
2200		return ch_id - 1;
2201	if (ch_id <= 64)
2202		return (ch_id + 20) / 4;
2203	if (ch_id <= 140)
2204		return (ch_id - 12) / 4;
2205	return (ch_id - 13) / 4;
2206}
2207
2208
2209static uint16_t
2210iwm_channel_id_to_papd(uint16_t ch_id)
2211{
2212	if (!iwm_is_valid_channel(ch_id))
2213		return 0xff;
2214
2215	if (1 <= ch_id && ch_id <= 14)
2216		return 0;
2217	if (36 <= ch_id && ch_id <= 64)
2218		return 1;
2219	if (100 <= ch_id && ch_id <= 140)
2220		return 2;
2221	return 3;
2222}
2223
2224static uint16_t
2225iwm_channel_id_to_txp(struct iwm_softc *sc, uint16_t ch_id)
2226{
2227	struct iwm_phy_db *phy_db = &sc->sc_phy_db;
2228	struct iwm_phy_db_chg_txp *txp_chg;
2229	int i;
2230	uint8_t ch_index = iwm_ch_id_to_ch_index(ch_id);
2231
2232	if (ch_index == 0xff)
2233		return 0xff;
2234
2235	for (i = 0; i < IWM_NUM_TXP_CH_GROUPS; i++) {
2236		txp_chg = (void *)phy_db->calib_ch_group_txp[i].data;
2237		if (!txp_chg)
2238			return 0xff;
2239		/*
2240		 * Looking for the first channel group the max channel
2241		 * of which is higher than the requested channel.
2242		 */
2243		if (le16toh(txp_chg->max_channel_idx) >= ch_index)
2244			return i;
2245	}
2246	return 0xff;
2247}
2248
2249static int
2250iwm_phy_db_get_section_data(struct iwm_softc *sc, uint32_t type, uint8_t **data,
2251    uint16_t *size, uint16_t ch_id)
2252{
2253	struct iwm_phy_db_entry *entry;
2254	uint16_t ch_group_id = 0;
2255
2256	if (type == IWM_PHY_DB_CALIB_CHG_PAPD)
2257		ch_group_id = iwm_channel_id_to_papd(ch_id);
2258	else if (type == IWM_PHY_DB_CALIB_CHG_TXP)
2259		ch_group_id = iwm_channel_id_to_txp(sc, ch_id);
2260
2261	entry = iwm_phy_db_get_section(sc, type, ch_group_id);
2262	if (!entry)
2263		return EINVAL;
2264
2265	*data = entry->data;
2266	*size = entry->size;
2267
2268	DPRINTFN(10, ("%s(%d): [PHYDB] GET: Type %d , Size: %d\n",
2269		       __func__, __LINE__, type, *size));
2270
2271	return 0;
2272}
2273
2274static int
2275iwm_send_phy_db_cmd(struct iwm_softc *sc, uint16_t type, uint16_t length,
2276    void *data)
2277{
2278	struct iwm_phy_db_cmd phy_db_cmd;
2279	struct iwm_host_cmd cmd = {
2280		.id = IWM_PHY_DB_CMD,
2281		.flags = IWM_CMD_ASYNC,
2282	};
2283
2284	DPRINTFN(10, ("Sending PHY-DB hcmd of type %d, of length %d\n",
2285	    type, length));
2286
2287	phy_db_cmd.type = le16toh(type);
2288	phy_db_cmd.length = le16toh(length);
2289
2290	cmd.data[0] = &phy_db_cmd;
2291	cmd.len[0] = sizeof(struct iwm_phy_db_cmd);
2292	cmd.data[1] = data;
2293	cmd.len[1] = length;
2294
2295	return iwm_send_cmd(sc, &cmd);
2296}
2297
2298static int
2299iwm_phy_db_send_all_channel_groups(struct iwm_softc *sc,
2300    enum iwm_phy_db_section_type type, uint8_t max_ch_groups)
2301{
2302	uint16_t i;
2303	int err;
2304	struct iwm_phy_db_entry *entry;
2305
2306	/* Send all the channel-specific groups to operational fw */
2307	for (i = 0; i < max_ch_groups; i++) {
2308		entry = iwm_phy_db_get_section(sc, type, i);
2309		if (!entry)
2310			return EINVAL;
2311
2312		if (!entry->size)
2313			continue;
2314
2315		err = iwm_send_phy_db_cmd(sc, type, entry->size, entry->data);
2316		if (err) {
2317			DPRINTF(("%s: Can't SEND phy_db section %d (%d), "
2318			    "err %d\n", DEVNAME(sc), type, i, err));
2319			return err;
2320		}
2321
2322		DPRINTFN(10, ("%s: Sent PHY_DB HCMD, type = %d num = %d\n",
2323		    DEVNAME(sc), type, i));
2324
2325		DELAY(1000);
2326	}
2327
2328	return 0;
2329}
2330
2331static int
2332iwm_send_phy_db_data(struct iwm_softc *sc)
2333{
2334	uint8_t *data = NULL;
2335	uint16_t size = 0;
2336	int err;
2337
2338	err = iwm_phy_db_get_section_data(sc, IWM_PHY_DB_CFG, &data, &size, 0);
2339	if (err)
2340		return err;
2341
2342	err = iwm_send_phy_db_cmd(sc, IWM_PHY_DB_CFG, size, data);
2343	if (err)
2344		return err;
2345
2346	err = iwm_phy_db_get_section_data(sc, IWM_PHY_DB_CALIB_NCH,
2347	    &data, &size, 0);
2348	if (err)
2349		return err;
2350
2351	err = iwm_send_phy_db_cmd(sc, IWM_PHY_DB_CALIB_NCH, size, data);
2352	if (err)
2353		return err;
2354
2355	err = iwm_phy_db_send_all_channel_groups(sc,
2356	    IWM_PHY_DB_CALIB_CHG_PAPD, IWM_NUM_PAPD_CH_GROUPS);
2357	if (err)
2358		return err;
2359
2360	err = iwm_phy_db_send_all_channel_groups(sc,
2361	    IWM_PHY_DB_CALIB_CHG_TXP, IWM_NUM_TXP_CH_GROUPS);
2362	if (err)
2363		return err;
2364
2365	return 0;
2366}
2367
2368/*
2369 * For the high priority TE use a time event type that has similar priority to
2370 * the FW's action scan priority.
2371 */
2372#define IWM_ROC_TE_TYPE_NORMAL IWM_TE_P2P_DEVICE_DISCOVERABLE
2373#define IWM_ROC_TE_TYPE_MGMT_TX IWM_TE_P2P_CLIENT_ASSOC
2374
2375/* used to convert from time event API v2 to v1 */
2376#define IWM_TE_V2_DEP_POLICY_MSK (IWM_TE_V2_DEP_OTHER | IWM_TE_V2_DEP_TSF |\
2377			     IWM_TE_V2_EVENT_SOCIOPATHIC)
2378static inline uint16_t
2379iwm_te_v2_get_notify(uint16_t policy)
2380{
2381	return le16toh(policy) & IWM_TE_V2_NOTIF_MSK;
2382}
2383
2384static inline uint16_t
2385iwm_te_v2_get_dep_policy(uint16_t policy)
2386{
2387	return (le16toh(policy) & IWM_TE_V2_DEP_POLICY_MSK) >>
2388		IWM_TE_V2_PLACEMENT_POS;
2389}
2390
2391static inline uint16_t
2392iwm_te_v2_get_absence(uint16_t policy)
2393{
2394	return (le16toh(policy) & IWM_TE_V2_ABSENCE) >> IWM_TE_V2_ABSENCE_POS;
2395}
2396
2397static void
2398iwm_te_v2_to_v1(const struct iwm_time_event_cmd_v2 *cmd_v2,
2399    struct iwm_time_event_cmd_v1 *cmd_v1)
2400{
2401	cmd_v1->id_and_color = cmd_v2->id_and_color;
2402	cmd_v1->action = cmd_v2->action;
2403	cmd_v1->id = cmd_v2->id;
2404	cmd_v1->apply_time = cmd_v2->apply_time;
2405	cmd_v1->max_delay = cmd_v2->max_delay;
2406	cmd_v1->depends_on = cmd_v2->depends_on;
2407	cmd_v1->interval = cmd_v2->interval;
2408	cmd_v1->duration = cmd_v2->duration;
2409	if (cmd_v2->repeat == IWM_TE_V2_REPEAT_ENDLESS)
2410		cmd_v1->repeat = htole32(IWM_TE_V1_REPEAT_ENDLESS);
2411	else
2412		cmd_v1->repeat = htole32(cmd_v2->repeat);
2413	cmd_v1->max_frags = htole32(cmd_v2->max_frags);
2414	cmd_v1->interval_reciprocal = 0; /* unused */
2415
2416	cmd_v1->dep_policy = htole32(iwm_te_v2_get_dep_policy(cmd_v2->policy));
2417	cmd_v1->is_present = htole32(!iwm_te_v2_get_absence(cmd_v2->policy));
2418	cmd_v1->notify = htole32(iwm_te_v2_get_notify(cmd_v2->policy));
2419}
2420
2421static int
2422iwm_send_time_event_cmd(struct iwm_softc *sc,
2423    const struct iwm_time_event_cmd_v2 *cmd)
2424{
2425	struct iwm_time_event_cmd_v1 cmd_v1;
2426
2427	if (sc->sc_capaflags & IWM_UCODE_TLV_FLAGS_TIME_EVENT_API_V2)
2428		return iwm_send_cmd_pdu(sc, IWM_TIME_EVENT_CMD, 0, sizeof(*cmd),
2429		    cmd);
2430
2431	iwm_te_v2_to_v1(cmd, &cmd_v1);
2432	return iwm_send_cmd_pdu(sc, IWM_TIME_EVENT_CMD, 0, sizeof(cmd_v1),
2433	    &cmd_v1);
2434}
2435
2436static void
2437iwm_protect_session(struct iwm_softc *sc, struct iwm_node *in,
2438    uint32_t duration, uint32_t max_delay)
2439{
2440	struct iwm_time_event_cmd_v2 time_cmd;
2441
2442	memset(&time_cmd, 0, sizeof(time_cmd));
2443
2444	time_cmd.action = htole32(IWM_FW_CTXT_ACTION_ADD);
2445	time_cmd.id_and_color =
2446	    htole32(IWM_FW_CMD_ID_AND_COLOR(in->in_id, in->in_color));
2447	time_cmd.id = htole32(IWM_TE_BSS_STA_AGGRESSIVE_ASSOC);
2448
2449	time_cmd.apply_time = htole32(0);
2450
2451	time_cmd.max_frags = IWM_TE_V2_FRAG_NONE;
2452	time_cmd.max_delay = htole32(max_delay);
2453	/* TODO: why do we need to interval = bi if it is not periodic? */
2454	time_cmd.interval = htole32(1);
2455	time_cmd.duration = htole32(duration);
2456	time_cmd.repeat = 1;
2457	time_cmd.policy
2458	    = htole16(IWM_TE_V2_NOTIF_HOST_EVENT_START |
2459	        IWM_TE_V2_NOTIF_HOST_EVENT_END |
2460		IWM_T2_V2_START_IMMEDIATELY);
2461
2462	iwm_send_time_event_cmd(sc, &time_cmd);
2463}
2464
2465/*
2466 * NVM read access and content parsing.  We do not support
2467 * external NVM or writing NVM.
2468 */
2469
2470/* list of NVM sections we are allowed/need to read */
2471static const int iwm_nvm_to_read[] = {
2472	IWM_NVM_SECTION_TYPE_HW,
2473	IWM_NVM_SECTION_TYPE_SW,
2474	IWM_NVM_SECTION_TYPE_REGULATORY,
2475	IWM_NVM_SECTION_TYPE_CALIBRATION,
2476	IWM_NVM_SECTION_TYPE_PRODUCTION,
2477	IWM_NVM_SECTION_TYPE_HW_8000,
2478	IWM_NVM_SECTION_TYPE_MAC_OVERRIDE,
2479	IWM_NVM_SECTION_TYPE_PHY_SKU,
2480};
2481
2482/* Default NVM size to read */
2483#define IWM_NVM_DEFAULT_CHUNK_SIZE	(2*1024)
2484#define IWM_MAX_NVM_SECTION_SIZE_7000	(16 * 512 * sizeof(uint16_t)) /*16 KB*/
2485#define IWM_MAX_NVM_SECTION_SIZE_8000	(32 * 512 * sizeof(uint16_t)) /*32 KB*/
2486
2487#define IWM_NVM_WRITE_OPCODE 1
2488#define IWM_NVM_READ_OPCODE 0
2489
2490static int
2491iwm_nvm_read_chunk(struct iwm_softc *sc, uint16_t section, uint16_t offset,
2492    uint16_t length, uint8_t *data, uint16_t *len)
2493{
2494	offset = 0;
2495	struct iwm_nvm_access_cmd nvm_access_cmd = {
2496		.offset = htole16(offset),
2497		.length = htole16(length),
2498		.type = htole16(section),
2499		.op_code = IWM_NVM_READ_OPCODE,
2500	};
2501	struct iwm_nvm_access_resp *nvm_resp;
2502	struct iwm_rx_packet *pkt;
2503	struct iwm_host_cmd cmd = {
2504		.id = IWM_NVM_ACCESS_CMD,
2505		.flags = (IWM_CMD_WANT_SKB | IWM_CMD_SEND_IN_RFKILL),
2506		.data = { &nvm_access_cmd, },
2507	};
2508	int err, offset_read;
2509	size_t bytes_read;
2510	uint8_t *resp_data;
2511
2512	cmd.len[0] = sizeof(struct iwm_nvm_access_cmd);
2513
2514	err = iwm_send_cmd(sc, &cmd);
2515	if (err) {
2516		DPRINTF(("%s: Could not send NVM_ACCESS command (error=%d)\n",
2517		    DEVNAME(sc), err));
2518		return err;
2519	}
2520
2521	pkt = cmd.resp_pkt;
2522	if (pkt->hdr.flags & IWM_CMD_FAILED_MSK) {
2523		err = EIO;
2524		goto exit;
2525	}
2526
2527	/* Extract NVM response */
2528	nvm_resp = (void *)pkt->data;
2529
2530	err = le16toh(nvm_resp->status);
2531	bytes_read = le16toh(nvm_resp->length);
2532	offset_read = le16toh(nvm_resp->offset);
2533	resp_data = nvm_resp->data;
2534	if (err) {
2535		err = EINVAL;
2536		goto exit;
2537	}
2538
2539	if (offset_read != offset) {
2540		err = EINVAL;
2541		goto exit;
2542	}
2543	if (bytes_read > length) {
2544		err = EINVAL;
2545		goto exit;
2546	}
2547
2548	memcpy(data + offset, resp_data, bytes_read);
2549	*len = bytes_read;
2550
2551 exit:
2552	iwm_free_resp(sc, &cmd);
2553	return err;
2554}
2555
2556/*
2557 * Reads an NVM section completely.
2558 * NICs prior to 7000 family doesn't have a real NVM, but just read
2559 * section 0 which is the EEPROM. Because the EEPROM reading is unlimited
2560 * by uCode, we need to manually check in this case that we don't
2561 * overflow and try to read more than the EEPROM size.
2562 */
2563static int
2564iwm_nvm_read_section(struct iwm_softc *sc, uint16_t section, uint8_t *data,
2565    uint16_t *len, size_t max_len)
2566{
2567	uint16_t chunklen, seglen;
2568	int err;
2569
2570	chunklen = seglen = IWM_NVM_DEFAULT_CHUNK_SIZE;
2571	*len = 0;
2572
2573	/* Read NVM chunks until exhausted (reading less than requested) */
2574	while (seglen == chunklen && *len < max_len) {
2575		err = iwm_nvm_read_chunk(sc, section, *len, chunklen, data,
2576		    &seglen);
2577		if (err) {
2578			DPRINTF(("%s: Cannot read NVM from section %d "
2579			    "offset %d, length %d\n",
2580			    DEVNAME(sc), section, *len, chunklen));
2581			return err;
2582		}
2583		*len += seglen;
2584	}
2585
2586	DPRINTFN(4, ("NVM section %d read completed\n", section));
2587	return 0;
2588}
2589
2590static uint8_t
2591iwm_fw_valid_tx_ant(struct iwm_softc *sc)
2592{
2593	uint8_t tx_ant;
2594
2595	tx_ant = ((sc->sc_fw_phy_config & IWM_FW_PHY_CFG_TX_CHAIN)
2596	    >> IWM_FW_PHY_CFG_TX_CHAIN_POS);
2597
2598	if (sc->sc_nvm.valid_tx_ant)
2599		tx_ant &= sc->sc_nvm.valid_tx_ant;
2600
2601	return tx_ant;
2602}
2603
2604static uint8_t
2605iwm_fw_valid_rx_ant(struct iwm_softc *sc)
2606{
2607	uint8_t rx_ant;
2608
2609	rx_ant = ((sc->sc_fw_phy_config & IWM_FW_PHY_CFG_RX_CHAIN)
2610	    >> IWM_FW_PHY_CFG_RX_CHAIN_POS);
2611
2612	if (sc->sc_nvm.valid_rx_ant)
2613		rx_ant &= sc->sc_nvm.valid_rx_ant;
2614
2615	return rx_ant;
2616}
2617
2618static void
2619iwm_init_channel_map(struct iwm_softc *sc, const uint16_t * const nvm_ch_flags,
2620    const uint8_t *nvm_channels, size_t nchan)
2621{
2622	struct ieee80211com *ic = &sc->sc_ic;
2623	struct iwm_nvm_data *data = &sc->sc_nvm;
2624	int ch_idx;
2625	struct ieee80211_channel *channel;
2626	uint16_t ch_flags;
2627	int is_5ghz;
2628	int flags, hw_value;
2629
2630	for (ch_idx = 0; ch_idx < nchan; ch_idx++) {
2631		ch_flags = le16_to_cpup(nvm_ch_flags + ch_idx);
2632		aprint_debug_dev(sc->sc_dev,
2633		    "Ch. %d: %svalid %cibss %s %cradar %cdfs"
2634		    " %cwide %c40MHz %c80MHz %c160MHz\n",
2635		    nvm_channels[ch_idx],
2636		    ch_flags & IWM_NVM_CHANNEL_VALID ? "" : "in",
2637		    ch_flags & IWM_NVM_CHANNEL_IBSS ? '+' : '-',
2638		    ch_flags & IWM_NVM_CHANNEL_ACTIVE ? "active" : "passive",
2639		    ch_flags & IWM_NVM_CHANNEL_RADAR ? '+' : '-',
2640		    ch_flags & IWM_NVM_CHANNEL_DFS ? '+' : '-',
2641		    ch_flags & IWM_NVM_CHANNEL_WIDE ? '+' : '-',
2642		    ch_flags & IWM_NVM_CHANNEL_40MHZ ? '+' : '-',
2643		    ch_flags & IWM_NVM_CHANNEL_80MHZ ? '+' : '-',
2644		    ch_flags & IWM_NVM_CHANNEL_160MHZ ? '+' : '-');
2645
2646		if (ch_idx >= IWM_NUM_2GHZ_CHANNELS &&
2647		    !data->sku_cap_band_52GHz_enable)
2648			ch_flags &= ~IWM_NVM_CHANNEL_VALID;
2649
2650		if (!(ch_flags & IWM_NVM_CHANNEL_VALID)) {
2651			DPRINTF(("Ch. %d Flags %x [%sGHz] - No traffic\n",
2652			    nvm_channels[ch_idx], ch_flags,
2653			    (ch_idx >= IWM_NUM_2GHZ_CHANNELS) ? "5" : "2.4"));
2654			continue;
2655		}
2656
2657		hw_value = nvm_channels[ch_idx];
2658		channel = &ic->ic_channels[hw_value];
2659
2660		is_5ghz = ch_idx >= IWM_NUM_2GHZ_CHANNELS;
2661		if (!is_5ghz) {
2662			flags = IEEE80211_CHAN_2GHZ;
2663			channel->ic_flags
2664			    = IEEE80211_CHAN_CCK
2665			    | IEEE80211_CHAN_OFDM
2666			    | IEEE80211_CHAN_DYN
2667			    | IEEE80211_CHAN_2GHZ;
2668		} else {
2669			flags = IEEE80211_CHAN_5GHZ;
2670			channel->ic_flags =
2671			    IEEE80211_CHAN_A;
2672		}
2673		channel->ic_freq = ieee80211_ieee2mhz(hw_value, flags);
2674
2675		if (!(ch_flags & IWM_NVM_CHANNEL_ACTIVE))
2676			channel->ic_flags |= IEEE80211_CHAN_PASSIVE;
2677
2678#ifndef IEEE80211_NO_HT
2679		if (data->sku_cap_11n_enable)
2680			channel->ic_flags |= IEEE80211_CHAN_HT;
2681#endif
2682	}
2683}
2684
2685#ifndef IEEE80211_NO_HT
2686static void
2687iwm_setup_ht_rates(struct iwm_softc *sc)
2688{
2689	struct ieee80211com *ic = &sc->sc_ic;
2690
2691	/* TX is supported with the same MCS as RX. */
2692	ic->ic_tx_mcs_set = IEEE80211_TX_MCS_SET_DEFINED;
2693
2694	ic->ic_sup_mcs[0] = 0xff;		/* MCS 0-7 */
2695
2696#ifdef notyet
2697	if (sc->sc_nvm.sku_cap_mimo_disable)
2698		return;
2699
2700	if (iwm_fw_valid_rx_ant(sc) > 1)
2701		ic->ic_sup_mcs[1] = 0xff;	/* MCS 8-15 */
2702	if (iwm_fw_valid_rx_ant(sc) > 2)
2703		ic->ic_sup_mcs[2] = 0xff;	/* MCS 16-23 */
2704#endif
2705}
2706
2707#define IWM_MAX_RX_BA_SESSIONS 16
2708
2709static void
2710iwm_sta_rx_agg(struct iwm_softc *sc, struct ieee80211_node *ni, uint8_t tid,
2711    uint16_t ssn, int start)
2712{
2713	struct ieee80211com *ic = &sc->sc_ic;
2714	struct iwm_add_sta_cmd_v7 cmd;
2715	struct iwm_node *in = (struct iwm_node *)ni;
2716	int err, s;
2717	uint32_t status;
2718
2719	if (start && sc->sc_rx_ba_sessions >= IWM_MAX_RX_BA_SESSIONS) {
2720		ieee80211_addba_req_refuse(ic, ni, tid);
2721		return;
2722	}
2723
2724	memset(&cmd, 0, sizeof(cmd));
2725
2726	cmd.sta_id = IWM_STATION_ID;
2727	cmd.mac_id_n_color
2728	    = htole32(IWM_FW_CMD_ID_AND_COLOR(in->in_id, in->in_color));
2729	cmd.add_modify = IWM_STA_MODE_MODIFY;
2730
2731	if (start) {
2732		cmd.add_immediate_ba_tid = (uint8_t)tid;
2733		cmd.add_immediate_ba_ssn = ssn;
2734	} else {
2735		cmd.remove_immediate_ba_tid = (uint8_t)tid;
2736	}
2737	cmd.modify_mask = start ? IWM_STA_MODIFY_ADD_BA_TID :
2738	    IWM_STA_MODIFY_REMOVE_BA_TID;
2739
2740	status = IWM_ADD_STA_SUCCESS;
2741	err = iwm_send_cmd_pdu_status(sc, IWM_ADD_STA, sizeof(cmd), &cmd,
2742	    &status);
2743
2744	s = splnet();
2745	if (err == 0 && status == IWM_ADD_STA_SUCCESS) {
2746		if (start) {
2747			sc->sc_rx_ba_sessions++;
2748			ieee80211_addba_req_accept(ic, ni, tid);
2749		} else if (sc->sc_rx_ba_sessions > 0)
2750			sc->sc_rx_ba_sessions--;
2751	} else if (start)
2752		ieee80211_addba_req_refuse(ic, ni, tid);
2753	splx(s);
2754}
2755
2756static void
2757iwm_htprot_task(void *arg)
2758{
2759	struct iwm_softc *sc = arg;
2760	struct ieee80211com *ic = &sc->sc_ic;
2761	struct iwm_node *in = (struct iwm_node *)ic->ic_bss;
2762	int err;
2763
2764	/* This call updates HT protection based on in->in_ni.ni_htop1. */
2765	err = iwm_mac_ctxt_cmd(sc, in, IWM_FW_CTXT_ACTION_MODIFY, 1);
2766	if (err)
2767		aprint_error_dev(sc->sc_dev,
2768		    "could not change HT protection: error %d\n", err);
2769}
2770
2771/*
2772 * This function is called by upper layer when HT protection settings in
2773 * beacons have changed.
2774 */
2775static void
2776iwm_update_htprot(struct ieee80211com *ic, struct ieee80211_node *ni)
2777{
2778	struct iwm_softc *sc = ic->ic_softc;
2779
2780	/* assumes that ni == ic->ic_bss */
2781	task_add(systq, &sc->htprot_task);
2782}
2783
2784static void
2785iwm_ba_task(void *arg)
2786{
2787	struct iwm_softc *sc = arg;
2788	struct ieee80211com *ic = &sc->sc_ic;
2789	struct ieee80211_node *ni = ic->ic_bss;
2790
2791	if (sc->ba_start)
2792		iwm_sta_rx_agg(sc, ni, sc->ba_tid, sc->ba_ssn, 1);
2793	else
2794		iwm_sta_rx_agg(sc, ni, sc->ba_tid, 0, 0);
2795}
2796
2797/*
2798 * This function is called by upper layer when an ADDBA request is received
2799 * from another STA and before the ADDBA response is sent.
2800 */
2801static int
2802iwm_ampdu_rx_start(struct ieee80211com *ic, struct ieee80211_node *ni,
2803    uint8_t tid)
2804{
2805	struct ieee80211_rx_ba *ba = &ni->ni_rx_ba[tid];
2806	struct iwm_softc *sc = IC2IFP(ic)->if_softc;
2807
2808	if (sc->sc_rx_ba_sessions >= IWM_MAX_RX_BA_SESSIONS)
2809		return ENOSPC;
2810
2811	sc->ba_start = 1;
2812	sc->ba_tid = tid;
2813	sc->ba_ssn = htole16(ba->ba_winstart);
2814	task_add(systq, &sc->ba_task);
2815
2816	return EBUSY;
2817}
2818
2819/*
2820 * This function is called by upper layer on teardown of an HT-immediate
2821 * Block Ack agreement (eg. upon receipt of a DELBA frame).
2822 */
2823static void
2824iwm_ampdu_rx_stop(struct ieee80211com *ic, struct ieee80211_node *ni,
2825    uint8_t tid)
2826{
2827	struct iwm_softc *sc = IC2IFP(ic)->if_softc;
2828
2829	sc->ba_start = 0;
2830	sc->ba_tid = tid;
2831	task_add(systq, &sc->ba_task);
2832}
2833#endif
2834
2835static void
2836iwm_free_fw_paging(struct iwm_softc *sc)
2837{
2838	int i;
2839
2840	if (sc->fw_paging_db[0].fw_paging_block.vaddr == NULL)
2841		return;
2842
2843	for (i = 0; i < IWM_NUM_OF_FW_PAGING_BLOCKS; i++) {
2844		iwm_dma_contig_free(&sc->fw_paging_db[i].fw_paging_block);
2845	}
2846
2847	memset(sc->fw_paging_db, 0, sizeof(sc->fw_paging_db));
2848}
2849
2850static int
2851iwm_fill_paging_mem(struct iwm_softc *sc, const struct iwm_fw_sects *fws)
2852{
2853	int sec_idx, idx;
2854	uint32_t offset = 0;
2855
2856	/*
2857	 * find where is the paging image start point:
2858	 * if CPU2 exist and it's in paging format, then the image looks like:
2859	 * CPU1 sections (2 or more)
2860	 * CPU1_CPU2_SEPARATOR_SECTION delimiter - separate between CPU1 to CPU2
2861	 * CPU2 sections (not paged)
2862	 * PAGING_SEPARATOR_SECTION delimiter - separate between CPU2
2863	 * non paged to CPU2 paging sec
2864	 * CPU2 paging CSS
2865	 * CPU2 paging image (including instruction and data)
2866	 */
2867	for (sec_idx = 0; sec_idx < IWM_UCODE_SECT_MAX; sec_idx++) {
2868		if (fws->fw_sect[sec_idx].fws_devoff ==
2869		    IWM_PAGING_SEPARATOR_SECTION) {
2870			sec_idx++;
2871			break;
2872		}
2873	}
2874
2875	/*
2876	 * If paging is enabled there should be at least 2 more sections left
2877	 * (one for CSS and one for Paging data)
2878	 */
2879	if (sec_idx >= __arraycount(fws->fw_sect) - 1) {
2880		aprint_verbose_dev(sc->sc_dev,
2881		    "Paging: Missing CSS and/or paging sections\n");
2882		iwm_free_fw_paging(sc);
2883		return EINVAL;
2884	}
2885
2886	/* copy the CSS block to the dram */
2887	DPRINTF(("%s: Paging: load paging CSS to FW, sec = %d\n", DEVNAME(sc),
2888	    sec_idx));
2889
2890	memcpy(sc->fw_paging_db[0].fw_paging_block.vaddr,
2891	    fws->fw_sect[sec_idx].fws_data, sc->fw_paging_db[0].fw_paging_size);
2892
2893	DPRINTF(("%s: Paging: copied %d CSS bytes to first block\n",
2894	    DEVNAME(sc), sc->fw_paging_db[0].fw_paging_size));
2895
2896	sec_idx++;
2897
2898	/*
2899	 * copy the paging blocks to the dram
2900	 * loop index start from 1 since that CSS block already copied to dram
2901	 * and CSS index is 0.
2902	 * loop stop at num_of_paging_blk since that last block is not full.
2903	 */
2904	for (idx = 1; idx < sc->num_of_paging_blk; idx++) {
2905		memcpy(sc->fw_paging_db[idx].fw_paging_block.vaddr,
2906		       (const char *)fws->fw_sect[sec_idx].fws_data + offset,
2907		       sc->fw_paging_db[idx].fw_paging_size);
2908
2909		DPRINTF(("%s: Paging: copied %d paging bytes to block %d\n",
2910		    DEVNAME(sc), sc->fw_paging_db[idx].fw_paging_size, idx));
2911
2912		offset += sc->fw_paging_db[idx].fw_paging_size;
2913	}
2914
2915	/* copy the last paging block */
2916	if (sc->num_of_pages_in_last_blk > 0) {
2917		memcpy(sc->fw_paging_db[idx].fw_paging_block.vaddr,
2918		    (const char *)fws->fw_sect[sec_idx].fws_data + offset,
2919		    IWM_FW_PAGING_SIZE * sc->num_of_pages_in_last_blk);
2920
2921		DPRINTF(("%s: Paging: copied %d pages in the last block %d\n",
2922		    DEVNAME(sc), sc->num_of_pages_in_last_blk, idx));
2923	}
2924
2925	return 0;
2926}
2927
2928static int
2929iwm_alloc_fw_paging_mem(struct iwm_softc *sc, const struct iwm_fw_sects *fws)
2930{
2931	int blk_idx = 0;
2932	int error, num_of_pages;
2933	bus_dmamap_t dmap;
2934
2935	if (sc->fw_paging_db[0].fw_paging_block.vaddr != NULL) {
2936		int i;
2937		/* Device got reset, and we setup firmware paging again */
2938		for (i = 0; i < sc->num_of_paging_blk + 1; i++) {
2939			dmap = sc->fw_paging_db[i].fw_paging_block.map;
2940			bus_dmamap_sync(sc->sc_dmat, dmap, 0, dmap->dm_mapsize,
2941			    BUS_DMASYNC_POSTWRITE | BUS_DMASYNC_POSTREAD);
2942		}
2943		return 0;
2944	}
2945
2946	/* ensure IWM_BLOCK_2_EXP_SIZE is power of 2 of IWM_PAGING_BLOCK_SIZE */
2947	CTASSERT(__BIT(IWM_BLOCK_2_EXP_SIZE) == IWM_PAGING_BLOCK_SIZE);
2948
2949	num_of_pages = fws->paging_mem_size / IWM_FW_PAGING_SIZE;
2950	sc->num_of_paging_blk =
2951	    howmany(num_of_pages, IWM_NUM_OF_PAGE_PER_GROUP);
2952	sc->num_of_pages_in_last_blk = num_of_pages -
2953	    IWM_NUM_OF_PAGE_PER_GROUP * (sc->num_of_paging_blk - 1);
2954
2955	DPRINTF(("%s: Paging: allocating mem for %d paging blocks, "
2956	    "each block holds 8 pages, last block holds %d pages\n",
2957	    DEVNAME(sc), sc->num_of_paging_blk, sc->num_of_pages_in_last_blk));
2958
2959	/* allocate block of 4Kbytes for paging CSS */
2960	error = iwm_dma_contig_alloc(sc->sc_dmat,
2961	    &sc->fw_paging_db[blk_idx].fw_paging_block, IWM_FW_PAGING_SIZE,
2962	    4096);
2963	if (error) {
2964		/* free all the previous pages since we failed */
2965		iwm_free_fw_paging(sc);
2966		return ENOMEM;
2967	}
2968
2969	sc->fw_paging_db[blk_idx].fw_paging_size = IWM_FW_PAGING_SIZE;
2970
2971	DPRINTF(("%s: Paging: allocated 4K(CSS) bytes for firmware paging.\n",
2972	    DEVNAME(sc)));
2973
2974	/*
2975	 * allocate blocks in dram.
2976	 * since that CSS allocated in fw_paging_db[0] loop start from index 1
2977	 */
2978	for (blk_idx = 1; blk_idx < sc->num_of_paging_blk + 1; blk_idx++) {
2979		/* allocate block of IWM_PAGING_BLOCK_SIZE (32K) */
2980		/* XXX Use iwm_dma_contig_alloc for allocating */
2981		error = iwm_dma_contig_alloc(sc->sc_dmat,
2982		    &sc->fw_paging_db[blk_idx].fw_paging_block,
2983		    IWM_PAGING_BLOCK_SIZE, 4096);
2984		if (error) {
2985			/* free all the previous pages since we failed */
2986			iwm_free_fw_paging(sc);
2987			return ENOMEM;
2988		}
2989
2990		sc->fw_paging_db[blk_idx].fw_paging_size =
2991		    IWM_PAGING_BLOCK_SIZE;
2992
2993		DPRINTF(("%s: Paging: allocated 32K bytes for firmware "
2994		    "paging.\n", DEVNAME(sc)));
2995	}
2996
2997	return 0;
2998}
2999
3000static int
3001iwm_save_fw_paging(struct iwm_softc *sc, const struct iwm_fw_sects *fws)
3002{
3003	int err;
3004
3005	err = iwm_alloc_fw_paging_mem(sc, fws);
3006	if (err)
3007		return err;
3008
3009	return iwm_fill_paging_mem(sc, fws);
3010}
3011
3012static bool
3013iwm_has_new_tx_api(struct iwm_softc *sc)
3014{
3015	/* XXX */
3016	return false;
3017}
3018
3019/* send paging cmd to FW in case CPU2 has paging image */
3020static int
3021iwm_send_paging_cmd(struct iwm_softc *sc, const struct iwm_fw_sects *fws)
3022{
3023	struct iwm_fw_paging_cmd fw_paging_cmd = {
3024		.flags = htole32(IWM_PAGING_CMD_IS_SECURED |
3025		                 IWM_PAGING_CMD_IS_ENABLED |
3026		                 (sc->num_of_pages_in_last_blk <<
3027		                  IWM_PAGING_CMD_NUM_OF_PAGES_IN_LAST_GRP_POS)),
3028		.block_size = htole32(IWM_BLOCK_2_EXP_SIZE),
3029		.block_num = htole32(sc->num_of_paging_blk),
3030	};
3031	size_t size = sizeof(fw_paging_cmd);
3032	int blk_idx;
3033	bus_dmamap_t dmap;
3034
3035	if (!iwm_has_new_tx_api(sc))
3036		size -= (sizeof(uint64_t) - sizeof(uint32_t)) *
3037		    IWM_NUM_OF_FW_PAGING_BLOCKS;
3038
3039	/* loop for all paging blocks + CSS block */
3040	for (blk_idx = 0; blk_idx < sc->num_of_paging_blk + 1; blk_idx++) {
3041		bus_addr_t dev_phy_addr =
3042		    sc->fw_paging_db[blk_idx].fw_paging_block.paddr;
3043		if (iwm_has_new_tx_api(sc)) {
3044			fw_paging_cmd.device_phy_addr.addr64[blk_idx] =
3045			    htole64(dev_phy_addr);
3046		} else {
3047			dev_phy_addr = dev_phy_addr >> IWM_PAGE_2_EXP_SIZE;
3048			fw_paging_cmd.device_phy_addr.addr32[blk_idx] =
3049			    htole32(dev_phy_addr);
3050		}
3051		dmap = sc->fw_paging_db[blk_idx].fw_paging_block.map;
3052		bus_dmamap_sync(sc->sc_dmat, dmap, 0, dmap->dm_mapsize,
3053		    BUS_DMASYNC_PREWRITE | BUS_DMASYNC_PREREAD);
3054	}
3055
3056	return iwm_send_cmd_pdu(sc,
3057	    iwm_cmd_id(IWM_FW_PAGING_BLOCK_CMD, IWM_ALWAYS_LONG_GROUP, 0),
3058	    0, size, &fw_paging_cmd);
3059}
3060
3061static void
3062iwm_set_hw_address_8000(struct iwm_softc *sc, struct iwm_nvm_data *data,
3063    const uint16_t *mac_override, const uint16_t *nvm_hw)
3064{
3065	static const uint8_t reserved_mac[ETHER_ADDR_LEN] = {
3066		0x02, 0xcc, 0xaa, 0xff, 0xee, 0x00
3067	};
3068	static const u_int8_t etheranyaddr[ETHER_ADDR_LEN] = {
3069		0x00, 0x00, 0x00, 0x00, 0x00, 0x00
3070	};
3071	const uint8_t *hw_addr;
3072
3073	if (mac_override) {
3074		hw_addr = (const uint8_t *)(mac_override +
3075		    IWM_MAC_ADDRESS_OVERRIDE_8000);
3076
3077		/*
3078		 * Store the MAC address from MAO section.
3079		 * No byte swapping is required in MAO section
3080		 */
3081		memcpy(data->hw_addr, hw_addr, ETHER_ADDR_LEN);
3082
3083		/*
3084		 * Force the use of the OTP MAC address in case of reserved MAC
3085		 * address in the NVM, or if address is given but invalid.
3086		 */
3087		if (memcmp(reserved_mac, hw_addr, ETHER_ADDR_LEN) != 0 &&
3088		    (memcmp(etherbroadcastaddr, data->hw_addr,
3089		    sizeof(etherbroadcastaddr)) != 0) &&
3090		    (memcmp(etheranyaddr, data->hw_addr,
3091		    sizeof(etheranyaddr)) != 0) &&
3092		    !ETHER_IS_MULTICAST(data->hw_addr))
3093			return;
3094	}
3095
3096	if (nvm_hw) {
3097		/* Read the mac address from WFMP registers. */
3098		uint32_t mac_addr0 =
3099		    htole32(iwm_read_prph(sc, IWM_WFMP_MAC_ADDR_0));
3100		uint32_t mac_addr1 =
3101		    htole32(iwm_read_prph(sc, IWM_WFMP_MAC_ADDR_1));
3102
3103		hw_addr = (const uint8_t *)&mac_addr0;
3104		data->hw_addr[0] = hw_addr[3];
3105		data->hw_addr[1] = hw_addr[2];
3106		data->hw_addr[2] = hw_addr[1];
3107		data->hw_addr[3] = hw_addr[0];
3108
3109		hw_addr = (const uint8_t *)&mac_addr1;
3110		data->hw_addr[4] = hw_addr[1];
3111		data->hw_addr[5] = hw_addr[0];
3112
3113		return;
3114	}
3115
3116	aprint_error_dev(sc->sc_dev, "mac address not found\n");
3117	memset(data->hw_addr, 0, sizeof(data->hw_addr));
3118}
3119
3120static int
3121iwm_parse_nvm_data(struct iwm_softc *sc, const uint16_t *nvm_hw,
3122    const uint16_t *nvm_sw, const uint16_t *nvm_calib,
3123    const uint16_t *mac_override, const uint16_t *phy_sku,
3124    const uint16_t *regulatory)
3125{
3126	struct iwm_nvm_data *data = &sc->sc_nvm;
3127	uint8_t hw_addr[ETHER_ADDR_LEN];
3128	uint32_t sku;
3129
3130	if (sc->sc_device_family == IWM_DEVICE_FAMILY_7000) {
3131		uint16_t radio_cfg = le16_to_cpup(nvm_sw + IWM_RADIO_CFG);
3132		data->radio_cfg_type = IWM_NVM_RF_CFG_TYPE_MSK(radio_cfg);
3133		data->radio_cfg_step = IWM_NVM_RF_CFG_STEP_MSK(radio_cfg);
3134		data->radio_cfg_dash = IWM_NVM_RF_CFG_DASH_MSK(radio_cfg);
3135		data->radio_cfg_pnum = IWM_NVM_RF_CFG_PNUM_MSK(radio_cfg);
3136
3137		data->nvm_version = le16_to_cpup(nvm_sw + IWM_NVM_VERSION);
3138		sku = le16_to_cpup(nvm_sw + IWM_SKU);
3139	} else {
3140		uint32_t radio_cfg = le32_to_cpup(phy_sku + IWM_RADIO_CFG_8000);
3141		data->radio_cfg_type = IWM_NVM_RF_CFG_TYPE_MSK_8000(radio_cfg);
3142		data->radio_cfg_step = IWM_NVM_RF_CFG_STEP_MSK_8000(radio_cfg);
3143		data->radio_cfg_dash = IWM_NVM_RF_CFG_DASH_MSK_8000(radio_cfg);
3144		data->radio_cfg_pnum = IWM_NVM_RF_CFG_PNUM_MSK_8000(radio_cfg);
3145		data->valid_tx_ant = IWM_NVM_RF_CFG_TX_ANT_MSK_8000(radio_cfg);
3146		data->valid_rx_ant = IWM_NVM_RF_CFG_RX_ANT_MSK_8000(radio_cfg);
3147
3148		data->nvm_version = le32_to_cpup(nvm_sw + IWM_NVM_VERSION_8000);
3149		sku = le32_to_cpup(phy_sku + IWM_SKU_8000);
3150	}
3151
3152	data->sku_cap_band_24GHz_enable = sku & IWM_NVM_SKU_CAP_BAND_24GHZ;
3153	data->sku_cap_band_52GHz_enable = sku & IWM_NVM_SKU_CAP_BAND_52GHZ;
3154	data->sku_cap_11n_enable = sku & IWM_NVM_SKU_CAP_11N_ENABLE;
3155	data->sku_cap_mimo_disable = sku & IWM_NVM_SKU_CAP_MIMO_DISABLE;
3156
3157	data->n_hw_addrs = le16_to_cpup(nvm_sw + IWM_N_HW_ADDRS);
3158
3159	if (sc->sc_device_family == IWM_DEVICE_FAMILY_7000) {
3160		memcpy(hw_addr, nvm_hw + IWM_HW_ADDR, ETHER_ADDR_LEN);
3161		data->hw_addr[0] = hw_addr[1];
3162		data->hw_addr[1] = hw_addr[0];
3163		data->hw_addr[2] = hw_addr[3];
3164		data->hw_addr[3] = hw_addr[2];
3165		data->hw_addr[4] = hw_addr[5];
3166		data->hw_addr[5] = hw_addr[4];
3167	} else
3168		iwm_set_hw_address_8000(sc, data, mac_override, nvm_hw);
3169
3170	if (sc->sc_device_family == IWM_DEVICE_FAMILY_8000) {
3171		uint16_t lar_offset, lar_config;
3172		lar_offset = data->nvm_version < 0xE39 ?
3173		    IWM_NVM_LAR_OFFSET_8000_OLD : IWM_NVM_LAR_OFFSET_8000;
3174		lar_config = le16_to_cpup(regulatory + lar_offset);
3175                data->lar_enabled = !!(lar_config & IWM_NVM_LAR_ENABLED_8000);
3176	}
3177
3178	if (sc->sc_device_family == IWM_DEVICE_FAMILY_7000)
3179		iwm_init_channel_map(sc, &nvm_sw[IWM_NVM_CHANNELS],
3180		    iwm_nvm_channels, __arraycount(iwm_nvm_channels));
3181	else
3182		iwm_init_channel_map(sc, &regulatory[IWM_NVM_CHANNELS_8000],
3183		    iwm_nvm_channels_8000, __arraycount(iwm_nvm_channels_8000));
3184
3185	data->calib_version = 255;   /* TODO:
3186					this value will prevent some checks from
3187					failing, we need to check if this
3188					field is still needed, and if it does,
3189					where is it in the NVM */
3190
3191	return 0;
3192}
3193
3194static int
3195iwm_parse_nvm_sections(struct iwm_softc *sc, struct iwm_nvm_section *sections)
3196{
3197	const uint16_t *hw, *sw, *calib, *mac_override = NULL, *phy_sku = NULL;
3198	const uint16_t *regulatory = NULL;
3199
3200	/* Checking for required sections */
3201	if (sc->sc_device_family == IWM_DEVICE_FAMILY_7000) {
3202		if (!sections[IWM_NVM_SECTION_TYPE_SW].data ||
3203		    !sections[IWM_NVM_SECTION_TYPE_HW].data) {
3204			return ENOENT;
3205		}
3206
3207		hw = (const uint16_t *) sections[IWM_NVM_SECTION_TYPE_HW].data;
3208	} else if (sc->sc_device_family == IWM_DEVICE_FAMILY_8000) {
3209		/* SW and REGULATORY sections are mandatory */
3210		if (!sections[IWM_NVM_SECTION_TYPE_SW].data ||
3211		    !sections[IWM_NVM_SECTION_TYPE_REGULATORY].data) {
3212			return ENOENT;
3213		}
3214		/* MAC_OVERRIDE or at least HW section must exist */
3215		if (!sections[IWM_NVM_SECTION_TYPE_HW_8000].data &&
3216		    !sections[IWM_NVM_SECTION_TYPE_MAC_OVERRIDE].data) {
3217			return ENOENT;
3218		}
3219
3220		/* PHY_SKU section is mandatory in B0 */
3221		if (!sections[IWM_NVM_SECTION_TYPE_PHY_SKU].data) {
3222			return ENOENT;
3223		}
3224
3225		regulatory = (const uint16_t *)
3226		    sections[IWM_NVM_SECTION_TYPE_REGULATORY].data;
3227		hw = (const uint16_t *)
3228		    sections[IWM_NVM_SECTION_TYPE_HW_8000].data;
3229		mac_override =
3230			(const uint16_t *)
3231			sections[IWM_NVM_SECTION_TYPE_MAC_OVERRIDE].data;
3232		phy_sku = (const uint16_t *)
3233		    sections[IWM_NVM_SECTION_TYPE_PHY_SKU].data;
3234	} else {
3235		panic("unknown device family %d\n", sc->sc_device_family);
3236	}
3237
3238	sw = (const uint16_t *)sections[IWM_NVM_SECTION_TYPE_SW].data;
3239	calib = (const uint16_t *)
3240	    sections[IWM_NVM_SECTION_TYPE_CALIBRATION].data;
3241
3242	return iwm_parse_nvm_data(sc, hw, sw, calib, mac_override,
3243	    phy_sku, regulatory);
3244}
3245
3246static int
3247iwm_nvm_init(struct iwm_softc *sc)
3248{
3249	struct iwm_nvm_section nvm_sections[IWM_NVM_NUM_OF_SECTIONS];
3250	int i, section, err;
3251	uint16_t len;
3252	uint8_t *buf;
3253	const size_t bufsz = (sc->sc_device_family == IWM_DEVICE_FAMILY_8000) ?
3254	    IWM_MAX_NVM_SECTION_SIZE_8000 : IWM_MAX_NVM_SECTION_SIZE_7000;
3255
3256	/* Read From FW NVM */
3257	DPRINTF(("Read NVM\n"));
3258
3259	memset(nvm_sections, 0, sizeof(nvm_sections));
3260
3261	buf = kmem_alloc(bufsz, KM_SLEEP);
3262
3263	for (i = 0; i < __arraycount(iwm_nvm_to_read); i++) {
3264		section = iwm_nvm_to_read[i];
3265		KASSERT(section <= IWM_NVM_NUM_OF_SECTIONS);
3266
3267		err = iwm_nvm_read_section(sc, section, buf, &len, bufsz);
3268		if (err) {
3269			err = 0;
3270			continue;
3271		}
3272		nvm_sections[section].data = kmem_alloc(len, KM_SLEEP);
3273		memcpy(nvm_sections[section].data, buf, len);
3274		nvm_sections[section].length = len;
3275	}
3276	kmem_free(buf, bufsz);
3277	if (err == 0)
3278		err = iwm_parse_nvm_sections(sc, nvm_sections);
3279
3280	for (i = 0; i < IWM_NVM_NUM_OF_SECTIONS; i++) {
3281		if (nvm_sections[i].data != NULL)
3282			kmem_free(nvm_sections[i].data, nvm_sections[i].length);
3283	}
3284
3285	return err;
3286}
3287
3288static int
3289iwm_firmware_load_sect(struct iwm_softc *sc, uint32_t dst_addr,
3290    const uint8_t *section, uint32_t byte_cnt)
3291{
3292	int err = EINVAL;
3293	uint32_t chunk_sz, offset;
3294
3295	chunk_sz = MIN(IWM_FH_MEM_TB_MAX_LENGTH, byte_cnt);
3296
3297	for (offset = 0; offset < byte_cnt; offset += chunk_sz) {
3298		uint32_t addr, len;
3299		const uint8_t *data;
3300		bool is_extended = false;
3301
3302		addr = dst_addr + offset;
3303		len = MIN(chunk_sz, byte_cnt - offset);
3304		data = section + offset;
3305
3306		if (addr >= IWM_FW_MEM_EXTENDED_START &&
3307		    addr <= IWM_FW_MEM_EXTENDED_END)
3308			is_extended = true;
3309
3310		if (is_extended)
3311			iwm_set_bits_prph(sc, IWM_LMPM_CHICK,
3312			    IWM_LMPM_CHICK_EXTENDED_ADDR_SPACE);
3313
3314		err = iwm_firmware_load_chunk(sc, addr, data, len);
3315
3316		if (is_extended)
3317			iwm_clear_bits_prph(sc, IWM_LMPM_CHICK,
3318			    IWM_LMPM_CHICK_EXTENDED_ADDR_SPACE);
3319
3320		if (err)
3321			break;
3322	}
3323
3324	return err;
3325}
3326
3327static int
3328iwm_firmware_load_chunk(struct iwm_softc *sc, uint32_t dst_addr,
3329    const uint8_t *section, uint32_t byte_cnt)
3330{
3331	struct iwm_dma_info *dma = &sc->fw_dma;
3332	int err;
3333
3334	/* Copy firmware chunk into pre-allocated DMA-safe memory. */
3335	memcpy(dma->vaddr, section, byte_cnt);
3336	bus_dmamap_sync(sc->sc_dmat, dma->map, 0, byte_cnt,
3337	    BUS_DMASYNC_PREWRITE);
3338
3339	sc->sc_fw_chunk_done = 0;
3340
3341	if (!iwm_nic_lock(sc))
3342		return EBUSY;
3343
3344	IWM_WRITE(sc, IWM_FH_TCSR_CHNL_TX_CONFIG_REG(IWM_FH_SRVC_CHNL),
3345	    IWM_FH_TCSR_TX_CONFIG_REG_VAL_DMA_CHNL_PAUSE);
3346	IWM_WRITE(sc, IWM_FH_SRVC_CHNL_SRAM_ADDR_REG(IWM_FH_SRVC_CHNL),
3347	    dst_addr);
3348	IWM_WRITE(sc, IWM_FH_TFDIB_CTRL0_REG(IWM_FH_SRVC_CHNL),
3349	    dma->paddr & IWM_FH_MEM_TFDIB_DRAM_ADDR_LSB_MSK);
3350	IWM_WRITE(sc, IWM_FH_TFDIB_CTRL1_REG(IWM_FH_SRVC_CHNL),
3351	    (iwm_get_dma_hi_addr(dma->paddr)
3352	      << IWM_FH_MEM_TFDIB_REG1_ADDR_BITSHIFT) | byte_cnt);
3353	IWM_WRITE(sc, IWM_FH_TCSR_CHNL_TX_BUF_STS_REG(IWM_FH_SRVC_CHNL),
3354	    1 << IWM_FH_TCSR_CHNL_TX_BUF_STS_REG_POS_TB_NUM |
3355	    1 << IWM_FH_TCSR_CHNL_TX_BUF_STS_REG_POS_TB_IDX |
3356	    IWM_FH_TCSR_CHNL_TX_BUF_STS_REG_VAL_TFDB_VALID);
3357	IWM_WRITE(sc, IWM_FH_TCSR_CHNL_TX_CONFIG_REG(IWM_FH_SRVC_CHNL),
3358	    IWM_FH_TCSR_TX_CONFIG_REG_VAL_DMA_CHNL_ENABLE    |
3359	    IWM_FH_TCSR_TX_CONFIG_REG_VAL_DMA_CREDIT_DISABLE |
3360	    IWM_FH_TCSR_TX_CONFIG_REG_VAL_CIRQ_HOST_ENDTFD);
3361
3362	iwm_nic_unlock(sc);
3363
3364	/* Wait for this segment to load. */
3365	err = 0;
3366	while (!sc->sc_fw_chunk_done) {
3367		err = tsleep(&sc->sc_fw, 0, "iwmfw", mstohz(5000));
3368		if (err)
3369			break;
3370	}
3371	if (!sc->sc_fw_chunk_done) {
3372		DPRINTF(("%s: fw chunk addr 0x%x len %d failed to load\n",
3373		    DEVNAME(sc), dst_addr, byte_cnt));
3374	}
3375
3376	return err;
3377}
3378
3379static int
3380iwm_load_cpu_sections_7000(struct iwm_softc *sc, struct iwm_fw_sects *fws,
3381    int cpu, int *first_ucode_section)
3382{
3383	int i, err = 0;
3384	uint32_t last_read_idx = 0;
3385	void *data;
3386	uint32_t dlen;
3387	uint32_t offset;
3388
3389	if (cpu == 1) {
3390		*first_ucode_section = 0;
3391	} else {
3392		(*first_ucode_section)++;
3393	}
3394
3395	for (i = *first_ucode_section; i < IWM_UCODE_SECT_MAX; i++) {
3396		last_read_idx = i;
3397		data = fws->fw_sect[i].fws_data;
3398		dlen = fws->fw_sect[i].fws_len;
3399		offset = fws->fw_sect[i].fws_devoff;
3400
3401		/*
3402		 * CPU1_CPU2_SEPARATOR_SECTION delimiter - separate between
3403		 * CPU1 to CPU2.
3404		 * PAGING_SEPARATOR_SECTION delimiter - separate between
3405		 * CPU2 non paged to CPU2 paging sec.
3406		 */
3407		if (!data || offset == IWM_CPU1_CPU2_SEPARATOR_SECTION ||
3408		    offset == IWM_PAGING_SEPARATOR_SECTION)
3409			break;
3410
3411		if (dlen > sc->sc_fwdmasegsz) {
3412			err = EFBIG;
3413		} else
3414			err = iwm_firmware_load_sect(sc, offset, data, dlen);
3415		if (err) {
3416			DPRINTF(("%s: could not load firmware chunk %d "
3417			    "(error %d)\n", DEVNAME(sc), i, err));
3418			return err;
3419		}
3420	}
3421
3422	*first_ucode_section = last_read_idx;
3423
3424	return 0;
3425}
3426
3427static int
3428iwm_load_firmware_7000(struct iwm_softc *sc, enum iwm_ucode_type ucode_type)
3429{
3430	struct iwm_fw_sects *fws;
3431	int err = 0;
3432	int first_ucode_section;
3433
3434	fws = &sc->sc_fw.fw_sects[ucode_type];
3435
3436	DPRINTF(("%s: working with %s CPU\n", DEVNAME(sc),
3437	    fws->is_dual_cpus ? "dual" : "single"));
3438
3439	/* load to FW the binary Secured sections of CPU1 */
3440	err = iwm_load_cpu_sections_7000(sc, fws, 1, &first_ucode_section);
3441	if (err)
3442		return err;
3443
3444	if (fws->is_dual_cpus) {
3445		/* set CPU2 header address */
3446		if (iwm_nic_lock(sc)) {
3447			iwm_write_prph(sc,
3448			    IWM_LMPM_SECURE_UCODE_LOAD_CPU2_HDR_ADDR,
3449			    IWM_LMPM_SECURE_CPU2_HDR_MEM_SPACE);
3450			iwm_nic_unlock(sc);
3451		}
3452
3453		/* load to FW the binary sections of CPU2 */
3454		err = iwm_load_cpu_sections_7000(sc, fws, 2,
3455		    &first_ucode_section);
3456		if (err)
3457			return err;
3458	}
3459
3460	/* release CPU reset */
3461	IWM_WRITE(sc, IWM_CSR_RESET, 0);
3462
3463	return 0;
3464}
3465
3466static int
3467iwm_load_cpu_sections_8000(struct iwm_softc *sc, struct iwm_fw_sects *fws,
3468    int cpu, int *first_ucode_section)
3469{
3470	int shift_param;
3471	int i, err = 0, sec_num = 0x1;
3472	uint32_t val, last_read_idx = 0;
3473	void *data;
3474	uint32_t dlen;
3475	uint32_t offset;
3476
3477	if (cpu == 1) {
3478		shift_param = 0;
3479		*first_ucode_section = 0;
3480	} else {
3481		shift_param = 16;
3482		(*first_ucode_section)++;
3483	}
3484
3485	for (i = *first_ucode_section; i < IWM_UCODE_SECT_MAX; i++) {
3486		last_read_idx = i;
3487		data = fws->fw_sect[i].fws_data;
3488		dlen = fws->fw_sect[i].fws_len;
3489		offset = fws->fw_sect[i].fws_devoff;
3490
3491		/*
3492		 * CPU1_CPU2_SEPARATOR_SECTION delimiter - separate between
3493		 * CPU1 to CPU2.
3494		 * PAGING_SEPARATOR_SECTION delimiter - separate between
3495		 * CPU2 non paged to CPU2 paging sec.
3496		 */
3497		if (!data || offset == IWM_CPU1_CPU2_SEPARATOR_SECTION ||
3498		    offset == IWM_PAGING_SEPARATOR_SECTION)
3499			break;
3500
3501		if (dlen > sc->sc_fwdmasegsz) {
3502			err = EFBIG;
3503		} else
3504			err = iwm_firmware_load_sect(sc, offset, data, dlen);
3505		if (err) {
3506			DPRINTF(("%s: could not load firmware chunk %d "
3507			    "(error %d)\n", DEVNAME(sc), i, err));
3508			return err;
3509		}
3510
3511		/* Notify the ucode of the loaded section number and status */
3512		if (iwm_nic_lock(sc)) {
3513			val = IWM_READ(sc, IWM_FH_UCODE_LOAD_STATUS);
3514			val = val | (sec_num << shift_param);
3515			IWM_WRITE(sc, IWM_FH_UCODE_LOAD_STATUS, val);
3516			sec_num = (sec_num << 1) | 0x1;
3517			iwm_nic_unlock(sc);
3518
3519			/*
3520			 * The firmware won't load correctly without this delay.
3521			 */
3522			DELAY(8000);
3523		}
3524	}
3525
3526	*first_ucode_section = last_read_idx;
3527
3528	if (iwm_nic_lock(sc)) {
3529		if (cpu == 1)
3530			IWM_WRITE(sc, IWM_FH_UCODE_LOAD_STATUS, 0xFFFF);
3531		else
3532			IWM_WRITE(sc, IWM_FH_UCODE_LOAD_STATUS, 0xFFFFFFFF);
3533		iwm_nic_unlock(sc);
3534	}
3535
3536	return 0;
3537}
3538
3539static int
3540iwm_load_firmware_8000(struct iwm_softc *sc, enum iwm_ucode_type ucode_type)
3541{
3542	struct iwm_fw_sects *fws;
3543	int err = 0;
3544	int first_ucode_section;
3545
3546	fws = &sc->sc_fw.fw_sects[ucode_type];
3547
3548	/* configure the ucode to be ready to get the secured image */
3549	/* release CPU reset */
3550	if (iwm_nic_lock(sc)) {
3551		iwm_write_prph(sc, IWM_RELEASE_CPU_RESET,
3552		    IWM_RELEASE_CPU_RESET_BIT);
3553		iwm_nic_unlock(sc);
3554	}
3555
3556	/* load to FW the binary Secured sections of CPU1 */
3557	err = iwm_load_cpu_sections_8000(sc, fws, 1, &first_ucode_section);
3558	if (err)
3559		return err;
3560
3561	/* load to FW the binary sections of CPU2 */
3562	return iwm_load_cpu_sections_8000(sc, fws, 2, &first_ucode_section);
3563}
3564
3565static int
3566iwm_load_firmware(struct iwm_softc *sc, enum iwm_ucode_type ucode_type)
3567{
3568	int err, w;
3569
3570	sc->sc_uc.uc_intr = 0;
3571
3572	if (sc->sc_device_family == IWM_DEVICE_FAMILY_8000)
3573		err = iwm_load_firmware_8000(sc, ucode_type);
3574	else
3575		err = iwm_load_firmware_7000(sc, ucode_type);
3576	if (err)
3577		return err;
3578
3579	/* wait for the firmware to load */
3580	for (w = 0; !sc->sc_uc.uc_intr && w < 10; w++)
3581		err = tsleep(&sc->sc_uc, 0, "iwmuc", mstohz(100));
3582	if (err || !sc->sc_uc.uc_ok) {
3583		aprint_error_dev(sc->sc_dev,
3584		    "could not load firmware (error %d, ok %d)\n",
3585		    err, sc->sc_uc.uc_ok);
3586		if (sc->sc_device_family == IWM_DEVICE_FAMILY_8000) {
3587			aprint_error_dev(sc->sc_dev, "cpu1 status: 0x%x\n",
3588			    iwm_read_prph(sc, IWM_SB_CPU_1_STATUS));
3589			aprint_error_dev(sc->sc_dev, "cpu2 status: 0x%x\n",
3590			    iwm_read_prph(sc, IWM_SB_CPU_2_STATUS));
3591		}
3592	}
3593
3594	return err;
3595}
3596
3597static int
3598iwm_start_fw(struct iwm_softc *sc, enum iwm_ucode_type ucode_type)
3599{
3600	int err;
3601
3602	IWM_WRITE(sc, IWM_CSR_INT, ~0);
3603
3604	err = iwm_nic_init(sc);
3605	if (err) {
3606		aprint_error_dev(sc->sc_dev, "Unable to init nic\n");
3607		return err;
3608	}
3609
3610	/* make sure rfkill handshake bits are cleared */
3611	IWM_WRITE(sc, IWM_CSR_UCODE_DRV_GP1_CLR, IWM_CSR_UCODE_SW_BIT_RFKILL);
3612	IWM_WRITE(sc, IWM_CSR_UCODE_DRV_GP1_CLR,
3613	    IWM_CSR_UCODE_DRV_GP1_BIT_CMD_BLOCKED);
3614
3615	/* clear (again), then enable host interrupts */
3616	IWM_WRITE(sc, IWM_CSR_INT, ~0);
3617	iwm_enable_interrupts(sc);
3618
3619	/* really make sure rfkill handshake bits are cleared */
3620	/* maybe we should write a few times more?  just to make sure */
3621	IWM_WRITE(sc, IWM_CSR_UCODE_DRV_GP1_CLR, IWM_CSR_UCODE_SW_BIT_RFKILL);
3622	IWM_WRITE(sc, IWM_CSR_UCODE_DRV_GP1_CLR, IWM_CSR_UCODE_SW_BIT_RFKILL);
3623
3624	return iwm_load_firmware(sc, ucode_type);
3625}
3626
3627static int
3628iwm_send_tx_ant_cfg(struct iwm_softc *sc, uint8_t valid_tx_ant)
3629{
3630	struct iwm_tx_ant_cfg_cmd tx_ant_cmd = {
3631		.valid = htole32(valid_tx_ant),
3632	};
3633
3634	return iwm_send_cmd_pdu(sc, IWM_TX_ANT_CONFIGURATION_CMD, 0,
3635	    sizeof(tx_ant_cmd), &tx_ant_cmd);
3636}
3637
3638static int
3639iwm_send_phy_cfg_cmd(struct iwm_softc *sc)
3640{
3641	struct iwm_phy_cfg_cmd phy_cfg_cmd;
3642	enum iwm_ucode_type ucode_type = sc->sc_uc_current;
3643
3644	phy_cfg_cmd.phy_cfg = htole32(sc->sc_fw_phy_config);
3645	phy_cfg_cmd.calib_control.event_trigger =
3646	    sc->sc_default_calib[ucode_type].event_trigger;
3647	phy_cfg_cmd.calib_control.flow_trigger =
3648	    sc->sc_default_calib[ucode_type].flow_trigger;
3649
3650	DPRINTFN(10, ("Sending Phy CFG command: 0x%x\n", phy_cfg_cmd.phy_cfg));
3651	return iwm_send_cmd_pdu(sc, IWM_PHY_CONFIGURATION_CMD, 0,
3652	    sizeof(phy_cfg_cmd), &phy_cfg_cmd);
3653}
3654
3655static int
3656iwm_load_ucode_wait_alive(struct iwm_softc *sc, enum iwm_ucode_type ucode_type)
3657{
3658	struct iwm_fw_sects *fws;
3659	enum iwm_ucode_type old_type = sc->sc_uc_current;
3660	int err;
3661
3662	err = iwm_read_firmware(sc, ucode_type);
3663	if (err)
3664		return err;
3665
3666	sc->sc_uc_current = ucode_type;
3667	err = iwm_start_fw(sc, ucode_type);
3668	if (err) {
3669		sc->sc_uc_current = old_type;
3670		return err;
3671	}
3672
3673	err = iwm_post_alive(sc);
3674	if (err)
3675		return err;
3676
3677	fws = &sc->sc_fw.fw_sects[ucode_type];
3678	if (fws->paging_mem_size) {
3679		err = iwm_save_fw_paging(sc, fws);
3680		if (err)
3681			return err;
3682
3683		err = iwm_send_paging_cmd(sc, fws);
3684		if (err) {
3685			iwm_free_fw_paging(sc);
3686			return err;
3687		}
3688	}
3689
3690	return 0;
3691}
3692
3693static int
3694iwm_run_init_mvm_ucode(struct iwm_softc *sc, int justnvm)
3695{
3696	int err;
3697
3698	if ((sc->sc_flags & IWM_FLAG_RFKILL) && !justnvm) {
3699		aprint_error_dev(sc->sc_dev,
3700		    "radio is disabled by hardware switch\n");
3701		return EPERM;
3702	}
3703
3704	sc->sc_init_complete = 0;
3705	err = iwm_load_ucode_wait_alive(sc, IWM_UCODE_TYPE_INIT);
3706	if (err) {
3707		DPRINTF(("%s: failed to load init firmware\n", DEVNAME(sc)));
3708		return err;
3709	}
3710
3711	if (justnvm) {
3712		err = iwm_nvm_init(sc);
3713		if (err) {
3714			aprint_error_dev(sc->sc_dev, "failed to read nvm\n");
3715			return err;
3716		}
3717
3718		memcpy(&sc->sc_ic.ic_myaddr, &sc->sc_nvm.hw_addr,
3719		    ETHER_ADDR_LEN);
3720		return 0;
3721	}
3722
3723	err = iwm_send_bt_init_conf(sc);
3724	if (err)
3725		return err;
3726
3727	err = iwm_sf_config(sc, IWM_SF_INIT_OFF);
3728	if (err)
3729		return err;
3730
3731	err = iwm_send_tx_ant_cfg(sc, iwm_fw_valid_tx_ant(sc));
3732	if (err)
3733		return err;
3734
3735	/*
3736	 * Send phy configurations command to init uCode
3737	 * to start the 16.0 uCode init image internal calibrations.
3738	 */
3739	err = iwm_send_phy_cfg_cmd(sc);
3740	if (err)
3741		return err;
3742
3743	/*
3744	 * Nothing to do but wait for the init complete notification
3745	 * from the firmware
3746	 */
3747	while (!sc->sc_init_complete) {
3748		err = tsleep(&sc->sc_init_complete, 0, "iwminit", mstohz(2000));
3749		if (err)
3750			break;
3751	}
3752
3753	return err;
3754}
3755
3756static int
3757iwm_rx_addbuf(struct iwm_softc *sc, int size, int idx)
3758{
3759	struct iwm_rx_ring *ring = &sc->rxq;
3760	struct iwm_rx_data *data = &ring->data[idx];
3761	struct mbuf *m;
3762	int err;
3763	int fatal = 0;
3764
3765	m = m_gethdr(M_DONTWAIT, MT_DATA);
3766	if (m == NULL)
3767		return ENOBUFS;
3768
3769	if (size <= MCLBYTES) {
3770		MCLGET(m, M_DONTWAIT);
3771	} else {
3772		MEXTMALLOC(m, size, M_DONTWAIT);
3773	}
3774	if ((m->m_flags & M_EXT) == 0) {
3775		m_freem(m);
3776		return ENOBUFS;
3777	}
3778
3779	if (data->m != NULL) {
3780		bus_dmamap_unload(sc->sc_dmat, data->map);
3781		fatal = 1;
3782	}
3783
3784	m->m_len = m->m_pkthdr.len = size;
3785	err = bus_dmamap_load_mbuf(sc->sc_dmat, data->map, m,
3786	    BUS_DMA_READ|BUS_DMA_NOWAIT);
3787	if (err) {
3788		/* XXX */
3789		if (fatal)
3790			panic("iwm: could not load RX mbuf");
3791		m_freem(m);
3792		return err;
3793	}
3794	data->m = m;
3795	bus_dmamap_sync(sc->sc_dmat, data->map, 0, size, BUS_DMASYNC_PREREAD);
3796
3797	/* Update RX descriptor. */
3798	ring->desc[idx] = htole32(data->map->dm_segs[0].ds_addr >> 8);
3799	bus_dmamap_sync(sc->sc_dmat, ring->desc_dma.map,
3800	    idx * sizeof(uint32_t), sizeof(uint32_t), BUS_DMASYNC_PREWRITE);
3801
3802	return 0;
3803}
3804
3805#define IWM_RSSI_OFFSET 50
3806static int
3807iwm_calc_rssi(struct iwm_softc *sc, struct iwm_rx_phy_info *phy_info)
3808{
3809	int rssi_a, rssi_b, rssi_a_dbm, rssi_b_dbm, max_rssi_dbm;
3810	uint32_t agc_a, agc_b;
3811	uint32_t val;
3812
3813	val = le32toh(phy_info->non_cfg_phy[IWM_RX_INFO_AGC_IDX]);
3814	agc_a = (val & IWM_OFDM_AGC_A_MSK) >> IWM_OFDM_AGC_A_POS;
3815	agc_b = (val & IWM_OFDM_AGC_B_MSK) >> IWM_OFDM_AGC_B_POS;
3816
3817	val = le32toh(phy_info->non_cfg_phy[IWM_RX_INFO_RSSI_AB_IDX]);
3818	rssi_a = (val & IWM_OFDM_RSSI_INBAND_A_MSK) >> IWM_OFDM_RSSI_A_POS;
3819	rssi_b = (val & IWM_OFDM_RSSI_INBAND_B_MSK) >> IWM_OFDM_RSSI_B_POS;
3820
3821	/*
3822	 * dBm = rssi dB - agc dB - constant.
3823	 * Higher AGC (higher radio gain) means lower signal.
3824	 */
3825	rssi_a_dbm = rssi_a - IWM_RSSI_OFFSET - agc_a;
3826	rssi_b_dbm = rssi_b - IWM_RSSI_OFFSET - agc_b;
3827	max_rssi_dbm = MAX(rssi_a_dbm, rssi_b_dbm);
3828
3829	DPRINTF(("Rssi In A %d B %d Max %d AGCA %d AGCB %d\n",
3830	    rssi_a_dbm, rssi_b_dbm, max_rssi_dbm, agc_a, agc_b));
3831
3832	return max_rssi_dbm;
3833}
3834
3835/*
3836 * RSSI values are reported by the FW as positive values - need to negate
3837 * to obtain their dBM.  Account for missing antennas by replacing 0
3838 * values by -256dBm: practically 0 power and a non-feasible 8 bit value.
3839 */
3840static int
3841iwm_get_signal_strength(struct iwm_softc *sc, struct iwm_rx_phy_info *phy_info)
3842{
3843	int energy_a, energy_b, energy_c, max_energy;
3844	uint32_t val;
3845
3846	val = le32toh(phy_info->non_cfg_phy[IWM_RX_INFO_ENERGY_ANT_ABC_IDX]);
3847	energy_a = (val & IWM_RX_INFO_ENERGY_ANT_A_MSK) >>
3848	    IWM_RX_INFO_ENERGY_ANT_A_POS;
3849	energy_a = energy_a ? -energy_a : -256;
3850	energy_b = (val & IWM_RX_INFO_ENERGY_ANT_B_MSK) >>
3851	    IWM_RX_INFO_ENERGY_ANT_B_POS;
3852	energy_b = energy_b ? -energy_b : -256;
3853	energy_c = (val & IWM_RX_INFO_ENERGY_ANT_C_MSK) >>
3854	    IWM_RX_INFO_ENERGY_ANT_C_POS;
3855	energy_c = energy_c ? -energy_c : -256;
3856	max_energy = MAX(energy_a, energy_b);
3857	max_energy = MAX(max_energy, energy_c);
3858
3859	DPRINTFN(12, ("energy In A %d B %d C %d, and max %d\n",
3860	    energy_a, energy_b, energy_c, max_energy));
3861
3862	return max_energy;
3863}
3864
3865static void
3866iwm_rx_rx_phy_cmd(struct iwm_softc *sc, struct iwm_rx_packet *pkt,
3867    struct iwm_rx_data *data)
3868{
3869	struct iwm_rx_phy_info *phy_info = (void *)pkt->data;
3870
3871	DPRINTFN(20, ("received PHY stats\n"));
3872	bus_dmamap_sync(sc->sc_dmat, data->map, sizeof(*pkt),
3873	    sizeof(*phy_info), BUS_DMASYNC_POSTREAD);
3874
3875	memcpy(&sc->sc_last_phy_info, phy_info, sizeof(sc->sc_last_phy_info));
3876}
3877
3878/*
3879 * Retrieve the average noise (in dBm) among receivers.
3880 */
3881static int
3882iwm_get_noise(const struct iwm_statistics_rx_non_phy *stats)
3883{
3884	int i, total, nbant, noise;
3885
3886	total = nbant = noise = 0;
3887	for (i = 0; i < 3; i++) {
3888		noise = le32toh(stats->beacon_silence_rssi[i]) & 0xff;
3889		if (noise) {
3890			total += noise;
3891			nbant++;
3892		}
3893	}
3894
3895	/* There should be at least one antenna but check anyway. */
3896	return (nbant == 0) ? -127 : (total / nbant) - 107;
3897}
3898
3899static void
3900iwm_rx_rx_mpdu(struct iwm_softc *sc, struct iwm_rx_packet *pkt,
3901    struct iwm_rx_data *data)
3902{
3903	struct ieee80211com *ic = &sc->sc_ic;
3904	struct ieee80211_frame *wh;
3905	struct ieee80211_node *ni;
3906	struct ieee80211_channel *c = NULL;
3907	struct mbuf *m;
3908	struct iwm_rx_phy_info *phy_info;
3909	struct iwm_rx_mpdu_res_start *rx_res;
3910	int device_timestamp;
3911	uint32_t len;
3912	uint32_t rx_pkt_status;
3913	int rssi;
3914	int s;
3915
3916	bus_dmamap_sync(sc->sc_dmat, data->map, 0, IWM_RBUF_SIZE,
3917	    BUS_DMASYNC_POSTREAD);
3918
3919	phy_info = &sc->sc_last_phy_info;
3920	rx_res = (struct iwm_rx_mpdu_res_start *)pkt->data;
3921	wh = (struct ieee80211_frame *)(pkt->data + sizeof(*rx_res));
3922	len = le16toh(rx_res->byte_count);
3923	rx_pkt_status = le32toh(*(uint32_t *)(pkt->data +
3924	    sizeof(*rx_res) + len));
3925
3926	m = data->m;
3927	m->m_data = pkt->data + sizeof(*rx_res);
3928	m->m_pkthdr.len = m->m_len = len;
3929
3930	if (__predict_false(phy_info->cfg_phy_cnt > 20)) {
3931		DPRINTF(("dsp size out of range [0,20]: %d\n",
3932		    phy_info->cfg_phy_cnt));
3933		return;
3934	}
3935
3936	if (!(rx_pkt_status & IWM_RX_MPDU_RES_STATUS_CRC_OK) ||
3937	    !(rx_pkt_status & IWM_RX_MPDU_RES_STATUS_OVERRUN_OK)) {
3938		DPRINTF(("Bad CRC or FIFO: 0x%08X.\n", rx_pkt_status));
3939		return; /* drop */
3940	}
3941
3942	device_timestamp = le32toh(phy_info->system_timestamp);
3943
3944	if (sc->sc_capaflags & IWM_UCODE_TLV_FLAGS_RX_ENERGY_API) {
3945		rssi = iwm_get_signal_strength(sc, phy_info);
3946	} else {
3947		rssi = iwm_calc_rssi(sc, phy_info);
3948	}
3949	rssi = -rssi;
3950
3951	if (ic->ic_state == IEEE80211_S_SCAN)
3952		iwm_fix_channel(sc, m);
3953
3954	if (iwm_rx_addbuf(sc, IWM_RBUF_SIZE, sc->rxq.cur) != 0)
3955		return;
3956
3957	m_set_rcvif(m, IC2IFP(ic));
3958
3959	if (le32toh(phy_info->channel) < __arraycount(ic->ic_channels))
3960		c = &ic->ic_channels[le32toh(phy_info->channel)];
3961
3962	s = splnet();
3963
3964	ni = ieee80211_find_rxnode(ic, (struct ieee80211_frame_min *)wh);
3965	if (c)
3966		ni->ni_chan = c;
3967
3968	if (__predict_false(sc->sc_drvbpf != NULL)) {
3969		struct iwm_rx_radiotap_header *tap = &sc->sc_rxtap;
3970
3971		tap->wr_flags = 0;
3972		if (phy_info->phy_flags & htole16(IWM_PHY_INFO_FLAG_SHPREAMBLE))
3973			tap->wr_flags |= IEEE80211_RADIOTAP_F_SHORTPRE;
3974		tap->wr_chan_freq =
3975		    htole16(ic->ic_channels[phy_info->channel].ic_freq);
3976		tap->wr_chan_flags =
3977		    htole16(ic->ic_channels[phy_info->channel].ic_flags);
3978		tap->wr_dbm_antsignal = (int8_t)rssi;
3979		tap->wr_dbm_antnoise = (int8_t)sc->sc_noise;
3980		tap->wr_tsft = phy_info->system_timestamp;
3981		if (phy_info->phy_flags &
3982		    htole16(IWM_RX_RES_PHY_FLAGS_OFDM_HT)) {
3983			uint8_t mcs = (phy_info->rate_n_flags &
3984			    htole32(IWM_RATE_HT_MCS_RATE_CODE_MSK |
3985			      IWM_RATE_HT_MCS_NSS_MSK));
3986			tap->wr_rate = (0x80 | mcs);
3987		} else {
3988			uint8_t rate = (phy_info->rate_n_flags &
3989			    htole32(IWM_RATE_LEGACY_RATE_MSK));
3990			switch (rate) {
3991			/* CCK rates. */
3992			case  10: tap->wr_rate =   2; break;
3993			case  20: tap->wr_rate =   4; break;
3994			case  55: tap->wr_rate =  11; break;
3995			case 110: tap->wr_rate =  22; break;
3996			/* OFDM rates. */
3997			case 0xd: tap->wr_rate =  12; break;
3998			case 0xf: tap->wr_rate =  18; break;
3999			case 0x5: tap->wr_rate =  24; break;
4000			case 0x7: tap->wr_rate =  36; break;
4001			case 0x9: tap->wr_rate =  48; break;
4002			case 0xb: tap->wr_rate =  72; break;
4003			case 0x1: tap->wr_rate =  96; break;
4004			case 0x3: tap->wr_rate = 108; break;
4005			/* Unknown rate: should not happen. */
4006			default:  tap->wr_rate =   0;
4007			}
4008		}
4009
4010		bpf_mtap2(sc->sc_drvbpf, tap, sc->sc_rxtap_len, m, BPF_D_IN);
4011	}
4012	ieee80211_input(ic, m, ni, rssi, device_timestamp);
4013	ieee80211_free_node(ni);
4014
4015	splx(s);
4016}
4017
4018static void
4019iwm_rx_tx_cmd_single(struct iwm_softc *sc, struct iwm_rx_packet *pkt,
4020    struct iwm_node *in)
4021{
4022	struct ieee80211com *ic = &sc->sc_ic;
4023	struct ifnet *ifp = IC2IFP(ic);
4024	struct iwm_tx_resp *tx_resp = (void *)pkt->data;
4025	int status = le16toh(tx_resp->status.status) & IWM_TX_STATUS_MSK;
4026	int failack = tx_resp->failure_frame;
4027
4028	KASSERT(tx_resp->frame_count == 1);
4029
4030	/* Update rate control statistics. */
4031	in->in_amn.amn_txcnt++;
4032	if (failack > 0) {
4033		in->in_amn.amn_retrycnt++;
4034	}
4035
4036	if (status != IWM_TX_STATUS_SUCCESS &&
4037	    status != IWM_TX_STATUS_DIRECT_DONE)
4038		if_statinc(ifp, if_oerrors);
4039	else
4040		if_statinc(ifp, if_opackets);
4041}
4042
4043static void
4044iwm_rx_tx_cmd(struct iwm_softc *sc, struct iwm_rx_packet *pkt,
4045    struct iwm_rx_data *data)
4046{
4047	struct ieee80211com *ic = &sc->sc_ic;
4048	struct ifnet *ifp = IC2IFP(ic);
4049	struct iwm_cmd_header *cmd_hdr = &pkt->hdr;
4050	int idx = cmd_hdr->idx;
4051	int qid = cmd_hdr->qid;
4052	struct iwm_tx_ring *ring = &sc->txq[qid];
4053	struct iwm_tx_data *txd = &ring->data[idx];
4054	struct iwm_node *in = txd->in;
4055	int s;
4056
4057	s = splnet();
4058
4059	if (txd->done) {
4060		DPRINTF(("%s: got tx interrupt that's already been handled!\n",
4061		    DEVNAME(sc)));
4062		splx(s);
4063		return;
4064	}
4065
4066	bus_dmamap_sync(sc->sc_dmat, data->map, 0, IWM_RBUF_SIZE,
4067	    BUS_DMASYNC_POSTREAD);
4068
4069	sc->sc_tx_timer = 0;
4070
4071	iwm_rx_tx_cmd_single(sc, pkt, in);
4072
4073	bus_dmamap_sync(sc->sc_dmat, txd->map, 0, txd->map->dm_mapsize,
4074	    BUS_DMASYNC_POSTWRITE);
4075	bus_dmamap_unload(sc->sc_dmat, txd->map);
4076	m_freem(txd->m);
4077
4078	DPRINTFN(8, ("free txd %p, in %p\n", txd, txd->in));
4079	KASSERT(txd->done == 0);
4080	txd->done = 1;
4081	KASSERT(txd->in);
4082
4083	txd->m = NULL;
4084	txd->in = NULL;
4085	ieee80211_free_node(&in->in_ni);
4086
4087	if (--ring->queued < IWM_TX_RING_LOMARK) {
4088		sc->qfullmsk &= ~(1 << qid);
4089		if (sc->qfullmsk == 0 && (ifp->if_flags & IFF_OACTIVE)) {
4090			ifp->if_flags &= ~IFF_OACTIVE;
4091			KASSERT(KERNEL_LOCKED_P());
4092			iwm_start(ifp);
4093		}
4094	}
4095
4096	splx(s);
4097}
4098
4099static int
4100iwm_binding_cmd(struct iwm_softc *sc, struct iwm_node *in, uint32_t action)
4101{
4102	struct iwm_binding_cmd cmd;
4103	struct iwm_phy_ctxt *phyctxt = in->in_phyctxt;
4104	int i, err;
4105	uint32_t status;
4106
4107	memset(&cmd, 0, sizeof(cmd));
4108
4109	cmd.id_and_color
4110	    = htole32(IWM_FW_CMD_ID_AND_COLOR(phyctxt->id, phyctxt->color));
4111	cmd.action = htole32(action);
4112	cmd.phy = htole32(IWM_FW_CMD_ID_AND_COLOR(phyctxt->id, phyctxt->color));
4113
4114	cmd.macs[0] = htole32(IWM_FW_CMD_ID_AND_COLOR(in->in_id, in->in_color));
4115	for (i = 1; i < IWM_MAX_MACS_IN_BINDING; i++)
4116		cmd.macs[i] = htole32(IWM_FW_CTXT_INVALID);
4117
4118	status = 0;
4119	err = iwm_send_cmd_pdu_status(sc, IWM_BINDING_CONTEXT_CMD,
4120	    sizeof(cmd), &cmd, &status);
4121	if (err == 0 && status != 0)
4122		err = EIO;
4123
4124	return err;
4125}
4126
4127static void
4128iwm_phy_ctxt_cmd_hdr(struct iwm_softc *sc, struct iwm_phy_ctxt *ctxt,
4129    struct iwm_phy_context_cmd *cmd, uint32_t action, uint32_t apply_time)
4130{
4131	memset(cmd, 0, sizeof(struct iwm_phy_context_cmd));
4132
4133	cmd->id_and_color = htole32(IWM_FW_CMD_ID_AND_COLOR(ctxt->id,
4134	    ctxt->color));
4135	cmd->action = htole32(action);
4136	cmd->apply_time = htole32(apply_time);
4137}
4138
4139static void
4140iwm_phy_ctxt_cmd_data(struct iwm_softc *sc, struct iwm_phy_context_cmd *cmd,
4141    struct ieee80211_channel *chan, uint8_t chains_static,
4142    uint8_t chains_dynamic)
4143{
4144	struct ieee80211com *ic = &sc->sc_ic;
4145	uint8_t active_cnt, idle_cnt;
4146
4147	cmd->ci.band = IEEE80211_IS_CHAN_2GHZ(chan) ?
4148	    IWM_PHY_BAND_24 : IWM_PHY_BAND_5;
4149
4150	cmd->ci.channel = ieee80211_chan2ieee(ic, chan);
4151	cmd->ci.width = IWM_PHY_VHT_CHANNEL_MODE20;
4152	cmd->ci.ctrl_pos = IWM_PHY_VHT_CTRL_POS_1_BELOW;
4153
4154	/* Set rx the chains */
4155	idle_cnt = chains_static;
4156	active_cnt = chains_dynamic;
4157
4158	cmd->rxchain_info = htole32(iwm_fw_valid_rx_ant(sc) <<
4159	    IWM_PHY_RX_CHAIN_VALID_POS);
4160	cmd->rxchain_info |= htole32(idle_cnt << IWM_PHY_RX_CHAIN_CNT_POS);
4161	cmd->rxchain_info |= htole32(active_cnt <<
4162	    IWM_PHY_RX_CHAIN_MIMO_CNT_POS);
4163
4164	cmd->txchain_info = htole32(iwm_fw_valid_tx_ant(sc));
4165}
4166
4167static int
4168iwm_phy_ctxt_cmd(struct iwm_softc *sc, struct iwm_phy_ctxt *ctxt,
4169    uint8_t chains_static, uint8_t chains_dynamic, uint32_t action,
4170    uint32_t apply_time)
4171{
4172	struct iwm_phy_context_cmd cmd;
4173
4174	iwm_phy_ctxt_cmd_hdr(sc, ctxt, &cmd, action, apply_time);
4175
4176	iwm_phy_ctxt_cmd_data(sc, &cmd, ctxt->channel,
4177	    chains_static, chains_dynamic);
4178
4179	return iwm_send_cmd_pdu(sc, IWM_PHY_CONTEXT_CMD, 0,
4180	    sizeof(struct iwm_phy_context_cmd), &cmd);
4181}
4182
4183static int
4184iwm_send_cmd(struct iwm_softc *sc, struct iwm_host_cmd *hcmd)
4185{
4186	struct iwm_tx_ring *ring = &sc->txq[IWM_CMD_QUEUE];
4187	struct iwm_tfd *desc;
4188	struct iwm_tx_data *txdata;
4189	struct iwm_device_cmd *cmd;
4190	struct mbuf *m;
4191	bus_addr_t paddr;
4192	uint32_t addr_lo;
4193	int err = 0, i, paylen, off, s;
4194	int code;
4195	int async, wantresp;
4196	int group_id;
4197	size_t hdrlen, datasz;
4198	uint8_t *data;
4199
4200	code = hcmd->id;
4201	async = hcmd->flags & IWM_CMD_ASYNC;
4202	wantresp = hcmd->flags & IWM_CMD_WANT_SKB;
4203
4204	for (i = 0, paylen = 0; i < __arraycount(hcmd->len); i++) {
4205		paylen += hcmd->len[i];
4206	}
4207
4208	/* if the command wants an answer, busy sc_cmd_resp */
4209	if (wantresp) {
4210		KASSERT(!async);
4211		while (sc->sc_wantresp != IWM_CMD_RESP_IDLE)
4212			tsleep(&sc->sc_wantresp, 0, "iwmcmdsl", 0);
4213		sc->sc_wantresp = ring->qid << 16 | ring->cur;
4214	}
4215
4216	/*
4217	 * Is the hardware still available?  (after e.g. above wait).
4218	 */
4219	s = splnet();
4220	if (sc->sc_flags & IWM_FLAG_STOPPED) {
4221		err = ENXIO;
4222		goto out;
4223	}
4224
4225	desc = &ring->desc[ring->cur];
4226	txdata = &ring->data[ring->cur];
4227
4228	group_id = iwm_cmd_groupid(code);
4229	if (group_id != 0) {
4230		hdrlen = sizeof(cmd->hdr_wide);
4231		datasz = sizeof(cmd->data_wide);
4232	} else {
4233		hdrlen = sizeof(cmd->hdr);
4234		datasz = sizeof(cmd->data);
4235	}
4236
4237	if (paylen > datasz) {
4238		/* Command is too large to fit in pre-allocated space. */
4239		size_t totlen = hdrlen + paylen;
4240		if (paylen > IWM_MAX_CMD_PAYLOAD_SIZE) {
4241			aprint_error_dev(sc->sc_dev,
4242			    "firmware command too long (%zd bytes)\n", totlen);
4243			err = EINVAL;
4244			goto out;
4245		}
4246		m = m_gethdr(M_DONTWAIT, MT_DATA);
4247		if (m == NULL) {
4248			err = ENOMEM;
4249			goto out;
4250		}
4251		MEXTMALLOC(m, IWM_RBUF_SIZE, M_DONTWAIT);
4252		if (!(m->m_flags & M_EXT)) {
4253			aprint_error_dev(sc->sc_dev,
4254			    "could not get fw cmd mbuf (%zd bytes)\n", totlen);
4255			m_freem(m);
4256			err = ENOMEM;
4257			goto out;
4258		}
4259		cmd = mtod(m, struct iwm_device_cmd *);
4260		err = bus_dmamap_load(sc->sc_dmat, txdata->map, cmd,
4261		    totlen, NULL, BUS_DMA_NOWAIT | BUS_DMA_WRITE);
4262		if (err) {
4263			aprint_error_dev(sc->sc_dev,
4264			    "could not load fw cmd mbuf (%zd bytes)\n", totlen);
4265			m_freem(m);
4266			goto out;
4267		}
4268		txdata->m = m;
4269		paddr = txdata->map->dm_segs[0].ds_addr;
4270	} else {
4271		cmd = &ring->cmd[ring->cur];
4272		paddr = txdata->cmd_paddr;
4273	}
4274
4275	if (group_id != 0) {
4276		cmd->hdr_wide.opcode = iwm_cmd_opcode(code);
4277		cmd->hdr_wide.group_id = group_id;
4278		cmd->hdr_wide.qid = ring->qid;
4279		cmd->hdr_wide.idx = ring->cur;
4280		cmd->hdr_wide.length = htole16(paylen);
4281		cmd->hdr_wide.version = iwm_cmd_version(code);
4282		data = cmd->data_wide;
4283	} else {
4284		cmd->hdr.code = code;
4285		cmd->hdr.flags = 0;
4286		cmd->hdr.qid = ring->qid;
4287		cmd->hdr.idx = ring->cur;
4288		data = cmd->data;
4289	}
4290
4291	for (i = 0, off = 0; i < __arraycount(hcmd->data); i++) {
4292		if (hcmd->len[i] == 0)
4293			continue;
4294		memcpy(data + off, hcmd->data[i], hcmd->len[i]);
4295		off += hcmd->len[i];
4296	}
4297	KASSERT(off == paylen);
4298
4299	/* lo field is not aligned */
4300	addr_lo = htole32((uint32_t)paddr);
4301	memcpy(&desc->tbs[0].lo, &addr_lo, sizeof(uint32_t));
4302	desc->tbs[0].hi_n_len  = htole16(iwm_get_dma_hi_addr(paddr)
4303	    | ((hdrlen + paylen) << 4));
4304	desc->num_tbs = 1;
4305
4306	DPRINTFN(8, ("iwm_send_cmd 0x%x size=%zu %s\n",
4307	    code, hdrlen + paylen, async ? " (async)" : ""));
4308
4309	if (paylen > datasz) {
4310		bus_dmamap_sync(sc->sc_dmat, txdata->map, 0, hdrlen + paylen,
4311		    BUS_DMASYNC_PREWRITE);
4312	} else {
4313		bus_dmamap_sync(sc->sc_dmat, ring->cmd_dma.map,
4314		    (uint8_t *)cmd - (uint8_t *)ring->cmd, hdrlen + paylen,
4315		    BUS_DMASYNC_PREWRITE);
4316	}
4317	bus_dmamap_sync(sc->sc_dmat, ring->desc_dma.map,
4318	    (uint8_t *)desc - (uint8_t *)ring->desc, sizeof(*desc),
4319	    BUS_DMASYNC_PREWRITE);
4320
4321	err = iwm_set_cmd_in_flight(sc);
4322	if (err)
4323		goto out;
4324	ring->queued++;
4325
4326#if 0
4327	iwm_update_sched(sc, ring->qid, ring->cur, 0, 0);
4328#endif
4329	DPRINTF(("sending command 0x%x qid %d, idx %d\n",
4330	    code, ring->qid, ring->cur));
4331
4332	/* Kick command ring. */
4333	ring->cur = (ring->cur + 1) % IWM_TX_RING_COUNT;
4334	IWM_WRITE(sc, IWM_HBUS_TARG_WRPTR, ring->qid << 8 | ring->cur);
4335
4336	if (!async) {
4337		int generation = sc->sc_generation;
4338		err = tsleep(desc, PCATCH, "iwmcmd", mstohz(2000));
4339		if (err == 0) {
4340			/* if hardware is no longer up, return error */
4341			if (generation != sc->sc_generation) {
4342				err = ENXIO;
4343			} else {
4344				hcmd->resp_pkt = (void *)sc->sc_cmd_resp;
4345			}
4346		}
4347	}
4348 out:
4349	if (wantresp && err) {
4350		iwm_free_resp(sc, hcmd);
4351	}
4352	splx(s);
4353
4354	return err;
4355}
4356
4357static int
4358iwm_send_cmd_pdu(struct iwm_softc *sc, uint32_t id, uint32_t flags,
4359    uint16_t len, const void *data)
4360{
4361	struct iwm_host_cmd cmd = {
4362		.id = id,
4363		.len = { len, },
4364		.data = { data, },
4365		.flags = flags,
4366	};
4367
4368	return iwm_send_cmd(sc, &cmd);
4369}
4370
4371static int
4372iwm_send_cmd_status(struct iwm_softc *sc, struct iwm_host_cmd *cmd,
4373    uint32_t *status)
4374{
4375	struct iwm_rx_packet *pkt;
4376	struct iwm_cmd_response *resp;
4377	int err, resp_len;
4378
4379	KASSERT((cmd->flags & IWM_CMD_WANT_SKB) == 0);
4380	cmd->flags |= IWM_CMD_WANT_SKB;
4381
4382	err = iwm_send_cmd(sc, cmd);
4383	if (err)
4384		return err;
4385	pkt = cmd->resp_pkt;
4386
4387	/* Can happen if RFKILL is asserted */
4388	if (!pkt) {
4389		err = 0;
4390		goto out_free_resp;
4391	}
4392
4393	if (pkt->hdr.flags & IWM_CMD_FAILED_MSK) {
4394		err = EIO;
4395		goto out_free_resp;
4396	}
4397
4398	resp_len = iwm_rx_packet_payload_len(pkt);
4399	if (resp_len != sizeof(*resp)) {
4400		err = EIO;
4401		goto out_free_resp;
4402	}
4403
4404	resp = (void *)pkt->data;
4405	*status = le32toh(resp->status);
4406 out_free_resp:
4407	iwm_free_resp(sc, cmd);
4408	return err;
4409}
4410
4411static int
4412iwm_send_cmd_pdu_status(struct iwm_softc *sc, uint32_t id, uint16_t len,
4413    const void *data, uint32_t *status)
4414{
4415	struct iwm_host_cmd cmd = {
4416		.id = id,
4417		.len = { len, },
4418		.data = { data, },
4419	};
4420
4421	return iwm_send_cmd_status(sc, &cmd, status);
4422}
4423
4424static void
4425iwm_free_resp(struct iwm_softc *sc, struct iwm_host_cmd *hcmd)
4426{
4427	KASSERT(sc->sc_wantresp != IWM_CMD_RESP_IDLE);
4428	KASSERT((hcmd->flags & IWM_CMD_WANT_SKB) == IWM_CMD_WANT_SKB);
4429	sc->sc_wantresp = IWM_CMD_RESP_IDLE;
4430	wakeup(&sc->sc_wantresp);
4431}
4432
4433static void
4434iwm_cmd_done(struct iwm_softc *sc, int qid, int idx)
4435{
4436	struct iwm_tx_ring *ring = &sc->txq[IWM_CMD_QUEUE];
4437	struct iwm_tx_data *data;
4438	int s;
4439
4440	if (qid != IWM_CMD_QUEUE) {
4441		return;	/* Not a command ack. */
4442	}
4443
4444	s = splnet();
4445
4446	data = &ring->data[idx];
4447
4448	if (data->m != NULL) {
4449		bus_dmamap_sync(sc->sc_dmat, data->map, 0,
4450		    data->map->dm_mapsize, BUS_DMASYNC_POSTWRITE);
4451		bus_dmamap_unload(sc->sc_dmat, data->map);
4452		m_freem(data->m);
4453		data->m = NULL;
4454	}
4455	wakeup(&ring->desc[idx]);
4456
4457	if (((idx + ring->queued) % IWM_TX_RING_COUNT) != ring->cur) {
4458		device_printf(sc->sc_dev,
4459		    "Some HCMDs skipped?: idx=%d queued=%d cur=%d\n",
4460		    idx, ring->queued, ring->cur);
4461	}
4462
4463	if (ring->queued == 0) {
4464		splx(s);
4465		device_printf(sc->sc_dev, "cmd_done with empty ring\n");
4466		return;
4467	}
4468
4469	if (--ring->queued == 0)
4470		iwm_clear_cmd_in_flight(sc);
4471
4472	splx(s);
4473}
4474
4475#if 0
4476/*
4477 * necessary only for block ack mode
4478 */
4479void
4480iwm_update_sched(struct iwm_softc *sc, int qid, int idx, uint8_t sta_id,
4481    uint16_t len)
4482{
4483	struct iwm_agn_scd_bc_tbl *scd_bc_tbl;
4484	uint16_t w_val;
4485
4486	scd_bc_tbl = sc->sched_dma.vaddr;
4487
4488	len += 8; /* magic numbers came naturally from paris */
4489	if (sc->sc_capaflags & IWM_UCODE_TLV_FLAGS_DW_BC_TABLE)
4490		len = roundup(len, 4) / 4;
4491
4492	w_val = htole16(sta_id << 12 | len);
4493
4494	/* Update TX scheduler. */
4495	scd_bc_tbl[qid].tfd_offset[idx] = w_val;
4496	bus_dmamap_sync(sc->sc_dmat, sc->sched_dma.map,
4497	    (char *)(void *)w - (char *)(void *)sc->sched_dma.vaddr,
4498	    sizeof(uint16_t), BUS_DMASYNC_PREWRITE);
4499
4500	/* I really wonder what this is ?!? */
4501	if (idx < IWM_TFD_QUEUE_SIZE_BC_DUP) {
4502		scd_bc_tbl[qid].tfd_offset[IWM_TFD_QUEUE_SIZE_MAX + idx] = w_val;
4503		bus_dmamap_sync(sc->sc_dmat, sc->sched_dma.map,
4504		    (char *)(void *)(w + IWM_TFD_QUEUE_SIZE_MAX) -
4505		    (char *)(void *)sc->sched_dma.vaddr,
4506		    sizeof (uint16_t), BUS_DMASYNC_PREWRITE);
4507	}
4508}
4509#endif
4510
4511/*
4512 * Fill in various bit for management frames, and leave them
4513 * unfilled for data frames (firmware takes care of that).
4514 * Return the selected TX rate.
4515 */
4516static const struct iwm_rate *
4517iwm_tx_fill_cmd(struct iwm_softc *sc, struct iwm_node *in,
4518    struct ieee80211_frame *wh, struct iwm_tx_cmd *tx)
4519{
4520	struct ieee80211com *ic = &sc->sc_ic;
4521	struct ieee80211_node *ni = &in->in_ni;
4522	const struct iwm_rate *rinfo;
4523	int type = wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK;
4524	int ridx, rate_flags, i, ind;
4525	int nrates = ni->ni_rates.rs_nrates;
4526
4527	tx->rts_retry_limit = IWM_RTS_DFAULT_RETRY_LIMIT;
4528	tx->data_retry_limit = IWM_DEFAULT_TX_RETRY;
4529
4530	if (IEEE80211_IS_MULTICAST(wh->i_addr1) ||
4531	    type != IEEE80211_FC0_TYPE_DATA) {
4532		/* for non-data, use the lowest supported rate */
4533		ridx = (IEEE80211_IS_CHAN_5GHZ(ni->ni_chan)) ?
4534		    IWM_RIDX_OFDM : IWM_RIDX_CCK;
4535		tx->data_retry_limit = IWM_MGMT_DFAULT_RETRY_LIMIT;
4536#ifndef IEEE80211_NO_HT
4537	} else if (ic->ic_fixed_mcs != -1) {
4538		ridx = sc->sc_fixed_ridx;
4539#endif
4540	} else if (ic->ic_fixed_rate != -1) {
4541		ridx = sc->sc_fixed_ridx;
4542	} else {
4543		/* for data frames, use RS table */
4544		tx->initial_rate_index = 0;
4545		tx->tx_flags |= htole32(IWM_TX_CMD_FLG_STA_RATE);
4546		DPRINTFN(12, ("start with txrate %d\n",
4547		    tx->initial_rate_index));
4548#ifndef IEEE80211_NO_HT
4549		if (ni->ni_flags & IEEE80211_NODE_HT) {
4550			ridx = iwm_mcs2ridx[ni->ni_txmcs];
4551			return &iwm_rates[ridx];
4552		}
4553#endif
4554		ridx = (IEEE80211_IS_CHAN_5GHZ(ni->ni_chan)) ?
4555		    IWM_RIDX_OFDM : IWM_RIDX_CCK;
4556		for (i = 0; i < nrates; i++) {
4557			if (iwm_rates[i].rate == (ni->ni_txrate &
4558			    IEEE80211_RATE_VAL)) {
4559				ridx = i;
4560				break;
4561			}
4562		}
4563		return &iwm_rates[ridx];
4564	}
4565
4566	rinfo = &iwm_rates[ridx];
4567	for (i = 0, ind = sc->sc_mgmt_last_antenna;
4568	    i < IWM_RATE_MCS_ANT_NUM; i++) {
4569		ind = (ind + 1) % IWM_RATE_MCS_ANT_NUM;
4570		if (iwm_fw_valid_tx_ant(sc) & (1 << ind)) {
4571			sc->sc_mgmt_last_antenna = ind;
4572			break;
4573		}
4574	}
4575	rate_flags = (1 << sc->sc_mgmt_last_antenna) << IWM_RATE_MCS_ANT_POS;
4576	if (IWM_RIDX_IS_CCK(ridx))
4577		rate_flags |= IWM_RATE_MCS_CCK_MSK;
4578#ifndef IEEE80211_NO_HT
4579	if ((ni->ni_flags & IEEE80211_NODE_HT) &&
4580	    rinfo->ht_plcp != IWM_RATE_HT_SISO_MCS_INV_PLCP) {
4581		rate_flags |= IWM_RATE_MCS_HT_MSK;
4582		tx->rate_n_flags = htole32(rate_flags | rinfo->ht_plcp);
4583	} else
4584#endif
4585		tx->rate_n_flags = htole32(rate_flags | rinfo->plcp);
4586
4587	return rinfo;
4588}
4589
4590#define TB0_SIZE 16
4591static int
4592iwm_tx(struct iwm_softc *sc, struct mbuf *m, struct ieee80211_node *ni, int ac)
4593{
4594	struct ieee80211com *ic = &sc->sc_ic;
4595	struct iwm_node *in = (struct iwm_node *)ni;
4596	struct iwm_tx_ring *ring;
4597	struct iwm_tx_data *data;
4598	struct iwm_tfd *desc;
4599	struct iwm_device_cmd *cmd;
4600	struct iwm_tx_cmd *tx;
4601	struct ieee80211_frame *wh;
4602	struct ieee80211_key *k = NULL;
4603	struct mbuf *m1;
4604	const struct iwm_rate *rinfo;
4605	uint32_t flags;
4606	u_int hdrlen;
4607	bus_dma_segment_t *seg;
4608	uint8_t tid, type;
4609	int i, totlen, err, pad;
4610
4611	wh = mtod(m, struct ieee80211_frame *);
4612	hdrlen = ieee80211_anyhdrsize(wh);
4613	type = wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK;
4614
4615	tid = 0;
4616
4617	ring = &sc->txq[ac];
4618	desc = &ring->desc[ring->cur];
4619	memset(desc, 0, sizeof(*desc));
4620	data = &ring->data[ring->cur];
4621
4622	cmd = &ring->cmd[ring->cur];
4623	cmd->hdr.code = IWM_TX_CMD;
4624	cmd->hdr.flags = 0;
4625	cmd->hdr.qid = ring->qid;
4626	cmd->hdr.idx = ring->cur;
4627
4628	tx = (void *)cmd->data;
4629	memset(tx, 0, sizeof(*tx));
4630
4631	rinfo = iwm_tx_fill_cmd(sc, in, wh, tx);
4632
4633	if (__predict_false(sc->sc_drvbpf != NULL)) {
4634		struct iwm_tx_radiotap_header *tap = &sc->sc_txtap;
4635
4636		tap->wt_flags = 0;
4637		tap->wt_chan_freq = htole16(ni->ni_chan->ic_freq);
4638		tap->wt_chan_flags = htole16(ni->ni_chan->ic_flags);
4639#ifndef IEEE80211_NO_HT
4640		if ((ni->ni_flags & IEEE80211_NODE_HT) &&
4641		    !IEEE80211_IS_MULTICAST(wh->i_addr1) &&
4642		    type == IEEE80211_FC0_TYPE_DATA &&
4643		    rinfo->plcp == IWM_RATE_INVM_PLCP) {
4644			tap->wt_rate = (0x80 | rinfo->ht_plcp);
4645		} else
4646#endif
4647			tap->wt_rate = rinfo->rate;
4648		tap->wt_hwqueue = ac;
4649		if (wh->i_fc[1] & IEEE80211_FC1_WEP)
4650			tap->wt_flags |= IEEE80211_RADIOTAP_F_WEP;
4651
4652		bpf_mtap2(sc->sc_drvbpf, tap, sc->sc_txtap_len, m, BPF_D_OUT);
4653	}
4654
4655	/* Encrypt the frame if need be. */
4656	if (wh->i_fc[1] & IEEE80211_FC1_WEP) {
4657		k = ieee80211_crypto_encap(ic, ni, m);
4658		if (k == NULL) {
4659			m_freem(m);
4660			return ENOBUFS;
4661		}
4662		/* Packet header may have moved, reset our local pointer. */
4663		wh = mtod(m, struct ieee80211_frame *);
4664	}
4665	totlen = m->m_pkthdr.len;
4666
4667	flags = 0;
4668	if (!IEEE80211_IS_MULTICAST(wh->i_addr1)) {
4669		flags |= IWM_TX_CMD_FLG_ACK;
4670	}
4671
4672	if (type == IEEE80211_FC0_TYPE_DATA &&
4673	    !IEEE80211_IS_MULTICAST(wh->i_addr1) &&
4674	    (totlen + IEEE80211_CRC_LEN > ic->ic_rtsthreshold ||
4675	     (ic->ic_flags & IEEE80211_F_USEPROT)))
4676		flags |= IWM_TX_CMD_FLG_PROT_REQUIRE;
4677
4678	if (IEEE80211_IS_MULTICAST(wh->i_addr1) ||
4679	    type != IEEE80211_FC0_TYPE_DATA)
4680		tx->sta_id = IWM_AUX_STA_ID;
4681	else
4682		tx->sta_id = IWM_STATION_ID;
4683
4684	if (type == IEEE80211_FC0_TYPE_MGT) {
4685		uint8_t subtype = wh->i_fc[0] & IEEE80211_FC0_SUBTYPE_MASK;
4686
4687		if (subtype == IEEE80211_FC0_SUBTYPE_ASSOC_REQ ||
4688		    subtype == IEEE80211_FC0_SUBTYPE_REASSOC_REQ)
4689			tx->pm_frame_timeout = htole16(IWM_PM_FRAME_ASSOC);
4690		else
4691			tx->pm_frame_timeout = htole16(IWM_PM_FRAME_MGMT);
4692	} else {
4693		tx->pm_frame_timeout = htole16(IWM_PM_FRAME_NONE);
4694	}
4695
4696	if (hdrlen & 3) {
4697		/* First segment length must be a multiple of 4. */
4698		flags |= IWM_TX_CMD_FLG_MH_PAD;
4699		pad = 4 - (hdrlen & 3);
4700	} else
4701		pad = 0;
4702
4703	tx->driver_txop = 0;
4704	tx->next_frame_len = 0;
4705
4706	tx->len = htole16(totlen);
4707	tx->tid_tspec = tid;
4708	tx->life_time = htole32(IWM_TX_CMD_LIFE_TIME_INFINITE);
4709
4710	/* Set physical address of "scratch area". */
4711	tx->dram_lsb_ptr = htole32(data->scratch_paddr);
4712	tx->dram_msb_ptr = iwm_get_dma_hi_addr(data->scratch_paddr);
4713
4714	/* Copy 802.11 header in TX command. */
4715	memcpy(tx + 1, wh, hdrlen);
4716
4717	flags |= IWM_TX_CMD_FLG_BT_DIS | IWM_TX_CMD_FLG_SEQ_CTL;
4718
4719	tx->sec_ctl = 0;
4720	tx->tx_flags |= htole32(flags);
4721
4722	/* Trim 802.11 header. */
4723	m_adj(m, hdrlen);
4724
4725	err = bus_dmamap_load_mbuf(sc->sc_dmat, data->map, m,
4726	    BUS_DMA_NOWAIT | BUS_DMA_WRITE);
4727	if (err) {
4728		if (err != EFBIG) {
4729			aprint_error_dev(sc->sc_dev,
4730			    "can't map mbuf (error %d)\n", err);
4731			m_freem(m);
4732			return err;
4733		}
4734		/* Too many DMA segments, linearize mbuf. */
4735		MGETHDR(m1, M_DONTWAIT, MT_DATA);
4736		if (m1 == NULL) {
4737			m_freem(m);
4738			return ENOBUFS;
4739		}
4740		if (m->m_pkthdr.len > MHLEN) {
4741			MCLGET(m1, M_DONTWAIT);
4742			if (!(m1->m_flags & M_EXT)) {
4743				m_freem(m);
4744				m_freem(m1);
4745				return ENOBUFS;
4746			}
4747		}
4748		m_copydata(m, 0, m->m_pkthdr.len, mtod(m1, void *));
4749		m1->m_pkthdr.len = m1->m_len = m->m_pkthdr.len;
4750		m_freem(m);
4751		m = m1;
4752
4753		err = bus_dmamap_load_mbuf(sc->sc_dmat, data->map, m,
4754		    BUS_DMA_NOWAIT | BUS_DMA_WRITE);
4755		if (err) {
4756			aprint_error_dev(sc->sc_dev,
4757			    "can't map mbuf (error %d)\n", err);
4758			m_freem(m);
4759			return err;
4760		}
4761	}
4762	data->m = m;
4763	data->in = in;
4764	data->done = 0;
4765
4766	DPRINTFN(8, ("sending txd %p, in %p\n", data, data->in));
4767	KASSERT(data->in != NULL);
4768
4769	DPRINTFN(8, ("sending data: qid=%d idx=%d len=%d nsegs=%d type=%d "
4770	    "subtype=%x tx_flags=%08x init_rateidx=%08x rate_n_flags=%08x\n",
4771	    ring->qid, ring->cur, totlen, data->map->dm_nsegs, type,
4772	    (wh->i_fc[0] & IEEE80211_FC0_SUBTYPE_MASK) >> 4,
4773	    le32toh(tx->tx_flags), le32toh(tx->initial_rate_index),
4774	    le32toh(tx->rate_n_flags)));
4775
4776	/* Fill TX descriptor. */
4777	desc->num_tbs = 2 + data->map->dm_nsegs;
4778
4779	desc->tbs[0].lo = htole32(data->cmd_paddr);
4780	desc->tbs[0].hi_n_len = htole16(iwm_get_dma_hi_addr(data->cmd_paddr)) |
4781	    (TB0_SIZE << 4);
4782	desc->tbs[1].lo = htole32(data->cmd_paddr + TB0_SIZE);
4783	desc->tbs[1].hi_n_len = htole16(iwm_get_dma_hi_addr(data->cmd_paddr)) |
4784	    ((sizeof(struct iwm_cmd_header) + sizeof(*tx)
4785	      + hdrlen + pad - TB0_SIZE) << 4);
4786
4787	/* Other DMA segments are for data payload. */
4788	seg = data->map->dm_segs;
4789	for (i = 0; i < data->map->dm_nsegs; i++, seg++) {
4790		desc->tbs[i+2].lo = htole32(seg->ds_addr);
4791		desc->tbs[i+2].hi_n_len =
4792		    htole16(iwm_get_dma_hi_addr(seg->ds_addr))
4793		    | ((seg->ds_len) << 4);
4794	}
4795
4796	bus_dmamap_sync(sc->sc_dmat, data->map, 0, m->m_pkthdr.len,
4797	    BUS_DMASYNC_PREWRITE);
4798	bus_dmamap_sync(sc->sc_dmat, ring->cmd_dma.map,
4799	    (uint8_t *)cmd - (uint8_t *)ring->cmd, sizeof(*cmd),
4800	    BUS_DMASYNC_PREWRITE);
4801	bus_dmamap_sync(sc->sc_dmat, ring->desc_dma.map,
4802	    (uint8_t *)desc - (uint8_t *)ring->desc, sizeof(*desc),
4803	    BUS_DMASYNC_PREWRITE);
4804
4805#if 0
4806	iwm_update_sched(sc, ring->qid, ring->cur, tx->sta_id,
4807	    le16toh(tx->len));
4808#endif
4809
4810	/* Kick TX ring. */
4811	ring->cur = (ring->cur + 1) % IWM_TX_RING_COUNT;
4812	IWM_WRITE(sc, IWM_HBUS_TARG_WRPTR, ring->qid << 8 | ring->cur);
4813
4814	/* Mark TX ring as full if we reach a certain threshold. */
4815	if (++ring->queued > IWM_TX_RING_HIMARK) {
4816		sc->qfullmsk |= 1 << ring->qid;
4817	}
4818
4819	return 0;
4820}
4821
4822#if 0
4823/* not necessary? */
4824static int
4825iwm_flush_tx_path(struct iwm_softc *sc, int tfd_msk, int sync)
4826{
4827	struct iwm_tx_path_flush_cmd flush_cmd = {
4828		.queues_ctl = htole32(tfd_msk),
4829		.flush_ctl = htole16(IWM_DUMP_TX_FIFO_FLUSH),
4830	};
4831	int err;
4832
4833	err = iwm_send_cmd_pdu(sc, IWM_TXPATH_FLUSH, sync ? 0 : IWM_CMD_ASYNC,
4834	    sizeof(flush_cmd), &flush_cmd);
4835	if (err)
4836		aprint_error_dev(sc->sc_dev, "Flushing tx queue failed: %d\n",
4837		    err);
4838	return err;
4839}
4840#endif
4841
4842static void
4843iwm_led_enable(struct iwm_softc *sc)
4844{
4845	IWM_WRITE(sc, IWM_CSR_LED_REG, IWM_CSR_LED_REG_TURN_ON);
4846}
4847
4848static void
4849iwm_led_disable(struct iwm_softc *sc)
4850{
4851	IWM_WRITE(sc, IWM_CSR_LED_REG, IWM_CSR_LED_REG_TURN_OFF);
4852}
4853
4854static int
4855iwm_led_is_enabled(struct iwm_softc *sc)
4856{
4857	return (IWM_READ(sc, IWM_CSR_LED_REG) == IWM_CSR_LED_REG_TURN_ON);
4858}
4859
4860static void
4861iwm_led_blink_timeout(void *arg)
4862{
4863	struct iwm_softc *sc = arg;
4864
4865	if (iwm_led_is_enabled(sc))
4866		iwm_led_disable(sc);
4867	else
4868		iwm_led_enable(sc);
4869
4870	callout_schedule(&sc->sc_led_blink_to, mstohz(200));
4871}
4872
4873static void
4874iwm_led_blink_start(struct iwm_softc *sc)
4875{
4876	callout_schedule(&sc->sc_led_blink_to, mstohz(200));
4877}
4878
4879static void
4880iwm_led_blink_stop(struct iwm_softc *sc)
4881{
4882	callout_stop(&sc->sc_led_blink_to);
4883	iwm_led_disable(sc);
4884}
4885
4886#define IWM_POWER_KEEP_ALIVE_PERIOD_SEC    25
4887
4888static int
4889iwm_beacon_filter_send_cmd(struct iwm_softc *sc,
4890    struct iwm_beacon_filter_cmd *cmd)
4891{
4892	return iwm_send_cmd_pdu(sc, IWM_REPLY_BEACON_FILTERING_CMD,
4893	    0, sizeof(struct iwm_beacon_filter_cmd), cmd);
4894}
4895
4896static void
4897iwm_beacon_filter_set_cqm_params(struct iwm_softc *sc, struct iwm_node *in,
4898    struct iwm_beacon_filter_cmd *cmd)
4899{
4900	cmd->ba_enable_beacon_abort = htole32(sc->sc_bf.ba_enabled);
4901}
4902
4903static int
4904iwm_update_beacon_abort(struct iwm_softc *sc, struct iwm_node *in, int enable)
4905{
4906	struct iwm_beacon_filter_cmd cmd = {
4907		IWM_BF_CMD_CONFIG_DEFAULTS,
4908		.bf_enable_beacon_filter = htole32(1),
4909		.ba_enable_beacon_abort = htole32(enable),
4910	};
4911
4912	if (!sc->sc_bf.bf_enabled)
4913		return 0;
4914
4915	sc->sc_bf.ba_enabled = enable;
4916	iwm_beacon_filter_set_cqm_params(sc, in, &cmd);
4917	return iwm_beacon_filter_send_cmd(sc, &cmd);
4918}
4919
4920static void
4921iwm_power_build_cmd(struct iwm_softc *sc, struct iwm_node *in,
4922    struct iwm_mac_power_cmd *cmd)
4923{
4924	struct ieee80211_node *ni = &in->in_ni;
4925	int dtim_period, dtim_msec, keep_alive;
4926
4927	cmd->id_and_color = htole32(IWM_FW_CMD_ID_AND_COLOR(in->in_id,
4928	    in->in_color));
4929	if (ni->ni_dtim_period)
4930		dtim_period = ni->ni_dtim_period;
4931	else
4932		dtim_period = 1;
4933
4934	/*
4935	 * Regardless of power management state the driver must set
4936	 * keep alive period. FW will use it for sending keep alive NDPs
4937	 * immediately after association. Check that keep alive period
4938	 * is at least 3 * DTIM.
4939	 */
4940	dtim_msec = dtim_period * ni->ni_intval;
4941	keep_alive = MAX(3 * dtim_msec, 1000 * IWM_POWER_KEEP_ALIVE_PERIOD_SEC);
4942	keep_alive = roundup(keep_alive, 1000) / 1000;
4943	cmd->keep_alive_seconds = htole16(keep_alive);
4944
4945#ifdef notyet
4946	cmd->flags = htole16(IWM_POWER_FLAGS_POWER_SAVE_ENA_MSK);
4947	cmd->rx_data_timeout = IWM_DEFAULT_PS_RX_DATA_TIMEOUT;
4948	cmd->tx_data_timeout = IWM_DEFAULT_PS_TX_DATA_TIMEOUT;
4949#endif
4950}
4951
4952static int
4953iwm_power_mac_update_mode(struct iwm_softc *sc, struct iwm_node *in)
4954{
4955	int err;
4956	int ba_enable;
4957	struct iwm_mac_power_cmd cmd;
4958
4959	memset(&cmd, 0, sizeof(cmd));
4960
4961	iwm_power_build_cmd(sc, in, &cmd);
4962
4963	err = iwm_send_cmd_pdu(sc, IWM_MAC_PM_POWER_TABLE, 0,
4964	    sizeof(cmd), &cmd);
4965	if (err)
4966		return err;
4967
4968	ba_enable = !!(cmd.flags &
4969	    htole16(IWM_POWER_FLAGS_POWER_MANAGEMENT_ENA_MSK));
4970	return iwm_update_beacon_abort(sc, in, ba_enable);
4971}
4972
4973static int
4974iwm_power_update_device(struct iwm_softc *sc)
4975{
4976	struct iwm_device_power_cmd cmd = {
4977#ifdef notyet
4978		.flags = htole16(IWM_DEVICE_POWER_FLAGS_POWER_SAVE_ENA_MSK),
4979#else
4980		.flags = 0,
4981#endif
4982	};
4983
4984	if (!(sc->sc_capaflags & IWM_UCODE_TLV_FLAGS_DEVICE_PS_CMD))
4985		return 0;
4986
4987	cmd.flags |= htole16(IWM_DEVICE_POWER_FLAGS_CAM_MSK);
4988	DPRINTF(("Sending device power command with flags = 0x%X\n",
4989	    cmd.flags));
4990
4991	return iwm_send_cmd_pdu(sc, IWM_POWER_TABLE_CMD, 0, sizeof(cmd), &cmd);
4992}
4993
4994#ifdef notyet
4995static int
4996iwm_enable_beacon_filter(struct iwm_softc *sc, struct iwm_node *in)
4997{
4998	struct iwm_beacon_filter_cmd cmd = {
4999		IWM_BF_CMD_CONFIG_DEFAULTS,
5000		.bf_enable_beacon_filter = htole32(1),
5001	};
5002	int err;
5003
5004	iwm_beacon_filter_set_cqm_params(sc, in, &cmd);
5005	err = iwm_beacon_filter_send_cmd(sc, &cmd);
5006
5007	if (err == 0)
5008		sc->sc_bf.bf_enabled = 1;
5009
5010	return err;
5011}
5012#endif
5013
5014static int
5015iwm_disable_beacon_filter(struct iwm_softc *sc)
5016{
5017	struct iwm_beacon_filter_cmd cmd;
5018	int err;
5019
5020	memset(&cmd, 0, sizeof(cmd));
5021	if ((sc->sc_capaflags & IWM_UCODE_TLV_FLAGS_BF_UPDATED) == 0)
5022		return 0;
5023
5024	err = iwm_beacon_filter_send_cmd(sc, &cmd);
5025	if (err == 0)
5026		sc->sc_bf.bf_enabled = 0;
5027
5028	return err;
5029}
5030
5031static int
5032iwm_add_sta_cmd(struct iwm_softc *sc, struct iwm_node *in, int update)
5033{
5034	struct iwm_add_sta_cmd_v7 add_sta_cmd;
5035	int err;
5036	uint32_t status;
5037
5038	memset(&add_sta_cmd, 0, sizeof(add_sta_cmd));
5039
5040	add_sta_cmd.sta_id = IWM_STATION_ID;
5041	add_sta_cmd.mac_id_n_color
5042	    = htole32(IWM_FW_CMD_ID_AND_COLOR(in->in_id, in->in_color));
5043	if (!update) {
5044		int ac;
5045		for (ac = 0; ac < WME_NUM_AC; ac++) {
5046			add_sta_cmd.tfd_queue_msk |=
5047			    htole32(__BIT(iwm_ac_to_tx_fifo[ac]));
5048		}
5049		IEEE80211_ADDR_COPY(&add_sta_cmd.addr, in->in_ni.ni_bssid);
5050	}
5051	add_sta_cmd.add_modify = update ? 1 : 0;
5052	add_sta_cmd.station_flags_msk
5053	    |= htole32(IWM_STA_FLG_FAT_EN_MSK | IWM_STA_FLG_MIMO_EN_MSK);
5054	add_sta_cmd.tid_disable_tx = htole16(0xffff);
5055	if (update)
5056		add_sta_cmd.modify_mask |= (IWM_STA_MODIFY_TID_DISABLE_TX);
5057
5058#ifndef IEEE80211_NO_HT
5059	if (in->in_ni.ni_flags & IEEE80211_NODE_HT) {
5060		add_sta_cmd.station_flags_msk
5061		    |= htole32(IWM_STA_FLG_MAX_AGG_SIZE_MSK |
5062		    IWM_STA_FLG_AGG_MPDU_DENS_MSK);
5063
5064		add_sta_cmd.station_flags
5065		    |= htole32(IWM_STA_FLG_MAX_AGG_SIZE_64K);
5066		switch (ic->ic_ampdu_params & IEEE80211_AMPDU_PARAM_SS) {
5067		case IEEE80211_AMPDU_PARAM_SS_2:
5068			add_sta_cmd.station_flags
5069			    |= htole32(IWM_STA_FLG_AGG_MPDU_DENS_2US);
5070			break;
5071		case IEEE80211_AMPDU_PARAM_SS_4:
5072			add_sta_cmd.station_flags
5073			    |= htole32(IWM_STA_FLG_AGG_MPDU_DENS_4US);
5074			break;
5075		case IEEE80211_AMPDU_PARAM_SS_8:
5076			add_sta_cmd.station_flags
5077			    |= htole32(IWM_STA_FLG_AGG_MPDU_DENS_8US);
5078			break;
5079		case IEEE80211_AMPDU_PARAM_SS_16:
5080			add_sta_cmd.station_flags
5081			    |= htole32(IWM_STA_FLG_AGG_MPDU_DENS_16US);
5082			break;
5083		default:
5084			break;
5085		}
5086	}
5087#endif
5088
5089	status = IWM_ADD_STA_SUCCESS;
5090	err = iwm_send_cmd_pdu_status(sc, IWM_ADD_STA, sizeof(add_sta_cmd),
5091	    &add_sta_cmd, &status);
5092	if (err == 0 && status != IWM_ADD_STA_SUCCESS)
5093		err = EIO;
5094
5095	return err;
5096}
5097
5098static int
5099iwm_add_aux_sta(struct iwm_softc *sc)
5100{
5101	struct iwm_add_sta_cmd_v7 cmd;
5102	int err;
5103	uint32_t status;
5104
5105	err = iwm_enable_txq(sc, 0, IWM_AUX_QUEUE, IWM_TX_FIFO_MCAST);
5106	if (err)
5107		return err;
5108
5109	memset(&cmd, 0, sizeof(cmd));
5110	cmd.sta_id = IWM_AUX_STA_ID;
5111	cmd.mac_id_n_color =
5112	    htole32(IWM_FW_CMD_ID_AND_COLOR(IWM_MAC_INDEX_AUX, 0));
5113	cmd.tfd_queue_msk = htole32(1 << IWM_AUX_QUEUE);
5114	cmd.tid_disable_tx = htole16(0xffff);
5115
5116	status = IWM_ADD_STA_SUCCESS;
5117	err = iwm_send_cmd_pdu_status(sc, IWM_ADD_STA, sizeof(cmd), &cmd,
5118	    &status);
5119	if (err == 0 && status != IWM_ADD_STA_SUCCESS)
5120		err = EIO;
5121
5122	return err;
5123}
5124
5125#define IWM_PLCP_QUIET_THRESH 1
5126#define IWM_ACTIVE_QUIET_TIME 10
5127#define LONG_OUT_TIME_PERIOD 600
5128#define SHORT_OUT_TIME_PERIOD 200
5129#define SUSPEND_TIME_PERIOD 100
5130
5131static uint16_t
5132iwm_scan_rx_chain(struct iwm_softc *sc)
5133{
5134	uint16_t rx_chain;
5135	uint8_t rx_ant;
5136
5137	rx_ant = iwm_fw_valid_rx_ant(sc);
5138	rx_chain = rx_ant << IWM_PHY_RX_CHAIN_VALID_POS;
5139	rx_chain |= rx_ant << IWM_PHY_RX_CHAIN_FORCE_MIMO_SEL_POS;
5140	rx_chain |= rx_ant << IWM_PHY_RX_CHAIN_FORCE_SEL_POS;
5141	rx_chain |= 0x1 << IWM_PHY_RX_CHAIN_DRIVER_FORCE_POS;
5142	return htole16(rx_chain);
5143}
5144
5145static uint32_t
5146iwm_scan_rate_n_flags(struct iwm_softc *sc, int flags, int no_cck)
5147{
5148	uint32_t tx_ant;
5149	int i, ind;
5150
5151	for (i = 0, ind = sc->sc_scan_last_antenna;
5152	    i < IWM_RATE_MCS_ANT_NUM; i++) {
5153		ind = (ind + 1) % IWM_RATE_MCS_ANT_NUM;
5154		if (iwm_fw_valid_tx_ant(sc) & (1 << ind)) {
5155			sc->sc_scan_last_antenna = ind;
5156			break;
5157		}
5158	}
5159	tx_ant = (1 << sc->sc_scan_last_antenna) << IWM_RATE_MCS_ANT_POS;
5160
5161	if ((flags & IEEE80211_CHAN_2GHZ) && !no_cck)
5162		return htole32(IWM_RATE_1M_PLCP | IWM_RATE_MCS_CCK_MSK |
5163				   tx_ant);
5164	else
5165		return htole32(IWM_RATE_6M_PLCP | tx_ant);
5166}
5167
5168#ifdef notyet
5169/*
5170 * If req->n_ssids > 0, it means we should do an active scan.
5171 * In case of active scan w/o directed scan, we receive a zero-length SSID
5172 * just to notify that this scan is active and not passive.
5173 * In order to notify the FW of the number of SSIDs we wish to scan (including
5174 * the zero-length one), we need to set the corresponding bits in chan->type,
5175 * one for each SSID, and set the active bit (first). If the first SSID is
5176 * already included in the probe template, so we need to set only
5177 * req->n_ssids - 1 bits in addition to the first bit.
5178 */
5179static uint16_t
5180iwm_get_active_dwell(struct iwm_softc *sc, int flags, int n_ssids)
5181{
5182	if (flags & IEEE80211_CHAN_2GHZ)
5183		return 30  + 3 * (n_ssids + 1);
5184	return 20  + 2 * (n_ssids + 1);
5185}
5186
5187static uint16_t
5188iwm_get_passive_dwell(struct iwm_softc *sc, int flags)
5189{
5190	return (flags & IEEE80211_CHAN_2GHZ) ? 100 + 20 : 100 + 10;
5191}
5192#endif
5193
5194static uint8_t
5195iwm_lmac_scan_fill_channels(struct iwm_softc *sc,
5196    struct iwm_scan_channel_cfg_lmac *chan, int n_ssids)
5197{
5198	struct ieee80211com *ic = &sc->sc_ic;
5199	struct ieee80211_channel *c;
5200	uint8_t nchan;
5201
5202	for (nchan = 0, c = &ic->ic_channels[1];
5203	    c <= &ic->ic_channels[IEEE80211_CHAN_MAX] &&
5204	    nchan < sc->sc_capa_n_scan_channels;
5205	    c++) {
5206		if (c->ic_flags == 0)
5207			continue;
5208
5209		chan->channel_num = htole16(ieee80211_mhz2ieee(c->ic_freq, 0));
5210		chan->iter_count = htole16(1);
5211		chan->iter_interval = htole32(0);
5212		chan->flags = htole32(IWM_UNIFIED_SCAN_CHANNEL_PARTIAL);
5213		chan->flags |= htole32(IWM_SCAN_CHANNEL_NSSIDS(n_ssids));
5214		if (!IEEE80211_IS_CHAN_PASSIVE(c) && n_ssids != 0)
5215			chan->flags |= htole32(IWM_SCAN_CHANNEL_TYPE_ACTIVE);
5216		chan++;
5217		nchan++;
5218	}
5219
5220	return nchan;
5221}
5222
5223static uint8_t
5224iwm_umac_scan_fill_channels(struct iwm_softc *sc,
5225    struct iwm_scan_channel_cfg_umac *chan, int n_ssids)
5226{
5227	struct ieee80211com *ic = &sc->sc_ic;
5228	struct ieee80211_channel *c;
5229	uint8_t nchan;
5230
5231	for (nchan = 0, c = &ic->ic_channels[1];
5232	    c <= &ic->ic_channels[IEEE80211_CHAN_MAX] &&
5233	    nchan < sc->sc_capa_n_scan_channels;
5234	    c++) {
5235		if (c->ic_flags == 0)
5236			continue;
5237
5238		chan->channel_num = ieee80211_mhz2ieee(c->ic_freq, 0);
5239		chan->iter_count = 1;
5240		chan->iter_interval = htole16(0);
5241		chan->flags = htole32(IWM_SCAN_CHANNEL_UMAC_NSSIDS(n_ssids));
5242		chan++;
5243		nchan++;
5244	}
5245
5246	return nchan;
5247}
5248
5249static int
5250iwm_fill_probe_req(struct iwm_softc *sc, struct iwm_scan_probe_req *preq)
5251{
5252	struct ieee80211com *ic = &sc->sc_ic;
5253	struct ieee80211_frame *wh = (struct ieee80211_frame *)preq->buf;
5254	struct ieee80211_rateset *rs;
5255	size_t remain = sizeof(preq->buf);
5256	uint8_t *frm, *pos;
5257
5258	memset(preq, 0, sizeof(*preq));
5259
5260	KASSERT(ic->ic_des_esslen < sizeof(ic->ic_des_essid));
5261	if (remain < sizeof(*wh) + 2 + ic->ic_des_esslen)
5262		return ENOBUFS;
5263
5264	/*
5265	 * Build a probe request frame.  Most of the following code is a
5266	 * copy & paste of what is done in net80211.
5267	 */
5268	wh->i_fc[0] = IEEE80211_FC0_VERSION_0 | IEEE80211_FC0_TYPE_MGT |
5269	    IEEE80211_FC0_SUBTYPE_PROBE_REQ;
5270	wh->i_fc[1] = IEEE80211_FC1_DIR_NODS;
5271	IEEE80211_ADDR_COPY(wh->i_addr1, etherbroadcastaddr);
5272	IEEE80211_ADDR_COPY(wh->i_addr2, ic->ic_myaddr);
5273	IEEE80211_ADDR_COPY(wh->i_addr3, etherbroadcastaddr);
5274	*(uint16_t *)&wh->i_dur[0] = 0;	/* filled by HW */
5275	*(uint16_t *)&wh->i_seq[0] = 0;	/* filled by HW */
5276
5277	frm = (uint8_t *)(wh + 1);
5278	frm = ieee80211_add_ssid(frm, ic->ic_des_essid, ic->ic_des_esslen);
5279
5280	/* Tell the firmware where the MAC header is. */
5281	preq->mac_header.offset = 0;
5282	preq->mac_header.len = htole16(frm - (uint8_t *)wh);
5283	remain -= frm - (uint8_t *)wh;
5284
5285	/* Fill in 2GHz IEs and tell firmware where they are. */
5286	rs = &ic->ic_sup_rates[IEEE80211_MODE_11G];
5287	if (rs->rs_nrates > IEEE80211_RATE_SIZE) {
5288		if (remain < 4 + rs->rs_nrates)
5289			return ENOBUFS;
5290	} else if (remain < 2 + rs->rs_nrates)
5291		return ENOBUFS;
5292	preq->band_data[0].offset = htole16(frm - (uint8_t *)wh);
5293	pos = frm;
5294	frm = ieee80211_add_rates(frm, rs);
5295	if (rs->rs_nrates > IEEE80211_RATE_SIZE)
5296		frm = ieee80211_add_xrates(frm, rs);
5297	preq->band_data[0].len = htole16(frm - pos);
5298	remain -= frm - pos;
5299
5300	if (isset(sc->sc_enabled_capa,
5301	    IWM_UCODE_TLV_CAPA_DS_PARAM_SET_IE_SUPPORT)) {
5302		if (remain < 3)
5303			return ENOBUFS;
5304		*frm++ = IEEE80211_ELEMID_DSPARMS;
5305		*frm++ = 1;
5306		*frm++ = 0;
5307		remain -= 3;
5308	}
5309
5310	if (sc->sc_nvm.sku_cap_band_52GHz_enable) {
5311		/* Fill in 5GHz IEs. */
5312		rs = &ic->ic_sup_rates[IEEE80211_MODE_11A];
5313		if (rs->rs_nrates > IEEE80211_RATE_SIZE) {
5314			if (remain < 4 + rs->rs_nrates)
5315				return ENOBUFS;
5316		} else if (remain < 2 + rs->rs_nrates)
5317			return ENOBUFS;
5318		preq->band_data[1].offset = htole16(frm - (uint8_t *)wh);
5319		pos = frm;
5320		frm = ieee80211_add_rates(frm, rs);
5321		if (rs->rs_nrates > IEEE80211_RATE_SIZE)
5322			frm = ieee80211_add_xrates(frm, rs);
5323		preq->band_data[1].len = htole16(frm - pos);
5324		remain -= frm - pos;
5325	}
5326
5327#ifndef IEEE80211_NO_HT
5328	/* Send 11n IEs on both 2GHz and 5GHz bands. */
5329	preq->common_data.offset = htole16(frm - (uint8_t *)wh);
5330	pos = frm;
5331	if (ic->ic_flags & IEEE80211_F_HTON) {
5332		if (remain < 28)
5333			return ENOBUFS;
5334		frm = ieee80211_add_htcaps(frm, ic);
5335		/* XXX add WME info? */
5336	}
5337#endif
5338
5339	preq->common_data.len = htole16(frm - pos);
5340
5341	return 0;
5342}
5343
5344static int
5345iwm_lmac_scan(struct iwm_softc *sc)
5346{
5347	struct ieee80211com *ic = &sc->sc_ic;
5348	struct iwm_host_cmd hcmd = {
5349		.id = IWM_SCAN_OFFLOAD_REQUEST_CMD,
5350		.len = { 0, },
5351		.data = { NULL, },
5352		.flags = 0,
5353	};
5354	struct iwm_scan_req_lmac *req;
5355	size_t req_len;
5356	int err;
5357
5358	DPRINTF(("%s: %s\n", DEVNAME(sc), __func__));
5359
5360	req_len = sizeof(struct iwm_scan_req_lmac) +
5361	    (sizeof(struct iwm_scan_channel_cfg_lmac) *
5362	    sc->sc_capa_n_scan_channels) + sizeof(struct iwm_scan_probe_req);
5363	if (req_len > IWM_MAX_CMD_PAYLOAD_SIZE)
5364		return ENOMEM;
5365	req = kmem_zalloc(req_len, KM_SLEEP);
5366	hcmd.len[0] = (uint16_t)req_len;
5367	hcmd.data[0] = (void *)req;
5368
5369	/* These timings correspond to iwlwifi's UNASSOC scan. */
5370	req->active_dwell = 10;
5371	req->passive_dwell = 110;
5372	req->fragmented_dwell = 44;
5373	req->extended_dwell = 90;
5374	req->max_out_time = 0;
5375	req->suspend_time = 0;
5376
5377	req->scan_prio = htole32(IWM_SCAN_PRIORITY_HIGH);
5378	req->rx_chain_select = iwm_scan_rx_chain(sc);
5379	req->iter_num = htole32(1);
5380	req->delay = 0;
5381
5382	req->scan_flags = htole32(IWM_LMAC_SCAN_FLAG_PASS_ALL |
5383	    IWM_LMAC_SCAN_FLAG_ITER_COMPLETE |
5384	    IWM_LMAC_SCAN_FLAG_EXTENDED_DWELL);
5385	if (ic->ic_des_esslen == 0)
5386		req->scan_flags |= htole32(IWM_LMAC_SCAN_FLAG_PASSIVE);
5387	else
5388		req->scan_flags |= htole32(IWM_LMAC_SCAN_FLAG_PRE_CONNECTION);
5389	if (isset(sc->sc_enabled_capa,
5390	    IWM_UCODE_TLV_CAPA_DS_PARAM_SET_IE_SUPPORT))
5391		req->scan_flags |= htole32(IWM_LMAC_SCAN_FLAGS_RRM_ENABLED);
5392
5393	req->flags = htole32(IWM_PHY_BAND_24);
5394	if (sc->sc_nvm.sku_cap_band_52GHz_enable)
5395		req->flags |= htole32(IWM_PHY_BAND_5);
5396	req->filter_flags =
5397	    htole32(IWM_MAC_FILTER_ACCEPT_GRP | IWM_MAC_FILTER_IN_BEACON);
5398
5399	/* Tx flags 2 GHz. */
5400	req->tx_cmd[0].tx_flags = htole32(IWM_TX_CMD_FLG_SEQ_CTL |
5401	    IWM_TX_CMD_FLG_BT_DIS);
5402	req->tx_cmd[0].rate_n_flags =
5403	    iwm_scan_rate_n_flags(sc, IEEE80211_CHAN_2GHZ, 1/*XXX*/);
5404	req->tx_cmd[0].sta_id = IWM_AUX_STA_ID;
5405
5406	/* Tx flags 5 GHz. */
5407	req->tx_cmd[1].tx_flags = htole32(IWM_TX_CMD_FLG_SEQ_CTL |
5408	    IWM_TX_CMD_FLG_BT_DIS);
5409	req->tx_cmd[1].rate_n_flags =
5410	    iwm_scan_rate_n_flags(sc, IEEE80211_CHAN_5GHZ, 1/*XXX*/);
5411	req->tx_cmd[1].sta_id = IWM_AUX_STA_ID;
5412
5413	/* Check if we're doing an active directed scan. */
5414	if (ic->ic_des_esslen != 0) {
5415		req->direct_scan[0].id = IEEE80211_ELEMID_SSID;
5416		req->direct_scan[0].len = ic->ic_des_esslen;
5417		memcpy(req->direct_scan[0].ssid, ic->ic_des_essid,
5418		    ic->ic_des_esslen);
5419	}
5420
5421	req->n_channels = iwm_lmac_scan_fill_channels(sc,
5422	    (struct iwm_scan_channel_cfg_lmac *)req->data,
5423	    ic->ic_des_esslen != 0);
5424
5425	err = iwm_fill_probe_req(sc,
5426	    (struct iwm_scan_probe_req *)(req->data +
5427	    (sizeof(struct iwm_scan_channel_cfg_lmac) *
5428	     sc->sc_capa_n_scan_channels)));
5429	if (err) {
5430		kmem_free(req, req_len);
5431		return err;
5432	}
5433
5434	/* Specify the scan plan: We'll do one iteration. */
5435	req->schedule[0].iterations = 1;
5436	req->schedule[0].full_scan_mul = 1;
5437
5438	/* Disable EBS. */
5439	req->channel_opt[0].non_ebs_ratio = 1;
5440	req->channel_opt[1].non_ebs_ratio = 1;
5441
5442	err = iwm_send_cmd(sc, &hcmd);
5443	kmem_free(req, req_len);
5444	return err;
5445}
5446
5447static int
5448iwm_config_umac_scan(struct iwm_softc *sc)
5449{
5450	struct ieee80211com *ic = &sc->sc_ic;
5451	struct iwm_scan_config *scan_config;
5452	int err, nchan;
5453	size_t cmd_size;
5454	struct ieee80211_channel *c;
5455	struct iwm_host_cmd hcmd = {
5456		.id = iwm_cmd_id(IWM_SCAN_CFG_CMD, IWM_ALWAYS_LONG_GROUP, 0),
5457		.flags = 0,
5458	};
5459	static const uint32_t rates = (IWM_SCAN_CONFIG_RATE_1M |
5460	    IWM_SCAN_CONFIG_RATE_2M | IWM_SCAN_CONFIG_RATE_5M |
5461	    IWM_SCAN_CONFIG_RATE_11M | IWM_SCAN_CONFIG_RATE_6M |
5462	    IWM_SCAN_CONFIG_RATE_9M | IWM_SCAN_CONFIG_RATE_12M |
5463	    IWM_SCAN_CONFIG_RATE_18M | IWM_SCAN_CONFIG_RATE_24M |
5464	    IWM_SCAN_CONFIG_RATE_36M | IWM_SCAN_CONFIG_RATE_48M |
5465	    IWM_SCAN_CONFIG_RATE_54M);
5466
5467	cmd_size = sizeof(*scan_config) + sc->sc_capa_n_scan_channels;
5468
5469	scan_config = kmem_zalloc(cmd_size, KM_SLEEP);
5470	scan_config->tx_chains = htole32(iwm_fw_valid_tx_ant(sc));
5471	scan_config->rx_chains = htole32(iwm_fw_valid_rx_ant(sc));
5472	scan_config->legacy_rates = htole32(rates |
5473	    IWM_SCAN_CONFIG_SUPPORTED_RATE(rates));
5474
5475	/* These timings correspond to iwlwifi's UNASSOC scan. */
5476	scan_config->dwell_active = 10;
5477	scan_config->dwell_passive = 110;
5478	scan_config->dwell_fragmented = 44;
5479	scan_config->dwell_extended = 90;
5480	scan_config->out_of_channel_time = htole32(0);
5481	scan_config->suspend_time = htole32(0);
5482
5483	IEEE80211_ADDR_COPY(scan_config->mac_addr, sc->sc_ic.ic_myaddr);
5484
5485	scan_config->bcast_sta_id = IWM_AUX_STA_ID;
5486	scan_config->channel_flags = IWM_CHANNEL_FLAG_EBS |
5487	    IWM_CHANNEL_FLAG_ACCURATE_EBS | IWM_CHANNEL_FLAG_EBS_ADD |
5488	    IWM_CHANNEL_FLAG_PRE_SCAN_PASSIVE2ACTIVE;
5489
5490	for (c = &ic->ic_channels[1], nchan = 0;
5491	    c <= &ic->ic_channels[IEEE80211_CHAN_MAX] &&
5492	    nchan < sc->sc_capa_n_scan_channels; c++) {
5493		if (c->ic_flags == 0)
5494			continue;
5495		scan_config->channel_array[nchan++] =
5496		    ieee80211_mhz2ieee(c->ic_freq, 0);
5497	}
5498
5499	scan_config->flags = htole32(IWM_SCAN_CONFIG_FLAG_ACTIVATE |
5500	    IWM_SCAN_CONFIG_FLAG_ALLOW_CHUB_REQS |
5501	    IWM_SCAN_CONFIG_FLAG_SET_TX_CHAINS |
5502	    IWM_SCAN_CONFIG_FLAG_SET_RX_CHAINS |
5503	    IWM_SCAN_CONFIG_FLAG_SET_AUX_STA_ID |
5504	    IWM_SCAN_CONFIG_FLAG_SET_ALL_TIMES |
5505	    IWM_SCAN_CONFIG_FLAG_SET_LEGACY_RATES |
5506	    IWM_SCAN_CONFIG_FLAG_SET_MAC_ADDR |
5507	    IWM_SCAN_CONFIG_FLAG_SET_CHANNEL_FLAGS|
5508	    IWM_SCAN_CONFIG_N_CHANNELS(nchan) |
5509	    IWM_SCAN_CONFIG_FLAG_CLEAR_FRAGMENTED);
5510
5511	hcmd.data[0] = scan_config;
5512	hcmd.len[0] = cmd_size;
5513
5514	err = iwm_send_cmd(sc, &hcmd);
5515	kmem_free(scan_config, cmd_size);
5516	return err;
5517}
5518
5519static int
5520iwm_umac_scan(struct iwm_softc *sc)
5521{
5522	struct ieee80211com *ic = &sc->sc_ic;
5523	struct iwm_host_cmd hcmd = {
5524		.id = iwm_cmd_id(IWM_SCAN_REQ_UMAC, IWM_ALWAYS_LONG_GROUP, 0),
5525		.len = { 0, },
5526		.data = { NULL, },
5527		.flags = 0,
5528	};
5529	struct iwm_scan_req_umac *req;
5530	struct iwm_scan_req_umac_tail *tail;
5531	size_t req_len;
5532	int err;
5533
5534	DPRINTF(("%s: %s\n", DEVNAME(sc), __func__));
5535
5536	req_len = sizeof(struct iwm_scan_req_umac) +
5537	    (sizeof(struct iwm_scan_channel_cfg_umac) *
5538	    sc->sc_capa_n_scan_channels) +
5539	    sizeof(struct iwm_scan_req_umac_tail);
5540	if (req_len > IWM_MAX_CMD_PAYLOAD_SIZE)
5541		return ENOMEM;
5542	req = kmem_zalloc(req_len, KM_SLEEP);
5543
5544	hcmd.len[0] = (uint16_t)req_len;
5545	hcmd.data[0] = (void *)req;
5546
5547	/* These timings correspond to iwlwifi's UNASSOC scan. */
5548	req->active_dwell = 10;
5549	req->passive_dwell = 110;
5550	req->fragmented_dwell = 44;
5551	req->extended_dwell = 90;
5552	req->max_out_time = 0;
5553	req->suspend_time = 0;
5554
5555	req->scan_priority = htole32(IWM_SCAN_PRIORITY_HIGH);
5556	req->ooc_priority = htole32(IWM_SCAN_PRIORITY_HIGH);
5557
5558	req->n_channels = iwm_umac_scan_fill_channels(sc,
5559	    (struct iwm_scan_channel_cfg_umac *)req->data,
5560	    ic->ic_des_esslen != 0);
5561
5562	req->general_flags = htole32(IWM_UMAC_SCAN_GEN_FLAGS_PASS_ALL |
5563	    IWM_UMAC_SCAN_GEN_FLAGS_ITER_COMPLETE |
5564	    IWM_UMAC_SCAN_GEN_FLAGS_EXTENDED_DWELL);
5565
5566	tail = (struct iwm_scan_req_umac_tail *)(req->data +
5567		sizeof(struct iwm_scan_channel_cfg_umac) *
5568			sc->sc_capa_n_scan_channels);
5569
5570	/* Check if we're doing an active directed scan. */
5571	if (ic->ic_des_esslen != 0) {
5572		tail->direct_scan[0].id = IEEE80211_ELEMID_SSID;
5573		tail->direct_scan[0].len = ic->ic_des_esslen;
5574		memcpy(tail->direct_scan[0].ssid, ic->ic_des_essid,
5575		    ic->ic_des_esslen);
5576		req->general_flags |=
5577		    htole32(IWM_UMAC_SCAN_GEN_FLAGS_PRE_CONNECT);
5578	} else
5579		req->general_flags |= htole32(IWM_UMAC_SCAN_GEN_FLAGS_PASSIVE);
5580
5581	if (isset(sc->sc_enabled_capa,
5582	    IWM_UCODE_TLV_CAPA_DS_PARAM_SET_IE_SUPPORT))
5583		req->general_flags |=
5584		    htole32(IWM_UMAC_SCAN_GEN_FLAGS_RRM_ENABLED);
5585
5586	err = iwm_fill_probe_req(sc, &tail->preq);
5587	if (err) {
5588		kmem_free(req, req_len);
5589		return err;
5590	}
5591
5592	/* Specify the scan plan: We'll do one iteration. */
5593	tail->schedule[0].interval = 0;
5594	tail->schedule[0].iter_count = 1;
5595
5596	err = iwm_send_cmd(sc, &hcmd);
5597	kmem_free(req, req_len);
5598	return err;
5599}
5600
5601static uint8_t
5602iwm_ridx2rate(struct ieee80211_rateset *rs, int ridx)
5603{
5604	int i;
5605	uint8_t rval;
5606
5607	for (i = 0; i < rs->rs_nrates; i++) {
5608		rval = (rs->rs_rates[i] & IEEE80211_RATE_VAL);
5609		if (rval == iwm_rates[ridx].rate)
5610			return rs->rs_rates[i];
5611	}
5612	return 0;
5613}
5614
5615static void
5616iwm_ack_rates(struct iwm_softc *sc, struct iwm_node *in, int *cck_rates,
5617    int *ofdm_rates)
5618{
5619	struct ieee80211_node *ni = &in->in_ni;
5620	struct ieee80211_rateset *rs = &ni->ni_rates;
5621	int lowest_present_ofdm = -1;
5622	int lowest_present_cck = -1;
5623	uint8_t cck = 0;
5624	uint8_t ofdm = 0;
5625	int i;
5626
5627	if (ni->ni_chan == IEEE80211_CHAN_ANYC ||
5628	    IEEE80211_IS_CHAN_2GHZ(ni->ni_chan)) {
5629		for (i = IWM_FIRST_CCK_RATE; i < IWM_FIRST_OFDM_RATE; i++) {
5630			if ((iwm_ridx2rate(rs, i) & IEEE80211_RATE_BASIC) == 0)
5631				continue;
5632			cck |= (1 << i);
5633			if (lowest_present_cck == -1 || lowest_present_cck > i)
5634				lowest_present_cck = i;
5635		}
5636	}
5637	for (i = IWM_FIRST_OFDM_RATE; i <= IWM_LAST_NON_HT_RATE; i++) {
5638		if ((iwm_ridx2rate(rs, i) & IEEE80211_RATE_BASIC) == 0)
5639			continue;
5640		ofdm |= (1 << (i - IWM_FIRST_OFDM_RATE));
5641		if (lowest_present_ofdm == -1 || lowest_present_ofdm > i)
5642			lowest_present_ofdm = i;
5643	}
5644
5645	/*
5646	 * Now we've got the basic rates as bitmaps in the ofdm and cck
5647	 * variables. This isn't sufficient though, as there might not
5648	 * be all the right rates in the bitmap. E.g. if the only basic
5649	 * rates are 5.5 Mbps and 11 Mbps, we still need to add 1 Mbps
5650	 * and 6 Mbps because the 802.11-2007 standard says in 9.6:
5651	 *
5652	 *    [...] a STA responding to a received frame shall transmit
5653	 *    its Control Response frame [...] at the highest rate in the
5654	 *    BSSBasicRateSet parameter that is less than or equal to the
5655	 *    rate of the immediately previous frame in the frame exchange
5656	 *    sequence ([...]) and that is of the same modulation class
5657	 *    ([...]) as the received frame. If no rate contained in the
5658	 *    BSSBasicRateSet parameter meets these conditions, then the
5659	 *    control frame sent in response to a received frame shall be
5660	 *    transmitted at the highest mandatory rate of the PHY that is
5661	 *    less than or equal to the rate of the received frame, and
5662	 *    that is of the same modulation class as the received frame.
5663	 *
5664	 * As a consequence, we need to add all mandatory rates that are
5665	 * lower than all of the basic rates to these bitmaps.
5666	 */
5667
5668	if (IWM_RATE_24M_INDEX < lowest_present_ofdm)
5669		ofdm |= IWM_RATE_BIT_MSK(24) >> IWM_FIRST_OFDM_RATE;
5670	if (IWM_RATE_12M_INDEX < lowest_present_ofdm)
5671		ofdm |= IWM_RATE_BIT_MSK(12) >> IWM_FIRST_OFDM_RATE;
5672	/* 6M already there or needed so always add */
5673	ofdm |= IWM_RATE_BIT_MSK(6) >> IWM_FIRST_OFDM_RATE;
5674
5675	/*
5676	 * CCK is a bit more complex with DSSS vs. HR/DSSS vs. ERP.
5677	 * Note, however:
5678	 *  - if no CCK rates are basic, it must be ERP since there must
5679	 *    be some basic rates at all, so they're OFDM => ERP PHY
5680	 *    (or we're in 5 GHz, and the cck bitmap will never be used)
5681	 *  - if 11M is a basic rate, it must be ERP as well, so add 5.5M
5682	 *  - if 5.5M is basic, 1M and 2M are mandatory
5683	 *  - if 2M is basic, 1M is mandatory
5684	 *  - if 1M is basic, that's the only valid ACK rate.
5685	 * As a consequence, it's not as complicated as it sounds, just add
5686	 * any lower rates to the ACK rate bitmap.
5687	 */
5688	if (IWM_RATE_11M_INDEX < lowest_present_cck)
5689		cck |= IWM_RATE_BIT_MSK(11) >> IWM_FIRST_CCK_RATE;
5690	if (IWM_RATE_5M_INDEX < lowest_present_cck)
5691		cck |= IWM_RATE_BIT_MSK(5) >> IWM_FIRST_CCK_RATE;
5692	if (IWM_RATE_2M_INDEX < lowest_present_cck)
5693		cck |= IWM_RATE_BIT_MSK(2) >> IWM_FIRST_CCK_RATE;
5694	/* 1M already there or needed so always add */
5695	cck |= IWM_RATE_BIT_MSK(1) >> IWM_FIRST_CCK_RATE;
5696
5697	*cck_rates = cck;
5698	*ofdm_rates = ofdm;
5699}
5700
5701static void
5702iwm_mac_ctxt_cmd_common(struct iwm_softc *sc, struct iwm_node *in,
5703    struct iwm_mac_ctx_cmd *cmd, uint32_t action, int assoc)
5704{
5705#define IWM_EXP2(x)	((1 << (x)) - 1)	/* CWmin = 2^ECWmin - 1 */
5706	struct ieee80211com *ic = &sc->sc_ic;
5707	struct ieee80211_node *ni = ic->ic_bss;
5708	int cck_ack_rates, ofdm_ack_rates;
5709	int i;
5710
5711	cmd->id_and_color = htole32(IWM_FW_CMD_ID_AND_COLOR(in->in_id,
5712	    in->in_color));
5713	cmd->action = htole32(action);
5714
5715	cmd->mac_type = htole32(IWM_FW_MAC_TYPE_BSS_STA);
5716	cmd->tsf_id = htole32(IWM_TSF_ID_A);
5717
5718	IEEE80211_ADDR_COPY(cmd->node_addr, ic->ic_myaddr);
5719	IEEE80211_ADDR_COPY(cmd->bssid_addr, ni->ni_bssid);
5720
5721	iwm_ack_rates(sc, in, &cck_ack_rates, &ofdm_ack_rates);
5722	cmd->cck_rates = htole32(cck_ack_rates);
5723	cmd->ofdm_rates = htole32(ofdm_ack_rates);
5724
5725	cmd->cck_short_preamble
5726	    = htole32((ic->ic_flags & IEEE80211_F_SHPREAMBLE)
5727	      ? IWM_MAC_FLG_SHORT_PREAMBLE : 0);
5728	cmd->short_slot
5729	    = htole32((ic->ic_flags & IEEE80211_F_SHSLOT)
5730	      ? IWM_MAC_FLG_SHORT_SLOT : 0);
5731
5732	for (i = 0; i < WME_NUM_AC; i++) {
5733		struct wmeParams *wmep = &ic->ic_wme.wme_params[i];
5734		int txf = iwm_ac_to_tx_fifo[i];
5735
5736		cmd->ac[txf].cw_min = htole16(IWM_EXP2(wmep->wmep_logcwmin));
5737		cmd->ac[txf].cw_max = htole16(IWM_EXP2(wmep->wmep_logcwmax));
5738		cmd->ac[txf].aifsn = wmep->wmep_aifsn;
5739		cmd->ac[txf].fifos_mask = (1 << txf);
5740		cmd->ac[txf].edca_txop = htole16(wmep->wmep_txopLimit * 32);
5741	}
5742	if (ni->ni_flags & IEEE80211_NODE_QOS)
5743		cmd->qos_flags |= htole32(IWM_MAC_QOS_FLG_UPDATE_EDCA);
5744
5745#ifndef IEEE80211_NO_HT
5746	if (ni->ni_flags & IEEE80211_NODE_HT) {
5747		enum ieee80211_htprot htprot =
5748		    (ni->ni_htop1 & IEEE80211_HTOP1_PROT_MASK);
5749		switch (htprot) {
5750		case IEEE80211_HTPROT_NONE:
5751			break;
5752		case IEEE80211_HTPROT_NONMEMBER:
5753		case IEEE80211_HTPROT_NONHT_MIXED:
5754			cmd->protection_flags |=
5755			    htole32(IWM_MAC_PROT_FLG_HT_PROT);
5756		case IEEE80211_HTPROT_20MHZ:
5757			cmd->protection_flags |=
5758			    htole32(IWM_MAC_PROT_FLG_HT_PROT |
5759			    IWM_MAC_PROT_FLG_FAT_PROT);
5760			break;
5761		default:
5762			break;
5763		}
5764
5765		cmd->qos_flags |= htole32(IWM_MAC_QOS_FLG_TGN);
5766	}
5767#endif
5768
5769	if (ic->ic_flags & IEEE80211_F_USEPROT)
5770		cmd->protection_flags |= htole32(IWM_MAC_PROT_FLG_TGG_PROTECT);
5771
5772	cmd->filter_flags = htole32(IWM_MAC_FILTER_ACCEPT_GRP);
5773#undef IWM_EXP2
5774}
5775
5776static void
5777iwm_mac_ctxt_cmd_fill_sta(struct iwm_softc *sc, struct iwm_node *in,
5778    struct iwm_mac_data_sta *sta, int assoc)
5779{
5780	struct ieee80211_node *ni = &in->in_ni;
5781	uint32_t dtim_off;
5782	uint64_t tsf;
5783
5784	dtim_off = ni->ni_dtim_count * ni->ni_intval * IEEE80211_DUR_TU;
5785	tsf = le64toh(ni->ni_tstamp.tsf);
5786
5787	sta->is_assoc = htole32(assoc);
5788	sta->dtim_time = htole32(ni->ni_rstamp + dtim_off);
5789	sta->dtim_tsf = htole64(tsf + dtim_off);
5790	sta->bi = htole32(ni->ni_intval);
5791	sta->bi_reciprocal = htole32(iwm_reciprocal(ni->ni_intval));
5792	sta->dtim_interval = htole32(ni->ni_intval * ni->ni_dtim_period);
5793	sta->dtim_reciprocal = htole32(iwm_reciprocal(sta->dtim_interval));
5794	sta->listen_interval = htole32(10);
5795	sta->assoc_id = htole32(ni->ni_associd);
5796	sta->assoc_beacon_arrive_time = htole32(ni->ni_rstamp);
5797}
5798
5799static int
5800iwm_mac_ctxt_cmd(struct iwm_softc *sc, struct iwm_node *in, uint32_t action,
5801    int assoc)
5802{
5803	struct ieee80211_node *ni = &in->in_ni;
5804	struct iwm_mac_ctx_cmd cmd;
5805
5806	memset(&cmd, 0, sizeof(cmd));
5807
5808	iwm_mac_ctxt_cmd_common(sc, in, &cmd, action, assoc);
5809
5810	/* Allow beacons to pass through as long as we are not associated or we
5811	 * do not have dtim period information */
5812	if (!assoc || !ni->ni_associd || !ni->ni_dtim_period)
5813		cmd.filter_flags |= htole32(IWM_MAC_FILTER_IN_BEACON);
5814	else
5815		iwm_mac_ctxt_cmd_fill_sta(sc, in, &cmd.sta, assoc);
5816
5817	return iwm_send_cmd_pdu(sc, IWM_MAC_CONTEXT_CMD, 0, sizeof(cmd), &cmd);
5818}
5819
5820#define IWM_MISSED_BEACONS_THRESHOLD 8
5821
5822static void
5823iwm_rx_missed_beacons_notif(struct iwm_softc *sc,
5824	struct iwm_rx_packet *pkt, struct iwm_rx_data *data)
5825{
5826	struct iwm_missed_beacons_notif *mb = (void *)pkt->data;
5827	int s;
5828
5829	DPRINTF(("missed bcn mac_id=%u, consecutive=%u (%u, %u, %u)\n",
5830	    le32toh(mb->mac_id),
5831	    le32toh(mb->consec_missed_beacons),
5832	    le32toh(mb->consec_missed_beacons_since_last_rx),
5833	    le32toh(mb->num_recvd_beacons),
5834	    le32toh(mb->num_expected_beacons)));
5835
5836	/*
5837	 * TODO: the threshold should be adjusted based on latency conditions,
5838	 * and/or in case of a CS flow on one of the other AP vifs.
5839	 */
5840	if (le32toh(mb->consec_missed_beacons_since_last_rx) >
5841	    IWM_MISSED_BEACONS_THRESHOLD) {
5842		s = splnet();
5843		ieee80211_beacon_miss(&sc->sc_ic);
5844		splx(s);
5845	}
5846}
5847
5848static int
5849iwm_update_quotas(struct iwm_softc *sc, struct iwm_node *in)
5850{
5851	struct iwm_time_quota_cmd cmd;
5852	int i, idx, num_active_macs, quota, quota_rem;
5853	int colors[IWM_MAX_BINDINGS] = { -1, -1, -1, -1, };
5854	int n_ifs[IWM_MAX_BINDINGS] = {0, };
5855	uint16_t id;
5856
5857	memset(&cmd, 0, sizeof(cmd));
5858
5859	/* currently, PHY ID == binding ID */
5860	if (in) {
5861		id = in->in_phyctxt->id;
5862		KASSERT(id < IWM_MAX_BINDINGS);
5863		colors[id] = in->in_phyctxt->color;
5864
5865		if (1)
5866			n_ifs[id] = 1;
5867	}
5868
5869	/*
5870	 * The FW's scheduling session consists of
5871	 * IWM_MAX_QUOTA fragments. Divide these fragments
5872	 * equally between all the bindings that require quota
5873	 */
5874	num_active_macs = 0;
5875	for (i = 0; i < IWM_MAX_BINDINGS; i++) {
5876		cmd.quotas[i].id_and_color = htole32(IWM_FW_CTXT_INVALID);
5877		num_active_macs += n_ifs[i];
5878	}
5879
5880	quota = 0;
5881	quota_rem = 0;
5882	if (num_active_macs) {
5883		quota = IWM_MAX_QUOTA / num_active_macs;
5884		quota_rem = IWM_MAX_QUOTA % num_active_macs;
5885	}
5886
5887	for (idx = 0, i = 0; i < IWM_MAX_BINDINGS; i++) {
5888		if (colors[i] < 0)
5889			continue;
5890
5891		cmd.quotas[idx].id_and_color =
5892			htole32(IWM_FW_CMD_ID_AND_COLOR(i, colors[i]));
5893
5894		if (n_ifs[i] <= 0) {
5895			cmd.quotas[idx].quota = htole32(0);
5896			cmd.quotas[idx].max_duration = htole32(0);
5897		} else {
5898			cmd.quotas[idx].quota = htole32(quota * n_ifs[i]);
5899			cmd.quotas[idx].max_duration = htole32(0);
5900		}
5901		idx++;
5902	}
5903
5904	/* Give the remainder of the session to the first binding */
5905	cmd.quotas[0].quota = htole32(le32toh(cmd.quotas[0].quota) + quota_rem);
5906
5907	return iwm_send_cmd_pdu(sc, IWM_TIME_QUOTA_CMD, 0, sizeof(cmd), &cmd);
5908}
5909
5910static int
5911iwm_auth(struct iwm_softc *sc)
5912{
5913	struct ieee80211com *ic = &sc->sc_ic;
5914	struct iwm_node *in = (struct iwm_node *)ic->ic_bss;
5915	uint32_t duration;
5916	int err;
5917
5918	err = iwm_sf_config(sc, IWM_SF_FULL_ON);
5919	if (err)
5920		return err;
5921
5922	err = iwm_allow_mcast(sc);
5923	if (err)
5924		return err;
5925
5926	sc->sc_phyctxt[0].channel = in->in_ni.ni_chan;
5927	err = iwm_phy_ctxt_cmd(sc, &sc->sc_phyctxt[0], 1, 1,
5928	    IWM_FW_CTXT_ACTION_MODIFY, 0);
5929	if (err)
5930		return err;
5931	in->in_phyctxt = &sc->sc_phyctxt[0];
5932
5933	err = iwm_mac_ctxt_cmd(sc, in, IWM_FW_CTXT_ACTION_ADD, 0);
5934	if (err) {
5935		aprint_error_dev(sc->sc_dev,
5936		    "could not add MAC context (error %d)\n", err);
5937		return err;
5938	}
5939
5940	err = iwm_binding_cmd(sc, in, IWM_FW_CTXT_ACTION_ADD);
5941	if (err)
5942		return err;
5943
5944	err = iwm_add_sta_cmd(sc, in, 0);
5945	if (err)
5946		return err;
5947
5948	err = iwm_mac_ctxt_cmd(sc, in, IWM_FW_CTXT_ACTION_MODIFY, 0);
5949	if (err) {
5950		aprint_error_dev(sc->sc_dev, "failed to update MAC\n");
5951		return err;
5952	}
5953
5954	/*
5955	 * Prevent the FW from wandering off channel during association
5956	 * by "protecting" the session with a time event.
5957	 */
5958	if (in->in_ni.ni_intval)
5959		duration = in->in_ni.ni_intval * 2;
5960	else
5961		duration = IEEE80211_DUR_TU;
5962	iwm_protect_session(sc, in, duration, in->in_ni.ni_intval / 2);
5963	DELAY(100);
5964
5965	return 0;
5966}
5967
5968static int
5969iwm_assoc(struct iwm_softc *sc)
5970{
5971	struct ieee80211com *ic = &sc->sc_ic;
5972	struct iwm_node *in = (struct iwm_node *)ic->ic_bss;
5973	int err;
5974
5975	err = iwm_add_sta_cmd(sc, in, 1);
5976	if (err)
5977		return err;
5978
5979	return 0;
5980}
5981
5982static struct ieee80211_node *
5983iwm_node_alloc(struct ieee80211_node_table *nt)
5984{
5985	return malloc(sizeof(struct iwm_node), M_80211_NODE, M_NOWAIT | M_ZERO);
5986}
5987
5988static void
5989iwm_calib_timeout(void *arg)
5990{
5991	struct iwm_softc *sc = arg;
5992	struct ieee80211com *ic = &sc->sc_ic;
5993	struct iwm_node *in = (struct iwm_node *)ic->ic_bss;
5994#ifndef IEEE80211_NO_HT
5995	struct ieee80211_node *ni = &in->in_ni;
5996	int otxrate;
5997#endif
5998	int s;
5999
6000	s = splnet();
6001	if ((ic->ic_fixed_rate == -1
6002#ifndef IEEE80211_NO_HT
6003	    || ic->ic_fixed_mcs == -1
6004#endif
6005	    ) &&
6006	    ic->ic_opmode == IEEE80211_M_STA && ic->ic_bss) {
6007#ifndef IEEE80211_NO_HT
6008		if (ni->ni_flags & IEEE80211_NODE_HT)
6009			otxrate = ni->ni_txmcs;
6010		else
6011			otxrate = ni->ni_txrate;
6012#endif
6013		ieee80211_amrr_choose(&sc->sc_amrr, &in->in_ni, &in->in_amn);
6014
6015#ifndef IEEE80211_NO_HT
6016		/*
6017		 * If AMRR has chosen a new TX rate we must update
6018		 * the firwmare's LQ rate table from process context.
6019		 */
6020		if ((ni->ni_flags & IEEE80211_NODE_HT) &&
6021		    otxrate != ni->ni_txmcs)
6022			softint_schedule(sc->setrates_task);
6023		else if (otxrate != ni->ni_txrate)
6024			softint_schedule(sc->setrates_task);
6025#endif
6026	}
6027	splx(s);
6028
6029	callout_schedule(&sc->sc_calib_to, mstohz(500));
6030}
6031
6032#ifndef IEEE80211_NO_HT
6033static void
6034iwm_setrates_task(void *arg)
6035{
6036	struct iwm_softc *sc = arg;
6037	struct ieee80211com *ic = &sc->sc_ic;
6038	struct iwm_node *in = (struct iwm_node *)ic->ic_bss;
6039
6040	/* Update rates table based on new TX rate determined by AMRR. */
6041	iwm_setrates(in);
6042}
6043
6044static int
6045iwm_setrates(struct iwm_node *in)
6046{
6047	struct ieee80211_node *ni = &in->in_ni;
6048	struct ieee80211com *ic = ni->ni_ic;
6049	struct iwm_softc *sc = IC2IFP(ic)->if_softc;
6050	struct iwm_lq_cmd *lq = &in->in_lq;
6051	struct ieee80211_rateset *rs = &ni->ni_rates;
6052	int i, j, ridx, ridx_min, tab = 0;
6053#ifndef IEEE80211_NO_HT
6054	int sgi_ok;
6055#endif
6056	struct iwm_host_cmd cmd = {
6057		.id = IWM_LQ_CMD,
6058		.len = { sizeof(in->in_lq), },
6059	};
6060
6061	memset(lq, 0, sizeof(*lq));
6062	lq->sta_id = IWM_STATION_ID;
6063
6064	if (ic->ic_flags & IEEE80211_F_USEPROT)
6065		lq->flags |= IWM_LQ_FLAG_USE_RTS_MSK;
6066
6067#ifndef IEEE80211_NO_HT
6068	sgi_ok = ((ni->ni_flags & IEEE80211_NODE_HT) &&
6069	    (ni->ni_htcaps & IEEE80211_HTCAP_SGI20));
6070#endif
6071
6072
6073	/*
6074	 * Fill the LQ rate selection table with legacy and/or HT rates
6075	 * in descending order, i.e. with the node's current TX rate first.
6076	 * In cases where throughput of an HT rate corresponds to a legacy
6077	 * rate it makes no sense to add both. We rely on the fact that
6078	 * iwm_rates is laid out such that equivalent HT/legacy rates share
6079	 * the same IWM_RATE_*_INDEX value. Also, rates not applicable to
6080	 * legacy/HT are assumed to be marked with an 'invalid' PLCP value.
6081	 */
6082	j = 0;
6083	ridx_min = (IEEE80211_IS_CHAN_5GHZ(ni->ni_chan)) ?
6084	    IWM_RIDX_OFDM : IWM_RIDX_CCK;
6085	for (ridx = IWM_RIDX_MAX; ridx >= ridx_min; ridx--) {
6086		if (j >= __arraycount(lq->rs_table))
6087			break;
6088		tab = 0;
6089#ifndef IEEE80211_NO_HT
6090		if ((ni->ni_flags & IEEE80211_NODE_HT) &&
6091		    iwm_rates[ridx].ht_plcp != IWM_RATE_HT_SISO_MCS_INV_PLCP) {
6092			for (i = ni->ni_txmcs; i >= 0; i--) {
6093				if (isclr(ni->ni_rxmcs, i))
6094					continue;
6095				if (ridx == iwm_mcs2ridx[i]) {
6096					tab = iwm_rates[ridx].ht_plcp;
6097					tab |= IWM_RATE_MCS_HT_MSK;
6098					if (sgi_ok)
6099						tab |= IWM_RATE_MCS_SGI_MSK;
6100					break;
6101				}
6102			}
6103		}
6104#endif
6105		if (tab == 0 && iwm_rates[ridx].plcp != IWM_RATE_INVM_PLCP) {
6106			for (i = ni->ni_txrate; i >= 0; i--) {
6107				if (iwm_rates[ridx].rate == (rs->rs_rates[i] &
6108				    IEEE80211_RATE_VAL)) {
6109					tab = iwm_rates[ridx].plcp;
6110					break;
6111				}
6112			}
6113		}
6114
6115		if (tab == 0)
6116			continue;
6117
6118		tab |= 1 << IWM_RATE_MCS_ANT_POS;
6119		if (IWM_RIDX_IS_CCK(ridx))
6120			tab |= IWM_RATE_MCS_CCK_MSK;
6121		DPRINTFN(2, ("station rate %d %x\n", i, tab));
6122		lq->rs_table[j++] = htole32(tab);
6123	}
6124
6125	/* Fill the rest with the lowest possible rate */
6126	i = j > 0 ? j - 1 : 0;
6127	while (j < __arraycount(lq->rs_table))
6128		lq->rs_table[j++] = lq->rs_table[i];
6129
6130	lq->single_stream_ant_msk = IWM_ANT_A;
6131	lq->dual_stream_ant_msk = IWM_ANT_AB;
6132
6133	lq->agg_time_limit = htole16(4000);	/* 4ms */
6134	lq->agg_disable_start_th = 3;
6135#ifdef notyet
6136	lq->agg_frame_cnt_limit = 0x3f;
6137#else
6138	lq->agg_frame_cnt_limit = 1; /* tx agg disabled */
6139#endif
6140
6141	cmd.data[0] = &in->in_lq;
6142	return iwm_send_cmd(sc, &cmd);
6143}
6144#endif
6145
6146static int
6147iwm_media_change(struct ifnet *ifp)
6148{
6149	struct iwm_softc *sc = ifp->if_softc;
6150	struct ieee80211com *ic = &sc->sc_ic;
6151	uint8_t rate, ridx;
6152	int err;
6153
6154	err = ieee80211_media_change(ifp);
6155	if (err != ENETRESET)
6156		return err;
6157
6158#ifndef IEEE80211_NO_HT
6159	if (ic->ic_fixed_mcs != -1)
6160		sc->sc_fixed_ridx = iwm_mcs2ridx[ic->ic_fixed_mcs];
6161	else
6162#endif
6163	if (ic->ic_fixed_rate != -1) {
6164		rate = ic->ic_sup_rates[ic->ic_curmode].
6165		    rs_rates[ic->ic_fixed_rate] & IEEE80211_RATE_VAL;
6166		/* Map 802.11 rate to HW rate index. */
6167		for (ridx = 0; ridx <= IWM_RIDX_MAX; ridx++)
6168			if (iwm_rates[ridx].rate == rate)
6169				break;
6170		sc->sc_fixed_ridx = ridx;
6171	}
6172
6173	if ((ifp->if_flags & (IFF_UP | IFF_RUNNING)) ==
6174	    (IFF_UP | IFF_RUNNING)) {
6175		iwm_stop(ifp, 0);
6176		err = iwm_init(ifp);
6177	}
6178	return err;
6179}
6180
6181static int
6182iwm_do_newstate(struct ieee80211com *ic, enum ieee80211_state nstate, int arg)
6183{
6184	struct ifnet *ifp = IC2IFP(ic);
6185	struct iwm_softc *sc = ifp->if_softc;
6186	enum ieee80211_state ostate = ic->ic_state;
6187	struct iwm_node *in;
6188	int err;
6189
6190	DPRINTF(("switching state %s->%s\n", ieee80211_state_name[ostate],
6191	    ieee80211_state_name[nstate]));
6192
6193	if (ostate == IEEE80211_S_SCAN && nstate != ostate)
6194		iwm_led_blink_stop(sc);
6195
6196	if (ostate == IEEE80211_S_RUN && nstate != ostate)
6197		iwm_disable_beacon_filter(sc);
6198
6199	/* Reset the device if moving out of AUTH, ASSOC, or RUN. */
6200	/* XXX Is there a way to switch states without a full reset? */
6201	if (ostate > IEEE80211_S_SCAN && nstate < ostate) {
6202		/*
6203		 * Upon receiving a deauth frame from AP the net80211 stack
6204		 * puts the driver into AUTH state. This will fail with this
6205		 * driver so bring the FSM from RUN to SCAN in this case.
6206		 */
6207		if (nstate != IEEE80211_S_INIT) {
6208			DPRINTF(("Force transition to INIT; MGT=%d\n", arg));
6209			/* Always pass arg as -1 since we can't Tx right now. */
6210			sc->sc_newstate(ic, IEEE80211_S_INIT, -1);
6211			iwm_stop(ifp, 0);
6212			iwm_init(ifp);
6213			return 0;
6214		}
6215
6216		iwm_stop_device(sc);
6217		iwm_init_hw(sc);
6218	}
6219
6220	switch (nstate) {
6221	case IEEE80211_S_INIT:
6222		break;
6223
6224	case IEEE80211_S_SCAN:
6225		if (ostate == nstate &&
6226		    ISSET(sc->sc_flags, IWM_FLAG_SCANNING))
6227			return 0;
6228		if (isset(sc->sc_enabled_capa, IWM_UCODE_TLV_CAPA_UMAC_SCAN))
6229			err = iwm_umac_scan(sc);
6230		else
6231			err = iwm_lmac_scan(sc);
6232		if (err) {
6233			DPRINTF(("%s: could not initiate scan: %d\n",
6234			    DEVNAME(sc), err));
6235			return err;
6236		}
6237		SET(sc->sc_flags, IWM_FLAG_SCANNING);
6238		ic->ic_state = nstate;
6239		iwm_led_blink_start(sc);
6240		return 0;
6241
6242	case IEEE80211_S_AUTH:
6243		err = iwm_auth(sc);
6244		if (err) {
6245			DPRINTF(("%s: could not move to auth state: %d\n",
6246			    DEVNAME(sc), err));
6247			return err;
6248		}
6249		break;
6250
6251	case IEEE80211_S_ASSOC:
6252		err = iwm_assoc(sc);
6253		if (err) {
6254			DPRINTF(("%s: failed to associate: %d\n", DEVNAME(sc),
6255			    err));
6256			return err;
6257		}
6258		break;
6259
6260	case IEEE80211_S_RUN:
6261		in = (struct iwm_node *)ic->ic_bss;
6262
6263		/* We have now been assigned an associd by the AP. */
6264		err = iwm_mac_ctxt_cmd(sc, in, IWM_FW_CTXT_ACTION_MODIFY, 1);
6265		if (err) {
6266			aprint_error_dev(sc->sc_dev, "failed to update MAC\n");
6267			return err;
6268		}
6269
6270		err = iwm_power_update_device(sc);
6271		if (err) {
6272			aprint_error_dev(sc->sc_dev,
6273			    "could send power command (error %d)\n", err);
6274			return err;
6275		}
6276#ifdef notyet
6277		/*
6278		 * Disabled for now. Default beacon filter settings
6279		 * prevent net80211 from getting ERP and HT protection
6280		 * updates from beacons.
6281		 */
6282		err = iwm_enable_beacon_filter(sc, in);
6283		if (err) {
6284			aprint_error_dev(sc->sc_dev,
6285			    "could not enable beacon filter\n");
6286			return err;
6287		}
6288#endif
6289		err = iwm_power_mac_update_mode(sc, in);
6290		if (err) {
6291			aprint_error_dev(sc->sc_dev,
6292			    "could not update MAC power (error %d)\n", err);
6293			return err;
6294		}
6295
6296		err = iwm_update_quotas(sc, in);
6297		if (err) {
6298			aprint_error_dev(sc->sc_dev,
6299			    "could not update quotas (error %d)\n", err);
6300			return err;
6301		}
6302
6303		ieee80211_amrr_node_init(&sc->sc_amrr, &in->in_amn);
6304
6305		/* Start at lowest available bit-rate, AMRR will raise. */
6306		in->in_ni.ni_txrate = 0;
6307#ifndef IEEE80211_NO_HT
6308		in->in_ni.ni_txmcs = 0;
6309		iwm_setrates(in);
6310#endif
6311
6312		callout_schedule(&sc->sc_calib_to, mstohz(500));
6313		iwm_led_enable(sc);
6314		break;
6315
6316	default:
6317		break;
6318	}
6319
6320	return sc->sc_newstate(ic, nstate, arg);
6321}
6322
6323static void
6324iwm_newstate_cb(struct work *wk, void *v)
6325{
6326	struct iwm_softc *sc = v;
6327	struct ieee80211com *ic = &sc->sc_ic;
6328	struct iwm_newstate_state *iwmns = (struct iwm_newstate_state *)wk;
6329	enum ieee80211_state nstate = iwmns->ns_nstate;
6330	int generation = iwmns->ns_generation;
6331	int arg = iwmns->ns_arg;
6332	int s;
6333
6334	kmem_intr_free(iwmns, sizeof(*iwmns));
6335
6336	s = splnet();
6337
6338	DPRINTF(("Prepare to switch state %d->%d\n", ic->ic_state, nstate));
6339	if (sc->sc_generation != generation) {
6340		DPRINTF(("newstate_cb: someone pulled the plug meanwhile\n"));
6341		if (nstate == IEEE80211_S_INIT) {
6342			DPRINTF(("newstate_cb: nstate == IEEE80211_S_INIT: "
6343			    "calling sc_newstate()\n"));
6344			(void) sc->sc_newstate(ic, nstate, arg);
6345		}
6346	} else
6347		(void) iwm_do_newstate(ic, nstate, arg);
6348
6349	splx(s);
6350}
6351
6352static int
6353iwm_newstate(struct ieee80211com *ic, enum ieee80211_state nstate, int arg)
6354{
6355	struct iwm_newstate_state *iwmns;
6356	struct ifnet *ifp = IC2IFP(ic);
6357	struct iwm_softc *sc = ifp->if_softc;
6358
6359	callout_stop(&sc->sc_calib_to);
6360
6361	iwmns = kmem_intr_alloc(sizeof(*iwmns), KM_NOSLEEP);
6362	if (!iwmns) {
6363		DPRINTF(("%s: allocating state cb mem failed\n", DEVNAME(sc)));
6364		return ENOMEM;
6365	}
6366
6367	iwmns->ns_nstate = nstate;
6368	iwmns->ns_arg = arg;
6369	iwmns->ns_generation = sc->sc_generation;
6370
6371	workqueue_enqueue(sc->sc_nswq, &iwmns->ns_wk, NULL);
6372
6373	return 0;
6374}
6375
6376static void
6377iwm_endscan(struct iwm_softc *sc)
6378{
6379	struct ieee80211com *ic = &sc->sc_ic;
6380	int s;
6381
6382	DPRINTF(("%s: scan ended\n", DEVNAME(sc)));
6383
6384	s = splnet();
6385	if (ic->ic_state == IEEE80211_S_SCAN)
6386		ieee80211_end_scan(ic);
6387	splx(s);
6388}
6389
6390/*
6391 * Aging and idle timeouts for the different possible scenarios
6392 * in default configuration
6393 */
6394static const uint32_t
6395iwm_sf_full_timeout_def[IWM_SF_NUM_SCENARIO][IWM_SF_NUM_TIMEOUT_TYPES] = {
6396	{
6397		htole32(IWM_SF_SINGLE_UNICAST_AGING_TIMER_DEF),
6398		htole32(IWM_SF_SINGLE_UNICAST_IDLE_TIMER_DEF)
6399	},
6400	{
6401		htole32(IWM_SF_AGG_UNICAST_AGING_TIMER_DEF),
6402		htole32(IWM_SF_AGG_UNICAST_IDLE_TIMER_DEF)
6403	},
6404	{
6405		htole32(IWM_SF_MCAST_AGING_TIMER_DEF),
6406		htole32(IWM_SF_MCAST_IDLE_TIMER_DEF)
6407	},
6408	{
6409		htole32(IWM_SF_BA_AGING_TIMER_DEF),
6410		htole32(IWM_SF_BA_IDLE_TIMER_DEF)
6411	},
6412	{
6413		htole32(IWM_SF_TX_RE_AGING_TIMER_DEF),
6414		htole32(IWM_SF_TX_RE_IDLE_TIMER_DEF)
6415	},
6416};
6417
6418/*
6419 * Aging and idle timeouts for the different possible scenarios
6420 * in single BSS MAC configuration.
6421 */
6422static const uint32_t
6423iwm_sf_full_timeout[IWM_SF_NUM_SCENARIO][IWM_SF_NUM_TIMEOUT_TYPES] = {
6424	{
6425		htole32(IWM_SF_SINGLE_UNICAST_AGING_TIMER),
6426		htole32(IWM_SF_SINGLE_UNICAST_IDLE_TIMER)
6427	},
6428	{
6429		htole32(IWM_SF_AGG_UNICAST_AGING_TIMER),
6430		htole32(IWM_SF_AGG_UNICAST_IDLE_TIMER)
6431	},
6432	{
6433		htole32(IWM_SF_MCAST_AGING_TIMER),
6434		htole32(IWM_SF_MCAST_IDLE_TIMER)
6435	},
6436	{
6437		htole32(IWM_SF_BA_AGING_TIMER),
6438		htole32(IWM_SF_BA_IDLE_TIMER)
6439	},
6440	{
6441		htole32(IWM_SF_TX_RE_AGING_TIMER),
6442		htole32(IWM_SF_TX_RE_IDLE_TIMER)
6443	},
6444};
6445
6446static void
6447iwm_fill_sf_command(struct iwm_softc *sc, struct iwm_sf_cfg_cmd *sf_cmd,
6448    struct ieee80211_node *ni)
6449{
6450	int i, j, watermark;
6451
6452	sf_cmd->watermark[IWM_SF_LONG_DELAY_ON] = htole32(IWM_SF_W_MARK_SCAN);
6453
6454	/*
6455	 * If we are in association flow - check antenna configuration
6456	 * capabilities of the AP station, and choose the watermark accordingly.
6457	 */
6458	if (ni) {
6459#ifndef IEEE80211_NO_HT
6460		if (ni->ni_flags & IEEE80211_NODE_HT) {
6461#ifdef notyet
6462			if (ni->ni_rxmcs[2] != 0)
6463				watermark = IWM_SF_W_MARK_MIMO3;
6464			else if (ni->ni_rxmcs[1] != 0)
6465				watermark = IWM_SF_W_MARK_MIMO2;
6466			else
6467#endif
6468				watermark = IWM_SF_W_MARK_SISO;
6469		} else
6470#endif
6471			watermark = IWM_SF_W_MARK_LEGACY;
6472	/* default watermark value for unassociated mode. */
6473	} else {
6474		watermark = IWM_SF_W_MARK_MIMO2;
6475	}
6476	sf_cmd->watermark[IWM_SF_FULL_ON] = htole32(watermark);
6477
6478	for (i = 0; i < IWM_SF_NUM_SCENARIO; i++) {
6479		for (j = 0; j < IWM_SF_NUM_TIMEOUT_TYPES; j++) {
6480			sf_cmd->long_delay_timeouts[i][j] =
6481					htole32(IWM_SF_LONG_DELAY_AGING_TIMER);
6482		}
6483	}
6484
6485	if (ni) {
6486		memcpy(sf_cmd->full_on_timeouts, iwm_sf_full_timeout,
6487		       sizeof(iwm_sf_full_timeout));
6488	} else {
6489		memcpy(sf_cmd->full_on_timeouts, iwm_sf_full_timeout_def,
6490		       sizeof(iwm_sf_full_timeout_def));
6491	}
6492}
6493
6494static int
6495iwm_sf_config(struct iwm_softc *sc, int new_state)
6496{
6497	struct ieee80211com *ic = &sc->sc_ic;
6498	struct iwm_sf_cfg_cmd sf_cmd = {
6499		.state = htole32(IWM_SF_FULL_ON),
6500	};
6501
6502	if (sc->sc_device_family == IWM_DEVICE_FAMILY_8000)
6503		sf_cmd.state |= htole32(IWM_SF_CFG_DUMMY_NOTIF_OFF);
6504
6505	switch (new_state) {
6506	case IWM_SF_UNINIT:
6507	case IWM_SF_INIT_OFF:
6508		iwm_fill_sf_command(sc, &sf_cmd, NULL);
6509		break;
6510	case IWM_SF_FULL_ON:
6511		iwm_fill_sf_command(sc, &sf_cmd, ic->ic_bss);
6512		break;
6513	default:
6514		return EINVAL;
6515	}
6516
6517	return iwm_send_cmd_pdu(sc, IWM_REPLY_SF_CFG_CMD, IWM_CMD_ASYNC,
6518	    sizeof(sf_cmd), &sf_cmd);
6519}
6520
6521static int
6522iwm_send_bt_init_conf(struct iwm_softc *sc)
6523{
6524	struct iwm_bt_coex_cmd bt_cmd;
6525
6526	bt_cmd.mode = htole32(IWM_BT_COEX_WIFI);
6527	bt_cmd.enabled_modules = htole32(IWM_BT_COEX_HIGH_BAND_RET);
6528
6529	return iwm_send_cmd_pdu(sc, IWM_BT_CONFIG, 0, sizeof(bt_cmd), &bt_cmd);
6530}
6531
6532static bool
6533iwm_is_lar_supported(struct iwm_softc *sc)
6534{
6535	bool nvm_lar = sc->sc_nvm.lar_enabled;
6536	bool tlv_lar = isset(sc->sc_enabled_capa,
6537	    IWM_UCODE_TLV_CAPA_LAR_SUPPORT);
6538
6539	if (iwm_lar_disable)
6540		return false;
6541
6542	/*
6543	 * Enable LAR only if it is supported by the FW (TLV) &&
6544	 * enabled in the NVM
6545	 */
6546	if (sc->sc_device_family == IWM_DEVICE_FAMILY_8000)
6547		return nvm_lar && tlv_lar;
6548	else
6549		return tlv_lar;
6550}
6551
6552static int
6553iwm_send_update_mcc_cmd(struct iwm_softc *sc, const char *alpha2)
6554{
6555	struct iwm_mcc_update_cmd mcc_cmd;
6556	struct iwm_host_cmd hcmd = {
6557		.id = IWM_MCC_UPDATE_CMD,
6558		.flags = IWM_CMD_WANT_SKB,
6559		.data = { &mcc_cmd },
6560	};
6561	int err;
6562	int resp_v2 = isset(sc->sc_enabled_capa,
6563	    IWM_UCODE_TLV_CAPA_LAR_SUPPORT_V2);
6564
6565	if (!iwm_is_lar_supported(sc)) {
6566		DPRINTF(("%s: no LAR support\n", __func__));
6567		return 0;
6568	}
6569
6570	memset(&mcc_cmd, 0, sizeof(mcc_cmd));
6571	mcc_cmd.mcc = htole16(alpha2[0] << 8 | alpha2[1]);
6572	if (isset(sc->sc_ucode_api, IWM_UCODE_TLV_API_WIFI_MCC_UPDATE) ||
6573	    isset(sc->sc_enabled_capa, IWM_UCODE_TLV_CAPA_LAR_MULTI_MCC))
6574		mcc_cmd.source_id = IWM_MCC_SOURCE_GET_CURRENT;
6575	else
6576		mcc_cmd.source_id = IWM_MCC_SOURCE_OLD_FW;
6577
6578	if (resp_v2)
6579		hcmd.len[0] = sizeof(struct iwm_mcc_update_cmd);
6580	else
6581		hcmd.len[0] = sizeof(struct iwm_mcc_update_cmd_v1);
6582
6583	err = iwm_send_cmd(sc, &hcmd);
6584	if (err)
6585		return err;
6586
6587	iwm_free_resp(sc, &hcmd);
6588
6589	return 0;
6590}
6591
6592static void
6593iwm_tt_tx_backoff(struct iwm_softc *sc, uint32_t backoff)
6594{
6595	struct iwm_host_cmd cmd = {
6596		.id = IWM_REPLY_THERMAL_MNG_BACKOFF,
6597		.len = { sizeof(uint32_t), },
6598		.data = { &backoff, },
6599	};
6600
6601	iwm_send_cmd(sc, &cmd);
6602}
6603
6604static int
6605iwm_init_hw(struct iwm_softc *sc)
6606{
6607	struct ieee80211com *ic = &sc->sc_ic;
6608	int err, i, ac;
6609
6610	err = iwm_start_hw(sc);
6611	if (err) {
6612		aprint_error_dev(sc->sc_dev, "could not initialize hardware\n");
6613		return err;
6614	}
6615
6616	err = iwm_run_init_mvm_ucode(sc, 0);
6617	if (err)
6618		return err;
6619
6620	/* Should stop and start HW since INIT image just loaded. */
6621	iwm_stop_device(sc);
6622	err = iwm_start_hw(sc);
6623	if (err) {
6624		aprint_error_dev(sc->sc_dev, "could not initialize hardware\n");
6625		return err;
6626	}
6627
6628	/* Restart, this time with the regular firmware */
6629	err = iwm_load_ucode_wait_alive(sc, IWM_UCODE_TYPE_REGULAR);
6630	if (err) {
6631		aprint_error_dev(sc->sc_dev,
6632		    "could not load firmware (error %d)\n", err);
6633		goto err;
6634	}
6635
6636	err = iwm_send_bt_init_conf(sc);
6637	if (err) {
6638		aprint_error_dev(sc->sc_dev,
6639		    "could not init bt coex (error %d)\n", err);
6640		goto err;
6641	}
6642
6643	err = iwm_send_tx_ant_cfg(sc, iwm_fw_valid_tx_ant(sc));
6644	if (err) {
6645		aprint_error_dev(sc->sc_dev,
6646		    "could not init tx ant config (error %d)\n", err);
6647		goto err;
6648	}
6649
6650	/* Send phy db control command and then phy db calibration*/
6651	err = iwm_send_phy_db_data(sc);
6652	if (err) {
6653		aprint_error_dev(sc->sc_dev,
6654		    "could not init phy db (error %d)\n", err);
6655		goto err;
6656	}
6657
6658	err = iwm_send_phy_cfg_cmd(sc);
6659	if (err) {
6660		aprint_error_dev(sc->sc_dev,
6661		    "could not send phy config (error %d)\n", err);
6662		goto err;
6663	}
6664
6665	/* Add auxiliary station for scanning */
6666	err = iwm_add_aux_sta(sc);
6667	if (err) {
6668		aprint_error_dev(sc->sc_dev,
6669		    "could not add aux station (error %d)\n", err);
6670		goto err;
6671	}
6672
6673	for (i = 0; i < IWM_NUM_PHY_CTX; i++) {
6674		/*
6675		 * The channel used here isn't relevant as it's
6676		 * going to be overwritten in the other flows.
6677		 * For now use the first channel we have.
6678		 */
6679		sc->sc_phyctxt[i].channel = &ic->ic_channels[1];
6680		err = iwm_phy_ctxt_cmd(sc, &sc->sc_phyctxt[i], 1, 1,
6681		    IWM_FW_CTXT_ACTION_ADD, 0);
6682		if (err) {
6683			aprint_error_dev(sc->sc_dev,
6684			    "could not add phy context %d (error %d)\n",
6685			    i, err);
6686			goto err;
6687		}
6688	}
6689
6690	/* Initialize tx backoffs to the minimum. */
6691	if (sc->sc_device_family == IWM_DEVICE_FAMILY_7000)
6692		iwm_tt_tx_backoff(sc, 0);
6693
6694	err = iwm_power_update_device(sc);
6695	if (err) {
6696		aprint_error_dev(sc->sc_dev,
6697		    "could send power command (error %d)\n", err);
6698		goto err;
6699	}
6700
6701	err = iwm_send_update_mcc_cmd(sc, iwm_default_mcc);
6702	if (err) {
6703		aprint_error_dev(sc->sc_dev,
6704		    "could not init LAR (error %d)\n", err);
6705		goto err;
6706	}
6707
6708	if (isset(sc->sc_enabled_capa, IWM_UCODE_TLV_CAPA_UMAC_SCAN)) {
6709		err = iwm_config_umac_scan(sc);
6710		if (err) {
6711			aprint_error_dev(sc->sc_dev,
6712			    "could not configure scan (error %d)\n", err);
6713			goto err;
6714		}
6715	}
6716
6717	for (ac = 0; ac < WME_NUM_AC; ac++) {
6718		err = iwm_enable_txq(sc, IWM_STATION_ID, ac,
6719		    iwm_ac_to_tx_fifo[ac]);
6720		if (err) {
6721			aprint_error_dev(sc->sc_dev,
6722			    "could not enable Tx queue %d (error %d)\n",
6723			    i, err);
6724			goto err;
6725		}
6726	}
6727
6728	err = iwm_disable_beacon_filter(sc);
6729	if (err) {
6730		aprint_error_dev(sc->sc_dev,
6731		    "could not disable beacon filter (error %d)\n", err);
6732		goto err;
6733	}
6734
6735	return 0;
6736
6737 err:
6738	iwm_stop_device(sc);
6739	return err;
6740}
6741
6742/* Allow multicast from our BSSID. */
6743static int
6744iwm_allow_mcast(struct iwm_softc *sc)
6745{
6746	struct ieee80211com *ic = &sc->sc_ic;
6747	struct ieee80211_node *ni = ic->ic_bss;
6748	struct iwm_mcast_filter_cmd *cmd;
6749	size_t size;
6750	int err;
6751
6752	size = roundup(sizeof(*cmd), 4);
6753	cmd = kmem_intr_zalloc(size, KM_NOSLEEP);
6754	if (cmd == NULL)
6755		return ENOMEM;
6756	cmd->filter_own = 1;
6757	cmd->port_id = 0;
6758	cmd->count = 0;
6759	cmd->pass_all = 1;
6760	IEEE80211_ADDR_COPY(cmd->bssid, ni->ni_bssid);
6761
6762	err = iwm_send_cmd_pdu(sc, IWM_MCAST_FILTER_CMD, 0, size, cmd);
6763	kmem_intr_free(cmd, size);
6764	return err;
6765}
6766
6767static int
6768iwm_init(struct ifnet *ifp)
6769{
6770	struct iwm_softc *sc = ifp->if_softc;
6771	int err;
6772
6773	if (ISSET(sc->sc_flags, IWM_FLAG_HW_INITED))
6774		return 0;
6775
6776	sc->sc_generation++;
6777	sc->sc_flags &= ~IWM_FLAG_STOPPED;
6778
6779	err = iwm_init_hw(sc);
6780	if (err) {
6781		iwm_stop(ifp, 1);
6782		return err;
6783	}
6784
6785	ifp->if_flags &= ~IFF_OACTIVE;
6786	ifp->if_flags |= IFF_RUNNING;
6787
6788	ieee80211_begin_scan(&sc->sc_ic, 0);
6789	SET(sc->sc_flags, IWM_FLAG_HW_INITED);
6790
6791	return 0;
6792}
6793
6794static void
6795iwm_start(struct ifnet *ifp)
6796{
6797	struct iwm_softc *sc = ifp->if_softc;
6798	struct ieee80211com *ic = &sc->sc_ic;
6799	struct ieee80211_node *ni;
6800	struct ether_header *eh;
6801	struct mbuf *m;
6802	int ac;
6803
6804	if ((ifp->if_flags & (IFF_RUNNING | IFF_OACTIVE)) != IFF_RUNNING)
6805		return;
6806
6807	for (;;) {
6808		/* why isn't this done per-queue? */
6809		if (sc->qfullmsk != 0) {
6810			ifp->if_flags |= IFF_OACTIVE;
6811			break;
6812		}
6813
6814		/* need to send management frames even if we're not RUNning */
6815		IF_DEQUEUE(&ic->ic_mgtq, m);
6816		if (m) {
6817			ni = M_GETCTX(m, struct ieee80211_node *);
6818			M_CLEARCTX(m);
6819			ac = WME_AC_BE;
6820			goto sendit;
6821		}
6822		if (ic->ic_state != IEEE80211_S_RUN) {
6823			break;
6824		}
6825
6826		IFQ_DEQUEUE(&ifp->if_snd, m);
6827		if (m == NULL)
6828			break;
6829
6830		if (m->m_len < sizeof (*eh) &&
6831		   (m = m_pullup(m, sizeof (*eh))) == NULL) {
6832			if_statinc(ifp, if_oerrors);
6833			continue;
6834		}
6835
6836		eh = mtod(m, struct ether_header *);
6837		ni = ieee80211_find_txnode(ic, eh->ether_dhost);
6838		if (ni == NULL) {
6839			m_freem(m);
6840			if_statinc(ifp, if_oerrors);
6841			continue;
6842		}
6843
6844		/* classify mbuf so we can find which tx ring to use */
6845		if (ieee80211_classify(ic, m, ni) != 0) {
6846			m_freem(m);
6847			ieee80211_free_node(ni);
6848			if_statinc(ifp, if_oerrors);
6849			continue;
6850		}
6851
6852		/* No QoS encapsulation for EAPOL frames. */
6853		ac = (eh->ether_type != htons(ETHERTYPE_PAE)) ?
6854		    M_WME_GETAC(m) : WME_AC_BE;
6855
6856		bpf_mtap(ifp, m, BPF_D_OUT);
6857
6858		if ((m = ieee80211_encap(ic, m, ni)) == NULL) {
6859			ieee80211_free_node(ni);
6860			if_statinc(ifp, if_oerrors);
6861			continue;
6862		}
6863
6864 sendit:
6865		bpf_mtap3(ic->ic_rawbpf, m, BPF_D_OUT);
6866
6867		if (iwm_tx(sc, m, ni, ac) != 0) {
6868			ieee80211_free_node(ni);
6869			if_statinc(ifp, if_oerrors);
6870			continue;
6871		}
6872
6873		if (ifp->if_flags & IFF_UP) {
6874			sc->sc_tx_timer = 15;
6875			ifp->if_timer = 1;
6876		}
6877	}
6878}
6879
6880static void
6881iwm_stop(struct ifnet *ifp, int disable)
6882{
6883	struct iwm_softc *sc = ifp->if_softc;
6884	struct ieee80211com *ic = &sc->sc_ic;
6885	struct iwm_node *in = (struct iwm_node *)ic->ic_bss;
6886
6887	sc->sc_flags &= ~IWM_FLAG_HW_INITED;
6888	sc->sc_flags |= IWM_FLAG_STOPPED;
6889	sc->sc_generation++;
6890	ifp->if_flags &= ~(IFF_RUNNING | IFF_OACTIVE);
6891
6892	if (in)
6893		in->in_phyctxt = NULL;
6894
6895	if (ic->ic_state != IEEE80211_S_INIT)
6896		ieee80211_new_state(ic, IEEE80211_S_INIT, -1);
6897
6898	callout_stop(&sc->sc_calib_to);
6899	iwm_led_blink_stop(sc);
6900	ifp->if_timer = sc->sc_tx_timer = 0;
6901	iwm_stop_device(sc);
6902}
6903
6904static void
6905iwm_watchdog(struct ifnet *ifp)
6906{
6907	struct iwm_softc *sc = ifp->if_softc;
6908
6909	ifp->if_timer = 0;
6910	if (sc->sc_tx_timer > 0) {
6911		if (--sc->sc_tx_timer == 0) {
6912			aprint_error_dev(sc->sc_dev, "device timeout\n");
6913#ifdef IWM_DEBUG
6914			iwm_nic_error(sc);
6915#endif
6916			ifp->if_flags &= ~IFF_UP;
6917			iwm_stop(ifp, 1);
6918			if_statinc(ifp, if_oerrors);
6919			return;
6920		}
6921		ifp->if_timer = 1;
6922	}
6923
6924	ieee80211_watchdog(&sc->sc_ic);
6925}
6926
6927static int
6928iwm_ioctl(struct ifnet *ifp, u_long cmd, void *data)
6929{
6930	struct iwm_softc *sc = ifp->if_softc;
6931	struct ieee80211com *ic = &sc->sc_ic;
6932	const struct sockaddr *sa;
6933	int s, err = 0;
6934
6935	s = splnet();
6936
6937	switch (cmd) {
6938	case SIOCSIFADDR:
6939		ifp->if_flags |= IFF_UP;
6940		/* FALLTHROUGH */
6941	case SIOCSIFFLAGS:
6942		err = ifioctl_common(ifp, cmd, data);
6943		if (err)
6944			break;
6945		if (ifp->if_flags & IFF_UP) {
6946			if (!(ifp->if_flags & IFF_RUNNING)) {
6947				err = iwm_init(ifp);
6948				if (err)
6949					ifp->if_flags &= ~IFF_UP;
6950			}
6951		} else {
6952			if (ifp->if_flags & IFF_RUNNING)
6953				iwm_stop(ifp, 1);
6954		}
6955		break;
6956
6957	case SIOCADDMULTI:
6958	case SIOCDELMULTI:
6959		sa = ifreq_getaddr(SIOCADDMULTI, (struct ifreq *)data);
6960		err = (cmd == SIOCADDMULTI) ?
6961		    ether_addmulti(sa, &sc->sc_ec) :
6962		    ether_delmulti(sa, &sc->sc_ec);
6963		if (err == ENETRESET)
6964			err = 0;
6965		break;
6966
6967	default:
6968		err = ieee80211_ioctl(ic, cmd, data);
6969		break;
6970	}
6971
6972	if (err == ENETRESET) {
6973		err = 0;
6974		if ((ifp->if_flags & (IFF_UP | IFF_RUNNING)) ==
6975		    (IFF_UP | IFF_RUNNING)) {
6976			iwm_stop(ifp, 0);
6977			err = iwm_init(ifp);
6978		}
6979	}
6980
6981	splx(s);
6982	return err;
6983}
6984
6985/*
6986 * Note: This structure is read from the device with IO accesses,
6987 * and the reading already does the endian conversion. As it is
6988 * read with uint32_t-sized accesses, any members with a different size
6989 * need to be ordered correctly though!
6990 */
6991struct iwm_error_event_table {
6992	uint32_t valid;		/* (nonzero) valid, (0) log is empty */
6993	uint32_t error_id;		/* type of error */
6994	uint32_t trm_hw_status0;	/* TRM HW status */
6995	uint32_t trm_hw_status1;	/* TRM HW status */
6996	uint32_t blink2;		/* branch link */
6997	uint32_t ilink1;		/* interrupt link */
6998	uint32_t ilink2;		/* interrupt link */
6999	uint32_t data1;		/* error-specific data */
7000	uint32_t data2;		/* error-specific data */
7001	uint32_t data3;		/* error-specific data */
7002	uint32_t bcon_time;		/* beacon timer */
7003	uint32_t tsf_low;		/* network timestamp function timer */
7004	uint32_t tsf_hi;		/* network timestamp function timer */
7005	uint32_t gp1;		/* GP1 timer register */
7006	uint32_t gp2;		/* GP2 timer register */
7007	uint32_t fw_rev_type;	/* firmware revision type */
7008	uint32_t major;		/* uCode version major */
7009	uint32_t minor;		/* uCode version minor */
7010	uint32_t hw_ver;		/* HW Silicon version */
7011	uint32_t brd_ver;		/* HW board version */
7012	uint32_t log_pc;		/* log program counter */
7013	uint32_t frame_ptr;		/* frame pointer */
7014	uint32_t stack_ptr;		/* stack pointer */
7015	uint32_t hcmd;		/* last host command header */
7016	uint32_t isr0;		/* isr status register LMPM_NIC_ISR0:
7017				 * rxtx_flag */
7018	uint32_t isr1;		/* isr status register LMPM_NIC_ISR1:
7019				 * host_flag */
7020	uint32_t isr2;		/* isr status register LMPM_NIC_ISR2:
7021				 * enc_flag */
7022	uint32_t isr3;		/* isr status register LMPM_NIC_ISR3:
7023				 * time_flag */
7024	uint32_t isr4;		/* isr status register LMPM_NIC_ISR4:
7025				 * wico interrupt */
7026	uint32_t last_cmd_id;	/* last HCMD id handled by the firmware */
7027	uint32_t wait_event;		/* wait event() caller address */
7028	uint32_t l2p_control;	/* L2pControlField */
7029	uint32_t l2p_duration;	/* L2pDurationField */
7030	uint32_t l2p_mhvalid;	/* L2pMhValidBits */
7031	uint32_t l2p_addr_match;	/* L2pAddrMatchStat */
7032	uint32_t lmpm_pmg_sel;	/* indicate which clocks are turned on
7033				 * (LMPM_PMG_SEL) */
7034	uint32_t u_timestamp;	/* indicate when the date and time of the
7035				 * compilation */
7036	uint32_t flow_handler;	/* FH read/write pointers, RX credit */
7037} __packed /* LOG_ERROR_TABLE_API_S_VER_3 */;
7038
7039/*
7040 * UMAC error struct - relevant starting from family 8000 chip.
7041 * Note: This structure is read from the device with IO accesses,
7042 * and the reading already does the endian conversion. As it is
7043 * read with u32-sized accesses, any members with a different size
7044 * need to be ordered correctly though!
7045 */
7046struct iwm_umac_error_event_table {
7047	uint32_t valid;		/* (nonzero) valid, (0) log is empty */
7048	uint32_t error_id;	/* type of error */
7049	uint32_t blink1;	/* branch link */
7050	uint32_t blink2;	/* branch link */
7051	uint32_t ilink1;	/* interrupt link */
7052	uint32_t ilink2;	/* interrupt link */
7053	uint32_t data1;		/* error-specific data */
7054	uint32_t data2;		/* error-specific data */
7055	uint32_t data3;		/* error-specific data */
7056	uint32_t umac_major;
7057	uint32_t umac_minor;
7058	uint32_t frame_pointer;	/* core register 27 */
7059	uint32_t stack_pointer;	/* core register 28 */
7060	uint32_t cmd_header;	/* latest host cmd sent to UMAC */
7061	uint32_t nic_isr_pref;	/* ISR status register */
7062} __packed;
7063
7064#define ERROR_START_OFFSET  (1 * sizeof(uint32_t))
7065#define ERROR_ELEM_SIZE     (7 * sizeof(uint32_t))
7066
7067#ifdef IWM_DEBUG
7068static const struct {
7069	const char *name;
7070	uint8_t num;
7071} advanced_lookup[] = {
7072	{ "NMI_INTERRUPT_WDG", 0x34 },
7073	{ "SYSASSERT", 0x35 },
7074	{ "UCODE_VERSION_MISMATCH", 0x37 },
7075	{ "BAD_COMMAND", 0x38 },
7076	{ "NMI_INTERRUPT_DATA_ACTION_PT", 0x3C },
7077	{ "FATAL_ERROR", 0x3D },
7078	{ "NMI_TRM_HW_ERR", 0x46 },
7079	{ "NMI_INTERRUPT_TRM", 0x4C },
7080	{ "NMI_INTERRUPT_BREAK_POINT", 0x54 },
7081	{ "NMI_INTERRUPT_WDG_RXF_FULL", 0x5C },
7082	{ "NMI_INTERRUPT_WDG_NO_RBD_RXF_FULL", 0x64 },
7083	{ "NMI_INTERRUPT_HOST", 0x66 },
7084	{ "NMI_INTERRUPT_ACTION_PT", 0x7C },
7085	{ "NMI_INTERRUPT_UNKNOWN", 0x84 },
7086	{ "NMI_INTERRUPT_INST_ACTION_PT", 0x86 },
7087	{ "ADVANCED_SYSASSERT", 0 },
7088};
7089
7090static const char *
7091iwm_desc_lookup(uint32_t num)
7092{
7093	int i;
7094
7095	for (i = 0; i < __arraycount(advanced_lookup) - 1; i++)
7096		if (advanced_lookup[i].num == num)
7097			return advanced_lookup[i].name;
7098
7099	/* No entry matches 'num', so it is the last: ADVANCED_SYSASSERT */
7100	return advanced_lookup[i].name;
7101}
7102
7103/*
7104 * Support for dumping the error log seemed like a good idea ...
7105 * but it's mostly hex junk and the only sensible thing is the
7106 * hw/ucode revision (which we know anyway).  Since it's here,
7107 * I'll just leave it in, just in case e.g. the Intel guys want to
7108 * help us decipher some "ADVANCED_SYSASSERT" later.
7109 */
7110static void
7111iwm_nic_error(struct iwm_softc *sc)
7112{
7113	struct iwm_error_event_table t;
7114	uint32_t base;
7115
7116	aprint_error_dev(sc->sc_dev, "dumping device error log\n");
7117	base = sc->sc_uc.uc_error_event_table;
7118	if (base < 0x800000) {
7119		aprint_error_dev(sc->sc_dev,
7120		    "Invalid error log pointer 0x%08x\n", base);
7121		return;
7122	}
7123
7124	if (iwm_read_mem(sc, base, &t, sizeof(t)/sizeof(uint32_t))) {
7125		aprint_error_dev(sc->sc_dev, "reading errlog failed\n");
7126		return;
7127	}
7128
7129	if (!t.valid) {
7130		aprint_error_dev(sc->sc_dev, "errlog not found, skipping\n");
7131		return;
7132	}
7133
7134	if (ERROR_START_OFFSET <= t.valid * ERROR_ELEM_SIZE) {
7135		aprint_error_dev(sc->sc_dev, "Start Error Log Dump:\n");
7136		aprint_error_dev(sc->sc_dev, "Status: 0x%x, count: %d\n",
7137		    sc->sc_flags, t.valid);
7138	}
7139
7140	aprint_error_dev(sc->sc_dev, "%08X | %-28s\n", t.error_id,
7141	    iwm_desc_lookup(t.error_id));
7142	aprint_error_dev(sc->sc_dev, "%08X | trm_hw_status0\n",
7143	    t.trm_hw_status0);
7144	aprint_error_dev(sc->sc_dev, "%08X | trm_hw_status1\n",
7145	    t.trm_hw_status1);
7146	aprint_error_dev(sc->sc_dev, "%08X | branchlink2\n", t.blink2);
7147	aprint_error_dev(sc->sc_dev, "%08X | interruptlink1\n", t.ilink1);
7148	aprint_error_dev(sc->sc_dev, "%08X | interruptlink2\n", t.ilink2);
7149	aprint_error_dev(sc->sc_dev, "%08X | data1\n", t.data1);
7150	aprint_error_dev(sc->sc_dev, "%08X | data2\n", t.data2);
7151	aprint_error_dev(sc->sc_dev, "%08X | data3\n", t.data3);
7152	aprint_error_dev(sc->sc_dev, "%08X | beacon time\n", t.bcon_time);
7153	aprint_error_dev(sc->sc_dev, "%08X | tsf low\n", t.tsf_low);
7154	aprint_error_dev(sc->sc_dev, "%08X | tsf hi\n", t.tsf_hi);
7155	aprint_error_dev(sc->sc_dev, "%08X | time gp1\n", t.gp1);
7156	aprint_error_dev(sc->sc_dev, "%08X | time gp2\n", t.gp2);
7157	aprint_error_dev(sc->sc_dev, "%08X | uCode revision type\n",
7158	    t.fw_rev_type);
7159	aprint_error_dev(sc->sc_dev, "%08X | uCode version major\n",
7160	    t.major);
7161	aprint_error_dev(sc->sc_dev, "%08X | uCode version minor\n",
7162	    t.minor);
7163	aprint_error_dev(sc->sc_dev, "%08X | hw version\n", t.hw_ver);
7164	aprint_error_dev(sc->sc_dev, "%08X | board version\n", t.brd_ver);
7165	aprint_error_dev(sc->sc_dev, "%08X | hcmd\n", t.hcmd);
7166	aprint_error_dev(sc->sc_dev, "%08X | isr0\n", t.isr0);
7167	aprint_error_dev(sc->sc_dev, "%08X | isr1\n", t.isr1);
7168	aprint_error_dev(sc->sc_dev, "%08X | isr2\n", t.isr2);
7169	aprint_error_dev(sc->sc_dev, "%08X | isr3\n", t.isr3);
7170	aprint_error_dev(sc->sc_dev, "%08X | isr4\n", t.isr4);
7171	aprint_error_dev(sc->sc_dev, "%08X | last cmd Id\n", t.last_cmd_id);
7172	aprint_error_dev(sc->sc_dev, "%08X | wait_event\n", t.wait_event);
7173	aprint_error_dev(sc->sc_dev, "%08X | l2p_control\n", t.l2p_control);
7174	aprint_error_dev(sc->sc_dev, "%08X | l2p_duration\n", t.l2p_duration);
7175	aprint_error_dev(sc->sc_dev, "%08X | l2p_mhvalid\n", t.l2p_mhvalid);
7176	aprint_error_dev(sc->sc_dev, "%08X | l2p_addr_match\n",
7177	    t.l2p_addr_match);
7178	aprint_error_dev(sc->sc_dev, "%08X | lmpm_pmg_sel\n", t.lmpm_pmg_sel);
7179	aprint_error_dev(sc->sc_dev, "%08X | timestamp\n", t.u_timestamp);
7180	aprint_error_dev(sc->sc_dev, "%08X | flow_handler\n", t.flow_handler);
7181
7182	if (sc->sc_uc.uc_umac_error_event_table)
7183		iwm_nic_umac_error(sc);
7184}
7185
7186static void
7187iwm_nic_umac_error(struct iwm_softc *sc)
7188{
7189	struct iwm_umac_error_event_table t;
7190	uint32_t base;
7191
7192	base = sc->sc_uc.uc_umac_error_event_table;
7193
7194	if (base < 0x800000) {
7195		aprint_error_dev(sc->sc_dev,
7196		    "Invalid error log pointer 0x%08x\n", base);
7197		return;
7198	}
7199
7200	if (iwm_read_mem(sc, base, &t, sizeof(t)/sizeof(uint32_t))) {
7201		aprint_error_dev(sc->sc_dev, "reading errlog failed\n");
7202		return;
7203	}
7204
7205	if (ERROR_START_OFFSET <= t.valid * ERROR_ELEM_SIZE) {
7206		aprint_error_dev(sc->sc_dev, "Start UMAC Error Log Dump:\n");
7207		aprint_error_dev(sc->sc_dev, "Status: 0x%x, count: %d\n",
7208		    sc->sc_flags, t.valid);
7209	}
7210
7211	aprint_error_dev(sc->sc_dev, "0x%08X | %s\n", t.error_id,
7212		iwm_desc_lookup(t.error_id));
7213	aprint_error_dev(sc->sc_dev, "0x%08X | umac branchlink1\n", t.blink1);
7214	aprint_error_dev(sc->sc_dev, "0x%08X | umac branchlink2\n", t.blink2);
7215	aprint_error_dev(sc->sc_dev, "0x%08X | umac interruptlink1\n",
7216	    t.ilink1);
7217	aprint_error_dev(sc->sc_dev, "0x%08X | umac interruptlink2\n",
7218	    t.ilink2);
7219	aprint_error_dev(sc->sc_dev, "0x%08X | umac data1\n", t.data1);
7220	aprint_error_dev(sc->sc_dev, "0x%08X | umac data2\n", t.data2);
7221	aprint_error_dev(sc->sc_dev, "0x%08X | umac data3\n", t.data3);
7222	aprint_error_dev(sc->sc_dev, "0x%08X | umac major\n", t.umac_major);
7223	aprint_error_dev(sc->sc_dev, "0x%08X | umac minor\n", t.umac_minor);
7224	aprint_error_dev(sc->sc_dev, "0x%08X | frame pointer\n",
7225	    t.frame_pointer);
7226	aprint_error_dev(sc->sc_dev, "0x%08X | stack pointer\n",
7227	    t.stack_pointer);
7228	aprint_error_dev(sc->sc_dev, "0x%08X | last host cmd\n", t.cmd_header);
7229	aprint_error_dev(sc->sc_dev, "0x%08X | isr status reg\n",
7230	    t.nic_isr_pref);
7231}
7232#endif
7233
7234#define SYNC_RESP_STRUCT(_var_, _pkt_)					\
7235do {									\
7236	bus_dmamap_sync(sc->sc_dmat, data->map, sizeof(*(_pkt_)),	\
7237	    sizeof(*(_var_)), BUS_DMASYNC_POSTREAD);			\
7238	_var_ = (void *)((_pkt_)+1);					\
7239} while (/*CONSTCOND*/0)
7240
7241#define SYNC_RESP_PTR(_ptr_, _len_, _pkt_)				\
7242do {									\
7243	bus_dmamap_sync(sc->sc_dmat, data->map, sizeof(*(_pkt_)),	\
7244	    sizeof(len), BUS_DMASYNC_POSTREAD);				\
7245	_ptr_ = (void *)((_pkt_)+1);					\
7246} while (/*CONSTCOND*/0)
7247
7248#define ADVANCE_RXQ(sc) (sc->rxq.cur = (sc->rxq.cur + 1) % IWM_RX_RING_COUNT);
7249
7250static void
7251iwm_notif_intr(struct iwm_softc *sc)
7252{
7253	uint16_t hw;
7254
7255	bus_dmamap_sync(sc->sc_dmat, sc->rxq.stat_dma.map,
7256	    0, sc->rxq.stat_dma.size, BUS_DMASYNC_POSTREAD);
7257
7258	hw = le16toh(sc->rxq.stat->closed_rb_num) & 0xfff;
7259	while (sc->rxq.cur != hw) {
7260		struct iwm_rx_data *data = &sc->rxq.data[sc->rxq.cur];
7261		struct iwm_rx_packet *pkt;
7262		struct iwm_cmd_response *cresp;
7263		int orig_qid, qid, idx, code;
7264
7265		bus_dmamap_sync(sc->sc_dmat, data->map, 0, sizeof(*pkt),
7266		    BUS_DMASYNC_POSTREAD);
7267		pkt = mtod(data->m, struct iwm_rx_packet *);
7268
7269		orig_qid = pkt->hdr.qid;
7270		qid = orig_qid & ~0x80;
7271		idx = pkt->hdr.idx;
7272
7273		code = IWM_WIDE_ID(pkt->hdr.flags, pkt->hdr.code);
7274
7275		/*
7276		 * randomly get these from the firmware, no idea why.
7277		 * they at least seem harmless, so just ignore them for now
7278		 */
7279		if (__predict_false((pkt->hdr.code == 0 && qid == 0 && idx == 0)
7280		    || pkt->len_n_flags == htole32(0x55550000))) {
7281			ADVANCE_RXQ(sc);
7282			continue;
7283		}
7284
7285		switch (code) {
7286		case IWM_REPLY_RX_PHY_CMD:
7287			iwm_rx_rx_phy_cmd(sc, pkt, data);
7288			break;
7289
7290		case IWM_REPLY_RX_MPDU_CMD:
7291			iwm_rx_rx_mpdu(sc, pkt, data);
7292			break;
7293
7294		case IWM_TX_CMD:
7295			iwm_rx_tx_cmd(sc, pkt, data);
7296			break;
7297
7298		case IWM_MISSED_BEACONS_NOTIFICATION:
7299			iwm_rx_missed_beacons_notif(sc, pkt, data);
7300			break;
7301
7302		case IWM_MFUART_LOAD_NOTIFICATION:
7303			break;
7304
7305		case IWM_ALIVE: {
7306			struct iwm_alive_resp_v1 *resp1;
7307			struct iwm_alive_resp_v2 *resp2;
7308			struct iwm_alive_resp_v3 *resp3;
7309
7310			if (iwm_rx_packet_payload_len(pkt) == sizeof(*resp1)) {
7311				SYNC_RESP_STRUCT(resp1, pkt);
7312				sc->sc_uc.uc_error_event_table
7313				    = le32toh(resp1->error_event_table_ptr);
7314				sc->sc_uc.uc_log_event_table
7315				    = le32toh(resp1->log_event_table_ptr);
7316				sc->sched_base = le32toh(resp1->scd_base_ptr);
7317				if (resp1->status == IWM_ALIVE_STATUS_OK)
7318					sc->sc_uc.uc_ok = 1;
7319				else
7320					sc->sc_uc.uc_ok = 0;
7321			}
7322			if (iwm_rx_packet_payload_len(pkt) == sizeof(*resp2)) {
7323				SYNC_RESP_STRUCT(resp2, pkt);
7324				sc->sc_uc.uc_error_event_table
7325				    = le32toh(resp2->error_event_table_ptr);
7326				sc->sc_uc.uc_log_event_table
7327				    = le32toh(resp2->log_event_table_ptr);
7328				sc->sched_base = le32toh(resp2->scd_base_ptr);
7329				sc->sc_uc.uc_umac_error_event_table
7330				    = le32toh(resp2->error_info_addr);
7331				if (resp2->status == IWM_ALIVE_STATUS_OK)
7332					sc->sc_uc.uc_ok = 1;
7333				else
7334					sc->sc_uc.uc_ok = 0;
7335			}
7336			if (iwm_rx_packet_payload_len(pkt) == sizeof(*resp3)) {
7337				SYNC_RESP_STRUCT(resp3, pkt);
7338				sc->sc_uc.uc_error_event_table
7339				    = le32toh(resp3->error_event_table_ptr);
7340				sc->sc_uc.uc_log_event_table
7341				    = le32toh(resp3->log_event_table_ptr);
7342				sc->sched_base = le32toh(resp3->scd_base_ptr);
7343				sc->sc_uc.uc_umac_error_event_table
7344				    = le32toh(resp3->error_info_addr);
7345				if (resp3->status == IWM_ALIVE_STATUS_OK)
7346					sc->sc_uc.uc_ok = 1;
7347				else
7348					sc->sc_uc.uc_ok = 0;
7349			}
7350
7351			sc->sc_uc.uc_intr = 1;
7352			wakeup(&sc->sc_uc);
7353			break;
7354		}
7355
7356		case IWM_CALIB_RES_NOTIF_PHY_DB: {
7357			struct iwm_calib_res_notif_phy_db *phy_db_notif;
7358			SYNC_RESP_STRUCT(phy_db_notif, pkt);
7359			uint16_t size = le16toh(phy_db_notif->length);
7360			bus_dmamap_sync(sc->sc_dmat, data->map,
7361			    sizeof(*pkt) + sizeof(*phy_db_notif),
7362			    size, BUS_DMASYNC_POSTREAD);
7363			iwm_phy_db_set_section(sc, phy_db_notif, size);
7364			break;
7365		}
7366
7367		case IWM_STATISTICS_NOTIFICATION: {
7368			struct iwm_notif_statistics *stats;
7369			SYNC_RESP_STRUCT(stats, pkt);
7370			memcpy(&sc->sc_stats, stats, sizeof(sc->sc_stats));
7371			sc->sc_noise = iwm_get_noise(&stats->rx.general);
7372			break;
7373		}
7374
7375		case IWM_NVM_ACCESS_CMD:
7376		case IWM_MCC_UPDATE_CMD:
7377			if (sc->sc_wantresp == ((qid << 16) | idx)) {
7378				bus_dmamap_sync(sc->sc_dmat, data->map, 0,
7379				    sizeof(sc->sc_cmd_resp),
7380				    BUS_DMASYNC_POSTREAD);
7381				memcpy(sc->sc_cmd_resp,
7382				    pkt, sizeof(sc->sc_cmd_resp));
7383			}
7384			break;
7385
7386		case IWM_MCC_CHUB_UPDATE_CMD: {
7387			struct iwm_mcc_chub_notif *notif;
7388			SYNC_RESP_STRUCT(notif, pkt);
7389
7390			sc->sc_fw_mcc[0] = (notif->mcc & 0xff00) >> 8;
7391			sc->sc_fw_mcc[1] = notif->mcc & 0xff;
7392			sc->sc_fw_mcc[2] = '\0';
7393			break;
7394		}
7395
7396		case IWM_DTS_MEASUREMENT_NOTIFICATION:
7397		case IWM_WIDE_ID(IWM_PHY_OPS_GROUP,
7398		    IWM_DTS_MEASUREMENT_NOTIF_WIDE): {
7399			struct iwm_dts_measurement_notif_v1 *notif1;
7400			struct iwm_dts_measurement_notif_v2 *notif2;
7401
7402			if (iwm_rx_packet_payload_len(pkt) == sizeof(*notif1)) {
7403				SYNC_RESP_STRUCT(notif1, pkt);
7404				DPRINTF(("%s: DTS temp=%d \n",
7405				    DEVNAME(sc), notif1->temp));
7406				break;
7407			}
7408			if (iwm_rx_packet_payload_len(pkt) == sizeof(*notif2)) {
7409				SYNC_RESP_STRUCT(notif2, pkt);
7410				DPRINTF(("%s: DTS temp=%d \n",
7411				    DEVNAME(sc), notif2->temp));
7412				break;
7413			}
7414			break;
7415		}
7416
7417		case IWM_PHY_CONFIGURATION_CMD:
7418		case IWM_TX_ANT_CONFIGURATION_CMD:
7419		case IWM_ADD_STA:
7420		case IWM_MAC_CONTEXT_CMD:
7421		case IWM_REPLY_SF_CFG_CMD:
7422		case IWM_POWER_TABLE_CMD:
7423		case IWM_PHY_CONTEXT_CMD:
7424		case IWM_BINDING_CONTEXT_CMD:
7425		case IWM_TIME_EVENT_CMD:
7426		case IWM_SCAN_REQUEST_CMD:
7427		case IWM_WIDE_ID(IWM_ALWAYS_LONG_GROUP, IWM_SCAN_CFG_CMD):
7428		case IWM_WIDE_ID(IWM_ALWAYS_LONG_GROUP, IWM_SCAN_REQ_UMAC):
7429		case IWM_WIDE_ID(IWM_ALWAYS_LONG_GROUP, IWM_SCAN_ABORT_UMAC):
7430		case IWM_SCAN_OFFLOAD_REQUEST_CMD:
7431		case IWM_SCAN_OFFLOAD_ABORT_CMD:
7432		case IWM_REPLY_BEACON_FILTERING_CMD:
7433		case IWM_MAC_PM_POWER_TABLE:
7434		case IWM_TIME_QUOTA_CMD:
7435		case IWM_REMOVE_STA:
7436		case IWM_TXPATH_FLUSH:
7437		case IWM_LQ_CMD:
7438		case IWM_WIDE_ID(IWM_ALWAYS_LONG_GROUP, IWM_FW_PAGING_BLOCK_CMD):
7439		case IWM_BT_CONFIG:
7440		case IWM_REPLY_THERMAL_MNG_BACKOFF:
7441			SYNC_RESP_STRUCT(cresp, pkt);
7442			if (sc->sc_wantresp == ((qid << 16) | idx)) {
7443				memcpy(sc->sc_cmd_resp,
7444				    pkt, sizeof(*pkt) + sizeof(*cresp));
7445			}
7446			break;
7447
7448		/* ignore */
7449		case IWM_PHY_DB_CMD:
7450			break;
7451
7452		case IWM_INIT_COMPLETE_NOTIF:
7453			sc->sc_init_complete = 1;
7454			wakeup(&sc->sc_init_complete);
7455			break;
7456
7457		case IWM_SCAN_OFFLOAD_COMPLETE: {
7458			struct iwm_periodic_scan_complete *notif;
7459			SYNC_RESP_STRUCT(notif, pkt);
7460			break;
7461		}
7462
7463		case IWM_SCAN_ITERATION_COMPLETE: {
7464			struct iwm_lmac_scan_complete_notif *notif;
7465			SYNC_RESP_STRUCT(notif, pkt);
7466			if (ISSET(sc->sc_flags, IWM_FLAG_SCANNING)) {
7467				CLR(sc->sc_flags, IWM_FLAG_SCANNING);
7468				iwm_endscan(sc);
7469			}
7470			break;
7471		}
7472
7473		case IWM_SCAN_COMPLETE_UMAC: {
7474			struct iwm_umac_scan_complete *notif;
7475			SYNC_RESP_STRUCT(notif, pkt);
7476			if (ISSET(sc->sc_flags, IWM_FLAG_SCANNING)) {
7477				CLR(sc->sc_flags, IWM_FLAG_SCANNING);
7478				iwm_endscan(sc);
7479			}
7480			break;
7481		}
7482
7483		case IWM_SCAN_ITERATION_COMPLETE_UMAC: {
7484			struct iwm_umac_scan_iter_complete_notif *notif;
7485			SYNC_RESP_STRUCT(notif, pkt);
7486			if (ISSET(sc->sc_flags, IWM_FLAG_SCANNING)) {
7487				CLR(sc->sc_flags, IWM_FLAG_SCANNING);
7488				iwm_endscan(sc);
7489			}
7490			break;
7491		}
7492
7493		case IWM_REPLY_ERROR: {
7494			struct iwm_error_resp *resp;
7495			SYNC_RESP_STRUCT(resp, pkt);
7496			aprint_error_dev(sc->sc_dev,
7497			    "firmware error 0x%x, cmd 0x%x\n",
7498			    le32toh(resp->error_type), resp->cmd_id);
7499			break;
7500		}
7501
7502		case IWM_TIME_EVENT_NOTIFICATION: {
7503			struct iwm_time_event_notif *notif;
7504			SYNC_RESP_STRUCT(notif, pkt);
7505			break;
7506		}
7507
7508		case IWM_DEBUG_LOG_MSG:
7509			break;
7510
7511		case IWM_MCAST_FILTER_CMD:
7512			break;
7513
7514		case IWM_SCD_QUEUE_CFG: {
7515			struct iwm_scd_txq_cfg_rsp *rsp;
7516			SYNC_RESP_STRUCT(rsp, pkt);
7517			break;
7518		}
7519
7520		default:
7521			aprint_error_dev(sc->sc_dev,
7522			    "unhandled firmware response 0x%x 0x%x/0x%x "
7523			    "rx ring %d[%d]\n",
7524			    code, pkt->hdr.code, pkt->len_n_flags, qid, idx);
7525			break;
7526		}
7527
7528		/*
7529		 * uCode sets bit 0x80 when it originates the notification,
7530		 * i.e. when the notification is not a direct response to a
7531		 * command sent by the driver.
7532		 * For example, uCode issues IWM_REPLY_RX when it sends a
7533		 * received frame to the driver.
7534		 */
7535		if (!(orig_qid & (1 << 7))) {
7536			iwm_cmd_done(sc, qid, idx);
7537		}
7538
7539		ADVANCE_RXQ(sc);
7540	}
7541
7542	/*
7543	 * Seems like the hardware gets upset unless we align the write by 8??
7544	 */
7545	hw = (hw == 0) ? IWM_RX_RING_COUNT - 1 : hw - 1;
7546	IWM_WRITE(sc, IWM_FH_RSCSR_CHNL0_WPTR, hw & ~7);
7547}
7548
7549static int
7550iwm_intr(void *arg)
7551{
7552	struct iwm_softc *sc = arg;
7553
7554	/* Disable interrupts */
7555	IWM_WRITE(sc, IWM_CSR_INT_MASK, 0);
7556
7557	softint_schedule(sc->sc_soft_ih);
7558	return 1;
7559}
7560
7561static void
7562iwm_softintr(void *arg)
7563{
7564	struct iwm_softc *sc = arg;
7565	struct ifnet *ifp = IC2IFP(&sc->sc_ic);
7566	uint32_t r1, r2;
7567	int isperiodic = 0, s;
7568
7569	if (__predict_true(sc->sc_flags & IWM_FLAG_USE_ICT)) {
7570		uint32_t *ict = sc->ict_dma.vaddr;
7571		int tmp;
7572
7573		bus_dmamap_sync(sc->sc_dmat, sc->ict_dma.map,
7574		    0, sc->ict_dma.size, BUS_DMASYNC_POSTREAD);
7575		tmp = htole32(ict[sc->ict_cur]);
7576		if (tmp == 0)
7577			goto out_ena;	/* Interrupt not for us. */
7578
7579		/*
7580		 * ok, there was something.  keep plowing until we have all.
7581		 */
7582		r1 = r2 = 0;
7583		while (tmp) {
7584			r1 |= tmp;
7585			ict[sc->ict_cur] = 0;	/* Acknowledge. */
7586			sc->ict_cur = (sc->ict_cur + 1) % IWM_ICT_COUNT;
7587			tmp = htole32(ict[sc->ict_cur]);
7588		}
7589
7590		bus_dmamap_sync(sc->sc_dmat, sc->ict_dma.map,
7591		    0, sc->ict_dma.size, BUS_DMASYNC_PREWRITE);
7592
7593		/* this is where the fun begins.  don't ask */
7594		if (r1 == 0xffffffff)
7595			r1 = 0;
7596
7597		/* i am not expected to understand this */
7598		if (r1 & 0xc0000)
7599			r1 |= 0x8000;
7600		r1 = (0xff & r1) | ((0xff00 & r1) << 16);
7601	} else {
7602		r1 = IWM_READ(sc, IWM_CSR_INT);
7603		if (r1 == 0xffffffff || (r1 & 0xfffffff0) == 0xa5a5a5a0)
7604			return;	/* Hardware gone! */
7605		r2 = IWM_READ(sc, IWM_CSR_FH_INT_STATUS);
7606	}
7607	if (r1 == 0 && r2 == 0) {
7608		goto out_ena;	/* Interrupt not for us. */
7609	}
7610
7611	/* Acknowledge interrupts. */
7612	IWM_WRITE(sc, IWM_CSR_INT, r1 | ~sc->sc_intmask);
7613	if (__predict_false(!(sc->sc_flags & IWM_FLAG_USE_ICT)))
7614		IWM_WRITE(sc, IWM_CSR_FH_INT_STATUS, r2);
7615
7616	if (r1 & IWM_CSR_INT_BIT_SW_ERR) {
7617#ifdef IWM_DEBUG
7618		int i;
7619
7620		iwm_nic_error(sc);
7621
7622		/* Dump driver status (TX and RX rings) while we're here. */
7623		DPRINTF(("driver status:\n"));
7624		for (i = 0; i < IWM_MAX_QUEUES; i++) {
7625			struct iwm_tx_ring *ring = &sc->txq[i];
7626			DPRINTF(("  tx ring %2d: qid=%-2d cur=%-3d "
7627			    "queued=%-3d\n",
7628			    i, ring->qid, ring->cur, ring->queued));
7629		}
7630		DPRINTF(("  rx ring: cur=%d\n", sc->rxq.cur));
7631		DPRINTF(("  802.11 state %s\n",
7632		    ieee80211_state_name[sc->sc_ic.ic_state]));
7633#endif
7634
7635		aprint_error_dev(sc->sc_dev, "fatal firmware error\n");
7636 fatal:
7637		s = splnet();
7638		ifp->if_flags &= ~IFF_UP;
7639		iwm_stop(ifp, 1);
7640		splx(s);
7641		/* Don't restore interrupt mask */
7642		return;
7643
7644	}
7645
7646	if (r1 & IWM_CSR_INT_BIT_HW_ERR) {
7647		aprint_error_dev(sc->sc_dev,
7648		    "hardware error, stopping device\n");
7649		goto fatal;
7650	}
7651
7652	/* firmware chunk loaded */
7653	if (r1 & IWM_CSR_INT_BIT_FH_TX) {
7654		IWM_WRITE(sc, IWM_CSR_FH_INT_STATUS, IWM_CSR_FH_INT_TX_MASK);
7655		sc->sc_fw_chunk_done = 1;
7656		wakeup(&sc->sc_fw);
7657	}
7658
7659	if (r1 & IWM_CSR_INT_BIT_RF_KILL) {
7660		if (iwm_check_rfkill(sc) && (ifp->if_flags & IFF_UP))
7661			goto fatal;
7662	}
7663
7664	if (r1 & IWM_CSR_INT_BIT_RX_PERIODIC) {
7665		IWM_WRITE(sc, IWM_CSR_INT, IWM_CSR_INT_BIT_RX_PERIODIC);
7666		if ((r1 & (IWM_CSR_INT_BIT_FH_RX | IWM_CSR_INT_BIT_SW_RX)) == 0)
7667			IWM_WRITE_1(sc,
7668			    IWM_CSR_INT_PERIODIC_REG, IWM_CSR_INT_PERIODIC_DIS);
7669		isperiodic = 1;
7670	}
7671
7672	if ((r1 & (IWM_CSR_INT_BIT_FH_RX | IWM_CSR_INT_BIT_SW_RX)) ||
7673	    isperiodic) {
7674		IWM_WRITE(sc, IWM_CSR_FH_INT_STATUS, IWM_CSR_FH_INT_RX_MASK);
7675
7676		iwm_notif_intr(sc);
7677
7678		/* enable periodic interrupt, see above */
7679		if (r1 & (IWM_CSR_INT_BIT_FH_RX | IWM_CSR_INT_BIT_SW_RX) &&
7680		    !isperiodic)
7681			IWM_WRITE_1(sc, IWM_CSR_INT_PERIODIC_REG,
7682			    IWM_CSR_INT_PERIODIC_ENA);
7683	}
7684
7685out_ena:
7686	iwm_restore_interrupts(sc);
7687}
7688
7689/*
7690 * Autoconf glue-sniffing
7691 */
7692
7693static const pci_product_id_t iwm_devices[] = {
7694	PCI_PRODUCT_INTEL_WIFI_LINK_7260_1,
7695	PCI_PRODUCT_INTEL_WIFI_LINK_7260_2,
7696	PCI_PRODUCT_INTEL_WIFI_LINK_3160_1,
7697	PCI_PRODUCT_INTEL_WIFI_LINK_3160_2,
7698	PCI_PRODUCT_INTEL_WIFI_LINK_7265_1,
7699	PCI_PRODUCT_INTEL_WIFI_LINK_7265_2,
7700	PCI_PRODUCT_INTEL_WIFI_LINK_3165_1,
7701	PCI_PRODUCT_INTEL_WIFI_LINK_3165_2,
7702	PCI_PRODUCT_INTEL_WIFI_LINK_3168,
7703	PCI_PRODUCT_INTEL_WIFI_LINK_8260_1,
7704	PCI_PRODUCT_INTEL_WIFI_LINK_8260_2,
7705	PCI_PRODUCT_INTEL_WIFI_LINK_4165_1,
7706	PCI_PRODUCT_INTEL_WIFI_LINK_4165_2,
7707	PCI_PRODUCT_INTEL_WIFI_LINK_8265,
7708};
7709
7710static int
7711iwm_match(device_t parent, cfdata_t match __unused, void *aux)
7712{
7713	struct pci_attach_args *pa = aux;
7714
7715	if (PCI_VENDOR(pa->pa_id) != PCI_VENDOR_INTEL)
7716		return 0;
7717
7718	for (size_t i = 0; i < __arraycount(iwm_devices); i++)
7719		if (PCI_PRODUCT(pa->pa_id) == iwm_devices[i])
7720			return 1;
7721
7722	return 0;
7723}
7724
7725static int
7726iwm_preinit(struct iwm_softc *sc)
7727{
7728	int err;
7729
7730	err = iwm_start_hw(sc);
7731	if (err) {
7732		aprint_error_dev(sc->sc_dev, "could not initialize hardware\n");
7733		return err;
7734	}
7735
7736	err = iwm_run_init_mvm_ucode(sc, 1);
7737	iwm_stop_device(sc);
7738	if (err)
7739		return err;
7740
7741	aprint_normal_dev(sc->sc_dev, "hw rev 0x%x, fw ver %s, address %s\n",
7742	    sc->sc_hw_rev & IWM_CSR_HW_REV_TYPE_MSK, sc->sc_fwver,
7743	    ether_sprintf(sc->sc_nvm.hw_addr));
7744
7745	return 0;
7746}
7747
7748static void
7749iwm_attach_hook(device_t dev)
7750{
7751	struct iwm_softc *sc = device_private(dev);
7752
7753	iwm_config_complete(sc);
7754}
7755
7756static void
7757iwm_attach(device_t parent, device_t self, void *aux)
7758{
7759	struct iwm_softc *sc = device_private(self);
7760	struct pci_attach_args *pa = aux;
7761	pcireg_t reg, memtype;
7762	char intrbuf[PCI_INTRSTR_LEN];
7763	const char *intrstr;
7764	int err;
7765	int txq_i;
7766	const struct sysctlnode *node;
7767
7768	sc->sc_dev = self;
7769	sc->sc_pct = pa->pa_pc;
7770	sc->sc_pcitag = pa->pa_tag;
7771	sc->sc_dmat = pa->pa_dmat;
7772	sc->sc_pciid = pa->pa_id;
7773
7774	pci_aprint_devinfo(pa, NULL);
7775
7776	if (workqueue_create(&sc->sc_nswq, "iwmns",
7777	    iwm_newstate_cb, sc, PRI_NONE, IPL_NET, 0))
7778		panic("%s: could not create workqueue: newstate",
7779		    device_xname(self));
7780	sc->sc_soft_ih = softint_establish(SOFTINT_NET, iwm_softintr, sc);
7781	if (sc->sc_soft_ih == NULL)
7782		panic("%s: could not establish softint", device_xname(self));
7783
7784	/*
7785	 * Get the offset of the PCI Express Capability Structure in PCI
7786	 * Configuration Space.
7787	 */
7788	err = pci_get_capability(sc->sc_pct, sc->sc_pcitag,
7789	    PCI_CAP_PCIEXPRESS, &sc->sc_cap_off, NULL);
7790	if (err == 0) {
7791		aprint_error_dev(self,
7792		    "PCIe capability structure not found!\n");
7793		return;
7794	}
7795
7796	/* Clear device-specific "PCI retry timeout" register (41h). */
7797	reg = pci_conf_read(sc->sc_pct, sc->sc_pcitag, 0x40);
7798	pci_conf_write(sc->sc_pct, sc->sc_pcitag, 0x40, reg & ~0xff00);
7799
7800	/* Enable bus-mastering */
7801	reg = pci_conf_read(sc->sc_pct, sc->sc_pcitag, PCI_COMMAND_STATUS_REG);
7802	reg |= PCI_COMMAND_MASTER_ENABLE;
7803	pci_conf_write(sc->sc_pct, sc->sc_pcitag, PCI_COMMAND_STATUS_REG, reg);
7804
7805	memtype = pci_mapreg_type(pa->pa_pc, pa->pa_tag, PCI_MAPREG_START);
7806	err = pci_mapreg_map(pa, PCI_MAPREG_START, memtype, 0,
7807	    &sc->sc_st, &sc->sc_sh, NULL, &sc->sc_sz);
7808	if (err) {
7809		aprint_error_dev(self, "can't map mem space\n");
7810		return;
7811	}
7812
7813	/* Install interrupt handler. */
7814	err = pci_intr_alloc(pa, &sc->sc_pihp, NULL, 0);
7815	if (err) {
7816		aprint_error_dev(self, "can't allocate interrupt\n");
7817		return;
7818	}
7819	reg = pci_conf_read(sc->sc_pct, sc->sc_pcitag, PCI_COMMAND_STATUS_REG);
7820	if (pci_intr_type(sc->sc_pct, sc->sc_pihp[0]) == PCI_INTR_TYPE_INTX)
7821		CLR(reg, PCI_COMMAND_INTERRUPT_DISABLE);
7822	else
7823		SET(reg, PCI_COMMAND_INTERRUPT_DISABLE);
7824	pci_conf_write(sc->sc_pct, sc->sc_pcitag, PCI_COMMAND_STATUS_REG, reg);
7825	intrstr = pci_intr_string(sc->sc_pct, sc->sc_pihp[0], intrbuf,
7826	    sizeof(intrbuf));
7827	sc->sc_ih = pci_intr_establish_xname(sc->sc_pct, sc->sc_pihp[0],
7828	    IPL_NET, iwm_intr, sc, device_xname(self));
7829	if (sc->sc_ih == NULL) {
7830		aprint_error_dev(self, "can't establish interrupt");
7831		if (intrstr != NULL)
7832			aprint_error(" at %s", intrstr);
7833		aprint_error("\n");
7834		return;
7835	}
7836	aprint_normal_dev(self, "interrupting at %s\n", intrstr);
7837
7838	sc->sc_wantresp = IWM_CMD_RESP_IDLE;
7839
7840	sc->sc_hw_rev = IWM_READ(sc, IWM_CSR_HW_REV);
7841	switch (PCI_PRODUCT(sc->sc_pciid)) {
7842	case PCI_PRODUCT_INTEL_WIFI_LINK_3160_1:
7843	case PCI_PRODUCT_INTEL_WIFI_LINK_3160_2:
7844		sc->sc_fwname = "iwlwifi-3160-17.ucode";
7845		sc->host_interrupt_operation_mode = 1;
7846		sc->apmg_wake_up_wa = 1;
7847		sc->sc_device_family = IWM_DEVICE_FAMILY_7000;
7848		sc->sc_fwdmasegsz = IWM_FWDMASEGSZ;
7849		break;
7850	case PCI_PRODUCT_INTEL_WIFI_LINK_3165_1:
7851	case PCI_PRODUCT_INTEL_WIFI_LINK_3165_2:
7852		sc->sc_fwname = "iwlwifi-7265D-22.ucode";
7853		sc->host_interrupt_operation_mode = 0;
7854		sc->apmg_wake_up_wa = 1;
7855		sc->sc_device_family = IWM_DEVICE_FAMILY_7000;
7856		sc->sc_fwdmasegsz = IWM_FWDMASEGSZ;
7857		break;
7858	case PCI_PRODUCT_INTEL_WIFI_LINK_3168:
7859		sc->sc_fwname = "iwlwifi-3168-22.ucode";
7860		sc->host_interrupt_operation_mode = 0;
7861		sc->apmg_wake_up_wa = 1;
7862		sc->sc_device_family = IWM_DEVICE_FAMILY_7000;
7863		sc->sc_fwdmasegsz = IWM_FWDMASEGSZ;
7864		break;
7865	case PCI_PRODUCT_INTEL_WIFI_LINK_7260_1:
7866	case PCI_PRODUCT_INTEL_WIFI_LINK_7260_2:
7867		sc->sc_fwname = "iwlwifi-7260-17.ucode";
7868		sc->host_interrupt_operation_mode = 1;
7869		sc->apmg_wake_up_wa = 1;
7870		sc->sc_device_family = IWM_DEVICE_FAMILY_7000;
7871		sc->sc_fwdmasegsz = IWM_FWDMASEGSZ;
7872		break;
7873	case PCI_PRODUCT_INTEL_WIFI_LINK_7265_1:
7874	case PCI_PRODUCT_INTEL_WIFI_LINK_7265_2:
7875		sc->sc_fwname = (sc->sc_hw_rev & IWM_CSR_HW_REV_TYPE_MSK) ==
7876		    IWM_CSR_HW_REV_TYPE_7265D ?
7877		    "iwlwifi-7265D-22.ucode": "iwlwifi-7265-17.ucode";
7878		sc->host_interrupt_operation_mode = 0;
7879		sc->apmg_wake_up_wa = 1;
7880		sc->sc_device_family = IWM_DEVICE_FAMILY_7000;
7881		sc->sc_fwdmasegsz = IWM_FWDMASEGSZ;
7882		break;
7883	case PCI_PRODUCT_INTEL_WIFI_LINK_8260_1:
7884	case PCI_PRODUCT_INTEL_WIFI_LINK_8260_2:
7885	case PCI_PRODUCT_INTEL_WIFI_LINK_4165_1:
7886	case PCI_PRODUCT_INTEL_WIFI_LINK_4165_2:
7887		sc->sc_fwname = "iwlwifi-8000C-22.ucode";
7888		sc->host_interrupt_operation_mode = 0;
7889		sc->apmg_wake_up_wa = 0;
7890		sc->sc_device_family = IWM_DEVICE_FAMILY_8000;
7891		sc->sc_fwdmasegsz = IWM_FWDMASEGSZ_8000;
7892		break;
7893	case PCI_PRODUCT_INTEL_WIFI_LINK_8265:
7894		sc->sc_fwname = "iwlwifi-8265-22.ucode";
7895		sc->host_interrupt_operation_mode = 0;
7896		sc->apmg_wake_up_wa = 0;
7897		sc->sc_device_family = IWM_DEVICE_FAMILY_8000;
7898		sc->sc_fwdmasegsz = IWM_FWDMASEGSZ_8000;
7899		break;
7900	default:
7901		aprint_error_dev(self, "unknown product %#x",
7902		    PCI_PRODUCT(sc->sc_pciid));
7903		return;
7904	}
7905	DPRINTF(("%s: firmware=%s\n", DEVNAME(sc), sc->sc_fwname));
7906
7907	/*
7908	 * In the 8000 HW family the format of the 4 bytes of CSR_HW_REV have
7909	 * changed, and now the revision step also includes bit 0-1 (no more
7910	 * "dash" value). To keep hw_rev backwards compatible - we'll store it
7911	 * in the old format.
7912	 */
7913
7914	if (sc->sc_device_family == IWM_DEVICE_FAMILY_8000)
7915		sc->sc_hw_rev = (sc->sc_hw_rev & 0xfff0) |
7916		    (IWM_CSR_HW_REV_STEP(sc->sc_hw_rev << 2) << 2);
7917
7918	if (iwm_prepare_card_hw(sc) != 0) {
7919		aprint_error_dev(sc->sc_dev, "could not initialize hardware\n");
7920		return;
7921	}
7922
7923	if (sc->sc_device_family == IWM_DEVICE_FAMILY_8000) {
7924		uint32_t hw_step;
7925
7926		/*
7927		 * In order to recognize C step the driver should read the
7928		 * chip version id located at the AUX bus MISC address.
7929		 */
7930		IWM_SETBITS(sc, IWM_CSR_GP_CNTRL,
7931			    IWM_CSR_GP_CNTRL_REG_FLAG_INIT_DONE);
7932		DELAY(2);
7933
7934		err = iwm_poll_bit(sc, IWM_CSR_GP_CNTRL,
7935				   IWM_CSR_GP_CNTRL_REG_FLAG_MAC_CLOCK_READY,
7936				   IWM_CSR_GP_CNTRL_REG_FLAG_MAC_CLOCK_READY,
7937				   25000);
7938		if (!err) {
7939			aprint_error_dev(sc->sc_dev,
7940			    "failed to wake up the nic\n");
7941			return;
7942		}
7943
7944		if (iwm_nic_lock(sc)) {
7945			hw_step = iwm_read_prph(sc, IWM_WFPM_CTRL_REG);
7946			hw_step |= IWM_ENABLE_WFPM;
7947			iwm_write_prph(sc, IWM_WFPM_CTRL_REG, hw_step);
7948			hw_step = iwm_read_prph(sc, IWM_AUX_MISC_REG);
7949			hw_step = (hw_step >> IWM_HW_STEP_LOCATION_BITS) & 0xF;
7950			if (hw_step == 0x3)
7951				sc->sc_hw_rev = (sc->sc_hw_rev & 0xFFFFFFF3) |
7952				    (IWM_SILICON_C_STEP << 2);
7953			iwm_nic_unlock(sc);
7954		} else {
7955			aprint_error_dev(sc->sc_dev,
7956			    "failed to lock the nic\n");
7957			return;
7958		}
7959	}
7960
7961	/*
7962	 * Allocate DMA memory for firmware transfers.
7963	 * Must be aligned on a 16-byte boundary.
7964	 */
7965	err = iwm_dma_contig_alloc(sc->sc_dmat, &sc->fw_dma, sc->sc_fwdmasegsz,
7966	    16);
7967	if (err) {
7968		aprint_error_dev(sc->sc_dev,
7969		    "could not allocate memory for firmware\n");
7970		return;
7971	}
7972
7973	/* Allocate "Keep Warm" page, used internally by the card. */
7974	err = iwm_dma_contig_alloc(sc->sc_dmat, &sc->kw_dma, 4096, 4096);
7975	if (err) {
7976		aprint_error_dev(sc->sc_dev,
7977		    "could not allocate keep warm page\n");
7978		goto fail1;
7979	}
7980
7981	/* Allocate interrupt cause table (ICT).*/
7982	err = iwm_dma_contig_alloc(sc->sc_dmat, &sc->ict_dma, IWM_ICT_SIZE,
7983	    1 << IWM_ICT_PADDR_SHIFT);
7984	if (err) {
7985		aprint_error_dev(sc->sc_dev, "could not allocate ICT table\n");
7986		goto fail2;
7987	}
7988
7989	/* TX scheduler rings must be aligned on a 1KB boundary. */
7990	err = iwm_dma_contig_alloc(sc->sc_dmat, &sc->sched_dma,
7991	    __arraycount(sc->txq) * sizeof(struct iwm_agn_scd_bc_tbl), 1024);
7992	if (err) {
7993		aprint_error_dev(sc->sc_dev,
7994		    "could not allocate TX scheduler rings\n");
7995		goto fail3;
7996	}
7997
7998	for (txq_i = 0; txq_i < __arraycount(sc->txq); txq_i++) {
7999		err = iwm_alloc_tx_ring(sc, &sc->txq[txq_i], txq_i);
8000		if (err) {
8001			aprint_error_dev(sc->sc_dev,
8002			    "could not allocate TX ring %d\n", txq_i);
8003			goto fail4;
8004		}
8005	}
8006
8007	err = iwm_alloc_rx_ring(sc, &sc->rxq);
8008	if (err) {
8009		aprint_error_dev(sc->sc_dev, "could not allocate RX ring\n");
8010		goto fail5;
8011	}
8012
8013	/* Clear pending interrupts. */
8014	IWM_WRITE(sc, IWM_CSR_INT, 0xffffffff);
8015
8016	if ((err = sysctl_createv(&sc->sc_clog, 0, NULL, &node,
8017	    0, CTLTYPE_NODE, device_xname(sc->sc_dev),
8018	    SYSCTL_DESCR("iwm per-controller controls"),
8019	    NULL, 0, NULL, 0,
8020	    CTL_HW, iwm_sysctl_root_num, CTL_CREATE,
8021	    CTL_EOL)) != 0) {
8022		aprint_normal_dev(sc->sc_dev,
8023		    "couldn't create iwm per-controller sysctl node\n");
8024	}
8025	if (err == 0) {
8026		int iwm_nodenum = node->sysctl_num;
8027
8028		/* Reload firmware sysctl node */
8029		if ((err = sysctl_createv(&sc->sc_clog, 0, NULL, &node,
8030		    CTLFLAG_READWRITE, CTLTYPE_INT, "fw_loaded",
8031		    SYSCTL_DESCR("Reload firmware"),
8032		    iwm_sysctl_fw_loaded_handler, 0, (void *)sc, 0,
8033		    CTL_HW, iwm_sysctl_root_num, iwm_nodenum, CTL_CREATE,
8034		    CTL_EOL)) != 0) {
8035			aprint_normal_dev(sc->sc_dev,
8036			    "couldn't create load_fw sysctl node\n");
8037		}
8038	}
8039
8040	callout_init(&sc->sc_calib_to, 0);
8041	callout_setfunc(&sc->sc_calib_to, iwm_calib_timeout, sc);
8042	callout_init(&sc->sc_led_blink_to, 0);
8043	callout_setfunc(&sc->sc_led_blink_to, iwm_led_blink_timeout, sc);
8044#ifndef IEEE80211_NO_HT
8045	if (workqueue_create(&sc->sc_setratewq, "iwmsr",
8046	    iwm_setrates_task, sc, PRI_NONE, IPL_NET, 0))
8047		panic("%s: could not create workqueue: setrates",
8048		    device_xname(self));
8049	if (workqueue_create(&sc->sc_bawq, "iwmba",
8050	    iwm_ba_task, sc, PRI_NONE, IPL_NET, 0))
8051		panic("%s: could not create workqueue: blockack",
8052		    device_xname(self));
8053	if (workqueue_create(&sc->sc_htprowq, "iwmhtpro",
8054	    iwm_htprot_task, sc, PRI_NONE, IPL_NET, 0))
8055		panic("%s: could not create workqueue: htprot",
8056		    device_xname(self));
8057#endif
8058
8059	/*
8060	 * We can't do normal attach before the file system is mounted
8061	 * because we cannot read the MAC address without loading the
8062	 * firmware from disk.  So we postpone until mountroot is done.
8063	 * Notably, this will require a full driver unload/load cycle
8064	 * (or reboot) in case the firmware is not present when the
8065	 * hook runs.
8066	 */
8067	config_mountroot(self, iwm_attach_hook);
8068
8069	return;
8070
8071fail5:	while (--txq_i >= 0)
8072		iwm_free_tx_ring(sc, &sc->txq[txq_i]);
8073fail4:	iwm_dma_contig_free(&sc->sched_dma);
8074fail3:	if (sc->ict_dma.vaddr != NULL)
8075		iwm_dma_contig_free(&sc->ict_dma);
8076fail2:	iwm_dma_contig_free(&sc->kw_dma);
8077fail1:	iwm_dma_contig_free(&sc->fw_dma);
8078}
8079
8080static int
8081iwm_config_complete(struct iwm_softc *sc)
8082{
8083	device_t self = sc->sc_dev;
8084	struct ieee80211com *ic = &sc->sc_ic;
8085	struct ifnet *ifp = &sc->sc_ec.ec_if;
8086	int err;
8087
8088	KASSERT(!ISSET(sc->sc_flags, IWM_FLAG_ATTACHED));
8089
8090	err = iwm_preinit(sc);
8091	if (err)
8092		return err;
8093
8094	/*
8095	 * Attach interface
8096	 */
8097	ic->ic_ifp = ifp;
8098	ic->ic_phytype = IEEE80211_T_OFDM;	/* not only, but not used */
8099	ic->ic_opmode = IEEE80211_M_STA;	/* default to BSS mode */
8100	ic->ic_state = IEEE80211_S_INIT;
8101
8102	/* Set device capabilities. */
8103	ic->ic_caps =
8104	    IEEE80211_C_WEP |		/* WEP */
8105	    IEEE80211_C_WPA |		/* 802.11i */
8106#ifdef notyet
8107	    IEEE80211_C_SCANALL |	/* device scans all channels at once */
8108	    IEEE80211_C_SCANALLBAND |	/* device scans all bands at once */
8109#endif
8110	    IEEE80211_C_SHSLOT |	/* short slot time supported */
8111	    IEEE80211_C_SHPREAMBLE;	/* short preamble supported */
8112
8113#ifndef IEEE80211_NO_HT
8114	ic->ic_htcaps = IEEE80211_HTCAP_SGI20;
8115	ic->ic_htxcaps = 0;
8116	ic->ic_txbfcaps = 0;
8117	ic->ic_aselcaps = 0;
8118	ic->ic_ampdu_params = (IEEE80211_AMPDU_PARAM_SS_4 | 0x3 /* 64k */);
8119#endif
8120
8121	/* all hardware can do 2.4GHz band */
8122	ic->ic_sup_rates[IEEE80211_MODE_11B] = ieee80211_std_rateset_11b;
8123	ic->ic_sup_rates[IEEE80211_MODE_11G] = ieee80211_std_rateset_11g;
8124
8125	/* not all hardware can do 5GHz band */
8126	if (sc->sc_nvm.sku_cap_band_52GHz_enable)
8127		ic->ic_sup_rates[IEEE80211_MODE_11A] = ieee80211_std_rateset_11a;
8128
8129#ifndef IEEE80211_NO_HT
8130	if (sc->sc_nvm.sku_cap_11n_enable)
8131		iwm_setup_ht_rates(sc);
8132#endif
8133
8134	for (int i = 0; i < __arraycount(sc->sc_phyctxt); i++) {
8135		sc->sc_phyctxt[i].id = i;
8136	}
8137
8138	sc->sc_amrr.amrr_min_success_threshold =  1;
8139	sc->sc_amrr.amrr_max_success_threshold = 15;
8140
8141	/* IBSS channel undefined for now. */
8142	ic->ic_ibss_chan = &ic->ic_channels[1];
8143
8144#if 0
8145	ic->ic_max_rssi = IWM_MAX_DBM - IWM_MIN_DBM;
8146#endif
8147
8148	ifp->if_softc = sc;
8149	ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
8150	ifp->if_init = iwm_init;
8151	ifp->if_stop = iwm_stop;
8152	ifp->if_ioctl = iwm_ioctl;
8153	ifp->if_start = iwm_start;
8154	ifp->if_watchdog = iwm_watchdog;
8155	IFQ_SET_READY(&ifp->if_snd);
8156	memcpy(ifp->if_xname, DEVNAME(sc), IFNAMSIZ);
8157
8158	if_initialize(ifp);
8159	ieee80211_ifattach(ic);
8160	/* Use common softint-based if_input */
8161	ifp->if_percpuq = if_percpuq_create(ifp);
8162	if_register(ifp);
8163
8164	ic->ic_node_alloc = iwm_node_alloc;
8165
8166	/* Override 802.11 state transition machine. */
8167	sc->sc_newstate = ic->ic_newstate;
8168	ic->ic_newstate = iwm_newstate;
8169
8170	/* XXX media locking needs revisiting */
8171	mutex_init(&sc->sc_media_mtx, MUTEX_DEFAULT, IPL_SOFTNET);
8172	ieee80211_media_init_with_lock(ic,
8173	    iwm_media_change, ieee80211_media_status, &sc->sc_media_mtx);
8174
8175	ieee80211_announce(ic);
8176
8177	iwm_radiotap_attach(sc);
8178
8179	if (pmf_device_register(self, NULL, NULL))
8180		pmf_class_network_register(self, ifp);
8181	else
8182		aprint_error_dev(self, "couldn't establish power handler\n");
8183
8184	sc->sc_flags |= IWM_FLAG_ATTACHED;
8185
8186	return 0;
8187}
8188
8189void
8190iwm_radiotap_attach(struct iwm_softc *sc)
8191{
8192	struct ifnet *ifp = IC2IFP(&sc->sc_ic);
8193
8194	bpf_attach2(ifp, DLT_IEEE802_11_RADIO,
8195	    sizeof (struct ieee80211_frame) + IEEE80211_RADIOTAP_HDRLEN,
8196	    &sc->sc_drvbpf);
8197
8198	sc->sc_rxtap_len = sizeof sc->sc_rxtapu;
8199	sc->sc_rxtap.wr_ihdr.it_len = htole16(sc->sc_rxtap_len);
8200	sc->sc_rxtap.wr_ihdr.it_present = htole32(IWM_RX_RADIOTAP_PRESENT);
8201
8202	sc->sc_txtap_len = sizeof sc->sc_txtapu;
8203	sc->sc_txtap.wt_ihdr.it_len = htole16(sc->sc_txtap_len);
8204	sc->sc_txtap.wt_ihdr.it_present = htole32(IWM_TX_RADIOTAP_PRESENT);
8205}
8206
8207#if 0
8208static void
8209iwm_init_task(void *arg)
8210{
8211	struct iwm_softc *sc = arg;
8212	struct ifnet *ifp = IC2IFP(&sc->sc_ic);
8213	int s;
8214
8215	rw_enter_write(&sc->ioctl_rwl);
8216	s = splnet();
8217
8218	iwm_stop(ifp, 0);
8219	if ((ifp->if_flags & (IFF_UP | IFF_RUNNING)) == IFF_UP)
8220		iwm_init(ifp);
8221
8222	splx(s);
8223	rw_exit(&sc->ioctl_rwl);
8224}
8225
8226static void
8227iwm_wakeup(struct iwm_softc *sc)
8228{
8229	pcireg_t reg;
8230
8231	/* Clear device-specific "PCI retry timeout" register (41h). */
8232	reg = pci_conf_read(sc->sc_pct, sc->sc_pcitag, 0x40);
8233	pci_conf_write(sc->sc_pct, sc->sc_pcitag, 0x40, reg & ~0xff00);
8234
8235	iwm_init_task(sc);
8236}
8237
8238static int
8239iwm_activate(device_t self, enum devact act)
8240{
8241	struct iwm_softc *sc = device_private(self);
8242	struct ifnet *ifp = IC2IFP(&sc->sc_ic);
8243
8244	switch (act) {
8245	case DVACT_DEACTIVATE:
8246		if (ifp->if_flags & IFF_RUNNING)
8247			iwm_stop(ifp, 0);
8248		return 0;
8249	default:
8250		return EOPNOTSUPP;
8251	}
8252}
8253#endif
8254
8255CFATTACH_DECL_NEW(iwm, sizeof(struct iwm_softc), iwm_match, iwm_attach,
8256	NULL, NULL);
8257
8258static int
8259iwm_sysctl_fw_loaded_handler(SYSCTLFN_ARGS)
8260{
8261	struct sysctlnode node;
8262	struct iwm_softc *sc;
8263	int err, t;
8264
8265	node = *rnode;
8266	sc = node.sysctl_data;
8267	t = ISSET(sc->sc_flags, IWM_FLAG_FW_LOADED) ? 1 : 0;
8268	node.sysctl_data = &t;
8269	err = sysctl_lookup(SYSCTLFN_CALL(&node));
8270	if (err || newp == NULL)
8271		return err;
8272
8273	if (t == 0)
8274		CLR(sc->sc_flags, IWM_FLAG_FW_LOADED);
8275	return 0;
8276}
8277
8278SYSCTL_SETUP(sysctl_iwm, "sysctl iwm(4) subtree setup")
8279{
8280	const struct sysctlnode *rnode;
8281#ifdef IWM_DEBUG
8282	const struct sysctlnode *cnode;
8283#endif /* IWM_DEBUG */
8284	int rc;
8285
8286	if ((rc = sysctl_createv(clog, 0, NULL, &rnode,
8287	    CTLFLAG_PERMANENT, CTLTYPE_NODE, "iwm",
8288	    SYSCTL_DESCR("iwm global controls"),
8289	    NULL, 0, NULL, 0, CTL_HW, CTL_CREATE, CTL_EOL)) != 0)
8290		goto err;
8291
8292	iwm_sysctl_root_num = rnode->sysctl_num;
8293
8294#ifdef IWM_DEBUG
8295	/* control debugging printfs */
8296	if ((rc = sysctl_createv(clog, 0, &rnode, &cnode,
8297	    CTLFLAG_PERMANENT|CTLFLAG_READWRITE, CTLTYPE_INT,
8298	    "debug", SYSCTL_DESCR("Enable debugging output"),
8299	    NULL, 0, &iwm_debug, 0, CTL_CREATE, CTL_EOL)) != 0)
8300		goto err;
8301#endif /* IWM_DEBUG */
8302
8303	return;
8304
8305 err:
8306	aprint_error("%s: sysctl_createv failed (rc = %d)\n", __func__, rc);
8307}
8308