lkml.org 
[lkml]   [2009]   [Nov]   [25]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[PATCH 1/2] pciehp: remove redundancy in bridge resource allocation
    Current pciehp driver configures bridge's child bus each time the
    bridge is found on the hot-added PCIe adapter card. It is redundant
    and strange because pciehp tryies to add devices on the child bus
    before adding its parent bridge. It should be done at one time on the
    slot's parent bus.

    Signed-off-by: Kenji Kaneshige <kaneshige.kenji@jp.fujitsu.com>

    ---
    drivers/pci/hotplug/pciehp_pci.c | 28 +++++++++++++---------------
    1 file changed, 13 insertions(+), 15 deletions(-)

    Index: 20091125/drivers/pci/hotplug/pciehp_pci.c
    ===================================================================
    --- 20091125.orig/drivers/pci/hotplug/pciehp_pci.c
    +++ 20091125/drivers/pci/hotplug/pciehp_pci.c
    @@ -34,30 +34,26 @@
    #include "../pci.h"
    #include "pciehp.h"

    -static int __ref pciehp_add_bridge(struct pci_dev *dev)
    +static void __ref pciehp_scan_bridge(struct pci_dev *dev)
    {
    struct pci_bus *parent = dev->bus;
    - int pass, busnr, start = parent->secondary;
    - int end = parent->subordinate;
    + int pass, busnr, start, end;

    + start = parent->secondary;
    + end = parent->subordinate;
    for (busnr = start; busnr <= end; busnr++) {
    if (!pci_find_bus(pci_domain_nr(parent), busnr))
    break;
    }
    +
    if (busnr-- > end) {
    err("No bus number available for hot-added bridge %s\n",
    - pci_name(dev));
    - return -1;
    + pci_name(dev));
    + return;
    }
    +
    for (pass = 0; pass < 2; pass++)
    busnr = pci_scan_bridge(parent, dev, busnr, pass);
    - if (!dev->subordinate)
    - return -1;
    - pci_bus_size_bridges(dev->subordinate);
    - pci_bus_assign_resources(parent);
    - pci_enable_bridges(parent);
    - pci_bus_add_devices(parent);
    - return 0;
    }

    int pciehp_configure_device(struct slot *p_slot)
    @@ -93,14 +89,16 @@ int pciehp_configure_device(struct slot
    continue;
    }
    if ((dev->hdr_type == PCI_HEADER_TYPE_BRIDGE) ||
    - (dev->hdr_type == PCI_HEADER_TYPE_CARDBUS)) {
    - pciehp_add_bridge(dev);
    - }
    + (dev->hdr_type == PCI_HEADER_TYPE_CARDBUS))
    + pciehp_scan_bridge(dev);
    +
    pci_configure_slot(dev);
    pci_dev_put(dev);
    }

    + pci_bus_size_bridges(parent);
    pci_bus_assign_resources(parent);
    + pci_enable_bridges(parent);
    pci_bus_add_devices(parent);
    return 0;
    }


    \
     
     \ /
      Last update: 2009-11-25 12:29    [W:0.093 / U:91.016 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site