52#define DEV9_SMAP_ALL_INTR_MASK (SMAP_INTR_EMAC3 | SMAP_INTR_RXEND | SMAP_INTR_TXEND | SMAP_INTR_RXDNV | SMAP_INTR_TXDNV)
53#define DEV9_SMAP_INTR_MASK (SMAP_INTR_EMAC3 | SMAP_INTR_RXEND | SMAP_INTR_RXDNV | SMAP_INTR_TXDNV)
55#define DEV9_SMAP_INTR_MASK2 (SMAP_INTR_EMAC3 | SMAP_INTR_RXEND | SMAP_INTR_RXDNV)
59static const char VersionString[] =
"Version 2.26.0";
60static unsigned int ThreadPriority = 0x28;
61static unsigned int ThreadStackSize = 0x1000;
62static unsigned int EnableVerboseOutput = 0;
63static unsigned int EnableAutoNegotiation = 1;
64static unsigned int EnablePinStrapConfig = 0;
65static unsigned int SmapConfiguration = 0x5E0;
67int DisplayBanner(
void)
69 printf(
"SMAP (%s)\n", VersionString);
70 return MODULE_NO_RESIDENT_END;
73static void _smap_write_phy(
volatile u8 *emac3_regbase,
unsigned int address, u16 value)
78 PHYRegisterValue = (address & SMAP_E3_PHY_REG_ADDR_MSK) | SMAP_E3_PHY_WRITE | ((SMAP_DsPHYTER_ADDRESS & SMAP_E3_PHY_ADDR_MSK) << SMAP_E3_PHY_ADDR_BITSFT);
79 PHYRegisterValue |= ((u32)value) << SMAP_E3_PHY_DATA_BITSFT;
82 SMAP_EMAC3_SET32(SMAP_R_EMAC3_STA_CTRL, PHYRegisterValue);
91 sceInetPrintf(
"smap: %s: > %u ms\n",
"_smap_write_phy", i);
94static u16 _smap_read_phy(
volatile u8 *emac3_regbase,
unsigned int address)
97 u32 value, PHYRegisterValue;
100 PHYRegisterValue = (address & SMAP_E3_PHY_REG_ADDR_MSK) | SMAP_E3_PHY_READ | ((SMAP_DsPHYTER_ADDRESS & SMAP_E3_PHY_ADDR_MSK) << SMAP_E3_PHY_ADDR_BITSFT);
104 SMAP_EMAC3_SET32(SMAP_R_EMAC3_STA_CTRL, PHYRegisterValue);
110 result = (u16)(value >> SMAP_E3_PHY_DATA_BITSFT);
121 sceInetPrintf(
"SMAP: %s: > %u ms\n",
"_smap_read_phy", i);
126static int DisplayHelpMessage(
void)
130 printf(
"Usage: smap [<option>] [thpri=<prio>] [thstack=<stack>] [<conf>]\n"
132 " -verbose display verbose messages\n"
133 " -auto auto nego enable [default]\n"
134 " -no_auto fixed mode\n"
135 " -strap use pin-strap config\n"
136 " -no_strap do not use pin-strap config [default]\n");
141static inline void RestartAutoNegotiation(
volatile u8 *emac3_regbase, u16 bmsr)
143 if (EnableVerboseOutput)
144 DEBUG_PRINTF(
"restarting auto nego (BMCR=0x%x, BMSR=0x%x)\n", _smap_read_phy(emac3_regbase, SMAP_DsPHYTER_BMCR), bmsr);
145 _smap_write_phy(emac3_regbase, SMAP_DsPHYTER_BMCR, SMAP_PHY_BMCR_ANEN | SMAP_PHY_BMCR_RSAN);
151 unsigned int LinkSpeed100M, LinkFDX, FlowControlEnabled, AutoNegoRetries;
153 u16 RegDump[6], value, value2;
154 volatile u8 *emac3_regbase;
157 if (EnableVerboseOutput != 0)
158 DEBUG_PRINTF(
"Resetting PHY\n");
160 _smap_write_phy(SmapDrivPrivData->emac3_regbase, SMAP_DsPHYTER_BMCR, SMAP_PHY_BMCR_RST);
161 for (i = 0; _smap_read_phy(SmapDrivPrivData->emac3_regbase, SMAP_DsPHYTER_BMCR) & SMAP_PHY_BMCR_RST; i++) {
163 DEBUG_PRINTF(
"PHY reset error\n");
166 if (SmapDrivPrivData->NetDevStopFlag)
172 if (!EnableAutoNegotiation) {
173 if (EnableVerboseOutput != 0)
174 DEBUG_PRINTF(
"no auto mode (conf=0x%x)\n", SmapConfiguration);
176 LinkSpeed100M = 0 < (SmapConfiguration & 0x180);
177 value = LinkSpeed100M << 13;
178 if (SmapConfiguration & 0x140)
179 value |= SMAP_PHY_BMCR_DUPM;
180 _smap_write_phy(SmapDrivPrivData->emac3_regbase, SMAP_DsPHYTER_BMCR, value);
183 DEBUG_PRINTF(
"Waiting Valid Link for %dMbps\n", LinkSpeed100M ? 100 : 10);
188 if (SmapDrivPrivData->NetDevStopFlag)
191 if (_smap_read_phy(SmapDrivPrivData->emac3_regbase, SMAP_DsPHYTER_BMSR) &
SMAP_PHY_BMSR_LINK)
194 SmapDrivPrivData->LinkStatus = 0;
197 SmapDrivPrivData->LinkStatus = 1;
199 if (!EnablePinStrapConfig) {
200 unsigned int SmapConfiguration_old;
203 SmapConfiguration_old = SmapConfiguration;
204 _smap_write_phy(SmapDrivPrivData->emac3_regbase, SMAP_DsPHYTER_BMCR, 0);
205 value = _smap_read_phy(SmapDrivPrivData->emac3_regbase, SMAP_DsPHYTER_BMSR);
206 if (!(value & 0x4000))
207 SmapConfiguration = SmapConfiguration & 0xFFFFFEFF;
208 if (!(value & 0x2000))
209 SmapConfiguration = SmapConfiguration & 0xFFFFFF7F;
210 if (!(value & 0x1000))
211 SmapConfiguration = SmapConfiguration & 0xFFFFFFBF;
212 if (!(value & 0x0800))
213 SmapConfiguration = SmapConfiguration & 0xFFFFFFDF;
215 DEBUG_PRINTF(
"no strap mode (conf=0x%x->0x%x, bmsr=0x%x)\n", SmapConfiguration_old, SmapConfiguration, value);
217 value = _smap_read_phy(SmapDrivPrivData->emac3_regbase, SMAP_DsPHYTER_ANAR);
219 value = (SmapConfiguration & 0x5E0) | (value & 0x1F);
220 DEBUG_PRINTF(
"anar=0x%x->0x%x\n", anar_old, value);
221 _smap_write_phy(SmapDrivPrivData->emac3_regbase, SMAP_DsPHYTER_ANAR, value);
222 _smap_write_phy(SmapDrivPrivData->emac3_regbase, SMAP_DsPHYTER_BMCR, SMAP_PHY_BMCR_ANEN | SMAP_PHY_BMCR_RSAN);
224 if (!(_smap_read_phy(SmapDrivPrivData->emac3_regbase, SMAP_DsPHYTER_BMCR) & SMAP_PHY_BMCR_ANEN)) {
229 DEBUG_PRINTF(
"auto mode (BMCR=0x%x ANAR=0x%x)\n", _smap_read_phy(SmapDrivPrivData->emac3_regbase, SMAP_DsPHYTER_BMCR), _smap_read_phy(SmapDrivPrivData->emac3_regbase, SMAP_DsPHYTER_ANAR));
231 RepeatAutoNegoProcess:
232 for (AutoNegoRetries = 0; AutoNegoRetries < 3; AutoNegoRetries++) {
233 for (i = 0; i < 3; i++) {
234 DelayThread(1000000);
235 if (SmapDrivPrivData->NetDevStopFlag)
239 value = _smap_read_phy(SmapDrivPrivData->emac3_regbase, SMAP_DsPHYTER_BMSR);
242 for (i = 0; !(_smap_read_phy(SmapDrivPrivData->emac3_regbase, SMAP_DsPHYTER_BMSR) &
SMAP_PHY_BMSR_LINK); i++) {
244 if (SmapDrivPrivData->NetDevStopFlag)
252 SmapDrivPrivData->LinkStatus = 1;
255 RestartAutoNegotiation(SmapDrivPrivData->emac3_regbase, value);
257 RestartAutoNegotiation(SmapDrivPrivData->emac3_regbase, value);
261 if (AutoNegoRetries >= 3) {
262 if (EnableVerboseOutput)
263 DEBUG_PRINTF(
"waiting valid link for 100Mbps Half-Duplex\n");
265 _smap_write_phy(SmapDrivPrivData->emac3_regbase, SMAP_DsPHYTER_BMCR, SMAP_PHY_BMCR_100M);
266 DelayThread(1000000);
267 if (SmapDrivPrivData->NetDevStopFlag)
270 for (i = 0; !(_smap_read_phy(SmapDrivPrivData->emac3_regbase, SMAP_DsPHYTER_BMSR) &
SMAP_PHY_BMSR_LINK); i++) {
272 if (SmapDrivPrivData->NetDevStopFlag)
279 if (EnableVerboseOutput)
280 DEBUG_PRINTF(
"waiting valid link for 10Mbps Half-Duplex\n");
282 _smap_write_phy(SmapDrivPrivData->emac3_regbase, SMAP_DsPHYTER_BMCR, SMAP_PHY_BMCR_10M);
283 DelayThread(1000000);
284 if (SmapDrivPrivData->NetDevStopFlag)
287 for (i = 0; !(_smap_read_phy(SmapDrivPrivData->emac3_regbase, SMAP_DsPHYTER_BMSR) &
SMAP_PHY_BMSR_LINK); i++) {
289 if (SmapDrivPrivData->NetDevStopFlag)
296 goto RepeatAutoNegoProcess;
298 SmapDrivPrivData->LinkStatus = 1;
300 SmapDrivPrivData->LinkStatus = 1;
304 for (i = 0; i < 6; i++)
305 RegDump[i] = _smap_read_phy(SmapDrivPrivData->emac3_regbase, i);
307 if (EnableVerboseOutput)
308 DEBUG_PRINTF(
"PHY: %04x %04x %04x %04x %04x %04x\n", RegDump[SMAP_DsPHYTER_BMCR], RegDump[SMAP_DsPHYTER_BMSR], RegDump[SMAP_DsPHYTER_PHYIDR1], RegDump[SMAP_DsPHYTER_PHYIDR2], RegDump[SMAP_DsPHYTER_ANAR], RegDump[SMAP_DsPHYTER_ANLPAR]);
311 if (RegDump[SMAP_DsPHYTER_PHYIDR1] == SMAP_PHY_IDR1_VAL && (RegDump[SMAP_DsPHYTER_PHYIDR2] & SMAP_PHY_IDR2_MSK) == SMAP_PHY_IDR2_VAL) {
312 if (EnableAutoNegotiation) {
313 _smap_read_phy(SmapDrivPrivData->emac3_regbase, SMAP_DsPHYTER_FCSCR);
314 _smap_read_phy(SmapDrivPrivData->emac3_regbase, SMAP_DsPHYTER_RECR);
316 value = _smap_read_phy(SmapDrivPrivData->emac3_regbase, SMAP_DsPHYTER_FCSCR);
317 value2 = _smap_read_phy(SmapDrivPrivData->emac3_regbase, SMAP_DsPHYTER_RECR);
318 if ((value2 != 0) || (value >= 0x11)) {
319 if (EnableVerboseOutput)
320 DEBUG_PRINTF(
"FCSCR=%d RECR=%d\n", value, value2);
321 _smap_write_phy(SmapDrivPrivData->emac3_regbase, SMAP_DsPHYTER_BMCR, 0);
326 DEBUG_PRINTF(
"PHY chip: DP83846A%d\n", (RegDump[SMAP_DsPHYTER_PHYIDR2] & SMAP_PHY_IDR2_REV_MSK) + 1);
329 if (!EnableAutoNegotiation) {
330 if ((RegDump[SMAP_DsPHYTER_BMCR] & (SMAP_PHY_BMCR_DUPM | SMAP_PHY_BMCR_100M)) == 0)
337 if ((RegDump[SMAP_DsPHYTER_PHYIDR2] & SMAP_PHY_IDR2_REV_MSK) == 0) {
338 _smap_write_phy(SmapDrivPrivData->emac3_regbase, 0x13, 1);
339 _smap_write_phy(SmapDrivPrivData->emac3_regbase, SMAP_DsPHYTER_PHYCTRL, 0x1898);
340 _smap_write_phy(SmapDrivPrivData->emac3_regbase, 0x1F, 0);
341 _smap_write_phy(SmapDrivPrivData->emac3_regbase, 0x1D, 0x5040);
342 _smap_write_phy(SmapDrivPrivData->emac3_regbase, 0x1E, 0x8C);
343 _smap_write_phy(SmapDrivPrivData->emac3_regbase, 0x13, 0);
348 FlowControlEnabled = 0;
349 if (RegDump[SMAP_DsPHYTER_BMCR] & SMAP_PHY_BMCR_ANEN) {
350 value = RegDump[SMAP_DsPHYTER_ANAR] & RegDump[SMAP_DsPHYTER_ANLPAR];
351 LinkSpeed100M = 0 < (value & 0x180);
352 LinkFDX = 0 < (value & 0x140);
354 FlowControlEnabled = 0 < (value & 0x400);
356 LinkSpeed100M = RegDump[SMAP_DsPHYTER_BMCR] >> 13 & 1;
357 LinkFDX = RegDump[SMAP_DsPHYTER_BMCR] >> 8 & 1;
358 FlowControlEnabled = SmapConfiguration >> 10 & 1;
362 result = LinkFDX ? 8 : 4;
364 result = LinkFDX ? 2 : 1;
366 SmapDrivPrivData->LinkMode = result;
367 if (FlowControlEnabled)
368 SmapDrivPrivData->LinkMode |= 0x40;
370 DEBUG_PRINTF(
"%s %s Duplex Mode %s Flow Control\n", LinkSpeed100M ?
"100BaseTX" :
"10BaseT", LinkFDX ?
"Full" :
"Half", FlowControlEnabled ?
"with" :
"without");
372 emac3_regbase = SmapDrivPrivData->emac3_regbase;
373 emac3_value = SMAP_EMAC3_GET32(SMAP_R_EMAC3_MODE1) & 0x67FFFFFF;
375 emac3_value |= SMAP_E3_FDX_ENABLE;
376 if (FlowControlEnabled)
378 SMAP_EMAC3_SET32(SMAP_R_EMAC3_MODE1, emac3_value);
384static unsigned int LinkCheckTimerCB(
struct SmapDriverData *SmapDrivPrivData)
386 iSetEventFlag(SmapDrivPrivData->Dev9IntrEventFlag, SMAP_EVENT_LINK_CHECK);
387 return SmapDrivPrivData->LinkCheckTimer.lo;
397 while (SmapDrivPrivData->NumPacketsInTx > 0) {
398 ctrl_stat = tx_bd[SmapDrivPrivData->TxDNVBDIndex % SMAP_BD_MAX_ENTRY].ctrl_stat;
401 for (i = 0; i < 16; i++)
402 if ((ctrl_stat >> i) & 1) {
403 SmapDrivPrivData->RuntimeStats.TxErrorCount++;
404#ifdef BUILDING_SMAP_NETDEV
405 SmapDrivPrivData->RuntimeStats_NetDev.m_TxErrorVarious[i] += 1;
409 SmapDrivPrivData->RuntimeStats.TxDroppedFrameCount++;
410#ifdef BUILDING_SMAP_NETDEV
411 SmapDrivPrivData->RuntimeStats_NetDev.m_Tx_Errors += 1;
414 SmapDrivPrivData->RuntimeStats.TxFrameLOSSCRCount++;
415#ifdef BUILDING_SMAP_NETDEV
416 SmapDrivPrivData->RuntimeStats_NetDev.m_Tx_Carrier_Er += 1;
420 SmapDrivPrivData->RuntimeStats.TxFrameEDEFERCount++;
421#ifdef BUILDING_SMAP_NETDEV
422 SmapDrivPrivData->RuntimeStats_NetDev.m_Tx_Window_Er += 1;
426 SmapDrivPrivData->RuntimeStats.TxFrameCollisionCount++;
427#ifdef BUILDING_SMAP_NETDEV
428 SmapDrivPrivData->RuntimeStats_NetDev.m_Collisions += 1;
432 SmapDrivPrivData->RuntimeStats.TxFrameUnderrunCount++;
433#ifdef BUILDING_SMAP_NETDEV
434 SmapDrivPrivData->RuntimeStats_NetDev.m_Tx_Fifo_Er += 1;
442 SmapDrivPrivData->TxBufferSpaceAvailable += (tx_bd[SmapDrivPrivData->TxDNVBDIndex & (SMAP_BD_MAX_ENTRY - 1)].length + 3) & ~3;
443 SmapDrivPrivData->TxDNVBDIndex++;
444 SmapDrivPrivData->NumPacketsInTx--;
450#ifdef BUILDING_SMAP_NETDEV
451static void ClearPacketQueue(
struct SmapDriverData *SmapDrivPrivData);
455static void CheckLinkStatus(
struct SmapDriverData *SmapDrivPrivData)
457 if (!(_smap_read_phy(SmapDrivPrivData->emac3_regbase, SMAP_DsPHYTER_BMSR) &
SMAP_PHY_BMSR_LINK)) {
459 SmapDrivPrivData->LinkStatus = 0;
460 SMapCommonLinkStateDown(SmapDrivPrivData);
461 InitPHY(SmapDrivPrivData);
462#ifdef BUILDING_SMAP_NETDEV
463 ClearPacketQueue(SmapDrivPrivData);
467 if (SmapDrivPrivData->LinkStatus)
468 SMapCommonLinkStateUp(SmapDrivPrivData);
472#ifdef SMAP_RX_PACKETS_POLLING_MODE
473static unsigned int RxIntrPollingTimerCB(
struct SmapDriverData *SmapDrivPrivData)
475 iSetEventFlag(SmapDrivPrivData->Dev9IntrEventFlag, SMAP_EVENT_INTR);
480static void IntrHandlerThread(
struct SmapDriverData *SmapDrivPrivData)
482 unsigned int PacketCount, IntrReg;
485 volatile u8 *smap_regbase, *emac3_regbase;
489 emac3_regbase = SmapDrivPrivData->emac3_regbase;
490 smap_regbase = SmapDrivPrivData->smap_regbase;
492 SmapDrivPrivData->TxBufferSpaceAvailable = SMAP_TX_BUFSIZE;
493 SmapDrivPrivData->NumPacketsInTx = 0;
494 SmapDrivPrivData->TxBDIndex = 0;
495 SmapDrivPrivData->TxDNVBDIndex = 0;
496 SmapDrivPrivData->RxBDIndex = 0;
497 SmapDrivPrivData->packetToSend = NULL;
502 if ((result = WaitEventFlag(SmapDrivPrivData->Dev9IntrEventFlag, SMAP_EVENT_START | SMAP_EVENT_STOP | SMAP_EVENT_INTR | SMAP_EVENT_XMIT | SMAP_EVENT_LINK_CHECK, WEF_OR | WEF_CLEAR, &EFBits)) != 0) {
503 DEBUG_PRINTF(
"WaitEventFlag -> %d\n", result);
507 if (EFBits & SMAP_EVENT_STOP) {
508 if (SmapDrivPrivData->SmapIsInitialized) {
509 SpdIntrDisable(DEV9_SMAP_INTR_MASK2);
510 SMAP_EMAC3_SET32(SMAP_R_EMAC3_MODE0, 0);
511 SmapDrivPrivData->NetDevStopFlag = 0;
512 SmapDrivPrivData->LinkStatus = 0;
513 SmapDrivPrivData->SmapIsInitialized = 0;
514 SmapDrivPrivData->SmapDriverStarting = 0;
515 SMapCommonLinkStateDown(SmapDrivPrivData);
518 if (EFBits & SMAP_EVENT_START) {
519 if (!SmapDrivPrivData->SmapIsInitialized) {
520 SmapDrivPrivData->SmapDriverStarting = 1;
521 SpdIntrEnable(DEV9_SMAP_INTR_MASK2);
522 if ((result = InitPHY(SmapDrivPrivData)) != 0)
524 if (SmapDrivPrivData->NetDevStopFlag) {
525 SmapDrivPrivData->NetDevStopFlag = 0;
526 SmapDrivPrivData->SmapDriverStarting = 0;
530 SMAP_EMAC3_SET32(SMAP_R_EMAC3_MODE0, SMAP_E3_TXMAC_ENABLE | SMAP_E3_RXMAC_ENABLE);
532 SmapDrivPrivData->SmapIsInitialized = 1;
533 SmapDrivPrivData->SmapDriverStarting = 0;
535 SMapCommonLinkStateUp(SmapDrivPrivData);
537 if (!SmapDrivPrivData->EnableLinkCheckTimer) {
538 USec2SysClock(1000000, &SmapDrivPrivData->LinkCheckTimer);
539 SetAlarm(&SmapDrivPrivData->LinkCheckTimer, (
void *)&LinkCheckTimerCB, SmapDrivPrivData);
540 SmapDrivPrivData->EnableLinkCheckTimer = 1;
545 if (SmapDrivPrivData->SmapIsInitialized) {
547 if (EFBits & SMAP_EVENT_INTR) {
548 if ((IntrReg = SPD_REG16(SPD_R_INTR_STAT) & DEV9_SMAP_INTR_MASK) != 0) {
554 if (IntrReg & SMAP_INTR_EMAC3) {
555 SMAP_REG16(SMAP_R_INTR_CLR) = SMAP_INTR_EMAC3;
556 SMAP_EMAC3_SET32(SMAP_R_EMAC3_INTR_STAT, SMAP_E3_INTR_TX_ERR_0 | SMAP_E3_INTR_SQE_ERR_0 | SMAP_E3_INTR_DEAD_0);
558 if (IntrReg & SMAP_INTR_RXEND) {
559 SMAP_REG16(SMAP_R_INTR_CLR) = SMAP_INTR_RXEND;
560 PacketCount = HandleRxIntr(SmapDrivPrivData);
562 if (IntrReg & SMAP_INTR_RXDNV) {
563 SMAP_REG16(SMAP_R_INTR_CLR) = SMAP_INTR_RXDNV;
564 SmapDrivPrivData->RuntimeStats.RxFrameOverrunCount++;
565#ifdef BUILDING_SMAP_NETDEV
566 SmapDrivPrivData->RuntimeStats_NetDev.m_Rx_Over_Er += 1;
569 if (IntrReg & SMAP_INTR_TXDNV) {
570 SMAP_REG16(SMAP_R_INTR_CLR) = SMAP_INTR_TXDNV;
571 HandleTxIntr(SmapDrivPrivData);
572 EFBits |= SMAP_EVENT_XMIT;
577 if (EFBits & SMAP_EVENT_XMIT)
578 HandleTxReqs(SmapDrivPrivData);
580 HandleTxIntr(SmapDrivPrivData);
583#ifdef SMAP_RX_PACKETS_POLLING_MODE
584 SpdIntrEnable(SMAP_INTR_EMAC3 | SMAP_INTR_RXDNV);
586 if (PacketCount >= 1) {
590#define ETH_KB_TO_US(B) (B * 80)
592 USec2SysClock(ETH_KB_TO_US(12), &SmapDrivPrivData->RxIntrPollingTimer);
594 SetAlarm(&SmapDrivPrivData->RxIntrPollingTimer, (
void *)&RxIntrPollingTimerCB, SmapDrivPrivData);
597 SpdIntrEnable(SMAP_INTR_RXEND);
600 SpdIntrEnable(DEV9_SMAP_INTR_MASK2);
604 if (SmapDrivPrivData->NumPacketsInTx > 0) {
606 SpdIntrEnable(SMAP_INTR_TXDNV);
615 if (EFBits & SMAP_EVENT_LINK_CHECK) {
617 CheckLinkStatus(SmapDrivPrivData);
623static int Dev9IntrCb(
int flag)
628 OldGP = SetModuleGP();
633 SpdIntrDisable(DEV9_SMAP_ALL_INTR_MASK);
643static void Dev9PreDmaCbHandler(
int bcr,
int dir)
646 volatile u8 *smap_regbase;
650 SliceCount = bcr >> 16;
651 if (dir != DMAC_TO_MEM) {
652 SMAP_REG16(SMAP_R_TXFIFO_SIZE) = SliceCount;
653 SMAP_REG8(SMAP_R_TXFIFO_CTRL) = SMAP_TXFIFO_DMAEN;
655 SMAP_REG16(SMAP_R_RXFIFO_SIZE) = SliceCount;
656 SMAP_REG8(SMAP_R_RXFIFO_CTRL) = SMAP_RXFIFO_DMAEN;
660static void Dev9PostDmaCbHandler(
int bcr,
int dir)
663 volatile u8 *smap_regbase;
668 if (dir != DMAC_TO_MEM) {
669 while (SMAP_REG8(SMAP_R_TXFIFO_CTRL) & SMAP_TXFIFO_DMAEN) {};
671 while (SMAP_REG8(SMAP_R_RXFIFO_CTRL) & SMAP_RXFIFO_DMAEN) {};
675#ifdef BUILDING_SMAP_PS2IP
677int SMAPInitStart(
void)
680 volatile u8 *emac3_regbase;
685 OldGP = SetModuleGP();
691 SpdIntrEnable(DEV9_SMAP_INTR_MASK2);
693 SMAP_EMAC3_SET32(SMAP_R_EMAC3_MODE0, SMAP_E3_TXMAC_ENABLE | SMAP_E3_RXMAC_ENABLE);
716#if defined(BUILDING_SMAP_NETMAN) || defined(BUILDING_SMAP_NETDEV)
717#ifdef BUILDING_SMAP_NETDEV
718static int SMAPStart(
void *priv,
int flags)
720static int SMAPStart(
void)
727 OldGP = SetModuleGP();
730#ifdef BUILDING_SMAP_NETDEV
738 SetEventFlag(SmapDrivPrivData->Dev9IntrEventFlag, SMAP_EVENT_START);
747#ifdef BUILDING_SMAP_NETDEV
748static int SMAPStop(
void *priv,
int flags)
750static void SMAPStop(
void)
757 OldGP = SetModuleGP();
760#ifdef BUILDING_SMAP_NETDEV
768 SetEventFlag(SmapDrivPrivData->Dev9IntrEventFlag, SMAP_EVENT_STOP);
769 SmapDrivPrivData->NetDevStopFlag = 1;
775#ifdef BUILDING_SMAP_NETDEV
781static void ClearPacketQueue(
struct SmapDriverData *SmapDrivPrivData)
789 pbuf = SmapDrivPrivData->packetToSend;
790 SmapDrivPrivData->packetToSend = NULL;
793 while (
pbuf != NULL) {
794#ifdef BUILDING_SMAP_NETDEV
795 SmapDrivPrivData->RuntimeStats_NetDev.m_Tx_Dropped += 1;
797 if (SMAPCommonTxPacketNext(SmapDrivPrivData, &data, &
pbuf) <= 0)
799 SMAPCommonTxPacketDeQ(SmapDrivPrivData, &data, &
pbuf);
803#ifdef BUILDING_SMAP_NETDEV
804static int SMAPXmit_NetDev(
void *priv,
int flags)
813 OldGP = SetModuleGP();
816#ifdef BUILDING_SMAP_NETDEV
826 iSetEventFlag(SmapDrivPrivData->Dev9IntrEventFlag, SMAP_EVENT_XMIT);
828 SetEventFlag(SmapDrivPrivData->Dev9IntrEventFlag, SMAP_EVENT_XMIT);
831 ClearPacketQueue(SmapDrivPrivData);
837#ifdef BUILDING_SMAP_NETDEV
842#ifdef BUILDING_SMAP_NETDEV
849#ifdef BUILDING_SMAP_NETMAN
850static int SMAPGetLinkMode(
void)
873static int SMAPSetLinkMode(
int mode)
880 baseMode = mode & (~NETMAN_NETIF_ETH_LINK_DISABLE_PAUSE);
883 EnableAutoNegotiation = 0;
887 SmapConfiguration = 0x020;
891 SmapConfiguration = 0x040;
895 SmapConfiguration = 0x080;
899 SmapConfiguration = 0x0100;
906 SmapConfiguration = 0x1E0;
907 EnableAutoNegotiation = 1;
913 SmapConfiguration |= 0x400;
915 SetEventFlag(
SmapDriverData.Dev9IntrEventFlag, SMAP_EVENT_STOP | SMAP_EVENT_START);
924static inline int SMAPGetLinkStatus(
void)
926 return ((
SmapDriverData.SmapIsInitialized &&
SmapDriverData.LinkStatus) ? NETMAN_NETIF_ETH_LINK_STATE_UP : NETMAN_NETIF_ETH_LINK_STATE_DOWN);
930#ifdef BUILDING_SMAP_NETDEV
931static int do_set_multicast_list_helper(
const struct SmapDriverData *SmapDrivPrivData, u8 *in_out_ptr,
int in_out_len)
934 volatile u8 *emac3_regbase;
938 emac3_regbase = SmapDrivPrivData->emac3_regbase;
939 bzero(group_hash,
sizeof(group_hash));
940 if (in_out_len >= 0) {
943 length_div_6 = in_out_len / 6;
944 if (in_out_len != 6 * length_div_6) {
950 for (k = 0; k < length_div_6; k += 1) {
951 if ((*in_out_ptr & 1) != 0) {
952 unsigned int cur_group_1;
953 unsigned int cur_group_2;
955 cur_group_1 = (
unsigned int)-1;
956 for (i = 0; i < 4; i += 1) {
960 cur_item = *in_out_ptr++;
962 for (j = 0; j < 6; j += 1) {
963 cur_group_2 = cur_group_1 << 1;
964 if (((((cur_group_1 & 0x80000000) != 0) ^ cur_item) & 1) != 0)
965 cur_group_2 ^= 0x4C11DB7u;
966 cur_group_1 = cur_group_2;
970 group_hash[cur_group_2 >> 30] |= 1 << ((cur_group_2 >> 26) & 0xF);
979 for (i = 0; i < 4; i += 1) {
983 SMAP_EMAC3_SET32(SMAP_R_EMAC3_GROUP_HASH1, group_hash[3]);
984 SMAP_EMAC3_SET32(SMAP_R_EMAC3_GROUP_HASH2, group_hash[2]);
985 SMAP_EMAC3_SET32(SMAP_R_EMAC3_GROUP_HASH3, group_hash[1]);
986 SMAP_EMAC3_SET32(SMAP_R_EMAC3_GROUP_HASH4, group_hash[0]);
991#if defined(BUILDING_SMAP_NETMAN) || defined(BUILDING_SMAP_NETDEV)
992#ifdef BUILDING_SMAP_NETDEV
993static int SMAPIoctl(
void *priv,
int command,
void *in_out_ptr,
int in_out_len)
995static int SMAPIoctl(
unsigned int command,
void *args,
unsigned int args_len,
void *output,
unsigned int length)
999#ifdef BUILDING_SMAP_NETDEV
1001 const void *tmpoutptr;
1007 OldGP = SetModuleGP();
1010#ifdef BUILDING_SMAP_NETDEV
1016 case sceInetNDCC_GET_IF_TYPE:
1017 result = sceInetNDIFT_ETHERNET;
1019 case sceInetNDCC_GET_NEGO_STATUS: {
1021 if ((
int)(SmapDrivPrivData->LinkStatus) > 0)
1022 result = SmapDrivPrivData->LinkMode;
1025 case sceInetNDCC_GET_LINK_STATUS:
1026 result = SmapDrivPrivData->LinkStatus;
1028 case sceInetNDCC_GET_THPRI:
1029 result = ThreadPriority;
1031 case sceInetNDCC_SET_THPRI: {
1032 if (in_out_ptr && in_out_len == 4) {
1034 memcpy(&bufasint, in_out_ptr, 4);
1035 if ((
unsigned int)(bufasint - 9) < 0x73) {
1036 ThreadPriority = bufasint;
1037 result = ChangeThreadPriority(SmapDrivPrivData->IntrHandlerThreadID, bufasint);
1042 case sceInetNDCC_GET_NEGO_MODE: {
1044 if (EnableAutoNegotiation != 0)
1045 bufasint |= sceInetNDNEGO_AUTO;
1046 if ((SmapConfiguration & 0x400) != 0)
1047 bufasint |= sceInetNDNEGO_PAUSE;
1048 if ((SmapConfiguration & 0x100) != 0)
1049 bufasint |= sceInetNDNEGO_TX_FD;
1050 if ((SmapConfiguration & 0x80) != 0)
1051 bufasint |= sceInetNDNEGO_TX;
1052 if ((SmapConfiguration & 0x40) != 0)
1053 bufasint |= sceInetNDNEGO_10_FD;
1054 if ((SmapConfiguration & 0x20) != 0)
1055 bufasint |= sceInetNDNEGO_10;
1056 tmpoutptr = &bufasint;
1059 case sceInetNDCC_SET_NEGO_MODE: {
1060 if (in_out_ptr && in_out_len == 4) {
1064 memcpy(&bufasint, in_out_ptr, 4);
1065 EnableAutoNegotiation = ((bufasint & sceInetNDNEGO_AUTO) != 0 ? 1 : 0);
1066 if ((bufasint & sceInetNDNEGO_PAUSE) != 0)
1068 if ((bufasint & sceInetNDNEGO_TX_FD) != 0)
1070 if ((bufasint & sceInetNDNEGO_TX) != 0)
1072 if ((bufasint & sceInetNDNEGO_10_FD) != 0)
1074 if ((bufasint & sceInetNDNEGO_10) != 0)
1076 SmapConfiguration = tmpconfig;
1081 case sceInetNDCC_GET_MULTICAST:
1082 tmpoutptr = &SmapDrivPrivData->RuntimeStats_NetDev.m_Multicast;
1084 case sceInetNDCC_GET_COLLISIONS:
1085 tmpoutptr = &SmapDrivPrivData->RuntimeStats_NetDev.m_Collisions;
1087 case sceInetNDCC_GET_RX_LENGTH_ER:
1088 tmpoutptr = &SmapDrivPrivData->RuntimeStats_NetDev.m_Rx_Length_Er;
1090 case sceInetNDCC_GET_RX_OVER_ER:
1091 tmpoutptr = &SmapDrivPrivData->RuntimeStats_NetDev.m_Rx_Over_Er;
1093 case sceInetNDCC_GET_RX_CRC_ER:
1094 tmpoutptr = &SmapDrivPrivData->RuntimeStats_NetDev.m_Rx_Crc_Er;
1096 case sceInetNDCC_GET_RX_FRAME_ER:
1097 tmpoutptr = &SmapDrivPrivData->RuntimeStats_NetDev.m_Rx_Frame_Er;
1099 case sceInetNDCC_GET_RX_FIFO_ER:
1100 tmpoutptr = &SmapDrivPrivData->RuntimeStats_NetDev.m_Rx_Fifo_Er;
1102 case sceInetNDCC_GET_RX_MISSED_ER:
1103 tmpoutptr = &SmapDrivPrivData->RuntimeStats_NetDev.m_Rx_Missed_Er;
1105 case sceInetNDCC_GET_TX_ABORTED_ER:
1106 tmpoutptr = &SmapDrivPrivData->RuntimeStats_NetDev.m_Tx_Aborted_Er;
1108 case sceInetNDCC_GET_TX_CARRIER_ER:
1109 tmpoutptr = &SmapDrivPrivData->RuntimeStats_NetDev.m_Tx_Carrier_Er;
1111 case sceInetNDCC_GET_TX_FIFO_ER:
1112 tmpoutptr = &SmapDrivPrivData->RuntimeStats_NetDev.m_Tx_Fifo_Er;
1114 case sceInetNDCC_GET_TX_HEARTBEAT_ER:
1115 tmpoutptr = &SmapDrivPrivData->RuntimeStats_NetDev.m_Tx_Heartbeat_Er;
1117 case sceInetNDCC_GET_TX_WINDOW_ER:
1118 tmpoutptr = &SmapDrivPrivData->RuntimeStats_NetDev.m_Tx_Window_Er;
1120 case sceInetNDCC_GET_RX_PACKETS:
1121 tmpoutptr = &SmapDrivPrivData->RuntimeStats_NetDev.m_Rx_Packets;
1123 case sceInetNDCC_GET_TX_PACKETS:
1124 tmpoutptr = &SmapDrivPrivData->RuntimeStats_NetDev.m_Tx_Packets;
1126 case sceInetNDCC_GET_RX_BYTES:
1127 tmpoutptr = &SmapDrivPrivData->RuntimeStats_NetDev.m_Rx_Bytes;
1129 case sceInetNDCC_GET_TX_BYTES:
1130 tmpoutptr = &SmapDrivPrivData->RuntimeStats_NetDev.m_Tx_Bytes;
1132 case sceInetNDCC_GET_RX_ERRORS:
1133 tmpoutptr = &SmapDrivPrivData->RuntimeStats_NetDev.m_Rx_Errors;
1135 case sceInetNDCC_GET_TX_ERRORS:
1136 tmpoutptr = &SmapDrivPrivData->RuntimeStats_NetDev.m_Tx_Errors;
1138 case sceInetNDCC_GET_RX_DROPPED:
1139 tmpoutptr = &SmapDrivPrivData->RuntimeStats_NetDev.m_Rx_Dropped;
1141 case sceInetNDCC_GET_TX_DROPPED:
1142 tmpoutptr = &SmapDrivPrivData->RuntimeStats_NetDev.m_Tx_Dropped;
1144 case sceInetNDCC_GET_RX_BROADCAST_PACKETS:
1145 tmpoutptr = &SmapDrivPrivData->RuntimeStats_NetDev.m_Rx_Broadcast_Packets;
1147 case sceInetNDCC_GET_TX_BROADCAST_PACKETS:
1148 tmpoutptr = &SmapDrivPrivData->RuntimeStats_NetDev.m_Tx_Broadcast_Packets;
1150 case sceInetNDCC_GET_RX_BROADCAST_BYTES:
1151 tmpoutptr = &SmapDrivPrivData->RuntimeStats_NetDev.m_Rx_Broadcast_Bytes;
1153 case sceInetNDCC_GET_TX_BROADCAST_BYTES:
1154 tmpoutptr = &SmapDrivPrivData->RuntimeStats_NetDev.m_Tx_Broadcast_Bytes;
1156 case sceInetNDCC_GET_RX_MULTICAST_PACKETS:
1157 tmpoutptr = &SmapDrivPrivData->RuntimeStats_NetDev.m_Rx_Multicast_Packets;
1159 case sceInetNDCC_GET_TX_MULTICAST_PACKETS:
1160 tmpoutptr = &SmapDrivPrivData->RuntimeStats_NetDev.m_Tx_Multicast_Packets;
1162 case sceInetNDCC_GET_RX_MULTICAST_BYTES:
1163 tmpoutptr = &SmapDrivPrivData->RuntimeStats_NetDev.m_Rx_Multicast_Bytes;
1165 case sceInetNDCC_GET_TX_MULTICAST_BYTES:
1166 tmpoutptr = &SmapDrivPrivData->RuntimeStats_NetDev.m_Tx_Multicast_Bytes;
1168 case sceInetNDCC_SET_MULTICAST_LIST:
1169 result = do_set_multicast_list_helper(SmapDrivPrivData, in_out_ptr, in_out_len);
1175 if (tmpoutptr && in_out_ptr && in_out_len == 4) {
1176 memcpy(in_out_ptr, tmpoutptr, in_out_len);
1185 result = SMAPGetMACAddress(output);
1187 case NETMAN_NETIF_IOCTL_ETH_GET_LINK_MODE:
1188 result = SMAPGetLinkMode();
1190 case NETMAN_NETIF_IOCTL_GET_LINK_STATUS:
1191 result = SMAPGetLinkStatus();
1193 case NETMAN_NETIF_IOCTL_GET_TX_DROPPED_COUNT:
1196 case NETMAN_NETIF_IOCTL_GET_RX_DROPPED_COUNT:
1199 case NETMAN_NETIF_IOCTL_ETH_GET_RX_EOVERRUN_CNT:
1202 case NETMAN_NETIF_IOCTL_ETH_GET_RX_EBADLEN_CNT:
1205 case NETMAN_NETIF_IOCTL_ETH_GET_RX_EBADFCS_CNT:
1208 case NETMAN_NETIF_IOCTL_ETH_GET_RX_EBADALIGN_CNT:
1211 case NETMAN_NETIF_IOCTL_ETH_GET_TX_ELOSSCR_CNT:
1214 case NETMAN_NETIF_IOCTL_ETH_GET_TX_EEDEFER_CNT:
1217 case NETMAN_NETIF_IOCTL_ETH_GET_TX_ECOLL_CNT:
1220 case NETMAN_NETIF_IOCTL_ETH_GET_TX_EUNDERRUN_CNT:
1224 result = SMAPSetLinkMode(*(
int *)args);
1226 case NETMAN_NETIF_IOCTL_ETH_GET_STATUS:
1245void SMAPOutputDebugInformation(
void)
1247#ifdef SMAP_ENABLE_DEBUG_INFORMATION
1248 USE_SMAP_EMAC3_REGS;
1254 DEBUG_PRINTF(
"SMAP_R_RXFIFO_CTRL: 0x%x\n", SMAP_REG8(SMAP_R_RXFIFO_CTRL));
1255 DEBUG_PRINTF(
"SMAP_R_RXFIFO_RD_PTR: 0x%x\n", SMAP_REG16(SMAP_R_RXFIFO_RD_PTR));
1256 DEBUG_PRINTF(
"SMAP_R_RXFIFO_SIZE: %d\n", SMAP_REG16(SMAP_R_RXFIFO_SIZE));
1257 DEBUG_PRINTF(
"SMAP_R_RXFIFO_FRAME_CNT: %d\n", SMAP_REG8(SMAP_R_RXFIFO_FRAME_CNT));
1258 DEBUG_PRINTF(
"SMAP_R_RXFIFO_FRAME_DEC: %d\n", SMAP_REG8(SMAP_R_RXFIFO_FRAME_DEC));
1259 DEBUG_PRINTF(
"SMAP_R_EMAC3_RxMODE: 0x%x\n", (
unsigned int)SMAP_EMAC3_GET32(SMAP_R_EMAC3_RxMODE));
1260 DEBUG_PRINTF(
"SMAP_R_EMAC3_INTR_STAT: 0x%x\n", (
unsigned int)SMAP_EMAC3_GET32(SMAP_R_EMAC3_INTR_STAT));
1261 DEBUG_PRINTF(
"SMAP_R_EMAC3_INTR_ENABLE: 0x%x\n", (
unsigned int)SMAP_EMAC3_GET32(SMAP_R_EMAC3_INTR_ENABLE));
1263 for (i = 0; i < SMAP_BD_MAX_ENTRY; i += 1) {
1265 rx_bd[i].reserved != 0 ||
1266 rx_bd[i].length != 0 ||
1267 rx_bd[i].pointer != 0 ||
1270 DEBUG_PRINTF(
" - rx_bd[%d]: 0x%x / 0x%x / %d / 0x%x <--\n", i, rx_bd[i].ctrl_stat, rx_bd[i].reserved, rx_bd[i].length, rx_bd[i].pointer);
1272 DEBUG_PRINTF(
" - rx_bd[%d]: 0x%x / 0x%x / %d / 0x%x\n", i, rx_bd[i].ctrl_stat, rx_bd[i].reserved, rx_bd[i].length, rx_bd[i].pointer);
1276 DEBUG_PRINTF(
"RxDroppedFrameCount: %d\n", (
int)
SmapDriverData.RuntimeStats.RxDroppedFrameCount);
1277 DEBUG_PRINTF(
"RxErrorCount: %d\n", (
int)
SmapDriverData.RuntimeStats.RxErrorCount);
1278 DEBUG_PRINTF(
"RxFrameOverrunCount: %d\n",
SmapDriverData.RuntimeStats.RxFrameOverrunCount);
1279 DEBUG_PRINTF(
"RxFrameBadLengthCount: %d\n",
SmapDriverData.RuntimeStats.RxFrameBadLengthCount);
1280 DEBUG_PRINTF(
"RxFrameBadFCSCount: %d\n",
SmapDriverData.RuntimeStats.RxFrameBadFCSCount);
1281 DEBUG_PRINTF(
"RxFrameBadAlignmentCount: %d\n",
SmapDriverData.RuntimeStats.RxFrameBadAlignmentCount);
1282 DEBUG_PRINTF(
"TxDroppedFrameCount: %d\n", (
int)
SmapDriverData.RuntimeStats.TxDroppedFrameCount);
1283 DEBUG_PRINTF(
"TxErrorCount: %d\n", (
int)
SmapDriverData.RuntimeStats.TxErrorCount);
1284 DEBUG_PRINTF(
"TxFrameLOSSCRCount: %d\n",
SmapDriverData.RuntimeStats.TxFrameLOSSCRCount);
1285 DEBUG_PRINTF(
"TxFrameEDEFERCount: %d\n",
SmapDriverData.RuntimeStats.TxFrameEDEFERCount);
1286 DEBUG_PRINTF(
"TxFrameCollisionCount: %d\n",
SmapDriverData.RuntimeStats.TxFrameCollisionCount);
1287 DEBUG_PRINTF(
"TxFrameUnderrunCount: %d\n",
SmapDriverData.RuntimeStats.TxFrameUnderrunCount);
1288 DEBUG_PRINTF(
"RxAllocFail: %d\n",
SmapDriverData.RuntimeStats.RxAllocFail);
1292#ifdef BUILDING_SMAP_MODULAR
1296 if (priority != 0) {
1300 if (hooktbl != NULL) {
1301 if (hooktbl->Version != 1) {
1311 .GetMACAddress = &SMAPGetMACAddress,
1313 .OutputDebugInformation = &SMAPOutputDebugInformation,
1314 .RegisterHook = &SMapRegisterHook,
1325static inline int SetupNetDev(
void)
1330#ifdef BUILDING_SMAP_NETDEV
1331 u32 mac_address_lo, mac_address_hi;
1333 volatile u8 *emac3_regbase;
1335#ifdef BUILDING_SMAP_NETMAN
1348#ifdef BUILDING_SMAP_NETDEV
1353 SmapDriverData.m_devops.device_name =
"Ethernet (Network Adaptor)";
1356 SmapDriverData.m_devops.flags = sceInetDevF_ARP | sceInetDevF_Multicast | sceInetDevF_NIC;
1365 mac_address_hi = SMAP_EMAC3_GET32(SMAP_R_EMAC3_ADDR_HI);
1366 mac_address_lo = SMAP_EMAC3_GET32(SMAP_R_EMAC3_ADDR_LO);
1376 EventFlagData.attr = 0;
1377 EventFlagData.option = 0;
1378 EventFlagData.bits = 0;
1380 if ((result =
SmapDriverData.Dev9IntrEventFlag = CreateEventFlag(&EventFlagData)) < 0) {
1381 DEBUG_PRINTF(
"CreateEventFlag -> %d\n", result);
1385 ThreadData.attr = TH_C;
1386 ThreadData.thread = (
void *)&IntrHandlerThread;
1387 ThreadData.option = 0;
1388 ThreadData.priority = ThreadPriority;
1389 ThreadData.stacksize = ThreadStackSize;
1390 if ((result =
SmapDriverData.IntrHandlerThreadID = CreateThread(&ThreadData)) < 0) {
1391 DEBUG_PRINTF(
"CreateThread -> %d\n", result);
1397 sceInetPrintf(
"smap: StartThread -> %d\n", result);
1403#ifdef BUILDING_SMAP_NETMAN
1404 if ((
SmapDriverData.NetIFID = NetManRegisterNetIF(&device)) < 0) {
1405 sceInetPrintf(
"smap: NetManRegisterNetIF -> %d\n", result);
1413#ifdef BUILDING_SMAP_NETDEV
1414 if ((result = sceInetRegisterNetDevice(&
SmapDriverData.m_devops)) < 0) {
1415 sceInetPrintf(
"smap: sceInetRegisterNetDevice -> %d\n", result);
1426static int ParseSmapConfiguration(
const char *cmd,
unsigned int *configuration)
1428 const char *CmdStart, *DigitStart;
1429 unsigned int result, base, character, value;
1431 DigitStart = CmdStart = cmd;
1434 if (CmdStart[0] ==
'0') {
1435 if (CmdStart[1] !=
'\0') {
1436 if (CmdStart[1] ==
'x') {
1444 if (DigitStart[0] ==
'\0') {
1449 character = DigitStart[0];
1451 if (character -
'0' < 10) {
1452 value = character -
'0';
1453 }
else if (character -
'a' < 6) {
1454 value = character -
'a' - 0x57;
1461 result = result * base + value;
1462 }
while ((character = *(++DigitStart)) !=
'\0');
1463 *configuration = result;
1467 sceInetPrintf(
"smap: %s: %s - invalid digit\n",
"scan_number", CmdStart);
1471int smap_init(
int argc,
char *argv[])
1474 const char *CmdString;
1475 u16 eeprom_data[4], checksum16;
1479 USE_SMAP_EMAC3_REGS;
1484#if defined(BUILDING_SMAP_NETMAN) || defined(BUILDING_SMAP_NETDEV)
1490 if (strcmp(
"-help", *argv) == 0) {
1491 return DisplayHelpMessage();
1492 }
else if (strcmp(
"-version", *argv) == 0) {
1493 return DisplayBanner();
1494 }
else if (strcmp(
"-verbose", *argv) == 0) {
1495 EnableVerboseOutput = 1;
1496 }
else if (strcmp(
"-auto", *argv) == 0) {
1497 EnableAutoNegotiation = 1;
1498 }
else if (strcmp(
"-no_auto", *argv) == 0) {
1499 EnableAutoNegotiation = 0;
1500 }
else if (strcmp(
"-strap", *argv) == 0) {
1501 EnablePinStrapConfig = 1;
1502 }
else if (strcmp(
"-no_strap", *argv) == 0) {
1503 EnablePinStrapConfig = 0;
1504 }
else if (strncmp(
"thpri=", *argv, 6) == 0) {
1505 CmdString = &(*argv)[6];
1506 if (isdigit(CmdString[0])) {
1507 ThreadPriority = strtoul(&(*argv)[6], NULL, 10);
1508 if (ThreadPriority - 9 >= 0x73) {
1509 return DisplayHelpMessage();
1512 if ((*argv)[6] !=
'\0') {
1513 while (isdigit(*CmdString)) {
1516 if (*CmdString !=
'\0')
1517 return DisplayHelpMessage();
1520 return DisplayHelpMessage();
1521 }
else if (strncmp(
"thstack=", *argv, 8) == 0) {
1522 CmdString = &(*argv)[8];
1523 if (isdigit(CmdString[0])) {
1524 ThreadStackSize = strtoul(&(*argv)[8], NULL, 10);
1525 if ((*argv)[8] !=
'\0') {
1526 while (isdigit(*CmdString)) {
1531 if (strcmp(CmdString,
"KB") == 0)
1532 ThreadStackSize <<= 10;
1534 return DisplayHelpMessage();
1536 if (ParseSmapConfiguration(*argv, &SmapConfiguration) != 0)
1537 return DisplayHelpMessage();
1545 return DisplayHelpMessage();
1549 if ((SPD_REG16(SPD_R_REV_3) & SPD_CAPS_SMAP) == 0)
1551 if (SPD_REG16(SPD_R_REV_1) < 0x11)
1554 SpdIntrDisable(DEV9_SMAP_ALL_INTR_MASK);
1557 SMAP_REG8(SMAP_R_TXFIFO_CTRL) = SMAP_TXFIFO_RESET;
1558 for (i = 9; SMAP_REG8(SMAP_R_TXFIFO_CTRL) & SMAP_TXFIFO_RESET; i--) {
1564 SMAP_REG8(SMAP_R_RXFIFO_CTRL) = SMAP_RXFIFO_RESET;
1565 for (i = 9; SMAP_REG8(SMAP_R_RXFIFO_CTRL) & SMAP_RXFIFO_RESET; i--) {
1571 SMAP_EMAC3_SET32(SMAP_R_EMAC3_MODE0, SMAP_E3_SOFT_RESET);
1572 for (i = 9; SMAP_EMAC3_GET32(SMAP_R_EMAC3_MODE0) & SMAP_E3_SOFT_RESET; i--) {
1578 SMAP_REG8(SMAP_R_BD_MODE) = 0;
1579 for (i = 0; i < SMAP_BD_MAX_ENTRY; i++) {
1580 tx_bd[i].ctrl_stat = 0;
1581 tx_bd[i].reserved = 0;
1582 tx_bd[i].length = 0;
1583 tx_bd[i].pointer = 0;
1586 for (i = 0; i < SMAP_BD_MAX_ENTRY; i++) {
1588 rx_bd[i].reserved = 0;
1589 rx_bd[i].length = 0;
1590 rx_bd[i].pointer = 0;
1593 SMAP_REG16(SMAP_R_INTR_CLR) = DEV9_SMAP_ALL_INTR_MASK;
1596 bzero(eeprom_data, 8);
1597 if ((result = SpdGetEthernetID(eeprom_data)) < 0) {
1598 return (result == -1 ? -7 : -4);
1601 for (i = 0; i < 3; i++)
1602 checksum16 += eeprom_data[i];
1603 if (eeprom_data[0] == 0 && eeprom_data[1] == 0 && eeprom_data[2] == 0) {
1606 if (checksum16 != eeprom_data[3])
1609 SMAP_EMAC3_SET32(SMAP_R_EMAC3_MODE1, SMAP_E3_FDX_ENABLE | SMAP_E3_IGNORE_SQE | SMAP_E3_MEDIA_100M | SMAP_E3_RXFIFO_2K | SMAP_E3_TXFIFO_1K | SMAP_E3_TXREQ0_MULTI | SMAP_E3_TXREQ1_SINGLE);
1612 SMAP_EMAC3_SET32(SMAP_R_EMAC3_RxMODE, SMAP_E3_RX_STRIP_PAD | SMAP_E3_RX_STRIP_FCS | SMAP_E3_RX_INDIVID_ADDR | SMAP_E3_RX_BCAST | SMAP_E3_RX_MCAST);
1613 SMAP_EMAC3_SET32(SMAP_R_EMAC3_INTR_STAT, SMAP_E3_INTR_TX_ERR_0 | SMAP_E3_INTR_SQE_ERR_0 | SMAP_E3_INTR_DEAD_0);
1614 SMAP_EMAC3_SET32(SMAP_R_EMAC3_INTR_ENABLE, SMAP_E3_INTR_TX_ERR_0 | SMAP_E3_INTR_SQE_ERR_0 | SMAP_E3_INTR_DEAD_0);
1616 mac_address = (u16)(eeprom_data[0] >> 8 | eeprom_data[0] << 8);
1617 SMAP_EMAC3_SET32(SMAP_R_EMAC3_ADDR_HI, mac_address);
1619 mac_address = ((u16)(eeprom_data[1] >> 8 | eeprom_data[1] << 8) << 16) | (u16)(eeprom_data[2] >> 8 | eeprom_data[2] << 8);
1620 SMAP_EMAC3_SET32(SMAP_R_EMAC3_ADDR_LO, mac_address);
1622 SMAP_EMAC3_SET32(SMAP_R_EMAC3_PAUSE_TIMER, 0xFFFF);
1623 SMAP_EMAC3_SET32(SMAP_R_EMAC3_GROUP_HASH1, 0);
1624 SMAP_EMAC3_SET32(SMAP_R_EMAC3_GROUP_HASH2, 0);
1625 SMAP_EMAC3_SET32(SMAP_R_EMAC3_GROUP_HASH3, 0);
1626 SMAP_EMAC3_SET32(SMAP_R_EMAC3_GROUP_HASH4, 0);
1628 SMAP_EMAC3_SET32(SMAP_R_EMAC3_INTER_FRAME_GAP, 4);
1630 SMAP_EMAC3_SET32(SMAP_R_EMAC3_TX_THRESHOLD, (12 & SMAP_E3_TX_THRESHLD_MSK) << SMAP_E3_TX_THRESHLD_BITSFT);
1632 SMAP_EMAC3_SET32(SMAP_R_EMAC3_RX_WATERMARK, (16 & SMAP_E3_RX_LO_WATER_MSK) << SMAP_E3_RX_LO_WATER_BITSFT | (128 & SMAP_E3_RX_HI_WATER_MSK) << SMAP_E3_RX_HI_WATER_BITSFT);
1635 for (i = 2; i < 7; i++)
1636 SpdRegisterIntrHandler(i, &Dev9IntrCb);
1638 dev9RegisterPreDmaCb(1, &Dev9PreDmaCbHandler);
1639 dev9RegisterPostDmaCb(1, &Dev9PostDmaCbHandler);
1641 return SetupNetDev();
1644#ifdef BUILDING_SMAP_NETDEV
1645int smap_deinit(
void)
1649 volatile u8 *emac3_regbase;
1652 sceInetPrintf(
"smap: can't unload (busy)\n");
1665 CancelAlarm((
unsigned int (*)(
void *))LinkCheckTimerCB, &
SmapDriverData);
1666 dev9RegisterPreDmaCb(1, NULL);
1667 dev9RegisterPostDmaCb(1, NULL);
1668 for (i = 2; i < 7; i++) {
1669 dev9RegisterIntrCb(i, NULL);
1671 dev9IntrDisable(DEV9_SMAP_INTR_MASK2);
1672 SMAP_EMAC3_SET32(SMAP_R_EMAC3_MODE0, 0);
1677int SMAPGetMACAddress(u8 *buffer)
1679 u32 mac_address_lo, mac_address_hi;
1681 volatile u8 *emac3_regbase;
1688 mac_address_hi = SMAP_EMAC3_GET32(SMAP_R_EMAC3_ADDR_HI);
1689 mac_address_lo = SMAP_EMAC3_GET32(SMAP_R_EMAC3_ADDR_LO);
1693 buffer[0] = mac_address_hi >> 8;
1694 buffer[1] = mac_address_hi;
1695 buffer[2] = mac_address_lo >> 24;
1696 buffer[3] = mac_address_lo >> 16;
1697 buffer[4] = mac_address_lo >> 8;
1698 buffer[5] = mac_address_lo;
int CpuResumeIntr(int state)
int QueryIntrContext(void)
int CpuSuspendIntr(int *state)
@ NETMAN_NETIF_ETH_LINK_MODE_100M_HDX
@ NETMAN_NETIF_ETH_LINK_MODE_10M_FDX
@ NETMAN_NETIF_ETH_LINK_MODE_10M_HDX
@ NETMAN_NETIF_ETH_LINK_MODE_AUTO
@ NETMAN_NETIF_ETH_LINK_MODE_100M_FDX
@ NETMAN_NETIF_IOCTL_ETH_GET_MAC
@ NETMAN_NETIF_IOCTL_ETH_SET_LINK_MODE
#define NETMAN_NETIF_ETH_LINK_DISABLE_PAUSE
#define SMAP_BD_TX_EDEFER
#define SMAP_E3_TX_URG_REQ_BITSFT
#define SMAP_BD_TX_UNDERRUN
#define SMAP_PHY_ANAR_10_FD
#define SMAP_PHY_BMSR_ANCP
#define SMAP_E3_FLOWCTRL_ENABLE
#define SMAP_E3_PHY_OP_COMP
#define SMAP_PHY_ANAR_TX_FD
#define SMAP_E3_TX_URG_REQ_MSK
#define SMAP_PHY_10BTSCR_LOOPBACK_10_DIS
#define SMAP_PHY_BMSR_LINK
#define SMAP_PHY_10BTSCR_2
#define SMAP_E3_TX_LOW_REQ_BITSFT
#define SMAP_BD_TX_LOSSCR
#define SMAP_E3_TX_LOW_REQ_MSK