diff options
Diffstat (limited to 'drivers/block/floppy.c')
-rw-r--r-- | drivers/block/floppy.c | 83 |
1 files changed, 55 insertions, 28 deletions
diff --git a/drivers/block/floppy.c b/drivers/block/floppy.c index 7b956dfae..be7e25879 100644 --- a/drivers/block/floppy.c +++ b/drivers/block/floppy.c @@ -144,6 +144,10 @@ static int irqdma_allocated = 0; #define FDPATCHES #include <linux/fdreg.h> +/* + * 1998/1/21 -- Richard Gooch <rgooch@atnf.csiro.au> -- devfs support + */ + #include <linux/fd.h> #include <linux/hdreg.h> @@ -158,6 +162,7 @@ static int irqdma_allocated = 0; #include <linux/ioport.h> #include <linux/interrupt.h> #include <linux/init.h> +#include <linux/devfs_fs_kernel.h> /* * PS/2 floppies have much slower step rates than regular floppies. @@ -196,7 +201,9 @@ static int use_virtual_dma=0; static unsigned short virtual_dma_port=0x3f0; void floppy_interrupt(int irq, void *dev_id, struct pt_regs * regs); static int set_dor(int fdc, char mask, char data); -static inline int __get_order(unsigned long size); +static void register_devfs_entries (int drive); +static devfs_handle_t devfs_handle = NULL; + #define K_64 0x10000 /* 64KB */ #include <asm/floppy.h> @@ -213,26 +220,12 @@ static inline int __get_order(unsigned long size); /* Dma Memory related stuff */ -/* Pure 2^n version of get_order */ -static inline int __get_order(unsigned long size) -{ - int order; - - size = (size-1) >> (PAGE_SHIFT-1); - order = -1; - do { - size >>= 1; - order++; - } while (size); - return order; -} - #ifndef fd_dma_mem_free -#define fd_dma_mem_free(addr, size) free_pages(addr, __get_order(size)) +#define fd_dma_mem_free(addr, size) free_pages(addr, get_order(size)) #endif #ifndef fd_dma_mem_alloc -#define fd_dma_mem_alloc(size) __get_dma_pages(GFP_KERNEL,__get_order(size)) +#define fd_dma_mem_alloc(size) __get_dma_pages(GFP_KERNEL,get_order(size)) #endif static inline void fallback_on_nodma_alloc(char **addr, size_t l) @@ -2276,7 +2269,7 @@ static void request_done(int uptodate) probing = 0; reschedule_timeout(MAXTIMEOUT, "request done %d", uptodate); - if (!CURRENT){ + if (QUEUE_EMPTY){ DPRINT("request list destroyed in floppy request done\n"); return; } @@ -2290,14 +2283,14 @@ static void request_done(int uptodate) DRS->maxtrack = 1; /* unlock chained buffers */ - while (current_count_sectors && CURRENT && + while (current_count_sectors && !QUEUE_EMPTY && current_count_sectors >= CURRENT->current_nr_sectors){ current_count_sectors -= CURRENT->current_nr_sectors; CURRENT->nr_sectors -= CURRENT->current_nr_sectors; CURRENT->sector += CURRENT->current_nr_sectors; end_request(1); } - if (current_count_sectors && CURRENT){ + if (current_count_sectors && !QUEUE_EMPTY){ /* "unlock" last subsector */ CURRENT->buffer += current_count_sectors <<9; CURRENT->current_nr_sectors -= current_count_sectors; @@ -2306,7 +2299,7 @@ static void request_done(int uptodate) return; } - if (current_count_sectors && !CURRENT) + if (current_count_sectors && QUEUE_EMPTY) DPRINT("request list destroyed in floppy request done\n"); } else { @@ -2869,14 +2862,14 @@ static void redo_fd_request(void) if (current_drive < N_DRIVE) floppy_off(current_drive); - if (CURRENT && CURRENT->rq_status == RQ_INACTIVE){ + if (!QUEUE_EMPTY && CURRENT->rq_status == RQ_INACTIVE){ CLEAR_INTR; unlock_fdc(); return; } while(1){ - if (!CURRENT) { + if (QUEUE_EMPTY) { CLEAR_INTR; unlock_fdc(); return; @@ -3631,6 +3624,7 @@ static void config_types(void) first = 0; } printk("%s fd%d is %s", prepend, drive, name); + register_devfs_entries (drive); } *UDP = *params; } @@ -3844,6 +3838,37 @@ static struct block_device_operations floppy_fops = { revalidate: floppy_revalidate, }; +static void register_devfs_entries (int drive) +{ + int base_minor, i; + static char *table[] = + {"", "d360", "h1200", "u360", "u720", "h360", "h720", + "u1440", "u2880", "CompaQ", "h1440", "u1680", "h410", + "u820", "h1476", "u1722", "h420", "u830", "h1494", "u1743", + "h880", "u1040", "u1120", "h1600", "u1760", "u1920", + "u3200", "u3520", "u3840", "u1840", "u800", "u1600", + NULL + }; + static int t360[] = {1,0}, t1200[] = {2,5,6,10,12,14,16,18,20,23,0}, + t3in[] = {8,9,26,27,28, 7,11,15,19,24,25,29,31, 3,4,13,17,21,22,30,0}; + static int *table_sup[] = + {NULL, t360, t1200, t3in+5+8, t3in+5, t3in, t3in}; + + base_minor = (drive < 4) ? drive : (124 + drive); + if (UDP->cmos <= NUMBER(default_drive_params)) { + i = 0; + do { + char name[16]; + + sprintf (name, "%d%s", drive, table[table_sup[UDP->cmos][i]]); + devfs_register (devfs_handle, name, 0, DEVFS_FL_DEFAULT, MAJOR_NR, + base_minor + (table_sup[UDP->cmos][i] << 2), + S_IFBLK | S_IRUSR | S_IWUSR | S_IRGRP |S_IWGRP, + 0, 0, &floppy_fops, NULL); + } while (table_sup[UDP->cmos][i++]); + } +} + /* * Floppy Driver initialization * ============================= @@ -4066,7 +4091,8 @@ int __init floppy_init(void) raw_cmd = 0; - if (register_blkdev(MAJOR_NR,"fd",&floppy_fops)) { + devfs_handle = devfs_mk_dir (NULL, "floppy", 0, NULL); + if (devfs_register_blkdev(MAJOR_NR,"fd",&floppy_fops)) { printk("Unable to get major %d for floppy\n",MAJOR_NR); return -EBUSY; } @@ -4097,7 +4123,7 @@ int __init floppy_init(void) use_virtual_dma = can_use_virtual_dma & 1; fdc_state[0].address = FDC1; if (fdc_state[0].address == -1) { - unregister_blkdev(MAJOR_NR,"fd"); + devfs_unregister_blkdev(MAJOR_NR,"fd"); del_timer(&fd_timeout); return -ENODEV; } @@ -4109,7 +4135,7 @@ int __init floppy_init(void) if (floppy_grab_irq_and_dma()){ del_timer(&fd_timeout); blk_cleanup_queue(BLK_DEFAULT_QUEUE(MAJOR_NR)); - unregister_blkdev(MAJOR_NR,"fd"); + devfs_unregister_blkdev(MAJOR_NR,"fd"); del_timer(&fd_timeout); return -EBUSY; } @@ -4175,7 +4201,7 @@ int __init floppy_init(void) if (usage_count) floppy_release_irq_and_dma(); blk_cleanup_queue(BLK_DEFAULT_QUEUE(MAJOR_NR)); - unregister_blkdev(MAJOR_NR,"fd"); + devfs_unregister_blkdev(MAJOR_NR,"fd"); } for (drive = 0; drive < N_DRIVE; drive++) { @@ -4413,7 +4439,8 @@ void cleanup_module(void) { int dummy; - unregister_blkdev(MAJOR_NR, "fd"); + devfs_unregister (devfs_handle); + devfs_unregister_blkdev(MAJOR_NR, "fd"); blk_cleanup_queue(BLK_DEFAULT_QUEUE(MAJOR_NR)); /* eject disk, if any */ |