[PATCH 00/31] block/swim: Fixes and improvements

From: Finn Thain

Date: Thu Jul 16 2026 - 06:18:19 EST


I recently had a need for the 'swim' driver but found that it was too buggy
to be useful for my purposes. I had two aims in mind--

Firstly, I needed this driver to help me test my new BMoW Floppy Emu for
emulation correctness. Being that Linux is open source and MacOS is not,
this driver should be ideal for that.

Secondly, I needed to realign the heads in some disk drives. The swim driver
has most of the code needed for a feedback loop for manual re-alignment, so
I wrote the remaining code and pushed it to a repo here:
https://github.com/fthain/linux/commits/swim/

These patches fix all the bugs I found. They improve stability,
compatibility and performance. Additional patches improve source code
quality by removing redundant code and cleaning up a bit.

This patch series was successfully tested on the following systems.

Mac Quadra 650 - SWIM 2 with Mitsubishi FDD
Mac LC III - SWIM 2 with Mitsubishi FDD and Sony FDD
Mac Quadra 700 - SWIM with Sony FDD
Mac IIvx - SWIM with Sony FDD

---

Finn Thain (31):
swim: Assert strobe with stable outputs
swim: Select appropriate drive once only
swim: Enable the drive when probing
swim: Don't disable drive after every sector
swim: Perform ISM/IWM mode switching according to specs
swim: Configure parameter memory
swim: Enable clock divider only where appropriate
swim: Don't start motor until medium is present
swim: Recalibrate when drive is probed
swim: Add track zero recalibration delay
swim: Handle FIFO timeout error
swim: Simplify return value initialization
swim: Check for CRC errors
swim: Check error register during sector read
swim: Don't use the mark register to read data
swim: Fix buffer overflow
swim: Convert to blocking queue
swim: Remove redundant RELAX actions
swim: Deduplicate polling loops
swim: Check drive ready bit
swim: Revisit delays
swim: Remove pointless mode0 register write
swim: Don't needlessly re-read sectors
swim: Remove pointless specifiers
swim: Move swd initialization
swim: Add some helpful references
swim: Remove unused macro definitions
swim: Clean up whitespace
swim: Define macros for constants
swim: Define symbols for constants
swim: Unexport global symbols

arch/m68k/mac/config.c | 31 ++-
drivers/block/swim.c | 422 ++++++++++++++++++++-------------------
drivers/block/swim_asm.S | 306 ++++++++++++++--------------
3 files changed, 403 insertions(+), 356 deletions(-)

--
2.52.0