diff --git a/sys/dev/isa/fd.c b/sys/dev/isa/fd.c index 3a9b6f3cb0df..34a469c04255 100644 --- a/sys/dev/isa/fd.c +++ b/sys/dev/isa/fd.c @@ -1,4 +1,4 @@ -/* $NetBSD: fd.c,v 1.46 2003/08/07 16:31:06 agc Exp $ */ +/* $NetBSD: fd.c,v 1.47 2003/09/23 21:36:07 mycroft Exp $ */ /*- * Copyright (c) 1998 The NetBSD Foundation, Inc. @@ -88,7 +88,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: fd.c,v 1.46 2003/08/07 16:31:06 agc Exp $"); +__KERNEL_RCSID(0, "$NetBSD: fd.c,v 1.47 2003/09/23 21:36:07 mycroft Exp $"); #include "rnd.h" #include "opt_ddb.h" @@ -410,8 +410,12 @@ fdprobe(parent, match, aux) delay(250000); out_fdc(iot, ioh, NE7CMD_RECAL); out_fdc(iot, ioh, drive); - /* wait for recalibrate */ - delay(2000000); + /* wait for recalibrate, up to 2s */ + for (n = 20000; n; n--) { + delay(100); + if ((bus_space_read_1(iot, ioh, fdsts) & FDS_DRVBUSY(drive)) == 0) + break; + } out_fdc(iot, ioh, NE7CMD_SENSEI); n = fdcresult(fdc); #ifdef FD_DEBUG @@ -773,16 +777,19 @@ out_fdc(iot, ioh, x) bus_space_handle_t ioh; u_char x; { - int i = 100000; + u_char i; + u_int j = 100000; - while ((bus_space_read_1(iot, ioh, fdsts) & NE7_DIO) && i-- > 0); - if (i <= 0) - return -1; - while ((bus_space_read_1(iot, ioh, fdsts) & NE7_RQM) == 0 && i-- > 0); - if (i <= 0) - return -1; - bus_space_write_1(iot, ioh, fddata, x); - return 0; + for (; j; j--) { + i = bus_space_read_1(iot, ioh, fdsts) & + (NE7_DIO | NE7_RQM); + if (i == NE7_RQM) { + bus_space_write_1(iot, ioh, fddata, x); + return 0; + } + delay(10); + } + return -1; } int diff --git a/sys/dev/isa/fdreg.h b/sys/dev/isa/fdreg.h index dba20c0a8e0c..57de935fdfc5 100644 --- a/sys/dev/isa/fdreg.h +++ b/sys/dev/isa/fdreg.h @@ -1,4 +1,4 @@ -/* $NetBSD: fdreg.h,v 1.3 2003/08/07 16:31:07 agc Exp $ */ +/* $NetBSD: fdreg.h,v 1.4 2003/09/23 21:36:08 mycroft Exp $ */ /*- * Copyright (c) 1991 The Regents of the University of California. @@ -46,6 +46,8 @@ #define FDO_MOEN(n) ((1 << n) * 0x10) /* motor enable */ #define fdsts 2 /* NEC 765 Main Status Register (R) */ +#define FDS_DRVBUSY(n) ((1 << n) * 0x01) /* drive busy */ + #define fddata 3 /* NEC 765 Data Register (R/W) */ #define fdctl 5 /* Control Register (W) */