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;
55 if (((uiptr)buffer & 3) == 0) {
56 result = SmapDmaTransfer(smap_regbase, buffer, length, DMAC_TO_MEM);
58 for (i = result; (
unsigned int)i < length; i += 4) {
59 ((u32 *)buffer)[i / 4] = SMAP_REG32(SMAP_R_RXFIFO_DATA);
63 for (i = 0; (
unsigned int)i < length; i += 4) {
64 u32 v = SMAP_REG32(SMAP_R_RXFIFO_DATA);
74static inline void CopyToFIFO(
volatile u8 *smap_regbase,
const void *buffer,
unsigned int length)
86 if (((uiptr)buffer & 3) == 0) {
87 result = SmapDmaTransfer(smap_regbase, (
void *)buffer, length, DMAC_FROM_MEM);
89 for (i = result; (
unsigned int)i < length; i += 4) {
90 SMAP_REG32(SMAP_R_TXFIFO_DATA) = ((u32 *)buffer)[i / 4];
93 const u8 *p = (
const u8 *)buffer;
94 for (i = 0; (
unsigned int)i < length; i += 4) {
95 u32 v = (u32)p[0] | ((u32)p[1] << 8) | ((u32)p[2] << 16) | ((u32)p[3] << 24);
96 SMAP_REG32(SMAP_R_TXFIFO_DATA) = v;
105 int NumPacketsReceived, i;
108 volatile u8 *smap_regbase;
109 u16 ctrl_stat, length, pointer, LengthRounded;
111 smap_regbase = SmapDrivPrivData->smap_regbase;
113 NumPacketsReceived = 0;
117 while (SMAP_REG8(SMAP_R_RXFIFO_FRAME_CNT) > 0) {
118 PktBdPtr = &rx_bd[SmapDrivPrivData->RxBDIndex % SMAP_BD_MAX_ENTRY];
119 ctrl_stat = PktBdPtr->ctrl_stat;
121 length = PktBdPtr->
length;
122 LengthRounded = (length + 3) & ~3;
123 pointer = PktBdPtr->pointer;
126 for (i = 0; i < 16; i++)
127 if ((ctrl_stat >> i) & 1) {
128 SmapDrivPrivData->RuntimeStats.RxErrorCount++;
129#ifdef BUILDING_SMAP_NETDEV
130 SmapDrivPrivData->RuntimeStats_NetDev.m_RxErrorVarious[i] += 1;
134 SmapDrivPrivData->RuntimeStats.RxDroppedFrameCount++;
135#ifdef BUILDING_SMAP_NETDEV
136 SmapDrivPrivData->RuntimeStats_NetDev.m_Rx_Errors += 1;
140 SmapDrivPrivData->RuntimeStats.RxFrameOverrunCount++;
141#ifdef BUILDING_SMAP_NETDEV
142 SmapDrivPrivData->RuntimeStats_NetDev.m_Rx_Over_Er += 1;
146 SmapDrivPrivData->RuntimeStats.RxFrameBadLengthCount++;
147#ifdef BUILDING_SMAP_NETDEV
148 SmapDrivPrivData->RuntimeStats_NetDev.m_Rx_Length_Er += 1;
152 SmapDrivPrivData->RuntimeStats.RxFrameBadFCSCount++;
153#ifdef BUILDING_SMAP_NETDEV
154 SmapDrivPrivData->RuntimeStats_NetDev.m_Rx_Crc_Er += 1;
158 SmapDrivPrivData->RuntimeStats.RxFrameBadAlignmentCount++;
159#ifdef BUILDING_SMAP_NETDEV
160 SmapDrivPrivData->RuntimeStats_NetDev.m_Rx_Frame_Er += 1;
165 SMAP_REG16(SMAP_R_RXFIFO_RD_PTR) = pointer + LengthRounded;
167 void *
pbuf, *payload;
169 if ((
pbuf = SMapCommonStackAllocRxPacket(SmapDrivPrivData, LengthRounded, &payload)) != NULL) {
170 CopyFromFIFO(SmapDrivPrivData->smap_regbase, payload, length, pointer);
171#ifdef BUILDING_SMAP_NETDEV
172 SmapDrivPrivData->RuntimeStats_NetDev.m_Rx_Packets += 1;
173 SmapDrivPrivData->RuntimeStats_NetDev.m_Rx_Bytes += length;
174 if ((*((u8 *)payload) & 1) != 0) {
175 SmapDrivPrivData->RuntimeStats_NetDev.m_Multicast += 1;
176 if (*(u32 *)payload == (u32)-1 && *((u16 *)payload + 2) == 0xFFFF) {
177 SmapDrivPrivData->RuntimeStats_NetDev.m_Rx_Broadcast_Packets += 1;
178 SmapDrivPrivData->RuntimeStats_NetDev.m_Rx_Broadcast_Bytes += length;
180 SmapDrivPrivData->RuntimeStats_NetDev.m_Rx_Multicast_Packets += 1;
181 SmapDrivPrivData->RuntimeStats_NetDev.m_Rx_Multicast_Bytes += length;
185 SMapStackEnQRxPacket(SmapDrivPrivData,
pbuf, length);
186 NumPacketsReceived++;
188 SmapDrivPrivData->RuntimeStats.RxAllocFail++;
189#ifdef BUILDING_SMAP_NETDEV
190 SmapDrivPrivData->RuntimeStats_NetDev.m_Rx_Dropped += 1;
193 SMAP_REG16(SMAP_R_RXFIFO_RD_PTR) = pointer + LengthRounded;
197 SMAP_REG8(SMAP_R_RXFIFO_FRAME_DEC) = 0;
199 SmapDrivPrivData->RxBDIndex++;
204#ifdef BUILDING_SMAP_NETDEV
205 if (NumPacketsReceived) {
206 SetEventFlag(SmapDrivPrivData->m_devops.evfid, sceInetDevEFP_Recv);
210 return NumPacketsReceived;
221 unsigned int SizeRounded;
222 volatile u8 *smap_regbase;
225 smap_regbase = SmapDrivPrivData->smap_regbase;
230 if ((length = SMAPCommonTxPacketNext(SmapDrivPrivData, &data, &
pbuf)) < 1) {
233 SmapDrivPrivData->packetToSend =
pbuf;
235 if (SmapDrivPrivData->NumPacketsInTx >= SMAP_BD_MAX_ENTRY) {
238 SizeRounded = (length + 3) & ~3;
240 if (SmapDrivPrivData->TxBufferSpaceAvailable < SizeRounded) {
244#ifdef BUILDING_SMAP_NETDEV
245 if ((*((u8 *)data) & 1) != 0) {
246 if (*(u32 *)data == (u32)-1 && *((u16 *)data + 2) == 0xFFFF) {
247 SmapDrivPrivData->RuntimeStats_NetDev.m_Tx_Broadcast_Packets += 1;
248 SmapDrivPrivData->RuntimeStats_NetDev.m_Tx_Broadcast_Bytes += length;
250 SmapDrivPrivData->RuntimeStats_NetDev.m_Tx_Multicast_Packets += 1;
251 SmapDrivPrivData->RuntimeStats_NetDev.m_Tx_Multicast_Bytes += length;
256 BD_data_ptr = SMAP_REG16(SMAP_R_TXFIFO_WR_PTR) + SMAP_TX_BASE;
257 BD_ptr = &tx_bd[SmapDrivPrivData->TxBDIndex % SMAP_BD_MAX_ENTRY];
259 CopyToFIFO(smap_regbase, data, length);
263 BD_ptr->pointer = BD_data_ptr;
264 SMAP_REG8(SMAP_R_TXFIFO_FRAME_INC) = 0;
266 SmapDrivPrivData->TxBDIndex++;
267 SmapDrivPrivData->NumPacketsInTx++;
268 SmapDrivPrivData->TxBufferSpaceAvailable -= SizeRounded;
270#ifdef BUILDING_SMAP_NETDEV
271 SmapDrivPrivData->RuntimeStats_NetDev.m_Tx_Bytes += length;
272 SmapDrivPrivData->RuntimeStats_NetDev.m_Tx_Packets += 1;
275 SmapDrivPrivData->packetToSend = NULL;
276 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
struct _smap_bd smap_bd_t
#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