Fedora kernel-2.6.17-1.2142_FC4 patched with stable patch-2.6.17.4-vs2.0.2-rc26.diff
[linux-2.6.git] / drivers / pci / pci-sysfs.c
index 6ca0061..56ac2bc 100644 (file)
@@ -29,7 +29,7 @@ static int sysfs_initialized; /* = 0 */
 /* show configuration fields */
 #define pci_config_attr(field, format_string)                          \
 static ssize_t                                                         \
-field##_show(struct device *dev, char *buf)                            \
+field##_show(struct device *dev, struct device_attribute *attr, char *buf)                             \
 {                                                                      \
        struct pci_dev *pdev;                                           \
                                                                        \
@@ -44,36 +44,43 @@ pci_config_attr(subsystem_device, "0x%04x\n");
 pci_config_attr(class, "0x%06x\n");
 pci_config_attr(irq, "%u\n");
 
-static ssize_t local_cpus_show(struct device *dev, char *buf)
+static ssize_t local_cpus_show(struct device *dev,
+                       struct device_attribute *attr, char *buf)
 {              
-       cpumask_t mask = pcibus_to_cpumask(to_pci_dev(dev)->bus);
-       int len = cpumask_scnprintf(buf, PAGE_SIZE-2, mask);
+       cpumask_t mask;
+       int len;
+
+       mask = pcibus_to_cpumask(to_pci_dev(dev)->bus);
+       len = cpumask_scnprintf(buf, PAGE_SIZE-2, mask);
        strcat(buf,"\n"); 
        return 1+len;
 }
 
 /* show resources */
 static ssize_t
-resource_show(struct device * dev, char * buf)
+resource_show(struct device * dev, struct device_attribute *attr, char * buf)
 {
        struct pci_dev * pci_dev = to_pci_dev(dev);
        char * str = buf;
        int i;
        int max = 7;
+       u64 start, end;
 
        if (pci_dev->subordinate)
                max = DEVICE_COUNT_RESOURCE;
 
        for (i = 0; i < max; i++) {
-               str += sprintf(str,"0x%016lx 0x%016lx 0x%016lx\n",
-                              pci_resource_start(pci_dev,i),
-                              pci_resource_end(pci_dev,i),
-                              pci_resource_flags(pci_dev,i));
+               struct resource *res =  &pci_dev->resource[i];
+               pci_resource_to_user(pci_dev, i, res, &start, &end);
+               str += sprintf(str,"0x%016llx 0x%016llx 0x%016llx\n",
+                              (unsigned long long)start,
+                              (unsigned long long)end,
+                              (unsigned long long)res->flags);
        }
        return (str - buf);
 }
 
-static ssize_t modalias_show(struct device *dev, char *buf)
+static ssize_t modalias_show(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct pci_dev *pci_dev = to_pci_dev(dev);
 
@@ -123,7 +130,7 @@ pci_read_config(struct kobject *kobj, char *buf, loff_t off, size_t count)
 
        if ((off & 1) && size) {
                u8 val;
-               pci_read_config_byte(dev, off, &val);
+               pci_user_read_config_byte(dev, off, &val);
                data[off - init_off] = val;
                off++;
                size--;
@@ -131,7 +138,7 @@ pci_read_config(struct kobject *kobj, char *buf, loff_t off, size_t count)
 
        if ((off & 3) && size > 2) {
                u16 val;
-               pci_read_config_word(dev, off, &val);
+               pci_user_read_config_word(dev, off, &val);
                data[off - init_off] = val & 0xff;
                data[off - init_off + 1] = (val >> 8) & 0xff;
                off += 2;
@@ -140,7 +147,7 @@ pci_read_config(struct kobject *kobj, char *buf, loff_t off, size_t count)
 
        while (size > 3) {
                u32 val;
-               pci_read_config_dword(dev, off, &val);
+               pci_user_read_config_dword(dev, off, &val);
                data[off - init_off] = val & 0xff;
                data[off - init_off + 1] = (val >> 8) & 0xff;
                data[off - init_off + 2] = (val >> 16) & 0xff;
@@ -151,7 +158,7 @@ pci_read_config(struct kobject *kobj, char *buf, loff_t off, size_t count)
 
        if (size >= 2) {
                u16 val;
-               pci_read_config_word(dev, off, &val);
+               pci_user_read_config_word(dev, off, &val);
                data[off - init_off] = val & 0xff;
                data[off - init_off + 1] = (val >> 8) & 0xff;
                off += 2;
@@ -160,7 +167,7 @@ pci_read_config(struct kobject *kobj, char *buf, loff_t off, size_t count)
 
        if (size > 0) {
                u8 val;
-               pci_read_config_byte(dev, off, &val);
+               pci_user_read_config_byte(dev, off, &val);
                data[off - init_off] = val;
                off++;
                --size;
@@ -185,7 +192,7 @@ pci_write_config(struct kobject *kobj, char *buf, loff_t off, size_t count)
        }
        
        if ((off & 1) && size) {
-               pci_write_config_byte(dev, off, data[off - init_off]);
+               pci_user_write_config_byte(dev, off, data[off - init_off]);
                off++;
                size--;
        }
@@ -193,7 +200,7 @@ pci_write_config(struct kobject *kobj, char *buf, loff_t off, size_t count)
        if ((off & 3) && size > 2) {
                u16 val = data[off - init_off];
                val |= (u16) data[off - init_off + 1] << 8;
-                pci_write_config_word(dev, off, val);
+                pci_user_write_config_word(dev, off, val);
                 off += 2;
                 size -= 2;
         }
@@ -203,7 +210,7 @@ pci_write_config(struct kobject *kobj, char *buf, loff_t off, size_t count)
                val |= (u32) data[off - init_off + 1] << 8;
                val |= (u32) data[off - init_off + 2] << 16;
                val |= (u32) data[off - init_off + 3] << 24;
-               pci_write_config_dword(dev, off, val);
+               pci_user_write_config_dword(dev, off, val);
                off += 4;
                size -= 4;
        }
@@ -211,13 +218,13 @@ pci_write_config(struct kobject *kobj, char *buf, loff_t off, size_t count)
        if (size >= 2) {
                u16 val = data[off - init_off];
                val |= (u16) data[off - init_off + 1] << 8;
-               pci_write_config_word(dev, off, val);
+               pci_user_write_config_word(dev, off, val);
                off += 2;
                size -= 2;
        }
 
        if (size) {
-               pci_write_config_byte(dev, off, data[off - init_off]);
+               pci_user_write_config_byte(dev, off, data[off - init_off]);
                off++;
                --size;
        }
@@ -313,8 +320,21 @@ pci_mmap_resource(struct kobject *kobj, struct bin_attribute *attr,
                                                       struct device, kobj));
        struct resource *res = (struct resource *)attr->private;
        enum pci_mmap_state mmap_type;
+       u64 start, end;
+       int i;
 
-       vma->vm_pgoff += res->start >> PAGE_SHIFT;
+       for (i = 0; i < PCI_ROM_RESOURCE; i++)
+               if (res == &pdev->resource[i])
+                       break;
+       if (i >= PCI_ROM_RESOURCE)
+               return -ENODEV;
+
+       /* pci_mmap_page_range() expects the same kind of entry as coming
+        * from /proc/bus/pci/ which is a "user visible" value. If this is
+        * different from the resource itself, arch will do necessary fixup.
+        */
+       pci_resource_to_user(pdev, i, res, &start, &end);
+       vma->vm_pgoff += start >> PAGE_SHIFT;
        mmap_type = res->flags & IORESOURCE_MEM ? pci_mmap_mem : pci_mmap_io;
 
        return pci_mmap_page_range(pdev, vma, mmap_type, 0);
@@ -339,16 +359,17 @@ pci_create_resource_files(struct pci_dev *pdev)
                if (!pci_resource_len(pdev, i))
                        continue;
 
-               res_attr = kmalloc(sizeof(*res_attr) + 10, GFP_ATOMIC);
+               /* allocate attribute structure, piggyback attribute name */
+               res_attr = kzalloc(sizeof(*res_attr) + 10, GFP_ATOMIC);
                if (res_attr) {
-                       memset(res_attr, 0, sizeof(*res_attr) + 10);
+                       char *res_attr_name = (char *)(res_attr + 1);
+
                        pdev->res_attr[i] = res_attr;
-                       /* Allocated above after the res_attr struct */
-                       res_attr->attr.name = (char *)(res_attr + 1);
-                       sprintf(res_attr->attr.name, "resource%d", i);
-                       res_attr->size = pci_resource_len(pdev, i);
+                       sprintf(res_attr_name, "resource%d", i);
+                       res_attr->attr.name = res_attr_name;
                        res_attr->attr.mode = S_IRUSR | S_IWUSR;
                        res_attr->attr.owner = THIS_MODULE;
+                       res_attr->size = pci_resource_len(pdev, i);
                        res_attr->mmap = pci_mmap_resource;
                        res_attr->private = &pdev->resource[i];
                        sysfs_create_bin_file(&pdev->dev.kobj, res_attr);
@@ -480,9 +501,8 @@ int pci_create_sysfs_dev_files (struct pci_dev *pdev)
        if (pci_resource_len(pdev, PCI_ROM_RESOURCE)) {
                struct bin_attribute *rom_attr;
                
-               rom_attr = kmalloc(sizeof(*rom_attr), GFP_ATOMIC);
+               rom_attr = kzalloc(sizeof(*rom_attr), GFP_ATOMIC);
                if (rom_attr) {
-                       memset(rom_attr, 0x00, sizeof(*rom_attr));
                        pdev->rom_attr = rom_attr;
                        rom_attr->size = pci_resource_len(pdev, PCI_ROM_RESOURCE);
                        rom_attr->attr.name = "rom";