/******************************************************************************
 *
 * Copyright(c) 2007 - 2017  Realtek Corporation.
 *
 * This program is free software; you can redistribute it and/or modify it
 * under the terms of version 2 of the GNU General Public License as
 * published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
 * more details.
 *
 * The full GNU General Public License is included in this distribution in the
 * file called LICENSE.
 *
 * Contact Information:
 * wlanfae <wlanfae@realtek.com>
 * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
 * Hsinchu 300, Taiwan.
 *
 * Larry Finger <Larry.Finger@lwfinger.net>
 *
 *****************************************************************************/

#ifndef __PHYDM_PHYSTATUS_H__
#define __PHYDM_PHYSTATUS_H__

/*--------------------------Define -------------------------------------------*/
#define CCK_RSSI_INIT_COUNT 5

#define RA_RSSI_STATE_INIT 0
#define RA_RSSI_STATE_SEND 1
#define RA_RSSI_STATE_HOLD 2

#define CFO_HW_RPT_2_KHZ(val) ((val << 1) + (val >> 1))
/* (X* 312.5 Khz)>>7 ~=  X*2.5 Khz= (X<<1 + X>>1)Khz  */
#define PHY_STATUS_JRGUAR2_DW_LEN 7 /* 7*4 = 28 Byte */
#define SHOW_PHY_STATUS_UNLIMITED 0
#define RSSI_MA_FACTOR 4

/* ************************************************************
 * structure and define
 * ************************************************************ */

__PACK struct _phy_rx_agc_info {
#if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE)
	u8 gain : 7, trsw : 1;
#else
	u8 trsw : 1, gain : 7;
#endif
};

__PACK struct _phy_status_rpt_8192cd {
	struct _phy_rx_agc_info path_agc[2];
	u8 ch_corr[2];
	u8 cck_sig_qual_ofdm_pwdb_all;
	u8 cck_agc_rpt_ofdm_cfosho_a;
	u8 cck_rpt_b_ofdm_cfosho_b;
	u8 rsvd_1; /*ch_corr_msb;*/
	u8 noise_power_db_msb;
	s8 path_cfotail[2];
	u8 pcts_mask[2];
	s8 stream_rxevm[2];
	u8 path_rxsnr[2];
	u8 noise_power_db_lsb;
	u8 rsvd_2[3];
	u8 stream_csi[2];
	u8 stream_target_csi[2];
	s8 sig_evm;
	u8 rsvd_3;

#if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE)
	u8 antsel_rx_keep_2 : 1; /*ex_intf_flg:1;*/
	u8 sgi_en : 1;
	u8 rxsc : 2;
	u8 idle_long : 1;
	u8 r_ant_train_en : 1;
	u8 ant_sel_b : 1;
	u8 ant_sel : 1;
#else /*_BIG_ENDIAN_	*/
	u8 ant_sel : 1;
	u8 ant_sel_b : 1;
	u8 r_ant_train_en : 1;
	u8 idle_long : 1;
	u8 rxsc : 2;
	u8 sgi_en : 1;
	u8 antsel_rx_keep_2 : 1; /*ex_intf_flg:1;*/
#endif
};

struct _phy_status_rpt_8812 {
	/*	DWORD 0*/
	u8 gain_trsw[2]; /*path-A and path-B {TRSW, gain[6:0] }*/
	u8 chl_num_LSB; /*channel number[7:0]*/
#if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE)
	u8 chl_num_MSB : 2; /*channel number[9:8]*/
	u8 sub_chnl : 4; /*sub-channel location[3:0]*/
	u8 r_RFMOD : 2; /*RF mode[1:0]*/
#else /*_BIG_ENDIAN_	*/
	u8 r_RFMOD : 2;
	u8 sub_chnl : 4;
	u8 chl_num_MSB : 2;
#endif

	/*	DWORD 1*/
	u8 pwdb_all; /*CCK signal quality / OFDM pwdb all*/
	s8 cfosho
		[2]; /*DW1 byte 1 DW1 byte2	CCK AGC report and CCK_BB_Power / OFDM path-A and path-B short CFO*/
#if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE)
	/*this should be checked again because the definition of 8812 and 8814 is different*/
	/*	u8			r_cck_rx_enable_pathc:2;					cck rx enable pathc[1:0]*/
	/*	u8			cck_rx_path:4;							cck rx path[3:0]*/
	u8 resvd_0 : 6;
	u8 bt_RF_ch_MSB : 2; /*8812A:2'b0			8814A: bt rf channel keep[7:6]*/
#else /*_BIG_ENDIAN_*/
	u8 bt_RF_ch_MSB : 2;
	u8 resvd_0 : 6;
#endif

/*	DWORD 2*/
#if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE)
	u8 ant_div_sw_a : 1; /*8812A: ant_div_sw_a    8814A: 1'b0*/
	u8 ant_div_sw_b : 1; /*8812A: ant_div_sw_b    8814A: 1'b0*/
	u8 bt_RF_ch_LSB : 6; /*8812A: 6'b0                   8814A: bt rf channel keep[5:0]*/
#else /*_BIG_ENDIAN_	*/
	u8 bt_RF_ch_LSB : 6;
	u8 ant_div_sw_b : 1;
	u8 ant_div_sw_a : 1;
#endif
	s8 cfotail[2]; /*DW2 byte 1 DW2 byte 2	path-A and path-B CFO tail*/
	u8 PCTS_MSK_RPT_0; /*PCTS mask report[7:0]*/
	u8 PCTS_MSK_RPT_1; /*PCTS mask report[15:8]*/

	/*	DWORD 3*/
	s8 rxevm[2]; /*DW3 byte 1 DW3 byte 2	stream 1 and stream 2 RX EVM*/
	s8 rxsnr[2]; /*DW3 byte 3 DW4 byte 0	path-A and path-B RX SNR*/

	/*	DWORD 4*/
	u8 PCTS_MSK_RPT_2; /*PCTS mask report[23:16]*/
#if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE)
	u8 PCTS_MSK_RPT_3 : 6; /*PCTS mask report[29:24]*/
	u8 pcts_rpt_valid : 1; /*pcts_rpt_valid*/
	u8 resvd_1 : 1; /*1'b0*/
#else /*_BIG_ENDIAN_*/
	u8 resvd_1 : 1;
	u8 pcts_rpt_valid : 1;
	u8 PCTS_MSK_RPT_3 : 6;
#endif
	s8 rxevm_cd
		[2]; /*DW 4 byte 3 DW5 byte 0  8812A: 16'b0	8814A: stream 3 and stream 4 RX EVM*/

	/*	DWORD 5*/
	u8 csi_current
		[2]; /*DW5 byte 1 DW5 byte 2	8812A: stream 1 and 2 CSI	8814A:  path-C and path-D RX SNR*/
	u8 gain_trsw_cd
		[2]; /*DW5 byte 3 DW6 byte 0	path-C and path-D {TRSW, gain[6:0] }*/

	/*	DWORD 6*/
	s8 sigevm; /*signal field EVM*/
#if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE)
	u8 antidx_antc : 3; /*8812A: 3'b0		8814A: antidx_antc[2:0]*/
	u8 antidx_antd : 3; /*8812A: 3'b0		8814A: antidx_antd[2:0]*/
	u8 dpdt_ctrl_keep : 1; /*8812A: 1'b0		8814A: dpdt_ctrl_keep*/
	u8 GNT_BT_keep : 1; /*8812A: 1'b0		8814A: GNT_BT_keep*/
#else /*_BIG_ENDIAN_*/
	u8 GNT_BT_keep : 1;
	u8 dpdt_ctrl_keep : 1;
	u8 antidx_antd : 3;
	u8 antidx_antc : 3;
#endif
#if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE)
	u8 antidx_anta : 3; /*antidx_anta[2:0]*/
	u8 antidx_antb : 3; /*antidx_antb[2:0]*/
	u8 hw_antsw_occur : 2; /*1'b0*/
#else /*_BIG_ENDIAN_*/
	u8 hw_antsw_occur : 2;
	u8 antidx_antb : 3;
	u8 antidx_anta : 3;
#endif
};

#if (ODM_PHY_STATUS_NEW_TYPE_SUPPORT == 1)

__PACK struct _phy_status_rpt_jaguar2_type0 {
	/* DW0 */
	u8 page_num;
	u8 pwdb;
#if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE)
	u8 gain : 6;
	u8 rsvd_0 : 1;
	u8 trsw : 1;
#else
	u8 trsw : 1;
	u8 rsvd_0 : 1;
	u8 gain : 6;
#endif
	u8 rsvd_1;

	/* DW1 */
	u8 rsvd_2;
#if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE)
	u8 rxsc : 4;
	u8 agc_table : 4;
#else
	u8 agc_table : 4;
	u8 rxsc : 4;
#endif
	u8 channel;
	u8 band;

	/* DW2 */
	u16 length;
#if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE)
	u8 antidx_a : 3;
	u8 antidx_b : 3;
	u8 rsvd_3 : 2;
	u8 antidx_c : 3;
	u8 antidx_d : 3;
	u8 rsvd_4 : 2;
#else
	u8 rsvd_3 : 2;
	u8 antidx_b : 3;
	u8 antidx_a : 3;
	u8 rsvd_4 : 2;
	u8 antidx_d : 3;
	u8 antidx_c : 3;
#endif

	/* DW3 */
	u8 signal_quality;
#if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE)
	u8 vga : 5;
	u8 lna_l : 3;
	u8 bb_power : 6;
	u8 rsvd_9 : 1;
	u8 lna_h : 1;
#else
	u8 lna_l : 3;
	u8 vga : 5;
	u8 lna_h : 1;
	u8 rsvd_9 : 1;
	u8 bb_power : 6;
#endif
	u8 rsvd_5;

	/* DW4 */
	u32 rsvd_6;

	/* DW5 */
	u32 rsvd_7;

	/* DW6 */
	u32 rsvd_8;
};

__PACK struct _phy_status_rpt_jaguar2_type1 {
	/* DW0 and DW1 */
	u8 page_num;
	u8 pwdb[4];
#if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE)
	u8 l_rxsc : 4;
	u8 ht_rxsc : 4;
#else
	u8 ht_rxsc : 4;
	u8 l_rxsc : 4;
#endif
	u8 channel;
#if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE)
	u8 band : 2;
	u8 rsvd_0 : 1;
	u8 hw_antsw_occu : 1;
	u8 gnt_bt : 1;
	u8 ldpc : 1;
	u8 stbc : 1;
	u8 beamformed : 1;
#else
	u8 beamformed : 1;
	u8 stbc : 1;
	u8 ldpc : 1;
	u8 gnt_bt : 1;
	u8 hw_antsw_occu : 1;
	u8 rsvd_0 : 1;
	u8 band : 2;
#endif

	/* DW2 */
	u16 lsig_length;
#if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE)
	u8 antidx_a : 3;
	u8 antidx_b : 3;
	u8 rsvd_1 : 2;
	u8 antidx_c : 3;
	u8 antidx_d : 3;
	u8 rsvd_2 : 2;
#else
	u8 rsvd_1 : 2;
	u8 antidx_b : 3;
	u8 antidx_a : 3;
	u8 rsvd_2 : 2;
	u8 antidx_d : 3;
	u8 antidx_c : 3;
#endif

	/* DW3 */
	u8 paid;
#if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE)
	u8 paid_msb : 1;
	u8 gid : 6;
	u8 rsvd_3 : 1;
#else
	u8 rsvd_3 : 1;
	u8 gid : 6;
	u8 paid_msb : 1;
#endif
	u8 intf_pos;
#if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE)
	u8 intf_pos_msb : 1;
	u8 rsvd_4 : 2;
	u8 nb_intf_flag : 1;
	u8 rf_mode : 2;
	u8 rsvd_5 : 2;
#else
	u8 rsvd_5 : 2;
	u8 rf_mode : 2;
	u8 nb_intf_flag : 1;
	u8 rsvd_4 : 2;
	u8 intf_pos_msb : 1;
#endif

	/* DW4 */
	s8 rxevm[4]; /* s(8,1) */

	/* DW5 */
	s8 cfo_tail[4]; /* s(8,7) */

	/* DW6 */
	s8 rxsnr[4]; /* s(8,1) */
};

__PACK struct _phy_status_rpt_jaguar2_type2 {
	/* DW0 ane DW1 */
	u8 page_num;
	u8 pwdb[4];
#if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE)
	u8 l_rxsc : 4;
	u8 ht_rxsc : 4;
#else
	u8 ht_rxsc : 4;
	u8 l_rxsc : 4;
#endif
	u8 channel;
#if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE)
	u8 band : 2;
	u8 rsvd_0 : 1;
	u8 hw_antsw_occu : 1;
	u8 gnt_bt : 1;
	u8 ldpc : 1;
	u8 stbc : 1;
	u8 beamformed : 1;
#else
	u8 beamformed : 1;
	u8 stbc : 1;
	u8 ldpc : 1;
	u8 gnt_bt : 1;
	u8 hw_antsw_occu : 1;
	u8 rsvd_0 : 1;
	u8 band : 2;
#endif

/* DW2 */
#if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE)
	u8 shift_l_map : 6;
	u8 rsvd_1 : 2;
#else
	u8 rsvd_1 : 2;
	u8 shift_l_map : 6;
#endif
	u8 cnt_pw2cca;
#if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE)
	u8 agc_table_a : 4;
	u8 agc_table_b : 4;
	u8 agc_table_c : 4;
	u8 agc_table_d : 4;
#else
	u8 agc_table_b : 4;
	u8 agc_table_a : 4;
	u8 agc_table_d : 4;
	u8 agc_table_c : 4;
#endif

	/* DW3 ~ DW6*/
	u8 cnt_cca2agc_rdy;
#if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE)
	u8 gain_a : 6;
	u8 rsvd_2 : 1;
	u8 trsw_a : 1;
	u8 gain_b : 6;
	u8 rsvd_3 : 1;
	u8 trsw_b : 1;
	u8 gain_c : 6;
	u8 rsvd_4 : 1;
	u8 trsw_c : 1;
	u8 gain_d : 6;
	u8 rsvd_5 : 1;
	u8 trsw_d : 1;
	u8 aagc_step_a : 2;
	u8 aagc_step_b : 2;
	u8 aagc_step_c : 2;
	u8 aagc_step_d : 2;
#else
	u8 trsw_a : 1;
	u8 rsvd_2 : 1;
	u8 gain_a : 6;
	u8 trsw_b : 1;
	u8 rsvd_3 : 1;
	u8 gain_b : 6;
	u8 trsw_c : 1;
	u8 rsvd_4 : 1;
	u8 gain_c : 6;
	u8 trsw_d : 1;
	u8 rsvd_5 : 1;
	u8 gain_d : 6;
	u8 aagc_step_d : 2;
	u8 aagc_step_c : 2;
	u8 aagc_step_b : 2;
	u8 aagc_step_a : 2;
#endif
	u8 ht_aagc_gain[4];
	u8 dagc_gain[4];
#if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE)
	u8 counter : 6;
	u8 rsvd_6 : 2;
	u8 syn_count : 5;
	u8 rsvd_7 : 3;
#else
	u8 rsvd_6 : 2;
	u8 counter : 6;
	u8 rsvd_7 : 3;
	u8 syn_count : 5;
#endif
};
#endif

/*==============================================*/
#if (ODM_PHY_STATUS_JARGUAR3)
__PACK struct _phy_status_rpt_jaguar3_type0 {
	/* DW0 : Offset 0 */
#if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE)
	u8		page_num:4;
	u8		pkt_cnt:2;
	u8		channel_msb:2;
#else
	u8		channel_msb:2;
	u8		pkt_cnt:2;
	u8		page_num:4;
#endif
	u8		pwdb_a;
#if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE)
	u8		gain_a: 6;
	u8		rsvd_0: 1;
	u8		trsw: 1;
#else
	u8		trsw: 1;
	u8		rsvd_0: 1;
	u8		gain_a: 6;
#endif

#if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE)
	u8		agc_table_b:4;
	u8		agc_table_c:4;
#else
	u8		agc_table_c:4;
	u8		agc_table_b:4;
#endif

	/* DW1 : Offset 4 */
#if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE)
	u8		rsvd_1: 4;
	u8		agc_table_d: 4;
#else
	u8		agc_table_d: 4;
	u8		rsvd_1: 4;
#endif
#if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE)
	u8		l_rxsc: 4;
	u8		agc_table_a: 4;
#else
	u8		agc_table_a: 4;
	u8		l_rxsc: 4;
#endif
	u8		channel;
#if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE)
	u8		band:2;
	u8		rsvd_2_1: 1;
	u8		hw_antsw_occur_keep_cck:1;
	u8		gnt_bt_keep_cck:1;
	u8		rsvd_2_2:3;
#else
	u8		rsvd_2_2:3;
	u8		gnt_bt_keep_cck:1;
	u8		hw_antsw_occur_keep_cck:1;
	u8		rsvd_2_1: 1;
	u8		band:2;
#endif

	/* DW2 : Offset 8 */
	u16		length;
#if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE)
	u8		antidx_a: 4;
	u8		antidx_b: 4;
	u8		antidx_c: 4;
	u8		antidx_d: 4;
#else
	u8		antidx_b: 4;
	u8		antidx_a: 4;
	u8		antidx_d: 4;
	u8		antidx_c: 4;
#endif

	/* DW3 : Offset 12 */
	u8		signal_quality;
#if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE)
	u8		vga_a:5;
	u8		lna_l_a:3;
	u8		bb_power_a:6;
	u8		rsvd_3_1:1;
	u8		lna_h_a:1;
#else
	u8		lna_l_a:3;
	u8		vga_a:5;
	u8		lna_h_a:1;
	u8		rsvd_3_1:1;
	u8		bb_power_a:6;
#endif
	u8		rsvd_3_2;

	/* DW4 : Offset 16 */
	u8		pwdb_b;
#if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE)
	u8		vga_b:5;
	u8		lna_l_b:3;
	u8		bb_power_b:6;
	u8		rsvd_4_1:1;
	u8		lna_h_b:1;
	u8		gain_b: 6;
	u8		rsvd_4_2:2;
#else
	u8		lna_l_b:3;
	u8		vga_b:5;
	u8		lna_h_b:1;
	u8		rsvd_4_1:1;
	u8		bb_power_b:6;
	u8		rsvd_4_2:2;
	u8		gain_b: 6;
#endif

	/* DW5 : Offset 20 */
	u8		pwdb_c;
#if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE)
	u8		vga_c:5;
	u8		lna_l_c:3;
	u8		bb_power_c:6;
	u8		rsvd_5_1:1;
	u8		lna_h_c:1;
	u8		gain_c: 6;
	u8		rsvd_5_2:2;
#else
	u8		lna_l_c:3;
	u8		vga_c:5;
	u8		lna_h_c:1;
	u8		rsvd_5_1:1;
	u8		bb_power_c:6;
	u8		rsvd_5_2:2;
	u8		gain_c: 6;
#endif

	/* DW6 : Offset 24 */
	u8		pwdb_d;
#if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE)
	u8		vga_d:5;
	u8		lna_l_d:3;
	u8		bb_power_d:6;
	u8		rsvd_6_1:1;
	u8		lna_h_d:1;
	u8		gain_d: 6;
	u8		rsvd_6_2:2;
#else
	u8		lna_l_d:3;
	u8		vga_d:5;
	u8		lna_h_d:1;
	u8		rsvd_6_1:1;
	u8		bb_power_d:6;
	u8		rsvd_6_2:2;
	u8		gain_d: 6;
#endif
};

__PACK struct _phy_status_rpt_jaguar3_type1 {
	/* DW0 : Offset 0 */
#if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE)
	u8		page_num:4;
	u8		pkt_cnt:2;
	u8		channel_pri_msb:2;
#else
	u8		channel_pri_msb:2;
	u8		pkt_cnt:2;
	u8		page_num:4;
#endif
	u8		pwdb_a;
	u8		pwdb_b;
	u8		pwdb_c;

	/* DW1 : Offset 4 */
	u8		pwdb_d;
#if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE)
	u8		l_rxsc: 4;
	u8		ht_rxsc: 4;
#else
	u8		ht_rxsc: 4;
	u8		l_rxsc: 4;
#endif
	u8		channel_pri_lsb;
#if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE)
	u8		band: 2;
	u8		rsvd_0: 2;
	u8		gnt_bt: 1;
	u8		ldpc: 1;
	u8		stbc: 1;
	u8		beamformed: 1;
#else
	u8		beamformed: 1;
	u8		stbc: 1;
	u8		ldpc: 1;
	u8		gnt_bt: 1;
	u8		rsvd_0: 2;
	u8		band: 2;
#endif

	/* DW2 : Offset 8 */
	u8		channel_sec_lsb;
#if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE)
	u8		channel_sec_msb:2;
	u8		rsvd_1: 2;
	u8		hw_antsw_occur_a:1;
	u8		hw_antsw_occur_b:1;
	u8		hw_antsw_occur_c:1;
	u8		hw_antsw_occur_d:1;
#else
	u8		hw_antsw_occur_d:1;
	u8		hw_antsw_occur_c:1;
	u8		hw_antsw_occur_b:1;
	u8		hw_antsw_occur_a:1;
	u8		rsvd_1: 2;
	u8		channel_sec_msb:2;

#endif
#if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE)
	u8		antidx_a: 4;
	u8		antidx_b: 4;
	u8		antidx_c: 4;
	u8		antidx_d: 4;
#else
	u8		antidx_b: 4;
	u8		antidx_a: 4;
	u8		antidx_d: 4;
	u8		antidx_c: 4;
#endif

	/* DW3 : Offset 12 */
	u8		paid;
#if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE)
	u8		paid_msb: 1;
	u8		gid: 6;
	u8		rsvd_3: 1;
#else
	u8		rsvd_3: 1;
	u8		gid: 6;
	u8		paid_msb: 1;
#endif
	u16		rsvd_4;
/*
	u8		rsvd_4;
#if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE)
	u8		rsvd_5: 6;
	u8		rf_mode: 2;
#else
	u8		rf_mode: 2;
	u8		rsvd_5: 6;
#endif
*/
	/* DW4 */
	s8		rxevm[4];			/* s(8,1) */

	/* DW5 */
	s8		cfo_tail[4];			/* s(8,7) */

	/* DW6 */
	s8		rxsnr[4];			/* s(8,1) */
};
__PACK struct _phy_status_rpt_jaguar3_type2_type3 {
	/* Type2 is primary channel & type3 is secondary channel */
	/* DW0 ane DW1 */
#if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE)
	u8		page_num:4;
	u8		pkt_cnt:2;
	u8		channel_msb:2;
#else
	u8		channel_msb:2;
	u8		pkt_cnt:2;
	u8		page_num:4;
#endif
	u8		pwdb[4];
#if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE)
	u8		l_rxsc: 4;
	u8		ht_rxsc: 4;
#else
	u8		ht_rxsc: 4;
	u8		l_rxsc: 4;
#endif
	u8		channel_lsb;
#if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE)
	u8		band: 2;
	u8		rsvd_0: 1;
	u8		hw_antsw_occu: 1;
	u8		gnt_bt: 1;
	u8		ldpc: 1;
	u8		stbc: 1;
	u8		beamformed: 1;
#else
	u8		beamformed: 1;
	u8		stbc: 1;
	u8		ldpc: 1;
	u8		gnt_bt: 1;
	u8		hw_antsw_occu: 1;
	u8		rsvd_0: 1;
	u8		band: 2;
#endif

	/* DW2 */
#if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE)
	u8		shift_l_map: 6;
	u8		rsvd_1: 2;
#else
	u8		rsvd_1: 2;
	u8		shift_l_map: 6;
#endif
	s8		pwed_th;	/* dynamic energy threshold S(8,2) */
#if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE)
	u8		agc_table_a: 4;
	u8		agc_table_b: 4;
	u8		agc_table_c: 4;
	u8		agc_table_d: 4;
#else
	u8		agc_table_b: 4;
	u8		agc_table_a: 4;
	u8		agc_table_d: 4;
	u8		agc_table_c: 4;
#endif

	/* DW3 ~ DW6*/
	u8		cnt_cca2agc_rdy; /* Time(ns) = cnt_cca2agc_ready*25 */
#if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE)
	u8		mp_gain_a: 6;
	u8		mp_gain_b_lsb: 2;
	u8		mp_gain_b_msb: 4;
	u8		mp_gain_c_lsb: 4;
	u8		mp_gain_c_msb: 2;
	u8		avg_noise_pwr_lsb: 4;
	u8		rsvd_3:2;
	/* u8		r_rfmod:2; */
	u8		mp_gain_d: 6;
	u8		is_freq_select_fading: 1;
	u8		rsvd_2: 1;
	u8		aagc_step_a: 2;
	u8		aagc_step_b: 2;
	u8		aagc_step_c: 2;
	u8		aagc_step_d: 2;
#else
	u8		mp_gain_b_lsb: 2;
	u8		mp_gain_a: 6;
	u8		mp_gain_c_lsb: 4;
	u8		mp_gain_b_msb: 4;
	u8		rsvd_3:2;
	/* u8		r_rfmod:2; */
	u8		avg_noise_pwr_lsb: 4;
	u8		mp_gain_c_msb: 2;
	u8		rsvd_2: 1;
	u8		is_freq_select_fading: 1;
	u8		mp_gain_d: 6;
	u8		aagc_step_d: 2;
	u8		aagc_step_c: 2;
	u8		aagc_step_b: 2;
	u8		aagc_step_a: 2;
#endif
	u8		ht_aagc_gain[4];
	u8		dagc_gain[4];
#if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE)
	u8		counter: 6;
	u8		syn_count_lsb: 2;
	u8		syn_count_msb: 3;
	u8		avg_noise_pwr_msb:5;
#else
	u8		syn_count_lsb: 2;
	u8		counter: 6;
	u8		avg_noise_pwr_msb:5;
	u8		syn_count_msb: 3;
#endif
};

__PACK struct _phy_status_rpt_jaguar3_type4 {
	/* smart antenna */
	/* DW0 ane DW1 */
#if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE)
	u8		page_num:4;
	u8		pkt_cnt:2;
	u8		channel_msb:2;
#else
	u8		channel_msb:2;
	u8		pkt_cnt:2;
	u8		page_num:4;
#endif
	u8		pwdb[4];
#if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE)
	u8		l_rxsc: 4;
	u8		ht_rxsc: 4;
#else
	u8		ht_rxsc: 4;
	u8		l_rxsc: 4;
#endif
	u8		channel_lsb;
#if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE)
	u8		band: 2;
	u8		rsvd_0: 1;
	u8		hw_antsw_occu: 1;
	u8		gnt_bt: 1;
	u8		ldpc: 1;
	u8		stbc: 1;
	u8		beamformed: 1;
#else
	u8		beamformed: 1;
	u8		stbc: 1;
	u8		ldpc: 1;
	u8		gnt_bt: 1;
	u8		hw_antsw_occu: 1;
	u8		rsvd_0: 1;
	u8		band: 2;
#endif

	/* DW2 ~ DW3 */
#if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE)
	u8		bad_tone_cnt_min_eign_0:4;
	u8		bad_tone_cnt_cn_excess_0:4;
	u8		training_done_a:1;
	u8		training_done_b:1;
	u8		training_done_c:1;
	u8		training_done_d:1;
	u8		hw_antsw_occur_a:1;
	u8		hw_antsw_occur_b:1;
	u8		hw_antsw_occur_c:1;
	u8		hw_antsw_occur_d:1;
	u8		antidx_a: 4;
	u8		antidx_b: 4;
	u8		antidx_c: 4;
	u8		antidx_d: 4;
#else
	u8		bad_tone_cnt_cn_excess_0:4;
	u8		bad_tone_cnt_min_eign_0:4;
	u8		hw_antsw_occur_d:1;
	u8		hw_antsw_occur_c:1;
	u8		hw_antsw_occur_b:1;
	u8		hw_antsw_occur_a:1;
	u8		training_done_d:1;
	u8		training_done_c:1;
	u8		training_done_b:1;
	u8		training_done_a:1;
	u8		antidx_b: 4;
	u8		antidx_a: 4;
	u8		antidx_d: 4;
	u8		antidx_c: 4;
#endif
	u8		tx_pkt_cnt;
#if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE)
	u8		bad_tone_cnt_min_eign_1:4;
	u8		bad_tone_cnt_cn_excess_1:4;
	u8		avg_cond_num_0:7;
	u8		avg_cond_num_1_lsb:1;
	u8		avg_cond_num_1_msb:6;
	u8		rsvd_1:2;
#else
	u8		bad_tone_cnt_cn_excess_1:4;
	u8		bad_tone_cnt_min_eign_1:4;
	u8		avg_cond_num_1_lsb:1;
	u8		avg_cond_num_0:7;
	u8		rsvd_1:2;
	u8		avg_cond_num_1_msb:6;
#endif

	/* DW4 */
	s8		rxevm[4];			/* s(8,1) */

	/* DW5 */
	u8		eigenvalue[4];			/* eigenvalue or eigenvalue of seg0 (in dB) */

	/* DW6 */
	s8		rxsnr[4];			/* s(8,1) */
};

__PACK struct _phy_status_rpt_jaguar2_type5 {
	/* smart antenna */
	/* DW0 ane DW1 */
#if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE)
	u8		page_num:4;
	u8		pkt_cnt:2;
	u8		channel_msb:2;
#else
	u8		channel_msb:2;
	u8		pkt_cnt:2;
	u8		page_num:4;
#endif
	u8		pwdb[4];
#if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE)
	u8		l_rxsc: 4;
	u8		ht_rxsc: 4;
#else
	u8		ht_rxsc: 4;
	u8		l_rxsc: 4;
#endif
	u8		channel_lsb;
#if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE)
	u8		band: 2;
	u8		rsvd_0: 1;
	u8		hw_antsw_occu: 1;
	u8		gnt_bt: 1;
	u8		ldpc: 1;
	u8		stbc: 1;
	u8		beamformed: 1;
#else
	u8		beamformed: 1;
	u8		stbc: 1;
	u8		ldpc: 1;
	u8		gnt_bt: 1;
	u8		hw_antsw_occu: 1;
	u8		rsvd_0: 1;
	u8		band: 2;
#endif
	/* DW2 ~ DW5 */
	u8		rsvd_1;
#if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE)
	u8		rsvd_2:4;
	u8		hw_antsw_occur_a:1;
	u8		hw_antsw_occur_b:1;
	u8		hw_antsw_occur_c:1;
	u8		hw_antsw_occur_d:1;
	u8		antidx_a: 4;
	u8		antidx_b: 4;
	u8		antidx_c: 4;
	u8		antidx_d: 4;
#else
	u8		hw_antsw_occur_d:1;
	u8		hw_antsw_occur_c:1;
	u8		hw_antsw_occur_b:1;
	u8		hw_antsw_occur_a:1;
	u8		rsvd_2:4;
	u8		antidx_b: 4;
	u8		antidx_a: 4;
	u8		antidx_d: 4;
	u8		antidx_c: 4;
#endif
	u8		tx_pkt_cnt;
#if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE)
	u8		inf_pos_0_A_flg:1;
	u8		inf_pos_1_A_flg:1;
	u8		inf_pos_0_B_flg:1;
	u8		inf_pos_1_B_flg:1;
	u8		inf_pos_0_C_flg:1;
	u8		inf_pos_1_C_flg:1;
	u8		inf_pos_0_D_flg:1;
	u8		inf_pos_1_D_flg:1;
#else
	u8		inf_pos_1_D_flg:1;
	u8		inf_pos_0_D_flg:1;
	u8		inf_pos_1_C_flg:1;
	u8		inf_pos_0_C_flg:1;
	u8		inf_pos_1_B_flg:1;
	u8		inf_pos_0_B_flg:1;
	u8		inf_pos_1_A_flg:1;
	u8		inf_pos_0_A_flg:1;
#endif
	u8		rsvd_3;
	u8		rsvd_4;
	u8		inf_pos_0_a;
	u8		inf_pos_1_a;
	u8		inf_pos_0_b;
	u8		inf_pos_1_b;
	u8		inf_pos_0_c;
	u8		inf_pos_1_c;
	u8		inf_pos_0_d;
	u8		inf_pos_1_d;
};
#endif /*#if (ODM_PHY_STATUS_NEW_TYPE_SUPPORT == 1)*/

#if (ODM_PHY_STATUS_NEW_TYPE_SUPPORT == 1)

void phydm_rx_phy_status_new_type(void *p_dm_void, u8 *p_phy_status,
				  struct phydm_perpkt_info_struct *p_pktinfo,
				  struct phydm_phyinfo_struct *p_phy_info);

boolean phydm_query_is_mu_api(struct PHY_DM_STRUCT *p_phydm, u8 ppdu_idx,
			      u8 *p_data_rate, u8 *p_gid);
#endif

void phydm_reset_phystatus_avg(struct PHY_DM_STRUCT *p_dm);

void phydm_reset_phystatus_statistic(struct PHY_DM_STRUCT *p_dm);

void phydm_reset_rssi_for_dm(struct PHY_DM_STRUCT *p_dm, u8 station_id);

void phydm_get_cck_rssi_table_from_reg(struct PHY_DM_STRUCT *p_dm);

u8 phydm_rate_to_num_ss(struct PHY_DM_STRUCT *p_dm, u8 data_rate);

#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
void
phydm_normal_driver_rx_sniffer(
	struct PHY_DM_STRUCT			*p_dm,
	u8				*p_desc,
	PRT_RFD_STATUS		p_rt_rfd_status,
	u8				*p_drv_info,
	u8				phy_status
);
#endif

#if (DM_ODM_SUPPORT_TYPE == ODM_CE)
s32 phydm_signal_scale_mapping(struct PHY_DM_STRUCT *p_dm, s32 curr_sig);
#endif

void odm_phy_status_query(struct PHY_DM_STRUCT *p_dm,
			  struct phydm_phyinfo_struct *p_phy_info,
			  u8 *p_phy_status,
			  struct phydm_perpkt_info_struct *p_pktinfo);

void phydm_rx_phy_status_init(void *p_dm_void);

#endif /*#ifndef	__HALHWOUTSRC_H__*/
