#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; }