GNU Linux-libre 4.9.337-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, int 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, -EIO);
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 type=%x flags=%llx\n",
2910                  current_req, (long)blk_rq_pos(current_req), current_req->cmd_type,
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_USER);
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_error) {
4165                 pr_info("floppy: error %d while reading block 0\n",
4166                         bio->bi_error);
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);
4193         bio.bi_io_vec = &bio_vec;
4194         bio_vec.bv_page = page;
4195         bio_vec.bv_len = size;
4196         bio_vec.bv_offset = 0;
4197         bio.bi_vcnt = 1;
4198         bio.bi_iter.bi_size = size;
4199         bio.bi_bdev = bdev;
4200         bio.bi_iter.bi_sector = 0;
4201         bio.bi_flags |= (1 << BIO_QUIET);
4202         bio.bi_private = &cbdata;
4203         bio.bi_end_io = floppy_rb0_cb;
4204         bio_set_op_attrs(&bio, REQ_OP_READ, 0);
4205
4206         init_completion(&cbdata.complete);
4207
4208         submit_bio(&bio);
4209         process_fd_request();
4210
4211         wait_for_completion(&cbdata.complete);
4212
4213         __free_page(page);
4214
4215         return 0;
4216 }
4217
4218 /* revalidate the floppy disk, i.e. trigger format autodetection by reading
4219  * the bootblock (block 0). "Autodetection" is also needed to check whether
4220  * there is a disk in the drive at all... Thus we also do it for fixed
4221  * geometry formats */
4222 static int floppy_revalidate(struct gendisk *disk)
4223 {
4224         int drive = (long)disk->private_data;
4225         int cf;
4226         int res = 0;
4227
4228         if (test_bit(FD_DISK_CHANGED_BIT, &UDRS->flags) ||
4229             test_bit(FD_VERIFY_BIT, &UDRS->flags) ||
4230             test_bit(drive, &fake_change) ||
4231             drive_no_geom(drive)) {
4232                 if (WARN(atomic_read(&usage_count) == 0,
4233                          "VFS: revalidate called on non-open device.\n"))
4234                         return -EFAULT;
4235
4236                 res = lock_fdc(drive);
4237                 if (res)
4238                         return res;
4239                 cf = (test_bit(FD_DISK_CHANGED_BIT, &UDRS->flags) ||
4240                       test_bit(FD_VERIFY_BIT, &UDRS->flags));
4241                 if (!(cf || test_bit(drive, &fake_change) || drive_no_geom(drive))) {
4242                         process_fd_request();   /*already done by another thread */
4243                         return 0;
4244                 }
4245                 UDRS->maxblock = 0;
4246                 UDRS->maxtrack = 0;
4247                 if (buffer_drive == drive)
4248                         buffer_track = -1;
4249                 clear_bit(drive, &fake_change);
4250                 clear_bit(FD_DISK_CHANGED_BIT, &UDRS->flags);
4251                 if (cf)
4252                         UDRS->generation++;
4253                 if (drive_no_geom(drive)) {
4254                         /* auto-sensing */
4255                         res = __floppy_read_block_0(opened_bdev[drive], drive);
4256                 } else {
4257                         if (cf)
4258                                 poll_drive(false, FD_RAW_NEED_DISK);
4259                         process_fd_request();
4260                 }
4261         }
4262         set_capacity(disk, floppy_sizes[UDRS->fd_device]);
4263         return res;
4264 }
4265
4266 static const struct block_device_operations floppy_fops = {
4267         .owner                  = THIS_MODULE,
4268         .open                   = floppy_open,
4269         .release                = floppy_release,
4270         .ioctl                  = fd_ioctl,
4271         .getgeo                 = fd_getgeo,
4272         .check_events           = floppy_check_events,
4273         .revalidate_disk        = floppy_revalidate,
4274 #ifdef CONFIG_COMPAT
4275         .compat_ioctl           = fd_compat_ioctl,
4276 #endif
4277 };
4278
4279 /*
4280  * Floppy Driver initialization
4281  * =============================
4282  */
4283
4284 /* Determine the floppy disk controller type */
4285 /* This routine was written by David C. Niemi */
4286 static char __init get_fdc_version(void)
4287 {
4288         int r;
4289
4290         output_byte(FD_DUMPREGS);       /* 82072 and better know DUMPREGS */
4291         if (FDCS->reset)
4292                 return FDC_NONE;
4293         r = result();
4294         if (r <= 0x00)
4295                 return FDC_NONE;        /* No FDC present ??? */
4296         if ((r == 1) && (reply_buffer[0] == 0x80)) {
4297                 pr_info("FDC %d is an 8272A\n", fdc);
4298                 return FDC_8272A;       /* 8272a/765 don't know DUMPREGS */
4299         }
4300         if (r != 10) {
4301                 pr_info("FDC %d init: DUMPREGS: unexpected return of %d bytes.\n",
4302                         fdc, r);
4303                 return FDC_UNKNOWN;
4304         }
4305
4306         if (!fdc_configure()) {
4307                 pr_info("FDC %d is an 82072\n", fdc);
4308                 return FDC_82072;       /* 82072 doesn't know CONFIGURE */
4309         }
4310
4311         output_byte(FD_PERPENDICULAR);
4312         if (need_more_output() == MORE_OUTPUT) {
4313                 output_byte(0);
4314         } else {
4315                 pr_info("FDC %d is an 82072A\n", fdc);
4316                 return FDC_82072A;      /* 82072A as found on Sparcs. */
4317         }
4318
4319         output_byte(FD_UNLOCK);
4320         r = result();
4321         if ((r == 1) && (reply_buffer[0] == 0x80)) {
4322                 pr_info("FDC %d is a pre-1991 82077\n", fdc);
4323                 return FDC_82077_ORIG;  /* Pre-1991 82077, doesn't know
4324                                          * LOCK/UNLOCK */
4325         }
4326         if ((r != 1) || (reply_buffer[0] != 0x00)) {
4327                 pr_info("FDC %d init: UNLOCK: unexpected return of %d bytes.\n",
4328                         fdc, r);
4329                 return FDC_UNKNOWN;
4330         }
4331         output_byte(FD_PARTID);
4332         r = result();
4333         if (r != 1) {
4334                 pr_info("FDC %d init: PARTID: unexpected return of %d bytes.\n",
4335                         fdc, r);
4336                 return FDC_UNKNOWN;
4337         }
4338         if (reply_buffer[0] == 0x80) {
4339                 pr_info("FDC %d is a post-1991 82077\n", fdc);
4340                 return FDC_82077;       /* Revised 82077AA passes all the tests */
4341         }
4342         switch (reply_buffer[0] >> 5) {
4343         case 0x0:
4344                 /* Either a 82078-1 or a 82078SL running at 5Volt */
4345                 pr_info("FDC %d is an 82078.\n", fdc);
4346                 return FDC_82078;
4347         case 0x1:
4348                 pr_info("FDC %d is a 44pin 82078\n", fdc);
4349                 return FDC_82078;
4350         case 0x2:
4351                 pr_info("FDC %d is a S82078B\n", fdc);
4352                 return FDC_S82078B;
4353         case 0x3:
4354                 pr_info("FDC %d is a National Semiconductor PC87306\n", fdc);
4355                 return FDC_87306;
4356         default:
4357                 pr_info("FDC %d init: 82078 variant with unknown PARTID=%d.\n",
4358                         fdc, reply_buffer[0] >> 5);
4359                 return FDC_82078_UNKN;
4360         }
4361 }                               /* get_fdc_version */
4362
4363 /* lilo configuration */
4364
4365 static void __init floppy_set_flags(int *ints, int param, int param2)
4366 {
4367         int i;
4368
4369         for (i = 0; i < ARRAY_SIZE(default_drive_params); i++) {
4370                 if (param)
4371                         default_drive_params[i].params.flags |= param2;
4372                 else
4373                         default_drive_params[i].params.flags &= ~param2;
4374         }
4375         DPRINT("%s flag 0x%x\n", param2 ? "Setting" : "Clearing", param);
4376 }
4377
4378 static void __init daring(int *ints, int param, int param2)
4379 {
4380         int i;
4381
4382         for (i = 0; i < ARRAY_SIZE(default_drive_params); i++) {
4383                 if (param) {
4384                         default_drive_params[i].params.select_delay = 0;
4385                         default_drive_params[i].params.flags |=
4386                             FD_SILENT_DCL_CLEAR;
4387                 } else {
4388                         default_drive_params[i].params.select_delay =
4389                             2 * HZ / 100;
4390                         default_drive_params[i].params.flags &=
4391                             ~FD_SILENT_DCL_CLEAR;
4392                 }
4393         }
4394         DPRINT("Assuming %s floppy hardware\n", param ? "standard" : "broken");
4395 }
4396
4397 static void __init set_cmos(int *ints, int dummy, int dummy2)
4398 {
4399         int current_drive = 0;
4400
4401         if (ints[0] != 2) {
4402                 DPRINT("wrong number of parameters for CMOS\n");
4403                 return;
4404         }
4405         current_drive = ints[1];
4406         if (current_drive < 0 || current_drive >= 8) {
4407                 DPRINT("bad drive for set_cmos\n");
4408                 return;
4409         }
4410 #if N_FDC > 1
4411         if (current_drive >= 4 && !FDC2)
4412                 FDC2 = 0x370;
4413 #endif
4414         DP->cmos = ints[2];
4415         DPRINT("setting CMOS code to %d\n", ints[2]);
4416 }
4417
4418 static struct param_table {
4419         const char *name;
4420         void (*fn) (int *ints, int param, int param2);
4421         int *var;
4422         int def_param;
4423         int param2;
4424 } config_params[] __initdata = {
4425         {"allowed_drive_mask", NULL, &allowed_drive_mask, 0xff, 0}, /* obsolete */
4426         {"all_drives", NULL, &allowed_drive_mask, 0xff, 0},     /* obsolete */
4427         {"asus_pci", NULL, &allowed_drive_mask, 0x33, 0},
4428         {"irq", NULL, &FLOPPY_IRQ, 6, 0},
4429         {"dma", NULL, &FLOPPY_DMA, 2, 0},
4430         {"daring", daring, NULL, 1, 0},
4431 #if N_FDC > 1
4432         {"two_fdc", NULL, &FDC2, 0x370, 0},
4433         {"one_fdc", NULL, &FDC2, 0, 0},
4434 #endif
4435         {"thinkpad", floppy_set_flags, NULL, 1, FD_INVERTED_DCL},
4436         {"broken_dcl", floppy_set_flags, NULL, 1, FD_BROKEN_DCL},
4437         {"messages", floppy_set_flags, NULL, 1, FTD_MSG},
4438         {"silent_dcl_clear", floppy_set_flags, NULL, 1, FD_SILENT_DCL_CLEAR},
4439         {"debug", floppy_set_flags, NULL, 1, FD_DEBUG},
4440         {"nodma", NULL, &can_use_virtual_dma, 1, 0},
4441         {"omnibook", NULL, &can_use_virtual_dma, 1, 0},
4442         {"yesdma", NULL, &can_use_virtual_dma, 0, 0},
4443         {"fifo_depth", NULL, &fifo_depth, 0xa, 0},
4444         {"nofifo", NULL, &no_fifo, 0x20, 0},
4445         {"usefifo", NULL, &no_fifo, 0, 0},
4446         {"cmos", set_cmos, NULL, 0, 0},
4447         {"slow", NULL, &slow_floppy, 1, 0},
4448         {"unexpected_interrupts", NULL, &print_unex, 1, 0},
4449         {"no_unexpected_interrupts", NULL, &print_unex, 0, 0},
4450         {"L40SX", NULL, &print_unex, 0, 0}
4451
4452         EXTRA_FLOPPY_PARAMS
4453 };
4454
4455 static int __init floppy_setup(char *str)
4456 {
4457         int i;
4458         int param;
4459         int ints[11];
4460
4461         str = get_options(str, ARRAY_SIZE(ints), ints);
4462         if (str) {
4463                 for (i = 0; i < ARRAY_SIZE(config_params); i++) {
4464                         if (strcmp(str, config_params[i].name) == 0) {
4465                                 if (ints[0])
4466                                         param = ints[1];
4467                                 else
4468                                         param = config_params[i].def_param;
4469                                 if (config_params[i].fn)
4470                                         config_params[i].fn(ints, param,
4471                                                             config_params[i].
4472                                                             param2);
4473                                 if (config_params[i].var) {
4474                                         DPRINT("%s=%d\n", str, param);
4475                                         *config_params[i].var = param;
4476                                 }
4477                                 return 1;
4478                         }
4479                 }
4480         }
4481         if (str) {
4482                 DPRINT("unknown floppy option [%s]\n", str);
4483
4484                 DPRINT("allowed options are:");
4485                 for (i = 0; i < ARRAY_SIZE(config_params); i++)
4486                         pr_cont(" %s", config_params[i].name);
4487                 pr_cont("\n");
4488         } else
4489                 DPRINT("botched floppy option\n");
4490         DPRINT("Read Documentation/blockdev/floppy.txt\n");
4491         return 0;
4492 }
4493
4494 static int have_no_fdc = -ENODEV;
4495
4496 static ssize_t floppy_cmos_show(struct device *dev,
4497                                 struct device_attribute *attr, char *buf)
4498 {
4499         struct platform_device *p = to_platform_device(dev);
4500         int drive;
4501
4502         drive = p->id;
4503         return sprintf(buf, "%X\n", UDP->cmos);
4504 }
4505
4506 static DEVICE_ATTR(cmos, S_IRUGO, floppy_cmos_show, NULL);
4507
4508 static struct attribute *floppy_dev_attrs[] = {
4509         &dev_attr_cmos.attr,
4510         NULL
4511 };
4512
4513 ATTRIBUTE_GROUPS(floppy_dev);
4514
4515 static void floppy_device_release(struct device *dev)
4516 {
4517 }
4518
4519 static int floppy_resume(struct device *dev)
4520 {
4521         int fdc;
4522
4523         for (fdc = 0; fdc < N_FDC; fdc++)
4524                 if (FDCS->address != -1)
4525                         user_reset_fdc(-1, FD_RESET_ALWAYS, false);
4526
4527         return 0;
4528 }
4529
4530 static const struct dev_pm_ops floppy_pm_ops = {
4531         .resume = floppy_resume,
4532         .restore = floppy_resume,
4533 };
4534
4535 static struct platform_driver floppy_driver = {
4536         .driver = {
4537                    .name = "floppy",
4538                    .pm = &floppy_pm_ops,
4539         },
4540 };
4541
4542 static struct platform_device floppy_device[N_DRIVE];
4543
4544 static bool floppy_available(int drive)
4545 {
4546         if (!(allowed_drive_mask & (1 << drive)))
4547                 return false;
4548         if (fdc_state[FDC(drive)].version == FDC_NONE)
4549                 return false;
4550         return true;
4551 }
4552
4553 static struct kobject *floppy_find(dev_t dev, int *part, void *data)
4554 {
4555         int drive = (*part & 3) | ((*part & 0x80) >> 5);
4556         if (drive >= N_DRIVE || !floppy_available(drive))
4557                 return NULL;
4558         if (((*part >> 2) & 0x1f) >= ARRAY_SIZE(floppy_type))
4559                 return NULL;
4560         *part = 0;
4561         return get_disk(disks[drive]);
4562 }
4563
4564 static int __init do_floppy_init(void)
4565 {
4566         int i, unit, drive, err;
4567
4568         set_debugt();
4569         interruptjiffies = resultjiffies = jiffies;
4570
4571 #if defined(CONFIG_PPC)
4572         if (check_legacy_ioport(FDC1))
4573                 return -ENODEV;
4574 #endif
4575
4576         raw_cmd = NULL;
4577
4578         floppy_wq = alloc_ordered_workqueue("floppy", 0);
4579         if (!floppy_wq)
4580                 return -ENOMEM;
4581
4582         for (drive = 0; drive < N_DRIVE; drive++) {
4583                 disks[drive] = alloc_disk(1);
4584                 if (!disks[drive]) {
4585                         err = -ENOMEM;
4586                         goto out_put_disk;
4587                 }
4588
4589                 disks[drive]->queue = blk_init_queue(do_fd_request, &floppy_lock);
4590                 if (!disks[drive]->queue) {
4591                         err = -ENOMEM;
4592                         goto out_put_disk;
4593                 }
4594
4595                 blk_queue_max_hw_sectors(disks[drive]->queue, 64);
4596                 disks[drive]->major = FLOPPY_MAJOR;
4597                 disks[drive]->first_minor = TOMINOR(drive);
4598                 disks[drive]->fops = &floppy_fops;
4599                 sprintf(disks[drive]->disk_name, "fd%d", drive);
4600
4601                 init_timer(&motor_off_timer[drive]);
4602                 motor_off_timer[drive].data = drive;
4603                 motor_off_timer[drive].function = motor_off_callback;
4604         }
4605
4606         err = register_blkdev(FLOPPY_MAJOR, "fd");
4607         if (err)
4608                 goto out_put_disk;
4609
4610         err = platform_driver_register(&floppy_driver);
4611         if (err)
4612                 goto out_unreg_blkdev;
4613
4614         blk_register_region(MKDEV(FLOPPY_MAJOR, 0), 256, THIS_MODULE,
4615                             floppy_find, NULL, NULL);
4616
4617         for (i = 0; i < 256; i++)
4618                 if (ITYPE(i))
4619                         floppy_sizes[i] = floppy_type[ITYPE(i)].size;
4620                 else
4621                         floppy_sizes[i] = MAX_DISK_SIZE << 1;
4622
4623         reschedule_timeout(MAXTIMEOUT, "floppy init");
4624         config_types();
4625
4626         for (i = 0; i < N_FDC; i++) {
4627                 fdc = i;
4628                 memset(FDCS, 0, sizeof(*FDCS));
4629                 FDCS->dtr = -1;
4630                 FDCS->dor = 0x4;
4631 #if defined(__sparc__) || defined(__mc68000__)
4632         /*sparcs/sun3x don't have a DOR reset which we can fall back on to */
4633 #ifdef __mc68000__
4634                 if (MACH_IS_SUN3X)
4635 #endif
4636                         FDCS->version = FDC_82072A;
4637 #endif
4638         }
4639
4640         use_virtual_dma = can_use_virtual_dma & 1;
4641         fdc_state[0].address = FDC1;
4642         if (fdc_state[0].address == -1) {
4643                 cancel_delayed_work(&fd_timeout);
4644                 err = -ENODEV;
4645                 goto out_unreg_region;
4646         }
4647 #if N_FDC > 1
4648         fdc_state[1].address = FDC2;
4649 #endif
4650
4651         fdc = 0;                /* reset fdc in case of unexpected interrupt */
4652         err = floppy_grab_irq_and_dma();
4653         if (err) {
4654                 cancel_delayed_work(&fd_timeout);
4655                 err = -EBUSY;
4656                 goto out_unreg_region;
4657         }
4658
4659         /* initialise drive state */
4660         for (drive = 0; drive < N_DRIVE; drive++) {
4661                 memset(UDRS, 0, sizeof(*UDRS));
4662                 memset(UDRWE, 0, sizeof(*UDRWE));
4663                 set_bit(FD_DISK_NEWCHANGE_BIT, &UDRS->flags);
4664                 set_bit(FD_DISK_CHANGED_BIT, &UDRS->flags);
4665                 set_bit(FD_VERIFY_BIT, &UDRS->flags);
4666                 UDRS->fd_device = -1;
4667                 floppy_track_buffer = NULL;
4668                 max_buffer_sectors = 0;
4669         }
4670         /*
4671          * Small 10 msec delay to let through any interrupt that
4672          * initialization might have triggered, to not
4673          * confuse detection:
4674          */
4675         msleep(10);
4676
4677         for (i = 0; i < N_FDC; i++) {
4678                 fdc = i;
4679                 FDCS->driver_version = FD_DRIVER_VERSION;
4680                 for (unit = 0; unit < 4; unit++)
4681                         FDCS->track[unit] = 0;
4682                 if (FDCS->address == -1)
4683                         continue;
4684                 FDCS->rawcmd = 2;
4685                 if (user_reset_fdc(-1, FD_RESET_ALWAYS, false)) {
4686                         /* free ioports reserved by floppy_grab_irq_and_dma() */
4687                         floppy_release_regions(fdc);
4688                         FDCS->address = -1;
4689                         FDCS->version = FDC_NONE;
4690                         continue;
4691                 }
4692                 /* Try to determine the floppy controller type */
4693                 FDCS->version = get_fdc_version();
4694                 if (FDCS->version == FDC_NONE) {
4695                         /* free ioports reserved by floppy_grab_irq_and_dma() */
4696                         floppy_release_regions(fdc);
4697                         FDCS->address = -1;
4698                         continue;
4699                 }
4700                 if (can_use_virtual_dma == 2 && FDCS->version < FDC_82072A)
4701                         can_use_virtual_dma = 0;
4702
4703                 have_no_fdc = 0;
4704                 /* Not all FDCs seem to be able to handle the version command
4705                  * properly, so force a reset for the standard FDC clones,
4706                  * to avoid interrupt garbage.
4707                  */
4708                 user_reset_fdc(-1, FD_RESET_ALWAYS, false);
4709         }
4710         fdc = 0;
4711         cancel_delayed_work(&fd_timeout);
4712         current_drive = 0;
4713         initialized = true;
4714         if (have_no_fdc) {
4715                 DPRINT("no floppy controllers found\n");
4716                 err = have_no_fdc;
4717                 goto out_release_dma;
4718         }
4719
4720         for (drive = 0; drive < N_DRIVE; drive++) {
4721                 if (!floppy_available(drive))
4722                         continue;
4723
4724                 floppy_device[drive].name = floppy_device_name;
4725                 floppy_device[drive].id = drive;
4726                 floppy_device[drive].dev.release = floppy_device_release;
4727                 floppy_device[drive].dev.groups = floppy_dev_groups;
4728
4729                 err = platform_device_register(&floppy_device[drive]);
4730                 if (err)
4731                         goto out_remove_drives;
4732
4733                 /* to be cleaned up... */
4734                 disks[drive]->private_data = (void *)(long)drive;
4735                 disks[drive]->flags |= GENHD_FL_REMOVABLE;
4736                 device_add_disk(&floppy_device[drive].dev, disks[drive]);
4737         }
4738
4739         return 0;
4740
4741 out_remove_drives:
4742         while (drive--) {
4743                 if (floppy_available(drive)) {
4744                         del_gendisk(disks[drive]);
4745                         platform_device_unregister(&floppy_device[drive]);
4746                 }
4747         }
4748 out_release_dma:
4749         if (atomic_read(&usage_count))
4750                 floppy_release_irq_and_dma();
4751 out_unreg_region:
4752         blk_unregister_region(MKDEV(FLOPPY_MAJOR, 0), 256);
4753         platform_driver_unregister(&floppy_driver);
4754 out_unreg_blkdev:
4755         unregister_blkdev(FLOPPY_MAJOR, "fd");
4756 out_put_disk:
4757         destroy_workqueue(floppy_wq);
4758         for (drive = 0; drive < N_DRIVE; drive++) {
4759                 if (!disks[drive])
4760                         break;
4761                 if (disks[drive]->queue) {
4762                         del_timer_sync(&motor_off_timer[drive]);
4763                         blk_cleanup_queue(disks[drive]->queue);
4764                         disks[drive]->queue = NULL;
4765                 }
4766                 put_disk(disks[drive]);
4767         }
4768         return err;
4769 }
4770
4771 #ifndef MODULE
4772 static __init void floppy_async_init(void *data, async_cookie_t cookie)
4773 {
4774         do_floppy_init();
4775 }
4776 #endif
4777
4778 static int __init floppy_init(void)
4779 {
4780 #ifdef MODULE
4781         return do_floppy_init();
4782 #else
4783         /* Don't hold up the bootup by the floppy initialization */
4784         async_schedule(floppy_async_init, NULL);
4785         return 0;
4786 #endif
4787 }
4788
4789 static const struct io_region {
4790         int offset;
4791         int size;
4792 } io_regions[] = {
4793         { 2, 1 },
4794         /* address + 3 is sometimes reserved by pnp bios for motherboard */
4795         { 4, 2 },
4796         /* address + 6 is reserved, and may be taken by IDE.
4797          * Unfortunately, Adaptec doesn't know this :-(, */
4798         { 7, 1 },
4799 };
4800
4801 static void floppy_release_allocated_regions(int fdc, const struct io_region *p)
4802 {
4803         while (p != io_regions) {
4804                 p--;
4805                 release_region(FDCS->address + p->offset, p->size);
4806         }
4807 }
4808
4809 #define ARRAY_END(X) (&((X)[ARRAY_SIZE(X)]))
4810
4811 static int floppy_request_regions(int fdc)
4812 {
4813         const struct io_region *p;
4814
4815         for (p = io_regions; p < ARRAY_END(io_regions); p++) {
4816                 if (!request_region(FDCS->address + p->offset,
4817                                     p->size, "floppy")) {
4818                         DPRINT("Floppy io-port 0x%04lx in use\n",
4819                                FDCS->address + p->offset);
4820                         floppy_release_allocated_regions(fdc, p);
4821                         return -EBUSY;
4822                 }
4823         }
4824         return 0;
4825 }
4826
4827 static void floppy_release_regions(int fdc)
4828 {
4829         floppy_release_allocated_regions(fdc, ARRAY_END(io_regions));
4830 }
4831
4832 static int floppy_grab_irq_and_dma(void)
4833 {
4834         if (atomic_inc_return(&usage_count) > 1)
4835                 return 0;
4836
4837         /*
4838          * We might have scheduled a free_irq(), wait it to
4839          * drain first:
4840          */
4841         flush_workqueue(floppy_wq);
4842
4843         if (fd_request_irq()) {
4844                 DPRINT("Unable to grab IRQ%d for the floppy driver\n",
4845                        FLOPPY_IRQ);
4846                 atomic_dec(&usage_count);
4847                 return -1;
4848         }
4849         if (fd_request_dma()) {
4850                 DPRINT("Unable to grab DMA%d for the floppy driver\n",
4851                        FLOPPY_DMA);
4852                 if (can_use_virtual_dma & 2)
4853                         use_virtual_dma = can_use_virtual_dma = 1;
4854                 if (!(can_use_virtual_dma & 1)) {
4855                         fd_free_irq();
4856                         atomic_dec(&usage_count);
4857                         return -1;
4858                 }
4859         }
4860
4861         for (fdc = 0; fdc < N_FDC; fdc++) {
4862                 if (FDCS->address != -1) {
4863                         if (floppy_request_regions(fdc))
4864                                 goto cleanup;
4865                 }
4866         }
4867         for (fdc = 0; fdc < N_FDC; fdc++) {
4868                 if (FDCS->address != -1) {
4869                         reset_fdc_info(1);
4870                         fd_outb(FDCS->dor, FD_DOR);
4871                 }
4872         }
4873         fdc = 0;
4874         set_dor(0, ~0, 8);      /* avoid immediate interrupt */
4875
4876         for (fdc = 0; fdc < N_FDC; fdc++)
4877                 if (FDCS->address != -1)
4878                         fd_outb(FDCS->dor, FD_DOR);
4879         /*
4880          * The driver will try and free resources and relies on us
4881          * to know if they were allocated or not.
4882          */
4883         fdc = 0;
4884         irqdma_allocated = 1;
4885         return 0;
4886 cleanup:
4887         fd_free_irq();
4888         fd_free_dma();
4889         while (--fdc >= 0)
4890                 floppy_release_regions(fdc);
4891         atomic_dec(&usage_count);
4892         return -1;
4893 }
4894
4895 static void floppy_release_irq_and_dma(void)
4896 {
4897         int old_fdc;
4898 #ifndef __sparc__
4899         int drive;
4900 #endif
4901         long tmpsize;
4902         unsigned long tmpaddr;
4903
4904         if (!atomic_dec_and_test(&usage_count))
4905                 return;
4906
4907         if (irqdma_allocated) {
4908                 fd_disable_dma();
4909                 fd_free_dma();
4910                 fd_free_irq();
4911                 irqdma_allocated = 0;
4912         }
4913         set_dor(0, ~0, 8);
4914 #if N_FDC > 1
4915         set_dor(1, ~8, 0);
4916 #endif
4917
4918         if (floppy_track_buffer && max_buffer_sectors) {
4919                 tmpsize = max_buffer_sectors * 1024;
4920                 tmpaddr = (unsigned long)floppy_track_buffer;
4921                 floppy_track_buffer = NULL;
4922                 max_buffer_sectors = 0;
4923                 buffer_min = buffer_max = -1;
4924                 fd_dma_mem_free(tmpaddr, tmpsize);
4925         }
4926 #ifndef __sparc__
4927         for (drive = 0; drive < N_FDC * 4; drive++)
4928                 if (timer_pending(motor_off_timer + drive))
4929                         pr_info("motor off timer %d still active\n", drive);
4930 #endif
4931
4932         if (delayed_work_pending(&fd_timeout))
4933                 pr_info("floppy timer still active:%s\n", timeout_message);
4934         if (delayed_work_pending(&fd_timer))
4935                 pr_info("auxiliary floppy timer still active\n");
4936         if (work_pending(&floppy_work))
4937                 pr_info("work still pending\n");
4938         old_fdc = fdc;
4939         for (fdc = 0; fdc < N_FDC; fdc++)
4940                 if (FDCS->address != -1)
4941                         floppy_release_regions(fdc);
4942         fdc = old_fdc;
4943 }
4944
4945 #ifdef MODULE
4946
4947 static char *floppy;
4948
4949 static void __init parse_floppy_cfg_string(char *cfg)
4950 {
4951         char *ptr;
4952
4953         while (*cfg) {
4954                 ptr = cfg;
4955                 while (*cfg && *cfg != ' ' && *cfg != '\t')
4956                         cfg++;
4957                 if (*cfg) {
4958                         *cfg = '\0';
4959                         cfg++;
4960                 }
4961                 if (*ptr)
4962                         floppy_setup(ptr);
4963         }
4964 }
4965
4966 static int __init floppy_module_init(void)
4967 {
4968         if (floppy)
4969                 parse_floppy_cfg_string(floppy);
4970         return floppy_init();
4971 }
4972 module_init(floppy_module_init);
4973
4974 static void __exit floppy_module_exit(void)
4975 {
4976         int drive;
4977
4978         blk_unregister_region(MKDEV(FLOPPY_MAJOR, 0), 256);
4979         unregister_blkdev(FLOPPY_MAJOR, "fd");
4980         platform_driver_unregister(&floppy_driver);
4981
4982         destroy_workqueue(floppy_wq);
4983
4984         for (drive = 0; drive < N_DRIVE; drive++) {
4985                 del_timer_sync(&motor_off_timer[drive]);
4986
4987                 if (floppy_available(drive)) {
4988                         del_gendisk(disks[drive]);
4989                         platform_device_unregister(&floppy_device[drive]);
4990                 }
4991                 blk_cleanup_queue(disks[drive]->queue);
4992
4993                 /*
4994                  * These disks have not called add_disk().  Don't put down
4995                  * queue reference in put_disk().
4996                  */
4997                 if (!(allowed_drive_mask & (1 << drive)) ||
4998                     fdc_state[FDC(drive)].version == FDC_NONE)
4999                         disks[drive]->queue = NULL;
5000
5001                 put_disk(disks[drive]);
5002         }
5003
5004         cancel_delayed_work_sync(&fd_timeout);
5005         cancel_delayed_work_sync(&fd_timer);
5006
5007         if (atomic_read(&usage_count))
5008                 floppy_release_irq_and_dma();
5009
5010         /* eject disk, if any */
5011         fd_eject(0);
5012 }
5013
5014 module_exit(floppy_module_exit);
5015
5016 module_param(floppy, charp, 0);
5017 module_param(FLOPPY_IRQ, int, 0);
5018 module_param(FLOPPY_DMA, int, 0);
5019 MODULE_AUTHOR("Alain L. Knaff");
5020 MODULE_SUPPORTED_DEVICE("fd");
5021 MODULE_LICENSE("GPL");
5022
5023 /* This doesn't actually get used other than for module information */
5024 static const struct pnp_device_id floppy_pnpids[] = {
5025         {"PNP0700", 0},
5026         {}
5027 };
5028
5029 MODULE_DEVICE_TABLE(pnp, floppy_pnpids);
5030
5031 #else
5032
5033 __setup("floppy=", floppy_setup);
5034 module_init(floppy_init)
5035 #endif
5036
5037 MODULE_ALIAS_BLOCKDEV_MAJOR(FLOPPY_MAJOR);