Merge git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6
[wrt350n-kernel.git] / drivers / block / floppy.c
blob314457f8cb9ac7d7aa244816145297de7a047a57
1 /*
2 * linux/drivers/block/floppy.c
4 * Copyright (C) 1991, 1992 Linus Torvalds
5 * Copyright (C) 1993, 1994 Alain Knaff
6 * Copyright (C) 1998 Alan Cox
7 */
9 /*
10 * 02.12.91 - Changed to static variables to indicate need for reset
11 * and recalibrate. This makes some things easier (output_byte reset
12 * checking etc), and means less interrupt jumping in case of errors,
13 * so the code is hopefully easier to understand.
17 * This file is certainly a mess. I've tried my best to get it working,
18 * but I don't like programming floppies, and I have only one anyway.
19 * Urgel. I should check for more errors, and do more graceful error
20 * recovery. Seems there are problems with several drives. I've tried to
21 * correct them. No promises.
25 * As with hd.c, all routines within this file can (and will) be called
26 * by interrupts, so extreme caution is needed. A hardware interrupt
27 * handler may not sleep, or a kernel panic will happen. Thus I cannot
28 * call "floppy-on" directly, but have to set a special timer interrupt
29 * etc.
33 * 28.02.92 - made track-buffering routines, based on the routines written
34 * by entropy@wintermute.wpi.edu (Lawrence Foard). Linus.
38 * Automatic floppy-detection and formatting written by Werner Almesberger
39 * (almesber@nessie.cs.id.ethz.ch), who also corrected some problems with
40 * the floppy-change signal detection.
44 * 1992/7/22 -- Hennus Bergman: Added better error reporting, fixed
45 * FDC data overrun bug, added some preliminary stuff for vertical
46 * recording support.
48 * 1992/9/17: Added DMA allocation & DMA functions. -- hhb.
50 * TODO: Errors are still not counted properly.
53 /* 1992/9/20
54 * Modifications for ``Sector Shifting'' by Rob Hooft (hooft@chem.ruu.nl)
55 * modeled after the freeware MS-DOS program fdformat/88 V1.8 by
56 * Christoph H. Hochst\"atter.
57 * I have fixed the shift values to the ones I always use. Maybe a new
58 * ioctl() should be created to be able to modify them.
59 * There is a bug in the driver that makes it impossible to format a
60 * floppy as the first thing after bootup.
64 * 1993/4/29 -- Linus -- cleaned up the timer handling in the kernel, and
65 * this helped the floppy driver as well. Much cleaner, and still seems to
66 * work.
69 /* 1994/6/24 --bbroad-- added the floppy table entries and made
70 * minor modifications to allow 2.88 floppies to be run.
73 /* 1994/7/13 -- Paul Vojta -- modified the probing code to allow three or more
74 * disk types.
78 * 1994/8/8 -- Alain Knaff -- Switched to fdpatch driver: Support for bigger
79 * format bug fixes, but unfortunately some new bugs too...
82 /* 1994/9/17 -- Koen Holtman -- added logging of physical floppy write
83 * errors to allow safe writing by specialized programs.
86 /* 1995/4/24 -- Dan Fandrich -- added support for Commodore 1581 3.5" disks
87 * by defining bit 1 of the "stretch" parameter to mean put sectors on the
88 * opposite side of the disk, leaving the sector IDs alone (i.e. Commodore's
89 * drives are "upside-down").
93 * 1995/8/26 -- Andreas Busse -- added Mips support.
97 * 1995/10/18 -- Ralf Baechle -- Portability cleanup; move machine dependent
98 * features to asm/floppy.h.
102 * 1998/1/21 -- Richard Gooch <rgooch@atnf.csiro.au> -- devfs support
106 * 1998/05/07 -- Russell King -- More portability cleanups; moved definition of
107 * interrupt and dma channel to asm/floppy.h. Cleaned up some formatting &
108 * use of '0' for NULL.
112 * 1998/06/07 -- Alan Cox -- Merged the 2.0.34 fixes for resource allocation
113 * failures.
117 * 1998/09/20 -- David Weinehall -- Added slow-down code for buggy PS/2-drives.
121 * 1999/08/13 -- Paul Slootman -- floppy stopped working on Alpha after 24
122 * days, 6 hours, 32 minutes and 32 seconds (i.e. MAXINT jiffies; ints were
123 * being used to store jiffies, which are unsigned longs).
127 * 2000/08/28 -- Arnaldo Carvalho de Melo <acme@conectiva.com.br>
128 * - get rid of check_region
129 * - s/suser/capable/
133 * 2001/08/26 -- Paul Gortmaker - fix insmod oops on machines with no
134 * floppy controller (lingering task on list after module is gone... boom.)
138 * 2002/02/07 -- Anton Altaparmakov - Fix io ports reservation to correct range
139 * (0x3f2-0x3f5, 0x3f7). This fix is a bit of a hack but the proper fix
140 * requires many non-obvious changes in arch dependent code.
143 /* 2003/07/28 -- Daniele Bellucci <bellucda@tiscali.it>.
144 * Better audit of register_blkdev.
147 #define FLOPPY_SANITY_CHECK
148 #undef FLOPPY_SILENT_DCL_CLEAR
150 #define REALLY_SLOW_IO
152 #define DEBUGT 2
153 #define DCL_DEBUG /* debug disk change line */
155 /* do print messages for unexpected interrupts */
156 static int print_unex = 1;
157 #include <linux/module.h>
158 #include <linux/sched.h>
159 #include <linux/fs.h>
160 #include <linux/kernel.h>
161 #include <linux/timer.h>
162 #include <linux/workqueue.h>
163 #define FDPATCHES
164 #include <linux/fdreg.h>
165 #include <linux/fd.h>
166 #include <linux/hdreg.h>
167 #include <linux/errno.h>
168 #include <linux/slab.h>
169 #include <linux/mm.h>
170 #include <linux/bio.h>
171 #include <linux/string.h>
172 #include <linux/jiffies.h>
173 #include <linux/fcntl.h>
174 #include <linux/delay.h>
175 #include <linux/mc146818rtc.h> /* CMOS defines */
176 #include <linux/ioport.h>
177 #include <linux/interrupt.h>
178 #include <linux/init.h>
179 #include <linux/platform_device.h>
180 #include <linux/buffer_head.h> /* for invalidate_buffers() */
181 #include <linux/mutex.h>
184 * PS/2 floppies have much slower step rates than regular floppies.
185 * It's been recommended that take about 1/4 of the default speed
186 * in some more extreme cases.
188 static int slow_floppy;
190 #include <asm/dma.h>
191 #include <asm/irq.h>
192 #include <asm/system.h>
193 #include <asm/io.h>
194 #include <asm/uaccess.h>
196 static int FLOPPY_IRQ = 6;
197 static int FLOPPY_DMA = 2;
198 static int can_use_virtual_dma = 2;
199 /* =======
200 * can use virtual DMA:
201 * 0 = use of virtual DMA disallowed by config
202 * 1 = use of virtual DMA prescribed by config
203 * 2 = no virtual DMA preference configured. By default try hard DMA,
204 * but fall back on virtual DMA when not enough memory available
207 static int use_virtual_dma;
208 /* =======
209 * use virtual DMA
210 * 0 using hard DMA
211 * 1 using virtual DMA
212 * This variable is set to virtual when a DMA mem problem arises, and
213 * reset back in floppy_grab_irq_and_dma.
214 * It is not safe to reset it in other circumstances, because the floppy
215 * driver may have several buffers in use at once, and we do currently not
216 * record each buffers capabilities
219 static DEFINE_SPINLOCK(floppy_lock);
220 <<<<<<< HEAD:drivers/block/floppy.c
221 static struct completion device_release;
222 =======
223 >>>>>>> 264e3e889d86e552b4191d69bb60f4f3b383135a:drivers/block/floppy.c
225 static unsigned short virtual_dma_port = 0x3f0;
226 irqreturn_t floppy_interrupt(int irq, void *dev_id);
227 static int set_dor(int fdc, char mask, char data);
229 #define K_64 0x10000 /* 64KB */
231 /* the following is the mask of allowed drives. By default units 2 and
232 * 3 of both floppy controllers are disabled, because switching on the
233 * motor of these drives causes system hangs on some PCI computers. drive
234 * 0 is the low bit (0x1), and drive 7 is the high bit (0x80). Bits are on if
235 * a drive is allowed.
237 * NOTE: This must come before we include the arch floppy header because
238 * some ports reference this variable from there. -DaveM
241 static int allowed_drive_mask = 0x33;
243 #include <asm/floppy.h>
245 static int irqdma_allocated;
247 #define DEVICE_NAME "floppy"
249 #include <linux/blkdev.h>
250 #include <linux/blkpg.h>
251 #include <linux/cdrom.h> /* for the compatibility eject ioctl */
252 #include <linux/completion.h>
254 static struct request *current_req;
255 static struct request_queue *floppy_queue;
256 static void do_fd_request(struct request_queue * q);
258 #ifndef fd_get_dma_residue
259 #define fd_get_dma_residue() get_dma_residue(FLOPPY_DMA)
260 #endif
262 /* Dma Memory related stuff */
264 #ifndef fd_dma_mem_free
265 #define fd_dma_mem_free(addr, size) free_pages(addr, get_order(size))
266 #endif
268 #ifndef fd_dma_mem_alloc
269 #define fd_dma_mem_alloc(size) __get_dma_pages(GFP_KERNEL,get_order(size))
270 #endif
272 static inline void fallback_on_nodma_alloc(char **addr, size_t l)
274 #ifdef FLOPPY_CAN_FALLBACK_ON_NODMA
275 if (*addr)
276 return; /* we have the memory */
277 if (can_use_virtual_dma != 2)
278 return; /* no fallback allowed */
279 printk("DMA memory shortage. Temporarily falling back on virtual DMA\n");
280 *addr = (char *)nodma_mem_alloc(l);
281 #else
282 return;
283 #endif
286 /* End dma memory related stuff */
288 static unsigned long fake_change;
289 static int initialising = 1;
291 #define ITYPE(x) (((x)>>2) & 0x1f)
292 #define TOMINOR(x) ((x & 3) | ((x & 4) << 5))
293 #define UNIT(x) ((x) & 0x03) /* drive on fdc */
294 #define FDC(x) (((x) & 0x04) >> 2) /* fdc of drive */
295 /* reverse mapping from unit and fdc to drive */
296 #define REVDRIVE(fdc, unit) ((unit) + ((fdc) << 2))
297 #define DP (&drive_params[current_drive])
298 #define DRS (&drive_state[current_drive])
299 #define DRWE (&write_errors[current_drive])
300 #define FDCS (&fdc_state[fdc])
301 #define CLEARF(x) clear_bit(x##_BIT, &DRS->flags)
302 #define SETF(x) set_bit(x##_BIT, &DRS->flags)
303 #define TESTF(x) test_bit(x##_BIT, &DRS->flags)
305 #define UDP (&drive_params[drive])
306 #define UDRS (&drive_state[drive])
307 #define UDRWE (&write_errors[drive])
308 #define UFDCS (&fdc_state[FDC(drive)])
309 #define UCLEARF(x) clear_bit(x##_BIT, &UDRS->flags)
310 #define USETF(x) set_bit(x##_BIT, &UDRS->flags)
311 #define UTESTF(x) test_bit(x##_BIT, &UDRS->flags)
313 #define DPRINT(format, args...) printk(DEVICE_NAME "%d: " format, current_drive , ## args)
315 #define PH_HEAD(floppy,head) (((((floppy)->stretch & 2) >>1) ^ head) << 2)
316 #define STRETCH(floppy) ((floppy)->stretch & FD_STRETCH)
318 #define CLEARSTRUCT(x) memset((x), 0, sizeof(*(x)))
320 /* read/write */
321 #define COMMAND raw_cmd->cmd[0]
322 #define DR_SELECT raw_cmd->cmd[1]
323 #define TRACK raw_cmd->cmd[2]
324 #define HEAD raw_cmd->cmd[3]
325 #define SECTOR raw_cmd->cmd[4]
326 #define SIZECODE raw_cmd->cmd[5]
327 #define SECT_PER_TRACK raw_cmd->cmd[6]
328 #define GAP raw_cmd->cmd[7]
329 #define SIZECODE2 raw_cmd->cmd[8]
330 #define NR_RW 9
332 /* format */
333 #define F_SIZECODE raw_cmd->cmd[2]
334 #define F_SECT_PER_TRACK raw_cmd->cmd[3]
335 #define F_GAP raw_cmd->cmd[4]
336 #define F_FILL raw_cmd->cmd[5]
337 #define NR_F 6
340 * Maximum disk size (in kilobytes). This default is used whenever the
341 * current disk size is unknown.
342 * [Now it is rather a minimum]
344 #define MAX_DISK_SIZE 4 /* 3984 */
347 * globals used by 'result()'
349 #define MAX_REPLIES 16
350 static unsigned char reply_buffer[MAX_REPLIES];
351 static int inr; /* size of reply buffer, when called from interrupt */
352 #define ST0 (reply_buffer[0])
353 #define ST1 (reply_buffer[1])
354 #define ST2 (reply_buffer[2])
355 #define ST3 (reply_buffer[0]) /* result of GETSTATUS */
356 #define R_TRACK (reply_buffer[3])
357 #define R_HEAD (reply_buffer[4])
358 #define R_SECTOR (reply_buffer[5])
359 #define R_SIZECODE (reply_buffer[6])
360 #define SEL_DLY (2*HZ/100)
363 * this struct defines the different floppy drive types.
365 static struct {
366 struct floppy_drive_params params;
367 const char *name; /* name printed while booting */
368 } default_drive_params[] = {
369 /* NOTE: the time values in jiffies should be in msec!
370 CMOS drive type
371 | Maximum data rate supported by drive type
372 | | Head load time, msec
373 | | | Head unload time, msec (not used)
374 | | | | Step rate interval, usec
375 | | | | | Time needed for spinup time (jiffies)
376 | | | | | | Timeout for spinning down (jiffies)
377 | | | | | | | Spindown offset (where disk stops)
378 | | | | | | | | Select delay
379 | | | | | | | | | RPS
380 | | | | | | | | | | Max number of tracks
381 | | | | | | | | | | | Interrupt timeout
382 | | | | | | | | | | | | Max nonintlv. sectors
383 | | | | | | | | | | | | | -Max Errors- flags */
384 {{0, 500, 16, 16, 8000, 1*HZ, 3*HZ, 0, SEL_DLY, 5, 80, 3*HZ, 20, {3,1,2,0,2}, 0,
385 0, { 7, 4, 8, 2, 1, 5, 3,10}, 3*HZ/2, 0 }, "unknown" },
387 {{1, 300, 16, 16, 8000, 1*HZ, 3*HZ, 0, SEL_DLY, 5, 40, 3*HZ, 17, {3,1,2,0,2}, 0,
388 0, { 1, 0, 0, 0, 0, 0, 0, 0}, 3*HZ/2, 1 }, "360K PC" }, /*5 1/4 360 KB PC*/
390 {{2, 500, 16, 16, 6000, 4*HZ/10, 3*HZ, 14, SEL_DLY, 6, 83, 3*HZ, 17, {3,1,2,0,2}, 0,
391 0, { 2, 5, 6,23,10,20,12, 0}, 3*HZ/2, 2 }, "1.2M" }, /*5 1/4 HD AT*/
393 {{3, 250, 16, 16, 3000, 1*HZ, 3*HZ, 0, SEL_DLY, 5, 83, 3*HZ, 20, {3,1,2,0,2}, 0,
394 0, { 4,22,21,30, 3, 0, 0, 0}, 3*HZ/2, 4 }, "720k" }, /*3 1/2 DD*/
396 {{4, 500, 16, 16, 4000, 4*HZ/10, 3*HZ, 10, SEL_DLY, 5, 83, 3*HZ, 20, {3,1,2,0,2}, 0,
397 0, { 7, 4,25,22,31,21,29,11}, 3*HZ/2, 7 }, "1.44M" }, /*3 1/2 HD*/
399 {{5, 1000, 15, 8, 3000, 4*HZ/10, 3*HZ, 10, SEL_DLY, 5, 83, 3*HZ, 40, {3,1,2,0,2}, 0,
400 0, { 7, 8, 4,25,28,22,31,21}, 3*HZ/2, 8 }, "2.88M AMI BIOS" }, /*3 1/2 ED*/
402 {{6, 1000, 15, 8, 3000, 4*HZ/10, 3*HZ, 10, SEL_DLY, 5, 83, 3*HZ, 40, {3,1,2,0,2}, 0,
403 0, { 7, 8, 4,25,28,22,31,21}, 3*HZ/2, 8 }, "2.88M" } /*3 1/2 ED*/
404 /* | --autodetected formats--- | | |
405 * read_track | | Name printed when booting
406 * | Native format
407 * Frequency of disk change checks */
410 static struct floppy_drive_params drive_params[N_DRIVE];
411 static struct floppy_drive_struct drive_state[N_DRIVE];
412 static struct floppy_write_errors write_errors[N_DRIVE];
413 static struct timer_list motor_off_timer[N_DRIVE];
414 static struct gendisk *disks[N_DRIVE];
415 static struct block_device *opened_bdev[N_DRIVE];
416 static DEFINE_MUTEX(open_lock);
417 static struct floppy_raw_cmd *raw_cmd, default_raw_cmd;
420 * This struct defines the different floppy types.
422 * Bit 0 of 'stretch' tells if the tracks need to be doubled for some
423 * types (e.g. 360kB diskette in 1.2MB drive, etc.). Bit 1 of 'stretch'
424 * tells if the disk is in Commodore 1581 format, which means side 0 sectors
425 * are located on side 1 of the disk but with a side 0 ID, and vice-versa.
426 * This is the same as the Sharp MZ-80 5.25" CP/M disk format, except that the
427 * 1581's logical side 0 is on physical side 1, whereas the Sharp's logical
428 * side 0 is on physical side 0 (but with the misnamed sector IDs).
429 * 'stretch' should probably be renamed to something more general, like
430 * 'options'. Other parameters should be self-explanatory (see also
431 * setfdprm(8)).
434 Size
435 | Sectors per track
436 | | Head
437 | | | Tracks
438 | | | | Stretch
439 | | | | | Gap 1 size
440 | | | | | | Data rate, | 0x40 for perp
441 | | | | | | | Spec1 (stepping rate, head unload
442 | | | | | | | | /fmt gap (gap2) */
443 static struct floppy_struct floppy_type[32] = {
444 { 0, 0,0, 0,0,0x00,0x00,0x00,0x00,NULL }, /* 0 no testing */
445 { 720, 9,2,40,0,0x2A,0x02,0xDF,0x50,"d360" }, /* 1 360KB PC */
446 { 2400,15,2,80,0,0x1B,0x00,0xDF,0x54,"h1200" }, /* 2 1.2MB AT */
447 { 720, 9,1,80,0,0x2A,0x02,0xDF,0x50,"D360" }, /* 3 360KB SS 3.5" */
448 { 1440, 9,2,80,0,0x2A,0x02,0xDF,0x50,"D720" }, /* 4 720KB 3.5" */
449 { 720, 9,2,40,1,0x23,0x01,0xDF,0x50,"h360" }, /* 5 360KB AT */
450 { 1440, 9,2,80,0,0x23,0x01,0xDF,0x50,"h720" }, /* 6 720KB AT */
451 { 2880,18,2,80,0,0x1B,0x00,0xCF,0x6C,"H1440" }, /* 7 1.44MB 3.5" */
452 { 5760,36,2,80,0,0x1B,0x43,0xAF,0x54,"E2880" }, /* 8 2.88MB 3.5" */
453 { 6240,39,2,80,0,0x1B,0x43,0xAF,0x28,"E3120" }, /* 9 3.12MB 3.5" */
455 { 2880,18,2,80,0,0x25,0x00,0xDF,0x02,"h1440" }, /* 10 1.44MB 5.25" */
456 { 3360,21,2,80,0,0x1C,0x00,0xCF,0x0C,"H1680" }, /* 11 1.68MB 3.5" */
457 { 820,10,2,41,1,0x25,0x01,0xDF,0x2E,"h410" }, /* 12 410KB 5.25" */
458 { 1640,10,2,82,0,0x25,0x02,0xDF,0x2E,"H820" }, /* 13 820KB 3.5" */
459 { 2952,18,2,82,0,0x25,0x00,0xDF,0x02,"h1476" }, /* 14 1.48MB 5.25" */
460 { 3444,21,2,82,0,0x25,0x00,0xDF,0x0C,"H1722" }, /* 15 1.72MB 3.5" */
461 { 840,10,2,42,1,0x25,0x01,0xDF,0x2E,"h420" }, /* 16 420KB 5.25" */
462 { 1660,10,2,83,0,0x25,0x02,0xDF,0x2E,"H830" }, /* 17 830KB 3.5" */
463 { 2988,18,2,83,0,0x25,0x00,0xDF,0x02,"h1494" }, /* 18 1.49MB 5.25" */
464 { 3486,21,2,83,0,0x25,0x00,0xDF,0x0C,"H1743" }, /* 19 1.74 MB 3.5" */
466 { 1760,11,2,80,0,0x1C,0x09,0xCF,0x00,"h880" }, /* 20 880KB 5.25" */
467 { 2080,13,2,80,0,0x1C,0x01,0xCF,0x00,"D1040" }, /* 21 1.04MB 3.5" */
468 { 2240,14,2,80,0,0x1C,0x19,0xCF,0x00,"D1120" }, /* 22 1.12MB 3.5" */
469 { 3200,20,2,80,0,0x1C,0x20,0xCF,0x2C,"h1600" }, /* 23 1.6MB 5.25" */
470 { 3520,22,2,80,0,0x1C,0x08,0xCF,0x2e,"H1760" }, /* 24 1.76MB 3.5" */
471 { 3840,24,2,80,0,0x1C,0x20,0xCF,0x00,"H1920" }, /* 25 1.92MB 3.5" */
472 { 6400,40,2,80,0,0x25,0x5B,0xCF,0x00,"E3200" }, /* 26 3.20MB 3.5" */
473 { 7040,44,2,80,0,0x25,0x5B,0xCF,0x00,"E3520" }, /* 27 3.52MB 3.5" */
474 { 7680,48,2,80,0,0x25,0x63,0xCF,0x00,"E3840" }, /* 28 3.84MB 3.5" */
475 { 3680,23,2,80,0,0x1C,0x10,0xCF,0x00,"H1840" }, /* 29 1.84MB 3.5" */
477 { 1600,10,2,80,0,0x25,0x02,0xDF,0x2E,"D800" }, /* 30 800KB 3.5" */
478 { 3200,20,2,80,0,0x1C,0x00,0xCF,0x2C,"H1600" }, /* 31 1.6MB 3.5" */
481 #define SECTSIZE (_FD_SECTSIZE(*floppy))
483 /* Auto-detection: Disk type used until the next media change occurs. */
484 static struct floppy_struct *current_type[N_DRIVE];
487 * User-provided type information. current_type points to
488 * the respective entry of this array.
490 static struct floppy_struct user_params[N_DRIVE];
492 static sector_t floppy_sizes[256];
494 static char floppy_device_name[] = "floppy";
497 * The driver is trying to determine the correct media format
498 * while probing is set. rw_interrupt() clears it after a
499 * successful access.
501 static int probing;
503 /* Synchronization of FDC access. */
504 #define FD_COMMAND_NONE -1
505 #define FD_COMMAND_ERROR 2
506 #define FD_COMMAND_OKAY 3
508 static volatile int command_status = FD_COMMAND_NONE;
509 static unsigned long fdc_busy;
510 static DECLARE_WAIT_QUEUE_HEAD(fdc_wait);
511 static DECLARE_WAIT_QUEUE_HEAD(command_done);
513 #define NO_SIGNAL (!interruptible || !signal_pending(current))
514 #define CALL(x) if ((x) == -EINTR) return -EINTR
515 #define ECALL(x) if ((ret = (x))) return ret;
516 #define _WAIT(x,i) CALL(ret=wait_til_done((x),i))
517 #define WAIT(x) _WAIT((x),interruptible)
518 #define IWAIT(x) _WAIT((x),1)
520 /* Errors during formatting are counted here. */
521 static int format_errors;
523 /* Format request descriptor. */
524 static struct format_descr format_req;
527 * Rate is 0 for 500kb/s, 1 for 300kbps, 2 for 250kbps
528 * Spec1 is 0xSH, where S is stepping rate (F=1ms, E=2ms, D=3ms etc),
529 * H is head unload time (1=16ms, 2=32ms, etc)
533 * Track buffer
534 * Because these are written to by the DMA controller, they must
535 * not contain a 64k byte boundary crossing, or data will be
536 * corrupted/lost.
538 static char *floppy_track_buffer;
539 static int max_buffer_sectors;
541 static int *errors;
542 typedef void (*done_f)(int);
543 static struct cont_t {
544 void (*interrupt)(void); /* this is called after the interrupt of the
545 * main command */
546 void (*redo)(void); /* this is called to retry the operation */
547 void (*error)(void); /* this is called to tally an error */
548 done_f done; /* this is called to say if the operation has
549 * succeeded/failed */
550 } *cont;
552 static void floppy_ready(void);
553 static void floppy_start(void);
554 static void process_fd_request(void);
555 static void recalibrate_floppy(void);
556 static void floppy_shutdown(unsigned long);
558 static int floppy_grab_irq_and_dma(void);
559 static void floppy_release_irq_and_dma(void);
562 * The "reset" variable should be tested whenever an interrupt is scheduled,
563 * after the commands have been sent. This is to ensure that the driver doesn't
564 * get wedged when the interrupt doesn't come because of a failed command.
565 * reset doesn't need to be tested before sending commands, because
566 * output_byte is automatically disabled when reset is set.
568 #define CHECK_RESET { if (FDCS->reset){ reset_fdc(); return; } }
569 static void reset_fdc(void);
572 * These are global variables, as that's the easiest way to give
573 * information to interrupts. They are the data used for the current
574 * request.
576 #define NO_TRACK -1
577 #define NEED_1_RECAL -2
578 #define NEED_2_RECAL -3
580 static int usage_count;
582 /* buffer related variables */
583 static int buffer_track = -1;
584 static int buffer_drive = -1;
585 static int buffer_min = -1;
586 static int buffer_max = -1;
588 /* fdc related variables, should end up in a struct */
589 static struct floppy_fdc_state fdc_state[N_FDC];
590 static int fdc; /* current fdc */
592 static struct floppy_struct *_floppy = floppy_type;
593 static unsigned char current_drive;
594 static long current_count_sectors;
595 static unsigned char fsector_t; /* sector in track */
596 static unsigned char in_sector_offset; /* offset within physical sector,
597 * expressed in units of 512 bytes */
599 #ifndef fd_eject
600 static inline int fd_eject(int drive)
602 return -EINVAL;
604 #endif
607 * Debugging
608 * =========
610 #ifdef DEBUGT
611 static long unsigned debugtimer;
613 static inline void set_debugt(void)
615 debugtimer = jiffies;
618 static inline void debugt(const char *message)
620 if (DP->flags & DEBUGT)
621 printk("%s dtime=%lu\n", message, jiffies - debugtimer);
623 #else
624 static inline void set_debugt(void) { }
625 static inline void debugt(const char *message) { }
626 #endif /* DEBUGT */
628 typedef void (*timeout_fn) (unsigned long);
629 static DEFINE_TIMER(fd_timeout, floppy_shutdown, 0, 0);
631 static const char *timeout_message;
633 #ifdef FLOPPY_SANITY_CHECK
634 static void is_alive(const char *message)
636 /* this routine checks whether the floppy driver is "alive" */
637 if (test_bit(0, &fdc_busy) && command_status < 2
638 && !timer_pending(&fd_timeout)) {
639 DPRINT("timeout handler died: %s\n", message);
642 #endif
644 static void (*do_floppy) (void) = NULL;
646 #ifdef FLOPPY_SANITY_CHECK
648 #define OLOGSIZE 20
650 static void (*lasthandler) (void);
651 static unsigned long interruptjiffies;
652 static unsigned long resultjiffies;
653 static int resultsize;
654 static unsigned long lastredo;
656 static struct output_log {
657 unsigned char data;
658 unsigned char status;
659 unsigned long jiffies;
660 } output_log[OLOGSIZE];
662 static int output_log_pos;
663 #endif
665 #define current_reqD -1
666 #define MAXTIMEOUT -2
668 static void __reschedule_timeout(int drive, const char *message, int marg)
670 if (drive == current_reqD)
671 drive = current_drive;
672 del_timer(&fd_timeout);
673 if (drive < 0 || drive >= N_DRIVE) {
674 fd_timeout.expires = jiffies + 20UL * HZ;
675 drive = 0;
676 } else
677 fd_timeout.expires = jiffies + UDP->timeout;
678 add_timer(&fd_timeout);
679 if (UDP->flags & FD_DEBUG) {
680 DPRINT("reschedule timeout ");
681 printk(message, marg);
682 printk("\n");
684 timeout_message = message;
687 static void reschedule_timeout(int drive, const char *message, int marg)
689 unsigned long flags;
691 spin_lock_irqsave(&floppy_lock, flags);
692 __reschedule_timeout(drive, message, marg);
693 spin_unlock_irqrestore(&floppy_lock, flags);
696 #define INFBOUND(a,b) (a)=max_t(int, a, b)
697 #define SUPBOUND(a,b) (a)=min_t(int, a, b)
700 * Bottom half floppy driver.
701 * ==========================
703 * This part of the file contains the code talking directly to the hardware,
704 * and also the main service loop (seek-configure-spinup-command)
708 * disk change.
709 * This routine is responsible for maintaining the FD_DISK_CHANGE flag,
710 * and the last_checked date.
712 * last_checked is the date of the last check which showed 'no disk change'
713 * FD_DISK_CHANGE is set under two conditions:
714 * 1. The floppy has been changed after some i/o to that floppy already
715 * took place.
716 * 2. No floppy disk is in the drive. This is done in order to ensure that
717 * requests are quickly flushed in case there is no disk in the drive. It
718 * follows that FD_DISK_CHANGE can only be cleared if there is a disk in
719 * the drive.
721 * For 1., maxblock is observed. Maxblock is 0 if no i/o has taken place yet.
722 * For 2., FD_DISK_NEWCHANGE is watched. FD_DISK_NEWCHANGE is cleared on
723 * each seek. If a disk is present, the disk change line should also be
724 * cleared on each seek. Thus, if FD_DISK_NEWCHANGE is clear, but the disk
725 * change line is set, this means either that no disk is in the drive, or
726 * that it has been removed since the last seek.
728 * This means that we really have a third possibility too:
729 * The floppy has been changed after the last seek.
732 static int disk_change(int drive)
734 int fdc = FDC(drive);
736 #ifdef FLOPPY_SANITY_CHECK
737 if (time_before(jiffies, UDRS->select_date + UDP->select_delay))
738 DPRINT("WARNING disk change called early\n");
739 if (!(FDCS->dor & (0x10 << UNIT(drive))) ||
740 (FDCS->dor & 3) != UNIT(drive) || fdc != FDC(drive)) {
741 DPRINT("probing disk change on unselected drive\n");
742 DPRINT("drive=%d fdc=%d dor=%x\n", drive, FDC(drive),
743 (unsigned int)FDCS->dor);
745 #endif
747 #ifdef DCL_DEBUG
748 if (UDP->flags & FD_DEBUG) {
749 DPRINT("checking disk change line for drive %d\n", drive);
750 DPRINT("jiffies=%lu\n", jiffies);
751 DPRINT("disk change line=%x\n", fd_inb(FD_DIR) & 0x80);
752 DPRINT("flags=%lx\n", UDRS->flags);
754 #endif
755 if (UDP->flags & FD_BROKEN_DCL)
756 return UTESTF(FD_DISK_CHANGED);
757 if ((fd_inb(FD_DIR) ^ UDP->flags) & 0x80) {
758 USETF(FD_VERIFY); /* verify write protection */
759 if (UDRS->maxblock) {
760 /* mark it changed */
761 USETF(FD_DISK_CHANGED);
764 /* invalidate its geometry */
765 if (UDRS->keep_data >= 0) {
766 if ((UDP->flags & FTD_MSG) &&
767 current_type[drive] != NULL)
768 DPRINT("Disk type is undefined after "
769 "disk change\n");
770 current_type[drive] = NULL;
771 floppy_sizes[TOMINOR(drive)] = MAX_DISK_SIZE << 1;
774 return 1;
775 } else {
776 UDRS->last_checked = jiffies;
777 UCLEARF(FD_DISK_NEWCHANGE);
779 return 0;
782 static inline int is_selected(int dor, int unit)
784 return ((dor & (0x10 << unit)) && (dor & 3) == unit);
787 static int set_dor(int fdc, char mask, char data)
789 unsigned char unit;
790 unsigned char drive;
791 unsigned char newdor;
792 unsigned char olddor;
794 if (FDCS->address == -1)
795 return -1;
797 olddor = FDCS->dor;
798 newdor = (olddor & mask) | data;
799 if (newdor != olddor) {
800 unit = olddor & 0x3;
801 if (is_selected(olddor, unit) && !is_selected(newdor, unit)) {
802 drive = REVDRIVE(fdc, unit);
803 #ifdef DCL_DEBUG
804 if (UDP->flags & FD_DEBUG) {
805 DPRINT("calling disk change from set_dor\n");
807 #endif
808 disk_change(drive);
810 FDCS->dor = newdor;
811 fd_outb(newdor, FD_DOR);
813 unit = newdor & 0x3;
814 if (!is_selected(olddor, unit) && is_selected(newdor, unit)) {
815 drive = REVDRIVE(fdc, unit);
816 UDRS->select_date = jiffies;
819 return olddor;
822 static void twaddle(void)
824 if (DP->select_delay)
825 return;
826 fd_outb(FDCS->dor & ~(0x10 << UNIT(current_drive)), FD_DOR);
827 fd_outb(FDCS->dor, FD_DOR);
828 DRS->select_date = jiffies;
831 /* reset all driver information about the current fdc. This is needed after
832 * a reset, and after a raw command. */
833 static void reset_fdc_info(int mode)
835 int drive;
837 FDCS->spec1 = FDCS->spec2 = -1;
838 FDCS->need_configure = 1;
839 FDCS->perp_mode = 1;
840 FDCS->rawcmd = 0;
841 for (drive = 0; drive < N_DRIVE; drive++)
842 if (FDC(drive) == fdc && (mode || UDRS->track != NEED_1_RECAL))
843 UDRS->track = NEED_2_RECAL;
846 /* selects the fdc and drive, and enables the fdc's input/dma. */
847 static void set_fdc(int drive)
849 if (drive >= 0 && drive < N_DRIVE) {
850 fdc = FDC(drive);
851 current_drive = drive;
853 if (fdc != 1 && fdc != 0) {
854 printk("bad fdc value\n");
855 return;
857 set_dor(fdc, ~0, 8);
858 #if N_FDC > 1
859 set_dor(1 - fdc, ~8, 0);
860 #endif
861 if (FDCS->rawcmd == 2)
862 reset_fdc_info(1);
863 if (fd_inb(FD_STATUS) != STATUS_READY)
864 FDCS->reset = 1;
867 /* locks the driver */
868 static int _lock_fdc(int drive, int interruptible, int line)
870 if (!usage_count) {
871 printk(KERN_ERR
872 "Trying to lock fdc while usage count=0 at line %d\n",
873 line);
874 return -1;
877 if (test_and_set_bit(0, &fdc_busy)) {
878 DECLARE_WAITQUEUE(wait, current);
879 add_wait_queue(&fdc_wait, &wait);
881 for (;;) {
882 set_current_state(TASK_INTERRUPTIBLE);
884 if (!test_and_set_bit(0, &fdc_busy))
885 break;
887 schedule();
889 if (!NO_SIGNAL) {
890 remove_wait_queue(&fdc_wait, &wait);
891 return -EINTR;
895 set_current_state(TASK_RUNNING);
896 remove_wait_queue(&fdc_wait, &wait);
897 flush_scheduled_work();
899 command_status = FD_COMMAND_NONE;
901 __reschedule_timeout(drive, "lock fdc", 0);
902 set_fdc(drive);
903 return 0;
906 #define lock_fdc(drive,interruptible) _lock_fdc(drive,interruptible, __LINE__)
908 #define LOCK_FDC(drive,interruptible) \
909 if (lock_fdc(drive,interruptible)) return -EINTR;
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 (elv_next_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");
1027 #endif
1029 if (disk_change(current_drive)) {
1030 DPRINT("disk removed during i/o\n");
1031 cancel_activity();
1032 cont->done(0);
1033 reset_fdc();
1034 } else {
1035 del_timer(&fd_timer);
1036 fd_timer.function = (timeout_fn) fd_watchdog;
1037 fd_timer.expires = jiffies + HZ / 10;
1038 add_timer(&fd_timer);
1042 static void main_command_interrupt(void)
1044 del_timer(&fd_timer);
1045 cont->interrupt();
1048 /* waits for a delay (spinup or select) to pass */
1049 static int fd_wait_for_completion(unsigned long delay, timeout_fn function)
1051 if (FDCS->reset) {
1052 reset_fdc(); /* do the reset during sleep to win time
1053 * if we don't need to sleep, it's a good
1054 * occasion anyways */
1055 return 1;
1058 if (time_before(jiffies, delay)) {
1059 del_timer(&fd_timer);
1060 fd_timer.function = function;
1061 fd_timer.expires = delay;
1062 add_timer(&fd_timer);
1063 return 1;
1065 return 0;
1068 static DEFINE_SPINLOCK(floppy_hlt_lock);
1069 static int hlt_disabled;
1070 static void floppy_disable_hlt(void)
1072 unsigned long flags;
1074 spin_lock_irqsave(&floppy_hlt_lock, flags);
1075 if (!hlt_disabled) {
1076 hlt_disabled = 1;
1077 #ifdef HAVE_DISABLE_HLT
1078 disable_hlt();
1079 #endif
1081 spin_unlock_irqrestore(&floppy_hlt_lock, flags);
1084 static void floppy_enable_hlt(void)
1086 unsigned long flags;
1088 spin_lock_irqsave(&floppy_hlt_lock, flags);
1089 if (hlt_disabled) {
1090 hlt_disabled = 0;
1091 #ifdef HAVE_DISABLE_HLT
1092 enable_hlt();
1093 #endif
1095 spin_unlock_irqrestore(&floppy_hlt_lock, flags);
1098 static void setup_DMA(void)
1100 unsigned long f;
1102 #ifdef FLOPPY_SANITY_CHECK
1103 if (raw_cmd->length == 0) {
1104 int i;
1106 printk("zero dma transfer size:");
1107 for (i = 0; i < raw_cmd->cmd_count; i++)
1108 printk("%x,", raw_cmd->cmd[i]);
1109 printk("\n");
1110 cont->done(0);
1111 FDCS->reset = 1;
1112 return;
1114 if (((unsigned long)raw_cmd->kernel_data) % 512) {
1115 printk("non aligned address: %p\n", raw_cmd->kernel_data);
1116 cont->done(0);
1117 FDCS->reset = 1;
1118 return;
1120 #endif
1121 f = claim_dma_lock();
1122 fd_disable_dma();
1123 #ifdef fd_dma_setup
1124 if (fd_dma_setup(raw_cmd->kernel_data, raw_cmd->length,
1125 (raw_cmd->flags & FD_RAW_READ) ?
1126 DMA_MODE_READ : DMA_MODE_WRITE, FDCS->address) < 0) {
1127 release_dma_lock(f);
1128 cont->done(0);
1129 FDCS->reset = 1;
1130 return;
1132 release_dma_lock(f);
1133 #else
1134 fd_clear_dma_ff();
1135 fd_cacheflush(raw_cmd->kernel_data, raw_cmd->length);
1136 fd_set_dma_mode((raw_cmd->flags & FD_RAW_READ) ?
1137 DMA_MODE_READ : DMA_MODE_WRITE);
1138 fd_set_dma_addr(raw_cmd->kernel_data);
1139 fd_set_dma_count(raw_cmd->length);
1140 virtual_dma_port = FDCS->address;
1141 fd_enable_dma();
1142 release_dma_lock(f);
1143 #endif
1144 floppy_disable_hlt();
1147 static void show_floppy(void);
1149 /* waits until the fdc becomes ready */
1150 static int wait_til_ready(void)
1152 int status;
1153 int counter;
1155 if (FDCS->reset)
1156 return -1;
1157 for (counter = 0; counter < 10000; counter++) {
1158 status = fd_inb(FD_STATUS);
1159 if (status & STATUS_READY)
1160 return status;
1162 if (!initialising) {
1163 DPRINT("Getstatus times out (%x) on fdc %d\n", status, fdc);
1164 show_floppy();
1166 FDCS->reset = 1;
1167 return -1;
1170 /* sends a command byte to the fdc */
1171 static int output_byte(char byte)
1173 int status;
1175 if ((status = wait_til_ready()) < 0)
1176 return -1;
1177 if ((status & (STATUS_READY | STATUS_DIR | STATUS_DMA)) == STATUS_READY) {
1178 fd_outb(byte, FD_DATA);
1179 #ifdef FLOPPY_SANITY_CHECK
1180 output_log[output_log_pos].data = byte;
1181 output_log[output_log_pos].status = status;
1182 output_log[output_log_pos].jiffies = jiffies;
1183 output_log_pos = (output_log_pos + 1) % OLOGSIZE;
1184 #endif
1185 return 0;
1187 FDCS->reset = 1;
1188 if (!initialising) {
1189 DPRINT("Unable to send byte %x to FDC. Fdc=%x Status=%x\n",
1190 byte, fdc, status);
1191 show_floppy();
1193 return -1;
1196 #define LAST_OUT(x) if (output_byte(x)<0){ reset_fdc();return;}
1198 /* gets the response from the fdc */
1199 static int result(void)
1201 int i;
1202 int status = 0;
1204 for (i = 0; i < MAX_REPLIES; i++) {
1205 if ((status = wait_til_ready()) < 0)
1206 break;
1207 status &= STATUS_DIR | STATUS_READY | STATUS_BUSY | STATUS_DMA;
1208 if ((status & ~STATUS_BUSY) == STATUS_READY) {
1209 #ifdef FLOPPY_SANITY_CHECK
1210 resultjiffies = jiffies;
1211 resultsize = i;
1212 #endif
1213 return i;
1215 if (status == (STATUS_DIR | STATUS_READY | STATUS_BUSY))
1216 reply_buffer[i] = fd_inb(FD_DATA);
1217 else
1218 break;
1220 if (!initialising) {
1221 DPRINT
1222 ("get result error. Fdc=%d Last status=%x Read bytes=%d\n",
1223 fdc, status, i);
1224 show_floppy();
1226 FDCS->reset = 1;
1227 return -1;
1230 #define MORE_OUTPUT -2
1231 /* does the fdc need more output? */
1232 static int need_more_output(void)
1234 int status;
1236 if ((status = wait_til_ready()) < 0)
1237 return -1;
1238 if ((status & (STATUS_READY | STATUS_DIR | STATUS_DMA)) == STATUS_READY)
1239 return MORE_OUTPUT;
1240 return result();
1243 /* Set perpendicular mode as required, based on data rate, if supported.
1244 * 82077 Now tested. 1Mbps data rate only possible with 82077-1.
1246 static inline void perpendicular_mode(void)
1248 unsigned char perp_mode;
1250 if (raw_cmd->rate & 0x40) {
1251 switch (raw_cmd->rate & 3) {
1252 case 0:
1253 perp_mode = 2;
1254 break;
1255 case 3:
1256 perp_mode = 3;
1257 break;
1258 default:
1259 DPRINT("Invalid data rate for perpendicular mode!\n");
1260 cont->done(0);
1261 FDCS->reset = 1; /* convenient way to return to
1262 * redo without to much hassle (deep
1263 * stack et al. */
1264 return;
1266 } else
1267 perp_mode = 0;
1269 if (FDCS->perp_mode == perp_mode)
1270 return;
1271 if (FDCS->version >= FDC_82077_ORIG) {
1272 output_byte(FD_PERPENDICULAR);
1273 output_byte(perp_mode);
1274 FDCS->perp_mode = perp_mode;
1275 } else if (perp_mode) {
1276 DPRINT("perpendicular mode not supported by this FDC.\n");
1278 } /* perpendicular_mode */
1280 static int fifo_depth = 0xa;
1281 static int no_fifo;
1283 static int fdc_configure(void)
1285 /* Turn on FIFO */
1286 output_byte(FD_CONFIGURE);
1287 if (need_more_output() != MORE_OUTPUT)
1288 return 0;
1289 output_byte(0);
1290 output_byte(0x10 | (no_fifo & 0x20) | (fifo_depth & 0xf));
1291 output_byte(0); /* pre-compensation from track
1292 0 upwards */
1293 return 1;
1296 #define NOMINAL_DTR 500
1298 /* Issue a "SPECIFY" command to set the step rate time, head unload time,
1299 * head load time, and DMA disable flag to values needed by floppy.
1301 * The value "dtr" is the data transfer rate in Kbps. It is needed
1302 * to account for the data rate-based scaling done by the 82072 and 82077
1303 * FDC types. This parameter is ignored for other types of FDCs (i.e.
1304 * 8272a).
1306 * Note that changing the data transfer rate has a (probably deleterious)
1307 * effect on the parameters subject to scaling for 82072/82077 FDCs, so
1308 * fdc_specify is called again after each data transfer rate
1309 * change.
1311 * srt: 1000 to 16000 in microseconds
1312 * hut: 16 to 240 milliseconds
1313 * hlt: 2 to 254 milliseconds
1315 * These values are rounded up to the next highest available delay time.
1317 static void fdc_specify(void)
1319 unsigned char spec1;
1320 unsigned char spec2;
1321 unsigned long srt;
1322 unsigned long hlt;
1323 unsigned long hut;
1324 unsigned long dtr = NOMINAL_DTR;
1325 unsigned long scale_dtr = NOMINAL_DTR;
1326 int hlt_max_code = 0x7f;
1327 int hut_max_code = 0xf;
1329 if (FDCS->need_configure && FDCS->version >= FDC_82072A) {
1330 fdc_configure();
1331 FDCS->need_configure = 0;
1334 switch (raw_cmd->rate & 0x03) {
1335 case 3:
1336 dtr = 1000;
1337 break;
1338 case 1:
1339 dtr = 300;
1340 if (FDCS->version >= FDC_82078) {
1341 /* chose the default rate table, not the one
1342 * where 1 = 2 Mbps */
1343 output_byte(FD_DRIVESPEC);
1344 if (need_more_output() == MORE_OUTPUT) {
1345 output_byte(UNIT(current_drive));
1346 output_byte(0xc0);
1349 break;
1350 case 2:
1351 dtr = 250;
1352 break;
1355 if (FDCS->version >= FDC_82072) {
1356 scale_dtr = dtr;
1357 hlt_max_code = 0x00; /* 0==256msec*dtr0/dtr (not linear!) */
1358 hut_max_code = 0x0; /* 0==256msec*dtr0/dtr (not linear!) */
1361 /* Convert step rate from microseconds to milliseconds and 4 bits */
1362 srt = 16 - (DP->srt * scale_dtr / 1000 + NOMINAL_DTR - 1) / NOMINAL_DTR;
1363 if (slow_floppy) {
1364 srt = srt / 4;
1366 SUPBOUND(srt, 0xf);
1367 INFBOUND(srt, 0);
1369 hlt = (DP->hlt * scale_dtr / 2 + NOMINAL_DTR - 1) / NOMINAL_DTR;
1370 if (hlt < 0x01)
1371 hlt = 0x01;
1372 else if (hlt > 0x7f)
1373 hlt = hlt_max_code;
1375 hut = (DP->hut * scale_dtr / 16 + NOMINAL_DTR - 1) / NOMINAL_DTR;
1376 if (hut < 0x1)
1377 hut = 0x1;
1378 else if (hut > 0xf)
1379 hut = hut_max_code;
1381 spec1 = (srt << 4) | hut;
1382 spec2 = (hlt << 1) | (use_virtual_dma & 1);
1384 /* If these parameters did not change, just return with success */
1385 if (FDCS->spec1 != spec1 || FDCS->spec2 != spec2) {
1386 /* Go ahead and set spec1 and spec2 */
1387 output_byte(FD_SPECIFY);
1388 output_byte(FDCS->spec1 = spec1);
1389 output_byte(FDCS->spec2 = spec2);
1391 } /* fdc_specify */
1393 /* Set the FDC's data transfer rate on behalf of the specified drive.
1394 * NOTE: with 82072/82077 FDCs, changing the data rate requires a reissue
1395 * of the specify command (i.e. using the fdc_specify function).
1397 static int fdc_dtr(void)
1399 /* If data rate not already set to desired value, set it. */
1400 if ((raw_cmd->rate & 3) == FDCS->dtr)
1401 return 0;
1403 /* Set dtr */
1404 fd_outb(raw_cmd->rate & 3, FD_DCR);
1406 /* TODO: some FDC/drive combinations (C&T 82C711 with TEAC 1.2MB)
1407 * need a stabilization period of several milliseconds to be
1408 * enforced after data rate changes before R/W operations.
1409 * Pause 5 msec to avoid trouble. (Needs to be 2 jiffies)
1411 FDCS->dtr = raw_cmd->rate & 3;
1412 return (fd_wait_for_completion(jiffies + 2UL * HZ / 100,
1413 (timeout_fn) floppy_ready));
1414 } /* fdc_dtr */
1416 static void tell_sector(void)
1418 printk(": track %d, head %d, sector %d, size %d",
1419 R_TRACK, R_HEAD, R_SECTOR, R_SIZECODE);
1420 } /* tell_sector */
1423 * OK, this error interpreting routine is called after a
1424 * DMA read/write has succeeded
1425 * or failed, so we check the results, and copy any buffers.
1426 * hhb: Added better error reporting.
1427 * ak: Made this into a separate routine.
1429 static int interpret_errors(void)
1431 char bad;
1433 if (inr != 7) {
1434 DPRINT("-- FDC reply error");
1435 FDCS->reset = 1;
1436 return 1;
1439 /* check IC to find cause of interrupt */
1440 switch (ST0 & ST0_INTR) {
1441 case 0x40: /* error occurred during command execution */
1442 if (ST1 & ST1_EOC)
1443 return 0; /* occurs with pseudo-DMA */
1444 bad = 1;
1445 if (ST1 & ST1_WP) {
1446 DPRINT("Drive is write protected\n");
1447 CLEARF(FD_DISK_WRITABLE);
1448 cont->done(0);
1449 bad = 2;
1450 } else if (ST1 & ST1_ND) {
1451 SETF(FD_NEED_TWADDLE);
1452 } else if (ST1 & ST1_OR) {
1453 if (DP->flags & FTD_MSG)
1454 DPRINT("Over/Underrun - retrying\n");
1455 bad = 0;
1456 } else if (*errors >= DP->max_errors.reporting) {
1457 DPRINT("");
1458 if (ST0 & ST0_ECE) {
1459 printk("Recalibrate failed!");
1460 } else if (ST2 & ST2_CRC) {
1461 printk("data CRC error");
1462 tell_sector();
1463 } else if (ST1 & ST1_CRC) {
1464 printk("CRC error");
1465 tell_sector();
1466 } else if ((ST1 & (ST1_MAM | ST1_ND))
1467 || (ST2 & ST2_MAM)) {
1468 if (!probing) {
1469 printk("sector not found");
1470 tell_sector();
1471 } else
1472 printk("probe failed...");
1473 } else if (ST2 & ST2_WC) { /* seek error */
1474 printk("wrong cylinder");
1475 } else if (ST2 & ST2_BC) { /* cylinder marked as bad */
1476 printk("bad cylinder");
1477 } else {
1478 printk
1479 ("unknown error. ST[0..2] are: 0x%x 0x%x 0x%x",
1480 ST0, ST1, ST2);
1481 tell_sector();
1483 printk("\n");
1485 if (ST2 & ST2_WC || ST2 & ST2_BC)
1486 /* wrong cylinder => recal */
1487 DRS->track = NEED_2_RECAL;
1488 return bad;
1489 case 0x80: /* invalid command given */
1490 DPRINT("Invalid FDC command given!\n");
1491 cont->done(0);
1492 return 2;
1493 case 0xc0:
1494 DPRINT("Abnormal termination caused by polling\n");
1495 cont->error();
1496 return 2;
1497 default: /* (0) Normal command termination */
1498 return 0;
1503 * This routine is called when everything should be correctly set up
1504 * for the transfer (i.e. floppy motor is on, the correct floppy is
1505 * selected, and the head is sitting on the right track).
1507 static void setup_rw_floppy(void)
1509 int i;
1510 int r;
1511 int flags;
1512 int dflags;
1513 unsigned long ready_date;
1514 timeout_fn function;
1516 flags = raw_cmd->flags;
1517 if (flags & (FD_RAW_READ | FD_RAW_WRITE))
1518 flags |= FD_RAW_INTR;
1520 if ((flags & FD_RAW_SPIN) && !(flags & FD_RAW_NO_MOTOR)) {
1521 ready_date = DRS->spinup_date + DP->spinup;
1522 /* If spinup will take a long time, rerun scandrives
1523 * again just before spinup completion. Beware that
1524 * after scandrives, we must again wait for selection.
1526 if (time_after(ready_date, jiffies + DP->select_delay)) {
1527 ready_date -= DP->select_delay;
1528 function = (timeout_fn) floppy_start;
1529 } else
1530 function = (timeout_fn) setup_rw_floppy;
1532 /* wait until the floppy is spinning fast enough */
1533 if (fd_wait_for_completion(ready_date, function))
1534 return;
1536 dflags = DRS->flags;
1538 if ((flags & FD_RAW_READ) || (flags & FD_RAW_WRITE))
1539 setup_DMA();
1541 if (flags & FD_RAW_INTR)
1542 do_floppy = main_command_interrupt;
1544 r = 0;
1545 for (i = 0; i < raw_cmd->cmd_count; i++)
1546 r |= output_byte(raw_cmd->cmd[i]);
1548 debugt("rw_command: ");
1550 if (r) {
1551 cont->error();
1552 reset_fdc();
1553 return;
1556 if (!(flags & FD_RAW_INTR)) {
1557 inr = result();
1558 cont->interrupt();
1559 } else if (flags & FD_RAW_NEED_DISK)
1560 fd_watchdog();
1563 static int blind_seek;
1566 * This is the routine called after every seek (or recalibrate) interrupt
1567 * from the floppy controller.
1569 static void seek_interrupt(void)
1571 debugt("seek interrupt:");
1572 if (inr != 2 || (ST0 & 0xF8) != 0x20) {
1573 DPRINT("seek failed\n");
1574 DRS->track = NEED_2_RECAL;
1575 cont->error();
1576 cont->redo();
1577 return;
1579 if (DRS->track >= 0 && DRS->track != ST1 && !blind_seek) {
1580 #ifdef DCL_DEBUG
1581 if (DP->flags & FD_DEBUG) {
1582 DPRINT
1583 ("clearing NEWCHANGE flag because of effective seek\n");
1584 DPRINT("jiffies=%lu\n", jiffies);
1586 #endif
1587 CLEARF(FD_DISK_NEWCHANGE); /* effective seek */
1588 DRS->select_date = jiffies;
1590 DRS->track = ST1;
1591 floppy_ready();
1594 static void check_wp(void)
1596 if (TESTF(FD_VERIFY)) {
1597 /* check write protection */
1598 output_byte(FD_GETSTATUS);
1599 output_byte(UNIT(current_drive));
1600 if (result() != 1) {
1601 FDCS->reset = 1;
1602 return;
1604 CLEARF(FD_VERIFY);
1605 CLEARF(FD_NEED_TWADDLE);
1606 #ifdef DCL_DEBUG
1607 if (DP->flags & FD_DEBUG) {
1608 DPRINT("checking whether disk is write protected\n");
1609 DPRINT("wp=%x\n", ST3 & 0x40);
1611 #endif
1612 if (!(ST3 & 0x40))
1613 SETF(FD_DISK_WRITABLE);
1614 else
1615 CLEARF(FD_DISK_WRITABLE);
1619 static void seek_floppy(void)
1621 int track;
1623 blind_seek = 0;
1625 #ifdef DCL_DEBUG
1626 if (DP->flags & FD_DEBUG) {
1627 DPRINT("calling disk change from seek\n");
1629 #endif
1631 if (!TESTF(FD_DISK_NEWCHANGE) &&
1632 disk_change(current_drive) && (raw_cmd->flags & FD_RAW_NEED_DISK)) {
1633 /* the media changed flag should be cleared after the seek.
1634 * If it isn't, this means that there is really no disk in
1635 * the drive.
1637 SETF(FD_DISK_CHANGED);
1638 cont->done(0);
1639 cont->redo();
1640 return;
1642 if (DRS->track <= NEED_1_RECAL) {
1643 recalibrate_floppy();
1644 return;
1645 } else if (TESTF(FD_DISK_NEWCHANGE) &&
1646 (raw_cmd->flags & FD_RAW_NEED_DISK) &&
1647 (DRS->track <= NO_TRACK || DRS->track == raw_cmd->track)) {
1648 /* we seek to clear the media-changed condition. Does anybody
1649 * know a more elegant way, which works on all drives? */
1650 if (raw_cmd->track)
1651 track = raw_cmd->track - 1;
1652 else {
1653 if (DP->flags & FD_SILENT_DCL_CLEAR) {
1654 set_dor(fdc, ~(0x10 << UNIT(current_drive)), 0);
1655 blind_seek = 1;
1656 raw_cmd->flags |= FD_RAW_NEED_SEEK;
1658 track = 1;
1660 } else {
1661 check_wp();
1662 if (raw_cmd->track != DRS->track &&
1663 (raw_cmd->flags & FD_RAW_NEED_SEEK))
1664 track = raw_cmd->track;
1665 else {
1666 setup_rw_floppy();
1667 return;
1671 do_floppy = seek_interrupt;
1672 output_byte(FD_SEEK);
1673 output_byte(UNIT(current_drive));
1674 LAST_OUT(track);
1675 debugt("seek command:");
1678 static void recal_interrupt(void)
1680 debugt("recal interrupt:");
1681 if (inr != 2)
1682 FDCS->reset = 1;
1683 else if (ST0 & ST0_ECE) {
1684 switch (DRS->track) {
1685 case NEED_1_RECAL:
1686 debugt("recal interrupt need 1 recal:");
1687 /* after a second recalibrate, we still haven't
1688 * reached track 0. Probably no drive. Raise an
1689 * error, as failing immediately might upset
1690 * computers possessed by the Devil :-) */
1691 cont->error();
1692 cont->redo();
1693 return;
1694 case NEED_2_RECAL:
1695 debugt("recal interrupt need 2 recal:");
1696 /* If we already did a recalibrate,
1697 * and we are not at track 0, this
1698 * means we have moved. (The only way
1699 * not to move at recalibration is to
1700 * be already at track 0.) Clear the
1701 * new change flag */
1702 #ifdef DCL_DEBUG
1703 if (DP->flags & FD_DEBUG) {
1704 DPRINT
1705 ("clearing NEWCHANGE flag because of second recalibrate\n");
1707 #endif
1709 CLEARF(FD_DISK_NEWCHANGE);
1710 DRS->select_date = jiffies;
1711 /* fall through */
1712 default:
1713 debugt("recal interrupt default:");
1714 /* Recalibrate moves the head by at
1715 * most 80 steps. If after one
1716 * recalibrate we don't have reached
1717 * track 0, this might mean that we
1718 * started beyond track 80. Try
1719 * again. */
1720 DRS->track = NEED_1_RECAL;
1721 break;
1723 } else
1724 DRS->track = ST1;
1725 floppy_ready();
1728 static void print_result(char *message, int inr)
1730 int i;
1732 DPRINT("%s ", message);
1733 if (inr >= 0)
1734 for (i = 0; i < inr; i++)
1735 printk("repl[%d]=%x ", i, reply_buffer[i]);
1736 printk("\n");
1739 /* interrupt handler. Note that this can be called externally on the Sparc */
1740 irqreturn_t floppy_interrupt(int irq, void *dev_id)
1742 int do_print;
1743 unsigned long f;
1744 void (*handler)(void) = do_floppy;
1746 lasthandler = handler;
1747 interruptjiffies = jiffies;
1749 f = claim_dma_lock();
1750 fd_disable_dma();
1751 release_dma_lock(f);
1753 floppy_enable_hlt();
1754 do_floppy = NULL;
1755 if (fdc >= N_FDC || FDCS->address == -1) {
1756 /* we don't even know which FDC is the culprit */
1757 printk("DOR0=%x\n", fdc_state[0].dor);
1758 printk("floppy interrupt on bizarre fdc %d\n", fdc);
1759 printk("handler=%p\n", handler);
1760 is_alive("bizarre fdc");
1761 return IRQ_NONE;
1764 FDCS->reset = 0;
1765 /* We have to clear the reset flag here, because apparently on boxes
1766 * with level triggered interrupts (PS/2, Sparc, ...), it is needed to
1767 * emit SENSEI's to clear the interrupt line. And FDCS->reset blocks the
1768 * emission of the SENSEI's.
1769 * It is OK to emit floppy commands because we are in an interrupt
1770 * handler here, and thus we have to fear no interference of other
1771 * activity.
1774 do_print = !handler && print_unex && !initialising;
1776 inr = result();
1777 if (do_print)
1778 print_result("unexpected interrupt", inr);
1779 if (inr == 0) {
1780 int max_sensei = 4;
1781 do {
1782 output_byte(FD_SENSEI);
1783 inr = result();
1784 if (do_print)
1785 print_result("sensei", inr);
1786 max_sensei--;
1787 } while ((ST0 & 0x83) != UNIT(current_drive) && inr == 2
1788 && max_sensei);
1790 if (!handler) {
1791 FDCS->reset = 1;
1792 return IRQ_NONE;
1794 schedule_bh(handler);
1795 is_alive("normal interrupt end");
1797 /* FIXME! Was it really for us? */
1798 return IRQ_HANDLED;
1801 static void recalibrate_floppy(void)
1803 debugt("recalibrate floppy:");
1804 do_floppy = recal_interrupt;
1805 output_byte(FD_RECALIBRATE);
1806 LAST_OUT(UNIT(current_drive));
1810 * Must do 4 FD_SENSEIs after reset because of ``drive polling''.
1812 static void reset_interrupt(void)
1814 debugt("reset interrupt:");
1815 result(); /* get the status ready for set_fdc */
1816 if (FDCS->reset) {
1817 printk("reset set in interrupt, calling %p\n", cont->error);
1818 cont->error(); /* a reset just after a reset. BAD! */
1820 cont->redo();
1824 * reset is done by pulling bit 2 of DOR low for a while (old FDCs),
1825 * or by setting the self clearing bit 7 of STATUS (newer FDCs)
1827 static void reset_fdc(void)
1829 unsigned long flags;
1831 do_floppy = reset_interrupt;
1832 FDCS->reset = 0;
1833 reset_fdc_info(0);
1835 /* Pseudo-DMA may intercept 'reset finished' interrupt. */
1836 /* Irrelevant for systems with true DMA (i386). */
1838 flags = claim_dma_lock();
1839 fd_disable_dma();
1840 release_dma_lock(flags);
1842 if (FDCS->version >= FDC_82072A)
1843 fd_outb(0x80 | (FDCS->dtr & 3), FD_STATUS);
1844 else {
1845 fd_outb(FDCS->dor & ~0x04, FD_DOR);
1846 udelay(FD_RESET_DELAY);
1847 fd_outb(FDCS->dor, FD_DOR);
1851 static void show_floppy(void)
1853 int i;
1855 printk("\n");
1856 printk("floppy driver state\n");
1857 printk("-------------------\n");
1858 printk("now=%lu last interrupt=%lu diff=%lu last called handler=%p\n",
1859 jiffies, interruptjiffies, jiffies - interruptjiffies,
1860 lasthandler);
1862 #ifdef FLOPPY_SANITY_CHECK
1863 printk("timeout_message=%s\n", timeout_message);
1864 printk("last output bytes:\n");
1865 for (i = 0; i < OLOGSIZE; i++)
1866 printk("%2x %2x %lu\n",
1867 output_log[(i + output_log_pos) % OLOGSIZE].data,
1868 output_log[(i + output_log_pos) % OLOGSIZE].status,
1869 output_log[(i + output_log_pos) % OLOGSIZE].jiffies);
1870 printk("last result at %lu\n", resultjiffies);
1871 printk("last redo_fd_request at %lu\n", lastredo);
1872 for (i = 0; i < resultsize; i++) {
1873 printk("%2x ", reply_buffer[i]);
1875 printk("\n");
1876 #endif
1878 printk("status=%x\n", fd_inb(FD_STATUS));
1879 printk("fdc_busy=%lu\n", fdc_busy);
1880 if (do_floppy)
1881 printk("do_floppy=%p\n", do_floppy);
1882 if (work_pending(&floppy_work))
1883 printk("floppy_work.func=%p\n", floppy_work.func);
1884 if (timer_pending(&fd_timer))
1885 printk("fd_timer.function=%p\n", fd_timer.function);
1886 if (timer_pending(&fd_timeout)) {
1887 printk("timer_function=%p\n", fd_timeout.function);
1888 printk("expires=%lu\n", fd_timeout.expires - jiffies);
1889 printk("now=%lu\n", jiffies);
1891 printk("cont=%p\n", cont);
1892 printk("current_req=%p\n", current_req);
1893 printk("command_status=%d\n", command_status);
1894 printk("\n");
1897 static void floppy_shutdown(unsigned long data)
1899 unsigned long flags;
1901 if (!initialising)
1902 show_floppy();
1903 cancel_activity();
1905 floppy_enable_hlt();
1907 flags = claim_dma_lock();
1908 fd_disable_dma();
1909 release_dma_lock(flags);
1911 /* avoid dma going to a random drive after shutdown */
1913 if (!initialising)
1914 DPRINT("floppy timeout called\n");
1915 FDCS->reset = 1;
1916 if (cont) {
1917 cont->done(0);
1918 cont->redo(); /* this will recall reset when needed */
1919 } else {
1920 printk("no cont in shutdown!\n");
1921 process_fd_request();
1923 is_alive("floppy shutdown");
1926 /* start motor, check media-changed condition and write protection */
1927 static int start_motor(void (*function)(void))
1929 int mask;
1930 int data;
1932 mask = 0xfc;
1933 data = UNIT(current_drive);
1934 if (!(raw_cmd->flags & FD_RAW_NO_MOTOR)) {
1935 if (!(FDCS->dor & (0x10 << UNIT(current_drive)))) {
1936 set_debugt();
1937 /* no read since this drive is running */
1938 DRS->first_read_date = 0;
1939 /* note motor start time if motor is not yet running */
1940 DRS->spinup_date = jiffies;
1941 data |= (0x10 << UNIT(current_drive));
1943 } else if (FDCS->dor & (0x10 << UNIT(current_drive)))
1944 mask &= ~(0x10 << UNIT(current_drive));
1946 /* starts motor and selects floppy */
1947 del_timer(motor_off_timer + current_drive);
1948 set_dor(fdc, mask, data);
1950 /* wait_for_completion also schedules reset if needed. */
1951 return (fd_wait_for_completion(DRS->select_date + DP->select_delay,
1952 (timeout_fn) function));
1955 static void floppy_ready(void)
1957 CHECK_RESET;
1958 if (start_motor(floppy_ready))
1959 return;
1960 if (fdc_dtr())
1961 return;
1963 #ifdef DCL_DEBUG
1964 if (DP->flags & FD_DEBUG) {
1965 DPRINT("calling disk change from floppy_ready\n");
1967 #endif
1968 if (!(raw_cmd->flags & FD_RAW_NO_MOTOR) &&
1969 disk_change(current_drive) && !DP->select_delay)
1970 twaddle(); /* this clears the dcl on certain drive/controller
1971 * combinations */
1973 #ifdef fd_chose_dma_mode
1974 if ((raw_cmd->flags & FD_RAW_READ) || (raw_cmd->flags & FD_RAW_WRITE)) {
1975 unsigned long flags = claim_dma_lock();
1976 fd_chose_dma_mode(raw_cmd->kernel_data, raw_cmd->length);
1977 release_dma_lock(flags);
1979 #endif
1981 if (raw_cmd->flags & (FD_RAW_NEED_SEEK | FD_RAW_NEED_DISK)) {
1982 perpendicular_mode();
1983 fdc_specify(); /* must be done here because of hut, hlt ... */
1984 seek_floppy();
1985 } else {
1986 if ((raw_cmd->flags & FD_RAW_READ) ||
1987 (raw_cmd->flags & FD_RAW_WRITE))
1988 fdc_specify();
1989 setup_rw_floppy();
1993 static void floppy_start(void)
1995 reschedule_timeout(current_reqD, "floppy start", 0);
1997 scandrives();
1998 #ifdef DCL_DEBUG
1999 if (DP->flags & FD_DEBUG) {
2000 DPRINT("setting NEWCHANGE in floppy_start\n");
2002 #endif
2003 SETF(FD_DISK_NEWCHANGE);
2004 floppy_ready();
2008 * ========================================================================
2009 * here ends the bottom half. Exported routines are:
2010 * floppy_start, floppy_off, floppy_ready, lock_fdc, unlock_fdc, set_fdc,
2011 * start_motor, reset_fdc, reset_fdc_info, interpret_errors.
2012 * Initialization also uses output_byte, result, set_dor, floppy_interrupt
2013 * and set_dor.
2014 * ========================================================================
2017 * General purpose continuations.
2018 * ==============================
2021 static void do_wakeup(void)
2023 reschedule_timeout(MAXTIMEOUT, "do wakeup", 0);
2024 cont = NULL;
2025 command_status += 2;
2026 wake_up(&command_done);
2029 static struct cont_t wakeup_cont = {
2030 .interrupt = empty,
2031 .redo = do_wakeup,
2032 .error = empty,
2033 .done = (done_f)empty
2036 static struct cont_t intr_cont = {
2037 .interrupt = empty,
2038 .redo = process_fd_request,
2039 .error = empty,
2040 .done = (done_f)empty
2043 static int wait_til_done(void (*handler)(void), int interruptible)
2045 int ret;
2047 schedule_bh(handler);
2049 if (command_status < 2 && NO_SIGNAL) {
2050 DECLARE_WAITQUEUE(wait, current);
2052 add_wait_queue(&command_done, &wait);
2053 for (;;) {
2054 set_current_state(interruptible ?
2055 TASK_INTERRUPTIBLE :
2056 TASK_UNINTERRUPTIBLE);
2058 if (command_status >= 2 || !NO_SIGNAL)
2059 break;
2061 is_alive("wait_til_done");
2062 schedule();
2065 set_current_state(TASK_RUNNING);
2066 remove_wait_queue(&command_done, &wait);
2069 if (command_status < 2) {
2070 cancel_activity();
2071 cont = &intr_cont;
2072 reset_fdc();
2073 return -EINTR;
2076 if (FDCS->reset)
2077 command_status = FD_COMMAND_ERROR;
2078 if (command_status == FD_COMMAND_OKAY)
2079 ret = 0;
2080 else
2081 ret = -EIO;
2082 command_status = FD_COMMAND_NONE;
2083 return ret;
2086 static void generic_done(int result)
2088 command_status = result;
2089 cont = &wakeup_cont;
2092 static void generic_success(void)
2094 cont->done(1);
2097 static void generic_failure(void)
2099 cont->done(0);
2102 static void success_and_wakeup(void)
2104 generic_success();
2105 cont->redo();
2109 * formatting and rw support.
2110 * ==========================
2113 static int next_valid_format(void)
2115 int probed_format;
2117 probed_format = DRS->probed_format;
2118 while (1) {
2119 if (probed_format >= 8 || !DP->autodetect[probed_format]) {
2120 DRS->probed_format = 0;
2121 return 1;
2123 if (floppy_type[DP->autodetect[probed_format]].sect) {
2124 DRS->probed_format = probed_format;
2125 return 0;
2127 probed_format++;
2131 static void bad_flp_intr(void)
2133 int err_count;
2135 if (probing) {
2136 DRS->probed_format++;
2137 if (!next_valid_format())
2138 return;
2140 err_count = ++(*errors);
2141 INFBOUND(DRWE->badness, err_count);
2142 if (err_count > DP->max_errors.abort)
2143 cont->done(0);
2144 if (err_count > DP->max_errors.reset)
2145 FDCS->reset = 1;
2146 else if (err_count > DP->max_errors.recal)
2147 DRS->track = NEED_2_RECAL;
2150 static void set_floppy(int drive)
2152 int type = ITYPE(UDRS->fd_device);
2154 if (type)
2155 _floppy = floppy_type + type;
2156 else
2157 _floppy = current_type[drive];
2161 * formatting support.
2162 * ===================
2164 static void format_interrupt(void)
2166 switch (interpret_errors()) {
2167 case 1:
2168 cont->error();
2169 case 2:
2170 break;
2171 case 0:
2172 cont->done(1);
2174 cont->redo();
2177 #define CODE2SIZE (ssize = ((1 << SIZECODE) + 3) >> 2)
2178 #define FM_MODE(x,y) ((y) & ~(((x)->rate & 0x80) >>1))
2179 #define CT(x) ((x) | 0xc0)
2180 static void setup_format_params(int track)
2182 int n;
2183 int il;
2184 int count;
2185 int head_shift;
2186 int track_shift;
2187 struct fparm {
2188 unsigned char track, head, sect, size;
2189 } *here = (struct fparm *)floppy_track_buffer;
2191 raw_cmd = &default_raw_cmd;
2192 raw_cmd->track = track;
2194 raw_cmd->flags = FD_RAW_WRITE | FD_RAW_INTR | FD_RAW_SPIN |
2195 FD_RAW_NEED_DISK | FD_RAW_NEED_SEEK;
2196 raw_cmd->rate = _floppy->rate & 0x43;
2197 raw_cmd->cmd_count = NR_F;
2198 COMMAND = FM_MODE(_floppy, FD_FORMAT);
2199 DR_SELECT = UNIT(current_drive) + PH_HEAD(_floppy, format_req.head);
2200 F_SIZECODE = FD_SIZECODE(_floppy);
2201 F_SECT_PER_TRACK = _floppy->sect << 2 >> F_SIZECODE;
2202 F_GAP = _floppy->fmt_gap;
2203 F_FILL = FD_FILL_BYTE;
2205 raw_cmd->kernel_data = floppy_track_buffer;
2206 raw_cmd->length = 4 * F_SECT_PER_TRACK;
2208 /* allow for about 30ms for data transport per track */
2209 head_shift = (F_SECT_PER_TRACK + 5) / 6;
2211 /* a ``cylinder'' is two tracks plus a little stepping time */
2212 track_shift = 2 * head_shift + 3;
2214 /* position of logical sector 1 on this track */
2215 n = (track_shift * format_req.track + head_shift * format_req.head)
2216 % F_SECT_PER_TRACK;
2218 /* determine interleave */
2219 il = 1;
2220 if (_floppy->fmt_gap < 0x22)
2221 il++;
2223 /* initialize field */
2224 for (count = 0; count < F_SECT_PER_TRACK; ++count) {
2225 here[count].track = format_req.track;
2226 here[count].head = format_req.head;
2227 here[count].sect = 0;
2228 here[count].size = F_SIZECODE;
2230 /* place logical sectors */
2231 for (count = 1; count <= F_SECT_PER_TRACK; ++count) {
2232 here[n].sect = count;
2233 n = (n + il) % F_SECT_PER_TRACK;
2234 if (here[n].sect) { /* sector busy, find next free sector */
2235 ++n;
2236 if (n >= F_SECT_PER_TRACK) {
2237 n -= F_SECT_PER_TRACK;
2238 while (here[n].sect)
2239 ++n;
2243 if (_floppy->stretch & FD_ZEROBASED) {
2244 for (count = 0; count < F_SECT_PER_TRACK; count++)
2245 here[count].sect--;
2249 static void redo_format(void)
2251 buffer_track = -1;
2252 setup_format_params(format_req.track << STRETCH(_floppy));
2253 floppy_start();
2254 debugt("queue format request");
2257 static struct cont_t format_cont = {
2258 .interrupt = format_interrupt,
2259 .redo = redo_format,
2260 .error = bad_flp_intr,
2261 .done = generic_done
2264 static int do_format(int drive, struct format_descr *tmp_format_req)
2266 int ret;
2268 LOCK_FDC(drive, 1);
2269 set_floppy(drive);
2270 if (!_floppy ||
2271 _floppy->track > DP->tracks ||
2272 tmp_format_req->track >= _floppy->track ||
2273 tmp_format_req->head >= _floppy->head ||
2274 (_floppy->sect << 2) % (1 << FD_SIZECODE(_floppy)) ||
2275 !_floppy->fmt_gap) {
2276 process_fd_request();
2277 return -EINVAL;
2279 format_req = *tmp_format_req;
2280 format_errors = 0;
2281 cont = &format_cont;
2282 errors = &format_errors;
2283 IWAIT(redo_format);
2284 process_fd_request();
2285 return ret;
2289 * Buffer read/write and support
2290 * =============================
2293 static void floppy_end_request(struct request *req, int error)
2295 unsigned int nr_sectors = current_count_sectors;
2296 unsigned int drive = (unsigned long)req->rq_disk->private_data;
2298 /* current_count_sectors can be zero if transfer failed */
2299 if (error)
2300 nr_sectors = req->current_nr_sectors;
2301 if (__blk_end_request(req, error, nr_sectors << 9))
2302 return;
2304 /* We're done with the request */
2305 floppy_off(drive);
2306 current_req = NULL;
2309 /* new request_done. Can handle physical sectors which are smaller than a
2310 * logical buffer */
2311 static void request_done(int uptodate)
2313 struct request_queue *q = floppy_queue;
2314 struct request *req = current_req;
2315 unsigned long flags;
2316 int block;
2318 probing = 0;
2319 reschedule_timeout(MAXTIMEOUT, "request done %d", uptodate);
2321 if (!req) {
2322 printk("floppy.c: no request in request_done\n");
2323 return;
2326 if (uptodate) {
2327 /* maintain values for invalidation on geometry
2328 * change */
2329 block = current_count_sectors + req->sector;
2330 INFBOUND(DRS->maxblock, block);
2331 if (block > _floppy->sect)
2332 DRS->maxtrack = 1;
2334 /* unlock chained buffers */
2335 spin_lock_irqsave(q->queue_lock, flags);
2336 floppy_end_request(req, 0);
2337 spin_unlock_irqrestore(q->queue_lock, flags);
2338 } else {
2339 if (rq_data_dir(req) == WRITE) {
2340 /* record write error information */
2341 DRWE->write_errors++;
2342 if (DRWE->write_errors == 1) {
2343 DRWE->first_error_sector = req->sector;
2344 DRWE->first_error_generation = DRS->generation;
2346 DRWE->last_error_sector = req->sector;
2347 DRWE->last_error_generation = DRS->generation;
2349 spin_lock_irqsave(q->queue_lock, flags);
2350 floppy_end_request(req, -EIO);
2351 spin_unlock_irqrestore(q->queue_lock, flags);
2355 /* Interrupt handler evaluating the result of the r/w operation */
2356 static void rw_interrupt(void)
2358 int eoc;
2359 int ssize;
2360 int heads;
2361 int nr_sectors;
2363 if (R_HEAD >= 2) {
2364 /* some Toshiba floppy controllers occasionnally seem to
2365 * return bogus interrupts after read/write operations, which
2366 * can be recognized by a bad head number (>= 2) */
2367 return;
2370 if (!DRS->first_read_date)
2371 DRS->first_read_date = jiffies;
2373 nr_sectors = 0;
2374 CODE2SIZE;
2376 if (ST1 & ST1_EOC)
2377 eoc = 1;
2378 else
2379 eoc = 0;
2381 if (COMMAND & 0x80)
2382 heads = 2;
2383 else
2384 heads = 1;
2386 nr_sectors = (((R_TRACK - TRACK) * heads +
2387 R_HEAD - HEAD) * SECT_PER_TRACK +
2388 R_SECTOR - SECTOR + eoc) << SIZECODE >> 2;
2390 #ifdef FLOPPY_SANITY_CHECK
2391 if (nr_sectors / ssize >
2392 (in_sector_offset + current_count_sectors + ssize - 1) / ssize) {
2393 DPRINT("long rw: %x instead of %lx\n",
2394 nr_sectors, current_count_sectors);
2395 printk("rs=%d s=%d\n", R_SECTOR, SECTOR);
2396 printk("rh=%d h=%d\n", R_HEAD, HEAD);
2397 printk("rt=%d t=%d\n", R_TRACK, TRACK);
2398 printk("heads=%d eoc=%d\n", heads, eoc);
2399 printk("spt=%d st=%d ss=%d\n", SECT_PER_TRACK,
2400 fsector_t, ssize);
2401 printk("in_sector_offset=%d\n", in_sector_offset);
2403 #endif
2405 nr_sectors -= in_sector_offset;
2406 INFBOUND(nr_sectors, 0);
2407 SUPBOUND(current_count_sectors, nr_sectors);
2409 switch (interpret_errors()) {
2410 case 2:
2411 cont->redo();
2412 return;
2413 case 1:
2414 if (!current_count_sectors) {
2415 cont->error();
2416 cont->redo();
2417 return;
2419 break;
2420 case 0:
2421 if (!current_count_sectors) {
2422 cont->redo();
2423 return;
2425 current_type[current_drive] = _floppy;
2426 floppy_sizes[TOMINOR(current_drive)] = _floppy->size;
2427 break;
2430 if (probing) {
2431 if (DP->flags & FTD_MSG)
2432 DPRINT("Auto-detected floppy type %s in fd%d\n",
2433 _floppy->name, current_drive);
2434 current_type[current_drive] = _floppy;
2435 floppy_sizes[TOMINOR(current_drive)] = _floppy->size;
2436 probing = 0;
2439 if (CT(COMMAND) != FD_READ ||
2440 raw_cmd->kernel_data == current_req->buffer) {
2441 /* transfer directly from buffer */
2442 cont->done(1);
2443 } else if (CT(COMMAND) == FD_READ) {
2444 buffer_track = raw_cmd->track;
2445 buffer_drive = current_drive;
2446 INFBOUND(buffer_max, nr_sectors + fsector_t);
2448 cont->redo();
2451 /* Compute maximal contiguous buffer size. */
2452 static int buffer_chain_size(void)
2454 struct bio_vec *bv;
2455 int size;
2456 struct req_iterator iter;
2457 char *base;
2459 base = bio_data(current_req->bio);
2460 size = 0;
2462 rq_for_each_segment(bv, current_req, iter) {
2463 if (page_address(bv->bv_page) + bv->bv_offset != base + size)
2464 break;
2466 size += bv->bv_len;
2469 return size >> 9;
2472 /* Compute the maximal transfer size */
2473 static int transfer_size(int ssize, int max_sector, int max_size)
2475 SUPBOUND(max_sector, fsector_t + max_size);
2477 /* alignment */
2478 max_sector -= (max_sector % _floppy->sect) % ssize;
2480 /* transfer size, beginning not aligned */
2481 current_count_sectors = max_sector - fsector_t;
2483 return max_sector;
2487 * Move data from/to the track buffer to/from the buffer cache.
2489 static void copy_buffer(int ssize, int max_sector, int max_sector_2)
2491 int remaining; /* number of transferred 512-byte sectors */
2492 struct bio_vec *bv;
2493 char *buffer;
2494 char *dma_buffer;
2495 int size;
2496 struct req_iterator iter;
2498 max_sector = transfer_size(ssize,
2499 min(max_sector, max_sector_2),
2500 current_req->nr_sectors);
2502 if (current_count_sectors <= 0 && CT(COMMAND) == FD_WRITE &&
2503 buffer_max > fsector_t + current_req->nr_sectors)
2504 current_count_sectors = min_t(int, buffer_max - fsector_t,
2505 current_req->nr_sectors);
2507 remaining = current_count_sectors << 9;
2508 #ifdef FLOPPY_SANITY_CHECK
2509 if ((remaining >> 9) > current_req->nr_sectors &&
2510 CT(COMMAND) == FD_WRITE) {
2511 DPRINT("in copy buffer\n");
2512 printk("current_count_sectors=%ld\n", current_count_sectors);
2513 printk("remaining=%d\n", remaining >> 9);
2514 printk("current_req->nr_sectors=%ld\n",
2515 current_req->nr_sectors);
2516 printk("current_req->current_nr_sectors=%u\n",
2517 current_req->current_nr_sectors);
2518 printk("max_sector=%d\n", max_sector);
2519 printk("ssize=%d\n", ssize);
2521 #endif
2523 buffer_max = max(max_sector, buffer_max);
2525 dma_buffer = floppy_track_buffer + ((fsector_t - buffer_min) << 9);
2527 size = current_req->current_nr_sectors << 9;
2529 rq_for_each_segment(bv, current_req, iter) {
2530 if (!remaining)
2531 break;
2533 size = bv->bv_len;
2534 SUPBOUND(size, remaining);
2536 buffer = page_address(bv->bv_page) + bv->bv_offset;
2537 #ifdef FLOPPY_SANITY_CHECK
2538 if (dma_buffer + size >
2539 floppy_track_buffer + (max_buffer_sectors << 10) ||
2540 dma_buffer < floppy_track_buffer) {
2541 DPRINT("buffer overrun in copy buffer %d\n",
2542 (int)((floppy_track_buffer -
2543 dma_buffer) >> 9));
2544 printk("fsector_t=%d buffer_min=%d\n",
2545 fsector_t, buffer_min);
2546 printk("current_count_sectors=%ld\n",
2547 current_count_sectors);
2548 if (CT(COMMAND) == FD_READ)
2549 printk("read\n");
2550 if (CT(COMMAND) == FD_WRITE)
2551 printk("write\n");
2552 break;
2554 if (((unsigned long)buffer) % 512)
2555 DPRINT("%p buffer not aligned\n", buffer);
2556 #endif
2557 if (CT(COMMAND) == FD_READ)
2558 memcpy(buffer, dma_buffer, size);
2559 else
2560 memcpy(dma_buffer, buffer, size);
2562 remaining -= size;
2563 dma_buffer += size;
2565 #ifdef FLOPPY_SANITY_CHECK
2566 if (remaining) {
2567 if (remaining > 0)
2568 max_sector -= remaining >> 9;
2569 DPRINT("weirdness: remaining %d\n", remaining >> 9);
2571 #endif
2574 /* work around a bug in pseudo DMA
2575 * (on some FDCs) pseudo DMA does not stop when the CPU stops
2576 * sending data. Hence we need a different way to signal the
2577 * transfer length: We use SECT_PER_TRACK. Unfortunately, this
2578 * does not work with MT, hence we can only transfer one head at
2579 * a time
2581 static void virtualdmabug_workaround(void)
2583 int hard_sectors;
2584 int end_sector;
2586 if (CT(COMMAND) == FD_WRITE) {
2587 COMMAND &= ~0x80; /* switch off multiple track mode */
2589 hard_sectors = raw_cmd->length >> (7 + SIZECODE);
2590 end_sector = SECTOR + hard_sectors - 1;
2591 #ifdef FLOPPY_SANITY_CHECK
2592 if (end_sector > SECT_PER_TRACK) {
2593 printk("too many sectors %d > %d\n",
2594 end_sector, SECT_PER_TRACK);
2595 return;
2597 #endif
2598 SECT_PER_TRACK = end_sector; /* make sure SECT_PER_TRACK points
2599 * to end of transfer */
2604 * Formulate a read/write request.
2605 * this routine decides where to load the data (directly to buffer, or to
2606 * tmp floppy area), how much data to load (the size of the buffer, the whole
2607 * track, or a single sector)
2608 * All floppy_track_buffer handling goes in here. If we ever add track buffer
2609 * allocation on the fly, it should be done here. No other part should need
2610 * modification.
2613 static int make_raw_rw_request(void)
2615 int aligned_sector_t;
2616 int max_sector;
2617 int max_size;
2618 int tracksize;
2619 int ssize;
2621 if (max_buffer_sectors == 0) {
2622 printk("VFS: Block I/O scheduled on unopened device\n");
2623 return 0;
2626 set_fdc((long)current_req->rq_disk->private_data);
2628 raw_cmd = &default_raw_cmd;
2629 raw_cmd->flags = FD_RAW_SPIN | FD_RAW_NEED_DISK | FD_RAW_NEED_DISK |
2630 FD_RAW_NEED_SEEK;
2631 raw_cmd->cmd_count = NR_RW;
2632 if (rq_data_dir(current_req) == READ) {
2633 raw_cmd->flags |= FD_RAW_READ;
2634 COMMAND = FM_MODE(_floppy, FD_READ);
2635 } else if (rq_data_dir(current_req) == WRITE) {
2636 raw_cmd->flags |= FD_RAW_WRITE;
2637 COMMAND = FM_MODE(_floppy, FD_WRITE);
2638 } else {
2639 DPRINT("make_raw_rw_request: unknown command\n");
2640 return 0;
2643 max_sector = _floppy->sect * _floppy->head;
2645 TRACK = (int)current_req->sector / max_sector;
2646 fsector_t = (int)current_req->sector % max_sector;
2647 if (_floppy->track && TRACK >= _floppy->track) {
2648 if (current_req->current_nr_sectors & 1) {
2649 current_count_sectors = 1;
2650 return 1;
2651 } else
2652 return 0;
2654 HEAD = fsector_t / _floppy->sect;
2656 if (((_floppy->stretch & (FD_SWAPSIDES | FD_ZEROBASED)) ||
2657 TESTF(FD_NEED_TWADDLE)) && fsector_t < _floppy->sect)
2658 max_sector = _floppy->sect;
2660 /* 2M disks have phantom sectors on the first track */
2661 if ((_floppy->rate & FD_2M) && (!TRACK) && (!HEAD)) {
2662 max_sector = 2 * _floppy->sect / 3;
2663 if (fsector_t >= max_sector) {
2664 current_count_sectors =
2665 min_t(int, _floppy->sect - fsector_t,
2666 current_req->nr_sectors);
2667 return 1;
2669 SIZECODE = 2;
2670 } else
2671 SIZECODE = FD_SIZECODE(_floppy);
2672 raw_cmd->rate = _floppy->rate & 0x43;
2673 if ((_floppy->rate & FD_2M) && (TRACK || HEAD) && raw_cmd->rate == 2)
2674 raw_cmd->rate = 1;
2676 if (SIZECODE)
2677 SIZECODE2 = 0xff;
2678 else
2679 SIZECODE2 = 0x80;
2680 raw_cmd->track = TRACK << STRETCH(_floppy);
2681 DR_SELECT = UNIT(current_drive) + PH_HEAD(_floppy, HEAD);
2682 GAP = _floppy->gap;
2683 CODE2SIZE;
2684 SECT_PER_TRACK = _floppy->sect << 2 >> SIZECODE;
2685 SECTOR = ((fsector_t % _floppy->sect) << 2 >> SIZECODE) +
2686 ((_floppy->stretch & FD_ZEROBASED) ? 0 : 1);
2688 /* tracksize describes the size which can be filled up with sectors
2689 * of size ssize.
2691 tracksize = _floppy->sect - _floppy->sect % ssize;
2692 if (tracksize < _floppy->sect) {
2693 SECT_PER_TRACK++;
2694 if (tracksize <= fsector_t % _floppy->sect)
2695 SECTOR--;
2697 /* if we are beyond tracksize, fill up using smaller sectors */
2698 while (tracksize <= fsector_t % _floppy->sect) {
2699 while (tracksize + ssize > _floppy->sect) {
2700 SIZECODE--;
2701 ssize >>= 1;
2703 SECTOR++;
2704 SECT_PER_TRACK++;
2705 tracksize += ssize;
2707 max_sector = HEAD * _floppy->sect + tracksize;
2708 } else if (!TRACK && !HEAD && !(_floppy->rate & FD_2M) && probing) {
2709 max_sector = _floppy->sect;
2710 } else if (!HEAD && CT(COMMAND) == FD_WRITE) {
2711 /* for virtual DMA bug workaround */
2712 max_sector = _floppy->sect;
2715 in_sector_offset = (fsector_t % _floppy->sect) % ssize;
2716 aligned_sector_t = fsector_t - in_sector_offset;
2717 max_size = current_req->nr_sectors;
2718 if ((raw_cmd->track == buffer_track) &&
2719 (current_drive == buffer_drive) &&
2720 (fsector_t >= buffer_min) && (fsector_t < buffer_max)) {
2721 /* data already in track buffer */
2722 if (CT(COMMAND) == FD_READ) {
2723 copy_buffer(1, max_sector, buffer_max);
2724 return 1;
2726 } else if (in_sector_offset || current_req->nr_sectors < ssize) {
2727 if (CT(COMMAND) == FD_WRITE) {
2728 if (fsector_t + current_req->nr_sectors > ssize &&
2729 fsector_t + current_req->nr_sectors < ssize + ssize)
2730 max_size = ssize + ssize;
2731 else
2732 max_size = ssize;
2734 raw_cmd->flags &= ~FD_RAW_WRITE;
2735 raw_cmd->flags |= FD_RAW_READ;
2736 COMMAND = FM_MODE(_floppy, FD_READ);
2737 } else if ((unsigned long)current_req->buffer < MAX_DMA_ADDRESS) {
2738 unsigned long dma_limit;
2739 int direct, indirect;
2741 indirect =
2742 transfer_size(ssize, max_sector,
2743 max_buffer_sectors * 2) - fsector_t;
2746 * Do NOT use minimum() here---MAX_DMA_ADDRESS is 64 bits wide
2747 * on a 64 bit machine!
2749 max_size = buffer_chain_size();
2750 dma_limit =
2751 (MAX_DMA_ADDRESS -
2752 ((unsigned long)current_req->buffer)) >> 9;
2753 if ((unsigned long)max_size > dma_limit) {
2754 max_size = dma_limit;
2756 /* 64 kb boundaries */
2757 if (CROSS_64KB(current_req->buffer, max_size << 9))
2758 max_size = (K_64 -
2759 ((unsigned long)current_req->buffer) %
2760 K_64) >> 9;
2761 direct = transfer_size(ssize, max_sector, max_size) - fsector_t;
2763 * We try to read tracks, but if we get too many errors, we
2764 * go back to reading just one sector at a time.
2766 * This means we should be able to read a sector even if there
2767 * are other bad sectors on this track.
2769 if (!direct ||
2770 (indirect * 2 > direct * 3 &&
2771 *errors < DP->max_errors.read_track && ((!probing
2772 || (DP->read_track & (1 << DRS->probed_format)))))) {
2773 max_size = current_req->nr_sectors;
2774 } else {
2775 raw_cmd->kernel_data = current_req->buffer;
2776 raw_cmd->length = current_count_sectors << 9;
2777 if (raw_cmd->length == 0) {
2778 DPRINT
2779 ("zero dma transfer attempted from make_raw_request\n");
2780 DPRINT("indirect=%d direct=%d fsector_t=%d",
2781 indirect, direct, fsector_t);
2782 return 0;
2784 virtualdmabug_workaround();
2785 return 2;
2789 if (CT(COMMAND) == FD_READ)
2790 max_size = max_sector; /* unbounded */
2792 /* claim buffer track if needed */
2793 if (buffer_track != raw_cmd->track || /* bad track */
2794 buffer_drive != current_drive || /* bad drive */
2795 fsector_t > buffer_max ||
2796 fsector_t < buffer_min ||
2797 ((CT(COMMAND) == FD_READ ||
2798 (!in_sector_offset && current_req->nr_sectors >= ssize)) &&
2799 max_sector > 2 * max_buffer_sectors + buffer_min &&
2800 max_size + fsector_t > 2 * max_buffer_sectors + buffer_min)
2801 /* not enough space */
2803 buffer_track = -1;
2804 buffer_drive = current_drive;
2805 buffer_max = buffer_min = aligned_sector_t;
2807 raw_cmd->kernel_data = floppy_track_buffer +
2808 ((aligned_sector_t - buffer_min) << 9);
2810 if (CT(COMMAND) == FD_WRITE) {
2811 /* copy write buffer to track buffer.
2812 * if we get here, we know that the write
2813 * is either aligned or the data already in the buffer
2814 * (buffer will be overwritten) */
2815 #ifdef FLOPPY_SANITY_CHECK
2816 if (in_sector_offset && buffer_track == -1)
2817 DPRINT("internal error offset !=0 on write\n");
2818 #endif
2819 buffer_track = raw_cmd->track;
2820 buffer_drive = current_drive;
2821 copy_buffer(ssize, max_sector,
2822 2 * max_buffer_sectors + buffer_min);
2823 } else
2824 transfer_size(ssize, max_sector,
2825 2 * max_buffer_sectors + buffer_min -
2826 aligned_sector_t);
2828 /* round up current_count_sectors to get dma xfer size */
2829 raw_cmd->length = in_sector_offset + current_count_sectors;
2830 raw_cmd->length = ((raw_cmd->length - 1) | (ssize - 1)) + 1;
2831 raw_cmd->length <<= 9;
2832 #ifdef FLOPPY_SANITY_CHECK
2833 if ((raw_cmd->length < current_count_sectors << 9) ||
2834 (raw_cmd->kernel_data != current_req->buffer &&
2835 CT(COMMAND) == FD_WRITE &&
2836 (aligned_sector_t + (raw_cmd->length >> 9) > buffer_max ||
2837 aligned_sector_t < buffer_min)) ||
2838 raw_cmd->length % (128 << SIZECODE) ||
2839 raw_cmd->length <= 0 || current_count_sectors <= 0) {
2840 DPRINT("fractionary current count b=%lx s=%lx\n",
2841 raw_cmd->length, current_count_sectors);
2842 if (raw_cmd->kernel_data != current_req->buffer)
2843 printk("addr=%d, length=%ld\n",
2844 (int)((raw_cmd->kernel_data -
2845 floppy_track_buffer) >> 9),
2846 current_count_sectors);
2847 printk("st=%d ast=%d mse=%d msi=%d\n",
2848 fsector_t, aligned_sector_t, max_sector, max_size);
2849 printk("ssize=%x SIZECODE=%d\n", ssize, SIZECODE);
2850 printk("command=%x SECTOR=%d HEAD=%d, TRACK=%d\n",
2851 COMMAND, SECTOR, HEAD, TRACK);
2852 printk("buffer drive=%d\n", buffer_drive);
2853 printk("buffer track=%d\n", buffer_track);
2854 printk("buffer_min=%d\n", buffer_min);
2855 printk("buffer_max=%d\n", buffer_max);
2856 return 0;
2859 if (raw_cmd->kernel_data != current_req->buffer) {
2860 if (raw_cmd->kernel_data < floppy_track_buffer ||
2861 current_count_sectors < 0 ||
2862 raw_cmd->length < 0 ||
2863 raw_cmd->kernel_data + raw_cmd->length >
2864 floppy_track_buffer + (max_buffer_sectors << 10)) {
2865 DPRINT("buffer overrun in schedule dma\n");
2866 printk("fsector_t=%d buffer_min=%d current_count=%ld\n",
2867 fsector_t, buffer_min, raw_cmd->length >> 9);
2868 printk("current_count_sectors=%ld\n",
2869 current_count_sectors);
2870 if (CT(COMMAND) == FD_READ)
2871 printk("read\n");
2872 if (CT(COMMAND) == FD_WRITE)
2873 printk("write\n");
2874 return 0;
2876 } else if (raw_cmd->length > current_req->nr_sectors << 9 ||
2877 current_count_sectors > current_req->nr_sectors) {
2878 DPRINT("buffer overrun in direct transfer\n");
2879 return 0;
2880 } else if (raw_cmd->length < current_count_sectors << 9) {
2881 DPRINT("more sectors than bytes\n");
2882 printk("bytes=%ld\n", raw_cmd->length >> 9);
2883 printk("sectors=%ld\n", current_count_sectors);
2885 if (raw_cmd->length == 0) {
2886 DPRINT("zero dma transfer attempted from make_raw_request\n");
2887 return 0;
2889 #endif
2891 virtualdmabug_workaround();
2892 return 2;
2895 static void redo_fd_request(void)
2897 #define REPEAT {request_done(0); continue; }
2898 int drive;
2899 int tmp;
2901 lastredo = jiffies;
2902 if (current_drive < N_DRIVE)
2903 floppy_off(current_drive);
2905 for (;;) {
2906 if (!current_req) {
2907 struct request *req;
2909 spin_lock_irq(floppy_queue->queue_lock);
2910 req = elv_next_request(floppy_queue);
2911 spin_unlock_irq(floppy_queue->queue_lock);
2912 if (!req) {
2913 do_floppy = NULL;
2914 unlock_fdc();
2915 return;
2917 current_req = req;
2919 drive = (long)current_req->rq_disk->private_data;
2920 set_fdc(drive);
2921 reschedule_timeout(current_reqD, "redo fd request", 0);
2923 set_floppy(drive);
2924 raw_cmd = &default_raw_cmd;
2925 raw_cmd->flags = 0;
2926 if (start_motor(redo_fd_request))
2927 return;
2928 disk_change(current_drive);
2929 if (test_bit(current_drive, &fake_change) ||
2930 TESTF(FD_DISK_CHANGED)) {
2931 DPRINT("disk absent or changed during operation\n");
2932 REPEAT;
2934 if (!_floppy) { /* Autodetection */
2935 if (!probing) {
2936 DRS->probed_format = 0;
2937 if (next_valid_format()) {
2938 DPRINT("no autodetectable formats\n");
2939 _floppy = NULL;
2940 REPEAT;
2943 probing = 1;
2944 _floppy =
2945 floppy_type + DP->autodetect[DRS->probed_format];
2946 } else
2947 probing = 0;
2948 errors = &(current_req->errors);
2949 tmp = make_raw_rw_request();
2950 if (tmp < 2) {
2951 request_done(tmp);
2952 continue;
2955 if (TESTF(FD_NEED_TWADDLE))
2956 twaddle();
2957 schedule_bh(floppy_start);
2958 debugt("queue fd request");
2959 return;
2961 #undef REPEAT
2964 static struct cont_t rw_cont = {
2965 .interrupt = rw_interrupt,
2966 .redo = redo_fd_request,
2967 .error = bad_flp_intr,
2968 .done = request_done
2971 static void process_fd_request(void)
2973 cont = &rw_cont;
2974 schedule_bh(redo_fd_request);
2977 static void do_fd_request(struct request_queue * q)
2979 if (max_buffer_sectors == 0) {
2980 printk("VFS: do_fd_request called on non-open device\n");
2981 return;
2984 if (usage_count == 0) {
2985 printk("warning: usage count=0, current_req=%p exiting\n",
2986 current_req);
2987 printk("sect=%ld type=%x flags=%x\n", (long)current_req->sector,
2988 current_req->cmd_type, current_req->cmd_flags);
2989 return;
2991 if (test_bit(0, &fdc_busy)) {
2992 /* fdc busy, this new request will be treated when the
2993 current one is done */
2994 is_alive("do fd request, old request running");
2995 return;
2997 lock_fdc(MAXTIMEOUT, 0);
2998 process_fd_request();
2999 is_alive("do fd request");
3002 static struct cont_t poll_cont = {
3003 .interrupt = success_and_wakeup,
3004 .redo = floppy_ready,
3005 .error = generic_failure,
3006 .done = generic_done
3009 static int poll_drive(int interruptible, int flag)
3011 int ret;
3013 /* no auto-sense, just clear dcl */
3014 raw_cmd = &default_raw_cmd;
3015 raw_cmd->flags = flag;
3016 raw_cmd->track = 0;
3017 raw_cmd->cmd_count = 0;
3018 cont = &poll_cont;
3019 #ifdef DCL_DEBUG
3020 if (DP->flags & FD_DEBUG) {
3021 DPRINT("setting NEWCHANGE in poll_drive\n");
3023 #endif
3024 SETF(FD_DISK_NEWCHANGE);
3025 WAIT(floppy_ready);
3026 return ret;
3030 * User triggered reset
3031 * ====================
3034 static void reset_intr(void)
3036 printk("weird, reset interrupt called\n");
3039 static struct cont_t reset_cont = {
3040 .interrupt = reset_intr,
3041 .redo = success_and_wakeup,
3042 .error = generic_failure,
3043 .done = generic_done
3046 static int user_reset_fdc(int drive, int arg, int interruptible)
3048 int ret;
3050 ret = 0;
3051 LOCK_FDC(drive, interruptible);
3052 if (arg == FD_RESET_ALWAYS)
3053 FDCS->reset = 1;
3054 if (FDCS->reset) {
3055 cont = &reset_cont;
3056 WAIT(reset_fdc);
3058 process_fd_request();
3059 return ret;
3063 * Misc Ioctl's and support
3064 * ========================
3066 static inline int fd_copyout(void __user *param, const void *address,
3067 unsigned long size)
3069 return copy_to_user(param, address, size) ? -EFAULT : 0;
3072 static inline int fd_copyin(void __user *param, void *address, unsigned long size)
3074 return copy_from_user(address, param, size) ? -EFAULT : 0;
3077 #define _COPYOUT(x) (copy_to_user((void __user *)param, &(x), sizeof(x)) ? -EFAULT : 0)
3078 #define _COPYIN(x) (copy_from_user(&(x), (void __user *)param, sizeof(x)) ? -EFAULT : 0)
3080 #define COPYOUT(x) ECALL(_COPYOUT(x))
3081 #define COPYIN(x) ECALL(_COPYIN(x))
3083 static inline const char *drive_name(int type, int drive)
3085 struct floppy_struct *floppy;
3087 if (type)
3088 floppy = floppy_type + type;
3089 else {
3090 if (UDP->native_format)
3091 floppy = floppy_type + UDP->native_format;
3092 else
3093 return "(null)";
3095 if (floppy->name)
3096 return floppy->name;
3097 else
3098 return "(null)";
3101 /* raw commands */
3102 static void raw_cmd_done(int flag)
3104 int i;
3106 if (!flag) {
3107 raw_cmd->flags |= FD_RAW_FAILURE;
3108 raw_cmd->flags |= FD_RAW_HARDFAILURE;
3109 } else {
3110 raw_cmd->reply_count = inr;
3111 if (raw_cmd->reply_count > MAX_REPLIES)
3112 raw_cmd->reply_count = 0;
3113 for (i = 0; i < raw_cmd->reply_count; i++)
3114 raw_cmd->reply[i] = reply_buffer[i];
3116 if (raw_cmd->flags & (FD_RAW_READ | FD_RAW_WRITE)) {
3117 unsigned long flags;
3118 flags = claim_dma_lock();
3119 raw_cmd->length = fd_get_dma_residue();
3120 release_dma_lock(flags);
3123 if ((raw_cmd->flags & FD_RAW_SOFTFAILURE) &&
3124 (!raw_cmd->reply_count || (raw_cmd->reply[0] & 0xc0)))
3125 raw_cmd->flags |= FD_RAW_FAILURE;
3127 if (disk_change(current_drive))
3128 raw_cmd->flags |= FD_RAW_DISK_CHANGE;
3129 else
3130 raw_cmd->flags &= ~FD_RAW_DISK_CHANGE;
3131 if (raw_cmd->flags & FD_RAW_NO_MOTOR_AFTER)
3132 motor_off_callback(current_drive);
3134 if (raw_cmd->next &&
3135 (!(raw_cmd->flags & FD_RAW_FAILURE) ||
3136 !(raw_cmd->flags & FD_RAW_STOP_IF_FAILURE)) &&
3137 ((raw_cmd->flags & FD_RAW_FAILURE) ||
3138 !(raw_cmd->flags & FD_RAW_STOP_IF_SUCCESS))) {
3139 raw_cmd = raw_cmd->next;
3140 return;
3143 generic_done(flag);
3146 static struct cont_t raw_cmd_cont = {
3147 .interrupt = success_and_wakeup,
3148 .redo = floppy_start,
3149 .error = generic_failure,
3150 .done = raw_cmd_done
3153 static inline int raw_cmd_copyout(int cmd, char __user *param,
3154 struct floppy_raw_cmd *ptr)
3156 int ret;
3158 while (ptr) {
3159 COPYOUT(*ptr);
3160 param += sizeof(struct floppy_raw_cmd);
3161 if ((ptr->flags & FD_RAW_READ) && ptr->buffer_length) {
3162 if (ptr->length >= 0
3163 && ptr->length <= ptr->buffer_length)
3164 ECALL(fd_copyout
3165 (ptr->data, ptr->kernel_data,
3166 ptr->buffer_length - ptr->length));
3168 ptr = ptr->next;
3170 return 0;
3173 static void raw_cmd_free(struct floppy_raw_cmd **ptr)
3175 struct floppy_raw_cmd *next;
3176 struct floppy_raw_cmd *this;
3178 this = *ptr;
3179 *ptr = NULL;
3180 while (this) {
3181 if (this->buffer_length) {
3182 fd_dma_mem_free((unsigned long)this->kernel_data,
3183 this->buffer_length);
3184 this->buffer_length = 0;
3186 next = this->next;
3187 kfree(this);
3188 this = next;
3192 static inline int raw_cmd_copyin(int cmd, char __user *param,
3193 struct floppy_raw_cmd **rcmd)
3195 struct floppy_raw_cmd *ptr;
3196 int ret;
3197 int i;
3199 *rcmd = NULL;
3200 while (1) {
3201 ptr = (struct floppy_raw_cmd *)
3202 kmalloc(sizeof(struct floppy_raw_cmd), GFP_USER);
3203 if (!ptr)
3204 return -ENOMEM;
3205 *rcmd = ptr;
3206 COPYIN(*ptr);
3207 ptr->next = NULL;
3208 ptr->buffer_length = 0;
3209 param += sizeof(struct floppy_raw_cmd);
3210 if (ptr->cmd_count > 33)
3211 /* the command may now also take up the space
3212 * initially intended for the reply & the
3213 * reply count. Needed for long 82078 commands
3214 * such as RESTORE, which takes ... 17 command
3215 * bytes. Murphy's law #137: When you reserve
3216 * 16 bytes for a structure, you'll one day
3217 * discover that you really need 17...
3219 return -EINVAL;
3221 for (i = 0; i < 16; i++)
3222 ptr->reply[i] = 0;
3223 ptr->resultcode = 0;
3224 ptr->kernel_data = NULL;
3226 if (ptr->flags & (FD_RAW_READ | FD_RAW_WRITE)) {
3227 if (ptr->length <= 0)
3228 return -EINVAL;
3229 ptr->kernel_data =
3230 (char *)fd_dma_mem_alloc(ptr->length);
3231 fallback_on_nodma_alloc(&ptr->kernel_data, ptr->length);
3232 if (!ptr->kernel_data)
3233 return -ENOMEM;
3234 ptr->buffer_length = ptr->length;
3236 if (ptr->flags & FD_RAW_WRITE)
3237 ECALL(fd_copyin(ptr->data, ptr->kernel_data,
3238 ptr->length));
3239 rcmd = &(ptr->next);
3240 if (!(ptr->flags & FD_RAW_MORE))
3241 return 0;
3242 ptr->rate &= 0x43;
3246 static int raw_cmd_ioctl(int cmd, void __user *param)
3248 struct floppy_raw_cmd *my_raw_cmd;
3249 int drive;
3250 int ret2;
3251 int ret;
3253 if (FDCS->rawcmd <= 1)
3254 FDCS->rawcmd = 1;
3255 for (drive = 0; drive < N_DRIVE; drive++) {
3256 if (FDC(drive) != fdc)
3257 continue;
3258 if (drive == current_drive) {
3259 if (UDRS->fd_ref > 1) {
3260 FDCS->rawcmd = 2;
3261 break;
3263 } else if (UDRS->fd_ref) {
3264 FDCS->rawcmd = 2;
3265 break;
3269 if (FDCS->reset)
3270 return -EIO;
3272 ret = raw_cmd_copyin(cmd, param, &my_raw_cmd);
3273 if (ret) {
3274 raw_cmd_free(&my_raw_cmd);
3275 return ret;
3278 raw_cmd = my_raw_cmd;
3279 cont = &raw_cmd_cont;
3280 ret = wait_til_done(floppy_start, 1);
3281 #ifdef DCL_DEBUG
3282 if (DP->flags & FD_DEBUG) {
3283 DPRINT("calling disk change from raw_cmd ioctl\n");
3285 #endif
3287 if (ret != -EINTR && FDCS->reset)
3288 ret = -EIO;
3290 DRS->track = NO_TRACK;
3292 ret2 = raw_cmd_copyout(cmd, param, my_raw_cmd);
3293 if (!ret)
3294 ret = ret2;
3295 raw_cmd_free(&my_raw_cmd);
3296 return ret;
3299 static int invalidate_drive(struct block_device *bdev)
3301 /* invalidate the buffer track to force a reread */
3302 set_bit((long)bdev->bd_disk->private_data, &fake_change);
3303 process_fd_request();
3304 check_disk_change(bdev);
3305 return 0;
3308 static inline int set_geometry(unsigned int cmd, struct floppy_struct *g,
3309 int drive, int type, struct block_device *bdev)
3311 int cnt;
3313 /* sanity checking for parameters. */
3314 if (g->sect <= 0 ||
3315 g->head <= 0 ||
3316 g->track <= 0 || g->track > UDP->tracks >> STRETCH(g) ||
3317 /* check if reserved bits are set */
3318 (g->stretch & ~(FD_STRETCH | FD_SWAPSIDES | FD_ZEROBASED)) != 0)
3319 return -EINVAL;
3320 if (type) {
3321 if (!capable(CAP_SYS_ADMIN))
3322 return -EPERM;
3323 mutex_lock(&open_lock);
3324 LOCK_FDC(drive, 1);
3325 floppy_type[type] = *g;
3326 floppy_type[type].name = "user format";
3327 for (cnt = type << 2; cnt < (type << 2) + 4; cnt++)
3328 floppy_sizes[cnt] = floppy_sizes[cnt + 0x80] =
3329 floppy_type[type].size + 1;
3330 process_fd_request();
3331 for (cnt = 0; cnt < N_DRIVE; cnt++) {
3332 struct block_device *bdev = opened_bdev[cnt];
3333 if (!bdev || ITYPE(drive_state[cnt].fd_device) != type)
3334 continue;
3335 __invalidate_device(bdev);
3337 mutex_unlock(&open_lock);
3338 } else {
3339 int oldStretch;
3340 LOCK_FDC(drive, 1);
3341 if (cmd != FDDEFPRM)
3342 /* notice a disk change immediately, else
3343 * we lose our settings immediately*/
3344 CALL(poll_drive(1, FD_RAW_NEED_DISK));
3345 oldStretch = g->stretch;
3346 user_params[drive] = *g;
3347 if (buffer_drive == drive)
3348 SUPBOUND(buffer_max, user_params[drive].sect);
3349 current_type[drive] = &user_params[drive];
3350 floppy_sizes[drive] = user_params[drive].size;
3351 if (cmd == FDDEFPRM)
3352 DRS->keep_data = -1;
3353 else
3354 DRS->keep_data = 1;
3355 /* invalidation. Invalidate only when needed, i.e.
3356 * when there are already sectors in the buffer cache
3357 * whose number will change. This is useful, because
3358 * mtools often changes the geometry of the disk after
3359 * looking at the boot block */
3360 if (DRS->maxblock > user_params[drive].sect ||
3361 DRS->maxtrack ||
3362 ((user_params[drive].sect ^ oldStretch) &
3363 (FD_SWAPSIDES | FD_ZEROBASED)))
3364 invalidate_drive(bdev);
3365 else
3366 process_fd_request();
3368 return 0;
3371 /* handle obsolete ioctl's */
3372 static int ioctl_table[] = {
3373 FDCLRPRM,
3374 FDSETPRM,
3375 FDDEFPRM,
3376 FDGETPRM,
3377 FDMSGON,
3378 FDMSGOFF,
3379 FDFMTBEG,
3380 FDFMTTRK,
3381 FDFMTEND,
3382 FDSETEMSGTRESH,
3383 FDFLUSH,
3384 FDSETMAXERRS,
3385 FDGETMAXERRS,
3386 FDGETDRVTYP,
3387 FDSETDRVPRM,
3388 FDGETDRVPRM,
3389 FDGETDRVSTAT,
3390 FDPOLLDRVSTAT,
3391 FDRESET,
3392 FDGETFDCSTAT,
3393 FDWERRORCLR,
3394 FDWERRORGET,
3395 FDRAWCMD,
3396 FDEJECT,
3397 FDTWADDLE
3400 static inline int normalize_ioctl(int *cmd, int *size)
3402 int i;
3404 for (i = 0; i < ARRAY_SIZE(ioctl_table); i++) {
3405 if ((*cmd & 0xffff) == (ioctl_table[i] & 0xffff)) {
3406 *size = _IOC_SIZE(*cmd);
3407 *cmd = ioctl_table[i];
3408 if (*size > _IOC_SIZE(*cmd)) {
3409 printk("ioctl not yet supported\n");
3410 return -EFAULT;
3412 return 0;
3415 return -EINVAL;
3418 static int get_floppy_geometry(int drive, int type, struct floppy_struct **g)
3420 if (type)
3421 *g = &floppy_type[type];
3422 else {
3423 LOCK_FDC(drive, 0);
3424 CALL(poll_drive(0, 0));
3425 process_fd_request();
3426 *g = current_type[drive];
3428 if (!*g)
3429 return -ENODEV;
3430 return 0;
3433 static int fd_getgeo(struct block_device *bdev, struct hd_geometry *geo)
3435 int drive = (long)bdev->bd_disk->private_data;
3436 int type = ITYPE(drive_state[drive].fd_device);
3437 struct floppy_struct *g;
3438 int ret;
3440 ret = get_floppy_geometry(drive, type, &g);
3441 if (ret)
3442 return ret;
3444 geo->heads = g->head;
3445 geo->sectors = g->sect;
3446 geo->cylinders = g->track;
3447 return 0;
3450 static int fd_ioctl(struct inode *inode, struct file *filp, unsigned int cmd,
3451 unsigned long param)
3453 #define FD_IOCTL_ALLOWED ((filp) && (filp)->private_data)
3454 #define OUT(c,x) case c: outparam = (const char *) (x); break
3455 #define IN(c,x,tag) case c: *(x) = inparam. tag ; return 0
3457 int drive = (long)inode->i_bdev->bd_disk->private_data;
3458 int type = ITYPE(UDRS->fd_device);
3459 int i;
3460 int ret;
3461 int size;
3462 union inparam {
3463 struct floppy_struct g; /* geometry */
3464 struct format_descr f;
3465 struct floppy_max_errors max_errors;
3466 struct floppy_drive_params dp;
3467 } inparam; /* parameters coming from user space */
3468 const char *outparam; /* parameters passed back to user space */
3470 /* convert compatibility eject ioctls into floppy eject ioctl.
3471 * We do this in order to provide a means to eject floppy disks before
3472 * installing the new fdutils package */
3473 if (cmd == CDROMEJECT || /* CD-ROM eject */
3474 cmd == 0x6470 /* SunOS floppy eject */ ) {
3475 DPRINT("obsolete eject ioctl\n");
3476 DPRINT("please use floppycontrol --eject\n");
3477 cmd = FDEJECT;
3480 /* convert the old style command into a new style command */
3481 if ((cmd & 0xff00) == 0x0200) {
3482 ECALL(normalize_ioctl(&cmd, &size));
3483 } else
3484 return -EINVAL;
3486 /* permission checks */
3487 if (((cmd & 0x40) && !FD_IOCTL_ALLOWED) ||
3488 ((cmd & 0x80) && !capable(CAP_SYS_ADMIN)))
3489 return -EPERM;
3491 /* copyin */
3492 CLEARSTRUCT(&inparam);
3493 if (_IOC_DIR(cmd) & _IOC_WRITE)
3494 ECALL(fd_copyin((void __user *)param, &inparam, size))
3496 switch (cmd) {
3497 case FDEJECT:
3498 if (UDRS->fd_ref != 1)
3499 /* somebody else has this drive open */
3500 return -EBUSY;
3501 LOCK_FDC(drive, 1);
3503 /* do the actual eject. Fails on
3504 * non-Sparc architectures */
3505 ret = fd_eject(UNIT(drive));
3507 USETF(FD_DISK_CHANGED);
3508 USETF(FD_VERIFY);
3509 process_fd_request();
3510 return ret;
3511 case FDCLRPRM:
3512 LOCK_FDC(drive, 1);
3513 current_type[drive] = NULL;
3514 floppy_sizes[drive] = MAX_DISK_SIZE << 1;
3515 UDRS->keep_data = 0;
3516 return invalidate_drive(inode->i_bdev);
3517 case FDSETPRM:
3518 case FDDEFPRM:
3519 return set_geometry(cmd, &inparam.g,
3520 drive, type, inode->i_bdev);
3521 case FDGETPRM:
3522 ECALL(get_floppy_geometry(drive, type,
3523 (struct floppy_struct **)
3524 &outparam));
3525 break;
3527 case FDMSGON:
3528 UDP->flags |= FTD_MSG;
3529 return 0;
3530 case FDMSGOFF:
3531 UDP->flags &= ~FTD_MSG;
3532 return 0;
3534 case FDFMTBEG:
3535 LOCK_FDC(drive, 1);
3536 CALL(poll_drive(1, FD_RAW_NEED_DISK));
3537 ret = UDRS->flags;
3538 process_fd_request();
3539 if (ret & FD_VERIFY)
3540 return -ENODEV;
3541 if (!(ret & FD_DISK_WRITABLE))
3542 return -EROFS;
3543 return 0;
3544 case FDFMTTRK:
3545 if (UDRS->fd_ref != 1)
3546 return -EBUSY;
3547 return do_format(drive, &inparam.f);
3548 case FDFMTEND:
3549 case FDFLUSH:
3550 LOCK_FDC(drive, 1);
3551 return invalidate_drive(inode->i_bdev);
3553 case FDSETEMSGTRESH:
3554 UDP->max_errors.reporting =
3555 (unsigned short)(param & 0x0f);
3556 return 0;
3557 OUT(FDGETMAXERRS, &UDP->max_errors);
3558 IN(FDSETMAXERRS, &UDP->max_errors, max_errors);
3560 case FDGETDRVTYP:
3561 outparam = drive_name(type, drive);
3562 SUPBOUND(size, strlen(outparam) + 1);
3563 break;
3565 IN(FDSETDRVPRM, UDP, dp);
3566 OUT(FDGETDRVPRM, UDP);
3568 case FDPOLLDRVSTAT:
3569 LOCK_FDC(drive, 1);
3570 CALL(poll_drive(1, FD_RAW_NEED_DISK));
3571 process_fd_request();
3572 /* fall through */
3573 OUT(FDGETDRVSTAT, UDRS);
3575 case FDRESET:
3576 return user_reset_fdc(drive, (int)param, 1);
3578 OUT(FDGETFDCSTAT, UFDCS);
3580 case FDWERRORCLR:
3581 CLEARSTRUCT(UDRWE);
3582 return 0;
3583 OUT(FDWERRORGET, UDRWE);
3585 case FDRAWCMD:
3586 if (type)
3587 return -EINVAL;
3588 LOCK_FDC(drive, 1);
3589 set_floppy(drive);
3590 CALL(i = raw_cmd_ioctl(cmd, (void __user *)param));
3591 process_fd_request();
3592 return i;
3594 case FDTWADDLE:
3595 LOCK_FDC(drive, 1);
3596 twaddle();
3597 process_fd_request();
3598 return 0;
3600 default:
3601 return -EINVAL;
3604 if (_IOC_DIR(cmd) & _IOC_READ)
3605 return fd_copyout((void __user *)param, outparam, size);
3606 else
3607 return 0;
3608 #undef OUT
3609 #undef IN
3612 static void __init config_types(void)
3614 int first = 1;
3615 int drive;
3617 /* read drive info out of physical CMOS */
3618 drive = 0;
3619 if (!UDP->cmos)
3620 UDP->cmos = FLOPPY0_TYPE;
3621 drive = 1;
3622 if (!UDP->cmos && FLOPPY1_TYPE)
3623 UDP->cmos = FLOPPY1_TYPE;
3625 /* FIXME: additional physical CMOS drive detection should go here */
3627 for (drive = 0; drive < N_DRIVE; drive++) {
3628 unsigned int type = UDP->cmos;
3629 struct floppy_drive_params *params;
3630 const char *name = NULL;
3631 static char temparea[32];
3633 if (type < ARRAY_SIZE(default_drive_params)) {
3634 params = &default_drive_params[type].params;
3635 if (type) {
3636 name = default_drive_params[type].name;
3637 allowed_drive_mask |= 1 << drive;
3638 } else
3639 allowed_drive_mask &= ~(1 << drive);
3640 } else {
3641 params = &default_drive_params[0].params;
3642 sprintf(temparea, "unknown type %d (usb?)", type);
3643 name = temparea;
3645 if (name) {
3646 const char *prepend = ",";
3647 if (first) {
3648 prepend = KERN_INFO "Floppy drive(s):";
3649 first = 0;
3651 printk("%s fd%d is %s", prepend, drive, name);
3653 *UDP = *params;
3655 if (!first)
3656 printk("\n");
3659 static int floppy_release(struct inode *inode, struct file *filp)
3661 int drive = (long)inode->i_bdev->bd_disk->private_data;
3663 mutex_lock(&open_lock);
3664 if (UDRS->fd_ref < 0)
3665 UDRS->fd_ref = 0;
3666 else if (!UDRS->fd_ref--) {
3667 DPRINT("floppy_release with fd_ref == 0");
3668 UDRS->fd_ref = 0;
3670 if (!UDRS->fd_ref)
3671 opened_bdev[drive] = NULL;
3672 mutex_unlock(&open_lock);
3674 return 0;
3678 * floppy_open check for aliasing (/dev/fd0 can be the same as
3679 * /dev/PS0 etc), and disallows simultaneous access to the same
3680 * drive with different device numbers.
3682 static int floppy_open(struct inode *inode, struct file *filp)
3684 int drive = (long)inode->i_bdev->bd_disk->private_data;
3685 int old_dev;
3686 int try;
3687 int res = -EBUSY;
3688 char *tmp;
3690 filp->private_data = (void *)0;
3691 mutex_lock(&open_lock);
3692 old_dev = UDRS->fd_device;
3693 if (opened_bdev[drive] && opened_bdev[drive] != inode->i_bdev)
3694 goto out2;
3696 if (!UDRS->fd_ref && (UDP->flags & FD_BROKEN_DCL)) {
3697 USETF(FD_DISK_CHANGED);
3698 USETF(FD_VERIFY);
3701 if (UDRS->fd_ref == -1 || (UDRS->fd_ref && (filp->f_flags & O_EXCL)))
3702 goto out2;
3704 if (filp->f_flags & O_EXCL)
3705 UDRS->fd_ref = -1;
3706 else
3707 UDRS->fd_ref++;
3709 opened_bdev[drive] = inode->i_bdev;
3711 res = -ENXIO;
3713 if (!floppy_track_buffer) {
3714 /* if opening an ED drive, reserve a big buffer,
3715 * else reserve a small one */
3716 if ((UDP->cmos == 6) || (UDP->cmos == 5))
3717 try = 64; /* Only 48 actually useful */
3718 else
3719 try = 32; /* Only 24 actually useful */
3721 tmp = (char *)fd_dma_mem_alloc(1024 * try);
3722 if (!tmp && !floppy_track_buffer) {
3723 try >>= 1; /* buffer only one side */
3724 INFBOUND(try, 16);
3725 tmp = (char *)fd_dma_mem_alloc(1024 * try);
3727 if (!tmp && !floppy_track_buffer) {
3728 fallback_on_nodma_alloc(&tmp, 2048 * try);
3730 if (!tmp && !floppy_track_buffer) {
3731 DPRINT("Unable to allocate DMA memory\n");
3732 goto out;
3734 if (floppy_track_buffer) {
3735 if (tmp)
3736 fd_dma_mem_free((unsigned long)tmp, try * 1024);
3737 } else {
3738 buffer_min = buffer_max = -1;
3739 floppy_track_buffer = tmp;
3740 max_buffer_sectors = try;
3744 UDRS->fd_device = iminor(inode);
3745 set_capacity(disks[drive], floppy_sizes[iminor(inode)]);
3746 if (old_dev != -1 && old_dev != iminor(inode)) {
3747 if (buffer_drive == drive)
3748 buffer_track = -1;
3751 /* Allow ioctls if we have write-permissions even if read-only open.
3752 * Needed so that programs such as fdrawcmd still can work on write
3753 * protected disks */
3754 if ((filp->f_mode & FMODE_WRITE) || !file_permission(filp, MAY_WRITE))
3755 filp->private_data = (void *)8;
3757 if (UFDCS->rawcmd == 1)
3758 UFDCS->rawcmd = 2;
3760 if (!(filp->f_flags & O_NDELAY)) {
3761 if (filp->f_mode & 3) {
3762 UDRS->last_checked = 0;
3763 check_disk_change(inode->i_bdev);
3764 if (UTESTF(FD_DISK_CHANGED))
3765 goto out;
3767 res = -EROFS;
3768 if ((filp->f_mode & 2) && !(UTESTF(FD_DISK_WRITABLE)))
3769 goto out;
3771 mutex_unlock(&open_lock);
3772 return 0;
3773 out:
3774 if (UDRS->fd_ref < 0)
3775 UDRS->fd_ref = 0;
3776 else
3777 UDRS->fd_ref--;
3778 if (!UDRS->fd_ref)
3779 opened_bdev[drive] = NULL;
3780 out2:
3781 mutex_unlock(&open_lock);
3782 return res;
3786 * Check if the disk has been changed or if a change has been faked.
3788 static int check_floppy_change(struct gendisk *disk)
3790 int drive = (long)disk->private_data;
3792 if (UTESTF(FD_DISK_CHANGED) || UTESTF(FD_VERIFY))
3793 return 1;
3795 if (time_after(jiffies, UDRS->last_checked + UDP->checkfreq)) {
3796 lock_fdc(drive, 0);
3797 poll_drive(0, 0);
3798 process_fd_request();
3801 if (UTESTF(FD_DISK_CHANGED) ||
3802 UTESTF(FD_VERIFY) ||
3803 test_bit(drive, &fake_change) ||
3804 (!ITYPE(UDRS->fd_device) && !current_type[drive]))
3805 return 1;
3806 return 0;
3810 * This implements "read block 0" for floppy_revalidate().
3811 * Needed for format autodetection, checking whether there is
3812 * a disk in the drive, and whether that disk is writable.
3815 static void floppy_rb0_complete(struct bio *bio,
3816 int err)
3818 complete((struct completion *)bio->bi_private);
3821 static int __floppy_read_block_0(struct block_device *bdev)
3823 struct bio bio;
3824 struct bio_vec bio_vec;
3825 struct completion complete;
3826 struct page *page;
3827 size_t size;
3829 page = alloc_page(GFP_NOIO);
3830 if (!page) {
3831 process_fd_request();
3832 return -ENOMEM;
3835 size = bdev->bd_block_size;
3836 if (!size)
3837 size = 1024;
3839 bio_init(&bio);
3840 bio.bi_io_vec = &bio_vec;
3841 bio_vec.bv_page = page;
3842 bio_vec.bv_len = size;
3843 bio_vec.bv_offset = 0;
3844 bio.bi_vcnt = 1;
3845 bio.bi_idx = 0;
3846 bio.bi_size = size;
3847 bio.bi_bdev = bdev;
3848 bio.bi_sector = 0;
3849 init_completion(&complete);
3850 bio.bi_private = &complete;
3851 bio.bi_end_io = floppy_rb0_complete;
3853 submit_bio(READ, &bio);
3854 generic_unplug_device(bdev_get_queue(bdev));
3855 process_fd_request();
3856 wait_for_completion(&complete);
3858 __free_page(page);
3860 return 0;
3863 /* revalidate the floppy disk, i.e. trigger format autodetection by reading
3864 * the bootblock (block 0). "Autodetection" is also needed to check whether
3865 * there is a disk in the drive at all... Thus we also do it for fixed
3866 * geometry formats */
3867 static int floppy_revalidate(struct gendisk *disk)
3869 int drive = (long)disk->private_data;
3870 #define NO_GEOM (!current_type[drive] && !ITYPE(UDRS->fd_device))
3871 int cf;
3872 int res = 0;
3874 if (UTESTF(FD_DISK_CHANGED) ||
3875 UTESTF(FD_VERIFY) || test_bit(drive, &fake_change) || NO_GEOM) {
3876 if (usage_count == 0) {
3877 printk("VFS: revalidate called on non-open device.\n");
3878 return -EFAULT;
3880 lock_fdc(drive, 0);
3881 cf = UTESTF(FD_DISK_CHANGED) || UTESTF(FD_VERIFY);
3882 if (!(cf || test_bit(drive, &fake_change) || NO_GEOM)) {
3883 process_fd_request(); /*already done by another thread */
3884 return 0;
3886 UDRS->maxblock = 0;
3887 UDRS->maxtrack = 0;
3888 if (buffer_drive == drive)
3889 buffer_track = -1;
3890 clear_bit(drive, &fake_change);
3891 UCLEARF(FD_DISK_CHANGED);
3892 if (cf)
3893 UDRS->generation++;
3894 if (NO_GEOM) {
3895 /* auto-sensing */
3896 res = __floppy_read_block_0(opened_bdev[drive]);
3897 } else {
3898 if (cf)
3899 poll_drive(0, FD_RAW_NEED_DISK);
3900 process_fd_request();
3903 set_capacity(disk, floppy_sizes[UDRS->fd_device]);
3904 return res;
3907 static struct block_device_operations floppy_fops = {
3908 .owner = THIS_MODULE,
3909 .open = floppy_open,
3910 .release = floppy_release,
3911 .ioctl = fd_ioctl,
3912 .getgeo = fd_getgeo,
3913 .media_changed = check_floppy_change,
3914 .revalidate_disk = floppy_revalidate,
3918 * Floppy Driver initialization
3919 * =============================
3922 /* Determine the floppy disk controller type */
3923 /* This routine was written by David C. Niemi */
3924 static char __init get_fdc_version(void)
3926 int r;
3928 output_byte(FD_DUMPREGS); /* 82072 and better know DUMPREGS */
3929 if (FDCS->reset)
3930 return FDC_NONE;
3931 if ((r = result()) <= 0x00)
3932 return FDC_NONE; /* No FDC present ??? */
3933 if ((r == 1) && (reply_buffer[0] == 0x80)) {
3934 printk(KERN_INFO "FDC %d is an 8272A\n", fdc);
3935 return FDC_8272A; /* 8272a/765 don't know DUMPREGS */
3937 if (r != 10) {
3938 printk
3939 ("FDC %d init: DUMPREGS: unexpected return of %d bytes.\n",
3940 fdc, r);
3941 return FDC_UNKNOWN;
3944 if (!fdc_configure()) {
3945 printk(KERN_INFO "FDC %d is an 82072\n", fdc);
3946 return FDC_82072; /* 82072 doesn't know CONFIGURE */
3949 output_byte(FD_PERPENDICULAR);
3950 if (need_more_output() == MORE_OUTPUT) {
3951 output_byte(0);
3952 } else {
3953 printk(KERN_INFO "FDC %d is an 82072A\n", fdc);
3954 return FDC_82072A; /* 82072A as found on Sparcs. */
3957 output_byte(FD_UNLOCK);
3958 r = result();
3959 if ((r == 1) && (reply_buffer[0] == 0x80)) {
3960 printk(KERN_INFO "FDC %d is a pre-1991 82077\n", fdc);
3961 return FDC_82077_ORIG; /* Pre-1991 82077, doesn't know
3962 * LOCK/UNLOCK */
3964 if ((r != 1) || (reply_buffer[0] != 0x00)) {
3965 printk("FDC %d init: UNLOCK: unexpected return of %d bytes.\n",
3966 fdc, r);
3967 return FDC_UNKNOWN;
3969 output_byte(FD_PARTID);
3970 r = result();
3971 if (r != 1) {
3972 printk("FDC %d init: PARTID: unexpected return of %d bytes.\n",
3973 fdc, r);
3974 return FDC_UNKNOWN;
3976 if (reply_buffer[0] == 0x80) {
3977 printk(KERN_INFO "FDC %d is a post-1991 82077\n", fdc);
3978 return FDC_82077; /* Revised 82077AA passes all the tests */
3980 switch (reply_buffer[0] >> 5) {
3981 case 0x0:
3982 /* Either a 82078-1 or a 82078SL running at 5Volt */
3983 printk(KERN_INFO "FDC %d is an 82078.\n", fdc);
3984 return FDC_82078;
3985 case 0x1:
3986 printk(KERN_INFO "FDC %d is a 44pin 82078\n", fdc);
3987 return FDC_82078;
3988 case 0x2:
3989 printk(KERN_INFO "FDC %d is a S82078B\n", fdc);
3990 return FDC_S82078B;
3991 case 0x3:
3992 printk(KERN_INFO "FDC %d is a National Semiconductor PC87306\n",
3993 fdc);
3994 return FDC_87306;
3995 default:
3996 printk(KERN_INFO
3997 "FDC %d init: 82078 variant with unknown PARTID=%d.\n",
3998 fdc, reply_buffer[0] >> 5);
3999 return FDC_82078_UNKN;
4001 } /* get_fdc_version */
4003 /* lilo configuration */
4005 static void __init floppy_set_flags(int *ints, int param, int param2)
4007 int i;
4009 for (i = 0; i < ARRAY_SIZE(default_drive_params); i++) {
4010 if (param)
4011 default_drive_params[i].params.flags |= param2;
4012 else
4013 default_drive_params[i].params.flags &= ~param2;
4015 DPRINT("%s flag 0x%x\n", param2 ? "Setting" : "Clearing", param);
4018 static void __init daring(int *ints, int param, int param2)
4020 int i;
4022 for (i = 0; i < ARRAY_SIZE(default_drive_params); i++) {
4023 if (param) {
4024 default_drive_params[i].params.select_delay = 0;
4025 default_drive_params[i].params.flags |=
4026 FD_SILENT_DCL_CLEAR;
4027 } else {
4028 default_drive_params[i].params.select_delay =
4029 2 * HZ / 100;
4030 default_drive_params[i].params.flags &=
4031 ~FD_SILENT_DCL_CLEAR;
4034 DPRINT("Assuming %s floppy hardware\n", param ? "standard" : "broken");
4037 static void __init set_cmos(int *ints, int dummy, int dummy2)
4039 int current_drive = 0;
4041 if (ints[0] != 2) {
4042 DPRINT("wrong number of parameters for CMOS\n");
4043 return;
4045 current_drive = ints[1];
4046 if (current_drive < 0 || current_drive >= 8) {
4047 DPRINT("bad drive for set_cmos\n");
4048 return;
4050 #if N_FDC > 1
4051 if (current_drive >= 4 && !FDC2)
4052 FDC2 = 0x370;
4053 #endif
4054 DP->cmos = ints[2];
4055 DPRINT("setting CMOS code to %d\n", ints[2]);
4058 static struct param_table {
4059 const char *name;
4060 void (*fn) (int *ints, int param, int param2);
4061 int *var;
4062 int def_param;
4063 int param2;
4064 } config_params[] __initdata = {
4065 {"allowed_drive_mask", NULL, &allowed_drive_mask, 0xff, 0}, /* obsolete */
4066 {"all_drives", NULL, &allowed_drive_mask, 0xff, 0}, /* obsolete */
4067 {"asus_pci", NULL, &allowed_drive_mask, 0x33, 0},
4068 {"irq", NULL, &FLOPPY_IRQ, 6, 0},
4069 {"dma", NULL, &FLOPPY_DMA, 2, 0},
4070 {"daring", daring, NULL, 1, 0},
4071 #if N_FDC > 1
4072 {"two_fdc", NULL, &FDC2, 0x370, 0},
4073 {"one_fdc", NULL, &FDC2, 0, 0},
4074 #endif
4075 {"thinkpad", floppy_set_flags, NULL, 1, FD_INVERTED_DCL},
4076 {"broken_dcl", floppy_set_flags, NULL, 1, FD_BROKEN_DCL},
4077 {"messages", floppy_set_flags, NULL, 1, FTD_MSG},
4078 {"silent_dcl_clear", floppy_set_flags, NULL, 1, FD_SILENT_DCL_CLEAR},
4079 {"debug", floppy_set_flags, NULL, 1, FD_DEBUG},
4080 {"nodma", NULL, &can_use_virtual_dma, 1, 0},
4081 {"omnibook", NULL, &can_use_virtual_dma, 1, 0},
4082 {"yesdma", NULL, &can_use_virtual_dma, 0, 0},
4083 {"fifo_depth", NULL, &fifo_depth, 0xa, 0},
4084 {"nofifo", NULL, &no_fifo, 0x20, 0},
4085 {"usefifo", NULL, &no_fifo, 0, 0},
4086 {"cmos", set_cmos, NULL, 0, 0},
4087 {"slow", NULL, &slow_floppy, 1, 0},
4088 {"unexpected_interrupts", NULL, &print_unex, 1, 0},
4089 {"no_unexpected_interrupts", NULL, &print_unex, 0, 0},
4090 {"L40SX", NULL, &print_unex, 0, 0}
4092 EXTRA_FLOPPY_PARAMS
4095 static int __init floppy_setup(char *str)
4097 int i;
4098 int param;
4099 int ints[11];
4101 str = get_options(str, ARRAY_SIZE(ints), ints);
4102 if (str) {
4103 for (i = 0; i < ARRAY_SIZE(config_params); i++) {
4104 if (strcmp(str, config_params[i].name) == 0) {
4105 if (ints[0])
4106 param = ints[1];
4107 else
4108 param = config_params[i].def_param;
4109 if (config_params[i].fn)
4110 config_params[i].
4111 fn(ints, param,
4112 config_params[i].param2);
4113 if (config_params[i].var) {
4114 DPRINT("%s=%d\n", str, param);
4115 *config_params[i].var = param;
4117 return 1;
4121 if (str) {
4122 DPRINT("unknown floppy option [%s]\n", str);
4124 DPRINT("allowed options are:");
4125 for (i = 0; i < ARRAY_SIZE(config_params); i++)
4126 printk(" %s", config_params[i].name);
4127 printk("\n");
4128 } else
4129 DPRINT("botched floppy option\n");
4130 DPRINT("Read Documentation/floppy.txt\n");
4131 return 0;
4134 static int have_no_fdc = -ENODEV;
4136 static ssize_t floppy_cmos_show(struct device *dev,
4137 struct device_attribute *attr, char *buf)
4139 struct platform_device *p;
4140 int drive;
4142 p = container_of(dev, struct platform_device,dev);
4143 drive = p->id;
4144 return sprintf(buf, "%X\n", UDP->cmos);
4146 DEVICE_ATTR(cmos,S_IRUGO,floppy_cmos_show,NULL);
4148 static void floppy_device_release(struct device *dev)
4150 <<<<<<< HEAD:drivers/block/floppy.c
4151 complete(&device_release);
4152 =======
4153 >>>>>>> 264e3e889d86e552b4191d69bb60f4f3b383135a:drivers/block/floppy.c
4156 static struct platform_device floppy_device[N_DRIVE];
4158 static struct kobject *floppy_find(dev_t dev, int *part, void *data)
4160 int drive = (*part & 3) | ((*part & 0x80) >> 5);
4161 if (drive >= N_DRIVE ||
4162 !(allowed_drive_mask & (1 << drive)) ||
4163 fdc_state[FDC(drive)].version == FDC_NONE)
4164 return NULL;
4165 if (((*part >> 2) & 0x1f) >= ARRAY_SIZE(floppy_type))
4166 return NULL;
4167 *part = 0;
4168 return get_disk(disks[drive]);
4171 static int __init floppy_init(void)
4173 int i, unit, drive;
4174 int err, dr;
4176 #if defined(CONFIG_PPC_MERGE)
4177 if (check_legacy_ioport(FDC1))
4178 return -ENODEV;
4179 #endif
4181 raw_cmd = NULL;
4183 for (dr = 0; dr < N_DRIVE; dr++) {
4184 disks[dr] = alloc_disk(1);
4185 if (!disks[dr]) {
4186 err = -ENOMEM;
4187 goto out_put_disk;
4190 disks[dr]->major = FLOPPY_MAJOR;
4191 disks[dr]->first_minor = TOMINOR(dr);
4192 disks[dr]->fops = &floppy_fops;
4193 sprintf(disks[dr]->disk_name, "fd%d", dr);
4195 init_timer(&motor_off_timer[dr]);
4196 motor_off_timer[dr].data = dr;
4197 motor_off_timer[dr].function = motor_off_callback;
4200 err = register_blkdev(FLOPPY_MAJOR, "fd");
4201 if (err)
4202 goto out_put_disk;
4204 floppy_queue = blk_init_queue(do_fd_request, &floppy_lock);
4205 if (!floppy_queue) {
4206 err = -ENOMEM;
4207 goto out_unreg_blkdev;
4209 blk_queue_max_sectors(floppy_queue, 64);
4211 blk_register_region(MKDEV(FLOPPY_MAJOR, 0), 256, THIS_MODULE,
4212 floppy_find, NULL, NULL);
4214 for (i = 0; i < 256; i++)
4215 if (ITYPE(i))
4216 floppy_sizes[i] = floppy_type[ITYPE(i)].size;
4217 else
4218 floppy_sizes[i] = MAX_DISK_SIZE << 1;
4220 reschedule_timeout(MAXTIMEOUT, "floppy init", MAXTIMEOUT);
4221 config_types();
4223 for (i = 0; i < N_FDC; i++) {
4224 fdc = i;
4225 CLEARSTRUCT(FDCS);
4226 FDCS->dtr = -1;
4227 FDCS->dor = 0x4;
4228 #if defined(__sparc__) || defined(__mc68000__)
4229 /*sparcs/sun3x don't have a DOR reset which we can fall back on to */
4230 #ifdef __mc68000__
4231 if (MACH_IS_SUN3X)
4232 #endif
4233 FDCS->version = FDC_82072A;
4234 #endif
4237 use_virtual_dma = can_use_virtual_dma & 1;
4238 fdc_state[0].address = FDC1;
4239 if (fdc_state[0].address == -1) {
4240 del_timer(&fd_timeout);
4241 err = -ENODEV;
4242 goto out_unreg_region;
4244 #if N_FDC > 1
4245 fdc_state[1].address = FDC2;
4246 #endif
4248 fdc = 0; /* reset fdc in case of unexpected interrupt */
4249 err = floppy_grab_irq_and_dma();
4250 if (err) {
4251 del_timer(&fd_timeout);
4252 err = -EBUSY;
4253 goto out_unreg_region;
4256 /* initialise drive state */
4257 for (drive = 0; drive < N_DRIVE; drive++) {
4258 CLEARSTRUCT(UDRS);
4259 CLEARSTRUCT(UDRWE);
4260 USETF(FD_DISK_NEWCHANGE);
4261 USETF(FD_DISK_CHANGED);
4262 USETF(FD_VERIFY);
4263 UDRS->fd_device = -1;
4264 floppy_track_buffer = NULL;
4265 max_buffer_sectors = 0;
4268 * Small 10 msec delay to let through any interrupt that
4269 * initialization might have triggered, to not
4270 * confuse detection:
4272 msleep(10);
4274 for (i = 0; i < N_FDC; i++) {
4275 fdc = i;
4276 FDCS->driver_version = FD_DRIVER_VERSION;
4277 for (unit = 0; unit < 4; unit++)
4278 FDCS->track[unit] = 0;
4279 if (FDCS->address == -1)
4280 continue;
4281 FDCS->rawcmd = 2;
4282 if (user_reset_fdc(-1, FD_RESET_ALWAYS, 0)) {
4283 /* free ioports reserved by floppy_grab_irq_and_dma() */
4284 release_region(FDCS->address + 2, 4);
4285 release_region(FDCS->address + 7, 1);
4286 FDCS->address = -1;
4287 FDCS->version = FDC_NONE;
4288 continue;
4290 /* Try to determine the floppy controller type */
4291 FDCS->version = get_fdc_version();
4292 if (FDCS->version == FDC_NONE) {
4293 /* free ioports reserved by floppy_grab_irq_and_dma() */
4294 release_region(FDCS->address + 2, 4);
4295 release_region(FDCS->address + 7, 1);
4296 FDCS->address = -1;
4297 continue;
4299 if (can_use_virtual_dma == 2 && FDCS->version < FDC_82072A)
4300 can_use_virtual_dma = 0;
4302 have_no_fdc = 0;
4303 /* Not all FDCs seem to be able to handle the version command
4304 * properly, so force a reset for the standard FDC clones,
4305 * to avoid interrupt garbage.
4307 user_reset_fdc(-1, FD_RESET_ALWAYS, 0);
4309 fdc = 0;
4310 del_timer(&fd_timeout);
4311 current_drive = 0;
4312 initialising = 0;
4313 if (have_no_fdc) {
4314 DPRINT("no floppy controllers found\n");
4315 err = have_no_fdc;
4316 goto out_flush_work;
4319 for (drive = 0; drive < N_DRIVE; drive++) {
4320 if (!(allowed_drive_mask & (1 << drive)))
4321 continue;
4322 if (fdc_state[FDC(drive)].version == FDC_NONE)
4323 continue;
4325 floppy_device[drive].name = floppy_device_name;
4326 floppy_device[drive].id = drive;
4327 floppy_device[drive].dev.release = floppy_device_release;
4329 err = platform_device_register(&floppy_device[drive]);
4330 if (err)
4331 goto out_flush_work;
4333 err = device_create_file(&floppy_device[drive].dev,&dev_attr_cmos);
4334 if (err)
4335 goto out_unreg_platform_dev;
4337 /* to be cleaned up... */
4338 disks[drive]->private_data = (void *)(long)drive;
4339 disks[drive]->queue = floppy_queue;
4340 disks[drive]->flags |= GENHD_FL_REMOVABLE;
4341 disks[drive]->driverfs_dev = &floppy_device[drive].dev;
4342 add_disk(disks[drive]);
4345 return 0;
4347 out_unreg_platform_dev:
4348 platform_device_unregister(&floppy_device[drive]);
4349 out_flush_work:
4350 flush_scheduled_work();
4351 if (usage_count)
4352 floppy_release_irq_and_dma();
4353 out_unreg_region:
4354 blk_unregister_region(MKDEV(FLOPPY_MAJOR, 0), 256);
4355 blk_cleanup_queue(floppy_queue);
4356 out_unreg_blkdev:
4357 unregister_blkdev(FLOPPY_MAJOR, "fd");
4358 out_put_disk:
4359 while (dr--) {
4360 del_timer(&motor_off_timer[dr]);
4361 put_disk(disks[dr]);
4363 return err;
4366 static DEFINE_SPINLOCK(floppy_usage_lock);
4368 static int floppy_grab_irq_and_dma(void)
4370 unsigned long flags;
4372 spin_lock_irqsave(&floppy_usage_lock, flags);
4373 if (usage_count++) {
4374 spin_unlock_irqrestore(&floppy_usage_lock, flags);
4375 return 0;
4377 spin_unlock_irqrestore(&floppy_usage_lock, flags);
4380 * We might have scheduled a free_irq(), wait it to
4381 * drain first:
4383 flush_scheduled_work();
4385 if (fd_request_irq()) {
4386 DPRINT("Unable to grab IRQ%d for the floppy driver\n",
4387 FLOPPY_IRQ);
4388 spin_lock_irqsave(&floppy_usage_lock, flags);
4389 usage_count--;
4390 spin_unlock_irqrestore(&floppy_usage_lock, flags);
4391 return -1;
4393 if (fd_request_dma()) {
4394 DPRINT("Unable to grab DMA%d for the floppy driver\n",
4395 FLOPPY_DMA);
4396 if (can_use_virtual_dma & 2)
4397 use_virtual_dma = can_use_virtual_dma = 1;
4398 if (!(can_use_virtual_dma & 1)) {
4399 fd_free_irq();
4400 spin_lock_irqsave(&floppy_usage_lock, flags);
4401 usage_count--;
4402 spin_unlock_irqrestore(&floppy_usage_lock, flags);
4403 return -1;
4407 for (fdc = 0; fdc < N_FDC; fdc++) {
4408 if (FDCS->address != -1) {
4409 if (!request_region(FDCS->address + 2, 4, "floppy")) {
4410 DPRINT("Floppy io-port 0x%04lx in use\n",
4411 FDCS->address + 2);
4412 goto cleanup1;
4414 if (!request_region(FDCS->address + 7, 1, "floppy DIR")) {
4415 DPRINT("Floppy io-port 0x%04lx in use\n",
4416 FDCS->address + 7);
4417 goto cleanup2;
4419 /* address + 6 is reserved, and may be taken by IDE.
4420 * Unfortunately, Adaptec doesn't know this :-(, */
4423 for (fdc = 0; fdc < N_FDC; fdc++) {
4424 if (FDCS->address != -1) {
4425 reset_fdc_info(1);
4426 fd_outb(FDCS->dor, FD_DOR);
4429 fdc = 0;
4430 set_dor(0, ~0, 8); /* avoid immediate interrupt */
4432 for (fdc = 0; fdc < N_FDC; fdc++)
4433 if (FDCS->address != -1)
4434 fd_outb(FDCS->dor, FD_DOR);
4436 * The driver will try and free resources and relies on us
4437 * to know if they were allocated or not.
4439 fdc = 0;
4440 irqdma_allocated = 1;
4441 return 0;
4442 cleanup2:
4443 release_region(FDCS->address + 2, 4);
4444 cleanup1:
4445 fd_free_irq();
4446 fd_free_dma();
4447 while (--fdc >= 0) {
4448 release_region(FDCS->address + 2, 4);
4449 release_region(FDCS->address + 7, 1);
4451 spin_lock_irqsave(&floppy_usage_lock, flags);
4452 usage_count--;
4453 spin_unlock_irqrestore(&floppy_usage_lock, flags);
4454 return -1;
4457 static void floppy_release_irq_and_dma(void)
4459 int old_fdc;
4460 #ifdef FLOPPY_SANITY_CHECK
4461 #ifndef __sparc__
4462 int drive;
4463 #endif
4464 #endif
4465 long tmpsize;
4466 unsigned long tmpaddr;
4467 unsigned long flags;
4469 spin_lock_irqsave(&floppy_usage_lock, flags);
4470 if (--usage_count) {
4471 spin_unlock_irqrestore(&floppy_usage_lock, flags);
4472 return;
4474 spin_unlock_irqrestore(&floppy_usage_lock, flags);
4475 if (irqdma_allocated) {
4476 fd_disable_dma();
4477 fd_free_dma();
4478 fd_free_irq();
4479 irqdma_allocated = 0;
4481 set_dor(0, ~0, 8);
4482 #if N_FDC > 1
4483 set_dor(1, ~8, 0);
4484 #endif
4485 floppy_enable_hlt();
4487 if (floppy_track_buffer && max_buffer_sectors) {
4488 tmpsize = max_buffer_sectors * 1024;
4489 tmpaddr = (unsigned long)floppy_track_buffer;
4490 floppy_track_buffer = NULL;
4491 max_buffer_sectors = 0;
4492 buffer_min = buffer_max = -1;
4493 fd_dma_mem_free(tmpaddr, tmpsize);
4495 #ifdef FLOPPY_SANITY_CHECK
4496 #ifndef __sparc__
4497 for (drive = 0; drive < N_FDC * 4; drive++)
4498 if (timer_pending(motor_off_timer + drive))
4499 printk("motor off timer %d still active\n", drive);
4500 #endif
4502 if (timer_pending(&fd_timeout))
4503 printk("floppy timer still active:%s\n", timeout_message);
4504 if (timer_pending(&fd_timer))
4505 printk("auxiliary floppy timer still active\n");
4506 if (work_pending(&floppy_work))
4507 printk("work still pending\n");
4508 #endif
4509 old_fdc = fdc;
4510 for (fdc = 0; fdc < N_FDC; fdc++)
4511 if (FDCS->address != -1) {
4512 release_region(FDCS->address + 2, 4);
4513 release_region(FDCS->address + 7, 1);
4515 fdc = old_fdc;
4518 #ifdef MODULE
4520 static char *floppy;
4522 static void __init parse_floppy_cfg_string(char *cfg)
4524 char *ptr;
4526 while (*cfg) {
4527 for (ptr = cfg; *cfg && *cfg != ' ' && *cfg != '\t'; cfg++) ;
4528 if (*cfg) {
4529 *cfg = '\0';
4530 cfg++;
4532 if (*ptr)
4533 floppy_setup(ptr);
4537 int __init init_module(void)
4539 if (floppy)
4540 parse_floppy_cfg_string(floppy);
4541 return floppy_init();
4544 void cleanup_module(void)
4546 int drive;
4548 <<<<<<< HEAD:drivers/block/floppy.c
4549 init_completion(&device_release);
4550 =======
4551 >>>>>>> 264e3e889d86e552b4191d69bb60f4f3b383135a:drivers/block/floppy.c
4552 blk_unregister_region(MKDEV(FLOPPY_MAJOR, 0), 256);
4553 unregister_blkdev(FLOPPY_MAJOR, "fd");
4555 for (drive = 0; drive < N_DRIVE; drive++) {
4556 del_timer_sync(&motor_off_timer[drive]);
4558 if ((allowed_drive_mask & (1 << drive)) &&
4559 fdc_state[FDC(drive)].version != FDC_NONE) {
4560 del_gendisk(disks[drive]);
4561 device_remove_file(&floppy_device[drive].dev, &dev_attr_cmos);
4562 platform_device_unregister(&floppy_device[drive]);
4564 put_disk(disks[drive]);
4567 del_timer_sync(&fd_timeout);
4568 del_timer_sync(&fd_timer);
4569 blk_cleanup_queue(floppy_queue);
4571 if (usage_count)
4572 floppy_release_irq_and_dma();
4574 /* eject disk, if any */
4575 fd_eject(0);
4576 <<<<<<< HEAD:drivers/block/floppy.c
4578 wait_for_completion(&device_release);
4579 =======
4580 >>>>>>> 264e3e889d86e552b4191d69bb60f4f3b383135a:drivers/block/floppy.c
4583 module_param(floppy, charp, 0);
4584 module_param(FLOPPY_IRQ, int, 0);
4585 module_param(FLOPPY_DMA, int, 0);
4586 MODULE_AUTHOR("Alain L. Knaff");
4587 MODULE_SUPPORTED_DEVICE("fd");
4588 MODULE_LICENSE("GPL");
4590 #else
4592 __setup("floppy=", floppy_setup);
4593 module_init(floppy_init)
4594 #endif
4596 MODULE_ALIAS_BLOCKDEV_MAJOR(FLOPPY_MAJOR);