/*
 *	Abstract: header file for rtl819x_swNic.c
 *
 *	Author:
 *		Joey Lin, <joey.lin@realtek.com>
 *
 *	Copyright (c) 2015 Realtek Semiconductor Corp.
 *
 *	This program is free software; you can redistribute it and/or
 *	modify it under the terms of the GNU General Public License
 *	as published by the Free Software Foundation; either version
 *	2 of the License, or (at your option) any later version.
 */


#ifndef RTL819X_SWNIC_H
#define	RTL819X_SWNIC_H

#define	NEW_NIC_MAX_RX_DESC_RING    6
#define	NEW_NIC_MAX_TX_DESC_RING    4

// DESCRIPTOR BIT MAP
/*TX/RX share */

#define DescOwn			(1 << 0) /* Descriptor is owned by NIC */
#define RingEnd			(1 << 1) /* End of descriptor ring */
#define LastFrag		(1 << 2) /* Final segment of a packet */
#define FirstFrag		(1 << 3) /* First segment of a packet */



/* Tx descriptor opts1 */

	#define TD_TYPE_OFFSET			29	/* [31:29] 000: Ethernet, 001:PPTP, 010:IP, 011:ICMP, 100:IGMP, 101:TCP, 110:UDP, 111:IPv6 */
	#define TD_TYPE_MASK			(0x7)
	#define TD_VI_OFFSET			28	/* [28] Pkt is VLAN tagged */
	#define TD_LI_OFFSET			27	/* [27] Pkt has LLC hdr */
	#define TD_PI_OFFSET			26	/* [26] Pkt has PPPoE hdr */
	#define TD_PPPIDX_OFFSET		23	/* [25:23] Destination PPPoE Table Idx */
	#define TD_PPPIDX_MASK			(0x7)
	#define TD_PHLEN_OFFSET			6	/* [22:6] The packet length In RTL8198E; */
										/* should support up to 64K bytes for LSO, max. */
										/* normal packet size (without LSO) need follow PCR accept packet size. */
	#define TD_PHLEN_MASK			(0x1FFFF)
	#define TD_BRIDGE_OFFSET		5	/* [5] BRIDGING */
	#define TD_HWLKUP_OFFSET		4	/* [4] HWLOOKUP */
	/* { BRIDGING, HWLOOKUP }
	   2'b00: Send directly as is to the destination portlist assigned.
	   However, if any of the following offload option bits (in this Tx table) are set,
	   software should tell SwitchCore ALL protocol types enclosed in the packet via ph_proto field.

	   2'b01: Offload destination portlist resolving to SwitchCore and Do L2/Routing/NAPT,
	   based on whole packet content. SwitchCore  ignores the ph_proto field.

	   2'b10: Invalid setting.

	   2'b11: Offload destination portlist resolving to SwitchCore and Do L2 lookup(bridging) only,
	   based on DMAC given. SwitchCore ignores the ph_proto field. */
										/* [3] FirstFrag */
										/* [2] LastFrag */
										/* [1] RingEnd */
										/* [0] DescOwn */
	#define TD_BRIDGE_MASK			(1 << 5)
	#define TD_HWLKUP_MASK			(1 << 4)



/* Tx descriptor opts2 */

	#define TD_M_LEN_OFFSET			15	/* Length of actual data in associated cluster buffer for Tx */
	#define TD_M_LEN_MASK			(0x1FFFF)
	#define TD_QID_OFFSET			12	/* CPU Queue priority for direct Tx */
	#define TD_QID_MASK				(0x7)
	#define TD_PQID_OFFSET			9	/* Queue priority for direct Tx */
	#define TD_PQID_MASK			(0x7)
	#define TD_VLANTAGSET_OFFSET	0	/* [8:6] Ext port Tag mask; [5:0] port Tag mask; [4:0] physical port; Bit[5] MII port*/
	#define TD_VLANTAGSET_MASK		(0x1FF)



/* Tx descriptor opts3 */

	#define TD_PTP_PKT_OFFSET		31	/* [31] PTP packet indication */
	#define TD_PTP_TYP_OFFSET		27	/* [30:27] msg type */
	#define TD_PTP_TYP_MASK			(0xF)
	#define TD_PTP_VER_OFFSET		25	/* [26:25] PTP version, 0: 1588v1; 1: 1588v2 or 802.1as; others: reserved */
	#define TD_PTP_VER_MASK			(0x3)
	#define TD_DPRI_OFFSET			22	/* [24:22] Destination Priority */
	#define TD_DPRI_MASK			(0x7<<22)
	#define TD_PO_OFFSET			21	/* [21] 0: PPPoE header, if present, already attached */
										/* 1: Offload PPPoE header generation to SwitchCore */
	#define TD_L3CS_OFFSET			20	/* [20] 0: IP checksum calculated. Send it as is */
										/* 1: Offload IPv4 (w/wo option) checksum calculation to SwitchCore */
	#define TD_L3CS_MASK			(1<<20)
	#define TD_L4CS_OFFSET			19	/* [19] 0: TCP/UDP/ICMP checksum calculated. Send it as is */
										/* 1: Offload TCP/UDP/ICMP checksum calculation to SwitchCore */
	#define TD_L4CS_MASK			(1<<19)
	#define TD_IPV6_OFFSET			18	/* [18] IPv6 Header flag */
	#define TD_IPV6_MASK			(1<<18)	/* [18] IPv6 Header flag */
	#define TD_IPV4_OFFSET			17	/* [17] IPv4 Header flag */
	#define TD_IPV4_MASK			(1<<17)	/* [17] IPv4 Header flag */
	#define TD_IPV4_1ST_OFFSET		16	/* [16] IPv4 first header */
	#define TD_IPV4_1ST_MASK		(1<<16)	/* [16] IPv4 first header */
										/* [15] Reserved */
	#define TD_DP_EXT_OFFSET		12	/* [14:12] Destination extension port mask: */
										/* (only for CPU direct Tx & single ext. port) */
	#define TD_DP_EXT_MASK			(0x7)
	#define TD_DVLANID_OFFSET		0	/* [11:0] (1) Source VLAN ID selected for from extension port; */
									/* (2) Destination VLAN ID from CPU (really work) */
	#define TD_DVLANID_MASK			(0xFFF)


/* Tx descriptor opts4 */

	#define TD_LSO_OFFSET			31	/* [31] LSO flag indication */
	#define TD_LSO_MASK				(1<<31)
	#define TD_DP_OFFSET			24	/* [30:24] destination port mask, Bit[6]: CPU port; Bit[5-0]: Port5-Port0 */
										/* (If pkt was sent to CPU/extension port (ex: to extension port),Bits[6]=1.need refer to dp_ext[2:0] ) */
	#define TD_DP_MASK				(0x7F)
										/* [23] Reserved */
	#define TD_LINKED_OFFSET		16	/* [22:16] For WLAN WDS multiple tunnel */
	#define TD_LINKED_MASK			(0x7F)
	#define TD_IPV6_HDRLEN_OFFSET	0	/* [15:0] IPv6 header length */
	#define TD_IPV6_HDRLEN_MASK		(0xFFFF)



/* Tx descriptor opts5 */
	#define TD_EXTSPA_OFFSET		30	/* [31:30] extspa: Source extension port number: 2'd0: from CPU, */
										/* 2'd1~2'd3: from extension port numbers */
	#define TD_EXTSPA_MASK			(0x3)
	#define TD_MSS_OFFSET			16	/* [29:16] if (type==TCP), TCP segmentation size; */
										/* if (type != TCP), means MTU for UFO/IPF, and (MTU-IP header length) MUST be 8*n. */
	#define TD_MSS_MASK				(0x3FFF)
	#define TD_FLAGS_OFFSET			8	/* [15:8] {ECN/2b,URG,ACK,PSH,RST,SYN,FIN} in TCP header, if do TSO, PSH and FIN move to last segment packet */
	#define TD_FLAGS_MASK			(0xFF)
	#define TD_IPV4_HLEN_OFFSET		4	/* [7:4] header length field of IPv4 header in packet, unit: 4-byte */
	#define TD_IPV4_HLEN_MASK		(0xF)
	#define TD_TCP_HLEN_OFFSET		0	/* [3:0] header length field of TCP header in packet, unit: 4-byte */
	#define TD_TCP_HLEN_MASK		(0xF)



/* Rx descriptor opts1 */

	#define	RD_M_EXTSIZE_OFFSET		16	/* [31:16] FirstFrag */
	#define	RD_M_EXTSIZE_MASK		(0xFFFF)
										/* [15:4] Reserved */
										/* [3] FirstFrag */
										/* [2] LastFrag */
										/* [1] RingEnd */
										/* [0] DescOwn */


	
/* Rx descriptor opts2 */

	#define	RD_EXTSPA_OFFSET		24	/* [25:24] */
	#define	RD_EXTSPA_MASK			(0x3 << 24)
	#define	RD_DP_EXT_OFFSET		20
	#define	RD_DP_EXT_MASK			(0xF << 20)
	#define	RD_QID_OFFSET			17
	#define	RD_QID_MASK				(0x7 << 17)
										/* [16:14] Reserved */
	#define	RD_LEN_OFFSET			0
	#define	RD_LEN_MASK				(0x3FFF << 0)


/* Rx descriptor opts3 */

	#define	RD_TYPE_OFFSET			29	/* [31:29] */
	#define	RD_TYPE_MASK			(0x7 << 28)
	#define	RD_VO_OFFSET			28	/* [28] */
	#define	RD_LO_OFFSET			27	/* [27] */
	#define	RD_PO_OFFSET			26	/* [26] */
	#define	RD_PPPIDX_OFFSET		23	/* [25:23] */
	#define	RD_PPPIDX_MASK			(0x7 << 23)
	#define	RD_LINKID_OFFSET		16	/* [22:16] */
	#define	RD_LINKID_MASK			(0x7F << 16)
	#define	RD_REASON_OFFSET		0	/* [15:0] */
	#define	RD_REASON_MASK			(0xFFFF << 0)


/* Rx descriptor opts4 */

	#define	RD_EXT_VLANO_OFFSET		29	/* [31:29] */
	#define	RD_EXT_VLANO_MASK		(0x7 << 29)
	#define	RD_L2ACT_OFFSET			28	/* [28] */
	#define	RD_DVLANID_OFFSET		16	/* [27:16] */
	#define RD_DVLANID_MASK			(0xfff << 16)
	#define	RD_SPA_OFFSET			13	/* [15:13] */
	#define	RD_SPA_MASK				(0x7 << 13)
	#define	RD_LAST_F_OFFSET		12	/* [12] */
	#define	RD_FRAG_OFFSET			11	/* [11] */
	#define	RD_IPV4_1ST_OFFSET		10	/* [10] */
	#define	RD_IPV6_OFFSET			9	/* [9] */
	#define	RD_IPV6_MASK			(1<<9)
	#define	RD_IPV4_OFFSET			8	/* [8] */
	#define	RD_TOS_OFFSET			0	/* [7:0] */
	#define	RD_TOS_MASK				(0xFF << 0)


/* Rx descriptor opts5 */

	#define	RD_L3CSOK_OFFSET		31	/* [31] */
	#define	RD_L3CSOK_MASK			(1<<31)
	#define	RD_L4CSOK_OFFSET		30	/* [30] */
	#define	RD_L4CSOK_MASK			(1<<30)
	#define	RD_FWD_OFFSET			29	/* [29] */
	#define	RD_ORG_OFFSET			28	/* [28] */
	#define	RD_IP_MDF_OFFSET		25	/* [27:25] */
	#define	RD_IP_MDF_MASK			(0x7 << 24)
	#define	RD_VORG_OFFSET			24	/* [24] */
	#define	RD_LORG_OFFSET			23	/* [23] */
	#define	RD_PORG_OFFSET			22	/* [22] */
	#define	RD_DPRI_OFFSET			19	/* [21:19] */
	#define	RD_DPRI_MASK			(0x7 << 19)
	#define	RD_SPRI_OFFSET			16	/* [18:16] */
	#define	RD_SPRI_MASK			(0x7 << 16)
									/* [15] Reserved */
	#define	RD_EXT_TTL_OFFSET		12	/* [14:12] */
	#define	RD_EXT_TTL_MASK			(0x7 << 12)
	#define	RD_SVLANID_OFFSET		0	/* [11:0] */
	#define	RD_SVLANID_MASK			(0xFFF << 0)

struct rx_desc{
#ifdef _LITTLE_ENDIAN
	union{
		struct{
			uint32 own:1;         //0
			uint32 eor:1;         //1			
			uint32 ls:1;          //2
			uint32 fs:1;          //3
			uint32 rcdf:1;        //4
			uint32 fae:1;         //5
			uint32 rsvd:10;       //6~15	
			uint32 m_extsize:16;  //16~31	
		}bit;
		uint32 dw;
	}opts1;
	uint32 mdata;
	union{
		struct{
			uint32 len:14;     //0~13
			uint32 rsvd:3;       //14~16
			uint32 qid:3;         //17~19
			uint32 dp_ext:4;     //20~23
			uint32 extspa:2;         //24~25			
			uint32 rsvd2:6;         //26~31			
		}bit;
		uint32 dw;
	}opts2;
	union{
		struct{
			uint32 reason:16;     //0~15
			uint32 linkid:7;      //16~22
			uint32 ppp_idx:3;     //23~25
			uint32 po:1;          //26
			uint32 lo:1;          //27			
			uint32 vo:1;          //28
			uint32 type:3;        //29~31			
		}bit;
		uint32 dw;
	}opts3;
	union{
		struct{
			uint32 tos:8;         //0~7
			uint32 ipv4:1;        //8			
			uint32 ipv6:1;        //9
			uint32 ipv4_1st:1;    //10
			uint32 frag:1;        //11
			uint32 last_f:1;      //12
			uint32 spa:3;         //13~15
			uint32 dvlanid:12;    //16~27
			uint32 l2act:1;       //28
			uint32 ext_vlano:3;   //29~31						
		}bit;
		uint32 dw;
	}opts4;
	union{
		struct{
			uint32 svlanid:12;   //0~11
			uint32 ext_ttl:3;    //12~14
			uint32 rsvd:1;       //15
			uint32 spri:3;        //16~18
			uint32 dpri:3;       //19~21			
			uint32 porg:1;        //22		
			uint32 lorg:1;    //23
			uint32 vorg:1;        //24
			uint32 ip_mdf:3;      //25~27
			uint32 org:1;         //28
			uint32 fwd:1;    //29
			uint32 l4csok:1;       //30
			uint32 l3csok:1;   //31						
		}bit;
		uint32 dw;
	}opts5;
#else
	union{
		struct{
			uint32 m_extsize:16;  //16~31	
			uint32 rsvd:10;       //6~15	
			uint32 fae:1;         //5
			uint32 rcdf:1;        //4
			uint32 fs:1;          //3
			uint32 ls:1;          //2
			uint32 eor:1;         //1			
			uint32 own:1;         //0
		}bit;
		uint32 dw;
	}opts1;
	uint32 mdata;
	union{
		struct{
			uint32 rsvd2:6;         //26~31
			uint32 extspa:2;         //24~25			
			uint32 dp_ext:4;     //20~23
			uint32 qid:3;         //17~19
			uint32 rsvd:3;       //14~16
			uint32 len:14;     //0~13
		}bit;
		uint32 dw;
	}opts2;
	union{
		struct{
			uint32 type:3;        //29~31
			uint32 vo:1;          //28
			uint32 lo:1;          //27			
			uint32 po:1;          //26
			uint32 ppp_idx:3;     //23~25
			uint32 linkid:7;      //16~22
			uint32 reason:16;     //0~15
		}bit;
		uint32 dw;
	}opts3;
	union{
		struct{
			uint32 ext_vlano:3;   //29~31			
			uint32 l2act:1;       //28
			uint32 dvlanid:12;    //16~27
			uint32 spa:3;         //13~15
			uint32 last_f:1;      //12
			uint32 frag:1;        //11
			uint32 ipv4_1st:1;    //10
			uint32 ipv6:1;        //9
			uint32 ipv4:1;        //8			
			uint32 tos:8;         //0~7
		}bit;
		uint32 dw;
	}opts4;
	union{
		struct{
			uint32 l3csok:1;   //31			
			uint32 l4csok:1;       //30
			uint32 fwd:1;    //29
			uint32 org:1;         //28
			uint32 ip_mdf:3;      //25~27
			uint32 vorg:1;        //24
			uint32 lorg:1;    //23
			uint32 porg:1;        //22		
			uint32 dpri:3;       //19~21			
			uint32 spri:3;        //16~18
			uint32 rsvd:1;       //15
			uint32 ext_ttl:3;    //12~14
			uint32 svlanid:12;   //0~11
		}bit;
		uint32 dw;
	}opts5;
#endif

#define rx_own			opts1.bit.own
#define rx_eor			opts1.bit.eor
#define rx_ls			opts1.bit.ls
#define rx_fs			opts1.bit.fs
#define rx_rcdf			opts1.bit.rcdf
#define rx_fae			opts1.bit.fae
#define rx_m_extsize	opts1.bit.m_extsize
#define rx_len			opts2.bit.len
#define rx_qid			opts2.bit.qid
#define rx_dp_ext		opts2.bit.dp_ext
#define rx_extspa		opts2.bit.extspa
#define rx_reason		opts3.bit.reason
#define rx_linkid		opts3.bit.linkid
#define rx_ppp_idx		opts3.bit.ppp_idx
#define rx_po			opts3.bit.po
#define rx_lo			opts3.bit.lo
#define rx_vo			opts3.bit.vo
#define rx_type			opts3.bit.type
#define rx_tos			opts4.bit.tos
#define rx_ipv4			opts4.bit.ipv4
#define rx_ipv6			opts4.bit.ipv6
#define rx_ipv4_1st		opts4.bit.ipv4_1st
#define rx_frag			opts4.bit.frag
#define rx_last_f		opts4.bit.last_f
#define rx_spa			opts4.bit.spa
#define rx_dvlanid		opts4.bit.dvlanid
#define rx_l2act		opts4.bit.l2act
#define rx_ext_vlano	opts4.bit.ext_vlano
#define rx_svlanid		opts5.bit.svlanid
#define rx_ext_ttl		opts5.bit.ext_ttl
#define rx_spri			opts5.bit.spri
#define rx_dpri			opts5.bit.dpri
#define rx_porg			opts5.bit.porg
#define rx_lorg			opts5.bit.lorg
#define rx_vorg			opts5.bit.vorg
#define rx_ip_mdf		opts5.bit.ip_mdf
#define rx_org			opts5.bit.org
#define rx_fwd			opts5.bit.fwd
#define rx_l4csok		opts5.bit.l4csok
#define rx_l3csok		opts5.bit.l3csok

};


//ask alan :linked[6:0]	For WLAN WDS multiple tunnel.

struct tx_desc{
#ifdef _LITTLE_ENDIAN
	union{
		struct{
			uint32 own:1;         //0
			uint32 eor:1;         //1			
			uint32 ls:1;          //2
			uint32 fs:1;          //3
			uint32 hwlkup:1;      //4
			uint32 bridge:1;      //5
			uint32 ph_len:17;//6~22	
			uint32 pppidx:3;      //23~25	
			uint32 pi:1;          //26
			uint32 li:1;          //27	
			uint32 vi:1;          //28
			uint32 type:3;        //29~31					
		}bit;
		uint32 dw;//double word
	}opts1;
	uint32 mdata;
	union{
		struct{
			uint32 vlantag:9;     //0~8
			uint32 pqid:3;        //9~11
			uint32 qid:3;         //12~14
			uint32 mlen:17;       //15~31			
		}bit;
		uint32 dw;//double word
	}opts2;
	union{	
		struct{
			uint32 dvlanid:12;     //0~11
			uint32 dp_ext:3;       //12~14
			uint32 rsvd:1;         //15
			uint32 ipv4_1st:1;     //16
			uint32 ipv4:1;         //17			
			uint32 ipv6:1;         //18
			uint32 l4cs:1;         //19
			uint32 l3cs:1;         //20
			uint32 po:1;           //21
			uint32 dpri:3;         //22~24
			uint32 ptp_ver:2;      //25~26
			uint32 ptp_type:4;     //27~30			
			uint32 ptp_pkt:1;      //31						
		}bit;
		uint32 dw;//double word
	}opts3;
	union{
		struct{
			uint32 ipv6_hdrlen:16; //0~15
			uint32 linkid:7;       //16~22
			uint32 rsvd:1;          //23
			uint32 dp:7;           //24~30
			uint32 lso:1;         //31						
		}bit;
		uint32 dw;
	}opts4;
	union{
		struct{
			uint32 tcp_hdrlen:4;   //0~3
			uint32 ipv4_hdrlen:4;  //4~7
			uint32 flags:8;        //8~15
			uint32 mss:14;         //16~29
			uint32 extspa:2;       //30~31						
		}bit;
		uint32 dw;
	}opts5;
#else
	union{
		struct{
			uint32 type:3;        //29~31			
			uint32 vi:1;          //28
			uint32 li:1;          //27	
			uint32 pi:1;          //26
			uint32 pppidx:3;      //23~25	
			uint32 ph_len:17;//6~22	
			uint32 bridge:1;      //5
			uint32 hwlkup:1;      //4
			uint32 fs:1;          //3
			uint32 ls:1;          //2
			uint32 eor:1;         //1			
			uint32 own:1;         //0
		}bit;
		uint32 dw;//double word
	}opts1;
	uint32 mdata;
	union{
		struct{
			uint32 mlen:17;       //15~31
			uint32 qid:3;         //12~14
			uint32 pqid:3;        //9~11
			uint32 vlantag:9;     //0~8
		}bit;
		uint32 dw;//double word
	}opts2;
	union{	
		struct{
			uint32 ptp_pkt:1;      //31			
			uint32 ptp_type:4;     //27~30			
			uint32 ptp_ver:2;      //25~26
			uint32 dpri:3;         //22~24
			uint32 po:1;           //21
			uint32 l3cs:1;         //20
			uint32 l4cs:1;         //19
			uint32 ipv6:1;         //18
			uint32 ipv4:1;         //17			
			uint32 ipv4_1st:1;     //16
			uint32 rsvd:1;         //15
			uint32 dp_ext:3;       //12~14
			uint32 dvlanid:12;     //0~11
		}bit;
		uint32 dw;//double word
	}opts3;
	union{
		struct{
			uint32 lso:1;         //31			
			uint32 dp:7;           //24~30
			uint32 rsvd:1;          //23
			uint32 linkid:7;       //16~22
			uint32 ipv6_hdrlen:16; //0~15
		}bit;
		uint32 dw;
	}opts4;
	union{
		struct{
			uint32 extspa:2;       //30~31			
			uint32 mss:14;         //16~29
			uint32 flags:8;        //8~15
			uint32 ipv4_hdrlen:4;  //4~7
			uint32 tcp_hdrlen:4;   //0~3
		}bit;
		uint32 dw;
	}opts5;
#endif

#define tx_own			opts1.bit.own
#define tx_eor			opts1.bit.eor
#define tx_ls			opts1.bit.ls
#define tx_fs			opts1.bit.fs 
#define tx_hwlkup		opts1.bit.hwlkup
#define tx_bridge		opts1.bit.bridge
#define tx_ph_len		opts1.bit.ph_len
#define tx_pppidx		opts1.bit.pppidx
#define tx_pi			opts1.bit.pi
#define tx_li			opts1.bit.li
#define tx_vi			opts1.bit.vi
#define tx_proto_type	opts1.bit.type
#define tx_vlantag		opts2.bit.vlantag
#define tx_pqid			opts2.bit.pqid
#define tx_qid			opts2.bit.qid
#define tx_mlen			opts2.bit.mlen
#define tx_dvlanid		opts3.bit.dvlanid
#define tx_dp_ext		opts3.bit.dp_ext
#define tx_ipv4_1st		opts3.bit.ipv4_1st 
#define tx_ipv4			opts3.bit.ipv4
#define tx_ipv6			opts3.bit.ipv6
#define tx_l4cs			opts3.bit.l4cs
#define tx_l3cs			opts3.bit.l3cs
#define tx_po			opts3.bit.po
#define tx_dpri			opts3.bit.dpri
#define tx_ptp_ver		opts3.bit.ptp_ver
#define tx_ptp_type		opts3.bit.ptp_type
#define tx_ptp_pkt		opts3.bit.ptp_pkt 
#define tx_ipv6_hdrlen	opts4.bit.ipv6_hdrlen
#define tx_linkid		opts4.bit.linkid
#define tx_dp			opts4.bit.dp
#define tx_lso			opts4.bit.lso
#define tx_tcp_hdrlen	opts5.bit.tcp_hdrlen
#define tx_ipv4_hdrlen	opts5.bit.ipv4_hdrlen 
#define tx_flags_		opts5.bit.flags
#define tx_mss			opts5.bit.mss  
#define tx_extspa		opts5.bit.extspa

};

typedef struct dma_tx_desc {
	uint32		opts1;
	uint32		addr;
	uint32		opts2;
	uint32		opts3;
	uint32		opts4;
	uint32		opts5;
}DMA_TX_DESC;

typedef struct dma_rx_desc {
	uint32		opts1;
	uint32		addr;
	uint32		opts2;
	uint32		opts3;	
	uint32		opts4;
	uint32		opts5;
}DMA_RX_DESC;

#define IS_SWITCH_NORMAL_DESC() ((REG32(CPUICR1) & CF_PKT_HDR_TYPE_MASK) == TX_PKTHDR_8198C_DEF)

int32 New_swNic_init(uint32 userNeedRxPkthdrRingCnt[RTL865X_SWNIC_RXRING_HW_PKTDESC],
                 uint32 userNeedTxPkthdrRingCnt[RTL865X_SWNIC_TXRING_HW_PKTDESC],
                 uint32 clusterSize);
int32 New_swNic_send(void *skb, void * output, uint32 len,rtl_nicTx_info *nicTx);
int32 New_swNic_txDone(int idx);
void New_swNic_freeRxBuf(void);
void New_dumpTxRing(struct seq_file *s);
void New_dumpRxRing(struct seq_file *s);

extern uint32  size_of_cluster;

#endif