Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

PCI: dwc: Fix PORT_LINK_CONTROL update when CDM check enabled

If CDM_CHECK is enabled (by the DT "snps,enable-cdm-check" property), 'val'
is overwritten by PCIE_PL_CHK_REG_CONTROL_STATUS initialization. Commit
ec7b952f453c ("PCI: dwc: Always enable CDM check if "snps,enable-cdm-check"
exists") did not account for further usage of 'val', so we wrote improper
values to PCIE_PORT_LINK_CONTROL when the CDM check is enabled.

Move the PCIE_PORT_LINK_CONTROL update to be completely after the
PCIE_PL_CHK_REG_CONTROL_STATUS register initialization.

[bhelgaas: commit log adapted from Serge's version]
Fixes: ec7b952f453c ("PCI: dwc: Always enable CDM check if "snps,enable-cdm-check" exists")
Link: https://lore.kernel.org/r/20230310123510.675685-2-yoshihiro.shimoda.uh@renesas.com
Signed-off-by: Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Reviewed-by: Serge Semin <fancer.lancer@gmail.com>

authored by

Yoshihiro Shimoda and committed by
Bjorn Helgaas
cdce6709 fe15c26e

+5 -5
+5 -5
drivers/pci/controller/dwc/pcie-designware.c
··· 1001 1001 dw_pcie_writel_dbi(pci, PCIE_LINK_WIDTH_SPEED_CONTROL, val); 1002 1002 } 1003 1003 1004 - val = dw_pcie_readl_dbi(pci, PCIE_PORT_LINK_CONTROL); 1005 - val &= ~PORT_LINK_FAST_LINK_MODE; 1006 - val |= PORT_LINK_DLL_LINK_EN; 1007 - dw_pcie_writel_dbi(pci, PCIE_PORT_LINK_CONTROL, val); 1008 - 1009 1004 if (dw_pcie_cap_is(pci, CDM_CHECK)) { 1010 1005 val = dw_pcie_readl_dbi(pci, PCIE_PL_CHK_REG_CONTROL_STATUS); 1011 1006 val |= PCIE_PL_CHK_REG_CHK_REG_CONTINUOUS | 1012 1007 PCIE_PL_CHK_REG_CHK_REG_START; 1013 1008 dw_pcie_writel_dbi(pci, PCIE_PL_CHK_REG_CONTROL_STATUS, val); 1014 1009 } 1010 + 1011 + val = dw_pcie_readl_dbi(pci, PCIE_PORT_LINK_CONTROL); 1012 + val &= ~PORT_LINK_FAST_LINK_MODE; 1013 + val |= PORT_LINK_DLL_LINK_EN; 1014 + dw_pcie_writel_dbi(pci, PCIE_PORT_LINK_CONTROL, val); 1015 1015 1016 1016 if (!pci->num_lanes) { 1017 1017 dev_dbg(pci->dev, "Using h/w default number of lanes\n");