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