Re: [PATCH 14/31] swim: Check error register during sector read
Laurent Vivier <[email protected]>
| Newsgroups | org.kernel.vger.linux-block,org.kernel.vger.linux-kernel,org.kernel.vger.linux-m68k |
|---|---|
| Message-ID | <[email protected]> |
Le 16/07/2026 à 12:02, Finn Thain a écrit :
> 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 <[email protected]>
> ---
> drivers/block/swim.c | 13 +++++++------
> drivers/block/swim_asm.S | 8 --------
> 2 files changed, 7 insertions(+), 14 deletions(-)
Reviewed-by: Laurent Vivier <[email protected]>
> 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