1 #ifndef_LINUX_FD_H 2 #define_LINUX_FD_H 3
4 #defineFDCLRPRM 0 /* clear user-defined parameters */ 5 #defineFDSETPRM 1 /* set user-defined parameters for current media */ 6 #define FDSETMEDIAPRM 1
7 #defineFDDEFPRM 2 /* set user-defined parameters until explicitly cleared */ 8 #define FDDEFMEDIAPRM 2
9 #defineFDGETPRM 3 /* get disk parameters */ 10 #define FDGETMEDIAPRM 3
11 #defineFDMSGON 4 /* issue kernel messages on media type change */ 12 #defineFDMSGOFF 5 /* don't issue kernel messages on media type change */ 13 #defineFDFMTBEG 6 /* begin formatting a disk */ 14 #defineFDFMTTRK 7 /* format the specified track */ 15 #defineFDFMTEND 8 /* end formatting a disk */ 16 #defineFDSETEMSGTRESH 10 /* set fdc error reporting threshold */ 17 #defineFDFLUSH 11 /* flush buffers for media; either for verifying media, or for 18 handling a media change without closing the file 19 descriptor */ 20 #defineFDSETMAXERRS 12 /* set abortion and read_track threshold */ 21 #defineFDGETMAXERRS 14 /* get abortion and read_track threshold */ 22 #defineFDGETDRVTYP 16 /* get drive type: 5 1/4 or 3 1/2 */ 23
24 #defineFDSETDRVPRM 20 /* set drive parameters */ 25 #defineFDGETDRVPRM 21 /* get drive parameters */ 26 #defineFDGETDRVSTAT 22 /* get drive state */ 27 #defineFDPOLLDRVSTAT 23 /* get drive state */ 28 #defineFDGETFDCSTAT 25 /* get fdc state */ 29
30 #defineFDRESET 24 /* reset FDC */ 31 #defineFD_RESET_IF_NEEDED 0
32 #defineFD_RESET_IF_RAWCMD 1
33 #defineFD_RESET_ALWAYS 2
34
35 #define FDBAILOUT 26 /* release all fdc locks */ 36 #define FD_CLEAR_RESET 0
37 #define FD_COMPLETE_FORMAT 1
38 #define FD_UNLOCK_FDC 2
39
40 #defineFDRAWCMD 30 /* send a raw command to the fdc */ 41
42 #defineFDTWADDLE 40 /* flicker motor-on bit before reading a sector */ 43
44 /* 45 * Maximum number of sectors in a track buffer. Track buffering is disabled 46 * if tracks are bigger. 47 */ 48 #defineMAX_BUFFER_SECTORS 24 /* was 18 -bb */ 49
50 #defineFD_FILL_BYTE 0xF6 /* format fill byte */ 51
52 #defineFD_2M 0x4
53 #defineFD_SIZECODEMASK 0x38
54 #defineFD_SIZECODE(floppy) (((( (floppy)->rate ) & FD_SIZECODEMASK) >> 3)+ 2)
55 #define FD_SECTSIZE(floppy) ( (floppy)->rate & FD_2M ? \
56 512 : 128 << FD_SIZECODE(floppy) )
57 #define FD_PERP 0x40
58
59 #ifndefASSEMBLER 60 structfloppy_struct{ 61 unsignedintsize, /* nr of sectors total */ 62 sect, /* sectors per track */ 63 head, /* nr of heads */ 64 track, /* nr of tracks */ 65 stretch; /* !=0 means double track steps */ 66 unsignedchargap, /* gap1 size */ 67 rate, /* data rate. |= 0x40 for perpendicular */ 68 spec1, /* stepping rate, head unload time */ 69 fmt_gap; /* gap2 size */ 70 char * name; /* used only for predefined formats */ 71 };
72
73 structformat_descr{ 74 unsignedintdevice,head,track;
75 };
76
77 structfloppy_max_errors{ 78 unsignedint 79 abort, /* number of errors to be reached before aborting */ 80 read_track, /* maximal number of errors permitted to read an 81 * entire track at once */ 82 reset, /* maximal number of errors before a reset is tried */ 83 recal, /* maximal number of errors before a recalibrate is 84 * tried */ 85
86 /* 87 * Threshold for reporting FDC errors to the console. 88 * Setting this to zero may flood your screen when using 89 * ultra cheap floppies ;-) 90 */ 91 reporting;
92
93 };
94
95 structfloppy_drive_params{ 96 char cmos; /* cmos type */ 97
98 /* Spec2 is (HLD<<1 | ND), where HLD is head load time (1=2ms, 2=4 ms etc) 99 * and ND is set means no DMA. Hardcoded to 6 (HLD=6ms, use DMA). 100 */ 101 unsignedlong max_dtr; /* Step rate, usec */ 102 unsignedlonghlt; /* Head load/settle time, msec */ 103 unsignedlonghut; /* Head unload time (remnant of 8" drives) */ 104 unsignedlongsrt; /* Step rate, usec */ 105
106 unsignedlongspinup; /* time needed for spinup ( in jiffies) */ 107 unsignedlongspindown; /* timeout needed for spindown */ 108 unsignedcharspindown_offset;/* decides in which position the disk 109 * will stop */ 110 unsignedcharselect_delay; /* delay to wait after select */ 111 unsignedcharrps; /* rotations per second */ 112 unsignedchartracks; /* maximum number of tracks */ 113 unsignedlongtimeout; /* timeout for interrupt requests */ 114
115 unsignedcharinterleave_sect;/* if there are more sectors, use interleave */ 116
117 structfloppy_max_errorsmax_errors;
118
119 charflags; /* various flags, including ftd_msg */ 120 /* 121 * Announce successful media type detection and media information loss after 122 * disk changes. 123 * Also used to enable/disable printing of overrun warnings. 124 */ 125 #defineFTD_MSG 0x10
126
127 charread_track; /* use readtrack during probing? */ 128
129 /* 130 * Auto-detection. Each drive type has eight formats which are 131 * used in succession to try to read the disk. If the FDC cannot lock onto 132 * the disk, the next format is tried. This uses the variable 'probing'. 133 */ 134 shortautodetect[8]; /* autodetected formats */ 135
136 intcheckfreq; /* how often should the drive be checked for disk changes */ 137 intnative_format; /* native format of this drive */ 138 };
139
140 structfloppy_drive_struct{ 141 signedcharflags;
142
143 /* values for these flags */ 144 #defineFD_NEED_TWADDLE 1 /* more magic */ 145 #defineFD_VERIFY 2 /* this is set at bootup to force an initial drive status 146 inquiry*/ 147 #defineFD_DISK_NEWCHANGE 4 /* change detected, and no action undertaken yet to 148 clear media change status */ 149 #defineFD_DRIVE_PRESENT 8
150 #defineFD_DISK_WRITABLE 32
151
152 unsignedlongvolatilespinup_date;
153 unsignedlongvolatileselect_date;
154 unsignedlongvolatilefirst_read_date;
155 shortprobed_format;
156 shorttrack; /* current track */ 157 shortmaxblock; /* id of highest block read */ 158 shortmaxtrack; /* id of highest half track read */ 159 intgeneration; /* how many diskchanges? */ 160
161 /* 162 * (User-provided) media information is _not_ discarded after a media change 163 * if the corresponding keep_data flag is non-zero. Positive values are 164 * decremented after each probe. 165 */ 166 intkeep_data;
167
168 /* Prevent "aliased" accesses. */ 169 intfd_ref;
170 intfd_device;
171 intlast_checked; /* when was the drive last checked for a disk change? */ 172
173 };
174
175 structfloppy_fdc_state{ 176 intspec1; /* spec1 value last used */ 177 intspec2; /* spec2 value last used */ 178 intdtr;
179 unsignedcharversion; /* FDC version code */ 180 unsignedchardor;
181 intaddress; /* io address */ 182 unsignedintrawcmd:2;
183 unsignedintreset:1;
184 unsignedintneed_configure:1;
185 unsignedintperp_mode:2;
186 unsignedinthas_fifo:1;
187 };
188
189 structfloppy_raw_cmd{ 190 void *data;
191 longlength;
192
193 unsignedcharrate;
194 unsignedcharflags;
195 unsignedcharcmd_count;
196 unsignedcharcmd[9];
197 unsignedcharreply_count;
198 unsignedcharreply[7];
199 inttrack;
200 };
201 #endif 202
203 /* meaning of the various bytes */ 204
205 /* flags */ 206 #defineFD_RAW_READ 1
207 #defineFD_RAW_WRITE 2
208 #defineFD_RAW_INTR 8
209 #defineFD_RAW_SPIN 16
210 #defineFD_RAW_NEED_DISK 64
211 #defineFD_RAW_NEED_SEEK 128
212 #defineFD_RAW_USER_SUPPLIED 256
213
214 #endif