qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: John Snow <jsnow@redhat.com>
To: qemu-block@nongnu.org
Cc: kwolf@redhat.com, John Snow <jsnow@redhat.com>,
	armbru@redhat.com, qemu-devel@nongnu.org
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	[thread overview]
Message-ID: <1449531275-30362-7-git-send-email-jsnow@redhat.com> (raw)
In-Reply-To: <1449531275-30362-1-git-send-email-jsnow@redhat.com>

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 <jsnow@redhat.com>
---
 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

  parent reply	other threads:[~2015-12-07 23:34 UTC|newest]

Thread overview: 17+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-12-07 23:34 [Qemu-devel] [PATCH for-2.6 v2 00/10] fdc: fix 2.88mb floppy diskette support John Snow
2015-12-07 23:34 ` [Qemu-devel] [PATCH for-2.6 v2 01/10] fdc: move pick_geometry John Snow
2015-12-15 21:51   ` Hervé Poussineau
2015-12-15 21:56     ` John Snow
2015-12-16 21:14     ` John Snow
2015-12-07 23:34 ` [Qemu-devel] [PATCH for-2.6 v2 02/10] fdc: refactor pick_geometry John Snow
2015-12-07 23:34 ` [Qemu-devel] [PATCH for-2.6 v2 03/10] fdc: add disk field John Snow
2015-12-07 23:34 ` [Qemu-devel] [PATCH for-2.6 v2 04/10] fdc: add default drive type option John Snow
2015-12-07 23:56   ` Eric Blake
2015-12-14 20:05     ` John Snow
2015-12-15 16:29       ` Eric Blake
2015-12-07 23:34 ` [Qemu-devel] [PATCH for-2.6 v2 05/10] fdc: do not call revalidate on eject John Snow
2015-12-07 23:34 ` John Snow [this message]
2015-12-07 23:34 ` [Qemu-devel] [PATCH for-2.6 v2 07/10] fdc: add physical disk sizes John Snow
2015-12-07 23:34 ` [Qemu-devel] [PATCH for-2.6 v2 08/10] fdc: rework pick_geometry John Snow
2015-12-07 23:34 ` [Qemu-devel] [PATCH for-2.6 v2 09/10] qtest/fdc: Support for 2.88MB drives John Snow
2015-12-07 23:34 ` [Qemu-devel] [PATCH for-2.6 v2 10/10] fdc: change auto fallback drive to 288 John Snow

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1449531275-30362-7-git-send-email-jsnow@redhat.com \
    --to=jsnow@redhat.com \
    --cc=armbru@redhat.com \
    --cc=kwolf@redhat.com \
    --cc=qemu-block@nongnu.org \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).