__IRAM static void swNic_isrTxRecycle(int32 flag) { struct rtl_pktHdr * pPkthdr; int32 rxDescIdx; struct rtl_mBuf *pMbuf; /* Continuously check OWN bit of descriptors */ while ( ((TxPkthdrRing[txDoneIndex] & DESC_OWNED_BIT) == DESC_RISC_OWNED)&&txDoneIndex!=txFreeIndex){ /* Fetch pkthdr */ pPkthdr = (struct rtl_pktHdr *) (TxPkthdrRing[txDoneIndex] & ~(DESC_OWNED_BIT | DESC_WRAP)); pMbuf = pPkthdr->ph_mbuf; rxDescIdx = pPkthdr->ph_rxdesc; if((rxDescIdx<0)||(rxDescIdx>=totalRxPkthdr)){ int32 retval; pPkthdr->ph_rxdesc=-1; //was sent directly from protocol stack. retval= mBuf_driverFreeMbufChain(pPkthdr->ph_mbuf); }else { swNic_isrReclaim(rxDescIdx, pPkthdr,pMbuf); } TxPkthdrRing[txDoneIndex]&=DESC_WRAP; //this clears Tx desc but keeps WRAP bit if any. wmb(); txPktCounter++; /* Increment index */ if ( ++txDoneIndex == totalTxPkthdr ) txDoneIndex = 0; } if(rxRunoutIdx>=0&&(RxPkthdrRing[rxRunoutIdx] & DESC_OWNED_BIT) != DESC_RISC_OWNED){ rxPkthdrRunoutSolved++; rxRunoutIdx=-1; } }
int32 rtl865x_MPTest_Process(struct rtl_pktHdr* pPkt) { ether_addr_t vlanGMAC; uint16 * uint16Ptr, regAddr; uint32 regData; rtl8651_tblDrv_vlanTable_t *local_vlanp; uint8 *m_data; local_vlanp = &DrvTbl.vlan[pPkt->ph_vlanIdx]; rtl8651_getVlanMacAddress( local_vlanp->vid, &vlanGMAC, NULL );/* Get VLAN Gateway MAC address*/ m_data = pPkt->ph_mbuf->m_data; switch(m_data[14]) { case 1: /* Realtek Remote Control Protocol */ switch(m_data[15]) { case 0:/* Station to switch Hello */ uint16Ptr = (uint16 *)m_data; if(uint16Ptr[0] == 0xFFFF && uint16Ptr[1] == 0xFFFF && uint16Ptr[2] == 0xFFFF) { struct rtl_mBuf *dup_mBuf; dup_mBuf = mBuf_dupPacket( pPkt->ph_mbuf, MBUF_DONTWAIT ); /* Reply to the source */ memcpy(&m_data[0], &m_data[6], 6); memcpy(&m_data[6], &vlanGMAC, 6); m_data[15] |= 0x80; m_data[18] = pPkt->ph_portlist; m_data[19] = 0; memset(&m_data[20], 0, 12); SET_UINT16_LITTLE_ENDIAN_UNALIGNED(0x8650, &m_data[26]); pPkt->ph_portlist = 1<<pPkt->ph_portlist; if(_rtl8651_fwdEngineSend(TRUE, (void*)pPkt, local_vlanp->vid,-1)!=SUCCESS) mBuf_driverFreeMbufChain(pPkt->ph_mbuf); /* Broadcast to downstream stations*/ if (dup_mBuf) { dup_mBuf->m_pkthdr->ph_portlist = local_vlanp->memberPortUpStatus & ~(1<<dup_mBuf->m_pkthdr->ph_portlist); if(_rtl8651_fwdEngineSend(TRUE, (void*)dup_mBuf->m_pkthdr, local_vlanp->vid,-1)!=SUCCESS) mBuf_driverFreeMbufChain(dup_mBuf); } } else if (memcmp(m_data, &vlanGMAC, 6) == 0) { memcpy(&m_data[0], &m_data[6], 6); memcpy(&m_data[6], &vlanGMAC, 6); m_data[15] |= 0x80; m_data[18] = pPkt->ph_portlist; m_data[19] = 0; memset(&m_data[20], 0, 12); SET_UINT16_LITTLE_ENDIAN_UNALIGNED(0x8650, &m_data[26]); pPkt->ph_portlist = 1<<pPkt->ph_portlist; if(_rtl8651_fwdEngineSend(TRUE, (void*)pPkt, local_vlanp->vid,-1)!=SUCCESS) mBuf_driverFreeMbufChain(pPkt->ph_mbuf); } else { pPkt->ph_portlist = rtl8651_asicL2DAlookup(m_data) & ~(1<<pPkt->ph_portlist); if(_rtl8651_fwdEngineSend(TRUE, (void*)pPkt, local_vlanp->vid,-1)!=SUCCESS) mBuf_driverFreeMbufChain(pPkt->ph_mbuf); } break; case 1: /* Station to switch Get */ if (memcmp(m_data, &vlanGMAC, 6) == 0) { memcpy(&m_data[0], &m_data[6], 6); memcpy(&m_data[6], &vlanGMAC, 6); m_data[15] |= 0x80; regAddr = GET_UINT16_LITTLE_ENDIAN_UNALIGNED(&m_data[18]); switch((regAddr>>12)&0xF) { case 0x0: if(regAddr < RRCP_REG_SIZE) SET_UINT32_LITTLE_ENDIAN_UNALIGNED(rtl8651_drvRealtekProtocolRegisters[regAddr], &m_data[20]); else SET_UINT32_LITTLE_ENDIAN_UNALIGNED(0xFFFFFFFF, &m_data[20]); break; case 0x1: switch((regAddr>>10)&0x3) { case 0: if((regAddr&0x3FF)<sizeof(bdinfo_t)/4) { if(rtl8651_drvRealtekProtocolFlashMirrored==0) { uint32 i; flashdrv_read((void *)rtl8651_drvRealtekProtocolFlashMirror, (void *)flashdrv_getBoardInfoAddr(), sizeof(bdinfo_t)); printk("\nRead from flash address %x\n", flashdrv_getBoardInfoAddr()); for(i=0; i<sizeof(bdinfo_t)/4; i++) { printk("%08x ", rtl8651_drvRealtekProtocolFlashMirror[i]); if(i%4==3 || i==(sizeof(bdinfo_t)/4-1)) printk("\n"); } rtl8651_drvRealtekProtocolFlashMirrored = 1; } SET_UINT32_LITTLE_ENDIAN_UNALIGNED(rtl8651_drvRealtekProtocolFlashMirror[regAddr&0x3FF], &m_data[20]); } else SET_UINT32_LITTLE_ENDIAN_UNALIGNED(0xFFFFFFFF, &m_data[20]); break; case 1: if((regAddr&0x3FF)<sizeof(bdinfo_t)/4) SET_UINT32_LITTLE_ENDIAN_UNALIGNED(rtl8651_drvRealtekProtocolPseudoFlash[regAddr&0x3FF], &m_data[20]); else SET_UINT32_LITTLE_ENDIAN_UNALIGNED(0xFFFFFFFF, &m_data[20]); break; case 2: if((regAddr&0x3FF)==0) SET_UINT32_LITTLE_ENDIAN_UNALIGNED(rtl8651_drvRealtekProtocolGatewayConfigureControlRegister, &m_data[20]); else SET_UINT32_LITTLE_ENDIAN_UNALIGNED(0xFFFFFFFF, &m_data[20]); break; default: SET_UINT32_LITTLE_ENDIAN_UNALIGNED(0xFFFFFFFF, &m_data[20]); break; } break; default: SET_UINT32_LITTLE_ENDIAN_UNALIGNED(0xFFFFFFFF, &m_data[20]); break; } pPkt->ph_portlist = 1<<pPkt->ph_portlist; if(_rtl8651_fwdEngineSend(TRUE, (void*)pPkt, local_vlanp->vid,-1)!=SUCCESS) mBuf_driverFreeMbufChain(pPkt->ph_mbuf); } else { pPkt->ph_portlist = rtl8651_asicL2DAlookup(m_data) & ~(1<<pPkt->ph_portlist); if(_rtl8651_fwdEngineSend(TRUE, (void*)pPkt, local_vlanp->vid,-1)!=SUCCESS) mBuf_driverFreeMbufChain(pPkt->ph_mbuf); } break; case 2: /* Station to switch Set */ if (memcmp(m_data, &vlanGMAC, 6) == 0) { regAddr = GET_UINT16_LITTLE_ENDIAN_UNALIGNED(&m_data[18]); regData = GET_UINT32_LITTLE_ENDIAN_UNALIGNED(&m_data[20]); switch((regAddr>>12)&0xF) { case 0x0: if(regAddr < RRCP_REG_SIZE) { /* regAddr value changed from 0 to 1 means starting testing item, value meaning: 0: Reset, 1: (0->1) means start self diagnostic, 2: on-going, 3: Finished and Success, 4: Finished and Failed */ if(rtl8651_drvRealtekProtocolRegisters[regAddr] == 0 && regData == 1) { rtl8651_drvRealtekProtocolRegisters[regAddr] = 3; } else rtl8651_drvRealtekProtocolRegisters[regAddr] = regData; } break; case 0x1: switch((regAddr>>10)&0x3) { case 0://Do nothing since the flash cannot set flash data directly break; case 1: if((regAddr&0x3FF)<sizeof(bdinfo_t)/4) rtl8651_drvRealtekProtocolPseudoFlash[regAddr&0x3FF] = regData; break; case 2: if((regAddr&0x3FF)==0) { if(rtl8651_drvRealtekProtocolGatewayConfigureControlRegister == 0 && regData == 1) { flashdrv_read((void *)rtl8651_drvRealtekProtocolPseudoFlash, (void *)flashdrv_getBoardInfoAddr(), sizeof(bdinfo_t)); rtl8651_drvRealtekProtocolGatewayConfigureControlRegister = 3; } else if (rtl8651_drvRealtekProtocolGatewayConfigureControlRegister == 5 && regData == 6) { uint32 i; flashdrv_updateImg((void *)rtl8651_drvRealtekProtocolPseudoFlash, (void *)flashdrv_getBoardInfoAddr(), sizeof(bdinfo_t)); rtl8651_drvRealtekProtocolGatewayConfigureControlRegister = 8; printk("\nConfigure to flash address %x\n", flashdrv_getBoardInfoAddr()); for(i=0; i<sizeof(bdinfo_t)/4; i++) { printk("%08x ", rtl8651_drvRealtekProtocolPseudoFlash[i]); if(i%4==3 || i==(sizeof(bdinfo_t)/4-1)) printk("\n"); } flashdrv_read((void *)rtl8651_drvRealtekProtocolFlashMirror, (void *)flashdrv_getBoardInfoAddr(), sizeof(bdinfo_t)); rtl8651_drvRealtekProtocolFlashMirrored = 1; printk("\nRead from flash address %x\n", flashdrv_getBoardInfoAddr()); for(i=0; i<sizeof(bdinfo_t)/4; i++) { printk("%08x ", rtl8651_drvRealtekProtocolFlashMirror[i]); if(i%4==3 || i==(sizeof(bdinfo_t)/4-1)) printk("\n"); } } else rtl8651_drvRealtekProtocolGatewayConfigureControlRegister = regData; } break; } break; } mBuf_driverFreeMbufChain(pPkt->ph_mbuf); } else {