[SeaBIOS] [PATCH 7/7] Use timer_check() instead of using floppy_motor_counter in BDA for the timeout check in floppy_wait_irq()

Nikolay Nikolov nickysn at gmail.com
Sat Feb 3 21:28:36 CET 2018


On Sat, 2018-02-03 at 15:17 -0500, Kevin O'Connor wrote:
> On Sat, Feb 03, 2018 at 07:46:11PM +0200, Nikolay Nikolov wrote:
> > The problem with using floppy_motor_counter was that, after it
> > reaches 0,
> > it immediately stops the floppy motors, which is not what is
> > supposed to
> > happen on real hardware. Instead, after a timeout (like in the end
> > of
> > every floppy operation, regardless of the result - success, timeout
> > or
> > error), the floppy motors must be kept spinning for additional 2
> > seconds
> > (the FLOPPY_MOTOR_TICKS). So, now the floppy_motor_counter is
> > initialized
> > to 255 (the max value) in the beginning of the floppy operation (in
> > floppy_turn_on_motor()). For IRQ timeouts, a different timeout is
> > used,
> > specified by the new FLOPPY_IRQ_TIMEOUT constant (currently set to
> > 5
> > seconds - a fairly conservative value, but should work reliably on
> > most
> > floppies).
> > 
> > After the floppy operation, floppy_turn_off_motor_delayed() resets
> > the
> > floppy_motor_counter to 2 seconds (FLOPPY_MOTOR_TICKS).
> > 
> > This is also consistent with what other PC BIOSes do.
> > 
> > Signed-off-by: Nikolay Nikolov <nickysn at users.sourceforge.net>
> > ---
> >  src/hw/floppy.c | 8 +++++---
> >  1 file changed, 5 insertions(+), 3 deletions(-)
> > 
> > diff --git a/src/hw/floppy.c b/src/hw/floppy.c
> > index acaff3f..6714402 100644
> > --- a/src/hw/floppy.c
> > +++ b/src/hw/floppy.c
> > @@ -34,6 +34,7 @@
> >  #define FLOPPY_GAPLEN 0x1B
> >  #define FLOPPY_FORMAT_GAPLEN 0x6c
> >  #define FLOPPY_PIO_TIMEOUT 1000
> > +#define FLOPPY_IRQ_TIMEOUT 5000
> >  
> >  #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
> > @@ -221,8 +222,9 @@ floppy_wait_irq(void)
> >  {
> >      u8 frs = GET_BDA(floppy_recalibration_status);
> >      SET_BDA(floppy_recalibration_status, frs & ~FRS_IRQ);
> > +    u32 end = timer_calc(FLOPPY_IRQ_TIMEOUT);
> >      for (;;) {
> > -        if (!GET_BDA(floppy_motor_counter)) {
> > +        if (timer_check(end)) {
> >              warn_timeout();
> >              floppy_disable_controller();
> >              return DISK_RET_ETIMEOUT;
> 
> Thanks.  This patch looks good to me.
> 
> One question - if floppy_wait_irq() no longer accesses
> floppy_motor_counter, can we also change floppy_enable_controller()
> to
> not alter floppy_motor_counter as well?  That is, can we treat
> floppy_motor_counter as part of the logic to send commands to drives
> (as opposed to sending commands to the controller) and thus limit
> floppy_motor_counter logic to the floppy_drive_pio() code?

Yes, I think so. Should I amend it to this patch?

> 
> -Kevin



More information about the SeaBIOS mailing list