1bfcc09ddSBjoern A. Zeeb /* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ 2bfcc09ddSBjoern A. Zeeb /* 3*d9836fb4SBjoern A. Zeeb * Copyright (C) 2012-2014, 2018, 2020-2021 Intel Corporation 4bfcc09ddSBjoern A. Zeeb * Copyright (C) 2013-2015 Intel Mobile Communications GmbH 5bfcc09ddSBjoern A. Zeeb * Copyright (C) 2016-2017 Intel Deutschland GmbH 6bfcc09ddSBjoern A. Zeeb */ 7bfcc09ddSBjoern A. Zeeb #ifndef __iwl_fw_api_phy_ctxt_h__ 8bfcc09ddSBjoern A. Zeeb #define __iwl_fw_api_phy_ctxt_h__ 9bfcc09ddSBjoern A. Zeeb 10bfcc09ddSBjoern A. Zeeb /* Supported bands */ 11bfcc09ddSBjoern A. Zeeb #define PHY_BAND_5 (0) 12bfcc09ddSBjoern A. Zeeb #define PHY_BAND_24 (1) 13bfcc09ddSBjoern A. Zeeb #define PHY_BAND_6 (2) 14bfcc09ddSBjoern A. Zeeb 15bfcc09ddSBjoern A. Zeeb /* Supported channel width, vary if there is VHT support */ 16bfcc09ddSBjoern A. Zeeb #define PHY_VHT_CHANNEL_MODE20 (0x0) 17bfcc09ddSBjoern A. Zeeb #define PHY_VHT_CHANNEL_MODE40 (0x1) 18bfcc09ddSBjoern A. Zeeb #define PHY_VHT_CHANNEL_MODE80 (0x2) 19bfcc09ddSBjoern A. Zeeb #define PHY_VHT_CHANNEL_MODE160 (0x3) 20bfcc09ddSBjoern A. Zeeb 21bfcc09ddSBjoern A. Zeeb /* 22bfcc09ddSBjoern A. Zeeb * Control channel position: 23bfcc09ddSBjoern A. Zeeb * For legacy set bit means upper channel, otherwise lower. 24bfcc09ddSBjoern A. Zeeb * For VHT - bit-2 marks if the control is lower/upper relative to center-freq 25bfcc09ddSBjoern A. Zeeb * bits-1:0 mark the distance from the center freq. for 20Mhz, offset is 0. 26bfcc09ddSBjoern A. Zeeb * center_freq 27bfcc09ddSBjoern A. Zeeb * | 28bfcc09ddSBjoern A. Zeeb * 40Mhz |_______|_______| 29bfcc09ddSBjoern A. Zeeb * 80Mhz |_______|_______|_______|_______| 30bfcc09ddSBjoern A. Zeeb * 160Mhz |_______|_______|_______|_______|_______|_______|_______|_______| 31bfcc09ddSBjoern A. Zeeb * code 011 010 001 000 | 100 101 110 111 32bfcc09ddSBjoern A. Zeeb */ 33bfcc09ddSBjoern A. Zeeb #define PHY_VHT_CTRL_POS_1_BELOW (0x0) 34bfcc09ddSBjoern A. Zeeb #define PHY_VHT_CTRL_POS_2_BELOW (0x1) 35bfcc09ddSBjoern A. Zeeb #define PHY_VHT_CTRL_POS_3_BELOW (0x2) 36bfcc09ddSBjoern A. Zeeb #define PHY_VHT_CTRL_POS_4_BELOW (0x3) 37bfcc09ddSBjoern A. Zeeb #define PHY_VHT_CTRL_POS_1_ABOVE (0x4) 38bfcc09ddSBjoern A. Zeeb #define PHY_VHT_CTRL_POS_2_ABOVE (0x5) 39bfcc09ddSBjoern A. Zeeb #define PHY_VHT_CTRL_POS_3_ABOVE (0x6) 40bfcc09ddSBjoern A. Zeeb #define PHY_VHT_CTRL_POS_4_ABOVE (0x7) 41bfcc09ddSBjoern A. Zeeb 42bfcc09ddSBjoern A. Zeeb /* 43bfcc09ddSBjoern A. Zeeb * struct iwl_fw_channel_info_v1 - channel information 44bfcc09ddSBjoern A. Zeeb * 45bfcc09ddSBjoern A. Zeeb * @band: PHY_BAND_* 46bfcc09ddSBjoern A. Zeeb * @channel: channel number 47bfcc09ddSBjoern A. Zeeb * @width: PHY_[VHT|LEGACY]_CHANNEL_* 48bfcc09ddSBjoern A. Zeeb * @ctrl channel: PHY_[VHT|LEGACY]_CTRL_* 49bfcc09ddSBjoern A. Zeeb */ 50bfcc09ddSBjoern A. Zeeb struct iwl_fw_channel_info_v1 { 51bfcc09ddSBjoern A. Zeeb u8 band; 52bfcc09ddSBjoern A. Zeeb u8 channel; 53bfcc09ddSBjoern A. Zeeb u8 width; 54bfcc09ddSBjoern A. Zeeb u8 ctrl_pos; 55bfcc09ddSBjoern A. Zeeb } __packed; /* CHANNEL_CONFIG_API_S_VER_1 */ 56bfcc09ddSBjoern A. Zeeb 57bfcc09ddSBjoern A. Zeeb /* 58bfcc09ddSBjoern A. Zeeb * struct iwl_fw_channel_info - channel information 59bfcc09ddSBjoern A. Zeeb * 60bfcc09ddSBjoern A. Zeeb * @channel: channel number 61bfcc09ddSBjoern A. Zeeb * @band: PHY_BAND_* 62bfcc09ddSBjoern A. Zeeb * @width: PHY_[VHT|LEGACY]_CHANNEL_* 63bfcc09ddSBjoern A. Zeeb * @ctrl channel: PHY_[VHT|LEGACY]_CTRL_* 64bfcc09ddSBjoern A. Zeeb * @reserved: for future use and alignment 65bfcc09ddSBjoern A. Zeeb */ 66bfcc09ddSBjoern A. Zeeb struct iwl_fw_channel_info { 67bfcc09ddSBjoern A. Zeeb __le32 channel; 68bfcc09ddSBjoern A. Zeeb u8 band; 69bfcc09ddSBjoern A. Zeeb u8 width; 70bfcc09ddSBjoern A. Zeeb u8 ctrl_pos; 71bfcc09ddSBjoern A. Zeeb u8 reserved; 72bfcc09ddSBjoern A. Zeeb } __packed; /*CHANNEL_CONFIG_API_S_VER_2 */ 73bfcc09ddSBjoern A. Zeeb 74bfcc09ddSBjoern A. Zeeb #define PHY_RX_CHAIN_DRIVER_FORCE_POS (0) 75bfcc09ddSBjoern A. Zeeb #define PHY_RX_CHAIN_DRIVER_FORCE_MSK \ 76bfcc09ddSBjoern A. Zeeb (0x1 << PHY_RX_CHAIN_DRIVER_FORCE_POS) 77bfcc09ddSBjoern A. Zeeb #define PHY_RX_CHAIN_VALID_POS (1) 78bfcc09ddSBjoern A. Zeeb #define PHY_RX_CHAIN_VALID_MSK \ 79bfcc09ddSBjoern A. Zeeb (0x7 << PHY_RX_CHAIN_VALID_POS) 80bfcc09ddSBjoern A. Zeeb #define PHY_RX_CHAIN_FORCE_SEL_POS (4) 81bfcc09ddSBjoern A. Zeeb #define PHY_RX_CHAIN_FORCE_SEL_MSK \ 82bfcc09ddSBjoern A. Zeeb (0x7 << PHY_RX_CHAIN_FORCE_SEL_POS) 83bfcc09ddSBjoern A. Zeeb #define PHY_RX_CHAIN_FORCE_MIMO_SEL_POS (7) 84bfcc09ddSBjoern A. Zeeb #define PHY_RX_CHAIN_FORCE_MIMO_SEL_MSK \ 85bfcc09ddSBjoern A. Zeeb (0x7 << PHY_RX_CHAIN_FORCE_MIMO_SEL_POS) 86bfcc09ddSBjoern A. Zeeb #define PHY_RX_CHAIN_CNT_POS (10) 87bfcc09ddSBjoern A. Zeeb #define PHY_RX_CHAIN_CNT_MSK \ 88bfcc09ddSBjoern A. Zeeb (0x3 << PHY_RX_CHAIN_CNT_POS) 89bfcc09ddSBjoern A. Zeeb #define PHY_RX_CHAIN_MIMO_CNT_POS (12) 90bfcc09ddSBjoern A. Zeeb #define PHY_RX_CHAIN_MIMO_CNT_MSK \ 91bfcc09ddSBjoern A. Zeeb (0x3 << PHY_RX_CHAIN_MIMO_CNT_POS) 92bfcc09ddSBjoern A. Zeeb #define PHY_RX_CHAIN_MIMO_FORCE_POS (14) 93bfcc09ddSBjoern A. Zeeb #define PHY_RX_CHAIN_MIMO_FORCE_MSK \ 94bfcc09ddSBjoern A. Zeeb (0x1 << PHY_RX_CHAIN_MIMO_FORCE_POS) 95bfcc09ddSBjoern A. Zeeb 96bfcc09ddSBjoern A. Zeeb /* TODO: fix the value, make it depend on firmware at runtime? */ 97bfcc09ddSBjoern A. Zeeb #define NUM_PHY_CTX 3 98bfcc09ddSBjoern A. Zeeb 99bfcc09ddSBjoern A. Zeeb /* TODO: complete missing documentation */ 100bfcc09ddSBjoern A. Zeeb /** 101bfcc09ddSBjoern A. Zeeb * struct iwl_phy_context_cmd_tail - tail of iwl_phy_ctx_cmd for alignment with 102bfcc09ddSBjoern A. Zeeb * various channel structures. 103bfcc09ddSBjoern A. Zeeb * 104bfcc09ddSBjoern A. Zeeb * @txchain_info: ??? 105bfcc09ddSBjoern A. Zeeb * @rxchain_info: ??? 106bfcc09ddSBjoern A. Zeeb * @acquisition_data: ??? 107bfcc09ddSBjoern A. Zeeb * @dsp_cfg_flags: set to 0 108bfcc09ddSBjoern A. Zeeb */ 109bfcc09ddSBjoern A. Zeeb struct iwl_phy_context_cmd_tail { 110bfcc09ddSBjoern A. Zeeb __le32 txchain_info; 111bfcc09ddSBjoern A. Zeeb __le32 rxchain_info; 112bfcc09ddSBjoern A. Zeeb __le32 acquisition_data; 113bfcc09ddSBjoern A. Zeeb __le32 dsp_cfg_flags; 114bfcc09ddSBjoern A. Zeeb } __packed; 115bfcc09ddSBjoern A. Zeeb 116bfcc09ddSBjoern A. Zeeb /** 117bfcc09ddSBjoern A. Zeeb * struct iwl_phy_context_cmd - config of the PHY context 118bfcc09ddSBjoern A. Zeeb * ( PHY_CONTEXT_CMD = 0x8 ) 119bfcc09ddSBjoern A. Zeeb * @id_and_color: ID and color of the relevant Binding 120bfcc09ddSBjoern A. Zeeb * @action: action to perform, one of FW_CTXT_ACTION_* 121bfcc09ddSBjoern A. Zeeb * @apply_time: 0 means immediate apply and context switch. 122bfcc09ddSBjoern A. Zeeb * other value means apply new params after X usecs 123bfcc09ddSBjoern A. Zeeb * @tx_param_color: ??? 124bfcc09ddSBjoern A. Zeeb * @ci: channel info 125bfcc09ddSBjoern A. Zeeb * @tail: command tail 126bfcc09ddSBjoern A. Zeeb */ 127bfcc09ddSBjoern A. Zeeb struct iwl_phy_context_cmd_v1 { 128bfcc09ddSBjoern A. Zeeb /* COMMON_INDEX_HDR_API_S_VER_1 */ 129bfcc09ddSBjoern A. Zeeb __le32 id_and_color; 130bfcc09ddSBjoern A. Zeeb __le32 action; 131bfcc09ddSBjoern A. Zeeb /* PHY_CONTEXT_DATA_API_S_VER_3 */ 132bfcc09ddSBjoern A. Zeeb __le32 apply_time; 133bfcc09ddSBjoern A. Zeeb __le32 tx_param_color; 134bfcc09ddSBjoern A. Zeeb struct iwl_fw_channel_info ci; 135bfcc09ddSBjoern A. Zeeb struct iwl_phy_context_cmd_tail tail; 136bfcc09ddSBjoern A. Zeeb } __packed; /* PHY_CONTEXT_CMD_API_VER_1 */ 137bfcc09ddSBjoern A. Zeeb 138bfcc09ddSBjoern A. Zeeb /** 139bfcc09ddSBjoern A. Zeeb * struct iwl_phy_context_cmd - config of the PHY context 140bfcc09ddSBjoern A. Zeeb * ( PHY_CONTEXT_CMD = 0x8 ) 141bfcc09ddSBjoern A. Zeeb * @id_and_color: ID and color of the relevant Binding 142bfcc09ddSBjoern A. Zeeb * @action: action to perform, one of FW_CTXT_ACTION_* 143bfcc09ddSBjoern A. Zeeb * @lmac_id: the lmac id the phy context belongs to 144bfcc09ddSBjoern A. Zeeb * @ci: channel info 145bfcc09ddSBjoern A. Zeeb * @rxchain_info: ??? 146bfcc09ddSBjoern A. Zeeb * @dsp_cfg_flags: set to 0 147bfcc09ddSBjoern A. Zeeb * @reserved: reserved to align to 64 bit 148bfcc09ddSBjoern A. Zeeb */ 149bfcc09ddSBjoern A. Zeeb struct iwl_phy_context_cmd { 150bfcc09ddSBjoern A. Zeeb /* COMMON_INDEX_HDR_API_S_VER_1 */ 151bfcc09ddSBjoern A. Zeeb __le32 id_and_color; 152bfcc09ddSBjoern A. Zeeb __le32 action; 153*d9836fb4SBjoern A. Zeeb /* PHY_CONTEXT_DATA_API_S_VER_3, PHY_CONTEXT_DATA_API_S_VER_4 */ 154bfcc09ddSBjoern A. Zeeb struct iwl_fw_channel_info ci; 155bfcc09ddSBjoern A. Zeeb __le32 lmac_id; 156*d9836fb4SBjoern A. Zeeb __le32 rxchain_info; /* reserved in _VER_4 */ 157bfcc09ddSBjoern A. Zeeb __le32 dsp_cfg_flags; 158bfcc09ddSBjoern A. Zeeb __le32 reserved; 159*d9836fb4SBjoern A. Zeeb } __packed; /* PHY_CONTEXT_CMD_API_VER_3, PHY_CONTEXT_CMD_API_VER_4 */ 160*d9836fb4SBjoern A. Zeeb 161bfcc09ddSBjoern A. Zeeb #endif /* __iwl_fw_api_phy_ctxt_h__ */ 162