#include <net/rtl/rtl_types.h>
#include <net/rtl/rtl_glue.h>
//#include "assert.h"
#include "asicRegs.h"
//#include "rtl_utils.h"
//#include "rtl8651_debug.h"
#include "rtl865xC_hs.h"
#include <linux/delay.h>
#include <linux/in6.h>


int32 rtl865xC_convertHsbToSoftware( hsb_t* rawHsb, hsb_param_t* hsb )
{
	/* bit-to-bit mapping */
	hsb->spa = rawHsb->spa;
	hsb->trigpkt = rawHsb->trigpkt;
#if defined(CONFIG_RTL_8685S_HWNAT)
	hsb->ipv4_opt =rawHsb->ipv4_opt;
 	hsb->len = rawHsb->len;
#else
	 hsb->len = rawHsb->len;
#endif
	hsb->vid = rawHsb->vid;
	hsb->tagif = rawHsb->tagif;
	hsb->pppoeif = rawHsb->pppoeif;
	hsb->sip = rawHsb->sip29_0 | (rawHsb->sip31_30<<30);
	hsb->sprt = rawHsb->sprt;
	hsb->dip = rawHsb->dip13_0 | (rawHsb->dip31_14<<14);
	hsb->dprt = rawHsb->dprt13_0 | (rawHsb->dprt15_14<<14);
	hsb->ipptl = rawHsb->ipptl;
	hsb->ipfg = rawHsb->ipfg;
	hsb->iptos = rawHsb->iptos;
	hsb->tcpfg = rawHsb->tcpfg;
	hsb->type = rawHsb->type;
	hsb->patmatch = rawHsb->patmatch;
	hsb->ethtype = rawHsb->ethtype;
#if 1 /* Since the endian is reversed, we must translate it. */
	hsb->da[5] = rawHsb->da14_0;
	hsb->da[4] = (rawHsb->da14_0>>8) | (rawHsb->da46_15<<7);
	hsb->da[3] = rawHsb->da46_15>>1;
	hsb->da[2] = rawHsb->da46_15>>9;
	hsb->da[1] = rawHsb->da46_15>>17;
	hsb->da[0] = (rawHsb->da46_15>>25) | (rawHsb->da47_47<<7);
	hsb->sa[5] = rawHsb->sa30_0;
	hsb->sa[4] = rawHsb->sa30_0>>8;
	hsb->sa[3] = rawHsb->sa30_0>>16;
	hsb->sa[2] = (rawHsb->sa30_0>>24) | (rawHsb->sa47_31<<7);
	hsb->sa[1] = rawHsb->sa47_31>>1;
	hsb->sa[0] = rawHsb->sa47_31>>9;
#else
	hsb->da[0] = rawHsb->da14_0;
	hsb->da[1] = (rawHsb->da14_0>>8) | (rawHsb->da46_15<<7);
	hsb->da[2] = rawHsb->da46_15>>1;
	hsb->da[3] = rawHsb->da46_15>>9;
	hsb->da[4] = rawHsb->da46_15>>17;
	hsb->da[5] = (rawHsb->da46_15>>25) | (rawHsb->da47_47<<7);
	hsb->sa[0] = rawHsb->sa30_0;
	hsb->sa[1] = rawHsb->sa30_0>>8;
	hsb->sa[2] = rawHsb->sa30_0>>16;
	hsb->sa[3] = (rawHsb->sa30_0>>24) | (rawHsb->sa47_31<<7);
	hsb->sa[4] = rawHsb->sa47_31>>1;
	hsb->sa[5] = rawHsb->sa47_31>>9;
#endif
	hsb->hiprior = rawHsb->hiprior;
	hsb->snap = rawHsb->snap;
	hsb->udpnocs = rawHsb->udpnocs;
	hsb->ttlst = rawHsb->ttlst;
	hsb->dirtx = rawHsb->dirtx;
	hsb->l3csok = rawHsb->l3csok;
	hsb->l4csok = rawHsb->l4csok;
	hsb->ipfo0_n = rawHsb->ipfo0_n;
	hsb->llcothr = rawHsb->llcothr;
	hsb->urlmch = rawHsb->urlmch;
	hsb->extspa = rawHsb->extspa;
	hsb->extl2 = rawHsb->extl2;
	hsb->linkid = rawHsb->linkid;
	hsb->pppoeid = rawHsb->pppoeid;


#if defined(CONFIG_RTL_8685S_HWNAT)

	hsb->cpuTagIf =rawHsb->cpuTagIf;
	hsb->v6Ext =rawHsb->v6Ext;
	hsb->v6fragmOffs =rawHsb->v6fragmOffs;
	hsb->v6Flag =rawHsb->v6Flag;
	hsb->qpri =rawHsb->qpri0_0 | (rawHsb->qpri2_1 <<1);
	hsb->ptpPkt = rawHsb->ptpPkt;
	hsb->ptpVer = rawHsb->ptpVer;
	hsb->ptpTyp = rawHsb->ptpTyp;
	hsb->ipVerFirst =rawHsb->ipVerFirst;

//	struct in6_addr v6Sip;	//big-endian
	hsb->v6Dip.s6_addr32[3] = (rawHsb->v6Dip18_0) | (rawHsb->v6Dip50_19<<19);
	hsb->v6Dip.s6_addr32[2] = (rawHsb->v6Dip50_19 >> 13) |  (rawHsb->v6Dip82_51 << 19);
	hsb->v6Dip.s6_addr32[1] = (rawHsb->v6Dip82_51 >> 13)  |  (rawHsb->v6Dip114_83 << 19);
	hsb->v6Dip.s6_addr32[0] = (rawHsb->v6Dip114_83 >>13)  |  (rawHsb->v6Dip127_115 <<19);

//	printk("%s  %x %x %x %x \n",__func__,hsb->v6Dip.s6_addr32[3],hsb->v6Dip.s6_addr32[2],hsb->v6Dip.s6_addr32[1],hsb->v6Dip.s6_addr32[0]);
	

	hsb->v6Sip.s6_addr32[3] = (rawHsb->v6Sip18_0) | (rawHsb->v6Sip50_19<<19);
	hsb->v6Sip.s6_addr32[2] = (rawHsb->v6Sip50_19 >> 13) |  (rawHsb->v6Sip82_51 << 19);
	hsb->v6Sip.s6_addr32[1] = (rawHsb->v6Sip82_51 >> 13)  |  (rawHsb->v6Sip114_83 << 19);
	hsb->v6Sip.s6_addr32[0] = (rawHsb->v6Sip114_83 >>13)  |  (rawHsb->v6Sip127_115 <<19);

	hsb->v6HopLimit =rawHsb->v6HopLimit;
	hsb->v6TafficClass =rawHsb->v6TafficClass;
	hsb->v6FlowLabel =rawHsb->v6FlowLabel2_0 | (rawHsb->v6FlowLabel19_3 <<3);
	hsb->v6NxtHdr =rawHsb->v6NxtHdr;
	hsb->v4PktHdr =rawHsb->v4PktHdr;
	hsb->v6PktHdr = rawHsb->v6PktHdr;
	hsb->innerIpLen =rawHsb->innerIpLen4_0 | (rawHsb->innerIpLen15_5 << 5);
	hsb->tunnelLen =rawHsb->tunnelLen;
	if(IS_AFTER_RL6405){
	hsb->l3ChecksumOfflad = rawHsb->l3ChecksumOfflad;
	hsb->l4ChecksumOfflad = rawHsb->l4ChecksumOfflad;
	hsb->l3Checksum = rawHsb->l3Checksum4_0 | (rawHsb->l3Checksum15_5 <<5);
	hsb->l4Checksum = rawHsb->l4Checksum ;
	hsb->innIpHeaderLen = rawHsb->innIpHeaderLen4_0 | (rawHsb->innIpHeaderLen13_5<<5) ;
	hsb->swredPktFlag = rawHsb->swredPktFlag;
	hsb->swredPktType = rawHsb->swredPktType;
	}



#endif /* CONFIG_RTL_8685S_HWNAT */


	return SUCCESS;
}


int32 rtl865xC_virtualMacGetHsb( hsb_param_t* hsb )
{
	hsb_t rawHsb;
	int32 ret = SUCCESS;

	{ /* Word-Access */
		uint32 *pSrc, *pDst;
		uint32 i;

		/* We must assert structure size is the times of 4-bytes. */
		if ( (sizeof(rawHsb)%4) != 0 ) RTL_BUG( "sizeof(rawHsb) is not the times of 4-bytes." );

		//rtlglue_printf("==== HSB ====\n");
		pSrc = (uint32*)HSB_BASE;
		pDst = (uint32*)&rawHsb;
		for( i = 0; i < sizeof(rawHsb); i+=4 )
		{
			*pDst = READ_MEM32((uint32)pSrc);
			//rtlglue_printf("[%08X] %08x\n",(uint32)pSrc,*pDst);
			pSrc++;
			pDst++;
		}
	}

	rtl865xC_convertHsbToSoftware( &rawHsb, hsb );
	return ret;
}

int32 rtl865xC_convertHsaToSoftware( hsa_t* rawHsa, hsa_param_t* hsa )
{
	/* bit-to-bit mapping */
#if 1 /* Since the endian is reversed, we must translate it. */
	hsa->nhmac[5] = rawHsa->nhmac0;
	hsa->nhmac[4] = rawHsa->nhmac1;
	hsa->nhmac[3] = rawHsa->nhmac2;
	hsa->nhmac[2] = rawHsa->nhmac3;
	hsa->nhmac[1] = rawHsa->nhmac4;
	hsa->nhmac[0] = rawHsa->nhmac5;
#else
	hsa->nhmac[0] = rawHsa->nhmac0;
	hsa->nhmac[1] = rawHsa->nhmac1;
	hsa->nhmac[2] = rawHsa->nhmac2;
	hsa->nhmac[3] = rawHsa->nhmac3;
	hsa->nhmac[4] = rawHsa->nhmac4;
	hsa->nhmac[5] = rawHsa->nhmac5;
#endif
	hsa->trip = rawHsa->trip15_0 | (rawHsa->trip31_16<<16);
	hsa->port = rawHsa->port;
	hsa->l3csdt = rawHsa->l3csdt;
	hsa->l4csdt = rawHsa->l4csdt;
	hsa->egif = rawHsa->egif;
	hsa->l2tr = rawHsa->l2tr;
	hsa->l34tr = rawHsa->l34tr;
	hsa->dirtxo = rawHsa->dirtxo;
	hsa->typeo = rawHsa->typeo;
	hsa->snapo = rawHsa->snapo;
	hsa->rxtag = rawHsa->rxtag;
	hsa->dvid = rawHsa->dvid;
	hsa->pppoeifo = rawHsa->pppoeifo;
	hsa->pppidx = rawHsa->pppidx;

#if defined(CONFIG_RTL_8685S_HWNAT)
	hsa->leno = rawHsa->leno5_0 | (rawHsa->leno13_6 <<6);
	hsa->mirrort = rawHsa->mirrort;
#else /* CONFIG_RTL_8685S_HWNAT */
	hsa->leno = rawHsa->leno5_0|(rawHsa->leno14_6<<6);
#endif /* CONFIG_RTL_8685S_HWNAT */

	hsa->l3csoko = rawHsa->l3csoko;
	hsa->l4csoko = rawHsa->l4csoko;
	hsa->frag = rawHsa->frag;
	hsa->lastfrag = rawHsa->lastfrag;
	hsa->ipmcastr = rawHsa->ipmcastr;
	hsa->svid = rawHsa->svid;

#if defined(CONFIG_RTL_8685S_HWNAT)
	hsa->v6RdDf =rawHsa->v6RdDf;
#else /* CONFIG_RTL_8685S_HWNAT */
	hsa->fragpkt = rawHsa->fragpkt;
#endif /* CONFIG_RTL_8685S_HWNAT */

	hsa->ttl_1if = rawHsa->ttl_1if4_0|(rawHsa->ttl_1if5_5<<5)|(rawHsa->ttl_1if8_6<<6);
	hsa->dpc = rawHsa->dpc;

#if defined(CONFIG_RTL_8685S_HWNAT)
	hsa->spao = rawHsa->spao;
	hsa->v4First =rawHsa->v4First;
#else /* CONFIG_RTL_8685S_HWNAT */
	hsa->spao = rawHsa->spao;
#endif /* CONFIG_RTL_8685S_HWNAT */

	hsa->hwfwrd = rawHsa->hwfwrd;
	hsa->dpext = rawHsa->dpext;
	hsa->spaext = rawHsa->spaext;
	hsa->why2cpu = rawHsa->why2cpu13_0|(rawHsa->why2cpu15_14<<14);
	hsa->spcp = rawHsa->spcp;
	hsa->dvtag = rawHsa->dvtag;
	hsa->difid = rawHsa->difid;
	hsa->linkid = rawHsa->linkid;
	hsa->siptos = rawHsa->siptos;
	hsa->dp = rawHsa->dp6_0;
	hsa->priority = rawHsa->priority;
	
#if defined(CONFIG_RTL_8685S_HWNAT)
	hsa->cpuTag = rawHsa->cpuTag;
	hsa->ptpPkt = rawHsa->ptpPkt;
	hsa->ptpV2 = rawHsa->ptpV2;
	hsa->ptpType = rawHsa->ptpType;
	hsa->routeModeDstPort= rawHsa->routeModeDstPort;
	hsa->dPri= rawHsa->dPri;
	hsa->ipMdf= rawHsa->ipMdf;

	hsa->sip.s6_addr32[3] = rawHsa->sip11_0 | (rawHsa->sip43_12 << 12);
	hsa->sip.s6_addr32[2] = (rawHsa->sip43_12 >> 20) | (rawHsa->sip75_44 << 12);
	hsa->sip.s6_addr32[1] = (rawHsa->sip75_44 >> 20) | (rawHsa->sip107_76 << 12);
	hsa->sip.s6_addr32[0] = (rawHsa->sip107_76 >> 20) | (rawHsa->sip127_108 <<12);

	hsa->dip.s6_addr32[3] = rawHsa->dip11_0 | (rawHsa->dip43_12 << 12);
	hsa->dip.s6_addr32[2] = (rawHsa->dip43_12 >> 20) | (rawHsa->dip75_44 << 12);
	hsa->dip.s6_addr32[1] = (rawHsa->dip75_44 >> 20) | (rawHsa->dip107_76 << 12);
	hsa->dip.s6_addr32[0] = (rawHsa->dip107_76 >> 20) | (rawHsa->dip127_108 <<12);

	hsa->ipLen= rawHsa->ipLen11_0 | (rawHsa->ipLen15_12 << 12);
	hsa->v4Id= rawHsa->v4Id;
	hsa->v4pkt= rawHsa->v4pkt;
	hsa->v6pkt= rawHsa->v6pkt;
	hsa->tunnelLen= (rawHsa->tunnelLen13_10<<10 | rawHsa->tunnelLen9_0);
	hsa->v6Multicast= rawHsa->v6Multicast;
	hsa->addipPri= rawHsa->addipPri;
	if(IS_AFTER_RL6405)
	{
		hsa->l3ChecksumOfflad = rawHsa->l3ChecksumOffload;
		hsa->l4ChecksumOfflad = rawHsa->l4ChecksumOffload;
		hsa->innIpHeaderLen = rawHsa->innIpHeaderLen;
		hsa->swredPktFlag = rawHsa->swredPktFlag;
		hsa->swredPktType = rawHsa->swredPktType;
	}

	#if defined(CONFIG_RTL_HW_NAPT_4KENTRY)
	hsa->frc_dscp4rmk	= rawHsa->frc_dscp4rmk;
	hsa->naptdscp		= (rawHsa->naptdscp_5_4<<4)|rawHsa->naptdscp_3_0;
	#endif
	
#endif /* CONFIG_RTL_8685S_HWNAT */
	
	return SUCCESS;
}

int32 rtl865xC_virtualMacGetHsa( hsa_param_t* hsa )
{
	hsa_t rawHsa;
	int32 ret = SUCCESS;

	{ /* Word-Access */
		uint32 *pSrc, *pDst;
		uint32 i;

		/* We must assert structure size is the times of 4-bytes. */
		if ( (sizeof(rawHsa)%4) != 0 ) RTL_BUG( "sizeof(rawHsa) is not the times of 4-bytes." );

		//rtlglue_printf("==== HSA ====\n");
		pSrc = (uint32*)HSA_BASE;
		pDst = (uint32*)&rawHsa;
		for( i = 0; i < sizeof(rawHsa); i+=4 )
		{
			*pDst = READ_MEM32((uint32)pSrc);
			//rtlglue_printf("[%08X] %08x\n",(uint32)pSrc,*pDst);
			pSrc++;
			pDst++;
		}
	}

	rtl865xC_convertHsaToSoftware( &rawHsa, hsa );
	return ret;
}

int32 rtl865xC_virtualMacSetHsb( hsb_t rawHsb )
{
	int32 retval = SUCCESS;	
	uint32 *pSrc, *pDst;
	uint32 i;

	WRITE_MEM32( TMCR, READ_MEM32( TMCR) | ENHSBTESTMODE ); /* Before reading HSABUSY, we must enable test mode. */


	/* We must assert structure size is the times of 4-bytes. */
	if ( (sizeof(rawHsb)%4) != 0 ) 
		printk( "sizeof(rawHsb) is not the times of 4-bytes." );

	pSrc = (uint32*)&rawHsb;
	pDst = (uint32*)HSB_BASE;
	for( i = 0; i < sizeof(rawHsb); i+=4 )
	{
		WRITE_MEM32((uint32)pDst, (*pSrc));
		pSrc++;
		pDst++;
	}	

	WRITE_MEM32( TMCR, READ_MEM32( TMCR ) & ~HSB_RDY );
	WRITE_MEM32( TMCR, READ_MEM32( TMCR ) | HSB_RDY ); /* Once HSB_RDY is set, FPGA and model code start ALE. */

	mdelay( 100 ); /* delay for ALE to process. */		
	while( (READ_MEM32(TMCR)&HSABUSY) == HSABUSY ); /* Wait until HSB has became HAS. */
	
	return retval;
}





int32 rtl865xC_convertHsbToAsic( hsb_param_t* hsb, hsb_t* rawHsb )
{
	/* bit-to-bit mapping */
	memset(rawHsb,0x0,sizeof(hsb_t));
	rawHsb->spa = hsb->spa;
	rawHsb->trigpkt = hsb->trigpkt;
#if defined(CONFIG_RTL_8685S_HWNAT)
	rawHsb->ipv4_opt = hsb->ipv4_opt;
	rawHsb->len = hsb->len;
	rawHsb->resvw0=0;
#else
	rawHsb->len = hsb->len;
	rawHsb->resvw0=0;
#endif
	rawHsb->vid = hsb->vid;
	rawHsb->tagif = hsb->tagif;
	rawHsb->pppoeif = hsb->pppoeif;
	rawHsb->sip29_0 = hsb->sip&0x3fffffff;
	rawHsb->sip31_30 = hsb->sip>>30;
	rawHsb->sprt = hsb->sprt;
	rawHsb->dip13_0 = hsb->dip&0x3fff;
	rawHsb->dip31_14 = hsb->dip>>14;
	rawHsb->dprt13_0 = hsb->dprt&0x3fff;
	rawHsb->dprt15_14 = hsb->dprt>>14;
	rawHsb->ipptl = hsb->ipptl;
	rawHsb->ipfg = hsb->ipfg;
	rawHsb->iptos = hsb->iptos;
	rawHsb->tcpfg = hsb->tcpfg;
	rawHsb->type = hsb->type;
	rawHsb->patmatch = hsb->patmatch;
	rawHsb->ethtype = hsb->ethtype;
#if 1 /* Since the endian is reversed, we must translate it. */
	rawHsb->da14_0 = hsb->da[5]|(hsb->da[4]<<8);
	rawHsb->da46_15 = (hsb->da[4]>>7)|(hsb->da[3]<<1)|(hsb->da[2]<<9)|(hsb->da[1]<<17)|(hsb->da[0]<<25);
	rawHsb->da47_47 = hsb->da[0]>>7;
	rawHsb->sa30_0 = hsb->sa[5]|(hsb->sa[4]<<8)|(hsb->sa[3]<<16)|(hsb->sa[2]<<24);
	rawHsb->sa47_31 = (hsb->sa[2]>>7)|(hsb->sa[1]<<1)|(hsb->sa[0]<<9);
#else
	rawHsb->da14_0 = hsb->da[0]|(hsb->da[1]<<8);
	rawHsb->da46_15 = (hsb->da[1]>>7)|(hsb->da[2]<<1)|(hsb->da[3]<<9)|(hsb->da[4]<<17)|(hsb->da[5]<<25);
	rawHsb->da47_47 = hsb->da[5]>>7;
	rawHsb->sa30_0 = hsb->sa[0]|(hsb->sa[1]<<8)|(hsb->sa[2]<<16)|(hsb->sa[3]<<24);
	rawHsb->sa47_31 = (hsb->sa[3]>>7)|(hsb->sa[4]<<1)|(hsb->sa[5]<<9);
#endif
	rawHsb->hiprior = hsb->hiprior;
	rawHsb->snap = hsb->snap;
	rawHsb->udpnocs = hsb->udpnocs;
	rawHsb->ttlst = hsb->ttlst;
	rawHsb->dirtx = hsb->dirtx;
	rawHsb->l3csok = hsb->l3csok;
	rawHsb->l4csok = hsb->l4csok;
	rawHsb->ipfo0_n = hsb->ipfo0_n;
	rawHsb->llcothr = hsb->llcothr;
	rawHsb->urlmch = hsb->urlmch;
	rawHsb->extspa = hsb->extspa;
	rawHsb->extl2 = hsb->extl2;
	rawHsb->linkid = hsb->linkid;
	rawHsb->pppoeid = hsb->pppoeid;
	

#if defined(CONFIG_RTL_8685S_HWNAT)
	rawHsb->cpuTagIf = hsb->cpuTagIf;
	rawHsb->v6Ext =hsb->v6Ext;
	rawHsb->v6fragmOffs=hsb->v6fragmOffs;
	rawHsb->v6Flag =hsb->v6Flag;
	rawHsb->resvw9=0;
	rawHsb->qpri0_0=hsb->qpri;
	rawHsb->qpri2_1=(hsb->qpri) >>1;
	rawHsb->ptpPkt =hsb->ptpPkt;
	rawHsb->ptpVer =hsb->ptpVer;
	rawHsb->ptpTyp =hsb->ptpTyp;
	rawHsb->ipVerFirst =hsb->ipVerFirst;

	rawHsb->v6Sip18_0 =    hsb->v6Sip.s6_addr32[3]&0x7ffff;
	rawHsb->v6Sip50_19 = ((hsb->v6Sip.s6_addr32[2]&0x7ffff)<<13) | ((hsb->v6Sip.s6_addr32[3]>>19)&0x1fff);
	rawHsb->v6Sip82_51 = ((hsb->v6Sip.s6_addr32[1]&0x7ffff)<<13) | ((hsb->v6Sip.s6_addr32[2]>>19)&0x1fff);
	rawHsb->v6Sip114_83 =((hsb->v6Sip.s6_addr32[0]&0x7ffff)<<13) | ((hsb->v6Sip.s6_addr32[1]>>19)&0x1fff);
	rawHsb->v6Sip127_115 = 										   ((hsb->v6Sip.s6_addr32[0]>>19)&0x1fff);

	rawHsb->v6Dip18_0	=  hsb->v6Dip.s6_addr32[3]&0x7ffff;
	rawHsb->v6Dip50_19	=((hsb->v6Dip.s6_addr32[2]&0x7ffff)<<13)  |((hsb->v6Dip.s6_addr32[3] >>19)&0x1fff);
	rawHsb->v6Dip82_51	=((hsb->v6Dip.s6_addr32[1]&0x7ffff)<<13)  |((hsb->v6Dip.s6_addr32[2] >>19)&0x1fff);
	rawHsb->v6Dip114_83 =((hsb->v6Dip.s6_addr32[0]&0x7ffff)<<13)  |((hsb->v6Dip.s6_addr32[1] >>19)&0x1fff);
	rawHsb->v6Dip127_115=										   ((hsb->v6Dip.s6_addr32[0] >>19)&0x1fff);


	rawHsb->v6HopLimit 	=hsb->v6HopLimit;
	rawHsb->v6TafficClass=hsb->v6TafficClass;

	rawHsb->v6FlowLabel2_0 =hsb->v6FlowLabel;
	rawHsb->v6FlowLabel19_3=hsb->v6FlowLabel>>3;
	
	rawHsb->v6NxtHdr=hsb->v6NxtHdr;
	rawHsb->v4PktHdr=hsb->v4PktHdr;
	rawHsb->v6PktHdr=hsb->v6PktHdr;
	rawHsb->tunnelLen=hsb->tunnelLen;

	if(IS_AFTER_RL6405)
	{
		rawHsb->innerIpLen4_0 =hsb->innerIpLen;
		rawHsb->innerIpLen15_5=hsb->innerIpLen>>5;
		rawHsb->l3ChecksumOfflad = hsb->l3ChecksumOfflad;
		rawHsb->l4ChecksumOfflad = hsb->l4ChecksumOfflad;
		rawHsb->l3Checksum4_0 = hsb->l3Checksum;
		rawHsb->l3Checksum15_5 = hsb->l3Checksum >>5;
		rawHsb->l4Checksum = hsb->l4Checksum;
		rawHsb->innIpHeaderLen4_0 = hsb->innIpHeaderLen ;
		rawHsb->innIpHeaderLen13_5 = hsb->innIpHeaderLen >>5;
		rawHsb->swredPktFlag = hsb->swredPktFlag;
		rawHsb->swredPktType = hsb->swredPktType;
	}

#endif


	
	return SUCCESS;
}



int32 rtl865xC_convertHsaToAsic( hsa_param_t* hsa, hsa_t* rawHsa )
{
	/* bit-to-bit mapping */
#if 1 /* Since the endian is reversed, we must translate it. */
	rawHsa->nhmac0 = hsa->nhmac[5];
	rawHsa->nhmac1 = hsa->nhmac[4];
	rawHsa->nhmac2 = hsa->nhmac[3];
	rawHsa->nhmac3 = hsa->nhmac[2];
	rawHsa->nhmac4 = hsa->nhmac[1];
	rawHsa->nhmac5 = hsa->nhmac[0];
#else
	rawHsa->nhmac0 = hsa->nhmac[0];
	rawHsa->nhmac1 = hsa->nhmac[1];
	rawHsa->nhmac2 = hsa->nhmac[2];
	rawHsa->nhmac3 = hsa->nhmac[3];
	rawHsa->nhmac4 = hsa->nhmac[4];
	rawHsa->nhmac5 = hsa->nhmac[5];
#endif
	rawHsa->trip15_0 = hsa->trip&0xffff;
	rawHsa->trip31_16 = hsa->trip>>16;
	rawHsa->port = hsa->port;
	rawHsa->l3csdt = hsa->l3csdt;
	rawHsa->l4csdt = hsa->l4csdt;
	rawHsa->egif = hsa->egif;
	rawHsa->l2tr = hsa->l2tr;
	rawHsa->l34tr = hsa->l34tr;
	rawHsa->dirtxo = hsa->dirtxo;
	rawHsa->typeo = hsa->typeo;
	rawHsa->snapo = hsa->snapo;
	rawHsa->rxtag = hsa->rxtag;
	rawHsa->dvid = hsa->dvid;
	rawHsa->pppoeifo = hsa->pppoeifo;
	rawHsa->pppidx = hsa->pppidx;
	rawHsa->leno5_0 = hsa->leno&0x3f;
#if defined(CONFIG_RTL_8685S_HWNAT)
	rawHsa->leno13_6 = hsa->leno>>6;
	rawHsa->mirrort = hsa->mirrort;
#else
	rawHsa->leno14_6 = hsa->leno>>6;
#endif


	rawHsa->l3csoko = hsa->l3csoko;
	rawHsa->l4csoko = hsa->l4csoko;
	rawHsa->frag = hsa->frag;
	rawHsa->lastfrag = hsa->lastfrag;
	rawHsa->ipmcastr = hsa->ipmcastr;
	rawHsa->svid = hsa->svid;
/*error Boyce 2013-12-24*/
#if defined(CONFIG_RTL_8685S_HWNAT)
	rawHsa->v6RdDf = hsa->v6RdDf;
#else
	rawHsa->fragpkt = hsa->fragpkt;
#endif

	rawHsa->ttl_1if4_0 = hsa->ttl_1if&0x1f;
	rawHsa->ttl_1if5_5 = hsa->ttl_1if>>5;
	rawHsa->ttl_1if8_6 = hsa->ttl_1if>>6;
	rawHsa->dpc = hsa->dpc;
#if defined(CONFIG_RTL_8685S_HWNAT)
	rawHsa->spao = hsa->spao;
	rawHsa->v4First = hsa->v4First;
#else
	rawHsa->spao = hsa->spao;
#endif

	rawHsa->hwfwrd = hsa->hwfwrd;
	rawHsa->dpext = hsa->dpext;
	rawHsa->spaext = hsa->spaext;
	rawHsa->why2cpu13_0 = hsa->why2cpu&0x3fff;
	rawHsa->why2cpu15_14 = hsa->why2cpu>>14;
	rawHsa->spcp = hsa->spcp;
	rawHsa->dvtag = hsa->dvtag;
	rawHsa->difid = hsa->difid;
	rawHsa->linkid = hsa->linkid;
	rawHsa->siptos = hsa->siptos;
	rawHsa->dp6_0 = hsa->dp;
	rawHsa->priority = hsa->priority;
#if defined(CONFIG_RTL_8685S_HWNAT)
	rawHsa->cpuTag = hsa->cpuTag;
	rawHsa->ptpPkt = hsa->ptpPkt;
	rawHsa->ptpV2 = hsa->ptpV2;
	rawHsa->ptpType = hsa->ptpType;
	rawHsa->routeModeDstPort = hsa->routeModeDstPort;
	rawHsa->dPri =  hsa->dPri;
	rawHsa->ipMdf = hsa->ipMdf;
	
	rawHsa->sip11_0 =     hsa->sip.s6_addr32[3]&0xfff;
	rawHsa->sip43_12 =	((hsa->sip.s6_addr32[2]&0xfff)<<20) |  ((hsa->sip.s6_addr32[3]>>12)&0xfffff) ;
	rawHsa->sip75_44 =	((hsa->sip.s6_addr32[1]&0xfff)<<20) |  ((hsa->sip.s6_addr32[2]>>12)&0xfffff) ;
	rawHsa->sip107_76=	((hsa->sip.s6_addr32[0]&0xfff)<<20) |  ((hsa->sip.s6_addr32[1]>>12)&0xfffff) ;
	rawHsa->sip127_108=									  	 ((hsa->sip.s6_addr32[0]>>12)&0xfffff) ;
	
	rawHsa->dip11_0 =     hsa->dip.s6_addr32[3]&0xfff;
	rawHsa->dip43_12 =	((hsa->dip.s6_addr32[2]&0xfff)<<20) |  ((hsa->dip.s6_addr32[3]>>12)&0xfffff) ;
	rawHsa->dip75_44 =	((hsa->dip.s6_addr32[1]&0xfff)<<20) |  ((hsa->dip.s6_addr32[2]>>12)&0xfffff) ;
	rawHsa->dip107_76 =	((hsa->dip.s6_addr32[0]&0xfff)<<20) |  ((hsa->dip.s6_addr32[1]>>12)&0xfffff) ;
	rawHsa->dip127_108 =							 			((hsa->dip.s6_addr32[0]>>12)&0xfffff) ;
	
	rawHsa->ipLen11_0 = hsa->ipLen;
	rawHsa->ipLen15_12 =hsa->ipLen>>12;
	rawHsa->v4Id = hsa->v4Id;
	rawHsa->v4pkt = hsa->v4pkt;
	rawHsa->v6pkt = hsa->v6pkt;
	rawHsa->tunnelLen9_0 = hsa->tunnelLen;
	rawHsa->tunnelLen13_10 =hsa->tunnelLen >>10;
	rawHsa->v6Multicast = hsa->v6Multicast;
	rawHsa->addipPri = hsa ->addipPri;
	if(IS_AFTER_RL6405)
	{
		rawHsa->l3ChecksumOffload = hsa->l3ChecksumOfflad;
		rawHsa->l4ChecksumOffload = hsa->l4ChecksumOfflad;
		rawHsa->innIpHeaderLen = hsa->innIpHeaderLen;
		rawHsa->swredPktFlag = hsa->swredPktFlag;
		rawHsa->swredPktType = hsa->swredPktType;
	}

#endif

	
	return SUCCESS;
}