1 #ifndef _LINUX_FD_H
2 #define _LINUX_FD_H
3
4 #define FDCLRPRM 0 /* clear user-defined parameters */
5 #define FDSETPRM 1 /* set user-defined parameters for current media */
6 #define FDSETMEDIAPRM 1
7 #define FDDEFPRM 2 /* set user-defined parameters until explicitly cleared */
8 #define FDDEFMEDIAPRM 2
9 #define FDGETPRM 3 /* get disk parameters */
10 #define FDGETMEDIAPRM 3
11 #define FDMSGON 4 /* issue kernel messages on media type change */
12 #define FDMSGOFF 5 /* don't issue kernel messages on media type change */
13 #define FDFMTBEG 6 /* begin formatting a disk */
14 #define FDFMTTRK 7 /* format the specified track */
15 #define FDFMTEND 8 /* end formatting a disk */
16 #define FDSETEMSGTRESH 10 /* set fdc error reporting treshold */
17 #define FDFLUSH 11 /* flush buffers for media; either for verifying media, or for
18 handling a media change without closing the file
19 descriptor */
20 #define FDSETMAXERRS 12 /* set abortion and read_track treshold */
21 #define FDGETMAXERRS 14 /* get abortion and read_track treshold */
22 #define FDGETDRVTYP 16 /* get drive type: 5 1/4 or 3 1/2 */
23
24 #define FDSETDRVPRM 20 /* set drive parameters */
25 #define FDGETDRVPRM 21 /* get drive parameters */
26 #define FDGETDRVSTAT 22 /* get drive state */
27 #define FDPOLLDRVSTAT 23 /* get drive state */
28 #define FDGETFDCSTAT 25 /* get fdc state */
29
30 #define FDRESET 24 /* reset FDC */
31 #define FD_RESET_IF_NEEDED 0
32 #define FD_RESET_IF_RAWCMD 1
33 #define FD_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 #define FDRAWCMD 30 /* send a raw command to the fdc */
41
42 #define FDTWADDLE 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 #define MAX_BUFFER_SECTORS 24 /* was 18 -bb */
49
50 #define FD_FILL_BYTE 0xF6 /* format fill byte */
51
52 #define FD_2M 0x4
53 #define FD_SIZECODEMASK 0x38
54 #define FD_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 #ifndef ASSEMBLER
60 struct floppy_struct {
61 unsigned int size, /* 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 unsigned char gap, /* 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 struct format_descr {
74 unsigned int device,head,track;
75 };
76
77 struct floppy_max_errors {
78 unsigned int
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 struct floppy_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 unsigned long max_dtr; /* Step rate, usec */
102 unsigned long hlt; /* Head load/settle time, msec */
103 unsigned long hut; /* Head unload time (remnant of 8" drives) */
104 unsigned long srt; /* Step rate, usec */
105
106 unsigned long spinup; /* time needed for spinup ( in jiffies) */
107 unsigned long spindown; /* timeout needed for spindown */
108 unsigned char spindown_offset;/* decides in which position the disk
109 * will stop */
110 unsigned char select_delay; /* delay to wait after select */
111 unsigned char rps; /* rotations per second */
112 unsigned char tracks; /* maximum number of tracks */
113 unsigned long timeout; /* timeout for interrupt requests */
114
115 unsigned char interleave_sect;/* if there are more sectors, use interleave */
116
117 struct floppy_max_errors max_errors;
118
119 char flags; /* 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 #define FTD_MSG 0x10
126
127 char read_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 short autodetect[8]; /* autodetected formats */
135
136 int checkfreq; /* how often should the drive be checked for disk changes */
137 int native_format; /* native format of this drive */
138 };
139
140 struct floppy_drive_struct {
141 signed char flags;
142
143 /* values for these flags */
144 #define FD_NEED_TWADDLE 1 /* more magic */
145 #define FD_VERIFY 2 /* this is set at bootup to force an initial drive status
146 inquiry*/
147 #define FD_DISK_NEWCHANGE 4 /* change detected, and no action undertaken yet to
148 clear media change status */
149 #define FD_DRIVE_PRESENT 8
150 #define FD_DISK_WRITABLE 32
151
152 unsigned long volatile spinup_date;
153 unsigned long volatile select_date;
154 unsigned long volatile first_read_date;
155 short probed_format;
156 short track; /* current track */
157 short maxblock; /* id of highest block read */
158 short maxtrack; /* id of highest half track read */
159 int generation; /* 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 int keep_data;
167
168 /* Prevent "aliased" accesses. */
169 int fd_ref;
170 int fd_device;
171 int last_checked; /* when was the drive last checked for a disk change? */
172
173 };
174
175 struct floppy_fdc_state {
176 int spec1; /* spec1 value last used */
177 int spec2; /* spec2 value last used */
178 int dtr;
179 unsigned char version; /* FDC version code */
180 unsigned char dor;
181 int address; /* io address */
182 unsigned int rawcmd:2;
183 unsigned int reset:1;
184 unsigned int need_configure:1;
185 unsigned int perp_mode:2;
186 unsigned int has_fifo:1;
187 };
188
189 struct floppy_raw_cmd {
190 void *data;
191 long length;
192
193 unsigned char rate;
194 unsigned char flags;
195 unsigned char cmd_count;
196 unsigned char cmd[9];
197 unsigned char reply_count;
198 unsigned char reply[7];
199 int track;
200 };
201 #endif
202
203 /* meaning of the various bytes */
204
205 /* flags */
206 #define FD_RAW_READ 1
207 #define FD_RAW_WRITE 2
208 #define FD_RAW_INTR 8
209 #define FD_RAW_SPIN 16
210 #define FD_RAW_NEED_DISK 64
211 #define FD_RAW_NEED_SEEK 128
212 #define FD_RAW_USER_SUPPLIED 256
213
214 #endif