Hi,
is anyone still using floppies? If yes, it would be nice if they could
give the diff below a test. It defers probing of the drives which reduces
boot time quite a bit. If floppy does not work with the diff, please also
test if it works without it. On qemu, floppy access seems to be broken (or
I did something wrong).
Cheers,
Stefan
diff --git a/sys/dev/isa/fd.c b/sys/dev/isa/fd.c
index 3e16d054428..460830a97cc 100644
--- a/sys/dev/isa/fd.c
+++ b/sys/dev/isa/fd.c
@@ -210,11 +210,11 @@ fdprobe(struct device *parent, void *match, void *aux)
/* select drive and turn on motor */
bus_space_write_1(iot, ioh, fdout, drive | FDO_FRST | FDO_MOEN(drive));
/* wait for motor to spin up */
- delay(250000);
+ tsleep(fdc, 0, "fdprobe", 250 * hz / 1000);
out_fdc(iot, ioh, NE7CMD_RECAL);
out_fdc(iot, ioh, drive);
/* wait for recalibrate */
- delay(2000000);
+ tsleep(fdc, 0, "fdprobe", 2000 * hz / 1000);
out_fdc(iot, ioh, NE7CMD_SENSEI);
n = fdcresult(fdc);
#ifdef FD_DEBUG
@@ -228,7 +228,7 @@ fdprobe(struct device *parent, void *match, void *aux)
#endif
/* turn off motor */
- delay(250000);
+ tsleep(fdc, 0, "fdprobe", 250 * hz / 1000);
bus_space_write_1(iot, ioh, fdout, FDO_FRST);
/* flags & 0x20 forces the drive to be found even if it won't probe */
diff --git a/sys/dev/isa/fdc.c b/sys/dev/isa/fdc.c
index c7b7ae4562c..ee195367322 100644
--- a/sys/dev/isa/fdc.c
+++ b/sys/dev/isa/fdc.c
@@ -57,6 +57,7 @@
#include <sys/syslog.h>
#include <sys/queue.h>
#include <sys/timeout.h>
+#include <sys/kthread.h>
#include <machine/cpu.h>
#include <machine/bus.h>
@@ -79,6 +80,8 @@
/* controller driver configuration */
int fdcprobe(struct device *, void *, void *);
void fdcattach(struct device *, struct device *, void *);
+void fdcattach_deferred(void *);
+void fdc_create_kthread(void *);
struct cfattach fdc_ca = {
sizeof(struct fdc_softc), fdcprobe, fdcattach
@@ -139,8 +142,6 @@ fdcattach(struct device *parent, struct device *self, void
*aux)
bus_space_handle_t ioh;
bus_space_handle_t ioh_ctl;
struct isa_attach_args *ia = aux;
- struct fdc_attach_args fa;
- int type;
iot = ia->ia_iot;
@@ -163,6 +164,22 @@ fdcattach(struct device *parent, struct device *self, void
*aux)
fdc->sc_ih = isa_intr_establish(ia->ia_ic, ia->ia_irq, IST_EDGE,
IPL_BIO, fdcintr, fdc, fdc->sc_dev.dv_xname);
+ kthread_create_deferred(fdc_create_kthread, fdc);
+}
+
+void
+fdc_create_kthread(void *arg)
+{
+ kthread_create(fdcattach_deferred, arg, NULL, "fdcattach");
+}
+
+void
+fdcattach_deferred(void *arg)
+{
+ struct fdc_softc *fdc = arg;
+ struct fdc_attach_args fa;
+ int type;
+
#if defined(__i386__) || defined(__amd64__)
/*
* The NVRAM info only tells us about the first two disks on the
@@ -187,8 +204,9 @@ fdcattach(struct device *parent, struct device *self, void
*aux)
else
#endif
fa.fa_deftype = NULL; /* unknown */
- (void)config_found(self, (void *)&fa, fddprint);
+ (void)config_found(&fdc->sc_dev, (void *)&fa, fddprint);
}
+ kthread_exit(0);
}
/*