Subject: proposal for MI floppy formatting
To: None <netbsd-developers@NetBSD.ORG, gwr@NetBSD.ORG, is@NetBSD.ORG,>
From: John Kohl <jtk@kolvir.arlington.ma.us>
List: tech-kern
Date: 11/16/1996 12:02:46
MI floppy formatting proposal:
$Id: proposal,v 1.2 1996/11/16 17:02:32 jtk Exp $

Gordon Ross and Ignatios Souvatzis commented last month on my call for
suggestions on floppy formatting.

Gordon suggested a generic formatting interface with get/set and format
commands, and suggested that we verify any interface is sufficiently
flexible for SCSI floppy formatting.

Ignatios explained how the amiga drivers work (essentially, all software
magic); I think the interface below should work OK for an Amiga; it's
more complicated than the simple "dd" that they can use for formatting
but should be easily implementable for those drivers.

So, here's my first draft proposal for floppy drivers, mostly pulled up
from the existing i386 floppy formatting code.  I haven't a SCSI-2 spec
to verify this with--can someone take a look and see if there are any
additional parameters that could/should be passed in the fdformat_parms?

Floppy diskette drivers provide the following IOCTLs:

FDIOCSETFORMAT(struct fdformat_parms):
	set formatting parameters, using 'struct fdformat_parms'
	the driver saves this state and it persists while the device is open.

FDIOCGETFORMAT(struct fdformat_parms):
	fetch current formatting parameters into 'struct fdformat_parms'

FDIOCFORMAT_TRACK(struct fdformat_cmd):
	format a track on the medium, returning format results
	[I chose a per-track format, since feedback during formatting a
	disk is nice.  An alternative would be a list or range of
	heads/cylinders to format, and an array of success/failure values for
	each one.  Comments welcome]

enum fdformat_result {
	FDFORMAT_SUCCESS,
	FDFORMAT_MEDIA_ERROR,		/* hardware reported a formatting
					   error */
	FDFORMAT_CONFIG_ERROR		/* something bogus in parameters */
};

struct fdformat_cmd {
	int head;		/* IN */
	int cylinder;		/* IN */
	enum fdformat_result result;	/* OUT */
};

#define FDFORMAT_VERSION 19961116
struct fdformat_parms {
/* list of items taken from i386 formatting glop (NEC 765);
   should be made the union of support needed for other devices. */
    int fdformat_version;	/* rev this when needed; write drivers to
				   allow forward compatibility, please,
				   and add elements to the end of the
				   structure */
    int sector_shift;
    int nbps;				/* number of bytes per sector */
    int ncyl;				/* number of cylinders */
    int nspt;				/* sectors per track */
    int ntrk;				/* number of heads/tracks per cyl */
    int stepspercyl;			/* steps per cylinder */
    int gaplen;				/* formatting gap length */
    int fillbyte;			/* formatting fill byte */
    int xfer_rate;			/* in bits per second; driver
					   must convert */
};