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