lkml.org 
[lkml]   [2009]   [Mar]   [28]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    SubjectRe: [PATCH] pci: don't enable too much HT MSI mapping -v5 -resend
    please try follwing patch over pci/linux-next

    Thanks

    YH

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

    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

    v6: only do that trick with end_device on the chain.

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

    diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c
    index faf02dd..52714f2 100644
    --- a/drivers/pci/quirks.c
    +++ b/drivers/pci/quirks.c
    @@ -2206,6 +2206,33 @@ static int __devinit host_bridge_with_leaf(struct pci_dev *host_bridge)
    return found;
    }

    +#define PCI_HT_CAP_SLAVE_CTRL0 4 /* link control */
    +#define PCI_HT_CAP_SLAVE_CTRL1 8 /* link control to */
    +
    +static int __devinit is_end_of_ht_chain(struct pci_dev *dev)
    +{
    + int pos, ctrl_off;
    + int end = 0;
    + u16 flags, ctrl;
    +
    + pos = pci_find_ht_capability(dev, HT_CAPTYPE_SLAVE);
    +
    + if (!pos)
    + goto out;
    +
    + pci_read_config_word(dev, pos + PCI_CAP_FLAGS, &flags);
    +
    + ctrl_off = ((flags >> 10) & 1) ?
    + PCI_HT_CAP_SLAVE_CTRL0 : PCI_HT_CAP_SLAVE_CTRL1;
    + pci_read_config_word(dev, pos + ctrl_off, &ctrl);
    +
    + if (ctrl & (1 << 6))
    + end = 1;
    +
    +out:
    + return end;
    +}
    +
    static void __devinit nv_ht_enable_msi_mapping(struct pci_dev *dev)
    {
    struct pci_dev *host_bridge;
    @@ -2230,8 +2257,9 @@ static void __devinit nv_ht_enable_msi_mapping(struct pci_dev *dev)
    if (!found)
    return;

    - /* don't enable host_bridge with leaf directly here */
    - if (host_bridge == dev && host_bridge_with_leaf(host_bridge))
    + /* don't enable end_device/host_bridge with leaf directly here */
    + if (host_bridge == dev && is_end_of_ht_chain(host_bridge) &&
    + host_bridge_with_leaf(host_bridge))
    goto out;

    /* root did that ! */

    \
     
     \ /
      Last update: 2009-03-29 03:37    [W:0.022 / U:0.732 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site