diff options
| author | Olof Johansson <olof@lixom.net> | 2013-02-04 22:56:41 -0800 | 
|---|---|---|
| committer | Olof Johansson <olof@lixom.net> | 2013-02-04 22:56:41 -0800 | 
| commit | 469da62096e23adc755c1268b00b5fc7a214151b (patch) | |
| tree | fefd055fdae584e38d551f44d1339eb22cee4ed9 /drivers/pci | |
| parent | 4227961650884a06757f80877d5dce0bddc723d4 (diff) | |
| parent | 88b62b915b0b7e25870eb0604ed9a92ba4bfc9f7 (diff) | |
| download | olio-linux-3.10-469da62096e23adc755c1268b00b5fc7a214151b.tar.xz olio-linux-3.10-469da62096e23adc755c1268b00b5fc7a214151b.zip  | |
Merge tag 'v3.8-rc6' into next/soc
Linux 3.8-rc6
Diffstat (limited to 'drivers/pci')
| -rw-r--r-- | drivers/pci/hotplug/pciehp.h | 2 | ||||
| -rw-r--r-- | drivers/pci/hotplug/pciehp_core.c | 11 | ||||
| -rw-r--r-- | drivers/pci/hotplug/pciehp_ctrl.c | 8 | ||||
| -rw-r--r-- | drivers/pci/hotplug/pciehp_hpc.c | 11 | ||||
| -rw-r--r-- | drivers/pci/hotplug/shpchp.h | 3 | ||||
| -rw-r--r-- | drivers/pci/hotplug/shpchp_core.c | 36 | ||||
| -rw-r--r-- | drivers/pci/hotplug/shpchp_ctrl.c | 6 | ||||
| -rw-r--r-- | drivers/pci/iov.c | 2 | ||||
| -rw-r--r-- | drivers/pci/pcie/Kconfig | 2 | ||||
| -rw-r--r-- | drivers/pci/pcie/aer/aerdrv_core.c | 1 | ||||
| -rw-r--r-- | drivers/pci/pcie/aspm.c | 3 | 
11 files changed, 41 insertions, 44 deletions
diff --git a/drivers/pci/hotplug/pciehp.h b/drivers/pci/hotplug/pciehp.h index 26ffd3e3fb7..2c113de9432 100644 --- a/drivers/pci/hotplug/pciehp.h +++ b/drivers/pci/hotplug/pciehp.h @@ -44,7 +44,6 @@ extern bool pciehp_poll_mode;  extern int pciehp_poll_time;  extern bool pciehp_debug;  extern bool pciehp_force; -extern struct workqueue_struct *pciehp_wq;  #define dbg(format, arg...)						\  do {									\ @@ -78,6 +77,7 @@ struct slot {  	struct hotplug_slot *hotplug_slot;  	struct delayed_work work;	/* work for button event */  	struct mutex lock; +	struct workqueue_struct *wq;  };  struct event_info { diff --git a/drivers/pci/hotplug/pciehp_core.c b/drivers/pci/hotplug/pciehp_core.c index 916bf4f53ab..939bd1d4b5b 100644 --- a/drivers/pci/hotplug/pciehp_core.c +++ b/drivers/pci/hotplug/pciehp_core.c @@ -42,7 +42,6 @@ bool pciehp_debug;  bool pciehp_poll_mode;  int pciehp_poll_time;  bool pciehp_force; -struct workqueue_struct *pciehp_wq;  #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>" @@ -340,18 +339,13 @@ static int __init pcied_init(void)  {  	int retval = 0; -	pciehp_wq = alloc_workqueue("pciehp", 0, 0); -	if (!pciehp_wq) -		return -ENOMEM; -  	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"); - 	if (retval) { -		destroy_workqueue(pciehp_wq); +	if (retval)  		dbg("Failure to register service\n"); -	} +  	return retval;  } @@ -359,7 +353,6 @@ static void __exit pcied_cleanup(void)  {  	dbg("unload_pciehpd()\n");  	pcie_port_service_unregister(&hpdriver_portdrv); -	destroy_workqueue(pciehp_wq);  	info(DRIVER_DESC " version: " DRIVER_VERSION " unloaded\n");  } diff --git a/drivers/pci/hotplug/pciehp_ctrl.c b/drivers/pci/hotplug/pciehp_ctrl.c index 27f44295a65..38f01867917 100644 --- a/drivers/pci/hotplug/pciehp_ctrl.c +++ b/drivers/pci/hotplug/pciehp_ctrl.c @@ -49,7 +49,7 @@ static int queue_interrupt_event(struct slot *p_slot, u32 event_type)  	info->p_slot = p_slot;  	INIT_WORK(&info->work, interrupt_event_handler); -	queue_work(pciehp_wq, &info->work); +	queue_work(p_slot->wq, &info->work);  	return 0;  } @@ -344,7 +344,7 @@ void pciehp_queue_pushbutton_work(struct work_struct *work)  		kfree(info);  		goto out;  	} -	queue_work(pciehp_wq, &info->work); +	queue_work(p_slot->wq, &info->work);   out:  	mutex_unlock(&p_slot->lock);  } @@ -377,7 +377,7 @@ static void handle_button_press_event(struct slot *p_slot)  		if (ATTN_LED(ctrl))  			pciehp_set_attention_status(p_slot, 0); -		queue_delayed_work(pciehp_wq, &p_slot->work, 5*HZ); +		queue_delayed_work(p_slot->wq, &p_slot->work, 5*HZ);  		break;  	case BLINKINGOFF_STATE:  	case BLINKINGON_STATE: @@ -439,7 +439,7 @@ static void handle_surprise_event(struct slot *p_slot)  	else  		p_slot->state = POWERON_STATE; -	queue_work(pciehp_wq, &info->work); +	queue_work(p_slot->wq, &info->work);  }  static void interrupt_event_handler(struct work_struct *work) diff --git a/drivers/pci/hotplug/pciehp_hpc.c b/drivers/pci/hotplug/pciehp_hpc.c index 13b2eaf7ba4..5127f3f4182 100644 --- a/drivers/pci/hotplug/pciehp_hpc.c +++ b/drivers/pci/hotplug/pciehp_hpc.c @@ -773,23 +773,32 @@ static void pcie_shutdown_notification(struct controller *ctrl)  static int pcie_init_slot(struct controller *ctrl)  {  	struct slot *slot; +	char name[32];  	slot = kzalloc(sizeof(*slot), GFP_KERNEL);  	if (!slot)  		return -ENOMEM; +	snprintf(name, sizeof(name), "pciehp-%u", PSN(ctrl)); +	slot->wq = alloc_workqueue(name, 0, 0); +	if (!slot->wq) +		goto abort; +  	slot->ctrl = ctrl;  	mutex_init(&slot->lock);  	INIT_DELAYED_WORK(&slot->work, pciehp_queue_pushbutton_work);  	ctrl->slot = slot;  	return 0; +abort: +	kfree(slot); +	return -ENOMEM;  }  static void pcie_cleanup_slot(struct controller *ctrl)  {  	struct slot *slot = ctrl->slot;  	cancel_delayed_work(&slot->work); -	flush_workqueue(pciehp_wq); +	destroy_workqueue(slot->wq);  	kfree(slot);  } diff --git a/drivers/pci/hotplug/shpchp.h b/drivers/pci/hotplug/shpchp.h index ca64932e658..b849f995075 100644 --- a/drivers/pci/hotplug/shpchp.h +++ b/drivers/pci/hotplug/shpchp.h @@ -46,8 +46,6 @@  extern bool shpchp_poll_mode;  extern int shpchp_poll_time;  extern bool shpchp_debug; -extern struct workqueue_struct *shpchp_wq; -extern struct workqueue_struct *shpchp_ordered_wq;  #define dbg(format, arg...)						\  do {									\ @@ -91,6 +89,7 @@ struct slot {  	struct list_head	slot_list;  	struct delayed_work work;	/* work for button event */  	struct mutex lock; +	struct workqueue_struct *wq;  	u8 hp_slot;  }; diff --git a/drivers/pci/hotplug/shpchp_core.c b/drivers/pci/hotplug/shpchp_core.c index b6de307248e..3100c52c837 100644 --- a/drivers/pci/hotplug/shpchp_core.c +++ b/drivers/pci/hotplug/shpchp_core.c @@ -39,8 +39,6 @@  bool shpchp_debug;  bool shpchp_poll_mode;  int shpchp_poll_time; -struct workqueue_struct *shpchp_wq; -struct workqueue_struct *shpchp_ordered_wq;  #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>" @@ -129,6 +127,14 @@ static int init_slots(struct controller *ctrl)  		slot->device = ctrl->slot_device_offset + i;  		slot->hpc_ops = ctrl->hpc_ops;  		slot->number = ctrl->first_slot + (ctrl->slot_num_inc * i); + +		snprintf(name, sizeof(name), "shpchp-%d", slot->number); +		slot->wq = alloc_workqueue(name, 0, 0); +		if (!slot->wq) { +			retval = -ENOMEM; +			goto error_info; +		} +  		mutex_init(&slot->lock);  		INIT_DELAYED_WORK(&slot->work, shpchp_queue_pushbutton_work); @@ -148,7 +154,7 @@ static int init_slots(struct controller *ctrl)  		if (retval) {  			ctrl_err(ctrl, "pci_hp_register failed with error %d\n",  				 retval); -			goto error_info; +			goto error_slotwq;  		}  		get_power_status(hotplug_slot, &info->power_status); @@ -160,6 +166,8 @@ static int init_slots(struct controller *ctrl)  	}  	return 0; +error_slotwq: +	destroy_workqueue(slot->wq);  error_info:  	kfree(info);  error_hpslot: @@ -180,8 +188,7 @@ void cleanup_slots(struct controller *ctrl)  		slot = list_entry(tmp, struct slot, slot_list);  		list_del(&slot->slot_list);  		cancel_delayed_work(&slot->work); -		flush_workqueue(shpchp_wq); -		flush_workqueue(shpchp_ordered_wq); +		destroy_workqueue(slot->wq);  		pci_hp_deregister(slot->hotplug_slot);  	}  } @@ -364,25 +371,12 @@ static struct pci_driver shpc_driver = {  static int __init shpcd_init(void)  { -	int retval = 0; - -	shpchp_wq = alloc_ordered_workqueue("shpchp", 0); -	if (!shpchp_wq) -		return -ENOMEM; - -	shpchp_ordered_wq = alloc_ordered_workqueue("shpchp_ordered", 0); -	if (!shpchp_ordered_wq) { -		destroy_workqueue(shpchp_wq); -		return -ENOMEM; -	} +	int retval;  	retval = pci_register_driver(&shpc_driver);  	dbg("%s: pci_register_driver = %d\n", __func__, retval);  	info(DRIVER_DESC " version: " DRIVER_VERSION "\n"); -	if (retval) { -		destroy_workqueue(shpchp_ordered_wq); -		destroy_workqueue(shpchp_wq); -	} +  	return retval;  } @@ -390,8 +384,6 @@ static void __exit shpcd_cleanup(void)  {  	dbg("unload_shpchpd()\n");  	pci_unregister_driver(&shpc_driver); -	destroy_workqueue(shpchp_ordered_wq); -	destroy_workqueue(shpchp_wq);  	info(DRIVER_DESC " version: " DRIVER_VERSION " unloaded\n");  } diff --git a/drivers/pci/hotplug/shpchp_ctrl.c b/drivers/pci/hotplug/shpchp_ctrl.c index f9b5a52e411..58499277903 100644 --- a/drivers/pci/hotplug/shpchp_ctrl.c +++ b/drivers/pci/hotplug/shpchp_ctrl.c @@ -51,7 +51,7 @@ static int queue_interrupt_event(struct slot *p_slot, u32 event_type)  	info->p_slot = p_slot;  	INIT_WORK(&info->work, interrupt_event_handler); -	queue_work(shpchp_wq, &info->work); +	queue_work(p_slot->wq, &info->work);  	return 0;  } @@ -453,7 +453,7 @@ void shpchp_queue_pushbutton_work(struct work_struct *work)  		kfree(info);  		goto out;  	} -	queue_work(shpchp_ordered_wq, &info->work); +	queue_work(p_slot->wq, &info->work);   out:  	mutex_unlock(&p_slot->lock);  } @@ -501,7 +501,7 @@ static void handle_button_press_event(struct slot *p_slot)  		p_slot->hpc_ops->green_led_blink(p_slot);  		p_slot->hpc_ops->set_attention_status(p_slot, 0); -		queue_delayed_work(shpchp_wq, &p_slot->work, 5*HZ); +		queue_delayed_work(p_slot->wq, &p_slot->work, 5*HZ);  		break;  	case BLINKINGOFF_STATE:  	case BLINKINGON_STATE: diff --git a/drivers/pci/iov.c b/drivers/pci/iov.c index bafd2bbcaf6..c18e5bf444f 100644 --- a/drivers/pci/iov.c +++ b/drivers/pci/iov.c @@ -739,7 +739,7 @@ EXPORT_SYMBOL_GPL(pci_num_vf);  /**   * pci_sriov_set_totalvfs -- reduce the TotalVFs available   * @dev: the PCI PF device - * numvfs: number that should be used for TotalVFs supported + * @numvfs: number that should be used for TotalVFs supported   *   * Should be called from PF driver's probe routine with   * device's mutex held. diff --git a/drivers/pci/pcie/Kconfig b/drivers/pci/pcie/Kconfig index 6c8bc580978..fde4a32a029 100644 --- a/drivers/pci/pcie/Kconfig +++ b/drivers/pci/pcie/Kconfig @@ -82,4 +82,4 @@ endchoice  config PCIE_PME  	def_bool y -	depends on PCIEPORTBUS && PM_RUNTIME && EXPERIMENTAL && ACPI +	depends on PCIEPORTBUS && PM_RUNTIME && ACPI diff --git a/drivers/pci/pcie/aer/aerdrv_core.c b/drivers/pci/pcie/aer/aerdrv_core.c index 421bbc5fee3..564d97f94b6 100644 --- a/drivers/pci/pcie/aer/aerdrv_core.c +++ b/drivers/pci/pcie/aer/aerdrv_core.c @@ -630,6 +630,7 @@ static void aer_recover_work_func(struct work_struct *work)  			continue;  		}  		do_recovery(pdev, entry.severity); +		pci_dev_put(pdev);  	}  }  #endif diff --git a/drivers/pci/pcie/aspm.c b/drivers/pci/pcie/aspm.c index b52630b8ead..8474b6a4fc9 100644 --- a/drivers/pci/pcie/aspm.c +++ b/drivers/pci/pcie/aspm.c @@ -771,6 +771,9 @@ void pcie_clear_aspm(struct pci_bus *bus)  {  	struct pci_dev *child; +	if (aspm_force) +		return; +  	/*  	 * Clear any ASPM setup that the firmware has carried out on this bus  	 */  |