Re: [PATCH] Limit VPD length on Atheros wifi cards
From: Bjorn Helgaas
Date: Fri Jan 08 2016 - 19:58:26 EST
[+cc Babu]
Hi Jordan, Babu, et al,
On Tue, Dec 29, 2015 at 04:19:02PM -0600, Jordan Hargrave wrote:
> Attempt to read VPD on these cards causes kernel hang or delay
>
> Signed-off-by: Jordan Hargrave <Jordan_Hargrave@xxxxxxxx>
> ---
> drivers/pci/quirks.c | 10 ++++++++++
> 1 files changed, 10 insertions(+), 0 deletions(-)
>
> diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c
> index e6376f6..a72667f 100644
> --- a/drivers/pci/quirks.c
> +++ b/drivers/pci/quirks.c
> @@ -2161,6 +2161,16 @@ static void quirk_brcm_570x_limit_vpd(struct pci_dev *dev)
> }
> }
>
> +static void quirk_atheros_vpd(struct pci_dev *dev)
> +{
> + /* Atheros WiFi cards hang when reading VPD */
> + if (dev->vpd)
> + dev->vpd->len = 0;
> +}
> +
> +DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_ATHEROS, PCI_ANY_ID, quirk_atheros_vpd);
> +DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_ATTANSIC, PCI_ANY_ID, quirk_atheros_vpd);
We're accumulating several quirks like this, and they don't do
anything device-specific, so we could probably use a single quirk for
all of them, i.e., Babu's quirk_megaraid_sas_limit_vpd() and your
quirk_atheros_vpd() are needlessly duplicated.
I'd really like to have more details about what the "kernel hang or
delay" that happens when we try to read VPD.
Looking at pci_vpd_pci22_read(), it basically just does config
accesses, so I only see two ways things could go wrong:
1) If the device responds with data, but the PCI_VPD_ADDR_F flag
isn't set, we should be able to timeout gracefully.
2) If the device doesn't respond at all, we could see machine
checks, master aborts, processor read timeouts, or similar hardware
problems.
If there are other failure modes, I'd like to learn what they are.
If we're seeing problems like (1), there must be something we can
improve in the way we handle timeouts.
If we're seeing failures like (2), they're probably caused by a
hardware or firmware problem on the device, and there's not much we
can do in the kernel, so disabling VPD access completely is probably
all we can do.
So if/when we add quirks like this, I'm looking for bugzilla entries
that clearly show that the problem is (2). I'd also like to log
something in dmesg as a clue about why lspci or other utilities don't
find any VPD data.
Bjorn
> DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_BROADCOM,
> PCI_DEVICE_ID_NX2_5706,
> quirk_brcm_570x_limit_vpd);
> --
> 1.7.1
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-pci" in
> the body of a message to majordomo@xxxxxxxxxxxxxxx
> More majordomo info at http://vger.kernel.org/majordomo-info.html