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