container freezer: document the cgroup freezer subsystem.
[linux-2.6/mini2440.git] / drivers / block / floppy.c
blob2cea27aba9a06c385d62efc49749753da0ae26ce
1 /*
2 * linux/drivers/block/floppy.c
4 * Copyright (C) 1991, 1992 Linus Torvalds
5 * Copyright (C) 1993, 1994 Alain Knaff
6 * Copyright (C) 1998 Alan Cox
7 */
9 /*
10 * 02.12.91 - Changed to static variables to indicate need for reset
11 * and recalibrate. This makes some things easier (output_byte reset
12 * checking etc), and means less interrupt jumping in case of errors,
13 * so the code is hopefully easier to understand.
17 * This file is certainly a mess. I've tried my best to get it working,
18 * but I don't like programming floppies, and I have only one anyway.
19 * Urgel. I should check for more errors, and do more graceful error
20 * recovery. Seems there are problems with several drives. I've tried to
21 * correct them. No promises.
25 * As with hd.c, all routines within this file can (and will) be called
26 * by interrupts, so extreme caution is needed. A hardware interrupt
27 * handler may not sleep, or a kernel panic will happen. Thus I cannot
28 * call "floppy-on" directly, but have to set a special timer interrupt
29 * etc.
33 * 28.02.92 - made track-buffering routines, based on the routines written
34 * by entropy@wintermute.wpi.edu (Lawrence Foard). Linus.
38 * Automatic floppy-detection and formatting written by Werner Almesberger
39 * (almesber@nessie.cs.id.ethz.ch), who also corrected some problems with
40 * the floppy-change signal detection.
44 * 1992/7/22 -- Hennus Bergman: Added better error reporting, fixed
45 * FDC data overrun bug, added some preliminary stuff for vertical
46 * recording support.
48 * 1992/9/17: Added DMA allocation & DMA functions. -- hhb.
50 * TODO: Errors are still not counted properly.
53 /* 1992/9/20
54 * Modifications for ``Sector Shifting'' by Rob Hooft (hooft@chem.ruu.nl)
55 * modeled after the freeware MS-DOS program fdformat/88 V1.8 by
56 * Christoph H. Hochst\"atter.
57 * I have fixed the shift values to the ones I always use. Maybe a new
58 * ioctl() should be created to be able to modify them.
59 * There is a bug in the driver that makes it impossible to format a
60 * floppy as the first thing after bootup.
64 * 1993/4/29 -- Linus -- cleaned up the timer handling in the kernel, and
65 * this helped the floppy driver as well. Much cleaner, and still seems to
66 * work.
69 /* 1994/6/24 --bbroad-- added the floppy table entries and made
70 * minor modifications to allow 2.88 floppies to be run.
73 /* 1994/7/13 -- Paul Vojta -- modified the probing code to allow three or more
74 * disk types.
78 * 1994/8/8 -- Alain Knaff -- Switched to fdpatch driver: Support for bigger
79 * format bug fixes, but unfortunately some new bugs too...
82 /* 1994/9/17 -- Koen Holtman -- added logging of physical floppy write
83 * errors to allow safe writing by specialized programs.
86 /* 1995/4/24 -- Dan Fandrich -- added support for Commodore 1581 3.5" disks
87 * by defining bit 1 of the "stretch" parameter to mean put sectors on the
88 * opposite side of the disk, leaving the sector IDs alone (i.e. Commodore's
89 * drives are "upside-down").
93 * 1995/8/26 -- Andreas Busse -- added Mips support.
97 * 1995/10/18 -- Ralf Baechle -- Portability cleanup; move machine dependent
98 * features to asm/floppy.h.
102 * 1998/1/21 -- Richard Gooch <rgooch@atnf.csiro.au> -- devfs support
106 * 1998/05/07 -- Russell King -- More portability cleanups; moved definition of
107 * interrupt and dma channel to asm/floppy.h. Cleaned up some formatting &
108 * use of '0' for NULL.
112 * 1998/06/07 -- Alan Cox -- Merged the 2.0.34 fixes for resource allocation
113 * failures.
117 * 1998/09/20 -- David Weinehall -- Added slow-down code for buggy PS/2-drives.
121 * 1999/08/13 -- Paul Slootman -- floppy stopped working on Alpha after 24
122 * days, 6 hours, 32 minutes and 32 seconds (i.e. MAXINT jiffies; ints were
123 * being used to store jiffies, which are unsigned longs).
127 * 2000/08/28 -- Arnaldo Carvalho de Melo <acme@conectiva.com.br>
128 * - get rid of check_region
129 * - s/suser/capable/
133 * 2001/08/26 -- Paul Gortmaker - fix insmod oops on machines with no
134 * floppy controller (lingering task on list after module is gone... boom.)
138 * 2002/02/07 -- Anton Altaparmakov - Fix io ports reservation to correct range
139 * (0x3f2-0x3f5, 0x3f7). This fix is a bit of a hack but the proper fix
140 * requires many non-obvious changes in arch dependent code.
143 /* 2003/07/28 -- Daniele Bellucci <bellucda@tiscali.it>.
144 * Better audit of register_blkdev.
147 #define FLOPPY_SANITY_CHECK
148 #undef FLOPPY_SILENT_DCL_CLEAR
150 #define REALLY_SLOW_IO
152 #define DEBUGT 2
153 #define DCL_DEBUG /* debug disk change line */
155 /* do print messages for unexpected interrupts */
156 static int print_unex = 1;
157 #include <linux/module.h>
158 #include <linux/sched.h>
159 #include <linux/fs.h>
160 #include <linux/kernel.h>
161 #include <linux/timer.h>
162 #include <linux/workqueue.h>
163 #define FDPATCHES
164 #include <linux/fdreg.h>
165 #include <linux/fd.h>
166 #include <linux/hdreg.h>
167 #include <linux/errno.h>
168 #include <linux/slab.h>
169 #include <linux/mm.h>
170 #include <linux/bio.h>
171 #include <linux/string.h>
172 #include <linux/jiffies.h>
173 #include <linux/fcntl.h>
174 #include <linux/delay.h>
175 #include <linux/mc146818rtc.h> /* CMOS defines */
176 #include <linux/ioport.h>
177 #include <linux/interrupt.h>
178 #include <linux/init.h>
179 #include <linux/platform_device.h>
180 #include <linux/buffer_head.h> /* for invalidate_buffers() */
181 #include <linux/mutex.h>
184 * PS/2 floppies have much slower step rates than regular floppies.
185 * It's been recommended that take about 1/4 of the default speed
186 * in some more extreme cases.
188 static int slow_floppy;
190 #include <asm/dma.h>
191 #include <asm/irq.h>
192 #include <asm/system.h>
193 #include <asm/io.h>
194 #include <asm/uaccess.h>
196 static int FLOPPY_IRQ = 6;
197 static int FLOPPY_DMA = 2;
198 static int can_use_virtual_dma = 2;
199 /* =======
200 * can use virtual DMA:
201 * 0 = use of virtual DMA disallowed by config
202 * 1 = use of virtual DMA prescribed by config
203 * 2 = no virtual DMA preference configured. By default try hard DMA,
204 * but fall back on virtual DMA when not enough memory available
207 static int use_virtual_dma;
208 /* =======
209 * use virtual DMA
210 * 0 using hard DMA
211 * 1 using virtual DMA
212 * This variable is set to virtual when a DMA mem problem arises, and
213 * reset back in floppy_grab_irq_and_dma.
214 * It is not safe to reset it in other circumstances, because the floppy
215 * driver may have several buffers in use at once, and we do currently not
216 * record each buffers capabilities
219 static DEFINE_SPINLOCK(floppy_lock);
221 static unsigned short virtual_dma_port = 0x3f0;
222 irqreturn_t floppy_interrupt(int irq, void *dev_id);
223 static int set_dor(int fdc, char mask, char data);
225 #define K_64 0x10000 /* 64KB */
227 /* the following is the mask of allowed drives. By default units 2 and
228 * 3 of both floppy controllers are disabled, because switching on the
229 * motor of these drives causes system hangs on some PCI computers. drive
230 * 0 is the low bit (0x1), and drive 7 is the high bit (0x80). Bits are on if
231 * a drive is allowed.
233 * NOTE: This must come before we include the arch floppy header because
234 * some ports reference this variable from there. -DaveM
237 static int allowed_drive_mask = 0x33;
239 #include <asm/floppy.h>
241 static int irqdma_allocated;
243 #define DEVICE_NAME "floppy"
245 #include <linux/blkdev.h>
246 #include <linux/blkpg.h>
247 #include <linux/cdrom.h> /* for the compatibility eject ioctl */
248 #include <linux/completion.h>
250 static struct request *current_req;
251 static struct request_queue *floppy_queue;
252 static void do_fd_request(struct request_queue * q);
254 #ifndef fd_get_dma_residue
255 #define fd_get_dma_residue() get_dma_residue(FLOPPY_DMA)
256 #endif
258 /* Dma Memory related stuff */
260 #ifndef fd_dma_mem_free
261 #define fd_dma_mem_free(addr, size) free_pages(addr, get_order(size))
262 #endif
264 #ifndef fd_dma_mem_alloc
265 #define fd_dma_mem_alloc(size) __get_dma_pages(GFP_KERNEL,get_order(size))
266 #endif
268 static inline void fallback_on_nodma_alloc(char **addr, size_t l)
270 #ifdef FLOPPY_CAN_FALLBACK_ON_NODMA
271 if (*addr)
272 return; /* we have the memory */
273 if (can_use_virtual_dma != 2)
274 return; /* no fallback allowed */
275 printk("DMA memory shortage. Temporarily falling back on virtual DMA\n");
276 *addr = (char *)nodma_mem_alloc(l);
277 #else
278 return;
279 #endif
282 /* End dma memory related stuff */
284 static unsigned long fake_change;
285 static int initialising = 1;
287 #define ITYPE(x) (((x)>>2) & 0x1f)
288 #define TOMINOR(x) ((x & 3) | ((x & 4) << 5))
289 #define UNIT(x) ((x) & 0x03) /* drive on fdc */
290 #define FDC(x) (((x) & 0x04) >> 2) /* fdc of drive */
291 /* reverse mapping from unit and fdc to drive */
292 #define REVDRIVE(fdc, unit) ((unit) + ((fdc) << 2))
293 #define DP (&drive_params[current_drive])
294 #define DRS (&drive_state[current_drive])
295 #define DRWE (&write_errors[current_drive])
296 #define FDCS (&fdc_state[fdc])
297 #define CLEARF(x) clear_bit(x##_BIT, &DRS->flags)
298 #define SETF(x) set_bit(x##_BIT, &DRS->flags)
299 #define TESTF(x) test_bit(x##_BIT, &DRS->flags)
301 #define UDP (&drive_params[drive])
302 #define UDRS (&drive_state[drive])
303 #define UDRWE (&write_errors[drive])
304 #define UFDCS (&fdc_state[FDC(drive)])
305 #define UCLEARF(x) clear_bit(x##_BIT, &UDRS->flags)
306 #define USETF(x) set_bit(x##_BIT, &UDRS->flags)
307 #define UTESTF(x) test_bit(x##_BIT, &UDRS->flags)
309 #define DPRINT(format, args...) printk(DEVICE_NAME "%d: " format, current_drive , ## args)
311 #define PH_HEAD(floppy,head) (((((floppy)->stretch & 2) >>1) ^ head) << 2)
312 #define STRETCH(floppy) ((floppy)->stretch & FD_STRETCH)
314 #define CLEARSTRUCT(x) memset((x), 0, sizeof(*(x)))
316 /* read/write */
317 #define COMMAND raw_cmd->cmd[0]
318 #define DR_SELECT raw_cmd->cmd[1]
319 #define TRACK raw_cmd->cmd[2]
320 #define HEAD raw_cmd->cmd[3]
321 #define SECTOR raw_cmd->cmd[4]
322 #define SIZECODE raw_cmd->cmd[5]
323 #define SECT_PER_TRACK raw_cmd->cmd[6]
324 #define GAP raw_cmd->cmd[7]
325 #define SIZECODE2 raw_cmd->cmd[8]
326 #define NR_RW 9
328 /* format */
329 #define F_SIZECODE raw_cmd->cmd[2]
330 #define F_SECT_PER_TRACK raw_cmd->cmd[3]
331 #define F_GAP raw_cmd->cmd[4]
332 #define F_FILL raw_cmd->cmd[5]
333 #define NR_F 6
336 * Maximum disk size (in kilobytes). This default is used whenever the
337 * current disk size is unknown.
338 * [Now it is rather a minimum]
340 #define MAX_DISK_SIZE 4 /* 3984 */
343 * globals used by 'result()'
345 #define MAX_REPLIES 16
346 static unsigned char reply_buffer[MAX_REPLIES];
347 static int inr; /* size of reply buffer, when called from interrupt */
348 #define ST0 (reply_buffer[0])
349 #define ST1 (reply_buffer[1])
350 #define ST2 (reply_buffer[2])
351 #define ST3 (reply_buffer[0]) /* result of GETSTATUS */
352 #define R_TRACK (reply_buffer[3])
353 #define R_HEAD (reply_buffer[4])
354 #define R_SECTOR (reply_buffer[5])
355 #define R_SIZECODE (reply_buffer[6])
356 #define SEL_DLY (2*HZ/100)
359 * this struct defines the different floppy drive types.
361 static struct {
362 struct floppy_drive_params params;
363 const char *name; /* name printed while booting */
364 } default_drive_params[] = {
365 /* NOTE: the time values in jiffies should be in msec!
366 CMOS drive type
367 | Maximum data rate supported by drive type
368 | | Head load time, msec
369 | | | Head unload time, msec (not used)
370 | | | | Step rate interval, usec
371 | | | | | Time needed for spinup time (jiffies)
372 | | | | | | Timeout for spinning down (jiffies)
373 | | | | | | | Spindown offset (where disk stops)
374 | | | | | | | | Select delay
375 | | | | | | | | | RPS
376 | | | | | | | | | | Max number of tracks
377 | | | | | | | | | | | Interrupt timeout
378 | | | | | | | | | | | | Max nonintlv. sectors
379 | | | | | | | | | | | | | -Max Errors- flags */
380 {{0, 500, 16, 16, 8000, 1*HZ, 3*HZ, 0, SEL_DLY, 5, 80, 3*HZ, 20, {3,1,2,0,2}, 0,
381 0, { 7, 4, 8, 2, 1, 5, 3,10}, 3*HZ/2, 0 }, "unknown" },
383 {{1, 300, 16, 16, 8000, 1*HZ, 3*HZ, 0, SEL_DLY, 5, 40, 3*HZ, 17, {3,1,2,0,2}, 0,
384 0, { 1, 0, 0, 0, 0, 0, 0, 0}, 3*HZ/2, 1 }, "360K PC" }, /*5 1/4 360 KB PC*/
386 {{2, 500, 16, 16, 6000, 4*HZ/10, 3*HZ, 14, SEL_DLY, 6, 83, 3*HZ, 17, {3,1,2,0,2}, 0,
387 0, { 2, 5, 6,23,10,20,12, 0}, 3*HZ/2, 2 }, "1.2M" }, /*5 1/4 HD AT*/
389 {{3, 250, 16, 16, 3000, 1*HZ, 3*HZ, 0, SEL_DLY, 5, 83, 3*HZ, 20, {3,1,2,0,2}, 0,
390 0, { 4,22,21,30, 3, 0, 0, 0}, 3*HZ/2, 4 }, "720k" }, /*3 1/2 DD*/
392 {{4, 500, 16, 16, 4000, 4*HZ/10, 3*HZ, 10, SEL_DLY, 5, 83, 3*HZ, 20, {3,1,2,0,2}, 0,
393 0, { 7, 4,25,22,31,21,29,11}, 3*HZ/2, 7 }, "1.44M" }, /*3 1/2 HD*/
395 {{5, 1000, 15, 8, 3000, 4*HZ/10, 3*HZ, 10, SEL_DLY, 5, 83, 3*HZ, 40, {3,1,2,0,2}, 0,
396 0, { 7, 8, 4,25,28,22,31,21}, 3*HZ/2, 8 }, "2.88M AMI BIOS" }, /*3 1/2 ED*/
398 {{6, 1000, 15, 8, 3000, 4*HZ/10, 3*HZ, 10, SEL_DLY, 5, 83, 3*HZ, 40, {3,1,2,0,2}, 0,
399 0, { 7, 8, 4,25,28,22,31,21}, 3*HZ/2, 8 }, "2.88M" } /*3 1/2 ED*/
400 /* | --autodetected formats--- | | |
401 * read_track | | Name printed when booting
402 * | Native format
403 * Frequency of disk change checks */
406 static struct floppy_drive_params drive_params[N_DRIVE];
407 static struct floppy_drive_struct drive_state[N_DRIVE];
408 static struct floppy_write_errors write_errors[N_DRIVE];
409 static struct timer_list motor_off_timer[N_DRIVE];
410 static struct gendisk *disks[N_DRIVE];
411 static struct block_device *opened_bdev[N_DRIVE];
412 static DEFINE_MUTEX(open_lock);
413 static struct floppy_raw_cmd *raw_cmd, default_raw_cmd;
416 * This struct defines the different floppy types.
418 * Bit 0 of 'stretch' tells if the tracks need to be doubled for some
419 * types (e.g. 360kB diskette in 1.2MB drive, etc.). Bit 1 of 'stretch'
420 * tells if the disk is in Commodore 1581 format, which means side 0 sectors
421 * are located on side 1 of the disk but with a side 0 ID, and vice-versa.
422 * This is the same as the Sharp MZ-80 5.25" CP/M disk format, except that the
423 * 1581's logical side 0 is on physical side 1, whereas the Sharp's logical
424 * side 0 is on physical side 0 (but with the misnamed sector IDs).
425 * 'stretch' should probably be renamed to something more general, like
426 * 'options'.
428 * Bits 2 through 9 of 'stretch' tell the number of the first sector.
429 * The LSB (bit 2) is flipped. For most disks, the first sector
430 * is 1 (represented by 0x00<<2). For some CP/M and music sampler
431 * disks (such as Ensoniq EPS 16plus) it is 0 (represented as 0x01<<2).
432 * For Amstrad CPC disks it is 0xC1 (represented as 0xC0<<2).
434 * Other parameters should be self-explanatory (see also setfdprm(8)).
437 Size
438 | Sectors per track
439 | | Head
440 | | | Tracks
441 | | | | Stretch
442 | | | | | Gap 1 size
443 | | | | | | Data rate, | 0x40 for perp
444 | | | | | | | Spec1 (stepping rate, head unload
445 | | | | | | | | /fmt gap (gap2) */
446 static struct floppy_struct floppy_type[32] = {
447 { 0, 0,0, 0,0,0x00,0x00,0x00,0x00,NULL }, /* 0 no testing */
448 { 720, 9,2,40,0,0x2A,0x02,0xDF,0x50,"d360" }, /* 1 360KB PC */
449 { 2400,15,2,80,0,0x1B,0x00,0xDF,0x54,"h1200" }, /* 2 1.2MB AT */
450 { 720, 9,1,80,0,0x2A,0x02,0xDF,0x50,"D360" }, /* 3 360KB SS 3.5" */
451 { 1440, 9,2,80,0,0x2A,0x02,0xDF,0x50,"D720" }, /* 4 720KB 3.5" */
452 { 720, 9,2,40,1,0x23,0x01,0xDF,0x50,"h360" }, /* 5 360KB AT */
453 { 1440, 9,2,80,0,0x23,0x01,0xDF,0x50,"h720" }, /* 6 720KB AT */
454 { 2880,18,2,80,0,0x1B,0x00,0xCF,0x6C,"H1440" }, /* 7 1.44MB 3.5" */
455 { 5760,36,2,80,0,0x1B,0x43,0xAF,0x54,"E2880" }, /* 8 2.88MB 3.5" */
456 { 6240,39,2,80,0,0x1B,0x43,0xAF,0x28,"E3120" }, /* 9 3.12MB 3.5" */
458 { 2880,18,2,80,0,0x25,0x00,0xDF,0x02,"h1440" }, /* 10 1.44MB 5.25" */
459 { 3360,21,2,80,0,0x1C,0x00,0xCF,0x0C,"H1680" }, /* 11 1.68MB 3.5" */
460 { 820,10,2,41,1,0x25,0x01,0xDF,0x2E,"h410" }, /* 12 410KB 5.25" */
461 { 1640,10,2,82,0,0x25,0x02,0xDF,0x2E,"H820" }, /* 13 820KB 3.5" */
462 { 2952,18,2,82,0,0x25,0x00,0xDF,0x02,"h1476" }, /* 14 1.48MB 5.25" */
463 { 3444,21,2,82,0,0x25,0x00,0xDF,0x0C,"H1722" }, /* 15 1.72MB 3.5" */
464 { 840,10,2,42,1,0x25,0x01,0xDF,0x2E,"h420" }, /* 16 420KB 5.25" */
465 { 1660,10,2,83,0,0x25,0x02,0xDF,0x2E,"H830" }, /* 17 830KB 3.5" */
466 { 2988,18,2,83,0,0x25,0x00,0xDF,0x02,"h1494" }, /* 18 1.49MB 5.25" */
467 { 3486,21,2,83,0,0x25,0x00,0xDF,0x0C,"H1743" }, /* 19 1.74 MB 3.5" */
469 { 1760,11,2,80,0,0x1C,0x09,0xCF,0x00,"h880" }, /* 20 880KB 5.25" */
470 { 2080,13,2,80,0,0x1C,0x01,0xCF,0x00,"D1040" }, /* 21 1.04MB 3.5" */
471 { 2240,14,2,80,0,0x1C,0x19,0xCF,0x00,"D1120" }, /* 22 1.12MB 3.5" */
472 { 3200,20,2,80,0,0x1C,0x20,0xCF,0x2C,"h1600" }, /* 23 1.6MB 5.25" */
473 { 3520,22,2,80,0,0x1C,0x08,0xCF,0x2e,"H1760" }, /* 24 1.76MB 3.5" */
474 { 3840,24,2,80,0,0x1C,0x20,0xCF,0x00,"H1920" }, /* 25 1.92MB 3.5" */
475 { 6400,40,2,80,0,0x25,0x5B,0xCF,0x00,"E3200" }, /* 26 3.20MB 3.5" */
476 { 7040,44,2,80,0,0x25,0x5B,0xCF,0x00,"E3520" }, /* 27 3.52MB 3.5" */
477 { 7680,48,2,80,0,0x25,0x63,0xCF,0x00,"E3840" }, /* 28 3.84MB 3.5" */
478 { 3680,23,2,80,0,0x1C,0x10,0xCF,0x00,"H1840" }, /* 29 1.84MB 3.5" */
480 { 1600,10,2,80,0,0x25,0x02,0xDF,0x2E,"D800" }, /* 30 800KB 3.5" */
481 { 3200,20,2,80,0,0x1C,0x00,0xCF,0x2C,"H1600" }, /* 31 1.6MB 3.5" */
484 #define SECTSIZE (_FD_SECTSIZE(*floppy))
486 /* Auto-detection: Disk type used until the next media change occurs. */
487 static struct floppy_struct *current_type[N_DRIVE];
490 * User-provided type information. current_type points to
491 * the respective entry of this array.
493 static struct floppy_struct user_params[N_DRIVE];
495 static sector_t floppy_sizes[256];
497 static char floppy_device_name[] = "floppy";
500 * The driver is trying to determine the correct media format
501 * while probing is set. rw_interrupt() clears it after a
502 * successful access.
504 static int probing;
506 /* Synchronization of FDC access. */
507 #define FD_COMMAND_NONE -1
508 #define FD_COMMAND_ERROR 2
509 #define FD_COMMAND_OKAY 3
511 static volatile int command_status = FD_COMMAND_NONE;
512 static unsigned long fdc_busy;
513 static DECLARE_WAIT_QUEUE_HEAD(fdc_wait);
514 static DECLARE_WAIT_QUEUE_HEAD(command_done);
516 #define NO_SIGNAL (!interruptible || !signal_pending(current))
517 #define CALL(x) if ((x) == -EINTR) return -EINTR
518 #define ECALL(x) if ((ret = (x))) return ret;
519 #define _WAIT(x,i) CALL(ret=wait_til_done((x),i))
520 #define WAIT(x) _WAIT((x),interruptible)
521 #define IWAIT(x) _WAIT((x),1)
523 /* Errors during formatting are counted here. */
524 static int format_errors;
526 /* Format request descriptor. */
527 static struct format_descr format_req;
530 * Rate is 0 for 500kb/s, 1 for 300kbps, 2 for 250kbps
531 * Spec1 is 0xSH, where S is stepping rate (F=1ms, E=2ms, D=3ms etc),
532 * H is head unload time (1=16ms, 2=32ms, etc)
536 * Track buffer
537 * Because these are written to by the DMA controller, they must
538 * not contain a 64k byte boundary crossing, or data will be
539 * corrupted/lost.
541 static char *floppy_track_buffer;
542 static int max_buffer_sectors;
544 static int *errors;
545 typedef void (*done_f)(int);
546 static struct cont_t {
547 void (*interrupt)(void); /* this is called after the interrupt of the
548 * main command */
549 void (*redo)(void); /* this is called to retry the operation */
550 void (*error)(void); /* this is called to tally an error */
551 done_f done; /* this is called to say if the operation has
552 * succeeded/failed */
553 } *cont;
555 static void floppy_ready(void);
556 static void floppy_start(void);
557 static void process_fd_request(void);
558 static void recalibrate_floppy(void);
559 static void floppy_shutdown(unsigned long);
561 static int floppy_grab_irq_and_dma(void);
562 static void floppy_release_irq_and_dma(void);
565 * The "reset" variable should be tested whenever an interrupt is scheduled,
566 * after the commands have been sent. This is to ensure that the driver doesn't
567 * get wedged when the interrupt doesn't come because of a failed command.
568 * reset doesn't need to be tested before sending commands, because
569 * output_byte is automatically disabled when reset is set.
571 #define CHECK_RESET { if (FDCS->reset){ reset_fdc(); return; } }
572 static void reset_fdc(void);
575 * These are global variables, as that's the easiest way to give
576 * information to interrupts. They are the data used for the current
577 * request.
579 #define NO_TRACK -1
580 #define NEED_1_RECAL -2
581 #define NEED_2_RECAL -3
583 static int usage_count;
585 /* buffer related variables */
586 static int buffer_track = -1;
587 static int buffer_drive = -1;
588 static int buffer_min = -1;
589 static int buffer_max = -1;
591 /* fdc related variables, should end up in a struct */
592 static struct floppy_fdc_state fdc_state[N_FDC];
593 static int fdc; /* current fdc */
595 static struct floppy_struct *_floppy = floppy_type;
596 static unsigned char current_drive;
597 static long current_count_sectors;
598 static unsigned char fsector_t; /* sector in track */
599 static unsigned char in_sector_offset; /* offset within physical sector,
600 * expressed in units of 512 bytes */
602 #ifndef fd_eject
603 static inline int fd_eject(int drive)
605 return -EINVAL;
607 #endif
610 * Debugging
611 * =========
613 #ifdef DEBUGT
614 static long unsigned debugtimer;
616 static inline void set_debugt(void)
618 debugtimer = jiffies;
621 static inline void debugt(const char *message)
623 if (DP->flags & DEBUGT)
624 printk("%s dtime=%lu\n", message, jiffies - debugtimer);
626 #else
627 static inline void set_debugt(void) { }
628 static inline void debugt(const char *message) { }
629 #endif /* DEBUGT */
631 typedef void (*timeout_fn) (unsigned long);
632 static DEFINE_TIMER(fd_timeout, floppy_shutdown, 0, 0);
634 static const char *timeout_message;
636 #ifdef FLOPPY_SANITY_CHECK
637 static void is_alive(const char *message)
639 /* this routine checks whether the floppy driver is "alive" */
640 if (test_bit(0, &fdc_busy) && command_status < 2
641 && !timer_pending(&fd_timeout)) {
642 DPRINT("timeout handler died: %s\n", message);
645 #endif
647 static void (*do_floppy) (void) = NULL;
649 #ifdef FLOPPY_SANITY_CHECK
651 #define OLOGSIZE 20
653 static void (*lasthandler) (void);
654 static unsigned long interruptjiffies;
655 static unsigned long resultjiffies;
656 static int resultsize;
657 static unsigned long lastredo;
659 static struct output_log {
660 unsigned char data;
661 unsigned char status;
662 unsigned long jiffies;
663 } output_log[OLOGSIZE];
665 static int output_log_pos;
666 #endif
668 #define current_reqD -1
669 #define MAXTIMEOUT -2
671 static void __reschedule_timeout(int drive, const char *message, int marg)
673 if (drive == current_reqD)
674 drive = current_drive;
675 del_timer(&fd_timeout);
676 if (drive < 0 || drive >= N_DRIVE) {
677 fd_timeout.expires = jiffies + 20UL * HZ;
678 drive = 0;
679 } else
680 fd_timeout.expires = jiffies + UDP->timeout;
681 add_timer(&fd_timeout);
682 if (UDP->flags & FD_DEBUG) {
683 DPRINT("reschedule timeout ");
684 printk(message, marg);
685 printk("\n");
687 timeout_message = message;
690 static void reschedule_timeout(int drive, const char *message, int marg)
692 unsigned long flags;
694 spin_lock_irqsave(&floppy_lock, flags);
695 __reschedule_timeout(drive, message, marg);
696 spin_unlock_irqrestore(&floppy_lock, flags);
699 #define INFBOUND(a,b) (a)=max_t(int, a, b)
700 #define SUPBOUND(a,b) (a)=min_t(int, a, b)
703 * Bottom half floppy driver.
704 * ==========================
706 * This part of the file contains the code talking directly to the hardware,
707 * and also the main service loop (seek-configure-spinup-command)
711 * disk change.
712 * This routine is responsible for maintaining the FD_DISK_CHANGE flag,
713 * and the last_checked date.
715 * last_checked is the date of the last check which showed 'no disk change'
716 * FD_DISK_CHANGE is set under two conditions:
717 * 1. The floppy has been changed after some i/o to that floppy already
718 * took place.
719 * 2. No floppy disk is in the drive. This is done in order to ensure that
720 * requests are quickly flushed in case there is no disk in the drive. It
721 * follows that FD_DISK_CHANGE can only be cleared if there is a disk in
722 * the drive.
724 * For 1., maxblock is observed. Maxblock is 0 if no i/o has taken place yet.
725 * For 2., FD_DISK_NEWCHANGE is watched. FD_DISK_NEWCHANGE is cleared on
726 * each seek. If a disk is present, the disk change line should also be
727 * cleared on each seek. Thus, if FD_DISK_NEWCHANGE is clear, but the disk
728 * change line is set, this means either that no disk is in the drive, or
729 * that it has been removed since the last seek.
731 * This means that we really have a third possibility too:
732 * The floppy has been changed after the last seek.
735 static int disk_change(int drive)
737 int fdc = FDC(drive);
739 #ifdef FLOPPY_SANITY_CHECK
740 if (time_before(jiffies, UDRS->select_date + UDP->select_delay))
741 DPRINT("WARNING disk change called early\n");
742 if (!(FDCS->dor & (0x10 << UNIT(drive))) ||
743 (FDCS->dor & 3) != UNIT(drive) || fdc != FDC(drive)) {
744 DPRINT("probing disk change on unselected drive\n");
745 DPRINT("drive=%d fdc=%d dor=%x\n", drive, FDC(drive),
746 (unsigned int)FDCS->dor);
748 #endif
750 #ifdef DCL_DEBUG
751 if (UDP->flags & FD_DEBUG) {
752 DPRINT("checking disk change line for drive %d\n", drive);
753 DPRINT("jiffies=%lu\n", jiffies);
754 DPRINT("disk change line=%x\n", fd_inb(FD_DIR) & 0x80);
755 DPRINT("flags=%lx\n", UDRS->flags);
757 #endif
758 if (UDP->flags & FD_BROKEN_DCL)
759 return UTESTF(FD_DISK_CHANGED);
760 if ((fd_inb(FD_DIR) ^ UDP->flags) & 0x80) {
761 USETF(FD_VERIFY); /* verify write protection */
762 if (UDRS->maxblock) {
763 /* mark it changed */
764 USETF(FD_DISK_CHANGED);
767 /* invalidate its geometry */
768 if (UDRS->keep_data >= 0) {
769 if ((UDP->flags & FTD_MSG) &&
770 current_type[drive] != NULL)
771 DPRINT("Disk type is undefined after "
772 "disk change\n");
773 current_type[drive] = NULL;
774 floppy_sizes[TOMINOR(drive)] = MAX_DISK_SIZE << 1;
777 return 1;
778 } else {
779 UDRS->last_checked = jiffies;
780 UCLEARF(FD_DISK_NEWCHANGE);
782 return 0;
785 static inline int is_selected(int dor, int unit)
787 return ((dor & (0x10 << unit)) && (dor & 3) == unit);
790 static int set_dor(int fdc, char mask, char data)
792 unsigned char unit;
793 unsigned char drive;
794 unsigned char newdor;
795 unsigned char olddor;
797 if (FDCS->address == -1)
798 return -1;
800 olddor = FDCS->dor;
801 newdor = (olddor & mask) | data;
802 if (newdor != olddor) {
803 unit = olddor & 0x3;
804 if (is_selected(olddor, unit) && !is_selected(newdor, unit)) {
805 drive = REVDRIVE(fdc, unit);
806 #ifdef DCL_DEBUG
807 if (UDP->flags & FD_DEBUG) {
808 DPRINT("calling disk change from set_dor\n");
810 #endif
811 disk_change(drive);
813 FDCS->dor = newdor;
814 fd_outb(newdor, FD_DOR);
816 unit = newdor & 0x3;
817 if (!is_selected(olddor, unit) && is_selected(newdor, unit)) {
818 drive = REVDRIVE(fdc, unit);
819 UDRS->select_date = jiffies;
822 return olddor;
825 static void twaddle(void)
827 if (DP->select_delay)
828 return;
829 fd_outb(FDCS->dor & ~(0x10 << UNIT(current_drive)), FD_DOR);
830 fd_outb(FDCS->dor, FD_DOR);
831 DRS->select_date = jiffies;
834 /* reset all driver information about the current fdc. This is needed after
835 * a reset, and after a raw command. */
836 static void reset_fdc_info(int mode)
838 int drive;
840 FDCS->spec1 = FDCS->spec2 = -1;
841 FDCS->need_configure = 1;
842 FDCS->perp_mode = 1;
843 FDCS->rawcmd = 0;
844 for (drive = 0; drive < N_DRIVE; drive++)
845 if (FDC(drive) == fdc && (mode || UDRS->track != NEED_1_RECAL))
846 UDRS->track = NEED_2_RECAL;
849 /* selects the fdc and drive, and enables the fdc's input/dma. */
850 static void set_fdc(int drive)
852 if (drive >= 0 && drive < N_DRIVE) {
853 fdc = FDC(drive);
854 current_drive = drive;
856 if (fdc != 1 && fdc != 0) {
857 printk("bad fdc value\n");
858 return;
860 set_dor(fdc, ~0, 8);
861 #if N_FDC > 1
862 set_dor(1 - fdc, ~8, 0);
863 #endif
864 if (FDCS->rawcmd == 2)
865 reset_fdc_info(1);
866 if (fd_inb(FD_STATUS) != STATUS_READY)
867 FDCS->reset = 1;
870 /* locks the driver */
871 static int _lock_fdc(int drive, int interruptible, int line)
873 if (!usage_count) {
874 printk(KERN_ERR
875 "Trying to lock fdc while usage count=0 at line %d\n",
876 line);
877 return -1;
880 if (test_and_set_bit(0, &fdc_busy)) {
881 DECLARE_WAITQUEUE(wait, current);
882 add_wait_queue(&fdc_wait, &wait);
884 for (;;) {
885 set_current_state(TASK_INTERRUPTIBLE);
887 if (!test_and_set_bit(0, &fdc_busy))
888 break;
890 schedule();
892 if (!NO_SIGNAL) {
893 remove_wait_queue(&fdc_wait, &wait);
894 return -EINTR;
898 set_current_state(TASK_RUNNING);
899 remove_wait_queue(&fdc_wait, &wait);
900 flush_scheduled_work();
902 command_status = FD_COMMAND_NONE;
904 __reschedule_timeout(drive, "lock fdc", 0);
905 set_fdc(drive);
906 return 0;
909 #define lock_fdc(drive,interruptible) _lock_fdc(drive,interruptible, __LINE__)
911 #define LOCK_FDC(drive,interruptible) \
912 if (lock_fdc(drive,interruptible)) return -EINTR;
914 /* unlocks the driver */
915 static inline void unlock_fdc(void)
917 unsigned long flags;
919 raw_cmd = NULL;
920 if (!test_bit(0, &fdc_busy))
921 DPRINT("FDC access conflict!\n");
923 if (do_floppy)
924 DPRINT("device interrupt still active at FDC release: %p!\n",
925 do_floppy);
926 command_status = FD_COMMAND_NONE;
927 spin_lock_irqsave(&floppy_lock, flags);
928 del_timer(&fd_timeout);
929 cont = NULL;
930 clear_bit(0, &fdc_busy);
931 if (elv_next_request(floppy_queue))
932 do_fd_request(floppy_queue);
933 spin_unlock_irqrestore(&floppy_lock, flags);
934 wake_up(&fdc_wait);
937 /* switches the motor off after a given timeout */
938 static void motor_off_callback(unsigned long nr)
940 unsigned char mask = ~(0x10 << UNIT(nr));
942 set_dor(FDC(nr), mask, 0);
945 /* schedules motor off */
946 static void floppy_off(unsigned int drive)
948 unsigned long volatile delta;
949 int fdc = FDC(drive);
951 if (!(FDCS->dor & (0x10 << UNIT(drive))))
952 return;
954 del_timer(motor_off_timer + drive);
956 /* make spindle stop in a position which minimizes spinup time
957 * next time */
958 if (UDP->rps) {
959 delta = jiffies - UDRS->first_read_date + HZ -
960 UDP->spindown_offset;
961 delta = ((delta * UDP->rps) % HZ) / UDP->rps;
962 motor_off_timer[drive].expires =
963 jiffies + UDP->spindown - delta;
965 add_timer(motor_off_timer + drive);
969 * cycle through all N_DRIVE floppy drives, for disk change testing.
970 * stopping at current drive. This is done before any long operation, to
971 * be sure to have up to date disk change information.
973 static void scandrives(void)
975 int i;
976 int drive;
977 int saved_drive;
979 if (DP->select_delay)
980 return;
982 saved_drive = current_drive;
983 for (i = 0; i < N_DRIVE; i++) {
984 drive = (saved_drive + i + 1) % N_DRIVE;
985 if (UDRS->fd_ref == 0 || UDP->select_delay != 0)
986 continue; /* skip closed drives */
987 set_fdc(drive);
988 if (!(set_dor(fdc, ~3, UNIT(drive) | (0x10 << UNIT(drive))) &
989 (0x10 << UNIT(drive))))
990 /* switch the motor off again, if it was off to
991 * begin with */
992 set_dor(fdc, ~(0x10 << UNIT(drive)), 0);
994 set_fdc(saved_drive);
997 static void empty(void)
1001 static DECLARE_WORK(floppy_work, NULL);
1003 static void schedule_bh(void (*handler) (void))
1005 PREPARE_WORK(&floppy_work, (work_func_t)handler);
1006 schedule_work(&floppy_work);
1009 static DEFINE_TIMER(fd_timer, NULL, 0, 0);
1011 static void cancel_activity(void)
1013 unsigned long flags;
1015 spin_lock_irqsave(&floppy_lock, flags);
1016 do_floppy = NULL;
1017 PREPARE_WORK(&floppy_work, (work_func_t)empty);
1018 del_timer(&fd_timer);
1019 spin_unlock_irqrestore(&floppy_lock, flags);
1022 /* this function makes sure that the disk stays in the drive during the
1023 * transfer */
1024 static void fd_watchdog(void)
1026 #ifdef DCL_DEBUG
1027 if (DP->flags & FD_DEBUG) {
1028 DPRINT("calling disk change from watchdog\n");
1030 #endif
1032 if (disk_change(current_drive)) {
1033 DPRINT("disk removed during i/o\n");
1034 cancel_activity();
1035 cont->done(0);
1036 reset_fdc();
1037 } else {
1038 del_timer(&fd_timer);
1039 fd_timer.function = (timeout_fn) fd_watchdog;
1040 fd_timer.expires = jiffies + HZ / 10;
1041 add_timer(&fd_timer);
1045 static void main_command_interrupt(void)
1047 del_timer(&fd_timer);
1048 cont->interrupt();
1051 /* waits for a delay (spinup or select) to pass */
1052 static int fd_wait_for_completion(unsigned long delay, timeout_fn function)
1054 if (FDCS->reset) {
1055 reset_fdc(); /* do the reset during sleep to win time
1056 * if we don't need to sleep, it's a good
1057 * occasion anyways */
1058 return 1;
1061 if (time_before(jiffies, delay)) {
1062 del_timer(&fd_timer);
1063 fd_timer.function = function;
1064 fd_timer.expires = delay;
1065 add_timer(&fd_timer);
1066 return 1;
1068 return 0;
1071 static DEFINE_SPINLOCK(floppy_hlt_lock);
1072 static int hlt_disabled;
1073 static void floppy_disable_hlt(void)
1075 unsigned long flags;
1077 spin_lock_irqsave(&floppy_hlt_lock, flags);
1078 if (!hlt_disabled) {
1079 hlt_disabled = 1;
1080 #ifdef HAVE_DISABLE_HLT
1081 disable_hlt();
1082 #endif
1084 spin_unlock_irqrestore(&floppy_hlt_lock, flags);
1087 static void floppy_enable_hlt(void)
1089 unsigned long flags;
1091 spin_lock_irqsave(&floppy_hlt_lock, flags);
1092 if (hlt_disabled) {
1093 hlt_disabled = 0;
1094 #ifdef HAVE_DISABLE_HLT
1095 enable_hlt();
1096 #endif
1098 spin_unlock_irqrestore(&floppy_hlt_lock, flags);
1101 static void setup_DMA(void)
1103 unsigned long f;
1105 #ifdef FLOPPY_SANITY_CHECK
1106 if (raw_cmd->length == 0) {
1107 int i;
1109 printk("zero dma transfer size:");
1110 for (i = 0; i < raw_cmd->cmd_count; i++)
1111 printk("%x,", raw_cmd->cmd[i]);
1112 printk("\n");
1113 cont->done(0);
1114 FDCS->reset = 1;
1115 return;
1117 if (((unsigned long)raw_cmd->kernel_data) % 512) {
1118 printk("non aligned address: %p\n", raw_cmd->kernel_data);
1119 cont->done(0);
1120 FDCS->reset = 1;
1121 return;
1123 #endif
1124 f = claim_dma_lock();
1125 fd_disable_dma();
1126 #ifdef fd_dma_setup
1127 if (fd_dma_setup(raw_cmd->kernel_data, raw_cmd->length,
1128 (raw_cmd->flags & FD_RAW_READ) ?
1129 DMA_MODE_READ : DMA_MODE_WRITE, FDCS->address) < 0) {
1130 release_dma_lock(f);
1131 cont->done(0);
1132 FDCS->reset = 1;
1133 return;
1135 release_dma_lock(f);
1136 #else
1137 fd_clear_dma_ff();
1138 fd_cacheflush(raw_cmd->kernel_data, raw_cmd->length);
1139 fd_set_dma_mode((raw_cmd->flags & FD_RAW_READ) ?
1140 DMA_MODE_READ : DMA_MODE_WRITE);
1141 fd_set_dma_addr(raw_cmd->kernel_data);
1142 fd_set_dma_count(raw_cmd->length);
1143 virtual_dma_port = FDCS->address;
1144 fd_enable_dma();
1145 release_dma_lock(f);
1146 #endif
1147 floppy_disable_hlt();
1150 static void show_floppy(void);
1152 /* waits until the fdc becomes ready */
1153 static int wait_til_ready(void)
1155 int status;
1156 int counter;
1158 if (FDCS->reset)
1159 return -1;
1160 for (counter = 0; counter < 10000; counter++) {
1161 status = fd_inb(FD_STATUS);
1162 if (status & STATUS_READY)
1163 return status;
1165 if (!initialising) {
1166 DPRINT("Getstatus times out (%x) on fdc %d\n", status, fdc);
1167 show_floppy();
1169 FDCS->reset = 1;
1170 return -1;
1173 /* sends a command byte to the fdc */
1174 static int output_byte(char byte)
1176 int status;
1178 if ((status = wait_til_ready()) < 0)
1179 return -1;
1180 if ((status & (STATUS_READY | STATUS_DIR | STATUS_DMA)) == STATUS_READY) {
1181 fd_outb(byte, FD_DATA);
1182 #ifdef FLOPPY_SANITY_CHECK
1183 output_log[output_log_pos].data = byte;
1184 output_log[output_log_pos].status = status;
1185 output_log[output_log_pos].jiffies = jiffies;
1186 output_log_pos = (output_log_pos + 1) % OLOGSIZE;
1187 #endif
1188 return 0;
1190 FDCS->reset = 1;
1191 if (!initialising) {
1192 DPRINT("Unable to send byte %x to FDC. Fdc=%x Status=%x\n",
1193 byte, fdc, status);
1194 show_floppy();
1196 return -1;
1199 #define LAST_OUT(x) if (output_byte(x)<0){ reset_fdc();return;}
1201 /* gets the response from the fdc */
1202 static int result(void)
1204 int i;
1205 int status = 0;
1207 for (i = 0; i < MAX_REPLIES; i++) {
1208 if ((status = wait_til_ready()) < 0)
1209 break;
1210 status &= STATUS_DIR | STATUS_READY | STATUS_BUSY | STATUS_DMA;
1211 if ((status & ~STATUS_BUSY) == STATUS_READY) {
1212 #ifdef FLOPPY_SANITY_CHECK
1213 resultjiffies = jiffies;
1214 resultsize = i;
1215 #endif
1216 return i;
1218 if (status == (STATUS_DIR | STATUS_READY | STATUS_BUSY))
1219 reply_buffer[i] = fd_inb(FD_DATA);
1220 else
1221 break;
1223 if (!initialising) {
1224 DPRINT
1225 ("get result error. Fdc=%d Last status=%x Read bytes=%d\n",
1226 fdc, status, i);
1227 show_floppy();
1229 FDCS->reset = 1;
1230 return -1;
1233 #define MORE_OUTPUT -2
1234 /* does the fdc need more output? */
1235 static int need_more_output(void)
1237 int status;
1239 if ((status = wait_til_ready()) < 0)
1240 return -1;
1241 if ((status & (STATUS_READY | STATUS_DIR | STATUS_DMA)) == STATUS_READY)
1242 return MORE_OUTPUT;
1243 return result();
1246 /* Set perpendicular mode as required, based on data rate, if supported.
1247 * 82077 Now tested. 1Mbps data rate only possible with 82077-1.
1249 static inline void perpendicular_mode(void)
1251 unsigned char perp_mode;
1253 if (raw_cmd->rate & 0x40) {
1254 switch (raw_cmd->rate & 3) {
1255 case 0:
1256 perp_mode = 2;
1257 break;
1258 case 3:
1259 perp_mode = 3;
1260 break;
1261 default:
1262 DPRINT("Invalid data rate for perpendicular mode!\n");
1263 cont->done(0);
1264 FDCS->reset = 1; /* convenient way to return to
1265 * redo without to much hassle (deep
1266 * stack et al. */
1267 return;
1269 } else
1270 perp_mode = 0;
1272 if (FDCS->perp_mode == perp_mode)
1273 return;
1274 if (FDCS->version >= FDC_82077_ORIG) {
1275 output_byte(FD_PERPENDICULAR);
1276 output_byte(perp_mode);
1277 FDCS->perp_mode = perp_mode;
1278 } else if (perp_mode) {
1279 DPRINT("perpendicular mode not supported by this FDC.\n");
1281 } /* perpendicular_mode */
1283 static int fifo_depth = 0xa;
1284 static int no_fifo;
1286 static int fdc_configure(void)
1288 /* Turn on FIFO */
1289 output_byte(FD_CONFIGURE);
1290 if (need_more_output() != MORE_OUTPUT)
1291 return 0;
1292 output_byte(0);
1293 output_byte(0x10 | (no_fifo & 0x20) | (fifo_depth & 0xf));
1294 output_byte(0); /* pre-compensation from track
1295 0 upwards */
1296 return 1;
1299 #define NOMINAL_DTR 500
1301 /* Issue a "SPECIFY" command to set the step rate time, head unload time,
1302 * head load time, and DMA disable flag to values needed by floppy.
1304 * The value "dtr" is the data transfer rate in Kbps. It is needed
1305 * to account for the data rate-based scaling done by the 82072 and 82077
1306 * FDC types. This parameter is ignored for other types of FDCs (i.e.
1307 * 8272a).
1309 * Note that changing the data transfer rate has a (probably deleterious)
1310 * effect on the parameters subject to scaling for 82072/82077 FDCs, so
1311 * fdc_specify is called again after each data transfer rate
1312 * change.
1314 * srt: 1000 to 16000 in microseconds
1315 * hut: 16 to 240 milliseconds
1316 * hlt: 2 to 254 milliseconds
1318 * These values are rounded up to the next highest available delay time.
1320 static void fdc_specify(void)
1322 unsigned char spec1;
1323 unsigned char spec2;
1324 unsigned long srt;
1325 unsigned long hlt;
1326 unsigned long hut;
1327 unsigned long dtr = NOMINAL_DTR;
1328 unsigned long scale_dtr = NOMINAL_DTR;
1329 int hlt_max_code = 0x7f;
1330 int hut_max_code = 0xf;
1332 if (FDCS->need_configure && FDCS->version >= FDC_82072A) {
1333 fdc_configure();
1334 FDCS->need_configure = 0;
1337 switch (raw_cmd->rate & 0x03) {
1338 case 3:
1339 dtr = 1000;
1340 break;
1341 case 1:
1342 dtr = 300;
1343 if (FDCS->version >= FDC_82078) {
1344 /* chose the default rate table, not the one
1345 * where 1 = 2 Mbps */
1346 output_byte(FD_DRIVESPEC);
1347 if (need_more_output() == MORE_OUTPUT) {
1348 output_byte(UNIT(current_drive));
1349 output_byte(0xc0);
1352 break;
1353 case 2:
1354 dtr = 250;
1355 break;
1358 if (FDCS->version >= FDC_82072) {
1359 scale_dtr = dtr;
1360 hlt_max_code = 0x00; /* 0==256msec*dtr0/dtr (not linear!) */
1361 hut_max_code = 0x0; /* 0==256msec*dtr0/dtr (not linear!) */
1364 /* Convert step rate from microseconds to milliseconds and 4 bits */
1365 srt = 16 - DIV_ROUND_UP(DP->srt * scale_dtr / 1000, NOMINAL_DTR);
1366 if (slow_floppy) {
1367 srt = srt / 4;
1369 SUPBOUND(srt, 0xf);
1370 INFBOUND(srt, 0);
1372 hlt = DIV_ROUND_UP(DP->hlt * scale_dtr / 2, NOMINAL_DTR);
1373 if (hlt < 0x01)
1374 hlt = 0x01;
1375 else if (hlt > 0x7f)
1376 hlt = hlt_max_code;
1378 hut = DIV_ROUND_UP(DP->hut * scale_dtr / 16, NOMINAL_DTR);
1379 if (hut < 0x1)
1380 hut = 0x1;
1381 else if (hut > 0xf)
1382 hut = hut_max_code;
1384 spec1 = (srt << 4) | hut;
1385 spec2 = (hlt << 1) | (use_virtual_dma & 1);
1387 /* If these parameters did not change, just return with success */
1388 if (FDCS->spec1 != spec1 || FDCS->spec2 != spec2) {
1389 /* Go ahead and set spec1 and spec2 */
1390 output_byte(FD_SPECIFY);
1391 output_byte(FDCS->spec1 = spec1);
1392 output_byte(FDCS->spec2 = spec2);
1394 } /* fdc_specify */
1396 /* Set the FDC's data transfer rate on behalf of the specified drive.
1397 * NOTE: with 82072/82077 FDCs, changing the data rate requires a reissue
1398 * of the specify command (i.e. using the fdc_specify function).
1400 static int fdc_dtr(void)
1402 /* If data rate not already set to desired value, set it. */
1403 if ((raw_cmd->rate & 3) == FDCS->dtr)
1404 return 0;
1406 /* Set dtr */
1407 fd_outb(raw_cmd->rate & 3, FD_DCR);
1409 /* TODO: some FDC/drive combinations (C&T 82C711 with TEAC 1.2MB)
1410 * need a stabilization period of several milliseconds to be
1411 * enforced after data rate changes before R/W operations.
1412 * Pause 5 msec to avoid trouble. (Needs to be 2 jiffies)
1414 FDCS->dtr = raw_cmd->rate & 3;
1415 return (fd_wait_for_completion(jiffies + 2UL * HZ / 100,
1416 (timeout_fn) floppy_ready));
1417 } /* fdc_dtr */
1419 static void tell_sector(void)
1421 printk(": track %d, head %d, sector %d, size %d",
1422 R_TRACK, R_HEAD, R_SECTOR, R_SIZECODE);
1423 } /* tell_sector */
1426 * OK, this error interpreting routine is called after a
1427 * DMA read/write has succeeded
1428 * or failed, so we check the results, and copy any buffers.
1429 * hhb: Added better error reporting.
1430 * ak: Made this into a separate routine.
1432 static int interpret_errors(void)
1434 char bad;
1436 if (inr != 7) {
1437 DPRINT("-- FDC reply error");
1438 FDCS->reset = 1;
1439 return 1;
1442 /* check IC to find cause of interrupt */
1443 switch (ST0 & ST0_INTR) {
1444 case 0x40: /* error occurred during command execution */
1445 if (ST1 & ST1_EOC)
1446 return 0; /* occurs with pseudo-DMA */
1447 bad = 1;
1448 if (ST1 & ST1_WP) {
1449 DPRINT("Drive is write protected\n");
1450 CLEARF(FD_DISK_WRITABLE);
1451 cont->done(0);
1452 bad = 2;
1453 } else if (ST1 & ST1_ND) {
1454 SETF(FD_NEED_TWADDLE);
1455 } else if (ST1 & ST1_OR) {
1456 if (DP->flags & FTD_MSG)
1457 DPRINT("Over/Underrun - retrying\n");
1458 bad = 0;
1459 } else if (*errors >= DP->max_errors.reporting) {
1460 DPRINT("");
1461 if (ST0 & ST0_ECE) {
1462 printk("Recalibrate failed!");
1463 } else if (ST2 & ST2_CRC) {
1464 printk("data CRC error");
1465 tell_sector();
1466 } else if (ST1 & ST1_CRC) {
1467 printk("CRC error");
1468 tell_sector();
1469 } else if ((ST1 & (ST1_MAM | ST1_ND))
1470 || (ST2 & ST2_MAM)) {
1471 if (!probing) {
1472 printk("sector not found");
1473 tell_sector();
1474 } else
1475 printk("probe failed...");
1476 } else if (ST2 & ST2_WC) { /* seek error */
1477 printk("wrong cylinder");
1478 } else if (ST2 & ST2_BC) { /* cylinder marked as bad */
1479 printk("bad cylinder");
1480 } else {
1481 printk
1482 ("unknown error. ST[0..2] are: 0x%x 0x%x 0x%x",
1483 ST0, ST1, ST2);
1484 tell_sector();
1486 printk("\n");
1488 if (ST2 & ST2_WC || ST2 & ST2_BC)
1489 /* wrong cylinder => recal */
1490 DRS->track = NEED_2_RECAL;
1491 return bad;
1492 case 0x80: /* invalid command given */
1493 DPRINT("Invalid FDC command given!\n");
1494 cont->done(0);
1495 return 2;
1496 case 0xc0:
1497 DPRINT("Abnormal termination caused by polling\n");
1498 cont->error();
1499 return 2;
1500 default: /* (0) Normal command termination */
1501 return 0;
1506 * This routine is called when everything should be correctly set up
1507 * for the transfer (i.e. floppy motor is on, the correct floppy is
1508 * selected, and the head is sitting on the right track).
1510 static void setup_rw_floppy(void)
1512 int i;
1513 int r;
1514 int flags;
1515 int dflags;
1516 unsigned long ready_date;
1517 timeout_fn function;
1519 flags = raw_cmd->flags;
1520 if (flags & (FD_RAW_READ | FD_RAW_WRITE))
1521 flags |= FD_RAW_INTR;
1523 if ((flags & FD_RAW_SPIN) && !(flags & FD_RAW_NO_MOTOR)) {
1524 ready_date = DRS->spinup_date + DP->spinup;
1525 /* If spinup will take a long time, rerun scandrives
1526 * again just before spinup completion. Beware that
1527 * after scandrives, we must again wait for selection.
1529 if (time_after(ready_date, jiffies + DP->select_delay)) {
1530 ready_date -= DP->select_delay;
1531 function = (timeout_fn) floppy_start;
1532 } else
1533 function = (timeout_fn) setup_rw_floppy;
1535 /* wait until the floppy is spinning fast enough */
1536 if (fd_wait_for_completion(ready_date, function))
1537 return;
1539 dflags = DRS->flags;
1541 if ((flags & FD_RAW_READ) || (flags & FD_RAW_WRITE))
1542 setup_DMA();
1544 if (flags & FD_RAW_INTR)
1545 do_floppy = main_command_interrupt;
1547 r = 0;
1548 for (i = 0; i < raw_cmd->cmd_count; i++)
1549 r |= output_byte(raw_cmd->cmd[i]);
1551 debugt("rw_command: ");
1553 if (r) {
1554 cont->error();
1555 reset_fdc();
1556 return;
1559 if (!(flags & FD_RAW_INTR)) {
1560 inr = result();
1561 cont->interrupt();
1562 } else if (flags & FD_RAW_NEED_DISK)
1563 fd_watchdog();
1566 static int blind_seek;
1569 * This is the routine called after every seek (or recalibrate) interrupt
1570 * from the floppy controller.
1572 static void seek_interrupt(void)
1574 debugt("seek interrupt:");
1575 if (inr != 2 || (ST0 & 0xF8) != 0x20) {
1576 DPRINT("seek failed\n");
1577 DRS->track = NEED_2_RECAL;
1578 cont->error();
1579 cont->redo();
1580 return;
1582 if (DRS->track >= 0 && DRS->track != ST1 && !blind_seek) {
1583 #ifdef DCL_DEBUG
1584 if (DP->flags & FD_DEBUG) {
1585 DPRINT
1586 ("clearing NEWCHANGE flag because of effective seek\n");
1587 DPRINT("jiffies=%lu\n", jiffies);
1589 #endif
1590 CLEARF(FD_DISK_NEWCHANGE); /* effective seek */
1591 DRS->select_date = jiffies;
1593 DRS->track = ST1;
1594 floppy_ready();
1597 static void check_wp(void)
1599 if (TESTF(FD_VERIFY)) {
1600 /* check write protection */
1601 output_byte(FD_GETSTATUS);
1602 output_byte(UNIT(current_drive));
1603 if (result() != 1) {
1604 FDCS->reset = 1;
1605 return;
1607 CLEARF(FD_VERIFY);
1608 CLEARF(FD_NEED_TWADDLE);
1609 #ifdef DCL_DEBUG
1610 if (DP->flags & FD_DEBUG) {
1611 DPRINT("checking whether disk is write protected\n");
1612 DPRINT("wp=%x\n", ST3 & 0x40);
1614 #endif
1615 if (!(ST3 & 0x40))
1616 SETF(FD_DISK_WRITABLE);
1617 else
1618 CLEARF(FD_DISK_WRITABLE);
1622 static void seek_floppy(void)
1624 int track;
1626 blind_seek = 0;
1628 #ifdef DCL_DEBUG
1629 if (DP->flags & FD_DEBUG) {
1630 DPRINT("calling disk change from seek\n");
1632 #endif
1634 if (!TESTF(FD_DISK_NEWCHANGE) &&
1635 disk_change(current_drive) && (raw_cmd->flags & FD_RAW_NEED_DISK)) {
1636 /* the media changed flag should be cleared after the seek.
1637 * If it isn't, this means that there is really no disk in
1638 * the drive.
1640 SETF(FD_DISK_CHANGED);
1641 cont->done(0);
1642 cont->redo();
1643 return;
1645 if (DRS->track <= NEED_1_RECAL) {
1646 recalibrate_floppy();
1647 return;
1648 } else if (TESTF(FD_DISK_NEWCHANGE) &&
1649 (raw_cmd->flags & FD_RAW_NEED_DISK) &&
1650 (DRS->track <= NO_TRACK || DRS->track == raw_cmd->track)) {
1651 /* we seek to clear the media-changed condition. Does anybody
1652 * know a more elegant way, which works on all drives? */
1653 if (raw_cmd->track)
1654 track = raw_cmd->track - 1;
1655 else {
1656 if (DP->flags & FD_SILENT_DCL_CLEAR) {
1657 set_dor(fdc, ~(0x10 << UNIT(current_drive)), 0);
1658 blind_seek = 1;
1659 raw_cmd->flags |= FD_RAW_NEED_SEEK;
1661 track = 1;
1663 } else {
1664 check_wp();
1665 if (raw_cmd->track != DRS->track &&
1666 (raw_cmd->flags & FD_RAW_NEED_SEEK))
1667 track = raw_cmd->track;
1668 else {
1669 setup_rw_floppy();
1670 return;
1674 do_floppy = seek_interrupt;
1675 output_byte(FD_SEEK);
1676 output_byte(UNIT(current_drive));
1677 LAST_OUT(track);
1678 debugt("seek command:");
1681 static void recal_interrupt(void)
1683 debugt("recal interrupt:");
1684 if (inr != 2)
1685 FDCS->reset = 1;
1686 else if (ST0 & ST0_ECE) {
1687 switch (DRS->track) {
1688 case NEED_1_RECAL:
1689 debugt("recal interrupt need 1 recal:");
1690 /* after a second recalibrate, we still haven't
1691 * reached track 0. Probably no drive. Raise an
1692 * error, as failing immediately might upset
1693 * computers possessed by the Devil :-) */
1694 cont->error();
1695 cont->redo();
1696 return;
1697 case NEED_2_RECAL:
1698 debugt("recal interrupt need 2 recal:");
1699 /* If we already did a recalibrate,
1700 * and we are not at track 0, this
1701 * means we have moved. (The only way
1702 * not to move at recalibration is to
1703 * be already at track 0.) Clear the
1704 * new change flag */
1705 #ifdef DCL_DEBUG
1706 if (DP->flags & FD_DEBUG) {
1707 DPRINT
1708 ("clearing NEWCHANGE flag because of second recalibrate\n");
1710 #endif
1712 CLEARF(FD_DISK_NEWCHANGE);
1713 DRS->select_date = jiffies;
1714 /* fall through */
1715 default:
1716 debugt("recal interrupt default:");
1717 /* Recalibrate moves the head by at
1718 * most 80 steps. If after one
1719 * recalibrate we don't have reached
1720 * track 0, this might mean that we
1721 * started beyond track 80. Try
1722 * again. */
1723 DRS->track = NEED_1_RECAL;
1724 break;
1726 } else
1727 DRS->track = ST1;
1728 floppy_ready();
1731 static void print_result(char *message, int inr)
1733 int i;
1735 DPRINT("%s ", message);
1736 if (inr >= 0)
1737 for (i = 0; i < inr; i++)
1738 printk("repl[%d]=%x ", i, reply_buffer[i]);
1739 printk("\n");
1742 /* interrupt handler. Note that this can be called externally on the Sparc */
1743 irqreturn_t floppy_interrupt(int irq, void *dev_id)
1745 int do_print;
1746 unsigned long f;
1747 void (*handler)(void) = do_floppy;
1749 lasthandler = handler;
1750 interruptjiffies = jiffies;
1752 f = claim_dma_lock();
1753 fd_disable_dma();
1754 release_dma_lock(f);
1756 floppy_enable_hlt();
1757 do_floppy = NULL;
1758 if (fdc >= N_FDC || FDCS->address == -1) {
1759 /* we don't even know which FDC is the culprit */
1760 printk("DOR0=%x\n", fdc_state[0].dor);
1761 printk("floppy interrupt on bizarre fdc %d\n", fdc);
1762 printk("handler=%p\n", handler);
1763 is_alive("bizarre fdc");
1764 return IRQ_NONE;
1767 FDCS->reset = 0;
1768 /* We have to clear the reset flag here, because apparently on boxes
1769 * with level triggered interrupts (PS/2, Sparc, ...), it is needed to
1770 * emit SENSEI's to clear the interrupt line. And FDCS->reset blocks the
1771 * emission of the SENSEI's.
1772 * It is OK to emit floppy commands because we are in an interrupt
1773 * handler here, and thus we have to fear no interference of other
1774 * activity.
1777 do_print = !handler && print_unex && !initialising;
1779 inr = result();
1780 if (do_print)
1781 print_result("unexpected interrupt", inr);
1782 if (inr == 0) {
1783 int max_sensei = 4;
1784 do {
1785 output_byte(FD_SENSEI);
1786 inr = result();
1787 if (do_print)
1788 print_result("sensei", inr);
1789 max_sensei--;
1790 } while ((ST0 & 0x83) != UNIT(current_drive) && inr == 2
1791 && max_sensei);
1793 if (!handler) {
1794 FDCS->reset = 1;
1795 return IRQ_NONE;
1797 schedule_bh(handler);
1798 is_alive("normal interrupt end");
1800 /* FIXME! Was it really for us? */
1801 return IRQ_HANDLED;
1804 static void recalibrate_floppy(void)
1806 debugt("recalibrate floppy:");
1807 do_floppy = recal_interrupt;
1808 output_byte(FD_RECALIBRATE);
1809 LAST_OUT(UNIT(current_drive));
1813 * Must do 4 FD_SENSEIs after reset because of ``drive polling''.
1815 static void reset_interrupt(void)
1817 debugt("reset interrupt:");
1818 result(); /* get the status ready for set_fdc */
1819 if (FDCS->reset) {
1820 printk("reset set in interrupt, calling %p\n", cont->error);
1821 cont->error(); /* a reset just after a reset. BAD! */
1823 cont->redo();
1827 * reset is done by pulling bit 2 of DOR low for a while (old FDCs),
1828 * or by setting the self clearing bit 7 of STATUS (newer FDCs)
1830 static void reset_fdc(void)
1832 unsigned long flags;
1834 do_floppy = reset_interrupt;
1835 FDCS->reset = 0;
1836 reset_fdc_info(0);
1838 /* Pseudo-DMA may intercept 'reset finished' interrupt. */
1839 /* Irrelevant for systems with true DMA (i386). */
1841 flags = claim_dma_lock();
1842 fd_disable_dma();
1843 release_dma_lock(flags);
1845 if (FDCS->version >= FDC_82072A)
1846 fd_outb(0x80 | (FDCS->dtr & 3), FD_STATUS);
1847 else {
1848 fd_outb(FDCS->dor & ~0x04, FD_DOR);
1849 udelay(FD_RESET_DELAY);
1850 fd_outb(FDCS->dor, FD_DOR);
1854 static void show_floppy(void)
1856 int i;
1858 printk("\n");
1859 printk("floppy driver state\n");
1860 printk("-------------------\n");
1861 printk("now=%lu last interrupt=%lu diff=%lu last called handler=%p\n",
1862 jiffies, interruptjiffies, jiffies - interruptjiffies,
1863 lasthandler);
1865 #ifdef FLOPPY_SANITY_CHECK
1866 printk("timeout_message=%s\n", timeout_message);
1867 printk("last output bytes:\n");
1868 for (i = 0; i < OLOGSIZE; i++)
1869 printk("%2x %2x %lu\n",
1870 output_log[(i + output_log_pos) % OLOGSIZE].data,
1871 output_log[(i + output_log_pos) % OLOGSIZE].status,
1872 output_log[(i + output_log_pos) % OLOGSIZE].jiffies);
1873 printk("last result at %lu\n", resultjiffies);
1874 printk("last redo_fd_request at %lu\n", lastredo);
1875 for (i = 0; i < resultsize; i++) {
1876 printk("%2x ", reply_buffer[i]);
1878 printk("\n");
1879 #endif
1881 printk("status=%x\n", fd_inb(FD_STATUS));
1882 printk("fdc_busy=%lu\n", fdc_busy);
1883 if (do_floppy)
1884 printk("do_floppy=%p\n", do_floppy);
1885 if (work_pending(&floppy_work))
1886 printk("floppy_work.func=%p\n", floppy_work.func);
1887 if (timer_pending(&fd_timer))
1888 printk("fd_timer.function=%p\n", fd_timer.function);
1889 if (timer_pending(&fd_timeout)) {
1890 printk("timer_function=%p\n", fd_timeout.function);
1891 printk("expires=%lu\n", fd_timeout.expires - jiffies);
1892 printk("now=%lu\n", jiffies);
1894 printk("cont=%p\n", cont);
1895 printk("current_req=%p\n", current_req);
1896 printk("command_status=%d\n", command_status);
1897 printk("\n");
1900 static void floppy_shutdown(unsigned long data)
1902 unsigned long flags;
1904 if (!initialising)
1905 show_floppy();
1906 cancel_activity();
1908 floppy_enable_hlt();
1910 flags = claim_dma_lock();
1911 fd_disable_dma();
1912 release_dma_lock(flags);
1914 /* avoid dma going to a random drive after shutdown */
1916 if (!initialising)
1917 DPRINT("floppy timeout called\n");
1918 FDCS->reset = 1;
1919 if (cont) {
1920 cont->done(0);
1921 cont->redo(); /* this will recall reset when needed */
1922 } else {
1923 printk("no cont in shutdown!\n");
1924 process_fd_request();
1926 is_alive("floppy shutdown");
1929 /* start motor, check media-changed condition and write protection */
1930 static int start_motor(void (*function)(void))
1932 int mask;
1933 int data;
1935 mask = 0xfc;
1936 data = UNIT(current_drive);
1937 if (!(raw_cmd->flags & FD_RAW_NO_MOTOR)) {
1938 if (!(FDCS->dor & (0x10 << UNIT(current_drive)))) {
1939 set_debugt();
1940 /* no read since this drive is running */
1941 DRS->first_read_date = 0;
1942 /* note motor start time if motor is not yet running */
1943 DRS->spinup_date = jiffies;
1944 data |= (0x10 << UNIT(current_drive));
1946 } else if (FDCS->dor & (0x10 << UNIT(current_drive)))
1947 mask &= ~(0x10 << UNIT(current_drive));
1949 /* starts motor and selects floppy */
1950 del_timer(motor_off_timer + current_drive);
1951 set_dor(fdc, mask, data);
1953 /* wait_for_completion also schedules reset if needed. */
1954 return (fd_wait_for_completion(DRS->select_date + DP->select_delay,
1955 (timeout_fn) function));
1958 static void floppy_ready(void)
1960 CHECK_RESET;
1961 if (start_motor(floppy_ready))
1962 return;
1963 if (fdc_dtr())
1964 return;
1966 #ifdef DCL_DEBUG
1967 if (DP->flags & FD_DEBUG) {
1968 DPRINT("calling disk change from floppy_ready\n");
1970 #endif
1971 if (!(raw_cmd->flags & FD_RAW_NO_MOTOR) &&
1972 disk_change(current_drive) && !DP->select_delay)
1973 twaddle(); /* this clears the dcl on certain drive/controller
1974 * combinations */
1976 #ifdef fd_chose_dma_mode
1977 if ((raw_cmd->flags & FD_RAW_READ) || (raw_cmd->flags & FD_RAW_WRITE)) {
1978 unsigned long flags = claim_dma_lock();
1979 fd_chose_dma_mode(raw_cmd->kernel_data, raw_cmd->length);
1980 release_dma_lock(flags);
1982 #endif
1984 if (raw_cmd->flags & (FD_RAW_NEED_SEEK | FD_RAW_NEED_DISK)) {
1985 perpendicular_mode();
1986 fdc_specify(); /* must be done here because of hut, hlt ... */
1987 seek_floppy();
1988 } else {
1989 if ((raw_cmd->flags & FD_RAW_READ) ||
1990 (raw_cmd->flags & FD_RAW_WRITE))
1991 fdc_specify();
1992 setup_rw_floppy();
1996 static void floppy_start(void)
1998 reschedule_timeout(current_reqD, "floppy start", 0);
2000 scandrives();
2001 #ifdef DCL_DEBUG
2002 if (DP->flags & FD_DEBUG) {
2003 DPRINT("setting NEWCHANGE in floppy_start\n");
2005 #endif
2006 SETF(FD_DISK_NEWCHANGE);
2007 floppy_ready();
2011 * ========================================================================
2012 * here ends the bottom half. Exported routines are:
2013 * floppy_start, floppy_off, floppy_ready, lock_fdc, unlock_fdc, set_fdc,
2014 * start_motor, reset_fdc, reset_fdc_info, interpret_errors.
2015 * Initialization also uses output_byte, result, set_dor, floppy_interrupt
2016 * and set_dor.
2017 * ========================================================================
2020 * General purpose continuations.
2021 * ==============================
2024 static void do_wakeup(void)
2026 reschedule_timeout(MAXTIMEOUT, "do wakeup", 0);
2027 cont = NULL;
2028 command_status += 2;
2029 wake_up(&command_done);
2032 static struct cont_t wakeup_cont = {
2033 .interrupt = empty,
2034 .redo = do_wakeup,
2035 .error = empty,
2036 .done = (done_f)empty
2039 static struct cont_t intr_cont = {
2040 .interrupt = empty,
2041 .redo = process_fd_request,
2042 .error = empty,
2043 .done = (done_f)empty
2046 static int wait_til_done(void (*handler)(void), int interruptible)
2048 int ret;
2050 schedule_bh(handler);
2052 if (command_status < 2 && NO_SIGNAL) {
2053 DECLARE_WAITQUEUE(wait, current);
2055 add_wait_queue(&command_done, &wait);
2056 for (;;) {
2057 set_current_state(interruptible ?
2058 TASK_INTERRUPTIBLE :
2059 TASK_UNINTERRUPTIBLE);
2061 if (command_status >= 2 || !NO_SIGNAL)
2062 break;
2064 is_alive("wait_til_done");
2065 schedule();
2068 set_current_state(TASK_RUNNING);
2069 remove_wait_queue(&command_done, &wait);
2072 if (command_status < 2) {
2073 cancel_activity();
2074 cont = &intr_cont;
2075 reset_fdc();
2076 return -EINTR;
2079 if (FDCS->reset)
2080 command_status = FD_COMMAND_ERROR;
2081 if (command_status == FD_COMMAND_OKAY)
2082 ret = 0;
2083 else
2084 ret = -EIO;
2085 command_status = FD_COMMAND_NONE;
2086 return ret;
2089 static void generic_done(int result)
2091 command_status = result;
2092 cont = &wakeup_cont;
2095 static void generic_success(void)
2097 cont->done(1);
2100 static void generic_failure(void)
2102 cont->done(0);
2105 static void success_and_wakeup(void)
2107 generic_success();
2108 cont->redo();
2112 * formatting and rw support.
2113 * ==========================
2116 static int next_valid_format(void)
2118 int probed_format;
2120 probed_format = DRS->probed_format;
2121 while (1) {
2122 if (probed_format >= 8 || !DP->autodetect[probed_format]) {
2123 DRS->probed_format = 0;
2124 return 1;
2126 if (floppy_type[DP->autodetect[probed_format]].sect) {
2127 DRS->probed_format = probed_format;
2128 return 0;
2130 probed_format++;
2134 static void bad_flp_intr(void)
2136 int err_count;
2138 if (probing) {
2139 DRS->probed_format++;
2140 if (!next_valid_format())
2141 return;
2143 err_count = ++(*errors);
2144 INFBOUND(DRWE->badness, err_count);
2145 if (err_count > DP->max_errors.abort)
2146 cont->done(0);
2147 if (err_count > DP->max_errors.reset)
2148 FDCS->reset = 1;
2149 else if (err_count > DP->max_errors.recal)
2150 DRS->track = NEED_2_RECAL;
2153 static void set_floppy(int drive)
2155 int type = ITYPE(UDRS->fd_device);
2157 if (type)
2158 _floppy = floppy_type + type;
2159 else
2160 _floppy = current_type[drive];
2164 * formatting support.
2165 * ===================
2167 static void format_interrupt(void)
2169 switch (interpret_errors()) {
2170 case 1:
2171 cont->error();
2172 case 2:
2173 break;
2174 case 0:
2175 cont->done(1);
2177 cont->redo();
2180 #define CODE2SIZE (ssize = ((1 << SIZECODE) + 3) >> 2)
2181 #define FM_MODE(x,y) ((y) & ~(((x)->rate & 0x80) >>1))
2182 #define CT(x) ((x) | 0xc0)
2183 static void setup_format_params(int track)
2185 int n;
2186 int il;
2187 int count;
2188 int head_shift;
2189 int track_shift;
2190 struct fparm {
2191 unsigned char track, head, sect, size;
2192 } *here = (struct fparm *)floppy_track_buffer;
2194 raw_cmd = &default_raw_cmd;
2195 raw_cmd->track = track;
2197 raw_cmd->flags = FD_RAW_WRITE | FD_RAW_INTR | FD_RAW_SPIN |
2198 FD_RAW_NEED_DISK | FD_RAW_NEED_SEEK;
2199 raw_cmd->rate = _floppy->rate & 0x43;
2200 raw_cmd->cmd_count = NR_F;
2201 COMMAND = FM_MODE(_floppy, FD_FORMAT);
2202 DR_SELECT = UNIT(current_drive) + PH_HEAD(_floppy, format_req.head);
2203 F_SIZECODE = FD_SIZECODE(_floppy);
2204 F_SECT_PER_TRACK = _floppy->sect << 2 >> F_SIZECODE;
2205 F_GAP = _floppy->fmt_gap;
2206 F_FILL = FD_FILL_BYTE;
2208 raw_cmd->kernel_data = floppy_track_buffer;
2209 raw_cmd->length = 4 * F_SECT_PER_TRACK;
2211 /* allow for about 30ms for data transport per track */
2212 head_shift = (F_SECT_PER_TRACK + 5) / 6;
2214 /* a ``cylinder'' is two tracks plus a little stepping time */
2215 track_shift = 2 * head_shift + 3;
2217 /* position of logical sector 1 on this track */
2218 n = (track_shift * format_req.track + head_shift * format_req.head)
2219 % F_SECT_PER_TRACK;
2221 /* determine interleave */
2222 il = 1;
2223 if (_floppy->fmt_gap < 0x22)
2224 il++;
2226 /* initialize field */
2227 for (count = 0; count < F_SECT_PER_TRACK; ++count) {
2228 here[count].track = format_req.track;
2229 here[count].head = format_req.head;
2230 here[count].sect = 0;
2231 here[count].size = F_SIZECODE;
2233 /* place logical sectors */
2234 for (count = 1; count <= F_SECT_PER_TRACK; ++count) {
2235 here[n].sect = count;
2236 n = (n + il) % F_SECT_PER_TRACK;
2237 if (here[n].sect) { /* sector busy, find next free sector */
2238 ++n;
2239 if (n >= F_SECT_PER_TRACK) {
2240 n -= F_SECT_PER_TRACK;
2241 while (here[n].sect)
2242 ++n;
2246 if (_floppy->stretch & FD_SECTBASEMASK) {
2247 for (count = 0; count < F_SECT_PER_TRACK; count++)
2248 here[count].sect += FD_SECTBASE(_floppy) - 1;
2252 static void redo_format(void)
2254 buffer_track = -1;
2255 setup_format_params(format_req.track << STRETCH(_floppy));
2256 floppy_start();
2257 debugt("queue format request");
2260 static struct cont_t format_cont = {
2261 .interrupt = format_interrupt,
2262 .redo = redo_format,
2263 .error = bad_flp_intr,
2264 .done = generic_done
2267 static int do_format(int drive, struct format_descr *tmp_format_req)
2269 int ret;
2271 LOCK_FDC(drive, 1);
2272 set_floppy(drive);
2273 if (!_floppy ||
2274 _floppy->track > DP->tracks ||
2275 tmp_format_req->track >= _floppy->track ||
2276 tmp_format_req->head >= _floppy->head ||
2277 (_floppy->sect << 2) % (1 << FD_SIZECODE(_floppy)) ||
2278 !_floppy->fmt_gap) {
2279 process_fd_request();
2280 return -EINVAL;
2282 format_req = *tmp_format_req;
2283 format_errors = 0;
2284 cont = &format_cont;
2285 errors = &format_errors;
2286 IWAIT(redo_format);
2287 process_fd_request();
2288 return ret;
2292 * Buffer read/write and support
2293 * =============================
2296 static void floppy_end_request(struct request *req, int error)
2298 unsigned int nr_sectors = current_count_sectors;
2299 unsigned int drive = (unsigned long)req->rq_disk->private_data;
2301 /* current_count_sectors can be zero if transfer failed */
2302 if (error)
2303 nr_sectors = req->current_nr_sectors;
2304 if (__blk_end_request(req, error, nr_sectors << 9))
2305 return;
2307 /* We're done with the request */
2308 floppy_off(drive);
2309 current_req = NULL;
2312 /* new request_done. Can handle physical sectors which are smaller than a
2313 * logical buffer */
2314 static void request_done(int uptodate)
2316 struct request_queue *q = floppy_queue;
2317 struct request *req = current_req;
2318 unsigned long flags;
2319 int block;
2321 probing = 0;
2322 reschedule_timeout(MAXTIMEOUT, "request done %d", uptodate);
2324 if (!req) {
2325 printk("floppy.c: no request in request_done\n");
2326 return;
2329 if (uptodate) {
2330 /* maintain values for invalidation on geometry
2331 * change */
2332 block = current_count_sectors + req->sector;
2333 INFBOUND(DRS->maxblock, block);
2334 if (block > _floppy->sect)
2335 DRS->maxtrack = 1;
2337 /* unlock chained buffers */
2338 spin_lock_irqsave(q->queue_lock, flags);
2339 floppy_end_request(req, 0);
2340 spin_unlock_irqrestore(q->queue_lock, flags);
2341 } else {
2342 if (rq_data_dir(req) == WRITE) {
2343 /* record write error information */
2344 DRWE->write_errors++;
2345 if (DRWE->write_errors == 1) {
2346 DRWE->first_error_sector = req->sector;
2347 DRWE->first_error_generation = DRS->generation;
2349 DRWE->last_error_sector = req->sector;
2350 DRWE->last_error_generation = DRS->generation;
2352 spin_lock_irqsave(q->queue_lock, flags);
2353 floppy_end_request(req, -EIO);
2354 spin_unlock_irqrestore(q->queue_lock, flags);
2358 /* Interrupt handler evaluating the result of the r/w operation */
2359 static void rw_interrupt(void)
2361 int eoc;
2362 int ssize;
2363 int heads;
2364 int nr_sectors;
2366 if (R_HEAD >= 2) {
2367 /* some Toshiba floppy controllers occasionnally seem to
2368 * return bogus interrupts after read/write operations, which
2369 * can be recognized by a bad head number (>= 2) */
2370 return;
2373 if (!DRS->first_read_date)
2374 DRS->first_read_date = jiffies;
2376 nr_sectors = 0;
2377 CODE2SIZE;
2379 if (ST1 & ST1_EOC)
2380 eoc = 1;
2381 else
2382 eoc = 0;
2384 if (COMMAND & 0x80)
2385 heads = 2;
2386 else
2387 heads = 1;
2389 nr_sectors = (((R_TRACK - TRACK) * heads +
2390 R_HEAD - HEAD) * SECT_PER_TRACK +
2391 R_SECTOR - SECTOR + eoc) << SIZECODE >> 2;
2393 #ifdef FLOPPY_SANITY_CHECK
2394 if (nr_sectors / ssize >
2395 DIV_ROUND_UP(in_sector_offset + current_count_sectors, ssize)) {
2396 DPRINT("long rw: %x instead of %lx\n",
2397 nr_sectors, current_count_sectors);
2398 printk("rs=%d s=%d\n", R_SECTOR, SECTOR);
2399 printk("rh=%d h=%d\n", R_HEAD, HEAD);
2400 printk("rt=%d t=%d\n", R_TRACK, TRACK);
2401 printk("heads=%d eoc=%d\n", heads, eoc);
2402 printk("spt=%d st=%d ss=%d\n", SECT_PER_TRACK,
2403 fsector_t, ssize);
2404 printk("in_sector_offset=%d\n", in_sector_offset);
2406 #endif
2408 nr_sectors -= in_sector_offset;
2409 INFBOUND(nr_sectors, 0);
2410 SUPBOUND(current_count_sectors, nr_sectors);
2412 switch (interpret_errors()) {
2413 case 2:
2414 cont->redo();
2415 return;
2416 case 1:
2417 if (!current_count_sectors) {
2418 cont->error();
2419 cont->redo();
2420 return;
2422 break;
2423 case 0:
2424 if (!current_count_sectors) {
2425 cont->redo();
2426 return;
2428 current_type[current_drive] = _floppy;
2429 floppy_sizes[TOMINOR(current_drive)] = _floppy->size;
2430 break;
2433 if (probing) {
2434 if (DP->flags & FTD_MSG)
2435 DPRINT("Auto-detected floppy type %s in fd%d\n",
2436 _floppy->name, current_drive);
2437 current_type[current_drive] = _floppy;
2438 floppy_sizes[TOMINOR(current_drive)] = _floppy->size;
2439 probing = 0;
2442 if (CT(COMMAND) != FD_READ ||
2443 raw_cmd->kernel_data == current_req->buffer) {
2444 /* transfer directly from buffer */
2445 cont->done(1);
2446 } else if (CT(COMMAND) == FD_READ) {
2447 buffer_track = raw_cmd->track;
2448 buffer_drive = current_drive;
2449 INFBOUND(buffer_max, nr_sectors + fsector_t);
2451 cont->redo();
2454 /* Compute maximal contiguous buffer size. */
2455 static int buffer_chain_size(void)
2457 struct bio_vec *bv;
2458 int size;
2459 struct req_iterator iter;
2460 char *base;
2462 base = bio_data(current_req->bio);
2463 size = 0;
2465 rq_for_each_segment(bv, current_req, iter) {
2466 if (page_address(bv->bv_page) + bv->bv_offset != base + size)
2467 break;
2469 size += bv->bv_len;
2472 return size >> 9;
2475 /* Compute the maximal transfer size */
2476 static int transfer_size(int ssize, int max_sector, int max_size)
2478 SUPBOUND(max_sector, fsector_t + max_size);
2480 /* alignment */
2481 max_sector -= (max_sector % _floppy->sect) % ssize;
2483 /* transfer size, beginning not aligned */
2484 current_count_sectors = max_sector - fsector_t;
2486 return max_sector;
2490 * Move data from/to the track buffer to/from the buffer cache.
2492 static void copy_buffer(int ssize, int max_sector, int max_sector_2)
2494 int remaining; /* number of transferred 512-byte sectors */
2495 struct bio_vec *bv;
2496 char *buffer;
2497 char *dma_buffer;
2498 int size;
2499 struct req_iterator iter;
2501 max_sector = transfer_size(ssize,
2502 min(max_sector, max_sector_2),
2503 current_req->nr_sectors);
2505 if (current_count_sectors <= 0 && CT(COMMAND) == FD_WRITE &&
2506 buffer_max > fsector_t + current_req->nr_sectors)
2507 current_count_sectors = min_t(int, buffer_max - fsector_t,
2508 current_req->nr_sectors);
2510 remaining = current_count_sectors << 9;
2511 #ifdef FLOPPY_SANITY_CHECK
2512 if ((remaining >> 9) > current_req->nr_sectors &&
2513 CT(COMMAND) == FD_WRITE) {
2514 DPRINT("in copy buffer\n");
2515 printk("current_count_sectors=%ld\n", current_count_sectors);
2516 printk("remaining=%d\n", remaining >> 9);
2517 printk("current_req->nr_sectors=%ld\n",
2518 current_req->nr_sectors);
2519 printk("current_req->current_nr_sectors=%u\n",
2520 current_req->current_nr_sectors);
2521 printk("max_sector=%d\n", max_sector);
2522 printk("ssize=%d\n", ssize);
2524 #endif
2526 buffer_max = max(max_sector, buffer_max);
2528 dma_buffer = floppy_track_buffer + ((fsector_t - buffer_min) << 9);
2530 size = current_req->current_nr_sectors << 9;
2532 rq_for_each_segment(bv, current_req, iter) {
2533 if (!remaining)
2534 break;
2536 size = bv->bv_len;
2537 SUPBOUND(size, remaining);
2539 buffer = page_address(bv->bv_page) + bv->bv_offset;
2540 #ifdef FLOPPY_SANITY_CHECK
2541 if (dma_buffer + size >
2542 floppy_track_buffer + (max_buffer_sectors << 10) ||
2543 dma_buffer < floppy_track_buffer) {
2544 DPRINT("buffer overrun in copy buffer %d\n",
2545 (int)((floppy_track_buffer -
2546 dma_buffer) >> 9));
2547 printk("fsector_t=%d buffer_min=%d\n",
2548 fsector_t, buffer_min);
2549 printk("current_count_sectors=%ld\n",
2550 current_count_sectors);
2551 if (CT(COMMAND) == FD_READ)
2552 printk("read\n");
2553 if (CT(COMMAND) == FD_WRITE)
2554 printk("write\n");
2555 break;
2557 if (((unsigned long)buffer) % 512)
2558 DPRINT("%p buffer not aligned\n", buffer);
2559 #endif
2560 if (CT(COMMAND) == FD_READ)
2561 memcpy(buffer, dma_buffer, size);
2562 else
2563 memcpy(dma_buffer, buffer, size);
2565 remaining -= size;
2566 dma_buffer += size;
2568 #ifdef FLOPPY_SANITY_CHECK
2569 if (remaining) {
2570 if (remaining > 0)
2571 max_sector -= remaining >> 9;
2572 DPRINT("weirdness: remaining %d\n", remaining >> 9);
2574 #endif
2577 /* work around a bug in pseudo DMA
2578 * (on some FDCs) pseudo DMA does not stop when the CPU stops
2579 * sending data. Hence we need a different way to signal the
2580 * transfer length: We use SECT_PER_TRACK. Unfortunately, this
2581 * does not work with MT, hence we can only transfer one head at
2582 * a time
2584 static void virtualdmabug_workaround(void)
2586 int hard_sectors;
2587 int end_sector;
2589 if (CT(COMMAND) == FD_WRITE) {
2590 COMMAND &= ~0x80; /* switch off multiple track mode */
2592 hard_sectors = raw_cmd->length >> (7 + SIZECODE);
2593 end_sector = SECTOR + hard_sectors - 1;
2594 #ifdef FLOPPY_SANITY_CHECK
2595 if (end_sector > SECT_PER_TRACK) {
2596 printk("too many sectors %d > %d\n",
2597 end_sector, SECT_PER_TRACK);
2598 return;
2600 #endif
2601 SECT_PER_TRACK = end_sector; /* make sure SECT_PER_TRACK points
2602 * to end of transfer */
2607 * Formulate a read/write request.
2608 * this routine decides where to load the data (directly to buffer, or to
2609 * tmp floppy area), how much data to load (the size of the buffer, the whole
2610 * track, or a single sector)
2611 * All floppy_track_buffer handling goes in here. If we ever add track buffer
2612 * allocation on the fly, it should be done here. No other part should need
2613 * modification.
2616 static int make_raw_rw_request(void)
2618 int aligned_sector_t;
2619 int max_sector;
2620 int max_size;
2621 int tracksize;
2622 int ssize;
2624 if (max_buffer_sectors == 0) {
2625 printk("VFS: Block I/O scheduled on unopened device\n");
2626 return 0;
2629 set_fdc((long)current_req->rq_disk->private_data);
2631 raw_cmd = &default_raw_cmd;
2632 raw_cmd->flags = FD_RAW_SPIN | FD_RAW_NEED_DISK | FD_RAW_NEED_DISK |
2633 FD_RAW_NEED_SEEK;
2634 raw_cmd->cmd_count = NR_RW;
2635 if (rq_data_dir(current_req) == READ) {
2636 raw_cmd->flags |= FD_RAW_READ;
2637 COMMAND = FM_MODE(_floppy, FD_READ);
2638 } else if (rq_data_dir(current_req) == WRITE) {
2639 raw_cmd->flags |= FD_RAW_WRITE;
2640 COMMAND = FM_MODE(_floppy, FD_WRITE);
2641 } else {
2642 DPRINT("make_raw_rw_request: unknown command\n");
2643 return 0;
2646 max_sector = _floppy->sect * _floppy->head;
2648 TRACK = (int)current_req->sector / max_sector;
2649 fsector_t = (int)current_req->sector % max_sector;
2650 if (_floppy->track && TRACK >= _floppy->track) {
2651 if (current_req->current_nr_sectors & 1) {
2652 current_count_sectors = 1;
2653 return 1;
2654 } else
2655 return 0;
2657 HEAD = fsector_t / _floppy->sect;
2659 if (((_floppy->stretch & (FD_SWAPSIDES | FD_SECTBASEMASK)) ||
2660 TESTF(FD_NEED_TWADDLE)) && fsector_t < _floppy->sect)
2661 max_sector = _floppy->sect;
2663 /* 2M disks have phantom sectors on the first track */
2664 if ((_floppy->rate & FD_2M) && (!TRACK) && (!HEAD)) {
2665 max_sector = 2 * _floppy->sect / 3;
2666 if (fsector_t >= max_sector) {
2667 current_count_sectors =
2668 min_t(int, _floppy->sect - fsector_t,
2669 current_req->nr_sectors);
2670 return 1;
2672 SIZECODE = 2;
2673 } else
2674 SIZECODE = FD_SIZECODE(_floppy);
2675 raw_cmd->rate = _floppy->rate & 0x43;
2676 if ((_floppy->rate & FD_2M) && (TRACK || HEAD) && raw_cmd->rate == 2)
2677 raw_cmd->rate = 1;
2679 if (SIZECODE)
2680 SIZECODE2 = 0xff;
2681 else
2682 SIZECODE2 = 0x80;
2683 raw_cmd->track = TRACK << STRETCH(_floppy);
2684 DR_SELECT = UNIT(current_drive) + PH_HEAD(_floppy, HEAD);
2685 GAP = _floppy->gap;
2686 CODE2SIZE;
2687 SECT_PER_TRACK = _floppy->sect << 2 >> SIZECODE;
2688 SECTOR = ((fsector_t % _floppy->sect) << 2 >> SIZECODE) +
2689 FD_SECTBASE(_floppy);
2691 /* tracksize describes the size which can be filled up with sectors
2692 * of size ssize.
2694 tracksize = _floppy->sect - _floppy->sect % ssize;
2695 if (tracksize < _floppy->sect) {
2696 SECT_PER_TRACK++;
2697 if (tracksize <= fsector_t % _floppy->sect)
2698 SECTOR--;
2700 /* if we are beyond tracksize, fill up using smaller sectors */
2701 while (tracksize <= fsector_t % _floppy->sect) {
2702 while (tracksize + ssize > _floppy->sect) {
2703 SIZECODE--;
2704 ssize >>= 1;
2706 SECTOR++;
2707 SECT_PER_TRACK++;
2708 tracksize += ssize;
2710 max_sector = HEAD * _floppy->sect + tracksize;
2711 } else if (!TRACK && !HEAD && !(_floppy->rate & FD_2M) && probing) {
2712 max_sector = _floppy->sect;
2713 } else if (!HEAD && CT(COMMAND) == FD_WRITE) {
2714 /* for virtual DMA bug workaround */
2715 max_sector = _floppy->sect;
2718 in_sector_offset = (fsector_t % _floppy->sect) % ssize;
2719 aligned_sector_t = fsector_t - in_sector_offset;
2720 max_size = current_req->nr_sectors;
2721 if ((raw_cmd->track == buffer_track) &&
2722 (current_drive == buffer_drive) &&
2723 (fsector_t >= buffer_min) && (fsector_t < buffer_max)) {
2724 /* data already in track buffer */
2725 if (CT(COMMAND) == FD_READ) {
2726 copy_buffer(1, max_sector, buffer_max);
2727 return 1;
2729 } else if (in_sector_offset || current_req->nr_sectors < ssize) {
2730 if (CT(COMMAND) == FD_WRITE) {
2731 if (fsector_t + current_req->nr_sectors > ssize &&
2732 fsector_t + current_req->nr_sectors < ssize + ssize)
2733 max_size = ssize + ssize;
2734 else
2735 max_size = ssize;
2737 raw_cmd->flags &= ~FD_RAW_WRITE;
2738 raw_cmd->flags |= FD_RAW_READ;
2739 COMMAND = FM_MODE(_floppy, FD_READ);
2740 } else if ((unsigned long)current_req->buffer < MAX_DMA_ADDRESS) {
2741 unsigned long dma_limit;
2742 int direct, indirect;
2744 indirect =
2745 transfer_size(ssize, max_sector,
2746 max_buffer_sectors * 2) - fsector_t;
2749 * Do NOT use minimum() here---MAX_DMA_ADDRESS is 64 bits wide
2750 * on a 64 bit machine!
2752 max_size = buffer_chain_size();
2753 dma_limit =
2754 (MAX_DMA_ADDRESS -
2755 ((unsigned long)current_req->buffer)) >> 9;
2756 if ((unsigned long)max_size > dma_limit) {
2757 max_size = dma_limit;
2759 /* 64 kb boundaries */
2760 if (CROSS_64KB(current_req->buffer, max_size << 9))
2761 max_size = (K_64 -
2762 ((unsigned long)current_req->buffer) %
2763 K_64) >> 9;
2764 direct = transfer_size(ssize, max_sector, max_size) - fsector_t;
2766 * We try to read tracks, but if we get too many errors, we
2767 * go back to reading just one sector at a time.
2769 * This means we should be able to read a sector even if there
2770 * are other bad sectors on this track.
2772 if (!direct ||
2773 (indirect * 2 > direct * 3 &&
2774 *errors < DP->max_errors.read_track && ((!probing
2775 || (DP->read_track & (1 << DRS->probed_format)))))) {
2776 max_size = current_req->nr_sectors;
2777 } else {
2778 raw_cmd->kernel_data = current_req->buffer;
2779 raw_cmd->length = current_count_sectors << 9;
2780 if (raw_cmd->length == 0) {
2781 DPRINT
2782 ("zero dma transfer attempted from make_raw_request\n");
2783 DPRINT("indirect=%d direct=%d fsector_t=%d",
2784 indirect, direct, fsector_t);
2785 return 0;
2787 virtualdmabug_workaround();
2788 return 2;
2792 if (CT(COMMAND) == FD_READ)
2793 max_size = max_sector; /* unbounded */
2795 /* claim buffer track if needed */
2796 if (buffer_track != raw_cmd->track || /* bad track */
2797 buffer_drive != current_drive || /* bad drive */
2798 fsector_t > buffer_max ||
2799 fsector_t < buffer_min ||
2800 ((CT(COMMAND) == FD_READ ||
2801 (!in_sector_offset && current_req->nr_sectors >= ssize)) &&
2802 max_sector > 2 * max_buffer_sectors + buffer_min &&
2803 max_size + fsector_t > 2 * max_buffer_sectors + buffer_min)
2804 /* not enough space */
2806 buffer_track = -1;
2807 buffer_drive = current_drive;
2808 buffer_max = buffer_min = aligned_sector_t;
2810 raw_cmd->kernel_data = floppy_track_buffer +
2811 ((aligned_sector_t - buffer_min) << 9);
2813 if (CT(COMMAND) == FD_WRITE) {
2814 /* copy write buffer to track buffer.
2815 * if we get here, we know that the write
2816 * is either aligned or the data already in the buffer
2817 * (buffer will be overwritten) */
2818 #ifdef FLOPPY_SANITY_CHECK
2819 if (in_sector_offset && buffer_track == -1)
2820 DPRINT("internal error offset !=0 on write\n");
2821 #endif
2822 buffer_track = raw_cmd->track;
2823 buffer_drive = current_drive;
2824 copy_buffer(ssize, max_sector,
2825 2 * max_buffer_sectors + buffer_min);
2826 } else
2827 transfer_size(ssize, max_sector,
2828 2 * max_buffer_sectors + buffer_min -
2829 aligned_sector_t);
2831 /* round up current_count_sectors to get dma xfer size */
2832 raw_cmd->length = in_sector_offset + current_count_sectors;
2833 raw_cmd->length = ((raw_cmd->length - 1) | (ssize - 1)) + 1;
2834 raw_cmd->length <<= 9;
2835 #ifdef FLOPPY_SANITY_CHECK
2836 if ((raw_cmd->length < current_count_sectors << 9) ||
2837 (raw_cmd->kernel_data != current_req->buffer &&
2838 CT(COMMAND) == FD_WRITE &&
2839 (aligned_sector_t + (raw_cmd->length >> 9) > buffer_max ||
2840 aligned_sector_t < buffer_min)) ||
2841 raw_cmd->length % (128 << SIZECODE) ||
2842 raw_cmd->length <= 0 || current_count_sectors <= 0) {
2843 DPRINT("fractionary current count b=%lx s=%lx\n",
2844 raw_cmd->length, current_count_sectors);
2845 if (raw_cmd->kernel_data != current_req->buffer)
2846 printk("addr=%d, length=%ld\n",
2847 (int)((raw_cmd->kernel_data -
2848 floppy_track_buffer) >> 9),
2849 current_count_sectors);
2850 printk("st=%d ast=%d mse=%d msi=%d\n",
2851 fsector_t, aligned_sector_t, max_sector, max_size);
2852 printk("ssize=%x SIZECODE=%d\n", ssize, SIZECODE);
2853 printk("command=%x SECTOR=%d HEAD=%d, TRACK=%d\n",
2854 COMMAND, SECTOR, HEAD, TRACK);
2855 printk("buffer drive=%d\n", buffer_drive);
2856 printk("buffer track=%d\n", buffer_track);
2857 printk("buffer_min=%d\n", buffer_min);
2858 printk("buffer_max=%d\n", buffer_max);
2859 return 0;
2862 if (raw_cmd->kernel_data != current_req->buffer) {
2863 if (raw_cmd->kernel_data < floppy_track_buffer ||
2864 current_count_sectors < 0 ||
2865 raw_cmd->length < 0 ||
2866 raw_cmd->kernel_data + raw_cmd->length >
2867 floppy_track_buffer + (max_buffer_sectors << 10)) {
2868 DPRINT("buffer overrun in schedule dma\n");
2869 printk("fsector_t=%d buffer_min=%d current_count=%ld\n",
2870 fsector_t, buffer_min, raw_cmd->length >> 9);
2871 printk("current_count_sectors=%ld\n",
2872 current_count_sectors);
2873 if (CT(COMMAND) == FD_READ)
2874 printk("read\n");
2875 if (CT(COMMAND) == FD_WRITE)
2876 printk("write\n");
2877 return 0;
2879 } else if (raw_cmd->length > current_req->nr_sectors << 9 ||
2880 current_count_sectors > current_req->nr_sectors) {
2881 DPRINT("buffer overrun in direct transfer\n");
2882 return 0;
2883 } else if (raw_cmd->length < current_count_sectors << 9) {
2884 DPRINT("more sectors than bytes\n");
2885 printk("bytes=%ld\n", raw_cmd->length >> 9);
2886 printk("sectors=%ld\n", current_count_sectors);
2888 if (raw_cmd->length == 0) {
2889 DPRINT("zero dma transfer attempted from make_raw_request\n");
2890 return 0;
2892 #endif
2894 virtualdmabug_workaround();
2895 return 2;
2898 static void redo_fd_request(void)
2900 #define REPEAT {request_done(0); continue; }
2901 int drive;
2902 int tmp;
2904 lastredo = jiffies;
2905 if (current_drive < N_DRIVE)
2906 floppy_off(current_drive);
2908 for (;;) {
2909 if (!current_req) {
2910 struct request *req;
2912 spin_lock_irq(floppy_queue->queue_lock);
2913 req = elv_next_request(floppy_queue);
2914 spin_unlock_irq(floppy_queue->queue_lock);
2915 if (!req) {
2916 do_floppy = NULL;
2917 unlock_fdc();
2918 return;
2920 current_req = req;
2922 drive = (long)current_req->rq_disk->private_data;
2923 set_fdc(drive);
2924 reschedule_timeout(current_reqD, "redo fd request", 0);
2926 set_floppy(drive);
2927 raw_cmd = &default_raw_cmd;
2928 raw_cmd->flags = 0;
2929 if (start_motor(redo_fd_request))
2930 return;
2931 disk_change(current_drive);
2932 if (test_bit(current_drive, &fake_change) ||
2933 TESTF(FD_DISK_CHANGED)) {
2934 DPRINT("disk absent or changed during operation\n");
2935 REPEAT;
2937 if (!_floppy) { /* Autodetection */
2938 if (!probing) {
2939 DRS->probed_format = 0;
2940 if (next_valid_format()) {
2941 DPRINT("no autodetectable formats\n");
2942 _floppy = NULL;
2943 REPEAT;
2946 probing = 1;
2947 _floppy =
2948 floppy_type + DP->autodetect[DRS->probed_format];
2949 } else
2950 probing = 0;
2951 errors = &(current_req->errors);
2952 tmp = make_raw_rw_request();
2953 if (tmp < 2) {
2954 request_done(tmp);
2955 continue;
2958 if (TESTF(FD_NEED_TWADDLE))
2959 twaddle();
2960 schedule_bh(floppy_start);
2961 debugt("queue fd request");
2962 return;
2964 #undef REPEAT
2967 static struct cont_t rw_cont = {
2968 .interrupt = rw_interrupt,
2969 .redo = redo_fd_request,
2970 .error = bad_flp_intr,
2971 .done = request_done
2974 static void process_fd_request(void)
2976 cont = &rw_cont;
2977 schedule_bh(redo_fd_request);
2980 static void do_fd_request(struct request_queue * q)
2982 if (max_buffer_sectors == 0) {
2983 printk("VFS: do_fd_request called on non-open device\n");
2984 return;
2987 if (usage_count == 0) {
2988 printk("warning: usage count=0, current_req=%p exiting\n",
2989 current_req);
2990 printk("sect=%ld type=%x flags=%x\n", (long)current_req->sector,
2991 current_req->cmd_type, current_req->cmd_flags);
2992 return;
2994 if (test_bit(0, &fdc_busy)) {
2995 /* fdc busy, this new request will be treated when the
2996 current one is done */
2997 is_alive("do fd request, old request running");
2998 return;
3000 lock_fdc(MAXTIMEOUT, 0);
3001 process_fd_request();
3002 is_alive("do fd request");
3005 static struct cont_t poll_cont = {
3006 .interrupt = success_and_wakeup,
3007 .redo = floppy_ready,
3008 .error = generic_failure,
3009 .done = generic_done
3012 static int poll_drive(int interruptible, int flag)
3014 int ret;
3016 /* no auto-sense, just clear dcl */
3017 raw_cmd = &default_raw_cmd;
3018 raw_cmd->flags = flag;
3019 raw_cmd->track = 0;
3020 raw_cmd->cmd_count = 0;
3021 cont = &poll_cont;
3022 #ifdef DCL_DEBUG
3023 if (DP->flags & FD_DEBUG) {
3024 DPRINT("setting NEWCHANGE in poll_drive\n");
3026 #endif
3027 SETF(FD_DISK_NEWCHANGE);
3028 WAIT(floppy_ready);
3029 return ret;
3033 * User triggered reset
3034 * ====================
3037 static void reset_intr(void)
3039 printk("weird, reset interrupt called\n");
3042 static struct cont_t reset_cont = {
3043 .interrupt = reset_intr,
3044 .redo = success_and_wakeup,
3045 .error = generic_failure,
3046 .done = generic_done
3049 static int user_reset_fdc(int drive, int arg, int interruptible)
3051 int ret;
3053 ret = 0;
3054 LOCK_FDC(drive, interruptible);
3055 if (arg == FD_RESET_ALWAYS)
3056 FDCS->reset = 1;
3057 if (FDCS->reset) {
3058 cont = &reset_cont;
3059 WAIT(reset_fdc);
3061 process_fd_request();
3062 return ret;
3066 * Misc Ioctl's and support
3067 * ========================
3069 static inline int fd_copyout(void __user *param, const void *address,
3070 unsigned long size)
3072 return copy_to_user(param, address, size) ? -EFAULT : 0;
3075 static inline int fd_copyin(void __user *param, void *address, unsigned long size)
3077 return copy_from_user(address, param, size) ? -EFAULT : 0;
3080 #define _COPYOUT(x) (copy_to_user((void __user *)param, &(x), sizeof(x)) ? -EFAULT : 0)
3081 #define _COPYIN(x) (copy_from_user(&(x), (void __user *)param, sizeof(x)) ? -EFAULT : 0)
3083 #define COPYOUT(x) ECALL(_COPYOUT(x))
3084 #define COPYIN(x) ECALL(_COPYIN(x))
3086 static inline const char *drive_name(int type, int drive)
3088 struct floppy_struct *floppy;
3090 if (type)
3091 floppy = floppy_type + type;
3092 else {
3093 if (UDP->native_format)
3094 floppy = floppy_type + UDP->native_format;
3095 else
3096 return "(null)";
3098 if (floppy->name)
3099 return floppy->name;
3100 else
3101 return "(null)";
3104 /* raw commands */
3105 static void raw_cmd_done(int flag)
3107 int i;
3109 if (!flag) {
3110 raw_cmd->flags |= FD_RAW_FAILURE;
3111 raw_cmd->flags |= FD_RAW_HARDFAILURE;
3112 } else {
3113 raw_cmd->reply_count = inr;
3114 if (raw_cmd->reply_count > MAX_REPLIES)
3115 raw_cmd->reply_count = 0;
3116 for (i = 0; i < raw_cmd->reply_count; i++)
3117 raw_cmd->reply[i] = reply_buffer[i];
3119 if (raw_cmd->flags & (FD_RAW_READ | FD_RAW_WRITE)) {
3120 unsigned long flags;
3121 flags = claim_dma_lock();
3122 raw_cmd->length = fd_get_dma_residue();
3123 release_dma_lock(flags);
3126 if ((raw_cmd->flags & FD_RAW_SOFTFAILURE) &&
3127 (!raw_cmd->reply_count || (raw_cmd->reply[0] & 0xc0)))
3128 raw_cmd->flags |= FD_RAW_FAILURE;
3130 if (disk_change(current_drive))
3131 raw_cmd->flags |= FD_RAW_DISK_CHANGE;
3132 else
3133 raw_cmd->flags &= ~FD_RAW_DISK_CHANGE;
3134 if (raw_cmd->flags & FD_RAW_NO_MOTOR_AFTER)
3135 motor_off_callback(current_drive);
3137 if (raw_cmd->next &&
3138 (!(raw_cmd->flags & FD_RAW_FAILURE) ||
3139 !(raw_cmd->flags & FD_RAW_STOP_IF_FAILURE)) &&
3140 ((raw_cmd->flags & FD_RAW_FAILURE) ||
3141 !(raw_cmd->flags & FD_RAW_STOP_IF_SUCCESS))) {
3142 raw_cmd = raw_cmd->next;
3143 return;
3146 generic_done(flag);
3149 static struct cont_t raw_cmd_cont = {
3150 .interrupt = success_and_wakeup,
3151 .redo = floppy_start,
3152 .error = generic_failure,
3153 .done = raw_cmd_done
3156 static inline int raw_cmd_copyout(int cmd, char __user *param,
3157 struct floppy_raw_cmd *ptr)
3159 int ret;
3161 while (ptr) {
3162 COPYOUT(*ptr);
3163 param += sizeof(struct floppy_raw_cmd);
3164 if ((ptr->flags & FD_RAW_READ) && ptr->buffer_length) {
3165 if (ptr->length >= 0
3166 && ptr->length <= ptr->buffer_length)
3167 ECALL(fd_copyout
3168 (ptr->data, ptr->kernel_data,
3169 ptr->buffer_length - ptr->length));
3171 ptr = ptr->next;
3173 return 0;
3176 static void raw_cmd_free(struct floppy_raw_cmd **ptr)
3178 struct floppy_raw_cmd *next;
3179 struct floppy_raw_cmd *this;
3181 this = *ptr;
3182 *ptr = NULL;
3183 while (this) {
3184 if (this->buffer_length) {
3185 fd_dma_mem_free((unsigned long)this->kernel_data,
3186 this->buffer_length);
3187 this->buffer_length = 0;
3189 next = this->next;
3190 kfree(this);
3191 this = next;
3195 static inline int raw_cmd_copyin(int cmd, char __user *param,
3196 struct floppy_raw_cmd **rcmd)
3198 struct floppy_raw_cmd *ptr;
3199 int ret;
3200 int i;
3202 *rcmd = NULL;
3203 while (1) {
3204 ptr = (struct floppy_raw_cmd *)
3205 kmalloc(sizeof(struct floppy_raw_cmd), GFP_USER);
3206 if (!ptr)
3207 return -ENOMEM;
3208 *rcmd = ptr;
3209 COPYIN(*ptr);
3210 ptr->next = NULL;
3211 ptr->buffer_length = 0;
3212 param += sizeof(struct floppy_raw_cmd);
3213 if (ptr->cmd_count > 33)
3214 /* the command may now also take up the space
3215 * initially intended for the reply & the
3216 * reply count. Needed for long 82078 commands
3217 * such as RESTORE, which takes ... 17 command
3218 * bytes. Murphy's law #137: When you reserve
3219 * 16 bytes for a structure, you'll one day
3220 * discover that you really need 17...
3222 return -EINVAL;
3224 for (i = 0; i < 16; i++)
3225 ptr->reply[i] = 0;
3226 ptr->resultcode = 0;
3227 ptr->kernel_data = NULL;
3229 if (ptr->flags & (FD_RAW_READ | FD_RAW_WRITE)) {
3230 if (ptr->length <= 0)
3231 return -EINVAL;
3232 ptr->kernel_data =
3233 (char *)fd_dma_mem_alloc(ptr->length);
3234 fallback_on_nodma_alloc(&ptr->kernel_data, ptr->length);
3235 if (!ptr->kernel_data)
3236 return -ENOMEM;
3237 ptr->buffer_length = ptr->length;
3239 if (ptr->flags & FD_RAW_WRITE)
3240 ECALL(fd_copyin(ptr->data, ptr->kernel_data,
3241 ptr->length));
3242 rcmd = &(ptr->next);
3243 if (!(ptr->flags & FD_RAW_MORE))
3244 return 0;
3245 ptr->rate &= 0x43;
3249 static int raw_cmd_ioctl(int cmd, void __user *param)
3251 struct floppy_raw_cmd *my_raw_cmd;
3252 int drive;
3253 int ret2;
3254 int ret;
3256 if (FDCS->rawcmd <= 1)
3257 FDCS->rawcmd = 1;
3258 for (drive = 0; drive < N_DRIVE; drive++) {
3259 if (FDC(drive) != fdc)
3260 continue;
3261 if (drive == current_drive) {
3262 if (UDRS->fd_ref > 1) {
3263 FDCS->rawcmd = 2;
3264 break;
3266 } else if (UDRS->fd_ref) {
3267 FDCS->rawcmd = 2;
3268 break;
3272 if (FDCS->reset)
3273 return -EIO;
3275 ret = raw_cmd_copyin(cmd, param, &my_raw_cmd);
3276 if (ret) {
3277 raw_cmd_free(&my_raw_cmd);
3278 return ret;
3281 raw_cmd = my_raw_cmd;
3282 cont = &raw_cmd_cont;
3283 ret = wait_til_done(floppy_start, 1);
3284 #ifdef DCL_DEBUG
3285 if (DP->flags & FD_DEBUG) {
3286 DPRINT("calling disk change from raw_cmd ioctl\n");
3288 #endif
3290 if (ret != -EINTR && FDCS->reset)
3291 ret = -EIO;
3293 DRS->track = NO_TRACK;
3295 ret2 = raw_cmd_copyout(cmd, param, my_raw_cmd);
3296 if (!ret)
3297 ret = ret2;
3298 raw_cmd_free(&my_raw_cmd);
3299 return ret;
3302 static int invalidate_drive(struct block_device *bdev)
3304 /* invalidate the buffer track to force a reread */
3305 set_bit((long)bdev->bd_disk->private_data, &fake_change);
3306 process_fd_request();
3307 check_disk_change(bdev);
3308 return 0;
3311 static inline int set_geometry(unsigned int cmd, struct floppy_struct *g,
3312 int drive, int type, struct block_device *bdev)
3314 int cnt;
3316 /* sanity checking for parameters. */
3317 if (g->sect <= 0 ||
3318 g->head <= 0 ||
3319 g->track <= 0 || g->track > UDP->tracks >> STRETCH(g) ||
3320 /* check if reserved bits are set */
3321 (g->stretch & ~(FD_STRETCH | FD_SWAPSIDES | FD_SECTBASEMASK)) != 0)
3322 return -EINVAL;
3323 if (type) {
3324 if (!capable(CAP_SYS_ADMIN))
3325 return -EPERM;
3326 mutex_lock(&open_lock);
3327 LOCK_FDC(drive, 1);
3328 floppy_type[type] = *g;
3329 floppy_type[type].name = "user format";
3330 for (cnt = type << 2; cnt < (type << 2) + 4; cnt++)
3331 floppy_sizes[cnt] = floppy_sizes[cnt + 0x80] =
3332 floppy_type[type].size + 1;
3333 process_fd_request();
3334 for (cnt = 0; cnt < N_DRIVE; cnt++) {
3335 struct block_device *bdev = opened_bdev[cnt];
3336 if (!bdev || ITYPE(drive_state[cnt].fd_device) != type)
3337 continue;
3338 __invalidate_device(bdev);
3340 mutex_unlock(&open_lock);
3341 } else {
3342 int oldStretch;
3343 LOCK_FDC(drive, 1);
3344 if (cmd != FDDEFPRM)
3345 /* notice a disk change immediately, else
3346 * we lose our settings immediately*/
3347 CALL(poll_drive(1, FD_RAW_NEED_DISK));
3348 oldStretch = g->stretch;
3349 user_params[drive] = *g;
3350 if (buffer_drive == drive)
3351 SUPBOUND(buffer_max, user_params[drive].sect);
3352 current_type[drive] = &user_params[drive];
3353 floppy_sizes[drive] = user_params[drive].size;
3354 if (cmd == FDDEFPRM)
3355 DRS->keep_data = -1;
3356 else
3357 DRS->keep_data = 1;
3358 /* invalidation. Invalidate only when needed, i.e.
3359 * when there are already sectors in the buffer cache
3360 * whose number will change. This is useful, because
3361 * mtools often changes the geometry of the disk after
3362 * looking at the boot block */
3363 if (DRS->maxblock > user_params[drive].sect ||
3364 DRS->maxtrack ||
3365 ((user_params[drive].sect ^ oldStretch) &
3366 (FD_SWAPSIDES | FD_SECTBASEMASK)))
3367 invalidate_drive(bdev);
3368 else
3369 process_fd_request();
3371 return 0;
3374 /* handle obsolete ioctl's */
3375 static int ioctl_table[] = {
3376 FDCLRPRM,
3377 FDSETPRM,
3378 FDDEFPRM,
3379 FDGETPRM,
3380 FDMSGON,
3381 FDMSGOFF,
3382 FDFMTBEG,
3383 FDFMTTRK,
3384 FDFMTEND,
3385 FDSETEMSGTRESH,
3386 FDFLUSH,
3387 FDSETMAXERRS,
3388 FDGETMAXERRS,
3389 FDGETDRVTYP,
3390 FDSETDRVPRM,
3391 FDGETDRVPRM,
3392 FDGETDRVSTAT,
3393 FDPOLLDRVSTAT,
3394 FDRESET,
3395 FDGETFDCSTAT,
3396 FDWERRORCLR,
3397 FDWERRORGET,
3398 FDRAWCMD,
3399 FDEJECT,
3400 FDTWADDLE
3403 static inline int normalize_ioctl(int *cmd, int *size)
3405 int i;
3407 for (i = 0; i < ARRAY_SIZE(ioctl_table); i++) {
3408 if ((*cmd & 0xffff) == (ioctl_table[i] & 0xffff)) {
3409 *size = _IOC_SIZE(*cmd);
3410 *cmd = ioctl_table[i];
3411 if (*size > _IOC_SIZE(*cmd)) {
3412 printk("ioctl not yet supported\n");
3413 return -EFAULT;
3415 return 0;
3418 return -EINVAL;
3421 static int get_floppy_geometry(int drive, int type, struct floppy_struct **g)
3423 if (type)
3424 *g = &floppy_type[type];
3425 else {
3426 LOCK_FDC(drive, 0);
3427 CALL(poll_drive(0, 0));
3428 process_fd_request();
3429 *g = current_type[drive];
3431 if (!*g)
3432 return -ENODEV;
3433 return 0;
3436 static int fd_getgeo(struct block_device *bdev, struct hd_geometry *geo)
3438 int drive = (long)bdev->bd_disk->private_data;
3439 int type = ITYPE(drive_state[drive].fd_device);
3440 struct floppy_struct *g;
3441 int ret;
3443 ret = get_floppy_geometry(drive, type, &g);
3444 if (ret)
3445 return ret;
3447 geo->heads = g->head;
3448 geo->sectors = g->sect;
3449 geo->cylinders = g->track;
3450 return 0;
3453 static int fd_ioctl(struct inode *inode, struct file *filp, unsigned int cmd,
3454 unsigned long param)
3456 #define FD_IOCTL_ALLOWED ((filp) && (filp)->private_data)
3457 #define OUT(c,x) case c: outparam = (const char *) (x); break
3458 #define IN(c,x,tag) case c: *(x) = inparam. tag ; return 0
3460 int drive = (long)inode->i_bdev->bd_disk->private_data;
3461 int type = ITYPE(UDRS->fd_device);
3462 int i;
3463 int ret;
3464 int size;
3465 union inparam {
3466 struct floppy_struct g; /* geometry */
3467 struct format_descr f;
3468 struct floppy_max_errors max_errors;
3469 struct floppy_drive_params dp;
3470 } inparam; /* parameters coming from user space */
3471 const char *outparam; /* parameters passed back to user space */
3473 /* convert compatibility eject ioctls into floppy eject ioctl.
3474 * We do this in order to provide a means to eject floppy disks before
3475 * installing the new fdutils package */
3476 if (cmd == CDROMEJECT || /* CD-ROM eject */
3477 cmd == 0x6470 /* SunOS floppy eject */ ) {
3478 DPRINT("obsolete eject ioctl\n");
3479 DPRINT("please use floppycontrol --eject\n");
3480 cmd = FDEJECT;
3483 /* convert the old style command into a new style command */
3484 if ((cmd & 0xff00) == 0x0200) {
3485 ECALL(normalize_ioctl(&cmd, &size));
3486 } else
3487 return -EINVAL;
3489 /* permission checks */
3490 if (((cmd & 0x40) && !FD_IOCTL_ALLOWED) ||
3491 ((cmd & 0x80) && !capable(CAP_SYS_ADMIN)))
3492 return -EPERM;
3494 /* copyin */
3495 CLEARSTRUCT(&inparam);
3496 if (_IOC_DIR(cmd) & _IOC_WRITE)
3497 ECALL(fd_copyin((void __user *)param, &inparam, size))
3499 switch (cmd) {
3500 case FDEJECT:
3501 if (UDRS->fd_ref != 1)
3502 /* somebody else has this drive open */
3503 return -EBUSY;
3504 LOCK_FDC(drive, 1);
3506 /* do the actual eject. Fails on
3507 * non-Sparc architectures */
3508 ret = fd_eject(UNIT(drive));
3510 USETF(FD_DISK_CHANGED);
3511 USETF(FD_VERIFY);
3512 process_fd_request();
3513 return ret;
3514 case FDCLRPRM:
3515 LOCK_FDC(drive, 1);
3516 current_type[drive] = NULL;
3517 floppy_sizes[drive] = MAX_DISK_SIZE << 1;
3518 UDRS->keep_data = 0;
3519 return invalidate_drive(inode->i_bdev);
3520 case FDSETPRM:
3521 case FDDEFPRM:
3522 return set_geometry(cmd, &inparam.g,
3523 drive, type, inode->i_bdev);
3524 case FDGETPRM:
3525 ECALL(get_floppy_geometry(drive, type,
3526 (struct floppy_struct **)
3527 &outparam));
3528 break;
3530 case FDMSGON:
3531 UDP->flags |= FTD_MSG;
3532 return 0;
3533 case FDMSGOFF:
3534 UDP->flags &= ~FTD_MSG;
3535 return 0;
3537 case FDFMTBEG:
3538 LOCK_FDC(drive, 1);
3539 CALL(poll_drive(1, FD_RAW_NEED_DISK));
3540 ret = UDRS->flags;
3541 process_fd_request();
3542 if (ret & FD_VERIFY)
3543 return -ENODEV;
3544 if (!(ret & FD_DISK_WRITABLE))
3545 return -EROFS;
3546 return 0;
3547 case FDFMTTRK:
3548 if (UDRS->fd_ref != 1)
3549 return -EBUSY;
3550 return do_format(drive, &inparam.f);
3551 case FDFMTEND:
3552 case FDFLUSH:
3553 LOCK_FDC(drive, 1);
3554 return invalidate_drive(inode->i_bdev);
3556 case FDSETEMSGTRESH:
3557 UDP->max_errors.reporting =
3558 (unsigned short)(param & 0x0f);
3559 return 0;
3560 OUT(FDGETMAXERRS, &UDP->max_errors);
3561 IN(FDSETMAXERRS, &UDP->max_errors, max_errors);
3563 case FDGETDRVTYP:
3564 outparam = drive_name(type, drive);
3565 SUPBOUND(size, strlen(outparam) + 1);
3566 break;
3568 IN(FDSETDRVPRM, UDP, dp);
3569 OUT(FDGETDRVPRM, UDP);
3571 case FDPOLLDRVSTAT:
3572 LOCK_FDC(drive, 1);
3573 CALL(poll_drive(1, FD_RAW_NEED_DISK));
3574 process_fd_request();
3575 /* fall through */
3576 OUT(FDGETDRVSTAT, UDRS);
3578 case FDRESET:
3579 return user_reset_fdc(drive, (int)param, 1);
3581 OUT(FDGETFDCSTAT, UFDCS);
3583 case FDWERRORCLR:
3584 CLEARSTRUCT(UDRWE);
3585 return 0;
3586 OUT(FDWERRORGET, UDRWE);
3588 case FDRAWCMD:
3589 if (type)
3590 return -EINVAL;
3591 LOCK_FDC(drive, 1);
3592 set_floppy(drive);
3593 CALL(i = raw_cmd_ioctl(cmd, (void __user *)param));
3594 process_fd_request();
3595 return i;
3597 case FDTWADDLE:
3598 LOCK_FDC(drive, 1);
3599 twaddle();
3600 process_fd_request();
3601 return 0;
3603 default:
3604 return -EINVAL;
3607 if (_IOC_DIR(cmd) & _IOC_READ)
3608 return fd_copyout((void __user *)param, outparam, size);
3609 else
3610 return 0;
3611 #undef OUT
3612 #undef IN
3615 static void __init config_types(void)
3617 int first = 1;
3618 int drive;
3620 /* read drive info out of physical CMOS */
3621 drive = 0;
3622 if (!UDP->cmos)
3623 UDP->cmos = FLOPPY0_TYPE;
3624 drive = 1;
3625 if (!UDP->cmos && FLOPPY1_TYPE)
3626 UDP->cmos = FLOPPY1_TYPE;
3628 /* FIXME: additional physical CMOS drive detection should go here */
3630 for (drive = 0; drive < N_DRIVE; drive++) {
3631 unsigned int type = UDP->cmos;
3632 struct floppy_drive_params *params;
3633 const char *name = NULL;
3634 static char temparea[32];
3636 if (type < ARRAY_SIZE(default_drive_params)) {
3637 params = &default_drive_params[type].params;
3638 if (type) {
3639 name = default_drive_params[type].name;
3640 allowed_drive_mask |= 1 << drive;
3641 } else
3642 allowed_drive_mask &= ~(1 << drive);
3643 } else {
3644 params = &default_drive_params[0].params;
3645 sprintf(temparea, "unknown type %d (usb?)", type);
3646 name = temparea;
3648 if (name) {
3649 const char *prepend = ",";
3650 if (first) {
3651 prepend = KERN_INFO "Floppy drive(s):";
3652 first = 0;
3654 printk("%s fd%d is %s", prepend, drive, name);
3656 *UDP = *params;
3658 if (!first)
3659 printk("\n");
3662 static int floppy_release(struct inode *inode, struct file *filp)
3664 int drive = (long)inode->i_bdev->bd_disk->private_data;
3666 mutex_lock(&open_lock);
3667 if (UDRS->fd_ref < 0)
3668 UDRS->fd_ref = 0;
3669 else if (!UDRS->fd_ref--) {
3670 DPRINT("floppy_release with fd_ref == 0");
3671 UDRS->fd_ref = 0;
3673 if (!UDRS->fd_ref)
3674 opened_bdev[drive] = NULL;
3675 mutex_unlock(&open_lock);
3677 return 0;
3681 * floppy_open check for aliasing (/dev/fd0 can be the same as
3682 * /dev/PS0 etc), and disallows simultaneous access to the same
3683 * drive with different device numbers.
3685 static int floppy_open(struct inode *inode, struct file *filp)
3687 int drive = (long)inode->i_bdev->bd_disk->private_data;
3688 int old_dev;
3689 int try;
3690 int res = -EBUSY;
3691 char *tmp;
3693 filp->private_data = (void *)0;
3694 mutex_lock(&open_lock);
3695 old_dev = UDRS->fd_device;
3696 if (opened_bdev[drive] && opened_bdev[drive] != inode->i_bdev)
3697 goto out2;
3699 if (!UDRS->fd_ref && (UDP->flags & FD_BROKEN_DCL)) {
3700 USETF(FD_DISK_CHANGED);
3701 USETF(FD_VERIFY);
3704 if (UDRS->fd_ref == -1 || (UDRS->fd_ref && (filp->f_flags & O_EXCL)))
3705 goto out2;
3707 if (filp->f_flags & O_EXCL)
3708 UDRS->fd_ref = -1;
3709 else
3710 UDRS->fd_ref++;
3712 opened_bdev[drive] = inode->i_bdev;
3714 res = -ENXIO;
3716 if (!floppy_track_buffer) {
3717 /* if opening an ED drive, reserve a big buffer,
3718 * else reserve a small one */
3719 if ((UDP->cmos == 6) || (UDP->cmos == 5))
3720 try = 64; /* Only 48 actually useful */
3721 else
3722 try = 32; /* Only 24 actually useful */
3724 tmp = (char *)fd_dma_mem_alloc(1024 * try);
3725 if (!tmp && !floppy_track_buffer) {
3726 try >>= 1; /* buffer only one side */
3727 INFBOUND(try, 16);
3728 tmp = (char *)fd_dma_mem_alloc(1024 * try);
3730 if (!tmp && !floppy_track_buffer) {
3731 fallback_on_nodma_alloc(&tmp, 2048 * try);
3733 if (!tmp && !floppy_track_buffer) {
3734 DPRINT("Unable to allocate DMA memory\n");
3735 goto out;
3737 if (floppy_track_buffer) {
3738 if (tmp)
3739 fd_dma_mem_free((unsigned long)tmp, try * 1024);
3740 } else {
3741 buffer_min = buffer_max = -1;
3742 floppy_track_buffer = tmp;
3743 max_buffer_sectors = try;
3747 UDRS->fd_device = iminor(inode);
3748 set_capacity(disks[drive], floppy_sizes[iminor(inode)]);
3749 if (old_dev != -1 && old_dev != iminor(inode)) {
3750 if (buffer_drive == drive)
3751 buffer_track = -1;
3754 /* Allow ioctls if we have write-permissions even if read-only open.
3755 * Needed so that programs such as fdrawcmd still can work on write
3756 * protected disks */
3757 if ((filp->f_mode & FMODE_WRITE) || !file_permission(filp, MAY_WRITE))
3758 filp->private_data = (void *)8;
3760 if (UFDCS->rawcmd == 1)
3761 UFDCS->rawcmd = 2;
3763 if (!(filp->f_flags & O_NDELAY)) {
3764 if (filp->f_mode & 3) {
3765 UDRS->last_checked = 0;
3766 check_disk_change(inode->i_bdev);
3767 if (UTESTF(FD_DISK_CHANGED))
3768 goto out;
3770 res = -EROFS;
3771 if ((filp->f_mode & 2) && !(UTESTF(FD_DISK_WRITABLE)))
3772 goto out;
3774 mutex_unlock(&open_lock);
3775 return 0;
3776 out:
3777 if (UDRS->fd_ref < 0)
3778 UDRS->fd_ref = 0;
3779 else
3780 UDRS->fd_ref--;
3781 if (!UDRS->fd_ref)
3782 opened_bdev[drive] = NULL;
3783 out2:
3784 mutex_unlock(&open_lock);
3785 return res;
3789 * Check if the disk has been changed or if a change has been faked.
3791 static int check_floppy_change(struct gendisk *disk)
3793 int drive = (long)disk->private_data;
3795 if (UTESTF(FD_DISK_CHANGED) || UTESTF(FD_VERIFY))
3796 return 1;
3798 if (time_after(jiffies, UDRS->last_checked + UDP->checkfreq)) {
3799 lock_fdc(drive, 0);
3800 poll_drive(0, 0);
3801 process_fd_request();
3804 if (UTESTF(FD_DISK_CHANGED) ||
3805 UTESTF(FD_VERIFY) ||
3806 test_bit(drive, &fake_change) ||
3807 (!ITYPE(UDRS->fd_device) && !current_type[drive]))
3808 return 1;
3809 return 0;
3813 * This implements "read block 0" for floppy_revalidate().
3814 * Needed for format autodetection, checking whether there is
3815 * a disk in the drive, and whether that disk is writable.
3818 static void floppy_rb0_complete(struct bio *bio,
3819 int err)
3821 complete((struct completion *)bio->bi_private);
3824 static int __floppy_read_block_0(struct block_device *bdev)
3826 struct bio bio;
3827 struct bio_vec bio_vec;
3828 struct completion complete;
3829 struct page *page;
3830 size_t size;
3832 page = alloc_page(GFP_NOIO);
3833 if (!page) {
3834 process_fd_request();
3835 return -ENOMEM;
3838 size = bdev->bd_block_size;
3839 if (!size)
3840 size = 1024;
3842 bio_init(&bio);
3843 bio.bi_io_vec = &bio_vec;
3844 bio_vec.bv_page = page;
3845 bio_vec.bv_len = size;
3846 bio_vec.bv_offset = 0;
3847 bio.bi_vcnt = 1;
3848 bio.bi_idx = 0;
3849 bio.bi_size = size;
3850 bio.bi_bdev = bdev;
3851 bio.bi_sector = 0;
3852 init_completion(&complete);
3853 bio.bi_private = &complete;
3854 bio.bi_end_io = floppy_rb0_complete;
3856 submit_bio(READ, &bio);
3857 generic_unplug_device(bdev_get_queue(bdev));
3858 process_fd_request();
3859 wait_for_completion(&complete);
3861 __free_page(page);
3863 return 0;
3866 /* revalidate the floppy disk, i.e. trigger format autodetection by reading
3867 * the bootblock (block 0). "Autodetection" is also needed to check whether
3868 * there is a disk in the drive at all... Thus we also do it for fixed
3869 * geometry formats */
3870 static int floppy_revalidate(struct gendisk *disk)
3872 int drive = (long)disk->private_data;
3873 #define NO_GEOM (!current_type[drive] && !ITYPE(UDRS->fd_device))
3874 int cf;
3875 int res = 0;
3877 if (UTESTF(FD_DISK_CHANGED) ||
3878 UTESTF(FD_VERIFY) || test_bit(drive, &fake_change) || NO_GEOM) {
3879 if (usage_count == 0) {
3880 printk("VFS: revalidate called on non-open device.\n");
3881 return -EFAULT;
3883 lock_fdc(drive, 0);
3884 cf = UTESTF(FD_DISK_CHANGED) || UTESTF(FD_VERIFY);
3885 if (!(cf || test_bit(drive, &fake_change) || NO_GEOM)) {
3886 process_fd_request(); /*already done by another thread */
3887 return 0;
3889 UDRS->maxblock = 0;
3890 UDRS->maxtrack = 0;
3891 if (buffer_drive == drive)
3892 buffer_track = -1;
3893 clear_bit(drive, &fake_change);
3894 UCLEARF(FD_DISK_CHANGED);
3895 if (cf)
3896 UDRS->generation++;
3897 if (NO_GEOM) {
3898 /* auto-sensing */
3899 res = __floppy_read_block_0(opened_bdev[drive]);
3900 } else {
3901 if (cf)
3902 poll_drive(0, FD_RAW_NEED_DISK);
3903 process_fd_request();
3906 set_capacity(disk, floppy_sizes[UDRS->fd_device]);
3907 return res;
3910 static struct block_device_operations floppy_fops = {
3911 .owner = THIS_MODULE,
3912 .open = floppy_open,
3913 .release = floppy_release,
3914 .ioctl = fd_ioctl,
3915 .getgeo = fd_getgeo,
3916 .media_changed = check_floppy_change,
3917 .revalidate_disk = floppy_revalidate,
3921 * Floppy Driver initialization
3922 * =============================
3925 /* Determine the floppy disk controller type */
3926 /* This routine was written by David C. Niemi */
3927 static char __init get_fdc_version(void)
3929 int r;
3931 output_byte(FD_DUMPREGS); /* 82072 and better know DUMPREGS */
3932 if (FDCS->reset)
3933 return FDC_NONE;
3934 if ((r = result()) <= 0x00)
3935 return FDC_NONE; /* No FDC present ??? */
3936 if ((r == 1) && (reply_buffer[0] == 0x80)) {
3937 printk(KERN_INFO "FDC %d is an 8272A\n", fdc);
3938 return FDC_8272A; /* 8272a/765 don't know DUMPREGS */
3940 if (r != 10) {
3941 printk
3942 ("FDC %d init: DUMPREGS: unexpected return of %d bytes.\n",
3943 fdc, r);
3944 return FDC_UNKNOWN;
3947 if (!fdc_configure()) {
3948 printk(KERN_INFO "FDC %d is an 82072\n", fdc);
3949 return FDC_82072; /* 82072 doesn't know CONFIGURE */
3952 output_byte(FD_PERPENDICULAR);
3953 if (need_more_output() == MORE_OUTPUT) {
3954 output_byte(0);
3955 } else {
3956 printk(KERN_INFO "FDC %d is an 82072A\n", fdc);
3957 return FDC_82072A; /* 82072A as found on Sparcs. */
3960 output_byte(FD_UNLOCK);
3961 r = result();
3962 if ((r == 1) && (reply_buffer[0] == 0x80)) {
3963 printk(KERN_INFO "FDC %d is a pre-1991 82077\n", fdc);
3964 return FDC_82077_ORIG; /* Pre-1991 82077, doesn't know
3965 * LOCK/UNLOCK */
3967 if ((r != 1) || (reply_buffer[0] != 0x00)) {
3968 printk("FDC %d init: UNLOCK: unexpected return of %d bytes.\n",
3969 fdc, r);
3970 return FDC_UNKNOWN;
3972 output_byte(FD_PARTID);
3973 r = result();
3974 if (r != 1) {
3975 printk("FDC %d init: PARTID: unexpected return of %d bytes.\n",
3976 fdc, r);
3977 return FDC_UNKNOWN;
3979 if (reply_buffer[0] == 0x80) {
3980 printk(KERN_INFO "FDC %d is a post-1991 82077\n", fdc);
3981 return FDC_82077; /* Revised 82077AA passes all the tests */
3983 switch (reply_buffer[0] >> 5) {
3984 case 0x0:
3985 /* Either a 82078-1 or a 82078SL running at 5Volt */
3986 printk(KERN_INFO "FDC %d is an 82078.\n", fdc);
3987 return FDC_82078;
3988 case 0x1:
3989 printk(KERN_INFO "FDC %d is a 44pin 82078\n", fdc);
3990 return FDC_82078;
3991 case 0x2:
3992 printk(KERN_INFO "FDC %d is a S82078B\n", fdc);
3993 return FDC_S82078B;
3994 case 0x3:
3995 printk(KERN_INFO "FDC %d is a National Semiconductor PC87306\n",
3996 fdc);
3997 return FDC_87306;
3998 default:
3999 printk(KERN_INFO
4000 "FDC %d init: 82078 variant with unknown PARTID=%d.\n",
4001 fdc, reply_buffer[0] >> 5);
4002 return FDC_82078_UNKN;
4004 } /* get_fdc_version */
4006 /* lilo configuration */
4008 static void __init floppy_set_flags(int *ints, int param, int param2)
4010 int i;
4012 for (i = 0; i < ARRAY_SIZE(default_drive_params); i++) {
4013 if (param)
4014 default_drive_params[i].params.flags |= param2;
4015 else
4016 default_drive_params[i].params.flags &= ~param2;
4018 DPRINT("%s flag 0x%x\n", param2 ? "Setting" : "Clearing", param);
4021 static void __init daring(int *ints, int param, int param2)
4023 int i;
4025 for (i = 0; i < ARRAY_SIZE(default_drive_params); i++) {
4026 if (param) {
4027 default_drive_params[i].params.select_delay = 0;
4028 default_drive_params[i].params.flags |=
4029 FD_SILENT_DCL_CLEAR;
4030 } else {
4031 default_drive_params[i].params.select_delay =
4032 2 * HZ / 100;
4033 default_drive_params[i].params.flags &=
4034 ~FD_SILENT_DCL_CLEAR;
4037 DPRINT("Assuming %s floppy hardware\n", param ? "standard" : "broken");
4040 static void __init set_cmos(int *ints, int dummy, int dummy2)
4042 int current_drive = 0;
4044 if (ints[0] != 2) {
4045 DPRINT("wrong number of parameters for CMOS\n");
4046 return;
4048 current_drive = ints[1];
4049 if (current_drive < 0 || current_drive >= 8) {
4050 DPRINT("bad drive for set_cmos\n");
4051 return;
4053 #if N_FDC > 1
4054 if (current_drive >= 4 && !FDC2)
4055 FDC2 = 0x370;
4056 #endif
4057 DP->cmos = ints[2];
4058 DPRINT("setting CMOS code to %d\n", ints[2]);
4061 static struct param_table {
4062 const char *name;
4063 void (*fn) (int *ints, int param, int param2);
4064 int *var;
4065 int def_param;
4066 int param2;
4067 } config_params[] __initdata = {
4068 {"allowed_drive_mask", NULL, &allowed_drive_mask, 0xff, 0}, /* obsolete */
4069 {"all_drives", NULL, &allowed_drive_mask, 0xff, 0}, /* obsolete */
4070 {"asus_pci", NULL, &allowed_drive_mask, 0x33, 0},
4071 {"irq", NULL, &FLOPPY_IRQ, 6, 0},
4072 {"dma", NULL, &FLOPPY_DMA, 2, 0},
4073 {"daring", daring, NULL, 1, 0},
4074 #if N_FDC > 1
4075 {"two_fdc", NULL, &FDC2, 0x370, 0},
4076 {"one_fdc", NULL, &FDC2, 0, 0},
4077 #endif
4078 {"thinkpad", floppy_set_flags, NULL, 1, FD_INVERTED_DCL},
4079 {"broken_dcl", floppy_set_flags, NULL, 1, FD_BROKEN_DCL},
4080 {"messages", floppy_set_flags, NULL, 1, FTD_MSG},
4081 {"silent_dcl_clear", floppy_set_flags, NULL, 1, FD_SILENT_DCL_CLEAR},
4082 {"debug", floppy_set_flags, NULL, 1, FD_DEBUG},
4083 {"nodma", NULL, &can_use_virtual_dma, 1, 0},
4084 {"omnibook", NULL, &can_use_virtual_dma, 1, 0},
4085 {"yesdma", NULL, &can_use_virtual_dma, 0, 0},
4086 {"fifo_depth", NULL, &fifo_depth, 0xa, 0},
4087 {"nofifo", NULL, &no_fifo, 0x20, 0},
4088 {"usefifo", NULL, &no_fifo, 0, 0},
4089 {"cmos", set_cmos, NULL, 0, 0},
4090 {"slow", NULL, &slow_floppy, 1, 0},
4091 {"unexpected_interrupts", NULL, &print_unex, 1, 0},
4092 {"no_unexpected_interrupts", NULL, &print_unex, 0, 0},
4093 {"L40SX", NULL, &print_unex, 0, 0}
4095 EXTRA_FLOPPY_PARAMS
4098 static int __init floppy_setup(char *str)
4100 int i;
4101 int param;
4102 int ints[11];
4104 str = get_options(str, ARRAY_SIZE(ints), ints);
4105 if (str) {
4106 for (i = 0; i < ARRAY_SIZE(config_params); i++) {
4107 if (strcmp(str, config_params[i].name) == 0) {
4108 if (ints[0])
4109 param = ints[1];
4110 else
4111 param = config_params[i].def_param;
4112 if (config_params[i].fn)
4113 config_params[i].
4114 fn(ints, param,
4115 config_params[i].param2);
4116 if (config_params[i].var) {
4117 DPRINT("%s=%d\n", str, param);
4118 *config_params[i].var = param;
4120 return 1;
4124 if (str) {
4125 DPRINT("unknown floppy option [%s]\n", str);
4127 DPRINT("allowed options are:");
4128 for (i = 0; i < ARRAY_SIZE(config_params); i++)
4129 printk(" %s", config_params[i].name);
4130 printk("\n");
4131 } else
4132 DPRINT("botched floppy option\n");
4133 DPRINT("Read Documentation/floppy.txt\n");
4134 return 0;
4137 static int have_no_fdc = -ENODEV;
4139 static ssize_t floppy_cmos_show(struct device *dev,
4140 struct device_attribute *attr, char *buf)
4142 struct platform_device *p;
4143 int drive;
4145 p = container_of(dev, struct platform_device,dev);
4146 drive = p->id;
4147 return sprintf(buf, "%X\n", UDP->cmos);
4149 DEVICE_ATTR(cmos,S_IRUGO,floppy_cmos_show,NULL);
4151 static void floppy_device_release(struct device *dev)
4155 static struct platform_device floppy_device[N_DRIVE];
4157 static struct kobject *floppy_find(dev_t dev, int *part, void *data)
4159 int drive = (*part & 3) | ((*part & 0x80) >> 5);
4160 if (drive >= N_DRIVE ||
4161 !(allowed_drive_mask & (1 << drive)) ||
4162 fdc_state[FDC(drive)].version == FDC_NONE)
4163 return NULL;
4164 if (((*part >> 2) & 0x1f) >= ARRAY_SIZE(floppy_type))
4165 return NULL;
4166 *part = 0;
4167 return get_disk(disks[drive]);
4170 static int __init floppy_init(void)
4172 int i, unit, drive;
4173 int err, dr;
4175 #if defined(CONFIG_PPC)
4176 if (check_legacy_ioport(FDC1))
4177 return -ENODEV;
4178 #endif
4180 raw_cmd = NULL;
4182 for (dr = 0; dr < N_DRIVE; dr++) {
4183 disks[dr] = alloc_disk(1);
4184 if (!disks[dr]) {
4185 err = -ENOMEM;
4186 goto out_put_disk;
4189 disks[dr]->major = FLOPPY_MAJOR;
4190 disks[dr]->first_minor = TOMINOR(dr);
4191 disks[dr]->fops = &floppy_fops;
4192 sprintf(disks[dr]->disk_name, "fd%d", dr);
4194 init_timer(&motor_off_timer[dr]);
4195 motor_off_timer[dr].data = dr;
4196 motor_off_timer[dr].function = motor_off_callback;
4199 err = register_blkdev(FLOPPY_MAJOR, "fd");
4200 if (err)
4201 goto out_put_disk;
4203 floppy_queue = blk_init_queue(do_fd_request, &floppy_lock);
4204 if (!floppy_queue) {
4205 err = -ENOMEM;
4206 goto out_unreg_blkdev;
4208 blk_queue_max_sectors(floppy_queue, 64);
4210 blk_register_region(MKDEV(FLOPPY_MAJOR, 0), 256, THIS_MODULE,
4211 floppy_find, NULL, NULL);
4213 for (i = 0; i < 256; i++)
4214 if (ITYPE(i))
4215 floppy_sizes[i] = floppy_type[ITYPE(i)].size;
4216 else
4217 floppy_sizes[i] = MAX_DISK_SIZE << 1;
4219 reschedule_timeout(MAXTIMEOUT, "floppy init", MAXTIMEOUT);
4220 config_types();
4222 for (i = 0; i < N_FDC; i++) {
4223 fdc = i;
4224 CLEARSTRUCT(FDCS);
4225 FDCS->dtr = -1;
4226 FDCS->dor = 0x4;
4227 #if defined(__sparc__) || defined(__mc68000__)
4228 /*sparcs/sun3x don't have a DOR reset which we can fall back on to */
4229 #ifdef __mc68000__
4230 if (MACH_IS_SUN3X)
4231 #endif
4232 FDCS->version = FDC_82072A;
4233 #endif
4236 use_virtual_dma = can_use_virtual_dma & 1;
4237 fdc_state[0].address = FDC1;
4238 if (fdc_state[0].address == -1) {
4239 del_timer(&fd_timeout);
4240 err = -ENODEV;
4241 goto out_unreg_region;
4243 #if N_FDC > 1
4244 fdc_state[1].address = FDC2;
4245 #endif
4247 fdc = 0; /* reset fdc in case of unexpected interrupt */
4248 err = floppy_grab_irq_and_dma();
4249 if (err) {
4250 del_timer(&fd_timeout);
4251 err = -EBUSY;
4252 goto out_unreg_region;
4255 /* initialise drive state */
4256 for (drive = 0; drive < N_DRIVE; drive++) {
4257 CLEARSTRUCT(UDRS);
4258 CLEARSTRUCT(UDRWE);
4259 USETF(FD_DISK_NEWCHANGE);
4260 USETF(FD_DISK_CHANGED);
4261 USETF(FD_VERIFY);
4262 UDRS->fd_device = -1;
4263 floppy_track_buffer = NULL;
4264 max_buffer_sectors = 0;
4267 * Small 10 msec delay to let through any interrupt that
4268 * initialization might have triggered, to not
4269 * confuse detection:
4271 msleep(10);
4273 for (i = 0; i < N_FDC; i++) {
4274 fdc = i;
4275 FDCS->driver_version = FD_DRIVER_VERSION;
4276 for (unit = 0; unit < 4; unit++)
4277 FDCS->track[unit] = 0;
4278 if (FDCS->address == -1)
4279 continue;
4280 FDCS->rawcmd = 2;
4281 if (user_reset_fdc(-1, FD_RESET_ALWAYS, 0)) {
4282 /* free ioports reserved by floppy_grab_irq_and_dma() */
4283 release_region(FDCS->address + 2, 4);
4284 release_region(FDCS->address + 7, 1);
4285 FDCS->address = -1;
4286 FDCS->version = FDC_NONE;
4287 continue;
4289 /* Try to determine the floppy controller type */
4290 FDCS->version = get_fdc_version();
4291 if (FDCS->version == FDC_NONE) {
4292 /* free ioports reserved by floppy_grab_irq_and_dma() */
4293 release_region(FDCS->address + 2, 4);
4294 release_region(FDCS->address + 7, 1);
4295 FDCS->address = -1;
4296 continue;
4298 if (can_use_virtual_dma == 2 && FDCS->version < FDC_82072A)
4299 can_use_virtual_dma = 0;
4301 have_no_fdc = 0;
4302 /* Not all FDCs seem to be able to handle the version command
4303 * properly, so force a reset for the standard FDC clones,
4304 * to avoid interrupt garbage.
4306 user_reset_fdc(-1, FD_RESET_ALWAYS, 0);
4308 fdc = 0;
4309 del_timer(&fd_timeout);
4310 current_drive = 0;
4311 initialising = 0;
4312 if (have_no_fdc) {
4313 DPRINT("no floppy controllers found\n");
4314 err = have_no_fdc;
4315 goto out_flush_work;
4318 for (drive = 0; drive < N_DRIVE; drive++) {
4319 if (!(allowed_drive_mask & (1 << drive)))
4320 continue;
4321 if (fdc_state[FDC(drive)].version == FDC_NONE)
4322 continue;
4324 floppy_device[drive].name = floppy_device_name;
4325 floppy_device[drive].id = drive;
4326 floppy_device[drive].dev.release = floppy_device_release;
4328 err = platform_device_register(&floppy_device[drive]);
4329 if (err)
4330 goto out_flush_work;
4332 err = device_create_file(&floppy_device[drive].dev,&dev_attr_cmos);
4333 if (err)
4334 goto out_unreg_platform_dev;
4336 /* to be cleaned up... */
4337 disks[drive]->private_data = (void *)(long)drive;
4338 disks[drive]->queue = floppy_queue;
4339 disks[drive]->flags |= GENHD_FL_REMOVABLE;
4340 disks[drive]->driverfs_dev = &floppy_device[drive].dev;
4341 add_disk(disks[drive]);
4344 return 0;
4346 out_unreg_platform_dev:
4347 platform_device_unregister(&floppy_device[drive]);
4348 out_flush_work:
4349 flush_scheduled_work();
4350 if (usage_count)
4351 floppy_release_irq_and_dma();
4352 out_unreg_region:
4353 blk_unregister_region(MKDEV(FLOPPY_MAJOR, 0), 256);
4354 blk_cleanup_queue(floppy_queue);
4355 out_unreg_blkdev:
4356 unregister_blkdev(FLOPPY_MAJOR, "fd");
4357 out_put_disk:
4358 while (dr--) {
4359 del_timer(&motor_off_timer[dr]);
4360 put_disk(disks[dr]);
4362 return err;
4365 static DEFINE_SPINLOCK(floppy_usage_lock);
4367 static int floppy_grab_irq_and_dma(void)
4369 unsigned long flags;
4371 spin_lock_irqsave(&floppy_usage_lock, flags);
4372 if (usage_count++) {
4373 spin_unlock_irqrestore(&floppy_usage_lock, flags);
4374 return 0;
4376 spin_unlock_irqrestore(&floppy_usage_lock, flags);
4379 * We might have scheduled a free_irq(), wait it to
4380 * drain first:
4382 flush_scheduled_work();
4384 if (fd_request_irq()) {
4385 DPRINT("Unable to grab IRQ%d for the floppy driver\n",
4386 FLOPPY_IRQ);
4387 spin_lock_irqsave(&floppy_usage_lock, flags);
4388 usage_count--;
4389 spin_unlock_irqrestore(&floppy_usage_lock, flags);
4390 return -1;
4392 if (fd_request_dma()) {
4393 DPRINT("Unable to grab DMA%d for the floppy driver\n",
4394 FLOPPY_DMA);
4395 if (can_use_virtual_dma & 2)
4396 use_virtual_dma = can_use_virtual_dma = 1;
4397 if (!(can_use_virtual_dma & 1)) {
4398 fd_free_irq();
4399 spin_lock_irqsave(&floppy_usage_lock, flags);
4400 usage_count--;
4401 spin_unlock_irqrestore(&floppy_usage_lock, flags);
4402 return -1;
4406 for (fdc = 0; fdc < N_FDC; fdc++) {
4407 if (FDCS->address != -1) {
4408 if (!request_region(FDCS->address + 2, 4, "floppy")) {
4409 DPRINT("Floppy io-port 0x%04lx in use\n",
4410 FDCS->address + 2);
4411 goto cleanup1;
4413 if (!request_region(FDCS->address + 7, 1, "floppy DIR")) {
4414 DPRINT("Floppy io-port 0x%04lx in use\n",
4415 FDCS->address + 7);
4416 goto cleanup2;
4418 /* address + 6 is reserved, and may be taken by IDE.
4419 * Unfortunately, Adaptec doesn't know this :-(, */
4422 for (fdc = 0; fdc < N_FDC; fdc++) {
4423 if (FDCS->address != -1) {
4424 reset_fdc_info(1);
4425 fd_outb(FDCS->dor, FD_DOR);
4428 fdc = 0;
4429 set_dor(0, ~0, 8); /* avoid immediate interrupt */
4431 for (fdc = 0; fdc < N_FDC; fdc++)
4432 if (FDCS->address != -1)
4433 fd_outb(FDCS->dor, FD_DOR);
4435 * The driver will try and free resources and relies on us
4436 * to know if they were allocated or not.
4438 fdc = 0;
4439 irqdma_allocated = 1;
4440 return 0;
4441 cleanup2:
4442 release_region(FDCS->address + 2, 4);
4443 cleanup1:
4444 fd_free_irq();
4445 fd_free_dma();
4446 while (--fdc >= 0) {
4447 release_region(FDCS->address + 2, 4);
4448 release_region(FDCS->address + 7, 1);
4450 spin_lock_irqsave(&floppy_usage_lock, flags);
4451 usage_count--;
4452 spin_unlock_irqrestore(&floppy_usage_lock, flags);
4453 return -1;
4456 static void floppy_release_irq_and_dma(void)
4458 int old_fdc;
4459 #ifdef FLOPPY_SANITY_CHECK
4460 #ifndef __sparc__
4461 int drive;
4462 #endif
4463 #endif
4464 long tmpsize;
4465 unsigned long tmpaddr;
4466 unsigned long flags;
4468 spin_lock_irqsave(&floppy_usage_lock, flags);
4469 if (--usage_count) {
4470 spin_unlock_irqrestore(&floppy_usage_lock, flags);
4471 return;
4473 spin_unlock_irqrestore(&floppy_usage_lock, flags);
4474 if (irqdma_allocated) {
4475 fd_disable_dma();
4476 fd_free_dma();
4477 fd_free_irq();
4478 irqdma_allocated = 0;
4480 set_dor(0, ~0, 8);
4481 #if N_FDC > 1
4482 set_dor(1, ~8, 0);
4483 #endif
4484 floppy_enable_hlt();
4486 if (floppy_track_buffer && max_buffer_sectors) {
4487 tmpsize = max_buffer_sectors * 1024;
4488 tmpaddr = (unsigned long)floppy_track_buffer;
4489 floppy_track_buffer = NULL;
4490 max_buffer_sectors = 0;
4491 buffer_min = buffer_max = -1;
4492 fd_dma_mem_free(tmpaddr, tmpsize);
4494 #ifdef FLOPPY_SANITY_CHECK
4495 #ifndef __sparc__
4496 for (drive = 0; drive < N_FDC * 4; drive++)
4497 if (timer_pending(motor_off_timer + drive))
4498 printk("motor off timer %d still active\n", drive);
4499 #endif
4501 if (timer_pending(&fd_timeout))
4502 printk("floppy timer still active:%s\n", timeout_message);
4503 if (timer_pending(&fd_timer))
4504 printk("auxiliary floppy timer still active\n");
4505 if (work_pending(&floppy_work))
4506 printk("work still pending\n");
4507 #endif
4508 old_fdc = fdc;
4509 for (fdc = 0; fdc < N_FDC; fdc++)
4510 if (FDCS->address != -1) {
4511 release_region(FDCS->address + 2, 4);
4512 release_region(FDCS->address + 7, 1);
4514 fdc = old_fdc;
4517 #ifdef MODULE
4519 static char *floppy;
4521 static void __init parse_floppy_cfg_string(char *cfg)
4523 char *ptr;
4525 while (*cfg) {
4526 for (ptr = cfg; *cfg && *cfg != ' ' && *cfg != '\t'; cfg++) ;
4527 if (*cfg) {
4528 *cfg = '\0';
4529 cfg++;
4531 if (*ptr)
4532 floppy_setup(ptr);
4536 static int __init floppy_module_init(void)
4538 if (floppy)
4539 parse_floppy_cfg_string(floppy);
4540 return floppy_init();
4542 module_init(floppy_module_init);
4544 static void __exit floppy_module_exit(void)
4546 int drive;
4548 blk_unregister_region(MKDEV(FLOPPY_MAJOR, 0), 256);
4549 unregister_blkdev(FLOPPY_MAJOR, "fd");
4551 for (drive = 0; drive < N_DRIVE; drive++) {
4552 del_timer_sync(&motor_off_timer[drive]);
4554 if ((allowed_drive_mask & (1 << drive)) &&
4555 fdc_state[FDC(drive)].version != FDC_NONE) {
4556 del_gendisk(disks[drive]);
4557 device_remove_file(&floppy_device[drive].dev, &dev_attr_cmos);
4558 platform_device_unregister(&floppy_device[drive]);
4560 put_disk(disks[drive]);
4563 del_timer_sync(&fd_timeout);
4564 del_timer_sync(&fd_timer);
4565 blk_cleanup_queue(floppy_queue);
4567 if (usage_count)
4568 floppy_release_irq_and_dma();
4570 /* eject disk, if any */
4571 fd_eject(0);
4573 module_exit(floppy_module_exit);
4575 module_param(floppy, charp, 0);
4576 module_param(FLOPPY_IRQ, int, 0);
4577 module_param(FLOPPY_DMA, int, 0);
4578 MODULE_AUTHOR("Alain L. Knaff");
4579 MODULE_SUPPORTED_DEVICE("fd");
4580 MODULE_LICENSE("GPL");
4582 #else
4584 __setup("floppy=", floppy_setup);
4585 module_init(floppy_init)
4586 #endif
4588 MODULE_ALIAS_BLOCKDEV_MAJOR(FLOPPY_MAJOR);