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
9 * 02.12.91 - Changed to static variables to indicate need for reset
10 * and recalibrate. This makes some things easier (output_byte reset
11 * checking etc), and means less interrupt jumping in case of errors,
12 * so the code is hopefully easier to understand.
16 * This file is certainly a mess. I've tried my best to get it working,
17 * but I don't like programming floppies, and I have only one anyway.
18 * Urgel. I should check for more errors, and do more graceful error
19 * recovery. Seems there are problems with several drives. I've tried to
20 * correct them. No promises.
24 * As with hd.c, all routines within this file can (and will) be called
25 * by interrupts, so extreme caution is needed. A hardware interrupt
26 * handler may not sleep, or a kernel panic will happen. Thus I cannot
27 * call "floppy-on" directly, but have to set a special timer interrupt
32 * 28.02.92 - made track-buffering routines, based on the routines written
33 * by entropy@wintermute.wpi.edu (Lawrence Foard). Linus.
37 * Automatic floppy-detection and formatting written by Werner Almesberger
38 * (almesber@nessie.cs.id.ethz.ch), who also corrected some problems with
39 * the floppy-change signal detection.
43 * 1992/7/22 -- Hennus Bergman: Added better error reporting, fixed
44 * FDC data overrun bug, added some preliminary stuff for vertical
47 * 1992/9/17: Added DMA allocation & DMA functions. -- hhb.
49 * TODO: Errors are still not counted properly.
53 * Modifications for ``Sector Shifting'' by Rob Hooft (hooft@chem.ruu.nl)
54 * modeled after the freeware MS-DOS program fdformat/88 V1.8 by
55 * Christoph H. Hochst\"atter.
56 * I have fixed the shift values to the ones I always use. Maybe a new
57 * ioctl() should be created to be able to modify them.
58 * There is a bug in the driver that makes it impossible to format a
59 * floppy as the first thing after bootup.
63 * 1993/4/29 -- Linus -- cleaned up the timer handling in the kernel, and
64 * this helped the floppy driver as well. Much cleaner, and still seems to
68 /* 1994/6/24 --bbroad-- added the floppy table entries and made
69 * minor modifications to allow 2.88 floppies to be run.
72 /* 1994/7/13 -- Paul Vojta -- modified the probing code to allow three or more
77 * 1994/8/8 -- Alain Knaff -- Switched to fdpatch driver: Support for bigger
78 * format bug fixes, but unfortunately some new bugs too...
81 /* 1994/9/17 -- Koen Holtman -- added logging of physical floppy write
82 * errors to allow safe writing by specialized programs.
85 /* 1995/4/24 -- Dan Fandrich -- added support for Commodore 1581 3.5" disks
86 * by defining bit 1 of the "stretch" parameter to mean put sectors on the
87 * opposite side of the disk, leaving the sector IDs alone (i.e. Commodore's
88 * drives are "upside-down").
92 * 1995/8/26 -- Andreas Busse -- added Mips support.
96 * 1995/10/18 -- Ralf Baechle -- Portability cleanup; move machine dependent
97 * features to asm/floppy.h.
101 * 1998/1/21 -- Richard Gooch <rgooch@atnf.csiro.au> -- devfs support
105 * 1998/05/07 -- Russell King -- More portability cleanups; moved definition of
106 * interrupt and dma channel to asm/floppy.h. Cleaned up some formatting &
107 * use of '0' for NULL.
111 * 1998/06/07 -- Alan Cox -- Merged the 2.0.34 fixes for resource allocation
116 * 1998/09/20 -- David Weinehall -- Added slow-down code for buggy PS/2-drives.
120 * 1999/08/13 -- Paul Slootman -- floppy stopped working on Alpha after 24
121 * days, 6 hours, 32 minutes and 32 seconds (i.e. MAXINT jiffies; ints were
122 * being used to store jiffies, which are unsigned longs).
126 * 2000/08/28 -- Arnaldo Carvalho de Melo <acme@conectiva.com.br>
127 * - get rid of check_region
132 * 2001/08/26 -- Paul Gortmaker - fix insmod oops on machines with no
133 * floppy controller (lingering task on list after module is gone... boom.)
137 * 2002/02/07 -- Anton Altaparmakov - Fix io ports reservation to correct range
138 * (0x3f2-0x3f5, 0x3f7). This fix is a bit of a hack but the proper fix
139 * requires many non-obvious changes in arch dependent code.
142 /* 2003/07/28 -- Daniele Bellucci <bellucda@tiscali.it>.
143 * Better audit of register_blkdev.
146 #define FLOPPY_SANITY_CHECK
147 #undef FLOPPY_SILENT_DCL_CLEAR
149 #define REALLY_SLOW_IO
152 #define DCL_DEBUG /* debug disk change line */
154 /* do print messages for unexpected interrupts */
155 static int print_unex = 1;
156 #include <linux/module.h>
157 #include <linux/sched.h>
158 #include <linux/fs.h>
159 #include <linux/kernel.h>
160 #include <linux/timer.h>
161 #include <linux/workqueue.h>
163 #include <linux/fdreg.h>
165 #include <linux/fd.h>
166 #include <linux/hdreg.h>
168 #include <linux/errno.h>
169 #include <linux/slab.h>
170 #include <linux/mm.h>
171 #include <linux/bio.h>
172 #include <linux/string.h>
173 #include <linux/fcntl.h>
174 #include <linux/delay.h>
175 #include <linux/mc146818rtc.h> /* CMOS defines */
176 #include <linux/ioport.h>
177 #include <linux/interrupt.h>
178 #include <linux/init.h>
179 #include <linux/devfs_fs_kernel.h>
180 #include <linux/platform_device.h>
181 #include <linux/buffer_head.h> /* for invalidate_buffers() */
182 #include <linux/mutex.h>
185 * PS/2 floppies have much slower step rates than regular floppies.
186 * It's been recommended that take about 1/4 of the default speed
187 * in some more extreme cases.
189 static int slow_floppy;
193 #include <asm/system.h>
195 #include <asm/uaccess.h>
197 static int FLOPPY_IRQ = 6;
198 static int FLOPPY_DMA = 2;
199 static int can_use_virtual_dma = 2;
201 * can use virtual DMA:
202 * 0 = use of virtual DMA disallowed by config
203 * 1 = use of virtual DMA prescribed by config
204 * 2 = no virtual DMA preference configured. By default try hard DMA,
205 * but fall back on virtual DMA when not enough memory available
208 static int use_virtual_dma;
212 * 1 using virtual DMA
213 * This variable is set to virtual when a DMA mem problem arises, and
214 * reset back in floppy_grab_irq_and_dma.
215 * It is not safe to reset it in other circumstances, because the floppy
216 * driver may have several buffers in use at once, and we do currently not
217 * record each buffers capabilities
220 static DEFINE_SPINLOCK(floppy_lock);
221 static struct completion device_release;
223 static unsigned short virtual_dma_port = 0x3f0;
224 irqreturn_t floppy_interrupt(int irq, void *dev_id, struct pt_regs *regs);
225 static int set_dor(int fdc, char mask, char data);
226 static void register_devfs_entries(int drive) __init;
228 #define K_64 0x10000 /* 64KB */
230 /* the following is the mask of allowed drives. By default units 2 and
231 * 3 of both floppy controllers are disabled, because switching on the
232 * motor of these drives causes system hangs on some PCI computers. drive
233 * 0 is the low bit (0x1), and drive 7 is the high bit (0x80). Bits are on if
234 * a drive is allowed.
236 * NOTE: This must come before we include the arch floppy header because
237 * some ports reference this variable from there. -DaveM
240 static int allowed_drive_mask = 0x33;
242 #include <asm/floppy.h>
244 static int irqdma_allocated;
246 #define DEVICE_NAME "floppy"
248 #include <linux/blkdev.h>
249 #include <linux/blkpg.h>
250 #include <linux/cdrom.h> /* for the compatibility eject ioctl */
251 #include <linux/completion.h>
254 * Interrupt freeing also means /proc VFS work - dont do it
255 * from interrupt context. We push this work into keventd:
257 static void fd_free_irq_fn(void *data)
262 static DECLARE_WORK(fd_free_irq_work, fd_free_irq_fn, NULL);
265 static struct request *current_req;
266 static struct request_queue *floppy_queue;
267 static void do_fd_request(request_queue_t * q);
269 #ifndef fd_get_dma_residue
270 #define fd_get_dma_residue() get_dma_residue(FLOPPY_DMA)
273 /* Dma Memory related stuff */
275 #ifndef fd_dma_mem_free
276 #define fd_dma_mem_free(addr, size) free_pages(addr, get_order(size))
279 #ifndef fd_dma_mem_alloc
280 #define fd_dma_mem_alloc(size) __get_dma_pages(GFP_KERNEL,get_order(size))
283 static inline void fallback_on_nodma_alloc(char **addr, size_t l)
285 #ifdef FLOPPY_CAN_FALLBACK_ON_NODMA
287 return; /* we have the memory */
288 if (can_use_virtual_dma != 2)
289 return; /* no fallback allowed */
291 ("DMA memory shortage. Temporarily falling back on virtual DMA\n");
292 *addr = (char *)nodma_mem_alloc(l);
298 /* End dma memory related stuff */
300 static unsigned long fake_change;
301 static int initialising = 1;
303 #define ITYPE(x) (((x)>>2) & 0x1f)
304 #define TOMINOR(x) ((x & 3) | ((x & 4) << 5))
305 #define UNIT(x) ((x) & 0x03) /* drive on fdc */
306 #define FDC(x) (((x) & 0x04) >> 2) /* fdc of drive */
307 #define REVDRIVE(fdc, unit) ((unit) + ((fdc) << 2))
308 /* reverse mapping from unit and fdc to drive */
309 #define DP (&drive_params[current_drive])
310 #define DRS (&drive_state[current_drive])
311 #define DRWE (&write_errors[current_drive])
312 #define FDCS (&fdc_state[fdc])
313 #define CLEARF(x) (clear_bit(x##_BIT, &DRS->flags))
314 #define SETF(x) (set_bit(x##_BIT, &DRS->flags))
315 #define TESTF(x) (test_bit(x##_BIT, &DRS->flags))
317 #define UDP (&drive_params[drive])
318 #define UDRS (&drive_state[drive])
319 #define UDRWE (&write_errors[drive])
320 #define UFDCS (&fdc_state[FDC(drive)])
321 #define UCLEARF(x) (clear_bit(x##_BIT, &UDRS->flags))
322 #define USETF(x) (set_bit(x##_BIT, &UDRS->flags))
323 #define UTESTF(x) (test_bit(x##_BIT, &UDRS->flags))
325 #define DPRINT(format, args...) printk(DEVICE_NAME "%d: " format, current_drive , ## args)
327 #define PH_HEAD(floppy,head) (((((floppy)->stretch & 2) >>1) ^ head) << 2)
328 #define STRETCH(floppy) ((floppy)->stretch & FD_STRETCH)
330 #define CLEARSTRUCT(x) memset((x), 0, sizeof(*(x)))
333 #define COMMAND raw_cmd->cmd[0]
334 #define DR_SELECT raw_cmd->cmd[1]
335 #define TRACK raw_cmd->cmd[2]
336 #define HEAD raw_cmd->cmd[3]
337 #define SECTOR raw_cmd->cmd[4]
338 #define SIZECODE raw_cmd->cmd[5]
339 #define SECT_PER_TRACK raw_cmd->cmd[6]
340 #define GAP raw_cmd->cmd[7]
341 #define SIZECODE2 raw_cmd->cmd[8]
345 #define F_SIZECODE raw_cmd->cmd[2]
346 #define F_SECT_PER_TRACK raw_cmd->cmd[3]
347 #define F_GAP raw_cmd->cmd[4]
348 #define F_FILL raw_cmd->cmd[5]
352 * Maximum disk size (in kilobytes). This default is used whenever the
353 * current disk size is unknown.
354 * [Now it is rather a minimum]
356 #define MAX_DISK_SIZE 4 /* 3984 */
359 * globals used by 'result()'
361 #define MAX_REPLIES 16
362 static unsigned char reply_buffer[MAX_REPLIES];
363 static int inr; /* size of reply buffer, when called from interrupt */
364 #define ST0 (reply_buffer[0])
365 #define ST1 (reply_buffer[1])
366 #define ST2 (reply_buffer[2])
367 #define ST3 (reply_buffer[0]) /* result of GETSTATUS */
368 #define R_TRACK (reply_buffer[3])
369 #define R_HEAD (reply_buffer[4])
370 #define R_SECTOR (reply_buffer[5])
371 #define R_SIZECODE (reply_buffer[6])
373 #define SEL_DLY (2*HZ/100)
376 * this struct defines the different floppy drive types.
379 struct floppy_drive_params params;
380 const char *name; /* name printed while booting */
381 } default_drive_params[] = {
382 /* NOTE: the time values in jiffies should be in msec!
384 | Maximum data rate supported by drive type
385 | | Head load time, msec
386 | | | Head unload time, msec (not used)
387 | | | | Step rate interval, usec
388 | | | | | Time needed for spinup time (jiffies)
389 | | | | | | Timeout for spinning down (jiffies)
390 | | | | | | | Spindown offset (where disk stops)
391 | | | | | | | | Select delay
392 | | | | | | | | | RPS
393 | | | | | | | | | | Max number of tracks
394 | | | | | | | | | | | Interrupt timeout
395 | | | | | | | | | | | | Max nonintlv. sectors
396 | | | | | | | | | | | | | -Max Errors- flags */
397 {{0, 500, 16, 16, 8000, 1*HZ, 3*HZ, 0, SEL_DLY, 5, 80, 3*HZ, 20, {3,1,2,0,2}, 0,
398 0, { 7, 4, 8, 2, 1, 5, 3,10}, 3*HZ/2, 0 }, "unknown" },
400 {{1, 300, 16, 16, 8000, 1*HZ, 3*HZ, 0, SEL_DLY, 5, 40, 3*HZ, 17, {3,1,2,0,2}, 0,
401 0, { 1, 0, 0, 0, 0, 0, 0, 0}, 3*HZ/2, 1 }, "360K PC" }, /*5 1/4 360 KB PC*/
403 {{2, 500, 16, 16, 6000, 4*HZ/10, 3*HZ, 14, SEL_DLY, 6, 83, 3*HZ, 17, {3,1,2,0,2}, 0,
404 0, { 2, 5, 6,23,10,20,12, 0}, 3*HZ/2, 2 }, "1.2M" }, /*5 1/4 HD AT*/
406 {{3, 250, 16, 16, 3000, 1*HZ, 3*HZ, 0, SEL_DLY, 5, 83, 3*HZ, 20, {3,1,2,0,2}, 0,
407 0, { 4,22,21,30, 3, 0, 0, 0}, 3*HZ/2, 4 }, "720k" }, /*3 1/2 DD*/
409 {{4, 500, 16, 16, 4000, 4*HZ/10, 3*HZ, 10, SEL_DLY, 5, 83, 3*HZ, 20, {3,1,2,0,2}, 0,
410 0, { 7, 4,25,22,31,21,29,11}, 3*HZ/2, 7 }, "1.44M" }, /*3 1/2 HD*/
412 {{5, 1000, 15, 8, 3000, 4*HZ/10, 3*HZ, 10, SEL_DLY, 5, 83, 3*HZ, 40, {3,1,2,0,2}, 0,
413 0, { 7, 8, 4,25,28,22,31,21}, 3*HZ/2, 8 }, "2.88M AMI BIOS" }, /*3 1/2 ED*/
415 {{6, 1000, 15, 8, 3000, 4*HZ/10, 3*HZ, 10, SEL_DLY, 5, 83, 3*HZ, 40, {3,1,2,0,2}, 0,
416 0, { 7, 8, 4,25,28,22,31,21}, 3*HZ/2, 8 }, "2.88M" } /*3 1/2 ED*/
417 /* | --autodetected formats--- | | |
418 * read_track | | Name printed when booting
420 * Frequency of disk change checks */
423 static struct floppy_drive_params drive_params[N_DRIVE];
424 static struct floppy_drive_struct drive_state[N_DRIVE];
425 static struct floppy_write_errors write_errors[N_DRIVE];
426 static struct timer_list motor_off_timer[N_DRIVE];
427 static struct gendisk *disks[N_DRIVE];
428 static struct block_device *opened_bdev[N_DRIVE];
429 static DEFINE_MUTEX(open_lock);
430 static struct floppy_raw_cmd *raw_cmd, default_raw_cmd;
433 * This struct defines the different floppy types.
435 * Bit 0 of 'stretch' tells if the tracks need to be doubled for some
436 * types (e.g. 360kB diskette in 1.2MB drive, etc.). Bit 1 of 'stretch'
437 * tells if the disk is in Commodore 1581 format, which means side 0 sectors
438 * are located on side 1 of the disk but with a side 0 ID, and vice-versa.
439 * This is the same as the Sharp MZ-80 5.25" CP/M disk format, except that the
440 * 1581's logical side 0 is on physical side 1, whereas the Sharp's logical
441 * side 0 is on physical side 0 (but with the misnamed sector IDs).
442 * 'stretch' should probably be renamed to something more general, like
443 * 'options'. Other parameters should be self-explanatory (see also
453 | | | | | | Data rate, | 0x40 for perp
454 | | | | | | | Spec1 (stepping rate, head unload
455 | | | | | | | | /fmt gap (gap2) */
456 static struct floppy_struct floppy_type[32] = {
457 { 0, 0,0, 0,0,0x00,0x00,0x00,0x00,NULL }, /* 0 no testing */
458 { 720, 9,2,40,0,0x2A,0x02,0xDF,0x50,"d360" }, /* 1 360KB PC */
459 { 2400,15,2,80,0,0x1B,0x00,0xDF,0x54,"h1200" }, /* 2 1.2MB AT */
460 { 720, 9,1,80,0,0x2A,0x02,0xDF,0x50,"D360" }, /* 3 360KB SS 3.5" */
461 { 1440, 9,2,80,0,0x2A,0x02,0xDF,0x50,"D720" }, /* 4 720KB 3.5" */
462 { 720, 9,2,40,1,0x23,0x01,0xDF,0x50,"h360" }, /* 5 360KB AT */
463 { 1440, 9,2,80,0,0x23,0x01,0xDF,0x50,"h720" }, /* 6 720KB AT */
464 { 2880,18,2,80,0,0x1B,0x00,0xCF,0x6C,"H1440" }, /* 7 1.44MB 3.5" */
465 { 5760,36,2,80,0,0x1B,0x43,0xAF,0x54,"E2880" }, /* 8 2.88MB 3.5" */
466 { 6240,39,2,80,0,0x1B,0x43,0xAF,0x28,"E3120" }, /* 9 3.12MB 3.5" */
468 { 2880,18,2,80,0,0x25,0x00,0xDF,0x02,"h1440" }, /* 10 1.44MB 5.25" */
469 { 3360,21,2,80,0,0x1C,0x00,0xCF,0x0C,"H1680" }, /* 11 1.68MB 3.5" */
470 { 820,10,2,41,1,0x25,0x01,0xDF,0x2E,"h410" }, /* 12 410KB 5.25" */
471 { 1640,10,2,82,0,0x25,0x02,0xDF,0x2E,"H820" }, /* 13 820KB 3.5" */
472 { 2952,18,2,82,0,0x25,0x00,0xDF,0x02,"h1476" }, /* 14 1.48MB 5.25" */
473 { 3444,21,2,82,0,0x25,0x00,0xDF,0x0C,"H1722" }, /* 15 1.72MB 3.5" */
474 { 840,10,2,42,1,0x25,0x01,0xDF,0x2E,"h420" }, /* 16 420KB 5.25" */
475 { 1660,10,2,83,0,0x25,0x02,0xDF,0x2E,"H830" }, /* 17 830KB 3.5" */
476 { 2988,18,2,83,0,0x25,0x00,0xDF,0x02,"h1494" }, /* 18 1.49MB 5.25" */
477 { 3486,21,2,83,0,0x25,0x00,0xDF,0x0C,"H1743" }, /* 19 1.74 MB 3.5" */
479 { 1760,11,2,80,0,0x1C,0x09,0xCF,0x00,"h880" }, /* 20 880KB 5.25" */
480 { 2080,13,2,80,0,0x1C,0x01,0xCF,0x00,"D1040" }, /* 21 1.04MB 3.5" */
481 { 2240,14,2,80,0,0x1C,0x19,0xCF,0x00,"D1120" }, /* 22 1.12MB 3.5" */
482 { 3200,20,2,80,0,0x1C,0x20,0xCF,0x2C,"h1600" }, /* 23 1.6MB 5.25" */
483 { 3520,22,2,80,0,0x1C,0x08,0xCF,0x2e,"H1760" }, /* 24 1.76MB 3.5" */
484 { 3840,24,2,80,0,0x1C,0x20,0xCF,0x00,"H1920" }, /* 25 1.92MB 3.5" */
485 { 6400,40,2,80,0,0x25,0x5B,0xCF,0x00,"E3200" }, /* 26 3.20MB 3.5" */
486 { 7040,44,2,80,0,0x25,0x5B,0xCF,0x00,"E3520" }, /* 27 3.52MB 3.5" */
487 { 7680,48,2,80,0,0x25,0x63,0xCF,0x00,"E3840" }, /* 28 3.84MB 3.5" */
489 { 3680,23,2,80,0,0x1C,0x10,0xCF,0x00,"H1840" }, /* 29 1.84MB 3.5" */
490 { 1600,10,2,80,0,0x25,0x02,0xDF,0x2E,"D800" }, /* 30 800KB 3.5" */
491 { 3200,20,2,80,0,0x1C,0x00,0xCF,0x2C,"H1600" }, /* 31 1.6MB 3.5" */
494 #define SECTSIZE (_FD_SECTSIZE(*floppy))
496 /* Auto-detection: Disk type used until the next media change occurs. */
497 static struct floppy_struct *current_type[N_DRIVE];
500 * User-provided type information. current_type points to
501 * the respective entry of this array.
503 static struct floppy_struct user_params[N_DRIVE];
505 static sector_t floppy_sizes[256];
507 static char floppy_device_name[] = "floppy";
510 * The driver is trying to determine the correct media format
511 * while probing is set. rw_interrupt() clears it after a
516 /* Synchronization of FDC access. */
517 #define FD_COMMAND_NONE -1
518 #define FD_COMMAND_ERROR 2
519 #define FD_COMMAND_OKAY 3
521 static volatile int command_status = FD_COMMAND_NONE;
522 static unsigned long fdc_busy;
523 static DECLARE_WAIT_QUEUE_HEAD(fdc_wait);
524 static DECLARE_WAIT_QUEUE_HEAD(command_done);
526 #define NO_SIGNAL (!interruptible || !signal_pending(current))
527 #define CALL(x) if ((x) == -EINTR) return -EINTR
528 #define ECALL(x) if ((ret = (x))) return ret;
529 #define _WAIT(x,i) CALL(ret=wait_til_done((x),i))
530 #define WAIT(x) _WAIT((x),interruptible)
531 #define IWAIT(x) _WAIT((x),1)
533 /* Errors during formatting are counted here. */
534 static int format_errors;
536 /* Format request descriptor. */
537 static struct format_descr format_req;
540 * Rate is 0 for 500kb/s, 1 for 300kbps, 2 for 250kbps
541 * Spec1 is 0xSH, where S is stepping rate (F=1ms, E=2ms, D=3ms etc),
542 * H is head unload time (1=16ms, 2=32ms, etc)
547 * Because these are written to by the DMA controller, they must
548 * not contain a 64k byte boundary crossing, or data will be
551 static char *floppy_track_buffer;
552 static int max_buffer_sectors;
555 typedef void (*done_f) (int);
556 static struct cont_t {
557 void (*interrupt) (void); /* this is called after the interrupt of the
559 void (*redo) (void); /* this is called to retry the operation */
560 void (*error) (void); /* this is called to tally an error */
561 done_f done; /* this is called to say if the operation has
562 * succeeded/failed */
565 static void floppy_ready(void);
566 static void floppy_start(void);
567 static void process_fd_request(void);
568 static void recalibrate_floppy(void);
569 static void floppy_shutdown(unsigned long);
571 static int floppy_grab_irq_and_dma(void);
572 static void floppy_release_irq_and_dma(void);
575 * The "reset" variable should be tested whenever an interrupt is scheduled,
576 * after the commands have been sent. This is to ensure that the driver doesn't
577 * get wedged when the interrupt doesn't come because of a failed command.
578 * reset doesn't need to be tested before sending commands, because
579 * output_byte is automatically disabled when reset is set.
581 #define CHECK_RESET { if (FDCS->reset){ reset_fdc(); return; } }
582 static void reset_fdc(void);
585 * These are global variables, as that's the easiest way to give
586 * information to interrupts. They are the data used for the current
590 #define NEED_1_RECAL -2
591 #define NEED_2_RECAL -3
593 static int usage_count;
595 /* buffer related variables */
596 static int buffer_track = -1;
597 static int buffer_drive = -1;
598 static int buffer_min = -1;
599 static int buffer_max = -1;
601 /* fdc related variables, should end up in a struct */
602 static struct floppy_fdc_state fdc_state[N_FDC];
603 static int fdc; /* current fdc */
605 static struct floppy_struct *_floppy = floppy_type;
606 static unsigned char current_drive;
607 static long current_count_sectors;
608 static unsigned char fsector_t; /* sector in track */
609 static unsigned char in_sector_offset; /* offset within physical sector,
610 * expressed in units of 512 bytes */
613 static inline int fd_eject(int drive)
624 static long unsigned debugtimer;
626 static inline void set_debugt(void)
628 debugtimer = jiffies;
631 static inline void debugt(const char *message)
633 if (DP->flags & DEBUGT)
634 printk("%s dtime=%lu\n", message, jiffies - debugtimer);
637 static inline void set_debugt(void) { }
638 static inline void debugt(const char *message) { }
641 typedef void (*timeout_fn) (unsigned long);
642 static DEFINE_TIMER(fd_timeout, floppy_shutdown, 0, 0);
644 static const char *timeout_message;
646 #ifdef FLOPPY_SANITY_CHECK
647 static void is_alive(const char *message)
649 /* this routine checks whether the floppy driver is "alive" */
650 if (test_bit(0, &fdc_busy) && command_status < 2
651 && !timer_pending(&fd_timeout)) {
652 DPRINT("timeout handler died: %s\n", message);
657 static void (*do_floppy) (void) = NULL;
659 #ifdef FLOPPY_SANITY_CHECK
663 static void (*lasthandler) (void);
664 static unsigned long interruptjiffies;
665 static unsigned long resultjiffies;
666 static int resultsize;
667 static unsigned long lastredo;
669 static struct output_log {
671 unsigned char status;
672 unsigned long jiffies;
673 } output_log[OLOGSIZE];
675 static int output_log_pos;
678 #define current_reqD -1
679 #define MAXTIMEOUT -2
681 static void __reschedule_timeout(int drive, const char *message, int marg)
683 if (drive == current_reqD)
684 drive = current_drive;
685 del_timer(&fd_timeout);
686 if (drive < 0 || drive > N_DRIVE) {
687 fd_timeout.expires = jiffies + 20UL * HZ;
690 fd_timeout.expires = jiffies + UDP->timeout;
691 add_timer(&fd_timeout);
692 if (UDP->flags & FD_DEBUG) {
693 DPRINT("reschedule timeout ");
694 printk(message, marg);
697 timeout_message = message;
700 static void reschedule_timeout(int drive, const char *message, int marg)
704 spin_lock_irqsave(&floppy_lock, flags);
705 __reschedule_timeout(drive, message, marg);
706 spin_unlock_irqrestore(&floppy_lock, flags);
709 #define INFBOUND(a,b) (a)=max_t(int, a, b)
711 #define SUPBOUND(a,b) (a)=min_t(int, a, b)
714 * Bottom half floppy driver.
715 * ==========================
717 * This part of the file contains the code talking directly to the hardware,
718 * and also the main service loop (seek-configure-spinup-command)
723 * This routine is responsible for maintaining the FD_DISK_CHANGE flag,
724 * and the last_checked date.
726 * last_checked is the date of the last check which showed 'no disk change'
727 * FD_DISK_CHANGE is set under two conditions:
728 * 1. The floppy has been changed after some i/o to that floppy already
730 * 2. No floppy disk is in the drive. This is done in order to ensure that
731 * requests are quickly flushed in case there is no disk in the drive. It
732 * follows that FD_DISK_CHANGE can only be cleared if there is a disk in
735 * For 1., maxblock is observed. Maxblock is 0 if no i/o has taken place yet.
736 * For 2., FD_DISK_NEWCHANGE is watched. FD_DISK_NEWCHANGE is cleared on
737 * each seek. If a disk is present, the disk change line should also be
738 * cleared on each seek. Thus, if FD_DISK_NEWCHANGE is clear, but the disk
739 * change line is set, this means either that no disk is in the drive, or
740 * that it has been removed since the last seek.
742 * This means that we really have a third possibility too:
743 * The floppy has been changed after the last seek.
746 static int disk_change(int drive)
748 int fdc = FDC(drive);
749 #ifdef FLOPPY_SANITY_CHECK
750 if (jiffies - UDRS->select_date < UDP->select_delay)
751 DPRINT("WARNING disk change called early\n");
752 if (!(FDCS->dor & (0x10 << UNIT(drive))) ||
753 (FDCS->dor & 3) != UNIT(drive) || fdc != FDC(drive)) {
754 DPRINT("probing disk change on unselected drive\n");
755 DPRINT("drive=%d fdc=%d dor=%x\n", drive, FDC(drive),
756 (unsigned int)FDCS->dor);
761 if (UDP->flags & FD_DEBUG) {
762 DPRINT("checking disk change line for drive %d\n", drive);
763 DPRINT("jiffies=%lu\n", jiffies);
764 DPRINT("disk change line=%x\n", fd_inb(FD_DIR) & 0x80);
765 DPRINT("flags=%lx\n", UDRS->flags);
768 if (UDP->flags & FD_BROKEN_DCL)
769 return UTESTF(FD_DISK_CHANGED);
770 if ((fd_inb(FD_DIR) ^ UDP->flags) & 0x80) {
771 USETF(FD_VERIFY); /* verify write protection */
772 if (UDRS->maxblock) {
773 /* mark it changed */
774 USETF(FD_DISK_CHANGED);
777 /* invalidate its geometry */
778 if (UDRS->keep_data >= 0) {
779 if ((UDP->flags & FTD_MSG) &&
780 current_type[drive] != NULL)
781 DPRINT("Disk type is undefined after "
783 current_type[drive] = NULL;
784 floppy_sizes[TOMINOR(drive)] = MAX_DISK_SIZE << 1;
787 /*USETF(FD_DISK_NEWCHANGE); */
790 UDRS->last_checked = jiffies;
791 UCLEARF(FD_DISK_NEWCHANGE);
796 static inline int is_selected(int dor, int unit)
798 return ((dor & (0x10 << unit)) && (dor & 3) == unit);
801 static int set_dor(int fdc, char mask, char data)
803 register unsigned char drive, unit, newdor, olddor;
805 if (FDCS->address == -1)
809 newdor = (olddor & mask) | data;
810 if (newdor != olddor) {
812 if (is_selected(olddor, unit) && !is_selected(newdor, unit)) {
813 drive = REVDRIVE(fdc, unit);
815 if (UDP->flags & FD_DEBUG) {
816 DPRINT("calling disk change from set_dor\n");
822 fd_outb(newdor, FD_DOR);
825 if (!is_selected(olddor, unit) && is_selected(newdor, unit)) {
826 drive = REVDRIVE(fdc, unit);
827 UDRS->select_date = jiffies;
831 * We should propagate failures to grab the resources back
832 * nicely from here. Actually we ought to rewrite the fd
833 * driver some day too.
835 if (newdor & FLOPPY_MOTOR_MASK)
836 floppy_grab_irq_and_dma();
837 if (olddor & FLOPPY_MOTOR_MASK)
838 floppy_release_irq_and_dma();
842 static void twaddle(void)
844 if (DP->select_delay)
846 fd_outb(FDCS->dor & ~(0x10 << UNIT(current_drive)), FD_DOR);
847 fd_outb(FDCS->dor, FD_DOR);
848 DRS->select_date = jiffies;
851 /* reset all driver information about the current fdc. This is needed after
852 * a reset, and after a raw command. */
853 static void reset_fdc_info(int mode)
857 FDCS->spec1 = FDCS->spec2 = -1;
858 FDCS->need_configure = 1;
861 for (drive = 0; drive < N_DRIVE; drive++)
862 if (FDC(drive) == fdc && (mode || UDRS->track != NEED_1_RECAL))
863 UDRS->track = NEED_2_RECAL;
866 /* selects the fdc and drive, and enables the fdc's input/dma. */
867 static void set_fdc(int drive)
869 if (drive >= 0 && drive < N_DRIVE) {
871 current_drive = drive;
873 if (fdc != 1 && fdc != 0) {
874 printk("bad fdc value\n");
879 set_dor(1 - fdc, ~8, 0);
881 if (FDCS->rawcmd == 2)
883 if (fd_inb(FD_STATUS) != STATUS_READY)
887 /* locks the driver */
888 static int _lock_fdc(int drive, int interruptible, int line)
892 "Trying to lock fdc while usage count=0 at line %d\n",
896 if (floppy_grab_irq_and_dma() == -1)
899 if (test_and_set_bit(0, &fdc_busy)) {
900 DECLARE_WAITQUEUE(wait, current);
901 add_wait_queue(&fdc_wait, &wait);
904 set_current_state(TASK_INTERRUPTIBLE);
906 if (!test_and_set_bit(0, &fdc_busy))
912 remove_wait_queue(&fdc_wait, &wait);
917 set_current_state(TASK_RUNNING);
918 remove_wait_queue(&fdc_wait, &wait);
920 command_status = FD_COMMAND_NONE;
922 __reschedule_timeout(drive, "lock fdc", 0);
927 #define lock_fdc(drive,interruptible) _lock_fdc(drive,interruptible, __LINE__)
929 #define LOCK_FDC(drive,interruptible) \
930 if (lock_fdc(drive,interruptible)) return -EINTR;
932 /* unlocks the driver */
933 static inline void unlock_fdc(void)
938 if (!test_bit(0, &fdc_busy))
939 DPRINT("FDC access conflict!\n");
942 DPRINT("device interrupt still active at FDC release: %p!\n",
944 command_status = FD_COMMAND_NONE;
945 spin_lock_irqsave(&floppy_lock, flags);
946 del_timer(&fd_timeout);
948 clear_bit(0, &fdc_busy);
949 if (elv_next_request(floppy_queue))
950 do_fd_request(floppy_queue);
951 spin_unlock_irqrestore(&floppy_lock, flags);
952 floppy_release_irq_and_dma();
956 /* switches the motor off after a given timeout */
957 static void motor_off_callback(unsigned long nr)
959 unsigned char mask = ~(0x10 << UNIT(nr));
961 set_dor(FDC(nr), mask, 0);
964 /* schedules motor off */
965 static void floppy_off(unsigned int drive)
967 unsigned long volatile delta;
968 register int fdc = FDC(drive);
970 if (!(FDCS->dor & (0x10 << UNIT(drive))))
973 del_timer(motor_off_timer + drive);
975 /* make spindle stop in a position which minimizes spinup time
978 delta = jiffies - UDRS->first_read_date + HZ -
979 UDP->spindown_offset;
980 delta = ((delta * UDP->rps) % HZ) / UDP->rps;
981 motor_off_timer[drive].expires =
982 jiffies + UDP->spindown - delta;
984 add_timer(motor_off_timer + drive);
988 * cycle through all N_DRIVE floppy drives, for disk change testing.
989 * stopping at current drive. This is done before any long operation, to
990 * be sure to have up to date disk change information.
992 static void scandrives(void)
994 int i, drive, saved_drive;
996 if (DP->select_delay)
999 saved_drive = current_drive;
1000 for (i = 0; i < N_DRIVE; i++) {
1001 drive = (saved_drive + i + 1) % N_DRIVE;
1002 if (UDRS->fd_ref == 0 || UDP->select_delay != 0)
1003 continue; /* skip closed drives */
1005 if (!(set_dor(fdc, ~3, UNIT(drive) | (0x10 << UNIT(drive))) &
1006 (0x10 << UNIT(drive))))
1007 /* switch the motor off again, if it was off to
1009 set_dor(fdc, ~(0x10 << UNIT(drive)), 0);
1011 set_fdc(saved_drive);
1014 static void empty(void)
1018 static DECLARE_WORK(floppy_work, NULL, NULL);
1020 static void schedule_bh(void (*handler) (void))
1022 PREPARE_WORK(&floppy_work, (void (*)(void *))handler, NULL);
1023 schedule_work(&floppy_work);
1026 static DEFINE_TIMER(fd_timer, NULL, 0, 0);
1028 static void cancel_activity(void)
1030 unsigned long flags;
1032 spin_lock_irqsave(&floppy_lock, flags);
1034 PREPARE_WORK(&floppy_work, (void *)empty, NULL);
1035 del_timer(&fd_timer);
1036 spin_unlock_irqrestore(&floppy_lock, flags);
1039 /* this function makes sure that the disk stays in the drive during the
1041 static void fd_watchdog(void)
1044 if (DP->flags & FD_DEBUG) {
1045 DPRINT("calling disk change from watchdog\n");
1049 if (disk_change(current_drive)) {
1050 DPRINT("disk removed during i/o\n");
1055 del_timer(&fd_timer);
1056 fd_timer.function = (timeout_fn) fd_watchdog;
1057 fd_timer.expires = jiffies + HZ / 10;
1058 add_timer(&fd_timer);
1062 static void main_command_interrupt(void)
1064 del_timer(&fd_timer);
1068 /* waits for a delay (spinup or select) to pass */
1069 static int fd_wait_for_completion(unsigned long delay, timeout_fn function)
1072 reset_fdc(); /* do the reset during sleep to win time
1073 * if we don't need to sleep, it's a good
1074 * occasion anyways */
1078 if ((signed)(jiffies - delay) < 0) {
1079 del_timer(&fd_timer);
1080 fd_timer.function = function;
1081 fd_timer.expires = delay;
1082 add_timer(&fd_timer);
1088 static DEFINE_SPINLOCK(floppy_hlt_lock);
1089 static int hlt_disabled;
1090 static void floppy_disable_hlt(void)
1092 unsigned long flags;
1094 spin_lock_irqsave(&floppy_hlt_lock, flags);
1095 if (!hlt_disabled) {
1097 #ifdef HAVE_DISABLE_HLT
1101 spin_unlock_irqrestore(&floppy_hlt_lock, flags);
1104 static void floppy_enable_hlt(void)
1106 unsigned long flags;
1108 spin_lock_irqsave(&floppy_hlt_lock, flags);
1111 #ifdef HAVE_DISABLE_HLT
1115 spin_unlock_irqrestore(&floppy_hlt_lock, flags);
1118 static void setup_DMA(void)
1122 #ifdef FLOPPY_SANITY_CHECK
1123 if (raw_cmd->length == 0) {
1126 printk("zero dma transfer size:");
1127 for (i = 0; i < raw_cmd->cmd_count; i++)
1128 printk("%x,", raw_cmd->cmd[i]);
1134 if (((unsigned long)raw_cmd->kernel_data) % 512) {
1135 printk("non aligned address: %p\n", raw_cmd->kernel_data);
1141 f = claim_dma_lock();
1144 if (fd_dma_setup(raw_cmd->kernel_data, raw_cmd->length,
1145 (raw_cmd->flags & FD_RAW_READ) ?
1146 DMA_MODE_READ : DMA_MODE_WRITE, FDCS->address) < 0) {
1147 release_dma_lock(f);
1152 release_dma_lock(f);
1155 fd_cacheflush(raw_cmd->kernel_data, raw_cmd->length);
1156 fd_set_dma_mode((raw_cmd->flags & FD_RAW_READ) ?
1157 DMA_MODE_READ : DMA_MODE_WRITE);
1158 fd_set_dma_addr(raw_cmd->kernel_data);
1159 fd_set_dma_count(raw_cmd->length);
1160 virtual_dma_port = FDCS->address;
1162 release_dma_lock(f);
1164 floppy_disable_hlt();
1167 static void show_floppy(void);
1169 /* waits until the fdc becomes ready */
1170 static int wait_til_ready(void)
1172 int counter, status;
1175 for (counter = 0; counter < 10000; counter++) {
1176 status = fd_inb(FD_STATUS);
1177 if (status & STATUS_READY)
1180 if (!initialising) {
1181 DPRINT("Getstatus times out (%x) on fdc %d\n", status, fdc);
1188 /* sends a command byte to the fdc */
1189 static int output_byte(char byte)
1193 if ((status = wait_til_ready()) < 0)
1195 if ((status & (STATUS_READY | STATUS_DIR | STATUS_DMA)) == STATUS_READY) {
1196 fd_outb(byte, FD_DATA);
1197 #ifdef FLOPPY_SANITY_CHECK
1198 output_log[output_log_pos].data = byte;
1199 output_log[output_log_pos].status = status;
1200 output_log[output_log_pos].jiffies = jiffies;
1201 output_log_pos = (output_log_pos + 1) % OLOGSIZE;
1206 if (!initialising) {
1207 DPRINT("Unable to send byte %x to FDC. Fdc=%x Status=%x\n",
1214 #define LAST_OUT(x) if (output_byte(x)<0){ reset_fdc();return;}
1216 /* gets the response from the fdc */
1217 static int result(void)
1221 for (i = 0; i < MAX_REPLIES; i++) {
1222 if ((status = wait_til_ready()) < 0)
1224 status &= STATUS_DIR | STATUS_READY | STATUS_BUSY | STATUS_DMA;
1225 if ((status & ~STATUS_BUSY) == STATUS_READY) {
1226 #ifdef FLOPPY_SANITY_CHECK
1227 resultjiffies = jiffies;
1232 if (status == (STATUS_DIR | STATUS_READY | STATUS_BUSY))
1233 reply_buffer[i] = fd_inb(FD_DATA);
1237 if (!initialising) {
1239 ("get result error. Fdc=%d Last status=%x Read bytes=%d\n",
1247 #define MORE_OUTPUT -2
1248 /* does the fdc need more output? */
1249 static int need_more_output(void)
1252 if ((status = wait_til_ready()) < 0)
1254 if ((status & (STATUS_READY | STATUS_DIR | STATUS_DMA)) == STATUS_READY)
1259 /* Set perpendicular mode as required, based on data rate, if supported.
1260 * 82077 Now tested. 1Mbps data rate only possible with 82077-1.
1262 static inline void perpendicular_mode(void)
1264 unsigned char perp_mode;
1266 if (raw_cmd->rate & 0x40) {
1267 switch (raw_cmd->rate & 3) {
1275 DPRINT("Invalid data rate for perpendicular mode!\n");
1277 FDCS->reset = 1; /* convenient way to return to
1278 * redo without to much hassle (deep
1285 if (FDCS->perp_mode == perp_mode)
1287 if (FDCS->version >= FDC_82077_ORIG) {
1288 output_byte(FD_PERPENDICULAR);
1289 output_byte(perp_mode);
1290 FDCS->perp_mode = perp_mode;
1291 } else if (perp_mode) {
1292 DPRINT("perpendicular mode not supported by this FDC.\n");
1294 } /* perpendicular_mode */
1296 static int fifo_depth = 0xa;
1299 static int fdc_configure(void)
1302 output_byte(FD_CONFIGURE);
1303 if (need_more_output() != MORE_OUTPUT)
1306 output_byte(0x10 | (no_fifo & 0x20) | (fifo_depth & 0xf));
1307 output_byte(0); /* pre-compensation from track
1312 #define NOMINAL_DTR 500
1314 /* Issue a "SPECIFY" command to set the step rate time, head unload time,
1315 * head load time, and DMA disable flag to values needed by floppy.
1317 * The value "dtr" is the data transfer rate in Kbps. It is needed
1318 * to account for the data rate-based scaling done by the 82072 and 82077
1319 * FDC types. This parameter is ignored for other types of FDCs (i.e.
1322 * Note that changing the data transfer rate has a (probably deleterious)
1323 * effect on the parameters subject to scaling for 82072/82077 FDCs, so
1324 * fdc_specify is called again after each data transfer rate
1327 * srt: 1000 to 16000 in microseconds
1328 * hut: 16 to 240 milliseconds
1329 * hlt: 2 to 254 milliseconds
1331 * These values are rounded up to the next highest available delay time.
1333 static void fdc_specify(void)
1335 unsigned char spec1, spec2;
1336 unsigned long srt, hlt, hut;
1337 unsigned long dtr = NOMINAL_DTR;
1338 unsigned long scale_dtr = NOMINAL_DTR;
1339 int hlt_max_code = 0x7f;
1340 int hut_max_code = 0xf;
1342 if (FDCS->need_configure && FDCS->version >= FDC_82072A) {
1344 FDCS->need_configure = 0;
1345 /*DPRINT("FIFO enabled\n"); */
1348 switch (raw_cmd->rate & 0x03) {
1354 if (FDCS->version >= FDC_82078) {
1355 /* chose the default rate table, not the one
1356 * where 1 = 2 Mbps */
1357 output_byte(FD_DRIVESPEC);
1358 if (need_more_output() == MORE_OUTPUT) {
1359 output_byte(UNIT(current_drive));
1369 if (FDCS->version >= FDC_82072) {
1371 hlt_max_code = 0x00; /* 0==256msec*dtr0/dtr (not linear!) */
1372 hut_max_code = 0x0; /* 0==256msec*dtr0/dtr (not linear!) */
1375 /* Convert step rate from microseconds to milliseconds and 4 bits */
1376 srt = 16 - (DP->srt * scale_dtr / 1000 + NOMINAL_DTR - 1) / NOMINAL_DTR;
1383 hlt = (DP->hlt * scale_dtr / 2 + NOMINAL_DTR - 1) / NOMINAL_DTR;
1386 else if (hlt > 0x7f)
1389 hut = (DP->hut * scale_dtr / 16 + NOMINAL_DTR - 1) / NOMINAL_DTR;
1395 spec1 = (srt << 4) | hut;
1396 spec2 = (hlt << 1) | (use_virtual_dma & 1);
1398 /* If these parameters did not change, just return with success */
1399 if (FDCS->spec1 != spec1 || FDCS->spec2 != spec2) {
1400 /* Go ahead and set spec1 and spec2 */
1401 output_byte(FD_SPECIFY);
1402 output_byte(FDCS->spec1 = spec1);
1403 output_byte(FDCS->spec2 = spec2);
1407 /* Set the FDC's data transfer rate on behalf of the specified drive.
1408 * NOTE: with 82072/82077 FDCs, changing the data rate requires a reissue
1409 * of the specify command (i.e. using the fdc_specify function).
1411 static int fdc_dtr(void)
1413 /* If data rate not already set to desired value, set it. */
1414 if ((raw_cmd->rate & 3) == FDCS->dtr)
1418 fd_outb(raw_cmd->rate & 3, FD_DCR);
1420 /* TODO: some FDC/drive combinations (C&T 82C711 with TEAC 1.2MB)
1421 * need a stabilization period of several milliseconds to be
1422 * enforced after data rate changes before R/W operations.
1423 * Pause 5 msec to avoid trouble. (Needs to be 2 jiffies)
1425 FDCS->dtr = raw_cmd->rate & 3;
1426 return (fd_wait_for_completion(jiffies + 2UL * HZ / 100,
1427 (timeout_fn) floppy_ready));
1430 static void tell_sector(void)
1432 printk(": track %d, head %d, sector %d, size %d",
1433 R_TRACK, R_HEAD, R_SECTOR, R_SIZECODE);
1437 * OK, this error interpreting routine is called after a
1438 * DMA read/write has succeeded
1439 * or failed, so we check the results, and copy any buffers.
1440 * hhb: Added better error reporting.
1441 * ak: Made this into a separate routine.
1443 static int interpret_errors(void)
1448 DPRINT("-- FDC reply error");
1453 /* check IC to find cause of interrupt */
1454 switch (ST0 & ST0_INTR) {
1455 case 0x40: /* error occurred during command execution */
1457 return 0; /* occurs with pseudo-DMA */
1460 DPRINT("Drive is write protected\n");
1461 CLEARF(FD_DISK_WRITABLE);
1464 } else if (ST1 & ST1_ND) {
1465 SETF(FD_NEED_TWADDLE);
1466 } else if (ST1 & ST1_OR) {
1467 if (DP->flags & FTD_MSG)
1468 DPRINT("Over/Underrun - retrying\n");
1470 } else if (*errors >= DP->max_errors.reporting) {
1472 if (ST0 & ST0_ECE) {
1473 printk("Recalibrate failed!");
1474 } else if (ST2 & ST2_CRC) {
1475 printk("data CRC error");
1477 } else if (ST1 & ST1_CRC) {
1478 printk("CRC error");
1480 } else if ((ST1 & (ST1_MAM | ST1_ND))
1481 || (ST2 & ST2_MAM)) {
1483 printk("sector not found");
1486 printk("probe failed...");
1487 } else if (ST2 & ST2_WC) { /* seek error */
1488 printk("wrong cylinder");
1489 } else if (ST2 & ST2_BC) { /* cylinder marked as bad */
1490 printk("bad cylinder");
1493 ("unknown error. ST[0..2] are: 0x%x 0x%x 0x%x",
1500 if (ST2 & ST2_WC || ST2 & ST2_BC)
1501 /* wrong cylinder => recal */
1502 DRS->track = NEED_2_RECAL;
1504 case 0x80: /* invalid command given */
1505 DPRINT("Invalid FDC command given!\n");
1509 DPRINT("Abnormal termination caused by polling\n");
1512 default: /* (0) Normal command termination */
1518 * This routine is called when everything should be correctly set up
1519 * for the transfer (i.e. floppy motor is on, the correct floppy is
1520 * selected, and the head is sitting on the right track).
1522 static void setup_rw_floppy(void)
1524 int i, r, flags, dflags;
1525 unsigned long ready_date;
1526 timeout_fn function;
1528 flags = raw_cmd->flags;
1529 if (flags & (FD_RAW_READ | FD_RAW_WRITE))
1530 flags |= FD_RAW_INTR;
1532 if ((flags & FD_RAW_SPIN) && !(flags & FD_RAW_NO_MOTOR)) {
1533 ready_date = DRS->spinup_date + DP->spinup;
1534 /* If spinup will take a long time, rerun scandrives
1535 * again just before spinup completion. Beware that
1536 * after scandrives, we must again wait for selection.
1538 if ((signed)(ready_date - jiffies) > DP->select_delay) {
1539 ready_date -= DP->select_delay;
1540 function = (timeout_fn) floppy_start;
1542 function = (timeout_fn) setup_rw_floppy;
1544 /* wait until the floppy is spinning fast enough */
1545 if (fd_wait_for_completion(ready_date, function))
1548 dflags = DRS->flags;
1550 if ((flags & FD_RAW_READ) || (flags & FD_RAW_WRITE))
1553 if (flags & FD_RAW_INTR)
1554 do_floppy = main_command_interrupt;
1557 for (i = 0; i < raw_cmd->cmd_count; i++)
1558 r |= output_byte(raw_cmd->cmd[i]);
1560 debugt("rw_command: ");
1568 if (!(flags & FD_RAW_INTR)) {
1571 } else if (flags & FD_RAW_NEED_DISK)
1575 static int blind_seek;
1578 * This is the routine called after every seek (or recalibrate) interrupt
1579 * from the floppy controller.
1581 static void seek_interrupt(void)
1583 debugt("seek interrupt:");
1584 if (inr != 2 || (ST0 & 0xF8) != 0x20) {
1585 DPRINT("seek failed\n");
1586 DRS->track = NEED_2_RECAL;
1591 if (DRS->track >= 0 && DRS->track != ST1 && !blind_seek) {
1593 if (DP->flags & FD_DEBUG) {
1595 ("clearing NEWCHANGE flag because of effective seek\n");
1596 DPRINT("jiffies=%lu\n", jiffies);
1599 CLEARF(FD_DISK_NEWCHANGE); /* effective seek */
1600 DRS->select_date = jiffies;
1606 static void check_wp(void)
1608 if (TESTF(FD_VERIFY)) {
1609 /* check write protection */
1610 output_byte(FD_GETSTATUS);
1611 output_byte(UNIT(current_drive));
1612 if (result() != 1) {
1617 CLEARF(FD_NEED_TWADDLE);
1619 if (DP->flags & FD_DEBUG) {
1620 DPRINT("checking whether disk is write protected\n");
1621 DPRINT("wp=%x\n", ST3 & 0x40);
1625 SETF(FD_DISK_WRITABLE);
1627 CLEARF(FD_DISK_WRITABLE);
1631 static void seek_floppy(void)
1638 if (DP->flags & FD_DEBUG) {
1639 DPRINT("calling disk change from seek\n");
1643 if (!TESTF(FD_DISK_NEWCHANGE) &&
1644 disk_change(current_drive) && (raw_cmd->flags & FD_RAW_NEED_DISK)) {
1645 /* the media changed flag should be cleared after the seek.
1646 * If it isn't, this means that there is really no disk in
1649 SETF(FD_DISK_CHANGED);
1654 if (DRS->track <= NEED_1_RECAL) {
1655 recalibrate_floppy();
1657 } else if (TESTF(FD_DISK_NEWCHANGE) &&
1658 (raw_cmd->flags & FD_RAW_NEED_DISK) &&
1659 (DRS->track <= NO_TRACK || DRS->track == raw_cmd->track)) {
1660 /* we seek to clear the media-changed condition. Does anybody
1661 * know a more elegant way, which works on all drives? */
1663 track = raw_cmd->track - 1;
1665 if (DP->flags & FD_SILENT_DCL_CLEAR) {
1666 set_dor(fdc, ~(0x10 << UNIT(current_drive)), 0);
1668 raw_cmd->flags |= FD_RAW_NEED_SEEK;
1674 if (raw_cmd->track != DRS->track &&
1675 (raw_cmd->flags & FD_RAW_NEED_SEEK))
1676 track = raw_cmd->track;
1683 do_floppy = seek_interrupt;
1684 output_byte(FD_SEEK);
1685 output_byte(UNIT(current_drive));
1687 debugt("seek command:");
1690 static void recal_interrupt(void)
1692 debugt("recal interrupt:");
1695 else if (ST0 & ST0_ECE) {
1696 switch (DRS->track) {
1698 debugt("recal interrupt need 1 recal:");
1699 /* after a second recalibrate, we still haven't
1700 * reached track 0. Probably no drive. Raise an
1701 * error, as failing immediately might upset
1702 * computers possessed by the Devil :-) */
1707 debugt("recal interrupt need 2 recal:");
1708 /* If we already did a recalibrate,
1709 * and we are not at track 0, this
1710 * means we have moved. (The only way
1711 * not to move at recalibration is to
1712 * be already at track 0.) Clear the
1713 * new change flag */
1715 if (DP->flags & FD_DEBUG) {
1717 ("clearing NEWCHANGE flag because of second recalibrate\n");
1721 CLEARF(FD_DISK_NEWCHANGE);
1722 DRS->select_date = jiffies;
1725 debugt("recal interrupt default:");
1726 /* Recalibrate moves the head by at
1727 * most 80 steps. If after one
1728 * recalibrate we don't have reached
1729 * track 0, this might mean that we
1730 * started beyond track 80. Try
1732 DRS->track = NEED_1_RECAL;
1740 static void print_result(char *message, int inr)
1744 DPRINT("%s ", message);
1746 for (i = 0; i < inr; i++)
1747 printk("repl[%d]=%x ", i, reply_buffer[i]);
1751 /* interrupt handler. Note that this can be called externally on the Sparc */
1752 irqreturn_t floppy_interrupt(int irq, void *dev_id, struct pt_regs *regs)
1754 void (*handler) (void) = do_floppy;
1758 lasthandler = handler;
1759 interruptjiffies = jiffies;
1761 f = claim_dma_lock();
1763 release_dma_lock(f);
1765 floppy_enable_hlt();
1767 if (fdc >= N_FDC || FDCS->address == -1) {
1768 /* we don't even know which FDC is the culprit */
1769 printk("DOR0=%x\n", fdc_state[0].dor);
1770 printk("floppy interrupt on bizarre fdc %d\n", fdc);
1771 printk("handler=%p\n", handler);
1772 is_alive("bizarre fdc");
1777 /* We have to clear the reset flag here, because apparently on boxes
1778 * with level triggered interrupts (PS/2, Sparc, ...), it is needed to
1779 * emit SENSEI's to clear the interrupt line. And FDCS->reset blocks the
1780 * emission of the SENSEI's.
1781 * It is OK to emit floppy commands because we are in an interrupt
1782 * handler here, and thus we have to fear no interference of other
1786 do_print = !handler && print_unex && !initialising;
1790 print_result("unexpected interrupt", inr);
1794 output_byte(FD_SENSEI);
1797 print_result("sensei", inr);
1799 } while ((ST0 & 0x83) != UNIT(current_drive) && inr == 2
1806 schedule_bh(handler);
1807 is_alive("normal interrupt end");
1809 /* FIXME! Was it really for us? */
1813 static void recalibrate_floppy(void)
1815 debugt("recalibrate floppy:");
1816 do_floppy = recal_interrupt;
1817 output_byte(FD_RECALIBRATE);
1818 LAST_OUT(UNIT(current_drive));
1822 * Must do 4 FD_SENSEIs after reset because of ``drive polling''.
1824 static void reset_interrupt(void)
1826 debugt("reset interrupt:");
1827 result(); /* get the status ready for set_fdc */
1829 printk("reset set in interrupt, calling %p\n", cont->error);
1830 cont->error(); /* a reset just after a reset. BAD! */
1836 * reset is done by pulling bit 2 of DOR low for a while (old FDCs),
1837 * or by setting the self clearing bit 7 of STATUS (newer FDCs)
1839 static void reset_fdc(void)
1841 unsigned long flags;
1843 do_floppy = reset_interrupt;
1847 /* Pseudo-DMA may intercept 'reset finished' interrupt. */
1848 /* Irrelevant for systems with true DMA (i386). */
1850 flags = claim_dma_lock();
1852 release_dma_lock(flags);
1854 if (FDCS->version >= FDC_82072A)
1855 fd_outb(0x80 | (FDCS->dtr & 3), FD_STATUS);
1857 fd_outb(FDCS->dor & ~0x04, FD_DOR);
1858 udelay(FD_RESET_DELAY);
1859 fd_outb(FDCS->dor, FD_DOR);
1863 static void show_floppy(void)
1868 printk("floppy driver state\n");
1869 printk("-------------------\n");
1870 printk("now=%lu last interrupt=%lu diff=%lu last called handler=%p\n",
1871 jiffies, interruptjiffies, jiffies - interruptjiffies,
1874 #ifdef FLOPPY_SANITY_CHECK
1875 printk("timeout_message=%s\n", timeout_message);
1876 printk("last output bytes:\n");
1877 for (i = 0; i < OLOGSIZE; i++)
1878 printk("%2x %2x %lu\n",
1879 output_log[(i + output_log_pos) % OLOGSIZE].data,
1880 output_log[(i + output_log_pos) % OLOGSIZE].status,
1881 output_log[(i + output_log_pos) % OLOGSIZE].jiffies);
1882 printk("last result at %lu\n", resultjiffies);
1883 printk("last redo_fd_request at %lu\n", lastredo);
1884 for (i = 0; i < resultsize; i++) {
1885 printk("%2x ", reply_buffer[i]);
1890 printk("status=%x\n", fd_inb(FD_STATUS));
1891 printk("fdc_busy=%lu\n", fdc_busy);
1893 printk("do_floppy=%p\n", do_floppy);
1894 if (floppy_work.pending)
1895 printk("floppy_work.func=%p\n", floppy_work.func);
1896 if (timer_pending(&fd_timer))
1897 printk("fd_timer.function=%p\n", fd_timer.function);
1898 if (timer_pending(&fd_timeout)) {
1899 printk("timer_function=%p\n", fd_timeout.function);
1900 printk("expires=%lu\n", fd_timeout.expires - jiffies);
1901 printk("now=%lu\n", jiffies);
1903 printk("cont=%p\n", cont);
1904 printk("current_req=%p\n", current_req);
1905 printk("command_status=%d\n", command_status);
1909 static void floppy_shutdown(unsigned long data)
1911 unsigned long flags;
1917 floppy_enable_hlt();
1919 flags = claim_dma_lock();
1921 release_dma_lock(flags);
1923 /* avoid dma going to a random drive after shutdown */
1926 DPRINT("floppy timeout called\n");
1930 cont->redo(); /* this will recall reset when needed */
1932 printk("no cont in shutdown!\n");
1933 process_fd_request();
1935 is_alive("floppy shutdown");
1938 /*typedef void (*timeout_fn)(unsigned long);*/
1940 /* start motor, check media-changed condition and write protection */
1941 static int start_motor(void (*function) (void))
1946 data = UNIT(current_drive);
1947 if (!(raw_cmd->flags & FD_RAW_NO_MOTOR)) {
1948 if (!(FDCS->dor & (0x10 << UNIT(current_drive)))) {
1950 /* no read since this drive is running */
1951 DRS->first_read_date = 0;
1952 /* note motor start time if motor is not yet running */
1953 DRS->spinup_date = jiffies;
1954 data |= (0x10 << UNIT(current_drive));
1956 } else if (FDCS->dor & (0x10 << UNIT(current_drive)))
1957 mask &= ~(0x10 << UNIT(current_drive));
1959 /* starts motor and selects floppy */
1960 del_timer(motor_off_timer + current_drive);
1961 set_dor(fdc, mask, data);
1963 /* wait_for_completion also schedules reset if needed. */
1964 return (fd_wait_for_completion(DRS->select_date + DP->select_delay,
1965 (timeout_fn) function));
1968 static void floppy_ready(void)
1971 if (start_motor(floppy_ready))
1977 if (DP->flags & FD_DEBUG) {
1978 DPRINT("calling disk change from floppy_ready\n");
1981 if (!(raw_cmd->flags & FD_RAW_NO_MOTOR) &&
1982 disk_change(current_drive) && !DP->select_delay)
1983 twaddle(); /* this clears the dcl on certain drive/controller
1986 #ifdef fd_chose_dma_mode
1987 if ((raw_cmd->flags & FD_RAW_READ) || (raw_cmd->flags & FD_RAW_WRITE)) {
1988 unsigned long flags = claim_dma_lock();
1989 fd_chose_dma_mode(raw_cmd->kernel_data, raw_cmd->length);
1990 release_dma_lock(flags);
1994 if (raw_cmd->flags & (FD_RAW_NEED_SEEK | FD_RAW_NEED_DISK)) {
1995 perpendicular_mode();
1996 fdc_specify(); /* must be done here because of hut, hlt ... */
1999 if ((raw_cmd->flags & FD_RAW_READ) ||
2000 (raw_cmd->flags & FD_RAW_WRITE))
2006 static void floppy_start(void)
2008 reschedule_timeout(current_reqD, "floppy start", 0);
2012 if (DP->flags & FD_DEBUG) {
2013 DPRINT("setting NEWCHANGE in floppy_start\n");
2016 SETF(FD_DISK_NEWCHANGE);
2021 * ========================================================================
2022 * here ends the bottom half. Exported routines are:
2023 * floppy_start, floppy_off, floppy_ready, lock_fdc, unlock_fdc, set_fdc,
2024 * start_motor, reset_fdc, reset_fdc_info, interpret_errors.
2025 * Initialization also uses output_byte, result, set_dor, floppy_interrupt
2027 * ========================================================================
2030 * General purpose continuations.
2031 * ==============================
2034 static void do_wakeup(void)
2036 reschedule_timeout(MAXTIMEOUT, "do wakeup", 0);
2038 command_status += 2;
2039 wake_up(&command_done);
2042 static struct cont_t wakeup_cont = {
2046 .done = (done_f) empty
2049 static struct cont_t intr_cont = {
2051 .redo = process_fd_request,
2053 .done = (done_f) empty
2056 static int wait_til_done(void (*handler) (void), int interruptible)
2060 schedule_bh(handler);
2062 if (command_status < 2 && NO_SIGNAL) {
2063 DECLARE_WAITQUEUE(wait, current);
2065 add_wait_queue(&command_done, &wait);
2067 set_current_state(interruptible ?
2068 TASK_INTERRUPTIBLE :
2069 TASK_UNINTERRUPTIBLE);
2071 if (command_status >= 2 || !NO_SIGNAL)
2074 is_alive("wait_til_done");
2079 set_current_state(TASK_RUNNING);
2080 remove_wait_queue(&command_done, &wait);
2083 if (command_status < 2) {
2091 command_status = FD_COMMAND_ERROR;
2092 if (command_status == FD_COMMAND_OKAY)
2096 command_status = FD_COMMAND_NONE;
2100 static void generic_done(int result)
2102 command_status = result;
2103 cont = &wakeup_cont;
2106 static void generic_success(void)
2111 static void generic_failure(void)
2116 static void success_and_wakeup(void)
2123 * formatting and rw support.
2124 * ==========================
2127 static int next_valid_format(void)
2131 probed_format = DRS->probed_format;
2133 if (probed_format >= 8 || !DP->autodetect[probed_format]) {
2134 DRS->probed_format = 0;
2137 if (floppy_type[DP->autodetect[probed_format]].sect) {
2138 DRS->probed_format = probed_format;
2145 static void bad_flp_intr(void)
2150 DRS->probed_format++;
2151 if (!next_valid_format())
2154 err_count = ++(*errors);
2155 INFBOUND(DRWE->badness, err_count);
2156 if (err_count > DP->max_errors.abort)
2158 if (err_count > DP->max_errors.reset)
2160 else if (err_count > DP->max_errors.recal)
2161 DRS->track = NEED_2_RECAL;
2164 static void set_floppy(int drive)
2166 int type = ITYPE(UDRS->fd_device);
2168 _floppy = floppy_type + type;
2170 _floppy = current_type[drive];
2174 * formatting support.
2175 * ===================
2177 static void format_interrupt(void)
2179 switch (interpret_errors()) {
2190 #define CODE2SIZE (ssize = ((1 << SIZECODE) + 3) >> 2)
2191 #define FM_MODE(x,y) ((y) & ~(((x)->rate & 0x80) >>1))
2192 #define CT(x) ((x) | 0xc0)
2193 static void setup_format_params(int track)
2196 unsigned char track, head, sect, size;
2197 } *here = (struct fparm *)floppy_track_buffer;
2199 int count, head_shift, track_shift;
2201 raw_cmd = &default_raw_cmd;
2202 raw_cmd->track = track;
2204 raw_cmd->flags = FD_RAW_WRITE | FD_RAW_INTR | FD_RAW_SPIN |
2205 FD_RAW_NEED_DISK | FD_RAW_NEED_SEEK;
2206 raw_cmd->rate = _floppy->rate & 0x43;
2207 raw_cmd->cmd_count = NR_F;
2208 COMMAND = FM_MODE(_floppy, FD_FORMAT);
2209 DR_SELECT = UNIT(current_drive) + PH_HEAD(_floppy, format_req.head);
2210 F_SIZECODE = FD_SIZECODE(_floppy);
2211 F_SECT_PER_TRACK = _floppy->sect << 2 >> F_SIZECODE;
2212 F_GAP = _floppy->fmt_gap;
2213 F_FILL = FD_FILL_BYTE;
2215 raw_cmd->kernel_data = floppy_track_buffer;
2216 raw_cmd->length = 4 * F_SECT_PER_TRACK;
2218 /* allow for about 30ms for data transport per track */
2219 head_shift = (F_SECT_PER_TRACK + 5) / 6;
2221 /* a ``cylinder'' is two tracks plus a little stepping time */
2222 track_shift = 2 * head_shift + 3;
2224 /* position of logical sector 1 on this track */
2225 n = (track_shift * format_req.track + head_shift * format_req.head)
2228 /* determine interleave */
2230 if (_floppy->fmt_gap < 0x22)
2233 /* initialize field */
2234 for (count = 0; count < F_SECT_PER_TRACK; ++count) {
2235 here[count].track = format_req.track;
2236 here[count].head = format_req.head;
2237 here[count].sect = 0;
2238 here[count].size = F_SIZECODE;
2240 /* place logical sectors */
2241 for (count = 1; count <= F_SECT_PER_TRACK; ++count) {
2242 here[n].sect = count;
2243 n = (n + il) % F_SECT_PER_TRACK;
2244 if (here[n].sect) { /* sector busy, find next free sector */
2246 if (n >= F_SECT_PER_TRACK) {
2247 n -= F_SECT_PER_TRACK;
2248 while (here[n].sect)
2253 if (_floppy->stretch & FD_ZEROBASED) {
2254 for (count = 0; count < F_SECT_PER_TRACK; count++)
2259 static void redo_format(void)
2262 setup_format_params(format_req.track << STRETCH(_floppy));
2264 debugt("queue format request");
2267 static struct cont_t format_cont = {
2268 .interrupt = format_interrupt,
2269 .redo = redo_format,
2270 .error = bad_flp_intr,
2271 .done = generic_done
2274 static int do_format(int drive, struct format_descr *tmp_format_req)
2281 _floppy->track > DP->tracks ||
2282 tmp_format_req->track >= _floppy->track ||
2283 tmp_format_req->head >= _floppy->head ||
2284 (_floppy->sect << 2) % (1 << FD_SIZECODE(_floppy)) ||
2285 !_floppy->fmt_gap) {
2286 process_fd_request();
2289 format_req = *tmp_format_req;
2291 cont = &format_cont;
2292 errors = &format_errors;
2294 process_fd_request();
2299 * Buffer read/write and support
2300 * =============================
2303 static void floppy_end_request(struct request *req, int uptodate)
2305 unsigned int nr_sectors = current_count_sectors;
2307 /* current_count_sectors can be zero if transfer failed */
2309 nr_sectors = req->current_nr_sectors;
2310 if (end_that_request_first(req, uptodate, nr_sectors))
2312 add_disk_randomness(req->rq_disk);
2313 floppy_off((long)req->rq_disk->private_data);
2314 blkdev_dequeue_request(req);
2315 end_that_request_last(req, uptodate);
2317 /* We're done with the request */
2321 /* new request_done. Can handle physical sectors which are smaller than a
2323 static void request_done(int uptodate)
2325 struct request_queue *q = floppy_queue;
2326 struct request *req = current_req;
2327 unsigned long flags;
2331 reschedule_timeout(MAXTIMEOUT, "request done %d", uptodate);
2334 printk("floppy.c: no request in request_done\n");
2339 /* maintain values for invalidation on geometry
2341 block = current_count_sectors + req->sector;
2342 INFBOUND(DRS->maxblock, block);
2343 if (block > _floppy->sect)
2346 /* unlock chained buffers */
2347 spin_lock_irqsave(q->queue_lock, flags);
2348 floppy_end_request(req, 1);
2349 spin_unlock_irqrestore(q->queue_lock, flags);
2351 if (rq_data_dir(req) == WRITE) {
2352 /* record write error information */
2353 DRWE->write_errors++;
2354 if (DRWE->write_errors == 1) {
2355 DRWE->first_error_sector = req->sector;
2356 DRWE->first_error_generation = DRS->generation;
2358 DRWE->last_error_sector = req->sector;
2359 DRWE->last_error_generation = DRS->generation;
2361 spin_lock_irqsave(q->queue_lock, flags);
2362 floppy_end_request(req, 0);
2363 spin_unlock_irqrestore(q->queue_lock, flags);
2367 /* Interrupt handler evaluating the result of the r/w operation */
2368 static void rw_interrupt(void)
2370 int nr_sectors, ssize, eoc, heads;
2373 /* some Toshiba floppy controllers occasionnally seem to
2374 * return bogus interrupts after read/write operations, which
2375 * can be recognized by a bad head number (>= 2) */
2379 if (!DRS->first_read_date)
2380 DRS->first_read_date = jiffies;
2395 nr_sectors = (((R_TRACK - TRACK) * heads +
2396 R_HEAD - HEAD) * SECT_PER_TRACK +
2397 R_SECTOR - SECTOR + eoc) << SIZECODE >> 2;
2399 #ifdef FLOPPY_SANITY_CHECK
2400 if (nr_sectors / ssize >
2401 (in_sector_offset + current_count_sectors + ssize - 1) / ssize) {
2402 DPRINT("long rw: %x instead of %lx\n",
2403 nr_sectors, current_count_sectors);
2404 printk("rs=%d s=%d\n", R_SECTOR, SECTOR);
2405 printk("rh=%d h=%d\n", R_HEAD, HEAD);
2406 printk("rt=%d t=%d\n", R_TRACK, TRACK);
2407 printk("heads=%d eoc=%d\n", heads, eoc);
2408 printk("spt=%d st=%d ss=%d\n", SECT_PER_TRACK,
2410 printk("in_sector_offset=%d\n", in_sector_offset);
2414 nr_sectors -= in_sector_offset;
2415 INFBOUND(nr_sectors, 0);
2416 SUPBOUND(current_count_sectors, nr_sectors);
2418 switch (interpret_errors()) {
2423 if (!current_count_sectors) {
2430 if (!current_count_sectors) {
2434 current_type[current_drive] = _floppy;
2435 floppy_sizes[TOMINOR(current_drive)] = _floppy->size;
2440 if (DP->flags & FTD_MSG)
2441 DPRINT("Auto-detected floppy type %s in fd%d\n",
2442 _floppy->name, current_drive);
2443 current_type[current_drive] = _floppy;
2444 floppy_sizes[TOMINOR(current_drive)] = _floppy->size;
2448 if (CT(COMMAND) != FD_READ ||
2449 raw_cmd->kernel_data == current_req->buffer) {
2450 /* transfer directly from buffer */
2452 } else if (CT(COMMAND) == FD_READ) {
2453 buffer_track = raw_cmd->track;
2454 buffer_drive = current_drive;
2455 INFBOUND(buffer_max, nr_sectors + fsector_t);
2460 /* Compute maximal contiguous buffer size. */
2461 static int buffer_chain_size(void)
2468 base = bio_data(current_req->bio);
2471 rq_for_each_bio(bio, current_req) {
2472 bio_for_each_segment(bv, bio, i) {
2473 if (page_address(bv->bv_page) + bv->bv_offset !=
2484 /* Compute the maximal transfer size */
2485 static int transfer_size(int ssize, int max_sector, int max_size)
2487 SUPBOUND(max_sector, fsector_t + max_size);
2490 max_sector -= (max_sector % _floppy->sect) % ssize;
2492 /* transfer size, beginning not aligned */
2493 current_count_sectors = max_sector - fsector_t;
2499 * Move data from/to the track buffer to/from the buffer cache.
2501 static void copy_buffer(int ssize, int max_sector, int max_sector_2)
2503 int remaining; /* number of transferred 512-byte sectors */
2506 char *buffer, *dma_buffer;
2509 max_sector = transfer_size(ssize,
2510 min(max_sector, max_sector_2),
2511 current_req->nr_sectors);
2513 if (current_count_sectors <= 0 && CT(COMMAND) == FD_WRITE &&
2514 buffer_max > fsector_t + current_req->nr_sectors)
2515 current_count_sectors = min_t(int, buffer_max - fsector_t,
2516 current_req->nr_sectors);
2518 remaining = current_count_sectors << 9;
2519 #ifdef FLOPPY_SANITY_CHECK
2520 if ((remaining >> 9) > current_req->nr_sectors &&
2521 CT(COMMAND) == FD_WRITE) {
2522 DPRINT("in copy buffer\n");
2523 printk("current_count_sectors=%ld\n", current_count_sectors);
2524 printk("remaining=%d\n", remaining >> 9);
2525 printk("current_req->nr_sectors=%ld\n",
2526 current_req->nr_sectors);
2527 printk("current_req->current_nr_sectors=%u\n",
2528 current_req->current_nr_sectors);
2529 printk("max_sector=%d\n", max_sector);
2530 printk("ssize=%d\n", ssize);
2534 buffer_max = max(max_sector, buffer_max);
2536 dma_buffer = floppy_track_buffer + ((fsector_t - buffer_min) << 9);
2538 size = current_req->current_nr_sectors << 9;
2540 rq_for_each_bio(bio, current_req) {
2541 bio_for_each_segment(bv, bio, i) {
2546 SUPBOUND(size, remaining);
2548 buffer = page_address(bv->bv_page) + bv->bv_offset;
2549 #ifdef FLOPPY_SANITY_CHECK
2550 if (dma_buffer + size >
2551 floppy_track_buffer + (max_buffer_sectors << 10) ||
2552 dma_buffer < floppy_track_buffer) {
2553 DPRINT("buffer overrun in copy buffer %d\n",
2554 (int)((floppy_track_buffer -
2556 printk("fsector_t=%d buffer_min=%d\n",
2557 fsector_t, buffer_min);
2558 printk("current_count_sectors=%ld\n",
2559 current_count_sectors);
2560 if (CT(COMMAND) == FD_READ)
2562 if (CT(COMMAND) == FD_WRITE)
2566 if (((unsigned long)buffer) % 512)
2567 DPRINT("%p buffer not aligned\n", buffer);
2569 if (CT(COMMAND) == FD_READ)
2570 memcpy(buffer, dma_buffer, size);
2572 memcpy(dma_buffer, buffer, size);
2578 #ifdef FLOPPY_SANITY_CHECK
2581 max_sector -= remaining >> 9;
2582 DPRINT("weirdness: remaining %d\n", remaining >> 9);
2588 static inline int check_dma_crossing(char *start,
2589 unsigned long length, char *message)
2591 if (CROSS_64KB(start, length)) {
2592 printk("DMA xfer crosses 64KB boundary in %s %p-%p\n",
2593 message, start, start + length);
2600 /* work around a bug in pseudo DMA
2601 * (on some FDCs) pseudo DMA does not stop when the CPU stops
2602 * sending data. Hence we need a different way to signal the
2603 * transfer length: We use SECT_PER_TRACK. Unfortunately, this
2604 * does not work with MT, hence we can only transfer one head at
2607 static void virtualdmabug_workaround(void)
2609 int hard_sectors, end_sector;
2611 if (CT(COMMAND) == FD_WRITE) {
2612 COMMAND &= ~0x80; /* switch off multiple track mode */
2614 hard_sectors = raw_cmd->length >> (7 + SIZECODE);
2615 end_sector = SECTOR + hard_sectors - 1;
2616 #ifdef FLOPPY_SANITY_CHECK
2617 if (end_sector > SECT_PER_TRACK) {
2618 printk("too many sectors %d > %d\n",
2619 end_sector, SECT_PER_TRACK);
2623 SECT_PER_TRACK = end_sector; /* make sure SECT_PER_TRACK points
2624 * to end of transfer */
2629 * Formulate a read/write request.
2630 * this routine decides where to load the data (directly to buffer, or to
2631 * tmp floppy area), how much data to load (the size of the buffer, the whole
2632 * track, or a single sector)
2633 * All floppy_track_buffer handling goes in here. If we ever add track buffer
2634 * allocation on the fly, it should be done here. No other part should need
2638 static int make_raw_rw_request(void)
2640 int aligned_sector_t;
2641 int max_sector, max_size, tracksize, ssize;
2643 if (max_buffer_sectors == 0) {
2644 printk("VFS: Block I/O scheduled on unopened device\n");
2648 set_fdc((long)current_req->rq_disk->private_data);
2650 raw_cmd = &default_raw_cmd;
2651 raw_cmd->flags = FD_RAW_SPIN | FD_RAW_NEED_DISK | FD_RAW_NEED_DISK |
2653 raw_cmd->cmd_count = NR_RW;
2654 if (rq_data_dir(current_req) == READ) {
2655 raw_cmd->flags |= FD_RAW_READ;
2656 COMMAND = FM_MODE(_floppy, FD_READ);
2657 } else if (rq_data_dir(current_req) == WRITE) {
2658 raw_cmd->flags |= FD_RAW_WRITE;
2659 COMMAND = FM_MODE(_floppy, FD_WRITE);
2661 DPRINT("make_raw_rw_request: unknown command\n");
2665 max_sector = _floppy->sect * _floppy->head;
2667 TRACK = (int)current_req->sector / max_sector;
2668 fsector_t = (int)current_req->sector % max_sector;
2669 if (_floppy->track && TRACK >= _floppy->track) {
2670 if (current_req->current_nr_sectors & 1) {
2671 current_count_sectors = 1;
2676 HEAD = fsector_t / _floppy->sect;
2678 if (((_floppy->stretch & (FD_SWAPSIDES | FD_ZEROBASED)) ||
2679 TESTF(FD_NEED_TWADDLE)) && fsector_t < _floppy->sect)
2680 max_sector = _floppy->sect;
2682 /* 2M disks have phantom sectors on the first track */
2683 if ((_floppy->rate & FD_2M) && (!TRACK) && (!HEAD)) {
2684 max_sector = 2 * _floppy->sect / 3;
2685 if (fsector_t >= max_sector) {
2686 current_count_sectors =
2687 min_t(int, _floppy->sect - fsector_t,
2688 current_req->nr_sectors);
2693 SIZECODE = FD_SIZECODE(_floppy);
2694 raw_cmd->rate = _floppy->rate & 0x43;
2695 if ((_floppy->rate & FD_2M) && (TRACK || HEAD) && raw_cmd->rate == 2)
2702 raw_cmd->track = TRACK << STRETCH(_floppy);
2703 DR_SELECT = UNIT(current_drive) + PH_HEAD(_floppy, HEAD);
2706 SECT_PER_TRACK = _floppy->sect << 2 >> SIZECODE;
2707 SECTOR = ((fsector_t % _floppy->sect) << 2 >> SIZECODE) +
2708 ((_floppy->stretch & FD_ZEROBASED) ? 0 : 1);
2710 /* tracksize describes the size which can be filled up with sectors
2713 tracksize = _floppy->sect - _floppy->sect % ssize;
2714 if (tracksize < _floppy->sect) {
2716 if (tracksize <= fsector_t % _floppy->sect)
2719 /* if we are beyond tracksize, fill up using smaller sectors */
2720 while (tracksize <= fsector_t % _floppy->sect) {
2721 while (tracksize + ssize > _floppy->sect) {
2729 max_sector = HEAD * _floppy->sect + tracksize;
2730 } else if (!TRACK && !HEAD && !(_floppy->rate & FD_2M) && probing) {
2731 max_sector = _floppy->sect;
2732 } else if (!HEAD && CT(COMMAND) == FD_WRITE) {
2733 /* for virtual DMA bug workaround */
2734 max_sector = _floppy->sect;
2737 in_sector_offset = (fsector_t % _floppy->sect) % ssize;
2738 aligned_sector_t = fsector_t - in_sector_offset;
2739 max_size = current_req->nr_sectors;
2740 if ((raw_cmd->track == buffer_track) &&
2741 (current_drive == buffer_drive) &&
2742 (fsector_t >= buffer_min) && (fsector_t < buffer_max)) {
2743 /* data already in track buffer */
2744 if (CT(COMMAND) == FD_READ) {
2745 copy_buffer(1, max_sector, buffer_max);
2748 } else if (in_sector_offset || current_req->nr_sectors < ssize) {
2749 if (CT(COMMAND) == FD_WRITE) {
2750 if (fsector_t + current_req->nr_sectors > ssize &&
2751 fsector_t + current_req->nr_sectors < ssize + ssize)
2752 max_size = ssize + ssize;
2756 raw_cmd->flags &= ~FD_RAW_WRITE;
2757 raw_cmd->flags |= FD_RAW_READ;
2758 COMMAND = FM_MODE(_floppy, FD_READ);
2759 } else if ((unsigned long)current_req->buffer < MAX_DMA_ADDRESS) {
2760 unsigned long dma_limit;
2761 int direct, indirect;
2764 transfer_size(ssize, max_sector,
2765 max_buffer_sectors * 2) - fsector_t;
2768 * Do NOT use minimum() here---MAX_DMA_ADDRESS is 64 bits wide
2769 * on a 64 bit machine!
2771 max_size = buffer_chain_size();
2774 ((unsigned long)current_req->buffer)) >> 9;
2775 if ((unsigned long)max_size > dma_limit) {
2776 max_size = dma_limit;
2778 /* 64 kb boundaries */
2779 if (CROSS_64KB(current_req->buffer, max_size << 9))
2781 ((unsigned long)current_req->buffer) %
2783 direct = transfer_size(ssize, max_sector, max_size) - fsector_t;
2785 * We try to read tracks, but if we get too many errors, we
2786 * go back to reading just one sector at a time.
2788 * This means we should be able to read a sector even if there
2789 * are other bad sectors on this track.
2792 (indirect * 2 > direct * 3 &&
2793 *errors < DP->max_errors.read_track &&
2794 /*!TESTF(FD_NEED_TWADDLE) && */
2796 || (DP->read_track & (1 << DRS->probed_format)))))) {
2797 max_size = current_req->nr_sectors;
2799 raw_cmd->kernel_data = current_req->buffer;
2800 raw_cmd->length = current_count_sectors << 9;
2801 if (raw_cmd->length == 0) {
2803 ("zero dma transfer attempted from make_raw_request\n");
2804 DPRINT("indirect=%d direct=%d fsector_t=%d",
2805 indirect, direct, fsector_t);
2808 /* check_dma_crossing(raw_cmd->kernel_data,
2810 "end of make_raw_request [1]");*/
2812 virtualdmabug_workaround();
2817 if (CT(COMMAND) == FD_READ)
2818 max_size = max_sector; /* unbounded */
2820 /* claim buffer track if needed */
2821 if (buffer_track != raw_cmd->track || /* bad track */
2822 buffer_drive != current_drive || /* bad drive */
2823 fsector_t > buffer_max ||
2824 fsector_t < buffer_min ||
2825 ((CT(COMMAND) == FD_READ ||
2826 (!in_sector_offset && current_req->nr_sectors >= ssize)) &&
2827 max_sector > 2 * max_buffer_sectors + buffer_min &&
2828 max_size + fsector_t > 2 * max_buffer_sectors + buffer_min)
2829 /* not enough space */
2832 buffer_drive = current_drive;
2833 buffer_max = buffer_min = aligned_sector_t;
2835 raw_cmd->kernel_data = floppy_track_buffer +
2836 ((aligned_sector_t - buffer_min) << 9);
2838 if (CT(COMMAND) == FD_WRITE) {
2839 /* copy write buffer to track buffer.
2840 * if we get here, we know that the write
2841 * is either aligned or the data already in the buffer
2842 * (buffer will be overwritten) */
2843 #ifdef FLOPPY_SANITY_CHECK
2844 if (in_sector_offset && buffer_track == -1)
2845 DPRINT("internal error offset !=0 on write\n");
2847 buffer_track = raw_cmd->track;
2848 buffer_drive = current_drive;
2849 copy_buffer(ssize, max_sector,
2850 2 * max_buffer_sectors + buffer_min);
2852 transfer_size(ssize, max_sector,
2853 2 * max_buffer_sectors + buffer_min -
2856 /* round up current_count_sectors to get dma xfer size */
2857 raw_cmd->length = in_sector_offset + current_count_sectors;
2858 raw_cmd->length = ((raw_cmd->length - 1) | (ssize - 1)) + 1;
2859 raw_cmd->length <<= 9;
2860 #ifdef FLOPPY_SANITY_CHECK
2861 /*check_dma_crossing(raw_cmd->kernel_data, raw_cmd->length,
2862 "end of make_raw_request"); */
2863 if ((raw_cmd->length < current_count_sectors << 9) ||
2864 (raw_cmd->kernel_data != current_req->buffer &&
2865 CT(COMMAND) == FD_WRITE &&
2866 (aligned_sector_t + (raw_cmd->length >> 9) > buffer_max ||
2867 aligned_sector_t < buffer_min)) ||
2868 raw_cmd->length % (128 << SIZECODE) ||
2869 raw_cmd->length <= 0 || current_count_sectors <= 0) {
2870 DPRINT("fractionary current count b=%lx s=%lx\n",
2871 raw_cmd->length, current_count_sectors);
2872 if (raw_cmd->kernel_data != current_req->buffer)
2873 printk("addr=%d, length=%ld\n",
2874 (int)((raw_cmd->kernel_data -
2875 floppy_track_buffer) >> 9),
2876 current_count_sectors);
2877 printk("st=%d ast=%d mse=%d msi=%d\n",
2878 fsector_t, aligned_sector_t, max_sector, max_size);
2879 printk("ssize=%x SIZECODE=%d\n", ssize, SIZECODE);
2880 printk("command=%x SECTOR=%d HEAD=%d, TRACK=%d\n",
2881 COMMAND, SECTOR, HEAD, TRACK);
2882 printk("buffer drive=%d\n", buffer_drive);
2883 printk("buffer track=%d\n", buffer_track);
2884 printk("buffer_min=%d\n", buffer_min);
2885 printk("buffer_max=%d\n", buffer_max);
2889 if (raw_cmd->kernel_data != current_req->buffer) {
2890 if (raw_cmd->kernel_data < floppy_track_buffer ||
2891 current_count_sectors < 0 ||
2892 raw_cmd->length < 0 ||
2893 raw_cmd->kernel_data + raw_cmd->length >
2894 floppy_track_buffer + (max_buffer_sectors << 10)) {
2895 DPRINT("buffer overrun in schedule dma\n");
2896 printk("fsector_t=%d buffer_min=%d current_count=%ld\n",
2897 fsector_t, buffer_min, raw_cmd->length >> 9);
2898 printk("current_count_sectors=%ld\n",
2899 current_count_sectors);
2900 if (CT(COMMAND) == FD_READ)
2902 if (CT(COMMAND) == FD_WRITE)
2906 } else if (raw_cmd->length > current_req->nr_sectors << 9 ||
2907 current_count_sectors > current_req->nr_sectors) {
2908 DPRINT("buffer overrun in direct transfer\n");
2910 } else if (raw_cmd->length < current_count_sectors << 9) {
2911 DPRINT("more sectors than bytes\n");
2912 printk("bytes=%ld\n", raw_cmd->length >> 9);
2913 printk("sectors=%ld\n", current_count_sectors);
2915 if (raw_cmd->length == 0) {
2916 DPRINT("zero dma transfer attempted from make_raw_request\n");
2921 virtualdmabug_workaround();
2925 static void redo_fd_request(void)
2927 #define REPEAT {request_done(0); continue; }
2932 if (current_drive < N_DRIVE)
2933 floppy_off(current_drive);
2937 struct request *req;
2939 spin_lock_irq(floppy_queue->queue_lock);
2940 req = elv_next_request(floppy_queue);
2941 spin_unlock_irq(floppy_queue->queue_lock);
2949 drive = (long)current_req->rq_disk->private_data;
2951 reschedule_timeout(current_reqD, "redo fd request", 0);
2954 raw_cmd = &default_raw_cmd;
2956 if (start_motor(redo_fd_request))
2958 disk_change(current_drive);
2959 if (test_bit(current_drive, &fake_change) ||
2960 TESTF(FD_DISK_CHANGED)) {
2961 DPRINT("disk absent or changed during operation\n");
2964 if (!_floppy) { /* Autodetection */
2966 DRS->probed_format = 0;
2967 if (next_valid_format()) {
2968 DPRINT("no autodetectable formats\n");
2975 floppy_type + DP->autodetect[DRS->probed_format];
2978 errors = &(current_req->errors);
2979 tmp = make_raw_rw_request();
2985 if (TESTF(FD_NEED_TWADDLE))
2987 schedule_bh(floppy_start);
2988 debugt("queue fd request");
2994 static struct cont_t rw_cont = {
2995 .interrupt = rw_interrupt,
2996 .redo = redo_fd_request,
2997 .error = bad_flp_intr,
2998 .done = request_done
3001 static void process_fd_request(void)
3004 schedule_bh(redo_fd_request);
3007 static void do_fd_request(request_queue_t * q)
3009 if (max_buffer_sectors == 0) {
3010 printk("VFS: do_fd_request called on non-open device\n");
3014 if (usage_count == 0) {
3015 printk("warning: usage count=0, current_req=%p exiting\n",
3017 printk("sect=%ld flags=%lx\n", (long)current_req->sector,
3018 current_req->flags);
3021 if (test_bit(0, &fdc_busy)) {
3022 /* fdc busy, this new request will be treated when the
3023 current one is done */
3024 is_alive("do fd request, old request running");
3027 lock_fdc(MAXTIMEOUT, 0);
3028 process_fd_request();
3029 is_alive("do fd request");
3032 static struct cont_t poll_cont = {
3033 .interrupt = success_and_wakeup,
3034 .redo = floppy_ready,
3035 .error = generic_failure,
3036 .done = generic_done
3039 static int poll_drive(int interruptible, int flag)
3042 /* no auto-sense, just clear dcl */
3043 raw_cmd = &default_raw_cmd;
3044 raw_cmd->flags = flag;
3046 raw_cmd->cmd_count = 0;
3049 if (DP->flags & FD_DEBUG) {
3050 DPRINT("setting NEWCHANGE in poll_drive\n");
3053 SETF(FD_DISK_NEWCHANGE);
3059 * User triggered reset
3060 * ====================
3063 static void reset_intr(void)
3065 printk("weird, reset interrupt called\n");
3068 static struct cont_t reset_cont = {
3069 .interrupt = reset_intr,
3070 .redo = success_and_wakeup,
3071 .error = generic_failure,
3072 .done = generic_done
3075 static int user_reset_fdc(int drive, int arg, int interruptible)
3080 LOCK_FDC(drive, interruptible);
3081 if (arg == FD_RESET_ALWAYS)
3087 process_fd_request();
3092 * Misc Ioctl's and support
3093 * ========================
3095 static inline int fd_copyout(void __user *param, const void *address,
3098 return copy_to_user(param, address, size) ? -EFAULT : 0;
3101 static inline int fd_copyin(void __user *param, void *address, unsigned long size)
3103 return copy_from_user(address, param, size) ? -EFAULT : 0;
3106 #define _COPYOUT(x) (copy_to_user((void __user *)param, &(x), sizeof(x)) ? -EFAULT : 0)
3107 #define _COPYIN(x) (copy_from_user(&(x), (void __user *)param, sizeof(x)) ? -EFAULT : 0)
3109 #define COPYOUT(x) ECALL(_COPYOUT(x))
3110 #define COPYIN(x) ECALL(_COPYIN(x))
3112 static inline const char *drive_name(int type, int drive)
3114 struct floppy_struct *floppy;
3117 floppy = floppy_type + type;
3119 if (UDP->native_format)
3120 floppy = floppy_type + UDP->native_format;
3125 return floppy->name;
3131 static void raw_cmd_done(int flag)
3136 raw_cmd->flags |= FD_RAW_FAILURE;
3137 raw_cmd->flags |= FD_RAW_HARDFAILURE;
3139 raw_cmd->reply_count = inr;
3140 if (raw_cmd->reply_count > MAX_REPLIES)
3141 raw_cmd->reply_count = 0;
3142 for (i = 0; i < raw_cmd->reply_count; i++)
3143 raw_cmd->reply[i] = reply_buffer[i];
3145 if (raw_cmd->flags & (FD_RAW_READ | FD_RAW_WRITE)) {
3146 unsigned long flags;
3147 flags = claim_dma_lock();
3148 raw_cmd->length = fd_get_dma_residue();
3149 release_dma_lock(flags);
3152 if ((raw_cmd->flags & FD_RAW_SOFTFAILURE) &&
3153 (!raw_cmd->reply_count || (raw_cmd->reply[0] & 0xc0)))
3154 raw_cmd->flags |= FD_RAW_FAILURE;
3156 if (disk_change(current_drive))
3157 raw_cmd->flags |= FD_RAW_DISK_CHANGE;
3159 raw_cmd->flags &= ~FD_RAW_DISK_CHANGE;
3160 if (raw_cmd->flags & FD_RAW_NO_MOTOR_AFTER)
3161 motor_off_callback(current_drive);
3163 if (raw_cmd->next &&
3164 (!(raw_cmd->flags & FD_RAW_FAILURE) ||
3165 !(raw_cmd->flags & FD_RAW_STOP_IF_FAILURE)) &&
3166 ((raw_cmd->flags & FD_RAW_FAILURE) ||
3167 !(raw_cmd->flags & FD_RAW_STOP_IF_SUCCESS))) {
3168 raw_cmd = raw_cmd->next;
3175 static struct cont_t raw_cmd_cont = {
3176 .interrupt = success_and_wakeup,
3177 .redo = floppy_start,
3178 .error = generic_failure,
3179 .done = raw_cmd_done
3182 static inline int raw_cmd_copyout(int cmd, char __user *param,
3183 struct floppy_raw_cmd *ptr)
3189 param += sizeof(struct floppy_raw_cmd);
3190 if ((ptr->flags & FD_RAW_READ) && ptr->buffer_length) {
3191 if (ptr->length >= 0
3192 && ptr->length <= ptr->buffer_length)
3194 (ptr->data, ptr->kernel_data,
3195 ptr->buffer_length - ptr->length));
3202 static void raw_cmd_free(struct floppy_raw_cmd **ptr)
3204 struct floppy_raw_cmd *next, *this;
3209 if (this->buffer_length) {
3210 fd_dma_mem_free((unsigned long)this->kernel_data,
3211 this->buffer_length);
3212 this->buffer_length = 0;
3220 static inline int raw_cmd_copyin(int cmd, char __user *param,
3221 struct floppy_raw_cmd **rcmd)
3223 struct floppy_raw_cmd *ptr;
3229 ptr = (struct floppy_raw_cmd *)
3230 kmalloc(sizeof(struct floppy_raw_cmd), GFP_USER);
3236 ptr->buffer_length = 0;
3237 param += sizeof(struct floppy_raw_cmd);
3238 if (ptr->cmd_count > 33)
3239 /* the command may now also take up the space
3240 * initially intended for the reply & the
3241 * reply count. Needed for long 82078 commands
3242 * such as RESTORE, which takes ... 17 command
3243 * bytes. Murphy's law #137: When you reserve
3244 * 16 bytes for a structure, you'll one day
3245 * discover that you really need 17...
3249 for (i = 0; i < 16; i++)
3251 ptr->resultcode = 0;
3252 ptr->kernel_data = NULL;
3254 if (ptr->flags & (FD_RAW_READ | FD_RAW_WRITE)) {
3255 if (ptr->length <= 0)
3258 (char *)fd_dma_mem_alloc(ptr->length);
3259 fallback_on_nodma_alloc(&ptr->kernel_data, ptr->length);
3260 if (!ptr->kernel_data)
3262 ptr->buffer_length = ptr->length;
3264 if (ptr->flags & FD_RAW_WRITE)
3265 ECALL(fd_copyin(ptr->data, ptr->kernel_data,
3267 rcmd = &(ptr->next);
3268 if (!(ptr->flags & FD_RAW_MORE))
3274 static int raw_cmd_ioctl(int cmd, void __user *param)
3276 int drive, ret, ret2;
3277 struct floppy_raw_cmd *my_raw_cmd;
3279 if (FDCS->rawcmd <= 1)
3281 for (drive = 0; drive < N_DRIVE; drive++) {
3282 if (FDC(drive) != fdc)
3284 if (drive == current_drive) {
3285 if (UDRS->fd_ref > 1) {
3289 } else if (UDRS->fd_ref) {
3298 ret = raw_cmd_copyin(cmd, param, &my_raw_cmd);
3300 raw_cmd_free(&my_raw_cmd);
3304 raw_cmd = my_raw_cmd;
3305 cont = &raw_cmd_cont;
3306 ret = wait_til_done(floppy_start, 1);
3308 if (DP->flags & FD_DEBUG) {
3309 DPRINT("calling disk change from raw_cmd ioctl\n");
3313 if (ret != -EINTR && FDCS->reset)
3316 DRS->track = NO_TRACK;
3318 ret2 = raw_cmd_copyout(cmd, param, my_raw_cmd);
3321 raw_cmd_free(&my_raw_cmd);
3325 static int invalidate_drive(struct block_device *bdev)
3327 /* invalidate the buffer track to force a reread */
3328 set_bit((long)bdev->bd_disk->private_data, &fake_change);
3329 process_fd_request();
3330 check_disk_change(bdev);
3334 static inline int set_geometry(unsigned int cmd, struct floppy_struct *g,
3335 int drive, int type, struct block_device *bdev)
3339 /* sanity checking for parameters. */
3342 g->track <= 0 || g->track > UDP->tracks >> STRETCH(g) ||
3343 /* check if reserved bits are set */
3344 (g->stretch & ~(FD_STRETCH | FD_SWAPSIDES | FD_ZEROBASED)) != 0)
3347 if (!capable(CAP_SYS_ADMIN))
3349 mutex_lock(&open_lock);
3351 floppy_type[type] = *g;
3352 floppy_type[type].name = "user format";
3353 for (cnt = type << 2; cnt < (type << 2) + 4; cnt++)
3354 floppy_sizes[cnt] = floppy_sizes[cnt + 0x80] =
3355 floppy_type[type].size + 1;
3356 process_fd_request();
3357 for (cnt = 0; cnt < N_DRIVE; cnt++) {
3358 struct block_device *bdev = opened_bdev[cnt];
3359 if (!bdev || ITYPE(drive_state[cnt].fd_device) != type)
3361 __invalidate_device(bdev);
3363 mutex_unlock(&open_lock);
3367 if (cmd != FDDEFPRM)
3368 /* notice a disk change immediately, else
3369 * we lose our settings immediately*/
3370 CALL(poll_drive(1, FD_RAW_NEED_DISK));
3371 oldStretch = g->stretch;
3372 user_params[drive] = *g;
3373 if (buffer_drive == drive)
3374 SUPBOUND(buffer_max, user_params[drive].sect);
3375 current_type[drive] = &user_params[drive];
3376 floppy_sizes[drive] = user_params[drive].size;
3377 if (cmd == FDDEFPRM)
3378 DRS->keep_data = -1;
3381 /* invalidation. Invalidate only when needed, i.e.
3382 * when there are already sectors in the buffer cache
3383 * whose number will change. This is useful, because
3384 * mtools often changes the geometry of the disk after
3385 * looking at the boot block */
3386 if (DRS->maxblock > user_params[drive].sect ||
3388 ((user_params[drive].sect ^ oldStretch) &
3389 (FD_SWAPSIDES | FD_ZEROBASED)))
3390 invalidate_drive(bdev);
3392 process_fd_request();
3397 /* handle obsolete ioctl's */
3398 static int ioctl_table[] = {
3426 static inline int normalize_ioctl(int *cmd, int *size)
3430 for (i = 0; i < ARRAY_SIZE(ioctl_table); i++) {
3431 if ((*cmd & 0xffff) == (ioctl_table[i] & 0xffff)) {
3432 *size = _IOC_SIZE(*cmd);
3433 *cmd = ioctl_table[i];
3434 if (*size > _IOC_SIZE(*cmd)) {
3435 printk("ioctl not yet supported\n");
3444 static int get_floppy_geometry(int drive, int type, struct floppy_struct **g)
3447 *g = &floppy_type[type];
3450 CALL(poll_drive(0, 0));
3451 process_fd_request();
3452 *g = current_type[drive];
3459 static int fd_getgeo(struct block_device *bdev, struct hd_geometry *geo)
3461 int drive = (long)bdev->bd_disk->private_data;
3462 int type = ITYPE(drive_state[drive].fd_device);
3463 struct floppy_struct *g;
3466 ret = get_floppy_geometry(drive, type, &g);
3470 geo->heads = g->head;
3471 geo->sectors = g->sect;
3472 geo->cylinders = g->track;
3476 static int fd_ioctl(struct inode *inode, struct file *filp, unsigned int cmd,
3477 unsigned long param)
3479 #define FD_IOCTL_ALLOWED ((filp) && (filp)->private_data)
3480 #define OUT(c,x) case c: outparam = (const char *) (x); break
3481 #define IN(c,x,tag) case c: *(x) = inparam. tag ; return 0
3483 int drive = (long)inode->i_bdev->bd_disk->private_data;
3484 int i, type = ITYPE(UDRS->fd_device);
3488 struct floppy_struct g; /* geometry */
3489 struct format_descr f;
3490 struct floppy_max_errors max_errors;
3491 struct floppy_drive_params dp;
3492 } inparam; /* parameters coming from user space */
3493 const char *outparam; /* parameters passed back to user space */
3495 /* convert compatibility eject ioctls into floppy eject ioctl.
3496 * We do this in order to provide a means to eject floppy disks before
3497 * installing the new fdutils package */
3498 if (cmd == CDROMEJECT || /* CD-ROM eject */
3499 cmd == 0x6470 /* SunOS floppy eject */ ) {
3500 DPRINT("obsolete eject ioctl\n");
3501 DPRINT("please use floppycontrol --eject\n");
3505 /* convert the old style command into a new style command */
3506 if ((cmd & 0xff00) == 0x0200) {
3507 ECALL(normalize_ioctl(&cmd, &size));
3511 /* permission checks */
3512 if (((cmd & 0x40) && !FD_IOCTL_ALLOWED) ||
3513 ((cmd & 0x80) && !capable(CAP_SYS_ADMIN)))
3517 CLEARSTRUCT(&inparam);
3518 if (_IOC_DIR(cmd) & _IOC_WRITE)
3519 ECALL(fd_copyin((void __user *)param, &inparam, size))
3523 if (UDRS->fd_ref != 1)
3524 /* somebody else has this drive open */
3528 /* do the actual eject. Fails on
3529 * non-Sparc architectures */
3530 ret = fd_eject(UNIT(drive));
3532 USETF(FD_DISK_CHANGED);
3534 process_fd_request();
3538 current_type[drive] = NULL;
3539 floppy_sizes[drive] = MAX_DISK_SIZE << 1;
3540 UDRS->keep_data = 0;
3541 return invalidate_drive(inode->i_bdev);
3544 return set_geometry(cmd, &inparam.g,
3545 drive, type, inode->i_bdev);
3547 ECALL(get_floppy_geometry(drive, type,
3548 (struct floppy_struct **)
3553 UDP->flags |= FTD_MSG;
3556 UDP->flags &= ~FTD_MSG;
3561 CALL(poll_drive(1, FD_RAW_NEED_DISK));
3563 process_fd_request();
3564 if (ret & FD_VERIFY)
3566 if (!(ret & FD_DISK_WRITABLE))
3570 if (UDRS->fd_ref != 1)
3572 return do_format(drive, &inparam.f);
3576 return invalidate_drive(inode->i_bdev);
3578 case FDSETEMSGTRESH:
3579 UDP->max_errors.reporting =
3580 (unsigned short)(param & 0x0f);
3582 OUT(FDGETMAXERRS, &UDP->max_errors);
3583 IN(FDSETMAXERRS, &UDP->max_errors, max_errors);
3586 outparam = drive_name(type, drive);
3587 SUPBOUND(size, strlen(outparam) + 1);
3590 IN(FDSETDRVPRM, UDP, dp);
3591 OUT(FDGETDRVPRM, UDP);
3595 CALL(poll_drive(1, FD_RAW_NEED_DISK));
3596 process_fd_request();
3598 OUT(FDGETDRVSTAT, UDRS);
3601 return user_reset_fdc(drive, (int)param, 1);
3603 OUT(FDGETFDCSTAT, UFDCS);
3608 OUT(FDWERRORGET, UDRWE);
3615 CALL(i = raw_cmd_ioctl(cmd, (void __user *)param));
3616 process_fd_request();
3622 process_fd_request();
3629 if (_IOC_DIR(cmd) & _IOC_READ)
3630 return fd_copyout((void __user *)param, outparam, size);
3637 static void __init config_types(void)
3642 /* read drive info out of physical CMOS */
3645 UDP->cmos = FLOPPY0_TYPE;
3647 if (!UDP->cmos && FLOPPY1_TYPE)
3648 UDP->cmos = FLOPPY1_TYPE;
3651 /* additional physical CMOS drive detection should go here */
3653 for (drive = 0; drive < N_DRIVE; drive++) {
3654 unsigned int type = UDP->cmos;
3655 struct floppy_drive_params *params;
3656 const char *name = NULL;
3657 static char temparea[32];
3659 if (type < ARRAY_SIZE(default_drive_params)) {
3660 params = &default_drive_params[type].params;
3662 name = default_drive_params[type].name;
3663 allowed_drive_mask |= 1 << drive;
3665 allowed_drive_mask &= ~(1 << drive);
3667 params = &default_drive_params[0].params;
3668 sprintf(temparea, "unknown type %d (usb?)", type);
3672 const char *prepend = ",";
3674 prepend = KERN_INFO "Floppy drive(s):";
3677 printk("%s fd%d is %s", prepend, drive, name);
3678 register_devfs_entries(drive);
3686 static int floppy_release(struct inode *inode, struct file *filp)
3688 int drive = (long)inode->i_bdev->bd_disk->private_data;
3690 mutex_lock(&open_lock);
3691 if (UDRS->fd_ref < 0)
3693 else if (!UDRS->fd_ref--) {
3694 DPRINT("floppy_release with fd_ref == 0");
3698 opened_bdev[drive] = NULL;
3699 floppy_release_irq_and_dma();
3700 mutex_unlock(&open_lock);
3705 * floppy_open check for aliasing (/dev/fd0 can be the same as
3706 * /dev/PS0 etc), and disallows simultaneous access to the same
3707 * drive with different device numbers.
3709 static int floppy_open(struct inode *inode, struct file *filp)
3711 int drive = (long)inode->i_bdev->bd_disk->private_data;
3717 filp->private_data = (void *)0;
3718 mutex_lock(&open_lock);
3719 old_dev = UDRS->fd_device;
3720 if (opened_bdev[drive] && opened_bdev[drive] != inode->i_bdev)
3723 if (!UDRS->fd_ref && (UDP->flags & FD_BROKEN_DCL)) {
3724 USETF(FD_DISK_CHANGED);
3728 if (UDRS->fd_ref == -1 || (UDRS->fd_ref && (filp->f_flags & O_EXCL)))
3731 if (floppy_grab_irq_and_dma())
3734 if (filp->f_flags & O_EXCL)
3739 opened_bdev[drive] = inode->i_bdev;
3743 if (!floppy_track_buffer) {
3744 /* if opening an ED drive, reserve a big buffer,
3745 * else reserve a small one */
3746 if ((UDP->cmos == 6) || (UDP->cmos == 5))
3747 try = 64; /* Only 48 actually useful */
3749 try = 32; /* Only 24 actually useful */
3751 tmp = (char *)fd_dma_mem_alloc(1024 * try);
3752 if (!tmp && !floppy_track_buffer) {
3753 try >>= 1; /* buffer only one side */
3755 tmp = (char *)fd_dma_mem_alloc(1024 * try);
3757 if (!tmp && !floppy_track_buffer) {
3758 fallback_on_nodma_alloc(&tmp, 2048 * try);
3760 if (!tmp && !floppy_track_buffer) {
3761 DPRINT("Unable to allocate DMA memory\n");
3764 if (floppy_track_buffer) {
3766 fd_dma_mem_free((unsigned long)tmp, try * 1024);
3768 buffer_min = buffer_max = -1;
3769 floppy_track_buffer = tmp;
3770 max_buffer_sectors = try;
3774 UDRS->fd_device = iminor(inode);
3775 set_capacity(disks[drive], floppy_sizes[iminor(inode)]);
3776 if (old_dev != -1 && old_dev != iminor(inode)) {
3777 if (buffer_drive == drive)
3781 /* Allow ioctls if we have write-permissions even if read-only open.
3782 * Needed so that programs such as fdrawcmd still can work on write
3783 * protected disks */
3784 if ((filp->f_mode & FMODE_WRITE) || !file_permission(filp, MAY_WRITE))
3785 filp->private_data = (void *)8;
3787 if (UFDCS->rawcmd == 1)
3790 if (!(filp->f_flags & O_NDELAY)) {
3791 if (filp->f_mode & 3) {
3792 UDRS->last_checked = 0;
3793 check_disk_change(inode->i_bdev);
3794 if (UTESTF(FD_DISK_CHANGED))
3798 if ((filp->f_mode & 2) && !(UTESTF(FD_DISK_WRITABLE)))
3801 mutex_unlock(&open_lock);
3804 if (UDRS->fd_ref < 0)
3809 opened_bdev[drive] = NULL;
3810 floppy_release_irq_and_dma();
3812 mutex_unlock(&open_lock);
3817 * Check if the disk has been changed or if a change has been faked.
3819 static int check_floppy_change(struct gendisk *disk)
3821 int drive = (long)disk->private_data;
3823 if (UTESTF(FD_DISK_CHANGED) || UTESTF(FD_VERIFY))
3826 if (UDP->checkfreq < (int)(jiffies - UDRS->last_checked)) {
3827 if (floppy_grab_irq_and_dma()) {
3833 process_fd_request();
3834 floppy_release_irq_and_dma();
3837 if (UTESTF(FD_DISK_CHANGED) ||
3838 UTESTF(FD_VERIFY) ||
3839 test_bit(drive, &fake_change) ||
3840 (!ITYPE(UDRS->fd_device) && !current_type[drive]))
3846 * This implements "read block 0" for floppy_revalidate().
3847 * Needed for format autodetection, checking whether there is
3848 * a disk in the drive, and whether that disk is writable.
3851 static int floppy_rb0_complete(struct bio *bio, unsigned int bytes_done,
3857 complete((struct completion *)bio->bi_private);
3861 static int __floppy_read_block_0(struct block_device *bdev)
3864 struct bio_vec bio_vec;
3865 struct completion complete;
3869 page = alloc_page(GFP_NOIO);
3871 process_fd_request();
3875 size = bdev->bd_block_size;
3880 bio.bi_io_vec = &bio_vec;
3881 bio_vec.bv_page = page;
3882 bio_vec.bv_len = size;
3883 bio_vec.bv_offset = 0;
3889 init_completion(&complete);
3890 bio.bi_private = &complete;
3891 bio.bi_end_io = floppy_rb0_complete;
3893 submit_bio(READ, &bio);
3894 generic_unplug_device(bdev_get_queue(bdev));
3895 process_fd_request();
3896 wait_for_completion(&complete);
3903 /* revalidate the floppy disk, i.e. trigger format autodetection by reading
3904 * the bootblock (block 0). "Autodetection" is also needed to check whether
3905 * there is a disk in the drive at all... Thus we also do it for fixed
3906 * geometry formats */
3907 static int floppy_revalidate(struct gendisk *disk)
3909 int drive = (long)disk->private_data;
3910 #define NO_GEOM (!current_type[drive] && !ITYPE(UDRS->fd_device))
3914 if (UTESTF(FD_DISK_CHANGED) ||
3915 UTESTF(FD_VERIFY) || test_bit(drive, &fake_change) || NO_GEOM) {
3916 if (usage_count == 0) {
3917 printk("VFS: revalidate called on non-open device.\n");
3921 cf = UTESTF(FD_DISK_CHANGED) || UTESTF(FD_VERIFY);
3922 if (!(cf || test_bit(drive, &fake_change) || NO_GEOM)) {
3923 process_fd_request(); /*already done by another thread */
3928 if (buffer_drive == drive)
3930 clear_bit(drive, &fake_change);
3931 UCLEARF(FD_DISK_CHANGED);
3936 res = __floppy_read_block_0(opened_bdev[drive]);
3939 poll_drive(0, FD_RAW_NEED_DISK);
3940 process_fd_request();
3943 set_capacity(disk, floppy_sizes[UDRS->fd_device]);
3947 static struct block_device_operations floppy_fops = {
3948 .owner = THIS_MODULE,
3949 .open = floppy_open,
3950 .release = floppy_release,
3952 .getgeo = fd_getgeo,
3953 .media_changed = check_floppy_change,
3954 .revalidate_disk = floppy_revalidate,
3956 static char *table[] = {
3957 "", "d360", "h1200", "u360", "u720", "h360", "h720",
3958 "u1440", "u2880", "CompaQ", "h1440", "u1680", "h410",
3959 "u820", "h1476", "u1722", "h420", "u830", "h1494", "u1743",
3960 "h880", "u1040", "u1120", "h1600", "u1760", "u1920",
3961 "u3200", "u3520", "u3840", "u1840", "u800", "u1600",
3964 static int t360[] = { 1, 0 },
3965 t1200[] = { 2, 5, 6, 10, 12, 14, 16, 18, 20, 23, 0 },
3966 t3in[] = { 8, 9, 26, 27, 28, 7, 11, 15, 19, 24, 25, 29, 31, 3, 4, 13,
3967 17, 21, 22, 30, 0 };
3968 static int *table_sup[] =
3969 { NULL, t360, t1200, t3in + 5 + 8, t3in + 5, t3in, t3in };
3971 static void __init register_devfs_entries(int drive)
3973 int base_minor = (drive < 4) ? drive : (124 + drive);
3975 if (UDP->cmos < ARRAY_SIZE(default_drive_params)) {
3978 int minor = base_minor + (table_sup[UDP->cmos][i] << 2);
3980 devfs_mk_bdev(MKDEV(FLOPPY_MAJOR, minor),
3981 S_IFBLK | S_IRUSR | S_IWUSR | S_IRGRP |
3982 S_IWGRP, "floppy/%d%s", drive,
3983 table[table_sup[UDP->cmos][i]]);
3984 } while (table_sup[UDP->cmos][i++]);
3989 * Floppy Driver initialization
3990 * =============================
3993 /* Determine the floppy disk controller type */
3994 /* This routine was written by David C. Niemi */
3995 static char __init get_fdc_version(void)
3999 output_byte(FD_DUMPREGS); /* 82072 and better know DUMPREGS */
4002 if ((r = result()) <= 0x00)
4003 return FDC_NONE; /* No FDC present ??? */
4004 if ((r == 1) && (reply_buffer[0] == 0x80)) {
4005 printk(KERN_INFO "FDC %d is an 8272A\n", fdc);
4006 return FDC_8272A; /* 8272a/765 don't know DUMPREGS */
4010 ("FDC %d init: DUMPREGS: unexpected return of %d bytes.\n",
4015 if (!fdc_configure()) {
4016 printk(KERN_INFO "FDC %d is an 82072\n", fdc);
4017 return FDC_82072; /* 82072 doesn't know CONFIGURE */
4020 output_byte(FD_PERPENDICULAR);
4021 if (need_more_output() == MORE_OUTPUT) {
4024 printk(KERN_INFO "FDC %d is an 82072A\n", fdc);
4025 return FDC_82072A; /* 82072A as found on Sparcs. */
4028 output_byte(FD_UNLOCK);
4030 if ((r == 1) && (reply_buffer[0] == 0x80)) {
4031 printk(KERN_INFO "FDC %d is a pre-1991 82077\n", fdc);
4032 return FDC_82077_ORIG; /* Pre-1991 82077, doesn't know
4035 if ((r != 1) || (reply_buffer[0] != 0x00)) {
4036 printk("FDC %d init: UNLOCK: unexpected return of %d bytes.\n",
4040 output_byte(FD_PARTID);
4043 printk("FDC %d init: PARTID: unexpected return of %d bytes.\n",
4047 if (reply_buffer[0] == 0x80) {
4048 printk(KERN_INFO "FDC %d is a post-1991 82077\n", fdc);
4049 return FDC_82077; /* Revised 82077AA passes all the tests */
4051 switch (reply_buffer[0] >> 5) {
4053 /* Either a 82078-1 or a 82078SL running at 5Volt */
4054 printk(KERN_INFO "FDC %d is an 82078.\n", fdc);
4057 printk(KERN_INFO "FDC %d is a 44pin 82078\n", fdc);
4060 printk(KERN_INFO "FDC %d is a S82078B\n", fdc);
4063 printk(KERN_INFO "FDC %d is a National Semiconductor PC87306\n",
4068 "FDC %d init: 82078 variant with unknown PARTID=%d.\n",
4069 fdc, reply_buffer[0] >> 5);
4070 return FDC_82078_UNKN;
4072 } /* get_fdc_version */
4074 /* lilo configuration */
4076 static void __init floppy_set_flags(int *ints, int param, int param2)
4080 for (i = 0; i < ARRAY_SIZE(default_drive_params); i++) {
4082 default_drive_params[i].params.flags |= param2;
4084 default_drive_params[i].params.flags &= ~param2;
4086 DPRINT("%s flag 0x%x\n", param2 ? "Setting" : "Clearing", param);
4089 static void __init daring(int *ints, int param, int param2)
4093 for (i = 0; i < ARRAY_SIZE(default_drive_params); i++) {
4095 default_drive_params[i].params.select_delay = 0;
4096 default_drive_params[i].params.flags |=
4097 FD_SILENT_DCL_CLEAR;
4099 default_drive_params[i].params.select_delay =
4101 default_drive_params[i].params.flags &=
4102 ~FD_SILENT_DCL_CLEAR;
4105 DPRINT("Assuming %s floppy hardware\n", param ? "standard" : "broken");
4108 static void __init set_cmos(int *ints, int dummy, int dummy2)
4110 int current_drive = 0;
4113 DPRINT("wrong number of parameters for CMOS\n");
4116 current_drive = ints[1];
4117 if (current_drive < 0 || current_drive >= 8) {
4118 DPRINT("bad drive for set_cmos\n");
4122 if (current_drive >= 4 && !FDC2)
4126 DPRINT("setting CMOS code to %d\n", ints[2]);
4129 static struct param_table {
4131 void (*fn) (int *ints, int param, int param2);
4135 } config_params[] __initdata = {
4136 {"allowed_drive_mask", NULL, &allowed_drive_mask, 0xff, 0}, /* obsolete */
4137 {"all_drives", NULL, &allowed_drive_mask, 0xff, 0}, /* obsolete */
4138 {"asus_pci", NULL, &allowed_drive_mask, 0x33, 0},
4139 {"irq", NULL, &FLOPPY_IRQ, 6, 0},
4140 {"dma", NULL, &FLOPPY_DMA, 2, 0},
4141 {"daring", daring, NULL, 1, 0},
4143 {"two_fdc", NULL, &FDC2, 0x370, 0},
4144 {"one_fdc", NULL, &FDC2, 0, 0},
4146 {"thinkpad", floppy_set_flags, NULL, 1, FD_INVERTED_DCL},
4147 {"broken_dcl", floppy_set_flags, NULL, 1, FD_BROKEN_DCL},
4148 {"messages", floppy_set_flags, NULL, 1, FTD_MSG},
4149 {"silent_dcl_clear", floppy_set_flags, NULL, 1, FD_SILENT_DCL_CLEAR},
4150 {"debug", floppy_set_flags, NULL, 1, FD_DEBUG},
4151 {"nodma", NULL, &can_use_virtual_dma, 1, 0},
4152 {"omnibook", NULL, &can_use_virtual_dma, 1, 0},
4153 {"yesdma", NULL, &can_use_virtual_dma, 0, 0},
4154 {"fifo_depth", NULL, &fifo_depth, 0xa, 0},
4155 {"nofifo", NULL, &no_fifo, 0x20, 0},
4156 {"usefifo", NULL, &no_fifo, 0, 0},
4157 {"cmos", set_cmos, NULL, 0, 0},
4158 {"slow", NULL, &slow_floppy, 1, 0},
4159 {"unexpected_interrupts", NULL, &print_unex, 1, 0},
4160 {"no_unexpected_interrupts", NULL, &print_unex, 0, 0},
4161 {"L40SX", NULL, &print_unex, 0, 0}
4166 static int __init floppy_setup(char *str)
4172 str = get_options(str, ARRAY_SIZE(ints), ints);
4174 for (i = 0; i < ARRAY_SIZE(config_params); i++) {
4175 if (strcmp(str, config_params[i].name) == 0) {
4179 param = config_params[i].def_param;
4180 if (config_params[i].fn)
4183 config_params[i].param2);
4184 if (config_params[i].var) {
4185 DPRINT("%s=%d\n", str, param);
4186 *config_params[i].var = param;
4193 DPRINT("unknown floppy option [%s]\n", str);
4195 DPRINT("allowed options are:");
4196 for (i = 0; i < ARRAY_SIZE(config_params); i++)
4197 printk(" %s", config_params[i].name);
4200 DPRINT("botched floppy option\n");
4201 DPRINT("Read Documentation/floppy.txt\n");
4205 static int have_no_fdc = -ENODEV;
4207 static ssize_t floppy_cmos_show(struct device *dev,
4208 struct device_attribute *attr, char *buf)
4210 struct platform_device *p;
4213 p = container_of(dev, struct platform_device,dev);
4215 return sprintf(buf, "%X\n", UDP->cmos);
4217 DEVICE_ATTR(cmos,S_IRUGO,floppy_cmos_show,NULL);
4219 static void floppy_device_release(struct device *dev)
4221 complete(&device_release);
4224 static struct platform_device floppy_device[N_DRIVE];
4226 static struct kobject *floppy_find(dev_t dev, int *part, void *data)
4228 int drive = (*part & 3) | ((*part & 0x80) >> 5);
4229 if (drive >= N_DRIVE ||
4230 !(allowed_drive_mask & (1 << drive)) ||
4231 fdc_state[FDC(drive)].version == FDC_NONE)
4233 if (((*part >> 2) & 0x1f) >= ARRAY_SIZE(floppy_type))
4236 return get_disk(disks[drive]);
4239 static int __init floppy_init(void)
4246 for (dr = 0; dr < N_DRIVE; dr++) {
4247 disks[dr] = alloc_disk(1);
4253 disks[dr]->major = FLOPPY_MAJOR;
4254 disks[dr]->first_minor = TOMINOR(dr);
4255 disks[dr]->fops = &floppy_fops;
4256 sprintf(disks[dr]->disk_name, "fd%d", dr);
4258 init_timer(&motor_off_timer[dr]);
4259 motor_off_timer[dr].data = dr;
4260 motor_off_timer[dr].function = motor_off_callback;
4263 devfs_mk_dir("floppy");
4265 err = register_blkdev(FLOPPY_MAJOR, "fd");
4267 goto out_devfs_remove;
4269 floppy_queue = blk_init_queue(do_fd_request, &floppy_lock);
4270 if (!floppy_queue) {
4272 goto out_unreg_blkdev;
4274 blk_queue_max_sectors(floppy_queue, 64);
4276 blk_register_region(MKDEV(FLOPPY_MAJOR, 0), 256, THIS_MODULE,
4277 floppy_find, NULL, NULL);
4279 for (i = 0; i < 256; i++)
4281 floppy_sizes[i] = floppy_type[ITYPE(i)].size;
4283 floppy_sizes[i] = MAX_DISK_SIZE << 1;
4285 reschedule_timeout(MAXTIMEOUT, "floppy init", MAXTIMEOUT);
4288 for (i = 0; i < N_FDC; i++) {
4293 #if defined(__sparc__) || defined(__mc68000__)
4294 /*sparcs/sun3x don't have a DOR reset which we can fall back on to */
4298 FDCS->version = FDC_82072A;
4302 use_virtual_dma = can_use_virtual_dma & 1;
4303 #if defined(CONFIG_PPC64)
4304 if (check_legacy_ioport(FDC1)) {
4305 del_timer(&fd_timeout);
4307 goto out_unreg_region;
4310 fdc_state[0].address = FDC1;
4311 if (fdc_state[0].address == -1) {
4312 del_timer(&fd_timeout);
4314 goto out_unreg_region;
4317 fdc_state[1].address = FDC2;
4320 fdc = 0; /* reset fdc in case of unexpected interrupt */
4321 err = floppy_grab_irq_and_dma();
4323 del_timer(&fd_timeout);
4325 goto out_unreg_region;
4328 /* initialise drive state */
4329 for (drive = 0; drive < N_DRIVE; drive++) {
4332 USETF(FD_DISK_NEWCHANGE);
4333 USETF(FD_DISK_CHANGED);
4335 UDRS->fd_device = -1;
4336 floppy_track_buffer = NULL;
4337 max_buffer_sectors = 0;
4340 * Small 10 msec delay to let through any interrupt that
4341 * initialization might have triggered, to not
4342 * confuse detection:
4346 for (i = 0; i < N_FDC; i++) {
4348 FDCS->driver_version = FD_DRIVER_VERSION;
4349 for (unit = 0; unit < 4; unit++)
4350 FDCS->track[unit] = 0;
4351 if (FDCS->address == -1)
4354 if (user_reset_fdc(-1, FD_RESET_ALWAYS, 0)) {
4355 /* free ioports reserved by floppy_grab_irq_and_dma() */
4356 release_region(FDCS->address + 2, 4);
4357 release_region(FDCS->address + 7, 1);
4359 FDCS->version = FDC_NONE;
4362 /* Try to determine the floppy controller type */
4363 FDCS->version = get_fdc_version();
4364 if (FDCS->version == FDC_NONE) {
4365 /* free ioports reserved by floppy_grab_irq_and_dma() */
4366 release_region(FDCS->address + 2, 4);
4367 release_region(FDCS->address + 7, 1);
4371 if (can_use_virtual_dma == 2 && FDCS->version < FDC_82072A)
4372 can_use_virtual_dma = 0;
4375 /* Not all FDCs seem to be able to handle the version command
4376 * properly, so force a reset for the standard FDC clones,
4377 * to avoid interrupt garbage.
4379 user_reset_fdc(-1, FD_RESET_ALWAYS, 0);
4382 del_timer(&fd_timeout);
4384 floppy_release_irq_and_dma();
4387 DPRINT("no floppy controllers found\n");
4389 goto out_flush_work;
4392 for (drive = 0; drive < N_DRIVE; drive++) {
4393 if (!(allowed_drive_mask & (1 << drive)))
4395 if (fdc_state[FDC(drive)].version == FDC_NONE)
4398 floppy_device[drive].name = floppy_device_name;
4399 floppy_device[drive].id = drive;
4400 floppy_device[drive].dev.release = floppy_device_release;
4402 err = platform_device_register(&floppy_device[drive]);
4404 goto out_flush_work;
4406 device_create_file(&floppy_device[drive].dev,&dev_attr_cmos);
4407 /* to be cleaned up... */
4408 disks[drive]->private_data = (void *)(long)drive;
4409 disks[drive]->queue = floppy_queue;
4410 disks[drive]->flags |= GENHD_FL_REMOVABLE;
4411 disks[drive]->driverfs_dev = &floppy_device[drive].dev;
4412 add_disk(disks[drive]);
4418 flush_scheduled_work();
4420 floppy_release_irq_and_dma();
4422 blk_unregister_region(MKDEV(FLOPPY_MAJOR, 0), 256);
4423 blk_cleanup_queue(floppy_queue);
4425 unregister_blkdev(FLOPPY_MAJOR, "fd");
4427 devfs_remove("floppy");
4430 del_timer(&motor_off_timer[dr]);
4431 put_disk(disks[dr]);
4436 static DEFINE_SPINLOCK(floppy_usage_lock);
4438 static int floppy_grab_irq_and_dma(void)
4440 unsigned long flags;
4442 spin_lock_irqsave(&floppy_usage_lock, flags);
4443 if (usage_count++) {
4444 spin_unlock_irqrestore(&floppy_usage_lock, flags);
4447 spin_unlock_irqrestore(&floppy_usage_lock, flags);
4450 * We might have scheduled a free_irq(), wait it to
4453 flush_scheduled_work();
4455 if (fd_request_irq()) {
4456 DPRINT("Unable to grab IRQ%d for the floppy driver\n",
4458 spin_lock_irqsave(&floppy_usage_lock, flags);
4460 spin_unlock_irqrestore(&floppy_usage_lock, flags);
4463 if (fd_request_dma()) {
4464 DPRINT("Unable to grab DMA%d for the floppy driver\n",
4467 spin_lock_irqsave(&floppy_usage_lock, flags);
4469 spin_unlock_irqrestore(&floppy_usage_lock, flags);
4473 for (fdc = 0; fdc < N_FDC; fdc++) {
4474 if (FDCS->address != -1) {
4475 if (!request_region(FDCS->address + 2, 4, "floppy")) {
4476 DPRINT("Floppy io-port 0x%04lx in use\n",
4480 if (!request_region(FDCS->address + 7, 1, "floppy DIR")) {
4481 DPRINT("Floppy io-port 0x%04lx in use\n",
4485 /* address + 6 is reserved, and may be taken by IDE.
4486 * Unfortunately, Adaptec doesn't know this :-(, */
4489 for (fdc = 0; fdc < N_FDC; fdc++) {
4490 if (FDCS->address != -1) {
4492 fd_outb(FDCS->dor, FD_DOR);
4496 set_dor(0, ~0, 8); /* avoid immediate interrupt */
4498 for (fdc = 0; fdc < N_FDC; fdc++)
4499 if (FDCS->address != -1)
4500 fd_outb(FDCS->dor, FD_DOR);
4502 * The driver will try and free resources and relies on us
4503 * to know if they were allocated or not.
4506 irqdma_allocated = 1;
4509 release_region(FDCS->address + 2, 4);
4513 while (--fdc >= 0) {
4514 release_region(FDCS->address + 2, 4);
4515 release_region(FDCS->address + 7, 1);
4517 spin_lock_irqsave(&floppy_usage_lock, flags);
4519 spin_unlock_irqrestore(&floppy_usage_lock, flags);
4523 static void floppy_release_irq_and_dma(void)
4526 #ifdef FLOPPY_SANITY_CHECK
4532 unsigned long tmpaddr;
4533 unsigned long flags;
4535 spin_lock_irqsave(&floppy_usage_lock, flags);
4536 if (--usage_count) {
4537 spin_unlock_irqrestore(&floppy_usage_lock, flags);
4540 spin_unlock_irqrestore(&floppy_usage_lock, flags);
4541 if (irqdma_allocated) {
4544 schedule_work(&fd_free_irq_work);
4545 irqdma_allocated = 0;
4551 floppy_enable_hlt();
4553 if (floppy_track_buffer && max_buffer_sectors) {
4554 tmpsize = max_buffer_sectors * 1024;
4555 tmpaddr = (unsigned long)floppy_track_buffer;
4556 floppy_track_buffer = NULL;
4557 max_buffer_sectors = 0;
4558 buffer_min = buffer_max = -1;
4559 fd_dma_mem_free(tmpaddr, tmpsize);
4561 #ifdef FLOPPY_SANITY_CHECK
4563 for (drive = 0; drive < N_FDC * 4; drive++)
4564 if (timer_pending(motor_off_timer + drive))
4565 printk("motor off timer %d still active\n", drive);
4568 if (timer_pending(&fd_timeout))
4569 printk("floppy timer still active:%s\n", timeout_message);
4570 if (timer_pending(&fd_timer))
4571 printk("auxiliary floppy timer still active\n");
4572 if (floppy_work.pending)
4573 printk("work still pending\n");
4576 for (fdc = 0; fdc < N_FDC; fdc++)
4577 if (FDCS->address != -1) {
4578 release_region(FDCS->address + 2, 4);
4579 release_region(FDCS->address + 7, 1);
4586 static char *floppy;
4588 static void unregister_devfs_entries(int drive)
4592 if (UDP->cmos < ARRAY_SIZE(default_drive_params)) {
4595 devfs_remove("floppy/%d%s", drive,
4596 table[table_sup[UDP->cmos][i]]);
4597 } while (table_sup[UDP->cmos][i++]);
4601 static void __init parse_floppy_cfg_string(char *cfg)
4606 for (ptr = cfg; *cfg && *cfg != ' ' && *cfg != '\t'; cfg++) ;
4616 int __init init_module(void)
4619 parse_floppy_cfg_string(floppy);
4620 return floppy_init();
4623 void cleanup_module(void)
4627 init_completion(&device_release);
4628 blk_unregister_region(MKDEV(FLOPPY_MAJOR, 0), 256);
4629 unregister_blkdev(FLOPPY_MAJOR, "fd");
4631 for (drive = 0; drive < N_DRIVE; drive++) {
4632 del_timer_sync(&motor_off_timer[drive]);
4634 if ((allowed_drive_mask & (1 << drive)) &&
4635 fdc_state[FDC(drive)].version != FDC_NONE) {
4636 del_gendisk(disks[drive]);
4637 unregister_devfs_entries(drive);
4638 device_remove_file(&floppy_device[drive].dev, &dev_attr_cmos);
4639 platform_device_unregister(&floppy_device[drive]);
4641 put_disk(disks[drive]);
4643 devfs_remove("floppy");
4645 del_timer_sync(&fd_timeout);
4646 del_timer_sync(&fd_timer);
4647 blk_cleanup_queue(floppy_queue);
4650 floppy_release_irq_and_dma();
4652 /* eject disk, if any */
4655 flush_scheduled_work(); /* fd_free_irq() might be pending */
4657 wait_for_completion(&device_release);
4660 module_param(floppy, charp, 0);
4661 module_param(FLOPPY_IRQ, int, 0);
4662 module_param(FLOPPY_DMA, int, 0);
4663 MODULE_AUTHOR("Alain L. Knaff");
4664 MODULE_SUPPORTED_DEVICE("fd");
4665 MODULE_LICENSE("GPL");
4669 __setup("floppy=", floppy_setup);
4670 module_init(floppy_init)
4673 MODULE_ALIAS_BLOCKDEV_MAJOR(FLOPPY_MAJOR);