Lines Matching +full:update +full:- +full:fc +full:- +full:fixup
5 * Copyright (c) 2014 Fixup Software Ltd.
20 /*-
21 * Based on BSD-licensed source modules in the Linux iwlwifi driver,
34 * Copyright(c) 2007 - 2013 Intel Corporation. All rights reserved.
55 * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
60 * Copyright(c) 2005 - 2013 Intel Corporation. All rights reserved.
90 /*-
91 * Copyright (c) 2007-2010 Damien Bergamini <damien.bergamini@free.fr>
173 #define mtodoff(m, t, off) ((t)((m)->m_data + (off)))
230 #define IWM_RIDX_MAX (nitems(iwm_rates)-1)
440 dlen < sizeof(l->size) + l->size * sizeof(*l->cs)) in iwm_store_cscheme()
460 fws = &sc->sc_fw.img[type]; in iwm_firmware_store_section()
461 if (fws->fw_count >= IWM_UCODE_SECTION_MAX) in iwm_firmware_store_section()
464 fwone = &fws->sec[fws->fw_count]; in iwm_firmware_store_section()
467 memcpy(&fwone->offset, data, sizeof(uint32_t)); in iwm_firmware_store_section()
470 fwone->data = data + sizeof(uint32_t); in iwm_firmware_store_section()
471 fwone->len = dlen - sizeof(uint32_t); in iwm_firmware_store_section()
473 fws->fw_count++; in iwm_firmware_store_section()
480 /* iwlwifi: iwl-drv.c */
490 uint32_t ucode_type = le32toh(def_calib->ucode_type); in iwm_set_default_calib()
493 device_printf(sc->sc_dev, in iwm_set_default_calib()
499 sc->sc_default_calib[ucode_type].flow_trigger = in iwm_set_default_calib()
500 def_calib->calib.flow_trigger; in iwm_set_default_calib()
501 sc->sc_default_calib[ucode_type].event_trigger = in iwm_set_default_calib()
502 def_calib->calib.event_trigger; in iwm_set_default_calib()
512 uint32_t api_index = le32toh(ucode_api->api_index); in iwm_set_ucode_api_flags()
513 uint32_t api_flags = le32toh(ucode_api->api_flags); in iwm_set_ucode_api_flags()
517 device_printf(sc->sc_dev, in iwm_set_ucode_api_flags()
526 setbit(capa->enabled_api, i + 32 * api_index); in iwm_set_ucode_api_flags()
537 uint32_t api_index = le32toh(ucode_capa->api_index); in iwm_set_ucode_capabilities()
538 uint32_t api_flags = le32toh(ucode_capa->api_capa); in iwm_set_ucode_capabilities()
542 device_printf(sc->sc_dev, in iwm_set_ucode_capabilities()
551 setbit(capa->enabled_capa, i + 32 * api_index); in iwm_set_ucode_capabilities()
560 firmware_put(fw->fw_fp, FIRMWARE_UNLOAD); in iwm_fw_info_free()
561 fw->fw_fp = NULL; in iwm_fw_info_free()
562 memset(fw->img, 0, sizeof(fw->img)); in iwm_fw_info_free()
568 struct iwm_fw_info *fw = &sc->sc_fw; in iwm_read_firmware()
571 struct iwm_ucode_capabilities *capa = &sc->sc_fw.ucode_capa; in iwm_read_firmware()
587 fwp = firmware_get(sc->cfg->fw_name); in iwm_read_firmware()
589 device_printf(sc->sc_dev, in iwm_read_firmware()
591 sc->cfg->fw_name, error); in iwm_read_firmware()
594 fw->fw_fp = fwp; in iwm_read_firmware()
596 /* (Re-)Initialize default values. */ in iwm_read_firmware()
597 capa->flags = 0; in iwm_read_firmware()
598 capa->max_probe_length = IWM_DEFAULT_MAX_PROBE_LENGTH; in iwm_read_firmware()
599 capa->n_scan_channels = IWM_DEFAULT_SCAN_CHANNELS; in iwm_read_firmware()
600 memset(capa->enabled_capa, 0, sizeof(capa->enabled_capa)); in iwm_read_firmware()
601 memset(capa->enabled_api, 0, sizeof(capa->enabled_api)); in iwm_read_firmware()
602 memset(sc->sc_fw_mcc, 0, sizeof(sc->sc_fw_mcc)); in iwm_read_firmware()
608 uhdr = (const void *)fw->fw_fp->data; in iwm_read_firmware()
609 if (*(const uint32_t *)fw->fw_fp->data != 0 in iwm_read_firmware()
610 || le32toh(uhdr->magic) != IWM_TLV_UCODE_MAGIC) { in iwm_read_firmware()
611 device_printf(sc->sc_dev, "invalid firmware %s\n", in iwm_read_firmware()
612 sc->cfg->fw_name); in iwm_read_firmware()
617 snprintf(sc->sc_fwver, sizeof(sc->sc_fwver), "%u.%u (API ver %u)", in iwm_read_firmware()
618 IWM_UCODE_MAJOR(le32toh(uhdr->ver)), in iwm_read_firmware()
619 IWM_UCODE_MINOR(le32toh(uhdr->ver)), in iwm_read_firmware()
620 IWM_UCODE_API(le32toh(uhdr->ver))); in iwm_read_firmware()
621 data = uhdr->data; in iwm_read_firmware()
622 len = fw->fw_fp->datasize - sizeof(*uhdr); in iwm_read_firmware()
625 len -= sizeof(*tlv); in iwm_read_firmware()
628 tlv_len = le32toh(tlv->length); in iwm_read_firmware()
629 tlv_type = le32toh(tlv->type); in iwm_read_firmware()
630 tlv_data = tlv->data; in iwm_read_firmware()
633 device_printf(sc->sc_dev, in iwm_read_firmware()
639 len -= roundup2(tlv_len, 4); in iwm_read_firmware()
645 device_printf(sc->sc_dev, in iwm_read_firmware()
651 capa->max_probe_length = in iwm_read_firmware()
654 if (capa->max_probe_length > in iwm_read_firmware()
665 device_printf(sc->sc_dev, in iwm_read_firmware()
671 capa->flags |= IWM_UCODE_TLV_FLAGS_PAN; in iwm_read_firmware()
675 device_printf(sc->sc_dev, in iwm_read_firmware()
682 device_printf(sc->sc_dev, in iwm_read_firmware()
699 capa->flags = le32_to_cpup((const uint32_t *)tlv_data); in iwm_read_firmware()
704 device_printf(sc->sc_dev, in iwm_read_firmware()
712 device_printf(sc->sc_dev, in iwm_read_firmware()
720 fw->img[IWM_UCODE_REGULAR].is_dual_cpus = in iwm_read_firmware()
722 fw->img[IWM_UCODE_INIT].is_dual_cpus = in iwm_read_firmware()
724 fw->img[IWM_UCODE_WOWLAN].is_dual_cpus = in iwm_read_firmware()
727 device_printf(sc->sc_dev, in iwm_read_firmware()
737 device_printf(sc->sc_dev, in iwm_read_firmware()
746 device_printf(sc->sc_dev, in iwm_read_firmware()
755 device_printf(sc->sc_dev, in iwm_read_firmware()
763 device_printf(sc->sc_dev, in iwm_read_firmware()
771 device_printf(sc->sc_dev, in iwm_read_firmware()
780 device_printf(sc->sc_dev, in iwm_read_firmware()
785 sc->sc_fw.phy_config = in iwm_read_firmware()
787 sc->sc_fw.valid_tx_ant = (sc->sc_fw.phy_config & in iwm_read_firmware()
790 sc->sc_fw.valid_rx_ant = (sc->sc_fw.phy_config & in iwm_read_firmware()
843 device_printf(sc->sc_dev, in iwm_read_firmware()
849 if (paging_mem_size & (IWM_FW_PAGING_SIZE - 1)) { in iwm_read_firmware()
850 device_printf(sc->sc_dev, in iwm_read_firmware()
857 sc->sc_fw.img[IWM_UCODE_REGULAR].paging_mem_size = in iwm_read_firmware()
860 sc->sc_fw.img[usniffer_img].paging_mem_size = in iwm_read_firmware()
869 capa->n_scan_channels = in iwm_read_firmware()
878 snprintf(sc->sc_fwver, sizeof(sc->sc_fwver), in iwm_read_firmware()
889 device_printf(sc->sc_dev, in iwm_read_firmware()
901 device_printf(sc->sc_dev, "firmware parse error %d, " in iwm_read_firmware()
907 if (fw->fw_fp != NULL) in iwm_read_firmware()
922 /* Must be aligned on a 16-byte boundary. */ in iwm_alloc_fwmem()
923 return iwm_dma_contig_alloc(sc->sc_dmat, &sc->fw_dma, in iwm_alloc_fwmem()
932 return iwm_dma_contig_alloc(sc->sc_dmat, &sc->sched_dma, in iwm_alloc_sched()
933 nitems(sc->txq) * sizeof(struct iwm_agn_scd_bc_tbl), 1024); in iwm_alloc_sched()
936 /* keep-warm page is used internally by the card. see iwl-fh.h for more info */
940 return iwm_dma_contig_alloc(sc->sc_dmat, &sc->kw_dma, 4096, 4096); in iwm_alloc_kw()
947 return iwm_dma_contig_alloc(sc->sc_dmat, &sc->ict_dma, in iwm_alloc_ict()
958 ring->cur = 0; in iwm_alloc_rx_ring()
959 if (sc->cfg->mqrx_supported) { in iwm_alloc_rx_ring()
967 /* Allocate RX descriptors (256-byte aligned). */ in iwm_alloc_rx_ring()
969 error = iwm_dma_contig_alloc(sc->sc_dmat, &ring->free_desc_dma, size, in iwm_alloc_rx_ring()
972 device_printf(sc->sc_dev, in iwm_alloc_rx_ring()
976 ring->desc = ring->free_desc_dma.vaddr; in iwm_alloc_rx_ring()
978 /* Allocate RX status area (16-byte aligned). */ in iwm_alloc_rx_ring()
979 error = iwm_dma_contig_alloc(sc->sc_dmat, &ring->stat_dma, in iwm_alloc_rx_ring()
980 sizeof(*ring->stat), 16); in iwm_alloc_rx_ring()
982 device_printf(sc->sc_dev, in iwm_alloc_rx_ring()
986 ring->stat = ring->stat_dma.vaddr; in iwm_alloc_rx_ring()
988 if (sc->cfg->mqrx_supported) { in iwm_alloc_rx_ring()
990 error = iwm_dma_contig_alloc(sc->sc_dmat, &ring->used_desc_dma, in iwm_alloc_rx_ring()
993 device_printf(sc->sc_dev, in iwm_alloc_rx_ring()
1000 error = bus_dma_tag_create(sc->sc_dmat, 1, 0, in iwm_alloc_rx_ring()
1002 IWM_RBUF_SIZE, 1, IWM_RBUF_SIZE, 0, NULL, NULL, &ring->data_dmat); in iwm_alloc_rx_ring()
1004 device_printf(sc->sc_dev, in iwm_alloc_rx_ring()
1011 error = bus_dmamap_create(ring->data_dmat, 0, &ring->spare_map); in iwm_alloc_rx_ring()
1013 device_printf(sc->sc_dev, in iwm_alloc_rx_ring()
1023 struct iwm_rx_data *data = &ring->data[i]; in iwm_alloc_rx_ring()
1024 error = bus_dmamap_create(ring->data_dmat, 0, &data->map); in iwm_alloc_rx_ring()
1026 device_printf(sc->sc_dev, in iwm_alloc_rx_ring()
1031 data->m = NULL; in iwm_alloc_rx_ring()
1047 ring->cur = 0; in iwm_reset_rx_ring()
1053 if (sc->rxq.stat) in iwm_reset_rx_ring()
1054 memset(sc->rxq.stat, 0, sizeof(*sc->rxq.stat)); in iwm_reset_rx_ring()
1062 iwm_dma_contig_free(&ring->free_desc_dma); in iwm_free_rx_ring()
1063 iwm_dma_contig_free(&ring->stat_dma); in iwm_free_rx_ring()
1064 iwm_dma_contig_free(&ring->used_desc_dma); in iwm_free_rx_ring()
1066 count = sc->cfg->mqrx_supported ? IWM_RX_MQ_RING_COUNT : in iwm_free_rx_ring()
1070 struct iwm_rx_data *data = &ring->data[i]; in iwm_free_rx_ring()
1072 if (data->m != NULL) { in iwm_free_rx_ring()
1073 bus_dmamap_sync(ring->data_dmat, data->map, in iwm_free_rx_ring()
1075 bus_dmamap_unload(ring->data_dmat, data->map); in iwm_free_rx_ring()
1076 m_freem(data->m); in iwm_free_rx_ring()
1077 data->m = NULL; in iwm_free_rx_ring()
1079 if (data->map != NULL) { in iwm_free_rx_ring()
1080 bus_dmamap_destroy(ring->data_dmat, data->map); in iwm_free_rx_ring()
1081 data->map = NULL; in iwm_free_rx_ring()
1084 if (ring->spare_map != NULL) { in iwm_free_rx_ring()
1085 bus_dmamap_destroy(ring->data_dmat, ring->spare_map); in iwm_free_rx_ring()
1086 ring->spare_map = NULL; in iwm_free_rx_ring()
1088 if (ring->data_dmat != NULL) { in iwm_free_rx_ring()
1089 bus_dma_tag_destroy(ring->data_dmat); in iwm_free_rx_ring()
1090 ring->data_dmat = NULL; in iwm_free_rx_ring()
1103 ring->qid = qid; in iwm_alloc_tx_ring()
1104 ring->queued = 0; in iwm_alloc_tx_ring()
1105 ring->cur = 0; in iwm_alloc_tx_ring()
1107 /* Allocate TX descriptors (256-byte aligned). */ in iwm_alloc_tx_ring()
1109 error = iwm_dma_contig_alloc(sc->sc_dmat, &ring->desc_dma, size, 256); in iwm_alloc_tx_ring()
1111 device_printf(sc->sc_dev, in iwm_alloc_tx_ring()
1115 ring->desc = ring->desc_dma.vaddr; in iwm_alloc_tx_ring()
1125 error = iwm_dma_contig_alloc(sc->sc_dmat, &ring->cmd_dma, size, 4); in iwm_alloc_tx_ring()
1127 device_printf(sc->sc_dev, in iwm_alloc_tx_ring()
1131 ring->cmd = ring->cmd_dma.vaddr; in iwm_alloc_tx_ring()
1139 nsegments = IWM_MAX_SCATTER - 2; in iwm_alloc_tx_ring()
1142 error = bus_dma_tag_create(sc->sc_dmat, 1, 0, in iwm_alloc_tx_ring()
1144 nsegments, maxsize, 0, NULL, NULL, &ring->data_dmat); in iwm_alloc_tx_ring()
1146 device_printf(sc->sc_dev, "could not create TX buf DMA tag\n"); in iwm_alloc_tx_ring()
1150 paddr = ring->cmd_dma.paddr; in iwm_alloc_tx_ring()
1152 struct iwm_tx_data *data = &ring->data[i]; in iwm_alloc_tx_ring()
1154 data->cmd_paddr = paddr; in iwm_alloc_tx_ring()
1155 data->scratch_paddr = paddr + sizeof(struct iwm_cmd_header) in iwm_alloc_tx_ring()
1159 error = bus_dmamap_create(ring->data_dmat, 0, &data->map); in iwm_alloc_tx_ring()
1161 device_printf(sc->sc_dev, in iwm_alloc_tx_ring()
1166 KASSERT(paddr == ring->cmd_dma.paddr + size, in iwm_alloc_tx_ring()
1180 struct iwm_tx_data *data = &ring->data[i]; in iwm_reset_tx_ring()
1182 if (data->m != NULL) { in iwm_reset_tx_ring()
1183 bus_dmamap_sync(ring->data_dmat, data->map, in iwm_reset_tx_ring()
1185 bus_dmamap_unload(ring->data_dmat, data->map); in iwm_reset_tx_ring()
1186 m_freem(data->m); in iwm_reset_tx_ring()
1187 data->m = NULL; in iwm_reset_tx_ring()
1191 memset(ring->desc, 0, ring->desc_dma.size); in iwm_reset_tx_ring()
1192 bus_dmamap_sync(ring->desc_dma.tag, ring->desc_dma.map, in iwm_reset_tx_ring()
1194 sc->qfullmsk &= ~(1 << ring->qid); in iwm_reset_tx_ring()
1195 ring->queued = 0; in iwm_reset_tx_ring()
1196 ring->cur = 0; in iwm_reset_tx_ring()
1198 if (ring->qid == IWM_CMD_QUEUE && sc->cmd_hold_nic_awake) in iwm_reset_tx_ring()
1207 iwm_dma_contig_free(&ring->desc_dma); in iwm_free_tx_ring()
1208 iwm_dma_contig_free(&ring->cmd_dma); in iwm_free_tx_ring()
1211 struct iwm_tx_data *data = &ring->data[i]; in iwm_free_tx_ring()
1213 if (data->m != NULL) { in iwm_free_tx_ring()
1214 bus_dmamap_sync(ring->data_dmat, data->map, in iwm_free_tx_ring()
1216 bus_dmamap_unload(ring->data_dmat, data->map); in iwm_free_tx_ring()
1217 m_freem(data->m); in iwm_free_tx_ring()
1218 data->m = NULL; in iwm_free_tx_ring()
1220 if (data->map != NULL) { in iwm_free_tx_ring()
1221 bus_dmamap_destroy(ring->data_dmat, data->map); in iwm_free_tx_ring()
1222 data->map = NULL; in iwm_free_tx_ring()
1225 if (ring->data_dmat != NULL) { in iwm_free_tx_ring()
1226 bus_dma_tag_destroy(ring->data_dmat); in iwm_free_tx_ring()
1227 ring->data_dmat = NULL; in iwm_free_tx_ring()
1232 * High-level hardware frobbing routines
1238 sc->sc_intmask = IWM_CSR_INI_SET_MASK; in iwm_enable_interrupts()
1239 IWM_WRITE(sc, IWM_CSR_INT_MASK, sc->sc_intmask); in iwm_enable_interrupts()
1245 IWM_WRITE(sc, IWM_CSR_INT_MASK, sc->sc_intmask); in iwm_restore_interrupts()
1265 memset(sc->ict_dma.vaddr, 0, IWM_ICT_SIZE); in iwm_ict_reset()
1266 sc->ict_cur = 0; in iwm_ict_reset()
1273 | sc->ict_dma.paddr >> IWM_ICT_PADDR_SHIFT); in iwm_ict_reset()
1276 sc->sc_flags |= IWM_FLAG_USE_ICT; in iwm_ict_reset()
1278 /* Re-enable interrupts. */ in iwm_ict_reset()
1286 * Since this .. hard-resets things, it's time to actually
1295 struct ieee80211com *ic = &sc->sc_ic; in iwm_stop_device()
1296 struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps); in iwm_stop_device()
1304 * FreeBSD-local: mark the first vap as not-uploaded, in iwm_stop_device()
1310 iv->phy_ctxt = NULL; in iwm_stop_device()
1311 iv->is_uploaded = 0; in iwm_stop_device()
1313 sc->sc_firmware_state = 0; in iwm_stop_device()
1314 sc->sc_flags &= ~IWM_FLAG_TE_ACTIVE; in iwm_stop_device()
1317 sc->sc_flags &= ~IWM_FLAG_USE_ICT; in iwm_stop_device()
1334 device_printf(sc->sc_dev, in iwm_stop_device()
1343 iwm_reset_rx_ring(sc, &sc->rxq); in iwm_stop_device()
1346 for (qid = 0; qid < nitems(sc->txq); qid++) in iwm_stop_device()
1347 iwm_reset_tx_ring(sc, &sc->txq[qid]); in iwm_stop_device()
1349 if (sc->cfg->device_family == IWM_DEVICE_FAMILY_7000) { in iwm_stop_device()
1350 /* Power-down device's busmaster DMA clocks */ in iwm_stop_device()
1366 /* stop and reset the on-board processor */ in iwm_stop_device()
1401 reg_val |= IWM_CSR_HW_REV_STEP(sc->sc_hw_rev) << in iwm_nic_config()
1403 reg_val |= IWM_CSR_HW_REV_DASH(sc->sc_hw_rev) << in iwm_nic_config()
1422 "Radio type=0x%x-0x%x-0x%x\n", radio_cfg_type, in iwm_nic_config()
1430 if (sc->cfg->device_family == IWM_DEVICE_FAMILY_7000) { in iwm_nic_config()
1451 sc->rxq.free_desc_dma.paddr); in iwm_nic_rx_mq_init()
1453 sc->rxq.used_desc_dma.paddr); in iwm_nic_rx_mq_init()
1455 sc->rxq.stat_dma.paddr); in iwm_nic_rx_mq_init()
1475 (sc->cfg->integrated ? IWM_RFH_GEN_CFG_RB_CHUNK_SIZE_64 : in iwm_nic_rx_mq_init()
1506 /* Set physical address of RX ring (256-byte aligned). */ in iwm_nic_rx_legacy_init()
1509 sc->rxq.free_desc_dma.paddr >> 8); in iwm_nic_rx_legacy_init()
1511 /* Set physical address of RX status (16-byte aligned). */ in iwm_nic_rx_legacy_init()
1513 IWM_FH_RSCSR_CHNL0_STTS_WPTR_REG, sc->rxq.stat_dma.paddr >> 4); in iwm_nic_rx_legacy_init()
1535 if (sc->cfg->host_interrupt_operation_mode) in iwm_nic_rx_legacy_init()
1548 if (sc->cfg->mqrx_supported) in iwm_nic_rx_init()
1565 /* Set physical address of "keep warm" page (16-byte aligned). */ in iwm_nic_tx_init()
1566 IWM_WRITE(sc, IWM_FH_KW_MEM_ADDR_REG, sc->kw_dma.paddr >> 4); in iwm_nic_tx_init()
1569 for (qid = 0; qid < nitems(sc->txq); qid++) { in iwm_nic_tx_init()
1570 struct iwm_tx_ring *txq = &sc->txq[qid]; in iwm_nic_tx_init()
1572 /* Set physical address of TX ring (256-byte aligned). */ in iwm_nic_tx_init()
1574 txq->desc_dma.paddr >> 8); in iwm_nic_tx_init()
1578 qid, txq->desc, in iwm_nic_tx_init()
1579 (unsigned long) (txq->desc_dma.paddr >> 8)); in iwm_nic_tx_init()
1597 if (sc->cfg->device_family == IWM_DEVICE_FAMILY_7000) in iwm_nic_init()
1626 device_printf(sc->sc_dev, "%s: cannot enable txq %d\n", in iwm_enable_txq()
1648 device_printf(sc->sc_dev, in iwm_enable_txq()
1656 sc->scd_base_addr + IWM_SCD_CONTEXT_QUEUE_OFFSET(qid), 0); in iwm_enable_txq()
1659 sc->scd_base_addr + IWM_SCD_CONTEXT_QUEUE_OFFSET(qid) + in iwm_enable_txq()
1667 device_printf(sc->sc_dev, in iwm_enable_txq()
1696 device_printf(sc->sc_dev, in iwm_enable_txq()
1718 int clear_dwords = (IWM_SCD_TRANS_TBL_MEM_UPPER_BOUND - in iwm_trans_pcie_fw_alive()
1726 sc->scd_base_addr = iwm_read_prph(sc, IWM_SCD_SRAM_BASE_ADDR); in iwm_trans_pcie_fw_alive()
1728 scd_base_addr != sc->scd_base_addr) { in iwm_trans_pcie_fw_alive()
1729 device_printf(sc->sc_dev, in iwm_trans_pcie_fw_alive()
1731 __func__, sc->scd_base_addr, scd_base_addr); in iwm_trans_pcie_fw_alive()
1738 sc->scd_base_addr + IWM_SCD_CONTEXT_MEM_LOWER_BOUND, in iwm_trans_pcie_fw_alive()
1747 iwm_write_prph(sc, IWM_SCD_DRAM_BASE_ADDR, sc->sched_dma.paddr >> 10); in iwm_trans_pcie_fw_alive()
1775 /* Enable L1-Active */ in iwm_trans_pcie_fw_alive()
1776 if (sc->cfg->device_family < IWM_DEVICE_FAMILY_8000) { in iwm_trans_pcie_fw_alive()
1826 device_printf(sc->sc_dev, in iwm_nvm_read_chunk()
1834 nvm_resp = (void *)pkt->data; in iwm_nvm_read_chunk()
1835 ret = le16toh(nvm_resp->status); in iwm_nvm_read_chunk()
1836 bytes_read = le16toh(nvm_resp->length); in iwm_nvm_read_chunk()
1837 offset_read = le16toh(nvm_resp->offset); in iwm_nvm_read_chunk()
1838 resp_data = nvm_resp->data; in iwm_nvm_read_chunk()
1864 device_printf(sc->sc_dev, in iwm_nvm_read_chunk()
1872 device_printf(sc->sc_dev, in iwm_nvm_read_chunk()
1915 sc->cfg->eeprom_size) { in iwm_nvm_read_section()
1916 device_printf(sc->sc_dev, in iwm_nvm_read_section()
1941 /* iwlwifi/iwl-nvm-parse.c */
1970 const uint16_t * const nvm_ch_flags = sc->nvm_data->nvm_ch_flags; in iwm_add_channel_band()
1978 if (sc->cfg->device_family == IWM_DEVICE_FAMILY_7000) in iwm_add_channel_band()
1985 "Ch. %d Flags %x [%sGHz] - No traffic\n", in iwm_add_channel_band()
1999 "Ch. %d Flags %x [%sGHz] - Added\n", in iwm_add_channel_band()
2010 struct iwm_softc *sc = ic->ic_softc; in iwm_init_channel_map()
2011 struct iwm_nvm_data *data = sc->nvm_data; in iwm_init_channel_map()
2016 /* 1-13: 11b/g channels. */ in iwm_init_channel_map()
2020 IWM_NUM_2GHZ_CHANNELS - 1, bands); in iwm_init_channel_map()
2025 IWM_NUM_2GHZ_CHANNELS - 1, IWM_NUM_2GHZ_CHANNELS, bands); in iwm_init_channel_map()
2027 if (data->sku_cap_band_52GHz_enable) { in iwm_init_channel_map()
2028 if (sc->cfg->device_family == IWM_DEVICE_FAMILY_7000) in iwm_init_channel_map()
2057 IEEE80211_ADDR_COPY(data->hw_addr, hw_addr); in iwm_set_hw_address_family_8000()
2064 !IEEE80211_ADDR_EQ(ieee80211broadcastaddr, data->hw_addr) && in iwm_set_hw_address_family_8000()
2065 iwm_is_valid_ether_addr(data->hw_addr) && in iwm_set_hw_address_family_8000()
2066 !IEEE80211_IS_MULTICAST(data->hw_addr)) in iwm_set_hw_address_family_8000()
2082 data->hw_addr[0] = hw_addr[3]; in iwm_set_hw_address_family_8000()
2083 data->hw_addr[1] = hw_addr[2]; in iwm_set_hw_address_family_8000()
2084 data->hw_addr[2] = hw_addr[1]; in iwm_set_hw_address_family_8000()
2085 data->hw_addr[3] = hw_addr[0]; in iwm_set_hw_address_family_8000()
2088 data->hw_addr[4] = hw_addr[1]; in iwm_set_hw_address_family_8000()
2089 data->hw_addr[5] = hw_addr[0]; in iwm_set_hw_address_family_8000()
2094 device_printf(sc->sc_dev, "%s: mac address not found\n", __func__); in iwm_set_hw_address_family_8000()
2095 memset(data->hw_addr, 0, sizeof(data->hw_addr)); in iwm_set_hw_address_family_8000()
2102 if (sc->cfg->device_family < IWM_DEVICE_FAMILY_8000) in iwm_get_sku()
2111 if (sc->cfg->device_family < IWM_DEVICE_FAMILY_8000) in iwm_get_nvm_version()
2122 if (sc->cfg->device_family < IWM_DEVICE_FAMILY_8000) in iwm_get_radio_cfg()
2133 if (sc->cfg->device_family < IWM_DEVICE_FAMILY_8000) in iwm_get_n_hw_addrs()
2145 if (sc->cfg->device_family < IWM_DEVICE_FAMILY_8000) { in iwm_set_radio_cfg()
2146 data->radio_cfg_type = IWM_NVM_RF_CFG_TYPE_MSK(radio_cfg); in iwm_set_radio_cfg()
2147 data->radio_cfg_step = IWM_NVM_RF_CFG_STEP_MSK(radio_cfg); in iwm_set_radio_cfg()
2148 data->radio_cfg_dash = IWM_NVM_RF_CFG_DASH_MSK(radio_cfg); in iwm_set_radio_cfg()
2149 data->radio_cfg_pnum = IWM_NVM_RF_CFG_PNUM_MSK(radio_cfg); in iwm_set_radio_cfg()
2154 data->radio_cfg_type = IWM_NVM_RF_CFG_TYPE_MSK_8000(radio_cfg); in iwm_set_radio_cfg()
2155 data->radio_cfg_step = IWM_NVM_RF_CFG_STEP_MSK_8000(radio_cfg); in iwm_set_radio_cfg()
2156 data->radio_cfg_dash = IWM_NVM_RF_CFG_DASH_MSK_8000(radio_cfg); in iwm_set_radio_cfg()
2157 data->radio_cfg_pnum = IWM_NVM_RF_CFG_PNUM_MSK_8000(radio_cfg); in iwm_set_radio_cfg()
2158 data->valid_tx_ant = IWM_NVM_RF_CFG_TX_ANT_MSK_8000(radio_cfg); in iwm_set_radio_cfg()
2159 data->valid_rx_ant = IWM_NVM_RF_CFG_RX_ANT_MSK_8000(radio_cfg); in iwm_set_radio_cfg()
2167 if (cfg->mac_addr_from_csr) { in iwm_set_hw_address()
2171 if (sc->cfg->device_family < IWM_DEVICE_FAMILY_8000) { in iwm_set_hw_address()
2175 data->hw_addr[0] = hw_addr[1]; in iwm_set_hw_address()
2176 data->hw_addr[1] = hw_addr[0]; in iwm_set_hw_address()
2177 data->hw_addr[2] = hw_addr[3]; in iwm_set_hw_address()
2178 data->hw_addr[3] = hw_addr[2]; in iwm_set_hw_address()
2179 data->hw_addr[4] = hw_addr[5]; in iwm_set_hw_address()
2180 data->hw_addr[5] = hw_addr[4]; in iwm_set_hw_address()
2185 if (!iwm_is_valid_ether_addr(data->hw_addr)) { in iwm_set_hw_address()
2186 device_printf(sc->sc_dev, "no valid mac address was found\n"); in iwm_set_hw_address()
2203 if (sc->cfg->device_family < IWM_DEVICE_FAMILY_8000) { in iwm_parse_nvm_data()
2215 data->nvm_version = iwm_get_nvm_version(sc, nvm_sw); in iwm_parse_nvm_data()
2221 data->sku_cap_band_24GHz_enable = sku & IWM_NVM_SKU_CAP_BAND_24GHZ; in iwm_parse_nvm_data()
2222 data->sku_cap_band_52GHz_enable = sku & IWM_NVM_SKU_CAP_BAND_52GHZ; in iwm_parse_nvm_data()
2223 data->sku_cap_11n_enable = sku & IWM_NVM_SKU_CAP_11N_ENABLE; in iwm_parse_nvm_data()
2224 data->sku_cap_mimo_disable = sku & IWM_NVM_SKU_CAP_MIMO_DISABLE; in iwm_parse_nvm_data()
2226 data->n_hw_addrs = iwm_get_n_hw_addrs(sc, nvm_sw); in iwm_parse_nvm_data()
2228 if (sc->cfg->device_family >= IWM_DEVICE_FAMILY_8000) { in iwm_parse_nvm_data()
2230 uint16_t lar_offset = data->nvm_version < 0xE39 ? in iwm_parse_nvm_data()
2235 data->lar_enabled = !!(lar_config & in iwm_parse_nvm_data()
2239 /* If no valid mac address was found - bail out */ in iwm_parse_nvm_data()
2245 if (sc->cfg->device_family == IWM_DEVICE_FAMILY_7000) { in iwm_parse_nvm_data()
2246 memcpy(data->nvm_ch_flags, sc->cfg->nvm_type == IWM_NVM_SDP ? in iwm_parse_nvm_data()
2250 memcpy(data->nvm_ch_flags, ®ulatory[IWM_NVM_CHANNELS_8000], in iwm_parse_nvm_data()
2270 if (sc->cfg->device_family == IWM_DEVICE_FAMILY_7000) { in iwm_parse_nvm_sections()
2272 !sections[sc->cfg->nvm_hw_section_num].data) { in iwm_parse_nvm_sections()
2273 device_printf(sc->sc_dev, in iwm_parse_nvm_sections()
2277 } else if (sc->cfg->device_family >= IWM_DEVICE_FAMILY_8000) { in iwm_parse_nvm_sections()
2281 device_printf(sc->sc_dev, in iwm_parse_nvm_sections()
2286 if (!sections[sc->cfg->nvm_hw_section_num].data && in iwm_parse_nvm_sections()
2288 device_printf(sc->sc_dev, in iwm_parse_nvm_sections()
2295 device_printf(sc->sc_dev, in iwm_parse_nvm_sections()
2300 panic("unknown device family %d\n", sc->cfg->device_family); in iwm_parse_nvm_sections()
2303 hw = (const uint16_t *) sections[sc->cfg->nvm_hw_section_num].data; in iwm_parse_nvm_sections()
2307 regulatory = sc->cfg->nvm_type == IWM_NVM_SDP ? in iwm_parse_nvm_sections()
2329 if (sc->cfg->nvm_hw_section_num >= IWM_NVM_NUM_OF_SECTIONS) in iwm_nvm_init()
2336 nvm_buffer = malloc(sc->cfg->eeprom_size, M_DEVBUF, M_NOWAIT | M_ZERO); in iwm_nvm_init()
2357 device_printf(sc->sc_dev, "OTP is blank\n"); in iwm_nvm_init()
2360 sc->nvm_data = iwm_parse_nvm_sections(sc, nvm_sections); in iwm_nvm_init()
2361 if (!sc->nvm_data) in iwm_nvm_init()
2364 "nvm version = %x\n", sc->nvm_data->nvm_version); in iwm_nvm_init()
2378 struct iwm_dma_info *dma = &sc->fw_dma; in iwm_pcie_load_section()
2381 uint32_t offset, chunk_sz = MIN(IWM_FH_MEM_TB_MAX_LENGTH, section->len); in iwm_pcie_load_section()
2388 v_addr = dma->vaddr; in iwm_pcie_load_section()
2389 p_addr = dma->paddr; in iwm_pcie_load_section()
2391 for (offset = 0; offset < section->len; offset += chunk_sz) { in iwm_pcie_load_section()
2395 copy_size = MIN(chunk_sz, section->len - offset); in iwm_pcie_load_section()
2396 dst_addr = section->offset + offset; in iwm_pcie_load_section()
2406 memcpy(v_addr, (const uint8_t *)section->data + offset, in iwm_pcie_load_section()
2408 bus_dmamap_sync(dma->tag, dma->map, BUS_DMASYNC_PREWRITE); in iwm_pcie_load_section()
2417 device_printf(sc->sc_dev, in iwm_pcie_load_section()
2434 sc->sc_fw_chunk_done = 0; in iwm_pcie_load_firmware_chunk()
2465 msleep(&sc->sc_fw, &sc->sc_mtx, 0, "iwmfw", hz * 5); in iwm_pcie_load_firmware_chunk()
2467 if (!sc->sc_fw_chunk_done) { in iwm_pcie_load_firmware_chunk()
2468 device_printf(sc->sc_dev, in iwm_pcie_load_firmware_chunk()
2497 * CPU1_CPU2_SEPARATOR_SECTION delimiter - separate between in iwm_pcie_load_cpu_sections_8000()
2499 * PAGING_SEPARATOR_SECTION delimiter - separate between in iwm_pcie_load_cpu_sections_8000()
2502 if (!image->sec[i].data || in iwm_pcie_load_cpu_sections_8000()
2503 image->sec[i].offset == IWM_CPU1_CPU2_SEPARATOR_SECTION || in iwm_pcie_load_cpu_sections_8000()
2504 image->sec[i].offset == IWM_PAGING_SEPARATOR_SECTION) { in iwm_pcie_load_cpu_sections_8000()
2510 ret = iwm_pcie_load_section(sc, i, &image->sec[i]); in iwm_pcie_load_cpu_sections_8000()
2556 * CPU1_CPU2_SEPARATOR_SECTION delimiter - separate between in iwm_pcie_load_cpu_sections()
2558 * PAGING_SEPARATOR_SECTION delimiter - separate between in iwm_pcie_load_cpu_sections()
2561 if (!image->sec[i].data || in iwm_pcie_load_cpu_sections()
2562 image->sec[i].offset == IWM_CPU1_CPU2_SEPARATOR_SECTION || in iwm_pcie_load_cpu_sections()
2563 image->sec[i].offset == IWM_PAGING_SEPARATOR_SECTION) { in iwm_pcie_load_cpu_sections()
2570 ret = iwm_pcie_load_section(sc, i, &image->sec[i]); in iwm_pcie_load_cpu_sections()
2588 image->is_dual_cpus ? "Dual" : "Single"); in iwm_pcie_load_given_ucode()
2595 if (image->is_dual_cpus) { in iwm_pcie_load_given_ucode()
2627 image->is_dual_cpus ? "Dual" : "Single"); in iwm_pcie_load_given_ucode_8000()
2653 sc->sc_intmask = IWM_CSR_INT_BIT_FH_TX; in iwm_enable_fw_load_int()
2654 IWM_WRITE(sc, IWM_CSR_INT_MASK, sc->sc_intmask); in iwm_enable_fw_load_int()
2665 device_printf(sc->sc_dev, in iwm_start_fw()
2685 device_printf(sc->sc_dev, "%s: Unable to init nic\n", __func__); in iwm_start_fw()
2691 * by the RF-Kill interrupt (hence mask all the interrupt besides the in iwm_start_fw()
2693 * RF-Kill switch is toggled, we will find out after having loaded in iwm_start_fw()
2704 if (sc->cfg->device_family >= IWM_DEVICE_FAMILY_8000) in iwm_start_fw()
2709 /* XXX re-check RF-Kill state */ in iwm_start_fw()
2731 enum iwm_ucode_type ucode_type = sc->cur_ucode; in iwm_send_phy_cfg_cmd()
2736 sc->sc_default_calib[ucode_type].event_trigger; in iwm_send_phy_cfg_cmd()
2738 sc->sc_default_calib[ucode_type].flow_trigger; in iwm_send_phy_cfg_cmd()
2758 palive = (void *)pkt->data; in iwm_alive_fn()
2759 umac = &palive->umac_data; in iwm_alive_fn()
2760 lmac1 = &palive->lmac_data[0]; in iwm_alive_fn()
2761 lmac2 = &palive->lmac_data[1]; in iwm_alive_fn()
2762 status = le16toh(palive->status); in iwm_alive_fn()
2764 palive3 = (void *)pkt->data; in iwm_alive_fn()
2765 umac = &palive3->umac_data; in iwm_alive_fn()
2766 lmac1 = &palive3->lmac_data; in iwm_alive_fn()
2767 status = le16toh(palive3->status); in iwm_alive_fn()
2770 sc->error_event_table[0] = le32toh(lmac1->error_event_table_ptr); in iwm_alive_fn()
2772 sc->error_event_table[1] = in iwm_alive_fn()
2773 le32toh(lmac2->error_event_table_ptr); in iwm_alive_fn()
2774 sc->log_event_table = le32toh(lmac1->log_event_table_ptr); in iwm_alive_fn()
2775 sc->umac_error_event_table = le32toh(umac->error_info_addr); in iwm_alive_fn()
2776 alive_data->scd_base_addr = le32toh(lmac1->scd_base_ptr); in iwm_alive_fn()
2777 alive_data->valid = status == IWM_ALIVE_STATUS_OK; in iwm_alive_fn()
2778 if (sc->umac_error_event_table) in iwm_alive_fn()
2779 sc->support_umac_log = TRUE; in iwm_alive_fn()
2783 status, lmac1->ver_type, lmac1->ver_subtype); in iwm_alive_fn()
2789 "UMAC version: Major - 0x%x, Minor - 0x%x\n", in iwm_alive_fn()
2790 le32toh(umac->umac_major), in iwm_alive_fn()
2791 le32toh(umac->umac_minor)); in iwm_alive_fn()
2802 if (pkt->hdr.code != IWM_CALIB_RES_NOTIF_PHY_DB) { in iwm_wait_phy_db_entry()
2803 if(pkt->hdr.code != IWM_INIT_COMPLETE_NOTIF) { in iwm_wait_phy_db_entry()
2804 device_printf(sc->sc_dev, "%s: Unexpected cmd: %d\n", in iwm_wait_phy_db_entry()
2805 __func__, pkt->hdr.code); in iwm_wait_phy_db_entry()
2811 device_printf(sc->sc_dev, in iwm_wait_phy_db_entry()
2825 enum iwm_ucode_type old_type = sc->cur_ucode; in iwm_load_ucode_wait_alive()
2829 fw = &sc->sc_fw.img[ucode_type]; in iwm_load_ucode_wait_alive()
2830 sc->cur_ucode = ucode_type; in iwm_load_ucode_wait_alive()
2831 sc->ucode_loaded = FALSE; in iwm_load_ucode_wait_alive()
2834 iwm_init_notification_wait(sc->sc_notif_wait, &alive_wait, in iwm_load_ucode_wait_alive()
2840 device_printf(sc->sc_dev, "iwm_start_fw: failed %d\n", error); in iwm_load_ucode_wait_alive()
2841 sc->cur_ucode = old_type; in iwm_load_ucode_wait_alive()
2842 iwm_remove_notification(sc->sc_notif_wait, &alive_wait); in iwm_load_ucode_wait_alive()
2851 error = iwm_wait_notification(sc->sc_notif_wait, &alive_wait, in iwm_load_ucode_wait_alive()
2855 if (sc->cfg->device_family >= IWM_DEVICE_FAMILY_8000) { in iwm_load_ucode_wait_alive()
2862 device_printf(sc->sc_dev, in iwm_load_ucode_wait_alive()
2866 sc->cur_ucode = old_type; in iwm_load_ucode_wait_alive()
2871 device_printf(sc->sc_dev, "%s: Loaded ucode is not valid\n", in iwm_load_ucode_wait_alive()
2873 sc->cur_ucode = old_type; in iwm_load_ucode_wait_alive()
2884 if (fw->paging_mem_size) { in iwm_load_ucode_wait_alive()
2887 device_printf(sc->sc_dev, in iwm_load_ucode_wait_alive()
2895 device_printf(sc->sc_dev, in iwm_load_ucode_wait_alive()
2903 sc->ucode_loaded = TRUE; in iwm_load_ucode_wait_alive()
2925 if ((sc->sc_flags & IWM_FLAG_RFKILL) && !justnvm) { in iwm_run_init_ucode()
2926 device_printf(sc->sc_dev, in iwm_run_init_ucode()
2931 iwm_init_notification_wait(sc->sc_notif_wait, in iwm_run_init_ucode()
2936 sc->sc_phy_db); in iwm_run_init_ucode()
2941 device_printf(sc->sc_dev, "Failed to start INIT ucode: %d\n", in iwm_run_init_ucode()
2946 if (sc->cfg->device_family < IWM_DEVICE_FAMILY_8000) { in iwm_run_init_ucode()
2949 device_printf(sc->sc_dev, in iwm_run_init_ucode()
2959 device_printf(sc->sc_dev, "failed to read nvm\n"); in iwm_run_init_ucode()
2962 IEEE80211_ADDR_COPY(sc->sc_ic.ic_macaddr, sc->nvm_data->hw_addr); in iwm_run_init_ucode()
2969 device_printf(sc->sc_dev, in iwm_run_init_ucode()
2980 device_printf(sc->sc_dev, in iwm_run_init_ucode()
2991 ret = iwm_wait_notification(sc->sc_notif_wait, &calib_wait, in iwm_run_init_ucode()
2999 iwm_remove_notification(sc->sc_notif_wait, &calib_wait); in iwm_run_init_ucode()
3011 if (!sc->sc_ltr_enabled) in iwm_config_ltr()
3021 /* (re)stock rx ring, called at init-time and at runtime */
3025 struct iwm_rx_ring *ring = &sc->rxq; in iwm_rx_addbuf()
3026 struct iwm_rx_data *data = &ring->data[idx]; in iwm_rx_addbuf()
3036 m->m_len = m->m_pkthdr.len = m->m_ext.ext_size; in iwm_rx_addbuf()
3037 error = bus_dmamap_load_mbuf_sg(ring->data_dmat, ring->spare_map, m, in iwm_rx_addbuf()
3040 device_printf(sc->sc_dev, in iwm_rx_addbuf()
3046 if (data->m != NULL) in iwm_rx_addbuf()
3047 bus_dmamap_unload(ring->data_dmat, data->map); in iwm_rx_addbuf()
3049 /* Swap ring->spare_map with data->map */ in iwm_rx_addbuf()
3050 dmamap = data->map; in iwm_rx_addbuf()
3051 data->map = ring->spare_map; in iwm_rx_addbuf()
3052 ring->spare_map = dmamap; in iwm_rx_addbuf()
3054 bus_dmamap_sync(ring->data_dmat, data->map, BUS_DMASYNC_PREREAD); in iwm_rx_addbuf()
3055 data->m = m; in iwm_rx_addbuf()
3057 /* Update RX descriptor. */ in iwm_rx_addbuf()
3059 if (sc->cfg->mqrx_supported) in iwm_rx_addbuf()
3060 ((uint64_t *)ring->desc)[idx] = htole64(seg.ds_addr); in iwm_rx_addbuf()
3062 ((uint32_t *)ring->desc)[idx] = htole32(seg.ds_addr >> 8); in iwm_rx_addbuf()
3063 bus_dmamap_sync(ring->free_desc_dma.tag, ring->free_desc_dma.map, in iwm_rx_addbuf()
3072 struct iwm_rx_phy_info *phy_info = (void *)pkt->data; in iwm_rx_rx_phy_cmd()
3076 memcpy(&sc->sc_last_phy_info, phy_info, sizeof(sc->sc_last_phy_info)); in iwm_rx_rx_phy_cmd()
3095 noise = le32toh(stats->beacon_silence_rssi[i]) & 0xff; in iwm_get_noise()
3111 return (nbant == 0) ? -127 : (total / nbant) - 107; in iwm_get_noise()
3113 /* For now, just hard-code it to -96 to be safe */ in iwm_get_noise()
3114 return (-96); in iwm_get_noise()
3121 struct iwm_notif_statistics *stats = (void *)&pkt->data; in iwm_handle_rx_statistics()
3123 memcpy(&sc->sc_stats, stats, sizeof(sc->sc_stats)); in iwm_handle_rx_statistics()
3124 sc->sc_noise = iwm_get_noise(sc, &stats->rx.general); in iwm_handle_rx_statistics()
3129 * iwm_get_signal_strength - use new rx PHY INFO API
3130 * values are reported by the fw as positive values - need to negate
3132 * values by -256dBm: practically 0 power and a non-feasible 8 bit value.
3141 val = le32toh(phy_info->non_cfg_phy[IWM_RX_INFO_ENERGY_ANT_ABC_IDX]); in iwm_rx_get_signal_strength()
3144 energy_a = energy_a ? -energy_a : -256; in iwm_rx_get_signal_strength()
3147 energy_b = energy_b ? -energy_b : -256; in iwm_rx_get_signal_strength()
3150 energy_c = energy_c ? -energy_c : -256; in iwm_rx_get_signal_strength()
3167 energy_a = desc->v1.energy_a; in iwm_rxmq_get_signal_strength()
3168 energy_b = desc->v1.energy_b; in iwm_rxmq_get_signal_strength()
3169 energy_a = energy_a ? -energy_a : -256; in iwm_rxmq_get_signal_strength()
3170 energy_b = energy_b ? -energy_b : -256; in iwm_rxmq_get_signal_strength()
3175 * iwm_rx_rx_mpdu - IWM_REPLY_RX_MPDU_CMD handler
3183 struct ieee80211com *ic = &sc->sc_ic; in iwm_rx_rx_mpdu()
3184 struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps); in iwm_rx_rx_mpdu()
3193 phy_info = &sc->sc_last_phy_info; in iwm_rx_rx_mpdu()
3194 rx_res = (struct iwm_rx_mpdu_res_start *)pkt->data; in iwm_rx_rx_mpdu()
3195 len = le16toh(rx_res->byte_count); in iwm_rx_rx_mpdu()
3196 rx_pkt_status = le32toh(*(uint32_t *)(pkt->data + sizeof(*rx_res) + len)); in iwm_rx_rx_mpdu()
3198 if (__predict_false(phy_info->cfg_phy_cnt > 20)) { in iwm_rx_rx_mpdu()
3199 device_printf(sc->sc_dev, in iwm_rx_rx_mpdu()
3201 phy_info->cfg_phy_cnt); in iwm_rx_rx_mpdu()
3215 rssi = rssi - sc->sc_noise; in iwm_rx_rx_mpdu()
3218 if (!stolen && iwm_rx_addbuf(sc, IWM_RBUF_SIZE, sc->rxq.cur) != 0) { in iwm_rx_rx_mpdu()
3219 device_printf(sc->sc_dev, "%s: unable to add more buffers\n", in iwm_rx_rx_mpdu()
3224 m->m_data = pkt->data + sizeof(*rx_res); in iwm_rx_rx_mpdu()
3225 m->m_pkthdr.len = m->m_len = len; in iwm_rx_rx_mpdu()
3228 "%s: rssi=%d, noise=%d\n", __func__, rssi, sc->sc_noise); in iwm_rx_rx_mpdu()
3233 le16toh(phy_info->channel), in iwm_rx_rx_mpdu()
3234 le16toh(phy_info->phy_flags)); in iwm_rx_rx_mpdu()
3243 rxs.c_ieee = le16toh(phy_info->channel); in iwm_rx_rx_mpdu()
3244 if (le16toh(phy_info->phy_flags & IWM_RX_RES_PHY_FLAGS_BAND_24)) { in iwm_rx_rx_mpdu()
3254 rxs.c_nf = sc->sc_noise; in iwm_rx_rx_mpdu()
3259 struct iwm_rx_radiotap_header *tap = &sc->sc_rxtap; in iwm_rx_rx_mpdu()
3261 tap->wr_flags = 0; in iwm_rx_rx_mpdu()
3262 if (phy_info->phy_flags & htole16(IWM_PHY_INFO_FLAG_SHPREAMBLE)) in iwm_rx_rx_mpdu()
3263 tap->wr_flags |= IEEE80211_RADIOTAP_F_SHORTPRE; in iwm_rx_rx_mpdu()
3264 tap->wr_chan_freq = htole16(rxs.c_freq); in iwm_rx_rx_mpdu()
3265 /* XXX only if ic->ic_curchan->ic_ieee == rxs.c_ieee */ in iwm_rx_rx_mpdu()
3266 tap->wr_chan_flags = htole16(ic->ic_curchan->ic_flags); in iwm_rx_rx_mpdu()
3267 tap->wr_dbm_antsignal = (int8_t)rssi; in iwm_rx_rx_mpdu()
3268 tap->wr_dbm_antnoise = (int8_t)sc->sc_noise; in iwm_rx_rx_mpdu()
3269 tap->wr_tsft = phy_info->system_timestamp; in iwm_rx_rx_mpdu()
3270 switch (phy_info->rate) { in iwm_rx_rx_mpdu()
3272 case 10: tap->wr_rate = 2; break; in iwm_rx_rx_mpdu()
3273 case 20: tap->wr_rate = 4; break; in iwm_rx_rx_mpdu()
3274 case 55: tap->wr_rate = 11; break; in iwm_rx_rx_mpdu()
3275 case 110: tap->wr_rate = 22; break; in iwm_rx_rx_mpdu()
3277 case 0xd: tap->wr_rate = 12; break; in iwm_rx_rx_mpdu()
3278 case 0xf: tap->wr_rate = 18; break; in iwm_rx_rx_mpdu()
3279 case 0x5: tap->wr_rate = 24; break; in iwm_rx_rx_mpdu()
3280 case 0x7: tap->wr_rate = 36; break; in iwm_rx_rx_mpdu()
3281 case 0x9: tap->wr_rate = 48; break; in iwm_rx_rx_mpdu()
3282 case 0xb: tap->wr_rate = 72; break; in iwm_rx_rx_mpdu()
3283 case 0x1: tap->wr_rate = 96; break; in iwm_rx_rx_mpdu()
3284 case 0x3: tap->wr_rate = 108; break; in iwm_rx_rx_mpdu()
3286 default: tap->wr_rate = 0; in iwm_rx_rx_mpdu()
3297 struct ieee80211com *ic = &sc->sc_ic; in iwm_rx_mpdu_mq()
3298 struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps); in iwm_rx_mpdu_mq()
3309 desc = (void *)pkt->data; in iwm_rx_mpdu_mq()
3311 if (!(desc->status & htole16(IWM_RX_MPDU_RES_STATUS_CRC_OK)) || in iwm_rx_mpdu_mq()
3312 !(desc->status & htole16(IWM_RX_MPDU_RES_STATUS_OVERRUN_OK))) { in iwm_rx_mpdu_mq()
3314 "Bad CRC or FIFO: 0x%08X.\n", desc->status); in iwm_rx_mpdu_mq()
3318 channel = desc->v1.channel; in iwm_rx_mpdu_mq()
3319 len = le16toh(desc->mpdu_len); in iwm_rx_mpdu_mq()
3320 phy_info = le16toh(desc->phy_info); in iwm_rx_mpdu_mq()
3321 rate_n_flags = desc->v1.rate_n_flags; in iwm_rx_mpdu_mq()
3324 m->m_data = pkt->data + sizeof(*desc); in iwm_rx_mpdu_mq()
3325 m->m_pkthdr.len = m->m_len = len; in iwm_rx_mpdu_mq()
3326 m->m_len = len; in iwm_rx_mpdu_mq()
3329 if ((desc->mac_flags2 & IWM_RX_MPDU_MFLG2_PAD)) { in iwm_rx_mpdu_mq()
3332 m->m_data = mtodo(m, 2); in iwm_rx_mpdu_mq()
3338 rssi = rssi - sc->sc_noise; in iwm_rx_mpdu_mq()
3341 if (!stolen && iwm_rx_addbuf(sc, IWM_RBUF_SIZE, sc->rxq.cur) != 0) { in iwm_rx_mpdu_mq()
3342 device_printf(sc->sc_dev, "%s: unable to add more buffers\n", in iwm_rx_mpdu_mq()
3348 "%s: rssi=%d, noise=%d\n", __func__, rssi, sc->sc_noise); in iwm_rx_mpdu_mq()
3364 rxs.c_nf = sc->sc_noise; in iwm_rx_mpdu_mq()
3369 struct iwm_rx_radiotap_header *tap = &sc->sc_rxtap; in iwm_rx_mpdu_mq()
3371 tap->wr_flags = 0; in iwm_rx_mpdu_mq()
3373 tap->wr_flags |= IEEE80211_RADIOTAP_F_SHORTPRE; in iwm_rx_mpdu_mq()
3374 tap->wr_chan_freq = htole16(rxs.c_freq); in iwm_rx_mpdu_mq()
3375 /* XXX only if ic->ic_curchan->ic_ieee == rxs.c_ieee */ in iwm_rx_mpdu_mq()
3376 tap->wr_chan_flags = htole16(ic->ic_curchan->ic_flags); in iwm_rx_mpdu_mq()
3377 tap->wr_dbm_antsignal = (int8_t)rssi; in iwm_rx_mpdu_mq()
3378 tap->wr_dbm_antnoise = (int8_t)sc->sc_noise; in iwm_rx_mpdu_mq()
3379 tap->wr_tsft = desc->v1.gp2_on_air_rise; in iwm_rx_mpdu_mq()
3382 case 10: tap->wr_rate = 2; break; in iwm_rx_mpdu_mq()
3383 case 20: tap->wr_rate = 4; break; in iwm_rx_mpdu_mq()
3384 case 55: tap->wr_rate = 11; break; in iwm_rx_mpdu_mq()
3385 case 110: tap->wr_rate = 22; break; in iwm_rx_mpdu_mq()
3387 case 0xd: tap->wr_rate = 12; break; in iwm_rx_mpdu_mq()
3388 case 0xf: tap->wr_rate = 18; break; in iwm_rx_mpdu_mq()
3389 case 0x5: tap->wr_rate = 24; break; in iwm_rx_mpdu_mq()
3390 case 0x7: tap->wr_rate = 36; break; in iwm_rx_mpdu_mq()
3391 case 0x9: tap->wr_rate = 48; break; in iwm_rx_mpdu_mq()
3392 case 0xb: tap->wr_rate = 72; break; in iwm_rx_mpdu_mq()
3393 case 0x1: tap->wr_rate = 96; break; in iwm_rx_mpdu_mq()
3394 case 0x3: tap->wr_rate = 108; break; in iwm_rx_mpdu_mq()
3396 default: tap->wr_rate = 0; in iwm_rx_mpdu_mq()
3412 ic = &sc->sc_ic; in iwm_rx_mpdu()
3414 ret = sc->cfg->mqrx_supported ? in iwm_rx_mpdu()
3418 counter_u64_add(ic->ic_ierrors, 1); in iwm_rx_mpdu()
3443 struct iwm_tx_resp *tx_resp = (void *)pkt->data; in iwm_rx_tx_cmd_single()
3444 struct ieee80211_ratectl_tx_status *txs = &sc->sc_txs; in iwm_rx_tx_cmd_single()
3445 struct ieee80211_node *ni = &in->in_ni; in iwm_rx_tx_cmd_single()
3446 struct ieee80211vap *vap = ni->ni_vap; in iwm_rx_tx_cmd_single()
3447 int status = le16toh(tx_resp->status.status) & IWM_TX_STATUS_MSK; in iwm_rx_tx_cmd_single()
3452 KASSERT(tx_resp->frame_count == 1, ("too many frames")); in iwm_rx_tx_cmd_single()
3454 /* Update rate control statistics. */ in iwm_rx_tx_cmd_single()
3455 …IWM_DPRINTF(sc, IWM_DEBUG_XMIT, "%s: status=0x%04x, seq=%d, fc=%d, btc=%d, frts=%d, ff=%d, irate=%… in iwm_rx_tx_cmd_single()
3457 (int) le16toh(tx_resp->status.status), in iwm_rx_tx_cmd_single()
3458 (int) le16toh(tx_resp->status.sequence), in iwm_rx_tx_cmd_single()
3459 tx_resp->frame_count, in iwm_rx_tx_cmd_single()
3460 tx_resp->bt_kill_count, in iwm_rx_tx_cmd_single()
3461 tx_resp->failure_rts, in iwm_rx_tx_cmd_single()
3462 tx_resp->failure_frame, in iwm_rx_tx_cmd_single()
3463 le32toh(tx_resp->initial_rate), in iwm_rx_tx_cmd_single()
3464 (int) le16toh(tx_resp->wireless_media_time)); in iwm_rx_tx_cmd_single()
3466 cur_rate = ieee80211_node_get_txrate_dot11rate(vap->iv_bss); in iwm_rx_tx_cmd_single()
3467 tx_resp_rate = iwm_rate_from_ucode_rate(le32toh(tx_resp->initial_rate)); in iwm_rx_tx_cmd_single()
3478 txs->flags = IEEE80211_RATECTL_STATUS_SHORT_RETRY | in iwm_rx_tx_cmd_single()
3480 txs->short_retries = tx_resp->failure_rts; in iwm_rx_tx_cmd_single()
3481 txs->long_retries = tx_resp->failure_frame; in iwm_rx_tx_cmd_single()
3486 txs->status = IEEE80211_RATECTL_TX_FAIL_SHORT; in iwm_rx_tx_cmd_single()
3489 txs->status = IEEE80211_RATECTL_TX_FAIL_LONG; in iwm_rx_tx_cmd_single()
3492 txs->status = IEEE80211_RATECTL_TX_FAIL_EXPIRED; in iwm_rx_tx_cmd_single()
3495 txs->status = IEEE80211_RATECTL_TX_FAIL_UNSPECIFIED; in iwm_rx_tx_cmd_single()
3499 txs->status = IEEE80211_RATECTL_TX_SUCCESS; in iwm_rx_tx_cmd_single()
3505 ieee80211_ratectl_rate(vap->iv_bss, NULL, 0); in iwm_rx_tx_cmd_single()
3506 new_rate = ieee80211_node_get_txrate_dot11rate(vap->iv_bss); in iwm_rx_tx_cmd_single()
3508 struct iwm_node *in = IWM_NODE(vap->iv_bss); in iwm_rx_tx_cmd_single()
3510 iwm_send_lq_cmd(sc, &in->in_lq, FALSE); in iwm_rx_tx_cmd_single()
3514 return (txs->status != IEEE80211_RATECTL_TX_SUCCESS); in iwm_rx_tx_cmd_single()
3527 cmd_hdr = &pkt->hdr; in iwm_rx_tx_cmd()
3528 idx = cmd_hdr->idx; in iwm_rx_tx_cmd()
3529 qid = cmd_hdr->qid; in iwm_rx_tx_cmd()
3531 ring = &sc->txq[qid]; in iwm_rx_tx_cmd()
3532 txd = &ring->data[idx]; in iwm_rx_tx_cmd()
3533 in = txd->in; in iwm_rx_tx_cmd()
3534 m = txd->m; in iwm_rx_tx_cmd()
3536 KASSERT(txd->done == 0, ("txd not done")); in iwm_rx_tx_cmd()
3537 KASSERT(txd->in != NULL, ("txd without node")); in iwm_rx_tx_cmd()
3538 KASSERT(txd->m != NULL, ("txd without mbuf")); in iwm_rx_tx_cmd()
3540 sc->sc_tx_timer = 0; in iwm_rx_tx_cmd()
3545 bus_dmamap_sync(ring->data_dmat, txd->map, BUS_DMASYNC_POSTWRITE); in iwm_rx_tx_cmd()
3546 bus_dmamap_unload(ring->data_dmat, txd->map); in iwm_rx_tx_cmd()
3549 "free txd %p, in %p\n", txd, txd->in); in iwm_rx_tx_cmd()
3550 txd->done = 1; in iwm_rx_tx_cmd()
3551 txd->m = NULL; in iwm_rx_tx_cmd()
3552 txd->in = NULL; in iwm_rx_tx_cmd()
3554 ieee80211_tx_complete(&in->in_ni, m, status); in iwm_rx_tx_cmd()
3557 if (--ring->queued < IWM_TX_RING_LOMARK && (sc->qfullmsk & qmsk) != 0) { in iwm_rx_tx_cmd()
3558 sc->qfullmsk &= ~qmsk; in iwm_rx_tx_cmd()
3559 if (sc->qfullmsk == 0) in iwm_rx_tx_cmd()
3576 struct iwm_tx_ring *ring = &sc->txq[IWM_CMD_QUEUE]; in iwm_cmd_done()
3579 if (pkt->hdr.qid != IWM_CMD_QUEUE) { in iwm_cmd_done()
3586 pkt->hdr.code, pkt->hdr.qid, pkt->hdr.idx); in iwm_cmd_done()
3588 data = &ring->data[pkt->hdr.idx]; in iwm_cmd_done()
3591 if (data->m != NULL) { in iwm_cmd_done()
3592 bus_dmamap_sync(ring->data_dmat, data->map, in iwm_cmd_done()
3594 bus_dmamap_unload(ring->data_dmat, data->map); in iwm_cmd_done()
3595 m_freem(data->m); in iwm_cmd_done()
3596 data->m = NULL; in iwm_cmd_done()
3598 wakeup(&ring->desc[pkt->hdr.idx]); in iwm_cmd_done()
3600 if (((pkt->hdr.idx + ring->queued) % IWM_TX_RING_COUNT) != ring->cur) { in iwm_cmd_done()
3601 device_printf(sc->sc_dev, in iwm_cmd_done()
3603 __func__, pkt->hdr.idx, ring->queued, ring->cur); in iwm_cmd_done()
3607 KASSERT(ring->queued > 0, ("ring->queued is empty?")); in iwm_cmd_done()
3608 ring->queued--; in iwm_cmd_done()
3609 if (ring->queued == 0) in iwm_cmd_done()
3624 scd_bc_tbl = sc->sched_dma.vaddr;
3631 /* Update TX scheduler. */
3633 bus_dmamap_sync(sc->sched_dma.tag, sc->sched_dma.map,
3639 bus_dmamap_sync(sc->sched_dma.tag, sc->sched_dma.map,
3669 struct ieee80211_node *ni = &in->in_ni; in iwm_tx_fill_cmd()
3671 const struct ieee80211_txparam *tp = ni->ni_txparms; in iwm_tx_fill_cmd()
3677 type = wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK; in iwm_tx_fill_cmd()
3679 tx->rts_retry_limit = IWM_RTS_DFAULT_RETRY_LIMIT; in iwm_tx_fill_cmd()
3680 tx->data_retry_limit = IWM_DEFAULT_TX_RETRY; in iwm_tx_fill_cmd()
3684 (m->m_flags & M_EAPOL) != 0) { in iwm_tx_fill_cmd()
3685 ridx = iwm_tx_rateidx_global_lookup(sc, tp->mgmtrate); in iwm_tx_fill_cmd()
3687 "%s: MGT (%d)\n", __func__, tp->mgmtrate); in iwm_tx_fill_cmd()
3688 } else if (IEEE80211_IS_MULTICAST(wh->i_addr1)) { in iwm_tx_fill_cmd()
3689 ridx = iwm_tx_rateidx_global_lookup(sc, tp->mcastrate); in iwm_tx_fill_cmd()
3691 "%s: MCAST (%d)\n", __func__, tp->mcastrate); in iwm_tx_fill_cmd()
3692 } else if (tp->ucastrate != IEEE80211_FIXED_RATE_NONE) { in iwm_tx_fill_cmd()
3693 ridx = iwm_tx_rateidx_global_lookup(sc, tp->ucastrate); in iwm_tx_fill_cmd()
3695 "%s: FIXED_RATE (%d)\n", __func__, tp->ucastrate); in iwm_tx_fill_cmd()
3701 if (ridx == -1) in iwm_tx_fill_cmd()
3705 tx->initial_rate_index = 0; in iwm_tx_fill_cmd()
3706 tx->tx_flags |= htole32(IWM_TX_CMD_FLG_STA_RATE); in iwm_tx_fill_cmd()
3717 rinfo->rate, in iwm_tx_fill_cmd()
3721 /* XXX TODO: hard-coded TX antenna? */ in iwm_tx_fill_cmd()
3722 if (sc->cfg->device_family == IWM_DEVICE_FAMILY_9000) in iwm_tx_fill_cmd()
3728 tx->rate_n_flags = htole32(rate_flags | rinfo->plcp); in iwm_tx_fill_cmd()
3737 struct ieee80211com *ic = &sc->sc_ic; in iwm_tx()
3738 struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps); in iwm_tx()
3758 type = wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK; in iwm_tx()
3760 ring = &sc->txq[ac]; in iwm_tx()
3761 desc = &ring->desc[ring->cur]; in iwm_tx()
3762 data = &ring->data[ring->cur]; in iwm_tx()
3765 cmd = &ring->cmd[ring->cur]; in iwm_tx()
3766 cmd->hdr.code = IWM_TX_CMD; in iwm_tx()
3767 cmd->hdr.flags = 0; in iwm_tx()
3768 cmd->hdr.qid = ring->qid; in iwm_tx()
3769 cmd->hdr.idx = ring->cur; in iwm_tx()
3771 tx = (void *)cmd->data; in iwm_tx()
3777 if (wh->i_fc[1] & IEEE80211_FC1_PROTECTED) { in iwm_tx()
3789 struct iwm_tx_radiotap_header *tap = &sc->sc_txtap; in iwm_tx()
3791 tap->wt_flags = 0; in iwm_tx()
3792 tap->wt_chan_freq = htole16(ni->ni_chan->ic_freq); in iwm_tx()
3793 tap->wt_chan_flags = htole16(ni->ni_chan->ic_flags); in iwm_tx()
3794 tap->wt_rate = rinfo->rate; in iwm_tx()
3796 tap->wt_flags |= IEEE80211_RADIOTAP_F_WEP; in iwm_tx()
3801 totlen = m->m_pkthdr.len; in iwm_tx()
3802 if (!IEEE80211_IS_MULTICAST(wh->i_addr1)) { in iwm_tx()
3807 totlen + IEEE80211_CRC_LEN > vap->iv_rtsthreshold && in iwm_tx()
3808 !IEEE80211_IS_MULTICAST(wh->i_addr1)) { in iwm_tx()
3812 tx->sta_id = IWM_STATION_ID; in iwm_tx()
3815 uint8_t subtype = wh->i_fc[0] & IEEE80211_FC0_SUBTYPE_MASK; in iwm_tx()
3819 tx->pm_frame_timeout = htole16(IWM_PM_FRAME_ASSOC); in iwm_tx()
3821 tx->pm_frame_timeout = htole16(IWM_PM_FRAME_NONE); in iwm_tx()
3823 tx->pm_frame_timeout = htole16(IWM_PM_FRAME_MGMT); in iwm_tx()
3826 tx->pm_frame_timeout = htole16(IWM_PM_FRAME_NONE); in iwm_tx()
3832 tx->offload_assist |= htole16(IWM_TX_CMD_OFFLD_PAD); in iwm_tx()
3833 pad = 4 - (hdrlen & 3); in iwm_tx()
3835 tx->offload_assist = 0; in iwm_tx()
3839 tx->len = htole16(totlen); in iwm_tx()
3840 tx->tid_tspec = tid; in iwm_tx()
3841 tx->life_time = htole32(IWM_TX_CMD_LIFE_TIME_INFINITE); in iwm_tx()
3844 tx->dram_lsb_ptr = htole32(data->scratch_paddr); in iwm_tx()
3845 tx->dram_msb_ptr = iwm_get_dma_hi_addr(data->scratch_paddr); in iwm_tx()
3852 tx->sec_ctl = 0; in iwm_tx()
3853 tx->tx_flags |= htole32(flags); in iwm_tx()
3857 error = bus_dmamap_load_mbuf_sg(ring->data_dmat, data->map, m, in iwm_tx()
3861 device_printf(sc->sc_dev, "can't map mbuf (error %d)\n", in iwm_tx()
3867 m1 = m_collapse(m, M_NOWAIT, IWM_MAX_SCATTER - 2); in iwm_tx()
3869 device_printf(sc->sc_dev, in iwm_tx()
3876 error = bus_dmamap_load_mbuf_sg(ring->data_dmat, data->map, m, in iwm_tx()
3879 device_printf(sc->sc_dev, "can't map mbuf (error %d)\n", in iwm_tx()
3885 data->m = m; in iwm_tx()
3886 data->in = in; in iwm_tx()
3887 data->done = 0; in iwm_tx()
3890 "sending txd %p, in %p\n", data, data->in); in iwm_tx()
3891 KASSERT(data->in != NULL, ("node is NULL")); in iwm_tx()
3895 ring->qid, ring->cur, totlen, nsegs, in iwm_tx()
3896 le32toh(tx->tx_flags), in iwm_tx()
3897 le32toh(tx->rate_n_flags), in iwm_tx()
3898 tx->initial_rate_index in iwm_tx()
3903 desc->num_tbs = 2 + nsegs; in iwm_tx()
3905 desc->tbs[0].lo = htole32(data->cmd_paddr); in iwm_tx()
3906 desc->tbs[0].hi_n_len = htole16(iwm_get_dma_hi_addr(data->cmd_paddr) | in iwm_tx()
3908 desc->tbs[1].lo = htole32(data->cmd_paddr + TB0_SIZE); in iwm_tx()
3909 desc->tbs[1].hi_n_len = htole16(iwm_get_dma_hi_addr(data->cmd_paddr) | in iwm_tx()
3911 hdrlen + pad - TB0_SIZE) << 4)); in iwm_tx()
3916 desc->tbs[i + 2].lo = htole32(seg->ds_addr); in iwm_tx()
3917 desc->tbs[i + 2].hi_n_len = in iwm_tx()
3918 htole16(iwm_get_dma_hi_addr(seg->ds_addr)) | in iwm_tx()
3919 (seg->ds_len << 4); in iwm_tx()
3922 bus_dmamap_sync(ring->data_dmat, data->map, in iwm_tx()
3924 bus_dmamap_sync(ring->cmd_dma.tag, ring->cmd_dma.map, in iwm_tx()
3926 bus_dmamap_sync(ring->desc_dma.tag, ring->desc_dma.map, in iwm_tx()
3930 iwm_update_sched(sc, ring->qid, ring->cur, tx->sta_id, le16toh(tx->len)); in iwm_tx()
3934 ring->cur = (ring->cur + 1) % IWM_TX_RING_COUNT; in iwm_tx()
3935 IWM_WRITE(sc, IWM_HBUS_TARG_WRPTR, ring->qid << 8 | ring->cur); in iwm_tx()
3938 if (++ring->queued > IWM_TX_RING_HIMARK) { in iwm_tx()
3939 sc->qfullmsk |= 1 << ring->qid; in iwm_tx()
3949 struct ieee80211com *ic = ni->ni_ic; in iwm_raw_xmit()
3950 struct iwm_softc *sc = ic->ic_softc; in iwm_raw_xmit()
3954 "->%s begin\n", __func__); in iwm_raw_xmit()
3956 if ((sc->sc_flags & IWM_FLAG_HW_INITED) == 0) { in iwm_raw_xmit()
3959 "<-%s not RUNNING\n", __func__); in iwm_raw_xmit()
3970 if (sc->sc_tx_timer == 0) in iwm_raw_xmit()
3971 callout_reset(&sc->sc_watchdog_to, hz, iwm_watchdog, sc); in iwm_raw_xmit()
3972 sc->sc_tx_timer = 5; in iwm_raw_xmit()
3985 * queue might not be empty. The race-free way to handle this is to:
4002 device_printf(sc->sc_dev, in iwm_flush_tx_path()
4016 int colors[IWM_MAX_BINDINGS] = { -1, -1, -1, -1, }; in iwm_update_quotas()
4024 id = ivp->phy_ctxt->id; in iwm_update_quotas()
4026 colors[id] = ivp->phy_ctxt->color; in iwm_update_quotas()
4073 device_printf(sc->sc_dev, in iwm_update_quotas()
4103 ni = ieee80211_ref_node(vap->iv_bss); in iwm_auth()
4111 __func__, ether_sprintf(ni->ni_bssid)); in iwm_auth()
4113 in->in_assoc = 0; in iwm_auth()
4114 iv->iv_auth = 1; in iwm_auth()
4117 * Firmware bug - it'll crash if the beacon interval is less in iwm_auth()
4123 if (ni->ni_intval < 16) { in iwm_auth()
4124 device_printf(sc->sc_dev, in iwm_auth()
4126 ether_sprintf(ni->ni_bssid), ni->ni_intval); in iwm_auth()
4133 device_printf(sc->sc_dev, in iwm_auth()
4145 * The openbsd port doesn't attempt to do that - it reset things in iwm_auth()
4150 * the NIC back to IDLE, re-setup and re-add all the mac/phy in iwm_auth()
4153 if (iv->is_uploaded) { in iwm_auth()
4155 device_printf(sc->sc_dev, in iwm_auth()
4156 "%s: failed to update MAC\n", __func__); in iwm_auth()
4161 device_printf(sc->sc_dev, in iwm_auth()
4166 sc->sc_firmware_state = 1; in iwm_auth()
4168 if ((error = iwm_phy_ctxt_changed(sc, &sc->sc_phyctxt[0], in iwm_auth()
4169 in->in_ni.ni_chan, 1, 1)) != 0) { in iwm_auth()
4170 device_printf(sc->sc_dev, in iwm_auth()
4171 "%s: failed update phy ctxt\n", __func__); in iwm_auth()
4174 iv->phy_ctxt = &sc->sc_phyctxt[0]; in iwm_auth()
4177 device_printf(sc->sc_dev, in iwm_auth()
4178 "%s: binding update cmd\n", __func__); in iwm_auth()
4181 sc->sc_firmware_state = 2; in iwm_auth()
4187 iv->ps_disabled = TRUE; in iwm_auth()
4189 iv->ps_disabled = FALSE; in iwm_auth()
4191 device_printf(sc->sc_dev, in iwm_auth()
4192 "%s: failed to update power management\n", in iwm_auth()
4197 device_printf(sc->sc_dev, in iwm_auth()
4201 sc->sc_firmware_state = 3; in iwm_auth()
4214 iv->iv_auth = 0; in iwm_auth()
4245 for (i = 0; i < rs->rs_nrates; i++) { in iwm_ridx2rate()
4246 rval = (rs->rs_rates[i] & IEEE80211_RATE_VAL); in iwm_ridx2rate()
4248 return rs->rs_rates[i]; in iwm_ridx2rate()
4264 device_printf(sc->sc_dev, in iwm_rate2ridx()
4268 return -1; in iwm_rate2ridx()
4275 struct ieee80211_node *ni = &in->in_ni; in iwm_setrates()
4276 struct iwm_lq_cmd *lq = &in->in_lq; in iwm_setrates()
4277 struct ieee80211_rateset *rs = &ni->ni_rates; in iwm_setrates()
4278 int nrates = rs->rs_nrates; in iwm_setrates()
4288 rix = -1; in iwm_setrates()
4290 int rate = rs->rs_rates[i] & IEEE80211_RATE_VAL; in iwm_setrates()
4297 device_printf(sc->sc_dev, in iwm_setrates()
4303 if (nrates > nitems(lq->rs_table)) { in iwm_setrates()
4304 device_printf(sc->sc_dev, in iwm_setrates()
4306 "only %zu\n", __func__, nrates, nitems(lq->rs_table)); in iwm_setrates()
4310 device_printf(sc->sc_dev, in iwm_setrates()
4321 lq->sta_id = IWM_STATION_ID; in iwm_setrates()
4324 if (ni->ni_flags & IEEE80211_NODE_HT) in iwm_setrates()
4325 lq->flags |= IWM_LQ_FLAG_USE_RTS_MSK; in iwm_setrates()
4329 * need to set them to non-zero, though, or we get an error. in iwm_setrates()
4331 lq->single_stream_ant_msk = 1; in iwm_setrates()
4332 lq->dual_stream_ant_msk = 1; in iwm_setrates()
4343 int rate = rs->rs_rates[rix - i] & IEEE80211_RATE_VAL; in iwm_setrates()
4348 if (ridx == -1) in iwm_setrates()
4354 nextant = 1<<(ffs(txant)-1); in iwm_setrates()
4366 lq->rs_table[i] = htole32(tab); in iwm_setrates()
4369 for (i = nrates; i < nitems(lq->rs_table); i++) { in iwm_setrates()
4371 lq->rs_table[i] = htole32(tab); in iwm_setrates()
4382 sc->sc_tx_timer = 0; in iwm_bring_down_firmware()
4384 ivp->iv_auth = 0; in iwm_bring_down_firmware()
4385 if (sc->sc_firmware_state == 3) { in iwm_bring_down_firmware()
4390 device_printf(sc->sc_dev, in iwm_bring_down_firmware()
4395 if (sc->sc_firmware_state == 3) { in iwm_bring_down_firmware()
4398 device_printf(sc->sc_dev, in iwm_bring_down_firmware()
4403 if (sc->sc_firmware_state == 3) { in iwm_bring_down_firmware()
4406 device_printf(sc->sc_dev, in iwm_bring_down_firmware()
4407 "%s: Failed to update smart FIFO: %d\n", in iwm_bring_down_firmware()
4411 if (sc->sc_firmware_state == 3) { in iwm_bring_down_firmware()
4414 device_printf(sc->sc_dev, in iwm_bring_down_firmware()
4419 if (sc->sc_firmware_state == 3) { in iwm_bring_down_firmware()
4422 device_printf(sc->sc_dev, in iwm_bring_down_firmware()
4423 "%s: Failed to update PHY quota: %d\n", in iwm_bring_down_firmware()
4427 if (sc->sc_firmware_state == 3) { in iwm_bring_down_firmware()
4431 device_printf(sc->sc_dev, in iwm_bring_down_firmware()
4436 if (sc->sc_firmware_state == 3) { in iwm_bring_down_firmware()
4437 sc->sc_firmware_state = 2; in iwm_bring_down_firmware()
4439 if (sc->sc_firmware_state > 1) { in iwm_bring_down_firmware()
4442 device_printf(sc->sc_dev, in iwm_bring_down_firmware()
4447 if (sc->sc_firmware_state > 1) { in iwm_bring_down_firmware()
4448 sc->sc_firmware_state = 1; in iwm_bring_down_firmware()
4450 ivp->phy_ctxt = NULL; in iwm_bring_down_firmware()
4451 if (sc->sc_firmware_state > 0) { in iwm_bring_down_firmware()
4454 device_printf(sc->sc_dev, in iwm_bring_down_firmware()
4459 if (sc->sc_firmware_state > 0) { in iwm_bring_down_firmware()
4462 device_printf(sc->sc_dev, in iwm_bring_down_firmware()
4463 "%s: failed to update power management\n", in iwm_bring_down_firmware()
4467 sc->sc_firmware_state = 0; in iwm_bring_down_firmware()
4474 struct ieee80211com *ic = vap->iv_ic; in iwm_newstate()
4475 struct iwm_softc *sc = ic->ic_softc; in iwm_newstate()
4480 "switching state %s -> %s arg=0x%x\n", in iwm_newstate()
4481 ieee80211_state_name[vap->iv_state], in iwm_newstate()
4488 if ((sc->sc_flags & IWM_FLAG_SCAN_RUNNING) && in iwm_newstate()
4496 if (vap->iv_state == IEEE80211_S_RUN && nstate != IEEE80211_S_RUN) { in iwm_newstate()
4500 if (((in = IWM_NODE(vap->iv_bss)) != NULL)) in iwm_newstate()
4501 in->in_assoc = 0; in iwm_newstate()
4504 if ((vap->iv_state == IEEE80211_S_AUTH || in iwm_newstate()
4505 vap->iv_state == IEEE80211_S_ASSOC || in iwm_newstate()
4506 vap->iv_state == IEEE80211_S_RUN) && in iwm_newstate()
4513 if ((vap->iv_state == IEEE80211_S_RUN || in iwm_newstate()
4514 vap->iv_state == IEEE80211_S_ASSOC) && in iwm_newstate()
4523 ivp->iv_newstate(vap, nstate, arg); in iwm_newstate()
4540 device_printf(sc->sc_dev, in iwm_newstate()
4555 sc->last_ebs_successful = TRUE; in iwm_newstate()
4559 in = IWM_NODE(vap->iv_bss); in iwm_newstate()
4560 /* Update the association state, now we have it all */ in iwm_newstate()
4564 device_printf(sc->sc_dev, in iwm_newstate()
4565 "%s: failed to update STA\n", __func__); in iwm_newstate()
4570 in->in_assoc = 1; in iwm_newstate()
4573 device_printf(sc->sc_dev, in iwm_newstate()
4574 "%s: failed to update MAC: %d\n", __func__, error); in iwm_newstate()
4581 ieee80211_ratectl_rate(&in->in_ni, NULL, 0); in iwm_newstate()
4583 ieee80211_node_get_txrate_dot11rate(&in->in_ni)); in iwm_newstate()
4585 if ((error = iwm_send_lq_cmd(sc, &in->in_lq, TRUE)) != 0) { in iwm_newstate()
4586 device_printf(sc->sc_dev, in iwm_newstate()
4599 return (ivp->iv_newstate(vap, nstate, arg)); in iwm_newstate()
4606 struct ieee80211com *ic = &sc->sc_ic; in iwm_endscan_cb()
4612 ieee80211_scan_done(TAILQ_FIRST(&ic->ic_vaps)); in iwm_endscan_cb()
4630 boolean_t nvm_lar = sc->nvm_data->lar_enabled; in iwm_is_lar_supported()
4640 if (sc->cfg->device_family >= IWM_DEVICE_FAMILY_8000) in iwm_is_lar_supported()
4691 "send MCC update to FW with '%c%c' src = %d\n", in iwm_send_update_mcc_cmd()
4703 mcc_resp = (void *)pkt->data; in iwm_send_update_mcc_cmd()
4704 mcc = mcc_resp->mcc; in iwm_send_update_mcc_cmd()
4705 n_channels = le32toh(mcc_resp->n_channels); in iwm_send_update_mcc_cmd()
4707 mcc_resp_v1 = (void *)pkt->data; in iwm_send_update_mcc_cmd()
4708 mcc = mcc_resp_v1->mcc; in iwm_send_update_mcc_cmd()
4709 n_channels = le32toh(mcc_resp_v1->n_channels); in iwm_send_update_mcc_cmd()
4712 /* W/A for a FW/NVM issue - returns 0x00 for the world domain */ in iwm_send_update_mcc_cmd()
4714 mcc = 0x3030; /* "00" - world */ in iwm_send_update_mcc_cmd()
4735 device_printf(sc->sc_dev, in iwm_tt_tx_backoff()
4743 struct ieee80211com *ic = &sc->sc_ic; in iwm_init_hw()
4746 sc->sf_state = IWM_SF_UNINIT; in iwm_init_hw()
4763 sc->sc_ps_disabled = FALSE; in iwm_init_hw()
4765 device_printf(sc->sc_dev, "could not initialize hardware\n"); in iwm_init_hw()
4772 device_printf(sc->sc_dev, "could not load firmware\n"); in iwm_init_hw()
4778 device_printf(sc->sc_dev, "Failed to initialize Smart Fifo\n"); in iwm_init_hw()
4781 device_printf(sc->sc_dev, "bt init conf failed\n"); in iwm_init_hw()
4787 device_printf(sc->sc_dev, "antenna config failed\n"); in iwm_init_hw()
4792 if ((error = iwm_send_phy_db_data(sc->sc_phy_db)) != 0) in iwm_init_hw()
4796 device_printf(sc->sc_dev, "phy_cfg_cmd failed\n"); in iwm_init_hw()
4802 device_printf(sc->sc_dev, "add_aux_sta failed\n"); in iwm_init_hw()
4813 &sc->sc_phyctxt[i], &ic->ic_channels[1], 1, 1)) != 0) in iwm_init_hw()
4818 if (sc->cfg->device_family == IWM_DEVICE_FAMILY_7000) in iwm_init_hw()
4822 device_printf(sc->sc_dev, "PCIe LTR configuration failed\n"); in iwm_init_hw()
4845 device_printf(sc->sc_dev, "failed to disable beacon filter\n"); in iwm_init_hw()
4860 struct ieee80211_node *ni = vap->iv_bss; in iwm_allow_mcast()
4869 cmd->filter_own = 1; in iwm_allow_mcast()
4870 cmd->port_id = 0; in iwm_allow_mcast()
4871 cmd->count = 0; in iwm_allow_mcast()
4872 cmd->pass_all = 1; in iwm_allow_mcast()
4873 IEEE80211_ADDR_COPY(cmd->bssid, ni->ni_bssid); in iwm_allow_mcast()
4891 if (sc->sc_flags & IWM_FLAG_HW_INITED) { in iwm_init()
4894 sc->sc_generation++; in iwm_init()
4895 sc->sc_flags &= ~IWM_FLAG_STOPPED; in iwm_init()
4906 sc->sc_flags |= IWM_FLAG_HW_INITED; in iwm_init()
4915 sc = ic->ic_softc; in iwm_transmit()
4918 if ((sc->sc_flags & IWM_FLAG_HW_INITED) == 0) { in iwm_transmit()
4922 error = mbufq_enqueue(&sc->sc_snd, m); in iwm_transmit()
4942 IWM_DPRINTF(sc, IWM_DEBUG_XMIT | IWM_DEBUG_TRACE, "->%s\n", __func__); in iwm_start()
4943 while (sc->qfullmsk == 0 && in iwm_start()
4944 (m = mbufq_dequeue(&sc->sc_snd)) != NULL) { in iwm_start()
4945 ni = (struct ieee80211_node *)m->m_pkthdr.rcvif; in iwm_start()
4947 if_inc_counter(ni->ni_vap->iv_ifp, in iwm_start()
4952 if (sc->sc_tx_timer == 0) { in iwm_start()
4953 callout_reset(&sc->sc_watchdog_to, hz, iwm_watchdog, in iwm_start()
4956 sc->sc_tx_timer = 15; in iwm_start()
4958 IWM_DPRINTF(sc, IWM_DEBUG_XMIT | IWM_DEBUG_TRACE, "<-%s\n", __func__); in iwm_start()
4965 sc->sc_flags &= ~IWM_FLAG_HW_INITED; in iwm_stop()
4966 sc->sc_flags |= IWM_FLAG_STOPPED; in iwm_stop()
4967 sc->sc_generation++; in iwm_stop()
4969 sc->sc_tx_timer = 0; in iwm_stop()
4971 sc->sc_flags &= ~IWM_FLAG_SCAN_RUNNING; in iwm_stop()
4978 struct ieee80211com *ic = &sc->sc_ic; in iwm_watchdog()
4980 if (sc->sc_attached == 0) in iwm_watchdog()
4983 if (sc->sc_tx_timer > 0) { in iwm_watchdog()
4984 if (--sc->sc_tx_timer == 0) { in iwm_watchdog()
4985 device_printf(sc->sc_dev, "device timeout\n"); in iwm_watchdog()
4990 counter_u64_add(sc->sc_ic.ic_oerrors, 1); in iwm_watchdog()
4993 callout_reset(&sc->sc_watchdog_to, hz, iwm_watchdog, sc); in iwm_watchdog()
5000 struct iwm_softc *sc = ic->ic_softc; in iwm_parent()
5005 if (ic->ic_nrunning > 0) { in iwm_parent()
5006 if (!(sc->sc_flags & IWM_FLAG_HW_INITED)) { in iwm_parent()
5012 } else if (sc->sc_flags & IWM_FLAG_HW_INITED) in iwm_parent()
5018 taskqueue_enqueue(sc->sc_tq, &sc->sc_rftoggle_task); in iwm_parent()
5025 struct ieee80211com *ic = &sc->sc_ic; in iwm_rftoggle_task()
5032 device_printf(sc->sc_dev, in iwm_rftoggle_task()
5037 device_printf(sc->sc_dev, in iwm_rftoggle_task()
5038 "%s: rfkill cleared, re-enabling interface\n", __func__); in iwm_rftoggle_task()
5055 * read with uint32_t-sized accesses, any members with a different size
5066 uint32_t data1; /* error-specific data */
5067 uint32_t data2; /* error-specific data */
5068 uint32_t data3; /* error-specific data */
5107 * UMAC error struct - relevant starting from family 8000 chip.
5110 * read with u32-sized accesses, any members with a different size
5120 uint32_t data1; /* error-specific data */
5121 uint32_t data2; /* error-specific data */
5122 uint32_t data3; /* error-specific data */
5162 for (i = 0; i < nitems(advanced_lookup) - 1; i++) in iwm_desc_lookup()
5176 base = sc->umac_error_event_table; in iwm_nic_umac_error()
5179 device_printf(sc->sc_dev, "Invalid error log pointer 0x%08x\n", in iwm_nic_umac_error()
5185 device_printf(sc->sc_dev, "reading errlog failed\n"); in iwm_nic_umac_error()
5190 device_printf(sc->sc_dev, "Start UMAC Error Log Dump:\n"); in iwm_nic_umac_error()
5191 device_printf(sc->sc_dev, "Status: 0x%x, count: %d\n", in iwm_nic_umac_error()
5192 sc->sc_flags, table.valid); in iwm_nic_umac_error()
5195 device_printf(sc->sc_dev, "0x%08X | %s\n", table.error_id, in iwm_nic_umac_error()
5197 device_printf(sc->sc_dev, "0x%08X | umac branchlink1\n", table.blink1); in iwm_nic_umac_error()
5198 device_printf(sc->sc_dev, "0x%08X | umac branchlink2\n", table.blink2); in iwm_nic_umac_error()
5199 device_printf(sc->sc_dev, "0x%08X | umac interruptlink1\n", in iwm_nic_umac_error()
5201 device_printf(sc->sc_dev, "0x%08X | umac interruptlink2\n", in iwm_nic_umac_error()
5203 device_printf(sc->sc_dev, "0x%08X | umac data1\n", table.data1); in iwm_nic_umac_error()
5204 device_printf(sc->sc_dev, "0x%08X | umac data2\n", table.data2); in iwm_nic_umac_error()
5205 device_printf(sc->sc_dev, "0x%08X | umac data3\n", table.data3); in iwm_nic_umac_error()
5206 device_printf(sc->sc_dev, "0x%08X | umac major\n", table.umac_major); in iwm_nic_umac_error()
5207 device_printf(sc->sc_dev, "0x%08X | umac minor\n", table.umac_minor); in iwm_nic_umac_error()
5208 device_printf(sc->sc_dev, "0x%08X | frame pointer\n", in iwm_nic_umac_error()
5210 device_printf(sc->sc_dev, "0x%08X | stack pointer\n", in iwm_nic_umac_error()
5212 device_printf(sc->sc_dev, "0x%08X | last host cmd\n", table.cmd_header); in iwm_nic_umac_error()
5213 device_printf(sc->sc_dev, "0x%08X | isr status reg\n", in iwm_nic_umac_error()
5230 device_printf(sc->sc_dev, "dumping device error log\n"); in iwm_nic_error()
5231 base = sc->error_event_table[0]; in iwm_nic_error()
5233 device_printf(sc->sc_dev, in iwm_nic_error()
5239 device_printf(sc->sc_dev, "reading errlog failed\n"); in iwm_nic_error()
5244 device_printf(sc->sc_dev, "errlog not found, skipping\n"); in iwm_nic_error()
5249 device_printf(sc->sc_dev, "Start Error Log Dump:\n"); in iwm_nic_error()
5250 device_printf(sc->sc_dev, "Status: 0x%x, count: %d\n", in iwm_nic_error()
5251 sc->sc_flags, table.valid); in iwm_nic_error()
5254 device_printf(sc->sc_dev, "0x%08X | %-28s\n", table.error_id, in iwm_nic_error()
5256 device_printf(sc->sc_dev, "%08X | trm_hw_status0\n", in iwm_nic_error()
5258 device_printf(sc->sc_dev, "%08X | trm_hw_status1\n", in iwm_nic_error()
5260 device_printf(sc->sc_dev, "%08X | branchlink2\n", table.blink2); in iwm_nic_error()
5261 device_printf(sc->sc_dev, "%08X | interruptlink1\n", table.ilink1); in iwm_nic_error()
5262 device_printf(sc->sc_dev, "%08X | interruptlink2\n", table.ilink2); in iwm_nic_error()
5263 device_printf(sc->sc_dev, "%08X | data1\n", table.data1); in iwm_nic_error()
5264 device_printf(sc->sc_dev, "%08X | data2\n", table.data2); in iwm_nic_error()
5265 device_printf(sc->sc_dev, "%08X | data3\n", table.data3); in iwm_nic_error()
5266 device_printf(sc->sc_dev, "%08X | beacon time\n", table.bcon_time); in iwm_nic_error()
5267 device_printf(sc->sc_dev, "%08X | tsf low\n", table.tsf_low); in iwm_nic_error()
5268 device_printf(sc->sc_dev, "%08X | tsf hi\n", table.tsf_hi); in iwm_nic_error()
5269 device_printf(sc->sc_dev, "%08X | time gp1\n", table.gp1); in iwm_nic_error()
5270 device_printf(sc->sc_dev, "%08X | time gp2\n", table.gp2); in iwm_nic_error()
5271 device_printf(sc->sc_dev, "%08X | uCode revision type\n", in iwm_nic_error()
5273 device_printf(sc->sc_dev, "%08X | uCode version major\n", table.major); in iwm_nic_error()
5274 device_printf(sc->sc_dev, "%08X | uCode version minor\n", table.minor); in iwm_nic_error()
5275 device_printf(sc->sc_dev, "%08X | hw version\n", table.hw_ver); in iwm_nic_error()
5276 device_printf(sc->sc_dev, "%08X | board version\n", table.brd_ver); in iwm_nic_error()
5277 device_printf(sc->sc_dev, "%08X | hcmd\n", table.hcmd); in iwm_nic_error()
5278 device_printf(sc->sc_dev, "%08X | isr0\n", table.isr0); in iwm_nic_error()
5279 device_printf(sc->sc_dev, "%08X | isr1\n", table.isr1); in iwm_nic_error()
5280 device_printf(sc->sc_dev, "%08X | isr2\n", table.isr2); in iwm_nic_error()
5281 device_printf(sc->sc_dev, "%08X | isr3\n", table.isr3); in iwm_nic_error()
5282 device_printf(sc->sc_dev, "%08X | isr4\n", table.isr4); in iwm_nic_error()
5283 device_printf(sc->sc_dev, "%08X | last cmd Id\n", table.last_cmd_id); in iwm_nic_error()
5284 device_printf(sc->sc_dev, "%08X | wait_event\n", table.wait_event); in iwm_nic_error()
5285 device_printf(sc->sc_dev, "%08X | l2p_control\n", table.l2p_control); in iwm_nic_error()
5286 device_printf(sc->sc_dev, "%08X | l2p_duration\n", table.l2p_duration); in iwm_nic_error()
5287 device_printf(sc->sc_dev, "%08X | l2p_mhvalid\n", table.l2p_mhvalid); in iwm_nic_error()
5288 device_printf(sc->sc_dev, "%08X | l2p_addr_match\n", table.l2p_addr_match); in iwm_nic_error()
5289 device_printf(sc->sc_dev, "%08X | lmpm_pmg_sel\n", table.lmpm_pmg_sel); in iwm_nic_error()
5290 device_printf(sc->sc_dev, "%08X | timestamp\n", table.u_timestamp); in iwm_nic_error()
5291 device_printf(sc->sc_dev, "%08X | flow_handler\n", table.flow_handler); in iwm_nic_error()
5293 if (sc->umac_error_event_table) in iwm_nic_error()
5301 struct ieee80211com *ic = &sc->sc_ic; in iwm_handle_rxb()
5317 qid = pkt->hdr.qid; in iwm_handle_rxb()
5318 idx = pkt->hdr.idx; in iwm_handle_rxb()
5320 code = IWM_WIDE_ID(pkt->hdr.flags, pkt->hdr.code); in iwm_handle_rxb()
5326 if ((pkt->hdr.code == 0 && (qid & ~0x80) == 0 && idx == 0) || in iwm_handle_rxb()
5327 pkt->len_n_flags == htole32(IWM_FH_RSCSR_FRAME_INVALID)) { in iwm_handle_rxb()
5333 qid & ~0x80, pkt->hdr.idx, code); in iwm_handle_rxb()
5339 iwm_notification_wait_notify(sc->sc_notif_wait, code, pkt); in iwm_handle_rxb()
5354 (nextpkt->hdr.code == 0 && in iwm_handle_rxb()
5355 (nextpkt->hdr.qid & ~0x80) == 0 && in iwm_handle_rxb()
5356 nextpkt->hdr.idx == 0) || in iwm_handle_rxb()
5357 (nextpkt->len_n_flags == in iwm_handle_rxb()
5394 struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps); in iwm_handle_rxb()
5396 resp = (void *)pkt->data; in iwm_handle_rxb()
5397 missed = le32toh(resp->consec_missed_beacons); in iwm_handle_rxb()
5404 le32toh(resp->mac_id), in iwm_handle_rxb()
5405 le32toh(resp->consec_missed_beacons_since_last_rx), in iwm_handle_rxb()
5406 le32toh(resp->consec_missed_beacons), in iwm_handle_rxb()
5407 le32toh(resp->num_expected_beacons), in iwm_handle_rxb()
5408 le32toh(resp->num_recvd_beacons)); in iwm_handle_rxb()
5415 if (vap->iv_state == IEEE80211_S_RUN && in iwm_handle_rxb()
5416 (ic->ic_flags & IEEE80211_F_SCAN) == 0) { in iwm_handle_rxb()
5417 if (missed > vap->iv_bmissthreshold) { in iwm_handle_rxb()
5443 if (sc->sc_wantresp == (((qid & ~0x80) << 16) | idx)) { in iwm_handle_rxb()
5444 memcpy(sc->sc_cmd_resp, in iwm_handle_rxb()
5445 pkt, sizeof(sc->sc_cmd_resp)); in iwm_handle_rxb()
5451 notif = (void *)pkt->data; in iwm_handle_rxb()
5453 sc->sc_fw_mcc[0] = (notif->mcc & 0xff00) >> 8; in iwm_handle_rxb()
5454 sc->sc_fw_mcc[1] = notif->mcc & 0xff; in iwm_handle_rxb()
5455 sc->sc_fw_mcc[2] = '\0'; in iwm_handle_rxb()
5458 notif->source_id, sc->sc_fw_mcc); in iwm_handle_rxb()
5468 device_printf(sc->sc_dev, in iwm_handle_rxb()
5472 notif = (void *)pkt->data; in iwm_handle_rxb()
5474 "IWM_DTS_MEASUREMENT_NOTIFICATION - %d\n", in iwm_handle_rxb()
5475 notif->temp); in iwm_handle_rxb()
5504 cresp = (void *)pkt->data; in iwm_handle_rxb()
5505 if (sc->sc_wantresp == (((qid & ~0x80) << 16) | idx)) { in iwm_handle_rxb()
5506 memcpy(sc->sc_cmd_resp, in iwm_handle_rxb()
5520 if (sc->sc_flags & IWM_FLAG_SCAN_RUNNING) { in iwm_handle_rxb()
5521 sc->sc_flags &= ~IWM_FLAG_SCAN_RUNNING; in iwm_handle_rxb()
5522 ieee80211_runtask(ic, &sc->sc_es_task); in iwm_handle_rxb()
5532 if (sc->sc_flags & IWM_FLAG_SCAN_RUNNING) { in iwm_handle_rxb()
5533 sc->sc_flags &= ~IWM_FLAG_SCAN_RUNNING; in iwm_handle_rxb()
5534 ieee80211_runtask(ic, &sc->sc_es_task); in iwm_handle_rxb()
5541 notif = (void *)pkt->data; in iwm_handle_rxb()
5545 notif->status, notif->scanned_channels); in iwm_handle_rxb()
5552 resp = (void *)pkt->data; in iwm_handle_rxb()
5554 device_printf(sc->sc_dev, in iwm_handle_rxb()
5556 le32toh(resp->error_type), in iwm_handle_rxb()
5557 resp->cmd_id); in iwm_handle_rxb()
5578 rsp = (void *)pkt->data; in iwm_handle_rxb()
5583 rsp->token, rsp->sta_id, rsp->tid, in iwm_handle_rxb()
5584 rsp->scd_queue); in iwm_handle_rxb()
5590 device_printf(sc->sc_dev, in iwm_handle_rxb()
5592 code, qid & ~0x80, idx, pkt->len_n_flags); in iwm_handle_rxb()
5607 * uses a slightly different format for pkt->hdr, and "qid" in iwm_handle_rxb()
5608 * is actually the upper byte of a two-byte field. in iwm_handle_rxb()
5631 bus_dmamap_sync(sc->rxq.stat_dma.tag, sc->rxq.stat_dma.map, in iwm_notif_intr()
5634 if (sc->cfg->mqrx_supported) { in iwm_notif_intr()
5642 hw = le16toh(sc->rxq.stat->closed_rb_num) & 0xfff; in iwm_notif_intr()
5647 while (sc->rxq.cur != hw) { in iwm_notif_intr()
5648 struct iwm_rx_ring *ring = &sc->rxq; in iwm_notif_intr()
5649 struct iwm_rx_data *data = &ring->data[ring->cur]; in iwm_notif_intr()
5651 bus_dmamap_sync(ring->data_dmat, data->map, in iwm_notif_intr()
5655 "%s: hw = %d cur = %d\n", __func__, hw, ring->cur); in iwm_notif_intr()
5656 iwm_handle_rxb(sc, data->m); in iwm_notif_intr()
5658 ring->cur = (ring->cur + 1) % count; in iwm_notif_intr()
5667 hw = (hw == 0) ? count - 1 : hw - 1; in iwm_notif_intr()
5682 if (sc->sc_flags & IWM_FLAG_USE_ICT) { in iwm_intr()
5683 uint32_t *ict = sc->ict_dma.vaddr; in iwm_intr()
5686 tmp = htole32(ict[sc->ict_cur]); in iwm_intr()
5696 ict[sc->ict_cur] = 0; in iwm_intr()
5697 sc->ict_cur = (sc->ict_cur+1) % IWM_ICT_COUNT; in iwm_intr()
5698 tmp = htole32(ict[sc->ict_cur]); in iwm_intr()
5720 IWM_WRITE(sc, IWM_CSR_INT, r1 | ~sc->sc_intmask); in iwm_intr()
5727 struct ieee80211com *ic = &sc->sc_ic; in iwm_intr()
5728 struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps); in iwm_intr()
5734 device_printf(sc->sc_dev, "driver status:\n"); in iwm_intr()
5736 struct iwm_tx_ring *ring = &sc->txq[i]; in iwm_intr()
5737 device_printf(sc->sc_dev, in iwm_intr()
5738 " tx ring %2d: qid=%-2d cur=%-3d " in iwm_intr()
5739 "queued=%-3d\n", in iwm_intr()
5740 i, ring->qid, ring->cur, ring->queued); in iwm_intr()
5742 device_printf(sc->sc_dev, in iwm_intr()
5743 " rx ring: cur=%d\n", sc->rxq.cur); in iwm_intr()
5744 device_printf(sc->sc_dev, in iwm_intr()
5745 " 802.11 state %d\n", (vap == NULL) ? -1 : vap->iv_state); in iwm_intr()
5748 sc->sc_firmware_state = 0; in iwm_intr()
5757 device_printf(sc->sc_dev, "%s: controller panicked, iv_state = %d; " in iwm_intr()
5758 "restarting\n", __func__, vap->iv_state); in iwm_intr()
5766 device_printf(sc->sc_dev, "hardware error, stopping device\n"); in iwm_intr()
5775 sc->sc_fw_chunk_done = 1; in iwm_intr()
5776 wakeup(&sc->sc_fw); in iwm_intr()
5781 taskqueue_enqueue(sc->sc_tq, &sc->sc_rftoggle_task); in iwm_intr()
5786 * We cargo-cult like it's going out of fashion. in iwm_intr()
5820 * Autoconf glue-sniffing
5870 device_set_desc(dev, iwm_devices[i].cfg->name); in iwm_probe()
5890 sc->cfg = iwm_devices[i].cfg; in iwm_dev_check()
5914 /* Enable bus-mastering and hardware bug workaround. */ in iwm_pci_attach()
5924 sc->sc_mem = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid, in iwm_pci_attach()
5926 if (sc->sc_mem == NULL) { in iwm_pci_attach()
5927 device_printf(sc->sc_dev, "can't map mem space\n"); in iwm_pci_attach()
5930 sc->sc_st = rman_get_bustag(sc->sc_mem); in iwm_pci_attach()
5931 sc->sc_sh = rman_get_bushandle(sc->sc_mem); in iwm_pci_attach()
5938 sc->sc_irq = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid, RF_ACTIVE | in iwm_pci_attach()
5940 if (sc->sc_irq == NULL) { in iwm_pci_attach()
5944 error = bus_setup_intr(dev, sc->sc_irq, INTR_TYPE_NET | INTR_MPSAFE, in iwm_pci_attach()
5945 NULL, iwm_intr, sc, &sc->sc_ih); in iwm_pci_attach()
5950 sc->sc_dmat = bus_get_dma_tag(sc->sc_dev); in iwm_pci_attach()
5960 if (sc->sc_irq != NULL) { in iwm_pci_detach()
5961 bus_teardown_intr(dev, sc->sc_irq, sc->sc_ih); in iwm_pci_detach()
5963 rman_get_rid(sc->sc_irq), sc->sc_irq); in iwm_pci_detach()
5966 if (sc->sc_mem != NULL) in iwm_pci_detach()
5968 rman_get_rid(sc->sc_mem), sc->sc_mem); in iwm_pci_detach()
5975 struct ieee80211com *ic = &sc->sc_ic; in iwm_attach()
5979 sc->sc_dev = dev; in iwm_attach()
5980 sc->sc_attached = 1; in iwm_attach()
5982 mbufq_init(&sc->sc_snd, ifqmaxlen); in iwm_attach()
5983 callout_init_mtx(&sc->sc_watchdog_to, &sc->sc_mtx, 0); in iwm_attach()
5984 callout_init_mtx(&sc->sc_led_blink_to, &sc->sc_mtx, 0); in iwm_attach()
5985 TASK_INIT(&sc->sc_es_task, 0, iwm_endscan_cb, sc); in iwm_attach()
5986 TASK_INIT(&sc->sc_rftoggle_task, 0, iwm_rftoggle_task, sc); in iwm_attach()
5988 sc->sc_tq = taskqueue_create("iwm_taskq", M_WAITOK, in iwm_attach()
5989 taskqueue_thread_enqueue, &sc->sc_tq); in iwm_attach()
5990 error = taskqueue_start_threads(&sc->sc_tq, 1, 0, "iwm_taskq"); in iwm_attach()
6001 sc->sc_notif_wait = iwm_notification_wait_init(sc); in iwm_attach()
6002 if (sc->sc_notif_wait == NULL) { in iwm_attach()
6007 sc->sf_state = IWM_SF_UNINIT; in iwm_attach()
6010 sc->sc_phy_db = iwm_phy_db_init(sc); in iwm_attach()
6011 if (!sc->sc_phy_db) { in iwm_attach()
6017 sc->last_ebs_successful = TRUE; in iwm_attach()
6024 sc->sc_wantresp = -1; in iwm_attach()
6026 sc->sc_hw_rev = IWM_READ(sc, IWM_CSR_HW_REV); in iwm_attach()
6029 * changed, and now the revision step also includes bit 0-1 (no more in iwm_attach()
6030 * "dash" value). To keep hw_rev backwards compatible - we'll store it in iwm_attach()
6033 if (sc->cfg->device_family >= IWM_DEVICE_FAMILY_8000) { in iwm_attach()
6037 sc->sc_hw_rev = (sc->sc_hw_rev & 0xfff0) | in iwm_attach()
6038 (IWM_CSR_HW_REV_STEP(sc->sc_hw_rev << 2) << 2); in iwm_attach()
6058 device_printf(sc->sc_dev, in iwm_attach()
6070 sc->sc_hw_rev = (sc->sc_hw_rev & 0xFFFFFFF3) | in iwm_attach()
6074 device_printf(sc->sc_dev, "Failed to lock the nic\n"); in iwm_attach()
6079 /* special-case 7265D, it has the same PCI IDs. */ in iwm_attach()
6080 if (sc->cfg == &iwm7265_cfg && in iwm_attach()
6081 (sc->sc_hw_rev & IWM_CSR_HW_REV_TYPE_MSK) == IWM_CSR_HW_REV_TYPE_7265D) { in iwm_attach()
6082 sc->cfg = &iwm7265d_cfg; in iwm_attach()
6110 for (txq_i = 0; txq_i < nitems(sc->txq); txq_i++) { in iwm_attach()
6112 &sc->txq[txq_i], txq_i)) != 0) { in iwm_attach()
6121 if ((error = iwm_alloc_rx_ring(sc, &sc->rxq)) != 0) { in iwm_attach()
6129 ic->ic_softc = sc; in iwm_attach()
6130 ic->ic_name = device_get_nameunit(sc->sc_dev); in iwm_attach()
6131 ic->ic_phytype = IEEE80211_T_OFDM; /* not only, but not used */ in iwm_attach()
6132 ic->ic_opmode = IEEE80211_M_STA; /* default to BSS mode */ in iwm_attach()
6135 ic->ic_caps = in iwm_attach()
6144 /* Advertise full-offload scanning */ in iwm_attach()
6145 ic->ic_flags_ext = IEEE80211_FEXT_SCAN_OFFLOAD; in iwm_attach()
6146 for (i = 0; i < nitems(sc->sc_phyctxt); i++) { in iwm_attach()
6147 sc->sc_phyctxt[i].id = i; in iwm_attach()
6148 sc->sc_phyctxt[i].color = 0; in iwm_attach()
6149 sc->sc_phyctxt[i].ref = 0; in iwm_attach()
6150 sc->sc_phyctxt[i].channel = NULL; in iwm_attach()
6154 sc->sc_noise = -96; in iwm_attach()
6157 sc->sc_max_rssi = IWM_MAX_DBM - IWM_MIN_DBM; in iwm_attach()
6162 CTLFLAG_RW, &sc->sc_debug, 0, "control debugging"); in iwm_attach()
6168 } else if (sc->sc_fw.fw_fp == NULL) { in iwm_attach()
6175 sc->sc_preinit_hook.ich_func = iwm_preinit; in iwm_attach()
6176 sc->sc_preinit_hook.ich_arg = sc; in iwm_attach()
6177 if (config_intrhook_establish(&sc->sc_preinit_hook) != 0) { in iwm_attach()
6185 "<-%s\n", __func__); in iwm_attach()
6210 #define IWM_EXP2(x) ((1 << (x)) - 1) /* CWmin = 2^ECWmin - 1 */ in iwm_wme_update()
6211 struct iwm_softc *sc = ic->ic_softc; in iwm_wme_update()
6213 struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps); in iwm_wme_update()
6232 ivp->queue_params[aci].aifsn = ac->wmep_aifsn; in iwm_wme_update()
6233 ivp->queue_params[aci].cw_min = IWM_EXP2(ac->wmep_logcwmin); in iwm_wme_update()
6234 ivp->queue_params[aci].cw_max = IWM_EXP2(ac->wmep_logcwmax); in iwm_wme_update()
6235 ivp->queue_params[aci].edca_txop = in iwm_wme_update()
6236 IEEE80211_TXOP_TO_US(ac->wmep_txopLimit); in iwm_wme_update()
6238 ivp->have_wme = TRUE; in iwm_wme_update()
6239 if (ivp->is_uploaded && vap->iv_bss != NULL) { in iwm_wme_update()
6240 in = IWM_NODE(vap->iv_bss); in iwm_wme_update()
6241 if (in->in_assoc) { in iwm_wme_update()
6243 device_printf(sc->sc_dev, in iwm_wme_update()
6244 "%s: failed to update MAC\n", __func__); in iwm_wme_update()
6258 device_t dev = sc->sc_dev; in iwm_preinit()
6259 struct ieee80211com *ic = &sc->sc_ic; in iwm_preinit()
6263 "->%s\n", __func__); in iwm_preinit()
6280 sc->sc_hw_rev & IWM_CSR_HW_REV_TYPE_MSK, in iwm_preinit()
6281 sc->sc_fwver, ether_sprintf(sc->nvm_data->hw_addr)); in iwm_preinit()
6284 if (!sc->nvm_data->sku_cap_band_52GHz_enable) in iwm_preinit()
6285 memset(&ic->ic_sup_rates[IEEE80211_MODE_11A], 0, in iwm_preinit()
6286 sizeof(ic->ic_sup_rates[IEEE80211_MODE_11A])); in iwm_preinit()
6289 iwm_init_channel_map(ic, IEEE80211_CHAN_MAX, &ic->ic_nchans, in iwm_preinit()
6290 ic->ic_channels); in iwm_preinit()
6293 * At this point we've committed - if we fail to do setup, in iwm_preinit()
6297 ic->ic_vap_create = iwm_vap_create; in iwm_preinit()
6298 ic->ic_vap_delete = iwm_vap_delete; in iwm_preinit()
6299 ic->ic_raw_xmit = iwm_raw_xmit; in iwm_preinit()
6300 ic->ic_node_alloc = iwm_node_alloc; in iwm_preinit()
6301 ic->ic_scan_start = iwm_scan_start; in iwm_preinit()
6302 ic->ic_scan_end = iwm_scan_end; in iwm_preinit()
6303 ic->ic_update_mcast = iwm_update_mcast; in iwm_preinit()
6304 ic->ic_getradiocaps = iwm_init_channel_map; in iwm_preinit()
6305 ic->ic_set_channel = iwm_set_channel; in iwm_preinit()
6306 ic->ic_scan_curchan = iwm_scan_curchan; in iwm_preinit()
6307 ic->ic_scan_mindwell = iwm_scan_mindwell; in iwm_preinit()
6308 ic->ic_wme.wme_update = iwm_wme_update; in iwm_preinit()
6309 ic->ic_parent = iwm_parent; in iwm_preinit()
6310 ic->ic_transmit = iwm_transmit; in iwm_preinit()
6316 "<-%s\n", __func__); in iwm_preinit()
6317 config_intrhook_disestablish(&sc->sc_preinit_hook); in iwm_preinit()
6321 config_intrhook_disestablish(&sc->sc_preinit_hook); in iwm_preinit()
6331 struct ieee80211com *ic = &sc->sc_ic; in iwm_radiotap_attach()
6334 "->%s begin\n", __func__); in iwm_radiotap_attach()
6336 &sc->sc_txtap.wt_ihdr, sizeof(sc->sc_txtap), in iwm_radiotap_attach()
6338 &sc->sc_rxtap.wr_ihdr, sizeof(sc->sc_rxtap), in iwm_radiotap_attach()
6341 "->%s end\n", __func__); in iwm_radiotap_attach()
6353 if (!TAILQ_EMPTY(&ic->ic_vaps)) /* only one at a time */ in iwm_vap_create()
6356 vap = &ivp->iv_vap; in iwm_vap_create()
6358 vap->iv_bmissthreshold = 10; /* override default */ in iwm_vap_create()
6360 ivp->iv_newstate = vap->iv_newstate; in iwm_vap_create()
6361 vap->iv_newstate = iwm_newstate; in iwm_vap_create()
6363 ivp->id = IWM_DEFAULT_MACID; in iwm_vap_create()
6364 ivp->color = IWM_DEFAULT_COLOR; in iwm_vap_create()
6366 ivp->have_wme = FALSE; in iwm_vap_create()
6367 ivp->ps_disabled = FALSE; in iwm_vap_create()
6373 ic->ic_opmode = opmode; in iwm_vap_create()
6394 while ((m = mbufq_dequeue(&sc->sc_snd)) != NULL) { in iwm_xmit_queue_drain()
6395 ni = (struct ieee80211_node *)m->m_pkthdr.rcvif; in iwm_xmit_queue_drain()
6404 struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps); in iwm_scan_start()
6405 struct iwm_softc *sc = ic->ic_softc; in iwm_scan_start()
6409 if (sc->sc_flags & IWM_FLAG_SCAN_RUNNING) { in iwm_scan_start()
6411 device_printf(sc->sc_dev, in iwm_scan_start()
6419 device_printf(sc->sc_dev, "could not initiate scan\n"); in iwm_scan_start()
6423 sc->sc_flags |= IWM_FLAG_SCAN_RUNNING; in iwm_scan_start()
6432 struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps); in iwm_scan_end()
6433 struct iwm_softc *sc = ic->ic_softc; in iwm_scan_end()
6437 if (vap->iv_state == IEEE80211_S_RUN) in iwm_scan_end()
6439 if (sc->sc_flags & IWM_FLAG_SCAN_RUNNING) { in iwm_scan_end()
6442 * both iwm_scan_end and iwm_scan_start run in the ic->ic_tq in iwm_scan_end()
6445 sc->sc_flags &= ~IWM_FLAG_SCAN_RUNNING; in iwm_scan_end()
6455 taskqueue_cancel(ic->ic_tq, &sc->sc_es_task, NULL); in iwm_scan_end()
6484 while (sc->sc_flags & IWM_FLAG_BUSY) in iwm_init_task()
6485 msleep(&sc->sc_flags, &sc->sc_mtx, 0, "iwmpwr", 0); in iwm_init_task()
6486 sc->sc_flags |= IWM_FLAG_BUSY; in iwm_init_task()
6488 if (sc->sc_ic.ic_nrunning > 0) in iwm_init_task()
6490 sc->sc_flags &= ~IWM_FLAG_BUSY; in iwm_init_task()
6491 wakeup(&sc->sc_flags); in iwm_init_task()
6507 if (!sc->sc_attached) in iwm_resume()
6513 if (sc->sc_flags & IWM_FLAG_SCANNING) { in iwm_resume()
6514 sc->sc_flags &= ~IWM_FLAG_SCANNING; in iwm_resume()
6520 ieee80211_resume_all(&sc->sc_ic); in iwm_resume()
6531 do_stop = !! (sc->sc_ic.ic_nrunning > 0); in iwm_suspend()
6533 if (!sc->sc_attached) in iwm_suspend()
6536 ieee80211_suspend_all(&sc->sc_ic); in iwm_suspend()
6541 sc->sc_flags |= IWM_FLAG_SCANNING; in iwm_suspend()
6551 struct iwm_fw_info *fw = &sc->sc_fw; in iwm_detach_local()
6552 device_t dev = sc->sc_dev; in iwm_detach_local()
6555 if (!sc->sc_attached) in iwm_detach_local()
6557 sc->sc_attached = 0; in iwm_detach_local()
6559 ieee80211_draintask(&sc->sc_ic, &sc->sc_es_task); in iwm_detach_local()
6562 taskqueue_drain_all(sc->sc_tq); in iwm_detach_local()
6563 taskqueue_free(sc->sc_tq); in iwm_detach_local()
6568 ieee80211_ifdetach(&sc->sc_ic); in iwm_detach_local()
6570 callout_drain(&sc->sc_led_blink_to); in iwm_detach_local()
6571 callout_drain(&sc->sc_watchdog_to); in iwm_detach_local()
6573 iwm_phy_db_free(sc->sc_phy_db); in iwm_detach_local()
6574 sc->sc_phy_db = NULL; in iwm_detach_local()
6576 iwm_free_nvm_data(sc->nvm_data); in iwm_detach_local()
6579 iwm_free_rx_ring(sc, &sc->rxq); in iwm_detach_local()
6580 for (i = 0; i < nitems(sc->txq); i++) in iwm_detach_local()
6581 iwm_free_tx_ring(sc, &sc->txq[i]); in iwm_detach_local()
6584 if (fw->fw_fp != NULL) in iwm_detach_local()
6588 iwm_dma_contig_free(&sc->sched_dma); in iwm_detach_local()
6589 iwm_dma_contig_free(&sc->ict_dma); in iwm_detach_local()
6590 iwm_dma_contig_free(&sc->kw_dma); in iwm_detach_local()
6591 iwm_dma_contig_free(&sc->fw_dma); in iwm_detach_local()
6595 /* Finished with the hardware - detach things */ in iwm_detach_local()
6598 if (sc->sc_notif_wait != NULL) { in iwm_detach_local()
6599 iwm_notification_wait_free(sc->sc_notif_wait); in iwm_detach_local()
6600 sc->sc_notif_wait = NULL; in iwm_detach_local()