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