GNU Linux-libre 5.10.215-gnu1
[releases.git] / drivers / block / floppy.c
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  *  linux/drivers/block/floppy.c
4  *
5  *  Copyright (C) 1991, 1992  Linus Torvalds
6  *  Copyright (C) 1993, 1994  Alain Knaff
7  *  Copyright (C) 1998 Alan Cox
8  */
9
10 /*
11  * 02.12.91 - Changed to static variables to indicate need for reset
12  * and recalibrate. This makes some things easier (output_byte reset
13  * checking etc), and means less interrupt jumping in case of errors,
14  * so the code is hopefully easier to understand.
15  */
16
17 /*
18  * This file is certainly a mess. I've tried my best to get it working,
19  * but I don't like programming floppies, and I have only one anyway.
20  * Urgel. I should check for more errors, and do more graceful error
21  * recovery. Seems there are problems with several drives. I've tried to
22  * correct them. No promises.
23  */
24
25 /*
26  * As with hd.c, all routines within this file can (and will) be called
27  * by interrupts, so extreme caution is needed. A hardware interrupt
28  * handler may not sleep, or a kernel panic will happen. Thus I cannot
29  * call "floppy-on" directly, but have to set a special timer interrupt
30  * etc.
31  */
32
33 /*
34  * 28.02.92 - made track-buffering routines, based on the routines written
35  * by entropy@wintermute.wpi.edu (Lawrence Foard). Linus.
36  */
37
38 /*
39  * Automatic floppy-detection and formatting written by Werner Almesberger
40  * (almesber@nessie.cs.id.ethz.ch), who also corrected some problems with
41  * the floppy-change signal detection.
42  */
43
44 /*
45  * 1992/7/22 -- Hennus Bergman: Added better error reporting, fixed
46  * FDC data overrun bug, added some preliminary stuff for vertical
47  * recording support.
48  *
49  * 1992/9/17: Added DMA allocation & DMA functions. -- hhb.
50  *
51  * TODO: Errors are still not counted properly.
52  */
53
54 /* 1992/9/20
55  * Modifications for ``Sector Shifting'' by Rob Hooft (hooft@chem.ruu.nl)
56  * modeled after the freeware MS-DOS program fdformat/88 V1.8 by
57  * Christoph H. Hochst\"atter.
58  * I have fixed the shift values to the ones I always use. Maybe a new
59  * ioctl() should be created to be able to modify them.
60  * There is a bug in the driver that makes it impossible to format a
61  * floppy as the first thing after bootup.
62  */
63
64 /*
65  * 1993/4/29 -- Linus -- cleaned up the timer handling in the kernel, and
66  * this helped the floppy driver as well. Much cleaner, and still seems to
67  * work.
68  */
69
70 /* 1994/6/24 --bbroad-- added the floppy table entries and made
71  * minor modifications to allow 2.88 floppies to be run.
72  */
73
74 /* 1994/7/13 -- Paul Vojta -- modified the probing code to allow three or more
75  * disk types.
76  */
77
78 /*
79  * 1994/8/8 -- Alain Knaff -- Switched to fdpatch driver: Support for bigger
80  * format bug fixes, but unfortunately some new bugs too...
81  */
82
83 /* 1994/9/17 -- Koen Holtman -- added logging of physical floppy write
84  * errors to allow safe writing by specialized programs.
85  */
86
87 /* 1995/4/24 -- Dan Fandrich -- added support for Commodore 1581 3.5" disks
88  * by defining bit 1 of the "stretch" parameter to mean put sectors on the
89  * opposite side of the disk, leaving the sector IDs alone (i.e. Commodore's
90  * drives are "upside-down").
91  */
92
93 /*
94  * 1995/8/26 -- Andreas Busse -- added Mips support.
95  */
96
97 /*
98  * 1995/10/18 -- Ralf Baechle -- Portability cleanup; move machine dependent
99  * features to asm/floppy.h.
100  */
101
102 /*
103  * 1998/1/21 -- Richard Gooch <rgooch@atnf.csiro.au> -- devfs support
104  */
105
106 /*
107  * 1998/05/07 -- Russell King -- More portability cleanups; moved definition of
108  * interrupt and dma channel to asm/floppy.h. Cleaned up some formatting &
109  * use of '0' for NULL.
110  */
111
112 /*
113  * 1998/06/07 -- Alan Cox -- Merged the 2.0.34 fixes for resource allocation
114  * failures.
115  */
116
117 /*
118  * 1998/09/20 -- David Weinehall -- Added slow-down code for buggy PS/2-drives.
119  */
120
121 /*
122  * 1999/08/13 -- Paul Slootman -- floppy stopped working on Alpha after 24
123  * days, 6 hours, 32 minutes and 32 seconds (i.e. MAXINT jiffies; ints were
124  * being used to store jiffies, which are unsigned longs).
125  */
126
127 /*
128  * 2000/08/28 -- Arnaldo Carvalho de Melo <acme@conectiva.com.br>
129  * - get rid of check_region
130  * - s/suser/capable/
131  */
132
133 /*
134  * 2001/08/26 -- Paul Gortmaker - fix insmod oops on machines with no
135  * floppy controller (lingering task on list after module is gone... boom.)
136  */
137
138 /*
139  * 2002/02/07 -- Anton Altaparmakov - Fix io ports reservation to correct range
140  * (0x3f2-0x3f5, 0x3f7). This fix is a bit of a hack but the proper fix
141  * requires many non-obvious changes in arch dependent code.
142  */
143
144 /* 2003/07/28 -- Daniele Bellucci <bellucda@tiscali.it>.
145  * Better audit of register_blkdev.
146  */
147
148 #undef  FLOPPY_SILENT_DCL_CLEAR
149
150 #define REALLY_SLOW_IO
151
152 #define DEBUGT 2
153
154 #define DPRINT(format, args...) \
155         pr_info("floppy%d: " format, current_drive, ##args)
156
157 #define DCL_DEBUG               /* debug disk change line */
158 #ifdef DCL_DEBUG
159 #define debug_dcl(test, fmt, args...) \
160         do { if ((test) & FD_DEBUG) DPRINT(fmt, ##args); } while (0)
161 #else
162 #define debug_dcl(test, fmt, args...) \
163         do { if (0) DPRINT(fmt, ##args); } while (0)
164 #endif
165
166 /* do print messages for unexpected interrupts */
167 static int print_unex = 1;
168 #include <linux/module.h>
169 #include <linux/sched.h>
170 #include <linux/fs.h>
171 #include <linux/kernel.h>
172 #include <linux/timer.h>
173 #include <linux/workqueue.h>
174 #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  */
202 static DEFINE_MUTEX(floppy_mutex);
203 static int slow_floppy;
204
205 #include <asm/dma.h>
206 #include <asm/irq.h>
207
208 static int FLOPPY_IRQ = 6;
209 static int FLOPPY_DMA = 2;
210 static int can_use_virtual_dma = 2;
211 /* =======
212  * can use virtual DMA:
213  * 0 = use of virtual DMA disallowed by config
214  * 1 = use of virtual DMA prescribed by config
215  * 2 = no virtual DMA preference configured.  By default try hard DMA,
216  * but fall back on virtual DMA when not enough memory available
217  */
218
219 static int use_virtual_dma;
220 /* =======
221  * use virtual DMA
222  * 0 using hard DMA
223  * 1 using virtual DMA
224  * This variable is set to virtual when a DMA mem problem arises, and
225  * reset back in floppy_grab_irq_and_dma.
226  * It is not safe to reset it in other circumstances, because the floppy
227  * driver may have several buffers in use at once, and we do currently not
228  * record each buffers capabilities
229  */
230
231 static DEFINE_SPINLOCK(floppy_lock);
232
233 static unsigned short virtual_dma_port = 0x3f0;
234 irqreturn_t floppy_interrupt(int irq, void *dev_id);
235 static int set_dor(int fdc, char mask, char data);
236
237 #define K_64    0x10000         /* 64KB */
238
239 /* the following is the mask of allowed drives. By default units 2 and
240  * 3 of both floppy controllers are disabled, because switching on the
241  * motor of these drives causes system hangs on some PCI computers. drive
242  * 0 is the low bit (0x1), and drive 7 is the high bit (0x80). Bits are on if
243  * a drive is allowed.
244  *
245  * NOTE: This must come before we include the arch floppy header because
246  *       some ports reference this variable from there. -DaveM
247  */
248
249 static int allowed_drive_mask = 0x33;
250
251 #include <asm/floppy.h>
252
253 static int irqdma_allocated;
254
255 #include <linux/blk-mq.h>
256 #include <linux/blkpg.h>
257 #include <linux/cdrom.h>        /* for the compatibility eject ioctl */
258 #include <linux/completion.h>
259
260 static LIST_HEAD(floppy_reqs);
261 static struct request *current_req;
262 static int set_next_request(void);
263
264 #ifndef fd_get_dma_residue
265 #define fd_get_dma_residue() get_dma_residue(FLOPPY_DMA)
266 #endif
267
268 /* Dma Memory related stuff */
269
270 #ifndef fd_dma_mem_free
271 #define fd_dma_mem_free(addr, size) free_pages(addr, get_order(size))
272 #endif
273
274 #ifndef fd_dma_mem_alloc
275 #define fd_dma_mem_alloc(size) __get_dma_pages(GFP_KERNEL, get_order(size))
276 #endif
277
278 #ifndef fd_cacheflush
279 #define fd_cacheflush(addr, size) /* nothing... */
280 #endif
281
282 static 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
298 static unsigned long fake_change;
299 static 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  */
340 static unsigned char reply_buffer[FD_RAW_REPLY_SIZE];
341 static 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  */
356 static 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
401 static struct floppy_drive_params drive_params[N_DRIVE];
402 static struct floppy_drive_struct drive_state[N_DRIVE];
403 static struct floppy_write_errors write_errors[N_DRIVE];
404 static struct timer_list motor_off_timer[N_DRIVE];
405 static struct gendisk *disks[N_DRIVE];
406 static struct blk_mq_tag_set tag_sets[N_DRIVE];
407 static struct block_device *opened_bdev[N_DRIVE];
408 static DEFINE_MUTEX(open_lock);
409 static 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) */
442 static 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. */
483 static 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  */
489 static struct floppy_struct user_params[N_DRIVE];
490
491 static sector_t floppy_sizes[256];
492
493 static 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  */
500 static 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
507 static volatile int command_status = FD_COMMAND_NONE;
508 static unsigned long fdc_busy;
509 static DECLARE_WAIT_QUEUE_HEAD(fdc_wait);
510 static DECLARE_WAIT_QUEUE_HEAD(command_done);
511
512 /* errors encountered on the current (or last) request */
513 static int floppy_errors;
514
515 /* Format request descriptor. */
516 static 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  */
530 static char *floppy_track_buffer;
531 static int max_buffer_sectors;
532
533 typedef void (*done_f)(int);
534 static 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
544 static void floppy_ready(void);
545 static void floppy_start(void);
546 static void process_fd_request(void);
547 static void recalibrate_floppy(void);
548 static void floppy_shutdown(struct work_struct *);
549
550 static int floppy_request_regions(int);
551 static void floppy_release_regions(int);
552 static int floppy_grab_irq_and_dma(void);
553 static 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  */
562 static void reset_fdc(void);
563 static 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
574 static atomic_t usage_count = ATOMIC_INIT(0);
575
576 /* buffer related variables */
577 static int buffer_track = -1;
578 static int buffer_drive = -1;
579 static int buffer_min = -1;
580 static int buffer_max = -1;
581
582 /* fdc related variables, should end up in a struct */
583 static struct floppy_fdc_state fdc_state[N_FDC];
584 static int current_fdc;                 /* current fdc */
585
586 static struct workqueue_struct *floppy_wq;
587
588 static struct floppy_struct *_floppy = floppy_type;
589 static unsigned char current_drive;
590 static long current_count_sectors;
591 static unsigned char fsector_t; /* sector in track */
592 static unsigned char in_sector_offset;  /* offset within physical sector,
593                                          * expressed in units of 512 bytes */
594
595 static inline unsigned char fdc_inb(int fdc, int reg)
596 {
597         return fd_inb(fdc_state[fdc].address, reg);
598 }
599
600 static inline void fdc_outb(unsigned char value, int fdc, int reg)
601 {
602         fd_outb(value, fdc_state[fdc].address, reg);
603 }
604
605 static 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
611 static inline int fd_eject(int drive)
612 {
613         return -EINVAL;
614 }
615 #endif
616
617 /*
618  * Debugging
619  * =========
620  */
621 #ifdef DEBUGT
622 static long unsigned debugtimer;
623
624 static inline void set_debugt(void)
625 {
626         debugtimer = jiffies;
627 }
628
629 static 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
635 static inline void set_debugt(void) { }
636 static inline void debugt(const char *func, const char *msg) { }
637 #endif /* DEBUGT */
638
639
640 static DECLARE_DELAYED_WORK(fd_timeout, floppy_shutdown);
641 static const char *timeout_message;
642
643 static 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
652 static void (*do_floppy)(void) = NULL;
653
654 #define OLOGSIZE 20
655
656 static void (*lasthandler)(void);
657 static unsigned long interruptjiffies;
658 static unsigned long resultjiffies;
659 static int resultsize;
660 static unsigned long lastredo;
661
662 static struct output_log {
663         unsigned char data;
664         unsigned char status;
665         unsigned long jiffies;
666 } output_log[OLOGSIZE];
667
668 static int output_log_pos;
669
670 #define MAXTIMEOUT -2
671
672 static 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
688 static 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
733 static 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
782 static inline int is_selected(int dor, int unit)
783 {
784         return ((dor & (0x10 << unit)) && (dor & 3) == unit);
785 }
786
787 static bool is_ready_state(int status)
788 {
789         int state = status & (STATUS_READY | STATUS_DIR | STATUS_DMA);
790         return state == STATUS_READY;
791 }
792
793 static 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
825 static 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  */
839 static 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  */
857 static 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  */
889 static 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 */
906 static 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 */
921 static 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 */
933 static 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  */
960 static 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
984 static void empty(void)
985 {
986 }
987
988 static void (*floppy_work_fn)(void);
989
990 static void floppy_work_workfn(struct work_struct *work)
991 {
992         floppy_work_fn();
993 }
994
995 static DECLARE_WORK(floppy_work, floppy_work_workfn);
996
997 static 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
1005 static void (*fd_timer_fn)(void) = NULL;
1006
1007 static void fd_timer_workfn(struct work_struct *work)
1008 {
1009         fd_timer_fn();
1010 }
1011
1012 static DECLARE_DELAYED_WORK(fd_timer, fd_timer_workfn);
1013
1014 static 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 */
1023 static 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
1040 static 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 */
1047 static 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
1066 static 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
1110 static void show_floppy(int fdc);
1111
1112 /* waits until the fdc becomes ready */
1113 static 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 */
1134 static 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 */
1159 static 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? */
1190 static 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  */
1206 static 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
1243 static int fifo_depth = 0xa;
1244 static int no_fifo;
1245
1246 static 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  */
1279 static 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  */
1364 static 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
1382 static 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
1390 static 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  */
1428 static 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  */
1482 static 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
1535 static int blind_seek;
1536
1537 /*
1538  * This is the routine called after every seek (or recalibrate) interrupt
1539  * from the floppy controller.
1540  */
1541 static 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
1567 static 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
1593 static 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
1653 static 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
1700 static 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 */
1712 irqreturn_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
1772 static 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  */
1784 static 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  */
1801 static 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
1826 static 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
1870 static 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 */
1898 static 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
1926 static 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
1964 static 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
1989 static 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
1997 static const struct cont_t wakeup_cont = {
1998         .interrupt      = empty,
1999         .redo           = do_wakeup,
2000         .error          = empty,
2001         .done           = (done_f)empty
2002 };
2003
2004 static 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  */
2014 static 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
2042 static void generic_done(int result)
2043 {
2044         command_status = result;
2045         cont = &wakeup_cont;
2046 }
2047
2048 static void generic_success(void)
2049 {
2050         cont->done(1);
2051 }
2052
2053 static void generic_failure(void)
2054 {
2055         cont->done(0);
2056 }
2057
2058 static void success_and_wakeup(void)
2059 {
2060         generic_success();
2061         cont->redo();
2062 }
2063
2064 /*
2065  * formatting and rw support.
2066  * ==========================
2067  */
2068
2069 static 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
2088 static 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
2107 static 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  */
2121 static 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
2137 static 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
2209 static 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
2217 static 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
2224 static 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
2256 static 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 */
2275 static 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 */
2315 static 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. */
2412 static 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 */
2433 static 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  */
2449 static 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  */
2534 static 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
2565 static 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
2842 static 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  */
2857 static 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
2866 do_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
2923 static 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 */
2931 static void process_fd_request(void)
2932 {
2933         cont = &rw_cont;
2934         schedule_bh(redo_fd_request);
2935 }
2936
2937 static 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
2971 static 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
2978 static 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
2998 static void reset_intr(void)
2999 {
3000         pr_info("weird, reset interrupt called\n");
3001 }
3002
3003 static 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  */
3014 static 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  */
3040 static 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
3046 static 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
3052 static 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 */
3073 static 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
3117 static 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
3124 static 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
3153 static 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
3174 static 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
3183 loop:
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
3226 static 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
3276 static 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
3297 static int floppy_raw_cmd_ioctl(int type, int drive, int cmd,
3298                                 void __user *param)
3299 {
3300         return -EOPNOTSUPP;
3301 }
3302
3303 #endif
3304
3305 static 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
3315 static 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 */
3390 static 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
3418 static 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
3436 static 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
3453 static 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
3470 static 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
3488 static 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
3660 static 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
3674 struct 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
3696 struct 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
3714 struct 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
3730 struct 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
3748 static 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
3774 static 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
3796 static 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
3832 static 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
3866 static 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;
3900 Eintr:
3901         mutex_unlock(&floppy_mutex);
3902         return -EINTR;
3903 }
3904
3905 static 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
3934 static 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
3955 static 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
4004 static 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
4057 static 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  */
4078 static 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;
4164 out:
4165         drive_state[drive].fd_ref--;
4166
4167         if (!drive_state[drive].fd_ref)
4168                 opened_bdev[drive] = NULL;
4169 out2:
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  */
4178 static 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
4208 struct rb0_cbdata {
4209         int drive;
4210         struct completion complete;
4211 };
4212
4213 static 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
4226 static 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 */
4267 static 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
4311 static 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 */
4330 static 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
4409 static 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
4422 static 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
4441 static 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
4462 static 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
4499 static 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
4538 static int have_no_fdc = -ENODEV;
4539
4540 static 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
4550 static DEVICE_ATTR(cmos, 0444, floppy_cmos_show, NULL);
4551
4552 static struct attribute *floppy_dev_attrs[] = {
4553         &dev_attr_cmos.attr,
4554         NULL
4555 };
4556
4557 ATTRIBUTE_GROUPS(floppy_dev);
4558
4559 static void floppy_device_release(struct device *dev)
4560 {
4561 }
4562
4563 static 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
4576 static const struct dev_pm_ops floppy_pm_ops = {
4577         .resume = floppy_resume,
4578         .restore = floppy_resume,
4579 };
4580
4581 static struct platform_driver floppy_driver = {
4582         .driver = {
4583                    .name = "floppy",
4584                    .pm = &floppy_pm_ops,
4585         },
4586 };
4587
4588 static const struct blk_mq_ops floppy_mq_ops = {
4589         .queue_rq = floppy_queue_rq,
4590 };
4591
4592 static struct platform_device floppy_device[N_DRIVE];
4593
4594 static 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
4603 static 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
4614 static 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
4793 out_remove_drives:
4794         while (drive--) {
4795                 if (floppy_available(drive)) {
4796                         del_gendisk(disks[drive]);
4797                         platform_device_unregister(&floppy_device[drive]);
4798                 }
4799         }
4800 out_release_dma:
4801         if (atomic_read(&usage_count))
4802                 floppy_release_irq_and_dma();
4803 out_unreg_region:
4804         blk_unregister_region(MKDEV(FLOPPY_MAJOR, 0), 256);
4805         platform_driver_unregister(&floppy_driver);
4806 out_unreg_blkdev:
4807         unregister_blkdev(FLOPPY_MAJOR, "fd");
4808 out_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
4825 static __init void floppy_async_init(void *data, async_cookie_t cookie)
4826 {
4827         do_floppy_init();
4828 }
4829 #endif
4830
4831 static 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
4842 static 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
4854 static 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
4864 static 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
4880 static void floppy_release_regions(int fdc)
4881 {
4882         floppy_release_allocated_regions(fdc, ARRAY_END(io_regions));
4883 }
4884
4885 static 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;
4941 cleanup:
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
4951 static 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
5001 static char *floppy;
5002
5003 static 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
5020 static int __init floppy_module_init(void)
5021 {
5022         if (floppy)
5023                 parse_floppy_cfg_string(floppy);
5024         return floppy_init();
5025 }
5026 module_init(floppy_module_init);
5027
5028 static 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
5069 module_exit(floppy_module_exit);
5070
5071 module_param(floppy, charp, 0);
5072 module_param(FLOPPY_IRQ, int, 0);
5073 module_param(FLOPPY_DMA, int, 0);
5074 MODULE_AUTHOR("Alain L. Knaff");
5075 MODULE_SUPPORTED_DEVICE("fd");
5076 MODULE_LICENSE("GPL");
5077
5078 /* This doesn't actually get used other than for module information */
5079 static const struct pnp_device_id floppy_pnpids[] = {
5080         {"PNP0700", 0},
5081         {}
5082 };
5083
5084 MODULE_DEVICE_TABLE(pnp, floppy_pnpids);
5085
5086 #else
5087
5088 __setup("floppy=", floppy_setup);
5089 module_init(floppy_init)
5090 #endif
5091
5092 MODULE_ALIAS_BLOCKDEV_MAJOR(FLOPPY_MAJOR);