[SeaBIOS] [PATCH 4/5] floppy: Wait for the floppy motor to reach a stable speed, after starting
Nikolay Nikolov
nickysn at gmail.com
Sat Feb 10 12:51:02 CET 2018
On Fri, 2018-02-09 at 23:35 -0500, Kevin O'Connor wrote:
> On Fri, Feb 09, 2018 at 02:31:02AM +0200, Nikolay Nikolov wrote:
> > When starting up the floppy motor, wait for a certain amount of
> > time, so
> > that it can spin up and reach a stable speed. This delay is
> > skipped, if the
> > motor was already running (which can happen, since the floppy motor
> > is
> > intentionally kept spinning for 2 seconds after the previous floppy
> > operation completes).
> >
> > Signed-off-by: Nikolay Nikolov <nickysn at users.sourceforge.net>
> > ---
> > src/hw/floppy.c | 13 +++++++++++--
> > 1 file changed, 11 insertions(+), 2 deletions(-)
> >
> > diff --git a/src/hw/floppy.c b/src/hw/floppy.c
> > index 730aadc..21389bc 100644
> > --- a/src/hw/floppy.c
> > +++ b/src/hw/floppy.c
> > @@ -37,6 +37,7 @@
> > #define FLOPPY_IRQ_TIMEOUT 5000
> > #define FLOPPY_SPECIFY1 0xAF // step rate 12ms, head unload 240ms
> > #define FLOPPY_SPECIFY2 0x02 // head load time 4ms, DMA used
> > +#define FLOPPY_STARTUP_TIME 8 // 1 second
> >
> > #define FLOPPY_DOR_MOTOR_D 0x80 // Set to turn drive 3's motor
> > ON
> > #define FLOPPY_DOR_MOTOR_C 0x40 // Set to turn drive 2's motor
> > ON
> > @@ -63,7 +64,7 @@ struct floppy_ext_dbt_s diskette_param_table2
> > VARFSEG = {
> > .gap_len = FLOPPY_FORMAT_GAPLEN,
> > .fill_byte = FLOPPY_FILLBYTE,
> > .settle_time = 0x0F, // 15ms
> > - .startup_time = 0x08, // 1 second
> > + .startup_time = FLOPPY_STARTUP_TIME,
> > },
> > .max_track = 79, // maximum track
> > .data_rate = 0, // data transfer rate
> > @@ -357,8 +358,16 @@ floppy_drive_pio(u8 floppyid, int command, u8
> > *param)
> > // set the disk motor timeout value of INT 08 to the highest
> > value
> > SET_BDA(floppy_motor_counter, 255);
> >
> > + // Check if the motor is already running
> > + u8 motor_mask = FLOPPY_DOR_MOTOR_A << floppyid;
> > + int motor_already_running = floppy_dor_read() & motor_mask;
> > +
> > // Turn on motor of selected drive, DMA & int enabled, normal
> > operation
> > - floppy_dor_write((FLOPPY_DOR_MOTOR_A << floppyid) |
> > FLOPPY_DOR_IRQ | FLOPPY_DOR_RESET | floppyid);
> > + floppy_dor_write(motor_mask | FLOPPY_DOR_IRQ |
> > FLOPPY_DOR_RESET | floppyid);
> > +
> > + // If the motor was just started, wait for it to get up to
> > speed
> > + if (!motor_already_running)
> > + msleep(FLOPPY_STARTUP_TIME * 125);
>
> Thanks. This delay is quite large and I fear it could adversely
> impact existing qemu users running old software on emulated floppies.
> I think the above might be better as:
>
> if (!motor_already_running && !runnongOnQEMU())
> msleep(FLOPPY_STARTUP_TIME * 125);
>
> I would not normally advocate making a special case for QEMU
> emulation, but a full second delay seems excessive.
Ok.
>
> The rest of the series looks good to me!
>
> Going forward, could you format the first line of the patch so that
> it
> does not exceed 80 characters - long first line descriptions do not
> interact well with "git shortlog".
Ok, I will edit all my commit messages in this series, so that they
fit.
Nikolay
More information about the SeaBIOS
mailing list