Merge branch 'pci/ctrl/mediatek-gen3'
- Fix refcount leak in mtk_pcie_init_irq_domains() (Miaoqian Lin) - Print decoded LTSSM state when the link doesn't come up (Jianjun Wang) * pci/ctrl/mediatek-gen3: PCI: mediatek-gen3: Print LTSSM state when PCIe link down PCI: mediatek-gen3: Fix refcount leak in mtk_pcie_init_irq_domains()
This commit is contained in:
commit
f3305ae566
@ -153,6 +153,37 @@ struct mtk_gen3_pcie {
|
||||
DECLARE_BITMAP(msi_irq_in_use, PCIE_MSI_IRQS_NUM);
|
||||
};
|
||||
|
||||
/* LTSSM state in PCIE_LTSSM_STATUS_REG bit[28:24] */
|
||||
static const char *const ltssm_str[] = {
|
||||
"detect.quiet", /* 0x00 */
|
||||
"detect.active", /* 0x01 */
|
||||
"polling.active", /* 0x02 */
|
||||
"polling.compliance", /* 0x03 */
|
||||
"polling.configuration", /* 0x04 */
|
||||
"config.linkwidthstart", /* 0x05 */
|
||||
"config.linkwidthaccept", /* 0x06 */
|
||||
"config.lanenumwait", /* 0x07 */
|
||||
"config.lanenumaccept", /* 0x08 */
|
||||
"config.complete", /* 0x09 */
|
||||
"config.idle", /* 0x0A */
|
||||
"recovery.receiverlock", /* 0x0B */
|
||||
"recovery.equalization", /* 0x0C */
|
||||
"recovery.speed", /* 0x0D */
|
||||
"recovery.receiverconfig", /* 0x0E */
|
||||
"recovery.idle", /* 0x0F */
|
||||
"L0", /* 0x10 */
|
||||
"L0s", /* 0x11 */
|
||||
"L1.entry", /* 0x12 */
|
||||
"L1.idle", /* 0x13 */
|
||||
"L2.idle", /* 0x14 */
|
||||
"L2.transmitwake", /* 0x15 */
|
||||
"disable", /* 0x16 */
|
||||
"loopback.entry", /* 0x17 */
|
||||
"loopback.active", /* 0x18 */
|
||||
"loopback.exit", /* 0x19 */
|
||||
"hotreset", /* 0x1A */
|
||||
};
|
||||
|
||||
/**
|
||||
* mtk_pcie_config_tlp_header() - Configure a configuration TLP header
|
||||
* @bus: PCI bus to query
|
||||
@ -327,8 +358,16 @@ static int mtk_pcie_startup_port(struct mtk_gen3_pcie *pcie)
|
||||
!!(val & PCIE_PORT_LINKUP), 20,
|
||||
PCI_PM_D3COLD_WAIT * USEC_PER_MSEC);
|
||||
if (err) {
|
||||
const char *ltssm_state;
|
||||
int ltssm_index;
|
||||
|
||||
val = readl_relaxed(pcie->base + PCIE_LTSSM_STATUS_REG);
|
||||
dev_err(pcie->dev, "PCIe link down, ltssm reg val: %#x\n", val);
|
||||
ltssm_index = PCIE_LTSSM_STATE(val);
|
||||
ltssm_state = ltssm_index >= ARRAY_SIZE(ltssm_str) ?
|
||||
"Unknown state" : ltssm_str[ltssm_index];
|
||||
dev_err(pcie->dev,
|
||||
"PCIe link down, current LTSSM state: %s (%#x)\n",
|
||||
ltssm_state, val);
|
||||
return err;
|
||||
}
|
||||
|
||||
@ -600,7 +639,8 @@ static int mtk_pcie_init_irq_domains(struct mtk_gen3_pcie *pcie)
|
||||
&intx_domain_ops, pcie);
|
||||
if (!pcie->intx_domain) {
|
||||
dev_err(dev, "failed to create INTx IRQ domain\n");
|
||||
return -ENODEV;
|
||||
ret = -ENODEV;
|
||||
goto out_put_node;
|
||||
}
|
||||
|
||||
/* Setup MSI */
|
||||
@ -623,13 +663,15 @@ static int mtk_pcie_init_irq_domains(struct mtk_gen3_pcie *pcie)
|
||||
goto err_msi_domain;
|
||||
}
|
||||
|
||||
of_node_put(intc_node);
|
||||
return 0;
|
||||
|
||||
err_msi_domain:
|
||||
irq_domain_remove(pcie->msi_bottom_domain);
|
||||
err_msi_bottom_domain:
|
||||
irq_domain_remove(pcie->intx_domain);
|
||||
|
||||
out_put_node:
|
||||
of_node_put(intc_node);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user