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