complete(&hwif->gendev_rel_comp);
 }
 
-static void ide_register_port(ide_hwif_t *hwif)
+static int ide_register_port(ide_hwif_t *hwif)
 {
        int ret;
 
        }
        hwif->gendev.release = hwif_release_dev;
        ret = device_register(&hwif->gendev);
-       if (ret < 0)
+       if (ret < 0) {
                printk(KERN_WARNING "IDE: %s: device_register error: %d\n",
                        __FUNCTION__, ret);
+               goto out;
+       }
+
+       get_device(&hwif->gendev);
+
+       hwif->portdev = device_create(ide_port_class, &hwif->gendev,
+                                     MKDEV(0, 0), hwif->name);
+       if (IS_ERR(hwif->portdev)) {
+               ret = PTR_ERR(hwif->portdev);
+               device_unregister(&hwif->gendev);
+       }
+       dev_set_drvdata(hwif->portdev, hwif);
+out:
+       return ret;
 }
 
 /**
        }
 }
 
+static ssize_t store_delete_devices(struct device *portdev,
+                                   struct device_attribute *attr,
+                                   const char *buf, size_t n)
+{
+       ide_hwif_t *hwif = dev_get_drvdata(portdev);
+
+       if (strncmp(buf, "1", n))
+               return -EINVAL;
+
+       ide_port_unregister_devices(hwif);
+
+       return n;
+};
+
+static DEVICE_ATTR(delete_devices, S_IWUSR, NULL, store_delete_devices);
+
+static ssize_t store_scan(struct device *portdev,
+                         struct device_attribute *attr,
+                         const char *buf, size_t n)
+{
+       ide_hwif_t *hwif = dev_get_drvdata(portdev);
+
+       if (strncmp(buf, "1", n))
+               return -EINVAL;
+
+       ide_port_unregister_devices(hwif);
+       ide_port_scan(hwif);
+
+       return n;
+};
+
+static DEVICE_ATTR(scan, S_IWUSR, NULL, store_scan);
+
+static struct device_attribute *ide_port_attrs[] = {
+       &dev_attr_delete_devices,
+       &dev_attr_scan,
+       NULL
+};
+
+static int ide_sysfs_register_port(ide_hwif_t *hwif)
+{
+       int i, rc;
+
+       for (i = 0; ide_port_attrs[i]; i++) {
+               rc = device_create_file(hwif->portdev, ide_port_attrs[i]);
+               if (rc)
+                       break;
+       }
+
+       return rc;
+}
+
 int ide_device_add_all(u8 *idx, const struct ide_port_info *d)
 {
        ide_hwif_t *hwif, *mate = NULL;
                hwif = &ide_hwifs[idx[i]];
 
                if (hwif->present) {
+                       ide_sysfs_register_port(hwif);
                        ide_proc_register_port(hwif);
                        ide_proc_port_register_devices(hwif);
                }
 
 /* default maximum number of failures */
 #define IDE_DEFAULT_MAX_FAILURES       1
 
+struct class *ide_port_class;
+
 static const u8 ide_hwif_to_major[] = { IDE0_MAJOR, IDE1_MAJOR,
                                        IDE2_MAJOR, IDE3_MAJOR,
                                        IDE4_MAJOR, IDE5_MAJOR,
 
        ide_remove_port_from_hwgroup(hwif);
 
+       device_unregister(hwif->portdev);
        device_unregister(&hwif->gendev);
        wait_for_completion(&hwif->gendev_rel_comp);
 
 
 EXPORT_SYMBOL_GPL(ide_bus_type);
 
+static void ide_port_class_release(struct device *portdev)
+{
+       ide_hwif_t *hwif = dev_get_drvdata(portdev);
+
+       put_device(&hwif->gendev);
+}
+
 /*
  * This is gets invoked once during initialization, to set *everything* up
  */
                return ret;
        }
 
+       ide_port_class = class_create(THIS_MODULE, "ide_port");
+       if (IS_ERR(ide_port_class)) {
+               ret = PTR_ERR(ide_port_class);
+               goto out_port_class;
+       }
+       ide_port_class->dev_release = ide_port_class_release;
+
        init_ide_data();
 
        proc_ide_create();
 
        return 0;
+
+out_port_class:
+       bus_unregister(&ide_bus_type);
+
+       return ret;
 }
 
 #ifdef MODULE
 
        proc_ide_destroy();
 
+       class_destroy(ide_port_class);
+
        bus_unregister(&ide_bus_type);
 }
 
 
        unsigned        mmio       : 1; /* host uses MMIO */
        unsigned        straight8  : 1; /* Alan's straight 8 check */
 
-       struct device   gendev;
+       struct device           gendev;
+       struct device           *portdev;
+
        struct completion gendev_rel_comp; /* To deal with device release() */
 
        void            *hwif_data;     /* extra hwif data */
 #define local_irq_set(flags)   do { local_save_flags((flags)); local_irq_enable_in_hardirq(); } while (0)
 
 extern struct bus_type ide_bus_type;
+extern struct class *ide_port_class;
 
 /* check if CACHE FLUSH (EXT) command is supported (bits defined in ATA-6) */
 #define ide_id_has_flush_cache(id)     ((id)->cfs_enable_2 & 0x3000)