On Wed, Oct 26, 2016 at 01:16:16PM -0500, Nathan Zimmer wrote:
On 10/25/2016 03:41 PM, Sean Young wrote:Where does it hang? Any error messages?
On Mon, Oct 24, 2016 at 04:49:25PM -0500, Nathan Zimmer wrote:With console=ttyS1 the boot will "hang", sometimes it makes it all the way
[ 1.565062] serial8250: ttyS1 at I/O 0x2f8 (irq = 3) is a 16550AThe isa probe driver find the serial port.
[ 1.566453] serial 00:04: pnp_assign_resources, try dependent set 0But then decides that the port is already in use (the existing serial driver).
[ 1.567383] serial 00:04: couldn't assign io 0 (min 0x2f8 max 0x2f8)
[ 1.568366] serial 00:04: pnp_assign_resources failed (-16)Please try and boot 3.7.0 with "8250.share_irqs=1", maybe it will pick
[ 1.569188] serial 00:04: unable to assign resources
[ 1.569924] serial: probe of 00:04 failed with error -16
irq 3 and it will be happy again, but that is just a guess.
I think I have not fully understood what the failure is. Does the serial
port not work or does the boot hang? What are the symptoms?
through but may take 30 minutes, instead of the 2-4 minutes this box
Ok. Please try to following patch. I'm not sure it is good enough to beWe might be able to fix the problem with a pnp quirk but 3.7 is has not hadYes it still happens with 4.8+
any releases for a long time. We will need a reproduction on a concurrent
kernel so a patch can be written for that.
I had only started dwelling on 3.6/3.7 since that is where it first appears
and don't have any attachment to those.
merged as-is, but should provide a start for testing. Output with
CONFIG_PNP_DEBUG_MESSAGES should show only irq 3 is available for the
serial port now.
Sean
From 3a1705a2e28f4385b778ad96d7c517b82ea860e2 Mon Sep 17 00:00:00 2001
From: Sean Young <sean@xxxxxxxx>
Date: Thu, 27 Oct 2016 20:13:50 +0100
Subject: [PATCH] PNP: Add quirk for BIOS advertising wrong irqs for serial
port
Signed-off-by: Sean Young <sean@xxxxxxxx>
---
drivers/pnp/quirks.c | 43 +++++++++++++++++++++++++++++++++++++++++++
1 file changed, 43 insertions(+)
diff --git a/drivers/pnp/quirks.c b/drivers/pnp/quirks.c
index d28e3ab..8712161 100644
--- a/drivers/pnp/quirks.c
+++ b/drivers/pnp/quirks.c
@@ -66,6 +66,48 @@ static void quirk_awe32_resources(struct pnp_dev *dev)
}
}
+static void quirk_serial_port(struct pnp_dev *dev)
+{
+ struct pnp_option *option;
+ struct pnp_irq *irq;
+ struct pnp_port *port;
+
+ list_for_each_entry(option, &dev->options, list) {
+ if (!pnp_option_is_dependent(option))
+ continue;
+
+ if (option->type == IORESOURCE_IO) {
+ port = &option->u.port;
+
+ if (port->min != 0x2f8 || port->max != 0x2f8 ||
+ port->size != 8 || port->align != 1)
+ return;
+ } else if (option->type == IORESOURCE_IRQ) {
+ pnp_irq_mask_t map;
+
+ irq = &option->u.irq;
+
+ bitmap_zero(map.bits, PNP_IRQ_NR);
+ __set_bit(3, map.bits);
+ __set_bit(4, map.bits);
+ __set_bit(5, map.bits);
+ __set_bit(6, map.bits);
+ __set_bit(7, map.bits);
+ __set_bit(10, map.bits);
+ __set_bit(11, map.bits);
+ __set_bit(12, map.bits);
+
+ if (!bitmap_equal(map.bits, irq->map.bits, PNP_IRQ_NR))
+ return;
+ }
+ }
+
+ if (irq && port) {
+ bitmap_zero(irq->map.bits, PNP_IRQ_NR);
+ __set_bit(3, irq->map.bits);
+ }
+}
+
static void quirk_cmi8330_resources(struct pnp_dev *dev)
{
struct pnp_option *option;
@@ -448,6 +490,7 @@ static struct pnp_fixup pnp_fixups[] = {
#ifdef CONFIG_PCI
{"PNP0c02", quirk_intel_mch},
#endif
+ {"PNP0c02", quirk_serial_port},
{""}
};