]> git.karo-electronics.de Git - linux-beck.git/blobdiff - drivers/pci/pci-sysfs.c
Merge branch 'pci/resource' into next
[linux-beck.git] / drivers / pci / pci-sysfs.c
index 847a973510309af6b05eecc54d2f77d65a64cc9b..e982010f0ed19e0d0379da4a1c02334a1db9f175 100644 (file)
@@ -769,10 +769,12 @@ static ssize_t read_vpd_attr(struct file *filp, struct kobject *kobj,
 {
        struct pci_dev *dev = to_pci_dev(kobj_to_dev(kobj));
 
-       if (off > bin_attr->size)
-               count = 0;
-       else if (count > bin_attr->size - off)
-               count = bin_attr->size - off;
+       if (bin_attr->size > 0) {
+               if (off > bin_attr->size)
+                       count = 0;
+               else if (count > bin_attr->size - off)
+                       count = bin_attr->size - off;
+       }
 
        return pci_read_vpd(dev, off, count, buf);
 }
@@ -783,10 +785,12 @@ static ssize_t write_vpd_attr(struct file *filp, struct kobject *kobj,
 {
        struct pci_dev *dev = to_pci_dev(kobj_to_dev(kobj));
 
-       if (off > bin_attr->size)
-               count = 0;
-       else if (count > bin_attr->size - off)
-               count = bin_attr->size - off;
+       if (bin_attr->size > 0) {
+               if (off > bin_attr->size)
+                       count = 0;
+               else if (count > bin_attr->size - off)
+                       count = bin_attr->size - off;
+       }
 
        return pci_write_vpd(dev, off, count, buf);
 }
@@ -1134,35 +1138,36 @@ static int pci_create_attr(struct pci_dev *pdev, int num, int write_combine)
        /* allocate attribute structure, piggyback attribute name */
        int name_len = write_combine ? 13 : 10;
        struct bin_attribute *res_attr;
+       char *res_attr_name;
        int retval;
 
        res_attr = kzalloc(sizeof(*res_attr) + name_len, GFP_ATOMIC);
-       if (res_attr) {
-               char *res_attr_name = (char *)(res_attr + 1);
-
-               sysfs_bin_attr_init(res_attr);
-               if (write_combine) {
-                       pdev->res_attr_wc[num] = res_attr;
-                       sprintf(res_attr_name, "resource%d_wc", num);
-                       res_attr->mmap = pci_mmap_resource_wc;
-               } else {
-                       pdev->res_attr[num] = res_attr;
-                       sprintf(res_attr_name, "resource%d", num);
-                       res_attr->mmap = pci_mmap_resource_uc;
-               }
-               if (pci_resource_flags(pdev, num) & IORESOURCE_IO) {
-                       res_attr->read = pci_read_resource_io;
-                       res_attr->write = pci_write_resource_io;
-               }
-               res_attr->attr.name = res_attr_name;
-               res_attr->attr.mode = S_IRUSR | S_IWUSR;
-               res_attr->size = pci_resource_len(pdev, num);
-               res_attr->private = &pdev->resource[num];
-               retval = sysfs_create_bin_file(&pdev->dev.kobj, res_attr);
-               if (retval)
-                       kfree(res_attr);
-       } else
-               retval = -ENOMEM;
+       if (!res_attr)
+               return -ENOMEM;
+
+       res_attr_name = (char *)(res_attr + 1);
+
+       sysfs_bin_attr_init(res_attr);
+       if (write_combine) {
+               pdev->res_attr_wc[num] = res_attr;
+               sprintf(res_attr_name, "resource%d_wc", num);
+               res_attr->mmap = pci_mmap_resource_wc;
+       } else {
+               pdev->res_attr[num] = res_attr;
+               sprintf(res_attr_name, "resource%d", num);
+               res_attr->mmap = pci_mmap_resource_uc;
+       }
+       if (pci_resource_flags(pdev, num) & IORESOURCE_IO) {
+               res_attr->read = pci_read_resource_io;
+               res_attr->write = pci_write_resource_io;
+       }
+       res_attr->attr.name = res_attr_name;
+       res_attr->attr.mode = S_IRUSR | S_IWUSR;
+       res_attr->size = pci_resource_len(pdev, num);
+       res_attr->private = &pdev->resource[num];
+       retval = sysfs_create_bin_file(&pdev->dev.kobj, res_attr);
+       if (retval)
+               kfree(res_attr);
 
        return retval;
 }
@@ -1321,7 +1326,7 @@ static int pci_create_capabilities_sysfs(struct pci_dev *dev)
                        return -ENOMEM;
 
                sysfs_bin_attr_init(attr);
-               attr->size = dev->vpd->len;
+               attr->size = 0;
                attr->attr.name = "vpd";
                attr->attr.mode = S_IRUSR | S_IWUSR;
                attr->read = read_vpd_attr;