diff mbox

[3/3] PCI Hotplug: workaround for Thunderbolt on Intel DZ77RE-75K motherboard

Message ID 1355412708-20046-4-git-send-email-kirill.shutemov@linux.intel.com
State Rejected
Headers show

Commit Message

Kirill A. Shutemov Dec. 13, 2012, 3:31 p.m. UTC
From: "Kirill A. Shutemov" <kirill.shutemov@linux.intel.com>

BIOS on Intel DZ77RE-75K motherboard notifies OS about Thunderbolt
hotplug before devices behind Thunderbolt are ready to be enumerated.

Let's delay enumeration by 2 seconds.

Signed-off-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
---
 drivers/pci/hotplug/acpiphp_glue.c |   16 +++++++++++++++-
 1 file changed, 15 insertions(+), 1 deletion(-)

Comments

gregkh@linuxfoundation.org Dec. 13, 2012, 6:48 p.m. UTC | #1
On Thu, Dec 13, 2012 at 05:31:48PM +0200, Kirill A. Shutemov wrote:
> From: "Kirill A. Shutemov" <kirill.shutemov@linux.intel.com>
> 
> BIOS on Intel DZ77RE-75K motherboard notifies OS about Thunderbolt
> hotplug before devices behind Thunderbolt are ready to be enumerated.
> 
> Let's delay enumeration by 2 seconds.
> 
> Signed-off-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
> ---
>  drivers/pci/hotplug/acpiphp_glue.c |   16 +++++++++++++++-
>  1 file changed, 15 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/pci/hotplug/acpiphp_glue.c b/drivers/pci/hotplug/acpiphp_glue.c
> index 1a2b3ca..165987a 100644
> --- a/drivers/pci/hotplug/acpiphp_glue.c
> +++ b/drivers/pci/hotplug/acpiphp_glue.c
> @@ -49,6 +49,7 @@
>  #include <linux/mutex.h>
>  #include <linux/slab.h>
>  #include <linux/acpi.h>
> +#include <linux/dmi.h>
>  
>  #include "../pci.h"
>  #include "acpiphp.h"
> @@ -1327,6 +1328,19 @@ out:
>  static void handle_hotplug_event_bridge(acpi_handle handle, u32 type,
>  					void *context)
>  {
> +	unsigned long delay = 0;
> +	const char *board_name;
> +
> +	board_name = dmi_get_system_info(DMI_BOARD_NAME);
> +	/*
> +	 * BIOS on Intel DZ77RE-75K motherboard notifies OS about Thunderbolt
> +	 * hotplug before devices behind Thunderbolt are ready to be
> +	 * enumerated.
> +	 * Let's delay enumeration by 2 seconds.
> +	 */
> +	if (board_name && !strcmp(board_name, "DZ77RE-75K"))
> +		delay = 2 * HZ;

Again, no objection to this patch as-is, but should we make it a bit
more "general" and provide a quirk table to make this type of fix easier
for other motherboards?  Shouldn't we also match on a manufacturer field
as well as the board_name?  The kernel provides a very easy to match on
any arbritary set of DMI fields for this kind of problem that we could
use here.

I can make that change if needed.

What are the odds that other boards are going to need a longer delay
time?  Actually, is there a spec saying how long we need to wait?  The
ACPI PCI Hotplug had a value somewhere that the hardware was supposed to
follow, but I don't have access to that ACPI spec anymore to verify
this...

thanks,

greg k-h
--
To unsubscribe from this list: send the line "unsubscribe linux-pci" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/drivers/pci/hotplug/acpiphp_glue.c b/drivers/pci/hotplug/acpiphp_glue.c
index 1a2b3ca..165987a 100644
--- a/drivers/pci/hotplug/acpiphp_glue.c
+++ b/drivers/pci/hotplug/acpiphp_glue.c
@@ -49,6 +49,7 @@ 
 #include <linux/mutex.h>
 #include <linux/slab.h>
 #include <linux/acpi.h>
+#include <linux/dmi.h>
 
 #include "../pci.h"
 #include "acpiphp.h"
@@ -1327,6 +1328,19 @@  out:
 static void handle_hotplug_event_bridge(acpi_handle handle, u32 type,
 					void *context)
 {
+	unsigned long delay = 0;
+	const char *board_name;
+
+	board_name = dmi_get_system_info(DMI_BOARD_NAME);
+	/*
+	 * BIOS on Intel DZ77RE-75K motherboard notifies OS about Thunderbolt
+	 * hotplug before devices behind Thunderbolt are ready to be
+	 * enumerated.
+	 * Let's delay enumeration by 2 seconds.
+	 */
+	if (board_name && !strcmp(board_name, "DZ77RE-75K"))
+		delay = 2 * HZ;
+
 	/*
 	 * Currently the code adds all hotplug events to the kacpid_wq
 	 * queue when it should add hotplug events to the kacpi_hotplug_wq.
@@ -1336,7 +1350,7 @@  static void handle_hotplug_event_bridge(acpi_handle handle, u32 type,
 	 * don't deadlock on hotplug actions.
 	 */
 	alloc_acpiphp_hp_work(handle, type, context,
-			      _handle_hotplug_event_bridge, 0);
+			      _handle_hotplug_event_bridge, delay);
 }
 
 static void _handle_hotplug_event_func(struct work_struct *work)