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