lkml.org 
[lkml]   [2007]   [Dec]   [17]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[PATCH] PCI: fix for quirk_e100_interrupt()
    Check that the e100 is in the D0 power state. If it's not, it won't
    respond to MMIO accesses and we end up with master-abort machine
    checks on some platforms.

    Signed-off-by: Ivan Kokshaysky <ink@jurassic.park.msu.ru>
    ---
    drivers/pci/quirks.c | 14 +++++++++++++-
    1 files changed, 13 insertions(+), 1 deletions(-)

    diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c
    index 26cc4dc..c8b2b9d 100644
    --- a/drivers/pci/quirks.c
    +++ b/drivers/pci/quirks.c
    @@ -1406,9 +1406,10 @@ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_NETMOS, PCI_ANY_ID, quirk_netmos);

    static void __devinit quirk_e100_interrupt(struct pci_dev *dev)
    {
    - u16 command;
    + u16 command, pmcsr;
    u8 __iomem *csr;
    u8 cmd_hi;
    + int pm;

    switch (dev->device) {
    /* PCI IDs taken from drivers/net/e100.c */
    @@ -1442,6 +1443,17 @@ static void __devinit quirk_e100_interrupt(struct pci_dev *dev)
    if (!(command & PCI_COMMAND_MEMORY) || !pci_resource_start(dev, 0))
    return;

    + /*
    + * Check that the device is in the D0 power state. If it's not,
    + * there is no point to look any further.
    + */
    + pm = pci_find_capability(dev, PCI_CAP_ID_PM);
    + if (pm) {
    + pci_read_config_word(dev, pm + PCI_PM_CTRL, &pmcsr);
    + if ((pmcsr & PCI_PM_CTRL_STATE_MASK) != PCI_D0)
    + return;
    + }
    +
    /* Convert from PCI bus to resource space. */
    csr = ioremap(pci_resource_start(dev, 0), 8);
    if (!csr) {

    \
     
     \ /
      Last update: 2007-12-17 22:41    [W:0.021 / U:9.564 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site