diff options
Diffstat (limited to 'drivers/pci/hotplug/pciehp_core.c')
| -rw-r--r-- | drivers/pci/hotplug/pciehp_core.c | 36 | 
1 files changed, 23 insertions, 13 deletions
diff --git a/drivers/pci/hotplug/pciehp_core.c b/drivers/pci/hotplug/pciehp_core.c index f4a18f51a29..a2297db8081 100644 --- a/drivers/pci/hotplug/pciehp_core.c +++ b/drivers/pci/hotplug/pciehp_core.c @@ -41,7 +41,7 @@  bool pciehp_debug;  bool pciehp_poll_mode;  int pciehp_poll_time; -bool pciehp_force; +static bool pciehp_force;  #define DRIVER_VERSION	"0.4"  #define DRIVER_AUTHOR	"Dan Zink <dan.zink@compaq.com>, Greg Kroah-Hartman <greg@kroah.com>, Dely Sy <dely.l.sy@intel.com>" @@ -108,6 +108,7 @@ static int init_slot(struct controller *ctrl)  	ops = kzalloc(sizeof(*ops), GFP_KERNEL);  	if (!ops)  		goto out; +  	ops->enable_slot = enable_slot;  	ops->disable_slot = disable_slot;  	ops->get_power_status = get_power_status; @@ -160,7 +161,8 @@ static int set_attention_status(struct hotplug_slot *hotplug_slot, u8 status)  	ctrl_dbg(slot->ctrl, "%s: physical_slot = %s\n",  		  __func__, slot_name(slot)); -	return pciehp_set_attention_status(slot, status); +	pciehp_set_attention_status(slot, status); +	return 0;  } @@ -192,7 +194,8 @@ static int get_power_status(struct hotplug_slot *hotplug_slot, u8 *value)  	ctrl_dbg(slot->ctrl, "%s: physical_slot = %s\n",  		  __func__, slot_name(slot)); -	return pciehp_get_power_status(slot, value); +	pciehp_get_power_status(slot, value); +	return 0;  }  static int get_attention_status(struct hotplug_slot *hotplug_slot, u8 *value) @@ -202,7 +205,8 @@ static int get_attention_status(struct hotplug_slot *hotplug_slot, u8 *value)  	ctrl_dbg(slot->ctrl, "%s: physical_slot = %s\n",  		  __func__, slot_name(slot)); -	return pciehp_get_attention_status(slot, value); +	pciehp_get_attention_status(slot, value); +	return 0;  }  static int get_latch_status(struct hotplug_slot *hotplug_slot, u8 *value) @@ -212,7 +216,8 @@ static int get_latch_status(struct hotplug_slot *hotplug_slot, u8 *value)  	ctrl_dbg(slot->ctrl, "%s: physical_slot = %s\n",  		 __func__, slot_name(slot)); -	return pciehp_get_latch_status(slot, value); +	pciehp_get_latch_status(slot, value); +	return 0;  }  static int get_adapter_status(struct hotplug_slot *hotplug_slot, u8 *value) @@ -222,7 +227,8 @@ static int get_adapter_status(struct hotplug_slot *hotplug_slot, u8 *value)  	ctrl_dbg(slot->ctrl, "%s: physical_slot = %s\n",  		 __func__, slot_name(slot)); -	return pciehp_get_adapter_status(slot, value); +	pciehp_get_adapter_status(slot, value); +	return 0;  }  static int reset_slot(struct hotplug_slot *hotplug_slot, int probe) @@ -260,8 +266,7 @@ static int pciehp_probe(struct pcie_device *dev)  	rc = init_slot(ctrl);  	if (rc) {  		if (rc == -EBUSY) -			ctrl_warn(ctrl, "Slot already registered by another " -				  "hotplug driver\n"); +			ctrl_warn(ctrl, "Slot already registered by another hotplug driver\n");  		else  			ctrl_err(ctrl, "Slot initialization failed\n");  		goto err_out_release_ctlr; @@ -278,8 +283,11 @@ static int pciehp_probe(struct pcie_device *dev)  	slot = ctrl->slot;  	pciehp_get_adapter_status(slot, &occupied);  	pciehp_get_power_status(slot, &poweron); -	if (occupied && pciehp_force) +	if (occupied && pciehp_force) { +		mutex_lock(&slot->hotplug_lock);  		pciehp_enable_slot(slot); +		mutex_unlock(&slot->hotplug_lock); +	}  	/* If empty slot's power status is on, turn power off */  	if (!occupied && poweron && POWER_CTRL(ctrl))  		pciehp_power_off_slot(slot); @@ -303,12 +311,12 @@ static void pciehp_remove(struct pcie_device *dev)  }  #ifdef CONFIG_PM -static int pciehp_suspend (struct pcie_device *dev) +static int pciehp_suspend(struct pcie_device *dev)  {  	return 0;  } -static int pciehp_resume (struct pcie_device *dev) +static int pciehp_resume(struct pcie_device *dev)  {  	struct controller *ctrl;  	struct slot *slot; @@ -323,10 +331,12 @@ static int pciehp_resume (struct pcie_device *dev)  	/* Check if slot is occupied */  	pciehp_get_adapter_status(slot, &status); +	mutex_lock(&slot->hotplug_lock);  	if (status)  		pciehp_enable_slot(slot);  	else  		pciehp_disable_slot(slot); +	mutex_unlock(&slot->hotplug_lock);  	return 0;  }  #endif /* PM */ @@ -351,8 +361,8 @@ static int __init pcied_init(void)  	pciehp_firmware_init();  	retval = pcie_port_service_register(&hpdriver_portdrv); - 	dbg("pcie_port_service_register = %d\n", retval); -  	info(DRIVER_DESC " version: " DRIVER_VERSION "\n"); +	dbg("pcie_port_service_register = %d\n", retval); +	info(DRIVER_DESC " version: " DRIVER_VERSION "\n");  	if (retval)  		dbg("Failure to register service\n");  | 
