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