|
@@ -1818,11 +1818,41 @@ static const struct block_device_operations floppy_fops = {
|
|
.check_events = amiga_check_events,
|
|
.check_events = amiga_check_events,
|
|
};
|
|
};
|
|
|
|
|
|
|
|
+static struct gendisk *fd_alloc_disk(int drive)
|
|
|
|
+{
|
|
|
|
+ struct gendisk *disk;
|
|
|
|
+
|
|
|
|
+ disk = alloc_disk(1);
|
|
|
|
+ if (!disk)
|
|
|
|
+ goto out;
|
|
|
|
+
|
|
|
|
+ disk->queue = blk_init_queue(do_fd_request, &amiflop_lock);
|
|
|
|
+ if (IS_ERR(disk->queue)) {
|
|
|
|
+ disk->queue = NULL;
|
|
|
|
+ goto out_put_disk;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ unit[drive].trackbuf = kmalloc(FLOPPY_MAX_SECTORS * 512, GFP_KERNEL);
|
|
|
|
+ if (!unit[drive].trackbuf)
|
|
|
|
+ goto out_cleanup_queue;
|
|
|
|
+
|
|
|
|
+ return disk;
|
|
|
|
+
|
|
|
|
+out_cleanup_queue:
|
|
|
|
+ blk_cleanup_queue(disk->queue);
|
|
|
|
+ disk->queue = NULL;
|
|
|
|
+out_put_disk:
|
|
|
|
+ put_disk(disk);
|
|
|
|
+out:
|
|
|
|
+ unit[drive].type->code = FD_NODRIVE;
|
|
|
|
+ return NULL;
|
|
|
|
+}
|
|
|
|
+
|
|
static int __init fd_probe_drives(void)
|
|
static int __init fd_probe_drives(void)
|
|
{
|
|
{
|
|
int drive,drives,nomem;
|
|
int drive,drives,nomem;
|
|
|
|
|
|
- printk(KERN_INFO "FD: probing units\nfound ");
|
|
|
|
|
|
+ pr_info("FD: probing units\nfound");
|
|
drives=0;
|
|
drives=0;
|
|
nomem=0;
|
|
nomem=0;
|
|
for(drive=0;drive<FD_MAX_UNITS;drive++) {
|
|
for(drive=0;drive<FD_MAX_UNITS;drive++) {
|
|
@@ -1830,27 +1860,17 @@ static int __init fd_probe_drives(void)
|
|
fd_probe(drive);
|
|
fd_probe(drive);
|
|
if (unit[drive].type->code == FD_NODRIVE)
|
|
if (unit[drive].type->code == FD_NODRIVE)
|
|
continue;
|
|
continue;
|
|
- disk = alloc_disk(1);
|
|
|
|
|
|
+
|
|
|
|
+ disk = fd_alloc_disk(drive);
|
|
if (!disk) {
|
|
if (!disk) {
|
|
- unit[drive].type->code = FD_NODRIVE;
|
|
|
|
|
|
+ pr_cont(" no mem for fd%d", drive);
|
|
|
|
+ nomem = 1;
|
|
continue;
|
|
continue;
|
|
}
|
|
}
|
|
unit[drive].gendisk = disk;
|
|
unit[drive].gendisk = disk;
|
|
-
|
|
|
|
- disk->queue = blk_init_queue(do_fd_request, &amiflop_lock);
|
|
|
|
- if (!disk->queue) {
|
|
|
|
- unit[drive].type->code = FD_NODRIVE;
|
|
|
|
- continue;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
drives++;
|
|
drives++;
|
|
- if ((unit[drive].trackbuf = kmalloc(FLOPPY_MAX_SECTORS * 512, GFP_KERNEL)) == NULL) {
|
|
|
|
- printk("no mem for ");
|
|
|
|
- unit[drive].type = &drive_types[num_dr_types - 1]; /* FD_NODRIVE */
|
|
|
|
- drives--;
|
|
|
|
- nomem = 1;
|
|
|
|
- }
|
|
|
|
- printk("fd%d ",drive);
|
|
|
|
|
|
+
|
|
|
|
+ pr_cont(" fd%d",drive);
|
|
disk->major = FLOPPY_MAJOR;
|
|
disk->major = FLOPPY_MAJOR;
|
|
disk->first_minor = drive;
|
|
disk->first_minor = drive;
|
|
disk->fops = &floppy_fops;
|
|
disk->fops = &floppy_fops;
|
|
@@ -1861,11 +1881,11 @@ static int __init fd_probe_drives(void)
|
|
}
|
|
}
|
|
if ((drives > 0) || (nomem == 0)) {
|
|
if ((drives > 0) || (nomem == 0)) {
|
|
if (drives == 0)
|
|
if (drives == 0)
|
|
- printk("no drives");
|
|
|
|
- printk("\n");
|
|
|
|
|
|
+ pr_cont(" no drives");
|
|
|
|
+ pr_cont("\n");
|
|
return drives;
|
|
return drives;
|
|
}
|
|
}
|
|
- printk("\n");
|
|
|
|
|
|
+ pr_cont("\n");
|
|
return -ENOMEM;
|
|
return -ENOMEM;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -1948,30 +1968,6 @@ out_blkdev:
|
|
return ret;
|
|
return ret;
|
|
}
|
|
}
|
|
|
|
|
|
-#if 0 /* not safe to unload */
|
|
|
|
-static int __exit amiga_floppy_remove(struct platform_device *pdev)
|
|
|
|
-{
|
|
|
|
- int i;
|
|
|
|
-
|
|
|
|
- for( i = 0; i < FD_MAX_UNITS; i++) {
|
|
|
|
- if (unit[i].type->code != FD_NODRIVE) {
|
|
|
|
- struct request_queue *q = unit[i].gendisk->queue;
|
|
|
|
- del_gendisk(unit[i].gendisk);
|
|
|
|
- put_disk(unit[i].gendisk);
|
|
|
|
- kfree(unit[i].trackbuf);
|
|
|
|
- if (q)
|
|
|
|
- blk_cleanup_queue(q);
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- blk_unregister_region(MKDEV(FLOPPY_MAJOR, 0), 256);
|
|
|
|
- free_irq(IRQ_AMIGA_CIAA_TB, NULL);
|
|
|
|
- free_irq(IRQ_AMIGA_DSKBLK, NULL);
|
|
|
|
- custom.dmacon = DMAF_DISK; /* disable DMA */
|
|
|
|
- amiga_chip_free(raw_buf);
|
|
|
|
- unregister_blkdev(FLOPPY_MAJOR, "fd");
|
|
|
|
-}
|
|
|
|
-#endif
|
|
|
|
-
|
|
|
|
static struct platform_driver amiga_floppy_driver = {
|
|
static struct platform_driver amiga_floppy_driver = {
|
|
.driver = {
|
|
.driver = {
|
|
.name = "amiga-floppy",
|
|
.name = "amiga-floppy",
|