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