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