diff options
Diffstat (limited to 'drivers/pci/hotplug/cpqphp_pci.c')
| -rw-r--r-- | drivers/pci/hotplug/cpqphp_pci.c | 39 | 
1 files changed, 22 insertions, 17 deletions
diff --git a/drivers/pci/hotplug/cpqphp_pci.c b/drivers/pci/hotplug/cpqphp_pci.c index 09801c6945c..1c8c2f130d3 100644 --- a/drivers/pci/hotplug/cpqphp_pci.c +++ b/drivers/pci/hotplug/cpqphp_pci.c @@ -81,11 +81,13 @@ static void __iomem *detect_HRT_floating_pointer(void __iomem *begin, void __iom  } -int cpqhp_configure_device (struct controller* ctrl, struct pci_func* func) +int cpqhp_configure_device (struct controller *ctrl, struct pci_func *func)  {  	struct pci_bus *child;  	int num; +	pci_lock_rescan_remove(); +  	if (func->pci_dev == NULL)  		func->pci_dev = pci_get_bus_and_slot(func->bus,PCI_DEVFN(func->device, func->function)); @@ -100,7 +102,7 @@ int cpqhp_configure_device (struct controller* ctrl, struct pci_func* func)  		func->pci_dev = pci_get_bus_and_slot(func->bus, PCI_DEVFN(func->device, func->function));  		if (func->pci_dev == NULL) {  			dbg("ERROR: pci_dev still null\n"); -			return 0; +			goto out;  		}  	} @@ -113,23 +115,27 @@ int cpqhp_configure_device (struct controller* ctrl, struct pci_func* func)  	pci_dev_put(func->pci_dev); + out: +	pci_unlock_rescan_remove();  	return 0;  } -int cpqhp_unconfigure_device(struct pci_func* func) +int cpqhp_unconfigure_device(struct pci_func *func)  {  	int j;  	dbg("%s: bus/dev/func = %x/%x/%x\n", __func__, func->bus, func->device, func->function); +	pci_lock_rescan_remove();  	for (j=0; j<8 ; j++) { -		struct pci_dev* temp = pci_get_bus_and_slot(func->bus, PCI_DEVFN(func->device, j)); +		struct pci_dev *temp = pci_get_bus_and_slot(func->bus, PCI_DEVFN(func->device, j));  		if (temp) {  			pci_dev_put(temp);  			pci_stop_and_remove_bus_device(temp);  		}  	} +	pci_unlock_rescan_remove();  	return 0;  } @@ -197,7 +203,7 @@ int cpqhp_set_irq (u8 bus_num, u8 dev_num, u8 int_pin, u8 irq_num)  } -static int PCI_ScanBusForNonBridge(struct controller *ctrl, u8 bus_num, u8 * dev_num) +static int PCI_ScanBusForNonBridge(struct controller *ctrl, u8 bus_num, u8 *dev_num)  {  	u16 tdevice;  	u32 work; @@ -274,7 +280,7 @@ static int PCI_GetBusDevHelper(struct controller *ctrl, u8 *bus_num, u8 *dev_num  } -int cpqhp_get_bus_dev (struct controller *ctrl, u8 * bus_num, u8 * dev_num, u8 slot) +int cpqhp_get_bus_dev (struct controller *ctrl, u8 *bus_num, u8 *dev_num, u8 slot)  {  	/* plain (bridges allowed) */  	return PCI_GetBusDevHelper(ctrl, bus_num, dev_num, slot, 0); @@ -291,7 +297,7 @@ int cpqhp_get_bus_dev (struct controller *ctrl, u8 * bus_num, u8 * dev_num, u8 s   *   * Reads configuration for all slots in a PCI bus and saves info.   * - * Note:  For non-hot plug busses, the slot # saved is the device # + * Note:  For non-hot plug buses, the slot # saved is the device #   *   * returns 0 if success   */ @@ -455,11 +461,11 @@ int cpqhp_save_config(struct controller *ctrl, int busnumber, int is_hot_plug)   * cpqhp_save_slot_config   *   * Saves configuration info for all PCI devices in a given slot - * including subordinate busses. + * including subordinate buses.   *   * returns 0 if success   */ -int cpqhp_save_slot_config (struct controller *ctrl, struct pci_func * new_slot) +int cpqhp_save_slot_config (struct controller *ctrl, struct pci_func *new_slot)  {  	long rc;  	u8 class_code; @@ -543,7 +549,7 @@ int cpqhp_save_slot_config (struct controller *ctrl, struct pci_func * new_slot)   *   * returns 0 if success   */ -int cpqhp_save_base_addr_length(struct controller *ctrl, struct pci_func * func) +int cpqhp_save_base_addr_length(struct controller *ctrl, struct pci_func *func)  {  	u8 cloop;  	u8 header_type; @@ -680,7 +686,7 @@ int cpqhp_save_base_addr_length(struct controller *ctrl, struct pci_func * func)   *   * returns 0 if success   */ -int cpqhp_save_used_resources (struct controller *ctrl, struct pci_func * func) +int cpqhp_save_used_resources (struct controller *ctrl, struct pci_func *func)  {  	u8 cloop;  	u8 header_type; @@ -943,7 +949,7 @@ int cpqhp_save_used_resources (struct controller *ctrl, struct pci_func * func)   *   * returns 0 if success   */ -int cpqhp_configure_board(struct controller *ctrl, struct pci_func * func) +int cpqhp_configure_board(struct controller *ctrl, struct pci_func *func)  {  	int cloop;  	u8 header_type; @@ -1021,7 +1027,7 @@ int cpqhp_configure_board(struct controller *ctrl, struct pci_func * func)   *   * returns 0 if the board is the same nonzero otherwise   */ -int cpqhp_valid_replace(struct controller *ctrl, struct pci_func * func) +int cpqhp_valid_replace(struct controller *ctrl, struct pci_func *func)  {  	u8 cloop;  	u8 header_type; @@ -1413,7 +1419,7 @@ int cpqhp_find_available_resources(struct controller *ctrl, void __iomem *rom_st   *   * returns 0 if success   */ -int cpqhp_return_board_resources(struct pci_func * func, struct resource_lists * resources) +int cpqhp_return_board_resources(struct pci_func *func, struct resource_lists *resources)  {  	int rc = 0;  	struct pci_resource *node; @@ -1469,7 +1475,7 @@ int cpqhp_return_board_resources(struct pci_func * func, struct resource_lists *   *   * Puts node back in the resource list pointed to by head   */ -void cpqhp_destroy_resource_list (struct resource_lists * resources) +void cpqhp_destroy_resource_list (struct resource_lists *resources)  {  	struct pci_resource *res, *tres; @@ -1516,7 +1522,7 @@ void cpqhp_destroy_resource_list (struct resource_lists * resources)   *   * Puts node back in the resource list pointed to by head   */ -void cpqhp_destroy_board_resources (struct pci_func * func) +void cpqhp_destroy_board_resources (struct pci_func *func)  {  	struct pci_resource *res, *tres; @@ -1556,4 +1562,3 @@ void cpqhp_destroy_board_resources (struct pci_func * func)  		kfree(tres);  	}  } -  | 
