[IA64]: SN fix bus->sysdata pointer and memory cleanups
The main issue is that bus_fixup calls may potentially call functions that require a valid bus->sysdata pointer. Since this is the case, we must set the bus->sysdata pointer before calling the bus_fixup functions. The remaining changes are simple fixes to make sure memory is cleaned up in the function. Signed-off-by: Prarit Bhargava <prarit@sgi.com> Signed-off-by: Tony Luck <tony.luck@intel.com>
This commit is contained in:
parent
12aaa0855b
commit
c1ffb910f7
1 changed files with 10 additions and 8 deletions
|
@ -322,7 +322,7 @@ void sn_pci_controller_fixup(int segment, int busnum, struct pci_bus *bus)
|
||||||
struct pci_controller *controller;
|
struct pci_controller *controller;
|
||||||
struct pcibus_bussoft *prom_bussoft_ptr;
|
struct pcibus_bussoft *prom_bussoft_ptr;
|
||||||
struct hubdev_info *hubdev_info;
|
struct hubdev_info *hubdev_info;
|
||||||
void *provider_soft;
|
void *provider_soft = NULL;
|
||||||
struct sn_pcibus_provider *provider;
|
struct sn_pcibus_provider *provider;
|
||||||
|
|
||||||
status = sal_get_pcibus_info((u64) segment, (u64) busnum,
|
status = sal_get_pcibus_info((u64) segment, (u64) busnum,
|
||||||
|
@ -338,7 +338,7 @@ void sn_pci_controller_fixup(int segment, int busnum, struct pci_bus *bus)
|
||||||
if (bus == NULL) {
|
if (bus == NULL) {
|
||||||
bus = pci_scan_bus(busnum, &pci_root_ops, controller);
|
bus = pci_scan_bus(busnum, &pci_root_ops, controller);
|
||||||
if (bus == NULL)
|
if (bus == NULL)
|
||||||
return; /* error, or bus already scanned */
|
goto error_return; /* error, or bus already scanned */
|
||||||
bus->sysdata = NULL;
|
bus->sysdata = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -351,28 +351,30 @@ void sn_pci_controller_fixup(int segment, int busnum, struct pci_bus *bus)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (prom_bussoft_ptr->bs_asic_type >= PCIIO_ASIC_MAX_TYPES)
|
if (prom_bussoft_ptr->bs_asic_type >= PCIIO_ASIC_MAX_TYPES)
|
||||||
return; /* unsupported asic type */
|
goto error_return; /* unsupported asic type */
|
||||||
|
|
||||||
if (prom_bussoft_ptr->bs_asic_type == PCIIO_ASIC_TYPE_PPB)
|
if (prom_bussoft_ptr->bs_asic_type == PCIIO_ASIC_TYPE_PPB)
|
||||||
goto error_return; /* no further fixup necessary */
|
goto error_return; /* no further fixup necessary */
|
||||||
|
|
||||||
provider = sn_pci_provider[prom_bussoft_ptr->bs_asic_type];
|
provider = sn_pci_provider[prom_bussoft_ptr->bs_asic_type];
|
||||||
if (provider == NULL)
|
if (provider == NULL)
|
||||||
return; /* no provider registerd for this asic */
|
goto error_return; /* no provider registerd for this asic */
|
||||||
|
|
||||||
provider_soft = NULL;
|
bus->sysdata = controller;
|
||||||
if (provider->bus_fixup)
|
if (provider->bus_fixup)
|
||||||
provider_soft = (*provider->bus_fixup) (prom_bussoft_ptr, controller);
|
provider_soft = (*provider->bus_fixup) (prom_bussoft_ptr, controller);
|
||||||
|
|
||||||
if (provider_soft == NULL)
|
if (provider_soft == NULL) {
|
||||||
return; /* fixup failed or not applicable */
|
/* fixup failed or not applicable */
|
||||||
|
bus->sysdata = NULL;
|
||||||
|
goto error_return;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Generic bus fixup goes here. Don't reference prom_bussoft_ptr
|
* Generic bus fixup goes here. Don't reference prom_bussoft_ptr
|
||||||
* after this point.
|
* after this point.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
bus->sysdata = controller;
|
|
||||||
PCI_CONTROLLER(bus)->platform_data = provider_soft;
|
PCI_CONTROLLER(bus)->platform_data = provider_soft;
|
||||||
nasid = NASID_GET(SN_PCIBUS_BUSSOFT(bus)->bs_base);
|
nasid = NASID_GET(SN_PCIBUS_BUSSOFT(bus)->bs_base);
|
||||||
cnode = nasid_to_cnodeid(nasid);
|
cnode = nasid_to_cnodeid(nasid);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue