[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v3 07/11] fdc: implement new drive type property
From: |
John Snow |
Subject: |
[Qemu-devel] [PATCH v3 07/11] fdc: implement new drive type property |
Date: |
Wed, 16 Dec 2015 17:16:13 -0500 |
Respect the drive type as given via the CLI.
Set the type given by the CLI during fd_init. If the type remains the
default (auto), we'll attempt to scan an inserted diskette if present
to determine a type. If auto is selected but no diskette is present,
we fall back to a predetermined default (currently 1.44MB to match
legacy QEMU behavior.)
The pick_geometry algorithm is modified to only allow matches outside
of the existing drive type for the new auto behavior. If a user specifies
the "none" type, QEMU will not report this drive to the CMOS.
Signed-off-by: John Snow <address@hidden>
---
hw/block/fdc.c | 23 +++++++++++++++++------
1 file changed, 17 insertions(+), 6 deletions(-)
diff --git a/hw/block/fdc.c b/hw/block/fdc.c
index e752758..f44472c 100644
--- a/hw/block/fdc.c
+++ b/hw/block/fdc.c
@@ -155,13 +155,11 @@ typedef struct FDrive {
bool media_inserted; /* Is there a medium in the tray */
} FDrive;
-
static FloppyDriveType get_fallback_drive_type(FDrive *drv);
static void fd_init(FDrive *drv)
{
/* Drive */
- drv->drive = FLOPPY_DRIVE_TYPE_NONE; /* FIXME: Obey CLI properties */
drv->perpendicular = 0;
/* Disk */
drv->disk = FLOPPY_DRIVE_TYPE_NONE;
@@ -274,7 +272,7 @@ static bool pick_geometry(FDrive *drv)
break;
}
if (drv->drive == parse->drive ||
- drv->drive == FLOPPY_DRIVE_TYPE_NONE) {
+ drv->drive == FLOPPY_DRIVE_TYPE_AUTO) {
size = (parse->max_head + 1) * parse->max_track *
parse->last_sect;
if (nb_sectors == size) {
@@ -288,7 +286,10 @@ static bool pick_geometry(FDrive *drv)
}
if (match == -1) {
if (first_match == -1) {
- match = 1;
+ /* No entry found: drive_type was NONE or we neglected to add any
+ * candidate geometries for our drive type into the fd_formats
table
+ */
+ match = ARRAY_SIZE(fd_formats) - 1;
} else {
match = first_match;
}
@@ -316,9 +317,19 @@ static bool pick_geometry(FDrive *drv)
static void pick_drive_type(FDrive *drv)
{
- if (pick_geometry(drv)) {
- drv->drive = drv->disk;
+ if (drv->drive != FLOPPY_DRIVE_TYPE_AUTO) {
+ return;
}
+
+ if (!drv->media_inserted) {
+ drv->drive = get_fallback_drive_type(drv);
+ } else {
+ if (pick_geometry(drv)) {
+ drv->drive = drv->disk;
+ }
+ }
+
+ g_assert(drv->drive != FLOPPY_DRIVE_TYPE_AUTO);
}
/* Revalidate a disk drive after a disk change */
--
2.4.3
- Re: [Qemu-devel] [PATCH v3 05/11] fdc: Add fallback option, (continued)
- [Qemu-devel] [PATCH v3 09/11] fdc: rework pick_geometry, John Snow, 2015/12/16
- [Qemu-devel] [PATCH v3 06/11] fdc: do not call revalidate on eject, John Snow, 2015/12/16
- [Qemu-devel] [PATCH v3 07/11] fdc: implement new drive type property,
John Snow <=
- [Qemu-devel] [PATCH v3 10/11] qtest/fdc: Support for 2.88MB drives, John Snow, 2015/12/16
- [Qemu-devel] [PATCH v3 11/11] fdc: change auto fallback drive for ISA FDC to 288, John Snow, 2015/12/16
- [Qemu-devel] [PATCH v3 04/11] fdc: add default drive type option, John Snow, 2015/12/16