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