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