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