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