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