Linux 2.6.17.7
[linux/fpc-iii.git] / drivers / block / floppy.c
blobdff1e67b1dd4e2768447ac92465caf8e1cceb97a
1 /*
2 * linux/drivers/block/floppy.c
4 * Copyright (C) 1991, 1992 Linus Torvalds
5 * Copyright (C) 1993, 1994 Alain Knaff
6 * Copyright (C) 1998 Alan Cox
7 */
8 /*
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
28 * etc.
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
45 * recording support.
47 * 1992/9/17: Added DMA allocation & DMA functions. -- hhb.
49 * TODO: Errors are still not counted properly.
52 /* 1992/9/20
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
65 * work.
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
73 * disk types.
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
112 * failures.
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
128 * - s/suser/capable/
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
151 #define DEBUGT 2
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>
162 #define FDPATCHES
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/jiffies.h>
174 #include <linux/fcntl.h>
175 #include <linux/delay.h>
176 #include <linux/mc146818rtc.h> /* CMOS defines */
177 #include <linux/ioport.h>
178 #include <linux/interrupt.h>
179 #include <linux/init.h>
180 #include <linux/devfs_fs_kernel.h>
181 #include <linux/platform_device.h>
182 #include <linux/buffer_head.h> /* for invalidate_buffers() */
183 #include <linux/mutex.h>
186 * PS/2 floppies have much slower step rates than regular floppies.
187 * It's been recommended that take about 1/4 of the default speed
188 * in some more extreme cases.
190 static int slow_floppy;
192 #include <asm/dma.h>
193 #include <asm/irq.h>
194 #include <asm/system.h>
195 #include <asm/io.h>
196 #include <asm/uaccess.h>
198 static int FLOPPY_IRQ = 6;
199 static int FLOPPY_DMA = 2;
200 static int can_use_virtual_dma = 2;
201 /* =======
202 * can use virtual DMA:
203 * 0 = use of virtual DMA disallowed by config
204 * 1 = use of virtual DMA prescribed by config
205 * 2 = no virtual DMA preference configured. By default try hard DMA,
206 * but fall back on virtual DMA when not enough memory available
209 static int use_virtual_dma;
210 /* =======
211 * use virtual DMA
212 * 0 using hard DMA
213 * 1 using virtual DMA
214 * This variable is set to virtual when a DMA mem problem arises, and
215 * reset back in floppy_grab_irq_and_dma.
216 * It is not safe to reset it in other circumstances, because the floppy
217 * driver may have several buffers in use at once, and we do currently not
218 * record each buffers capabilities
221 static DEFINE_SPINLOCK(floppy_lock);
222 static struct completion device_release;
224 static unsigned short virtual_dma_port = 0x3f0;
225 irqreturn_t floppy_interrupt(int irq, void *dev_id, struct pt_regs *regs);
226 static int set_dor(int fdc, char mask, char data);
227 static void register_devfs_entries(int drive) __init;
229 #define K_64 0x10000 /* 64KB */
231 /* the following is the mask of allowed drives. By default units 2 and
232 * 3 of both floppy controllers are disabled, because switching on the
233 * motor of these drives causes system hangs on some PCI computers. drive
234 * 0 is the low bit (0x1), and drive 7 is the high bit (0x80). Bits are on if
235 * a drive is allowed.
237 * NOTE: This must come before we include the arch floppy header because
238 * some ports reference this variable from there. -DaveM
241 static int allowed_drive_mask = 0x33;
243 #include <asm/floppy.h>
245 static int irqdma_allocated;
247 #define DEVICE_NAME "floppy"
249 #include <linux/blkdev.h>
250 #include <linux/blkpg.h>
251 #include <linux/cdrom.h> /* for the compatibility eject ioctl */
252 #include <linux/completion.h>
255 * Interrupt freeing also means /proc VFS work - dont do it
256 * from interrupt context. We push this work into keventd:
258 static void fd_free_irq_fn(void *data)
260 fd_free_irq();
263 static DECLARE_WORK(fd_free_irq_work, fd_free_irq_fn, NULL);
266 static struct request *current_req;
267 static struct request_queue *floppy_queue;
268 static void do_fd_request(request_queue_t * q);
270 #ifndef fd_get_dma_residue
271 #define fd_get_dma_residue() get_dma_residue(FLOPPY_DMA)
272 #endif
274 /* Dma Memory related stuff */
276 #ifndef fd_dma_mem_free
277 #define fd_dma_mem_free(addr, size) free_pages(addr, get_order(size))
278 #endif
280 #ifndef fd_dma_mem_alloc
281 #define fd_dma_mem_alloc(size) __get_dma_pages(GFP_KERNEL,get_order(size))
282 #endif
284 static inline void fallback_on_nodma_alloc(char **addr, size_t l)
286 #ifdef FLOPPY_CAN_FALLBACK_ON_NODMA
287 if (*addr)
288 return; /* we have the memory */
289 if (can_use_virtual_dma != 2)
290 return; /* no fallback allowed */
291 printk
292 ("DMA memory shortage. Temporarily falling back on virtual DMA\n");
293 *addr = (char *)nodma_mem_alloc(l);
294 #else
295 return;
296 #endif
299 /* End dma memory related stuff */
301 static unsigned long fake_change;
302 static int initialising = 1;
304 #define ITYPE(x) (((x)>>2) & 0x1f)
305 #define TOMINOR(x) ((x & 3) | ((x & 4) << 5))
306 #define UNIT(x) ((x) & 0x03) /* drive on fdc */
307 #define FDC(x) (((x) & 0x04) >> 2) /* fdc of drive */
308 #define REVDRIVE(fdc, unit) ((unit) + ((fdc) << 2))
309 /* reverse mapping from unit and fdc to drive */
310 #define DP (&drive_params[current_drive])
311 #define DRS (&drive_state[current_drive])
312 #define DRWE (&write_errors[current_drive])
313 #define FDCS (&fdc_state[fdc])
314 #define CLEARF(x) (clear_bit(x##_BIT, &DRS->flags))
315 #define SETF(x) (set_bit(x##_BIT, &DRS->flags))
316 #define TESTF(x) (test_bit(x##_BIT, &DRS->flags))
318 #define UDP (&drive_params[drive])
319 #define UDRS (&drive_state[drive])
320 #define UDRWE (&write_errors[drive])
321 #define UFDCS (&fdc_state[FDC(drive)])
322 #define UCLEARF(x) (clear_bit(x##_BIT, &UDRS->flags))
323 #define USETF(x) (set_bit(x##_BIT, &UDRS->flags))
324 #define UTESTF(x) (test_bit(x##_BIT, &UDRS->flags))
326 #define DPRINT(format, args...) printk(DEVICE_NAME "%d: " format, current_drive , ## args)
328 #define PH_HEAD(floppy,head) (((((floppy)->stretch & 2) >>1) ^ head) << 2)
329 #define STRETCH(floppy) ((floppy)->stretch & FD_STRETCH)
331 #define CLEARSTRUCT(x) memset((x), 0, sizeof(*(x)))
333 /* read/write */
334 #define COMMAND raw_cmd->cmd[0]
335 #define DR_SELECT raw_cmd->cmd[1]
336 #define TRACK raw_cmd->cmd[2]
337 #define HEAD raw_cmd->cmd[3]
338 #define SECTOR raw_cmd->cmd[4]
339 #define SIZECODE raw_cmd->cmd[5]
340 #define SECT_PER_TRACK raw_cmd->cmd[6]
341 #define GAP raw_cmd->cmd[7]
342 #define SIZECODE2 raw_cmd->cmd[8]
343 #define NR_RW 9
345 /* format */
346 #define F_SIZECODE raw_cmd->cmd[2]
347 #define F_SECT_PER_TRACK raw_cmd->cmd[3]
348 #define F_GAP raw_cmd->cmd[4]
349 #define F_FILL raw_cmd->cmd[5]
350 #define NR_F 6
353 * Maximum disk size (in kilobytes). This default is used whenever the
354 * current disk size is unknown.
355 * [Now it is rather a minimum]
357 #define MAX_DISK_SIZE 4 /* 3984 */
360 * globals used by 'result()'
362 #define MAX_REPLIES 16
363 static unsigned char reply_buffer[MAX_REPLIES];
364 static int inr; /* size of reply buffer, when called from interrupt */
365 #define ST0 (reply_buffer[0])
366 #define ST1 (reply_buffer[1])
367 #define ST2 (reply_buffer[2])
368 #define ST3 (reply_buffer[0]) /* result of GETSTATUS */
369 #define R_TRACK (reply_buffer[3])
370 #define R_HEAD (reply_buffer[4])
371 #define R_SECTOR (reply_buffer[5])
372 #define R_SIZECODE (reply_buffer[6])
374 #define SEL_DLY (2*HZ/100)
377 * this struct defines the different floppy drive types.
379 static struct {
380 struct floppy_drive_params params;
381 const char *name; /* name printed while booting */
382 } default_drive_params[] = {
383 /* NOTE: the time values in jiffies should be in msec!
384 CMOS drive type
385 | Maximum data rate supported by drive type
386 | | Head load time, msec
387 | | | Head unload time, msec (not used)
388 | | | | Step rate interval, usec
389 | | | | | Time needed for spinup time (jiffies)
390 | | | | | | Timeout for spinning down (jiffies)
391 | | | | | | | Spindown offset (where disk stops)
392 | | | | | | | | Select delay
393 | | | | | | | | | RPS
394 | | | | | | | | | | Max number of tracks
395 | | | | | | | | | | | Interrupt timeout
396 | | | | | | | | | | | | Max nonintlv. sectors
397 | | | | | | | | | | | | | -Max Errors- flags */
398 {{0, 500, 16, 16, 8000, 1*HZ, 3*HZ, 0, SEL_DLY, 5, 80, 3*HZ, 20, {3,1,2,0,2}, 0,
399 0, { 7, 4, 8, 2, 1, 5, 3,10}, 3*HZ/2, 0 }, "unknown" },
401 {{1, 300, 16, 16, 8000, 1*HZ, 3*HZ, 0, SEL_DLY, 5, 40, 3*HZ, 17, {3,1,2,0,2}, 0,
402 0, { 1, 0, 0, 0, 0, 0, 0, 0}, 3*HZ/2, 1 }, "360K PC" }, /*5 1/4 360 KB PC*/
404 {{2, 500, 16, 16, 6000, 4*HZ/10, 3*HZ, 14, SEL_DLY, 6, 83, 3*HZ, 17, {3,1,2,0,2}, 0,
405 0, { 2, 5, 6,23,10,20,12, 0}, 3*HZ/2, 2 }, "1.2M" }, /*5 1/4 HD AT*/
407 {{3, 250, 16, 16, 3000, 1*HZ, 3*HZ, 0, SEL_DLY, 5, 83, 3*HZ, 20, {3,1,2,0,2}, 0,
408 0, { 4,22,21,30, 3, 0, 0, 0}, 3*HZ/2, 4 }, "720k" }, /*3 1/2 DD*/
410 {{4, 500, 16, 16, 4000, 4*HZ/10, 3*HZ, 10, SEL_DLY, 5, 83, 3*HZ, 20, {3,1,2,0,2}, 0,
411 0, { 7, 4,25,22,31,21,29,11}, 3*HZ/2, 7 }, "1.44M" }, /*3 1/2 HD*/
413 {{5, 1000, 15, 8, 3000, 4*HZ/10, 3*HZ, 10, SEL_DLY, 5, 83, 3*HZ, 40, {3,1,2,0,2}, 0,
414 0, { 7, 8, 4,25,28,22,31,21}, 3*HZ/2, 8 }, "2.88M AMI BIOS" }, /*3 1/2 ED*/
416 {{6, 1000, 15, 8, 3000, 4*HZ/10, 3*HZ, 10, SEL_DLY, 5, 83, 3*HZ, 40, {3,1,2,0,2}, 0,
417 0, { 7, 8, 4,25,28,22,31,21}, 3*HZ/2, 8 }, "2.88M" } /*3 1/2 ED*/
418 /* | --autodetected formats--- | | |
419 * read_track | | Name printed when booting
420 * | Native format
421 * Frequency of disk change checks */
424 static struct floppy_drive_params drive_params[N_DRIVE];
425 static struct floppy_drive_struct drive_state[N_DRIVE];
426 static struct floppy_write_errors write_errors[N_DRIVE];
427 static struct timer_list motor_off_timer[N_DRIVE];
428 static struct gendisk *disks[N_DRIVE];
429 static struct block_device *opened_bdev[N_DRIVE];
430 static DEFINE_MUTEX(open_lock);
431 static struct floppy_raw_cmd *raw_cmd, default_raw_cmd;
434 * This struct defines the different floppy types.
436 * Bit 0 of 'stretch' tells if the tracks need to be doubled for some
437 * types (e.g. 360kB diskette in 1.2MB drive, etc.). Bit 1 of 'stretch'
438 * tells if the disk is in Commodore 1581 format, which means side 0 sectors
439 * are located on side 1 of the disk but with a side 0 ID, and vice-versa.
440 * This is the same as the Sharp MZ-80 5.25" CP/M disk format, except that the
441 * 1581's logical side 0 is on physical side 1, whereas the Sharp's logical
442 * side 0 is on physical side 0 (but with the misnamed sector IDs).
443 * 'stretch' should probably be renamed to something more general, like
444 * 'options'. Other parameters should be self-explanatory (see also
445 * setfdprm(8)).
448 Size
449 | Sectors per track
450 | | Head
451 | | | Tracks
452 | | | | Stretch
453 | | | | | Gap 1 size
454 | | | | | | Data rate, | 0x40 for perp
455 | | | | | | | Spec1 (stepping rate, head unload
456 | | | | | | | | /fmt gap (gap2) */
457 static struct floppy_struct floppy_type[32] = {
458 { 0, 0,0, 0,0,0x00,0x00,0x00,0x00,NULL }, /* 0 no testing */
459 { 720, 9,2,40,0,0x2A,0x02,0xDF,0x50,"d360" }, /* 1 360KB PC */
460 { 2400,15,2,80,0,0x1B,0x00,0xDF,0x54,"h1200" }, /* 2 1.2MB AT */
461 { 720, 9,1,80,0,0x2A,0x02,0xDF,0x50,"D360" }, /* 3 360KB SS 3.5" */
462 { 1440, 9,2,80,0,0x2A,0x02,0xDF,0x50,"D720" }, /* 4 720KB 3.5" */
463 { 720, 9,2,40,1,0x23,0x01,0xDF,0x50,"h360" }, /* 5 360KB AT */
464 { 1440, 9,2,80,0,0x23,0x01,0xDF,0x50,"h720" }, /* 6 720KB AT */
465 { 2880,18,2,80,0,0x1B,0x00,0xCF,0x6C,"H1440" }, /* 7 1.44MB 3.5" */
466 { 5760,36,2,80,0,0x1B,0x43,0xAF,0x54,"E2880" }, /* 8 2.88MB 3.5" */
467 { 6240,39,2,80,0,0x1B,0x43,0xAF,0x28,"E3120" }, /* 9 3.12MB 3.5" */
469 { 2880,18,2,80,0,0x25,0x00,0xDF,0x02,"h1440" }, /* 10 1.44MB 5.25" */
470 { 3360,21,2,80,0,0x1C,0x00,0xCF,0x0C,"H1680" }, /* 11 1.68MB 3.5" */
471 { 820,10,2,41,1,0x25,0x01,0xDF,0x2E,"h410" }, /* 12 410KB 5.25" */
472 { 1640,10,2,82,0,0x25,0x02,0xDF,0x2E,"H820" }, /* 13 820KB 3.5" */
473 { 2952,18,2,82,0,0x25,0x00,0xDF,0x02,"h1476" }, /* 14 1.48MB 5.25" */
474 { 3444,21,2,82,0,0x25,0x00,0xDF,0x0C,"H1722" }, /* 15 1.72MB 3.5" */
475 { 840,10,2,42,1,0x25,0x01,0xDF,0x2E,"h420" }, /* 16 420KB 5.25" */
476 { 1660,10,2,83,0,0x25,0x02,0xDF,0x2E,"H830" }, /* 17 830KB 3.5" */
477 { 2988,18,2,83,0,0x25,0x00,0xDF,0x02,"h1494" }, /* 18 1.49MB 5.25" */
478 { 3486,21,2,83,0,0x25,0x00,0xDF,0x0C,"H1743" }, /* 19 1.74 MB 3.5" */
480 { 1760,11,2,80,0,0x1C,0x09,0xCF,0x00,"h880" }, /* 20 880KB 5.25" */
481 { 2080,13,2,80,0,0x1C,0x01,0xCF,0x00,"D1040" }, /* 21 1.04MB 3.5" */
482 { 2240,14,2,80,0,0x1C,0x19,0xCF,0x00,"D1120" }, /* 22 1.12MB 3.5" */
483 { 3200,20,2,80,0,0x1C,0x20,0xCF,0x2C,"h1600" }, /* 23 1.6MB 5.25" */
484 { 3520,22,2,80,0,0x1C,0x08,0xCF,0x2e,"H1760" }, /* 24 1.76MB 3.5" */
485 { 3840,24,2,80,0,0x1C,0x20,0xCF,0x00,"H1920" }, /* 25 1.92MB 3.5" */
486 { 6400,40,2,80,0,0x25,0x5B,0xCF,0x00,"E3200" }, /* 26 3.20MB 3.5" */
487 { 7040,44,2,80,0,0x25,0x5B,0xCF,0x00,"E3520" }, /* 27 3.52MB 3.5" */
488 { 7680,48,2,80,0,0x25,0x63,0xCF,0x00,"E3840" }, /* 28 3.84MB 3.5" */
490 { 3680,23,2,80,0,0x1C,0x10,0xCF,0x00,"H1840" }, /* 29 1.84MB 3.5" */
491 { 1600,10,2,80,0,0x25,0x02,0xDF,0x2E,"D800" }, /* 30 800KB 3.5" */
492 { 3200,20,2,80,0,0x1C,0x00,0xCF,0x2C,"H1600" }, /* 31 1.6MB 3.5" */
495 #define SECTSIZE (_FD_SECTSIZE(*floppy))
497 /* Auto-detection: Disk type used until the next media change occurs. */
498 static struct floppy_struct *current_type[N_DRIVE];
501 * User-provided type information. current_type points to
502 * the respective entry of this array.
504 static struct floppy_struct user_params[N_DRIVE];
506 static sector_t floppy_sizes[256];
508 static char floppy_device_name[] = "floppy";
511 * The driver is trying to determine the correct media format
512 * while probing is set. rw_interrupt() clears it after a
513 * successful access.
515 static int probing;
517 /* Synchronization of FDC access. */
518 #define FD_COMMAND_NONE -1
519 #define FD_COMMAND_ERROR 2
520 #define FD_COMMAND_OKAY 3
522 static volatile int command_status = FD_COMMAND_NONE;
523 static unsigned long fdc_busy;
524 static DECLARE_WAIT_QUEUE_HEAD(fdc_wait);
525 static DECLARE_WAIT_QUEUE_HEAD(command_done);
527 #define NO_SIGNAL (!interruptible || !signal_pending(current))
528 #define CALL(x) if ((x) == -EINTR) return -EINTR
529 #define ECALL(x) if ((ret = (x))) return ret;
530 #define _WAIT(x,i) CALL(ret=wait_til_done((x),i))
531 #define WAIT(x) _WAIT((x),interruptible)
532 #define IWAIT(x) _WAIT((x),1)
534 /* Errors during formatting are counted here. */
535 static int format_errors;
537 /* Format request descriptor. */
538 static struct format_descr format_req;
541 * Rate is 0 for 500kb/s, 1 for 300kbps, 2 for 250kbps
542 * Spec1 is 0xSH, where S is stepping rate (F=1ms, E=2ms, D=3ms etc),
543 * H is head unload time (1=16ms, 2=32ms, etc)
547 * Track buffer
548 * Because these are written to by the DMA controller, they must
549 * not contain a 64k byte boundary crossing, or data will be
550 * corrupted/lost.
552 static char *floppy_track_buffer;
553 static int max_buffer_sectors;
555 static int *errors;
556 typedef void (*done_f) (int);
557 static struct cont_t {
558 void (*interrupt) (void); /* this is called after the interrupt of the
559 * main command */
560 void (*redo) (void); /* this is called to retry the operation */
561 void (*error) (void); /* this is called to tally an error */
562 done_f done; /* this is called to say if the operation has
563 * succeeded/failed */
564 } *cont;
566 static void floppy_ready(void);
567 static void floppy_start(void);
568 static void process_fd_request(void);
569 static void recalibrate_floppy(void);
570 static void floppy_shutdown(unsigned long);
572 static int floppy_grab_irq_and_dma(void);
573 static void floppy_release_irq_and_dma(void);
576 * The "reset" variable should be tested whenever an interrupt is scheduled,
577 * after the commands have been sent. This is to ensure that the driver doesn't
578 * get wedged when the interrupt doesn't come because of a failed command.
579 * reset doesn't need to be tested before sending commands, because
580 * output_byte is automatically disabled when reset is set.
582 #define CHECK_RESET { if (FDCS->reset){ reset_fdc(); return; } }
583 static void reset_fdc(void);
586 * These are global variables, as that's the easiest way to give
587 * information to interrupts. They are the data used for the current
588 * request.
590 #define NO_TRACK -1
591 #define NEED_1_RECAL -2
592 #define NEED_2_RECAL -3
594 static int usage_count;
596 /* buffer related variables */
597 static int buffer_track = -1;
598 static int buffer_drive = -1;
599 static int buffer_min = -1;
600 static int buffer_max = -1;
602 /* fdc related variables, should end up in a struct */
603 static struct floppy_fdc_state fdc_state[N_FDC];
604 static int fdc; /* current fdc */
606 static struct floppy_struct *_floppy = floppy_type;
607 static unsigned char current_drive;
608 static long current_count_sectors;
609 static unsigned char fsector_t; /* sector in track */
610 static unsigned char in_sector_offset; /* offset within physical sector,
611 * expressed in units of 512 bytes */
613 #ifndef fd_eject
614 static inline int fd_eject(int drive)
616 return -EINVAL;
618 #endif
621 * Debugging
622 * =========
624 #ifdef DEBUGT
625 static long unsigned debugtimer;
627 static inline void set_debugt(void)
629 debugtimer = jiffies;
632 static inline void debugt(const char *message)
634 if (DP->flags & DEBUGT)
635 printk("%s dtime=%lu\n", message, jiffies - debugtimer);
637 #else
638 static inline void set_debugt(void) { }
639 static inline void debugt(const char *message) { }
640 #endif /* DEBUGT */
642 typedef void (*timeout_fn) (unsigned long);
643 static DEFINE_TIMER(fd_timeout, floppy_shutdown, 0, 0);
645 static const char *timeout_message;
647 #ifdef FLOPPY_SANITY_CHECK
648 static void is_alive(const char *message)
650 /* this routine checks whether the floppy driver is "alive" */
651 if (test_bit(0, &fdc_busy) && command_status < 2
652 && !timer_pending(&fd_timeout)) {
653 DPRINT("timeout handler died: %s\n", message);
656 #endif
658 static void (*do_floppy) (void) = NULL;
660 #ifdef FLOPPY_SANITY_CHECK
662 #define OLOGSIZE 20
664 static void (*lasthandler) (void);
665 static unsigned long interruptjiffies;
666 static unsigned long resultjiffies;
667 static int resultsize;
668 static unsigned long lastredo;
670 static struct output_log {
671 unsigned char data;
672 unsigned char status;
673 unsigned long jiffies;
674 } output_log[OLOGSIZE];
676 static int output_log_pos;
677 #endif
679 #define current_reqD -1
680 #define MAXTIMEOUT -2
682 static void __reschedule_timeout(int drive, const char *message, int marg)
684 if (drive == current_reqD)
685 drive = current_drive;
686 del_timer(&fd_timeout);
687 if (drive < 0 || drive > N_DRIVE) {
688 fd_timeout.expires = jiffies + 20UL * HZ;
689 drive = 0;
690 } else
691 fd_timeout.expires = jiffies + UDP->timeout;
692 add_timer(&fd_timeout);
693 if (UDP->flags & FD_DEBUG) {
694 DPRINT("reschedule timeout ");
695 printk(message, marg);
696 printk("\n");
698 timeout_message = message;
701 static void reschedule_timeout(int drive, const char *message, int marg)
703 unsigned long flags;
705 spin_lock_irqsave(&floppy_lock, flags);
706 __reschedule_timeout(drive, message, marg);
707 spin_unlock_irqrestore(&floppy_lock, flags);
710 #define INFBOUND(a,b) (a)=max_t(int, a, b)
712 #define SUPBOUND(a,b) (a)=min_t(int, a, b)
715 * Bottom half floppy driver.
716 * ==========================
718 * This part of the file contains the code talking directly to the hardware,
719 * and also the main service loop (seek-configure-spinup-command)
723 * disk change.
724 * This routine is responsible for maintaining the FD_DISK_CHANGE flag,
725 * and the last_checked date.
727 * last_checked is the date of the last check which showed 'no disk change'
728 * FD_DISK_CHANGE is set under two conditions:
729 * 1. The floppy has been changed after some i/o to that floppy already
730 * took place.
731 * 2. No floppy disk is in the drive. This is done in order to ensure that
732 * requests are quickly flushed in case there is no disk in the drive. It
733 * follows that FD_DISK_CHANGE can only be cleared if there is a disk in
734 * the drive.
736 * For 1., maxblock is observed. Maxblock is 0 if no i/o has taken place yet.
737 * For 2., FD_DISK_NEWCHANGE is watched. FD_DISK_NEWCHANGE is cleared on
738 * each seek. If a disk is present, the disk change line should also be
739 * cleared on each seek. Thus, if FD_DISK_NEWCHANGE is clear, but the disk
740 * change line is set, this means either that no disk is in the drive, or
741 * that it has been removed since the last seek.
743 * This means that we really have a third possibility too:
744 * The floppy has been changed after the last seek.
747 static int disk_change(int drive)
749 int fdc = FDC(drive);
750 #ifdef FLOPPY_SANITY_CHECK
751 if (time_before(jiffies, UDRS->select_date + UDP->select_delay))
752 DPRINT("WARNING disk change called early\n");
753 if (!(FDCS->dor & (0x10 << UNIT(drive))) ||
754 (FDCS->dor & 3) != UNIT(drive) || fdc != FDC(drive)) {
755 DPRINT("probing disk change on unselected drive\n");
756 DPRINT("drive=%d fdc=%d dor=%x\n", drive, FDC(drive),
757 (unsigned int)FDCS->dor);
759 #endif
761 #ifdef DCL_DEBUG
762 if (UDP->flags & FD_DEBUG) {
763 DPRINT("checking disk change line for drive %d\n", drive);
764 DPRINT("jiffies=%lu\n", jiffies);
765 DPRINT("disk change line=%x\n", fd_inb(FD_DIR) & 0x80);
766 DPRINT("flags=%lx\n", UDRS->flags);
768 #endif
769 if (UDP->flags & FD_BROKEN_DCL)
770 return UTESTF(FD_DISK_CHANGED);
771 if ((fd_inb(FD_DIR) ^ UDP->flags) & 0x80) {
772 USETF(FD_VERIFY); /* verify write protection */
773 if (UDRS->maxblock) {
774 /* mark it changed */
775 USETF(FD_DISK_CHANGED);
778 /* invalidate its geometry */
779 if (UDRS->keep_data >= 0) {
780 if ((UDP->flags & FTD_MSG) &&
781 current_type[drive] != NULL)
782 DPRINT("Disk type is undefined after "
783 "disk change\n");
784 current_type[drive] = NULL;
785 floppy_sizes[TOMINOR(drive)] = MAX_DISK_SIZE << 1;
788 /*USETF(FD_DISK_NEWCHANGE); */
789 return 1;
790 } else {
791 UDRS->last_checked = jiffies;
792 UCLEARF(FD_DISK_NEWCHANGE);
794 return 0;
797 static inline int is_selected(int dor, int unit)
799 return ((dor & (0x10 << unit)) && (dor & 3) == unit);
802 static int set_dor(int fdc, char mask, char data)
804 register unsigned char drive, unit, newdor, olddor;
806 if (FDCS->address == -1)
807 return -1;
809 olddor = FDCS->dor;
810 newdor = (olddor & mask) | data;
811 if (newdor != olddor) {
812 unit = olddor & 0x3;
813 if (is_selected(olddor, unit) && !is_selected(newdor, unit)) {
814 drive = REVDRIVE(fdc, unit);
815 #ifdef DCL_DEBUG
816 if (UDP->flags & FD_DEBUG) {
817 DPRINT("calling disk change from set_dor\n");
819 #endif
820 disk_change(drive);
822 FDCS->dor = newdor;
823 fd_outb(newdor, FD_DOR);
825 unit = newdor & 0x3;
826 if (!is_selected(olddor, unit) && is_selected(newdor, unit)) {
827 drive = REVDRIVE(fdc, unit);
828 UDRS->select_date = jiffies;
832 * We should propagate failures to grab the resources back
833 * nicely from here. Actually we ought to rewrite the fd
834 * driver some day too.
836 if (newdor & FLOPPY_MOTOR_MASK)
837 floppy_grab_irq_and_dma();
838 if (olddor & FLOPPY_MOTOR_MASK)
839 floppy_release_irq_and_dma();
840 return olddor;
843 static void twaddle(void)
845 if (DP->select_delay)
846 return;
847 fd_outb(FDCS->dor & ~(0x10 << UNIT(current_drive)), FD_DOR);
848 fd_outb(FDCS->dor, FD_DOR);
849 DRS->select_date = jiffies;
852 /* reset all driver information about the current fdc. This is needed after
853 * a reset, and after a raw command. */
854 static void reset_fdc_info(int mode)
856 int drive;
858 FDCS->spec1 = FDCS->spec2 = -1;
859 FDCS->need_configure = 1;
860 FDCS->perp_mode = 1;
861 FDCS->rawcmd = 0;
862 for (drive = 0; drive < N_DRIVE; drive++)
863 if (FDC(drive) == fdc && (mode || UDRS->track != NEED_1_RECAL))
864 UDRS->track = NEED_2_RECAL;
867 /* selects the fdc and drive, and enables the fdc's input/dma. */
868 static void set_fdc(int drive)
870 if (drive >= 0 && drive < N_DRIVE) {
871 fdc = FDC(drive);
872 current_drive = drive;
874 if (fdc != 1 && fdc != 0) {
875 printk("bad fdc value\n");
876 return;
878 set_dor(fdc, ~0, 8);
879 #if N_FDC > 1
880 set_dor(1 - fdc, ~8, 0);
881 #endif
882 if (FDCS->rawcmd == 2)
883 reset_fdc_info(1);
884 if (fd_inb(FD_STATUS) != STATUS_READY)
885 FDCS->reset = 1;
888 /* locks the driver */
889 static int _lock_fdc(int drive, int interruptible, int line)
891 if (!usage_count) {
892 printk(KERN_ERR
893 "Trying to lock fdc while usage count=0 at line %d\n",
894 line);
895 return -1;
897 if (floppy_grab_irq_and_dma() == -1)
898 return -EBUSY;
900 if (test_and_set_bit(0, &fdc_busy)) {
901 DECLARE_WAITQUEUE(wait, current);
902 add_wait_queue(&fdc_wait, &wait);
904 for (;;) {
905 set_current_state(TASK_INTERRUPTIBLE);
907 if (!test_and_set_bit(0, &fdc_busy))
908 break;
910 schedule();
912 if (!NO_SIGNAL) {
913 remove_wait_queue(&fdc_wait, &wait);
914 return -EINTR;
918 set_current_state(TASK_RUNNING);
919 remove_wait_queue(&fdc_wait, &wait);
921 command_status = FD_COMMAND_NONE;
923 __reschedule_timeout(drive, "lock fdc", 0);
924 set_fdc(drive);
925 return 0;
928 #define lock_fdc(drive,interruptible) _lock_fdc(drive,interruptible, __LINE__)
930 #define LOCK_FDC(drive,interruptible) \
931 if (lock_fdc(drive,interruptible)) return -EINTR;
933 /* unlocks the driver */
934 static inline void unlock_fdc(void)
936 unsigned long flags;
938 raw_cmd = NULL;
939 if (!test_bit(0, &fdc_busy))
940 DPRINT("FDC access conflict!\n");
942 if (do_floppy)
943 DPRINT("device interrupt still active at FDC release: %p!\n",
944 do_floppy);
945 command_status = FD_COMMAND_NONE;
946 spin_lock_irqsave(&floppy_lock, flags);
947 del_timer(&fd_timeout);
948 cont = NULL;
949 clear_bit(0, &fdc_busy);
950 if (elv_next_request(floppy_queue))
951 do_fd_request(floppy_queue);
952 spin_unlock_irqrestore(&floppy_lock, flags);
953 floppy_release_irq_and_dma();
954 wake_up(&fdc_wait);
957 /* switches the motor off after a given timeout */
958 static void motor_off_callback(unsigned long nr)
960 unsigned char mask = ~(0x10 << UNIT(nr));
962 set_dor(FDC(nr), mask, 0);
965 /* schedules motor off */
966 static void floppy_off(unsigned int drive)
968 unsigned long volatile delta;
969 register int fdc = FDC(drive);
971 if (!(FDCS->dor & (0x10 << UNIT(drive))))
972 return;
974 del_timer(motor_off_timer + drive);
976 /* make spindle stop in a position which minimizes spinup time
977 * next time */
978 if (UDP->rps) {
979 delta = jiffies - UDRS->first_read_date + HZ -
980 UDP->spindown_offset;
981 delta = ((delta * UDP->rps) % HZ) / UDP->rps;
982 motor_off_timer[drive].expires =
983 jiffies + UDP->spindown - delta;
985 add_timer(motor_off_timer + drive);
989 * cycle through all N_DRIVE floppy drives, for disk change testing.
990 * stopping at current drive. This is done before any long operation, to
991 * be sure to have up to date disk change information.
993 static void scandrives(void)
995 int i, drive, saved_drive;
997 if (DP->select_delay)
998 return;
1000 saved_drive = current_drive;
1001 for (i = 0; i < N_DRIVE; i++) {
1002 drive = (saved_drive + i + 1) % N_DRIVE;
1003 if (UDRS->fd_ref == 0 || UDP->select_delay != 0)
1004 continue; /* skip closed drives */
1005 set_fdc(drive);
1006 if (!(set_dor(fdc, ~3, UNIT(drive) | (0x10 << UNIT(drive))) &
1007 (0x10 << UNIT(drive))))
1008 /* switch the motor off again, if it was off to
1009 * begin with */
1010 set_dor(fdc, ~(0x10 << UNIT(drive)), 0);
1012 set_fdc(saved_drive);
1015 static void empty(void)
1019 static DECLARE_WORK(floppy_work, NULL, NULL);
1021 static void schedule_bh(void (*handler) (void))
1023 PREPARE_WORK(&floppy_work, (void (*)(void *))handler, NULL);
1024 schedule_work(&floppy_work);
1027 static DEFINE_TIMER(fd_timer, NULL, 0, 0);
1029 static void cancel_activity(void)
1031 unsigned long flags;
1033 spin_lock_irqsave(&floppy_lock, flags);
1034 do_floppy = NULL;
1035 PREPARE_WORK(&floppy_work, (void *)empty, NULL);
1036 del_timer(&fd_timer);
1037 spin_unlock_irqrestore(&floppy_lock, flags);
1040 /* this function makes sure that the disk stays in the drive during the
1041 * transfer */
1042 static void fd_watchdog(void)
1044 #ifdef DCL_DEBUG
1045 if (DP->flags & FD_DEBUG) {
1046 DPRINT("calling disk change from watchdog\n");
1048 #endif
1050 if (disk_change(current_drive)) {
1051 DPRINT("disk removed during i/o\n");
1052 cancel_activity();
1053 cont->done(0);
1054 reset_fdc();
1055 } else {
1056 del_timer(&fd_timer);
1057 fd_timer.function = (timeout_fn) fd_watchdog;
1058 fd_timer.expires = jiffies + HZ / 10;
1059 add_timer(&fd_timer);
1063 static void main_command_interrupt(void)
1065 del_timer(&fd_timer);
1066 cont->interrupt();
1069 /* waits for a delay (spinup or select) to pass */
1070 static int fd_wait_for_completion(unsigned long delay, timeout_fn function)
1072 if (FDCS->reset) {
1073 reset_fdc(); /* do the reset during sleep to win time
1074 * if we don't need to sleep, it's a good
1075 * occasion anyways */
1076 return 1;
1079 if (time_before(jiffies, delay)) {
1080 del_timer(&fd_timer);
1081 fd_timer.function = function;
1082 fd_timer.expires = delay;
1083 add_timer(&fd_timer);
1084 return 1;
1086 return 0;
1089 static DEFINE_SPINLOCK(floppy_hlt_lock);
1090 static int hlt_disabled;
1091 static void floppy_disable_hlt(void)
1093 unsigned long flags;
1095 spin_lock_irqsave(&floppy_hlt_lock, flags);
1096 if (!hlt_disabled) {
1097 hlt_disabled = 1;
1098 #ifdef HAVE_DISABLE_HLT
1099 disable_hlt();
1100 #endif
1102 spin_unlock_irqrestore(&floppy_hlt_lock, flags);
1105 static void floppy_enable_hlt(void)
1107 unsigned long flags;
1109 spin_lock_irqsave(&floppy_hlt_lock, flags);
1110 if (hlt_disabled) {
1111 hlt_disabled = 0;
1112 #ifdef HAVE_DISABLE_HLT
1113 enable_hlt();
1114 #endif
1116 spin_unlock_irqrestore(&floppy_hlt_lock, flags);
1119 static void setup_DMA(void)
1121 unsigned long f;
1123 #ifdef FLOPPY_SANITY_CHECK
1124 if (raw_cmd->length == 0) {
1125 int i;
1127 printk("zero dma transfer size:");
1128 for (i = 0; i < raw_cmd->cmd_count; i++)
1129 printk("%x,", raw_cmd->cmd[i]);
1130 printk("\n");
1131 cont->done(0);
1132 FDCS->reset = 1;
1133 return;
1135 if (((unsigned long)raw_cmd->kernel_data) % 512) {
1136 printk("non aligned address: %p\n", raw_cmd->kernel_data);
1137 cont->done(0);
1138 FDCS->reset = 1;
1139 return;
1141 #endif
1142 f = claim_dma_lock();
1143 fd_disable_dma();
1144 #ifdef fd_dma_setup
1145 if (fd_dma_setup(raw_cmd->kernel_data, raw_cmd->length,
1146 (raw_cmd->flags & FD_RAW_READ) ?
1147 DMA_MODE_READ : DMA_MODE_WRITE, FDCS->address) < 0) {
1148 release_dma_lock(f);
1149 cont->done(0);
1150 FDCS->reset = 1;
1151 return;
1153 release_dma_lock(f);
1154 #else
1155 fd_clear_dma_ff();
1156 fd_cacheflush(raw_cmd->kernel_data, raw_cmd->length);
1157 fd_set_dma_mode((raw_cmd->flags & FD_RAW_READ) ?
1158 DMA_MODE_READ : DMA_MODE_WRITE);
1159 fd_set_dma_addr(raw_cmd->kernel_data);
1160 fd_set_dma_count(raw_cmd->length);
1161 virtual_dma_port = FDCS->address;
1162 fd_enable_dma();
1163 release_dma_lock(f);
1164 #endif
1165 floppy_disable_hlt();
1168 static void show_floppy(void);
1170 /* waits until the fdc becomes ready */
1171 static int wait_til_ready(void)
1173 int counter, status;
1174 if (FDCS->reset)
1175 return -1;
1176 for (counter = 0; counter < 10000; counter++) {
1177 status = fd_inb(FD_STATUS);
1178 if (status & STATUS_READY)
1179 return status;
1181 if (!initialising) {
1182 DPRINT("Getstatus times out (%x) on fdc %d\n", status, fdc);
1183 show_floppy();
1185 FDCS->reset = 1;
1186 return -1;
1189 /* sends a command byte to the fdc */
1190 static int output_byte(char byte)
1192 int status;
1194 if ((status = wait_til_ready()) < 0)
1195 return -1;
1196 if ((status & (STATUS_READY | STATUS_DIR | STATUS_DMA)) == STATUS_READY) {
1197 fd_outb(byte, FD_DATA);
1198 #ifdef FLOPPY_SANITY_CHECK
1199 output_log[output_log_pos].data = byte;
1200 output_log[output_log_pos].status = status;
1201 output_log[output_log_pos].jiffies = jiffies;
1202 output_log_pos = (output_log_pos + 1) % OLOGSIZE;
1203 #endif
1204 return 0;
1206 FDCS->reset = 1;
1207 if (!initialising) {
1208 DPRINT("Unable to send byte %x to FDC. Fdc=%x Status=%x\n",
1209 byte, fdc, status);
1210 show_floppy();
1212 return -1;
1215 #define LAST_OUT(x) if (output_byte(x)<0){ reset_fdc();return;}
1217 /* gets the response from the fdc */
1218 static int result(void)
1220 int i, status = 0;
1222 for (i = 0; i < MAX_REPLIES; i++) {
1223 if ((status = wait_til_ready()) < 0)
1224 break;
1225 status &= STATUS_DIR | STATUS_READY | STATUS_BUSY | STATUS_DMA;
1226 if ((status & ~STATUS_BUSY) == STATUS_READY) {
1227 #ifdef FLOPPY_SANITY_CHECK
1228 resultjiffies = jiffies;
1229 resultsize = i;
1230 #endif
1231 return i;
1233 if (status == (STATUS_DIR | STATUS_READY | STATUS_BUSY))
1234 reply_buffer[i] = fd_inb(FD_DATA);
1235 else
1236 break;
1238 if (!initialising) {
1239 DPRINT
1240 ("get result error. Fdc=%d Last status=%x Read bytes=%d\n",
1241 fdc, status, i);
1242 show_floppy();
1244 FDCS->reset = 1;
1245 return -1;
1248 #define MORE_OUTPUT -2
1249 /* does the fdc need more output? */
1250 static int need_more_output(void)
1252 int status;
1253 if ((status = wait_til_ready()) < 0)
1254 return -1;
1255 if ((status & (STATUS_READY | STATUS_DIR | STATUS_DMA)) == STATUS_READY)
1256 return MORE_OUTPUT;
1257 return result();
1260 /* Set perpendicular mode as required, based on data rate, if supported.
1261 * 82077 Now tested. 1Mbps data rate only possible with 82077-1.
1263 static inline void perpendicular_mode(void)
1265 unsigned char perp_mode;
1267 if (raw_cmd->rate & 0x40) {
1268 switch (raw_cmd->rate & 3) {
1269 case 0:
1270 perp_mode = 2;
1271 break;
1272 case 3:
1273 perp_mode = 3;
1274 break;
1275 default:
1276 DPRINT("Invalid data rate for perpendicular mode!\n");
1277 cont->done(0);
1278 FDCS->reset = 1; /* convenient way to return to
1279 * redo without to much hassle (deep
1280 * stack et al. */
1281 return;
1283 } else
1284 perp_mode = 0;
1286 if (FDCS->perp_mode == perp_mode)
1287 return;
1288 if (FDCS->version >= FDC_82077_ORIG) {
1289 output_byte(FD_PERPENDICULAR);
1290 output_byte(perp_mode);
1291 FDCS->perp_mode = perp_mode;
1292 } else if (perp_mode) {
1293 DPRINT("perpendicular mode not supported by this FDC.\n");
1295 } /* perpendicular_mode */
1297 static int fifo_depth = 0xa;
1298 static int no_fifo;
1300 static int fdc_configure(void)
1302 /* Turn on FIFO */
1303 output_byte(FD_CONFIGURE);
1304 if (need_more_output() != MORE_OUTPUT)
1305 return 0;
1306 output_byte(0);
1307 output_byte(0x10 | (no_fifo & 0x20) | (fifo_depth & 0xf));
1308 output_byte(0); /* pre-compensation from track
1309 0 upwards */
1310 return 1;
1313 #define NOMINAL_DTR 500
1315 /* Issue a "SPECIFY" command to set the step rate time, head unload time,
1316 * head load time, and DMA disable flag to values needed by floppy.
1318 * The value "dtr" is the data transfer rate in Kbps. It is needed
1319 * to account for the data rate-based scaling done by the 82072 and 82077
1320 * FDC types. This parameter is ignored for other types of FDCs (i.e.
1321 * 8272a).
1323 * Note that changing the data transfer rate has a (probably deleterious)
1324 * effect on the parameters subject to scaling for 82072/82077 FDCs, so
1325 * fdc_specify is called again after each data transfer rate
1326 * change.
1328 * srt: 1000 to 16000 in microseconds
1329 * hut: 16 to 240 milliseconds
1330 * hlt: 2 to 254 milliseconds
1332 * These values are rounded up to the next highest available delay time.
1334 static void fdc_specify(void)
1336 unsigned char spec1, spec2;
1337 unsigned long srt, hlt, hut;
1338 unsigned long dtr = NOMINAL_DTR;
1339 unsigned long scale_dtr = NOMINAL_DTR;
1340 int hlt_max_code = 0x7f;
1341 int hut_max_code = 0xf;
1343 if (FDCS->need_configure && FDCS->version >= FDC_82072A) {
1344 fdc_configure();
1345 FDCS->need_configure = 0;
1346 /*DPRINT("FIFO enabled\n"); */
1349 switch (raw_cmd->rate & 0x03) {
1350 case 3:
1351 dtr = 1000;
1352 break;
1353 case 1:
1354 dtr = 300;
1355 if (FDCS->version >= FDC_82078) {
1356 /* chose the default rate table, not the one
1357 * where 1 = 2 Mbps */
1358 output_byte(FD_DRIVESPEC);
1359 if (need_more_output() == MORE_OUTPUT) {
1360 output_byte(UNIT(current_drive));
1361 output_byte(0xc0);
1364 break;
1365 case 2:
1366 dtr = 250;
1367 break;
1370 if (FDCS->version >= FDC_82072) {
1371 scale_dtr = dtr;
1372 hlt_max_code = 0x00; /* 0==256msec*dtr0/dtr (not linear!) */
1373 hut_max_code = 0x0; /* 0==256msec*dtr0/dtr (not linear!) */
1376 /* Convert step rate from microseconds to milliseconds and 4 bits */
1377 srt = 16 - (DP->srt * scale_dtr / 1000 + NOMINAL_DTR - 1) / NOMINAL_DTR;
1378 if (slow_floppy) {
1379 srt = srt / 4;
1381 SUPBOUND(srt, 0xf);
1382 INFBOUND(srt, 0);
1384 hlt = (DP->hlt * scale_dtr / 2 + NOMINAL_DTR - 1) / NOMINAL_DTR;
1385 if (hlt < 0x01)
1386 hlt = 0x01;
1387 else if (hlt > 0x7f)
1388 hlt = hlt_max_code;
1390 hut = (DP->hut * scale_dtr / 16 + NOMINAL_DTR - 1) / NOMINAL_DTR;
1391 if (hut < 0x1)
1392 hut = 0x1;
1393 else if (hut > 0xf)
1394 hut = hut_max_code;
1396 spec1 = (srt << 4) | hut;
1397 spec2 = (hlt << 1) | (use_virtual_dma & 1);
1399 /* If these parameters did not change, just return with success */
1400 if (FDCS->spec1 != spec1 || FDCS->spec2 != spec2) {
1401 /* Go ahead and set spec1 and spec2 */
1402 output_byte(FD_SPECIFY);
1403 output_byte(FDCS->spec1 = spec1);
1404 output_byte(FDCS->spec2 = spec2);
1406 } /* fdc_specify */
1408 /* Set the FDC's data transfer rate on behalf of the specified drive.
1409 * NOTE: with 82072/82077 FDCs, changing the data rate requires a reissue
1410 * of the specify command (i.e. using the fdc_specify function).
1412 static int fdc_dtr(void)
1414 /* If data rate not already set to desired value, set it. */
1415 if ((raw_cmd->rate & 3) == FDCS->dtr)
1416 return 0;
1418 /* Set dtr */
1419 fd_outb(raw_cmd->rate & 3, FD_DCR);
1421 /* TODO: some FDC/drive combinations (C&T 82C711 with TEAC 1.2MB)
1422 * need a stabilization period of several milliseconds to be
1423 * enforced after data rate changes before R/W operations.
1424 * Pause 5 msec to avoid trouble. (Needs to be 2 jiffies)
1426 FDCS->dtr = raw_cmd->rate & 3;
1427 return (fd_wait_for_completion(jiffies + 2UL * HZ / 100,
1428 (timeout_fn) floppy_ready));
1429 } /* fdc_dtr */
1431 static void tell_sector(void)
1433 printk(": track %d, head %d, sector %d, size %d",
1434 R_TRACK, R_HEAD, R_SECTOR, R_SIZECODE);
1435 } /* tell_sector */
1438 * OK, this error interpreting routine is called after a
1439 * DMA read/write has succeeded
1440 * or failed, so we check the results, and copy any buffers.
1441 * hhb: Added better error reporting.
1442 * ak: Made this into a separate routine.
1444 static int interpret_errors(void)
1446 char bad;
1448 if (inr != 7) {
1449 DPRINT("-- FDC reply error");
1450 FDCS->reset = 1;
1451 return 1;
1454 /* check IC to find cause of interrupt */
1455 switch (ST0 & ST0_INTR) {
1456 case 0x40: /* error occurred during command execution */
1457 if (ST1 & ST1_EOC)
1458 return 0; /* occurs with pseudo-DMA */
1459 bad = 1;
1460 if (ST1 & ST1_WP) {
1461 DPRINT("Drive is write protected\n");
1462 CLEARF(FD_DISK_WRITABLE);
1463 cont->done(0);
1464 bad = 2;
1465 } else if (ST1 & ST1_ND) {
1466 SETF(FD_NEED_TWADDLE);
1467 } else if (ST1 & ST1_OR) {
1468 if (DP->flags & FTD_MSG)
1469 DPRINT("Over/Underrun - retrying\n");
1470 bad = 0;
1471 } else if (*errors >= DP->max_errors.reporting) {
1472 DPRINT("");
1473 if (ST0 & ST0_ECE) {
1474 printk("Recalibrate failed!");
1475 } else if (ST2 & ST2_CRC) {
1476 printk("data CRC error");
1477 tell_sector();
1478 } else if (ST1 & ST1_CRC) {
1479 printk("CRC error");
1480 tell_sector();
1481 } else if ((ST1 & (ST1_MAM | ST1_ND))
1482 || (ST2 & ST2_MAM)) {
1483 if (!probing) {
1484 printk("sector not found");
1485 tell_sector();
1486 } else
1487 printk("probe failed...");
1488 } else if (ST2 & ST2_WC) { /* seek error */
1489 printk("wrong cylinder");
1490 } else if (ST2 & ST2_BC) { /* cylinder marked as bad */
1491 printk("bad cylinder");
1492 } else {
1493 printk
1494 ("unknown error. ST[0..2] are: 0x%x 0x%x 0x%x",
1495 ST0, ST1, ST2);
1496 tell_sector();
1498 printk("\n");
1501 if (ST2 & ST2_WC || ST2 & ST2_BC)
1502 /* wrong cylinder => recal */
1503 DRS->track = NEED_2_RECAL;
1504 return bad;
1505 case 0x80: /* invalid command given */
1506 DPRINT("Invalid FDC command given!\n");
1507 cont->done(0);
1508 return 2;
1509 case 0xc0:
1510 DPRINT("Abnormal termination caused by polling\n");
1511 cont->error();
1512 return 2;
1513 default: /* (0) Normal command termination */
1514 return 0;
1519 * This routine is called when everything should be correctly set up
1520 * for the transfer (i.e. floppy motor is on, the correct floppy is
1521 * selected, and the head is sitting on the right track).
1523 static void setup_rw_floppy(void)
1525 int i, r, flags, dflags;
1526 unsigned long ready_date;
1527 timeout_fn function;
1529 flags = raw_cmd->flags;
1530 if (flags & (FD_RAW_READ | FD_RAW_WRITE))
1531 flags |= FD_RAW_INTR;
1533 if ((flags & FD_RAW_SPIN) && !(flags & FD_RAW_NO_MOTOR)) {
1534 ready_date = DRS->spinup_date + DP->spinup;
1535 /* If spinup will take a long time, rerun scandrives
1536 * again just before spinup completion. Beware that
1537 * after scandrives, we must again wait for selection.
1539 if (time_after(ready_date, jiffies + DP->select_delay)) {
1540 ready_date -= DP->select_delay;
1541 function = (timeout_fn) floppy_start;
1542 } else
1543 function = (timeout_fn) setup_rw_floppy;
1545 /* wait until the floppy is spinning fast enough */
1546 if (fd_wait_for_completion(ready_date, function))
1547 return;
1549 dflags = DRS->flags;
1551 if ((flags & FD_RAW_READ) || (flags & FD_RAW_WRITE))
1552 setup_DMA();
1554 if (flags & FD_RAW_INTR)
1555 do_floppy = main_command_interrupt;
1557 r = 0;
1558 for (i = 0; i < raw_cmd->cmd_count; i++)
1559 r |= output_byte(raw_cmd->cmd[i]);
1561 debugt("rw_command: ");
1563 if (r) {
1564 cont->error();
1565 reset_fdc();
1566 return;
1569 if (!(flags & FD_RAW_INTR)) {
1570 inr = result();
1571 cont->interrupt();
1572 } else if (flags & FD_RAW_NEED_DISK)
1573 fd_watchdog();
1576 static int blind_seek;
1579 * This is the routine called after every seek (or recalibrate) interrupt
1580 * from the floppy controller.
1582 static void seek_interrupt(void)
1584 debugt("seek interrupt:");
1585 if (inr != 2 || (ST0 & 0xF8) != 0x20) {
1586 DPRINT("seek failed\n");
1587 DRS->track = NEED_2_RECAL;
1588 cont->error();
1589 cont->redo();
1590 return;
1592 if (DRS->track >= 0 && DRS->track != ST1 && !blind_seek) {
1593 #ifdef DCL_DEBUG
1594 if (DP->flags & FD_DEBUG) {
1595 DPRINT
1596 ("clearing NEWCHANGE flag because of effective seek\n");
1597 DPRINT("jiffies=%lu\n", jiffies);
1599 #endif
1600 CLEARF(FD_DISK_NEWCHANGE); /* effective seek */
1601 DRS->select_date = jiffies;
1603 DRS->track = ST1;
1604 floppy_ready();
1607 static void check_wp(void)
1609 if (TESTF(FD_VERIFY)) {
1610 /* check write protection */
1611 output_byte(FD_GETSTATUS);
1612 output_byte(UNIT(current_drive));
1613 if (result() != 1) {
1614 FDCS->reset = 1;
1615 return;
1617 CLEARF(FD_VERIFY);
1618 CLEARF(FD_NEED_TWADDLE);
1619 #ifdef DCL_DEBUG
1620 if (DP->flags & FD_DEBUG) {
1621 DPRINT("checking whether disk is write protected\n");
1622 DPRINT("wp=%x\n", ST3 & 0x40);
1624 #endif
1625 if (!(ST3 & 0x40))
1626 SETF(FD_DISK_WRITABLE);
1627 else
1628 CLEARF(FD_DISK_WRITABLE);
1632 static void seek_floppy(void)
1634 int track;
1636 blind_seek = 0;
1638 #ifdef DCL_DEBUG
1639 if (DP->flags & FD_DEBUG) {
1640 DPRINT("calling disk change from seek\n");
1642 #endif
1644 if (!TESTF(FD_DISK_NEWCHANGE) &&
1645 disk_change(current_drive) && (raw_cmd->flags & FD_RAW_NEED_DISK)) {
1646 /* the media changed flag should be cleared after the seek.
1647 * If it isn't, this means that there is really no disk in
1648 * the drive.
1650 SETF(FD_DISK_CHANGED);
1651 cont->done(0);
1652 cont->redo();
1653 return;
1655 if (DRS->track <= NEED_1_RECAL) {
1656 recalibrate_floppy();
1657 return;
1658 } else if (TESTF(FD_DISK_NEWCHANGE) &&
1659 (raw_cmd->flags & FD_RAW_NEED_DISK) &&
1660 (DRS->track <= NO_TRACK || DRS->track == raw_cmd->track)) {
1661 /* we seek to clear the media-changed condition. Does anybody
1662 * know a more elegant way, which works on all drives? */
1663 if (raw_cmd->track)
1664 track = raw_cmd->track - 1;
1665 else {
1666 if (DP->flags & FD_SILENT_DCL_CLEAR) {
1667 set_dor(fdc, ~(0x10 << UNIT(current_drive)), 0);
1668 blind_seek = 1;
1669 raw_cmd->flags |= FD_RAW_NEED_SEEK;
1671 track = 1;
1673 } else {
1674 check_wp();
1675 if (raw_cmd->track != DRS->track &&
1676 (raw_cmd->flags & FD_RAW_NEED_SEEK))
1677 track = raw_cmd->track;
1678 else {
1679 setup_rw_floppy();
1680 return;
1684 do_floppy = seek_interrupt;
1685 output_byte(FD_SEEK);
1686 output_byte(UNIT(current_drive));
1687 LAST_OUT(track);
1688 debugt("seek command:");
1691 static void recal_interrupt(void)
1693 debugt("recal interrupt:");
1694 if (inr != 2)
1695 FDCS->reset = 1;
1696 else if (ST0 & ST0_ECE) {
1697 switch (DRS->track) {
1698 case NEED_1_RECAL:
1699 debugt("recal interrupt need 1 recal:");
1700 /* after a second recalibrate, we still haven't
1701 * reached track 0. Probably no drive. Raise an
1702 * error, as failing immediately might upset
1703 * computers possessed by the Devil :-) */
1704 cont->error();
1705 cont->redo();
1706 return;
1707 case NEED_2_RECAL:
1708 debugt("recal interrupt need 2 recal:");
1709 /* If we already did a recalibrate,
1710 * and we are not at track 0, this
1711 * means we have moved. (The only way
1712 * not to move at recalibration is to
1713 * be already at track 0.) Clear the
1714 * new change flag */
1715 #ifdef DCL_DEBUG
1716 if (DP->flags & FD_DEBUG) {
1717 DPRINT
1718 ("clearing NEWCHANGE flag because of second recalibrate\n");
1720 #endif
1722 CLEARF(FD_DISK_NEWCHANGE);
1723 DRS->select_date = jiffies;
1724 /* fall through */
1725 default:
1726 debugt("recal interrupt default:");
1727 /* Recalibrate moves the head by at
1728 * most 80 steps. If after one
1729 * recalibrate we don't have reached
1730 * track 0, this might mean that we
1731 * started beyond track 80. Try
1732 * again. */
1733 DRS->track = NEED_1_RECAL;
1734 break;
1736 } else
1737 DRS->track = ST1;
1738 floppy_ready();
1741 static void print_result(char *message, int inr)
1743 int i;
1745 DPRINT("%s ", message);
1746 if (inr >= 0)
1747 for (i = 0; i < inr; i++)
1748 printk("repl[%d]=%x ", i, reply_buffer[i]);
1749 printk("\n");
1752 /* interrupt handler. Note that this can be called externally on the Sparc */
1753 irqreturn_t floppy_interrupt(int irq, void *dev_id, struct pt_regs *regs)
1755 void (*handler) (void) = do_floppy;
1756 int do_print;
1757 unsigned long f;
1759 lasthandler = handler;
1760 interruptjiffies = jiffies;
1762 f = claim_dma_lock();
1763 fd_disable_dma();
1764 release_dma_lock(f);
1766 floppy_enable_hlt();
1767 do_floppy = NULL;
1768 if (fdc >= N_FDC || FDCS->address == -1) {
1769 /* we don't even know which FDC is the culprit */
1770 printk("DOR0=%x\n", fdc_state[0].dor);
1771 printk("floppy interrupt on bizarre fdc %d\n", fdc);
1772 printk("handler=%p\n", handler);
1773 is_alive("bizarre fdc");
1774 return IRQ_NONE;
1777 FDCS->reset = 0;
1778 /* We have to clear the reset flag here, because apparently on boxes
1779 * with level triggered interrupts (PS/2, Sparc, ...), it is needed to
1780 * emit SENSEI's to clear the interrupt line. And FDCS->reset blocks the
1781 * emission of the SENSEI's.
1782 * It is OK to emit floppy commands because we are in an interrupt
1783 * handler here, and thus we have to fear no interference of other
1784 * activity.
1787 do_print = !handler && print_unex && !initialising;
1789 inr = result();
1790 if (do_print)
1791 print_result("unexpected interrupt", inr);
1792 if (inr == 0) {
1793 int max_sensei = 4;
1794 do {
1795 output_byte(FD_SENSEI);
1796 inr = result();
1797 if (do_print)
1798 print_result("sensei", inr);
1799 max_sensei--;
1800 } while ((ST0 & 0x83) != UNIT(current_drive) && inr == 2
1801 && max_sensei);
1803 if (!handler) {
1804 FDCS->reset = 1;
1805 return IRQ_NONE;
1807 schedule_bh(handler);
1808 is_alive("normal interrupt end");
1810 /* FIXME! Was it really for us? */
1811 return IRQ_HANDLED;
1814 static void recalibrate_floppy(void)
1816 debugt("recalibrate floppy:");
1817 do_floppy = recal_interrupt;
1818 output_byte(FD_RECALIBRATE);
1819 LAST_OUT(UNIT(current_drive));
1823 * Must do 4 FD_SENSEIs after reset because of ``drive polling''.
1825 static void reset_interrupt(void)
1827 debugt("reset interrupt:");
1828 result(); /* get the status ready for set_fdc */
1829 if (FDCS->reset) {
1830 printk("reset set in interrupt, calling %p\n", cont->error);
1831 cont->error(); /* a reset just after a reset. BAD! */
1833 cont->redo();
1837 * reset is done by pulling bit 2 of DOR low for a while (old FDCs),
1838 * or by setting the self clearing bit 7 of STATUS (newer FDCs)
1840 static void reset_fdc(void)
1842 unsigned long flags;
1844 do_floppy = reset_interrupt;
1845 FDCS->reset = 0;
1846 reset_fdc_info(0);
1848 /* Pseudo-DMA may intercept 'reset finished' interrupt. */
1849 /* Irrelevant for systems with true DMA (i386). */
1851 flags = claim_dma_lock();
1852 fd_disable_dma();
1853 release_dma_lock(flags);
1855 if (FDCS->version >= FDC_82072A)
1856 fd_outb(0x80 | (FDCS->dtr & 3), FD_STATUS);
1857 else {
1858 fd_outb(FDCS->dor & ~0x04, FD_DOR);
1859 udelay(FD_RESET_DELAY);
1860 fd_outb(FDCS->dor, FD_DOR);
1864 static void show_floppy(void)
1866 int i;
1868 printk("\n");
1869 printk("floppy driver state\n");
1870 printk("-------------------\n");
1871 printk("now=%lu last interrupt=%lu diff=%lu last called handler=%p\n",
1872 jiffies, interruptjiffies, jiffies - interruptjiffies,
1873 lasthandler);
1875 #ifdef FLOPPY_SANITY_CHECK
1876 printk("timeout_message=%s\n", timeout_message);
1877 printk("last output bytes:\n");
1878 for (i = 0; i < OLOGSIZE; i++)
1879 printk("%2x %2x %lu\n",
1880 output_log[(i + output_log_pos) % OLOGSIZE].data,
1881 output_log[(i + output_log_pos) % OLOGSIZE].status,
1882 output_log[(i + output_log_pos) % OLOGSIZE].jiffies);
1883 printk("last result at %lu\n", resultjiffies);
1884 printk("last redo_fd_request at %lu\n", lastredo);
1885 for (i = 0; i < resultsize; i++) {
1886 printk("%2x ", reply_buffer[i]);
1888 printk("\n");
1889 #endif
1891 printk("status=%x\n", fd_inb(FD_STATUS));
1892 printk("fdc_busy=%lu\n", fdc_busy);
1893 if (do_floppy)
1894 printk("do_floppy=%p\n", do_floppy);
1895 if (floppy_work.pending)
1896 printk("floppy_work.func=%p\n", floppy_work.func);
1897 if (timer_pending(&fd_timer))
1898 printk("fd_timer.function=%p\n", fd_timer.function);
1899 if (timer_pending(&fd_timeout)) {
1900 printk("timer_function=%p\n", fd_timeout.function);
1901 printk("expires=%lu\n", fd_timeout.expires - jiffies);
1902 printk("now=%lu\n", jiffies);
1904 printk("cont=%p\n", cont);
1905 printk("current_req=%p\n", current_req);
1906 printk("command_status=%d\n", command_status);
1907 printk("\n");
1910 static void floppy_shutdown(unsigned long data)
1912 unsigned long flags;
1914 if (!initialising)
1915 show_floppy();
1916 cancel_activity();
1918 floppy_enable_hlt();
1920 flags = claim_dma_lock();
1921 fd_disable_dma();
1922 release_dma_lock(flags);
1924 /* avoid dma going to a random drive after shutdown */
1926 if (!initialising)
1927 DPRINT("floppy timeout called\n");
1928 FDCS->reset = 1;
1929 if (cont) {
1930 cont->done(0);
1931 cont->redo(); /* this will recall reset when needed */
1932 } else {
1933 printk("no cont in shutdown!\n");
1934 process_fd_request();
1936 is_alive("floppy shutdown");
1939 /*typedef void (*timeout_fn)(unsigned long);*/
1941 /* start motor, check media-changed condition and write protection */
1942 static int start_motor(void (*function) (void))
1944 int mask, data;
1946 mask = 0xfc;
1947 data = UNIT(current_drive);
1948 if (!(raw_cmd->flags & FD_RAW_NO_MOTOR)) {
1949 if (!(FDCS->dor & (0x10 << UNIT(current_drive)))) {
1950 set_debugt();
1951 /* no read since this drive is running */
1952 DRS->first_read_date = 0;
1953 /* note motor start time if motor is not yet running */
1954 DRS->spinup_date = jiffies;
1955 data |= (0x10 << UNIT(current_drive));
1957 } else if (FDCS->dor & (0x10 << UNIT(current_drive)))
1958 mask &= ~(0x10 << UNIT(current_drive));
1960 /* starts motor and selects floppy */
1961 del_timer(motor_off_timer + current_drive);
1962 set_dor(fdc, mask, data);
1964 /* wait_for_completion also schedules reset if needed. */
1965 return (fd_wait_for_completion(DRS->select_date + DP->select_delay,
1966 (timeout_fn) function));
1969 static void floppy_ready(void)
1971 CHECK_RESET;
1972 if (start_motor(floppy_ready))
1973 return;
1974 if (fdc_dtr())
1975 return;
1977 #ifdef DCL_DEBUG
1978 if (DP->flags & FD_DEBUG) {
1979 DPRINT("calling disk change from floppy_ready\n");
1981 #endif
1982 if (!(raw_cmd->flags & FD_RAW_NO_MOTOR) &&
1983 disk_change(current_drive) && !DP->select_delay)
1984 twaddle(); /* this clears the dcl on certain drive/controller
1985 * combinations */
1987 #ifdef fd_chose_dma_mode
1988 if ((raw_cmd->flags & FD_RAW_READ) || (raw_cmd->flags & FD_RAW_WRITE)) {
1989 unsigned long flags = claim_dma_lock();
1990 fd_chose_dma_mode(raw_cmd->kernel_data, raw_cmd->length);
1991 release_dma_lock(flags);
1993 #endif
1995 if (raw_cmd->flags & (FD_RAW_NEED_SEEK | FD_RAW_NEED_DISK)) {
1996 perpendicular_mode();
1997 fdc_specify(); /* must be done here because of hut, hlt ... */
1998 seek_floppy();
1999 } else {
2000 if ((raw_cmd->flags & FD_RAW_READ) ||
2001 (raw_cmd->flags & FD_RAW_WRITE))
2002 fdc_specify();
2003 setup_rw_floppy();
2007 static void floppy_start(void)
2009 reschedule_timeout(current_reqD, "floppy start", 0);
2011 scandrives();
2012 #ifdef DCL_DEBUG
2013 if (DP->flags & FD_DEBUG) {
2014 DPRINT("setting NEWCHANGE in floppy_start\n");
2016 #endif
2017 SETF(FD_DISK_NEWCHANGE);
2018 floppy_ready();
2022 * ========================================================================
2023 * here ends the bottom half. Exported routines are:
2024 * floppy_start, floppy_off, floppy_ready, lock_fdc, unlock_fdc, set_fdc,
2025 * start_motor, reset_fdc, reset_fdc_info, interpret_errors.
2026 * Initialization also uses output_byte, result, set_dor, floppy_interrupt
2027 * and set_dor.
2028 * ========================================================================
2031 * General purpose continuations.
2032 * ==============================
2035 static void do_wakeup(void)
2037 reschedule_timeout(MAXTIMEOUT, "do wakeup", 0);
2038 cont = NULL;
2039 command_status += 2;
2040 wake_up(&command_done);
2043 static struct cont_t wakeup_cont = {
2044 .interrupt = empty,
2045 .redo = do_wakeup,
2046 .error = empty,
2047 .done = (done_f) empty
2050 static struct cont_t intr_cont = {
2051 .interrupt = empty,
2052 .redo = process_fd_request,
2053 .error = empty,
2054 .done = (done_f) empty
2057 static int wait_til_done(void (*handler) (void), int interruptible)
2059 int ret;
2061 schedule_bh(handler);
2063 if (command_status < 2 && NO_SIGNAL) {
2064 DECLARE_WAITQUEUE(wait, current);
2066 add_wait_queue(&command_done, &wait);
2067 for (;;) {
2068 set_current_state(interruptible ?
2069 TASK_INTERRUPTIBLE :
2070 TASK_UNINTERRUPTIBLE);
2072 if (command_status >= 2 || !NO_SIGNAL)
2073 break;
2075 is_alive("wait_til_done");
2077 schedule();
2080 set_current_state(TASK_RUNNING);
2081 remove_wait_queue(&command_done, &wait);
2084 if (command_status < 2) {
2085 cancel_activity();
2086 cont = &intr_cont;
2087 reset_fdc();
2088 return -EINTR;
2091 if (FDCS->reset)
2092 command_status = FD_COMMAND_ERROR;
2093 if (command_status == FD_COMMAND_OKAY)
2094 ret = 0;
2095 else
2096 ret = -EIO;
2097 command_status = FD_COMMAND_NONE;
2098 return ret;
2101 static void generic_done(int result)
2103 command_status = result;
2104 cont = &wakeup_cont;
2107 static void generic_success(void)
2109 cont->done(1);
2112 static void generic_failure(void)
2114 cont->done(0);
2117 static void success_and_wakeup(void)
2119 generic_success();
2120 cont->redo();
2124 * formatting and rw support.
2125 * ==========================
2128 static int next_valid_format(void)
2130 int probed_format;
2132 probed_format = DRS->probed_format;
2133 while (1) {
2134 if (probed_format >= 8 || !DP->autodetect[probed_format]) {
2135 DRS->probed_format = 0;
2136 return 1;
2138 if (floppy_type[DP->autodetect[probed_format]].sect) {
2139 DRS->probed_format = probed_format;
2140 return 0;
2142 probed_format++;
2146 static void bad_flp_intr(void)
2148 int err_count;
2150 if (probing) {
2151 DRS->probed_format++;
2152 if (!next_valid_format())
2153 return;
2155 err_count = ++(*errors);
2156 INFBOUND(DRWE->badness, err_count);
2157 if (err_count > DP->max_errors.abort)
2158 cont->done(0);
2159 if (err_count > DP->max_errors.reset)
2160 FDCS->reset = 1;
2161 else if (err_count > DP->max_errors.recal)
2162 DRS->track = NEED_2_RECAL;
2165 static void set_floppy(int drive)
2167 int type = ITYPE(UDRS->fd_device);
2168 if (type)
2169 _floppy = floppy_type + type;
2170 else
2171 _floppy = current_type[drive];
2175 * formatting support.
2176 * ===================
2178 static void format_interrupt(void)
2180 switch (interpret_errors()) {
2181 case 1:
2182 cont->error();
2183 case 2:
2184 break;
2185 case 0:
2186 cont->done(1);
2188 cont->redo();
2191 #define CODE2SIZE (ssize = ((1 << SIZECODE) + 3) >> 2)
2192 #define FM_MODE(x,y) ((y) & ~(((x)->rate & 0x80) >>1))
2193 #define CT(x) ((x) | 0xc0)
2194 static void setup_format_params(int track)
2196 struct fparm {
2197 unsigned char track, head, sect, size;
2198 } *here = (struct fparm *)floppy_track_buffer;
2199 int il, n;
2200 int count, head_shift, track_shift;
2202 raw_cmd = &default_raw_cmd;
2203 raw_cmd->track = track;
2205 raw_cmd->flags = FD_RAW_WRITE | FD_RAW_INTR | FD_RAW_SPIN |
2206 FD_RAW_NEED_DISK | FD_RAW_NEED_SEEK;
2207 raw_cmd->rate = _floppy->rate & 0x43;
2208 raw_cmd->cmd_count = NR_F;
2209 COMMAND = FM_MODE(_floppy, FD_FORMAT);
2210 DR_SELECT = UNIT(current_drive) + PH_HEAD(_floppy, format_req.head);
2211 F_SIZECODE = FD_SIZECODE(_floppy);
2212 F_SECT_PER_TRACK = _floppy->sect << 2 >> F_SIZECODE;
2213 F_GAP = _floppy->fmt_gap;
2214 F_FILL = FD_FILL_BYTE;
2216 raw_cmd->kernel_data = floppy_track_buffer;
2217 raw_cmd->length = 4 * F_SECT_PER_TRACK;
2219 /* allow for about 30ms for data transport per track */
2220 head_shift = (F_SECT_PER_TRACK + 5) / 6;
2222 /* a ``cylinder'' is two tracks plus a little stepping time */
2223 track_shift = 2 * head_shift + 3;
2225 /* position of logical sector 1 on this track */
2226 n = (track_shift * format_req.track + head_shift * format_req.head)
2227 % F_SECT_PER_TRACK;
2229 /* determine interleave */
2230 il = 1;
2231 if (_floppy->fmt_gap < 0x22)
2232 il++;
2234 /* initialize field */
2235 for (count = 0; count < F_SECT_PER_TRACK; ++count) {
2236 here[count].track = format_req.track;
2237 here[count].head = format_req.head;
2238 here[count].sect = 0;
2239 here[count].size = F_SIZECODE;
2241 /* place logical sectors */
2242 for (count = 1; count <= F_SECT_PER_TRACK; ++count) {
2243 here[n].sect = count;
2244 n = (n + il) % F_SECT_PER_TRACK;
2245 if (here[n].sect) { /* sector busy, find next free sector */
2246 ++n;
2247 if (n >= F_SECT_PER_TRACK) {
2248 n -= F_SECT_PER_TRACK;
2249 while (here[n].sect)
2250 ++n;
2254 if (_floppy->stretch & FD_ZEROBASED) {
2255 for (count = 0; count < F_SECT_PER_TRACK; count++)
2256 here[count].sect--;
2260 static void redo_format(void)
2262 buffer_track = -1;
2263 setup_format_params(format_req.track << STRETCH(_floppy));
2264 floppy_start();
2265 debugt("queue format request");
2268 static struct cont_t format_cont = {
2269 .interrupt = format_interrupt,
2270 .redo = redo_format,
2271 .error = bad_flp_intr,
2272 .done = generic_done
2275 static int do_format(int drive, struct format_descr *tmp_format_req)
2277 int ret;
2279 LOCK_FDC(drive, 1);
2280 set_floppy(drive);
2281 if (!_floppy ||
2282 _floppy->track > DP->tracks ||
2283 tmp_format_req->track >= _floppy->track ||
2284 tmp_format_req->head >= _floppy->head ||
2285 (_floppy->sect << 2) % (1 << FD_SIZECODE(_floppy)) ||
2286 !_floppy->fmt_gap) {
2287 process_fd_request();
2288 return -EINVAL;
2290 format_req = *tmp_format_req;
2291 format_errors = 0;
2292 cont = &format_cont;
2293 errors = &format_errors;
2294 IWAIT(redo_format);
2295 process_fd_request();
2296 return ret;
2300 * Buffer read/write and support
2301 * =============================
2304 static void floppy_end_request(struct request *req, int uptodate)
2306 unsigned int nr_sectors = current_count_sectors;
2308 /* current_count_sectors can be zero if transfer failed */
2309 if (!uptodate)
2310 nr_sectors = req->current_nr_sectors;
2311 if (end_that_request_first(req, uptodate, nr_sectors))
2312 return;
2313 add_disk_randomness(req->rq_disk);
2314 floppy_off((long)req->rq_disk->private_data);
2315 blkdev_dequeue_request(req);
2316 end_that_request_last(req, uptodate);
2318 /* We're done with the request */
2319 current_req = NULL;
2322 /* new request_done. Can handle physical sectors which are smaller than a
2323 * logical buffer */
2324 static void request_done(int uptodate)
2326 struct request_queue *q = floppy_queue;
2327 struct request *req = current_req;
2328 unsigned long flags;
2329 int block;
2331 probing = 0;
2332 reschedule_timeout(MAXTIMEOUT, "request done %d", uptodate);
2334 if (!req) {
2335 printk("floppy.c: no request in request_done\n");
2336 return;
2339 if (uptodate) {
2340 /* maintain values for invalidation on geometry
2341 * change */
2342 block = current_count_sectors + req->sector;
2343 INFBOUND(DRS->maxblock, block);
2344 if (block > _floppy->sect)
2345 DRS->maxtrack = 1;
2347 /* unlock chained buffers */
2348 spin_lock_irqsave(q->queue_lock, flags);
2349 floppy_end_request(req, 1);
2350 spin_unlock_irqrestore(q->queue_lock, flags);
2351 } else {
2352 if (rq_data_dir(req) == WRITE) {
2353 /* record write error information */
2354 DRWE->write_errors++;
2355 if (DRWE->write_errors == 1) {
2356 DRWE->first_error_sector = req->sector;
2357 DRWE->first_error_generation = DRS->generation;
2359 DRWE->last_error_sector = req->sector;
2360 DRWE->last_error_generation = DRS->generation;
2362 spin_lock_irqsave(q->queue_lock, flags);
2363 floppy_end_request(req, 0);
2364 spin_unlock_irqrestore(q->queue_lock, flags);
2368 /* Interrupt handler evaluating the result of the r/w operation */
2369 static void rw_interrupt(void)
2371 int nr_sectors, ssize, eoc, heads;
2373 if (R_HEAD >= 2) {
2374 /* some Toshiba floppy controllers occasionnally seem to
2375 * return bogus interrupts after read/write operations, which
2376 * can be recognized by a bad head number (>= 2) */
2377 return;
2380 if (!DRS->first_read_date)
2381 DRS->first_read_date = jiffies;
2383 nr_sectors = 0;
2384 CODE2SIZE;
2386 if (ST1 & ST1_EOC)
2387 eoc = 1;
2388 else
2389 eoc = 0;
2391 if (COMMAND & 0x80)
2392 heads = 2;
2393 else
2394 heads = 1;
2396 nr_sectors = (((R_TRACK - TRACK) * heads +
2397 R_HEAD - HEAD) * SECT_PER_TRACK +
2398 R_SECTOR - SECTOR + eoc) << SIZECODE >> 2;
2400 #ifdef FLOPPY_SANITY_CHECK
2401 if (nr_sectors / ssize >
2402 (in_sector_offset + current_count_sectors + ssize - 1) / ssize) {
2403 DPRINT("long rw: %x instead of %lx\n",
2404 nr_sectors, current_count_sectors);
2405 printk("rs=%d s=%d\n", R_SECTOR, SECTOR);
2406 printk("rh=%d h=%d\n", R_HEAD, HEAD);
2407 printk("rt=%d t=%d\n", R_TRACK, TRACK);
2408 printk("heads=%d eoc=%d\n", heads, eoc);
2409 printk("spt=%d st=%d ss=%d\n", SECT_PER_TRACK,
2410 fsector_t, ssize);
2411 printk("in_sector_offset=%d\n", in_sector_offset);
2413 #endif
2415 nr_sectors -= in_sector_offset;
2416 INFBOUND(nr_sectors, 0);
2417 SUPBOUND(current_count_sectors, nr_sectors);
2419 switch (interpret_errors()) {
2420 case 2:
2421 cont->redo();
2422 return;
2423 case 1:
2424 if (!current_count_sectors) {
2425 cont->error();
2426 cont->redo();
2427 return;
2429 break;
2430 case 0:
2431 if (!current_count_sectors) {
2432 cont->redo();
2433 return;
2435 current_type[current_drive] = _floppy;
2436 floppy_sizes[TOMINOR(current_drive)] = _floppy->size;
2437 break;
2440 if (probing) {
2441 if (DP->flags & FTD_MSG)
2442 DPRINT("Auto-detected floppy type %s in fd%d\n",
2443 _floppy->name, current_drive);
2444 current_type[current_drive] = _floppy;
2445 floppy_sizes[TOMINOR(current_drive)] = _floppy->size;
2446 probing = 0;
2449 if (CT(COMMAND) != FD_READ ||
2450 raw_cmd->kernel_data == current_req->buffer) {
2451 /* transfer directly from buffer */
2452 cont->done(1);
2453 } else if (CT(COMMAND) == FD_READ) {
2454 buffer_track = raw_cmd->track;
2455 buffer_drive = current_drive;
2456 INFBOUND(buffer_max, nr_sectors + fsector_t);
2458 cont->redo();
2461 /* Compute maximal contiguous buffer size. */
2462 static int buffer_chain_size(void)
2464 struct bio *bio;
2465 struct bio_vec *bv;
2466 int size, i;
2467 char *base;
2469 base = bio_data(current_req->bio);
2470 size = 0;
2472 rq_for_each_bio(bio, current_req) {
2473 bio_for_each_segment(bv, bio, i) {
2474 if (page_address(bv->bv_page) + bv->bv_offset !=
2475 base + size)
2476 break;
2478 size += bv->bv_len;
2482 return size >> 9;
2485 /* Compute the maximal transfer size */
2486 static int transfer_size(int ssize, int max_sector, int max_size)
2488 SUPBOUND(max_sector, fsector_t + max_size);
2490 /* alignment */
2491 max_sector -= (max_sector % _floppy->sect) % ssize;
2493 /* transfer size, beginning not aligned */
2494 current_count_sectors = max_sector - fsector_t;
2496 return max_sector;
2500 * Move data from/to the track buffer to/from the buffer cache.
2502 static void copy_buffer(int ssize, int max_sector, int max_sector_2)
2504 int remaining; /* number of transferred 512-byte sectors */
2505 struct bio_vec *bv;
2506 struct bio *bio;
2507 char *buffer, *dma_buffer;
2508 int size, i;
2510 max_sector = transfer_size(ssize,
2511 min(max_sector, max_sector_2),
2512 current_req->nr_sectors);
2514 if (current_count_sectors <= 0 && CT(COMMAND) == FD_WRITE &&
2515 buffer_max > fsector_t + current_req->nr_sectors)
2516 current_count_sectors = min_t(int, buffer_max - fsector_t,
2517 current_req->nr_sectors);
2519 remaining = current_count_sectors << 9;
2520 #ifdef FLOPPY_SANITY_CHECK
2521 if ((remaining >> 9) > current_req->nr_sectors &&
2522 CT(COMMAND) == FD_WRITE) {
2523 DPRINT("in copy buffer\n");
2524 printk("current_count_sectors=%ld\n", current_count_sectors);
2525 printk("remaining=%d\n", remaining >> 9);
2526 printk("current_req->nr_sectors=%ld\n",
2527 current_req->nr_sectors);
2528 printk("current_req->current_nr_sectors=%u\n",
2529 current_req->current_nr_sectors);
2530 printk("max_sector=%d\n", max_sector);
2531 printk("ssize=%d\n", ssize);
2533 #endif
2535 buffer_max = max(max_sector, buffer_max);
2537 dma_buffer = floppy_track_buffer + ((fsector_t - buffer_min) << 9);
2539 size = current_req->current_nr_sectors << 9;
2541 rq_for_each_bio(bio, current_req) {
2542 bio_for_each_segment(bv, bio, i) {
2543 if (!remaining)
2544 break;
2546 size = bv->bv_len;
2547 SUPBOUND(size, remaining);
2549 buffer = page_address(bv->bv_page) + bv->bv_offset;
2550 #ifdef FLOPPY_SANITY_CHECK
2551 if (dma_buffer + size >
2552 floppy_track_buffer + (max_buffer_sectors << 10) ||
2553 dma_buffer < floppy_track_buffer) {
2554 DPRINT("buffer overrun in copy buffer %d\n",
2555 (int)((floppy_track_buffer -
2556 dma_buffer) >> 9));
2557 printk("fsector_t=%d buffer_min=%d\n",
2558 fsector_t, buffer_min);
2559 printk("current_count_sectors=%ld\n",
2560 current_count_sectors);
2561 if (CT(COMMAND) == FD_READ)
2562 printk("read\n");
2563 if (CT(COMMAND) == FD_WRITE)
2564 printk("write\n");
2565 break;
2567 if (((unsigned long)buffer) % 512)
2568 DPRINT("%p buffer not aligned\n", buffer);
2569 #endif
2570 if (CT(COMMAND) == FD_READ)
2571 memcpy(buffer, dma_buffer, size);
2572 else
2573 memcpy(dma_buffer, buffer, size);
2575 remaining -= size;
2576 dma_buffer += size;
2579 #ifdef FLOPPY_SANITY_CHECK
2580 if (remaining) {
2581 if (remaining > 0)
2582 max_sector -= remaining >> 9;
2583 DPRINT("weirdness: remaining %d\n", remaining >> 9);
2585 #endif
2588 #if 0
2589 static inline int check_dma_crossing(char *start,
2590 unsigned long length, char *message)
2592 if (CROSS_64KB(start, length)) {
2593 printk("DMA xfer crosses 64KB boundary in %s %p-%p\n",
2594 message, start, start + length);
2595 return 1;
2596 } else
2597 return 0;
2599 #endif
2601 /* work around a bug in pseudo DMA
2602 * (on some FDCs) pseudo DMA does not stop when the CPU stops
2603 * sending data. Hence we need a different way to signal the
2604 * transfer length: We use SECT_PER_TRACK. Unfortunately, this
2605 * does not work with MT, hence we can only transfer one head at
2606 * a time
2608 static void virtualdmabug_workaround(void)
2610 int hard_sectors, end_sector;
2612 if (CT(COMMAND) == FD_WRITE) {
2613 COMMAND &= ~0x80; /* switch off multiple track mode */
2615 hard_sectors = raw_cmd->length >> (7 + SIZECODE);
2616 end_sector = SECTOR + hard_sectors - 1;
2617 #ifdef FLOPPY_SANITY_CHECK
2618 if (end_sector > SECT_PER_TRACK) {
2619 printk("too many sectors %d > %d\n",
2620 end_sector, SECT_PER_TRACK);
2621 return;
2623 #endif
2624 SECT_PER_TRACK = end_sector; /* make sure SECT_PER_TRACK points
2625 * to end of transfer */
2630 * Formulate a read/write request.
2631 * this routine decides where to load the data (directly to buffer, or to
2632 * tmp floppy area), how much data to load (the size of the buffer, the whole
2633 * track, or a single sector)
2634 * All floppy_track_buffer handling goes in here. If we ever add track buffer
2635 * allocation on the fly, it should be done here. No other part should need
2636 * modification.
2639 static int make_raw_rw_request(void)
2641 int aligned_sector_t;
2642 int max_sector, max_size, tracksize, ssize;
2644 if (max_buffer_sectors == 0) {
2645 printk("VFS: Block I/O scheduled on unopened device\n");
2646 return 0;
2649 set_fdc((long)current_req->rq_disk->private_data);
2651 raw_cmd = &default_raw_cmd;
2652 raw_cmd->flags = FD_RAW_SPIN | FD_RAW_NEED_DISK | FD_RAW_NEED_DISK |
2653 FD_RAW_NEED_SEEK;
2654 raw_cmd->cmd_count = NR_RW;
2655 if (rq_data_dir(current_req) == READ) {
2656 raw_cmd->flags |= FD_RAW_READ;
2657 COMMAND = FM_MODE(_floppy, FD_READ);
2658 } else if (rq_data_dir(current_req) == WRITE) {
2659 raw_cmd->flags |= FD_RAW_WRITE;
2660 COMMAND = FM_MODE(_floppy, FD_WRITE);
2661 } else {
2662 DPRINT("make_raw_rw_request: unknown command\n");
2663 return 0;
2666 max_sector = _floppy->sect * _floppy->head;
2668 TRACK = (int)current_req->sector / max_sector;
2669 fsector_t = (int)current_req->sector % max_sector;
2670 if (_floppy->track && TRACK >= _floppy->track) {
2671 if (current_req->current_nr_sectors & 1) {
2672 current_count_sectors = 1;
2673 return 1;
2674 } else
2675 return 0;
2677 HEAD = fsector_t / _floppy->sect;
2679 if (((_floppy->stretch & (FD_SWAPSIDES | FD_ZEROBASED)) ||
2680 TESTF(FD_NEED_TWADDLE)) && fsector_t < _floppy->sect)
2681 max_sector = _floppy->sect;
2683 /* 2M disks have phantom sectors on the first track */
2684 if ((_floppy->rate & FD_2M) && (!TRACK) && (!HEAD)) {
2685 max_sector = 2 * _floppy->sect / 3;
2686 if (fsector_t >= max_sector) {
2687 current_count_sectors =
2688 min_t(int, _floppy->sect - fsector_t,
2689 current_req->nr_sectors);
2690 return 1;
2692 SIZECODE = 2;
2693 } else
2694 SIZECODE = FD_SIZECODE(_floppy);
2695 raw_cmd->rate = _floppy->rate & 0x43;
2696 if ((_floppy->rate & FD_2M) && (TRACK || HEAD) && raw_cmd->rate == 2)
2697 raw_cmd->rate = 1;
2699 if (SIZECODE)
2700 SIZECODE2 = 0xff;
2701 else
2702 SIZECODE2 = 0x80;
2703 raw_cmd->track = TRACK << STRETCH(_floppy);
2704 DR_SELECT = UNIT(current_drive) + PH_HEAD(_floppy, HEAD);
2705 GAP = _floppy->gap;
2706 CODE2SIZE;
2707 SECT_PER_TRACK = _floppy->sect << 2 >> SIZECODE;
2708 SECTOR = ((fsector_t % _floppy->sect) << 2 >> SIZECODE) +
2709 ((_floppy->stretch & FD_ZEROBASED) ? 0 : 1);
2711 /* tracksize describes the size which can be filled up with sectors
2712 * of size ssize.
2714 tracksize = _floppy->sect - _floppy->sect % ssize;
2715 if (tracksize < _floppy->sect) {
2716 SECT_PER_TRACK++;
2717 if (tracksize <= fsector_t % _floppy->sect)
2718 SECTOR--;
2720 /* if we are beyond tracksize, fill up using smaller sectors */
2721 while (tracksize <= fsector_t % _floppy->sect) {
2722 while (tracksize + ssize > _floppy->sect) {
2723 SIZECODE--;
2724 ssize >>= 1;
2726 SECTOR++;
2727 SECT_PER_TRACK++;
2728 tracksize += ssize;
2730 max_sector = HEAD * _floppy->sect + tracksize;
2731 } else if (!TRACK && !HEAD && !(_floppy->rate & FD_2M) && probing) {
2732 max_sector = _floppy->sect;
2733 } else if (!HEAD && CT(COMMAND) == FD_WRITE) {
2734 /* for virtual DMA bug workaround */
2735 max_sector = _floppy->sect;
2738 in_sector_offset = (fsector_t % _floppy->sect) % ssize;
2739 aligned_sector_t = fsector_t - in_sector_offset;
2740 max_size = current_req->nr_sectors;
2741 if ((raw_cmd->track == buffer_track) &&
2742 (current_drive == buffer_drive) &&
2743 (fsector_t >= buffer_min) && (fsector_t < buffer_max)) {
2744 /* data already in track buffer */
2745 if (CT(COMMAND) == FD_READ) {
2746 copy_buffer(1, max_sector, buffer_max);
2747 return 1;
2749 } else if (in_sector_offset || current_req->nr_sectors < ssize) {
2750 if (CT(COMMAND) == FD_WRITE) {
2751 if (fsector_t + current_req->nr_sectors > ssize &&
2752 fsector_t + current_req->nr_sectors < ssize + ssize)
2753 max_size = ssize + ssize;
2754 else
2755 max_size = ssize;
2757 raw_cmd->flags &= ~FD_RAW_WRITE;
2758 raw_cmd->flags |= FD_RAW_READ;
2759 COMMAND = FM_MODE(_floppy, FD_READ);
2760 } else if ((unsigned long)current_req->buffer < MAX_DMA_ADDRESS) {
2761 unsigned long dma_limit;
2762 int direct, indirect;
2764 indirect =
2765 transfer_size(ssize, max_sector,
2766 max_buffer_sectors * 2) - fsector_t;
2769 * Do NOT use minimum() here---MAX_DMA_ADDRESS is 64 bits wide
2770 * on a 64 bit machine!
2772 max_size = buffer_chain_size();
2773 dma_limit =
2774 (MAX_DMA_ADDRESS -
2775 ((unsigned long)current_req->buffer)) >> 9;
2776 if ((unsigned long)max_size > dma_limit) {
2777 max_size = dma_limit;
2779 /* 64 kb boundaries */
2780 if (CROSS_64KB(current_req->buffer, max_size << 9))
2781 max_size = (K_64 -
2782 ((unsigned long)current_req->buffer) %
2783 K_64) >> 9;
2784 direct = transfer_size(ssize, max_sector, max_size) - fsector_t;
2786 * We try to read tracks, but if we get too many errors, we
2787 * go back to reading just one sector at a time.
2789 * This means we should be able to read a sector even if there
2790 * are other bad sectors on this track.
2792 if (!direct ||
2793 (indirect * 2 > direct * 3 &&
2794 *errors < DP->max_errors.read_track &&
2795 /*!TESTF(FD_NEED_TWADDLE) && */
2796 ((!probing
2797 || (DP->read_track & (1 << DRS->probed_format)))))) {
2798 max_size = current_req->nr_sectors;
2799 } else {
2800 raw_cmd->kernel_data = current_req->buffer;
2801 raw_cmd->length = current_count_sectors << 9;
2802 if (raw_cmd->length == 0) {
2803 DPRINT
2804 ("zero dma transfer attempted from make_raw_request\n");
2805 DPRINT("indirect=%d direct=%d fsector_t=%d",
2806 indirect, direct, fsector_t);
2807 return 0;
2809 /* check_dma_crossing(raw_cmd->kernel_data,
2810 raw_cmd->length,
2811 "end of make_raw_request [1]");*/
2813 virtualdmabug_workaround();
2814 return 2;
2818 if (CT(COMMAND) == FD_READ)
2819 max_size = max_sector; /* unbounded */
2821 /* claim buffer track if needed */
2822 if (buffer_track != raw_cmd->track || /* bad track */
2823 buffer_drive != current_drive || /* bad drive */
2824 fsector_t > buffer_max ||
2825 fsector_t < buffer_min ||
2826 ((CT(COMMAND) == FD_READ ||
2827 (!in_sector_offset && current_req->nr_sectors >= ssize)) &&
2828 max_sector > 2 * max_buffer_sectors + buffer_min &&
2829 max_size + fsector_t > 2 * max_buffer_sectors + buffer_min)
2830 /* not enough space */
2832 buffer_track = -1;
2833 buffer_drive = current_drive;
2834 buffer_max = buffer_min = aligned_sector_t;
2836 raw_cmd->kernel_data = floppy_track_buffer +
2837 ((aligned_sector_t - buffer_min) << 9);
2839 if (CT(COMMAND) == FD_WRITE) {
2840 /* copy write buffer to track buffer.
2841 * if we get here, we know that the write
2842 * is either aligned or the data already in the buffer
2843 * (buffer will be overwritten) */
2844 #ifdef FLOPPY_SANITY_CHECK
2845 if (in_sector_offset && buffer_track == -1)
2846 DPRINT("internal error offset !=0 on write\n");
2847 #endif
2848 buffer_track = raw_cmd->track;
2849 buffer_drive = current_drive;
2850 copy_buffer(ssize, max_sector,
2851 2 * max_buffer_sectors + buffer_min);
2852 } else
2853 transfer_size(ssize, max_sector,
2854 2 * max_buffer_sectors + buffer_min -
2855 aligned_sector_t);
2857 /* round up current_count_sectors to get dma xfer size */
2858 raw_cmd->length = in_sector_offset + current_count_sectors;
2859 raw_cmd->length = ((raw_cmd->length - 1) | (ssize - 1)) + 1;
2860 raw_cmd->length <<= 9;
2861 #ifdef FLOPPY_SANITY_CHECK
2862 /*check_dma_crossing(raw_cmd->kernel_data, raw_cmd->length,
2863 "end of make_raw_request"); */
2864 if ((raw_cmd->length < current_count_sectors << 9) ||
2865 (raw_cmd->kernel_data != current_req->buffer &&
2866 CT(COMMAND) == FD_WRITE &&
2867 (aligned_sector_t + (raw_cmd->length >> 9) > buffer_max ||
2868 aligned_sector_t < buffer_min)) ||
2869 raw_cmd->length % (128 << SIZECODE) ||
2870 raw_cmd->length <= 0 || current_count_sectors <= 0) {
2871 DPRINT("fractionary current count b=%lx s=%lx\n",
2872 raw_cmd->length, current_count_sectors);
2873 if (raw_cmd->kernel_data != current_req->buffer)
2874 printk("addr=%d, length=%ld\n",
2875 (int)((raw_cmd->kernel_data -
2876 floppy_track_buffer) >> 9),
2877 current_count_sectors);
2878 printk("st=%d ast=%d mse=%d msi=%d\n",
2879 fsector_t, aligned_sector_t, max_sector, max_size);
2880 printk("ssize=%x SIZECODE=%d\n", ssize, SIZECODE);
2881 printk("command=%x SECTOR=%d HEAD=%d, TRACK=%d\n",
2882 COMMAND, SECTOR, HEAD, TRACK);
2883 printk("buffer drive=%d\n", buffer_drive);
2884 printk("buffer track=%d\n", buffer_track);
2885 printk("buffer_min=%d\n", buffer_min);
2886 printk("buffer_max=%d\n", buffer_max);
2887 return 0;
2890 if (raw_cmd->kernel_data != current_req->buffer) {
2891 if (raw_cmd->kernel_data < floppy_track_buffer ||
2892 current_count_sectors < 0 ||
2893 raw_cmd->length < 0 ||
2894 raw_cmd->kernel_data + raw_cmd->length >
2895 floppy_track_buffer + (max_buffer_sectors << 10)) {
2896 DPRINT("buffer overrun in schedule dma\n");
2897 printk("fsector_t=%d buffer_min=%d current_count=%ld\n",
2898 fsector_t, buffer_min, raw_cmd->length >> 9);
2899 printk("current_count_sectors=%ld\n",
2900 current_count_sectors);
2901 if (CT(COMMAND) == FD_READ)
2902 printk("read\n");
2903 if (CT(COMMAND) == FD_WRITE)
2904 printk("write\n");
2905 return 0;
2907 } else if (raw_cmd->length > current_req->nr_sectors << 9 ||
2908 current_count_sectors > current_req->nr_sectors) {
2909 DPRINT("buffer overrun in direct transfer\n");
2910 return 0;
2911 } else if (raw_cmd->length < current_count_sectors << 9) {
2912 DPRINT("more sectors than bytes\n");
2913 printk("bytes=%ld\n", raw_cmd->length >> 9);
2914 printk("sectors=%ld\n", current_count_sectors);
2916 if (raw_cmd->length == 0) {
2917 DPRINT("zero dma transfer attempted from make_raw_request\n");
2918 return 0;
2920 #endif
2922 virtualdmabug_workaround();
2923 return 2;
2926 static void redo_fd_request(void)
2928 #define REPEAT {request_done(0); continue; }
2929 int drive;
2930 int tmp;
2932 lastredo = jiffies;
2933 if (current_drive < N_DRIVE)
2934 floppy_off(current_drive);
2936 for (;;) {
2937 if (!current_req) {
2938 struct request *req;
2940 spin_lock_irq(floppy_queue->queue_lock);
2941 req = elv_next_request(floppy_queue);
2942 spin_unlock_irq(floppy_queue->queue_lock);
2943 if (!req) {
2944 do_floppy = NULL;
2945 unlock_fdc();
2946 return;
2948 current_req = req;
2950 drive = (long)current_req->rq_disk->private_data;
2951 set_fdc(drive);
2952 reschedule_timeout(current_reqD, "redo fd request", 0);
2954 set_floppy(drive);
2955 raw_cmd = &default_raw_cmd;
2956 raw_cmd->flags = 0;
2957 if (start_motor(redo_fd_request))
2958 return;
2959 disk_change(current_drive);
2960 if (test_bit(current_drive, &fake_change) ||
2961 TESTF(FD_DISK_CHANGED)) {
2962 DPRINT("disk absent or changed during operation\n");
2963 REPEAT;
2965 if (!_floppy) { /* Autodetection */
2966 if (!probing) {
2967 DRS->probed_format = 0;
2968 if (next_valid_format()) {
2969 DPRINT("no autodetectable formats\n");
2970 _floppy = NULL;
2971 REPEAT;
2974 probing = 1;
2975 _floppy =
2976 floppy_type + DP->autodetect[DRS->probed_format];
2977 } else
2978 probing = 0;
2979 errors = &(current_req->errors);
2980 tmp = make_raw_rw_request();
2981 if (tmp < 2) {
2982 request_done(tmp);
2983 continue;
2986 if (TESTF(FD_NEED_TWADDLE))
2987 twaddle();
2988 schedule_bh(floppy_start);
2989 debugt("queue fd request");
2990 return;
2992 #undef REPEAT
2995 static struct cont_t rw_cont = {
2996 .interrupt = rw_interrupt,
2997 .redo = redo_fd_request,
2998 .error = bad_flp_intr,
2999 .done = request_done
3002 static void process_fd_request(void)
3004 cont = &rw_cont;
3005 schedule_bh(redo_fd_request);
3008 static void do_fd_request(request_queue_t * q)
3010 if (max_buffer_sectors == 0) {
3011 printk("VFS: do_fd_request called on non-open device\n");
3012 return;
3015 if (usage_count == 0) {
3016 printk("warning: usage count=0, current_req=%p exiting\n",
3017 current_req);
3018 printk("sect=%ld flags=%lx\n", (long)current_req->sector,
3019 current_req->flags);
3020 return;
3022 if (test_bit(0, &fdc_busy)) {
3023 /* fdc busy, this new request will be treated when the
3024 current one is done */
3025 is_alive("do fd request, old request running");
3026 return;
3028 lock_fdc(MAXTIMEOUT, 0);
3029 process_fd_request();
3030 is_alive("do fd request");
3033 static struct cont_t poll_cont = {
3034 .interrupt = success_and_wakeup,
3035 .redo = floppy_ready,
3036 .error = generic_failure,
3037 .done = generic_done
3040 static int poll_drive(int interruptible, int flag)
3042 int ret;
3043 /* no auto-sense, just clear dcl */
3044 raw_cmd = &default_raw_cmd;
3045 raw_cmd->flags = flag;
3046 raw_cmd->track = 0;
3047 raw_cmd->cmd_count = 0;
3048 cont = &poll_cont;
3049 #ifdef DCL_DEBUG
3050 if (DP->flags & FD_DEBUG) {
3051 DPRINT("setting NEWCHANGE in poll_drive\n");
3053 #endif
3054 SETF(FD_DISK_NEWCHANGE);
3055 WAIT(floppy_ready);
3056 return ret;
3060 * User triggered reset
3061 * ====================
3064 static void reset_intr(void)
3066 printk("weird, reset interrupt called\n");
3069 static struct cont_t reset_cont = {
3070 .interrupt = reset_intr,
3071 .redo = success_and_wakeup,
3072 .error = generic_failure,
3073 .done = generic_done
3076 static int user_reset_fdc(int drive, int arg, int interruptible)
3078 int ret;
3080 ret = 0;
3081 LOCK_FDC(drive, interruptible);
3082 if (arg == FD_RESET_ALWAYS)
3083 FDCS->reset = 1;
3084 if (FDCS->reset) {
3085 cont = &reset_cont;
3086 WAIT(reset_fdc);
3088 process_fd_request();
3089 return ret;
3093 * Misc Ioctl's and support
3094 * ========================
3096 static inline int fd_copyout(void __user *param, const void *address,
3097 unsigned long size)
3099 return copy_to_user(param, address, size) ? -EFAULT : 0;
3102 static inline int fd_copyin(void __user *param, void *address, unsigned long size)
3104 return copy_from_user(address, param, size) ? -EFAULT : 0;
3107 #define _COPYOUT(x) (copy_to_user((void __user *)param, &(x), sizeof(x)) ? -EFAULT : 0)
3108 #define _COPYIN(x) (copy_from_user(&(x), (void __user *)param, sizeof(x)) ? -EFAULT : 0)
3110 #define COPYOUT(x) ECALL(_COPYOUT(x))
3111 #define COPYIN(x) ECALL(_COPYIN(x))
3113 static inline const char *drive_name(int type, int drive)
3115 struct floppy_struct *floppy;
3117 if (type)
3118 floppy = floppy_type + type;
3119 else {
3120 if (UDP->native_format)
3121 floppy = floppy_type + UDP->native_format;
3122 else
3123 return "(null)";
3125 if (floppy->name)
3126 return floppy->name;
3127 else
3128 return "(null)";
3131 /* raw commands */
3132 static void raw_cmd_done(int flag)
3134 int i;
3136 if (!flag) {
3137 raw_cmd->flags |= FD_RAW_FAILURE;
3138 raw_cmd->flags |= FD_RAW_HARDFAILURE;
3139 } else {
3140 raw_cmd->reply_count = inr;
3141 if (raw_cmd->reply_count > MAX_REPLIES)
3142 raw_cmd->reply_count = 0;
3143 for (i = 0; i < raw_cmd->reply_count; i++)
3144 raw_cmd->reply[i] = reply_buffer[i];
3146 if (raw_cmd->flags & (FD_RAW_READ | FD_RAW_WRITE)) {
3147 unsigned long flags;
3148 flags = claim_dma_lock();
3149 raw_cmd->length = fd_get_dma_residue();
3150 release_dma_lock(flags);
3153 if ((raw_cmd->flags & FD_RAW_SOFTFAILURE) &&
3154 (!raw_cmd->reply_count || (raw_cmd->reply[0] & 0xc0)))
3155 raw_cmd->flags |= FD_RAW_FAILURE;
3157 if (disk_change(current_drive))
3158 raw_cmd->flags |= FD_RAW_DISK_CHANGE;
3159 else
3160 raw_cmd->flags &= ~FD_RAW_DISK_CHANGE;
3161 if (raw_cmd->flags & FD_RAW_NO_MOTOR_AFTER)
3162 motor_off_callback(current_drive);
3164 if (raw_cmd->next &&
3165 (!(raw_cmd->flags & FD_RAW_FAILURE) ||
3166 !(raw_cmd->flags & FD_RAW_STOP_IF_FAILURE)) &&
3167 ((raw_cmd->flags & FD_RAW_FAILURE) ||
3168 !(raw_cmd->flags & FD_RAW_STOP_IF_SUCCESS))) {
3169 raw_cmd = raw_cmd->next;
3170 return;
3173 generic_done(flag);
3176 static struct cont_t raw_cmd_cont = {
3177 .interrupt = success_and_wakeup,
3178 .redo = floppy_start,
3179 .error = generic_failure,
3180 .done = raw_cmd_done
3183 static inline int raw_cmd_copyout(int cmd, char __user *param,
3184 struct floppy_raw_cmd *ptr)
3186 int ret;
3188 while (ptr) {
3189 COPYOUT(*ptr);
3190 param += sizeof(struct floppy_raw_cmd);
3191 if ((ptr->flags & FD_RAW_READ) && ptr->buffer_length) {
3192 if (ptr->length >= 0
3193 && ptr->length <= ptr->buffer_length)
3194 ECALL(fd_copyout
3195 (ptr->data, ptr->kernel_data,
3196 ptr->buffer_length - ptr->length));
3198 ptr = ptr->next;
3200 return 0;
3203 static void raw_cmd_free(struct floppy_raw_cmd **ptr)
3205 struct floppy_raw_cmd *next, *this;
3207 this = *ptr;
3208 *ptr = NULL;
3209 while (this) {
3210 if (this->buffer_length) {
3211 fd_dma_mem_free((unsigned long)this->kernel_data,
3212 this->buffer_length);
3213 this->buffer_length = 0;
3215 next = this->next;
3216 kfree(this);
3217 this = next;
3221 static inline int raw_cmd_copyin(int cmd, char __user *param,
3222 struct floppy_raw_cmd **rcmd)
3224 struct floppy_raw_cmd *ptr;
3225 int ret;
3226 int i;
3228 *rcmd = NULL;
3229 while (1) {
3230 ptr = (struct floppy_raw_cmd *)
3231 kmalloc(sizeof(struct floppy_raw_cmd), GFP_USER);
3232 if (!ptr)
3233 return -ENOMEM;
3234 *rcmd = ptr;
3235 COPYIN(*ptr);
3236 ptr->next = NULL;
3237 ptr->buffer_length = 0;
3238 param += sizeof(struct floppy_raw_cmd);
3239 if (ptr->cmd_count > 33)
3240 /* the command may now also take up the space
3241 * initially intended for the reply & the
3242 * reply count. Needed for long 82078 commands
3243 * such as RESTORE, which takes ... 17 command
3244 * bytes. Murphy's law #137: When you reserve
3245 * 16 bytes for a structure, you'll one day
3246 * discover that you really need 17...
3248 return -EINVAL;
3250 for (i = 0; i < 16; i++)
3251 ptr->reply[i] = 0;
3252 ptr->resultcode = 0;
3253 ptr->kernel_data = NULL;
3255 if (ptr->flags & (FD_RAW_READ | FD_RAW_WRITE)) {
3256 if (ptr->length <= 0)
3257 return -EINVAL;
3258 ptr->kernel_data =
3259 (char *)fd_dma_mem_alloc(ptr->length);
3260 fallback_on_nodma_alloc(&ptr->kernel_data, ptr->length);
3261 if (!ptr->kernel_data)
3262 return -ENOMEM;
3263 ptr->buffer_length = ptr->length;
3265 if (ptr->flags & FD_RAW_WRITE)
3266 ECALL(fd_copyin(ptr->data, ptr->kernel_data,
3267 ptr->length));
3268 rcmd = &(ptr->next);
3269 if (!(ptr->flags & FD_RAW_MORE))
3270 return 0;
3271 ptr->rate &= 0x43;
3275 static int raw_cmd_ioctl(int cmd, void __user *param)
3277 int drive, ret, ret2;
3278 struct floppy_raw_cmd *my_raw_cmd;
3280 if (FDCS->rawcmd <= 1)
3281 FDCS->rawcmd = 1;
3282 for (drive = 0; drive < N_DRIVE; drive++) {
3283 if (FDC(drive) != fdc)
3284 continue;
3285 if (drive == current_drive) {
3286 if (UDRS->fd_ref > 1) {
3287 FDCS->rawcmd = 2;
3288 break;
3290 } else if (UDRS->fd_ref) {
3291 FDCS->rawcmd = 2;
3292 break;
3296 if (FDCS->reset)
3297 return -EIO;
3299 ret = raw_cmd_copyin(cmd, param, &my_raw_cmd);
3300 if (ret) {
3301 raw_cmd_free(&my_raw_cmd);
3302 return ret;
3305 raw_cmd = my_raw_cmd;
3306 cont = &raw_cmd_cont;
3307 ret = wait_til_done(floppy_start, 1);
3308 #ifdef DCL_DEBUG
3309 if (DP->flags & FD_DEBUG) {
3310 DPRINT("calling disk change from raw_cmd ioctl\n");
3312 #endif
3314 if (ret != -EINTR && FDCS->reset)
3315 ret = -EIO;
3317 DRS->track = NO_TRACK;
3319 ret2 = raw_cmd_copyout(cmd, param, my_raw_cmd);
3320 if (!ret)
3321 ret = ret2;
3322 raw_cmd_free(&my_raw_cmd);
3323 return ret;
3326 static int invalidate_drive(struct block_device *bdev)
3328 /* invalidate the buffer track to force a reread */
3329 set_bit((long)bdev->bd_disk->private_data, &fake_change);
3330 process_fd_request();
3331 check_disk_change(bdev);
3332 return 0;
3335 static inline int set_geometry(unsigned int cmd, struct floppy_struct *g,
3336 int drive, int type, struct block_device *bdev)
3338 int cnt;
3340 /* sanity checking for parameters. */
3341 if (g->sect <= 0 ||
3342 g->head <= 0 ||
3343 g->track <= 0 || g->track > UDP->tracks >> STRETCH(g) ||
3344 /* check if reserved bits are set */
3345 (g->stretch & ~(FD_STRETCH | FD_SWAPSIDES | FD_ZEROBASED)) != 0)
3346 return -EINVAL;
3347 if (type) {
3348 if (!capable(CAP_SYS_ADMIN))
3349 return -EPERM;
3350 mutex_lock(&open_lock);
3351 LOCK_FDC(drive, 1);
3352 floppy_type[type] = *g;
3353 floppy_type[type].name = "user format";
3354 for (cnt = type << 2; cnt < (type << 2) + 4; cnt++)
3355 floppy_sizes[cnt] = floppy_sizes[cnt + 0x80] =
3356 floppy_type[type].size + 1;
3357 process_fd_request();
3358 for (cnt = 0; cnt < N_DRIVE; cnt++) {
3359 struct block_device *bdev = opened_bdev[cnt];
3360 if (!bdev || ITYPE(drive_state[cnt].fd_device) != type)
3361 continue;
3362 __invalidate_device(bdev);
3364 mutex_unlock(&open_lock);
3365 } else {
3366 int oldStretch;
3367 LOCK_FDC(drive, 1);
3368 if (cmd != FDDEFPRM)
3369 /* notice a disk change immediately, else
3370 * we lose our settings immediately*/
3371 CALL(poll_drive(1, FD_RAW_NEED_DISK));
3372 oldStretch = g->stretch;
3373 user_params[drive] = *g;
3374 if (buffer_drive == drive)
3375 SUPBOUND(buffer_max, user_params[drive].sect);
3376 current_type[drive] = &user_params[drive];
3377 floppy_sizes[drive] = user_params[drive].size;
3378 if (cmd == FDDEFPRM)
3379 DRS->keep_data = -1;
3380 else
3381 DRS->keep_data = 1;
3382 /* invalidation. Invalidate only when needed, i.e.
3383 * when there are already sectors in the buffer cache
3384 * whose number will change. This is useful, because
3385 * mtools often changes the geometry of the disk after
3386 * looking at the boot block */
3387 if (DRS->maxblock > user_params[drive].sect ||
3388 DRS->maxtrack ||
3389 ((user_params[drive].sect ^ oldStretch) &
3390 (FD_SWAPSIDES | FD_ZEROBASED)))
3391 invalidate_drive(bdev);
3392 else
3393 process_fd_request();
3395 return 0;
3398 /* handle obsolete ioctl's */
3399 static int ioctl_table[] = {
3400 FDCLRPRM,
3401 FDSETPRM,
3402 FDDEFPRM,
3403 FDGETPRM,
3404 FDMSGON,
3405 FDMSGOFF,
3406 FDFMTBEG,
3407 FDFMTTRK,
3408 FDFMTEND,
3409 FDSETEMSGTRESH,
3410 FDFLUSH,
3411 FDSETMAXERRS,
3412 FDGETMAXERRS,
3413 FDGETDRVTYP,
3414 FDSETDRVPRM,
3415 FDGETDRVPRM,
3416 FDGETDRVSTAT,
3417 FDPOLLDRVSTAT,
3418 FDRESET,
3419 FDGETFDCSTAT,
3420 FDWERRORCLR,
3421 FDWERRORGET,
3422 FDRAWCMD,
3423 FDEJECT,
3424 FDTWADDLE
3427 static inline int normalize_ioctl(int *cmd, int *size)
3429 int i;
3431 for (i = 0; i < ARRAY_SIZE(ioctl_table); i++) {
3432 if ((*cmd & 0xffff) == (ioctl_table[i] & 0xffff)) {
3433 *size = _IOC_SIZE(*cmd);
3434 *cmd = ioctl_table[i];
3435 if (*size > _IOC_SIZE(*cmd)) {
3436 printk("ioctl not yet supported\n");
3437 return -EFAULT;
3439 return 0;
3442 return -EINVAL;
3445 static int get_floppy_geometry(int drive, int type, struct floppy_struct **g)
3447 if (type)
3448 *g = &floppy_type[type];
3449 else {
3450 LOCK_FDC(drive, 0);
3451 CALL(poll_drive(0, 0));
3452 process_fd_request();
3453 *g = current_type[drive];
3455 if (!*g)
3456 return -ENODEV;
3457 return 0;
3460 static int fd_getgeo(struct block_device *bdev, struct hd_geometry *geo)
3462 int drive = (long)bdev->bd_disk->private_data;
3463 int type = ITYPE(drive_state[drive].fd_device);
3464 struct floppy_struct *g;
3465 int ret;
3467 ret = get_floppy_geometry(drive, type, &g);
3468 if (ret)
3469 return ret;
3471 geo->heads = g->head;
3472 geo->sectors = g->sect;
3473 geo->cylinders = g->track;
3474 return 0;
3477 static int fd_ioctl(struct inode *inode, struct file *filp, unsigned int cmd,
3478 unsigned long param)
3480 #define FD_IOCTL_ALLOWED ((filp) && (filp)->private_data)
3481 #define OUT(c,x) case c: outparam = (const char *) (x); break
3482 #define IN(c,x,tag) case c: *(x) = inparam. tag ; return 0
3484 int drive = (long)inode->i_bdev->bd_disk->private_data;
3485 int i, type = ITYPE(UDRS->fd_device);
3486 int ret;
3487 int size;
3488 union inparam {
3489 struct floppy_struct g; /* geometry */
3490 struct format_descr f;
3491 struct floppy_max_errors max_errors;
3492 struct floppy_drive_params dp;
3493 } inparam; /* parameters coming from user space */
3494 const char *outparam; /* parameters passed back to user space */
3496 /* convert compatibility eject ioctls into floppy eject ioctl.
3497 * We do this in order to provide a means to eject floppy disks before
3498 * installing the new fdutils package */
3499 if (cmd == CDROMEJECT || /* CD-ROM eject */
3500 cmd == 0x6470 /* SunOS floppy eject */ ) {
3501 DPRINT("obsolete eject ioctl\n");
3502 DPRINT("please use floppycontrol --eject\n");
3503 cmd = FDEJECT;
3506 /* convert the old style command into a new style command */
3507 if ((cmd & 0xff00) == 0x0200) {
3508 ECALL(normalize_ioctl(&cmd, &size));
3509 } else
3510 return -EINVAL;
3512 /* permission checks */
3513 if (((cmd & 0x40) && !FD_IOCTL_ALLOWED) ||
3514 ((cmd & 0x80) && !capable(CAP_SYS_ADMIN)))
3515 return -EPERM;
3517 /* copyin */
3518 CLEARSTRUCT(&inparam);
3519 if (_IOC_DIR(cmd) & _IOC_WRITE)
3520 ECALL(fd_copyin((void __user *)param, &inparam, size))
3522 switch (cmd) {
3523 case FDEJECT:
3524 if (UDRS->fd_ref != 1)
3525 /* somebody else has this drive open */
3526 return -EBUSY;
3527 LOCK_FDC(drive, 1);
3529 /* do the actual eject. Fails on
3530 * non-Sparc architectures */
3531 ret = fd_eject(UNIT(drive));
3533 USETF(FD_DISK_CHANGED);
3534 USETF(FD_VERIFY);
3535 process_fd_request();
3536 return ret;
3537 case FDCLRPRM:
3538 LOCK_FDC(drive, 1);
3539 current_type[drive] = NULL;
3540 floppy_sizes[drive] = MAX_DISK_SIZE << 1;
3541 UDRS->keep_data = 0;
3542 return invalidate_drive(inode->i_bdev);
3543 case FDSETPRM:
3544 case FDDEFPRM:
3545 return set_geometry(cmd, &inparam.g,
3546 drive, type, inode->i_bdev);
3547 case FDGETPRM:
3548 ECALL(get_floppy_geometry(drive, type,
3549 (struct floppy_struct **)
3550 &outparam));
3551 break;
3553 case FDMSGON:
3554 UDP->flags |= FTD_MSG;
3555 return 0;
3556 case FDMSGOFF:
3557 UDP->flags &= ~FTD_MSG;
3558 return 0;
3560 case FDFMTBEG:
3561 LOCK_FDC(drive, 1);
3562 CALL(poll_drive(1, FD_RAW_NEED_DISK));
3563 ret = UDRS->flags;
3564 process_fd_request();
3565 if (ret & FD_VERIFY)
3566 return -ENODEV;
3567 if (!(ret & FD_DISK_WRITABLE))
3568 return -EROFS;
3569 return 0;
3570 case FDFMTTRK:
3571 if (UDRS->fd_ref != 1)
3572 return -EBUSY;
3573 return do_format(drive, &inparam.f);
3574 case FDFMTEND:
3575 case FDFLUSH:
3576 LOCK_FDC(drive, 1);
3577 return invalidate_drive(inode->i_bdev);
3579 case FDSETEMSGTRESH:
3580 UDP->max_errors.reporting =
3581 (unsigned short)(param & 0x0f);
3582 return 0;
3583 OUT(FDGETMAXERRS, &UDP->max_errors);
3584 IN(FDSETMAXERRS, &UDP->max_errors, max_errors);
3586 case FDGETDRVTYP:
3587 outparam = drive_name(type, drive);
3588 SUPBOUND(size, strlen(outparam) + 1);
3589 break;
3591 IN(FDSETDRVPRM, UDP, dp);
3592 OUT(FDGETDRVPRM, UDP);
3594 case FDPOLLDRVSTAT:
3595 LOCK_FDC(drive, 1);
3596 CALL(poll_drive(1, FD_RAW_NEED_DISK));
3597 process_fd_request();
3598 /* fall through */
3599 OUT(FDGETDRVSTAT, UDRS);
3601 case FDRESET:
3602 return user_reset_fdc(drive, (int)param, 1);
3604 OUT(FDGETFDCSTAT, UFDCS);
3606 case FDWERRORCLR:
3607 CLEARSTRUCT(UDRWE);
3608 return 0;
3609 OUT(FDWERRORGET, UDRWE);
3611 case FDRAWCMD:
3612 if (type)
3613 return -EINVAL;
3614 LOCK_FDC(drive, 1);
3615 set_floppy(drive);
3616 CALL(i = raw_cmd_ioctl(cmd, (void __user *)param));
3617 process_fd_request();
3618 return i;
3620 case FDTWADDLE:
3621 LOCK_FDC(drive, 1);
3622 twaddle();
3623 process_fd_request();
3624 return 0;
3626 default:
3627 return -EINVAL;
3630 if (_IOC_DIR(cmd) & _IOC_READ)
3631 return fd_copyout((void __user *)param, outparam, size);
3632 else
3633 return 0;
3634 #undef OUT
3635 #undef IN
3638 static void __init config_types(void)
3640 int first = 1;
3641 int drive;
3643 /* read drive info out of physical CMOS */
3644 drive = 0;
3645 if (!UDP->cmos)
3646 UDP->cmos = FLOPPY0_TYPE;
3647 drive = 1;
3648 if (!UDP->cmos && FLOPPY1_TYPE)
3649 UDP->cmos = FLOPPY1_TYPE;
3651 /* XXX */
3652 /* additional physical CMOS drive detection should go here */
3654 for (drive = 0; drive < N_DRIVE; drive++) {
3655 unsigned int type = UDP->cmos;
3656 struct floppy_drive_params *params;
3657 const char *name = NULL;
3658 static char temparea[32];
3660 if (type < ARRAY_SIZE(default_drive_params)) {
3661 params = &default_drive_params[type].params;
3662 if (type) {
3663 name = default_drive_params[type].name;
3664 allowed_drive_mask |= 1 << drive;
3665 } else
3666 allowed_drive_mask &= ~(1 << drive);
3667 } else {
3668 params = &default_drive_params[0].params;
3669 sprintf(temparea, "unknown type %d (usb?)", type);
3670 name = temparea;
3672 if (name) {
3673 const char *prepend = ",";
3674 if (first) {
3675 prepend = KERN_INFO "Floppy drive(s):";
3676 first = 0;
3678 printk("%s fd%d is %s", prepend, drive, name);
3679 register_devfs_entries(drive);
3681 *UDP = *params;
3683 if (!first)
3684 printk("\n");
3687 static int floppy_release(struct inode *inode, struct file *filp)
3689 int drive = (long)inode->i_bdev->bd_disk->private_data;
3691 mutex_lock(&open_lock);
3692 if (UDRS->fd_ref < 0)
3693 UDRS->fd_ref = 0;
3694 else if (!UDRS->fd_ref--) {
3695 DPRINT("floppy_release with fd_ref == 0");
3696 UDRS->fd_ref = 0;
3698 if (!UDRS->fd_ref)
3699 opened_bdev[drive] = NULL;
3700 floppy_release_irq_and_dma();
3701 mutex_unlock(&open_lock);
3702 return 0;
3706 * floppy_open check for aliasing (/dev/fd0 can be the same as
3707 * /dev/PS0 etc), and disallows simultaneous access to the same
3708 * drive with different device numbers.
3710 static int floppy_open(struct inode *inode, struct file *filp)
3712 int drive = (long)inode->i_bdev->bd_disk->private_data;
3713 int old_dev;
3714 int try;
3715 int res = -EBUSY;
3716 char *tmp;
3718 filp->private_data = (void *)0;
3719 mutex_lock(&open_lock);
3720 old_dev = UDRS->fd_device;
3721 if (opened_bdev[drive] && opened_bdev[drive] != inode->i_bdev)
3722 goto out2;
3724 if (!UDRS->fd_ref && (UDP->flags & FD_BROKEN_DCL)) {
3725 USETF(FD_DISK_CHANGED);
3726 USETF(FD_VERIFY);
3729 if (UDRS->fd_ref == -1 || (UDRS->fd_ref && (filp->f_flags & O_EXCL)))
3730 goto out2;
3732 if (floppy_grab_irq_and_dma())
3733 goto out2;
3735 if (filp->f_flags & O_EXCL)
3736 UDRS->fd_ref = -1;
3737 else
3738 UDRS->fd_ref++;
3740 opened_bdev[drive] = inode->i_bdev;
3742 res = -ENXIO;
3744 if (!floppy_track_buffer) {
3745 /* if opening an ED drive, reserve a big buffer,
3746 * else reserve a small one */
3747 if ((UDP->cmos == 6) || (UDP->cmos == 5))
3748 try = 64; /* Only 48 actually useful */
3749 else
3750 try = 32; /* Only 24 actually useful */
3752 tmp = (char *)fd_dma_mem_alloc(1024 * try);
3753 if (!tmp && !floppy_track_buffer) {
3754 try >>= 1; /* buffer only one side */
3755 INFBOUND(try, 16);
3756 tmp = (char *)fd_dma_mem_alloc(1024 * try);
3758 if (!tmp && !floppy_track_buffer) {
3759 fallback_on_nodma_alloc(&tmp, 2048 * try);
3761 if (!tmp && !floppy_track_buffer) {
3762 DPRINT("Unable to allocate DMA memory\n");
3763 goto out;
3765 if (floppy_track_buffer) {
3766 if (tmp)
3767 fd_dma_mem_free((unsigned long)tmp, try * 1024);
3768 } else {
3769 buffer_min = buffer_max = -1;
3770 floppy_track_buffer = tmp;
3771 max_buffer_sectors = try;
3775 UDRS->fd_device = iminor(inode);
3776 set_capacity(disks[drive], floppy_sizes[iminor(inode)]);
3777 if (old_dev != -1 && old_dev != iminor(inode)) {
3778 if (buffer_drive == drive)
3779 buffer_track = -1;
3782 /* Allow ioctls if we have write-permissions even if read-only open.
3783 * Needed so that programs such as fdrawcmd still can work on write
3784 * protected disks */
3785 if ((filp->f_mode & FMODE_WRITE) || !file_permission(filp, MAY_WRITE))
3786 filp->private_data = (void *)8;
3788 if (UFDCS->rawcmd == 1)
3789 UFDCS->rawcmd = 2;
3791 if (!(filp->f_flags & O_NDELAY)) {
3792 if (filp->f_mode & 3) {
3793 UDRS->last_checked = 0;
3794 check_disk_change(inode->i_bdev);
3795 if (UTESTF(FD_DISK_CHANGED))
3796 goto out;
3798 res = -EROFS;
3799 if ((filp->f_mode & 2) && !(UTESTF(FD_DISK_WRITABLE)))
3800 goto out;
3802 mutex_unlock(&open_lock);
3803 return 0;
3804 out:
3805 if (UDRS->fd_ref < 0)
3806 UDRS->fd_ref = 0;
3807 else
3808 UDRS->fd_ref--;
3809 if (!UDRS->fd_ref)
3810 opened_bdev[drive] = NULL;
3811 floppy_release_irq_and_dma();
3812 out2:
3813 mutex_unlock(&open_lock);
3814 return res;
3818 * Check if the disk has been changed or if a change has been faked.
3820 static int check_floppy_change(struct gendisk *disk)
3822 int drive = (long)disk->private_data;
3824 if (UTESTF(FD_DISK_CHANGED) || UTESTF(FD_VERIFY))
3825 return 1;
3827 if (time_after(jiffies, UDRS->last_checked + UDP->checkfreq)) {
3828 if (floppy_grab_irq_and_dma()) {
3829 return 1;
3832 lock_fdc(drive, 0);
3833 poll_drive(0, 0);
3834 process_fd_request();
3835 floppy_release_irq_and_dma();
3838 if (UTESTF(FD_DISK_CHANGED) ||
3839 UTESTF(FD_VERIFY) ||
3840 test_bit(drive, &fake_change) ||
3841 (!ITYPE(UDRS->fd_device) && !current_type[drive]))
3842 return 1;
3843 return 0;
3847 * This implements "read block 0" for floppy_revalidate().
3848 * Needed for format autodetection, checking whether there is
3849 * a disk in the drive, and whether that disk is writable.
3852 static int floppy_rb0_complete(struct bio *bio, unsigned int bytes_done,
3853 int err)
3855 if (bio->bi_size)
3856 return 1;
3858 complete((struct completion *)bio->bi_private);
3859 return 0;
3862 static int __floppy_read_block_0(struct block_device *bdev)
3864 struct bio bio;
3865 struct bio_vec bio_vec;
3866 struct completion complete;
3867 struct page *page;
3868 size_t size;
3870 page = alloc_page(GFP_NOIO);
3871 if (!page) {
3872 process_fd_request();
3873 return -ENOMEM;
3876 size = bdev->bd_block_size;
3877 if (!size)
3878 size = 1024;
3880 bio_init(&bio);
3881 bio.bi_io_vec = &bio_vec;
3882 bio_vec.bv_page = page;
3883 bio_vec.bv_len = size;
3884 bio_vec.bv_offset = 0;
3885 bio.bi_vcnt = 1;
3886 bio.bi_idx = 0;
3887 bio.bi_size = size;
3888 bio.bi_bdev = bdev;
3889 bio.bi_sector = 0;
3890 init_completion(&complete);
3891 bio.bi_private = &complete;
3892 bio.bi_end_io = floppy_rb0_complete;
3894 submit_bio(READ, &bio);
3895 generic_unplug_device(bdev_get_queue(bdev));
3896 process_fd_request();
3897 wait_for_completion(&complete);
3899 __free_page(page);
3901 return 0;
3904 /* revalidate the floppy disk, i.e. trigger format autodetection by reading
3905 * the bootblock (block 0). "Autodetection" is also needed to check whether
3906 * there is a disk in the drive at all... Thus we also do it for fixed
3907 * geometry formats */
3908 static int floppy_revalidate(struct gendisk *disk)
3910 int drive = (long)disk->private_data;
3911 #define NO_GEOM (!current_type[drive] && !ITYPE(UDRS->fd_device))
3912 int cf;
3913 int res = 0;
3915 if (UTESTF(FD_DISK_CHANGED) ||
3916 UTESTF(FD_VERIFY) || test_bit(drive, &fake_change) || NO_GEOM) {
3917 if (usage_count == 0) {
3918 printk("VFS: revalidate called on non-open device.\n");
3919 return -EFAULT;
3921 lock_fdc(drive, 0);
3922 cf = UTESTF(FD_DISK_CHANGED) || UTESTF(FD_VERIFY);
3923 if (!(cf || test_bit(drive, &fake_change) || NO_GEOM)) {
3924 process_fd_request(); /*already done by another thread */
3925 return 0;
3927 UDRS->maxblock = 0;
3928 UDRS->maxtrack = 0;
3929 if (buffer_drive == drive)
3930 buffer_track = -1;
3931 clear_bit(drive, &fake_change);
3932 UCLEARF(FD_DISK_CHANGED);
3933 if (cf)
3934 UDRS->generation++;
3935 if (NO_GEOM) {
3936 /* auto-sensing */
3937 res = __floppy_read_block_0(opened_bdev[drive]);
3938 } else {
3939 if (cf)
3940 poll_drive(0, FD_RAW_NEED_DISK);
3941 process_fd_request();
3944 set_capacity(disk, floppy_sizes[UDRS->fd_device]);
3945 return res;
3948 static struct block_device_operations floppy_fops = {
3949 .owner = THIS_MODULE,
3950 .open = floppy_open,
3951 .release = floppy_release,
3952 .ioctl = fd_ioctl,
3953 .getgeo = fd_getgeo,
3954 .media_changed = check_floppy_change,
3955 .revalidate_disk = floppy_revalidate,
3957 static char *table[] = {
3958 "", "d360", "h1200", "u360", "u720", "h360", "h720",
3959 "u1440", "u2880", "CompaQ", "h1440", "u1680", "h410",
3960 "u820", "h1476", "u1722", "h420", "u830", "h1494", "u1743",
3961 "h880", "u1040", "u1120", "h1600", "u1760", "u1920",
3962 "u3200", "u3520", "u3840", "u1840", "u800", "u1600",
3963 NULL
3965 static int t360[] = { 1, 0 },
3966 t1200[] = { 2, 5, 6, 10, 12, 14, 16, 18, 20, 23, 0 },
3967 t3in[] = { 8, 9, 26, 27, 28, 7, 11, 15, 19, 24, 25, 29, 31, 3, 4, 13,
3968 17, 21, 22, 30, 0 };
3969 static int *table_sup[] =
3970 { NULL, t360, t1200, t3in + 5 + 8, t3in + 5, t3in, t3in };
3972 static void __init register_devfs_entries(int drive)
3974 int base_minor = (drive < 4) ? drive : (124 + drive);
3976 if (UDP->cmos < ARRAY_SIZE(default_drive_params)) {
3977 int i = 0;
3978 do {
3979 int minor = base_minor + (table_sup[UDP->cmos][i] << 2);
3981 devfs_mk_bdev(MKDEV(FLOPPY_MAJOR, minor),
3982 S_IFBLK | S_IRUSR | S_IWUSR | S_IRGRP |
3983 S_IWGRP, "floppy/%d%s", drive,
3984 table[table_sup[UDP->cmos][i]]);
3985 } while (table_sup[UDP->cmos][i++]);
3990 * Floppy Driver initialization
3991 * =============================
3994 /* Determine the floppy disk controller type */
3995 /* This routine was written by David C. Niemi */
3996 static char __init get_fdc_version(void)
3998 int r;
4000 output_byte(FD_DUMPREGS); /* 82072 and better know DUMPREGS */
4001 if (FDCS->reset)
4002 return FDC_NONE;
4003 if ((r = result()) <= 0x00)
4004 return FDC_NONE; /* No FDC present ??? */
4005 if ((r == 1) && (reply_buffer[0] == 0x80)) {
4006 printk(KERN_INFO "FDC %d is an 8272A\n", fdc);
4007 return FDC_8272A; /* 8272a/765 don't know DUMPREGS */
4009 if (r != 10) {
4010 printk
4011 ("FDC %d init: DUMPREGS: unexpected return of %d bytes.\n",
4012 fdc, r);
4013 return FDC_UNKNOWN;
4016 if (!fdc_configure()) {
4017 printk(KERN_INFO "FDC %d is an 82072\n", fdc);
4018 return FDC_82072; /* 82072 doesn't know CONFIGURE */
4021 output_byte(FD_PERPENDICULAR);
4022 if (need_more_output() == MORE_OUTPUT) {
4023 output_byte(0);
4024 } else {
4025 printk(KERN_INFO "FDC %d is an 82072A\n", fdc);
4026 return FDC_82072A; /* 82072A as found on Sparcs. */
4029 output_byte(FD_UNLOCK);
4030 r = result();
4031 if ((r == 1) && (reply_buffer[0] == 0x80)) {
4032 printk(KERN_INFO "FDC %d is a pre-1991 82077\n", fdc);
4033 return FDC_82077_ORIG; /* Pre-1991 82077, doesn't know
4034 * LOCK/UNLOCK */
4036 if ((r != 1) || (reply_buffer[0] != 0x00)) {
4037 printk("FDC %d init: UNLOCK: unexpected return of %d bytes.\n",
4038 fdc, r);
4039 return FDC_UNKNOWN;
4041 output_byte(FD_PARTID);
4042 r = result();
4043 if (r != 1) {
4044 printk("FDC %d init: PARTID: unexpected return of %d bytes.\n",
4045 fdc, r);
4046 return FDC_UNKNOWN;
4048 if (reply_buffer[0] == 0x80) {
4049 printk(KERN_INFO "FDC %d is a post-1991 82077\n", fdc);
4050 return FDC_82077; /* Revised 82077AA passes all the tests */
4052 switch (reply_buffer[0] >> 5) {
4053 case 0x0:
4054 /* Either a 82078-1 or a 82078SL running at 5Volt */
4055 printk(KERN_INFO "FDC %d is an 82078.\n", fdc);
4056 return FDC_82078;
4057 case 0x1:
4058 printk(KERN_INFO "FDC %d is a 44pin 82078\n", fdc);
4059 return FDC_82078;
4060 case 0x2:
4061 printk(KERN_INFO "FDC %d is a S82078B\n", fdc);
4062 return FDC_S82078B;
4063 case 0x3:
4064 printk(KERN_INFO "FDC %d is a National Semiconductor PC87306\n",
4065 fdc);
4066 return FDC_87306;
4067 default:
4068 printk(KERN_INFO
4069 "FDC %d init: 82078 variant with unknown PARTID=%d.\n",
4070 fdc, reply_buffer[0] >> 5);
4071 return FDC_82078_UNKN;
4073 } /* get_fdc_version */
4075 /* lilo configuration */
4077 static void __init floppy_set_flags(int *ints, int param, int param2)
4079 int i;
4081 for (i = 0; i < ARRAY_SIZE(default_drive_params); i++) {
4082 if (param)
4083 default_drive_params[i].params.flags |= param2;
4084 else
4085 default_drive_params[i].params.flags &= ~param2;
4087 DPRINT("%s flag 0x%x\n", param2 ? "Setting" : "Clearing", param);
4090 static void __init daring(int *ints, int param, int param2)
4092 int i;
4094 for (i = 0; i < ARRAY_SIZE(default_drive_params); i++) {
4095 if (param) {
4096 default_drive_params[i].params.select_delay = 0;
4097 default_drive_params[i].params.flags |=
4098 FD_SILENT_DCL_CLEAR;
4099 } else {
4100 default_drive_params[i].params.select_delay =
4101 2 * HZ / 100;
4102 default_drive_params[i].params.flags &=
4103 ~FD_SILENT_DCL_CLEAR;
4106 DPRINT("Assuming %s floppy hardware\n", param ? "standard" : "broken");
4109 static void __init set_cmos(int *ints, int dummy, int dummy2)
4111 int current_drive = 0;
4113 if (ints[0] != 2) {
4114 DPRINT("wrong number of parameters for CMOS\n");
4115 return;
4117 current_drive = ints[1];
4118 if (current_drive < 0 || current_drive >= 8) {
4119 DPRINT("bad drive for set_cmos\n");
4120 return;
4122 #if N_FDC > 1
4123 if (current_drive >= 4 && !FDC2)
4124 FDC2 = 0x370;
4125 #endif
4126 DP->cmos = ints[2];
4127 DPRINT("setting CMOS code to %d\n", ints[2]);
4130 static struct param_table {
4131 const char *name;
4132 void (*fn) (int *ints, int param, int param2);
4133 int *var;
4134 int def_param;
4135 int param2;
4136 } config_params[] __initdata = {
4137 {"allowed_drive_mask", NULL, &allowed_drive_mask, 0xff, 0}, /* obsolete */
4138 {"all_drives", NULL, &allowed_drive_mask, 0xff, 0}, /* obsolete */
4139 {"asus_pci", NULL, &allowed_drive_mask, 0x33, 0},
4140 {"irq", NULL, &FLOPPY_IRQ, 6, 0},
4141 {"dma", NULL, &FLOPPY_DMA, 2, 0},
4142 {"daring", daring, NULL, 1, 0},
4143 #if N_FDC > 1
4144 {"two_fdc", NULL, &FDC2, 0x370, 0},
4145 {"one_fdc", NULL, &FDC2, 0, 0},
4146 #endif
4147 {"thinkpad", floppy_set_flags, NULL, 1, FD_INVERTED_DCL},
4148 {"broken_dcl", floppy_set_flags, NULL, 1, FD_BROKEN_DCL},
4149 {"messages", floppy_set_flags, NULL, 1, FTD_MSG},
4150 {"silent_dcl_clear", floppy_set_flags, NULL, 1, FD_SILENT_DCL_CLEAR},
4151 {"debug", floppy_set_flags, NULL, 1, FD_DEBUG},
4152 {"nodma", NULL, &can_use_virtual_dma, 1, 0},
4153 {"omnibook", NULL, &can_use_virtual_dma, 1, 0},
4154 {"yesdma", NULL, &can_use_virtual_dma, 0, 0},
4155 {"fifo_depth", NULL, &fifo_depth, 0xa, 0},
4156 {"nofifo", NULL, &no_fifo, 0x20, 0},
4157 {"usefifo", NULL, &no_fifo, 0, 0},
4158 {"cmos", set_cmos, NULL, 0, 0},
4159 {"slow", NULL, &slow_floppy, 1, 0},
4160 {"unexpected_interrupts", NULL, &print_unex, 1, 0},
4161 {"no_unexpected_interrupts", NULL, &print_unex, 0, 0},
4162 {"L40SX", NULL, &print_unex, 0, 0}
4164 EXTRA_FLOPPY_PARAMS
4167 static int __init floppy_setup(char *str)
4169 int i;
4170 int param;
4171 int ints[11];
4173 str = get_options(str, ARRAY_SIZE(ints), ints);
4174 if (str) {
4175 for (i = 0; i < ARRAY_SIZE(config_params); i++) {
4176 if (strcmp(str, config_params[i].name) == 0) {
4177 if (ints[0])
4178 param = ints[1];
4179 else
4180 param = config_params[i].def_param;
4181 if (config_params[i].fn)
4182 config_params[i].
4183 fn(ints, param,
4184 config_params[i].param2);
4185 if (config_params[i].var) {
4186 DPRINT("%s=%d\n", str, param);
4187 *config_params[i].var = param;
4189 return 1;
4193 if (str) {
4194 DPRINT("unknown floppy option [%s]\n", str);
4196 DPRINT("allowed options are:");
4197 for (i = 0; i < ARRAY_SIZE(config_params); i++)
4198 printk(" %s", config_params[i].name);
4199 printk("\n");
4200 } else
4201 DPRINT("botched floppy option\n");
4202 DPRINT("Read Documentation/floppy.txt\n");
4203 return 0;
4206 static int have_no_fdc = -ENODEV;
4208 static ssize_t floppy_cmos_show(struct device *dev,
4209 struct device_attribute *attr, char *buf)
4211 struct platform_device *p;
4212 int drive;
4214 p = container_of(dev, struct platform_device,dev);
4215 drive = p->id;
4216 return sprintf(buf, "%X\n", UDP->cmos);
4218 DEVICE_ATTR(cmos,S_IRUGO,floppy_cmos_show,NULL);
4220 static void floppy_device_release(struct device *dev)
4222 complete(&device_release);
4225 static struct platform_device floppy_device[N_DRIVE];
4227 static struct kobject *floppy_find(dev_t dev, int *part, void *data)
4229 int drive = (*part & 3) | ((*part & 0x80) >> 5);
4230 if (drive >= N_DRIVE ||
4231 !(allowed_drive_mask & (1 << drive)) ||
4232 fdc_state[FDC(drive)].version == FDC_NONE)
4233 return NULL;
4234 if (((*part >> 2) & 0x1f) >= ARRAY_SIZE(floppy_type))
4235 return NULL;
4236 *part = 0;
4237 return get_disk(disks[drive]);
4240 static int __init floppy_init(void)
4242 int i, unit, drive;
4243 int err, dr;
4245 raw_cmd = NULL;
4247 for (dr = 0; dr < N_DRIVE; dr++) {
4248 disks[dr] = alloc_disk(1);
4249 if (!disks[dr]) {
4250 err = -ENOMEM;
4251 goto out_put_disk;
4254 disks[dr]->major = FLOPPY_MAJOR;
4255 disks[dr]->first_minor = TOMINOR(dr);
4256 disks[dr]->fops = &floppy_fops;
4257 sprintf(disks[dr]->disk_name, "fd%d", dr);
4259 init_timer(&motor_off_timer[dr]);
4260 motor_off_timer[dr].data = dr;
4261 motor_off_timer[dr].function = motor_off_callback;
4264 devfs_mk_dir("floppy");
4266 err = register_blkdev(FLOPPY_MAJOR, "fd");
4267 if (err)
4268 goto out_devfs_remove;
4270 floppy_queue = blk_init_queue(do_fd_request, &floppy_lock);
4271 if (!floppy_queue) {
4272 err = -ENOMEM;
4273 goto out_unreg_blkdev;
4275 blk_queue_max_sectors(floppy_queue, 64);
4277 blk_register_region(MKDEV(FLOPPY_MAJOR, 0), 256, THIS_MODULE,
4278 floppy_find, NULL, NULL);
4280 for (i = 0; i < 256; i++)
4281 if (ITYPE(i))
4282 floppy_sizes[i] = floppy_type[ITYPE(i)].size;
4283 else
4284 floppy_sizes[i] = MAX_DISK_SIZE << 1;
4286 reschedule_timeout(MAXTIMEOUT, "floppy init", MAXTIMEOUT);
4287 config_types();
4289 for (i = 0; i < N_FDC; i++) {
4290 fdc = i;
4291 CLEARSTRUCT(FDCS);
4292 FDCS->dtr = -1;
4293 FDCS->dor = 0x4;
4294 #if defined(__sparc__) || defined(__mc68000__)
4295 /*sparcs/sun3x don't have a DOR reset which we can fall back on to */
4296 #ifdef __mc68000__
4297 if (MACH_IS_SUN3X)
4298 #endif
4299 FDCS->version = FDC_82072A;
4300 #endif
4303 use_virtual_dma = can_use_virtual_dma & 1;
4304 #if defined(CONFIG_PPC_MERGE)
4305 if (check_legacy_ioport(FDC1)) {
4306 del_timer(&fd_timeout);
4307 err = -ENODEV;
4308 goto out_unreg_region;
4310 #endif
4311 fdc_state[0].address = FDC1;
4312 if (fdc_state[0].address == -1) {
4313 del_timer(&fd_timeout);
4314 err = -ENODEV;
4315 goto out_unreg_region;
4317 #if N_FDC > 1
4318 fdc_state[1].address = FDC2;
4319 #endif
4321 fdc = 0; /* reset fdc in case of unexpected interrupt */
4322 err = floppy_grab_irq_and_dma();
4323 if (err) {
4324 del_timer(&fd_timeout);
4325 err = -EBUSY;
4326 goto out_unreg_region;
4329 /* initialise drive state */
4330 for (drive = 0; drive < N_DRIVE; drive++) {
4331 CLEARSTRUCT(UDRS);
4332 CLEARSTRUCT(UDRWE);
4333 USETF(FD_DISK_NEWCHANGE);
4334 USETF(FD_DISK_CHANGED);
4335 USETF(FD_VERIFY);
4336 UDRS->fd_device = -1;
4337 floppy_track_buffer = NULL;
4338 max_buffer_sectors = 0;
4341 * Small 10 msec delay to let through any interrupt that
4342 * initialization might have triggered, to not
4343 * confuse detection:
4345 msleep(10);
4347 for (i = 0; i < N_FDC; i++) {
4348 fdc = i;
4349 FDCS->driver_version = FD_DRIVER_VERSION;
4350 for (unit = 0; unit < 4; unit++)
4351 FDCS->track[unit] = 0;
4352 if (FDCS->address == -1)
4353 continue;
4354 FDCS->rawcmd = 2;
4355 if (user_reset_fdc(-1, FD_RESET_ALWAYS, 0)) {
4356 /* free ioports reserved by floppy_grab_irq_and_dma() */
4357 release_region(FDCS->address + 2, 4);
4358 release_region(FDCS->address + 7, 1);
4359 FDCS->address = -1;
4360 FDCS->version = FDC_NONE;
4361 continue;
4363 /* Try to determine the floppy controller type */
4364 FDCS->version = get_fdc_version();
4365 if (FDCS->version == FDC_NONE) {
4366 /* free ioports reserved by floppy_grab_irq_and_dma() */
4367 release_region(FDCS->address + 2, 4);
4368 release_region(FDCS->address + 7, 1);
4369 FDCS->address = -1;
4370 continue;
4372 if (can_use_virtual_dma == 2 && FDCS->version < FDC_82072A)
4373 can_use_virtual_dma = 0;
4375 have_no_fdc = 0;
4376 /* Not all FDCs seem to be able to handle the version command
4377 * properly, so force a reset for the standard FDC clones,
4378 * to avoid interrupt garbage.
4380 user_reset_fdc(-1, FD_RESET_ALWAYS, 0);
4382 fdc = 0;
4383 del_timer(&fd_timeout);
4384 current_drive = 0;
4385 floppy_release_irq_and_dma();
4386 initialising = 0;
4387 if (have_no_fdc) {
4388 DPRINT("no floppy controllers found\n");
4389 err = have_no_fdc;
4390 goto out_flush_work;
4393 for (drive = 0; drive < N_DRIVE; drive++) {
4394 if (!(allowed_drive_mask & (1 << drive)))
4395 continue;
4396 if (fdc_state[FDC(drive)].version == FDC_NONE)
4397 continue;
4399 floppy_device[drive].name = floppy_device_name;
4400 floppy_device[drive].id = drive;
4401 floppy_device[drive].dev.release = floppy_device_release;
4403 err = platform_device_register(&floppy_device[drive]);
4404 if (err)
4405 goto out_flush_work;
4407 device_create_file(&floppy_device[drive].dev,&dev_attr_cmos);
4408 /* to be cleaned up... */
4409 disks[drive]->private_data = (void *)(long)drive;
4410 disks[drive]->queue = floppy_queue;
4411 disks[drive]->flags |= GENHD_FL_REMOVABLE;
4412 disks[drive]->driverfs_dev = &floppy_device[drive].dev;
4413 add_disk(disks[drive]);
4416 return 0;
4418 out_flush_work:
4419 flush_scheduled_work();
4420 if (usage_count)
4421 floppy_release_irq_and_dma();
4422 out_unreg_region:
4423 blk_unregister_region(MKDEV(FLOPPY_MAJOR, 0), 256);
4424 blk_cleanup_queue(floppy_queue);
4425 out_unreg_blkdev:
4426 unregister_blkdev(FLOPPY_MAJOR, "fd");
4427 out_devfs_remove:
4428 devfs_remove("floppy");
4429 out_put_disk:
4430 while (dr--) {
4431 del_timer(&motor_off_timer[dr]);
4432 put_disk(disks[dr]);
4434 return err;
4437 static DEFINE_SPINLOCK(floppy_usage_lock);
4439 static int floppy_grab_irq_and_dma(void)
4441 unsigned long flags;
4443 spin_lock_irqsave(&floppy_usage_lock, flags);
4444 if (usage_count++) {
4445 spin_unlock_irqrestore(&floppy_usage_lock, flags);
4446 return 0;
4448 spin_unlock_irqrestore(&floppy_usage_lock, flags);
4451 * We might have scheduled a free_irq(), wait it to
4452 * drain first:
4454 flush_scheduled_work();
4456 if (fd_request_irq()) {
4457 DPRINT("Unable to grab IRQ%d for the floppy driver\n",
4458 FLOPPY_IRQ);
4459 spin_lock_irqsave(&floppy_usage_lock, flags);
4460 usage_count--;
4461 spin_unlock_irqrestore(&floppy_usage_lock, flags);
4462 return -1;
4464 if (fd_request_dma()) {
4465 DPRINT("Unable to grab DMA%d for the floppy driver\n",
4466 FLOPPY_DMA);
4467 fd_free_irq();
4468 spin_lock_irqsave(&floppy_usage_lock, flags);
4469 usage_count--;
4470 spin_unlock_irqrestore(&floppy_usage_lock, flags);
4471 return -1;
4474 for (fdc = 0; fdc < N_FDC; fdc++) {
4475 if (FDCS->address != -1) {
4476 if (!request_region(FDCS->address + 2, 4, "floppy")) {
4477 DPRINT("Floppy io-port 0x%04lx in use\n",
4478 FDCS->address + 2);
4479 goto cleanup1;
4481 if (!request_region(FDCS->address + 7, 1, "floppy DIR")) {
4482 DPRINT("Floppy io-port 0x%04lx in use\n",
4483 FDCS->address + 7);
4484 goto cleanup2;
4486 /* address + 6 is reserved, and may be taken by IDE.
4487 * Unfortunately, Adaptec doesn't know this :-(, */
4490 for (fdc = 0; fdc < N_FDC; fdc++) {
4491 if (FDCS->address != -1) {
4492 reset_fdc_info(1);
4493 fd_outb(FDCS->dor, FD_DOR);
4496 fdc = 0;
4497 set_dor(0, ~0, 8); /* avoid immediate interrupt */
4499 for (fdc = 0; fdc < N_FDC; fdc++)
4500 if (FDCS->address != -1)
4501 fd_outb(FDCS->dor, FD_DOR);
4503 * The driver will try and free resources and relies on us
4504 * to know if they were allocated or not.
4506 fdc = 0;
4507 irqdma_allocated = 1;
4508 return 0;
4509 cleanup2:
4510 release_region(FDCS->address + 2, 4);
4511 cleanup1:
4512 fd_free_irq();
4513 fd_free_dma();
4514 while (--fdc >= 0) {
4515 release_region(FDCS->address + 2, 4);
4516 release_region(FDCS->address + 7, 1);
4518 spin_lock_irqsave(&floppy_usage_lock, flags);
4519 usage_count--;
4520 spin_unlock_irqrestore(&floppy_usage_lock, flags);
4521 return -1;
4524 static void floppy_release_irq_and_dma(void)
4526 int old_fdc;
4527 #ifdef FLOPPY_SANITY_CHECK
4528 #ifndef __sparc__
4529 int drive;
4530 #endif
4531 #endif
4532 long tmpsize;
4533 unsigned long tmpaddr;
4534 unsigned long flags;
4536 spin_lock_irqsave(&floppy_usage_lock, flags);
4537 if (--usage_count) {
4538 spin_unlock_irqrestore(&floppy_usage_lock, flags);
4539 return;
4541 spin_unlock_irqrestore(&floppy_usage_lock, flags);
4542 if (irqdma_allocated) {
4543 fd_disable_dma();
4544 fd_free_dma();
4545 schedule_work(&fd_free_irq_work);
4546 irqdma_allocated = 0;
4548 set_dor(0, ~0, 8);
4549 #if N_FDC > 1
4550 set_dor(1, ~8, 0);
4551 #endif
4552 floppy_enable_hlt();
4554 if (floppy_track_buffer && max_buffer_sectors) {
4555 tmpsize = max_buffer_sectors * 1024;
4556 tmpaddr = (unsigned long)floppy_track_buffer;
4557 floppy_track_buffer = NULL;
4558 max_buffer_sectors = 0;
4559 buffer_min = buffer_max = -1;
4560 fd_dma_mem_free(tmpaddr, tmpsize);
4562 #ifdef FLOPPY_SANITY_CHECK
4563 #ifndef __sparc__
4564 for (drive = 0; drive < N_FDC * 4; drive++)
4565 if (timer_pending(motor_off_timer + drive))
4566 printk("motor off timer %d still active\n", drive);
4567 #endif
4569 if (timer_pending(&fd_timeout))
4570 printk("floppy timer still active:%s\n", timeout_message);
4571 if (timer_pending(&fd_timer))
4572 printk("auxiliary floppy timer still active\n");
4573 if (floppy_work.pending)
4574 printk("work still pending\n");
4575 #endif
4576 old_fdc = fdc;
4577 for (fdc = 0; fdc < N_FDC; fdc++)
4578 if (FDCS->address != -1) {
4579 release_region(FDCS->address + 2, 4);
4580 release_region(FDCS->address + 7, 1);
4582 fdc = old_fdc;
4585 #ifdef MODULE
4587 static char *floppy;
4589 static void unregister_devfs_entries(int drive)
4591 int i;
4593 if (UDP->cmos < ARRAY_SIZE(default_drive_params)) {
4594 i = 0;
4595 do {
4596 devfs_remove("floppy/%d%s", drive,
4597 table[table_sup[UDP->cmos][i]]);
4598 } while (table_sup[UDP->cmos][i++]);
4602 static void __init parse_floppy_cfg_string(char *cfg)
4604 char *ptr;
4606 while (*cfg) {
4607 for (ptr = cfg; *cfg && *cfg != ' ' && *cfg != '\t'; cfg++) ;
4608 if (*cfg) {
4609 *cfg = '\0';
4610 cfg++;
4612 if (*ptr)
4613 floppy_setup(ptr);
4617 int __init init_module(void)
4619 if (floppy)
4620 parse_floppy_cfg_string(floppy);
4621 return floppy_init();
4624 void cleanup_module(void)
4626 int drive;
4628 init_completion(&device_release);
4629 blk_unregister_region(MKDEV(FLOPPY_MAJOR, 0), 256);
4630 unregister_blkdev(FLOPPY_MAJOR, "fd");
4632 for (drive = 0; drive < N_DRIVE; drive++) {
4633 del_timer_sync(&motor_off_timer[drive]);
4635 if ((allowed_drive_mask & (1 << drive)) &&
4636 fdc_state[FDC(drive)].version != FDC_NONE) {
4637 del_gendisk(disks[drive]);
4638 unregister_devfs_entries(drive);
4639 device_remove_file(&floppy_device[drive].dev, &dev_attr_cmos);
4640 platform_device_unregister(&floppy_device[drive]);
4642 put_disk(disks[drive]);
4644 devfs_remove("floppy");
4646 del_timer_sync(&fd_timeout);
4647 del_timer_sync(&fd_timer);
4648 blk_cleanup_queue(floppy_queue);
4650 if (usage_count)
4651 floppy_release_irq_and_dma();
4653 /* eject disk, if any */
4654 fd_eject(0);
4656 flush_scheduled_work(); /* fd_free_irq() might be pending */
4658 wait_for_completion(&device_release);
4661 module_param(floppy, charp, 0);
4662 module_param(FLOPPY_IRQ, int, 0);
4663 module_param(FLOPPY_DMA, int, 0);
4664 MODULE_AUTHOR("Alain L. Knaff");
4665 MODULE_SUPPORTED_DEVICE("fd");
4666 MODULE_LICENSE("GPL");
4668 #else
4670 __setup("floppy=", floppy_setup);
4671 module_init(floppy_init)
4672 #endif
4674 MODULE_ALIAS_BLOCKDEV_MAJOR(FLOPPY_MAJOR);