]> bbs.cooldavid.org Git - net-next-2.6.git/blame - drivers/block/floppy.c
drivers/block/floppy.c: add function is_ready_state
[net-next-2.6.git] / drivers / block / floppy.c
CommitLineData
1da177e4
LT
1/*
2 * linux/drivers/block/floppy.c
3 *
4 * Copyright (C) 1991, 1992 Linus Torvalds
5 * Copyright (C) 1993, 1994 Alain Knaff
6 * Copyright (C) 1998 Alan Cox
7 */
06f748c4 8
1da177e4
LT
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.
14 */
15
16/*
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.
22 */
23
24/*
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.
30 */
31
32/*
33 * 28.02.92 - made track-buffering routines, based on the routines written
34 * by entropy@wintermute.wpi.edu (Lawrence Foard). Linus.
35 */
36
37/*
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.
41 */
42
43/*
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.
47 *
48 * 1992/9/17: Added DMA allocation & DMA functions. -- hhb.
49 *
50 * TODO: Errors are still not counted properly.
51 */
52
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.
61 */
62
63/*
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.
67 */
68
69/* 1994/6/24 --bbroad-- added the floppy table entries and made
70 * minor modifications to allow 2.88 floppies to be run.
71 */
72
73/* 1994/7/13 -- Paul Vojta -- modified the probing code to allow three or more
74 * disk types.
75 */
76
77/*
78 * 1994/8/8 -- Alain Knaff -- Switched to fdpatch driver: Support for bigger
79 * format bug fixes, but unfortunately some new bugs too...
80 */
81
82/* 1994/9/17 -- Koen Holtman -- added logging of physical floppy write
83 * errors to allow safe writing by specialized programs.
84 */
85
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").
90 */
91
92/*
93 * 1995/8/26 -- Andreas Busse -- added Mips support.
94 */
95
96/*
97 * 1995/10/18 -- Ralf Baechle -- Portability cleanup; move machine dependent
98 * features to asm/floppy.h.
99 */
100
b88b0985
JN
101/*
102 * 1998/1/21 -- Richard Gooch <rgooch@atnf.csiro.au> -- devfs support
103 */
104
1da177e4
LT
105/*
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.
109 */
110
111/*
112 * 1998/06/07 -- Alan Cox -- Merged the 2.0.34 fixes for resource allocation
113 * failures.
114 */
115
116/*
117 * 1998/09/20 -- David Weinehall -- Added slow-down code for buggy PS/2-drives.
118 */
119
120/*
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).
124 */
125
126/*
127 * 2000/08/28 -- Arnaldo Carvalho de Melo <acme@conectiva.com.br>
128 * - get rid of check_region
129 * - s/suser/capable/
130 */
131
132/*
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.)
135 */
136
137/*
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.
141 */
142
143/* 2003/07/28 -- Daniele Bellucci <bellucda@tiscali.it>.
144 * Better audit of register_blkdev.
145 */
146
147#define FLOPPY_SANITY_CHECK
148#undef FLOPPY_SILENT_DCL_CLEAR
149
150#define REALLY_SLOW_IO
151
152#define DEBUGT 2
48c8cee6 153#define DCL_DEBUG /* debug disk change line */
1da177e4 154
87f530d8
JP
155#ifdef DCL_DEBUG
156#define debug_dcl(test, fmt, args...) \
157 do { if ((test) & FD_DEBUG) DPRINT(fmt, ##args); } while (0)
158#else
159#define debug_dcl(test, fmt, args...) \
160 do { if (0) DPRINT(fmt, ##args); } while (0)
161#endif
162
163
1da177e4
LT
164/* do print messages for unexpected interrupts */
165static int print_unex = 1;
166#include <linux/module.h>
167#include <linux/sched.h>
168#include <linux/fs.h>
169#include <linux/kernel.h>
170#include <linux/timer.h>
171#include <linux/workqueue.h>
172#define FDPATCHES
173#include <linux/fdreg.h>
1da177e4
LT
174#include <linux/fd.h>
175#include <linux/hdreg.h>
1da177e4
LT
176#include <linux/errno.h>
177#include <linux/slab.h>
178#include <linux/mm.h>
179#include <linux/bio.h>
180#include <linux/string.h>
50297cbf 181#include <linux/jiffies.h>
1da177e4
LT
182#include <linux/fcntl.h>
183#include <linux/delay.h>
184#include <linux/mc146818rtc.h> /* CMOS defines */
185#include <linux/ioport.h>
186#include <linux/interrupt.h>
187#include <linux/init.h>
d052d1be 188#include <linux/platform_device.h>
83f9ef46 189#include <linux/mod_devicetable.h>
1da177e4 190#include <linux/buffer_head.h> /* for invalidate_buffers() */
b1c82b5c 191#include <linux/mutex.h>
d4937543
JP
192#include <linux/io.h>
193#include <linux/uaccess.h>
1da177e4
LT
194
195/*
196 * PS/2 floppies have much slower step rates than regular floppies.
197 * It's been recommended that take about 1/4 of the default speed
198 * in some more extreme cases.
199 */
200static int slow_floppy;
201
202#include <asm/dma.h>
203#include <asm/irq.h>
204#include <asm/system.h>
1da177e4
LT
205
206static int FLOPPY_IRQ = 6;
207static int FLOPPY_DMA = 2;
208static int can_use_virtual_dma = 2;
209/* =======
210 * can use virtual DMA:
211 * 0 = use of virtual DMA disallowed by config
212 * 1 = use of virtual DMA prescribed by config
213 * 2 = no virtual DMA preference configured. By default try hard DMA,
214 * but fall back on virtual DMA when not enough memory available
215 */
216
217static int use_virtual_dma;
218/* =======
219 * use virtual DMA
220 * 0 using hard DMA
221 * 1 using virtual DMA
222 * This variable is set to virtual when a DMA mem problem arises, and
223 * reset back in floppy_grab_irq_and_dma.
224 * It is not safe to reset it in other circumstances, because the floppy
225 * driver may have several buffers in use at once, and we do currently not
226 * record each buffers capabilities
227 */
228
229static DEFINE_SPINLOCK(floppy_lock);
1da177e4
LT
230
231static unsigned short virtual_dma_port = 0x3f0;
7d12e780 232irqreturn_t floppy_interrupt(int irq, void *dev_id);
1da177e4 233static int set_dor(int fdc, char mask, char data);
1da177e4
LT
234
235#define K_64 0x10000 /* 64KB */
236
237/* the following is the mask of allowed drives. By default units 2 and
238 * 3 of both floppy controllers are disabled, because switching on the
239 * motor of these drives causes system hangs on some PCI computers. drive
240 * 0 is the low bit (0x1), and drive 7 is the high bit (0x80). Bits are on if
241 * a drive is allowed.
242 *
243 * NOTE: This must come before we include the arch floppy header because
244 * some ports reference this variable from there. -DaveM
245 */
246
247static int allowed_drive_mask = 0x33;
248
249#include <asm/floppy.h>
250
251static int irqdma_allocated;
252
1da177e4
LT
253#include <linux/blkdev.h>
254#include <linux/blkpg.h>
255#include <linux/cdrom.h> /* for the compatibility eject ioctl */
256#include <linux/completion.h>
257
258static struct request *current_req;
259static struct request_queue *floppy_queue;
48c8cee6 260static void do_fd_request(struct request_queue *q);
1da177e4
LT
261
262#ifndef fd_get_dma_residue
263#define fd_get_dma_residue() get_dma_residue(FLOPPY_DMA)
264#endif
265
266/* Dma Memory related stuff */
267
268#ifndef fd_dma_mem_free
269#define fd_dma_mem_free(addr, size) free_pages(addr, get_order(size))
270#endif
271
272#ifndef fd_dma_mem_alloc
48c8cee6 273#define fd_dma_mem_alloc(size) __get_dma_pages(GFP_KERNEL, get_order(size))
1da177e4
LT
274#endif
275
276static inline void fallback_on_nodma_alloc(char **addr, size_t l)
277{
278#ifdef FLOPPY_CAN_FALLBACK_ON_NODMA
279 if (*addr)
280 return; /* we have the memory */
281 if (can_use_virtual_dma != 2)
282 return; /* no fallback allowed */
b46df356 283 pr_info("DMA memory shortage. Temporarily falling back on virtual DMA\n");
1da177e4
LT
284 *addr = (char *)nodma_mem_alloc(l);
285#else
286 return;
287#endif
288}
289
290/* End dma memory related stuff */
291
292static unsigned long fake_change;
29f1c784 293static bool initialized;
1da177e4 294
48c8cee6
JP
295#define ITYPE(x) (((x) >> 2) & 0x1f)
296#define TOMINOR(x) ((x & 3) | ((x & 4) << 5))
297#define UNIT(x) ((x) & 0x03) /* drive on fdc */
298#define FDC(x) (((x) & 0x04) >> 2) /* fdc of drive */
06f748c4 299 /* reverse mapping from unit and fdc to drive */
1da177e4 300#define REVDRIVE(fdc, unit) ((unit) + ((fdc) << 2))
1da177e4 301
48c8cee6
JP
302#define DP (&drive_params[current_drive])
303#define DRS (&drive_state[current_drive])
304#define DRWE (&write_errors[current_drive])
305#define FDCS (&fdc_state[fdc])
1da177e4 306
48c8cee6
JP
307#define UDP (&drive_params[drive])
308#define UDRS (&drive_state[drive])
309#define UDRWE (&write_errors[drive])
310#define UFDCS (&fdc_state[FDC(drive)])
1da177e4 311
48c8cee6 312#define DPRINT(format, args...) \
4d18ef09 313 pr_info("floppy%d: " format, current_drive, ##args)
1da177e4 314
48c8cee6
JP
315#define PH_HEAD(floppy, head) (((((floppy)->stretch & 2) >> 1) ^ head) << 2)
316#define STRETCH(floppy) ((floppy)->stretch & FD_STRETCH)
317
1da177e4 318/* read/write */
48c8cee6
JP
319#define COMMAND (raw_cmd->cmd[0])
320#define DR_SELECT (raw_cmd->cmd[1])
321#define TRACK (raw_cmd->cmd[2])
322#define HEAD (raw_cmd->cmd[3])
323#define SECTOR (raw_cmd->cmd[4])
324#define SIZECODE (raw_cmd->cmd[5])
325#define SECT_PER_TRACK (raw_cmd->cmd[6])
326#define GAP (raw_cmd->cmd[7])
327#define SIZECODE2 (raw_cmd->cmd[8])
1da177e4
LT
328#define NR_RW 9
329
330/* format */
48c8cee6
JP
331#define F_SIZECODE (raw_cmd->cmd[2])
332#define F_SECT_PER_TRACK (raw_cmd->cmd[3])
333#define F_GAP (raw_cmd->cmd[4])
334#define F_FILL (raw_cmd->cmd[5])
1da177e4
LT
335#define NR_F 6
336
337/*
48c8cee6
JP
338 * Maximum disk size (in kilobytes).
339 * This default is used whenever the current disk size is unknown.
1da177e4
LT
340 * [Now it is rather a minimum]
341 */
342#define MAX_DISK_SIZE 4 /* 3984 */
343
344/*
345 * globals used by 'result()'
346 */
347#define MAX_REPLIES 16
348static unsigned char reply_buffer[MAX_REPLIES];
349static int inr; /* size of reply buffer, when called from interrupt */
48c8cee6
JP
350#define ST0 (reply_buffer[0])
351#define ST1 (reply_buffer[1])
352#define ST2 (reply_buffer[2])
353#define ST3 (reply_buffer[0]) /* result of GETSTATUS */
354#define R_TRACK (reply_buffer[3])
355#define R_HEAD (reply_buffer[4])
356#define R_SECTOR (reply_buffer[5])
357#define R_SIZECODE (reply_buffer[6])
358
359#define SEL_DLY (2 * HZ / 100)
1da177e4
LT
360
361/*
362 * this struct defines the different floppy drive types.
363 */
364static struct {
365 struct floppy_drive_params params;
366 const char *name; /* name printed while booting */
367} default_drive_params[] = {
368/* NOTE: the time values in jiffies should be in msec!
369 CMOS drive type
370 | Maximum data rate supported by drive type
371 | | Head load time, msec
372 | | | Head unload time, msec (not used)
373 | | | | Step rate interval, usec
374 | | | | | Time needed for spinup time (jiffies)
375 | | | | | | Timeout for spinning down (jiffies)
376 | | | | | | | Spindown offset (where disk stops)
377 | | | | | | | | Select delay
378 | | | | | | | | | RPS
379 | | | | | | | | | | Max number of tracks
380 | | | | | | | | | | | Interrupt timeout
381 | | | | | | | | | | | | Max nonintlv. sectors
382 | | | | | | | | | | | | | -Max Errors- flags */
383{{0, 500, 16, 16, 8000, 1*HZ, 3*HZ, 0, SEL_DLY, 5, 80, 3*HZ, 20, {3,1,2,0,2}, 0,
384 0, { 7, 4, 8, 2, 1, 5, 3,10}, 3*HZ/2, 0 }, "unknown" },
385
386{{1, 300, 16, 16, 8000, 1*HZ, 3*HZ, 0, SEL_DLY, 5, 40, 3*HZ, 17, {3,1,2,0,2}, 0,
387 0, { 1, 0, 0, 0, 0, 0, 0, 0}, 3*HZ/2, 1 }, "360K PC" }, /*5 1/4 360 KB PC*/
388
389{{2, 500, 16, 16, 6000, 4*HZ/10, 3*HZ, 14, SEL_DLY, 6, 83, 3*HZ, 17, {3,1,2,0,2}, 0,
390 0, { 2, 5, 6,23,10,20,12, 0}, 3*HZ/2, 2 }, "1.2M" }, /*5 1/4 HD AT*/
391
392{{3, 250, 16, 16, 3000, 1*HZ, 3*HZ, 0, SEL_DLY, 5, 83, 3*HZ, 20, {3,1,2,0,2}, 0,
393 0, { 4,22,21,30, 3, 0, 0, 0}, 3*HZ/2, 4 }, "720k" }, /*3 1/2 DD*/
394
395{{4, 500, 16, 16, 4000, 4*HZ/10, 3*HZ, 10, SEL_DLY, 5, 83, 3*HZ, 20, {3,1,2,0,2}, 0,
396 0, { 7, 4,25,22,31,21,29,11}, 3*HZ/2, 7 }, "1.44M" }, /*3 1/2 HD*/
397
398{{5, 1000, 15, 8, 3000, 4*HZ/10, 3*HZ, 10, SEL_DLY, 5, 83, 3*HZ, 40, {3,1,2,0,2}, 0,
399 0, { 7, 8, 4,25,28,22,31,21}, 3*HZ/2, 8 }, "2.88M AMI BIOS" }, /*3 1/2 ED*/
400
401{{6, 1000, 15, 8, 3000, 4*HZ/10, 3*HZ, 10, SEL_DLY, 5, 83, 3*HZ, 40, {3,1,2,0,2}, 0,
402 0, { 7, 8, 4,25,28,22,31,21}, 3*HZ/2, 8 }, "2.88M" } /*3 1/2 ED*/
403/* | --autodetected formats--- | | |
404 * read_track | | Name printed when booting
405 * | Native format
406 * Frequency of disk change checks */
407};
408
409static struct floppy_drive_params drive_params[N_DRIVE];
410static struct floppy_drive_struct drive_state[N_DRIVE];
411static struct floppy_write_errors write_errors[N_DRIVE];
412static struct timer_list motor_off_timer[N_DRIVE];
413static struct gendisk *disks[N_DRIVE];
414static struct block_device *opened_bdev[N_DRIVE];
b1c82b5c 415static DEFINE_MUTEX(open_lock);
1da177e4
LT
416static struct floppy_raw_cmd *raw_cmd, default_raw_cmd;
417
418/*
419 * This struct defines the different floppy types.
420 *
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
9e49184c
KW
429 * 'options'.
430 *
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).
436 *
437 * Other parameters should be self-explanatory (see also setfdprm(8)).
1da177e4
LT
438 */
439/*
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) */
449static 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" */
460
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" */
471
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" */
1da177e4 481 { 3680,23,2,80,0,0x1C,0x10,0xCF,0x00,"H1840" }, /* 29 1.84MB 3.5" */
06f748c4 482
1da177e4
LT
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" */
485};
486
1da177e4
LT
487#define SECTSIZE (_FD_SECTSIZE(*floppy))
488
489/* Auto-detection: Disk type used until the next media change occurs. */
490static struct floppy_struct *current_type[N_DRIVE];
491
492/*
493 * User-provided type information. current_type points to
494 * the respective entry of this array.
495 */
496static struct floppy_struct user_params[N_DRIVE];
497
498static sector_t floppy_sizes[256];
499
94fd0db7
HR
500static char floppy_device_name[] = "floppy";
501
1da177e4
LT
502/*
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.
506 */
507static int probing;
508
509/* Synchronization of FDC access. */
48c8cee6
JP
510#define FD_COMMAND_NONE -1
511#define FD_COMMAND_ERROR 2
512#define FD_COMMAND_OKAY 3
1da177e4
LT
513
514static volatile int command_status = FD_COMMAND_NONE;
515static unsigned long fdc_busy;
516static DECLARE_WAIT_QUEUE_HEAD(fdc_wait);
517static DECLARE_WAIT_QUEUE_HEAD(command_done);
518
519#define NO_SIGNAL (!interruptible || !signal_pending(current))
1da177e4
LT
520
521/* Errors during formatting are counted here. */
522static int format_errors;
523
524/* Format request descriptor. */
525static struct format_descr format_req;
526
527/*
528 * Rate is 0 for 500kb/s, 1 for 300kbps, 2 for 250kbps
529 * Spec1 is 0xSH, where S is stepping rate (F=1ms, E=2ms, D=3ms etc),
530 * H is head unload time (1=16ms, 2=32ms, etc)
531 */
532
533/*
534 * Track buffer
535 * Because these are written to by the DMA controller, they must
536 * not contain a 64k byte boundary crossing, or data will be
537 * corrupted/lost.
538 */
539static char *floppy_track_buffer;
540static int max_buffer_sectors;
541
542static int *errors;
06f748c4 543typedef void (*done_f)(int);
1da177e4 544static struct cont_t {
48c8cee6
JP
545 void (*interrupt)(void);
546 /* this is called after the interrupt of the
547 * main command */
06f748c4
JJ
548 void (*redo)(void); /* this is called to retry the operation */
549 void (*error)(void); /* this is called to tally an error */
1da177e4
LT
550 done_f done; /* this is called to say if the operation has
551 * succeeded/failed */
552} *cont;
553
554static void floppy_ready(void);
555static void floppy_start(void);
556static void process_fd_request(void);
557static void recalibrate_floppy(void);
558static void floppy_shutdown(unsigned long);
559
5a74db06
PDM
560static int floppy_request_regions(int);
561static void floppy_release_regions(int);
1da177e4
LT
562static int floppy_grab_irq_and_dma(void);
563static void floppy_release_irq_and_dma(void);
564
565/*
566 * The "reset" variable should be tested whenever an interrupt is scheduled,
567 * after the commands have been sent. This is to ensure that the driver doesn't
568 * get wedged when the interrupt doesn't come because of a failed command.
569 * reset doesn't need to be tested before sending commands, because
570 * output_byte is automatically disabled when reset is set.
571 */
1da177e4
LT
572static void reset_fdc(void);
573
574/*
575 * These are global variables, as that's the easiest way to give
576 * information to interrupts. They are the data used for the current
577 * request.
578 */
48c8cee6
JP
579#define NO_TRACK -1
580#define NEED_1_RECAL -2
581#define NEED_2_RECAL -3
1da177e4
LT
582
583static int usage_count;
584
585/* buffer related variables */
586static int buffer_track = -1;
587static int buffer_drive = -1;
588static int buffer_min = -1;
589static int buffer_max = -1;
590
591/* fdc related variables, should end up in a struct */
592static struct floppy_fdc_state fdc_state[N_FDC];
593static int fdc; /* current fdc */
594
595static struct floppy_struct *_floppy = floppy_type;
596static unsigned char current_drive;
597static long current_count_sectors;
598static unsigned char fsector_t; /* sector in track */
599static unsigned char in_sector_offset; /* offset within physical sector,
600 * expressed in units of 512 bytes */
601
602#ifndef fd_eject
603static inline int fd_eject(int drive)
604{
605 return -EINVAL;
606}
607#endif
608
609/*
610 * Debugging
611 * =========
612 */
613#ifdef DEBUGT
614static long unsigned debugtimer;
615
616static inline void set_debugt(void)
617{
618 debugtimer = jiffies;
619}
620
621static inline void debugt(const char *message)
622{
623 if (DP->flags & DEBUGT)
b46df356 624 pr_info("%s dtime=%lu\n", message, jiffies - debugtimer);
1da177e4
LT
625}
626#else
627static inline void set_debugt(void) { }
628static inline void debugt(const char *message) { }
629#endif /* DEBUGT */
630
a0a52d67 631typedef void (*timeout_fn)(unsigned long);
8d06afab 632static DEFINE_TIMER(fd_timeout, floppy_shutdown, 0, 0);
1da177e4
LT
633
634static const char *timeout_message;
635
636#ifdef FLOPPY_SANITY_CHECK
637static void is_alive(const char *message)
638{
639 /* this routine checks whether the floppy driver is "alive" */
c529730a
JP
640 if (test_bit(0, &fdc_busy) && command_status < 2 &&
641 !timer_pending(&fd_timeout)) {
1da177e4
LT
642 DPRINT("timeout handler died: %s\n", message);
643 }
644}
645#endif
646
48c8cee6 647static void (*do_floppy)(void) = NULL;
1da177e4
LT
648
649#ifdef FLOPPY_SANITY_CHECK
650
651#define OLOGSIZE 20
652
48c8cee6 653static void (*lasthandler)(void);
1da177e4
LT
654static unsigned long interruptjiffies;
655static unsigned long resultjiffies;
656static int resultsize;
657static unsigned long lastredo;
658
659static struct output_log {
660 unsigned char data;
661 unsigned char status;
662 unsigned long jiffies;
663} output_log[OLOGSIZE];
664
665static int output_log_pos;
666#endif
667
668#define current_reqD -1
669#define MAXTIMEOUT -2
670
671static void __reschedule_timeout(int drive, const char *message, int marg)
672{
673 if (drive == current_reqD)
674 drive = current_drive;
675 del_timer(&fd_timeout);
4acb3e2f 676 if (drive < 0 || drive >= N_DRIVE) {
1da177e4
LT
677 fd_timeout.expires = jiffies + 20UL * HZ;
678 drive = 0;
679 } else
680 fd_timeout.expires = jiffies + UDP->timeout;
681 add_timer(&fd_timeout);
a81ee544 682 if (UDP->flags & FD_DEBUG)
b46df356 683 DPRINT("reschedule timeout %s %d\n", message, marg);
1da177e4
LT
684 timeout_message = message;
685}
686
687static void reschedule_timeout(int drive, const char *message, int marg)
688{
689 unsigned long flags;
690
691 spin_lock_irqsave(&floppy_lock, flags);
692 __reschedule_timeout(drive, message, marg);
693 spin_unlock_irqrestore(&floppy_lock, flags);
694}
695
48c8cee6
JP
696#define INFBOUND(a, b) (a) = max_t(int, a, b)
697#define SUPBOUND(a, b) (a) = min_t(int, a, b)
1da177e4
LT
698
699/*
700 * Bottom half floppy driver.
701 * ==========================
702 *
703 * This part of the file contains the code talking directly to the hardware,
704 * and also the main service loop (seek-configure-spinup-command)
705 */
706
707/*
708 * disk change.
709 * This routine is responsible for maintaining the FD_DISK_CHANGE flag,
710 * and the last_checked date.
711 *
712 * last_checked is the date of the last check which showed 'no disk change'
713 * FD_DISK_CHANGE is set under two conditions:
714 * 1. The floppy has been changed after some i/o to that floppy already
715 * took place.
716 * 2. No floppy disk is in the drive. This is done in order to ensure that
717 * requests are quickly flushed in case there is no disk in the drive. It
718 * follows that FD_DISK_CHANGE can only be cleared if there is a disk in
719 * the drive.
720 *
721 * For 1., maxblock is observed. Maxblock is 0 if no i/o has taken place yet.
722 * For 2., FD_DISK_NEWCHANGE is watched. FD_DISK_NEWCHANGE is cleared on
723 * each seek. If a disk is present, the disk change line should also be
724 * cleared on each seek. Thus, if FD_DISK_NEWCHANGE is clear, but the disk
725 * change line is set, this means either that no disk is in the drive, or
726 * that it has been removed since the last seek.
727 *
728 * This means that we really have a third possibility too:
729 * The floppy has been changed after the last seek.
730 */
731
732static int disk_change(int drive)
733{
734 int fdc = FDC(drive);
06f748c4 735
1da177e4 736#ifdef FLOPPY_SANITY_CHECK
50297cbf 737 if (time_before(jiffies, UDRS->select_date + UDP->select_delay))
1da177e4
LT
738 DPRINT("WARNING disk change called early\n");
739 if (!(FDCS->dor & (0x10 << UNIT(drive))) ||
740 (FDCS->dor & 3) != UNIT(drive) || fdc != FDC(drive)) {
741 DPRINT("probing disk change on unselected drive\n");
742 DPRINT("drive=%d fdc=%d dor=%x\n", drive, FDC(drive),
743 (unsigned int)FDCS->dor);
744 }
745#endif
746
87f530d8
JP
747 debug_dcl(UDP->flags,
748 "checking disk change line for drive %d\n", drive);
749 debug_dcl(UDP->flags, "jiffies=%lu\n", jiffies);
750 debug_dcl(UDP->flags, "disk change line=%x\n", fd_inb(FD_DIR) & 0x80);
751 debug_dcl(UDP->flags, "flags=%lx\n", UDRS->flags);
752
1da177e4 753 if (UDP->flags & FD_BROKEN_DCL)
e0298536 754 return test_bit(FD_DISK_CHANGED_BIT, &UDRS->flags);
1da177e4 755 if ((fd_inb(FD_DIR) ^ UDP->flags) & 0x80) {
e0298536
JP
756 set_bit(FD_VERIFY_BIT, &UDRS->flags);
757 /* verify write protection */
758
759 if (UDRS->maxblock) /* mark it changed */
760 set_bit(FD_DISK_CHANGED_BIT, &UDRS->flags);
1da177e4
LT
761
762 /* invalidate its geometry */
763 if (UDRS->keep_data >= 0) {
764 if ((UDP->flags & FTD_MSG) &&
765 current_type[drive] != NULL)
766 DPRINT("Disk type is undefined after "
767 "disk change\n");
768 current_type[drive] = NULL;
769 floppy_sizes[TOMINOR(drive)] = MAX_DISK_SIZE << 1;
770 }
771
1da177e4
LT
772 return 1;
773 } else {
774 UDRS->last_checked = jiffies;
e0298536 775 clear_bit(FD_DISK_NEWCHANGE_BIT, &UDRS->flags);
1da177e4
LT
776 }
777 return 0;
778}
779
780static inline int is_selected(int dor, int unit)
781{
782 return ((dor & (0x10 << unit)) && (dor & 3) == unit);
783}
784
57584c5a
JP
785static bool is_ready_state(int status)
786{
787 int state = status & (STATUS_READY | STATUS_DIR | STATUS_DMA);
788 return state == STATUS_READY;
789}
790
1da177e4
LT
791static int set_dor(int fdc, char mask, char data)
792{
fdc1ca8a
JJ
793 unsigned char unit;
794 unsigned char drive;
795 unsigned char newdor;
796 unsigned char olddor;
1da177e4
LT
797
798 if (FDCS->address == -1)
799 return -1;
800
801 olddor = FDCS->dor;
802 newdor = (olddor & mask) | data;
803 if (newdor != olddor) {
804 unit = olddor & 0x3;
805 if (is_selected(olddor, unit) && !is_selected(newdor, unit)) {
806 drive = REVDRIVE(fdc, unit);
87f530d8
JP
807 debug_dcl(UDP->flags,
808 "calling disk change from set_dor\n");
1da177e4
LT
809 disk_change(drive);
810 }
811 FDCS->dor = newdor;
812 fd_outb(newdor, FD_DOR);
813
814 unit = newdor & 0x3;
815 if (!is_selected(olddor, unit) && is_selected(newdor, unit)) {
816 drive = REVDRIVE(fdc, unit);
817 UDRS->select_date = jiffies;
818 }
819 }
1da177e4
LT
820 return olddor;
821}
822
823static void twaddle(void)
824{
825 if (DP->select_delay)
826 return;
827 fd_outb(FDCS->dor & ~(0x10 << UNIT(current_drive)), FD_DOR);
828 fd_outb(FDCS->dor, FD_DOR);
829 DRS->select_date = jiffies;
830}
831
57584c5a
JP
832/*
833 * Reset all driver information about the current fdc.
834 * This is needed after a reset, and after a raw command.
835 */
1da177e4
LT
836static void reset_fdc_info(int mode)
837{
838 int drive;
839
840 FDCS->spec1 = FDCS->spec2 = -1;
841 FDCS->need_configure = 1;
842 FDCS->perp_mode = 1;
843 FDCS->rawcmd = 0;
844 for (drive = 0; drive < N_DRIVE; drive++)
845 if (FDC(drive) == fdc && (mode || UDRS->track != NEED_1_RECAL))
846 UDRS->track = NEED_2_RECAL;
847}
848
849/* selects the fdc and drive, and enables the fdc's input/dma. */
850static void set_fdc(int drive)
851{
852 if (drive >= 0 && drive < N_DRIVE) {
853 fdc = FDC(drive);
854 current_drive = drive;
855 }
856 if (fdc != 1 && fdc != 0) {
b46df356 857 pr_info("bad fdc value\n");
1da177e4
LT
858 return;
859 }
860 set_dor(fdc, ~0, 8);
861#if N_FDC > 1
862 set_dor(1 - fdc, ~8, 0);
863#endif
864 if (FDCS->rawcmd == 2)
865 reset_fdc_info(1);
866 if (fd_inb(FD_STATUS) != STATUS_READY)
867 FDCS->reset = 1;
868}
869
870/* locks the driver */
74f63f46 871static int _lock_fdc(int drive, bool interruptible, int line)
1da177e4
LT
872{
873 if (!usage_count) {
b46df356 874 pr_err("Trying to lock fdc while usage count=0 at line %d\n",
1da177e4
LT
875 line);
876 return -1;
877 }
1da177e4
LT
878
879 if (test_and_set_bit(0, &fdc_busy)) {
880 DECLARE_WAITQUEUE(wait, current);
881 add_wait_queue(&fdc_wait, &wait);
882
883 for (;;) {
884 set_current_state(TASK_INTERRUPTIBLE);
885
886 if (!test_and_set_bit(0, &fdc_busy))
887 break;
888
889 schedule();
890
891 if (!NO_SIGNAL) {
892 remove_wait_queue(&fdc_wait, &wait);
893 return -EINTR;
894 }
895 }
896
897 set_current_state(TASK_RUNNING);
898 remove_wait_queue(&fdc_wait, &wait);
3e541a4a 899 flush_scheduled_work();
1da177e4
LT
900 }
901 command_status = FD_COMMAND_NONE;
902
903 __reschedule_timeout(drive, "lock fdc", 0);
904 set_fdc(drive);
905 return 0;
906}
907
48c8cee6
JP
908#define lock_fdc(drive, interruptible) \
909 _lock_fdc(drive, interruptible, __LINE__)
1da177e4 910
1da177e4
LT
911/* unlocks the driver */
912static inline void unlock_fdc(void)
913{
914 unsigned long flags;
915
916 raw_cmd = NULL;
917 if (!test_bit(0, &fdc_busy))
918 DPRINT("FDC access conflict!\n");
919
920 if (do_floppy)
921 DPRINT("device interrupt still active at FDC release: %p!\n",
922 do_floppy);
923 command_status = FD_COMMAND_NONE;
924 spin_lock_irqsave(&floppy_lock, flags);
925 del_timer(&fd_timeout);
926 cont = NULL;
927 clear_bit(0, &fdc_busy);
9934c8c0 928 if (current_req || blk_peek_request(floppy_queue))
1da177e4
LT
929 do_fd_request(floppy_queue);
930 spin_unlock_irqrestore(&floppy_lock, flags);
1da177e4
LT
931 wake_up(&fdc_wait);
932}
933
934/* switches the motor off after a given timeout */
935static void motor_off_callback(unsigned long nr)
936{
937 unsigned char mask = ~(0x10 << UNIT(nr));
938
939 set_dor(FDC(nr), mask, 0);
940}
941
942/* schedules motor off */
943static void floppy_off(unsigned int drive)
944{
945 unsigned long volatile delta;
fdc1ca8a 946 int fdc = FDC(drive);
1da177e4
LT
947
948 if (!(FDCS->dor & (0x10 << UNIT(drive))))
949 return;
950
951 del_timer(motor_off_timer + drive);
952
953 /* make spindle stop in a position which minimizes spinup time
954 * next time */
955 if (UDP->rps) {
956 delta = jiffies - UDRS->first_read_date + HZ -
957 UDP->spindown_offset;
958 delta = ((delta * UDP->rps) % HZ) / UDP->rps;
959 motor_off_timer[drive].expires =
960 jiffies + UDP->spindown - delta;
961 }
962 add_timer(motor_off_timer + drive);
963}
964
965/*
966 * cycle through all N_DRIVE floppy drives, for disk change testing.
967 * stopping at current drive. This is done before any long operation, to
968 * be sure to have up to date disk change information.
969 */
970static void scandrives(void)
971{
06f748c4
JJ
972 int i;
973 int drive;
974 int saved_drive;
1da177e4
LT
975
976 if (DP->select_delay)
977 return;
978
979 saved_drive = current_drive;
980 for (i = 0; i < N_DRIVE; i++) {
981 drive = (saved_drive + i + 1) % N_DRIVE;
982 if (UDRS->fd_ref == 0 || UDP->select_delay != 0)
983 continue; /* skip closed drives */
984 set_fdc(drive);
985 if (!(set_dor(fdc, ~3, UNIT(drive) | (0x10 << UNIT(drive))) &
986 (0x10 << UNIT(drive))))
987 /* switch the motor off again, if it was off to
988 * begin with */
989 set_dor(fdc, ~(0x10 << UNIT(drive)), 0);
990 }
991 set_fdc(saved_drive);
992}
993
994static void empty(void)
995{
996}
997
65f27f38 998static DECLARE_WORK(floppy_work, NULL);
1da177e4 999
48c8cee6 1000static void schedule_bh(void (*handler)(void))
1da177e4 1001{
65f27f38 1002 PREPARE_WORK(&floppy_work, (work_func_t)handler);
1da177e4
LT
1003 schedule_work(&floppy_work);
1004}
1005
8d06afab 1006static DEFINE_TIMER(fd_timer, NULL, 0, 0);
1da177e4
LT
1007
1008static void cancel_activity(void)
1009{
1010 unsigned long flags;
1011
1012 spin_lock_irqsave(&floppy_lock, flags);
1013 do_floppy = NULL;
65f27f38 1014 PREPARE_WORK(&floppy_work, (work_func_t)empty);
1da177e4
LT
1015 del_timer(&fd_timer);
1016 spin_unlock_irqrestore(&floppy_lock, flags);
1017}
1018
1019/* this function makes sure that the disk stays in the drive during the
1020 * transfer */
1021static void fd_watchdog(void)
1022{
87f530d8 1023 debug_dcl(DP->flags, "calling disk change from watchdog\n");
1da177e4
LT
1024
1025 if (disk_change(current_drive)) {
1026 DPRINT("disk removed during i/o\n");
1027 cancel_activity();
1028 cont->done(0);
1029 reset_fdc();
1030 } else {
1031 del_timer(&fd_timer);
a0a52d67 1032 fd_timer.function = (timeout_fn)fd_watchdog;
1da177e4
LT
1033 fd_timer.expires = jiffies + HZ / 10;
1034 add_timer(&fd_timer);
1035 }
1036}
1037
1038static void main_command_interrupt(void)
1039{
1040 del_timer(&fd_timer);
1041 cont->interrupt();
1042}
1043
1044/* waits for a delay (spinup or select) to pass */
1045static int fd_wait_for_completion(unsigned long delay, timeout_fn function)
1046{
1047 if (FDCS->reset) {
1048 reset_fdc(); /* do the reset during sleep to win time
1049 * if we don't need to sleep, it's a good
1050 * occasion anyways */
1051 return 1;
1052 }
1053
50297cbf 1054 if (time_before(jiffies, delay)) {
1da177e4
LT
1055 del_timer(&fd_timer);
1056 fd_timer.function = function;
1057 fd_timer.expires = delay;
1058 add_timer(&fd_timer);
1059 return 1;
1060 }
1061 return 0;
1062}
1063
1064static DEFINE_SPINLOCK(floppy_hlt_lock);
1065static int hlt_disabled;
1066static void floppy_disable_hlt(void)
1067{
1068 unsigned long flags;
1069
1070 spin_lock_irqsave(&floppy_hlt_lock, flags);
1071 if (!hlt_disabled) {
1072 hlt_disabled = 1;
1073#ifdef HAVE_DISABLE_HLT
1074 disable_hlt();
1075#endif
1076 }
1077 spin_unlock_irqrestore(&floppy_hlt_lock, flags);
1078}
1079
1080static void floppy_enable_hlt(void)
1081{
1082 unsigned long flags;
1083
1084 spin_lock_irqsave(&floppy_hlt_lock, flags);
1085 if (hlt_disabled) {
1086 hlt_disabled = 0;
1087#ifdef HAVE_DISABLE_HLT
1088 enable_hlt();
1089#endif
1090 }
1091 spin_unlock_irqrestore(&floppy_hlt_lock, flags);
1092}
1093
1094static void setup_DMA(void)
1095{
1096 unsigned long f;
1097
1098#ifdef FLOPPY_SANITY_CHECK
1099 if (raw_cmd->length == 0) {
1100 int i;
1101
b46df356 1102 pr_info("zero dma transfer size:");
1da177e4 1103 for (i = 0; i < raw_cmd->cmd_count; i++)
b46df356
JP
1104 pr_cont("%x,", raw_cmd->cmd[i]);
1105 pr_cont("\n");
1da177e4
LT
1106 cont->done(0);
1107 FDCS->reset = 1;
1108 return;
1109 }
1110 if (((unsigned long)raw_cmd->kernel_data) % 512) {
b46df356 1111 pr_info("non aligned address: %p\n", raw_cmd->kernel_data);
1da177e4
LT
1112 cont->done(0);
1113 FDCS->reset = 1;
1114 return;
1115 }
1116#endif
1117 f = claim_dma_lock();
1118 fd_disable_dma();
1119#ifdef fd_dma_setup
1120 if (fd_dma_setup(raw_cmd->kernel_data, raw_cmd->length,
1121 (raw_cmd->flags & FD_RAW_READ) ?
1122 DMA_MODE_READ : DMA_MODE_WRITE, FDCS->address) < 0) {
1123 release_dma_lock(f);
1124 cont->done(0);
1125 FDCS->reset = 1;
1126 return;
1127 }
1128 release_dma_lock(f);
1129#else
1130 fd_clear_dma_ff();
1131 fd_cacheflush(raw_cmd->kernel_data, raw_cmd->length);
1132 fd_set_dma_mode((raw_cmd->flags & FD_RAW_READ) ?
1133 DMA_MODE_READ : DMA_MODE_WRITE);
1134 fd_set_dma_addr(raw_cmd->kernel_data);
1135 fd_set_dma_count(raw_cmd->length);
1136 virtual_dma_port = FDCS->address;
1137 fd_enable_dma();
1138 release_dma_lock(f);
1139#endif
1140 floppy_disable_hlt();
1141}
1142
1143static void show_floppy(void);
1144
1145/* waits until the fdc becomes ready */
1146static int wait_til_ready(void)
1147{
06f748c4
JJ
1148 int status;
1149 int counter;
1150
1da177e4
LT
1151 if (FDCS->reset)
1152 return -1;
1153 for (counter = 0; counter < 10000; counter++) {
1154 status = fd_inb(FD_STATUS);
1155 if (status & STATUS_READY)
1156 return status;
1157 }
29f1c784 1158 if (initialized) {
1da177e4
LT
1159 DPRINT("Getstatus times out (%x) on fdc %d\n", status, fdc);
1160 show_floppy();
1161 }
1162 FDCS->reset = 1;
1163 return -1;
1164}
1165
1166/* sends a command byte to the fdc */
1167static int output_byte(char byte)
1168{
d7b2b2ec 1169 int status = wait_til_ready();
1da177e4 1170
d7b2b2ec 1171 if (status < 0)
1da177e4 1172 return -1;
57584c5a
JP
1173
1174 if (is_ready_state(status)) {
1da177e4
LT
1175 fd_outb(byte, FD_DATA);
1176#ifdef FLOPPY_SANITY_CHECK
1177 output_log[output_log_pos].data = byte;
1178 output_log[output_log_pos].status = status;
1179 output_log[output_log_pos].jiffies = jiffies;
1180 output_log_pos = (output_log_pos + 1) % OLOGSIZE;
1181#endif
1182 return 0;
1183 }
1184 FDCS->reset = 1;
29f1c784 1185 if (initialized) {
1da177e4
LT
1186 DPRINT("Unable to send byte %x to FDC. Fdc=%x Status=%x\n",
1187 byte, fdc, status);
1188 show_floppy();
1189 }
1190 return -1;
1191}
1192
1da177e4
LT
1193/* gets the response from the fdc */
1194static int result(void)
1195{
06f748c4
JJ
1196 int i;
1197 int status = 0;
1da177e4
LT
1198
1199 for (i = 0; i < MAX_REPLIES; i++) {
d7b2b2ec
JP
1200 status = wait_til_ready();
1201 if (status < 0)
1da177e4
LT
1202 break;
1203 status &= STATUS_DIR | STATUS_READY | STATUS_BUSY | STATUS_DMA;
1204 if ((status & ~STATUS_BUSY) == STATUS_READY) {
1205#ifdef FLOPPY_SANITY_CHECK
1206 resultjiffies = jiffies;
1207 resultsize = i;
1208#endif
1209 return i;
1210 }
1211 if (status == (STATUS_DIR | STATUS_READY | STATUS_BUSY))
1212 reply_buffer[i] = fd_inb(FD_DATA);
1213 else
1214 break;
1215 }
29f1c784
JP
1216 if (initialized) {
1217 DPRINT("get result error. Fdc=%d Last status=%x Read bytes=%d\n",
1218 fdc, status, i);
1da177e4
LT
1219 show_floppy();
1220 }
1221 FDCS->reset = 1;
1222 return -1;
1223}
1224
1225#define MORE_OUTPUT -2
1226/* does the fdc need more output? */
1227static int need_more_output(void)
1228{
d7b2b2ec 1229 int status = wait_til_ready();
06f748c4 1230
d7b2b2ec 1231 if (status < 0)
1da177e4 1232 return -1;
57584c5a
JP
1233
1234 if (is_ready_state(status))
1da177e4 1235 return MORE_OUTPUT;
57584c5a 1236
1da177e4
LT
1237 return result();
1238}
1239
1240/* Set perpendicular mode as required, based on data rate, if supported.
1241 * 82077 Now tested. 1Mbps data rate only possible with 82077-1.
1242 */
1243static inline void perpendicular_mode(void)
1244{
1245 unsigned char perp_mode;
1246
1247 if (raw_cmd->rate & 0x40) {
1248 switch (raw_cmd->rate & 3) {
1249 case 0:
1250 perp_mode = 2;
1251 break;
1252 case 3:
1253 perp_mode = 3;
1254 break;
1255 default:
1256 DPRINT("Invalid data rate for perpendicular mode!\n");
1257 cont->done(0);
bb57f0c6
JP
1258 FDCS->reset = 1;
1259 /*
1260 * convenient way to return to
1261 * redo without too much hassle
1262 * (deep stack et al.)
1263 */
1da177e4
LT
1264 return;
1265 }
1266 } else
1267 perp_mode = 0;
1268
1269 if (FDCS->perp_mode == perp_mode)
1270 return;
1271 if (FDCS->version >= FDC_82077_ORIG) {
1272 output_byte(FD_PERPENDICULAR);
1273 output_byte(perp_mode);
1274 FDCS->perp_mode = perp_mode;
1275 } else if (perp_mode) {
1276 DPRINT("perpendicular mode not supported by this FDC.\n");
1277 }
1278} /* perpendicular_mode */
1279
1280static int fifo_depth = 0xa;
1281static int no_fifo;
1282
1283static int fdc_configure(void)
1284{
1285 /* Turn on FIFO */
1286 output_byte(FD_CONFIGURE);
1287 if (need_more_output() != MORE_OUTPUT)
1288 return 0;
1289 output_byte(0);
1290 output_byte(0x10 | (no_fifo & 0x20) | (fifo_depth & 0xf));
1291 output_byte(0); /* pre-compensation from track
1292 0 upwards */
1293 return 1;
1294}
1295
1296#define NOMINAL_DTR 500
1297
1298/* Issue a "SPECIFY" command to set the step rate time, head unload time,
1299 * head load time, and DMA disable flag to values needed by floppy.
1300 *
1301 * The value "dtr" is the data transfer rate in Kbps. It is needed
1302 * to account for the data rate-based scaling done by the 82072 and 82077
1303 * FDC types. This parameter is ignored for other types of FDCs (i.e.
1304 * 8272a).
1305 *
1306 * Note that changing the data transfer rate has a (probably deleterious)
1307 * effect on the parameters subject to scaling for 82072/82077 FDCs, so
1308 * fdc_specify is called again after each data transfer rate
1309 * change.
1310 *
1311 * srt: 1000 to 16000 in microseconds
1312 * hut: 16 to 240 milliseconds
1313 * hlt: 2 to 254 milliseconds
1314 *
1315 * These values are rounded up to the next highest available delay time.
1316 */
1317static void fdc_specify(void)
1318{
06f748c4
JJ
1319 unsigned char spec1;
1320 unsigned char spec2;
1321 unsigned long srt;
1322 unsigned long hlt;
1323 unsigned long hut;
1da177e4
LT
1324 unsigned long dtr = NOMINAL_DTR;
1325 unsigned long scale_dtr = NOMINAL_DTR;
1326 int hlt_max_code = 0x7f;
1327 int hut_max_code = 0xf;
1328
1329 if (FDCS->need_configure && FDCS->version >= FDC_82072A) {
1330 fdc_configure();
1331 FDCS->need_configure = 0;
1da177e4
LT
1332 }
1333
1334 switch (raw_cmd->rate & 0x03) {
1335 case 3:
1336 dtr = 1000;
1337 break;
1338 case 1:
1339 dtr = 300;
1340 if (FDCS->version >= FDC_82078) {
1341 /* chose the default rate table, not the one
1342 * where 1 = 2 Mbps */
1343 output_byte(FD_DRIVESPEC);
1344 if (need_more_output() == MORE_OUTPUT) {
1345 output_byte(UNIT(current_drive));
1346 output_byte(0xc0);
1347 }
1348 }
1349 break;
1350 case 2:
1351 dtr = 250;
1352 break;
1353 }
1354
1355 if (FDCS->version >= FDC_82072) {
1356 scale_dtr = dtr;
1357 hlt_max_code = 0x00; /* 0==256msec*dtr0/dtr (not linear!) */
1358 hut_max_code = 0x0; /* 0==256msec*dtr0/dtr (not linear!) */
1359 }
1360
1361 /* Convert step rate from microseconds to milliseconds and 4 bits */
061837bc 1362 srt = 16 - DIV_ROUND_UP(DP->srt * scale_dtr / 1000, NOMINAL_DTR);
a81ee544 1363 if (slow_floppy)
1da177e4 1364 srt = srt / 4;
a81ee544 1365
1da177e4
LT
1366 SUPBOUND(srt, 0xf);
1367 INFBOUND(srt, 0);
1368
061837bc 1369 hlt = DIV_ROUND_UP(DP->hlt * scale_dtr / 2, NOMINAL_DTR);
1da177e4
LT
1370 if (hlt < 0x01)
1371 hlt = 0x01;
1372 else if (hlt > 0x7f)
1373 hlt = hlt_max_code;
1374
061837bc 1375 hut = DIV_ROUND_UP(DP->hut * scale_dtr / 16, NOMINAL_DTR);
1da177e4
LT
1376 if (hut < 0x1)
1377 hut = 0x1;
1378 else if (hut > 0xf)
1379 hut = hut_max_code;
1380
1381 spec1 = (srt << 4) | hut;
1382 spec2 = (hlt << 1) | (use_virtual_dma & 1);
1383
1384 /* If these parameters did not change, just return with success */
1385 if (FDCS->spec1 != spec1 || FDCS->spec2 != spec2) {
1386 /* Go ahead and set spec1 and spec2 */
1387 output_byte(FD_SPECIFY);
1388 output_byte(FDCS->spec1 = spec1);
1389 output_byte(FDCS->spec2 = spec2);
1390 }
1391} /* fdc_specify */
1392
1393/* Set the FDC's data transfer rate on behalf of the specified drive.
1394 * NOTE: with 82072/82077 FDCs, changing the data rate requires a reissue
1395 * of the specify command (i.e. using the fdc_specify function).
1396 */
1397static int fdc_dtr(void)
1398{
1399 /* If data rate not already set to desired value, set it. */
1400 if ((raw_cmd->rate & 3) == FDCS->dtr)
1401 return 0;
1402
1403 /* Set dtr */
1404 fd_outb(raw_cmd->rate & 3, FD_DCR);
1405
1406 /* TODO: some FDC/drive combinations (C&T 82C711 with TEAC 1.2MB)
1407 * need a stabilization period of several milliseconds to be
1408 * enforced after data rate changes before R/W operations.
1409 * Pause 5 msec to avoid trouble. (Needs to be 2 jiffies)
1410 */
1411 FDCS->dtr = raw_cmd->rate & 3;
d7b2b2ec
JP
1412 return fd_wait_for_completion(jiffies + 2UL * HZ / 100,
1413 (timeout_fn)floppy_ready);
1da177e4
LT
1414} /* fdc_dtr */
1415
1416static void tell_sector(void)
1417{
b46df356
JP
1418 pr_cont(": track %d, head %d, sector %d, size %d",
1419 R_TRACK, R_HEAD, R_SECTOR, R_SIZECODE);
1da177e4
LT
1420} /* tell_sector */
1421
b46df356
JP
1422static void print_errors(void)
1423{
1424 DPRINT("");
1425 if (ST0 & ST0_ECE) {
1426 pr_cont("Recalibrate failed!");
1427 } else if (ST2 & ST2_CRC) {
1428 pr_cont("data CRC error");
1429 tell_sector();
1430 } else if (ST1 & ST1_CRC) {
1431 pr_cont("CRC error");
1432 tell_sector();
1433 } else if ((ST1 & (ST1_MAM | ST1_ND)) ||
1434 (ST2 & ST2_MAM)) {
1435 if (!probing) {
1436 pr_cont("sector not found");
1437 tell_sector();
1438 } else
1439 pr_cont("probe failed...");
1440 } else if (ST2 & ST2_WC) { /* seek error */
1441 pr_cont("wrong cylinder");
1442 } else if (ST2 & ST2_BC) { /* cylinder marked as bad */
1443 pr_cont("bad cylinder");
1444 } else {
1445 pr_cont("unknown error. ST[0..2] are: 0x%x 0x%x 0x%x",
1446 ST0, ST1, ST2);
1447 tell_sector();
1448 }
1449 pr_cont("\n");
1450}
1451
1da177e4
LT
1452/*
1453 * OK, this error interpreting routine is called after a
1454 * DMA read/write has succeeded
1455 * or failed, so we check the results, and copy any buffers.
1456 * hhb: Added better error reporting.
1457 * ak: Made this into a separate routine.
1458 */
1459static int interpret_errors(void)
1460{
1461 char bad;
1462
1463 if (inr != 7) {
1464 DPRINT("-- FDC reply error");
1465 FDCS->reset = 1;
1466 return 1;
1467 }
1468
1469 /* check IC to find cause of interrupt */
1470 switch (ST0 & ST0_INTR) {
1471 case 0x40: /* error occurred during command execution */
1472 if (ST1 & ST1_EOC)
1473 return 0; /* occurs with pseudo-DMA */
1474 bad = 1;
1475 if (ST1 & ST1_WP) {
1476 DPRINT("Drive is write protected\n");
e0298536 1477 clear_bit(FD_DISK_WRITABLE_BIT, &DRS->flags);
1da177e4
LT
1478 cont->done(0);
1479 bad = 2;
1480 } else if (ST1 & ST1_ND) {
e0298536 1481 set_bit(FD_NEED_TWADDLE_BIT, &DRS->flags);
1da177e4
LT
1482 } else if (ST1 & ST1_OR) {
1483 if (DP->flags & FTD_MSG)
1484 DPRINT("Over/Underrun - retrying\n");
1485 bad = 0;
1486 } else if (*errors >= DP->max_errors.reporting) {
b46df356 1487 print_errors();
1da177e4
LT
1488 }
1489 if (ST2 & ST2_WC || ST2 & ST2_BC)
1490 /* wrong cylinder => recal */
1491 DRS->track = NEED_2_RECAL;
1492 return bad;
1493 case 0x80: /* invalid command given */
1494 DPRINT("Invalid FDC command given!\n");
1495 cont->done(0);
1496 return 2;
1497 case 0xc0:
1498 DPRINT("Abnormal termination caused by polling\n");
1499 cont->error();
1500 return 2;
1501 default: /* (0) Normal command termination */
1502 return 0;
1503 }
1504}
1505
1506/*
1507 * This routine is called when everything should be correctly set up
1508 * for the transfer (i.e. floppy motor is on, the correct floppy is
1509 * selected, and the head is sitting on the right track).
1510 */
1511static void setup_rw_floppy(void)
1512{
06f748c4
JJ
1513 int i;
1514 int r;
1515 int flags;
1516 int dflags;
1da177e4
LT
1517 unsigned long ready_date;
1518 timeout_fn function;
1519
1520 flags = raw_cmd->flags;
1521 if (flags & (FD_RAW_READ | FD_RAW_WRITE))
1522 flags |= FD_RAW_INTR;
1523
1524 if ((flags & FD_RAW_SPIN) && !(flags & FD_RAW_NO_MOTOR)) {
1525 ready_date = DRS->spinup_date + DP->spinup;
1526 /* If spinup will take a long time, rerun scandrives
1527 * again just before spinup completion. Beware that
1528 * after scandrives, we must again wait for selection.
1529 */
50297cbf 1530 if (time_after(ready_date, jiffies + DP->select_delay)) {
1da177e4 1531 ready_date -= DP->select_delay;
a0a52d67 1532 function = (timeout_fn)floppy_start;
1da177e4 1533 } else
a0a52d67 1534 function = (timeout_fn)setup_rw_floppy;
1da177e4
LT
1535
1536 /* wait until the floppy is spinning fast enough */
1537 if (fd_wait_for_completion(ready_date, function))
1538 return;
1539 }
1540 dflags = DRS->flags;
1541
1542 if ((flags & FD_RAW_READ) || (flags & FD_RAW_WRITE))
1543 setup_DMA();
1544
1545 if (flags & FD_RAW_INTR)
1546 do_floppy = main_command_interrupt;
1547
1548 r = 0;
1549 for (i = 0; i < raw_cmd->cmd_count; i++)
1550 r |= output_byte(raw_cmd->cmd[i]);
1551
1552 debugt("rw_command: ");
1553
1554 if (r) {
1555 cont->error();
1556 reset_fdc();
1557 return;
1558 }
1559
1560 if (!(flags & FD_RAW_INTR)) {
1561 inr = result();
1562 cont->interrupt();
1563 } else if (flags & FD_RAW_NEED_DISK)
1564 fd_watchdog();
1565}
1566
1567static int blind_seek;
1568
1569/*
1570 * This is the routine called after every seek (or recalibrate) interrupt
1571 * from the floppy controller.
1572 */
1573static void seek_interrupt(void)
1574{
1575 debugt("seek interrupt:");
1576 if (inr != 2 || (ST0 & 0xF8) != 0x20) {
1577 DPRINT("seek failed\n");
1578 DRS->track = NEED_2_RECAL;
1579 cont->error();
1580 cont->redo();
1581 return;
1582 }
1583 if (DRS->track >= 0 && DRS->track != ST1 && !blind_seek) {
87f530d8
JP
1584 debug_dcl(DP->flags,
1585 "clearing NEWCHANGE flag because of effective seek\n");
1586 debug_dcl(DP->flags, "jiffies=%lu\n", jiffies);
e0298536
JP
1587 clear_bit(FD_DISK_NEWCHANGE_BIT, &DRS->flags);
1588 /* effective seek */
1da177e4
LT
1589 DRS->select_date = jiffies;
1590 }
1591 DRS->track = ST1;
1592 floppy_ready();
1593}
1594
1595static void check_wp(void)
1596{
e0298536
JP
1597 if (test_bit(FD_VERIFY_BIT, &DRS->flags)) {
1598 /* check write protection */
1da177e4
LT
1599 output_byte(FD_GETSTATUS);
1600 output_byte(UNIT(current_drive));
1601 if (result() != 1) {
1602 FDCS->reset = 1;
1603 return;
1604 }
e0298536
JP
1605 clear_bit(FD_VERIFY_BIT, &DRS->flags);
1606 clear_bit(FD_NEED_TWADDLE_BIT, &DRS->flags);
87f530d8
JP
1607 debug_dcl(DP->flags,
1608 "checking whether disk is write protected\n");
1609 debug_dcl(DP->flags, "wp=%x\n", ST3 & 0x40);
1da177e4 1610 if (!(ST3 & 0x40))
e0298536 1611 set_bit(FD_DISK_WRITABLE_BIT, &DRS->flags);
1da177e4 1612 else
e0298536 1613 clear_bit(FD_DISK_WRITABLE_BIT, &DRS->flags);
1da177e4
LT
1614 }
1615}
1616
1617static void seek_floppy(void)
1618{
1619 int track;
1620
1621 blind_seek = 0;
1622
87f530d8 1623 debug_dcl(DP->flags, "calling disk change from seek\n");
1da177e4 1624
e0298536 1625 if (!test_bit(FD_DISK_NEWCHANGE_BIT, &DRS->flags) &&
1da177e4
LT
1626 disk_change(current_drive) && (raw_cmd->flags & FD_RAW_NEED_DISK)) {
1627 /* the media changed flag should be cleared after the seek.
1628 * If it isn't, this means that there is really no disk in
1629 * the drive.
1630 */
e0298536 1631 set_bit(FD_DISK_CHANGED_BIT, &DRS->flags);
1da177e4
LT
1632 cont->done(0);
1633 cont->redo();
1634 return;
1635 }
1636 if (DRS->track <= NEED_1_RECAL) {
1637 recalibrate_floppy();
1638 return;
e0298536 1639 } else if (test_bit(FD_DISK_NEWCHANGE_BIT, &DRS->flags) &&
1da177e4
LT
1640 (raw_cmd->flags & FD_RAW_NEED_DISK) &&
1641 (DRS->track <= NO_TRACK || DRS->track == raw_cmd->track)) {
1642 /* we seek to clear the media-changed condition. Does anybody
1643 * know a more elegant way, which works on all drives? */
1644 if (raw_cmd->track)
1645 track = raw_cmd->track - 1;
1646 else {
1647 if (DP->flags & FD_SILENT_DCL_CLEAR) {
1648 set_dor(fdc, ~(0x10 << UNIT(current_drive)), 0);
1649 blind_seek = 1;
1650 raw_cmd->flags |= FD_RAW_NEED_SEEK;
1651 }
1652 track = 1;
1653 }
1654 } else {
1655 check_wp();
1656 if (raw_cmd->track != DRS->track &&
1657 (raw_cmd->flags & FD_RAW_NEED_SEEK))
1658 track = raw_cmd->track;
1659 else {
1660 setup_rw_floppy();
1661 return;
1662 }
1663 }
1664
1665 do_floppy = seek_interrupt;
1666 output_byte(FD_SEEK);
1667 output_byte(UNIT(current_drive));
2300f90e
JP
1668 if (output_byte(track) < 0) {
1669 reset_fdc();
1670 return;
1671 }
1da177e4
LT
1672 debugt("seek command:");
1673}
1674
1675static void recal_interrupt(void)
1676{
1677 debugt("recal interrupt:");
1678 if (inr != 2)
1679 FDCS->reset = 1;
1680 else if (ST0 & ST0_ECE) {
1681 switch (DRS->track) {
1682 case NEED_1_RECAL:
1683 debugt("recal interrupt need 1 recal:");
1684 /* after a second recalibrate, we still haven't
1685 * reached track 0. Probably no drive. Raise an
1686 * error, as failing immediately might upset
1687 * computers possessed by the Devil :-) */
1688 cont->error();
1689 cont->redo();
1690 return;
1691 case NEED_2_RECAL:
1692 debugt("recal interrupt need 2 recal:");
1693 /* If we already did a recalibrate,
1694 * and we are not at track 0, this
1695 * means we have moved. (The only way
1696 * not to move at recalibration is to
1697 * be already at track 0.) Clear the
1698 * new change flag */
87f530d8
JP
1699 debug_dcl(DP->flags,
1700 "clearing NEWCHANGE flag because of second recalibrate\n");
1da177e4 1701
e0298536 1702 clear_bit(FD_DISK_NEWCHANGE_BIT, &DRS->flags);
1da177e4
LT
1703 DRS->select_date = jiffies;
1704 /* fall through */
1705 default:
1706 debugt("recal interrupt default:");
1707 /* Recalibrate moves the head by at
1708 * most 80 steps. If after one
1709 * recalibrate we don't have reached
1710 * track 0, this might mean that we
1711 * started beyond track 80. Try
1712 * again. */
1713 DRS->track = NEED_1_RECAL;
1714 break;
1715 }
1716 } else
1717 DRS->track = ST1;
1718 floppy_ready();
1719}
1720
1721static void print_result(char *message, int inr)
1722{
1723 int i;
1724
1725 DPRINT("%s ", message);
1726 if (inr >= 0)
1727 for (i = 0; i < inr; i++)
b46df356
JP
1728 pr_cont("repl[%d]=%x ", i, reply_buffer[i]);
1729 pr_cont("\n");
1da177e4
LT
1730}
1731
1732/* interrupt handler. Note that this can be called externally on the Sparc */
7d12e780 1733irqreturn_t floppy_interrupt(int irq, void *dev_id)
1da177e4 1734{
1da177e4
LT
1735 int do_print;
1736 unsigned long f;
06f748c4 1737 void (*handler)(void) = do_floppy;
1da177e4
LT
1738
1739 lasthandler = handler;
1740 interruptjiffies = jiffies;
1741
1742 f = claim_dma_lock();
1743 fd_disable_dma();
1744 release_dma_lock(f);
1745
1746 floppy_enable_hlt();
1747 do_floppy = NULL;
1748 if (fdc >= N_FDC || FDCS->address == -1) {
1749 /* we don't even know which FDC is the culprit */
b46df356
JP
1750 pr_info("DOR0=%x\n", fdc_state[0].dor);
1751 pr_info("floppy interrupt on bizarre fdc %d\n", fdc);
1752 pr_info("handler=%p\n", handler);
1da177e4
LT
1753 is_alive("bizarre fdc");
1754 return IRQ_NONE;
1755 }
1756
1757 FDCS->reset = 0;
1758 /* We have to clear the reset flag here, because apparently on boxes
1759 * with level triggered interrupts (PS/2, Sparc, ...), it is needed to
1760 * emit SENSEI's to clear the interrupt line. And FDCS->reset blocks the
1761 * emission of the SENSEI's.
1762 * It is OK to emit floppy commands because we are in an interrupt
1763 * handler here, and thus we have to fear no interference of other
1764 * activity.
1765 */
1766
29f1c784 1767 do_print = !handler && print_unex && initialized;
1da177e4
LT
1768
1769 inr = result();
1770 if (do_print)
1771 print_result("unexpected interrupt", inr);
1772 if (inr == 0) {
1773 int max_sensei = 4;
1774 do {
1775 output_byte(FD_SENSEI);
1776 inr = result();
1777 if (do_print)
1778 print_result("sensei", inr);
1779 max_sensei--;
c529730a
JP
1780 } while ((ST0 & 0x83) != UNIT(current_drive) &&
1781 inr == 2 && max_sensei);
1da177e4
LT
1782 }
1783 if (!handler) {
1784 FDCS->reset = 1;
1785 return IRQ_NONE;
1786 }
1787 schedule_bh(handler);
1788 is_alive("normal interrupt end");
1789
1790 /* FIXME! Was it really for us? */
1791 return IRQ_HANDLED;
1792}
1793
1794static void recalibrate_floppy(void)
1795{
1796 debugt("recalibrate floppy:");
1797 do_floppy = recal_interrupt;
1798 output_byte(FD_RECALIBRATE);
2300f90e
JP
1799 if (output_byte(UNIT(current_drive)) < 0) {
1800 reset_fdc();
1801 return;
1802 }
1da177e4
LT
1803}
1804
1805/*
1806 * Must do 4 FD_SENSEIs after reset because of ``drive polling''.
1807 */
1808static void reset_interrupt(void)
1809{
1810 debugt("reset interrupt:");
1811 result(); /* get the status ready for set_fdc */
1812 if (FDCS->reset) {
b46df356 1813 pr_info("reset set in interrupt, calling %p\n", cont->error);
1da177e4
LT
1814 cont->error(); /* a reset just after a reset. BAD! */
1815 }
1816 cont->redo();
1817}
1818
1819/*
1820 * reset is done by pulling bit 2 of DOR low for a while (old FDCs),
1821 * or by setting the self clearing bit 7 of STATUS (newer FDCs)
1822 */
1823static void reset_fdc(void)
1824{
1825 unsigned long flags;
1826
1827 do_floppy = reset_interrupt;
1828 FDCS->reset = 0;
1829 reset_fdc_info(0);
1830
1831 /* Pseudo-DMA may intercept 'reset finished' interrupt. */
1832 /* Irrelevant for systems with true DMA (i386). */
1833
1834 flags = claim_dma_lock();
1835 fd_disable_dma();
1836 release_dma_lock(flags);
1837
1838 if (FDCS->version >= FDC_82072A)
1839 fd_outb(0x80 | (FDCS->dtr & 3), FD_STATUS);
1840 else {
1841 fd_outb(FDCS->dor & ~0x04, FD_DOR);
1842 udelay(FD_RESET_DELAY);
1843 fd_outb(FDCS->dor, FD_DOR);
1844 }
1845}
1846
1847static void show_floppy(void)
1848{
1849 int i;
1850
b46df356
JP
1851 pr_info("\n");
1852 pr_info("floppy driver state\n");
1853 pr_info("-------------------\n");
1854 pr_info("now=%lu last interrupt=%lu diff=%lu last called handler=%p\n",
1855 jiffies, interruptjiffies, jiffies - interruptjiffies,
1856 lasthandler);
1da177e4
LT
1857
1858#ifdef FLOPPY_SANITY_CHECK
b46df356
JP
1859 pr_info("timeout_message=%s\n", timeout_message);
1860 pr_info("last output bytes:\n");
1da177e4 1861 for (i = 0; i < OLOGSIZE; i++)
b46df356
JP
1862 pr_info("%2x %2x %lu\n",
1863 output_log[(i + output_log_pos) % OLOGSIZE].data,
1864 output_log[(i + output_log_pos) % OLOGSIZE].status,
1865 output_log[(i + output_log_pos) % OLOGSIZE].jiffies);
1866 pr_info("last result at %lu\n", resultjiffies);
1867 pr_info("last redo_fd_request at %lu\n", lastredo);
1868 print_hex_dump(KERN_INFO, "", DUMP_PREFIX_NONE, 16, 1,
1869 reply_buffer, resultsize, true);
1da177e4
LT
1870#endif
1871
b46df356
JP
1872 pr_info("status=%x\n", fd_inb(FD_STATUS));
1873 pr_info("fdc_busy=%lu\n", fdc_busy);
1da177e4 1874 if (do_floppy)
b46df356 1875 pr_info("do_floppy=%p\n", do_floppy);
365970a1 1876 if (work_pending(&floppy_work))
b46df356 1877 pr_info("floppy_work.func=%p\n", floppy_work.func);
1da177e4 1878 if (timer_pending(&fd_timer))
b46df356 1879 pr_info("fd_timer.function=%p\n", fd_timer.function);
1da177e4 1880 if (timer_pending(&fd_timeout)) {
b46df356
JP
1881 pr_info("timer_function=%p\n", fd_timeout.function);
1882 pr_info("expires=%lu\n", fd_timeout.expires - jiffies);
1883 pr_info("now=%lu\n", jiffies);
1884 }
1885 pr_info("cont=%p\n", cont);
1886 pr_info("current_req=%p\n", current_req);
1887 pr_info("command_status=%d\n", command_status);
1888 pr_info("\n");
1da177e4
LT
1889}
1890
1891static void floppy_shutdown(unsigned long data)
1892{
1893 unsigned long flags;
1894
29f1c784 1895 if (initialized)
1da177e4
LT
1896 show_floppy();
1897 cancel_activity();
1898
1899 floppy_enable_hlt();
1900
1901 flags = claim_dma_lock();
1902 fd_disable_dma();
1903 release_dma_lock(flags);
1904
1905 /* avoid dma going to a random drive after shutdown */
1906
29f1c784 1907 if (initialized)
1da177e4
LT
1908 DPRINT("floppy timeout called\n");
1909 FDCS->reset = 1;
1910 if (cont) {
1911 cont->done(0);
1912 cont->redo(); /* this will recall reset when needed */
1913 } else {
b46df356 1914 pr_info("no cont in shutdown!\n");
1da177e4
LT
1915 process_fd_request();
1916 }
1917 is_alive("floppy shutdown");
1918}
1919
1da177e4 1920/* start motor, check media-changed condition and write protection */
06f748c4 1921static int start_motor(void (*function)(void))
1da177e4 1922{
06f748c4
JJ
1923 int mask;
1924 int data;
1da177e4
LT
1925
1926 mask = 0xfc;
1927 data = UNIT(current_drive);
1928 if (!(raw_cmd->flags & FD_RAW_NO_MOTOR)) {
1929 if (!(FDCS->dor & (0x10 << UNIT(current_drive)))) {
1930 set_debugt();
1931 /* no read since this drive is running */
1932 DRS->first_read_date = 0;
1933 /* note motor start time if motor is not yet running */
1934 DRS->spinup_date = jiffies;
1935 data |= (0x10 << UNIT(current_drive));
1936 }
1937 } else if (FDCS->dor & (0x10 << UNIT(current_drive)))
1938 mask &= ~(0x10 << UNIT(current_drive));
1939
1940 /* starts motor and selects floppy */
1941 del_timer(motor_off_timer + current_drive);
1942 set_dor(fdc, mask, data);
1943
1944 /* wait_for_completion also schedules reset if needed. */
d7b2b2ec
JP
1945 return fd_wait_for_completion(DRS->select_date + DP->select_delay,
1946 (timeout_fn)function);
1da177e4
LT
1947}
1948
1949static void floppy_ready(void)
1950{
045f9836
JP
1951 if (FDCS->reset) {
1952 reset_fdc();
1953 return;
1954 }
1da177e4
LT
1955 if (start_motor(floppy_ready))
1956 return;
1957 if (fdc_dtr())
1958 return;
1959
87f530d8 1960 debug_dcl(DP->flags, "calling disk change from floppy_ready\n");
1da177e4
LT
1961 if (!(raw_cmd->flags & FD_RAW_NO_MOTOR) &&
1962 disk_change(current_drive) && !DP->select_delay)
bb57f0c6
JP
1963 twaddle(); /* this clears the dcl on certain
1964 * drive/controller combinations */
1da177e4
LT
1965
1966#ifdef fd_chose_dma_mode
1967 if ((raw_cmd->flags & FD_RAW_READ) || (raw_cmd->flags & FD_RAW_WRITE)) {
1968 unsigned long flags = claim_dma_lock();
1969 fd_chose_dma_mode(raw_cmd->kernel_data, raw_cmd->length);
1970 release_dma_lock(flags);
1971 }
1972#endif
1973
1974 if (raw_cmd->flags & (FD_RAW_NEED_SEEK | FD_RAW_NEED_DISK)) {
1975 perpendicular_mode();
1976 fdc_specify(); /* must be done here because of hut, hlt ... */
1977 seek_floppy();
1978 } else {
1979 if ((raw_cmd->flags & FD_RAW_READ) ||
1980 (raw_cmd->flags & FD_RAW_WRITE))
1981 fdc_specify();
1982 setup_rw_floppy();
1983 }
1984}
1985
1986static void floppy_start(void)
1987{
1988 reschedule_timeout(current_reqD, "floppy start", 0);
1989
1990 scandrives();
87f530d8 1991 debug_dcl(DP->flags, "setting NEWCHANGE in floppy_start\n");
e0298536 1992 set_bit(FD_DISK_NEWCHANGE_BIT, &DRS->flags);
1da177e4
LT
1993 floppy_ready();
1994}
1995
1996/*
1997 * ========================================================================
1998 * here ends the bottom half. Exported routines are:
1999 * floppy_start, floppy_off, floppy_ready, lock_fdc, unlock_fdc, set_fdc,
2000 * start_motor, reset_fdc, reset_fdc_info, interpret_errors.
2001 * Initialization also uses output_byte, result, set_dor, floppy_interrupt
2002 * and set_dor.
2003 * ========================================================================
2004 */
2005/*
2006 * General purpose continuations.
2007 * ==============================
2008 */
2009
2010static void do_wakeup(void)
2011{
2012 reschedule_timeout(MAXTIMEOUT, "do wakeup", 0);
2013 cont = NULL;
2014 command_status += 2;
2015 wake_up(&command_done);
2016}
2017
2018static struct cont_t wakeup_cont = {
2019 .interrupt = empty,
2020 .redo = do_wakeup,
2021 .error = empty,
06f748c4 2022 .done = (done_f)empty
1da177e4
LT
2023};
2024
2025static struct cont_t intr_cont = {
2026 .interrupt = empty,
2027 .redo = process_fd_request,
2028 .error = empty,
06f748c4 2029 .done = (done_f)empty
1da177e4
LT
2030};
2031
74f63f46 2032static int wait_til_done(void (*handler)(void), bool interruptible)
1da177e4
LT
2033{
2034 int ret;
2035
2036 schedule_bh(handler);
2037
2038 if (command_status < 2 && NO_SIGNAL) {
2039 DECLARE_WAITQUEUE(wait, current);
2040
2041 add_wait_queue(&command_done, &wait);
2042 for (;;) {
2043 set_current_state(interruptible ?
2044 TASK_INTERRUPTIBLE :
2045 TASK_UNINTERRUPTIBLE);
2046
2047 if (command_status >= 2 || !NO_SIGNAL)
2048 break;
2049
2050 is_alive("wait_til_done");
1da177e4
LT
2051 schedule();
2052 }
2053
2054 set_current_state(TASK_RUNNING);
2055 remove_wait_queue(&command_done, &wait);
2056 }
2057
2058 if (command_status < 2) {
2059 cancel_activity();
2060 cont = &intr_cont;
2061 reset_fdc();
2062 return -EINTR;
2063 }
2064
2065 if (FDCS->reset)
2066 command_status = FD_COMMAND_ERROR;
2067 if (command_status == FD_COMMAND_OKAY)
2068 ret = 0;
2069 else
2070 ret = -EIO;
2071 command_status = FD_COMMAND_NONE;
2072 return ret;
2073}
2074
2075static void generic_done(int result)
2076{
2077 command_status = result;
2078 cont = &wakeup_cont;
2079}
2080
2081static void generic_success(void)
2082{
2083 cont->done(1);
2084}
2085
2086static void generic_failure(void)
2087{
2088 cont->done(0);
2089}
2090
2091static void success_and_wakeup(void)
2092{
2093 generic_success();
2094 cont->redo();
2095}
2096
2097/*
2098 * formatting and rw support.
2099 * ==========================
2100 */
2101
2102static int next_valid_format(void)
2103{
2104 int probed_format;
2105
2106 probed_format = DRS->probed_format;
2107 while (1) {
2108 if (probed_format >= 8 || !DP->autodetect[probed_format]) {
2109 DRS->probed_format = 0;
2110 return 1;
2111 }
2112 if (floppy_type[DP->autodetect[probed_format]].sect) {
2113 DRS->probed_format = probed_format;
2114 return 0;
2115 }
2116 probed_format++;
2117 }
2118}
2119
2120static void bad_flp_intr(void)
2121{
2122 int err_count;
2123
2124 if (probing) {
2125 DRS->probed_format++;
2126 if (!next_valid_format())
2127 return;
2128 }
2129 err_count = ++(*errors);
2130 INFBOUND(DRWE->badness, err_count);
2131 if (err_count > DP->max_errors.abort)
2132 cont->done(0);
2133 if (err_count > DP->max_errors.reset)
2134 FDCS->reset = 1;
2135 else if (err_count > DP->max_errors.recal)
2136 DRS->track = NEED_2_RECAL;
2137}
2138
2139static void set_floppy(int drive)
2140{
2141 int type = ITYPE(UDRS->fd_device);
06f748c4 2142
1da177e4
LT
2143 if (type)
2144 _floppy = floppy_type + type;
2145 else
2146 _floppy = current_type[drive];
2147}
2148
2149/*
2150 * formatting support.
2151 * ===================
2152 */
2153static void format_interrupt(void)
2154{
2155 switch (interpret_errors()) {
2156 case 1:
2157 cont->error();
2158 case 2:
2159 break;
2160 case 0:
2161 cont->done(1);
2162 }
2163 cont->redo();
2164}
2165
2166#define CODE2SIZE (ssize = ((1 << SIZECODE) + 3) >> 2)
48c8cee6 2167#define FM_MODE(x, y) ((y) & ~(((x)->rate & 0x80) >> 1))
1da177e4 2168#define CT(x) ((x) | 0xc0)
48c8cee6 2169
1da177e4
LT
2170static void setup_format_params(int track)
2171{
06f748c4
JJ
2172 int n;
2173 int il;
2174 int count;
2175 int head_shift;
2176 int track_shift;
1da177e4
LT
2177 struct fparm {
2178 unsigned char track, head, sect, size;
2179 } *here = (struct fparm *)floppy_track_buffer;
1da177e4
LT
2180
2181 raw_cmd = &default_raw_cmd;
2182 raw_cmd->track = track;
2183
48c8cee6
JP
2184 raw_cmd->flags = (FD_RAW_WRITE | FD_RAW_INTR | FD_RAW_SPIN |
2185 FD_RAW_NEED_DISK | FD_RAW_NEED_SEEK);
1da177e4
LT
2186 raw_cmd->rate = _floppy->rate & 0x43;
2187 raw_cmd->cmd_count = NR_F;
2188 COMMAND = FM_MODE(_floppy, FD_FORMAT);
2189 DR_SELECT = UNIT(current_drive) + PH_HEAD(_floppy, format_req.head);
2190 F_SIZECODE = FD_SIZECODE(_floppy);
2191 F_SECT_PER_TRACK = _floppy->sect << 2 >> F_SIZECODE;
2192 F_GAP = _floppy->fmt_gap;
2193 F_FILL = FD_FILL_BYTE;
2194
2195 raw_cmd->kernel_data = floppy_track_buffer;
2196 raw_cmd->length = 4 * F_SECT_PER_TRACK;
2197
2198 /* allow for about 30ms for data transport per track */
2199 head_shift = (F_SECT_PER_TRACK + 5) / 6;
2200
2201 /* a ``cylinder'' is two tracks plus a little stepping time */
2202 track_shift = 2 * head_shift + 3;
2203
2204 /* position of logical sector 1 on this track */
2205 n = (track_shift * format_req.track + head_shift * format_req.head)
2206 % F_SECT_PER_TRACK;
2207
2208 /* determine interleave */
2209 il = 1;
2210 if (_floppy->fmt_gap < 0x22)
2211 il++;
2212
2213 /* initialize field */
2214 for (count = 0; count < F_SECT_PER_TRACK; ++count) {
2215 here[count].track = format_req.track;
2216 here[count].head = format_req.head;
2217 here[count].sect = 0;
2218 here[count].size = F_SIZECODE;
2219 }
2220 /* place logical sectors */
2221 for (count = 1; count <= F_SECT_PER_TRACK; ++count) {
2222 here[n].sect = count;
2223 n = (n + il) % F_SECT_PER_TRACK;
2224 if (here[n].sect) { /* sector busy, find next free sector */
2225 ++n;
2226 if (n >= F_SECT_PER_TRACK) {
2227 n -= F_SECT_PER_TRACK;
2228 while (here[n].sect)
2229 ++n;
2230 }
2231 }
2232 }
9e49184c 2233 if (_floppy->stretch & FD_SECTBASEMASK) {
1da177e4 2234 for (count = 0; count < F_SECT_PER_TRACK; count++)
9e49184c 2235 here[count].sect += FD_SECTBASE(_floppy) - 1;
1da177e4
LT
2236 }
2237}
2238
2239static void redo_format(void)
2240{
2241 buffer_track = -1;
2242 setup_format_params(format_req.track << STRETCH(_floppy));
2243 floppy_start();
2244 debugt("queue format request");
2245}
2246
2247static struct cont_t format_cont = {
2248 .interrupt = format_interrupt,
2249 .redo = redo_format,
2250 .error = bad_flp_intr,
2251 .done = generic_done
2252};
2253
2254static int do_format(int drive, struct format_descr *tmp_format_req)
2255{
2256 int ret;
2257
74f63f46 2258 if (lock_fdc(drive, true))
52a0d61f
JP
2259 return -EINTR;
2260
1da177e4
LT
2261 set_floppy(drive);
2262 if (!_floppy ||
2263 _floppy->track > DP->tracks ||
2264 tmp_format_req->track >= _floppy->track ||
2265 tmp_format_req->head >= _floppy->head ||
2266 (_floppy->sect << 2) % (1 << FD_SIZECODE(_floppy)) ||
2267 !_floppy->fmt_gap) {
2268 process_fd_request();
2269 return -EINVAL;
2270 }
2271 format_req = *tmp_format_req;
2272 format_errors = 0;
2273 cont = &format_cont;
2274 errors = &format_errors;
74f63f46 2275 ret = wait_til_done(redo_format, true);
55eee80c
JP
2276 if (ret == -EINTR)
2277 return -EINTR;
1da177e4
LT
2278 process_fd_request();
2279 return ret;
2280}
2281
2282/*
2283 * Buffer read/write and support
2284 * =============================
2285 */
2286
1c5093ba 2287static void floppy_end_request(struct request *req, int error)
1da177e4
LT
2288{
2289 unsigned int nr_sectors = current_count_sectors;
1c5093ba 2290 unsigned int drive = (unsigned long)req->rq_disk->private_data;
1da177e4
LT
2291
2292 /* current_count_sectors can be zero if transfer failed */
1c5093ba 2293 if (error)
83096ebf 2294 nr_sectors = blk_rq_cur_sectors(req);
1c5093ba 2295 if (__blk_end_request(req, error, nr_sectors << 9))
1da177e4 2296 return;
1da177e4
LT
2297
2298 /* We're done with the request */
1c5093ba 2299 floppy_off(drive);
1da177e4
LT
2300 current_req = NULL;
2301}
2302
2303/* new request_done. Can handle physical sectors which are smaller than a
2304 * logical buffer */
2305static void request_done(int uptodate)
2306{
2307 struct request_queue *q = floppy_queue;
2308 struct request *req = current_req;
2309 unsigned long flags;
2310 int block;
2311
2312 probing = 0;
b46df356 2313 reschedule_timeout(MAXTIMEOUT, "request done", uptodate);
1da177e4
LT
2314
2315 if (!req) {
b46df356 2316 pr_info("floppy.c: no request in request_done\n");
1da177e4
LT
2317 return;
2318 }
2319
2320 if (uptodate) {
2321 /* maintain values for invalidation on geometry
2322 * change */
83096ebf 2323 block = current_count_sectors + blk_rq_pos(req);
1da177e4
LT
2324 INFBOUND(DRS->maxblock, block);
2325 if (block > _floppy->sect)
2326 DRS->maxtrack = 1;
2327
2328 /* unlock chained buffers */
2329 spin_lock_irqsave(q->queue_lock, flags);
1c5093ba 2330 floppy_end_request(req, 0);
1da177e4
LT
2331 spin_unlock_irqrestore(q->queue_lock, flags);
2332 } else {
2333 if (rq_data_dir(req) == WRITE) {
2334 /* record write error information */
2335 DRWE->write_errors++;
2336 if (DRWE->write_errors == 1) {
83096ebf 2337 DRWE->first_error_sector = blk_rq_pos(req);
1da177e4
LT
2338 DRWE->first_error_generation = DRS->generation;
2339 }
83096ebf 2340 DRWE->last_error_sector = blk_rq_pos(req);
1da177e4
LT
2341 DRWE->last_error_generation = DRS->generation;
2342 }
2343 spin_lock_irqsave(q->queue_lock, flags);
1c5093ba 2344 floppy_end_request(req, -EIO);
1da177e4
LT
2345 spin_unlock_irqrestore(q->queue_lock, flags);
2346 }
2347}
2348
2349/* Interrupt handler evaluating the result of the r/w operation */
2350static void rw_interrupt(void)
2351{
06f748c4
JJ
2352 int eoc;
2353 int ssize;
2354 int heads;
2355 int nr_sectors;
1da177e4
LT
2356
2357 if (R_HEAD >= 2) {
2358 /* some Toshiba floppy controllers occasionnally seem to
2359 * return bogus interrupts after read/write operations, which
2360 * can be recognized by a bad head number (>= 2) */
2361 return;
2362 }
2363
2364 if (!DRS->first_read_date)
2365 DRS->first_read_date = jiffies;
2366
2367 nr_sectors = 0;
2368 CODE2SIZE;
2369
2370 if (ST1 & ST1_EOC)
2371 eoc = 1;
2372 else
2373 eoc = 0;
2374
2375 if (COMMAND & 0x80)
2376 heads = 2;
2377 else
2378 heads = 1;
2379
2380 nr_sectors = (((R_TRACK - TRACK) * heads +
2381 R_HEAD - HEAD) * SECT_PER_TRACK +
2382 R_SECTOR - SECTOR + eoc) << SIZECODE >> 2;
2383
2384#ifdef FLOPPY_SANITY_CHECK
2385 if (nr_sectors / ssize >
061837bc 2386 DIV_ROUND_UP(in_sector_offset + current_count_sectors, ssize)) {
1da177e4
LT
2387 DPRINT("long rw: %x instead of %lx\n",
2388 nr_sectors, current_count_sectors);
b46df356
JP
2389 pr_info("rs=%d s=%d\n", R_SECTOR, SECTOR);
2390 pr_info("rh=%d h=%d\n", R_HEAD, HEAD);
2391 pr_info("rt=%d t=%d\n", R_TRACK, TRACK);
2392 pr_info("heads=%d eoc=%d\n", heads, eoc);
2393 pr_info("spt=%d st=%d ss=%d\n",
2394 SECT_PER_TRACK, fsector_t, ssize);
2395 pr_info("in_sector_offset=%d\n", in_sector_offset);
1da177e4
LT
2396 }
2397#endif
2398
2399 nr_sectors -= in_sector_offset;
2400 INFBOUND(nr_sectors, 0);
2401 SUPBOUND(current_count_sectors, nr_sectors);
2402
2403 switch (interpret_errors()) {
2404 case 2:
2405 cont->redo();
2406 return;
2407 case 1:
2408 if (!current_count_sectors) {
2409 cont->error();
2410 cont->redo();
2411 return;
2412 }
2413 break;
2414 case 0:
2415 if (!current_count_sectors) {
2416 cont->redo();
2417 return;
2418 }
2419 current_type[current_drive] = _floppy;
2420 floppy_sizes[TOMINOR(current_drive)] = _floppy->size;
2421 break;
2422 }
2423
2424 if (probing) {
2425 if (DP->flags & FTD_MSG)
2426 DPRINT("Auto-detected floppy type %s in fd%d\n",
2427 _floppy->name, current_drive);
2428 current_type[current_drive] = _floppy;
2429 floppy_sizes[TOMINOR(current_drive)] = _floppy->size;
2430 probing = 0;
2431 }
2432
2433 if (CT(COMMAND) != FD_READ ||
2434 raw_cmd->kernel_data == current_req->buffer) {
2435 /* transfer directly from buffer */
2436 cont->done(1);
2437 } else if (CT(COMMAND) == FD_READ) {
2438 buffer_track = raw_cmd->track;
2439 buffer_drive = current_drive;
2440 INFBOUND(buffer_max, nr_sectors + fsector_t);
2441 }
2442 cont->redo();
2443}
2444
2445/* Compute maximal contiguous buffer size. */
2446static int buffer_chain_size(void)
2447{
1da177e4 2448 struct bio_vec *bv;
5705f702
N
2449 int size;
2450 struct req_iterator iter;
1da177e4
LT
2451 char *base;
2452
2453 base = bio_data(current_req->bio);
2454 size = 0;
2455
5705f702
N
2456 rq_for_each_segment(bv, current_req, iter) {
2457 if (page_address(bv->bv_page) + bv->bv_offset != base + size)
2458 break;
1da177e4 2459
5705f702 2460 size += bv->bv_len;
1da177e4
LT
2461 }
2462
2463 return size >> 9;
2464}
2465
2466/* Compute the maximal transfer size */
2467static int transfer_size(int ssize, int max_sector, int max_size)
2468{
2469 SUPBOUND(max_sector, fsector_t + max_size);
2470
2471 /* alignment */
2472 max_sector -= (max_sector % _floppy->sect) % ssize;
2473
2474 /* transfer size, beginning not aligned */
2475 current_count_sectors = max_sector - fsector_t;
2476
2477 return max_sector;
2478}
2479
2480/*
2481 * Move data from/to the track buffer to/from the buffer cache.
2482 */
2483static void copy_buffer(int ssize, int max_sector, int max_sector_2)
2484{
2485 int remaining; /* number of transferred 512-byte sectors */
2486 struct bio_vec *bv;
06f748c4
JJ
2487 char *buffer;
2488 char *dma_buffer;
5705f702
N
2489 int size;
2490 struct req_iterator iter;
1da177e4
LT
2491
2492 max_sector = transfer_size(ssize,
2493 min(max_sector, max_sector_2),
83096ebf 2494 blk_rq_sectors(current_req));
1da177e4
LT
2495
2496 if (current_count_sectors <= 0 && CT(COMMAND) == FD_WRITE &&
83096ebf 2497 buffer_max > fsector_t + blk_rq_sectors(current_req))
1da177e4 2498 current_count_sectors = min_t(int, buffer_max - fsector_t,
83096ebf 2499 blk_rq_sectors(current_req));
1da177e4
LT
2500
2501 remaining = current_count_sectors << 9;
2502#ifdef FLOPPY_SANITY_CHECK
1011c1b9 2503 if (remaining > blk_rq_bytes(current_req) && CT(COMMAND) == FD_WRITE) {
1da177e4 2504 DPRINT("in copy buffer\n");
b46df356
JP
2505 pr_info("current_count_sectors=%ld\n", current_count_sectors);
2506 pr_info("remaining=%d\n", remaining >> 9);
2507 pr_info("current_req->nr_sectors=%u\n",
2508 blk_rq_sectors(current_req));
2509 pr_info("current_req->current_nr_sectors=%u\n",
2510 blk_rq_cur_sectors(current_req));
2511 pr_info("max_sector=%d\n", max_sector);
2512 pr_info("ssize=%d\n", ssize);
1da177e4
LT
2513 }
2514#endif
2515
2516 buffer_max = max(max_sector, buffer_max);
2517
2518 dma_buffer = floppy_track_buffer + ((fsector_t - buffer_min) << 9);
2519
1011c1b9 2520 size = blk_rq_cur_bytes(current_req);
1da177e4 2521
5705f702
N
2522 rq_for_each_segment(bv, current_req, iter) {
2523 if (!remaining)
2524 break;
1da177e4 2525
5705f702
N
2526 size = bv->bv_len;
2527 SUPBOUND(size, remaining);
1da177e4 2528
5705f702 2529 buffer = page_address(bv->bv_page) + bv->bv_offset;
1da177e4 2530#ifdef FLOPPY_SANITY_CHECK
5705f702
N
2531 if (dma_buffer + size >
2532 floppy_track_buffer + (max_buffer_sectors << 10) ||
2533 dma_buffer < floppy_track_buffer) {
2534 DPRINT("buffer overrun in copy buffer %d\n",
b46df356
JP
2535 (int)((floppy_track_buffer - dma_buffer) >> 9));
2536 pr_info("fsector_t=%d buffer_min=%d\n",
2537 fsector_t, buffer_min);
2538 pr_info("current_count_sectors=%ld\n",
2539 current_count_sectors);
1da177e4 2540 if (CT(COMMAND) == FD_READ)
b46df356 2541 pr_info("read\n");
5705f702 2542 if (CT(COMMAND) == FD_WRITE)
b46df356 2543 pr_info("write\n");
5705f702 2544 break;
1da177e4 2545 }
5705f702
N
2546 if (((unsigned long)buffer) % 512)
2547 DPRINT("%p buffer not aligned\n", buffer);
2548#endif
2549 if (CT(COMMAND) == FD_READ)
2550 memcpy(buffer, dma_buffer, size);
2551 else
2552 memcpy(dma_buffer, buffer, size);
2553
2554 remaining -= size;
2555 dma_buffer += size;
1da177e4
LT
2556 }
2557#ifdef FLOPPY_SANITY_CHECK
2558 if (remaining) {
2559 if (remaining > 0)
2560 max_sector -= remaining >> 9;
2561 DPRINT("weirdness: remaining %d\n", remaining >> 9);
2562 }
2563#endif
2564}
2565
1da177e4
LT
2566/* work around a bug in pseudo DMA
2567 * (on some FDCs) pseudo DMA does not stop when the CPU stops
2568 * sending data. Hence we need a different way to signal the
2569 * transfer length: We use SECT_PER_TRACK. Unfortunately, this
2570 * does not work with MT, hence we can only transfer one head at
2571 * a time
2572 */
2573static void virtualdmabug_workaround(void)
2574{
06f748c4
JJ
2575 int hard_sectors;
2576 int end_sector;
1da177e4
LT
2577
2578 if (CT(COMMAND) == FD_WRITE) {
2579 COMMAND &= ~0x80; /* switch off multiple track mode */
2580
2581 hard_sectors = raw_cmd->length >> (7 + SIZECODE);
2582 end_sector = SECTOR + hard_sectors - 1;
2583#ifdef FLOPPY_SANITY_CHECK
2584 if (end_sector > SECT_PER_TRACK) {
b46df356
JP
2585 pr_info("too many sectors %d > %d\n",
2586 end_sector, SECT_PER_TRACK);
1da177e4
LT
2587 return;
2588 }
2589#endif
48c8cee6
JP
2590 SECT_PER_TRACK = end_sector;
2591 /* make sure SECT_PER_TRACK
2592 * points to end of transfer */
1da177e4
LT
2593 }
2594}
2595
2596/*
2597 * Formulate a read/write request.
2598 * this routine decides where to load the data (directly to buffer, or to
2599 * tmp floppy area), how much data to load (the size of the buffer, the whole
2600 * track, or a single sector)
2601 * All floppy_track_buffer handling goes in here. If we ever add track buffer
2602 * allocation on the fly, it should be done here. No other part should need
2603 * modification.
2604 */
2605
2606static int make_raw_rw_request(void)
2607{
2608 int aligned_sector_t;
06f748c4
JJ
2609 int max_sector;
2610 int max_size;
2611 int tracksize;
2612 int ssize;
1da177e4
LT
2613
2614 if (max_buffer_sectors == 0) {
b46df356 2615 pr_info("VFS: Block I/O scheduled on unopened device\n");
1da177e4
LT
2616 return 0;
2617 }
2618
2619 set_fdc((long)current_req->rq_disk->private_data);
2620
2621 raw_cmd = &default_raw_cmd;
2622 raw_cmd->flags = FD_RAW_SPIN | FD_RAW_NEED_DISK | FD_RAW_NEED_DISK |
2623 FD_RAW_NEED_SEEK;
2624 raw_cmd->cmd_count = NR_RW;
2625 if (rq_data_dir(current_req) == READ) {
2626 raw_cmd->flags |= FD_RAW_READ;
2627 COMMAND = FM_MODE(_floppy, FD_READ);
2628 } else if (rq_data_dir(current_req) == WRITE) {
2629 raw_cmd->flags |= FD_RAW_WRITE;
2630 COMMAND = FM_MODE(_floppy, FD_WRITE);
2631 } else {
2632 DPRINT("make_raw_rw_request: unknown command\n");
2633 return 0;
2634 }
2635
2636 max_sector = _floppy->sect * _floppy->head;
2637
83096ebf
TH
2638 TRACK = (int)blk_rq_pos(current_req) / max_sector;
2639 fsector_t = (int)blk_rq_pos(current_req) % max_sector;
1da177e4 2640 if (_floppy->track && TRACK >= _floppy->track) {
83096ebf 2641 if (blk_rq_cur_sectors(current_req) & 1) {
1da177e4
LT
2642 current_count_sectors = 1;
2643 return 1;
2644 } else
2645 return 0;
2646 }
2647 HEAD = fsector_t / _floppy->sect;
2648
9e49184c 2649 if (((_floppy->stretch & (FD_SWAPSIDES | FD_SECTBASEMASK)) ||
e0298536
JP
2650 test_bit(FD_NEED_TWADDLE_BIT, &DRS->flags)) &&
2651 fsector_t < _floppy->sect)
1da177e4
LT
2652 max_sector = _floppy->sect;
2653
2654 /* 2M disks have phantom sectors on the first track */
2655 if ((_floppy->rate & FD_2M) && (!TRACK) && (!HEAD)) {
2656 max_sector = 2 * _floppy->sect / 3;
2657 if (fsector_t >= max_sector) {
2658 current_count_sectors =
2659 min_t(int, _floppy->sect - fsector_t,
83096ebf 2660 blk_rq_sectors(current_req));
1da177e4
LT
2661 return 1;
2662 }
2663 SIZECODE = 2;
2664 } else
2665 SIZECODE = FD_SIZECODE(_floppy);
2666 raw_cmd->rate = _floppy->rate & 0x43;
2667 if ((_floppy->rate & FD_2M) && (TRACK || HEAD) && raw_cmd->rate == 2)
2668 raw_cmd->rate = 1;
2669
2670 if (SIZECODE)
2671 SIZECODE2 = 0xff;
2672 else
2673 SIZECODE2 = 0x80;
2674 raw_cmd->track = TRACK << STRETCH(_floppy);
2675 DR_SELECT = UNIT(current_drive) + PH_HEAD(_floppy, HEAD);
2676 GAP = _floppy->gap;
2677 CODE2SIZE;
2678 SECT_PER_TRACK = _floppy->sect << 2 >> SIZECODE;
2679 SECTOR = ((fsector_t % _floppy->sect) << 2 >> SIZECODE) +
9e49184c 2680 FD_SECTBASE(_floppy);
1da177e4
LT
2681
2682 /* tracksize describes the size which can be filled up with sectors
2683 * of size ssize.
2684 */
2685 tracksize = _floppy->sect - _floppy->sect % ssize;
2686 if (tracksize < _floppy->sect) {
2687 SECT_PER_TRACK++;
2688 if (tracksize <= fsector_t % _floppy->sect)
2689 SECTOR--;
2690
2691 /* if we are beyond tracksize, fill up using smaller sectors */
2692 while (tracksize <= fsector_t % _floppy->sect) {
2693 while (tracksize + ssize > _floppy->sect) {
2694 SIZECODE--;
2695 ssize >>= 1;
2696 }
2697 SECTOR++;
2698 SECT_PER_TRACK++;
2699 tracksize += ssize;
2700 }
2701 max_sector = HEAD * _floppy->sect + tracksize;
2702 } else if (!TRACK && !HEAD && !(_floppy->rate & FD_2M) && probing) {
2703 max_sector = _floppy->sect;
2704 } else if (!HEAD && CT(COMMAND) == FD_WRITE) {
2705 /* for virtual DMA bug workaround */
2706 max_sector = _floppy->sect;
2707 }
2708
2709 in_sector_offset = (fsector_t % _floppy->sect) % ssize;
2710 aligned_sector_t = fsector_t - in_sector_offset;
83096ebf 2711 max_size = blk_rq_sectors(current_req);
1da177e4
LT
2712 if ((raw_cmd->track == buffer_track) &&
2713 (current_drive == buffer_drive) &&
2714 (fsector_t >= buffer_min) && (fsector_t < buffer_max)) {
2715 /* data already in track buffer */
2716 if (CT(COMMAND) == FD_READ) {
2717 copy_buffer(1, max_sector, buffer_max);
2718 return 1;
2719 }
83096ebf 2720 } else if (in_sector_offset || blk_rq_sectors(current_req) < ssize) {
1da177e4 2721 if (CT(COMMAND) == FD_WRITE) {
d7b2b2ec
JP
2722 unsigned int sectors;
2723
2724 sectors = fsector_t + blk_rq_sectors(current_req);
2725 if (sectors > ssize && sectors < ssize + ssize)
1da177e4
LT
2726 max_size = ssize + ssize;
2727 else
2728 max_size = ssize;
2729 }
2730 raw_cmd->flags &= ~FD_RAW_WRITE;
2731 raw_cmd->flags |= FD_RAW_READ;
2732 COMMAND = FM_MODE(_floppy, FD_READ);
2733 } else if ((unsigned long)current_req->buffer < MAX_DMA_ADDRESS) {
2734 unsigned long dma_limit;
2735 int direct, indirect;
2736
2737 indirect =
2738 transfer_size(ssize, max_sector,
2739 max_buffer_sectors * 2) - fsector_t;
2740
2741 /*
2742 * Do NOT use minimum() here---MAX_DMA_ADDRESS is 64 bits wide
2743 * on a 64 bit machine!
2744 */
2745 max_size = buffer_chain_size();
d7b2b2ec
JP
2746 dma_limit = (MAX_DMA_ADDRESS -
2747 ((unsigned long)current_req->buffer)) >> 9;
a81ee544 2748 if ((unsigned long)max_size > dma_limit)
1da177e4 2749 max_size = dma_limit;
1da177e4
LT
2750 /* 64 kb boundaries */
2751 if (CROSS_64KB(current_req->buffer, max_size << 9))
2752 max_size = (K_64 -
2753 ((unsigned long)current_req->buffer) %
2754 K_64) >> 9;
2755 direct = transfer_size(ssize, max_sector, max_size) - fsector_t;
2756 /*
2757 * We try to read tracks, but if we get too many errors, we
2758 * go back to reading just one sector at a time.
2759 *
2760 * This means we should be able to read a sector even if there
2761 * are other bad sectors on this track.
2762 */
2763 if (!direct ||
2764 (indirect * 2 > direct * 3 &&
d7b2b2ec
JP
2765 *errors < DP->max_errors.read_track &&
2766 ((!probing ||
2767 (DP->read_track & (1 << DRS->probed_format)))))) {
83096ebf 2768 max_size = blk_rq_sectors(current_req);
1da177e4
LT
2769 } else {
2770 raw_cmd->kernel_data = current_req->buffer;
2771 raw_cmd->length = current_count_sectors << 9;
2772 if (raw_cmd->length == 0) {
d7b2b2ec
JP
2773 DPRINT("zero dma transfer attempted from make_raw_request\n");
2774 DPRINT("indirect=%d direct=%d fsector_t=%d\n",
1da177e4
LT
2775 indirect, direct, fsector_t);
2776 return 0;
2777 }
1da177e4
LT
2778 virtualdmabug_workaround();
2779 return 2;
2780 }
2781 }
2782
2783 if (CT(COMMAND) == FD_READ)
2784 max_size = max_sector; /* unbounded */
2785
2786 /* claim buffer track if needed */
2787 if (buffer_track != raw_cmd->track || /* bad track */
2788 buffer_drive != current_drive || /* bad drive */
2789 fsector_t > buffer_max ||
2790 fsector_t < buffer_min ||
2791 ((CT(COMMAND) == FD_READ ||
83096ebf 2792 (!in_sector_offset && blk_rq_sectors(current_req) >= ssize)) &&
1da177e4 2793 max_sector > 2 * max_buffer_sectors + buffer_min &&
bb57f0c6
JP
2794 max_size + fsector_t > 2 * max_buffer_sectors + buffer_min)) {
2795 /* not enough space */
1da177e4
LT
2796 buffer_track = -1;
2797 buffer_drive = current_drive;
2798 buffer_max = buffer_min = aligned_sector_t;
2799 }
2800 raw_cmd->kernel_data = floppy_track_buffer +
bb57f0c6 2801 ((aligned_sector_t - buffer_min) << 9);
1da177e4
LT
2802
2803 if (CT(COMMAND) == FD_WRITE) {
2804 /* copy write buffer to track buffer.
2805 * if we get here, we know that the write
2806 * is either aligned or the data already in the buffer
2807 * (buffer will be overwritten) */
2808#ifdef FLOPPY_SANITY_CHECK
2809 if (in_sector_offset && buffer_track == -1)
2810 DPRINT("internal error offset !=0 on write\n");
2811#endif
2812 buffer_track = raw_cmd->track;
2813 buffer_drive = current_drive;
2814 copy_buffer(ssize, max_sector,
2815 2 * max_buffer_sectors + buffer_min);
2816 } else
2817 transfer_size(ssize, max_sector,
2818 2 * max_buffer_sectors + buffer_min -
2819 aligned_sector_t);
2820
2821 /* round up current_count_sectors to get dma xfer size */
2822 raw_cmd->length = in_sector_offset + current_count_sectors;
2823 raw_cmd->length = ((raw_cmd->length - 1) | (ssize - 1)) + 1;
2824 raw_cmd->length <<= 9;
2825#ifdef FLOPPY_SANITY_CHECK
1da177e4
LT
2826 if ((raw_cmd->length < current_count_sectors << 9) ||
2827 (raw_cmd->kernel_data != current_req->buffer &&
2828 CT(COMMAND) == FD_WRITE &&
2829 (aligned_sector_t + (raw_cmd->length >> 9) > buffer_max ||
2830 aligned_sector_t < buffer_min)) ||
2831 raw_cmd->length % (128 << SIZECODE) ||
2832 raw_cmd->length <= 0 || current_count_sectors <= 0) {
2833 DPRINT("fractionary current count b=%lx s=%lx\n",
2834 raw_cmd->length, current_count_sectors);
2835 if (raw_cmd->kernel_data != current_req->buffer)
b46df356
JP
2836 pr_info("addr=%d, length=%ld\n",
2837 (int)((raw_cmd->kernel_data -
2838 floppy_track_buffer) >> 9),
2839 current_count_sectors);
2840 pr_info("st=%d ast=%d mse=%d msi=%d\n",
2841 fsector_t, aligned_sector_t, max_sector, max_size);
2842 pr_info("ssize=%x SIZECODE=%d\n", ssize, SIZECODE);
2843 pr_info("command=%x SECTOR=%d HEAD=%d, TRACK=%d\n",
2844 COMMAND, SECTOR, HEAD, TRACK);
2845 pr_info("buffer drive=%d\n", buffer_drive);
2846 pr_info("buffer track=%d\n", buffer_track);
2847 pr_info("buffer_min=%d\n", buffer_min);
2848 pr_info("buffer_max=%d\n", buffer_max);
1da177e4
LT
2849 return 0;
2850 }
2851
2852 if (raw_cmd->kernel_data != current_req->buffer) {
2853 if (raw_cmd->kernel_data < floppy_track_buffer ||
2854 current_count_sectors < 0 ||
2855 raw_cmd->length < 0 ||
2856 raw_cmd->kernel_data + raw_cmd->length >
2857 floppy_track_buffer + (max_buffer_sectors << 10)) {
2858 DPRINT("buffer overrun in schedule dma\n");
b46df356
JP
2859 pr_info("fsector_t=%d buffer_min=%d current_count=%ld\n",
2860 fsector_t, buffer_min, raw_cmd->length >> 9);
2861 pr_info("current_count_sectors=%ld\n",
2862 current_count_sectors);
1da177e4 2863 if (CT(COMMAND) == FD_READ)
b46df356 2864 pr_info("read\n");
1da177e4 2865 if (CT(COMMAND) == FD_WRITE)
b46df356 2866 pr_info("write\n");
1da177e4
LT
2867 return 0;
2868 }
1011c1b9 2869 } else if (raw_cmd->length > blk_rq_bytes(current_req) ||
83096ebf 2870 current_count_sectors > blk_rq_sectors(current_req)) {
1da177e4
LT
2871 DPRINT("buffer overrun in direct transfer\n");
2872 return 0;
2873 } else if (raw_cmd->length < current_count_sectors << 9) {
2874 DPRINT("more sectors than bytes\n");
b46df356
JP
2875 pr_info("bytes=%ld\n", raw_cmd->length >> 9);
2876 pr_info("sectors=%ld\n", current_count_sectors);
1da177e4
LT
2877 }
2878 if (raw_cmd->length == 0) {
2879 DPRINT("zero dma transfer attempted from make_raw_request\n");
2880 return 0;
2881 }
2882#endif
2883
2884 virtualdmabug_workaround();
2885 return 2;
2886}
2887
2888static void redo_fd_request(void)
2889{
2890#define REPEAT {request_done(0); continue; }
2891 int drive;
2892 int tmp;
2893
2894 lastredo = jiffies;
2895 if (current_drive < N_DRIVE)
2896 floppy_off(current_drive);
2897
2898 for (;;) {
2899 if (!current_req) {
2900 struct request *req;
2901
2902 spin_lock_irq(floppy_queue->queue_lock);
9934c8c0 2903 req = blk_fetch_request(floppy_queue);
1da177e4
LT
2904 spin_unlock_irq(floppy_queue->queue_lock);
2905 if (!req) {
2906 do_floppy = NULL;
2907 unlock_fdc();
2908 return;
2909 }
2910 current_req = req;
2911 }
2912 drive = (long)current_req->rq_disk->private_data;
2913 set_fdc(drive);
2914 reschedule_timeout(current_reqD, "redo fd request", 0);
2915
2916 set_floppy(drive);
2917 raw_cmd = &default_raw_cmd;
2918 raw_cmd->flags = 0;
2919 if (start_motor(redo_fd_request))
2920 return;
2921 disk_change(current_drive);
2922 if (test_bit(current_drive, &fake_change) ||
e0298536 2923 test_bit(FD_DISK_CHANGED_BIT, &DRS->flags)) {
1da177e4
LT
2924 DPRINT("disk absent or changed during operation\n");
2925 REPEAT;
2926 }
2927 if (!_floppy) { /* Autodetection */
2928 if (!probing) {
2929 DRS->probed_format = 0;
2930 if (next_valid_format()) {
2931 DPRINT("no autodetectable formats\n");
2932 _floppy = NULL;
2933 REPEAT;
2934 }
2935 }
2936 probing = 1;
2937 _floppy =
2938 floppy_type + DP->autodetect[DRS->probed_format];
2939 } else
2940 probing = 0;
2941 errors = &(current_req->errors);
2942 tmp = make_raw_rw_request();
2943 if (tmp < 2) {
2944 request_done(tmp);
2945 continue;
2946 }
2947
e0298536 2948 if (test_bit(FD_NEED_TWADDLE_BIT, &DRS->flags))
1da177e4
LT
2949 twaddle();
2950 schedule_bh(floppy_start);
2951 debugt("queue fd request");
2952 return;
2953 }
2954#undef REPEAT
2955}
2956
2957static struct cont_t rw_cont = {
2958 .interrupt = rw_interrupt,
2959 .redo = redo_fd_request,
2960 .error = bad_flp_intr,
2961 .done = request_done
2962};
2963
2964static void process_fd_request(void)
2965{
2966 cont = &rw_cont;
2967 schedule_bh(redo_fd_request);
2968}
2969
d7b2b2ec 2970static void do_fd_request(struct request_queue *q)
1da177e4
LT
2971{
2972 if (max_buffer_sectors == 0) {
b46df356 2973 pr_info("VFS: do_fd_request called on non-open device\n");
1da177e4
LT
2974 return;
2975 }
2976
2977 if (usage_count == 0) {
b46df356
JP
2978 pr_info("warning: usage count=0, current_req=%p exiting\n",
2979 current_req);
2980 pr_info("sect=%ld type=%x flags=%x\n",
2981 (long)blk_rq_pos(current_req), current_req->cmd_type,
2982 current_req->cmd_flags);
1da177e4
LT
2983 return;
2984 }
2985 if (test_bit(0, &fdc_busy)) {
2986 /* fdc busy, this new request will be treated when the
2987 current one is done */
2988 is_alive("do fd request, old request running");
2989 return;
2990 }
74f63f46 2991 lock_fdc(MAXTIMEOUT, false);
1da177e4
LT
2992 process_fd_request();
2993 is_alive("do fd request");
2994}
2995
2996static struct cont_t poll_cont = {
2997 .interrupt = success_and_wakeup,
2998 .redo = floppy_ready,
2999 .error = generic_failure,
3000 .done = generic_done
3001};
3002
74f63f46 3003static int poll_drive(bool interruptible, int flag)
1da177e4 3004{
1da177e4
LT
3005 /* no auto-sense, just clear dcl */
3006 raw_cmd = &default_raw_cmd;
3007 raw_cmd->flags = flag;
3008 raw_cmd->track = 0;
3009 raw_cmd->cmd_count = 0;
3010 cont = &poll_cont;
87f530d8 3011 debug_dcl(DP->flags, "setting NEWCHANGE in poll_drive\n");
e0298536 3012 set_bit(FD_DISK_NEWCHANGE_BIT, &DRS->flags);
55eee80c
JP
3013
3014 return wait_til_done(floppy_ready, interruptible);
1da177e4
LT
3015}
3016
3017/*
3018 * User triggered reset
3019 * ====================
3020 */
3021
3022static void reset_intr(void)
3023{
b46df356 3024 pr_info("weird, reset interrupt called\n");
1da177e4
LT
3025}
3026
3027static struct cont_t reset_cont = {
3028 .interrupt = reset_intr,
3029 .redo = success_and_wakeup,
3030 .error = generic_failure,
3031 .done = generic_done
3032};
3033
74f63f46 3034static int user_reset_fdc(int drive, int arg, bool interruptible)
1da177e4
LT
3035{
3036 int ret;
3037
52a0d61f
JP
3038 if (lock_fdc(drive, interruptible))
3039 return -EINTR;
3040
1da177e4
LT
3041 if (arg == FD_RESET_ALWAYS)
3042 FDCS->reset = 1;
3043 if (FDCS->reset) {
3044 cont = &reset_cont;
55eee80c
JP
3045 ret = wait_til_done(reset_fdc, interruptible);
3046 if (ret == -EINTR)
3047 return -EINTR;
1da177e4
LT
3048 }
3049 process_fd_request();
52a0d61f 3050 return 0;
1da177e4
LT
3051}
3052
3053/*
3054 * Misc Ioctl's and support
3055 * ========================
3056 */
3057static inline int fd_copyout(void __user *param, const void *address,
3058 unsigned long size)
3059{
3060 return copy_to_user(param, address, size) ? -EFAULT : 0;
3061}
3062
48c8cee6
JP
3063static inline int fd_copyin(void __user *param, void *address,
3064 unsigned long size)
1da177e4
LT
3065{
3066 return copy_from_user(address, param, size) ? -EFAULT : 0;
3067}
3068
1da177e4
LT
3069static inline const char *drive_name(int type, int drive)
3070{
3071 struct floppy_struct *floppy;
3072
3073 if (type)
3074 floppy = floppy_type + type;
3075 else {
3076 if (UDP->native_format)
3077 floppy = floppy_type + UDP->native_format;
3078 else
3079 return "(null)";
3080 }
3081 if (floppy->name)
3082 return floppy->name;
3083 else
3084 return "(null)";
3085}
3086
3087/* raw commands */
3088static void raw_cmd_done(int flag)
3089{
3090 int i;
3091
3092 if (!flag) {
3093 raw_cmd->flags |= FD_RAW_FAILURE;
3094 raw_cmd->flags |= FD_RAW_HARDFAILURE;
3095 } else {
3096 raw_cmd->reply_count = inr;
3097 if (raw_cmd->reply_count > MAX_REPLIES)
3098 raw_cmd->reply_count = 0;
3099 for (i = 0; i < raw_cmd->reply_count; i++)
3100 raw_cmd->reply[i] = reply_buffer[i];
3101
3102 if (raw_cmd->flags & (FD_RAW_READ | FD_RAW_WRITE)) {
3103 unsigned long flags;
3104 flags = claim_dma_lock();
3105 raw_cmd->length = fd_get_dma_residue();
3106 release_dma_lock(flags);
3107 }
3108
3109 if ((raw_cmd->flags & FD_RAW_SOFTFAILURE) &&
3110 (!raw_cmd->reply_count || (raw_cmd->reply[0] & 0xc0)))
3111 raw_cmd->flags |= FD_RAW_FAILURE;
3112
3113 if (disk_change(current_drive))
3114 raw_cmd->flags |= FD_RAW_DISK_CHANGE;
3115 else
3116 raw_cmd->flags &= ~FD_RAW_DISK_CHANGE;
3117 if (raw_cmd->flags & FD_RAW_NO_MOTOR_AFTER)
3118 motor_off_callback(current_drive);
3119
3120 if (raw_cmd->next &&
3121 (!(raw_cmd->flags & FD_RAW_FAILURE) ||
3122 !(raw_cmd->flags & FD_RAW_STOP_IF_FAILURE)) &&
3123 ((raw_cmd->flags & FD_RAW_FAILURE) ||
3124 !(raw_cmd->flags & FD_RAW_STOP_IF_SUCCESS))) {
3125 raw_cmd = raw_cmd->next;
3126 return;
3127 }
3128 }
3129 generic_done(flag);
3130}
3131
3132static struct cont_t raw_cmd_cont = {
3133 .interrupt = success_and_wakeup,
3134 .redo = floppy_start,
3135 .error = generic_failure,
3136 .done = raw_cmd_done
3137};
3138
3139static inline int raw_cmd_copyout(int cmd, char __user *param,
3140 struct floppy_raw_cmd *ptr)
3141{
3142 int ret;
3143
3144 while (ptr) {
86b12b48
JP
3145 ret = copy_to_user((void __user *)param, ptr, sizeof(*ptr));
3146 if (ret)
3147 return -EFAULT;
1da177e4
LT
3148 param += sizeof(struct floppy_raw_cmd);
3149 if ((ptr->flags & FD_RAW_READ) && ptr->buffer_length) {
bb57f0c6
JP
3150 if (ptr->length >= 0 &&
3151 ptr->length <= ptr->buffer_length) {
3152 long length = ptr->buffer_length - ptr->length;
4575b552
JP
3153 ret = fd_copyout(ptr->data, ptr->kernel_data,
3154 length);
3155 if (ret)
3156 return ret;
bb57f0c6 3157 }
1da177e4
LT
3158 }
3159 ptr = ptr->next;
3160 }
3161 return 0;
3162}
3163
3164static void raw_cmd_free(struct floppy_raw_cmd **ptr)
3165{
06f748c4
JJ
3166 struct floppy_raw_cmd *next;
3167 struct floppy_raw_cmd *this;
1da177e4
LT
3168
3169 this = *ptr;
3170 *ptr = NULL;
3171 while (this) {
3172 if (this->buffer_length) {
3173 fd_dma_mem_free((unsigned long)this->kernel_data,
3174 this->buffer_length);
3175 this->buffer_length = 0;
3176 }
3177 next = this->next;
3178 kfree(this);
3179 this = next;
3180 }
3181}
3182
3183static inline int raw_cmd_copyin(int cmd, char __user *param,
3184 struct floppy_raw_cmd **rcmd)
3185{
3186 struct floppy_raw_cmd *ptr;
3187 int ret;
3188 int i;
3189
3190 *rcmd = NULL;
3191 while (1) {
3192 ptr = (struct floppy_raw_cmd *)
3193 kmalloc(sizeof(struct floppy_raw_cmd), GFP_USER);
3194 if (!ptr)
3195 return -ENOMEM;
3196 *rcmd = ptr;
86b12b48
JP
3197 ret = copy_from_user(ptr, (void __user *)param, sizeof(*ptr));
3198 if (ret)
3199 return -EFAULT;
1da177e4
LT
3200 ptr->next = NULL;
3201 ptr->buffer_length = 0;
3202 param += sizeof(struct floppy_raw_cmd);
3203 if (ptr->cmd_count > 33)
3204 /* the command may now also take up the space
3205 * initially intended for the reply & the
3206 * reply count. Needed for long 82078 commands
3207 * such as RESTORE, which takes ... 17 command
3208 * bytes. Murphy's law #137: When you reserve
3209 * 16 bytes for a structure, you'll one day
3210 * discover that you really need 17...
3211 */
3212 return -EINVAL;
3213
3214 for (i = 0; i < 16; i++)
3215 ptr->reply[i] = 0;
3216 ptr->resultcode = 0;
3217 ptr->kernel_data = NULL;
3218
3219 if (ptr->flags & (FD_RAW_READ | FD_RAW_WRITE)) {
3220 if (ptr->length <= 0)
3221 return -EINVAL;
3222 ptr->kernel_data =
3223 (char *)fd_dma_mem_alloc(ptr->length);
3224 fallback_on_nodma_alloc(&ptr->kernel_data, ptr->length);
3225 if (!ptr->kernel_data)
3226 return -ENOMEM;
3227 ptr->buffer_length = ptr->length;
3228 }
4575b552
JP
3229 if (ptr->flags & FD_RAW_WRITE) {
3230 ret = fd_copyin(ptr->data, ptr->kernel_data,
3231 ptr->length);
3232 if (ret)
3233 return ret;
3234 }
1da177e4
LT
3235 rcmd = &(ptr->next);
3236 if (!(ptr->flags & FD_RAW_MORE))
3237 return 0;
3238 ptr->rate &= 0x43;
3239 }
3240}
3241
3242static int raw_cmd_ioctl(int cmd, void __user *param)
3243{
1da177e4 3244 struct floppy_raw_cmd *my_raw_cmd;
06f748c4
JJ
3245 int drive;
3246 int ret2;
3247 int ret;
1da177e4
LT
3248
3249 if (FDCS->rawcmd <= 1)
3250 FDCS->rawcmd = 1;
3251 for (drive = 0; drive < N_DRIVE; drive++) {
3252 if (FDC(drive) != fdc)
3253 continue;
3254 if (drive == current_drive) {
3255 if (UDRS->fd_ref > 1) {
3256 FDCS->rawcmd = 2;
3257 break;
3258 }
3259 } else if (UDRS->fd_ref) {
3260 FDCS->rawcmd = 2;
3261 break;
3262 }
3263 }
3264
3265 if (FDCS->reset)
3266 return -EIO;
3267
3268 ret = raw_cmd_copyin(cmd, param, &my_raw_cmd);
3269 if (ret) {
3270 raw_cmd_free(&my_raw_cmd);
3271 return ret;
3272 }
3273
3274 raw_cmd = my_raw_cmd;
3275 cont = &raw_cmd_cont;
74f63f46 3276 ret = wait_til_done(floppy_start, true);
87f530d8 3277 debug_dcl(DP->flags, "calling disk change from raw_cmd ioctl\n");
1da177e4
LT
3278
3279 if (ret != -EINTR && FDCS->reset)
3280 ret = -EIO;
3281
3282 DRS->track = NO_TRACK;
3283
3284 ret2 = raw_cmd_copyout(cmd, param, my_raw_cmd);
3285 if (!ret)
3286 ret = ret2;
3287 raw_cmd_free(&my_raw_cmd);
3288 return ret;
3289}
3290
3291static int invalidate_drive(struct block_device *bdev)
3292{
3293 /* invalidate the buffer track to force a reread */
3294 set_bit((long)bdev->bd_disk->private_data, &fake_change);
3295 process_fd_request();
3296 check_disk_change(bdev);
3297 return 0;
3298}
3299
3300static inline int set_geometry(unsigned int cmd, struct floppy_struct *g,
3301 int drive, int type, struct block_device *bdev)
3302{
3303 int cnt;
3304
3305 /* sanity checking for parameters. */
3306 if (g->sect <= 0 ||
3307 g->head <= 0 ||
3308 g->track <= 0 || g->track > UDP->tracks >> STRETCH(g) ||
3309 /* check if reserved bits are set */
9e49184c 3310 (g->stretch & ~(FD_STRETCH | FD_SWAPSIDES | FD_SECTBASEMASK)) != 0)
1da177e4
LT
3311 return -EINVAL;
3312 if (type) {
3313 if (!capable(CAP_SYS_ADMIN))
3314 return -EPERM;
b1c82b5c 3315 mutex_lock(&open_lock);
74f63f46 3316 if (lock_fdc(drive, true)) {
8516a500
JS
3317 mutex_unlock(&open_lock);
3318 return -EINTR;
3319 }
1da177e4
LT
3320 floppy_type[type] = *g;
3321 floppy_type[type].name = "user format";
3322 for (cnt = type << 2; cnt < (type << 2) + 4; cnt++)
3323 floppy_sizes[cnt] = floppy_sizes[cnt + 0x80] =
3324 floppy_type[type].size + 1;
3325 process_fd_request();
3326 for (cnt = 0; cnt < N_DRIVE; cnt++) {
3327 struct block_device *bdev = opened_bdev[cnt];
3328 if (!bdev || ITYPE(drive_state[cnt].fd_device) != type)
3329 continue;
2ef41634 3330 __invalidate_device(bdev);
1da177e4 3331 }
b1c82b5c 3332 mutex_unlock(&open_lock);
1da177e4
LT
3333 } else {
3334 int oldStretch;
52a0d61f 3335
74f63f46 3336 if (lock_fdc(drive, true))
52a0d61f 3337 return -EINTR;
4575b552 3338 if (cmd != FDDEFPRM) {
1da177e4
LT
3339 /* notice a disk change immediately, else
3340 * we lose our settings immediately*/
74f63f46 3341 if (poll_drive(true, FD_RAW_NEED_DISK) == -EINTR)
4575b552
JP
3342 return -EINTR;
3343 }
1da177e4
LT
3344 oldStretch = g->stretch;
3345 user_params[drive] = *g;
3346 if (buffer_drive == drive)
3347 SUPBOUND(buffer_max, user_params[drive].sect);
3348 current_type[drive] = &user_params[drive];
3349 floppy_sizes[drive] = user_params[drive].size;
3350 if (cmd == FDDEFPRM)
3351 DRS->keep_data = -1;
3352 else
3353 DRS->keep_data = 1;
3354 /* invalidation. Invalidate only when needed, i.e.
3355 * when there are already sectors in the buffer cache
3356 * whose number will change. This is useful, because
3357 * mtools often changes the geometry of the disk after
3358 * looking at the boot block */
3359 if (DRS->maxblock > user_params[drive].sect ||
3360 DRS->maxtrack ||
3361 ((user_params[drive].sect ^ oldStretch) &
9e49184c 3362 (FD_SWAPSIDES | FD_SECTBASEMASK)))
1da177e4
LT
3363 invalidate_drive(bdev);
3364 else
3365 process_fd_request();
3366 }
3367 return 0;
3368}
3369
3370/* handle obsolete ioctl's */
3371static int ioctl_table[] = {
3372 FDCLRPRM,
3373 FDSETPRM,
3374 FDDEFPRM,
3375 FDGETPRM,
3376 FDMSGON,
3377 FDMSGOFF,
3378 FDFMTBEG,
3379 FDFMTTRK,
3380 FDFMTEND,
3381 FDSETEMSGTRESH,
3382 FDFLUSH,
3383 FDSETMAXERRS,
3384 FDGETMAXERRS,
3385 FDGETDRVTYP,
3386 FDSETDRVPRM,
3387 FDGETDRVPRM,
3388 FDGETDRVSTAT,
3389 FDPOLLDRVSTAT,
3390 FDRESET,
3391 FDGETFDCSTAT,
3392 FDWERRORCLR,
3393 FDWERRORGET,
3394 FDRAWCMD,
3395 FDEJECT,
3396 FDTWADDLE
3397};
3398
3399static inline int normalize_ioctl(int *cmd, int *size)
3400{
3401 int i;
3402
3403 for (i = 0; i < ARRAY_SIZE(ioctl_table); i++) {
3404 if ((*cmd & 0xffff) == (ioctl_table[i] & 0xffff)) {
3405 *size = _IOC_SIZE(*cmd);
3406 *cmd = ioctl_table[i];
3407 if (*size > _IOC_SIZE(*cmd)) {
b46df356 3408 pr_info("ioctl not yet supported\n");
1da177e4
LT
3409 return -EFAULT;
3410 }
3411 return 0;
3412 }
3413 }
3414 return -EINVAL;
3415}
3416
3417static int get_floppy_geometry(int drive, int type, struct floppy_struct **g)
3418{
3419 if (type)
3420 *g = &floppy_type[type];
3421 else {
74f63f46 3422 if (lock_fdc(drive, false))
52a0d61f 3423 return -EINTR;
74f63f46 3424 if (poll_drive(false, 0) == -EINTR)
4575b552 3425 return -EINTR;
1da177e4
LT
3426 process_fd_request();
3427 *g = current_type[drive];
3428 }
3429 if (!*g)
3430 return -ENODEV;
3431 return 0;
3432}
3433
a885c8c4
CH
3434static int fd_getgeo(struct block_device *bdev, struct hd_geometry *geo)
3435{
3436 int drive = (long)bdev->bd_disk->private_data;
3437 int type = ITYPE(drive_state[drive].fd_device);
3438 struct floppy_struct *g;
3439 int ret;
3440
3441 ret = get_floppy_geometry(drive, type, &g);
3442 if (ret)
3443 return ret;
3444
3445 geo->heads = g->head;
3446 geo->sectors = g->sect;
3447 geo->cylinders = g->track;
3448 return 0;
3449}
3450
a4af9b48 3451static int fd_ioctl(struct block_device *bdev, fmode_t mode, unsigned int cmd,
1da177e4
LT
3452 unsigned long param)
3453{
a4af9b48 3454#define FD_IOCTL_ALLOWED (mode & (FMODE_WRITE|FMODE_WRITE_IOCTL))
1da177e4 3455
a4af9b48 3456 int drive = (long)bdev->bd_disk->private_data;
06f748c4
JJ
3457 int type = ITYPE(UDRS->fd_device);
3458 int i;
1da177e4
LT
3459 int ret;
3460 int size;
3461 union inparam {
3462 struct floppy_struct g; /* geometry */
3463 struct format_descr f;
3464 struct floppy_max_errors max_errors;
3465 struct floppy_drive_params dp;
3466 } inparam; /* parameters coming from user space */
3467 const char *outparam; /* parameters passed back to user space */
3468
3469 /* convert compatibility eject ioctls into floppy eject ioctl.
3470 * We do this in order to provide a means to eject floppy disks before
3471 * installing the new fdutils package */
3472 if (cmd == CDROMEJECT || /* CD-ROM eject */
a81ee544 3473 cmd == 0x6470) { /* SunOS floppy eject */
1da177e4
LT
3474 DPRINT("obsolete eject ioctl\n");
3475 DPRINT("please use floppycontrol --eject\n");
3476 cmd = FDEJECT;
3477 }
3478
a81ee544 3479 if (!((cmd & 0xff00) == 0x0200))
1da177e4
LT
3480 return -EINVAL;
3481
a81ee544 3482 /* convert the old style command into a new style command */
4575b552
JP
3483 ret = normalize_ioctl(&cmd, &size);
3484 if (ret)
3485 return ret;
a81ee544 3486
1da177e4
LT
3487 /* permission checks */
3488 if (((cmd & 0x40) && !FD_IOCTL_ALLOWED) ||
3489 ((cmd & 0x80) && !capable(CAP_SYS_ADMIN)))
3490 return -EPERM;
3491
2886a8bd
AV
3492 if (WARN_ON(size < 0 || size > sizeof(inparam)))
3493 return -EINVAL;
3494
1da177e4 3495 /* copyin */
b87c9e0a 3496 memset(&inparam, 0, sizeof(inparam));
4575b552
JP
3497 if (_IOC_DIR(cmd) & _IOC_WRITE) {
3498 ret = fd_copyin((void __user *)param, &inparam, size);
3499 if (ret)
3500 return ret;
3501 }
1da177e4 3502
da273653
JP
3503 switch (cmd) {
3504 case FDEJECT:
3505 if (UDRS->fd_ref != 1)
3506 /* somebody else has this drive open */
3507 return -EBUSY;
74f63f46 3508 if (lock_fdc(drive, true))
52a0d61f 3509 return -EINTR;
1da177e4 3510
da273653
JP
3511 /* do the actual eject. Fails on
3512 * non-Sparc architectures */
3513 ret = fd_eject(UNIT(drive));
1da177e4 3514
e0298536
JP
3515 set_bit(FD_DISK_CHANGED_BIT, &UDRS->flags);
3516 set_bit(FD_VERIFY_BIT, &UDRS->flags);
da273653
JP
3517 process_fd_request();
3518 return ret;
3519 case FDCLRPRM:
74f63f46 3520 if (lock_fdc(drive, true))
52a0d61f 3521 return -EINTR;
da273653
JP
3522 current_type[drive] = NULL;
3523 floppy_sizes[drive] = MAX_DISK_SIZE << 1;
3524 UDRS->keep_data = 0;
3525 return invalidate_drive(bdev);
3526 case FDSETPRM:
3527 case FDDEFPRM:
3528 return set_geometry(cmd, &inparam.g, drive, type, bdev);
3529 case FDGETPRM:
4575b552 3530 ret = get_floppy_geometry(drive, type,
da273653 3531 (struct floppy_struct **)
4575b552
JP
3532 &outparam);
3533 if (ret)
3534 return ret;
da273653
JP
3535 break;
3536 case FDMSGON:
3537 UDP->flags |= FTD_MSG;
3538 return 0;
3539 case FDMSGOFF:
3540 UDP->flags &= ~FTD_MSG;
3541 return 0;
3542 case FDFMTBEG:
74f63f46 3543 if (lock_fdc(drive, true))
52a0d61f 3544 return -EINTR;
74f63f46 3545 if (poll_drive(true, FD_RAW_NEED_DISK) == -EINTR)
4575b552 3546 return -EINTR;
da273653
JP
3547 ret = UDRS->flags;
3548 process_fd_request();
3549 if (ret & FD_VERIFY)
3550 return -ENODEV;
3551 if (!(ret & FD_DISK_WRITABLE))
3552 return -EROFS;
3553 return 0;
3554 case FDFMTTRK:
3555 if (UDRS->fd_ref != 1)
3556 return -EBUSY;
3557 return do_format(drive, &inparam.f);
3558 case FDFMTEND:
3559 case FDFLUSH:
74f63f46 3560 if (lock_fdc(drive, true))
52a0d61f 3561 return -EINTR;
da273653
JP
3562 return invalidate_drive(bdev);
3563 case FDSETEMSGTRESH:
3564 UDP->max_errors.reporting = (unsigned short)(param & 0x0f);
3565 return 0;
3566 case FDGETMAXERRS:
3567 outparam = (const char *)&UDP->max_errors;
3568 break;
3569 case FDSETMAXERRS:
3570 UDP->max_errors = inparam.max_errors;
3571 break;
3572 case FDGETDRVTYP:
3573 outparam = drive_name(type, drive);
3574 SUPBOUND(size, strlen(outparam) + 1);
3575 break;
3576 case FDSETDRVPRM:
3577 *UDP = inparam.dp;
3578 break;
3579 case FDGETDRVPRM:
3580 outparam = (const char *)UDP;
3581 break;
3582 case FDPOLLDRVSTAT:
74f63f46 3583 if (lock_fdc(drive, true))
52a0d61f 3584 return -EINTR;
74f63f46 3585 if (poll_drive(true, FD_RAW_NEED_DISK) == -EINTR)
4575b552 3586 return -EINTR;
da273653
JP
3587 process_fd_request();
3588 /* fall through */
3589 case FDGETDRVSTAT:
3590 outparam = (const char *)UDRS;
3591 break;
3592 case FDRESET:
74f63f46 3593 return user_reset_fdc(drive, (int)param, true);
da273653
JP
3594 case FDGETFDCSTAT:
3595 outparam = (const char *)UFDCS;
3596 break;
3597 case FDWERRORCLR:
3598 memset(UDRWE, 0, sizeof(*UDRWE));
3599 return 0;
3600 case FDWERRORGET:
3601 outparam = (const char *)UDRWE;
3602 break;
3603 case FDRAWCMD:
3604 if (type)
1da177e4 3605 return -EINVAL;
74f63f46 3606 if (lock_fdc(drive, true))
52a0d61f 3607 return -EINTR;
da273653 3608 set_floppy(drive);
4575b552
JP
3609 i = raw_cmd_ioctl(cmd, (void __user *)param);
3610 if (i == -EINTR)
3611 return -EINTR;
da273653
JP
3612 process_fd_request();
3613 return i;
3614 case FDTWADDLE:
74f63f46 3615 if (lock_fdc(drive, true))
52a0d61f 3616 return -EINTR;
da273653
JP
3617 twaddle();
3618 process_fd_request();
3619 return 0;
3620 default:
3621 return -EINVAL;
3622 }
1da177e4
LT
3623
3624 if (_IOC_DIR(cmd) & _IOC_READ)
3625 return fd_copyout((void __user *)param, outparam, size);
da273653
JP
3626
3627 return 0;
1da177e4
LT
3628}
3629
3630static void __init config_types(void)
3631{
b46df356 3632 bool has_drive = false;
1da177e4
LT
3633 int drive;
3634
3635 /* read drive info out of physical CMOS */
3636 drive = 0;
3637 if (!UDP->cmos)
3638 UDP->cmos = FLOPPY0_TYPE;
3639 drive = 1;
3640 if (!UDP->cmos && FLOPPY1_TYPE)
3641 UDP->cmos = FLOPPY1_TYPE;
3642
06f748c4 3643 /* FIXME: additional physical CMOS drive detection should go here */
1da177e4
LT
3644
3645 for (drive = 0; drive < N_DRIVE; drive++) {
3646 unsigned int type = UDP->cmos;
3647 struct floppy_drive_params *params;
3648 const char *name = NULL;
3649 static char temparea[32];
3650
945f390f 3651 if (type < ARRAY_SIZE(default_drive_params)) {
1da177e4
LT
3652 params = &default_drive_params[type].params;
3653 if (type) {
3654 name = default_drive_params[type].name;
3655 allowed_drive_mask |= 1 << drive;
3656 } else
3657 allowed_drive_mask &= ~(1 << drive);
3658 } else {
3659 params = &default_drive_params[0].params;
3660 sprintf(temparea, "unknown type %d (usb?)", type);
3661 name = temparea;
3662 }
3663 if (name) {
b46df356
JP
3664 const char *prepend;
3665 if (!has_drive) {
3666 prepend = "";
3667 has_drive = true;
3668 pr_info("Floppy drive(s):");
3669 } else {
3670 prepend = ",";
1da177e4 3671 }
b46df356
JP
3672
3673 pr_cont("%s fd%d is %s", prepend, drive, name);
1da177e4
LT
3674 }
3675 *UDP = *params;
3676 }
b46df356
JP
3677
3678 if (has_drive)
3679 pr_cont("\n");
1da177e4
LT
3680}
3681
a4af9b48 3682static int floppy_release(struct gendisk *disk, fmode_t mode)
1da177e4 3683{
a4af9b48 3684 int drive = (long)disk->private_data;
1da177e4 3685
b1c82b5c 3686 mutex_lock(&open_lock);
1da177e4
LT
3687 if (UDRS->fd_ref < 0)
3688 UDRS->fd_ref = 0;
3689 else if (!UDRS->fd_ref--) {
3690 DPRINT("floppy_release with fd_ref == 0");
3691 UDRS->fd_ref = 0;
3692 }
3693 if (!UDRS->fd_ref)
3694 opened_bdev[drive] = NULL;
b1c82b5c 3695 mutex_unlock(&open_lock);
3e541a4a 3696
1da177e4
LT
3697 return 0;
3698}
3699
3700/*
3701 * floppy_open check for aliasing (/dev/fd0 can be the same as
3702 * /dev/PS0 etc), and disallows simultaneous access to the same
3703 * drive with different device numbers.
3704 */
a4af9b48 3705static int floppy_open(struct block_device *bdev, fmode_t mode)
1da177e4 3706{
a4af9b48
AV
3707 int drive = (long)bdev->bd_disk->private_data;
3708 int old_dev, new_dev;
1da177e4
LT
3709 int try;
3710 int res = -EBUSY;
3711 char *tmp;
3712
b1c82b5c 3713 mutex_lock(&open_lock);
1da177e4 3714 old_dev = UDRS->fd_device;
a4af9b48 3715 if (opened_bdev[drive] && opened_bdev[drive] != bdev)
1da177e4
LT
3716 goto out2;
3717
3718 if (!UDRS->fd_ref && (UDP->flags & FD_BROKEN_DCL)) {
e0298536
JP
3719 set_bit(FD_DISK_CHANGED_BIT, &UDRS->flags);
3720 set_bit(FD_VERIFY_BIT, &UDRS->flags);
1da177e4
LT
3721 }
3722
a4af9b48 3723 if (UDRS->fd_ref == -1 || (UDRS->fd_ref && (mode & FMODE_EXCL)))
1da177e4
LT
3724 goto out2;
3725
a4af9b48 3726 if (mode & FMODE_EXCL)
1da177e4
LT
3727 UDRS->fd_ref = -1;
3728 else
3729 UDRS->fd_ref++;
3730
a4af9b48 3731 opened_bdev[drive] = bdev;
1da177e4
LT
3732
3733 res = -ENXIO;
3734
3735 if (!floppy_track_buffer) {
3736 /* if opening an ED drive, reserve a big buffer,
3737 * else reserve a small one */
3738 if ((UDP->cmos == 6) || (UDP->cmos == 5))
3739 try = 64; /* Only 48 actually useful */
3740 else
3741 try = 32; /* Only 24 actually useful */
3742
3743 tmp = (char *)fd_dma_mem_alloc(1024 * try);
3744 if (!tmp && !floppy_track_buffer) {
3745 try >>= 1; /* buffer only one side */
3746 INFBOUND(try, 16);
3747 tmp = (char *)fd_dma_mem_alloc(1024 * try);
3748 }
a81ee544 3749 if (!tmp && !floppy_track_buffer)
1da177e4 3750 fallback_on_nodma_alloc(&tmp, 2048 * try);
1da177e4
LT
3751 if (!tmp && !floppy_track_buffer) {
3752 DPRINT("Unable to allocate DMA memory\n");
3753 goto out;
3754 }
3755 if (floppy_track_buffer) {
3756 if (tmp)
3757 fd_dma_mem_free((unsigned long)tmp, try * 1024);
3758 } else {
3759 buffer_min = buffer_max = -1;
3760 floppy_track_buffer = tmp;
3761 max_buffer_sectors = try;
3762 }
3763 }
3764
a4af9b48
AV
3765 new_dev = MINOR(bdev->bd_dev);
3766 UDRS->fd_device = new_dev;
3767 set_capacity(disks[drive], floppy_sizes[new_dev]);
3768 if (old_dev != -1 && old_dev != new_dev) {
1da177e4
LT
3769 if (buffer_drive == drive)
3770 buffer_track = -1;
3771 }
3772
1da177e4
LT
3773 if (UFDCS->rawcmd == 1)
3774 UFDCS->rawcmd = 2;
3775
a4af9b48
AV
3776 if (!(mode & FMODE_NDELAY)) {
3777 if (mode & (FMODE_READ|FMODE_WRITE)) {
1da177e4 3778 UDRS->last_checked = 0;
a4af9b48 3779 check_disk_change(bdev);
e0298536 3780 if (test_bit(FD_DISK_CHANGED_BIT, &UDRS->flags))
1da177e4
LT
3781 goto out;
3782 }
3783 res = -EROFS;
e0298536
JP
3784 if ((mode & FMODE_WRITE) &&
3785 !test_bit(FD_DISK_WRITABLE_BIT, &UDRS->flags))
1da177e4
LT
3786 goto out;
3787 }
b1c82b5c 3788 mutex_unlock(&open_lock);
1da177e4
LT
3789 return 0;
3790out:
3791 if (UDRS->fd_ref < 0)
3792 UDRS->fd_ref = 0;
3793 else
3794 UDRS->fd_ref--;
3795 if (!UDRS->fd_ref)
3796 opened_bdev[drive] = NULL;
1da177e4 3797out2:
b1c82b5c 3798 mutex_unlock(&open_lock);
1da177e4
LT
3799 return res;
3800}
3801
3802/*
3803 * Check if the disk has been changed or if a change has been faked.
3804 */
3805static int check_floppy_change(struct gendisk *disk)
3806{
3807 int drive = (long)disk->private_data;
3808
e0298536
JP
3809 if (test_bit(FD_DISK_CHANGED_BIT, &UDRS->flags) ||
3810 test_bit(FD_VERIFY_BIT, &UDRS->flags))
1da177e4
LT
3811 return 1;
3812
50297cbf 3813 if (time_after(jiffies, UDRS->last_checked + UDP->checkfreq)) {
74f63f46
JP
3814 lock_fdc(drive, false);
3815 poll_drive(false, 0);
1da177e4 3816 process_fd_request();
1da177e4
LT
3817 }
3818
e0298536
JP
3819 if (test_bit(FD_DISK_CHANGED_BIT, &UDRS->flags) ||
3820 test_bit(FD_VERIFY_BIT, &UDRS->flags) ||
1da177e4
LT
3821 test_bit(drive, &fake_change) ||
3822 (!ITYPE(UDRS->fd_device) && !current_type[drive]))
3823 return 1;
3824 return 0;
3825}
3826
3827/*
3828 * This implements "read block 0" for floppy_revalidate().
3829 * Needed for format autodetection, checking whether there is
3830 * a disk in the drive, and whether that disk is writable.
3831 */
3832
bb57f0c6 3833static void floppy_rb0_complete(struct bio *bio, int err)
1da177e4 3834{
1da177e4 3835 complete((struct completion *)bio->bi_private);
1da177e4
LT
3836}
3837
3838static int __floppy_read_block_0(struct block_device *bdev)
3839{
3840 struct bio bio;
3841 struct bio_vec bio_vec;
3842 struct completion complete;
3843 struct page *page;
3844 size_t size;
3845
3846 page = alloc_page(GFP_NOIO);
3847 if (!page) {
3848 process_fd_request();
3849 return -ENOMEM;
3850 }
3851
3852 size = bdev->bd_block_size;
3853 if (!size)
3854 size = 1024;
3855
3856 bio_init(&bio);
3857 bio.bi_io_vec = &bio_vec;
3858 bio_vec.bv_page = page;
3859 bio_vec.bv_len = size;
3860 bio_vec.bv_offset = 0;
3861 bio.bi_vcnt = 1;
3862 bio.bi_idx = 0;
3863 bio.bi_size = size;
3864 bio.bi_bdev = bdev;
3865 bio.bi_sector = 0;
3866 init_completion(&complete);
3867 bio.bi_private = &complete;
3868 bio.bi_end_io = floppy_rb0_complete;
3869
3870 submit_bio(READ, &bio);
3871 generic_unplug_device(bdev_get_queue(bdev));
3872 process_fd_request();
3873 wait_for_completion(&complete);
3874
3875 __free_page(page);
3876
3877 return 0;
3878}
3879
3880/* revalidate the floppy disk, i.e. trigger format autodetection by reading
3881 * the bootblock (block 0). "Autodetection" is also needed to check whether
3882 * there is a disk in the drive at all... Thus we also do it for fixed
3883 * geometry formats */
3884static int floppy_revalidate(struct gendisk *disk)
3885{
3886 int drive = (long)disk->private_data;
3887#define NO_GEOM (!current_type[drive] && !ITYPE(UDRS->fd_device))
3888 int cf;
3889 int res = 0;
3890
e0298536
JP
3891 if (test_bit(FD_DISK_CHANGED_BIT, &UDRS->flags) ||
3892 test_bit(FD_VERIFY_BIT, &UDRS->flags) ||
3893 test_bit(drive, &fake_change) || NO_GEOM) {
1da177e4 3894 if (usage_count == 0) {
b46df356 3895 pr_info("VFS: revalidate called on non-open device.\n");
1da177e4
LT
3896 return -EFAULT;
3897 }
74f63f46 3898 lock_fdc(drive, false);
e0298536
JP
3899 cf = (test_bit(FD_DISK_CHANGED_BIT, &UDRS->flags) ||
3900 test_bit(FD_VERIFY_BIT, &UDRS->flags));
1da177e4
LT
3901 if (!(cf || test_bit(drive, &fake_change) || NO_GEOM)) {
3902 process_fd_request(); /*already done by another thread */
3903 return 0;
3904 }
3905 UDRS->maxblock = 0;
3906 UDRS->maxtrack = 0;
3907 if (buffer_drive == drive)
3908 buffer_track = -1;
3909 clear_bit(drive, &fake_change);
e0298536 3910 clear_bit(FD_DISK_CHANGED_BIT, &UDRS->flags);
1da177e4
LT
3911 if (cf)
3912 UDRS->generation++;
3913 if (NO_GEOM) {
3914 /* auto-sensing */
3915 res = __floppy_read_block_0(opened_bdev[drive]);
3916 } else {
3917 if (cf)
74f63f46 3918 poll_drive(false, FD_RAW_NEED_DISK);
1da177e4
LT
3919 process_fd_request();
3920 }
3921 }
3922 set_capacity(disk, floppy_sizes[UDRS->fd_device]);
3923 return res;
3924}
3925
83d5cde4 3926static const struct block_device_operations floppy_fops = {
06f748c4 3927 .owner = THIS_MODULE,
a4af9b48
AV
3928 .open = floppy_open,
3929 .release = floppy_release,
3930 .locked_ioctl = fd_ioctl,
06f748c4
JJ
3931 .getgeo = fd_getgeo,
3932 .media_changed = check_floppy_change,
3933 .revalidate_disk = floppy_revalidate,
1da177e4 3934};
1da177e4 3935
1da177e4
LT
3936/*
3937 * Floppy Driver initialization
3938 * =============================
3939 */
3940
3941/* Determine the floppy disk controller type */
3942/* This routine was written by David C. Niemi */
3943static char __init get_fdc_version(void)
3944{
3945 int r;
3946
3947 output_byte(FD_DUMPREGS); /* 82072 and better know DUMPREGS */
3948 if (FDCS->reset)
3949 return FDC_NONE;
d7b2b2ec
JP
3950 r = result();
3951 if (r <= 0x00)
1da177e4
LT
3952 return FDC_NONE; /* No FDC present ??? */
3953 if ((r == 1) && (reply_buffer[0] == 0x80)) {
b46df356 3954 pr_info("FDC %d is an 8272A\n", fdc);
1da177e4
LT
3955 return FDC_8272A; /* 8272a/765 don't know DUMPREGS */
3956 }
3957 if (r != 10) {
b46df356
JP
3958 pr_info("FDC %d init: DUMPREGS: unexpected return of %d bytes.\n",
3959 fdc, r);
1da177e4
LT
3960 return FDC_UNKNOWN;
3961 }
3962
3963 if (!fdc_configure()) {
b46df356 3964 pr_info("FDC %d is an 82072\n", fdc);
1da177e4
LT
3965 return FDC_82072; /* 82072 doesn't know CONFIGURE */
3966 }
3967
3968 output_byte(FD_PERPENDICULAR);
3969 if (need_more_output() == MORE_OUTPUT) {
3970 output_byte(0);
3971 } else {
b46df356 3972 pr_info("FDC %d is an 82072A\n", fdc);
1da177e4
LT
3973 return FDC_82072A; /* 82072A as found on Sparcs. */
3974 }
3975
3976 output_byte(FD_UNLOCK);
3977 r = result();
3978 if ((r == 1) && (reply_buffer[0] == 0x80)) {
b46df356 3979 pr_info("FDC %d is a pre-1991 82077\n", fdc);
d7b2b2ec 3980 return FDC_82077_ORIG; /* Pre-1991 82077, doesn't know
1da177e4
LT
3981 * LOCK/UNLOCK */
3982 }
3983 if ((r != 1) || (reply_buffer[0] != 0x00)) {
b46df356
JP
3984 pr_info("FDC %d init: UNLOCK: unexpected return of %d bytes.\n",
3985 fdc, r);
1da177e4
LT
3986 return FDC_UNKNOWN;
3987 }
3988 output_byte(FD_PARTID);
3989 r = result();
3990 if (r != 1) {
b46df356
JP
3991 pr_info("FDC %d init: PARTID: unexpected return of %d bytes.\n",
3992 fdc, r);
1da177e4
LT
3993 return FDC_UNKNOWN;
3994 }
3995 if (reply_buffer[0] == 0x80) {
b46df356 3996 pr_info("FDC %d is a post-1991 82077\n", fdc);
1da177e4
LT
3997 return FDC_82077; /* Revised 82077AA passes all the tests */
3998 }
3999 switch (reply_buffer[0] >> 5) {
4000 case 0x0:
4001 /* Either a 82078-1 or a 82078SL running at 5Volt */
b46df356 4002 pr_info("FDC %d is an 82078.\n", fdc);
1da177e4
LT
4003 return FDC_82078;
4004 case 0x1:
b46df356 4005 pr_info("FDC %d is a 44pin 82078\n", fdc);
1da177e4
LT
4006 return FDC_82078;
4007 case 0x2:
b46df356 4008 pr_info("FDC %d is a S82078B\n", fdc);
1da177e4
LT
4009 return FDC_S82078B;
4010 case 0x3:
b46df356 4011 pr_info("FDC %d is a National Semiconductor PC87306\n", fdc);
1da177e4
LT
4012 return FDC_87306;
4013 default:
b46df356
JP
4014 pr_info("FDC %d init: 82078 variant with unknown PARTID=%d.\n",
4015 fdc, reply_buffer[0] >> 5);
1da177e4
LT
4016 return FDC_82078_UNKN;
4017 }
4018} /* get_fdc_version */
4019
4020/* lilo configuration */
4021
4022static void __init floppy_set_flags(int *ints, int param, int param2)
4023{
4024 int i;
4025
4026 for (i = 0; i < ARRAY_SIZE(default_drive_params); i++) {
4027 if (param)
4028 default_drive_params[i].params.flags |= param2;
4029 else
4030 default_drive_params[i].params.flags &= ~param2;
4031 }
4032 DPRINT("%s flag 0x%x\n", param2 ? "Setting" : "Clearing", param);
4033}
4034
4035static void __init daring(int *ints, int param, int param2)
4036{
4037 int i;
4038
4039 for (i = 0; i < ARRAY_SIZE(default_drive_params); i++) {
4040 if (param) {
4041 default_drive_params[i].params.select_delay = 0;
4042 default_drive_params[i].params.flags |=
4043 FD_SILENT_DCL_CLEAR;
4044 } else {
4045 default_drive_params[i].params.select_delay =
4046 2 * HZ / 100;
4047 default_drive_params[i].params.flags &=
4048 ~FD_SILENT_DCL_CLEAR;
4049 }
4050 }
4051 DPRINT("Assuming %s floppy hardware\n", param ? "standard" : "broken");
4052}
4053
4054static void __init set_cmos(int *ints, int dummy, int dummy2)
4055{
4056 int current_drive = 0;
4057
4058 if (ints[0] != 2) {
4059 DPRINT("wrong number of parameters for CMOS\n");
4060 return;
4061 }
4062 current_drive = ints[1];
4063 if (current_drive < 0 || current_drive >= 8) {
4064 DPRINT("bad drive for set_cmos\n");
4065 return;
4066 }
4067#if N_FDC > 1
4068 if (current_drive >= 4 && !FDC2)
4069 FDC2 = 0x370;
4070#endif
4071 DP->cmos = ints[2];
4072 DPRINT("setting CMOS code to %d\n", ints[2]);
4073}
4074
4075static struct param_table {
4076 const char *name;
4077 void (*fn) (int *ints, int param, int param2);
4078 int *var;
4079 int def_param;
4080 int param2;
4081} config_params[] __initdata = {
4082 {"allowed_drive_mask", NULL, &allowed_drive_mask, 0xff, 0}, /* obsolete */
4083 {"all_drives", NULL, &allowed_drive_mask, 0xff, 0}, /* obsolete */
4084 {"asus_pci", NULL, &allowed_drive_mask, 0x33, 0},
4085 {"irq", NULL, &FLOPPY_IRQ, 6, 0},
4086 {"dma", NULL, &FLOPPY_DMA, 2, 0},
4087 {"daring", daring, NULL, 1, 0},
4088#if N_FDC > 1
4089 {"two_fdc", NULL, &FDC2, 0x370, 0},
4090 {"one_fdc", NULL, &FDC2, 0, 0},
4091#endif
4092 {"thinkpad", floppy_set_flags, NULL, 1, FD_INVERTED_DCL},
4093 {"broken_dcl", floppy_set_flags, NULL, 1, FD_BROKEN_DCL},
4094 {"messages", floppy_set_flags, NULL, 1, FTD_MSG},
4095 {"silent_dcl_clear", floppy_set_flags, NULL, 1, FD_SILENT_DCL_CLEAR},
4096 {"debug", floppy_set_flags, NULL, 1, FD_DEBUG},
4097 {"nodma", NULL, &can_use_virtual_dma, 1, 0},
4098 {"omnibook", NULL, &can_use_virtual_dma, 1, 0},
4099 {"yesdma", NULL, &can_use_virtual_dma, 0, 0},
4100 {"fifo_depth", NULL, &fifo_depth, 0xa, 0},
4101 {"nofifo", NULL, &no_fifo, 0x20, 0},
4102 {"usefifo", NULL, &no_fifo, 0, 0},
4103 {"cmos", set_cmos, NULL, 0, 0},
4104 {"slow", NULL, &slow_floppy, 1, 0},
4105 {"unexpected_interrupts", NULL, &print_unex, 1, 0},
4106 {"no_unexpected_interrupts", NULL, &print_unex, 0, 0},
4107 {"L40SX", NULL, &print_unex, 0, 0}
4108
4109 EXTRA_FLOPPY_PARAMS
4110};
4111
4112static int __init floppy_setup(char *str)
4113{
4114 int i;
4115 int param;
4116 int ints[11];
4117
4118 str = get_options(str, ARRAY_SIZE(ints), ints);
4119 if (str) {
4120 for (i = 0; i < ARRAY_SIZE(config_params); i++) {
4121 if (strcmp(str, config_params[i].name) == 0) {
4122 if (ints[0])
4123 param = ints[1];
4124 else
4125 param = config_params[i].def_param;
4126 if (config_params[i].fn)
bb57f0c6
JP
4127 config_params[i].fn(ints, param,
4128 config_params[i].
4129 param2);
1da177e4
LT
4130 if (config_params[i].var) {
4131 DPRINT("%s=%d\n", str, param);
4132 *config_params[i].var = param;
4133 }
4134 return 1;
4135 }
4136 }
4137 }
4138 if (str) {
4139 DPRINT("unknown floppy option [%s]\n", str);
4140
4141 DPRINT("allowed options are:");
4142 for (i = 0; i < ARRAY_SIZE(config_params); i++)
b46df356
JP
4143 pr_cont(" %s", config_params[i].name);
4144 pr_cont("\n");
1da177e4
LT
4145 } else
4146 DPRINT("botched floppy option\n");
31c00fc1 4147 DPRINT("Read Documentation/blockdev/floppy.txt\n");
1da177e4
LT
4148 return 0;
4149}
4150
4151static int have_no_fdc = -ENODEV;
4152
9a8af6b3
AM
4153static ssize_t floppy_cmos_show(struct device *dev,
4154 struct device_attribute *attr, char *buf)
94fd0db7 4155{
71b3e0c1 4156 struct platform_device *p = to_platform_device(dev);
9a8af6b3 4157 int drive;
94fd0db7 4158
9a8af6b3
AM
4159 drive = p->id;
4160 return sprintf(buf, "%X\n", UDP->cmos);
94fd0db7 4161}
48c8cee6
JP
4162
4163DEVICE_ATTR(cmos, S_IRUGO, floppy_cmos_show, NULL);
94fd0db7 4164
1da177e4
LT
4165static void floppy_device_release(struct device *dev)
4166{
1da177e4
LT
4167}
4168
c90cd332 4169static int floppy_resume(struct device *dev)
5e50b9ef
OZ
4170{
4171 int fdc;
4172
4173 for (fdc = 0; fdc < N_FDC; fdc++)
4174 if (FDCS->address != -1)
74f63f46 4175 user_reset_fdc(-1, FD_RESET_ALWAYS, false);
5e50b9ef
OZ
4176
4177 return 0;
4178}
4179
47145210 4180static const struct dev_pm_ops floppy_pm_ops = {
5e50b9ef 4181 .resume = floppy_resume,
c90cd332
FP
4182 .restore = floppy_resume,
4183};
4184
4185static struct platform_driver floppy_driver = {
5e50b9ef 4186 .driver = {
bb57f0c6
JP
4187 .name = "floppy",
4188 .pm = &floppy_pm_ops,
5e50b9ef
OZ
4189 },
4190};
4191
94fd0db7 4192static struct platform_device floppy_device[N_DRIVE];
1da177e4
LT
4193
4194static struct kobject *floppy_find(dev_t dev, int *part, void *data)
4195{
4196 int drive = (*part & 3) | ((*part & 0x80) >> 5);
4197 if (drive >= N_DRIVE ||
4198 !(allowed_drive_mask & (1 << drive)) ||
4199 fdc_state[FDC(drive)].version == FDC_NONE)
4200 return NULL;
945f390f 4201 if (((*part >> 2) & 0x1f) >= ARRAY_SIZE(floppy_type))
1da177e4
LT
4202 return NULL;
4203 *part = 0;
4204 return get_disk(disks[drive]);
4205}
4206
4207static int __init floppy_init(void)
4208{
4209 int i, unit, drive;
4210 int err, dr;
4211
68e1ee62 4212#if defined(CONFIG_PPC)
ef16b519
OH
4213 if (check_legacy_ioport(FDC1))
4214 return -ENODEV;
4215#endif
4216
1da177e4
LT
4217 raw_cmd = NULL;
4218
4219 for (dr = 0; dr < N_DRIVE; dr++) {
4220 disks[dr] = alloc_disk(1);
4221 if (!disks[dr]) {
4222 err = -ENOMEM;
4223 goto out_put_disk;
4224 }
4225
4226 disks[dr]->major = FLOPPY_MAJOR;
4227 disks[dr]->first_minor = TOMINOR(dr);
4228 disks[dr]->fops = &floppy_fops;
4229 sprintf(disks[dr]->disk_name, "fd%d", dr);
4230
4231 init_timer(&motor_off_timer[dr]);
4232 motor_off_timer[dr].data = dr;
4233 motor_off_timer[dr].function = motor_off_callback;
4234 }
4235
1da177e4
LT
4236 err = register_blkdev(FLOPPY_MAJOR, "fd");
4237 if (err)
8ab5e4c1 4238 goto out_put_disk;
1da177e4 4239
5e50b9ef
OZ
4240 err = platform_driver_register(&floppy_driver);
4241 if (err)
4242 goto out_unreg_blkdev;
4243
1da177e4
LT
4244 floppy_queue = blk_init_queue(do_fd_request, &floppy_lock);
4245 if (!floppy_queue) {
4246 err = -ENOMEM;
5e50b9ef 4247 goto out_unreg_driver;
1da177e4 4248 }
086fa5ff 4249 blk_queue_max_hw_sectors(floppy_queue, 64);
1da177e4
LT
4250
4251 blk_register_region(MKDEV(FLOPPY_MAJOR, 0), 256, THIS_MODULE,
4252 floppy_find, NULL, NULL);
4253
4254 for (i = 0; i < 256; i++)
4255 if (ITYPE(i))
4256 floppy_sizes[i] = floppy_type[ITYPE(i)].size;
4257 else
4258 floppy_sizes[i] = MAX_DISK_SIZE << 1;
4259
4260 reschedule_timeout(MAXTIMEOUT, "floppy init", MAXTIMEOUT);
4261 config_types();
4262
4263 for (i = 0; i < N_FDC; i++) {
4264 fdc = i;
b87c9e0a 4265 memset(FDCS, 0, sizeof(*FDCS));
1da177e4
LT
4266 FDCS->dtr = -1;
4267 FDCS->dor = 0x4;
4268#if defined(__sparc__) || defined(__mc68000__)
96534f1d 4269 /*sparcs/sun3x don't have a DOR reset which we can fall back on to */
1da177e4
LT
4270#ifdef __mc68000__
4271 if (MACH_IS_SUN3X)
4272#endif
4273 FDCS->version = FDC_82072A;
4274#endif
4275 }
4276
4277 use_virtual_dma = can_use_virtual_dma & 1;
1da177e4
LT
4278 fdc_state[0].address = FDC1;
4279 if (fdc_state[0].address == -1) {
4280 del_timer(&fd_timeout);
4281 err = -ENODEV;
4282 goto out_unreg_region;
4283 }
4284#if N_FDC > 1
4285 fdc_state[1].address = FDC2;
4286#endif
4287
4288 fdc = 0; /* reset fdc in case of unexpected interrupt */
4289 err = floppy_grab_irq_and_dma();
4290 if (err) {
4291 del_timer(&fd_timeout);
4292 err = -EBUSY;
4293 goto out_unreg_region;
4294 }
4295
4296 /* initialise drive state */
4297 for (drive = 0; drive < N_DRIVE; drive++) {
b87c9e0a
JP
4298 memset(UDRS, 0, sizeof(*UDRS));
4299 memset(UDRWE, 0, sizeof(*UDRWE));
e0298536
JP
4300 set_bit(FD_DISK_NEWCHANGE_BIT, &UDRS->flags);
4301 set_bit(FD_DISK_CHANGED_BIT, &UDRS->flags);
4302 set_bit(FD_VERIFY_BIT, &UDRS->flags);
1da177e4
LT
4303 UDRS->fd_device = -1;
4304 floppy_track_buffer = NULL;
4305 max_buffer_sectors = 0;
4306 }
4307 /*
4308 * Small 10 msec delay to let through any interrupt that
4309 * initialization might have triggered, to not
4310 * confuse detection:
4311 */
4312 msleep(10);
4313
4314 for (i = 0; i < N_FDC; i++) {
4315 fdc = i;
4316 FDCS->driver_version = FD_DRIVER_VERSION;
4317 for (unit = 0; unit < 4; unit++)
4318 FDCS->track[unit] = 0;
4319 if (FDCS->address == -1)
4320 continue;
4321 FDCS->rawcmd = 2;
74f63f46 4322 if (user_reset_fdc(-1, FD_RESET_ALWAYS, false)) {
1da177e4 4323 /* free ioports reserved by floppy_grab_irq_and_dma() */
5a74db06 4324 floppy_release_regions(fdc);
1da177e4
LT
4325 FDCS->address = -1;
4326 FDCS->version = FDC_NONE;
4327 continue;
4328 }
4329 /* Try to determine the floppy controller type */
4330 FDCS->version = get_fdc_version();
4331 if (FDCS->version == FDC_NONE) {
4332 /* free ioports reserved by floppy_grab_irq_and_dma() */
5a74db06 4333 floppy_release_regions(fdc);
1da177e4
LT
4334 FDCS->address = -1;
4335 continue;
4336 }
4337 if (can_use_virtual_dma == 2 && FDCS->version < FDC_82072A)
4338 can_use_virtual_dma = 0;
4339
4340 have_no_fdc = 0;
4341 /* Not all FDCs seem to be able to handle the version command
4342 * properly, so force a reset for the standard FDC clones,
4343 * to avoid interrupt garbage.
4344 */
74f63f46 4345 user_reset_fdc(-1, FD_RESET_ALWAYS, false);
1da177e4
LT
4346 }
4347 fdc = 0;
4348 del_timer(&fd_timeout);
4349 current_drive = 0;
29f1c784 4350 initialized = true;
1da177e4
LT
4351 if (have_no_fdc) {
4352 DPRINT("no floppy controllers found\n");
4353 err = have_no_fdc;
4354 goto out_flush_work;
4355 }
4356
1da177e4
LT
4357 for (drive = 0; drive < N_DRIVE; drive++) {
4358 if (!(allowed_drive_mask & (1 << drive)))
4359 continue;
4360 if (fdc_state[FDC(drive)].version == FDC_NONE)
4361 continue;
94fd0db7
HR
4362
4363 floppy_device[drive].name = floppy_device_name;
4364 floppy_device[drive].id = drive;
4365 floppy_device[drive].dev.release = floppy_device_release;
4366
4367 err = platform_device_register(&floppy_device[drive]);
4368 if (err)
4369 goto out_flush_work;
4370
d7b2b2ec
JP
4371 err = device_create_file(&floppy_device[drive].dev,
4372 &dev_attr_cmos);
4ea1b0f4
DM
4373 if (err)
4374 goto out_unreg_platform_dev;
4375
1da177e4
LT
4376 /* to be cleaned up... */
4377 disks[drive]->private_data = (void *)(long)drive;
4378 disks[drive]->queue = floppy_queue;
4379 disks[drive]->flags |= GENHD_FL_REMOVABLE;
94fd0db7 4380 disks[drive]->driverfs_dev = &floppy_device[drive].dev;
1da177e4
LT
4381 add_disk(disks[drive]);
4382 }
4383
4384 return 0;
4385
4ea1b0f4
DM
4386out_unreg_platform_dev:
4387 platform_device_unregister(&floppy_device[drive]);
1da177e4
LT
4388out_flush_work:
4389 flush_scheduled_work();
4390 if (usage_count)
4391 floppy_release_irq_and_dma();
4392out_unreg_region:
4393 blk_unregister_region(MKDEV(FLOPPY_MAJOR, 0), 256);
4394 blk_cleanup_queue(floppy_queue);
5e50b9ef
OZ
4395out_unreg_driver:
4396 platform_driver_unregister(&floppy_driver);
1da177e4
LT
4397out_unreg_blkdev:
4398 unregister_blkdev(FLOPPY_MAJOR, "fd");
1da177e4
LT
4399out_put_disk:
4400 while (dr--) {
4401 del_timer(&motor_off_timer[dr]);
4402 put_disk(disks[dr]);
4403 }
4404 return err;
4405}
4406
4407static DEFINE_SPINLOCK(floppy_usage_lock);
4408
5a74db06
PDM
4409static const struct io_region {
4410 int offset;
4411 int size;
4412} io_regions[] = {
4413 { 2, 1 },
4414 /* address + 3 is sometimes reserved by pnp bios for motherboard */
4415 { 4, 2 },
4416 /* address + 6 is reserved, and may be taken by IDE.
4417 * Unfortunately, Adaptec doesn't know this :-(, */
4418 { 7, 1 },
4419};
4420
4421static void floppy_release_allocated_regions(int fdc, const struct io_region *p)
4422{
4423 while (p != io_regions) {
4424 p--;
4425 release_region(FDCS->address + p->offset, p->size);
4426 }
4427}
4428
4429#define ARRAY_END(X) (&((X)[ARRAY_SIZE(X)]))
4430
4431static int floppy_request_regions(int fdc)
4432{
4433 const struct io_region *p;
4434
4435 for (p = io_regions; p < ARRAY_END(io_regions); p++) {
bb57f0c6
JP
4436 if (!request_region(FDCS->address + p->offset,
4437 p->size, "floppy")) {
4438 DPRINT("Floppy io-port 0x%04lx in use\n",
4439 FDCS->address + p->offset);
5a74db06
PDM
4440 floppy_release_allocated_regions(fdc, p);
4441 return -EBUSY;
4442 }
4443 }
4444 return 0;
4445}
4446
4447static void floppy_release_regions(int fdc)
4448{
4449 floppy_release_allocated_regions(fdc, ARRAY_END(io_regions));
4450}
4451
1da177e4
LT
4452static int floppy_grab_irq_and_dma(void)
4453{
4454 unsigned long flags;
4455
4456 spin_lock_irqsave(&floppy_usage_lock, flags);
4457 if (usage_count++) {
4458 spin_unlock_irqrestore(&floppy_usage_lock, flags);
4459 return 0;
4460 }
4461 spin_unlock_irqrestore(&floppy_usage_lock, flags);
6dc659d8
IM
4462
4463 /*
4464 * We might have scheduled a free_irq(), wait it to
4465 * drain first:
4466 */
4467 flush_scheduled_work();
4468
1da177e4
LT
4469 if (fd_request_irq()) {
4470 DPRINT("Unable to grab IRQ%d for the floppy driver\n",
4471 FLOPPY_IRQ);
4472 spin_lock_irqsave(&floppy_usage_lock, flags);
4473 usage_count--;
4474 spin_unlock_irqrestore(&floppy_usage_lock, flags);
4475 return -1;
4476 }
4477 if (fd_request_dma()) {
4478 DPRINT("Unable to grab DMA%d for the floppy driver\n",
4479 FLOPPY_DMA);
2e9c47cd
JB
4480 if (can_use_virtual_dma & 2)
4481 use_virtual_dma = can_use_virtual_dma = 1;
4482 if (!(can_use_virtual_dma & 1)) {
4483 fd_free_irq();
4484 spin_lock_irqsave(&floppy_usage_lock, flags);
4485 usage_count--;
4486 spin_unlock_irqrestore(&floppy_usage_lock, flags);
4487 return -1;
4488 }
1da177e4
LT
4489 }
4490
4491 for (fdc = 0; fdc < N_FDC; fdc++) {
4492 if (FDCS->address != -1) {
5a74db06
PDM
4493 if (floppy_request_regions(fdc))
4494 goto cleanup;
1da177e4
LT
4495 }
4496 }
4497 for (fdc = 0; fdc < N_FDC; fdc++) {
4498 if (FDCS->address != -1) {
4499 reset_fdc_info(1);
4500 fd_outb(FDCS->dor, FD_DOR);
4501 }
4502 }
4503 fdc = 0;
4504 set_dor(0, ~0, 8); /* avoid immediate interrupt */
4505
4506 for (fdc = 0; fdc < N_FDC; fdc++)
4507 if (FDCS->address != -1)
4508 fd_outb(FDCS->dor, FD_DOR);
4509 /*
06f748c4
JJ
4510 * The driver will try and free resources and relies on us
4511 * to know if they were allocated or not.
1da177e4
LT
4512 */
4513 fdc = 0;
4514 irqdma_allocated = 1;
4515 return 0;
5a74db06 4516cleanup:
1da177e4
LT
4517 fd_free_irq();
4518 fd_free_dma();
5a74db06
PDM
4519 while (--fdc >= 0)
4520 floppy_release_regions(fdc);
1da177e4
LT
4521 spin_lock_irqsave(&floppy_usage_lock, flags);
4522 usage_count--;
4523 spin_unlock_irqrestore(&floppy_usage_lock, flags);
4524 return -1;
4525}
4526
4527static void floppy_release_irq_and_dma(void)
4528{
4529 int old_fdc;
4530#ifdef FLOPPY_SANITY_CHECK
4531#ifndef __sparc__
4532 int drive;
4533#endif
4534#endif
4535 long tmpsize;
4536 unsigned long tmpaddr;
4537 unsigned long flags;
4538
4539 spin_lock_irqsave(&floppy_usage_lock, flags);
4540 if (--usage_count) {
4541 spin_unlock_irqrestore(&floppy_usage_lock, flags);
4542 return;
4543 }
4544 spin_unlock_irqrestore(&floppy_usage_lock, flags);
4545 if (irqdma_allocated) {
4546 fd_disable_dma();
4547 fd_free_dma();
3e541a4a 4548 fd_free_irq();
1da177e4
LT
4549 irqdma_allocated = 0;
4550 }
4551 set_dor(0, ~0, 8);
4552#if N_FDC > 1
4553 set_dor(1, ~8, 0);
4554#endif
4555 floppy_enable_hlt();
4556
4557 if (floppy_track_buffer && max_buffer_sectors) {
4558 tmpsize = max_buffer_sectors * 1024;
4559 tmpaddr = (unsigned long)floppy_track_buffer;
4560 floppy_track_buffer = NULL;
4561 max_buffer_sectors = 0;
4562 buffer_min = buffer_max = -1;
4563 fd_dma_mem_free(tmpaddr, tmpsize);
4564 }
4565#ifdef FLOPPY_SANITY_CHECK
4566#ifndef __sparc__
4567 for (drive = 0; drive < N_FDC * 4; drive++)
4568 if (timer_pending(motor_off_timer + drive))
b46df356 4569 pr_info("motor off timer %d still active\n", drive);
1da177e4
LT
4570#endif
4571
4572 if (timer_pending(&fd_timeout))
b46df356 4573 pr_info("floppy timer still active:%s\n", timeout_message);
1da177e4 4574 if (timer_pending(&fd_timer))
b46df356 4575 pr_info("auxiliary floppy timer still active\n");
365970a1 4576 if (work_pending(&floppy_work))
b46df356 4577 pr_info("work still pending\n");
1da177e4
LT
4578#endif
4579 old_fdc = fdc;
4580 for (fdc = 0; fdc < N_FDC; fdc++)
5a74db06
PDM
4581 if (FDCS->address != -1)
4582 floppy_release_regions(fdc);
1da177e4
LT
4583 fdc = old_fdc;
4584}
4585
4586#ifdef MODULE
4587
4588static char *floppy;
4589
1da177e4
LT
4590static void __init parse_floppy_cfg_string(char *cfg)
4591{
4592 char *ptr;
4593
4594 while (*cfg) {
bb57f0c6
JP
4595 ptr = cfg;
4596 while (*cfg && *cfg != ' ' && *cfg != '\t')
4597 cfg++;
1da177e4
LT
4598 if (*cfg) {
4599 *cfg = '\0';
4600 cfg++;
4601 }
4602 if (*ptr)
4603 floppy_setup(ptr);
4604 }
4605}
4606
7afea3bc 4607static int __init floppy_module_init(void)
1da177e4
LT
4608{
4609 if (floppy)
4610 parse_floppy_cfg_string(floppy);
4611 return floppy_init();
4612}
7afea3bc 4613module_init(floppy_module_init);
1da177e4 4614
7afea3bc 4615static void __exit floppy_module_exit(void)
1da177e4
LT
4616{
4617 int drive;
4618
1da177e4
LT
4619 blk_unregister_region(MKDEV(FLOPPY_MAJOR, 0), 256);
4620 unregister_blkdev(FLOPPY_MAJOR, "fd");
5e50b9ef 4621 platform_driver_unregister(&floppy_driver);
1da177e4
LT
4622
4623 for (drive = 0; drive < N_DRIVE; drive++) {
4624 del_timer_sync(&motor_off_timer[drive]);
4625
4626 if ((allowed_drive_mask & (1 << drive)) &&
4627 fdc_state[FDC(drive)].version != FDC_NONE) {
4628 del_gendisk(disks[drive]);
94fd0db7
HR
4629 device_remove_file(&floppy_device[drive].dev, &dev_attr_cmos);
4630 platform_device_unregister(&floppy_device[drive]);
1da177e4
LT
4631 }
4632 put_disk(disks[drive]);
4633 }
1da177e4
LT
4634
4635 del_timer_sync(&fd_timeout);
4636 del_timer_sync(&fd_timer);
4637 blk_cleanup_queue(floppy_queue);
4638
4639 if (usage_count)
4640 floppy_release_irq_and_dma();
4641
4642 /* eject disk, if any */
4643 fd_eject(0);
1da177e4 4644}
48c8cee6 4645
7afea3bc 4646module_exit(floppy_module_exit);
1da177e4
LT
4647
4648module_param(floppy, charp, 0);
4649module_param(FLOPPY_IRQ, int, 0);
4650module_param(FLOPPY_DMA, int, 0);
4651MODULE_AUTHOR("Alain L. Knaff");
4652MODULE_SUPPORTED_DEVICE("fd");
4653MODULE_LICENSE("GPL");
4654
83f9ef46
SJR
4655/* This doesn't actually get used other than for module information */
4656static const struct pnp_device_id floppy_pnpids[] = {
48c8cee6
JP
4657 {"PNP0700", 0},
4658 {}
83f9ef46 4659};
48c8cee6 4660
83f9ef46
SJR
4661MODULE_DEVICE_TABLE(pnp, floppy_pnpids);
4662
1da177e4
LT
4663#else
4664
4665__setup("floppy=", floppy_setup);
4666module_init(floppy_init)
4667#endif
4668
4669MODULE_ALIAS_BLOCKDEV_MAJOR(FLOPPY_MAJOR);