/*
 * Copyright (c) 2020 The Linux Foundation. All rights reserved.
 *
 * Permission to use, copy, modify, and/or distribute this software for any
 * purpose with or without fee is hereby granted, provided that the above
 * copyright notice and this permission notice appear in all copies.
 *
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 */

// $ATH_LICENSE_HW_HDR_C$
//
// DO NOT EDIT!  This file is automatically generated
//               These definitions are tied to a particular hardware layout


#ifndef _RX_PPDU_START_H_
#define _RX_PPDU_START_H_
#if !defined(__ASSEMBLER__)
#endif


// ################ START SUMMARY #################
//
//	Dword	Fields
//	0	phy_ppdu_id[15:0], reserved_15[31:16]
//	1	sw_phy_meta_data[31:0]
//	2	ppdu_start_timestamp[31:0]
//
// ################ END SUMMARY #################

#define NUM_OF_DWORDS_RX_PPDU_START 3

struct rx_ppdu_start {
             uint32_t phy_ppdu_id                     : 16, //[15:0]
                      reserved_15                     : 16; //[31:16]
             uint32_t sw_phy_meta_data                : 32; //[31:0]
             uint32_t ppdu_start_timestamp            : 32; //[31:0]
};

/*

phy_ppdu_id
			
			A ppdu counter value that PHY increments for every PPDU
			received. The counter value wraps around  
			
			<legal all>

reserved_15
			
			Reserved
			
			<legal 0>

sw_phy_meta_data
			
			SW programmed Meta data provided by the PHY.
			
			
			
			Can be used for SW to indicate the channel the device is
			on.

ppdu_start_timestamp
			
			Timestamp that indicates when the PPDU that contained
			this MPDU started on the medium.
			
			
			
			The timestamp is captured by the PHY and given to the
			MAC in PHYRX_RSSI_LEGACY.ppdu_start_timestamp
			
			<legal all>
*/


/* Description		RX_PPDU_START_0_PHY_PPDU_ID
			
			A ppdu counter value that PHY increments for every PPDU
			received. The counter value wraps around  
			
			<legal all>
*/
#define RX_PPDU_START_0_PHY_PPDU_ID_OFFSET                           0x00000000
#define RX_PPDU_START_0_PHY_PPDU_ID_LSB                              0
#define RX_PPDU_START_0_PHY_PPDU_ID_MASK                             0x0000ffff

/* Description		RX_PPDU_START_0_RESERVED_15
			
			Reserved
			
			<legal 0>
*/
#define RX_PPDU_START_0_RESERVED_15_OFFSET                           0x00000000
#define RX_PPDU_START_0_RESERVED_15_LSB                              16
#define RX_PPDU_START_0_RESERVED_15_MASK                             0xffff0000

/* Description		RX_PPDU_START_1_SW_PHY_META_DATA
			
			SW programmed Meta data provided by the PHY.
			
			
			
			Can be used for SW to indicate the channel the device is
			on.
*/
#define RX_PPDU_START_1_SW_PHY_META_DATA_OFFSET                      0x00000004
#define RX_PPDU_START_1_SW_PHY_META_DATA_LSB                         0
#define RX_PPDU_START_1_SW_PHY_META_DATA_MASK                        0xffffffff

/* Description		RX_PPDU_START_2_PPDU_START_TIMESTAMP
			
			Timestamp that indicates when the PPDU that contained
			this MPDU started on the medium.
			
			
			
			The timestamp is captured by the PHY and given to the
			MAC in PHYRX_RSSI_LEGACY.ppdu_start_timestamp
			
			<legal all>
*/
#define RX_PPDU_START_2_PPDU_START_TIMESTAMP_OFFSET                  0x00000008
#define RX_PPDU_START_2_PPDU_START_TIMESTAMP_LSB                     0
#define RX_PPDU_START_2_PPDU_START_TIMESTAMP_MASK                    0xffffffff


#endif // _RX_PPDU_START_H_
