Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 11 Apr 2002 00:59:25 +0100
From:      Brian Somers <brian@freebsd-services.com>
To:        Peter Jeremy <peter.jeremy@alcatel.com.au>
Cc:        Brian Somers <brian@FreeBSD.ORG>, cvs-committers@FreeBSD.ORG, cvs-all@FreeBSD.ORG
Subject:   Re: cvs commit: src/sys/dev/digi digi.c 
Message-ID:  <200204102359.g3ANxQOF059310@hak.lan.Awfulhak.org>
In-Reply-To: Message from Peter Jeremy <peter.jeremy@alcatel.com.au>  of "Thu, 11 Apr 2002 07:18:55 %2B1000." <20020411071854.Q69202@gsmx07.alcatel.com.au> 

next in thread | previous in thread | raw e-mail | index | archive | help
> On 2002-Apr-09 20:13:28 -0700, Brian Somers <brian@FreeBSD.ORG> wrote:
> >brian       2002/04/09 20:13:28 PDT
> >
> >  Modified files:
> >    sys/dev/digi         digi.c 
> >  Log:
> >  Add a digi_delay() function and use it instead of tsleep() when polling
> >  the card for command completion.
> >  
> >  digi_delay() uses either tsleep() or DELAY() depending on the value of
> >  ``cold''.
> 
> Originally, the initialisation looks used tsleep(,,,1) with a loop
> limit of 1000.  Whilst this presumably worked for hz=100, it failed
> on my system with hz=2000.  I extended the loop counter by a factor
> of 20 to compensate (I agree I should havd reported it, but I hadn't
> bothered with a portable fix).  
> 
> digi_delay() is roughly (cold ? DELAY(5000) : tsleep(,,,5)) - which is
> a fixed 5msec delay on boot, but a 5/hz delay once the system is
> running.  (And I'm not sure why the timeout delay has changed).  This
> will still probably timeout on dynamic loading.  How about the
> following (untested) patch (which also reverts to the previous
> timeout).

Hi,

The code has changed slightly (moving goalposts!).  Does this patch 
(based on yours) make things work for you ?

Also, if you have a few moments, could you set digi_debug = 1 and 
send me the dmesg output from a ``kldload digi'' ?  I get this with 
hz = 100:

digi0 mem 0xec800000-0xecbfffff irq 10 at device 9.0 on pci2
digi0: Got init reset after 0 us
digi0: BIOS uploaded
digi0: BIOS started after 0 us
digi0: BIOS booted after 381 iterations
digi0: Loading FEP/OS
digi0: FEP/OS loaded
digi0: FEP/OS started after 10 iterations
digi0: Digiboard PCI8r 920, 8 ports found

I can't try any of the other boards at the moment... see my other 
email :*/  but I guess you're timing out on the BIOS boot ?

Cheers.
-- 
Brian <brian@freebsd-services.com>                <brian@Awfulhak.org>
      http://www.freebsd-services.com/        <brian@[uk.]FreeBSD.org>
Don't _EVER_ lose your sense of humour !      <brian@[uk.]OpenBSD.org>

Index: digi.c
===================================================================
RCS file: /home/ncvs/src/sys/dev/digi/digi.c,v
retrieving revision 1.27
diff -u -r1.27 digi.c
--- digi.c	10 Apr 2002 14:32:55 -0000	1.27
+++ digi.c	10 Apr 2002 23:28:45 -0000
@@ -314,12 +314,12 @@
 
 		for (i = 0; ((sc->pcibus ? PCIPORT : inb(sc->port)) &
 		    FEPMASK) != FEPRST; i++) {
-			if (i > 100) {
+			if (i > 10 * hz) {
 				log(LOG_ERR, "digi%d: %s init reset failed\n",
 				    sc->res.unit, sc->name);
 				return (EIO);
 			}
-			digi_delay(sc, "digiinit0", 5);
+			digi_delay(sc, "digiinit0", 1);
 		}
 		DLOG(DIGIDB_INIT, (sc->dev, "Got init reset after %d us\n", i));
 
@@ -370,24 +370,24 @@
 
 	for (i = 0; ((sc->pcibus ? PCIPORT : inb(sc->port)) & FEPMASK)
 	    == resp; i++) {
-		if (i > 100) {
+		if (i > 10 * hz) {
 			log(LOG_ERR, "digi%d: BIOS start failed\n",
 			    sc->res.unit);
 			return (EIO);
 		}
-		digi_delay(sc, "digibios0", 5);
+		digi_delay(sc, "digibios0", 1);
 	}
 
 	DLOG(DIGIDB_INIT, (sc->dev, "BIOS started after %d us\n", i));
 
 	for (i = 0; vW(ptr) != *(u_short *)"GD"; i++) {
-		if (i > 200) {
+		if (i > 20 * hz) {
 			log(LOG_ERR, "digi%d: BIOS boot failed "
 			    "(0x%02x != 0x%02x)\n",
 			    sc->res.unit, vW(ptr), *(u_short *)"GD");
 			return (EIO);
 		}
-		digi_delay(sc, "digibios1", 5);
+		digi_delay(sc, "digibios1", 1);
 	}
 
 	DLOG(DIGIDB_INIT, (sc->dev, "BIOS booted after %d iterations\n", i));
@@ -421,13 +421,13 @@
 		outb(sc->port, FEPCLR | FEPMEM);
 
 		for (i = 0; W(ptr); i++) {
-			if (i > 100) {
+			if (i > 10 * hz) {
 				log(LOG_ERR, "digi%d: FEP/OS move failed\n",
 				    sc->res.unit);
 				sc->hidewin(sc);
 				return (EIO);
 			}
-			digi_delay(sc, "digifep0", 5);
+			digi_delay(sc, "digifep0", 1);
 		}
 		DLOG(DIGIDB_INIT,
 		    (sc->dev, "FEP/OS moved after %d iterations\n", i));
@@ -506,14 +506,14 @@
 
 	/* Now wait 'till the FEP/OS has booted */
 	for (i = 0; vW(ptr) != *(u_short *)"OS"; i++) {
-		if (i > 200) {
+		if (i > 20 * hz) {
 			log(LOG_ERR, "digi%d: FEP/OS start failed "
 			    "(0x%02x != 0x%02x)\n",
 			    sc->res.unit, vW(ptr), *(u_short *)"OS");
 			sc->hidewin(sc);
 			return (EIO);
 		}
-		digi_delay(sc, "digifep1", 5);
+		digi_delay(sc, "digifep1", 1);
 	}
 
 	DLOG(DIGIDB_INIT, (sc->dev, "FEP/OS started after %d iterations\n", i));
Index: digi_isa.c
===================================================================
RCS file: /home/ncvs/src/sys/dev/digi/digi_isa.c,v
retrieving revision 1.9
diff -u -r1.9 digi_isa.c
--- digi_isa.c	10 Apr 2002 14:32:55 -0000	1.9
+++ digi_isa.c	10 Apr 2002 23:48:03 -0000
@@ -112,12 +112,12 @@
 
 	/* Invasive probe - reset the card */
 	outb(sc->port, FEPRST);
-	for (i = 0; i < 10; i++) {
+	for (i = 0; i < 10 * hz; i++) {
 		if ((inb(sc->port) & FEPMASK) == FEPRST)
 			break;
 		digi_delay(sc, "digirst", 1);
 	}
-	if (i == 10)
+	if (i == 10 * hz)
 		return (NULL);
 	DLOG(DIGIDB_INIT, (sc->dev, "got reset after %d delays\n", i));
 
@@ -375,12 +375,12 @@
 		reset |= FEPMEM;
 
 	outb(sc->port, reset);
-	for (i = 0; i < 10; i++) {
+	for (i = 0; i < 10 * hz; i++) {
 		if ((inb(sc->port) & FEPMASK) == reset)
 			break;
 		digi_delay(sc, "digirst1", 1);
 	}
-	if (i == 10) {
+	if (i == 10 * hz) {
 		device_printf(dev, "1st reset failed\n");
 		sc->hidewin(sc);
 		goto failed;
@@ -397,12 +397,12 @@
 
 	if (sc->model == PCXI || sc->model == PCXE) {
 		outb(sc->port, FEPRST | FEPMEM);
-		for (i = 0; i < 10; i++) {
+		for (i = 0; i < 10 * hz; i++) {
 			if ((inb(sc->port) & FEPMASK) != FEPRST)
 				break;
 			digi_delay(sc, "digirst2", 1);
 		}
-		if (i == 10) {
+		if (i == 10 * hz) {
 			device_printf(dev, "2nd reset failed (0x%02x)\n",
 				inb(sc->port));
 			sc->hidewin(sc);



To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe cvs-all" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200204102359.g3ANxQOF059310>