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 --- 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