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