On Wed, Dec 04, 2013 at 10:22:17AM -0500, Kevin O'Connor wrote:
> 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(a)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
Sorry, try the patch below with the very latest seabios git.
-Kevin
diff --git a/src/hw/floppy.c b/src/hw/floppy.c
index d43b489..190ef30 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);
}
@@ -219,6 +220,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;
@@ -276,6 +278,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)
@@ -292,6 +295,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);
@@ -305,6 +309,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;
@@ -324,6 +329,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;
@@ -356,6 +362,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;
@@ -383,6 +391,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);
@@ -416,6 +425,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;
}
@@ -428,6 +439,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);