lkml.org 
[lkml]   [2009]   [Feb]   [28]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    SubjectRe: [PATCH] pci: don't enable too many HT MSI mapping
    From
    please check this one
    v1 is pulled by Linus from Jesse's pci tree already, and v3 is needed
    to be applied on top of v1

    YH
    [PATCH] pci: don't enable too much HT MSI mapping -v3

    Impact: fix bug

    Prakash reported that his c51-mcp51 system ondie sound card doesn't work MSI
    but if he hack out the HT-MSI on mcp51, the MSI will work well with sound card.

    this patch rework the nv_msi_ht_cap_quirk()
    and will only try to avoid to enable ht_msi on device following that root dev,
    and don't touch that root dev

    v3: will enable c51...

    Reported-by: Prakash Punnoor <prakash@punnoor.de>
    Signed-off-by: Yinghai Lu <yinghai@kernel.org>

    ---
    drivers/pci/quirks.c | 31 ++++++++++++++++++++++++++-----
    1 file changed, 26 insertions(+), 5 deletions(-)

    Index: linux-2.6/drivers/pci/quirks.c
    ===================================================================
    --- linux-2.6.orig/drivers/pci/quirks.c
    +++ linux-2.6/drivers/pci/quirks.c
    @@ -2077,6 +2077,10 @@ static void __devinit nv_ht_enable_msi_m
    if (!found)
    return;

    + /* don't enable host_bridge directly here */
    + if (host_bridge == dev)
    + goto out;
    +
    /* root did that ! */
    if (msi_ht_cap_enabled(host_bridge))
    goto out;
    @@ -2097,7 +2101,7 @@ static void __devinit ht_disable_msi_map

    if (pci_read_config_byte(dev, pos + HT_MSI_FLAGS,
    &flags) == 0) {
    - dev_info(&dev->dev, "Enabling HT MSI Mapping\n");
    + dev_info(&dev->dev, "Disabling HT MSI Mapping\n");

    pci_write_config_byte(dev, pos + HT_MSI_FLAGS,
    flags & ~HT_MSI_FLAGS_ENABLE);
    @@ -2135,7 +2139,7 @@ static int __devinit ht_check_msi_mappin
    return found;
    }

    -static void __devinit nv_msi_ht_cap_quirk(struct pci_dev *dev)
    +static void __devinit __nv_msi_ht_cap_quirk(struct pci_dev *dev, int all)
    {
    struct pci_dev *host_bridge;
    int pos;
    @@ -2164,7 +2168,10 @@ static void __devinit nv_msi_ht_cap_quir
    /* Host bridge is to HT */
    if (found == 1) {
    /* it is not enabled, try to enable it */
    - nv_ht_enable_msi_mapping(dev);
    + if (all)
    + ht_enable_msi_mapping(dev);
    + else
    + nv_ht_enable_msi_mapping(dev);
    }
    return;
    }
    @@ -2176,8 +2183,22 @@ static void __devinit nv_msi_ht_cap_quir
    /* Host bridge is not to HT, disable HT MSI mapping on this device */
    ht_disable_msi_mapping(dev);
    }
    -DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_NVIDIA, PCI_ANY_ID, nv_msi_ht_cap_quirk);
    -DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AL, PCI_ANY_ID, nv_msi_ht_cap_quirk);
    +
    +static void __devinit nv_msi_ht_cap_quirk_all(struct pci_dev *dev)
    +{
    + return __nv_msi_ht_cap_quirk(dev, 1);
    +}
    +
    +static void __devinit nv_msi_ht_cap_quirk_leaf(struct pci_dev *dev)
    +{
    + return __nv_msi_ht_cap_quirk(dev, 0);
    +}
    +
    +/* werid?, c51/mcp51 need c51 ht msi to be enable to make mcp51 ht msi working */
    +DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_NVIDIA, 0x02f0, nv_msi_ht_cap_quirk_all);
    +DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_NVIDIA, PCI_ANY_ID, nv_msi_ht_cap_quirk_leaf);
    +
    +DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AL, PCI_ANY_ID, nv_msi_ht_cap_quirk_all);

    static void __devinit quirk_msi_intx_disable_bug(struct pci_dev *dev)
    {
    \
     
     \ /
      Last update: 2009-02-28 23:47    [W:0.024 / U:31.164 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site