|
@@ -169,13 +169,6 @@ static int __init xd_init(void)
|
|
|
|
|
|
init_timer (&xd_watchdog_int); xd_watchdog_int.function = xd_watchdog;
|
|
|
|
|
|
- if (!xd_dma_buffer)
|
|
|
- xd_dma_buffer = (char *)xd_dma_mem_alloc(xd_maxsectors * 0x200);
|
|
|
- if (!xd_dma_buffer) {
|
|
|
- printk(KERN_ERR "xd: Out of memory.\n");
|
|
|
- return -ENOMEM;
|
|
|
- }
|
|
|
-
|
|
|
err = -EBUSY;
|
|
|
if (register_blkdev(XT_DISK_MAJOR, "xd"))
|
|
|
goto out1;
|
|
@@ -202,6 +195,19 @@ static int __init xd_init(void)
|
|
|
xd_drives,xd_drives == 1 ? "" : "s",xd_irq,xd_dma);
|
|
|
}
|
|
|
|
|
|
+ /*
|
|
|
+ * With the drive detected, xd_maxsectors should now be known.
|
|
|
+ * If xd_maxsectors is 0, nothing was detected and we fall through
|
|
|
+ * to return -ENODEV
|
|
|
+ */
|
|
|
+ if (!xd_dma_buffer && xd_maxsectors) {
|
|
|
+ xd_dma_buffer = (char *)xd_dma_mem_alloc(xd_maxsectors * 0x200);
|
|
|
+ if (!xd_dma_buffer) {
|
|
|
+ printk(KERN_ERR "xd: Out of memory.\n");
|
|
|
+ goto out3;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
err = -ENODEV;
|
|
|
if (!xd_drives)
|
|
|
goto out3;
|
|
@@ -249,15 +255,17 @@ out4:
|
|
|
for (i = 0; i < xd_drives; i++)
|
|
|
put_disk(xd_gendisk[i]);
|
|
|
out3:
|
|
|
- release_region(xd_iobase,4);
|
|
|
+ if (xd_maxsectors)
|
|
|
+ release_region(xd_iobase,4);
|
|
|
+
|
|
|
+ if (xd_dma_buffer)
|
|
|
+ xd_dma_mem_free((unsigned long)xd_dma_buffer,
|
|
|
+ xd_maxsectors * 0x200);
|
|
|
out2:
|
|
|
blk_cleanup_queue(xd_queue);
|
|
|
out1a:
|
|
|
unregister_blkdev(XT_DISK_MAJOR, "xd");
|
|
|
out1:
|
|
|
- if (xd_dma_buffer)
|
|
|
- xd_dma_mem_free((unsigned long)xd_dma_buffer,
|
|
|
- xd_maxsectors * 0x200);
|
|
|
return err;
|
|
|
Enomem:
|
|
|
err = -ENOMEM;
|