lkml.org 
[lkml]   [2012]   [Jan]   [27]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 2/7] PCI: Separate pci_bus_read_dev_vendor_id from pci_scan_device
    Date
    Will reuse that function for pciehp probing.

    -v2: according to Kenji, fix crs timeout checking, and export the function
    for later using when pciehp is compiled as module.

    Suggested-by: Matthew Wilcox <matthew@wil.cx>
    Signed-off-by: Yinghai Lu <yinghai@kernel.org>
    ---
    drivers/pci/pci.h | 2 ++
    drivers/pci/probe.c | 48 +++++++++++++++++++++++++++++++-----------------
    2 files changed, 33 insertions(+), 17 deletions(-)

    diff --git a/drivers/pci/pci.h b/drivers/pci/pci.h
    index b74084e..8dadbd3 100644
    --- a/drivers/pci/pci.h
    +++ b/drivers/pci/pci.h
    @@ -205,6 +205,8 @@ enum pci_bar_type {
    pci_bar_mem64, /* A 64-bit memory BAR */
    };

    +bool pci_bus_read_dev_vendor_id(struct pci_bus *bus, int devfn, u32 *pl,
    + int crs_timeout);
    extern int pci_setup_device(struct pci_dev *dev);
    extern int __pci_read_base(struct pci_dev *dev, enum pci_bar_type type,
    struct resource *res, unsigned int reg);
    diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c
    index 04e74f4..101e90f 100644
    --- a/drivers/pci/probe.c
    +++ b/drivers/pci/probe.c
    @@ -1113,40 +1113,54 @@ struct pci_dev *alloc_pci_dev(void)
    }
    EXPORT_SYMBOL(alloc_pci_dev);

    -/*
    - * Read the config data for a PCI device, sanity-check it
    - * and fill in the dev structure...
    - */
    -static struct pci_dev *pci_scan_device(struct pci_bus *bus, int devfn)
    +bool pci_bus_read_dev_vendor_id(struct pci_bus *bus, int devfn, u32 *l,
    + int crs_timeout)
    {
    - struct pci_dev *dev;
    - u32 l;
    int delay = 1;

    - if (pci_bus_read_config_dword(bus, devfn, PCI_VENDOR_ID, &l))
    - return NULL;
    + if (pci_bus_read_config_dword(bus, devfn, PCI_VENDOR_ID, l))
    + return false;

    /* some broken boards return 0 or ~0 if a slot is empty: */
    - if (l == 0xffffffff || l == 0x00000000 ||
    - l == 0x0000ffff || l == 0xffff0000)
    - return NULL;
    + if (*l == 0xffffffff || *l == 0x00000000 ||
    + *l == 0x0000ffff || *l == 0xffff0000)
    + return false;

    /* Configuration request Retry Status */
    - while (l == 0xffff0001) {
    + while (*l == 0xffff0001) {
    + if (!crs_timeout)
    + return false;
    +
    msleep(delay);
    delay *= 2;
    - if (pci_bus_read_config_dword(bus, devfn, PCI_VENDOR_ID, &l))
    - return NULL;
    + if (pci_bus_read_config_dword(bus, devfn, PCI_VENDOR_ID, l))
    + return false;
    /* Card hasn't responded in 60 seconds? Must be stuck. */
    - if (delay > 60 * 1000) {
    + if (delay > crs_timeout) {
    printk(KERN_WARNING "pci %04x:%02x:%02x.%d: not "
    "responding\n", pci_domain_nr(bus),
    bus->number, PCI_SLOT(devfn),
    PCI_FUNC(devfn));
    - return NULL;
    + return false;
    }
    }

    + return true;
    +}
    +EXPORT_SYMBOL(pci_bus_read_dev_vendor_id);
    +
    +/*
    + * Read the config data for a PCI device, sanity-check it
    + * and fill in the dev structure...
    + */
    +static struct pci_dev *pci_scan_device(struct pci_bus *bus, int devfn)
    +{
    + struct pci_dev *dev;
    + u32 l;
    +
    + if (!pci_bus_read_dev_vendor_id(bus, devfn, &l, 60*1000))
    + return NULL;
    +
    dev = alloc_pci_dev();
    if (!dev)
    return NULL;
    --
    1.7.7


    \
     
     \ /
      Last update: 2012-01-27 19:59    [W:3.828 / U:0.396 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site