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