]> bbs.cooldavid.org Git - net-next-2.6.git/blob - drivers/block/floppy.c
drivers/block/floppy.c: remove #define DEVICE_NAME "floppy"
[net-next-2.6.git] / drivers / block / floppy.c
1 /*
2  *  linux/drivers/block/floppy.c
3  *
4  *  Copyright (C) 1991, 1992  Linus Torvalds
5  *  Copyright (C) 1993, 1994  Alain Knaff
6  *  Copyright (C) 1998 Alan Cox
7  */
8
9 /*
10  * 02.12.91 - Changed to static variables to indicate need for reset
11  * and recalibrate. This makes some things easier (output_byte reset
12  * checking etc), and means less interrupt jumping in case of errors,
13  * so the code is hopefully easier to understand.
14  */
15
16 /*
17  * This file is certainly a mess. I've tried my best to get it working,
18  * but I don't like programming floppies, and I have only one anyway.
19  * Urgel. I should check for more errors, and do more graceful error
20  * recovery. Seems there are problems with several drives. I've tried to
21  * correct them. No promises.
22  */
23
24 /*
25  * As with hd.c, all routines within this file can (and will) be called
26  * by interrupts, so extreme caution is needed. A hardware interrupt
27  * handler may not sleep, or a kernel panic will happen. Thus I cannot
28  * call "floppy-on" directly, but have to set a special timer interrupt
29  * etc.
30  */
31
32 /*
33  * 28.02.92 - made track-buffering routines, based on the routines written
34  * by entropy@wintermute.wpi.edu (Lawrence Foard). Linus.
35  */
36
37 /*
38  * Automatic floppy-detection and formatting written by Werner Almesberger
39  * (almesber@nessie.cs.id.ethz.ch), who also corrected some problems with
40  * the floppy-change signal detection.
41  */
42
43 /*
44  * 1992/7/22 -- Hennus Bergman: Added better error reporting, fixed
45  * FDC data overrun bug, added some preliminary stuff for vertical
46  * recording support.
47  *
48  * 1992/9/17: Added DMA allocation & DMA functions. -- hhb.
49  *
50  * TODO: Errors are still not counted properly.
51  */
52
53 /* 1992/9/20
54  * Modifications for ``Sector Shifting'' by Rob Hooft (hooft@chem.ruu.nl)
55  * modeled after the freeware MS-DOS program fdformat/88 V1.8 by
56  * Christoph H. Hochst\"atter.
57  * I have fixed the shift values to the ones I always use. Maybe a new
58  * ioctl() should be created to be able to modify them.
59  * There is a bug in the driver that makes it impossible to format a
60  * floppy as the first thing after bootup.
61  */
62
63 /*
64  * 1993/4/29 -- Linus -- cleaned up the timer handling in the kernel, and
65  * this helped the floppy driver as well. Much cleaner, and still seems to
66  * work.
67  */
68
69 /* 1994/6/24 --bbroad-- added the floppy table entries and made
70  * minor modifications to allow 2.88 floppies to be run.
71  */
72
73 /* 1994/7/13 -- Paul Vojta -- modified the probing code to allow three or more
74  * disk types.
75  */
76
77 /*
78  * 1994/8/8 -- Alain Knaff -- Switched to fdpatch driver: Support for bigger
79  * format bug fixes, but unfortunately some new bugs too...
80  */
81
82 /* 1994/9/17 -- Koen Holtman -- added logging of physical floppy write
83  * errors to allow safe writing by specialized programs.
84  */
85
86 /* 1995/4/24 -- Dan Fandrich -- added support for Commodore 1581 3.5" disks
87  * by defining bit 1 of the "stretch" parameter to mean put sectors on the
88  * opposite side of the disk, leaving the sector IDs alone (i.e. Commodore's
89  * drives are "upside-down").
90  */
91
92 /*
93  * 1995/8/26 -- Andreas Busse -- added Mips support.
94  */
95
96 /*
97  * 1995/10/18 -- Ralf Baechle -- Portability cleanup; move machine dependent
98  * features to asm/floppy.h.
99  */
100
101 /*
102  * 1998/1/21 -- Richard Gooch <rgooch@atnf.csiro.au> -- devfs support
103  */
104
105 /*
106  * 1998/05/07 -- Russell King -- More portability cleanups; moved definition of
107  * interrupt and dma channel to asm/floppy.h. Cleaned up some formatting &
108  * use of '0' for NULL.
109  */
110
111 /*
112  * 1998/06/07 -- Alan Cox -- Merged the 2.0.34 fixes for resource allocation
113  * failures.
114  */
115
116 /*
117  * 1998/09/20 -- David Weinehall -- Added slow-down code for buggy PS/2-drives.
118  */
119
120 /*
121  * 1999/08/13 -- Paul Slootman -- floppy stopped working on Alpha after 24
122  * days, 6 hours, 32 minutes and 32 seconds (i.e. MAXINT jiffies; ints were
123  * being used to store jiffies, which are unsigned longs).
124  */
125
126 /*
127  * 2000/08/28 -- Arnaldo Carvalho de Melo <acme@conectiva.com.br>
128  * - get rid of check_region
129  * - s/suser/capable/
130  */
131
132 /*
133  * 2001/08/26 -- Paul Gortmaker - fix insmod oops on machines with no
134  * floppy controller (lingering task on list after module is gone... boom.)
135  */
136
137 /*
138  * 2002/02/07 -- Anton Altaparmakov - Fix io ports reservation to correct range
139  * (0x3f2-0x3f5, 0x3f7). This fix is a bit of a hack but the proper fix
140  * requires many non-obvious changes in arch dependent code.
141  */
142
143 /* 2003/07/28 -- Daniele Bellucci <bellucda@tiscali.it>.
144  * Better audit of register_blkdev.
145  */
146
147 #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 int initialising = 1;
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 (!initialising) {
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 (!initialising) {
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 (!initialising) {
1208                 DPRINT
1209                     ("get result error. Fdc=%d Last status=%x Read bytes=%d\n",
1210                      fdc, status, i);
1211                 show_floppy();
1212         }
1213         FDCS->reset = 1;
1214         return -1;
1215 }
1216
1217 #define MORE_OUTPUT -2
1218 /* does the fdc need more output? */
1219 static int need_more_output(void)
1220 {
1221         int status = wait_til_ready();
1222
1223         if (status < 0)
1224                 return -1;
1225         if ((status & (STATUS_READY | STATUS_DIR | STATUS_DMA)) == STATUS_READY)
1226                 return MORE_OUTPUT;
1227         return result();
1228 }
1229
1230 /* Set perpendicular mode as required, based on data rate, if supported.
1231  * 82077 Now tested. 1Mbps data rate only possible with 82077-1.
1232  */
1233 static inline void perpendicular_mode(void)
1234 {
1235         unsigned char perp_mode;
1236
1237         if (raw_cmd->rate & 0x40) {
1238                 switch (raw_cmd->rate & 3) {
1239                 case 0:
1240                         perp_mode = 2;
1241                         break;
1242                 case 3:
1243                         perp_mode = 3;
1244                         break;
1245                 default:
1246                         DPRINT("Invalid data rate for perpendicular mode!\n");
1247                         cont->done(0);
1248                         FDCS->reset = 1;
1249                                         /*
1250                                          * convenient way to return to
1251                                          * redo without too much hassle
1252                                          * (deep stack et al.)
1253                                          */
1254                         return;
1255                 }
1256         } else
1257                 perp_mode = 0;
1258
1259         if (FDCS->perp_mode == perp_mode)
1260                 return;
1261         if (FDCS->version >= FDC_82077_ORIG) {
1262                 output_byte(FD_PERPENDICULAR);
1263                 output_byte(perp_mode);
1264                 FDCS->perp_mode = perp_mode;
1265         } else if (perp_mode) {
1266                 DPRINT("perpendicular mode not supported by this FDC.\n");
1267         }
1268 }                               /* perpendicular_mode */
1269
1270 static int fifo_depth = 0xa;
1271 static int no_fifo;
1272
1273 static int fdc_configure(void)
1274 {
1275         /* Turn on FIFO */
1276         output_byte(FD_CONFIGURE);
1277         if (need_more_output() != MORE_OUTPUT)
1278                 return 0;
1279         output_byte(0);
1280         output_byte(0x10 | (no_fifo & 0x20) | (fifo_depth & 0xf));
1281         output_byte(0);         /* pre-compensation from track
1282                                    0 upwards */
1283         return 1;
1284 }
1285
1286 #define NOMINAL_DTR 500
1287
1288 /* Issue a "SPECIFY" command to set the step rate time, head unload time,
1289  * head load time, and DMA disable flag to values needed by floppy.
1290  *
1291  * The value "dtr" is the data transfer rate in Kbps.  It is needed
1292  * to account for the data rate-based scaling done by the 82072 and 82077
1293  * FDC types.  This parameter is ignored for other types of FDCs (i.e.
1294  * 8272a).
1295  *
1296  * Note that changing the data transfer rate has a (probably deleterious)
1297  * effect on the parameters subject to scaling for 82072/82077 FDCs, so
1298  * fdc_specify is called again after each data transfer rate
1299  * change.
1300  *
1301  * srt: 1000 to 16000 in microseconds
1302  * hut: 16 to 240 milliseconds
1303  * hlt: 2 to 254 milliseconds
1304  *
1305  * These values are rounded up to the next highest available delay time.
1306  */
1307 static void fdc_specify(void)
1308 {
1309         unsigned char spec1;
1310         unsigned char spec2;
1311         unsigned long srt;
1312         unsigned long hlt;
1313         unsigned long hut;
1314         unsigned long dtr = NOMINAL_DTR;
1315         unsigned long scale_dtr = NOMINAL_DTR;
1316         int hlt_max_code = 0x7f;
1317         int hut_max_code = 0xf;
1318
1319         if (FDCS->need_configure && FDCS->version >= FDC_82072A) {
1320                 fdc_configure();
1321                 FDCS->need_configure = 0;
1322         }
1323
1324         switch (raw_cmd->rate & 0x03) {
1325         case 3:
1326                 dtr = 1000;
1327                 break;
1328         case 1:
1329                 dtr = 300;
1330                 if (FDCS->version >= FDC_82078) {
1331                         /* chose the default rate table, not the one
1332                          * where 1 = 2 Mbps */
1333                         output_byte(FD_DRIVESPEC);
1334                         if (need_more_output() == MORE_OUTPUT) {
1335                                 output_byte(UNIT(current_drive));
1336                                 output_byte(0xc0);
1337                         }
1338                 }
1339                 break;
1340         case 2:
1341                 dtr = 250;
1342                 break;
1343         }
1344
1345         if (FDCS->version >= FDC_82072) {
1346                 scale_dtr = dtr;
1347                 hlt_max_code = 0x00;    /* 0==256msec*dtr0/dtr (not linear!) */
1348                 hut_max_code = 0x0;     /* 0==256msec*dtr0/dtr (not linear!) */
1349         }
1350
1351         /* Convert step rate from microseconds to milliseconds and 4 bits */
1352         srt = 16 - DIV_ROUND_UP(DP->srt * scale_dtr / 1000, NOMINAL_DTR);
1353         if (slow_floppy)
1354                 srt = srt / 4;
1355
1356         SUPBOUND(srt, 0xf);
1357         INFBOUND(srt, 0);
1358
1359         hlt = DIV_ROUND_UP(DP->hlt * scale_dtr / 2, NOMINAL_DTR);
1360         if (hlt < 0x01)
1361                 hlt = 0x01;
1362         else if (hlt > 0x7f)
1363                 hlt = hlt_max_code;
1364
1365         hut = DIV_ROUND_UP(DP->hut * scale_dtr / 16, NOMINAL_DTR);
1366         if (hut < 0x1)
1367                 hut = 0x1;
1368         else if (hut > 0xf)
1369                 hut = hut_max_code;
1370
1371         spec1 = (srt << 4) | hut;
1372         spec2 = (hlt << 1) | (use_virtual_dma & 1);
1373
1374         /* If these parameters did not change, just return with success */
1375         if (FDCS->spec1 != spec1 || FDCS->spec2 != spec2) {
1376                 /* Go ahead and set spec1 and spec2 */
1377                 output_byte(FD_SPECIFY);
1378                 output_byte(FDCS->spec1 = spec1);
1379                 output_byte(FDCS->spec2 = spec2);
1380         }
1381 }                               /* fdc_specify */
1382
1383 /* Set the FDC's data transfer rate on behalf of the specified drive.
1384  * NOTE: with 82072/82077 FDCs, changing the data rate requires a reissue
1385  * of the specify command (i.e. using the fdc_specify function).
1386  */
1387 static int fdc_dtr(void)
1388 {
1389         /* If data rate not already set to desired value, set it. */
1390         if ((raw_cmd->rate & 3) == FDCS->dtr)
1391                 return 0;
1392
1393         /* Set dtr */
1394         fd_outb(raw_cmd->rate & 3, FD_DCR);
1395
1396         /* TODO: some FDC/drive combinations (C&T 82C711 with TEAC 1.2MB)
1397          * need a stabilization period of several milliseconds to be
1398          * enforced after data rate changes before R/W operations.
1399          * Pause 5 msec to avoid trouble. (Needs to be 2 jiffies)
1400          */
1401         FDCS->dtr = raw_cmd->rate & 3;
1402         return fd_wait_for_completion(jiffies + 2UL * HZ / 100,
1403                                       (timeout_fn)floppy_ready);
1404 }                               /* fdc_dtr */
1405
1406 static void tell_sector(void)
1407 {
1408         pr_cont(": track %d, head %d, sector %d, size %d",
1409                 R_TRACK, R_HEAD, R_SECTOR, R_SIZECODE);
1410 }                               /* tell_sector */
1411
1412 static void print_errors(void)
1413 {
1414         DPRINT("");
1415         if (ST0 & ST0_ECE) {
1416                 pr_cont("Recalibrate failed!");
1417         } else if (ST2 & ST2_CRC) {
1418                 pr_cont("data CRC error");
1419                 tell_sector();
1420         } else if (ST1 & ST1_CRC) {
1421                 pr_cont("CRC error");
1422                 tell_sector();
1423         } else if ((ST1 & (ST1_MAM | ST1_ND)) ||
1424                    (ST2 & ST2_MAM)) {
1425                 if (!probing) {
1426                         pr_cont("sector not found");
1427                         tell_sector();
1428                 } else
1429                         pr_cont("probe failed...");
1430         } else if (ST2 & ST2_WC) {      /* seek error */
1431                 pr_cont("wrong cylinder");
1432         } else if (ST2 & ST2_BC) {      /* cylinder marked as bad */
1433                 pr_cont("bad cylinder");
1434         } else {
1435                 pr_cont("unknown error. ST[0..2] are: 0x%x 0x%x 0x%x",
1436                         ST0, ST1, ST2);
1437                 tell_sector();
1438         }
1439         pr_cont("\n");
1440 }
1441
1442 /*
1443  * OK, this error interpreting routine is called after a
1444  * DMA read/write has succeeded
1445  * or failed, so we check the results, and copy any buffers.
1446  * hhb: Added better error reporting.
1447  * ak: Made this into a separate routine.
1448  */
1449 static int interpret_errors(void)
1450 {
1451         char bad;
1452
1453         if (inr != 7) {
1454                 DPRINT("-- FDC reply error");
1455                 FDCS->reset = 1;
1456                 return 1;
1457         }
1458
1459         /* check IC to find cause of interrupt */
1460         switch (ST0 & ST0_INTR) {
1461         case 0x40:              /* error occurred during command execution */
1462                 if (ST1 & ST1_EOC)
1463                         return 0;       /* occurs with pseudo-DMA */
1464                 bad = 1;
1465                 if (ST1 & ST1_WP) {
1466                         DPRINT("Drive is write protected\n");
1467                         clear_bit(FD_DISK_WRITABLE_BIT, &DRS->flags);
1468                         cont->done(0);
1469                         bad = 2;
1470                 } else if (ST1 & ST1_ND) {
1471                         set_bit(FD_NEED_TWADDLE_BIT, &DRS->flags);
1472                 } else if (ST1 & ST1_OR) {
1473                         if (DP->flags & FTD_MSG)
1474                                 DPRINT("Over/Underrun - retrying\n");
1475                         bad = 0;
1476                 } else if (*errors >= DP->max_errors.reporting) {
1477                         print_errors();
1478                 }
1479                 if (ST2 & ST2_WC || ST2 & ST2_BC)
1480                         /* wrong cylinder => recal */
1481                         DRS->track = NEED_2_RECAL;
1482                 return bad;
1483         case 0x80:              /* invalid command given */
1484                 DPRINT("Invalid FDC command given!\n");
1485                 cont->done(0);
1486                 return 2;
1487         case 0xc0:
1488                 DPRINT("Abnormal termination caused by polling\n");
1489                 cont->error();
1490                 return 2;
1491         default:                /* (0) Normal command termination */
1492                 return 0;
1493         }
1494 }
1495
1496 /*
1497  * This routine is called when everything should be correctly set up
1498  * for the transfer (i.e. floppy motor is on, the correct floppy is
1499  * selected, and the head is sitting on the right track).
1500  */
1501 static void setup_rw_floppy(void)
1502 {
1503         int i;
1504         int r;
1505         int flags;
1506         int dflags;
1507         unsigned long ready_date;
1508         timeout_fn function;
1509
1510         flags = raw_cmd->flags;
1511         if (flags & (FD_RAW_READ | FD_RAW_WRITE))
1512                 flags |= FD_RAW_INTR;
1513
1514         if ((flags & FD_RAW_SPIN) && !(flags & FD_RAW_NO_MOTOR)) {
1515                 ready_date = DRS->spinup_date + DP->spinup;
1516                 /* If spinup will take a long time, rerun scandrives
1517                  * again just before spinup completion. Beware that
1518                  * after scandrives, we must again wait for selection.
1519                  */
1520                 if (time_after(ready_date, jiffies + DP->select_delay)) {
1521                         ready_date -= DP->select_delay;
1522                         function = (timeout_fn)floppy_start;
1523                 } else
1524                         function = (timeout_fn)setup_rw_floppy;
1525
1526                 /* wait until the floppy is spinning fast enough */
1527                 if (fd_wait_for_completion(ready_date, function))
1528                         return;
1529         }
1530         dflags = DRS->flags;
1531
1532         if ((flags & FD_RAW_READ) || (flags & FD_RAW_WRITE))
1533                 setup_DMA();
1534
1535         if (flags & FD_RAW_INTR)
1536                 do_floppy = main_command_interrupt;
1537
1538         r = 0;
1539         for (i = 0; i < raw_cmd->cmd_count; i++)
1540                 r |= output_byte(raw_cmd->cmd[i]);
1541
1542         debugt("rw_command: ");
1543
1544         if (r) {
1545                 cont->error();
1546                 reset_fdc();
1547                 return;
1548         }
1549
1550         if (!(flags & FD_RAW_INTR)) {
1551                 inr = result();
1552                 cont->interrupt();
1553         } else if (flags & FD_RAW_NEED_DISK)
1554                 fd_watchdog();
1555 }
1556
1557 static int blind_seek;
1558
1559 /*
1560  * This is the routine called after every seek (or recalibrate) interrupt
1561  * from the floppy controller.
1562  */
1563 static void seek_interrupt(void)
1564 {
1565         debugt("seek interrupt:");
1566         if (inr != 2 || (ST0 & 0xF8) != 0x20) {
1567                 DPRINT("seek failed\n");
1568                 DRS->track = NEED_2_RECAL;
1569                 cont->error();
1570                 cont->redo();
1571                 return;
1572         }
1573         if (DRS->track >= 0 && DRS->track != ST1 && !blind_seek) {
1574                 debug_dcl(DP->flags,
1575                           "clearing NEWCHANGE flag because of effective seek\n");
1576                 debug_dcl(DP->flags, "jiffies=%lu\n", jiffies);
1577                 clear_bit(FD_DISK_NEWCHANGE_BIT, &DRS->flags);
1578                                         /* effective seek */
1579                 DRS->select_date = jiffies;
1580         }
1581         DRS->track = ST1;
1582         floppy_ready();
1583 }
1584
1585 static void check_wp(void)
1586 {
1587         if (test_bit(FD_VERIFY_BIT, &DRS->flags)) {
1588                                         /* check write protection */
1589                 output_byte(FD_GETSTATUS);
1590                 output_byte(UNIT(current_drive));
1591                 if (result() != 1) {
1592                         FDCS->reset = 1;
1593                         return;
1594                 }
1595                 clear_bit(FD_VERIFY_BIT, &DRS->flags);
1596                 clear_bit(FD_NEED_TWADDLE_BIT, &DRS->flags);
1597                 debug_dcl(DP->flags,
1598                           "checking whether disk is write protected\n");
1599                 debug_dcl(DP->flags, "wp=%x\n", ST3 & 0x40);
1600                 if (!(ST3 & 0x40))
1601                         set_bit(FD_DISK_WRITABLE_BIT, &DRS->flags);
1602                 else
1603                         clear_bit(FD_DISK_WRITABLE_BIT, &DRS->flags);
1604         }
1605 }
1606
1607 static void seek_floppy(void)
1608 {
1609         int track;
1610
1611         blind_seek = 0;
1612
1613         debug_dcl(DP->flags, "calling disk change from seek\n");
1614
1615         if (!test_bit(FD_DISK_NEWCHANGE_BIT, &DRS->flags) &&
1616             disk_change(current_drive) && (raw_cmd->flags & FD_RAW_NEED_DISK)) {
1617                 /* the media changed flag should be cleared after the seek.
1618                  * If it isn't, this means that there is really no disk in
1619                  * the drive.
1620                  */
1621                 set_bit(FD_DISK_CHANGED_BIT, &DRS->flags);
1622                 cont->done(0);
1623                 cont->redo();
1624                 return;
1625         }
1626         if (DRS->track <= NEED_1_RECAL) {
1627                 recalibrate_floppy();
1628                 return;
1629         } else if (test_bit(FD_DISK_NEWCHANGE_BIT, &DRS->flags) &&
1630                    (raw_cmd->flags & FD_RAW_NEED_DISK) &&
1631                    (DRS->track <= NO_TRACK || DRS->track == raw_cmd->track)) {
1632                 /* we seek to clear the media-changed condition. Does anybody
1633                  * know a more elegant way, which works on all drives? */
1634                 if (raw_cmd->track)
1635                         track = raw_cmd->track - 1;
1636                 else {
1637                         if (DP->flags & FD_SILENT_DCL_CLEAR) {
1638                                 set_dor(fdc, ~(0x10 << UNIT(current_drive)), 0);
1639                                 blind_seek = 1;
1640                                 raw_cmd->flags |= FD_RAW_NEED_SEEK;
1641                         }
1642                         track = 1;
1643                 }
1644         } else {
1645                 check_wp();
1646                 if (raw_cmd->track != DRS->track &&
1647                     (raw_cmd->flags & FD_RAW_NEED_SEEK))
1648                         track = raw_cmd->track;
1649                 else {
1650                         setup_rw_floppy();
1651                         return;
1652                 }
1653         }
1654
1655         do_floppy = seek_interrupt;
1656         output_byte(FD_SEEK);
1657         output_byte(UNIT(current_drive));
1658         if (output_byte(track) < 0) {
1659                 reset_fdc();
1660                 return;
1661         }
1662         debugt("seek command:");
1663 }
1664
1665 static void recal_interrupt(void)
1666 {
1667         debugt("recal interrupt:");
1668         if (inr != 2)
1669                 FDCS->reset = 1;
1670         else if (ST0 & ST0_ECE) {
1671                 switch (DRS->track) {
1672                 case NEED_1_RECAL:
1673                         debugt("recal interrupt need 1 recal:");
1674                         /* after a second recalibrate, we still haven't
1675                          * reached track 0. Probably no drive. Raise an
1676                          * error, as failing immediately might upset
1677                          * computers possessed by the Devil :-) */
1678                         cont->error();
1679                         cont->redo();
1680                         return;
1681                 case NEED_2_RECAL:
1682                         debugt("recal interrupt need 2 recal:");
1683                         /* If we already did a recalibrate,
1684                          * and we are not at track 0, this
1685                          * means we have moved. (The only way
1686                          * not to move at recalibration is to
1687                          * be already at track 0.) Clear the
1688                          * new change flag */
1689                         debug_dcl(DP->flags,
1690                                   "clearing NEWCHANGE flag because of second recalibrate\n");
1691
1692                         clear_bit(FD_DISK_NEWCHANGE_BIT, &DRS->flags);
1693                         DRS->select_date = jiffies;
1694                         /* fall through */
1695                 default:
1696                         debugt("recal interrupt default:");
1697                         /* Recalibrate moves the head by at
1698                          * most 80 steps. If after one
1699                          * recalibrate we don't have reached
1700                          * track 0, this might mean that we
1701                          * started beyond track 80.  Try
1702                          * again.  */
1703                         DRS->track = NEED_1_RECAL;
1704                         break;
1705                 }
1706         } else
1707                 DRS->track = ST1;
1708         floppy_ready();
1709 }
1710
1711 static void print_result(char *message, int inr)
1712 {
1713         int i;
1714
1715         DPRINT("%s ", message);
1716         if (inr >= 0)
1717                 for (i = 0; i < inr; i++)
1718                         pr_cont("repl[%d]=%x ", i, reply_buffer[i]);
1719         pr_cont("\n");
1720 }
1721
1722 /* interrupt handler. Note that this can be called externally on the Sparc */
1723 irqreturn_t floppy_interrupt(int irq, void *dev_id)
1724 {
1725         int do_print;
1726         unsigned long f;
1727         void (*handler)(void) = do_floppy;
1728
1729         lasthandler = handler;
1730         interruptjiffies = jiffies;
1731
1732         f = claim_dma_lock();
1733         fd_disable_dma();
1734         release_dma_lock(f);
1735
1736         floppy_enable_hlt();
1737         do_floppy = NULL;
1738         if (fdc >= N_FDC || FDCS->address == -1) {
1739                 /* we don't even know which FDC is the culprit */
1740                 pr_info("DOR0=%x\n", fdc_state[0].dor);
1741                 pr_info("floppy interrupt on bizarre fdc %d\n", fdc);
1742                 pr_info("handler=%p\n", handler);
1743                 is_alive("bizarre fdc");
1744                 return IRQ_NONE;
1745         }
1746
1747         FDCS->reset = 0;
1748         /* We have to clear the reset flag here, because apparently on boxes
1749          * with level triggered interrupts (PS/2, Sparc, ...), it is needed to
1750          * emit SENSEI's to clear the interrupt line. And FDCS->reset blocks the
1751          * emission of the SENSEI's.
1752          * It is OK to emit floppy commands because we are in an interrupt
1753          * handler here, and thus we have to fear no interference of other
1754          * activity.
1755          */
1756
1757         do_print = !handler && print_unex && !initialising;
1758
1759         inr = result();
1760         if (do_print)
1761                 print_result("unexpected interrupt", inr);
1762         if (inr == 0) {
1763                 int max_sensei = 4;
1764                 do {
1765                         output_byte(FD_SENSEI);
1766                         inr = result();
1767                         if (do_print)
1768                                 print_result("sensei", inr);
1769                         max_sensei--;
1770                 } while ((ST0 & 0x83) != UNIT(current_drive) &&
1771                          inr == 2 && max_sensei);
1772         }
1773         if (!handler) {
1774                 FDCS->reset = 1;
1775                 return IRQ_NONE;
1776         }
1777         schedule_bh(handler);
1778         is_alive("normal interrupt end");
1779
1780         /* FIXME! Was it really for us? */
1781         return IRQ_HANDLED;
1782 }
1783
1784 static void recalibrate_floppy(void)
1785 {
1786         debugt("recalibrate floppy:");
1787         do_floppy = recal_interrupt;
1788         output_byte(FD_RECALIBRATE);
1789         if (output_byte(UNIT(current_drive)) < 0) {
1790                 reset_fdc();
1791                 return;
1792         }
1793 }
1794
1795 /*
1796  * Must do 4 FD_SENSEIs after reset because of ``drive polling''.
1797  */
1798 static void reset_interrupt(void)
1799 {
1800         debugt("reset interrupt:");
1801         result();               /* get the status ready for set_fdc */
1802         if (FDCS->reset) {
1803                 pr_info("reset set in interrupt, calling %p\n", cont->error);
1804                 cont->error();  /* a reset just after a reset. BAD! */
1805         }
1806         cont->redo();
1807 }
1808
1809 /*
1810  * reset is done by pulling bit 2 of DOR low for a while (old FDCs),
1811  * or by setting the self clearing bit 7 of STATUS (newer FDCs)
1812  */
1813 static void reset_fdc(void)
1814 {
1815         unsigned long flags;
1816
1817         do_floppy = reset_interrupt;
1818         FDCS->reset = 0;
1819         reset_fdc_info(0);
1820
1821         /* Pseudo-DMA may intercept 'reset finished' interrupt.  */
1822         /* Irrelevant for systems with true DMA (i386).          */
1823
1824         flags = claim_dma_lock();
1825         fd_disable_dma();
1826         release_dma_lock(flags);
1827
1828         if (FDCS->version >= FDC_82072A)
1829                 fd_outb(0x80 | (FDCS->dtr & 3), FD_STATUS);
1830         else {
1831                 fd_outb(FDCS->dor & ~0x04, FD_DOR);
1832                 udelay(FD_RESET_DELAY);
1833                 fd_outb(FDCS->dor, FD_DOR);
1834         }
1835 }
1836
1837 static void show_floppy(void)
1838 {
1839         int i;
1840
1841         pr_info("\n");
1842         pr_info("floppy driver state\n");
1843         pr_info("-------------------\n");
1844         pr_info("now=%lu last interrupt=%lu diff=%lu last called handler=%p\n",
1845                 jiffies, interruptjiffies, jiffies - interruptjiffies,
1846                 lasthandler);
1847
1848 #ifdef FLOPPY_SANITY_CHECK
1849         pr_info("timeout_message=%s\n", timeout_message);
1850         pr_info("last output bytes:\n");
1851         for (i = 0; i < OLOGSIZE; i++)
1852                 pr_info("%2x %2x %lu\n",
1853                         output_log[(i + output_log_pos) % OLOGSIZE].data,
1854                         output_log[(i + output_log_pos) % OLOGSIZE].status,
1855                         output_log[(i + output_log_pos) % OLOGSIZE].jiffies);
1856         pr_info("last result at %lu\n", resultjiffies);
1857         pr_info("last redo_fd_request at %lu\n", lastredo);
1858         print_hex_dump(KERN_INFO, "", DUMP_PREFIX_NONE, 16, 1,
1859                        reply_buffer, resultsize, true);
1860 #endif
1861
1862         pr_info("status=%x\n", fd_inb(FD_STATUS));
1863         pr_info("fdc_busy=%lu\n", fdc_busy);
1864         if (do_floppy)
1865                 pr_info("do_floppy=%p\n", do_floppy);
1866         if (work_pending(&floppy_work))
1867                 pr_info("floppy_work.func=%p\n", floppy_work.func);
1868         if (timer_pending(&fd_timer))
1869                 pr_info("fd_timer.function=%p\n", fd_timer.function);
1870         if (timer_pending(&fd_timeout)) {
1871                 pr_info("timer_function=%p\n", fd_timeout.function);
1872                 pr_info("expires=%lu\n", fd_timeout.expires - jiffies);
1873                 pr_info("now=%lu\n", jiffies);
1874         }
1875         pr_info("cont=%p\n", cont);
1876         pr_info("current_req=%p\n", current_req);
1877         pr_info("command_status=%d\n", command_status);
1878         pr_info("\n");
1879 }
1880
1881 static void floppy_shutdown(unsigned long data)
1882 {
1883         unsigned long flags;
1884
1885         if (!initialising)
1886                 show_floppy();
1887         cancel_activity();
1888
1889         floppy_enable_hlt();
1890
1891         flags = claim_dma_lock();
1892         fd_disable_dma();
1893         release_dma_lock(flags);
1894
1895         /* avoid dma going to a random drive after shutdown */
1896
1897         if (!initialising)
1898                 DPRINT("floppy timeout called\n");
1899         FDCS->reset = 1;
1900         if (cont) {
1901                 cont->done(0);
1902                 cont->redo();   /* this will recall reset when needed */
1903         } else {
1904                 pr_info("no cont in shutdown!\n");
1905                 process_fd_request();
1906         }
1907         is_alive("floppy shutdown");
1908 }
1909
1910 /* start motor, check media-changed condition and write protection */
1911 static int start_motor(void (*function)(void))
1912 {
1913         int mask;
1914         int data;
1915
1916         mask = 0xfc;
1917         data = UNIT(current_drive);
1918         if (!(raw_cmd->flags & FD_RAW_NO_MOTOR)) {
1919                 if (!(FDCS->dor & (0x10 << UNIT(current_drive)))) {
1920                         set_debugt();
1921                         /* no read since this drive is running */
1922                         DRS->first_read_date = 0;
1923                         /* note motor start time if motor is not yet running */
1924                         DRS->spinup_date = jiffies;
1925                         data |= (0x10 << UNIT(current_drive));
1926                 }
1927         } else if (FDCS->dor & (0x10 << UNIT(current_drive)))
1928                 mask &= ~(0x10 << UNIT(current_drive));
1929
1930         /* starts motor and selects floppy */
1931         del_timer(motor_off_timer + current_drive);
1932         set_dor(fdc, mask, data);
1933
1934         /* wait_for_completion also schedules reset if needed. */
1935         return fd_wait_for_completion(DRS->select_date + DP->select_delay,
1936                                       (timeout_fn)function);
1937 }
1938
1939 static void floppy_ready(void)
1940 {
1941         if (FDCS->reset) {
1942                 reset_fdc();
1943                 return;
1944         }
1945         if (start_motor(floppy_ready))
1946                 return;
1947         if (fdc_dtr())
1948                 return;
1949
1950         debug_dcl(DP->flags, "calling disk change from floppy_ready\n");
1951         if (!(raw_cmd->flags & FD_RAW_NO_MOTOR) &&
1952             disk_change(current_drive) && !DP->select_delay)
1953                 twaddle();      /* this clears the dcl on certain
1954                                  * drive/controller combinations */
1955
1956 #ifdef fd_chose_dma_mode
1957         if ((raw_cmd->flags & FD_RAW_READ) || (raw_cmd->flags & FD_RAW_WRITE)) {
1958                 unsigned long flags = claim_dma_lock();
1959                 fd_chose_dma_mode(raw_cmd->kernel_data, raw_cmd->length);
1960                 release_dma_lock(flags);
1961         }
1962 #endif
1963
1964         if (raw_cmd->flags & (FD_RAW_NEED_SEEK | FD_RAW_NEED_DISK)) {
1965                 perpendicular_mode();
1966                 fdc_specify();  /* must be done here because of hut, hlt ... */
1967                 seek_floppy();
1968         } else {
1969                 if ((raw_cmd->flags & FD_RAW_READ) ||
1970                     (raw_cmd->flags & FD_RAW_WRITE))
1971                         fdc_specify();
1972                 setup_rw_floppy();
1973         }
1974 }
1975
1976 static void floppy_start(void)
1977 {
1978         reschedule_timeout(current_reqD, "floppy start", 0);
1979
1980         scandrives();
1981         debug_dcl(DP->flags, "setting NEWCHANGE in floppy_start\n");
1982         set_bit(FD_DISK_NEWCHANGE_BIT, &DRS->flags);
1983         floppy_ready();
1984 }
1985
1986 /*
1987  * ========================================================================
1988  * here ends the bottom half. Exported routines are:
1989  * floppy_start, floppy_off, floppy_ready, lock_fdc, unlock_fdc, set_fdc,
1990  * start_motor, reset_fdc, reset_fdc_info, interpret_errors.
1991  * Initialization also uses output_byte, result, set_dor, floppy_interrupt
1992  * and set_dor.
1993  * ========================================================================
1994  */
1995 /*
1996  * General purpose continuations.
1997  * ==============================
1998  */
1999
2000 static void do_wakeup(void)
2001 {
2002         reschedule_timeout(MAXTIMEOUT, "do wakeup", 0);
2003         cont = NULL;
2004         command_status += 2;
2005         wake_up(&command_done);
2006 }
2007
2008 static struct cont_t wakeup_cont = {
2009         .interrupt      = empty,
2010         .redo           = do_wakeup,
2011         .error          = empty,
2012         .done           = (done_f)empty
2013 };
2014
2015 static struct cont_t intr_cont = {
2016         .interrupt      = empty,
2017         .redo           = process_fd_request,
2018         .error          = empty,
2019         .done           = (done_f)empty
2020 };
2021
2022 static int wait_til_done(void (*handler)(void), bool interruptible)
2023 {
2024         int ret;
2025
2026         schedule_bh(handler);
2027
2028         if (command_status < 2 && NO_SIGNAL) {
2029                 DECLARE_WAITQUEUE(wait, current);
2030
2031                 add_wait_queue(&command_done, &wait);
2032                 for (;;) {
2033                         set_current_state(interruptible ?
2034                                           TASK_INTERRUPTIBLE :
2035                                           TASK_UNINTERRUPTIBLE);
2036
2037                         if (command_status >= 2 || !NO_SIGNAL)
2038                                 break;
2039
2040                         is_alive("wait_til_done");
2041                         schedule();
2042                 }
2043
2044                 set_current_state(TASK_RUNNING);
2045                 remove_wait_queue(&command_done, &wait);
2046         }
2047
2048         if (command_status < 2) {
2049                 cancel_activity();
2050                 cont = &intr_cont;
2051                 reset_fdc();
2052                 return -EINTR;
2053         }
2054
2055         if (FDCS->reset)
2056                 command_status = FD_COMMAND_ERROR;
2057         if (command_status == FD_COMMAND_OKAY)
2058                 ret = 0;
2059         else
2060                 ret = -EIO;
2061         command_status = FD_COMMAND_NONE;
2062         return ret;
2063 }
2064
2065 static void generic_done(int result)
2066 {
2067         command_status = result;
2068         cont = &wakeup_cont;
2069 }
2070
2071 static void generic_success(void)
2072 {
2073         cont->done(1);
2074 }
2075
2076 static void generic_failure(void)
2077 {
2078         cont->done(0);
2079 }
2080
2081 static void success_and_wakeup(void)
2082 {
2083         generic_success();
2084         cont->redo();
2085 }
2086
2087 /*
2088  * formatting and rw support.
2089  * ==========================
2090  */
2091
2092 static int next_valid_format(void)
2093 {
2094         int probed_format;
2095
2096         probed_format = DRS->probed_format;
2097         while (1) {
2098                 if (probed_format >= 8 || !DP->autodetect[probed_format]) {
2099                         DRS->probed_format = 0;
2100                         return 1;
2101                 }
2102                 if (floppy_type[DP->autodetect[probed_format]].sect) {
2103                         DRS->probed_format = probed_format;
2104                         return 0;
2105                 }
2106                 probed_format++;
2107         }
2108 }
2109
2110 static void bad_flp_intr(void)
2111 {
2112         int err_count;
2113
2114         if (probing) {
2115                 DRS->probed_format++;
2116                 if (!next_valid_format())
2117                         return;
2118         }
2119         err_count = ++(*errors);
2120         INFBOUND(DRWE->badness, err_count);
2121         if (err_count > DP->max_errors.abort)
2122                 cont->done(0);
2123         if (err_count > DP->max_errors.reset)
2124                 FDCS->reset = 1;
2125         else if (err_count > DP->max_errors.recal)
2126                 DRS->track = NEED_2_RECAL;
2127 }
2128
2129 static void set_floppy(int drive)
2130 {
2131         int type = ITYPE(UDRS->fd_device);
2132
2133         if (type)
2134                 _floppy = floppy_type + type;
2135         else
2136                 _floppy = current_type[drive];
2137 }
2138
2139 /*
2140  * formatting support.
2141  * ===================
2142  */
2143 static void format_interrupt(void)
2144 {
2145         switch (interpret_errors()) {
2146         case 1:
2147                 cont->error();
2148         case 2:
2149                 break;
2150         case 0:
2151                 cont->done(1);
2152         }
2153         cont->redo();
2154 }
2155
2156 #define CODE2SIZE (ssize = ((1 << SIZECODE) + 3) >> 2)
2157 #define FM_MODE(x, y) ((y) & ~(((x)->rate & 0x80) >> 1))
2158 #define CT(x) ((x) | 0xc0)
2159
2160 static void setup_format_params(int track)
2161 {
2162         int n;
2163         int il;
2164         int count;
2165         int head_shift;
2166         int track_shift;
2167         struct fparm {
2168                 unsigned char track, head, sect, size;
2169         } *here = (struct fparm *)floppy_track_buffer;
2170
2171         raw_cmd = &default_raw_cmd;
2172         raw_cmd->track = track;
2173
2174         raw_cmd->flags = (FD_RAW_WRITE | FD_RAW_INTR | FD_RAW_SPIN |
2175                           FD_RAW_NEED_DISK | FD_RAW_NEED_SEEK);
2176         raw_cmd->rate = _floppy->rate & 0x43;
2177         raw_cmd->cmd_count = NR_F;
2178         COMMAND = FM_MODE(_floppy, FD_FORMAT);
2179         DR_SELECT = UNIT(current_drive) + PH_HEAD(_floppy, format_req.head);
2180         F_SIZECODE = FD_SIZECODE(_floppy);
2181         F_SECT_PER_TRACK = _floppy->sect << 2 >> F_SIZECODE;
2182         F_GAP = _floppy->fmt_gap;
2183         F_FILL = FD_FILL_BYTE;
2184
2185         raw_cmd->kernel_data = floppy_track_buffer;
2186         raw_cmd->length = 4 * F_SECT_PER_TRACK;
2187
2188         /* allow for about 30ms for data transport per track */
2189         head_shift = (F_SECT_PER_TRACK + 5) / 6;
2190
2191         /* a ``cylinder'' is two tracks plus a little stepping time */
2192         track_shift = 2 * head_shift + 3;
2193
2194         /* position of logical sector 1 on this track */
2195         n = (track_shift * format_req.track + head_shift * format_req.head)
2196             % F_SECT_PER_TRACK;
2197
2198         /* determine interleave */
2199         il = 1;
2200         if (_floppy->fmt_gap < 0x22)
2201                 il++;
2202
2203         /* initialize field */
2204         for (count = 0; count < F_SECT_PER_TRACK; ++count) {
2205                 here[count].track = format_req.track;
2206                 here[count].head = format_req.head;
2207                 here[count].sect = 0;
2208                 here[count].size = F_SIZECODE;
2209         }
2210         /* place logical sectors */
2211         for (count = 1; count <= F_SECT_PER_TRACK; ++count) {
2212                 here[n].sect = count;
2213                 n = (n + il) % F_SECT_PER_TRACK;
2214                 if (here[n].sect) {     /* sector busy, find next free sector */
2215                         ++n;
2216                         if (n >= F_SECT_PER_TRACK) {
2217                                 n -= F_SECT_PER_TRACK;
2218                                 while (here[n].sect)
2219                                         ++n;
2220                         }
2221                 }
2222         }
2223         if (_floppy->stretch & FD_SECTBASEMASK) {
2224                 for (count = 0; count < F_SECT_PER_TRACK; count++)
2225                         here[count].sect += FD_SECTBASE(_floppy) - 1;
2226         }
2227 }
2228
2229 static void redo_format(void)
2230 {
2231         buffer_track = -1;
2232         setup_format_params(format_req.track << STRETCH(_floppy));
2233         floppy_start();
2234         debugt("queue format request");
2235 }
2236
2237 static struct cont_t format_cont = {
2238         .interrupt      = format_interrupt,
2239         .redo           = redo_format,
2240         .error          = bad_flp_intr,
2241         .done           = generic_done
2242 };
2243
2244 static int do_format(int drive, struct format_descr *tmp_format_req)
2245 {
2246         int ret;
2247
2248         if (lock_fdc(drive, true))
2249                 return -EINTR;
2250
2251         set_floppy(drive);
2252         if (!_floppy ||
2253             _floppy->track > DP->tracks ||
2254             tmp_format_req->track >= _floppy->track ||
2255             tmp_format_req->head >= _floppy->head ||
2256             (_floppy->sect << 2) % (1 << FD_SIZECODE(_floppy)) ||
2257             !_floppy->fmt_gap) {
2258                 process_fd_request();
2259                 return -EINVAL;
2260         }
2261         format_req = *tmp_format_req;
2262         format_errors = 0;
2263         cont = &format_cont;
2264         errors = &format_errors;
2265         ret = wait_til_done(redo_format, true);
2266         if (ret == -EINTR)
2267                 return -EINTR;
2268         process_fd_request();
2269         return ret;
2270 }
2271
2272 /*
2273  * Buffer read/write and support
2274  * =============================
2275  */
2276
2277 static void floppy_end_request(struct request *req, int error)
2278 {
2279         unsigned int nr_sectors = current_count_sectors;
2280         unsigned int drive = (unsigned long)req->rq_disk->private_data;
2281
2282         /* current_count_sectors can be zero if transfer failed */
2283         if (error)
2284                 nr_sectors = blk_rq_cur_sectors(req);
2285         if (__blk_end_request(req, error, nr_sectors << 9))
2286                 return;
2287
2288         /* We're done with the request */
2289         floppy_off(drive);
2290         current_req = NULL;
2291 }
2292
2293 /* new request_done. Can handle physical sectors which are smaller than a
2294  * logical buffer */
2295 static void request_done(int uptodate)
2296 {
2297         struct request_queue *q = floppy_queue;
2298         struct request *req = current_req;
2299         unsigned long flags;
2300         int block;
2301
2302         probing = 0;
2303         reschedule_timeout(MAXTIMEOUT, "request done", uptodate);
2304
2305         if (!req) {
2306                 pr_info("floppy.c: no request in request_done\n");
2307                 return;
2308         }
2309
2310         if (uptodate) {
2311                 /* maintain values for invalidation on geometry
2312                  * change */
2313                 block = current_count_sectors + blk_rq_pos(req);
2314                 INFBOUND(DRS->maxblock, block);
2315                 if (block > _floppy->sect)
2316                         DRS->maxtrack = 1;
2317
2318                 /* unlock chained buffers */
2319                 spin_lock_irqsave(q->queue_lock, flags);
2320                 floppy_end_request(req, 0);
2321                 spin_unlock_irqrestore(q->queue_lock, flags);
2322         } else {
2323                 if (rq_data_dir(req) == WRITE) {
2324                         /* record write error information */
2325                         DRWE->write_errors++;
2326                         if (DRWE->write_errors == 1) {
2327                                 DRWE->first_error_sector = blk_rq_pos(req);
2328                                 DRWE->first_error_generation = DRS->generation;
2329                         }
2330                         DRWE->last_error_sector = blk_rq_pos(req);
2331                         DRWE->last_error_generation = DRS->generation;
2332                 }
2333                 spin_lock_irqsave(q->queue_lock, flags);
2334                 floppy_end_request(req, -EIO);
2335                 spin_unlock_irqrestore(q->queue_lock, flags);
2336         }
2337 }
2338
2339 /* Interrupt handler evaluating the result of the r/w operation */
2340 static void rw_interrupt(void)
2341 {
2342         int eoc;
2343         int ssize;
2344         int heads;
2345         int nr_sectors;
2346
2347         if (R_HEAD >= 2) {
2348                 /* some Toshiba floppy controllers occasionnally seem to
2349                  * return bogus interrupts after read/write operations, which
2350                  * can be recognized by a bad head number (>= 2) */
2351                 return;
2352         }
2353
2354         if (!DRS->first_read_date)
2355                 DRS->first_read_date = jiffies;
2356
2357         nr_sectors = 0;
2358         CODE2SIZE;
2359
2360         if (ST1 & ST1_EOC)
2361                 eoc = 1;
2362         else
2363                 eoc = 0;
2364
2365         if (COMMAND & 0x80)
2366                 heads = 2;
2367         else
2368                 heads = 1;
2369
2370         nr_sectors = (((R_TRACK - TRACK) * heads +
2371                        R_HEAD - HEAD) * SECT_PER_TRACK +
2372                       R_SECTOR - SECTOR + eoc) << SIZECODE >> 2;
2373
2374 #ifdef FLOPPY_SANITY_CHECK
2375         if (nr_sectors / ssize >
2376             DIV_ROUND_UP(in_sector_offset + current_count_sectors, ssize)) {
2377                 DPRINT("long rw: %x instead of %lx\n",
2378                        nr_sectors, current_count_sectors);
2379                 pr_info("rs=%d s=%d\n", R_SECTOR, SECTOR);
2380                 pr_info("rh=%d h=%d\n", R_HEAD, HEAD);
2381                 pr_info("rt=%d t=%d\n", R_TRACK, TRACK);
2382                 pr_info("heads=%d eoc=%d\n", heads, eoc);
2383                 pr_info("spt=%d st=%d ss=%d\n",
2384                         SECT_PER_TRACK, fsector_t, ssize);
2385                 pr_info("in_sector_offset=%d\n", in_sector_offset);
2386         }
2387 #endif
2388
2389         nr_sectors -= in_sector_offset;
2390         INFBOUND(nr_sectors, 0);
2391         SUPBOUND(current_count_sectors, nr_sectors);
2392
2393         switch (interpret_errors()) {
2394         case 2:
2395                 cont->redo();
2396                 return;
2397         case 1:
2398                 if (!current_count_sectors) {
2399                         cont->error();
2400                         cont->redo();
2401                         return;
2402                 }
2403                 break;
2404         case 0:
2405                 if (!current_count_sectors) {
2406                         cont->redo();
2407                         return;
2408                 }
2409                 current_type[current_drive] = _floppy;
2410                 floppy_sizes[TOMINOR(current_drive)] = _floppy->size;
2411                 break;
2412         }
2413
2414         if (probing) {
2415                 if (DP->flags & FTD_MSG)
2416                         DPRINT("Auto-detected floppy type %s in fd%d\n",
2417                                _floppy->name, current_drive);
2418                 current_type[current_drive] = _floppy;
2419                 floppy_sizes[TOMINOR(current_drive)] = _floppy->size;
2420                 probing = 0;
2421         }
2422
2423         if (CT(COMMAND) != FD_READ ||
2424             raw_cmd->kernel_data == current_req->buffer) {
2425                 /* transfer directly from buffer */
2426                 cont->done(1);
2427         } else if (CT(COMMAND) == FD_READ) {
2428                 buffer_track = raw_cmd->track;
2429                 buffer_drive = current_drive;
2430                 INFBOUND(buffer_max, nr_sectors + fsector_t);
2431         }
2432         cont->redo();
2433 }
2434
2435 /* Compute maximal contiguous buffer size. */
2436 static int buffer_chain_size(void)
2437 {
2438         struct bio_vec *bv;
2439         int size;
2440         struct req_iterator iter;
2441         char *base;
2442
2443         base = bio_data(current_req->bio);
2444         size = 0;
2445
2446         rq_for_each_segment(bv, current_req, iter) {
2447                 if (page_address(bv->bv_page) + bv->bv_offset != base + size)
2448                         break;
2449
2450                 size += bv->bv_len;
2451         }
2452
2453         return size >> 9;
2454 }
2455
2456 /* Compute the maximal transfer size */
2457 static int transfer_size(int ssize, int max_sector, int max_size)
2458 {
2459         SUPBOUND(max_sector, fsector_t + max_size);
2460
2461         /* alignment */
2462         max_sector -= (max_sector % _floppy->sect) % ssize;
2463
2464         /* transfer size, beginning not aligned */
2465         current_count_sectors = max_sector - fsector_t;
2466
2467         return max_sector;
2468 }
2469
2470 /*
2471  * Move data from/to the track buffer to/from the buffer cache.
2472  */
2473 static void copy_buffer(int ssize, int max_sector, int max_sector_2)
2474 {
2475         int remaining;          /* number of transferred 512-byte sectors */
2476         struct bio_vec *bv;
2477         char *buffer;
2478         char *dma_buffer;
2479         int size;
2480         struct req_iterator iter;
2481
2482         max_sector = transfer_size(ssize,
2483                                    min(max_sector, max_sector_2),
2484                                    blk_rq_sectors(current_req));
2485
2486         if (current_count_sectors <= 0 && CT(COMMAND) == FD_WRITE &&
2487             buffer_max > fsector_t + blk_rq_sectors(current_req))
2488                 current_count_sectors = min_t(int, buffer_max - fsector_t,
2489                                               blk_rq_sectors(current_req));
2490
2491         remaining = current_count_sectors << 9;
2492 #ifdef FLOPPY_SANITY_CHECK
2493         if (remaining > blk_rq_bytes(current_req) && CT(COMMAND) == FD_WRITE) {
2494                 DPRINT("in copy buffer\n");
2495                 pr_info("current_count_sectors=%ld\n", current_count_sectors);
2496                 pr_info("remaining=%d\n", remaining >> 9);
2497                 pr_info("current_req->nr_sectors=%u\n",
2498                         blk_rq_sectors(current_req));
2499                 pr_info("current_req->current_nr_sectors=%u\n",
2500                         blk_rq_cur_sectors(current_req));
2501                 pr_info("max_sector=%d\n", max_sector);
2502                 pr_info("ssize=%d\n", ssize);
2503         }
2504 #endif
2505
2506         buffer_max = max(max_sector, buffer_max);
2507
2508         dma_buffer = floppy_track_buffer + ((fsector_t - buffer_min) << 9);
2509
2510         size = blk_rq_cur_bytes(current_req);
2511
2512         rq_for_each_segment(bv, current_req, iter) {
2513                 if (!remaining)
2514                         break;
2515
2516                 size = bv->bv_len;
2517                 SUPBOUND(size, remaining);
2518
2519                 buffer = page_address(bv->bv_page) + bv->bv_offset;
2520 #ifdef FLOPPY_SANITY_CHECK
2521                 if (dma_buffer + size >
2522                     floppy_track_buffer + (max_buffer_sectors << 10) ||
2523                     dma_buffer < floppy_track_buffer) {
2524                         DPRINT("buffer overrun in copy buffer %d\n",
2525                                (int)((floppy_track_buffer - dma_buffer) >> 9));
2526                         pr_info("fsector_t=%d buffer_min=%d\n",
2527                                 fsector_t, buffer_min);
2528                         pr_info("current_count_sectors=%ld\n",
2529                                 current_count_sectors);
2530                         if (CT(COMMAND) == FD_READ)
2531                                 pr_info("read\n");
2532                         if (CT(COMMAND) == FD_WRITE)
2533                                 pr_info("write\n");
2534                         break;
2535                 }
2536                 if (((unsigned long)buffer) % 512)
2537                         DPRINT("%p buffer not aligned\n", buffer);
2538 #endif
2539                 if (CT(COMMAND) == FD_READ)
2540                         memcpy(buffer, dma_buffer, size);
2541                 else
2542                         memcpy(dma_buffer, buffer, size);
2543
2544                 remaining -= size;
2545                 dma_buffer += size;
2546         }
2547 #ifdef FLOPPY_SANITY_CHECK
2548         if (remaining) {
2549                 if (remaining > 0)
2550                         max_sector -= remaining >> 9;
2551                 DPRINT("weirdness: remaining %d\n", remaining >> 9);
2552         }
2553 #endif
2554 }
2555
2556 /* work around a bug in pseudo DMA
2557  * (on some FDCs) pseudo DMA does not stop when the CPU stops
2558  * sending data.  Hence we need a different way to signal the
2559  * transfer length:  We use SECT_PER_TRACK.  Unfortunately, this
2560  * does not work with MT, hence we can only transfer one head at
2561  * a time
2562  */
2563 static void virtualdmabug_workaround(void)
2564 {
2565         int hard_sectors;
2566         int end_sector;
2567
2568         if (CT(COMMAND) == FD_WRITE) {
2569                 COMMAND &= ~0x80;       /* switch off multiple track mode */
2570
2571                 hard_sectors = raw_cmd->length >> (7 + SIZECODE);
2572                 end_sector = SECTOR + hard_sectors - 1;
2573 #ifdef FLOPPY_SANITY_CHECK
2574                 if (end_sector > SECT_PER_TRACK) {
2575                         pr_info("too many sectors %d > %d\n",
2576                                 end_sector, SECT_PER_TRACK);
2577                         return;
2578                 }
2579 #endif
2580                 SECT_PER_TRACK = end_sector;
2581                                         /* make sure SECT_PER_TRACK
2582                                          * points to end of transfer */
2583         }
2584 }
2585
2586 /*
2587  * Formulate a read/write request.
2588  * this routine decides where to load the data (directly to buffer, or to
2589  * tmp floppy area), how much data to load (the size of the buffer, the whole
2590  * track, or a single sector)
2591  * All floppy_track_buffer handling goes in here. If we ever add track buffer
2592  * allocation on the fly, it should be done here. No other part should need
2593  * modification.
2594  */
2595
2596 static int make_raw_rw_request(void)
2597 {
2598         int aligned_sector_t;
2599         int max_sector;
2600         int max_size;
2601         int tracksize;
2602         int ssize;
2603
2604         if (max_buffer_sectors == 0) {
2605                 pr_info("VFS: Block I/O scheduled on unopened device\n");
2606                 return 0;
2607         }
2608
2609         set_fdc((long)current_req->rq_disk->private_data);
2610
2611         raw_cmd = &default_raw_cmd;
2612         raw_cmd->flags = FD_RAW_SPIN | FD_RAW_NEED_DISK | FD_RAW_NEED_DISK |
2613             FD_RAW_NEED_SEEK;
2614         raw_cmd->cmd_count = NR_RW;
2615         if (rq_data_dir(current_req) == READ) {
2616                 raw_cmd->flags |= FD_RAW_READ;
2617                 COMMAND = FM_MODE(_floppy, FD_READ);
2618         } else if (rq_data_dir(current_req) == WRITE) {
2619                 raw_cmd->flags |= FD_RAW_WRITE;
2620                 COMMAND = FM_MODE(_floppy, FD_WRITE);
2621         } else {
2622                 DPRINT("make_raw_rw_request: unknown command\n");
2623                 return 0;
2624         }
2625
2626         max_sector = _floppy->sect * _floppy->head;
2627
2628         TRACK = (int)blk_rq_pos(current_req) / max_sector;
2629         fsector_t = (int)blk_rq_pos(current_req) % max_sector;
2630         if (_floppy->track && TRACK >= _floppy->track) {
2631                 if (blk_rq_cur_sectors(current_req) & 1) {
2632                         current_count_sectors = 1;
2633                         return 1;
2634                 } else
2635                         return 0;
2636         }
2637         HEAD = fsector_t / _floppy->sect;
2638
2639         if (((_floppy->stretch & (FD_SWAPSIDES | FD_SECTBASEMASK)) ||
2640              test_bit(FD_NEED_TWADDLE_BIT, &DRS->flags)) &&
2641             fsector_t < _floppy->sect)
2642                 max_sector = _floppy->sect;
2643
2644         /* 2M disks have phantom sectors on the first track */
2645         if ((_floppy->rate & FD_2M) && (!TRACK) && (!HEAD)) {
2646                 max_sector = 2 * _floppy->sect / 3;
2647                 if (fsector_t >= max_sector) {
2648                         current_count_sectors =
2649                             min_t(int, _floppy->sect - fsector_t,
2650                                   blk_rq_sectors(current_req));
2651                         return 1;
2652                 }
2653                 SIZECODE = 2;
2654         } else
2655                 SIZECODE = FD_SIZECODE(_floppy);
2656         raw_cmd->rate = _floppy->rate & 0x43;
2657         if ((_floppy->rate & FD_2M) && (TRACK || HEAD) && raw_cmd->rate == 2)
2658                 raw_cmd->rate = 1;
2659
2660         if (SIZECODE)
2661                 SIZECODE2 = 0xff;
2662         else
2663                 SIZECODE2 = 0x80;
2664         raw_cmd->track = TRACK << STRETCH(_floppy);
2665         DR_SELECT = UNIT(current_drive) + PH_HEAD(_floppy, HEAD);
2666         GAP = _floppy->gap;
2667         CODE2SIZE;
2668         SECT_PER_TRACK = _floppy->sect << 2 >> SIZECODE;
2669         SECTOR = ((fsector_t % _floppy->sect) << 2 >> SIZECODE) +
2670             FD_SECTBASE(_floppy);
2671
2672         /* tracksize describes the size which can be filled up with sectors
2673          * of size ssize.
2674          */
2675         tracksize = _floppy->sect - _floppy->sect % ssize;
2676         if (tracksize < _floppy->sect) {
2677                 SECT_PER_TRACK++;
2678                 if (tracksize <= fsector_t % _floppy->sect)
2679                         SECTOR--;
2680
2681                 /* if we are beyond tracksize, fill up using smaller sectors */
2682                 while (tracksize <= fsector_t % _floppy->sect) {
2683                         while (tracksize + ssize > _floppy->sect) {
2684                                 SIZECODE--;
2685                                 ssize >>= 1;
2686                         }
2687                         SECTOR++;
2688                         SECT_PER_TRACK++;
2689                         tracksize += ssize;
2690                 }
2691                 max_sector = HEAD * _floppy->sect + tracksize;
2692         } else if (!TRACK && !HEAD && !(_floppy->rate & FD_2M) && probing) {
2693                 max_sector = _floppy->sect;
2694         } else if (!HEAD && CT(COMMAND) == FD_WRITE) {
2695                 /* for virtual DMA bug workaround */
2696                 max_sector = _floppy->sect;
2697         }
2698
2699         in_sector_offset = (fsector_t % _floppy->sect) % ssize;
2700         aligned_sector_t = fsector_t - in_sector_offset;
2701         max_size = blk_rq_sectors(current_req);
2702         if ((raw_cmd->track == buffer_track) &&
2703             (current_drive == buffer_drive) &&
2704             (fsector_t >= buffer_min) && (fsector_t < buffer_max)) {
2705                 /* data already in track buffer */
2706                 if (CT(COMMAND) == FD_READ) {
2707                         copy_buffer(1, max_sector, buffer_max);
2708                         return 1;
2709                 }
2710         } else if (in_sector_offset || blk_rq_sectors(current_req) < ssize) {
2711                 if (CT(COMMAND) == FD_WRITE) {
2712                         unsigned int sectors;
2713
2714                         sectors = fsector_t + blk_rq_sectors(current_req);
2715                         if (sectors > ssize && sectors < ssize + ssize)
2716                                 max_size = ssize + ssize;
2717                         else
2718                                 max_size = ssize;
2719                 }
2720                 raw_cmd->flags &= ~FD_RAW_WRITE;
2721                 raw_cmd->flags |= FD_RAW_READ;
2722                 COMMAND = FM_MODE(_floppy, FD_READ);
2723         } else if ((unsigned long)current_req->buffer < MAX_DMA_ADDRESS) {
2724                 unsigned long dma_limit;
2725                 int direct, indirect;
2726
2727                 indirect =
2728                     transfer_size(ssize, max_sector,
2729                                   max_buffer_sectors * 2) - fsector_t;
2730
2731                 /*
2732                  * Do NOT use minimum() here---MAX_DMA_ADDRESS is 64 bits wide
2733                  * on a 64 bit machine!
2734                  */
2735                 max_size = buffer_chain_size();
2736                 dma_limit = (MAX_DMA_ADDRESS -
2737                              ((unsigned long)current_req->buffer)) >> 9;
2738                 if ((unsigned long)max_size > dma_limit)
2739                         max_size = dma_limit;
2740                 /* 64 kb boundaries */
2741                 if (CROSS_64KB(current_req->buffer, max_size << 9))
2742                         max_size = (K_64 -
2743                                     ((unsigned long)current_req->buffer) %
2744                                     K_64) >> 9;
2745                 direct = transfer_size(ssize, max_sector, max_size) - fsector_t;
2746                 /*
2747                  * We try to read tracks, but if we get too many errors, we
2748                  * go back to reading just one sector at a time.
2749                  *
2750                  * This means we should be able to read a sector even if there
2751                  * are other bad sectors on this track.
2752                  */
2753                 if (!direct ||
2754                     (indirect * 2 > direct * 3 &&
2755                      *errors < DP->max_errors.read_track &&
2756                      ((!probing ||
2757                        (DP->read_track & (1 << DRS->probed_format)))))) {
2758                         max_size = blk_rq_sectors(current_req);
2759                 } else {
2760                         raw_cmd->kernel_data = current_req->buffer;
2761                         raw_cmd->length = current_count_sectors << 9;
2762                         if (raw_cmd->length == 0) {
2763                                 DPRINT("zero dma transfer attempted from make_raw_request\n");
2764                                 DPRINT("indirect=%d direct=%d fsector_t=%d\n",
2765                                        indirect, direct, fsector_t);
2766                                 return 0;
2767                         }
2768                         virtualdmabug_workaround();
2769                         return 2;
2770                 }
2771         }
2772
2773         if (CT(COMMAND) == FD_READ)
2774                 max_size = max_sector;  /* unbounded */
2775
2776         /* claim buffer track if needed */
2777         if (buffer_track != raw_cmd->track ||   /* bad track */
2778             buffer_drive != current_drive ||    /* bad drive */
2779             fsector_t > buffer_max ||
2780             fsector_t < buffer_min ||
2781             ((CT(COMMAND) == FD_READ ||
2782               (!in_sector_offset && blk_rq_sectors(current_req) >= ssize)) &&
2783              max_sector > 2 * max_buffer_sectors + buffer_min &&
2784              max_size + fsector_t > 2 * max_buffer_sectors + buffer_min)) {
2785                 /* not enough space */
2786                 buffer_track = -1;
2787                 buffer_drive = current_drive;
2788                 buffer_max = buffer_min = aligned_sector_t;
2789         }
2790         raw_cmd->kernel_data = floppy_track_buffer +
2791                 ((aligned_sector_t - buffer_min) << 9);
2792
2793         if (CT(COMMAND) == FD_WRITE) {
2794                 /* copy write buffer to track buffer.
2795                  * if we get here, we know that the write
2796                  * is either aligned or the data already in the buffer
2797                  * (buffer will be overwritten) */
2798 #ifdef FLOPPY_SANITY_CHECK
2799                 if (in_sector_offset && buffer_track == -1)
2800                         DPRINT("internal error offset !=0 on write\n");
2801 #endif
2802                 buffer_track = raw_cmd->track;
2803                 buffer_drive = current_drive;
2804                 copy_buffer(ssize, max_sector,
2805                             2 * max_buffer_sectors + buffer_min);
2806         } else
2807                 transfer_size(ssize, max_sector,
2808                               2 * max_buffer_sectors + buffer_min -
2809                               aligned_sector_t);
2810
2811         /* round up current_count_sectors to get dma xfer size */
2812         raw_cmd->length = in_sector_offset + current_count_sectors;
2813         raw_cmd->length = ((raw_cmd->length - 1) | (ssize - 1)) + 1;
2814         raw_cmd->length <<= 9;
2815 #ifdef FLOPPY_SANITY_CHECK
2816         if ((raw_cmd->length < current_count_sectors << 9) ||
2817             (raw_cmd->kernel_data != current_req->buffer &&
2818              CT(COMMAND) == FD_WRITE &&
2819              (aligned_sector_t + (raw_cmd->length >> 9) > buffer_max ||
2820               aligned_sector_t < buffer_min)) ||
2821             raw_cmd->length % (128 << SIZECODE) ||
2822             raw_cmd->length <= 0 || current_count_sectors <= 0) {
2823                 DPRINT("fractionary current count b=%lx s=%lx\n",
2824                        raw_cmd->length, current_count_sectors);
2825                 if (raw_cmd->kernel_data != current_req->buffer)
2826                         pr_info("addr=%d, length=%ld\n",
2827                                 (int)((raw_cmd->kernel_data -
2828                                        floppy_track_buffer) >> 9),
2829                                 current_count_sectors);
2830                 pr_info("st=%d ast=%d mse=%d msi=%d\n",
2831                         fsector_t, aligned_sector_t, max_sector, max_size);
2832                 pr_info("ssize=%x SIZECODE=%d\n", ssize, SIZECODE);
2833                 pr_info("command=%x SECTOR=%d HEAD=%d, TRACK=%d\n",
2834                         COMMAND, SECTOR, HEAD, TRACK);
2835                 pr_info("buffer drive=%d\n", buffer_drive);
2836                 pr_info("buffer track=%d\n", buffer_track);
2837                 pr_info("buffer_min=%d\n", buffer_min);
2838                 pr_info("buffer_max=%d\n", buffer_max);
2839                 return 0;
2840         }
2841
2842         if (raw_cmd->kernel_data != current_req->buffer) {
2843                 if (raw_cmd->kernel_data < floppy_track_buffer ||
2844                     current_count_sectors < 0 ||
2845                     raw_cmd->length < 0 ||
2846                     raw_cmd->kernel_data + raw_cmd->length >
2847                     floppy_track_buffer + (max_buffer_sectors << 10)) {
2848                         DPRINT("buffer overrun in schedule dma\n");
2849                         pr_info("fsector_t=%d buffer_min=%d current_count=%ld\n",
2850                                 fsector_t, buffer_min, raw_cmd->length >> 9);
2851                         pr_info("current_count_sectors=%ld\n",
2852                                 current_count_sectors);
2853                         if (CT(COMMAND) == FD_READ)
2854                                 pr_info("read\n");
2855                         if (CT(COMMAND) == FD_WRITE)
2856                                 pr_info("write\n");
2857                         return 0;
2858                 }
2859         } else if (raw_cmd->length > blk_rq_bytes(current_req) ||
2860                    current_count_sectors > blk_rq_sectors(current_req)) {
2861                 DPRINT("buffer overrun in direct transfer\n");
2862                 return 0;
2863         } else if (raw_cmd->length < current_count_sectors << 9) {
2864                 DPRINT("more sectors than bytes\n");
2865                 pr_info("bytes=%ld\n", raw_cmd->length >> 9);
2866                 pr_info("sectors=%ld\n", current_count_sectors);
2867         }
2868         if (raw_cmd->length == 0) {
2869                 DPRINT("zero dma transfer attempted from make_raw_request\n");
2870                 return 0;
2871         }
2872 #endif
2873
2874         virtualdmabug_workaround();
2875         return 2;
2876 }
2877
2878 static void redo_fd_request(void)
2879 {
2880 #define REPEAT {request_done(0); continue; }
2881         int drive;
2882         int tmp;
2883
2884         lastredo = jiffies;
2885         if (current_drive < N_DRIVE)
2886                 floppy_off(current_drive);
2887
2888         for (;;) {
2889                 if (!current_req) {
2890                         struct request *req;
2891
2892                         spin_lock_irq(floppy_queue->queue_lock);
2893                         req = blk_fetch_request(floppy_queue);
2894                         spin_unlock_irq(floppy_queue->queue_lock);
2895                         if (!req) {
2896                                 do_floppy = NULL;
2897                                 unlock_fdc();
2898                                 return;
2899                         }
2900                         current_req = req;
2901                 }
2902                 drive = (long)current_req->rq_disk->private_data;
2903                 set_fdc(drive);
2904                 reschedule_timeout(current_reqD, "redo fd request", 0);
2905
2906                 set_floppy(drive);
2907                 raw_cmd = &default_raw_cmd;
2908                 raw_cmd->flags = 0;
2909                 if (start_motor(redo_fd_request))
2910                         return;
2911                 disk_change(current_drive);
2912                 if (test_bit(current_drive, &fake_change) ||
2913                     test_bit(FD_DISK_CHANGED_BIT, &DRS->flags)) {
2914                         DPRINT("disk absent or changed during operation\n");
2915                         REPEAT;
2916                 }
2917                 if (!_floppy) { /* Autodetection */
2918                         if (!probing) {
2919                                 DRS->probed_format = 0;
2920                                 if (next_valid_format()) {
2921                                         DPRINT("no autodetectable formats\n");
2922                                         _floppy = NULL;
2923                                         REPEAT;
2924                                 }
2925                         }
2926                         probing = 1;
2927                         _floppy =
2928                             floppy_type + DP->autodetect[DRS->probed_format];
2929                 } else
2930                         probing = 0;
2931                 errors = &(current_req->errors);
2932                 tmp = make_raw_rw_request();
2933                 if (tmp < 2) {
2934                         request_done(tmp);
2935                         continue;
2936                 }
2937
2938                 if (test_bit(FD_NEED_TWADDLE_BIT, &DRS->flags))
2939                         twaddle();
2940                 schedule_bh(floppy_start);
2941                 debugt("queue fd request");
2942                 return;
2943         }
2944 #undef REPEAT
2945 }
2946
2947 static struct cont_t rw_cont = {
2948         .interrupt      = rw_interrupt,
2949         .redo           = redo_fd_request,
2950         .error          = bad_flp_intr,
2951         .done           = request_done
2952 };
2953
2954 static void process_fd_request(void)
2955 {
2956         cont = &rw_cont;
2957         schedule_bh(redo_fd_request);
2958 }
2959
2960 static void do_fd_request(struct request_queue *q)
2961 {
2962         if (max_buffer_sectors == 0) {
2963                 pr_info("VFS: do_fd_request called on non-open device\n");
2964                 return;
2965         }
2966
2967         if (usage_count == 0) {
2968                 pr_info("warning: usage count=0, current_req=%p exiting\n",
2969                         current_req);
2970                 pr_info("sect=%ld type=%x flags=%x\n",
2971                         (long)blk_rq_pos(current_req), current_req->cmd_type,
2972                         current_req->cmd_flags);
2973                 return;
2974         }
2975         if (test_bit(0, &fdc_busy)) {
2976                 /* fdc busy, this new request will be treated when the
2977                    current one is done */
2978                 is_alive("do fd request, old request running");
2979                 return;
2980         }
2981         lock_fdc(MAXTIMEOUT, false);
2982         process_fd_request();
2983         is_alive("do fd request");
2984 }
2985
2986 static struct cont_t poll_cont = {
2987         .interrupt      = success_and_wakeup,
2988         .redo           = floppy_ready,
2989         .error          = generic_failure,
2990         .done           = generic_done
2991 };
2992
2993 static int poll_drive(bool interruptible, int flag)
2994 {
2995         /* no auto-sense, just clear dcl */
2996         raw_cmd = &default_raw_cmd;
2997         raw_cmd->flags = flag;
2998         raw_cmd->track = 0;
2999         raw_cmd->cmd_count = 0;
3000         cont = &poll_cont;
3001         debug_dcl(DP->flags, "setting NEWCHANGE in poll_drive\n");
3002         set_bit(FD_DISK_NEWCHANGE_BIT, &DRS->flags);
3003
3004         return wait_til_done(floppy_ready, interruptible);
3005 }
3006
3007 /*
3008  * User triggered reset
3009  * ====================
3010  */
3011
3012 static void reset_intr(void)
3013 {
3014         pr_info("weird, reset interrupt called\n");
3015 }
3016
3017 static struct cont_t reset_cont = {
3018         .interrupt      = reset_intr,
3019         .redo           = success_and_wakeup,
3020         .error          = generic_failure,
3021         .done           = generic_done
3022 };
3023
3024 static int user_reset_fdc(int drive, int arg, bool interruptible)
3025 {
3026         int ret;
3027
3028         if (lock_fdc(drive, interruptible))
3029                 return -EINTR;
3030
3031         if (arg == FD_RESET_ALWAYS)
3032                 FDCS->reset = 1;
3033         if (FDCS->reset) {
3034                 cont = &reset_cont;
3035                 ret = wait_til_done(reset_fdc, interruptible);
3036                 if (ret == -EINTR)
3037                         return -EINTR;
3038         }
3039         process_fd_request();
3040         return 0;
3041 }
3042
3043 /*
3044  * Misc Ioctl's and support
3045  * ========================
3046  */
3047 static inline int fd_copyout(void __user *param, const void *address,
3048                              unsigned long size)
3049 {
3050         return copy_to_user(param, address, size) ? -EFAULT : 0;
3051 }
3052
3053 static inline int fd_copyin(void __user *param, void *address,
3054                             unsigned long size)
3055 {
3056         return copy_from_user(address, param, size) ? -EFAULT : 0;
3057 }
3058
3059 static inline const char *drive_name(int type, int drive)
3060 {
3061         struct floppy_struct *floppy;
3062
3063         if (type)
3064                 floppy = floppy_type + type;
3065         else {
3066                 if (UDP->native_format)
3067                         floppy = floppy_type + UDP->native_format;
3068                 else
3069                         return "(null)";
3070         }
3071         if (floppy->name)
3072                 return floppy->name;
3073         else
3074                 return "(null)";
3075 }
3076
3077 /* raw commands */
3078 static void raw_cmd_done(int flag)
3079 {
3080         int i;
3081
3082         if (!flag) {
3083                 raw_cmd->flags |= FD_RAW_FAILURE;
3084                 raw_cmd->flags |= FD_RAW_HARDFAILURE;
3085         } else {
3086                 raw_cmd->reply_count = inr;
3087                 if (raw_cmd->reply_count > MAX_REPLIES)
3088                         raw_cmd->reply_count = 0;
3089                 for (i = 0; i < raw_cmd->reply_count; i++)
3090                         raw_cmd->reply[i] = reply_buffer[i];
3091
3092                 if (raw_cmd->flags & (FD_RAW_READ | FD_RAW_WRITE)) {
3093                         unsigned long flags;
3094                         flags = claim_dma_lock();
3095                         raw_cmd->length = fd_get_dma_residue();
3096                         release_dma_lock(flags);
3097                 }
3098
3099                 if ((raw_cmd->flags & FD_RAW_SOFTFAILURE) &&
3100                     (!raw_cmd->reply_count || (raw_cmd->reply[0] & 0xc0)))
3101                         raw_cmd->flags |= FD_RAW_FAILURE;
3102
3103                 if (disk_change(current_drive))
3104                         raw_cmd->flags |= FD_RAW_DISK_CHANGE;
3105                 else
3106                         raw_cmd->flags &= ~FD_RAW_DISK_CHANGE;
3107                 if (raw_cmd->flags & FD_RAW_NO_MOTOR_AFTER)
3108                         motor_off_callback(current_drive);
3109
3110                 if (raw_cmd->next &&
3111                     (!(raw_cmd->flags & FD_RAW_FAILURE) ||
3112                      !(raw_cmd->flags & FD_RAW_STOP_IF_FAILURE)) &&
3113                     ((raw_cmd->flags & FD_RAW_FAILURE) ||
3114                      !(raw_cmd->flags & FD_RAW_STOP_IF_SUCCESS))) {
3115                         raw_cmd = raw_cmd->next;
3116                         return;
3117                 }
3118         }
3119         generic_done(flag);
3120 }
3121
3122 static struct cont_t raw_cmd_cont = {
3123         .interrupt      = success_and_wakeup,
3124         .redo           = floppy_start,
3125         .error          = generic_failure,
3126         .done           = raw_cmd_done
3127 };
3128
3129 static inline int raw_cmd_copyout(int cmd, char __user *param,
3130                                   struct floppy_raw_cmd *ptr)
3131 {
3132         int ret;
3133
3134         while (ptr) {
3135                 ret = copy_to_user((void __user *)param, ptr, sizeof(*ptr));
3136                 if (ret)
3137                         return -EFAULT;
3138                 param += sizeof(struct floppy_raw_cmd);
3139                 if ((ptr->flags & FD_RAW_READ) && ptr->buffer_length) {
3140                         if (ptr->length >= 0 &&
3141                             ptr->length <= ptr->buffer_length) {
3142                                 long length = ptr->buffer_length - ptr->length;
3143                                 ret = fd_copyout(ptr->data, ptr->kernel_data,
3144                                                  length);
3145                                 if (ret)
3146                                         return ret;
3147                         }
3148                 }
3149                 ptr = ptr->next;
3150         }
3151         return 0;
3152 }
3153
3154 static void raw_cmd_free(struct floppy_raw_cmd **ptr)
3155 {
3156         struct floppy_raw_cmd *next;
3157         struct floppy_raw_cmd *this;
3158
3159         this = *ptr;
3160         *ptr = NULL;
3161         while (this) {
3162                 if (this->buffer_length) {
3163                         fd_dma_mem_free((unsigned long)this->kernel_data,
3164                                         this->buffer_length);
3165                         this->buffer_length = 0;
3166                 }
3167                 next = this->next;
3168                 kfree(this);
3169                 this = next;
3170         }
3171 }
3172
3173 static inline int raw_cmd_copyin(int cmd, char __user *param,
3174                                  struct floppy_raw_cmd **rcmd)
3175 {
3176         struct floppy_raw_cmd *ptr;
3177         int ret;
3178         int i;
3179
3180         *rcmd = NULL;
3181         while (1) {
3182                 ptr = (struct floppy_raw_cmd *)
3183                     kmalloc(sizeof(struct floppy_raw_cmd), GFP_USER);
3184                 if (!ptr)
3185                         return -ENOMEM;
3186                 *rcmd = ptr;
3187                 ret = copy_from_user(ptr, (void __user *)param, sizeof(*ptr));
3188                 if (ret)
3189                         return -EFAULT;
3190                 ptr->next = NULL;
3191                 ptr->buffer_length = 0;
3192                 param += sizeof(struct floppy_raw_cmd);
3193                 if (ptr->cmd_count > 33)
3194                         /* the command may now also take up the space
3195                          * initially intended for the reply & the
3196                          * reply count. Needed for long 82078 commands
3197                          * such as RESTORE, which takes ... 17 command
3198                          * bytes. Murphy's law #137: When you reserve
3199                          * 16 bytes for a structure, you'll one day
3200                          * discover that you really need 17...
3201                          */
3202                         return -EINVAL;
3203
3204                 for (i = 0; i < 16; i++)
3205                         ptr->reply[i] = 0;
3206                 ptr->resultcode = 0;
3207                 ptr->kernel_data = NULL;
3208
3209                 if (ptr->flags & (FD_RAW_READ | FD_RAW_WRITE)) {
3210                         if (ptr->length <= 0)
3211                                 return -EINVAL;
3212                         ptr->kernel_data =
3213                             (char *)fd_dma_mem_alloc(ptr->length);
3214                         fallback_on_nodma_alloc(&ptr->kernel_data, ptr->length);
3215                         if (!ptr->kernel_data)
3216                                 return -ENOMEM;
3217                         ptr->buffer_length = ptr->length;
3218                 }
3219                 if (ptr->flags & FD_RAW_WRITE) {
3220                         ret = fd_copyin(ptr->data, ptr->kernel_data,
3221                                         ptr->length);
3222                         if (ret)
3223                                 return ret;
3224                 }
3225                 rcmd = &(ptr->next);
3226                 if (!(ptr->flags & FD_RAW_MORE))
3227                         return 0;
3228                 ptr->rate &= 0x43;
3229         }
3230 }
3231
3232 static int raw_cmd_ioctl(int cmd, void __user *param)
3233 {
3234         struct floppy_raw_cmd *my_raw_cmd;
3235         int drive;
3236         int ret2;
3237         int ret;
3238
3239         if (FDCS->rawcmd <= 1)
3240                 FDCS->rawcmd = 1;
3241         for (drive = 0; drive < N_DRIVE; drive++) {
3242                 if (FDC(drive) != fdc)
3243                         continue;
3244                 if (drive == current_drive) {
3245                         if (UDRS->fd_ref > 1) {
3246                                 FDCS->rawcmd = 2;
3247                                 break;
3248                         }
3249                 } else if (UDRS->fd_ref) {
3250                         FDCS->rawcmd = 2;
3251                         break;
3252                 }
3253         }
3254
3255         if (FDCS->reset)
3256                 return -EIO;
3257
3258         ret = raw_cmd_copyin(cmd, param, &my_raw_cmd);
3259         if (ret) {
3260                 raw_cmd_free(&my_raw_cmd);
3261                 return ret;
3262         }
3263
3264         raw_cmd = my_raw_cmd;
3265         cont = &raw_cmd_cont;
3266         ret = wait_til_done(floppy_start, true);
3267         debug_dcl(DP->flags, "calling disk change from raw_cmd ioctl\n");
3268
3269         if (ret != -EINTR && FDCS->reset)
3270                 ret = -EIO;
3271
3272         DRS->track = NO_TRACK;
3273
3274         ret2 = raw_cmd_copyout(cmd, param, my_raw_cmd);
3275         if (!ret)
3276                 ret = ret2;
3277         raw_cmd_free(&my_raw_cmd);
3278         return ret;
3279 }
3280
3281 static int invalidate_drive(struct block_device *bdev)
3282 {
3283         /* invalidate the buffer track to force a reread */
3284         set_bit((long)bdev->bd_disk->private_data, &fake_change);
3285         process_fd_request();
3286         check_disk_change(bdev);
3287         return 0;
3288 }
3289
3290 static inline int set_geometry(unsigned int cmd, struct floppy_struct *g,
3291                                int drive, int type, struct block_device *bdev)
3292 {
3293         int cnt;
3294
3295         /* sanity checking for parameters. */
3296         if (g->sect <= 0 ||
3297             g->head <= 0 ||
3298             g->track <= 0 || g->track > UDP->tracks >> STRETCH(g) ||
3299             /* check if reserved bits are set */
3300             (g->stretch & ~(FD_STRETCH | FD_SWAPSIDES | FD_SECTBASEMASK)) != 0)
3301                 return -EINVAL;
3302         if (type) {
3303                 if (!capable(CAP_SYS_ADMIN))
3304                         return -EPERM;
3305                 mutex_lock(&open_lock);
3306                 if (lock_fdc(drive, true)) {
3307                         mutex_unlock(&open_lock);
3308                         return -EINTR;
3309                 }
3310                 floppy_type[type] = *g;
3311                 floppy_type[type].name = "user format";
3312                 for (cnt = type << 2; cnt < (type << 2) + 4; cnt++)
3313                         floppy_sizes[cnt] = floppy_sizes[cnt + 0x80] =
3314                             floppy_type[type].size + 1;
3315                 process_fd_request();
3316                 for (cnt = 0; cnt < N_DRIVE; cnt++) {
3317                         struct block_device *bdev = opened_bdev[cnt];
3318                         if (!bdev || ITYPE(drive_state[cnt].fd_device) != type)
3319                                 continue;
3320                         __invalidate_device(bdev);
3321                 }
3322                 mutex_unlock(&open_lock);
3323         } else {
3324                 int oldStretch;
3325
3326                 if (lock_fdc(drive, true))
3327                         return -EINTR;
3328                 if (cmd != FDDEFPRM) {
3329                         /* notice a disk change immediately, else
3330                          * we lose our settings immediately*/
3331                         if (poll_drive(true, FD_RAW_NEED_DISK) == -EINTR)
3332                                 return -EINTR;
3333                 }
3334                 oldStretch = g->stretch;
3335                 user_params[drive] = *g;
3336                 if (buffer_drive == drive)
3337                         SUPBOUND(buffer_max, user_params[drive].sect);
3338                 current_type[drive] = &user_params[drive];
3339                 floppy_sizes[drive] = user_params[drive].size;
3340                 if (cmd == FDDEFPRM)
3341                         DRS->keep_data = -1;
3342                 else
3343                         DRS->keep_data = 1;
3344                 /* invalidation. Invalidate only when needed, i.e.
3345                  * when there are already sectors in the buffer cache
3346                  * whose number will change. This is useful, because
3347                  * mtools often changes the geometry of the disk after
3348                  * looking at the boot block */
3349                 if (DRS->maxblock > user_params[drive].sect ||
3350                     DRS->maxtrack ||
3351                     ((user_params[drive].sect ^ oldStretch) &
3352                      (FD_SWAPSIDES | FD_SECTBASEMASK)))
3353                         invalidate_drive(bdev);
3354                 else
3355                         process_fd_request();
3356         }
3357         return 0;
3358 }
3359
3360 /* handle obsolete ioctl's */
3361 static int ioctl_table[] = {
3362         FDCLRPRM,
3363         FDSETPRM,
3364         FDDEFPRM,
3365         FDGETPRM,
3366         FDMSGON,
3367         FDMSGOFF,
3368         FDFMTBEG,
3369         FDFMTTRK,
3370         FDFMTEND,
3371         FDSETEMSGTRESH,
3372         FDFLUSH,
3373         FDSETMAXERRS,
3374         FDGETMAXERRS,
3375         FDGETDRVTYP,
3376         FDSETDRVPRM,
3377         FDGETDRVPRM,
3378         FDGETDRVSTAT,
3379         FDPOLLDRVSTAT,
3380         FDRESET,
3381         FDGETFDCSTAT,
3382         FDWERRORCLR,
3383         FDWERRORGET,
3384         FDRAWCMD,
3385         FDEJECT,
3386         FDTWADDLE
3387 };
3388
3389 static inline int normalize_ioctl(int *cmd, int *size)
3390 {
3391         int i;
3392
3393         for (i = 0; i < ARRAY_SIZE(ioctl_table); i++) {
3394                 if ((*cmd & 0xffff) == (ioctl_table[i] & 0xffff)) {
3395                         *size = _IOC_SIZE(*cmd);
3396                         *cmd = ioctl_table[i];
3397                         if (*size > _IOC_SIZE(*cmd)) {
3398                                 pr_info("ioctl not yet supported\n");
3399                                 return -EFAULT;
3400                         }
3401                         return 0;
3402                 }
3403         }
3404         return -EINVAL;
3405 }
3406
3407 static int get_floppy_geometry(int drive, int type, struct floppy_struct **g)
3408 {
3409         if (type)
3410                 *g = &floppy_type[type];
3411         else {
3412                 if (lock_fdc(drive, false))
3413                         return -EINTR;
3414                 if (poll_drive(false, 0) == -EINTR)
3415                         return -EINTR;
3416                 process_fd_request();
3417                 *g = current_type[drive];
3418         }
3419         if (!*g)
3420                 return -ENODEV;
3421         return 0;
3422 }
3423
3424 static int fd_getgeo(struct block_device *bdev, struct hd_geometry *geo)
3425 {
3426         int drive = (long)bdev->bd_disk->private_data;
3427         int type = ITYPE(drive_state[drive].fd_device);
3428         struct floppy_struct *g;
3429         int ret;
3430
3431         ret = get_floppy_geometry(drive, type, &g);
3432         if (ret)
3433                 return ret;
3434
3435         geo->heads = g->head;
3436         geo->sectors = g->sect;
3437         geo->cylinders = g->track;
3438         return 0;
3439 }
3440
3441 static int fd_ioctl(struct block_device *bdev, fmode_t mode, unsigned int cmd,
3442                     unsigned long param)
3443 {
3444 #define FD_IOCTL_ALLOWED (mode & (FMODE_WRITE|FMODE_WRITE_IOCTL))
3445
3446         int drive = (long)bdev->bd_disk->private_data;
3447         int type = ITYPE(UDRS->fd_device);
3448         int i;
3449         int ret;
3450         int size;
3451         union inparam {
3452                 struct floppy_struct g; /* geometry */
3453                 struct format_descr f;
3454                 struct floppy_max_errors max_errors;
3455                 struct floppy_drive_params dp;
3456         } inparam;              /* parameters coming from user space */
3457         const char *outparam;   /* parameters passed back to user space */
3458
3459         /* convert compatibility eject ioctls into floppy eject ioctl.
3460          * We do this in order to provide a means to eject floppy disks before
3461          * installing the new fdutils package */
3462         if (cmd == CDROMEJECT ||        /* CD-ROM eject */
3463             cmd == 0x6470) {            /* SunOS floppy eject */
3464                 DPRINT("obsolete eject ioctl\n");
3465                 DPRINT("please use floppycontrol --eject\n");
3466                 cmd = FDEJECT;
3467         }
3468
3469         if (!((cmd & 0xff00) == 0x0200))
3470                 return -EINVAL;
3471
3472         /* convert the old style command into a new style command */
3473         ret = normalize_ioctl(&cmd, &size);
3474         if (ret)
3475                 return ret;
3476
3477         /* permission checks */
3478         if (((cmd & 0x40) && !FD_IOCTL_ALLOWED) ||
3479             ((cmd & 0x80) && !capable(CAP_SYS_ADMIN)))
3480                 return -EPERM;
3481
3482         if (WARN_ON(size < 0 || size > sizeof(inparam)))
3483                 return -EINVAL;
3484
3485         /* copyin */
3486         memset(&inparam, 0, sizeof(inparam));
3487         if (_IOC_DIR(cmd) & _IOC_WRITE) {
3488                 ret = fd_copyin((void __user *)param, &inparam, size);
3489                 if (ret)
3490                         return ret;
3491         }
3492
3493         switch (cmd) {
3494         case FDEJECT:
3495                 if (UDRS->fd_ref != 1)
3496                         /* somebody else has this drive open */
3497                         return -EBUSY;
3498                 if (lock_fdc(drive, true))
3499                         return -EINTR;
3500
3501                 /* do the actual eject. Fails on
3502                  * non-Sparc architectures */
3503                 ret = fd_eject(UNIT(drive));
3504
3505                 set_bit(FD_DISK_CHANGED_BIT, &UDRS->flags);
3506                 set_bit(FD_VERIFY_BIT, &UDRS->flags);
3507                 process_fd_request();
3508                 return ret;
3509         case FDCLRPRM:
3510                 if (lock_fdc(drive, true))
3511                         return -EINTR;
3512                 current_type[drive] = NULL;
3513                 floppy_sizes[drive] = MAX_DISK_SIZE << 1;
3514                 UDRS->keep_data = 0;
3515                 return invalidate_drive(bdev);
3516         case FDSETPRM:
3517         case FDDEFPRM:
3518                 return set_geometry(cmd, &inparam.g, drive, type, bdev);
3519         case FDGETPRM:
3520                 ret = get_floppy_geometry(drive, type,
3521                                           (struct floppy_struct **)
3522                                           &outparam);
3523                 if (ret)
3524                         return ret;
3525                 break;
3526         case FDMSGON:
3527                 UDP->flags |= FTD_MSG;
3528                 return 0;
3529         case FDMSGOFF:
3530                 UDP->flags &= ~FTD_MSG;
3531                 return 0;
3532         case FDFMTBEG:
3533                 if (lock_fdc(drive, true))
3534                         return -EINTR;
3535                 if (poll_drive(true, FD_RAW_NEED_DISK) == -EINTR)
3536                         return -EINTR;
3537                 ret = UDRS->flags;
3538                 process_fd_request();
3539                 if (ret & FD_VERIFY)
3540                         return -ENODEV;
3541                 if (!(ret & FD_DISK_WRITABLE))
3542                         return -EROFS;
3543                 return 0;
3544         case FDFMTTRK:
3545                 if (UDRS->fd_ref != 1)
3546                         return -EBUSY;
3547                 return do_format(drive, &inparam.f);
3548         case FDFMTEND:
3549         case FDFLUSH:
3550                 if (lock_fdc(drive, true))
3551                         return -EINTR;
3552                 return invalidate_drive(bdev);
3553         case FDSETEMSGTRESH:
3554                 UDP->max_errors.reporting = (unsigned short)(param & 0x0f);
3555                 return 0;
3556         case FDGETMAXERRS:
3557                 outparam = (const char *)&UDP->max_errors;
3558                 break;
3559         case FDSETMAXERRS:
3560                 UDP->max_errors = inparam.max_errors;
3561                 break;
3562         case FDGETDRVTYP:
3563                 outparam = drive_name(type, drive);
3564                 SUPBOUND(size, strlen(outparam) + 1);
3565                 break;
3566         case FDSETDRVPRM:
3567                 *UDP = inparam.dp;
3568                 break;
3569         case FDGETDRVPRM:
3570                 outparam = (const char *)UDP;
3571                 break;
3572         case FDPOLLDRVSTAT:
3573                 if (lock_fdc(drive, true))
3574                         return -EINTR;
3575                 if (poll_drive(true, FD_RAW_NEED_DISK) == -EINTR)
3576                         return -EINTR;
3577                 process_fd_request();
3578                 /* fall through */
3579         case FDGETDRVSTAT:
3580                 outparam = (const char *)UDRS;
3581                 break;
3582         case FDRESET:
3583                 return user_reset_fdc(drive, (int)param, true);
3584         case FDGETFDCSTAT:
3585                 outparam = (const char *)UFDCS;
3586                 break;
3587         case FDWERRORCLR:
3588                 memset(UDRWE, 0, sizeof(*UDRWE));
3589                 return 0;
3590         case FDWERRORGET:
3591                 outparam = (const char *)UDRWE;
3592                 break;
3593         case FDRAWCMD:
3594                 if (type)
3595                         return -EINVAL;
3596                 if (lock_fdc(drive, true))
3597                         return -EINTR;
3598                 set_floppy(drive);
3599                 i = raw_cmd_ioctl(cmd, (void __user *)param);
3600                 if (i == -EINTR)
3601                         return -EINTR;
3602                 process_fd_request();
3603                 return i;
3604         case FDTWADDLE:
3605                 if (lock_fdc(drive, true))
3606                         return -EINTR;
3607                 twaddle();
3608                 process_fd_request();
3609                 return 0;
3610         default:
3611                 return -EINVAL;
3612         }
3613
3614         if (_IOC_DIR(cmd) & _IOC_READ)
3615                 return fd_copyout((void __user *)param, outparam, size);
3616
3617         return 0;
3618 }
3619
3620 static void __init config_types(void)
3621 {
3622         bool has_drive = false;
3623         int drive;
3624
3625         /* read drive info out of physical CMOS */
3626         drive = 0;
3627         if (!UDP->cmos)
3628                 UDP->cmos = FLOPPY0_TYPE;
3629         drive = 1;
3630         if (!UDP->cmos && FLOPPY1_TYPE)
3631                 UDP->cmos = FLOPPY1_TYPE;
3632
3633         /* FIXME: additional physical CMOS drive detection should go here */
3634
3635         for (drive = 0; drive < N_DRIVE; drive++) {
3636                 unsigned int type = UDP->cmos;
3637                 struct floppy_drive_params *params;
3638                 const char *name = NULL;
3639                 static char temparea[32];
3640
3641                 if (type < ARRAY_SIZE(default_drive_params)) {
3642                         params = &default_drive_params[type].params;
3643                         if (type) {
3644                                 name = default_drive_params[type].name;
3645                                 allowed_drive_mask |= 1 << drive;
3646                         } else
3647                                 allowed_drive_mask &= ~(1 << drive);
3648                 } else {
3649                         params = &default_drive_params[0].params;
3650                         sprintf(temparea, "unknown type %d (usb?)", type);
3651                         name = temparea;
3652                 }
3653                 if (name) {
3654                         const char *prepend;
3655                         if (!has_drive) {
3656                                 prepend = "";
3657                                 has_drive = true;
3658                                 pr_info("Floppy drive(s):");
3659                         } else {
3660                                 prepend = ",";
3661                         }
3662
3663                         pr_cont("%s fd%d is %s", prepend, drive, name);
3664                 }
3665                 *UDP = *params;
3666         }
3667
3668         if (has_drive)
3669                 pr_cont("\n");
3670 }
3671
3672 static int floppy_release(struct gendisk *disk, fmode_t mode)
3673 {
3674         int drive = (long)disk->private_data;
3675
3676         mutex_lock(&open_lock);
3677         if (UDRS->fd_ref < 0)
3678                 UDRS->fd_ref = 0;
3679         else if (!UDRS->fd_ref--) {
3680                 DPRINT("floppy_release with fd_ref == 0");
3681                 UDRS->fd_ref = 0;
3682         }
3683         if (!UDRS->fd_ref)
3684                 opened_bdev[drive] = NULL;
3685         mutex_unlock(&open_lock);
3686
3687         return 0;
3688 }
3689
3690 /*
3691  * floppy_open check for aliasing (/dev/fd0 can be the same as
3692  * /dev/PS0 etc), and disallows simultaneous access to the same
3693  * drive with different device numbers.
3694  */
3695 static int floppy_open(struct block_device *bdev, fmode_t mode)
3696 {
3697         int drive = (long)bdev->bd_disk->private_data;
3698         int old_dev, new_dev;
3699         int try;
3700         int res = -EBUSY;
3701         char *tmp;
3702
3703         mutex_lock(&open_lock);
3704         old_dev = UDRS->fd_device;
3705         if (opened_bdev[drive] && opened_bdev[drive] != bdev)
3706                 goto out2;
3707
3708         if (!UDRS->fd_ref && (UDP->flags & FD_BROKEN_DCL)) {
3709                 set_bit(FD_DISK_CHANGED_BIT, &UDRS->flags);
3710                 set_bit(FD_VERIFY_BIT, &UDRS->flags);
3711         }
3712
3713         if (UDRS->fd_ref == -1 || (UDRS->fd_ref && (mode & FMODE_EXCL)))
3714                 goto out2;
3715
3716         if (mode & FMODE_EXCL)
3717                 UDRS->fd_ref = -1;
3718         else
3719                 UDRS->fd_ref++;
3720
3721         opened_bdev[drive] = bdev;
3722
3723         res = -ENXIO;
3724
3725         if (!floppy_track_buffer) {
3726                 /* if opening an ED drive, reserve a big buffer,
3727                  * else reserve a small one */
3728                 if ((UDP->cmos == 6) || (UDP->cmos == 5))
3729                         try = 64;       /* Only 48 actually useful */
3730                 else
3731                         try = 32;       /* Only 24 actually useful */
3732
3733                 tmp = (char *)fd_dma_mem_alloc(1024 * try);
3734                 if (!tmp && !floppy_track_buffer) {
3735                         try >>= 1;      /* buffer only one side */
3736                         INFBOUND(try, 16);
3737                         tmp = (char *)fd_dma_mem_alloc(1024 * try);
3738                 }
3739                 if (!tmp && !floppy_track_buffer)
3740                         fallback_on_nodma_alloc(&tmp, 2048 * try);
3741                 if (!tmp && !floppy_track_buffer) {
3742                         DPRINT("Unable to allocate DMA memory\n");
3743                         goto out;
3744                 }
3745                 if (floppy_track_buffer) {
3746                         if (tmp)
3747                                 fd_dma_mem_free((unsigned long)tmp, try * 1024);
3748                 } else {
3749                         buffer_min = buffer_max = -1;
3750                         floppy_track_buffer = tmp;
3751                         max_buffer_sectors = try;
3752                 }
3753         }
3754
3755         new_dev = MINOR(bdev->bd_dev);
3756         UDRS->fd_device = new_dev;
3757         set_capacity(disks[drive], floppy_sizes[new_dev]);
3758         if (old_dev != -1 && old_dev != new_dev) {
3759                 if (buffer_drive == drive)
3760                         buffer_track = -1;
3761         }
3762
3763         if (UFDCS->rawcmd == 1)
3764                 UFDCS->rawcmd = 2;
3765
3766         if (!(mode & FMODE_NDELAY)) {
3767                 if (mode & (FMODE_READ|FMODE_WRITE)) {
3768                         UDRS->last_checked = 0;
3769                         check_disk_change(bdev);
3770                         if (test_bit(FD_DISK_CHANGED_BIT, &UDRS->flags))
3771                                 goto out;
3772                 }
3773                 res = -EROFS;
3774                 if ((mode & FMODE_WRITE) &&
3775                     !test_bit(FD_DISK_WRITABLE_BIT, &UDRS->flags))
3776                         goto out;
3777         }
3778         mutex_unlock(&open_lock);
3779         return 0;
3780 out:
3781         if (UDRS->fd_ref < 0)
3782                 UDRS->fd_ref = 0;
3783         else
3784                 UDRS->fd_ref--;
3785         if (!UDRS->fd_ref)
3786                 opened_bdev[drive] = NULL;
3787 out2:
3788         mutex_unlock(&open_lock);
3789         return res;
3790 }
3791
3792 /*
3793  * Check if the disk has been changed or if a change has been faked.
3794  */
3795 static int check_floppy_change(struct gendisk *disk)
3796 {
3797         int drive = (long)disk->private_data;
3798
3799         if (test_bit(FD_DISK_CHANGED_BIT, &UDRS->flags) ||
3800             test_bit(FD_VERIFY_BIT, &UDRS->flags))
3801                 return 1;
3802
3803         if (time_after(jiffies, UDRS->last_checked + UDP->checkfreq)) {
3804                 lock_fdc(drive, false);
3805                 poll_drive(false, 0);
3806                 process_fd_request();
3807         }
3808
3809         if (test_bit(FD_DISK_CHANGED_BIT, &UDRS->flags) ||
3810             test_bit(FD_VERIFY_BIT, &UDRS->flags) ||
3811             test_bit(drive, &fake_change) ||
3812             (!ITYPE(UDRS->fd_device) && !current_type[drive]))
3813                 return 1;
3814         return 0;
3815 }
3816
3817 /*
3818  * This implements "read block 0" for floppy_revalidate().
3819  * Needed for format autodetection, checking whether there is
3820  * a disk in the drive, and whether that disk is writable.
3821  */
3822
3823 static void floppy_rb0_complete(struct bio *bio, int err)
3824 {
3825         complete((struct completion *)bio->bi_private);
3826 }
3827
3828 static int __floppy_read_block_0(struct block_device *bdev)
3829 {
3830         struct bio bio;
3831         struct bio_vec bio_vec;
3832         struct completion complete;
3833         struct page *page;
3834         size_t size;
3835
3836         page = alloc_page(GFP_NOIO);
3837         if (!page) {
3838                 process_fd_request();
3839                 return -ENOMEM;
3840         }
3841
3842         size = bdev->bd_block_size;
3843         if (!size)
3844                 size = 1024;
3845
3846         bio_init(&bio);
3847         bio.bi_io_vec = &bio_vec;
3848         bio_vec.bv_page = page;
3849         bio_vec.bv_len = size;
3850         bio_vec.bv_offset = 0;
3851         bio.bi_vcnt = 1;
3852         bio.bi_idx = 0;
3853         bio.bi_size = size;
3854         bio.bi_bdev = bdev;
3855         bio.bi_sector = 0;
3856         init_completion(&complete);
3857         bio.bi_private = &complete;
3858         bio.bi_end_io = floppy_rb0_complete;
3859
3860         submit_bio(READ, &bio);
3861         generic_unplug_device(bdev_get_queue(bdev));
3862         process_fd_request();
3863         wait_for_completion(&complete);
3864
3865         __free_page(page);
3866
3867         return 0;
3868 }
3869
3870 /* revalidate the floppy disk, i.e. trigger format autodetection by reading
3871  * the bootblock (block 0). "Autodetection" is also needed to check whether
3872  * there is a disk in the drive at all... Thus we also do it for fixed
3873  * geometry formats */
3874 static int floppy_revalidate(struct gendisk *disk)
3875 {
3876         int drive = (long)disk->private_data;
3877 #define NO_GEOM (!current_type[drive] && !ITYPE(UDRS->fd_device))
3878         int cf;
3879         int res = 0;
3880
3881         if (test_bit(FD_DISK_CHANGED_BIT, &UDRS->flags) ||
3882             test_bit(FD_VERIFY_BIT, &UDRS->flags) ||
3883             test_bit(drive, &fake_change) || NO_GEOM) {
3884                 if (usage_count == 0) {
3885                         pr_info("VFS: revalidate called on non-open device.\n");
3886                         return -EFAULT;
3887                 }
3888                 lock_fdc(drive, false);
3889                 cf = (test_bit(FD_DISK_CHANGED_BIT, &UDRS->flags) ||
3890                       test_bit(FD_VERIFY_BIT, &UDRS->flags));
3891                 if (!(cf || test_bit(drive, &fake_change) || NO_GEOM)) {
3892                         process_fd_request();   /*already done by another thread */
3893                         return 0;
3894                 }
3895                 UDRS->maxblock = 0;
3896                 UDRS->maxtrack = 0;
3897                 if (buffer_drive == drive)
3898                         buffer_track = -1;
3899                 clear_bit(drive, &fake_change);
3900                 clear_bit(FD_DISK_CHANGED_BIT, &UDRS->flags);
3901                 if (cf)
3902                         UDRS->generation++;
3903                 if (NO_GEOM) {
3904                         /* auto-sensing */
3905                         res = __floppy_read_block_0(opened_bdev[drive]);
3906                 } else {
3907                         if (cf)
3908                                 poll_drive(false, FD_RAW_NEED_DISK);
3909                         process_fd_request();
3910                 }
3911         }
3912         set_capacity(disk, floppy_sizes[UDRS->fd_device]);
3913         return res;
3914 }
3915
3916 static const struct block_device_operations floppy_fops = {
3917         .owner                  = THIS_MODULE,
3918         .open                   = floppy_open,
3919         .release                = floppy_release,
3920         .locked_ioctl           = fd_ioctl,
3921         .getgeo                 = fd_getgeo,
3922         .media_changed          = check_floppy_change,
3923         .revalidate_disk        = floppy_revalidate,
3924 };
3925
3926 /*
3927  * Floppy Driver initialization
3928  * =============================
3929  */
3930
3931 /* Determine the floppy disk controller type */
3932 /* This routine was written by David C. Niemi */
3933 static char __init get_fdc_version(void)
3934 {
3935         int r;
3936
3937         output_byte(FD_DUMPREGS);       /* 82072 and better know DUMPREGS */
3938         if (FDCS->reset)
3939                 return FDC_NONE;
3940         r = result();
3941         if (r <= 0x00)
3942                 return FDC_NONE;        /* No FDC present ??? */
3943         if ((r == 1) && (reply_buffer[0] == 0x80)) {
3944                 pr_info("FDC %d is an 8272A\n", fdc);
3945                 return FDC_8272A;       /* 8272a/765 don't know DUMPREGS */
3946         }
3947         if (r != 10) {
3948                 pr_info("FDC %d init: DUMPREGS: unexpected return of %d bytes.\n",
3949                         fdc, r);
3950                 return FDC_UNKNOWN;
3951         }
3952
3953         if (!fdc_configure()) {
3954                 pr_info("FDC %d is an 82072\n", fdc);
3955                 return FDC_82072;       /* 82072 doesn't know CONFIGURE */
3956         }
3957
3958         output_byte(FD_PERPENDICULAR);
3959         if (need_more_output() == MORE_OUTPUT) {
3960                 output_byte(0);
3961         } else {
3962                 pr_info("FDC %d is an 82072A\n", fdc);
3963                 return FDC_82072A;      /* 82072A as found on Sparcs. */
3964         }
3965
3966         output_byte(FD_UNLOCK);
3967         r = result();
3968         if ((r == 1) && (reply_buffer[0] == 0x80)) {
3969                 pr_info("FDC %d is a pre-1991 82077\n", fdc);
3970                 return FDC_82077_ORIG;  /* Pre-1991 82077, doesn't know
3971                                          * LOCK/UNLOCK */
3972         }
3973         if ((r != 1) || (reply_buffer[0] != 0x00)) {
3974                 pr_info("FDC %d init: UNLOCK: unexpected return of %d bytes.\n",
3975                         fdc, r);
3976                 return FDC_UNKNOWN;
3977         }
3978         output_byte(FD_PARTID);
3979         r = result();
3980         if (r != 1) {
3981                 pr_info("FDC %d init: PARTID: unexpected return of %d bytes.\n",
3982                         fdc, r);
3983                 return FDC_UNKNOWN;
3984         }
3985         if (reply_buffer[0] == 0x80) {
3986                 pr_info("FDC %d is a post-1991 82077\n", fdc);
3987                 return FDC_82077;       /* Revised 82077AA passes all the tests */
3988         }
3989         switch (reply_buffer[0] >> 5) {
3990         case 0x0:
3991                 /* Either a 82078-1 or a 82078SL running at 5Volt */
3992                 pr_info("FDC %d is an 82078.\n", fdc);
3993                 return FDC_82078;
3994         case 0x1:
3995                 pr_info("FDC %d is a 44pin 82078\n", fdc);
3996                 return FDC_82078;
3997         case 0x2:
3998                 pr_info("FDC %d is a S82078B\n", fdc);
3999                 return FDC_S82078B;
4000         case 0x3:
4001                 pr_info("FDC %d is a National Semiconductor PC87306\n", fdc);
4002                 return FDC_87306;
4003         default:
4004                 pr_info("FDC %d init: 82078 variant with unknown PARTID=%d.\n",
4005                         fdc, reply_buffer[0] >> 5);
4006                 return FDC_82078_UNKN;
4007         }
4008 }                               /* get_fdc_version */
4009
4010 /* lilo configuration */
4011
4012 static void __init floppy_set_flags(int *ints, int param, int param2)
4013 {
4014         int i;
4015
4016         for (i = 0; i < ARRAY_SIZE(default_drive_params); i++) {
4017                 if (param)
4018                         default_drive_params[i].params.flags |= param2;
4019                 else
4020                         default_drive_params[i].params.flags &= ~param2;
4021         }
4022         DPRINT("%s flag 0x%x\n", param2 ? "Setting" : "Clearing", param);
4023 }
4024
4025 static void __init daring(int *ints, int param, int param2)
4026 {
4027         int i;
4028
4029         for (i = 0; i < ARRAY_SIZE(default_drive_params); i++) {
4030                 if (param) {
4031                         default_drive_params[i].params.select_delay = 0;
4032                         default_drive_params[i].params.flags |=
4033                             FD_SILENT_DCL_CLEAR;
4034                 } else {
4035                         default_drive_params[i].params.select_delay =
4036                             2 * HZ / 100;
4037                         default_drive_params[i].params.flags &=
4038                             ~FD_SILENT_DCL_CLEAR;
4039                 }
4040         }
4041         DPRINT("Assuming %s floppy hardware\n", param ? "standard" : "broken");
4042 }
4043
4044 static void __init set_cmos(int *ints, int dummy, int dummy2)
4045 {
4046         int current_drive = 0;
4047
4048         if (ints[0] != 2) {
4049                 DPRINT("wrong number of parameters for CMOS\n");
4050                 return;
4051         }
4052         current_drive = ints[1];
4053         if (current_drive < 0 || current_drive >= 8) {
4054                 DPRINT("bad drive for set_cmos\n");
4055                 return;
4056         }
4057 #if N_FDC > 1
4058         if (current_drive >= 4 && !FDC2)
4059                 FDC2 = 0x370;
4060 #endif
4061         DP->cmos = ints[2];
4062         DPRINT("setting CMOS code to %d\n", ints[2]);
4063 }
4064
4065 static struct param_table {
4066         const char *name;
4067         void (*fn) (int *ints, int param, int param2);
4068         int *var;
4069         int def_param;
4070         int param2;
4071 } config_params[] __initdata = {
4072         {"allowed_drive_mask", NULL, &allowed_drive_mask, 0xff, 0}, /* obsolete */
4073         {"all_drives", NULL, &allowed_drive_mask, 0xff, 0},     /* obsolete */
4074         {"asus_pci", NULL, &allowed_drive_mask, 0x33, 0},
4075         {"irq", NULL, &FLOPPY_IRQ, 6, 0},
4076         {"dma", NULL, &FLOPPY_DMA, 2, 0},
4077         {"daring", daring, NULL, 1, 0},
4078 #if N_FDC > 1
4079         {"two_fdc", NULL, &FDC2, 0x370, 0},
4080         {"one_fdc", NULL, &FDC2, 0, 0},
4081 #endif
4082         {"thinkpad", floppy_set_flags, NULL, 1, FD_INVERTED_DCL},
4083         {"broken_dcl", floppy_set_flags, NULL, 1, FD_BROKEN_DCL},
4084         {"messages", floppy_set_flags, NULL, 1, FTD_MSG},
4085         {"silent_dcl_clear", floppy_set_flags, NULL, 1, FD_SILENT_DCL_CLEAR},
4086         {"debug", floppy_set_flags, NULL, 1, FD_DEBUG},
4087         {"nodma", NULL, &can_use_virtual_dma, 1, 0},
4088         {"omnibook", NULL, &can_use_virtual_dma, 1, 0},
4089         {"yesdma", NULL, &can_use_virtual_dma, 0, 0},
4090         {"fifo_depth", NULL, &fifo_depth, 0xa, 0},
4091         {"nofifo", NULL, &no_fifo, 0x20, 0},
4092         {"usefifo", NULL, &no_fifo, 0, 0},
4093         {"cmos", set_cmos, NULL, 0, 0},
4094         {"slow", NULL, &slow_floppy, 1, 0},
4095         {"unexpected_interrupts", NULL, &print_unex, 1, 0},
4096         {"no_unexpected_interrupts", NULL, &print_unex, 0, 0},
4097         {"L40SX", NULL, &print_unex, 0, 0}
4098
4099         EXTRA_FLOPPY_PARAMS
4100 };
4101
4102 static int __init floppy_setup(char *str)
4103 {
4104         int i;
4105         int param;
4106         int ints[11];
4107
4108         str = get_options(str, ARRAY_SIZE(ints), ints);
4109         if (str) {
4110                 for (i = 0; i < ARRAY_SIZE(config_params); i++) {
4111                         if (strcmp(str, config_params[i].name) == 0) {
4112                                 if (ints[0])
4113                                         param = ints[1];
4114                                 else
4115                                         param = config_params[i].def_param;
4116                                 if (config_params[i].fn)
4117                                         config_params[i].fn(ints, param,
4118                                                             config_params[i].
4119                                                             param2);
4120                                 if (config_params[i].var) {
4121                                         DPRINT("%s=%d\n", str, param);
4122                                         *config_params[i].var = param;
4123                                 }
4124                                 return 1;
4125                         }
4126                 }
4127         }
4128         if (str) {
4129                 DPRINT("unknown floppy option [%s]\n", str);
4130
4131                 DPRINT("allowed options are:");
4132                 for (i = 0; i < ARRAY_SIZE(config_params); i++)
4133                         pr_cont(" %s", config_params[i].name);
4134                 pr_cont("\n");
4135         } else
4136                 DPRINT("botched floppy option\n");
4137         DPRINT("Read Documentation/blockdev/floppy.txt\n");
4138         return 0;
4139 }
4140
4141 static int have_no_fdc = -ENODEV;
4142
4143 static ssize_t floppy_cmos_show(struct device *dev,
4144                                 struct device_attribute *attr, char *buf)
4145 {
4146         struct platform_device *p = to_platform_device(dev);
4147         int drive;
4148
4149         drive = p->id;
4150         return sprintf(buf, "%X\n", UDP->cmos);
4151 }
4152
4153 DEVICE_ATTR(cmos, S_IRUGO, floppy_cmos_show, NULL);
4154
4155 static void floppy_device_release(struct device *dev)
4156 {
4157 }
4158
4159 static int floppy_resume(struct device *dev)
4160 {
4161         int fdc;
4162
4163         for (fdc = 0; fdc < N_FDC; fdc++)
4164                 if (FDCS->address != -1)
4165                         user_reset_fdc(-1, FD_RESET_ALWAYS, false);
4166
4167         return 0;
4168 }
4169
4170 static const struct dev_pm_ops floppy_pm_ops = {
4171         .resume = floppy_resume,
4172         .restore = floppy_resume,
4173 };
4174
4175 static struct platform_driver floppy_driver = {
4176         .driver = {
4177                    .name = "floppy",
4178                    .pm = &floppy_pm_ops,
4179         },
4180 };
4181
4182 static struct platform_device floppy_device[N_DRIVE];
4183
4184 static struct kobject *floppy_find(dev_t dev, int *part, void *data)
4185 {
4186         int drive = (*part & 3) | ((*part & 0x80) >> 5);
4187         if (drive >= N_DRIVE ||
4188             !(allowed_drive_mask & (1 << drive)) ||
4189             fdc_state[FDC(drive)].version == FDC_NONE)
4190                 return NULL;
4191         if (((*part >> 2) & 0x1f) >= ARRAY_SIZE(floppy_type))
4192                 return NULL;
4193         *part = 0;
4194         return get_disk(disks[drive]);
4195 }
4196
4197 static int __init floppy_init(void)
4198 {
4199         int i, unit, drive;
4200         int err, dr;
4201
4202 #if defined(CONFIG_PPC)
4203         if (check_legacy_ioport(FDC1))
4204                 return -ENODEV;
4205 #endif
4206
4207         raw_cmd = NULL;
4208
4209         for (dr = 0; dr < N_DRIVE; dr++) {
4210                 disks[dr] = alloc_disk(1);
4211                 if (!disks[dr]) {
4212                         err = -ENOMEM;
4213                         goto out_put_disk;
4214                 }
4215
4216                 disks[dr]->major = FLOPPY_MAJOR;
4217                 disks[dr]->first_minor = TOMINOR(dr);
4218                 disks[dr]->fops = &floppy_fops;
4219                 sprintf(disks[dr]->disk_name, "fd%d", dr);
4220
4221                 init_timer(&motor_off_timer[dr]);
4222                 motor_off_timer[dr].data = dr;
4223                 motor_off_timer[dr].function = motor_off_callback;
4224         }
4225
4226         err = register_blkdev(FLOPPY_MAJOR, "fd");
4227         if (err)
4228                 goto out_put_disk;
4229
4230         err = platform_driver_register(&floppy_driver);
4231         if (err)
4232                 goto out_unreg_blkdev;
4233
4234         floppy_queue = blk_init_queue(do_fd_request, &floppy_lock);
4235         if (!floppy_queue) {
4236                 err = -ENOMEM;
4237                 goto out_unreg_driver;
4238         }
4239         blk_queue_max_hw_sectors(floppy_queue, 64);
4240
4241         blk_register_region(MKDEV(FLOPPY_MAJOR, 0), 256, THIS_MODULE,
4242                             floppy_find, NULL, NULL);
4243
4244         for (i = 0; i < 256; i++)
4245                 if (ITYPE(i))
4246                         floppy_sizes[i] = floppy_type[ITYPE(i)].size;
4247                 else
4248                         floppy_sizes[i] = MAX_DISK_SIZE << 1;
4249
4250         reschedule_timeout(MAXTIMEOUT, "floppy init", MAXTIMEOUT);
4251         config_types();
4252
4253         for (i = 0; i < N_FDC; i++) {
4254                 fdc = i;
4255                 memset(FDCS, 0, sizeof(*FDCS));
4256                 FDCS->dtr = -1;
4257                 FDCS->dor = 0x4;
4258 #if defined(__sparc__) || defined(__mc68000__)
4259         /*sparcs/sun3x don't have a DOR reset which we can fall back on to */
4260 #ifdef __mc68000__
4261                 if (MACH_IS_SUN3X)
4262 #endif
4263                         FDCS->version = FDC_82072A;
4264 #endif
4265         }
4266
4267         use_virtual_dma = can_use_virtual_dma & 1;
4268         fdc_state[0].address = FDC1;
4269         if (fdc_state[0].address == -1) {
4270                 del_timer(&fd_timeout);
4271                 err = -ENODEV;
4272                 goto out_unreg_region;
4273         }
4274 #if N_FDC > 1
4275         fdc_state[1].address = FDC2;
4276 #endif
4277
4278         fdc = 0;                /* reset fdc in case of unexpected interrupt */
4279         err = floppy_grab_irq_and_dma();
4280         if (err) {
4281                 del_timer(&fd_timeout);
4282                 err = -EBUSY;
4283                 goto out_unreg_region;
4284         }
4285
4286         /* initialise drive state */
4287         for (drive = 0; drive < N_DRIVE; drive++) {
4288                 memset(UDRS, 0, sizeof(*UDRS));
4289                 memset(UDRWE, 0, sizeof(*UDRWE));
4290                 set_bit(FD_DISK_NEWCHANGE_BIT, &UDRS->flags);
4291                 set_bit(FD_DISK_CHANGED_BIT, &UDRS->flags);
4292                 set_bit(FD_VERIFY_BIT, &UDRS->flags);
4293                 UDRS->fd_device = -1;
4294                 floppy_track_buffer = NULL;
4295                 max_buffer_sectors = 0;
4296         }
4297         /*
4298          * Small 10 msec delay to let through any interrupt that
4299          * initialization might have triggered, to not
4300          * confuse detection:
4301          */
4302         msleep(10);
4303
4304         for (i = 0; i < N_FDC; i++) {
4305                 fdc = i;
4306                 FDCS->driver_version = FD_DRIVER_VERSION;
4307                 for (unit = 0; unit < 4; unit++)
4308                         FDCS->track[unit] = 0;
4309                 if (FDCS->address == -1)
4310                         continue;
4311                 FDCS->rawcmd = 2;
4312                 if (user_reset_fdc(-1, FD_RESET_ALWAYS, false)) {
4313                         /* free ioports reserved by floppy_grab_irq_and_dma() */
4314                         floppy_release_regions(fdc);
4315                         FDCS->address = -1;
4316                         FDCS->version = FDC_NONE;
4317                         continue;
4318                 }
4319                 /* Try to determine the floppy controller type */
4320                 FDCS->version = get_fdc_version();
4321                 if (FDCS->version == FDC_NONE) {
4322                         /* free ioports reserved by floppy_grab_irq_and_dma() */
4323                         floppy_release_regions(fdc);
4324                         FDCS->address = -1;
4325                         continue;
4326                 }
4327                 if (can_use_virtual_dma == 2 && FDCS->version < FDC_82072A)
4328                         can_use_virtual_dma = 0;
4329
4330                 have_no_fdc = 0;
4331                 /* Not all FDCs seem to be able to handle the version command
4332                  * properly, so force a reset for the standard FDC clones,
4333                  * to avoid interrupt garbage.
4334                  */
4335                 user_reset_fdc(-1, FD_RESET_ALWAYS, false);
4336         }
4337         fdc = 0;
4338         del_timer(&fd_timeout);
4339         current_drive = 0;
4340         initialising = 0;
4341         if (have_no_fdc) {
4342                 DPRINT("no floppy controllers found\n");
4343                 err = have_no_fdc;
4344                 goto out_flush_work;
4345         }
4346
4347         for (drive = 0; drive < N_DRIVE; drive++) {
4348                 if (!(allowed_drive_mask & (1 << drive)))
4349                         continue;
4350                 if (fdc_state[FDC(drive)].version == FDC_NONE)
4351                         continue;
4352
4353                 floppy_device[drive].name = floppy_device_name;
4354                 floppy_device[drive].id = drive;
4355                 floppy_device[drive].dev.release = floppy_device_release;
4356
4357                 err = platform_device_register(&floppy_device[drive]);
4358                 if (err)
4359                         goto out_flush_work;
4360
4361                 err = device_create_file(&floppy_device[drive].dev,
4362                                          &dev_attr_cmos);
4363                 if (err)
4364                         goto out_unreg_platform_dev;
4365
4366                 /* to be cleaned up... */
4367                 disks[drive]->private_data = (void *)(long)drive;
4368                 disks[drive]->queue = floppy_queue;
4369                 disks[drive]->flags |= GENHD_FL_REMOVABLE;
4370                 disks[drive]->driverfs_dev = &floppy_device[drive].dev;
4371                 add_disk(disks[drive]);
4372         }
4373
4374         return 0;
4375
4376 out_unreg_platform_dev:
4377         platform_device_unregister(&floppy_device[drive]);
4378 out_flush_work:
4379         flush_scheduled_work();
4380         if (usage_count)
4381                 floppy_release_irq_and_dma();
4382 out_unreg_region:
4383         blk_unregister_region(MKDEV(FLOPPY_MAJOR, 0), 256);
4384         blk_cleanup_queue(floppy_queue);
4385 out_unreg_driver:
4386         platform_driver_unregister(&floppy_driver);
4387 out_unreg_blkdev:
4388         unregister_blkdev(FLOPPY_MAJOR, "fd");
4389 out_put_disk:
4390         while (dr--) {
4391                 del_timer(&motor_off_timer[dr]);
4392                 put_disk(disks[dr]);
4393         }
4394         return err;
4395 }
4396
4397 static DEFINE_SPINLOCK(floppy_usage_lock);
4398
4399 static const struct io_region {
4400         int offset;
4401         int size;
4402 } io_regions[] = {
4403         { 2, 1 },
4404         /* address + 3 is sometimes reserved by pnp bios for motherboard */
4405         { 4, 2 },
4406         /* address + 6 is reserved, and may be taken by IDE.
4407          * Unfortunately, Adaptec doesn't know this :-(, */
4408         { 7, 1 },
4409 };
4410
4411 static void floppy_release_allocated_regions(int fdc, const struct io_region *p)
4412 {
4413         while (p != io_regions) {
4414                 p--;
4415                 release_region(FDCS->address + p->offset, p->size);
4416         }
4417 }
4418
4419 #define ARRAY_END(X) (&((X)[ARRAY_SIZE(X)]))
4420
4421 static int floppy_request_regions(int fdc)
4422 {
4423         const struct io_region *p;
4424
4425         for (p = io_regions; p < ARRAY_END(io_regions); p++) {
4426                 if (!request_region(FDCS->address + p->offset,
4427                                     p->size, "floppy")) {
4428                         DPRINT("Floppy io-port 0x%04lx in use\n",
4429                                FDCS->address + p->offset);
4430                         floppy_release_allocated_regions(fdc, p);
4431                         return -EBUSY;
4432                 }
4433         }
4434         return 0;
4435 }
4436
4437 static void floppy_release_regions(int fdc)
4438 {
4439         floppy_release_allocated_regions(fdc, ARRAY_END(io_regions));
4440 }
4441
4442 static int floppy_grab_irq_and_dma(void)
4443 {
4444         unsigned long flags;
4445
4446         spin_lock_irqsave(&floppy_usage_lock, flags);
4447         if (usage_count++) {
4448                 spin_unlock_irqrestore(&floppy_usage_lock, flags);
4449                 return 0;
4450         }
4451         spin_unlock_irqrestore(&floppy_usage_lock, flags);
4452
4453         /*
4454          * We might have scheduled a free_irq(), wait it to
4455          * drain first:
4456          */
4457         flush_scheduled_work();
4458
4459         if (fd_request_irq()) {
4460                 DPRINT("Unable to grab IRQ%d for the floppy driver\n",
4461                        FLOPPY_IRQ);
4462                 spin_lock_irqsave(&floppy_usage_lock, flags);
4463                 usage_count--;
4464                 spin_unlock_irqrestore(&floppy_usage_lock, flags);
4465                 return -1;
4466         }
4467         if (fd_request_dma()) {
4468                 DPRINT("Unable to grab DMA%d for the floppy driver\n",
4469                        FLOPPY_DMA);
4470                 if (can_use_virtual_dma & 2)
4471                         use_virtual_dma = can_use_virtual_dma = 1;
4472                 if (!(can_use_virtual_dma & 1)) {
4473                         fd_free_irq();
4474                         spin_lock_irqsave(&floppy_usage_lock, flags);
4475                         usage_count--;
4476                         spin_unlock_irqrestore(&floppy_usage_lock, flags);
4477                         return -1;
4478                 }
4479         }
4480
4481         for (fdc = 0; fdc < N_FDC; fdc++) {
4482                 if (FDCS->address != -1) {
4483                         if (floppy_request_regions(fdc))
4484                                 goto cleanup;
4485                 }
4486         }
4487         for (fdc = 0; fdc < N_FDC; fdc++) {
4488                 if (FDCS->address != -1) {
4489                         reset_fdc_info(1);
4490                         fd_outb(FDCS->dor, FD_DOR);
4491                 }
4492         }
4493         fdc = 0;
4494         set_dor(0, ~0, 8);      /* avoid immediate interrupt */
4495
4496         for (fdc = 0; fdc < N_FDC; fdc++)
4497                 if (FDCS->address != -1)
4498                         fd_outb(FDCS->dor, FD_DOR);
4499         /*
4500          * The driver will try and free resources and relies on us
4501          * to know if they were allocated or not.
4502          */
4503         fdc = 0;
4504         irqdma_allocated = 1;
4505         return 0;
4506 cleanup:
4507         fd_free_irq();
4508         fd_free_dma();
4509         while (--fdc >= 0)
4510                 floppy_release_regions(fdc);
4511         spin_lock_irqsave(&floppy_usage_lock, flags);
4512         usage_count--;
4513         spin_unlock_irqrestore(&floppy_usage_lock, flags);
4514         return -1;
4515 }
4516
4517 static void floppy_release_irq_and_dma(void)
4518 {
4519         int old_fdc;
4520 #ifdef FLOPPY_SANITY_CHECK
4521 #ifndef __sparc__
4522         int drive;
4523 #endif
4524 #endif
4525         long tmpsize;
4526         unsigned long tmpaddr;
4527         unsigned long flags;
4528
4529         spin_lock_irqsave(&floppy_usage_lock, flags);
4530         if (--usage_count) {
4531                 spin_unlock_irqrestore(&floppy_usage_lock, flags);
4532                 return;
4533         }
4534         spin_unlock_irqrestore(&floppy_usage_lock, flags);
4535         if (irqdma_allocated) {
4536                 fd_disable_dma();
4537                 fd_free_dma();
4538                 fd_free_irq();
4539                 irqdma_allocated = 0;
4540         }
4541         set_dor(0, ~0, 8);
4542 #if N_FDC > 1
4543         set_dor(1, ~8, 0);
4544 #endif
4545         floppy_enable_hlt();
4546
4547         if (floppy_track_buffer && max_buffer_sectors) {
4548                 tmpsize = max_buffer_sectors * 1024;
4549                 tmpaddr = (unsigned long)floppy_track_buffer;
4550                 floppy_track_buffer = NULL;
4551                 max_buffer_sectors = 0;
4552                 buffer_min = buffer_max = -1;
4553                 fd_dma_mem_free(tmpaddr, tmpsize);
4554         }
4555 #ifdef FLOPPY_SANITY_CHECK
4556 #ifndef __sparc__
4557         for (drive = 0; drive < N_FDC * 4; drive++)
4558                 if (timer_pending(motor_off_timer + drive))
4559                         pr_info("motor off timer %d still active\n", drive);
4560 #endif
4561
4562         if (timer_pending(&fd_timeout))
4563                 pr_info("floppy timer still active:%s\n", timeout_message);
4564         if (timer_pending(&fd_timer))
4565                 pr_info("auxiliary floppy timer still active\n");
4566         if (work_pending(&floppy_work))
4567                 pr_info("work still pending\n");
4568 #endif
4569         old_fdc = fdc;
4570         for (fdc = 0; fdc < N_FDC; fdc++)
4571                 if (FDCS->address != -1)
4572                         floppy_release_regions(fdc);
4573         fdc = old_fdc;
4574 }
4575
4576 #ifdef MODULE
4577
4578 static char *floppy;
4579
4580 static void __init parse_floppy_cfg_string(char *cfg)
4581 {
4582         char *ptr;
4583
4584         while (*cfg) {
4585                 ptr = cfg;
4586                 while (*cfg && *cfg != ' ' && *cfg != '\t')
4587                         cfg++;
4588                 if (*cfg) {
4589                         *cfg = '\0';
4590                         cfg++;
4591                 }
4592                 if (*ptr)
4593                         floppy_setup(ptr);
4594         }
4595 }
4596
4597 static int __init floppy_module_init(void)
4598 {
4599         if (floppy)
4600                 parse_floppy_cfg_string(floppy);
4601         return floppy_init();
4602 }
4603 module_init(floppy_module_init);
4604
4605 static void __exit floppy_module_exit(void)
4606 {
4607         int drive;
4608
4609         blk_unregister_region(MKDEV(FLOPPY_MAJOR, 0), 256);
4610         unregister_blkdev(FLOPPY_MAJOR, "fd");
4611         platform_driver_unregister(&floppy_driver);
4612
4613         for (drive = 0; drive < N_DRIVE; drive++) {
4614                 del_timer_sync(&motor_off_timer[drive]);
4615
4616                 if ((allowed_drive_mask & (1 << drive)) &&
4617                     fdc_state[FDC(drive)].version != FDC_NONE) {
4618                         del_gendisk(disks[drive]);
4619                         device_remove_file(&floppy_device[drive].dev, &dev_attr_cmos);
4620                         platform_device_unregister(&floppy_device[drive]);
4621                 }
4622                 put_disk(disks[drive]);
4623         }
4624
4625         del_timer_sync(&fd_timeout);
4626         del_timer_sync(&fd_timer);
4627         blk_cleanup_queue(floppy_queue);
4628
4629         if (usage_count)
4630                 floppy_release_irq_and_dma();
4631
4632         /* eject disk, if any */
4633         fd_eject(0);
4634 }
4635
4636 module_exit(floppy_module_exit);
4637
4638 module_param(floppy, charp, 0);
4639 module_param(FLOPPY_IRQ, int, 0);
4640 module_param(FLOPPY_DMA, int, 0);
4641 MODULE_AUTHOR("Alain L. Knaff");
4642 MODULE_SUPPORTED_DEVICE("fd");
4643 MODULE_LICENSE("GPL");
4644
4645 /* This doesn't actually get used other than for module information */
4646 static const struct pnp_device_id floppy_pnpids[] = {
4647         {"PNP0700", 0},
4648         {}
4649 };
4650
4651 MODULE_DEVICE_TABLE(pnp, floppy_pnpids);
4652
4653 #else
4654
4655 __setup("floppy=", floppy_setup);
4656 module_init(floppy_init)
4657 #endif
4658
4659 MODULE_ALIAS_BLOCKDEV_MAJOR(FLOPPY_MAJOR);