[PATCH 14/31] swim: Check error register during sector read

From: Finn Thain

Date: Thu Jul 16 2026 - 06:25:57 EST


Clear the error register only once before a sector read operation. Don't
clear it afterwards -- the caller needs it. Check the error register in
swim_read_sector() and return the appropriate error when necessary. Fully
validate the sector header. Don't terminate the search loop early just
because an erroneous sector header showed up.

Fixes: 8852ecd97488 ("m68k: mac - Add SWIM floppy support")
Signed-off-by: Finn Thain <fthain@xxxxxxxxxxxxxx>
---
drivers/block/swim.c | 13 +++++++------
drivers/block/swim_asm.S | 8 --------
2 files changed, 7 insertions(+), 14 deletions(-)

diff --git a/drivers/block/swim.c b/drivers/block/swim.c
index 9755b86d4dd4..e2a8c4ba4e39 100644
--- a/drivers/block/swim.c
+++ b/drivers/block/swim.c
@@ -483,20 +483,21 @@ static inline int swim_read_sector(struct floppy_state *fs,

local_irq_save(flags);
for (i = 0; i < 36; i++) {
- ret = swim_read_sector_header(base, &header);
- if (!ret && (header.sector == sector)) {
+ if (swim_read_sector_header(base, &header) ||
+ swim_read(base, error) || header.track != track ||
+ header.side != side || header.size != 2)
+ continue;
+ if (header.sector == sector) {
/* found */

ret = swim_read_sector_data(base, buffer);
+ if (swim_read(base, error))
+ ret = -EIO;
break;
}
}
local_irq_restore(flags);

- if ((header.side != side) || (header.track != track) ||
- (header.sector != sector))
- return 0;
-
return ret;
}

diff --git a/drivers/block/swim_asm.S b/drivers/block/swim_asm.S
index f40e19e48021..1d394ee930d6 100644
--- a/drivers/block/swim_asm.S
+++ b/drivers/block/swim_asm.S
@@ -67,7 +67,6 @@ mfm_read_addrmark:
movew #seek_time, %d2

wait_header_init:
- tstb %a3@(read_error - read_mark)
moveb #0x18, %a3@(write_mode0 - read_mark)
moveb #0x01, %a3@(write_mode1 - read_mark)
moveb #0x01, %a3@(write_mode0 - read_mark)
@@ -139,8 +138,6 @@ crc1: moveb %a2@, %d5
andb #.Lhr_crc_error, %d5
bne signal_nonyb

- tstb %a3@(read_error - read_mark)
-
moveq #0, %d0
signal_nonyb:
moveb #0x18, %a3@(write_mode0 - read_mark)
@@ -165,7 +162,6 @@ mfm_read_data:
movew #seek_time, %d2

wait_data_init:
- tstb %a3@(read_error - read_mark)
moveb #0x18, %a3@(write_mode0 - read_mark)
moveb #0x01, %a3@(write_mode1 - read_mark)
moveb #0x01, %a3@(write_mode0 - read_mark)
@@ -190,8 +186,6 @@ wait_data_mark_byte:

/* read data */

- tstb %a3@(read_error - read_mark)
-
movel #sector_size-1, %d4 /* sector size */
read_new_data:
movew #max_retry, %d2
@@ -232,8 +226,6 @@ data_crc1:
andb #.Lhr_crc_error, %d5
bne data_exit

- tstb %a3@(read_error - read_mark)
-
/* return number of bytes read */

movel #sector_size, %d0
--
2.52.0