x86 idle floppy: deprecate disable_hlt()
[linux-2.6/linux-acpi-2.6/ibm-acpi-2.6.git] / drivers / block / floppy.c
blob20aea9b511b5f1cdcecb039af23ab8ca80a66fe9
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 #undef FLOPPY_SILENT_DCL_CLEAR
149 #define REALLY_SLOW_IO
151 #define DEBUGT 2
153 #define DPRINT(format, args...) \
154 pr_info("floppy%d: " format, current_drive, ##args)
156 #define DCL_DEBUG /* debug disk change line */
157 #ifdef DCL_DEBUG
158 #define debug_dcl(test, fmt, args...) \
159 do { if ((test) & FD_DEBUG) DPRINT(fmt, ##args); } while (0)
160 #else
161 #define debug_dcl(test, fmt, args...) \
162 do { if (0) DPRINT(fmt, ##args); } while (0)
163 #endif
165 /* do print messages for unexpected interrupts */
166 static int print_unex = 1;
167 #include <linux/module.h>
168 #include <linux/sched.h>
169 #include <linux/fs.h>
170 #include <linux/kernel.h>
171 #include <linux/timer.h>
172 #include <linux/workqueue.h>
173 #define FDPATCHES
174 #include <linux/fdreg.h>
175 #include <linux/fd.h>
176 #include <linux/hdreg.h>
177 #include <linux/errno.h>
178 #include <linux/slab.h>
179 #include <linux/mm.h>
180 #include <linux/bio.h>
181 #include <linux/string.h>
182 #include <linux/jiffies.h>
183 #include <linux/fcntl.h>
184 #include <linux/delay.h>
185 #include <linux/mc146818rtc.h> /* CMOS defines */
186 #include <linux/ioport.h>
187 #include <linux/interrupt.h>
188 #include <linux/init.h>
189 #include <linux/platform_device.h>
190 #include <linux/mod_devicetable.h>
191 #include <linux/buffer_head.h> /* for invalidate_buffers() */
192 #include <linux/mutex.h>
193 #include <linux/io.h>
194 #include <linux/uaccess.h>
197 * PS/2 floppies have much slower step rates than regular floppies.
198 * It's been recommended that take about 1/4 of the default speed
199 * in some more extreme cases.
201 static DEFINE_MUTEX(floppy_mutex);
202 static int slow_floppy;
204 #include <asm/dma.h>
205 #include <asm/irq.h>
206 #include <asm/system.h>
208 static int FLOPPY_IRQ = 6;
209 static int FLOPPY_DMA = 2;
210 static int can_use_virtual_dma = 2;
211 /* =======
212 * can use virtual DMA:
213 * 0 = use of virtual DMA disallowed by config
214 * 1 = use of virtual DMA prescribed by config
215 * 2 = no virtual DMA preference configured. By default try hard DMA,
216 * but fall back on virtual DMA when not enough memory available
219 static int use_virtual_dma;
220 /* =======
221 * use virtual DMA
222 * 0 using hard DMA
223 * 1 using virtual DMA
224 * This variable is set to virtual when a DMA mem problem arises, and
225 * reset back in floppy_grab_irq_and_dma.
226 * It is not safe to reset it in other circumstances, because the floppy
227 * driver may have several buffers in use at once, and we do currently not
228 * record each buffers capabilities
231 static DEFINE_SPINLOCK(floppy_lock);
233 static unsigned short virtual_dma_port = 0x3f0;
234 irqreturn_t floppy_interrupt(int irq, void *dev_id);
235 static int set_dor(int fdc, char mask, char data);
237 #define K_64 0x10000 /* 64KB */
239 /* the following is the mask of allowed drives. By default units 2 and
240 * 3 of both floppy controllers are disabled, because switching on the
241 * motor of these drives causes system hangs on some PCI computers. drive
242 * 0 is the low bit (0x1), and drive 7 is the high bit (0x80). Bits are on if
243 * a drive is allowed.
245 * NOTE: This must come before we include the arch floppy header because
246 * some ports reference this variable from there. -DaveM
249 static int allowed_drive_mask = 0x33;
251 #include <asm/floppy.h>
253 static int irqdma_allocated;
255 #include <linux/blkdev.h>
256 #include <linux/blkpg.h>
257 #include <linux/cdrom.h> /* for the compatibility eject ioctl */
258 #include <linux/completion.h>
260 static struct request *current_req;
261 static void do_fd_request(struct request_queue *q);
262 static int set_next_request(void);
264 #ifndef fd_get_dma_residue
265 #define fd_get_dma_residue() get_dma_residue(FLOPPY_DMA)
266 #endif
268 /* Dma Memory related stuff */
270 #ifndef fd_dma_mem_free
271 #define fd_dma_mem_free(addr, size) free_pages(addr, get_order(size))
272 #endif
274 #ifndef fd_dma_mem_alloc
275 #define fd_dma_mem_alloc(size) __get_dma_pages(GFP_KERNEL, get_order(size))
276 #endif
278 static inline void fallback_on_nodma_alloc(char **addr, size_t l)
280 #ifdef FLOPPY_CAN_FALLBACK_ON_NODMA
281 if (*addr)
282 return; /* we have the memory */
283 if (can_use_virtual_dma != 2)
284 return; /* no fallback allowed */
285 pr_info("DMA memory shortage. Temporarily falling back on virtual DMA\n");
286 *addr = (char *)nodma_mem_alloc(l);
287 #else
288 return;
289 #endif
292 /* End dma memory related stuff */
294 static unsigned long fake_change;
295 static bool initialized;
297 #define ITYPE(x) (((x) >> 2) & 0x1f)
298 #define TOMINOR(x) ((x & 3) | ((x & 4) << 5))
299 #define UNIT(x) ((x) & 0x03) /* drive on fdc */
300 #define FDC(x) (((x) & 0x04) >> 2) /* fdc of drive */
301 /* reverse mapping from unit and fdc to drive */
302 #define REVDRIVE(fdc, unit) ((unit) + ((fdc) << 2))
304 #define DP (&drive_params[current_drive])
305 #define DRS (&drive_state[current_drive])
306 #define DRWE (&write_errors[current_drive])
307 #define FDCS (&fdc_state[fdc])
309 #define UDP (&drive_params[drive])
310 #define UDRS (&drive_state[drive])
311 #define UDRWE (&write_errors[drive])
312 #define UFDCS (&fdc_state[FDC(drive)])
314 #define PH_HEAD(floppy, head) (((((floppy)->stretch & 2) >> 1) ^ head) << 2)
315 #define STRETCH(floppy) ((floppy)->stretch & FD_STRETCH)
317 /* read/write */
318 #define COMMAND (raw_cmd->cmd[0])
319 #define DR_SELECT (raw_cmd->cmd[1])
320 #define TRACK (raw_cmd->cmd[2])
321 #define HEAD (raw_cmd->cmd[3])
322 #define SECTOR (raw_cmd->cmd[4])
323 #define SIZECODE (raw_cmd->cmd[5])
324 #define SECT_PER_TRACK (raw_cmd->cmd[6])
325 #define GAP (raw_cmd->cmd[7])
326 #define SIZECODE2 (raw_cmd->cmd[8])
327 #define NR_RW 9
329 /* format */
330 #define F_SIZECODE (raw_cmd->cmd[2])
331 #define F_SECT_PER_TRACK (raw_cmd->cmd[3])
332 #define F_GAP (raw_cmd->cmd[4])
333 #define F_FILL (raw_cmd->cmd[5])
334 #define NR_F 6
337 * Maximum disk size (in kilobytes).
338 * This default is used whenever the current disk size is unknown.
339 * [Now it is rather a minimum]
341 #define MAX_DISK_SIZE 4 /* 3984 */
344 * globals used by 'result()'
346 #define MAX_REPLIES 16
347 static unsigned char reply_buffer[MAX_REPLIES];
348 static int inr; /* size of reply buffer, when called from interrupt */
349 #define ST0 (reply_buffer[0])
350 #define ST1 (reply_buffer[1])
351 #define ST2 (reply_buffer[2])
352 #define ST3 (reply_buffer[0]) /* result of GETSTATUS */
353 #define R_TRACK (reply_buffer[3])
354 #define R_HEAD (reply_buffer[4])
355 #define R_SECTOR (reply_buffer[5])
356 #define R_SIZECODE (reply_buffer[6])
358 #define SEL_DLY (2 * HZ / 100)
361 * this struct defines the different floppy drive types.
363 static struct {
364 struct floppy_drive_params params;
365 const char *name; /* name printed while booting */
366 } default_drive_params[] = {
367 /* NOTE: the time values in jiffies should be in msec!
368 CMOS drive type
369 | Maximum data rate supported by drive type
370 | | Head load time, msec
371 | | | Head unload time, msec (not used)
372 | | | | Step rate interval, usec
373 | | | | | Time needed for spinup time (jiffies)
374 | | | | | | Timeout for spinning down (jiffies)
375 | | | | | | | Spindown offset (where disk stops)
376 | | | | | | | | Select delay
377 | | | | | | | | | RPS
378 | | | | | | | | | | Max number of tracks
379 | | | | | | | | | | | Interrupt timeout
380 | | | | | | | | | | | | Max nonintlv. sectors
381 | | | | | | | | | | | | | -Max Errors- flags */
382 {{0, 500, 16, 16, 8000, 1*HZ, 3*HZ, 0, SEL_DLY, 5, 80, 3*HZ, 20, {3,1,2,0,2}, 0,
383 0, { 7, 4, 8, 2, 1, 5, 3,10}, 3*HZ/2, 0 }, "unknown" },
385 {{1, 300, 16, 16, 8000, 1*HZ, 3*HZ, 0, SEL_DLY, 5, 40, 3*HZ, 17, {3,1,2,0,2}, 0,
386 0, { 1, 0, 0, 0, 0, 0, 0, 0}, 3*HZ/2, 1 }, "360K PC" }, /*5 1/4 360 KB PC*/
388 {{2, 500, 16, 16, 6000, 4*HZ/10, 3*HZ, 14, SEL_DLY, 6, 83, 3*HZ, 17, {3,1,2,0,2}, 0,
389 0, { 2, 5, 6,23,10,20,12, 0}, 3*HZ/2, 2 }, "1.2M" }, /*5 1/4 HD AT*/
391 {{3, 250, 16, 16, 3000, 1*HZ, 3*HZ, 0, SEL_DLY, 5, 83, 3*HZ, 20, {3,1,2,0,2}, 0,
392 0, { 4,22,21,30, 3, 0, 0, 0}, 3*HZ/2, 4 }, "720k" }, /*3 1/2 DD*/
394 {{4, 500, 16, 16, 4000, 4*HZ/10, 3*HZ, 10, SEL_DLY, 5, 83, 3*HZ, 20, {3,1,2,0,2}, 0,
395 0, { 7, 4,25,22,31,21,29,11}, 3*HZ/2, 7 }, "1.44M" }, /*3 1/2 HD*/
397 {{5, 1000, 15, 8, 3000, 4*HZ/10, 3*HZ, 10, SEL_DLY, 5, 83, 3*HZ, 40, {3,1,2,0,2}, 0,
398 0, { 7, 8, 4,25,28,22,31,21}, 3*HZ/2, 8 }, "2.88M AMI BIOS" }, /*3 1/2 ED*/
400 {{6, 1000, 15, 8, 3000, 4*HZ/10, 3*HZ, 10, SEL_DLY, 5, 83, 3*HZ, 40, {3,1,2,0,2}, 0,
401 0, { 7, 8, 4,25,28,22,31,21}, 3*HZ/2, 8 }, "2.88M" } /*3 1/2 ED*/
402 /* | --autodetected formats--- | | |
403 * read_track | | Name printed when booting
404 * | Native format
405 * Frequency of disk change checks */
408 static struct floppy_drive_params drive_params[N_DRIVE];
409 static struct floppy_drive_struct drive_state[N_DRIVE];
410 static struct floppy_write_errors write_errors[N_DRIVE];
411 static struct timer_list motor_off_timer[N_DRIVE];
412 static struct gendisk *disks[N_DRIVE];
413 static struct block_device *opened_bdev[N_DRIVE];
414 static DEFINE_MUTEX(open_lock);
415 static struct floppy_raw_cmd *raw_cmd, default_raw_cmd;
416 static int fdc_queue;
419 * This struct defines the different floppy types.
421 * Bit 0 of 'stretch' tells if the tracks need to be doubled for some
422 * types (e.g. 360kB diskette in 1.2MB drive, etc.). Bit 1 of 'stretch'
423 * tells if the disk is in Commodore 1581 format, which means side 0 sectors
424 * are located on side 1 of the disk but with a side 0 ID, and vice-versa.
425 * This is the same as the Sharp MZ-80 5.25" CP/M disk format, except that the
426 * 1581's logical side 0 is on physical side 1, whereas the Sharp's logical
427 * side 0 is on physical side 0 (but with the misnamed sector IDs).
428 * 'stretch' should probably be renamed to something more general, like
429 * 'options'.
431 * Bits 2 through 9 of 'stretch' tell the number of the first sector.
432 * The LSB (bit 2) is flipped. For most disks, the first sector
433 * is 1 (represented by 0x00<<2). For some CP/M and music sampler
434 * disks (such as Ensoniq EPS 16plus) it is 0 (represented as 0x01<<2).
435 * For Amstrad CPC disks it is 0xC1 (represented as 0xC0<<2).
437 * Other parameters should be self-explanatory (see also setfdprm(8)).
440 Size
441 | Sectors per track
442 | | Head
443 | | | Tracks
444 | | | | Stretch
445 | | | | | Gap 1 size
446 | | | | | | Data rate, | 0x40 for perp
447 | | | | | | | Spec1 (stepping rate, head unload
448 | | | | | | | | /fmt gap (gap2) */
449 static struct floppy_struct floppy_type[32] = {
450 { 0, 0,0, 0,0,0x00,0x00,0x00,0x00,NULL }, /* 0 no testing */
451 { 720, 9,2,40,0,0x2A,0x02,0xDF,0x50,"d360" }, /* 1 360KB PC */
452 { 2400,15,2,80,0,0x1B,0x00,0xDF,0x54,"h1200" }, /* 2 1.2MB AT */
453 { 720, 9,1,80,0,0x2A,0x02,0xDF,0x50,"D360" }, /* 3 360KB SS 3.5" */
454 { 1440, 9,2,80,0,0x2A,0x02,0xDF,0x50,"D720" }, /* 4 720KB 3.5" */
455 { 720, 9,2,40,1,0x23,0x01,0xDF,0x50,"h360" }, /* 5 360KB AT */
456 { 1440, 9,2,80,0,0x23,0x01,0xDF,0x50,"h720" }, /* 6 720KB AT */
457 { 2880,18,2,80,0,0x1B,0x00,0xCF,0x6C,"H1440" }, /* 7 1.44MB 3.5" */
458 { 5760,36,2,80,0,0x1B,0x43,0xAF,0x54,"E2880" }, /* 8 2.88MB 3.5" */
459 { 6240,39,2,80,0,0x1B,0x43,0xAF,0x28,"E3120" }, /* 9 3.12MB 3.5" */
461 { 2880,18,2,80,0,0x25,0x00,0xDF,0x02,"h1440" }, /* 10 1.44MB 5.25" */
462 { 3360,21,2,80,0,0x1C,0x00,0xCF,0x0C,"H1680" }, /* 11 1.68MB 3.5" */
463 { 820,10,2,41,1,0x25,0x01,0xDF,0x2E,"h410" }, /* 12 410KB 5.25" */
464 { 1640,10,2,82,0,0x25,0x02,0xDF,0x2E,"H820" }, /* 13 820KB 3.5" */
465 { 2952,18,2,82,0,0x25,0x00,0xDF,0x02,"h1476" }, /* 14 1.48MB 5.25" */
466 { 3444,21,2,82,0,0x25,0x00,0xDF,0x0C,"H1722" }, /* 15 1.72MB 3.5" */
467 { 840,10,2,42,1,0x25,0x01,0xDF,0x2E,"h420" }, /* 16 420KB 5.25" */
468 { 1660,10,2,83,0,0x25,0x02,0xDF,0x2E,"H830" }, /* 17 830KB 3.5" */
469 { 2988,18,2,83,0,0x25,0x00,0xDF,0x02,"h1494" }, /* 18 1.49MB 5.25" */
470 { 3486,21,2,83,0,0x25,0x00,0xDF,0x0C,"H1743" }, /* 19 1.74 MB 3.5" */
472 { 1760,11,2,80,0,0x1C,0x09,0xCF,0x00,"h880" }, /* 20 880KB 5.25" */
473 { 2080,13,2,80,0,0x1C,0x01,0xCF,0x00,"D1040" }, /* 21 1.04MB 3.5" */
474 { 2240,14,2,80,0,0x1C,0x19,0xCF,0x00,"D1120" }, /* 22 1.12MB 3.5" */
475 { 3200,20,2,80,0,0x1C,0x20,0xCF,0x2C,"h1600" }, /* 23 1.6MB 5.25" */
476 { 3520,22,2,80,0,0x1C,0x08,0xCF,0x2e,"H1760" }, /* 24 1.76MB 3.5" */
477 { 3840,24,2,80,0,0x1C,0x20,0xCF,0x00,"H1920" }, /* 25 1.92MB 3.5" */
478 { 6400,40,2,80,0,0x25,0x5B,0xCF,0x00,"E3200" }, /* 26 3.20MB 3.5" */
479 { 7040,44,2,80,0,0x25,0x5B,0xCF,0x00,"E3520" }, /* 27 3.52MB 3.5" */
480 { 7680,48,2,80,0,0x25,0x63,0xCF,0x00,"E3840" }, /* 28 3.84MB 3.5" */
481 { 3680,23,2,80,0,0x1C,0x10,0xCF,0x00,"H1840" }, /* 29 1.84MB 3.5" */
483 { 1600,10,2,80,0,0x25,0x02,0xDF,0x2E,"D800" }, /* 30 800KB 3.5" */
484 { 3200,20,2,80,0,0x1C,0x00,0xCF,0x2C,"H1600" }, /* 31 1.6MB 3.5" */
487 #define SECTSIZE (_FD_SECTSIZE(*floppy))
489 /* Auto-detection: Disk type used until the next media change occurs. */
490 static struct floppy_struct *current_type[N_DRIVE];
493 * User-provided type information. current_type points to
494 * the respective entry of this array.
496 static struct floppy_struct user_params[N_DRIVE];
498 static sector_t floppy_sizes[256];
500 static char floppy_device_name[] = "floppy";
503 * The driver is trying to determine the correct media format
504 * while probing is set. rw_interrupt() clears it after a
505 * successful access.
507 static int probing;
509 /* Synchronization of FDC access. */
510 #define FD_COMMAND_NONE -1
511 #define FD_COMMAND_ERROR 2
512 #define FD_COMMAND_OKAY 3
514 static volatile int command_status = FD_COMMAND_NONE;
515 static unsigned long fdc_busy;
516 static DECLARE_WAIT_QUEUE_HEAD(fdc_wait);
517 static DECLARE_WAIT_QUEUE_HEAD(command_done);
519 /* Errors during formatting are counted here. */
520 static int format_errors;
522 /* Format request descriptor. */
523 static struct format_descr format_req;
526 * Rate is 0 for 500kb/s, 1 for 300kbps, 2 for 250kbps
527 * Spec1 is 0xSH, where S is stepping rate (F=1ms, E=2ms, D=3ms etc),
528 * H is head unload time (1=16ms, 2=32ms, etc)
532 * Track buffer
533 * Because these are written to by the DMA controller, they must
534 * not contain a 64k byte boundary crossing, or data will be
535 * corrupted/lost.
537 static char *floppy_track_buffer;
538 static int max_buffer_sectors;
540 static int *errors;
541 typedef void (*done_f)(int);
542 static const struct cont_t {
543 void (*interrupt)(void);
544 /* 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_request_regions(int);
559 static void floppy_release_regions(int);
560 static int floppy_grab_irq_and_dma(void);
561 static void floppy_release_irq_and_dma(void);
564 * The "reset" variable should be tested whenever an interrupt is scheduled,
565 * after the commands have been sent. This is to ensure that the driver doesn't
566 * get wedged when the interrupt doesn't come because of a failed command.
567 * reset doesn't need to be tested before sending commands, because
568 * output_byte is automatically disabled when reset is set.
570 static void reset_fdc(void);
573 * These are global variables, as that's the easiest way to give
574 * information to interrupts. They are the data used for the current
575 * request.
577 #define NO_TRACK -1
578 #define NEED_1_RECAL -2
579 #define NEED_2_RECAL -3
581 static atomic_t usage_count = ATOMIC_INIT(0);
583 /* buffer related variables */
584 static int buffer_track = -1;
585 static int buffer_drive = -1;
586 static int buffer_min = -1;
587 static int buffer_max = -1;
589 /* fdc related variables, should end up in a struct */
590 static struct floppy_fdc_state fdc_state[N_FDC];
591 static int fdc; /* current fdc */
593 static struct floppy_struct *_floppy = floppy_type;
594 static unsigned char current_drive;
595 static long current_count_sectors;
596 static unsigned char fsector_t; /* sector in track */
597 static unsigned char in_sector_offset; /* offset within physical sector,
598 * expressed in units of 512 bytes */
600 static inline bool drive_no_geom(int drive)
602 return !current_type[drive] && !ITYPE(UDRS->fd_device);
605 #ifndef fd_eject
606 static inline int fd_eject(int drive)
608 return -EINVAL;
610 #endif
613 * Debugging
614 * =========
616 #ifdef DEBUGT
617 static long unsigned debugtimer;
619 static inline void set_debugt(void)
621 debugtimer = jiffies;
624 static inline void debugt(const char *func, const char *msg)
626 if (DP->flags & DEBUGT)
627 pr_info("%s:%s dtime=%lu\n", func, msg, jiffies - debugtimer);
629 #else
630 static inline void set_debugt(void) { }
631 static inline void debugt(const char *func, const char *msg) { }
632 #endif /* DEBUGT */
634 typedef void (*timeout_fn)(unsigned long);
635 static DEFINE_TIMER(fd_timeout, floppy_shutdown, 0, 0);
637 static const char *timeout_message;
639 static void is_alive(const char *func, const char *message)
641 /* this routine checks whether the floppy driver is "alive" */
642 if (test_bit(0, &fdc_busy) && command_status < 2 &&
643 !timer_pending(&fd_timeout)) {
644 DPRINT("%s: timeout handler died. %s\n", func, message);
648 static void (*do_floppy)(void) = NULL;
650 #define OLOGSIZE 20
652 static void (*lasthandler)(void);
653 static unsigned long interruptjiffies;
654 static unsigned long resultjiffies;
655 static int resultsize;
656 static unsigned long lastredo;
658 static struct output_log {
659 unsigned char data;
660 unsigned char status;
661 unsigned long jiffies;
662 } output_log[OLOGSIZE];
664 static int output_log_pos;
666 #define current_reqD -1
667 #define MAXTIMEOUT -2
669 static void __reschedule_timeout(int drive, const char *message)
671 if (drive == current_reqD)
672 drive = current_drive;
673 del_timer(&fd_timeout);
674 if (drive < 0 || drive >= N_DRIVE) {
675 fd_timeout.expires = jiffies + 20UL * HZ;
676 drive = 0;
677 } else
678 fd_timeout.expires = jiffies + UDP->timeout;
679 add_timer(&fd_timeout);
680 if (UDP->flags & FD_DEBUG)
681 DPRINT("reschedule timeout %s\n", message);
682 timeout_message = message;
685 static void reschedule_timeout(int drive, const char *message)
687 unsigned long flags;
689 spin_lock_irqsave(&floppy_lock, flags);
690 __reschedule_timeout(drive, message);
691 spin_unlock_irqrestore(&floppy_lock, flags);
694 #define INFBOUND(a, b) (a) = max_t(int, a, b)
695 #define SUPBOUND(a, b) (a) = min_t(int, a, b)
698 * Bottom half floppy driver.
699 * ==========================
701 * This part of the file contains the code talking directly to the hardware,
702 * and also the main service loop (seek-configure-spinup-command)
706 * disk change.
707 * This routine is responsible for maintaining the FD_DISK_CHANGE flag,
708 * and the last_checked date.
710 * last_checked is the date of the last check which showed 'no disk change'
711 * FD_DISK_CHANGE is set under two conditions:
712 * 1. The floppy has been changed after some i/o to that floppy already
713 * took place.
714 * 2. No floppy disk is in the drive. This is done in order to ensure that
715 * requests are quickly flushed in case there is no disk in the drive. It
716 * follows that FD_DISK_CHANGE can only be cleared if there is a disk in
717 * the drive.
719 * For 1., maxblock is observed. Maxblock is 0 if no i/o has taken place yet.
720 * For 2., FD_DISK_NEWCHANGE is watched. FD_DISK_NEWCHANGE is cleared on
721 * each seek. If a disk is present, the disk change line should also be
722 * cleared on each seek. Thus, if FD_DISK_NEWCHANGE is clear, but the disk
723 * change line is set, this means either that no disk is in the drive, or
724 * that it has been removed since the last seek.
726 * This means that we really have a third possibility too:
727 * The floppy has been changed after the last seek.
730 static int disk_change(int drive)
732 int fdc = FDC(drive);
734 if (time_before(jiffies, UDRS->select_date + UDP->select_delay))
735 DPRINT("WARNING disk change called early\n");
736 if (!(FDCS->dor & (0x10 << UNIT(drive))) ||
737 (FDCS->dor & 3) != UNIT(drive) || fdc != FDC(drive)) {
738 DPRINT("probing disk change on unselected drive\n");
739 DPRINT("drive=%d fdc=%d dor=%x\n", drive, FDC(drive),
740 (unsigned int)FDCS->dor);
743 debug_dcl(UDP->flags,
744 "checking disk change line for drive %d\n", drive);
745 debug_dcl(UDP->flags, "jiffies=%lu\n", jiffies);
746 debug_dcl(UDP->flags, "disk change line=%x\n", fd_inb(FD_DIR) & 0x80);
747 debug_dcl(UDP->flags, "flags=%lx\n", UDRS->flags);
749 if (UDP->flags & FD_BROKEN_DCL)
750 return test_bit(FD_DISK_CHANGED_BIT, &UDRS->flags);
751 if ((fd_inb(FD_DIR) ^ UDP->flags) & 0x80) {
752 set_bit(FD_VERIFY_BIT, &UDRS->flags);
753 /* verify write protection */
755 if (UDRS->maxblock) /* mark it changed */
756 set_bit(FD_DISK_CHANGED_BIT, &UDRS->flags);
758 /* invalidate its geometry */
759 if (UDRS->keep_data >= 0) {
760 if ((UDP->flags & FTD_MSG) &&
761 current_type[drive] != NULL)
762 DPRINT("Disk type is undefined after disk change\n");
763 current_type[drive] = NULL;
764 floppy_sizes[TOMINOR(drive)] = MAX_DISK_SIZE << 1;
767 return 1;
768 } else {
769 UDRS->last_checked = jiffies;
770 clear_bit(FD_DISK_NEWCHANGE_BIT, &UDRS->flags);
772 return 0;
775 static inline int is_selected(int dor, int unit)
777 return ((dor & (0x10 << unit)) && (dor & 3) == unit);
780 static bool is_ready_state(int status)
782 int state = status & (STATUS_READY | STATUS_DIR | STATUS_DMA);
783 return state == STATUS_READY;
786 static int set_dor(int fdc, char mask, char data)
788 unsigned char unit;
789 unsigned char drive;
790 unsigned char newdor;
791 unsigned char olddor;
793 if (FDCS->address == -1)
794 return -1;
796 olddor = FDCS->dor;
797 newdor = (olddor & mask) | data;
798 if (newdor != olddor) {
799 unit = olddor & 0x3;
800 if (is_selected(olddor, unit) && !is_selected(newdor, unit)) {
801 drive = REVDRIVE(fdc, unit);
802 debug_dcl(UDP->flags,
803 "calling disk change from set_dor\n");
804 disk_change(drive);
806 FDCS->dor = newdor;
807 fd_outb(newdor, FD_DOR);
809 unit = newdor & 0x3;
810 if (!is_selected(olddor, unit) && is_selected(newdor, unit)) {
811 drive = REVDRIVE(fdc, unit);
812 UDRS->select_date = jiffies;
815 return olddor;
818 static void twaddle(void)
820 if (DP->select_delay)
821 return;
822 fd_outb(FDCS->dor & ~(0x10 << UNIT(current_drive)), FD_DOR);
823 fd_outb(FDCS->dor, FD_DOR);
824 DRS->select_date = jiffies;
828 * Reset all driver information about the current fdc.
829 * This is needed after a reset, and after a raw command.
831 static void reset_fdc_info(int mode)
833 int drive;
835 FDCS->spec1 = FDCS->spec2 = -1;
836 FDCS->need_configure = 1;
837 FDCS->perp_mode = 1;
838 FDCS->rawcmd = 0;
839 for (drive = 0; drive < N_DRIVE; drive++)
840 if (FDC(drive) == fdc && (mode || UDRS->track != NEED_1_RECAL))
841 UDRS->track = NEED_2_RECAL;
844 /* selects the fdc and drive, and enables the fdc's input/dma. */
845 static void set_fdc(int drive)
847 if (drive >= 0 && drive < N_DRIVE) {
848 fdc = FDC(drive);
849 current_drive = drive;
851 if (fdc != 1 && fdc != 0) {
852 pr_info("bad fdc value\n");
853 return;
855 set_dor(fdc, ~0, 8);
856 #if N_FDC > 1
857 set_dor(1 - fdc, ~8, 0);
858 #endif
859 if (FDCS->rawcmd == 2)
860 reset_fdc_info(1);
861 if (fd_inb(FD_STATUS) != STATUS_READY)
862 FDCS->reset = 1;
865 /* locks the driver */
866 static int lock_fdc(int drive, bool interruptible)
868 if (WARN(atomic_read(&usage_count) == 0,
869 "Trying to lock fdc while usage count=0\n"))
870 return -1;
872 if (wait_event_interruptible(fdc_wait, !test_and_set_bit(0, &fdc_busy)))
873 return -EINTR;
875 command_status = FD_COMMAND_NONE;
877 __reschedule_timeout(drive, "lock fdc");
878 set_fdc(drive);
879 return 0;
882 /* unlocks the driver */
883 static void unlock_fdc(void)
885 unsigned long flags;
887 raw_cmd = NULL;
888 if (!test_bit(0, &fdc_busy))
889 DPRINT("FDC access conflict!\n");
891 if (do_floppy)
892 DPRINT("device interrupt still active at FDC release: %pf!\n",
893 do_floppy);
894 command_status = FD_COMMAND_NONE;
895 spin_lock_irqsave(&floppy_lock, flags);
896 del_timer(&fd_timeout);
897 cont = NULL;
898 clear_bit(0, &fdc_busy);
899 if (current_req || set_next_request())
900 do_fd_request(current_req->q);
901 spin_unlock_irqrestore(&floppy_lock, flags);
902 wake_up(&fdc_wait);
905 /* switches the motor off after a given timeout */
906 static void motor_off_callback(unsigned long nr)
908 unsigned char mask = ~(0x10 << UNIT(nr));
910 set_dor(FDC(nr), mask, 0);
913 /* schedules motor off */
914 static void floppy_off(unsigned int drive)
916 unsigned long volatile delta;
917 int fdc = FDC(drive);
919 if (!(FDCS->dor & (0x10 << UNIT(drive))))
920 return;
922 del_timer(motor_off_timer + drive);
924 /* make spindle stop in a position which minimizes spinup time
925 * next time */
926 if (UDP->rps) {
927 delta = jiffies - UDRS->first_read_date + HZ -
928 UDP->spindown_offset;
929 delta = ((delta * UDP->rps) % HZ) / UDP->rps;
930 motor_off_timer[drive].expires =
931 jiffies + UDP->spindown - delta;
933 add_timer(motor_off_timer + drive);
937 * cycle through all N_DRIVE floppy drives, for disk change testing.
938 * stopping at current drive. This is done before any long operation, to
939 * be sure to have up to date disk change information.
941 static void scandrives(void)
943 int i;
944 int drive;
945 int saved_drive;
947 if (DP->select_delay)
948 return;
950 saved_drive = current_drive;
951 for (i = 0; i < N_DRIVE; i++) {
952 drive = (saved_drive + i + 1) % N_DRIVE;
953 if (UDRS->fd_ref == 0 || UDP->select_delay != 0)
954 continue; /* skip closed drives */
955 set_fdc(drive);
956 if (!(set_dor(fdc, ~3, UNIT(drive) | (0x10 << UNIT(drive))) &
957 (0x10 << UNIT(drive))))
958 /* switch the motor off again, if it was off to
959 * begin with */
960 set_dor(fdc, ~(0x10 << UNIT(drive)), 0);
962 set_fdc(saved_drive);
965 static void empty(void)
969 static DECLARE_WORK(floppy_work, NULL);
971 static void schedule_bh(void (*handler)(void))
973 PREPARE_WORK(&floppy_work, (work_func_t)handler);
974 schedule_work(&floppy_work);
977 static DEFINE_TIMER(fd_timer, NULL, 0, 0);
979 static void cancel_activity(void)
981 unsigned long flags;
983 spin_lock_irqsave(&floppy_lock, flags);
984 do_floppy = NULL;
985 PREPARE_WORK(&floppy_work, (work_func_t)empty);
986 del_timer(&fd_timer);
987 spin_unlock_irqrestore(&floppy_lock, flags);
990 /* this function makes sure that the disk stays in the drive during the
991 * transfer */
992 static void fd_watchdog(void)
994 debug_dcl(DP->flags, "calling disk change from watchdog\n");
996 if (disk_change(current_drive)) {
997 DPRINT("disk removed during i/o\n");
998 cancel_activity();
999 cont->done(0);
1000 reset_fdc();
1001 } else {
1002 del_timer(&fd_timer);
1003 fd_timer.function = (timeout_fn)fd_watchdog;
1004 fd_timer.expires = jiffies + HZ / 10;
1005 add_timer(&fd_timer);
1009 static void main_command_interrupt(void)
1011 del_timer(&fd_timer);
1012 cont->interrupt();
1015 /* waits for a delay (spinup or select) to pass */
1016 static int fd_wait_for_completion(unsigned long delay, timeout_fn function)
1018 if (FDCS->reset) {
1019 reset_fdc(); /* do the reset during sleep to win time
1020 * if we don't need to sleep, it's a good
1021 * occasion anyways */
1022 return 1;
1025 if (time_before(jiffies, delay)) {
1026 del_timer(&fd_timer);
1027 fd_timer.function = function;
1028 fd_timer.expires = delay;
1029 add_timer(&fd_timer);
1030 return 1;
1032 return 0;
1035 static DEFINE_SPINLOCK(floppy_hlt_lock);
1036 static int hlt_disabled;
1037 static void floppy_disable_hlt(void)
1039 unsigned long flags;
1041 WARN_ONCE(1, "floppy_disable_hlt() scheduled for removal in 2012");
1042 spin_lock_irqsave(&floppy_hlt_lock, flags);
1043 if (!hlt_disabled) {
1044 hlt_disabled = 1;
1045 #ifdef HAVE_DISABLE_HLT
1046 disable_hlt();
1047 #endif
1049 spin_unlock_irqrestore(&floppy_hlt_lock, flags);
1052 static void floppy_enable_hlt(void)
1054 unsigned long flags;
1056 spin_lock_irqsave(&floppy_hlt_lock, flags);
1057 if (hlt_disabled) {
1058 hlt_disabled = 0;
1059 #ifdef HAVE_DISABLE_HLT
1060 enable_hlt();
1061 #endif
1063 spin_unlock_irqrestore(&floppy_hlt_lock, flags);
1066 static void setup_DMA(void)
1068 unsigned long f;
1070 if (raw_cmd->length == 0) {
1071 int i;
1073 pr_info("zero dma transfer size:");
1074 for (i = 0; i < raw_cmd->cmd_count; i++)
1075 pr_cont("%x,", raw_cmd->cmd[i]);
1076 pr_cont("\n");
1077 cont->done(0);
1078 FDCS->reset = 1;
1079 return;
1081 if (((unsigned long)raw_cmd->kernel_data) % 512) {
1082 pr_info("non aligned address: %p\n", raw_cmd->kernel_data);
1083 cont->done(0);
1084 FDCS->reset = 1;
1085 return;
1087 f = claim_dma_lock();
1088 fd_disable_dma();
1089 #ifdef fd_dma_setup
1090 if (fd_dma_setup(raw_cmd->kernel_data, raw_cmd->length,
1091 (raw_cmd->flags & FD_RAW_READ) ?
1092 DMA_MODE_READ : DMA_MODE_WRITE, FDCS->address) < 0) {
1093 release_dma_lock(f);
1094 cont->done(0);
1095 FDCS->reset = 1;
1096 return;
1098 release_dma_lock(f);
1099 #else
1100 fd_clear_dma_ff();
1101 fd_cacheflush(raw_cmd->kernel_data, raw_cmd->length);
1102 fd_set_dma_mode((raw_cmd->flags & FD_RAW_READ) ?
1103 DMA_MODE_READ : DMA_MODE_WRITE);
1104 fd_set_dma_addr(raw_cmd->kernel_data);
1105 fd_set_dma_count(raw_cmd->length);
1106 virtual_dma_port = FDCS->address;
1107 fd_enable_dma();
1108 release_dma_lock(f);
1109 #endif
1110 floppy_disable_hlt();
1113 static void show_floppy(void);
1115 /* waits until the fdc becomes ready */
1116 static int wait_til_ready(void)
1118 int status;
1119 int counter;
1121 if (FDCS->reset)
1122 return -1;
1123 for (counter = 0; counter < 10000; counter++) {
1124 status = fd_inb(FD_STATUS);
1125 if (status & STATUS_READY)
1126 return status;
1128 if (initialized) {
1129 DPRINT("Getstatus times out (%x) on fdc %d\n", status, fdc);
1130 show_floppy();
1132 FDCS->reset = 1;
1133 return -1;
1136 /* sends a command byte to the fdc */
1137 static int output_byte(char byte)
1139 int status = wait_til_ready();
1141 if (status < 0)
1142 return -1;
1144 if (is_ready_state(status)) {
1145 fd_outb(byte, FD_DATA);
1146 output_log[output_log_pos].data = byte;
1147 output_log[output_log_pos].status = status;
1148 output_log[output_log_pos].jiffies = jiffies;
1149 output_log_pos = (output_log_pos + 1) % OLOGSIZE;
1150 return 0;
1152 FDCS->reset = 1;
1153 if (initialized) {
1154 DPRINT("Unable to send byte %x to FDC. Fdc=%x Status=%x\n",
1155 byte, fdc, status);
1156 show_floppy();
1158 return -1;
1161 /* gets the response from the fdc */
1162 static int result(void)
1164 int i;
1165 int status = 0;
1167 for (i = 0; i < MAX_REPLIES; i++) {
1168 status = wait_til_ready();
1169 if (status < 0)
1170 break;
1171 status &= STATUS_DIR | STATUS_READY | STATUS_BUSY | STATUS_DMA;
1172 if ((status & ~STATUS_BUSY) == STATUS_READY) {
1173 resultjiffies = jiffies;
1174 resultsize = i;
1175 return i;
1177 if (status == (STATUS_DIR | STATUS_READY | STATUS_BUSY))
1178 reply_buffer[i] = fd_inb(FD_DATA);
1179 else
1180 break;
1182 if (initialized) {
1183 DPRINT("get result error. Fdc=%d Last status=%x Read bytes=%d\n",
1184 fdc, status, i);
1185 show_floppy();
1187 FDCS->reset = 1;
1188 return -1;
1191 #define MORE_OUTPUT -2
1192 /* does the fdc need more output? */
1193 static int need_more_output(void)
1195 int status = wait_til_ready();
1197 if (status < 0)
1198 return -1;
1200 if (is_ready_state(status))
1201 return MORE_OUTPUT;
1203 return result();
1206 /* Set perpendicular mode as required, based on data rate, if supported.
1207 * 82077 Now tested. 1Mbps data rate only possible with 82077-1.
1209 static void perpendicular_mode(void)
1211 unsigned char perp_mode;
1213 if (raw_cmd->rate & 0x40) {
1214 switch (raw_cmd->rate & 3) {
1215 case 0:
1216 perp_mode = 2;
1217 break;
1218 case 3:
1219 perp_mode = 3;
1220 break;
1221 default:
1222 DPRINT("Invalid data rate for perpendicular mode!\n");
1223 cont->done(0);
1224 FDCS->reset = 1;
1226 * convenient way to return to
1227 * redo without too much hassle
1228 * (deep stack et al.)
1230 return;
1232 } else
1233 perp_mode = 0;
1235 if (FDCS->perp_mode == perp_mode)
1236 return;
1237 if (FDCS->version >= FDC_82077_ORIG) {
1238 output_byte(FD_PERPENDICULAR);
1239 output_byte(perp_mode);
1240 FDCS->perp_mode = perp_mode;
1241 } else if (perp_mode) {
1242 DPRINT("perpendicular mode not supported by this FDC.\n");
1244 } /* perpendicular_mode */
1246 static int fifo_depth = 0xa;
1247 static int no_fifo;
1249 static int fdc_configure(void)
1251 /* Turn on FIFO */
1252 output_byte(FD_CONFIGURE);
1253 if (need_more_output() != MORE_OUTPUT)
1254 return 0;
1255 output_byte(0);
1256 output_byte(0x10 | (no_fifo & 0x20) | (fifo_depth & 0xf));
1257 output_byte(0); /* pre-compensation from track
1258 0 upwards */
1259 return 1;
1262 #define NOMINAL_DTR 500
1264 /* Issue a "SPECIFY" command to set the step rate time, head unload time,
1265 * head load time, and DMA disable flag to values needed by floppy.
1267 * The value "dtr" is the data transfer rate in Kbps. It is needed
1268 * to account for the data rate-based scaling done by the 82072 and 82077
1269 * FDC types. This parameter is ignored for other types of FDCs (i.e.
1270 * 8272a).
1272 * Note that changing the data transfer rate has a (probably deleterious)
1273 * effect on the parameters subject to scaling for 82072/82077 FDCs, so
1274 * fdc_specify is called again after each data transfer rate
1275 * change.
1277 * srt: 1000 to 16000 in microseconds
1278 * hut: 16 to 240 milliseconds
1279 * hlt: 2 to 254 milliseconds
1281 * These values are rounded up to the next highest available delay time.
1283 static void fdc_specify(void)
1285 unsigned char spec1;
1286 unsigned char spec2;
1287 unsigned long srt;
1288 unsigned long hlt;
1289 unsigned long hut;
1290 unsigned long dtr = NOMINAL_DTR;
1291 unsigned long scale_dtr = NOMINAL_DTR;
1292 int hlt_max_code = 0x7f;
1293 int hut_max_code = 0xf;
1295 if (FDCS->need_configure && FDCS->version >= FDC_82072A) {
1296 fdc_configure();
1297 FDCS->need_configure = 0;
1300 switch (raw_cmd->rate & 0x03) {
1301 case 3:
1302 dtr = 1000;
1303 break;
1304 case 1:
1305 dtr = 300;
1306 if (FDCS->version >= FDC_82078) {
1307 /* chose the default rate table, not the one
1308 * where 1 = 2 Mbps */
1309 output_byte(FD_DRIVESPEC);
1310 if (need_more_output() == MORE_OUTPUT) {
1311 output_byte(UNIT(current_drive));
1312 output_byte(0xc0);
1315 break;
1316 case 2:
1317 dtr = 250;
1318 break;
1321 if (FDCS->version >= FDC_82072) {
1322 scale_dtr = dtr;
1323 hlt_max_code = 0x00; /* 0==256msec*dtr0/dtr (not linear!) */
1324 hut_max_code = 0x0; /* 0==256msec*dtr0/dtr (not linear!) */
1327 /* Convert step rate from microseconds to milliseconds and 4 bits */
1328 srt = 16 - DIV_ROUND_UP(DP->srt * scale_dtr / 1000, NOMINAL_DTR);
1329 if (slow_floppy)
1330 srt = srt / 4;
1332 SUPBOUND(srt, 0xf);
1333 INFBOUND(srt, 0);
1335 hlt = DIV_ROUND_UP(DP->hlt * scale_dtr / 2, NOMINAL_DTR);
1336 if (hlt < 0x01)
1337 hlt = 0x01;
1338 else if (hlt > 0x7f)
1339 hlt = hlt_max_code;
1341 hut = DIV_ROUND_UP(DP->hut * scale_dtr / 16, NOMINAL_DTR);
1342 if (hut < 0x1)
1343 hut = 0x1;
1344 else if (hut > 0xf)
1345 hut = hut_max_code;
1347 spec1 = (srt << 4) | hut;
1348 spec2 = (hlt << 1) | (use_virtual_dma & 1);
1350 /* If these parameters did not change, just return with success */
1351 if (FDCS->spec1 != spec1 || FDCS->spec2 != spec2) {
1352 /* Go ahead and set spec1 and spec2 */
1353 output_byte(FD_SPECIFY);
1354 output_byte(FDCS->spec1 = spec1);
1355 output_byte(FDCS->spec2 = spec2);
1357 } /* fdc_specify */
1359 /* Set the FDC's data transfer rate on behalf of the specified drive.
1360 * NOTE: with 82072/82077 FDCs, changing the data rate requires a reissue
1361 * of the specify command (i.e. using the fdc_specify function).
1363 static int fdc_dtr(void)
1365 /* If data rate not already set to desired value, set it. */
1366 if ((raw_cmd->rate & 3) == FDCS->dtr)
1367 return 0;
1369 /* Set dtr */
1370 fd_outb(raw_cmd->rate & 3, FD_DCR);
1372 /* TODO: some FDC/drive combinations (C&T 82C711 with TEAC 1.2MB)
1373 * need a stabilization period of several milliseconds to be
1374 * enforced after data rate changes before R/W operations.
1375 * Pause 5 msec to avoid trouble. (Needs to be 2 jiffies)
1377 FDCS->dtr = raw_cmd->rate & 3;
1378 return fd_wait_for_completion(jiffies + 2UL * HZ / 100,
1379 (timeout_fn)floppy_ready);
1380 } /* fdc_dtr */
1382 static void tell_sector(void)
1384 pr_cont(": track %d, head %d, sector %d, size %d",
1385 R_TRACK, R_HEAD, R_SECTOR, R_SIZECODE);
1386 } /* tell_sector */
1388 static void print_errors(void)
1390 DPRINT("");
1391 if (ST0 & ST0_ECE) {
1392 pr_cont("Recalibrate failed!");
1393 } else if (ST2 & ST2_CRC) {
1394 pr_cont("data CRC error");
1395 tell_sector();
1396 } else if (ST1 & ST1_CRC) {
1397 pr_cont("CRC error");
1398 tell_sector();
1399 } else if ((ST1 & (ST1_MAM | ST1_ND)) ||
1400 (ST2 & ST2_MAM)) {
1401 if (!probing) {
1402 pr_cont("sector not found");
1403 tell_sector();
1404 } else
1405 pr_cont("probe failed...");
1406 } else if (ST2 & ST2_WC) { /* seek error */
1407 pr_cont("wrong cylinder");
1408 } else if (ST2 & ST2_BC) { /* cylinder marked as bad */
1409 pr_cont("bad cylinder");
1410 } else {
1411 pr_cont("unknown error. ST[0..2] are: 0x%x 0x%x 0x%x",
1412 ST0, ST1, ST2);
1413 tell_sector();
1415 pr_cont("\n");
1419 * OK, this error interpreting routine is called after a
1420 * DMA read/write has succeeded
1421 * or failed, so we check the results, and copy any buffers.
1422 * hhb: Added better error reporting.
1423 * ak: Made this into a separate routine.
1425 static int interpret_errors(void)
1427 char bad;
1429 if (inr != 7) {
1430 DPRINT("-- FDC reply error\n");
1431 FDCS->reset = 1;
1432 return 1;
1435 /* check IC to find cause of interrupt */
1436 switch (ST0 & ST0_INTR) {
1437 case 0x40: /* error occurred during command execution */
1438 if (ST1 & ST1_EOC)
1439 return 0; /* occurs with pseudo-DMA */
1440 bad = 1;
1441 if (ST1 & ST1_WP) {
1442 DPRINT("Drive is write protected\n");
1443 clear_bit(FD_DISK_WRITABLE_BIT, &DRS->flags);
1444 cont->done(0);
1445 bad = 2;
1446 } else if (ST1 & ST1_ND) {
1447 set_bit(FD_NEED_TWADDLE_BIT, &DRS->flags);
1448 } else if (ST1 & ST1_OR) {
1449 if (DP->flags & FTD_MSG)
1450 DPRINT("Over/Underrun - retrying\n");
1451 bad = 0;
1452 } else if (*errors >= DP->max_errors.reporting) {
1453 print_errors();
1455 if (ST2 & ST2_WC || ST2 & ST2_BC)
1456 /* wrong cylinder => recal */
1457 DRS->track = NEED_2_RECAL;
1458 return bad;
1459 case 0x80: /* invalid command given */
1460 DPRINT("Invalid FDC command given!\n");
1461 cont->done(0);
1462 return 2;
1463 case 0xc0:
1464 DPRINT("Abnormal termination caused by polling\n");
1465 cont->error();
1466 return 2;
1467 default: /* (0) Normal command termination */
1468 return 0;
1473 * This routine is called when everything should be correctly set up
1474 * for the transfer (i.e. floppy motor is on, the correct floppy is
1475 * selected, and the head is sitting on the right track).
1477 static void setup_rw_floppy(void)
1479 int i;
1480 int r;
1481 int flags;
1482 int dflags;
1483 unsigned long ready_date;
1484 timeout_fn function;
1486 flags = raw_cmd->flags;
1487 if (flags & (FD_RAW_READ | FD_RAW_WRITE))
1488 flags |= FD_RAW_INTR;
1490 if ((flags & FD_RAW_SPIN) && !(flags & FD_RAW_NO_MOTOR)) {
1491 ready_date = DRS->spinup_date + DP->spinup;
1492 /* If spinup will take a long time, rerun scandrives
1493 * again just before spinup completion. Beware that
1494 * after scandrives, we must again wait for selection.
1496 if (time_after(ready_date, jiffies + DP->select_delay)) {
1497 ready_date -= DP->select_delay;
1498 function = (timeout_fn)floppy_start;
1499 } else
1500 function = (timeout_fn)setup_rw_floppy;
1502 /* wait until the floppy is spinning fast enough */
1503 if (fd_wait_for_completion(ready_date, function))
1504 return;
1506 dflags = DRS->flags;
1508 if ((flags & FD_RAW_READ) || (flags & FD_RAW_WRITE))
1509 setup_DMA();
1511 if (flags & FD_RAW_INTR)
1512 do_floppy = main_command_interrupt;
1514 r = 0;
1515 for (i = 0; i < raw_cmd->cmd_count; i++)
1516 r |= output_byte(raw_cmd->cmd[i]);
1518 debugt(__func__, "rw_command");
1520 if (r) {
1521 cont->error();
1522 reset_fdc();
1523 return;
1526 if (!(flags & FD_RAW_INTR)) {
1527 inr = result();
1528 cont->interrupt();
1529 } else if (flags & FD_RAW_NEED_DISK)
1530 fd_watchdog();
1533 static int blind_seek;
1536 * This is the routine called after every seek (or recalibrate) interrupt
1537 * from the floppy controller.
1539 static void seek_interrupt(void)
1541 debugt(__func__, "");
1542 if (inr != 2 || (ST0 & 0xF8) != 0x20) {
1543 DPRINT("seek failed\n");
1544 DRS->track = NEED_2_RECAL;
1545 cont->error();
1546 cont->redo();
1547 return;
1549 if (DRS->track >= 0 && DRS->track != ST1 && !blind_seek) {
1550 debug_dcl(DP->flags,
1551 "clearing NEWCHANGE flag because of effective seek\n");
1552 debug_dcl(DP->flags, "jiffies=%lu\n", jiffies);
1553 clear_bit(FD_DISK_NEWCHANGE_BIT, &DRS->flags);
1554 /* effective seek */
1555 DRS->select_date = jiffies;
1557 DRS->track = ST1;
1558 floppy_ready();
1561 static void check_wp(void)
1563 if (test_bit(FD_VERIFY_BIT, &DRS->flags)) {
1564 /* check write protection */
1565 output_byte(FD_GETSTATUS);
1566 output_byte(UNIT(current_drive));
1567 if (result() != 1) {
1568 FDCS->reset = 1;
1569 return;
1571 clear_bit(FD_VERIFY_BIT, &DRS->flags);
1572 clear_bit(FD_NEED_TWADDLE_BIT, &DRS->flags);
1573 debug_dcl(DP->flags,
1574 "checking whether disk is write protected\n");
1575 debug_dcl(DP->flags, "wp=%x\n", ST3 & 0x40);
1576 if (!(ST3 & 0x40))
1577 set_bit(FD_DISK_WRITABLE_BIT, &DRS->flags);
1578 else
1579 clear_bit(FD_DISK_WRITABLE_BIT, &DRS->flags);
1583 static void seek_floppy(void)
1585 int track;
1587 blind_seek = 0;
1589 debug_dcl(DP->flags, "calling disk change from %s\n", __func__);
1591 if (!test_bit(FD_DISK_NEWCHANGE_BIT, &DRS->flags) &&
1592 disk_change(current_drive) && (raw_cmd->flags & FD_RAW_NEED_DISK)) {
1593 /* the media changed flag should be cleared after the seek.
1594 * If it isn't, this means that there is really no disk in
1595 * the drive.
1597 set_bit(FD_DISK_CHANGED_BIT, &DRS->flags);
1598 cont->done(0);
1599 cont->redo();
1600 return;
1602 if (DRS->track <= NEED_1_RECAL) {
1603 recalibrate_floppy();
1604 return;
1605 } else if (test_bit(FD_DISK_NEWCHANGE_BIT, &DRS->flags) &&
1606 (raw_cmd->flags & FD_RAW_NEED_DISK) &&
1607 (DRS->track <= NO_TRACK || DRS->track == raw_cmd->track)) {
1608 /* we seek to clear the media-changed condition. Does anybody
1609 * know a more elegant way, which works on all drives? */
1610 if (raw_cmd->track)
1611 track = raw_cmd->track - 1;
1612 else {
1613 if (DP->flags & FD_SILENT_DCL_CLEAR) {
1614 set_dor(fdc, ~(0x10 << UNIT(current_drive)), 0);
1615 blind_seek = 1;
1616 raw_cmd->flags |= FD_RAW_NEED_SEEK;
1618 track = 1;
1620 } else {
1621 check_wp();
1622 if (raw_cmd->track != DRS->track &&
1623 (raw_cmd->flags & FD_RAW_NEED_SEEK))
1624 track = raw_cmd->track;
1625 else {
1626 setup_rw_floppy();
1627 return;
1631 do_floppy = seek_interrupt;
1632 output_byte(FD_SEEK);
1633 output_byte(UNIT(current_drive));
1634 if (output_byte(track) < 0) {
1635 reset_fdc();
1636 return;
1638 debugt(__func__, "");
1641 static void recal_interrupt(void)
1643 debugt(__func__, "");
1644 if (inr != 2)
1645 FDCS->reset = 1;
1646 else if (ST0 & ST0_ECE) {
1647 switch (DRS->track) {
1648 case NEED_1_RECAL:
1649 debugt(__func__, "need 1 recal");
1650 /* after a second recalibrate, we still haven't
1651 * reached track 0. Probably no drive. Raise an
1652 * error, as failing immediately might upset
1653 * computers possessed by the Devil :-) */
1654 cont->error();
1655 cont->redo();
1656 return;
1657 case NEED_2_RECAL:
1658 debugt(__func__, "need 2 recal");
1659 /* If we already did a recalibrate,
1660 * and we are not at track 0, this
1661 * means we have moved. (The only way
1662 * not to move at recalibration is to
1663 * be already at track 0.) Clear the
1664 * new change flag */
1665 debug_dcl(DP->flags,
1666 "clearing NEWCHANGE flag because of second recalibrate\n");
1668 clear_bit(FD_DISK_NEWCHANGE_BIT, &DRS->flags);
1669 DRS->select_date = jiffies;
1670 /* fall through */
1671 default:
1672 debugt(__func__, "default");
1673 /* Recalibrate moves the head by at
1674 * most 80 steps. If after one
1675 * recalibrate we don't have reached
1676 * track 0, this might mean that we
1677 * started beyond track 80. Try
1678 * again. */
1679 DRS->track = NEED_1_RECAL;
1680 break;
1682 } else
1683 DRS->track = ST1;
1684 floppy_ready();
1687 static void print_result(char *message, int inr)
1689 int i;
1691 DPRINT("%s ", message);
1692 if (inr >= 0)
1693 for (i = 0; i < inr; i++)
1694 pr_cont("repl[%d]=%x ", i, reply_buffer[i]);
1695 pr_cont("\n");
1698 /* interrupt handler. Note that this can be called externally on the Sparc */
1699 irqreturn_t floppy_interrupt(int irq, void *dev_id)
1701 int do_print;
1702 unsigned long f;
1703 void (*handler)(void) = do_floppy;
1705 lasthandler = handler;
1706 interruptjiffies = jiffies;
1708 f = claim_dma_lock();
1709 fd_disable_dma();
1710 release_dma_lock(f);
1712 floppy_enable_hlt();
1713 do_floppy = NULL;
1714 if (fdc >= N_FDC || FDCS->address == -1) {
1715 /* we don't even know which FDC is the culprit */
1716 pr_info("DOR0=%x\n", fdc_state[0].dor);
1717 pr_info("floppy interrupt on bizarre fdc %d\n", fdc);
1718 pr_info("handler=%pf\n", handler);
1719 is_alive(__func__, "bizarre fdc");
1720 return IRQ_NONE;
1723 FDCS->reset = 0;
1724 /* We have to clear the reset flag here, because apparently on boxes
1725 * with level triggered interrupts (PS/2, Sparc, ...), it is needed to
1726 * emit SENSEI's to clear the interrupt line. And FDCS->reset blocks the
1727 * emission of the SENSEI's.
1728 * It is OK to emit floppy commands because we are in an interrupt
1729 * handler here, and thus we have to fear no interference of other
1730 * activity.
1733 do_print = !handler && print_unex && initialized;
1735 inr = result();
1736 if (do_print)
1737 print_result("unexpected interrupt", inr);
1738 if (inr == 0) {
1739 int max_sensei = 4;
1740 do {
1741 output_byte(FD_SENSEI);
1742 inr = result();
1743 if (do_print)
1744 print_result("sensei", inr);
1745 max_sensei--;
1746 } while ((ST0 & 0x83) != UNIT(current_drive) &&
1747 inr == 2 && max_sensei);
1749 if (!handler) {
1750 FDCS->reset = 1;
1751 return IRQ_NONE;
1753 schedule_bh(handler);
1754 is_alive(__func__, "normal interrupt end");
1756 /* FIXME! Was it really for us? */
1757 return IRQ_HANDLED;
1760 static void recalibrate_floppy(void)
1762 debugt(__func__, "");
1763 do_floppy = recal_interrupt;
1764 output_byte(FD_RECALIBRATE);
1765 if (output_byte(UNIT(current_drive)) < 0)
1766 reset_fdc();
1770 * Must do 4 FD_SENSEIs after reset because of ``drive polling''.
1772 static void reset_interrupt(void)
1774 debugt(__func__, "");
1775 result(); /* get the status ready for set_fdc */
1776 if (FDCS->reset) {
1777 pr_info("reset set in interrupt, calling %pf\n", cont->error);
1778 cont->error(); /* a reset just after a reset. BAD! */
1780 cont->redo();
1784 * reset is done by pulling bit 2 of DOR low for a while (old FDCs),
1785 * or by setting the self clearing bit 7 of STATUS (newer FDCs)
1787 static void reset_fdc(void)
1789 unsigned long flags;
1791 do_floppy = reset_interrupt;
1792 FDCS->reset = 0;
1793 reset_fdc_info(0);
1795 /* Pseudo-DMA may intercept 'reset finished' interrupt. */
1796 /* Irrelevant for systems with true DMA (i386). */
1798 flags = claim_dma_lock();
1799 fd_disable_dma();
1800 release_dma_lock(flags);
1802 if (FDCS->version >= FDC_82072A)
1803 fd_outb(0x80 | (FDCS->dtr & 3), FD_STATUS);
1804 else {
1805 fd_outb(FDCS->dor & ~0x04, FD_DOR);
1806 udelay(FD_RESET_DELAY);
1807 fd_outb(FDCS->dor, FD_DOR);
1811 static void show_floppy(void)
1813 int i;
1815 pr_info("\n");
1816 pr_info("floppy driver state\n");
1817 pr_info("-------------------\n");
1818 pr_info("now=%lu last interrupt=%lu diff=%lu last called handler=%pf\n",
1819 jiffies, interruptjiffies, jiffies - interruptjiffies,
1820 lasthandler);
1822 pr_info("timeout_message=%s\n", timeout_message);
1823 pr_info("last output bytes:\n");
1824 for (i = 0; i < OLOGSIZE; i++)
1825 pr_info("%2x %2x %lu\n",
1826 output_log[(i + output_log_pos) % OLOGSIZE].data,
1827 output_log[(i + output_log_pos) % OLOGSIZE].status,
1828 output_log[(i + output_log_pos) % OLOGSIZE].jiffies);
1829 pr_info("last result at %lu\n", resultjiffies);
1830 pr_info("last redo_fd_request at %lu\n", lastredo);
1831 print_hex_dump(KERN_INFO, "", DUMP_PREFIX_NONE, 16, 1,
1832 reply_buffer, resultsize, true);
1834 pr_info("status=%x\n", fd_inb(FD_STATUS));
1835 pr_info("fdc_busy=%lu\n", fdc_busy);
1836 if (do_floppy)
1837 pr_info("do_floppy=%pf\n", do_floppy);
1838 if (work_pending(&floppy_work))
1839 pr_info("floppy_work.func=%pf\n", floppy_work.func);
1840 if (timer_pending(&fd_timer))
1841 pr_info("fd_timer.function=%pf\n", fd_timer.function);
1842 if (timer_pending(&fd_timeout)) {
1843 pr_info("timer_function=%pf\n", fd_timeout.function);
1844 pr_info("expires=%lu\n", fd_timeout.expires - jiffies);
1845 pr_info("now=%lu\n", jiffies);
1847 pr_info("cont=%p\n", cont);
1848 pr_info("current_req=%p\n", current_req);
1849 pr_info("command_status=%d\n", command_status);
1850 pr_info("\n");
1853 static void floppy_shutdown(unsigned long data)
1855 unsigned long flags;
1857 if (initialized)
1858 show_floppy();
1859 cancel_activity();
1861 floppy_enable_hlt();
1863 flags = claim_dma_lock();
1864 fd_disable_dma();
1865 release_dma_lock(flags);
1867 /* avoid dma going to a random drive after shutdown */
1869 if (initialized)
1870 DPRINT("floppy timeout called\n");
1871 FDCS->reset = 1;
1872 if (cont) {
1873 cont->done(0);
1874 cont->redo(); /* this will recall reset when needed */
1875 } else {
1876 pr_info("no cont in shutdown!\n");
1877 process_fd_request();
1879 is_alive(__func__, "");
1882 /* start motor, check media-changed condition and write protection */
1883 static int start_motor(void (*function)(void))
1885 int mask;
1886 int data;
1888 mask = 0xfc;
1889 data = UNIT(current_drive);
1890 if (!(raw_cmd->flags & FD_RAW_NO_MOTOR)) {
1891 if (!(FDCS->dor & (0x10 << UNIT(current_drive)))) {
1892 set_debugt();
1893 /* no read since this drive is running */
1894 DRS->first_read_date = 0;
1895 /* note motor start time if motor is not yet running */
1896 DRS->spinup_date = jiffies;
1897 data |= (0x10 << UNIT(current_drive));
1899 } else if (FDCS->dor & (0x10 << UNIT(current_drive)))
1900 mask &= ~(0x10 << UNIT(current_drive));
1902 /* starts motor and selects floppy */
1903 del_timer(motor_off_timer + current_drive);
1904 set_dor(fdc, mask, data);
1906 /* wait_for_completion also schedules reset if needed. */
1907 return fd_wait_for_completion(DRS->select_date + DP->select_delay,
1908 (timeout_fn)function);
1911 static void floppy_ready(void)
1913 if (FDCS->reset) {
1914 reset_fdc();
1915 return;
1917 if (start_motor(floppy_ready))
1918 return;
1919 if (fdc_dtr())
1920 return;
1922 debug_dcl(DP->flags, "calling disk change from floppy_ready\n");
1923 if (!(raw_cmd->flags & FD_RAW_NO_MOTOR) &&
1924 disk_change(current_drive) && !DP->select_delay)
1925 twaddle(); /* this clears the dcl on certain
1926 * drive/controller combinations */
1928 #ifdef fd_chose_dma_mode
1929 if ((raw_cmd->flags & FD_RAW_READ) || (raw_cmd->flags & FD_RAW_WRITE)) {
1930 unsigned long flags = claim_dma_lock();
1931 fd_chose_dma_mode(raw_cmd->kernel_data, raw_cmd->length);
1932 release_dma_lock(flags);
1934 #endif
1936 if (raw_cmd->flags & (FD_RAW_NEED_SEEK | FD_RAW_NEED_DISK)) {
1937 perpendicular_mode();
1938 fdc_specify(); /* must be done here because of hut, hlt ... */
1939 seek_floppy();
1940 } else {
1941 if ((raw_cmd->flags & FD_RAW_READ) ||
1942 (raw_cmd->flags & FD_RAW_WRITE))
1943 fdc_specify();
1944 setup_rw_floppy();
1948 static void floppy_start(void)
1950 reschedule_timeout(current_reqD, "floppy start");
1952 scandrives();
1953 debug_dcl(DP->flags, "setting NEWCHANGE in floppy_start\n");
1954 set_bit(FD_DISK_NEWCHANGE_BIT, &DRS->flags);
1955 floppy_ready();
1959 * ========================================================================
1960 * here ends the bottom half. Exported routines are:
1961 * floppy_start, floppy_off, floppy_ready, lock_fdc, unlock_fdc, set_fdc,
1962 * start_motor, reset_fdc, reset_fdc_info, interpret_errors.
1963 * Initialization also uses output_byte, result, set_dor, floppy_interrupt
1964 * and set_dor.
1965 * ========================================================================
1968 * General purpose continuations.
1969 * ==============================
1972 static void do_wakeup(void)
1974 reschedule_timeout(MAXTIMEOUT, "do wakeup");
1975 cont = NULL;
1976 command_status += 2;
1977 wake_up(&command_done);
1980 static const struct cont_t wakeup_cont = {
1981 .interrupt = empty,
1982 .redo = do_wakeup,
1983 .error = empty,
1984 .done = (done_f)empty
1987 static const struct cont_t intr_cont = {
1988 .interrupt = empty,
1989 .redo = process_fd_request,
1990 .error = empty,
1991 .done = (done_f)empty
1994 static int wait_til_done(void (*handler)(void), bool interruptible)
1996 int ret;
1998 schedule_bh(handler);
2000 if (interruptible)
2001 wait_event_interruptible(command_done, command_status >= 2);
2002 else
2003 wait_event(command_done, command_status >= 2);
2005 if (command_status < 2) {
2006 cancel_activity();
2007 cont = &intr_cont;
2008 reset_fdc();
2009 return -EINTR;
2012 if (FDCS->reset)
2013 command_status = FD_COMMAND_ERROR;
2014 if (command_status == FD_COMMAND_OKAY)
2015 ret = 0;
2016 else
2017 ret = -EIO;
2018 command_status = FD_COMMAND_NONE;
2019 return ret;
2022 static void generic_done(int result)
2024 command_status = result;
2025 cont = &wakeup_cont;
2028 static void generic_success(void)
2030 cont->done(1);
2033 static void generic_failure(void)
2035 cont->done(0);
2038 static void success_and_wakeup(void)
2040 generic_success();
2041 cont->redo();
2045 * formatting and rw support.
2046 * ==========================
2049 static int next_valid_format(void)
2051 int probed_format;
2053 probed_format = DRS->probed_format;
2054 while (1) {
2055 if (probed_format >= 8 || !DP->autodetect[probed_format]) {
2056 DRS->probed_format = 0;
2057 return 1;
2059 if (floppy_type[DP->autodetect[probed_format]].sect) {
2060 DRS->probed_format = probed_format;
2061 return 0;
2063 probed_format++;
2067 static void bad_flp_intr(void)
2069 int err_count;
2071 if (probing) {
2072 DRS->probed_format++;
2073 if (!next_valid_format())
2074 return;
2076 err_count = ++(*errors);
2077 INFBOUND(DRWE->badness, err_count);
2078 if (err_count > DP->max_errors.abort)
2079 cont->done(0);
2080 if (err_count > DP->max_errors.reset)
2081 FDCS->reset = 1;
2082 else if (err_count > DP->max_errors.recal)
2083 DRS->track = NEED_2_RECAL;
2086 static void set_floppy(int drive)
2088 int type = ITYPE(UDRS->fd_device);
2090 if (type)
2091 _floppy = floppy_type + type;
2092 else
2093 _floppy = current_type[drive];
2097 * formatting support.
2098 * ===================
2100 static void format_interrupt(void)
2102 switch (interpret_errors()) {
2103 case 1:
2104 cont->error();
2105 case 2:
2106 break;
2107 case 0:
2108 cont->done(1);
2110 cont->redo();
2113 #define FM_MODE(x, y) ((y) & ~(((x)->rate & 0x80) >> 1))
2114 #define CT(x) ((x) | 0xc0)
2116 static void setup_format_params(int track)
2118 int n;
2119 int il;
2120 int count;
2121 int head_shift;
2122 int track_shift;
2123 struct fparm {
2124 unsigned char track, head, sect, size;
2125 } *here = (struct fparm *)floppy_track_buffer;
2127 raw_cmd = &default_raw_cmd;
2128 raw_cmd->track = track;
2130 raw_cmd->flags = (FD_RAW_WRITE | FD_RAW_INTR | FD_RAW_SPIN |
2131 FD_RAW_NEED_DISK | FD_RAW_NEED_SEEK);
2132 raw_cmd->rate = _floppy->rate & 0x43;
2133 raw_cmd->cmd_count = NR_F;
2134 COMMAND = FM_MODE(_floppy, FD_FORMAT);
2135 DR_SELECT = UNIT(current_drive) + PH_HEAD(_floppy, format_req.head);
2136 F_SIZECODE = FD_SIZECODE(_floppy);
2137 F_SECT_PER_TRACK = _floppy->sect << 2 >> F_SIZECODE;
2138 F_GAP = _floppy->fmt_gap;
2139 F_FILL = FD_FILL_BYTE;
2141 raw_cmd->kernel_data = floppy_track_buffer;
2142 raw_cmd->length = 4 * F_SECT_PER_TRACK;
2144 /* allow for about 30ms for data transport per track */
2145 head_shift = (F_SECT_PER_TRACK + 5) / 6;
2147 /* a ``cylinder'' is two tracks plus a little stepping time */
2148 track_shift = 2 * head_shift + 3;
2150 /* position of logical sector 1 on this track */
2151 n = (track_shift * format_req.track + head_shift * format_req.head)
2152 % F_SECT_PER_TRACK;
2154 /* determine interleave */
2155 il = 1;
2156 if (_floppy->fmt_gap < 0x22)
2157 il++;
2159 /* initialize field */
2160 for (count = 0; count < F_SECT_PER_TRACK; ++count) {
2161 here[count].track = format_req.track;
2162 here[count].head = format_req.head;
2163 here[count].sect = 0;
2164 here[count].size = F_SIZECODE;
2166 /* place logical sectors */
2167 for (count = 1; count <= F_SECT_PER_TRACK; ++count) {
2168 here[n].sect = count;
2169 n = (n + il) % F_SECT_PER_TRACK;
2170 if (here[n].sect) { /* sector busy, find next free sector */
2171 ++n;
2172 if (n >= F_SECT_PER_TRACK) {
2173 n -= F_SECT_PER_TRACK;
2174 while (here[n].sect)
2175 ++n;
2179 if (_floppy->stretch & FD_SECTBASEMASK) {
2180 for (count = 0; count < F_SECT_PER_TRACK; count++)
2181 here[count].sect += FD_SECTBASE(_floppy) - 1;
2185 static void redo_format(void)
2187 buffer_track = -1;
2188 setup_format_params(format_req.track << STRETCH(_floppy));
2189 floppy_start();
2190 debugt(__func__, "queue format request");
2193 static const struct cont_t format_cont = {
2194 .interrupt = format_interrupt,
2195 .redo = redo_format,
2196 .error = bad_flp_intr,
2197 .done = generic_done
2200 static int do_format(int drive, struct format_descr *tmp_format_req)
2202 int ret;
2204 if (lock_fdc(drive, true))
2205 return -EINTR;
2207 set_floppy(drive);
2208 if (!_floppy ||
2209 _floppy->track > DP->tracks ||
2210 tmp_format_req->track >= _floppy->track ||
2211 tmp_format_req->head >= _floppy->head ||
2212 (_floppy->sect << 2) % (1 << FD_SIZECODE(_floppy)) ||
2213 !_floppy->fmt_gap) {
2214 process_fd_request();
2215 return -EINVAL;
2217 format_req = *tmp_format_req;
2218 format_errors = 0;
2219 cont = &format_cont;
2220 errors = &format_errors;
2221 ret = wait_til_done(redo_format, true);
2222 if (ret == -EINTR)
2223 return -EINTR;
2224 process_fd_request();
2225 return ret;
2229 * Buffer read/write and support
2230 * =============================
2233 static void floppy_end_request(struct request *req, int error)
2235 unsigned int nr_sectors = current_count_sectors;
2236 unsigned int drive = (unsigned long)req->rq_disk->private_data;
2238 /* current_count_sectors can be zero if transfer failed */
2239 if (error)
2240 nr_sectors = blk_rq_cur_sectors(req);
2241 if (__blk_end_request(req, error, nr_sectors << 9))
2242 return;
2244 /* We're done with the request */
2245 floppy_off(drive);
2246 current_req = NULL;
2249 /* new request_done. Can handle physical sectors which are smaller than a
2250 * logical buffer */
2251 static void request_done(int uptodate)
2253 struct request *req = current_req;
2254 struct request_queue *q;
2255 unsigned long flags;
2256 int block;
2257 char msg[sizeof("request done ") + sizeof(int) * 3];
2259 probing = 0;
2260 snprintf(msg, sizeof(msg), "request done %d", uptodate);
2261 reschedule_timeout(MAXTIMEOUT, msg);
2263 if (!req) {
2264 pr_info("floppy.c: no request in request_done\n");
2265 return;
2268 q = req->q;
2270 if (uptodate) {
2271 /* maintain values for invalidation on geometry
2272 * change */
2273 block = current_count_sectors + blk_rq_pos(req);
2274 INFBOUND(DRS->maxblock, block);
2275 if (block > _floppy->sect)
2276 DRS->maxtrack = 1;
2278 /* unlock chained buffers */
2279 spin_lock_irqsave(q->queue_lock, flags);
2280 floppy_end_request(req, 0);
2281 spin_unlock_irqrestore(q->queue_lock, flags);
2282 } else {
2283 if (rq_data_dir(req) == WRITE) {
2284 /* record write error information */
2285 DRWE->write_errors++;
2286 if (DRWE->write_errors == 1) {
2287 DRWE->first_error_sector = blk_rq_pos(req);
2288 DRWE->first_error_generation = DRS->generation;
2290 DRWE->last_error_sector = blk_rq_pos(req);
2291 DRWE->last_error_generation = DRS->generation;
2293 spin_lock_irqsave(q->queue_lock, flags);
2294 floppy_end_request(req, -EIO);
2295 spin_unlock_irqrestore(q->queue_lock, flags);
2299 /* Interrupt handler evaluating the result of the r/w operation */
2300 static void rw_interrupt(void)
2302 int eoc;
2303 int ssize;
2304 int heads;
2305 int nr_sectors;
2307 if (R_HEAD >= 2) {
2308 /* some Toshiba floppy controllers occasionnally seem to
2309 * return bogus interrupts after read/write operations, which
2310 * can be recognized by a bad head number (>= 2) */
2311 return;
2314 if (!DRS->first_read_date)
2315 DRS->first_read_date = jiffies;
2317 nr_sectors = 0;
2318 ssize = DIV_ROUND_UP(1 << SIZECODE, 4);
2320 if (ST1 & ST1_EOC)
2321 eoc = 1;
2322 else
2323 eoc = 0;
2325 if (COMMAND & 0x80)
2326 heads = 2;
2327 else
2328 heads = 1;
2330 nr_sectors = (((R_TRACK - TRACK) * heads +
2331 R_HEAD - HEAD) * SECT_PER_TRACK +
2332 R_SECTOR - SECTOR + eoc) << SIZECODE >> 2;
2334 if (nr_sectors / ssize >
2335 DIV_ROUND_UP(in_sector_offset + current_count_sectors, ssize)) {
2336 DPRINT("long rw: %x instead of %lx\n",
2337 nr_sectors, current_count_sectors);
2338 pr_info("rs=%d s=%d\n", R_SECTOR, SECTOR);
2339 pr_info("rh=%d h=%d\n", R_HEAD, HEAD);
2340 pr_info("rt=%d t=%d\n", R_TRACK, TRACK);
2341 pr_info("heads=%d eoc=%d\n", heads, eoc);
2342 pr_info("spt=%d st=%d ss=%d\n",
2343 SECT_PER_TRACK, fsector_t, ssize);
2344 pr_info("in_sector_offset=%d\n", in_sector_offset);
2347 nr_sectors -= in_sector_offset;
2348 INFBOUND(nr_sectors, 0);
2349 SUPBOUND(current_count_sectors, nr_sectors);
2351 switch (interpret_errors()) {
2352 case 2:
2353 cont->redo();
2354 return;
2355 case 1:
2356 if (!current_count_sectors) {
2357 cont->error();
2358 cont->redo();
2359 return;
2361 break;
2362 case 0:
2363 if (!current_count_sectors) {
2364 cont->redo();
2365 return;
2367 current_type[current_drive] = _floppy;
2368 floppy_sizes[TOMINOR(current_drive)] = _floppy->size;
2369 break;
2372 if (probing) {
2373 if (DP->flags & FTD_MSG)
2374 DPRINT("Auto-detected floppy type %s in fd%d\n",
2375 _floppy->name, current_drive);
2376 current_type[current_drive] = _floppy;
2377 floppy_sizes[TOMINOR(current_drive)] = _floppy->size;
2378 probing = 0;
2381 if (CT(COMMAND) != FD_READ ||
2382 raw_cmd->kernel_data == current_req->buffer) {
2383 /* transfer directly from buffer */
2384 cont->done(1);
2385 } else if (CT(COMMAND) == FD_READ) {
2386 buffer_track = raw_cmd->track;
2387 buffer_drive = current_drive;
2388 INFBOUND(buffer_max, nr_sectors + fsector_t);
2390 cont->redo();
2393 /* Compute maximal contiguous buffer size. */
2394 static int buffer_chain_size(void)
2396 struct bio_vec *bv;
2397 int size;
2398 struct req_iterator iter;
2399 char *base;
2401 base = bio_data(current_req->bio);
2402 size = 0;
2404 rq_for_each_segment(bv, current_req, iter) {
2405 if (page_address(bv->bv_page) + bv->bv_offset != base + size)
2406 break;
2408 size += bv->bv_len;
2411 return size >> 9;
2414 /* Compute the maximal transfer size */
2415 static int transfer_size(int ssize, int max_sector, int max_size)
2417 SUPBOUND(max_sector, fsector_t + max_size);
2419 /* alignment */
2420 max_sector -= (max_sector % _floppy->sect) % ssize;
2422 /* transfer size, beginning not aligned */
2423 current_count_sectors = max_sector - fsector_t;
2425 return max_sector;
2429 * Move data from/to the track buffer to/from the buffer cache.
2431 static void copy_buffer(int ssize, int max_sector, int max_sector_2)
2433 int remaining; /* number of transferred 512-byte sectors */
2434 struct bio_vec *bv;
2435 char *buffer;
2436 char *dma_buffer;
2437 int size;
2438 struct req_iterator iter;
2440 max_sector = transfer_size(ssize,
2441 min(max_sector, max_sector_2),
2442 blk_rq_sectors(current_req));
2444 if (current_count_sectors <= 0 && CT(COMMAND) == FD_WRITE &&
2445 buffer_max > fsector_t + blk_rq_sectors(current_req))
2446 current_count_sectors = min_t(int, buffer_max - fsector_t,
2447 blk_rq_sectors(current_req));
2449 remaining = current_count_sectors << 9;
2450 if (remaining > blk_rq_bytes(current_req) && CT(COMMAND) == FD_WRITE) {
2451 DPRINT("in copy buffer\n");
2452 pr_info("current_count_sectors=%ld\n", current_count_sectors);
2453 pr_info("remaining=%d\n", remaining >> 9);
2454 pr_info("current_req->nr_sectors=%u\n",
2455 blk_rq_sectors(current_req));
2456 pr_info("current_req->current_nr_sectors=%u\n",
2457 blk_rq_cur_sectors(current_req));
2458 pr_info("max_sector=%d\n", max_sector);
2459 pr_info("ssize=%d\n", ssize);
2462 buffer_max = max(max_sector, buffer_max);
2464 dma_buffer = floppy_track_buffer + ((fsector_t - buffer_min) << 9);
2466 size = blk_rq_cur_bytes(current_req);
2468 rq_for_each_segment(bv, current_req, iter) {
2469 if (!remaining)
2470 break;
2472 size = bv->bv_len;
2473 SUPBOUND(size, remaining);
2475 buffer = page_address(bv->bv_page) + bv->bv_offset;
2476 if (dma_buffer + size >
2477 floppy_track_buffer + (max_buffer_sectors << 10) ||
2478 dma_buffer < floppy_track_buffer) {
2479 DPRINT("buffer overrun in copy buffer %d\n",
2480 (int)((floppy_track_buffer - dma_buffer) >> 9));
2481 pr_info("fsector_t=%d buffer_min=%d\n",
2482 fsector_t, buffer_min);
2483 pr_info("current_count_sectors=%ld\n",
2484 current_count_sectors);
2485 if (CT(COMMAND) == FD_READ)
2486 pr_info("read\n");
2487 if (CT(COMMAND) == FD_WRITE)
2488 pr_info("write\n");
2489 break;
2491 if (((unsigned long)buffer) % 512)
2492 DPRINT("%p buffer not aligned\n", buffer);
2494 if (CT(COMMAND) == FD_READ)
2495 memcpy(buffer, dma_buffer, size);
2496 else
2497 memcpy(dma_buffer, buffer, size);
2499 remaining -= size;
2500 dma_buffer += size;
2502 if (remaining) {
2503 if (remaining > 0)
2504 max_sector -= remaining >> 9;
2505 DPRINT("weirdness: remaining %d\n", remaining >> 9);
2509 /* work around a bug in pseudo DMA
2510 * (on some FDCs) pseudo DMA does not stop when the CPU stops
2511 * sending data. Hence we need a different way to signal the
2512 * transfer length: We use SECT_PER_TRACK. Unfortunately, this
2513 * does not work with MT, hence we can only transfer one head at
2514 * a time
2516 static void virtualdmabug_workaround(void)
2518 int hard_sectors;
2519 int end_sector;
2521 if (CT(COMMAND) == FD_WRITE) {
2522 COMMAND &= ~0x80; /* switch off multiple track mode */
2524 hard_sectors = raw_cmd->length >> (7 + SIZECODE);
2525 end_sector = SECTOR + hard_sectors - 1;
2526 if (end_sector > SECT_PER_TRACK) {
2527 pr_info("too many sectors %d > %d\n",
2528 end_sector, SECT_PER_TRACK);
2529 return;
2531 SECT_PER_TRACK = end_sector;
2532 /* make sure SECT_PER_TRACK
2533 * points to end of transfer */
2538 * Formulate a read/write request.
2539 * this routine decides where to load the data (directly to buffer, or to
2540 * tmp floppy area), how much data to load (the size of the buffer, the whole
2541 * track, or a single sector)
2542 * All floppy_track_buffer handling goes in here. If we ever add track buffer
2543 * allocation on the fly, it should be done here. No other part should need
2544 * modification.
2547 static int make_raw_rw_request(void)
2549 int aligned_sector_t;
2550 int max_sector;
2551 int max_size;
2552 int tracksize;
2553 int ssize;
2555 if (WARN(max_buffer_sectors == 0, "VFS: Block I/O scheduled on unopened device\n"))
2556 return 0;
2558 set_fdc((long)current_req->rq_disk->private_data);
2560 raw_cmd = &default_raw_cmd;
2561 raw_cmd->flags = FD_RAW_SPIN | FD_RAW_NEED_DISK | FD_RAW_NEED_DISK |
2562 FD_RAW_NEED_SEEK;
2563 raw_cmd->cmd_count = NR_RW;
2564 if (rq_data_dir(current_req) == READ) {
2565 raw_cmd->flags |= FD_RAW_READ;
2566 COMMAND = FM_MODE(_floppy, FD_READ);
2567 } else if (rq_data_dir(current_req) == WRITE) {
2568 raw_cmd->flags |= FD_RAW_WRITE;
2569 COMMAND = FM_MODE(_floppy, FD_WRITE);
2570 } else {
2571 DPRINT("%s: unknown command\n", __func__);
2572 return 0;
2575 max_sector = _floppy->sect * _floppy->head;
2577 TRACK = (int)blk_rq_pos(current_req) / max_sector;
2578 fsector_t = (int)blk_rq_pos(current_req) % max_sector;
2579 if (_floppy->track && TRACK >= _floppy->track) {
2580 if (blk_rq_cur_sectors(current_req) & 1) {
2581 current_count_sectors = 1;
2582 return 1;
2583 } else
2584 return 0;
2586 HEAD = fsector_t / _floppy->sect;
2588 if (((_floppy->stretch & (FD_SWAPSIDES | FD_SECTBASEMASK)) ||
2589 test_bit(FD_NEED_TWADDLE_BIT, &DRS->flags)) &&
2590 fsector_t < _floppy->sect)
2591 max_sector = _floppy->sect;
2593 /* 2M disks have phantom sectors on the first track */
2594 if ((_floppy->rate & FD_2M) && (!TRACK) && (!HEAD)) {
2595 max_sector = 2 * _floppy->sect / 3;
2596 if (fsector_t >= max_sector) {
2597 current_count_sectors =
2598 min_t(int, _floppy->sect - fsector_t,
2599 blk_rq_sectors(current_req));
2600 return 1;
2602 SIZECODE = 2;
2603 } else
2604 SIZECODE = FD_SIZECODE(_floppy);
2605 raw_cmd->rate = _floppy->rate & 0x43;
2606 if ((_floppy->rate & FD_2M) && (TRACK || HEAD) && raw_cmd->rate == 2)
2607 raw_cmd->rate = 1;
2609 if (SIZECODE)
2610 SIZECODE2 = 0xff;
2611 else
2612 SIZECODE2 = 0x80;
2613 raw_cmd->track = TRACK << STRETCH(_floppy);
2614 DR_SELECT = UNIT(current_drive) + PH_HEAD(_floppy, HEAD);
2615 GAP = _floppy->gap;
2616 ssize = DIV_ROUND_UP(1 << SIZECODE, 4);
2617 SECT_PER_TRACK = _floppy->sect << 2 >> SIZECODE;
2618 SECTOR = ((fsector_t % _floppy->sect) << 2 >> SIZECODE) +
2619 FD_SECTBASE(_floppy);
2621 /* tracksize describes the size which can be filled up with sectors
2622 * of size ssize.
2624 tracksize = _floppy->sect - _floppy->sect % ssize;
2625 if (tracksize < _floppy->sect) {
2626 SECT_PER_TRACK++;
2627 if (tracksize <= fsector_t % _floppy->sect)
2628 SECTOR--;
2630 /* if we are beyond tracksize, fill up using smaller sectors */
2631 while (tracksize <= fsector_t % _floppy->sect) {
2632 while (tracksize + ssize > _floppy->sect) {
2633 SIZECODE--;
2634 ssize >>= 1;
2636 SECTOR++;
2637 SECT_PER_TRACK++;
2638 tracksize += ssize;
2640 max_sector = HEAD * _floppy->sect + tracksize;
2641 } else if (!TRACK && !HEAD && !(_floppy->rate & FD_2M) && probing) {
2642 max_sector = _floppy->sect;
2643 } else if (!HEAD && CT(COMMAND) == FD_WRITE) {
2644 /* for virtual DMA bug workaround */
2645 max_sector = _floppy->sect;
2648 in_sector_offset = (fsector_t % _floppy->sect) % ssize;
2649 aligned_sector_t = fsector_t - in_sector_offset;
2650 max_size = blk_rq_sectors(current_req);
2651 if ((raw_cmd->track == buffer_track) &&
2652 (current_drive == buffer_drive) &&
2653 (fsector_t >= buffer_min) && (fsector_t < buffer_max)) {
2654 /* data already in track buffer */
2655 if (CT(COMMAND) == FD_READ) {
2656 copy_buffer(1, max_sector, buffer_max);
2657 return 1;
2659 } else if (in_sector_offset || blk_rq_sectors(current_req) < ssize) {
2660 if (CT(COMMAND) == FD_WRITE) {
2661 unsigned int sectors;
2663 sectors = fsector_t + blk_rq_sectors(current_req);
2664 if (sectors > ssize && sectors < ssize + ssize)
2665 max_size = ssize + ssize;
2666 else
2667 max_size = ssize;
2669 raw_cmd->flags &= ~FD_RAW_WRITE;
2670 raw_cmd->flags |= FD_RAW_READ;
2671 COMMAND = FM_MODE(_floppy, FD_READ);
2672 } else if ((unsigned long)current_req->buffer < MAX_DMA_ADDRESS) {
2673 unsigned long dma_limit;
2674 int direct, indirect;
2676 indirect =
2677 transfer_size(ssize, max_sector,
2678 max_buffer_sectors * 2) - fsector_t;
2681 * Do NOT use minimum() here---MAX_DMA_ADDRESS is 64 bits wide
2682 * on a 64 bit machine!
2684 max_size = buffer_chain_size();
2685 dma_limit = (MAX_DMA_ADDRESS -
2686 ((unsigned long)current_req->buffer)) >> 9;
2687 if ((unsigned long)max_size > dma_limit)
2688 max_size = dma_limit;
2689 /* 64 kb boundaries */
2690 if (CROSS_64KB(current_req->buffer, max_size << 9))
2691 max_size = (K_64 -
2692 ((unsigned long)current_req->buffer) %
2693 K_64) >> 9;
2694 direct = transfer_size(ssize, max_sector, max_size) - fsector_t;
2696 * We try to read tracks, but if we get too many errors, we
2697 * go back to reading just one sector at a time.
2699 * This means we should be able to read a sector even if there
2700 * are other bad sectors on this track.
2702 if (!direct ||
2703 (indirect * 2 > direct * 3 &&
2704 *errors < DP->max_errors.read_track &&
2705 ((!probing ||
2706 (DP->read_track & (1 << DRS->probed_format)))))) {
2707 max_size = blk_rq_sectors(current_req);
2708 } else {
2709 raw_cmd->kernel_data = current_req->buffer;
2710 raw_cmd->length = current_count_sectors << 9;
2711 if (raw_cmd->length == 0) {
2712 DPRINT("%s: zero dma transfer attempted\n", __func__);
2713 DPRINT("indirect=%d direct=%d fsector_t=%d\n",
2714 indirect, direct, fsector_t);
2715 return 0;
2717 virtualdmabug_workaround();
2718 return 2;
2722 if (CT(COMMAND) == FD_READ)
2723 max_size = max_sector; /* unbounded */
2725 /* claim buffer track if needed */
2726 if (buffer_track != raw_cmd->track || /* bad track */
2727 buffer_drive != current_drive || /* bad drive */
2728 fsector_t > buffer_max ||
2729 fsector_t < buffer_min ||
2730 ((CT(COMMAND) == FD_READ ||
2731 (!in_sector_offset && blk_rq_sectors(current_req) >= ssize)) &&
2732 max_sector > 2 * max_buffer_sectors + buffer_min &&
2733 max_size + fsector_t > 2 * max_buffer_sectors + buffer_min)) {
2734 /* not enough space */
2735 buffer_track = -1;
2736 buffer_drive = current_drive;
2737 buffer_max = buffer_min = aligned_sector_t;
2739 raw_cmd->kernel_data = floppy_track_buffer +
2740 ((aligned_sector_t - buffer_min) << 9);
2742 if (CT(COMMAND) == FD_WRITE) {
2743 /* copy write buffer to track buffer.
2744 * if we get here, we know that the write
2745 * is either aligned or the data already in the buffer
2746 * (buffer will be overwritten) */
2747 if (in_sector_offset && buffer_track == -1)
2748 DPRINT("internal error offset !=0 on write\n");
2749 buffer_track = raw_cmd->track;
2750 buffer_drive = current_drive;
2751 copy_buffer(ssize, max_sector,
2752 2 * max_buffer_sectors + buffer_min);
2753 } else
2754 transfer_size(ssize, max_sector,
2755 2 * max_buffer_sectors + buffer_min -
2756 aligned_sector_t);
2758 /* round up current_count_sectors to get dma xfer size */
2759 raw_cmd->length = in_sector_offset + current_count_sectors;
2760 raw_cmd->length = ((raw_cmd->length - 1) | (ssize - 1)) + 1;
2761 raw_cmd->length <<= 9;
2762 if ((raw_cmd->length < current_count_sectors << 9) ||
2763 (raw_cmd->kernel_data != current_req->buffer &&
2764 CT(COMMAND) == FD_WRITE &&
2765 (aligned_sector_t + (raw_cmd->length >> 9) > buffer_max ||
2766 aligned_sector_t < buffer_min)) ||
2767 raw_cmd->length % (128 << SIZECODE) ||
2768 raw_cmd->length <= 0 || current_count_sectors <= 0) {
2769 DPRINT("fractionary current count b=%lx s=%lx\n",
2770 raw_cmd->length, current_count_sectors);
2771 if (raw_cmd->kernel_data != current_req->buffer)
2772 pr_info("addr=%d, length=%ld\n",
2773 (int)((raw_cmd->kernel_data -
2774 floppy_track_buffer) >> 9),
2775 current_count_sectors);
2776 pr_info("st=%d ast=%d mse=%d msi=%d\n",
2777 fsector_t, aligned_sector_t, max_sector, max_size);
2778 pr_info("ssize=%x SIZECODE=%d\n", ssize, SIZECODE);
2779 pr_info("command=%x SECTOR=%d HEAD=%d, TRACK=%d\n",
2780 COMMAND, SECTOR, HEAD, TRACK);
2781 pr_info("buffer drive=%d\n", buffer_drive);
2782 pr_info("buffer track=%d\n", buffer_track);
2783 pr_info("buffer_min=%d\n", buffer_min);
2784 pr_info("buffer_max=%d\n", buffer_max);
2785 return 0;
2788 if (raw_cmd->kernel_data != current_req->buffer) {
2789 if (raw_cmd->kernel_data < floppy_track_buffer ||
2790 current_count_sectors < 0 ||
2791 raw_cmd->length < 0 ||
2792 raw_cmd->kernel_data + raw_cmd->length >
2793 floppy_track_buffer + (max_buffer_sectors << 10)) {
2794 DPRINT("buffer overrun in schedule dma\n");
2795 pr_info("fsector_t=%d buffer_min=%d current_count=%ld\n",
2796 fsector_t, buffer_min, raw_cmd->length >> 9);
2797 pr_info("current_count_sectors=%ld\n",
2798 current_count_sectors);
2799 if (CT(COMMAND) == FD_READ)
2800 pr_info("read\n");
2801 if (CT(COMMAND) == FD_WRITE)
2802 pr_info("write\n");
2803 return 0;
2805 } else if (raw_cmd->length > blk_rq_bytes(current_req) ||
2806 current_count_sectors > blk_rq_sectors(current_req)) {
2807 DPRINT("buffer overrun in direct transfer\n");
2808 return 0;
2809 } else if (raw_cmd->length < current_count_sectors << 9) {
2810 DPRINT("more sectors than bytes\n");
2811 pr_info("bytes=%ld\n", raw_cmd->length >> 9);
2812 pr_info("sectors=%ld\n", current_count_sectors);
2814 if (raw_cmd->length == 0) {
2815 DPRINT("zero dma transfer attempted from make_raw_request\n");
2816 return 0;
2819 virtualdmabug_workaround();
2820 return 2;
2824 * Round-robin between our available drives, doing one request from each
2826 static int set_next_request(void)
2828 struct request_queue *q;
2829 int old_pos = fdc_queue;
2831 do {
2832 q = disks[fdc_queue]->queue;
2833 if (++fdc_queue == N_DRIVE)
2834 fdc_queue = 0;
2835 if (q) {
2836 current_req = blk_fetch_request(q);
2837 if (current_req)
2838 break;
2840 } while (fdc_queue != old_pos);
2842 return current_req != NULL;
2845 static void redo_fd_request(void)
2847 int drive;
2848 int tmp;
2850 lastredo = jiffies;
2851 if (current_drive < N_DRIVE)
2852 floppy_off(current_drive);
2854 do_request:
2855 if (!current_req) {
2856 int pending;
2858 spin_lock_irq(&floppy_lock);
2859 pending = set_next_request();
2860 spin_unlock_irq(&floppy_lock);
2862 if (!pending) {
2863 do_floppy = NULL;
2864 unlock_fdc();
2865 return;
2868 drive = (long)current_req->rq_disk->private_data;
2869 set_fdc(drive);
2870 reschedule_timeout(current_reqD, "redo fd request");
2872 set_floppy(drive);
2873 raw_cmd = &default_raw_cmd;
2874 raw_cmd->flags = 0;
2875 if (start_motor(redo_fd_request))
2876 return;
2878 disk_change(current_drive);
2879 if (test_bit(current_drive, &fake_change) ||
2880 test_bit(FD_DISK_CHANGED_BIT, &DRS->flags)) {
2881 DPRINT("disk absent or changed during operation\n");
2882 request_done(0);
2883 goto do_request;
2885 if (!_floppy) { /* Autodetection */
2886 if (!probing) {
2887 DRS->probed_format = 0;
2888 if (next_valid_format()) {
2889 DPRINT("no autodetectable formats\n");
2890 _floppy = NULL;
2891 request_done(0);
2892 goto do_request;
2895 probing = 1;
2896 _floppy = floppy_type + DP->autodetect[DRS->probed_format];
2897 } else
2898 probing = 0;
2899 errors = &(current_req->errors);
2900 tmp = make_raw_rw_request();
2901 if (tmp < 2) {
2902 request_done(tmp);
2903 goto do_request;
2906 if (test_bit(FD_NEED_TWADDLE_BIT, &DRS->flags))
2907 twaddle();
2908 schedule_bh(floppy_start);
2909 debugt(__func__, "queue fd request");
2910 return;
2913 static const struct cont_t rw_cont = {
2914 .interrupt = rw_interrupt,
2915 .redo = redo_fd_request,
2916 .error = bad_flp_intr,
2917 .done = request_done
2920 static void process_fd_request(void)
2922 cont = &rw_cont;
2923 schedule_bh(redo_fd_request);
2926 static void do_fd_request(struct request_queue *q)
2928 if (WARN(max_buffer_sectors == 0,
2929 "VFS: %s called on non-open device\n", __func__))
2930 return;
2932 if (WARN(atomic_read(&usage_count) == 0,
2933 "warning: usage count=0, current_req=%p sect=%ld type=%x flags=%x\n",
2934 current_req, (long)blk_rq_pos(current_req), current_req->cmd_type,
2935 current_req->cmd_flags))
2936 return;
2938 if (test_bit(0, &fdc_busy)) {
2939 /* fdc busy, this new request will be treated when the
2940 current one is done */
2941 is_alive(__func__, "old request running");
2942 return;
2944 lock_fdc(MAXTIMEOUT, false);
2945 process_fd_request();
2946 is_alive(__func__, "");
2949 static const struct cont_t poll_cont = {
2950 .interrupt = success_and_wakeup,
2951 .redo = floppy_ready,
2952 .error = generic_failure,
2953 .done = generic_done
2956 static int poll_drive(bool interruptible, int flag)
2958 /* no auto-sense, just clear dcl */
2959 raw_cmd = &default_raw_cmd;
2960 raw_cmd->flags = flag;
2961 raw_cmd->track = 0;
2962 raw_cmd->cmd_count = 0;
2963 cont = &poll_cont;
2964 debug_dcl(DP->flags, "setting NEWCHANGE in poll_drive\n");
2965 set_bit(FD_DISK_NEWCHANGE_BIT, &DRS->flags);
2967 return wait_til_done(floppy_ready, interruptible);
2971 * User triggered reset
2972 * ====================
2975 static void reset_intr(void)
2977 pr_info("weird, reset interrupt called\n");
2980 static const struct cont_t reset_cont = {
2981 .interrupt = reset_intr,
2982 .redo = success_and_wakeup,
2983 .error = generic_failure,
2984 .done = generic_done
2987 static int user_reset_fdc(int drive, int arg, bool interruptible)
2989 int ret;
2991 if (lock_fdc(drive, interruptible))
2992 return -EINTR;
2994 if (arg == FD_RESET_ALWAYS)
2995 FDCS->reset = 1;
2996 if (FDCS->reset) {
2997 cont = &reset_cont;
2998 ret = wait_til_done(reset_fdc, interruptible);
2999 if (ret == -EINTR)
3000 return -EINTR;
3002 process_fd_request();
3003 return 0;
3007 * Misc Ioctl's and support
3008 * ========================
3010 static inline int fd_copyout(void __user *param, const void *address,
3011 unsigned long size)
3013 return copy_to_user(param, address, size) ? -EFAULT : 0;
3016 static inline int fd_copyin(void __user *param, void *address,
3017 unsigned long size)
3019 return copy_from_user(address, param, size) ? -EFAULT : 0;
3022 static const char *drive_name(int type, int drive)
3024 struct floppy_struct *floppy;
3026 if (type)
3027 floppy = floppy_type + type;
3028 else {
3029 if (UDP->native_format)
3030 floppy = floppy_type + UDP->native_format;
3031 else
3032 return "(null)";
3034 if (floppy->name)
3035 return floppy->name;
3036 else
3037 return "(null)";
3040 /* raw commands */
3041 static void raw_cmd_done(int flag)
3043 int i;
3045 if (!flag) {
3046 raw_cmd->flags |= FD_RAW_FAILURE;
3047 raw_cmd->flags |= FD_RAW_HARDFAILURE;
3048 } else {
3049 raw_cmd->reply_count = inr;
3050 if (raw_cmd->reply_count > MAX_REPLIES)
3051 raw_cmd->reply_count = 0;
3052 for (i = 0; i < raw_cmd->reply_count; i++)
3053 raw_cmd->reply[i] = reply_buffer[i];
3055 if (raw_cmd->flags & (FD_RAW_READ | FD_RAW_WRITE)) {
3056 unsigned long flags;
3057 flags = claim_dma_lock();
3058 raw_cmd->length = fd_get_dma_residue();
3059 release_dma_lock(flags);
3062 if ((raw_cmd->flags & FD_RAW_SOFTFAILURE) &&
3063 (!raw_cmd->reply_count || (raw_cmd->reply[0] & 0xc0)))
3064 raw_cmd->flags |= FD_RAW_FAILURE;
3066 if (disk_change(current_drive))
3067 raw_cmd->flags |= FD_RAW_DISK_CHANGE;
3068 else
3069 raw_cmd->flags &= ~FD_RAW_DISK_CHANGE;
3070 if (raw_cmd->flags & FD_RAW_NO_MOTOR_AFTER)
3071 motor_off_callback(current_drive);
3073 if (raw_cmd->next &&
3074 (!(raw_cmd->flags & FD_RAW_FAILURE) ||
3075 !(raw_cmd->flags & FD_RAW_STOP_IF_FAILURE)) &&
3076 ((raw_cmd->flags & FD_RAW_FAILURE) ||
3077 !(raw_cmd->flags & FD_RAW_STOP_IF_SUCCESS))) {
3078 raw_cmd = raw_cmd->next;
3079 return;
3082 generic_done(flag);
3085 static const struct cont_t raw_cmd_cont = {
3086 .interrupt = success_and_wakeup,
3087 .redo = floppy_start,
3088 .error = generic_failure,
3089 .done = raw_cmd_done
3092 static int raw_cmd_copyout(int cmd, void __user *param,
3093 struct floppy_raw_cmd *ptr)
3095 int ret;
3097 while (ptr) {
3098 ret = copy_to_user(param, ptr, sizeof(*ptr));
3099 if (ret)
3100 return -EFAULT;
3101 param += sizeof(struct floppy_raw_cmd);
3102 if ((ptr->flags & FD_RAW_READ) && ptr->buffer_length) {
3103 if (ptr->length >= 0 &&
3104 ptr->length <= ptr->buffer_length) {
3105 long length = ptr->buffer_length - ptr->length;
3106 ret = fd_copyout(ptr->data, ptr->kernel_data,
3107 length);
3108 if (ret)
3109 return ret;
3112 ptr = ptr->next;
3115 return 0;
3118 static void raw_cmd_free(struct floppy_raw_cmd **ptr)
3120 struct floppy_raw_cmd *next;
3121 struct floppy_raw_cmd *this;
3123 this = *ptr;
3124 *ptr = NULL;
3125 while (this) {
3126 if (this->buffer_length) {
3127 fd_dma_mem_free((unsigned long)this->kernel_data,
3128 this->buffer_length);
3129 this->buffer_length = 0;
3131 next = this->next;
3132 kfree(this);
3133 this = next;
3137 static int raw_cmd_copyin(int cmd, void __user *param,
3138 struct floppy_raw_cmd **rcmd)
3140 struct floppy_raw_cmd *ptr;
3141 int ret;
3142 int i;
3144 *rcmd = NULL;
3146 loop:
3147 ptr = kmalloc(sizeof(struct floppy_raw_cmd), GFP_USER);
3148 if (!ptr)
3149 return -ENOMEM;
3150 *rcmd = ptr;
3151 ret = copy_from_user(ptr, param, sizeof(*ptr));
3152 if (ret)
3153 return -EFAULT;
3154 ptr->next = NULL;
3155 ptr->buffer_length = 0;
3156 param += sizeof(struct floppy_raw_cmd);
3157 if (ptr->cmd_count > 33)
3158 /* the command may now also take up the space
3159 * initially intended for the reply & the
3160 * reply count. Needed for long 82078 commands
3161 * such as RESTORE, which takes ... 17 command
3162 * bytes. Murphy's law #137: When you reserve
3163 * 16 bytes for a structure, you'll one day
3164 * discover that you really need 17...
3166 return -EINVAL;
3168 for (i = 0; i < 16; i++)
3169 ptr->reply[i] = 0;
3170 ptr->resultcode = 0;
3171 ptr->kernel_data = NULL;
3173 if (ptr->flags & (FD_RAW_READ | FD_RAW_WRITE)) {
3174 if (ptr->length <= 0)
3175 return -EINVAL;
3176 ptr->kernel_data = (char *)fd_dma_mem_alloc(ptr->length);
3177 fallback_on_nodma_alloc(&ptr->kernel_data, ptr->length);
3178 if (!ptr->kernel_data)
3179 return -ENOMEM;
3180 ptr->buffer_length = ptr->length;
3182 if (ptr->flags & FD_RAW_WRITE) {
3183 ret = fd_copyin(ptr->data, ptr->kernel_data, ptr->length);
3184 if (ret)
3185 return ret;
3188 if (ptr->flags & FD_RAW_MORE) {
3189 rcmd = &(ptr->next);
3190 ptr->rate &= 0x43;
3191 goto loop;
3194 return 0;
3197 static int raw_cmd_ioctl(int cmd, void __user *param)
3199 struct floppy_raw_cmd *my_raw_cmd;
3200 int drive;
3201 int ret2;
3202 int ret;
3204 if (FDCS->rawcmd <= 1)
3205 FDCS->rawcmd = 1;
3206 for (drive = 0; drive < N_DRIVE; drive++) {
3207 if (FDC(drive) != fdc)
3208 continue;
3209 if (drive == current_drive) {
3210 if (UDRS->fd_ref > 1) {
3211 FDCS->rawcmd = 2;
3212 break;
3214 } else if (UDRS->fd_ref) {
3215 FDCS->rawcmd = 2;
3216 break;
3220 if (FDCS->reset)
3221 return -EIO;
3223 ret = raw_cmd_copyin(cmd, param, &my_raw_cmd);
3224 if (ret) {
3225 raw_cmd_free(&my_raw_cmd);
3226 return ret;
3229 raw_cmd = my_raw_cmd;
3230 cont = &raw_cmd_cont;
3231 ret = wait_til_done(floppy_start, true);
3232 debug_dcl(DP->flags, "calling disk change from raw_cmd ioctl\n");
3234 if (ret != -EINTR && FDCS->reset)
3235 ret = -EIO;
3237 DRS->track = NO_TRACK;
3239 ret2 = raw_cmd_copyout(cmd, param, my_raw_cmd);
3240 if (!ret)
3241 ret = ret2;
3242 raw_cmd_free(&my_raw_cmd);
3243 return ret;
3246 static int invalidate_drive(struct block_device *bdev)
3248 /* invalidate the buffer track to force a reread */
3249 set_bit((long)bdev->bd_disk->private_data, &fake_change);
3250 process_fd_request();
3251 check_disk_change(bdev);
3252 return 0;
3255 static int set_geometry(unsigned int cmd, struct floppy_struct *g,
3256 int drive, int type, struct block_device *bdev)
3258 int cnt;
3260 /* sanity checking for parameters. */
3261 if (g->sect <= 0 ||
3262 g->head <= 0 ||
3263 g->track <= 0 || g->track > UDP->tracks >> STRETCH(g) ||
3264 /* check if reserved bits are set */
3265 (g->stretch & ~(FD_STRETCH | FD_SWAPSIDES | FD_SECTBASEMASK)) != 0)
3266 return -EINVAL;
3267 if (type) {
3268 if (!capable(CAP_SYS_ADMIN))
3269 return -EPERM;
3270 mutex_lock(&open_lock);
3271 if (lock_fdc(drive, true)) {
3272 mutex_unlock(&open_lock);
3273 return -EINTR;
3275 floppy_type[type] = *g;
3276 floppy_type[type].name = "user format";
3277 for (cnt = type << 2; cnt < (type << 2) + 4; cnt++)
3278 floppy_sizes[cnt] = floppy_sizes[cnt + 0x80] =
3279 floppy_type[type].size + 1;
3280 process_fd_request();
3281 for (cnt = 0; cnt < N_DRIVE; cnt++) {
3282 struct block_device *bdev = opened_bdev[cnt];
3283 if (!bdev || ITYPE(drive_state[cnt].fd_device) != type)
3284 continue;
3285 __invalidate_device(bdev, true);
3287 mutex_unlock(&open_lock);
3288 } else {
3289 int oldStretch;
3291 if (lock_fdc(drive, true))
3292 return -EINTR;
3293 if (cmd != FDDEFPRM) {
3294 /* notice a disk change immediately, else
3295 * we lose our settings immediately*/
3296 if (poll_drive(true, FD_RAW_NEED_DISK) == -EINTR)
3297 return -EINTR;
3299 oldStretch = g->stretch;
3300 user_params[drive] = *g;
3301 if (buffer_drive == drive)
3302 SUPBOUND(buffer_max, user_params[drive].sect);
3303 current_type[drive] = &user_params[drive];
3304 floppy_sizes[drive] = user_params[drive].size;
3305 if (cmd == FDDEFPRM)
3306 DRS->keep_data = -1;
3307 else
3308 DRS->keep_data = 1;
3309 /* invalidation. Invalidate only when needed, i.e.
3310 * when there are already sectors in the buffer cache
3311 * whose number will change. This is useful, because
3312 * mtools often changes the geometry of the disk after
3313 * looking at the boot block */
3314 if (DRS->maxblock > user_params[drive].sect ||
3315 DRS->maxtrack ||
3316 ((user_params[drive].sect ^ oldStretch) &
3317 (FD_SWAPSIDES | FD_SECTBASEMASK)))
3318 invalidate_drive(bdev);
3319 else
3320 process_fd_request();
3322 return 0;
3325 /* handle obsolete ioctl's */
3326 static unsigned int ioctl_table[] = {
3327 FDCLRPRM,
3328 FDSETPRM,
3329 FDDEFPRM,
3330 FDGETPRM,
3331 FDMSGON,
3332 FDMSGOFF,
3333 FDFMTBEG,
3334 FDFMTTRK,
3335 FDFMTEND,
3336 FDSETEMSGTRESH,
3337 FDFLUSH,
3338 FDSETMAXERRS,
3339 FDGETMAXERRS,
3340 FDGETDRVTYP,
3341 FDSETDRVPRM,
3342 FDGETDRVPRM,
3343 FDGETDRVSTAT,
3344 FDPOLLDRVSTAT,
3345 FDRESET,
3346 FDGETFDCSTAT,
3347 FDWERRORCLR,
3348 FDWERRORGET,
3349 FDRAWCMD,
3350 FDEJECT,
3351 FDTWADDLE
3354 static int normalize_ioctl(unsigned int *cmd, int *size)
3356 int i;
3358 for (i = 0; i < ARRAY_SIZE(ioctl_table); i++) {
3359 if ((*cmd & 0xffff) == (ioctl_table[i] & 0xffff)) {
3360 *size = _IOC_SIZE(*cmd);
3361 *cmd = ioctl_table[i];
3362 if (*size > _IOC_SIZE(*cmd)) {
3363 pr_info("ioctl not yet supported\n");
3364 return -EFAULT;
3366 return 0;
3369 return -EINVAL;
3372 static int get_floppy_geometry(int drive, int type, struct floppy_struct **g)
3374 if (type)
3375 *g = &floppy_type[type];
3376 else {
3377 if (lock_fdc(drive, false))
3378 return -EINTR;
3379 if (poll_drive(false, 0) == -EINTR)
3380 return -EINTR;
3381 process_fd_request();
3382 *g = current_type[drive];
3384 if (!*g)
3385 return -ENODEV;
3386 return 0;
3389 static int fd_getgeo(struct block_device *bdev, struct hd_geometry *geo)
3391 int drive = (long)bdev->bd_disk->private_data;
3392 int type = ITYPE(drive_state[drive].fd_device);
3393 struct floppy_struct *g;
3394 int ret;
3396 ret = get_floppy_geometry(drive, type, &g);
3397 if (ret)
3398 return ret;
3400 geo->heads = g->head;
3401 geo->sectors = g->sect;
3402 geo->cylinders = g->track;
3403 return 0;
3406 static int fd_locked_ioctl(struct block_device *bdev, fmode_t mode, unsigned int cmd,
3407 unsigned long param)
3409 int drive = (long)bdev->bd_disk->private_data;
3410 int type = ITYPE(UDRS->fd_device);
3411 int i;
3412 int ret;
3413 int size;
3414 union inparam {
3415 struct floppy_struct g; /* geometry */
3416 struct format_descr f;
3417 struct floppy_max_errors max_errors;
3418 struct floppy_drive_params dp;
3419 } inparam; /* parameters coming from user space */
3420 const void *outparam; /* parameters passed back to user space */
3422 /* convert compatibility eject ioctls into floppy eject ioctl.
3423 * We do this in order to provide a means to eject floppy disks before
3424 * installing the new fdutils package */
3425 if (cmd == CDROMEJECT || /* CD-ROM eject */
3426 cmd == 0x6470) { /* SunOS floppy eject */
3427 DPRINT("obsolete eject ioctl\n");
3428 DPRINT("please use floppycontrol --eject\n");
3429 cmd = FDEJECT;
3432 if (!((cmd & 0xff00) == 0x0200))
3433 return -EINVAL;
3435 /* convert the old style command into a new style command */
3436 ret = normalize_ioctl(&cmd, &size);
3437 if (ret)
3438 return ret;
3440 /* permission checks */
3441 if (((cmd & 0x40) && !(mode & (FMODE_WRITE | FMODE_WRITE_IOCTL))) ||
3442 ((cmd & 0x80) && !capable(CAP_SYS_ADMIN)))
3443 return -EPERM;
3445 if (WARN_ON(size < 0 || size > sizeof(inparam)))
3446 return -EINVAL;
3448 /* copyin */
3449 memset(&inparam, 0, sizeof(inparam));
3450 if (_IOC_DIR(cmd) & _IOC_WRITE) {
3451 ret = fd_copyin((void __user *)param, &inparam, size);
3452 if (ret)
3453 return ret;
3456 switch (cmd) {
3457 case FDEJECT:
3458 if (UDRS->fd_ref != 1)
3459 /* somebody else has this drive open */
3460 return -EBUSY;
3461 if (lock_fdc(drive, true))
3462 return -EINTR;
3464 /* do the actual eject. Fails on
3465 * non-Sparc architectures */
3466 ret = fd_eject(UNIT(drive));
3468 set_bit(FD_DISK_CHANGED_BIT, &UDRS->flags);
3469 set_bit(FD_VERIFY_BIT, &UDRS->flags);
3470 process_fd_request();
3471 return ret;
3472 case FDCLRPRM:
3473 if (lock_fdc(drive, true))
3474 return -EINTR;
3475 current_type[drive] = NULL;
3476 floppy_sizes[drive] = MAX_DISK_SIZE << 1;
3477 UDRS->keep_data = 0;
3478 return invalidate_drive(bdev);
3479 case FDSETPRM:
3480 case FDDEFPRM:
3481 return set_geometry(cmd, &inparam.g, drive, type, bdev);
3482 case FDGETPRM:
3483 ret = get_floppy_geometry(drive, type,
3484 (struct floppy_struct **)&outparam);
3485 if (ret)
3486 return ret;
3487 break;
3488 case FDMSGON:
3489 UDP->flags |= FTD_MSG;
3490 return 0;
3491 case FDMSGOFF:
3492 UDP->flags &= ~FTD_MSG;
3493 return 0;
3494 case FDFMTBEG:
3495 if (lock_fdc(drive, true))
3496 return -EINTR;
3497 if (poll_drive(true, FD_RAW_NEED_DISK) == -EINTR)
3498 return -EINTR;
3499 ret = UDRS->flags;
3500 process_fd_request();
3501 if (ret & FD_VERIFY)
3502 return -ENODEV;
3503 if (!(ret & FD_DISK_WRITABLE))
3504 return -EROFS;
3505 return 0;
3506 case FDFMTTRK:
3507 if (UDRS->fd_ref != 1)
3508 return -EBUSY;
3509 return do_format(drive, &inparam.f);
3510 case FDFMTEND:
3511 case FDFLUSH:
3512 if (lock_fdc(drive, true))
3513 return -EINTR;
3514 return invalidate_drive(bdev);
3515 case FDSETEMSGTRESH:
3516 UDP->max_errors.reporting = (unsigned short)(param & 0x0f);
3517 return 0;
3518 case FDGETMAXERRS:
3519 outparam = &UDP->max_errors;
3520 break;
3521 case FDSETMAXERRS:
3522 UDP->max_errors = inparam.max_errors;
3523 break;
3524 case FDGETDRVTYP:
3525 outparam = drive_name(type, drive);
3526 SUPBOUND(size, strlen((const char *)outparam) + 1);
3527 break;
3528 case FDSETDRVPRM:
3529 *UDP = inparam.dp;
3530 break;
3531 case FDGETDRVPRM:
3532 outparam = UDP;
3533 break;
3534 case FDPOLLDRVSTAT:
3535 if (lock_fdc(drive, true))
3536 return -EINTR;
3537 if (poll_drive(true, FD_RAW_NEED_DISK) == -EINTR)
3538 return -EINTR;
3539 process_fd_request();
3540 /* fall through */
3541 case FDGETDRVSTAT:
3542 outparam = UDRS;
3543 break;
3544 case FDRESET:
3545 return user_reset_fdc(drive, (int)param, true);
3546 case FDGETFDCSTAT:
3547 outparam = UFDCS;
3548 break;
3549 case FDWERRORCLR:
3550 memset(UDRWE, 0, sizeof(*UDRWE));
3551 return 0;
3552 case FDWERRORGET:
3553 outparam = UDRWE;
3554 break;
3555 case FDRAWCMD:
3556 if (type)
3557 return -EINVAL;
3558 if (lock_fdc(drive, true))
3559 return -EINTR;
3560 set_floppy(drive);
3561 i = raw_cmd_ioctl(cmd, (void __user *)param);
3562 if (i == -EINTR)
3563 return -EINTR;
3564 process_fd_request();
3565 return i;
3566 case FDTWADDLE:
3567 if (lock_fdc(drive, true))
3568 return -EINTR;
3569 twaddle();
3570 process_fd_request();
3571 return 0;
3572 default:
3573 return -EINVAL;
3576 if (_IOC_DIR(cmd) & _IOC_READ)
3577 return fd_copyout((void __user *)param, outparam, size);
3579 return 0;
3582 static int fd_ioctl(struct block_device *bdev, fmode_t mode,
3583 unsigned int cmd, unsigned long param)
3585 int ret;
3587 mutex_lock(&floppy_mutex);
3588 ret = fd_locked_ioctl(bdev, mode, cmd, param);
3589 mutex_unlock(&floppy_mutex);
3591 return ret;
3594 static void __init config_types(void)
3596 bool has_drive = false;
3597 int drive;
3599 /* read drive info out of physical CMOS */
3600 drive = 0;
3601 if (!UDP->cmos)
3602 UDP->cmos = FLOPPY0_TYPE;
3603 drive = 1;
3604 if (!UDP->cmos && FLOPPY1_TYPE)
3605 UDP->cmos = FLOPPY1_TYPE;
3607 /* FIXME: additional physical CMOS drive detection should go here */
3609 for (drive = 0; drive < N_DRIVE; drive++) {
3610 unsigned int type = UDP->cmos;
3611 struct floppy_drive_params *params;
3612 const char *name = NULL;
3613 static char temparea[32];
3615 if (type < ARRAY_SIZE(default_drive_params)) {
3616 params = &default_drive_params[type].params;
3617 if (type) {
3618 name = default_drive_params[type].name;
3619 allowed_drive_mask |= 1 << drive;
3620 } else
3621 allowed_drive_mask &= ~(1 << drive);
3622 } else {
3623 params = &default_drive_params[0].params;
3624 sprintf(temparea, "unknown type %d (usb?)", type);
3625 name = temparea;
3627 if (name) {
3628 const char *prepend;
3629 if (!has_drive) {
3630 prepend = "";
3631 has_drive = true;
3632 pr_info("Floppy drive(s):");
3633 } else {
3634 prepend = ",";
3637 pr_cont("%s fd%d is %s", prepend, drive, name);
3639 *UDP = *params;
3642 if (has_drive)
3643 pr_cont("\n");
3646 static int floppy_release(struct gendisk *disk, fmode_t mode)
3648 int drive = (long)disk->private_data;
3650 mutex_lock(&floppy_mutex);
3651 mutex_lock(&open_lock);
3652 if (UDRS->fd_ref < 0)
3653 UDRS->fd_ref = 0;
3654 else if (!UDRS->fd_ref--) {
3655 DPRINT("floppy_release with fd_ref == 0");
3656 UDRS->fd_ref = 0;
3658 if (!UDRS->fd_ref)
3659 opened_bdev[drive] = NULL;
3660 mutex_unlock(&open_lock);
3661 mutex_unlock(&floppy_mutex);
3663 return 0;
3667 * floppy_open check for aliasing (/dev/fd0 can be the same as
3668 * /dev/PS0 etc), and disallows simultaneous access to the same
3669 * drive with different device numbers.
3671 static int floppy_open(struct block_device *bdev, fmode_t mode)
3673 int drive = (long)bdev->bd_disk->private_data;
3674 int old_dev, new_dev;
3675 int try;
3676 int res = -EBUSY;
3677 char *tmp;
3679 mutex_lock(&floppy_mutex);
3680 mutex_lock(&open_lock);
3681 old_dev = UDRS->fd_device;
3682 if (opened_bdev[drive] && opened_bdev[drive] != bdev)
3683 goto out2;
3685 if (!UDRS->fd_ref && (UDP->flags & FD_BROKEN_DCL)) {
3686 set_bit(FD_DISK_CHANGED_BIT, &UDRS->flags);
3687 set_bit(FD_VERIFY_BIT, &UDRS->flags);
3690 if (UDRS->fd_ref == -1 || (UDRS->fd_ref && (mode & FMODE_EXCL)))
3691 goto out2;
3693 if (mode & FMODE_EXCL)
3694 UDRS->fd_ref = -1;
3695 else
3696 UDRS->fd_ref++;
3698 opened_bdev[drive] = bdev;
3700 res = -ENXIO;
3702 if (!floppy_track_buffer) {
3703 /* if opening an ED drive, reserve a big buffer,
3704 * else reserve a small one */
3705 if ((UDP->cmos == 6) || (UDP->cmos == 5))
3706 try = 64; /* Only 48 actually useful */
3707 else
3708 try = 32; /* Only 24 actually useful */
3710 tmp = (char *)fd_dma_mem_alloc(1024 * try);
3711 if (!tmp && !floppy_track_buffer) {
3712 try >>= 1; /* buffer only one side */
3713 INFBOUND(try, 16);
3714 tmp = (char *)fd_dma_mem_alloc(1024 * try);
3716 if (!tmp && !floppy_track_buffer)
3717 fallback_on_nodma_alloc(&tmp, 2048 * try);
3718 if (!tmp && !floppy_track_buffer) {
3719 DPRINT("Unable to allocate DMA memory\n");
3720 goto out;
3722 if (floppy_track_buffer) {
3723 if (tmp)
3724 fd_dma_mem_free((unsigned long)tmp, try * 1024);
3725 } else {
3726 buffer_min = buffer_max = -1;
3727 floppy_track_buffer = tmp;
3728 max_buffer_sectors = try;
3732 new_dev = MINOR(bdev->bd_dev);
3733 UDRS->fd_device = new_dev;
3734 set_capacity(disks[drive], floppy_sizes[new_dev]);
3735 if (old_dev != -1 && old_dev != new_dev) {
3736 if (buffer_drive == drive)
3737 buffer_track = -1;
3740 if (UFDCS->rawcmd == 1)
3741 UFDCS->rawcmd = 2;
3743 if (!(mode & FMODE_NDELAY)) {
3744 if (mode & (FMODE_READ|FMODE_WRITE)) {
3745 UDRS->last_checked = 0;
3746 check_disk_change(bdev);
3747 if (test_bit(FD_DISK_CHANGED_BIT, &UDRS->flags))
3748 goto out;
3750 res = -EROFS;
3751 if ((mode & FMODE_WRITE) &&
3752 !test_bit(FD_DISK_WRITABLE_BIT, &UDRS->flags))
3753 goto out;
3755 mutex_unlock(&open_lock);
3756 mutex_unlock(&floppy_mutex);
3757 return 0;
3758 out:
3759 if (UDRS->fd_ref < 0)
3760 UDRS->fd_ref = 0;
3761 else
3762 UDRS->fd_ref--;
3763 if (!UDRS->fd_ref)
3764 opened_bdev[drive] = NULL;
3765 out2:
3766 mutex_unlock(&open_lock);
3767 mutex_unlock(&floppy_mutex);
3768 return res;
3772 * Check if the disk has been changed or if a change has been faked.
3774 static int check_floppy_change(struct gendisk *disk)
3776 int drive = (long)disk->private_data;
3778 if (test_bit(FD_DISK_CHANGED_BIT, &UDRS->flags) ||
3779 test_bit(FD_VERIFY_BIT, &UDRS->flags))
3780 return 1;
3782 if (time_after(jiffies, UDRS->last_checked + UDP->checkfreq)) {
3783 lock_fdc(drive, false);
3784 poll_drive(false, 0);
3785 process_fd_request();
3788 if (test_bit(FD_DISK_CHANGED_BIT, &UDRS->flags) ||
3789 test_bit(FD_VERIFY_BIT, &UDRS->flags) ||
3790 test_bit(drive, &fake_change) ||
3791 drive_no_geom(drive))
3792 return 1;
3793 return 0;
3797 * This implements "read block 0" for floppy_revalidate().
3798 * Needed for format autodetection, checking whether there is
3799 * a disk in the drive, and whether that disk is writable.
3802 static void floppy_rb0_complete(struct bio *bio, int err)
3804 complete((struct completion *)bio->bi_private);
3807 static int __floppy_read_block_0(struct block_device *bdev)
3809 struct bio bio;
3810 struct bio_vec bio_vec;
3811 struct completion complete;
3812 struct page *page;
3813 size_t size;
3815 page = alloc_page(GFP_NOIO);
3816 if (!page) {
3817 process_fd_request();
3818 return -ENOMEM;
3821 size = bdev->bd_block_size;
3822 if (!size)
3823 size = 1024;
3825 bio_init(&bio);
3826 bio.bi_io_vec = &bio_vec;
3827 bio_vec.bv_page = page;
3828 bio_vec.bv_len = size;
3829 bio_vec.bv_offset = 0;
3830 bio.bi_vcnt = 1;
3831 bio.bi_idx = 0;
3832 bio.bi_size = size;
3833 bio.bi_bdev = bdev;
3834 bio.bi_sector = 0;
3835 bio.bi_flags = BIO_QUIET;
3836 init_completion(&complete);
3837 bio.bi_private = &complete;
3838 bio.bi_end_io = floppy_rb0_complete;
3840 submit_bio(READ, &bio);
3841 generic_unplug_device(bdev_get_queue(bdev));
3842 process_fd_request();
3843 wait_for_completion(&complete);
3845 __free_page(page);
3847 return 0;
3850 /* revalidate the floppy disk, i.e. trigger format autodetection by reading
3851 * the bootblock (block 0). "Autodetection" is also needed to check whether
3852 * there is a disk in the drive at all... Thus we also do it for fixed
3853 * geometry formats */
3854 static int floppy_revalidate(struct gendisk *disk)
3856 int drive = (long)disk->private_data;
3857 int cf;
3858 int res = 0;
3860 if (test_bit(FD_DISK_CHANGED_BIT, &UDRS->flags) ||
3861 test_bit(FD_VERIFY_BIT, &UDRS->flags) ||
3862 test_bit(drive, &fake_change) ||
3863 drive_no_geom(drive)) {
3864 if (WARN(atomic_read(&usage_count) == 0,
3865 "VFS: revalidate called on non-open device.\n"))
3866 return -EFAULT;
3868 lock_fdc(drive, false);
3869 cf = (test_bit(FD_DISK_CHANGED_BIT, &UDRS->flags) ||
3870 test_bit(FD_VERIFY_BIT, &UDRS->flags));
3871 if (!(cf || test_bit(drive, &fake_change) || drive_no_geom(drive))) {
3872 process_fd_request(); /*already done by another thread */
3873 return 0;
3875 UDRS->maxblock = 0;
3876 UDRS->maxtrack = 0;
3877 if (buffer_drive == drive)
3878 buffer_track = -1;
3879 clear_bit(drive, &fake_change);
3880 clear_bit(FD_DISK_CHANGED_BIT, &UDRS->flags);
3881 if (cf)
3882 UDRS->generation++;
3883 if (drive_no_geom(drive)) {
3884 /* auto-sensing */
3885 res = __floppy_read_block_0(opened_bdev[drive]);
3886 } else {
3887 if (cf)
3888 poll_drive(false, FD_RAW_NEED_DISK);
3889 process_fd_request();
3892 set_capacity(disk, floppy_sizes[UDRS->fd_device]);
3893 return res;
3896 static const struct block_device_operations floppy_fops = {
3897 .owner = THIS_MODULE,
3898 .open = floppy_open,
3899 .release = floppy_release,
3900 .ioctl = fd_ioctl,
3901 .getgeo = fd_getgeo,
3902 .media_changed = check_floppy_change,
3903 .revalidate_disk = floppy_revalidate,
3907 * Floppy Driver initialization
3908 * =============================
3911 /* Determine the floppy disk controller type */
3912 /* This routine was written by David C. Niemi */
3913 static char __init get_fdc_version(void)
3915 int r;
3917 output_byte(FD_DUMPREGS); /* 82072 and better know DUMPREGS */
3918 if (FDCS->reset)
3919 return FDC_NONE;
3920 r = result();
3921 if (r <= 0x00)
3922 return FDC_NONE; /* No FDC present ??? */
3923 if ((r == 1) && (reply_buffer[0] == 0x80)) {
3924 pr_info("FDC %d is an 8272A\n", fdc);
3925 return FDC_8272A; /* 8272a/765 don't know DUMPREGS */
3927 if (r != 10) {
3928 pr_info("FDC %d init: DUMPREGS: unexpected return of %d bytes.\n",
3929 fdc, r);
3930 return FDC_UNKNOWN;
3933 if (!fdc_configure()) {
3934 pr_info("FDC %d is an 82072\n", fdc);
3935 return FDC_82072; /* 82072 doesn't know CONFIGURE */
3938 output_byte(FD_PERPENDICULAR);
3939 if (need_more_output() == MORE_OUTPUT) {
3940 output_byte(0);
3941 } else {
3942 pr_info("FDC %d is an 82072A\n", fdc);
3943 return FDC_82072A; /* 82072A as found on Sparcs. */
3946 output_byte(FD_UNLOCK);
3947 r = result();
3948 if ((r == 1) && (reply_buffer[0] == 0x80)) {
3949 pr_info("FDC %d is a pre-1991 82077\n", fdc);
3950 return FDC_82077_ORIG; /* Pre-1991 82077, doesn't know
3951 * LOCK/UNLOCK */
3953 if ((r != 1) || (reply_buffer[0] != 0x00)) {
3954 pr_info("FDC %d init: UNLOCK: unexpected return of %d bytes.\n",
3955 fdc, r);
3956 return FDC_UNKNOWN;
3958 output_byte(FD_PARTID);
3959 r = result();
3960 if (r != 1) {
3961 pr_info("FDC %d init: PARTID: unexpected return of %d bytes.\n",
3962 fdc, r);
3963 return FDC_UNKNOWN;
3965 if (reply_buffer[0] == 0x80) {
3966 pr_info("FDC %d is a post-1991 82077\n", fdc);
3967 return FDC_82077; /* Revised 82077AA passes all the tests */
3969 switch (reply_buffer[0] >> 5) {
3970 case 0x0:
3971 /* Either a 82078-1 or a 82078SL running at 5Volt */
3972 pr_info("FDC %d is an 82078.\n", fdc);
3973 return FDC_82078;
3974 case 0x1:
3975 pr_info("FDC %d is a 44pin 82078\n", fdc);
3976 return FDC_82078;
3977 case 0x2:
3978 pr_info("FDC %d is a S82078B\n", fdc);
3979 return FDC_S82078B;
3980 case 0x3:
3981 pr_info("FDC %d is a National Semiconductor PC87306\n", fdc);
3982 return FDC_87306;
3983 default:
3984 pr_info("FDC %d init: 82078 variant with unknown PARTID=%d.\n",
3985 fdc, reply_buffer[0] >> 5);
3986 return FDC_82078_UNKN;
3988 } /* get_fdc_version */
3990 /* lilo configuration */
3992 static void __init floppy_set_flags(int *ints, int param, int param2)
3994 int i;
3996 for (i = 0; i < ARRAY_SIZE(default_drive_params); i++) {
3997 if (param)
3998 default_drive_params[i].params.flags |= param2;
3999 else
4000 default_drive_params[i].params.flags &= ~param2;
4002 DPRINT("%s flag 0x%x\n", param2 ? "Setting" : "Clearing", param);
4005 static void __init daring(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.select_delay = 0;
4012 default_drive_params[i].params.flags |=
4013 FD_SILENT_DCL_CLEAR;
4014 } else {
4015 default_drive_params[i].params.select_delay =
4016 2 * HZ / 100;
4017 default_drive_params[i].params.flags &=
4018 ~FD_SILENT_DCL_CLEAR;
4021 DPRINT("Assuming %s floppy hardware\n", param ? "standard" : "broken");
4024 static void __init set_cmos(int *ints, int dummy, int dummy2)
4026 int current_drive = 0;
4028 if (ints[0] != 2) {
4029 DPRINT("wrong number of parameters for CMOS\n");
4030 return;
4032 current_drive = ints[1];
4033 if (current_drive < 0 || current_drive >= 8) {
4034 DPRINT("bad drive for set_cmos\n");
4035 return;
4037 #if N_FDC > 1
4038 if (current_drive >= 4 && !FDC2)
4039 FDC2 = 0x370;
4040 #endif
4041 DP->cmos = ints[2];
4042 DPRINT("setting CMOS code to %d\n", ints[2]);
4045 static struct param_table {
4046 const char *name;
4047 void (*fn) (int *ints, int param, int param2);
4048 int *var;
4049 int def_param;
4050 int param2;
4051 } config_params[] __initdata = {
4052 {"allowed_drive_mask", NULL, &allowed_drive_mask, 0xff, 0}, /* obsolete */
4053 {"all_drives", NULL, &allowed_drive_mask, 0xff, 0}, /* obsolete */
4054 {"asus_pci", NULL, &allowed_drive_mask, 0x33, 0},
4055 {"irq", NULL, &FLOPPY_IRQ, 6, 0},
4056 {"dma", NULL, &FLOPPY_DMA, 2, 0},
4057 {"daring", daring, NULL, 1, 0},
4058 #if N_FDC > 1
4059 {"two_fdc", NULL, &FDC2, 0x370, 0},
4060 {"one_fdc", NULL, &FDC2, 0, 0},
4061 #endif
4062 {"thinkpad", floppy_set_flags, NULL, 1, FD_INVERTED_DCL},
4063 {"broken_dcl", floppy_set_flags, NULL, 1, FD_BROKEN_DCL},
4064 {"messages", floppy_set_flags, NULL, 1, FTD_MSG},
4065 {"silent_dcl_clear", floppy_set_flags, NULL, 1, FD_SILENT_DCL_CLEAR},
4066 {"debug", floppy_set_flags, NULL, 1, FD_DEBUG},
4067 {"nodma", NULL, &can_use_virtual_dma, 1, 0},
4068 {"omnibook", NULL, &can_use_virtual_dma, 1, 0},
4069 {"yesdma", NULL, &can_use_virtual_dma, 0, 0},
4070 {"fifo_depth", NULL, &fifo_depth, 0xa, 0},
4071 {"nofifo", NULL, &no_fifo, 0x20, 0},
4072 {"usefifo", NULL, &no_fifo, 0, 0},
4073 {"cmos", set_cmos, NULL, 0, 0},
4074 {"slow", NULL, &slow_floppy, 1, 0},
4075 {"unexpected_interrupts", NULL, &print_unex, 1, 0},
4076 {"no_unexpected_interrupts", NULL, &print_unex, 0, 0},
4077 {"L40SX", NULL, &print_unex, 0, 0}
4079 EXTRA_FLOPPY_PARAMS
4082 static int __init floppy_setup(char *str)
4084 int i;
4085 int param;
4086 int ints[11];
4088 str = get_options(str, ARRAY_SIZE(ints), ints);
4089 if (str) {
4090 for (i = 0; i < ARRAY_SIZE(config_params); i++) {
4091 if (strcmp(str, config_params[i].name) == 0) {
4092 if (ints[0])
4093 param = ints[1];
4094 else
4095 param = config_params[i].def_param;
4096 if (config_params[i].fn)
4097 config_params[i].fn(ints, param,
4098 config_params[i].
4099 param2);
4100 if (config_params[i].var) {
4101 DPRINT("%s=%d\n", str, param);
4102 *config_params[i].var = param;
4104 return 1;
4108 if (str) {
4109 DPRINT("unknown floppy option [%s]\n", str);
4111 DPRINT("allowed options are:");
4112 for (i = 0; i < ARRAY_SIZE(config_params); i++)
4113 pr_cont(" %s", config_params[i].name);
4114 pr_cont("\n");
4115 } else
4116 DPRINT("botched floppy option\n");
4117 DPRINT("Read Documentation/blockdev/floppy.txt\n");
4118 return 0;
4121 static int have_no_fdc = -ENODEV;
4123 static ssize_t floppy_cmos_show(struct device *dev,
4124 struct device_attribute *attr, char *buf)
4126 struct platform_device *p = to_platform_device(dev);
4127 int drive;
4129 drive = p->id;
4130 return sprintf(buf, "%X\n", UDP->cmos);
4133 static DEVICE_ATTR(cmos, S_IRUGO, floppy_cmos_show, NULL);
4135 static void floppy_device_release(struct device *dev)
4139 static int floppy_resume(struct device *dev)
4141 int fdc;
4143 for (fdc = 0; fdc < N_FDC; fdc++)
4144 if (FDCS->address != -1)
4145 user_reset_fdc(-1, FD_RESET_ALWAYS, false);
4147 return 0;
4150 static const struct dev_pm_ops floppy_pm_ops = {
4151 .resume = floppy_resume,
4152 .restore = floppy_resume,
4155 static struct platform_driver floppy_driver = {
4156 .driver = {
4157 .name = "floppy",
4158 .pm = &floppy_pm_ops,
4162 static struct platform_device floppy_device[N_DRIVE];
4164 static struct kobject *floppy_find(dev_t dev, int *part, void *data)
4166 int drive = (*part & 3) | ((*part & 0x80) >> 5);
4167 if (drive >= N_DRIVE ||
4168 !(allowed_drive_mask & (1 << drive)) ||
4169 fdc_state[FDC(drive)].version == FDC_NONE)
4170 return NULL;
4171 if (((*part >> 2) & 0x1f) >= ARRAY_SIZE(floppy_type))
4172 return NULL;
4173 *part = 0;
4174 return get_disk(disks[drive]);
4177 static int __init floppy_init(void)
4179 int i, unit, drive;
4180 int err, dr;
4182 set_debugt();
4183 interruptjiffies = resultjiffies = jiffies;
4185 #if defined(CONFIG_PPC)
4186 if (check_legacy_ioport(FDC1))
4187 return -ENODEV;
4188 #endif
4190 raw_cmd = NULL;
4192 for (dr = 0; dr < N_DRIVE; dr++) {
4193 disks[dr] = alloc_disk(1);
4194 if (!disks[dr]) {
4195 err = -ENOMEM;
4196 goto out_put_disk;
4199 disks[dr]->queue = blk_init_queue(do_fd_request, &floppy_lock);
4200 if (!disks[dr]->queue) {
4201 err = -ENOMEM;
4202 goto out_put_disk;
4205 blk_queue_max_hw_sectors(disks[dr]->queue, 64);
4206 disks[dr]->major = FLOPPY_MAJOR;
4207 disks[dr]->first_minor = TOMINOR(dr);
4208 disks[dr]->fops = &floppy_fops;
4209 sprintf(disks[dr]->disk_name, "fd%d", dr);
4211 init_timer(&motor_off_timer[dr]);
4212 motor_off_timer[dr].data = dr;
4213 motor_off_timer[dr].function = motor_off_callback;
4216 err = register_blkdev(FLOPPY_MAJOR, "fd");
4217 if (err)
4218 goto out_put_disk;
4220 err = platform_driver_register(&floppy_driver);
4221 if (err)
4222 goto out_unreg_blkdev;
4224 blk_register_region(MKDEV(FLOPPY_MAJOR, 0), 256, THIS_MODULE,
4225 floppy_find, NULL, NULL);
4227 for (i = 0; i < 256; i++)
4228 if (ITYPE(i))
4229 floppy_sizes[i] = floppy_type[ITYPE(i)].size;
4230 else
4231 floppy_sizes[i] = MAX_DISK_SIZE << 1;
4233 reschedule_timeout(MAXTIMEOUT, "floppy init");
4234 config_types();
4236 for (i = 0; i < N_FDC; i++) {
4237 fdc = i;
4238 memset(FDCS, 0, sizeof(*FDCS));
4239 FDCS->dtr = -1;
4240 FDCS->dor = 0x4;
4241 #if defined(__sparc__) || defined(__mc68000__)
4242 /*sparcs/sun3x don't have a DOR reset which we can fall back on to */
4243 #ifdef __mc68000__
4244 if (MACH_IS_SUN3X)
4245 #endif
4246 FDCS->version = FDC_82072A;
4247 #endif
4250 use_virtual_dma = can_use_virtual_dma & 1;
4251 fdc_state[0].address = FDC1;
4252 if (fdc_state[0].address == -1) {
4253 del_timer(&fd_timeout);
4254 err = -ENODEV;
4255 goto out_unreg_region;
4257 #if N_FDC > 1
4258 fdc_state[1].address = FDC2;
4259 #endif
4261 fdc = 0; /* reset fdc in case of unexpected interrupt */
4262 err = floppy_grab_irq_and_dma();
4263 if (err) {
4264 del_timer(&fd_timeout);
4265 err = -EBUSY;
4266 goto out_unreg_region;
4269 /* initialise drive state */
4270 for (drive = 0; drive < N_DRIVE; drive++) {
4271 memset(UDRS, 0, sizeof(*UDRS));
4272 memset(UDRWE, 0, sizeof(*UDRWE));
4273 set_bit(FD_DISK_NEWCHANGE_BIT, &UDRS->flags);
4274 set_bit(FD_DISK_CHANGED_BIT, &UDRS->flags);
4275 set_bit(FD_VERIFY_BIT, &UDRS->flags);
4276 UDRS->fd_device = -1;
4277 floppy_track_buffer = NULL;
4278 max_buffer_sectors = 0;
4281 * Small 10 msec delay to let through any interrupt that
4282 * initialization might have triggered, to not
4283 * confuse detection:
4285 msleep(10);
4287 for (i = 0; i < N_FDC; i++) {
4288 fdc = i;
4289 FDCS->driver_version = FD_DRIVER_VERSION;
4290 for (unit = 0; unit < 4; unit++)
4291 FDCS->track[unit] = 0;
4292 if (FDCS->address == -1)
4293 continue;
4294 FDCS->rawcmd = 2;
4295 if (user_reset_fdc(-1, FD_RESET_ALWAYS, false)) {
4296 /* free ioports reserved by floppy_grab_irq_and_dma() */
4297 floppy_release_regions(fdc);
4298 FDCS->address = -1;
4299 FDCS->version = FDC_NONE;
4300 continue;
4302 /* Try to determine the floppy controller type */
4303 FDCS->version = get_fdc_version();
4304 if (FDCS->version == FDC_NONE) {
4305 /* free ioports reserved by floppy_grab_irq_and_dma() */
4306 floppy_release_regions(fdc);
4307 FDCS->address = -1;
4308 continue;
4310 if (can_use_virtual_dma == 2 && FDCS->version < FDC_82072A)
4311 can_use_virtual_dma = 0;
4313 have_no_fdc = 0;
4314 /* Not all FDCs seem to be able to handle the version command
4315 * properly, so force a reset for the standard FDC clones,
4316 * to avoid interrupt garbage.
4318 user_reset_fdc(-1, FD_RESET_ALWAYS, false);
4320 fdc = 0;
4321 del_timer(&fd_timeout);
4322 current_drive = 0;
4323 initialized = true;
4324 if (have_no_fdc) {
4325 DPRINT("no floppy controllers found\n");
4326 err = have_no_fdc;
4327 goto out_flush_work;
4330 for (drive = 0; drive < N_DRIVE; drive++) {
4331 if (!(allowed_drive_mask & (1 << drive)))
4332 continue;
4333 if (fdc_state[FDC(drive)].version == FDC_NONE)
4334 continue;
4336 floppy_device[drive].name = floppy_device_name;
4337 floppy_device[drive].id = drive;
4338 floppy_device[drive].dev.release = floppy_device_release;
4340 err = platform_device_register(&floppy_device[drive]);
4341 if (err)
4342 goto out_flush_work;
4344 err = device_create_file(&floppy_device[drive].dev,
4345 &dev_attr_cmos);
4346 if (err)
4347 goto out_unreg_platform_dev;
4349 /* to be cleaned up... */
4350 disks[drive]->private_data = (void *)(long)drive;
4351 disks[drive]->flags |= GENHD_FL_REMOVABLE;
4352 disks[drive]->driverfs_dev = &floppy_device[drive].dev;
4353 add_disk(disks[drive]);
4356 return 0;
4358 out_unreg_platform_dev:
4359 platform_device_unregister(&floppy_device[drive]);
4360 out_flush_work:
4361 flush_work_sync(&floppy_work);
4362 if (atomic_read(&usage_count))
4363 floppy_release_irq_and_dma();
4364 out_unreg_region:
4365 blk_unregister_region(MKDEV(FLOPPY_MAJOR, 0), 256);
4366 platform_driver_unregister(&floppy_driver);
4367 out_unreg_blkdev:
4368 unregister_blkdev(FLOPPY_MAJOR, "fd");
4369 out_put_disk:
4370 while (dr--) {
4371 del_timer(&motor_off_timer[dr]);
4372 if (disks[dr]->queue)
4373 blk_cleanup_queue(disks[dr]->queue);
4374 put_disk(disks[dr]);
4376 return err;
4379 static const struct io_region {
4380 int offset;
4381 int size;
4382 } io_regions[] = {
4383 { 2, 1 },
4384 /* address + 3 is sometimes reserved by pnp bios for motherboard */
4385 { 4, 2 },
4386 /* address + 6 is reserved, and may be taken by IDE.
4387 * Unfortunately, Adaptec doesn't know this :-(, */
4388 { 7, 1 },
4391 static void floppy_release_allocated_regions(int fdc, const struct io_region *p)
4393 while (p != io_regions) {
4394 p--;
4395 release_region(FDCS->address + p->offset, p->size);
4399 #define ARRAY_END(X) (&((X)[ARRAY_SIZE(X)]))
4401 static int floppy_request_regions(int fdc)
4403 const struct io_region *p;
4405 for (p = io_regions; p < ARRAY_END(io_regions); p++) {
4406 if (!request_region(FDCS->address + p->offset,
4407 p->size, "floppy")) {
4408 DPRINT("Floppy io-port 0x%04lx in use\n",
4409 FDCS->address + p->offset);
4410 floppy_release_allocated_regions(fdc, p);
4411 return -EBUSY;
4414 return 0;
4417 static void floppy_release_regions(int fdc)
4419 floppy_release_allocated_regions(fdc, ARRAY_END(io_regions));
4422 static int floppy_grab_irq_and_dma(void)
4424 if (atomic_inc_return(&usage_count) > 1)
4425 return 0;
4428 * We might have scheduled a free_irq(), wait it to
4429 * drain first:
4431 flush_work_sync(&floppy_work);
4433 if (fd_request_irq()) {
4434 DPRINT("Unable to grab IRQ%d for the floppy driver\n",
4435 FLOPPY_IRQ);
4436 atomic_dec(&usage_count);
4437 return -1;
4439 if (fd_request_dma()) {
4440 DPRINT("Unable to grab DMA%d for the floppy driver\n",
4441 FLOPPY_DMA);
4442 if (can_use_virtual_dma & 2)
4443 use_virtual_dma = can_use_virtual_dma = 1;
4444 if (!(can_use_virtual_dma & 1)) {
4445 fd_free_irq();
4446 atomic_dec(&usage_count);
4447 return -1;
4451 for (fdc = 0; fdc < N_FDC; fdc++) {
4452 if (FDCS->address != -1) {
4453 if (floppy_request_regions(fdc))
4454 goto cleanup;
4457 for (fdc = 0; fdc < N_FDC; fdc++) {
4458 if (FDCS->address != -1) {
4459 reset_fdc_info(1);
4460 fd_outb(FDCS->dor, FD_DOR);
4463 fdc = 0;
4464 set_dor(0, ~0, 8); /* avoid immediate interrupt */
4466 for (fdc = 0; fdc < N_FDC; fdc++)
4467 if (FDCS->address != -1)
4468 fd_outb(FDCS->dor, FD_DOR);
4470 * The driver will try and free resources and relies on us
4471 * to know if they were allocated or not.
4473 fdc = 0;
4474 irqdma_allocated = 1;
4475 return 0;
4476 cleanup:
4477 fd_free_irq();
4478 fd_free_dma();
4479 while (--fdc >= 0)
4480 floppy_release_regions(fdc);
4481 atomic_dec(&usage_count);
4482 return -1;
4485 static void floppy_release_irq_and_dma(void)
4487 int old_fdc;
4488 #ifndef __sparc__
4489 int drive;
4490 #endif
4491 long tmpsize;
4492 unsigned long tmpaddr;
4494 if (!atomic_dec_and_test(&usage_count))
4495 return;
4497 if (irqdma_allocated) {
4498 fd_disable_dma();
4499 fd_free_dma();
4500 fd_free_irq();
4501 irqdma_allocated = 0;
4503 set_dor(0, ~0, 8);
4504 #if N_FDC > 1
4505 set_dor(1, ~8, 0);
4506 #endif
4507 floppy_enable_hlt();
4509 if (floppy_track_buffer && max_buffer_sectors) {
4510 tmpsize = max_buffer_sectors * 1024;
4511 tmpaddr = (unsigned long)floppy_track_buffer;
4512 floppy_track_buffer = NULL;
4513 max_buffer_sectors = 0;
4514 buffer_min = buffer_max = -1;
4515 fd_dma_mem_free(tmpaddr, tmpsize);
4517 #ifndef __sparc__
4518 for (drive = 0; drive < N_FDC * 4; drive++)
4519 if (timer_pending(motor_off_timer + drive))
4520 pr_info("motor off timer %d still active\n", drive);
4521 #endif
4523 if (timer_pending(&fd_timeout))
4524 pr_info("floppy timer still active:%s\n", timeout_message);
4525 if (timer_pending(&fd_timer))
4526 pr_info("auxiliary floppy timer still active\n");
4527 if (work_pending(&floppy_work))
4528 pr_info("work still pending\n");
4529 old_fdc = fdc;
4530 for (fdc = 0; fdc < N_FDC; fdc++)
4531 if (FDCS->address != -1)
4532 floppy_release_regions(fdc);
4533 fdc = old_fdc;
4536 #ifdef MODULE
4538 static char *floppy;
4540 static void __init parse_floppy_cfg_string(char *cfg)
4542 char *ptr;
4544 while (*cfg) {
4545 ptr = cfg;
4546 while (*cfg && *cfg != ' ' && *cfg != '\t')
4547 cfg++;
4548 if (*cfg) {
4549 *cfg = '\0';
4550 cfg++;
4552 if (*ptr)
4553 floppy_setup(ptr);
4557 static int __init floppy_module_init(void)
4559 if (floppy)
4560 parse_floppy_cfg_string(floppy);
4561 return floppy_init();
4563 module_init(floppy_module_init);
4565 static void __exit floppy_module_exit(void)
4567 int drive;
4569 blk_unregister_region(MKDEV(FLOPPY_MAJOR, 0), 256);
4570 unregister_blkdev(FLOPPY_MAJOR, "fd");
4571 platform_driver_unregister(&floppy_driver);
4573 for (drive = 0; drive < N_DRIVE; drive++) {
4574 del_timer_sync(&motor_off_timer[drive]);
4576 if ((allowed_drive_mask & (1 << drive)) &&
4577 fdc_state[FDC(drive)].version != FDC_NONE) {
4578 del_gendisk(disks[drive]);
4579 device_remove_file(&floppy_device[drive].dev, &dev_attr_cmos);
4580 platform_device_unregister(&floppy_device[drive]);
4582 blk_cleanup_queue(disks[drive]->queue);
4583 put_disk(disks[drive]);
4586 del_timer_sync(&fd_timeout);
4587 del_timer_sync(&fd_timer);
4589 if (atomic_read(&usage_count))
4590 floppy_release_irq_and_dma();
4592 /* eject disk, if any */
4593 fd_eject(0);
4596 module_exit(floppy_module_exit);
4598 module_param(floppy, charp, 0);
4599 module_param(FLOPPY_IRQ, int, 0);
4600 module_param(FLOPPY_DMA, int, 0);
4601 MODULE_AUTHOR("Alain L. Knaff");
4602 MODULE_SUPPORTED_DEVICE("fd");
4603 MODULE_LICENSE("GPL");
4605 /* This doesn't actually get used other than for module information */
4606 static const struct pnp_device_id floppy_pnpids[] = {
4607 {"PNP0700", 0},
4611 MODULE_DEVICE_TABLE(pnp, floppy_pnpids);
4613 #else
4615 __setup("floppy=", floppy_setup);
4616 module_init(floppy_init)
4617 #endif
4619 MODULE_ALIAS_BLOCKDEV_MAJOR(FLOPPY_MAJOR);