1*5113495bSYour Name /* 2*5113495bSYour Name * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved. 3*5113495bSYour Name * 4*5113495bSYour Name * Permission to use, copy, modify, and/or distribute this software for any 5*5113495bSYour Name * purpose with or without fee is hereby granted, provided that the above 6*5113495bSYour Name * copyright notice and this permission notice appear in all copies. 7*5113495bSYour Name * 8*5113495bSYour Name * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 9*5113495bSYour Name * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 10*5113495bSYour Name * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 11*5113495bSYour Name * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 12*5113495bSYour Name * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 13*5113495bSYour Name * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 14*5113495bSYour Name * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 15*5113495bSYour Name */ 16*5113495bSYour Name 17*5113495bSYour Name 18*5113495bSYour Name #ifndef _COEX_RX_STATUS_H_ 19*5113495bSYour Name #define _COEX_RX_STATUS_H_ 20*5113495bSYour Name #if !defined(__ASSEMBLER__) 21*5113495bSYour Name #endif 22*5113495bSYour Name 23*5113495bSYour Name #define NUM_OF_DWORDS_COEX_RX_STATUS 2 24*5113495bSYour Name 25*5113495bSYour Name #define NUM_OF_QWORDS_COEX_RX_STATUS 1 26*5113495bSYour Name 27*5113495bSYour Name 28*5113495bSYour Name struct coex_rx_status { 29*5113495bSYour Name #ifndef WIFI_BIT_ORDER_BIG_ENDIAN 30*5113495bSYour Name uint32_t rx_mac_frame_status : 2, // [1:0] 31*5113495bSYour Name rx_with_tx_response : 1, // [2:2] 32*5113495bSYour Name rx_rate : 5, // [7:3] 33*5113495bSYour Name rx_bw : 3, // [10:8] 34*5113495bSYour Name single_mpdu : 1, // [11:11] 35*5113495bSYour Name filter_status : 1, // [12:12] 36*5113495bSYour Name ampdu : 1, // [13:13] 37*5113495bSYour Name directed : 1, // [14:14] 38*5113495bSYour Name reserved_0 : 1, // [15:15] 39*5113495bSYour Name rx_nss : 3, // [18:16] 40*5113495bSYour Name rx_rssi : 8, // [26:19] 41*5113495bSYour Name rx_type : 3, // [29:27] 42*5113495bSYour Name retry_bit_setting : 1, // [30:30] 43*5113495bSYour Name more_data_bit_setting : 1; // [31:31] 44*5113495bSYour Name uint32_t remain_rx_packet_time : 16, // [15:0] 45*5113495bSYour Name rx_remaining_fes_time : 16; // [31:16] 46*5113495bSYour Name #else 47*5113495bSYour Name uint32_t more_data_bit_setting : 1, // [31:31] 48*5113495bSYour Name retry_bit_setting : 1, // [30:30] 49*5113495bSYour Name rx_type : 3, // [29:27] 50*5113495bSYour Name rx_rssi : 8, // [26:19] 51*5113495bSYour Name rx_nss : 3, // [18:16] 52*5113495bSYour Name reserved_0 : 1, // [15:15] 53*5113495bSYour Name directed : 1, // [14:14] 54*5113495bSYour Name ampdu : 1, // [13:13] 55*5113495bSYour Name filter_status : 1, // [12:12] 56*5113495bSYour Name single_mpdu : 1, // [11:11] 57*5113495bSYour Name rx_bw : 3, // [10:8] 58*5113495bSYour Name rx_rate : 5, // [7:3] 59*5113495bSYour Name rx_with_tx_response : 1, // [2:2] 60*5113495bSYour Name rx_mac_frame_status : 2; // [1:0] 61*5113495bSYour Name uint32_t rx_remaining_fes_time : 16, // [31:16] 62*5113495bSYour Name remain_rx_packet_time : 16; // [15:0] 63*5113495bSYour Name #endif 64*5113495bSYour Name }; 65*5113495bSYour Name 66*5113495bSYour Name 67*5113495bSYour Name /* Description RX_MAC_FRAME_STATUS 68*5113495bSYour Name 69*5113495bSYour Name RXPCU send this bit as 1 when it receives the begin of a 70*5113495bSYour Name frame from PHY, and it passes the address filter. RXPCUsend 71*5113495bSYour Name this bit as 0 when the frame ends. (on/off bit) 72*5113495bSYour Name <enum 0 ppdu_start> start of PPDU reception. 73*5113495bSYour Name For SU: Generated the first time the MPDU header passes 74*5113495bSYour Name the address filter and is destined to this STA. 75*5113495bSYour Name For MU: Generated the first time the MPDU header from any 76*5113495bSYour Name user passes the address filter and is destined to this 77*5113495bSYour Name STA. 78*5113495bSYour Name <enum 1 first_mpdu_FCS_pass> message only sent in case 79*5113495bSYour Name of A-MPDU reception. 80*5113495bSYour Name For SU: first time the FCS of an MPDU passes (and frame 81*5113495bSYour Name is destined to this device) 82*5113495bSYour Name For MU: first time the FCS of any MPDU passes (and frame 83*5113495bSYour Name is destined to this device) 84*5113495bSYour Name 85*5113495bSYour Name <enum 2 ppdu_end> receive of PPDU frame reception has 86*5113495bSYour Name finished 87*5113495bSYour Name <enum 3 ppdu_end_due_to_phy_nap> receive of PPDU frame reception 88*5113495bSYour Name has finished as it has been aborted due to PHY NAP generation 89*5113495bSYour Name 90*5113495bSYour Name <legal all> 91*5113495bSYour Name */ 92*5113495bSYour Name 93*5113495bSYour Name #define COEX_RX_STATUS_RX_MAC_FRAME_STATUS_OFFSET 0x0000000000000000 94*5113495bSYour Name #define COEX_RX_STATUS_RX_MAC_FRAME_STATUS_LSB 0 95*5113495bSYour Name #define COEX_RX_STATUS_RX_MAC_FRAME_STATUS_MSB 1 96*5113495bSYour Name #define COEX_RX_STATUS_RX_MAC_FRAME_STATUS_MASK 0x0000000000000003 97*5113495bSYour Name 98*5113495bSYour Name 99*5113495bSYour Name /* Description RX_WITH_TX_RESPONSE 100*5113495bSYour Name 101*5113495bSYour Name Field only valid when rx_mac_frame_status is first_mpdu_FCS_pass 102*5113495bSYour Name or ppdu_end. 103*5113495bSYour Name 104*5113495bSYour Name For SU: RXPCU set this bit to indicate it is expecting the 105*5113495bSYour Name TX to send a response after the receive. 106*5113495bSYour Name For MU: RXPCU set this bit to indicate it is expecting that 107*5113495bSYour Name at least for one of the users a response after the reception 108*5113495bSYour Name needs to be generated. 109*5113495bSYour Name 110*5113495bSYour Name <legal all> 111*5113495bSYour Name */ 112*5113495bSYour Name 113*5113495bSYour Name #define COEX_RX_STATUS_RX_WITH_TX_RESPONSE_OFFSET 0x0000000000000000 114*5113495bSYour Name #define COEX_RX_STATUS_RX_WITH_TX_RESPONSE_LSB 2 115*5113495bSYour Name #define COEX_RX_STATUS_RX_WITH_TX_RESPONSE_MSB 2 116*5113495bSYour Name #define COEX_RX_STATUS_RX_WITH_TX_RESPONSE_MASK 0x0000000000000004 117*5113495bSYour Name 118*5113495bSYour Name 119*5113495bSYour Name /* Description RX_RATE 120*5113495bSYour Name 121*5113495bSYour Name For SU: RXPCU send the current receive rate at the beginning 122*5113495bSYour Name of receive when rate is available from PHY. 123*5113495bSYour Name For MU: RXPCU to use the current receive rate from the first 124*5113495bSYour Name USER that triggers this TLV to be generated. 125*5113495bSYour Name 126*5113495bSYour Name Field is always valid 127*5113495bSYour Name 128*5113495bSYour Name <legal all> 129*5113495bSYour Name */ 130*5113495bSYour Name 131*5113495bSYour Name #define COEX_RX_STATUS_RX_RATE_OFFSET 0x0000000000000000 132*5113495bSYour Name #define COEX_RX_STATUS_RX_RATE_LSB 3 133*5113495bSYour Name #define COEX_RX_STATUS_RX_RATE_MSB 7 134*5113495bSYour Name #define COEX_RX_STATUS_RX_RATE_MASK 0x00000000000000f8 135*5113495bSYour Name 136*5113495bSYour Name 137*5113495bSYour Name /* Description RX_BW 138*5113495bSYour Name 139*5113495bSYour Name Actual RX bandwidth. Not SU or MU dependent. 140*5113495bSYour Name RXPCU send the current receive rate at the beginning of 141*5113495bSYour Name receive. This information is from PHY. 142*5113495bSYour Name Field is always valid 143*5113495bSYour Name 144*5113495bSYour Name <enum 0 20_mhz>20 Mhz BW 145*5113495bSYour Name <enum 1 40_mhz>40 Mhz BW 146*5113495bSYour Name <enum 2 80_mhz>80 Mhz BW 147*5113495bSYour Name <enum 3 160_mhz>160 Mhz BW 148*5113495bSYour Name <enum 4 320_mhz>320 Mhz BW 149*5113495bSYour Name <enum 5 240_mhz>240 Mhz BW 150*5113495bSYour Name */ 151*5113495bSYour Name 152*5113495bSYour Name #define COEX_RX_STATUS_RX_BW_OFFSET 0x0000000000000000 153*5113495bSYour Name #define COEX_RX_STATUS_RX_BW_LSB 8 154*5113495bSYour Name #define COEX_RX_STATUS_RX_BW_MSB 10 155*5113495bSYour Name #define COEX_RX_STATUS_RX_BW_MASK 0x0000000000000700 156*5113495bSYour Name 157*5113495bSYour Name 158*5113495bSYour Name /* Description SINGLE_MPDU 159*5113495bSYour Name 160*5113495bSYour Name For SU: Once set the Received frame is a single MPDU. This 161*5113495bSYour Name can be a non-AMPDU reception or A-MPDU reception but with 162*5113495bSYour Name an EOF bit set (VHT single AMPDU). 163*5113495bSYour Name For MU: RXPCU to base this on the first USER that triggers 164*5113495bSYour Name this TLV to be generated. 165*5113495bSYour Name <legal all> 166*5113495bSYour Name */ 167*5113495bSYour Name 168*5113495bSYour Name #define COEX_RX_STATUS_SINGLE_MPDU_OFFSET 0x0000000000000000 169*5113495bSYour Name #define COEX_RX_STATUS_SINGLE_MPDU_LSB 11 170*5113495bSYour Name #define COEX_RX_STATUS_SINGLE_MPDU_MSB 11 171*5113495bSYour Name #define COEX_RX_STATUS_SINGLE_MPDU_MASK 0x0000000000000800 172*5113495bSYour Name 173*5113495bSYour Name 174*5113495bSYour Name /* Description FILTER_STATUS 175*5113495bSYour Name 176*5113495bSYour Name 1: LMAC is interested in receiving the full packet and forward 177*5113495bSYour Name it to downstream modules. 0: LMAC is not interested in 178*5113495bSYour Name receiving the packet. 179*5113495bSYour Name 180*5113495bSYour Name Based on the register bit 'COEX_RX_STATUS_NOFILTERIN,' 181*5113495bSYour Name Rx PCU will send this TLV for filtered-out packets as well, 182*5113495bSYour Name with appropriate info in the fields filter_status, AMPDU 183*5113495bSYour Name and Directed. Otherwise, and in other chips, this TLV is 184*5113495bSYour Name sent only for packets filtered in, with these fields set 185*5113495bSYour Name to zero. 186*5113495bSYour Name <legal all> 187*5113495bSYour Name */ 188*5113495bSYour Name 189*5113495bSYour Name #define COEX_RX_STATUS_FILTER_STATUS_OFFSET 0x0000000000000000 190*5113495bSYour Name #define COEX_RX_STATUS_FILTER_STATUS_LSB 12 191*5113495bSYour Name #define COEX_RX_STATUS_FILTER_STATUS_MSB 12 192*5113495bSYour Name #define COEX_RX_STATUS_FILTER_STATUS_MASK 0x0000000000001000 193*5113495bSYour Name 194*5113495bSYour Name 195*5113495bSYour Name /* Description AMPDU 196*5113495bSYour Name 197*5113495bSYour Name 1: Indicates received frame is an AMPDU0: indicates received 198*5113495bSYour Name frames in not an AMPDU 199*5113495bSYour Name 200*5113495bSYour Name Based on the register bit 'COEX_RX_STATUS_NOFILTERIN,' 201*5113495bSYour Name Rx PCU will send this TLV for filtered-out packets as well, 202*5113495bSYour Name with appropriate info in the fields filter_status, AMPDU 203*5113495bSYour Name and Directed. Otherwise, and in other chips, this TLV is 204*5113495bSYour Name sent only for packets filtered in, with these fields set 205*5113495bSYour Name to zero. 206*5113495bSYour Name <legal all> 207*5113495bSYour Name */ 208*5113495bSYour Name 209*5113495bSYour Name #define COEX_RX_STATUS_AMPDU_OFFSET 0x0000000000000000 210*5113495bSYour Name #define COEX_RX_STATUS_AMPDU_LSB 13 211*5113495bSYour Name #define COEX_RX_STATUS_AMPDU_MSB 13 212*5113495bSYour Name #define COEX_RX_STATUS_AMPDU_MASK 0x0000000000002000 213*5113495bSYour Name 214*5113495bSYour Name 215*5113495bSYour Name /* Description DIRECTED 216*5113495bSYour Name 217*5113495bSYour Name 1: indicates AD1 matches our Receiver address0: indicates 218*5113495bSYour Name AD1 does not match our Receiver address 219*5113495bSYour Name 220*5113495bSYour Name Based on the register bit 'COEX_RX_STATUS_NOFILTERIN,' 221*5113495bSYour Name Rx PCU will send this TLV for filtered-out packets as well, 222*5113495bSYour Name with appropriate info in the fields filter_status, AMPDU 223*5113495bSYour Name and Directed. Otherwise, and in other chips, this TLV is 224*5113495bSYour Name sent only for packets filtered in, with these fields set 225*5113495bSYour Name to zero. 226*5113495bSYour Name <legal all> 227*5113495bSYour Name */ 228*5113495bSYour Name 229*5113495bSYour Name #define COEX_RX_STATUS_DIRECTED_OFFSET 0x0000000000000000 230*5113495bSYour Name #define COEX_RX_STATUS_DIRECTED_LSB 14 231*5113495bSYour Name #define COEX_RX_STATUS_DIRECTED_MSB 14 232*5113495bSYour Name #define COEX_RX_STATUS_DIRECTED_MASK 0x0000000000004000 233*5113495bSYour Name 234*5113495bSYour Name 235*5113495bSYour Name /* Description RESERVED_0 236*5113495bSYour Name 237*5113495bSYour Name <legal 0> 238*5113495bSYour Name */ 239*5113495bSYour Name 240*5113495bSYour Name #define COEX_RX_STATUS_RESERVED_0_OFFSET 0x0000000000000000 241*5113495bSYour Name #define COEX_RX_STATUS_RESERVED_0_LSB 15 242*5113495bSYour Name #define COEX_RX_STATUS_RESERVED_0_MSB 15 243*5113495bSYour Name #define COEX_RX_STATUS_RESERVED_0_MASK 0x0000000000008000 244*5113495bSYour Name 245*5113495bSYour Name 246*5113495bSYour Name /* Description RX_NSS 247*5113495bSYour Name 248*5113495bSYour Name For SU: Number of spatial streams in the reception. Field 249*5113495bSYour Name is always valid 250*5113495bSYour Name For MU: RXPCU to base this on the first USER that triggers 251*5113495bSYour Name this TLV to be generated. 252*5113495bSYour Name 253*5113495bSYour Name <enum 0 1_spatial_stream>Single spatial stream 254*5113495bSYour Name <enum 1 2_spatial_streams>2 spatial streams 255*5113495bSYour Name <enum 2 3_spatial_streams>3 spatial streams 256*5113495bSYour Name <enum 3 4_spatial_streams>4 spatial streams 257*5113495bSYour Name <enum 4 5_spatial_streams>5 spatial streams 258*5113495bSYour Name <enum 5 6_spatial_streams>6 spatial streams 259*5113495bSYour Name <enum 6 7_spatial_streams>7 spatial streams 260*5113495bSYour Name <enum 7 8_spatial_streams>8 spatial streams 261*5113495bSYour Name */ 262*5113495bSYour Name 263*5113495bSYour Name #define COEX_RX_STATUS_RX_NSS_OFFSET 0x0000000000000000 264*5113495bSYour Name #define COEX_RX_STATUS_RX_NSS_LSB 16 265*5113495bSYour Name #define COEX_RX_STATUS_RX_NSS_MSB 18 266*5113495bSYour Name #define COEX_RX_STATUS_RX_NSS_MASK 0x0000000000070000 267*5113495bSYour Name 268*5113495bSYour Name 269*5113495bSYour Name /* Description RX_RSSI 270*5113495bSYour Name 271*5113495bSYour Name RXPCU send the current receive RSSI (from the PHYRX_RSSI_LEGACY 272*5113495bSYour Name TLV) at the beginning of reception. This is information 273*5113495bSYour Name is from PHY and is not SU or MU dependent. 274*5113495bSYour Name Field is always valid 275*5113495bSYour Name <legal all> 276*5113495bSYour Name */ 277*5113495bSYour Name 278*5113495bSYour Name #define COEX_RX_STATUS_RX_RSSI_OFFSET 0x0000000000000000 279*5113495bSYour Name #define COEX_RX_STATUS_RX_RSSI_LSB 19 280*5113495bSYour Name #define COEX_RX_STATUS_RX_RSSI_MSB 26 281*5113495bSYour Name #define COEX_RX_STATUS_RX_RSSI_MASK 0x0000000007f80000 282*5113495bSYour Name 283*5113495bSYour Name 284*5113495bSYour Name /* Description RX_TYPE 285*5113495bSYour Name 286*5113495bSYour Name For SU: RXPCU send the current receive packet type. Field 287*5113495bSYour Name is always valid.This info is from MAC. 288*5113495bSYour Name For MU: RXPCU to base this on the first USER that triggers 289*5113495bSYour Name this TLV to be generated. 290*5113495bSYour Name 291*5113495bSYour Name <enum 0 data > 292*5113495bSYour Name <enum 1 management> 293*5113495bSYour Name <enum 2 beacon> 294*5113495bSYour Name <enum 3 control> For reception of RTS frame 295*5113495bSYour Name <enum 4 control_response> For reception of CTS, ACK 296*5113495bSYour Name or BA frames 297*5113495bSYour Name <enum 5 others> 298*5113495bSYour Name <legal 0-5> 299*5113495bSYour Name */ 300*5113495bSYour Name 301*5113495bSYour Name #define COEX_RX_STATUS_RX_TYPE_OFFSET 0x0000000000000000 302*5113495bSYour Name #define COEX_RX_STATUS_RX_TYPE_LSB 27 303*5113495bSYour Name #define COEX_RX_STATUS_RX_TYPE_MSB 29 304*5113495bSYour Name #define COEX_RX_STATUS_RX_TYPE_MASK 0x0000000038000000 305*5113495bSYour Name 306*5113495bSYour Name 307*5113495bSYour Name /* Description RETRY_BIT_SETTING 308*5113495bSYour Name 309*5113495bSYour Name For SU: Value of the retry bit in the frame control field 310*5113495bSYour Name of the first MPDU MAC header that passes the RxPCU frame 311*5113495bSYour Name filter 312*5113495bSYour Name For MU: RXPCU to base this on the first USER that triggers 313*5113495bSYour Name this TLV to be generated. 314*5113495bSYour Name 315*5113495bSYour Name <legal all> 316*5113495bSYour Name */ 317*5113495bSYour Name 318*5113495bSYour Name #define COEX_RX_STATUS_RETRY_BIT_SETTING_OFFSET 0x0000000000000000 319*5113495bSYour Name #define COEX_RX_STATUS_RETRY_BIT_SETTING_LSB 30 320*5113495bSYour Name #define COEX_RX_STATUS_RETRY_BIT_SETTING_MSB 30 321*5113495bSYour Name #define COEX_RX_STATUS_RETRY_BIT_SETTING_MASK 0x0000000040000000 322*5113495bSYour Name 323*5113495bSYour Name 324*5113495bSYour Name /* Description MORE_DATA_BIT_SETTING 325*5113495bSYour Name 326*5113495bSYour Name For SU: Value of the more data bit in the frame control 327*5113495bSYour Name field of the first MPDU MAC header that passes the RxPCU 328*5113495bSYour Name frame filter 329*5113495bSYour Name For MU: RXPCU to base this on the first USER that triggers 330*5113495bSYour Name this TLV to be generated. 331*5113495bSYour Name 332*5113495bSYour Name <legal all> 333*5113495bSYour Name */ 334*5113495bSYour Name 335*5113495bSYour Name #define COEX_RX_STATUS_MORE_DATA_BIT_SETTING_OFFSET 0x0000000000000000 336*5113495bSYour Name #define COEX_RX_STATUS_MORE_DATA_BIT_SETTING_LSB 31 337*5113495bSYour Name #define COEX_RX_STATUS_MORE_DATA_BIT_SETTING_MSB 31 338*5113495bSYour Name #define COEX_RX_STATUS_MORE_DATA_BIT_SETTING_MASK 0x0000000080000000 339*5113495bSYour Name 340*5113495bSYour Name 341*5113495bSYour Name /* Description REMAIN_RX_PACKET_TIME 342*5113495bSYour Name 343*5113495bSYour Name HWSCH sends current remaining rx PPDU frame time. This time 344*5113495bSYour Name covers the entire rx_frame. This information is not in 345*5113495bSYour Name the L-SIG and we expect to get it from PHY at the start 346*5113495bSYour Name of the reception. 347*5113495bSYour Name This is not SU or MU dependent. 348*5113495bSYour Name <legal all> 349*5113495bSYour Name */ 350*5113495bSYour Name 351*5113495bSYour Name #define COEX_RX_STATUS_REMAIN_RX_PACKET_TIME_OFFSET 0x0000000000000000 352*5113495bSYour Name #define COEX_RX_STATUS_REMAIN_RX_PACKET_TIME_LSB 32 353*5113495bSYour Name #define COEX_RX_STATUS_REMAIN_RX_PACKET_TIME_MSB 47 354*5113495bSYour Name #define COEX_RX_STATUS_REMAIN_RX_PACKET_TIME_MASK 0x0000ffff00000000 355*5113495bSYour Name 356*5113495bSYour Name 357*5113495bSYour Name /* Description RX_REMAINING_FES_TIME 358*5113495bSYour Name 359*5113495bSYour Name RXPCU sends the remaining time FES time the moment a frame 360*5113495bSYour Name with proper FCS is received. The time indicated is the 361*5113495bSYour Name remaining rx packet time with the duration field value added. 362*5113495bSYour Name As long as no frame with valid FCS is received, this field 363*5113495bSYour Name should be set equal to 'remain_rx_packet_time' 364*5113495bSYour Name This is not SU or MU dependent. 365*5113495bSYour Name <legal all> 366*5113495bSYour Name */ 367*5113495bSYour Name 368*5113495bSYour Name #define COEX_RX_STATUS_RX_REMAINING_FES_TIME_OFFSET 0x0000000000000000 369*5113495bSYour Name #define COEX_RX_STATUS_RX_REMAINING_FES_TIME_LSB 48 370*5113495bSYour Name #define COEX_RX_STATUS_RX_REMAINING_FES_TIME_MSB 63 371*5113495bSYour Name #define COEX_RX_STATUS_RX_REMAINING_FES_TIME_MASK 0xffff000000000000 372*5113495bSYour Name 373*5113495bSYour Name 374*5113495bSYour Name 375*5113495bSYour Name #endif // COEX_RX_STATUS 376