diff mbox

[v4,08/12] fdc: add drive type option

Message ID 1453272694-17106-9-git-send-email-jsnow@redhat.com (mailing list archive)
State New, archived
Headers show

Commit Message

John Snow Jan. 20, 2016, 6:51 a.m. UTC
This patch adds a new explicit Floppy Drive Type option. The existing
behavior in QEMU is to automatically guess a drive type based on the
media inserted, or if a diskette is not present, arbitrarily assign one.

This behavior can be described as "auto." This patch adds the option
to pick an explicit behavior: 120, 144, 288 or none. The new "auto"
option is intended to mimic current behavior, while the other types
pick one explicitly.

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.)

Signed-off-by: John Snow <jsnow@redhat.com>
---
 hw/block/fdc.c | 26 +++++++++++++++++++++++---
 1 file changed, 23 insertions(+), 3 deletions(-)

Comments

Eric Blake Jan. 20, 2016, 10:43 p.m. UTC | #1
On 01/19/2016 11:51 PM, John Snow wrote:
> This patch adds a new explicit Floppy Drive Type option. The existing
> behavior in QEMU is to automatically guess a drive type based on the
> media inserted, or if a diskette is not present, arbitrarily assign one.
> 
> This behavior can be described as "auto." This patch adds the option

I might have written '"auto".' (the '.' is not part of the behavior
name).  But while grammar guides are starting to concede this style,
they still admit that for a long time English used to always put the
trailing '.' of a sentence inside the "", regardless of whether the
quoted material originally included a period at that point or whether it
was just the speaker ending their sentence on quoted material.

> to pick an explicit behavior: 120, 144, 288 or none. The new "auto"
> option is intended to mimic current behavior, while the other types
> pick one explicitly.
> 
> 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.)
> 
> Signed-off-by: John Snow <jsnow@redhat.com>
> ---
>  hw/block/fdc.c | 26 +++++++++++++++++++++++---
>  1 file changed, 23 insertions(+), 3 deletions(-)
> 
> diff --git a/hw/block/fdc.c b/hw/block/fdc.c
> index e9551e5..f475add 100644
> --- a/hw/block/fdc.c
> +++ b/hw/block/fdc.c
> @@ -159,7 +159,6 @@ static FloppyDriveType get_fallback_drive_type(FDrive *drv);
>  static void fd_init(FDrive *drv)
>  {
>      /* Drive */
> -    drv->drive = FLOPPY_DRIVE_TYPE_NONE;
>      drv->perpendicular = 0;
>      /* Disk */
>      drv->disk = FLOPPY_DRIVE_TYPE_NONE;
> @@ -263,7 +262,7 @@ static int pick_geometry(FDrive *drv)
>      int i, first_match, match;
>  
>      /* We can only pick a geometry if we have a diskette. */
> -    if (!drv->media_inserted) {
> +    if ((!drv->media_inserted) || (drv->drive == FLOPPY_DRIVE_TYPE_NONE)) {

I might have dropped the two inner () pairs.  But that's cosmetic.

Reviewed-by: Eric Blake <eblake@redhat.com>
John Snow Jan. 20, 2016, 11:04 p.m. UTC | #2
On 01/20/2016 05:43 PM, Eric Blake wrote:
> On 01/19/2016 11:51 PM, John Snow wrote:
>> This patch adds a new explicit Floppy Drive Type option. The existing
>> behavior in QEMU is to automatically guess a drive type based on the
>> media inserted, or if a diskette is not present, arbitrarily assign one.
>>
>> This behavior can be described as "auto." This patch adds the option
> 
> I might have written '"auto".' (the '.' is not part of the behavior
> name).  But while grammar guides are starting to concede this style,
> they still admit that for a long time English used to always put the
> trailing '.' of a sentence inside the "", regardless of whether the
> quoted material originally included a period at that point or whether it
> was just the speaker ending their sentence on quoted material.
> 

"Starting to concede" -- I think Strunk & White disagrees with you on
the concept that this is a cool new thing that young people do!

I will start putting my punctuation outside the quotation marks as soon
as everyone else agrees to stop using two spaces after the full stop.

I am taking no prisoners.

>> to pick an explicit behavior: 120, 144, 288 or none. The new "auto"
>> option is intended to mimic current behavior, while the other types
>> pick one explicitly.
>>
>> 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.)
>>
>> Signed-off-by: John Snow <jsnow@redhat.com>
>> ---
>>  hw/block/fdc.c | 26 +++++++++++++++++++++++---
>>  1 file changed, 23 insertions(+), 3 deletions(-)
>>
>> diff --git a/hw/block/fdc.c b/hw/block/fdc.c
>> index e9551e5..f475add 100644
>> --- a/hw/block/fdc.c
>> +++ b/hw/block/fdc.c
>> @@ -159,7 +159,6 @@ static FloppyDriveType get_fallback_drive_type(FDrive *drv);
>>  static void fd_init(FDrive *drv)
>>  {
>>      /* Drive */
>> -    drv->drive = FLOPPY_DRIVE_TYPE_NONE;
>>      drv->perpendicular = 0;
>>      /* Disk */
>>      drv->disk = FLOPPY_DRIVE_TYPE_NONE;
>> @@ -263,7 +262,7 @@ static int pick_geometry(FDrive *drv)
>>      int i, first_match, match;
>>  
>>      /* We can only pick a geometry if we have a diskette. */
>> -    if (!drv->media_inserted) {
>> +    if ((!drv->media_inserted) || (drv->drive == FLOPPY_DRIVE_TYPE_NONE)) {
> 
> I might have dropped the two inner () pairs.  But that's cosmetic.
> 

This nit, however, I'll edit.

> Reviewed-by: Eric Blake <eblake@redhat.com>
> 

--js
diff mbox

Patch

diff --git a/hw/block/fdc.c b/hw/block/fdc.c
index e9551e5..f475add 100644
--- a/hw/block/fdc.c
+++ b/hw/block/fdc.c
@@ -159,7 +159,6 @@  static FloppyDriveType get_fallback_drive_type(FDrive *drv);
 static void fd_init(FDrive *drv)
 {
     /* Drive */
-    drv->drive = FLOPPY_DRIVE_TYPE_NONE;
     drv->perpendicular = 0;
     /* Disk */
     drv->disk = FLOPPY_DRIVE_TYPE_NONE;
@@ -263,7 +262,7 @@  static int pick_geometry(FDrive *drv)
     int i, first_match, match;
 
     /* We can only pick a geometry if we have a diskette. */
-    if (!drv->media_inserted) {
+    if ((!drv->media_inserted) || (drv->drive == FLOPPY_DRIVE_TYPE_NONE)) {
         return -1;
     }
 
@@ -276,7 +275,7 @@  static int 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) {
@@ -313,11 +312,17 @@  static int pick_geometry(FDrive *drv)
 
 static void pick_drive_type(FDrive *drv)
 {
+    if (drv->drive != FLOPPY_DRIVE_TYPE_AUTO) {
+        return;
+    }
+
     if (pick_geometry(drv) == 0) {
         drv->drive = drv->disk;
     } else {
         drv->drive = get_fallback_drive_type(drv);
     }
+
+    g_assert(drv->drive != FLOPPY_DRIVE_TYPE_AUTO);
 }
 
 /* Revalidate a disk drive after a disk change */
@@ -2474,6 +2479,12 @@  static Property isa_fdc_properties[] = {
     DEFINE_PROP_DRIVE("driveB", FDCtrlISABus, state.drives[1].blk),
     DEFINE_PROP_BIT("check_media_rate", FDCtrlISABus, state.check_media_rate,
                     0, true),
+    DEFINE_PROP_DEFAULT("fdtypeA", FDCtrlISABus, state.drives[0].drive,
+                        FLOPPY_DRIVE_TYPE_AUTO, qdev_prop_fdc_drive_type,
+                        FloppyDriveType),
+    DEFINE_PROP_DEFAULT("fdtypeB", FDCtrlISABus, state.drives[1].drive,
+                        FLOPPY_DRIVE_TYPE_AUTO, qdev_prop_fdc_drive_type,
+                        FloppyDriveType),
     DEFINE_PROP_DEFAULT("fallback", FDCtrlISABus, state.fallback,
                         FLOPPY_DRIVE_TYPE_144, qdev_prop_fdc_drive_type,
                         FloppyDriveType),
@@ -2525,6 +2536,12 @@  static const VMStateDescription vmstate_sysbus_fdc ={
 static Property sysbus_fdc_properties[] = {
     DEFINE_PROP_DRIVE("driveA", FDCtrlSysBus, state.drives[0].blk),
     DEFINE_PROP_DRIVE("driveB", FDCtrlSysBus, state.drives[1].blk),
+    DEFINE_PROP_DEFAULT("fdtypeA", FDCtrlSysBus, state.drives[0].drive,
+                        FLOPPY_DRIVE_TYPE_AUTO, qdev_prop_fdc_drive_type,
+                        FloppyDriveType),
+    DEFINE_PROP_DEFAULT("fdtypeB", FDCtrlSysBus, state.drives[1].drive,
+                        FLOPPY_DRIVE_TYPE_AUTO, qdev_prop_fdc_drive_type,
+                        FloppyDriveType),
     DEFINE_PROP_DEFAULT("fallback", FDCtrlISABus, state.fallback,
                         FLOPPY_DRIVE_TYPE_144, qdev_prop_fdc_drive_type,
                         FloppyDriveType),
@@ -2548,6 +2565,9 @@  static const TypeInfo sysbus_fdc_info = {
 
 static Property sun4m_fdc_properties[] = {
     DEFINE_PROP_DRIVE("drive", FDCtrlSysBus, state.drives[0].blk),
+    DEFINE_PROP_DEFAULT("fdtype", FDCtrlSysBus, state.drives[0].drive,
+                        FLOPPY_DRIVE_TYPE_AUTO, qdev_prop_fdc_drive_type,
+                        FloppyDriveType),
     DEFINE_PROP_DEFAULT("fallback", FDCtrlISABus, state.fallback,
                         FLOPPY_DRIVE_TYPE_144, qdev_prop_fdc_drive_type,
                         FloppyDriveType),