* [PATCH 1/3] PCI: dwc: Handle host_init failures
@ 2017-07-16 6:39 Bjorn Andersson
2017-07-16 6:39 ` [PATCH 2/3] PCI: qcom: Don't unroll init if init fails Bjorn Andersson
` (2 more replies)
0 siblings, 3 replies; 6+ messages in thread
From: Bjorn Andersson @ 2017-07-16 6:39 UTC (permalink / raw)
To: Kishon Vijay Abraham I, Bjorn Helgaas, Jingoo Han, Kukjin Kim,
Krzysztof Kozlowski, Richard Zhu, Lucas Stach, Murali Karicheri,
Minghuan Lian, Mingkai Hu, Roy Zang, Thomas Petazzoni,
Niklas Cassel, Jesper Nilsson, Joao Pinto, Xiaowei Song,
Binghui Wang, Stanimir Varbanov, Pratyush Anand
Cc: moderated list:PCI DRIVER FOR SAMSUNG EXYNOS,
open list:PCI DRIVER FOR TI DRA7XX, open list,
open list:PCIE DRIVER FOR AXIS ARTPEC,
open list:PCIE DRIVER FOR QUALCOMM MSM,
open list:PCI DRIVER FOR TI DRA7XX,
open list:PCI DRIVER FOR FREESCALE LAYERSCAPE,
moderated list:PCI DRIVER FOR SAMSUNG EXYNOS
In several dwc based drivers host_init can fail, so make sure to
propagate and handle this to avoid continuing operation of a driver or
hardware in an invalid state.
Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org>
---
drivers/pci/dwc/pci-dra7xx.c | 4 +++-
drivers/pci/dwc/pci-exynos.c | 4 +++-
drivers/pci/dwc/pci-imx6.c | 4 +++-
drivers/pci/dwc/pci-keystone.c | 4 +++-
drivers/pci/dwc/pci-layerscape.c | 14 ++++++++++----
drivers/pci/dwc/pcie-armada8k.c | 4 +++-
drivers/pci/dwc/pcie-artpec6.c | 4 +++-
drivers/pci/dwc/pcie-designware-host.c | 7 +++++--
drivers/pci/dwc/pcie-designware-plat.c | 4 +++-
drivers/pci/dwc/pcie-designware.h | 2 +-
drivers/pci/dwc/pcie-kirin.c | 4 +++-
drivers/pci/dwc/pcie-qcom.c | 6 ++++--
drivers/pci/dwc/pcie-spear13xx.c | 4 +++-
13 files changed, 47 insertions(+), 18 deletions(-)
diff --git a/drivers/pci/dwc/pci-dra7xx.c b/drivers/pci/dwc/pci-dra7xx.c
index f2fc5f47064e..e8c13bb76169 100644
--- a/drivers/pci/dwc/pci-dra7xx.c
+++ b/drivers/pci/dwc/pci-dra7xx.c
@@ -195,7 +195,7 @@ static void dra7xx_pcie_enable_interrupts(struct dra7xx_pcie *dra7xx)
dra7xx_pcie_enable_msi_interrupts(dra7xx);
}
-static void dra7xx_pcie_host_init(struct pcie_port *pp)
+static int dra7xx_pcie_host_init(struct pcie_port *pp)
{
struct dw_pcie *pci = to_dw_pcie_from_pp(pp);
struct dra7xx_pcie *dra7xx = to_dra7xx_pcie(pci);
@@ -206,6 +206,8 @@ static void dra7xx_pcie_host_init(struct pcie_port *pp)
dw_pcie_wait_for_link(pci);
dw_pcie_msi_init(pp);
dra7xx_pcie_enable_interrupts(dra7xx);
+
+ return 0;
}
static const struct dw_pcie_host_ops dra7xx_pcie_host_ops = {
diff --git a/drivers/pci/dwc/pci-exynos.c b/drivers/pci/dwc/pci-exynos.c
index c78c06552590..f77f872e8b78 100644
--- a/drivers/pci/dwc/pci-exynos.c
+++ b/drivers/pci/dwc/pci-exynos.c
@@ -581,13 +581,15 @@ static int exynos_pcie_link_up(struct dw_pcie *pci)
return 0;
}
-static void exynos_pcie_host_init(struct pcie_port *pp)
+static int exynos_pcie_host_init(struct pcie_port *pp)
{
struct dw_pcie *pci = to_dw_pcie_from_pp(pp);
struct exynos_pcie *ep = to_exynos_pcie(pci);
exynos_pcie_establish_link(ep);
exynos_pcie_enable_interrupts(ep);
+
+ return 0;
}
static const struct dw_pcie_host_ops exynos_pcie_host_ops = {
diff --git a/drivers/pci/dwc/pci-imx6.c b/drivers/pci/dwc/pci-imx6.c
index bf5c3616e344..20aae4469ee4 100644
--- a/drivers/pci/dwc/pci-imx6.c
+++ b/drivers/pci/dwc/pci-imx6.c
@@ -636,7 +636,7 @@ static int imx6_pcie_establish_link(struct imx6_pcie *imx6_pcie)
return ret;
}
-static void imx6_pcie_host_init(struct pcie_port *pp)
+static int imx6_pcie_host_init(struct pcie_port *pp)
{
struct dw_pcie *pci = to_dw_pcie_from_pp(pp);
struct imx6_pcie *imx6_pcie = to_imx6_pcie(pci);
@@ -649,6 +649,8 @@ static void imx6_pcie_host_init(struct pcie_port *pp)
if (IS_ENABLED(CONFIG_PCI_MSI))
dw_pcie_msi_init(pp);
+
+ return 0;
}
static int imx6_pcie_link_up(struct dw_pcie *pci)
diff --git a/drivers/pci/dwc/pci-keystone.c b/drivers/pci/dwc/pci-keystone.c
index 4783cec1f78d..3ad3f8aa27b0 100644
--- a/drivers/pci/dwc/pci-keystone.c
+++ b/drivers/pci/dwc/pci-keystone.c
@@ -261,7 +261,7 @@ static int keystone_pcie_fault(unsigned long addr, unsigned int fsr,
return 0;
}
-static void __init ks_pcie_host_init(struct pcie_port *pp)
+static int __init ks_pcie_host_init(struct pcie_port *pp)
{
struct dw_pcie *pci = to_dw_pcie_from_pp(pp);
struct keystone_pcie *ks_pcie = to_keystone_pcie(pci);
@@ -289,6 +289,8 @@ static void __init ks_pcie_host_init(struct pcie_port *pp)
*/
hook_fault_code(17, keystone_pcie_fault, SIGBUS, 0,
"Asynchronous external abort");
+
+ return 0;
}
static const struct dw_pcie_host_ops keystone_pcie_host_ops = {
diff --git a/drivers/pci/dwc/pci-layerscape.c b/drivers/pci/dwc/pci-layerscape.c
index fd861289ad8b..7581490f007c 100644
--- a/drivers/pci/dwc/pci-layerscape.c
+++ b/drivers/pci/dwc/pci-layerscape.c
@@ -108,31 +108,35 @@ static int ls1021_pcie_link_up(struct dw_pcie *pci)
return 1;
}
-static void ls1021_pcie_host_init(struct pcie_port *pp)
+static int ls1021_pcie_host_init(struct pcie_port *pp)
{
struct dw_pcie *pci = to_dw_pcie_from_pp(pp);
struct ls_pcie *pcie = to_ls_pcie(pci);
struct device *dev = pci->dev;
u32 index[2];
+ int ret;
pcie->scfg = syscon_regmap_lookup_by_phandle(dev->of_node,
"fsl,pcie-scfg");
if (IS_ERR(pcie->scfg)) {
+ ret = PTR_ERR(pcie->scfg);
dev_err(dev, "No syscfg phandle specified\n");
pcie->scfg = NULL;
- return;
+ return ret;
}
if (of_property_read_u32_array(dev->of_node,
"fsl,pcie-scfg", index, 2)) {
pcie->scfg = NULL;
- return;
+ return -EINVAL;
}
pcie->index = index[1];
dw_pcie_setup_rc(pp);
ls_pcie_drop_msg_tlp(pcie);
+
+ return 0;
}
static int ls_pcie_link_up(struct dw_pcie *pci)
@@ -150,7 +154,7 @@ static int ls_pcie_link_up(struct dw_pcie *pci)
return 1;
}
-static void ls_pcie_host_init(struct pcie_port *pp)
+static int ls_pcie_host_init(struct pcie_port *pp)
{
struct dw_pcie *pci = to_dw_pcie_from_pp(pp);
struct ls_pcie *pcie = to_ls_pcie(pci);
@@ -160,6 +164,8 @@ static void ls_pcie_host_init(struct pcie_port *pp)
ls_pcie_clear_multifunction(pcie);
ls_pcie_drop_msg_tlp(pcie);
iowrite32(0, pci->dbi_base + PCIE_DBI_RO_WR_EN);
+
+ return 0;
}
static int ls_pcie_msi_host_init(struct pcie_port *pp,
diff --git a/drivers/pci/dwc/pcie-armada8k.c b/drivers/pci/dwc/pcie-armada8k.c
index ea8f34af6a85..017a727a68db 100644
--- a/drivers/pci/dwc/pcie-armada8k.c
+++ b/drivers/pci/dwc/pcie-armada8k.c
@@ -134,13 +134,15 @@ static void armada8k_pcie_establish_link(struct armada8k_pcie *pcie)
dev_err(pci->dev, "Link not up after reconfiguration\n");
}
-static void armada8k_pcie_host_init(struct pcie_port *pp)
+static int armada8k_pcie_host_init(struct pcie_port *pp)
{
struct dw_pcie *pci = to_dw_pcie_from_pp(pp);
struct armada8k_pcie *pcie = to_armada8k_pcie(pci);
dw_pcie_setup_rc(pp);
armada8k_pcie_establish_link(pcie);
+
+ return 0;
}
static irqreturn_t armada8k_pcie_irq_handler(int irq, void *arg)
diff --git a/drivers/pci/dwc/pcie-artpec6.c b/drivers/pci/dwc/pcie-artpec6.c
index 01c6f7823672..5d81f1d884e3 100644
--- a/drivers/pci/dwc/pcie-artpec6.c
+++ b/drivers/pci/dwc/pcie-artpec6.c
@@ -175,13 +175,15 @@ static void artpec6_pcie_enable_interrupts(struct artpec6_pcie *artpec6_pcie)
dw_pcie_msi_init(pp);
}
-static void artpec6_pcie_host_init(struct pcie_port *pp)
+static int artpec6_pcie_host_init(struct pcie_port *pp)
{
struct dw_pcie *pci = to_dw_pcie_from_pp(pp);
struct artpec6_pcie *artpec6_pcie = to_artpec6_pcie(pci);
artpec6_pcie_establish_link(artpec6_pcie);
artpec6_pcie_enable_interrupts(artpec6_pcie);
+
+ return 0;
}
static const struct dw_pcie_host_ops artpec6_pcie_host_ops = {
diff --git a/drivers/pci/dwc/pcie-designware-host.c b/drivers/pci/dwc/pcie-designware-host.c
index d29c020da082..157621175147 100644
--- a/drivers/pci/dwc/pcie-designware-host.c
+++ b/drivers/pci/dwc/pcie-designware-host.c
@@ -401,8 +401,11 @@ int dw_pcie_host_init(struct pcie_port *pp)
}
}
- if (pp->ops->host_init)
- pp->ops->host_init(pp);
+ if (pp->ops->host_init) {
+ ret = pp->ops->host_init(pp);
+ if (ret)
+ goto error;
+ }
pp->root_bus_nr = pp->busn->start;
diff --git a/drivers/pci/dwc/pcie-designware-plat.c b/drivers/pci/dwc/pcie-designware-plat.c
index 091b4e7ad059..168e2380f493 100644
--- a/drivers/pci/dwc/pcie-designware-plat.c
+++ b/drivers/pci/dwc/pcie-designware-plat.c
@@ -35,7 +35,7 @@ static irqreturn_t dw_plat_pcie_msi_irq_handler(int irq, void *arg)
return dw_handle_msi_irq(pp);
}
-static void dw_plat_pcie_host_init(struct pcie_port *pp)
+static int dw_plat_pcie_host_init(struct pcie_port *pp)
{
struct dw_pcie *pci = to_dw_pcie_from_pp(pp);
@@ -44,6 +44,8 @@ static void dw_plat_pcie_host_init(struct pcie_port *pp)
if (IS_ENABLED(CONFIG_PCI_MSI))
dw_pcie_msi_init(pp);
+
+ return 0;
}
static const struct dw_pcie_host_ops dw_plat_pcie_host_ops = {
diff --git a/drivers/pci/dwc/pcie-designware.h b/drivers/pci/dwc/pcie-designware.h
index b4d2a89f8e58..7366c8167404 100644
--- a/drivers/pci/dwc/pcie-designware.h
+++ b/drivers/pci/dwc/pcie-designware.h
@@ -134,7 +134,7 @@ struct dw_pcie_host_ops {
unsigned int devfn, int where, int size, u32 *val);
int (*wr_other_conf)(struct pcie_port *pp, struct pci_bus *bus,
unsigned int devfn, int where, int size, u32 val);
- void (*host_init)(struct pcie_port *pp);
+ int (*host_init)(struct pcie_port *pp);
void (*msi_set_irq)(struct pcie_port *pp, int irq);
void (*msi_clear_irq)(struct pcie_port *pp, int irq);
phys_addr_t (*get_msi_addr)(struct pcie_port *pp);
diff --git a/drivers/pci/dwc/pcie-kirin.c b/drivers/pci/dwc/pcie-kirin.c
index 33fddb9f6739..0b0eb67f2658 100644
--- a/drivers/pci/dwc/pcie-kirin.c
+++ b/drivers/pci/dwc/pcie-kirin.c
@@ -430,9 +430,11 @@ static int kirin_pcie_establish_link(struct pcie_port *pp)
return 0;
}
-static void kirin_pcie_host_init(struct pcie_port *pp)
+static int kirin_pcie_host_init(struct pcie_port *pp)
{
kirin_pcie_establish_link(pp);
+
+ return 0;
}
static struct dw_pcie_ops kirin_dw_pcie_ops = {
diff --git a/drivers/pci/dwc/pcie-qcom.c b/drivers/pci/dwc/pcie-qcom.c
index 68c5f2ab5bc8..d15657dc3990 100644
--- a/drivers/pci/dwc/pcie-qcom.c
+++ b/drivers/pci/dwc/pcie-qcom.c
@@ -891,7 +891,7 @@ static int qcom_pcie_link_up(struct dw_pcie *pci)
return !!(val & PCI_EXP_LNKSTA_DLLLA);
}
-static void qcom_pcie_host_init(struct pcie_port *pp)
+static int qcom_pcie_host_init(struct pcie_port *pp)
{
struct dw_pcie *pci = to_dw_pcie_from_pp(pp);
struct qcom_pcie *pcie = to_qcom_pcie(pci);
@@ -921,12 +921,14 @@ static void qcom_pcie_host_init(struct pcie_port *pp)
if (ret)
goto err;
- return;
+ return 0;
err:
qcom_ep_reset_assert(pcie);
phy_power_off(pcie->phy);
err_deinit:
pcie->ops->deinit(pcie);
+
+ return ret;
}
static int qcom_pcie_rd_own_conf(struct pcie_port *pp, int where, int size,
diff --git a/drivers/pci/dwc/pcie-spear13xx.c b/drivers/pci/dwc/pcie-spear13xx.c
index 80897291e0fb..52000bc34600 100644
--- a/drivers/pci/dwc/pcie-spear13xx.c
+++ b/drivers/pci/dwc/pcie-spear13xx.c
@@ -177,13 +177,15 @@ static int spear13xx_pcie_link_up(struct dw_pcie *pci)
return 0;
}
-static void spear13xx_pcie_host_init(struct pcie_port *pp)
+static int spear13xx_pcie_host_init(struct pcie_port *pp)
{
struct dw_pcie *pci = to_dw_pcie_from_pp(pp);
struct spear13xx_pcie *spear13xx_pcie = to_spear13xx_pcie(pci);
spear13xx_pcie_establish_link(spear13xx_pcie);
spear13xx_pcie_enable_interrupts(spear13xx_pcie);
+
+ return 0;
}
static const struct dw_pcie_host_ops spear13xx_pcie_host_ops = {
--
2.12.0
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH 2/3] PCI: qcom: Don't unroll init if init fails
2017-07-16 6:39 [PATCH 1/3] PCI: dwc: Handle host_init failures Bjorn Andersson
@ 2017-07-16 6:39 ` Bjorn Andersson
2017-08-03 9:24 ` Stanimir Varbanov
2017-07-17 11:18 ` [PATCH 1/3] PCI: dwc: Handle host_init failures Joao Pinto
2017-08-03 21:19 ` Bjorn Helgaas
2 siblings, 1 reply; 6+ messages in thread
From: Bjorn Andersson @ 2017-07-16 6:39 UTC (permalink / raw)
To: Stanimir Varbanov, Bjorn Helgaas
Cc: open list:PCIE DRIVER FOR QUALCOMM MSM,
open list:PCIE DRIVER FOR QUALCOMM MSM, open list
When the init op fails it will restore the state of the resources, so we
should not disable them one more time when this happens.
Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org>
---
drivers/pci/dwc/pcie-qcom.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/pci/dwc/pcie-qcom.c b/drivers/pci/dwc/pcie-qcom.c
index d15657dc3990..7b703741a3fd 100644
--- a/drivers/pci/dwc/pcie-qcom.c
+++ b/drivers/pci/dwc/pcie-qcom.c
@@ -901,7 +901,7 @@ static int qcom_pcie_host_init(struct pcie_port *pp)
ret = pcie->ops->init(pcie);
if (ret)
- goto err_deinit;
+ return ret;
ret = phy_power_on(pcie->phy);
if (ret)
--
2.12.0
^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH 1/3] PCI: dwc: Handle host_init failures
2017-07-16 6:39 [PATCH 1/3] PCI: dwc: Handle host_init failures Bjorn Andersson
2017-07-16 6:39 ` [PATCH 2/3] PCI: qcom: Don't unroll init if init fails Bjorn Andersson
@ 2017-07-17 11:18 ` Joao Pinto
2017-07-17 19:28 ` Jingoo Han
2017-08-03 21:19 ` Bjorn Helgaas
2 siblings, 1 reply; 6+ messages in thread
From: Joao Pinto @ 2017-07-17 11:18 UTC (permalink / raw)
To: Bjorn Andersson, Kishon Vijay Abraham I, Bjorn Helgaas,
Jingoo Han, Kukjin Kim, Krzysztof Kozlowski, Richard Zhu,
Lucas Stach, Murali Karicheri, Minghuan Lian, Mingkai Hu,
Roy Zang, Thomas Petazzoni, Niklas Cassel, Jesper Nilsson,
Joao Pinto, Xiaowei Song, Binghui Wang, Stanimir Varbanov,
Pratyush Anand
Cc: moderated list:PCI DRIVER FOR SAMSUNG EXYNOS,
open list:PCI DRIVER FOR TI DRA7XX, open list,
open list:PCIE DRIVER FOR AXIS ARTPEC,
open list:PCIE DRIVER FOR QUALCOMM MSM,
open list:PCI DRIVER FOR TI DRA7XX,
open list:PCI DRIVER FOR FREESCALE LAYERSCAPE,
moderated list:PCI DRIVER FOR SAMSUNG EXYNOS
CkhpIEJqb3JuIEFuZGVyc3NvbiwKCsOAcyA3OjM5IEFNIGRlIDcvMTYvMjAxNywgQmpvcm4gQW5k
ZXJzc29uIGVzY3JldmV1Ogo+IEluIHNldmVyYWwgZHdjIGJhc2VkIGRyaXZlcnMgaG9zdF9pbml0
IGNhbiBmYWlsLCBzbyBtYWtlIHN1cmUgdG8KPiBwcm9wYWdhdGUgYW5kIGhhbmRsZSB0aGlzIHRv
IGF2b2lkIGNvbnRpbnVpbmcgb3BlcmF0aW9uIG9mIGEgZHJpdmVyIG9yCj4gaGFyZHdhcmUgaW4g
YW4gaW52YWxpZCBzdGF0ZS4KPiAKPiBTaWduZWQtb2ZmLWJ5OiBCam9ybiBBbmRlcnNzb24gPGJq
b3JuLmFuZGVyc3NvbkBsaW5hcm8ub3JnPgo+IC0tLQo+ICBkcml2ZXJzL3BjaS9kd2MvcGNpLWRy
YTd4eC5jICAgICAgICAgICB8ICA0ICsrKy0KPiAgZHJpdmVycy9wY2kvZHdjL3BjaS1leHlub3Mu
YyAgICAgICAgICAgfCAgNCArKystCj4gIGRyaXZlcnMvcGNpL2R3Yy9wY2ktaW14Ni5jICAgICAg
ICAgICAgIHwgIDQgKysrLQo+ICBkcml2ZXJzL3BjaS9kd2MvcGNpLWtleXN0b25lLmMgICAgICAg
ICB8ICA0ICsrKy0KPiAgZHJpdmVycy9wY2kvZHdjL3BjaS1sYXllcnNjYXBlLmMgICAgICAgfCAx
NCArKysrKysrKysrLS0tLQo+ICBkcml2ZXJzL3BjaS9kd2MvcGNpZS1hcm1hZGE4ay5jICAgICAg
ICB8ICA0ICsrKy0KPiAgZHJpdmVycy9wY2kvZHdjL3BjaWUtYXJ0cGVjNi5jICAgICAgICAgfCAg
NCArKystCj4gIGRyaXZlcnMvcGNpL2R3Yy9wY2llLWRlc2lnbndhcmUtaG9zdC5jIHwgIDcgKysr
KystLQo+ICBkcml2ZXJzL3BjaS9kd2MvcGNpZS1kZXNpZ253YXJlLXBsYXQuYyB8ICA0ICsrKy0K
PiAgZHJpdmVycy9wY2kvZHdjL3BjaWUtZGVzaWdud2FyZS5oICAgICAgfCAgMiArLQo+ICBkcml2
ZXJzL3BjaS9kd2MvcGNpZS1raXJpbi5jICAgICAgICAgICB8ICA0ICsrKy0KPiAgZHJpdmVycy9w
Y2kvZHdjL3BjaWUtcWNvbS5jICAgICAgICAgICAgfCAgNiArKysrLS0KPiAgZHJpdmVycy9wY2kv
ZHdjL3BjaWUtc3BlYXIxM3h4LmMgICAgICAgfCAgNCArKystCj4gIDEzIGZpbGVzIGNoYW5nZWQs
IDQ3IGluc2VydGlvbnMoKyksIDE4IGRlbGV0aW9ucygtKQo+IAo+IGRpZmYgLS1naXQgYS9kcml2
ZXJzL3BjaS9kd2MvcGNpLWRyYTd4eC5jIGIvZHJpdmVycy9wY2kvZHdjL3BjaS1kcmE3eHguYwo+
IGluZGV4IGYyZmM1ZjQ3MDY0ZS4uZThjMTNiYjc2MTY5IDEwMDY0NAo+IC0tLSBhL2RyaXZlcnMv
cGNpL2R3Yy9wY2ktZHJhN3h4LmMKPiArKysgYi9kcml2ZXJzL3BjaS9kd2MvcGNpLWRyYTd4eC5j
Cj4gQEAgLTE5NSw3ICsxOTUsNyBAQCBzdGF0aWMgdm9pZCBkcmE3eHhfcGNpZV9lbmFibGVfaW50
ZXJydXB0cyhzdHJ1Y3QgZHJhN3h4X3BjaWUgKmRyYTd4eCkKPiAgCWRyYTd4eF9wY2llX2VuYWJs
ZV9tc2lfaW50ZXJydXB0cyhkcmE3eHgpOwo+ICB9Cj4gIAo+IC1zdGF0aWMgdm9pZCBkcmE3eHhf
cGNpZV9ob3N0X2luaXQoc3RydWN0IHBjaWVfcG9ydCAqcHApCj4gK3N0YXRpYyBpbnQgZHJhN3h4
X3BjaWVfaG9zdF9pbml0KHN0cnVjdCBwY2llX3BvcnQgKnBwKQo+ICB7Cj4gIAlzdHJ1Y3QgZHdf
cGNpZSAqcGNpID0gdG9fZHdfcGNpZV9mcm9tX3BwKHBwKTsKPiAgCXN0cnVjdCBkcmE3eHhfcGNp
ZSAqZHJhN3h4ID0gdG9fZHJhN3h4X3BjaWUocGNpKTsKPiBAQCAtMjA2LDYgKzIwNiw4IEBAIHN0
YXRpYyB2b2lkIGRyYTd4eF9wY2llX2hvc3RfaW5pdChzdHJ1Y3QgcGNpZV9wb3J0ICpwcCkKPiAg
CWR3X3BjaWVfd2FpdF9mb3JfbGluayhwY2kpOwo+ICAJZHdfcGNpZV9tc2lfaW5pdChwcCk7Cj4g
IAlkcmE3eHhfcGNpZV9lbmFibGVfaW50ZXJydXB0cyhkcmE3eHgpOwo+ICsKPiArCXJldHVybiAw
Owo+ICB9Cj4gIAo+ICBzdGF0aWMgY29uc3Qgc3RydWN0IGR3X3BjaWVfaG9zdF9vcHMgZHJhN3h4
X3BjaWVfaG9zdF9vcHMgPSB7Cj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2R3Yy9wY2ktZXh5
bm9zLmMgYi9kcml2ZXJzL3BjaS9kd2MvcGNpLWV4eW5vcy5jCj4gaW5kZXggYzc4YzA2NTUyNTkw
Li5mNzdmODcyZThiNzggMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9wY2kvZHdjL3BjaS1leHlub3Mu
Ywo+ICsrKyBiL2RyaXZlcnMvcGNpL2R3Yy9wY2ktZXh5bm9zLmMKPiBAQCAtNTgxLDEzICs1ODEs
MTUgQEAgc3RhdGljIGludCBleHlub3NfcGNpZV9saW5rX3VwKHN0cnVjdCBkd19wY2llICpwY2kp
Cj4gIAlyZXR1cm4gMDsKPiAgfQo+ICAKPiAtc3RhdGljIHZvaWQgZXh5bm9zX3BjaWVfaG9zdF9p
bml0KHN0cnVjdCBwY2llX3BvcnQgKnBwKQo+ICtzdGF0aWMgaW50IGV4eW5vc19wY2llX2hvc3Rf
aW5pdChzdHJ1Y3QgcGNpZV9wb3J0ICpwcCkKPiAgewo+ICAJc3RydWN0IGR3X3BjaWUgKnBjaSA9
IHRvX2R3X3BjaWVfZnJvbV9wcChwcCk7Cj4gIAlzdHJ1Y3QgZXh5bm9zX3BjaWUgKmVwID0gdG9f
ZXh5bm9zX3BjaWUocGNpKTsKPiAgCj4gIAlleHlub3NfcGNpZV9lc3RhYmxpc2hfbGluayhlcCk7
Cj4gIAlleHlub3NfcGNpZV9lbmFibGVfaW50ZXJydXB0cyhlcCk7Cj4gKwo+ICsJcmV0dXJuIDA7
Cj4gIH0KPiAgCj4gIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZHdfcGNpZV9ob3N0X29wcyBleHlub3Nf
cGNpZV9ob3N0X29wcyA9IHsKPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvZHdjL3BjaS1pbXg2
LmMgYi9kcml2ZXJzL3BjaS9kd2MvcGNpLWlteDYuYwo+IGluZGV4IGJmNWMzNjE2ZTM0NC4uMjBh
YWU0NDY5ZWU0IDEwMDY0NAo+IC0tLSBhL2RyaXZlcnMvcGNpL2R3Yy9wY2ktaW14Ni5jCj4gKysr
IGIvZHJpdmVycy9wY2kvZHdjL3BjaS1pbXg2LmMKPiBAQCAtNjM2LDcgKzYzNiw3IEBAIHN0YXRp
YyBpbnQgaW14Nl9wY2llX2VzdGFibGlzaF9saW5rKHN0cnVjdCBpbXg2X3BjaWUgKmlteDZfcGNp
ZSkKPiAgCXJldHVybiByZXQ7Cj4gIH0KPiAgCj4gLXN0YXRpYyB2b2lkIGlteDZfcGNpZV9ob3N0
X2luaXQoc3RydWN0IHBjaWVfcG9ydCAqcHApCj4gK3N0YXRpYyBpbnQgaW14Nl9wY2llX2hvc3Rf
aW5pdChzdHJ1Y3QgcGNpZV9wb3J0ICpwcCkKPiAgewo+ICAJc3RydWN0IGR3X3BjaWUgKnBjaSA9
IHRvX2R3X3BjaWVfZnJvbV9wcChwcCk7Cj4gIAlzdHJ1Y3QgaW14Nl9wY2llICppbXg2X3BjaWUg
PSB0b19pbXg2X3BjaWUocGNpKTsKPiBAQCAtNjQ5LDYgKzY0OSw4IEBAIHN0YXRpYyB2b2lkIGlt
eDZfcGNpZV9ob3N0X2luaXQoc3RydWN0IHBjaWVfcG9ydCAqcHApCj4gIAo+ICAJaWYgKElTX0VO
QUJMRUQoQ09ORklHX1BDSV9NU0kpKQo+ICAJCWR3X3BjaWVfbXNpX2luaXQocHApOwo+ICsKPiAr
CXJldHVybiAwOwo+ICB9Cj4gIAo+ICBzdGF0aWMgaW50IGlteDZfcGNpZV9saW5rX3VwKHN0cnVj
dCBkd19wY2llICpwY2kpCj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2R3Yy9wY2kta2V5c3Rv
bmUuYyBiL2RyaXZlcnMvcGNpL2R3Yy9wY2kta2V5c3RvbmUuYwo+IGluZGV4IDQ3ODNjZWMxZjc4
ZC4uM2FkM2Y4YWEyN2IwIDEwMDY0NAo+IC0tLSBhL2RyaXZlcnMvcGNpL2R3Yy9wY2kta2V5c3Rv
bmUuYwo+ICsrKyBiL2RyaXZlcnMvcGNpL2R3Yy9wY2kta2V5c3RvbmUuYwo+IEBAIC0yNjEsNyAr
MjYxLDcgQEAgc3RhdGljIGludCBrZXlzdG9uZV9wY2llX2ZhdWx0KHVuc2lnbmVkIGxvbmcgYWRk
ciwgdW5zaWduZWQgaW50IGZzciwKPiAgCXJldHVybiAwOwo+ICB9Cj4gIAo+IC1zdGF0aWMgdm9p
ZCBfX2luaXQga3NfcGNpZV9ob3N0X2luaXQoc3RydWN0IHBjaWVfcG9ydCAqcHApCj4gK3N0YXRp
YyBpbnQgX19pbml0IGtzX3BjaWVfaG9zdF9pbml0KHN0cnVjdCBwY2llX3BvcnQgKnBwKQo+ICB7
Cj4gIAlzdHJ1Y3QgZHdfcGNpZSAqcGNpID0gdG9fZHdfcGNpZV9mcm9tX3BwKHBwKTsKPiAgCXN0
cnVjdCBrZXlzdG9uZV9wY2llICprc19wY2llID0gdG9fa2V5c3RvbmVfcGNpZShwY2kpOwo+IEBA
IC0yODksNiArMjg5LDggQEAgc3RhdGljIHZvaWQgX19pbml0IGtzX3BjaWVfaG9zdF9pbml0KHN0
cnVjdCBwY2llX3BvcnQgKnBwKQo+ICAJICovCj4gIAlob29rX2ZhdWx0X2NvZGUoMTcsIGtleXN0
b25lX3BjaWVfZmF1bHQsIFNJR0JVUywgMCwKPiAgCQkJIkFzeW5jaHJvbm91cyBleHRlcm5hbCBh
Ym9ydCIpOwo+ICsKPiArCXJldHVybiAwOwo+ICB9Cj4gIAo+ICBzdGF0aWMgY29uc3Qgc3RydWN0
IGR3X3BjaWVfaG9zdF9vcHMga2V5c3RvbmVfcGNpZV9ob3N0X29wcyA9IHsKPiBkaWZmIC0tZ2l0
IGEvZHJpdmVycy9wY2kvZHdjL3BjaS1sYXllcnNjYXBlLmMgYi9kcml2ZXJzL3BjaS9kd2MvcGNp
LWxheWVyc2NhcGUuYwo+IGluZGV4IGZkODYxMjg5YWQ4Yi4uNzU4MTQ5MGYwMDdjIDEwMDY0NAo+
IC0tLSBhL2RyaXZlcnMvcGNpL2R3Yy9wY2ktbGF5ZXJzY2FwZS5jCj4gKysrIGIvZHJpdmVycy9w
Y2kvZHdjL3BjaS1sYXllcnNjYXBlLmMKPiBAQCAtMTA4LDMxICsxMDgsMzUgQEAgc3RhdGljIGlu
dCBsczEwMjFfcGNpZV9saW5rX3VwKHN0cnVjdCBkd19wY2llICpwY2kpCj4gIAlyZXR1cm4gMTsK
PiAgfQo+ICAKPiAtc3RhdGljIHZvaWQgbHMxMDIxX3BjaWVfaG9zdF9pbml0KHN0cnVjdCBwY2ll
X3BvcnQgKnBwKQo+ICtzdGF0aWMgaW50IGxzMTAyMV9wY2llX2hvc3RfaW5pdChzdHJ1Y3QgcGNp
ZV9wb3J0ICpwcCkKPiAgewo+ICAJc3RydWN0IGR3X3BjaWUgKnBjaSA9IHRvX2R3X3BjaWVfZnJv
bV9wcChwcCk7Cj4gIAlzdHJ1Y3QgbHNfcGNpZSAqcGNpZSA9IHRvX2xzX3BjaWUocGNpKTsKPiAg
CXN0cnVjdCBkZXZpY2UgKmRldiA9IHBjaS0+ZGV2Owo+ICAJdTMyIGluZGV4WzJdOwo+ICsJaW50
IHJldDsKPiAgCj4gIAlwY2llLT5zY2ZnID0gc3lzY29uX3JlZ21hcF9sb29rdXBfYnlfcGhhbmRs
ZShkZXYtPm9mX25vZGUsCj4gIAkJCQkJCSAgICAgImZzbCxwY2llLXNjZmciKTsKPiAgCWlmIChJ
U19FUlIocGNpZS0+c2NmZykpIHsKPiArCQlyZXQgPSBQVFJfRVJSKHBjaWUtPnNjZmcpOwo+ICAJ
CWRldl9lcnIoZGV2LCAiTm8gc3lzY2ZnIHBoYW5kbGUgc3BlY2lmaWVkXG4iKTsKPiAgCQlwY2ll
LT5zY2ZnID0gTlVMTDsKPiAtCQlyZXR1cm47Cj4gKwkJcmV0dXJuIHJldDsKPiAgCX0KPiAgCj4g
IAlpZiAob2ZfcHJvcGVydHlfcmVhZF91MzJfYXJyYXkoZGV2LT5vZl9ub2RlLAo+ICAJCQkJICAg
ICAgICJmc2wscGNpZS1zY2ZnIiwgaW5kZXgsIDIpKSB7Cj4gIAkJcGNpZS0+c2NmZyA9IE5VTEw7
Cj4gLQkJcmV0dXJuOwo+ICsJCXJldHVybiAtRUlOVkFMOwo+ICAJfQo+ICAJcGNpZS0+aW5kZXgg
PSBpbmRleFsxXTsKPiAgCj4gIAlkd19wY2llX3NldHVwX3JjKHBwKTsKPiAgCj4gIAlsc19wY2ll
X2Ryb3BfbXNnX3RscChwY2llKTsKPiArCj4gKwlyZXR1cm4gMDsKPiAgfQo+ICAKPiAgc3RhdGlj
IGludCBsc19wY2llX2xpbmtfdXAoc3RydWN0IGR3X3BjaWUgKnBjaSkKPiBAQCAtMTUwLDcgKzE1
NCw3IEBAIHN0YXRpYyBpbnQgbHNfcGNpZV9saW5rX3VwKHN0cnVjdCBkd19wY2llICpwY2kpCj4g
IAlyZXR1cm4gMTsKPiAgfQo+ICAKPiAtc3RhdGljIHZvaWQgbHNfcGNpZV9ob3N0X2luaXQoc3Ry
dWN0IHBjaWVfcG9ydCAqcHApCj4gK3N0YXRpYyBpbnQgbHNfcGNpZV9ob3N0X2luaXQoc3RydWN0
IHBjaWVfcG9ydCAqcHApCj4gIHsKPiAgCXN0cnVjdCBkd19wY2llICpwY2kgPSB0b19kd19wY2ll
X2Zyb21fcHAocHApOwo+ICAJc3RydWN0IGxzX3BjaWUgKnBjaWUgPSB0b19sc19wY2llKHBjaSk7
Cj4gQEAgLTE2MCw2ICsxNjQsOCBAQCBzdGF0aWMgdm9pZCBsc19wY2llX2hvc3RfaW5pdChzdHJ1
Y3QgcGNpZV9wb3J0ICpwcCkKPiAgCWxzX3BjaWVfY2xlYXJfbXVsdGlmdW5jdGlvbihwY2llKTsK
PiAgCWxzX3BjaWVfZHJvcF9tc2dfdGxwKHBjaWUpOwo+ICAJaW93cml0ZTMyKDAsIHBjaS0+ZGJp
X2Jhc2UgKyBQQ0lFX0RCSV9ST19XUl9FTik7Cj4gKwo+ICsJcmV0dXJuIDA7Cj4gIH0KPiAgCj4g
IHN0YXRpYyBpbnQgbHNfcGNpZV9tc2lfaG9zdF9pbml0KHN0cnVjdCBwY2llX3BvcnQgKnBwLAo+
IGRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9kd2MvcGNpZS1hcm1hZGE4ay5jIGIvZHJpdmVycy9w
Y2kvZHdjL3BjaWUtYXJtYWRhOGsuYwo+IGluZGV4IGVhOGYzNGFmNmE4NS4uMDE3YTcyN2E2OGRi
IDEwMDY0NAo+IC0tLSBhL2RyaXZlcnMvcGNpL2R3Yy9wY2llLWFybWFkYThrLmMKPiArKysgYi9k
cml2ZXJzL3BjaS9kd2MvcGNpZS1hcm1hZGE4ay5jCj4gQEAgLTEzNCwxMyArMTM0LDE1IEBAIHN0
YXRpYyB2b2lkIGFybWFkYThrX3BjaWVfZXN0YWJsaXNoX2xpbmsoc3RydWN0IGFybWFkYThrX3Bj
aWUgKnBjaWUpCj4gIAkJZGV2X2VycihwY2ktPmRldiwgIkxpbmsgbm90IHVwIGFmdGVyIHJlY29u
ZmlndXJhdGlvblxuIik7Cj4gIH0KPiAgCj4gLXN0YXRpYyB2b2lkIGFybWFkYThrX3BjaWVfaG9z
dF9pbml0KHN0cnVjdCBwY2llX3BvcnQgKnBwKQo+ICtzdGF0aWMgaW50IGFybWFkYThrX3BjaWVf
aG9zdF9pbml0KHN0cnVjdCBwY2llX3BvcnQgKnBwKQo+ICB7Cj4gIAlzdHJ1Y3QgZHdfcGNpZSAq
cGNpID0gdG9fZHdfcGNpZV9mcm9tX3BwKHBwKTsKPiAgCXN0cnVjdCBhcm1hZGE4a19wY2llICpw
Y2llID0gdG9fYXJtYWRhOGtfcGNpZShwY2kpOwo+ICAKPiAgCWR3X3BjaWVfc2V0dXBfcmMocHAp
Owo+ICAJYXJtYWRhOGtfcGNpZV9lc3RhYmxpc2hfbGluayhwY2llKTsKPiArCj4gKwlyZXR1cm4g
MDsKPiAgfQo+ICAKPiAgc3RhdGljIGlycXJldHVybl90IGFybWFkYThrX3BjaWVfaXJxX2hhbmRs
ZXIoaW50IGlycSwgdm9pZCAqYXJnKQo+IGRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9kd2MvcGNp
ZS1hcnRwZWM2LmMgYi9kcml2ZXJzL3BjaS9kd2MvcGNpZS1hcnRwZWM2LmMKPiBpbmRleCAwMWM2
Zjc4MjM2NzIuLjVkODFmMWQ4ODRlMyAxMDA2NDQKPiAtLS0gYS9kcml2ZXJzL3BjaS9kd2MvcGNp
ZS1hcnRwZWM2LmMKPiArKysgYi9kcml2ZXJzL3BjaS9kd2MvcGNpZS1hcnRwZWM2LmMKPiBAQCAt
MTc1LDEzICsxNzUsMTUgQEAgc3RhdGljIHZvaWQgYXJ0cGVjNl9wY2llX2VuYWJsZV9pbnRlcnJ1
cHRzKHN0cnVjdCBhcnRwZWM2X3BjaWUgKmFydHBlYzZfcGNpZSkKPiAgCQlkd19wY2llX21zaV9p
bml0KHBwKTsKPiAgfQo+ICAKPiAtc3RhdGljIHZvaWQgYXJ0cGVjNl9wY2llX2hvc3RfaW5pdChz
dHJ1Y3QgcGNpZV9wb3J0ICpwcCkKPiArc3RhdGljIGludCBhcnRwZWM2X3BjaWVfaG9zdF9pbml0
KHN0cnVjdCBwY2llX3BvcnQgKnBwKQo+ICB7Cj4gIAlzdHJ1Y3QgZHdfcGNpZSAqcGNpID0gdG9f
ZHdfcGNpZV9mcm9tX3BwKHBwKTsKPiAgCXN0cnVjdCBhcnRwZWM2X3BjaWUgKmFydHBlYzZfcGNp
ZSA9IHRvX2FydHBlYzZfcGNpZShwY2kpOwo+ICAKPiAgCWFydHBlYzZfcGNpZV9lc3RhYmxpc2hf
bGluayhhcnRwZWM2X3BjaWUpOwo+ICAJYXJ0cGVjNl9wY2llX2VuYWJsZV9pbnRlcnJ1cHRzKGFy
dHBlYzZfcGNpZSk7Cj4gKwo+ICsJcmV0dXJuIDA7Cj4gIH0KPiAgCj4gIHN0YXRpYyBjb25zdCBz
dHJ1Y3QgZHdfcGNpZV9ob3N0X29wcyBhcnRwZWM2X3BjaWVfaG9zdF9vcHMgPSB7Cj4gZGlmZiAt
LWdpdCBhL2RyaXZlcnMvcGNpL2R3Yy9wY2llLWRlc2lnbndhcmUtaG9zdC5jIGIvZHJpdmVycy9w
Y2kvZHdjL3BjaWUtZGVzaWdud2FyZS1ob3N0LmMKPiBpbmRleCBkMjljMDIwZGEwODIuLjE1NzYy
MTE3NTE0NyAxMDA2NDQKPiAtLS0gYS9kcml2ZXJzL3BjaS9kd2MvcGNpZS1kZXNpZ253YXJlLWhv
c3QuYwo+ICsrKyBiL2RyaXZlcnMvcGNpL2R3Yy9wY2llLWRlc2lnbndhcmUtaG9zdC5jCj4gQEAg
LTQwMSw4ICs0MDEsMTEgQEAgaW50IGR3X3BjaWVfaG9zdF9pbml0KHN0cnVjdCBwY2llX3BvcnQg
KnBwKQo+ICAJCX0KPiAgCX0KPiAgCj4gLQlpZiAocHAtPm9wcy0+aG9zdF9pbml0KQo+IC0JCXBw
LT5vcHMtPmhvc3RfaW5pdChwcCk7Cj4gKwlpZiAocHAtPm9wcy0+aG9zdF9pbml0KSB7Cj4gKwkJ
cmV0ID0gcHAtPm9wcy0+aG9zdF9pbml0KHBwKTsKPiArCQlpZiAocmV0KQo+ICsJCQlnb3RvIGVy
cm9yOwo+ICsJfQo+ICAKPiAgCXBwLT5yb290X2J1c19uciA9IHBwLT5idXNuLT5zdGFydDsKPiAg
Cj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2R3Yy9wY2llLWRlc2lnbndhcmUtcGxhdC5jIGIv
ZHJpdmVycy9wY2kvZHdjL3BjaWUtZGVzaWdud2FyZS1wbGF0LmMKPiBpbmRleCAwOTFiNGU3YWQw
NTkuLjE2OGUyMzgwZjQ5MyAxMDA2NDQKPiAtLS0gYS9kcml2ZXJzL3BjaS9kd2MvcGNpZS1kZXNp
Z253YXJlLXBsYXQuYwo+ICsrKyBiL2RyaXZlcnMvcGNpL2R3Yy9wY2llLWRlc2lnbndhcmUtcGxh
dC5jCj4gQEAgLTM1LDcgKzM1LDcgQEAgc3RhdGljIGlycXJldHVybl90IGR3X3BsYXRfcGNpZV9t
c2lfaXJxX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqYXJnKQo+ICAJcmV0dXJuIGR3X2hhbmRsZV9t
c2lfaXJxKHBwKTsKPiAgfQo+ICAKPiAtc3RhdGljIHZvaWQgZHdfcGxhdF9wY2llX2hvc3RfaW5p
dChzdHJ1Y3QgcGNpZV9wb3J0ICpwcCkKPiArc3RhdGljIGludCBkd19wbGF0X3BjaWVfaG9zdF9p
bml0KHN0cnVjdCBwY2llX3BvcnQgKnBwKQo+ICB7Cj4gIAlzdHJ1Y3QgZHdfcGNpZSAqcGNpID0g
dG9fZHdfcGNpZV9mcm9tX3BwKHBwKTsKPiAgCj4gQEAgLTQ0LDYgKzQ0LDggQEAgc3RhdGljIHZv
aWQgZHdfcGxhdF9wY2llX2hvc3RfaW5pdChzdHJ1Y3QgcGNpZV9wb3J0ICpwcCkKPiAgCj4gIAlp
ZiAoSVNfRU5BQkxFRChDT05GSUdfUENJX01TSSkpCj4gIAkJZHdfcGNpZV9tc2lfaW5pdChwcCk7
Cj4gKwo+ICsJcmV0dXJuIDA7Cj4gIH0KPiAgCj4gIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZHdfcGNp
ZV9ob3N0X29wcyBkd19wbGF0X3BjaWVfaG9zdF9vcHMgPSB7Cj4gZGlmZiAtLWdpdCBhL2RyaXZl
cnMvcGNpL2R3Yy9wY2llLWRlc2lnbndhcmUuaCBiL2RyaXZlcnMvcGNpL2R3Yy9wY2llLWRlc2ln
bndhcmUuaAo+IGluZGV4IGI0ZDJhODlmOGU1OC4uNzM2NmM4MTY3NDA0IDEwMDY0NAo+IC0tLSBh
L2RyaXZlcnMvcGNpL2R3Yy9wY2llLWRlc2lnbndhcmUuaAo+ICsrKyBiL2RyaXZlcnMvcGNpL2R3
Yy9wY2llLWRlc2lnbndhcmUuaAo+IEBAIC0xMzQsNyArMTM0LDcgQEAgc3RydWN0IGR3X3BjaWVf
aG9zdF9vcHMgewo+ICAJCQkgICAgIHVuc2lnbmVkIGludCBkZXZmbiwgaW50IHdoZXJlLCBpbnQg
c2l6ZSwgdTMyICp2YWwpOwo+ICAJaW50ICgqd3Jfb3RoZXJfY29uZikoc3RydWN0IHBjaWVfcG9y
dCAqcHAsIHN0cnVjdCBwY2lfYnVzICpidXMsCj4gIAkJCSAgICAgdW5zaWduZWQgaW50IGRldmZu
LCBpbnQgd2hlcmUsIGludCBzaXplLCB1MzIgdmFsKTsKPiAtCXZvaWQgKCpob3N0X2luaXQpKHN0
cnVjdCBwY2llX3BvcnQgKnBwKTsKPiArCWludCAoKmhvc3RfaW5pdCkoc3RydWN0IHBjaWVfcG9y
dCAqcHApOwo+ICAJdm9pZCAoKm1zaV9zZXRfaXJxKShzdHJ1Y3QgcGNpZV9wb3J0ICpwcCwgaW50
IGlycSk7Cj4gIAl2b2lkICgqbXNpX2NsZWFyX2lycSkoc3RydWN0IHBjaWVfcG9ydCAqcHAsIGlu
dCBpcnEpOwo+ICAJcGh5c19hZGRyX3QgKCpnZXRfbXNpX2FkZHIpKHN0cnVjdCBwY2llX3BvcnQg
KnBwKTsKPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvZHdjL3BjaWUta2lyaW4uYyBiL2RyaXZl
cnMvcGNpL2R3Yy9wY2llLWtpcmluLmMKPiBpbmRleCAzM2ZkZGI5ZjY3MzkuLjBiMGViNjdmMjY1
OCAxMDA2NDQKPiAtLS0gYS9kcml2ZXJzL3BjaS9kd2MvcGNpZS1raXJpbi5jCj4gKysrIGIvZHJp
dmVycy9wY2kvZHdjL3BjaWUta2lyaW4uYwo+IEBAIC00MzAsOSArNDMwLDExIEBAIHN0YXRpYyBp
bnQga2lyaW5fcGNpZV9lc3RhYmxpc2hfbGluayhzdHJ1Y3QgcGNpZV9wb3J0ICpwcCkKPiAgCXJl
dHVybiAwOwo+ICB9Cj4gIAo+IC1zdGF0aWMgdm9pZCBraXJpbl9wY2llX2hvc3RfaW5pdChzdHJ1
Y3QgcGNpZV9wb3J0ICpwcCkKPiArc3RhdGljIGludCBraXJpbl9wY2llX2hvc3RfaW5pdChzdHJ1
Y3QgcGNpZV9wb3J0ICpwcCkKPiAgewo+ICAJa2lyaW5fcGNpZV9lc3RhYmxpc2hfbGluayhwcCk7
Cj4gKwo+ICsJcmV0dXJuIDA7Cj4gIH0KPiAgCj4gIHN0YXRpYyBzdHJ1Y3QgZHdfcGNpZV9vcHMg
a2lyaW5fZHdfcGNpZV9vcHMgPSB7Cj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2R3Yy9wY2ll
LXFjb20uYyBiL2RyaXZlcnMvcGNpL2R3Yy9wY2llLXFjb20uYwo+IGluZGV4IDY4YzVmMmFiNWJj
OC4uZDE1NjU3ZGMzOTkwIDEwMDY0NAo+IC0tLSBhL2RyaXZlcnMvcGNpL2R3Yy9wY2llLXFjb20u
Ywo+ICsrKyBiL2RyaXZlcnMvcGNpL2R3Yy9wY2llLXFjb20uYwo+IEBAIC04OTEsNyArODkxLDcg
QEAgc3RhdGljIGludCBxY29tX3BjaWVfbGlua191cChzdHJ1Y3QgZHdfcGNpZSAqcGNpKQo+ICAJ
cmV0dXJuICEhKHZhbCAmIFBDSV9FWFBfTE5LU1RBX0RMTExBKTsKPiAgfQo+ICAKPiAtc3RhdGlj
IHZvaWQgcWNvbV9wY2llX2hvc3RfaW5pdChzdHJ1Y3QgcGNpZV9wb3J0ICpwcCkKPiArc3RhdGlj
IGludCBxY29tX3BjaWVfaG9zdF9pbml0KHN0cnVjdCBwY2llX3BvcnQgKnBwKQo+ICB7Cj4gIAlz
dHJ1Y3QgZHdfcGNpZSAqcGNpID0gdG9fZHdfcGNpZV9mcm9tX3BwKHBwKTsKPiAgCXN0cnVjdCBx
Y29tX3BjaWUgKnBjaWUgPSB0b19xY29tX3BjaWUocGNpKTsKPiBAQCAtOTIxLDEyICs5MjEsMTQg
QEAgc3RhdGljIHZvaWQgcWNvbV9wY2llX2hvc3RfaW5pdChzdHJ1Y3QgcGNpZV9wb3J0ICpwcCkK
PiAgCWlmIChyZXQpCj4gIAkJZ290byBlcnI7Cj4gIAo+IC0JcmV0dXJuOwo+ICsJcmV0dXJuIDA7
Cj4gIGVycjoKPiAgCXFjb21fZXBfcmVzZXRfYXNzZXJ0KHBjaWUpOwo+ICAJcGh5X3Bvd2VyX29m
ZihwY2llLT5waHkpOwo+ICBlcnJfZGVpbml0Ogo+ICAJcGNpZS0+b3BzLT5kZWluaXQocGNpZSk7
Cj4gKwo+ICsJcmV0dXJuIHJldDsKPiAgfQo+ICAKPiAgc3RhdGljIGludCBxY29tX3BjaWVfcmRf
b3duX2NvbmYoc3RydWN0IHBjaWVfcG9ydCAqcHAsIGludCB3aGVyZSwgaW50IHNpemUsCj4gZGlm
ZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2R3Yy9wY2llLXNwZWFyMTN4eC5jIGIvZHJpdmVycy9wY2kv
ZHdjL3BjaWUtc3BlYXIxM3h4LmMKPiBpbmRleCA4MDg5NzI5MWUwZmIuLjUyMDAwYmMzNDYwMCAx
MDA2NDQKPiAtLS0gYS9kcml2ZXJzL3BjaS9kd2MvcGNpZS1zcGVhcjEzeHguYwo+ICsrKyBiL2Ry
aXZlcnMvcGNpL2R3Yy9wY2llLXNwZWFyMTN4eC5jCj4gQEAgLTE3NywxMyArMTc3LDE1IEBAIHN0
YXRpYyBpbnQgc3BlYXIxM3h4X3BjaWVfbGlua191cChzdHJ1Y3QgZHdfcGNpZSAqcGNpKQo+ICAJ
cmV0dXJuIDA7Cj4gIH0KPiAgCj4gLXN0YXRpYyB2b2lkIHNwZWFyMTN4eF9wY2llX2hvc3RfaW5p
dChzdHJ1Y3QgcGNpZV9wb3J0ICpwcCkKPiArc3RhdGljIGludCBzcGVhcjEzeHhfcGNpZV9ob3N0
X2luaXQoc3RydWN0IHBjaWVfcG9ydCAqcHApCj4gIHsKPiAgCXN0cnVjdCBkd19wY2llICpwY2kg
PSB0b19kd19wY2llX2Zyb21fcHAocHApOwo+ICAJc3RydWN0IHNwZWFyMTN4eF9wY2llICpzcGVh
cjEzeHhfcGNpZSA9IHRvX3NwZWFyMTN4eF9wY2llKHBjaSk7Cj4gIAo+ICAJc3BlYXIxM3h4X3Bj
aWVfZXN0YWJsaXNoX2xpbmsoc3BlYXIxM3h4X3BjaWUpOwo+ICAJc3BlYXIxM3h4X3BjaWVfZW5h
YmxlX2ludGVycnVwdHMoc3BlYXIxM3h4X3BjaWUpOwo+ICsKPiArCXJldHVybiAwOwo+ICB9Cj4g
IAo+ICBzdGF0aWMgY29uc3Qgc3RydWN0IGR3X3BjaWVfaG9zdF9vcHMgc3BlYXIxM3h4X3BjaWVf
aG9zdF9vcHMgPSB7Cj4gCgpBIHN0ZXAgaW4gdGhlIHJpZ2h0IGRpcmVjdGlvbiA6KS4gSW4gdGhl
IGZ1dHVyZSB3ZSBzaG91bGQgYWRkIGhvc3QgaW5pdAp2YWxpZGF0aW9uIGluIHRoZSBzcGVjaWZp
YyBTb0MgZHJpdmVycywgbGlrZSBMYXllcnNjYXBlIGFuZCBRY29tIGhhdmUsIHRvIGFzc3VyZQp0
aGF0IGFueSBwcm9ibGVtIGlzIHRyZWF0ZWQgcHJvcGVybHkgaW4gdGhlIGNvcmUgZHJpdmVyLgoK
QWNrZWQtYnk6IEpvYW8gUGludG8gPGpwaW50b0BzeW5vcHN5cy5jb20+CgoKX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KbGludXgtYXJtLWtlcm5lbCBtYWls
aW5nIGxpc3QKbGludXgtYXJtLWtlcm5lbEBsaXN0cy5pbmZyYWRlYWQub3JnCmh0dHA6Ly9saXN0
cy5pbmZyYWRlYWQub3JnL21haWxtYW4vbGlzdGluZm8vbGludXgtYXJtLWtlcm5lbAo=
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH 1/3] PCI: dwc: Handle host_init failures
2017-07-17 11:18 ` [PATCH 1/3] PCI: dwc: Handle host_init failures Joao Pinto
@ 2017-07-17 19:28 ` Jingoo Han
0 siblings, 0 replies; 6+ messages in thread
From: Jingoo Han @ 2017-07-17 19:28 UTC (permalink / raw)
To: 'Joao Pinto', 'Bjorn Andersson'
Cc: 'open list:PCI DRIVER FOR TI DRA7XX',
'Binghui Wang',
'open list:PCIE DRIVER FOR AXIS ARTPEC',
'Jesper Nilsson',
'moderated list:PCI DRIVER FOR SAMSUNG EXYNOS',
'Pratyush Anand', 'Krzysztof Kozlowski',
'Kishon Vijay Abraham I', 'Kukjin Kim',
'Xiaowei Song', 'Richard Zhu',
'open list:PCIE DRIVER FOR QUALCOMM MSM',
'Niklas Cassel', 'Murali Karicheri',
'Bjorn Helgaas', 'Mingkai Hu',
'open list:PCI DRIVER FOR TI DRA7XX',
'moderated list:PCI DRIVER FOR SAMSUNG EXYNOS',
'Thomas Petazzoni',
'open list:PCI DRIVER FOR FREESCALE LAYERSCAPE',
'open list', 'Stanimir Varbanov',
'Minghuan Lian', 'Roy Zang',
'Lucas Stach'
T24gTW9uZGF5LCBKdWx5IDE3LCAyMDE3IDc6MTggQU0sIEpvYW8gUGludG8gd3JvdGU6Cj4gCj4g
SGkgQmpvcm4gQW5kZXJzc29uLAo+IAo+IMOAcyA3OjM5IEFNIGRlIDcvMTYvMjAxNywgQmpvcm4g
QW5kZXJzc29uIGVzY3JldmV1Ogo+ID4gSW4gc2V2ZXJhbCBkd2MgYmFzZWQgZHJpdmVycyBob3N0
X2luaXQgY2FuIGZhaWwsIHNvIG1ha2Ugc3VyZSB0bwo+ID4gcHJvcGFnYXRlIGFuZCBoYW5kbGUg
dGhpcyB0byBhdm9pZCBjb250aW51aW5nIG9wZXJhdGlvbiBvZiBhIGRyaXZlciBvcgo+ID4gaGFy
ZHdhcmUgaW4gYW4gaW52YWxpZCBzdGF0ZS4KPiA+Cj4gPiBTaWduZWQtb2ZmLWJ5OiBCam9ybiBB
bmRlcnNzb24gPGJqb3JuLmFuZGVyc3NvbkBsaW5hcm8ub3JnPgo+ID4gLS0tCj4gPiAgZHJpdmVy
cy9wY2kvZHdjL3BjaS1kcmE3eHguYyAgICAgICAgICAgfCAgNCArKystCj4gPiAgZHJpdmVycy9w
Y2kvZHdjL3BjaS1leHlub3MuYyAgICAgICAgICAgfCAgNCArKystCj4gPiAgZHJpdmVycy9wY2kv
ZHdjL3BjaS1pbXg2LmMgICAgICAgICAgICAgfCAgNCArKystCj4gPiAgZHJpdmVycy9wY2kvZHdj
L3BjaS1rZXlzdG9uZS5jICAgICAgICAgfCAgNCArKystCj4gPiAgZHJpdmVycy9wY2kvZHdjL3Bj
aS1sYXllcnNjYXBlLmMgICAgICAgfCAxNCArKysrKysrKysrLS0tLQo+ID4gIGRyaXZlcnMvcGNp
L2R3Yy9wY2llLWFybWFkYThrLmMgICAgICAgIHwgIDQgKysrLQo+ID4gIGRyaXZlcnMvcGNpL2R3
Yy9wY2llLWFydHBlYzYuYyAgICAgICAgIHwgIDQgKysrLQo+ID4gIGRyaXZlcnMvcGNpL2R3Yy9w
Y2llLWRlc2lnbndhcmUtaG9zdC5jIHwgIDcgKysrKystLQo+ID4gIGRyaXZlcnMvcGNpL2R3Yy9w
Y2llLWRlc2lnbndhcmUtcGxhdC5jIHwgIDQgKysrLQo+ID4gIGRyaXZlcnMvcGNpL2R3Yy9wY2ll
LWRlc2lnbndhcmUuaCAgICAgIHwgIDIgKy0KPiA+ICBkcml2ZXJzL3BjaS9kd2MvcGNpZS1raXJp
bi5jICAgICAgICAgICB8ICA0ICsrKy0KPiA+ICBkcml2ZXJzL3BjaS9kd2MvcGNpZS1xY29tLmMg
ICAgICAgICAgICB8ICA2ICsrKystLQo+ID4gIGRyaXZlcnMvcGNpL2R3Yy9wY2llLXNwZWFyMTN4
eC5jICAgICAgIHwgIDQgKysrLQo+ID4gIDEzIGZpbGVzIGNoYW5nZWQsIDQ3IGluc2VydGlvbnMo
KyksIDE4IGRlbGV0aW9ucygtKQo+ID4KClsuLi4uLl0KCj4gCj4gQSBzdGVwIGluIHRoZSByaWdo
dCBkaXJlY3Rpb24gOikuIEluIHRoZSBmdXR1cmUgd2Ugc2hvdWxkIGFkZCBob3N0IGluaXQKPiB2
YWxpZGF0aW9uIGluIHRoZSBzcGVjaWZpYyBTb0MgZHJpdmVycywgbGlrZSBMYXllcnNjYXBlIGFu
ZCBRY29tIGhhdmUsIHRvCj4gYXNzdXJlCj4gdGhhdCBhbnkgcHJvYmxlbSBpcyB0cmVhdGVkIHBy
b3Blcmx5IGluIHRoZSBjb3JlIGRyaXZlci4KCkkgYWdyZWUgd2l0aCB5b3VyIG9waW5pb24uCgo+
IAo+IEFja2VkLWJ5OiBKb2FvIFBpbnRvIDxqcGludG9Ac3lub3BzeXMuY29tPgoKQWNrZWQtYnk6
IEppbmdvbyBIYW4gPGppbmdvb2hhbjFAZ21haWwuY29tPgoKQmVzdCByZWdhcmRzLApKaW5nb28g
SGFuCgoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KbGlu
dXgtYXJtLWtlcm5lbCBtYWlsaW5nIGxpc3QKbGludXgtYXJtLWtlcm5lbEBsaXN0cy5pbmZyYWRl
YWQub3JnCmh0dHA6Ly9saXN0cy5pbmZyYWRlYWQub3JnL21haWxtYW4vbGlzdGluZm8vbGludXgt
YXJtLWtlcm5lbAo=
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH 2/3] PCI: qcom: Don't unroll init if init fails
2017-07-16 6:39 ` [PATCH 2/3] PCI: qcom: Don't unroll init if init fails Bjorn Andersson
@ 2017-08-03 9:24 ` Stanimir Varbanov
0 siblings, 0 replies; 6+ messages in thread
From: Stanimir Varbanov @ 2017-08-03 9:24 UTC (permalink / raw)
To: Bjorn Andersson, Bjorn Helgaas
Cc: open list:PCIE DRIVER FOR QUALCOMM MSM,
open list:PCIE DRIVER FOR QUALCOMM MSM, open list
Hi,
The patch looks correct.
On 07/16/2017 09:39 AM, Bjorn Andersson wrote:
> When the init op fails it will restore the state of the resources, so we
> should not disable them one more time when this happens.
>
> Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org>
> ---
> drivers/pci/dwc/pcie-qcom.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
Acked-by: Stanimir Varbanov <svarbanov@mm-sol.com>
>
> diff --git a/drivers/pci/dwc/pcie-qcom.c b/drivers/pci/dwc/pcie-qcom.c
> index d15657dc3990..7b703741a3fd 100644
> --- a/drivers/pci/dwc/pcie-qcom.c
> +++ b/drivers/pci/dwc/pcie-qcom.c
> @@ -901,7 +901,7 @@ static int qcom_pcie_host_init(struct pcie_port *pp)
>
> ret = pcie->ops->init(pcie);
> if (ret)
> - goto err_deinit;
> + return ret;
>
> ret = phy_power_on(pcie->phy);
> if (ret)
>
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH 1/3] PCI: dwc: Handle host_init failures
2017-07-16 6:39 [PATCH 1/3] PCI: dwc: Handle host_init failures Bjorn Andersson
2017-07-16 6:39 ` [PATCH 2/3] PCI: qcom: Don't unroll init if init fails Bjorn Andersson
2017-07-17 11:18 ` [PATCH 1/3] PCI: dwc: Handle host_init failures Joao Pinto
@ 2017-08-03 21:19 ` Bjorn Helgaas
2 siblings, 0 replies; 6+ messages in thread
From: Bjorn Helgaas @ 2017-08-03 21:19 UTC (permalink / raw)
To: Bjorn Andersson
Cc: open list:PCI DRIVER FOR TI DRA7XX, Binghui Wang,
open list:PCIE DRIVER FOR AXIS ARTPEC, Jesper Nilsson, Joao Pinto,
Pratyush Anand, Krzysztof Kozlowski, Kishon Vijay Abraham I,
Kukjin Kim, Xiaowei Song, Richard Zhu,
open list:PCIE DRIVER FOR QUALCOMM MSM, Niklas Cassel,
open list:PCI DRIVER FOR FREESCALE LAYERSCAPE,
moderated list:PCI DRIVER FOR SAMSUNG EXYNOS, Murali Karicheri,
Bjorn Helgaas, Mingkai Hu, open list:PCI DRIVER FOR TI DRA7XX,
moderated list:PCI DRIVER FOR SAMSUNG EXYNOS, Thomas Petazzoni,
Jingoo Han, open list, Stanimir Varbanov, Minghuan Lian, Roy Zang,
Lucas Stach
On Sat, Jul 15, 2017 at 11:39:45PM -0700, Bjorn Andersson wrote:
> In several dwc based drivers host_init can fail, so make sure to
> propagate and handle this to avoid continuing operation of a driver or
> hardware in an invalid state.
>
> Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org>
Applied patches 1-3 to pci/host-designware for v4.14, thanks!
> ---
> drivers/pci/dwc/pci-dra7xx.c | 4 +++-
> drivers/pci/dwc/pci-exynos.c | 4 +++-
> drivers/pci/dwc/pci-imx6.c | 4 +++-
> drivers/pci/dwc/pci-keystone.c | 4 +++-
> drivers/pci/dwc/pci-layerscape.c | 14 ++++++++++----
> drivers/pci/dwc/pcie-armada8k.c | 4 +++-
> drivers/pci/dwc/pcie-artpec6.c | 4 +++-
> drivers/pci/dwc/pcie-designware-host.c | 7 +++++--
> drivers/pci/dwc/pcie-designware-plat.c | 4 +++-
> drivers/pci/dwc/pcie-designware.h | 2 +-
> drivers/pci/dwc/pcie-kirin.c | 4 +++-
> drivers/pci/dwc/pcie-qcom.c | 6 ++++--
> drivers/pci/dwc/pcie-spear13xx.c | 4 +++-
> 13 files changed, 47 insertions(+), 18 deletions(-)
>
> diff --git a/drivers/pci/dwc/pci-dra7xx.c b/drivers/pci/dwc/pci-dra7xx.c
> index f2fc5f47064e..e8c13bb76169 100644
> --- a/drivers/pci/dwc/pci-dra7xx.c
> +++ b/drivers/pci/dwc/pci-dra7xx.c
> @@ -195,7 +195,7 @@ static void dra7xx_pcie_enable_interrupts(struct dra7xx_pcie *dra7xx)
> dra7xx_pcie_enable_msi_interrupts(dra7xx);
> }
>
> -static void dra7xx_pcie_host_init(struct pcie_port *pp)
> +static int dra7xx_pcie_host_init(struct pcie_port *pp)
> {
> struct dw_pcie *pci = to_dw_pcie_from_pp(pp);
> struct dra7xx_pcie *dra7xx = to_dra7xx_pcie(pci);
> @@ -206,6 +206,8 @@ static void dra7xx_pcie_host_init(struct pcie_port *pp)
> dw_pcie_wait_for_link(pci);
> dw_pcie_msi_init(pp);
> dra7xx_pcie_enable_interrupts(dra7xx);
> +
> + return 0;
> }
>
> static const struct dw_pcie_host_ops dra7xx_pcie_host_ops = {
> diff --git a/drivers/pci/dwc/pci-exynos.c b/drivers/pci/dwc/pci-exynos.c
> index c78c06552590..f77f872e8b78 100644
> --- a/drivers/pci/dwc/pci-exynos.c
> +++ b/drivers/pci/dwc/pci-exynos.c
> @@ -581,13 +581,15 @@ static int exynos_pcie_link_up(struct dw_pcie *pci)
> return 0;
> }
>
> -static void exynos_pcie_host_init(struct pcie_port *pp)
> +static int exynos_pcie_host_init(struct pcie_port *pp)
> {
> struct dw_pcie *pci = to_dw_pcie_from_pp(pp);
> struct exynos_pcie *ep = to_exynos_pcie(pci);
>
> exynos_pcie_establish_link(ep);
> exynos_pcie_enable_interrupts(ep);
> +
> + return 0;
> }
>
> static const struct dw_pcie_host_ops exynos_pcie_host_ops = {
> diff --git a/drivers/pci/dwc/pci-imx6.c b/drivers/pci/dwc/pci-imx6.c
> index bf5c3616e344..20aae4469ee4 100644
> --- a/drivers/pci/dwc/pci-imx6.c
> +++ b/drivers/pci/dwc/pci-imx6.c
> @@ -636,7 +636,7 @@ static int imx6_pcie_establish_link(struct imx6_pcie *imx6_pcie)
> return ret;
> }
>
> -static void imx6_pcie_host_init(struct pcie_port *pp)
> +static int imx6_pcie_host_init(struct pcie_port *pp)
> {
> struct dw_pcie *pci = to_dw_pcie_from_pp(pp);
> struct imx6_pcie *imx6_pcie = to_imx6_pcie(pci);
> @@ -649,6 +649,8 @@ static void imx6_pcie_host_init(struct pcie_port *pp)
>
> if (IS_ENABLED(CONFIG_PCI_MSI))
> dw_pcie_msi_init(pp);
> +
> + return 0;
> }
>
> static int imx6_pcie_link_up(struct dw_pcie *pci)
> diff --git a/drivers/pci/dwc/pci-keystone.c b/drivers/pci/dwc/pci-keystone.c
> index 4783cec1f78d..3ad3f8aa27b0 100644
> --- a/drivers/pci/dwc/pci-keystone.c
> +++ b/drivers/pci/dwc/pci-keystone.c
> @@ -261,7 +261,7 @@ static int keystone_pcie_fault(unsigned long addr, unsigned int fsr,
> return 0;
> }
>
> -static void __init ks_pcie_host_init(struct pcie_port *pp)
> +static int __init ks_pcie_host_init(struct pcie_port *pp)
> {
> struct dw_pcie *pci = to_dw_pcie_from_pp(pp);
> struct keystone_pcie *ks_pcie = to_keystone_pcie(pci);
> @@ -289,6 +289,8 @@ static void __init ks_pcie_host_init(struct pcie_port *pp)
> */
> hook_fault_code(17, keystone_pcie_fault, SIGBUS, 0,
> "Asynchronous external abort");
> +
> + return 0;
> }
>
> static const struct dw_pcie_host_ops keystone_pcie_host_ops = {
> diff --git a/drivers/pci/dwc/pci-layerscape.c b/drivers/pci/dwc/pci-layerscape.c
> index fd861289ad8b..7581490f007c 100644
> --- a/drivers/pci/dwc/pci-layerscape.c
> +++ b/drivers/pci/dwc/pci-layerscape.c
> @@ -108,31 +108,35 @@ static int ls1021_pcie_link_up(struct dw_pcie *pci)
> return 1;
> }
>
> -static void ls1021_pcie_host_init(struct pcie_port *pp)
> +static int ls1021_pcie_host_init(struct pcie_port *pp)
> {
> struct dw_pcie *pci = to_dw_pcie_from_pp(pp);
> struct ls_pcie *pcie = to_ls_pcie(pci);
> struct device *dev = pci->dev;
> u32 index[2];
> + int ret;
>
> pcie->scfg = syscon_regmap_lookup_by_phandle(dev->of_node,
> "fsl,pcie-scfg");
> if (IS_ERR(pcie->scfg)) {
> + ret = PTR_ERR(pcie->scfg);
> dev_err(dev, "No syscfg phandle specified\n");
> pcie->scfg = NULL;
> - return;
> + return ret;
> }
>
> if (of_property_read_u32_array(dev->of_node,
> "fsl,pcie-scfg", index, 2)) {
> pcie->scfg = NULL;
> - return;
> + return -EINVAL;
> }
> pcie->index = index[1];
>
> dw_pcie_setup_rc(pp);
>
> ls_pcie_drop_msg_tlp(pcie);
> +
> + return 0;
> }
>
> static int ls_pcie_link_up(struct dw_pcie *pci)
> @@ -150,7 +154,7 @@ static int ls_pcie_link_up(struct dw_pcie *pci)
> return 1;
> }
>
> -static void ls_pcie_host_init(struct pcie_port *pp)
> +static int ls_pcie_host_init(struct pcie_port *pp)
> {
> struct dw_pcie *pci = to_dw_pcie_from_pp(pp);
> struct ls_pcie *pcie = to_ls_pcie(pci);
> @@ -160,6 +164,8 @@ static void ls_pcie_host_init(struct pcie_port *pp)
> ls_pcie_clear_multifunction(pcie);
> ls_pcie_drop_msg_tlp(pcie);
> iowrite32(0, pci->dbi_base + PCIE_DBI_RO_WR_EN);
> +
> + return 0;
> }
>
> static int ls_pcie_msi_host_init(struct pcie_port *pp,
> diff --git a/drivers/pci/dwc/pcie-armada8k.c b/drivers/pci/dwc/pcie-armada8k.c
> index ea8f34af6a85..017a727a68db 100644
> --- a/drivers/pci/dwc/pcie-armada8k.c
> +++ b/drivers/pci/dwc/pcie-armada8k.c
> @@ -134,13 +134,15 @@ static void armada8k_pcie_establish_link(struct armada8k_pcie *pcie)
> dev_err(pci->dev, "Link not up after reconfiguration\n");
> }
>
> -static void armada8k_pcie_host_init(struct pcie_port *pp)
> +static int armada8k_pcie_host_init(struct pcie_port *pp)
> {
> struct dw_pcie *pci = to_dw_pcie_from_pp(pp);
> struct armada8k_pcie *pcie = to_armada8k_pcie(pci);
>
> dw_pcie_setup_rc(pp);
> armada8k_pcie_establish_link(pcie);
> +
> + return 0;
> }
>
> static irqreturn_t armada8k_pcie_irq_handler(int irq, void *arg)
> diff --git a/drivers/pci/dwc/pcie-artpec6.c b/drivers/pci/dwc/pcie-artpec6.c
> index 01c6f7823672..5d81f1d884e3 100644
> --- a/drivers/pci/dwc/pcie-artpec6.c
> +++ b/drivers/pci/dwc/pcie-artpec6.c
> @@ -175,13 +175,15 @@ static void artpec6_pcie_enable_interrupts(struct artpec6_pcie *artpec6_pcie)
> dw_pcie_msi_init(pp);
> }
>
> -static void artpec6_pcie_host_init(struct pcie_port *pp)
> +static int artpec6_pcie_host_init(struct pcie_port *pp)
> {
> struct dw_pcie *pci = to_dw_pcie_from_pp(pp);
> struct artpec6_pcie *artpec6_pcie = to_artpec6_pcie(pci);
>
> artpec6_pcie_establish_link(artpec6_pcie);
> artpec6_pcie_enable_interrupts(artpec6_pcie);
> +
> + return 0;
> }
>
> static const struct dw_pcie_host_ops artpec6_pcie_host_ops = {
> diff --git a/drivers/pci/dwc/pcie-designware-host.c b/drivers/pci/dwc/pcie-designware-host.c
> index d29c020da082..157621175147 100644
> --- a/drivers/pci/dwc/pcie-designware-host.c
> +++ b/drivers/pci/dwc/pcie-designware-host.c
> @@ -401,8 +401,11 @@ int dw_pcie_host_init(struct pcie_port *pp)
> }
> }
>
> - if (pp->ops->host_init)
> - pp->ops->host_init(pp);
> + if (pp->ops->host_init) {
> + ret = pp->ops->host_init(pp);
> + if (ret)
> + goto error;
> + }
>
> pp->root_bus_nr = pp->busn->start;
>
> diff --git a/drivers/pci/dwc/pcie-designware-plat.c b/drivers/pci/dwc/pcie-designware-plat.c
> index 091b4e7ad059..168e2380f493 100644
> --- a/drivers/pci/dwc/pcie-designware-plat.c
> +++ b/drivers/pci/dwc/pcie-designware-plat.c
> @@ -35,7 +35,7 @@ static irqreturn_t dw_plat_pcie_msi_irq_handler(int irq, void *arg)
> return dw_handle_msi_irq(pp);
> }
>
> -static void dw_plat_pcie_host_init(struct pcie_port *pp)
> +static int dw_plat_pcie_host_init(struct pcie_port *pp)
> {
> struct dw_pcie *pci = to_dw_pcie_from_pp(pp);
>
> @@ -44,6 +44,8 @@ static void dw_plat_pcie_host_init(struct pcie_port *pp)
>
> if (IS_ENABLED(CONFIG_PCI_MSI))
> dw_pcie_msi_init(pp);
> +
> + return 0;
> }
>
> static const struct dw_pcie_host_ops dw_plat_pcie_host_ops = {
> diff --git a/drivers/pci/dwc/pcie-designware.h b/drivers/pci/dwc/pcie-designware.h
> index b4d2a89f8e58..7366c8167404 100644
> --- a/drivers/pci/dwc/pcie-designware.h
> +++ b/drivers/pci/dwc/pcie-designware.h
> @@ -134,7 +134,7 @@ struct dw_pcie_host_ops {
> unsigned int devfn, int where, int size, u32 *val);
> int (*wr_other_conf)(struct pcie_port *pp, struct pci_bus *bus,
> unsigned int devfn, int where, int size, u32 val);
> - void (*host_init)(struct pcie_port *pp);
> + int (*host_init)(struct pcie_port *pp);
> void (*msi_set_irq)(struct pcie_port *pp, int irq);
> void (*msi_clear_irq)(struct pcie_port *pp, int irq);
> phys_addr_t (*get_msi_addr)(struct pcie_port *pp);
> diff --git a/drivers/pci/dwc/pcie-kirin.c b/drivers/pci/dwc/pcie-kirin.c
> index 33fddb9f6739..0b0eb67f2658 100644
> --- a/drivers/pci/dwc/pcie-kirin.c
> +++ b/drivers/pci/dwc/pcie-kirin.c
> @@ -430,9 +430,11 @@ static int kirin_pcie_establish_link(struct pcie_port *pp)
> return 0;
> }
>
> -static void kirin_pcie_host_init(struct pcie_port *pp)
> +static int kirin_pcie_host_init(struct pcie_port *pp)
> {
> kirin_pcie_establish_link(pp);
> +
> + return 0;
> }
>
> static struct dw_pcie_ops kirin_dw_pcie_ops = {
> diff --git a/drivers/pci/dwc/pcie-qcom.c b/drivers/pci/dwc/pcie-qcom.c
> index 68c5f2ab5bc8..d15657dc3990 100644
> --- a/drivers/pci/dwc/pcie-qcom.c
> +++ b/drivers/pci/dwc/pcie-qcom.c
> @@ -891,7 +891,7 @@ static int qcom_pcie_link_up(struct dw_pcie *pci)
> return !!(val & PCI_EXP_LNKSTA_DLLLA);
> }
>
> -static void qcom_pcie_host_init(struct pcie_port *pp)
> +static int qcom_pcie_host_init(struct pcie_port *pp)
> {
> struct dw_pcie *pci = to_dw_pcie_from_pp(pp);
> struct qcom_pcie *pcie = to_qcom_pcie(pci);
> @@ -921,12 +921,14 @@ static void qcom_pcie_host_init(struct pcie_port *pp)
> if (ret)
> goto err;
>
> - return;
> + return 0;
> err:
> qcom_ep_reset_assert(pcie);
> phy_power_off(pcie->phy);
> err_deinit:
> pcie->ops->deinit(pcie);
> +
> + return ret;
> }
>
> static int qcom_pcie_rd_own_conf(struct pcie_port *pp, int where, int size,
> diff --git a/drivers/pci/dwc/pcie-spear13xx.c b/drivers/pci/dwc/pcie-spear13xx.c
> index 80897291e0fb..52000bc34600 100644
> --- a/drivers/pci/dwc/pcie-spear13xx.c
> +++ b/drivers/pci/dwc/pcie-spear13xx.c
> @@ -177,13 +177,15 @@ static int spear13xx_pcie_link_up(struct dw_pcie *pci)
> return 0;
> }
>
> -static void spear13xx_pcie_host_init(struct pcie_port *pp)
> +static int spear13xx_pcie_host_init(struct pcie_port *pp)
> {
> struct dw_pcie *pci = to_dw_pcie_from_pp(pp);
> struct spear13xx_pcie *spear13xx_pcie = to_spear13xx_pcie(pci);
>
> spear13xx_pcie_establish_link(spear13xx_pcie);
> spear13xx_pcie_enable_interrupts(spear13xx_pcie);
> +
> + return 0;
> }
>
> static const struct dw_pcie_host_ops spear13xx_pcie_host_ops = {
> --
> 2.12.0
>
>
> _______________________________________________
> linux-arm-kernel mailing list
> linux-arm-kernel@lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2017-08-03 21:19 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2017-07-16 6:39 [PATCH 1/3] PCI: dwc: Handle host_init failures Bjorn Andersson
2017-07-16 6:39 ` [PATCH 2/3] PCI: qcom: Don't unroll init if init fails Bjorn Andersson
2017-08-03 9:24 ` Stanimir Varbanov
2017-07-17 11:18 ` [PATCH 1/3] PCI: dwc: Handle host_init failures Joao Pinto
2017-07-17 19:28 ` Jingoo Han
2017-08-03 21:19 ` Bjorn Helgaas
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).