diff mbox series

[1/3] net: stmmac: explicitly deassert GMAC_AHB_RESET

Message ID 20210605173546.4102455-1-mnhagan88@gmail.com
State New
Headers show
Series [1/3] net: stmmac: explicitly deassert GMAC_AHB_RESET | expand

Commit Message

Matthew Hagan June 5, 2021, 5:35 p.m. UTC
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.

Signed-off-by: Matthew Hagan <mnhagan88@gmail.com>
---
 drivers/net/ethernet/stmicro/stmmac/stmmac_main.c     | 7 +++++++
 drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c | 7 +++++++
 include/linux/stmmac.h                                | 1 +
 3 files changed, 15 insertions(+)

Comments

Bjorn Andersson June 6, 2021, 3:24 a.m. UTC | #1
On Sat 05 Jun 12:35 CDT 2021, 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.

> 


Sounds good, just some small style comments below.

> Signed-off-by: Matthew Hagan <mnhagan88@gmail.com>

> ---

>  drivers/net/ethernet/stmicro/stmmac/stmmac_main.c     | 7 +++++++

>  drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c | 7 +++++++

>  include/linux/stmmac.h                                | 1 +

>  3 files changed, 15 insertions(+)

> 

> diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c

> index 6d41dd6f9f7a..1e28058b65a8 100644

> --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c

> +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c

> @@ -6840,6 +6840,13 @@ int stmmac_dvr_probe(struct device *device,

>  			reset_control_reset(priv->plat->stmmac_rst);

>  	}

>  

> +	if (priv->plat->stmmac_ahb_rst) {


You don't need this conditional, stmmac_ahb_rst will be NULL if not
specified and you can reset_control_deassert(NULL) without any problems.

> +		ret = reset_control_deassert(priv->plat->stmmac_ahb_rst);

> +		if (ret == -ENOTSUPP)

> +			dev_err(priv->device,

> +				"unable to bring out of ahb reset\n");


No need to wrap this line.

> +	}

> +

>  	/* 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..d8ae58bdbbe3 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 = plat->stmmac_ahb_rst;


You need a PTR_ERR() around the plat->stmmac_ahb_rst.

Regards,
Bjorn

> +		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;

> -- 

> 2.26.3

>
Matthew Hagan June 6, 2021, 9:36 a.m. UTC | #2
On 06/06/2021 04:24, Bjorn Andersson wrote:

> On Sat 05 Jun 12:35 CDT 2021, 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.
>>
> Sounds good, just some small style comments below.
>
>> Signed-off-by: Matthew Hagan <mnhagan88@gmail.com>
>> ---
>>  drivers/net/ethernet/stmicro/stmmac/stmmac_main.c     | 7 +++++++
>>  drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c | 7 +++++++
>>  include/linux/stmmac.h                                | 1 +
>>  3 files changed, 15 insertions(+)
>>
>> diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
>> index 6d41dd6f9f7a..1e28058b65a8 100644
>> --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
>> +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
>> @@ -6840,6 +6840,13 @@ int stmmac_dvr_probe(struct device *device,
>>  			reset_control_reset(priv->plat->stmmac_rst);
>>  	}
>>  
>> +	if (priv->plat->stmmac_ahb_rst) {
> You don't need this conditional, stmmac_ahb_rst will be NULL if not
> specified and you can reset_control_deassert(NULL) without any problems.
>
>> +		ret = reset_control_deassert(priv->plat->stmmac_ahb_rst);
>> +		if (ret == -ENOTSUPP)
>> +			dev_err(priv->device,
>> +				"unable to bring out of ahb reset\n");
> No need to wrap this line.
>
>> +	}
>> +
>>  	/* 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..d8ae58bdbbe3 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 = plat->stmmac_ahb_rst;
> You need a PTR_ERR() around the plat->stmmac_ahb_rst.
>
> Regards,
> Bjorn
>
>> +		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;
>> -- 
>> 2.26.3
>>
>>
Thanks for the review. Will submit a v2 shortly.

Matthew
Matthew Hagan June 6, 2021, 2:38 p.m. UTC | #3
On 06/06/2021 04:24, Bjorn Andersson wrote:

>> diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c

>> index 97a1fedcc9ac..d8ae58bdbbe3 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 = plat->stmmac_ahb_rst;

> You need a PTR_ERR() around the plat->stmmac_ahb_rst.


This is giving a warning. Shouldn't v1 be kept as it is here? Please refer
to "net: stmmac: platform: use optional clk/reset get APIs" [1] which
modified error handling for plat->stmmac_rst. PTR_ERR() would then be
called by the parent function on the returned value of ret.

[1]: https://lore.kernel.org/netdev/20201112092606.5173aa6f@xhacker.debian/

Thanks,
Matthew
diff mbox series

Patch

diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
index 6d41dd6f9f7a..1e28058b65a8 100644
--- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
+++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
@@ -6840,6 +6840,13 @@  int stmmac_dvr_probe(struct device *device,
 			reset_control_reset(priv->plat->stmmac_rst);
 	}
 
+	if (priv->plat->stmmac_ahb_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..d8ae58bdbbe3 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 = 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;