Re: IDE-Floppy and devfs

From: Andreas Franck (afranck@gmx.de)
Date: Mon Oct 23 2000 - 18:33:57 EST


Hi Paul, hi Richard, hi linux-kernel audience,

Paul Bristow wrote:
> Hi Andreas,
>
> Could you re-send the patch, as it didn't make it with your last
> message?

Sorry, my mailer crashed when I sent this message and I didn't even
notice it got sent :-) So here's what you're waitung for (at least
I hope so). I have done some further cleanups for module initialization
et al., to make it look more like other (newer) drivers I saw elsewhere
in the source tree.
 
So here it comes (attached).

Greetings,
Andreas

PS: Sorry for this extra resend to linux-kernel, I incorrectly tried
to CC linux­kernel@vger.rutgers.edu im my mail to Paul and Richard,
which didn't
work as I could have expected, if it wasn't that late.

--
->>>----------------------- Andreas Franck --------<<<-
---<<<---- Andreas.Franck@post.rwth-aachen.de --->>>---
->>>---- Keep smiling! ----------------------------<<<-

--- linux/drivers/ide/ide-floppy.c.old Sun Oct 8 16:42:21 2000 +++ linux/drivers/ide/ide-floppy.c Wed Oct 11 02:15:22 2000 @@ -29,6 +29,15 @@ * Ver 0.9 Jul 4 99 Fix a bug which might have caused the number of * bytes requested on each interrupt to be zero. * Thanks to <shanos@es.co.nz> for pointing this out. + * Ver 0.10 Oct 8 00 Fix devfs support - now a /dev/ide/.../lun0/floppy + * entry, four partition entries (part1..part4), and + * symlinks in /dev/ide/floppy are created for each + * IDE floppy device. + * + */ + +/* + * Changed to support devfs registration - 8.10.2000 Andreas Franck <afranck@gmx.de> */ #define IDEFLOPPY_VERSION "0.9" @@ -48,6 +57,7 @@ #include <linux/malloc.h> #include <linux/cdrom.h> #include <linux/ide.h> +#include <linux/devfs_fs_kernel.h> #include <asm/byteorder.h> #include <asm/irq.h> @@ -236,7 +246,8 @@ idefloppy_capacity_descriptor_t capacity; /* Last format capacity */ idefloppy_flexible_disk_page_t flexible_disk_page; /* Copy of the flexible disk page */ int wp; /* Write protect */ - + devfs_handle_t de; /* devfs entry */ + unsigned int flags; /* Status/Action flags */ } idefloppy_floppy_t; @@ -1526,6 +1537,21 @@ } +/* + * Register drive with devfs + */ +static int idefloppy_register (ide_drive_t *drive, int major, int minor) +{ + idefloppy_floppy_t *floppy = drive->driver_data; + + floppy->de = devfs_register (drive->de, "floppy", DEVFS_FL_DEFAULT, + major, minor, + S_IFBLK | S_IRUGO | S_IWUGO, + ide_fops, NULL); + + return 0; +} + /* * Driver initialization. */ @@ -1560,13 +1586,28 @@ max_sectors[major][minor + i] = 64; } + + idefloppy_register (drive, major, minor); + (void) idefloppy_get_capacity (drive); idefloppy_add_settings(drive); for (i = 0; i < MAX_DRIVES; ++i) { ide_hwif_t *hwif = HWIF(drive); if (drive != &hwif->drives[i]) continue; - hwif->gd->de_arr[i] = drive->de; + hwif->gd->de_arr[i] = drive->de; + + /* + * Stop grok_partitions from building + * the devfs "disc" and "part[1..n]" + * entries, we'll try to do it a little + * bit smarter so partitions exist without + * media. If media is inserted, this partition + * assumptions are corrected to reflect the actual + * partition settings. + */ +/* hwif->gd->de_arr[i] = 0; */ + if (drive->removable) hwif->gd->flags[i] |= GENHD_FL_REMOVABLE; break; @@ -1579,6 +1620,9 @@ if (ide_unregister_subdriver (drive)) return 1; + + devfs_unregister(floppy->de); + drive->driver_data = NULL; kfree (floppy); return 0; @@ -1601,24 +1645,24 @@ * IDE subdriver functions, registered with ide.c */ static ide_driver_t idefloppy_driver = { - "ide-floppy", /* name */ - IDEFLOPPY_VERSION, /* version */ - ide_floppy, /* media */ - 0, /* busy */ - 1, /* supports_dma */ - 0, /* supports_dsc_overlap */ - idefloppy_cleanup, /* cleanup */ - idefloppy_do_request, /* do_request */ - idefloppy_end_request, /* end_request */ - idefloppy_ioctl, /* ioctl */ - idefloppy_open, /* open */ - idefloppy_release, /* release */ - idefloppy_media_change, /* media_change */ - idefloppy_revalidate, /* media_change */ - NULL, /* pre_reset */ - idefloppy_capacity, /* capacity */ - NULL, /* special */ - idefloppy_proc /* proc */ + name: "ide-floppy", /* name */ + version: IDEFLOPPY_VERSION, /* version */ + media: ide_floppy, /* media */ + busy: 0, /* busy */ + supports_dma: 1, /* supports_dma */ + supports_dsc_overlap: 0, /* supports_dsc_overlap */ + cleanup: idefloppy_cleanup, /* cleanup */ + do_request: idefloppy_do_request, /* do_request */ + end_request: idefloppy_end_request, /* end_request */ + ioctl: idefloppy_ioctl, /* ioctl */ + open: idefloppy_open, /* open */ + release: idefloppy_release, /* release */ + media_change: idefloppy_media_change, /* media_change */ + revalidate: idefloppy_revalidate, /* revalidate */ + pre_reset: NULL, /* pre_reset */ + capacity: idefloppy_capacity, /* capacity */ + special: NULL, /* special */ + proc: idefloppy_proc /* proc */ }; int idefloppy_init (void); @@ -1639,7 +1683,7 @@ int failed = 0; MOD_INC_USE_COUNT; - while ((drive = ide_scan_devices (ide_floppy, idefloppy_driver.name, NULL, failed++)) != NULL) { + while ((drive = ide_scan_devices (ide_floppy, idefloppy_driver.name, NULL, failed++)) != NULL) { if (!idefloppy_identify_device (drive, drive->id)) { printk (KERN_ERR "ide-floppy: %s: not supported by this version of ide-floppy\n", drive->name); continue; @@ -1656,29 +1700,29 @@ printk (KERN_ERR "ide-floppy: %s: Failed to register the driver with ide.c\n", drive->name); kfree (floppy); continue; - } + } + DRIVER(drive)->busy++; + printk(KERN_INFO "%s: calling idefloppy_setup\n", drive->name); idefloppy_setup (drive, floppy); + printk(KERN_INFO "%s: idefloppy_setup finished\n", drive->name); + DRIVER(drive)->busy--; failed--; } + printk(KERN_INFO "calling ide_register_module\n"); ide_register_module(&idefloppy_module); + printk(KERN_INFO "ide_register_module finished\n"); MOD_DEC_USE_COUNT; return 0; } -#ifdef MODULE -int init_module (void) -{ - return idefloppy_init (); -} - -void cleanup_module (void) +static void __exit idefloppy_exit (void) { ide_drive_t *drive; int failed = 0; while ((drive = ide_scan_devices (ide_floppy, idefloppy_driver.name, &idefloppy_driver, failed)) != NULL) { if (idefloppy_cleanup (drive)) { - printk ("%s: cleanup_module() called while still busy\n", drive->name); + printk ("%s: idefloppy_exit() called while still busy\n", drive->name); failed++; } /* We must remove proc entries defined in this module. @@ -1688,4 +1732,7 @@ } ide_unregister_module(&idefloppy_module); } -#endif /* MODULE */ + +module_init(idefloppy_init); +module_exit(idefloppy_exit); +

- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org Please read the FAQ at http://www.tux.org/lkml/



This archive was generated by hypermail 2b29 : Mon Oct 23 2000 - 21:00:22 EST