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

Laurent Vivier <[email protected]> Tue, 21 Jul 2026 07:43:47 +0200
Newsgroups org.kernel.vger.linux-m68k,org.kernel.vger.linux-block,org.kernel.vger.linux-kernel
Message-ID <[email protected]>
Le 16/07/2026 =C3=A0 12:02, Finn Thain a =C3=A9crit=C2=A0:
> 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. Full=
y
> validate the sector header. Don't terminate the search loop early just
> because an erroneous sector header showed up.
>=20
> 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_s=
tate *fs,
>  =20
>   	local_irq_save(flags);
>   	for (i =3D 0; i < 36; i++) {
> -		ret =3D swim_read_sector_header(base, &header);
> -		if (!ret && (header.sector =3D=3D sector)) {
> +		if (swim_read_sector_header(base, &header) ||
> +		    swim_read(base, error) || header.track !=3D track ||
> +		    header.side !=3D side || header.size !=3D 2)
> +			continue;
> +		if (header.sector =3D=3D sector) {
>   			/* found */
>  =20
>   			ret =3D swim_read_sector_data(base, buffer);
> +			if (swim_read(base, error))
> +				ret =3D -EIO;
>   			break;
>   		}
>   	}
>   	local_irq_restore(flags);
>  =20
> -	if ((header.side !=3D side)  || (header.track !=3D track) ||
> -	     (header.sector !=3D sector))
> -		return 0;
> -
>   	return ret;
>   }
>  =20
> 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
>  =20
>   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
>  =20
> -	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
>  =20
>   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:
>  =20
>   	/* read data */
>  =20
> -	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
>  =20
> -	tstb	%a3@(read_error - read_mark)
> -
>   	/* return number of bytes read */
>  =20
>   	movel	#sector_size, %d0