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