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
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.