libertas: rename and clean up DownloadcommandToStation
[linux-2.6/openmoko-kernel/knife-kernel.git] / drivers / block / floppy.c
blob32c79a55511bd174f3effd63af4e5bd7bc594b68
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);
220 static struct completion device_release;
222 static unsigned short virtual_dma_port = 0x3f0;
223 irqreturn_t floppy_interrupt(int irq, void *dev_id);
224 static int set_dor(int fdc, char mask, char data);
226 #define K_64 0x10000 /* 64KB */
228 /* the following is the mask of allowed drives. By default units 2 and
229 * 3 of both floppy controllers are disabled, because switching on the
230 * motor of these drives causes system hangs on some PCI computers. drive
231 * 0 is the low bit (0x1), and drive 7 is the high bit (0x80). Bits are on if
232 * a drive is allowed.
234 * NOTE: This must come before we include the arch floppy header because
235 * some ports reference this variable from there. -DaveM
238 static int allowed_drive_mask = 0x33;
240 #include <asm/floppy.h>
242 static int irqdma_allocated;
244 #define DEVICE_NAME "floppy"
246 #include <linux/blkdev.h>
247 #include <linux/blkpg.h>
248 #include <linux/cdrom.h> /* for the compatibility eject ioctl */
249 #include <linux/completion.h>
251 static struct request *current_req;
252 static struct request_queue *floppy_queue;
253 static void do_fd_request(struct request_queue * q);
255 #ifndef fd_get_dma_residue
256 #define fd_get_dma_residue() get_dma_residue(FLOPPY_DMA)
257 #endif
259 /* Dma Memory related stuff */
261 #ifndef fd_dma_mem_free
262 #define fd_dma_mem_free(addr, size) free_pages(addr, get_order(size))
263 #endif
265 #ifndef fd_dma_mem_alloc
266 #define fd_dma_mem_alloc(size) __get_dma_pages(GFP_KERNEL,get_order(size))
267 #endif
269 static inline void fallback_on_nodma_alloc(char **addr, size_t l)
271 #ifdef FLOPPY_CAN_FALLBACK_ON_NODMA
272 if (*addr)
273 return; /* we have the memory */
274 if (can_use_virtual_dma != 2)
275 return; /* no fallback allowed */
276 printk("DMA memory shortage. Temporarily falling back on virtual DMA\n");
277 *addr = (char *)nodma_mem_alloc(l);
278 #else
279 return;
280 #endif
283 /* End dma memory related stuff */
285 static unsigned long fake_change;
286 static int initialising = 1;
288 #define ITYPE(x) (((x)>>2) & 0x1f)
289 #define TOMINOR(x) ((x & 3) | ((x & 4) << 5))
290 #define UNIT(x) ((x) & 0x03) /* drive on fdc */
291 #define FDC(x) (((x) & 0x04) >> 2) /* fdc of drive */
292 /* reverse mapping from unit and fdc to drive */
293 #define REVDRIVE(fdc, unit) ((unit) + ((fdc) << 2))
294 #define DP (&drive_params[current_drive])
295 #define DRS (&drive_state[current_drive])
296 #define DRWE (&write_errors[current_drive])
297 #define FDCS (&fdc_state[fdc])
298 #define CLEARF(x) clear_bit(x##_BIT, &DRS->flags)
299 #define SETF(x) set_bit(x##_BIT, &DRS->flags)
300 #define TESTF(x) test_bit(x##_BIT, &DRS->flags)
302 #define UDP (&drive_params[drive])
303 #define UDRS (&drive_state[drive])
304 #define UDRWE (&write_errors[drive])
305 #define UFDCS (&fdc_state[FDC(drive)])
306 #define UCLEARF(x) clear_bit(x##_BIT, &UDRS->flags)
307 #define USETF(x) set_bit(x##_BIT, &UDRS->flags)
308 #define UTESTF(x) test_bit(x##_BIT, &UDRS->flags)
310 #define DPRINT(format, args...) printk(DEVICE_NAME "%d: " format, current_drive , ## args)
312 #define PH_HEAD(floppy,head) (((((floppy)->stretch & 2) >>1) ^ head) << 2)
313 #define STRETCH(floppy) ((floppy)->stretch & FD_STRETCH)
315 #define CLEARSTRUCT(x) memset((x), 0, sizeof(*(x)))
317 /* read/write */
318 #define COMMAND raw_cmd->cmd[0]
319 #define DR_SELECT raw_cmd->cmd[1]
320 #define TRACK raw_cmd->cmd[2]
321 #define HEAD raw_cmd->cmd[3]
322 #define SECTOR raw_cmd->cmd[4]
323 #define SIZECODE raw_cmd->cmd[5]
324 #define SECT_PER_TRACK raw_cmd->cmd[6]
325 #define GAP raw_cmd->cmd[7]
326 #define SIZECODE2 raw_cmd->cmd[8]
327 #define NR_RW 9
329 /* format */
330 #define F_SIZECODE raw_cmd->cmd[2]
331 #define F_SECT_PER_TRACK raw_cmd->cmd[3]
332 #define F_GAP raw_cmd->cmd[4]
333 #define F_FILL raw_cmd->cmd[5]
334 #define NR_F 6
337 * Maximum disk size (in kilobytes). This default is used whenever the
338 * current disk size is unknown.
339 * [Now it is rather a minimum]
341 #define MAX_DISK_SIZE 4 /* 3984 */
344 * globals used by 'result()'
346 #define MAX_REPLIES 16
347 static unsigned char reply_buffer[MAX_REPLIES];
348 static int inr; /* size of reply buffer, when called from interrupt */
349 #define ST0 (reply_buffer[0])
350 #define ST1 (reply_buffer[1])
351 #define ST2 (reply_buffer[2])
352 #define ST3 (reply_buffer[0]) /* result of GETSTATUS */
353 #define R_TRACK (reply_buffer[3])
354 #define R_HEAD (reply_buffer[4])
355 #define R_SECTOR (reply_buffer[5])
356 #define R_SIZECODE (reply_buffer[6])
357 #define SEL_DLY (2*HZ/100)
360 * this struct defines the different floppy drive types.
362 static struct {
363 struct floppy_drive_params params;
364 const char *name; /* name printed while booting */
365 } default_drive_params[] = {
366 /* NOTE: the time values in jiffies should be in msec!
367 CMOS drive type
368 | Maximum data rate supported by drive type
369 | | Head load time, msec
370 | | | Head unload time, msec (not used)
371 | | | | Step rate interval, usec
372 | | | | | Time needed for spinup time (jiffies)
373 | | | | | | Timeout for spinning down (jiffies)
374 | | | | | | | Spindown offset (where disk stops)
375 | | | | | | | | Select delay
376 | | | | | | | | | RPS
377 | | | | | | | | | | Max number of tracks
378 | | | | | | | | | | | Interrupt timeout
379 | | | | | | | | | | | | Max nonintlv. sectors
380 | | | | | | | | | | | | | -Max Errors- flags */
381 {{0, 500, 16, 16, 8000, 1*HZ, 3*HZ, 0, SEL_DLY, 5, 80, 3*HZ, 20, {3,1,2,0,2}, 0,
382 0, { 7, 4, 8, 2, 1, 5, 3,10}, 3*HZ/2, 0 }, "unknown" },
384 {{1, 300, 16, 16, 8000, 1*HZ, 3*HZ, 0, SEL_DLY, 5, 40, 3*HZ, 17, {3,1,2,0,2}, 0,
385 0, { 1, 0, 0, 0, 0, 0, 0, 0}, 3*HZ/2, 1 }, "360K PC" }, /*5 1/4 360 KB PC*/
387 {{2, 500, 16, 16, 6000, 4*HZ/10, 3*HZ, 14, SEL_DLY, 6, 83, 3*HZ, 17, {3,1,2,0,2}, 0,
388 0, { 2, 5, 6,23,10,20,12, 0}, 3*HZ/2, 2 }, "1.2M" }, /*5 1/4 HD AT*/
390 {{3, 250, 16, 16, 3000, 1*HZ, 3*HZ, 0, SEL_DLY, 5, 83, 3*HZ, 20, {3,1,2,0,2}, 0,
391 0, { 4,22,21,30, 3, 0, 0, 0}, 3*HZ/2, 4 }, "720k" }, /*3 1/2 DD*/
393 {{4, 500, 16, 16, 4000, 4*HZ/10, 3*HZ, 10, SEL_DLY, 5, 83, 3*HZ, 20, {3,1,2,0,2}, 0,
394 0, { 7, 4,25,22,31,21,29,11}, 3*HZ/2, 7 }, "1.44M" }, /*3 1/2 HD*/
396 {{5, 1000, 15, 8, 3000, 4*HZ/10, 3*HZ, 10, SEL_DLY, 5, 83, 3*HZ, 40, {3,1,2,0,2}, 0,
397 0, { 7, 8, 4,25,28,22,31,21}, 3*HZ/2, 8 }, "2.88M AMI BIOS" }, /*3 1/2 ED*/
399 {{6, 1000, 15, 8, 3000, 4*HZ/10, 3*HZ, 10, SEL_DLY, 5, 83, 3*HZ, 40, {3,1,2,0,2}, 0,
400 0, { 7, 8, 4,25,28,22,31,21}, 3*HZ/2, 8 }, "2.88M" } /*3 1/2 ED*/
401 /* | --autodetected formats--- | | |
402 * read_track | | Name printed when booting
403 * | Native format
404 * Frequency of disk change checks */
407 static struct floppy_drive_params drive_params[N_DRIVE];
408 static struct floppy_drive_struct drive_state[N_DRIVE];
409 static struct floppy_write_errors write_errors[N_DRIVE];
410 static struct timer_list motor_off_timer[N_DRIVE];
411 static struct gendisk *disks[N_DRIVE];
412 static struct block_device *opened_bdev[N_DRIVE];
413 static DEFINE_MUTEX(open_lock);
414 static struct floppy_raw_cmd *raw_cmd, default_raw_cmd;
417 * This struct defines the different floppy types.
419 * Bit 0 of 'stretch' tells if the tracks need to be doubled for some
420 * types (e.g. 360kB diskette in 1.2MB drive, etc.). Bit 1 of 'stretch'
421 * tells if the disk is in Commodore 1581 format, which means side 0 sectors
422 * are located on side 1 of the disk but with a side 0 ID, and vice-versa.
423 * This is the same as the Sharp MZ-80 5.25" CP/M disk format, except that the
424 * 1581's logical side 0 is on physical side 1, whereas the Sharp's logical
425 * side 0 is on physical side 0 (but with the misnamed sector IDs).
426 * 'stretch' should probably be renamed to something more general, like
427 * 'options'. Other parameters should be self-explanatory (see also
428 * setfdprm(8)).
431 Size
432 | Sectors per track
433 | | Head
434 | | | Tracks
435 | | | | Stretch
436 | | | | | Gap 1 size
437 | | | | | | Data rate, | 0x40 for perp
438 | | | | | | | Spec1 (stepping rate, head unload
439 | | | | | | | | /fmt gap (gap2) */
440 static struct floppy_struct floppy_type[32] = {
441 { 0, 0,0, 0,0,0x00,0x00,0x00,0x00,NULL }, /* 0 no testing */
442 { 720, 9,2,40,0,0x2A,0x02,0xDF,0x50,"d360" }, /* 1 360KB PC */
443 { 2400,15,2,80,0,0x1B,0x00,0xDF,0x54,"h1200" }, /* 2 1.2MB AT */
444 { 720, 9,1,80,0,0x2A,0x02,0xDF,0x50,"D360" }, /* 3 360KB SS 3.5" */
445 { 1440, 9,2,80,0,0x2A,0x02,0xDF,0x50,"D720" }, /* 4 720KB 3.5" */
446 { 720, 9,2,40,1,0x23,0x01,0xDF,0x50,"h360" }, /* 5 360KB AT */
447 { 1440, 9,2,80,0,0x23,0x01,0xDF,0x50,"h720" }, /* 6 720KB AT */
448 { 2880,18,2,80,0,0x1B,0x00,0xCF,0x6C,"H1440" }, /* 7 1.44MB 3.5" */
449 { 5760,36,2,80,0,0x1B,0x43,0xAF,0x54,"E2880" }, /* 8 2.88MB 3.5" */
450 { 6240,39,2,80,0,0x1B,0x43,0xAF,0x28,"E3120" }, /* 9 3.12MB 3.5" */
452 { 2880,18,2,80,0,0x25,0x00,0xDF,0x02,"h1440" }, /* 10 1.44MB 5.25" */
453 { 3360,21,2,80,0,0x1C,0x00,0xCF,0x0C,"H1680" }, /* 11 1.68MB 3.5" */
454 { 820,10,2,41,1,0x25,0x01,0xDF,0x2E,"h410" }, /* 12 410KB 5.25" */
455 { 1640,10,2,82,0,0x25,0x02,0xDF,0x2E,"H820" }, /* 13 820KB 3.5" */
456 { 2952,18,2,82,0,0x25,0x00,0xDF,0x02,"h1476" }, /* 14 1.48MB 5.25" */
457 { 3444,21,2,82,0,0x25,0x00,0xDF,0x0C,"H1722" }, /* 15 1.72MB 3.5" */
458 { 840,10,2,42,1,0x25,0x01,0xDF,0x2E,"h420" }, /* 16 420KB 5.25" */
459 { 1660,10,2,83,0,0x25,0x02,0xDF,0x2E,"H830" }, /* 17 830KB 3.5" */
460 { 2988,18,2,83,0,0x25,0x00,0xDF,0x02,"h1494" }, /* 18 1.49MB 5.25" */
461 { 3486,21,2,83,0,0x25,0x00,0xDF,0x0C,"H1743" }, /* 19 1.74 MB 3.5" */
463 { 1760,11,2,80,0,0x1C,0x09,0xCF,0x00,"h880" }, /* 20 880KB 5.25" */
464 { 2080,13,2,80,0,0x1C,0x01,0xCF,0x00,"D1040" }, /* 21 1.04MB 3.5" */
465 { 2240,14,2,80,0,0x1C,0x19,0xCF,0x00,"D1120" }, /* 22 1.12MB 3.5" */
466 { 3200,20,2,80,0,0x1C,0x20,0xCF,0x2C,"h1600" }, /* 23 1.6MB 5.25" */
467 { 3520,22,2,80,0,0x1C,0x08,0xCF,0x2e,"H1760" }, /* 24 1.76MB 3.5" */
468 { 3840,24,2,80,0,0x1C,0x20,0xCF,0x00,"H1920" }, /* 25 1.92MB 3.5" */
469 { 6400,40,2,80,0,0x25,0x5B,0xCF,0x00,"E3200" }, /* 26 3.20MB 3.5" */
470 { 7040,44,2,80,0,0x25,0x5B,0xCF,0x00,"E3520" }, /* 27 3.52MB 3.5" */
471 { 7680,48,2,80,0,0x25,0x63,0xCF,0x00,"E3840" }, /* 28 3.84MB 3.5" */
472 { 3680,23,2,80,0,0x1C,0x10,0xCF,0x00,"H1840" }, /* 29 1.84MB 3.5" */
474 { 1600,10,2,80,0,0x25,0x02,0xDF,0x2E,"D800" }, /* 30 800KB 3.5" */
475 { 3200,20,2,80,0,0x1C,0x00,0xCF,0x2C,"H1600" }, /* 31 1.6MB 3.5" */
478 #define SECTSIZE (_FD_SECTSIZE(*floppy))
480 /* Auto-detection: Disk type used until the next media change occurs. */
481 static struct floppy_struct *current_type[N_DRIVE];
484 * User-provided type information. current_type points to
485 * the respective entry of this array.
487 static struct floppy_struct user_params[N_DRIVE];
489 static sector_t floppy_sizes[256];
491 static char floppy_device_name[] = "floppy";
494 * The driver is trying to determine the correct media format
495 * while probing is set. rw_interrupt() clears it after a
496 * successful access.
498 static int probing;
500 /* Synchronization of FDC access. */
501 #define FD_COMMAND_NONE -1
502 #define FD_COMMAND_ERROR 2
503 #define FD_COMMAND_OKAY 3
505 static volatile int command_status = FD_COMMAND_NONE;
506 static unsigned long fdc_busy;
507 static DECLARE_WAIT_QUEUE_HEAD(fdc_wait);
508 static DECLARE_WAIT_QUEUE_HEAD(command_done);
510 #define NO_SIGNAL (!interruptible || !signal_pending(current))
511 #define CALL(x) if ((x) == -EINTR) return -EINTR
512 #define ECALL(x) if ((ret = (x))) return ret;
513 #define _WAIT(x,i) CALL(ret=wait_til_done((x),i))
514 #define WAIT(x) _WAIT((x),interruptible)
515 #define IWAIT(x) _WAIT((x),1)
517 /* Errors during formatting are counted here. */
518 static int format_errors;
520 /* Format request descriptor. */
521 static struct format_descr format_req;
524 * Rate is 0 for 500kb/s, 1 for 300kbps, 2 for 250kbps
525 * Spec1 is 0xSH, where S is stepping rate (F=1ms, E=2ms, D=3ms etc),
526 * H is head unload time (1=16ms, 2=32ms, etc)
530 * Track buffer
531 * Because these are written to by the DMA controller, they must
532 * not contain a 64k byte boundary crossing, or data will be
533 * corrupted/lost.
535 static char *floppy_track_buffer;
536 static int max_buffer_sectors;
538 static int *errors;
539 typedef void (*done_f)(int);
540 static struct cont_t {
541 void (*interrupt)(void); /* this is called after the interrupt of the
542 * main command */
543 void (*redo)(void); /* this is called to retry the operation */
544 void (*error)(void); /* this is called to tally an error */
545 done_f done; /* this is called to say if the operation has
546 * succeeded/failed */
547 } *cont;
549 static void floppy_ready(void);
550 static void floppy_start(void);
551 static void process_fd_request(void);
552 static void recalibrate_floppy(void);
553 static void floppy_shutdown(unsigned long);
555 static int floppy_grab_irq_and_dma(void);
556 static void floppy_release_irq_and_dma(void);
559 * The "reset" variable should be tested whenever an interrupt is scheduled,
560 * after the commands have been sent. This is to ensure that the driver doesn't
561 * get wedged when the interrupt doesn't come because of a failed command.
562 * reset doesn't need to be tested before sending commands, because
563 * output_byte is automatically disabled when reset is set.
565 #define CHECK_RESET { if (FDCS->reset){ reset_fdc(); return; } }
566 static void reset_fdc(void);
569 * These are global variables, as that's the easiest way to give
570 * information to interrupts. They are the data used for the current
571 * request.
573 #define NO_TRACK -1
574 #define NEED_1_RECAL -2
575 #define NEED_2_RECAL -3
577 static int usage_count;
579 /* buffer related variables */
580 static int buffer_track = -1;
581 static int buffer_drive = -1;
582 static int buffer_min = -1;
583 static int buffer_max = -1;
585 /* fdc related variables, should end up in a struct */
586 static struct floppy_fdc_state fdc_state[N_FDC];
587 static int fdc; /* current fdc */
589 static struct floppy_struct *_floppy = floppy_type;
590 static unsigned char current_drive;
591 static long current_count_sectors;
592 static unsigned char fsector_t; /* sector in track */
593 static unsigned char in_sector_offset; /* offset within physical sector,
594 * expressed in units of 512 bytes */
596 #ifndef fd_eject
597 static inline int fd_eject(int drive)
599 return -EINVAL;
601 #endif
604 * Debugging
605 * =========
607 #ifdef DEBUGT
608 static long unsigned debugtimer;
610 static inline void set_debugt(void)
612 debugtimer = jiffies;
615 static inline void debugt(const char *message)
617 if (DP->flags & DEBUGT)
618 printk("%s dtime=%lu\n", message, jiffies - debugtimer);
620 #else
621 static inline void set_debugt(void) { }
622 static inline void debugt(const char *message) { }
623 #endif /* DEBUGT */
625 typedef void (*timeout_fn) (unsigned long);
626 static DEFINE_TIMER(fd_timeout, floppy_shutdown, 0, 0);
628 static const char *timeout_message;
630 #ifdef FLOPPY_SANITY_CHECK
631 static void is_alive(const char *message)
633 /* this routine checks whether the floppy driver is "alive" */
634 if (test_bit(0, &fdc_busy) && command_status < 2
635 && !timer_pending(&fd_timeout)) {
636 DPRINT("timeout handler died: %s\n", message);
639 #endif
641 static void (*do_floppy) (void) = NULL;
643 #ifdef FLOPPY_SANITY_CHECK
645 #define OLOGSIZE 20
647 static void (*lasthandler) (void);
648 static unsigned long interruptjiffies;
649 static unsigned long resultjiffies;
650 static int resultsize;
651 static unsigned long lastredo;
653 static struct output_log {
654 unsigned char data;
655 unsigned char status;
656 unsigned long jiffies;
657 } output_log[OLOGSIZE];
659 static int output_log_pos;
660 #endif
662 #define current_reqD -1
663 #define MAXTIMEOUT -2
665 static void __reschedule_timeout(int drive, const char *message, int marg)
667 if (drive == current_reqD)
668 drive = current_drive;
669 del_timer(&fd_timeout);
670 if (drive < 0 || drive >= N_DRIVE) {
671 fd_timeout.expires = jiffies + 20UL * HZ;
672 drive = 0;
673 } else
674 fd_timeout.expires = jiffies + UDP->timeout;
675 add_timer(&fd_timeout);
676 if (UDP->flags & FD_DEBUG) {
677 DPRINT("reschedule timeout ");
678 printk(message, marg);
679 printk("\n");
681 timeout_message = message;
684 static void reschedule_timeout(int drive, const char *message, int marg)
686 unsigned long flags;
688 spin_lock_irqsave(&floppy_lock, flags);
689 __reschedule_timeout(drive, message, marg);
690 spin_unlock_irqrestore(&floppy_lock, flags);
693 #define INFBOUND(a,b) (a)=max_t(int, a, b)
694 #define SUPBOUND(a,b) (a)=min_t(int, a, b)
697 * Bottom half floppy driver.
698 * ==========================
700 * This part of the file contains the code talking directly to the hardware,
701 * and also the main service loop (seek-configure-spinup-command)
705 * disk change.
706 * This routine is responsible for maintaining the FD_DISK_CHANGE flag,
707 * and the last_checked date.
709 * last_checked is the date of the last check which showed 'no disk change'
710 * FD_DISK_CHANGE is set under two conditions:
711 * 1. The floppy has been changed after some i/o to that floppy already
712 * took place.
713 * 2. No floppy disk is in the drive. This is done in order to ensure that
714 * requests are quickly flushed in case there is no disk in the drive. It
715 * follows that FD_DISK_CHANGE can only be cleared if there is a disk in
716 * the drive.
718 * For 1., maxblock is observed. Maxblock is 0 if no i/o has taken place yet.
719 * For 2., FD_DISK_NEWCHANGE is watched. FD_DISK_NEWCHANGE is cleared on
720 * each seek. If a disk is present, the disk change line should also be
721 * cleared on each seek. Thus, if FD_DISK_NEWCHANGE is clear, but the disk
722 * change line is set, this means either that no disk is in the drive, or
723 * that it has been removed since the last seek.
725 * This means that we really have a third possibility too:
726 * The floppy has been changed after the last seek.
729 static int disk_change(int drive)
731 int fdc = FDC(drive);
733 #ifdef FLOPPY_SANITY_CHECK
734 if (time_before(jiffies, UDRS->select_date + UDP->select_delay))
735 DPRINT("WARNING disk change called early\n");
736 if (!(FDCS->dor & (0x10 << UNIT(drive))) ||
737 (FDCS->dor & 3) != UNIT(drive) || fdc != FDC(drive)) {
738 DPRINT("probing disk change on unselected drive\n");
739 DPRINT("drive=%d fdc=%d dor=%x\n", drive, FDC(drive),
740 (unsigned int)FDCS->dor);
742 #endif
744 #ifdef DCL_DEBUG
745 if (UDP->flags & FD_DEBUG) {
746 DPRINT("checking disk change line for drive %d\n", drive);
747 DPRINT("jiffies=%lu\n", jiffies);
748 DPRINT("disk change line=%x\n", fd_inb(FD_DIR) & 0x80);
749 DPRINT("flags=%lx\n", UDRS->flags);
751 #endif
752 if (UDP->flags & FD_BROKEN_DCL)
753 return UTESTF(FD_DISK_CHANGED);
754 if ((fd_inb(FD_DIR) ^ UDP->flags) & 0x80) {
755 USETF(FD_VERIFY); /* verify write protection */
756 if (UDRS->maxblock) {
757 /* mark it changed */
758 USETF(FD_DISK_CHANGED);
761 /* invalidate its geometry */
762 if (UDRS->keep_data >= 0) {
763 if ((UDP->flags & FTD_MSG) &&
764 current_type[drive] != NULL)
765 DPRINT("Disk type is undefined after "
766 "disk change\n");
767 current_type[drive] = NULL;
768 floppy_sizes[TOMINOR(drive)] = MAX_DISK_SIZE << 1;
771 return 1;
772 } else {
773 UDRS->last_checked = jiffies;
774 UCLEARF(FD_DISK_NEWCHANGE);
776 return 0;
779 static inline int is_selected(int dor, int unit)
781 return ((dor & (0x10 << unit)) && (dor & 3) == unit);
784 static int set_dor(int fdc, char mask, char data)
786 unsigned char unit;
787 unsigned char drive;
788 unsigned char newdor;
789 unsigned char olddor;
791 if (FDCS->address == -1)
792 return -1;
794 olddor = FDCS->dor;
795 newdor = (olddor & mask) | data;
796 if (newdor != olddor) {
797 unit = olddor & 0x3;
798 if (is_selected(olddor, unit) && !is_selected(newdor, unit)) {
799 drive = REVDRIVE(fdc, unit);
800 #ifdef DCL_DEBUG
801 if (UDP->flags & FD_DEBUG) {
802 DPRINT("calling disk change from set_dor\n");
804 #endif
805 disk_change(drive);
807 FDCS->dor = newdor;
808 fd_outb(newdor, FD_DOR);
810 unit = newdor & 0x3;
811 if (!is_selected(olddor, unit) && is_selected(newdor, unit)) {
812 drive = REVDRIVE(fdc, unit);
813 UDRS->select_date = jiffies;
816 return olddor;
819 static void twaddle(void)
821 if (DP->select_delay)
822 return;
823 fd_outb(FDCS->dor & ~(0x10 << UNIT(current_drive)), FD_DOR);
824 fd_outb(FDCS->dor, FD_DOR);
825 DRS->select_date = jiffies;
828 /* reset all driver information about the current fdc. This is needed after
829 * a reset, and after a raw command. */
830 static void reset_fdc_info(int mode)
832 int drive;
834 FDCS->spec1 = FDCS->spec2 = -1;
835 FDCS->need_configure = 1;
836 FDCS->perp_mode = 1;
837 FDCS->rawcmd = 0;
838 for (drive = 0; drive < N_DRIVE; drive++)
839 if (FDC(drive) == fdc && (mode || UDRS->track != NEED_1_RECAL))
840 UDRS->track = NEED_2_RECAL;
843 /* selects the fdc and drive, and enables the fdc's input/dma. */
844 static void set_fdc(int drive)
846 if (drive >= 0 && drive < N_DRIVE) {
847 fdc = FDC(drive);
848 current_drive = drive;
850 if (fdc != 1 && fdc != 0) {
851 printk("bad fdc value\n");
852 return;
854 set_dor(fdc, ~0, 8);
855 #if N_FDC > 1
856 set_dor(1 - fdc, ~8, 0);
857 #endif
858 if (FDCS->rawcmd == 2)
859 reset_fdc_info(1);
860 if (fd_inb(FD_STATUS) != STATUS_READY)
861 FDCS->reset = 1;
864 /* locks the driver */
865 static int _lock_fdc(int drive, int interruptible, int line)
867 if (!usage_count) {
868 printk(KERN_ERR
869 "Trying to lock fdc while usage count=0 at line %d\n",
870 line);
871 return -1;
874 if (test_and_set_bit(0, &fdc_busy)) {
875 DECLARE_WAITQUEUE(wait, current);
876 add_wait_queue(&fdc_wait, &wait);
878 for (;;) {
879 set_current_state(TASK_INTERRUPTIBLE);
881 if (!test_and_set_bit(0, &fdc_busy))
882 break;
884 schedule();
886 if (!NO_SIGNAL) {
887 remove_wait_queue(&fdc_wait, &wait);
888 return -EINTR;
892 set_current_state(TASK_RUNNING);
893 remove_wait_queue(&fdc_wait, &wait);
894 flush_scheduled_work();
896 command_status = FD_COMMAND_NONE;
898 __reschedule_timeout(drive, "lock fdc", 0);
899 set_fdc(drive);
900 return 0;
903 #define lock_fdc(drive,interruptible) _lock_fdc(drive,interruptible, __LINE__)
905 #define LOCK_FDC(drive,interruptible) \
906 if (lock_fdc(drive,interruptible)) return -EINTR;
908 /* unlocks the driver */
909 static inline void unlock_fdc(void)
911 unsigned long flags;
913 raw_cmd = NULL;
914 if (!test_bit(0, &fdc_busy))
915 DPRINT("FDC access conflict!\n");
917 if (do_floppy)
918 DPRINT("device interrupt still active at FDC release: %p!\n",
919 do_floppy);
920 command_status = FD_COMMAND_NONE;
921 spin_lock_irqsave(&floppy_lock, flags);
922 del_timer(&fd_timeout);
923 cont = NULL;
924 clear_bit(0, &fdc_busy);
925 if (elv_next_request(floppy_queue))
926 do_fd_request(floppy_queue);
927 spin_unlock_irqrestore(&floppy_lock, flags);
928 wake_up(&fdc_wait);
931 /* switches the motor off after a given timeout */
932 static void motor_off_callback(unsigned long nr)
934 unsigned char mask = ~(0x10 << UNIT(nr));
936 set_dor(FDC(nr), mask, 0);
939 /* schedules motor off */
940 static void floppy_off(unsigned int drive)
942 unsigned long volatile delta;
943 int fdc = FDC(drive);
945 if (!(FDCS->dor & (0x10 << UNIT(drive))))
946 return;
948 del_timer(motor_off_timer + drive);
950 /* make spindle stop in a position which minimizes spinup time
951 * next time */
952 if (UDP->rps) {
953 delta = jiffies - UDRS->first_read_date + HZ -
954 UDP->spindown_offset;
955 delta = ((delta * UDP->rps) % HZ) / UDP->rps;
956 motor_off_timer[drive].expires =
957 jiffies + UDP->spindown - delta;
959 add_timer(motor_off_timer + drive);
963 * cycle through all N_DRIVE floppy drives, for disk change testing.
964 * stopping at current drive. This is done before any long operation, to
965 * be sure to have up to date disk change information.
967 static void scandrives(void)
969 int i;
970 int drive;
971 int saved_drive;
973 if (DP->select_delay)
974 return;
976 saved_drive = current_drive;
977 for (i = 0; i < N_DRIVE; i++) {
978 drive = (saved_drive + i + 1) % N_DRIVE;
979 if (UDRS->fd_ref == 0 || UDP->select_delay != 0)
980 continue; /* skip closed drives */
981 set_fdc(drive);
982 if (!(set_dor(fdc, ~3, UNIT(drive) | (0x10 << UNIT(drive))) &
983 (0x10 << UNIT(drive))))
984 /* switch the motor off again, if it was off to
985 * begin with */
986 set_dor(fdc, ~(0x10 << UNIT(drive)), 0);
988 set_fdc(saved_drive);
991 static void empty(void)
995 static DECLARE_WORK(floppy_work, NULL);
997 static void schedule_bh(void (*handler) (void))
999 PREPARE_WORK(&floppy_work, (work_func_t)handler);
1000 schedule_work(&floppy_work);
1003 static DEFINE_TIMER(fd_timer, NULL, 0, 0);
1005 static void cancel_activity(void)
1007 unsigned long flags;
1009 spin_lock_irqsave(&floppy_lock, flags);
1010 do_floppy = NULL;
1011 PREPARE_WORK(&floppy_work, (work_func_t)empty);
1012 del_timer(&fd_timer);
1013 spin_unlock_irqrestore(&floppy_lock, flags);
1016 /* this function makes sure that the disk stays in the drive during the
1017 * transfer */
1018 static void fd_watchdog(void)
1020 #ifdef DCL_DEBUG
1021 if (DP->flags & FD_DEBUG) {
1022 DPRINT("calling disk change from watchdog\n");
1024 #endif
1026 if (disk_change(current_drive)) {
1027 DPRINT("disk removed during i/o\n");
1028 cancel_activity();
1029 cont->done(0);
1030 reset_fdc();
1031 } else {
1032 del_timer(&fd_timer);
1033 fd_timer.function = (timeout_fn) fd_watchdog;
1034 fd_timer.expires = jiffies + HZ / 10;
1035 add_timer(&fd_timer);
1039 static void main_command_interrupt(void)
1041 del_timer(&fd_timer);
1042 cont->interrupt();
1045 /* waits for a delay (spinup or select) to pass */
1046 static int fd_wait_for_completion(unsigned long delay, timeout_fn function)
1048 if (FDCS->reset) {
1049 reset_fdc(); /* do the reset during sleep to win time
1050 * if we don't need to sleep, it's a good
1051 * occasion anyways */
1052 return 1;
1055 if (time_before(jiffies, delay)) {
1056 del_timer(&fd_timer);
1057 fd_timer.function = function;
1058 fd_timer.expires = delay;
1059 add_timer(&fd_timer);
1060 return 1;
1062 return 0;
1065 static DEFINE_SPINLOCK(floppy_hlt_lock);
1066 static int hlt_disabled;
1067 static void floppy_disable_hlt(void)
1069 unsigned long flags;
1071 spin_lock_irqsave(&floppy_hlt_lock, flags);
1072 if (!hlt_disabled) {
1073 hlt_disabled = 1;
1074 #ifdef HAVE_DISABLE_HLT
1075 disable_hlt();
1076 #endif
1078 spin_unlock_irqrestore(&floppy_hlt_lock, flags);
1081 static void floppy_enable_hlt(void)
1083 unsigned long flags;
1085 spin_lock_irqsave(&floppy_hlt_lock, flags);
1086 if (hlt_disabled) {
1087 hlt_disabled = 0;
1088 #ifdef HAVE_DISABLE_HLT
1089 enable_hlt();
1090 #endif
1092 spin_unlock_irqrestore(&floppy_hlt_lock, flags);
1095 static void setup_DMA(void)
1097 unsigned long f;
1099 #ifdef FLOPPY_SANITY_CHECK
1100 if (raw_cmd->length == 0) {
1101 int i;
1103 printk("zero dma transfer size:");
1104 for (i = 0; i < raw_cmd->cmd_count; i++)
1105 printk("%x,", raw_cmd->cmd[i]);
1106 printk("\n");
1107 cont->done(0);
1108 FDCS->reset = 1;
1109 return;
1111 if (((unsigned long)raw_cmd->kernel_data) % 512) {
1112 printk("non aligned address: %p\n", raw_cmd->kernel_data);
1113 cont->done(0);
1114 FDCS->reset = 1;
1115 return;
1117 #endif
1118 f = claim_dma_lock();
1119 fd_disable_dma();
1120 #ifdef fd_dma_setup
1121 if (fd_dma_setup(raw_cmd->kernel_data, raw_cmd->length,
1122 (raw_cmd->flags & FD_RAW_READ) ?
1123 DMA_MODE_READ : DMA_MODE_WRITE, FDCS->address) < 0) {
1124 release_dma_lock(f);
1125 cont->done(0);
1126 FDCS->reset = 1;
1127 return;
1129 release_dma_lock(f);
1130 #else
1131 fd_clear_dma_ff();
1132 fd_cacheflush(raw_cmd->kernel_data, raw_cmd->length);
1133 fd_set_dma_mode((raw_cmd->flags & FD_RAW_READ) ?
1134 DMA_MODE_READ : DMA_MODE_WRITE);
1135 fd_set_dma_addr(raw_cmd->kernel_data);
1136 fd_set_dma_count(raw_cmd->length);
1137 virtual_dma_port = FDCS->address;
1138 fd_enable_dma();
1139 release_dma_lock(f);
1140 #endif
1141 floppy_disable_hlt();
1144 static void show_floppy(void);
1146 /* waits until the fdc becomes ready */
1147 static int wait_til_ready(void)
1149 int status;
1150 int counter;
1152 if (FDCS->reset)
1153 return -1;
1154 for (counter = 0; counter < 10000; counter++) {
1155 status = fd_inb(FD_STATUS);
1156 if (status & STATUS_READY)
1157 return status;
1159 if (!initialising) {
1160 DPRINT("Getstatus times out (%x) on fdc %d\n", status, fdc);
1161 show_floppy();
1163 FDCS->reset = 1;
1164 return -1;
1167 /* sends a command byte to the fdc */
1168 static int output_byte(char byte)
1170 int status;
1172 if ((status = wait_til_ready()) < 0)
1173 return -1;
1174 if ((status & (STATUS_READY | STATUS_DIR | STATUS_DMA)) == STATUS_READY) {
1175 fd_outb(byte, FD_DATA);
1176 #ifdef FLOPPY_SANITY_CHECK
1177 output_log[output_log_pos].data = byte;
1178 output_log[output_log_pos].status = status;
1179 output_log[output_log_pos].jiffies = jiffies;
1180 output_log_pos = (output_log_pos + 1) % OLOGSIZE;
1181 #endif
1182 return 0;
1184 FDCS->reset = 1;
1185 if (!initialising) {
1186 DPRINT("Unable to send byte %x to FDC. Fdc=%x Status=%x\n",
1187 byte, fdc, status);
1188 show_floppy();
1190 return -1;
1193 #define LAST_OUT(x) if (output_byte(x)<0){ reset_fdc();return;}
1195 /* gets the response from the fdc */
1196 static int result(void)
1198 int i;
1199 int status = 0;
1201 for (i = 0; i < MAX_REPLIES; i++) {
1202 if ((status = wait_til_ready()) < 0)
1203 break;
1204 status &= STATUS_DIR | STATUS_READY | STATUS_BUSY | STATUS_DMA;
1205 if ((status & ~STATUS_BUSY) == STATUS_READY) {
1206 #ifdef FLOPPY_SANITY_CHECK
1207 resultjiffies = jiffies;
1208 resultsize = i;
1209 #endif
1210 return i;
1212 if (status == (STATUS_DIR | STATUS_READY | STATUS_BUSY))
1213 reply_buffer[i] = fd_inb(FD_DATA);
1214 else
1215 break;
1217 if (!initialising) {
1218 DPRINT
1219 ("get result error. Fdc=%d Last status=%x Read bytes=%d\n",
1220 fdc, status, i);
1221 show_floppy();
1223 FDCS->reset = 1;
1224 return -1;
1227 #define MORE_OUTPUT -2
1228 /* does the fdc need more output? */
1229 static int need_more_output(void)
1231 int status;
1233 if ((status = wait_til_ready()) < 0)
1234 return -1;
1235 if ((status & (STATUS_READY | STATUS_DIR | STATUS_DMA)) == STATUS_READY)
1236 return MORE_OUTPUT;
1237 return result();
1240 /* Set perpendicular mode as required, based on data rate, if supported.
1241 * 82077 Now tested. 1Mbps data rate only possible with 82077-1.
1243 static inline void perpendicular_mode(void)
1245 unsigned char perp_mode;
1247 if (raw_cmd->rate & 0x40) {
1248 switch (raw_cmd->rate & 3) {
1249 case 0:
1250 perp_mode = 2;
1251 break;
1252 case 3:
1253 perp_mode = 3;
1254 break;
1255 default:
1256 DPRINT("Invalid data rate for perpendicular mode!\n");
1257 cont->done(0);
1258 FDCS->reset = 1; /* convenient way to return to
1259 * redo without to much hassle (deep
1260 * stack et al. */
1261 return;
1263 } else
1264 perp_mode = 0;
1266 if (FDCS->perp_mode == perp_mode)
1267 return;
1268 if (FDCS->version >= FDC_82077_ORIG) {
1269 output_byte(FD_PERPENDICULAR);
1270 output_byte(perp_mode);
1271 FDCS->perp_mode = perp_mode;
1272 } else if (perp_mode) {
1273 DPRINT("perpendicular mode not supported by this FDC.\n");
1275 } /* perpendicular_mode */
1277 static int fifo_depth = 0xa;
1278 static int no_fifo;
1280 static int fdc_configure(void)
1282 /* Turn on FIFO */
1283 output_byte(FD_CONFIGURE);
1284 if (need_more_output() != MORE_OUTPUT)
1285 return 0;
1286 output_byte(0);
1287 output_byte(0x10 | (no_fifo & 0x20) | (fifo_depth & 0xf));
1288 output_byte(0); /* pre-compensation from track
1289 0 upwards */
1290 return 1;
1293 #define NOMINAL_DTR 500
1295 /* Issue a "SPECIFY" command to set the step rate time, head unload time,
1296 * head load time, and DMA disable flag to values needed by floppy.
1298 * The value "dtr" is the data transfer rate in Kbps. It is needed
1299 * to account for the data rate-based scaling done by the 82072 and 82077
1300 * FDC types. This parameter is ignored for other types of FDCs (i.e.
1301 * 8272a).
1303 * Note that changing the data transfer rate has a (probably deleterious)
1304 * effect on the parameters subject to scaling for 82072/82077 FDCs, so
1305 * fdc_specify is called again after each data transfer rate
1306 * change.
1308 * srt: 1000 to 16000 in microseconds
1309 * hut: 16 to 240 milliseconds
1310 * hlt: 2 to 254 milliseconds
1312 * These values are rounded up to the next highest available delay time.
1314 static void fdc_specify(void)
1316 unsigned char spec1;
1317 unsigned char spec2;
1318 unsigned long srt;
1319 unsigned long hlt;
1320 unsigned long hut;
1321 unsigned long dtr = NOMINAL_DTR;
1322 unsigned long scale_dtr = NOMINAL_DTR;
1323 int hlt_max_code = 0x7f;
1324 int hut_max_code = 0xf;
1326 if (FDCS->need_configure && FDCS->version >= FDC_82072A) {
1327 fdc_configure();
1328 FDCS->need_configure = 0;
1331 switch (raw_cmd->rate & 0x03) {
1332 case 3:
1333 dtr = 1000;
1334 break;
1335 case 1:
1336 dtr = 300;
1337 if (FDCS->version >= FDC_82078) {
1338 /* chose the default rate table, not the one
1339 * where 1 = 2 Mbps */
1340 output_byte(FD_DRIVESPEC);
1341 if (need_more_output() == MORE_OUTPUT) {
1342 output_byte(UNIT(current_drive));
1343 output_byte(0xc0);
1346 break;
1347 case 2:
1348 dtr = 250;
1349 break;
1352 if (FDCS->version >= FDC_82072) {
1353 scale_dtr = dtr;
1354 hlt_max_code = 0x00; /* 0==256msec*dtr0/dtr (not linear!) */
1355 hut_max_code = 0x0; /* 0==256msec*dtr0/dtr (not linear!) */
1358 /* Convert step rate from microseconds to milliseconds and 4 bits */
1359 srt = 16 - (DP->srt * scale_dtr / 1000 + NOMINAL_DTR - 1) / NOMINAL_DTR;
1360 if (slow_floppy) {
1361 srt = srt / 4;
1363 SUPBOUND(srt, 0xf);
1364 INFBOUND(srt, 0);
1366 hlt = (DP->hlt * scale_dtr / 2 + NOMINAL_DTR - 1) / NOMINAL_DTR;
1367 if (hlt < 0x01)
1368 hlt = 0x01;
1369 else if (hlt > 0x7f)
1370 hlt = hlt_max_code;
1372 hut = (DP->hut * scale_dtr / 16 + NOMINAL_DTR - 1) / NOMINAL_DTR;
1373 if (hut < 0x1)
1374 hut = 0x1;
1375 else if (hut > 0xf)
1376 hut = hut_max_code;
1378 spec1 = (srt << 4) | hut;
1379 spec2 = (hlt << 1) | (use_virtual_dma & 1);
1381 /* If these parameters did not change, just return with success */
1382 if (FDCS->spec1 != spec1 || FDCS->spec2 != spec2) {
1383 /* Go ahead and set spec1 and spec2 */
1384 output_byte(FD_SPECIFY);
1385 output_byte(FDCS->spec1 = spec1);
1386 output_byte(FDCS->spec2 = spec2);
1388 } /* fdc_specify */
1390 /* Set the FDC's data transfer rate on behalf of the specified drive.
1391 * NOTE: with 82072/82077 FDCs, changing the data rate requires a reissue
1392 * of the specify command (i.e. using the fdc_specify function).
1394 static int fdc_dtr(void)
1396 /* If data rate not already set to desired value, set it. */
1397 if ((raw_cmd->rate & 3) == FDCS->dtr)
1398 return 0;
1400 /* Set dtr */
1401 fd_outb(raw_cmd->rate & 3, FD_DCR);
1403 /* TODO: some FDC/drive combinations (C&T 82C711 with TEAC 1.2MB)
1404 * need a stabilization period of several milliseconds to be
1405 * enforced after data rate changes before R/W operations.
1406 * Pause 5 msec to avoid trouble. (Needs to be 2 jiffies)
1408 FDCS->dtr = raw_cmd->rate & 3;
1409 return (fd_wait_for_completion(jiffies + 2UL * HZ / 100,
1410 (timeout_fn) floppy_ready));
1411 } /* fdc_dtr */
1413 static void tell_sector(void)
1415 printk(": track %d, head %d, sector %d, size %d",
1416 R_TRACK, R_HEAD, R_SECTOR, R_SIZECODE);
1417 } /* tell_sector */
1420 * OK, this error interpreting routine is called after a
1421 * DMA read/write has succeeded
1422 * or failed, so we check the results, and copy any buffers.
1423 * hhb: Added better error reporting.
1424 * ak: Made this into a separate routine.
1426 static int interpret_errors(void)
1428 char bad;
1430 if (inr != 7) {
1431 DPRINT("-- FDC reply error");
1432 FDCS->reset = 1;
1433 return 1;
1436 /* check IC to find cause of interrupt */
1437 switch (ST0 & ST0_INTR) {
1438 case 0x40: /* error occurred during command execution */
1439 if (ST1 & ST1_EOC)
1440 return 0; /* occurs with pseudo-DMA */
1441 bad = 1;
1442 if (ST1 & ST1_WP) {
1443 DPRINT("Drive is write protected\n");
1444 CLEARF(FD_DISK_WRITABLE);
1445 cont->done(0);
1446 bad = 2;
1447 } else if (ST1 & ST1_ND) {
1448 SETF(FD_NEED_TWADDLE);
1449 } else if (ST1 & ST1_OR) {
1450 if (DP->flags & FTD_MSG)
1451 DPRINT("Over/Underrun - retrying\n");
1452 bad = 0;
1453 } else if (*errors >= DP->max_errors.reporting) {
1454 DPRINT("");
1455 if (ST0 & ST0_ECE) {
1456 printk("Recalibrate failed!");
1457 } else if (ST2 & ST2_CRC) {
1458 printk("data CRC error");
1459 tell_sector();
1460 } else if (ST1 & ST1_CRC) {
1461 printk("CRC error");
1462 tell_sector();
1463 } else if ((ST1 & (ST1_MAM | ST1_ND))
1464 || (ST2 & ST2_MAM)) {
1465 if (!probing) {
1466 printk("sector not found");
1467 tell_sector();
1468 } else
1469 printk("probe failed...");
1470 } else if (ST2 & ST2_WC) { /* seek error */
1471 printk("wrong cylinder");
1472 } else if (ST2 & ST2_BC) { /* cylinder marked as bad */
1473 printk("bad cylinder");
1474 } else {
1475 printk
1476 ("unknown error. ST[0..2] are: 0x%x 0x%x 0x%x",
1477 ST0, ST1, ST2);
1478 tell_sector();
1480 printk("\n");
1482 if (ST2 & ST2_WC || ST2 & ST2_BC)
1483 /* wrong cylinder => recal */
1484 DRS->track = NEED_2_RECAL;
1485 return bad;
1486 case 0x80: /* invalid command given */
1487 DPRINT("Invalid FDC command given!\n");
1488 cont->done(0);
1489 return 2;
1490 case 0xc0:
1491 DPRINT("Abnormal termination caused by polling\n");
1492 cont->error();
1493 return 2;
1494 default: /* (0) Normal command termination */
1495 return 0;
1500 * This routine is called when everything should be correctly set up
1501 * for the transfer (i.e. floppy motor is on, the correct floppy is
1502 * selected, and the head is sitting on the right track).
1504 static void setup_rw_floppy(void)
1506 int i;
1507 int r;
1508 int flags;
1509 int dflags;
1510 unsigned long ready_date;
1511 timeout_fn function;
1513 flags = raw_cmd->flags;
1514 if (flags & (FD_RAW_READ | FD_RAW_WRITE))
1515 flags |= FD_RAW_INTR;
1517 if ((flags & FD_RAW_SPIN) && !(flags & FD_RAW_NO_MOTOR)) {
1518 ready_date = DRS->spinup_date + DP->spinup;
1519 /* If spinup will take a long time, rerun scandrives
1520 * again just before spinup completion. Beware that
1521 * after scandrives, we must again wait for selection.
1523 if (time_after(ready_date, jiffies + DP->select_delay)) {
1524 ready_date -= DP->select_delay;
1525 function = (timeout_fn) floppy_start;
1526 } else
1527 function = (timeout_fn) setup_rw_floppy;
1529 /* wait until the floppy is spinning fast enough */
1530 if (fd_wait_for_completion(ready_date, function))
1531 return;
1533 dflags = DRS->flags;
1535 if ((flags & FD_RAW_READ) || (flags & FD_RAW_WRITE))
1536 setup_DMA();
1538 if (flags & FD_RAW_INTR)
1539 do_floppy = main_command_interrupt;
1541 r = 0;
1542 for (i = 0; i < raw_cmd->cmd_count; i++)
1543 r |= output_byte(raw_cmd->cmd[i]);
1545 debugt("rw_command: ");
1547 if (r) {
1548 cont->error();
1549 reset_fdc();
1550 return;
1553 if (!(flags & FD_RAW_INTR)) {
1554 inr = result();
1555 cont->interrupt();
1556 } else if (flags & FD_RAW_NEED_DISK)
1557 fd_watchdog();
1560 static int blind_seek;
1563 * This is the routine called after every seek (or recalibrate) interrupt
1564 * from the floppy controller.
1566 static void seek_interrupt(void)
1568 debugt("seek interrupt:");
1569 if (inr != 2 || (ST0 & 0xF8) != 0x20) {
1570 DPRINT("seek failed\n");
1571 DRS->track = NEED_2_RECAL;
1572 cont->error();
1573 cont->redo();
1574 return;
1576 if (DRS->track >= 0 && DRS->track != ST1 && !blind_seek) {
1577 #ifdef DCL_DEBUG
1578 if (DP->flags & FD_DEBUG) {
1579 DPRINT
1580 ("clearing NEWCHANGE flag because of effective seek\n");
1581 DPRINT("jiffies=%lu\n", jiffies);
1583 #endif
1584 CLEARF(FD_DISK_NEWCHANGE); /* effective seek */
1585 DRS->select_date = jiffies;
1587 DRS->track = ST1;
1588 floppy_ready();
1591 static void check_wp(void)
1593 if (TESTF(FD_VERIFY)) {
1594 /* check write protection */
1595 output_byte(FD_GETSTATUS);
1596 output_byte(UNIT(current_drive));
1597 if (result() != 1) {
1598 FDCS->reset = 1;
1599 return;
1601 CLEARF(FD_VERIFY);
1602 CLEARF(FD_NEED_TWADDLE);
1603 #ifdef DCL_DEBUG
1604 if (DP->flags & FD_DEBUG) {
1605 DPRINT("checking whether disk is write protected\n");
1606 DPRINT("wp=%x\n", ST3 & 0x40);
1608 #endif
1609 if (!(ST3 & 0x40))
1610 SETF(FD_DISK_WRITABLE);
1611 else
1612 CLEARF(FD_DISK_WRITABLE);
1616 static void seek_floppy(void)
1618 int track;
1620 blind_seek = 0;
1622 #ifdef DCL_DEBUG
1623 if (DP->flags & FD_DEBUG) {
1624 DPRINT("calling disk change from seek\n");
1626 #endif
1628 if (!TESTF(FD_DISK_NEWCHANGE) &&
1629 disk_change(current_drive) && (raw_cmd->flags & FD_RAW_NEED_DISK)) {
1630 /* the media changed flag should be cleared after the seek.
1631 * If it isn't, this means that there is really no disk in
1632 * the drive.
1634 SETF(FD_DISK_CHANGED);
1635 cont->done(0);
1636 cont->redo();
1637 return;
1639 if (DRS->track <= NEED_1_RECAL) {
1640 recalibrate_floppy();
1641 return;
1642 } else if (TESTF(FD_DISK_NEWCHANGE) &&
1643 (raw_cmd->flags & FD_RAW_NEED_DISK) &&
1644 (DRS->track <= NO_TRACK || DRS->track == raw_cmd->track)) {
1645 /* we seek to clear the media-changed condition. Does anybody
1646 * know a more elegant way, which works on all drives? */
1647 if (raw_cmd->track)
1648 track = raw_cmd->track - 1;
1649 else {
1650 if (DP->flags & FD_SILENT_DCL_CLEAR) {
1651 set_dor(fdc, ~(0x10 << UNIT(current_drive)), 0);
1652 blind_seek = 1;
1653 raw_cmd->flags |= FD_RAW_NEED_SEEK;
1655 track = 1;
1657 } else {
1658 check_wp();
1659 if (raw_cmd->track != DRS->track &&
1660 (raw_cmd->flags & FD_RAW_NEED_SEEK))
1661 track = raw_cmd->track;
1662 else {
1663 setup_rw_floppy();
1664 return;
1668 do_floppy = seek_interrupt;
1669 output_byte(FD_SEEK);
1670 output_byte(UNIT(current_drive));
1671 LAST_OUT(track);
1672 debugt("seek command:");
1675 static void recal_interrupt(void)
1677 debugt("recal interrupt:");
1678 if (inr != 2)
1679 FDCS->reset = 1;
1680 else if (ST0 & ST0_ECE) {
1681 switch (DRS->track) {
1682 case NEED_1_RECAL:
1683 debugt("recal interrupt need 1 recal:");
1684 /* after a second recalibrate, we still haven't
1685 * reached track 0. Probably no drive. Raise an
1686 * error, as failing immediately might upset
1687 * computers possessed by the Devil :-) */
1688 cont->error();
1689 cont->redo();
1690 return;
1691 case NEED_2_RECAL:
1692 debugt("recal interrupt need 2 recal:");
1693 /* If we already did a recalibrate,
1694 * and we are not at track 0, this
1695 * means we have moved. (The only way
1696 * not to move at recalibration is to
1697 * be already at track 0.) Clear the
1698 * new change flag */
1699 #ifdef DCL_DEBUG
1700 if (DP->flags & FD_DEBUG) {
1701 DPRINT
1702 ("clearing NEWCHANGE flag because of second recalibrate\n");
1704 #endif
1706 CLEARF(FD_DISK_NEWCHANGE);
1707 DRS->select_date = jiffies;
1708 /* fall through */
1709 default:
1710 debugt("recal interrupt default:");
1711 /* Recalibrate moves the head by at
1712 * most 80 steps. If after one
1713 * recalibrate we don't have reached
1714 * track 0, this might mean that we
1715 * started beyond track 80. Try
1716 * again. */
1717 DRS->track = NEED_1_RECAL;
1718 break;
1720 } else
1721 DRS->track = ST1;
1722 floppy_ready();
1725 static void print_result(char *message, int inr)
1727 int i;
1729 DPRINT("%s ", message);
1730 if (inr >= 0)
1731 for (i = 0; i < inr; i++)
1732 printk("repl[%d]=%x ", i, reply_buffer[i]);
1733 printk("\n");
1736 /* interrupt handler. Note that this can be called externally on the Sparc */
1737 irqreturn_t floppy_interrupt(int irq, void *dev_id)
1739 int do_print;
1740 unsigned long f;
1741 void (*handler)(void) = do_floppy;
1743 lasthandler = handler;
1744 interruptjiffies = jiffies;
1746 f = claim_dma_lock();
1747 fd_disable_dma();
1748 release_dma_lock(f);
1750 floppy_enable_hlt();
1751 do_floppy = NULL;
1752 if (fdc >= N_FDC || FDCS->address == -1) {
1753 /* we don't even know which FDC is the culprit */
1754 printk("DOR0=%x\n", fdc_state[0].dor);
1755 printk("floppy interrupt on bizarre fdc %d\n", fdc);
1756 printk("handler=%p\n", handler);
1757 is_alive("bizarre fdc");
1758 return IRQ_NONE;
1761 FDCS->reset = 0;
1762 /* We have to clear the reset flag here, because apparently on boxes
1763 * with level triggered interrupts (PS/2, Sparc, ...), it is needed to
1764 * emit SENSEI's to clear the interrupt line. And FDCS->reset blocks the
1765 * emission of the SENSEI's.
1766 * It is OK to emit floppy commands because we are in an interrupt
1767 * handler here, and thus we have to fear no interference of other
1768 * activity.
1771 do_print = !handler && print_unex && !initialising;
1773 inr = result();
1774 if (do_print)
1775 print_result("unexpected interrupt", inr);
1776 if (inr == 0) {
1777 int max_sensei = 4;
1778 do {
1779 output_byte(FD_SENSEI);
1780 inr = result();
1781 if (do_print)
1782 print_result("sensei", inr);
1783 max_sensei--;
1784 } while ((ST0 & 0x83) != UNIT(current_drive) && inr == 2
1785 && max_sensei);
1787 if (!handler) {
1788 FDCS->reset = 1;
1789 return IRQ_NONE;
1791 schedule_bh(handler);
1792 is_alive("normal interrupt end");
1794 /* FIXME! Was it really for us? */
1795 return IRQ_HANDLED;
1798 static void recalibrate_floppy(void)
1800 debugt("recalibrate floppy:");
1801 do_floppy = recal_interrupt;
1802 output_byte(FD_RECALIBRATE);
1803 LAST_OUT(UNIT(current_drive));
1807 * Must do 4 FD_SENSEIs after reset because of ``drive polling''.
1809 static void reset_interrupt(void)
1811 debugt("reset interrupt:");
1812 result(); /* get the status ready for set_fdc */
1813 if (FDCS->reset) {
1814 printk("reset set in interrupt, calling %p\n", cont->error);
1815 cont->error(); /* a reset just after a reset. BAD! */
1817 cont->redo();
1821 * reset is done by pulling bit 2 of DOR low for a while (old FDCs),
1822 * or by setting the self clearing bit 7 of STATUS (newer FDCs)
1824 static void reset_fdc(void)
1826 unsigned long flags;
1828 do_floppy = reset_interrupt;
1829 FDCS->reset = 0;
1830 reset_fdc_info(0);
1832 /* Pseudo-DMA may intercept 'reset finished' interrupt. */
1833 /* Irrelevant for systems with true DMA (i386). */
1835 flags = claim_dma_lock();
1836 fd_disable_dma();
1837 release_dma_lock(flags);
1839 if (FDCS->version >= FDC_82072A)
1840 fd_outb(0x80 | (FDCS->dtr & 3), FD_STATUS);
1841 else {
1842 fd_outb(FDCS->dor & ~0x04, FD_DOR);
1843 udelay(FD_RESET_DELAY);
1844 fd_outb(FDCS->dor, FD_DOR);
1848 static void show_floppy(void)
1850 int i;
1852 printk("\n");
1853 printk("floppy driver state\n");
1854 printk("-------------------\n");
1855 printk("now=%lu last interrupt=%lu diff=%lu last called handler=%p\n",
1856 jiffies, interruptjiffies, jiffies - interruptjiffies,
1857 lasthandler);
1859 #ifdef FLOPPY_SANITY_CHECK
1860 printk("timeout_message=%s\n", timeout_message);
1861 printk("last output bytes:\n");
1862 for (i = 0; i < OLOGSIZE; i++)
1863 printk("%2x %2x %lu\n",
1864 output_log[(i + output_log_pos) % OLOGSIZE].data,
1865 output_log[(i + output_log_pos) % OLOGSIZE].status,
1866 output_log[(i + output_log_pos) % OLOGSIZE].jiffies);
1867 printk("last result at %lu\n", resultjiffies);
1868 printk("last redo_fd_request at %lu\n", lastredo);
1869 for (i = 0; i < resultsize; i++) {
1870 printk("%2x ", reply_buffer[i]);
1872 printk("\n");
1873 #endif
1875 printk("status=%x\n", fd_inb(FD_STATUS));
1876 printk("fdc_busy=%lu\n", fdc_busy);
1877 if (do_floppy)
1878 printk("do_floppy=%p\n", do_floppy);
1879 if (work_pending(&floppy_work))
1880 printk("floppy_work.func=%p\n", floppy_work.func);
1881 if (timer_pending(&fd_timer))
1882 printk("fd_timer.function=%p\n", fd_timer.function);
1883 if (timer_pending(&fd_timeout)) {
1884 printk("timer_function=%p\n", fd_timeout.function);
1885 printk("expires=%lu\n", fd_timeout.expires - jiffies);
1886 printk("now=%lu\n", jiffies);
1888 printk("cont=%p\n", cont);
1889 printk("current_req=%p\n", current_req);
1890 printk("command_status=%d\n", command_status);
1891 printk("\n");
1894 static void floppy_shutdown(unsigned long data)
1896 unsigned long flags;
1898 if (!initialising)
1899 show_floppy();
1900 cancel_activity();
1902 floppy_enable_hlt();
1904 flags = claim_dma_lock();
1905 fd_disable_dma();
1906 release_dma_lock(flags);
1908 /* avoid dma going to a random drive after shutdown */
1910 if (!initialising)
1911 DPRINT("floppy timeout called\n");
1912 FDCS->reset = 1;
1913 if (cont) {
1914 cont->done(0);
1915 cont->redo(); /* this will recall reset when needed */
1916 } else {
1917 printk("no cont in shutdown!\n");
1918 process_fd_request();
1920 is_alive("floppy shutdown");
1923 /* start motor, check media-changed condition and write protection */
1924 static int start_motor(void (*function)(void))
1926 int mask;
1927 int data;
1929 mask = 0xfc;
1930 data = UNIT(current_drive);
1931 if (!(raw_cmd->flags & FD_RAW_NO_MOTOR)) {
1932 if (!(FDCS->dor & (0x10 << UNIT(current_drive)))) {
1933 set_debugt();
1934 /* no read since this drive is running */
1935 DRS->first_read_date = 0;
1936 /* note motor start time if motor is not yet running */
1937 DRS->spinup_date = jiffies;
1938 data |= (0x10 << UNIT(current_drive));
1940 } else if (FDCS->dor & (0x10 << UNIT(current_drive)))
1941 mask &= ~(0x10 << UNIT(current_drive));
1943 /* starts motor and selects floppy */
1944 del_timer(motor_off_timer + current_drive);
1945 set_dor(fdc, mask, data);
1947 /* wait_for_completion also schedules reset if needed. */
1948 return (fd_wait_for_completion(DRS->select_date + DP->select_delay,
1949 (timeout_fn) function));
1952 static void floppy_ready(void)
1954 CHECK_RESET;
1955 if (start_motor(floppy_ready))
1956 return;
1957 if (fdc_dtr())
1958 return;
1960 #ifdef DCL_DEBUG
1961 if (DP->flags & FD_DEBUG) {
1962 DPRINT("calling disk change from floppy_ready\n");
1964 #endif
1965 if (!(raw_cmd->flags & FD_RAW_NO_MOTOR) &&
1966 disk_change(current_drive) && !DP->select_delay)
1967 twaddle(); /* this clears the dcl on certain drive/controller
1968 * combinations */
1970 #ifdef fd_chose_dma_mode
1971 if ((raw_cmd->flags & FD_RAW_READ) || (raw_cmd->flags & FD_RAW_WRITE)) {
1972 unsigned long flags = claim_dma_lock();
1973 fd_chose_dma_mode(raw_cmd->kernel_data, raw_cmd->length);
1974 release_dma_lock(flags);
1976 #endif
1978 if (raw_cmd->flags & (FD_RAW_NEED_SEEK | FD_RAW_NEED_DISK)) {
1979 perpendicular_mode();
1980 fdc_specify(); /* must be done here because of hut, hlt ... */
1981 seek_floppy();
1982 } else {
1983 if ((raw_cmd->flags & FD_RAW_READ) ||
1984 (raw_cmd->flags & FD_RAW_WRITE))
1985 fdc_specify();
1986 setup_rw_floppy();
1990 static void floppy_start(void)
1992 reschedule_timeout(current_reqD, "floppy start", 0);
1994 scandrives();
1995 #ifdef DCL_DEBUG
1996 if (DP->flags & FD_DEBUG) {
1997 DPRINT("setting NEWCHANGE in floppy_start\n");
1999 #endif
2000 SETF(FD_DISK_NEWCHANGE);
2001 floppy_ready();
2005 * ========================================================================
2006 * here ends the bottom half. Exported routines are:
2007 * floppy_start, floppy_off, floppy_ready, lock_fdc, unlock_fdc, set_fdc,
2008 * start_motor, reset_fdc, reset_fdc_info, interpret_errors.
2009 * Initialization also uses output_byte, result, set_dor, floppy_interrupt
2010 * and set_dor.
2011 * ========================================================================
2014 * General purpose continuations.
2015 * ==============================
2018 static void do_wakeup(void)
2020 reschedule_timeout(MAXTIMEOUT, "do wakeup", 0);
2021 cont = NULL;
2022 command_status += 2;
2023 wake_up(&command_done);
2026 static struct cont_t wakeup_cont = {
2027 .interrupt = empty,
2028 .redo = do_wakeup,
2029 .error = empty,
2030 .done = (done_f)empty
2033 static struct cont_t intr_cont = {
2034 .interrupt = empty,
2035 .redo = process_fd_request,
2036 .error = empty,
2037 .done = (done_f)empty
2040 static int wait_til_done(void (*handler)(void), int interruptible)
2042 int ret;
2044 schedule_bh(handler);
2046 if (command_status < 2 && NO_SIGNAL) {
2047 DECLARE_WAITQUEUE(wait, current);
2049 add_wait_queue(&command_done, &wait);
2050 for (;;) {
2051 set_current_state(interruptible ?
2052 TASK_INTERRUPTIBLE :
2053 TASK_UNINTERRUPTIBLE);
2055 if (command_status >= 2 || !NO_SIGNAL)
2056 break;
2058 is_alive("wait_til_done");
2059 schedule();
2062 set_current_state(TASK_RUNNING);
2063 remove_wait_queue(&command_done, &wait);
2066 if (command_status < 2) {
2067 cancel_activity();
2068 cont = &intr_cont;
2069 reset_fdc();
2070 return -EINTR;
2073 if (FDCS->reset)
2074 command_status = FD_COMMAND_ERROR;
2075 if (command_status == FD_COMMAND_OKAY)
2076 ret = 0;
2077 else
2078 ret = -EIO;
2079 command_status = FD_COMMAND_NONE;
2080 return ret;
2083 static void generic_done(int result)
2085 command_status = result;
2086 cont = &wakeup_cont;
2089 static void generic_success(void)
2091 cont->done(1);
2094 static void generic_failure(void)
2096 cont->done(0);
2099 static void success_and_wakeup(void)
2101 generic_success();
2102 cont->redo();
2106 * formatting and rw support.
2107 * ==========================
2110 static int next_valid_format(void)
2112 int probed_format;
2114 probed_format = DRS->probed_format;
2115 while (1) {
2116 if (probed_format >= 8 || !DP->autodetect[probed_format]) {
2117 DRS->probed_format = 0;
2118 return 1;
2120 if (floppy_type[DP->autodetect[probed_format]].sect) {
2121 DRS->probed_format = probed_format;
2122 return 0;
2124 probed_format++;
2128 static void bad_flp_intr(void)
2130 int err_count;
2132 if (probing) {
2133 DRS->probed_format++;
2134 if (!next_valid_format())
2135 return;
2137 err_count = ++(*errors);
2138 INFBOUND(DRWE->badness, err_count);
2139 if (err_count > DP->max_errors.abort)
2140 cont->done(0);
2141 if (err_count > DP->max_errors.reset)
2142 FDCS->reset = 1;
2143 else if (err_count > DP->max_errors.recal)
2144 DRS->track = NEED_2_RECAL;
2147 static void set_floppy(int drive)
2149 int type = ITYPE(UDRS->fd_device);
2151 if (type)
2152 _floppy = floppy_type + type;
2153 else
2154 _floppy = current_type[drive];
2158 * formatting support.
2159 * ===================
2161 static void format_interrupt(void)
2163 switch (interpret_errors()) {
2164 case 1:
2165 cont->error();
2166 case 2:
2167 break;
2168 case 0:
2169 cont->done(1);
2171 cont->redo();
2174 #define CODE2SIZE (ssize = ((1 << SIZECODE) + 3) >> 2)
2175 #define FM_MODE(x,y) ((y) & ~(((x)->rate & 0x80) >>1))
2176 #define CT(x) ((x) | 0xc0)
2177 static void setup_format_params(int track)
2179 int n;
2180 int il;
2181 int count;
2182 int head_shift;
2183 int track_shift;
2184 struct fparm {
2185 unsigned char track, head, sect, size;
2186 } *here = (struct fparm *)floppy_track_buffer;
2188 raw_cmd = &default_raw_cmd;
2189 raw_cmd->track = track;
2191 raw_cmd->flags = FD_RAW_WRITE | FD_RAW_INTR | FD_RAW_SPIN |
2192 FD_RAW_NEED_DISK | FD_RAW_NEED_SEEK;
2193 raw_cmd->rate = _floppy->rate & 0x43;
2194 raw_cmd->cmd_count = NR_F;
2195 COMMAND = FM_MODE(_floppy, FD_FORMAT);
2196 DR_SELECT = UNIT(current_drive) + PH_HEAD(_floppy, format_req.head);
2197 F_SIZECODE = FD_SIZECODE(_floppy);
2198 F_SECT_PER_TRACK = _floppy->sect << 2 >> F_SIZECODE;
2199 F_GAP = _floppy->fmt_gap;
2200 F_FILL = FD_FILL_BYTE;
2202 raw_cmd->kernel_data = floppy_track_buffer;
2203 raw_cmd->length = 4 * F_SECT_PER_TRACK;
2205 /* allow for about 30ms for data transport per track */
2206 head_shift = (F_SECT_PER_TRACK + 5) / 6;
2208 /* a ``cylinder'' is two tracks plus a little stepping time */
2209 track_shift = 2 * head_shift + 3;
2211 /* position of logical sector 1 on this track */
2212 n = (track_shift * format_req.track + head_shift * format_req.head)
2213 % F_SECT_PER_TRACK;
2215 /* determine interleave */
2216 il = 1;
2217 if (_floppy->fmt_gap < 0x22)
2218 il++;
2220 /* initialize field */
2221 for (count = 0; count < F_SECT_PER_TRACK; ++count) {
2222 here[count].track = format_req.track;
2223 here[count].head = format_req.head;
2224 here[count].sect = 0;
2225 here[count].size = F_SIZECODE;
2227 /* place logical sectors */
2228 for (count = 1; count <= F_SECT_PER_TRACK; ++count) {
2229 here[n].sect = count;
2230 n = (n + il) % F_SECT_PER_TRACK;
2231 if (here[n].sect) { /* sector busy, find next free sector */
2232 ++n;
2233 if (n >= F_SECT_PER_TRACK) {
2234 n -= F_SECT_PER_TRACK;
2235 while (here[n].sect)
2236 ++n;
2240 if (_floppy->stretch & FD_ZEROBASED) {
2241 for (count = 0; count < F_SECT_PER_TRACK; count++)
2242 here[count].sect--;
2246 static void redo_format(void)
2248 buffer_track = -1;
2249 setup_format_params(format_req.track << STRETCH(_floppy));
2250 floppy_start();
2251 debugt("queue format request");
2254 static struct cont_t format_cont = {
2255 .interrupt = format_interrupt,
2256 .redo = redo_format,
2257 .error = bad_flp_intr,
2258 .done = generic_done
2261 static int do_format(int drive, struct format_descr *tmp_format_req)
2263 int ret;
2265 LOCK_FDC(drive, 1);
2266 set_floppy(drive);
2267 if (!_floppy ||
2268 _floppy->track > DP->tracks ||
2269 tmp_format_req->track >= _floppy->track ||
2270 tmp_format_req->head >= _floppy->head ||
2271 (_floppy->sect << 2) % (1 << FD_SIZECODE(_floppy)) ||
2272 !_floppy->fmt_gap) {
2273 process_fd_request();
2274 return -EINVAL;
2276 format_req = *tmp_format_req;
2277 format_errors = 0;
2278 cont = &format_cont;
2279 errors = &format_errors;
2280 IWAIT(redo_format);
2281 process_fd_request();
2282 return ret;
2286 * Buffer read/write and support
2287 * =============================
2290 static void floppy_end_request(struct request *req, int error)
2292 unsigned int nr_sectors = current_count_sectors;
2293 unsigned int drive = (unsigned long)req->rq_disk->private_data;
2295 /* current_count_sectors can be zero if transfer failed */
2296 if (error)
2297 nr_sectors = req->current_nr_sectors;
2298 if (__blk_end_request(req, error, nr_sectors << 9))
2299 return;
2301 /* We're done with the request */
2302 floppy_off(drive);
2303 current_req = NULL;
2306 /* new request_done. Can handle physical sectors which are smaller than a
2307 * logical buffer */
2308 static void request_done(int uptodate)
2310 struct request_queue *q = floppy_queue;
2311 struct request *req = current_req;
2312 unsigned long flags;
2313 int block;
2315 probing = 0;
2316 reschedule_timeout(MAXTIMEOUT, "request done %d", uptodate);
2318 if (!req) {
2319 printk("floppy.c: no request in request_done\n");
2320 return;
2323 if (uptodate) {
2324 /* maintain values for invalidation on geometry
2325 * change */
2326 block = current_count_sectors + req->sector;
2327 INFBOUND(DRS->maxblock, block);
2328 if (block > _floppy->sect)
2329 DRS->maxtrack = 1;
2331 /* unlock chained buffers */
2332 spin_lock_irqsave(q->queue_lock, flags);
2333 floppy_end_request(req, 0);
2334 spin_unlock_irqrestore(q->queue_lock, flags);
2335 } else {
2336 if (rq_data_dir(req) == WRITE) {
2337 /* record write error information */
2338 DRWE->write_errors++;
2339 if (DRWE->write_errors == 1) {
2340 DRWE->first_error_sector = req->sector;
2341 DRWE->first_error_generation = DRS->generation;
2343 DRWE->last_error_sector = req->sector;
2344 DRWE->last_error_generation = DRS->generation;
2346 spin_lock_irqsave(q->queue_lock, flags);
2347 floppy_end_request(req, -EIO);
2348 spin_unlock_irqrestore(q->queue_lock, flags);
2352 /* Interrupt handler evaluating the result of the r/w operation */
2353 static void rw_interrupt(void)
2355 int eoc;
2356 int ssize;
2357 int heads;
2358 int nr_sectors;
2360 if (R_HEAD >= 2) {
2361 /* some Toshiba floppy controllers occasionnally seem to
2362 * return bogus interrupts after read/write operations, which
2363 * can be recognized by a bad head number (>= 2) */
2364 return;
2367 if (!DRS->first_read_date)
2368 DRS->first_read_date = jiffies;
2370 nr_sectors = 0;
2371 CODE2SIZE;
2373 if (ST1 & ST1_EOC)
2374 eoc = 1;
2375 else
2376 eoc = 0;
2378 if (COMMAND & 0x80)
2379 heads = 2;
2380 else
2381 heads = 1;
2383 nr_sectors = (((R_TRACK - TRACK) * heads +
2384 R_HEAD - HEAD) * SECT_PER_TRACK +
2385 R_SECTOR - SECTOR + eoc) << SIZECODE >> 2;
2387 #ifdef FLOPPY_SANITY_CHECK
2388 if (nr_sectors / ssize >
2389 (in_sector_offset + current_count_sectors + ssize - 1) / ssize) {
2390 DPRINT("long rw: %x instead of %lx\n",
2391 nr_sectors, current_count_sectors);
2392 printk("rs=%d s=%d\n", R_SECTOR, SECTOR);
2393 printk("rh=%d h=%d\n", R_HEAD, HEAD);
2394 printk("rt=%d t=%d\n", R_TRACK, TRACK);
2395 printk("heads=%d eoc=%d\n", heads, eoc);
2396 printk("spt=%d st=%d ss=%d\n", SECT_PER_TRACK,
2397 fsector_t, ssize);
2398 printk("in_sector_offset=%d\n", in_sector_offset);
2400 #endif
2402 nr_sectors -= in_sector_offset;
2403 INFBOUND(nr_sectors, 0);
2404 SUPBOUND(current_count_sectors, nr_sectors);
2406 switch (interpret_errors()) {
2407 case 2:
2408 cont->redo();
2409 return;
2410 case 1:
2411 if (!current_count_sectors) {
2412 cont->error();
2413 cont->redo();
2414 return;
2416 break;
2417 case 0:
2418 if (!current_count_sectors) {
2419 cont->redo();
2420 return;
2422 current_type[current_drive] = _floppy;
2423 floppy_sizes[TOMINOR(current_drive)] = _floppy->size;
2424 break;
2427 if (probing) {
2428 if (DP->flags & FTD_MSG)
2429 DPRINT("Auto-detected floppy type %s in fd%d\n",
2430 _floppy->name, current_drive);
2431 current_type[current_drive] = _floppy;
2432 floppy_sizes[TOMINOR(current_drive)] = _floppy->size;
2433 probing = 0;
2436 if (CT(COMMAND) != FD_READ ||
2437 raw_cmd->kernel_data == current_req->buffer) {
2438 /* transfer directly from buffer */
2439 cont->done(1);
2440 } else if (CT(COMMAND) == FD_READ) {
2441 buffer_track = raw_cmd->track;
2442 buffer_drive = current_drive;
2443 INFBOUND(buffer_max, nr_sectors + fsector_t);
2445 cont->redo();
2448 /* Compute maximal contiguous buffer size. */
2449 static int buffer_chain_size(void)
2451 struct bio_vec *bv;
2452 int size;
2453 struct req_iterator iter;
2454 char *base;
2456 base = bio_data(current_req->bio);
2457 size = 0;
2459 rq_for_each_segment(bv, current_req, iter) {
2460 if (page_address(bv->bv_page) + bv->bv_offset != base + size)
2461 break;
2463 size += bv->bv_len;
2466 return size >> 9;
2469 /* Compute the maximal transfer size */
2470 static int transfer_size(int ssize, int max_sector, int max_size)
2472 SUPBOUND(max_sector, fsector_t + max_size);
2474 /* alignment */
2475 max_sector -= (max_sector % _floppy->sect) % ssize;
2477 /* transfer size, beginning not aligned */
2478 current_count_sectors = max_sector - fsector_t;
2480 return max_sector;
2484 * Move data from/to the track buffer to/from the buffer cache.
2486 static void copy_buffer(int ssize, int max_sector, int max_sector_2)
2488 int remaining; /* number of transferred 512-byte sectors */
2489 struct bio_vec *bv;
2490 char *buffer;
2491 char *dma_buffer;
2492 int size;
2493 struct req_iterator iter;
2495 max_sector = transfer_size(ssize,
2496 min(max_sector, max_sector_2),
2497 current_req->nr_sectors);
2499 if (current_count_sectors <= 0 && CT(COMMAND) == FD_WRITE &&
2500 buffer_max > fsector_t + current_req->nr_sectors)
2501 current_count_sectors = min_t(int, buffer_max - fsector_t,
2502 current_req->nr_sectors);
2504 remaining = current_count_sectors << 9;
2505 #ifdef FLOPPY_SANITY_CHECK
2506 if ((remaining >> 9) > current_req->nr_sectors &&
2507 CT(COMMAND) == FD_WRITE) {
2508 DPRINT("in copy buffer\n");
2509 printk("current_count_sectors=%ld\n", current_count_sectors);
2510 printk("remaining=%d\n", remaining >> 9);
2511 printk("current_req->nr_sectors=%ld\n",
2512 current_req->nr_sectors);
2513 printk("current_req->current_nr_sectors=%u\n",
2514 current_req->current_nr_sectors);
2515 printk("max_sector=%d\n", max_sector);
2516 printk("ssize=%d\n", ssize);
2518 #endif
2520 buffer_max = max(max_sector, buffer_max);
2522 dma_buffer = floppy_track_buffer + ((fsector_t - buffer_min) << 9);
2524 size = current_req->current_nr_sectors << 9;
2526 rq_for_each_segment(bv, current_req, iter) {
2527 if (!remaining)
2528 break;
2530 size = bv->bv_len;
2531 SUPBOUND(size, remaining);
2533 buffer = page_address(bv->bv_page) + bv->bv_offset;
2534 #ifdef FLOPPY_SANITY_CHECK
2535 if (dma_buffer + size >
2536 floppy_track_buffer + (max_buffer_sectors << 10) ||
2537 dma_buffer < floppy_track_buffer) {
2538 DPRINT("buffer overrun in copy buffer %d\n",
2539 (int)((floppy_track_buffer -
2540 dma_buffer) >> 9));
2541 printk("fsector_t=%d buffer_min=%d\n",
2542 fsector_t, buffer_min);
2543 printk("current_count_sectors=%ld\n",
2544 current_count_sectors);
2545 if (CT(COMMAND) == FD_READ)
2546 printk("read\n");
2547 if (CT(COMMAND) == FD_WRITE)
2548 printk("write\n");
2549 break;
2551 if (((unsigned long)buffer) % 512)
2552 DPRINT("%p buffer not aligned\n", buffer);
2553 #endif
2554 if (CT(COMMAND) == FD_READ)
2555 memcpy(buffer, dma_buffer, size);
2556 else
2557 memcpy(dma_buffer, buffer, size);
2559 remaining -= size;
2560 dma_buffer += size;
2562 #ifdef FLOPPY_SANITY_CHECK
2563 if (remaining) {
2564 if (remaining > 0)
2565 max_sector -= remaining >> 9;
2566 DPRINT("weirdness: remaining %d\n", remaining >> 9);
2568 #endif
2571 /* work around a bug in pseudo DMA
2572 * (on some FDCs) pseudo DMA does not stop when the CPU stops
2573 * sending data. Hence we need a different way to signal the
2574 * transfer length: We use SECT_PER_TRACK. Unfortunately, this
2575 * does not work with MT, hence we can only transfer one head at
2576 * a time
2578 static void virtualdmabug_workaround(void)
2580 int hard_sectors;
2581 int end_sector;
2583 if (CT(COMMAND) == FD_WRITE) {
2584 COMMAND &= ~0x80; /* switch off multiple track mode */
2586 hard_sectors = raw_cmd->length >> (7 + SIZECODE);
2587 end_sector = SECTOR + hard_sectors - 1;
2588 #ifdef FLOPPY_SANITY_CHECK
2589 if (end_sector > SECT_PER_TRACK) {
2590 printk("too many sectors %d > %d\n",
2591 end_sector, SECT_PER_TRACK);
2592 return;
2594 #endif
2595 SECT_PER_TRACK = end_sector; /* make sure SECT_PER_TRACK points
2596 * to end of transfer */
2601 * Formulate a read/write request.
2602 * this routine decides where to load the data (directly to buffer, or to
2603 * tmp floppy area), how much data to load (the size of the buffer, the whole
2604 * track, or a single sector)
2605 * All floppy_track_buffer handling goes in here. If we ever add track buffer
2606 * allocation on the fly, it should be done here. No other part should need
2607 * modification.
2610 static int make_raw_rw_request(void)
2612 int aligned_sector_t;
2613 int max_sector;
2614 int max_size;
2615 int tracksize;
2616 int ssize;
2618 if (max_buffer_sectors == 0) {
2619 printk("VFS: Block I/O scheduled on unopened device\n");
2620 return 0;
2623 set_fdc((long)current_req->rq_disk->private_data);
2625 raw_cmd = &default_raw_cmd;
2626 raw_cmd->flags = FD_RAW_SPIN | FD_RAW_NEED_DISK | FD_RAW_NEED_DISK |
2627 FD_RAW_NEED_SEEK;
2628 raw_cmd->cmd_count = NR_RW;
2629 if (rq_data_dir(current_req) == READ) {
2630 raw_cmd->flags |= FD_RAW_READ;
2631 COMMAND = FM_MODE(_floppy, FD_READ);
2632 } else if (rq_data_dir(current_req) == WRITE) {
2633 raw_cmd->flags |= FD_RAW_WRITE;
2634 COMMAND = FM_MODE(_floppy, FD_WRITE);
2635 } else {
2636 DPRINT("make_raw_rw_request: unknown command\n");
2637 return 0;
2640 max_sector = _floppy->sect * _floppy->head;
2642 TRACK = (int)current_req->sector / max_sector;
2643 fsector_t = (int)current_req->sector % max_sector;
2644 if (_floppy->track && TRACK >= _floppy->track) {
2645 if (current_req->current_nr_sectors & 1) {
2646 current_count_sectors = 1;
2647 return 1;
2648 } else
2649 return 0;
2651 HEAD = fsector_t / _floppy->sect;
2653 if (((_floppy->stretch & (FD_SWAPSIDES | FD_ZEROBASED)) ||
2654 TESTF(FD_NEED_TWADDLE)) && fsector_t < _floppy->sect)
2655 max_sector = _floppy->sect;
2657 /* 2M disks have phantom sectors on the first track */
2658 if ((_floppy->rate & FD_2M) && (!TRACK) && (!HEAD)) {
2659 max_sector = 2 * _floppy->sect / 3;
2660 if (fsector_t >= max_sector) {
2661 current_count_sectors =
2662 min_t(int, _floppy->sect - fsector_t,
2663 current_req->nr_sectors);
2664 return 1;
2666 SIZECODE = 2;
2667 } else
2668 SIZECODE = FD_SIZECODE(_floppy);
2669 raw_cmd->rate = _floppy->rate & 0x43;
2670 if ((_floppy->rate & FD_2M) && (TRACK || HEAD) && raw_cmd->rate == 2)
2671 raw_cmd->rate = 1;
2673 if (SIZECODE)
2674 SIZECODE2 = 0xff;
2675 else
2676 SIZECODE2 = 0x80;
2677 raw_cmd->track = TRACK << STRETCH(_floppy);
2678 DR_SELECT = UNIT(current_drive) + PH_HEAD(_floppy, HEAD);
2679 GAP = _floppy->gap;
2680 CODE2SIZE;
2681 SECT_PER_TRACK = _floppy->sect << 2 >> SIZECODE;
2682 SECTOR = ((fsector_t % _floppy->sect) << 2 >> SIZECODE) +
2683 ((_floppy->stretch & FD_ZEROBASED) ? 0 : 1);
2685 /* tracksize describes the size which can be filled up with sectors
2686 * of size ssize.
2688 tracksize = _floppy->sect - _floppy->sect % ssize;
2689 if (tracksize < _floppy->sect) {
2690 SECT_PER_TRACK++;
2691 if (tracksize <= fsector_t % _floppy->sect)
2692 SECTOR--;
2694 /* if we are beyond tracksize, fill up using smaller sectors */
2695 while (tracksize <= fsector_t % _floppy->sect) {
2696 while (tracksize + ssize > _floppy->sect) {
2697 SIZECODE--;
2698 ssize >>= 1;
2700 SECTOR++;
2701 SECT_PER_TRACK++;
2702 tracksize += ssize;
2704 max_sector = HEAD * _floppy->sect + tracksize;
2705 } else if (!TRACK && !HEAD && !(_floppy->rate & FD_2M) && probing) {
2706 max_sector = _floppy->sect;
2707 } else if (!HEAD && CT(COMMAND) == FD_WRITE) {
2708 /* for virtual DMA bug workaround */
2709 max_sector = _floppy->sect;
2712 in_sector_offset = (fsector_t % _floppy->sect) % ssize;
2713 aligned_sector_t = fsector_t - in_sector_offset;
2714 max_size = current_req->nr_sectors;
2715 if ((raw_cmd->track == buffer_track) &&
2716 (current_drive == buffer_drive) &&
2717 (fsector_t >= buffer_min) && (fsector_t < buffer_max)) {
2718 /* data already in track buffer */
2719 if (CT(COMMAND) == FD_READ) {
2720 copy_buffer(1, max_sector, buffer_max);
2721 return 1;
2723 } else if (in_sector_offset || current_req->nr_sectors < ssize) {
2724 if (CT(COMMAND) == FD_WRITE) {
2725 if (fsector_t + current_req->nr_sectors > ssize &&
2726 fsector_t + current_req->nr_sectors < ssize + ssize)
2727 max_size = ssize + ssize;
2728 else
2729 max_size = ssize;
2731 raw_cmd->flags &= ~FD_RAW_WRITE;
2732 raw_cmd->flags |= FD_RAW_READ;
2733 COMMAND = FM_MODE(_floppy, FD_READ);
2734 } else if ((unsigned long)current_req->buffer < MAX_DMA_ADDRESS) {
2735 unsigned long dma_limit;
2736 int direct, indirect;
2738 indirect =
2739 transfer_size(ssize, max_sector,
2740 max_buffer_sectors * 2) - fsector_t;
2743 * Do NOT use minimum() here---MAX_DMA_ADDRESS is 64 bits wide
2744 * on a 64 bit machine!
2746 max_size = buffer_chain_size();
2747 dma_limit =
2748 (MAX_DMA_ADDRESS -
2749 ((unsigned long)current_req->buffer)) >> 9;
2750 if ((unsigned long)max_size > dma_limit) {
2751 max_size = dma_limit;
2753 /* 64 kb boundaries */
2754 if (CROSS_64KB(current_req->buffer, max_size << 9))
2755 max_size = (K_64 -
2756 ((unsigned long)current_req->buffer) %
2757 K_64) >> 9;
2758 direct = transfer_size(ssize, max_sector, max_size) - fsector_t;
2760 * We try to read tracks, but if we get too many errors, we
2761 * go back to reading just one sector at a time.
2763 * This means we should be able to read a sector even if there
2764 * are other bad sectors on this track.
2766 if (!direct ||
2767 (indirect * 2 > direct * 3 &&
2768 *errors < DP->max_errors.read_track && ((!probing
2769 || (DP->read_track & (1 << DRS->probed_format)))))) {
2770 max_size = current_req->nr_sectors;
2771 } else {
2772 raw_cmd->kernel_data = current_req->buffer;
2773 raw_cmd->length = current_count_sectors << 9;
2774 if (raw_cmd->length == 0) {
2775 DPRINT
2776 ("zero dma transfer attempted from make_raw_request\n");
2777 DPRINT("indirect=%d direct=%d fsector_t=%d",
2778 indirect, direct, fsector_t);
2779 return 0;
2781 virtualdmabug_workaround();
2782 return 2;
2786 if (CT(COMMAND) == FD_READ)
2787 max_size = max_sector; /* unbounded */
2789 /* claim buffer track if needed */
2790 if (buffer_track != raw_cmd->track || /* bad track */
2791 buffer_drive != current_drive || /* bad drive */
2792 fsector_t > buffer_max ||
2793 fsector_t < buffer_min ||
2794 ((CT(COMMAND) == FD_READ ||
2795 (!in_sector_offset && current_req->nr_sectors >= ssize)) &&
2796 max_sector > 2 * max_buffer_sectors + buffer_min &&
2797 max_size + fsector_t > 2 * max_buffer_sectors + buffer_min)
2798 /* not enough space */
2800 buffer_track = -1;
2801 buffer_drive = current_drive;
2802 buffer_max = buffer_min = aligned_sector_t;
2804 raw_cmd->kernel_data = floppy_track_buffer +
2805 ((aligned_sector_t - buffer_min) << 9);
2807 if (CT(COMMAND) == FD_WRITE) {
2808 /* copy write buffer to track buffer.
2809 * if we get here, we know that the write
2810 * is either aligned or the data already in the buffer
2811 * (buffer will be overwritten) */
2812 #ifdef FLOPPY_SANITY_CHECK
2813 if (in_sector_offset && buffer_track == -1)
2814 DPRINT("internal error offset !=0 on write\n");
2815 #endif
2816 buffer_track = raw_cmd->track;
2817 buffer_drive = current_drive;
2818 copy_buffer(ssize, max_sector,
2819 2 * max_buffer_sectors + buffer_min);
2820 } else
2821 transfer_size(ssize, max_sector,
2822 2 * max_buffer_sectors + buffer_min -
2823 aligned_sector_t);
2825 /* round up current_count_sectors to get dma xfer size */
2826 raw_cmd->length = in_sector_offset + current_count_sectors;
2827 raw_cmd->length = ((raw_cmd->length - 1) | (ssize - 1)) + 1;
2828 raw_cmd->length <<= 9;
2829 #ifdef FLOPPY_SANITY_CHECK
2830 if ((raw_cmd->length < current_count_sectors << 9) ||
2831 (raw_cmd->kernel_data != current_req->buffer &&
2832 CT(COMMAND) == FD_WRITE &&
2833 (aligned_sector_t + (raw_cmd->length >> 9) > buffer_max ||
2834 aligned_sector_t < buffer_min)) ||
2835 raw_cmd->length % (128 << SIZECODE) ||
2836 raw_cmd->length <= 0 || current_count_sectors <= 0) {
2837 DPRINT("fractionary current count b=%lx s=%lx\n",
2838 raw_cmd->length, current_count_sectors);
2839 if (raw_cmd->kernel_data != current_req->buffer)
2840 printk("addr=%d, length=%ld\n",
2841 (int)((raw_cmd->kernel_data -
2842 floppy_track_buffer) >> 9),
2843 current_count_sectors);
2844 printk("st=%d ast=%d mse=%d msi=%d\n",
2845 fsector_t, aligned_sector_t, max_sector, max_size);
2846 printk("ssize=%x SIZECODE=%d\n", ssize, SIZECODE);
2847 printk("command=%x SECTOR=%d HEAD=%d, TRACK=%d\n",
2848 COMMAND, SECTOR, HEAD, TRACK);
2849 printk("buffer drive=%d\n", buffer_drive);
2850 printk("buffer track=%d\n", buffer_track);
2851 printk("buffer_min=%d\n", buffer_min);
2852 printk("buffer_max=%d\n", buffer_max);
2853 return 0;
2856 if (raw_cmd->kernel_data != current_req->buffer) {
2857 if (raw_cmd->kernel_data < floppy_track_buffer ||
2858 current_count_sectors < 0 ||
2859 raw_cmd->length < 0 ||
2860 raw_cmd->kernel_data + raw_cmd->length >
2861 floppy_track_buffer + (max_buffer_sectors << 10)) {
2862 DPRINT("buffer overrun in schedule dma\n");
2863 printk("fsector_t=%d buffer_min=%d current_count=%ld\n",
2864 fsector_t, buffer_min, raw_cmd->length >> 9);
2865 printk("current_count_sectors=%ld\n",
2866 current_count_sectors);
2867 if (CT(COMMAND) == FD_READ)
2868 printk("read\n");
2869 if (CT(COMMAND) == FD_WRITE)
2870 printk("write\n");
2871 return 0;
2873 } else if (raw_cmd->length > current_req->nr_sectors << 9 ||
2874 current_count_sectors > current_req->nr_sectors) {
2875 DPRINT("buffer overrun in direct transfer\n");
2876 return 0;
2877 } else if (raw_cmd->length < current_count_sectors << 9) {
2878 DPRINT("more sectors than bytes\n");
2879 printk("bytes=%ld\n", raw_cmd->length >> 9);
2880 printk("sectors=%ld\n", current_count_sectors);
2882 if (raw_cmd->length == 0) {
2883 DPRINT("zero dma transfer attempted from make_raw_request\n");
2884 return 0;
2886 #endif
2888 virtualdmabug_workaround();
2889 return 2;
2892 static void redo_fd_request(void)
2894 #define REPEAT {request_done(0); continue; }
2895 int drive;
2896 int tmp;
2898 lastredo = jiffies;
2899 if (current_drive < N_DRIVE)
2900 floppy_off(current_drive);
2902 for (;;) {
2903 if (!current_req) {
2904 struct request *req;
2906 spin_lock_irq(floppy_queue->queue_lock);
2907 req = elv_next_request(floppy_queue);
2908 spin_unlock_irq(floppy_queue->queue_lock);
2909 if (!req) {
2910 do_floppy = NULL;
2911 unlock_fdc();
2912 return;
2914 current_req = req;
2916 drive = (long)current_req->rq_disk->private_data;
2917 set_fdc(drive);
2918 reschedule_timeout(current_reqD, "redo fd request", 0);
2920 set_floppy(drive);
2921 raw_cmd = &default_raw_cmd;
2922 raw_cmd->flags = 0;
2923 if (start_motor(redo_fd_request))
2924 return;
2925 disk_change(current_drive);
2926 if (test_bit(current_drive, &fake_change) ||
2927 TESTF(FD_DISK_CHANGED)) {
2928 DPRINT("disk absent or changed during operation\n");
2929 REPEAT;
2931 if (!_floppy) { /* Autodetection */
2932 if (!probing) {
2933 DRS->probed_format = 0;
2934 if (next_valid_format()) {
2935 DPRINT("no autodetectable formats\n");
2936 _floppy = NULL;
2937 REPEAT;
2940 probing = 1;
2941 _floppy =
2942 floppy_type + DP->autodetect[DRS->probed_format];
2943 } else
2944 probing = 0;
2945 errors = &(current_req->errors);
2946 tmp = make_raw_rw_request();
2947 if (tmp < 2) {
2948 request_done(tmp);
2949 continue;
2952 if (TESTF(FD_NEED_TWADDLE))
2953 twaddle();
2954 schedule_bh(floppy_start);
2955 debugt("queue fd request");
2956 return;
2958 #undef REPEAT
2961 static struct cont_t rw_cont = {
2962 .interrupt = rw_interrupt,
2963 .redo = redo_fd_request,
2964 .error = bad_flp_intr,
2965 .done = request_done
2968 static void process_fd_request(void)
2970 cont = &rw_cont;
2971 schedule_bh(redo_fd_request);
2974 static void do_fd_request(struct request_queue * q)
2976 if (max_buffer_sectors == 0) {
2977 printk("VFS: do_fd_request called on non-open device\n");
2978 return;
2981 if (usage_count == 0) {
2982 printk("warning: usage count=0, current_req=%p exiting\n",
2983 current_req);
2984 printk("sect=%ld type=%x flags=%x\n", (long)current_req->sector,
2985 current_req->cmd_type, current_req->cmd_flags);
2986 return;
2988 if (test_bit(0, &fdc_busy)) {
2989 /* fdc busy, this new request will be treated when the
2990 current one is done */
2991 is_alive("do fd request, old request running");
2992 return;
2994 lock_fdc(MAXTIMEOUT, 0);
2995 process_fd_request();
2996 is_alive("do fd request");
2999 static struct cont_t poll_cont = {
3000 .interrupt = success_and_wakeup,
3001 .redo = floppy_ready,
3002 .error = generic_failure,
3003 .done = generic_done
3006 static int poll_drive(int interruptible, int flag)
3008 int ret;
3010 /* no auto-sense, just clear dcl */
3011 raw_cmd = &default_raw_cmd;
3012 raw_cmd->flags = flag;
3013 raw_cmd->track = 0;
3014 raw_cmd->cmd_count = 0;
3015 cont = &poll_cont;
3016 #ifdef DCL_DEBUG
3017 if (DP->flags & FD_DEBUG) {
3018 DPRINT("setting NEWCHANGE in poll_drive\n");
3020 #endif
3021 SETF(FD_DISK_NEWCHANGE);
3022 WAIT(floppy_ready);
3023 return ret;
3027 * User triggered reset
3028 * ====================
3031 static void reset_intr(void)
3033 printk("weird, reset interrupt called\n");
3036 static struct cont_t reset_cont = {
3037 .interrupt = reset_intr,
3038 .redo = success_and_wakeup,
3039 .error = generic_failure,
3040 .done = generic_done
3043 static int user_reset_fdc(int drive, int arg, int interruptible)
3045 int ret;
3047 ret = 0;
3048 LOCK_FDC(drive, interruptible);
3049 if (arg == FD_RESET_ALWAYS)
3050 FDCS->reset = 1;
3051 if (FDCS->reset) {
3052 cont = &reset_cont;
3053 WAIT(reset_fdc);
3055 process_fd_request();
3056 return ret;
3060 * Misc Ioctl's and support
3061 * ========================
3063 static inline int fd_copyout(void __user *param, const void *address,
3064 unsigned long size)
3066 return copy_to_user(param, address, size) ? -EFAULT : 0;
3069 static inline int fd_copyin(void __user *param, void *address, unsigned long size)
3071 return copy_from_user(address, param, size) ? -EFAULT : 0;
3074 #define _COPYOUT(x) (copy_to_user((void __user *)param, &(x), sizeof(x)) ? -EFAULT : 0)
3075 #define _COPYIN(x) (copy_from_user(&(x), (void __user *)param, sizeof(x)) ? -EFAULT : 0)
3077 #define COPYOUT(x) ECALL(_COPYOUT(x))
3078 #define COPYIN(x) ECALL(_COPYIN(x))
3080 static inline const char *drive_name(int type, int drive)
3082 struct floppy_struct *floppy;
3084 if (type)
3085 floppy = floppy_type + type;
3086 else {
3087 if (UDP->native_format)
3088 floppy = floppy_type + UDP->native_format;
3089 else
3090 return "(null)";
3092 if (floppy->name)
3093 return floppy->name;
3094 else
3095 return "(null)";
3098 /* raw commands */
3099 static void raw_cmd_done(int flag)
3101 int i;
3103 if (!flag) {
3104 raw_cmd->flags |= FD_RAW_FAILURE;
3105 raw_cmd->flags |= FD_RAW_HARDFAILURE;
3106 } else {
3107 raw_cmd->reply_count = inr;
3108 if (raw_cmd->reply_count > MAX_REPLIES)
3109 raw_cmd->reply_count = 0;
3110 for (i = 0; i < raw_cmd->reply_count; i++)
3111 raw_cmd->reply[i] = reply_buffer[i];
3113 if (raw_cmd->flags & (FD_RAW_READ | FD_RAW_WRITE)) {
3114 unsigned long flags;
3115 flags = claim_dma_lock();
3116 raw_cmd->length = fd_get_dma_residue();
3117 release_dma_lock(flags);
3120 if ((raw_cmd->flags & FD_RAW_SOFTFAILURE) &&
3121 (!raw_cmd->reply_count || (raw_cmd->reply[0] & 0xc0)))
3122 raw_cmd->flags |= FD_RAW_FAILURE;
3124 if (disk_change(current_drive))
3125 raw_cmd->flags |= FD_RAW_DISK_CHANGE;
3126 else
3127 raw_cmd->flags &= ~FD_RAW_DISK_CHANGE;
3128 if (raw_cmd->flags & FD_RAW_NO_MOTOR_AFTER)
3129 motor_off_callback(current_drive);
3131 if (raw_cmd->next &&
3132 (!(raw_cmd->flags & FD_RAW_FAILURE) ||
3133 !(raw_cmd->flags & FD_RAW_STOP_IF_FAILURE)) &&
3134 ((raw_cmd->flags & FD_RAW_FAILURE) ||
3135 !(raw_cmd->flags & FD_RAW_STOP_IF_SUCCESS))) {
3136 raw_cmd = raw_cmd->next;
3137 return;
3140 generic_done(flag);
3143 static struct cont_t raw_cmd_cont = {
3144 .interrupt = success_and_wakeup,
3145 .redo = floppy_start,
3146 .error = generic_failure,
3147 .done = raw_cmd_done
3150 static inline int raw_cmd_copyout(int cmd, char __user *param,
3151 struct floppy_raw_cmd *ptr)
3153 int ret;
3155 while (ptr) {
3156 COPYOUT(*ptr);
3157 param += sizeof(struct floppy_raw_cmd);
3158 if ((ptr->flags & FD_RAW_READ) && ptr->buffer_length) {
3159 if (ptr->length >= 0
3160 && ptr->length <= ptr->buffer_length)
3161 ECALL(fd_copyout
3162 (ptr->data, ptr->kernel_data,
3163 ptr->buffer_length - ptr->length));
3165 ptr = ptr->next;
3167 return 0;
3170 static void raw_cmd_free(struct floppy_raw_cmd **ptr)
3172 struct floppy_raw_cmd *next;
3173 struct floppy_raw_cmd *this;
3175 this = *ptr;
3176 *ptr = NULL;
3177 while (this) {
3178 if (this->buffer_length) {
3179 fd_dma_mem_free((unsigned long)this->kernel_data,
3180 this->buffer_length);
3181 this->buffer_length = 0;
3183 next = this->next;
3184 kfree(this);
3185 this = next;
3189 static inline int raw_cmd_copyin(int cmd, char __user *param,
3190 struct floppy_raw_cmd **rcmd)
3192 struct floppy_raw_cmd *ptr;
3193 int ret;
3194 int i;
3196 *rcmd = NULL;
3197 while (1) {
3198 ptr = (struct floppy_raw_cmd *)
3199 kmalloc(sizeof(struct floppy_raw_cmd), GFP_USER);
3200 if (!ptr)
3201 return -ENOMEM;
3202 *rcmd = ptr;
3203 COPYIN(*ptr);
3204 ptr->next = NULL;
3205 ptr->buffer_length = 0;
3206 param += sizeof(struct floppy_raw_cmd);
3207 if (ptr->cmd_count > 33)
3208 /* the command may now also take up the space
3209 * initially intended for the reply & the
3210 * reply count. Needed for long 82078 commands
3211 * such as RESTORE, which takes ... 17 command
3212 * bytes. Murphy's law #137: When you reserve
3213 * 16 bytes for a structure, you'll one day
3214 * discover that you really need 17...
3216 return -EINVAL;
3218 for (i = 0; i < 16; i++)
3219 ptr->reply[i] = 0;
3220 ptr->resultcode = 0;
3221 ptr->kernel_data = NULL;
3223 if (ptr->flags & (FD_RAW_READ | FD_RAW_WRITE)) {
3224 if (ptr->length <= 0)
3225 return -EINVAL;
3226 ptr->kernel_data =
3227 (char *)fd_dma_mem_alloc(ptr->length);
3228 fallback_on_nodma_alloc(&ptr->kernel_data, ptr->length);
3229 if (!ptr->kernel_data)
3230 return -ENOMEM;
3231 ptr->buffer_length = ptr->length;
3233 if (ptr->flags & FD_RAW_WRITE)
3234 ECALL(fd_copyin(ptr->data, ptr->kernel_data,
3235 ptr->length));
3236 rcmd = &(ptr->next);
3237 if (!(ptr->flags & FD_RAW_MORE))
3238 return 0;
3239 ptr->rate &= 0x43;
3243 static int raw_cmd_ioctl(int cmd, void __user *param)
3245 struct floppy_raw_cmd *my_raw_cmd;
3246 int drive;
3247 int ret2;
3248 int ret;
3250 if (FDCS->rawcmd <= 1)
3251 FDCS->rawcmd = 1;
3252 for (drive = 0; drive < N_DRIVE; drive++) {
3253 if (FDC(drive) != fdc)
3254 continue;
3255 if (drive == current_drive) {
3256 if (UDRS->fd_ref > 1) {
3257 FDCS->rawcmd = 2;
3258 break;
3260 } else if (UDRS->fd_ref) {
3261 FDCS->rawcmd = 2;
3262 break;
3266 if (FDCS->reset)
3267 return -EIO;
3269 ret = raw_cmd_copyin(cmd, param, &my_raw_cmd);
3270 if (ret) {
3271 raw_cmd_free(&my_raw_cmd);
3272 return ret;
3275 raw_cmd = my_raw_cmd;
3276 cont = &raw_cmd_cont;
3277 ret = wait_til_done(floppy_start, 1);
3278 #ifdef DCL_DEBUG
3279 if (DP->flags & FD_DEBUG) {
3280 DPRINT("calling disk change from raw_cmd ioctl\n");
3282 #endif
3284 if (ret != -EINTR && FDCS->reset)
3285 ret = -EIO;
3287 DRS->track = NO_TRACK;
3289 ret2 = raw_cmd_copyout(cmd, param, my_raw_cmd);
3290 if (!ret)
3291 ret = ret2;
3292 raw_cmd_free(&my_raw_cmd);
3293 return ret;
3296 static int invalidate_drive(struct block_device *bdev)
3298 /* invalidate the buffer track to force a reread */
3299 set_bit((long)bdev->bd_disk->private_data, &fake_change);
3300 process_fd_request();
3301 check_disk_change(bdev);
3302 return 0;
3305 static inline int set_geometry(unsigned int cmd, struct floppy_struct *g,
3306 int drive, int type, struct block_device *bdev)
3308 int cnt;
3310 /* sanity checking for parameters. */
3311 if (g->sect <= 0 ||
3312 g->head <= 0 ||
3313 g->track <= 0 || g->track > UDP->tracks >> STRETCH(g) ||
3314 /* check if reserved bits are set */
3315 (g->stretch & ~(FD_STRETCH | FD_SWAPSIDES | FD_ZEROBASED)) != 0)
3316 return -EINVAL;
3317 if (type) {
3318 if (!capable(CAP_SYS_ADMIN))
3319 return -EPERM;
3320 mutex_lock(&open_lock);
3321 LOCK_FDC(drive, 1);
3322 floppy_type[type] = *g;
3323 floppy_type[type].name = "user format";
3324 for (cnt = type << 2; cnt < (type << 2) + 4; cnt++)
3325 floppy_sizes[cnt] = floppy_sizes[cnt + 0x80] =
3326 floppy_type[type].size + 1;
3327 process_fd_request();
3328 for (cnt = 0; cnt < N_DRIVE; cnt++) {
3329 struct block_device *bdev = opened_bdev[cnt];
3330 if (!bdev || ITYPE(drive_state[cnt].fd_device) != type)
3331 continue;
3332 __invalidate_device(bdev);
3334 mutex_unlock(&open_lock);
3335 } else {
3336 int oldStretch;
3337 LOCK_FDC(drive, 1);
3338 if (cmd != FDDEFPRM)
3339 /* notice a disk change immediately, else
3340 * we lose our settings immediately*/
3341 CALL(poll_drive(1, FD_RAW_NEED_DISK));
3342 oldStretch = g->stretch;
3343 user_params[drive] = *g;
3344 if (buffer_drive == drive)
3345 SUPBOUND(buffer_max, user_params[drive].sect);
3346 current_type[drive] = &user_params[drive];
3347 floppy_sizes[drive] = user_params[drive].size;
3348 if (cmd == FDDEFPRM)
3349 DRS->keep_data = -1;
3350 else
3351 DRS->keep_data = 1;
3352 /* invalidation. Invalidate only when needed, i.e.
3353 * when there are already sectors in the buffer cache
3354 * whose number will change. This is useful, because
3355 * mtools often changes the geometry of the disk after
3356 * looking at the boot block */
3357 if (DRS->maxblock > user_params[drive].sect ||
3358 DRS->maxtrack ||
3359 ((user_params[drive].sect ^ oldStretch) &
3360 (FD_SWAPSIDES | FD_ZEROBASED)))
3361 invalidate_drive(bdev);
3362 else
3363 process_fd_request();
3365 return 0;
3368 /* handle obsolete ioctl's */
3369 static int ioctl_table[] = {
3370 FDCLRPRM,
3371 FDSETPRM,
3372 FDDEFPRM,
3373 FDGETPRM,
3374 FDMSGON,
3375 FDMSGOFF,
3376 FDFMTBEG,
3377 FDFMTTRK,
3378 FDFMTEND,
3379 FDSETEMSGTRESH,
3380 FDFLUSH,
3381 FDSETMAXERRS,
3382 FDGETMAXERRS,
3383 FDGETDRVTYP,
3384 FDSETDRVPRM,
3385 FDGETDRVPRM,
3386 FDGETDRVSTAT,
3387 FDPOLLDRVSTAT,
3388 FDRESET,
3389 FDGETFDCSTAT,
3390 FDWERRORCLR,
3391 FDWERRORGET,
3392 FDRAWCMD,
3393 FDEJECT,
3394 FDTWADDLE
3397 static inline int normalize_ioctl(int *cmd, int *size)
3399 int i;
3401 for (i = 0; i < ARRAY_SIZE(ioctl_table); i++) {
3402 if ((*cmd & 0xffff) == (ioctl_table[i] & 0xffff)) {
3403 *size = _IOC_SIZE(*cmd);
3404 *cmd = ioctl_table[i];
3405 if (*size > _IOC_SIZE(*cmd)) {
3406 printk("ioctl not yet supported\n");
3407 return -EFAULT;
3409 return 0;
3412 return -EINVAL;
3415 static int get_floppy_geometry(int drive, int type, struct floppy_struct **g)
3417 if (type)
3418 *g = &floppy_type[type];
3419 else {
3420 LOCK_FDC(drive, 0);
3421 CALL(poll_drive(0, 0));
3422 process_fd_request();
3423 *g = current_type[drive];
3425 if (!*g)
3426 return -ENODEV;
3427 return 0;
3430 static int fd_getgeo(struct block_device *bdev, struct hd_geometry *geo)
3432 int drive = (long)bdev->bd_disk->private_data;
3433 int type = ITYPE(drive_state[drive].fd_device);
3434 struct floppy_struct *g;
3435 int ret;
3437 ret = get_floppy_geometry(drive, type, &g);
3438 if (ret)
3439 return ret;
3441 geo->heads = g->head;
3442 geo->sectors = g->sect;
3443 geo->cylinders = g->track;
3444 return 0;
3447 static int fd_ioctl(struct inode *inode, struct file *filp, unsigned int cmd,
3448 unsigned long param)
3450 #define FD_IOCTL_ALLOWED ((filp) && (filp)->private_data)
3451 #define OUT(c,x) case c: outparam = (const char *) (x); break
3452 #define IN(c,x,tag) case c: *(x) = inparam. tag ; return 0
3454 int drive = (long)inode->i_bdev->bd_disk->private_data;
3455 int type = ITYPE(UDRS->fd_device);
3456 int i;
3457 int ret;
3458 int size;
3459 union inparam {
3460 struct floppy_struct g; /* geometry */
3461 struct format_descr f;
3462 struct floppy_max_errors max_errors;
3463 struct floppy_drive_params dp;
3464 } inparam; /* parameters coming from user space */
3465 const char *outparam; /* parameters passed back to user space */
3467 /* convert compatibility eject ioctls into floppy eject ioctl.
3468 * We do this in order to provide a means to eject floppy disks before
3469 * installing the new fdutils package */
3470 if (cmd == CDROMEJECT || /* CD-ROM eject */
3471 cmd == 0x6470 /* SunOS floppy eject */ ) {
3472 DPRINT("obsolete eject ioctl\n");
3473 DPRINT("please use floppycontrol --eject\n");
3474 cmd = FDEJECT;
3477 /* convert the old style command into a new style command */
3478 if ((cmd & 0xff00) == 0x0200) {
3479 ECALL(normalize_ioctl(&cmd, &size));
3480 } else
3481 return -EINVAL;
3483 /* permission checks */
3484 if (((cmd & 0x40) && !FD_IOCTL_ALLOWED) ||
3485 ((cmd & 0x80) && !capable(CAP_SYS_ADMIN)))
3486 return -EPERM;
3488 /* copyin */
3489 CLEARSTRUCT(&inparam);
3490 if (_IOC_DIR(cmd) & _IOC_WRITE)
3491 ECALL(fd_copyin((void __user *)param, &inparam, size))
3493 switch (cmd) {
3494 case FDEJECT:
3495 if (UDRS->fd_ref != 1)
3496 /* somebody else has this drive open */
3497 return -EBUSY;
3498 LOCK_FDC(drive, 1);
3500 /* do the actual eject. Fails on
3501 * non-Sparc architectures */
3502 ret = fd_eject(UNIT(drive));
3504 USETF(FD_DISK_CHANGED);
3505 USETF(FD_VERIFY);
3506 process_fd_request();
3507 return ret;
3508 case FDCLRPRM:
3509 LOCK_FDC(drive, 1);
3510 current_type[drive] = NULL;
3511 floppy_sizes[drive] = MAX_DISK_SIZE << 1;
3512 UDRS->keep_data = 0;
3513 return invalidate_drive(inode->i_bdev);
3514 case FDSETPRM:
3515 case FDDEFPRM:
3516 return set_geometry(cmd, &inparam.g,
3517 drive, type, inode->i_bdev);
3518 case FDGETPRM:
3519 ECALL(get_floppy_geometry(drive, type,
3520 (struct floppy_struct **)
3521 &outparam));
3522 break;
3524 case FDMSGON:
3525 UDP->flags |= FTD_MSG;
3526 return 0;
3527 case FDMSGOFF:
3528 UDP->flags &= ~FTD_MSG;
3529 return 0;
3531 case FDFMTBEG:
3532 LOCK_FDC(drive, 1);
3533 CALL(poll_drive(1, FD_RAW_NEED_DISK));
3534 ret = UDRS->flags;
3535 process_fd_request();
3536 if (ret & FD_VERIFY)
3537 return -ENODEV;
3538 if (!(ret & FD_DISK_WRITABLE))
3539 return -EROFS;
3540 return 0;
3541 case FDFMTTRK:
3542 if (UDRS->fd_ref != 1)
3543 return -EBUSY;
3544 return do_format(drive, &inparam.f);
3545 case FDFMTEND:
3546 case FDFLUSH:
3547 LOCK_FDC(drive, 1);
3548 return invalidate_drive(inode->i_bdev);
3550 case FDSETEMSGTRESH:
3551 UDP->max_errors.reporting =
3552 (unsigned short)(param & 0x0f);
3553 return 0;
3554 OUT(FDGETMAXERRS, &UDP->max_errors);
3555 IN(FDSETMAXERRS, &UDP->max_errors, max_errors);
3557 case FDGETDRVTYP:
3558 outparam = drive_name(type, drive);
3559 SUPBOUND(size, strlen(outparam) + 1);
3560 break;
3562 IN(FDSETDRVPRM, UDP, dp);
3563 OUT(FDGETDRVPRM, UDP);
3565 case FDPOLLDRVSTAT:
3566 LOCK_FDC(drive, 1);
3567 CALL(poll_drive(1, FD_RAW_NEED_DISK));
3568 process_fd_request();
3569 /* fall through */
3570 OUT(FDGETDRVSTAT, UDRS);
3572 case FDRESET:
3573 return user_reset_fdc(drive, (int)param, 1);
3575 OUT(FDGETFDCSTAT, UFDCS);
3577 case FDWERRORCLR:
3578 CLEARSTRUCT(UDRWE);
3579 return 0;
3580 OUT(FDWERRORGET, UDRWE);
3582 case FDRAWCMD:
3583 if (type)
3584 return -EINVAL;
3585 LOCK_FDC(drive, 1);
3586 set_floppy(drive);
3587 CALL(i = raw_cmd_ioctl(cmd, (void __user *)param));
3588 process_fd_request();
3589 return i;
3591 case FDTWADDLE:
3592 LOCK_FDC(drive, 1);
3593 twaddle();
3594 process_fd_request();
3595 return 0;
3597 default:
3598 return -EINVAL;
3601 if (_IOC_DIR(cmd) & _IOC_READ)
3602 return fd_copyout((void __user *)param, outparam, size);
3603 else
3604 return 0;
3605 #undef OUT
3606 #undef IN
3609 static void __init config_types(void)
3611 int first = 1;
3612 int drive;
3614 /* read drive info out of physical CMOS */
3615 drive = 0;
3616 if (!UDP->cmos)
3617 UDP->cmos = FLOPPY0_TYPE;
3618 drive = 1;
3619 if (!UDP->cmos && FLOPPY1_TYPE)
3620 UDP->cmos = FLOPPY1_TYPE;
3622 /* FIXME: additional physical CMOS drive detection should go here */
3624 for (drive = 0; drive < N_DRIVE; drive++) {
3625 unsigned int type = UDP->cmos;
3626 struct floppy_drive_params *params;
3627 const char *name = NULL;
3628 static char temparea[32];
3630 if (type < ARRAY_SIZE(default_drive_params)) {
3631 params = &default_drive_params[type].params;
3632 if (type) {
3633 name = default_drive_params[type].name;
3634 allowed_drive_mask |= 1 << drive;
3635 } else
3636 allowed_drive_mask &= ~(1 << drive);
3637 } else {
3638 params = &default_drive_params[0].params;
3639 sprintf(temparea, "unknown type %d (usb?)", type);
3640 name = temparea;
3642 if (name) {
3643 const char *prepend = ",";
3644 if (first) {
3645 prepend = KERN_INFO "Floppy drive(s):";
3646 first = 0;
3648 printk("%s fd%d is %s", prepend, drive, name);
3650 *UDP = *params;
3652 if (!first)
3653 printk("\n");
3656 static int floppy_release(struct inode *inode, struct file *filp)
3658 int drive = (long)inode->i_bdev->bd_disk->private_data;
3660 mutex_lock(&open_lock);
3661 if (UDRS->fd_ref < 0)
3662 UDRS->fd_ref = 0;
3663 else if (!UDRS->fd_ref--) {
3664 DPRINT("floppy_release with fd_ref == 0");
3665 UDRS->fd_ref = 0;
3667 if (!UDRS->fd_ref)
3668 opened_bdev[drive] = NULL;
3669 mutex_unlock(&open_lock);
3671 return 0;
3675 * floppy_open check for aliasing (/dev/fd0 can be the same as
3676 * /dev/PS0 etc), and disallows simultaneous access to the same
3677 * drive with different device numbers.
3679 static int floppy_open(struct inode *inode, struct file *filp)
3681 int drive = (long)inode->i_bdev->bd_disk->private_data;
3682 int old_dev;
3683 int try;
3684 int res = -EBUSY;
3685 char *tmp;
3687 filp->private_data = (void *)0;
3688 mutex_lock(&open_lock);
3689 old_dev = UDRS->fd_device;
3690 if (opened_bdev[drive] && opened_bdev[drive] != inode->i_bdev)
3691 goto out2;
3693 if (!UDRS->fd_ref && (UDP->flags & FD_BROKEN_DCL)) {
3694 USETF(FD_DISK_CHANGED);
3695 USETF(FD_VERIFY);
3698 if (UDRS->fd_ref == -1 || (UDRS->fd_ref && (filp->f_flags & O_EXCL)))
3699 goto out2;
3701 if (filp->f_flags & O_EXCL)
3702 UDRS->fd_ref = -1;
3703 else
3704 UDRS->fd_ref++;
3706 opened_bdev[drive] = inode->i_bdev;
3708 res = -ENXIO;
3710 if (!floppy_track_buffer) {
3711 /* if opening an ED drive, reserve a big buffer,
3712 * else reserve a small one */
3713 if ((UDP->cmos == 6) || (UDP->cmos == 5))
3714 try = 64; /* Only 48 actually useful */
3715 else
3716 try = 32; /* Only 24 actually useful */
3718 tmp = (char *)fd_dma_mem_alloc(1024 * try);
3719 if (!tmp && !floppy_track_buffer) {
3720 try >>= 1; /* buffer only one side */
3721 INFBOUND(try, 16);
3722 tmp = (char *)fd_dma_mem_alloc(1024 * try);
3724 if (!tmp && !floppy_track_buffer) {
3725 fallback_on_nodma_alloc(&tmp, 2048 * try);
3727 if (!tmp && !floppy_track_buffer) {
3728 DPRINT("Unable to allocate DMA memory\n");
3729 goto out;
3731 if (floppy_track_buffer) {
3732 if (tmp)
3733 fd_dma_mem_free((unsigned long)tmp, try * 1024);
3734 } else {
3735 buffer_min = buffer_max = -1;
3736 floppy_track_buffer = tmp;
3737 max_buffer_sectors = try;
3741 UDRS->fd_device = iminor(inode);
3742 set_capacity(disks[drive], floppy_sizes[iminor(inode)]);
3743 if (old_dev != -1 && old_dev != iminor(inode)) {
3744 if (buffer_drive == drive)
3745 buffer_track = -1;
3748 /* Allow ioctls if we have write-permissions even if read-only open.
3749 * Needed so that programs such as fdrawcmd still can work on write
3750 * protected disks */
3751 if ((filp->f_mode & FMODE_WRITE) || !file_permission(filp, MAY_WRITE))
3752 filp->private_data = (void *)8;
3754 if (UFDCS->rawcmd == 1)
3755 UFDCS->rawcmd = 2;
3757 if (!(filp->f_flags & O_NDELAY)) {
3758 if (filp->f_mode & 3) {
3759 UDRS->last_checked = 0;
3760 check_disk_change(inode->i_bdev);
3761 if (UTESTF(FD_DISK_CHANGED))
3762 goto out;
3764 res = -EROFS;
3765 if ((filp->f_mode & 2) && !(UTESTF(FD_DISK_WRITABLE)))
3766 goto out;
3768 mutex_unlock(&open_lock);
3769 return 0;
3770 out:
3771 if (UDRS->fd_ref < 0)
3772 UDRS->fd_ref = 0;
3773 else
3774 UDRS->fd_ref--;
3775 if (!UDRS->fd_ref)
3776 opened_bdev[drive] = NULL;
3777 out2:
3778 mutex_unlock(&open_lock);
3779 return res;
3783 * Check if the disk has been changed or if a change has been faked.
3785 static int check_floppy_change(struct gendisk *disk)
3787 int drive = (long)disk->private_data;
3789 if (UTESTF(FD_DISK_CHANGED) || UTESTF(FD_VERIFY))
3790 return 1;
3792 if (time_after(jiffies, UDRS->last_checked + UDP->checkfreq)) {
3793 lock_fdc(drive, 0);
3794 poll_drive(0, 0);
3795 process_fd_request();
3798 if (UTESTF(FD_DISK_CHANGED) ||
3799 UTESTF(FD_VERIFY) ||
3800 test_bit(drive, &fake_change) ||
3801 (!ITYPE(UDRS->fd_device) && !current_type[drive]))
3802 return 1;
3803 return 0;
3807 * This implements "read block 0" for floppy_revalidate().
3808 * Needed for format autodetection, checking whether there is
3809 * a disk in the drive, and whether that disk is writable.
3812 static void floppy_rb0_complete(struct bio *bio,
3813 int err)
3815 complete((struct completion *)bio->bi_private);
3818 static int __floppy_read_block_0(struct block_device *bdev)
3820 struct bio bio;
3821 struct bio_vec bio_vec;
3822 struct completion complete;
3823 struct page *page;
3824 size_t size;
3826 page = alloc_page(GFP_NOIO);
3827 if (!page) {
3828 process_fd_request();
3829 return -ENOMEM;
3832 size = bdev->bd_block_size;
3833 if (!size)
3834 size = 1024;
3836 bio_init(&bio);
3837 bio.bi_io_vec = &bio_vec;
3838 bio_vec.bv_page = page;
3839 bio_vec.bv_len = size;
3840 bio_vec.bv_offset = 0;
3841 bio.bi_vcnt = 1;
3842 bio.bi_idx = 0;
3843 bio.bi_size = size;
3844 bio.bi_bdev = bdev;
3845 bio.bi_sector = 0;
3846 init_completion(&complete);
3847 bio.bi_private = &complete;
3848 bio.bi_end_io = floppy_rb0_complete;
3850 submit_bio(READ, &bio);
3851 generic_unplug_device(bdev_get_queue(bdev));
3852 process_fd_request();
3853 wait_for_completion(&complete);
3855 __free_page(page);
3857 return 0;
3860 /* revalidate the floppy disk, i.e. trigger format autodetection by reading
3861 * the bootblock (block 0). "Autodetection" is also needed to check whether
3862 * there is a disk in the drive at all... Thus we also do it for fixed
3863 * geometry formats */
3864 static int floppy_revalidate(struct gendisk *disk)
3866 int drive = (long)disk->private_data;
3867 #define NO_GEOM (!current_type[drive] && !ITYPE(UDRS->fd_device))
3868 int cf;
3869 int res = 0;
3871 if (UTESTF(FD_DISK_CHANGED) ||
3872 UTESTF(FD_VERIFY) || test_bit(drive, &fake_change) || NO_GEOM) {
3873 if (usage_count == 0) {
3874 printk("VFS: revalidate called on non-open device.\n");
3875 return -EFAULT;
3877 lock_fdc(drive, 0);
3878 cf = UTESTF(FD_DISK_CHANGED) || UTESTF(FD_VERIFY);
3879 if (!(cf || test_bit(drive, &fake_change) || NO_GEOM)) {
3880 process_fd_request(); /*already done by another thread */
3881 return 0;
3883 UDRS->maxblock = 0;
3884 UDRS->maxtrack = 0;
3885 if (buffer_drive == drive)
3886 buffer_track = -1;
3887 clear_bit(drive, &fake_change);
3888 UCLEARF(FD_DISK_CHANGED);
3889 if (cf)
3890 UDRS->generation++;
3891 if (NO_GEOM) {
3892 /* auto-sensing */
3893 res = __floppy_read_block_0(opened_bdev[drive]);
3894 } else {
3895 if (cf)
3896 poll_drive(0, FD_RAW_NEED_DISK);
3897 process_fd_request();
3900 set_capacity(disk, floppy_sizes[UDRS->fd_device]);
3901 return res;
3904 static struct block_device_operations floppy_fops = {
3905 .owner = THIS_MODULE,
3906 .open = floppy_open,
3907 .release = floppy_release,
3908 .ioctl = fd_ioctl,
3909 .getgeo = fd_getgeo,
3910 .media_changed = check_floppy_change,
3911 .revalidate_disk = floppy_revalidate,
3915 * Floppy Driver initialization
3916 * =============================
3919 /* Determine the floppy disk controller type */
3920 /* This routine was written by David C. Niemi */
3921 static char __init get_fdc_version(void)
3923 int r;
3925 output_byte(FD_DUMPREGS); /* 82072 and better know DUMPREGS */
3926 if (FDCS->reset)
3927 return FDC_NONE;
3928 if ((r = result()) <= 0x00)
3929 return FDC_NONE; /* No FDC present ??? */
3930 if ((r == 1) && (reply_buffer[0] == 0x80)) {
3931 printk(KERN_INFO "FDC %d is an 8272A\n", fdc);
3932 return FDC_8272A; /* 8272a/765 don't know DUMPREGS */
3934 if (r != 10) {
3935 printk
3936 ("FDC %d init: DUMPREGS: unexpected return of %d bytes.\n",
3937 fdc, r);
3938 return FDC_UNKNOWN;
3941 if (!fdc_configure()) {
3942 printk(KERN_INFO "FDC %d is an 82072\n", fdc);
3943 return FDC_82072; /* 82072 doesn't know CONFIGURE */
3946 output_byte(FD_PERPENDICULAR);
3947 if (need_more_output() == MORE_OUTPUT) {
3948 output_byte(0);
3949 } else {
3950 printk(KERN_INFO "FDC %d is an 82072A\n", fdc);
3951 return FDC_82072A; /* 82072A as found on Sparcs. */
3954 output_byte(FD_UNLOCK);
3955 r = result();
3956 if ((r == 1) && (reply_buffer[0] == 0x80)) {
3957 printk(KERN_INFO "FDC %d is a pre-1991 82077\n", fdc);
3958 return FDC_82077_ORIG; /* Pre-1991 82077, doesn't know
3959 * LOCK/UNLOCK */
3961 if ((r != 1) || (reply_buffer[0] != 0x00)) {
3962 printk("FDC %d init: UNLOCK: unexpected return of %d bytes.\n",
3963 fdc, r);
3964 return FDC_UNKNOWN;
3966 output_byte(FD_PARTID);
3967 r = result();
3968 if (r != 1) {
3969 printk("FDC %d init: PARTID: unexpected return of %d bytes.\n",
3970 fdc, r);
3971 return FDC_UNKNOWN;
3973 if (reply_buffer[0] == 0x80) {
3974 printk(KERN_INFO "FDC %d is a post-1991 82077\n", fdc);
3975 return FDC_82077; /* Revised 82077AA passes all the tests */
3977 switch (reply_buffer[0] >> 5) {
3978 case 0x0:
3979 /* Either a 82078-1 or a 82078SL running at 5Volt */
3980 printk(KERN_INFO "FDC %d is an 82078.\n", fdc);
3981 return FDC_82078;
3982 case 0x1:
3983 printk(KERN_INFO "FDC %d is a 44pin 82078\n", fdc);
3984 return FDC_82078;
3985 case 0x2:
3986 printk(KERN_INFO "FDC %d is a S82078B\n", fdc);
3987 return FDC_S82078B;
3988 case 0x3:
3989 printk(KERN_INFO "FDC %d is a National Semiconductor PC87306\n",
3990 fdc);
3991 return FDC_87306;
3992 default:
3993 printk(KERN_INFO
3994 "FDC %d init: 82078 variant with unknown PARTID=%d.\n",
3995 fdc, reply_buffer[0] >> 5);
3996 return FDC_82078_UNKN;
3998 } /* get_fdc_version */
4000 /* lilo configuration */
4002 static void __init floppy_set_flags(int *ints, int param, int param2)
4004 int i;
4006 for (i = 0; i < ARRAY_SIZE(default_drive_params); i++) {
4007 if (param)
4008 default_drive_params[i].params.flags |= param2;
4009 else
4010 default_drive_params[i].params.flags &= ~param2;
4012 DPRINT("%s flag 0x%x\n", param2 ? "Setting" : "Clearing", param);
4015 static void __init daring(int *ints, int param, int param2)
4017 int i;
4019 for (i = 0; i < ARRAY_SIZE(default_drive_params); i++) {
4020 if (param) {
4021 default_drive_params[i].params.select_delay = 0;
4022 default_drive_params[i].params.flags |=
4023 FD_SILENT_DCL_CLEAR;
4024 } else {
4025 default_drive_params[i].params.select_delay =
4026 2 * HZ / 100;
4027 default_drive_params[i].params.flags &=
4028 ~FD_SILENT_DCL_CLEAR;
4031 DPRINT("Assuming %s floppy hardware\n", param ? "standard" : "broken");
4034 static void __init set_cmos(int *ints, int dummy, int dummy2)
4036 int current_drive = 0;
4038 if (ints[0] != 2) {
4039 DPRINT("wrong number of parameters for CMOS\n");
4040 return;
4042 current_drive = ints[1];
4043 if (current_drive < 0 || current_drive >= 8) {
4044 DPRINT("bad drive for set_cmos\n");
4045 return;
4047 #if N_FDC > 1
4048 if (current_drive >= 4 && !FDC2)
4049 FDC2 = 0x370;
4050 #endif
4051 DP->cmos = ints[2];
4052 DPRINT("setting CMOS code to %d\n", ints[2]);
4055 static struct param_table {
4056 const char *name;
4057 void (*fn) (int *ints, int param, int param2);
4058 int *var;
4059 int def_param;
4060 int param2;
4061 } config_params[] __initdata = {
4062 {"allowed_drive_mask", NULL, &allowed_drive_mask, 0xff, 0}, /* obsolete */
4063 {"all_drives", NULL, &allowed_drive_mask, 0xff, 0}, /* obsolete */
4064 {"asus_pci", NULL, &allowed_drive_mask, 0x33, 0},
4065 {"irq", NULL, &FLOPPY_IRQ, 6, 0},
4066 {"dma", NULL, &FLOPPY_DMA, 2, 0},
4067 {"daring", daring, NULL, 1, 0},
4068 #if N_FDC > 1
4069 {"two_fdc", NULL, &FDC2, 0x370, 0},
4070 {"one_fdc", NULL, &FDC2, 0, 0},
4071 #endif
4072 {"thinkpad", floppy_set_flags, NULL, 1, FD_INVERTED_DCL},
4073 {"broken_dcl", floppy_set_flags, NULL, 1, FD_BROKEN_DCL},
4074 {"messages", floppy_set_flags, NULL, 1, FTD_MSG},
4075 {"silent_dcl_clear", floppy_set_flags, NULL, 1, FD_SILENT_DCL_CLEAR},
4076 {"debug", floppy_set_flags, NULL, 1, FD_DEBUG},
4077 {"nodma", NULL, &can_use_virtual_dma, 1, 0},
4078 {"omnibook", NULL, &can_use_virtual_dma, 1, 0},
4079 {"yesdma", NULL, &can_use_virtual_dma, 0, 0},
4080 {"fifo_depth", NULL, &fifo_depth, 0xa, 0},
4081 {"nofifo", NULL, &no_fifo, 0x20, 0},
4082 {"usefifo", NULL, &no_fifo, 0, 0},
4083 {"cmos", set_cmos, NULL, 0, 0},
4084 {"slow", NULL, &slow_floppy, 1, 0},
4085 {"unexpected_interrupts", NULL, &print_unex, 1, 0},
4086 {"no_unexpected_interrupts", NULL, &print_unex, 0, 0},
4087 {"L40SX", NULL, &print_unex, 0, 0}
4089 EXTRA_FLOPPY_PARAMS
4092 static int __init floppy_setup(char *str)
4094 int i;
4095 int param;
4096 int ints[11];
4098 str = get_options(str, ARRAY_SIZE(ints), ints);
4099 if (str) {
4100 for (i = 0; i < ARRAY_SIZE(config_params); i++) {
4101 if (strcmp(str, config_params[i].name) == 0) {
4102 if (ints[0])
4103 param = ints[1];
4104 else
4105 param = config_params[i].def_param;
4106 if (config_params[i].fn)
4107 config_params[i].
4108 fn(ints, param,
4109 config_params[i].param2);
4110 if (config_params[i].var) {
4111 DPRINT("%s=%d\n", str, param);
4112 *config_params[i].var = param;
4114 return 1;
4118 if (str) {
4119 DPRINT("unknown floppy option [%s]\n", str);
4121 DPRINT("allowed options are:");
4122 for (i = 0; i < ARRAY_SIZE(config_params); i++)
4123 printk(" %s", config_params[i].name);
4124 printk("\n");
4125 } else
4126 DPRINT("botched floppy option\n");
4127 DPRINT("Read Documentation/floppy.txt\n");
4128 return 0;
4131 static int have_no_fdc = -ENODEV;
4133 static ssize_t floppy_cmos_show(struct device *dev,
4134 struct device_attribute *attr, char *buf)
4136 struct platform_device *p;
4137 int drive;
4139 p = container_of(dev, struct platform_device,dev);
4140 drive = p->id;
4141 return sprintf(buf, "%X\n", UDP->cmos);
4143 DEVICE_ATTR(cmos,S_IRUGO,floppy_cmos_show,NULL);
4145 static void floppy_device_release(struct device *dev)
4147 complete(&device_release);
4150 static struct platform_device floppy_device[N_DRIVE];
4152 static struct kobject *floppy_find(dev_t dev, int *part, void *data)
4154 int drive = (*part & 3) | ((*part & 0x80) >> 5);
4155 if (drive >= N_DRIVE ||
4156 !(allowed_drive_mask & (1 << drive)) ||
4157 fdc_state[FDC(drive)].version == FDC_NONE)
4158 return NULL;
4159 if (((*part >> 2) & 0x1f) >= ARRAY_SIZE(floppy_type))
4160 return NULL;
4161 *part = 0;
4162 return get_disk(disks[drive]);
4165 static int __init floppy_init(void)
4167 int i, unit, drive;
4168 int err, dr;
4170 #if defined(CONFIG_PPC_MERGE)
4171 if (check_legacy_ioport(FDC1))
4172 return -ENODEV;
4173 #endif
4175 raw_cmd = NULL;
4177 for (dr = 0; dr < N_DRIVE; dr++) {
4178 disks[dr] = alloc_disk(1);
4179 if (!disks[dr]) {
4180 err = -ENOMEM;
4181 goto out_put_disk;
4184 disks[dr]->major = FLOPPY_MAJOR;
4185 disks[dr]->first_minor = TOMINOR(dr);
4186 disks[dr]->fops = &floppy_fops;
4187 sprintf(disks[dr]->disk_name, "fd%d", dr);
4189 init_timer(&motor_off_timer[dr]);
4190 motor_off_timer[dr].data = dr;
4191 motor_off_timer[dr].function = motor_off_callback;
4194 err = register_blkdev(FLOPPY_MAJOR, "fd");
4195 if (err)
4196 goto out_put_disk;
4198 floppy_queue = blk_init_queue(do_fd_request, &floppy_lock);
4199 if (!floppy_queue) {
4200 err = -ENOMEM;
4201 goto out_unreg_blkdev;
4203 blk_queue_max_sectors(floppy_queue, 64);
4205 blk_register_region(MKDEV(FLOPPY_MAJOR, 0), 256, THIS_MODULE,
4206 floppy_find, NULL, NULL);
4208 for (i = 0; i < 256; i++)
4209 if (ITYPE(i))
4210 floppy_sizes[i] = floppy_type[ITYPE(i)].size;
4211 else
4212 floppy_sizes[i] = MAX_DISK_SIZE << 1;
4214 reschedule_timeout(MAXTIMEOUT, "floppy init", MAXTIMEOUT);
4215 config_types();
4217 for (i = 0; i < N_FDC; i++) {
4218 fdc = i;
4219 CLEARSTRUCT(FDCS);
4220 FDCS->dtr = -1;
4221 FDCS->dor = 0x4;
4222 #if defined(__sparc__) || defined(__mc68000__)
4223 /*sparcs/sun3x don't have a DOR reset which we can fall back on to */
4224 #ifdef __mc68000__
4225 if (MACH_IS_SUN3X)
4226 #endif
4227 FDCS->version = FDC_82072A;
4228 #endif
4231 use_virtual_dma = can_use_virtual_dma & 1;
4232 fdc_state[0].address = FDC1;
4233 if (fdc_state[0].address == -1) {
4234 del_timer(&fd_timeout);
4235 err = -ENODEV;
4236 goto out_unreg_region;
4238 #if N_FDC > 1
4239 fdc_state[1].address = FDC2;
4240 #endif
4242 fdc = 0; /* reset fdc in case of unexpected interrupt */
4243 err = floppy_grab_irq_and_dma();
4244 if (err) {
4245 del_timer(&fd_timeout);
4246 err = -EBUSY;
4247 goto out_unreg_region;
4250 /* initialise drive state */
4251 for (drive = 0; drive < N_DRIVE; drive++) {
4252 CLEARSTRUCT(UDRS);
4253 CLEARSTRUCT(UDRWE);
4254 USETF(FD_DISK_NEWCHANGE);
4255 USETF(FD_DISK_CHANGED);
4256 USETF(FD_VERIFY);
4257 UDRS->fd_device = -1;
4258 floppy_track_buffer = NULL;
4259 max_buffer_sectors = 0;
4262 * Small 10 msec delay to let through any interrupt that
4263 * initialization might have triggered, to not
4264 * confuse detection:
4266 msleep(10);
4268 for (i = 0; i < N_FDC; i++) {
4269 fdc = i;
4270 FDCS->driver_version = FD_DRIVER_VERSION;
4271 for (unit = 0; unit < 4; unit++)
4272 FDCS->track[unit] = 0;
4273 if (FDCS->address == -1)
4274 continue;
4275 FDCS->rawcmd = 2;
4276 if (user_reset_fdc(-1, FD_RESET_ALWAYS, 0)) {
4277 /* free ioports reserved by floppy_grab_irq_and_dma() */
4278 release_region(FDCS->address + 2, 4);
4279 release_region(FDCS->address + 7, 1);
4280 FDCS->address = -1;
4281 FDCS->version = FDC_NONE;
4282 continue;
4284 /* Try to determine the floppy controller type */
4285 FDCS->version = get_fdc_version();
4286 if (FDCS->version == FDC_NONE) {
4287 /* free ioports reserved by floppy_grab_irq_and_dma() */
4288 release_region(FDCS->address + 2, 4);
4289 release_region(FDCS->address + 7, 1);
4290 FDCS->address = -1;
4291 continue;
4293 if (can_use_virtual_dma == 2 && FDCS->version < FDC_82072A)
4294 can_use_virtual_dma = 0;
4296 have_no_fdc = 0;
4297 /* Not all FDCs seem to be able to handle the version command
4298 * properly, so force a reset for the standard FDC clones,
4299 * to avoid interrupt garbage.
4301 user_reset_fdc(-1, FD_RESET_ALWAYS, 0);
4303 fdc = 0;
4304 del_timer(&fd_timeout);
4305 current_drive = 0;
4306 initialising = 0;
4307 if (have_no_fdc) {
4308 DPRINT("no floppy controllers found\n");
4309 err = have_no_fdc;
4310 goto out_flush_work;
4313 for (drive = 0; drive < N_DRIVE; drive++) {
4314 if (!(allowed_drive_mask & (1 << drive)))
4315 continue;
4316 if (fdc_state[FDC(drive)].version == FDC_NONE)
4317 continue;
4319 floppy_device[drive].name = floppy_device_name;
4320 floppy_device[drive].id = drive;
4321 floppy_device[drive].dev.release = floppy_device_release;
4323 err = platform_device_register(&floppy_device[drive]);
4324 if (err)
4325 goto out_flush_work;
4327 err = device_create_file(&floppy_device[drive].dev,&dev_attr_cmos);
4328 if (err)
4329 goto out_unreg_platform_dev;
4331 /* to be cleaned up... */
4332 disks[drive]->private_data = (void *)(long)drive;
4333 disks[drive]->queue = floppy_queue;
4334 disks[drive]->flags |= GENHD_FL_REMOVABLE;
4335 disks[drive]->driverfs_dev = &floppy_device[drive].dev;
4336 add_disk(disks[drive]);
4339 return 0;
4341 out_unreg_platform_dev:
4342 platform_device_unregister(&floppy_device[drive]);
4343 out_flush_work:
4344 flush_scheduled_work();
4345 if (usage_count)
4346 floppy_release_irq_and_dma();
4347 out_unreg_region:
4348 blk_unregister_region(MKDEV(FLOPPY_MAJOR, 0), 256);
4349 blk_cleanup_queue(floppy_queue);
4350 out_unreg_blkdev:
4351 unregister_blkdev(FLOPPY_MAJOR, "fd");
4352 out_put_disk:
4353 while (dr--) {
4354 del_timer(&motor_off_timer[dr]);
4355 put_disk(disks[dr]);
4357 return err;
4360 static DEFINE_SPINLOCK(floppy_usage_lock);
4362 static int floppy_grab_irq_and_dma(void)
4364 unsigned long flags;
4366 spin_lock_irqsave(&floppy_usage_lock, flags);
4367 if (usage_count++) {
4368 spin_unlock_irqrestore(&floppy_usage_lock, flags);
4369 return 0;
4371 spin_unlock_irqrestore(&floppy_usage_lock, flags);
4374 * We might have scheduled a free_irq(), wait it to
4375 * drain first:
4377 flush_scheduled_work();
4379 if (fd_request_irq()) {
4380 DPRINT("Unable to grab IRQ%d for the floppy driver\n",
4381 FLOPPY_IRQ);
4382 spin_lock_irqsave(&floppy_usage_lock, flags);
4383 usage_count--;
4384 spin_unlock_irqrestore(&floppy_usage_lock, flags);
4385 return -1;
4387 if (fd_request_dma()) {
4388 DPRINT("Unable to grab DMA%d for the floppy driver\n",
4389 FLOPPY_DMA);
4390 if (can_use_virtual_dma & 2)
4391 use_virtual_dma = can_use_virtual_dma = 1;
4392 if (!(can_use_virtual_dma & 1)) {
4393 fd_free_irq();
4394 spin_lock_irqsave(&floppy_usage_lock, flags);
4395 usage_count--;
4396 spin_unlock_irqrestore(&floppy_usage_lock, flags);
4397 return -1;
4401 for (fdc = 0; fdc < N_FDC; fdc++) {
4402 if (FDCS->address != -1) {
4403 if (!request_region(FDCS->address + 2, 4, "floppy")) {
4404 DPRINT("Floppy io-port 0x%04lx in use\n",
4405 FDCS->address + 2);
4406 goto cleanup1;
4408 if (!request_region(FDCS->address + 7, 1, "floppy DIR")) {
4409 DPRINT("Floppy io-port 0x%04lx in use\n",
4410 FDCS->address + 7);
4411 goto cleanup2;
4413 /* address + 6 is reserved, and may be taken by IDE.
4414 * Unfortunately, Adaptec doesn't know this :-(, */
4417 for (fdc = 0; fdc < N_FDC; fdc++) {
4418 if (FDCS->address != -1) {
4419 reset_fdc_info(1);
4420 fd_outb(FDCS->dor, FD_DOR);
4423 fdc = 0;
4424 set_dor(0, ~0, 8); /* avoid immediate interrupt */
4426 for (fdc = 0; fdc < N_FDC; fdc++)
4427 if (FDCS->address != -1)
4428 fd_outb(FDCS->dor, FD_DOR);
4430 * The driver will try and free resources and relies on us
4431 * to know if they were allocated or not.
4433 fdc = 0;
4434 irqdma_allocated = 1;
4435 return 0;
4436 cleanup2:
4437 release_region(FDCS->address + 2, 4);
4438 cleanup1:
4439 fd_free_irq();
4440 fd_free_dma();
4441 while (--fdc >= 0) {
4442 release_region(FDCS->address + 2, 4);
4443 release_region(FDCS->address + 7, 1);
4445 spin_lock_irqsave(&floppy_usage_lock, flags);
4446 usage_count--;
4447 spin_unlock_irqrestore(&floppy_usage_lock, flags);
4448 return -1;
4451 static void floppy_release_irq_and_dma(void)
4453 int old_fdc;
4454 #ifdef FLOPPY_SANITY_CHECK
4455 #ifndef __sparc__
4456 int drive;
4457 #endif
4458 #endif
4459 long tmpsize;
4460 unsigned long tmpaddr;
4461 unsigned long flags;
4463 spin_lock_irqsave(&floppy_usage_lock, flags);
4464 if (--usage_count) {
4465 spin_unlock_irqrestore(&floppy_usage_lock, flags);
4466 return;
4468 spin_unlock_irqrestore(&floppy_usage_lock, flags);
4469 if (irqdma_allocated) {
4470 fd_disable_dma();
4471 fd_free_dma();
4472 fd_free_irq();
4473 irqdma_allocated = 0;
4475 set_dor(0, ~0, 8);
4476 #if N_FDC > 1
4477 set_dor(1, ~8, 0);
4478 #endif
4479 floppy_enable_hlt();
4481 if (floppy_track_buffer && max_buffer_sectors) {
4482 tmpsize = max_buffer_sectors * 1024;
4483 tmpaddr = (unsigned long)floppy_track_buffer;
4484 floppy_track_buffer = NULL;
4485 max_buffer_sectors = 0;
4486 buffer_min = buffer_max = -1;
4487 fd_dma_mem_free(tmpaddr, tmpsize);
4489 #ifdef FLOPPY_SANITY_CHECK
4490 #ifndef __sparc__
4491 for (drive = 0; drive < N_FDC * 4; drive++)
4492 if (timer_pending(motor_off_timer + drive))
4493 printk("motor off timer %d still active\n", drive);
4494 #endif
4496 if (timer_pending(&fd_timeout))
4497 printk("floppy timer still active:%s\n", timeout_message);
4498 if (timer_pending(&fd_timer))
4499 printk("auxiliary floppy timer still active\n");
4500 if (work_pending(&floppy_work))
4501 printk("work still pending\n");
4502 #endif
4503 old_fdc = fdc;
4504 for (fdc = 0; fdc < N_FDC; fdc++)
4505 if (FDCS->address != -1) {
4506 release_region(FDCS->address + 2, 4);
4507 release_region(FDCS->address + 7, 1);
4509 fdc = old_fdc;
4512 #ifdef MODULE
4514 static char *floppy;
4516 static void __init parse_floppy_cfg_string(char *cfg)
4518 char *ptr;
4520 while (*cfg) {
4521 for (ptr = cfg; *cfg && *cfg != ' ' && *cfg != '\t'; cfg++) ;
4522 if (*cfg) {
4523 *cfg = '\0';
4524 cfg++;
4526 if (*ptr)
4527 floppy_setup(ptr);
4531 int __init init_module(void)
4533 if (floppy)
4534 parse_floppy_cfg_string(floppy);
4535 return floppy_init();
4538 void cleanup_module(void)
4540 int drive;
4542 init_completion(&device_release);
4543 blk_unregister_region(MKDEV(FLOPPY_MAJOR, 0), 256);
4544 unregister_blkdev(FLOPPY_MAJOR, "fd");
4546 for (drive = 0; drive < N_DRIVE; drive++) {
4547 del_timer_sync(&motor_off_timer[drive]);
4549 if ((allowed_drive_mask & (1 << drive)) &&
4550 fdc_state[FDC(drive)].version != FDC_NONE) {
4551 del_gendisk(disks[drive]);
4552 device_remove_file(&floppy_device[drive].dev, &dev_attr_cmos);
4553 platform_device_unregister(&floppy_device[drive]);
4555 put_disk(disks[drive]);
4558 del_timer_sync(&fd_timeout);
4559 del_timer_sync(&fd_timer);
4560 blk_cleanup_queue(floppy_queue);
4562 if (usage_count)
4563 floppy_release_irq_and_dma();
4565 /* eject disk, if any */
4566 fd_eject(0);
4568 wait_for_completion(&device_release);
4571 module_param(floppy, charp, 0);
4572 module_param(FLOPPY_IRQ, int, 0);
4573 module_param(FLOPPY_DMA, int, 0);
4574 MODULE_AUTHOR("Alain L. Knaff");
4575 MODULE_SUPPORTED_DEVICE("fd");
4576 MODULE_LICENSE("GPL");
4578 #else
4580 __setup("floppy=", floppy_setup);
4581 module_init(floppy_init)
4582 #endif
4584 MODULE_ALIAS_BLOCKDEV_MAJOR(FLOPPY_MAJOR);