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