summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJoel Sherrill <joel.sherrill@OARcorp.com>1998-08-12 16:28:17 +0000
committerJoel Sherrill <joel.sherrill@OARcorp.com>1998-08-12 16:28:17 +0000
commit4f38b713975f1424f802ac725f566b850b07b821 (patch)
treec5af29d4c936908d4388a683273c42a602bd84b5
parentUpdated the description section of the admin_shutdown routine. (diff)
downloadrtems-4f38b713975f1424f802ac725f566b850b07b821.tar.bz2
Fixed bug where the last link of the RDA was not initialized properly.
-rw-r--r--c/src/lib/libbsp/powerpc/dmv177/sonic/sonic.c45
1 files 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 */