]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blob - drivers/block/floppy.c
floppy: switch from req->errors to req->error_count
[mirror_ubuntu-bionic-kernel.git] / drivers / block / floppy.c
1 /*
2 * linux/drivers/block/floppy.c
3 *
4 * Copyright (C) 1991, 1992 Linus Torvalds
5 * Copyright (C) 1993, 1994 Alain Knaff
6 * Copyright (C) 1998 Alan Cox
7 */
8
9 /*
10 * 02.12.91 - Changed to static variables to indicate need for reset
11 * and recalibrate. This makes some things easier (output_byte reset
12 * checking etc), and means less interrupt jumping in case of errors,
13 * so the code is hopefully easier to understand.
14 */
15
16 /*
17 * This file is certainly a mess. I've tried my best to get it working,
18 * but I don't like programming floppies, and I have only one anyway.
19 * Urgel. I should check for more errors, and do more graceful error
20 * recovery. Seems there are problems with several drives. I've tried to
21 * correct them. No promises.
22 */
23
24 /*
25 * As with hd.c, all routines within this file can (and will) be called
26 * by interrupts, so extreme caution is needed. A hardware interrupt
27 * handler may not sleep, or a kernel panic will happen. Thus I cannot
28 * call "floppy-on" directly, but have to set a special timer interrupt
29 * etc.
30 */
31
32 /*
33 * 28.02.92 - made track-buffering routines, based on the routines written
34 * by entropy@wintermute.wpi.edu (Lawrence Foard). Linus.
35 */
36
37 /*
38 * Automatic floppy-detection and formatting written by Werner Almesberger
39 * (almesber@nessie.cs.id.ethz.ch), who also corrected some problems with
40 * the floppy-change signal detection.
41 */
42
43 /*
44 * 1992/7/22 -- Hennus Bergman: Added better error reporting, fixed
45 * FDC data overrun bug, added some preliminary stuff for vertical
46 * recording support.
47 *
48 * 1992/9/17: Added DMA allocation & DMA functions. -- hhb.
49 *
50 * TODO: Errors are still not counted properly.
51 */
52
53 /* 1992/9/20
54 * Modifications for ``Sector Shifting'' by Rob Hooft (hooft@chem.ruu.nl)
55 * modeled after the freeware MS-DOS program fdformat/88 V1.8 by
56 * Christoph H. Hochst\"atter.
57 * I have fixed the shift values to the ones I always use. Maybe a new
58 * ioctl() should be created to be able to modify them.
59 * There is a bug in the driver that makes it impossible to format a
60 * floppy as the first thing after bootup.
61 */
62
63 /*
64 * 1993/4/29 -- Linus -- cleaned up the timer handling in the kernel, and
65 * this helped the floppy driver as well. Much cleaner, and still seems to
66 * work.
67 */
68
69 /* 1994/6/24 --bbroad-- added the floppy table entries and made
70 * minor modifications to allow 2.88 floppies to be run.
71 */
72
73 /* 1994/7/13 -- Paul Vojta -- modified the probing code to allow three or more
74 * disk types.
75 */
76
77 /*
78 * 1994/8/8 -- Alain Knaff -- Switched to fdpatch driver: Support for bigger
79 * format bug fixes, but unfortunately some new bugs too...
80 */
81
82 /* 1994/9/17 -- Koen Holtman -- added logging of physical floppy write
83 * errors to allow safe writing by specialized programs.
84 */
85
86 /* 1995/4/24 -- Dan Fandrich -- added support for Commodore 1581 3.5" disks
87 * by defining bit 1 of the "stretch" parameter to mean put sectors on the
88 * opposite side of the disk, leaving the sector IDs alone (i.e. Commodore's
89 * drives are "upside-down").
90 */
91
92 /*
93 * 1995/8/26 -- Andreas Busse -- added Mips support.
94 */
95
96 /*
97 * 1995/10/18 -- Ralf Baechle -- Portability cleanup; move machine dependent
98 * features to asm/floppy.h.
99 */
100
101 /*
102 * 1998/1/21 -- Richard Gooch <rgooch@atnf.csiro.au> -- devfs support
103 */
104
105 /*
106 * 1998/05/07 -- Russell King -- More portability cleanups; moved definition of
107 * interrupt and dma channel to asm/floppy.h. Cleaned up some formatting &
108 * use of '0' for NULL.
109 */
110
111 /*
112 * 1998/06/07 -- Alan Cox -- Merged the 2.0.34 fixes for resource allocation
113 * failures.
114 */
115
116 /*
117 * 1998/09/20 -- David Weinehall -- Added slow-down code for buggy PS/2-drives.
118 */
119
120 /*
121 * 1999/08/13 -- Paul Slootman -- floppy stopped working on Alpha after 24
122 * days, 6 hours, 32 minutes and 32 seconds (i.e. MAXINT jiffies; ints were
123 * being used to store jiffies, which are unsigned longs).
124 */
125
126 /*
127 * 2000/08/28 -- Arnaldo Carvalho de Melo <acme@conectiva.com.br>
128 * - get rid of check_region
129 * - s/suser/capable/
130 */
131
132 /*
133 * 2001/08/26 -- Paul Gortmaker - fix insmod oops on machines with no
134 * floppy controller (lingering task on list after module is gone... boom.)
135 */
136
137 /*
138 * 2002/02/07 -- Anton Altaparmakov - Fix io ports reservation to correct range
139 * (0x3f2-0x3f5, 0x3f7). This fix is a bit of a hack but the proper fix
140 * requires many non-obvious changes in arch dependent code.
141 */
142
143 /* 2003/07/28 -- Daniele Bellucci <bellucda@tiscali.it>.
144 * Better audit of register_blkdev.
145 */
146
147 #undef FLOPPY_SILENT_DCL_CLEAR
148
149 #define REALLY_SLOW_IO
150
151 #define DEBUGT 2
152
153 #define DPRINT(format, args...) \
154 pr_info("floppy%d: " format, current_drive, ##args)
155
156 #define DCL_DEBUG /* debug disk change line */
157 #ifdef DCL_DEBUG
158 #define debug_dcl(test, fmt, args...) \
159 do { if ((test) & FD_DEBUG) DPRINT(fmt, ##args); } while (0)
160 #else
161 #define debug_dcl(test, fmt, args...) \
162 do { if (0) DPRINT(fmt, ##args); } while (0)
163 #endif
164
165 /* do print messages for unexpected interrupts */
166 static int print_unex = 1;
167 #include <linux/module.h>
168 #include <linux/sched.h>
169 #include <linux/fs.h>
170 #include <linux/kernel.h>
171 #include <linux/timer.h>
172 #include <linux/workqueue.h>
173 #define FDPATCHES
174 #include <linux/fdreg.h>
175 #include <linux/fd.h>
176 #include <linux/hdreg.h>
177 #include <linux/errno.h>
178 #include <linux/slab.h>
179 #include <linux/mm.h>
180 #include <linux/bio.h>
181 #include <linux/string.h>
182 #include <linux/jiffies.h>
183 #include <linux/fcntl.h>
184 #include <linux/delay.h>
185 #include <linux/mc146818rtc.h> /* CMOS defines */
186 #include <linux/ioport.h>
187 #include <linux/interrupt.h>
188 #include <linux/init.h>
189 #include <linux/platform_device.h>
190 #include <linux/mod_devicetable.h>
191 #include <linux/mutex.h>
192 #include <linux/io.h>
193 #include <linux/uaccess.h>
194 #include <linux/async.h>
195
196 /*
197 * PS/2 floppies have much slower step rates than regular floppies.
198 * It's been recommended that take about 1/4 of the default speed
199 * in some more extreme cases.
200 */
201 static DEFINE_MUTEX(floppy_mutex);
202 static int slow_floppy;
203
204 #include <asm/dma.h>
205 #include <asm/irq.h>
206
207 static int FLOPPY_IRQ = 6;
208 static int FLOPPY_DMA = 2;
209 static int can_use_virtual_dma = 2;
210 /* =======
211 * can use virtual DMA:
212 * 0 = use of virtual DMA disallowed by config
213 * 1 = use of virtual DMA prescribed by config
214 * 2 = no virtual DMA preference configured. By default try hard DMA,
215 * but fall back on virtual DMA when not enough memory available
216 */
217
218 static int use_virtual_dma;
219 /* =======
220 * use virtual DMA
221 * 0 using hard DMA
222 * 1 using virtual DMA
223 * This variable is set to virtual when a DMA mem problem arises, and
224 * reset back in floppy_grab_irq_and_dma.
225 * It is not safe to reset it in other circumstances, because the floppy
226 * driver may have several buffers in use at once, and we do currently not
227 * record each buffers capabilities
228 */
229
230 static DEFINE_SPINLOCK(floppy_lock);
231
232 static unsigned short virtual_dma_port = 0x3f0;
233 irqreturn_t floppy_interrupt(int irq, void *dev_id);
234 static int set_dor(int fdc, char mask, char data);
235
236 #define K_64 0x10000 /* 64KB */
237
238 /* the following is the mask of allowed drives. By default units 2 and
239 * 3 of both floppy controllers are disabled, because switching on the
240 * motor of these drives causes system hangs on some PCI computers. drive
241 * 0 is the low bit (0x1), and drive 7 is the high bit (0x80). Bits are on if
242 * a drive is allowed.
243 *
244 * NOTE: This must come before we include the arch floppy header because
245 * some ports reference this variable from there. -DaveM
246 */
247
248 static int allowed_drive_mask = 0x33;
249
250 #include <asm/floppy.h>
251
252 static int irqdma_allocated;
253
254 #include <linux/blkdev.h>
255 #include <linux/blkpg.h>
256 #include <linux/cdrom.h> /* for the compatibility eject ioctl */
257 #include <linux/completion.h>
258
259 static struct request *current_req;
260 static void do_fd_request(struct request_queue *q);
261 static int set_next_request(void);
262
263 #ifndef fd_get_dma_residue
264 #define fd_get_dma_residue() get_dma_residue(FLOPPY_DMA)
265 #endif
266
267 /* Dma Memory related stuff */
268
269 #ifndef fd_dma_mem_free
270 #define fd_dma_mem_free(addr, size) free_pages(addr, get_order(size))
271 #endif
272
273 #ifndef fd_dma_mem_alloc
274 #define fd_dma_mem_alloc(size) __get_dma_pages(GFP_KERNEL, get_order(size))
275 #endif
276
277 static inline void fallback_on_nodma_alloc(char **addr, size_t l)
278 {
279 #ifdef FLOPPY_CAN_FALLBACK_ON_NODMA
280 if (*addr)
281 return; /* we have the memory */
282 if (can_use_virtual_dma != 2)
283 return; /* no fallback allowed */
284 pr_info("DMA memory shortage. Temporarily falling back on virtual DMA\n");
285 *addr = (char *)nodma_mem_alloc(l);
286 #else
287 return;
288 #endif
289 }
290
291 /* End dma memory related stuff */
292
293 static unsigned long fake_change;
294 static bool initialized;
295
296 #define ITYPE(x) (((x) >> 2) & 0x1f)
297 #define TOMINOR(x) ((x & 3) | ((x & 4) << 5))
298 #define UNIT(x) ((x) & 0x03) /* drive on fdc */
299 #define FDC(x) (((x) & 0x04) >> 2) /* fdc of drive */
300 /* reverse mapping from unit and fdc to drive */
301 #define REVDRIVE(fdc, unit) ((unit) + ((fdc) << 2))
302
303 #define DP (&drive_params[current_drive])
304 #define DRS (&drive_state[current_drive])
305 #define DRWE (&write_errors[current_drive])
306 #define FDCS (&fdc_state[fdc])
307
308 #define UDP (&drive_params[drive])
309 #define UDRS (&drive_state[drive])
310 #define UDRWE (&write_errors[drive])
311 #define UFDCS (&fdc_state[FDC(drive)])
312
313 #define PH_HEAD(floppy, head) (((((floppy)->stretch & 2) >> 1) ^ head) << 2)
314 #define STRETCH(floppy) ((floppy)->stretch & FD_STRETCH)
315
316 /* read/write */
317 #define COMMAND (raw_cmd->cmd[0])
318 #define DR_SELECT (raw_cmd->cmd[1])
319 #define TRACK (raw_cmd->cmd[2])
320 #define HEAD (raw_cmd->cmd[3])
321 #define SECTOR (raw_cmd->cmd[4])
322 #define SIZECODE (raw_cmd->cmd[5])
323 #define SECT_PER_TRACK (raw_cmd->cmd[6])
324 #define GAP (raw_cmd->cmd[7])
325 #define SIZECODE2 (raw_cmd->cmd[8])
326 #define NR_RW 9
327
328 /* format */
329 #define F_SIZECODE (raw_cmd->cmd[2])
330 #define F_SECT_PER_TRACK (raw_cmd->cmd[3])
331 #define F_GAP (raw_cmd->cmd[4])
332 #define F_FILL (raw_cmd->cmd[5])
333 #define NR_F 6
334
335 /*
336 * Maximum disk size (in kilobytes).
337 * This default is used whenever the current disk size is unknown.
338 * [Now it is rather a minimum]
339 */
340 #define MAX_DISK_SIZE 4 /* 3984 */
341
342 /*
343 * globals used by 'result()'
344 */
345 #define MAX_REPLIES 16
346 static unsigned char reply_buffer[MAX_REPLIES];
347 static int inr; /* size of reply buffer, when called from interrupt */
348 #define ST0 (reply_buffer[0])
349 #define ST1 (reply_buffer[1])
350 #define ST2 (reply_buffer[2])
351 #define ST3 (reply_buffer[0]) /* result of GETSTATUS */
352 #define R_TRACK (reply_buffer[3])
353 #define R_HEAD (reply_buffer[4])
354 #define R_SECTOR (reply_buffer[5])
355 #define R_SIZECODE (reply_buffer[6])
356
357 #define SEL_DLY (2 * HZ / 100)
358
359 /*
360 * this struct defines the different floppy drive types.
361 */
362 static struct {
363 struct floppy_drive_params params;
364 const char *name; /* name printed while booting */
365 } default_drive_params[] = {
366 /* NOTE: the time values in jiffies should be in msec!
367 CMOS drive type
368 | Maximum data rate supported by drive type
369 | | Head load time, msec
370 | | | Head unload time, msec (not used)
371 | | | | Step rate interval, usec
372 | | | | | Time needed for spinup time (jiffies)
373 | | | | | | Timeout for spinning down (jiffies)
374 | | | | | | | Spindown offset (where disk stops)
375 | | | | | | | | Select delay
376 | | | | | | | | | RPS
377 | | | | | | | | | | Max number of tracks
378 | | | | | | | | | | | Interrupt timeout
379 | | | | | | | | | | | | Max nonintlv. sectors
380 | | | | | | | | | | | | | -Max Errors- flags */
381 {{0, 500, 16, 16, 8000, 1*HZ, 3*HZ, 0, SEL_DLY, 5, 80, 3*HZ, 20, {3,1,2,0,2}, 0,
382 0, { 7, 4, 8, 2, 1, 5, 3,10}, 3*HZ/2, 0 }, "unknown" },
383
384 {{1, 300, 16, 16, 8000, 1*HZ, 3*HZ, 0, SEL_DLY, 5, 40, 3*HZ, 17, {3,1,2,0,2}, 0,
385 0, { 1, 0, 0, 0, 0, 0, 0, 0}, 3*HZ/2, 1 }, "360K PC" }, /*5 1/4 360 KB PC*/
386
387 {{2, 500, 16, 16, 6000, 4*HZ/10, 3*HZ, 14, SEL_DLY, 6, 83, 3*HZ, 17, {3,1,2,0,2}, 0,
388 0, { 2, 5, 6,23,10,20,12, 0}, 3*HZ/2, 2 }, "1.2M" }, /*5 1/4 HD AT*/
389
390 {{3, 250, 16, 16, 3000, 1*HZ, 3*HZ, 0, SEL_DLY, 5, 83, 3*HZ, 20, {3,1,2,0,2}, 0,
391 0, { 4,22,21,30, 3, 0, 0, 0}, 3*HZ/2, 4 }, "720k" }, /*3 1/2 DD*/
392
393 {{4, 500, 16, 16, 4000, 4*HZ/10, 3*HZ, 10, SEL_DLY, 5, 83, 3*HZ, 20, {3,1,2,0,2}, 0,
394 0, { 7, 4,25,22,31,21,29,11}, 3*HZ/2, 7 }, "1.44M" }, /*3 1/2 HD*/
395
396 {{5, 1000, 15, 8, 3000, 4*HZ/10, 3*HZ, 10, SEL_DLY, 5, 83, 3*HZ, 40, {3,1,2,0,2}, 0,
397 0, { 7, 8, 4,25,28,22,31,21}, 3*HZ/2, 8 }, "2.88M AMI BIOS" }, /*3 1/2 ED*/
398
399 {{6, 1000, 15, 8, 3000, 4*HZ/10, 3*HZ, 10, SEL_DLY, 5, 83, 3*HZ, 40, {3,1,2,0,2}, 0,
400 0, { 7, 8, 4,25,28,22,31,21}, 3*HZ/2, 8 }, "2.88M" } /*3 1/2 ED*/
401 /* | --autodetected formats--- | | |
402 * read_track | | Name printed when booting
403 * | Native format
404 * Frequency of disk change checks */
405 };
406
407 static struct floppy_drive_params drive_params[N_DRIVE];
408 static struct floppy_drive_struct drive_state[N_DRIVE];
409 static struct floppy_write_errors write_errors[N_DRIVE];
410 static struct timer_list motor_off_timer[N_DRIVE];
411 static struct gendisk *disks[N_DRIVE];
412 static struct block_device *opened_bdev[N_DRIVE];
413 static DEFINE_MUTEX(open_lock);
414 static struct floppy_raw_cmd *raw_cmd, default_raw_cmd;
415 static int fdc_queue;
416
417 /*
418 * This struct defines the different floppy types.
419 *
420 * Bit 0 of 'stretch' tells if the tracks need to be doubled for some
421 * types (e.g. 360kB diskette in 1.2MB drive, etc.). Bit 1 of 'stretch'
422 * tells if the disk is in Commodore 1581 format, which means side 0 sectors
423 * are located on side 1 of the disk but with a side 0 ID, and vice-versa.
424 * This is the same as the Sharp MZ-80 5.25" CP/M disk format, except that the
425 * 1581's logical side 0 is on physical side 1, whereas the Sharp's logical
426 * side 0 is on physical side 0 (but with the misnamed sector IDs).
427 * 'stretch' should probably be renamed to something more general, like
428 * 'options'.
429 *
430 * Bits 2 through 9 of 'stretch' tell the number of the first sector.
431 * The LSB (bit 2) is flipped. For most disks, the first sector
432 * is 1 (represented by 0x00<<2). For some CP/M and music sampler
433 * disks (such as Ensoniq EPS 16plus) it is 0 (represented as 0x01<<2).
434 * For Amstrad CPC disks it is 0xC1 (represented as 0xC0<<2).
435 *
436 * Other parameters should be self-explanatory (see also setfdprm(8)).
437 */
438 /*
439 Size
440 | Sectors per track
441 | | Head
442 | | | Tracks
443 | | | | Stretch
444 | | | | | Gap 1 size
445 | | | | | | Data rate, | 0x40 for perp
446 | | | | | | | Spec1 (stepping rate, head unload
447 | | | | | | | | /fmt gap (gap2) */
448 static struct floppy_struct floppy_type[32] = {
449 { 0, 0,0, 0,0,0x00,0x00,0x00,0x00,NULL }, /* 0 no testing */
450 { 720, 9,2,40,0,0x2A,0x02,0xDF,0x50,"d360" }, /* 1 360KB PC */
451 { 2400,15,2,80,0,0x1B,0x00,0xDF,0x54,"h1200" }, /* 2 1.2MB AT */
452 { 720, 9,1,80,0,0x2A,0x02,0xDF,0x50,"D360" }, /* 3 360KB SS 3.5" */
453 { 1440, 9,2,80,0,0x2A,0x02,0xDF,0x50,"D720" }, /* 4 720KB 3.5" */
454 { 720, 9,2,40,1,0x23,0x01,0xDF,0x50,"h360" }, /* 5 360KB AT */
455 { 1440, 9,2,80,0,0x23,0x01,0xDF,0x50,"h720" }, /* 6 720KB AT */
456 { 2880,18,2,80,0,0x1B,0x00,0xCF,0x6C,"H1440" }, /* 7 1.44MB 3.5" */
457 { 5760,36,2,80,0,0x1B,0x43,0xAF,0x54,"E2880" }, /* 8 2.88MB 3.5" */
458 { 6240,39,2,80,0,0x1B,0x43,0xAF,0x28,"E3120" }, /* 9 3.12MB 3.5" */
459
460 { 2880,18,2,80,0,0x25,0x00,0xDF,0x02,"h1440" }, /* 10 1.44MB 5.25" */
461 { 3360,21,2,80,0,0x1C,0x00,0xCF,0x0C,"H1680" }, /* 11 1.68MB 3.5" */
462 { 820,10,2,41,1,0x25,0x01,0xDF,0x2E,"h410" }, /* 12 410KB 5.25" */
463 { 1640,10,2,82,0,0x25,0x02,0xDF,0x2E,"H820" }, /* 13 820KB 3.5" */
464 { 2952,18,2,82,0,0x25,0x00,0xDF,0x02,"h1476" }, /* 14 1.48MB 5.25" */
465 { 3444,21,2,82,0,0x25,0x00,0xDF,0x0C,"H1722" }, /* 15 1.72MB 3.5" */
466 { 840,10,2,42,1,0x25,0x01,0xDF,0x2E,"h420" }, /* 16 420KB 5.25" */
467 { 1660,10,2,83,0,0x25,0x02,0xDF,0x2E,"H830" }, /* 17 830KB 3.5" */
468 { 2988,18,2,83,0,0x25,0x00,0xDF,0x02,"h1494" }, /* 18 1.49MB 5.25" */
469 { 3486,21,2,83,0,0x25,0x00,0xDF,0x0C,"H1743" }, /* 19 1.74 MB 3.5" */
470
471 { 1760,11,2,80,0,0x1C,0x09,0xCF,0x00,"h880" }, /* 20 880KB 5.25" */
472 { 2080,13,2,80,0,0x1C,0x01,0xCF,0x00,"D1040" }, /* 21 1.04MB 3.5" */
473 { 2240,14,2,80,0,0x1C,0x19,0xCF,0x00,"D1120" }, /* 22 1.12MB 3.5" */
474 { 3200,20,2,80,0,0x1C,0x20,0xCF,0x2C,"h1600" }, /* 23 1.6MB 5.25" */
475 { 3520,22,2,80,0,0x1C,0x08,0xCF,0x2e,"H1760" }, /* 24 1.76MB 3.5" */
476 { 3840,24,2,80,0,0x1C,0x20,0xCF,0x00,"H1920" }, /* 25 1.92MB 3.5" */
477 { 6400,40,2,80,0,0x25,0x5B,0xCF,0x00,"E3200" }, /* 26 3.20MB 3.5" */
478 { 7040,44,2,80,0,0x25,0x5B,0xCF,0x00,"E3520" }, /* 27 3.52MB 3.5" */
479 { 7680,48,2,80,0,0x25,0x63,0xCF,0x00,"E3840" }, /* 28 3.84MB 3.5" */
480 { 3680,23,2,80,0,0x1C,0x10,0xCF,0x00,"H1840" }, /* 29 1.84MB 3.5" */
481
482 { 1600,10,2,80,0,0x25,0x02,0xDF,0x2E,"D800" }, /* 30 800KB 3.5" */
483 { 3200,20,2,80,0,0x1C,0x00,0xCF,0x2C,"H1600" }, /* 31 1.6MB 3.5" */
484 };
485
486 #define SECTSIZE (_FD_SECTSIZE(*floppy))
487
488 /* Auto-detection: Disk type used until the next media change occurs. */
489 static struct floppy_struct *current_type[N_DRIVE];
490
491 /*
492 * User-provided type information. current_type points to
493 * the respective entry of this array.
494 */
495 static struct floppy_struct user_params[N_DRIVE];
496
497 static sector_t floppy_sizes[256];
498
499 static char floppy_device_name[] = "floppy";
500
501 /*
502 * The driver is trying to determine the correct media format
503 * while probing is set. rw_interrupt() clears it after a
504 * successful access.
505 */
506 static int probing;
507
508 /* Synchronization of FDC access. */
509 #define FD_COMMAND_NONE -1
510 #define FD_COMMAND_ERROR 2
511 #define FD_COMMAND_OKAY 3
512
513 static volatile int command_status = FD_COMMAND_NONE;
514 static unsigned long fdc_busy;
515 static DECLARE_WAIT_QUEUE_HEAD(fdc_wait);
516 static DECLARE_WAIT_QUEUE_HEAD(command_done);
517
518 /* Errors during formatting are counted here. */
519 static int format_errors;
520
521 /* Format request descriptor. */
522 static struct format_descr format_req;
523
524 /*
525 * Rate is 0 for 500kb/s, 1 for 300kbps, 2 for 250kbps
526 * Spec1 is 0xSH, where S is stepping rate (F=1ms, E=2ms, D=3ms etc),
527 * H is head unload time (1=16ms, 2=32ms, etc)
528 */
529
530 /*
531 * Track buffer
532 * Because these are written to by the DMA controller, they must
533 * not contain a 64k byte boundary crossing, or data will be
534 * corrupted/lost.
535 */
536 static char *floppy_track_buffer;
537 static int max_buffer_sectors;
538
539 static int *errors;
540 typedef void (*done_f)(int);
541 static const struct cont_t {
542 void (*interrupt)(void);
543 /* this is called after the interrupt of the
544 * main command */
545 void (*redo)(void); /* this is called to retry the operation */
546 void (*error)(void); /* this is called to tally an error */
547 done_f done; /* this is called to say if the operation has
548 * succeeded/failed */
549 } *cont;
550
551 static void floppy_ready(void);
552 static void floppy_start(void);
553 static void process_fd_request(void);
554 static void recalibrate_floppy(void);
555 static void floppy_shutdown(struct work_struct *);
556
557 static int floppy_request_regions(int);
558 static void floppy_release_regions(int);
559 static int floppy_grab_irq_and_dma(void);
560 static void floppy_release_irq_and_dma(void);
561
562 /*
563 * The "reset" variable should be tested whenever an interrupt is scheduled,
564 * after the commands have been sent. This is to ensure that the driver doesn't
565 * get wedged when the interrupt doesn't come because of a failed command.
566 * reset doesn't need to be tested before sending commands, because
567 * output_byte is automatically disabled when reset is set.
568 */
569 static void reset_fdc(void);
570
571 /*
572 * These are global variables, as that's the easiest way to give
573 * information to interrupts. They are the data used for the current
574 * request.
575 */
576 #define NO_TRACK -1
577 #define NEED_1_RECAL -2
578 #define NEED_2_RECAL -3
579
580 static atomic_t usage_count = ATOMIC_INIT(0);
581
582 /* buffer related variables */
583 static int buffer_track = -1;
584 static int buffer_drive = -1;
585 static int buffer_min = -1;
586 static int buffer_max = -1;
587
588 /* fdc related variables, should end up in a struct */
589 static struct floppy_fdc_state fdc_state[N_FDC];
590 static int fdc; /* current fdc */
591
592 static struct workqueue_struct *floppy_wq;
593
594 static struct floppy_struct *_floppy = floppy_type;
595 static unsigned char current_drive;
596 static long current_count_sectors;
597 static unsigned char fsector_t; /* sector in track */
598 static unsigned char in_sector_offset; /* offset within physical sector,
599 * expressed in units of 512 bytes */
600
601 static inline bool drive_no_geom(int drive)
602 {
603 return !current_type[drive] && !ITYPE(UDRS->fd_device);
604 }
605
606 #ifndef fd_eject
607 static inline int fd_eject(int drive)
608 {
609 return -EINVAL;
610 }
611 #endif
612
613 /*
614 * Debugging
615 * =========
616 */
617 #ifdef DEBUGT
618 static long unsigned debugtimer;
619
620 static inline void set_debugt(void)
621 {
622 debugtimer = jiffies;
623 }
624
625 static inline void debugt(const char *func, const char *msg)
626 {
627 if (DP->flags & DEBUGT)
628 pr_info("%s:%s dtime=%lu\n", func, msg, jiffies - debugtimer);
629 }
630 #else
631 static inline void set_debugt(void) { }
632 static inline void debugt(const char *func, const char *msg) { }
633 #endif /* DEBUGT */
634
635
636 static DECLARE_DELAYED_WORK(fd_timeout, floppy_shutdown);
637 static const char *timeout_message;
638
639 static void is_alive(const char *func, const char *message)
640 {
641 /* this routine checks whether the floppy driver is "alive" */
642 if (test_bit(0, &fdc_busy) && command_status < 2 &&
643 !delayed_work_pending(&fd_timeout)) {
644 DPRINT("%s: timeout handler died. %s\n", func, message);
645 }
646 }
647
648 static void (*do_floppy)(void) = NULL;
649
650 #define OLOGSIZE 20
651
652 static void (*lasthandler)(void);
653 static unsigned long interruptjiffies;
654 static unsigned long resultjiffies;
655 static int resultsize;
656 static unsigned long lastredo;
657
658 static struct output_log {
659 unsigned char data;
660 unsigned char status;
661 unsigned long jiffies;
662 } output_log[OLOGSIZE];
663
664 static int output_log_pos;
665
666 #define current_reqD -1
667 #define MAXTIMEOUT -2
668
669 static void __reschedule_timeout(int drive, const char *message)
670 {
671 unsigned long delay;
672
673 if (drive == current_reqD)
674 drive = current_drive;
675
676 if (drive < 0 || drive >= N_DRIVE) {
677 delay = 20UL * HZ;
678 drive = 0;
679 } else
680 delay = UDP->timeout;
681
682 mod_delayed_work(floppy_wq, &fd_timeout, delay);
683 if (UDP->flags & FD_DEBUG)
684 DPRINT("reschedule timeout %s\n", message);
685 timeout_message = message;
686 }
687
688 static void reschedule_timeout(int drive, const char *message)
689 {
690 unsigned long flags;
691
692 spin_lock_irqsave(&floppy_lock, flags);
693 __reschedule_timeout(drive, message);
694 spin_unlock_irqrestore(&floppy_lock, flags);
695 }
696
697 #define INFBOUND(a, b) (a) = max_t(int, a, b)
698 #define SUPBOUND(a, b) (a) = min_t(int, a, b)
699
700 /*
701 * Bottom half floppy driver.
702 * ==========================
703 *
704 * This part of the file contains the code talking directly to the hardware,
705 * and also the main service loop (seek-configure-spinup-command)
706 */
707
708 /*
709 * disk change.
710 * This routine is responsible for maintaining the FD_DISK_CHANGE flag,
711 * and the last_checked date.
712 *
713 * last_checked is the date of the last check which showed 'no disk change'
714 * FD_DISK_CHANGE is set under two conditions:
715 * 1. The floppy has been changed after some i/o to that floppy already
716 * took place.
717 * 2. No floppy disk is in the drive. This is done in order to ensure that
718 * requests are quickly flushed in case there is no disk in the drive. It
719 * follows that FD_DISK_CHANGE can only be cleared if there is a disk in
720 * the drive.
721 *
722 * For 1., maxblock is observed. Maxblock is 0 if no i/o has taken place yet.
723 * For 2., FD_DISK_NEWCHANGE is watched. FD_DISK_NEWCHANGE is cleared on
724 * each seek. If a disk is present, the disk change line should also be
725 * cleared on each seek. Thus, if FD_DISK_NEWCHANGE is clear, but the disk
726 * change line is set, this means either that no disk is in the drive, or
727 * that it has been removed since the last seek.
728 *
729 * This means that we really have a third possibility too:
730 * The floppy has been changed after the last seek.
731 */
732
733 static int disk_change(int drive)
734 {
735 int fdc = FDC(drive);
736
737 if (time_before(jiffies, UDRS->select_date + UDP->select_delay))
738 DPRINT("WARNING disk change called early\n");
739 if (!(FDCS->dor & (0x10 << UNIT(drive))) ||
740 (FDCS->dor & 3) != UNIT(drive) || fdc != FDC(drive)) {
741 DPRINT("probing disk change on unselected drive\n");
742 DPRINT("drive=%d fdc=%d dor=%x\n", drive, FDC(drive),
743 (unsigned int)FDCS->dor);
744 }
745
746 debug_dcl(UDP->flags,
747 "checking disk change line for drive %d\n", drive);
748 debug_dcl(UDP->flags, "jiffies=%lu\n", jiffies);
749 debug_dcl(UDP->flags, "disk change line=%x\n", fd_inb(FD_DIR) & 0x80);
750 debug_dcl(UDP->flags, "flags=%lx\n", UDRS->flags);
751
752 if (UDP->flags & FD_BROKEN_DCL)
753 return test_bit(FD_DISK_CHANGED_BIT, &UDRS->flags);
754 if ((fd_inb(FD_DIR) ^ UDP->flags) & 0x80) {
755 set_bit(FD_VERIFY_BIT, &UDRS->flags);
756 /* verify write protection */
757
758 if (UDRS->maxblock) /* mark it changed */
759 set_bit(FD_DISK_CHANGED_BIT, &UDRS->flags);
760
761 /* invalidate its geometry */
762 if (UDRS->keep_data >= 0) {
763 if ((UDP->flags & FTD_MSG) &&
764 current_type[drive] != NULL)
765 DPRINT("Disk type is undefined after disk change\n");
766 current_type[drive] = NULL;
767 floppy_sizes[TOMINOR(drive)] = MAX_DISK_SIZE << 1;
768 }
769
770 return 1;
771 } else {
772 UDRS->last_checked = jiffies;
773 clear_bit(FD_DISK_NEWCHANGE_BIT, &UDRS->flags);
774 }
775 return 0;
776 }
777
778 static inline int is_selected(int dor, int unit)
779 {
780 return ((dor & (0x10 << unit)) && (dor & 3) == unit);
781 }
782
783 static bool is_ready_state(int status)
784 {
785 int state = status & (STATUS_READY | STATUS_DIR | STATUS_DMA);
786 return state == STATUS_READY;
787 }
788
789 static int set_dor(int fdc, char mask, char data)
790 {
791 unsigned char unit;
792 unsigned char drive;
793 unsigned char newdor;
794 unsigned char olddor;
795
796 if (FDCS->address == -1)
797 return -1;
798
799 olddor = FDCS->dor;
800 newdor = (olddor & mask) | data;
801 if (newdor != olddor) {
802 unit = olddor & 0x3;
803 if (is_selected(olddor, unit) && !is_selected(newdor, unit)) {
804 drive = REVDRIVE(fdc, unit);
805 debug_dcl(UDP->flags,
806 "calling disk change from set_dor\n");
807 disk_change(drive);
808 }
809 FDCS->dor = newdor;
810 fd_outb(newdor, FD_DOR);
811
812 unit = newdor & 0x3;
813 if (!is_selected(olddor, unit) && is_selected(newdor, unit)) {
814 drive = REVDRIVE(fdc, unit);
815 UDRS->select_date = jiffies;
816 }
817 }
818 return olddor;
819 }
820
821 static void twaddle(void)
822 {
823 if (DP->select_delay)
824 return;
825 fd_outb(FDCS->dor & ~(0x10 << UNIT(current_drive)), FD_DOR);
826 fd_outb(FDCS->dor, FD_DOR);
827 DRS->select_date = jiffies;
828 }
829
830 /*
831 * Reset all driver information about the current fdc.
832 * This is needed after a reset, and after a raw command.
833 */
834 static void reset_fdc_info(int mode)
835 {
836 int drive;
837
838 FDCS->spec1 = FDCS->spec2 = -1;
839 FDCS->need_configure = 1;
840 FDCS->perp_mode = 1;
841 FDCS->rawcmd = 0;
842 for (drive = 0; drive < N_DRIVE; drive++)
843 if (FDC(drive) == fdc && (mode || UDRS->track != NEED_1_RECAL))
844 UDRS->track = NEED_2_RECAL;
845 }
846
847 /* selects the fdc and drive, and enables the fdc's input/dma. */
848 static void set_fdc(int drive)
849 {
850 if (drive >= 0 && drive < N_DRIVE) {
851 fdc = FDC(drive);
852 current_drive = drive;
853 }
854 if (fdc != 1 && fdc != 0) {
855 pr_info("bad fdc value\n");
856 return;
857 }
858 set_dor(fdc, ~0, 8);
859 #if N_FDC > 1
860 set_dor(1 - fdc, ~8, 0);
861 #endif
862 if (FDCS->rawcmd == 2)
863 reset_fdc_info(1);
864 if (fd_inb(FD_STATUS) != STATUS_READY)
865 FDCS->reset = 1;
866 }
867
868 /* locks the driver */
869 static int lock_fdc(int drive)
870 {
871 if (WARN(atomic_read(&usage_count) == 0,
872 "Trying to lock fdc while usage count=0\n"))
873 return -1;
874
875 if (wait_event_interruptible(fdc_wait, !test_and_set_bit(0, &fdc_busy)))
876 return -EINTR;
877
878 command_status = FD_COMMAND_NONE;
879
880 reschedule_timeout(drive, "lock fdc");
881 set_fdc(drive);
882 return 0;
883 }
884
885 /* unlocks the driver */
886 static void unlock_fdc(void)
887 {
888 if (!test_bit(0, &fdc_busy))
889 DPRINT("FDC access conflict!\n");
890
891 raw_cmd = NULL;
892 command_status = FD_COMMAND_NONE;
893 cancel_delayed_work(&fd_timeout);
894 do_floppy = NULL;
895 cont = NULL;
896 clear_bit(0, &fdc_busy);
897 wake_up(&fdc_wait);
898 }
899
900 /* switches the motor off after a given timeout */
901 static void motor_off_callback(unsigned long nr)
902 {
903 unsigned char mask = ~(0x10 << UNIT(nr));
904
905 set_dor(FDC(nr), mask, 0);
906 }
907
908 /* schedules motor off */
909 static void floppy_off(unsigned int drive)
910 {
911 unsigned long volatile delta;
912 int fdc = FDC(drive);
913
914 if (!(FDCS->dor & (0x10 << UNIT(drive))))
915 return;
916
917 del_timer(motor_off_timer + drive);
918
919 /* make spindle stop in a position which minimizes spinup time
920 * next time */
921 if (UDP->rps) {
922 delta = jiffies - UDRS->first_read_date + HZ -
923 UDP->spindown_offset;
924 delta = ((delta * UDP->rps) % HZ) / UDP->rps;
925 motor_off_timer[drive].expires =
926 jiffies + UDP->spindown - delta;
927 }
928 add_timer(motor_off_timer + drive);
929 }
930
931 /*
932 * cycle through all N_DRIVE floppy drives, for disk change testing.
933 * stopping at current drive. This is done before any long operation, to
934 * be sure to have up to date disk change information.
935 */
936 static void scandrives(void)
937 {
938 int i;
939 int drive;
940 int saved_drive;
941
942 if (DP->select_delay)
943 return;
944
945 saved_drive = current_drive;
946 for (i = 0; i < N_DRIVE; i++) {
947 drive = (saved_drive + i + 1) % N_DRIVE;
948 if (UDRS->fd_ref == 0 || UDP->select_delay != 0)
949 continue; /* skip closed drives */
950 set_fdc(drive);
951 if (!(set_dor(fdc, ~3, UNIT(drive) | (0x10 << UNIT(drive))) &
952 (0x10 << UNIT(drive))))
953 /* switch the motor off again, if it was off to
954 * begin with */
955 set_dor(fdc, ~(0x10 << UNIT(drive)), 0);
956 }
957 set_fdc(saved_drive);
958 }
959
960 static void empty(void)
961 {
962 }
963
964 static void (*floppy_work_fn)(void);
965
966 static void floppy_work_workfn(struct work_struct *work)
967 {
968 floppy_work_fn();
969 }
970
971 static DECLARE_WORK(floppy_work, floppy_work_workfn);
972
973 static void schedule_bh(void (*handler)(void))
974 {
975 WARN_ON(work_pending(&floppy_work));
976
977 floppy_work_fn = handler;
978 queue_work(floppy_wq, &floppy_work);
979 }
980
981 static void (*fd_timer_fn)(void) = NULL;
982
983 static void fd_timer_workfn(struct work_struct *work)
984 {
985 fd_timer_fn();
986 }
987
988 static DECLARE_DELAYED_WORK(fd_timer, fd_timer_workfn);
989
990 static void cancel_activity(void)
991 {
992 do_floppy = NULL;
993 cancel_delayed_work_sync(&fd_timer);
994 cancel_work_sync(&floppy_work);
995 }
996
997 /* this function makes sure that the disk stays in the drive during the
998 * transfer */
999 static void fd_watchdog(void)
1000 {
1001 debug_dcl(DP->flags, "calling disk change from watchdog\n");
1002
1003 if (disk_change(current_drive)) {
1004 DPRINT("disk removed during i/o\n");
1005 cancel_activity();
1006 cont->done(0);
1007 reset_fdc();
1008 } else {
1009 cancel_delayed_work(&fd_timer);
1010 fd_timer_fn = fd_watchdog;
1011 queue_delayed_work(floppy_wq, &fd_timer, HZ / 10);
1012 }
1013 }
1014
1015 static void main_command_interrupt(void)
1016 {
1017 cancel_delayed_work(&fd_timer);
1018 cont->interrupt();
1019 }
1020
1021 /* waits for a delay (spinup or select) to pass */
1022 static int fd_wait_for_completion(unsigned long expires,
1023 void (*function)(void))
1024 {
1025 if (FDCS->reset) {
1026 reset_fdc(); /* do the reset during sleep to win time
1027 * if we don't need to sleep, it's a good
1028 * occasion anyways */
1029 return 1;
1030 }
1031
1032 if (time_before(jiffies, expires)) {
1033 cancel_delayed_work(&fd_timer);
1034 fd_timer_fn = function;
1035 queue_delayed_work(floppy_wq, &fd_timer, expires - jiffies);
1036 return 1;
1037 }
1038 return 0;
1039 }
1040
1041 static void setup_DMA(void)
1042 {
1043 unsigned long f;
1044
1045 if (raw_cmd->length == 0) {
1046 int i;
1047
1048 pr_info("zero dma transfer size:");
1049 for (i = 0; i < raw_cmd->cmd_count; i++)
1050 pr_cont("%x,", raw_cmd->cmd[i]);
1051 pr_cont("\n");
1052 cont->done(0);
1053 FDCS->reset = 1;
1054 return;
1055 }
1056 if (((unsigned long)raw_cmd->kernel_data) % 512) {
1057 pr_info("non aligned address: %p\n", raw_cmd->kernel_data);
1058 cont->done(0);
1059 FDCS->reset = 1;
1060 return;
1061 }
1062 f = claim_dma_lock();
1063 fd_disable_dma();
1064 #ifdef fd_dma_setup
1065 if (fd_dma_setup(raw_cmd->kernel_data, raw_cmd->length,
1066 (raw_cmd->flags & FD_RAW_READ) ?
1067 DMA_MODE_READ : DMA_MODE_WRITE, FDCS->address) < 0) {
1068 release_dma_lock(f);
1069 cont->done(0);
1070 FDCS->reset = 1;
1071 return;
1072 }
1073 release_dma_lock(f);
1074 #else
1075 fd_clear_dma_ff();
1076 fd_cacheflush(raw_cmd->kernel_data, raw_cmd->length);
1077 fd_set_dma_mode((raw_cmd->flags & FD_RAW_READ) ?
1078 DMA_MODE_READ : DMA_MODE_WRITE);
1079 fd_set_dma_addr(raw_cmd->kernel_data);
1080 fd_set_dma_count(raw_cmd->length);
1081 virtual_dma_port = FDCS->address;
1082 fd_enable_dma();
1083 release_dma_lock(f);
1084 #endif
1085 }
1086
1087 static void show_floppy(void);
1088
1089 /* waits until the fdc becomes ready */
1090 static int wait_til_ready(void)
1091 {
1092 int status;
1093 int counter;
1094
1095 if (FDCS->reset)
1096 return -1;
1097 for (counter = 0; counter < 10000; counter++) {
1098 status = fd_inb(FD_STATUS);
1099 if (status & STATUS_READY)
1100 return status;
1101 }
1102 if (initialized) {
1103 DPRINT("Getstatus times out (%x) on fdc %d\n", status, fdc);
1104 show_floppy();
1105 }
1106 FDCS->reset = 1;
1107 return -1;
1108 }
1109
1110 /* sends a command byte to the fdc */
1111 static int output_byte(char byte)
1112 {
1113 int status = wait_til_ready();
1114
1115 if (status < 0)
1116 return -1;
1117
1118 if (is_ready_state(status)) {
1119 fd_outb(byte, FD_DATA);
1120 output_log[output_log_pos].data = byte;
1121 output_log[output_log_pos].status = status;
1122 output_log[output_log_pos].jiffies = jiffies;
1123 output_log_pos = (output_log_pos + 1) % OLOGSIZE;
1124 return 0;
1125 }
1126 FDCS->reset = 1;
1127 if (initialized) {
1128 DPRINT("Unable to send byte %x to FDC. Fdc=%x Status=%x\n",
1129 byte, fdc, status);
1130 show_floppy();
1131 }
1132 return -1;
1133 }
1134
1135 /* gets the response from the fdc */
1136 static int result(void)
1137 {
1138 int i;
1139 int status = 0;
1140
1141 for (i = 0; i < MAX_REPLIES; i++) {
1142 status = wait_til_ready();
1143 if (status < 0)
1144 break;
1145 status &= STATUS_DIR | STATUS_READY | STATUS_BUSY | STATUS_DMA;
1146 if ((status & ~STATUS_BUSY) == STATUS_READY) {
1147 resultjiffies = jiffies;
1148 resultsize = i;
1149 return i;
1150 }
1151 if (status == (STATUS_DIR | STATUS_READY | STATUS_BUSY))
1152 reply_buffer[i] = fd_inb(FD_DATA);
1153 else
1154 break;
1155 }
1156 if (initialized) {
1157 DPRINT("get result error. Fdc=%d Last status=%x Read bytes=%d\n",
1158 fdc, status, i);
1159 show_floppy();
1160 }
1161 FDCS->reset = 1;
1162 return -1;
1163 }
1164
1165 #define MORE_OUTPUT -2
1166 /* does the fdc need more output? */
1167 static int need_more_output(void)
1168 {
1169 int status = wait_til_ready();
1170
1171 if (status < 0)
1172 return -1;
1173
1174 if (is_ready_state(status))
1175 return MORE_OUTPUT;
1176
1177 return result();
1178 }
1179
1180 /* Set perpendicular mode as required, based on data rate, if supported.
1181 * 82077 Now tested. 1Mbps data rate only possible with 82077-1.
1182 */
1183 static void perpendicular_mode(void)
1184 {
1185 unsigned char perp_mode;
1186
1187 if (raw_cmd->rate & 0x40) {
1188 switch (raw_cmd->rate & 3) {
1189 case 0:
1190 perp_mode = 2;
1191 break;
1192 case 3:
1193 perp_mode = 3;
1194 break;
1195 default:
1196 DPRINT("Invalid data rate for perpendicular mode!\n");
1197 cont->done(0);
1198 FDCS->reset = 1;
1199 /*
1200 * convenient way to return to
1201 * redo without too much hassle
1202 * (deep stack et al.)
1203 */
1204 return;
1205 }
1206 } else
1207 perp_mode = 0;
1208
1209 if (FDCS->perp_mode == perp_mode)
1210 return;
1211 if (FDCS->version >= FDC_82077_ORIG) {
1212 output_byte(FD_PERPENDICULAR);
1213 output_byte(perp_mode);
1214 FDCS->perp_mode = perp_mode;
1215 } else if (perp_mode) {
1216 DPRINT("perpendicular mode not supported by this FDC.\n");
1217 }
1218 } /* perpendicular_mode */
1219
1220 static int fifo_depth = 0xa;
1221 static int no_fifo;
1222
1223 static int fdc_configure(void)
1224 {
1225 /* Turn on FIFO */
1226 output_byte(FD_CONFIGURE);
1227 if (need_more_output() != MORE_OUTPUT)
1228 return 0;
1229 output_byte(0);
1230 output_byte(0x10 | (no_fifo & 0x20) | (fifo_depth & 0xf));
1231 output_byte(0); /* pre-compensation from track
1232 0 upwards */
1233 return 1;
1234 }
1235
1236 #define NOMINAL_DTR 500
1237
1238 /* Issue a "SPECIFY" command to set the step rate time, head unload time,
1239 * head load time, and DMA disable flag to values needed by floppy.
1240 *
1241 * The value "dtr" is the data transfer rate in Kbps. It is needed
1242 * to account for the data rate-based scaling done by the 82072 and 82077
1243 * FDC types. This parameter is ignored for other types of FDCs (i.e.
1244 * 8272a).
1245 *
1246 * Note that changing the data transfer rate has a (probably deleterious)
1247 * effect on the parameters subject to scaling for 82072/82077 FDCs, so
1248 * fdc_specify is called again after each data transfer rate
1249 * change.
1250 *
1251 * srt: 1000 to 16000 in microseconds
1252 * hut: 16 to 240 milliseconds
1253 * hlt: 2 to 254 milliseconds
1254 *
1255 * These values are rounded up to the next highest available delay time.
1256 */
1257 static void fdc_specify(void)
1258 {
1259 unsigned char spec1;
1260 unsigned char spec2;
1261 unsigned long srt;
1262 unsigned long hlt;
1263 unsigned long hut;
1264 unsigned long dtr = NOMINAL_DTR;
1265 unsigned long scale_dtr = NOMINAL_DTR;
1266 int hlt_max_code = 0x7f;
1267 int hut_max_code = 0xf;
1268
1269 if (FDCS->need_configure && FDCS->version >= FDC_82072A) {
1270 fdc_configure();
1271 FDCS->need_configure = 0;
1272 }
1273
1274 switch (raw_cmd->rate & 0x03) {
1275 case 3:
1276 dtr = 1000;
1277 break;
1278 case 1:
1279 dtr = 300;
1280 if (FDCS->version >= FDC_82078) {
1281 /* chose the default rate table, not the one
1282 * where 1 = 2 Mbps */
1283 output_byte(FD_DRIVESPEC);
1284 if (need_more_output() == MORE_OUTPUT) {
1285 output_byte(UNIT(current_drive));
1286 output_byte(0xc0);
1287 }
1288 }
1289 break;
1290 case 2:
1291 dtr = 250;
1292 break;
1293 }
1294
1295 if (FDCS->version >= FDC_82072) {
1296 scale_dtr = dtr;
1297 hlt_max_code = 0x00; /* 0==256msec*dtr0/dtr (not linear!) */
1298 hut_max_code = 0x0; /* 0==256msec*dtr0/dtr (not linear!) */
1299 }
1300
1301 /* Convert step rate from microseconds to milliseconds and 4 bits */
1302 srt = 16 - DIV_ROUND_UP(DP->srt * scale_dtr / 1000, NOMINAL_DTR);
1303 if (slow_floppy)
1304 srt = srt / 4;
1305
1306 SUPBOUND(srt, 0xf);
1307 INFBOUND(srt, 0);
1308
1309 hlt = DIV_ROUND_UP(DP->hlt * scale_dtr / 2, NOMINAL_DTR);
1310 if (hlt < 0x01)
1311 hlt = 0x01;
1312 else if (hlt > 0x7f)
1313 hlt = hlt_max_code;
1314
1315 hut = DIV_ROUND_UP(DP->hut * scale_dtr / 16, NOMINAL_DTR);
1316 if (hut < 0x1)
1317 hut = 0x1;
1318 else if (hut > 0xf)
1319 hut = hut_max_code;
1320
1321 spec1 = (srt << 4) | hut;
1322 spec2 = (hlt << 1) | (use_virtual_dma & 1);
1323
1324 /* If these parameters did not change, just return with success */
1325 if (FDCS->spec1 != spec1 || FDCS->spec2 != spec2) {
1326 /* Go ahead and set spec1 and spec2 */
1327 output_byte(FD_SPECIFY);
1328 output_byte(FDCS->spec1 = spec1);
1329 output_byte(FDCS->spec2 = spec2);
1330 }
1331 } /* fdc_specify */
1332
1333 /* Set the FDC's data transfer rate on behalf of the specified drive.
1334 * NOTE: with 82072/82077 FDCs, changing the data rate requires a reissue
1335 * of the specify command (i.e. using the fdc_specify function).
1336 */
1337 static int fdc_dtr(void)
1338 {
1339 /* If data rate not already set to desired value, set it. */
1340 if ((raw_cmd->rate & 3) == FDCS->dtr)
1341 return 0;
1342
1343 /* Set dtr */
1344 fd_outb(raw_cmd->rate & 3, FD_DCR);
1345
1346 /* TODO: some FDC/drive combinations (C&T 82C711 with TEAC 1.2MB)
1347 * need a stabilization period of several milliseconds to be
1348 * enforced after data rate changes before R/W operations.
1349 * Pause 5 msec to avoid trouble. (Needs to be 2 jiffies)
1350 */
1351 FDCS->dtr = raw_cmd->rate & 3;
1352 return fd_wait_for_completion(jiffies + 2UL * HZ / 100, floppy_ready);
1353 } /* fdc_dtr */
1354
1355 static void tell_sector(void)
1356 {
1357 pr_cont(": track %d, head %d, sector %d, size %d",
1358 R_TRACK, R_HEAD, R_SECTOR, R_SIZECODE);
1359 } /* tell_sector */
1360
1361 static void print_errors(void)
1362 {
1363 DPRINT("");
1364 if (ST0 & ST0_ECE) {
1365 pr_cont("Recalibrate failed!");
1366 } else if (ST2 & ST2_CRC) {
1367 pr_cont("data CRC error");
1368 tell_sector();
1369 } else if (ST1 & ST1_CRC) {
1370 pr_cont("CRC error");
1371 tell_sector();
1372 } else if ((ST1 & (ST1_MAM | ST1_ND)) ||
1373 (ST2 & ST2_MAM)) {
1374 if (!probing) {
1375 pr_cont("sector not found");
1376 tell_sector();
1377 } else
1378 pr_cont("probe failed...");
1379 } else if (ST2 & ST2_WC) { /* seek error */
1380 pr_cont("wrong cylinder");
1381 } else if (ST2 & ST2_BC) { /* cylinder marked as bad */
1382 pr_cont("bad cylinder");
1383 } else {
1384 pr_cont("unknown error. ST[0..2] are: 0x%x 0x%x 0x%x",
1385 ST0, ST1, ST2);
1386 tell_sector();
1387 }
1388 pr_cont("\n");
1389 }
1390
1391 /*
1392 * OK, this error interpreting routine is called after a
1393 * DMA read/write has succeeded
1394 * or failed, so we check the results, and copy any buffers.
1395 * hhb: Added better error reporting.
1396 * ak: Made this into a separate routine.
1397 */
1398 static int interpret_errors(void)
1399 {
1400 char bad;
1401
1402 if (inr != 7) {
1403 DPRINT("-- FDC reply error\n");
1404 FDCS->reset = 1;
1405 return 1;
1406 }
1407
1408 /* check IC to find cause of interrupt */
1409 switch (ST0 & ST0_INTR) {
1410 case 0x40: /* error occurred during command execution */
1411 if (ST1 & ST1_EOC)
1412 return 0; /* occurs with pseudo-DMA */
1413 bad = 1;
1414 if (ST1 & ST1_WP) {
1415 DPRINT("Drive is write protected\n");
1416 clear_bit(FD_DISK_WRITABLE_BIT, &DRS->flags);
1417 cont->done(0);
1418 bad = 2;
1419 } else if (ST1 & ST1_ND) {
1420 set_bit(FD_NEED_TWADDLE_BIT, &DRS->flags);
1421 } else if (ST1 & ST1_OR) {
1422 if (DP->flags & FTD_MSG)
1423 DPRINT("Over/Underrun - retrying\n");
1424 bad = 0;
1425 } else if (*errors >= DP->max_errors.reporting) {
1426 print_errors();
1427 }
1428 if (ST2 & ST2_WC || ST2 & ST2_BC)
1429 /* wrong cylinder => recal */
1430 DRS->track = NEED_2_RECAL;
1431 return bad;
1432 case 0x80: /* invalid command given */
1433 DPRINT("Invalid FDC command given!\n");
1434 cont->done(0);
1435 return 2;
1436 case 0xc0:
1437 DPRINT("Abnormal termination caused by polling\n");
1438 cont->error();
1439 return 2;
1440 default: /* (0) Normal command termination */
1441 return 0;
1442 }
1443 }
1444
1445 /*
1446 * This routine is called when everything should be correctly set up
1447 * for the transfer (i.e. floppy motor is on, the correct floppy is
1448 * selected, and the head is sitting on the right track).
1449 */
1450 static void setup_rw_floppy(void)
1451 {
1452 int i;
1453 int r;
1454 int flags;
1455 int dflags;
1456 unsigned long ready_date;
1457 void (*function)(void);
1458
1459 flags = raw_cmd->flags;
1460 if (flags & (FD_RAW_READ | FD_RAW_WRITE))
1461 flags |= FD_RAW_INTR;
1462
1463 if ((flags & FD_RAW_SPIN) && !(flags & FD_RAW_NO_MOTOR)) {
1464 ready_date = DRS->spinup_date + DP->spinup;
1465 /* If spinup will take a long time, rerun scandrives
1466 * again just before spinup completion. Beware that
1467 * after scandrives, we must again wait for selection.
1468 */
1469 if (time_after(ready_date, jiffies + DP->select_delay)) {
1470 ready_date -= DP->select_delay;
1471 function = floppy_start;
1472 } else
1473 function = setup_rw_floppy;
1474
1475 /* wait until the floppy is spinning fast enough */
1476 if (fd_wait_for_completion(ready_date, function))
1477 return;
1478 }
1479 dflags = DRS->flags;
1480
1481 if ((flags & FD_RAW_READ) || (flags & FD_RAW_WRITE))
1482 setup_DMA();
1483
1484 if (flags & FD_RAW_INTR)
1485 do_floppy = main_command_interrupt;
1486
1487 r = 0;
1488 for (i = 0; i < raw_cmd->cmd_count; i++)
1489 r |= output_byte(raw_cmd->cmd[i]);
1490
1491 debugt(__func__, "rw_command");
1492
1493 if (r) {
1494 cont->error();
1495 reset_fdc();
1496 return;
1497 }
1498
1499 if (!(flags & FD_RAW_INTR)) {
1500 inr = result();
1501 cont->interrupt();
1502 } else if (flags & FD_RAW_NEED_DISK)
1503 fd_watchdog();
1504 }
1505
1506 static int blind_seek;
1507
1508 /*
1509 * This is the routine called after every seek (or recalibrate) interrupt
1510 * from the floppy controller.
1511 */
1512 static void seek_interrupt(void)
1513 {
1514 debugt(__func__, "");
1515 if (inr != 2 || (ST0 & 0xF8) != 0x20) {
1516 DPRINT("seek failed\n");
1517 DRS->track = NEED_2_RECAL;
1518 cont->error();
1519 cont->redo();
1520 return;
1521 }
1522 if (DRS->track >= 0 && DRS->track != ST1 && !blind_seek) {
1523 debug_dcl(DP->flags,
1524 "clearing NEWCHANGE flag because of effective seek\n");
1525 debug_dcl(DP->flags, "jiffies=%lu\n", jiffies);
1526 clear_bit(FD_DISK_NEWCHANGE_BIT, &DRS->flags);
1527 /* effective seek */
1528 DRS->select_date = jiffies;
1529 }
1530 DRS->track = ST1;
1531 floppy_ready();
1532 }
1533
1534 static void check_wp(void)
1535 {
1536 if (test_bit(FD_VERIFY_BIT, &DRS->flags)) {
1537 /* check write protection */
1538 output_byte(FD_GETSTATUS);
1539 output_byte(UNIT(current_drive));
1540 if (result() != 1) {
1541 FDCS->reset = 1;
1542 return;
1543 }
1544 clear_bit(FD_VERIFY_BIT, &DRS->flags);
1545 clear_bit(FD_NEED_TWADDLE_BIT, &DRS->flags);
1546 debug_dcl(DP->flags,
1547 "checking whether disk is write protected\n");
1548 debug_dcl(DP->flags, "wp=%x\n", ST3 & 0x40);
1549 if (!(ST3 & 0x40))
1550 set_bit(FD_DISK_WRITABLE_BIT, &DRS->flags);
1551 else
1552 clear_bit(FD_DISK_WRITABLE_BIT, &DRS->flags);
1553 }
1554 }
1555
1556 static void seek_floppy(void)
1557 {
1558 int track;
1559
1560 blind_seek = 0;
1561
1562 debug_dcl(DP->flags, "calling disk change from %s\n", __func__);
1563
1564 if (!test_bit(FD_DISK_NEWCHANGE_BIT, &DRS->flags) &&
1565 disk_change(current_drive) && (raw_cmd->flags & FD_RAW_NEED_DISK)) {
1566 /* the media changed flag should be cleared after the seek.
1567 * If it isn't, this means that there is really no disk in
1568 * the drive.
1569 */
1570 set_bit(FD_DISK_CHANGED_BIT, &DRS->flags);
1571 cont->done(0);
1572 cont->redo();
1573 return;
1574 }
1575 if (DRS->track <= NEED_1_RECAL) {
1576 recalibrate_floppy();
1577 return;
1578 } else if (test_bit(FD_DISK_NEWCHANGE_BIT, &DRS->flags) &&
1579 (raw_cmd->flags & FD_RAW_NEED_DISK) &&
1580 (DRS->track <= NO_TRACK || DRS->track == raw_cmd->track)) {
1581 /* we seek to clear the media-changed condition. Does anybody
1582 * know a more elegant way, which works on all drives? */
1583 if (raw_cmd->track)
1584 track = raw_cmd->track - 1;
1585 else {
1586 if (DP->flags & FD_SILENT_DCL_CLEAR) {
1587 set_dor(fdc, ~(0x10 << UNIT(current_drive)), 0);
1588 blind_seek = 1;
1589 raw_cmd->flags |= FD_RAW_NEED_SEEK;
1590 }
1591 track = 1;
1592 }
1593 } else {
1594 check_wp();
1595 if (raw_cmd->track != DRS->track &&
1596 (raw_cmd->flags & FD_RAW_NEED_SEEK))
1597 track = raw_cmd->track;
1598 else {
1599 setup_rw_floppy();
1600 return;
1601 }
1602 }
1603
1604 do_floppy = seek_interrupt;
1605 output_byte(FD_SEEK);
1606 output_byte(UNIT(current_drive));
1607 if (output_byte(track) < 0) {
1608 reset_fdc();
1609 return;
1610 }
1611 debugt(__func__, "");
1612 }
1613
1614 static void recal_interrupt(void)
1615 {
1616 debugt(__func__, "");
1617 if (inr != 2)
1618 FDCS->reset = 1;
1619 else if (ST0 & ST0_ECE) {
1620 switch (DRS->track) {
1621 case NEED_1_RECAL:
1622 debugt(__func__, "need 1 recal");
1623 /* after a second recalibrate, we still haven't
1624 * reached track 0. Probably no drive. Raise an
1625 * error, as failing immediately might upset
1626 * computers possessed by the Devil :-) */
1627 cont->error();
1628 cont->redo();
1629 return;
1630 case NEED_2_RECAL:
1631 debugt(__func__, "need 2 recal");
1632 /* If we already did a recalibrate,
1633 * and we are not at track 0, this
1634 * means we have moved. (The only way
1635 * not to move at recalibration is to
1636 * be already at track 0.) Clear the
1637 * new change flag */
1638 debug_dcl(DP->flags,
1639 "clearing NEWCHANGE flag because of second recalibrate\n");
1640
1641 clear_bit(FD_DISK_NEWCHANGE_BIT, &DRS->flags);
1642 DRS->select_date = jiffies;
1643 /* fall through */
1644 default:
1645 debugt(__func__, "default");
1646 /* Recalibrate moves the head by at
1647 * most 80 steps. If after one
1648 * recalibrate we don't have reached
1649 * track 0, this might mean that we
1650 * started beyond track 80. Try
1651 * again. */
1652 DRS->track = NEED_1_RECAL;
1653 break;
1654 }
1655 } else
1656 DRS->track = ST1;
1657 floppy_ready();
1658 }
1659
1660 static void print_result(char *message, int inr)
1661 {
1662 int i;
1663
1664 DPRINT("%s ", message);
1665 if (inr >= 0)
1666 for (i = 0; i < inr; i++)
1667 pr_cont("repl[%d]=%x ", i, reply_buffer[i]);
1668 pr_cont("\n");
1669 }
1670
1671 /* interrupt handler. Note that this can be called externally on the Sparc */
1672 irqreturn_t floppy_interrupt(int irq, void *dev_id)
1673 {
1674 int do_print;
1675 unsigned long f;
1676 void (*handler)(void) = do_floppy;
1677
1678 lasthandler = handler;
1679 interruptjiffies = jiffies;
1680
1681 f = claim_dma_lock();
1682 fd_disable_dma();
1683 release_dma_lock(f);
1684
1685 do_floppy = NULL;
1686 if (fdc >= N_FDC || FDCS->address == -1) {
1687 /* we don't even know which FDC is the culprit */
1688 pr_info("DOR0=%x\n", fdc_state[0].dor);
1689 pr_info("floppy interrupt on bizarre fdc %d\n", fdc);
1690 pr_info("handler=%pf\n", handler);
1691 is_alive(__func__, "bizarre fdc");
1692 return IRQ_NONE;
1693 }
1694
1695 FDCS->reset = 0;
1696 /* We have to clear the reset flag here, because apparently on boxes
1697 * with level triggered interrupts (PS/2, Sparc, ...), it is needed to
1698 * emit SENSEI's to clear the interrupt line. And FDCS->reset blocks the
1699 * emission of the SENSEI's.
1700 * It is OK to emit floppy commands because we are in an interrupt
1701 * handler here, and thus we have to fear no interference of other
1702 * activity.
1703 */
1704
1705 do_print = !handler && print_unex && initialized;
1706
1707 inr = result();
1708 if (do_print)
1709 print_result("unexpected interrupt", inr);
1710 if (inr == 0) {
1711 int max_sensei = 4;
1712 do {
1713 output_byte(FD_SENSEI);
1714 inr = result();
1715 if (do_print)
1716 print_result("sensei", inr);
1717 max_sensei--;
1718 } while ((ST0 & 0x83) != UNIT(current_drive) &&
1719 inr == 2 && max_sensei);
1720 }
1721 if (!handler) {
1722 FDCS->reset = 1;
1723 return IRQ_NONE;
1724 }
1725 schedule_bh(handler);
1726 is_alive(__func__, "normal interrupt end");
1727
1728 /* FIXME! Was it really for us? */
1729 return IRQ_HANDLED;
1730 }
1731
1732 static void recalibrate_floppy(void)
1733 {
1734 debugt(__func__, "");
1735 do_floppy = recal_interrupt;
1736 output_byte(FD_RECALIBRATE);
1737 if (output_byte(UNIT(current_drive)) < 0)
1738 reset_fdc();
1739 }
1740
1741 /*
1742 * Must do 4 FD_SENSEIs after reset because of ``drive polling''.
1743 */
1744 static void reset_interrupt(void)
1745 {
1746 debugt(__func__, "");
1747 result(); /* get the status ready for set_fdc */
1748 if (FDCS->reset) {
1749 pr_info("reset set in interrupt, calling %pf\n", cont->error);
1750 cont->error(); /* a reset just after a reset. BAD! */
1751 }
1752 cont->redo();
1753 }
1754
1755 /*
1756 * reset is done by pulling bit 2 of DOR low for a while (old FDCs),
1757 * or by setting the self clearing bit 7 of STATUS (newer FDCs)
1758 */
1759 static void reset_fdc(void)
1760 {
1761 unsigned long flags;
1762
1763 do_floppy = reset_interrupt;
1764 FDCS->reset = 0;
1765 reset_fdc_info(0);
1766
1767 /* Pseudo-DMA may intercept 'reset finished' interrupt. */
1768 /* Irrelevant for systems with true DMA (i386). */
1769
1770 flags = claim_dma_lock();
1771 fd_disable_dma();
1772 release_dma_lock(flags);
1773
1774 if (FDCS->version >= FDC_82072A)
1775 fd_outb(0x80 | (FDCS->dtr & 3), FD_STATUS);
1776 else {
1777 fd_outb(FDCS->dor & ~0x04, FD_DOR);
1778 udelay(FD_RESET_DELAY);
1779 fd_outb(FDCS->dor, FD_DOR);
1780 }
1781 }
1782
1783 static void show_floppy(void)
1784 {
1785 int i;
1786
1787 pr_info("\n");
1788 pr_info("floppy driver state\n");
1789 pr_info("-------------------\n");
1790 pr_info("now=%lu last interrupt=%lu diff=%lu last called handler=%pf\n",
1791 jiffies, interruptjiffies, jiffies - interruptjiffies,
1792 lasthandler);
1793
1794 pr_info("timeout_message=%s\n", timeout_message);
1795 pr_info("last output bytes:\n");
1796 for (i = 0; i < OLOGSIZE; i++)
1797 pr_info("%2x %2x %lu\n",
1798 output_log[(i + output_log_pos) % OLOGSIZE].data,
1799 output_log[(i + output_log_pos) % OLOGSIZE].status,
1800 output_log[(i + output_log_pos) % OLOGSIZE].jiffies);
1801 pr_info("last result at %lu\n", resultjiffies);
1802 pr_info("last redo_fd_request at %lu\n", lastredo);
1803 print_hex_dump(KERN_INFO, "", DUMP_PREFIX_NONE, 16, 1,
1804 reply_buffer, resultsize, true);
1805
1806 pr_info("status=%x\n", fd_inb(FD_STATUS));
1807 pr_info("fdc_busy=%lu\n", fdc_busy);
1808 if (do_floppy)
1809 pr_info("do_floppy=%pf\n", do_floppy);
1810 if (work_pending(&floppy_work))
1811 pr_info("floppy_work.func=%pf\n", floppy_work.func);
1812 if (delayed_work_pending(&fd_timer))
1813 pr_info("delayed work.function=%p expires=%ld\n",
1814 fd_timer.work.func,
1815 fd_timer.timer.expires - jiffies);
1816 if (delayed_work_pending(&fd_timeout))
1817 pr_info("timer_function=%p expires=%ld\n",
1818 fd_timeout.work.func,
1819 fd_timeout.timer.expires - jiffies);
1820
1821 pr_info("cont=%p\n", cont);
1822 pr_info("current_req=%p\n", current_req);
1823 pr_info("command_status=%d\n", command_status);
1824 pr_info("\n");
1825 }
1826
1827 static void floppy_shutdown(struct work_struct *arg)
1828 {
1829 unsigned long flags;
1830
1831 if (initialized)
1832 show_floppy();
1833 cancel_activity();
1834
1835 flags = claim_dma_lock();
1836 fd_disable_dma();
1837 release_dma_lock(flags);
1838
1839 /* avoid dma going to a random drive after shutdown */
1840
1841 if (initialized)
1842 DPRINT("floppy timeout called\n");
1843 FDCS->reset = 1;
1844 if (cont) {
1845 cont->done(0);
1846 cont->redo(); /* this will recall reset when needed */
1847 } else {
1848 pr_info("no cont in shutdown!\n");
1849 process_fd_request();
1850 }
1851 is_alive(__func__, "");
1852 }
1853
1854 /* start motor, check media-changed condition and write protection */
1855 static int start_motor(void (*function)(void))
1856 {
1857 int mask;
1858 int data;
1859
1860 mask = 0xfc;
1861 data = UNIT(current_drive);
1862 if (!(raw_cmd->flags & FD_RAW_NO_MOTOR)) {
1863 if (!(FDCS->dor & (0x10 << UNIT(current_drive)))) {
1864 set_debugt();
1865 /* no read since this drive is running */
1866 DRS->first_read_date = 0;
1867 /* note motor start time if motor is not yet running */
1868 DRS->spinup_date = jiffies;
1869 data |= (0x10 << UNIT(current_drive));
1870 }
1871 } else if (FDCS->dor & (0x10 << UNIT(current_drive)))
1872 mask &= ~(0x10 << UNIT(current_drive));
1873
1874 /* starts motor and selects floppy */
1875 del_timer(motor_off_timer + current_drive);
1876 set_dor(fdc, mask, data);
1877
1878 /* wait_for_completion also schedules reset if needed. */
1879 return fd_wait_for_completion(DRS->select_date + DP->select_delay,
1880 function);
1881 }
1882
1883 static void floppy_ready(void)
1884 {
1885 if (FDCS->reset) {
1886 reset_fdc();
1887 return;
1888 }
1889 if (start_motor(floppy_ready))
1890 return;
1891 if (fdc_dtr())
1892 return;
1893
1894 debug_dcl(DP->flags, "calling disk change from floppy_ready\n");
1895 if (!(raw_cmd->flags & FD_RAW_NO_MOTOR) &&
1896 disk_change(current_drive) && !DP->select_delay)
1897 twaddle(); /* this clears the dcl on certain
1898 * drive/controller combinations */
1899
1900 #ifdef fd_chose_dma_mode
1901 if ((raw_cmd->flags & FD_RAW_READ) || (raw_cmd->flags & FD_RAW_WRITE)) {
1902 unsigned long flags = claim_dma_lock();
1903 fd_chose_dma_mode(raw_cmd->kernel_data, raw_cmd->length);
1904 release_dma_lock(flags);
1905 }
1906 #endif
1907
1908 if (raw_cmd->flags & (FD_RAW_NEED_SEEK | FD_RAW_NEED_DISK)) {
1909 perpendicular_mode();
1910 fdc_specify(); /* must be done here because of hut, hlt ... */
1911 seek_floppy();
1912 } else {
1913 if ((raw_cmd->flags & FD_RAW_READ) ||
1914 (raw_cmd->flags & FD_RAW_WRITE))
1915 fdc_specify();
1916 setup_rw_floppy();
1917 }
1918 }
1919
1920 static void floppy_start(void)
1921 {
1922 reschedule_timeout(current_reqD, "floppy start");
1923
1924 scandrives();
1925 debug_dcl(DP->flags, "setting NEWCHANGE in floppy_start\n");
1926 set_bit(FD_DISK_NEWCHANGE_BIT, &DRS->flags);
1927 floppy_ready();
1928 }
1929
1930 /*
1931 * ========================================================================
1932 * here ends the bottom half. Exported routines are:
1933 * floppy_start, floppy_off, floppy_ready, lock_fdc, unlock_fdc, set_fdc,
1934 * start_motor, reset_fdc, reset_fdc_info, interpret_errors.
1935 * Initialization also uses output_byte, result, set_dor, floppy_interrupt
1936 * and set_dor.
1937 * ========================================================================
1938 */
1939 /*
1940 * General purpose continuations.
1941 * ==============================
1942 */
1943
1944 static void do_wakeup(void)
1945 {
1946 reschedule_timeout(MAXTIMEOUT, "do wakeup");
1947 cont = NULL;
1948 command_status += 2;
1949 wake_up(&command_done);
1950 }
1951
1952 static const struct cont_t wakeup_cont = {
1953 .interrupt = empty,
1954 .redo = do_wakeup,
1955 .error = empty,
1956 .done = (done_f)empty
1957 };
1958
1959 static const struct cont_t intr_cont = {
1960 .interrupt = empty,
1961 .redo = process_fd_request,
1962 .error = empty,
1963 .done = (done_f)empty
1964 };
1965
1966 static int wait_til_done(void (*handler)(void), bool interruptible)
1967 {
1968 int ret;
1969
1970 schedule_bh(handler);
1971
1972 if (interruptible)
1973 wait_event_interruptible(command_done, command_status >= 2);
1974 else
1975 wait_event(command_done, command_status >= 2);
1976
1977 if (command_status < 2) {
1978 cancel_activity();
1979 cont = &intr_cont;
1980 reset_fdc();
1981 return -EINTR;
1982 }
1983
1984 if (FDCS->reset)
1985 command_status = FD_COMMAND_ERROR;
1986 if (command_status == FD_COMMAND_OKAY)
1987 ret = 0;
1988 else
1989 ret = -EIO;
1990 command_status = FD_COMMAND_NONE;
1991 return ret;
1992 }
1993
1994 static void generic_done(int result)
1995 {
1996 command_status = result;
1997 cont = &wakeup_cont;
1998 }
1999
2000 static void generic_success(void)
2001 {
2002 cont->done(1);
2003 }
2004
2005 static void generic_failure(void)
2006 {
2007 cont->done(0);
2008 }
2009
2010 static void success_and_wakeup(void)
2011 {
2012 generic_success();
2013 cont->redo();
2014 }
2015
2016 /*
2017 * formatting and rw support.
2018 * ==========================
2019 */
2020
2021 static int next_valid_format(void)
2022 {
2023 int probed_format;
2024
2025 probed_format = DRS->probed_format;
2026 while (1) {
2027 if (probed_format >= 8 || !DP->autodetect[probed_format]) {
2028 DRS->probed_format = 0;
2029 return 1;
2030 }
2031 if (floppy_type[DP->autodetect[probed_format]].sect) {
2032 DRS->probed_format = probed_format;
2033 return 0;
2034 }
2035 probed_format++;
2036 }
2037 }
2038
2039 static void bad_flp_intr(void)
2040 {
2041 int err_count;
2042
2043 if (probing) {
2044 DRS->probed_format++;
2045 if (!next_valid_format())
2046 return;
2047 }
2048 err_count = ++(*errors);
2049 INFBOUND(DRWE->badness, err_count);
2050 if (err_count > DP->max_errors.abort)
2051 cont->done(0);
2052 if (err_count > DP->max_errors.reset)
2053 FDCS->reset = 1;
2054 else if (err_count > DP->max_errors.recal)
2055 DRS->track = NEED_2_RECAL;
2056 }
2057
2058 static void set_floppy(int drive)
2059 {
2060 int type = ITYPE(UDRS->fd_device);
2061
2062 if (type)
2063 _floppy = floppy_type + type;
2064 else
2065 _floppy = current_type[drive];
2066 }
2067
2068 /*
2069 * formatting support.
2070 * ===================
2071 */
2072 static void format_interrupt(void)
2073 {
2074 switch (interpret_errors()) {
2075 case 1:
2076 cont->error();
2077 case 2:
2078 break;
2079 case 0:
2080 cont->done(1);
2081 }
2082 cont->redo();
2083 }
2084
2085 #define FM_MODE(x, y) ((y) & ~(((x)->rate & 0x80) >> 1))
2086 #define CT(x) ((x) | 0xc0)
2087
2088 static void setup_format_params(int track)
2089 {
2090 int n;
2091 int il;
2092 int count;
2093 int head_shift;
2094 int track_shift;
2095 struct fparm {
2096 unsigned char track, head, sect, size;
2097 } *here = (struct fparm *)floppy_track_buffer;
2098
2099 raw_cmd = &default_raw_cmd;
2100 raw_cmd->track = track;
2101
2102 raw_cmd->flags = (FD_RAW_WRITE | FD_RAW_INTR | FD_RAW_SPIN |
2103 FD_RAW_NEED_DISK | FD_RAW_NEED_SEEK);
2104 raw_cmd->rate = _floppy->rate & 0x43;
2105 raw_cmd->cmd_count = NR_F;
2106 COMMAND = FM_MODE(_floppy, FD_FORMAT);
2107 DR_SELECT = UNIT(current_drive) + PH_HEAD(_floppy, format_req.head);
2108 F_SIZECODE = FD_SIZECODE(_floppy);
2109 F_SECT_PER_TRACK = _floppy->sect << 2 >> F_SIZECODE;
2110 F_GAP = _floppy->fmt_gap;
2111 F_FILL = FD_FILL_BYTE;
2112
2113 raw_cmd->kernel_data = floppy_track_buffer;
2114 raw_cmd->length = 4 * F_SECT_PER_TRACK;
2115
2116 /* allow for about 30ms for data transport per track */
2117 head_shift = (F_SECT_PER_TRACK + 5) / 6;
2118
2119 /* a ``cylinder'' is two tracks plus a little stepping time */
2120 track_shift = 2 * head_shift + 3;
2121
2122 /* position of logical sector 1 on this track */
2123 n = (track_shift * format_req.track + head_shift * format_req.head)
2124 % F_SECT_PER_TRACK;
2125
2126 /* determine interleave */
2127 il = 1;
2128 if (_floppy->fmt_gap < 0x22)
2129 il++;
2130
2131 /* initialize field */
2132 for (count = 0; count < F_SECT_PER_TRACK; ++count) {
2133 here[count].track = format_req.track;
2134 here[count].head = format_req.head;
2135 here[count].sect = 0;
2136 here[count].size = F_SIZECODE;
2137 }
2138 /* place logical sectors */
2139 for (count = 1; count <= F_SECT_PER_TRACK; ++count) {
2140 here[n].sect = count;
2141 n = (n + il) % F_SECT_PER_TRACK;
2142 if (here[n].sect) { /* sector busy, find next free sector */
2143 ++n;
2144 if (n >= F_SECT_PER_TRACK) {
2145 n -= F_SECT_PER_TRACK;
2146 while (here[n].sect)
2147 ++n;
2148 }
2149 }
2150 }
2151 if (_floppy->stretch & FD_SECTBASEMASK) {
2152 for (count = 0; count < F_SECT_PER_TRACK; count++)
2153 here[count].sect += FD_SECTBASE(_floppy) - 1;
2154 }
2155 }
2156
2157 static void redo_format(void)
2158 {
2159 buffer_track = -1;
2160 setup_format_params(format_req.track << STRETCH(_floppy));
2161 floppy_start();
2162 debugt(__func__, "queue format request");
2163 }
2164
2165 static const struct cont_t format_cont = {
2166 .interrupt = format_interrupt,
2167 .redo = redo_format,
2168 .error = bad_flp_intr,
2169 .done = generic_done
2170 };
2171
2172 static int do_format(int drive, struct format_descr *tmp_format_req)
2173 {
2174 int ret;
2175
2176 if (lock_fdc(drive))
2177 return -EINTR;
2178
2179 set_floppy(drive);
2180 if (!_floppy ||
2181 _floppy->track > DP->tracks ||
2182 tmp_format_req->track >= _floppy->track ||
2183 tmp_format_req->head >= _floppy->head ||
2184 (_floppy->sect << 2) % (1 << FD_SIZECODE(_floppy)) ||
2185 !_floppy->fmt_gap) {
2186 process_fd_request();
2187 return -EINVAL;
2188 }
2189 format_req = *tmp_format_req;
2190 format_errors = 0;
2191 cont = &format_cont;
2192 errors = &format_errors;
2193 ret = wait_til_done(redo_format, true);
2194 if (ret == -EINTR)
2195 return -EINTR;
2196 process_fd_request();
2197 return ret;
2198 }
2199
2200 /*
2201 * Buffer read/write and support
2202 * =============================
2203 */
2204
2205 static void floppy_end_request(struct request *req, int error)
2206 {
2207 unsigned int nr_sectors = current_count_sectors;
2208 unsigned int drive = (unsigned long)req->rq_disk->private_data;
2209
2210 /* current_count_sectors can be zero if transfer failed */
2211 if (error)
2212 nr_sectors = blk_rq_cur_sectors(req);
2213 if (__blk_end_request(req, error, nr_sectors << 9))
2214 return;
2215
2216 /* We're done with the request */
2217 floppy_off(drive);
2218 current_req = NULL;
2219 }
2220
2221 /* new request_done. Can handle physical sectors which are smaller than a
2222 * logical buffer */
2223 static void request_done(int uptodate)
2224 {
2225 struct request *req = current_req;
2226 struct request_queue *q;
2227 unsigned long flags;
2228 int block;
2229 char msg[sizeof("request done ") + sizeof(int) * 3];
2230
2231 probing = 0;
2232 snprintf(msg, sizeof(msg), "request done %d", uptodate);
2233 reschedule_timeout(MAXTIMEOUT, msg);
2234
2235 if (!req) {
2236 pr_info("floppy.c: no request in request_done\n");
2237 return;
2238 }
2239
2240 q = req->q;
2241
2242 if (uptodate) {
2243 /* maintain values for invalidation on geometry
2244 * change */
2245 block = current_count_sectors + blk_rq_pos(req);
2246 INFBOUND(DRS->maxblock, block);
2247 if (block > _floppy->sect)
2248 DRS->maxtrack = 1;
2249
2250 /* unlock chained buffers */
2251 spin_lock_irqsave(q->queue_lock, flags);
2252 floppy_end_request(req, 0);
2253 spin_unlock_irqrestore(q->queue_lock, flags);
2254 } else {
2255 if (rq_data_dir(req) == WRITE) {
2256 /* record write error information */
2257 DRWE->write_errors++;
2258 if (DRWE->write_errors == 1) {
2259 DRWE->first_error_sector = blk_rq_pos(req);
2260 DRWE->first_error_generation = DRS->generation;
2261 }
2262 DRWE->last_error_sector = blk_rq_pos(req);
2263 DRWE->last_error_generation = DRS->generation;
2264 }
2265 spin_lock_irqsave(q->queue_lock, flags);
2266 floppy_end_request(req, -EIO);
2267 spin_unlock_irqrestore(q->queue_lock, flags);
2268 }
2269 }
2270
2271 /* Interrupt handler evaluating the result of the r/w operation */
2272 static void rw_interrupt(void)
2273 {
2274 int eoc;
2275 int ssize;
2276 int heads;
2277 int nr_sectors;
2278
2279 if (R_HEAD >= 2) {
2280 /* some Toshiba floppy controllers occasionnally seem to
2281 * return bogus interrupts after read/write operations, which
2282 * can be recognized by a bad head number (>= 2) */
2283 return;
2284 }
2285
2286 if (!DRS->first_read_date)
2287 DRS->first_read_date = jiffies;
2288
2289 nr_sectors = 0;
2290 ssize = DIV_ROUND_UP(1 << SIZECODE, 4);
2291
2292 if (ST1 & ST1_EOC)
2293 eoc = 1;
2294 else
2295 eoc = 0;
2296
2297 if (COMMAND & 0x80)
2298 heads = 2;
2299 else
2300 heads = 1;
2301
2302 nr_sectors = (((R_TRACK - TRACK) * heads +
2303 R_HEAD - HEAD) * SECT_PER_TRACK +
2304 R_SECTOR - SECTOR + eoc) << SIZECODE >> 2;
2305
2306 if (nr_sectors / ssize >
2307 DIV_ROUND_UP(in_sector_offset + current_count_sectors, ssize)) {
2308 DPRINT("long rw: %x instead of %lx\n",
2309 nr_sectors, current_count_sectors);
2310 pr_info("rs=%d s=%d\n", R_SECTOR, SECTOR);
2311 pr_info("rh=%d h=%d\n", R_HEAD, HEAD);
2312 pr_info("rt=%d t=%d\n", R_TRACK, TRACK);
2313 pr_info("heads=%d eoc=%d\n", heads, eoc);
2314 pr_info("spt=%d st=%d ss=%d\n",
2315 SECT_PER_TRACK, fsector_t, ssize);
2316 pr_info("in_sector_offset=%d\n", in_sector_offset);
2317 }
2318
2319 nr_sectors -= in_sector_offset;
2320 INFBOUND(nr_sectors, 0);
2321 SUPBOUND(current_count_sectors, nr_sectors);
2322
2323 switch (interpret_errors()) {
2324 case 2:
2325 cont->redo();
2326 return;
2327 case 1:
2328 if (!current_count_sectors) {
2329 cont->error();
2330 cont->redo();
2331 return;
2332 }
2333 break;
2334 case 0:
2335 if (!current_count_sectors) {
2336 cont->redo();
2337 return;
2338 }
2339 current_type[current_drive] = _floppy;
2340 floppy_sizes[TOMINOR(current_drive)] = _floppy->size;
2341 break;
2342 }
2343
2344 if (probing) {
2345 if (DP->flags & FTD_MSG)
2346 DPRINT("Auto-detected floppy type %s in fd%d\n",
2347 _floppy->name, current_drive);
2348 current_type[current_drive] = _floppy;
2349 floppy_sizes[TOMINOR(current_drive)] = _floppy->size;
2350 probing = 0;
2351 }
2352
2353 if (CT(COMMAND) != FD_READ ||
2354 raw_cmd->kernel_data == bio_data(current_req->bio)) {
2355 /* transfer directly from buffer */
2356 cont->done(1);
2357 } else if (CT(COMMAND) == FD_READ) {
2358 buffer_track = raw_cmd->track;
2359 buffer_drive = current_drive;
2360 INFBOUND(buffer_max, nr_sectors + fsector_t);
2361 }
2362 cont->redo();
2363 }
2364
2365 /* Compute maximal contiguous buffer size. */
2366 static int buffer_chain_size(void)
2367 {
2368 struct bio_vec bv;
2369 int size;
2370 struct req_iterator iter;
2371 char *base;
2372
2373 base = bio_data(current_req->bio);
2374 size = 0;
2375
2376 rq_for_each_segment(bv, current_req, iter) {
2377 if (page_address(bv.bv_page) + bv.bv_offset != base + size)
2378 break;
2379
2380 size += bv.bv_len;
2381 }
2382
2383 return size >> 9;
2384 }
2385
2386 /* Compute the maximal transfer size */
2387 static int transfer_size(int ssize, int max_sector, int max_size)
2388 {
2389 SUPBOUND(max_sector, fsector_t + max_size);
2390
2391 /* alignment */
2392 max_sector -= (max_sector % _floppy->sect) % ssize;
2393
2394 /* transfer size, beginning not aligned */
2395 current_count_sectors = max_sector - fsector_t;
2396
2397 return max_sector;
2398 }
2399
2400 /*
2401 * Move data from/to the track buffer to/from the buffer cache.
2402 */
2403 static void copy_buffer(int ssize, int max_sector, int max_sector_2)
2404 {
2405 int remaining; /* number of transferred 512-byte sectors */
2406 struct bio_vec bv;
2407 char *buffer;
2408 char *dma_buffer;
2409 int size;
2410 struct req_iterator iter;
2411
2412 max_sector = transfer_size(ssize,
2413 min(max_sector, max_sector_2),
2414 blk_rq_sectors(current_req));
2415
2416 if (current_count_sectors <= 0 && CT(COMMAND) == FD_WRITE &&
2417 buffer_max > fsector_t + blk_rq_sectors(current_req))
2418 current_count_sectors = min_t(int, buffer_max - fsector_t,
2419 blk_rq_sectors(current_req));
2420
2421 remaining = current_count_sectors << 9;
2422 if (remaining > blk_rq_bytes(current_req) && CT(COMMAND) == FD_WRITE) {
2423 DPRINT("in copy buffer\n");
2424 pr_info("current_count_sectors=%ld\n", current_count_sectors);
2425 pr_info("remaining=%d\n", remaining >> 9);
2426 pr_info("current_req->nr_sectors=%u\n",
2427 blk_rq_sectors(current_req));
2428 pr_info("current_req->current_nr_sectors=%u\n",
2429 blk_rq_cur_sectors(current_req));
2430 pr_info("max_sector=%d\n", max_sector);
2431 pr_info("ssize=%d\n", ssize);
2432 }
2433
2434 buffer_max = max(max_sector, buffer_max);
2435
2436 dma_buffer = floppy_track_buffer + ((fsector_t - buffer_min) << 9);
2437
2438 size = blk_rq_cur_bytes(current_req);
2439
2440 rq_for_each_segment(bv, current_req, iter) {
2441 if (!remaining)
2442 break;
2443
2444 size = bv.bv_len;
2445 SUPBOUND(size, remaining);
2446
2447 buffer = page_address(bv.bv_page) + bv.bv_offset;
2448 if (dma_buffer + size >
2449 floppy_track_buffer + (max_buffer_sectors << 10) ||
2450 dma_buffer < floppy_track_buffer) {
2451 DPRINT("buffer overrun in copy buffer %d\n",
2452 (int)((floppy_track_buffer - dma_buffer) >> 9));
2453 pr_info("fsector_t=%d buffer_min=%d\n",
2454 fsector_t, buffer_min);
2455 pr_info("current_count_sectors=%ld\n",
2456 current_count_sectors);
2457 if (CT(COMMAND) == FD_READ)
2458 pr_info("read\n");
2459 if (CT(COMMAND) == FD_WRITE)
2460 pr_info("write\n");
2461 break;
2462 }
2463 if (((unsigned long)buffer) % 512)
2464 DPRINT("%p buffer not aligned\n", buffer);
2465
2466 if (CT(COMMAND) == FD_READ)
2467 memcpy(buffer, dma_buffer, size);
2468 else
2469 memcpy(dma_buffer, buffer, size);
2470
2471 remaining -= size;
2472 dma_buffer += size;
2473 }
2474 if (remaining) {
2475 if (remaining > 0)
2476 max_sector -= remaining >> 9;
2477 DPRINT("weirdness: remaining %d\n", remaining >> 9);
2478 }
2479 }
2480
2481 /* work around a bug in pseudo DMA
2482 * (on some FDCs) pseudo DMA does not stop when the CPU stops
2483 * sending data. Hence we need a different way to signal the
2484 * transfer length: We use SECT_PER_TRACK. Unfortunately, this
2485 * does not work with MT, hence we can only transfer one head at
2486 * a time
2487 */
2488 static void virtualdmabug_workaround(void)
2489 {
2490 int hard_sectors;
2491 int end_sector;
2492
2493 if (CT(COMMAND) == FD_WRITE) {
2494 COMMAND &= ~0x80; /* switch off multiple track mode */
2495
2496 hard_sectors = raw_cmd->length >> (7 + SIZECODE);
2497 end_sector = SECTOR + hard_sectors - 1;
2498 if (end_sector > SECT_PER_TRACK) {
2499 pr_info("too many sectors %d > %d\n",
2500 end_sector, SECT_PER_TRACK);
2501 return;
2502 }
2503 SECT_PER_TRACK = end_sector;
2504 /* make sure SECT_PER_TRACK
2505 * points to end of transfer */
2506 }
2507 }
2508
2509 /*
2510 * Formulate a read/write request.
2511 * this routine decides where to load the data (directly to buffer, or to
2512 * tmp floppy area), how much data to load (the size of the buffer, the whole
2513 * track, or a single sector)
2514 * All floppy_track_buffer handling goes in here. If we ever add track buffer
2515 * allocation on the fly, it should be done here. No other part should need
2516 * modification.
2517 */
2518
2519 static int make_raw_rw_request(void)
2520 {
2521 int aligned_sector_t;
2522 int max_sector;
2523 int max_size;
2524 int tracksize;
2525 int ssize;
2526
2527 if (WARN(max_buffer_sectors == 0, "VFS: Block I/O scheduled on unopened device\n"))
2528 return 0;
2529
2530 set_fdc((long)current_req->rq_disk->private_data);
2531
2532 raw_cmd = &default_raw_cmd;
2533 raw_cmd->flags = FD_RAW_SPIN | FD_RAW_NEED_DISK | FD_RAW_NEED_SEEK;
2534 raw_cmd->cmd_count = NR_RW;
2535 if (rq_data_dir(current_req) == READ) {
2536 raw_cmd->flags |= FD_RAW_READ;
2537 COMMAND = FM_MODE(_floppy, FD_READ);
2538 } else if (rq_data_dir(current_req) == WRITE) {
2539 raw_cmd->flags |= FD_RAW_WRITE;
2540 COMMAND = FM_MODE(_floppy, FD_WRITE);
2541 } else {
2542 DPRINT("%s: unknown command\n", __func__);
2543 return 0;
2544 }
2545
2546 max_sector = _floppy->sect * _floppy->head;
2547
2548 TRACK = (int)blk_rq_pos(current_req) / max_sector;
2549 fsector_t = (int)blk_rq_pos(current_req) % max_sector;
2550 if (_floppy->track && TRACK >= _floppy->track) {
2551 if (blk_rq_cur_sectors(current_req) & 1) {
2552 current_count_sectors = 1;
2553 return 1;
2554 } else
2555 return 0;
2556 }
2557 HEAD = fsector_t / _floppy->sect;
2558
2559 if (((_floppy->stretch & (FD_SWAPSIDES | FD_SECTBASEMASK)) ||
2560 test_bit(FD_NEED_TWADDLE_BIT, &DRS->flags)) &&
2561 fsector_t < _floppy->sect)
2562 max_sector = _floppy->sect;
2563
2564 /* 2M disks have phantom sectors on the first track */
2565 if ((_floppy->rate & FD_2M) && (!TRACK) && (!HEAD)) {
2566 max_sector = 2 * _floppy->sect / 3;
2567 if (fsector_t >= max_sector) {
2568 current_count_sectors =
2569 min_t(int, _floppy->sect - fsector_t,
2570 blk_rq_sectors(current_req));
2571 return 1;
2572 }
2573 SIZECODE = 2;
2574 } else
2575 SIZECODE = FD_SIZECODE(_floppy);
2576 raw_cmd->rate = _floppy->rate & 0x43;
2577 if ((_floppy->rate & FD_2M) && (TRACK || HEAD) && raw_cmd->rate == 2)
2578 raw_cmd->rate = 1;
2579
2580 if (SIZECODE)
2581 SIZECODE2 = 0xff;
2582 else
2583 SIZECODE2 = 0x80;
2584 raw_cmd->track = TRACK << STRETCH(_floppy);
2585 DR_SELECT = UNIT(current_drive) + PH_HEAD(_floppy, HEAD);
2586 GAP = _floppy->gap;
2587 ssize = DIV_ROUND_UP(1 << SIZECODE, 4);
2588 SECT_PER_TRACK = _floppy->sect << 2 >> SIZECODE;
2589 SECTOR = ((fsector_t % _floppy->sect) << 2 >> SIZECODE) +
2590 FD_SECTBASE(_floppy);
2591
2592 /* tracksize describes the size which can be filled up with sectors
2593 * of size ssize.
2594 */
2595 tracksize = _floppy->sect - _floppy->sect % ssize;
2596 if (tracksize < _floppy->sect) {
2597 SECT_PER_TRACK++;
2598 if (tracksize <= fsector_t % _floppy->sect)
2599 SECTOR--;
2600
2601 /* if we are beyond tracksize, fill up using smaller sectors */
2602 while (tracksize <= fsector_t % _floppy->sect) {
2603 while (tracksize + ssize > _floppy->sect) {
2604 SIZECODE--;
2605 ssize >>= 1;
2606 }
2607 SECTOR++;
2608 SECT_PER_TRACK++;
2609 tracksize += ssize;
2610 }
2611 max_sector = HEAD * _floppy->sect + tracksize;
2612 } else if (!TRACK && !HEAD && !(_floppy->rate & FD_2M) && probing) {
2613 max_sector = _floppy->sect;
2614 } else if (!HEAD && CT(COMMAND) == FD_WRITE) {
2615 /* for virtual DMA bug workaround */
2616 max_sector = _floppy->sect;
2617 }
2618
2619 in_sector_offset = (fsector_t % _floppy->sect) % ssize;
2620 aligned_sector_t = fsector_t - in_sector_offset;
2621 max_size = blk_rq_sectors(current_req);
2622 if ((raw_cmd->track == buffer_track) &&
2623 (current_drive == buffer_drive) &&
2624 (fsector_t >= buffer_min) && (fsector_t < buffer_max)) {
2625 /* data already in track buffer */
2626 if (CT(COMMAND) == FD_READ) {
2627 copy_buffer(1, max_sector, buffer_max);
2628 return 1;
2629 }
2630 } else if (in_sector_offset || blk_rq_sectors(current_req) < ssize) {
2631 if (CT(COMMAND) == FD_WRITE) {
2632 unsigned int sectors;
2633
2634 sectors = fsector_t + blk_rq_sectors(current_req);
2635 if (sectors > ssize && sectors < ssize + ssize)
2636 max_size = ssize + ssize;
2637 else
2638 max_size = ssize;
2639 }
2640 raw_cmd->flags &= ~FD_RAW_WRITE;
2641 raw_cmd->flags |= FD_RAW_READ;
2642 COMMAND = FM_MODE(_floppy, FD_READ);
2643 } else if ((unsigned long)bio_data(current_req->bio) < MAX_DMA_ADDRESS) {
2644 unsigned long dma_limit;
2645 int direct, indirect;
2646
2647 indirect =
2648 transfer_size(ssize, max_sector,
2649 max_buffer_sectors * 2) - fsector_t;
2650
2651 /*
2652 * Do NOT use minimum() here---MAX_DMA_ADDRESS is 64 bits wide
2653 * on a 64 bit machine!
2654 */
2655 max_size = buffer_chain_size();
2656 dma_limit = (MAX_DMA_ADDRESS -
2657 ((unsigned long)bio_data(current_req->bio))) >> 9;
2658 if ((unsigned long)max_size > dma_limit)
2659 max_size = dma_limit;
2660 /* 64 kb boundaries */
2661 if (CROSS_64KB(bio_data(current_req->bio), max_size << 9))
2662 max_size = (K_64 -
2663 ((unsigned long)bio_data(current_req->bio)) %
2664 K_64) >> 9;
2665 direct = transfer_size(ssize, max_sector, max_size) - fsector_t;
2666 /*
2667 * We try to read tracks, but if we get too many errors, we
2668 * go back to reading just one sector at a time.
2669 *
2670 * This means we should be able to read a sector even if there
2671 * are other bad sectors on this track.
2672 */
2673 if (!direct ||
2674 (indirect * 2 > direct * 3 &&
2675 *errors < DP->max_errors.read_track &&
2676 ((!probing ||
2677 (DP->read_track & (1 << DRS->probed_format)))))) {
2678 max_size = blk_rq_sectors(current_req);
2679 } else {
2680 raw_cmd->kernel_data = bio_data(current_req->bio);
2681 raw_cmd->length = current_count_sectors << 9;
2682 if (raw_cmd->length == 0) {
2683 DPRINT("%s: zero dma transfer attempted\n", __func__);
2684 DPRINT("indirect=%d direct=%d fsector_t=%d\n",
2685 indirect, direct, fsector_t);
2686 return 0;
2687 }
2688 virtualdmabug_workaround();
2689 return 2;
2690 }
2691 }
2692
2693 if (CT(COMMAND) == FD_READ)
2694 max_size = max_sector; /* unbounded */
2695
2696 /* claim buffer track if needed */
2697 if (buffer_track != raw_cmd->track || /* bad track */
2698 buffer_drive != current_drive || /* bad drive */
2699 fsector_t > buffer_max ||
2700 fsector_t < buffer_min ||
2701 ((CT(COMMAND) == FD_READ ||
2702 (!in_sector_offset && blk_rq_sectors(current_req) >= ssize)) &&
2703 max_sector > 2 * max_buffer_sectors + buffer_min &&
2704 max_size + fsector_t > 2 * max_buffer_sectors + buffer_min)) {
2705 /* not enough space */
2706 buffer_track = -1;
2707 buffer_drive = current_drive;
2708 buffer_max = buffer_min = aligned_sector_t;
2709 }
2710 raw_cmd->kernel_data = floppy_track_buffer +
2711 ((aligned_sector_t - buffer_min) << 9);
2712
2713 if (CT(COMMAND) == FD_WRITE) {
2714 /* copy write buffer to track buffer.
2715 * if we get here, we know that the write
2716 * is either aligned or the data already in the buffer
2717 * (buffer will be overwritten) */
2718 if (in_sector_offset && buffer_track == -1)
2719 DPRINT("internal error offset !=0 on write\n");
2720 buffer_track = raw_cmd->track;
2721 buffer_drive = current_drive;
2722 copy_buffer(ssize, max_sector,
2723 2 * max_buffer_sectors + buffer_min);
2724 } else
2725 transfer_size(ssize, max_sector,
2726 2 * max_buffer_sectors + buffer_min -
2727 aligned_sector_t);
2728
2729 /* round up current_count_sectors to get dma xfer size */
2730 raw_cmd->length = in_sector_offset + current_count_sectors;
2731 raw_cmd->length = ((raw_cmd->length - 1) | (ssize - 1)) + 1;
2732 raw_cmd->length <<= 9;
2733 if ((raw_cmd->length < current_count_sectors << 9) ||
2734 (raw_cmd->kernel_data != bio_data(current_req->bio) &&
2735 CT(COMMAND) == FD_WRITE &&
2736 (aligned_sector_t + (raw_cmd->length >> 9) > buffer_max ||
2737 aligned_sector_t < buffer_min)) ||
2738 raw_cmd->length % (128 << SIZECODE) ||
2739 raw_cmd->length <= 0 || current_count_sectors <= 0) {
2740 DPRINT("fractionary current count b=%lx s=%lx\n",
2741 raw_cmd->length, current_count_sectors);
2742 if (raw_cmd->kernel_data != bio_data(current_req->bio))
2743 pr_info("addr=%d, length=%ld\n",
2744 (int)((raw_cmd->kernel_data -
2745 floppy_track_buffer) >> 9),
2746 current_count_sectors);
2747 pr_info("st=%d ast=%d mse=%d msi=%d\n",
2748 fsector_t, aligned_sector_t, max_sector, max_size);
2749 pr_info("ssize=%x SIZECODE=%d\n", ssize, SIZECODE);
2750 pr_info("command=%x SECTOR=%d HEAD=%d, TRACK=%d\n",
2751 COMMAND, SECTOR, HEAD, TRACK);
2752 pr_info("buffer drive=%d\n", buffer_drive);
2753 pr_info("buffer track=%d\n", buffer_track);
2754 pr_info("buffer_min=%d\n", buffer_min);
2755 pr_info("buffer_max=%d\n", buffer_max);
2756 return 0;
2757 }
2758
2759 if (raw_cmd->kernel_data != bio_data(current_req->bio)) {
2760 if (raw_cmd->kernel_data < floppy_track_buffer ||
2761 current_count_sectors < 0 ||
2762 raw_cmd->length < 0 ||
2763 raw_cmd->kernel_data + raw_cmd->length >
2764 floppy_track_buffer + (max_buffer_sectors << 10)) {
2765 DPRINT("buffer overrun in schedule dma\n");
2766 pr_info("fsector_t=%d buffer_min=%d current_count=%ld\n",
2767 fsector_t, buffer_min, raw_cmd->length >> 9);
2768 pr_info("current_count_sectors=%ld\n",
2769 current_count_sectors);
2770 if (CT(COMMAND) == FD_READ)
2771 pr_info("read\n");
2772 if (CT(COMMAND) == FD_WRITE)
2773 pr_info("write\n");
2774 return 0;
2775 }
2776 } else if (raw_cmd->length > blk_rq_bytes(current_req) ||
2777 current_count_sectors > blk_rq_sectors(current_req)) {
2778 DPRINT("buffer overrun in direct transfer\n");
2779 return 0;
2780 } else if (raw_cmd->length < current_count_sectors << 9) {
2781 DPRINT("more sectors than bytes\n");
2782 pr_info("bytes=%ld\n", raw_cmd->length >> 9);
2783 pr_info("sectors=%ld\n", current_count_sectors);
2784 }
2785 if (raw_cmd->length == 0) {
2786 DPRINT("zero dma transfer attempted from make_raw_request\n");
2787 return 0;
2788 }
2789
2790 virtualdmabug_workaround();
2791 return 2;
2792 }
2793
2794 /*
2795 * Round-robin between our available drives, doing one request from each
2796 */
2797 static int set_next_request(void)
2798 {
2799 struct request_queue *q;
2800 int old_pos = fdc_queue;
2801
2802 do {
2803 q = disks[fdc_queue]->queue;
2804 if (++fdc_queue == N_DRIVE)
2805 fdc_queue = 0;
2806 if (q) {
2807 current_req = blk_fetch_request(q);
2808 if (current_req) {
2809 current_req->error_count = 0;
2810 break;
2811 }
2812 }
2813 } while (fdc_queue != old_pos);
2814
2815 return current_req != NULL;
2816 }
2817
2818 static void redo_fd_request(void)
2819 {
2820 int drive;
2821 int tmp;
2822
2823 lastredo = jiffies;
2824 if (current_drive < N_DRIVE)
2825 floppy_off(current_drive);
2826
2827 do_request:
2828 if (!current_req) {
2829 int pending;
2830
2831 spin_lock_irq(&floppy_lock);
2832 pending = set_next_request();
2833 spin_unlock_irq(&floppy_lock);
2834 if (!pending) {
2835 do_floppy = NULL;
2836 unlock_fdc();
2837 return;
2838 }
2839 }
2840 drive = (long)current_req->rq_disk->private_data;
2841 set_fdc(drive);
2842 reschedule_timeout(current_reqD, "redo fd request");
2843
2844 set_floppy(drive);
2845 raw_cmd = &default_raw_cmd;
2846 raw_cmd->flags = 0;
2847 if (start_motor(redo_fd_request))
2848 return;
2849
2850 disk_change(current_drive);
2851 if (test_bit(current_drive, &fake_change) ||
2852 test_bit(FD_DISK_CHANGED_BIT, &DRS->flags)) {
2853 DPRINT("disk absent or changed during operation\n");
2854 request_done(0);
2855 goto do_request;
2856 }
2857 if (!_floppy) { /* Autodetection */
2858 if (!probing) {
2859 DRS->probed_format = 0;
2860 if (next_valid_format()) {
2861 DPRINT("no autodetectable formats\n");
2862 _floppy = NULL;
2863 request_done(0);
2864 goto do_request;
2865 }
2866 }
2867 probing = 1;
2868 _floppy = floppy_type + DP->autodetect[DRS->probed_format];
2869 } else
2870 probing = 0;
2871 errors = &(current_req->error_count);
2872 tmp = make_raw_rw_request();
2873 if (tmp < 2) {
2874 request_done(tmp);
2875 goto do_request;
2876 }
2877
2878 if (test_bit(FD_NEED_TWADDLE_BIT, &DRS->flags))
2879 twaddle();
2880 schedule_bh(floppy_start);
2881 debugt(__func__, "queue fd request");
2882 return;
2883 }
2884
2885 static const struct cont_t rw_cont = {
2886 .interrupt = rw_interrupt,
2887 .redo = redo_fd_request,
2888 .error = bad_flp_intr,
2889 .done = request_done
2890 };
2891
2892 static void process_fd_request(void)
2893 {
2894 cont = &rw_cont;
2895 schedule_bh(redo_fd_request);
2896 }
2897
2898 static void do_fd_request(struct request_queue *q)
2899 {
2900 if (WARN(max_buffer_sectors == 0,
2901 "VFS: %s called on non-open device\n", __func__))
2902 return;
2903
2904 if (WARN(atomic_read(&usage_count) == 0,
2905 "warning: usage count=0, current_req=%p sect=%ld flags=%llx\n",
2906 current_req, (long)blk_rq_pos(current_req),
2907 (unsigned long long) current_req->cmd_flags))
2908 return;
2909
2910 if (test_and_set_bit(0, &fdc_busy)) {
2911 /* fdc busy, this new request will be treated when the
2912 current one is done */
2913 is_alive(__func__, "old request running");
2914 return;
2915 }
2916 command_status = FD_COMMAND_NONE;
2917 __reschedule_timeout(MAXTIMEOUT, "fd_request");
2918 set_fdc(0);
2919 process_fd_request();
2920 is_alive(__func__, "");
2921 }
2922
2923 static const struct cont_t poll_cont = {
2924 .interrupt = success_and_wakeup,
2925 .redo = floppy_ready,
2926 .error = generic_failure,
2927 .done = generic_done
2928 };
2929
2930 static int poll_drive(bool interruptible, int flag)
2931 {
2932 /* no auto-sense, just clear dcl */
2933 raw_cmd = &default_raw_cmd;
2934 raw_cmd->flags = flag;
2935 raw_cmd->track = 0;
2936 raw_cmd->cmd_count = 0;
2937 cont = &poll_cont;
2938 debug_dcl(DP->flags, "setting NEWCHANGE in poll_drive\n");
2939 set_bit(FD_DISK_NEWCHANGE_BIT, &DRS->flags);
2940
2941 return wait_til_done(floppy_ready, interruptible);
2942 }
2943
2944 /*
2945 * User triggered reset
2946 * ====================
2947 */
2948
2949 static void reset_intr(void)
2950 {
2951 pr_info("weird, reset interrupt called\n");
2952 }
2953
2954 static const struct cont_t reset_cont = {
2955 .interrupt = reset_intr,
2956 .redo = success_and_wakeup,
2957 .error = generic_failure,
2958 .done = generic_done
2959 };
2960
2961 static int user_reset_fdc(int drive, int arg, bool interruptible)
2962 {
2963 int ret;
2964
2965 if (lock_fdc(drive))
2966 return -EINTR;
2967
2968 if (arg == FD_RESET_ALWAYS)
2969 FDCS->reset = 1;
2970 if (FDCS->reset) {
2971 cont = &reset_cont;
2972 ret = wait_til_done(reset_fdc, interruptible);
2973 if (ret == -EINTR)
2974 return -EINTR;
2975 }
2976 process_fd_request();
2977 return 0;
2978 }
2979
2980 /*
2981 * Misc Ioctl's and support
2982 * ========================
2983 */
2984 static inline int fd_copyout(void __user *param, const void *address,
2985 unsigned long size)
2986 {
2987 return copy_to_user(param, address, size) ? -EFAULT : 0;
2988 }
2989
2990 static inline int fd_copyin(void __user *param, void *address,
2991 unsigned long size)
2992 {
2993 return copy_from_user(address, param, size) ? -EFAULT : 0;
2994 }
2995
2996 static const char *drive_name(int type, int drive)
2997 {
2998 struct floppy_struct *floppy;
2999
3000 if (type)
3001 floppy = floppy_type + type;
3002 else {
3003 if (UDP->native_format)
3004 floppy = floppy_type + UDP->native_format;
3005 else
3006 return "(null)";
3007 }
3008 if (floppy->name)
3009 return floppy->name;
3010 else
3011 return "(null)";
3012 }
3013
3014 /* raw commands */
3015 static void raw_cmd_done(int flag)
3016 {
3017 int i;
3018
3019 if (!flag) {
3020 raw_cmd->flags |= FD_RAW_FAILURE;
3021 raw_cmd->flags |= FD_RAW_HARDFAILURE;
3022 } else {
3023 raw_cmd->reply_count = inr;
3024 if (raw_cmd->reply_count > MAX_REPLIES)
3025 raw_cmd->reply_count = 0;
3026 for (i = 0; i < raw_cmd->reply_count; i++)
3027 raw_cmd->reply[i] = reply_buffer[i];
3028
3029 if (raw_cmd->flags & (FD_RAW_READ | FD_RAW_WRITE)) {
3030 unsigned long flags;
3031 flags = claim_dma_lock();
3032 raw_cmd->length = fd_get_dma_residue();
3033 release_dma_lock(flags);
3034 }
3035
3036 if ((raw_cmd->flags & FD_RAW_SOFTFAILURE) &&
3037 (!raw_cmd->reply_count || (raw_cmd->reply[0] & 0xc0)))
3038 raw_cmd->flags |= FD_RAW_FAILURE;
3039
3040 if (disk_change(current_drive))
3041 raw_cmd->flags |= FD_RAW_DISK_CHANGE;
3042 else
3043 raw_cmd->flags &= ~FD_RAW_DISK_CHANGE;
3044 if (raw_cmd->flags & FD_RAW_NO_MOTOR_AFTER)
3045 motor_off_callback(current_drive);
3046
3047 if (raw_cmd->next &&
3048 (!(raw_cmd->flags & FD_RAW_FAILURE) ||
3049 !(raw_cmd->flags & FD_RAW_STOP_IF_FAILURE)) &&
3050 ((raw_cmd->flags & FD_RAW_FAILURE) ||
3051 !(raw_cmd->flags & FD_RAW_STOP_IF_SUCCESS))) {
3052 raw_cmd = raw_cmd->next;
3053 return;
3054 }
3055 }
3056 generic_done(flag);
3057 }
3058
3059 static const struct cont_t raw_cmd_cont = {
3060 .interrupt = success_and_wakeup,
3061 .redo = floppy_start,
3062 .error = generic_failure,
3063 .done = raw_cmd_done
3064 };
3065
3066 static int raw_cmd_copyout(int cmd, void __user *param,
3067 struct floppy_raw_cmd *ptr)
3068 {
3069 int ret;
3070
3071 while (ptr) {
3072 struct floppy_raw_cmd cmd = *ptr;
3073 cmd.next = NULL;
3074 cmd.kernel_data = NULL;
3075 ret = copy_to_user(param, &cmd, sizeof(cmd));
3076 if (ret)
3077 return -EFAULT;
3078 param += sizeof(struct floppy_raw_cmd);
3079 if ((ptr->flags & FD_RAW_READ) && ptr->buffer_length) {
3080 if (ptr->length >= 0 &&
3081 ptr->length <= ptr->buffer_length) {
3082 long length = ptr->buffer_length - ptr->length;
3083 ret = fd_copyout(ptr->data, ptr->kernel_data,
3084 length);
3085 if (ret)
3086 return ret;
3087 }
3088 }
3089 ptr = ptr->next;
3090 }
3091
3092 return 0;
3093 }
3094
3095 static void raw_cmd_free(struct floppy_raw_cmd **ptr)
3096 {
3097 struct floppy_raw_cmd *next;
3098 struct floppy_raw_cmd *this;
3099
3100 this = *ptr;
3101 *ptr = NULL;
3102 while (this) {
3103 if (this->buffer_length) {
3104 fd_dma_mem_free((unsigned long)this->kernel_data,
3105 this->buffer_length);
3106 this->buffer_length = 0;
3107 }
3108 next = this->next;
3109 kfree(this);
3110 this = next;
3111 }
3112 }
3113
3114 static int raw_cmd_copyin(int cmd, void __user *param,
3115 struct floppy_raw_cmd **rcmd)
3116 {
3117 struct floppy_raw_cmd *ptr;
3118 int ret;
3119 int i;
3120
3121 *rcmd = NULL;
3122
3123 loop:
3124 ptr = kmalloc(sizeof(struct floppy_raw_cmd), GFP_KERNEL);
3125 if (!ptr)
3126 return -ENOMEM;
3127 *rcmd = ptr;
3128 ret = copy_from_user(ptr, param, sizeof(*ptr));
3129 ptr->next = NULL;
3130 ptr->buffer_length = 0;
3131 ptr->kernel_data = NULL;
3132 if (ret)
3133 return -EFAULT;
3134 param += sizeof(struct floppy_raw_cmd);
3135 if (ptr->cmd_count > 33)
3136 /* the command may now also take up the space
3137 * initially intended for the reply & the
3138 * reply count. Needed for long 82078 commands
3139 * such as RESTORE, which takes ... 17 command
3140 * bytes. Murphy's law #137: When you reserve
3141 * 16 bytes for a structure, you'll one day
3142 * discover that you really need 17...
3143 */
3144 return -EINVAL;
3145
3146 for (i = 0; i < 16; i++)
3147 ptr->reply[i] = 0;
3148 ptr->resultcode = 0;
3149
3150 if (ptr->flags & (FD_RAW_READ | FD_RAW_WRITE)) {
3151 if (ptr->length <= 0)
3152 return -EINVAL;
3153 ptr->kernel_data = (char *)fd_dma_mem_alloc(ptr->length);
3154 fallback_on_nodma_alloc(&ptr->kernel_data, ptr->length);
3155 if (!ptr->kernel_data)
3156 return -ENOMEM;
3157 ptr->buffer_length = ptr->length;
3158 }
3159 if (ptr->flags & FD_RAW_WRITE) {
3160 ret = fd_copyin(ptr->data, ptr->kernel_data, ptr->length);
3161 if (ret)
3162 return ret;
3163 }
3164
3165 if (ptr->flags & FD_RAW_MORE) {
3166 rcmd = &(ptr->next);
3167 ptr->rate &= 0x43;
3168 goto loop;
3169 }
3170
3171 return 0;
3172 }
3173
3174 static int raw_cmd_ioctl(int cmd, void __user *param)
3175 {
3176 struct floppy_raw_cmd *my_raw_cmd;
3177 int drive;
3178 int ret2;
3179 int ret;
3180
3181 if (FDCS->rawcmd <= 1)
3182 FDCS->rawcmd = 1;
3183 for (drive = 0; drive < N_DRIVE; drive++) {
3184 if (FDC(drive) != fdc)
3185 continue;
3186 if (drive == current_drive) {
3187 if (UDRS->fd_ref > 1) {
3188 FDCS->rawcmd = 2;
3189 break;
3190 }
3191 } else if (UDRS->fd_ref) {
3192 FDCS->rawcmd = 2;
3193 break;
3194 }
3195 }
3196
3197 if (FDCS->reset)
3198 return -EIO;
3199
3200 ret = raw_cmd_copyin(cmd, param, &my_raw_cmd);
3201 if (ret) {
3202 raw_cmd_free(&my_raw_cmd);
3203 return ret;
3204 }
3205
3206 raw_cmd = my_raw_cmd;
3207 cont = &raw_cmd_cont;
3208 ret = wait_til_done(floppy_start, true);
3209 debug_dcl(DP->flags, "calling disk change from raw_cmd ioctl\n");
3210
3211 if (ret != -EINTR && FDCS->reset)
3212 ret = -EIO;
3213
3214 DRS->track = NO_TRACK;
3215
3216 ret2 = raw_cmd_copyout(cmd, param, my_raw_cmd);
3217 if (!ret)
3218 ret = ret2;
3219 raw_cmd_free(&my_raw_cmd);
3220 return ret;
3221 }
3222
3223 static int invalidate_drive(struct block_device *bdev)
3224 {
3225 /* invalidate the buffer track to force a reread */
3226 set_bit((long)bdev->bd_disk->private_data, &fake_change);
3227 process_fd_request();
3228 check_disk_change(bdev);
3229 return 0;
3230 }
3231
3232 static int set_geometry(unsigned int cmd, struct floppy_struct *g,
3233 int drive, int type, struct block_device *bdev)
3234 {
3235 int cnt;
3236
3237 /* sanity checking for parameters. */
3238 if (g->sect <= 0 ||
3239 g->head <= 0 ||
3240 g->track <= 0 || g->track > UDP->tracks >> STRETCH(g) ||
3241 /* check if reserved bits are set */
3242 (g->stretch & ~(FD_STRETCH | FD_SWAPSIDES | FD_SECTBASEMASK)) != 0)
3243 return -EINVAL;
3244 if (type) {
3245 if (!capable(CAP_SYS_ADMIN))
3246 return -EPERM;
3247 mutex_lock(&open_lock);
3248 if (lock_fdc(drive)) {
3249 mutex_unlock(&open_lock);
3250 return -EINTR;
3251 }
3252 floppy_type[type] = *g;
3253 floppy_type[type].name = "user format";
3254 for (cnt = type << 2; cnt < (type << 2) + 4; cnt++)
3255 floppy_sizes[cnt] = floppy_sizes[cnt + 0x80] =
3256 floppy_type[type].size + 1;
3257 process_fd_request();
3258 for (cnt = 0; cnt < N_DRIVE; cnt++) {
3259 struct block_device *bdev = opened_bdev[cnt];
3260 if (!bdev || ITYPE(drive_state[cnt].fd_device) != type)
3261 continue;
3262 __invalidate_device(bdev, true);
3263 }
3264 mutex_unlock(&open_lock);
3265 } else {
3266 int oldStretch;
3267
3268 if (lock_fdc(drive))
3269 return -EINTR;
3270 if (cmd != FDDEFPRM) {
3271 /* notice a disk change immediately, else
3272 * we lose our settings immediately*/
3273 if (poll_drive(true, FD_RAW_NEED_DISK) == -EINTR)
3274 return -EINTR;
3275 }
3276 oldStretch = g->stretch;
3277 user_params[drive] = *g;
3278 if (buffer_drive == drive)
3279 SUPBOUND(buffer_max, user_params[drive].sect);
3280 current_type[drive] = &user_params[drive];
3281 floppy_sizes[drive] = user_params[drive].size;
3282 if (cmd == FDDEFPRM)
3283 DRS->keep_data = -1;
3284 else
3285 DRS->keep_data = 1;
3286 /* invalidation. Invalidate only when needed, i.e.
3287 * when there are already sectors in the buffer cache
3288 * whose number will change. This is useful, because
3289 * mtools often changes the geometry of the disk after
3290 * looking at the boot block */
3291 if (DRS->maxblock > user_params[drive].sect ||
3292 DRS->maxtrack ||
3293 ((user_params[drive].sect ^ oldStretch) &
3294 (FD_SWAPSIDES | FD_SECTBASEMASK)))
3295 invalidate_drive(bdev);
3296 else
3297 process_fd_request();
3298 }
3299 return 0;
3300 }
3301
3302 /* handle obsolete ioctl's */
3303 static unsigned int ioctl_table[] = {
3304 FDCLRPRM,
3305 FDSETPRM,
3306 FDDEFPRM,
3307 FDGETPRM,
3308 FDMSGON,
3309 FDMSGOFF,
3310 FDFMTBEG,
3311 FDFMTTRK,
3312 FDFMTEND,
3313 FDSETEMSGTRESH,
3314 FDFLUSH,
3315 FDSETMAXERRS,
3316 FDGETMAXERRS,
3317 FDGETDRVTYP,
3318 FDSETDRVPRM,
3319 FDGETDRVPRM,
3320 FDGETDRVSTAT,
3321 FDPOLLDRVSTAT,
3322 FDRESET,
3323 FDGETFDCSTAT,
3324 FDWERRORCLR,
3325 FDWERRORGET,
3326 FDRAWCMD,
3327 FDEJECT,
3328 FDTWADDLE
3329 };
3330
3331 static int normalize_ioctl(unsigned int *cmd, int *size)
3332 {
3333 int i;
3334
3335 for (i = 0; i < ARRAY_SIZE(ioctl_table); i++) {
3336 if ((*cmd & 0xffff) == (ioctl_table[i] & 0xffff)) {
3337 *size = _IOC_SIZE(*cmd);
3338 *cmd = ioctl_table[i];
3339 if (*size > _IOC_SIZE(*cmd)) {
3340 pr_info("ioctl not yet supported\n");
3341 return -EFAULT;
3342 }
3343 return 0;
3344 }
3345 }
3346 return -EINVAL;
3347 }
3348
3349 static int get_floppy_geometry(int drive, int type, struct floppy_struct **g)
3350 {
3351 if (type)
3352 *g = &floppy_type[type];
3353 else {
3354 if (lock_fdc(drive))
3355 return -EINTR;
3356 if (poll_drive(false, 0) == -EINTR)
3357 return -EINTR;
3358 process_fd_request();
3359 *g = current_type[drive];
3360 }
3361 if (!*g)
3362 return -ENODEV;
3363 return 0;
3364 }
3365
3366 static int fd_getgeo(struct block_device *bdev, struct hd_geometry *geo)
3367 {
3368 int drive = (long)bdev->bd_disk->private_data;
3369 int type = ITYPE(drive_state[drive].fd_device);
3370 struct floppy_struct *g;
3371 int ret;
3372
3373 ret = get_floppy_geometry(drive, type, &g);
3374 if (ret)
3375 return ret;
3376
3377 geo->heads = g->head;
3378 geo->sectors = g->sect;
3379 geo->cylinders = g->track;
3380 return 0;
3381 }
3382
3383 static int fd_locked_ioctl(struct block_device *bdev, fmode_t mode, unsigned int cmd,
3384 unsigned long param)
3385 {
3386 int drive = (long)bdev->bd_disk->private_data;
3387 int type = ITYPE(UDRS->fd_device);
3388 int i;
3389 int ret;
3390 int size;
3391 union inparam {
3392 struct floppy_struct g; /* geometry */
3393 struct format_descr f;
3394 struct floppy_max_errors max_errors;
3395 struct floppy_drive_params dp;
3396 } inparam; /* parameters coming from user space */
3397 const void *outparam; /* parameters passed back to user space */
3398
3399 /* convert compatibility eject ioctls into floppy eject ioctl.
3400 * We do this in order to provide a means to eject floppy disks before
3401 * installing the new fdutils package */
3402 if (cmd == CDROMEJECT || /* CD-ROM eject */
3403 cmd == 0x6470) { /* SunOS floppy eject */
3404 DPRINT("obsolete eject ioctl\n");
3405 DPRINT("please use floppycontrol --eject\n");
3406 cmd = FDEJECT;
3407 }
3408
3409 if (!((cmd & 0xff00) == 0x0200))
3410 return -EINVAL;
3411
3412 /* convert the old style command into a new style command */
3413 ret = normalize_ioctl(&cmd, &size);
3414 if (ret)
3415 return ret;
3416
3417 /* permission checks */
3418 if (((cmd & 0x40) && !(mode & (FMODE_WRITE | FMODE_WRITE_IOCTL))) ||
3419 ((cmd & 0x80) && !capable(CAP_SYS_ADMIN)))
3420 return -EPERM;
3421
3422 if (WARN_ON(size < 0 || size > sizeof(inparam)))
3423 return -EINVAL;
3424
3425 /* copyin */
3426 memset(&inparam, 0, sizeof(inparam));
3427 if (_IOC_DIR(cmd) & _IOC_WRITE) {
3428 ret = fd_copyin((void __user *)param, &inparam, size);
3429 if (ret)
3430 return ret;
3431 }
3432
3433 switch (cmd) {
3434 case FDEJECT:
3435 if (UDRS->fd_ref != 1)
3436 /* somebody else has this drive open */
3437 return -EBUSY;
3438 if (lock_fdc(drive))
3439 return -EINTR;
3440
3441 /* do the actual eject. Fails on
3442 * non-Sparc architectures */
3443 ret = fd_eject(UNIT(drive));
3444
3445 set_bit(FD_DISK_CHANGED_BIT, &UDRS->flags);
3446 set_bit(FD_VERIFY_BIT, &UDRS->flags);
3447 process_fd_request();
3448 return ret;
3449 case FDCLRPRM:
3450 if (lock_fdc(drive))
3451 return -EINTR;
3452 current_type[drive] = NULL;
3453 floppy_sizes[drive] = MAX_DISK_SIZE << 1;
3454 UDRS->keep_data = 0;
3455 return invalidate_drive(bdev);
3456 case FDSETPRM:
3457 case FDDEFPRM:
3458 return set_geometry(cmd, &inparam.g, drive, type, bdev);
3459 case FDGETPRM:
3460 ret = get_floppy_geometry(drive, type,
3461 (struct floppy_struct **)&outparam);
3462 if (ret)
3463 return ret;
3464 break;
3465 case FDMSGON:
3466 UDP->flags |= FTD_MSG;
3467 return 0;
3468 case FDMSGOFF:
3469 UDP->flags &= ~FTD_MSG;
3470 return 0;
3471 case FDFMTBEG:
3472 if (lock_fdc(drive))
3473 return -EINTR;
3474 if (poll_drive(true, FD_RAW_NEED_DISK) == -EINTR)
3475 return -EINTR;
3476 ret = UDRS->flags;
3477 process_fd_request();
3478 if (ret & FD_VERIFY)
3479 return -ENODEV;
3480 if (!(ret & FD_DISK_WRITABLE))
3481 return -EROFS;
3482 return 0;
3483 case FDFMTTRK:
3484 if (UDRS->fd_ref != 1)
3485 return -EBUSY;
3486 return do_format(drive, &inparam.f);
3487 case FDFMTEND:
3488 case FDFLUSH:
3489 if (lock_fdc(drive))
3490 return -EINTR;
3491 return invalidate_drive(bdev);
3492 case FDSETEMSGTRESH:
3493 UDP->max_errors.reporting = (unsigned short)(param & 0x0f);
3494 return 0;
3495 case FDGETMAXERRS:
3496 outparam = &UDP->max_errors;
3497 break;
3498 case FDSETMAXERRS:
3499 UDP->max_errors = inparam.max_errors;
3500 break;
3501 case FDGETDRVTYP:
3502 outparam = drive_name(type, drive);
3503 SUPBOUND(size, strlen((const char *)outparam) + 1);
3504 break;
3505 case FDSETDRVPRM:
3506 *UDP = inparam.dp;
3507 break;
3508 case FDGETDRVPRM:
3509 outparam = UDP;
3510 break;
3511 case FDPOLLDRVSTAT:
3512 if (lock_fdc(drive))
3513 return -EINTR;
3514 if (poll_drive(true, FD_RAW_NEED_DISK) == -EINTR)
3515 return -EINTR;
3516 process_fd_request();
3517 /* fall through */
3518 case FDGETDRVSTAT:
3519 outparam = UDRS;
3520 break;
3521 case FDRESET:
3522 return user_reset_fdc(drive, (int)param, true);
3523 case FDGETFDCSTAT:
3524 outparam = UFDCS;
3525 break;
3526 case FDWERRORCLR:
3527 memset(UDRWE, 0, sizeof(*UDRWE));
3528 return 0;
3529 case FDWERRORGET:
3530 outparam = UDRWE;
3531 break;
3532 case FDRAWCMD:
3533 if (type)
3534 return -EINVAL;
3535 if (lock_fdc(drive))
3536 return -EINTR;
3537 set_floppy(drive);
3538 i = raw_cmd_ioctl(cmd, (void __user *)param);
3539 if (i == -EINTR)
3540 return -EINTR;
3541 process_fd_request();
3542 return i;
3543 case FDTWADDLE:
3544 if (lock_fdc(drive))
3545 return -EINTR;
3546 twaddle();
3547 process_fd_request();
3548 return 0;
3549 default:
3550 return -EINVAL;
3551 }
3552
3553 if (_IOC_DIR(cmd) & _IOC_READ)
3554 return fd_copyout((void __user *)param, outparam, size);
3555
3556 return 0;
3557 }
3558
3559 static int fd_ioctl(struct block_device *bdev, fmode_t mode,
3560 unsigned int cmd, unsigned long param)
3561 {
3562 int ret;
3563
3564 mutex_lock(&floppy_mutex);
3565 ret = fd_locked_ioctl(bdev, mode, cmd, param);
3566 mutex_unlock(&floppy_mutex);
3567
3568 return ret;
3569 }
3570
3571 static void __init config_types(void)
3572 {
3573 bool has_drive = false;
3574 int drive;
3575
3576 /* read drive info out of physical CMOS */
3577 drive = 0;
3578 if (!UDP->cmos)
3579 UDP->cmos = FLOPPY0_TYPE;
3580 drive = 1;
3581 if (!UDP->cmos && FLOPPY1_TYPE)
3582 UDP->cmos = FLOPPY1_TYPE;
3583
3584 /* FIXME: additional physical CMOS drive detection should go here */
3585
3586 for (drive = 0; drive < N_DRIVE; drive++) {
3587 unsigned int type = UDP->cmos;
3588 struct floppy_drive_params *params;
3589 const char *name = NULL;
3590 char temparea[32];
3591
3592 if (type < ARRAY_SIZE(default_drive_params)) {
3593 params = &default_drive_params[type].params;
3594 if (type) {
3595 name = default_drive_params[type].name;
3596 allowed_drive_mask |= 1 << drive;
3597 } else
3598 allowed_drive_mask &= ~(1 << drive);
3599 } else {
3600 params = &default_drive_params[0].params;
3601 snprintf(temparea, sizeof(temparea),
3602 "unknown type %d (usb?)", type);
3603 name = temparea;
3604 }
3605 if (name) {
3606 const char *prepend;
3607 if (!has_drive) {
3608 prepend = "";
3609 has_drive = true;
3610 pr_info("Floppy drive(s):");
3611 } else {
3612 prepend = ",";
3613 }
3614
3615 pr_cont("%s fd%d is %s", prepend, drive, name);
3616 }
3617 *UDP = *params;
3618 }
3619
3620 if (has_drive)
3621 pr_cont("\n");
3622 }
3623
3624 static void floppy_release(struct gendisk *disk, fmode_t mode)
3625 {
3626 int drive = (long)disk->private_data;
3627
3628 mutex_lock(&floppy_mutex);
3629 mutex_lock(&open_lock);
3630 if (!UDRS->fd_ref--) {
3631 DPRINT("floppy_release with fd_ref == 0");
3632 UDRS->fd_ref = 0;
3633 }
3634 if (!UDRS->fd_ref)
3635 opened_bdev[drive] = NULL;
3636 mutex_unlock(&open_lock);
3637 mutex_unlock(&floppy_mutex);
3638 }
3639
3640 /*
3641 * floppy_open check for aliasing (/dev/fd0 can be the same as
3642 * /dev/PS0 etc), and disallows simultaneous access to the same
3643 * drive with different device numbers.
3644 */
3645 static int floppy_open(struct block_device *bdev, fmode_t mode)
3646 {
3647 int drive = (long)bdev->bd_disk->private_data;
3648 int old_dev, new_dev;
3649 int try;
3650 int res = -EBUSY;
3651 char *tmp;
3652
3653 mutex_lock(&floppy_mutex);
3654 mutex_lock(&open_lock);
3655 old_dev = UDRS->fd_device;
3656 if (opened_bdev[drive] && opened_bdev[drive] != bdev)
3657 goto out2;
3658
3659 if (!UDRS->fd_ref && (UDP->flags & FD_BROKEN_DCL)) {
3660 set_bit(FD_DISK_CHANGED_BIT, &UDRS->flags);
3661 set_bit(FD_VERIFY_BIT, &UDRS->flags);
3662 }
3663
3664 UDRS->fd_ref++;
3665
3666 opened_bdev[drive] = bdev;
3667
3668 res = -ENXIO;
3669
3670 if (!floppy_track_buffer) {
3671 /* if opening an ED drive, reserve a big buffer,
3672 * else reserve a small one */
3673 if ((UDP->cmos == 6) || (UDP->cmos == 5))
3674 try = 64; /* Only 48 actually useful */
3675 else
3676 try = 32; /* Only 24 actually useful */
3677
3678 tmp = (char *)fd_dma_mem_alloc(1024 * try);
3679 if (!tmp && !floppy_track_buffer) {
3680 try >>= 1; /* buffer only one side */
3681 INFBOUND(try, 16);
3682 tmp = (char *)fd_dma_mem_alloc(1024 * try);
3683 }
3684 if (!tmp && !floppy_track_buffer)
3685 fallback_on_nodma_alloc(&tmp, 2048 * try);
3686 if (!tmp && !floppy_track_buffer) {
3687 DPRINT("Unable to allocate DMA memory\n");
3688 goto out;
3689 }
3690 if (floppy_track_buffer) {
3691 if (tmp)
3692 fd_dma_mem_free((unsigned long)tmp, try * 1024);
3693 } else {
3694 buffer_min = buffer_max = -1;
3695 floppy_track_buffer = tmp;
3696 max_buffer_sectors = try;
3697 }
3698 }
3699
3700 new_dev = MINOR(bdev->bd_dev);
3701 UDRS->fd_device = new_dev;
3702 set_capacity(disks[drive], floppy_sizes[new_dev]);
3703 if (old_dev != -1 && old_dev != new_dev) {
3704 if (buffer_drive == drive)
3705 buffer_track = -1;
3706 }
3707
3708 if (UFDCS->rawcmd == 1)
3709 UFDCS->rawcmd = 2;
3710
3711 if (!(mode & FMODE_NDELAY)) {
3712 if (mode & (FMODE_READ|FMODE_WRITE)) {
3713 UDRS->last_checked = 0;
3714 clear_bit(FD_OPEN_SHOULD_FAIL_BIT, &UDRS->flags);
3715 check_disk_change(bdev);
3716 if (test_bit(FD_DISK_CHANGED_BIT, &UDRS->flags))
3717 goto out;
3718 if (test_bit(FD_OPEN_SHOULD_FAIL_BIT, &UDRS->flags))
3719 goto out;
3720 }
3721 res = -EROFS;
3722 if ((mode & FMODE_WRITE) &&
3723 !test_bit(FD_DISK_WRITABLE_BIT, &UDRS->flags))
3724 goto out;
3725 }
3726 mutex_unlock(&open_lock);
3727 mutex_unlock(&floppy_mutex);
3728 return 0;
3729 out:
3730 UDRS->fd_ref--;
3731
3732 if (!UDRS->fd_ref)
3733 opened_bdev[drive] = NULL;
3734 out2:
3735 mutex_unlock(&open_lock);
3736 mutex_unlock(&floppy_mutex);
3737 return res;
3738 }
3739
3740 /*
3741 * Check if the disk has been changed or if a change has been faked.
3742 */
3743 static unsigned int floppy_check_events(struct gendisk *disk,
3744 unsigned int clearing)
3745 {
3746 int drive = (long)disk->private_data;
3747
3748 if (test_bit(FD_DISK_CHANGED_BIT, &UDRS->flags) ||
3749 test_bit(FD_VERIFY_BIT, &UDRS->flags))
3750 return DISK_EVENT_MEDIA_CHANGE;
3751
3752 if (time_after(jiffies, UDRS->last_checked + UDP->checkfreq)) {
3753 if (lock_fdc(drive))
3754 return -EINTR;
3755 poll_drive(false, 0);
3756 process_fd_request();
3757 }
3758
3759 if (test_bit(FD_DISK_CHANGED_BIT, &UDRS->flags) ||
3760 test_bit(FD_VERIFY_BIT, &UDRS->flags) ||
3761 test_bit(drive, &fake_change) ||
3762 drive_no_geom(drive))
3763 return DISK_EVENT_MEDIA_CHANGE;
3764 return 0;
3765 }
3766
3767 /*
3768 * This implements "read block 0" for floppy_revalidate().
3769 * Needed for format autodetection, checking whether there is
3770 * a disk in the drive, and whether that disk is writable.
3771 */
3772
3773 struct rb0_cbdata {
3774 int drive;
3775 struct completion complete;
3776 };
3777
3778 static void floppy_rb0_cb(struct bio *bio)
3779 {
3780 struct rb0_cbdata *cbdata = (struct rb0_cbdata *)bio->bi_private;
3781 int drive = cbdata->drive;
3782
3783 if (bio->bi_error) {
3784 pr_info("floppy: error %d while reading block 0\n",
3785 bio->bi_error);
3786 set_bit(FD_OPEN_SHOULD_FAIL_BIT, &UDRS->flags);
3787 }
3788 complete(&cbdata->complete);
3789 }
3790
3791 static int __floppy_read_block_0(struct block_device *bdev, int drive)
3792 {
3793 struct bio bio;
3794 struct bio_vec bio_vec;
3795 struct page *page;
3796 struct rb0_cbdata cbdata;
3797 size_t size;
3798
3799 page = alloc_page(GFP_NOIO);
3800 if (!page) {
3801 process_fd_request();
3802 return -ENOMEM;
3803 }
3804
3805 size = bdev->bd_block_size;
3806 if (!size)
3807 size = 1024;
3808
3809 cbdata.drive = drive;
3810
3811 bio_init(&bio, &bio_vec, 1);
3812 bio.bi_bdev = bdev;
3813 bio_add_page(&bio, page, size, 0);
3814
3815 bio.bi_iter.bi_sector = 0;
3816 bio.bi_flags |= (1 << BIO_QUIET);
3817 bio.bi_private = &cbdata;
3818 bio.bi_end_io = floppy_rb0_cb;
3819 bio_set_op_attrs(&bio, REQ_OP_READ, 0);
3820
3821 submit_bio(&bio);
3822 process_fd_request();
3823
3824 init_completion(&cbdata.complete);
3825 wait_for_completion(&cbdata.complete);
3826
3827 __free_page(page);
3828
3829 return 0;
3830 }
3831
3832 /* revalidate the floppy disk, i.e. trigger format autodetection by reading
3833 * the bootblock (block 0). "Autodetection" is also needed to check whether
3834 * there is a disk in the drive at all... Thus we also do it for fixed
3835 * geometry formats */
3836 static int floppy_revalidate(struct gendisk *disk)
3837 {
3838 int drive = (long)disk->private_data;
3839 int cf;
3840 int res = 0;
3841
3842 if (test_bit(FD_DISK_CHANGED_BIT, &UDRS->flags) ||
3843 test_bit(FD_VERIFY_BIT, &UDRS->flags) ||
3844 test_bit(drive, &fake_change) ||
3845 drive_no_geom(drive)) {
3846 if (WARN(atomic_read(&usage_count) == 0,
3847 "VFS: revalidate called on non-open device.\n"))
3848 return -EFAULT;
3849
3850 res = lock_fdc(drive);
3851 if (res)
3852 return res;
3853 cf = (test_bit(FD_DISK_CHANGED_BIT, &UDRS->flags) ||
3854 test_bit(FD_VERIFY_BIT, &UDRS->flags));
3855 if (!(cf || test_bit(drive, &fake_change) || drive_no_geom(drive))) {
3856 process_fd_request(); /*already done by another thread */
3857 return 0;
3858 }
3859 UDRS->maxblock = 0;
3860 UDRS->maxtrack = 0;
3861 if (buffer_drive == drive)
3862 buffer_track = -1;
3863 clear_bit(drive, &fake_change);
3864 clear_bit(FD_DISK_CHANGED_BIT, &UDRS->flags);
3865 if (cf)
3866 UDRS->generation++;
3867 if (drive_no_geom(drive)) {
3868 /* auto-sensing */
3869 res = __floppy_read_block_0(opened_bdev[drive], drive);
3870 } else {
3871 if (cf)
3872 poll_drive(false, FD_RAW_NEED_DISK);
3873 process_fd_request();
3874 }
3875 }
3876 set_capacity(disk, floppy_sizes[UDRS->fd_device]);
3877 return res;
3878 }
3879
3880 static const struct block_device_operations floppy_fops = {
3881 .owner = THIS_MODULE,
3882 .open = floppy_open,
3883 .release = floppy_release,
3884 .ioctl = fd_ioctl,
3885 .getgeo = fd_getgeo,
3886 .check_events = floppy_check_events,
3887 .revalidate_disk = floppy_revalidate,
3888 };
3889
3890 /*
3891 * Floppy Driver initialization
3892 * =============================
3893 */
3894
3895 /* Determine the floppy disk controller type */
3896 /* This routine was written by David C. Niemi */
3897 static char __init get_fdc_version(void)
3898 {
3899 int r;
3900
3901 output_byte(FD_DUMPREGS); /* 82072 and better know DUMPREGS */
3902 if (FDCS->reset)
3903 return FDC_NONE;
3904 r = result();
3905 if (r <= 0x00)
3906 return FDC_NONE; /* No FDC present ??? */
3907 if ((r == 1) && (reply_buffer[0] == 0x80)) {
3908 pr_info("FDC %d is an 8272A\n", fdc);
3909 return FDC_8272A; /* 8272a/765 don't know DUMPREGS */
3910 }
3911 if (r != 10) {
3912 pr_info("FDC %d init: DUMPREGS: unexpected return of %d bytes.\n",
3913 fdc, r);
3914 return FDC_UNKNOWN;
3915 }
3916
3917 if (!fdc_configure()) {
3918 pr_info("FDC %d is an 82072\n", fdc);
3919 return FDC_82072; /* 82072 doesn't know CONFIGURE */
3920 }
3921
3922 output_byte(FD_PERPENDICULAR);
3923 if (need_more_output() == MORE_OUTPUT) {
3924 output_byte(0);
3925 } else {
3926 pr_info("FDC %d is an 82072A\n", fdc);
3927 return FDC_82072A; /* 82072A as found on Sparcs. */
3928 }
3929
3930 output_byte(FD_UNLOCK);
3931 r = result();
3932 if ((r == 1) && (reply_buffer[0] == 0x80)) {
3933 pr_info("FDC %d is a pre-1991 82077\n", fdc);
3934 return FDC_82077_ORIG; /* Pre-1991 82077, doesn't know
3935 * LOCK/UNLOCK */
3936 }
3937 if ((r != 1) || (reply_buffer[0] != 0x00)) {
3938 pr_info("FDC %d init: UNLOCK: unexpected return of %d bytes.\n",
3939 fdc, r);
3940 return FDC_UNKNOWN;
3941 }
3942 output_byte(FD_PARTID);
3943 r = result();
3944 if (r != 1) {
3945 pr_info("FDC %d init: PARTID: unexpected return of %d bytes.\n",
3946 fdc, r);
3947 return FDC_UNKNOWN;
3948 }
3949 if (reply_buffer[0] == 0x80) {
3950 pr_info("FDC %d is a post-1991 82077\n", fdc);
3951 return FDC_82077; /* Revised 82077AA passes all the tests */
3952 }
3953 switch (reply_buffer[0] >> 5) {
3954 case 0x0:
3955 /* Either a 82078-1 or a 82078SL running at 5Volt */
3956 pr_info("FDC %d is an 82078.\n", fdc);
3957 return FDC_82078;
3958 case 0x1:
3959 pr_info("FDC %d is a 44pin 82078\n", fdc);
3960 return FDC_82078;
3961 case 0x2:
3962 pr_info("FDC %d is a S82078B\n", fdc);
3963 return FDC_S82078B;
3964 case 0x3:
3965 pr_info("FDC %d is a National Semiconductor PC87306\n", fdc);
3966 return FDC_87306;
3967 default:
3968 pr_info("FDC %d init: 82078 variant with unknown PARTID=%d.\n",
3969 fdc, reply_buffer[0] >> 5);
3970 return FDC_82078_UNKN;
3971 }
3972 } /* get_fdc_version */
3973
3974 /* lilo configuration */
3975
3976 static void __init floppy_set_flags(int *ints, int param, int param2)
3977 {
3978 int i;
3979
3980 for (i = 0; i < ARRAY_SIZE(default_drive_params); i++) {
3981 if (param)
3982 default_drive_params[i].params.flags |= param2;
3983 else
3984 default_drive_params[i].params.flags &= ~param2;
3985 }
3986 DPRINT("%s flag 0x%x\n", param2 ? "Setting" : "Clearing", param);
3987 }
3988
3989 static void __init daring(int *ints, int param, int param2)
3990 {
3991 int i;
3992
3993 for (i = 0; i < ARRAY_SIZE(default_drive_params); i++) {
3994 if (param) {
3995 default_drive_params[i].params.select_delay = 0;
3996 default_drive_params[i].params.flags |=
3997 FD_SILENT_DCL_CLEAR;
3998 } else {
3999 default_drive_params[i].params.select_delay =
4000 2 * HZ / 100;
4001 default_drive_params[i].params.flags &=
4002 ~FD_SILENT_DCL_CLEAR;
4003 }
4004 }
4005 DPRINT("Assuming %s floppy hardware\n", param ? "standard" : "broken");
4006 }
4007
4008 static void __init set_cmos(int *ints, int dummy, int dummy2)
4009 {
4010 int current_drive = 0;
4011
4012 if (ints[0] != 2) {
4013 DPRINT("wrong number of parameters for CMOS\n");
4014 return;
4015 }
4016 current_drive = ints[1];
4017 if (current_drive < 0 || current_drive >= 8) {
4018 DPRINT("bad drive for set_cmos\n");
4019 return;
4020 }
4021 #if N_FDC > 1
4022 if (current_drive >= 4 && !FDC2)
4023 FDC2 = 0x370;
4024 #endif
4025 DP->cmos = ints[2];
4026 DPRINT("setting CMOS code to %d\n", ints[2]);
4027 }
4028
4029 static struct param_table {
4030 const char *name;
4031 void (*fn) (int *ints, int param, int param2);
4032 int *var;
4033 int def_param;
4034 int param2;
4035 } config_params[] __initdata = {
4036 {"allowed_drive_mask", NULL, &allowed_drive_mask, 0xff, 0}, /* obsolete */
4037 {"all_drives", NULL, &allowed_drive_mask, 0xff, 0}, /* obsolete */
4038 {"asus_pci", NULL, &allowed_drive_mask, 0x33, 0},
4039 {"irq", NULL, &FLOPPY_IRQ, 6, 0},
4040 {"dma", NULL, &FLOPPY_DMA, 2, 0},
4041 {"daring", daring, NULL, 1, 0},
4042 #if N_FDC > 1
4043 {"two_fdc", NULL, &FDC2, 0x370, 0},
4044 {"one_fdc", NULL, &FDC2, 0, 0},
4045 #endif
4046 {"thinkpad", floppy_set_flags, NULL, 1, FD_INVERTED_DCL},
4047 {"broken_dcl", floppy_set_flags, NULL, 1, FD_BROKEN_DCL},
4048 {"messages", floppy_set_flags, NULL, 1, FTD_MSG},
4049 {"silent_dcl_clear", floppy_set_flags, NULL, 1, FD_SILENT_DCL_CLEAR},
4050 {"debug", floppy_set_flags, NULL, 1, FD_DEBUG},
4051 {"nodma", NULL, &can_use_virtual_dma, 1, 0},
4052 {"omnibook", NULL, &can_use_virtual_dma, 1, 0},
4053 {"yesdma", NULL, &can_use_virtual_dma, 0, 0},
4054 {"fifo_depth", NULL, &fifo_depth, 0xa, 0},
4055 {"nofifo", NULL, &no_fifo, 0x20, 0},
4056 {"usefifo", NULL, &no_fifo, 0, 0},
4057 {"cmos", set_cmos, NULL, 0, 0},
4058 {"slow", NULL, &slow_floppy, 1, 0},
4059 {"unexpected_interrupts", NULL, &print_unex, 1, 0},
4060 {"no_unexpected_interrupts", NULL, &print_unex, 0, 0},
4061 {"L40SX", NULL, &print_unex, 0, 0}
4062
4063 EXTRA_FLOPPY_PARAMS
4064 };
4065
4066 static int __init floppy_setup(char *str)
4067 {
4068 int i;
4069 int param;
4070 int ints[11];
4071
4072 str = get_options(str, ARRAY_SIZE(ints), ints);
4073 if (str) {
4074 for (i = 0; i < ARRAY_SIZE(config_params); i++) {
4075 if (strcmp(str, config_params[i].name) == 0) {
4076 if (ints[0])
4077 param = ints[1];
4078 else
4079 param = config_params[i].def_param;
4080 if (config_params[i].fn)
4081 config_params[i].fn(ints, param,
4082 config_params[i].
4083 param2);
4084 if (config_params[i].var) {
4085 DPRINT("%s=%d\n", str, param);
4086 *config_params[i].var = param;
4087 }
4088 return 1;
4089 }
4090 }
4091 }
4092 if (str) {
4093 DPRINT("unknown floppy option [%s]\n", str);
4094
4095 DPRINT("allowed options are:");
4096 for (i = 0; i < ARRAY_SIZE(config_params); i++)
4097 pr_cont(" %s", config_params[i].name);
4098 pr_cont("\n");
4099 } else
4100 DPRINT("botched floppy option\n");
4101 DPRINT("Read Documentation/blockdev/floppy.txt\n");
4102 return 0;
4103 }
4104
4105 static int have_no_fdc = -ENODEV;
4106
4107 static ssize_t floppy_cmos_show(struct device *dev,
4108 struct device_attribute *attr, char *buf)
4109 {
4110 struct platform_device *p = to_platform_device(dev);
4111 int drive;
4112
4113 drive = p->id;
4114 return sprintf(buf, "%X\n", UDP->cmos);
4115 }
4116
4117 static DEVICE_ATTR(cmos, S_IRUGO, floppy_cmos_show, NULL);
4118
4119 static struct attribute *floppy_dev_attrs[] = {
4120 &dev_attr_cmos.attr,
4121 NULL
4122 };
4123
4124 ATTRIBUTE_GROUPS(floppy_dev);
4125
4126 static void floppy_device_release(struct device *dev)
4127 {
4128 }
4129
4130 static int floppy_resume(struct device *dev)
4131 {
4132 int fdc;
4133
4134 for (fdc = 0; fdc < N_FDC; fdc++)
4135 if (FDCS->address != -1)
4136 user_reset_fdc(-1, FD_RESET_ALWAYS, false);
4137
4138 return 0;
4139 }
4140
4141 static const struct dev_pm_ops floppy_pm_ops = {
4142 .resume = floppy_resume,
4143 .restore = floppy_resume,
4144 };
4145
4146 static struct platform_driver floppy_driver = {
4147 .driver = {
4148 .name = "floppy",
4149 .pm = &floppy_pm_ops,
4150 },
4151 };
4152
4153 static struct platform_device floppy_device[N_DRIVE];
4154
4155 static bool floppy_available(int drive)
4156 {
4157 if (!(allowed_drive_mask & (1 << drive)))
4158 return false;
4159 if (fdc_state[FDC(drive)].version == FDC_NONE)
4160 return false;
4161 return true;
4162 }
4163
4164 static struct kobject *floppy_find(dev_t dev, int *part, void *data)
4165 {
4166 int drive = (*part & 3) | ((*part & 0x80) >> 5);
4167 if (drive >= N_DRIVE || !floppy_available(drive))
4168 return NULL;
4169 if (((*part >> 2) & 0x1f) >= ARRAY_SIZE(floppy_type))
4170 return NULL;
4171 *part = 0;
4172 return get_disk(disks[drive]);
4173 }
4174
4175 static int __init do_floppy_init(void)
4176 {
4177 int i, unit, drive, err;
4178
4179 set_debugt();
4180 interruptjiffies = resultjiffies = jiffies;
4181
4182 #if defined(CONFIG_PPC)
4183 if (check_legacy_ioport(FDC1))
4184 return -ENODEV;
4185 #endif
4186
4187 raw_cmd = NULL;
4188
4189 floppy_wq = alloc_ordered_workqueue("floppy", 0);
4190 if (!floppy_wq)
4191 return -ENOMEM;
4192
4193 for (drive = 0; drive < N_DRIVE; drive++) {
4194 disks[drive] = alloc_disk(1);
4195 if (!disks[drive]) {
4196 err = -ENOMEM;
4197 goto out_put_disk;
4198 }
4199
4200 disks[drive]->queue = blk_init_queue(do_fd_request, &floppy_lock);
4201 if (!disks[drive]->queue) {
4202 err = -ENOMEM;
4203 goto out_put_disk;
4204 }
4205
4206 blk_queue_max_hw_sectors(disks[drive]->queue, 64);
4207 disks[drive]->major = FLOPPY_MAJOR;
4208 disks[drive]->first_minor = TOMINOR(drive);
4209 disks[drive]->fops = &floppy_fops;
4210 sprintf(disks[drive]->disk_name, "fd%d", drive);
4211
4212 setup_timer(&motor_off_timer[drive], motor_off_callback, drive);
4213 }
4214
4215 err = register_blkdev(FLOPPY_MAJOR, "fd");
4216 if (err)
4217 goto out_put_disk;
4218
4219 err = platform_driver_register(&floppy_driver);
4220 if (err)
4221 goto out_unreg_blkdev;
4222
4223 blk_register_region(MKDEV(FLOPPY_MAJOR, 0), 256, THIS_MODULE,
4224 floppy_find, NULL, NULL);
4225
4226 for (i = 0; i < 256; i++)
4227 if (ITYPE(i))
4228 floppy_sizes[i] = floppy_type[ITYPE(i)].size;
4229 else
4230 floppy_sizes[i] = MAX_DISK_SIZE << 1;
4231
4232 reschedule_timeout(MAXTIMEOUT, "floppy init");
4233 config_types();
4234
4235 for (i = 0; i < N_FDC; i++) {
4236 fdc = i;
4237 memset(FDCS, 0, sizeof(*FDCS));
4238 FDCS->dtr = -1;
4239 FDCS->dor = 0x4;
4240 #if defined(__sparc__) || defined(__mc68000__)
4241 /*sparcs/sun3x don't have a DOR reset which we can fall back on to */
4242 #ifdef __mc68000__
4243 if (MACH_IS_SUN3X)
4244 #endif
4245 FDCS->version = FDC_82072A;
4246 #endif
4247 }
4248
4249 use_virtual_dma = can_use_virtual_dma & 1;
4250 fdc_state[0].address = FDC1;
4251 if (fdc_state[0].address == -1) {
4252 cancel_delayed_work(&fd_timeout);
4253 err = -ENODEV;
4254 goto out_unreg_region;
4255 }
4256 #if N_FDC > 1
4257 fdc_state[1].address = FDC2;
4258 #endif
4259
4260 fdc = 0; /* reset fdc in case of unexpected interrupt */
4261 err = floppy_grab_irq_and_dma();
4262 if (err) {
4263 cancel_delayed_work(&fd_timeout);
4264 err = -EBUSY;
4265 goto out_unreg_region;
4266 }
4267
4268 /* initialise drive state */
4269 for (drive = 0; drive < N_DRIVE; drive++) {
4270 memset(UDRS, 0, sizeof(*UDRS));
4271 memset(UDRWE, 0, sizeof(*UDRWE));
4272 set_bit(FD_DISK_NEWCHANGE_BIT, &UDRS->flags);
4273 set_bit(FD_DISK_CHANGED_BIT, &UDRS->flags);
4274 set_bit(FD_VERIFY_BIT, &UDRS->flags);
4275 UDRS->fd_device = -1;
4276 floppy_track_buffer = NULL;
4277 max_buffer_sectors = 0;
4278 }
4279 /*
4280 * Small 10 msec delay to let through any interrupt that
4281 * initialization might have triggered, to not
4282 * confuse detection:
4283 */
4284 msleep(10);
4285
4286 for (i = 0; i < N_FDC; i++) {
4287 fdc = i;
4288 FDCS->driver_version = FD_DRIVER_VERSION;
4289 for (unit = 0; unit < 4; unit++)
4290 FDCS->track[unit] = 0;
4291 if (FDCS->address == -1)
4292 continue;
4293 FDCS->rawcmd = 2;
4294 if (user_reset_fdc(-1, FD_RESET_ALWAYS, false)) {
4295 /* free ioports reserved by floppy_grab_irq_and_dma() */
4296 floppy_release_regions(fdc);
4297 FDCS->address = -1;
4298 FDCS->version = FDC_NONE;
4299 continue;
4300 }
4301 /* Try to determine the floppy controller type */
4302 FDCS->version = get_fdc_version();
4303 if (FDCS->version == FDC_NONE) {
4304 /* free ioports reserved by floppy_grab_irq_and_dma() */
4305 floppy_release_regions(fdc);
4306 FDCS->address = -1;
4307 continue;
4308 }
4309 if (can_use_virtual_dma == 2 && FDCS->version < FDC_82072A)
4310 can_use_virtual_dma = 0;
4311
4312 have_no_fdc = 0;
4313 /* Not all FDCs seem to be able to handle the version command
4314 * properly, so force a reset for the standard FDC clones,
4315 * to avoid interrupt garbage.
4316 */
4317 user_reset_fdc(-1, FD_RESET_ALWAYS, false);
4318 }
4319 fdc = 0;
4320 cancel_delayed_work(&fd_timeout);
4321 current_drive = 0;
4322 initialized = true;
4323 if (have_no_fdc) {
4324 DPRINT("no floppy controllers found\n");
4325 err = have_no_fdc;
4326 goto out_release_dma;
4327 }
4328
4329 for (drive = 0; drive < N_DRIVE; drive++) {
4330 if (!floppy_available(drive))
4331 continue;
4332
4333 floppy_device[drive].name = floppy_device_name;
4334 floppy_device[drive].id = drive;
4335 floppy_device[drive].dev.release = floppy_device_release;
4336 floppy_device[drive].dev.groups = floppy_dev_groups;
4337
4338 err = platform_device_register(&floppy_device[drive]);
4339 if (err)
4340 goto out_remove_drives;
4341
4342 /* to be cleaned up... */
4343 disks[drive]->private_data = (void *)(long)drive;
4344 disks[drive]->flags |= GENHD_FL_REMOVABLE;
4345 device_add_disk(&floppy_device[drive].dev, disks[drive]);
4346 }
4347
4348 return 0;
4349
4350 out_remove_drives:
4351 while (drive--) {
4352 if (floppy_available(drive)) {
4353 del_gendisk(disks[drive]);
4354 platform_device_unregister(&floppy_device[drive]);
4355 }
4356 }
4357 out_release_dma:
4358 if (atomic_read(&usage_count))
4359 floppy_release_irq_and_dma();
4360 out_unreg_region:
4361 blk_unregister_region(MKDEV(FLOPPY_MAJOR, 0), 256);
4362 platform_driver_unregister(&floppy_driver);
4363 out_unreg_blkdev:
4364 unregister_blkdev(FLOPPY_MAJOR, "fd");
4365 out_put_disk:
4366 destroy_workqueue(floppy_wq);
4367 for (drive = 0; drive < N_DRIVE; drive++) {
4368 if (!disks[drive])
4369 break;
4370 if (disks[drive]->queue) {
4371 del_timer_sync(&motor_off_timer[drive]);
4372 blk_cleanup_queue(disks[drive]->queue);
4373 disks[drive]->queue = NULL;
4374 }
4375 put_disk(disks[drive]);
4376 }
4377 return err;
4378 }
4379
4380 #ifndef MODULE
4381 static __init void floppy_async_init(void *data, async_cookie_t cookie)
4382 {
4383 do_floppy_init();
4384 }
4385 #endif
4386
4387 static int __init floppy_init(void)
4388 {
4389 #ifdef MODULE
4390 return do_floppy_init();
4391 #else
4392 /* Don't hold up the bootup by the floppy initialization */
4393 async_schedule(floppy_async_init, NULL);
4394 return 0;
4395 #endif
4396 }
4397
4398 static const struct io_region {
4399 int offset;
4400 int size;
4401 } io_regions[] = {
4402 { 2, 1 },
4403 /* address + 3 is sometimes reserved by pnp bios for motherboard */
4404 { 4, 2 },
4405 /* address + 6 is reserved, and may be taken by IDE.
4406 * Unfortunately, Adaptec doesn't know this :-(, */
4407 { 7, 1 },
4408 };
4409
4410 static void floppy_release_allocated_regions(int fdc, const struct io_region *p)
4411 {
4412 while (p != io_regions) {
4413 p--;
4414 release_region(FDCS->address + p->offset, p->size);
4415 }
4416 }
4417
4418 #define ARRAY_END(X) (&((X)[ARRAY_SIZE(X)]))
4419
4420 static int floppy_request_regions(int fdc)
4421 {
4422 const struct io_region *p;
4423
4424 for (p = io_regions; p < ARRAY_END(io_regions); p++) {
4425 if (!request_region(FDCS->address + p->offset,
4426 p->size, "floppy")) {
4427 DPRINT("Floppy io-port 0x%04lx in use\n",
4428 FDCS->address + p->offset);
4429 floppy_release_allocated_regions(fdc, p);
4430 return -EBUSY;
4431 }
4432 }
4433 return 0;
4434 }
4435
4436 static void floppy_release_regions(int fdc)
4437 {
4438 floppy_release_allocated_regions(fdc, ARRAY_END(io_regions));
4439 }
4440
4441 static int floppy_grab_irq_and_dma(void)
4442 {
4443 if (atomic_inc_return(&usage_count) > 1)
4444 return 0;
4445
4446 /*
4447 * We might have scheduled a free_irq(), wait it to
4448 * drain first:
4449 */
4450 flush_workqueue(floppy_wq);
4451
4452 if (fd_request_irq()) {
4453 DPRINT("Unable to grab IRQ%d for the floppy driver\n",
4454 FLOPPY_IRQ);
4455 atomic_dec(&usage_count);
4456 return -1;
4457 }
4458 if (fd_request_dma()) {
4459 DPRINT("Unable to grab DMA%d for the floppy driver\n",
4460 FLOPPY_DMA);
4461 if (can_use_virtual_dma & 2)
4462 use_virtual_dma = can_use_virtual_dma = 1;
4463 if (!(can_use_virtual_dma & 1)) {
4464 fd_free_irq();
4465 atomic_dec(&usage_count);
4466 return -1;
4467 }
4468 }
4469
4470 for (fdc = 0; fdc < N_FDC; fdc++) {
4471 if (FDCS->address != -1) {
4472 if (floppy_request_regions(fdc))
4473 goto cleanup;
4474 }
4475 }
4476 for (fdc = 0; fdc < N_FDC; fdc++) {
4477 if (FDCS->address != -1) {
4478 reset_fdc_info(1);
4479 fd_outb(FDCS->dor, FD_DOR);
4480 }
4481 }
4482 fdc = 0;
4483 set_dor(0, ~0, 8); /* avoid immediate interrupt */
4484
4485 for (fdc = 0; fdc < N_FDC; fdc++)
4486 if (FDCS->address != -1)
4487 fd_outb(FDCS->dor, FD_DOR);
4488 /*
4489 * The driver will try and free resources and relies on us
4490 * to know if they were allocated or not.
4491 */
4492 fdc = 0;
4493 irqdma_allocated = 1;
4494 return 0;
4495 cleanup:
4496 fd_free_irq();
4497 fd_free_dma();
4498 while (--fdc >= 0)
4499 floppy_release_regions(fdc);
4500 atomic_dec(&usage_count);
4501 return -1;
4502 }
4503
4504 static void floppy_release_irq_and_dma(void)
4505 {
4506 int old_fdc;
4507 #ifndef __sparc__
4508 int drive;
4509 #endif
4510 long tmpsize;
4511 unsigned long tmpaddr;
4512
4513 if (!atomic_dec_and_test(&usage_count))
4514 return;
4515
4516 if (irqdma_allocated) {
4517 fd_disable_dma();
4518 fd_free_dma();
4519 fd_free_irq();
4520 irqdma_allocated = 0;
4521 }
4522 set_dor(0, ~0, 8);
4523 #if N_FDC > 1
4524 set_dor(1, ~8, 0);
4525 #endif
4526
4527 if (floppy_track_buffer && max_buffer_sectors) {
4528 tmpsize = max_buffer_sectors * 1024;
4529 tmpaddr = (unsigned long)floppy_track_buffer;
4530 floppy_track_buffer = NULL;
4531 max_buffer_sectors = 0;
4532 buffer_min = buffer_max = -1;
4533 fd_dma_mem_free(tmpaddr, tmpsize);
4534 }
4535 #ifndef __sparc__
4536 for (drive = 0; drive < N_FDC * 4; drive++)
4537 if (timer_pending(motor_off_timer + drive))
4538 pr_info("motor off timer %d still active\n", drive);
4539 #endif
4540
4541 if (delayed_work_pending(&fd_timeout))
4542 pr_info("floppy timer still active:%s\n", timeout_message);
4543 if (delayed_work_pending(&fd_timer))
4544 pr_info("auxiliary floppy timer still active\n");
4545 if (work_pending(&floppy_work))
4546 pr_info("work still pending\n");
4547 old_fdc = fdc;
4548 for (fdc = 0; fdc < N_FDC; fdc++)
4549 if (FDCS->address != -1)
4550 floppy_release_regions(fdc);
4551 fdc = old_fdc;
4552 }
4553
4554 #ifdef MODULE
4555
4556 static char *floppy;
4557
4558 static void __init parse_floppy_cfg_string(char *cfg)
4559 {
4560 char *ptr;
4561
4562 while (*cfg) {
4563 ptr = cfg;
4564 while (*cfg && *cfg != ' ' && *cfg != '\t')
4565 cfg++;
4566 if (*cfg) {
4567 *cfg = '\0';
4568 cfg++;
4569 }
4570 if (*ptr)
4571 floppy_setup(ptr);
4572 }
4573 }
4574
4575 static int __init floppy_module_init(void)
4576 {
4577 if (floppy)
4578 parse_floppy_cfg_string(floppy);
4579 return floppy_init();
4580 }
4581 module_init(floppy_module_init);
4582
4583 static void __exit floppy_module_exit(void)
4584 {
4585 int drive;
4586
4587 blk_unregister_region(MKDEV(FLOPPY_MAJOR, 0), 256);
4588 unregister_blkdev(FLOPPY_MAJOR, "fd");
4589 platform_driver_unregister(&floppy_driver);
4590
4591 destroy_workqueue(floppy_wq);
4592
4593 for (drive = 0; drive < N_DRIVE; drive++) {
4594 del_timer_sync(&motor_off_timer[drive]);
4595
4596 if (floppy_available(drive)) {
4597 del_gendisk(disks[drive]);
4598 platform_device_unregister(&floppy_device[drive]);
4599 }
4600 blk_cleanup_queue(disks[drive]->queue);
4601
4602 /*
4603 * These disks have not called add_disk(). Don't put down
4604 * queue reference in put_disk().
4605 */
4606 if (!(allowed_drive_mask & (1 << drive)) ||
4607 fdc_state[FDC(drive)].version == FDC_NONE)
4608 disks[drive]->queue = NULL;
4609
4610 put_disk(disks[drive]);
4611 }
4612
4613 cancel_delayed_work_sync(&fd_timeout);
4614 cancel_delayed_work_sync(&fd_timer);
4615
4616 if (atomic_read(&usage_count))
4617 floppy_release_irq_and_dma();
4618
4619 /* eject disk, if any */
4620 fd_eject(0);
4621 }
4622
4623 module_exit(floppy_module_exit);
4624
4625 module_param(floppy, charp, 0);
4626 module_param(FLOPPY_IRQ, int, 0);
4627 module_param(FLOPPY_DMA, int, 0);
4628 MODULE_AUTHOR("Alain L. Knaff");
4629 MODULE_SUPPORTED_DEVICE("fd");
4630 MODULE_LICENSE("GPL");
4631
4632 /* This doesn't actually get used other than for module information */
4633 static const struct pnp_device_id floppy_pnpids[] = {
4634 {"PNP0700", 0},
4635 {}
4636 };
4637
4638 MODULE_DEVICE_TABLE(pnp, floppy_pnpids);
4639
4640 #else
4641
4642 __setup("floppy=", floppy_setup);
4643 module_init(floppy_init)
4644 #endif
4645
4646 MODULE_ALIAS_BLOCKDEV_MAJOR(FLOPPY_MAJOR);