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