From owner-cvs-all Wed Apr 10 17: 0:53 2002 Delivered-To: cvs-all@freebsd.org Received: from Awfulhak.org (gw.Awfulhak.org [217.204.245.18]) by hub.freebsd.org (Postfix) with ESMTP id 70A3B37B41A; Wed, 10 Apr 2002 17:00:11 -0700 (PDT) Received: from hak.lan.Awfulhak.org (root@hak.lan.Awfulhak.org [IPv6:fec0::1:12]) by Awfulhak.org (8.12.2/8.11.6) with ESMTP id g3ANxRoi032634; Thu, 11 Apr 2002 00:59:49 +0100 (BST) (envelope-from brian@freebsd-services.com) Received: from hak.lan.Awfulhak.org (brian@localhost [127.0.0.1]) by hak.lan.Awfulhak.org (8.12.2/8.12.2) with ESMTP id g3ANxQOF059310; Thu, 11 Apr 2002 00:59:26 +0100 (BST) (envelope-from brian@freebsd-services.com) Message-Id: <200204102359.g3ANxQOF059310@hak.lan.Awfulhak.org> X-Mailer: exmh version 2.5 07/13/2001 with nmh-1.0.4 To: Peter Jeremy Cc: Brian Somers , cvs-committers@FreeBSD.ORG, cvs-all@FreeBSD.ORG Subject: Re: cvs commit: src/sys/dev/digi digi.c In-Reply-To: Message from Peter Jeremy of "Thu, 11 Apr 2002 07:18:55 +1000." <20020411071854.Q69202@gsmx07.alcatel.com.au> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Date: Thu, 11 Apr 2002 00:59:25 +0100 From: Brian Somers Sender: owner-cvs-all@FreeBSD.ORG Precedence: bulk List-ID: List-Archive: (Web Archive) List-Help: (List Instructions) List-Subscribe: List-Unsubscribe: X-Loop: FreeBSD.ORG > On 2002-Apr-09 20:13:28 -0700, Brian Somers 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 http://www.freebsd-services.com/ Don't _EVER_ lose your sense of humour ! 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