diff options
| -rw-r--r-- | drivers/acorn/block/mfmhd.c | 131 |
1 files changed, 69 insertions, 62 deletions
diff --git a/drivers/acorn/block/mfmhd.c b/drivers/acorn/block/mfmhd.c index ab85d086956a..32bef8806190 100644 --- a/drivers/acorn/block/mfmhd.c +++ b/drivers/acorn/block/mfmhd.c @@ -880,19 +880,7 @@ static void mfm_rerequest(void) mfm_request(); } -static struct gendisk mfm_gendisk[2] = { -{ - .major = MAJOR_NR, - .first_minor = 0, - .disk_name = "mfma", - .minor_shift = 6, -}, -{ - .major = MAJOR_NR, - .first_minor = 64, - .disk_name = "mfmb", - .minor_shift = 6, -}; +static struct gendisk *mfm_gendisk[2]; static void mfm_request(void) { @@ -908,6 +896,7 @@ static void mfm_request(void) while (1) { unsigned int dev, block, nsect, unit; + struct gendisk *disk; DBG("mfm_request: loop start\n"); sti(); @@ -930,14 +919,13 @@ static void mfm_request(void) #ifdef DEBUG /*if (unit==1) */ console_printf("mfm_request: raw vals: dev=%d (block=512 bytes) block=%d nblocks=%d\n", dev, block, nsect); #endif - if (unit >= mfm_drives || - block >= get_capacity(mfm_gendisk + unit) || - ((block+nsect) > get_capacity(mfm_gendisk + unit))) { - if (unit >= mfm_drives) - printk("mfm: bad minor number: device=%s\n", kdevname(CURRENT->rq_dev)); - else - printk("mfm%c: bad access: block=%d, count=%d, nr_sects=%ld\n", unit+'a', - block, nsect, get_capacity(mfm_gendisk+unit)); + if (unit >= mfm_drives) + printk("mfm: bad disk number: %d\n", unit); + disk = mfm_gendisk[unit]; + if (block >= get_capacity(disk) || + block+nsect > get_capacity(disk)) { + printk("%s: bad access: block=%d, count=%d, nr_sects=%ld\n", + disk->disk_name, block, nsect, get_capacity(disk)); printk("mfm: continue 1\n"); end_request(CURRENT, 0); Busy = 0; @@ -1017,7 +1005,7 @@ static void mfm_interrupt_handler(int unused, void *dev_id, struct pt_regs *regs static void mfm_geometry(int drive) { struct mfm_info *p = mfm_info + drive; - struct gendisk *disk = mfm_gendisk + drive; + struct gendisk *disk = mfm_gendisk[drive]; if (p->cylinders) printk ("%s: %dMB CHS=%d/%d/%d LCC=%d RECOMP=%d\n", disk->disk_name, @@ -1255,26 +1243,6 @@ static struct block_device_operations mfm_fops = .ioctl = mfm_ioctl, }; -static void mfm_geninit (void) -{ - int i; - - mfm_drives = mfm_initdrives(); - - printk("mfm: detected %d hard drive%s\n", mfm_drives, - mfm_drives == 1 ? "" : "s"); - if (request_irq(mfm_irq, mfm_interrupt_handler, SA_INTERRUPT, "MFM harddisk", NULL)) - printk("mfm: unable to get IRQ%d\n", mfm_irq); - - if (mfm_irqenable) - outw(0x80, mfm_irqenable); /* Required to enable IRQs from MFM podule */ - - for (i = 0; i < mfm_drives; i++) { - mfm_geometry(i); - add_disk(mfm_gendisk + i); - } -} - static struct expansion_card *ecs; /* @@ -1317,9 +1285,10 @@ static int mfm_probecontroller (unsigned int mfm_addr) * * The HDC is accessed at MEDIUM IOC speeds. */ -int mfm_init (void) +static int __init mfm_init (void) { unsigned char irqmask; + int i; if (mfm_probecontroller(ONBOARD_MFM_ADDRESS)) { mfm_addr = ONBOARD_MFM_ADDRESS; @@ -1344,16 +1313,12 @@ int mfm_init (void) } printk("mfm: found at address %08X, interrupt %d\n", mfm_addr, mfm_irq); - if (!request_region (mfm_addr, 10, "mfm")) { - ecard_release(ecs); - return -1; - } + if (!request_region (mfm_addr, 10, "mfm")) + goto out1; if (register_blkdev(MAJOR_NR, "mfm", &mfm_fops)) { printk("mfm_init: unable to get major number %d\n", MAJOR_NR); - ecard_release(ecs); - release_region(mfm_addr, 10); - return -1; + goto out2; } /* Stuff for the assembler routines to get to */ @@ -1366,31 +1331,73 @@ int mfm_init (void) Busy = 0; lastspecifieddrive = -1; - mfm_geninit(); - return 0; -} + mfm_drives = mfm_initdrives(); + if (!mfm_drives) + goto out3; + + for (i = 0; i < mfm_drives; i++) { + struct gendisk *disk = alloc_disk(); + if (!disk) + goto Enomem; + disk->major = MAJOR_NR; + disk->first_minor = i << 6; + disk->minor_shift = 6; + disk->fops = &mfm_fops; + sprintf(disk->disk_name, "mfm%c", 'a'+i); + mfm_gendisk[i] = disk; + } -#ifdef MODULE + printk("mfm: detected %d hard drive%s\n", mfm_drives, + mfm_drives == 1 ? "" : "s"); + if (request_irq(mfm_irq, mfm_interrupt_handler, SA_INTERRUPT, "MFM harddisk", NULL)) { + printk("mfm: unable to get IRQ%d\n", mfm_irq); + goto out4; + } -MODULE_LICENSE("GPL"); + if (mfm_irqenable) + outw(0x80, mfm_irqenable); /* Required to enable IRQs from MFM podule */ -int init_module(void) -{ - return mfm_init(); + for (i = 0; i < mfm_drives; i++) { + mfm_geometry(i); + add_disk(mfm_gendisk[i]); + } + return 0; + +out4: + for (i = 0; i < mfm_drives; i++) + put_disk(mfm_gendisk[i]); +out3: + blk_cleanup_queue(BLK_DEFAULT_QUEUE(MAJOR_NR)); + unregister_blkdev(MAJOR_NR, "mfm"); +out2: + release_region(mfm_addr, 10); +out1: + ecard_release(ecs); + return -1; +Enomem: + while (i--) + put_disk(mfm_gendisk[i]); + goto out3; } -void cleanup_module(void) +static void __exit mfm_exit(void) { int i; if (ecs && mfm_irqenable) outw (0, mfm_irqenable); /* Required to enable IRQs from MFM podule */ free_irq(mfm_irq, NULL); + for (i = 0; i < mfm_drives; i++) { + del_gendisk(mfm_gendisk[i]); + put_disk(mfm_gendisk[i]); + } + blk_cleanup_queue(BLK_DEFAULT_QUEUE(MAJOR_NR)); unregister_blkdev(MAJOR_NR, "mfm"); - for (i = 0; i < mfm_drives; i++) - del_gendisk(mfm_gendisk + i); if (ecs) ecard_release(ecs); if (mfm_addr) release_region(mfm_addr, 10); } -#endif + +module_init(mfm_init) +module_exit(mfm_exit) +MODULE_LICENSE("GPL"); |
