24static int SmapDmaTransfer(
volatile u8 *smap_regbase,
void *buffer,
unsigned int size,
int direction)
26 unsigned int NumBlocks;
33 if ((NumBlocks = size >> 6) > 0) {
34 if (SpdDmaTransfer(1, buffer, NumBlocks << 16 | 0x10, direction) >= 0) {
35 result = NumBlocks << 6;
44static inline void CopyFromFIFO(
volatile u8 *smap_regbase,
void *buffer,
unsigned int length, u16 RxBdPtr)
52 SMAP_REG16(SMAP_R_RXFIFO_RD_PTR) = RxBdPtr;
54 result = SmapDmaTransfer(smap_regbase, buffer, length, DMAC_TO_MEM);
56 for (i = result; (
unsigned int)i < length; i += 4) {
57 ((u32 *)buffer)[i / 4] = SMAP_REG32(SMAP_R_RXFIFO_DATA);
61static inline void CopyToFIFO(
volatile u8 *smap_regbase,
const void *buffer,
unsigned int length)
69 result = SmapDmaTransfer(smap_regbase, (
void *)buffer, length, DMAC_FROM_MEM);
71 for (i = result; (
unsigned int)i < length; i += 4) {
72 SMAP_REG32(SMAP_R_TXFIFO_DATA) = ((u32 *)buffer)[i / 4];
79 int NumPacketsReceived, i;
82 volatile u8 *smap_regbase;
83 u16 ctrl_stat, length, pointer, LengthRounded;
85 smap_regbase = SmapDrivPrivData->smap_regbase;
87 NumPacketsReceived = 0;
91 while (SMAP_REG8(SMAP_R_RXFIFO_FRAME_CNT) > 0) {
92 PktBdPtr = &rx_bd[SmapDrivPrivData->RxBDIndex % SMAP_BD_MAX_ENTRY];
93 ctrl_stat = PktBdPtr->ctrl_stat;
96 LengthRounded = (length + 3) & ~3;
97 pointer = PktBdPtr->pointer;
100 for (i = 0; i < 16; i++)
101 if ((ctrl_stat >> i) & 1) {
102 SmapDrivPrivData->RuntimeStats.RxErrorCount++;
103#ifdef BUILDING_SMAP_NETDEV
104 SmapDrivPrivData->RuntimeStats_NetDev.m_RxErrorVarious[i] += 1;
108 SmapDrivPrivData->RuntimeStats.RxDroppedFrameCount++;
109#ifdef BUILDING_SMAP_NETDEV
110 SmapDrivPrivData->RuntimeStats_NetDev.m_Rx_Errors += 1;
114 SmapDrivPrivData->RuntimeStats.RxFrameOverrunCount++;
115#ifdef BUILDING_SMAP_NETDEV
116 SmapDrivPrivData->RuntimeStats_NetDev.m_Rx_Over_Er += 1;
120 SmapDrivPrivData->RuntimeStats.RxFrameBadLengthCount++;
121#ifdef BUILDING_SMAP_NETDEV
122 SmapDrivPrivData->RuntimeStats_NetDev.m_Rx_Length_Er += 1;
126 SmapDrivPrivData->RuntimeStats.RxFrameBadFCSCount++;
127#ifdef BUILDING_SMAP_NETDEV
128 SmapDrivPrivData->RuntimeStats_NetDev.m_Rx_Crc_Er += 1;
132 SmapDrivPrivData->RuntimeStats.RxFrameBadAlignmentCount++;
133#ifdef BUILDING_SMAP_NETDEV
134 SmapDrivPrivData->RuntimeStats_NetDev.m_Rx_Frame_Er += 1;
139 SMAP_REG16(SMAP_R_RXFIFO_RD_PTR) = pointer + LengthRounded;
141 void *
pbuf, *payload;
143 if ((
pbuf = SMapCommonStackAllocRxPacket(SmapDrivPrivData, LengthRounded, &payload)) != NULL) {
144 CopyFromFIFO(SmapDrivPrivData->smap_regbase, payload, length, pointer);
145#ifdef BUILDING_SMAP_NETDEV
146 SmapDrivPrivData->RuntimeStats_NetDev.m_Rx_Packets += 1;
147 SmapDrivPrivData->RuntimeStats_NetDev.m_Rx_Bytes += length;
148 if ((*((u8 *)payload) & 1) != 0) {
149 SmapDrivPrivData->RuntimeStats_NetDev.m_Multicast += 1;
150 if (*(u32 *)payload == (u32)-1 && *((u16 *)payload + 2) == 0xFFFF) {
151 SmapDrivPrivData->RuntimeStats_NetDev.m_Rx_Broadcast_Packets += 1;
152 SmapDrivPrivData->RuntimeStats_NetDev.m_Rx_Broadcast_Bytes += length;
154 SmapDrivPrivData->RuntimeStats_NetDev.m_Rx_Multicast_Packets += 1;
155 SmapDrivPrivData->RuntimeStats_NetDev.m_Rx_Multicast_Bytes += length;
159 SMapStackEnQRxPacket(SmapDrivPrivData,
pbuf, length);
160 NumPacketsReceived++;
162 SmapDrivPrivData->RuntimeStats.RxAllocFail++;
163#ifdef BUILDING_SMAP_NETDEV
164 SmapDrivPrivData->RuntimeStats_NetDev.m_Rx_Dropped += 1;
167 SMAP_REG16(SMAP_R_RXFIFO_RD_PTR) = pointer + LengthRounded;
171 SMAP_REG8(SMAP_R_RXFIFO_FRAME_DEC) = 0;
173 SmapDrivPrivData->RxBDIndex++;
178#ifdef BUILDING_SMAP_NETDEV
179 if (NumPacketsReceived) {
180 SetEventFlag(SmapDrivPrivData->m_devops.evfid, sceInetDevEFP_Recv);
184 return NumPacketsReceived;
195 unsigned int SizeRounded;
196 volatile u8 *smap_regbase;
199 smap_regbase = SmapDrivPrivData->smap_regbase;
204 if ((length = SMAPCommonTxPacketNext(SmapDrivPrivData, &data, &
pbuf)) < 1) {
207 SmapDrivPrivData->packetToSend =
pbuf;
209 if (SmapDrivPrivData->NumPacketsInTx >= SMAP_BD_MAX_ENTRY) {
212 SizeRounded = (length + 3) & ~3;
214 if (SmapDrivPrivData->TxBufferSpaceAvailable < SizeRounded) {
218#ifdef BUILDING_SMAP_NETDEV
219 if ((*((u8 *)data) & 1) != 0) {
220 if (*(u32 *)data == (u32)-1 && *((u16 *)data + 2) == 0xFFFF) {
221 SmapDrivPrivData->RuntimeStats_NetDev.m_Tx_Broadcast_Packets += 1;
222 SmapDrivPrivData->RuntimeStats_NetDev.m_Tx_Broadcast_Bytes += length;
224 SmapDrivPrivData->RuntimeStats_NetDev.m_Tx_Multicast_Packets += 1;
225 SmapDrivPrivData->RuntimeStats_NetDev.m_Tx_Multicast_Bytes += length;
230 BD_data_ptr = SMAP_REG16(SMAP_R_TXFIFO_WR_PTR) + SMAP_TX_BASE;
231 BD_ptr = &tx_bd[SmapDrivPrivData->TxBDIndex % SMAP_BD_MAX_ENTRY];
233 CopyToFIFO(smap_regbase, data, length);
237 BD_ptr->pointer = BD_data_ptr;
238 SMAP_REG8(SMAP_R_TXFIFO_FRAME_INC) = 0;
240 SmapDrivPrivData->TxBDIndex++;
241 SmapDrivPrivData->NumPacketsInTx++;
242 SmapDrivPrivData->TxBufferSpaceAvailable -= SizeRounded;
244#ifdef BUILDING_SMAP_NETDEV
245 SmapDrivPrivData->RuntimeStats_NetDev.m_Tx_Bytes += length;
246 SmapDrivPrivData->RuntimeStats_NetDev.m_Tx_Packets += 1;
249 SmapDrivPrivData->packetToSend = NULL;
250 SMAPCommonTxPacketDeQ(SmapDrivPrivData, &data, &
pbuf);
#define SMAP_BD_RX_OVERRUN
#define SMAP_BD_TX_GENFCS
#define SMAP_BD_RX_BADFCS
#define SMAP_BD_RX_SHORTEVNT
#define SMAP_BD_RX_FRMTOOLONG
#define SMAP_BD_RX_INRANGE
#define SMAP_BD_RX_ALIGNERR
#define SMAP_BD_RX_RUNTFRM
#define SMAP_BD_TX_GENPAD
#define SMAP_BD_RX_OUTRANGE