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;
81 volatile u8 *smap_regbase;
82 u16 ctrl_stat, length, pointer, LengthRounded;
84 smap_regbase = SmapDrivPrivData->smap_regbase;
86 NumPacketsReceived = 0;
90 while (SMAP_REG8(SMAP_R_RXFIFO_FRAME_CNT) > 0) {
91 PktBdPtr = &rx_bd[SmapDrivPrivData->RxBDIndex % SMAP_BD_MAX_ENTRY];
92 ctrl_stat = PktBdPtr->ctrl_stat;
95 LengthRounded = (length + 3) & ~3;
96 pointer = PktBdPtr->pointer;
99 for (i = 0; i < 16; i++)
100 if ((ctrl_stat >> i) & 1)
101 SmapDrivPrivData->RuntimeStats.RxErrorCount++;
103 SmapDrivPrivData->RuntimeStats.RxDroppedFrameCount++;
106 SmapDrivPrivData->RuntimeStats.RxFrameOverrunCount++;
108 SmapDrivPrivData->RuntimeStats.RxFrameBadLengthCount++;
110 SmapDrivPrivData->RuntimeStats.RxFrameBadFCSCount++;
112 SmapDrivPrivData->RuntimeStats.RxFrameBadAlignmentCount++;
115 SMAP_REG16(SMAP_R_RXFIFO_RD_PTR) = pointer + LengthRounded;
117 void *
pbuf, *payload;
119 if ((
pbuf = SMapCommonStackAllocRxPacket(SmapDrivPrivData, LengthRounded, &payload)) != NULL) {
120 CopyFromFIFO(SmapDrivPrivData->smap_regbase, payload, length, pointer);
121 SMapStackEnQRxPacket(SmapDrivPrivData,
pbuf);
122 NumPacketsReceived++;
124 SmapDrivPrivData->RuntimeStats.RxAllocFail++;
126 SMAP_REG16(SMAP_R_RXFIFO_RD_PTR) = pointer + LengthRounded;
130 SMAP_REG8(SMAP_R_RXFIFO_FRAME_DEC) = 0;
132 SmapDrivPrivData->RxBDIndex++;
137 return NumPacketsReceived;
147 unsigned int SizeRounded;
154 if ((length = SMAPCommonTxPacketNext(SmapDrivPrivData, &data)) < 1) {
157 SmapDrivPrivData->packetToSend = data;
159 if (SmapDrivPrivData->NumPacketsInTx < SMAP_BD_MAX_ENTRY) {
161 SizeRounded = (length + 3) & ~3;
163 if (SmapDrivPrivData->TxBufferSpaceAvailable >= SizeRounded) {
164 volatile u8 *smap_regbase;
166 smap_regbase = SmapDrivPrivData->smap_regbase;
168 BD_data_ptr = SMAP_REG16(SMAP_R_TXFIFO_WR_PTR) + SMAP_TX_BASE;
169 BD_ptr = &tx_bd[SmapDrivPrivData->TxBDIndex % SMAP_BD_MAX_ENTRY];
171 CopyToFIFO(SmapDrivPrivData->smap_regbase, data, length);
175 BD_ptr->pointer = BD_data_ptr;
176 SMAP_REG8(SMAP_R_TXFIFO_FRAME_INC) = 0;
178 SmapDrivPrivData->TxBDIndex++;
179 SmapDrivPrivData->NumPacketsInTx++;
180 SmapDrivPrivData->TxBufferSpaceAvailable -= SizeRounded;
187 SmapDrivPrivData->packetToSend = NULL;
188 SMAPCommonTxPacketDeQ(SmapDrivPrivData, &data);
#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