Changeset f077cc96 in rtems


Ignore:
Timestamp:
06/20/05 20:48:48 (17 years ago)
Author:
Eric Norum <WENorum@…>
Branches:
4.10, 4.11, 4.8, 4.9, 5, master
Children:
cdb717e
Parents:
3f0bb34
Message:

Clean up transmit buffer realignment.
Many thanks to Mr. Kolja Waschk for identifying the problem.

Location:
c/src/lib/libbsp/m68k/uC5282
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • c/src/lib/libbsp/m68k/uC5282/ChangeLog

    r3f0bb34 rf077cc96  
     12005-06-20  Eric Norum <norume@aps.anl.gov>
     2
     3        * network/network.c: Clean up transmit buffer realignment.  Many thanks to
     4                         Mr. Kolja Waschk for identifying the problem.
     5
    162005-05-26      Ralf Corsepius <ralf.corsepius@rtems.org>
    27
  • c/src/lib/libbsp/m68k/uC5282/README

    r3f0bb34 rf077cc96  
    79792) (first time only)
    8080   Set the uC5282 board Internet configuration:
    81         setenv IPADDR0 www.xxx.yyy.zzz      (Your board's address)
    82         setenv NETMASK ppp.qqq.rrr.sss      (Your local network address mask)
    83         setenv HOSTNAME somename            (Your board's name)
     81        setenv IPADDR0 www.xxx.yyy.zzz  (Your board's address)
     82        setenv NETMASK ppp.qqq.rrr.sss  (Your local network address mask)
     83        setenv HOSTNAME somename        (Your board's name)
    8484
    85853) Type 'tftp<CR>'
    8686
    87874) Run 'tftp' on your host machine:
    88             tftp> binary
    89             tftp> connect www.xxx.yyy.zzz      (Your ucDIMM's address)
    90             tftp> put someFile.exe
     88        tftp> binary
     89        tftp> connect www.xxx.yyy.zzz   (Your ucDIMM's address)
     90        tftp> put someFile.exe          (someFile.boot for the EPICS build system)
    9191
    92925) When the file has downloaded press the <ESC> key to terminate
  • c/src/lib/libbsp/m68k/uC5282/network/network.c

    r3f0bb34 rf077cc96  
    11/*
    22 * RTEMS/TCPIP driver for MCF5282 Fast Ethernet Controller
    3  *
    4  * TO DO: Check network stack code -- Is it possible force longword alignment
    5  *                                    of all tx mbufs?  If so, the stupid
    6  *                                    realignment code in the output routine
    7  *                                    could be removed.
    83 */
    94
     
    10499    unsigned long   txRawWait;
    105100    unsigned long   txRealign;
    106     unsigned long   txRealignBytes;
     101    unsigned long   txRealignDrop;
    107102};
    108103static struct mcf5282_enet_struct enet_driver[NIFACES];
     
    321316{
    322317    struct mbuf *m, *n;
     318    uint16_t status;
    323319
    324320    while ((sc->txBdActiveCount != 0)
    325         && ((sc->txBdBase[sc->txBdTail].status & MCF5282_FEC_TxBD_R) == 0)) {
    326         m = sc->txMbuf[sc->txBdTail];
    327         MFREE(m, n);
     321        && (((status = sc->txBdBase[sc->txBdTail].status) & MCF5282_FEC_TxBD_R) == 0)) {
     322        if ((status & MCF5282_FEC_TxBD_TO1) == 0) {
     323            m = sc->txMbuf[sc->txBdTail];
     324            MFREE(m, n);
     325        }
    328326        if (++sc->txBdTail == sc->txBdCount)
    329327            sc->txBdTail = 0;
     
    338336    struct ifnet *ifp = (struct ifnet* )&sc->arpcom.ac_if;
    339337    struct mbuf *m;
    340     volatile uint16_t status;
     338    uint16_t status;
    341339    volatile mcf5282BufferDescriptor_t *rxBd;
    342340    int rxBdIndex;
     
    455453    volatile mcf5282BufferDescriptor_t *firstTxBd, *txBd;
    456454    uint16_t status;
     455    int offset;
    457456    int nAdded;
    458457
     
    472471    firstTxBd = sc->txBdBase + sc->txBdHead;
    473472   
    474     for (;;) {
     473    while (m != NULL) {
    475474        /*
    476475         * Wait for buffer descriptor to become available
     
    518517        if (m->m_len) {
    519518            char *p = mtod(m, char *);
    520             /*
    521              * Stupid FEC can't handle misaligned data!
    522              * Given the way that mbuf's are layed out it should be
    523              * safe to shuffle the data down like this.....
    524              * Perhaps this code could be improved with a "Duff's Device".
    525              */
    526             if ((int)p & 0x3) {
    527                 int l = m->m_len;
    528                 char *dest = p - ((int)p & 0x3);
    529                 uint16_t *o = (uint16_t *)dest, *i = (uint16_t *)p;
    530                 while (l > 0) {
    531                     *o++ = *i++;
    532                     l -= sizeof(uint16_t);
     519            if ((offset = (int)p & 0x3) == 0) {
     520                txBd->buffer = p;
     521                txBd->length = m->m_len;
     522                sc->txMbuf[sc->txBdHead] = m;
     523                m = m->m_next;
     524            }
     525            else {
     526                /*
     527                 * Stupid FEC can't handle misaligned data!
     528                 * Move offending bytes to a local buffer.
     529                 * Use buffer descriptor TO1 bit to indicate this.
     530                 */
     531                int nmove = 4 - offset;
     532                char *d = (char *)&sc->txMbuf[sc->txBdHead];
     533                status |= MCF5282_FEC_TxBD_TO1;
     534                sc->txRealign++;
     535                if (nmove > m->m_len)
     536                    nmove = m->m_len;
     537                m->m_data += nmove;
     538                m->m_len -= nmove;
     539                txBd->buffer = d;
     540                txBd->length = nmove;
     541                while (nmove--)
     542                    *d++ = *p++;
     543                if (m->m_len == 0) {
     544                    struct mbuf *n;
     545                    sc->txRealignDrop++;
     546                    MFREE(m, n);
     547                    m = n;
    533548                }
    534                 p = dest;
    535                 sc->txRealign++;
    536                 sc->txRealignBytes += m->m_len;
    537549            }
    538             txBd->buffer = p;
    539             txBd->length = m->m_len;
    540             sc->txMbuf[sc->txBdHead] = m;
    541550            nAdded++;
    542551            if (++sc->txBdHead == sc->txBdCount) {
     
    544553                sc->txBdHead = 0;
    545554            }
    546             m = m->m_next;
     555            txBd->status = status;
    547556        }
    548557        else {
    549558            /*
    550              * Just toss empty mbufs
     559             * Toss empty mbufs.
    551560             */
    552561            struct mbuf *n;
     
    554563            m = n;
    555564        }
    556         if (m == NULL) {
    557           if (nAdded) {
    558             txBd->status = status | MCF5282_FEC_TxBD_R
    559                                   | MCF5282_FEC_TxBD_L
    560                                   | MCF5282_FEC_TxBD_TC;
    561             if (nAdded > 1)
    562                 firstTxBd->status |= MCF5282_FEC_TxBD_R;
    563             MCF5282_FEC_TDAR = 0;
    564             sc->txBdActiveCount += nAdded;
    565           }
    566           break;
    567         }
    568         txBd->status = status;
    569     }
     565    }
     566    if (nAdded) {
     567        txBd->status = status | MCF5282_FEC_TxBD_R
     568                              | MCF5282_FEC_TxBD_L
     569                              | MCF5282_FEC_TxBD_TC;
     570        if (nAdded > 1)
     571            firstTxBd->status |= MCF5282_FEC_TxBD_R;
     572        MCF5282_FEC_TDAR = 0;
     573        sc->txBdActiveCount += nAdded;
     574      }
    570575}
    571576
     
    700705    printf("  Tx Interrupts:%-10lu",   sc->txInterrupts);
    701706    printf("Tx Output Waits:%-10lu",   sc->txRawWait);
    702     printf("Tx Realignments:%-10lu\n",  sc->txRealign);
    703     printf(" Tx RealignByte:%-10lu", sc->txRealignBytes);
    704     printf(" Tx Unaccounted:%-10lu", MCF5282_FEC_RMON_T_DROP);
    705     printf("Tx Packet Count:%-10lu\n",   MCF5282_FEC_RMON_T_PACKETS);
     707    printf("Tx mbuf realign:%-10lu\n", sc->txRealign);
     708    printf("Tx realign drop:%-10lu",   sc->txRealignDrop);
     709    printf(" Tx Unaccounted:%-10lu",   MCF5282_FEC_RMON_T_DROP);
     710    printf("Tx Packet Count:%-10lu\n", MCF5282_FEC_RMON_T_PACKETS);
    706711    printf("   Tx Broadcast:%-10lu",   MCF5282_FEC_RMON_T_BC_PKT);
    707     printf("   Tx Multicast:%-10lu", MCF5282_FEC_RMON_T_MC_PKT);
    708     printf("CRC/Align error:%-10lu\n",   MCF5282_FEC_RMON_T_CRC_ALIGN);
     712    printf("   Tx Multicast:%-10lu",   MCF5282_FEC_RMON_T_MC_PKT);
     713    printf("CRC/Align error:%-10lu\n", MCF5282_FEC_RMON_T_CRC_ALIGN);
    709714    printf("   Tx Undersize:%-10lu",   MCF5282_FEC_RMON_T_UNDERSIZE);
    710     printf("    Tx Oversize:%-10lu", MCF5282_FEC_RMON_T_OVERSIZE);
    711     printf("    Tx Fragment:%-10lu\n",   MCF5282_FEC_RMON_T_FRAG);
     715    printf("    Tx Oversize:%-10lu",   MCF5282_FEC_RMON_T_OVERSIZE);
     716    printf("    Tx Fragment:%-10lu\n", MCF5282_FEC_RMON_T_FRAG);
    712717    printf("      Tx Jabber:%-10lu",   MCF5282_FEC_RMON_T_JAB);
    713     printf("  Tx Collisions:%-10lu", MCF5282_FEC_RMON_T_COL);
    714     printf("          Tx 64:%-10lu\n",   MCF5282_FEC_RMON_T_P64);
     718    printf("  Tx Collisions:%-10lu",   MCF5282_FEC_RMON_T_COL);
     719    printf("          Tx 64:%-10lu\n", MCF5282_FEC_RMON_T_P64);
    715720    printf("      Tx 65-127:%-10lu",   MCF5282_FEC_RMON_T_P65TO127);
    716     printf("     Tx 128-255:%-10lu", MCF5282_FEC_RMON_T_P128TO255);
    717     printf("     Tx 256-511:%-10lu\n",   MCF5282_FEC_RMON_T_P256TO511);
     721    printf("     Tx 128-255:%-10lu",   MCF5282_FEC_RMON_T_P128TO255);
     722    printf("     Tx 256-511:%-10lu\n", MCF5282_FEC_RMON_T_P256TO511);
    718723    printf("    Tx 511-1023:%-10lu",   MCF5282_FEC_RMON_T_P512TO1023);
    719     printf("   Tx 1024-2047:%-10lu", MCF5282_FEC_RMON_T_P1024TO2047);
    720     printf("      Tx >=2048:%-10lu\n",   MCF5282_FEC_RMON_T_P_GTE2048);
     724    printf("   Tx 1024-2047:%-10lu",   MCF5282_FEC_RMON_T_P1024TO2047);
     725    printf("      Tx >=2048:%-10lu\n", MCF5282_FEC_RMON_T_P_GTE2048);
    721726    printf("      Tx Octets:%-10lu",   MCF5282_FEC_RMON_T_OCTETS);
    722     printf("     Tx Dropped:%-10lu", MCF5282_FEC_IEEE_T_DROP);
    723     printf("    Tx Frame OK:%-10lu\n",   MCF5282_FEC_IEEE_T_FRAME_OK);
     727    printf("     Tx Dropped:%-10lu",   MCF5282_FEC_IEEE_T_DROP);
     728    printf("    Tx Frame OK:%-10lu\n", MCF5282_FEC_IEEE_T_FRAME_OK);
    724729    printf(" Tx 1 Collision:%-10lu",   MCF5282_FEC_IEEE_T_1COL);
    725     printf("Tx >1 Collision:%-10lu", MCF5282_FEC_IEEE_T_MCOL);
    726     printf("    Tx Deferred:%-10lu\n",   MCF5282_FEC_IEEE_T_DEF);
     730    printf("Tx >1 Collision:%-10lu",   MCF5282_FEC_IEEE_T_MCOL);
     731    printf("    Tx Deferred:%-10lu\n", MCF5282_FEC_IEEE_T_DEF);
    727732    printf(" Late Collision:%-10lu",   MCF5282_FEC_IEEE_T_LCOL);
    728     printf(" Excessive Coll:%-10lu", MCF5282_FEC_IEEE_T_EXCOL);
    729     printf("  FIFO Underrun:%-10lu\n",   MCF5282_FEC_IEEE_T_MACERR);
     733    printf(" Excessive Coll:%-10lu",   MCF5282_FEC_IEEE_T_EXCOL);
     734    printf("  FIFO Underrun:%-10lu\n", MCF5282_FEC_IEEE_T_MACERR);
    730735    printf("  Carrier Error:%-10lu",   MCF5282_FEC_IEEE_T_CSERR);
    731     printf("   Tx SQE Error:%-10lu", MCF5282_FEC_IEEE_T_SQE);
    732     printf("Tx Pause Frames:%-10lu\n",   MCF5282_FEC_IEEE_T_FDXFC);
     736    printf("   Tx SQE Error:%-10lu",   MCF5282_FEC_IEEE_T_SQE);
     737    printf("Tx Pause Frames:%-10lu\n", MCF5282_FEC_IEEE_T_FDXFC);
    733738    printf("   Tx Octets OK:%-10lu\n", MCF5282_FEC_IEEE_T_OCTETS_OK);
    734739    printf(" EIR:%8.8lx  ",  MCF5282_FEC_EIR);
     
    747752         * but this diagnostic is more for when things have backed up.
    748753         */
    749         printf("Transmit Buffer Descriptors (Tail %d, Head %d, Active %d):\n",
     754        printf("Transmit Buffer Descriptors (Tail %d, Head %d, Unretired %d):\n",
    750755                                                    sc->txBdTail,
    751756                                                    sc->txBdHead,
Note: See TracChangeset for help on using the changeset viewer.