On Wed, Dec 04, 2013 at 09:27:20AM +0100, Gelip wrote:
Hi. I try set floppy support in SeaBIOS like this:
The floppy support in SeaBIOS has been tested on qemu, but has never been tested on real hardware. Your test indicates the SeaBIOS floppy support is not complete.
If you want to help debug this, apply the patch below to the latest seabios code from the seabios git, compile seabios with a debug level of 8, retry the test, and forward the results back to seabios@seabios.org. If you can capture the serial port traffic with the scripts/readserial.py tool from the seabios repo that would help (by providing additional timing information).
-Kevin
diff --git a/src/hw/floppy.c b/src/hw/floppy.c index e73b303..4cf9684 100644 --- a/src/hw/floppy.c +++ b/src/hw/floppy.c @@ -183,6 +183,7 @@ find_floppy_type(u32 size) static void floppy_disable_controller(void) { + dprintf(1, "floppy_disable_controller\n"); outb(inb(PORT_FD_DOR) & ~0x04, PORT_FD_DOR); }
@@ -191,8 +192,10 @@ floppy_wait_irq(void) { u8 frs = GET_BDA(floppy_recalibration_status); SET_BDA(floppy_recalibration_status, frs & ~FRS_IRQ); + dprintf(1, "floppy_wait_irq frs=%x\n", frs); for (;;) { if (!GET_BDA(floppy_motor_counter)) { + warn_timeout(); floppy_disable_controller(); return DISK_RET_ETIMEOUT; } @@ -218,6 +221,7 @@ struct floppy_pio_s { static int floppy_pio(struct floppy_pio_s *pio) { + dprintf(1, "floppy_pio\n"); // Send command to controller. u32 end = timer_calc(FLOPPY_PIO_TIMEOUT); int i = 0; @@ -225,6 +229,7 @@ floppy_pio(struct floppy_pio_s *pio) u8 sts = inb(PORT_FD_STATUS); if (!(sts & 0x80)) { if (timer_check(end)) { + warn_timeout(); floppy_disable_controller(); return DISK_RET_ETIMEOUT; } @@ -253,6 +258,7 @@ floppy_pio(struct floppy_pio_s *pio) u8 sts = inb(PORT_FD_STATUS); if (!(sts & 0x80)) { if (timer_check(end)) { + warn_timeout(); floppy_disable_controller(); return DISK_RET_ETIMEOUT; } @@ -273,6 +279,7 @@ floppy_pio(struct floppy_pio_s *pio) static int floppy_enable_controller(void) { + dprintf(1, "floppy_enable_controller\n"); outb(inb(PORT_FD_DOR) | 0x04, PORT_FD_DOR); int ret = floppy_wait_irq(); if (ret) @@ -289,6 +296,7 @@ floppy_enable_controller(void) static int floppy_select_drive(u8 floppyid) { + dprintf(1, "floppy_select_drive %d\n", floppyid); // reset the disk motor timeout value of INT 08 SET_BDA(floppy_motor_counter, FLOPPY_MOTOR_TICKS);
@@ -302,6 +310,7 @@ floppy_select_drive(u8 floppyid)
// Turn on motor of selected drive, DMA & int enabled, normal operation dor = (floppyid ? 0x20 : 0x10) | 0x0c | floppyid; + dprintf(1, "floppy_select_drive enable motor dor=%x\n", dor); outb(dor, PORT_FD_DOR);
return DISK_RET_SUCCESS; @@ -321,6 +330,7 @@ set_diskette_current_cyl(u8 floppyid, u8 cyl) static int floppy_drive_recal(u8 floppyid) { + dprintf(1, "floppy_drive_recal %d\n", floppyid); int ret = floppy_select_drive(floppyid); if (ret) return ret; @@ -353,6 +363,8 @@ floppy_drive_recal(u8 floppyid) static int floppy_drive_readid(u8 floppyid, u8 data_rate, u8 head) { + dprintf(1, "floppy_drive_readid %d rate=%x head=%x\n" + , floppyid, data_rate, head); int ret = floppy_select_drive(floppyid); if (ret) return ret; @@ -380,6 +392,7 @@ floppy_media_sense(struct drive_s *drive_gf) { u8 ftype = GET_GLOBALFLAT(drive_gf->floppy_type), stype = ftype; u8 floppyid = GET_GLOBALFLAT(drive_gf->cntl_id); + dprintf(1, "floppy_media_sense %d ftype=%x\n", floppyid, ftype);
u8 data_rate = GET_GLOBAL(FloppyInfo[stype].data_rate); int ret = floppy_drive_readid(floppyid, data_rate, 0); @@ -413,6 +426,8 @@ floppy_media_sense(struct drive_s *drive_gf) < GET_GLOBAL(FloppyInfo[ftype].chs.cylinder)) fms |= FMS_DOUBLE_STEPPING; SET_BDA(floppy_media_state[floppyid], fms); + dprintf(1, "floppy_media_sense finish %d data_rate=%x fms=%x stype=%x\n" + , floppyid, data_rate, fms, stype);
return DISK_RET_SUCCESS; } @@ -425,6 +440,7 @@ check_recal_drive(struct drive_s *drive_gf) && (GET_BDA(floppy_media_state[floppyid]) & FMS_MEDIA_DRIVE_ESTABLISHED)) // Media is known. return DISK_RET_SUCCESS; + dprintf(1, "check_recal_drive %d\n", floppyid);
// Recalibrate drive. int ret = floppy_drive_recal(floppyid);