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