summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJoel Sherrill <joel.sherrill@OARcorp.com>1999-03-03 16:22:57 +0000
committerJoel Sherrill <joel.sherrill@OARcorp.com>1999-03-03 16:22:57 +0000
commit4f6d73adc1e0e164085af92eea9aac03511c5548 (patch)
treec5905bde67392ef7b837977832697c21dd2ffc7e
parent97b8b8f5fa568d2cdb96a39d0e7acd63d38cedd2 (diff)
downloadrtems-4f6d73adc1e0e164085af92eea9aac03511c5548.tar.bz2
Patch from Erik Ivanenko <erik.ivanenko@utoronto.ca> to correct a bug
that shows up if the BSP uses memory near address 0.
-rw-r--r--c/src/lib/libbsp/i386/i386ex/network/network.c55
1 files changed, 36 insertions, 19 deletions
diff --git a/c/src/lib/libbsp/i386/i386ex/network/network.c b/c/src/lib/libbsp/i386/i386ex/network/network.c
index 0e7ae7dc1c..6f924b4bc2 100644
--- a/c/src/lib/libbsp/i386/i386ex/network/network.c
+++ b/c/src/lib/libbsp/i386/i386ex/network/network.c
@@ -66,7 +66,6 @@ int count_rx = 0;
static struct uti596_softc uti596_softc;
-int uti596packetNumber = 0;
static int scbStatus;
static rtems_status_code sc;
@@ -410,7 +409,6 @@ void uti596supplyFD(struct i596_rfd * pRfd )
}
}
-
static void
uti596_start (struct ifnet *ifp)
{
@@ -425,24 +423,23 @@ uti596_initialize_hardware(struct uti596_softc *sc)
{
int boguscnt = 1000;
rtems_status_code status_code;
+
+ printf("uti596_initialize_hardware\n");
/* reset the board */
outport_word( PORT_ADDR, 0 );
outport_word( PORT_ADDR, 0 );
- sc->pScp = (struct i596_scp *)
- calloc(1,sizeof(struct i596_scp) + 0xf);
+ uti596_softc.pScp = (struct i596_scp *) calloc(1,sizeof(struct i596_scp) + 0xf);
#ifdef DBG_INIT
printf("initialize_hardware:Scp address initially %p\n", sc->pScp);
#endif
sc->pScp = (struct i596_scp *)
((((int)uti596_softc.pScp) + 0xf) & 0xfffffff0);
-
#ifdef DBG_INIT
printf("initialize_hardware:change scp address to : %p\n",sc->pScp);
#endif
-
/* change the scp address */
#ifdef DBG_INIT
@@ -460,8 +457,8 @@ uti596_initialize_hardware(struct uti596_softc *sc)
outport_word( PORT_ADDR, 0 );
outport_word( PORT_ADDR, 0 );
- outport_word(PORT_ADDR, ((((int)uti596_softc.pScp) & 0xffff) | 2 ));
- outport_word(PORT_ADDR, (( (int)uti596_softc.pScp) >> 16 ) & 0xffff );
+ outport_word(PORT_ADDR, ((((int)sc->pScp) & 0xffff) | 2 ));
+ outport_word(PORT_ADDR, (( (int)sc->pScp) >> 16 ) & 0xffff );
/* This is linear mode, LOCK function is disabled */
@@ -521,12 +518,19 @@ uti596_reset_hardware(struct uti596_softc *sc)
rtems_status_code status_code;
struct i596_cmd *pCmd;
+
+ printf("uti596_reset_hardware\n");
pCmd = sc->pCmdHead; /* This is a tx command for sure (99.99999%) */
/* reset the board */
outport_word( PORT_ADDR, 0 );
outport_word( PORT_ADDR, 0 );
+ if ( sc->pScp == NULL ) {
+ printf("Calloc scp\n");
+ uti596_softc.pScp = (struct i596_scp *) calloc(1,sizeof(struct i596_scp) + 0xf);
+ }
+
#ifdef DBG_RESET
printf("reset_hardware:Scp address %p\n", sc->pScp);
#endif
@@ -554,8 +558,11 @@ uti596_reset_hardware(struct uti596_softc *sc)
outport_word( PORT_ADDR, 0 );
outport_word( PORT_ADDR, 0 );
- outport_word(PORT_ADDR, ((((int)uti596_softc.pScp) & 0xffff) | 2 ));
- outport_word(PORT_ADDR, (( (int)uti596_softc.pScp) >> 16 ) & 0xffff );
+ /* outport_word(PORT_ADDR, ((((int)uti596_softc.pScp) & 0xffff) | 2 ));
+ outport_word(PORT_ADDR, (( (int)uti596_softc.pScp) >> 16 ) & 0xffff ); */
+
+ outport_word(PORT_ADDR, ((((int)sc->pScp) & 0xffff) | 2 ));
+ outport_word(PORT_ADDR, (( (int)sc->pScp) >> 16 ) & 0xffff );
/* This is linear mode, LOCK function is disabled */
@@ -1201,7 +1208,7 @@ void uti596addPolledCmd(struct i596_cmd *pCmd)
printf("Adding command 0x%x\n", pCmd -> command );
#endif
-#ifdef DEBUG_POLLED_CMD
+#ifdef DBG_POLLED_CMD
switch ( pCmd -> command & 0x7 ){ /* check bottom 7 bits */
case CmdConfigure:
@@ -1239,17 +1246,16 @@ void uti596addPolledCmd(struct i596_cmd *pCmd)
pCmd->next = I596_NULL;
- uti596_softc.pCmdHead = uti596_softc.pCmdTail = uti596_softc.scb.pCmd = pCmd;
-
UTI_WAIT_COMMAND_ACCEPTED(10000,"Add Polled command: wait prev");
+ uti596_softc.pCmdHead = uti596_softc.pCmdTail = uti596_softc.scb.pCmd = pCmd;
uti596_softc.scb.command = CUC_START;
outport_word (CHAN_ATTN,0);
- UTI_WAIT_COMMAND_ACCEPTED(2000000,"Add Polled command: start");
+ UTI_WAIT_COMMAND_ACCEPTED(10000,"Add Polled command: start");
uti596_softc.pCmdHead = uti596_softc.pCmdTail = uti596_softc.scb.pCmd = I596_NULL;
-#ifdef DBG_596
+#ifdef DBG_POLLED_CMD
printf("Scb status & command 0x%x 0x%x\n",
uti596_softc.scb.status,
uti596_softc.scb.command );
@@ -1836,6 +1842,7 @@ int uti596_attach(struct rtems_bsdnet_ifconfig * pConfig )
/* Indicate to ULCS that this is initialized */
ifp->if_softc = sc;
+ sc -> pScp = NULL;
/* Assign the name */
ifp->if_name = "uti";
@@ -1941,7 +1948,7 @@ int uti596_attach(struct rtems_bsdnet_ifconfig * pConfig )
UTI_WAIT_COMMAND_ACCEPTED(20000, "****ERROR:ACK");
}
else {
- printk("***INFO: ACK'd w/o processing. status = %x\n", scbStatus);
+ /* printk("***INFO: ACK'd w/o processing. status = %x\n", scbStatus); */
return;
}
}
@@ -2490,7 +2497,6 @@ void uti596_stop(struct uti596_softc *sc)
sc->scb.command = CUC_ABORT|RX_ABORT;
outport_word( CHAN_ATTN, 0 );
-
}
@@ -2703,23 +2709,34 @@ void uti596_init(void * arg){
struct uti596_softc *sc = arg;
struct ifnet *ifp = &sc->arpcom.ac_if;
+ rtems_status_code status_code;
+
if (sc->txDaemonTid == 0) {
uti596_initialize_hardware(sc);
-
+
/*
* Start driver tasks
*/
-
+
sc->txDaemonTid = rtems_bsdnet_newproc ("UTtx", 2*4096, uti596_txDaemon, sc);
sc->rxDaemonTid = rtems_bsdnet_newproc ("UTrx", 2*4096, uti596_rxDaemon, sc);
sc->resetDaemonTid = rtems_bsdnet_newproc ("UTrt", 2*4096,
uti596_resetDaemon, sc);
+
+
+#ifdef DBG_INIT
+ printf("After attach, status of board = 0x%x\n", sc->scb.status );
+#endif
+ outport_word(0x380, 0xf); /* reset the LED's */
+
}
+
/*
* Enable receiver
*/
+ UTI_WAIT_COMMAND_ACCEPTED(4000, "init:Before RX_START");
sc->scb.pRfd = sc -> pBeginRFA;
sc->scb.command = RX_START;
outport_word(CHAN_ATTN,0 );