1224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#ifndef _UAPI_LINUX_FD_H
2224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define _UAPI_LINUX_FD_H
3224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng
4224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#include <linux/ioctl.h>
5224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#include <linux/compiler.h>
6224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng
7224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng/* New file layout: Now the ioctl definitions immediately follow the
8224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * definitions of the structures that they use */
9224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng
10224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng/*
11224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * Geometry
12224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng */
13224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Chengstruct floppy_struct {
14224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng	unsigned int	size,		/* nr of sectors total */
15224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng			sect,		/* sectors per track */
16224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng			head,		/* nr of heads */
17224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng			track,		/* nr of tracks */
18224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng			stretch;	/* bit 0 !=0 means double track steps */
19224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng					/* bit 1 != 0 means swap sides */
20224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng					/* bits 2..9 give the first sector */
21224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng					/*  number (the LSB is flipped) */
22224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define FD_STRETCH 1
23224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define FD_SWAPSIDES 2
24224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define FD_ZEROBASED 4
25224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define FD_SECTBASEMASK 0x3FC
26224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define FD_MKSECTBASE(s) (((s) ^ 1) << 2)
27224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define FD_SECTBASE(floppy) ((((floppy)->stretch & FD_SECTBASEMASK) >> 2) ^ 1)
28224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng
29224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng	unsigned char	gap,		/* gap1 size */
30224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng
31224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng			rate,		/* data rate. |= 0x40 for perpendicular */
32224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define FD_2M 0x4
33224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define FD_SIZECODEMASK 0x38
34224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define FD_SIZECODE(floppy) (((((floppy)->rate&FD_SIZECODEMASK)>> 3)+ 2) %8)
35224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define FD_SECTSIZE(floppy) ( (floppy)->rate & FD_2M ? \
36224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng			     512 : 128 << FD_SIZECODE(floppy) )
37224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define FD_PERP 0x40
38224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng
39224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng			spec1,		/* stepping rate, head unload time */
40224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng			fmt_gap;	/* gap2 size */
41224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng	const char	* name; /* used only for predefined formats */
42224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng};
43224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng
44224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng
45224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng/* commands needing write access have 0x40 set */
46224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng/* commands needing super user access have 0x80 set */
47224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng
48224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define FDCLRPRM _IO(2, 0x41)
49224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng/* clear user-defined parameters */
50224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng
51224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define FDSETPRM _IOW(2, 0x42, struct floppy_struct)
52224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define FDSETMEDIAPRM FDSETPRM
53224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng/* set user-defined parameters for current media */
54224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng
55224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define FDDEFPRM _IOW(2, 0x43, struct floppy_struct)
56224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define FDGETPRM _IOR(2, 0x04, struct floppy_struct)
57224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define FDDEFMEDIAPRM FDDEFPRM
58224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define FDGETMEDIAPRM FDGETPRM
59224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng/* set/get disk parameters */
60224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng
61224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng
62224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define	FDMSGON  _IO(2,0x45)
63224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define	FDMSGOFF _IO(2,0x46)
64224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng/* issue/don't issue kernel messages on media type change */
65224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng
66224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng
67224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng/*
68224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * Formatting (obsolete)
69224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng */
70224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define FD_FILL_BYTE 0xF6 /* format fill byte. */
71224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng
72224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Chengstruct format_descr {
73224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng	unsigned int device,head,track;
74224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng};
75224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng
76224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define FDFMTBEG _IO(2,0x47)
77224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng/* begin formatting a disk */
78224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define	FDFMTTRK _IOW(2,0x48, struct format_descr)
79224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng/* format the specified track */
80224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define FDFMTEND _IO(2,0x49)
81224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng/* end formatting a disk */
82224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng
83224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng
84224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng/*
85224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * Error thresholds
86224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng */
87224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Chengstruct floppy_max_errors {
88224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng	unsigned int
89224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng	  abort,      /* number of errors to be reached before aborting */
90224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng	  read_track, /* maximal number of errors permitted to read an
91224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng		       * entire track at once */
92224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng	  reset,      /* maximal number of errors before a reset is tried */
93224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng	  recal,      /* maximal number of errors before a recalibrate is
94224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng		       * tried */
95224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng
96224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng	  /*
97224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng	   * Threshold for reporting FDC errors to the console.
98224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng	   * Setting this to zero may flood your screen when using
99224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng	   * ultra cheap floppies ;-)
100224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng	   */
101224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng	  reporting;
102224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng
103224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng};
104224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng
105224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define FDSETEMSGTRESH	_IO(2,0x4a)
106224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng/* set fdc error reporting threshold */
107224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng
108224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define FDFLUSH  _IO(2,0x4b)
109224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng/* flush buffers for media; either for verifying media, or for
110224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * handling a media change without closing the file descriptor */
111224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng
112224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define FDSETMAXERRS _IOW(2, 0x4c, struct floppy_max_errors)
113224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define FDGETMAXERRS _IOR(2, 0x0e, struct floppy_max_errors)
114224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng/* set/get abortion and read_track threshold. See also floppy_drive_params
115224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * structure */
116224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng
117224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng
118224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Chengtypedef char floppy_drive_name[16];
119224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define FDGETDRVTYP _IOR(2, 0x0f, floppy_drive_name)
120224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng/* get drive type: 5 1/4 or 3 1/2 */
121224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng
122224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng
123224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng/*
124224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * Drive parameters (user modifiable)
125224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng */
126224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Chengstruct floppy_drive_params {
127224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng	signed char cmos;		/* CMOS type */
128224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng
129224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng	/* Spec2 is (HLD<<1 | ND), where HLD is head load time (1=2ms, 2=4 ms
130224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng	 * etc) and ND is set means no DMA. Hardcoded to 6 (HLD=6ms, use DMA).
131224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng	 */
132224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng	unsigned long max_dtr;		/* Step rate, usec */
133224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng	unsigned long hlt;     		/* Head load/settle time, msec */
134224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng	unsigned long hut;     		/* Head unload time (remnant of
135224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng					 * 8" drives) */
136224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng	unsigned long srt;     		/* Step rate, usec */
137224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng
138224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng	unsigned long spinup;		/* time needed for spinup (expressed
139224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng					 * in jiffies) */
140224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng	unsigned long spindown;		/* timeout needed for spindown */
141224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng	unsigned char spindown_offset;	/* decides in which position the disk
142224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng					 * will stop */
143224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng	unsigned char select_delay;	/* delay to wait after select */
144224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng	unsigned char rps;		/* rotations per second */
145224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng	unsigned char tracks;		/* maximum number of tracks */
146224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng	unsigned long timeout;		/* timeout for interrupt requests */
147224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng
148224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng	unsigned char interleave_sect;	/* if there are more sectors, use
149224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng					 * interleave */
150224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng
151224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng	struct floppy_max_errors max_errors;
152224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng
153224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng	char flags;			/* various flags, including ftd_msg */
154224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng/*
155224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * Announce successful media type detection and media information loss after
156224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * disk changes.
157224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * Also used to enable/disable printing of overrun warnings.
158224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng */
159224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng
160224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define FTD_MSG 0x10
161224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define FD_BROKEN_DCL 0x20
162224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define FD_DEBUG 0x02
163224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define FD_SILENT_DCL_CLEAR 0x4
164224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define FD_INVERTED_DCL 0x80 /* must be 0x80, because of hardware
165224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng				considerations */
166224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng
167224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng	char read_track;		/* use readtrack during probing? */
168224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng
169224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng/*
170224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * Auto-detection. Each drive type has eight formats which are
171224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * used in succession to try to read the disk. If the FDC cannot lock onto
172224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * the disk, the next format is tried. This uses the variable 'probing'.
173224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng */
174224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng	short autodetect[8];		/* autodetected formats */
175224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng
176224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng	int checkfreq; /* how often should the drive be checked for disk
177224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng			* changes */
178224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng	int native_format; /* native format of this drive */
179224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng};
180224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng
181224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Chengenum {
182224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng	FD_NEED_TWADDLE_BIT,	/* more magic */
183224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng	FD_VERIFY_BIT,		/* inquire for write protection */
184224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng	FD_DISK_NEWCHANGE_BIT,	/* change detected, and no action undertaken yet
185224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng				 * to clear media change status */
186224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng	FD_UNUSED_BIT,
187224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng	FD_DISK_CHANGED_BIT,	/* disk has been changed since last i/o */
188e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris	FD_DISK_WRITABLE_BIT,	/* disk is writable */
189e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris	FD_OPEN_SHOULD_FAIL_BIT
190224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng};
191224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng
192224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define FDSETDRVPRM _IOW(2, 0x90, struct floppy_drive_params)
193224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define FDGETDRVPRM _IOR(2, 0x11, struct floppy_drive_params)
194224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng/* set/get drive parameters */
195224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng
196224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng
197224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng/*
198224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * Current drive state (not directly modifiable by user, readonly)
199224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng */
200224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Chengstruct floppy_drive_struct {
201224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng	unsigned long flags;
202224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng/* values for these flags */
203224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define FD_NEED_TWADDLE (1 << FD_NEED_TWADDLE_BIT)
204224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define FD_VERIFY (1 << FD_VERIFY_BIT)
205224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define FD_DISK_NEWCHANGE (1 << FD_DISK_NEWCHANGE_BIT)
206224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define FD_DISK_CHANGED (1 << FD_DISK_CHANGED_BIT)
207224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define FD_DISK_WRITABLE (1 << FD_DISK_WRITABLE_BIT)
208224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng
209224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng	unsigned long spinup_date;
210224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng	unsigned long select_date;
211224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng	unsigned long first_read_date;
212224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng	short probed_format;
213224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng	short track; /* current track */
214224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng	short maxblock; /* id of highest block read */
215224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng	short maxtrack; /* id of highest half track read */
216224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng	int generation; /* how many diskchanges? */
217224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng
218224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng/*
219224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * (User-provided) media information is _not_ discarded after a media change
220224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * if the corresponding keep_data flag is non-zero. Positive values are
221224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * decremented after each probe.
222224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng */
223224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng	int keep_data;
224224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng
225224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng	/* Prevent "aliased" accesses. */
226224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng	int fd_ref;
227224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng	int fd_device;
228224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng	unsigned long last_checked; /* when was the drive last checked for a disk
229224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng			   * change? */
230224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng
231224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng	char *dmabuf;
232224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng	int bufblocks;
233224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng};
234224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng
235224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define FDGETDRVSTAT _IOR(2, 0x12, struct floppy_drive_struct)
236224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define FDPOLLDRVSTAT _IOR(2, 0x13, struct floppy_drive_struct)
237224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng/* get drive state: GET returns the cached state, POLL polls for new state */
238224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng
239224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng
240224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng/*
241224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * reset FDC
242224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng */
243224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Chengenum reset_mode {
244224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng	FD_RESET_IF_NEEDED,	/* reset only if the reset flags is set */
245224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng	FD_RESET_IF_RAWCMD,	/* obsolete */
246224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng	FD_RESET_ALWAYS		/* reset always */
247224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng};
248224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define FDRESET _IO(2, 0x54)
249224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng
250224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng
251224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng/*
252224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * FDC state
253224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng */
254224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Chengstruct floppy_fdc_state {
255224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng	int spec1;		/* spec1 value last used */
256224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng	int spec2;		/* spec2 value last used */
257224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng	int dtr;
258224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng	unsigned char version;	/* FDC version code */
259224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng	unsigned char dor;
260224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng	unsigned long address;	/* io address */
261224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng	unsigned int rawcmd:2;
262224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng	unsigned int reset:1;
263224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng	unsigned int need_configure:1;
264224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng	unsigned int perp_mode:2;
265224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng	unsigned int has_fifo:1;
266224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng	unsigned int driver_version;	/* version code for floppy driver */
267224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define FD_DRIVER_VERSION 0x100
268224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng/* user programs using the floppy API should use floppy_fdc_state to
269224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * get the version number of the floppy driver that they are running
270224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * on. If this version number is bigger than the one compiled into the
271224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * user program (the FD_DRIVER_VERSION define), it should be prepared
272224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * to bigger structures
273224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng */
274224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng
275224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng	unsigned char track[4];
276224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng	/* Position of the heads of the 4 units attached to this FDC,
277224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng	 * as stored on the FDC. In the future, the position as stored
278224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng	 * on the FDC might not agree with the actual physical
279224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng	 * position of these drive heads. By allowing such
280224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng	 * disagreement, it will be possible to reset the FDC without
281224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng	 * incurring the expensive cost of repositioning all heads.
282224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng	 * Right now, these positions are hard wired to 0. */
283224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng
284224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng};
285224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng
286224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define FDGETFDCSTAT _IOR(2, 0x15, struct floppy_fdc_state)
287224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng
288224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng
289224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng/*
290224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * Asynchronous Write error tracking
291224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng */
292224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Chengstruct floppy_write_errors {
293224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng	/* Write error logging.
294224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng	 *
295224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng	 * These fields can be cleared with the FDWERRORCLR ioctl.
296224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng	 * Only writes that were attempted but failed due to a physical media
297224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng	 * error are logged.  write(2) calls that fail and return an error code
298224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng	 * to the user process are not counted.
299224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng	 */
300224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng
301224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng	unsigned int write_errors;  /* number of physical write errors
302224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng				     * encountered */
303224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng
304224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng	/* position of first and last write errors */
305224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng	unsigned long first_error_sector;
306224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng	int           first_error_generation;
307224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng	unsigned long last_error_sector;
308224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng	int           last_error_generation;
309224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng
310224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng	unsigned int badness; /* highest retry count for a read or write
311224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng			       * operation */
312224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng};
313224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng
314224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define FDWERRORCLR  _IO(2, 0x56)
315224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng/* clear write error and badness information */
316224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define FDWERRORGET  _IOR(2, 0x17, struct floppy_write_errors)
317224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng/* get write error and badness information */
318224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng
319224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng
320224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng/*
321224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * Raw commands
322224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng */
323224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng/* new interface flag: now we can do them in batches */
324224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define FDHAVEBATCHEDRAWCMD
325224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng
326224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Chengstruct floppy_raw_cmd {
327224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng	unsigned int flags;
328224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define FD_RAW_READ 1
329224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define FD_RAW_WRITE 2
330224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define FD_RAW_NO_MOTOR 4
331224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define FD_RAW_DISK_CHANGE 4 /* out: disk change flag was set */
332224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define FD_RAW_INTR 8    /* wait for an interrupt */
333224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define FD_RAW_SPIN 0x10 /* spin up the disk for this command */
334224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define FD_RAW_NO_MOTOR_AFTER 0x20 /* switch the motor off after command
335224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng				    * completion */
336224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define FD_RAW_NEED_DISK 0x40  /* this command needs a disk to be present */
337224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define FD_RAW_NEED_SEEK 0x80  /* this command uses an implied seek (soft) */
338224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng
339224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng/* more "in" flags */
340224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define FD_RAW_MORE 0x100  /* more records follow */
341224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define FD_RAW_STOP_IF_FAILURE 0x200 /* stop if we encounter a failure */
342224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define FD_RAW_STOP_IF_SUCCESS 0x400 /* stop if command successful */
343224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define FD_RAW_SOFTFAILURE 0x800 /* consider the return value for failure
344224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng				  * detection too */
345224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng
346224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng/* more "out" flags */
347224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define FD_RAW_FAILURE 0x10000 /* command sent to fdc, fdc returned error */
348224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define FD_RAW_HARDFAILURE 0x20000 /* fdc had to be reset, or timed out */
349224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng
350224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng	void __user *data;
351224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng	char *kernel_data; /* location of data buffer in the kernel */
352224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng	struct floppy_raw_cmd *next; /* used for chaining of raw cmd's
353224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng				      * within the kernel */
354224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng	long length; /* in: length of dma transfer. out: remaining bytes */
355224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng	long phys_length; /* physical length, if different from dma length */
356224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng	int buffer_length; /* length of allocated buffer */
357224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng
358224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng	unsigned char rate;
359224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng	unsigned char cmd_count;
360224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng	unsigned char cmd[16];
361224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng	unsigned char reply_count;
362224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng	unsigned char reply[16];
363224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng	int track;
364224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng	int resultcode;
365224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng
366224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng	int reserved1;
367224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng	int reserved2;
368224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng};
369224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng
370224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define FDRAWCMD _IO(2, 0x58)
371224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng/* send a raw command to the fdc. Structure size not included, because of
372224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * batches */
373224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng
374224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define FDTWADDLE _IO(2, 0x59)
375224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng/* flicker motor-on bit before reading a sector. Experimental */
376224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng
377224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng
378224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define FDEJECT _IO(2, 0x5a)
379224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng/* eject the disk */
380224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng
381224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng
382224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng
383224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#endif /* _UAPI_LINUX_FD_H */
384