|
@@ -494,7 +494,7 @@ int cpqhp_save_slot_config (struct controller *ctrl, struct pci_func * new_slot)
|
|
|
u8 secondary_bus;
|
|
|
int sub_bus;
|
|
|
int max_functions;
|
|
|
- int function;
|
|
|
+ int function = 0;
|
|
|
int cloop = 0;
|
|
|
int stop_it;
|
|
|
|
|
@@ -503,65 +503,58 @@ int cpqhp_save_slot_config (struct controller *ctrl, struct pci_func * new_slot)
|
|
|
ctrl->pci_bus->number = new_slot->bus;
|
|
|
pci_bus_read_config_dword (ctrl->pci_bus, PCI_DEVFN(new_slot->device, 0), PCI_VENDOR_ID, &ID);
|
|
|
|
|
|
- if (ID != 0xFFFFFFFF) { /* device in slot */
|
|
|
- pci_bus_read_config_byte (ctrl->pci_bus, PCI_DEVFN(new_slot->device, 0), 0x0B, &class_code);
|
|
|
- pci_bus_read_config_byte (ctrl->pci_bus, PCI_DEVFN(new_slot->device, 0), PCI_HEADER_TYPE, &header_type);
|
|
|
-
|
|
|
- if (header_type & 0x80) /* Multi-function device */
|
|
|
- max_functions = 8;
|
|
|
- else
|
|
|
- max_functions = 1;
|
|
|
-
|
|
|
- function = 0;
|
|
|
+ if (ID == 0xFFFFFFFF)
|
|
|
+ return 2;
|
|
|
|
|
|
- do {
|
|
|
- if ((header_type & 0x7F) == PCI_HEADER_TYPE_BRIDGE) {
|
|
|
- /* Recurse the subordinate bus */
|
|
|
- pci_bus_read_config_byte (ctrl->pci_bus, PCI_DEVFN(new_slot->device, function), PCI_SECONDARY_BUS, &secondary_bus);
|
|
|
+ pci_bus_read_config_byte(ctrl->pci_bus, PCI_DEVFN(new_slot->device, 0), 0x0B, &class_code);
|
|
|
+ pci_bus_read_config_byte(ctrl->pci_bus, PCI_DEVFN(new_slot->device, 0), PCI_HEADER_TYPE, &header_type);
|
|
|
|
|
|
- sub_bus = (int) secondary_bus;
|
|
|
+ if (header_type & 0x80) /* Multi-function device */
|
|
|
+ max_functions = 8;
|
|
|
+ else
|
|
|
+ max_functions = 1;
|
|
|
|
|
|
- /* Save the config headers for the secondary
|
|
|
- * bus.
|
|
|
- */
|
|
|
- rc = cpqhp_save_config(ctrl, sub_bus, 0);
|
|
|
- if (rc)
|
|
|
- return(rc);
|
|
|
- ctrl->pci_bus->number = new_slot->bus;
|
|
|
+ while (function < max_functions) {
|
|
|
+ if ((header_type & 0x7F) == PCI_HEADER_TYPE_BRIDGE) {
|
|
|
+ /* Recurse the subordinate bus */
|
|
|
+ pci_bus_read_config_byte (ctrl->pci_bus, PCI_DEVFN(new_slot->device, function), PCI_SECONDARY_BUS, &secondary_bus);
|
|
|
|
|
|
- } /* End of IF */
|
|
|
+ sub_bus = (int) secondary_bus;
|
|
|
|
|
|
- new_slot->status = 0;
|
|
|
+ /* Save the config headers for the secondary
|
|
|
+ * bus.
|
|
|
+ */
|
|
|
+ rc = cpqhp_save_config(ctrl, sub_bus, 0);
|
|
|
+ if (rc)
|
|
|
+ return(rc);
|
|
|
+ ctrl->pci_bus->number = new_slot->bus;
|
|
|
|
|
|
- for (cloop = 0; cloop < 0x20; cloop++) {
|
|
|
- pci_bus_read_config_dword (ctrl->pci_bus, PCI_DEVFN(new_slot->device, function), cloop << 2, (u32 *) & (new_slot-> config_space [cloop]));
|
|
|
- }
|
|
|
+ }
|
|
|
|
|
|
- function++;
|
|
|
+ new_slot->status = 0;
|
|
|
|
|
|
- stop_it = 0;
|
|
|
+ for (cloop = 0; cloop < 0x20; cloop++)
|
|
|
+ pci_bus_read_config_dword(ctrl->pci_bus, PCI_DEVFN(new_slot->device, function), cloop << 2, (u32 *) & (new_slot-> config_space [cloop]));
|
|
|
|
|
|
- /* this loop skips to the next present function
|
|
|
- * reading in the Class Code and the Header type.
|
|
|
- */
|
|
|
- while ((function < max_functions) && (!stop_it)) {
|
|
|
- pci_bus_read_config_dword (ctrl->pci_bus, PCI_DEVFN(new_slot->device, function), PCI_VENDOR_ID, &ID);
|
|
|
+ function++;
|
|
|
|
|
|
- if (ID == 0xFFFFFFFF) { /* nothing there. */
|
|
|
- function++;
|
|
|
- } else { /* Something there */
|
|
|
- pci_bus_read_config_byte (ctrl->pci_bus, PCI_DEVFN(new_slot->device, function), 0x0B, &class_code);
|
|
|
+ stop_it = 0;
|
|
|
|
|
|
- pci_bus_read_config_byte (ctrl->pci_bus, PCI_DEVFN(new_slot->device, function), PCI_HEADER_TYPE, &header_type);
|
|
|
+ /* this loop skips to the next present function
|
|
|
+ * reading in the Class Code and the Header type.
|
|
|
+ */
|
|
|
+ while ((function < max_functions) && (!stop_it)) {
|
|
|
+ pci_bus_read_config_dword(ctrl->pci_bus, PCI_DEVFN(new_slot->device, function), PCI_VENDOR_ID, &ID);
|
|
|
|
|
|
- stop_it++;
|
|
|
- }
|
|
|
+ if (ID == 0xFFFFFFFF)
|
|
|
+ function++;
|
|
|
+ else {
|
|
|
+ pci_bus_read_config_byte(ctrl->pci_bus, PCI_DEVFN(new_slot->device, function), 0x0B, &class_code);
|
|
|
+ pci_bus_read_config_byte(ctrl->pci_bus, PCI_DEVFN(new_slot->device, function), PCI_HEADER_TYPE, &header_type);
|
|
|
+ stop_it++;
|
|
|
}
|
|
|
+ }
|
|
|
|
|
|
- } while (function < max_functions);
|
|
|
- } /* End of IF (device in slot?) */
|
|
|
- else {
|
|
|
- return 2;
|
|
|
}
|
|
|
|
|
|
return 0;
|