Message ID | 20210606103019.2807397-1-mnhagan88@gmail.com |
---|---|
State | New |
Headers | show |
Series | [v2] net: stmmac: explicitly deassert GMAC_AHB_RESET | expand |
On Sun, 2021-06-06 at 11:30 +0100, Matthew Hagan wrote: > We are currently assuming that GMAC_AHB_RESET will already be deasserted > by the bootloader. However if this has not been done, probing of the GMAC > will fail. To remedy this we must ensure GMAC_AHB_RESET has been deasserted > prior to probing. > > v2 changes: > - remove NULL condition check for stmmac_ahb_rst in stmmac_main.c > - unwrap dev_err() message in stmmac_main.c > - add PTR_ERR() around plat->stmmac_ahb_rst in stmmac_platform.c > > Signed-off-by: Matthew Hagan <mnhagan88@gmail.com> > --- > drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | 4 ++++ > drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c | 7 +++++++ > include/linux/stmmac.h | 1 + > 3 files changed, 12 insertions(+) > > diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c > index 6d41dd6f9f7a..0d4cb423cbbd 100644 > --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c > +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c > @@ -6840,6 +6840,10 @@ int stmmac_dvr_probe(struct device *device, > reset_control_reset(priv->plat->stmmac_rst); > } > > + ret = reset_control_deassert(priv->plat->stmmac_ahb_rst); > + if (ret == -ENOTSUPP) > + dev_err(priv->device, "unable to bring out of ahb reset\n"); > + I would make this if (ret) dev_err(priv->device, "unable to bring out of ahb reset: %pe\n", ERR_PTR(ret)); Also consider asserting the reset again in the remove path. Or is there a reason not to? With that addressed, Reviewed-by: Philipp Zabel <p.zabel@pengutronix.de> regards Philipp
On 07/06/2021 10:45, Philipp Zabel wrote: > On Sun, 2021-06-06 at 11:30 +0100, Matthew Hagan wrote: >> We are currently assuming that GMAC_AHB_RESET will already be deasserted >> by the bootloader. However if this has not been done, probing of the GMAC >> will fail. To remedy this we must ensure GMAC_AHB_RESET has been deasserted >> prior to probing. >> >> v2 changes: >> - remove NULL condition check for stmmac_ahb_rst in stmmac_main.c >> - unwrap dev_err() message in stmmac_main.c >> - add PTR_ERR() around plat->stmmac_ahb_rst in stmmac_platform.c >> >> Signed-off-by: Matthew Hagan <mnhagan88@gmail.com> >> --- >> drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | 4 ++++ >> drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c | 7 +++++++ >> include/linux/stmmac.h | 1 + >> 3 files changed, 12 insertions(+) >> >> diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c >> index 6d41dd6f9f7a..0d4cb423cbbd 100644 >> --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c >> +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c >> @@ -6840,6 +6840,10 @@ int stmmac_dvr_probe(struct device *device, >> reset_control_reset(priv->plat->stmmac_rst); >> } >> >> + ret = reset_control_deassert(priv->plat->stmmac_ahb_rst); >> + if (ret == -ENOTSUPP) >> + dev_err(priv->device, "unable to bring out of ahb reset\n"); >> + > I would make this > > if (ret) > dev_err(priv->device, "unable to bring out of ahb reset: %pe\n", ERR_PTR(ret)); Done. > > Also consider asserting the reset again in the remove path. Or is there > a reason not to? Don't see any issue doing this. As this is a shared reset, the assert will only occur when the final GMAC is removed, due to the tracking of deassert_count. > With that addressed, > > Reviewed-by: Philipp Zabel <p.zabel@pengutronix.de> > > regards > Philipp Thanks, Matthew
diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c index 6d41dd6f9f7a..0d4cb423cbbd 100644 --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c @@ -6840,6 +6840,10 @@ int stmmac_dvr_probe(struct device *device, reset_control_reset(priv->plat->stmmac_rst); } + ret = reset_control_deassert(priv->plat->stmmac_ahb_rst); + if (ret == -ENOTSUPP) + dev_err(priv->device, "unable to bring out of ahb reset\n"); + /* Init MAC and get the capabilities */ ret = stmmac_hw_init(priv); if (ret) diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c index 97a1fedcc9ac..a178181f6a24 100644 --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c @@ -600,6 +600,13 @@ stmmac_probe_config_dt(struct platform_device *pdev, u8 *mac) goto error_hw_init; } + plat->stmmac_ahb_rst = devm_reset_control_get_optional_shared( + &pdev->dev, "ahb"); + if (IS_ERR(plat->stmmac_ahb_rst)) { + ret = PTR_ERR(plat->stmmac_ahb_rst); + goto error_hw_init; + } + return plat; error_hw_init: diff --git a/include/linux/stmmac.h b/include/linux/stmmac.h index e55a4807e3ea..9b6a64f3e3dc 100644 --- a/include/linux/stmmac.h +++ b/include/linux/stmmac.h @@ -239,6 +239,7 @@ struct plat_stmmacenet_data { unsigned int mult_fact_100ns; s32 ptp_max_adj; struct reset_control *stmmac_rst; + struct reset_control *stmmac_ahb_rst; struct stmmac_axi *axi; int has_gmac4; bool has_sun8i;
We are currently assuming that GMAC_AHB_RESET will already be deasserted by the bootloader. However if this has not been done, probing of the GMAC will fail. To remedy this we must ensure GMAC_AHB_RESET has been deasserted prior to probing. v2 changes: - remove NULL condition check for stmmac_ahb_rst in stmmac_main.c - unwrap dev_err() message in stmmac_main.c - add PTR_ERR() around plat->stmmac_ahb_rst in stmmac_platform.c Signed-off-by: Matthew Hagan <mnhagan88@gmail.com> --- drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | 4 ++++ drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c | 7 +++++++ include/linux/stmmac.h | 1 + 3 files changed, 12 insertions(+)