[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH for-2.6 v2 06/10] fdc: implement new drive type prop
From: |
John Snow |
Subject: |
[Qemu-devel] [PATCH for-2.6 v2 06/10] fdc: implement new drive type property |
Date: |
Mon, 7 Dec 2015 18:34:31 -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 | 45 ++++++++++++++++++++++++++++++++++++++++-----
1 file changed, 40 insertions(+), 5 deletions(-)
diff --git a/hw/block/fdc.c b/hw/block/fdc.c
index 39e680b..9bb3021 100644
--- a/hw/block/fdc.c
+++ b/hw/block/fdc.c
@@ -161,10 +161,12 @@ typedef struct FDrive {
bool media_inserted; /* Is there a medium in the tray */
} FDrive;
+static FloppyDriveType get_default_drive_type(FDrive *drv);
+
static void fd_init(FDrive *drv)
{
/* Drive */
- drv->drive = FLOPPY_DRIVE_TYPE_NONE;
+ drv->drive = get_default_drive_type(drv);
drv->perpendicular = 0;
/* Disk */
drv->disk = FLOPPY_DRIVE_TYPE_NONE;
@@ -277,7 +279,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) {
@@ -291,13 +293,17 @@ 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;
}
parse = &fd_formats[match];
}
+ out:
if (parse->max_head == 0) {
drv->flags &= ~FDISK_DBL_SIDES;
} else {
@@ -319,8 +325,16 @@ 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 = FDRIVE_AUTO_FALLBACK;
+ } else {
+ if (pick_geometry(drv)) {
+ drv->drive = drv->disk;
+ }
}
}
@@ -623,6 +637,27 @@ typedef struct FDCtrlISABus {
int32_t bootindexB;
} FDCtrlISABus;
+static FloppyDriveType get_default_drive_type(FDrive *drv)
+{
+ FDCtrl *fdctrl = drv->fdctrl;
+
+ g_assert_cmpint(MAX_FD, ==, 2);
+
+ if (!drv->blk) {
+ return FLOPPY_DRIVE_TYPE_NONE;
+ }
+
+ if (drv == &fdctrl->drives[0]) {
+ return fdctrl->typeA;
+ }
+
+ if (drv == &fdctrl->drives[1]) {
+ return fdctrl->typeB;
+ }
+
+ return FDRIVE_DEFAULT;
+}
+
static uint32_t fdctrl_read (void *opaque, uint32_t reg)
{
FDCtrl *fdctrl = opaque;
--
2.4.3
- [Qemu-devel] [PATCH for-2.6 v2 07/10] fdc: add physical disk sizes, (continued)
- [Qemu-devel] [PATCH for-2.6 v2 08/10] fdc: rework pick_geometry, John Snow, 2015/12/07
- [Qemu-devel] [PATCH for-2.6 v2 01/10] fdc: move pick_geometry, John Snow, 2015/12/07
- [Qemu-devel] [PATCH for-2.6 v2 06/10] fdc: implement new drive type property,
John Snow <=
- [Qemu-devel] [PATCH for-2.6 v2 09/10] qtest/fdc: Support for 2.88MB drives, John Snow, 2015/12/07
- [Qemu-devel] [PATCH for-2.6 v2 10/10] fdc: change auto fallback drive to 288, John Snow, 2015/12/07