Re: [PATCH 09/31] swim: Recalibrate when drive is probed

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 :
> Track zero recalibration can be slow and is normally done only once i.e.
> during system POST or boot-up. Recalibrate once after the drive is probed
> rather than every time the device is opened. Don't register the drive if
> recalibration fails. Move the heads to the edge of the disk before
> ejecting so that recalibration happens quickly.
> 
> Fixes: 8852ecd97488 ("m68k: mac - Add SWIM floppy support")
> Signed-off-by: Finn Thain <[email protected]>
> ---
>   drivers/block/swim.c | 15 +++++----------
>   1 file changed, 5 insertions(+), 10 deletions(-)

Reviewed-by: Laurent Vivier <[email protected]>

> 
> diff --git a/drivers/block/swim.c b/drivers/block/swim.c
> index 03a89916d4ed..76f6cfa68432 100644
> --- a/drivers/block/swim.c
> +++ b/drivers/block/swim.c
> @@ -412,6 +412,7 @@ static inline int swim_track00(struct swim __iomem *base)
>   	if (swim_readbit(base, TRACK_ZERO))
>   		return 0;
>   
> +	pr_err("swim: track zero recalibration failed\n");
>   	return -1;
>   }
>   
> @@ -456,6 +457,7 @@ static int floppy_eject(struct floppy_state *fs)
>   	struct swim __iomem *base = fs->swd->base;
>   
>   	swim_drive(base, fs->location);
> +	swim_track(fs, 1);
>   	swim_motor(base, OFF);
>   	swim_eject(base);
>   	swim_drive(base, NO_DRIVE);
> @@ -596,13 +598,6 @@ static void setup_medium(struct floppy_state *fs)
>   		struct floppy_struct *g;
>   		fs->disk_in = 1;
>   		fs->write_protected = swim_readbit(base, WRITE_PROT);
> -
> -		if (swim_track00(base))
> -			printk(KERN_ERR
> -				"SWIM: cannot move floppy head to track 0\n");
> -
> -		swim_track00(base);
> -
>   		fs->type = swim_readbit(base, TWOMEG_MEDIA) ?
>   			HD_MEDIA : DD_MEDIA;
>   		fs->head_number = swim_readbit(base, SINGLE_SIDED) ? 1 : 2;
> @@ -610,7 +605,6 @@ static void setup_medium(struct floppy_state *fs)
>   		fs->total_secs = g->size;
>   		fs->secpercyl = g->head * g->sect;
>   		fs->secpertrack = g->sect;
> -		fs->track = 0;
>   	} else {
>   		fs->disk_in = 0;
>   	}
> @@ -773,6 +767,7 @@ static int swim_add_floppy(struct swim_priv *swd, enum drive_location location)
>   
>   	fs->ref_count = 0;
>   	fs->ejected = 1;
> +	fs->track = 0;
>   
>   	swd->floppy_count++;
>   
> @@ -827,11 +822,11 @@ static int swim_floppy_init(struct platform_device *pdev)
>   
>   	swim_drive(base, INTERNAL_DRIVE);
>   	if (swim_readbit(base, DRIVE_PRESENT) &&
> -	    !swim_readbit(base, ONEMEG_DRIVE))
> +	    !swim_readbit(base, ONEMEG_DRIVE) && !swim_track00(base))
>   		swim_add_floppy(swd, INTERNAL_DRIVE);
>   	swim_drive(base, EXTERNAL_DRIVE);
>   	if (swim_readbit(base, DRIVE_PRESENT) &&
> -	    !swim_readbit(base, ONEMEG_DRIVE))
> +	    !swim_readbit(base, ONEMEG_DRIVE) && !swim_track00(base))
>   		swim_add_floppy(swd, EXTERNAL_DRIVE);
>   	swim_drive(base, NO_DRIVE);
>
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.