diff options
Diffstat (limited to 'drivers/pci/probe.c')
| -rw-r--r-- | drivers/pci/probe.c | 54 |
1 files changed, 38 insertions, 16 deletions
diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c index 7098dfb07449..a04498d390c8 100644 --- a/drivers/pci/probe.c +++ b/drivers/pci/probe.c | |||
| @@ -52,27 +52,49 @@ EXPORT_SYMBOL(no_pci_devices); | |||
| 52 | * Some platforms allow access to legacy I/O port and ISA memory space on | 52 | * Some platforms allow access to legacy I/O port and ISA memory space on |
| 53 | * a per-bus basis. This routine creates the files and ties them into | 53 | * a per-bus basis. This routine creates the files and ties them into |
| 54 | * their associated read, write and mmap files from pci-sysfs.c | 54 | * their associated read, write and mmap files from pci-sysfs.c |
| 55 | * | ||
| 56 | * On error unwind, but don't propogate the error to the caller | ||
| 57 | * as it is ok to set up the PCI bus without these files. | ||
| 55 | */ | 58 | */ |
| 56 | static void pci_create_legacy_files(struct pci_bus *b) | 59 | static void pci_create_legacy_files(struct pci_bus *b) |
| 57 | { | 60 | { |
| 61 | int error; | ||
| 62 | |||
| 58 | b->legacy_io = kzalloc(sizeof(struct bin_attribute) * 2, | 63 | b->legacy_io = kzalloc(sizeof(struct bin_attribute) * 2, |
| 59 | GFP_ATOMIC); | 64 | GFP_ATOMIC); |
| 60 | if (b->legacy_io) { | 65 | if (!b->legacy_io) |
| 61 | b->legacy_io->attr.name = "legacy_io"; | 66 | goto kzalloc_err; |
| 62 | b->legacy_io->size = 0xffff; | 67 | |
| 63 | b->legacy_io->attr.mode = S_IRUSR | S_IWUSR; | 68 | b->legacy_io->attr.name = "legacy_io"; |
| 64 | b->legacy_io->read = pci_read_legacy_io; | 69 | b->legacy_io->size = 0xffff; |
| 65 | b->legacy_io->write = pci_write_legacy_io; | 70 | b->legacy_io->attr.mode = S_IRUSR | S_IWUSR; |
| 66 | device_create_bin_file(&b->dev, b->legacy_io); | 71 | b->legacy_io->read = pci_read_legacy_io; |
| 67 | 72 | b->legacy_io->write = pci_write_legacy_io; | |
| 68 | /* Allocated above after the legacy_io struct */ | 73 | error = device_create_bin_file(&b->dev, b->legacy_io); |
| 69 | b->legacy_mem = b->legacy_io + 1; | 74 | if (error) |
| 70 | b->legacy_mem->attr.name = "legacy_mem"; | 75 | goto legacy_io_err; |
| 71 | b->legacy_mem->size = 1024*1024; | 76 | |
| 72 | b->legacy_mem->attr.mode = S_IRUSR | S_IWUSR; | 77 | /* Allocated above after the legacy_io struct */ |
| 73 | b->legacy_mem->mmap = pci_mmap_legacy_mem; | 78 | b->legacy_mem = b->legacy_io + 1; |
| 74 | device_create_bin_file(&b->dev, b->legacy_mem); | 79 | b->legacy_mem->attr.name = "legacy_mem"; |
| 75 | } | 80 | b->legacy_mem->size = 1024*1024; |
| 81 | b->legacy_mem->attr.mode = S_IRUSR | S_IWUSR; | ||
| 82 | b->legacy_mem->mmap = pci_mmap_legacy_mem; | ||
| 83 | error = device_create_bin_file(&b->dev, b->legacy_mem); | ||
| 84 | if (error) | ||
| 85 | goto legacy_mem_err; | ||
| 86 | |||
| 87 | return; | ||
| 88 | |||
| 89 | legacy_mem_err: | ||
| 90 | device_remove_bin_file(&b->dev, b->legacy_io); | ||
| 91 | legacy_io_err: | ||
| 92 | kfree(b->legacy_io); | ||
| 93 | b->legacy_io = NULL; | ||
| 94 | kzalloc_err: | ||
| 95 | printk(KERN_WARNING "pci: warning: could not create legacy I/O port " | ||
| 96 | "and ISA memory resources to sysfs\n"); | ||
| 97 | return; | ||
| 76 | } | 98 | } |
| 77 | 99 | ||
| 78 | void pci_remove_legacy_files(struct pci_bus *b) | 100 | void pci_remove_legacy_files(struct pci_bus *b) |
