iSCSI/iBFT: use proper address translation
[safe/jmp/linux-2.6] / drivers / firmware / edd.c
index 6996476..9e4f59d 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * linux/arch/i386/kernel/edd.c
+ * linux/drivers/firmware/edd.c
  *  Copyright (C) 2002, 2003, 2004 Dell Inc.
  *  by Matt Domsch <Matt_Domsch@dell.com>
  *  disk signature by Matt Domsch, Andrew Wilks, and Sandeep K. Shandilya
@@ -11,7 +11,7 @@
  *
  * This code takes information provided by BIOS EDD calls
  * fn41 - Check Extensions Present and
- * fn48 - Get Device Parametes with EDD extensions
+ * fn48 - Get Device Parameters with EDD extensions
  * made in setup.S, copied to safe structures in setup.c,
  * and presents it in sysfs.
  *
@@ -74,7 +74,7 @@ static struct edd_device *edd_devices[EDD_MBR_SIG_MAX];
 
 #define EDD_DEVICE_ATTR(_name,_mode,_show,_test) \
 struct edd_attribute edd_attr_##_name = {      \
-       .attr = {.name = __stringify(_name), .mode = _mode, .owner = THIS_MODULE },     \
+       .attr = {.name = __stringify(_name), .mode = _mode },   \
        .show   = _show,                                \
        .test   = _test,                                \
 };
@@ -233,6 +233,8 @@ edd_show_interface(struct edd_device *edev, char *buf)
 
 /**
  * edd_show_raw_data() - copies raw data to buffer for userspace to parse
+ * @edev: target edd_device
+ * @buf: output buffer
  *
  * Returns: number of bytes written, or -EINVAL on failure
  */
@@ -623,19 +625,19 @@ static void edd_release(struct kobject * kobj)
        kfree(dev);
 }
 
-static struct kobj_type ktype_edd = {
+static struct kobj_type edd_ktype = {
        .release        = edd_release,
        .sysfs_ops      = &edd_attr_ops,
        .default_attrs  = def_attrs,
 };
 
-static decl_subsys(edd,&ktype_edd,NULL);
+static struct kset *edd_kset;
 
 
 /**
  * edd_dev_is_type() - is this EDD device a 'type' device?
- * @edev
- * @type - a host bus or interface identifier string per the EDD spec
+ * @edev: target edd_device
+ * @type: a host bus or interface identifier string per the EDD spec
  *
  * Returns 1 (TRUE) if it is a 'type' device, 0 otherwise.
  */
@@ -657,7 +659,7 @@ edd_dev_is_type(struct edd_device *edev, const char *type)
 
 /**
  * edd_get_pci_dev() - finds pci_dev that matches edev
- * @edev - edd_device
+ * @edev: edd_device
  *
  * Returns pci_dev if found, or NULL
  */
@@ -667,7 +669,7 @@ edd_get_pci_dev(struct edd_device *edev)
        struct edd_info *info = edd_dev_get_info(edev);
 
        if (edd_dev_is_type(edev, "PCI")) {
-               return pci_find_slot(info->params.interface_path.pci.bus,
+               return pci_get_bus_and_slot(info->params.interface_path.pci.bus,
                                     PCI_DEVFN(info->params.interface_path.pci.slot,
                                               info->params.interface_path.pci.
                                               function));
@@ -680,15 +682,18 @@ edd_create_symlink_to_pcidev(struct edd_device *edev)
 {
 
        struct pci_dev *pci_dev = edd_get_pci_dev(edev);
+       int ret;
        if (!pci_dev)
                return 1;
-       return sysfs_create_link(&edev->kobj,&pci_dev->dev.kobj,"pci_dev");
+       ret = sysfs_create_link(&edev->kobj,&pci_dev->dev.kobj,"pci_dev");
+       pci_dev_put(pci_dev);
+       return ret;
 }
 
 static inline void
 edd_device_unregister(struct edd_device *edev)
 {
-       kobject_unregister(&edev->kobj);
+       kobject_put(&edev->kobj);
 }
 
 static void edd_populate_dir(struct edd_device * edev)
@@ -715,14 +720,14 @@ edd_device_register(struct edd_device *edev, int i)
 
        if (!edev)
                return 1;
-       memset(edev, 0, sizeof (*edev));
        edd_dev_set_info(edev, i);
-       kobject_set_name(&edev->kobj, "int13_dev%02x",
-                        0x80 + i);
-       kobj_set_kset_s(edev,edd_subsys);
-       error = kobject_register(&edev->kobj);
-       if (!error)
+       edev->kobj.kset = edd_kset;
+       error = kobject_init_and_add(&edev->kobj, &edd_ktype, NULL,
+                                    "int13_dev%02x", 0x80 + i);
+       if (!error) {
                edd_populate_dir(edev);
+               kobject_uevent(&edev->kobj, KOBJ_ADD);
+       }
        return error;
 }
 
@@ -748,15 +753,15 @@ edd_init(void)
 
        if (!edd_num_devices()) {
                printk(KERN_INFO "EDD information not available.\n");
-               return 1;
+               return -ENODEV;
        }
 
-       rc = firmware_register(&edd_subsys);
-       if (rc)
-               return rc;
+       edd_kset = kset_create_and_add("edd", NULL, firmware_kobj);
+       if (!edd_kset)
+               return -ENOMEM;
 
        for (i = 0; i < edd_num_devices() && !rc; i++) {
-               edev = kmalloc(sizeof (*edev), GFP_KERNEL);
+               edev = kzalloc(sizeof (*edev), GFP_KERNEL);
                if (!edev)
                        return -ENOMEM;
 
@@ -769,7 +774,7 @@ edd_init(void)
        }
 
        if (rc)
-               firmware_unregister(&edd_subsys);
+               kset_unregister(edd_kset);
        return rc;
 }
 
@@ -783,7 +788,7 @@ edd_exit(void)
                if ((edev = edd_devices[i]))
                        edd_device_unregister(edev);
        }
-       firmware_unregister(&edd_subsys);
+       kset_unregister(edd_kset);
 }
 
 late_initcall(edd_init);