diff options
| -rw-r--r-- | drivers/pci/hotplug/shpchp_pci.c | 36 | 
1 files changed, 16 insertions, 20 deletions
diff --git a/drivers/pci/hotplug/shpchp_pci.c b/drivers/pci/hotplug/shpchp_pci.c index c627ed9957d..b0e83132542 100644 --- a/drivers/pci/hotplug/shpchp_pci.c +++ b/drivers/pci/hotplug/shpchp_pci.c @@ -40,7 +40,7 @@ int __ref shpchp_configure_device(struct slot *p_slot)  	struct controller *ctrl = p_slot->ctrl;  	struct pci_dev *bridge = ctrl->pci_dev;  	struct pci_bus *parent = bridge->subordinate; -	int num, fn; +	int num;  	dev = pci_get_slot(parent, PCI_DEVFN(p_slot->device, 0));  	if (dev) { @@ -57,24 +57,20 @@ int __ref shpchp_configure_device(struct slot *p_slot)  		return -ENODEV;  	} -	for (fn = 0; fn < 8; fn++) { -		dev = pci_get_slot(parent, PCI_DEVFN(p_slot->device, fn)); -		if (!dev) +	list_for_each_entry(dev, &parent->devices, bus_list) { +		if (PCI_SLOT(dev->devfn) != p_slot->device)  			continue;  		if ((dev->hdr_type == PCI_HEADER_TYPE_BRIDGE) ||  		    (dev->hdr_type == PCI_HEADER_TYPE_CARDBUS))  			pci_hp_add_bridge(dev); -		pci_dev_put(dev);  	}  	pci_assign_unassigned_bridge_resources(bridge); -	for (fn = 0; fn < 8; fn++) { -		dev = pci_get_slot(parent, PCI_DEVFN(p_slot->device, fn)); -		if (!dev) +	list_for_each_entry(dev, &parent->devices, bus_list) { +		if (PCI_SLOT(dev->devfn) != p_slot->device)  			continue;  		pci_configure_slot(dev); -		pci_dev_put(dev);  	}  	pci_bus_add_devices(parent); @@ -85,32 +81,32 @@ int __ref shpchp_configure_device(struct slot *p_slot)  int shpchp_unconfigure_device(struct slot *p_slot)  {  	int rc = 0; -	int j;  	u8 bctl = 0;  	struct pci_bus *parent = p_slot->ctrl->pci_dev->subordinate; +	struct pci_dev *dev, *temp;  	struct controller *ctrl = p_slot->ctrl;  	ctrl_dbg(ctrl, "%s: domain:bus:dev = %04x:%02x:%02x\n",  		 __func__, pci_domain_nr(parent), p_slot->bus, p_slot->device); -	for (j = 0; j < 8 ; j++) { -		struct pci_dev *temp = pci_get_slot(parent, -				(p_slot->device << 3) | j); -		if (!temp) +	list_for_each_entry_safe(dev, temp, &parent->devices, bus_list) { +		if (PCI_SLOT(dev->devfn) != p_slot->device)  			continue; -		if (temp->hdr_type == PCI_HEADER_TYPE_BRIDGE) { -			pci_read_config_byte(temp, PCI_BRIDGE_CONTROL, &bctl); + +		pci_dev_get(dev); +		if (dev->hdr_type == PCI_HEADER_TYPE_BRIDGE) { +			pci_read_config_byte(dev, PCI_BRIDGE_CONTROL, &bctl);  			if (bctl & PCI_BRIDGE_CTL_VGA) {  				ctrl_err(ctrl,  					 "Cannot remove display device %s\n", -					 pci_name(temp)); -				pci_dev_put(temp); +					 pci_name(dev)); +				pci_dev_put(dev);  				rc = -EINVAL;  				break;  			}  		} -		pci_stop_and_remove_bus_device(temp); -		pci_dev_put(temp); +		pci_stop_and_remove_bus_device(dev); +		pci_dev_put(dev);  	}  	return rc;  }  |