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