105#include <sys/cdefs.h>
111#include <sys/param.h>
114#include <sys/endian.h>
115#include <sys/firmware.h>
116#include <sys/kernel.h>
117#include <sys/malloc.h>
119#include <sys/mutex.h>
120#include <sys/module.h>
123#include <sys/socket.h>
124#include <sys/sockio.h>
125#include <sys/sysctl.h>
126#include <sys/linker.h>
128#include <machine/bus.h>
129#include <machine/endian.h>
130#include <machine/resource.h>
132#include <dev/pci/pcivar.h>
133#include <dev/pci/pcireg.h>
138#include <net/if_var.h>
139#include <net/if_arp.h>
140#include <net/if_dl.h>
141#include <net/if_media.h>
142#include <net/if_types.h>
144#include <netinet/in.h>
145#include <netinet/in_systm.h>
146#include <netinet/if_ether.h>
147#include <netinet/ip.h>
149#include <net80211/ieee80211_var.h>
150#include <net80211/ieee80211_regdomain.h>
151#include <net80211/ieee80211_ratectl.h>
152#include <net80211/ieee80211_radiotap.h>
175#define mtodoff(m, t, off) ((t)((m)->m_data + (off)))
179 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
181 36, 40, 44, 48, 52, 56, 60, 64,
182 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140, 144,
183 149, 153, 157, 161, 165
186 "IWM_NUM_CHANNELS is too small");
190 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
192 36, 40, 44, 48, 52, 56, 60, 64, 68, 72, 76, 80, 84, 88, 92,
193 96, 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140, 144,
194 149, 153, 157, 161, 165, 169, 173, 177, 181
197 "IWM_NUM_CHANNELS_8000 is too small");
199#define IWM_NUM_2GHZ_CHANNELS 14
200#define IWM_N_HW_ADDR_MASK 0xF
223#define IWM_RIDX_CCK 0
224#define IWM_RIDX_OFDM 4
225#define IWM_RIDX_MAX (nitems(iwm_rates)-1)
226#define IWM_RIDX_IS_CCK(_i_) ((_i_) < IWM_RIDX_OFDM)
227#define IWM_RIDX_IS_OFDM(_i_) ((_i_) >= IWM_RIDX_OFDM)
234#define IWM_UCODE_ALIVE_TIMEOUT hz
235#define IWM_UCODE_CALIB_TIMEOUT (2*hz)
245 const uint8_t *,
size_t);
272 uint16_t, uint8_t *, uint16_t *);
274 uint16_t *, uint32_t);
277 struct ieee80211_channel[],
int,
int *,
int,
size_t,
280 struct ieee80211_channel[]);
283 const uint16_t *,
const uint16_t *,
284 const uint16_t *,
const uint16_t *,
306 bus_addr_t, uint32_t);
339static void iwm_update_sched(
struct iwm_softc *,
int,
int, uint8_t,
346 struct ieee80211_node *,
int);
347static int iwm_raw_xmit(
struct ieee80211_node *,
struct mbuf *,
348 const struct ieee80211_bpf_params *);
351static struct ieee80211_node *
353 const uint8_t[IEEE80211_ADDR_LEN]);
357static int iwm_newstate(
struct ieee80211vap *,
enum ieee80211_state,
int);
372 iwm_desc_lookup(uint32_t);
373static void iwm_nic_error(
struct iwm_softc *);
374static void iwm_nic_umac_error(
struct iwm_softc *);
385static struct ieee80211vap *
387 const char [IFNAMSIZ],
int,
388 enum ieee80211_opmode,
int,
389 const uint8_t [IEEE80211_ADDR_LEN],
390 const uint8_t [IEEE80211_ADDR_LEN]);
413 if (dlen <
sizeof(*l) ||
414 dlen <
sizeof(l->
size) + l->
size *
sizeof(*l->
cs))
431 if (dlen <
sizeof(uint32_t))
441 memcpy(&fwone->
offset,
data,
sizeof(uint32_t));
444 fwone->
data =
data +
sizeof(uint32_t);
445 fwone->
len = dlen -
sizeof(uint32_t);
452#define IWM_DEFAULT_SCAN_CHANNELS 40
468 "Wrong ucode_type %u for default "
492 "api flags index %d larger than supported by driver\n",
498 for (i = 0; i < 32; i++) {
512 uint32_t api_flags = le32toh(ucode_capa->
api_capa);
517 "capa flags index %d larger than supported by driver\n",
523 for (i = 0; i < 32; i++) {
524 if (api_flags & (1U << i))
534 firmware_put(fw->
fw_fp, FIRMWARE_UNLOAD);
536 memset(fw->
img, 0,
sizeof(fw->
img));
547 const struct firmware *fwp;
550 uint32_t usniffer_img;
551 const uint8_t *tlv_data;
552 uint32_t paging_mem_size;
564 "could not read firmware %s (error %d)\n",
582 uhdr = (
const void *)fw->
fw_fp->data;
583 if (*(
const uint32_t *)fw->
fw_fp->data != 0
585 device_printf(sc->
sc_dev,
"invalid firmware %s\n",
596 len = fw->
fw_fp->datasize -
sizeof(*uhdr);
598 while (len >=
sizeof(*tlv)) {
600 tlv = (
const void *)data;
602 tlv_len = le32toh(tlv->
length);
603 tlv_type = le32toh(tlv->
type);
604 tlv_data = tlv->
data;
608 "firmware too short: %zu bytes\n",
613 len -= roundup2(tlv_len, 4);
614 data +=
sizeof(*tlv) + roundup2(tlv_len, 4);
616 switch ((
int)tlv_type) {
618 if (tlv_len !=
sizeof(uint32_t)) {
620 "%s: PROBE_MAX_LEN (%u) != sizeof(uint32_t)\n",
631 "%s: IWM_UCODE_TLV_PROBE_MAX_LEN "
632 "ridiculous\n", __func__);
640 "%s: IWM_UCODE_TLV_PAN: tlv_len (%u) > 0\n",
648 if (tlv_len <
sizeof(uint32_t)) {
650 "%s: IWM_UCODE_TLV_FLAGS: tlv_len (%u) < sizeof(uint32_t)\n",
655 if (tlv_len %
sizeof(uint32_t)) {
657 "%s: IWM_UCODE_TLV_FLAGS: tlv_len (%u) %% sizeof(uint32_t)\n",
677 tlv_data, tlv_len)) != 0) {
679 "%s: iwm_store_cscheme(): returned %d\n",
685 if (tlv_len !=
sizeof(uint32_t)) {
687 "%s: IWM_UCODE_TLV_NUM_OF_CPU: tlv_len (%u) != sizeof(uint32_t)\n",
693 if (num_of_cpus == 2) {
700 }
else if ((num_of_cpus > 2) || (num_of_cpus < 1)) {
702 "%s: Driver supports only 1 or 2 CPUs\n",
712 "%s: IWM_UCODE_REGULAR: iwm_firmware_store_section() failed; %d\n",
721 "%s: IWM_UCODE_INIT: iwm_firmware_store_section() failed; %d\n",
730 "%s: IWM_UCODE_WOWLAN: iwm_firmware_store_section() failed; %d\n",
738 "%s: IWM_UCODE_TLV_DEV_CALIB: tlv_len (%u) < sizeof(iwm_tlv_calib_data) (%zu)\n",
746 "%s: iwm_set_default_calib() failed: %d\n",
752 if (tlv_len !=
sizeof(uint32_t)) {
755 "%s: IWM_UCODE_TLV_PHY_SKU: tlv_len (%u) < sizeof(uint32_t)\n",
807 if (tlv_len !=
sizeof(uint32_t)) {
811 paging_mem_size =
le32_to_cpup((
const uint32_t *)tlv_data);
814 "%s: Paging: paging enabled (size = %u bytes)\n",
815 __func__, paging_mem_size);
818 "%s: Paging: driver supports up to %u bytes for paging image\n",
825 "%s: Paging: image isn't multiple %u\n",
839 if (tlv_len !=
sizeof(uint32_t)) {
848 if (tlv_len !=
sizeof(uint32_t) * 3) {
854 le32toh(((
const uint32_t *)tlv_data)[0]),
855 le32toh(((
const uint32_t *)tlv_data)[1]),
856 le32toh(((
const uint32_t *)tlv_data)[2]));
864 "%s: unknown firmware section %d, abort\n",
871 KASSERT(error == 0, (
"unhandled error"));
875 device_printf(sc->
sc_dev,
"firmware parse error %d, "
876 "section type %d\n", error, tlv_type);
881 if (fw->
fw_fp != NULL)
935 descsz =
sizeof(uint64_t);
938 descsz =
sizeof(uint32_t);
942 size = count * descsz;
947 "could not allocate RX ring DMA memory\n");
954 sizeof(*ring->
stat), 16);
957 "could not allocate RX status DMA memory\n");
963 size = count *
sizeof(uint32_t);
968 "could not allocate RX ring DMA memory\n");
974 error = bus_dma_tag_create(sc->
sc_dmat, 1, 0,
975 BUS_SPACE_MAXADDR_32BIT, BUS_SPACE_MAXADDR, NULL, NULL,
979 "%s: could not create RX buf DMA tag, error %d\n",
988 "%s: could not create RX buf DMA map, error %d\n",
996 for (i = 0; i < count; i++) {
998 error = bus_dmamap_create(ring->
data_dmat, 0, &data->
map);
1000 device_printf(sc->
sc_dev,
1001 "%s: could not create RX buf DMA map, error %d\n",
1043 for (i = 0; i < count; i++) {
1046 if (data->
m != NULL) {
1048 BUS_DMASYNC_POSTREAD);
1053 if (data->
map != NULL) {
1085 device_printf(sc->
sc_dev,
1086 "could not allocate TX ring DMA memory\n");
1101 device_printf(sc->
sc_dev,
1102 "could not allocate TX cmd DMA memory\n");
1116 error = bus_dma_tag_create(sc->
sc_dmat, 1, 0,
1117 BUS_SPACE_MAXADDR_32BIT, BUS_SPACE_MAXADDR, NULL, NULL, maxsize,
1118 nsegments, maxsize, 0, NULL, NULL, &ring->
data_dmat);
1120 device_printf(sc->
sc_dev,
"could not create TX buf DMA tag\n");
1135 device_printf(sc->
sc_dev,
1136 "could not create TX buf DMA map\n");
1141 (
"invalid physical address"));
1156 if (data->
m != NULL) {
1158 BUS_DMASYNC_POSTWRITE);
1167 BUS_DMASYNC_PREWRITE);
1187 if (data->
m != NULL) {
1189 BUS_DMASYNC_POSTWRITE);
1194 if (data->
map != NULL) {
1269 struct ieee80211com *ic = &sc->
sc_ic;
1270 struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps);
1288 sc->
sc_flags &= ~IWM_FLAG_TE_ACTIVE;
1308 device_printf(sc->
sc_dev,
1309 "Failing on timeout while stopping DMA channel: [0x%08x]\n",
1320 for (qid = 0; qid < nitems(sc->
txq); qid++)
1363 uint8_t radio_cfg_type, radio_cfg_step, radio_cfg_dash;
1364 uint32_t reg_val = 0;
1396 "Radio type=0x%x-0x%x-0x%x\n", radio_cfg_type,
1397 radio_cfg_step, radio_cfg_dash);
1435 enabled = ((1 << 0) << 16) | (1 << 0);
1543 for (qid = 0; qid < nitems(sc->
txq); qid++) {
1550 "%s: loading ring %d descriptors (%p) at %lx\n",
1586 "%s: shadow registers enabled\n", __func__);
1600 device_printf(sc->
sc_dev,
"%s: cannot enable txq %d\n",
1622 device_printf(sc->
sc_dev,
1623 "%s: cannot enable txq %d\n", __func__,
qid);
1641 device_printf(sc->
sc_dev,
1642 "%s: cannot enable txq %d\n", __func__,
qid);
1659 memset(&cmd, 0,
sizeof(cmd));
1670 device_printf(sc->
sc_dev,
1671 "cannot enable txq %d\n", qid);
1681 IWM_DPRINTF(sc, IWM_DEBUG_XMIT,
"%s: enabled txq %d FIFO %d\n",
1682 __func__, qid, fifo);
1701 if (scd_base_addr != 0 &&
1703 device_printf(sc->
sc_dev,
1704 "%s: sched addr mismatch: alive: 0x%x prph: 0x%x\n",
1713 NULL, clear_dwords);
1765#define IWM_NVM_DEFAULT_CHUNK_SIZE (2*1024)
1767#define IWM_NVM_WRITE_OPCODE 1
1768#define IWM_NVM_READ_OPCODE 0
1778 uint16_t offset, uint16_t length, uint8_t *data, uint16_t *len)
1782 .length = htole16(
length),
1783 .type = htole16(section),
1791 .data = { &nvm_access_cmd, },
1793 int ret, bytes_read, offset_read;
1800 device_printf(sc->
sc_dev,
1801 "Could not send NVM_ACCESS command (error=%d)\n", ret);
1808 nvm_resp = (
void *)pkt->
data;
1809 ret = le16toh(nvm_resp->
status);
1810 bytes_read = le16toh(nvm_resp->
length);
1811 offset_read = le16toh(nvm_resp->
offset);
1812 resp_data = nvm_resp->
data;
1824 IWM_DPRINTF(sc, IWM_DEBUG_EEPROM | IWM_DEBUG_RESET,
1825 "NVM access command failed on offset 0x%x since that section size is multiple 2K\n",
1830 IWM_DPRINTF(sc, IWM_DEBUG_EEPROM | IWM_DEBUG_RESET,
1831 "NVM access command failed with status %d\n", ret);
1837 if (offset_read !=
offset) {
1838 device_printf(sc->
sc_dev,
1839 "NVM ACCESS response with invalid offset %d\n",
1845 if (bytes_read >
length) {
1846 device_printf(sc->
sc_dev,
1847 "NVM ACCESS response with too much data "
1848 "(%d bytes requested, %d bytes received)\n",
1855 memcpy(
data +
offset, resp_data, bytes_read);
1875 uint16_t section, uint8_t *
data, uint16_t *len, uint32_t size_read)
1886 while (seglen ==
length) {
1890 device_printf(sc->
sc_dev,
1891 "EEPROM size is too small for NVM\n");
1897 IWM_DPRINTF(sc, IWM_DEBUG_EEPROM | IWM_DEBUG_RESET,
1898 "Cannot read NVM from section %d offset %d, length %d\n",
1905 IWM_DPRINTF(sc, IWM_DEBUG_EEPROM | IWM_DEBUG_RESET,
1906 "NVM section %d read completed\n", section);
1927 nflags |= IEEE80211_CHAN_PASSIVE;
1929 nflags |= IEEE80211_CHAN_NOADHOC;
1931 nflags |= IEEE80211_CHAN_DFS;
1933 nflags |= IEEE80211_CHAN_NOADHOC;
1941 int maxchans,
int *nchans,
int ch_idx,
size_t ch_num,
1942 const uint8_t bands[])
1950 for (; ch_idx < ch_num; ch_idx++) {
1959 "Ch. %d Flags %x [%sGHz] - No traffic\n",
1967 error = ieee80211_add_channel(chans, maxchans, nchans,
1968 ieee, 0, 0, nflags, bands);
1973 "Ch. %d Flags %x [%sGHz] - Added\n",
1982 struct ieee80211_channel chans[])
1986 uint8_t bands[IEEE80211_MODE_BYTES];
1989 memset(bands, 0,
sizeof(bands));
1991 setbit(bands, IEEE80211_MODE_11B);
1992 setbit(bands, IEEE80211_MODE_11G);
1997 clrbit(bands, IEEE80211_MODE_11G);
2006 memset(bands, 0,
sizeof(bands));
2007 setbit(bands, IEEE80211_MODE_11A);
2015 const uint16_t *mac_override,
const uint16_t *nvm_hw)
2020 static const uint8_t reserved_mac[] = {
2021 0x02, 0xcc, 0xaa, 0xff, 0xee, 0x00
2024 hw_addr = (
const uint8_t *)(mac_override +
2037 if (!IEEE80211_ADDR_EQ(reserved_mac,
hw_addr) &&
2038 !IEEE80211_ADDR_EQ(ieee80211broadcastaddr, data->
hw_addr) &&
2040 !IEEE80211_IS_MULTICAST(data->
hw_addr))
2044 "%s: mac address from nvm override section invalid\n",
2050 uint32_t mac_addr0 =
2052 uint32_t mac_addr1 =
2055 hw_addr = (
const uint8_t *)&mac_addr0;
2061 hw_addr = (
const uint8_t *)&mac_addr1;
2068 device_printf(sc->
sc_dev,
"%s: mac address not found\n", __func__);
2074 const uint16_t *phy_sku)
2094 const uint16_t *phy_sku)
2138 const uint16_t *nvm_hw,
const uint16_t *mac_override)
2141 if (cfg->mac_addr_from_csr) {
2142 iwm_set_hw_address_from_csr(sc, data);
2160 device_printf(sc->
sc_dev,
"no valid mac address was found\n");
2169 const uint16_t *nvm_hw,
const uint16_t *nvm_sw,
2170 const uint16_t *nvm_calib,
const uint16_t *mac_override,
2171 const uint16_t *phy_sku,
const uint16_t *regulatory)
2174 uint32_t sku, radio_cfg;
2175 uint16_t lar_config;
2178 data = malloc(
sizeof(*data) +
2180 M_DEVBUF, M_NOWAIT | M_ZERO);
2182 data = malloc(
sizeof(*data) +
2184 M_DEVBUF, M_NOWAIT | M_ZERO);
2214 free(data, M_DEVBUF);
2234 free(data, M_DEVBUF);
2240 const uint16_t *hw, *sw, *calib, *regulatory, *mac_override, *phy_sku;
2246 device_printf(sc->
sc_dev,
2247 "Can't parse empty OTP/NVM sections\n");
2254 device_printf(sc->
sc_dev,
2255 "Can't parse empty OTP/NVM sections\n");
2261 device_printf(sc->
sc_dev,
2262 "Can't parse mac_address, empty sections\n");
2268 device_printf(sc->
sc_dev,
2269 "Can't parse phy_sku in B0, empty sections\n");
2278 calib = (
const uint16_t *)
2283 mac_override = (
const uint16_t *)
2288 phy_sku, regulatory);
2295 int i, ret, section;
2296 uint32_t size_read = 0;
2297 uint8_t *nvm_buffer, *temp;
2300 memset(nvm_sections, 0,
sizeof(nvm_sections));
2307 IWM_DPRINTF(sc, IWM_DEBUG_EEPROM,
"Read from NVM\n");
2309 nvm_buffer = malloc(sc->
cfg->
eeprom_size, M_DEVBUF, M_NOWAIT | M_ZERO);
2319 temp = malloc(len, M_DEVBUF, M_NOWAIT);
2324 memcpy(temp, nvm_buffer, len);
2326 nvm_sections[section].
data = temp;
2327 nvm_sections[section].
length = len;
2330 device_printf(sc->
sc_dev,
"OTP is blank\n");
2331 free(nvm_buffer, M_DEVBUF);
2336 IWM_DPRINTF(sc, IWM_DEBUG_EEPROM | IWM_DEBUG_RESET,
2340 if (nvm_sections[i].
data != NULL)
2341 free(nvm_sections[i].
data, M_DEVBUF);
2358 "%s: [%d] uCode section being loaded...\n",
2359 __func__, section_num);
2361 v_addr = dma->
vaddr;
2362 p_addr = dma->
paddr;
2364 for (offset = 0; offset < section->
len; offset += chunk_sz) {
2365 uint32_t copy_size, dst_addr;
2366 int extended_addr = FALSE;
2368 copy_size = MIN(chunk_sz, section->
len - offset);
2369 dst_addr = section->
offset + offset;
2373 extended_addr = TRUE;
2379 memcpy(v_addr, (
const uint8_t *)section->
data + offset,
2381 bus_dmamap_sync(dma->
tag, dma->
map, BUS_DMASYNC_PREWRITE);
2390 device_printf(sc->
sc_dev,
2391 "%s: Could not load the [%d] uCode section\n",
2392 __func__, section_num);
2405 bus_addr_t phy_addr, uint32_t byte_cnt)
2438 msleep(&sc->
sc_fw, &sc->
sc_mtx, 0,
"iwmfw", hz * 5);
2441 device_printf(sc->
sc_dev,
2442 "fw chunk addr 0x%x len %d failed to load\n",
2443 dst_addr, byte_cnt);
2452 const struct iwm_fw_img *image,
int cpu,
int *first_ucode_section)
2455 int i, ret = 0, sec_num = 0x1;
2456 uint32_t val, last_read_idx = 0;
2460 *first_ucode_section = 0;
2463 (*first_ucode_section)++;
2479 "Break since Data not valid or Empty section, sec = %d\n",
2490 val = val | (sec_num << shift_param);
2492 sec_num = (sec_num << 1) | 0x1;
2497 *first_ucode_section = last_read_idx;
2514 const struct iwm_fw_img *image,
int cpu,
int *first_ucode_section)
2517 uint32_t last_read_idx = 0;
2520 *first_ucode_section = 0;
2522 (*first_ucode_section)++;
2538 "Break since Data not valid or Empty section, sec = %d\n",
2548 *first_ucode_section = last_read_idx;
2558 int first_ucode_section;
2560 IWM_DPRINTF(sc, IWM_DEBUG_RESET,
"working with %s CPU\n",
2579 &first_ucode_section);
2597 int first_ucode_section;
2599 IWM_DPRINTF(sc, IWM_DEBUG_RESET,
"working with %s CPU\n",
2612 &first_ucode_section);
2618 &first_ucode_section);
2625 IWM_DPRINTF(sc, IWM_DEBUG_INTR,
"Enabling FW load interrupt\n");
2638 device_printf(sc->
sc_dev,
2639 "%s: Exit HW not ready\n", __func__);
2658 device_printf(sc->
sc_dev,
"%s: Unable to init nic\n", __func__);
2692 .
valid = htole32(valid_tx_ant),
2714 "Sending Phy CFG command: 0x%x\n", phy_cfg_cmd.
phy_cfg);
2716 sizeof(phy_cfg_cmd), &phy_cfg_cmd);
2731 palive = (
void *)pkt->
data;
2735 status = le16toh(palive->
status);
2737 palive3 = (
void *)pkt->
data;
2740 status = le16toh(palive3->
status);
2755 "Alive ucode status 0x%04x revision 0x%01X 0x%01X\n",
2759 IWM_DPRINTF(sc, IWM_DEBUG_FW,
"Alive ucode CDB\n");
2762 "UMAC version: Major - 0x%x, Minor - 0x%x\n",
2777 device_printf(
sc->
sc_dev,
"%s: Unexpected cmd: %d\n",
2785 "%s: iwm_phy_db_set_section failed\n", __func__);
2800 static const uint16_t alive_cmd[] = {
IWM_ALIVE };
2806 memset(&alive_data, 0,
sizeof(alive_data));
2808 alive_cmd, nitems(alive_cmd),
2813 device_printf(sc->
sc_dev,
"iwm_start_fw: failed %d\n", error);
2829 uint32_t a = 0x5a5a5a5a, b = 0x5a5a5a5a;
2835 device_printf(sc->
sc_dev,
2836 "SecBoot CPU1 Status: 0x%x, CPU2 Status: 0x%x\n",
2843 if (!alive_data.
valid) {
2844 device_printf(sc->
sc_dev,
"%s: Loaded ucode is not valid\n",
2860 device_printf(sc->
sc_dev,
2861 "%s: failed to save the FW paging image\n",
2868 device_printf(sc->
sc_dev,
2869 "%s: failed to send the paging cmd\n", __func__);
2891 static const uint16_t init_complete[] = {
2899 device_printf(sc->
sc_dev,
2900 "radio is disabled by hardware switch\n");
2907 nitems(init_complete),
2914 device_printf(sc->
sc_dev,
"Failed to start INIT ucode: %d\n",
2922 device_printf(sc->
sc_dev,
2923 "failed to send bt coex configuration: %d\n", ret);
2932 device_printf(sc->
sc_dev,
"failed to read nvm\n");
2942 device_printf(sc->
sc_dev,
2943 "failed to send antennas before calibration: %d\n", ret);
2953 device_printf(sc->
sc_dev,
2954 "%s: Failed to run INIT calibrations: %d\n",
3001 bus_dmamap_t dmamap;
3002 bus_dma_segment_t seg;
3009 m->m_len = m->m_pkthdr.len = m->m_ext.ext_size;
3011 &seg, &nsegs, BUS_DMA_NOWAIT);
3013 device_printf(sc->
sc_dev,
3014 "%s: can't map mbuf, error %d\n", __func__, error);
3019 if (data->
m != NULL)
3027 bus_dmamap_sync(ring->
data_dmat, data->
map, BUS_DMASYNC_PREREAD);
3031 KASSERT((seg.ds_addr & 255) == 0, (
"seg.ds_addr not aligned"));
3033 ((uint64_t *)ring->
desc)[idx] = htole64(seg.ds_addr);
3035 ((uint32_t *)ring->
desc)[idx] = htole32(seg.ds_addr >> 8);
3037 BUS_DMASYNC_PREWRITE);
3047 IWM_DPRINTF(sc, IWM_DEBUG_RECV,
"received PHY stats\n");
3059 int i, total, nbant, noise;
3061 total = nbant = noise = 0;
3062 for (i = 0; i < 3; i++) {
3064 IWM_DPRINTF(sc, IWM_DEBUG_RECV,
"%s: i=%d, noise=%d\n",
3075 IWM_DPRINTF(sc, IWM_DEBUG_RECV,
"%s: nbant=%d, total=%d\n",
3076 __func__, nbant, total);
3079 return (nbant == 0) ? -127 : (total / nbant) - 107;
3106 int energy_a, energy_b, energy_c, max_energy;
3112 energy_a = energy_a ? -energy_a : -256;
3115 energy_b = energy_b ? -energy_b : -256;
3118 energy_c = energy_c ? -energy_c : -256;
3119 max_energy = MAX(energy_a, energy_b);
3120 max_energy = MAX(max_energy, energy_c);
3123 "energy In A %d B %d C %d , and max %d\n",
3124 energy_a, energy_b, energy_c, max_energy);
3133 int energy_a, energy_b;
3137 energy_a = energy_a ? -energy_a : -256;
3138 energy_b = energy_b ? -energy_b : -256;
3139 return MAX(energy_a, energy_b);
3151 struct ieee80211com *ic = &sc->
sc_ic;
3152 struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps);
3153 struct ieee80211_rx_stats rxs;
3158 uint32_t rx_pkt_status;
3164 rx_pkt_status = le32toh(*(uint32_t *)(pkt->
data +
sizeof(*rx_res) + len));
3166 if (__predict_false(phy_info->
cfg_phy_cnt > 20)) {
3167 device_printf(sc->
sc_dev,
3168 "dsp size out of range [0,20]: %d\n",
3176 "Bad CRC or FIFO: 0x%08X.\n", rx_pkt_status);
3187 device_printf(sc->
sc_dev,
"%s: unable to add more buffers\n",
3192 m->m_data = pkt->
data +
sizeof(*rx_res);
3193 m->m_pkthdr.len = m->m_len = len;
3196 "%s: rssi=%d, noise=%d\n", __func__, rssi, sc->
sc_noise);
3199 "%s: phy_info: channel=%d, flags=0x%08x\n",
3207 bzero(&rxs,
sizeof(rxs));
3208 rxs.r_flags |= IEEE80211_R_IEEE | IEEE80211_R_FREQ;
3209 rxs.r_flags |= IEEE80211_R_BAND;
3210 rxs.r_flags |= IEEE80211_R_NF | IEEE80211_R_RSSI;
3211 rxs.c_ieee = le16toh(phy_info->
channel);
3213 rxs.c_freq = ieee80211_ieee2mhz(rxs.c_ieee, IEEE80211_CHAN_2GHZ);
3214 rxs.c_band = IEEE80211_CHAN_2GHZ;
3216 rxs.c_freq = ieee80211_ieee2mhz(rxs.c_ieee, IEEE80211_CHAN_5GHZ);
3217 rxs.c_band = IEEE80211_CHAN_5GHZ;
3221 rxs.c_rssi = rssi * 2;
3223 if (ieee80211_add_rx_params(m, &rxs) == 0)
3226 if (ieee80211_radiotap_active_vap(vap)) {
3231 tap->
wr_flags |= IEEE80211_RADIOTAP_F_SHORTPRE;
3238 switch (phy_info->
rate) {
3240 case 10: tap->
wr_rate = 2;
break;
3241 case 20: tap->
wr_rate = 4;
break;
3242 case 55: tap->
wr_rate = 11;
break;
3243 case 110: tap->
wr_rate = 22;
break;
3245 case 0xd: tap->
wr_rate = 12;
break;
3246 case 0xf: tap->
wr_rate = 18;
break;
3247 case 0x5: tap->
wr_rate = 24;
break;
3248 case 0x7: tap->
wr_rate = 36;
break;
3249 case 0x9: tap->
wr_rate = 48;
break;
3250 case 0xb: tap->
wr_rate = 72;
break;
3251 case 0x1: tap->
wr_rate = 96;
break;
3252 case 0x3: tap->
wr_rate = 108;
break;
3265 struct ieee80211com *ic = &sc->
sc_ic;
3266 struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps);
3267 struct ieee80211_frame *wh;
3268 struct ieee80211_rx_stats rxs;
3272 uint32_t hdrlen, len, rate_n_flags;
3276 pkt = mtodo(m, offset);
3277 desc = (
void *)pkt->
data;
3282 "Bad CRC or FIFO: 0x%08X.\n", desc->
status);
3288 phy_info = le16toh(desc->
phy_info);
3291 wh = mtodo(m,
sizeof(*desc));
3292 m->m_data = pkt->
data +
sizeof(*desc);
3293 m->m_pkthdr.len = m->m_len = len;
3298 hdrlen = ieee80211_anyhdrsize(wh);
3299 memmove(mtodo(m, 2), mtodo(m, 0), hdrlen);
3300 m->m_data = mtodo(m, 2);
3301 wh = mtod(m,
struct ieee80211_frame *);
3310 device_printf(sc->
sc_dev,
"%s: unable to add more buffers\n",
3316 "%s: rssi=%d, noise=%d\n", __func__, rssi, sc->
sc_noise);
3321 bzero(&rxs,
sizeof(rxs));
3322 rxs.r_flags |= IEEE80211_R_IEEE | IEEE80211_R_FREQ;
3323 rxs.r_flags |= IEEE80211_R_BAND;
3324 rxs.r_flags |= IEEE80211_R_NF | IEEE80211_R_RSSI;
3325 rxs.c_ieee = channel;
3326 rxs.c_freq = ieee80211_ieee2mhz(rxs.c_ieee,
3327 channel <= 14 ? IEEE80211_CHAN_2GHZ : IEEE80211_CHAN_5GHZ);
3328 rxs.c_band = channel <= 14 ? IEEE80211_CHAN_2GHZ : IEEE80211_CHAN_5GHZ;
3331 rxs.c_rssi = rssi * 2;
3333 if (ieee80211_add_rx_params(m, &rxs) == 0)
3336 if (ieee80211_radiotap_active_vap(vap)) {
3341 tap->
wr_flags |= IEEE80211_RADIOTAP_F_SHORTPRE;
3348 switch ((rate_n_flags & 0xff)) {
3350 case 10: tap->
wr_rate = 2;
break;
3351 case 20: tap->
wr_rate = 4;
break;
3352 case 55: tap->
wr_rate = 11;
break;
3353 case 110: tap->
wr_rate = 22;
break;
3355 case 0xd: tap->
wr_rate = 12;
break;
3356 case 0xf: tap->
wr_rate = 18;
break;
3357 case 0x5: tap->
wr_rate = 24;
break;
3358 case 0x7: tap->
wr_rate = 36;
break;
3359 case 0x9: tap->
wr_rate = 48;
break;
3360 case 0xb: tap->
wr_rate = 72;
break;
3361 case 0x1: tap->
wr_rate = 96;
break;
3362 case 0x3: tap->
wr_rate = 108;
break;
3375 struct epoch_tracker et;
3376 struct ieee80211com *ic;
3377 struct ieee80211_frame *wh;
3378 struct ieee80211_node *ni;
3387 counter_u64_add(ic->ic_ierrors, 1);
3391 wh = mtod(m,
struct ieee80211_frame *);
3392 ni = ieee80211_find_rxnode(ic, (
struct ieee80211_frame_min *)wh);
3396 NET_EPOCH_ENTER(et);
3398 IWM_DPRINTF(sc, IWM_DEBUG_RECV,
"input m %p\n", m);
3399 ieee80211_input_mimo(ni, m);
3400 ieee80211_free_node(ni);
3402 IWM_DPRINTF(sc, IWM_DEBUG_RECV,
"inputall m %p\n", m);
3403 ieee80211_input_mimo_all(ic, m);
3417 struct ieee80211_ratectl_tx_status *txs = &sc->
sc_txs;
3418 struct ieee80211_node *ni = &in->
in_ni;
3419 struct ieee80211vap *vap = ni->ni_vap;
3421 int new_rate, cur_rate = vap->iv_bss->ni_txrate;
3422 boolean_t rate_matched;
3423 uint8_t tx_resp_rate;
3425 KASSERT(tx_resp->
frame_count == 1, (
"too many frames"));
3428 IWM_DPRINTF(sc, IWM_DEBUG_XMIT,
"%s: status=0x%04x, seq=%d, fc=%d, btc=%d, frts=%d, ff=%d, irate=%08x, wmt=%d\n",
3442 rate_matched = (tx_resp_rate != 0 && tx_resp_rate == cur_rate);
3444 if (tx_resp_rate != 0 && cur_rate != 0 && !rate_matched) {
3446 "tx_resp_rate doesn't match ni_txrate (tx_resp_rate=%u "
3447 "ni_txrate=%d)\n", tx_resp_rate, cur_rate);
3450 txs->flags = IEEE80211_RATECTL_STATUS_SHORT_RETRY |
3451 IEEE80211_RATECTL_STATUS_LONG_RETRY;
3458 txs->status = IEEE80211_RATECTL_TX_FAIL_SHORT;
3461 txs->status = IEEE80211_RATECTL_TX_FAIL_LONG;
3464 txs->status = IEEE80211_RATECTL_TX_FAIL_EXPIRED;
3467 txs->status = IEEE80211_RATECTL_TX_FAIL_UNSPECIFIED;
3471 txs->status = IEEE80211_RATECTL_TX_SUCCESS;
3475 ieee80211_ratectl_tx_complete(ni, txs);
3477 int rix = ieee80211_ratectl_rate(vap->iv_bss, NULL, 0);
3478 new_rate = vap->iv_bss->ni_txrate;
3479 if (new_rate != 0 && new_rate != cur_rate) {
3486 return (txs->status != IEEE80211_RATECTL_TX_SUCCESS);
3497 int idx, qid, qmsk, status;
3499 cmd_hdr = &pkt->
hdr;
3503 ring = &sc->
txq[qid];
3504 txd = &ring->
data[idx];
3508 KASSERT(txd->
done == 0, (
"txd not done"));
3509 KASSERT(txd->
in != NULL, (
"txd without node"));
3510 KASSERT(txd->
m != NULL, (
"txd without mbuf"));
3517 bus_dmamap_sync(ring->
data_dmat, txd->
map, BUS_DMASYNC_POSTWRITE);
3521 "free txd %p, in %p\n", txd, txd->
in);
3526 ieee80211_tx_complete(&in->
in_ni, m, status);
3557 "cmd notification type 0x%x qid %d idx %d\n",
3563 if (data->
m != NULL) {
3565 BUS_DMASYNC_POSTWRITE);
3573 device_printf(sc->
sc_dev,
3574 "%s: Some HCMDs skipped?: idx=%d queued=%d cur=%d\n",
3579 KASSERT(ring->
queued > 0, (
"ring->queued is empty?"));
3590iwm_update_sched(
struct iwm_softc *sc,
int qid,
int idx, uint8_t sta_id,
3599 len = roundup(len, 4) / 4;
3601 w_val = htole16(sta_id << 12 | len);
3606 BUS_DMASYNC_PREWRITE);
3612 BUS_DMASYNC_PREWRITE);
3622 for (i = 0; i < nitems(
iwm_rates); i++) {
3627 IWM_DPRINTF(sc, IWM_DEBUG_XMIT | IWM_DEBUG_TXRATE,
3628 "%s: couldn't find an entry for rate=%d\n",
3641 struct ieee80211_node *ni = &in->
in_ni;
3642 struct ieee80211_frame *wh;
3643 const struct ieee80211_txparam *tp = ni->ni_txparms;
3646 int ridx, rate_flags;
3648 wh = mtod(m,
struct ieee80211_frame *);
3649 type = wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK;
3654 if (type == IEEE80211_FC0_TYPE_MGT ||
3655 type == IEEE80211_FC0_TYPE_CTL ||
3656 (m->m_flags & M_EAPOL) != 0) {
3659 "%s: MGT (%d)\n", __func__, tp->mgmtrate);
3660 }
else if (IEEE80211_IS_MULTICAST(wh->i_addr1)) {
3663 "%s: MCAST (%d)\n", __func__, tp->mcastrate);
3664 }
else if (tp->ucastrate != IEEE80211_FIXED_RATE_NONE) {
3667 "%s: FIXED_RATE (%d)\n", __func__, tp->ucastrate);
3670 IWM_DPRINTF(sc, IWM_DEBUG_TXRATE,
"%s: DATA\n", __func__);
3680 IWM_DPRINTF(sc, IWM_DEBUG_XMIT | IWM_DEBUG_TXRATE,
3681 "%s: frame type=%d txrate %d\n",
3686 IWM_DPRINTF(sc, IWM_DEBUG_TXRATE,
"%s: ridx=%d; rate=%d, CCK=%d\n",
3708 struct ieee80211com *ic = &sc->
sc_ic;
3709 struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps);
3716 struct ieee80211_frame *wh;
3717 struct ieee80211_key *k = NULL;
3725 int i, totlen, error, pad;
3727 wh = mtod(m,
struct ieee80211_frame *);
3728 hdrlen = ieee80211_anyhdrsize(wh);
3729 type = wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK;
3731 ring = &sc->
txq[ac];
3732 desc = &ring->
desc[ring->
cur];
3733 data = &ring->
data[ring->
cur];
3736 cmd = &ring->
cmd[ring->
cur];
3742 tx = (
void *)cmd->
data;
3743 memset(tx, 0,
sizeof(*tx));
3748 if (wh->i_fc[1] & IEEE80211_FC1_PROTECTED) {
3750 k = ieee80211_crypto_encap(ni, m);
3756 wh = mtod(m,
struct ieee80211_frame *);
3759 if (ieee80211_radiotap_active_vap(vap)) {
3767 tap->
wt_flags |= IEEE80211_RADIOTAP_F_WEP;
3768 ieee80211_radiotap_tx(vap, m);
3772 totlen = m->m_pkthdr.len;
3773 if (!IEEE80211_IS_MULTICAST(wh->i_addr1)) {
3777 if (type == IEEE80211_FC0_TYPE_DATA &&
3778 totlen + IEEE80211_CRC_LEN > vap->iv_rtsthreshold &&
3779 !IEEE80211_IS_MULTICAST(wh->i_addr1)) {
3785 if (type == IEEE80211_FC0_TYPE_MGT) {
3786 uint8_t subtype = wh->i_fc[0] & IEEE80211_FC0_SUBTYPE_MASK;
3788 if (subtype == IEEE80211_FC0_SUBTYPE_ASSOC_REQ ||
3789 subtype == IEEE80211_FC0_SUBTYPE_REASSOC_REQ) {
3791 }
else if (subtype == IEEE80211_FC0_SUBTYPE_ACTION) {
3804 pad = 4 - (hdrlen & 3);
3810 tx->
len = htole16(totlen);
3819 memcpy((uint8_t *)tx +
sizeof(*tx), wh, hdrlen);
3828 error = bus_dmamap_load_mbuf_sg(ring->
data_dmat, data->
map, m,
3829 segs, &nsegs, BUS_DMA_NOWAIT);
3831 if (error != EFBIG) {
3832 device_printf(sc->
sc_dev,
"can't map mbuf (error %d)\n",
3840 device_printf(sc->
sc_dev,
3841 "%s: could not defrag mbuf\n", __func__);
3847 error = bus_dmamap_load_mbuf_sg(ring->
data_dmat, data->
map, m,
3848 segs, &nsegs, BUS_DMA_NOWAIT);
3850 device_printf(sc->
sc_dev,
"can't map mbuf (error %d)\n",
3861 "sending txd %p, in %p\n", data, data->
in);
3862 KASSERT(data->
in != NULL, (
"node is NULL"));
3865 "sending data: qid=%d idx=%d len=%d nsegs=%d txflags=0x%08x rate_n_flags=0x%08x rateidx=%u\n",
3866 ring->
qid, ring->
cur, totlen, nsegs,
3873 memset(desc, 0,
sizeof(*desc));
3885 for (i = 0; i < nsegs; i++) {
3887 desc->
tbs[i + 2].
lo = htole32(seg->ds_addr);
3894 BUS_DMASYNC_PREWRITE);
3896 BUS_DMASYNC_PREWRITE);
3898 BUS_DMASYNC_PREWRITE);
3901 iwm_update_sched(sc, ring->
qid, ring->
cur, tx->
sta_id, le16toh(tx->
len));
3918 const struct ieee80211_bpf_params *params)
3920 struct ieee80211com *ic = ni->ni_ic;
3925 "->%s begin\n", __func__);
3930 "<-%s not RUNNING\n", __func__);
3936 if (params == NULL) {
3937 error =
iwm_tx(sc, m, ni, 0);
3939 error =
iwm_tx(sc, m, ni, 0);
3971 sizeof(flush_cmd), &flush_cmd);
3973 device_printf(sc->
sc_dev,
3974 "Flushing tx queue failed: %d\n", ret);
3986 int i, idx, ret, num_active_macs, quota, quota_rem;
3991 memset(&cmd, 0,
sizeof(cmd));
4008 num_active_macs = 0;
4011 num_active_macs += n_ifs[i];
4016 if (num_active_macs) {
4028 if (n_ifs[i] <= 0) {
4032 cmd.
quotas[idx].
quota = htole32(quota * n_ifs[i]);
4044 device_printf(sc->
sc_dev,
4045 "%s: Failed to send quota: %d\n", __func__, ret);
4064 struct ieee80211_node *ni;
4074 ni = ieee80211_ref_node(vap->iv_bss);
4076 IWM_DPRINTF(sc, IWM_DEBUG_RESET | IWM_DEBUG_STATE,
4077 "%s: called; vap=%p, bss ni=%p\n",
4081 IWM_DPRINTF(sc, IWM_DEBUG_STATE,
"%s: Current node bssid: %s\n",
4082 __func__, ether_sprintf(ni->ni_bssid));
4094 if (ni->ni_intval < 16) {
4095 device_printf(sc->
sc_dev,
4096 "AP %s beacon interval is %d, refusing due to firmware bug!\n",
4097 ether_sprintf(ni->ni_bssid), ni->ni_intval);
4104 device_printf(sc->
sc_dev,
4105 "%s: failed to set multicast\n", __func__);
4126 device_printf(sc->
sc_dev,
4127 "%s: failed to update MAC\n", __func__);
4132 device_printf(sc->
sc_dev,
4133 "%s: failed to add MAC\n", __func__);
4140 in->
in_ni.ni_chan, 1, 1)) != 0) {
4141 device_printf(sc->
sc_dev,
4142 "%s: failed update phy ctxt\n", __func__);
4148 device_printf(sc->
sc_dev,
4149 "%s: binding update cmd\n", __func__);
4162 device_printf(sc->
sc_dev,
4163 "%s: failed to update power management\n",
4168 device_printf(sc->
sc_dev,
4169 "%s: failed to add sta\n", __func__);
4186 ieee80211_free_node(ni);
4190static struct ieee80211_node *
4193 return malloc(
sizeof (
struct iwm_node), M_80211_NODE,
4200 uint8_t plcp = rate_n_flags & 0xff;
4216 for (i = 0; i < rs->rs_nrates; i++) {
4217 rval = (rs->rs_rates[i] & IEEE80211_RATE_VAL);
4219 return rs->rs_rates[i];
4235 device_printf(sc->
sc_dev,
4236 "%s: WARNING: device rate for %u not found!\n",
4246 struct ieee80211_node *ni = &in->
in_ni;
4248 struct ieee80211_rateset *rs = &ni->ni_rates;
4249 int nrates = rs->rs_nrates;
4250 int i, ridx, tab = 0;
4253 KASSERT(rix >= 0 && rix < nrates, (
"invalid rix"));
4255 if (nrates > nitems(lq->
rs_table)) {
4256 device_printf(sc->
sc_dev,
4257 "%s: node supports %d rates, driver handles "
4258 "only %zu\n", __func__, nrates, nitems(lq->
rs_table));
4262 device_printf(sc->
sc_dev,
4263 "%s: node supports 0 rates, odd!\n", __func__);
4266 nrates = imin(rix + 1, nrates);
4269 "%s: nrates=%d\n", __func__, nrates);
4272 memset(lq, 0,
sizeof(*lq));
4276 if (ni->ni_flags & IEEE80211_NODE_HT)
4294 for (i = 0; i < nrates; i++) {
4295 int rate = rs->rs_rates[rix - i] & IEEE80211_RATE_VAL;
4306 nextant = 1<<(ffs(txant)-1);
4316 "station rate i=%d, rate=%d, hw=%x\n",
4321 for (i = nrates; i < nitems(lq->
rs_table); i++) {
4322 KASSERT(tab != 0, (
"invalid tab"));
4342 device_printf(sc->
sc_dev,
4343 "%s: Failed to remove station: %d\n",
4350 device_printf(sc->
sc_dev,
4351 "%s: Failed to change mac context: %d\n",
4358 device_printf(sc->
sc_dev,
4359 "%s: Failed to update smart FIFO: %d\n",
4366 device_printf(sc->
sc_dev,
4367 "%s: Failed to remove station id: %d\n",
4374 device_printf(sc->
sc_dev,
4375 "%s: Failed to update PHY quota: %d\n",
4383 device_printf(sc->
sc_dev,
4384 "%s: Failed to change mac context: %d\n",
4394 device_printf(sc->
sc_dev,
4395 "%s: Failed to remove channel ctx: %d\n",
4406 device_printf(sc->
sc_dev,
4407 "%s: Failed to change mac context: %d\n",
4414 device_printf(sc->
sc_dev,
4415 "%s: failed to update power management\n",
4423iwm_newstate(
struct ieee80211vap *vap,
enum ieee80211_state nstate,
int arg)
4426 struct ieee80211com *ic = vap->iv_ic;
4432 "switching state %s -> %s arg=0x%x\n",
4433 ieee80211_state_name[vap->iv_state],
4434 ieee80211_state_name[nstate],
4437 IEEE80211_UNLOCK(ic);
4441 (nstate == IEEE80211_S_AUTH ||
4442 nstate == IEEE80211_S_ASSOC ||
4443 nstate == IEEE80211_S_RUN)) {
4448 if (vap->iv_state == IEEE80211_S_RUN && nstate != IEEE80211_S_RUN) {
4452 if (((in =
IWM_NODE(vap->iv_bss)) != NULL))
4456 if ((vap->iv_state == IEEE80211_S_AUTH ||
4457 vap->iv_state == IEEE80211_S_ASSOC ||
4458 vap->iv_state == IEEE80211_S_RUN) &&
4459 (nstate == IEEE80211_S_INIT ||
4460 nstate == IEEE80211_S_SCAN ||
4461 nstate == IEEE80211_S_AUTH)) {
4465 if ((vap->iv_state == IEEE80211_S_RUN ||
4466 vap->iv_state == IEEE80211_S_ASSOC) &&
4467 nstate == IEEE80211_S_INIT) {
4476 IEEE80211_UNLOCK(ic);
4485 case IEEE80211_S_INIT:
4486 case IEEE80211_S_SCAN:
4489 case IEEE80211_S_AUTH:
4491 if ((error =
iwm_auth(vap, sc)) != 0) {
4492 device_printf(sc->
sc_dev,
4493 "%s: could not move to auth state: %d\n",
4502 case IEEE80211_S_ASSOC:
4510 case IEEE80211_S_RUN:
4516 device_printf(sc->
sc_dev,
4517 "%s: failed to update STA\n", __func__);
4525 device_printf(sc->
sc_dev,
4526 "%s: failed to update MAC: %d\n", __func__, error);
4533 int rix = ieee80211_ratectl_rate(&in->
in_ni, NULL, 0);
4537 device_printf(sc->
sc_dev,
4538 "%s: IWM_LQ_CMD failed: %d\n", __func__, error);
4557 struct ieee80211com *ic = &sc->
sc_ic;
4563 ieee80211_scan_done(TAILQ_FIRST(&ic->ic_vaps));
4592 return nvm_lar && tlv_lar;
4611 .
data = { &mcc_cmd },
4624 IWM_DPRINTF(sc, IWM_DEBUG_LAR,
"%s: no LAR support\n",
4629 memset(&mcc_cmd, 0,
sizeof(mcc_cmd));
4630 mcc_cmd.
mcc = htole16(alpha2[0] << 8 | alpha2[1]);
4642 "send MCC update to FW with '%c%c' src = %d\n",
4643 alpha2[0], alpha2[1], mcc_cmd.
source_id);
4654 mcc_resp = (
void *)pkt->
data;
4658 mcc_resp_v1 = (
void *)pkt->
data;
4660 n_channels = le32toh(mcc_resp_v1->
n_channels);
4668 "regulatory domain '%c%c' (%d channels available)\n",
4669 mcc >> 8,
mcc & 0xff, n_channels);
4681 .len = {
sizeof(uint32_t), },
4682 .data = { &backoff, },
4686 device_printf(sc->
sc_dev,
4687 "failed to change thermal tx backoff\n");
4694 struct ieee80211com *ic = &sc->
sc_ic;
4700 printf(
"iwm_start_hw: failed %d\n", error);
4705 printf(
"iwm_run_init_ucode: failed %d\n", error);
4716 device_printf(sc->
sc_dev,
"could not initialize hardware\n");
4723 device_printf(sc->
sc_dev,
"could not load firmware\n");
4729 device_printf(sc->
sc_dev,
"Failed to initialize Smart Fifo\n");
4732 device_printf(sc->
sc_dev,
"bt init conf failed\n");
4738 device_printf(sc->
sc_dev,
"antenna config failed\n");
4747 device_printf(sc->
sc_dev,
"phy_cfg_cmd failed\n");
4753 device_printf(sc->
sc_dev,
"add_aux_sta failed\n");
4764 &sc->
sc_phyctxt[i], &ic->ic_channels[1], 1, 1)) != 0)
4773 device_printf(sc->
sc_dev,
"PCIe LTR configuration failed\n");
4788 for (ac = 0; ac < WME_NUM_AC; ac++) {
4796 device_printf(sc->
sc_dev,
"failed to disable beacon filter\n");
4811 struct ieee80211_node *ni = vap->iv_bss;
4816 size = roundup(
sizeof(*cmd), 4);
4817 cmd = malloc(size, M_DEVBUF, M_NOWAIT | M_ZERO);
4824 IEEE80211_ADDR_COPY(cmd->
bssid, ni->ni_bssid);
4828 free(cmd, M_DEVBUF);
4849 printf(
"iwm_init_hw failed %d\n", error);
4873 error = mbufq_enqueue(&sc->
sc_snd, m);
4889 struct ieee80211_node *ni;
4893 IWM_DPRINTF(sc, IWM_DEBUG_XMIT | IWM_DEBUG_TRACE,
"->%s\n", __func__);
4895 (m = mbufq_dequeue(&sc->
sc_snd)) != NULL) {
4896 ni = (
struct ieee80211_node *)m->m_pkthdr.rcvif;
4897 if (
iwm_tx(sc, m, ni, ac) != 0) {
4898 if_inc_counter(ni->ni_vap->iv_ifp,
4899 IFCOUNTER_OERRORS, 1);
4900 ieee80211_free_node(ni);
4909 IWM_DPRINTF(sc, IWM_DEBUG_XMIT | IWM_DEBUG_TRACE,
"<-%s\n", __func__);
4916 sc->
sc_flags &= ~IWM_FLAG_HW_INITED;
4922 sc->
sc_flags &= ~IWM_FLAG_SCAN_RUNNING;
4929 struct ieee80211com *ic = &sc->
sc_ic;
4936 device_printf(sc->
sc_dev,
"device timeout\n");
4940 ieee80211_restart_all(ic);
4941 counter_u64_add(sc->
sc_ic.ic_oerrors, 1);
4956 if (ic->ic_nrunning > 0) {
4967 ieee80211_start_all(ic);
4976 struct ieee80211com *ic = &sc->
sc_ic;
4983 device_printf(sc->
sc_dev,
4984 "%s: rfkill switch, disabling interface\n", __func__);
4985 ieee80211_suspend_all(ic);
4986 ieee80211_notify_radio(ic, 0);
4988 device_printf(sc->
sc_dev,
4989 "%s: rfkill cleared, re-enabling interface\n", __func__);
4990 ieee80211_resume_all(ic);
4991 ieee80211_notify_radio(ic, 1);
5082#define ERROR_START_OFFSET (1 * sizeof(uint32_t))
5083#define ERROR_ELEM_SIZE (7 * sizeof(uint32_t))
5089} advanced_lookup[] = {
5090 {
"NMI_INTERRUPT_WDG", 0x34 },
5091 {
"SYSASSERT", 0x35 },
5092 {
"UCODE_VERSION_MISMATCH", 0x37 },
5093 {
"BAD_COMMAND", 0x38 },
5094 {
"NMI_INTERRUPT_DATA_ACTION_PT", 0x3C },
5095 {
"FATAL_ERROR", 0x3D },
5096 {
"NMI_TRM_HW_ERR", 0x46 },
5097 {
"NMI_INTERRUPT_TRM", 0x4C },
5098 {
"NMI_INTERRUPT_BREAK_POINT", 0x54 },
5099 {
"NMI_INTERRUPT_WDG_RXF_FULL", 0x5C },
5100 {
"NMI_INTERRUPT_WDG_NO_RBD_RXF_FULL", 0x64 },
5101 {
"NMI_INTERRUPT_HOST", 0x66 },
5102 {
"NMI_INTERRUPT_ACTION_PT", 0x7C },
5103 {
"NMI_INTERRUPT_UNKNOWN", 0x84 },
5104 {
"NMI_INTERRUPT_INST_ACTION_PT", 0x86 },
5105 {
"ADVANCED_SYSASSERT", 0 },
5109iwm_desc_lookup(uint32_t num)
5113 for (i = 0; i < nitems(advanced_lookup) - 1; i++)
5114 if (advanced_lookup[i].num == num)
5115 return advanced_lookup[i].name;
5118 return advanced_lookup[i].name;
5129 if (base < 0x800000) {
5130 device_printf(sc->
sc_dev,
"Invalid error log pointer 0x%08x\n",
5135 if (
iwm_read_mem(sc, base, &table,
sizeof(table)/
sizeof(uint32_t))) {
5136 device_printf(sc->
sc_dev,
"reading errlog failed\n");
5141 device_printf(sc->
sc_dev,
"Start UMAC Error Log Dump:\n");
5142 device_printf(sc->
sc_dev,
"Status: 0x%x, count: %d\n",
5146 device_printf(sc->
sc_dev,
"0x%08X | %s\n", table.error_id,
5147 iwm_desc_lookup(table.error_id));
5148 device_printf(sc->
sc_dev,
"0x%08X | umac branchlink1\n", table.blink1);
5149 device_printf(sc->
sc_dev,
"0x%08X | umac branchlink2\n", table.blink2);
5150 device_printf(sc->
sc_dev,
"0x%08X | umac interruptlink1\n",
5152 device_printf(sc->
sc_dev,
"0x%08X | umac interruptlink2\n",
5154 device_printf(sc->
sc_dev,
"0x%08X | umac data1\n", table.data1);
5155 device_printf(sc->
sc_dev,
"0x%08X | umac data2\n", table.data2);
5156 device_printf(sc->
sc_dev,
"0x%08X | umac data3\n", table.data3);
5157 device_printf(sc->
sc_dev,
"0x%08X | umac major\n", table.umac_major);
5158 device_printf(sc->
sc_dev,
"0x%08X | umac minor\n", table.umac_minor);
5159 device_printf(sc->
sc_dev,
"0x%08X | frame pointer\n",
5160 table.frame_pointer);
5161 device_printf(sc->
sc_dev,
"0x%08X | stack pointer\n",
5162 table.stack_pointer);
5163 device_printf(sc->
sc_dev,
"0x%08X | last host cmd\n", table.cmd_header);
5164 device_printf(sc->
sc_dev,
"0x%08X | isr status reg\n",
5165 table.nic_isr_pref);
5181 device_printf(sc->
sc_dev,
"dumping device error log\n");
5183 if (base < 0x800000) {
5184 device_printf(sc->
sc_dev,
5185 "Invalid error log pointer 0x%08x\n", base);
5189 if (
iwm_read_mem(sc, base, &table,
sizeof(table)/
sizeof(uint32_t))) {
5190 device_printf(sc->
sc_dev,
"reading errlog failed\n");
5195 device_printf(sc->
sc_dev,
"errlog not found, skipping\n");
5200 device_printf(sc->
sc_dev,
"Start Error Log Dump:\n");
5201 device_printf(sc->
sc_dev,
"Status: 0x%x, count: %d\n",
5205 device_printf(sc->
sc_dev,
"0x%08X | %-28s\n", table.error_id,
5206 iwm_desc_lookup(table.error_id));
5207 device_printf(sc->
sc_dev,
"%08X | trm_hw_status0\n",
5208 table.trm_hw_status0);
5209 device_printf(sc->
sc_dev,
"%08X | trm_hw_status1\n",
5210 table.trm_hw_status1);
5211 device_printf(sc->
sc_dev,
"%08X | branchlink2\n", table.blink2);
5212 device_printf(sc->
sc_dev,
"%08X | interruptlink1\n", table.ilink1);
5213 device_printf(sc->
sc_dev,
"%08X | interruptlink2\n", table.ilink2);
5214 device_printf(sc->
sc_dev,
"%08X | data1\n", table.data1);
5215 device_printf(sc->
sc_dev,
"%08X | data2\n", table.data2);
5216 device_printf(sc->
sc_dev,
"%08X | data3\n", table.data3);
5217 device_printf(sc->
sc_dev,
"%08X | beacon time\n", table.bcon_time);
5218 device_printf(sc->
sc_dev,
"%08X | tsf low\n", table.tsf_low);
5219 device_printf(sc->
sc_dev,
"%08X | tsf hi\n", table.tsf_hi);
5220 device_printf(sc->
sc_dev,
"%08X | time gp1\n", table.gp1);
5221 device_printf(sc->
sc_dev,
"%08X | time gp2\n", table.gp2);
5222 device_printf(sc->
sc_dev,
"%08X | uCode revision type\n",
5224 device_printf(sc->
sc_dev,
"%08X | uCode version major\n", table.major);
5225 device_printf(sc->
sc_dev,
"%08X | uCode version minor\n", table.minor);
5226 device_printf(sc->
sc_dev,
"%08X | hw version\n", table.hw_ver);
5227 device_printf(sc->
sc_dev,
"%08X | board version\n", table.brd_ver);
5228 device_printf(sc->
sc_dev,
"%08X | hcmd\n", table.hcmd);
5229 device_printf(sc->
sc_dev,
"%08X | isr0\n", table.isr0);
5230 device_printf(sc->
sc_dev,
"%08X | isr1\n", table.isr1);
5231 device_printf(sc->
sc_dev,
"%08X | isr2\n", table.isr2);
5232 device_printf(sc->
sc_dev,
"%08X | isr3\n", table.isr3);
5233 device_printf(sc->
sc_dev,
"%08X | isr4\n", table.isr4);
5234 device_printf(sc->
sc_dev,
"%08X | last cmd Id\n", table.last_cmd_id);
5235 device_printf(sc->
sc_dev,
"%08X | wait_event\n", table.wait_event);
5236 device_printf(sc->
sc_dev,
"%08X | l2p_control\n", table.l2p_control);
5237 device_printf(sc->
sc_dev,
"%08X | l2p_duration\n", table.l2p_duration);
5238 device_printf(sc->
sc_dev,
"%08X | l2p_mhvalid\n", table.l2p_mhvalid);
5239 device_printf(sc->
sc_dev,
"%08X | l2p_addr_match\n", table.l2p_addr_match);
5240 device_printf(sc->
sc_dev,
"%08X | lmpm_pmg_sel\n", table.lmpm_pmg_sel);
5241 device_printf(sc->
sc_dev,
"%08X | timestamp\n", table.u_timestamp);
5242 device_printf(sc->
sc_dev,
"%08X | flow_handler\n", table.flow_handler);
5245 iwm_nic_umac_error(sc);
5252 struct ieee80211com *ic = &sc->
sc_ic;
5255 uint32_t offset = 0;
5258 boolean_t stolen = FALSE;
5260#define HAVEROOM(a) \
5261 ((a) + sizeof(uint32_t) + sizeof(struct iwm_cmd_header) < maxoff)
5266 int qid, idx, code, len;
5277 if ((pkt->
hdr.
code == 0 && (qid & ~0x80) == 0 && idx == 0) ||
5283 "rx packet qid=%d idx=%d type=%x\n",
5284 qid & ~0x80, pkt->
hdr.
idx, code);
5287 len +=
sizeof(uint32_t);
5306 (nextpkt->
hdr.
qid & ~0x80) == 0 &&
5307 nextpkt->
hdr.
idx == 0) ||
5326 m1 = m_copym(m, 0, M_COPYALL, M_NOWAIT);
5345 struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps);
5347 resp = (
void *)pkt->
data;
5350 IWM_DPRINTF(sc, IWM_DEBUG_BEACON | IWM_DEBUG_STATE,
5351 "%s: MISSED_BEACON: mac_id=%d, "
5352 "consec_since_last_rx=%d, consec=%d, num_expect=%d "
5366 if (vap->iv_state == IEEE80211_S_RUN &&
5367 (ic->ic_flags & IEEE80211_F_SCAN) == 0) {
5368 if (missed > vap->iv_bmissthreshold) {
5371 ieee80211_beacon_miss(ic);
5394 if (sc->
sc_wantresp == (((qid & ~0x80) << 16) | idx)) {
5402 notif = (
void *)pkt->
data;
5408 "fw source %d sent CC '%s'\n",
5419 device_printf(sc->
sc_dev,
5420 "Invalid DTS_MEASUREMENT_NOTIFICATION\n");
5423 notif = (
void *)pkt->
data;
5425 "IWM_DTS_MEASUREMENT_NOTIFICATION - %d\n",
5455 cresp = (
void *)pkt->
data;
5456 if (sc->
sc_wantresp == (((qid & ~0x80) << 16) | idx)) {
5458 pkt,
sizeof(*pkt)+
sizeof(*cresp));
5472 sc->
sc_flags &= ~IWM_FLAG_SCAN_RUNNING;
5484 sc->
sc_flags &= ~IWM_FLAG_SCAN_RUNNING;
5491 notif = (
void *)pkt->
data;
5493 IWM_DPRINTF(sc, IWM_DEBUG_SCAN,
"UMAC scan iteration "
5494 "complete, status=0x%x, %d channels scanned\n",
5501 resp = (
void *)pkt->
data;
5503 device_printf(sc->
sc_dev,
5504 "firmware error 0x%x, cmd 0x%x\n",
5526 rsp = (
void *)pkt->
data;
5529 "queue cfg token=0x%x sta_id=%d "
5530 "tid=%d scd_queue=%d\n",
5537 device_printf(sc->
sc_dev,
5538 "code %x, frame %d/%d %x unhandled\n",
5557 if (!(qid & (1 << 7)))
5579 BUS_DMASYNC_POSTREAD);
5594 while (sc->
rxq.
cur != hw) {
5599 BUS_DMASYNC_POSTREAD);
5602 "%s: hw = %d cur = %d\n", __func__, hw, ring->
cur);
5605 ring->
cur = (ring->
cur + 1) % count;
5614 hw = (hw == 0) ? count - 1 : hw - 1;
5633 tmp = htole32(ict[sc->
ict_cur]);
5645 tmp = htole32(ict[sc->
ict_cur]);
5649 if (r1 == 0xffffffff)
5655 r1 = (0xff & r1) | ((0xff00 & r1) << 16);
5659 if (r1 == 0xffffffff || (r1 & 0xfffffff0) == 0xa5a5a5a0)
5663 if (r1 == 0 && r2 == 0) {
5674 struct ieee80211com *ic = &sc->
sc_ic;
5675 struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps);
5681 device_printf(sc->
sc_dev,
"driver status:\n");
5684 device_printf(sc->
sc_dev,
5685 " tx ring %2d: qid=%-2d cur=%-3d "
5689 device_printf(sc->
sc_dev,
5690 " rx ring: cur=%d\n", sc->
rxq.
cur);
5691 device_printf(sc->
sc_dev,
5692 " 802.11 state %d\n", (vap == NULL) ? -1 : vap->iv_state);
5700 printf(
"%s: null vap\n", __func__);
5704 device_printf(sc->
sc_dev,
"%s: controller panicked, iv_state = %d; "
5705 "restarting\n", __func__, vap->iv_state);
5707 ieee80211_restart_all(ic);
5713 device_printf(sc->
sc_dev,
"hardware error, stopping device\n");
5756 if (__predict_false(r1 & ~handled))
5758 "%s: unhandled interrupts: %x\n", __func__, r1);
5769#define PCI_VENDOR_INTEL 0x8086
5770#define PCI_PRODUCT_INTEL_WL_3160_1 0x08b3
5771#define PCI_PRODUCT_INTEL_WL_3160_2 0x08b4
5772#define PCI_PRODUCT_INTEL_WL_3165_1 0x3165
5773#define PCI_PRODUCT_INTEL_WL_3165_2 0x3166
5774#define PCI_PRODUCT_INTEL_WL_3168_1 0x24fb
5775#define PCI_PRODUCT_INTEL_WL_7260_1 0x08b1
5776#define PCI_PRODUCT_INTEL_WL_7260_2 0x08b2
5777#define PCI_PRODUCT_INTEL_WL_7265_1 0x095a
5778#define PCI_PRODUCT_INTEL_WL_7265_2 0x095b
5779#define PCI_PRODUCT_INTEL_WL_8260_1 0x24f3
5780#define PCI_PRODUCT_INTEL_WL_8260_2 0x24f4
5781#define PCI_PRODUCT_INTEL_WL_8265_1 0x24fd
5782#define PCI_PRODUCT_INTEL_WL_9560_1 0x9df0
5783#define PCI_PRODUCT_INTEL_WL_9560_2 0xa370
5784#define PCI_PRODUCT_INTEL_WL_9560_3 0x31dc
5785#define PCI_PRODUCT_INTEL_WL_9260_1 0x2526
5818 return (BUS_PROBE_DEFAULT);
5832 sc = device_get_softc(dev);
5834 devid = pci_get_device(dev);
5841 device_printf(dev,
"unknown adapter type\n");
5846#define PCI_CFG_RETRY_TIMEOUT 0x041
5852 int count, error, rid;
5855 sc = device_get_softc(dev);
5862 pci_enable_busmaster(dev);
5863 reg = pci_read_config(dev, PCIR_STATUS,
sizeof(reg));
5865 if (reg & PCIM_STATUS_INTxSTATE) {
5866 reg &= ~PCIM_STATUS_INTxSTATE;
5868 pci_write_config(dev, PCIR_STATUS, reg,
sizeof(reg));
5871 sc->
sc_mem = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid,
5873 if (sc->
sc_mem == NULL) {
5874 device_printf(sc->
sc_dev,
"can't map mem space\n");
5883 if (pci_alloc_msi(dev, &count) == 0)
5885 sc->
sc_irq = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid, RF_ACTIVE |
5886 (rid != 0 ? 0 : RF_SHAREABLE));
5887 if (sc->
sc_irq == NULL) {
5888 device_printf(dev,
"can't map interrupt\n");
5891 error = bus_setup_intr(dev, sc->
sc_irq, INTR_TYPE_NET | INTR_MPSAFE,
5894 device_printf(dev,
"can't establish interrupt");
5905 struct iwm_softc *sc = device_get_softc(dev);
5907 if (sc->
sc_irq != NULL) {
5909 bus_release_resource(dev, SYS_RES_IRQ,
5911 pci_release_msi(dev);
5914 bus_release_resource(dev, SYS_RES_MEMORY,
5921 struct iwm_softc *sc = device_get_softc(dev);
5922 struct ieee80211com *ic = &sc->
sc_ic;
5929 mbufq_init(&sc->
sc_snd, ifqmaxlen);
5935 sc->
sc_tq = taskqueue_create(
"iwm_taskq", M_WAITOK,
5936 taskqueue_thread_enqueue, &sc->
sc_tq);
5937 error = taskqueue_start_threads(&sc->
sc_tq, 1, 0,
"iwm_taskq");
5939 device_printf(dev,
"can't start taskq thread, error %d\n",
5950 device_printf(dev,
"failed to init notification wait struct\n");
5959 device_printf(dev,
"Cannot init phy_db\n");
5988 device_printf(dev,
"could not initialize hardware\n");
6005 device_printf(sc->
sc_dev,
6006 "Failed to wake up the nic\n");
6021 device_printf(sc->
sc_dev,
"Failed to lock the nic\n");
6034 device_printf(dev,
"could not allocate memory for firmware\n");
6040 device_printf(dev,
"could not allocate keep warm page\n");
6046 device_printf(dev,
"could not allocate ICT table\n");
6052 device_printf(dev,
"could not allocate TX scheduler rings\n");
6057 for (txq_i = 0; txq_i < nitems(sc->
txq); txq_i++) {
6059 &sc->
txq[txq_i], txq_i)) != 0) {
6061 "could not allocate TX ring %d\n",
6069 device_printf(dev,
"could not allocate RX ring\n");
6077 ic->ic_name = device_get_nameunit(sc->
sc_dev);
6078 ic->ic_phytype = IEEE80211_T_OFDM;
6079 ic->ic_opmode = IEEE80211_M_STA;
6087 IEEE80211_C_SHSLOT |
6088 IEEE80211_C_SHPREAMBLE
6092 ic->ic_flags_ext = IEEE80211_FEXT_SCAN_OFFLOAD;
6093 for (i = 0; i < nitems(sc->
sc_phyctxt); i++) {
6107 SYSCTL_ADD_INT(device_get_sysctl_ctx(dev),
6108 SYSCTL_CHILDREN(device_get_sysctl_tree(dev)), OID_AUTO,
"debug",
6109 CTLFLAG_RW, &sc->
sc_debug, 0,
"control debugging");
6126 "config_intrhook_establish failed\n");
6131 IWM_DPRINTF(sc, IWM_DEBUG_RESET | IWM_DEBUG_TRACE,
6132 "<-%s\n", __func__);
6146 char zero_addr[IEEE80211_ADDR_LEN] = { 0, 0, 0, 0, 0, 0 };
6148 if ((addr[0] & 1) || IEEE80211_ADDR_EQ(zero_addr, addr))
6157#define IWM_EXP2(x) ((1 << (x)) - 1)
6159 struct chanAccParams chp;
6160 struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps);
6163 struct wmeParams tmp[WME_NUM_AC];
6169 ieee80211_wme_ic_getparams(ic, &chp);
6172 for (aci = 0; aci < WME_NUM_AC; aci++)
6173 tmp[aci] = chp.cap_wmeParams[aci];
6174 IEEE80211_UNLOCK(ic);
6177 for (aci = 0; aci < WME_NUM_AC; aci++) {
6178 const struct wmeParams *ac = &tmp[aci];
6183 IEEE80211_TXOP_TO_US(ac->wmep_txopLimit);
6190 device_printf(sc->
sc_dev,
6191 "%s: failed to update MAC\n", __func__);
6205 device_t dev = sc->
sc_dev;
6206 struct ieee80211com *ic = &sc->
sc_ic;
6209 IWM_DPRINTF(sc, IWM_DEBUG_RESET | IWM_DEBUG_TRACE,
6210 "->%s\n", __func__);
6214 device_printf(dev,
"could not initialize hardware\n");
6226 "hw rev 0x%x, fw ver %s, address %s\n",
6232 memset(&ic->ic_sup_rates[IEEE80211_MODE_11A], 0,
6233 sizeof(ic->ic_sup_rates[IEEE80211_MODE_11A]));
6243 ieee80211_ifattach(ic);
6260 ieee80211_announce(ic);
6262 IWM_DPRINTF(sc, IWM_DEBUG_RESET | IWM_DEBUG_TRACE,
6263 "<-%s\n", __func__);
6278 struct ieee80211com *ic = &sc->
sc_ic;
6280 IWM_DPRINTF(sc, IWM_DEBUG_RESET | IWM_DEBUG_TRACE,
6281 "->%s begin\n", __func__);
6282 ieee80211_radiotap_attach(ic,
6287 IWM_DPRINTF(sc, IWM_DEBUG_RESET | IWM_DEBUG_TRACE,
6288 "->%s end\n", __func__);
6291static struct ieee80211vap *
6293 enum ieee80211_opmode opmode,
int flags,
6294 const uint8_t bssid[IEEE80211_ADDR_LEN],
6295 const uint8_t mac[IEEE80211_ADDR_LEN])
6298 struct ieee80211vap *vap;
6300 if (!TAILQ_EMPTY(&ic->ic_vaps))
6302 ivp = malloc(
sizeof(
struct iwm_vap), M_80211_VAP, M_WAITOK | M_ZERO);
6304 ieee80211_vap_setup(ic, vap, name, unit, opmode, flags, bssid);
6305 vap->iv_bmissthreshold = 10;
6316 ieee80211_ratectl_init(vap);
6318 ieee80211_vap_attach(vap, ieee80211_media_change,
6319 ieee80211_media_status, mac);
6320 ic->ic_opmode = opmode;
6330 ieee80211_ratectl_deinit(vap);
6331 ieee80211_vap_detach(vap);
6332 free(ivp, M_80211_VAP);
6339 struct ieee80211_node *ni;
6341 while ((m = mbufq_dequeue(&sc->
sc_snd)) != NULL) {
6342 ni = (
struct ieee80211_node *)m->m_pkthdr.rcvif;
6343 ieee80211_free_node(ni);
6351 struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps);
6358 device_printf(sc->
sc_dev,
6359 "%s: Previous scan not completed yet\n", __func__);
6366 device_printf(sc->
sc_dev,
"could not initiate scan\n");
6368 ieee80211_cancel_scan(vap);
6379 struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps);
6384 if (vap->iv_state == IEEE80211_S_RUN)
6392 sc->
sc_flags &= ~IWM_FLAG_SCAN_RUNNING;
6402 taskqueue_cancel(ic->ic_tq, &sc->
sc_es_task, NULL);
6435 if (sc->
sc_ic.ic_nrunning > 0)
6445 struct iwm_softc *sc = device_get_softc(dev);
6461 sc->
sc_flags &= ~IWM_FLAG_SCANNING;
6467 ieee80211_resume_all(&sc->
sc_ic);
6476 struct iwm_softc *sc = device_get_softc(dev);
6478 do_stop = !! (sc->
sc_ic.ic_nrunning > 0);
6483 ieee80211_suspend_all(&sc->
sc_ic);
6499 device_t dev = sc->
sc_dev;
6509 taskqueue_drain_all(sc->
sc_tq);
6510 taskqueue_free(sc->
sc_tq);
6515 ieee80211_ifdetach(&sc->
sc_ic);
6527 for (i = 0; i < nitems(sc->
txq); i++)
6531 if (fw->
fw_fp != NULL)
6558 struct iwm_softc *sc = device_get_softc(dev);
static void iwm_cmd_done(struct iwm_softc *, struct iwm_rx_packet *)
static int iwm_set_ucode_capabilities(struct iwm_softc *sc, const uint8_t *data, struct iwm_ucode_capabilities *capa)
static int iwm_alloc_rx_ring(struct iwm_softc *, struct iwm_rx_ring *)
static int iwm_update_quotas(struct iwm_softc *, struct iwm_vap *)
static int iwm_attach(device_t)
#define IWM_UCODE_ALIVE_TIMEOUT
static int iwm_set_hw_address(struct iwm_softc *sc, struct iwm_nvm_data *data, const uint16_t *nvm_hw, const uint16_t *mac_override)
@ IWM_READ_NVM_CHUNK_SUCCEED
@ IWM_READ_NVM_CHUNK_NOT_VALID_ADDRESS
static void iwm_scan_start(struct ieee80211com *)
static void iwm_stop(struct iwm_softc *)
const struct iwm_rate iwm_rates[]
static void iwm_stop_device(struct iwm_softc *)
static int iwm_transmit(struct ieee80211com *ic, struct mbuf *m)
static int iwm_pcie_load_given_ucode(struct iwm_softc *, const struct iwm_fw_img *)
#define IWM_RIDX_IS_CCK(_i_)
static int iwm_config_ltr(struct iwm_softc *sc)
static int iwm_raw_xmit(struct ieee80211_node *, struct mbuf *, const struct ieee80211_bpf_params *)
int iwm_enable_txq(struct iwm_softc *sc, int sta_id, int qid, int fifo)
#define PCI_PRODUCT_INTEL_WL_7265_2
#define PCI_PRODUCT_INTEL_WL_7265_1
static int iwm_run_init_ucode(struct iwm_softc *, int)
static int iwm_firmware_store_section(struct iwm_softc *, enum iwm_ucode_type, const uint8_t *, size_t)
static void iwm_watchdog(void *)
static const struct iwm_rate * iwm_tx_fill_cmd(struct iwm_softc *, struct iwm_node *, struct mbuf *, struct iwm_tx_cmd *)
static void iwm_free_nvm_data(struct iwm_nvm_data *)
static device_method_t iwm_pci_methods[]
static int iwm_pcie_load_firmware_chunk(struct iwm_softc *, uint32_t, bus_addr_t, uint32_t)
static int iwm_set_ucode_api_flags(struct iwm_softc *sc, const uint8_t *data, struct iwm_ucode_capabilities *capa)
static struct iwm_nvm_data * iwm_parse_nvm_data(struct iwm_softc *, const uint16_t *, const uint16_t *, const uint16_t *, const uint16_t *, const uint16_t *, const uint16_t *)
static int iwm_store_cscheme(struct iwm_softc *, const uint8_t *, size_t)
static int iwm_newstate(struct ieee80211vap *, enum ieee80211_state, int)
static int iwm_set_default_calib(struct iwm_softc *, const void *)
TUNABLE_INT("hw.iwm.lar.disable", &iwm_lar_disable)
#define IWM_DEFAULT_SCAN_CHANNELS
static int iwm_rate2ridx(struct iwm_softc *, uint8_t)
static int iwm_start_fw(struct iwm_softc *, const struct iwm_fw_img *)
static struct ieee80211_node * iwm_node_alloc(struct ieee80211vap *, const uint8_t[IEEE80211_ADDR_LEN])
static int iwm_get_noise(struct iwm_softc *, const struct iwm_statistics_rx_non_phy *)
static int iwm_trans_pcie_fw_alive(struct iwm_softc *, uint32_t)
static void iwm_init(struct iwm_softc *)
static void iwm_pci_detach(device_t dev)
#define IWM_NUM_2GHZ_CHANNELS
static bool iwm_rx_mpdu_mq(struct iwm_softc *sc, struct mbuf *m, uint32_t offset, bool stolen)
MODULE_DEPEND(iwm, firmware, 1, 1, 1)
#define IWM_NVM_DEFAULT_CHUNK_SIZE
static int iwm_pci_attach(device_t dev)
static int iwm_tx(struct iwm_softc *, struct mbuf *, struct ieee80211_node *, int)
static int iwm_tx_rateidx_global_lookup(struct iwm_softc *sc, uint8_t rate)
static int iwm_nic_rx_legacy_init(struct iwm_softc *sc)
static bool iwm_rx_mpdu(struct iwm_softc *, struct mbuf *, uint32_t, bool)
#define PCI_PRODUCT_INTEL_WL_9560_2
static int iwm_nvm_read_section(struct iwm_softc *, uint16_t, uint8_t *, uint16_t *, uint32_t)
static void iwm_disable_interrupts(struct iwm_softc *)
MODULE_PNP_INFO("U16:device;P:#;T:vendor=0x8086", pci, iwm_pci_driver, iwm_devices, nitems(iwm_devices))
static void iwm_rx_tx_cmd(struct iwm_softc *, struct iwm_rx_packet *)
_Static_assert(nitems(iwm_nvm_channels)<=IWM_NUM_CHANNELS, "IWM_NUM_CHANNELS is too small")
#define PCI_PRODUCT_INTEL_WL_3160_1
static int iwm_wme_update(struct ieee80211com *ic)
static int iwm_pcie_load_section(struct iwm_softc *, uint8_t, const struct iwm_fw_desc *)
static void iwm_start(struct iwm_softc *)
static driver_t iwm_pci_driver
static int iwm_suspend(device_t dev)
static int iwm_pcie_load_cpu_sections_8000(struct iwm_softc *sc, const struct iwm_fw_img *, int, int *)
static void iwm_intr(void *)
static void iwm_vap_delete(struct ieee80211vap *)
static int iwm_nic_rx_mq_init(struct iwm_softc *sc)
static int iwm_get_n_hw_addrs(const struct iwm_softc *, const uint16_t *)
static void iwm_rftoggle_task(void *arg, int npending __unused)
#define mtodoff(m, t, off)
int iwm_flush_tx_path(struct iwm_softc *sc, uint32_t tfd_msk, uint32_t flags)
static int iwm_init_hw(struct iwm_softc *)
#define PCI_PRODUCT_INTEL_WL_7260_2
static void iwm_handle_rx_statistics(struct iwm_softc *, struct iwm_rx_packet *)
static int iwm_get_radio_cfg(const struct iwm_softc *, const uint16_t *, const uint16_t *)
static void iwm_add_channel_band(struct iwm_softc *, struct ieee80211_channel[], int, int *, int, size_t, const uint8_t[])
#define PCI_PRODUCT_INTEL_WL_9560_1
static int iwm_get_nvm_version(const struct iwm_softc *, const uint16_t *)
static int iwm_alloc_kw(struct iwm_softc *)
static int iwm_lar_disable
const uint8_t iwm_nvm_channels_8000[]
static void iwm_notif_intr(struct iwm_softc *)
static void iwm_parent(struct ieee80211com *)
static int iwm_detach_local(struct iwm_softc *sc, int)
static void iwm_nic_config(struct iwm_softc *)
static void iwm_xmit_queue_drain(struct iwm_softc *)
static void iwm_free_rx_ring(struct iwm_softc *, struct iwm_rx_ring *)
static void iwm_radiotap_attach(struct iwm_softc *)
static int iwm_send_phy_cfg_cmd(struct iwm_softc *)
static int iwm_nvm_init(struct iwm_softc *)
static int iwm_probe(device_t dev)
static void iwm_setrates(struct iwm_softc *, struct iwm_node *, int)
#define PCI_PRODUCT_INTEL_WL_3165_1
static void iwm_scan_mindwell(struct ieee80211_scan_state *)
static void iwm_scan_curchan(struct ieee80211_scan_state *, unsigned long)
static void iwm_free_tx_ring(struct iwm_softc *, struct iwm_tx_ring *)
#define PCI_PRODUCT_INTEL_WL_8265_1
static int iwm_pcie_load_given_ucode_8000(struct iwm_softc *, const struct iwm_fw_img *)
static int iwm_alive_fn(struct iwm_softc *sc, struct iwm_rx_packet *pkt, void *data)
#define IWM_UCODE_CALIB_TIMEOUT
static void iwm_init_task(void *)
static int iwm_is_valid_ether_addr(uint8_t *)
static void iwm_reset_rx_ring(struct iwm_softc *, struct iwm_rx_ring *)
static struct iwm_nvm_data * iwm_parse_nvm_sections(struct iwm_softc *, struct iwm_nvm_section *)
static int iwm_get_sku(const struct iwm_softc *, const uint16_t *, const uint16_t *)
static uint8_t iwm_rate_from_ucode_rate(uint32_t)
static int iwm_rx_tx_cmd_single(struct iwm_softc *, struct iwm_rx_packet *, struct iwm_node *)
static int iwm_detach(device_t)
static int iwm_rx_addbuf(struct iwm_softc *, int, int)
static void iwm_rx_rx_phy_cmd(struct iwm_softc *, struct iwm_rx_packet *)
#define PCI_PRODUCT_INTEL_WL_8260_2
static void iwm_set_radio_cfg(const struct iwm_softc *, struct iwm_nvm_data *, uint32_t)
static void iwm_endscan_cb(void *, int)
static void iwm_set_hw_address_family_8000(struct iwm_softc *, struct iwm_nvm_data *, const uint16_t *, const uint16_t *)
static int iwm_alloc_ict(struct iwm_softc *)
#define IWM_NVM_READ_OPCODE
static int iwm_read_firmware(struct iwm_softc *)
#define PCI_PRODUCT_INTEL_WL_9260_1
static int iwm_send_bt_init_conf(struct iwm_softc *)
static void iwm_set_channel(struct ieee80211com *)
static int iwm_rx_get_signal_strength(struct iwm_softc *sc, struct iwm_rx_phy_info *phy_info)
const uint8_t iwm_nvm_channels[]
#define PCI_PRODUCT_INTEL_WL_3165_2
static devclass_t iwm_devclass
uint8_t iwm_ridx2rate(struct ieee80211_rateset *rs, int ridx)
static int iwm_dev_check(device_t dev)
static int iwm_alloc_tx_ring(struct iwm_softc *, struct iwm_tx_ring *, int)
static int iwm_auth(struct ieee80211vap *, struct iwm_softc *)
static void iwm_bring_down_firmware(struct iwm_softc *sc, struct ieee80211vap *vap)
static int iwm_alloc_fwmem(struct iwm_softc *)
static int iwm_nic_init(struct iwm_softc *)
static struct ieee80211vap * iwm_vap_create(struct ieee80211com *, const char[IFNAMSIZ], int, enum ieee80211_opmode, int, const uint8_t[IEEE80211_ADDR_LEN], const uint8_t[IEEE80211_ADDR_LEN])
static boolean_t iwm_is_wifi_mcc_supported(struct iwm_softc *)
static bool iwm_rx_rx_mpdu(struct iwm_softc *sc, struct mbuf *m, uint32_t offset, bool stolen)
static void iwm_preinit(void *)
#define PCI_PRODUCT_INTEL_WL_8260_1
static int iwm_nic_tx_init(struct iwm_softc *)
struct iwm_tlv_calib_data __packed
#define PCI_CFG_RETRY_TIMEOUT
DRIVER_MODULE(iwm, pci, iwm_pci_driver, iwm_devclass, NULL, NULL)
static uint32_t iwm_eeprom_channel_flags(uint16_t)
static int iwm_resume(device_t dev)
#define PCI_PRODUCT_INTEL_WL_7260_1
static int iwm_nic_rx_init(struct iwm_softc *)
#define IWM_N_HW_ADDR_MASK
static void iwm_tt_tx_backoff(struct iwm_softc *, uint32_t)
#define PCI_PRODUCT_INTEL_WL_3160_2
static void iwm_init_channel_map(struct ieee80211com *, int, int *, struct ieee80211_channel[])
static int iwm_send_tx_ant_cfg(struct iwm_softc *, uint8_t)
static void iwm_enable_fw_load_int(struct iwm_softc *sc)
static int iwm_alloc_sched(struct iwm_softc *)
static int iwm_pcie_load_cpu_sections(struct iwm_softc *, const struct iwm_fw_img *, int, int *)
static int iwm_rxmq_get_signal_strength(struct iwm_softc *sc, struct iwm_rx_mpdu_desc *desc)
static void iwm_update_mcast(struct ieee80211com *)
static int iwm_nvm_read_chunk(struct iwm_softc *, uint16_t, uint16_t, uint16_t, uint8_t *, uint16_t *)
static boolean_t iwm_is_lar_supported(struct iwm_softc *)
static int iwm_allow_mcast(struct ieee80211vap *, struct iwm_softc *)
static int iwm_send_update_mcc_cmd(struct iwm_softc *, const char *)
static void iwm_restore_interrupts(struct iwm_softc *)
static int iwm_wait_phy_db_entry(struct iwm_softc *sc, struct iwm_rx_packet *pkt, void *data)
static void iwm_fw_info_free(struct iwm_fw_info *)
static void iwm_handle_rxb(struct iwm_softc *, struct mbuf *)
static void iwm_reset_tx_ring(struct iwm_softc *, struct iwm_tx_ring *)
#define ERROR_START_OFFSET
static void iwm_ict_reset(struct iwm_softc *)
#define PCI_PRODUCT_INTEL_WL_9560_3
static int iwm_load_ucode_wait_alive(struct iwm_softc *, enum iwm_ucode_type)
#define PCI_PRODUCT_INTEL_WL_3168_1
static void iwm_scan_end(struct ieee80211com *)
static void iwm_enable_interrupts(struct iwm_softc *)
const struct iwm_cfg iwm3160_cfg
const struct iwm_cfg iwm3168_cfg
const struct iwm_cfg iwm7265_cfg
const struct iwm_cfg iwm7265d_cfg
const struct iwm_cfg iwm3165_cfg
const struct iwm_cfg iwm7260_cfg
const struct iwm_cfg iwm8260_cfg
const struct iwm_cfg iwm8265_cfg
const struct iwm_cfg iwm9560_cfg
const struct iwm_cfg iwm9260_cfg
int iwm_binding_remove_vif(struct iwm_softc *sc, struct iwm_vap *ivp)
int iwm_binding_add_vif(struct iwm_softc *sc, struct iwm_vap *ivp)
#define IWM_DPRINTF(sc, m, fmt,...)
int iwm_send_paging_cmd(struct iwm_softc *sc, const struct iwm_fw_img *fw)
int iwm_save_fw_paging(struct iwm_softc *sc, const struct iwm_fw_img *fw)
void iwm_free_fw_paging(struct iwm_softc *sc)
#define IWM_FW_PAGING_SIZE
#define IWM_MAX_PAGING_IMAGE_SIZE
void iwm_led_enable(struct iwm_softc *sc)
void iwm_led_disable(struct iwm_softc *sc)
void iwm_led_blink_stop(struct iwm_softc *sc)
void iwm_led_blink_start(struct iwm_softc *sc)
const uint8_t iwm_ac_to_tx_fifo[]
int iwm_mac_ctxt_add(struct iwm_softc *sc, struct ieee80211vap *vap)
int iwm_mac_ctxt_changed(struct iwm_softc *sc, struct ieee80211vap *vap)
void iwm_notification_wait_free(struct iwm_notif_wait_data *notif_data)
void iwm_remove_notification(struct iwm_notif_wait_data *notif_data, struct iwm_notification_wait *wait_entry)
void iwm_init_notification_wait(struct iwm_notif_wait_data *notif_data, struct iwm_notification_wait *wait_entry, const uint16_t *cmds, int n_cmds, int(*fn)(struct iwm_softc *sc, struct iwm_rx_packet *pkt, void *data), void *fn_data)
struct iwm_notif_wait_data * iwm_notification_wait_init(struct iwm_softc *sc)
int iwm_wait_notification(struct iwm_notif_wait_data *notif_data, struct iwm_notification_wait *wait_entry, int timeout)
void iwm_notification_wait_notify(struct iwm_notif_wait_data *notif_data, uint16_t cmd, struct iwm_rx_packet *pkt)
void iwm_write_prph64(struct iwm_softc *sc, uint64_t addr, uint64_t val)
void iwm_set_bits_prph(struct iwm_softc *sc, uint32_t reg, uint32_t bits)
void iwm_enable_rfkill_int(struct iwm_softc *sc)
void iwm_set_bits_mask_prph(struct iwm_softc *sc, uint32_t reg, uint32_t bits, uint32_t mask)
int iwm_pcie_rx_stop(struct iwm_softc *sc)
uint32_t iwm_read_prph(struct iwm_softc *sc, uint32_t addr)
void iwm_pcie_clear_cmd_in_flight(struct iwm_softc *sc)
void iwm_set_pwr(struct iwm_softc *sc)
int iwm_apm_init(struct iwm_softc *sc)
int iwm_start_hw(struct iwm_softc *sc)
int iwm_check_rfkill(struct iwm_softc *sc)
int iwm_nic_lock(struct iwm_softc *sc)
int iwm_prepare_card_hw(struct iwm_softc *sc)
void iwm_nic_unlock(struct iwm_softc *sc)
int iwm_write_mem32(struct iwm_softc *sc, uint32_t addr, uint32_t val)
int iwm_write_mem(struct iwm_softc *sc, uint32_t addr, const void *buf, int dwords)
void iwm_clear_bits_prph(struct iwm_softc *sc, uint32_t reg, uint32_t bits)
int iwm_poll_bit(struct iwm_softc *sc, int reg, uint32_t bits, uint32_t mask, int timo)
void iwm_write_prph(struct iwm_softc *sc, uint32_t addr, uint32_t val)
void iwm_apm_stop(struct iwm_softc *sc)
int iwm_read_mem(struct iwm_softc *sc, uint32_t addr, void *buf, int dwords)
int iwm_phy_ctxt_add(struct iwm_softc *sc, struct iwm_phy_ctxt *ctxt, struct ieee80211_channel *chan, uint8_t chains_static, uint8_t chains_dynamic)
int iwm_phy_ctxt_changed(struct iwm_softc *sc, struct iwm_phy_ctxt *ctxt, struct ieee80211_channel *chan, uint8_t chains_static, uint8_t chains_dynamic)
int iwm_send_phy_db_data(struct iwm_phy_db *phy_db)
void iwm_phy_db_free(struct iwm_phy_db *phy_db)
struct iwm_phy_db * iwm_phy_db_init(struct iwm_softc *sc)
int iwm_phy_db_set_section(struct iwm_phy_db *phy_db, struct iwm_rx_packet *pkt)
int iwm_disable_beacon_filter(struct iwm_softc *sc)
int iwm_power_update_mac(struct iwm_softc *sc)
int iwm_enable_beacon_filter(struct iwm_softc *sc, struct iwm_vap *ivp)
int iwm_power_update_device(struct iwm_softc *sc)
void iwm_rx_lmac_scan_complete_notif(struct iwm_softc *sc, struct iwm_rx_packet *pkt)
int iwm_umac_scan(struct iwm_softc *sc)
void iwm_rx_umac_scan_complete_notif(struct iwm_softc *sc, struct iwm_rx_packet *pkt)
int iwm_config_umac_scan(struct iwm_softc *sc)
int iwm_lmac_scan(struct iwm_softc *sc)
int iwm_scan_stop_wait(struct iwm_softc *sc)
int iwm_sf_update(struct iwm_softc *sc, struct ieee80211vap *changed_vif, boolean_t remove_vif)
int iwm_rm_sta(struct iwm_softc *sc, struct ieee80211vap *vap, boolean_t is_assoc)
int iwm_rm_sta_id(struct iwm_softc *sc, struct ieee80211vap *vap)
int iwm_update_sta(struct iwm_softc *sc, struct iwm_node *in)
int iwm_add_aux_sta(struct iwm_softc *sc)
int iwm_add_sta(struct iwm_softc *sc, struct iwm_node *in)
void iwm_protect_session(struct iwm_softc *sc, struct iwm_vap *ivp, uint32_t duration, uint32_t max_delay, boolean_t wait_for_notif)
void iwm_rx_time_event_notif(struct iwm_softc *sc, struct iwm_rx_packet *pkt)
void iwm_stop_session_protection(struct iwm_softc *sc, struct iwm_vap *ivp)
void iwm_dma_contig_free(struct iwm_dma_info *dma)
void iwm_free_resp(struct iwm_softc *sc, struct iwm_host_cmd *hcmd)
int iwm_send_lq_cmd(struct iwm_softc *sc, struct iwm_lq_cmd *lq, boolean_t init)
int iwm_send_cmd_pdu(struct iwm_softc *sc, uint32_t id, uint32_t flags, uint16_t len, const void *data)
int iwm_dma_contig_alloc(bus_dma_tag_t tag, struct iwm_dma_info *dma, bus_size_t size, bus_size_t alignment)
int iwm_send_cmd(struct iwm_softc *sc, struct iwm_host_cmd *hcmd)
static uint8_t iwm_get_valid_tx_ant(struct iwm_softc *sc)
static uint32_t iwm_get_phy_config(struct iwm_softc *sc)
#define IWM_SCD_DRAM_BASE_ADDR
#define IWM_FH_TX_CHICKEN_BITS_REG
#define IWM_CSR_FH_INT_STATUS
#define IWM_FH_RCSR_RX_CONFIG_REG_IRQ_RBTH_POS
#define IWM_PHY_CONFIGURATION_CMD
#define IWM_RFH_GEN_CFG_SERVICE_DMA_SNOOP
#define IWM_RX_INFO_ENERGY_ANT_B_POS
#define IWM_CSR_INT_BIT_HW_ERR
#define IWM_SCD_QUEUE_CFG
#define IWM_TX_STATUS_SUCCESS
static unsigned int IWM_FH_MEM_CBBC_QUEUE(unsigned int chnl)
#define IWM_FH_KW_MEM_ADDR_REG
#define IWM_REPLY_RX_PHY_CMD
#define IWM_DEFAULT_MAX_PROBE_LENGTH
#define IWM_ALWAYS_LONG_GROUP
#define IWM_FH_TSSR_TX_STATUS_REG
#define IWM_FH_RSCSR_CHNL0_WPTR
#define IWM_FH_TCSR_TX_CONFIG_REG_VAL_DMA_CHNL_ENABLE
#define IWM_FH_TFDIB_CTRL1_REG(_chnl)
#define IWM_NVM_SECTION_TYPE_MAC_OVERRIDE
#define IWM_NVM_RF_CFG_DASH_MSK_8000(x)
#define IWM_READ(sc, reg)
#define IWM_TX_CMD_FLG_PROT_REQUIRE
#define IWM_CSR_HW_REV_DASH(_val)
#define IWM_FH_RSCSR_FRAME_ALIGN
#define IWM_CSR_HW_IF_CONFIG_REG_POS_MAC_DASH
#define IWM_FH_MEM_RCSR_CHNL0_CONFIG_REG
#define IWM_CSR_UCODE_SW_BIT_RFKILL
#define IWM_FH_TCSR_CHNL_TX_BUF_STS_REG_POS_TB_NUM
#define IWM_FH_TCSR_TX_CONFIG_REG_VAL_DMA_CREDIT_ENABLE
#define IWM_MAC_PM_POWER_TABLE
#define IWM_FH_RCSR_RX_CONFIG_RBDCB_SIZE_POS
#define IWM_LMPM_CHICK_EXTENDED_ADDR_SPACE
#define IWM_NVM_SECTION_TYPE_PHY_SKU
#define IWM_RFH_Q0_FRBDCB_RIDX
#define IWM_DEFAULT_TX_RETRY
#define IWM_TX_STATUS_DIRECT_DONE
#define IWM_CSR_DRAM_INIT_TBL_WRITE_POINTER
#define IWM_CSR_HW_REV_TYPE_MSK
#define IWM_MAC_CONTEXT_CMD
#define IWM_RX_INFO_ENERGY_ANT_C_MSK
#define IWM_SETBITS(sc, reg, mask)
#define IWM_FH_RSCSR_CHNL0_RBDCB_WPTR_REG
#define IWM_CSR_INT_PERIODIC_REG
#define IWM_CSR_FH_INT_RX_MASK
#define IWM_CSR_RESET_REG_FLAG_SW_RESET
#define IWM_CSR_INT_BIT_RF_KILL
#define IWM_CSR_HW_REV_STEP(_val)
#define IWM_LMPM_SECURE_UCODE_LOAD_CPU2_HDR_ADDR
#define IWM_APMG_PS_CTRL_REG
#define IWM_CSR_GP_CNTRL_REG_FLAG_MAC_CLOCK_READY
#define IWM_SCD_QUEUE_STTS_REG_POS_TXF
#define IWM_NVM_VERSION_8000
#define IWM_FH_RCSR_CHNL0_RX_CONFIG_IRQ_DEST_INT_HOST_VAL
#define IWM_NVM_ACCESS_CMD
#define IWM_LMPM_SECURE_CPU2_HDR_MEM_SPACE
#define IWM_CSR_DRAM_INT_TBL_ENABLE
#define IWM_APMG_PCIDEV_STT_REG
#define IWM_CSR_UCODE_DRV_GP1_CLR
#define IWM_NVM_SECTION_TYPE_SW
#define IWM_NVM_RF_CFG_TYPE_MSK(x)
#define IWM_FW_PHY_CFG_TX_CHAIN
#define IWM_RADIO_CFG_8000
#define IWM_UCODE_TLV_FLAGS_PAN
#define IWM_FW_CMD_ID_AND_COLOR(_id, _color)
#define IWM_FH_MEM_TFDIB_REG1_ADDR_BITSHIFT
#define IWM_SCD_QUEUE_STTS_REG_MSK
#define IWM_FW_PHY_CFG_RADIO_STEP
#define IWM_CSR_FH_INT_TX_MASK
#define IWM_REPLY_BEACON_FILTERING_CMD
#define IWM_NVM_SKU_CAP_BAND_52GHZ
#define IWM_SCAN_ITERATION_COMPLETE_UMAC
#define IWM_APMG_PCIDEV_STT_VAL_L1_ACT_DIS
#define IWM_RATE_54M_PLCP
#define IWM_NVM_LAR_OFFSET_8000
#define IWM_CSR_UCODE_DRV_GP1_BIT_CMD_BLOCKED
#define IWM_CSR_DRAM_INIT_TBL_WRAP_CHECK
#define IWM_CSR_DRAM_INT_TBL_REG
#define IWM_TX_CMD_LIFE_TIME_INFINITE
#define IWM_CSR_HW_IF_CONFIG_REG_POS_PHY_DASH
#define IWM_CSR_HW_IF_CONFIG_REG_MSK_MAC_STEP
#define IWM_CSR_HW_IF_CONFIG_REG_BIT_RADIO_SI
#define IWM_RX_RES_PHY_FLAGS_BAND_24
#define IWM_RFH_RXF_DMA_RBDCB_SIZE_512
#define IWM_TIME_QUOTA_CMD
static unsigned int IWM_SCD_QUEUE_RDPTR(unsigned int chnl)
#define IWM_FH_MEM_TFDIB_DRAM_ADDR_LSB_MSK
#define IWM_TIME_EVENT_CMD
#define IWM_CLRBITS(sc, reg, mask)
#define IWM_UCODE_MINOR(ver)
#define IWM_FH_TCSR_TX_CONFIG_REG_VAL_CIRQ_HOST_ENDTFD
#define IWM_PHY_CONTEXT_CMD
#define IWM_HW_STEP_LOCATION_BITS
#define IWM_FW_MEM_EXTENDED_END
#define IWM_WRITE(sc, reg, val)
#define IWM_RATE_36M_PLCP
#define IWM_NVM_RF_CFG_RX_ANT_MSK_8000(x)
#define IWM_CSR_HW_IF_CONFIG_REG_MSK_PHY_STEP
#define IWM_NVM_RF_CFG_PNUM_MSK_8000(x)
#define IWM_CSR_HW_IF_CONFIG_REG_POS_PHY_STEP
#define IWM_FW_PHY_CFG_RADIO_TYPE
#define IWM_WFMP_MAC_ADDR_1
#define IWM_SCAN_ABORT_UMAC
#define IWM_DTS_MEASUREMENT_NOTIF_WIDE
#define IWM_NVM_RF_CFG_STEP_MSK_8000(x)
#define IWM_MISSED_BEACONS_NOTIFICATION
#define IWM_RFH_Q0_URBD_STTS_WPTR_LSB
#define IWM_NVM_CHANNELS_8000
#define IWM_NVM_SECTION_TYPE_REGULATORY_SDP
#define IWM_SCD_QUEUE_STTS_REG_POS_ACTIVE
#define IWM_RFH_GEN_CFG_RB_CHUNK_SIZE_128
#define IWM_FW_PAGING_BLOCK_CMD
#define IWM_FH_RCSR_CHNL0_RX_IGNORE_RXF_EMPTY
#define IWM_FW_PHY_CFG_RADIO_STEP_POS
#define IWM_DTS_MEASUREMENT_NOTIFICATION
#define IWM_SCD_QUEUE_CTX_REG2_FRAME_LIMIT_MSK
#define IWM_NUM_UCODE_TLV_API
#define IWM_TFD_QUEUE_SIZE_BC_DUP
#define IWM_WFMP_MAC_ADDR_0
#define IWM_TX_CMD_FLG_MH_PAD
#define IWM_CPU1_CPU2_SEPARATOR_SECTION
#define IWM_CSR_HW_IF_CONFIG_REG_POS_PHY_TYPE
#define IWM_FH_TCSR_TX_CONFIG_REG_VAL_DMA_CREDIT_DISABLE
#define IWM_NVM_CHANNEL_IBSS
#define IWM_HOST_INT_OPER_MODE
#define IWM_APMG_CLK_DIS_REG
#define IWM_FH_SRVC_CHNL_SRAM_ADDR_REG(_chnl)
#define IWM_FW_PHY_CFG_TX_CHAIN_POS
#define IWM_FW_MEM_EXTENDED_START
#define IWM_RELEASE_CPU_RESET
#define IWM_MCC_UPDATE_CMD
#define IWM_FH_TCSR_CHNL_TX_BUF_STS_REG(_chnl)
#define IWM_DUMP_TX_FIFO_FLUSH
#define IWM_RFH_RXF_RXQ_ACTIVE
#define IWM_RX_INFO_ENERGY_ANT_C_POS
#define IWM_UCODE_TLV_CAPA_LAR_MULTI_MCC
#define IWM_NVM_SECTION_TYPE_CALIBRATION
#define IWM_SCD_QUEUE_CTX_REG2_WIN_SIZE_POS
#define IWM_CSR_HW_IF_CONFIG_REG_MSK_MAC_DASH
#define IWM_RFH_DMA_EN_ENABLE_VAL
#define IWM_RATE_11M_PLCP
#define IWM_RATE_MCS_ANT_B_MSK
#define IWM_MAC_ADDRESS_OVERRIDE_8000
#define IWM_SCD_QUEUE_STTS_REG_POS_WSL
#define IWM_FW_CTXT_INVALID
#define IWM_RFH_RXF_DMA_RB_SIZE_4K
#define IWM_SCD_QUEUE_CTX_REG2_WIN_SIZE_MSK
#define IWM_SCD_CONTEXT_QUEUE_OFFSET(x)
#define IWM_CALIB_RES_NOTIF_PHY_DB
#define IWM_TX_STATUS_FAIL_LONG_LIMIT
#define IWM_MFUART_LOAD_NOTIFICATION
#define IWM_RFH_Q0_FRBDCB_BA_LSB
#define IWM_RX_INFO_ENERGY_ANT_A_POS
#define IWM_FH_MEM_TB_MAX_LENGTH
#define IWM_UCODE_TLV_CAPA_LAR_SUPPORT_V2
#define IWM_FH_RCSR_RX_CONFIG_REG_VAL_RB_SIZE_4K
#define IWM_SCAN_OFFLOAD_COMPLETE
#define IWM_TX_STATUS_FAIL_SHORT_LIMIT
#define IWM_FH_RCSR_RX_CONFIG_CHNL_EN_ENABLE_VAL
#define IWM_FW_PHY_CFG_RADIO_TYPE_POS
#define IWM_CSR_INT_PERIODIC_DIS
#define IWM_SB_CPU_1_STATUS
#define IWM_NVM_LAR_ENABLED_8000
#define IWM_RX_RB_TIMEOUT
#define IWM_CSR_MAC_SHADOW_REG_CTRL
#define IWM_SCD_GP_CTRL_ENABLE_31_QUEUES
#define IWM_TX_CMD_FLG_STA_RATE
#define IWM_SCAN_COMPLETE_UMAC
#define IWM_APMG_CLK_VAL_DMA_CLK_RQT
static uint8_t iwm_get_dma_hi_addr(bus_addr_t addr)
#define IWM_MCC_SOURCE_GET_CURRENT
#define IWM_DEBUG_LOG_MSG
#define IWM_RFH_RXF_DMA_CFG
@ IWM_UCODE_TLV_SEC_WOWLAN
@ IWM_UCODE_TLV_FW_VERSION
@ IWM_UCODE_TLV_DEF_CALIB
@ IWM_UCODE_TLV_PROBE_MAX_LEN
@ IWM_UCODE_TLV_SDIO_ADMA_ADDR
@ IWM_UCODE_TLV_CMD_VERSIONS
@ IWM_UCODE_TLV_N_SCAN_CHANNELS
@ IWM_UCODE_TLV_FW_MEM_SEG
@ IWM_UCODE_TLV_NUM_OF_CPU
@ IWM_UCODE_TLV_FW_GSCAN_CAPA
@ IWM_UCODE_TLV_ENABLED_CAPABILITIES
@ IWM_UCODE_TLV_API_CHANGES_SET
@ IWM_UCODE_TLV_SEC_RT_USNIFFER
#define IWM_SCD_CHAINEXT_EN
#define IWM_NVM_CHANNEL_VALID
#define IWM_CSR_INT_BIT_ALIVE
#define IWM_FW_PHY_CFG_RADIO_DASH
#define IWM_SCAN_OFFLOAD_REQUEST_CMD
#define IWM_CSR_INT_BIT_FH_TX
#define IWM_FH_TCSR_CHNL_NUM
#define IWM_PHY_INFO_FLAG_SHPREAMBLE
#define IWM_FH_TSSR_TX_STATUS_REG_MSK_CHNL_IDLE(_chnl)
#define IWM_NVM_RF_CFG_TX_ANT_MSK_8000(x)
#define IWM_RX_INFO_ENERGY_ANT_B_MSK
#define IWM_RX_MPDU_MFLG2_PAD
#define IWM_NVM_CHANNEL_RADAR
#define IWM_SCAN_OFFLOAD_PROBE_REQ_SIZE
#define IWM_TX_CMD_FLG_ACK
#define IWM_STATISTICS_NOTIFICATION
#define IWM_UCODE_TLV_CAPA_UMAC_SCAN
#define IWM_SCD_CONTEXT_MEM_LOWER_BOUND
#define IWM_CSR_INT_BIT_SCD
#define IWM_SCD_QUEUE_STTS_REG_POS_SCD_ACT_EN
#define IWM_SB_CPU_2_STATUS
#define IWM_LQ_FLAG_USE_RTS_MSK
#define IWM_RX_MPDU_RES_STATUS_OVERRUN_OK
#define IWM_POWER_TABLE_CMD
#define IWM_RELEASE_CPU_RESET_BIT
#define IWM_MCC_SOURCE_OLD_FW
#define IWM_RATE_MCS_CCK_MSK
#define IWM_CSR_INT_BIT_FH_RX
#define IWM_FH_MEM_RCSR_CHNL0_FLUSH_RB_REQ
#define IWM_CSR_INT_BIT_SW_RX
#define IWM_CSR_GP_CNTRL_REG_FLAG_INIT_DONE
#define IWM_FH_TX_CHICKEN_BITS_SCD_AUTO_RETRY_EN
#define IWM_TFD_QUEUE_SIZE_MAX
#define IWM_SCAN_OFFLOAD_ABORT_CMD
#define IWM_WRITE_1(sc, reg, val)
#define IWM_REPLY_THERMAL_MNG_BACKOFF
#define IWM_RFH_RXF_DMA_DROP_TOO_LARGE_MASK
#define IWM_NVM_SKU_CAP_BAND_24GHZ
#define IWM_CSR_INI_SET_MASK
#define IWM_TX_CMD_FLG_BT_DIS
#define IWM_RX_MPDU_PHY_SHORT_PREAMBLE
#define IWM_INIT_COMPLETE_NOTIF
#define IWM_FH_TCSR_CHNL_TX_CONFIG_REG(_chnl)
#define IWM_CSR_INT_BIT_RX_PERIODIC
#define IWM_SCAN_REQ_UMAC
static uint32_t iwm_rx_packet_payload_len(const struct iwm_rx_packet *pkt)
#define IWM_RFH_Q0_FRBDCB_WIDX
#define IWM_RFH_Q0_URBDCB_BA_LSB
#define IWM_CSR_HW_IF_CONFIG_REG_POS_MAC_STEP
#define IWM_RFH_GEN_CFG_RFH_DMA_SNOOP
#define IWM_FH_TCSR_CHNL_TX_BUF_STS_REG_VAL_TFDB_VALID
#define IWM_N_HW_ADDRS_8000
#define IWM_FH_TCSR_CHNL_TX_BUF_STS_REG_POS_TB_IDX
#define IWM_REPLY_RX_MPDU_CMD
static unsigned int IWM_SCD_QUEUE_STATUS_BITS(unsigned int chnl)
#define IWM_UCODE_TLV_API_WIFI_MCC_UPDATE
#define IWM_CSR_HW_IF_CONFIG_REG
#define IWM_HOST_INT_TIMEOUT_DEF
#define IWM_NVM_RF_CFG_STEP_MSK(x)
#define IWM_CSR_INT_COALESCING
#define IWM_SCD_GP_CTRL_AUTO_ACTIVE_MODE
#define IWM_NUM_UCODE_TLV_CAPA
#define IWM_FH_MEM_RCSR_CHNL0_RBDCB_WPTR
#define IWM_TX_ANT_CONFIGURATION_CMD
#define IWM_RATE_24M_PLCP
#define IWM_RATE_MCS_ANT_POS
#define IWM_CSR_HW_IF_CONFIG_REG_MSK_PHY_DASH
#define le16_to_cpup(_a_)
#define IWM_FW_PHY_CFG_RX_CHAIN
#define IWM_NVM_NUM_OF_SECTIONS
#define IWM_NVM_RF_CFG_TYPE_MSK_8000(x)
#define IWM_CSR_HW_REV_TYPE_7265D
#define IWM_WFPM_CTRL_REG
#define IWM_TX_CMD_OFFLD_PAD
#define IWM_RFH_RXF_DMA_MIN_RB_4_8
#define IWM_SCD_SRAM_BASE_ADDR
#define IWM_FH_RSCSR_CHNL0_RBDCB_BASE_REG
#define IWM_CSR_INT_BIT_SW_ERR
#define IWM_TX_CMD_FLG_SEQ_CTL
#define IWM_RX_QUEUE_SIZE_LOG
#define IWM_LTR_CFG_FLAG_FEATURE_ENABLE
#define IWM_TLV_UCODE_MAGIC
#define IWM_MCAST_FILTER_CMD
#define IWM_TIME_EVENT_NOTIFICATION
static uint32_t iwm_rx_packet_len(const struct iwm_rx_packet *pkt)
#define IWM_NVM_RF_CFG_PNUM_MSK(x)
#define IWM_RATE_18M_PLCP
#define IWM_UCODE_API(ver)
#define IWM_PHY_OPS_GROUP
#define IWM_RATE_MCS_ANT_A_MSK
#define IWM_RFH_GEN_CFG_RB_CHUNK_SIZE_64
#define IWM_CSR_HW_IF_CONFIG_REG_BIT_MAC_SI
#define IWM_SCD_QUEUE_CTX_REG2_FRAME_LIMIT_POS
#define IWM_SCD_TRANS_TBL_MEM_UPPER_BOUND
#define IWM_TX_STATUS_FAIL_LIFE_EXPIRE
#define IWM_UCODE_MAJOR(ver)
#define IWM_RFH_Q0_FRBDCB_WIDX_TRG
#define IWM_MCC_CHUB_UPDATE_CMD
#define IWM_NVM_CHANNEL_ACTIVE
#define IWM_PAGING_SEPARATOR_SECTION
#define IWM_FH_TCSR_TX_CONFIG_REG_VAL_DMA_CHNL_PAUSE
#define IWM_RTS_DFAULT_RETRY_LIMIT
#define IWM_SCAN_ITERATION_COMPLETE
#define IWM_RX_MPDU_RES_STATUS_CRC_OK
#define IWM_NVM_SECTION_TYPE_REGULATORY
#define IWM_APMG_PS_CTRL_EARLY_PWR_OFF_RESET_DIS
#define IWM_ALIVE_STATUS_OK
#define IWM_BINDING_CONTEXT_CMD
#define IWM_RX_INFO_ENERGY_ANT_ABC_IDX
#define IWM_FH_TFDIB_CTRL0_REG(_chnl)
#define IWM_REPLY_SF_CFG_CMD
#define IWM_UCODE_TLV_CAPA_LAR_SUPPORT
#define IWM_RX_INFO_ENERGY_ANT_A_MSK
#define IWM_FW_PHY_CFG_RADIO_DASH_POS
#define IWM_HBUS_TARG_WRPTR
#define IWM_CSR_HW_IF_CONFIG_REG_MSK_PHY_TYPE
#define IWM_RFH_Q0_URBDCB_WIDX
#define IWM_CSR_GP_CNTRL_REG_FLAG_MAC_ACCESS_REQ
#define IWM_TX_STATUS_MSK
#define IWM_NVM_RF_CFG_DASH_MSK(x)
#define IWM_FH_RSCSR_FRAME_INVALID
#define IWM_RATE_12M_PLCP
#define IWM_CSR_INT_PERIODIC_ENA
#define IWM_NVM_LAR_OFFSET_8000_OLD
#define IWM_WIDE_ID(grp, opcode)
#define IWM_BT_COEX_HIGH_BAND_RET
#define IWM_FW_PHY_CFG_RX_CHAIN_POS
#define le32_to_cpup(_a_)
#define IWM_RATE_48M_PLCP
#define IWM_FH_UCODE_LOAD_STATUS
#define IWM_FH_RSCSR_CHNL0_STTS_WPTR_REG
#define IWM_FH_RSCSR_CHNL0_RDPTR
#define IWM_RX_RADIOTAP_PRESENT
#define IWM_RX_LEGACY_RING_COUNT
#define IWM_TX_RADIOTAP_PRESENT
#define IWM_FLAG_SCANNING
#define IWM_LOCK_DESTROY(_sc)
#define IWM_TX_RING_COUNT
#define IWM_DEFAULT_COLOR
#define IWM_DEFAULT_MACID
#define IWM_RX_MQ_RING_COUNT
#define IWM_TX_RING_HIMARK
#define IWM_TE_SESSION_PROTECTION_MAX_TIME_MS
#define IWM_TX_RING_LOMARK
@ IWM_UCODE_REGULAR_USNIFFER
#define IWM_LOCK_INIT(_sc)
static bool iwm_fw_has_capa(struct iwm_softc *sc, unsigned int capa)
#define IWM_NUM_CHANNELS_8000
#define IWM_FLAG_SCAN_RUNNING
#define IWM_FLAG_HW_INITED
static bool iwm_fw_has_api(struct iwm_softc *sc, unsigned int api)
#define IWM_ICT_PADDR_SHIFT
#define IWM_UCODE_SECTION_MAX
uint16_t tfd_offset[IWM_TFD_QUEUE_BC_SIZE]
struct iwm_lmac_alive lmac_data
struct iwm_umac_alive umac_data
struct iwm_lmac_alive lmac_data[2]
struct iwm_umac_alive umac_data
enum iwm_nvm_type nvm_type
enum iwm_device_family device_family
int host_interrupt_operation_mode
uint8_t nvm_hw_section_num
struct iwm_cmd_header hdr
uint8_t data[IWM_DEF_CMD_PAYLOAD_SIZE]
const struct iwm_cfg * cfg
struct iwm_fw_cipher_scheme cs[]
struct iwm_fw_desc sec[IWM_UCODE_SECTION_MAX]
struct iwm_ucode_capabilities ucode_capa
const struct firmware * fw_fp
struct iwm_fw_img img[IWM_UCODE_TYPE_MAX]
struct iwm_rx_packet * resp_pkt
uint16_t len[IWM_MAX_CMD_TBS_PER_TFD]
const void * data[IWM_MAX_CMD_TBS_PER_TFD]
uint32_t error_event_table_ptr
uint32_t log_event_table_ptr
uint8_t dual_stream_ant_msk
uint32_t rs_table[IWM_LQ_MAX_RETRY_NUM]
uint8_t single_stream_ant_msk
uint32_t consec_missed_beacons_since_last_rx
uint32_t consec_missed_beacons
uint32_t num_expected_beacons
uint32_t num_recvd_beacons
struct ieee80211_node in_ni
struct iwm_statistics_rx rx
int sku_cap_band_52GHz_enable
int sku_cap_band_24GHz_enable
uint8_t hw_addr[IEEE80211_ADDR_LEN]
struct iwm_calib_ctrl calib_control
struct ieee80211_channel * channel
struct iwm_rx_mpdu_desc_v1 v1
struct iwm_cmd_header hdr
uint32_t system_timestamp
uint32_t non_cfg_phy[IWM_RX_INFO_PHY_CNT]
struct iwm_dma_info free_desc_dma
struct iwm_dma_info used_desc_dma
struct iwm_dma_info stat_dma
struct iwm_rx_data data[512]
struct iwm_rb_status * stat
uint32_t umac_error_event_table
struct iwm_tlv_calib_ctrl sc_default_calib[IWM_UCODE_TYPE_MAX]
struct iwm_tx_radiotap_header sc_txtap
uint32_t error_event_table[2]
struct task sc_rftoggle_task
enum iwm_sf_state sf_state
struct iwm_dma_info kw_dma
enum iwm_ucode_type cur_ucode
boolean_t last_ebs_successful
struct iwm_tx_ring txq[IWM_MAX_QUEUES]
struct iwm_rx_radiotap_header sc_rxtap
struct iwm_dma_info ict_dma
struct callout sc_watchdog_to
struct ieee80211_ratectl_tx_status sc_txs
struct iwm_dma_info sched_dma
struct iwm_phy_ctxt sc_phyctxt[IWM_NUM_PHY_CTX]
struct iwm_dma_info fw_dma
const struct iwm_cfg * cfg
uint8_t sc_cmd_resp[IWM_CMD_RESP_MAX]
struct iwm_nvm_data * nvm_data
struct iwm_phy_db * sc_phy_db
struct iwm_notif_wait_data * sc_notif_wait
struct iwm_notif_statistics sc_stats
struct intr_config_hook sc_preinit_hook
struct ieee80211com sc_ic
struct iwm_rx_phy_info sc_last_phy_info
struct callout sc_led_blink_to
uint32_t beacon_silence_rssi[3]
struct iwm_statistics_rx_non_phy general
struct iwm_tfd_tb tbs[IWM_NUM_OF_TBS]
struct iwm_time_quota_data_v1 quotas[IWM_MAX_BINDINGS]
struct iwm_tlv_calib_ctrl calib
uint16_t pm_frame_timeout
uint8_t initial_rate_index
uint16_t wireless_media_time
struct iwm_agg_tx_status status
struct iwm_dma_info desc_dma
struct iwm_tx_data data[IWM_TX_RING_COUNT]
struct iwm_device_cmd * cmd
struct iwm_dma_info cmd_dma
uint32_t max_probe_length
uint8_t enabled_capa[howmany(IWM_NUM_UCODE_TLV_CAPA, NBBY)]
uint8_t enabled_api[howmany(IWM_NUM_UCODE_TLV_API, NBBY)]
struct iwm_phy_ctxt * phy_ctxt
struct ieee80211vap iv_vap
struct iwm_vap::@32 queue_params[WME_NUM_AC]
int(* iv_newstate)(struct ieee80211vap *, enum ieee80211_state, int)