Commit 06cdb4a9 authored by Jens Axboe's avatar Jens Axboe Committed by Linus Torvalds

[PATCH] amiflop error handling

amiflop didn't init the queue before assigning it to disk->queue. the
error handling was also immensely screwed, I've cleaned that up too.
parent e352d0c7
...@@ -1731,7 +1731,7 @@ static struct kobject *floppy_find(dev_t dev, int *part, void *data) ...@@ -1731,7 +1731,7 @@ static struct kobject *floppy_find(dev_t dev, int *part, void *data)
int __init amiga_floppy_init(void) int __init amiga_floppy_init(void)
{ {
int i; int i, ret;
if (!AMIGAHW_PRESENT(AMI_FLOPPY)) if (!AMIGAHW_PRESENT(AMI_FLOPPY))
return -ENXIO; return -ENXIO;
...@@ -1743,41 +1743,39 @@ int __init amiga_floppy_init(void) ...@@ -1743,41 +1743,39 @@ int __init amiga_floppy_init(void)
* We request DSKPTR, DSKLEN and DSKDATA only, because the other * We request DSKPTR, DSKLEN and DSKDATA only, because the other
* floppy registers are too spreaded over the custom register space * floppy registers are too spreaded over the custom register space
*/ */
ret = -EBUSY;
if (!request_mem_region(CUSTOM_PHYSADDR+0x20, 8, "amiflop [Paula]")) { if (!request_mem_region(CUSTOM_PHYSADDR+0x20, 8, "amiflop [Paula]")) {
printk("fd: cannot get floppy registers\n"); printk("fd: cannot get floppy registers\n");
unregister_blkdev(FLOPPY_MAJOR,"fd"); goto out_blkdev;
return -EBUSY;
} }
ret = -ENOMEM;
if ((raw_buf = (char *)amiga_chip_alloc (RAW_BUF_SIZE, "Floppy")) == if ((raw_buf = (char *)amiga_chip_alloc (RAW_BUF_SIZE, "Floppy")) ==
NULL) { NULL) {
printk("fd: cannot get chip mem buffer\n"); printk("fd: cannot get chip mem buffer\n");
release_mem_region(CUSTOM_PHYSADDR+0x20, 8); goto out_memregion;
unregister_blkdev(FLOPPY_MAJOR,"fd");
return -ENOMEM;
} }
ret = -EBUSY;
if (request_irq(IRQ_AMIGA_DSKBLK, fd_block_done, 0, "floppy_dma", NULL)) { if (request_irq(IRQ_AMIGA_DSKBLK, fd_block_done, 0, "floppy_dma", NULL)) {
printk("fd: cannot get irq for dma\n"); printk("fd: cannot get irq for dma\n");
amiga_chip_free(raw_buf); goto out_irq;
release_mem_region(CUSTOM_PHYSADDR+0x20, 8);
unregister_blkdev(FLOPPY_MAJOR,"fd");
return -EBUSY;
} }
if (request_irq(IRQ_AMIGA_CIAA_TB, ms_isr, 0, "floppy_timer", NULL)) { if (request_irq(IRQ_AMIGA_CIAA_TB, ms_isr, 0, "floppy_timer", NULL)) {
printk("fd: cannot get irq for timer\n"); printk("fd: cannot get irq for timer\n");
free_irq(IRQ_AMIGA_DSKBLK, NULL); goto out_irq2;
amiga_chip_free(raw_buf);
release_mem_region(CUSTOM_PHYSADDR+0x20, 8);
unregister_blkdev(FLOPPY_MAJOR,"fd");
return -EBUSY;
}
if (fd_probe_drives() < 1) { /* No usable drives */
free_irq(IRQ_AMIGA_CIAA_TB, NULL);
free_irq(IRQ_AMIGA_DSKBLK, NULL);
amiga_chip_free(raw_buf);
release_mem_region(CUSTOM_PHYSADDR+0x20, 8);
unregister_blkdev(FLOPPY_MAJOR,"fd");
return -ENXIO;
} }
ret = -ENOMEM;
floppy_queue = blk_init_queue(do_fd_request, &amiflop_lock);
if (!floppy_queue)
goto out_queue;
ret = -ENXIO;
if (fd_probe_drives() < 1) /* No usable drives */
goto out_probe;
blk_register_region(MKDEV(FLOPPY_MAJOR, 0), 256, THIS_MODULE, blk_register_region(MKDEV(FLOPPY_MAJOR, 0), 256, THIS_MODULE,
floppy_find, NULL, NULL); floppy_find, NULL, NULL);
...@@ -1804,17 +1802,6 @@ int __init amiga_floppy_init(void) ...@@ -1804,17 +1802,6 @@ int __init amiga_floppy_init(void)
post_write_timer.data = 0; post_write_timer.data = 0;
post_write_timer.function = post_write; post_write_timer.function = post_write;
floppy_queue = blk_init_queue(do_fd_request, &amiflop_lock);
if (!floppy_queue) {
free_irq(IRQ_AMIGA_CIAA_TB, NULL);
free_irq(IRQ_AMIGA_DSKBLK, NULL);
amiga_chip_free(raw_buf);
release_mem_region(CUSTOM_PHYSADDR+0x20, 8);
unregister_blkdev(FLOPPY_MAJOR,"fd");
blk_unregister_region(MKDEV(FLOPPY_MAJOR, 0), 256);
return -ENOMEM;
}
for (i = 0; i < 128; i++) for (i = 0; i < 128; i++)
mfmdecode[i]=255; mfmdecode[i]=255;
for (i = 0; i < 16; i++) for (i = 0; i < 16; i++)
...@@ -1826,6 +1813,20 @@ int __init amiga_floppy_init(void) ...@@ -1826,6 +1813,20 @@ int __init amiga_floppy_init(void)
/* init ms timer */ /* init ms timer */
ciaa.crb = 8; /* one-shot, stop */ ciaa.crb = 8; /* one-shot, stop */
return 0; return 0;
out_probe:
blk_cleanup_queue(floppy_queue);
out_queue:
free_irq(IRQ_AMIGA_CIAA_TB, NULL);
out_irq2:
free_irq(IRQ_AMIGA_DSKBLK, NULL);
out_irq:
amiga_chip_free(raw_buf);
out_memregion:
release_mem_region(CUSTOM_PHYSADDR+0x20, 8);
out_blkdev:
unregister_blkdev(FLOPPY_MAJOR,"fd");
return ret;
} }
#ifdef MODULE #ifdef MODULE
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment