All of lore.kernel.org
 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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.