From 4f38b713975f1424f802ac725f566b850b07b821 Mon Sep 17 00:00:00 2001 From: Joel Sherrill Date: Wed, 12 Aug 1998 16:28:17 +0000 Subject: Fixed bug where the last link of the RDA was not initialized properly. --- c/src/lib/libbsp/powerpc/dmv177/sonic/sonic.c | 45 ++++++++++++++++++--------- 1 file changed, 30 insertions(+), 15 deletions(-) diff --git a/c/src/lib/libbsp/powerpc/dmv177/sonic/sonic.c b/c/src/lib/libbsp/powerpc/dmv177/sonic/sonic.c index 75959e1768..2d3d2097a3 100644 --- a/c/src/lib/libbsp/powerpc/dmv177/sonic/sonic.c +++ b/c/src/lib/libbsp/powerpc/dmv177/sonic/sonic.c @@ -55,8 +55,9 @@ void break_when_you_get_here(); #define SONIC_DEBUG_CAM 0x0008 #define SONIC_DEBUG_DESCRIPTORS 0x0010 -#define SONIC_DEBUG \ - (SONIC_DEBUG_MEMORY|SONIC_DEBUG_DESCRIPTORS) +#define SONIC_DEBUG (SONIC_DEBUG_NONE) + +/* (SONIC_DEBUG_MEMORY|SONIC_DEBUG_DESCRIPTORS) */ /* SONIC_DEBUG_ALL */ @@ -194,6 +195,7 @@ struct sonic { */ int rdaCount; ReceiveResourcePointer_t rsa; + ReceiveResourcePointer_t rea; CamDescriptorPointer_t cdp; ReceiveDescriptorPointer_t rda; ReceiveDescriptorPointer_t rdp_last; @@ -482,10 +484,9 @@ SONIC_STATIC void sonic_retire_tda (struct sonic *dp) dp->tdaActiveCount--; free_p ((struct mbuf **)&dp->tdaTail->mbufp); -/* XXX this does not help when you wrap - dp->tdaTail->frag_count = 1; +/* XXX this does not help when you wrap */ dp->tdaTail->frag[0].frag_link = LSW(dp->tdaTail->link_pad); -*/ + dp->tdaTail->frag_count = 0; /* * Move to the next transmit descriptor @@ -655,7 +656,8 @@ puts( "Wait for more TDAs" ); tdp->linkp = &(fp+1)->frag_link; *tdp->linkp = LSW(tdp->next) | TDA_LINK_EOL; - *dp->tdaHead->linkp &= ~TDA_LINK_EOL; + if ( dp->tdaHead->frag_count ) + *dp->tdaHead->linkp &= ~TDA_LINK_EOL; dp->tdaActiveCount++; dp->tdaHead = tdp; @@ -803,6 +805,9 @@ SONIC_STATIC void sonic_rda_wait( RTEMS_WAIT|RTEMS_EVENT_ANY, RTEMS_NO_TIMEOUT); } +#if (SONIC_DEBUG & SONIC_DEBUG_DESCRIPTORS) + printf( "RDA %p\n", rdp ); +#endif } /* @@ -822,7 +827,7 @@ SONIC_STATIC void sonic_rx (int dev, void *p1, void *p2) int continuousCount; rwp = dp->rsa; - rea = rwp; + rea = dp->rea; /* XXX was rwp; */ rdp = dp->rda; /* XXX was rdp_last */ /* @@ -845,7 +850,9 @@ SONIC_STATIC void sonic_rx (int dev, void *p1, void *p2) sonic_rda_wait (dp, rdp); } -/* printf( "Incoming packet %p\n", rdp ); */ +#if (SONIC_DEBUG & SONIC_DEBUG_DESCRIPTORS) + printf( "Incoming packet %p status=0x%04x\n", rdp, rdp->status ); +#endif /* * Check that packet is valid @@ -912,8 +919,12 @@ SONIC_STATIC void sonic_rx (int dev, void *p1, void *p2) rwp->buff_ptr_lsw = LSW(bp->data); rwp->buff_ptr_msw = MSW(bp->data); rwp++; - if (rwp == rea) + if (rwp == rea) { +#if (SONIC_DEBUG & SONIC_DEBUG_MEMORY) + printf( "Wrapping RWP from %p to %p\n", rwp, dp->rsa ); +#endif rwp = dp->rsa; + } sonic_write_register( rp, SONIC_REG_RWP , LSW(rwp) ); /* @@ -972,7 +983,7 @@ SONIC_STATIC void sonic_initialize_hardware( rtems_isr_entry old_handler; TransmitDescriptorPointer_t tdp; ReceiveDescriptorPointer_t ordp, rdp; - ReceiveResourcePointer_t rwp, rea; + ReceiveResourcePointer_t rwp; struct mbuf *bp; CamDescriptorPointer_t cdp; @@ -1013,7 +1024,7 @@ SONIC_STATIC void sonic_initialize_hardware( tdp->pkt_config = TDA_CONFIG_PINT; */ - tdp->frag_count = 1; + tdp->frag_count = 0; tdp->frag[0].frag_link = LSW(tdp + 1); tdp->link_pad = LSW(tdp + 1) | TDA_LINK_EOL; tdp->linkp = &((tdp + 1)->frag[0].frag_link); @@ -1059,8 +1070,8 @@ SONIC_STATIC void sonic_initialize_hardware( * Link the last desriptor to the 1st one and mark it as the end * of the list. */ - ordp->next = dp->rda; - ordp->link |= RDA_LINK_EOL; + ordp->next = dp->rda; + ordp->link = LSW(dp->rda) | RDA_LINK_EOL; dp->rdp_last = rdp; /* @@ -1105,7 +1116,11 @@ SONIC_STATIC void sonic_initialize_hardware( rwp->buff_wc_lsw = RBUF_WC; rwp->buff_wc_msw = 0; } - rea = rwp; + dp->rea = rwp; +#if (SONIC_DEBUG & SONIC_DEBUG_MEMORY) + printf( "rea area = %p\n", dp->rea ); +#endif + /* * Issue a software reset. @@ -1157,7 +1172,7 @@ SONIC_STATIC void sonic_initialize_hardware( sonic_write_register( rp, SONIC_REG_URRA, MSW(dp->rsa) ); sonic_write_register( rp, SONIC_REG_RSA, LSW(dp->rsa) ); - sonic_write_register( rp, SONIC_REG_REA, LSW(rea) ); + sonic_write_register( rp, SONIC_REG_REA, LSW(dp->rea) ); sonic_write_register( rp, SONIC_REG_RRP, LSW(dp->rsa) ); sonic_write_register( rp, SONIC_REG_RWP, LSW(dp->rsa) ); /* XXX was rea */ -- cgit v1.2.3