1*53ee8cc1Swenshuai.xi #ifndef _LINUX_FD_H 2*53ee8cc1Swenshuai.xi #define _LINUX_FD_H 3*53ee8cc1Swenshuai.xi 4*53ee8cc1Swenshuai.xi #include <linux/ioctl.h> 5*53ee8cc1Swenshuai.xi 6*53ee8cc1Swenshuai.xi /* New file layout: Now the ioctl definitions immediately follow the 7*53ee8cc1Swenshuai.xi * definitions of the structures that they use */ 8*53ee8cc1Swenshuai.xi 9*53ee8cc1Swenshuai.xi /* 10*53ee8cc1Swenshuai.xi * Geometry 11*53ee8cc1Swenshuai.xi */ 12*53ee8cc1Swenshuai.xi struct floppy_struct { 13*53ee8cc1Swenshuai.xi unsigned int size, /* nr of sectors total */ 14*53ee8cc1Swenshuai.xi sect, /* sectors per track */ 15*53ee8cc1Swenshuai.xi head, /* nr of heads */ 16*53ee8cc1Swenshuai.xi track, /* nr of tracks */ 17*53ee8cc1Swenshuai.xi stretch; /* !=0 means double track steps */ 18*53ee8cc1Swenshuai.xi #define FD_STRETCH 1 19*53ee8cc1Swenshuai.xi #define FD_SWAPSIDES 2 20*53ee8cc1Swenshuai.xi #define FD_ZEROBASED 4 21*53ee8cc1Swenshuai.xi 22*53ee8cc1Swenshuai.xi unsigned char gap, /* gap1 size */ 23*53ee8cc1Swenshuai.xi 24*53ee8cc1Swenshuai.xi rate, /* data rate. |= 0x40 for perpendicular */ 25*53ee8cc1Swenshuai.xi #define FD_2M 0x4 26*53ee8cc1Swenshuai.xi #define FD_SIZECODEMASK 0x38 27*53ee8cc1Swenshuai.xi #define FD_SIZECODE(floppy) (((((floppy)->rate&FD_SIZECODEMASK)>> 3)+ 2) %8) 28*53ee8cc1Swenshuai.xi #define FD_SECTSIZE(floppy) ( (floppy)->rate & FD_2M ? \ 29*53ee8cc1Swenshuai.xi 512 : 128 << FD_SIZECODE(floppy) ) 30*53ee8cc1Swenshuai.xi #define FD_PERP 0x40 31*53ee8cc1Swenshuai.xi 32*53ee8cc1Swenshuai.xi spec1, /* stepping rate, head unload time */ 33*53ee8cc1Swenshuai.xi fmt_gap; /* gap2 size */ 34*53ee8cc1Swenshuai.xi const char * name; /* used only for predefined formats */ 35*53ee8cc1Swenshuai.xi }; 36*53ee8cc1Swenshuai.xi 37*53ee8cc1Swenshuai.xi 38*53ee8cc1Swenshuai.xi /* commands needing write access have 0x40 set */ 39*53ee8cc1Swenshuai.xi /* commands needing super user access have 0x80 set */ 40*53ee8cc1Swenshuai.xi 41*53ee8cc1Swenshuai.xi #define FDCLRPRM _IO(2, 0x41) 42*53ee8cc1Swenshuai.xi /* clear user-defined parameters */ 43*53ee8cc1Swenshuai.xi 44*53ee8cc1Swenshuai.xi #define FDSETPRM _IOW(2, 0x42, struct floppy_struct) 45*53ee8cc1Swenshuai.xi #define FDSETMEDIAPRM FDSETPRM 46*53ee8cc1Swenshuai.xi /* set user-defined parameters for current media */ 47*53ee8cc1Swenshuai.xi 48*53ee8cc1Swenshuai.xi #define FDDEFPRM _IOW(2, 0x43, struct floppy_struct) 49*53ee8cc1Swenshuai.xi #define FDGETPRM _IOR(2, 0x04, struct floppy_struct) 50*53ee8cc1Swenshuai.xi #define FDDEFMEDIAPRM FDDEFPRM 51*53ee8cc1Swenshuai.xi #define FDGETMEDIAPRM FDGETPRM 52*53ee8cc1Swenshuai.xi /* set/get disk parameters */ 53*53ee8cc1Swenshuai.xi 54*53ee8cc1Swenshuai.xi 55*53ee8cc1Swenshuai.xi #define FDMSGON _IO(2,0x45) 56*53ee8cc1Swenshuai.xi #define FDMSGOFF _IO(2,0x46) 57*53ee8cc1Swenshuai.xi /* issue/don't issue kernel messages on media type change */ 58*53ee8cc1Swenshuai.xi 59*53ee8cc1Swenshuai.xi 60*53ee8cc1Swenshuai.xi /* 61*53ee8cc1Swenshuai.xi * Formatting (obsolete) 62*53ee8cc1Swenshuai.xi */ 63*53ee8cc1Swenshuai.xi #define FD_FILL_BYTE 0xF6 /* format fill byte. */ 64*53ee8cc1Swenshuai.xi 65*53ee8cc1Swenshuai.xi struct format_descr { 66*53ee8cc1Swenshuai.xi unsigned int device,head,track; 67*53ee8cc1Swenshuai.xi }; 68*53ee8cc1Swenshuai.xi 69*53ee8cc1Swenshuai.xi #define FDFMTBEG _IO(2,0x47) 70*53ee8cc1Swenshuai.xi /* begin formatting a disk */ 71*53ee8cc1Swenshuai.xi #define FDFMTTRK _IOW(2,0x48, struct format_descr) 72*53ee8cc1Swenshuai.xi /* format the specified track */ 73*53ee8cc1Swenshuai.xi #define FDFMTEND _IO(2,0x49) 74*53ee8cc1Swenshuai.xi /* end formatting a disk */ 75*53ee8cc1Swenshuai.xi 76*53ee8cc1Swenshuai.xi 77*53ee8cc1Swenshuai.xi /* 78*53ee8cc1Swenshuai.xi * Error thresholds 79*53ee8cc1Swenshuai.xi */ 80*53ee8cc1Swenshuai.xi struct floppy_max_errors { 81*53ee8cc1Swenshuai.xi unsigned int 82*53ee8cc1Swenshuai.xi abort, /* number of errors to be reached before aborting */ 83*53ee8cc1Swenshuai.xi read_track, /* maximal number of errors permitted to read an 84*53ee8cc1Swenshuai.xi * entire track at once */ 85*53ee8cc1Swenshuai.xi reset, /* maximal number of errors before a reset is tried */ 86*53ee8cc1Swenshuai.xi recal, /* maximal number of errors before a recalibrate is 87*53ee8cc1Swenshuai.xi * tried */ 88*53ee8cc1Swenshuai.xi 89*53ee8cc1Swenshuai.xi /* 90*53ee8cc1Swenshuai.xi * Threshold for reporting FDC errors to the console. 91*53ee8cc1Swenshuai.xi * Setting this to zero may flood your screen when using 92*53ee8cc1Swenshuai.xi * ultra cheap floppies ;-) 93*53ee8cc1Swenshuai.xi */ 94*53ee8cc1Swenshuai.xi reporting; 95*53ee8cc1Swenshuai.xi 96*53ee8cc1Swenshuai.xi }; 97*53ee8cc1Swenshuai.xi 98*53ee8cc1Swenshuai.xi #define FDSETEMSGTRESH _IO(2,0x4a) 99*53ee8cc1Swenshuai.xi /* set fdc error reporting threshold */ 100*53ee8cc1Swenshuai.xi 101*53ee8cc1Swenshuai.xi #define FDFLUSH _IO(2,0x4b) 102*53ee8cc1Swenshuai.xi /* flush buffers for media; either for verifying media, or for 103*53ee8cc1Swenshuai.xi * handling a media change without closing the file descriptor */ 104*53ee8cc1Swenshuai.xi 105*53ee8cc1Swenshuai.xi #define FDSETMAXERRS _IOW(2, 0x4c, struct floppy_max_errors) 106*53ee8cc1Swenshuai.xi #define FDGETMAXERRS _IOR(2, 0x0e, struct floppy_max_errors) 107*53ee8cc1Swenshuai.xi /* set/get abortion and read_track threshold. See also floppy_drive_params 108*53ee8cc1Swenshuai.xi * structure */ 109*53ee8cc1Swenshuai.xi 110*53ee8cc1Swenshuai.xi 111*53ee8cc1Swenshuai.xi typedef char floppy_drive_name[16]; 112*53ee8cc1Swenshuai.xi #define FDGETDRVTYP _IOR(2, 0x0f, floppy_drive_name) 113*53ee8cc1Swenshuai.xi /* get drive type: 5 1/4 or 3 1/2 */ 114*53ee8cc1Swenshuai.xi 115*53ee8cc1Swenshuai.xi 116*53ee8cc1Swenshuai.xi /* 117*53ee8cc1Swenshuai.xi * Drive parameters (user modifiable) 118*53ee8cc1Swenshuai.xi */ 119*53ee8cc1Swenshuai.xi struct floppy_drive_params { 120*53ee8cc1Swenshuai.xi signed char cmos; /* CMOS type */ 121*53ee8cc1Swenshuai.xi 122*53ee8cc1Swenshuai.xi /* Spec2 is (HLD<<1 | ND), where HLD is head load time (1=2ms, 2=4 ms 123*53ee8cc1Swenshuai.xi * etc) and ND is set means no DMA. Hardcoded to 6 (HLD=6ms, use DMA). 124*53ee8cc1Swenshuai.xi */ 125*53ee8cc1Swenshuai.xi unsigned long max_dtr; /* Step rate, usec */ 126*53ee8cc1Swenshuai.xi unsigned long hlt; /* Head load/settle time, msec */ 127*53ee8cc1Swenshuai.xi unsigned long hut; /* Head unload time (remnant of 128*53ee8cc1Swenshuai.xi * 8" drives) */ 129*53ee8cc1Swenshuai.xi unsigned long srt; /* Step rate, usec */ 130*53ee8cc1Swenshuai.xi 131*53ee8cc1Swenshuai.xi unsigned long spinup; /* time needed for spinup (expressed 132*53ee8cc1Swenshuai.xi * in jiffies) */ 133*53ee8cc1Swenshuai.xi unsigned long spindown; /* timeout needed for spindown */ 134*53ee8cc1Swenshuai.xi unsigned char spindown_offset; /* decides in which position the disk 135*53ee8cc1Swenshuai.xi * will stop */ 136*53ee8cc1Swenshuai.xi unsigned char select_delay; /* delay to wait after select */ 137*53ee8cc1Swenshuai.xi unsigned char rps; /* rotations per second */ 138*53ee8cc1Swenshuai.xi unsigned char tracks; /* maximum number of tracks */ 139*53ee8cc1Swenshuai.xi unsigned long timeout; /* timeout for interrupt requests */ 140*53ee8cc1Swenshuai.xi 141*53ee8cc1Swenshuai.xi unsigned char interleave_sect; /* if there are more sectors, use 142*53ee8cc1Swenshuai.xi * interleave */ 143*53ee8cc1Swenshuai.xi 144*53ee8cc1Swenshuai.xi struct floppy_max_errors max_errors; 145*53ee8cc1Swenshuai.xi 146*53ee8cc1Swenshuai.xi char flags; /* various flags, including ftd_msg */ 147*53ee8cc1Swenshuai.xi /* 148*53ee8cc1Swenshuai.xi * Announce successful media type detection and media information loss after 149*53ee8cc1Swenshuai.xi * disk changes. 150*53ee8cc1Swenshuai.xi * Also used to enable/disable printing of overrun warnings. 151*53ee8cc1Swenshuai.xi */ 152*53ee8cc1Swenshuai.xi 153*53ee8cc1Swenshuai.xi #define FTD_MSG 0x10 154*53ee8cc1Swenshuai.xi #define FD_BROKEN_DCL 0x20 155*53ee8cc1Swenshuai.xi #define FD_DEBUG 0x02 156*53ee8cc1Swenshuai.xi #define FD_SILENT_DCL_CLEAR 0x4 157*53ee8cc1Swenshuai.xi #define FD_INVERTED_DCL 0x80 /* must be 0x80, because of hardware 158*53ee8cc1Swenshuai.xi considerations */ 159*53ee8cc1Swenshuai.xi 160*53ee8cc1Swenshuai.xi char read_track; /* use readtrack during probing? */ 161*53ee8cc1Swenshuai.xi 162*53ee8cc1Swenshuai.xi /* 163*53ee8cc1Swenshuai.xi * Auto-detection. Each drive type has eight formats which are 164*53ee8cc1Swenshuai.xi * used in succession to try to read the disk. If the FDC cannot lock onto 165*53ee8cc1Swenshuai.xi * the disk, the next format is tried. This uses the variable 'probing'. 166*53ee8cc1Swenshuai.xi */ 167*53ee8cc1Swenshuai.xi short autodetect[8]; /* autodetected formats */ 168*53ee8cc1Swenshuai.xi 169*53ee8cc1Swenshuai.xi int checkfreq; /* how often should the drive be checked for disk 170*53ee8cc1Swenshuai.xi * changes */ 171*53ee8cc1Swenshuai.xi int native_format; /* native format of this drive */ 172*53ee8cc1Swenshuai.xi }; 173*53ee8cc1Swenshuai.xi 174*53ee8cc1Swenshuai.xi enum { 175*53ee8cc1Swenshuai.xi FD_NEED_TWADDLE_BIT, /* more magic */ 176*53ee8cc1Swenshuai.xi FD_VERIFY_BIT, /* inquire for write protection */ 177*53ee8cc1Swenshuai.xi FD_DISK_NEWCHANGE_BIT, /* change detected, and no action undertaken yet 178*53ee8cc1Swenshuai.xi * to clear media change status */ 179*53ee8cc1Swenshuai.xi FD_UNUSED_BIT, 180*53ee8cc1Swenshuai.xi FD_DISK_CHANGED_BIT, /* disk has been changed since last i/o */ 181*53ee8cc1Swenshuai.xi FD_DISK_WRITABLE_BIT /* disk is writable */ 182*53ee8cc1Swenshuai.xi }; 183*53ee8cc1Swenshuai.xi 184*53ee8cc1Swenshuai.xi #define FDSETDRVPRM _IOW(2, 0x90, struct floppy_drive_params) 185*53ee8cc1Swenshuai.xi #define FDGETDRVPRM _IOR(2, 0x11, struct floppy_drive_params) 186*53ee8cc1Swenshuai.xi /* set/get drive parameters */ 187*53ee8cc1Swenshuai.xi 188*53ee8cc1Swenshuai.xi 189*53ee8cc1Swenshuai.xi /* 190*53ee8cc1Swenshuai.xi * Current drive state (not directly modifiable by user, readonly) 191*53ee8cc1Swenshuai.xi */ 192*53ee8cc1Swenshuai.xi struct floppy_drive_struct { 193*53ee8cc1Swenshuai.xi unsigned long flags; 194*53ee8cc1Swenshuai.xi /* values for these flags */ 195*53ee8cc1Swenshuai.xi #define FD_NEED_TWADDLE (1 << FD_NEED_TWADDLE_BIT) 196*53ee8cc1Swenshuai.xi #define FD_VERIFY (1 << FD_VERIFY_BIT) 197*53ee8cc1Swenshuai.xi #define FD_DISK_NEWCHANGE (1 << FD_DISK_NEWCHANGE_BIT) 198*53ee8cc1Swenshuai.xi #define FD_DISK_CHANGED (1 << FD_DISK_CHANGED_BIT) 199*53ee8cc1Swenshuai.xi #define FD_DISK_WRITABLE (1 << FD_DISK_WRITABLE_BIT) 200*53ee8cc1Swenshuai.xi 201*53ee8cc1Swenshuai.xi unsigned long spinup_date; 202*53ee8cc1Swenshuai.xi unsigned long select_date; 203*53ee8cc1Swenshuai.xi unsigned long first_read_date; 204*53ee8cc1Swenshuai.xi short probed_format; 205*53ee8cc1Swenshuai.xi short track; /* current track */ 206*53ee8cc1Swenshuai.xi short maxblock; /* id of highest block read */ 207*53ee8cc1Swenshuai.xi short maxtrack; /* id of highest half track read */ 208*53ee8cc1Swenshuai.xi int generation; /* how many diskchanges? */ 209*53ee8cc1Swenshuai.xi 210*53ee8cc1Swenshuai.xi /* 211*53ee8cc1Swenshuai.xi * (User-provided) media information is _not_ discarded after a media change 212*53ee8cc1Swenshuai.xi * if the corresponding keep_data flag is non-zero. Positive values are 213*53ee8cc1Swenshuai.xi * decremented after each probe. 214*53ee8cc1Swenshuai.xi */ 215*53ee8cc1Swenshuai.xi int keep_data; 216*53ee8cc1Swenshuai.xi 217*53ee8cc1Swenshuai.xi /* Prevent "aliased" accesses. */ 218*53ee8cc1Swenshuai.xi int fd_ref; 219*53ee8cc1Swenshuai.xi int fd_device; 220*53ee8cc1Swenshuai.xi unsigned long last_checked; /* when was the drive last checked for a disk 221*53ee8cc1Swenshuai.xi * change? */ 222*53ee8cc1Swenshuai.xi 223*53ee8cc1Swenshuai.xi char *dmabuf; 224*53ee8cc1Swenshuai.xi int bufblocks; 225*53ee8cc1Swenshuai.xi }; 226*53ee8cc1Swenshuai.xi 227*53ee8cc1Swenshuai.xi #define FDGETDRVSTAT _IOR(2, 0x12, struct floppy_drive_struct) 228*53ee8cc1Swenshuai.xi #define FDPOLLDRVSTAT _IOR(2, 0x13, struct floppy_drive_struct) 229*53ee8cc1Swenshuai.xi /* get drive state: GET returns the cached state, POLL polls for new state */ 230*53ee8cc1Swenshuai.xi 231*53ee8cc1Swenshuai.xi 232*53ee8cc1Swenshuai.xi /* 233*53ee8cc1Swenshuai.xi * reset FDC 234*53ee8cc1Swenshuai.xi */ 235*53ee8cc1Swenshuai.xi enum reset_mode { 236*53ee8cc1Swenshuai.xi FD_RESET_IF_NEEDED, /* reset only if the reset flags is set */ 237*53ee8cc1Swenshuai.xi FD_RESET_IF_RAWCMD, /* obsolete */ 238*53ee8cc1Swenshuai.xi FD_RESET_ALWAYS /* reset always */ 239*53ee8cc1Swenshuai.xi }; 240*53ee8cc1Swenshuai.xi #define FDRESET _IO(2, 0x54) 241*53ee8cc1Swenshuai.xi 242*53ee8cc1Swenshuai.xi 243*53ee8cc1Swenshuai.xi /* 244*53ee8cc1Swenshuai.xi * FDC state 245*53ee8cc1Swenshuai.xi */ 246*53ee8cc1Swenshuai.xi struct floppy_fdc_state { 247*53ee8cc1Swenshuai.xi int spec1; /* spec1 value last used */ 248*53ee8cc1Swenshuai.xi int spec2; /* spec2 value last used */ 249*53ee8cc1Swenshuai.xi int dtr; 250*53ee8cc1Swenshuai.xi unsigned char version; /* FDC version code */ 251*53ee8cc1Swenshuai.xi unsigned char dor; 252*53ee8cc1Swenshuai.xi unsigned long address; /* io address */ 253*53ee8cc1Swenshuai.xi unsigned int rawcmd:2; 254*53ee8cc1Swenshuai.xi unsigned int reset:1; 255*53ee8cc1Swenshuai.xi unsigned int need_configure:1; 256*53ee8cc1Swenshuai.xi unsigned int perp_mode:2; 257*53ee8cc1Swenshuai.xi unsigned int has_fifo:1; 258*53ee8cc1Swenshuai.xi unsigned int driver_version; /* version code for floppy driver */ 259*53ee8cc1Swenshuai.xi #define FD_DRIVER_VERSION 0x100 260*53ee8cc1Swenshuai.xi /* user programs using the floppy API should use floppy_fdc_state to 261*53ee8cc1Swenshuai.xi * get the version number of the floppy driver that they are running 262*53ee8cc1Swenshuai.xi * on. If this version number is bigger than the one compiled into the 263*53ee8cc1Swenshuai.xi * user program (the FD_DRIVER_VERSION define), it should be prepared 264*53ee8cc1Swenshuai.xi * to bigger structures 265*53ee8cc1Swenshuai.xi */ 266*53ee8cc1Swenshuai.xi 267*53ee8cc1Swenshuai.xi unsigned char track[4]; 268*53ee8cc1Swenshuai.xi /* Position of the heads of the 4 units attached to this FDC, 269*53ee8cc1Swenshuai.xi * as stored on the FDC. In the future, the position as stored 270*53ee8cc1Swenshuai.xi * on the FDC might not agree with the actual physical 271*53ee8cc1Swenshuai.xi * position of these drive heads. By allowing such 272*53ee8cc1Swenshuai.xi * disagreement, it will be possible to reset the FDC without 273*53ee8cc1Swenshuai.xi * incurring the expensive cost of repositioning all heads. 274*53ee8cc1Swenshuai.xi * Right now, these positions are hard wired to 0. */ 275*53ee8cc1Swenshuai.xi 276*53ee8cc1Swenshuai.xi }; 277*53ee8cc1Swenshuai.xi 278*53ee8cc1Swenshuai.xi #define FDGETFDCSTAT _IOR(2, 0x15, struct floppy_fdc_state) 279*53ee8cc1Swenshuai.xi 280*53ee8cc1Swenshuai.xi 281*53ee8cc1Swenshuai.xi /* 282*53ee8cc1Swenshuai.xi * Asynchronous Write error tracking 283*53ee8cc1Swenshuai.xi */ 284*53ee8cc1Swenshuai.xi struct floppy_write_errors { 285*53ee8cc1Swenshuai.xi /* Write error logging. 286*53ee8cc1Swenshuai.xi * 287*53ee8cc1Swenshuai.xi * These fields can be cleared with the FDWERRORCLR ioctl. 288*53ee8cc1Swenshuai.xi * Only writes that were attempted but failed due to a physical media 289*53ee8cc1Swenshuai.xi * error are logged. write(2) calls that fail and return an error code 290*53ee8cc1Swenshuai.xi * to the user process are not counted. 291*53ee8cc1Swenshuai.xi */ 292*53ee8cc1Swenshuai.xi 293*53ee8cc1Swenshuai.xi unsigned int write_errors; /* number of physical write errors 294*53ee8cc1Swenshuai.xi * encountered */ 295*53ee8cc1Swenshuai.xi 296*53ee8cc1Swenshuai.xi /* position of first and last write errors */ 297*53ee8cc1Swenshuai.xi unsigned long first_error_sector; 298*53ee8cc1Swenshuai.xi int first_error_generation; 299*53ee8cc1Swenshuai.xi unsigned long last_error_sector; 300*53ee8cc1Swenshuai.xi int last_error_generation; 301*53ee8cc1Swenshuai.xi 302*53ee8cc1Swenshuai.xi unsigned int badness; /* highest retry count for a read or write 303*53ee8cc1Swenshuai.xi * operation */ 304*53ee8cc1Swenshuai.xi }; 305*53ee8cc1Swenshuai.xi 306*53ee8cc1Swenshuai.xi #define FDWERRORCLR _IO(2, 0x56) 307*53ee8cc1Swenshuai.xi /* clear write error and badness information */ 308*53ee8cc1Swenshuai.xi #define FDWERRORGET _IOR(2, 0x17, struct floppy_write_errors) 309*53ee8cc1Swenshuai.xi /* get write error and badness information */ 310*53ee8cc1Swenshuai.xi 311*53ee8cc1Swenshuai.xi 312*53ee8cc1Swenshuai.xi /* 313*53ee8cc1Swenshuai.xi * Raw commands 314*53ee8cc1Swenshuai.xi */ 315*53ee8cc1Swenshuai.xi /* new interface flag: now we can do them in batches */ 316*53ee8cc1Swenshuai.xi #define FDHAVEBATCHEDRAWCMD 317*53ee8cc1Swenshuai.xi 318*53ee8cc1Swenshuai.xi struct floppy_raw_cmd { 319*53ee8cc1Swenshuai.xi unsigned int flags; 320*53ee8cc1Swenshuai.xi #define FD_RAW_READ 1 321*53ee8cc1Swenshuai.xi #define FD_RAW_WRITE 2 322*53ee8cc1Swenshuai.xi #define FD_RAW_NO_MOTOR 4 323*53ee8cc1Swenshuai.xi #define FD_RAW_DISK_CHANGE 4 /* out: disk change flag was set */ 324*53ee8cc1Swenshuai.xi #define FD_RAW_INTR 8 /* wait for an interrupt */ 325*53ee8cc1Swenshuai.xi #define FD_RAW_SPIN 0x10 /* spin up the disk for this command */ 326*53ee8cc1Swenshuai.xi #define FD_RAW_NO_MOTOR_AFTER 0x20 /* switch the motor off after command 327*53ee8cc1Swenshuai.xi * completion */ 328*53ee8cc1Swenshuai.xi #define FD_RAW_NEED_DISK 0x40 /* this command needs a disk to be present */ 329*53ee8cc1Swenshuai.xi #define FD_RAW_NEED_SEEK 0x80 /* this command uses an implied seek (soft) */ 330*53ee8cc1Swenshuai.xi 331*53ee8cc1Swenshuai.xi /* more "in" flags */ 332*53ee8cc1Swenshuai.xi #define FD_RAW_MORE 0x100 /* more records follow */ 333*53ee8cc1Swenshuai.xi #define FD_RAW_STOP_IF_FAILURE 0x200 /* stop if we encounter a failure */ 334*53ee8cc1Swenshuai.xi #define FD_RAW_STOP_IF_SUCCESS 0x400 /* stop if command successful */ 335*53ee8cc1Swenshuai.xi #define FD_RAW_SOFTFAILURE 0x800 /* consider the return value for failure 336*53ee8cc1Swenshuai.xi * detection too */ 337*53ee8cc1Swenshuai.xi 338*53ee8cc1Swenshuai.xi /* more "out" flags */ 339*53ee8cc1Swenshuai.xi #define FD_RAW_FAILURE 0x10000 /* command sent to fdc, fdc returned error */ 340*53ee8cc1Swenshuai.xi #define FD_RAW_HARDFAILURE 0x20000 /* fdc had to be reset, or timed out */ 341*53ee8cc1Swenshuai.xi 342*53ee8cc1Swenshuai.xi void *data; 343*53ee8cc1Swenshuai.xi char *kernel_data; /* location of data buffer in the kernel */ 344*53ee8cc1Swenshuai.xi struct floppy_raw_cmd *next; /* used for chaining of raw cmd's 345*53ee8cc1Swenshuai.xi * within the kernel */ 346*53ee8cc1Swenshuai.xi long length; /* in: length of dma transfer. out: remaining bytes */ 347*53ee8cc1Swenshuai.xi long phys_length; /* physical length, if different from dma length */ 348*53ee8cc1Swenshuai.xi int buffer_length; /* length of allocated buffer */ 349*53ee8cc1Swenshuai.xi 350*53ee8cc1Swenshuai.xi unsigned char rate; 351*53ee8cc1Swenshuai.xi unsigned char cmd_count; 352*53ee8cc1Swenshuai.xi unsigned char cmd[16]; 353*53ee8cc1Swenshuai.xi unsigned char reply_count; 354*53ee8cc1Swenshuai.xi unsigned char reply[16]; 355*53ee8cc1Swenshuai.xi int track; 356*53ee8cc1Swenshuai.xi int resultcode; 357*53ee8cc1Swenshuai.xi 358*53ee8cc1Swenshuai.xi int reserved1; 359*53ee8cc1Swenshuai.xi int reserved2; 360*53ee8cc1Swenshuai.xi }; 361*53ee8cc1Swenshuai.xi 362*53ee8cc1Swenshuai.xi #define FDRAWCMD _IO(2, 0x58) 363*53ee8cc1Swenshuai.xi /* send a raw command to the fdc. Structure size not included, because of 364*53ee8cc1Swenshuai.xi * batches */ 365*53ee8cc1Swenshuai.xi 366*53ee8cc1Swenshuai.xi #define FDTWADDLE _IO(2, 0x59) 367*53ee8cc1Swenshuai.xi /* flicker motor-on bit before reading a sector. Experimental */ 368*53ee8cc1Swenshuai.xi 369*53ee8cc1Swenshuai.xi 370*53ee8cc1Swenshuai.xi #define FDEJECT _IO(2, 0x5a) 371*53ee8cc1Swenshuai.xi /* eject the disk */ 372*53ee8cc1Swenshuai.xi 373*53ee8cc1Swenshuai.xi #endif 374