aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/block
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/block')
-rw-r--r--drivers/block/floppy.c123
1 files changed, 73 insertions, 50 deletions
diff --git a/drivers/block/floppy.c b/drivers/block/floppy.c
index 72803a3585ff..c6416f841131 100644
--- a/drivers/block/floppy.c
+++ b/drivers/block/floppy.c
@@ -5,6 +5,7 @@
5 * Copyright (C) 1993, 1994 Alain Knaff 5 * Copyright (C) 1993, 1994 Alain Knaff
6 * Copyright (C) 1998 Alan Cox 6 * Copyright (C) 1998 Alan Cox
7 */ 7 */
8
8/* 9/*
9 * 02.12.91 - Changed to static variables to indicate need for reset 10 * 02.12.91 - Changed to static variables to indicate need for reset
10 * and recalibrate. This makes some things easier (output_byte reset 11 * and recalibrate. This makes some things easier (output_byte reset
@@ -149,7 +150,7 @@
149#define REALLY_SLOW_IO 150#define REALLY_SLOW_IO
150 151
151#define DEBUGT 2 152#define DEBUGT 2
152#define DCL_DEBUG /* debug disk change line */ 153#define DCL_DEBUG /* debug disk change line */
153 154
154/* do print messages for unexpected interrupts */ 155/* do print messages for unexpected interrupts */
155static int print_unex = 1; 156static int print_unex = 1;
@@ -161,10 +162,8 @@ static int print_unex = 1;
161#include <linux/workqueue.h> 162#include <linux/workqueue.h>
162#define FDPATCHES 163#define FDPATCHES
163#include <linux/fdreg.h> 164#include <linux/fdreg.h>
164
165#include <linux/fd.h> 165#include <linux/fd.h>
166#include <linux/hdreg.h> 166#include <linux/hdreg.h>
167
168#include <linux/errno.h> 167#include <linux/errno.h>
169#include <linux/slab.h> 168#include <linux/slab.h>
170#include <linux/mm.h> 169#include <linux/mm.h>
@@ -274,8 +273,7 @@ static inline void fallback_on_nodma_alloc(char **addr, size_t l)
274 return; /* we have the memory */ 273 return; /* we have the memory */
275 if (can_use_virtual_dma != 2) 274 if (can_use_virtual_dma != 2)
276 return; /* no fallback allowed */ 275 return; /* no fallback allowed */
277 printk 276 printk("DMA memory shortage. Temporarily falling back on virtual DMA\n");
278 ("DMA memory shortage. Temporarily falling back on virtual DMA\n");
279 *addr = (char *)nodma_mem_alloc(l); 277 *addr = (char *)nodma_mem_alloc(l);
280#else 278#else
281 return; 279 return;
@@ -291,8 +289,8 @@ static int initialising = 1;
291#define TOMINOR(x) ((x & 3) | ((x & 4) << 5)) 289#define TOMINOR(x) ((x & 3) | ((x & 4) << 5))
292#define UNIT(x) ((x) & 0x03) /* drive on fdc */ 290#define UNIT(x) ((x) & 0x03) /* drive on fdc */
293#define FDC(x) (((x) & 0x04) >> 2) /* fdc of drive */ 291#define FDC(x) (((x) & 0x04) >> 2) /* fdc of drive */
292 /* reverse mapping from unit and fdc to drive */
294#define REVDRIVE(fdc, unit) ((unit) + ((fdc) << 2)) 293#define REVDRIVE(fdc, unit) ((unit) + ((fdc) << 2))
295 /* reverse mapping from unit and fdc to drive */
296#define DP (&drive_params[current_drive]) 294#define DP (&drive_params[current_drive])
297#define DRS (&drive_state[current_drive]) 295#define DRS (&drive_state[current_drive])
298#define DRWE (&write_errors[current_drive]) 296#define DRWE (&write_errors[current_drive])
@@ -356,7 +354,6 @@ static int inr; /* size of reply buffer, when called from interrupt */
356#define R_HEAD (reply_buffer[4]) 354#define R_HEAD (reply_buffer[4])
357#define R_SECTOR (reply_buffer[5]) 355#define R_SECTOR (reply_buffer[5])
358#define R_SIZECODE (reply_buffer[6]) 356#define R_SIZECODE (reply_buffer[6])
359
360#define SEL_DLY (2*HZ/100) 357#define SEL_DLY (2*HZ/100)
361 358
362/* 359/*
@@ -472,8 +469,8 @@ static struct floppy_struct floppy_type[32] = {
472 { 6400,40,2,80,0,0x25,0x5B,0xCF,0x00,"E3200" }, /* 26 3.20MB 3.5" */ 469 { 6400,40,2,80,0,0x25,0x5B,0xCF,0x00,"E3200" }, /* 26 3.20MB 3.5" */
473 { 7040,44,2,80,0,0x25,0x5B,0xCF,0x00,"E3520" }, /* 27 3.52MB 3.5" */ 470 { 7040,44,2,80,0,0x25,0x5B,0xCF,0x00,"E3520" }, /* 27 3.52MB 3.5" */
474 { 7680,48,2,80,0,0x25,0x63,0xCF,0x00,"E3840" }, /* 28 3.84MB 3.5" */ 471 { 7680,48,2,80,0,0x25,0x63,0xCF,0x00,"E3840" }, /* 28 3.84MB 3.5" */
475
476 { 3680,23,2,80,0,0x1C,0x10,0xCF,0x00,"H1840" }, /* 29 1.84MB 3.5" */ 472 { 3680,23,2,80,0,0x1C,0x10,0xCF,0x00,"H1840" }, /* 29 1.84MB 3.5" */
473
477 { 1600,10,2,80,0,0x25,0x02,0xDF,0x2E,"D800" }, /* 30 800KB 3.5" */ 474 { 1600,10,2,80,0,0x25,0x02,0xDF,0x2E,"D800" }, /* 30 800KB 3.5" */
478 { 3200,20,2,80,0,0x1C,0x00,0xCF,0x2C,"H1600" }, /* 31 1.6MB 3.5" */ 475 { 3200,20,2,80,0,0x1C,0x00,0xCF,0x2C,"H1600" }, /* 31 1.6MB 3.5" */
479}; 476};
@@ -539,12 +536,12 @@ static char *floppy_track_buffer;
539static int max_buffer_sectors; 536static int max_buffer_sectors;
540 537
541static int *errors; 538static int *errors;
542typedef void (*done_f) (int); 539typedef void (*done_f)(int);
543static struct cont_t { 540static struct cont_t {
544 void (*interrupt) (void); /* this is called after the interrupt of the 541 void (*interrupt)(void); /* this is called after the interrupt of the
545 * main command */ 542 * main command */
546 void (*redo) (void); /* this is called to retry the operation */ 543 void (*redo)(void); /* this is called to retry the operation */
547 void (*error) (void); /* this is called to tally an error */ 544 void (*error)(void); /* this is called to tally an error */
548 done_f done; /* this is called to say if the operation has 545 done_f done; /* this is called to say if the operation has
549 * succeeded/failed */ 546 * succeeded/failed */
550} *cont; 547} *cont;
@@ -694,7 +691,6 @@ static void reschedule_timeout(int drive, const char *message, int marg)
694} 691}
695 692
696#define INFBOUND(a,b) (a)=max_t(int, a, b) 693#define INFBOUND(a,b) (a)=max_t(int, a, b)
697
698#define SUPBOUND(a,b) (a)=min_t(int, a, b) 694#define SUPBOUND(a,b) (a)=min_t(int, a, b)
699 695
700/* 696/*
@@ -733,6 +729,7 @@ static void reschedule_timeout(int drive, const char *message, int marg)
733static int disk_change(int drive) 729static int disk_change(int drive)
734{ 730{
735 int fdc = FDC(drive); 731 int fdc = FDC(drive);
732
736#ifdef FLOPPY_SANITY_CHECK 733#ifdef FLOPPY_SANITY_CHECK
737 if (time_before(jiffies, UDRS->select_date + UDP->select_delay)) 734 if (time_before(jiffies, UDRS->select_date + UDP->select_delay))
738 DPRINT("WARNING disk change called early\n"); 735 DPRINT("WARNING disk change called early\n");
@@ -892,7 +889,6 @@ static int _lock_fdc(int drive, int interruptible, int line)
892 889
893 set_current_state(TASK_RUNNING); 890 set_current_state(TASK_RUNNING);
894 remove_wait_queue(&fdc_wait, &wait); 891 remove_wait_queue(&fdc_wait, &wait);
895
896 flush_scheduled_work(); 892 flush_scheduled_work();
897 } 893 }
898 command_status = FD_COMMAND_NONE; 894 command_status = FD_COMMAND_NONE;
@@ -968,7 +964,9 @@ static void floppy_off(unsigned int drive)
968 */ 964 */
969static void scandrives(void) 965static void scandrives(void)
970{ 966{
971 int i, drive, saved_drive; 967 int i;
968 int drive;
969 int saved_drive;
972 970
973 if (DP->select_delay) 971 if (DP->select_delay)
974 return; 972 return;
@@ -1146,7 +1144,9 @@ static void show_floppy(void);
1146/* waits until the fdc becomes ready */ 1144/* waits until the fdc becomes ready */
1147static int wait_til_ready(void) 1145static int wait_til_ready(void)
1148{ 1146{
1149 int counter, status; 1147 int status;
1148 int counter;
1149
1150 if (FDCS->reset) 1150 if (FDCS->reset)
1151 return -1; 1151 return -1;
1152 for (counter = 0; counter < 10000; counter++) { 1152 for (counter = 0; counter < 10000; counter++) {
@@ -1193,7 +1193,8 @@ static int output_byte(char byte)
1193/* gets the response from the fdc */ 1193/* gets the response from the fdc */
1194static int result(void) 1194static int result(void)
1195{ 1195{
1196 int i, status = 0; 1196 int i;
1197 int status = 0;
1197 1198
1198 for (i = 0; i < MAX_REPLIES; i++) { 1199 for (i = 0; i < MAX_REPLIES; i++) {
1199 if ((status = wait_til_ready()) < 0) 1200 if ((status = wait_til_ready()) < 0)
@@ -1226,6 +1227,7 @@ static int result(void)
1226static int need_more_output(void) 1227static int need_more_output(void)
1227{ 1228{
1228 int status; 1229 int status;
1230
1229 if ((status = wait_til_ready()) < 0) 1231 if ((status = wait_til_ready()) < 0)
1230 return -1; 1232 return -1;
1231 if ((status & (STATUS_READY | STATUS_DIR | STATUS_DMA)) == STATUS_READY) 1233 if ((status & (STATUS_READY | STATUS_DIR | STATUS_DMA)) == STATUS_READY)
@@ -1309,8 +1311,11 @@ static int fdc_configure(void)
1309 */ 1311 */
1310static void fdc_specify(void) 1312static void fdc_specify(void)
1311{ 1313{
1312 unsigned char spec1, spec2; 1314 unsigned char spec1;
1313 unsigned long srt, hlt, hut; 1315 unsigned char spec2;
1316 unsigned long srt;
1317 unsigned long hlt;
1318 unsigned long hut;
1314 unsigned long dtr = NOMINAL_DTR; 1319 unsigned long dtr = NOMINAL_DTR;
1315 unsigned long scale_dtr = NOMINAL_DTR; 1320 unsigned long scale_dtr = NOMINAL_DTR;
1316 int hlt_max_code = 0x7f; 1321 int hlt_max_code = 0x7f;
@@ -1472,7 +1477,6 @@ static int interpret_errors(void)
1472 tell_sector(); 1477 tell_sector();
1473 } 1478 }
1474 printk("\n"); 1479 printk("\n");
1475
1476 } 1480 }
1477 if (ST2 & ST2_WC || ST2 & ST2_BC) 1481 if (ST2 & ST2_WC || ST2 & ST2_BC)
1478 /* wrong cylinder => recal */ 1482 /* wrong cylinder => recal */
@@ -1498,7 +1502,10 @@ static int interpret_errors(void)
1498 */ 1502 */
1499static void setup_rw_floppy(void) 1503static void setup_rw_floppy(void)
1500{ 1504{
1501 int i, r, flags, dflags; 1505 int i;
1506 int r;
1507 int flags;
1508 int dflags;
1502 unsigned long ready_date; 1509 unsigned long ready_date;
1503 timeout_fn function; 1510 timeout_fn function;
1504 1511
@@ -1728,9 +1735,9 @@ static void print_result(char *message, int inr)
1728/* interrupt handler. Note that this can be called externally on the Sparc */ 1735/* interrupt handler. Note that this can be called externally on the Sparc */
1729irqreturn_t floppy_interrupt(int irq, void *dev_id) 1736irqreturn_t floppy_interrupt(int irq, void *dev_id)
1730{ 1737{
1731 void (*handler) (void) = do_floppy;
1732 int do_print; 1738 int do_print;
1733 unsigned long f; 1739 unsigned long f;
1740 void (*handler)(void) = do_floppy;
1734 1741
1735 lasthandler = handler; 1742 lasthandler = handler;
1736 interruptjiffies = jiffies; 1743 interruptjiffies = jiffies;
@@ -1915,9 +1922,10 @@ static void floppy_shutdown(unsigned long data)
1915/*typedef void (*timeout_fn)(unsigned long);*/ 1922/*typedef void (*timeout_fn)(unsigned long);*/
1916 1923
1917/* start motor, check media-changed condition and write protection */ 1924/* start motor, check media-changed condition and write protection */
1918static int start_motor(void (*function) (void)) 1925static int start_motor(void (*function)(void))
1919{ 1926{
1920 int mask, data; 1927 int mask;
1928 int data;
1921 1929
1922 mask = 0xfc; 1930 mask = 0xfc;
1923 data = UNIT(current_drive); 1931 data = UNIT(current_drive);
@@ -2020,17 +2028,17 @@ static struct cont_t wakeup_cont = {
2020 .interrupt = empty, 2028 .interrupt = empty,
2021 .redo = do_wakeup, 2029 .redo = do_wakeup,
2022 .error = empty, 2030 .error = empty,
2023 .done = (done_f) empty 2031 .done = (done_f)empty
2024}; 2032};
2025 2033
2026static struct cont_t intr_cont = { 2034static struct cont_t intr_cont = {
2027 .interrupt = empty, 2035 .interrupt = empty,
2028 .redo = process_fd_request, 2036 .redo = process_fd_request,
2029 .error = empty, 2037 .error = empty,
2030 .done = (done_f) empty 2038 .done = (done_f)empty
2031}; 2039};
2032 2040
2033static int wait_til_done(void (*handler) (void), int interruptible) 2041static int wait_til_done(void (*handler)(void), int interruptible)
2034{ 2042{
2035 int ret; 2043 int ret;
2036 2044
@@ -2049,7 +2057,6 @@ static int wait_til_done(void (*handler) (void), int interruptible)
2049 break; 2057 break;
2050 2058
2051 is_alive("wait_til_done"); 2059 is_alive("wait_til_done");
2052
2053 schedule(); 2060 schedule();
2054 } 2061 }
2055 2062
@@ -2141,6 +2148,7 @@ static void bad_flp_intr(void)
2141static void set_floppy(int drive) 2148static void set_floppy(int drive)
2142{ 2149{
2143 int type = ITYPE(UDRS->fd_device); 2150 int type = ITYPE(UDRS->fd_device);
2151
2144 if (type) 2152 if (type)
2145 _floppy = floppy_type + type; 2153 _floppy = floppy_type + type;
2146 else 2154 else
@@ -2169,11 +2177,14 @@ static void format_interrupt(void)
2169#define CT(x) ((x) | 0xc0) 2177#define CT(x) ((x) | 0xc0)
2170static void setup_format_params(int track) 2178static void setup_format_params(int track)
2171{ 2179{
2180 int n;
2181 int il;
2182 int count;
2183 int head_shift;
2184 int track_shift;
2172 struct fparm { 2185 struct fparm {
2173 unsigned char track, head, sect, size; 2186 unsigned char track, head, sect, size;
2174 } *here = (struct fparm *)floppy_track_buffer; 2187 } *here = (struct fparm *)floppy_track_buffer;
2175 int il, n;
2176 int count, head_shift, track_shift;
2177 2188
2178 raw_cmd = &default_raw_cmd; 2189 raw_cmd = &default_raw_cmd;
2179 raw_cmd->track = track; 2190 raw_cmd->track = track;
@@ -2344,7 +2355,10 @@ static void request_done(int uptodate)
2344/* Interrupt handler evaluating the result of the r/w operation */ 2355/* Interrupt handler evaluating the result of the r/w operation */
2345static void rw_interrupt(void) 2356static void rw_interrupt(void)
2346{ 2357{
2347 int nr_sectors, ssize, eoc, heads; 2358 int eoc;
2359 int ssize;
2360 int heads;
2361 int nr_sectors;
2348 2362
2349 if (R_HEAD >= 2) { 2363 if (R_HEAD >= 2) {
2350 /* some Toshiba floppy controllers occasionnally seem to 2364 /* some Toshiba floppy controllers occasionnally seem to
@@ -2476,7 +2490,8 @@ static void copy_buffer(int ssize, int max_sector, int max_sector_2)
2476{ 2490{
2477 int remaining; /* number of transferred 512-byte sectors */ 2491 int remaining; /* number of transferred 512-byte sectors */
2478 struct bio_vec *bv; 2492 struct bio_vec *bv;
2479 char *buffer, *dma_buffer; 2493 char *buffer;
2494 char *dma_buffer;
2480 int size; 2495 int size;
2481 struct req_iterator iter; 2496 struct req_iterator iter;
2482 2497
@@ -2578,7 +2593,8 @@ static inline int check_dma_crossing(char *start,
2578 */ 2593 */
2579static void virtualdmabug_workaround(void) 2594static void virtualdmabug_workaround(void)
2580{ 2595{
2581 int hard_sectors, end_sector; 2596 int hard_sectors;
2597 int end_sector;
2582 2598
2583 if (CT(COMMAND) == FD_WRITE) { 2599 if (CT(COMMAND) == FD_WRITE) {
2584 COMMAND &= ~0x80; /* switch off multiple track mode */ 2600 COMMAND &= ~0x80; /* switch off multiple track mode */
@@ -2610,7 +2626,10 @@ static void virtualdmabug_workaround(void)
2610static int make_raw_rw_request(void) 2626static int make_raw_rw_request(void)
2611{ 2627{
2612 int aligned_sector_t; 2628 int aligned_sector_t;
2613 int max_sector, max_size, tracksize, ssize; 2629 int max_sector;
2630 int max_size;
2631 int tracksize;
2632 int ssize;
2614 2633
2615 if (max_buffer_sectors == 0) { 2634 if (max_buffer_sectors == 0) {
2616 printk("VFS: Block I/O scheduled on unopened device\n"); 2635 printk("VFS: Block I/O scheduled on unopened device\n");
@@ -2777,8 +2796,8 @@ static int make_raw_rw_request(void)
2777 indirect, direct, fsector_t); 2796 indirect, direct, fsector_t);
2778 return 0; 2797 return 0;
2779 } 2798 }
2780/* check_dma_crossing(raw_cmd->kernel_data, 2799/* check_dma_crossing(raw_cmd->kernel_data,
2781 raw_cmd->length, 2800 raw_cmd->length,
2782 "end of make_raw_request [1]");*/ 2801 "end of make_raw_request [1]");*/
2783 2802
2784 virtualdmabug_workaround(); 2803 virtualdmabug_workaround();
@@ -3011,6 +3030,7 @@ static struct cont_t poll_cont = {
3011static int poll_drive(int interruptible, int flag) 3030static int poll_drive(int interruptible, int flag)
3012{ 3031{
3013 int ret; 3032 int ret;
3033
3014 /* no auto-sense, just clear dcl */ 3034 /* no auto-sense, just clear dcl */
3015 raw_cmd = &default_raw_cmd; 3035 raw_cmd = &default_raw_cmd;
3016 raw_cmd->flags = flag; 3036 raw_cmd->flags = flag;
@@ -3173,7 +3193,8 @@ static inline int raw_cmd_copyout(int cmd, char __user *param,
3173 3193
3174static void raw_cmd_free(struct floppy_raw_cmd **ptr) 3194static void raw_cmd_free(struct floppy_raw_cmd **ptr)
3175{ 3195{
3176 struct floppy_raw_cmd *next, *this; 3196 struct floppy_raw_cmd *next;
3197 struct floppy_raw_cmd *this;
3177 3198
3178 this = *ptr; 3199 this = *ptr;
3179 *ptr = NULL; 3200 *ptr = NULL;
@@ -3245,8 +3266,10 @@ static inline int raw_cmd_copyin(int cmd, char __user *param,
3245 3266
3246static int raw_cmd_ioctl(int cmd, void __user *param) 3267static int raw_cmd_ioctl(int cmd, void __user *param)
3247{ 3268{
3248 int drive, ret, ret2;
3249 struct floppy_raw_cmd *my_raw_cmd; 3269 struct floppy_raw_cmd *my_raw_cmd;
3270 int drive;
3271 int ret2;
3272 int ret;
3250 3273
3251 if (FDCS->rawcmd <= 1) 3274 if (FDCS->rawcmd <= 1)
3252 FDCS->rawcmd = 1; 3275 FDCS->rawcmd = 1;
@@ -3453,7 +3476,8 @@ static int fd_ioctl(struct inode *inode, struct file *filp, unsigned int cmd,
3453#define IN(c,x,tag) case c: *(x) = inparam. tag ; return 0 3476#define IN(c,x,tag) case c: *(x) = inparam. tag ; return 0
3454 3477
3455 int drive = (long)inode->i_bdev->bd_disk->private_data; 3478 int drive = (long)inode->i_bdev->bd_disk->private_data;
3456 int i, type = ITYPE(UDRS->fd_device); 3479 int type = ITYPE(UDRS->fd_device);
3480 int i;
3457 int ret; 3481 int ret;
3458 int size; 3482 int size;
3459 union inparam { 3483 union inparam {
@@ -3619,8 +3643,7 @@ static void __init config_types(void)
3619 if (!UDP->cmos && FLOPPY1_TYPE) 3643 if (!UDP->cmos && FLOPPY1_TYPE)
3620 UDP->cmos = FLOPPY1_TYPE; 3644 UDP->cmos = FLOPPY1_TYPE;
3621 3645
3622 /* XXX */ 3646 /* FIXME: additional physical CMOS drive detection should go here */
3623 /* additional physical CMOS drive detection should go here */
3624 3647
3625 for (drive = 0; drive < N_DRIVE; drive++) { 3648 for (drive = 0; drive < N_DRIVE; drive++) {
3626 unsigned int type = UDP->cmos; 3649 unsigned int type = UDP->cmos;
@@ -3903,13 +3926,13 @@ static int floppy_revalidate(struct gendisk *disk)
3903} 3926}
3904 3927
3905static struct block_device_operations floppy_fops = { 3928static struct block_device_operations floppy_fops = {
3906 .owner = THIS_MODULE, 3929 .owner = THIS_MODULE,
3907 .open = floppy_open, 3930 .open = floppy_open,
3908 .release = floppy_release, 3931 .release = floppy_release,
3909 .ioctl = fd_ioctl, 3932 .ioctl = fd_ioctl,
3910 .getgeo = fd_getgeo, 3933 .getgeo = fd_getgeo,
3911 .media_changed = check_floppy_change, 3934 .media_changed = check_floppy_change,
3912 .revalidate_disk = floppy_revalidate, 3935 .revalidate_disk = floppy_revalidate,
3913}; 3936};
3914 3937
3915/* 3938/*
@@ -4428,8 +4451,8 @@ static int floppy_grab_irq_and_dma(void)
4428 if (FDCS->address != -1) 4451 if (FDCS->address != -1)
4429 fd_outb(FDCS->dor, FD_DOR); 4452 fd_outb(FDCS->dor, FD_DOR);
4430 /* 4453 /*
4431 * The driver will try and free resources and relies on us 4454 * The driver will try and free resources and relies on us
4432 * to know if they were allocated or not. 4455 * to know if they were allocated or not.
4433 */ 4456 */
4434 fdc = 0; 4457 fdc = 0;
4435 irqdma_allocated = 1; 4458 irqdma_allocated = 1;