Added debug print routines for TX and RX descriptors.

Fixed bug where only the mbuf associated with the first TX fragment was
being freed.
This commit is contained in:
Joel Sherrill
1999-02-02 16:28:42 +00:00
parent 14faf00eea
commit 811115de2c

View File

@@ -30,8 +30,9 @@ void break_when_you_get_here();
* DY 4 Systems Inc., Kanata, Ontario, September, 1996.
*/
#include <rtems/rtems_bsdnet.h>
#include <bsp.h> /* XXX JRS changed order */
#include "sonic.h"
#include <rtems/rtems_bsdnet.h>
#include <stdio.h>
@@ -54,36 +55,29 @@ void break_when_you_get_here();
*
*/
#define SONIC_DEBUG_NONE 0x0000
#define SONIC_DEBUG_ALL 0xFFFF
#define SONIC_DEBUG_PRINT_REGISTERS 0x0001
#define SONIC_DEBUG_MEMORY 0x0002
#define SONIC_DEBUG_MEMORY_ALLOCATE 0x0004
#define SONIC_DEBUG_FRAGMENTS 0x0008
#define SONIC_DEBUG_CAM 0x0008
#define SONIC_DEBUG_DESCRIPTORS 0x0010
#define SONIC_DEBUG_ERRORS 0x0020
#define SONIC_DEBUG_DUMP_TX_MBUFS 0x0040
#define SONIC_DEBUG_DUMP_RX_MBUFS 0x0080
#define SONIC_DEBUG_NONE 0x0000
#define SONIC_DEBUG_ALL 0xFFFF
#define SONIC_DEBUG_PRINT_REGISTERS 0x0001
#define SONIC_DEBUG_MEMORY 0x0002
#define SONIC_DEBUG_MEMORY_ALLOCATE 0x0004
#define SONIC_DEBUG_MEMORY_DESCRIPTORS 0x0008
#define SONIC_DEBUG_FRAGMENTS 0x0008
#define SONIC_DEBUG_CAM 0x0010
#define SONIC_DEBUG_DESCRIPTORS 0x0020
#define SONIC_DEBUG_ERRORS 0x0040
#define SONIC_DEBUG_DUMP_TX_MBUFS 0x0080
#define SONIC_DEBUG_DUMP_RX_MBUFS 0x0100
#define SONIC_DEBUG_DUMP_MBUFS \
(SONIC_DEBUG_DUMP_TX_MBUFS|SONIC_DEBUG_DUMP_RX_MBUFS)
#define SONIC_DEBUG_MEDIUM \
#define SONIC_DEBUG (SONIC_DEBUG_ERRORS)
/*
((SONIC_DEBUG_ALL) & ~(SONIC_DEBUG_PRINT_REGISTERS|SONIC_DEBUG_DUMP_MBUFS))
/*
((SONIC_DEBUG_ALL) & ~(SONIC_DEBUG_DUMP_MBUFS))
*/
#define SONIC_DEBUG SONIC_DEBUG_ALL
/* ((SONIC_DEBUG_ALL) & ~SONIC_DEBUG_PRINT_REGISTERS) */
/* (SONIC_DEBUG_ALL) */
/* (SONIC_DEBUG_ALL) */
/* (SONIC_DEBUG_ERRORS) */
/* (SONIC_DEBUG_MEMORY|SONIC_DEBUG_DESCRIPTORS) */
#if (SONIC_DEBUG & SONIC_DEBUG_DUMP_MBUFS)
#include <rtems/dumpbuf.h>
@@ -156,13 +150,16 @@ void break_when_you_get_here();
/*
* Default sizes of transmit and receive descriptor areas
*/
#define RDA_COUNT 20
#define TDA_COUNT 10
#define RDA_COUNT 20 /* 20 */
#define TDA_COUNT 10 /* 10 */
/*
*
* As suggested by National Application Note 746, make the
* receive resource area bigger than the receive descriptor area.
*
* NOTE: Changing this may break this driver since it currently
* assumes a 1<->1 mapping.
*/
#define RRA_EXTRA_COUNT 0
@@ -188,7 +185,8 @@ void break_when_you_get_here();
* Check Sequence) rounded up to a 4-byte boundary.
*/
#define RBUF_SIZE ((sizeof (void *) + (MAXIMUM_FRAME_SIZE) + 3) & ~3)
#define RBUF_WC ((((MAXIMUM_FRAME_SIZE) + 3) & ~3) / 2)
/* #define RBUF_WC ((((MAXIMUM_FRAME_SIZE) + 3) & ~3) / 2) */
#define RBUF_WC (RBUF_SIZE / 2)
/*
* Macros for manipulating 32-bit pointers as 16-bit fragments
@@ -214,13 +212,6 @@ struct sonic_softc {
*/
void *sonic;
/*
* Tables to map the mbufs from chip to stack
*/
struct mbuf **rxMbuf;
struct mbuf **txMbuf;
/*
* Interrupt vector
*/
@@ -280,6 +271,52 @@ struct sonic_softc {
};
SONIC_STATIC struct sonic_softc sonic_softc[NSONIC];
/*
******************************************************************
* *
* Debug Routines *
* *
******************************************************************
*/
#if (SONIC_DEBUG & SONIC_DEBUG_MEMORY_DESCRIPTORS)
void sonic_print_tx_descriptor(
TransmitDescriptorPointer_t tdp
)
{
printf( "TXD ==> %p", tdp );
printf( " pkt_config = 0x%04x", tdp->pkt_config & 0xffff);
printf( " pkt_size = 0x%04x\n", tdp->pkt_size & 0xffff );
printf( " frag_count = %d", tdp->frag_count & 0xffff );
/* could print all the fragments */
printf( " next = %p", tdp->next );
printf( " linkp = %p\n", tdp->linkp );
printf( " mbufp = %p", tdp->mbufp );
if ( tdp->mbufp )
printf( " mbufp->data = %p", mtod ( tdp->mbufp, void *) );
puts("");
}
void sonic_print_rx_descriptor(
ReceiveDescriptorPointer_t rdp
)
{
printf( "RXD ==> %p\n", rdp );
printf( " status = 0x%04x", rdp->status & 0xffff );
printf( " byte_count = 0x%04x\n", rdp->byte_count & 0xffff );
printf( " pkt = 0x%04x%04x", rdp->pkt_msw, rdp->pkt_lsw );
printf( " seq_no = %d", rdp->seq_no );
printf( " link = %d\n", rdp->link );
printf( " in_use = %d", rdp->in_use );
printf( " next = %p", rdp->next );
printf( " mbufp = %p", rdp->mbufp );
if ( rdp->mbufp )
printf( " mbufp->data = %p", mtod ( rdp->mbufp, void *) );
puts("");
}
#endif
/*
******************************************************************
* *
@@ -475,7 +512,8 @@ SONIC_STATIC void sonic_retire_tda (struct sonic_softc *sc)
#if (SONIC_DEBUG & SONIC_DEBUG_ERRORS)
if ( status != 0x0001 )
printf( "ERROR: retire TDA %p (0x%04x)\n", sc->tdaTail, status );
printf( "ERROR: retire TDA %p (0x%08x)\n",
sc->tdaTail, sc->tdaTail->status );
#endif
/*
@@ -528,8 +566,11 @@ SONIC_STATIC void sonic_retire_tda (struct sonic_softc *sc)
* Free the packet and reset a couple of fields
*/
sc->tdaActiveCount--;
m = (struct mbuf *)&sc->tdaTail->mbufp;
MFREE(m, n);
m = sc->tdaTail->mbufp;
while ( m ) {
MFREE(m, n);
m = n;
}
sc->tdaTail->frag[0].frag_link = LSW(sc->tdaTail->link_pad);
sc->tdaTail->frag_count = 0;
@@ -887,7 +928,6 @@ SONIC_STATIC void sonic_rxDaemon (void *arg)
ReceiveDescriptorPointer_t rdp;
ReceiveResourcePointer_t rwp, rea;
rtems_unsigned16 newMissedTally, oldMissedTally;
unsigned32 rxMbufIndex;
rwp = sc->rsa;
rea = sc->rea;
@@ -901,7 +941,6 @@ SONIC_STATIC void sonic_rxDaemon (void *arg)
/*
* Input packet handling loop
*/
rxMbufIndex = 0;
for (;;) {
/*
* Wait till SONIC supplies a Receive Descriptor.
@@ -930,6 +969,9 @@ SONIC_STATIC void sonic_rxDaemon (void *arg)
* ===CACHE===
* Invalidate cache entries for this memory.
*/
#if (SONIC_DEBUG & SONIC_DEBUG_MEMORY_DESCRIPTORS)
sonic_print_rx_descriptor( rdp );
#endif
m = rdp->mbufp;
m->m_len = m->m_pkthdr.len = rdp->byte_count -
sizeof(rtems_unsigned32) -
@@ -962,7 +1004,6 @@ SONIC_STATIC void sonic_rxDaemon (void *arg)
* Allocate a new mbuf.
*/
m= (void *)0xA0000000; /* hope for a fault :) */
MGETHDR (m, M_WAIT, MT_DATA);
MCLGET (m, M_WAIT);
m->m_pkthdr.rcvif = ifp;
@@ -1058,19 +1099,6 @@ SONIC_STATIC void sonic_initialize_hardware(struct sonic_softc *sc)
rtems_fatal_error_occurred( 0x0BADF00D ); /* don't eat this part :) */
}
/*
* Allocate memory so we can figure out from the descriptor which
* mbuf to send to the stack.
*/
sc->txMbuf = malloc (sc->tdaCount * sizeof *sc->txMbuf, M_MBUF, M_NOWAIT);
if (!sc->txMbuf)
rtems_panic ("No memory for TX mbuf pointers");
sc->rxMbuf = malloc (sc->rdaCount * sizeof *sc->rxMbuf, M_MBUF, M_NOWAIT);
if (!sc->rxMbuf)
rtems_panic ("No memory for RX mbuf pointers");
/*
* Set up circular linked list in Transmit Descriptor Area.
* Use the PINT bit in the transmit configuration field to
@@ -1089,7 +1117,6 @@ SONIC_STATIC void sonic_initialize_hardware(struct sonic_softc *sc)
/*
* Start off with the table of outstanding mbuf's
*/
sc->txMbuf[i] = NULL;
/*
* status, pkt_config, pkt_size, and all fragment fields
@@ -1106,6 +1133,9 @@ SONIC_STATIC void sonic_initialize_hardware(struct sonic_softc *sc)
tdp->link_pad = LSW(tdp + 1) | TDA_LINK_EOL;
tdp->linkp = &((tdp + 1)->frag[0].frag_link);
tdp->next = (TransmitDescriptor_t *)(tdp + 1);
#if (SONIC_DEBUG & SONIC_DEBUG_MEMORY_DESCRIPTORS)
sonic_print_tx_descriptor( tdp );
#endif
tdp++;
}
tdp--;
@@ -1182,7 +1212,6 @@ SONIC_STATIC void sonic_initialize_hardware(struct sonic_softc *sc)
MGETHDR (m, M_WAIT, MT_DATA);
MCLGET (m, M_WAIT);
m->m_pkthdr.rcvif = &sc->arpcom.ac_if;
sc->rxMbuf[i] = m;
sc->rda[i].mbufp = m;
p = mtod (m, void *);
@@ -1194,6 +1223,9 @@ SONIC_STATIC void sonic_initialize_hardware(struct sonic_softc *sc)
rwp->buff_ptr_msw = MSW(p);
rwp->buff_wc_lsw = RBUF_WC;
rwp->buff_wc_msw = 0;
#if (SONIC_DEBUG & SONIC_DEBUG_MEMORY_DESCRIPTORS)
sonic_print_rx_descriptor( &sc->rda[i] );
#endif
}
sc->rea = rwp;
#if (SONIC_DEBUG & SONIC_DEBUG_MEMORY)
@@ -1623,17 +1655,14 @@ char SONIC_Reg_name[64][6]= {
"DCR2" /* 0x3F */
};
#endif
void sonic_write_register(
inline void sonic_write_register(
void *base,
unsigned32 regno,
unsigned32 value
)
{
volatile unsigned32 *p = base;
{
volatile unsigned32 *C = (void *)0x34CDF0;
if ( *C ) printf( "W. *C = 0x%x\n", *C );
}
#if (SONIC_DEBUG & SONIC_DEBUG_PRINT_REGISTERS)
printf( "%p Write 0x%04x to %s (0x%02x)\n",
@@ -1643,7 +1672,7 @@ void sonic_write_register(
p[regno] = value;
}
unsigned32 sonic_read_register(
inline unsigned32 sonic_read_register(
void *base,
unsigned32 regno
)
@@ -1651,11 +1680,6 @@ unsigned32 sonic_read_register(
volatile unsigned32 *p = base;
unsigned32 value;
{
volatile unsigned32 *C = (void *)0x34CDF0;
if ( *C ) printf( "R. *C = 0x%x\n", *C );
}
value = p[regno];
#if (SONIC_DEBUG & SONIC_DEBUG_PRINT_REGISTERS)
printf( "%p Read 0x%04x from %s (0x%02x)\n",