From 339737bad73c4cc2298d3a5f8b8eee69d27d3da8 Mon Sep 17 00:00:00 2001 From: Joel Sherrill Date: Mon, 10 Aug 1998 23:20:25 +0000 Subject: Survives 16-20 packets. Appears to be ok on TX buffer management. Problem appears to be on the RX buffer initialization side. --- c/src/lib/libbsp/powerpc/dmv177/sonic/sonic.c | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) (limited to 'c/src/lib/libbsp/powerpc/dmv177') diff --git a/c/src/lib/libbsp/powerpc/dmv177/sonic/sonic.c b/c/src/lib/libbsp/powerpc/dmv177/sonic/sonic.c index 40541217ff..3936f71522 100644 --- a/c/src/lib/libbsp/powerpc/dmv177/sonic/sonic.c +++ b/c/src/lib/libbsp/powerpc/dmv177/sonic/sonic.c @@ -476,6 +476,11 @@ printf( "retire TDA %p (0x%04x)\n", dp->tdaTail, status ); dp->tdaActiveCount--; free_p ((struct mbuf **)&dp->tdaTail->mbufp); +/* XXX this does not help when you wrap + dp->tdaTail->frag_count = 1; + dp->tdaTail->frag[0].frag_link = LSW(dp->tdaTail->link_pad); +*/ + /* * Move to the next transmit descriptor */ @@ -639,6 +644,7 @@ puts( "Wait for more TDAs" ); /* * Chain onto list and start transmission. */ + tdp->linkp = &(fp+1)->frag_link; *tdp->linkp = LSW(tdp->next) | TDA_LINK_EOL; *dp->tdaHead->linkp &= ~TDA_LINK_EOL; @@ -956,7 +962,7 @@ SONIC_STATIC void sonic_initialize_hardware( int i; unsigned char *hwaddr; rtems_isr_entry old_handler; - TransmitDescriptorPointer_t otdp, tdp; + TransmitDescriptorPointer_t tdp; ReceiveDescriptorPointer_t ordp, rdp; ReceiveResourcePointer_t rwp, rea; struct mbuf *bp; @@ -987,14 +993,14 @@ SONIC_STATIC void sonic_initialize_hardware( #if (SONIC_DEBUG & SONIC_DEBUG_MEMORY) printf( "tdaTail = %p\n", dp->tdaTail ); #endif - otdp = tdp = dp->tdaTail; + tdp = dp->tdaTail; for (i = 0 ; i < dp->tdaCount ; i++) { /* * status, pkt_config, pkt_size, and all fragment fields * are set to zero by sonic_allocate. */ -/* XXX not used by other drivers +/* XXX not used by other drivers we looked at if (i & 1) tdp->pkt_config = TDA_CONFIG_PINT; */ @@ -1002,20 +1008,19 @@ SONIC_STATIC void sonic_initialize_hardware( tdp->frag_count = 1; tdp->frag[0].frag_link = LSW(tdp + 1); tdp->link_pad = LSW(tdp + 1) | TDA_LINK_EOL; - otdp->linkp = &((tdp + 1)->frag[0].frag_link); + tdp->linkp = &((tdp + 1)->frag[0].frag_link); tdp->next = (TransmitDescriptor_t *)(tdp + 1); - otdp = tdp; tdp++; } - dp->tdaHead = otdp; /* XXX why? */ - otdp->link_pad = LSW(dp->tdaTail) | TDA_LINK_EOL; - otdp->next = (TransmitDescriptor_t *)dp->tdaTail; - otdp->linkp = &dp->tdaHead->frag[0].frag_link; + tdp--; + dp->tdaHead = tdp; + tdp->link_pad = LSW(dp->tdaTail) | TDA_LINK_EOL; + tdp->next = (TransmitDescriptor_t *)dp->tdaTail; + tdp->linkp = &dp->tdaTail->frag[0].frag_link; /* * Set up circular linked list in Receive Descriptor Area. - * Leaves ordp pointing at the `end' of the list and - * dp->rda pointing at the `beginning' of the list. + * Leaves dp->rda pointing at the `beginning' of the list. * * NOTE: The RDA and CDP must have the same MSW for their addresses. */ -- cgit v1.2.3