[PATCH 13/31] swim: Check for CRC errors
From: Finn Thain
Date: Thu Jul 16 2026 - 06:20:27 EST
After reading either the sector header or sector data, examine that flag
in the handshake register which holds the result of the CRC calculation.
CRC validation has to take place with the last byte still in the FIFO.
This flag can't be checked by the caller because by then all bytes will
have been retrieved from the FIFO. Return an error code when appropriate.
Fixes: 8852ecd97488 ("m68k: mac - Add SWIM floppy support")
Signed-off-by: Finn Thain <fthain@xxxxxxxxxxxxxx>
---
drivers/block/swim_asm.S | 16 ++++++++++++----
1 file changed, 12 insertions(+), 4 deletions(-)
diff --git a/drivers/block/swim_asm.S b/drivers/block/swim_asm.S
index 31fc63b074dc..f40e19e48021 100644
--- a/drivers/block/swim_asm.S
+++ b/drivers/block/swim_asm.S
@@ -42,6 +42,8 @@
.equ max_retry, 40
.equ sector_size, 512
+ .equ .Lhr_crc_error, 0x02
+
.global swim_read_sector_header
swim_read_sector_header:
link %a6, #0
@@ -128,12 +130,15 @@ crc0: tstb %a2@
moveq #max_retry, %d2
-crc1: tstb %a2@
+crc1: moveb %a2@, %d5
dbmi %d2, crc1
bpl signal_nonyb
moveb %a3@, %a4@(o_crc1)
+ andb #.Lhr_crc_error, %d5
+ bne signal_nonyb
+
tstb %a3@(read_error - read_mark)
moveq #0, %d0
@@ -212,17 +217,20 @@ data_crc0:
dbmi %d2, data_crc0
bpl data_exit
- moveb %a3@, %d5
+ moveb %a3@, %d2
moveq #max_retry, %d2
data_crc1:
- tstb %a2@
+ moveb %a2@, %d5
dbmi %d2, data_crc1
bpl data_exit
- moveb %a3@, %d5
+ moveb %a3@, %d2
+
+ andb #.Lhr_crc_error, %d5
+ bne data_exit
tstb %a3@(read_error - read_mark)
--
2.52.0