Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge tag 'iwlwifi-next-2025-10-28' of https://git.kernel.org/pub/scm/linux/kernel/git/iwlwifi/iwlwifi-next

Miri Korenblit says:
====================
iwlwifi features. Notably:

- Unsupported APIs cleanup
- New sniffer API
- small bugfixes and features
====================

Link: https://patch.msgid.link/DM3PPF63A6024A9B77EE7385B4C865E3E54A3FDA@DM3PPF63A6024A9.namprd11.prod.outlook.com
Signed-off-by: Johannes Berg <johannes.berg@intel.com>

+1874 -1409
-1
drivers/net/wireless/intel/iwlwifi/cfg/22000.c
··· 38 38 .features = IWL_TX_CSUM_NETIF_FLAGS | NETIF_F_RXCSUM, 39 39 .apmg_not_supported = true, 40 40 .mac_addr_from_csr = 0x380, 41 - .min_umac_error_event_table = 0x400000, 42 41 .d3_debug_data_base_addr = 0x401000, 43 42 .d3_debug_data_length = 60 * 1024, 44 43 .mon_smem_regs = {
-1
drivers/net/wireless/intel/iwlwifi/cfg/8000.c
··· 50 50 .smem_offset = IWL8260_SMEM_OFFSET, 51 51 .smem_len = IWL8260_SMEM_LEN, 52 52 .apmg_not_supported = true, 53 - .min_umac_error_event_table = 0x800000, 54 53 }; 55 54 56 55 static const struct iwl_tt_params iwl8000_tt_params = {
-1
drivers/net/wireless/intel/iwlwifi/cfg/9000.c
··· 41 41 .features = IWL_TX_CSUM_NETIF_FLAGS | NETIF_F_RXCSUM, 42 42 .apmg_not_supported = true, 43 43 .mac_addr_from_csr = 0x380, 44 - .min_umac_error_event_table = 0x800000, 45 44 .d3_debug_data_base_addr = 0x401000, 46 45 .d3_debug_data_length = 92 * 1024, 47 46 .nvm_hw_section_num = 10,
-1
drivers/net/wireless/intel/iwlwifi/cfg/ax210.c
··· 33 33 .features = IWL_TX_CSUM_NETIF_FLAGS | NETIF_F_RXCSUM, 34 34 .apmg_not_supported = true, 35 35 .mac_addr_from_csr = 0x380, 36 - .min_umac_error_event_table = 0x400000, 37 36 .d3_debug_data_base_addr = 0x401000, 38 37 .d3_debug_data_length = 60 * 1024, 39 38 .mon_smem_regs = {
+2 -2
drivers/net/wireless/intel/iwlwifi/cfg/bz.c
··· 10 10 #include "fw/api/txq.h" 11 11 12 12 /* Highest firmware core release supported */ 13 - #define IWL_BZ_UCODE_CORE_MAX 99 13 + #define IWL_BZ_UCODE_CORE_MAX 101 14 14 15 15 /* Lowest firmware API version supported */ 16 16 #define IWL_BZ_UCODE_API_MIN 100 ··· 38 38 .smem_len = IWL_BZ_SMEM_LEN, 39 39 .apmg_not_supported = true, 40 40 .mac_addr_from_csr = 0x30, 41 - .min_umac_error_event_table = 0xD0000, 42 41 .d3_debug_data_base_addr = 0x401000, 43 42 .d3_debug_data_length = 60 * 1024, 44 43 .mon_smem_regs = { ··· 89 90 .low_latency_xtal = true, 90 91 .ltr_delay = IWL_CFG_TRANS_LTR_DELAY_2500US, 91 92 }; 93 + EXPORT_SYMBOL_IF_IWLWIFI_KUNIT(iwl_bz_mac_cfg); 92 94 93 95 const struct iwl_mac_cfg iwl_gl_mac_cfg = { 94 96 .device_family = IWL_DEVICE_FAMILY_BZ,
+1 -2
drivers/net/wireless/intel/iwlwifi/cfg/dr.c
··· 9 9 #include "fw/api/txq.h" 10 10 11 11 /* Highest firmware core release supported */ 12 - #define IWL_DR_UCODE_CORE_MAX 99 12 + #define IWL_DR_UCODE_CORE_MAX 101 13 13 14 14 /* Lowest firmware API version supported */ 15 15 #define IWL_DR_UCODE_API_MIN 100 ··· 33 33 .smem_len = IWL_DR_SMEM_LEN, 34 34 .apmg_not_supported = true, 35 35 .mac_addr_from_csr = 0x30, 36 - .min_umac_error_event_table = 0xD0000, 37 36 .d3_debug_data_base_addr = 0x401000, 38 37 .d3_debug_data_length = 60 * 1024, 39 38 .mon_smem_regs = {
+1
drivers/net/wireless/intel/iwlwifi/cfg/rf-fm.c
··· 19 19 .non_shared_ant = ANT_B, \ 20 20 .vht_mu_mimo_supported = true, \ 21 21 .uhb_supported = true, \ 22 + .eht_supported = true, \ 22 23 .num_rbds = IWL_NUM_RBDS_EHT, \ 23 24 .nvm_ver = IWL_FM_NVM_VERSION, \ 24 25 .nvm_type = IWL_NVM_EXT
+1
drivers/net/wireless/intel/iwlwifi/cfg/rf-pe.c
··· 12 12 "Killer(R) Wi-Fi 8 BN1850i 320MHz Wireless Network Adapter (BN201.NGW)"; 13 13 14 14 const char iwl_bn201_name[] = "Intel(R) Wi-Fi 8 BN201"; 15 + const char iwl_bn203_name[] = "Intel(R) Wi-Fi 8 BN203"; 15 16 const char iwl_be221_name[] = "Intel(R) Wi-Fi 7 BE221"; 16 17 const char iwl_be223_name[] = "Intel(R) Wi-Fi 7 BE223";
+24
drivers/net/wireless/intel/iwlwifi/cfg/rf-wh.c
··· 4 4 */ 5 5 #include "iwl-config.h" 6 6 7 + /* NVM versions */ 8 + #define IWL_WH_NVM_VERSION 0x0a1d 9 + 10 + #define IWL_DEVICE_WH \ 11 + .ht_params = { \ 12 + .stbc = true, \ 13 + .ldpc = true, \ 14 + .ht40_bands = BIT(NL80211_BAND_2GHZ) | \ 15 + BIT(NL80211_BAND_5GHZ), \ 16 + }, \ 17 + .led_mode = IWL_LED_RF_STATE, \ 18 + .non_shared_ant = ANT_B, \ 19 + .vht_mu_mimo_supported = true, \ 20 + .uhb_supported = true, \ 21 + .num_rbds = IWL_NUM_RBDS_EHT, \ 22 + .nvm_ver = IWL_WH_NVM_VERSION, \ 23 + .nvm_type = IWL_NVM_EXT 24 + 7 25 /* currently iwl_rf_wh/iwl_rf_wh_160mhz are just defines for the FM ones */ 26 + 27 + const struct iwl_rf_cfg iwl_rf_wh_non_eht = { 28 + IWL_DEVICE_WH, 29 + .eht_supported = false, 30 + }; 8 31 9 32 const char iwl_killer_be1775s_name[] = 10 33 "Killer(R) Wi-Fi 7 BE1775s 320MHz Wireless Network Adapter (BE211D2W)"; ··· 36 13 37 14 const char iwl_be211_name[] = "Intel(R) Wi-Fi 7 BE211 320MHz"; 38 15 const char iwl_be213_name[] = "Intel(R) Wi-Fi 7 BE213 160MHz"; 16 + const char iwl_ax221_name[] = "Intel(R) Wi-Fi 6E AX221 160MHz";
+1 -2
drivers/net/wireless/intel/iwlwifi/cfg/sc.c
··· 10 10 #include "fw/api/txq.h" 11 11 12 12 /* Highest firmware core release supported */ 13 - #define IWL_SC_UCODE_CORE_MAX 99 13 + #define IWL_SC_UCODE_CORE_MAX 101 14 14 15 15 /* Lowest firmware API version supported */ 16 16 #define IWL_SC_UCODE_API_MIN 100 ··· 41 41 .smem_len = IWL_SC_SMEM_LEN, 42 42 .apmg_not_supported = true, 43 43 .mac_addr_from_csr = 0x30, 44 - .min_umac_error_event_table = 0xD0000, 45 44 .d3_debug_data_base_addr = 0x401000, 46 45 .d3_debug_data_length = 60 * 1024, 47 46 .mon_smem_regs = {
+1
drivers/net/wireless/intel/iwlwifi/fw/acpi.h
··· 151 151 * @mcc: output buffer (3 bytes) that will get the MCC 152 152 * 153 153 * This function tries to read the current MCC from ACPI if available. 154 + * Return: 0 on success, or a negative error code 154 155 */ 155 156 int iwl_acpi_get_mcc(struct iwl_fw_runtime *fwrt, char *mcc); 156 157
+1 -1
drivers/net/wireless/intel/iwlwifi/fw/api/alive.h
··· 88 88 __le32 enabled; 89 89 } __packed; /* IMR_ALIVE_INFO_API_S_VER_1 */ 90 90 91 - struct iwl_alive_ntf_v6 { 91 + struct iwl_alive_ntf_v7 { 92 92 __le16 status; 93 93 __le16 flags; 94 94 struct iwl_lmac_alive lmac_data[2];
+2 -2
drivers/net/wireless/intel/iwlwifi/fw/api/cmdhdr.h
··· 1 1 /* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ 2 2 /* 3 - * Copyright (C) 2005-2014 Intel Corporation 3 + * Copyright (C) 2005-2014, 2025 Intel Corporation 4 4 * Copyright (C) 2013-2015 Intel Mobile Communications GmbH 5 5 * Copyright (C) 2016-2017 Intel Deutschland GmbH 6 6 */ ··· 98 98 } __packed; 99 99 100 100 /** 101 - * struct iwl_cmd_header_wide 101 + * struct iwl_cmd_header_wide - wide command header 102 102 * 103 103 * This header format appears in the beginning of each command sent from the 104 104 * driver, and each response/notification received from uCode.
+2 -2
drivers/net/wireless/intel/iwlwifi/fw/api/coex.h
··· 1 1 /* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ 2 2 /* 3 - * Copyright (C) 2023-2024 Intel Corporation 3 + * Copyright (C) 2023-2025 Intel Corporation 4 4 * Copyright (C) 2013-2014, 2018-2019 Intel Corporation 5 5 * Copyright (C) 2013-2014 Intel Mobile Communications GmbH 6 6 * Copyright (C) 2017 Intel Deutschland GmbH ··· 52 52 } __packed; /* BT_COEX_CMD_API_S_VER_6 */ 53 53 54 54 /** 55 - * struct iwl_bt_coex_reduced_txp_update_cmd 55 + * struct iwl_bt_coex_reduced_txp_update_cmd - reduced TX power command 56 56 * @reduced_txp: bit BT_REDUCED_TX_POWER_BIT to enable / disable, rest of the 57 57 * bits are the sta_id (value) 58 58 */
+1 -1
drivers/net/wireless/intel/iwlwifi/fw/api/commands.h
··· 60 60 * @UCODE_ALIVE_NTFY: 61 61 * Alive data from the firmware, as described in 62 62 * &struct iwl_alive_ntf_v3 or &struct iwl_alive_ntf_v4 or 63 - * &struct iwl_alive_ntf_v5 or &struct iwl_alive_ntf_v6. 63 + * &struct iwl_alive_ntf_v5 or &struct iwl_alive_ntf_v7. 64 64 */ 65 65 UCODE_ALIVE_NTFY = 0x1, 66 66
+5
drivers/net/wireless/intel/iwlwifi/fw/api/datapath.h
··· 124 124 BEACON_FILTER_IN_NOTIF = 0xF8, 125 125 126 126 /** 127 + * @PHY_AIR_SNIFFER_NOTIF: &struct iwl_rx_phy_air_sniffer_ntfy 128 + */ 129 + PHY_AIR_SNIFFER_NOTIF = 0xF9, 130 + 131 + /** 127 132 * @STA_PM_NOTIF: &struct iwl_mvm_pm_state_notification 128 133 */ 129 134 STA_PM_NOTIF = 0xFD,
+7 -7
drivers/net/wireless/intel/iwlwifi/fw/api/dbg-tlv.h
··· 16 16 #define IWL_FW_INI_PRESET_DISABLE 0xff 17 17 18 18 /** 19 - * struct iwl_fw_ini_hcmd 19 + * struct iwl_fw_ini_hcmd - debug configuration host command 20 20 * 21 21 * @id: the debug configuration command type for instance: 0xf6 / 0xf5 / DHC 22 22 * @group: the desired cmd group ··· 199 199 } __packed; /* FW_TLV_DEBUG_REGION_API_S_VER_1 */ 200 200 201 201 /** 202 - * struct iwl_fw_ini_debug_info_tlv 202 + * struct iwl_fw_ini_debug_info_tlv - debug info TLV 203 203 * 204 204 * debug configuration name for a specific image 205 205 * ··· 311 311 } __packed; /* FW_TLV_DEBUG_CONFIG_SET_API_S_VER_1 */ 312 312 313 313 /** 314 - * enum iwl_fw_ini_config_set_type 314 + * enum iwl_fw_ini_config_set_type - configuration set type 315 315 * 316 316 * @IWL_FW_INI_CONFIG_SET_TYPE_INVALID: invalid config set 317 317 * @IWL_FW_INI_CONFIG_SET_TYPE_DEVICE_PERIPHERY_MAC: for PERIPHERY MAC configuration ··· 337 337 } __packed; 338 338 339 339 /** 340 - * enum iwl_fw_ini_allocation_id 340 + * enum iwl_fw_ini_allocation_id - allocation ID 341 341 * 342 342 * @IWL_FW_INI_ALLOCATION_INVALID: invalid 343 343 * @IWL_FW_INI_ALLOCATION_ID_DBGC1: allocation meant for DBGC1 configuration ··· 356 356 }; /* FW_DEBUG_TLV_ALLOCATION_ID_E_VER_1 */ 357 357 358 358 /** 359 - * enum iwl_fw_ini_buffer_location 359 + * enum iwl_fw_ini_buffer_location - buffer location 360 360 * 361 361 * @IWL_FW_INI_LOCATION_INVALID: invalid 362 362 * @IWL_FW_INI_LOCATION_SRAM_PATH: SRAM location ··· 373 373 }; /* FW_DEBUG_TLV_BUFFER_LOCATION_E_VER_1 */ 374 374 375 375 /** 376 - * enum iwl_fw_ini_region_type 376 + * enum iwl_fw_ini_region_type - region type 377 377 * 378 378 * @IWL_FW_INI_REGION_INVALID: invalid 379 379 * @IWL_FW_INI_REGION_TLV: uCode and debug TLVs ··· 437 437 }; /* FW_TLV_DEBUG_REGION_DEVICE_MEMORY_SUBTYPE_API_E */ 438 438 439 439 /** 440 - * enum iwl_fw_ini_time_point 440 + * enum iwl_fw_ini_time_point - time point type 441 441 * 442 442 * Hard coded time points in which the driver can send hcmd or perform dump 443 443 * collection
+1 -1
drivers/net/wireless/intel/iwlwifi/fw/api/debug.h
··· 421 421 } __packed; /* INIT_DRAM_FRAGS_ALLOCATIONS_S_VER_1 */ 422 422 423 423 /** 424 - * struct iwl_dbg_host_event_cfg_cmd 424 + * struct iwl_dbg_host_event_cfg_cmd - host event config command 425 425 * @enabled_severities: enabled severities 426 426 */ 427 427 struct iwl_dbg_host_event_cfg_cmd {
+4 -4
drivers/net/wireless/intel/iwlwifi/fw/api/location.h
··· 1092 1092 } __packed; /* LOCATION_RANGE_REQ_AP_ENTRY_CMD_API_S_VER_9 */ 1093 1093 1094 1094 /** 1095 - * enum iwl_tof_response_mode 1095 + * enum iwl_tof_response_mode - TOF response mode 1096 1096 * @IWL_MVM_TOF_RESPONSE_ASAP: report each AP measurement separately as soon as 1097 1097 * possible (not supported for this release) 1098 1098 * @IWL_MVM_TOF_RESPONSE_TIMEOUT: report all AP measurements as a batch upon ··· 1108 1108 }; 1109 1109 1110 1110 /** 1111 - * enum iwl_tof_initiator_flags 1111 + * enum iwl_tof_initiator_flags - TOF initiator flags 1112 1112 * 1113 1113 * @IWL_TOF_INITIATOR_FLAGS_FAST_ALGO_DISABLED: disable fast algo, meaning run 1114 1114 * the algo on ant A+B, instead of only one of them. ··· 1409 1409 }; 1410 1410 1411 1411 /** 1412 - * enum iwl_tof_entry_status 1412 + * enum iwl_tof_entry_status - TOF entry status 1413 1413 * 1414 1414 * @IWL_TOF_ENTRY_SUCCESS: successful measurement. 1415 1415 * @IWL_TOF_ENTRY_GENERAL_FAILURE: General failure. ··· 1856 1856 } __packed; 1857 1857 1858 1858 /** 1859 - * struct iwl_tof_range_abort_cmd 1859 + * struct iwl_tof_range_abort_cmd - TOF range abort command 1860 1860 * @request_id: corresponds to a range request 1861 1861 * @reserved: reserved 1862 1862 */
+7 -127
drivers/net/wireless/intel/iwlwifi/fw/api/nvm-reg.h
··· 18 18 19 19 /** 20 20 * @LARI_CONFIG_CHANGE: &struct iwl_lari_config_change_cmd_v1, 21 - * &struct iwl_lari_config_change_cmd_v2, 22 - * &struct iwl_lari_config_change_cmd_v3, 23 - * &struct iwl_lari_config_change_cmd_v4, 24 - * &struct iwl_lari_config_change_cmd_v5, 25 21 * &struct iwl_lari_config_change_cmd_v6, 26 - * &struct iwl_lari_config_change_cmd_v7, 27 - * &struct iwl_lari_config_change_cmd_v10 or 22 + * &struct iwl_lari_config_change_cmd_v8, 28 23 * &struct iwl_lari_config_change_cmd 29 24 */ 30 25 LARI_CONFIG_CHANGE = 0x1, ··· 560 565 } __packed; /* LARI_CHANGE_CONF_CMD_S_VER_1 */ 561 566 562 567 /** 563 - * struct iwl_lari_config_change_cmd_v2 - change LARI configuration 564 - * @config_bitmap: bit map of the config commands. each bit will trigger a 565 - * different predefined FW config operation 566 - * @oem_uhb_allow_bitmap: bitmap of UHB enabled MCC sets 567 - */ 568 - struct iwl_lari_config_change_cmd_v2 { 569 - __le32 config_bitmap; 570 - __le32 oem_uhb_allow_bitmap; 571 - } __packed; /* LARI_CHANGE_CONF_CMD_S_VER_2 */ 572 - 573 - /** 574 - * struct iwl_lari_config_change_cmd_v3 - change LARI configuration 575 - * @config_bitmap: bit map of the config commands. each bit will trigger a 576 - * different predefined FW config operation 577 - * @oem_uhb_allow_bitmap: bitmap of UHB enabled MCC sets 578 - * @oem_11ax_allow_bitmap: bitmap of 11ax allowed MCCs. 579 - * For each supported country, a pair of regulatory override bit and 11ax mode exist 580 - * in the bit field. 581 - */ 582 - struct iwl_lari_config_change_cmd_v3 { 583 - __le32 config_bitmap; 584 - __le32 oem_uhb_allow_bitmap; 585 - __le32 oem_11ax_allow_bitmap; 586 - } __packed; /* LARI_CHANGE_CONF_CMD_S_VER_3 */ 587 - 588 - /** 589 - * struct iwl_lari_config_change_cmd_v4 - change LARI configuration 590 - * @config_bitmap: Bitmap of the config commands. Each bit will trigger a 591 - * different predefined FW config operation. 592 - * @oem_uhb_allow_bitmap: Bitmap of UHB enabled MCC sets. 593 - * @oem_11ax_allow_bitmap: Bitmap of 11ax allowed MCCs. There are two bits 594 - * per country, one to indicate whether to override and the other to 595 - * indicate the value to use. 596 - * @oem_unii4_allow_bitmap: Bitmap of unii4 allowed MCCs.There are two bits 597 - * per country, one to indicate whether to override and the other to 598 - * indicate allow/disallow unii4 channels. 599 - */ 600 - struct iwl_lari_config_change_cmd_v4 { 601 - __le32 config_bitmap; 602 - __le32 oem_uhb_allow_bitmap; 603 - __le32 oem_11ax_allow_bitmap; 604 - __le32 oem_unii4_allow_bitmap; 605 - } __packed; /* LARI_CHANGE_CONF_CMD_S_VER_4 */ 606 - 607 - /** 608 - * struct iwl_lari_config_change_cmd_v5 - change LARI configuration 609 - * @config_bitmap: Bitmap of the config commands. Each bit will trigger a 610 - * different predefined FW config operation. 611 - * @oem_uhb_allow_bitmap: Bitmap of UHB enabled MCC sets. 612 - * @oem_11ax_allow_bitmap: Bitmap of 11ax allowed MCCs. There are two bits 613 - * per country, one to indicate whether to override and the other to 614 - * indicate the value to use. 615 - * @oem_unii4_allow_bitmap: Bitmap of unii4 allowed MCCs.There are two bits 616 - * per country, one to indicate whether to override and the other to 617 - * indicate allow/disallow unii4 channels. 618 - * @chan_state_active_bitmap: Bitmap for overriding channel state to active. 619 - * Each bit represents a country or region to activate, according to the BIOS 620 - * definitions. 621 - */ 622 - struct iwl_lari_config_change_cmd_v5 { 623 - __le32 config_bitmap; 624 - __le32 oem_uhb_allow_bitmap; 625 - __le32 oem_11ax_allow_bitmap; 626 - __le32 oem_unii4_allow_bitmap; 627 - __le32 chan_state_active_bitmap; 628 - } __packed; /* LARI_CHANGE_CONF_CMD_S_VER_5 */ 629 - 630 - /** 631 568 * struct iwl_lari_config_change_cmd_v6 - change LARI configuration 632 569 * @config_bitmap: Bitmap of the config commands. Each bit will trigger a 633 570 * different predefined FW config operation. ··· 586 659 } __packed; /* LARI_CHANGE_CONF_CMD_S_VER_6 */ 587 660 588 661 /** 589 - * struct iwl_lari_config_change_cmd_v7 - change LARI configuration 590 - * This structure is used also for lari cmd version 8 and 9. 662 + * struct iwl_lari_config_change_cmd_v8 - change LARI configuration 591 663 * @config_bitmap: Bitmap of the config commands. Each bit will trigger a 592 664 * different predefined FW config operation. 593 665 * @oem_uhb_allow_bitmap: Bitmap of UHB enabled MCC sets. ··· 596 670 * @oem_unii4_allow_bitmap: Bitmap of unii4 allowed MCCs.There are two bits 597 671 * per country, one to indicate whether to override and the other to 598 672 * indicate allow/disallow unii4 channels. 599 - * For LARI cmd version 4 to 8 - bits 0:3 are supported. 600 - * For LARI cmd version 9 - bits 0:5 are supported. 673 + * bit 0 - 3: supported. 601 674 * @chan_state_active_bitmap: Bitmap to enable different bands per country 602 675 * or region. 603 676 * Each bit represents a country or region, and a band to activate 604 677 * according to the BIOS definitions. 605 - * For LARI cmd version 7 - bits 0:3 are supported. 606 - * For LARI cmd version 8 - bits 0:4 are supported. 678 + * bit 0 - 4: supported. 607 679 * @force_disable_channels_bitmap: Bitmap of disabled bands/channels. 608 680 * Each bit represents a set of channels in a specific band that should be 609 681 * disabled 610 682 * @edt_bitmap: Bitmap of energy detection threshold table. 611 683 * Disable/enable the EDT optimization method for different band. 612 684 */ 613 - struct iwl_lari_config_change_cmd_v7 { 685 + struct iwl_lari_config_change_cmd_v8 { 614 686 __le32 config_bitmap; 615 687 __le32 oem_uhb_allow_bitmap; 616 688 __le32 oem_11ax_allow_bitmap; ··· 617 693 __le32 force_disable_channels_bitmap; 618 694 __le32 edt_bitmap; 619 695 } __packed; 620 - /* LARI_CHANGE_CONF_CMD_S_VER_7 */ 621 696 /* LARI_CHANGE_CONF_CMD_S_VER_8 */ 622 - /* LARI_CHANGE_CONF_CMD_S_VER_9 */ 623 697 624 - /** 625 - * struct iwl_lari_config_change_cmd_v10 - change LARI configuration 626 - * @config_bitmap: Bitmap of the config commands. Each bit will trigger a 627 - * different predefined FW config operation. 628 - * @oem_uhb_allow_bitmap: Bitmap of UHB enabled MCC sets. 629 - * @oem_11ax_allow_bitmap: Bitmap of 11ax allowed MCCs. There are two bits 630 - * per country, one to indicate whether to override and the other to 631 - * indicate the value to use. 632 - * @oem_unii4_allow_bitmap: Bitmap of unii4 allowed MCCs.There are two bits 633 - * per country, one to indicate whether to override and the other to 634 - * indicate allow/disallow unii4 channels. 635 - * For LARI cmd version 10 - bits 0:5 are supported. 636 - * @chan_state_active_bitmap: Bitmap to enable different bands per country 637 - * or region. 638 - * Each bit represents a country or region, and a band to activate 639 - * according to the BIOS definitions. 640 - * For LARI cmd version 10 - bits 0:4 are supported. 641 - * @force_disable_channels_bitmap: Bitmap of disabled bands/channels. 642 - * Each bit represents a set of channels in a specific band that should be 643 - * disabled 644 - * @edt_bitmap: Bitmap of energy detection threshold table. 645 - * Disable/enable the EDT optimization method for different band. 646 - * @oem_320mhz_allow_bitmap: 320Mhz bandwidth enablement bitmap per MCC. 647 - * bit0: enable 320Mhz in Japan. 648 - * bit1: enable 320Mhz in South Korea. 649 - * bit 2 - 31: reserved. 650 - */ 651 - struct iwl_lari_config_change_cmd_v10 { 652 - __le32 config_bitmap; 653 - __le32 oem_uhb_allow_bitmap; 654 - __le32 oem_11ax_allow_bitmap; 655 - __le32 oem_unii4_allow_bitmap; 656 - __le32 chan_state_active_bitmap; 657 - __le32 force_disable_channels_bitmap; 658 - __le32 edt_bitmap; 659 - __le32 oem_320mhz_allow_bitmap; 660 - } __packed; 661 - /* LARI_CHANGE_CONF_CMD_S_VER_10 */ 662 698 663 699 /** 664 700 * struct iwl_lari_config_change_cmd - change LARI configuration ··· 631 747 * @oem_unii4_allow_bitmap: Bitmap of unii4 allowed MCCs.There are two bits 632 748 * per country, one to indicate whether to override and the other to 633 749 * indicate allow/disallow unii4 channels. 634 - * For LARI cmd version 11 - bits 0:5 are supported. 635 750 * @chan_state_active_bitmap: Bitmap to enable different bands per country 636 751 * or region. 637 752 * Each bit represents a country or region, and a band to activate 638 753 * according to the BIOS definitions. 639 - * For LARI cmd version 11 - bits 0:4 are supported. 640 - * For LARI cmd version 12 - bits 0:6 are supported and bits 7:31 are 641 - * reserved. 754 + * bit 0 - 6: supported. 642 755 * @force_disable_channels_bitmap: Bitmap of disabled bands/channels. 643 756 * Each bit represents a set of channels in a specific band that should be 644 757 * disabled ··· 662 781 __le32 oem_320mhz_allow_bitmap; 663 782 __le32 oem_11be_allow_bitmap; 664 783 } __packed; 665 - /* LARI_CHANGE_CONF_CMD_S_VER_11 */ 666 784 /* LARI_CHANGE_CONF_CMD_S_VER_12 */ 667 785 668 786 /* Activate UNII-1 (5.2GHz) for World Wide */ 669 787 #define ACTIVATE_5G2_IN_WW_MASK BIT(4) 670 - #define CHAN_STATE_ACTIVE_BITMAP_CMD_V11 0x1F 788 + #define CHAN_STATE_ACTIVE_BITMAP_CMD_V8 0x1F 671 789 #define CHAN_STATE_ACTIVE_BITMAP_CMD_V12 0x7F 672 790 673 791 /**
+3 -2
drivers/net/wireless/intel/iwlwifi/fw/api/power.h
··· 620 620 } __packed; /*SAR_OFFSET_MAPPING_TABLE_CMD_API_S*/ 621 621 622 622 /** 623 - * struct iwl_beacon_filter_cmd 623 + * struct iwl_beacon_filter_cmd - beacon filter command 624 624 * REPLY_BEACON_FILTERING_CMD = 0xd2 (command) 625 625 * @bf_energy_delta: Used for RSSI filtering, if in 'normal' state. Send beacon 626 626 * to driver if delta in Energy values calculated for this and last ··· 762 762 }; /* PHY_AP_TYPE_API_E_VER_1 */ 763 763 764 764 /** 765 - * struct iwl_txpower_constraints_cmd 765 + * struct iwl_txpower_constraints_cmd - TX power constraints command 766 766 * AP_TX_POWER_CONSTRAINTS_CMD 767 767 * Used for VLP/LPI/AFC Access Point power constraints for 6GHz channels 768 768 * @link_id: linkId ··· 786 786 __s8 psd_pwr[IWL_MAX_TX_EIRP_PSD_PWR_MAX_SIZE]; 787 787 u8 reserved[3]; 788 788 } __packed; /* PHY_AP_TX_POWER_CONSTRAINTS_CMD_API_S_VER_1 */ 789 + 789 790 #endif /* __iwl_fw_api_power_h__ */
+286
drivers/net/wireless/intel/iwlwifi/fw/api/rx.h
··· 262 262 }; 263 263 264 264 enum iwl_rx_mpdu_phy_info { 265 + IWL_RX_MPDU_PHY_EOF_INDICATION = BIT(0), 265 266 IWL_RX_MPDU_PHY_AMPDU = BIT(5), 266 267 IWL_RX_MPDU_PHY_AMPDU_TOGGLE = BIT(6), 267 268 IWL_RX_MPDU_PHY_SHORT_PREAMBLE = BIT(7), ··· 1041 1040 __le32 average_energy; 1042 1041 __le32 link_id; 1043 1042 } __packed; /* BEACON_FILTER_IN_NTFY_API_S_VER_2 */ 1043 + 1044 + union iwl_legacy_sig { 1045 + #define OFDM_RX_LEGACY_LENGTH 0x00000fff 1046 + #define OFDM_RX_RATE 0x0000f000 1047 + __le32 ofdm; 1048 + #define CCK_CRFR_SHORT_PREAMBLE 0x00000040 1049 + __le32 cck; 1050 + }; 1051 + 1052 + struct iwl_ht_sigs { 1053 + #define OFDM_RX_FRAME_HT_MCS 0x0000007f 1054 + #define OFDM_RX_FRAME_HT_BANDWIDTH 0x00000080 1055 + #define OFDM_RX_FRAME_HT_LENGTH 0x03ffff00 1056 + __le32 a1; 1057 + __le32 a2; 1058 + }; 1059 + 1060 + struct iwl_vht_sigs { 1061 + #define OFDM_RX_FRAME_VHT_NUM_OF_DATA_SYM 0x000007ff 1062 + #define OFDM_RX_FRAME_VHT_NUM_OF_DATA_SYM_VALID 0x80000000 1063 + __le32 a0; 1064 + __le32 a1, a2; 1065 + }; 1066 + 1067 + struct iwl_he_sigs { 1068 + #define OFDM_RX_FRAME_HE_BEAM_CHANGE 0x00000001 1069 + #define OFDM_RX_FRAME_HE_UL_FLAG 0x00000002 1070 + #define OFDM_RX_FRAME_HE_MCS 0x0000003c 1071 + #define OFDM_RX_FRAME_HE_DCM 0x00000040 1072 + #define OFDM_RX_FRAME_HE_BSS_COLOR 0x00001f80 1073 + #define OFDM_RX_FRAME_HE_SPATIAL_REUSE 0x0001e000 1074 + #define OFDM_RX_FRAME_HE_BANDWIDTH 0x00060000 1075 + #define OFDM_RX_FRAME_HE_SU_EXT_BW10 0x00080000 1076 + #define OFDM_RX_FRAME_HE_GI_LTF_TYPE 0x00700000 1077 + #define OFDM_RX_FRAME_HE_NSTS 0x03800000 1078 + #define OFDM_RX_FRAME_HE_PRMBL_PUNC_TYPE 0x0c000000 1079 + __le32 a1; 1080 + #define OFDM_RX_FRAME_HE_TXOP_DURATION 0x0000007f 1081 + #define OFDM_RX_FRAME_HE_CODING 0x00000080 1082 + #define OFDM_RX_FRAME_HE_CODING_EXTRA_SYM 0x00000100 1083 + #define OFDM_RX_FRAME_HE_STBC 0x00000200 1084 + #define OFDM_RX_FRAME_HE_BF 0x00000400 1085 + #define OFDM_RX_FRAME_HE_PRE_FEC_PAD_FACTOR 0x00001800 1086 + #define OFDM_RX_FRAME_HE_PE_DISAMBIG 0x00002000 1087 + #define OFDM_RX_FRAME_HE_DOPPLER 0x00004000 1088 + #define OFDM_RX_FRAME_HE_TYPE 0x00038000 1089 + #define OFDM_RX_FRAME_HE_MU_NUM_OF_SIGB_SYM_OR_USER_NUM 0x003c0000 1090 + #define OFDM_RX_FRAME_HE_MU_SIGB_COMP 0x00400000 1091 + #define OFDM_RX_FRAME_HE_MU_NUM_OF_LTF_SYM 0x03800000 1092 + __le32 a2; 1093 + #define OFDM_RX_FRAME_HE_NUM_OF_DATA_SYM 0x000007ff 1094 + #define OFDM_RX_FRAME_HE_PE_DURATION 0x00003800 1095 + #define OFDM_RX_FRAME_HE_NUM_OF_DATA_SYM_VALID 0x80000000 1096 + __le32 a3; 1097 + #define OFDM_RX_FRAME_HE_SIGB_STA_ID_FOUND 0x00000001 1098 + #define OFDM_RX_FRAME_HE_SIGB_STA_ID_INDX 0x0000000e 1099 + #define OFDM_RX_FRAME_HE_SIGB_NSTS 0x00000070 1100 + #define OFDM_RX_FRAME_HE_SIGB_BF 0x00000080 1101 + #define OFDM_RX_FRAME_HE_SIGB_MCS 0x00000f00 1102 + #define OFDM_RX_FRAME_HE_SIGB_DCM 0x00001000 1103 + #define OFDM_RX_FRAME_HE_SIGB_CODING 0x00002000 1104 + #define OFDM_RX_FRAME_HE_SIGB_SPATIAL_CONFIG 0x0003c000 1105 + #define OFDM_RX_FRAME_HE_SIGB_STA_RU 0x03fc0000 1106 + #define OFDM_RX_FRAME_HE_SIGB_NUM_OF_SYM 0x3c000000 1107 + #define OFDM_RX_FRAME_HE_SIGB_CRC_OK 0x40000000 1108 + __le32 b; 1109 + /* index 0 */ 1110 + #define OFDM_RX_FRAME_HE_RU_ALLOC_0_A1 0x000000ff 1111 + #define OFDM_RX_FRAME_HE_RU_ALLOC_0_A2 0x0000ff00 1112 + #define OFDM_RX_FRAME_HE_RU_ALLOC_0_B1 0x00ff0000 1113 + #define OFDM_RX_FRAME_HE_RU_ALLOC_0_B2 0xff000000 1114 + /* index 1 */ 1115 + #define OFDM_RX_FRAME_HE_RU_ALLOC_1_C1 0x000000ff 1116 + #define OFDM_RX_FRAME_HE_RU_ALLOC_1_C2 0x0000ff00 1117 + #define OFDM_RX_FRAME_HE_RU_ALLOC_1_D1 0x00ff0000 1118 + #define OFDM_RX_FRAME_HE_RU_ALLOC_1_D2 0xff000000 1119 + /* index 2 */ 1120 + #define OFDM_RX_FRAME_HE_CENTER_RU_CC1 0x00000001 1121 + #define OFDM_RX_FRAME_HE_CENTER_RU_CC2 0x00000002 1122 + #define OFDM_RX_FRAME_HE_COMMON_CC1_CRC_OK 0x00000004 1123 + #define OFDM_RX_FRAME_HE_COMMON_CC2_CRC_OK 0x00000008 1124 + __le32 cmn[3]; 1125 + }; 1126 + 1127 + struct iwl_he_tb_sigs { 1128 + #define OFDM_RX_HE_TRIG_FORMAT 0x00000001 1129 + #define OFDM_RX_HE_TRIG_BSS_COLOR 0x0000007e 1130 + #define OFDM_RX_HE_TRIG_SPATIAL_REUSE_1 0x00000780 1131 + #define OFDM_RX_HE_TRIG_SPATIAL_REUSE_2 0x00007800 1132 + #define OFDM_RX_HE_TRIG_SPATIAL_REUSE_3 0x00078000 1133 + #define OFDM_RX_HE_TRIG_SPATIAL_REUSE_4 0x00780000 1134 + #define OFDM_RX_HE_TRIG_BANDWIDTH 0x03000000 1135 + __le32 a1; 1136 + #define OFDM_RX_HE_TRIG_TXOP_DURATION 0x0000007f 1137 + #define OFDM_RX_HE_TRIG_SIG2_RESERVED 0x0000ff80 1138 + #define OFDM_RX_HE_TRIG_FORMAT_ERR 0x08000000 1139 + #define OFDM_RX_HE_TRIG_BW_ERR 0x10000000 1140 + #define OFDM_RX_HE_TRIG_LEGACY_LENGTH_ERR 0x20000000 1141 + #define OFDM_RX_HE_TRIG_CRC_OK 0x40000000 1142 + __le32 a2; 1143 + #define OFDM_UCODE_TRIG_BASE_RX_LGCY_LENGTH 0x00000fff 1144 + #define OFDM_UCODE_TRIG_BASE_RX_BANDWIDTH 0x00007000 1145 + #define OFDM_UCODE_TRIG_BASE_PS160 0x00008000 1146 + #define OFDM_UCODE_EHT_TRIG_CONTROL_CHANNEL 0x000f0000 1147 + __le32 tb_rx0; 1148 + #define OFDM_UCODE_TRIG_BASE_RX_MCS 0x0000000f 1149 + #define OFDM_UCODE_TRIG_BASE_RX_DCM 0x00000010 1150 + #define OFDM_UCODE_TRIG_BASE_RX_GI_LTF_TYPE 0x00000060 1151 + #define OFDM_UCODE_TRIG_BASE_RX_NSTS 0x00000380 1152 + #define OFDM_UCODE_TRIG_BASE_RX_CODING 0x00000400 1153 + #define OFDM_UCODE_TRIG_BASE_RX_CODING_EXTRA_SYM 0x00000800 1154 + #define OFDM_UCODE_TRIG_BASE_RX_STBC 0x00001000 1155 + #define OFDM_UCODE_TRIG_BASE_RX_PRE_FEC_PAD_FACTOR 0x00006000 1156 + #define OFDM_UCODE_TRIG_BASE_RX_PE_DISAMBIG 0x00008000 1157 + #define OFDM_UCODE_TRIG_BASE_RX_DOPPLER 0x00010000 1158 + #define OFDM_UCODE_TRIG_BASE_RX_RU 0x01fe0000 1159 + #define OFDM_UCODE_TRIG_BASE_RX_RU_P80 0x00020000 1160 + #define OFDM_UCODE_TRIG_BASE_RX_NUM_OF_LTF_SYM 0x0e000000 1161 + #define OFDM_UCODE_TRIG_BASE_RX_LTF_PILOT_TYPE 0x10000000 1162 + #define OFDM_UCODE_TRIG_BASE_RX_LOWEST_SS_ALLOCATION 0xe0000000 1163 + __le32 tb_rx1; 1164 + }; 1165 + 1166 + struct iwl_eht_sigs { 1167 + #define OFDM_RX_FRAME_ENHANCED_WIFI_VER_ID 0x00000007 1168 + #define OFDM_RX_FRAME_ENHANCED_WIFI_BANDWIDTH 0x00000038 1169 + #define OFDM_RX_FRAME_ENHANCED_WIFI_UL_FLAG 0x00000040 1170 + #define OFDM_RX_FRAME_ENHANCED_WIFI_BSS_COLOR 0x00001f80 1171 + #define OFDM_RX_FRAME_ENHANCED_WIFI_TXOP_DURATION 0x000fe000 1172 + #define OFDM_RX_FRAME_EHT_USIG1_DISREGARD 0x01f00000 1173 + #define OFDM_RX_FRAME_EHT_USIG1_VALIDATE 0x02000000 1174 + #define OFDM_RX_FRAME_EHT_BW320_SLOT 0x04000000 1175 + #define OFDM_RX_FRAME_EHT_TYPE 0x18000000 1176 + #define OFDM_RX_FRAME_ENHANCED_ER_NO_STREAMS 0x20000000 1177 + __le32 usig_a1; 1178 + #define OFDM_RX_FRAME_EHT_PPDU_TYPE 0x00000003 1179 + #define OFDM_RX_FRAME_EHT_USIG2_VALIDATE_B2 0x00000004 1180 + #define OFDM_RX_FRAME_EHT_PUNC_CHANNEL 0x000000f8 1181 + #define OFDM_RX_FRAME_EHT_USIG2_VALIDATE_B8 0x00000100 1182 + #define OFDM_RX_FRAME_EHT_SIG_MCS 0x00000600 1183 + #define OFDM_RX_FRAME_EHT_SIG_SYM_NUM 0x0000f800 1184 + #define OFDM_RX_FRAME_EHT_TRIG_SPATIAL_REUSE_1 0x000f0000 1185 + #define OFDM_RX_FRAME_EHT_TRIG_SPATIAL_REUSE_2 0x00f00000 1186 + #define OFDM_RX_FRAME_EHT_TRIG_USIG2_DISREGARD 0x1f000000 1187 + #define OFDM_RX_FRAME_EHT_TRIG_NO_STREAMS 0x20000000 1188 + #define OFDM_RX_USIG_CRC_OK 0x40000000 1189 + __le32 usig_a2_eht; 1190 + #define OFDM_RX_FRAME_EHT_SPATIAL_REUSE 0x0000000f 1191 + #define OFDM_RX_FRAME_EHT_GI_LTF_TYPE 0x00000030 1192 + #define OFDM_RX_FRAME_EHT_NUM_OF_LTF_SYM 0x000001c0 1193 + #define OFDM_RX_FRAME_EHT_CODING_EXTRA_SYM 0x00000200 1194 + #define OFDM_RX_FRAME_EHT_PRE_FEC_PAD_FACTOR 0x00000c00 1195 + #define OFDM_RX_FRAME_EHT_PE_DISAMBIG 0x00001000 1196 + #define OFDM_RX_FRAME_EHT_USIG_OVF_DISREGARD 0x0001e000 1197 + #define OFDM_RX_FRAME_EHT_NUM_OF_USERS 0x000e0000 1198 + #define OFDM_RX_FRAME_EHT_NSTS 0x00f00000 1199 + #define OFDM_RX_FRAME_EHT_BF 0x01000000 1200 + #define OFDM_RX_FRAME_EHT_USIG_OVF_NDP_DISREGARD 0x06000000 1201 + #define OFDM_RX_FRAME_EHTSIG_COMM_CC1_CRC_OK 0x08000000 1202 + #define OFDM_RX_FRAME_EHTSIG_COMM_CC2_CRC_OK 0x10000000 1203 + #define OFDM_RX_FRAME_EHT_NON_VALID_RU_ALLOC 0x20000000 1204 + #define OFDM_RX_FRAME_EHT_NO_STREAMS 0x40000000 1205 + __le32 b1; 1206 + #define OFDM_RX_FRAME_EHT_MATCH_ID_FOUND 0x00000001 1207 + #define OFDM_RX_FRAME_EHT_ID_INDX 0x0000000e 1208 + #define OFDM_RX_FRAME_EHT_MCS 0x000000f0 1209 + #define OFDM_RX_FRAME_EHT_CODING 0x00000100 1210 + #define OFDM_RX_FRAME_EHT_SPATIAL_CONFIG 0x00007e00 1211 + #define OFDM_RX_FRAME_EHT_STA_RU 0x007f8000 1212 + #define OFDM_RX_FRAME_EHT_STA_RU_P80 0x00008000 1213 + #define OFDM_RX_FRAME_EHT_STA_RU_PS160 0x00800000 1214 + #define OFDM_RX_FRAME_EHT_USER_FIELD_CRC_OK 0x40000000 1215 + __le32 b2; 1216 + #define OFDM_RX_FRAME_EHT_NUM_OF_DATA_SYM 0x000007ff 1217 + #define OFDM_RX_FRAME_EHT_PE_DURATION 0x00003800 1218 + #define OFDM_RX_FRAME_EHT_NUM_OF_DATA_SYM_VALID 0x80000000 1219 + __le32 sig2; 1220 + #define OFDM_RX_FRAME_EHT_RU_ALLOC_0_A1 0x000001ff 1221 + #define OFDM_RX_FRAME_EHT_RU_ALLOC_0_A2 0x0003fe00 1222 + #define OFDM_RX_FRAME_EHT_RU_ALLOC_0_A3 0x07fc0000 1223 + #define OFDM_RX_FRAME_EHT_RU_ALLOC_1_B1 0x000001ff 1224 + #define OFDM_RX_FRAME_EHT_RU_ALLOC_1_B2 0x0003fe00 1225 + #define OFDM_RX_FRAME_EHT_RU_ALLOC_1_B3 0x07fc0000 1226 + #define OFDM_RX_FRAME_EHT_RU_ALLOC_2_C1 0x000001ff 1227 + #define OFDM_RX_FRAME_EHT_RU_ALLOC_2_C2 0x0003fe00 1228 + #define OFDM_RX_FRAME_EHT_RU_ALLOC_2_C3 0x07fc0000 1229 + #define OFDM_RX_FRAME_EHT_RU_ALLOC_3_D1 0x000001ff 1230 + #define OFDM_RX_FRAME_EHT_RU_ALLOC_3_D2 0x0003fe00 1231 + #define OFDM_RX_FRAME_EHT_RU_ALLOC_3_D3 0x07fc0000 1232 + #define OFDM_RX_FRAME_EHT_RU_ALLOC_4_A4 0x000001ff 1233 + #define OFDM_RX_FRAME_EHT_RU_ALLOC_4_B4 0x0003fe00 1234 + #define OFDM_RX_FRAME_EHT_RU_ALLOC_5_C4 0x000001ff 1235 + #define OFDM_RX_FRAME_EHT_RU_ALLOC_5_D4 0x0003fe00 1236 + __le32 cmn[6]; 1237 + #define OFDM_RX_FRAME_EHT_USER_FIELD_ID 0x000007ff 1238 + __le32 user_id; 1239 + }; 1240 + 1241 + struct iwl_eht_tb_sigs { 1242 + /* same as non-TB above */ 1243 + __le32 usig_a1, usig_a2_eht; 1244 + /* same as HE TB above */ 1245 + __le32 tb_rx0, tb_rx1; 1246 + }; 1247 + 1248 + struct iwl_uhr_sigs { 1249 + __le32 usig_a1, usig_a1_uhr, usig_a2_uhr, b1, b2; 1250 + __le32 sig2; 1251 + __le32 cmn[6]; 1252 + __le32 user_id; 1253 + }; 1254 + 1255 + struct iwl_uhr_tb_sigs { 1256 + __le32 usig_a1, usig_a2_uhr, tb_rx0, tb_rx1; 1257 + }; 1258 + 1259 + struct iwl_uhr_elr_sigs { 1260 + __le32 usig_a1, usig_a2_uhr; 1261 + __le32 uhr_sig_elr1, uhr_sig_elr2; 1262 + }; 1263 + 1264 + union iwl_sigs { 1265 + struct iwl_ht_sigs ht; 1266 + struct iwl_vht_sigs vht; 1267 + struct iwl_he_sigs he; 1268 + struct iwl_he_tb_sigs he_tb; 1269 + struct iwl_eht_sigs eht; 1270 + struct iwl_eht_tb_sigs eht_tb; 1271 + struct iwl_uhr_sigs uhr; 1272 + struct iwl_uhr_tb_sigs uhr_tb; 1273 + struct iwl_uhr_elr_sigs uhr_elr; 1274 + }; 1275 + 1276 + enum iwl_sniffer_status { 1277 + IWL_SNIF_STAT_PLCP_RX_OK = 0, 1278 + IWL_SNIF_STAT_AID_NOT_FOR_US = 1, 1279 + IWL_SNIF_STAT_PLCP_RX_LSIG_ERR = 2, 1280 + IWL_SNIF_STAT_PLCP_RX_SIGA_ERR = 3, 1281 + IWL_SNIF_STAT_PLCP_RX_SIGB_ERR = 4, 1282 + IWL_SNIF_STAT_UNEXPECTED_TB = 5, 1283 + IWL_SNIF_STAT_UNSUPPORTED_RATE = 6, 1284 + IWL_SNIF_STAT_UNKNOWN_ERROR = 7, 1285 + }; /* AIR_SNIFFER_STATUS_E_VER_1 */ 1286 + 1287 + enum iwl_sniffer_flags { 1288 + IWL_SNIF_FLAG_VALID_TB_RX = BIT(0), 1289 + IWL_SNIF_FLAG_VALID_RU = BIT(1), 1290 + }; /* AIR_SNIFFER_FLAGS_E_VER_1 */ 1291 + 1292 + /** 1293 + * struct iwl_rx_phy_air_sniffer_ntfy - air sniffer notification 1294 + * 1295 + * @status: &enum iwl_sniffer_status 1296 + * @flags: &enum iwl_sniffer_flags 1297 + * @reserved1: reserved 1298 + * @rssi_a: energy chain-A in negative dBm, measured at FINA time 1299 + * @rssi_b: energy chain-B in negative dBm, measured at FINA time 1300 + * @channel: channel number 1301 + * @band: band information, PHY_BAND_* 1302 + * @on_air_rise_time: GP2 at on air rise 1303 + * @frame_time: frame time in us 1304 + * @rate: RATE_MCS_* 1305 + * @bytecount: byte count for legay and HT, otherwise number of symbols 1306 + * @legacy_sig: CCK signal information if %RATE_MCS_MOD_TYPE_MSK in @rate is 1307 + * %RATE_MCS_MOD_TYPE_CCK, otherwise OFDM signal information 1308 + * @sigs: PHY signal information, depending on %RATE_MCS_MOD_TYPE_MSK in @rate 1309 + * @reserved2: reserved 1310 + * 1311 + * Sent for every frame and before the normal RX command if data is included. 1312 + */ 1313 + struct iwl_rx_phy_air_sniffer_ntfy { 1314 + u8 status; 1315 + u8 flags; 1316 + u8 reserved1[2]; 1317 + u8 rssi_a, rssi_b; 1318 + u8 channel, band; 1319 + __le32 on_air_rise_time; 1320 + __le32 frame_time; 1321 + /* note: MCS in rate is not valid for MU-VHT */ 1322 + __le32 rate; 1323 + __le32 bytecount; 1324 + union iwl_legacy_sig legacy_sig; 1325 + union iwl_sigs sigs; 1326 + __le32 reserved2; 1327 + }; /* RX_PHY_AIR_SNIFFER_NTFY_API_S_VER_1 */ 1044 1328 1045 1329 #endif /* __iwl_fw_api_rx_h__ */
+41 -37
drivers/net/wireless/intel/iwlwifi/fw/api/scan.h
··· 1 1 /* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ 2 2 /* 3 - * Copyright (C) 2012-2014, 2018-2024 Intel Corporation 3 + * Copyright (C) 2012-2014, 2018-2025 Intel Corporation 4 4 * Copyright (C) 2013-2015 Intel Mobile Communications GmbH 5 5 * Copyright (C) 2016-2017 Intel Deutschland GmbH 6 6 */ ··· 129 129 } __packed; 130 130 131 131 /** 132 - * struct iwl_scan_offload_profile_cfg_data 132 + * struct iwl_scan_offload_profile_cfg_data - scan offload profile configs 133 133 * @blocklist_len: length of blocklist 134 134 * @num_profiles: num of profiles in the list 135 135 * @match_notify: clients waiting for match found notification ··· 159 159 } __packed; /* SCAN_OFFLOAD_PROFILES_CFG_API_S_VER_1-2*/ 160 160 161 161 /** 162 - * struct iwl_scan_offload_profile_cfg 162 + * struct iwl_scan_offload_profile_cfg - scan offload profile config 163 163 * @profiles: profiles to search for match 164 164 * @data: the rest of the data for profile_cfg 165 165 */ ··· 507 507 IWL_UHB_CHAN_CFG_FLAG_FORCE_PASSIVE = BIT(26), 508 508 }; 509 509 /** 510 - * struct iwl_scan_dwell 510 + * struct iwl_scan_dwell - scan dwell configuration 511 511 * @active: default dwell time for active scan 512 512 * @passive: default dwell time for passive scan 513 513 * @fragmented: default dwell time for fragmented scan ··· 728 728 }; 729 729 730 730 /** 731 - * struct iwl_scan_channel_cfg_umac 731 + * struct iwl_scan_channel_cfg_umac - scan channel config 732 732 * @flags: bitmap - 0-19: directed scan to i'th ssid. 733 733 * @channel_num: channel number 1-13 etc. 734 734 * @v1: command version 1 ··· 774 774 } __packed; 775 775 776 776 /** 777 - * struct iwl_scan_umac_schedule 777 + * struct iwl_scan_umac_schedule - scan schedule parameters 778 778 * @interval: interval in seconds between scan iterations 779 779 * @iter_count: num of scan iterations for schedule plan, 0xff for infinite loop 780 780 * @reserved: for alignment and future use ··· 815 815 } __packed; 816 816 817 817 /** 818 - * struct iwl_scan_umac_chan_param 818 + * struct iwl_scan_umac_chan_param - scan channel parameters 819 819 * @flags: channel flags &enum iwl_scan_channel_flags 820 820 * @count: num of channels in scan request 821 821 * @reserved: for future use and alignment ··· 827 827 } __packed; /*SCAN_CHANNEL_PARAMS_API_S_VER_1 */ 828 828 829 829 /** 830 - * struct iwl_scan_req_umac 830 + * struct iwl_scan_req_umac - scan request command 831 831 * @flags: &enum iwl_umac_scan_flags 832 832 * @uid: scan id, &enum iwl_umac_scan_uid_offsets 833 833 * @ooc_priority: out of channel priority - &enum iwl_scan_priority 834 834 * @general_flags: &enum iwl_umac_scan_general_flags 835 + * @reserved: reserved 835 836 * @scan_start_mac_id: report the scan start TSF time according to this mac TSF 836 - * @extended_dwell: dwell time for channels 1, 6 and 11 837 - * @active_dwell: dwell time for active scan per LMAC 838 - * @passive_dwell: dwell time for passive scan per LMAC 839 - * @fragmented_dwell: dwell time for fragmented passive scan 840 - * @adwell_default_n_aps: for adaptive dwell the default number of APs 837 + * @v1: version 1 command data 838 + * @v6: version 6 command data 839 + * @v7: version 7 command data 840 + * @v8: version 8 command data 841 + * @v9: version 9 command data 842 + * @v1.extended_dwell: dwell time for channels 1, 6 and 11 843 + * @v1.active_dwell: dwell time for active scan per LMAC 844 + * @v1.passive_dwell: dwell time for passive scan per LMAC 845 + * @v1.fragmented_dwell: dwell time for fragmented passive scan 846 + * @v7.adwell_default_n_aps: for adaptive dwell the default number of APs 841 847 * per channel 842 - * @adwell_default_n_aps_social: for adaptive dwell the default 848 + * @v7.adwell_default_n_aps_social: for adaptive dwell the default 843 849 * number of APs per social (1,6,11) channel 844 - * @general_flags2: &enum iwl_umac_scan_general_flags2 845 - * @adwell_max_budget: for adaptive dwell the maximal budget of TU to be added 846 - * to total scan time 847 - * @max_out_time: max out of serving channel time, per LMAC - for CDB there 848 - * are 2 LMACs 849 - * @suspend_time: max suspend time, per LMAC - for CDB there are 2 LMACs 850 - * @scan_priority: scan internal prioritization &enum iwl_scan_priority 851 - * @num_of_fragments: Number of fragments needed for full coverage per band. 850 + * @v8.general_flags2: &enum iwl_umac_scan_general_flags2 851 + * @v7.adwell_max_budget: for adaptive dwell the maximal budget of TU to be 852 + * added to total scan time 853 + * @v1.max_out_time: max out of serving channel time, per LMAC - for CDB 854 + * there are 2 LMACs 855 + * @v1.suspend_time: max suspend time, per LMAC - for CDB there are 2 LMACs 856 + * @v1.scan_priority: scan internal prioritization &enum iwl_scan_priority 857 + * @v8.num_of_fragments: Number of fragments needed for full coverage per band. 852 858 * Relevant only for fragmented scan. 853 - * @channel: &struct iwl_scan_umac_chan_param 854 - * @reserved: for future use and alignment 855 - * @reserved3: for future use and alignment 856 - * @data: &struct iwl_scan_channel_cfg_umac and 859 + * @v1.channel: &struct iwl_scan_umac_chan_param 860 + * @v1.data: &struct iwl_scan_channel_cfg_umac and 857 861 * &struct iwl_scan_req_umac_tail 858 862 */ 859 863 struct iwl_scan_req_umac { ··· 943 939 #define IWL_SCAN_REQ_UMAC_SIZE_V1 36 944 940 945 941 /** 946 - * struct iwl_scan_probe_params_v3 942 + * struct iwl_scan_probe_params_v3 - scan probe parameters 947 943 * @preq: scan probe request params 948 944 * @ssid_num: number of valid SSIDs in direct scan array 949 945 * @short_ssid_num: number of valid short SSIDs in short ssid array ··· 965 961 } __packed; /* SCAN_PROBE_PARAMS_API_S_VER_3 */ 966 962 967 963 /** 968 - * struct iwl_scan_probe_params_v4 964 + * struct iwl_scan_probe_params_v4 - scan probe parameters 969 965 * @preq: scan probe request params 970 966 * @short_ssid_num: number of valid short SSIDs in short ssid array 971 967 * @bssid_num: number of valid bssid in bssids array ··· 987 983 #define SCAN_MAX_NUM_CHANS_V3 67 988 984 989 985 /** 990 - * struct iwl_scan_channel_params_v4 986 + * struct iwl_scan_channel_params_v4 - channel params 991 987 * @flags: channel flags &enum iwl_scan_channel_flags 992 988 * @count: num of channels in scan request 993 989 * @num_of_aps_override: override the number of APs the FW uses to calculate ··· 1010 1006 SCAN_CHANNEL_PARAMS_API_S_VER_5 */ 1011 1007 1012 1008 /** 1013 - * struct iwl_scan_channel_params_v7 1009 + * struct iwl_scan_channel_params_v7 - channel params 1014 1010 * @flags: channel flags &enum iwl_scan_channel_flags 1015 1011 * @count: num of channels in scan request 1016 1012 * @n_aps_override: override the number of APs the FW uses to calculate dwell ··· 1028 1024 } __packed; /* SCAN_CHANNEL_PARAMS_API_S_VER_6 */ 1029 1025 1030 1026 /** 1031 - * struct iwl_scan_general_params_v11 1027 + * struct iwl_scan_general_params_v11 - channel params 1032 1028 * @flags: &enum iwl_umac_scan_general_flags_v2 1033 1029 * @reserved: reserved for future 1034 1030 * @scan_start_mac_or_link_id: report the scan start TSF time according to this ··· 1070 1066 } __packed; /* SCAN_GENERAL_PARAMS_API_S_VER_12, *_VER_11 and *_VER_10 */ 1071 1067 1072 1068 /** 1073 - * struct iwl_scan_periodic_parms_v1 1069 + * struct iwl_scan_periodic_parms_v1 - periodicity parameters 1074 1070 * @schedule: can scheduling parameter 1075 1071 * @delay: initial delay of the periodic scan in seconds 1076 1072 * @reserved: reserved for future ··· 1082 1078 } __packed; /* SCAN_PERIODIC_PARAMS_API_S_VER_1 */ 1083 1079 1084 1080 /** 1085 - * struct iwl_scan_req_params_v12 1081 + * struct iwl_scan_req_params_v12 - scan request parameters (v12) 1086 1082 * @general_params: &struct iwl_scan_general_params_v11 1087 1083 * @channel_params: &struct iwl_scan_channel_params_v4 1088 1084 * @periodic_params: &struct iwl_scan_periodic_parms_v1 ··· 1110 1106 } __packed; /* SCAN_REQUEST_PARAMS_API_S_VER_17 - 14 */ 1111 1107 1112 1108 /** 1113 - * struct iwl_scan_req_umac_v12 1109 + * struct iwl_scan_req_umac_v12 - scan request command (v12) 1114 1110 * @uid: scan id, &enum iwl_umac_scan_uid_offsets 1115 1111 * @ooc_priority: out of channel priority - &enum iwl_scan_priority 1116 1112 * @scan_params: scan parameters ··· 1134 1130 } __packed; /* SCAN_REQUEST_CMD_UMAC_API_S_VER_17 - 14 */ 1135 1131 1136 1132 /** 1137 - * struct iwl_umac_scan_abort 1133 + * struct iwl_umac_scan_abort - scan abort command 1138 1134 * @uid: scan id, &enum iwl_umac_scan_uid_offsets 1139 1135 * @flags: reserved 1140 1136 */ ··· 1144 1140 } __packed; /* SCAN_ABORT_CMD_UMAC_API_S_VER_1 */ 1145 1141 1146 1142 /** 1147 - * enum iwl_umac_scan_abort_status 1143 + * enum iwl_umac_scan_abort_status - scan abort status 1148 1144 * 1149 1145 * @IWL_UMAC_SCAN_ABORT_STATUS_SUCCESS: scan was successfully aborted 1150 1146 * @IWL_UMAC_SCAN_ABORT_STATUS_IN_PROGRESS: scan abort is in progress ··· 1157 1153 }; 1158 1154 1159 1155 /** 1160 - * struct iwl_umac_scan_complete 1156 + * struct iwl_umac_scan_complete - scan complete notification 1161 1157 * @uid: scan id, &enum iwl_umac_scan_uid_offsets 1162 1158 * @last_schedule: last scheduling line 1163 1159 * @last_iter: last scan iteration number
+3 -3
drivers/net/wireless/intel/iwlwifi/fw/api/sta.h
··· 1 1 /* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ 2 2 /* 3 - * Copyright (C) 2012-2014, 2018-2021, 2023 Intel Corporation 3 + * Copyright (C) 2012-2014, 2018-2021, 2023, 2025 Intel Corporation 4 4 * Copyright (C) 2013-2014 Intel Mobile Communications GmbH 5 5 * Copyright (C) 2016-2017 Intel Deutschland GmbH 6 6 */ ··· 428 428 } __packed; /* REMOVE_STA_CMD_API_S_VER_2 */ 429 429 430 430 /** 431 - * struct iwl_mvm_mgmt_mcast_key_cmd_v1 431 + * struct iwl_mvm_mgmt_mcast_key_cmd_v1 - IGTK command 432 432 * ( MGMT_MCAST_KEY = 0x1f ) 433 433 * @ctrl_flags: &enum iwl_sta_key_flag 434 434 * @igtk: IGTK key material ··· 449 449 } __packed; /* SEC_MGMT_MULTICAST_KEY_CMD_API_S_VER_1 */ 450 450 451 451 /** 452 - * struct iwl_mvm_mgmt_mcast_key_cmd 452 + * struct iwl_mvm_mgmt_mcast_key_cmd - IGTK command 453 453 * ( MGMT_MCAST_KEY = 0x1f ) 454 454 * @ctrl_flags: &enum iwl_sta_key_flag 455 455 * @igtk: IGTK master key
+20 -19
drivers/net/wireless/intel/iwlwifi/fw/api/stats.h
··· 26 26 } __packed; /* STATISTICS_SLOW_DIV_API_S_VER_2 */ 27 27 28 28 /** 29 - * struct mvm_statistics_rx_non_phy 29 + * struct mvm_statistics_rx_non_phy - non-PHY RX statistics 30 30 * @bogus_cts: CTS received when not expecting CTS 31 31 * @bogus_ack: ACK received when not expecting ACK 32 32 * @non_channel_beacons: beacons with our bss id but not on our serving channel ··· 456 456 } __packed; /* STATISTICS_FW_CMD_API_S_VER_1 */ 457 457 458 458 /** 459 - * enum iwl_fw_statistics_type 459 + * enum iwl_fw_statistics_type - statistics type 460 460 * 461 461 * @FW_STATISTICS_OPERATIONAL: operational statistics 462 462 * @FW_STATISTICS_PHY: phy statistics ··· 478 478 479 479 #define IWL_STATISTICS_TYPE_MSK 0x7f 480 480 /** 481 - * struct iwl_statistics_ntfy_hdr 481 + * struct iwl_statistics_ntfy_hdr - statistics notification header 482 482 * 483 483 * @type: struct type 484 484 * @version: version of the struct ··· 491 491 }; /* STATISTICS_NTFY_HDR_API_S_VER_1 */ 492 492 493 493 /** 494 - * struct iwl_stats_ntfy_per_link 494 + * struct iwl_stats_ntfy_per_link - per-link statistics 495 495 * 496 496 * @beacon_filter_average_energy: Average energy [-dBm] of the 2 497 497 * antennas. ··· 514 514 } __packed; /* STATISTICS_NTFY_PER_LINK_API_S_VER_1 */ 515 515 516 516 /** 517 - * struct iwl_stats_ntfy_part1_per_link 517 + * struct iwl_stats_ntfy_part1_per_link - part1 per link statistics 518 518 * 519 519 * @rx_time: rx time 520 520 * @tx_time: tx time ··· 533 533 } __packed; /* STATISTICS_FW_NTFY_OPERATIONAL_PART1_PER_LINK_API_S_VER_1 */ 534 534 535 535 /** 536 - * struct iwl_stats_ntfy_per_mac 536 + * struct iwl_stats_ntfy_per_mac - per MAC statistics 537 537 * 538 538 * @beacon_filter_average_energy: Average energy [-dBm] of the 2 539 539 * antennas. ··· 556 556 } __packed; /* STATISTICS_NTFY_PER_MAC_API_S_VER_1 */ 557 557 558 558 #define IWL_STATS_MAX_BW_INDEX 5 559 - /** struct iwl_stats_ntfy_per_phy 559 + /** 560 + * struct iwl_stats_ntfy_per_phy - per PHY statistics 560 561 * @channel_load: channel load 561 562 * @channel_load_by_us: device contribution to MCLM 562 563 * @channel_load_not_by_us: other devices' contribution to MCLM ··· 589 588 #define IWL_STATS_UNKNOWN_CHANNEL_LOAD 0xffffffff 590 589 591 590 /** 592 - * struct iwl_stats_ntfy_per_sta 591 + * struct iwl_stats_ntfy_per_sta - per STA statistics 593 592 * 594 593 * @average_energy: in fact it is minus the energy.. 595 594 */ ··· 601 600 #define IWL_STATS_MAX_FW_LINKS (IWL_FW_MAX_LINK_ID + 1) 602 601 603 602 /** 604 - * struct iwl_system_statistics_notif_oper 603 + * struct iwl_system_statistics_notif_oper - statistics notification 605 604 * 606 605 * @time_stamp: time when the notification is sent from firmware 607 606 * @per_link: per link statistics, &struct iwl_stats_ntfy_per_link ··· 616 615 } __packed; /* STATISTICS_FW_NTFY_OPERATIONAL_API_S_VER_3 */ 617 616 618 617 /** 619 - * struct iwl_system_statistics_part1_notif_oper 618 + * struct iwl_system_statistics_part1_notif_oper - part1 stats notification 620 619 * 621 620 * @time_stamp: time when the notification is sent from firmware 622 621 * @per_link: per link statistics &struct iwl_stats_ntfy_part1_per_link ··· 629 628 } __packed; /* STATISTICS_FW_NTFY_OPERATIONAL_PART1_API_S_VER_4 */ 630 629 631 630 /** 632 - * struct iwl_system_statistics_end_notif 631 + * struct iwl_system_statistics_end_notif - statistics end notification 633 632 * 634 633 * @time_stamp: time when the notification is sent from firmware 635 634 */ ··· 638 637 } __packed; /* STATISTICS_FW_NTFY_END_API_S_VER_1 */ 639 638 640 639 /** 641 - * struct iwl_statistics_operational_ntfy 640 + * struct iwl_statistics_operational_ntfy - operational stats notification 642 641 * 643 642 * @hdr: general statistics header 644 643 * @flags: bitmap of possible notification structures ··· 663 662 } __packed; /* STATISTICS_OPERATIONAL_NTFY_API_S_VER_15 */ 664 663 665 664 /** 666 - * struct iwl_statistics_operational_ntfy_ver_14 665 + * struct iwl_statistics_operational_ntfy_ver_14 - operational stats notification 667 666 * 668 667 * @hdr: general statistics header 669 668 * @flags: bitmap of possible notification structures ··· 708 707 } __packed; /* STATISTICS_OPERATIONAL_NTFY_API_S_VER_14 */ 709 708 710 709 /** 711 - * struct iwl_statistics_phy_ntfy 710 + * struct iwl_statistics_phy_ntfy - PHY statistics notification 712 711 * 713 712 * @hdr: general statistics header 714 713 * RX PHY related statistics ··· 809 808 } __packed; /* STATISTICS_PHY_NTFY_API_S_VER_1 */ 810 809 811 810 /** 812 - * struct iwl_statistics_mac_ntfy 811 + * struct iwl_statistics_mac_ntfy - MAC statistics notification 813 812 * 814 813 * @hdr: general statistics header 815 814 * @bcast_filter_passed_per_mac: bcast filter passed per mac ··· 828 827 } __packed; /* STATISTICS_MAC_NTFY_API_S_VER_1 */ 829 828 830 829 /** 831 - * struct iwl_statistics_rx_ntfy 830 + * struct iwl_statistics_rx_ntfy - RX statistics notification 832 831 * 833 832 * @hdr: general statistics header 834 833 * @rx_agg_mpdu_cnt: aggregation frame count (number of ··· 868 867 } __packed; /* STATISTICS_RX_NTFY_API_S_VER_1 */ 869 868 870 869 /** 871 - * struct iwl_statistics_tx_ntfy 870 + * struct iwl_statistics_tx_ntfy - TX statistics notification 872 871 * 873 872 * @hdr: general statistics header 874 873 * @cts_timeout: timeout when waiting for CTS ··· 977 976 } __packed; /* STATISTICS_TX_NTFY_API_S_VER_1 */ 978 977 979 978 /** 980 - * struct iwl_statistics_duration_ntfy 979 + * struct iwl_statistics_duration_ntfy - burst/duration statistics 981 980 * 982 981 * @hdr: general statistics header 983 982 * @cont_burst_chk_cnt: number of times continuation or ··· 996 995 } __packed; /* STATISTICS_DURATION_NTFY_API_S_VER_1 */ 997 996 998 997 /** 999 - * struct iwl_statistics_he_ntfy 998 + * struct iwl_statistics_he_ntfy - HE statistics 1000 999 * 1001 1000 * @hdr: general statistics header 1002 1001 * received HE frames
+1 -1
drivers/net/wireless/intel/iwlwifi/fw/api/tx.h
··· 963 963 } __packed; /* SCD_QUEUE_CFG_CMD_API_S_VER_1 */ 964 964 965 965 /** 966 - * struct iwl_scd_txq_cfg_rsp 966 + * struct iwl_scd_txq_cfg_rsp - scheduler TXQ configuration response 967 967 * @token: taken from the command 968 968 * @sta_id: station id from the command 969 969 * @tid: tid from the command
+2 -2
drivers/net/wireless/intel/iwlwifi/fw/error-dump.h
··· 266 266 } __packed; 267 267 268 268 /** 269 - * struct iwl_fw_ini_dump_entry 269 + * struct iwl_fw_ini_dump_entry - dump entry descriptor 270 270 * @list: list of dump entries 271 271 * @size: size of the data 272 272 * @data: entry data ··· 305 305 * @dram_base_addr: base address of dram monitor range 306 306 * @page_num: page number of memory range 307 307 * @fifo_hdr: fifo header of memory range 308 - * @fw_pkt: FW packet header of memory range 308 + * @fw_pkt_hdr: FW packet header of memory range 309 309 * @data: the actual memory 310 310 */ 311 311 struct iwl_fw_ini_error_dump_range {
+55 -19
drivers/net/wireless/intel/iwlwifi/fw/file.h
··· 222 222 * @IWL_UCODE_TLV_API_STA_TYPE: This ucode supports station type assignement. 223 223 * @IWL_UCODE_TLV_API_NAN2_VER2: This ucode supports NAN API version 2 224 224 * @IWL_UCODE_TLV_API_ADAPTIVE_DWELL: support for adaptive dwell in scanning 225 + * @IWL_UCODE_TLV_API_OCE: support for OCE 226 + * @IWL_UCODE_TLV_API_NEW_BEACON_TEMPLATE: new beacon template 225 227 * @IWL_UCODE_TLV_API_NEW_RX_STATS: should new RX STATISTICS API be used 228 + * @IWL_UCODE_TLV_API_WOWLAN_KEY_MATERIAL: WoWLAN key material support 226 229 * @IWL_UCODE_TLV_API_QUOTA_LOW_LATENCY: Quota command includes a field 227 230 * indicating low latency direction. 228 231 * @IWL_UCODE_TLV_API_DEPRECATE_TTAK: RX status flag TTAK ok (bit 7) is ··· 248 245 * SCAN_OFFLOAD_PROFILES_QUERY_RSP_S. 249 246 * @IWL_UCODE_TLV_API_MBSSID_HE: This ucode supports v2 of 250 247 * STA_CONTEXT_DOT11AX_API_S 248 + * @IWL_UCODE_TLV_API_WOWLAN_TCP_SYN_WAKE: WoWLAN TCP-SYN wake support 251 249 * @IWL_UCODE_TLV_API_FTM_RTT_ACCURACY: version 7 of the range response API 252 250 * is supported by FW, this indicates the RTT confidence value 253 251 * @IWL_UCODE_TLV_API_SAR_TABLE_VER: This ucode supports different sar ··· 257 253 * SCAN_CONFIG_DB_CMD_API_S. 258 254 * @IWL_UCODE_TLV_API_ADWELL_HB_DEF_N_AP: support for setting adaptive dwell 259 255 * number of APs in the 5 GHz band 256 + * @IWL_UCODE_TLV_API_SCAN_EXT_CHAN_VER: extended channel config in scan 260 257 * @IWL_UCODE_TLV_API_BAND_IN_RX_DATA: FW reports band number in RX notification 261 258 * @IWL_UCODE_TLV_API_NO_HOST_DISABLE_TX: Firmware offloaded the station disable tx 262 259 * logic. ··· 357 352 * @IWL_UCODE_TLV_CAPA_SOC_LATENCY_SUPPORT: the firmware supports setting 358 353 * stabilization latency for SoCs. 359 354 * @IWL_UCODE_TLV_CAPA_STA_PM_NOTIF: firmware will send STA PM notification 355 + * @IWL_UCODE_TLV_CAPA_BINDING_CDB_SUPPORT: binding CDB support 356 + * @IWL_UCODE_TLV_CAPA_CDB_SUPPORT: CDB support 357 + * @IWL_UCODE_TLV_CAPA_D0I3_END_FIRST: D0I3 end command comes first 360 358 * @IWL_UCODE_TLV_CAPA_TLC_OFFLOAD: firmware implements rate scaling algorithm 361 359 * @IWL_UCODE_TLV_CAPA_DYNAMIC_QUOTA: firmware implements quota related 362 360 * @IWL_UCODE_TLV_CAPA_COEX_SCHEMA_2: firmware implements Coex Schema 2 363 - * IWL_UCODE_TLV_CAPA_CHANNEL_SWITCH_CMD: firmware supports CSA command 361 + * @IWL_UCODE_TLV_CAPA_CHANNEL_SWITCH_CMD: firmware supports CSA command 364 362 * @IWL_UCODE_TLV_CAPA_ULTRA_HB_CHANNELS: firmware supports ultra high band 365 363 * (6 GHz). 366 364 * @IWL_UCODE_TLV_CAPA_CS_MODIFY: firmware supports modify action CSA command 365 + * @IWL_UCODE_TLV_CAPA_SET_LTR_GEN2: LTR gen2 support 366 + * @IWL_UCODE_TLV_CAPA_TAS_CFG: TAS configuration support 367 + * @IWL_UCODE_TLV_CAPA_SESSION_PROT_CMD: session protection command 368 + * @IWL_UCODE_TLV_CAPA_SET_PPAG: PPAG support 367 369 * @IWL_UCODE_TLV_CAPA_EXTENDED_DTS_MEASURE: extended DTS measurement 368 370 * @IWL_UCODE_TLV_CAPA_SHORT_PM_TIMEOUTS: supports short PM timeouts 369 371 * @IWL_UCODE_TLV_CAPA_BT_MPLUT_SUPPORT: supports bt-coex Multi-priority LUT 372 + * @IWL_UCODE_TLV_CAPA_MULTI_QUEUE_RX_SUPPORT: MQ RX support 370 373 * @IWL_UCODE_TLV_CAPA_CSA_AND_TBTT_OFFLOAD: the firmware supports CSA 371 374 * countdown offloading. Beacon notifications are not sent to the host. 372 375 * The fw also offloads TBTT alignment. ··· 396 383 * command size (command version 4) that supports toggling ACK TX 397 384 * power reduction. 398 385 * @IWL_UCODE_TLV_CAPA_D3_DEBUG: supports debug recording during D3 386 + * @IWL_UCODE_TLV_CAPA_LED_CMD_SUPPORT: LED command support 399 387 * @IWL_UCODE_TLV_CAPA_MCC_UPDATE_11AX_SUPPORT: MCC response support 11ax 400 388 * capability. 401 389 * @IWL_UCODE_TLV_CAPA_CSI_REPORTING: firmware is capable of being configured 402 390 * to report the CSI information with (certain) RX frames 391 + * @IWL_UCODE_TLV_CAPA_DBG_SUSPEND_RESUME_CMD_SUPP: suspend/resume command 392 + * @IWL_UCODE_TLV_CAPA_DBG_BUF_ALLOC_CMD_SUPP: support for DBGC 393 + * buffer allocation command 403 394 * @IWL_UCODE_TLV_CAPA_FTM_CALIBRATED: has FTM calibrated and thus supports both 404 395 * initiator and responder 405 396 * @IWL_UCODE_TLV_CAPA_BIOS_OVERRIDE_UNII4_US_CA: supports (de)activating UNII-4 406 397 * for US/CA/WW from BIOS 398 + * @IWL_UCODE_TLV_CAPA_PSC_CHAN_SUPPORT: supports PSC channels 399 + * @IWL_UCODE_TLV_CAPA_BIGTK_SUPPORT: BIGTK support 407 400 * @IWL_UCODE_TLV_CAPA_PROTECTED_TWT: Supports protection of TWT action frames 408 401 * @IWL_UCODE_TLV_CAPA_FW_RESET_HANDSHAKE: Supports the firmware handshake in 409 402 * reset flow 410 403 * @IWL_UCODE_TLV_CAPA_PASSIVE_6GHZ_SCAN: Support for passive scan on 6GHz PSC 411 404 * channels even when these are not enabled. 405 + * @IWL_UCODE_TLV_CAPA_HIDDEN_6GHZ_SCAN: hidden SSID 6 GHz scan support 406 + * @IWL_UCODE_TLV_CAPA_BROADCAST_TWT: broadcast TWT support 407 + * @IWL_UCODE_TLV_CAPA_COEX_HIGH_PRIO: support for BT-coex high 408 + * priority for 802.1X/4-way-HS 409 + * @IWL_UCODE_TLV_CAPA_BAID_ML_SUPPORT: multi-link BAID support 410 + * @IWL_UCODE_TLV_CAPA_SYNCED_TIME: synced time command support 411 + * @IWL_UCODE_TLV_CAPA_TIME_SYNC_BOTH_FTM_TM: time sync support 412 + * @IWL_UCODE_TLV_CAPA_BIGTK_TX_SUPPORT: BIGTK TX support 413 + * @IWL_UCODE_TLV_CAPA_MLD_API_SUPPORT: MLD API support 414 + * @IWL_UCODE_TLV_CAPA_SCAN_DONT_TOGGLE_ANT: fixed antenna scan support 415 + * @IWL_UCODE_TLV_CAPA_PPAG_CHINA_BIOS_SUPPORT: PPAG China BIOS support 416 + * @IWL_UCODE_TLV_CAPA_OFFLOAD_BTM_SUPPORT: BTM protocol offload support 417 + * @IWL_UCODE_TLV_CAPA_STA_EXP_MFP_SUPPORT: STA command MFP support 418 + * @IWL_UCODE_TLV_CAPA_SNIFF_VALIDATE_SUPPORT: sniffer validate bits support 419 + * @IWL_UCODE_TLV_CAPA_CHINA_22_REG_SUPPORT: China 2022 regulator support 412 420 * @IWL_UCODE_TLV_CAPA_DUMP_COMPLETE_SUPPORT: Support for indicating dump collection 413 421 * complete to FW. 414 422 * @IWL_UCODE_TLV_CAPA_SPP_AMSDU_SUPPORT: Support SPP (signaling and payload 415 423 * protected) A-MSDU. 424 + * @IWL_UCODE_TLV_CAPA_DRAM_FRAG_SUPPORT: support for DBGC fragmented 425 + * DRAM buffers 416 426 * @IWL_UCODE_TLV_CAPA_SECURE_LTF_SUPPORT: Support secure LTF measurement. 417 427 * @IWL_UCODE_TLV_CAPA_MONITOR_PASSIVE_CHANS: Support monitor mode on otherwise 418 428 * passive channels ··· 443 407 * for CA from BIOS. 444 408 * @IWL_UCODE_TLV_CAPA_UHB_CANADA_TAS_SUPPORT: supports %TAS_UHB_ALLOWED_CANADA 445 409 * @IWL_UCODE_TLV_CAPA_EXT_FSEQ_IMAGE_SUPPORT: external FSEQ image support 410 + * @IWL_UCODE_TLV_CAPA_RESET_DURING_ASSERT: FW reset handshake is needed 411 + * during assert handling even if the dump isn't split 446 412 * @IWL_UCODE_TLV_CAPA_FW_ACCEPTS_RAW_DSM_TABLE: Firmware has capability of 447 413 * handling raw DSM table data. 448 414 * ··· 525 487 526 488 /* set 3 */ 527 489 IWL_UCODE_TLV_CAPA_BIOS_OVERRIDE_UNII4_US_CA = (__force iwl_ucode_tlv_capa_t)96, 528 - 529 - /* 530 - * @IWL_UCODE_TLV_CAPA_PSC_CHAN_SUPPORT: supports PSC channels 531 - */ 532 490 IWL_UCODE_TLV_CAPA_PSC_CHAN_SUPPORT = (__force iwl_ucode_tlv_capa_t)98, 533 - 534 491 IWL_UCODE_TLV_CAPA_BIGTK_SUPPORT = (__force iwl_ucode_tlv_capa_t)100, 535 492 IWL_UCODE_TLV_CAPA_SPP_AMSDU_SUPPORT = (__force iwl_ucode_tlv_capa_t)103, 536 493 IWL_UCODE_TLV_CAPA_DRAM_FRAG_SUPPORT = (__force iwl_ucode_tlv_capa_t)104, ··· 547 514 IWL_UCODE_TLV_CAPA_EXT_FSEQ_IMAGE_SUPPORT = (__force iwl_ucode_tlv_capa_t)125, 548 515 549 516 /* set 4 */ 550 - /** 551 - * @IWL_UCODE_TLV_CAPA_RESET_DURING_ASSERT: FW reset handshake is needed 552 - * during assert handling even if the dump isn't split 553 - */ 554 - IWL_UCODE_TLV_CAPA_RESET_DURING_ASSERT = (__force iwl_ucode_tlv_capa_t)(4 * 32 + 0), 517 + 518 + IWL_UCODE_TLV_CAPA_RESET_DURING_ASSERT = (__force iwl_ucode_tlv_capa_t)(4 * 32 + 0), 555 519 IWL_UCODE_TLV_CAPA_FW_ACCEPTS_RAW_DSM_TABLE = (__force iwl_ucode_tlv_capa_t)(4 * 32 + 1), 556 520 NUM_IWL_UCODE_TLV_CAPA 557 521 /* ··· 882 852 * @start_assoc_denied: number of denied association to start recording 883 853 * @start_assoc_timeout: number of association timeout to start recording 884 854 * @start_connection_loss: number of connection loss to start recording 855 + * @reserved: reserved 856 + * @reserved2: reserved 885 857 */ 886 858 struct iwl_fw_dbg_trigger_mlme { 887 859 u8 stop_auth_denied; ··· 917 885 * @p2p_device: timeout for the queues of a P2P device in ms 918 886 * @ibss: timeout for the queues of an IBSS in ms 919 887 * @tdls: timeout for the queues of a TDLS station in ms 888 + * @reserved: reserved 920 889 */ 921 890 struct iwl_fw_dbg_trigger_txq_timer { 922 891 __le32 command_queue; ··· 933 900 934 901 /** 935 902 * struct iwl_fw_dbg_trigger_time_event - configures a time event trigger 936 - * time_Events: a list of tuples <id, action_bitmap>. The driver will issue a 903 + * @time_events: a list of tuples <id, action_bitmap>. The driver will issue a 937 904 * trigger each time a time event notification that relates to time event 938 905 * id with one of the actions in the bitmap is received and 939 906 * BIT(notif->status) is set in status_bitmap. ··· 949 916 950 917 /** 951 918 * struct iwl_fw_dbg_trigger_ba - configures BlockAck related trigger 952 - * rx_ba_start: tid bitmap to configure on what tid the trigger should occur 919 + * @rx_ba_start: tid bitmap to configure on what tid the trigger should occur 953 920 * when an Rx BlockAck session is started. 954 - * rx_ba_stop: tid bitmap to configure on what tid the trigger should occur 921 + * @rx_ba_stop: tid bitmap to configure on what tid the trigger should occur 955 922 * when an Rx BlockAck session is stopped. 956 - * tx_ba_start: tid bitmap to configure on what tid the trigger should occur 923 + * @tx_ba_start: tid bitmap to configure on what tid the trigger should occur 957 924 * when a Tx BlockAck session is started. 958 - * tx_ba_stop: tid bitmap to configure on what tid the trigger should occur 925 + * @tx_ba_stop: tid bitmap to configure on what tid the trigger should occur 959 926 * when a Tx BlockAck session is stopped. 960 - * rx_bar: tid bitmap to configure on what tid the trigger should occur 927 + * @rx_bar: tid bitmap to configure on what tid the trigger should occur 961 928 * when a BAR is received (for a Tx BlockAck session). 962 - * tx_bar: tid bitmap to configure on what tid the trigger should occur 929 + * @tx_bar: tid bitmap to configure on what tid the trigger should occur 963 930 * when a BAR is send (for an Rx BlocAck session). 964 - * frame_timeout: tid bitmap to configure on what tid the trigger should occur 931 + * @frame_timeout: tid bitmap to configure on what tid the trigger should occur 965 932 * when a frame times out in the reordering buffer. 966 933 */ 967 934 struct iwl_fw_dbg_trigger_ba { ··· 979 946 * @action_bitmap: the TDLS action to trigger the collection upon 980 947 * @peer_mode: trigger on specific peer or all 981 948 * @peer: the TDLS peer to trigger the collection on 949 + * @reserved: reserved 982 950 */ 983 951 struct iwl_fw_dbg_trigger_tdls { 984 952 u8 action_bitmap; ··· 992 958 * struct iwl_fw_dbg_trigger_tx_status - configures trigger for tx response 993 959 * status. 994 960 * @statuses: the list of statuses to trigger the collection on 961 + * @reserved: reserved 995 962 */ 996 963 struct iwl_fw_dbg_trigger_tx_status { 997 964 struct tx_status { ··· 1006 971 * struct iwl_fw_dbg_conf_tlv - a TLV that describes a debug configuration. 1007 972 * @id: conf id 1008 973 * @usniffer: should the uSniffer image be used 974 + * @reserved: reserved 1009 975 * @num_of_hcmds: how many HCMDs to send are present here 1010 976 * @hcmd: a variable length host command to be sent to apply the configuration. 1011 977 * If there is more than one HCMD to send, they will appear one after the
+8 -4
drivers/net/wireless/intel/iwlwifi/fw/img.h
··· 14 14 #include "error-dump.h" 15 15 16 16 /** 17 - * enum iwl_ucode_type 18 - * 19 - * The type of ucode. 17 + * enum iwl_ucode_type - type of ucode 20 18 * 21 19 * @IWL_UCODE_REGULAR: Normal runtime ucode 22 20 * @IWL_UCODE_INIT: Initial ucode 23 21 * @IWL_UCODE_WOWLAN: Wake on Wireless enabled ucode 24 22 * @IWL_UCODE_REGULAR_USNIFFER: Normal runtime ucode when using usniffer image 23 + * @IWL_UCODE_TYPE_MAX: (internal value) 25 24 */ 26 25 enum iwl_ucode_type { 27 26 IWL_UCODE_REGULAR, ··· 121 122 #define FW_ADDR_CACHE_CONTROL 0xC0000000UL 122 123 123 124 /** 124 - * struct iwl_fw_paging 125 + * struct iwl_fw_paging - FW paging descriptor 125 126 * @fw_paging_phys: page phy pointer 126 127 * @fw_paging_block: pointer to the allocated block 127 128 * @fw_paging_size: page size ··· 196 197 * @dump_excl_wowlan: image dump exclusion areas for WoWLAN image 197 198 * @pnvm_data: PNVM data embedded in the .ucode file, if any 198 199 * @pnvm_size: size of the embedded PNVM data 200 + * @dbg: debug data, see &struct iwl_fw_dbg 201 + * @default_calib: default calibration data 202 + * @phy_config: PHY configuration flags 203 + * @valid_rx_ant: valid RX antenna bitmap 204 + * @valid_tx_ant: valid TX antenna bitmap 199 205 */ 200 206 struct iwl_fw { 201 207 u32 ucode_ver;
+4 -22
drivers/net/wireless/intel/iwlwifi/fw/regulatory.c
··· 543 543 544 544 switch (cmd_ver) { 545 545 case 12: 546 - case 11: 547 546 cmd_size = sizeof(struct iwl_lari_config_change_cmd); 548 547 break; 549 - case 10: 550 - cmd_size = sizeof(struct iwl_lari_config_change_cmd_v10); 551 - break; 552 - case 9: 553 548 case 8: 554 - case 7: 555 - cmd_size = sizeof(struct iwl_lari_config_change_cmd_v7); 549 + cmd_size = sizeof(struct iwl_lari_config_change_cmd_v8); 556 550 break; 557 551 case 6: 558 552 cmd_size = sizeof(struct iwl_lari_config_change_cmd_v6); 559 - break; 560 - case 5: 561 - cmd_size = sizeof(struct iwl_lari_config_change_cmd_v5); 562 - break; 563 - case 4: 564 - cmd_size = sizeof(struct iwl_lari_config_change_cmd_v4); 565 - break; 566 - case 3: 567 - cmd_size = sizeof(struct iwl_lari_config_change_cmd_v3); 568 - break; 569 - case 2: 570 - cmd_size = sizeof(struct iwl_lari_config_change_cmd_v2); 571 553 break; 572 554 default: 573 555 cmd_size = sizeof(struct iwl_lari_config_change_cmd_v1); ··· 591 609 if (!has_raw_dsm_capa) 592 610 value &= DSM_UNII4_ALLOW_BITMAP; 593 611 594 - /* Since version 9, bits 4 and 5 are supported 612 + /* Since version 12, bits 4 and 5 are supported 595 613 * regardless of this capability, By pass this masking 596 614 * if firmware has capability of accepting raw DSM table. 597 615 */ 598 - if (!has_raw_dsm_capa && cmd_ver < 9 && 616 + if (!has_raw_dsm_capa && cmd_ver < 12 && 599 617 !fw_has_capa(&fwrt->fw->ucode_capa, 600 618 IWL_UCODE_TLV_CAPA_BIOS_OVERRIDE_5G9_FOR_CA)) 601 619 value &= ~(DSM_VALUE_UNII4_CANADA_OVERRIDE_MSK | ··· 619 637 if (!has_raw_dsm_capa && cmd_ver < 12 && 620 638 !fw_has_capa(&fwrt->fw->ucode_capa, 621 639 IWL_UCODE_TLV_CAPA_BIOS_OVERRIDE_UNII4_US_CA)) 622 - value &= CHAN_STATE_ACTIVE_BITMAP_CMD_V11; 640 + value &= CHAN_STATE_ACTIVE_BITMAP_CMD_V8; 623 641 624 642 cmd->chan_state_active_bitmap = cpu_to_le32(value); 625 643 }
+21 -1
drivers/net/wireless/intel/iwlwifi/fw/runtime.h
··· 45 45 * struct iwl_fwrt_dump_data - dump data 46 46 * @trig: trigger the worker was scheduled upon 47 47 * @fw_pkt: packet received from FW 48 + * @desc: dump descriptor 49 + * @monitor_only: only dump for monitor 48 50 * 49 51 * Note that the decision which part of the union is used 50 52 * is based on iwl_trans_dbg_ini_valid(): the 'trig' part ··· 70 68 * struct iwl_fwrt_wk_data - dump worker data struct 71 69 * @idx: index of the worker 72 70 * @wk: worker 71 + * @dump_data: dump data 73 72 */ 74 73 struct iwl_fwrt_wk_data { 75 74 u8 idx; ··· 94 91 95 92 /** 96 93 * struct iwl_fw_runtime - runtime data for firmware 94 + * @trans: transport pointer 97 95 * @fw: firmware image 98 - * @cfg: NIC configuration 99 96 * @dev: device pointer 100 97 * @ops: user ops 101 98 * @ops_ctx: user ops context ··· 120 117 * zero (default initialization) means it hasn't been read yet, 121 118 * and BIT(0) is set when it has since function 0 also has this 122 119 * bitmap and is always supported 120 + * @geo_enabled: WGDS table is present 121 + * @geo_num_profiles: number of geo profiles 122 + * @geo_rev: geo profiles table revision 123 + * @ppag_chains: PPAG table data 124 + * @ppag_flags: PPAG flags 125 + * @reduced_power_flags: reduced power flags 126 + * @sanitize_ctx: context for dump sanitizer 127 + * @sanitize_ops: dump sanitizer ops 128 + * @sar_chain_a_profile: SAR chain A profile 129 + * @sar_chain_b_profile: SAR chain B profile 130 + * @sgom_enabled: SGOM enabled 131 + * @sgom_table: SGOM table 132 + * @timestamp: timestamp marker data 133 + * @timestamp.wk: timestamp marking worker 134 + * @timestamp.seq: timestamp marking sequence 135 + * @timestamp.delay: timestamp marking worker delay 136 + * @tpc_enabled: TPC enabled 123 137 */ 124 138 struct iwl_fw_runtime { 125 139 struct iwl_trans *trans;
+7 -4
drivers/net/wireless/intel/iwlwifi/iwl-config.h
··· 170 170 * for aggregation 171 171 * @min_txq_size: minimum number of slots required in a TX queue 172 172 * @gp2_reg_addr: GP2 (timer) register address 173 - * @min_umac_error_event_table: minimum SMEM location of UMAC error table 174 173 * @mon_dbgi_regs: monitor DBGI registers 175 174 * @mon_dram_regs: monitor DRAM registers 176 175 * @mon_smem_regs: monitor SMEM registers ··· 202 203 netdev_features_t features; 203 204 u32 smem_offset; 204 205 u32 smem_len; 205 - u32 min_umac_error_event_table; 206 206 u32 d3_debug_data_base_addr; 207 207 u32 d3_debug_data_length; 208 208 u32 min_txq_size; ··· 383 385 #define IWL_NUM_RBDS_EHT (512 * 8) 384 386 385 387 /** 386 - * struct iwl_rf_cfg 388 + * struct iwl_rf_cfg - RF/CRF configuration data 387 389 * @fw_name_pre: Firmware filename prefix. The api version and extension 388 390 * (.ucode) will be added to filename before loading from disk. The 389 391 * filename is constructed as <fw_name_pre>-<api>.ucode. ··· 416 418 * @vht_mu_mimo_supported: VHT MU-MIMO support 417 419 * @nvm_type: see &enum iwl_nvm_type 418 420 * @uhb_supported: ultra high band channels supported 421 + * @eht_supported: EHT supported 419 422 * @num_rbds: number of receive buffer descriptors to use 420 423 * (only used for multi-queue capable devices) 421 424 * ··· 449 450 host_interrupt_operation_mode:1, 450 451 lp_xtal_workaround:1, 451 452 vht_mu_mimo_supported:1, 452 - uhb_supported:1; 453 + uhb_supported:1, 454 + eht_supported:1; 453 455 u8 valid_tx_ant; 454 456 u8 valid_rx_ant; 455 457 u8 non_shared_ant; ··· 686 686 extern const char iwl_killer_bn1850w2_name[]; 687 687 extern const char iwl_killer_bn1850i_name[]; 688 688 extern const char iwl_bn201_name[]; 689 + extern const char iwl_bn203_name[]; 689 690 extern const char iwl_be221_name[]; 690 691 extern const char iwl_be223_name[]; 692 + extern const char iwl_ax221_name[]; 691 693 #if IS_ENABLED(CONFIG_IWLDVM) 692 694 extern const struct iwl_rf_cfg iwl5300_agn_cfg; 693 695 extern const struct iwl_rf_cfg iwl5350_agn_cfg; ··· 745 743 extern const struct iwl_rf_cfg iwl_rf_fm_160mhz; 746 744 #define iwl_rf_wh iwl_rf_fm 747 745 #define iwl_rf_wh_160mhz iwl_rf_fm_160mhz 746 + extern const struct iwl_rf_cfg iwl_rf_wh_non_eht; 748 747 #define iwl_rf_pe iwl_rf_fm 749 748 #endif /* CONFIG_IWLMLD */ 750 749
+2 -2
drivers/net/wireless/intel/iwlwifi/iwl-dbg-tlv.h
··· 1 1 /* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ 2 2 /* 3 - * Copyright (C) 2018-2023 Intel Corporation 3 + * Copyright (C) 2018-2023, 2025 Intel Corporation 4 4 */ 5 5 #ifndef __iwl_dbg_tlv_h__ 6 6 #define __iwl_dbg_tlv_h__ ··· 32 32 }; 33 33 34 34 /** 35 - * struct iwl_dbg_tlv_time_point_data 35 + * struct iwl_dbg_tlv_time_point_data - debug time point data 36 36 * @trig_list: list of triggers 37 37 * @active_trig_list: list of active triggers 38 38 * @hcmd_list: list of host commands
+9 -20
drivers/net/wireless/intel/iwlwifi/iwl-drv.c
··· 177 177 return 'a' + step; 178 178 } 179 179 180 - static bool iwl_drv_is_wifi7_supported(struct iwl_trans *trans) 180 + bool iwl_drv_is_wifi7_supported(struct iwl_trans *trans) 181 181 { 182 - return CSR_HW_RFID_TYPE(trans->info.hw_rf_id) >= IWL_CFG_RF_TYPE_FM; 182 + return trans->mac_cfg->device_family >= IWL_DEVICE_FAMILY_BZ && 183 + CSR_HW_RFID_TYPE(trans->info.hw_rf_id) >= IWL_CFG_RF_TYPE_FM; 183 184 } 184 185 185 186 const char *iwl_drv_get_fwname_pre(struct iwl_trans *trans, char *buf) ··· 348 347 349 348 if (first) 350 349 drv->fw_index = ucode_api_max; 351 - else if (drv->fw_index == ENCODE_CORE_AS_API(99)) 352 - drv->fw_index = 101; /* last API-scheme number below core 99 */ 350 + else if (drv->fw_index == ENCODE_CORE_AS_API(100)) 351 + drv->fw_index = 102; /* last API-scheme number below core 100 */ 353 352 else 354 353 drv->fw_index--; 355 354 ··· 428 427 size_t dbg_trigger_tlv_len[FW_DBG_TRIGGER_MAX]; 429 428 struct iwl_fw_dbg_mem_seg_tlv *dbg_mem_tlv; 430 429 size_t n_mem_tlv; 431 - u32 major; 432 430 }; 433 431 434 432 static void alloc_sec_data(struct iwl_firmware_pieces *pieces, ··· 1069 1069 break; 1070 1070 case IWL_UCODE_TLV_FW_VERSION: { 1071 1071 const __le32 *ptr = (const void *)tlv_data; 1072 - u32 minor; 1072 + u32 major, minor; 1073 1073 u8 local_comp; 1074 1074 1075 1075 if (tlv_len != sizeof(u32) * 3) 1076 1076 goto invalid_tlv_len; 1077 1077 1078 - pieces->major = le32_to_cpup(ptr++); 1078 + major = le32_to_cpup(ptr++); 1079 1079 minor = le32_to_cpup(ptr++); 1080 1080 local_comp = le32_to_cpup(ptr); 1081 1081 1082 1082 snprintf(drv->fw.fw_version, 1083 1083 sizeof(drv->fw.fw_version), 1084 - "%u.%08x.%u %s", pieces->major, minor, 1084 + "%u.%08x.%u %s", major, minor, 1085 1085 local_comp, iwl_reduced_fw_name(drv)); 1086 1086 break; 1087 1087 } ··· 1589 1589 } 1590 1590 } 1591 1591 1592 - #define IWL_MLD_SUPPORTED_FW_VERSION 97 1593 - 1594 1592 /* 1595 1593 * iwl_req_fw_callback - callback when firmware was loaded 1596 1594 * ··· 1857 1859 } 1858 1860 1859 1861 #if IS_ENABLED(CONFIG_IWLMLD) 1860 - if (pieces->major >= IWL_MLD_SUPPORTED_FW_VERSION && 1861 - iwl_drv_is_wifi7_supported(drv->trans)) 1862 + if (iwl_drv_is_wifi7_supported(drv->trans)) 1862 1863 op = &iwlwifi_opmode_table[MLD_OP_MODE]; 1863 - #else 1864 - if (pieces->major >= IWL_MLD_SUPPORTED_FW_VERSION && 1865 - iwl_drv_is_wifi7_supported(drv->trans)) { 1866 - IWL_ERR(drv, 1867 - "IWLMLD needs to be compiled to support this firmware\n"); 1868 - mutex_unlock(&iwlwifi_opmode_table_mtx); 1869 - goto out_unbind; 1870 - } 1871 1864 #endif 1872 1865 1873 1866 IWL_INFO(drv, "loaded firmware version %s op_mode %s\n",
+8 -1
drivers/net/wireless/intel/iwlwifi/iwl-drv.h
··· 62 62 * starts the driver: fetches the firmware. This should be called by bus 63 63 * specific system flows implementations. For example, the bus specific probe 64 64 * function should do bus related operations only, and then call to this 65 - * function. It returns the driver object or %NULL if an error occurred. 65 + * function. 66 + * Return: the driver object or %NULL if an error occurred. 66 67 */ 67 68 struct iwl_drv *iwl_drv_start(struct iwl_trans *trans); 68 69 ··· 77 76 * call this function and then do the bus related operations only. 78 77 */ 79 78 void iwl_drv_stop(struct iwl_drv *drv); 79 + 80 + /* 81 + * iwl_drv_is_wifi7_supported - returns if wifi7 is supported 82 + * If yes, iwlmld needs to be used to drive the device. 83 + */ 84 + bool iwl_drv_is_wifi7_supported(struct iwl_trans *trans); 80 85 81 86 /* 82 87 * exported symbol management
+2 -2
drivers/net/wireless/intel/iwlwifi/iwl-modparams.h
··· 1 1 /* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ 2 2 /* 3 - * Copyright (C) 2005-2014, 2018-2022, 2024 Intel Corporation 3 + * Copyright (C) 2005-2014, 2018-2022, 2024-2025 Intel Corporation 4 4 */ 5 5 #ifndef __iwl_modparams_h__ 6 6 #define __iwl_modparams_h__ ··· 42 42 }; 43 43 44 44 /** 45 - * struct iwl_mod_params 45 + * struct iwl_mod_params - module parameters for iwlwifi 46 46 * 47 47 * Holds the module parameters 48 48 *
+1 -1
drivers/net/wireless/intel/iwlwifi/iwl-nvm-parse.c
··· 2080 2080 !!(mac_flags & NVM_MAC_SKU_FLAGS_BAND_5_2_ENABLED); 2081 2081 nvm->sku_cap_mimo_disabled = 2082 2082 !!(mac_flags & NVM_MAC_SKU_FLAGS_MIMO_DISABLED); 2083 - if (CSR_HW_RFID_TYPE(trans->info.hw_rf_id) >= IWL_CFG_RF_TYPE_FM) 2083 + if (trans->cfg->eht_supported) 2084 2084 nvm->sku_cap_11be_enable = true; 2085 2085 2086 2086 /* Initialize PHY sku data */
+12 -5
drivers/net/wireless/intel/iwlwifi/iwl-nvm-parse.h
··· 115 115 * iwl_parse_nvm_mcc_info - parse MCC (mobile country code) info coming from FW 116 116 * 117 117 * This function parses the regulatory channel data received as a 118 - * MCC_UPDATE_CMD command. It returns a newly allocation regulatory domain, 119 - * to be fed into the regulatory core. In case the geo_info is set handle 120 - * accordingly. An ERR_PTR is returned on error. 121 - * If not given to the regulatory core, the user is responsible for freeing 122 - * the regdomain returned here with kfree. 118 + * MCC_UPDATE_CMD command. 119 + * 120 + * Return: a newly allocation regulatory domain, to be given to the regulatory 121 + * core. In case the geo_info is set handle accordingly. An ERR_PTR is 122 + * returned on error. If not given to the regulatory core, the user is 123 + * responsible for freeing the regdomain returned here with kfree(). 123 124 * 124 125 * @trans: the transport 125 126 * @num_of_ch: the number of channels ··· 141 140 * This struct holds an NVM section read from the NIC using NVM_ACCESS_CMD, 142 141 * and saved for later use by the driver. Not all NVM sections are saved 143 142 * this way, only the needed ones. 143 + * @length: length of the section 144 + * @data: section data 144 145 */ 145 146 struct iwl_nvm_section { 146 147 u16 length; ··· 151 148 152 149 /** 153 150 * iwl_read_external_nvm - Reads external NVM from a file into nvm_sections 151 + * @trans: the transport 152 + * @nvm_file_name: the filename to request 153 + * @nvm_sections: sections data to fill 154 + * Return: 0 on success or an error code 154 155 */ 155 156 int iwl_read_external_nvm(struct iwl_trans *trans, 156 157 const char *nvm_file_name,
+1
drivers/net/wireless/intel/iwlwifi/iwl-op-mode.h
··· 185 185 /** 186 186 * struct iwl_op_mode - operational mode 187 187 * @ops: pointer to its own ops 188 + * @op_mode_specific: per-opmode data 188 189 * 189 190 * This holds an implementation of the mac80211 / fw API. 190 191 */
+3 -3
drivers/net/wireless/intel/iwlwifi/iwl-trans.h
··· 121 121 #define DEF_CMD_PAYLOAD_SIZE 320 122 122 123 123 /** 124 - * struct iwl_device_cmd 124 + * struct iwl_device_cmd - device command structure 125 125 * 126 126 * For allocation of the command and tx queues, this establishes the overall 127 127 * size of the largest command we send to uCode, except for commands that ··· 516 516 */ 517 517 518 518 /** 519 - * enum iwl_ini_cfg_state 519 + * enum iwl_ini_cfg_state - debug config state 520 520 * @IWL_INI_CFG_STATE_NOT_LOADED: no debug cfg was given 521 521 * @IWL_INI_CFG_STATE_LOADED: debug cfg was found and loaded 522 522 * @IWL_INI_CFG_STATE_CORRUPTED: debug cfg was found and some of the TLVs ··· 532 532 #define IWL_TRANS_NMI_TIMEOUT (HZ / 4) 533 533 534 534 /** 535 - * struct iwl_dram_data 535 + * struct iwl_dram_data - DRAM data descriptor 536 536 * @physical: page phy pointer 537 537 * @block: pointer to the allocated block/page 538 538 * @size: size of the block/page
+2
drivers/net/wireless/intel/iwlwifi/mld/constants.h
··· 75 75 #define IWL_MLD_FTM_RESP_LMR_FEEDBACK_SUPPORT true 76 76 #define IWL_MLD_FTM_NON_TB_MIN_TIME_BETWEEN_MSR 7 77 77 #define IWL_MLD_FTM_NON_TB_MAX_TIME_BETWEEN_MSR 1000 78 + #define IWL_MLD_STA_EXT_CAPA_SIZE 9 79 + #define IWL_MLD_EXT_CAPA_NUM_IFTYPES 1 78 80 79 81 #endif /* __iwl_mld_constants_h__ */
+4
drivers/net/wireless/intel/iwlwifi/mld/d3.c
··· 1794 1794 u32 enabled = 0; 1795 1795 1796 1796 cmd = kzalloc(hcmd.len[0], GFP_KERNEL); 1797 + if (!cmd) { 1798 + IWL_DEBUG_WOWLAN(mld, "Failed to allocate proto offload cmd\n"); 1799 + return -ENOMEM; 1800 + } 1797 1801 1798 1802 #if IS_ENABLED(CONFIG_IPV6) 1799 1803 struct iwl_mld_vif *mld_vif = iwl_mld_vif_from_mac80211(vif);
+4 -10
drivers/net/wireless/intel/iwlwifi/mld/fw.c
··· 124 124 u16 status; 125 125 126 126 switch (version) { 127 - case 6: 128 127 case 7: 129 - expected_sz = sizeof(struct iwl_alive_ntf_v6); 128 + expected_sz = sizeof(struct iwl_alive_ntf_v7); 130 129 break; 131 130 case 8: 132 131 expected_sz = sizeof(struct iwl_alive_ntf); ··· 167 168 umac_error_table = le32_to_cpu(umac->dbg_ptrs.error_info_addr) & 168 169 ~FW_ADDR_CACHE_CONTROL; 169 170 170 - if (umac_error_table >= trans->mac_cfg->base->min_umac_error_event_table) 171 - iwl_fw_umac_set_alive_err_table(trans, umac_error_table); 172 - else 173 - IWL_ERR(mld, "Not valid error log pointer 0x%08X\n", 174 - umac_error_table); 171 + iwl_fw_umac_set_alive_err_table(trans, umac_error_table); 175 172 176 173 alive_data->valid = status == IWL_ALIVE_STATUS_OK; 177 174 ··· 183 188 le32_to_cpu(umac->umac_major), 184 189 le32_to_cpu(umac->umac_minor)); 185 190 186 - if (version >= 7) 187 - IWL_DEBUG_FW(mld, "FW alive flags 0x%x\n", 188 - le16_to_cpu(palive->flags)); 191 + IWL_DEBUG_FW(mld, "FW alive flags 0x%x\n", 192 + le16_to_cpu(palive->flags)); 189 193 190 194 if (version >= 8) 191 195 IWL_DEBUG_FW(mld, "platform_id 0x%llx\n",
+13
drivers/net/wireless/intel/iwlwifi/mld/iface.c
··· 528 528 529 529 mld_link = &iwl_mld_vif_from_mac80211(vif)->deflink; 530 530 531 + /* len_low should be 2 + n*13 (where n is the number of descriptors. 532 + * 13 is the size of a NoA descriptor). We can have either one or two 533 + * descriptors. 534 + */ 535 + if (IWL_FW_CHECK(mld, notif->noa_active && 536 + notif->noa_attr.len_low != 2 + 537 + sizeof(struct ieee80211_p2p_noa_desc) && 538 + notif->noa_attr.len_low != 2 + 539 + sizeof(struct ieee80211_p2p_noa_desc) * 2, 540 + "Invalid noa_attr.len_low (%d)\n", 541 + notif->noa_attr.len_low)) 542 + return; 543 + 531 544 new_data = kzalloc(sizeof(*new_data), GFP_KERNEL); 532 545 if (!new_data) 533 546 return;
+12 -4
drivers/net/wireless/intel/iwlwifi/mld/link.c
··· 465 465 int ret; 466 466 467 467 if (!link) { 468 - if (is_deflink) 468 + if (is_deflink) { 469 469 link = &mld_vif->deflink; 470 - else 470 + } else { 471 471 link = kzalloc(sizeof(*link), GFP_KERNEL); 472 + if (!link) 473 + return -ENOMEM; 474 + } 472 475 } else { 473 476 WARN_ON(!mld->fw_status.in_hw_restart); 474 477 } ··· 575 572 /* Not in EMLSR and we can't hear the link. 576 573 * Try to switch to a better link. EMLSR case is handled below. 577 574 */ 578 - if (!iwl_mld_emlsr_active(vif)) 575 + if (!iwl_mld_emlsr_active(vif)) { 576 + IWL_DEBUG_EHT(mld, 577 + "missed beacons exceeds threshold. link_id=%u. Try to switch to a better link.\n", 578 + link_id); 579 579 iwl_mld_int_mlo_scan(mld, vif); 580 + } 580 581 } 581 582 582 583 /* no more logic if we're not in EMLSR */ ··· 599 592 return; 600 593 601 594 IWL_DEBUG_EHT(mld, 602 - "missed bcn on the other link (link_id=%u): %u\n", 595 + "missed bcn link_id=%u: %u consecutive=%u, other link_id=%u: %u\n", 596 + link_id, missed_bcon, missed_bcon_since_rx, 603 597 other_link->link_id, scnd_lnk_bcn_lost); 604 598 605 599 /* Exit EMLSR if we lost more than
+70 -33
drivers/net/wireless/intel/iwlwifi/mld/mac80211.c
··· 23 23 #include "roc.h" 24 24 #include "mlo.h" 25 25 #include "stats.h" 26 + #include "iwl-nvm-parse.h" 26 27 #include "ftm-initiator.h" 27 28 #include "low_latency.h" 28 29 #include "fw/api/scan.h" ··· 76 75 }, 77 76 }; 78 77 79 - static const u8 if_types_ext_capa_sta[] = { 80 - [0] = WLAN_EXT_CAPA1_EXT_CHANNEL_SWITCHING, 81 - [2] = WLAN_EXT_CAPA3_MULTI_BSSID_SUPPORT, 82 - [7] = WLAN_EXT_CAPA8_OPMODE_NOTIF | 83 - WLAN_EXT_CAPA8_MAX_MSDU_IN_AMSDU_LSB, 84 - [8] = WLAN_EXT_CAPA9_MAX_MSDU_IN_AMSDU_MSB, 85 - [9] = WLAN_EXT_CAPA10_TWT_REQUESTER_SUPPORT, 78 + static const u8 ext_capa_base[IWL_MLD_STA_EXT_CAPA_SIZE] = { 79 + [0] = WLAN_EXT_CAPA1_EXT_CHANNEL_SWITCHING, 80 + [2] = WLAN_EXT_CAPA3_MULTI_BSSID_SUPPORT, 81 + [7] = WLAN_EXT_CAPA8_OPMODE_NOTIF | 82 + WLAN_EXT_CAPA8_MAX_MSDU_IN_AMSDU_LSB, 83 + [8] = WLAN_EXT_CAPA9_MAX_MSDU_IN_AMSDU_MSB, 86 84 }; 87 85 88 86 #define IWL_MLD_EMLSR_CAPA (IEEE80211_EML_CAP_EMLSR_SUPP | \ ··· 93 93 IEEE80211_MLD_CAP_OP_TID_TO_LINK_MAP_NEG_SUPP, \ 94 94 IEEE80211_MLD_CAP_OP_TID_TO_LINK_MAP_NEG_SUPP_SAME) | \ 95 95 IEEE80211_MLD_CAP_OP_LINK_RECONF_SUPPORT) 96 - 97 - static const struct wiphy_iftype_ext_capab iftypes_ext_capa[] = { 98 - { 99 - .iftype = NL80211_IFTYPE_STATION, 100 - .extended_capabilities = if_types_ext_capa_sta, 101 - .extended_capabilities_mask = if_types_ext_capa_sta, 102 - .extended_capabilities_len = sizeof(if_types_ext_capa_sta), 103 - /* relevant only if EHT is supported */ 104 - .eml_capabilities = IWL_MLD_EMLSR_CAPA, 105 - .mld_capa_and_ops = IWL_MLD_CAPA_OPS, 106 - }, 107 - }; 108 96 109 97 static void iwl_mld_hw_set_addresses(struct iwl_mld *mld) 110 98 { ··· 323 335 if (fw_has_capa(ucode_capa, IWL_UCODE_TLV_CAPA_PROTECTED_TWT)) 324 336 wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_PROTECTED_TWT); 325 337 326 - wiphy->iftype_ext_capab = NULL; 327 - wiphy->num_iftype_ext_capab = 0; 328 - 329 - if (!iwlwifi_mod_params.disable_11ax) { 330 - wiphy->iftype_ext_capab = iftypes_ext_capa; 331 - wiphy->num_iftype_ext_capab = ARRAY_SIZE(iftypes_ext_capa); 332 - 333 - ieee80211_hw_set(hw, SUPPORTS_MULTI_BSSID); 334 - ieee80211_hw_set(hw, SUPPORTS_ONLY_HE_MULTI_BSSID); 335 - } 336 - 337 338 if (iwlmld_mod_params.power_scheme != IWL_POWER_SCHEME_CAM) 338 339 wiphy->flags |= WIPHY_FLAG_PS_ON_BY_DEFAULT; 339 340 else 340 341 wiphy->flags &= ~WIPHY_FLAG_PS_ON_BY_DEFAULT; 342 + 343 + /* We are done for non-HE */ 344 + if (iwlwifi_mod_params.disable_11ax) 345 + return; 346 + 347 + ieee80211_hw_set(hw, SUPPORTS_MULTI_BSSID); 348 + ieee80211_hw_set(hw, SUPPORTS_ONLY_HE_MULTI_BSSID); 349 + 350 + wiphy->iftype_ext_capab = mld->ext_capab; 351 + wiphy->num_iftype_ext_capab = ARRAY_SIZE(mld->ext_capab); 352 + 353 + BUILD_BUG_ON(sizeof(mld->sta_ext_capab) < sizeof(ext_capa_base)); 354 + 355 + memcpy(mld->sta_ext_capab, ext_capa_base, sizeof(ext_capa_base)); 356 + 357 + mld->ext_capab[0].iftype = NL80211_IFTYPE_STATION; 358 + mld->ext_capab[0].extended_capabilities = mld->sta_ext_capab; 359 + mld->ext_capab[0].extended_capabilities_mask = mld->sta_ext_capab; 360 + mld->ext_capab[0].extended_capabilities_len = sizeof(mld->sta_ext_capab); 361 + 362 + if (!mld->nvm_data->sku_cap_11be_enable || 363 + iwlwifi_mod_params.disable_11be) 364 + return; 365 + 366 + mld->ext_capab[0].eml_capabilities = IWL_MLD_EMLSR_CAPA; 367 + mld->ext_capab[0].mld_capa_and_ops = IWL_MLD_CAPA_OPS; 368 + 341 369 } 342 370 343 371 static void iwl_mac_hw_set_misc(struct iwl_mld *mld) ··· 397 393 TLC_MNG_UPDATE_NOTIF, 0) >= 4) + 398 394 (iwl_fw_lookup_notif_ver(mld->fw, LEGACY_GROUP, 399 395 REPLY_RX_MPDU_CMD, 0) >= 6) + 400 - (iwl_fw_lookup_notif_ver(mld->fw, DATA_PATH_GROUP, 401 - RX_NO_DATA_NOTIF, 0) >= 4) + 402 396 (iwl_fw_lookup_notif_ver(mld->fw, LONG_GROUP, TX_CMD, 0) >= 9); 403 397 404 - if (ratecheck != 0 && ratecheck != 5) { 398 + if (ratecheck != 0 && ratecheck != 4) { 405 399 IWL_ERR(mld, "Firmware has inconsistent rates\n"); 406 400 return -EINVAL; 407 401 } ··· 682 680 #endif 683 681 684 682 iwl_mld_rm_vif(mld, vif); 683 + 684 + mld->monitor.phy.valid = false; 685 685 } 686 686 687 687 struct iwl_mld_mc_iter_data { ··· 2595 2591 return NEG_TTLM_RES_ACCEPT; 2596 2592 } 2597 2593 2594 + static int iwl_mld_get_antenna(struct ieee80211_hw *hw, int radio_idx, 2595 + u32 *tx_ant, u32 *rx_ant) 2596 + { 2597 + struct iwl_mld *mld = IWL_MAC80211_GET_MLD(hw); 2598 + 2599 + *tx_ant = iwl_mld_get_valid_tx_ant(mld); 2600 + *rx_ant = iwl_mld_get_valid_rx_ant(mld); 2601 + 2602 + return 0; 2603 + } 2604 + 2605 + static int iwl_mld_set_antenna(struct ieee80211_hw *hw, int radio_idx, 2606 + u32 tx_ant, u32 rx_ant) 2607 + { 2608 + struct iwl_mld *mld = IWL_MAC80211_GET_MLD(hw); 2609 + 2610 + if (WARN_ON(!mld->nvm_data)) 2611 + return -EBUSY; 2612 + 2613 + /* mac80211 ensures the device is not started, 2614 + * so the firmware cannot be running 2615 + */ 2616 + 2617 + mld->set_tx_ant = tx_ant; 2618 + mld->set_rx_ant = rx_ant; 2619 + 2620 + iwl_reinit_cab(mld->trans, mld->nvm_data, tx_ant, rx_ant, mld->fw); 2621 + 2622 + return 0; 2623 + } 2624 + 2598 2625 const struct ieee80211_ops iwl_mld_hw_ops = { 2599 2626 .tx = iwl_mld_mac80211_tx, 2600 2627 .start = iwl_mld_mac80211_start, 2601 2628 .stop = iwl_mld_mac80211_stop, 2602 2629 .config = iwl_mld_mac80211_config, 2630 + .get_antenna = iwl_mld_get_antenna, 2631 + .set_antenna = iwl_mld_set_antenna, 2603 2632 .add_interface = iwl_mld_mac80211_add_interface, 2604 2633 .remove_interface = iwl_mld_mac80211_remove_interface, 2605 2634 .conf_tx = iwl_mld_mac80211_conf_tx,
+1
drivers/net/wireless/intel/iwlwifi/mld/mld.c
··· 259 259 HCMD_NAME(MONITOR_NOTIF), 260 260 HCMD_NAME(TLC_MNG_UPDATE_NOTIF), 261 261 HCMD_NAME(BEACON_FILTER_IN_NOTIF), 262 + HCMD_NAME(PHY_AIR_SNIFFER_NOTIF), 262 263 HCMD_NAME(MU_GROUP_MGMT_NOTIF), 263 264 }; 264 265
+24 -1
drivers/net/wireless/intel/iwlwifi/mld/mld.h
··· 118 118 * @monitor.cur_bssid: current bssid tracked by the sniffer 119 119 * @monitor.ptp_time: set the Rx mactime using the device's PTP clock time 120 120 * @monitor.p80: primary channel position relative to he whole bandwidth, in 121 - * steps of 80 MHz 121 + * steps of 80 MHz 122 + * @monitor.phy: PHY data information 123 + * @monitor.phy.data: PHY data (&struct iwl_rx_phy_air_sniffer_ntfy) received 124 + * @monitor.phy.valid: PHY data is valid (was received) 125 + * @monitor.phy.used: PHY data was used by an RX 122 126 * @fw_id_to_link_sta: maps a fw id of a sta to the corresponding 123 127 * ieee80211_link_sta. This is not cleaned up on restart since we want to 124 128 * preserve the fw sta ids during a restart (for SN/PN restoring). ··· 138 134 * @fw: a pointer to the fw object 139 135 * @hw: pointer to the hw object. 140 136 * @wiphy: a pointer to the wiphy struct, for easier access to it. 137 + * @ext_capab: extended capabilities that will be set to wiphy on registration. 138 + * @sta_ext_capab: extended capabilities for the station interface. 141 139 * @nvm_data: pointer to the nvm_data that includes all our capabilities 142 140 * @fwrt: fw runtime data 143 141 * @debugfs_dir: debugfs directory ··· 186 180 * @mcast_filter_cmd: pointer to the multicast filter command. 187 181 * @mgmt_tx_ant: stores the last TX antenna index; used for setting 188 182 * TX rate_n_flags for non-STA mgmt frames (toggles on every TX failure). 183 + * @set_tx_ant: stores the last TX antenna bitmask set by user space (if any) 184 + * @set_rx_ant: stores the last RX antenna bitmask set by user space (if any) 189 185 * @fw_rates_ver_3: FW rates are in version 3 190 186 * @low_latency: low-latency manager. 191 187 * @tzone: thermal zone device's data ··· 213 205 u32 ampdu_ref; 214 206 bool ampdu_toggle; 215 207 u8 p80; 208 + struct { 209 + struct iwl_rx_phy_air_sniffer_ntfy data; 210 + u8 valid:1, used:1; 211 + } phy; 216 212 #ifdef CONFIG_IWLWIFI_DEBUGFS 217 213 __le16 cur_aid; 218 214 u8 cur_bssid[ETH_ALEN]; ··· 237 225 const struct iwl_fw *fw; 238 226 struct ieee80211_hw *hw; 239 227 struct wiphy *wiphy; 228 + struct wiphy_iftype_ext_capab ext_capab[IWL_MLD_EXT_CAPA_NUM_IFTYPES]; 229 + u8 sta_ext_capab[IWL_MLD_STA_EXT_CAPA_SIZE]; 240 230 struct iwl_nvm_data *nvm_data; 241 231 struct iwl_fw_runtime fwrt; 242 232 struct dentry *debugfs_dir; ··· 292 278 struct iwl_mcast_filter_cmd *mcast_filter_cmd; 293 279 294 280 u8 mgmt_tx_ant; 281 + 282 + u8 set_tx_ant; 283 + u8 set_rx_ant; 295 284 296 285 bool fw_rates_ver_3; 297 286 ··· 391 374 if (mld->nvm_data && mld->nvm_data->valid_tx_ant) 392 375 tx_ant &= mld->nvm_data->valid_tx_ant; 393 376 377 + if (mld->set_tx_ant) 378 + tx_ant &= mld->set_tx_ant; 379 + 394 380 return tx_ant; 395 381 } 396 382 ··· 403 383 404 384 if (mld->nvm_data && mld->nvm_data->valid_rx_ant) 405 385 rx_ant &= mld->nvm_data->valid_rx_ant; 386 + 387 + if (mld->set_rx_ant) 388 + rx_ant &= mld->set_rx_ant; 406 389 407 390 return rx_ant; 408 391 }
+46 -54
drivers/net/wireless/intel/iwlwifi/mld/mlo.c
··· 31 31 { 32 32 #define NAME_FMT(x) "%s" 33 33 #define NAME_PR(x) (mask & IWL_MLD_EMLSR_BLOCKED_##x) ? "[" #x "]" : "", 34 - IWL_DEBUG_INFO(mld, 35 - "EMLSR blocked = " HANDLE_EMLSR_BLOCKED_REASONS(NAME_FMT) 36 - " (0x%x)\n", 37 - HANDLE_EMLSR_BLOCKED_REASONS(NAME_PR) 38 - mask); 34 + IWL_DEBUG_EHT(mld, 35 + "EMLSR blocked = " HANDLE_EMLSR_BLOCKED_REASONS(NAME_FMT) 36 + " (0x%x)\n", HANDLE_EMLSR_BLOCKED_REASONS(NAME_PR) mask); 39 37 #undef NAME_FMT 40 38 #undef NAME_PR 41 39 } ··· 70 72 { 71 73 #define NAME_FMT(x) "%s" 72 74 #define NAME_PR(x) (mask & IWL_MLD_EMLSR_EXIT_##x) ? "[" #x "]" : "", 73 - IWL_DEBUG_INFO(mld, 74 - "EMLSR exit = " HANDLE_EMLSR_EXIT_REASONS(NAME_FMT) 75 - " (0x%x)\n", 76 - HANDLE_EMLSR_EXIT_REASONS(NAME_PR) 77 - mask); 75 + IWL_DEBUG_EHT(mld, 76 + "EMLSR exit = " HANDLE_EMLSR_EXIT_REASONS(NAME_FMT) 77 + " (0x%x)\n", HANDLE_EMLSR_EXIT_REASONS(NAME_PR) mask); 78 78 #undef NAME_FMT 79 79 #undef NAME_PR 80 80 } ··· 166 170 WARN_ON(mld_vif->emlsr.exit_repeat_count > 3); 167 171 } 168 172 169 - IWL_DEBUG_INFO(mld, 170 - "Preventing EMLSR for %ld seconds due to %u exits with the reason = %s (0x%x)\n", 171 - delay / HZ, mld_vif->emlsr.exit_repeat_count, 172 - iwl_mld_get_emlsr_exit_string(reason), reason); 173 + IWL_DEBUG_EHT(mld, 174 + "Preventing EMLSR for %ld seconds due to %u exits with the reason = %s (0x%x)\n", 175 + delay / HZ, mld_vif->emlsr.exit_repeat_count, 176 + iwl_mld_get_emlsr_exit_string(reason), reason); 173 177 174 178 wiphy_delayed_work_queue(mld->wiphy, 175 179 &mld_vif->emlsr.prevent_done_wk, delay); ··· 213 217 link_to_keep = __ffs(vif->active_links); 214 218 215 219 new_active_links = BIT(link_to_keep); 216 - IWL_DEBUG_INFO(mld, 217 - "Exiting EMLSR. reason = %s (0x%x). Current active links=0x%x, new active links = 0x%x\n", 218 - iwl_mld_get_emlsr_exit_string(exit), exit, 219 - vif->active_links, new_active_links); 220 + IWL_DEBUG_EHT(mld, 221 + "Exiting EMLSR. reason = %s (0x%x). Current active links=0x%x, new active links = 0x%x\n", 222 + iwl_mld_get_emlsr_exit_string(exit), exit, 223 + vif->active_links, new_active_links); 220 224 221 225 if (sync) 222 226 ret = ieee80211_set_active_links(vif, new_active_links); ··· 258 262 259 263 mld_vif->emlsr.blocked_reasons |= reason; 260 264 261 - IWL_DEBUG_INFO(mld, 262 - "Blocking EMLSR mode. reason = %s (0x%x)\n", 263 - iwl_mld_get_emlsr_blocked_string(reason), reason); 265 + IWL_DEBUG_EHT(mld, "Blocking EMLSR mode. reason = %s (0x%x)\n", 266 + iwl_mld_get_emlsr_blocked_string(reason), reason); 264 267 iwl_mld_print_emlsr_blocked(mld, mld_vif->emlsr.blocked_reasons); 265 268 266 269 if (reason == IWL_MLD_EMLSR_BLOCKED_TPT) ··· 330 335 331 336 mld_vif->emlsr.blocked_reasons &= ~reason; 332 337 333 - IWL_DEBUG_INFO(mld, 334 - "Unblocking EMLSR mode. reason = %s (0x%x)\n", 335 - iwl_mld_get_emlsr_blocked_string(reason), reason); 338 + IWL_DEBUG_EHT(mld, "Unblocking EMLSR mode. reason = %s (0x%x)\n", 339 + iwl_mld_get_emlsr_blocked_string(reason), reason); 336 340 iwl_mld_print_emlsr_blocked(mld, mld_vif->emlsr.blocked_reasons); 337 341 338 342 if (reason == IWL_MLD_EMLSR_BLOCKED_TPT) ··· 342 348 if (mld_vif->emlsr.blocked_reasons) 343 349 return; 344 350 345 - IWL_DEBUG_INFO(mld, "EMLSR is unblocked\n"); 351 + IWL_DEBUG_EHT(mld, "EMLSR is unblocked\n"); 346 352 iwl_mld_int_mlo_scan(mld, vif); 347 353 } 348 354 ··· 359 365 360 366 switch (action) { 361 367 case ESR_RECOMMEND_LEAVE: 362 - IWL_DEBUG_INFO(mld_vif->mld, 363 - "FW recommend leave reason = 0x%x\n", 364 - le32_to_cpu(notif->leave_reason_mask)); 368 + IWL_DEBUG_EHT(mld_vif->mld, 369 + "FW recommend leave reason = 0x%x\n", 370 + le32_to_cpu(notif->leave_reason_mask)); 365 371 366 372 iwl_mld_exit_emlsr(mld_vif->mld, vif, 367 373 IWL_MLD_EMLSR_EXIT_FW_REQUEST, 368 374 iwl_mld_get_primary_link(vif)); 369 375 break; 370 376 case ESR_FORCE_LEAVE: 371 - IWL_DEBUG_INFO(mld_vif->mld, 372 - "FW force leave reason = 0x%x\n", 373 - le32_to_cpu(notif->leave_reason_mask)); 377 + IWL_DEBUG_EHT(mld_vif->mld, "FW force leave reason = 0x%x\n", 378 + le32_to_cpu(notif->leave_reason_mask)); 374 379 fallthrough; 375 380 case ESR_RECOMMEND_ENTER: 376 381 default: ··· 405 412 struct ieee80211_bss_conf *bss_conf = 406 413 iwl_mld_fw_id_to_link_conf(mld, fw_link_id); 407 414 408 - IWL_DEBUG_INFO(mld, "Failed to %s EMLSR on link %d (FW: %d), reason %d\n", 409 - le32_to_cpu(notif->activation) ? "enter" : "exit", 410 - bss_conf ? bss_conf->link_id : -1, 411 - le32_to_cpu(notif->link_id), 412 - le32_to_cpu(notif->err_code)); 415 + IWL_DEBUG_EHT(mld, 416 + "Failed to %s EMLSR on link %d (FW: %d), reason %d\n", 417 + le32_to_cpu(notif->activation) ? "enter" : "exit", 418 + bss_conf ? bss_conf->link_id : -1, 419 + le32_to_cpu(notif->link_id), 420 + le32_to_cpu(notif->err_code)); 413 421 414 422 if (IWL_FW_CHECK(mld, !bss_conf, 415 423 "FW reported failure to %sactivate EMLSR on a non-existing link: %d\n", ··· 584 590 spin_unlock_bh(&queue_counter->lock); 585 591 } 586 592 587 - IWL_DEBUG_INFO(mld, "total Tx MPDUs: %ld. total Rx MPDUs: %ld\n", 588 - total_tx, total_rx); 593 + IWL_DEBUG_EHT(mld, "total Tx MPDUs: %ld. total Rx MPDUs: %ld\n", 594 + total_tx, total_rx); 589 595 590 596 /* If we don't have enough MPDUs - exit EMLSR */ 591 597 if (total_tx < IWL_MLD_ENTER_EMLSR_TPT_THRESH && ··· 597 603 598 604 /* EMLSR is not active */ 599 605 if (sec_link_id == -1) 600 - return; 606 + goto schedule; 601 607 602 - IWL_DEBUG_INFO(mld, "Secondary Link %d: Tx MPDUs: %ld. Rx MPDUs: %ld\n", 603 - sec_link_id, sec_link_tx, sec_link_rx); 608 + IWL_DEBUG_EHT(mld, "Secondary Link %d: Tx MPDUs: %ld. Rx MPDUs: %ld\n", 609 + sec_link_id, sec_link_tx, sec_link_rx); 604 610 605 611 /* Calculate the percentage of the secondary link TX/RX */ 606 612 sec_link_tx_perc = total_tx ? sec_link_tx * 100 / total_tx : 0; ··· 619 625 return; 620 626 } 621 627 628 + schedule: 622 629 /* Check again when the next window ends */ 623 630 wiphy_delayed_work_queue(mld_vif->mld->wiphy, 624 631 &mld_vif->emlsr.check_tpt_wk, ··· 697 702 ret |= IWL_MLD_EMLSR_EXIT_CSA; 698 703 699 704 if (ret) { 700 - IWL_DEBUG_INFO(mld, 701 - "Link %d is not allowed for EMLSR as %s\n", 702 - link->link_id, 703 - primary ? "primary" : "secondary"); 705 + IWL_DEBUG_EHT(mld, "Link %d is not allowed for EMLSR as %s\n", 706 + link->link_id, primary ? "primary" : "secondary"); 704 707 iwl_mld_print_emlsr_exit(mld, ret); 705 708 } 706 709 ··· 862 869 reason_mask |= IWL_MLD_EMLSR_EXIT_CHAN_LOAD; 863 870 864 871 if (reason_mask) { 865 - IWL_DEBUG_INFO(mld, 866 - "Links %d and %d are not a valid pair for EMLSR\n", 867 - a->link_id, b->link_id); 868 - IWL_DEBUG_INFO(mld, 869 - "Links bandwidth are: %d and %d\n", 870 - nl80211_chan_width_to_mhz(a->chandef->width), 871 - nl80211_chan_width_to_mhz(b->chandef->width)); 872 + IWL_DEBUG_EHT(mld, 873 + "Links %d and %d are not a valid pair for EMLSR\n", 874 + a->link_id, b->link_id); 875 + IWL_DEBUG_EHT(mld, "Links bandwidth are: %d and %d\n", 876 + nl80211_chan_width_to_mhz(a->chandef->width), 877 + nl80211_chan_width_to_mhz(b->chandef->width)); 872 878 iwl_mld_print_emlsr_exit(mld, reason_mask); 873 879 } 874 880 ··· 985 993 } 986 994 987 995 set_active: 988 - IWL_DEBUG_INFO(mld, "Link selection result: 0x%x. Primary = %d\n", 989 - new_active, new_primary); 996 + IWL_DEBUG_EHT(mld, "Link selection result: 0x%x. Primary = %d\n", 997 + new_active, new_primary); 990 998 991 999 mld_vif->emlsr.selected_primary = new_primary; 992 1000 mld_vif->emlsr.selected_links = new_active;
+2 -2
drivers/net/wireless/intel/iwlwifi/mld/notif.c
··· 589 589 else if (unlikely(cmd_id == WIDE_ID(DATA_PATH_GROUP, 590 590 RX_QUEUES_NOTIFICATION))) 591 591 iwl_mld_handle_rx_queues_sync_notif(mld, napi, pkt, 0); 592 - else if (cmd_id == WIDE_ID(DATA_PATH_GROUP, RX_NO_DATA_NOTIF)) 593 - iwl_mld_rx_monitor_no_data(mld, napi, pkt, 0); 592 + else if (cmd_id == WIDE_ID(DATA_PATH_GROUP, PHY_AIR_SNIFFER_NOTIF)) 593 + iwl_mld_handle_phy_air_sniffer_notif(mld, napi, pkt); 594 594 else 595 595 iwl_mld_rx_notif(mld, rxb, pkt); 596 596 }
+3 -1
drivers/net/wireless/intel/iwlwifi/mld/roc.c
··· 231 231 struct ieee80211_vif *vif; 232 232 233 233 vif = iwl_mld_find_roc_vif(mld, activity); 234 - if (WARN_ON(!vif)) 234 + if (IWL_FW_CHECK(mld, !vif, 235 + "unexpected ROC notif from FW for activity %d\n", 236 + activity)) 235 237 return; 236 238 237 239 mld_vif = iwl_mld_vif_from_mac80211(vif);
+913 -796
drivers/net/wireless/intel/iwlwifi/mld/rx.c
··· 18 18 19 19 /* stores relevant PHY data fields extracted from iwl_rx_mpdu_desc */ 20 20 struct iwl_mld_rx_phy_data { 21 - enum iwl_rx_phy_info_type info_type; 22 - __le32 data0; 23 - __le32 data1; 24 - __le32 data2; 25 - __le32 data3; 26 - __le32 eht_data4; 27 - __le32 data5; 28 - __le16 data4; 21 + struct iwl_rx_phy_air_sniffer_ntfy *ntfy; 29 22 bool first_subframe; 30 23 bool with_data; 31 - __le32 rx_vec[4]; 32 24 u32 rate_n_flags; 33 25 u32 gp2_on_air_rise; 26 + /* phy_info is only valid when we have a frame, i.e. with_data=true */ 34 27 u16 phy_info; 35 28 u8 energy_a, energy_b; 36 29 }; 37 30 38 31 static void 39 - iwl_mld_fill_phy_data(struct iwl_mld *mld, 40 - struct iwl_rx_mpdu_desc *desc, 41 - struct iwl_mld_rx_phy_data *phy_data) 32 + iwl_mld_fill_phy_data_from_mpdu(struct iwl_mld *mld, 33 + struct iwl_rx_mpdu_desc *desc, 34 + struct iwl_mld_rx_phy_data *phy_data) 42 35 { 36 + if (unlikely(mld->monitor.phy.valid)) { 37 + mld->monitor.phy.used = true; 38 + phy_data->ntfy = &mld->monitor.phy.data; 39 + } 40 + 43 41 phy_data->phy_info = le16_to_cpu(desc->phy_info); 44 42 phy_data->rate_n_flags = iwl_v3_rate_from_v2_v3(desc->v3.rate_n_flags, 45 43 mld->fw_rates_ver_3); 46 44 phy_data->gp2_on_air_rise = le32_to_cpu(desc->v3.gp2_on_air_rise); 47 45 phy_data->energy_a = desc->v3.energy_a; 48 46 phy_data->energy_b = desc->v3.energy_b; 49 - phy_data->data0 = desc->v3.phy_data0; 50 - phy_data->data1 = desc->v3.phy_data1; 51 - phy_data->data2 = desc->v3.phy_data2; 52 - phy_data->data3 = desc->v3.phy_data3; 53 - phy_data->data4 = desc->phy_data4; 54 - phy_data->eht_data4 = desc->phy_eht_data4; 55 - phy_data->data5 = desc->v3.phy_data5; 56 47 phy_data->with_data = true; 57 48 } 58 49 ··· 208 217 } 209 218 210 219 static void 211 - iwl_mld_decode_he_phy_ru_alloc(struct iwl_mld_rx_phy_data *phy_data, 212 - struct ieee80211_radiotap_he *he, 213 - struct ieee80211_radiotap_he_mu *he_mu, 214 - struct ieee80211_rx_status *rx_status) 220 + iwl_mld_he_set_ru_alloc(struct ieee80211_rx_status *rx_status, 221 + struct ieee80211_radiotap_he *he, 222 + u8 ru_with_p80) 215 223 { 216 - /* Unfortunately, we have to leave the mac80211 data 217 - * incorrect for the case that we receive an HE-MU 218 - * transmission and *don't* have the HE phy data (due 219 - * to the bits being used for TSF). This shouldn't 220 - * happen though as management frames where we need 221 - * the TSF/timers are not be transmitted in HE-MU. 222 - */ 223 - u8 ru = le32_get_bits(phy_data->data1, IWL_RX_PHY_DATA1_HE_RU_ALLOC_MASK); 224 - u32 rate_n_flags = phy_data->rate_n_flags; 225 - u32 he_type = rate_n_flags & RATE_MCS_HE_TYPE_MSK; 224 + u8 ru = ru_with_p80 >> 1; 225 + u8 p80 = ru_with_p80 & 1; 226 226 u8 offs = 0; 227 227 228 228 rx_status->bw = RATE_INFO_BW_HE_RU; 229 229 230 230 he->data1 |= cpu_to_le16(IEEE80211_RADIOTAP_HE_DATA1_BW_RU_ALLOC_KNOWN); 231 + he->data2 |= cpu_to_le16(IEEE80211_RADIOTAP_HE_DATA2_PRISEC_80_KNOWN | 232 + IEEE80211_RADIOTAP_HE_DATA2_RU_OFFSET_KNOWN); 231 233 232 234 switch (ru) { 233 235 case 0 ... 36: ··· 250 266 rx_status->he_ru = NL80211_RATE_INFO_HE_RU_ALLOC_2x996; 251 267 break; 252 268 } 269 + 253 270 he->data2 |= le16_encode_bits(offs, 254 271 IEEE80211_RADIOTAP_HE_DATA2_RU_OFFSET); 255 - he->data2 |= cpu_to_le16(IEEE80211_RADIOTAP_HE_DATA2_PRISEC_80_KNOWN | 256 - IEEE80211_RADIOTAP_HE_DATA2_RU_OFFSET_KNOWN); 257 - if (phy_data->data1 & cpu_to_le32(IWL_RX_PHY_DATA1_HE_RU_ALLOC_SEC80)) 258 - he->data2 |= 259 - cpu_to_le16(IEEE80211_RADIOTAP_HE_DATA2_PRISEC_80_SEC); 260 272 261 - #define CHECK_BW(bw) \ 262 - BUILD_BUG_ON(IEEE80211_RADIOTAP_HE_MU_FLAGS2_BW_FROM_SIG_A_BW_ ## bw ## MHZ != \ 263 - RATE_MCS_CHAN_WIDTH_##bw >> RATE_MCS_CHAN_WIDTH_POS); \ 264 - BUILD_BUG_ON(IEEE80211_RADIOTAP_HE_DATA6_TB_PPDU_BW_ ## bw ## MHZ != \ 265 - RATE_MCS_CHAN_WIDTH_##bw >> RATE_MCS_CHAN_WIDTH_POS) 266 - CHECK_BW(20); 267 - CHECK_BW(40); 268 - CHECK_BW(80); 269 - CHECK_BW(160); 270 - 271 - if (he_mu) 272 - he_mu->flags2 |= 273 - le16_encode_bits(u32_get_bits(rate_n_flags, 274 - RATE_MCS_CHAN_WIDTH_MSK), 275 - IEEE80211_RADIOTAP_HE_MU_FLAGS2_BW_FROM_SIG_A_BW); 276 - else if (he_type == RATE_MCS_HE_TYPE_TRIG) 277 - he->data6 |= 278 - cpu_to_le16(IEEE80211_RADIOTAP_HE_DATA6_TB_PPDU_BW_KNOWN) | 279 - le16_encode_bits(u32_get_bits(rate_n_flags, 280 - RATE_MCS_CHAN_WIDTH_MSK), 281 - IEEE80211_RADIOTAP_HE_DATA6_TB_PPDU_BW); 273 + he->data2 |= le16_encode_bits(p80, IEEE80211_RADIOTAP_HE_DATA2_PRISEC_80_SEC); 282 274 } 283 275 276 + #define RTAP_ENC_HE(src, src_msk, dst_msk) \ 277 + le16_encode_bits(le32_get_bits(src, src_msk), dst_msk) 278 + 284 279 static void 285 - iwl_mld_decode_he_mu_ext(struct iwl_mld_rx_phy_data *phy_data, 286 - struct ieee80211_radiotap_he_mu *he_mu) 280 + iwl_mld_decode_he_mu(struct iwl_mld_rx_phy_data *phy_data, 281 + struct ieee80211_radiotap_he *he, 282 + struct ieee80211_radiotap_he_mu *he_mu, 283 + struct ieee80211_rx_status *rx_status) 287 284 { 288 - u32 phy_data2 = le32_to_cpu(phy_data->data2); 289 - u32 phy_data3 = le32_to_cpu(phy_data->data3); 290 - u16 phy_data4 = le16_to_cpu(phy_data->data4); 291 285 u32 rate_n_flags = phy_data->rate_n_flags; 292 286 293 - if (u32_get_bits(phy_data4, IWL_RX_PHY_DATA4_HE_MU_EXT_CH1_CRC_OK)) { 287 + he_mu->flags1 |= RTAP_ENC_HE(phy_data->ntfy->sigs.he.b, 288 + OFDM_RX_FRAME_HE_SIGB_DCM, 289 + IEEE80211_RADIOTAP_HE_MU_FLAGS1_SIG_B_DCM); 290 + he_mu->flags1 |= RTAP_ENC_HE(phy_data->ntfy->sigs.he.b, 291 + OFDM_RX_FRAME_HE_SIGB_MCS, 292 + IEEE80211_RADIOTAP_HE_MU_FLAGS1_SIG_B_MCS); 293 + he_mu->flags2 |= RTAP_ENC_HE(phy_data->ntfy->sigs.he.a1, 294 + OFDM_RX_FRAME_HE_PRMBL_PUNC_TYPE, 295 + IEEE80211_RADIOTAP_HE_MU_FLAGS2_PUNC_FROM_SIG_A_BW); 296 + he_mu->flags2 |= RTAP_ENC_HE(phy_data->ntfy->sigs.he.a2, 297 + OFDM_RX_FRAME_HE_MU_NUM_OF_SIGB_SYM_OR_USER_NUM, 298 + IEEE80211_RADIOTAP_HE_MU_FLAGS2_SIG_B_SYMS_USERS); 299 + he_mu->flags2 |= RTAP_ENC_HE(phy_data->ntfy->sigs.he.b, 300 + OFDM_RX_FRAME_HE_MU_SIGB_COMP, 301 + IEEE80211_RADIOTAP_HE_MU_FLAGS2_SIG_B_COMP); 302 + 303 + if (phy_data->ntfy->flags & IWL_SNIF_FLAG_VALID_RU && 304 + le32_get_bits(phy_data->ntfy->sigs.he.cmn[2], 305 + OFDM_RX_FRAME_HE_COMMON_CC1_CRC_OK)) { 294 306 he_mu->flags1 |= 295 307 cpu_to_le16(IEEE80211_RADIOTAP_HE_MU_FLAGS1_CH1_RU_KNOWN | 296 308 IEEE80211_RADIOTAP_HE_MU_FLAGS1_CH1_CTR_26T_RU_KNOWN); 297 309 298 310 he_mu->flags1 |= 299 - le16_encode_bits(u32_get_bits(phy_data4, 300 - IWL_RX_PHY_DATA4_HE_MU_EXT_CH1_CTR_RU), 301 - IEEE80211_RADIOTAP_HE_MU_FLAGS1_CH1_CTR_26T_RU); 311 + RTAP_ENC_HE(phy_data->ntfy->sigs.he.cmn[2], 312 + OFDM_RX_FRAME_HE_CENTER_RU_CC1, 313 + IEEE80211_RADIOTAP_HE_MU_FLAGS1_CH1_CTR_26T_RU); 302 314 303 - he_mu->ru_ch1[0] = u32_get_bits(phy_data2, 304 - IWL_RX_PHY_DATA2_HE_MU_EXT_CH1_RU0); 305 - he_mu->ru_ch1[1] = u32_get_bits(phy_data3, 306 - IWL_RX_PHY_DATA3_HE_MU_EXT_CH1_RU1); 307 - he_mu->ru_ch1[2] = u32_get_bits(phy_data2, 308 - IWL_RX_PHY_DATA2_HE_MU_EXT_CH1_RU2); 309 - he_mu->ru_ch1[3] = u32_get_bits(phy_data3, 310 - IWL_RX_PHY_DATA3_HE_MU_EXT_CH1_RU3); 315 + he_mu->ru_ch1[0] = le32_get_bits(phy_data->ntfy->sigs.he.cmn[0], 316 + OFDM_RX_FRAME_HE_RU_ALLOC_0_A1); 317 + he_mu->ru_ch1[1] = le32_get_bits(phy_data->ntfy->sigs.he.cmn[1], 318 + OFDM_RX_FRAME_HE_RU_ALLOC_1_C1); 319 + he_mu->ru_ch1[2] = le32_get_bits(phy_data->ntfy->sigs.he.cmn[0], 320 + OFDM_RX_FRAME_HE_RU_ALLOC_0_A2); 321 + he_mu->ru_ch1[3] = le32_get_bits(phy_data->ntfy->sigs.he.cmn[1], 322 + OFDM_RX_FRAME_HE_RU_ALLOC_1_C2); 311 323 } 312 324 313 - if (u32_get_bits(phy_data4, IWL_RX_PHY_DATA4_HE_MU_EXT_CH2_CRC_OK) && 325 + if (phy_data->ntfy->flags & IWL_SNIF_FLAG_VALID_RU && 326 + le32_get_bits(phy_data->ntfy->sigs.he.cmn[2], 327 + OFDM_RX_FRAME_HE_COMMON_CC2_CRC_OK) && 314 328 (rate_n_flags & RATE_MCS_CHAN_WIDTH_MSK) != RATE_MCS_CHAN_WIDTH_20) { 315 329 he_mu->flags1 |= 316 330 cpu_to_le16(IEEE80211_RADIOTAP_HE_MU_FLAGS1_CH2_RU_KNOWN | 317 331 IEEE80211_RADIOTAP_HE_MU_FLAGS1_CH2_CTR_26T_RU_KNOWN); 318 332 319 333 he_mu->flags2 |= 320 - le16_encode_bits(u32_get_bits(phy_data4, 321 - IWL_RX_PHY_DATA4_HE_MU_EXT_CH2_CTR_RU), 322 - IEEE80211_RADIOTAP_HE_MU_FLAGS2_CH2_CTR_26T_RU); 334 + RTAP_ENC_HE(phy_data->ntfy->sigs.he.cmn[2], 335 + OFDM_RX_FRAME_HE_CENTER_RU_CC2, 336 + IEEE80211_RADIOTAP_HE_MU_FLAGS2_CH2_CTR_26T_RU); 323 337 324 - he_mu->ru_ch2[0] = u32_get_bits(phy_data2, 325 - IWL_RX_PHY_DATA2_HE_MU_EXT_CH2_RU0); 326 - he_mu->ru_ch2[1] = u32_get_bits(phy_data3, 327 - IWL_RX_PHY_DATA3_HE_MU_EXT_CH2_RU1); 328 - he_mu->ru_ch2[2] = u32_get_bits(phy_data2, 329 - IWL_RX_PHY_DATA2_HE_MU_EXT_CH2_RU2); 330 - he_mu->ru_ch2[3] = u32_get_bits(phy_data3, 331 - IWL_RX_PHY_DATA3_HE_MU_EXT_CH2_RU3); 338 + he_mu->ru_ch2[0] = le32_get_bits(phy_data->ntfy->sigs.he.cmn[0], 339 + OFDM_RX_FRAME_HE_RU_ALLOC_0_B1); 340 + he_mu->ru_ch2[1] = le32_get_bits(phy_data->ntfy->sigs.he.cmn[1], 341 + OFDM_RX_FRAME_HE_RU_ALLOC_1_D1); 342 + he_mu->ru_ch2[2] = le32_get_bits(phy_data->ntfy->sigs.he.cmn[0], 343 + OFDM_RX_FRAME_HE_RU_ALLOC_0_B2); 344 + he_mu->ru_ch2[3] = le32_get_bits(phy_data->ntfy->sigs.he.cmn[1], 345 + OFDM_RX_FRAME_HE_RU_ALLOC_1_D2); 332 346 } 347 + 348 + #define CHECK_BW(bw) \ 349 + BUILD_BUG_ON(IEEE80211_RADIOTAP_HE_MU_FLAGS2_BW_FROM_SIG_A_BW_ ## bw ## MHZ != \ 350 + RATE_MCS_CHAN_WIDTH_##bw >> RATE_MCS_CHAN_WIDTH_POS) 351 + CHECK_BW(20); 352 + CHECK_BW(40); 353 + CHECK_BW(80); 354 + CHECK_BW(160); 355 + #undef CHECK_BW 356 + 357 + he_mu->flags2 |= 358 + le16_encode_bits(u32_get_bits(rate_n_flags, RATE_MCS_CHAN_WIDTH_MSK), 359 + IEEE80211_RADIOTAP_HE_MU_FLAGS2_BW_FROM_SIG_A_BW); 360 + 361 + iwl_mld_he_set_ru_alloc(rx_status, he, 362 + le32_get_bits(phy_data->ntfy->sigs.he.b, 363 + OFDM_RX_FRAME_HE_SIGB_STA_RU)); 364 + } 365 + 366 + static void 367 + iwl_mld_decode_he_tb_phy_data(struct iwl_mld_rx_phy_data *phy_data, 368 + struct ieee80211_radiotap_he *he, 369 + struct ieee80211_rx_status *rx_status) 370 + { 371 + u32 rate_n_flags = phy_data->rate_n_flags; 372 + u32 nsts; 373 + 374 + he->data1 |= cpu_to_le16(IEEE80211_RADIOTAP_HE_DATA1_BSS_COLOR_KNOWN | 375 + IEEE80211_RADIOTAP_HE_DATA1_SPTL_REUSE_KNOWN | 376 + IEEE80211_RADIOTAP_HE_DATA1_SPTL_REUSE2_KNOWN | 377 + IEEE80211_RADIOTAP_HE_DATA1_SPTL_REUSE3_KNOWN | 378 + IEEE80211_RADIOTAP_HE_DATA1_SPTL_REUSE4_KNOWN); 379 + 380 + he->data4 |= RTAP_ENC_HE(phy_data->ntfy->sigs.he_tb.a1, 381 + OFDM_RX_HE_TRIG_SPATIAL_REUSE_1, 382 + IEEE80211_RADIOTAP_HE_DATA4_TB_SPTL_REUSE1); 383 + he->data4 |= RTAP_ENC_HE(phy_data->ntfy->sigs.he_tb.a1, 384 + OFDM_RX_HE_TRIG_SPATIAL_REUSE_2, 385 + IEEE80211_RADIOTAP_HE_DATA4_TB_SPTL_REUSE2); 386 + he->data4 |= RTAP_ENC_HE(phy_data->ntfy->sigs.he_tb.a1, 387 + OFDM_RX_HE_TRIG_SPATIAL_REUSE_3, 388 + IEEE80211_RADIOTAP_HE_DATA4_TB_SPTL_REUSE3); 389 + he->data4 |= RTAP_ENC_HE(phy_data->ntfy->sigs.he_tb.a1, 390 + OFDM_RX_HE_TRIG_SPATIAL_REUSE_4, 391 + IEEE80211_RADIOTAP_HE_DATA4_TB_SPTL_REUSE4); 392 + he->data3 |= RTAP_ENC_HE(phy_data->ntfy->sigs.he_tb.a1, 393 + OFDM_RX_HE_TRIG_BSS_COLOR, 394 + IEEE80211_RADIOTAP_HE_DATA3_BSS_COLOR); 395 + 396 + #define CHECK_BW(bw) \ 397 + BUILD_BUG_ON(IEEE80211_RADIOTAP_HE_DATA6_TB_PPDU_BW_ ## bw ## MHZ != \ 398 + RATE_MCS_CHAN_WIDTH_##bw >> RATE_MCS_CHAN_WIDTH_POS) 399 + CHECK_BW(20); 400 + CHECK_BW(40); 401 + CHECK_BW(80); 402 + CHECK_BW(160); 403 + #undef CHECK_BW 404 + 405 + he->data6 |= cpu_to_le16(IEEE80211_RADIOTAP_HE_DATA6_TB_PPDU_BW_KNOWN) | 406 + le16_encode_bits(u32_get_bits(rate_n_flags, RATE_MCS_CHAN_WIDTH_MSK), 407 + IEEE80211_RADIOTAP_HE_DATA6_TB_PPDU_BW); 408 + 409 + if (!(phy_data->ntfy->flags & IWL_SNIF_FLAG_VALID_TB_RX)) 410 + return; 411 + 412 + he->data1 |= cpu_to_le16(IEEE80211_RADIOTAP_HE_DATA1_LDPC_XSYMSEG_KNOWN | 413 + IEEE80211_RADIOTAP_HE_DATA1_DOPPLER_KNOWN); 414 + he->data2 |= cpu_to_le16(IEEE80211_RADIOTAP_HE_DATA2_PRE_FEC_PAD_KNOWN | 415 + IEEE80211_RADIOTAP_HE_DATA2_PE_DISAMBIG_KNOWN | 416 + IEEE80211_RADIOTAP_HE_DATA2_TXOP_KNOWN | 417 + IEEE80211_RADIOTAP_HE_DATA2_NUM_LTF_SYMS_KNOWN); 418 + 419 + he->data3 |= RTAP_ENC_HE(phy_data->ntfy->sigs.he_tb.tb_rx1, 420 + OFDM_UCODE_TRIG_BASE_RX_CODING_EXTRA_SYM, 421 + IEEE80211_RADIOTAP_HE_DATA3_LDPC_XSYMSEG); 422 + he->data6 |= RTAP_ENC_HE(phy_data->ntfy->sigs.he_tb.tb_rx1, 423 + OFDM_UCODE_TRIG_BASE_RX_DOPPLER, 424 + IEEE80211_RADIOTAP_HE_DATA6_DOPPLER); 425 + he->data5 |= RTAP_ENC_HE(phy_data->ntfy->sigs.he_tb.tb_rx1, 426 + OFDM_UCODE_TRIG_BASE_RX_PRE_FEC_PAD_FACTOR, 427 + IEEE80211_RADIOTAP_HE_DATA5_PRE_FEC_PAD); 428 + he->data5 |= RTAP_ENC_HE(phy_data->ntfy->sigs.he_tb.tb_rx1, 429 + OFDM_UCODE_TRIG_BASE_RX_PE_DISAMBIG, 430 + IEEE80211_RADIOTAP_HE_DATA5_PE_DISAMBIG); 431 + he->data5 |= RTAP_ENC_HE(phy_data->ntfy->sigs.he_tb.tb_rx1, 432 + OFDM_UCODE_TRIG_BASE_RX_NUM_OF_LTF_SYM, 433 + IEEE80211_RADIOTAP_HE_DATA5_NUM_LTF_SYMS); 434 + he->data6 |= RTAP_ENC_HE(phy_data->ntfy->sigs.he_tb.a2, 435 + OFDM_RX_HE_TRIG_TXOP_DURATION, 436 + IEEE80211_RADIOTAP_HE_DATA6_TXOP); 437 + 438 + iwl_mld_he_set_ru_alloc(rx_status, he, 439 + le32_get_bits(phy_data->ntfy->sigs.he_tb.tb_rx1, 440 + OFDM_UCODE_TRIG_BASE_RX_RU)); 441 + 442 + nsts = le32_get_bits(phy_data->ntfy->sigs.he_tb.tb_rx1, 443 + OFDM_UCODE_TRIG_BASE_RX_NSTS) + 1; 444 + rx_status->nss = nsts >> !!(rate_n_flags & RATE_MCS_STBC_MSK); 333 445 } 334 446 335 447 static void 336 448 iwl_mld_decode_he_phy_data(struct iwl_mld_rx_phy_data *phy_data, 337 449 struct ieee80211_radiotap_he *he, 338 450 struct ieee80211_radiotap_he_mu *he_mu, 339 - struct ieee80211_rx_status *rx_status, 340 - int queue) 451 + struct ieee80211_rx_status *rx_status) 341 452 { 342 - switch (phy_data->info_type) { 343 - case IWL_RX_PHY_INFO_TYPE_NONE: 344 - case IWL_RX_PHY_INFO_TYPE_CCK: 345 - case IWL_RX_PHY_INFO_TYPE_OFDM_LGCY: 346 - case IWL_RX_PHY_INFO_TYPE_HT: 347 - case IWL_RX_PHY_INFO_TYPE_VHT_SU: 348 - case IWL_RX_PHY_INFO_TYPE_VHT_MU: 349 - case IWL_RX_PHY_INFO_TYPE_EHT_MU: 350 - case IWL_RX_PHY_INFO_TYPE_EHT_TB: 351 - case IWL_RX_PHY_INFO_TYPE_EHT_MU_EXT: 352 - case IWL_RX_PHY_INFO_TYPE_EHT_TB_EXT: 453 + u32 rate_n_flags = phy_data->rate_n_flags; 454 + u32 he_type = rate_n_flags & RATE_MCS_HE_TYPE_MSK; 455 + u32 nsts; 456 + 457 + switch (he_type) { 458 + case RATE_MCS_HE_TYPE_TRIG: 459 + iwl_mld_decode_he_tb_phy_data(phy_data, he, rx_status); 460 + /* that's it, below is only for SU/MU */ 353 461 return; 354 - case IWL_RX_PHY_INFO_TYPE_HE_TB_EXT: 355 - he->data1 |= cpu_to_le16(IEEE80211_RADIOTAP_HE_DATA1_SPTL_REUSE_KNOWN | 356 - IEEE80211_RADIOTAP_HE_DATA1_SPTL_REUSE2_KNOWN | 357 - IEEE80211_RADIOTAP_HE_DATA1_SPTL_REUSE3_KNOWN | 358 - IEEE80211_RADIOTAP_HE_DATA1_SPTL_REUSE4_KNOWN); 359 - he->data4 |= le16_encode_bits(le32_get_bits(phy_data->data2, 360 - IWL_RX_PHY_DATA2_HE_TB_EXT_SPTL_REUSE1), 361 - IEEE80211_RADIOTAP_HE_DATA4_TB_SPTL_REUSE1); 362 - he->data4 |= le16_encode_bits(le32_get_bits(phy_data->data2, 363 - IWL_RX_PHY_DATA2_HE_TB_EXT_SPTL_REUSE2), 364 - IEEE80211_RADIOTAP_HE_DATA4_TB_SPTL_REUSE2); 365 - he->data4 |= le16_encode_bits(le32_get_bits(phy_data->data2, 366 - IWL_RX_PHY_DATA2_HE_TB_EXT_SPTL_REUSE3), 367 - IEEE80211_RADIOTAP_HE_DATA4_TB_SPTL_REUSE3); 368 - he->data4 |= le16_encode_bits(le32_get_bits(phy_data->data2, 369 - IWL_RX_PHY_DATA2_HE_TB_EXT_SPTL_REUSE4), 370 - IEEE80211_RADIOTAP_HE_DATA4_TB_SPTL_REUSE4); 371 - fallthrough; 372 - case IWL_RX_PHY_INFO_TYPE_HE_SU: 373 - case IWL_RX_PHY_INFO_TYPE_HE_MU: 374 - case IWL_RX_PHY_INFO_TYPE_HE_MU_EXT: 375 - case IWL_RX_PHY_INFO_TYPE_HE_TB: 376 - /* HE common */ 377 - he->data1 |= cpu_to_le16(IEEE80211_RADIOTAP_HE_DATA1_LDPC_XSYMSEG_KNOWN | 378 - IEEE80211_RADIOTAP_HE_DATA1_DOPPLER_KNOWN | 379 - IEEE80211_RADIOTAP_HE_DATA1_BSS_COLOR_KNOWN); 380 - he->data2 |= cpu_to_le16(IEEE80211_RADIOTAP_HE_DATA2_PRE_FEC_PAD_KNOWN | 381 - IEEE80211_RADIOTAP_HE_DATA2_PE_DISAMBIG_KNOWN | 382 - IEEE80211_RADIOTAP_HE_DATA2_TXOP_KNOWN | 383 - IEEE80211_RADIOTAP_HE_DATA2_NUM_LTF_SYMS_KNOWN); 384 - he->data3 |= le16_encode_bits(le32_get_bits(phy_data->data0, 385 - IWL_RX_PHY_DATA0_HE_BSS_COLOR_MASK), 386 - IEEE80211_RADIOTAP_HE_DATA3_BSS_COLOR); 387 - if (phy_data->info_type != IWL_RX_PHY_INFO_TYPE_HE_TB && 388 - phy_data->info_type != IWL_RX_PHY_INFO_TYPE_HE_TB_EXT) { 389 - he->data1 |= cpu_to_le16(IEEE80211_RADIOTAP_HE_DATA1_UL_DL_KNOWN); 390 - he->data3 |= le16_encode_bits(le32_get_bits(phy_data->data0, 391 - IWL_RX_PHY_DATA0_HE_UPLINK), 392 - IEEE80211_RADIOTAP_HE_DATA3_UL_DL); 393 - } 394 - he->data3 |= le16_encode_bits(le32_get_bits(phy_data->data0, 395 - IWL_RX_PHY_DATA0_HE_LDPC_EXT_SYM), 396 - IEEE80211_RADIOTAP_HE_DATA3_LDPC_XSYMSEG); 397 - he->data5 |= le16_encode_bits(le32_get_bits(phy_data->data0, 398 - IWL_RX_PHY_DATA0_HE_PRE_FEC_PAD_MASK), 399 - IEEE80211_RADIOTAP_HE_DATA5_PRE_FEC_PAD); 400 - he->data5 |= le16_encode_bits(le32_get_bits(phy_data->data0, 401 - IWL_RX_PHY_DATA0_HE_PE_DISAMBIG), 402 - IEEE80211_RADIOTAP_HE_DATA5_PE_DISAMBIG); 403 - he->data5 |= le16_encode_bits(le32_get_bits(phy_data->data1, 404 - IWL_RX_PHY_DATA1_HE_LTF_NUM_MASK), 405 - IEEE80211_RADIOTAP_HE_DATA5_NUM_LTF_SYMS); 406 - he->data6 |= le16_encode_bits(le32_get_bits(phy_data->data0, 407 - IWL_RX_PHY_DATA0_HE_TXOP_DUR_MASK), 408 - IEEE80211_RADIOTAP_HE_DATA6_TXOP); 409 - he->data6 |= le16_encode_bits(le32_get_bits(phy_data->data0, 410 - IWL_RX_PHY_DATA0_HE_DOPPLER), 411 - IEEE80211_RADIOTAP_HE_DATA6_DOPPLER); 412 - break; 413 - } 462 + case RATE_MCS_HE_TYPE_MU: 463 + iwl_mld_decode_he_mu(phy_data, he, he_mu, rx_status); 414 464 415 - switch (phy_data->info_type) { 416 - case IWL_RX_PHY_INFO_TYPE_HE_MU_EXT: 417 - case IWL_RX_PHY_INFO_TYPE_HE_MU: 418 - case IWL_RX_PHY_INFO_TYPE_HE_SU: 419 - he->data1 |= cpu_to_le16(IEEE80211_RADIOTAP_HE_DATA1_SPTL_REUSE_KNOWN); 420 - he->data4 |= le16_encode_bits(le32_get_bits(phy_data->data0, 421 - IWL_RX_PHY_DATA0_HE_SPATIAL_REUSE_MASK), 422 - IEEE80211_RADIOTAP_HE_DATA4_SU_MU_SPTL_REUSE); 465 + nsts = le32_get_bits(phy_data->ntfy->sigs.he.b, 466 + OFDM_RX_FRAME_HE_SIGB_NSTS) + 1; 423 467 break; 424 - default: 425 - /* nothing here */ 426 - break; 427 - } 428 - 429 - switch (phy_data->info_type) { 430 - case IWL_RX_PHY_INFO_TYPE_HE_MU_EXT: 431 - he_mu->flags1 |= 432 - le16_encode_bits(le16_get_bits(phy_data->data4, 433 - IWL_RX_PHY_DATA4_HE_MU_EXT_SIGB_DCM), 434 - IEEE80211_RADIOTAP_HE_MU_FLAGS1_SIG_B_DCM); 435 - he_mu->flags1 |= 436 - le16_encode_bits(le16_get_bits(phy_data->data4, 437 - IWL_RX_PHY_DATA4_HE_MU_EXT_SIGB_MCS_MASK), 438 - IEEE80211_RADIOTAP_HE_MU_FLAGS1_SIG_B_MCS); 439 - he_mu->flags2 |= 440 - le16_encode_bits(le16_get_bits(phy_data->data4, 441 - IWL_RX_PHY_DATA4_HE_MU_EXT_PREAMBLE_PUNC_TYPE_MASK), 442 - IEEE80211_RADIOTAP_HE_MU_FLAGS2_PUNC_FROM_SIG_A_BW); 443 - iwl_mld_decode_he_mu_ext(phy_data, he_mu); 444 - fallthrough; 445 - case IWL_RX_PHY_INFO_TYPE_HE_MU: 446 - he_mu->flags2 |= 447 - le16_encode_bits(le32_get_bits(phy_data->data1, 448 - IWL_RX_PHY_DATA1_HE_MU_SIBG_SYM_OR_USER_NUM_MASK), 449 - IEEE80211_RADIOTAP_HE_MU_FLAGS2_SIG_B_SYMS_USERS); 450 - he_mu->flags2 |= 451 - le16_encode_bits(le32_get_bits(phy_data->data1, 452 - IWL_RX_PHY_DATA1_HE_MU_SIGB_COMPRESSION), 453 - IEEE80211_RADIOTAP_HE_MU_FLAGS2_SIG_B_COMP); 454 - fallthrough; 455 - case IWL_RX_PHY_INFO_TYPE_HE_TB: 456 - case IWL_RX_PHY_INFO_TYPE_HE_TB_EXT: 457 - iwl_mld_decode_he_phy_ru_alloc(phy_data, he, he_mu, rx_status); 458 - break; 459 - case IWL_RX_PHY_INFO_TYPE_HE_SU: 468 + case RATE_MCS_HE_TYPE_SU: 469 + case RATE_MCS_HE_TYPE_EXT_SU: 460 470 he->data1 |= cpu_to_le16(IEEE80211_RADIOTAP_HE_DATA1_BEAM_CHANGE_KNOWN); 461 - he->data3 |= le16_encode_bits(le32_get_bits(phy_data->data0, 462 - IWL_RX_PHY_DATA0_HE_BEAM_CHNG), 463 - IEEE80211_RADIOTAP_HE_DATA3_BEAM_CHANGE); 464 - break; 465 - default: 466 - /* nothing */ 471 + he->data3 |= RTAP_ENC_HE(phy_data->ntfy->sigs.he.a1, 472 + OFDM_RX_FRAME_HE_BEAM_CHANGE, 473 + IEEE80211_RADIOTAP_HE_DATA3_BEAM_CHANGE); 474 + 475 + nsts = le32_get_bits(phy_data->ntfy->sigs.he.a1, 476 + OFDM_RX_FRAME_HE_NSTS) + 1; 467 477 break; 468 478 } 479 + 480 + rx_status->nss = nsts >> !!(rate_n_flags & RATE_MCS_STBC_MSK); 481 + 482 + he->data1 |= cpu_to_le16(IEEE80211_RADIOTAP_HE_DATA1_LDPC_XSYMSEG_KNOWN | 483 + IEEE80211_RADIOTAP_HE_DATA1_DOPPLER_KNOWN); 484 + he->data2 |= cpu_to_le16(IEEE80211_RADIOTAP_HE_DATA2_PRE_FEC_PAD_KNOWN | 485 + IEEE80211_RADIOTAP_HE_DATA2_PE_DISAMBIG_KNOWN | 486 + IEEE80211_RADIOTAP_HE_DATA2_TXOP_KNOWN | 487 + IEEE80211_RADIOTAP_HE_DATA2_NUM_LTF_SYMS_KNOWN); 488 + 489 + he->data3 |= RTAP_ENC_HE(phy_data->ntfy->sigs.he.a2, 490 + OFDM_RX_FRAME_HE_CODING_EXTRA_SYM, 491 + IEEE80211_RADIOTAP_HE_DATA3_LDPC_XSYMSEG); 492 + he->data5 |= RTAP_ENC_HE(phy_data->ntfy->sigs.he.a2, 493 + OFDM_RX_FRAME_HE_PRE_FEC_PAD_FACTOR, 494 + IEEE80211_RADIOTAP_HE_DATA5_PRE_FEC_PAD); 495 + he->data5 |= RTAP_ENC_HE(phy_data->ntfy->sigs.he.a2, 496 + OFDM_RX_FRAME_HE_PE_DISAMBIG, 497 + IEEE80211_RADIOTAP_HE_DATA5_PE_DISAMBIG); 498 + he->data5 |= RTAP_ENC_HE(phy_data->ntfy->sigs.he.a2, 499 + OFDM_RX_FRAME_HE_MU_NUM_OF_LTF_SYM, 500 + IEEE80211_RADIOTAP_HE_DATA5_NUM_LTF_SYMS); 501 + he->data6 |= RTAP_ENC_HE(phy_data->ntfy->sigs.he.a2, 502 + OFDM_RX_FRAME_HE_TXOP_DURATION, 503 + IEEE80211_RADIOTAP_HE_DATA6_TXOP); 504 + he->data6 |= RTAP_ENC_HE(phy_data->ntfy->sigs.he.a2, 505 + OFDM_RX_FRAME_HE_DOPPLER, 506 + IEEE80211_RADIOTAP_HE_DATA6_DOPPLER); 507 + 508 + he->data1 |= cpu_to_le16(IEEE80211_RADIOTAP_HE_DATA1_UL_DL_KNOWN | 509 + IEEE80211_RADIOTAP_HE_DATA1_BSS_COLOR_KNOWN | 510 + IEEE80211_RADIOTAP_HE_DATA1_SPTL_REUSE_KNOWN); 511 + 512 + he->data3 |= RTAP_ENC_HE(phy_data->ntfy->sigs.he.a1, 513 + OFDM_RX_FRAME_HE_BSS_COLOR, 514 + IEEE80211_RADIOTAP_HE_DATA3_BSS_COLOR); 515 + he->data3 |= RTAP_ENC_HE(phy_data->ntfy->sigs.he.a1, 516 + OFDM_RX_FRAME_HE_UL_FLAG, 517 + IEEE80211_RADIOTAP_HE_DATA3_UL_DL); 518 + he->data4 |= RTAP_ENC_HE(phy_data->ntfy->sigs.he.a1, 519 + OFDM_RX_FRAME_HE_SPATIAL_REUSE, 520 + IEEE80211_RADIOTAP_HE_DATA4_SU_MU_SPTL_REUSE); 469 521 } 470 522 471 - static void iwl_mld_rx_he(struct iwl_mld *mld, struct sk_buff *skb, 472 - struct iwl_mld_rx_phy_data *phy_data, 473 - int queue) 523 + static void iwl_mld_rx_he(struct sk_buff *skb, 524 + struct iwl_mld_rx_phy_data *phy_data) 474 525 { 475 526 struct ieee80211_rx_status *rx_status = IEEE80211_SKB_RXCB(skb); 476 527 struct ieee80211_radiotap_he *he = NULL; ··· 529 510 .flags2 = cpu_to_le16(IEEE80211_RADIOTAP_HE_MU_FLAGS2_PUNC_FROM_SIG_A_BW_KNOWN | 530 511 IEEE80211_RADIOTAP_HE_MU_FLAGS2_BW_FROM_SIG_A_BW_KNOWN), 531 512 }; 532 - u16 phy_info = phy_data->phy_info; 533 513 534 514 he = skb_put_data(skb, &known, sizeof(known)); 535 515 rx_status->flag |= RX_FLAG_RADIOTAP_HE; 536 516 537 - if (phy_data->info_type == IWL_RX_PHY_INFO_TYPE_HE_MU || 538 - phy_data->info_type == IWL_RX_PHY_INFO_TYPE_HE_MU_EXT) { 539 - he_mu = skb_put_data(skb, &mu_known, sizeof(mu_known)); 540 - rx_status->flag |= RX_FLAG_RADIOTAP_HE_MU; 541 - } 542 - 543 - /* report the AMPDU-EOF bit on single frames */ 544 - if (!queue && !(phy_info & IWL_RX_MPDU_PHY_AMPDU)) { 545 - rx_status->flag |= RX_FLAG_AMPDU_DETAILS; 546 - rx_status->flag |= RX_FLAG_AMPDU_EOF_BIT_KNOWN; 547 - if (phy_data->data0 & cpu_to_le32(IWL_RX_PHY_DATA0_HE_DELIM_EOF)) 548 - rx_status->flag |= RX_FLAG_AMPDU_EOF_BIT; 549 - } 550 - 551 - if (phy_info & IWL_RX_MPDU_PHY_TSF_OVERLOAD) 552 - iwl_mld_decode_he_phy_data(phy_data, he, he_mu, rx_status, 553 - queue); 554 - 555 - /* update aggregation data for monitor sake on default queue */ 556 - if (!queue && (phy_info & IWL_RX_MPDU_PHY_TSF_OVERLOAD) && 557 - (phy_info & IWL_RX_MPDU_PHY_AMPDU) && phy_data->first_subframe) { 558 - rx_status->flag |= RX_FLAG_AMPDU_EOF_BIT_KNOWN; 559 - if (phy_data->data0 & cpu_to_le32(IWL_RX_PHY_DATA0_EHT_DELIM_EOF)) 560 - rx_status->flag |= RX_FLAG_AMPDU_EOF_BIT; 561 - } 562 - 563 - if (he_type == RATE_MCS_HE_TYPE_EXT_SU && 564 - rate_n_flags & RATE_MCS_HE_106T_MSK) { 565 - rx_status->bw = RATE_INFO_BW_HE_RU; 566 - rx_status->he_ru = NL80211_RATE_INFO_HE_RU_ALLOC_106; 567 - } 568 - 569 - /* actually data is filled in mac80211 */ 570 - if (he_type == RATE_MCS_HE_TYPE_SU || 571 - he_type == RATE_MCS_HE_TYPE_EXT_SU) 517 + switch (he_type) { 518 + case RATE_MCS_HE_TYPE_EXT_SU: 519 + /* 520 + * Except for this special case we won't have 521 + * HE RU allocation info outside of monitor mode 522 + * since we don't get the PHY notif. 523 + */ 524 + if (rate_n_flags & RATE_MCS_HE_106T_MSK) { 525 + rx_status->bw = RATE_INFO_BW_HE_RU; 526 + rx_status->he_ru = NL80211_RATE_INFO_HE_RU_ALLOC_106; 527 + } 528 + fallthrough; 529 + case RATE_MCS_HE_TYPE_SU: 530 + /* actual data is filled in mac80211 */ 572 531 he->data1 |= 573 532 cpu_to_le16(IEEE80211_RADIOTAP_HE_DATA1_BW_RU_ALLOC_KNOWN); 533 + break; 534 + } 574 535 575 536 #define CHECK_TYPE(F) \ 576 537 BUILD_BUG_ON(IEEE80211_RADIOTAP_HE_DATA1_FORMAT_ ## F != \ ··· 566 567 if (rate_n_flags & RATE_MCS_BF_MSK) 567 568 he->data5 |= cpu_to_le16(IEEE80211_RADIOTAP_HE_DATA5_TXBF); 568 569 569 - switch ((rate_n_flags & RATE_MCS_HE_GI_LTF_MSK) >> 570 - RATE_MCS_HE_GI_LTF_POS) { 570 + switch (u32_get_bits(rate_n_flags, RATE_MCS_HE_GI_LTF_MSK)) { 571 571 case 0: 572 572 if (he_type == RATE_MCS_HE_TYPE_TRIG) 573 573 rx_status->he_gi = NL80211_RATE_INFO_HE_GI_1_6; ··· 607 609 608 610 he->data5 |= le16_encode_bits(ltf, 609 611 IEEE80211_RADIOTAP_HE_DATA5_LTF_SIZE); 612 + 613 + if (likely(!phy_data->ntfy)) 614 + return; 615 + 616 + if (he_type == RATE_MCS_HE_TYPE_MU) { 617 + he_mu = skb_put_data(skb, &mu_known, sizeof(mu_known)); 618 + rx_status->flag |= RX_FLAG_RADIOTAP_HE_MU; 619 + } 620 + 621 + iwl_mld_decode_he_phy_data(phy_data, he, he_mu, rx_status); 610 622 } 611 623 612 624 static void iwl_mld_decode_lsig(struct sk_buff *skb, 613 625 struct iwl_mld_rx_phy_data *phy_data) 614 626 { 615 627 struct ieee80211_rx_status *rx_status = IEEE80211_SKB_RXCB(skb); 628 + u32 format = phy_data->rate_n_flags & RATE_MCS_MOD_TYPE_MSK; 616 629 struct ieee80211_radiotap_lsig *lsig; 630 + u32 lsig_len, rate; 617 631 618 - switch (phy_data->info_type) { 619 - case IWL_RX_PHY_INFO_TYPE_HT: 620 - case IWL_RX_PHY_INFO_TYPE_VHT_SU: 621 - case IWL_RX_PHY_INFO_TYPE_VHT_MU: 622 - case IWL_RX_PHY_INFO_TYPE_HE_TB_EXT: 623 - case IWL_RX_PHY_INFO_TYPE_HE_SU: 624 - case IWL_RX_PHY_INFO_TYPE_HE_MU: 625 - case IWL_RX_PHY_INFO_TYPE_HE_MU_EXT: 626 - case IWL_RX_PHY_INFO_TYPE_HE_TB: 627 - case IWL_RX_PHY_INFO_TYPE_EHT_MU: 628 - case IWL_RX_PHY_INFO_TYPE_EHT_TB: 629 - case IWL_RX_PHY_INFO_TYPE_EHT_MU_EXT: 630 - case IWL_RX_PHY_INFO_TYPE_EHT_TB_EXT: 631 - lsig = skb_put(skb, sizeof(*lsig)); 632 - lsig->data1 = cpu_to_le16(IEEE80211_RADIOTAP_LSIG_DATA1_LENGTH_KNOWN); 633 - lsig->data2 = le16_encode_bits(le32_get_bits(phy_data->data1, 634 - IWL_RX_PHY_DATA1_LSIG_LEN_MASK), 635 - IEEE80211_RADIOTAP_LSIG_DATA2_LENGTH); 636 - rx_status->flag |= RX_FLAG_RADIOTAP_LSIG; 637 - break; 638 - default: 639 - break; 640 - } 632 + if (likely(!phy_data->ntfy)) 633 + return; 634 + 635 + /* 636 + * Technically legacy CCK/OFDM frames don't have an L-SIG 637 + * since that's the compat format for HT (non-greenfield) 638 + * and up. However, it's meant to be compatible with the 639 + * LENGTH and RATE fields in Clause 17 and 18 OFDM frames 640 + * so include the field for any non-CCK frame. For CCK it 641 + * cannot work, since the LENGTH field for them is 16-bit 642 + * and the radiotap field only has 12 bits. 643 + */ 644 + if (format == RATE_MCS_MOD_TYPE_CCK) 645 + return; 646 + 647 + lsig_len = le32_get_bits(phy_data->ntfy->legacy_sig.ofdm, 648 + OFDM_RX_LEGACY_LENGTH); 649 + rate = le32_get_bits(phy_data->ntfy->legacy_sig.ofdm, OFDM_RX_RATE); 650 + 651 + lsig = skb_put(skb, sizeof(*lsig)); 652 + lsig->data1 = cpu_to_le16(IEEE80211_RADIOTAP_LSIG_DATA1_LENGTH_KNOWN) | 653 + cpu_to_le16(IEEE80211_RADIOTAP_LSIG_DATA1_RATE_KNOWN); 654 + lsig->data2 = le16_encode_bits(lsig_len, 655 + IEEE80211_RADIOTAP_LSIG_DATA2_LENGTH) | 656 + le16_encode_bits(rate, IEEE80211_RADIOTAP_LSIG_DATA2_RATE); 657 + rx_status->flag |= RX_FLAG_RADIOTAP_LSIG; 641 658 } 642 659 643 660 /* Put a TLV on the skb and return data pointer ··· 680 667 (_usig)->value |= LE32_DEC_ENC(in_value, dec_bits, _enc_bits); \ 681 668 } while (0) 682 669 683 - #define __IWL_MLD_ENC_EHT_RU(rt_data, rt_ru, fw_data, fw_ru) \ 684 - eht->data[(rt_data)] |= \ 685 - (cpu_to_le32 \ 686 - (IEEE80211_RADIOTAP_EHT_DATA ## rt_data ## _RU_ALLOC_CC_ ## rt_ru ## _KNOWN) | \ 687 - LE32_DEC_ENC(data ## fw_data, \ 688 - IWL_RX_PHY_DATA ## fw_data ## _EHT_MU_EXT_RU_ALLOC_ ## fw_ru, \ 689 - IEEE80211_RADIOTAP_EHT_DATA ## rt_data ## _RU_ALLOC_CC_ ## rt_ru)) 690 - 691 - #define _IWL_MLD_ENC_EHT_RU(rt_data, rt_ru, fw_data, fw_ru) \ 692 - __IWL_MLD_ENC_EHT_RU(rt_data, rt_ru, fw_data, fw_ru) 693 - 694 - #define IEEE80211_RADIOTAP_RU_DATA_1_1_1 1 695 - #define IEEE80211_RADIOTAP_RU_DATA_2_1_1 2 696 - #define IEEE80211_RADIOTAP_RU_DATA_1_1_2 2 697 - #define IEEE80211_RADIOTAP_RU_DATA_2_1_2 2 698 - #define IEEE80211_RADIOTAP_RU_DATA_1_2_1 3 699 - #define IEEE80211_RADIOTAP_RU_DATA_2_2_1 3 700 - #define IEEE80211_RADIOTAP_RU_DATA_1_2_2 3 701 - #define IEEE80211_RADIOTAP_RU_DATA_2_2_2 4 702 - 703 - #define IWL_RX_RU_DATA_A1 2 704 - #define IWL_RX_RU_DATA_A2 2 705 - #define IWL_RX_RU_DATA_B1 2 706 - #define IWL_RX_RU_DATA_B2 4 707 - #define IWL_RX_RU_DATA_C1 3 708 - #define IWL_RX_RU_DATA_C2 3 709 - #define IWL_RX_RU_DATA_D1 4 710 - #define IWL_RX_RU_DATA_D2 4 711 - 712 - #define IWL_MLD_ENC_EHT_RU(rt_ru, fw_ru) \ 713 - _IWL_MLD_ENC_EHT_RU(IEEE80211_RADIOTAP_RU_DATA_ ## rt_ru, \ 714 - rt_ru, \ 715 - IWL_RX_RU_DATA_ ## fw_ru, \ 716 - fw_ru) 717 - 718 - static void iwl_mld_decode_eht_ext_mu(struct iwl_mld *mld, 719 - struct iwl_mld_rx_phy_data *phy_data, 720 - struct ieee80211_rx_status *rx_status, 721 - struct ieee80211_radiotap_eht *eht, 722 - struct ieee80211_radiotap_eht_usig *usig) 670 + static void iwl_mld_decode_eht_usig_tb(struct iwl_mld_rx_phy_data *phy_data, 671 + struct ieee80211_radiotap_eht_usig *usig) 723 672 { 724 - if (phy_data->with_data) { 725 - __le32 data1 = phy_data->data1; 726 - __le32 data2 = phy_data->data2; 727 - __le32 data3 = phy_data->data3; 728 - __le32 data4 = phy_data->eht_data4; 729 - __le32 data5 = phy_data->data5; 730 - u32 phy_bw = phy_data->rate_n_flags & RATE_MCS_CHAN_WIDTH_MSK; 673 + __le32 usig_a1 = phy_data->ntfy->sigs.eht_tb.usig_a1; 674 + __le32 usig_a2 = phy_data->ntfy->sigs.eht_tb.usig_a2_eht; 731 675 732 - IWL_MLD_ENC_USIG_VALUE_MASK(usig, data5, 733 - IWL_RX_PHY_DATA5_EHT_TYPE_AND_COMP, 734 - IEEE80211_RADIOTAP_EHT_USIG2_MU_B0_B1_PPDU_TYPE); 735 - IWL_MLD_ENC_USIG_VALUE_MASK(usig, data5, 736 - IWL_RX_PHY_DATA5_EHT_MU_PUNC_CH_CODE, 737 - IEEE80211_RADIOTAP_EHT_USIG2_MU_B3_B7_PUNCTURED_INFO); 738 - IWL_MLD_ENC_USIG_VALUE_MASK(usig, data4, 739 - IWL_RX_PHY_DATA4_EHT_MU_EXT_SIGB_MCS, 740 - IEEE80211_RADIOTAP_EHT_USIG2_MU_B9_B10_SIG_MCS); 741 - IWL_MLD_ENC_USIG_VALUE_MASK 742 - (usig, data1, IWL_RX_PHY_DATA1_EHT_MU_NUM_SIG_SYM_USIGA2, 743 - IEEE80211_RADIOTAP_EHT_USIG2_MU_B11_B15_EHT_SIG_SYMBOLS); 744 - 745 - eht->user_info[0] |= 746 - cpu_to_le32(IEEE80211_RADIOTAP_EHT_USER_INFO_STA_ID_KNOWN) | 747 - LE32_DEC_ENC(data5, IWL_RX_PHY_DATA5_EHT_MU_STA_ID_USR, 748 - IEEE80211_RADIOTAP_EHT_USER_INFO_STA_ID); 749 - 750 - eht->known |= cpu_to_le32(IEEE80211_RADIOTAP_EHT_KNOWN_NR_NON_OFDMA_USERS_M); 751 - eht->data[7] |= LE32_DEC_ENC 752 - (data5, IWL_RX_PHY_DATA5_EHT_MU_NUM_USR_NON_OFDMA, 753 - IEEE80211_RADIOTAP_EHT_DATA7_NUM_OF_NON_OFDMA_USERS); 754 - 755 - /* 756 - * Hardware labels the content channels/RU allocation values 757 - * as follows: 758 - * Content Channel 1 Content Channel 2 759 - * 20 MHz: A1 760 - * 40 MHz: A1 B1 761 - * 80 MHz: A1 C1 B1 D1 762 - * 160 MHz: A1 C1 A2 C2 B1 D1 B2 D2 763 - * 320 MHz: A1 C1 A2 C2 A3 C3 A4 C4 B1 D1 B2 D2 B3 D3 B4 D4 764 - * 765 - * However firmware can only give us A1-D2, so the higher 766 - * frequencies are missing. 767 - */ 768 - 769 - switch (phy_bw) { 770 - case RATE_MCS_CHAN_WIDTH_320: 771 - /* additional values are missing in RX metadata */ 772 - fallthrough; 773 - case RATE_MCS_CHAN_WIDTH_160: 774 - /* content channel 1 */ 775 - IWL_MLD_ENC_EHT_RU(1_2_1, A2); 776 - IWL_MLD_ENC_EHT_RU(1_2_2, C2); 777 - /* content channel 2 */ 778 - IWL_MLD_ENC_EHT_RU(2_2_1, B2); 779 - IWL_MLD_ENC_EHT_RU(2_2_2, D2); 780 - fallthrough; 781 - case RATE_MCS_CHAN_WIDTH_80: 782 - /* content channel 1 */ 783 - IWL_MLD_ENC_EHT_RU(1_1_2, C1); 784 - /* content channel 2 */ 785 - IWL_MLD_ENC_EHT_RU(2_1_2, D1); 786 - fallthrough; 787 - case RATE_MCS_CHAN_WIDTH_40: 788 - /* content channel 2 */ 789 - IWL_MLD_ENC_EHT_RU(2_1_1, B1); 790 - fallthrough; 791 - case RATE_MCS_CHAN_WIDTH_20: 792 - IWL_MLD_ENC_EHT_RU(1_1_1, A1); 793 - break; 794 - } 795 - } else { 796 - __le32 usig_a1 = phy_data->rx_vec[0]; 797 - __le32 usig_a2 = phy_data->rx_vec[1]; 798 - 799 - IWL_MLD_ENC_USIG_VALUE_MASK(usig, usig_a1, 800 - IWL_RX_USIG_A1_DISREGARD, 801 - IEEE80211_RADIOTAP_EHT_USIG1_MU_B20_B24_DISREGARD); 802 - IWL_MLD_ENC_USIG_VALUE_MASK(usig, usig_a1, 803 - IWL_RX_USIG_A1_VALIDATE, 804 - IEEE80211_RADIOTAP_EHT_USIG1_MU_B25_VALIDATE); 805 - IWL_MLD_ENC_USIG_VALUE_MASK(usig, usig_a2, 806 - IWL_RX_USIG_A2_EHT_PPDU_TYPE, 807 - IEEE80211_RADIOTAP_EHT_USIG2_MU_B0_B1_PPDU_TYPE); 808 - IWL_MLD_ENC_USIG_VALUE_MASK(usig, usig_a2, 809 - IWL_RX_USIG_A2_EHT_USIG2_VALIDATE_B2, 810 - IEEE80211_RADIOTAP_EHT_USIG2_MU_B2_VALIDATE); 811 - IWL_MLD_ENC_USIG_VALUE_MASK(usig, usig_a2, 812 - IWL_RX_USIG_A2_EHT_PUNC_CHANNEL, 813 - IEEE80211_RADIOTAP_EHT_USIG2_MU_B3_B7_PUNCTURED_INFO); 814 - IWL_MLD_ENC_USIG_VALUE_MASK(usig, usig_a2, 815 - IWL_RX_USIG_A2_EHT_USIG2_VALIDATE_B8, 816 - IEEE80211_RADIOTAP_EHT_USIG2_MU_B8_VALIDATE); 817 - IWL_MLD_ENC_USIG_VALUE_MASK(usig, usig_a2, 818 - IWL_RX_USIG_A2_EHT_SIG_MCS, 819 - IEEE80211_RADIOTAP_EHT_USIG2_MU_B9_B10_SIG_MCS); 820 - IWL_MLD_ENC_USIG_VALUE_MASK 821 - (usig, usig_a2, IWL_RX_USIG_A2_EHT_SIG_SYM_NUM, 822 - IEEE80211_RADIOTAP_EHT_USIG2_MU_B11_B15_EHT_SIG_SYMBOLS); 823 - IWL_MLD_ENC_USIG_VALUE_MASK(usig, usig_a2, 824 - IWL_RX_USIG_A2_EHT_CRC_OK, 825 - IEEE80211_RADIOTAP_EHT_USIG2_MU_B16_B19_CRC); 826 - } 676 + IWL_MLD_ENC_USIG_VALUE_MASK(usig, usig_a1, 677 + OFDM_RX_FRAME_EHT_USIG1_DISREGARD, 678 + IEEE80211_RADIOTAP_EHT_USIG1_TB_B20_B25_DISREGARD); 679 + IWL_MLD_ENC_USIG_VALUE_MASK(usig, usig_a2, 680 + OFDM_RX_FRAME_EHT_PPDU_TYPE, 681 + IEEE80211_RADIOTAP_EHT_USIG2_TB_B0_B1_PPDU_TYPE); 682 + IWL_MLD_ENC_USIG_VALUE_MASK(usig, usig_a2, 683 + OFDM_RX_FRAME_EHT_USIG2_VALIDATE_B2, 684 + IEEE80211_RADIOTAP_EHT_USIG2_TB_B2_VALIDATE); 685 + IWL_MLD_ENC_USIG_VALUE_MASK(usig, usig_a2, 686 + OFDM_RX_FRAME_EHT_TRIG_SPATIAL_REUSE_1, 687 + IEEE80211_RADIOTAP_EHT_USIG2_TB_B3_B6_SPATIAL_REUSE_1); 688 + IWL_MLD_ENC_USIG_VALUE_MASK(usig, usig_a2, 689 + OFDM_RX_FRAME_EHT_TRIG_SPATIAL_REUSE_2, 690 + IEEE80211_RADIOTAP_EHT_USIG2_TB_B7_B10_SPATIAL_REUSE_2); 691 + IWL_MLD_ENC_USIG_VALUE_MASK(usig, usig_a2, 692 + OFDM_RX_FRAME_EHT_TRIG_USIG2_DISREGARD, 693 + IEEE80211_RADIOTAP_EHT_USIG2_TB_B11_B15_DISREGARD); 827 694 } 828 695 829 - static void iwl_mld_decode_eht_ext_tb(struct iwl_mld *mld, 830 - struct iwl_mld_rx_phy_data *phy_data, 831 - struct ieee80211_rx_status *rx_status, 832 - struct ieee80211_radiotap_eht *eht, 833 - struct ieee80211_radiotap_eht_usig *usig) 696 + static void iwl_mld_decode_eht_usig_non_tb(struct iwl_mld_rx_phy_data *phy_data, 697 + struct ieee80211_radiotap_eht_usig *usig) 834 698 { 835 - if (phy_data->with_data) { 836 - __le32 data5 = phy_data->data5; 699 + __le32 usig_a1 = phy_data->ntfy->sigs.eht.usig_a1; 700 + __le32 usig_a2 = phy_data->ntfy->sigs.eht.usig_a2_eht; 837 701 838 - IWL_MLD_ENC_USIG_VALUE_MASK(usig, data5, 839 - IWL_RX_PHY_DATA5_EHT_TYPE_AND_COMP, 840 - IEEE80211_RADIOTAP_EHT_USIG2_TB_B0_B1_PPDU_TYPE); 841 - IWL_MLD_ENC_USIG_VALUE_MASK(usig, data5, 842 - IWL_RX_PHY_DATA5_EHT_TB_SPATIAL_REUSE1, 843 - IEEE80211_RADIOTAP_EHT_USIG2_TB_B3_B6_SPATIAL_REUSE_1); 844 - 845 - IWL_MLD_ENC_USIG_VALUE_MASK(usig, data5, 846 - IWL_RX_PHY_DATA5_EHT_TB_SPATIAL_REUSE2, 847 - IEEE80211_RADIOTAP_EHT_USIG2_TB_B7_B10_SPATIAL_REUSE_2); 848 - } else { 849 - __le32 usig_a1 = phy_data->rx_vec[0]; 850 - __le32 usig_a2 = phy_data->rx_vec[1]; 851 - 852 - IWL_MLD_ENC_USIG_VALUE_MASK(usig, usig_a1, 853 - IWL_RX_USIG_A1_DISREGARD, 854 - IEEE80211_RADIOTAP_EHT_USIG1_TB_B20_B25_DISREGARD); 855 - IWL_MLD_ENC_USIG_VALUE_MASK(usig, usig_a2, 856 - IWL_RX_USIG_A2_EHT_PPDU_TYPE, 857 - IEEE80211_RADIOTAP_EHT_USIG2_TB_B0_B1_PPDU_TYPE); 858 - IWL_MLD_ENC_USIG_VALUE_MASK(usig, usig_a2, 859 - IWL_RX_USIG_A2_EHT_USIG2_VALIDATE_B2, 860 - IEEE80211_RADIOTAP_EHT_USIG2_TB_B2_VALIDATE); 861 - IWL_MLD_ENC_USIG_VALUE_MASK(usig, usig_a2, 862 - IWL_RX_USIG_A2_EHT_TRIG_SPATIAL_REUSE_1, 863 - IEEE80211_RADIOTAP_EHT_USIG2_TB_B3_B6_SPATIAL_REUSE_1); 864 - IWL_MLD_ENC_USIG_VALUE_MASK(usig, usig_a2, 865 - IWL_RX_USIG_A2_EHT_TRIG_SPATIAL_REUSE_2, 866 - IEEE80211_RADIOTAP_EHT_USIG2_TB_B7_B10_SPATIAL_REUSE_2); 867 - IWL_MLD_ENC_USIG_VALUE_MASK(usig, usig_a2, 868 - IWL_RX_USIG_A2_EHT_TRIG_USIG2_DISREGARD, 869 - IEEE80211_RADIOTAP_EHT_USIG2_TB_B11_B15_DISREGARD); 870 - IWL_MLD_ENC_USIG_VALUE_MASK(usig, usig_a2, 871 - IWL_RX_USIG_A2_EHT_CRC_OK, 872 - IEEE80211_RADIOTAP_EHT_USIG2_TB_B16_B19_CRC); 873 - } 702 + IWL_MLD_ENC_USIG_VALUE_MASK(usig, usig_a1, 703 + OFDM_RX_FRAME_EHT_USIG1_DISREGARD, 704 + IEEE80211_RADIOTAP_EHT_USIG1_MU_B20_B24_DISREGARD); 705 + IWL_MLD_ENC_USIG_VALUE_MASK(usig, usig_a1, 706 + OFDM_RX_FRAME_EHT_USIG1_VALIDATE, 707 + IEEE80211_RADIOTAP_EHT_USIG1_MU_B25_VALIDATE); 708 + IWL_MLD_ENC_USIG_VALUE_MASK(usig, usig_a2, 709 + OFDM_RX_FRAME_EHT_PPDU_TYPE, 710 + IEEE80211_RADIOTAP_EHT_USIG2_MU_B0_B1_PPDU_TYPE); 711 + IWL_MLD_ENC_USIG_VALUE_MASK(usig, usig_a2, 712 + OFDM_RX_FRAME_EHT_USIG2_VALIDATE_B2, 713 + IEEE80211_RADIOTAP_EHT_USIG2_MU_B2_VALIDATE); 714 + IWL_MLD_ENC_USIG_VALUE_MASK(usig, usig_a2, 715 + OFDM_RX_FRAME_EHT_PUNC_CHANNEL, 716 + IEEE80211_RADIOTAP_EHT_USIG2_MU_B3_B7_PUNCTURED_INFO); 717 + IWL_MLD_ENC_USIG_VALUE_MASK(usig, usig_a2, 718 + OFDM_RX_FRAME_EHT_USIG2_VALIDATE_B8, 719 + IEEE80211_RADIOTAP_EHT_USIG2_MU_B8_VALIDATE); 720 + IWL_MLD_ENC_USIG_VALUE_MASK(usig, usig_a2, 721 + OFDM_RX_FRAME_EHT_SIG_MCS, 722 + IEEE80211_RADIOTAP_EHT_USIG2_MU_B9_B10_SIG_MCS); 723 + IWL_MLD_ENC_USIG_VALUE_MASK(usig, usig_a2, 724 + OFDM_RX_FRAME_EHT_SIG_SYM_NUM, 725 + IEEE80211_RADIOTAP_EHT_USIG2_MU_B11_B15_EHT_SIG_SYMBOLS); 874 726 } 875 727 876 - static void iwl_mld_decode_eht_ru(struct iwl_mld *mld, 877 - struct ieee80211_rx_status *rx_status, 878 - struct ieee80211_radiotap_eht *eht) 728 + static void iwl_mld_decode_eht_usig(struct iwl_mld_rx_phy_data *phy_data, 729 + struct sk_buff *skb) 879 730 { 880 - u32 ru = le32_get_bits(eht->data[8], 881 - IEEE80211_RADIOTAP_EHT_DATA8_RU_ALLOC_TB_FMT_B7_B1); 731 + u32 he_type = phy_data->rate_n_flags & RATE_MCS_HE_TYPE_MSK; 732 + __le32 usig_a1 = phy_data->ntfy->sigs.eht.usig_a1; 733 + __le32 usig_a2 = phy_data->ntfy->sigs.eht.usig_a2_eht; 734 + struct ieee80211_radiotap_eht_usig *usig; 735 + u32 bw; 736 + 737 + usig = iwl_mld_radiotap_put_tlv(skb, IEEE80211_RADIOTAP_EHT_USIG, 738 + sizeof(*usig)); 739 + 740 + BUILD_BUG_ON(offsetof(union iwl_sigs, eht.usig_a1) != 741 + offsetof(union iwl_sigs, eht_tb.usig_a1)); 742 + BUILD_BUG_ON(offsetof(union iwl_sigs, eht.usig_a2_eht) != 743 + offsetof(union iwl_sigs, eht_tb.usig_a2_eht)); 744 + 745 + usig->common |= cpu_to_le32(IEEE80211_RADIOTAP_EHT_USIG_COMMON_UL_DL_KNOWN | 746 + IEEE80211_RADIOTAP_EHT_USIG_COMMON_BSS_COLOR_KNOWN | 747 + IEEE80211_RADIOTAP_EHT_USIG_COMMON_VALIDATE_BITS_CHECKED | 748 + IEEE80211_RADIOTAP_EHT_USIG_COMMON_BW_KNOWN | 749 + IEEE80211_RADIOTAP_EHT_USIG_COMMON_TXOP_KNOWN); 750 + 751 + #define CHECK_BW(bw) \ 752 + BUILD_BUG_ON(IEEE80211_RADIOTAP_EHT_USIG_COMMON_BW_ ## bw ## MHZ != \ 753 + RATE_MCS_CHAN_WIDTH_ ## bw ## _VAL) 754 + CHECK_BW(20); 755 + CHECK_BW(40); 756 + CHECK_BW(80); 757 + CHECK_BW(160); 758 + #undef CHECK_BW 759 + BUILD_BUG_ON(IEEE80211_RADIOTAP_EHT_USIG_COMMON_BW_320MHZ_1 != 760 + RATE_MCS_CHAN_WIDTH_320_VAL); 761 + bw = u32_get_bits(phy_data->rate_n_flags, RATE_MCS_CHAN_WIDTH_MSK); 762 + /* specific handling for 320MHz-1/320MHz-2 */ 763 + if (bw == RATE_MCS_CHAN_WIDTH_320_VAL) 764 + bw += le32_get_bits(usig_a1, OFDM_RX_FRAME_EHT_BW320_SLOT); 765 + usig->common |= le32_encode_bits(bw, 766 + IEEE80211_RADIOTAP_EHT_USIG_COMMON_BW); 767 + 768 + usig->common |= LE32_DEC_ENC(usig_a1, OFDM_RX_FRAME_ENHANCED_WIFI_UL_FLAG, 769 + IEEE80211_RADIOTAP_EHT_USIG_COMMON_UL_DL); 770 + usig->common |= LE32_DEC_ENC(usig_a1, OFDM_RX_FRAME_ENHANCED_WIFI_BSS_COLOR, 771 + IEEE80211_RADIOTAP_EHT_USIG_COMMON_BSS_COLOR); 772 + 773 + if (le32_get_bits(usig_a1, OFDM_RX_FRAME_EHT_USIG1_VALIDATE) && 774 + le32_get_bits(usig_a2, OFDM_RX_FRAME_EHT_USIG2_VALIDATE_B2) && 775 + le32_get_bits(usig_a2, OFDM_RX_FRAME_EHT_USIG2_VALIDATE_B8)) 776 + usig->common |= cpu_to_le32(IEEE80211_RADIOTAP_EHT_USIG_COMMON_VALIDATE_BITS_OK); 777 + 778 + usig->common |= LE32_DEC_ENC(usig_a1, 779 + OFDM_RX_FRAME_ENHANCED_WIFI_TXOP_DURATION, 780 + IEEE80211_RADIOTAP_EHT_USIG_COMMON_TXOP); 781 + 782 + if (!le32_get_bits(usig_a2, OFDM_RX_USIG_CRC_OK)) 783 + usig->common |= cpu_to_le32(IEEE80211_RADIOTAP_EHT_USIG_COMMON_BAD_USIG_CRC); 784 + 785 + usig->common |= cpu_to_le32(IEEE80211_RADIOTAP_EHT_USIG_COMMON_PHY_VER_KNOWN); 786 + usig->common |= LE32_DEC_ENC(usig_a1, 787 + OFDM_RX_FRAME_ENHANCED_WIFI_VER_ID, 788 + IEEE80211_RADIOTAP_EHT_USIG_COMMON_PHY_VER); 789 + 790 + if (he_type == RATE_MCS_HE_TYPE_TRIG) 791 + iwl_mld_decode_eht_usig_tb(phy_data, usig); 792 + else 793 + iwl_mld_decode_eht_usig_non_tb(phy_data, usig); 794 + } 795 + 796 + static void 797 + iwl_mld_eht_set_ru_alloc(struct ieee80211_rx_status *rx_status, 798 + u32 ru_with_p80) 799 + { 882 800 enum nl80211_eht_ru_alloc nl_ru; 801 + u32 ru = ru_with_p80 >> 1; 883 802 884 - /* Using D1.5 Table 9-53a - Encoding of PS160 and RU Allocation subfields 885 - * in an EHT variant User Info field 803 + /* 804 + * HW always uses trigger frame format: 805 + * 806 + * Draft PIEEE802.11be D7.0 Table 9-46l - Encoding of the PS160 and 807 + * RU Allocation subfields in an EHT variant User Info field 886 808 */ 887 809 888 810 switch (ru) { ··· 877 929 rx_status->eht.ru = nl_ru; 878 930 } 879 931 880 - static void iwl_mld_decode_eht_phy_data(struct iwl_mld *mld, 881 - struct iwl_mld_rx_phy_data *phy_data, 882 - struct ieee80211_rx_status *rx_status, 883 - struct ieee80211_radiotap_eht *eht, 884 - struct ieee80211_radiotap_eht_usig *usig) 885 - 932 + static void iwl_mld_decode_eht_tb(struct iwl_mld_rx_phy_data *phy_data, 933 + struct ieee80211_rx_status *rx_status, 934 + struct ieee80211_radiotap_eht *eht) 886 935 { 887 - __le32 data0 = phy_data->data0; 888 - __le32 data1 = phy_data->data1; 889 - __le32 usig_a1 = phy_data->rx_vec[0]; 890 - u8 info_type = phy_data->info_type; 891 - 892 - /* Not in EHT range */ 893 - if (info_type < IWL_RX_PHY_INFO_TYPE_EHT_MU || 894 - info_type > IWL_RX_PHY_INFO_TYPE_EHT_TB_EXT) 936 + if (!(phy_data->ntfy->flags & IWL_SNIF_FLAG_VALID_TB_RX)) 895 937 return; 896 938 897 - usig->common |= cpu_to_le32 898 - (IEEE80211_RADIOTAP_EHT_USIG_COMMON_UL_DL_KNOWN | 899 - IEEE80211_RADIOTAP_EHT_USIG_COMMON_BSS_COLOR_KNOWN); 900 - if (phy_data->with_data) { 901 - usig->common |= LE32_DEC_ENC(data0, 902 - IWL_RX_PHY_DATA0_EHT_UPLINK, 903 - IEEE80211_RADIOTAP_EHT_USIG_COMMON_UL_DL); 904 - usig->common |= LE32_DEC_ENC(data0, 905 - IWL_RX_PHY_DATA0_EHT_BSS_COLOR_MASK, 906 - IEEE80211_RADIOTAP_EHT_USIG_COMMON_BSS_COLOR); 907 - } else { 908 - usig->common |= LE32_DEC_ENC(usig_a1, 909 - IWL_RX_USIG_A1_UL_FLAG, 910 - IEEE80211_RADIOTAP_EHT_USIG_COMMON_UL_DL); 911 - usig->common |= LE32_DEC_ENC(usig_a1, 912 - IWL_RX_USIG_A1_BSS_COLOR, 913 - IEEE80211_RADIOTAP_EHT_USIG_COMMON_BSS_COLOR); 914 - } 939 + eht->known |= cpu_to_le32(IEEE80211_RADIOTAP_EHT_KNOWN_RU_ALLOC_TB_FMT | 940 + IEEE80211_RADIOTAP_EHT_KNOWN_LDPC_EXTRA_SYM_OM | 941 + IEEE80211_RADIOTAP_EHT_KNOWN_PRE_PADD_FACOR_OM | 942 + IEEE80211_RADIOTAP_EHT_KNOWN_PE_DISAMBIGUITY_OM | 943 + IEEE80211_RADIOTAP_EHT_KNOWN_EHT_LTF | 944 + IEEE80211_RADIOTAP_EHT_KNOWN_PRIMARY_80); 915 945 916 - usig->common |= 917 - cpu_to_le32(IEEE80211_RADIOTAP_EHT_USIG_COMMON_VALIDATE_BITS_CHECKED); 918 - usig->common |= 919 - LE32_DEC_ENC(data0, IWL_RX_PHY_DATA0_EHT_VALIDATE, 920 - IEEE80211_RADIOTAP_EHT_USIG_COMMON_VALIDATE_BITS_OK); 921 - 922 - eht->known |= cpu_to_le32(IEEE80211_RADIOTAP_EHT_KNOWN_SPATIAL_REUSE); 923 - eht->data[0] |= LE32_DEC_ENC(data0, 924 - IWL_RX_PHY_DATA0_ETH_SPATIAL_REUSE_MASK, 925 - IEEE80211_RADIOTAP_EHT_DATA0_SPATIAL_REUSE); 926 - 927 - /* All RU allocating size/index is in TB format */ 928 - eht->known |= cpu_to_le32(IEEE80211_RADIOTAP_EHT_KNOWN_RU_ALLOC_TB_FMT); 929 - eht->data[8] |= LE32_DEC_ENC(data0, IWL_RX_PHY_DATA0_EHT_PS160, 946 + eht->data[8] |= LE32_DEC_ENC(phy_data->ntfy->sigs.eht_tb.tb_rx0, 947 + OFDM_UCODE_TRIG_BASE_PS160, 930 948 IEEE80211_RADIOTAP_EHT_DATA8_RU_ALLOC_TB_FMT_PS_160); 931 - eht->data[8] |= LE32_DEC_ENC(data1, IWL_RX_PHY_DATA1_EHT_RU_ALLOC_B0, 932 - IEEE80211_RADIOTAP_EHT_DATA8_RU_ALLOC_TB_FMT_B0); 933 - eht->data[8] |= LE32_DEC_ENC(data1, IWL_RX_PHY_DATA1_EHT_RU_ALLOC_B1_B7, 949 + eht->data[8] |= LE32_DEC_ENC(phy_data->ntfy->sigs.eht_tb.tb_rx1, 950 + OFDM_UCODE_TRIG_BASE_RX_RU, 951 + IEEE80211_RADIOTAP_EHT_DATA8_RU_ALLOC_TB_FMT_B0 | 934 952 IEEE80211_RADIOTAP_EHT_DATA8_RU_ALLOC_TB_FMT_B7_B1); 935 - 936 - iwl_mld_decode_eht_ru(mld, rx_status, eht); 937 - 938 - /* We only get here in case of IWL_RX_MPDU_PHY_TSF_OVERLOAD is set 939 - * which is on only in case of monitor mode so no need to check monitor 940 - * mode 941 - */ 942 - eht->known |= cpu_to_le32(IEEE80211_RADIOTAP_EHT_KNOWN_PRIMARY_80); 943 - eht->data[1] |= 944 - le32_encode_bits(mld->monitor.p80, 945 - IEEE80211_RADIOTAP_EHT_DATA1_PRIMARY_80); 946 - 947 - usig->common |= cpu_to_le32(IEEE80211_RADIOTAP_EHT_USIG_COMMON_TXOP_KNOWN); 948 - if (phy_data->with_data) 949 - usig->common |= LE32_DEC_ENC(data0, IWL_RX_PHY_DATA0_EHT_TXOP_DUR_MASK, 950 - IEEE80211_RADIOTAP_EHT_USIG_COMMON_TXOP); 951 - else 952 - usig->common |= LE32_DEC_ENC(usig_a1, IWL_RX_USIG_A1_TXOP_DURATION, 953 - IEEE80211_RADIOTAP_EHT_USIG_COMMON_TXOP); 954 - 955 - eht->known |= cpu_to_le32(IEEE80211_RADIOTAP_EHT_KNOWN_LDPC_EXTRA_SYM_OM); 956 - eht->data[0] |= LE32_DEC_ENC(data0, IWL_RX_PHY_DATA0_EHT_LDPC_EXT_SYM, 953 + eht->data[0] |= LE32_DEC_ENC(phy_data->ntfy->sigs.eht_tb.tb_rx1, 954 + OFDM_UCODE_TRIG_BASE_RX_CODING_EXTRA_SYM, 957 955 IEEE80211_RADIOTAP_EHT_DATA0_LDPC_EXTRA_SYM_OM); 958 - 959 - eht->known |= cpu_to_le32(IEEE80211_RADIOTAP_EHT_KNOWN_PRE_PADD_FACOR_OM); 960 - eht->data[0] |= LE32_DEC_ENC(data0, IWL_RX_PHY_DATA0_EHT_PRE_FEC_PAD_MASK, 961 - IEEE80211_RADIOTAP_EHT_DATA0_PRE_PADD_FACOR_OM); 962 - 963 - eht->known |= cpu_to_le32(IEEE80211_RADIOTAP_EHT_KNOWN_PE_DISAMBIGUITY_OM); 964 - eht->data[0] |= LE32_DEC_ENC(data0, IWL_RX_PHY_DATA0_EHT_PE_DISAMBIG, 956 + eht->data[0] |= LE32_DEC_ENC(phy_data->ntfy->sigs.eht_tb.tb_rx1, 957 + OFDM_UCODE_TRIG_BASE_RX_PRE_FEC_PAD_FACTOR, 958 + IEEE80211_RADIOTAP_EHT_DATA0_PRE_PADD_FACOR_OM); 959 + eht->data[0] |= LE32_DEC_ENC(phy_data->ntfy->sigs.eht_tb.tb_rx1, 960 + OFDM_UCODE_TRIG_BASE_RX_PE_DISAMBIG, 965 961 IEEE80211_RADIOTAP_EHT_DATA0_PE_DISAMBIGUITY_OM); 962 + eht->data[0] |= LE32_DEC_ENC(phy_data->ntfy->sigs.eht_tb.tb_rx1, 963 + OFDM_UCODE_TRIG_BASE_RX_NUM_OF_LTF_SYM, 964 + IEEE80211_RADIOTAP_EHT_DATA0_EHT_LTF); 965 + eht->data[1] |= LE32_DEC_ENC(phy_data->ntfy->sigs.eht_tb.tb_rx0, 966 + OFDM_UCODE_TRIG_BASE_RX_RU_P80, 967 + IEEE80211_RADIOTAP_EHT_DATA1_PRIMARY_80); 966 968 967 - /* TODO: what about IWL_RX_PHY_DATA0_EHT_BW320_SLOT */ 969 + iwl_mld_eht_set_ru_alloc(rx_status, 970 + le32_get_bits(phy_data->ntfy->sigs.eht_tb.tb_rx1, 971 + OFDM_UCODE_TRIG_BASE_RX_RU)); 972 + } 968 973 969 - if (!le32_get_bits(data0, IWL_RX_PHY_DATA0_EHT_SIGA_CRC_OK)) 970 - usig->common |= cpu_to_le32(IEEE80211_RADIOTAP_EHT_USIG_COMMON_BAD_USIG_CRC); 974 + static void iwl_mld_eht_decode_user_ru(struct iwl_mld_rx_phy_data *phy_data, 975 + struct ieee80211_radiotap_eht *eht) 976 + { 977 + u32 phy_bw = phy_data->rate_n_flags & RATE_MCS_CHAN_WIDTH_MSK; 971 978 972 - usig->common |= cpu_to_le32(IEEE80211_RADIOTAP_EHT_USIG_COMMON_PHY_VER_KNOWN); 973 - usig->common |= LE32_DEC_ENC(data0, IWL_RX_PHY_DATA0_EHT_PHY_VER, 974 - IEEE80211_RADIOTAP_EHT_USIG_COMMON_PHY_VER); 979 + if (!(phy_data->ntfy->flags & IWL_SNIF_FLAG_VALID_RU)) 980 + return; 981 + 982 + #define __IWL_MLD_ENC_EHT_RU(rt_data, rt_ru, fw_data, fw_ru) \ 983 + eht->data[(rt_data)] |= \ 984 + (cpu_to_le32(IEEE80211_RADIOTAP_EHT_DATA ## rt_data ## _RU_ALLOC_CC_ ## rt_ru ## _KNOWN) | \ 985 + LE32_DEC_ENC(phy_data->ntfy->sigs.eht.cmn[fw_data], \ 986 + OFDM_RX_FRAME_EHT_RU_ALLOC_ ## fw_data ## _ ## fw_ru, \ 987 + IEEE80211_RADIOTAP_EHT_DATA ## rt_data ## _RU_ALLOC_CC_ ## rt_ru)) 988 + 989 + #define _IWL_MLD_ENC_EHT_RU(rt_data, rt_ru, fw_data, fw_ru) \ 990 + __IWL_MLD_ENC_EHT_RU(rt_data, rt_ru, fw_data, fw_ru) 991 + 992 + #define IEEE80211_RADIOTAP_RU_DATA_1_1_1 1 993 + #define IEEE80211_RADIOTAP_RU_DATA_2_1_1 2 994 + #define IEEE80211_RADIOTAP_RU_DATA_1_1_2 2 995 + #define IEEE80211_RADIOTAP_RU_DATA_2_1_2 2 996 + #define IEEE80211_RADIOTAP_RU_DATA_1_2_1 3 997 + #define IEEE80211_RADIOTAP_RU_DATA_2_2_1 3 998 + #define IEEE80211_RADIOTAP_RU_DATA_1_2_2 3 999 + #define IEEE80211_RADIOTAP_RU_DATA_2_2_2 4 1000 + #define IEEE80211_RADIOTAP_RU_DATA_1_2_3 4 1001 + #define IEEE80211_RADIOTAP_RU_DATA_2_2_3 4 1002 + #define IEEE80211_RADIOTAP_RU_DATA_1_2_4 5 1003 + #define IEEE80211_RADIOTAP_RU_DATA_2_2_4 5 1004 + #define IEEE80211_RADIOTAP_RU_DATA_1_2_5 5 1005 + #define IEEE80211_RADIOTAP_RU_DATA_2_2_5 6 1006 + #define IEEE80211_RADIOTAP_RU_DATA_1_2_6 6 1007 + #define IEEE80211_RADIOTAP_RU_DATA_2_2_6 6 1008 + 1009 + #define IWL_RX_RU_DATA_A1 0 1010 + #define IWL_RX_RU_DATA_A2 0 1011 + #define IWL_RX_RU_DATA_A3 0 1012 + #define IWL_RX_RU_DATA_A4 4 1013 + #define IWL_RX_RU_DATA_B1 1 1014 + #define IWL_RX_RU_DATA_B2 1 1015 + #define IWL_RX_RU_DATA_B3 1 1016 + #define IWL_RX_RU_DATA_B4 4 1017 + #define IWL_RX_RU_DATA_C1 2 1018 + #define IWL_RX_RU_DATA_C2 2 1019 + #define IWL_RX_RU_DATA_C3 2 1020 + #define IWL_RX_RU_DATA_C4 5 1021 + #define IWL_RX_RU_DATA_D1 3 1022 + #define IWL_RX_RU_DATA_D2 3 1023 + #define IWL_RX_RU_DATA_D3 3 1024 + #define IWL_RX_RU_DATA_D4 5 1025 + 1026 + #define IWL_MLD_ENC_EHT_RU(rt_ru, fw_ru) \ 1027 + _IWL_MLD_ENC_EHT_RU(IEEE80211_RADIOTAP_RU_DATA_ ## rt_ru, \ 1028 + rt_ru, \ 1029 + IWL_RX_RU_DATA_ ## fw_ru, \ 1030 + fw_ru) 975 1031 976 1032 /* 977 - * TODO: what about TB - IWL_RX_PHY_DATA1_EHT_TB_PILOT_TYPE, 978 - * IWL_RX_PHY_DATA1_EHT_TB_LOW_SS 1033 + * Hardware labels the content channels/RU allocation values 1034 + * as follows: 1035 + * 1036 + * Content Channel 1 Content Channel 2 1037 + * 20 MHz: A1 1038 + * 40 MHz: A1 B1 1039 + * 80 MHz: A1 C1 B1 D1 1040 + * 160 MHz: A1 C1 A2 C2 B1 D1 B2 D2 1041 + * 320 MHz: A1 C1 A2 C2 A3 C3 A4 C4 B1 D1 B2 D2 B3 D3 B4 D4 979 1042 */ 980 1043 981 - eht->known |= cpu_to_le32(IEEE80211_RADIOTAP_EHT_KNOWN_EHT_LTF); 982 - eht->data[0] |= LE32_DEC_ENC(data1, IWL_RX_PHY_DATA1_EHT_SIG_LTF_NUM, 1044 + switch (phy_bw) { 1045 + case RATE_MCS_CHAN_WIDTH_320: 1046 + /* content channel 1 */ 1047 + IWL_MLD_ENC_EHT_RU(1_2_3, A3); 1048 + IWL_MLD_ENC_EHT_RU(1_2_4, C3); 1049 + IWL_MLD_ENC_EHT_RU(1_2_5, A4); 1050 + IWL_MLD_ENC_EHT_RU(1_2_6, C4); 1051 + /* content channel 2 */ 1052 + IWL_MLD_ENC_EHT_RU(2_2_3, B3); 1053 + IWL_MLD_ENC_EHT_RU(2_2_4, D3); 1054 + IWL_MLD_ENC_EHT_RU(2_2_5, B4); 1055 + IWL_MLD_ENC_EHT_RU(2_2_6, D4); 1056 + fallthrough; 1057 + case RATE_MCS_CHAN_WIDTH_160: 1058 + /* content channel 1 */ 1059 + IWL_MLD_ENC_EHT_RU(1_2_1, A2); 1060 + IWL_MLD_ENC_EHT_RU(1_2_2, C2); 1061 + /* content channel 2 */ 1062 + IWL_MLD_ENC_EHT_RU(2_2_1, B2); 1063 + IWL_MLD_ENC_EHT_RU(2_2_2, D2); 1064 + fallthrough; 1065 + case RATE_MCS_CHAN_WIDTH_80: 1066 + /* content channel 1 */ 1067 + IWL_MLD_ENC_EHT_RU(1_1_2, C1); 1068 + /* content channel 2 */ 1069 + IWL_MLD_ENC_EHT_RU(2_1_2, D1); 1070 + fallthrough; 1071 + case RATE_MCS_CHAN_WIDTH_40: 1072 + /* content channel 2 */ 1073 + IWL_MLD_ENC_EHT_RU(2_1_1, B1); 1074 + fallthrough; 1075 + case RATE_MCS_CHAN_WIDTH_20: 1076 + /* content channel 1 */ 1077 + IWL_MLD_ENC_EHT_RU(1_1_1, A1); 1078 + break; 1079 + } 1080 + } 1081 + 1082 + static void iwl_mld_decode_eht_non_tb(struct iwl_mld_rx_phy_data *phy_data, 1083 + struct ieee80211_rx_status *rx_status, 1084 + struct ieee80211_radiotap_eht *eht) 1085 + { 1086 + eht->known |= cpu_to_le32(IEEE80211_RADIOTAP_EHT_KNOWN_SPATIAL_REUSE | 1087 + /* All RU allocating size/index is in TB format */ 1088 + IEEE80211_RADIOTAP_EHT_KNOWN_RU_ALLOC_TB_FMT | 1089 + IEEE80211_RADIOTAP_EHT_KNOWN_LDPC_EXTRA_SYM_OM | 1090 + IEEE80211_RADIOTAP_EHT_KNOWN_PRE_PADD_FACOR_OM | 1091 + IEEE80211_RADIOTAP_EHT_KNOWN_PE_DISAMBIGUITY_OM | 1092 + IEEE80211_RADIOTAP_EHT_KNOWN_EHT_LTF | 1093 + IEEE80211_RADIOTAP_EHT_KNOWN_PRIMARY_80 | 1094 + IEEE80211_RADIOTAP_EHT_KNOWN_NR_NON_OFDMA_USERS_M); 1095 + 1096 + eht->data[0] |= LE32_DEC_ENC(phy_data->ntfy->sigs.eht.b1, 1097 + OFDM_RX_FRAME_EHT_SPATIAL_REUSE, 1098 + IEEE80211_RADIOTAP_EHT_DATA0_SPATIAL_REUSE); 1099 + eht->data[8] |= LE32_DEC_ENC(phy_data->ntfy->sigs.eht.b2, 1100 + OFDM_RX_FRAME_EHT_STA_RU_PS160, 1101 + IEEE80211_RADIOTAP_EHT_DATA8_RU_ALLOC_TB_FMT_PS_160); 1102 + eht->data[8] |= LE32_DEC_ENC(phy_data->ntfy->sigs.eht.b2, 1103 + OFDM_RX_FRAME_EHT_STA_RU, 1104 + IEEE80211_RADIOTAP_EHT_DATA8_RU_ALLOC_TB_FMT_B0 | 1105 + IEEE80211_RADIOTAP_EHT_DATA8_RU_ALLOC_TB_FMT_B7_B1); 1106 + eht->data[0] |= LE32_DEC_ENC(phy_data->ntfy->sigs.eht.b1, 1107 + OFDM_RX_FRAME_EHT_CODING_EXTRA_SYM, 1108 + IEEE80211_RADIOTAP_EHT_DATA0_LDPC_EXTRA_SYM_OM); 1109 + eht->data[0] |= LE32_DEC_ENC(phy_data->ntfy->sigs.eht.b1, 1110 + OFDM_RX_FRAME_EHT_PRE_FEC_PAD_FACTOR, 1111 + IEEE80211_RADIOTAP_EHT_DATA0_PRE_PADD_FACOR_OM); 1112 + eht->data[0] |= LE32_DEC_ENC(phy_data->ntfy->sigs.eht.b1, 1113 + OFDM_RX_FRAME_EHT_PE_DISAMBIG, 1114 + IEEE80211_RADIOTAP_EHT_DATA0_PE_DISAMBIGUITY_OM); 1115 + eht->data[0] |= LE32_DEC_ENC(phy_data->ntfy->sigs.eht.b1, 1116 + OFDM_RX_FRAME_EHT_NUM_OF_LTF_SYM, 983 1117 IEEE80211_RADIOTAP_EHT_DATA0_EHT_LTF); 1118 + eht->data[1] |= LE32_DEC_ENC(phy_data->ntfy->sigs.eht.b2, 1119 + OFDM_RX_FRAME_EHT_STA_RU_P80, 1120 + IEEE80211_RADIOTAP_EHT_DATA1_PRIMARY_80); 1121 + eht->data[7] |= LE32_DEC_ENC(phy_data->ntfy->sigs.eht.b1, 1122 + OFDM_RX_FRAME_EHT_NUM_OF_USERS, 1123 + IEEE80211_RADIOTAP_EHT_DATA7_NUM_OF_NON_OFDMA_USERS); 984 1124 985 - if (info_type == IWL_RX_PHY_INFO_TYPE_EHT_TB_EXT || 986 - info_type == IWL_RX_PHY_INFO_TYPE_EHT_TB) 987 - iwl_mld_decode_eht_ext_tb(mld, phy_data, rx_status, eht, usig); 1125 + iwl_mld_eht_decode_user_ru(phy_data, eht); 988 1126 989 - if (info_type == IWL_RX_PHY_INFO_TYPE_EHT_MU_EXT || 990 - info_type == IWL_RX_PHY_INFO_TYPE_EHT_MU) 991 - iwl_mld_decode_eht_ext_mu(mld, phy_data, rx_status, eht, usig); 1127 + iwl_mld_eht_set_ru_alloc(rx_status, 1128 + le32_get_bits(phy_data->ntfy->sigs.eht.b2, 1129 + OFDM_RX_FRAME_EHT_STA_RU)); 1130 + } 1131 + 1132 + static void iwl_mld_decode_eht_phy_data(struct iwl_mld_rx_phy_data *phy_data, 1133 + struct ieee80211_rx_status *rx_status, 1134 + struct ieee80211_radiotap_eht *eht) 1135 + { 1136 + u32 he_type = phy_data->rate_n_flags & RATE_MCS_HE_TYPE_MSK; 1137 + 1138 + if (he_type == RATE_MCS_HE_TYPE_TRIG) 1139 + iwl_mld_decode_eht_tb(phy_data, rx_status, eht); 1140 + else 1141 + iwl_mld_decode_eht_non_tb(phy_data, rx_status, eht); 992 1142 } 993 1143 994 1144 static void iwl_mld_rx_eht(struct iwl_mld *mld, struct sk_buff *skb, 995 - struct iwl_mld_rx_phy_data *phy_data, 996 - int queue) 1145 + struct iwl_mld_rx_phy_data *phy_data) 997 1146 { 998 1147 struct ieee80211_rx_status *rx_status = IEEE80211_SKB_RXCB(skb); 999 1148 struct ieee80211_radiotap_eht *eht; 1000 - struct ieee80211_radiotap_eht_usig *usig; 1001 1149 size_t eht_len = sizeof(*eht); 1002 - 1003 1150 u32 rate_n_flags = phy_data->rate_n_flags; 1004 1151 u32 he_type = rate_n_flags & RATE_MCS_HE_TYPE_MSK; 1005 1152 /* EHT and HE have the same values for LTF */ 1006 1153 u8 ltf = IEEE80211_RADIOTAP_HE_DATA5_LTF_SIZE_UNKNOWN; 1007 - u16 phy_info = phy_data->phy_info; 1008 - u32 bw; 1009 1154 1010 1155 /* u32 for 1 user_info */ 1011 1156 if (phy_data->with_data) ··· 1106 1065 1107 1066 eht = iwl_mld_radiotap_put_tlv(skb, IEEE80211_RADIOTAP_EHT, eht_len); 1108 1067 1109 - usig = iwl_mld_radiotap_put_tlv(skb, IEEE80211_RADIOTAP_EHT_USIG, 1110 - sizeof(*usig)); 1111 1068 rx_status->flag |= RX_FLAG_RADIOTAP_TLV_AT_END; 1112 - usig->common |= 1113 - cpu_to_le32(IEEE80211_RADIOTAP_EHT_USIG_COMMON_BW_KNOWN); 1114 - 1115 - /* specific handling for 320MHz */ 1116 - bw = u32_get_bits(rate_n_flags, RATE_MCS_CHAN_WIDTH_MSK); 1117 - if (bw == RATE_MCS_CHAN_WIDTH_320_VAL) 1118 - bw += le32_get_bits(phy_data->data0, 1119 - IWL_RX_PHY_DATA0_EHT_BW320_SLOT); 1120 - 1121 - usig->common |= cpu_to_le32 1122 - (FIELD_PREP(IEEE80211_RADIOTAP_EHT_USIG_COMMON_BW, bw)); 1123 - 1124 - /* report the AMPDU-EOF bit on single frames */ 1125 - if (!queue && !(phy_info & IWL_RX_MPDU_PHY_AMPDU)) { 1126 - rx_status->flag |= RX_FLAG_AMPDU_DETAILS; 1127 - rx_status->flag |= RX_FLAG_AMPDU_EOF_BIT_KNOWN; 1128 - if (phy_data->data0 & 1129 - cpu_to_le32(IWL_RX_PHY_DATA0_EHT_DELIM_EOF)) 1130 - rx_status->flag |= RX_FLAG_AMPDU_EOF_BIT; 1131 - } 1132 - 1133 - /* update aggregation data for monitor sake on default queue */ 1134 - if (!queue && (phy_info & IWL_RX_MPDU_PHY_TSF_OVERLOAD) && 1135 - (phy_info & IWL_RX_MPDU_PHY_AMPDU) && phy_data->first_subframe) { 1136 - rx_status->flag |= RX_FLAG_AMPDU_EOF_BIT_KNOWN; 1137 - if (phy_data->data0 & 1138 - cpu_to_le32(IWL_RX_PHY_DATA0_EHT_DELIM_EOF)) 1139 - rx_status->flag |= RX_FLAG_AMPDU_EOF_BIT; 1140 - } 1141 - 1142 - if (phy_info & IWL_RX_MPDU_PHY_TSF_OVERLOAD) 1143 - iwl_mld_decode_eht_phy_data(mld, phy_data, rx_status, eht, usig); 1144 - 1145 - #define CHECK_TYPE(F) \ 1146 - BUILD_BUG_ON(IEEE80211_RADIOTAP_HE_DATA1_FORMAT_ ## F != \ 1147 - (RATE_MCS_HE_TYPE_ ## F >> RATE_MCS_HE_TYPE_POS)) 1148 - 1149 - CHECK_TYPE(SU); 1150 - CHECK_TYPE(EXT_SU); 1151 - CHECK_TYPE(MU); 1152 - CHECK_TYPE(TRIG); 1153 1069 1154 1070 switch (u32_get_bits(rate_n_flags, RATE_MCS_HE_GI_LTF_MSK)) { 1155 1071 case 0: ··· 1142 1144 1143 1145 if (ltf != IEEE80211_RADIOTAP_HE_DATA5_LTF_SIZE_UNKNOWN) { 1144 1146 eht->known |= cpu_to_le32(IEEE80211_RADIOTAP_EHT_KNOWN_GI); 1145 - eht->data[0] |= cpu_to_le32 1146 - (FIELD_PREP(IEEE80211_RADIOTAP_EHT_DATA0_LTF, 1147 - ltf) | 1148 - FIELD_PREP(IEEE80211_RADIOTAP_EHT_DATA0_GI, 1149 - rx_status->eht.gi)); 1147 + eht->data[0] |= le32_encode_bits(ltf, 1148 + IEEE80211_RADIOTAP_EHT_DATA0_LTF) | 1149 + le32_encode_bits(rx_status->eht.gi, 1150 + IEEE80211_RADIOTAP_EHT_DATA0_GI); 1150 1151 } 1151 1152 1152 1153 if (!phy_data->with_data) { 1153 1154 eht->known |= cpu_to_le32(IEEE80211_RADIOTAP_EHT_KNOWN_NSS_S | 1154 1155 IEEE80211_RADIOTAP_EHT_KNOWN_BEAMFORMED_S); 1155 - eht->data[7] |= 1156 - le32_encode_bits(le32_get_bits(phy_data->rx_vec[2], 1157 - RX_NO_DATA_RX_VEC2_EHT_NSTS_MSK), 1158 - IEEE80211_RADIOTAP_EHT_DATA7_NSS_S); 1156 + eht->data[7] |= LE32_DEC_ENC(phy_data->ntfy->sigs.eht.b1, 1157 + OFDM_RX_FRAME_EHT_NSTS, 1158 + IEEE80211_RADIOTAP_EHT_DATA7_NSS_S); 1159 1159 if (rate_n_flags & RATE_MCS_BF_MSK) 1160 1160 eht->data[7] |= 1161 1161 cpu_to_le32(IEEE80211_RADIOTAP_EHT_DATA7_BEAMFORMED_S); ··· 1173 1177 eht->user_info[0] |= 1174 1178 cpu_to_le32(IEEE80211_RADIOTAP_EHT_USER_INFO_CODING); 1175 1179 1176 - eht->user_info[0] |= cpu_to_le32 1177 - (FIELD_PREP(IEEE80211_RADIOTAP_EHT_USER_INFO_MCS, 1178 - u32_get_bits(rate_n_flags, 1179 - RATE_VHT_MCS_RATE_CODE_MSK)) | 1180 - FIELD_PREP(IEEE80211_RADIOTAP_EHT_USER_INFO_NSS_O, 1181 - u32_get_bits(rate_n_flags, 1182 - RATE_MCS_NSS_MSK))); 1180 + eht->user_info[0] |= 1181 + le32_encode_bits(u32_get_bits(rate_n_flags, 1182 + RATE_VHT_MCS_RATE_CODE_MSK), 1183 + IEEE80211_RADIOTAP_EHT_USER_INFO_MCS) | 1184 + le32_encode_bits(u32_get_bits(rate_n_flags, 1185 + RATE_MCS_NSS_MSK), 1186 + IEEE80211_RADIOTAP_EHT_USER_INFO_NSS_O); 1183 1187 } 1188 + 1189 + if (likely(!phy_data->ntfy)) 1190 + return; 1191 + 1192 + if (phy_data->with_data) { 1193 + eht->user_info[0] |= 1194 + cpu_to_le32(IEEE80211_RADIOTAP_EHT_USER_INFO_STA_ID_KNOWN) | 1195 + LE32_DEC_ENC(phy_data->ntfy->sigs.eht.user_id, 1196 + OFDM_RX_FRAME_EHT_USER_FIELD_ID, 1197 + IEEE80211_RADIOTAP_EHT_USER_INFO_STA_ID); 1198 + } 1199 + 1200 + iwl_mld_decode_eht_usig(phy_data, skb); 1201 + iwl_mld_decode_eht_phy_data(phy_data, rx_status, eht); 1184 1202 } 1185 1203 1186 1204 #ifdef CONFIG_IWLWIFI_DEBUGFS ··· 1217 1207 radiotap->oui[0] = 0xf6; 1218 1208 radiotap->oui[1] = 0x54; 1219 1209 radiotap->oui[2] = 0x25; 1220 - /* radiotap sniffer config sub-namespace */ 1210 + /* Intel OUI default radiotap subtype */ 1221 1211 radiotap->oui_subtype = 1; 1212 + /* Sniffer config element type */ 1222 1213 radiotap->vendor_type = 0; 1223 1214 1224 1215 /* fill the data now */ ··· 1230 1219 } 1231 1220 #endif 1232 1221 1233 - /* Note: hdr can be NULL */ 1234 - static void iwl_mld_rx_fill_status(struct iwl_mld *mld, int link_id, 1235 - struct ieee80211_hdr *hdr, 1236 - struct sk_buff *skb, 1237 - struct iwl_mld_rx_phy_data *phy_data, 1238 - int queue) 1222 + static void iwl_mld_add_rtap_sniffer_phy_data(struct iwl_mld *mld, 1223 + struct sk_buff *skb, 1224 + struct iwl_rx_phy_air_sniffer_ntfy *ntfy) 1239 1225 { 1240 1226 struct ieee80211_rx_status *rx_status = IEEE80211_SKB_RXCB(skb); 1241 - u32 format = phy_data->rate_n_flags & RATE_MCS_MOD_TYPE_MSK; 1227 + struct ieee80211_radiotap_vendor_content *radiotap; 1228 + const u16 vendor_data_len = sizeof(*ntfy); 1229 + 1230 + radiotap = 1231 + iwl_mld_radiotap_put_tlv(skb, 1232 + IEEE80211_RADIOTAP_VENDOR_NAMESPACE, 1233 + sizeof(*radiotap) + vendor_data_len); 1234 + 1235 + /* Intel OUI */ 1236 + radiotap->oui[0] = 0xf6; 1237 + radiotap->oui[1] = 0x54; 1238 + radiotap->oui[2] = 0x25; 1239 + /* Intel OUI default radiotap subtype */ 1240 + radiotap->oui_subtype = 1; 1241 + /* PHY data element type */ 1242 + radiotap->vendor_type = cpu_to_le16(1); 1243 + 1244 + /* fill the data now */ 1245 + memcpy(radiotap->data, ntfy, vendor_data_len); 1246 + 1247 + rx_status->flag |= RX_FLAG_RADIOTAP_TLV_AT_END; 1248 + } 1249 + 1250 + static void 1251 + iwl_mld_set_rx_nonlegacy_rate_info(u32 rate_n_flags, 1252 + struct ieee80211_rx_status *rx_status) 1253 + { 1254 + u8 stbc = u32_get_bits(rate_n_flags, RATE_MCS_STBC_MSK); 1255 + 1256 + /* NSS may be overridden by PHY ntfy with full value */ 1257 + rx_status->nss = u32_get_bits(rate_n_flags, RATE_MCS_NSS_MSK) + 1; 1258 + rx_status->rate_idx = rate_n_flags & RATE_MCS_CODE_MSK; 1259 + rx_status->enc_flags |= stbc << RX_ENC_FLAG_STBC_SHIFT; 1260 + if (rate_n_flags & RATE_MCS_LDPC_MSK) 1261 + rx_status->enc_flags |= RX_ENC_FLAG_LDPC; 1262 + } 1263 + 1264 + static void iwl_mld_set_rx_rate(struct iwl_mld *mld, 1265 + struct iwl_mld_rx_phy_data *phy_data, 1266 + struct ieee80211_rx_status *rx_status) 1267 + { 1242 1268 u32 rate_n_flags = phy_data->rate_n_flags; 1243 1269 u8 stbc = u32_get_bits(rate_n_flags, RATE_MCS_STBC_MSK); 1270 + u32 format = rate_n_flags & RATE_MCS_MOD_TYPE_MSK; 1244 1271 bool is_sgi = rate_n_flags & RATE_MCS_SGI_MSK; 1245 1272 1246 - phy_data->info_type = IWL_RX_PHY_INFO_TYPE_NONE; 1247 - 1248 - if (phy_data->phy_info & IWL_RX_MPDU_PHY_TSF_OVERLOAD) 1249 - phy_data->info_type = 1250 - le32_get_bits(phy_data->data1, 1251 - IWL_RX_PHY_DATA1_INFO_TYPE_MASK); 1252 - 1253 - /* set the preamble flag if appropriate */ 1254 - if (format == RATE_MCS_MOD_TYPE_CCK && 1255 - phy_data->phy_info & IWL_RX_MPDU_PHY_SHORT_PREAMBLE) 1256 - rx_status->enc_flags |= RX_ENC_FLAG_SHORTPRE; 1257 - 1258 - iwl_mld_fill_signal(mld, link_id, hdr, rx_status, phy_data); 1259 - 1260 - /* This may be overridden by iwl_mld_rx_he() to HE_RU */ 1273 + /* bandwidth may be overridden to RU by PHY ntfy */ 1261 1274 switch (rate_n_flags & RATE_MCS_CHAN_WIDTH_MSK) { 1262 1275 case RATE_MCS_CHAN_WIDTH_20: 1263 1276 break; ··· 1299 1264 break; 1300 1265 } 1301 1266 1302 - /* must be before L-SIG data */ 1303 - if (format == RATE_MCS_MOD_TYPE_HE) 1304 - iwl_mld_rx_he(mld, skb, phy_data, queue); 1305 - 1306 - iwl_mld_decode_lsig(skb, phy_data); 1307 - 1308 - rx_status->device_timestamp = phy_data->gp2_on_air_rise; 1309 - 1310 - /* using TLV format and must be after all fixed len fields */ 1311 - if (format == RATE_MCS_MOD_TYPE_EHT) 1312 - iwl_mld_rx_eht(mld, skb, phy_data, queue); 1313 - 1314 - #ifdef CONFIG_IWLWIFI_DEBUGFS 1315 - if (unlikely(mld->monitor.on)) { 1316 - iwl_mld_add_rtap_sniffer_config(mld, skb); 1317 - 1318 - if (mld->monitor.ptp_time) { 1319 - u64 adj_time = 1320 - iwl_mld_ptp_get_adj_time(mld, 1321 - phy_data->gp2_on_air_rise * 1322 - NSEC_PER_USEC); 1323 - 1324 - rx_status->mactime = div64_u64(adj_time, NSEC_PER_USEC); 1325 - rx_status->flag |= RX_FLAG_MACTIME_IS_RTAP_TS64; 1326 - rx_status->flag &= ~RX_FLAG_MACTIME; 1327 - } 1328 - } 1329 - #endif 1330 - 1331 - if (format != RATE_MCS_MOD_TYPE_CCK && is_sgi) 1332 - rx_status->enc_flags |= RX_ENC_FLAG_SHORT_GI; 1333 - 1334 - if (rate_n_flags & RATE_MCS_LDPC_MSK) 1335 - rx_status->enc_flags |= RX_ENC_FLAG_LDPC; 1336 - 1337 1267 switch (format) { 1338 - case RATE_MCS_MOD_TYPE_HT: 1339 - rx_status->encoding = RX_ENC_HT; 1340 - rx_status->rate_idx = RATE_HT_MCS_INDEX(rate_n_flags); 1341 - rx_status->enc_flags |= stbc << RX_ENC_FLAG_STBC_SHIFT; 1342 - break; 1343 - case RATE_MCS_MOD_TYPE_VHT: 1344 - case RATE_MCS_MOD_TYPE_HE: 1345 - case RATE_MCS_MOD_TYPE_EHT: 1346 - if (format == RATE_MCS_MOD_TYPE_VHT) { 1347 - rx_status->encoding = RX_ENC_VHT; 1348 - } else if (format == RATE_MCS_MOD_TYPE_HE) { 1349 - rx_status->encoding = RX_ENC_HE; 1350 - rx_status->he_dcm = 1351 - !!(rate_n_flags & RATE_HE_DUAL_CARRIER_MODE_MSK); 1352 - } else if (format == RATE_MCS_MOD_TYPE_EHT) { 1353 - rx_status->encoding = RX_ENC_EHT; 1354 - } 1355 - 1356 - rx_status->nss = u32_get_bits(rate_n_flags, 1357 - RATE_MCS_NSS_MSK) + 1; 1358 - rx_status->rate_idx = rate_n_flags & RATE_MCS_CODE_MSK; 1359 - rx_status->enc_flags |= stbc << RX_ENC_FLAG_STBC_SHIFT; 1360 - break; 1361 - default: { 1268 + case RATE_MCS_MOD_TYPE_CCK: 1269 + if (phy_data->phy_info & IWL_RX_MPDU_PHY_SHORT_PREAMBLE) 1270 + rx_status->enc_flags |= RX_ENC_FLAG_SHORTPRE; 1271 + fallthrough; 1272 + case RATE_MCS_MOD_TYPE_LEGACY_OFDM: { 1362 1273 int rate = 1363 1274 iwl_mld_legacy_hw_idx_to_mac80211_idx(rate_n_flags, 1364 1275 rx_status->band); 1276 + 1277 + /* override BW - it could be DUP and indicate the wrong BW */ 1278 + rx_status->bw = RATE_INFO_BW_20; 1365 1279 1366 1280 /* valid rate */ 1367 1281 if (rate >= 0 && rate <= 0xFF) { ··· 1321 1337 /* invalid rate */ 1322 1338 rx_status->rate_idx = 0; 1323 1339 1324 - if (net_ratelimit()) 1340 + /* 1341 + * In monitor mode we can see CCK frames on 5 or 6 GHz, usually 1342 + * just the (possibly malformed) PHY header by accident, since 1343 + * the decoder doesn't seem to turn off CCK. We cannot correctly 1344 + * encode the rate to mac80211 (and therefore not in radiotap) 1345 + * since we give the per-band index which doesn't cover those 1346 + * rates. 1347 + */ 1348 + if (!mld->monitor.on && net_ratelimit()) 1325 1349 IWL_ERR(mld, "invalid rate_n_flags=0x%x, band=%d\n", 1326 1350 rate_n_flags, rx_status->band); 1327 1351 break; 1328 1352 } 1353 + case RATE_MCS_MOD_TYPE_HT: 1354 + rx_status->encoding = RX_ENC_HT; 1355 + rx_status->rate_idx = RATE_HT_MCS_INDEX(rate_n_flags); 1356 + rx_status->enc_flags |= stbc << RX_ENC_FLAG_STBC_SHIFT; 1357 + break; 1358 + case RATE_MCS_MOD_TYPE_VHT: 1359 + rx_status->encoding = RX_ENC_VHT; 1360 + iwl_mld_set_rx_nonlegacy_rate_info(rate_n_flags, rx_status); 1361 + break; 1362 + case RATE_MCS_MOD_TYPE_HE: 1363 + rx_status->encoding = RX_ENC_HE; 1364 + rx_status->he_dcm = 1365 + !!(rate_n_flags & RATE_HE_DUAL_CARRIER_MODE_MSK); 1366 + iwl_mld_set_rx_nonlegacy_rate_info(rate_n_flags, rx_status); 1367 + break; 1368 + case RATE_MCS_MOD_TYPE_EHT: 1369 + rx_status->encoding = RX_ENC_EHT; 1370 + iwl_mld_set_rx_nonlegacy_rate_info(rate_n_flags, rx_status); 1371 + break; 1372 + default: 1373 + WARN_ON_ONCE(1); 1329 1374 } 1375 + 1376 + if (format != RATE_MCS_MOD_TYPE_CCK && is_sgi) 1377 + rx_status->enc_flags |= RX_ENC_FLAG_SHORT_GI; 1378 + } 1379 + 1380 + /* Note: hdr can be NULL */ 1381 + static void iwl_mld_rx_fill_status(struct iwl_mld *mld, int link_id, 1382 + struct ieee80211_hdr *hdr, 1383 + struct sk_buff *skb, 1384 + struct iwl_mld_rx_phy_data *phy_data) 1385 + { 1386 + struct ieee80211_rx_status *rx_status = IEEE80211_SKB_RXCB(skb); 1387 + u32 rate_n_flags = phy_data->rate_n_flags; 1388 + u32 format = rate_n_flags & RATE_MCS_MOD_TYPE_MSK; 1389 + 1390 + iwl_mld_fill_signal(mld, link_id, hdr, rx_status, phy_data); 1391 + 1392 + rx_status->device_timestamp = phy_data->gp2_on_air_rise; 1393 + 1394 + iwl_mld_set_rx_rate(mld, phy_data, rx_status); 1395 + 1396 + /* must be before L-SIG data (radiotap field order) */ 1397 + if (format == RATE_MCS_MOD_TYPE_HE) 1398 + iwl_mld_rx_he(skb, phy_data); 1399 + 1400 + iwl_mld_decode_lsig(skb, phy_data); 1401 + 1402 + /* TLVs - must be after radiotap fixed fields */ 1403 + if (format == RATE_MCS_MOD_TYPE_EHT) 1404 + iwl_mld_rx_eht(mld, skb, phy_data); 1405 + 1406 + #ifdef CONFIG_IWLWIFI_DEBUGFS 1407 + if (unlikely(mld->monitor.on)) { 1408 + iwl_mld_add_rtap_sniffer_config(mld, skb); 1409 + 1410 + if (mld->monitor.ptp_time) { 1411 + u64 adj_time = 1412 + iwl_mld_ptp_get_adj_time(mld, 1413 + phy_data->gp2_on_air_rise * 1414 + NSEC_PER_USEC); 1415 + 1416 + rx_status->mactime = div64_u64(adj_time, NSEC_PER_USEC); 1417 + rx_status->flag |= RX_FLAG_MACTIME_IS_RTAP_TS64; 1418 + rx_status->flag &= ~RX_FLAG_MACTIME; 1419 + } 1420 + } 1421 + #endif 1422 + 1423 + if (phy_data->ntfy) 1424 + iwl_mld_add_rtap_sniffer_phy_data(mld, skb, phy_data->ntfy); 1330 1425 } 1331 1426 1332 1427 /* iwl_mld_create_skb adds the rxb to a new skb */ ··· 1826 1763 return 0; 1827 1764 } 1828 1765 1829 - static void iwl_mld_rx_update_ampdu_ref(struct iwl_mld *mld, 1830 - struct iwl_mld_rx_phy_data *phy_data, 1831 - struct ieee80211_rx_status *rx_status) 1766 + static void iwl_mld_rx_update_ampdu_data(struct iwl_mld *mld, 1767 + struct iwl_mld_rx_phy_data *phy_data, 1768 + struct ieee80211_rx_status *rx_status) 1832 1769 { 1770 + u32 format = phy_data->rate_n_flags & RATE_MCS_MOD_TYPE_MSK; 1833 1771 bool toggle_bit = 1834 1772 phy_data->phy_info & IWL_RX_MPDU_PHY_AMPDU_TOGGLE; 1773 + 1774 + switch (format) { 1775 + case RATE_MCS_MOD_TYPE_CCK: 1776 + case RATE_MCS_MOD_TYPE_LEGACY_OFDM: 1777 + /* no aggregation possible */ 1778 + return; 1779 + case RATE_MCS_MOD_TYPE_HT: 1780 + case RATE_MCS_MOD_TYPE_VHT: 1781 + /* single frames are not A-MPDU format */ 1782 + if (!(phy_data->phy_info & IWL_RX_MPDU_PHY_AMPDU)) 1783 + return; 1784 + break; 1785 + default: 1786 + /* HE/EHT/UHR have A-MPDU format for single frames */ 1787 + if (!(phy_data->phy_info & IWL_RX_MPDU_PHY_AMPDU)) { 1788 + rx_status->flag |= RX_FLAG_AMPDU_DETAILS; 1789 + rx_status->flag |= RX_FLAG_AMPDU_EOF_BIT_KNOWN; 1790 + if (phy_data->phy_info & IWL_RX_MPDU_PHY_EOF_INDICATION) 1791 + rx_status->flag |= RX_FLAG_AMPDU_EOF_BIT; 1792 + return; 1793 + } 1794 + } 1835 1795 1836 1796 rx_status->flag |= RX_FLAG_AMPDU_DETAILS; 1837 1797 /* Toggle is switched whenever new aggregation starts. Make ··· 1867 1781 mld->monitor.ampdu_ref++; 1868 1782 mld->monitor.ampdu_toggle = toggle_bit; 1869 1783 phy_data->first_subframe = true; 1784 + 1785 + /* report EOF bit on the first subframe */ 1786 + rx_status->flag |= RX_FLAG_AMPDU_EOF_BIT_KNOWN; 1787 + if (phy_data->phy_info & IWL_RX_MPDU_PHY_EOF_INDICATION) 1788 + rx_status->flag |= RX_FLAG_AMPDU_EOF_BIT; 1870 1789 } 1871 1790 rx_status->ampdu_reference = mld->monitor.ampdu_ref; 1872 1791 } ··· 1901 1810 u32 mpdu_len; 1902 1811 enum iwl_mld_reorder_result reorder_res; 1903 1812 struct ieee80211_rx_status *rx_status; 1813 + unsigned int alloc_size = 128; 1904 1814 1905 1815 if (unlikely(mld->fw_status.in_hw_restart)) 1906 1816 return; ··· 1916 1824 "FW lied about packet len (%d)\n", pkt_len)) 1917 1825 return; 1918 1826 1827 + iwl_mld_fill_phy_data_from_mpdu(mld, mpdu_desc, &phy_data); 1828 + 1919 1829 /* Don't use dev_alloc_skb(), we'll have enough headroom once 1920 1830 * ieee80211_hdr pulled. 1831 + * 1832 + * For monitor mode we need more space to include the full PHY 1833 + * notification data. 1921 1834 */ 1922 - skb = alloc_skb(128, GFP_ATOMIC); 1835 + if (unlikely(mld->monitor.on) && phy_data.ntfy) 1836 + alloc_size += sizeof(struct iwl_rx_phy_air_sniffer_ntfy); 1837 + skb = alloc_skb(alloc_size, GFP_ATOMIC); 1923 1838 if (!skb) { 1924 1839 IWL_ERR(mld, "alloc_skb failed\n"); 1925 1840 return; 1926 1841 } 1927 1842 1928 1843 hdr = (void *)(pkt->data + mpdu_desc_size); 1929 - 1930 - iwl_mld_fill_phy_data(mld, mpdu_desc, &phy_data); 1931 1844 1932 1845 if (mpdu_desc->mac_flags2 & IWL_RX_MPDU_MFLG2_PAD) { 1933 1846 /* If the device inserted padding it means that (it thought) ··· 1958 1861 if (drop) 1959 1862 goto drop; 1960 1863 1961 - /* update aggregation data for monitor sake on default queue */ 1962 - if (!queue && (phy_data.phy_info & IWL_RX_MPDU_PHY_AMPDU)) 1963 - iwl_mld_rx_update_ampdu_ref(mld, &phy_data, rx_status); 1864 + if (unlikely(mld->monitor.on)) 1865 + iwl_mld_rx_update_ampdu_data(mld, &phy_data, rx_status); 1964 1866 1965 1867 /* Keep packets with CRC errors (and with overrun) for monitor mode 1966 1868 * (otherwise the firmware discards them) but mark them as bad. ··· 1993 1897 link_id = u8_get_bits(mpdu_desc->mac_phy_band, 1994 1898 IWL_RX_MPDU_MAC_PHY_BAND_LINK_MASK); 1995 1899 1996 - iwl_mld_rx_fill_status(mld, link_id, hdr, skb, &phy_data, queue); 1900 + iwl_mld_rx_fill_status(mld, link_id, hdr, skb, &phy_data); 1997 1901 1998 1902 if (iwl_mld_rx_crypto(mld, sta, hdr, rx_status, mpdu_desc, queue, 1999 1903 le32_to_cpu(pkt->len_n_flags), &crypto_len)) ··· 2127 2031 wake_up(&mld->rxq_sync.waitq); 2128 2032 } 2129 2033 2130 - void iwl_mld_rx_monitor_no_data(struct iwl_mld *mld, struct napi_struct *napi, 2131 - struct iwl_rx_packet *pkt, int queue) 2034 + static void iwl_mld_no_data_rx(struct iwl_mld *mld, 2035 + struct napi_struct *napi, 2036 + struct iwl_rx_phy_air_sniffer_ntfy *ntfy) 2132 2037 { 2133 - struct iwl_rx_no_data_ver_3 *desc; 2134 - struct iwl_mld_rx_phy_data phy_data; 2135 2038 struct ieee80211_rx_status *rx_status; 2039 + struct iwl_mld_rx_phy_data phy_data = { 2040 + .ntfy = ntfy, 2041 + .phy_info = 0, /* short preamble set below */ 2042 + .rate_n_flags = le32_to_cpu(ntfy->rate), 2043 + .gp2_on_air_rise = le32_to_cpu(ntfy->on_air_rise_time), 2044 + .energy_a = ntfy->rssi_a, 2045 + .energy_b = ntfy->rssi_b, 2046 + }; 2047 + u32 format = phy_data.rate_n_flags & RATE_MCS_MOD_TYPE_MSK; 2136 2048 struct sk_buff *skb; 2137 - u32 format, rssi; 2138 - u8 channel; 2139 2049 2140 - if (unlikely(mld->fw_status.in_hw_restart)) 2050 + skb = alloc_skb(128 + sizeof(struct iwl_rx_phy_air_sniffer_ntfy), 2051 + GFP_ATOMIC); 2052 + if (!skb) 2141 2053 return; 2142 - 2143 - if (IWL_FW_CHECK(mld, iwl_rx_packet_payload_len(pkt) < sizeof(*desc), 2144 - "Bad RX_NO_DATA_NOTIF size (%d)\n", 2145 - iwl_rx_packet_payload_len(pkt))) 2146 - return; 2147 - 2148 - desc = (void *)pkt->data; 2149 - 2150 - rssi = le32_to_cpu(desc->rssi); 2151 - channel = u32_get_bits(rssi, RX_NO_DATA_CHANNEL_MSK); 2152 - 2153 - phy_data.energy_a = u32_get_bits(rssi, RX_NO_DATA_CHAIN_A_MSK); 2154 - phy_data.energy_b = u32_get_bits(rssi, RX_NO_DATA_CHAIN_B_MSK); 2155 - phy_data.data0 = desc->phy_info[0]; 2156 - phy_data.data1 = desc->phy_info[1]; 2157 - phy_data.phy_info = IWL_RX_MPDU_PHY_TSF_OVERLOAD; 2158 - phy_data.gp2_on_air_rise = le32_to_cpu(desc->on_air_rise_time); 2159 - phy_data.rate_n_flags = iwl_v3_rate_from_v2_v3(desc->rate, 2160 - mld->fw_rates_ver_3); 2161 - phy_data.with_data = false; 2162 - 2163 - BUILD_BUG_ON(sizeof(phy_data.rx_vec) != sizeof(desc->rx_vec)); 2164 - memcpy(phy_data.rx_vec, desc->rx_vec, sizeof(phy_data.rx_vec)); 2165 - 2166 - format = phy_data.rate_n_flags & RATE_MCS_MOD_TYPE_MSK; 2167 - 2168 - /* Don't use dev_alloc_skb(), we'll have enough headroom once 2169 - * ieee80211_hdr pulled. 2170 - */ 2171 - skb = alloc_skb(128, GFP_ATOMIC); 2172 - if (!skb) { 2173 - IWL_ERR(mld, "alloc_skb failed\n"); 2174 - return; 2175 - } 2176 2054 2177 2055 rx_status = IEEE80211_SKB_RXCB(skb); 2178 2056 2179 2057 /* 0-length PSDU */ 2180 2058 rx_status->flag |= RX_FLAG_NO_PSDU; 2181 2059 2182 - /* mark as failed PLCP on any errors to skip checks in mac80211 */ 2183 - if (le32_get_bits(desc->info, RX_NO_DATA_INFO_ERR_MSK) != 2184 - RX_NO_DATA_INFO_ERR_NONE) 2185 - rx_status->flag |= RX_FLAG_FAILED_PLCP_CRC; 2186 - 2187 - switch (le32_get_bits(desc->info, RX_NO_DATA_INFO_TYPE_MSK)) { 2188 - case RX_NO_DATA_INFO_TYPE_NDP: 2060 + switch (ntfy->status) { 2061 + case IWL_SNIF_STAT_PLCP_RX_OK: 2062 + /* we only get here with sounding PPDUs */ 2189 2063 rx_status->zero_length_psdu_type = 2190 2064 IEEE80211_RADIOTAP_ZERO_LEN_PSDU_SOUNDING; 2191 2065 break; 2192 - case RX_NO_DATA_INFO_TYPE_MU_UNMATCHED: 2193 - case RX_NO_DATA_INFO_TYPE_TB_UNMATCHED: 2066 + case IWL_SNIF_STAT_AID_NOT_FOR_US: 2194 2067 rx_status->zero_length_psdu_type = 2195 2068 IEEE80211_RADIOTAP_ZERO_LEN_PSDU_NOT_CAPTURED; 2196 2069 break; 2070 + case IWL_SNIF_STAT_PLCP_RX_LSIG_ERR: 2071 + case IWL_SNIF_STAT_PLCP_RX_SIGA_ERR: 2072 + case IWL_SNIF_STAT_PLCP_RX_SIGB_ERR: 2073 + case IWL_SNIF_STAT_UNKNOWN_ERROR: 2197 2074 default: 2075 + rx_status->flag |= RX_FLAG_FAILED_PLCP_CRC; 2076 + fallthrough; 2077 + case IWL_SNIF_STAT_UNEXPECTED_TB: 2078 + case IWL_SNIF_STAT_UNSUPPORTED_RATE: 2198 2079 rx_status->zero_length_psdu_type = 2199 2080 IEEE80211_RADIOTAP_ZERO_LEN_PSDU_VENDOR; 2200 - break; 2081 + /* we could include the real reason in a vendor TLV */ 2201 2082 } 2202 2083 2203 - rx_status->band = channel > 14 ? NL80211_BAND_5GHZ : 2204 - NL80211_BAND_2GHZ; 2084 + if (format == RATE_MCS_MOD_TYPE_CCK && 2085 + ntfy->legacy_sig.cck & cpu_to_le32(CCK_CRFR_SHORT_PREAMBLE)) 2086 + phy_data.phy_info |= IWL_RX_MPDU_PHY_SHORT_PREAMBLE; 2205 2087 2206 - rx_status->freq = ieee80211_channel_to_frequency(channel, 2207 - rx_status->band); 2088 + iwl_mld_fill_rx_status_band_freq(IEEE80211_SKB_RXCB(skb), 2089 + ntfy->band, ntfy->channel); 2208 2090 2209 2091 /* link ID is ignored for NULL header */ 2210 - iwl_mld_rx_fill_status(mld, -1, NULL, skb, &phy_data, queue); 2092 + iwl_mld_rx_fill_status(mld, -1, NULL, skb, &phy_data); 2211 2093 2212 2094 /* No more radiotap info should be added after this point. 2213 2095 * Mark it as mac header for upper layers to know where ··· 2193 2119 */ 2194 2120 skb_set_mac_header(skb, skb->len); 2195 2121 2196 - /* Override the nss from the rx_vec since the rate_n_flags has 2197 - * only 1 bit for the nss which gives a max of 2 ss but there 2198 - * may be up to 8 spatial streams. 2199 - */ 2200 - switch (format) { 2201 - case RATE_MCS_MOD_TYPE_VHT: 2202 - rx_status->nss = 2203 - le32_get_bits(desc->rx_vec[0], 2204 - RX_NO_DATA_RX_VEC0_VHT_NSTS_MSK) + 1; 2205 - break; 2206 - case RATE_MCS_MOD_TYPE_HE: 2207 - rx_status->nss = 2208 - le32_get_bits(desc->rx_vec[0], 2209 - RX_NO_DATA_RX_VEC0_HE_NSTS_MSK) + 1; 2210 - break; 2211 - case RATE_MCS_MOD_TYPE_EHT: 2212 - rx_status->nss = 2213 - le32_get_bits(desc->rx_vec[2], 2214 - RX_NO_DATA_RX_VEC2_EHT_NSTS_MSK) + 1; 2215 - } 2216 - 2217 2122 /* pass the packet to mac80211 */ 2218 2123 rcu_read_lock(); 2219 2124 ieee80211_rx_napi(mld->hw, NULL, skb, napi); 2220 2125 rcu_read_unlock(); 2126 + } 2127 + 2128 + void iwl_mld_handle_phy_air_sniffer_notif(struct iwl_mld *mld, 2129 + struct napi_struct *napi, 2130 + struct iwl_rx_packet *pkt) 2131 + { 2132 + struct iwl_rx_phy_air_sniffer_ntfy *ntfy = (void *)pkt->data; 2133 + bool is_ndp = false; 2134 + u32 he_type; 2135 + 2136 + if (IWL_FW_CHECK(mld, iwl_rx_packet_payload_len(pkt) < sizeof(*ntfy), 2137 + "invalid air sniffer notification size\n")) 2138 + return; 2139 + 2140 + /* check if there's an old one to release as errored */ 2141 + if (mld->monitor.phy.valid && !mld->monitor.phy.used) { 2142 + /* didn't capture data, so override status */ 2143 + mld->monitor.phy.data.status = IWL_SNIF_STAT_AID_NOT_FOR_US; 2144 + iwl_mld_no_data_rx(mld, napi, &mld->monitor.phy.data); 2145 + } 2146 + 2147 + /* old data is no longer valid now */ 2148 + mld->monitor.phy.valid = false; 2149 + 2150 + he_type = le32_to_cpu(ntfy->rate) & RATE_MCS_HE_TYPE_MSK; 2151 + 2152 + switch (le32_to_cpu(ntfy->rate) & RATE_MCS_MOD_TYPE_MSK) { 2153 + case RATE_MCS_MOD_TYPE_HT: 2154 + is_ndp = !le32_get_bits(ntfy->sigs.ht.a1, 2155 + OFDM_RX_FRAME_HT_LENGTH); 2156 + break; 2157 + case RATE_MCS_MOD_TYPE_VHT: 2158 + is_ndp = le32_get_bits(ntfy->sigs.vht.a0, 2159 + OFDM_RX_FRAME_VHT_NUM_OF_DATA_SYM_VALID) && 2160 + !le32_get_bits(ntfy->sigs.vht.a0, 2161 + OFDM_RX_FRAME_VHT_NUM_OF_DATA_SYM); 2162 + break; 2163 + case RATE_MCS_MOD_TYPE_HE: 2164 + if (he_type == RATE_MCS_HE_TYPE_TRIG) 2165 + break; 2166 + is_ndp = le32_get_bits(ntfy->sigs.he.a3, 2167 + OFDM_RX_FRAME_HE_NUM_OF_DATA_SYM_VALID) && 2168 + !le32_get_bits(ntfy->sigs.he.a3, 2169 + OFDM_RX_FRAME_HE_NUM_OF_DATA_SYM); 2170 + break; 2171 + case RATE_MCS_MOD_TYPE_EHT: 2172 + if (he_type == RATE_MCS_HE_TYPE_TRIG) 2173 + break; 2174 + is_ndp = le32_get_bits(ntfy->sigs.eht.sig2, 2175 + OFDM_RX_FRAME_EHT_NUM_OF_DATA_SYM_VALID) && 2176 + !le32_get_bits(ntfy->sigs.eht.sig2, 2177 + OFDM_RX_FRAME_EHT_NUM_OF_DATA_SYM); 2178 + break; 2179 + } 2180 + 2181 + if (ntfy->status != IWL_SNIF_STAT_PLCP_RX_OK || is_ndp) { 2182 + iwl_mld_no_data_rx(mld, napi, ntfy); 2183 + return; 2184 + } 2185 + 2186 + /* hang on to it for the RX_MPDU data packet(s) */ 2187 + mld->monitor.phy.data = *ntfy; 2188 + mld->monitor.phy.valid = true; 2189 + mld->monitor.phy.used = false; 2221 2190 }
+3 -2
drivers/net/wireless/intel/iwlwifi/mld/rx.h
··· 66 66 struct sk_buff *skb, int queue, 67 67 struct ieee80211_sta *sta); 68 68 69 - void iwl_mld_rx_monitor_no_data(struct iwl_mld *mld, struct napi_struct *napi, 70 - struct iwl_rx_packet *pkt, int queue); 69 + void iwl_mld_handle_phy_air_sniffer_notif(struct iwl_mld *mld, 70 + struct napi_struct *napi, 71 + struct iwl_rx_packet *pkt); 71 72 72 73 #endif /* __iwl_mld_agg_h__ */
+1 -1
drivers/net/wireless/intel/iwlwifi/mld/sta.c
··· 890 890 sizeof(queue_counter->per_link)); 891 891 queue_counter->window_start_time = jiffies; 892 892 893 - IWL_DEBUG_INFO(mld, "MPDU counters are cleared\n"); 893 + IWL_DEBUG_EHT(mld, "MPDU counters are cleared\n"); 894 894 } 895 895 896 896 link_counter = &queue_counter->per_link[mld_link->fw_id];
+3 -12
drivers/net/wireless/intel/iwlwifi/mvm/fw.c
··· 115 115 116 116 117 117 if (version >= 6) { 118 - struct iwl_alive_ntf_v6 *palive; 118 + struct iwl_alive_ntf_v7 *palive; 119 119 120 120 if (pkt_len < sizeof(*palive)) 121 121 return false; ··· 214 214 ~FW_ADDR_CACHE_CONTROL; 215 215 216 216 if (umac_error_table) { 217 - if (umac_error_table >= 218 - mvm->trans->mac_cfg->base->min_umac_error_event_table) { 219 - iwl_fw_umac_set_alive_err_table(mvm->trans, 220 - umac_error_table); 221 - } else { 222 - IWL_ERR(mvm, 223 - "Not valid error log pointer 0x%08X for %s uCode\n", 224 - umac_error_table, 225 - (mvm->fwrt.cur_fw_img == IWL_UCODE_INIT) ? 226 - "Init" : "RT"); 227 - } 217 + iwl_fw_umac_set_alive_err_table(mvm->trans, 218 + umac_error_table); 228 219 } 229 220 230 221 alive_data->valid = status == IWL_ALIVE_STATUS_OK;
-3
drivers/net/wireless/intel/iwlwifi/mvm/mld-mac80211.c
··· 102 102 mvm->csme_vif = vif; 103 103 } 104 104 105 - if (vif->p2p || iwl_fw_lookup_cmd_ver(mvm->fw, PHY_CONTEXT_CMD, 1) < 5) 106 - vif->driver_flags |= IEEE80211_VIF_IGNORE_OFDMA_WIDER_BW; 107 - 108 105 return 0; 109 106 110 107 out_free_bf:
+5
drivers/net/wireless/intel/iwlwifi/mvm/mvm.h
··· 2894 2894 2895 2895 void iwl_mvm_smps_workaround(struct iwl_mvm *mvm, struct ieee80211_vif *vif, 2896 2896 bool update); 2897 + 2898 + /* rate_n_flags conversion */ 2899 + u32 iwl_mvm_v3_rate_from_fw(__le32 rate, u8 rate_ver); 2900 + __le32 iwl_mvm_v3_rate_to_fw(u32 rate, u8 rate_ver); 2901 + 2897 2902 #endif /* __IWL_MVM_H__ */
+6 -18
drivers/net/wireless/intel/iwlwifi/mvm/phy-ctxt.c
··· 1 1 // SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause 2 2 /* 3 - * Copyright (C) 2012-2014, 2018-2024 Intel Corporation 3 + * Copyright (C) 2012-2014, 2018-2025 Intel Corporation 4 4 * Copyright (C) 2013-2014 Intel Mobile Communications GmbH 5 5 * Copyright (C) 2017 Intel Deutschland GmbH 6 6 */ ··· 202 202 static int iwl_mvm_phy_ctxt_apply(struct iwl_mvm *mvm, 203 203 struct iwl_mvm_phy_ctxt *ctxt, 204 204 const struct cfg80211_chan_def *chandef, 205 - const struct cfg80211_chan_def *ap, 206 205 u8 chains_static, u8 chains_dynamic, 207 206 u32 action) 208 207 { 209 208 int ret; 210 209 int ver = iwl_fw_lookup_cmd_ver(mvm->fw, PHY_CONTEXT_CMD, 1); 211 210 212 - if (ver < 5 || !ap || !ap->chan) 213 - ap = NULL; 214 - 215 - if (ver >= 3 && ver <= 6) { 211 + if (ver >= 3 && ver <= 4) { 216 212 struct iwl_phy_context_cmd cmd = {}; 217 213 218 214 /* Set the command header fields */ ··· 218 222 iwl_mvm_phy_ctxt_cmd_data(mvm, ctxt, &cmd, chandef, 219 223 chains_static, 220 224 chains_dynamic); 221 - 222 - if (ap) { 223 - cmd.sbb_bandwidth = iwl_mvm_get_channel_width(ap); 224 - cmd.sbb_ctrl_channel_loc = iwl_mvm_get_ctrl_pos(ap); 225 - } 226 - 227 - if (ver == 6) 228 - cmd.puncture_mask = cpu_to_le16(chandef->punctured); 229 225 230 226 ret = iwl_mvm_send_cmd_pdu(mvm, PHY_CONTEXT_CMD, 231 227 0, sizeof(cmd), &cmd); ··· 272 284 ctxt->width = chandef->width; 273 285 ctxt->center_freq1 = chandef->center_freq1; 274 286 275 - ret = iwl_mvm_phy_ctxt_apply(mvm, ctxt, chandef, ap, 287 + ret = iwl_mvm_phy_ctxt_apply(mvm, ctxt, chandef, 276 288 chains_static, chains_dynamic, 277 289 FW_CTXT_ACTION_ADD); 278 290 ··· 330 342 int ret; 331 343 332 344 /* ... remove it here ...*/ 333 - ret = iwl_mvm_phy_ctxt_apply(mvm, ctxt, chandef, NULL, 345 + ret = iwl_mvm_phy_ctxt_apply(mvm, ctxt, chandef, 334 346 chains_static, chains_dynamic, 335 347 FW_CTXT_ACTION_REMOVE); 336 348 if (ret) ··· 344 356 ctxt->width = chandef->width; 345 357 ctxt->center_freq1 = chandef->center_freq1; 346 358 347 - return iwl_mvm_phy_ctxt_apply(mvm, ctxt, chandef, ap, 359 + return iwl_mvm_phy_ctxt_apply(mvm, ctxt, chandef, 348 360 chains_static, chains_dynamic, 349 361 action); 350 362 } ··· 364 376 365 377 cfg80211_chandef_create(&chandef, ctxt->channel, NL80211_CHAN_NO_HT); 366 378 367 - iwl_mvm_phy_ctxt_apply(mvm, ctxt, &chandef, NULL, 1, 1, 379 + iwl_mvm_phy_ctxt_apply(mvm, ctxt, &chandef, 1, 1, 368 380 FW_CTXT_ACTION_REMOVE); 369 381 } 370 382
-164
drivers/net/wireless/intel/iwlwifi/mvm/rs.c
··· 4178 4178 else 4179 4179 return rs_drv_tx_protection(mvm, mvmsta, enable); 4180 4180 } 4181 - 4182 - static u32 iwl_legacy_rate_to_fw_idx(u32 rate_n_flags) 4183 - { 4184 - int rate = rate_n_flags & RATE_LEGACY_RATE_MSK_V1; 4185 - int idx; 4186 - bool ofdm = !(rate_n_flags & RATE_MCS_CCK_MSK_V1); 4187 - int offset = ofdm ? IWL_FIRST_OFDM_RATE : 0; 4188 - int last = ofdm ? IWL_RATE_COUNT_LEGACY : IWL_FIRST_OFDM_RATE; 4189 - 4190 - for (idx = offset; idx < last; idx++) 4191 - if (iwl_fw_rate_idx_to_plcp(idx) == rate) 4192 - return idx - offset; 4193 - return IWL_RATE_INVALID; 4194 - } 4195 - 4196 - u32 iwl_mvm_v3_rate_from_fw(__le32 rate, u8 rate_ver) 4197 - { 4198 - u32 rate_v3 = 0, rate_v1; 4199 - u32 dup = 0; 4200 - 4201 - if (rate_ver > 1) 4202 - return iwl_v3_rate_from_v2_v3(rate, rate_ver >= 3); 4203 - 4204 - rate_v1 = le32_to_cpu(rate); 4205 - if (rate_v1 == 0) 4206 - return rate_v1; 4207 - /* convert rate */ 4208 - if (rate_v1 & RATE_MCS_HT_MSK_V1) { 4209 - u32 nss; 4210 - 4211 - rate_v3 |= RATE_MCS_MOD_TYPE_HT; 4212 - rate_v3 |= 4213 - rate_v1 & RATE_HT_MCS_RATE_CODE_MSK_V1; 4214 - nss = u32_get_bits(rate_v1, RATE_HT_MCS_MIMO2_MSK); 4215 - rate_v3 |= u32_encode_bits(nss, RATE_MCS_NSS_MSK); 4216 - } else if (rate_v1 & RATE_MCS_VHT_MSK_V1 || 4217 - rate_v1 & RATE_MCS_HE_MSK_V1) { 4218 - u32 nss = u32_get_bits(rate_v1, RATE_VHT_MCS_NSS_MSK); 4219 - 4220 - rate_v3 |= rate_v1 & RATE_VHT_MCS_RATE_CODE_MSK; 4221 - 4222 - rate_v3 |= u32_encode_bits(nss, RATE_MCS_NSS_MSK); 4223 - 4224 - if (rate_v1 & RATE_MCS_HE_MSK_V1) { 4225 - u32 he_type_bits = rate_v1 & RATE_MCS_HE_TYPE_MSK_V1; 4226 - u32 he_type = he_type_bits >> RATE_MCS_HE_TYPE_POS_V1; 4227 - u32 he_106t = (rate_v1 & RATE_MCS_HE_106T_MSK_V1) >> 4228 - RATE_MCS_HE_106T_POS_V1; 4229 - u32 he_gi_ltf = (rate_v1 & RATE_MCS_HE_GI_LTF_MSK_V1) >> 4230 - RATE_MCS_HE_GI_LTF_POS; 4231 - 4232 - if ((he_type_bits == RATE_MCS_HE_TYPE_SU || 4233 - he_type_bits == RATE_MCS_HE_TYPE_EXT_SU) && 4234 - he_gi_ltf == RATE_MCS_HE_SU_4_LTF) 4235 - /* the new rate have an additional bit to 4236 - * represent the value 4 rather then using SGI 4237 - * bit for this purpose - as it was done in the 4238 - * old rate 4239 - */ 4240 - he_gi_ltf += (rate_v1 & RATE_MCS_SGI_MSK_V1) >> 4241 - RATE_MCS_SGI_POS_V1; 4242 - 4243 - rate_v3 |= he_gi_ltf << RATE_MCS_HE_GI_LTF_POS; 4244 - rate_v3 |= he_type << RATE_MCS_HE_TYPE_POS; 4245 - rate_v3 |= he_106t << RATE_MCS_HE_106T_POS; 4246 - rate_v3 |= rate_v1 & RATE_HE_DUAL_CARRIER_MODE_MSK; 4247 - rate_v3 |= RATE_MCS_MOD_TYPE_HE; 4248 - } else { 4249 - rate_v3 |= RATE_MCS_MOD_TYPE_VHT; 4250 - } 4251 - /* if legacy format */ 4252 - } else { 4253 - u32 legacy_rate = iwl_legacy_rate_to_fw_idx(rate_v1); 4254 - 4255 - if (WARN_ON_ONCE(legacy_rate == IWL_RATE_INVALID)) 4256 - legacy_rate = (rate_v1 & RATE_MCS_CCK_MSK_V1) ? 4257 - IWL_FIRST_CCK_RATE : IWL_FIRST_OFDM_RATE; 4258 - 4259 - rate_v3 |= legacy_rate; 4260 - if (!(rate_v1 & RATE_MCS_CCK_MSK_V1)) 4261 - rate_v3 |= RATE_MCS_MOD_TYPE_LEGACY_OFDM; 4262 - } 4263 - 4264 - /* convert flags */ 4265 - if (rate_v1 & RATE_MCS_LDPC_MSK_V1) 4266 - rate_v3 |= RATE_MCS_LDPC_MSK; 4267 - rate_v3 |= (rate_v1 & RATE_MCS_CHAN_WIDTH_MSK_V1) | 4268 - (rate_v1 & RATE_MCS_ANT_AB_MSK) | 4269 - (rate_v1 & RATE_MCS_STBC_MSK) | 4270 - (rate_v1 & RATE_MCS_BF_MSK); 4271 - 4272 - dup = (rate_v1 & RATE_MCS_DUP_MSK_V1) >> RATE_MCS_DUP_POS_V1; 4273 - if (dup) { 4274 - rate_v3 |= RATE_MCS_DUP_MSK; 4275 - rate_v3 |= dup << RATE_MCS_CHAN_WIDTH_POS; 4276 - } 4277 - 4278 - if ((!(rate_v1 & RATE_MCS_HE_MSK_V1)) && 4279 - (rate_v1 & RATE_MCS_SGI_MSK_V1)) 4280 - rate_v3 |= RATE_MCS_SGI_MSK; 4281 - 4282 - return rate_v3; 4283 - } 4284 - 4285 - __le32 iwl_mvm_v3_rate_to_fw(u32 rate, u8 rate_ver) 4286 - { 4287 - u32 result = 0; 4288 - int rate_idx; 4289 - 4290 - if (rate_ver > 1) 4291 - return iwl_v3_rate_to_v2_v3(rate, rate_ver > 2); 4292 - 4293 - switch (rate & RATE_MCS_MOD_TYPE_MSK) { 4294 - case RATE_MCS_MOD_TYPE_CCK: 4295 - result = RATE_MCS_CCK_MSK_V1; 4296 - fallthrough; 4297 - case RATE_MCS_MOD_TYPE_LEGACY_OFDM: 4298 - rate_idx = u32_get_bits(rate, RATE_LEGACY_RATE_MSK); 4299 - if (!(result & RATE_MCS_CCK_MSK_V1)) 4300 - rate_idx += IWL_FIRST_OFDM_RATE; 4301 - result |= u32_encode_bits(iwl_fw_rate_idx_to_plcp(rate_idx), 4302 - RATE_LEGACY_RATE_MSK_V1); 4303 - break; 4304 - case RATE_MCS_MOD_TYPE_HT: 4305 - result = RATE_MCS_HT_MSK_V1; 4306 - result |= u32_encode_bits(u32_get_bits(rate, 4307 - RATE_HT_MCS_CODE_MSK), 4308 - RATE_HT_MCS_RATE_CODE_MSK_V1); 4309 - result |= u32_encode_bits(u32_get_bits(rate, 4310 - RATE_MCS_NSS_MSK), 4311 - RATE_HT_MCS_MIMO2_MSK); 4312 - break; 4313 - case RATE_MCS_MOD_TYPE_VHT: 4314 - result = RATE_MCS_VHT_MSK_V1; 4315 - result |= u32_encode_bits(u32_get_bits(rate, 4316 - RATE_VHT_MCS_NSS_MSK), 4317 - RATE_MCS_CODE_MSK); 4318 - result |= u32_encode_bits(u32_get_bits(rate, RATE_MCS_NSS_MSK), 4319 - RATE_VHT_MCS_NSS_MSK); 4320 - break; 4321 - case RATE_MCS_MOD_TYPE_HE: /* not generated */ 4322 - default: 4323 - WARN_ONCE(1, "bad modulation type %d\n", 4324 - u32_get_bits(rate, RATE_MCS_MOD_TYPE_MSK)); 4325 - return 0; 4326 - } 4327 - 4328 - if (rate & RATE_MCS_LDPC_MSK) 4329 - result |= RATE_MCS_LDPC_MSK_V1; 4330 - WARN_ON_ONCE(u32_get_bits(rate, RATE_MCS_CHAN_WIDTH_MSK) > 4331 - RATE_MCS_CHAN_WIDTH_160_VAL); 4332 - result |= (rate & RATE_MCS_CHAN_WIDTH_MSK_V1) | 4333 - (rate & RATE_MCS_ANT_AB_MSK) | 4334 - (rate & RATE_MCS_STBC_MSK) | 4335 - (rate & RATE_MCS_BF_MSK); 4336 - 4337 - /* not handling DUP since we don't use it */ 4338 - WARN_ON_ONCE(rate & RATE_MCS_DUP_MSK); 4339 - 4340 - if (rate & RATE_MCS_SGI_MSK) 4341 - result |= RATE_MCS_SGI_MSK_V1; 4342 - 4343 - return cpu_to_le32(result); 4344 - }
-3
drivers/net/wireless/intel/iwlwifi/mvm/rs.h
··· 425 425 426 426 struct iwl_mvm_sta; 427 427 428 - u32 iwl_mvm_v3_rate_from_fw(__le32 rate, u8 rate_ver); 429 - __le32 iwl_mvm_v3_rate_to_fw(u32 rate, u8 rate_ver); 430 - 431 428 int iwl_mvm_tx_protection(struct iwl_mvm *mvm, struct iwl_mvm_sta *mvmsta, 432 429 bool enable); 433 430
+2
drivers/net/wireless/intel/iwlwifi/mvm/rx.c
··· 519 519 return; 520 520 } 521 521 rx_status->rate_idx = rate; 522 + /* override BW - it could be DUP and indicate the wrong BW */ 523 + rx_status->bw = RATE_INFO_BW_20; 522 524 } 523 525 524 526 #ifdef CONFIG_IWLWIFI_DEBUGFS
+164
drivers/net/wireless/intel/iwlwifi/mvm/utils.c
··· 1237 1237 1238 1238 return false; 1239 1239 } 1240 + 1241 + static u32 iwl_legacy_rate_to_fw_idx(u32 rate_n_flags) 1242 + { 1243 + int rate = rate_n_flags & RATE_LEGACY_RATE_MSK_V1; 1244 + int idx; 1245 + bool ofdm = !(rate_n_flags & RATE_MCS_CCK_MSK_V1); 1246 + int offset = ofdm ? IWL_FIRST_OFDM_RATE : 0; 1247 + int last = ofdm ? IWL_RATE_COUNT_LEGACY : IWL_FIRST_OFDM_RATE; 1248 + 1249 + for (idx = offset; idx < last; idx++) 1250 + if (iwl_fw_rate_idx_to_plcp(idx) == rate) 1251 + return idx - offset; 1252 + return IWL_RATE_INVALID; 1253 + } 1254 + 1255 + u32 iwl_mvm_v3_rate_from_fw(__le32 rate, u8 rate_ver) 1256 + { 1257 + u32 rate_v3 = 0, rate_v1; 1258 + u32 dup = 0; 1259 + 1260 + if (rate_ver > 1) 1261 + return iwl_v3_rate_from_v2_v3(rate, rate_ver >= 3); 1262 + 1263 + rate_v1 = le32_to_cpu(rate); 1264 + if (rate_v1 == 0) 1265 + return rate_v1; 1266 + /* convert rate */ 1267 + if (rate_v1 & RATE_MCS_HT_MSK_V1) { 1268 + u32 nss; 1269 + 1270 + rate_v3 |= RATE_MCS_MOD_TYPE_HT; 1271 + rate_v3 |= 1272 + rate_v1 & RATE_HT_MCS_RATE_CODE_MSK_V1; 1273 + nss = u32_get_bits(rate_v1, RATE_HT_MCS_MIMO2_MSK); 1274 + rate_v3 |= u32_encode_bits(nss, RATE_MCS_NSS_MSK); 1275 + } else if (rate_v1 & RATE_MCS_VHT_MSK_V1 || 1276 + rate_v1 & RATE_MCS_HE_MSK_V1) { 1277 + u32 nss = u32_get_bits(rate_v1, RATE_VHT_MCS_NSS_MSK); 1278 + 1279 + rate_v3 |= rate_v1 & RATE_VHT_MCS_RATE_CODE_MSK; 1280 + 1281 + rate_v3 |= u32_encode_bits(nss, RATE_MCS_NSS_MSK); 1282 + 1283 + if (rate_v1 & RATE_MCS_HE_MSK_V1) { 1284 + u32 he_type_bits = rate_v1 & RATE_MCS_HE_TYPE_MSK_V1; 1285 + u32 he_type = he_type_bits >> RATE_MCS_HE_TYPE_POS_V1; 1286 + u32 he_106t = (rate_v1 & RATE_MCS_HE_106T_MSK_V1) >> 1287 + RATE_MCS_HE_106T_POS_V1; 1288 + u32 he_gi_ltf = (rate_v1 & RATE_MCS_HE_GI_LTF_MSK_V1) >> 1289 + RATE_MCS_HE_GI_LTF_POS; 1290 + 1291 + if ((he_type_bits == RATE_MCS_HE_TYPE_SU || 1292 + he_type_bits == RATE_MCS_HE_TYPE_EXT_SU) && 1293 + he_gi_ltf == RATE_MCS_HE_SU_4_LTF) 1294 + /* the new rate have an additional bit to 1295 + * represent the value 4 rather then using SGI 1296 + * bit for this purpose - as it was done in the 1297 + * old rate 1298 + */ 1299 + he_gi_ltf += (rate_v1 & RATE_MCS_SGI_MSK_V1) >> 1300 + RATE_MCS_SGI_POS_V1; 1301 + 1302 + rate_v3 |= he_gi_ltf << RATE_MCS_HE_GI_LTF_POS; 1303 + rate_v3 |= he_type << RATE_MCS_HE_TYPE_POS; 1304 + rate_v3 |= he_106t << RATE_MCS_HE_106T_POS; 1305 + rate_v3 |= rate_v1 & RATE_HE_DUAL_CARRIER_MODE_MSK; 1306 + rate_v3 |= RATE_MCS_MOD_TYPE_HE; 1307 + } else { 1308 + rate_v3 |= RATE_MCS_MOD_TYPE_VHT; 1309 + } 1310 + /* if legacy format */ 1311 + } else { 1312 + u32 legacy_rate = iwl_legacy_rate_to_fw_idx(rate_v1); 1313 + 1314 + if (WARN_ON_ONCE(legacy_rate == IWL_RATE_INVALID)) 1315 + legacy_rate = (rate_v1 & RATE_MCS_CCK_MSK_V1) ? 1316 + IWL_FIRST_CCK_RATE : IWL_FIRST_OFDM_RATE; 1317 + 1318 + rate_v3 |= legacy_rate; 1319 + if (!(rate_v1 & RATE_MCS_CCK_MSK_V1)) 1320 + rate_v3 |= RATE_MCS_MOD_TYPE_LEGACY_OFDM; 1321 + } 1322 + 1323 + /* convert flags */ 1324 + if (rate_v1 & RATE_MCS_LDPC_MSK_V1) 1325 + rate_v3 |= RATE_MCS_LDPC_MSK; 1326 + rate_v3 |= (rate_v1 & RATE_MCS_CHAN_WIDTH_MSK_V1) | 1327 + (rate_v1 & RATE_MCS_ANT_AB_MSK) | 1328 + (rate_v1 & RATE_MCS_STBC_MSK) | 1329 + (rate_v1 & RATE_MCS_BF_MSK); 1330 + 1331 + dup = (rate_v1 & RATE_MCS_DUP_MSK_V1) >> RATE_MCS_DUP_POS_V1; 1332 + if (dup) { 1333 + rate_v3 |= RATE_MCS_DUP_MSK; 1334 + rate_v3 |= dup << RATE_MCS_CHAN_WIDTH_POS; 1335 + } 1336 + 1337 + if ((!(rate_v1 & RATE_MCS_HE_MSK_V1)) && 1338 + (rate_v1 & RATE_MCS_SGI_MSK_V1)) 1339 + rate_v3 |= RATE_MCS_SGI_MSK; 1340 + 1341 + return rate_v3; 1342 + } 1343 + 1344 + __le32 iwl_mvm_v3_rate_to_fw(u32 rate, u8 rate_ver) 1345 + { 1346 + u32 result = 0; 1347 + int rate_idx; 1348 + 1349 + if (rate_ver > 1) 1350 + return iwl_v3_rate_to_v2_v3(rate, rate_ver > 2); 1351 + 1352 + switch (rate & RATE_MCS_MOD_TYPE_MSK) { 1353 + case RATE_MCS_MOD_TYPE_CCK: 1354 + result = RATE_MCS_CCK_MSK_V1; 1355 + fallthrough; 1356 + case RATE_MCS_MOD_TYPE_LEGACY_OFDM: 1357 + rate_idx = u32_get_bits(rate, RATE_LEGACY_RATE_MSK); 1358 + if (!(result & RATE_MCS_CCK_MSK_V1)) 1359 + rate_idx += IWL_FIRST_OFDM_RATE; 1360 + result |= u32_encode_bits(iwl_fw_rate_idx_to_plcp(rate_idx), 1361 + RATE_LEGACY_RATE_MSK_V1); 1362 + break; 1363 + case RATE_MCS_MOD_TYPE_HT: 1364 + result = RATE_MCS_HT_MSK_V1; 1365 + result |= u32_encode_bits(u32_get_bits(rate, 1366 + RATE_HT_MCS_CODE_MSK), 1367 + RATE_HT_MCS_RATE_CODE_MSK_V1); 1368 + result |= u32_encode_bits(u32_get_bits(rate, 1369 + RATE_MCS_NSS_MSK), 1370 + RATE_HT_MCS_MIMO2_MSK); 1371 + break; 1372 + case RATE_MCS_MOD_TYPE_VHT: 1373 + result = RATE_MCS_VHT_MSK_V1; 1374 + result |= u32_encode_bits(u32_get_bits(rate, 1375 + RATE_VHT_MCS_NSS_MSK), 1376 + RATE_MCS_CODE_MSK); 1377 + result |= u32_encode_bits(u32_get_bits(rate, RATE_MCS_NSS_MSK), 1378 + RATE_VHT_MCS_NSS_MSK); 1379 + break; 1380 + case RATE_MCS_MOD_TYPE_HE: /* not generated */ 1381 + default: 1382 + WARN_ONCE(1, "bad modulation type %d\n", 1383 + u32_get_bits(rate, RATE_MCS_MOD_TYPE_MSK)); 1384 + return 0; 1385 + } 1386 + 1387 + if (rate & RATE_MCS_LDPC_MSK) 1388 + result |= RATE_MCS_LDPC_MSK_V1; 1389 + WARN_ON_ONCE(u32_get_bits(rate, RATE_MCS_CHAN_WIDTH_MSK) > 1390 + RATE_MCS_CHAN_WIDTH_160_VAL); 1391 + result |= (rate & RATE_MCS_CHAN_WIDTH_MSK_V1) | 1392 + (rate & RATE_MCS_ANT_AB_MSK) | 1393 + (rate & RATE_MCS_STBC_MSK) | 1394 + (rate & RATE_MCS_BF_MSK); 1395 + 1396 + /* not handling DUP since we don't use it */ 1397 + WARN_ON_ONCE(rate & RATE_MCS_DUP_MSK); 1398 + 1399 + if (rate & RATE_MCS_SGI_MSK) 1400 + result |= RATE_MCS_SGI_MSK_V1; 1401 + 1402 + return cpu_to_le32(result); 1403 + }
+8 -2
drivers/net/wireless/intel/iwlwifi/pcie/drv.c
··· 1061 1061 1062 1062 /* WH RF */ 1063 1063 IWL_DEV_INFO(iwl_rf_wh, iwl_be211_name, RF_TYPE(WH)), 1064 + IWL_DEV_INFO(iwl_rf_wh_non_eht, iwl_ax221_name, RF_TYPE(WH), 1065 + SUBDEV(0x0514)), 1066 + IWL_DEV_INFO(iwl_rf_wh_non_eht, iwl_ax221_name, RF_TYPE(WH), 1067 + SUBDEV(0x4514)), 1064 1068 IWL_DEV_INFO(iwl_rf_wh_160mhz, iwl_be213_name, RF_TYPE(WH), BW_LIMITED), 1065 1069 1066 1070 /* PE RF */ 1067 1071 IWL_DEV_INFO(iwl_rf_pe, iwl_bn201_name, RF_TYPE(PE)), 1068 - IWL_DEV_INFO(iwl_rf_pe, iwl_be223_name, RF_TYPE(PE), SUBDEV(0x0524)), 1069 - IWL_DEV_INFO(iwl_rf_pe, iwl_be221_name, RF_TYPE(PE), SUBDEV(0x0324)), 1072 + IWL_DEV_INFO(iwl_rf_pe, iwl_be223_name, RF_TYPE(PE), 1073 + SUBDEV_MASKED(0x0524, 0xFFF)), 1074 + IWL_DEV_INFO(iwl_rf_pe, iwl_bn203_name, RF_TYPE(PE), 1075 + SUBDEV_MASKED(0x0324, 0xFFF)), 1070 1076 1071 1077 /* Killer */ 1072 1078 IWL_DEV_INFO(iwl_rf_wh, iwl_killer_be1775s_name, SUBDEV(0x1776)),
+9
drivers/net/wireless/intel/iwlwifi/pcie/gen1_2/trans.c
··· 4218 4218 pdev->device, pdev->subsystem_device, 4219 4219 info.hw_rev, info.hw_rf_id); 4220 4220 4221 + #if !IS_ENABLED(CONFIG_IWLMLD) 4222 + if (iwl_drv_is_wifi7_supported(iwl_trans)) { 4223 + IWL_ERR(iwl_trans, 4224 + "IWLMLD needs to be compiled to support this device\n"); 4225 + ret = -EOPNOTSUPP; 4226 + goto out_free_trans; 4227 + } 4228 + #endif 4229 + 4221 4230 dev_info = iwl_pci_find_dev_info(pdev->device, pdev->subsystem_device, 4222 4231 CSR_HW_RFID_TYPE(info.hw_rf_id), 4223 4232 CSR_HW_RFID_IS_CDB(info.hw_rf_id),
+29
drivers/net/wireless/intel/iwlwifi/tests/devinfo.c
··· 265 265 } 266 266 } 267 267 268 + static void devinfo_pci_ids_config(struct kunit *test) 269 + { 270 + for (int i = 0; iwl_hw_card_ids[i].vendor; i++) { 271 + const struct pci_device_id *s = &iwl_hw_card_ids[i]; 272 + const struct iwl_dev_info *di; 273 + 274 + if (s->device == PCI_ANY_ID || s->subdevice == PCI_ANY_ID) 275 + continue; 276 + 277 + #if IS_ENABLED(CONFIG_IWLMVM) || IS_ENABLED(CONFIG_IWLMLD) 278 + /* 279 + * The check below only works for old (pre-CNVI) devices. Most 280 + * new have subdevice==ANY, so are already skipped, but for some 281 + * Bz platform(s) we list all the RF PCI IDs. Skip those too. 282 + */ 283 + if (s->driver_data == (kernel_ulong_t)&iwl_bz_mac_cfg) 284 + continue; 285 + #endif 286 + 287 + di = iwl_pci_find_dev_info(s->device, s->subdevice, 288 + 0, 0, 0, 0, true); 289 + 290 + KUNIT_EXPECT_PTR_NE_MSG(test, di, NULL, 291 + "PCI ID %04x:%04x not found\n", 292 + s->device, s->subdevice); 293 + } 294 + } 295 + 268 296 static struct kunit_case devinfo_test_cases[] = { 269 297 KUNIT_CASE(devinfo_table_order), 270 298 KUNIT_CASE(devinfo_discrete_match), ··· 304 276 KUNIT_CASE(devinfo_pci_ids), 305 277 KUNIT_CASE(devinfo_no_mac_cfg_dups), 306 278 KUNIT_CASE(devinfo_api_range), 279 + KUNIT_CASE(devinfo_pci_ids_config), 307 280 {} 308 281 }; 309 282