git: kernel: Make floppies work again.

Rimvydas Jasinskas zrj at crater.dragonflybsd.org
Wed Nov 29 08:03:34 PST 2017


commit 0bc821c68ba308f17d4f0a7bfd300c432d575a09
Author: zrj <rimvydas.jasinskas at gmail.com>
Date:   Tue Nov 28 13:44:44 2017 +0200

    kernel: Make floppies work again.
    
    Revive the old x86 32bit only fdc(4) driver, it only needs just a few changes.
    The fdc was never ported to work on x86_64 DragonFly, so rather than remove it
    together with its manpage, fix few things and hook it to LINT64 config so that
    we would keep track the state of it and not keep it in a dusty corner of sys/.
    
    On modern x86_64 systems fdc($) has little value and it is getting harder and
    harder to find floppy drives that work or even the motherboards that still have
    the FDD headers to hook the 34pin ribbon cable, but I feel nostalgic about the
    scratching noises the floppy drive makes while performing the operations.
    So went through all storage closets and find one that works, blew out all the
    accumulated dusts, cleaned the magnetic heads with a folder paper tissue good.
    The hardest part was to find a floppy disk. Only could find just a single one
    stashed away deep on the floor of a very old safe under heeps of old documents.
    
    For fdc(4) to actually work, some adjustmens to isa_dma.c were needed because
    of how ISA bus probing is done in platform/pc64/x86_64/autoconf.c. To work
    around the exhaustion of low DMA memory before it gets to isa_probe_children()
    now try to preallocate contiguous buffer of 512KB and free it just before the
    probe of ISA bus. This should help any legacy ISA drivers(including ppc(4))
    or even some of more picky drivers that are not built in into the kernel.
    
    For case where isa_dmainit() would still fail to allocate the buffer fitting
    the requirements, have added the safety checks and explicit fallback to non
    DMA mode by setting the FDC_NODMA flag to avoid panics on "bad bounce buffer".
    Floppy drive would not work properly, but it is this versus a panic. There are
    other issues too. For some reason some files tend to be read with stripes of
    zeros, but write operations seems to work. Same floppy is readable on linux.
    
    Currently can not debug the issue cause my floppy had seen better days:
    _# time dd if=/dev/fd0 of=/tmp/recover.img conv=sync,noerror
    ...
    dd: /dev/fd0: Input/output error
    2880+0 records in
    2880+0 records out
    1474560 bytes transferred in 80.723953 secs (18267 bytes/sec)
    
    while dmesg:
    fd0: hard error reading offset 00000000ae00 for 512 (ST0 40<abnrml> ST1 20<bad_crc> ST2 20<bad_crc> cyl 2 hd 0 sec 16)
    fd0: hard error reading offset 00000000f600 for 512 (ST0 40<abnrml> ST1 1<no_am> ST2 1<no_dam> cyl 3 hd 0 sec 16)
    fd0: hard error reading offset 000000113800 for 512 (ST0 40<abnrml> ST1 20<bad_crc> ST2 20<bad_crc> cyl 61 hd 0 sec 9)
    fd0: hard error reading offset 000000115c00 for 512 (ST0 44<abnrml,top_head> ST1 4<sec_not_fnd> ST2 10<wrong_cyl> cyl 61 hd 1 sec 9)
    fd0: hard error reading offset 00000011a400 for 512 (ST0 44<abnrml,top_head> ST1 4<sec_not_fnd> ST2 0 cyl 62 hd 1 sec 9)
    fd0: hard error reading offset 00000011ec00 for 512 (ST0 44<abnrml,top_head> ST1 4<sec_not_fnd> ST2 0 cyl 63 hd 1 sec 9)
    fd0: hard error reading offset 000000123400 for 512 (ST0 44<abnrml,top_head> ST1 4<sec_not_fnd> ST2 0 cyl 64 hd 1 sec 9)
    fd0: hard error reading offset 000000127c00 for 512 (ST0 44<abnrml,top_head> ST1 4<sec_not_fnd> ST2 0 cyl 65 hd 1 sec 9)
    
    Given the state of my single floppy I cannot even do a proper newfs_msdos(8).
    So maybe someone who has a collection of good floppies could give it a go.
    
    While there, hook old musycc(4) driver to LINT64, it was fixed in:
    906779c3d1e064e55bb019342ad6c1621cc04399

Summary of changes:
 sys/bus/isa/isavar.h                |  8 ++++++-
 sys/bus/isa/x86_64/isa_dma.c        | 42 ++++++++++++++++++++++---------------
 sys/conf/files                      |  2 ++
 sys/config/LINT64                   | 14 ++++++++-----
 sys/dev/disk/fd/fd.c                | 16 +++++++++++---
 sys/dev/disk/fd/fdc.h               |  3 +--
 sys/platform/pc64/x86_64/autoconf.c | 23 ++++++++++++++++++++
 sys/vm/vm_page.c                    |  2 +-
 8 files changed, 81 insertions(+), 29 deletions(-)

http://gitweb.dragonflybsd.org/dragonfly.git/commitdiff/0bc821c68ba308f17d4f0a7bfd300c432d575a09


-- 
DragonFly BSD source repository



More information about the Commits mailing list