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. Reviewed-by: Laurent Vivier Fixes: 8852ecd97488 ("m68k: mac - Add SWIM floppy support") Signed-off-by: Finn Thain --- Changed since v1: - Load handshake register a second time because that's what MacOS does. --- drivers/block/swim_asm.S | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/drivers/block/swim_asm.S b/drivers/block/swim_asm.S index 31fc63b074dc..533e3bf02fa9 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,16 @@ 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) + moveb %a2@, %d5 + andb #.Lhr_crc_error, %d5 + bne signal_nonyb + tstb %a3@(read_error - read_mark) moveq #0, %d0 @@ -212,17 +218,21 @@ 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 + + moveb %a2@, %d5 + andb #.Lhr_crc_error, %d5 + bne data_exit tstb %a3@(read_error - read_mark) -- 2.52.0