|
@@ -623,7 +623,7 @@ static void hwif_release_dev (struct device *dev)
|
|
complete(&hwif->gendev_rel_comp);
|
|
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;
|
|
int ret;
|
|
|
|
|
|
@@ -639,9 +639,23 @@ static void ide_register_port(ide_hwif_t *hwif)
|
|
}
|
|
}
|
|
hwif->gendev.release = hwif_release_dev;
|
|
hwif->gendev.release = hwif_release_dev;
|
|
ret = device_register(&hwif->gendev);
|
|
ret = device_register(&hwif->gendev);
|
|
- if (ret < 0)
|
|
|
|
|
|
+ if (ret < 0) {
|
|
printk(KERN_WARNING "IDE: %s: device_register error: %d\n",
|
|
printk(KERN_WARNING "IDE: %s: device_register error: %d\n",
|
|
__FUNCTION__, ret);
|
|
__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;
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -1378,6 +1392,58 @@ static void ide_port_cable_detect(ide_hwif_t *hwif)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+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)
|
|
int ide_device_add_all(u8 *idx, const struct ide_port_info *d)
|
|
{
|
|
{
|
|
ide_hwif_t *hwif, *mate = NULL;
|
|
ide_hwif_t *hwif, *mate = NULL;
|
|
@@ -1474,6 +1540,7 @@ int ide_device_add_all(u8 *idx, const struct ide_port_info *d)
|
|
hwif = &ide_hwifs[idx[i]];
|
|
hwif = &ide_hwifs[idx[i]];
|
|
|
|
|
|
if (hwif->present) {
|
|
if (hwif->present) {
|
|
|
|
+ ide_sysfs_register_port(hwif);
|
|
ide_proc_register_port(hwif);
|
|
ide_proc_register_port(hwif);
|
|
ide_proc_port_register_devices(hwif);
|
|
ide_proc_port_register_devices(hwif);
|
|
}
|
|
}
|