drivers/block/floppy.c: remove macro LOCK_FDC
[linux-2.6/kvm.git] / drivers / block / floppy.c
blob50bd9e9370ddad6a6f404246a09c8425dd0416b6
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/mod_devicetable.h>
181 #include <linux/buffer_head.h> /* for invalidate_buffers() */
182 #include <linux/mutex.h>
183 #include <linux/io.h>
184 #include <linux/uaccess.h>
187 * PS/2 floppies have much slower step rates than regular floppies.
188 * It's been recommended that take about 1/4 of the default speed
189 * in some more extreme cases.
191 static int slow_floppy;
193 #include <asm/dma.h>
194 #include <asm/irq.h>
195 #include <asm/system.h>
197 static int FLOPPY_IRQ = 6;
198 static int FLOPPY_DMA = 2;
199 static int can_use_virtual_dma = 2;
200 /* =======
201 * can use virtual DMA:
202 * 0 = use of virtual DMA disallowed by config
203 * 1 = use of virtual DMA prescribed by config
204 * 2 = no virtual DMA preference configured. By default try hard DMA,
205 * but fall back on virtual DMA when not enough memory available
208 static int use_virtual_dma;
209 /* =======
210 * use virtual DMA
211 * 0 using hard DMA
212 * 1 using virtual DMA
213 * This variable is set to virtual when a DMA mem problem arises, and
214 * reset back in floppy_grab_irq_and_dma.
215 * It is not safe to reset it in other circumstances, because the floppy
216 * driver may have several buffers in use at once, and we do currently not
217 * record each buffers capabilities
220 static DEFINE_SPINLOCK(floppy_lock);
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 pr_info("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))
295 #define DP (&drive_params[current_drive])
296 #define DRS (&drive_state[current_drive])
297 #define DRWE (&write_errors[current_drive])
298 #define FDCS (&fdc_state[fdc])
299 #define CLEARF(x) clear_bit(x##_BIT, &DRS->flags)
300 #define SETF(x) set_bit(x##_BIT, &DRS->flags)
301 #define TESTF(x) test_bit(x##_BIT, &DRS->flags)
303 #define UDP (&drive_params[drive])
304 #define UDRS (&drive_state[drive])
305 #define UDRWE (&write_errors[drive])
306 #define UFDCS (&fdc_state[FDC(drive)])
307 #define UCLEARF(x) clear_bit(x##_BIT, &UDRS->flags)
308 #define USETF(x) set_bit(x##_BIT, &UDRS->flags)
309 #define UTESTF(x) test_bit(x##_BIT, &UDRS->flags)
311 #define DPRINT(format, args...) \
312 pr_info(DEVICE_NAME "%d: " format, current_drive, ##args)
314 #define PH_HEAD(floppy, head) (((((floppy)->stretch & 2) >> 1) ^ head) << 2)
315 #define STRETCH(floppy) ((floppy)->stretch & FD_STRETCH)
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).
338 * This default is used whenever the 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])
358 #define SEL_DLY (2 * HZ / 100)
361 * this struct defines the different floppy drive types.
363 static struct {
364 struct floppy_drive_params params;
365 const char *name; /* name printed while booting */
366 } default_drive_params[] = {
367 /* NOTE: the time values in jiffies should be in msec!
368 CMOS drive type
369 | Maximum data rate supported by drive type
370 | | Head load time, msec
371 | | | Head unload time, msec (not used)
372 | | | | Step rate interval, usec
373 | | | | | Time needed for spinup time (jiffies)
374 | | | | | | Timeout for spinning down (jiffies)
375 | | | | | | | Spindown offset (where disk stops)
376 | | | | | | | | Select delay
377 | | | | | | | | | RPS
378 | | | | | | | | | | Max number of tracks
379 | | | | | | | | | | | Interrupt timeout
380 | | | | | | | | | | | | Max nonintlv. sectors
381 | | | | | | | | | | | | | -Max Errors- flags */
382 {{0, 500, 16, 16, 8000, 1*HZ, 3*HZ, 0, SEL_DLY, 5, 80, 3*HZ, 20, {3,1,2,0,2}, 0,
383 0, { 7, 4, 8, 2, 1, 5, 3,10}, 3*HZ/2, 0 }, "unknown" },
385 {{1, 300, 16, 16, 8000, 1*HZ, 3*HZ, 0, SEL_DLY, 5, 40, 3*HZ, 17, {3,1,2,0,2}, 0,
386 0, { 1, 0, 0, 0, 0, 0, 0, 0}, 3*HZ/2, 1 }, "360K PC" }, /*5 1/4 360 KB PC*/
388 {{2, 500, 16, 16, 6000, 4*HZ/10, 3*HZ, 14, SEL_DLY, 6, 83, 3*HZ, 17, {3,1,2,0,2}, 0,
389 0, { 2, 5, 6,23,10,20,12, 0}, 3*HZ/2, 2 }, "1.2M" }, /*5 1/4 HD AT*/
391 {{3, 250, 16, 16, 3000, 1*HZ, 3*HZ, 0, SEL_DLY, 5, 83, 3*HZ, 20, {3,1,2,0,2}, 0,
392 0, { 4,22,21,30, 3, 0, 0, 0}, 3*HZ/2, 4 }, "720k" }, /*3 1/2 DD*/
394 {{4, 500, 16, 16, 4000, 4*HZ/10, 3*HZ, 10, SEL_DLY, 5, 83, 3*HZ, 20, {3,1,2,0,2}, 0,
395 0, { 7, 4,25,22,31,21,29,11}, 3*HZ/2, 7 }, "1.44M" }, /*3 1/2 HD*/
397 {{5, 1000, 15, 8, 3000, 4*HZ/10, 3*HZ, 10, SEL_DLY, 5, 83, 3*HZ, 40, {3,1,2,0,2}, 0,
398 0, { 7, 8, 4,25,28,22,31,21}, 3*HZ/2, 8 }, "2.88M AMI BIOS" }, /*3 1/2 ED*/
400 {{6, 1000, 15, 8, 3000, 4*HZ/10, 3*HZ, 10, SEL_DLY, 5, 83, 3*HZ, 40, {3,1,2,0,2}, 0,
401 0, { 7, 8, 4,25,28,22,31,21}, 3*HZ/2, 8 }, "2.88M" } /*3 1/2 ED*/
402 /* | --autodetected formats--- | | |
403 * read_track | | Name printed when booting
404 * | Native format
405 * Frequency of disk change checks */
408 static struct floppy_drive_params drive_params[N_DRIVE];
409 static struct floppy_drive_struct drive_state[N_DRIVE];
410 static struct floppy_write_errors write_errors[N_DRIVE];
411 static struct timer_list motor_off_timer[N_DRIVE];
412 static struct gendisk *disks[N_DRIVE];
413 static struct block_device *opened_bdev[N_DRIVE];
414 static DEFINE_MUTEX(open_lock);
415 static struct floppy_raw_cmd *raw_cmd, default_raw_cmd;
418 * This struct defines the different floppy types.
420 * Bit 0 of 'stretch' tells if the tracks need to be doubled for some
421 * types (e.g. 360kB diskette in 1.2MB drive, etc.). Bit 1 of 'stretch'
422 * tells if the disk is in Commodore 1581 format, which means side 0 sectors
423 * are located on side 1 of the disk but with a side 0 ID, and vice-versa.
424 * This is the same as the Sharp MZ-80 5.25" CP/M disk format, except that the
425 * 1581's logical side 0 is on physical side 1, whereas the Sharp's logical
426 * side 0 is on physical side 0 (but with the misnamed sector IDs).
427 * 'stretch' should probably be renamed to something more general, like
428 * 'options'.
430 * Bits 2 through 9 of 'stretch' tell the number of the first sector.
431 * The LSB (bit 2) is flipped. For most disks, the first sector
432 * is 1 (represented by 0x00<<2). For some CP/M and music sampler
433 * disks (such as Ensoniq EPS 16plus) it is 0 (represented as 0x01<<2).
434 * For Amstrad CPC disks it is 0xC1 (represented as 0xC0<<2).
436 * Other parameters should be self-explanatory (see also setfdprm(8)).
439 Size
440 | Sectors per track
441 | | Head
442 | | | Tracks
443 | | | | Stretch
444 | | | | | Gap 1 size
445 | | | | | | Data rate, | 0x40 for perp
446 | | | | | | | Spec1 (stepping rate, head unload
447 | | | | | | | | /fmt gap (gap2) */
448 static struct floppy_struct floppy_type[32] = {
449 { 0, 0,0, 0,0,0x00,0x00,0x00,0x00,NULL }, /* 0 no testing */
450 { 720, 9,2,40,0,0x2A,0x02,0xDF,0x50,"d360" }, /* 1 360KB PC */
451 { 2400,15,2,80,0,0x1B,0x00,0xDF,0x54,"h1200" }, /* 2 1.2MB AT */
452 { 720, 9,1,80,0,0x2A,0x02,0xDF,0x50,"D360" }, /* 3 360KB SS 3.5" */
453 { 1440, 9,2,80,0,0x2A,0x02,0xDF,0x50,"D720" }, /* 4 720KB 3.5" */
454 { 720, 9,2,40,1,0x23,0x01,0xDF,0x50,"h360" }, /* 5 360KB AT */
455 { 1440, 9,2,80,0,0x23,0x01,0xDF,0x50,"h720" }, /* 6 720KB AT */
456 { 2880,18,2,80,0,0x1B,0x00,0xCF,0x6C,"H1440" }, /* 7 1.44MB 3.5" */
457 { 5760,36,2,80,0,0x1B,0x43,0xAF,0x54,"E2880" }, /* 8 2.88MB 3.5" */
458 { 6240,39,2,80,0,0x1B,0x43,0xAF,0x28,"E3120" }, /* 9 3.12MB 3.5" */
460 { 2880,18,2,80,0,0x25,0x00,0xDF,0x02,"h1440" }, /* 10 1.44MB 5.25" */
461 { 3360,21,2,80,0,0x1C,0x00,0xCF,0x0C,"H1680" }, /* 11 1.68MB 3.5" */
462 { 820,10,2,41,1,0x25,0x01,0xDF,0x2E,"h410" }, /* 12 410KB 5.25" */
463 { 1640,10,2,82,0,0x25,0x02,0xDF,0x2E,"H820" }, /* 13 820KB 3.5" */
464 { 2952,18,2,82,0,0x25,0x00,0xDF,0x02,"h1476" }, /* 14 1.48MB 5.25" */
465 { 3444,21,2,82,0,0x25,0x00,0xDF,0x0C,"H1722" }, /* 15 1.72MB 3.5" */
466 { 840,10,2,42,1,0x25,0x01,0xDF,0x2E,"h420" }, /* 16 420KB 5.25" */
467 { 1660,10,2,83,0,0x25,0x02,0xDF,0x2E,"H830" }, /* 17 830KB 3.5" */
468 { 2988,18,2,83,0,0x25,0x00,0xDF,0x02,"h1494" }, /* 18 1.49MB 5.25" */
469 { 3486,21,2,83,0,0x25,0x00,0xDF,0x0C,"H1743" }, /* 19 1.74 MB 3.5" */
471 { 1760,11,2,80,0,0x1C,0x09,0xCF,0x00,"h880" }, /* 20 880KB 5.25" */
472 { 2080,13,2,80,0,0x1C,0x01,0xCF,0x00,"D1040" }, /* 21 1.04MB 3.5" */
473 { 2240,14,2,80,0,0x1C,0x19,0xCF,0x00,"D1120" }, /* 22 1.12MB 3.5" */
474 { 3200,20,2,80,0,0x1C,0x20,0xCF,0x2C,"h1600" }, /* 23 1.6MB 5.25" */
475 { 3520,22,2,80,0,0x1C,0x08,0xCF,0x2e,"H1760" }, /* 24 1.76MB 3.5" */
476 { 3840,24,2,80,0,0x1C,0x20,0xCF,0x00,"H1920" }, /* 25 1.92MB 3.5" */
477 { 6400,40,2,80,0,0x25,0x5B,0xCF,0x00,"E3200" }, /* 26 3.20MB 3.5" */
478 { 7040,44,2,80,0,0x25,0x5B,0xCF,0x00,"E3520" }, /* 27 3.52MB 3.5" */
479 { 7680,48,2,80,0,0x25,0x63,0xCF,0x00,"E3840" }, /* 28 3.84MB 3.5" */
480 { 3680,23,2,80,0,0x1C,0x10,0xCF,0x00,"H1840" }, /* 29 1.84MB 3.5" */
482 { 1600,10,2,80,0,0x25,0x02,0xDF,0x2E,"D800" }, /* 30 800KB 3.5" */
483 { 3200,20,2,80,0,0x1C,0x00,0xCF,0x2C,"H1600" }, /* 31 1.6MB 3.5" */
486 #define SECTSIZE (_FD_SECTSIZE(*floppy))
488 /* Auto-detection: Disk type used until the next media change occurs. */
489 static struct floppy_struct *current_type[N_DRIVE];
492 * User-provided type information. current_type points to
493 * the respective entry of this array.
495 static struct floppy_struct user_params[N_DRIVE];
497 static sector_t floppy_sizes[256];
499 static char floppy_device_name[] = "floppy";
502 * The driver is trying to determine the correct media format
503 * while probing is set. rw_interrupt() clears it after a
504 * successful access.
506 static int probing;
508 /* Synchronization of FDC access. */
509 #define FD_COMMAND_NONE -1
510 #define FD_COMMAND_ERROR 2
511 #define FD_COMMAND_OKAY 3
513 static volatile int command_status = FD_COMMAND_NONE;
514 static unsigned long fdc_busy;
515 static DECLARE_WAIT_QUEUE_HEAD(fdc_wait);
516 static DECLARE_WAIT_QUEUE_HEAD(command_done);
518 #define NO_SIGNAL (!interruptible || !signal_pending(current))
519 #define CALL(x) if ((x) == -EINTR) return -EINTR
520 #define ECALL(x) if ((ret = (x))) return ret;
521 #define _WAIT(x,i) CALL(ret=wait_til_done((x),i))
522 #define WAIT(x) _WAIT((x),interruptible)
523 #define IWAIT(x) _WAIT((x),1)
525 /* Errors during formatting are counted here. */
526 static int format_errors;
528 /* Format request descriptor. */
529 static struct format_descr format_req;
532 * Rate is 0 for 500kb/s, 1 for 300kbps, 2 for 250kbps
533 * Spec1 is 0xSH, where S is stepping rate (F=1ms, E=2ms, D=3ms etc),
534 * H is head unload time (1=16ms, 2=32ms, etc)
538 * Track buffer
539 * Because these are written to by the DMA controller, they must
540 * not contain a 64k byte boundary crossing, or data will be
541 * corrupted/lost.
543 static char *floppy_track_buffer;
544 static int max_buffer_sectors;
546 static int *errors;
547 typedef void (*done_f)(int);
548 static struct cont_t {
549 void (*interrupt)(void);
550 /* this is called after the interrupt of the
551 * main command */
552 void (*redo)(void); /* this is called to retry the operation */
553 void (*error)(void); /* this is called to tally an error */
554 done_f done; /* this is called to say if the operation has
555 * succeeded/failed */
556 } *cont;
558 static void floppy_ready(void);
559 static void floppy_start(void);
560 static void process_fd_request(void);
561 static void recalibrate_floppy(void);
562 static void floppy_shutdown(unsigned long);
564 static int floppy_request_regions(int);
565 static void floppy_release_regions(int);
566 static int floppy_grab_irq_and_dma(void);
567 static void floppy_release_irq_and_dma(void);
570 * The "reset" variable should be tested whenever an interrupt is scheduled,
571 * after the commands have been sent. This is to ensure that the driver doesn't
572 * get wedged when the interrupt doesn't come because of a failed command.
573 * reset doesn't need to be tested before sending commands, because
574 * output_byte is automatically disabled when reset is set.
576 static void reset_fdc(void);
579 * These are global variables, as that's the easiest way to give
580 * information to interrupts. They are the data used for the current
581 * request.
583 #define NO_TRACK -1
584 #define NEED_1_RECAL -2
585 #define NEED_2_RECAL -3
587 static int usage_count;
589 /* buffer related variables */
590 static int buffer_track = -1;
591 static int buffer_drive = -1;
592 static int buffer_min = -1;
593 static int buffer_max = -1;
595 /* fdc related variables, should end up in a struct */
596 static struct floppy_fdc_state fdc_state[N_FDC];
597 static int fdc; /* current fdc */
599 static struct floppy_struct *_floppy = floppy_type;
600 static unsigned char current_drive;
601 static long current_count_sectors;
602 static unsigned char fsector_t; /* sector in track */
603 static unsigned char in_sector_offset; /* offset within physical sector,
604 * expressed in units of 512 bytes */
606 #ifndef fd_eject
607 static inline int fd_eject(int drive)
609 return -EINVAL;
611 #endif
614 * Debugging
615 * =========
617 #ifdef DEBUGT
618 static long unsigned debugtimer;
620 static inline void set_debugt(void)
622 debugtimer = jiffies;
625 static inline void debugt(const char *message)
627 if (DP->flags & DEBUGT)
628 pr_info("%s dtime=%lu\n", message, jiffies - debugtimer);
630 #else
631 static inline void set_debugt(void) { }
632 static inline void debugt(const char *message) { }
633 #endif /* DEBUGT */
635 typedef void (*timeout_fn)(unsigned long);
636 static DEFINE_TIMER(fd_timeout, floppy_shutdown, 0, 0);
638 static const char *timeout_message;
640 #ifdef FLOPPY_SANITY_CHECK
641 static void is_alive(const char *message)
643 /* this routine checks whether the floppy driver is "alive" */
644 if (test_bit(0, &fdc_busy) && command_status < 2
645 && !timer_pending(&fd_timeout)) {
646 DPRINT("timeout handler died: %s\n", message);
649 #endif
651 static void (*do_floppy)(void) = NULL;
653 #ifdef FLOPPY_SANITY_CHECK
655 #define OLOGSIZE 20
657 static void (*lasthandler)(void);
658 static unsigned long interruptjiffies;
659 static unsigned long resultjiffies;
660 static int resultsize;
661 static unsigned long lastredo;
663 static struct output_log {
664 unsigned char data;
665 unsigned char status;
666 unsigned long jiffies;
667 } output_log[OLOGSIZE];
669 static int output_log_pos;
670 #endif
672 #define current_reqD -1
673 #define MAXTIMEOUT -2
675 static void __reschedule_timeout(int drive, const char *message, int marg)
677 if (drive == current_reqD)
678 drive = current_drive;
679 del_timer(&fd_timeout);
680 if (drive < 0 || drive >= N_DRIVE) {
681 fd_timeout.expires = jiffies + 20UL * HZ;
682 drive = 0;
683 } else
684 fd_timeout.expires = jiffies + UDP->timeout;
685 add_timer(&fd_timeout);
686 if (UDP->flags & FD_DEBUG)
687 DPRINT("reschedule timeout %s %d\n", message, marg);
688 timeout_message = message;
691 static void reschedule_timeout(int drive, const char *message, int marg)
693 unsigned long flags;
695 spin_lock_irqsave(&floppy_lock, flags);
696 __reschedule_timeout(drive, message, marg);
697 spin_unlock_irqrestore(&floppy_lock, flags);
700 #define INFBOUND(a, b) (a) = max_t(int, a, b)
701 #define SUPBOUND(a, b) (a) = min_t(int, a, b)
704 * Bottom half floppy driver.
705 * ==========================
707 * This part of the file contains the code talking directly to the hardware,
708 * and also the main service loop (seek-configure-spinup-command)
712 * disk change.
713 * This routine is responsible for maintaining the FD_DISK_CHANGE flag,
714 * and the last_checked date.
716 * last_checked is the date of the last check which showed 'no disk change'
717 * FD_DISK_CHANGE is set under two conditions:
718 * 1. The floppy has been changed after some i/o to that floppy already
719 * took place.
720 * 2. No floppy disk is in the drive. This is done in order to ensure that
721 * requests are quickly flushed in case there is no disk in the drive. It
722 * follows that FD_DISK_CHANGE can only be cleared if there is a disk in
723 * the drive.
725 * For 1., maxblock is observed. Maxblock is 0 if no i/o has taken place yet.
726 * For 2., FD_DISK_NEWCHANGE is watched. FD_DISK_NEWCHANGE is cleared on
727 * each seek. If a disk is present, the disk change line should also be
728 * cleared on each seek. Thus, if FD_DISK_NEWCHANGE is clear, but the disk
729 * change line is set, this means either that no disk is in the drive, or
730 * that it has been removed since the last seek.
732 * This means that we really have a third possibility too:
733 * The floppy has been changed after the last seek.
736 static int disk_change(int drive)
738 int fdc = FDC(drive);
740 #ifdef FLOPPY_SANITY_CHECK
741 if (time_before(jiffies, UDRS->select_date + UDP->select_delay))
742 DPRINT("WARNING disk change called early\n");
743 if (!(FDCS->dor & (0x10 << UNIT(drive))) ||
744 (FDCS->dor & 3) != UNIT(drive) || fdc != FDC(drive)) {
745 DPRINT("probing disk change on unselected drive\n");
746 DPRINT("drive=%d fdc=%d dor=%x\n", drive, FDC(drive),
747 (unsigned int)FDCS->dor);
749 #endif
751 #ifdef DCL_DEBUG
752 if (UDP->flags & FD_DEBUG) {
753 DPRINT("checking disk change line for drive %d\n", drive);
754 DPRINT("jiffies=%lu\n", jiffies);
755 DPRINT("disk change line=%x\n", fd_inb(FD_DIR) & 0x80);
756 DPRINT("flags=%lx\n", UDRS->flags);
758 #endif
759 if (UDP->flags & FD_BROKEN_DCL)
760 return UTESTF(FD_DISK_CHANGED);
761 if ((fd_inb(FD_DIR) ^ UDP->flags) & 0x80) {
762 USETF(FD_VERIFY); /* verify write protection */
763 if (UDRS->maxblock) {
764 /* mark it changed */
765 USETF(FD_DISK_CHANGED);
768 /* invalidate its geometry */
769 if (UDRS->keep_data >= 0) {
770 if ((UDP->flags & FTD_MSG) &&
771 current_type[drive] != NULL)
772 DPRINT("Disk type is undefined after "
773 "disk change\n");
774 current_type[drive] = NULL;
775 floppy_sizes[TOMINOR(drive)] = MAX_DISK_SIZE << 1;
778 return 1;
779 } else {
780 UDRS->last_checked = jiffies;
781 UCLEARF(FD_DISK_NEWCHANGE);
783 return 0;
786 static inline int is_selected(int dor, int unit)
788 return ((dor & (0x10 << unit)) && (dor & 3) == unit);
791 static int set_dor(int fdc, char mask, char data)
793 unsigned char unit;
794 unsigned char drive;
795 unsigned char newdor;
796 unsigned char olddor;
798 if (FDCS->address == -1)
799 return -1;
801 olddor = FDCS->dor;
802 newdor = (olddor & mask) | data;
803 if (newdor != olddor) {
804 unit = olddor & 0x3;
805 if (is_selected(olddor, unit) && !is_selected(newdor, unit)) {
806 drive = REVDRIVE(fdc, unit);
807 #ifdef DCL_DEBUG
808 if (UDP->flags & FD_DEBUG)
809 DPRINT("calling disk change from set_dor\n");
810 #endif
811 disk_change(drive);
813 FDCS->dor = newdor;
814 fd_outb(newdor, FD_DOR);
816 unit = newdor & 0x3;
817 if (!is_selected(olddor, unit) && is_selected(newdor, unit)) {
818 drive = REVDRIVE(fdc, unit);
819 UDRS->select_date = jiffies;
822 return olddor;
825 static void twaddle(void)
827 if (DP->select_delay)
828 return;
829 fd_outb(FDCS->dor & ~(0x10 << UNIT(current_drive)), FD_DOR);
830 fd_outb(FDCS->dor, FD_DOR);
831 DRS->select_date = jiffies;
834 /* reset all driver information about the current fdc. This is needed after
835 * a reset, and after a raw command. */
836 static void reset_fdc_info(int mode)
838 int drive;
840 FDCS->spec1 = FDCS->spec2 = -1;
841 FDCS->need_configure = 1;
842 FDCS->perp_mode = 1;
843 FDCS->rawcmd = 0;
844 for (drive = 0; drive < N_DRIVE; drive++)
845 if (FDC(drive) == fdc && (mode || UDRS->track != NEED_1_RECAL))
846 UDRS->track = NEED_2_RECAL;
849 /* selects the fdc and drive, and enables the fdc's input/dma. */
850 static void set_fdc(int drive)
852 if (drive >= 0 && drive < N_DRIVE) {
853 fdc = FDC(drive);
854 current_drive = drive;
856 if (fdc != 1 && fdc != 0) {
857 pr_info("bad fdc value\n");
858 return;
860 set_dor(fdc, ~0, 8);
861 #if N_FDC > 1
862 set_dor(1 - fdc, ~8, 0);
863 #endif
864 if (FDCS->rawcmd == 2)
865 reset_fdc_info(1);
866 if (fd_inb(FD_STATUS) != STATUS_READY)
867 FDCS->reset = 1;
870 /* locks the driver */
871 static int _lock_fdc(int drive, int interruptible, int line)
873 if (!usage_count) {
874 pr_err("Trying to lock fdc while usage count=0 at line %d\n",
875 line);
876 return -1;
879 if (test_and_set_bit(0, &fdc_busy)) {
880 DECLARE_WAITQUEUE(wait, current);
881 add_wait_queue(&fdc_wait, &wait);
883 for (;;) {
884 set_current_state(TASK_INTERRUPTIBLE);
886 if (!test_and_set_bit(0, &fdc_busy))
887 break;
889 schedule();
891 if (!NO_SIGNAL) {
892 remove_wait_queue(&fdc_wait, &wait);
893 return -EINTR;
897 set_current_state(TASK_RUNNING);
898 remove_wait_queue(&fdc_wait, &wait);
899 flush_scheduled_work();
901 command_status = FD_COMMAND_NONE;
903 __reschedule_timeout(drive, "lock fdc", 0);
904 set_fdc(drive);
905 return 0;
908 #define lock_fdc(drive, interruptible) \
909 _lock_fdc(drive, interruptible, __LINE__)
911 /* unlocks the driver */
912 static inline void unlock_fdc(void)
914 unsigned long flags;
916 raw_cmd = NULL;
917 if (!test_bit(0, &fdc_busy))
918 DPRINT("FDC access conflict!\n");
920 if (do_floppy)
921 DPRINT("device interrupt still active at FDC release: %p!\n",
922 do_floppy);
923 command_status = FD_COMMAND_NONE;
924 spin_lock_irqsave(&floppy_lock, flags);
925 del_timer(&fd_timeout);
926 cont = NULL;
927 clear_bit(0, &fdc_busy);
928 if (current_req || blk_peek_request(floppy_queue))
929 do_fd_request(floppy_queue);
930 spin_unlock_irqrestore(&floppy_lock, flags);
931 wake_up(&fdc_wait);
934 /* switches the motor off after a given timeout */
935 static void motor_off_callback(unsigned long nr)
937 unsigned char mask = ~(0x10 << UNIT(nr));
939 set_dor(FDC(nr), mask, 0);
942 /* schedules motor off */
943 static void floppy_off(unsigned int drive)
945 unsigned long volatile delta;
946 int fdc = FDC(drive);
948 if (!(FDCS->dor & (0x10 << UNIT(drive))))
949 return;
951 del_timer(motor_off_timer + drive);
953 /* make spindle stop in a position which minimizes spinup time
954 * next time */
955 if (UDP->rps) {
956 delta = jiffies - UDRS->first_read_date + HZ -
957 UDP->spindown_offset;
958 delta = ((delta * UDP->rps) % HZ) / UDP->rps;
959 motor_off_timer[drive].expires =
960 jiffies + UDP->spindown - delta;
962 add_timer(motor_off_timer + drive);
966 * cycle through all N_DRIVE floppy drives, for disk change testing.
967 * stopping at current drive. This is done before any long operation, to
968 * be sure to have up to date disk change information.
970 static void scandrives(void)
972 int i;
973 int drive;
974 int saved_drive;
976 if (DP->select_delay)
977 return;
979 saved_drive = current_drive;
980 for (i = 0; i < N_DRIVE; i++) {
981 drive = (saved_drive + i + 1) % N_DRIVE;
982 if (UDRS->fd_ref == 0 || UDP->select_delay != 0)
983 continue; /* skip closed drives */
984 set_fdc(drive);
985 if (!(set_dor(fdc, ~3, UNIT(drive) | (0x10 << UNIT(drive))) &
986 (0x10 << UNIT(drive))))
987 /* switch the motor off again, if it was off to
988 * begin with */
989 set_dor(fdc, ~(0x10 << UNIT(drive)), 0);
991 set_fdc(saved_drive);
994 static void empty(void)
998 static DECLARE_WORK(floppy_work, NULL);
1000 static void schedule_bh(void (*handler)(void))
1002 PREPARE_WORK(&floppy_work, (work_func_t)handler);
1003 schedule_work(&floppy_work);
1006 static DEFINE_TIMER(fd_timer, NULL, 0, 0);
1008 static void cancel_activity(void)
1010 unsigned long flags;
1012 spin_lock_irqsave(&floppy_lock, flags);
1013 do_floppy = NULL;
1014 PREPARE_WORK(&floppy_work, (work_func_t)empty);
1015 del_timer(&fd_timer);
1016 spin_unlock_irqrestore(&floppy_lock, flags);
1019 /* this function makes sure that the disk stays in the drive during the
1020 * transfer */
1021 static void fd_watchdog(void)
1023 #ifdef DCL_DEBUG
1024 if (DP->flags & FD_DEBUG)
1025 DPRINT("calling disk change from watchdog\n");
1026 #endif
1028 if (disk_change(current_drive)) {
1029 DPRINT("disk removed during i/o\n");
1030 cancel_activity();
1031 cont->done(0);
1032 reset_fdc();
1033 } else {
1034 del_timer(&fd_timer);
1035 fd_timer.function = (timeout_fn)fd_watchdog;
1036 fd_timer.expires = jiffies + HZ / 10;
1037 add_timer(&fd_timer);
1041 static void main_command_interrupt(void)
1043 del_timer(&fd_timer);
1044 cont->interrupt();
1047 /* waits for a delay (spinup or select) to pass */
1048 static int fd_wait_for_completion(unsigned long delay, timeout_fn function)
1050 if (FDCS->reset) {
1051 reset_fdc(); /* do the reset during sleep to win time
1052 * if we don't need to sleep, it's a good
1053 * occasion anyways */
1054 return 1;
1057 if (time_before(jiffies, delay)) {
1058 del_timer(&fd_timer);
1059 fd_timer.function = function;
1060 fd_timer.expires = delay;
1061 add_timer(&fd_timer);
1062 return 1;
1064 return 0;
1067 static DEFINE_SPINLOCK(floppy_hlt_lock);
1068 static int hlt_disabled;
1069 static void floppy_disable_hlt(void)
1071 unsigned long flags;
1073 spin_lock_irqsave(&floppy_hlt_lock, flags);
1074 if (!hlt_disabled) {
1075 hlt_disabled = 1;
1076 #ifdef HAVE_DISABLE_HLT
1077 disable_hlt();
1078 #endif
1080 spin_unlock_irqrestore(&floppy_hlt_lock, flags);
1083 static void floppy_enable_hlt(void)
1085 unsigned long flags;
1087 spin_lock_irqsave(&floppy_hlt_lock, flags);
1088 if (hlt_disabled) {
1089 hlt_disabled = 0;
1090 #ifdef HAVE_DISABLE_HLT
1091 enable_hlt();
1092 #endif
1094 spin_unlock_irqrestore(&floppy_hlt_lock, flags);
1097 static void setup_DMA(void)
1099 unsigned long f;
1101 #ifdef FLOPPY_SANITY_CHECK
1102 if (raw_cmd->length == 0) {
1103 int i;
1105 pr_info("zero dma transfer size:");
1106 for (i = 0; i < raw_cmd->cmd_count; i++)
1107 pr_cont("%x,", raw_cmd->cmd[i]);
1108 pr_cont("\n");
1109 cont->done(0);
1110 FDCS->reset = 1;
1111 return;
1113 if (((unsigned long)raw_cmd->kernel_data) % 512) {
1114 pr_info("non aligned address: %p\n", raw_cmd->kernel_data);
1115 cont->done(0);
1116 FDCS->reset = 1;
1117 return;
1119 #endif
1120 f = claim_dma_lock();
1121 fd_disable_dma();
1122 #ifdef fd_dma_setup
1123 if (fd_dma_setup(raw_cmd->kernel_data, raw_cmd->length,
1124 (raw_cmd->flags & FD_RAW_READ) ?
1125 DMA_MODE_READ : DMA_MODE_WRITE, FDCS->address) < 0) {
1126 release_dma_lock(f);
1127 cont->done(0);
1128 FDCS->reset = 1;
1129 return;
1131 release_dma_lock(f);
1132 #else
1133 fd_clear_dma_ff();
1134 fd_cacheflush(raw_cmd->kernel_data, raw_cmd->length);
1135 fd_set_dma_mode((raw_cmd->flags & FD_RAW_READ) ?
1136 DMA_MODE_READ : DMA_MODE_WRITE);
1137 fd_set_dma_addr(raw_cmd->kernel_data);
1138 fd_set_dma_count(raw_cmd->length);
1139 virtual_dma_port = FDCS->address;
1140 fd_enable_dma();
1141 release_dma_lock(f);
1142 #endif
1143 floppy_disable_hlt();
1146 static void show_floppy(void);
1148 /* waits until the fdc becomes ready */
1149 static int wait_til_ready(void)
1151 int status;
1152 int counter;
1154 if (FDCS->reset)
1155 return -1;
1156 for (counter = 0; counter < 10000; counter++) {
1157 status = fd_inb(FD_STATUS);
1158 if (status & STATUS_READY)
1159 return status;
1161 if (!initialising) {
1162 DPRINT("Getstatus times out (%x) on fdc %d\n", status, fdc);
1163 show_floppy();
1165 FDCS->reset = 1;
1166 return -1;
1169 /* sends a command byte to the fdc */
1170 static int output_byte(char byte)
1172 int status = wait_til_ready();
1174 if (status < 0)
1175 return -1;
1176 if ((status & (STATUS_READY | STATUS_DIR | STATUS_DMA)) == STATUS_READY) {
1177 fd_outb(byte, FD_DATA);
1178 #ifdef FLOPPY_SANITY_CHECK
1179 output_log[output_log_pos].data = byte;
1180 output_log[output_log_pos].status = status;
1181 output_log[output_log_pos].jiffies = jiffies;
1182 output_log_pos = (output_log_pos + 1) % OLOGSIZE;
1183 #endif
1184 return 0;
1186 FDCS->reset = 1;
1187 if (!initialising) {
1188 DPRINT("Unable to send byte %x to FDC. Fdc=%x Status=%x\n",
1189 byte, fdc, status);
1190 show_floppy();
1192 return -1;
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 status = wait_til_ready();
1203 if (status < 0)
1204 break;
1205 status &= STATUS_DIR | STATUS_READY | STATUS_BUSY | STATUS_DMA;
1206 if ((status & ~STATUS_BUSY) == STATUS_READY) {
1207 #ifdef FLOPPY_SANITY_CHECK
1208 resultjiffies = jiffies;
1209 resultsize = i;
1210 #endif
1211 return i;
1213 if (status == (STATUS_DIR | STATUS_READY | STATUS_BUSY))
1214 reply_buffer[i] = fd_inb(FD_DATA);
1215 else
1216 break;
1218 if (!initialising) {
1219 DPRINT
1220 ("get result error. Fdc=%d Last status=%x Read bytes=%d\n",
1221 fdc, status, i);
1222 show_floppy();
1224 FDCS->reset = 1;
1225 return -1;
1228 #define MORE_OUTPUT -2
1229 /* does the fdc need more output? */
1230 static int need_more_output(void)
1232 int status = wait_til_ready();
1234 if (status < 0)
1235 return -1;
1236 if ((status & (STATUS_READY | STATUS_DIR | STATUS_DMA)) == STATUS_READY)
1237 return MORE_OUTPUT;
1238 return result();
1241 /* Set perpendicular mode as required, based on data rate, if supported.
1242 * 82077 Now tested. 1Mbps data rate only possible with 82077-1.
1244 static inline void perpendicular_mode(void)
1246 unsigned char perp_mode;
1248 if (raw_cmd->rate & 0x40) {
1249 switch (raw_cmd->rate & 3) {
1250 case 0:
1251 perp_mode = 2;
1252 break;
1253 case 3:
1254 perp_mode = 3;
1255 break;
1256 default:
1257 DPRINT("Invalid data rate for perpendicular mode!\n");
1258 cont->done(0);
1259 FDCS->reset = 1;
1261 * convenient way to return to
1262 * redo without too much hassle
1263 * (deep stack et al.)
1265 return;
1267 } else
1268 perp_mode = 0;
1270 if (FDCS->perp_mode == perp_mode)
1271 return;
1272 if (FDCS->version >= FDC_82077_ORIG) {
1273 output_byte(FD_PERPENDICULAR);
1274 output_byte(perp_mode);
1275 FDCS->perp_mode = perp_mode;
1276 } else if (perp_mode) {
1277 DPRINT("perpendicular mode not supported by this FDC.\n");
1279 } /* perpendicular_mode */
1281 static int fifo_depth = 0xa;
1282 static int no_fifo;
1284 static int fdc_configure(void)
1286 /* Turn on FIFO */
1287 output_byte(FD_CONFIGURE);
1288 if (need_more_output() != MORE_OUTPUT)
1289 return 0;
1290 output_byte(0);
1291 output_byte(0x10 | (no_fifo & 0x20) | (fifo_depth & 0xf));
1292 output_byte(0); /* pre-compensation from track
1293 0 upwards */
1294 return 1;
1297 #define NOMINAL_DTR 500
1299 /* Issue a "SPECIFY" command to set the step rate time, head unload time,
1300 * head load time, and DMA disable flag to values needed by floppy.
1302 * The value "dtr" is the data transfer rate in Kbps. It is needed
1303 * to account for the data rate-based scaling done by the 82072 and 82077
1304 * FDC types. This parameter is ignored for other types of FDCs (i.e.
1305 * 8272a).
1307 * Note that changing the data transfer rate has a (probably deleterious)
1308 * effect on the parameters subject to scaling for 82072/82077 FDCs, so
1309 * fdc_specify is called again after each data transfer rate
1310 * change.
1312 * srt: 1000 to 16000 in microseconds
1313 * hut: 16 to 240 milliseconds
1314 * hlt: 2 to 254 milliseconds
1316 * These values are rounded up to the next highest available delay time.
1318 static void fdc_specify(void)
1320 unsigned char spec1;
1321 unsigned char spec2;
1322 unsigned long srt;
1323 unsigned long hlt;
1324 unsigned long hut;
1325 unsigned long dtr = NOMINAL_DTR;
1326 unsigned long scale_dtr = NOMINAL_DTR;
1327 int hlt_max_code = 0x7f;
1328 int hut_max_code = 0xf;
1330 if (FDCS->need_configure && FDCS->version >= FDC_82072A) {
1331 fdc_configure();
1332 FDCS->need_configure = 0;
1335 switch (raw_cmd->rate & 0x03) {
1336 case 3:
1337 dtr = 1000;
1338 break;
1339 case 1:
1340 dtr = 300;
1341 if (FDCS->version >= FDC_82078) {
1342 /* chose the default rate table, not the one
1343 * where 1 = 2 Mbps */
1344 output_byte(FD_DRIVESPEC);
1345 if (need_more_output() == MORE_OUTPUT) {
1346 output_byte(UNIT(current_drive));
1347 output_byte(0xc0);
1350 break;
1351 case 2:
1352 dtr = 250;
1353 break;
1356 if (FDCS->version >= FDC_82072) {
1357 scale_dtr = dtr;
1358 hlt_max_code = 0x00; /* 0==256msec*dtr0/dtr (not linear!) */
1359 hut_max_code = 0x0; /* 0==256msec*dtr0/dtr (not linear!) */
1362 /* Convert step rate from microseconds to milliseconds and 4 bits */
1363 srt = 16 - DIV_ROUND_UP(DP->srt * scale_dtr / 1000, NOMINAL_DTR);
1364 if (slow_floppy)
1365 srt = srt / 4;
1367 SUPBOUND(srt, 0xf);
1368 INFBOUND(srt, 0);
1370 hlt = DIV_ROUND_UP(DP->hlt * scale_dtr / 2, NOMINAL_DTR);
1371 if (hlt < 0x01)
1372 hlt = 0x01;
1373 else if (hlt > 0x7f)
1374 hlt = hlt_max_code;
1376 hut = DIV_ROUND_UP(DP->hut * scale_dtr / 16, NOMINAL_DTR);
1377 if (hut < 0x1)
1378 hut = 0x1;
1379 else if (hut > 0xf)
1380 hut = hut_max_code;
1382 spec1 = (srt << 4) | hut;
1383 spec2 = (hlt << 1) | (use_virtual_dma & 1);
1385 /* If these parameters did not change, just return with success */
1386 if (FDCS->spec1 != spec1 || FDCS->spec2 != spec2) {
1387 /* Go ahead and set spec1 and spec2 */
1388 output_byte(FD_SPECIFY);
1389 output_byte(FDCS->spec1 = spec1);
1390 output_byte(FDCS->spec2 = spec2);
1392 } /* fdc_specify */
1394 /* Set the FDC's data transfer rate on behalf of the specified drive.
1395 * NOTE: with 82072/82077 FDCs, changing the data rate requires a reissue
1396 * of the specify command (i.e. using the fdc_specify function).
1398 static int fdc_dtr(void)
1400 /* If data rate not already set to desired value, set it. */
1401 if ((raw_cmd->rate & 3) == FDCS->dtr)
1402 return 0;
1404 /* Set dtr */
1405 fd_outb(raw_cmd->rate & 3, FD_DCR);
1407 /* TODO: some FDC/drive combinations (C&T 82C711 with TEAC 1.2MB)
1408 * need a stabilization period of several milliseconds to be
1409 * enforced after data rate changes before R/W operations.
1410 * Pause 5 msec to avoid trouble. (Needs to be 2 jiffies)
1412 FDCS->dtr = raw_cmd->rate & 3;
1413 return fd_wait_for_completion(jiffies + 2UL * HZ / 100,
1414 (timeout_fn)floppy_ready);
1415 } /* fdc_dtr */
1417 static void tell_sector(void)
1419 pr_cont(": track %d, head %d, sector %d, size %d",
1420 R_TRACK, R_HEAD, R_SECTOR, R_SIZECODE);
1421 } /* tell_sector */
1423 static void print_errors(void)
1425 DPRINT("");
1426 if (ST0 & ST0_ECE) {
1427 pr_cont("Recalibrate failed!");
1428 } else if (ST2 & ST2_CRC) {
1429 pr_cont("data CRC error");
1430 tell_sector();
1431 } else if (ST1 & ST1_CRC) {
1432 pr_cont("CRC error");
1433 tell_sector();
1434 } else if ((ST1 & (ST1_MAM | ST1_ND)) ||
1435 (ST2 & ST2_MAM)) {
1436 if (!probing) {
1437 pr_cont("sector not found");
1438 tell_sector();
1439 } else
1440 pr_cont("probe failed...");
1441 } else if (ST2 & ST2_WC) { /* seek error */
1442 pr_cont("wrong cylinder");
1443 } else if (ST2 & ST2_BC) { /* cylinder marked as bad */
1444 pr_cont("bad cylinder");
1445 } else {
1446 pr_cont("unknown error. ST[0..2] are: 0x%x 0x%x 0x%x",
1447 ST0, ST1, ST2);
1448 tell_sector();
1450 pr_cont("\n");
1454 * OK, this error interpreting routine is called after a
1455 * DMA read/write has succeeded
1456 * or failed, so we check the results, and copy any buffers.
1457 * hhb: Added better error reporting.
1458 * ak: Made this into a separate routine.
1460 static int interpret_errors(void)
1462 char bad;
1464 if (inr != 7) {
1465 DPRINT("-- FDC reply error");
1466 FDCS->reset = 1;
1467 return 1;
1470 /* check IC to find cause of interrupt */
1471 switch (ST0 & ST0_INTR) {
1472 case 0x40: /* error occurred during command execution */
1473 if (ST1 & ST1_EOC)
1474 return 0; /* occurs with pseudo-DMA */
1475 bad = 1;
1476 if (ST1 & ST1_WP) {
1477 DPRINT("Drive is write protected\n");
1478 CLEARF(FD_DISK_WRITABLE);
1479 cont->done(0);
1480 bad = 2;
1481 } else if (ST1 & ST1_ND) {
1482 SETF(FD_NEED_TWADDLE);
1483 } else if (ST1 & ST1_OR) {
1484 if (DP->flags & FTD_MSG)
1485 DPRINT("Over/Underrun - retrying\n");
1486 bad = 0;
1487 } else if (*errors >= DP->max_errors.reporting) {
1488 print_errors();
1490 if (ST2 & ST2_WC || ST2 & ST2_BC)
1491 /* wrong cylinder => recal */
1492 DRS->track = NEED_2_RECAL;
1493 return bad;
1494 case 0x80: /* invalid command given */
1495 DPRINT("Invalid FDC command given!\n");
1496 cont->done(0);
1497 return 2;
1498 case 0xc0:
1499 DPRINT("Abnormal termination caused by polling\n");
1500 cont->error();
1501 return 2;
1502 default: /* (0) Normal command termination */
1503 return 0;
1508 * This routine is called when everything should be correctly set up
1509 * for the transfer (i.e. floppy motor is on, the correct floppy is
1510 * selected, and the head is sitting on the right track).
1512 static void setup_rw_floppy(void)
1514 int i;
1515 int r;
1516 int flags;
1517 int dflags;
1518 unsigned long ready_date;
1519 timeout_fn function;
1521 flags = raw_cmd->flags;
1522 if (flags & (FD_RAW_READ | FD_RAW_WRITE))
1523 flags |= FD_RAW_INTR;
1525 if ((flags & FD_RAW_SPIN) && !(flags & FD_RAW_NO_MOTOR)) {
1526 ready_date = DRS->spinup_date + DP->spinup;
1527 /* If spinup will take a long time, rerun scandrives
1528 * again just before spinup completion. Beware that
1529 * after scandrives, we must again wait for selection.
1531 if (time_after(ready_date, jiffies + DP->select_delay)) {
1532 ready_date -= DP->select_delay;
1533 function = (timeout_fn)floppy_start;
1534 } else
1535 function = (timeout_fn)setup_rw_floppy;
1537 /* wait until the floppy is spinning fast enough */
1538 if (fd_wait_for_completion(ready_date, function))
1539 return;
1541 dflags = DRS->flags;
1543 if ((flags & FD_RAW_READ) || (flags & FD_RAW_WRITE))
1544 setup_DMA();
1546 if (flags & FD_RAW_INTR)
1547 do_floppy = main_command_interrupt;
1549 r = 0;
1550 for (i = 0; i < raw_cmd->cmd_count; i++)
1551 r |= output_byte(raw_cmd->cmd[i]);
1553 debugt("rw_command: ");
1555 if (r) {
1556 cont->error();
1557 reset_fdc();
1558 return;
1561 if (!(flags & FD_RAW_INTR)) {
1562 inr = result();
1563 cont->interrupt();
1564 } else if (flags & FD_RAW_NEED_DISK)
1565 fd_watchdog();
1568 static int blind_seek;
1571 * This is the routine called after every seek (or recalibrate) interrupt
1572 * from the floppy controller.
1574 static void seek_interrupt(void)
1576 debugt("seek interrupt:");
1577 if (inr != 2 || (ST0 & 0xF8) != 0x20) {
1578 DPRINT("seek failed\n");
1579 DRS->track = NEED_2_RECAL;
1580 cont->error();
1581 cont->redo();
1582 return;
1584 if (DRS->track >= 0 && DRS->track != ST1 && !blind_seek) {
1585 #ifdef DCL_DEBUG
1586 if (DP->flags & FD_DEBUG) {
1587 DPRINT("clearing NEWCHANGE flag because of effective seek\n");
1588 DPRINT("jiffies=%lu\n", jiffies);
1590 #endif
1591 CLEARF(FD_DISK_NEWCHANGE); /* effective seek */
1592 DRS->select_date = jiffies;
1594 DRS->track = ST1;
1595 floppy_ready();
1598 static void check_wp(void)
1600 if (TESTF(FD_VERIFY)) {
1601 /* check write protection */
1602 output_byte(FD_GETSTATUS);
1603 output_byte(UNIT(current_drive));
1604 if (result() != 1) {
1605 FDCS->reset = 1;
1606 return;
1608 CLEARF(FD_VERIFY);
1609 CLEARF(FD_NEED_TWADDLE);
1610 #ifdef DCL_DEBUG
1611 if (DP->flags & FD_DEBUG) {
1612 DPRINT("checking whether disk is write protected\n");
1613 DPRINT("wp=%x\n", ST3 & 0x40);
1615 #endif
1616 if (!(ST3 & 0x40))
1617 SETF(FD_DISK_WRITABLE);
1618 else
1619 CLEARF(FD_DISK_WRITABLE);
1623 static void seek_floppy(void)
1625 int track;
1627 blind_seek = 0;
1629 #ifdef DCL_DEBUG
1630 if (DP->flags & FD_DEBUG)
1631 DPRINT("calling disk change from seek\n");
1632 #endif
1634 if (!TESTF(FD_DISK_NEWCHANGE) &&
1635 disk_change(current_drive) && (raw_cmd->flags & FD_RAW_NEED_DISK)) {
1636 /* the media changed flag should be cleared after the seek.
1637 * If it isn't, this means that there is really no disk in
1638 * the drive.
1640 SETF(FD_DISK_CHANGED);
1641 cont->done(0);
1642 cont->redo();
1643 return;
1645 if (DRS->track <= NEED_1_RECAL) {
1646 recalibrate_floppy();
1647 return;
1648 } else if (TESTF(FD_DISK_NEWCHANGE) &&
1649 (raw_cmd->flags & FD_RAW_NEED_DISK) &&
1650 (DRS->track <= NO_TRACK || DRS->track == raw_cmd->track)) {
1651 /* we seek to clear the media-changed condition. Does anybody
1652 * know a more elegant way, which works on all drives? */
1653 if (raw_cmd->track)
1654 track = raw_cmd->track - 1;
1655 else {
1656 if (DP->flags & FD_SILENT_DCL_CLEAR) {
1657 set_dor(fdc, ~(0x10 << UNIT(current_drive)), 0);
1658 blind_seek = 1;
1659 raw_cmd->flags |= FD_RAW_NEED_SEEK;
1661 track = 1;
1663 } else {
1664 check_wp();
1665 if (raw_cmd->track != DRS->track &&
1666 (raw_cmd->flags & FD_RAW_NEED_SEEK))
1667 track = raw_cmd->track;
1668 else {
1669 setup_rw_floppy();
1670 return;
1674 do_floppy = seek_interrupt;
1675 output_byte(FD_SEEK);
1676 output_byte(UNIT(current_drive));
1677 if (output_byte(track) < 0) {
1678 reset_fdc();
1679 return;
1681 debugt("seek command:");
1684 static void recal_interrupt(void)
1686 debugt("recal interrupt:");
1687 if (inr != 2)
1688 FDCS->reset = 1;
1689 else if (ST0 & ST0_ECE) {
1690 switch (DRS->track) {
1691 case NEED_1_RECAL:
1692 debugt("recal interrupt need 1 recal:");
1693 /* after a second recalibrate, we still haven't
1694 * reached track 0. Probably no drive. Raise an
1695 * error, as failing immediately might upset
1696 * computers possessed by the Devil :-) */
1697 cont->error();
1698 cont->redo();
1699 return;
1700 case NEED_2_RECAL:
1701 debugt("recal interrupt need 2 recal:");
1702 /* If we already did a recalibrate,
1703 * and we are not at track 0, this
1704 * means we have moved. (The only way
1705 * not to move at recalibration is to
1706 * be already at track 0.) Clear the
1707 * new change flag */
1708 #ifdef DCL_DEBUG
1709 if (DP->flags & FD_DEBUG)
1710 DPRINT("clearing NEWCHANGE flag because of second recalibrate\n");
1711 #endif
1713 CLEARF(FD_DISK_NEWCHANGE);
1714 DRS->select_date = jiffies;
1715 /* fall through */
1716 default:
1717 debugt("recal interrupt default:");
1718 /* Recalibrate moves the head by at
1719 * most 80 steps. If after one
1720 * recalibrate we don't have reached
1721 * track 0, this might mean that we
1722 * started beyond track 80. Try
1723 * again. */
1724 DRS->track = NEED_1_RECAL;
1725 break;
1727 } else
1728 DRS->track = ST1;
1729 floppy_ready();
1732 static void print_result(char *message, int inr)
1734 int i;
1736 DPRINT("%s ", message);
1737 if (inr >= 0)
1738 for (i = 0; i < inr; i++)
1739 pr_cont("repl[%d]=%x ", i, reply_buffer[i]);
1740 pr_cont("\n");
1743 /* interrupt handler. Note that this can be called externally on the Sparc */
1744 irqreturn_t floppy_interrupt(int irq, void *dev_id)
1746 int do_print;
1747 unsigned long f;
1748 void (*handler)(void) = do_floppy;
1750 lasthandler = handler;
1751 interruptjiffies = jiffies;
1753 f = claim_dma_lock();
1754 fd_disable_dma();
1755 release_dma_lock(f);
1757 floppy_enable_hlt();
1758 do_floppy = NULL;
1759 if (fdc >= N_FDC || FDCS->address == -1) {
1760 /* we don't even know which FDC is the culprit */
1761 pr_info("DOR0=%x\n", fdc_state[0].dor);
1762 pr_info("floppy interrupt on bizarre fdc %d\n", fdc);
1763 pr_info("handler=%p\n", handler);
1764 is_alive("bizarre fdc");
1765 return IRQ_NONE;
1768 FDCS->reset = 0;
1769 /* We have to clear the reset flag here, because apparently on boxes
1770 * with level triggered interrupts (PS/2, Sparc, ...), it is needed to
1771 * emit SENSEI's to clear the interrupt line. And FDCS->reset blocks the
1772 * emission of the SENSEI's.
1773 * It is OK to emit floppy commands because we are in an interrupt
1774 * handler here, and thus we have to fear no interference of other
1775 * activity.
1778 do_print = !handler && print_unex && !initialising;
1780 inr = result();
1781 if (do_print)
1782 print_result("unexpected interrupt", inr);
1783 if (inr == 0) {
1784 int max_sensei = 4;
1785 do {
1786 output_byte(FD_SENSEI);
1787 inr = result();
1788 if (do_print)
1789 print_result("sensei", inr);
1790 max_sensei--;
1791 } while ((ST0 & 0x83) != UNIT(current_drive) && inr == 2
1792 && max_sensei);
1794 if (!handler) {
1795 FDCS->reset = 1;
1796 return IRQ_NONE;
1798 schedule_bh(handler);
1799 is_alive("normal interrupt end");
1801 /* FIXME! Was it really for us? */
1802 return IRQ_HANDLED;
1805 static void recalibrate_floppy(void)
1807 debugt("recalibrate floppy:");
1808 do_floppy = recal_interrupt;
1809 output_byte(FD_RECALIBRATE);
1810 if (output_byte(UNIT(current_drive)) < 0) {
1811 reset_fdc();
1812 return;
1817 * Must do 4 FD_SENSEIs after reset because of ``drive polling''.
1819 static void reset_interrupt(void)
1821 debugt("reset interrupt:");
1822 result(); /* get the status ready for set_fdc */
1823 if (FDCS->reset) {
1824 pr_info("reset set in interrupt, calling %p\n", cont->error);
1825 cont->error(); /* a reset just after a reset. BAD! */
1827 cont->redo();
1831 * reset is done by pulling bit 2 of DOR low for a while (old FDCs),
1832 * or by setting the self clearing bit 7 of STATUS (newer FDCs)
1834 static void reset_fdc(void)
1836 unsigned long flags;
1838 do_floppy = reset_interrupt;
1839 FDCS->reset = 0;
1840 reset_fdc_info(0);
1842 /* Pseudo-DMA may intercept 'reset finished' interrupt. */
1843 /* Irrelevant for systems with true DMA (i386). */
1845 flags = claim_dma_lock();
1846 fd_disable_dma();
1847 release_dma_lock(flags);
1849 if (FDCS->version >= FDC_82072A)
1850 fd_outb(0x80 | (FDCS->dtr & 3), FD_STATUS);
1851 else {
1852 fd_outb(FDCS->dor & ~0x04, FD_DOR);
1853 udelay(FD_RESET_DELAY);
1854 fd_outb(FDCS->dor, FD_DOR);
1858 static void show_floppy(void)
1860 int i;
1862 pr_info("\n");
1863 pr_info("floppy driver state\n");
1864 pr_info("-------------------\n");
1865 pr_info("now=%lu last interrupt=%lu diff=%lu last called handler=%p\n",
1866 jiffies, interruptjiffies, jiffies - interruptjiffies,
1867 lasthandler);
1869 #ifdef FLOPPY_SANITY_CHECK
1870 pr_info("timeout_message=%s\n", timeout_message);
1871 pr_info("last output bytes:\n");
1872 for (i = 0; i < OLOGSIZE; i++)
1873 pr_info("%2x %2x %lu\n",
1874 output_log[(i + output_log_pos) % OLOGSIZE].data,
1875 output_log[(i + output_log_pos) % OLOGSIZE].status,
1876 output_log[(i + output_log_pos) % OLOGSIZE].jiffies);
1877 pr_info("last result at %lu\n", resultjiffies);
1878 pr_info("last redo_fd_request at %lu\n", lastredo);
1879 print_hex_dump(KERN_INFO, "", DUMP_PREFIX_NONE, 16, 1,
1880 reply_buffer, resultsize, true);
1881 #endif
1883 pr_info("status=%x\n", fd_inb(FD_STATUS));
1884 pr_info("fdc_busy=%lu\n", fdc_busy);
1885 if (do_floppy)
1886 pr_info("do_floppy=%p\n", do_floppy);
1887 if (work_pending(&floppy_work))
1888 pr_info("floppy_work.func=%p\n", floppy_work.func);
1889 if (timer_pending(&fd_timer))
1890 pr_info("fd_timer.function=%p\n", fd_timer.function);
1891 if (timer_pending(&fd_timeout)) {
1892 pr_info("timer_function=%p\n", fd_timeout.function);
1893 pr_info("expires=%lu\n", fd_timeout.expires - jiffies);
1894 pr_info("now=%lu\n", jiffies);
1896 pr_info("cont=%p\n", cont);
1897 pr_info("current_req=%p\n", current_req);
1898 pr_info("command_status=%d\n", command_status);
1899 pr_info("\n");
1902 static void floppy_shutdown(unsigned long data)
1904 unsigned long flags;
1906 if (!initialising)
1907 show_floppy();
1908 cancel_activity();
1910 floppy_enable_hlt();
1912 flags = claim_dma_lock();
1913 fd_disable_dma();
1914 release_dma_lock(flags);
1916 /* avoid dma going to a random drive after shutdown */
1918 if (!initialising)
1919 DPRINT("floppy timeout called\n");
1920 FDCS->reset = 1;
1921 if (cont) {
1922 cont->done(0);
1923 cont->redo(); /* this will recall reset when needed */
1924 } else {
1925 pr_info("no cont in shutdown!\n");
1926 process_fd_request();
1928 is_alive("floppy shutdown");
1931 /* start motor, check media-changed condition and write protection */
1932 static int start_motor(void (*function)(void))
1934 int mask;
1935 int data;
1937 mask = 0xfc;
1938 data = UNIT(current_drive);
1939 if (!(raw_cmd->flags & FD_RAW_NO_MOTOR)) {
1940 if (!(FDCS->dor & (0x10 << UNIT(current_drive)))) {
1941 set_debugt();
1942 /* no read since this drive is running */
1943 DRS->first_read_date = 0;
1944 /* note motor start time if motor is not yet running */
1945 DRS->spinup_date = jiffies;
1946 data |= (0x10 << UNIT(current_drive));
1948 } else if (FDCS->dor & (0x10 << UNIT(current_drive)))
1949 mask &= ~(0x10 << UNIT(current_drive));
1951 /* starts motor and selects floppy */
1952 del_timer(motor_off_timer + current_drive);
1953 set_dor(fdc, mask, data);
1955 /* wait_for_completion also schedules reset if needed. */
1956 return fd_wait_for_completion(DRS->select_date + DP->select_delay,
1957 (timeout_fn)function);
1960 static void floppy_ready(void)
1962 if (FDCS->reset) {
1963 reset_fdc();
1964 return;
1966 if (start_motor(floppy_ready))
1967 return;
1968 if (fdc_dtr())
1969 return;
1971 #ifdef DCL_DEBUG
1972 if (DP->flags & FD_DEBUG)
1973 DPRINT("calling disk change from floppy_ready\n");
1974 #endif
1975 if (!(raw_cmd->flags & FD_RAW_NO_MOTOR) &&
1976 disk_change(current_drive) && !DP->select_delay)
1977 twaddle(); /* this clears the dcl on certain
1978 * drive/controller combinations */
1980 #ifdef fd_chose_dma_mode
1981 if ((raw_cmd->flags & FD_RAW_READ) || (raw_cmd->flags & FD_RAW_WRITE)) {
1982 unsigned long flags = claim_dma_lock();
1983 fd_chose_dma_mode(raw_cmd->kernel_data, raw_cmd->length);
1984 release_dma_lock(flags);
1986 #endif
1988 if (raw_cmd->flags & (FD_RAW_NEED_SEEK | FD_RAW_NEED_DISK)) {
1989 perpendicular_mode();
1990 fdc_specify(); /* must be done here because of hut, hlt ... */
1991 seek_floppy();
1992 } else {
1993 if ((raw_cmd->flags & FD_RAW_READ) ||
1994 (raw_cmd->flags & FD_RAW_WRITE))
1995 fdc_specify();
1996 setup_rw_floppy();
2000 static void floppy_start(void)
2002 reschedule_timeout(current_reqD, "floppy start", 0);
2004 scandrives();
2005 #ifdef DCL_DEBUG
2006 if (DP->flags & FD_DEBUG)
2007 DPRINT("setting NEWCHANGE in floppy_start\n");
2008 #endif
2009 SETF(FD_DISK_NEWCHANGE);
2010 floppy_ready();
2014 * ========================================================================
2015 * here ends the bottom half. Exported routines are:
2016 * floppy_start, floppy_off, floppy_ready, lock_fdc, unlock_fdc, set_fdc,
2017 * start_motor, reset_fdc, reset_fdc_info, interpret_errors.
2018 * Initialization also uses output_byte, result, set_dor, floppy_interrupt
2019 * and set_dor.
2020 * ========================================================================
2023 * General purpose continuations.
2024 * ==============================
2027 static void do_wakeup(void)
2029 reschedule_timeout(MAXTIMEOUT, "do wakeup", 0);
2030 cont = NULL;
2031 command_status += 2;
2032 wake_up(&command_done);
2035 static struct cont_t wakeup_cont = {
2036 .interrupt = empty,
2037 .redo = do_wakeup,
2038 .error = empty,
2039 .done = (done_f)empty
2042 static struct cont_t intr_cont = {
2043 .interrupt = empty,
2044 .redo = process_fd_request,
2045 .error = empty,
2046 .done = (done_f)empty
2049 static int wait_til_done(void (*handler)(void), int interruptible)
2051 int ret;
2053 schedule_bh(handler);
2055 if (command_status < 2 && NO_SIGNAL) {
2056 DECLARE_WAITQUEUE(wait, current);
2058 add_wait_queue(&command_done, &wait);
2059 for (;;) {
2060 set_current_state(interruptible ?
2061 TASK_INTERRUPTIBLE :
2062 TASK_UNINTERRUPTIBLE);
2064 if (command_status >= 2 || !NO_SIGNAL)
2065 break;
2067 is_alive("wait_til_done");
2068 schedule();
2071 set_current_state(TASK_RUNNING);
2072 remove_wait_queue(&command_done, &wait);
2075 if (command_status < 2) {
2076 cancel_activity();
2077 cont = &intr_cont;
2078 reset_fdc();
2079 return -EINTR;
2082 if (FDCS->reset)
2083 command_status = FD_COMMAND_ERROR;
2084 if (command_status == FD_COMMAND_OKAY)
2085 ret = 0;
2086 else
2087 ret = -EIO;
2088 command_status = FD_COMMAND_NONE;
2089 return ret;
2092 static void generic_done(int result)
2094 command_status = result;
2095 cont = &wakeup_cont;
2098 static void generic_success(void)
2100 cont->done(1);
2103 static void generic_failure(void)
2105 cont->done(0);
2108 static void success_and_wakeup(void)
2110 generic_success();
2111 cont->redo();
2115 * formatting and rw support.
2116 * ==========================
2119 static int next_valid_format(void)
2121 int probed_format;
2123 probed_format = DRS->probed_format;
2124 while (1) {
2125 if (probed_format >= 8 || !DP->autodetect[probed_format]) {
2126 DRS->probed_format = 0;
2127 return 1;
2129 if (floppy_type[DP->autodetect[probed_format]].sect) {
2130 DRS->probed_format = probed_format;
2131 return 0;
2133 probed_format++;
2137 static void bad_flp_intr(void)
2139 int err_count;
2141 if (probing) {
2142 DRS->probed_format++;
2143 if (!next_valid_format())
2144 return;
2146 err_count = ++(*errors);
2147 INFBOUND(DRWE->badness, err_count);
2148 if (err_count > DP->max_errors.abort)
2149 cont->done(0);
2150 if (err_count > DP->max_errors.reset)
2151 FDCS->reset = 1;
2152 else if (err_count > DP->max_errors.recal)
2153 DRS->track = NEED_2_RECAL;
2156 static void set_floppy(int drive)
2158 int type = ITYPE(UDRS->fd_device);
2160 if (type)
2161 _floppy = floppy_type + type;
2162 else
2163 _floppy = current_type[drive];
2167 * formatting support.
2168 * ===================
2170 static void format_interrupt(void)
2172 switch (interpret_errors()) {
2173 case 1:
2174 cont->error();
2175 case 2:
2176 break;
2177 case 0:
2178 cont->done(1);
2180 cont->redo();
2183 #define CODE2SIZE (ssize = ((1 << SIZECODE) + 3) >> 2)
2184 #define FM_MODE(x, y) ((y) & ~(((x)->rate & 0x80) >> 1))
2185 #define CT(x) ((x) | 0xc0)
2187 static void setup_format_params(int track)
2189 int n;
2190 int il;
2191 int count;
2192 int head_shift;
2193 int track_shift;
2194 struct fparm {
2195 unsigned char track, head, sect, size;
2196 } *here = (struct fparm *)floppy_track_buffer;
2198 raw_cmd = &default_raw_cmd;
2199 raw_cmd->track = track;
2201 raw_cmd->flags = (FD_RAW_WRITE | FD_RAW_INTR | FD_RAW_SPIN |
2202 FD_RAW_NEED_DISK | FD_RAW_NEED_SEEK);
2203 raw_cmd->rate = _floppy->rate & 0x43;
2204 raw_cmd->cmd_count = NR_F;
2205 COMMAND = FM_MODE(_floppy, FD_FORMAT);
2206 DR_SELECT = UNIT(current_drive) + PH_HEAD(_floppy, format_req.head);
2207 F_SIZECODE = FD_SIZECODE(_floppy);
2208 F_SECT_PER_TRACK = _floppy->sect << 2 >> F_SIZECODE;
2209 F_GAP = _floppy->fmt_gap;
2210 F_FILL = FD_FILL_BYTE;
2212 raw_cmd->kernel_data = floppy_track_buffer;
2213 raw_cmd->length = 4 * F_SECT_PER_TRACK;
2215 /* allow for about 30ms for data transport per track */
2216 head_shift = (F_SECT_PER_TRACK + 5) / 6;
2218 /* a ``cylinder'' is two tracks plus a little stepping time */
2219 track_shift = 2 * head_shift + 3;
2221 /* position of logical sector 1 on this track */
2222 n = (track_shift * format_req.track + head_shift * format_req.head)
2223 % F_SECT_PER_TRACK;
2225 /* determine interleave */
2226 il = 1;
2227 if (_floppy->fmt_gap < 0x22)
2228 il++;
2230 /* initialize field */
2231 for (count = 0; count < F_SECT_PER_TRACK; ++count) {
2232 here[count].track = format_req.track;
2233 here[count].head = format_req.head;
2234 here[count].sect = 0;
2235 here[count].size = F_SIZECODE;
2237 /* place logical sectors */
2238 for (count = 1; count <= F_SECT_PER_TRACK; ++count) {
2239 here[n].sect = count;
2240 n = (n + il) % F_SECT_PER_TRACK;
2241 if (here[n].sect) { /* sector busy, find next free sector */
2242 ++n;
2243 if (n >= F_SECT_PER_TRACK) {
2244 n -= F_SECT_PER_TRACK;
2245 while (here[n].sect)
2246 ++n;
2250 if (_floppy->stretch & FD_SECTBASEMASK) {
2251 for (count = 0; count < F_SECT_PER_TRACK; count++)
2252 here[count].sect += FD_SECTBASE(_floppy) - 1;
2256 static void redo_format(void)
2258 buffer_track = -1;
2259 setup_format_params(format_req.track << STRETCH(_floppy));
2260 floppy_start();
2261 debugt("queue format request");
2264 static struct cont_t format_cont = {
2265 .interrupt = format_interrupt,
2266 .redo = redo_format,
2267 .error = bad_flp_intr,
2268 .done = generic_done
2271 static int do_format(int drive, struct format_descr *tmp_format_req)
2273 int ret;
2275 if (lock_fdc(drive, 1))
2276 return -EINTR;
2278 set_floppy(drive);
2279 if (!_floppy ||
2280 _floppy->track > DP->tracks ||
2281 tmp_format_req->track >= _floppy->track ||
2282 tmp_format_req->head >= _floppy->head ||
2283 (_floppy->sect << 2) % (1 << FD_SIZECODE(_floppy)) ||
2284 !_floppy->fmt_gap) {
2285 process_fd_request();
2286 return -EINVAL;
2288 format_req = *tmp_format_req;
2289 format_errors = 0;
2290 cont = &format_cont;
2291 errors = &format_errors;
2292 IWAIT(redo_format);
2293 process_fd_request();
2294 return ret;
2298 * Buffer read/write and support
2299 * =============================
2302 static void floppy_end_request(struct request *req, int error)
2304 unsigned int nr_sectors = current_count_sectors;
2305 unsigned int drive = (unsigned long)req->rq_disk->private_data;
2307 /* current_count_sectors can be zero if transfer failed */
2308 if (error)
2309 nr_sectors = blk_rq_cur_sectors(req);
2310 if (__blk_end_request(req, error, nr_sectors << 9))
2311 return;
2313 /* We're done with the request */
2314 floppy_off(drive);
2315 current_req = NULL;
2318 /* new request_done. Can handle physical sectors which are smaller than a
2319 * logical buffer */
2320 static void request_done(int uptodate)
2322 struct request_queue *q = floppy_queue;
2323 struct request *req = current_req;
2324 unsigned long flags;
2325 int block;
2327 probing = 0;
2328 reschedule_timeout(MAXTIMEOUT, "request done", uptodate);
2330 if (!req) {
2331 pr_info("floppy.c: no request in request_done\n");
2332 return;
2335 if (uptodate) {
2336 /* maintain values for invalidation on geometry
2337 * change */
2338 block = current_count_sectors + blk_rq_pos(req);
2339 INFBOUND(DRS->maxblock, block);
2340 if (block > _floppy->sect)
2341 DRS->maxtrack = 1;
2343 /* unlock chained buffers */
2344 spin_lock_irqsave(q->queue_lock, flags);
2345 floppy_end_request(req, 0);
2346 spin_unlock_irqrestore(q->queue_lock, flags);
2347 } else {
2348 if (rq_data_dir(req) == WRITE) {
2349 /* record write error information */
2350 DRWE->write_errors++;
2351 if (DRWE->write_errors == 1) {
2352 DRWE->first_error_sector = blk_rq_pos(req);
2353 DRWE->first_error_generation = DRS->generation;
2355 DRWE->last_error_sector = blk_rq_pos(req);
2356 DRWE->last_error_generation = DRS->generation;
2358 spin_lock_irqsave(q->queue_lock, flags);
2359 floppy_end_request(req, -EIO);
2360 spin_unlock_irqrestore(q->queue_lock, flags);
2364 /* Interrupt handler evaluating the result of the r/w operation */
2365 static void rw_interrupt(void)
2367 int eoc;
2368 int ssize;
2369 int heads;
2370 int nr_sectors;
2372 if (R_HEAD >= 2) {
2373 /* some Toshiba floppy controllers occasionnally seem to
2374 * return bogus interrupts after read/write operations, which
2375 * can be recognized by a bad head number (>= 2) */
2376 return;
2379 if (!DRS->first_read_date)
2380 DRS->first_read_date = jiffies;
2382 nr_sectors = 0;
2383 CODE2SIZE;
2385 if (ST1 & ST1_EOC)
2386 eoc = 1;
2387 else
2388 eoc = 0;
2390 if (COMMAND & 0x80)
2391 heads = 2;
2392 else
2393 heads = 1;
2395 nr_sectors = (((R_TRACK - TRACK) * heads +
2396 R_HEAD - HEAD) * SECT_PER_TRACK +
2397 R_SECTOR - SECTOR + eoc) << SIZECODE >> 2;
2399 #ifdef FLOPPY_SANITY_CHECK
2400 if (nr_sectors / ssize >
2401 DIV_ROUND_UP(in_sector_offset + current_count_sectors, ssize)) {
2402 DPRINT("long rw: %x instead of %lx\n",
2403 nr_sectors, current_count_sectors);
2404 pr_info("rs=%d s=%d\n", R_SECTOR, SECTOR);
2405 pr_info("rh=%d h=%d\n", R_HEAD, HEAD);
2406 pr_info("rt=%d t=%d\n", R_TRACK, TRACK);
2407 pr_info("heads=%d eoc=%d\n", heads, eoc);
2408 pr_info("spt=%d st=%d ss=%d\n",
2409 SECT_PER_TRACK, fsector_t, ssize);
2410 pr_info("in_sector_offset=%d\n", in_sector_offset);
2412 #endif
2414 nr_sectors -= in_sector_offset;
2415 INFBOUND(nr_sectors, 0);
2416 SUPBOUND(current_count_sectors, nr_sectors);
2418 switch (interpret_errors()) {
2419 case 2:
2420 cont->redo();
2421 return;
2422 case 1:
2423 if (!current_count_sectors) {
2424 cont->error();
2425 cont->redo();
2426 return;
2428 break;
2429 case 0:
2430 if (!current_count_sectors) {
2431 cont->redo();
2432 return;
2434 current_type[current_drive] = _floppy;
2435 floppy_sizes[TOMINOR(current_drive)] = _floppy->size;
2436 break;
2439 if (probing) {
2440 if (DP->flags & FTD_MSG)
2441 DPRINT("Auto-detected floppy type %s in fd%d\n",
2442 _floppy->name, current_drive);
2443 current_type[current_drive] = _floppy;
2444 floppy_sizes[TOMINOR(current_drive)] = _floppy->size;
2445 probing = 0;
2448 if (CT(COMMAND) != FD_READ ||
2449 raw_cmd->kernel_data == current_req->buffer) {
2450 /* transfer directly from buffer */
2451 cont->done(1);
2452 } else if (CT(COMMAND) == FD_READ) {
2453 buffer_track = raw_cmd->track;
2454 buffer_drive = current_drive;
2455 INFBOUND(buffer_max, nr_sectors + fsector_t);
2457 cont->redo();
2460 /* Compute maximal contiguous buffer size. */
2461 static int buffer_chain_size(void)
2463 struct bio_vec *bv;
2464 int size;
2465 struct req_iterator iter;
2466 char *base;
2468 base = bio_data(current_req->bio);
2469 size = 0;
2471 rq_for_each_segment(bv, current_req, iter) {
2472 if (page_address(bv->bv_page) + bv->bv_offset != base + size)
2473 break;
2475 size += bv->bv_len;
2478 return size >> 9;
2481 /* Compute the maximal transfer size */
2482 static int transfer_size(int ssize, int max_sector, int max_size)
2484 SUPBOUND(max_sector, fsector_t + max_size);
2486 /* alignment */
2487 max_sector -= (max_sector % _floppy->sect) % ssize;
2489 /* transfer size, beginning not aligned */
2490 current_count_sectors = max_sector - fsector_t;
2492 return max_sector;
2496 * Move data from/to the track buffer to/from the buffer cache.
2498 static void copy_buffer(int ssize, int max_sector, int max_sector_2)
2500 int remaining; /* number of transferred 512-byte sectors */
2501 struct bio_vec *bv;
2502 char *buffer;
2503 char *dma_buffer;
2504 int size;
2505 struct req_iterator iter;
2507 max_sector = transfer_size(ssize,
2508 min(max_sector, max_sector_2),
2509 blk_rq_sectors(current_req));
2511 if (current_count_sectors <= 0 && CT(COMMAND) == FD_WRITE &&
2512 buffer_max > fsector_t + blk_rq_sectors(current_req))
2513 current_count_sectors = min_t(int, buffer_max - fsector_t,
2514 blk_rq_sectors(current_req));
2516 remaining = current_count_sectors << 9;
2517 #ifdef FLOPPY_SANITY_CHECK
2518 if (remaining > blk_rq_bytes(current_req) && CT(COMMAND) == FD_WRITE) {
2519 DPRINT("in copy buffer\n");
2520 pr_info("current_count_sectors=%ld\n", current_count_sectors);
2521 pr_info("remaining=%d\n", remaining >> 9);
2522 pr_info("current_req->nr_sectors=%u\n",
2523 blk_rq_sectors(current_req));
2524 pr_info("current_req->current_nr_sectors=%u\n",
2525 blk_rq_cur_sectors(current_req));
2526 pr_info("max_sector=%d\n", max_sector);
2527 pr_info("ssize=%d\n", ssize);
2529 #endif
2531 buffer_max = max(max_sector, buffer_max);
2533 dma_buffer = floppy_track_buffer + ((fsector_t - buffer_min) << 9);
2535 size = blk_rq_cur_bytes(current_req);
2537 rq_for_each_segment(bv, current_req, iter) {
2538 if (!remaining)
2539 break;
2541 size = bv->bv_len;
2542 SUPBOUND(size, remaining);
2544 buffer = page_address(bv->bv_page) + bv->bv_offset;
2545 #ifdef FLOPPY_SANITY_CHECK
2546 if (dma_buffer + size >
2547 floppy_track_buffer + (max_buffer_sectors << 10) ||
2548 dma_buffer < floppy_track_buffer) {
2549 DPRINT("buffer overrun in copy buffer %d\n",
2550 (int)((floppy_track_buffer - dma_buffer) >> 9));
2551 pr_info("fsector_t=%d buffer_min=%d\n",
2552 fsector_t, buffer_min);
2553 pr_info("current_count_sectors=%ld\n",
2554 current_count_sectors);
2555 if (CT(COMMAND) == FD_READ)
2556 pr_info("read\n");
2557 if (CT(COMMAND) == FD_WRITE)
2558 pr_info("write\n");
2559 break;
2561 if (((unsigned long)buffer) % 512)
2562 DPRINT("%p buffer not aligned\n", buffer);
2563 #endif
2564 if (CT(COMMAND) == FD_READ)
2565 memcpy(buffer, dma_buffer, size);
2566 else
2567 memcpy(dma_buffer, buffer, size);
2569 remaining -= size;
2570 dma_buffer += size;
2572 #ifdef FLOPPY_SANITY_CHECK
2573 if (remaining) {
2574 if (remaining > 0)
2575 max_sector -= remaining >> 9;
2576 DPRINT("weirdness: remaining %d\n", remaining >> 9);
2578 #endif
2581 /* work around a bug in pseudo DMA
2582 * (on some FDCs) pseudo DMA does not stop when the CPU stops
2583 * sending data. Hence we need a different way to signal the
2584 * transfer length: We use SECT_PER_TRACK. Unfortunately, this
2585 * does not work with MT, hence we can only transfer one head at
2586 * a time
2588 static void virtualdmabug_workaround(void)
2590 int hard_sectors;
2591 int end_sector;
2593 if (CT(COMMAND) == FD_WRITE) {
2594 COMMAND &= ~0x80; /* switch off multiple track mode */
2596 hard_sectors = raw_cmd->length >> (7 + SIZECODE);
2597 end_sector = SECTOR + hard_sectors - 1;
2598 #ifdef FLOPPY_SANITY_CHECK
2599 if (end_sector > SECT_PER_TRACK) {
2600 pr_info("too many sectors %d > %d\n",
2601 end_sector, SECT_PER_TRACK);
2602 return;
2604 #endif
2605 SECT_PER_TRACK = end_sector;
2606 /* make sure SECT_PER_TRACK
2607 * points to end of transfer */
2612 * Formulate a read/write request.
2613 * this routine decides where to load the data (directly to buffer, or to
2614 * tmp floppy area), how much data to load (the size of the buffer, the whole
2615 * track, or a single sector)
2616 * All floppy_track_buffer handling goes in here. If we ever add track buffer
2617 * allocation on the fly, it should be done here. No other part should need
2618 * modification.
2621 static int make_raw_rw_request(void)
2623 int aligned_sector_t;
2624 int max_sector;
2625 int max_size;
2626 int tracksize;
2627 int ssize;
2629 if (max_buffer_sectors == 0) {
2630 pr_info("VFS: Block I/O scheduled on unopened device\n");
2631 return 0;
2634 set_fdc((long)current_req->rq_disk->private_data);
2636 raw_cmd = &default_raw_cmd;
2637 raw_cmd->flags = FD_RAW_SPIN | FD_RAW_NEED_DISK | FD_RAW_NEED_DISK |
2638 FD_RAW_NEED_SEEK;
2639 raw_cmd->cmd_count = NR_RW;
2640 if (rq_data_dir(current_req) == READ) {
2641 raw_cmd->flags |= FD_RAW_READ;
2642 COMMAND = FM_MODE(_floppy, FD_READ);
2643 } else if (rq_data_dir(current_req) == WRITE) {
2644 raw_cmd->flags |= FD_RAW_WRITE;
2645 COMMAND = FM_MODE(_floppy, FD_WRITE);
2646 } else {
2647 DPRINT("make_raw_rw_request: unknown command\n");
2648 return 0;
2651 max_sector = _floppy->sect * _floppy->head;
2653 TRACK = (int)blk_rq_pos(current_req) / max_sector;
2654 fsector_t = (int)blk_rq_pos(current_req) % max_sector;
2655 if (_floppy->track && TRACK >= _floppy->track) {
2656 if (blk_rq_cur_sectors(current_req) & 1) {
2657 current_count_sectors = 1;
2658 return 1;
2659 } else
2660 return 0;
2662 HEAD = fsector_t / _floppy->sect;
2664 if (((_floppy->stretch & (FD_SWAPSIDES | FD_SECTBASEMASK)) ||
2665 TESTF(FD_NEED_TWADDLE)) && fsector_t < _floppy->sect)
2666 max_sector = _floppy->sect;
2668 /* 2M disks have phantom sectors on the first track */
2669 if ((_floppy->rate & FD_2M) && (!TRACK) && (!HEAD)) {
2670 max_sector = 2 * _floppy->sect / 3;
2671 if (fsector_t >= max_sector) {
2672 current_count_sectors =
2673 min_t(int, _floppy->sect - fsector_t,
2674 blk_rq_sectors(current_req));
2675 return 1;
2677 SIZECODE = 2;
2678 } else
2679 SIZECODE = FD_SIZECODE(_floppy);
2680 raw_cmd->rate = _floppy->rate & 0x43;
2681 if ((_floppy->rate & FD_2M) && (TRACK || HEAD) && raw_cmd->rate == 2)
2682 raw_cmd->rate = 1;
2684 if (SIZECODE)
2685 SIZECODE2 = 0xff;
2686 else
2687 SIZECODE2 = 0x80;
2688 raw_cmd->track = TRACK << STRETCH(_floppy);
2689 DR_SELECT = UNIT(current_drive) + PH_HEAD(_floppy, HEAD);
2690 GAP = _floppy->gap;
2691 CODE2SIZE;
2692 SECT_PER_TRACK = _floppy->sect << 2 >> SIZECODE;
2693 SECTOR = ((fsector_t % _floppy->sect) << 2 >> SIZECODE) +
2694 FD_SECTBASE(_floppy);
2696 /* tracksize describes the size which can be filled up with sectors
2697 * of size ssize.
2699 tracksize = _floppy->sect - _floppy->sect % ssize;
2700 if (tracksize < _floppy->sect) {
2701 SECT_PER_TRACK++;
2702 if (tracksize <= fsector_t % _floppy->sect)
2703 SECTOR--;
2705 /* if we are beyond tracksize, fill up using smaller sectors */
2706 while (tracksize <= fsector_t % _floppy->sect) {
2707 while (tracksize + ssize > _floppy->sect) {
2708 SIZECODE--;
2709 ssize >>= 1;
2711 SECTOR++;
2712 SECT_PER_TRACK++;
2713 tracksize += ssize;
2715 max_sector = HEAD * _floppy->sect + tracksize;
2716 } else if (!TRACK && !HEAD && !(_floppy->rate & FD_2M) && probing) {
2717 max_sector = _floppy->sect;
2718 } else if (!HEAD && CT(COMMAND) == FD_WRITE) {
2719 /* for virtual DMA bug workaround */
2720 max_sector = _floppy->sect;
2723 in_sector_offset = (fsector_t % _floppy->sect) % ssize;
2724 aligned_sector_t = fsector_t - in_sector_offset;
2725 max_size = blk_rq_sectors(current_req);
2726 if ((raw_cmd->track == buffer_track) &&
2727 (current_drive == buffer_drive) &&
2728 (fsector_t >= buffer_min) && (fsector_t < buffer_max)) {
2729 /* data already in track buffer */
2730 if (CT(COMMAND) == FD_READ) {
2731 copy_buffer(1, max_sector, buffer_max);
2732 return 1;
2734 } else if (in_sector_offset || blk_rq_sectors(current_req) < ssize) {
2735 if (CT(COMMAND) == FD_WRITE) {
2736 unsigned int sectors;
2738 sectors = fsector_t + blk_rq_sectors(current_req);
2739 if (sectors > ssize && sectors < ssize + ssize)
2740 max_size = ssize + ssize;
2741 else
2742 max_size = ssize;
2744 raw_cmd->flags &= ~FD_RAW_WRITE;
2745 raw_cmd->flags |= FD_RAW_READ;
2746 COMMAND = FM_MODE(_floppy, FD_READ);
2747 } else if ((unsigned long)current_req->buffer < MAX_DMA_ADDRESS) {
2748 unsigned long dma_limit;
2749 int direct, indirect;
2751 indirect =
2752 transfer_size(ssize, max_sector,
2753 max_buffer_sectors * 2) - fsector_t;
2756 * Do NOT use minimum() here---MAX_DMA_ADDRESS is 64 bits wide
2757 * on a 64 bit machine!
2759 max_size = buffer_chain_size();
2760 dma_limit = (MAX_DMA_ADDRESS -
2761 ((unsigned long)current_req->buffer)) >> 9;
2762 if ((unsigned long)max_size > dma_limit)
2763 max_size = dma_limit;
2764 /* 64 kb boundaries */
2765 if (CROSS_64KB(current_req->buffer, max_size << 9))
2766 max_size = (K_64 -
2767 ((unsigned long)current_req->buffer) %
2768 K_64) >> 9;
2769 direct = transfer_size(ssize, max_sector, max_size) - fsector_t;
2771 * We try to read tracks, but if we get too many errors, we
2772 * go back to reading just one sector at a time.
2774 * This means we should be able to read a sector even if there
2775 * are other bad sectors on this track.
2777 if (!direct ||
2778 (indirect * 2 > direct * 3 &&
2779 *errors < DP->max_errors.read_track &&
2780 ((!probing ||
2781 (DP->read_track & (1 << DRS->probed_format)))))) {
2782 max_size = blk_rq_sectors(current_req);
2783 } else {
2784 raw_cmd->kernel_data = current_req->buffer;
2785 raw_cmd->length = current_count_sectors << 9;
2786 if (raw_cmd->length == 0) {
2787 DPRINT("zero dma transfer attempted from make_raw_request\n");
2788 DPRINT("indirect=%d direct=%d fsector_t=%d\n",
2789 indirect, direct, fsector_t);
2790 return 0;
2792 virtualdmabug_workaround();
2793 return 2;
2797 if (CT(COMMAND) == FD_READ)
2798 max_size = max_sector; /* unbounded */
2800 /* claim buffer track if needed */
2801 if (buffer_track != raw_cmd->track || /* bad track */
2802 buffer_drive != current_drive || /* bad drive */
2803 fsector_t > buffer_max ||
2804 fsector_t < buffer_min ||
2805 ((CT(COMMAND) == FD_READ ||
2806 (!in_sector_offset && blk_rq_sectors(current_req) >= ssize)) &&
2807 max_sector > 2 * max_buffer_sectors + buffer_min &&
2808 max_size + fsector_t > 2 * max_buffer_sectors + buffer_min)) {
2809 /* not enough space */
2810 buffer_track = -1;
2811 buffer_drive = current_drive;
2812 buffer_max = buffer_min = aligned_sector_t;
2814 raw_cmd->kernel_data = floppy_track_buffer +
2815 ((aligned_sector_t - buffer_min) << 9);
2817 if (CT(COMMAND) == FD_WRITE) {
2818 /* copy write buffer to track buffer.
2819 * if we get here, we know that the write
2820 * is either aligned or the data already in the buffer
2821 * (buffer will be overwritten) */
2822 #ifdef FLOPPY_SANITY_CHECK
2823 if (in_sector_offset && buffer_track == -1)
2824 DPRINT("internal error offset !=0 on write\n");
2825 #endif
2826 buffer_track = raw_cmd->track;
2827 buffer_drive = current_drive;
2828 copy_buffer(ssize, max_sector,
2829 2 * max_buffer_sectors + buffer_min);
2830 } else
2831 transfer_size(ssize, max_sector,
2832 2 * max_buffer_sectors + buffer_min -
2833 aligned_sector_t);
2835 /* round up current_count_sectors to get dma xfer size */
2836 raw_cmd->length = in_sector_offset + current_count_sectors;
2837 raw_cmd->length = ((raw_cmd->length - 1) | (ssize - 1)) + 1;
2838 raw_cmd->length <<= 9;
2839 #ifdef FLOPPY_SANITY_CHECK
2840 if ((raw_cmd->length < current_count_sectors << 9) ||
2841 (raw_cmd->kernel_data != current_req->buffer &&
2842 CT(COMMAND) == FD_WRITE &&
2843 (aligned_sector_t + (raw_cmd->length >> 9) > buffer_max ||
2844 aligned_sector_t < buffer_min)) ||
2845 raw_cmd->length % (128 << SIZECODE) ||
2846 raw_cmd->length <= 0 || current_count_sectors <= 0) {
2847 DPRINT("fractionary current count b=%lx s=%lx\n",
2848 raw_cmd->length, current_count_sectors);
2849 if (raw_cmd->kernel_data != current_req->buffer)
2850 pr_info("addr=%d, length=%ld\n",
2851 (int)((raw_cmd->kernel_data -
2852 floppy_track_buffer) >> 9),
2853 current_count_sectors);
2854 pr_info("st=%d ast=%d mse=%d msi=%d\n",
2855 fsector_t, aligned_sector_t, max_sector, max_size);
2856 pr_info("ssize=%x SIZECODE=%d\n", ssize, SIZECODE);
2857 pr_info("command=%x SECTOR=%d HEAD=%d, TRACK=%d\n",
2858 COMMAND, SECTOR, HEAD, TRACK);
2859 pr_info("buffer drive=%d\n", buffer_drive);
2860 pr_info("buffer track=%d\n", buffer_track);
2861 pr_info("buffer_min=%d\n", buffer_min);
2862 pr_info("buffer_max=%d\n", buffer_max);
2863 return 0;
2866 if (raw_cmd->kernel_data != current_req->buffer) {
2867 if (raw_cmd->kernel_data < floppy_track_buffer ||
2868 current_count_sectors < 0 ||
2869 raw_cmd->length < 0 ||
2870 raw_cmd->kernel_data + raw_cmd->length >
2871 floppy_track_buffer + (max_buffer_sectors << 10)) {
2872 DPRINT("buffer overrun in schedule dma\n");
2873 pr_info("fsector_t=%d buffer_min=%d current_count=%ld\n",
2874 fsector_t, buffer_min, raw_cmd->length >> 9);
2875 pr_info("current_count_sectors=%ld\n",
2876 current_count_sectors);
2877 if (CT(COMMAND) == FD_READ)
2878 pr_info("read\n");
2879 if (CT(COMMAND) == FD_WRITE)
2880 pr_info("write\n");
2881 return 0;
2883 } else if (raw_cmd->length > blk_rq_bytes(current_req) ||
2884 current_count_sectors > blk_rq_sectors(current_req)) {
2885 DPRINT("buffer overrun in direct transfer\n");
2886 return 0;
2887 } else if (raw_cmd->length < current_count_sectors << 9) {
2888 DPRINT("more sectors than bytes\n");
2889 pr_info("bytes=%ld\n", raw_cmd->length >> 9);
2890 pr_info("sectors=%ld\n", current_count_sectors);
2892 if (raw_cmd->length == 0) {
2893 DPRINT("zero dma transfer attempted from make_raw_request\n");
2894 return 0;
2896 #endif
2898 virtualdmabug_workaround();
2899 return 2;
2902 static void redo_fd_request(void)
2904 #define REPEAT {request_done(0); continue; }
2905 int drive;
2906 int tmp;
2908 lastredo = jiffies;
2909 if (current_drive < N_DRIVE)
2910 floppy_off(current_drive);
2912 for (;;) {
2913 if (!current_req) {
2914 struct request *req;
2916 spin_lock_irq(floppy_queue->queue_lock);
2917 req = blk_fetch_request(floppy_queue);
2918 spin_unlock_irq(floppy_queue->queue_lock);
2919 if (!req) {
2920 do_floppy = NULL;
2921 unlock_fdc();
2922 return;
2924 current_req = req;
2926 drive = (long)current_req->rq_disk->private_data;
2927 set_fdc(drive);
2928 reschedule_timeout(current_reqD, "redo fd request", 0);
2930 set_floppy(drive);
2931 raw_cmd = &default_raw_cmd;
2932 raw_cmd->flags = 0;
2933 if (start_motor(redo_fd_request))
2934 return;
2935 disk_change(current_drive);
2936 if (test_bit(current_drive, &fake_change) ||
2937 TESTF(FD_DISK_CHANGED)) {
2938 DPRINT("disk absent or changed during operation\n");
2939 REPEAT;
2941 if (!_floppy) { /* Autodetection */
2942 if (!probing) {
2943 DRS->probed_format = 0;
2944 if (next_valid_format()) {
2945 DPRINT("no autodetectable formats\n");
2946 _floppy = NULL;
2947 REPEAT;
2950 probing = 1;
2951 _floppy =
2952 floppy_type + DP->autodetect[DRS->probed_format];
2953 } else
2954 probing = 0;
2955 errors = &(current_req->errors);
2956 tmp = make_raw_rw_request();
2957 if (tmp < 2) {
2958 request_done(tmp);
2959 continue;
2962 if (TESTF(FD_NEED_TWADDLE))
2963 twaddle();
2964 schedule_bh(floppy_start);
2965 debugt("queue fd request");
2966 return;
2968 #undef REPEAT
2971 static struct cont_t rw_cont = {
2972 .interrupt = rw_interrupt,
2973 .redo = redo_fd_request,
2974 .error = bad_flp_intr,
2975 .done = request_done
2978 static void process_fd_request(void)
2980 cont = &rw_cont;
2981 schedule_bh(redo_fd_request);
2984 static void do_fd_request(struct request_queue *q)
2986 if (max_buffer_sectors == 0) {
2987 pr_info("VFS: do_fd_request called on non-open device\n");
2988 return;
2991 if (usage_count == 0) {
2992 pr_info("warning: usage count=0, current_req=%p exiting\n",
2993 current_req);
2994 pr_info("sect=%ld type=%x flags=%x\n",
2995 (long)blk_rq_pos(current_req), current_req->cmd_type,
2996 current_req->cmd_flags);
2997 return;
2999 if (test_bit(0, &fdc_busy)) {
3000 /* fdc busy, this new request will be treated when the
3001 current one is done */
3002 is_alive("do fd request, old request running");
3003 return;
3005 lock_fdc(MAXTIMEOUT, 0);
3006 process_fd_request();
3007 is_alive("do fd request");
3010 static struct cont_t poll_cont = {
3011 .interrupt = success_and_wakeup,
3012 .redo = floppy_ready,
3013 .error = generic_failure,
3014 .done = generic_done
3017 static int poll_drive(int interruptible, int flag)
3019 int ret;
3021 /* no auto-sense, just clear dcl */
3022 raw_cmd = &default_raw_cmd;
3023 raw_cmd->flags = flag;
3024 raw_cmd->track = 0;
3025 raw_cmd->cmd_count = 0;
3026 cont = &poll_cont;
3027 #ifdef DCL_DEBUG
3028 if (DP->flags & FD_DEBUG)
3029 DPRINT("setting NEWCHANGE in poll_drive\n");
3030 #endif
3031 SETF(FD_DISK_NEWCHANGE);
3032 WAIT(floppy_ready);
3033 return ret;
3037 * User triggered reset
3038 * ====================
3041 static void reset_intr(void)
3043 pr_info("weird, reset interrupt called\n");
3046 static struct cont_t reset_cont = {
3047 .interrupt = reset_intr,
3048 .redo = success_and_wakeup,
3049 .error = generic_failure,
3050 .done = generic_done
3053 static int user_reset_fdc(int drive, int arg, int interruptible)
3055 int ret;
3057 if (lock_fdc(drive, interruptible))
3058 return -EINTR;
3060 if (arg == FD_RESET_ALWAYS)
3061 FDCS->reset = 1;
3062 if (FDCS->reset) {
3063 cont = &reset_cont;
3064 WAIT(reset_fdc);
3066 process_fd_request();
3067 return 0;
3071 * Misc Ioctl's and support
3072 * ========================
3074 static inline int fd_copyout(void __user *param, const void *address,
3075 unsigned long size)
3077 return copy_to_user(param, address, size) ? -EFAULT : 0;
3080 static inline int fd_copyin(void __user *param, void *address,
3081 unsigned long size)
3083 return copy_from_user(address, param, size) ? -EFAULT : 0;
3086 #define _COPYOUT(x) (copy_to_user((void __user *)param, &(x), sizeof(x)) \
3087 ? -EFAULT : 0)
3088 #define _COPYIN(x) (copy_from_user(&(x), (void __user *)param, sizeof(x)) \
3089 ? -EFAULT : 0)
3091 #define COPYOUT(x) ECALL(_COPYOUT(x))
3092 #define COPYIN(x) ECALL(_COPYIN(x))
3094 static inline const char *drive_name(int type, int drive)
3096 struct floppy_struct *floppy;
3098 if (type)
3099 floppy = floppy_type + type;
3100 else {
3101 if (UDP->native_format)
3102 floppy = floppy_type + UDP->native_format;
3103 else
3104 return "(null)";
3106 if (floppy->name)
3107 return floppy->name;
3108 else
3109 return "(null)";
3112 /* raw commands */
3113 static void raw_cmd_done(int flag)
3115 int i;
3117 if (!flag) {
3118 raw_cmd->flags |= FD_RAW_FAILURE;
3119 raw_cmd->flags |= FD_RAW_HARDFAILURE;
3120 } else {
3121 raw_cmd->reply_count = inr;
3122 if (raw_cmd->reply_count > MAX_REPLIES)
3123 raw_cmd->reply_count = 0;
3124 for (i = 0; i < raw_cmd->reply_count; i++)
3125 raw_cmd->reply[i] = reply_buffer[i];
3127 if (raw_cmd->flags & (FD_RAW_READ | FD_RAW_WRITE)) {
3128 unsigned long flags;
3129 flags = claim_dma_lock();
3130 raw_cmd->length = fd_get_dma_residue();
3131 release_dma_lock(flags);
3134 if ((raw_cmd->flags & FD_RAW_SOFTFAILURE) &&
3135 (!raw_cmd->reply_count || (raw_cmd->reply[0] & 0xc0)))
3136 raw_cmd->flags |= FD_RAW_FAILURE;
3138 if (disk_change(current_drive))
3139 raw_cmd->flags |= FD_RAW_DISK_CHANGE;
3140 else
3141 raw_cmd->flags &= ~FD_RAW_DISK_CHANGE;
3142 if (raw_cmd->flags & FD_RAW_NO_MOTOR_AFTER)
3143 motor_off_callback(current_drive);
3145 if (raw_cmd->next &&
3146 (!(raw_cmd->flags & FD_RAW_FAILURE) ||
3147 !(raw_cmd->flags & FD_RAW_STOP_IF_FAILURE)) &&
3148 ((raw_cmd->flags & FD_RAW_FAILURE) ||
3149 !(raw_cmd->flags & FD_RAW_STOP_IF_SUCCESS))) {
3150 raw_cmd = raw_cmd->next;
3151 return;
3154 generic_done(flag);
3157 static struct cont_t raw_cmd_cont = {
3158 .interrupt = success_and_wakeup,
3159 .redo = floppy_start,
3160 .error = generic_failure,
3161 .done = raw_cmd_done
3164 static inline int raw_cmd_copyout(int cmd, char __user *param,
3165 struct floppy_raw_cmd *ptr)
3167 int ret;
3169 while (ptr) {
3170 COPYOUT(*ptr);
3171 param += sizeof(struct floppy_raw_cmd);
3172 if ((ptr->flags & FD_RAW_READ) && ptr->buffer_length) {
3173 if (ptr->length >= 0 &&
3174 ptr->length <= ptr->buffer_length) {
3175 long length = ptr->buffer_length - ptr->length;
3176 ECALL(fd_copyout(ptr->data, ptr->kernel_data,
3177 length));
3180 ptr = ptr->next;
3182 return 0;
3185 static void raw_cmd_free(struct floppy_raw_cmd **ptr)
3187 struct floppy_raw_cmd *next;
3188 struct floppy_raw_cmd *this;
3190 this = *ptr;
3191 *ptr = NULL;
3192 while (this) {
3193 if (this->buffer_length) {
3194 fd_dma_mem_free((unsigned long)this->kernel_data,
3195 this->buffer_length);
3196 this->buffer_length = 0;
3198 next = this->next;
3199 kfree(this);
3200 this = next;
3204 static inline int raw_cmd_copyin(int cmd, char __user *param,
3205 struct floppy_raw_cmd **rcmd)
3207 struct floppy_raw_cmd *ptr;
3208 int ret;
3209 int i;
3211 *rcmd = NULL;
3212 while (1) {
3213 ptr = (struct floppy_raw_cmd *)
3214 kmalloc(sizeof(struct floppy_raw_cmd), GFP_USER);
3215 if (!ptr)
3216 return -ENOMEM;
3217 *rcmd = ptr;
3218 COPYIN(*ptr);
3219 ptr->next = NULL;
3220 ptr->buffer_length = 0;
3221 param += sizeof(struct floppy_raw_cmd);
3222 if (ptr->cmd_count > 33)
3223 /* the command may now also take up the space
3224 * initially intended for the reply & the
3225 * reply count. Needed for long 82078 commands
3226 * such as RESTORE, which takes ... 17 command
3227 * bytes. Murphy's law #137: When you reserve
3228 * 16 bytes for a structure, you'll one day
3229 * discover that you really need 17...
3231 return -EINVAL;
3233 for (i = 0; i < 16; i++)
3234 ptr->reply[i] = 0;
3235 ptr->resultcode = 0;
3236 ptr->kernel_data = NULL;
3238 if (ptr->flags & (FD_RAW_READ | FD_RAW_WRITE)) {
3239 if (ptr->length <= 0)
3240 return -EINVAL;
3241 ptr->kernel_data =
3242 (char *)fd_dma_mem_alloc(ptr->length);
3243 fallback_on_nodma_alloc(&ptr->kernel_data, ptr->length);
3244 if (!ptr->kernel_data)
3245 return -ENOMEM;
3246 ptr->buffer_length = ptr->length;
3248 if (ptr->flags & FD_RAW_WRITE)
3249 ECALL(fd_copyin(ptr->data, ptr->kernel_data,
3250 ptr->length));
3251 rcmd = &(ptr->next);
3252 if (!(ptr->flags & FD_RAW_MORE))
3253 return 0;
3254 ptr->rate &= 0x43;
3258 static int raw_cmd_ioctl(int cmd, void __user *param)
3260 struct floppy_raw_cmd *my_raw_cmd;
3261 int drive;
3262 int ret2;
3263 int ret;
3265 if (FDCS->rawcmd <= 1)
3266 FDCS->rawcmd = 1;
3267 for (drive = 0; drive < N_DRIVE; drive++) {
3268 if (FDC(drive) != fdc)
3269 continue;
3270 if (drive == current_drive) {
3271 if (UDRS->fd_ref > 1) {
3272 FDCS->rawcmd = 2;
3273 break;
3275 } else if (UDRS->fd_ref) {
3276 FDCS->rawcmd = 2;
3277 break;
3281 if (FDCS->reset)
3282 return -EIO;
3284 ret = raw_cmd_copyin(cmd, param, &my_raw_cmd);
3285 if (ret) {
3286 raw_cmd_free(&my_raw_cmd);
3287 return ret;
3290 raw_cmd = my_raw_cmd;
3291 cont = &raw_cmd_cont;
3292 ret = wait_til_done(floppy_start, 1);
3293 #ifdef DCL_DEBUG
3294 if (DP->flags & FD_DEBUG)
3295 DPRINT("calling disk change from raw_cmd ioctl\n");
3296 #endif
3298 if (ret != -EINTR && FDCS->reset)
3299 ret = -EIO;
3301 DRS->track = NO_TRACK;
3303 ret2 = raw_cmd_copyout(cmd, param, my_raw_cmd);
3304 if (!ret)
3305 ret = ret2;
3306 raw_cmd_free(&my_raw_cmd);
3307 return ret;
3310 static int invalidate_drive(struct block_device *bdev)
3312 /* invalidate the buffer track to force a reread */
3313 set_bit((long)bdev->bd_disk->private_data, &fake_change);
3314 process_fd_request();
3315 check_disk_change(bdev);
3316 return 0;
3319 static inline int set_geometry(unsigned int cmd, struct floppy_struct *g,
3320 int drive, int type, struct block_device *bdev)
3322 int cnt;
3324 /* sanity checking for parameters. */
3325 if (g->sect <= 0 ||
3326 g->head <= 0 ||
3327 g->track <= 0 || g->track > UDP->tracks >> STRETCH(g) ||
3328 /* check if reserved bits are set */
3329 (g->stretch & ~(FD_STRETCH | FD_SWAPSIDES | FD_SECTBASEMASK)) != 0)
3330 return -EINVAL;
3331 if (type) {
3332 if (!capable(CAP_SYS_ADMIN))
3333 return -EPERM;
3334 mutex_lock(&open_lock);
3335 if (lock_fdc(drive, 1)) {
3336 mutex_unlock(&open_lock);
3337 return -EINTR;
3339 floppy_type[type] = *g;
3340 floppy_type[type].name = "user format";
3341 for (cnt = type << 2; cnt < (type << 2) + 4; cnt++)
3342 floppy_sizes[cnt] = floppy_sizes[cnt + 0x80] =
3343 floppy_type[type].size + 1;
3344 process_fd_request();
3345 for (cnt = 0; cnt < N_DRIVE; cnt++) {
3346 struct block_device *bdev = opened_bdev[cnt];
3347 if (!bdev || ITYPE(drive_state[cnt].fd_device) != type)
3348 continue;
3349 __invalidate_device(bdev);
3351 mutex_unlock(&open_lock);
3352 } else {
3353 int oldStretch;
3355 if (lock_fdc(drive, 1))
3356 return -EINTR;
3357 if (cmd != FDDEFPRM)
3358 /* notice a disk change immediately, else
3359 * we lose our settings immediately*/
3360 CALL(poll_drive(1, FD_RAW_NEED_DISK));
3361 oldStretch = g->stretch;
3362 user_params[drive] = *g;
3363 if (buffer_drive == drive)
3364 SUPBOUND(buffer_max, user_params[drive].sect);
3365 current_type[drive] = &user_params[drive];
3366 floppy_sizes[drive] = user_params[drive].size;
3367 if (cmd == FDDEFPRM)
3368 DRS->keep_data = -1;
3369 else
3370 DRS->keep_data = 1;
3371 /* invalidation. Invalidate only when needed, i.e.
3372 * when there are already sectors in the buffer cache
3373 * whose number will change. This is useful, because
3374 * mtools often changes the geometry of the disk after
3375 * looking at the boot block */
3376 if (DRS->maxblock > user_params[drive].sect ||
3377 DRS->maxtrack ||
3378 ((user_params[drive].sect ^ oldStretch) &
3379 (FD_SWAPSIDES | FD_SECTBASEMASK)))
3380 invalidate_drive(bdev);
3381 else
3382 process_fd_request();
3384 return 0;
3387 /* handle obsolete ioctl's */
3388 static int ioctl_table[] = {
3389 FDCLRPRM,
3390 FDSETPRM,
3391 FDDEFPRM,
3392 FDGETPRM,
3393 FDMSGON,
3394 FDMSGOFF,
3395 FDFMTBEG,
3396 FDFMTTRK,
3397 FDFMTEND,
3398 FDSETEMSGTRESH,
3399 FDFLUSH,
3400 FDSETMAXERRS,
3401 FDGETMAXERRS,
3402 FDGETDRVTYP,
3403 FDSETDRVPRM,
3404 FDGETDRVPRM,
3405 FDGETDRVSTAT,
3406 FDPOLLDRVSTAT,
3407 FDRESET,
3408 FDGETFDCSTAT,
3409 FDWERRORCLR,
3410 FDWERRORGET,
3411 FDRAWCMD,
3412 FDEJECT,
3413 FDTWADDLE
3416 static inline int normalize_ioctl(int *cmd, int *size)
3418 int i;
3420 for (i = 0; i < ARRAY_SIZE(ioctl_table); i++) {
3421 if ((*cmd & 0xffff) == (ioctl_table[i] & 0xffff)) {
3422 *size = _IOC_SIZE(*cmd);
3423 *cmd = ioctl_table[i];
3424 if (*size > _IOC_SIZE(*cmd)) {
3425 pr_info("ioctl not yet supported\n");
3426 return -EFAULT;
3428 return 0;
3431 return -EINVAL;
3434 static int get_floppy_geometry(int drive, int type, struct floppy_struct **g)
3436 if (type)
3437 *g = &floppy_type[type];
3438 else {
3439 if (lock_fdc(drive, 0))
3440 return -EINTR;
3441 CALL(poll_drive(0, 0));
3442 process_fd_request();
3443 *g = current_type[drive];
3445 if (!*g)
3446 return -ENODEV;
3447 return 0;
3450 static int fd_getgeo(struct block_device *bdev, struct hd_geometry *geo)
3452 int drive = (long)bdev->bd_disk->private_data;
3453 int type = ITYPE(drive_state[drive].fd_device);
3454 struct floppy_struct *g;
3455 int ret;
3457 ret = get_floppy_geometry(drive, type, &g);
3458 if (ret)
3459 return ret;
3461 geo->heads = g->head;
3462 geo->sectors = g->sect;
3463 geo->cylinders = g->track;
3464 return 0;
3467 static int fd_ioctl(struct block_device *bdev, fmode_t mode, unsigned int cmd,
3468 unsigned long param)
3470 #define FD_IOCTL_ALLOWED (mode & (FMODE_WRITE|FMODE_WRITE_IOCTL))
3472 int drive = (long)bdev->bd_disk->private_data;
3473 int type = ITYPE(UDRS->fd_device);
3474 int i;
3475 int ret;
3476 int size;
3477 union inparam {
3478 struct floppy_struct g; /* geometry */
3479 struct format_descr f;
3480 struct floppy_max_errors max_errors;
3481 struct floppy_drive_params dp;
3482 } inparam; /* parameters coming from user space */
3483 const char *outparam; /* parameters passed back to user space */
3485 /* convert compatibility eject ioctls into floppy eject ioctl.
3486 * We do this in order to provide a means to eject floppy disks before
3487 * installing the new fdutils package */
3488 if (cmd == CDROMEJECT || /* CD-ROM eject */
3489 cmd == 0x6470) { /* SunOS floppy eject */
3490 DPRINT("obsolete eject ioctl\n");
3491 DPRINT("please use floppycontrol --eject\n");
3492 cmd = FDEJECT;
3495 if (!((cmd & 0xff00) == 0x0200))
3496 return -EINVAL;
3498 /* convert the old style command into a new style command */
3499 ECALL(normalize_ioctl(&cmd, &size));
3501 /* permission checks */
3502 if (((cmd & 0x40) && !FD_IOCTL_ALLOWED) ||
3503 ((cmd & 0x80) && !capable(CAP_SYS_ADMIN)))
3504 return -EPERM;
3506 if (WARN_ON(size < 0 || size > sizeof(inparam)))
3507 return -EINVAL;
3509 /* copyin */
3510 memset(&inparam, 0, sizeof(inparam));
3511 if (_IOC_DIR(cmd) & _IOC_WRITE)
3512 ECALL(fd_copyin((void __user *)param, &inparam, size));
3514 switch (cmd) {
3515 case FDEJECT:
3516 if (UDRS->fd_ref != 1)
3517 /* somebody else has this drive open */
3518 return -EBUSY;
3519 if (lock_fdc(drive, 1))
3520 return -EINTR;
3522 /* do the actual eject. Fails on
3523 * non-Sparc architectures */
3524 ret = fd_eject(UNIT(drive));
3526 USETF(FD_DISK_CHANGED);
3527 USETF(FD_VERIFY);
3528 process_fd_request();
3529 return ret;
3530 case FDCLRPRM:
3531 if (lock_fdc(drive, 1))
3532 return -EINTR;
3533 current_type[drive] = NULL;
3534 floppy_sizes[drive] = MAX_DISK_SIZE << 1;
3535 UDRS->keep_data = 0;
3536 return invalidate_drive(bdev);
3537 case FDSETPRM:
3538 case FDDEFPRM:
3539 return set_geometry(cmd, &inparam.g, drive, type, bdev);
3540 case FDGETPRM:
3541 ECALL(get_floppy_geometry(drive, type,
3542 (struct floppy_struct **)
3543 &outparam));
3544 break;
3545 case FDMSGON:
3546 UDP->flags |= FTD_MSG;
3547 return 0;
3548 case FDMSGOFF:
3549 UDP->flags &= ~FTD_MSG;
3550 return 0;
3551 case FDFMTBEG:
3552 if (lock_fdc(drive, 1))
3553 return -EINTR;
3554 CALL(poll_drive(1, FD_RAW_NEED_DISK));
3555 ret = UDRS->flags;
3556 process_fd_request();
3557 if (ret & FD_VERIFY)
3558 return -ENODEV;
3559 if (!(ret & FD_DISK_WRITABLE))
3560 return -EROFS;
3561 return 0;
3562 case FDFMTTRK:
3563 if (UDRS->fd_ref != 1)
3564 return -EBUSY;
3565 return do_format(drive, &inparam.f);
3566 case FDFMTEND:
3567 case FDFLUSH:
3568 if (lock_fdc(drive, 1))
3569 return -EINTR;
3570 return invalidate_drive(bdev);
3571 case FDSETEMSGTRESH:
3572 UDP->max_errors.reporting = (unsigned short)(param & 0x0f);
3573 return 0;
3574 case FDGETMAXERRS:
3575 outparam = (const char *)&UDP->max_errors;
3576 break;
3577 case FDSETMAXERRS:
3578 UDP->max_errors = inparam.max_errors;
3579 break;
3580 case FDGETDRVTYP:
3581 outparam = drive_name(type, drive);
3582 SUPBOUND(size, strlen(outparam) + 1);
3583 break;
3584 case FDSETDRVPRM:
3585 *UDP = inparam.dp;
3586 break;
3587 case FDGETDRVPRM:
3588 outparam = (const char *)UDP;
3589 break;
3590 case FDPOLLDRVSTAT:
3591 if (lock_fdc(drive, 1))
3592 return -EINTR;
3593 CALL(poll_drive(1, FD_RAW_NEED_DISK));
3594 process_fd_request();
3595 /* fall through */
3596 case FDGETDRVSTAT:
3597 outparam = (const char *)UDRS;
3598 break;
3599 case FDRESET:
3600 return user_reset_fdc(drive, (int)param, 1);
3601 case FDGETFDCSTAT:
3602 outparam = (const char *)UFDCS;
3603 break;
3604 case FDWERRORCLR:
3605 memset(UDRWE, 0, sizeof(*UDRWE));
3606 return 0;
3607 case FDWERRORGET:
3608 outparam = (const char *)UDRWE;
3609 break;
3610 case FDRAWCMD:
3611 if (type)
3612 return -EINVAL;
3613 if (lock_fdc(drive, 1))
3614 return -EINTR;
3615 set_floppy(drive);
3616 CALL(i = raw_cmd_ioctl(cmd, (void __user *)param));
3617 process_fd_request();
3618 return i;
3619 case FDTWADDLE:
3620 if (lock_fdc(drive, 1))
3621 return -EINTR;
3622 twaddle();
3623 process_fd_request();
3624 return 0;
3625 default:
3626 return -EINVAL;
3629 if (_IOC_DIR(cmd) & _IOC_READ)
3630 return fd_copyout((void __user *)param, outparam, size);
3632 return 0;
3635 static void __init config_types(void)
3637 bool has_drive = false;
3638 int drive;
3640 /* read drive info out of physical CMOS */
3641 drive = 0;
3642 if (!UDP->cmos)
3643 UDP->cmos = FLOPPY0_TYPE;
3644 drive = 1;
3645 if (!UDP->cmos && FLOPPY1_TYPE)
3646 UDP->cmos = FLOPPY1_TYPE;
3648 /* FIXME: additional physical CMOS drive detection should go here */
3650 for (drive = 0; drive < N_DRIVE; drive++) {
3651 unsigned int type = UDP->cmos;
3652 struct floppy_drive_params *params;
3653 const char *name = NULL;
3654 static char temparea[32];
3656 if (type < ARRAY_SIZE(default_drive_params)) {
3657 params = &default_drive_params[type].params;
3658 if (type) {
3659 name = default_drive_params[type].name;
3660 allowed_drive_mask |= 1 << drive;
3661 } else
3662 allowed_drive_mask &= ~(1 << drive);
3663 } else {
3664 params = &default_drive_params[0].params;
3665 sprintf(temparea, "unknown type %d (usb?)", type);
3666 name = temparea;
3668 if (name) {
3669 const char *prepend;
3670 if (!has_drive) {
3671 prepend = "";
3672 has_drive = true;
3673 pr_info("Floppy drive(s):");
3674 } else {
3675 prepend = ",";
3678 pr_cont("%s fd%d is %s", prepend, drive, name);
3680 *UDP = *params;
3683 if (has_drive)
3684 pr_cont("\n");
3687 static int floppy_release(struct gendisk *disk, fmode_t mode)
3689 int drive = (long)disk->private_data;
3691 mutex_lock(&open_lock);
3692 if (UDRS->fd_ref < 0)
3693 UDRS->fd_ref = 0;
3694 else if (!UDRS->fd_ref--) {
3695 DPRINT("floppy_release with fd_ref == 0");
3696 UDRS->fd_ref = 0;
3698 if (!UDRS->fd_ref)
3699 opened_bdev[drive] = NULL;
3700 mutex_unlock(&open_lock);
3702 return 0;
3706 * floppy_open check for aliasing (/dev/fd0 can be the same as
3707 * /dev/PS0 etc), and disallows simultaneous access to the same
3708 * drive with different device numbers.
3710 static int floppy_open(struct block_device *bdev, fmode_t mode)
3712 int drive = (long)bdev->bd_disk->private_data;
3713 int old_dev, new_dev;
3714 int try;
3715 int res = -EBUSY;
3716 char *tmp;
3718 mutex_lock(&open_lock);
3719 old_dev = UDRS->fd_device;
3720 if (opened_bdev[drive] && opened_bdev[drive] != bdev)
3721 goto out2;
3723 if (!UDRS->fd_ref && (UDP->flags & FD_BROKEN_DCL)) {
3724 USETF(FD_DISK_CHANGED);
3725 USETF(FD_VERIFY);
3728 if (UDRS->fd_ref == -1 || (UDRS->fd_ref && (mode & FMODE_EXCL)))
3729 goto out2;
3731 if (mode & FMODE_EXCL)
3732 UDRS->fd_ref = -1;
3733 else
3734 UDRS->fd_ref++;
3736 opened_bdev[drive] = bdev;
3738 res = -ENXIO;
3740 if (!floppy_track_buffer) {
3741 /* if opening an ED drive, reserve a big buffer,
3742 * else reserve a small one */
3743 if ((UDP->cmos == 6) || (UDP->cmos == 5))
3744 try = 64; /* Only 48 actually useful */
3745 else
3746 try = 32; /* Only 24 actually useful */
3748 tmp = (char *)fd_dma_mem_alloc(1024 * try);
3749 if (!tmp && !floppy_track_buffer) {
3750 try >>= 1; /* buffer only one side */
3751 INFBOUND(try, 16);
3752 tmp = (char *)fd_dma_mem_alloc(1024 * try);
3754 if (!tmp && !floppy_track_buffer)
3755 fallback_on_nodma_alloc(&tmp, 2048 * try);
3756 if (!tmp && !floppy_track_buffer) {
3757 DPRINT("Unable to allocate DMA memory\n");
3758 goto out;
3760 if (floppy_track_buffer) {
3761 if (tmp)
3762 fd_dma_mem_free((unsigned long)tmp, try * 1024);
3763 } else {
3764 buffer_min = buffer_max = -1;
3765 floppy_track_buffer = tmp;
3766 max_buffer_sectors = try;
3770 new_dev = MINOR(bdev->bd_dev);
3771 UDRS->fd_device = new_dev;
3772 set_capacity(disks[drive], floppy_sizes[new_dev]);
3773 if (old_dev != -1 && old_dev != new_dev) {
3774 if (buffer_drive == drive)
3775 buffer_track = -1;
3778 if (UFDCS->rawcmd == 1)
3779 UFDCS->rawcmd = 2;
3781 if (!(mode & FMODE_NDELAY)) {
3782 if (mode & (FMODE_READ|FMODE_WRITE)) {
3783 UDRS->last_checked = 0;
3784 check_disk_change(bdev);
3785 if (UTESTF(FD_DISK_CHANGED))
3786 goto out;
3788 res = -EROFS;
3789 if ((mode & FMODE_WRITE) && !(UTESTF(FD_DISK_WRITABLE)))
3790 goto out;
3792 mutex_unlock(&open_lock);
3793 return 0;
3794 out:
3795 if (UDRS->fd_ref < 0)
3796 UDRS->fd_ref = 0;
3797 else
3798 UDRS->fd_ref--;
3799 if (!UDRS->fd_ref)
3800 opened_bdev[drive] = NULL;
3801 out2:
3802 mutex_unlock(&open_lock);
3803 return res;
3807 * Check if the disk has been changed or if a change has been faked.
3809 static int check_floppy_change(struct gendisk *disk)
3811 int drive = (long)disk->private_data;
3813 if (UTESTF(FD_DISK_CHANGED) || UTESTF(FD_VERIFY))
3814 return 1;
3816 if (time_after(jiffies, UDRS->last_checked + UDP->checkfreq)) {
3817 lock_fdc(drive, 0);
3818 poll_drive(0, 0);
3819 process_fd_request();
3822 if (UTESTF(FD_DISK_CHANGED) ||
3823 UTESTF(FD_VERIFY) ||
3824 test_bit(drive, &fake_change) ||
3825 (!ITYPE(UDRS->fd_device) && !current_type[drive]))
3826 return 1;
3827 return 0;
3831 * This implements "read block 0" for floppy_revalidate().
3832 * Needed for format autodetection, checking whether there is
3833 * a disk in the drive, and whether that disk is writable.
3836 static void floppy_rb0_complete(struct bio *bio, int err)
3838 complete((struct completion *)bio->bi_private);
3841 static int __floppy_read_block_0(struct block_device *bdev)
3843 struct bio bio;
3844 struct bio_vec bio_vec;
3845 struct completion complete;
3846 struct page *page;
3847 size_t size;
3849 page = alloc_page(GFP_NOIO);
3850 if (!page) {
3851 process_fd_request();
3852 return -ENOMEM;
3855 size = bdev->bd_block_size;
3856 if (!size)
3857 size = 1024;
3859 bio_init(&bio);
3860 bio.bi_io_vec = &bio_vec;
3861 bio_vec.bv_page = page;
3862 bio_vec.bv_len = size;
3863 bio_vec.bv_offset = 0;
3864 bio.bi_vcnt = 1;
3865 bio.bi_idx = 0;
3866 bio.bi_size = size;
3867 bio.bi_bdev = bdev;
3868 bio.bi_sector = 0;
3869 init_completion(&complete);
3870 bio.bi_private = &complete;
3871 bio.bi_end_io = floppy_rb0_complete;
3873 submit_bio(READ, &bio);
3874 generic_unplug_device(bdev_get_queue(bdev));
3875 process_fd_request();
3876 wait_for_completion(&complete);
3878 __free_page(page);
3880 return 0;
3883 /* revalidate the floppy disk, i.e. trigger format autodetection by reading
3884 * the bootblock (block 0). "Autodetection" is also needed to check whether
3885 * there is a disk in the drive at all... Thus we also do it for fixed
3886 * geometry formats */
3887 static int floppy_revalidate(struct gendisk *disk)
3889 int drive = (long)disk->private_data;
3890 #define NO_GEOM (!current_type[drive] && !ITYPE(UDRS->fd_device))
3891 int cf;
3892 int res = 0;
3894 if (UTESTF(FD_DISK_CHANGED) ||
3895 UTESTF(FD_VERIFY) || test_bit(drive, &fake_change) || NO_GEOM) {
3896 if (usage_count == 0) {
3897 pr_info("VFS: revalidate called on non-open device.\n");
3898 return -EFAULT;
3900 lock_fdc(drive, 0);
3901 cf = UTESTF(FD_DISK_CHANGED) || UTESTF(FD_VERIFY);
3902 if (!(cf || test_bit(drive, &fake_change) || NO_GEOM)) {
3903 process_fd_request(); /*already done by another thread */
3904 return 0;
3906 UDRS->maxblock = 0;
3907 UDRS->maxtrack = 0;
3908 if (buffer_drive == drive)
3909 buffer_track = -1;
3910 clear_bit(drive, &fake_change);
3911 UCLEARF(FD_DISK_CHANGED);
3912 if (cf)
3913 UDRS->generation++;
3914 if (NO_GEOM) {
3915 /* auto-sensing */
3916 res = __floppy_read_block_0(opened_bdev[drive]);
3917 } else {
3918 if (cf)
3919 poll_drive(0, FD_RAW_NEED_DISK);
3920 process_fd_request();
3923 set_capacity(disk, floppy_sizes[UDRS->fd_device]);
3924 return res;
3927 static const struct block_device_operations floppy_fops = {
3928 .owner = THIS_MODULE,
3929 .open = floppy_open,
3930 .release = floppy_release,
3931 .locked_ioctl = fd_ioctl,
3932 .getgeo = fd_getgeo,
3933 .media_changed = check_floppy_change,
3934 .revalidate_disk = floppy_revalidate,
3938 * Floppy Driver initialization
3939 * =============================
3942 /* Determine the floppy disk controller type */
3943 /* This routine was written by David C. Niemi */
3944 static char __init get_fdc_version(void)
3946 int r;
3948 output_byte(FD_DUMPREGS); /* 82072 and better know DUMPREGS */
3949 if (FDCS->reset)
3950 return FDC_NONE;
3951 r = result();
3952 if (r <= 0x00)
3953 return FDC_NONE; /* No FDC present ??? */
3954 if ((r == 1) && (reply_buffer[0] == 0x80)) {
3955 pr_info("FDC %d is an 8272A\n", fdc);
3956 return FDC_8272A; /* 8272a/765 don't know DUMPREGS */
3958 if (r != 10) {
3959 pr_info("FDC %d init: DUMPREGS: unexpected return of %d bytes.\n",
3960 fdc, r);
3961 return FDC_UNKNOWN;
3964 if (!fdc_configure()) {
3965 pr_info("FDC %d is an 82072\n", fdc);
3966 return FDC_82072; /* 82072 doesn't know CONFIGURE */
3969 output_byte(FD_PERPENDICULAR);
3970 if (need_more_output() == MORE_OUTPUT) {
3971 output_byte(0);
3972 } else {
3973 pr_info("FDC %d is an 82072A\n", fdc);
3974 return FDC_82072A; /* 82072A as found on Sparcs. */
3977 output_byte(FD_UNLOCK);
3978 r = result();
3979 if ((r == 1) && (reply_buffer[0] == 0x80)) {
3980 pr_info("FDC %d is a pre-1991 82077\n", fdc);
3981 return FDC_82077_ORIG; /* Pre-1991 82077, doesn't know
3982 * LOCK/UNLOCK */
3984 if ((r != 1) || (reply_buffer[0] != 0x00)) {
3985 pr_info("FDC %d init: UNLOCK: unexpected return of %d bytes.\n",
3986 fdc, r);
3987 return FDC_UNKNOWN;
3989 output_byte(FD_PARTID);
3990 r = result();
3991 if (r != 1) {
3992 pr_info("FDC %d init: PARTID: unexpected return of %d bytes.\n",
3993 fdc, r);
3994 return FDC_UNKNOWN;
3996 if (reply_buffer[0] == 0x80) {
3997 pr_info("FDC %d is a post-1991 82077\n", fdc);
3998 return FDC_82077; /* Revised 82077AA passes all the tests */
4000 switch (reply_buffer[0] >> 5) {
4001 case 0x0:
4002 /* Either a 82078-1 or a 82078SL running at 5Volt */
4003 pr_info("FDC %d is an 82078.\n", fdc);
4004 return FDC_82078;
4005 case 0x1:
4006 pr_info("FDC %d is a 44pin 82078\n", fdc);
4007 return FDC_82078;
4008 case 0x2:
4009 pr_info("FDC %d is a S82078B\n", fdc);
4010 return FDC_S82078B;
4011 case 0x3:
4012 pr_info("FDC %d is a National Semiconductor PC87306\n", fdc);
4013 return FDC_87306;
4014 default:
4015 pr_info("FDC %d init: 82078 variant with unknown PARTID=%d.\n",
4016 fdc, reply_buffer[0] >> 5);
4017 return FDC_82078_UNKN;
4019 } /* get_fdc_version */
4021 /* lilo configuration */
4023 static void __init floppy_set_flags(int *ints, int param, int param2)
4025 int i;
4027 for (i = 0; i < ARRAY_SIZE(default_drive_params); i++) {
4028 if (param)
4029 default_drive_params[i].params.flags |= param2;
4030 else
4031 default_drive_params[i].params.flags &= ~param2;
4033 DPRINT("%s flag 0x%x\n", param2 ? "Setting" : "Clearing", param);
4036 static void __init daring(int *ints, int param, int param2)
4038 int i;
4040 for (i = 0; i < ARRAY_SIZE(default_drive_params); i++) {
4041 if (param) {
4042 default_drive_params[i].params.select_delay = 0;
4043 default_drive_params[i].params.flags |=
4044 FD_SILENT_DCL_CLEAR;
4045 } else {
4046 default_drive_params[i].params.select_delay =
4047 2 * HZ / 100;
4048 default_drive_params[i].params.flags &=
4049 ~FD_SILENT_DCL_CLEAR;
4052 DPRINT("Assuming %s floppy hardware\n", param ? "standard" : "broken");
4055 static void __init set_cmos(int *ints, int dummy, int dummy2)
4057 int current_drive = 0;
4059 if (ints[0] != 2) {
4060 DPRINT("wrong number of parameters for CMOS\n");
4061 return;
4063 current_drive = ints[1];
4064 if (current_drive < 0 || current_drive >= 8) {
4065 DPRINT("bad drive for set_cmos\n");
4066 return;
4068 #if N_FDC > 1
4069 if (current_drive >= 4 && !FDC2)
4070 FDC2 = 0x370;
4071 #endif
4072 DP->cmos = ints[2];
4073 DPRINT("setting CMOS code to %d\n", ints[2]);
4076 static struct param_table {
4077 const char *name;
4078 void (*fn) (int *ints, int param, int param2);
4079 int *var;
4080 int def_param;
4081 int param2;
4082 } config_params[] __initdata = {
4083 {"allowed_drive_mask", NULL, &allowed_drive_mask, 0xff, 0}, /* obsolete */
4084 {"all_drives", NULL, &allowed_drive_mask, 0xff, 0}, /* obsolete */
4085 {"asus_pci", NULL, &allowed_drive_mask, 0x33, 0},
4086 {"irq", NULL, &FLOPPY_IRQ, 6, 0},
4087 {"dma", NULL, &FLOPPY_DMA, 2, 0},
4088 {"daring", daring, NULL, 1, 0},
4089 #if N_FDC > 1
4090 {"two_fdc", NULL, &FDC2, 0x370, 0},
4091 {"one_fdc", NULL, &FDC2, 0, 0},
4092 #endif
4093 {"thinkpad", floppy_set_flags, NULL, 1, FD_INVERTED_DCL},
4094 {"broken_dcl", floppy_set_flags, NULL, 1, FD_BROKEN_DCL},
4095 {"messages", floppy_set_flags, NULL, 1, FTD_MSG},
4096 {"silent_dcl_clear", floppy_set_flags, NULL, 1, FD_SILENT_DCL_CLEAR},
4097 {"debug", floppy_set_flags, NULL, 1, FD_DEBUG},
4098 {"nodma", NULL, &can_use_virtual_dma, 1, 0},
4099 {"omnibook", NULL, &can_use_virtual_dma, 1, 0},
4100 {"yesdma", NULL, &can_use_virtual_dma, 0, 0},
4101 {"fifo_depth", NULL, &fifo_depth, 0xa, 0},
4102 {"nofifo", NULL, &no_fifo, 0x20, 0},
4103 {"usefifo", NULL, &no_fifo, 0, 0},
4104 {"cmos", set_cmos, NULL, 0, 0},
4105 {"slow", NULL, &slow_floppy, 1, 0},
4106 {"unexpected_interrupts", NULL, &print_unex, 1, 0},
4107 {"no_unexpected_interrupts", NULL, &print_unex, 0, 0},
4108 {"L40SX", NULL, &print_unex, 0, 0}
4110 EXTRA_FLOPPY_PARAMS
4113 static int __init floppy_setup(char *str)
4115 int i;
4116 int param;
4117 int ints[11];
4119 str = get_options(str, ARRAY_SIZE(ints), ints);
4120 if (str) {
4121 for (i = 0; i < ARRAY_SIZE(config_params); i++) {
4122 if (strcmp(str, config_params[i].name) == 0) {
4123 if (ints[0])
4124 param = ints[1];
4125 else
4126 param = config_params[i].def_param;
4127 if (config_params[i].fn)
4128 config_params[i].fn(ints, param,
4129 config_params[i].
4130 param2);
4131 if (config_params[i].var) {
4132 DPRINT("%s=%d\n", str, param);
4133 *config_params[i].var = param;
4135 return 1;
4139 if (str) {
4140 DPRINT("unknown floppy option [%s]\n", str);
4142 DPRINT("allowed options are:");
4143 for (i = 0; i < ARRAY_SIZE(config_params); i++)
4144 pr_cont(" %s", config_params[i].name);
4145 pr_cont("\n");
4146 } else
4147 DPRINT("botched floppy option\n");
4148 DPRINT("Read Documentation/blockdev/floppy.txt\n");
4149 return 0;
4152 static int have_no_fdc = -ENODEV;
4154 static ssize_t floppy_cmos_show(struct device *dev,
4155 struct device_attribute *attr, char *buf)
4157 struct platform_device *p = to_platform_device(dev);
4158 int drive;
4160 drive = p->id;
4161 return sprintf(buf, "%X\n", UDP->cmos);
4164 DEVICE_ATTR(cmos, S_IRUGO, floppy_cmos_show, NULL);
4166 static void floppy_device_release(struct device *dev)
4170 static int floppy_resume(struct device *dev)
4172 int fdc;
4174 for (fdc = 0; fdc < N_FDC; fdc++)
4175 if (FDCS->address != -1)
4176 user_reset_fdc(-1, FD_RESET_ALWAYS, 0);
4178 return 0;
4181 static const struct dev_pm_ops floppy_pm_ops = {
4182 .resume = floppy_resume,
4183 .restore = floppy_resume,
4186 static struct platform_driver floppy_driver = {
4187 .driver = {
4188 .name = "floppy",
4189 .pm = &floppy_pm_ops,
4193 static struct platform_device floppy_device[N_DRIVE];
4195 static struct kobject *floppy_find(dev_t dev, int *part, void *data)
4197 int drive = (*part & 3) | ((*part & 0x80) >> 5);
4198 if (drive >= N_DRIVE ||
4199 !(allowed_drive_mask & (1 << drive)) ||
4200 fdc_state[FDC(drive)].version == FDC_NONE)
4201 return NULL;
4202 if (((*part >> 2) & 0x1f) >= ARRAY_SIZE(floppy_type))
4203 return NULL;
4204 *part = 0;
4205 return get_disk(disks[drive]);
4208 static int __init floppy_init(void)
4210 int i, unit, drive;
4211 int err, dr;
4213 #if defined(CONFIG_PPC)
4214 if (check_legacy_ioport(FDC1))
4215 return -ENODEV;
4216 #endif
4218 raw_cmd = NULL;
4220 for (dr = 0; dr < N_DRIVE; dr++) {
4221 disks[dr] = alloc_disk(1);
4222 if (!disks[dr]) {
4223 err = -ENOMEM;
4224 goto out_put_disk;
4227 disks[dr]->major = FLOPPY_MAJOR;
4228 disks[dr]->first_minor = TOMINOR(dr);
4229 disks[dr]->fops = &floppy_fops;
4230 sprintf(disks[dr]->disk_name, "fd%d", dr);
4232 init_timer(&motor_off_timer[dr]);
4233 motor_off_timer[dr].data = dr;
4234 motor_off_timer[dr].function = motor_off_callback;
4237 err = register_blkdev(FLOPPY_MAJOR, "fd");
4238 if (err)
4239 goto out_put_disk;
4241 err = platform_driver_register(&floppy_driver);
4242 if (err)
4243 goto out_unreg_blkdev;
4245 floppy_queue = blk_init_queue(do_fd_request, &floppy_lock);
4246 if (!floppy_queue) {
4247 err = -ENOMEM;
4248 goto out_unreg_driver;
4250 blk_queue_max_hw_sectors(floppy_queue, 64);
4252 blk_register_region(MKDEV(FLOPPY_MAJOR, 0), 256, THIS_MODULE,
4253 floppy_find, NULL, NULL);
4255 for (i = 0; i < 256; i++)
4256 if (ITYPE(i))
4257 floppy_sizes[i] = floppy_type[ITYPE(i)].size;
4258 else
4259 floppy_sizes[i] = MAX_DISK_SIZE << 1;
4261 reschedule_timeout(MAXTIMEOUT, "floppy init", MAXTIMEOUT);
4262 config_types();
4264 for (i = 0; i < N_FDC; i++) {
4265 fdc = i;
4266 memset(FDCS, 0, sizeof(*FDCS));
4267 FDCS->dtr = -1;
4268 FDCS->dor = 0x4;
4269 #if defined(__sparc__) || defined(__mc68000__)
4270 /*sparcs/sun3x don't have a DOR reset which we can fall back on to */
4271 #ifdef __mc68000__
4272 if (MACH_IS_SUN3X)
4273 #endif
4274 FDCS->version = FDC_82072A;
4275 #endif
4278 use_virtual_dma = can_use_virtual_dma & 1;
4279 fdc_state[0].address = FDC1;
4280 if (fdc_state[0].address == -1) {
4281 del_timer(&fd_timeout);
4282 err = -ENODEV;
4283 goto out_unreg_region;
4285 #if N_FDC > 1
4286 fdc_state[1].address = FDC2;
4287 #endif
4289 fdc = 0; /* reset fdc in case of unexpected interrupt */
4290 err = floppy_grab_irq_and_dma();
4291 if (err) {
4292 del_timer(&fd_timeout);
4293 err = -EBUSY;
4294 goto out_unreg_region;
4297 /* initialise drive state */
4298 for (drive = 0; drive < N_DRIVE; drive++) {
4299 memset(UDRS, 0, sizeof(*UDRS));
4300 memset(UDRWE, 0, sizeof(*UDRWE));
4301 USETF(FD_DISK_NEWCHANGE);
4302 USETF(FD_DISK_CHANGED);
4303 USETF(FD_VERIFY);
4304 UDRS->fd_device = -1;
4305 floppy_track_buffer = NULL;
4306 max_buffer_sectors = 0;
4309 * Small 10 msec delay to let through any interrupt that
4310 * initialization might have triggered, to not
4311 * confuse detection:
4313 msleep(10);
4315 for (i = 0; i < N_FDC; i++) {
4316 fdc = i;
4317 FDCS->driver_version = FD_DRIVER_VERSION;
4318 for (unit = 0; unit < 4; unit++)
4319 FDCS->track[unit] = 0;
4320 if (FDCS->address == -1)
4321 continue;
4322 FDCS->rawcmd = 2;
4323 if (user_reset_fdc(-1, FD_RESET_ALWAYS, 0)) {
4324 /* free ioports reserved by floppy_grab_irq_and_dma() */
4325 floppy_release_regions(fdc);
4326 FDCS->address = -1;
4327 FDCS->version = FDC_NONE;
4328 continue;
4330 /* Try to determine the floppy controller type */
4331 FDCS->version = get_fdc_version();
4332 if (FDCS->version == FDC_NONE) {
4333 /* free ioports reserved by floppy_grab_irq_and_dma() */
4334 floppy_release_regions(fdc);
4335 FDCS->address = -1;
4336 continue;
4338 if (can_use_virtual_dma == 2 && FDCS->version < FDC_82072A)
4339 can_use_virtual_dma = 0;
4341 have_no_fdc = 0;
4342 /* Not all FDCs seem to be able to handle the version command
4343 * properly, so force a reset for the standard FDC clones,
4344 * to avoid interrupt garbage.
4346 user_reset_fdc(-1, FD_RESET_ALWAYS, 0);
4348 fdc = 0;
4349 del_timer(&fd_timeout);
4350 current_drive = 0;
4351 initialising = 0;
4352 if (have_no_fdc) {
4353 DPRINT("no floppy controllers found\n");
4354 err = have_no_fdc;
4355 goto out_flush_work;
4358 for (drive = 0; drive < N_DRIVE; drive++) {
4359 if (!(allowed_drive_mask & (1 << drive)))
4360 continue;
4361 if (fdc_state[FDC(drive)].version == FDC_NONE)
4362 continue;
4364 floppy_device[drive].name = floppy_device_name;
4365 floppy_device[drive].id = drive;
4366 floppy_device[drive].dev.release = floppy_device_release;
4368 err = platform_device_register(&floppy_device[drive]);
4369 if (err)
4370 goto out_flush_work;
4372 err = device_create_file(&floppy_device[drive].dev,
4373 &dev_attr_cmos);
4374 if (err)
4375 goto out_unreg_platform_dev;
4377 /* to be cleaned up... */
4378 disks[drive]->private_data = (void *)(long)drive;
4379 disks[drive]->queue = floppy_queue;
4380 disks[drive]->flags |= GENHD_FL_REMOVABLE;
4381 disks[drive]->driverfs_dev = &floppy_device[drive].dev;
4382 add_disk(disks[drive]);
4385 return 0;
4387 out_unreg_platform_dev:
4388 platform_device_unregister(&floppy_device[drive]);
4389 out_flush_work:
4390 flush_scheduled_work();
4391 if (usage_count)
4392 floppy_release_irq_and_dma();
4393 out_unreg_region:
4394 blk_unregister_region(MKDEV(FLOPPY_MAJOR, 0), 256);
4395 blk_cleanup_queue(floppy_queue);
4396 out_unreg_driver:
4397 platform_driver_unregister(&floppy_driver);
4398 out_unreg_blkdev:
4399 unregister_blkdev(FLOPPY_MAJOR, "fd");
4400 out_put_disk:
4401 while (dr--) {
4402 del_timer(&motor_off_timer[dr]);
4403 put_disk(disks[dr]);
4405 return err;
4408 static DEFINE_SPINLOCK(floppy_usage_lock);
4410 static const struct io_region {
4411 int offset;
4412 int size;
4413 } io_regions[] = {
4414 { 2, 1 },
4415 /* address + 3 is sometimes reserved by pnp bios for motherboard */
4416 { 4, 2 },
4417 /* address + 6 is reserved, and may be taken by IDE.
4418 * Unfortunately, Adaptec doesn't know this :-(, */
4419 { 7, 1 },
4422 static void floppy_release_allocated_regions(int fdc, const struct io_region *p)
4424 while (p != io_regions) {
4425 p--;
4426 release_region(FDCS->address + p->offset, p->size);
4430 #define ARRAY_END(X) (&((X)[ARRAY_SIZE(X)]))
4432 static int floppy_request_regions(int fdc)
4434 const struct io_region *p;
4436 for (p = io_regions; p < ARRAY_END(io_regions); p++) {
4437 if (!request_region(FDCS->address + p->offset,
4438 p->size, "floppy")) {
4439 DPRINT("Floppy io-port 0x%04lx in use\n",
4440 FDCS->address + p->offset);
4441 floppy_release_allocated_regions(fdc, p);
4442 return -EBUSY;
4445 return 0;
4448 static void floppy_release_regions(int fdc)
4450 floppy_release_allocated_regions(fdc, ARRAY_END(io_regions));
4453 static int floppy_grab_irq_and_dma(void)
4455 unsigned long flags;
4457 spin_lock_irqsave(&floppy_usage_lock, flags);
4458 if (usage_count++) {
4459 spin_unlock_irqrestore(&floppy_usage_lock, flags);
4460 return 0;
4462 spin_unlock_irqrestore(&floppy_usage_lock, flags);
4465 * We might have scheduled a free_irq(), wait it to
4466 * drain first:
4468 flush_scheduled_work();
4470 if (fd_request_irq()) {
4471 DPRINT("Unable to grab IRQ%d for the floppy driver\n",
4472 FLOPPY_IRQ);
4473 spin_lock_irqsave(&floppy_usage_lock, flags);
4474 usage_count--;
4475 spin_unlock_irqrestore(&floppy_usage_lock, flags);
4476 return -1;
4478 if (fd_request_dma()) {
4479 DPRINT("Unable to grab DMA%d for the floppy driver\n",
4480 FLOPPY_DMA);
4481 if (can_use_virtual_dma & 2)
4482 use_virtual_dma = can_use_virtual_dma = 1;
4483 if (!(can_use_virtual_dma & 1)) {
4484 fd_free_irq();
4485 spin_lock_irqsave(&floppy_usage_lock, flags);
4486 usage_count--;
4487 spin_unlock_irqrestore(&floppy_usage_lock, flags);
4488 return -1;
4492 for (fdc = 0; fdc < N_FDC; fdc++) {
4493 if (FDCS->address != -1) {
4494 if (floppy_request_regions(fdc))
4495 goto cleanup;
4498 for (fdc = 0; fdc < N_FDC; fdc++) {
4499 if (FDCS->address != -1) {
4500 reset_fdc_info(1);
4501 fd_outb(FDCS->dor, FD_DOR);
4504 fdc = 0;
4505 set_dor(0, ~0, 8); /* avoid immediate interrupt */
4507 for (fdc = 0; fdc < N_FDC; fdc++)
4508 if (FDCS->address != -1)
4509 fd_outb(FDCS->dor, FD_DOR);
4511 * The driver will try and free resources and relies on us
4512 * to know if they were allocated or not.
4514 fdc = 0;
4515 irqdma_allocated = 1;
4516 return 0;
4517 cleanup:
4518 fd_free_irq();
4519 fd_free_dma();
4520 while (--fdc >= 0)
4521 floppy_release_regions(fdc);
4522 spin_lock_irqsave(&floppy_usage_lock, flags);
4523 usage_count--;
4524 spin_unlock_irqrestore(&floppy_usage_lock, flags);
4525 return -1;
4528 static void floppy_release_irq_and_dma(void)
4530 int old_fdc;
4531 #ifdef FLOPPY_SANITY_CHECK
4532 #ifndef __sparc__
4533 int drive;
4534 #endif
4535 #endif
4536 long tmpsize;
4537 unsigned long tmpaddr;
4538 unsigned long flags;
4540 spin_lock_irqsave(&floppy_usage_lock, flags);
4541 if (--usage_count) {
4542 spin_unlock_irqrestore(&floppy_usage_lock, flags);
4543 return;
4545 spin_unlock_irqrestore(&floppy_usage_lock, flags);
4546 if (irqdma_allocated) {
4547 fd_disable_dma();
4548 fd_free_dma();
4549 fd_free_irq();
4550 irqdma_allocated = 0;
4552 set_dor(0, ~0, 8);
4553 #if N_FDC > 1
4554 set_dor(1, ~8, 0);
4555 #endif
4556 floppy_enable_hlt();
4558 if (floppy_track_buffer && max_buffer_sectors) {
4559 tmpsize = max_buffer_sectors * 1024;
4560 tmpaddr = (unsigned long)floppy_track_buffer;
4561 floppy_track_buffer = NULL;
4562 max_buffer_sectors = 0;
4563 buffer_min = buffer_max = -1;
4564 fd_dma_mem_free(tmpaddr, tmpsize);
4566 #ifdef FLOPPY_SANITY_CHECK
4567 #ifndef __sparc__
4568 for (drive = 0; drive < N_FDC * 4; drive++)
4569 if (timer_pending(motor_off_timer + drive))
4570 pr_info("motor off timer %d still active\n", drive);
4571 #endif
4573 if (timer_pending(&fd_timeout))
4574 pr_info("floppy timer still active:%s\n", timeout_message);
4575 if (timer_pending(&fd_timer))
4576 pr_info("auxiliary floppy timer still active\n");
4577 if (work_pending(&floppy_work))
4578 pr_info("work still pending\n");
4579 #endif
4580 old_fdc = fdc;
4581 for (fdc = 0; fdc < N_FDC; fdc++)
4582 if (FDCS->address != -1)
4583 floppy_release_regions(fdc);
4584 fdc = old_fdc;
4587 #ifdef MODULE
4589 static char *floppy;
4591 static void __init parse_floppy_cfg_string(char *cfg)
4593 char *ptr;
4595 while (*cfg) {
4596 ptr = cfg;
4597 while (*cfg && *cfg != ' ' && *cfg != '\t')
4598 cfg++;
4599 if (*cfg) {
4600 *cfg = '\0';
4601 cfg++;
4603 if (*ptr)
4604 floppy_setup(ptr);
4608 static int __init floppy_module_init(void)
4610 if (floppy)
4611 parse_floppy_cfg_string(floppy);
4612 return floppy_init();
4614 module_init(floppy_module_init);
4616 static void __exit floppy_module_exit(void)
4618 int drive;
4620 blk_unregister_region(MKDEV(FLOPPY_MAJOR, 0), 256);
4621 unregister_blkdev(FLOPPY_MAJOR, "fd");
4622 platform_driver_unregister(&floppy_driver);
4624 for (drive = 0; drive < N_DRIVE; drive++) {
4625 del_timer_sync(&motor_off_timer[drive]);
4627 if ((allowed_drive_mask & (1 << drive)) &&
4628 fdc_state[FDC(drive)].version != FDC_NONE) {
4629 del_gendisk(disks[drive]);
4630 device_remove_file(&floppy_device[drive].dev, &dev_attr_cmos);
4631 platform_device_unregister(&floppy_device[drive]);
4633 put_disk(disks[drive]);
4636 del_timer_sync(&fd_timeout);
4637 del_timer_sync(&fd_timer);
4638 blk_cleanup_queue(floppy_queue);
4640 if (usage_count)
4641 floppy_release_irq_and_dma();
4643 /* eject disk, if any */
4644 fd_eject(0);
4647 module_exit(floppy_module_exit);
4649 module_param(floppy, charp, 0);
4650 module_param(FLOPPY_IRQ, int, 0);
4651 module_param(FLOPPY_DMA, int, 0);
4652 MODULE_AUTHOR("Alain L. Knaff");
4653 MODULE_SUPPORTED_DEVICE("fd");
4654 MODULE_LICENSE("GPL");
4656 /* This doesn't actually get used other than for module information */
4657 static const struct pnp_device_id floppy_pnpids[] = {
4658 {"PNP0700", 0},
4662 MODULE_DEVICE_TABLE(pnp, floppy_pnpids);
4664 #else
4666 __setup("floppy=", floppy_setup);
4667 module_init(floppy_init)
4668 #endif
4670 MODULE_ALIAS_BLOCKDEV_MAJOR(FLOPPY_MAJOR);