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