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­[EMAIL PROTECTED] im my mail to Paul and Richard,
which didn't
work as I could have expected, if it wasn't that late.

--
->>>----------------------- Andreas Franck --------<<<-
---<<<---- [EMAIL PROTECTED] --->>>---
->>>---- 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 <[EMAIL PROTECTED]> 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 <[EMAIL PROTECTED]>
  */
 
 #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);
+

Reply via email to