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