From f077cc96df127bef807d45827337bd449a195a68 Mon Sep 17 00:00:00 2001 From: Eric Norum Date: Mon, 20 Jun 2005 20:48:48 +0000 Subject: Clean up transmit buffer realignment. Many thanks to Mr. Kolja Waschk for identifying the problem. --- c/src/lib/libbsp/m68k/uC5282/ChangeLog | 5 + c/src/lib/libbsp/m68k/uC5282/README | 12 +-- c/src/lib/libbsp/m68k/uC5282/network/network.c | 141 +++++++++++++------------ 3 files changed, 84 insertions(+), 74 deletions(-) (limited to 'c') diff --git a/c/src/lib/libbsp/m68k/uC5282/ChangeLog b/c/src/lib/libbsp/m68k/uC5282/ChangeLog index 7f9efd1552..2ea36056b2 100644 --- a/c/src/lib/libbsp/m68k/uC5282/ChangeLog +++ b/c/src/lib/libbsp/m68k/uC5282/ChangeLog @@ -1,3 +1,8 @@ +2005-06-20 Eric Norum + + * network/network.c: Clean up transmit buffer realignment. Many thanks to + Mr. Kolja Waschk for identifying the problem. + 2005-05-26 Ralf Corsepius * include/bsp.h: New header guard. diff --git a/c/src/lib/libbsp/m68k/uC5282/README b/c/src/lib/libbsp/m68k/uC5282/README index fd73af9055..25f6fbe22f 100644 --- a/c/src/lib/libbsp/m68k/uC5282/README +++ b/c/src/lib/libbsp/m68k/uC5282/README @@ -78,16 +78,16 @@ port into RAM then executed or programmed into flash memory. 2) (first time only) Set the uC5282 board Internet configuration: - setenv IPADDR0 www.xxx.yyy.zzz (Your board's address) - setenv NETMASK ppp.qqq.rrr.sss (Your local network address mask) - setenv HOSTNAME somename (Your board's name) + setenv IPADDR0 www.xxx.yyy.zzz (Your board's address) + setenv NETMASK ppp.qqq.rrr.sss (Your local network address mask) + setenv HOSTNAME somename (Your board's name) 3) Type 'tftp' 4) Run 'tftp' on your host machine: - tftp> binary - tftp> connect www.xxx.yyy.zzz (Your ucDIMM's address) - tftp> put someFile.exe + tftp> binary + tftp> connect www.xxx.yyy.zzz (Your ucDIMM's address) + tftp> put someFile.exe (someFile.boot for the EPICS build system) 5) When the file has downloaded press the key to terminate the uCDIMM tftp command. diff --git a/c/src/lib/libbsp/m68k/uC5282/network/network.c b/c/src/lib/libbsp/m68k/uC5282/network/network.c index 81de993b70..b2db329c9f 100644 --- a/c/src/lib/libbsp/m68k/uC5282/network/network.c +++ b/c/src/lib/libbsp/m68k/uC5282/network/network.c @@ -1,10 +1,5 @@ /* * RTEMS/TCPIP driver for MCF5282 Fast Ethernet Controller - * - * TO DO: Check network stack code -- Is it possible force longword alignment - * of all tx mbufs? If so, the stupid - * realignment code in the output routine - * could be removed. */ #include @@ -103,7 +98,7 @@ struct mcf5282_enet_struct { unsigned long txInterrupts; unsigned long txRawWait; unsigned long txRealign; - unsigned long txRealignBytes; + unsigned long txRealignDrop; }; static struct mcf5282_enet_struct enet_driver[NIFACES]; @@ -320,11 +315,14 @@ static void fec_retire_tx_bd(volatile struct mcf5282_enet_struct *sc ) { struct mbuf *m, *n; + uint16_t status; while ((sc->txBdActiveCount != 0) - && ((sc->txBdBase[sc->txBdTail].status & MCF5282_FEC_TxBD_R) == 0)) { - m = sc->txMbuf[sc->txBdTail]; - MFREE(m, n); + && (((status = sc->txBdBase[sc->txBdTail].status) & MCF5282_FEC_TxBD_R) == 0)) { + if ((status & MCF5282_FEC_TxBD_TO1) == 0) { + m = sc->txMbuf[sc->txBdTail]; + MFREE(m, n); + } if (++sc->txBdTail == sc->txBdCount) sc->txBdTail = 0; sc->txBdActiveCount--; @@ -337,7 +335,7 @@ fec_rxDaemon (void *arg) volatile struct mcf5282_enet_struct *sc = (volatile struct mcf5282_enet_struct *)arg; struct ifnet *ifp = (struct ifnet* )&sc->arpcom.ac_if; struct mbuf *m; - volatile uint16_t status; + uint16_t status; volatile mcf5282BufferDescriptor_t *rxBd; int rxBdIndex; @@ -454,6 +452,7 @@ fec_sendpacket(struct ifnet *ifp, struct mbuf *m) struct mcf5282_enet_struct *sc = ifp->if_softc; volatile mcf5282BufferDescriptor_t *firstTxBd, *txBd; uint16_t status; + int offset; int nAdded; /* @@ -471,7 +470,7 @@ fec_sendpacket(struct ifnet *ifp, struct mbuf *m) nAdded = 0; firstTxBd = sc->txBdBase + sc->txBdHead; - for (;;) { + while (m != NULL) { /* * Wait for buffer descriptor to become available */ @@ -517,56 +516,62 @@ fec_sendpacket(struct ifnet *ifp, struct mbuf *m) txBd = sc->txBdBase + sc->txBdHead; if (m->m_len) { char *p = mtod(m, char *); - /* - * Stupid FEC can't handle misaligned data! - * Given the way that mbuf's are layed out it should be - * safe to shuffle the data down like this..... - * Perhaps this code could be improved with a "Duff's Device". - */ - if ((int)p & 0x3) { - int l = m->m_len; - char *dest = p - ((int)p & 0x3); - uint16_t *o = (uint16_t *)dest, *i = (uint16_t *)p; - while (l > 0) { - *o++ = *i++; - l -= sizeof(uint16_t); - } - p = dest; + if ((offset = (int)p & 0x3) == 0) { + txBd->buffer = p; + txBd->length = m->m_len; + sc->txMbuf[sc->txBdHead] = m; + m = m->m_next; + } + else { + /* + * Stupid FEC can't handle misaligned data! + * Move offending bytes to a local buffer. + * Use buffer descriptor TO1 bit to indicate this. + */ + int nmove = 4 - offset; + char *d = (char *)&sc->txMbuf[sc->txBdHead]; + status |= MCF5282_FEC_TxBD_TO1; sc->txRealign++; - sc->txRealignBytes += m->m_len; + if (nmove > m->m_len) + nmove = m->m_len; + m->m_data += nmove; + m->m_len -= nmove; + txBd->buffer = d; + txBd->length = nmove; + while (nmove--) + *d++ = *p++; + if (m->m_len == 0) { + struct mbuf *n; + sc->txRealignDrop++; + MFREE(m, n); + m = n; + } } - txBd->buffer = p; - txBd->length = m->m_len; - sc->txMbuf[sc->txBdHead] = m; nAdded++; if (++sc->txBdHead == sc->txBdCount) { status |= MCF5282_FEC_TxBD_W; sc->txBdHead = 0; } - m = m->m_next; + txBd->status = status; } else { /* - * Just toss empty mbufs + * Toss empty mbufs. */ struct mbuf *n; MFREE(m, n); m = n; } - if (m == NULL) { - if (nAdded) { - txBd->status = status | MCF5282_FEC_TxBD_R - | MCF5282_FEC_TxBD_L - | MCF5282_FEC_TxBD_TC; - if (nAdded > 1) - firstTxBd->status |= MCF5282_FEC_TxBD_R; - MCF5282_FEC_TDAR = 0; - sc->txBdActiveCount += nAdded; - } - break; - } - txBd->status = status; } + if (nAdded) { + txBd->status = status | MCF5282_FEC_TxBD_R + | MCF5282_FEC_TxBD_L + | MCF5282_FEC_TxBD_TC; + if (nAdded > 1) + firstTxBd->status |= MCF5282_FEC_TxBD_R; + MCF5282_FEC_TDAR = 0; + sc->txBdActiveCount += nAdded; + } } void @@ -699,37 +704,37 @@ enet_stats(struct mcf5282_enet_struct *sc) printf(" Rx Octets OK:%-10lu\n", MCF5282_FEC_IEEE_R_OCTETS_OK); printf(" Tx Interrupts:%-10lu", sc->txInterrupts); printf("Tx Output Waits:%-10lu", sc->txRawWait); - printf("Tx Realignments:%-10lu\n", sc->txRealign); - printf(" Tx RealignByte:%-10lu", sc->txRealignBytes); - printf(" Tx Unaccounted:%-10lu", MCF5282_FEC_RMON_T_DROP); - printf("Tx Packet Count:%-10lu\n", MCF5282_FEC_RMON_T_PACKETS); + printf("Tx mbuf realign:%-10lu\n", sc->txRealign); + printf("Tx realign drop:%-10lu", sc->txRealignDrop); + printf(" Tx Unaccounted:%-10lu", MCF5282_FEC_RMON_T_DROP); + printf("Tx Packet Count:%-10lu\n", MCF5282_FEC_RMON_T_PACKETS); printf(" Tx Broadcast:%-10lu", MCF5282_FEC_RMON_T_BC_PKT); - printf(" Tx Multicast:%-10lu", MCF5282_FEC_RMON_T_MC_PKT); - printf("CRC/Align error:%-10lu\n", MCF5282_FEC_RMON_T_CRC_ALIGN); + printf(" Tx Multicast:%-10lu", MCF5282_FEC_RMON_T_MC_PKT); + printf("CRC/Align error:%-10lu\n", MCF5282_FEC_RMON_T_CRC_ALIGN); printf(" Tx Undersize:%-10lu", MCF5282_FEC_RMON_T_UNDERSIZE); - printf(" Tx Oversize:%-10lu", MCF5282_FEC_RMON_T_OVERSIZE); - printf(" Tx Fragment:%-10lu\n", MCF5282_FEC_RMON_T_FRAG); + printf(" Tx Oversize:%-10lu", MCF5282_FEC_RMON_T_OVERSIZE); + printf(" Tx Fragment:%-10lu\n", MCF5282_FEC_RMON_T_FRAG); printf(" Tx Jabber:%-10lu", MCF5282_FEC_RMON_T_JAB); - printf(" Tx Collisions:%-10lu", MCF5282_FEC_RMON_T_COL); - printf(" Tx 64:%-10lu\n", MCF5282_FEC_RMON_T_P64); + printf(" Tx Collisions:%-10lu", MCF5282_FEC_RMON_T_COL); + printf(" Tx 64:%-10lu\n", MCF5282_FEC_RMON_T_P64); printf(" Tx 65-127:%-10lu", MCF5282_FEC_RMON_T_P65TO127); - printf(" Tx 128-255:%-10lu", MCF5282_FEC_RMON_T_P128TO255); - printf(" Tx 256-511:%-10lu\n", MCF5282_FEC_RMON_T_P256TO511); + printf(" Tx 128-255:%-10lu", MCF5282_FEC_RMON_T_P128TO255); + printf(" Tx 256-511:%-10lu\n", MCF5282_FEC_RMON_T_P256TO511); printf(" Tx 511-1023:%-10lu", MCF5282_FEC_RMON_T_P512TO1023); - printf(" Tx 1024-2047:%-10lu", MCF5282_FEC_RMON_T_P1024TO2047); - printf(" Tx >=2048:%-10lu\n", MCF5282_FEC_RMON_T_P_GTE2048); + printf(" Tx 1024-2047:%-10lu", MCF5282_FEC_RMON_T_P1024TO2047); + printf(" Tx >=2048:%-10lu\n", MCF5282_FEC_RMON_T_P_GTE2048); printf(" Tx Octets:%-10lu", MCF5282_FEC_RMON_T_OCTETS); - printf(" Tx Dropped:%-10lu", MCF5282_FEC_IEEE_T_DROP); - printf(" Tx Frame OK:%-10lu\n", MCF5282_FEC_IEEE_T_FRAME_OK); + printf(" Tx Dropped:%-10lu", MCF5282_FEC_IEEE_T_DROP); + printf(" Tx Frame OK:%-10lu\n", MCF5282_FEC_IEEE_T_FRAME_OK); printf(" Tx 1 Collision:%-10lu", MCF5282_FEC_IEEE_T_1COL); - printf("Tx >1 Collision:%-10lu", MCF5282_FEC_IEEE_T_MCOL); - printf(" Tx Deferred:%-10lu\n", MCF5282_FEC_IEEE_T_DEF); + printf("Tx >1 Collision:%-10lu", MCF5282_FEC_IEEE_T_MCOL); + printf(" Tx Deferred:%-10lu\n", MCF5282_FEC_IEEE_T_DEF); printf(" Late Collision:%-10lu", MCF5282_FEC_IEEE_T_LCOL); - printf(" Excessive Coll:%-10lu", MCF5282_FEC_IEEE_T_EXCOL); - printf(" FIFO Underrun:%-10lu\n", MCF5282_FEC_IEEE_T_MACERR); + printf(" Excessive Coll:%-10lu", MCF5282_FEC_IEEE_T_EXCOL); + printf(" FIFO Underrun:%-10lu\n", MCF5282_FEC_IEEE_T_MACERR); printf(" Carrier Error:%-10lu", MCF5282_FEC_IEEE_T_CSERR); - printf(" Tx SQE Error:%-10lu", MCF5282_FEC_IEEE_T_SQE); - printf("Tx Pause Frames:%-10lu\n", MCF5282_FEC_IEEE_T_FDXFC); + printf(" Tx SQE Error:%-10lu", MCF5282_FEC_IEEE_T_SQE); + printf("Tx Pause Frames:%-10lu\n", MCF5282_FEC_IEEE_T_FDXFC); printf(" Tx Octets OK:%-10lu\n", MCF5282_FEC_IEEE_T_OCTETS_OK); printf(" EIR:%8.8lx ", MCF5282_FEC_EIR); printf("EIMR:%8.8lx ", MCF5282_FEC_EIMR); @@ -746,7 +751,7 @@ enet_stats(struct mcf5282_enet_struct *sc) * Yes, there are races here with adding and retiring descriptors, * but this diagnostic is more for when things have backed up. */ - printf("Transmit Buffer Descriptors (Tail %d, Head %d, Active %d):\n", + printf("Transmit Buffer Descriptors (Tail %d, Head %d, Unretired %d):\n", sc->txBdTail, sc->txBdHead, sc->txBdActiveCount); -- cgit v1.2.3