| centosplus patch (bug#12277) |
| |
| Ref: https://patchwork.kernel.org/patch/9397341/ |
| |
| |
| |
| @@ -1426,6 +1426,16 @@ static void program_hpp_type1(struct pci |
| dev_warn(&dev->dev, "PCI-X settings not supported\n"); |
| } |
| |
| +static bool pcie_get_upstream_rcb(struct pci_dev *dev) |
| +{ |
| + struct pci_dev *bridge = pci_upstream_bridge(dev); |
| + u16 lnkctl; |
| + |
| + pcie_capability_read_word(bridge, PCI_EXP_LNKCTL, &lnkctl); |
| + |
| + return lnkctl & PCI_EXP_LNKCTL_RCB; |
| +} |
| + |
| static void program_hpp_type2(struct pci_dev *dev, struct hpp_type2 *hpp) |
| { |
| int pos; |
| @@ -1455,9 +1465,21 @@ static void program_hpp_type2(struct pci |
| ~hpp->pci_exp_devctl_and, hpp->pci_exp_devctl_or); |
| |
| /* Initialize Link Control Register */ |
| - if (pcie_cap_has_lnkctl(dev)) |
| + if (pcie_cap_has_lnkctl(dev)) { |
| + bool us_rcb; |
| + u16 clear; |
| + u16 set; |
| + |
| + us_rcb = pcie_get_upstream_rcb(dev); |
| + |
| + clear = ~hpp->pci_exp_lnkctl_and; |
| + set = hpp->pci_exp_lnkctl_or; |
| + if (!us_rcb) |
| + set &= ~PCI_EXP_LNKCTL_RCB; |
| + |
| pcie_capability_clear_and_set_word(dev, PCI_EXP_LNKCTL, |
| - ~hpp->pci_exp_lnkctl_and, hpp->pci_exp_lnkctl_or); |
| + clear, set); |
| + } |
| |
| /* Find Advanced Error Reporting Enhanced Capability */ |
| pos = pci_find_ext_capability(dev, PCI_EXT_CAP_ID_ERR); |