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