diff mbox series

[net-next,v2,6/8] ravb: Add net_features and net_hw_features to struct ravb_hw_info

Message ID 20210802102654.5996-7-biju.das.jz@bp.renesas.com
State New
Headers show
Series Add Gigabit Ethernet driver support | expand

Commit Message

Biju Das Aug. 2, 2021, 10:26 a.m. UTC
On R-Car the checksum calculation on RX frames is done by the E-MAC
module, whereas on RZ/G2L it is done by the TOE.

TOE calculates the checksum of received frames from E-MAC and outputs it to
DMAC. TOE also calculates the checksum of transmission frames from DMAC and
outputs it E-MAC.

Add net_features and net_hw_features to struct ravb_hw_info, to support
subsequent SoCs without any code changes in the ravb_probe function.

Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com>
Reviewed-by: Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com>
---
v2:
 * Incorporated Andrew and Sergei's review comments for making it smaller patch
   and provided detailed description.
---
 drivers/net/ethernet/renesas/ravb.h      |  2 ++
 drivers/net/ethernet/renesas/ravb_main.c | 12 ++++++++----
 2 files changed, 10 insertions(+), 4 deletions(-)

Comments

Sergei Shtylyov Aug. 5, 2021, 7:07 p.m. UTC | #1
On 8/2/21 1:26 PM, Biju Das wrote:

> On R-Car the checksum calculation on RX frames is done by the E-MAC

> module, whereas on RZ/G2L it is done by the TOE.

> 

> TOE calculates the checksum of received frames from E-MAC and outputs it to

> DMAC. TOE also calculates the checksum of transmission frames from DMAC and

> outputs it E-MAC.

> 

> Add net_features and net_hw_features to struct ravb_hw_info, to support

> subsequent SoCs without any code changes in the ravb_probe function.

> 

> Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com>

> Reviewed-by: Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com>


[...]
> diff --git a/drivers/net/ethernet/renesas/ravb.h b/drivers/net/ethernet/renesas/ravb.h

> index b765b2b7d9e9..3df813b2e253 100644

> --- a/drivers/net/ethernet/renesas/ravb.h

> +++ b/drivers/net/ethernet/renesas/ravb.h

> @@ -991,6 +991,8 @@ enum ravb_chip_id {

>  struct ravb_hw_info {

>  	const char (*gstrings_stats)[ETH_GSTRING_LEN];

>  	size_t gstrings_size;

> +	netdev_features_t net_hw_features;

> +	netdev_features_t net_features;


   Do we really need both of these here? It seems like the 'feartures' mirrors the enabled features?

>  	enum ravb_chip_id chip_id;

>  	int num_gstat_queue;

>  	int num_tx_desc;

> diff --git a/drivers/net/ethernet/renesas/ravb_main.c b/drivers/net/ethernet/renesas/ravb_main.c

> index 7a69668cb512..2ac962b5b8fb 100644

> --- a/drivers/net/ethernet/renesas/ravb_main.c

> +++ b/drivers/net/ethernet/renesas/ravb_main.c

[...]
> @@ -2077,14 +2081,14 @@ static int ravb_probe(struct platform_device *pdev)

>  	if (!ndev)

>  		return -ENOMEM;

>  

> -	ndev->features = NETIF_F_RXCSUM;

> -	ndev->hw_features = NETIF_F_RXCSUM;

> +	info = of_device_get_match_data(&pdev->dev);

> +

> +	ndev->features = info->net_features;

> +	ndev->hw_features = info->net_hw_features;


   What value you plan to set her for GbEth, NETIF_F_HW_CSUM?

[...]

MBR, Sergei
Biju Das Aug. 5, 2021, 7:18 p.m. UTC | #2
Hi Sergei,

Thanks for the feedback.

> Subject: Re: [PATCH net-next v2 6/8] ravb: Add net_features and

> net_hw_features to struct ravb_hw_info

> 

> On 8/2/21 1:26 PM, Biju Das wrote:

> 

> > On R-Car the checksum calculation on RX frames is done by the E-MAC

> > module, whereas on RZ/G2L it is done by the TOE.

> >

> > TOE calculates the checksum of received frames from E-MAC and outputs

> > it to DMAC. TOE also calculates the checksum of transmission frames

> > from DMAC and outputs it E-MAC.

> >

> > Add net_features and net_hw_features to struct ravb_hw_info, to

> > support subsequent SoCs without any code changes in the ravb_probe

> function.

> >

> > Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com>

> > Reviewed-by: Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com>

> 

> [...]

> > diff --git a/drivers/net/ethernet/renesas/ravb.h

> > b/drivers/net/ethernet/renesas/ravb.h

> > index b765b2b7d9e9..3df813b2e253 100644

> > --- a/drivers/net/ethernet/renesas/ravb.h

> > +++ b/drivers/net/ethernet/renesas/ravb.h

> > @@ -991,6 +991,8 @@ enum ravb_chip_id {  struct ravb_hw_info {

> >  	const char (*gstrings_stats)[ETH_GSTRING_LEN];

> >  	size_t gstrings_size;

> > +	netdev_features_t net_hw_features;

> > +	netdev_features_t net_features;

> 

>    Do we really need both of these here? 


R-Car has only Rx Checksum on E-Mac, where as Geth supports Rx Check Sum on E-Mac or Rx/Tx CheckSum on TOE.
So there is a hw difference. Please let me know what is the best way to handle this?

>It seems like the 'feartures'

> mirrors the enabled features?


Can you please explain this little bit?

> 

> >  	enum ravb_chip_id chip_id;

> >  	int num_gstat_queue;

> >  	int num_tx_desc;

> > diff --git a/drivers/net/ethernet/renesas/ravb_main.c

> > b/drivers/net/ethernet/renesas/ravb_main.c

> > index 7a69668cb512..2ac962b5b8fb 100644

> > --- a/drivers/net/ethernet/renesas/ravb_main.c

> > +++ b/drivers/net/ethernet/renesas/ravb_main.c

> [...]

> > @@ -2077,14 +2081,14 @@ static int ravb_probe(struct platform_device

> *pdev)

> >  	if (!ndev)

> >  		return -ENOMEM;

> >

> > -	ndev->features = NETIF_F_RXCSUM;

> > -	ndev->hw_features = NETIF_F_RXCSUM;

> > +	info = of_device_get_match_data(&pdev->dev);

> > +

> > +	ndev->features = info->net_features;

> > +	ndev->hw_features = info->net_hw_features;

> 

>    What value you plan to set her for GbEth, NETIF_F_HW_CSUM?


Yes, That is the plan.
.net_hw_features = (NETIF_F_HW_CSUM | NETIF_F_RXCSUM),

Regards,
Biju

> 

> [...]

> 

> MBR, Sergei
Sergei Shtylyov Aug. 6, 2021, 8:20 p.m. UTC | #3
Hello!

On 8/5/21 10:18 PM, Biju Das wrote:

[...]
>>> On R-Car the checksum calculation on RX frames is done by the E-MAC

>>> module, whereas on RZ/G2L it is done by the TOE.

>>>

>>> TOE calculates the checksum of received frames from E-MAC and outputs

>>> it to DMAC. TOE also calculates the checksum of transmission frames

>>> from DMAC and outputs it E-MAC.

>>>

>>> Add net_features and net_hw_features to struct ravb_hw_info, to

>>> support subsequent SoCs without any code changes in the ravb_probe

>> function.

>>>

>>> Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com>

>>> Reviewed-by: Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com>

>>

>> [...]

>>> diff --git a/drivers/net/ethernet/renesas/ravb.h

>>> b/drivers/net/ethernet/renesas/ravb.h

>>> index b765b2b7d9e9..3df813b2e253 100644

>>> --- a/drivers/net/ethernet/renesas/ravb.h

>>> +++ b/drivers/net/ethernet/renesas/ravb.h

>>> @@ -991,6 +991,8 @@ enum ravb_chip_id {  struct ravb_hw_info {

>>>  	const char (*gstrings_stats)[ETH_GSTRING_LEN];

>>>  	size_t gstrings_size;

>>> +	netdev_features_t net_hw_features;

>>> +	netdev_features_t net_features;

>>

>>    Do we really need both of these here? 

> 

> R-Car has only Rx Checksum on E-Mac, where as Geth supports Rx Check Sum on E-Mac or Rx/Tx CheckSum on TOE.

> So there is a hw difference. Please let me know what is the best way to handle this?


   I meant that we could go with only one field of the net_features... Alternatively, we could use our own
feature bits...

>> It seems like the 'feartures'

>> mirrors the enabled features?

> 

> Can you please explain this little bit?


   Looks like I was wrong. :-)

[...]

> Regards,

> Biju


[...]

MBR, Sergei
Sergei Shtylyov Aug. 6, 2021, 8:31 p.m. UTC | #4
On 8/2/21 1:26 PM, Biju Das wrote:

> On R-Car the checksum calculation on RX frames is done by the E-MAC

> module, whereas on RZ/G2L it is done by the TOE.

> 

> TOE calculates the checksum of received frames from E-MAC and outputs it to

> DMAC. TOE also calculates the checksum of transmission frames from DMAC and

> outputs it E-MAC.

> 

> Add net_features and net_hw_features to struct ravb_hw_info, to support

> subsequent SoCs without any code changes in the ravb_probe function.

> 

> Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com>

> Reviewed-by: Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com>


Reviewed-by: Sergei Shtylyov <sergei.shtylyov@gmail.com>



[...]

MBR, Sergei
Biju Das Aug. 12, 2021, 7:35 a.m. UTC | #5
Hi Sergei,

Thanks for the feedback.

> Subject: Re: [PATCH net-next v2 6/8] ravb: Add net_features and

> net_hw_features to struct ravb_hw_info

> 

> Hello!

> 

> On 8/5/21 10:18 PM, Biju Das wrote:

> 

> [...]

> >>> On R-Car the checksum calculation on RX frames is done by the E-MAC

> >>> module, whereas on RZ/G2L it is done by the TOE.

> >>>

> >>> TOE calculates the checksum of received frames from E-MAC and

> >>> outputs it to DMAC. TOE also calculates the checksum of transmission

> >>> frames from DMAC and outputs it E-MAC.

> >>>

> >>> Add net_features and net_hw_features to struct ravb_hw_info, to

> >>> support subsequent SoCs without any code changes in the ravb_probe

> >> function.

> >>>

> >>> Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com>

> >>> Reviewed-by: Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com>

> >>

> >> [...]

> >>> diff --git a/drivers/net/ethernet/renesas/ravb.h

> >>> b/drivers/net/ethernet/renesas/ravb.h

> >>> index b765b2b7d9e9..3df813b2e253 100644

> >>> --- a/drivers/net/ethernet/renesas/ravb.h

> >>> +++ b/drivers/net/ethernet/renesas/ravb.h

> >>> @@ -991,6 +991,8 @@ enum ravb_chip_id {  struct ravb_hw_info {

> >>>  	const char (*gstrings_stats)[ETH_GSTRING_LEN];

> >>>  	size_t gstrings_size;

> >>> +	netdev_features_t net_hw_features;

> >>> +	netdev_features_t net_features;

> >>

> >>    Do we really need both of these here?

> >

> > R-Car has only Rx Checksum on E-Mac, where as Geth supports Rx Check Sum

> on E-Mac or Rx/Tx CheckSum on TOE.

> > So there is a hw difference. Please let me know what is the best way to

> handle this?

> 

>    I meant that we could go with only one field of the net_features...

> Alternatively, we could use our own feature bits...


Basically are you suggesting some thing like unsigned hwcsum_tx_rx: 1;

Then,

if (hwcsum_tx_rx) {
	ndev->hw_features = NETIF_F_HW_CSUM | NETIF_F_RXCSUM;
} else {
	ndev->features = NETIF_F_RXCSUM;
	ndev->hw_features = NETIF_F_RXCSUM;
}

Cheers,
Biju
diff mbox series

Patch

diff --git a/drivers/net/ethernet/renesas/ravb.h b/drivers/net/ethernet/renesas/ravb.h
index b765b2b7d9e9..3df813b2e253 100644
--- a/drivers/net/ethernet/renesas/ravb.h
+++ b/drivers/net/ethernet/renesas/ravb.h
@@ -991,6 +991,8 @@  enum ravb_chip_id {
 struct ravb_hw_info {
 	const char (*gstrings_stats)[ETH_GSTRING_LEN];
 	size_t gstrings_size;
+	netdev_features_t net_hw_features;
+	netdev_features_t net_features;
 	enum ravb_chip_id chip_id;
 	int num_gstat_queue;
 	int num_tx_desc;
diff --git a/drivers/net/ethernet/renesas/ravb_main.c b/drivers/net/ethernet/renesas/ravb_main.c
index 7a69668cb512..2ac962b5b8fb 100644
--- a/drivers/net/ethernet/renesas/ravb_main.c
+++ b/drivers/net/ethernet/renesas/ravb_main.c
@@ -1932,6 +1932,8 @@  static int ravb_mdio_release(struct ravb_private *priv)
 static const struct ravb_hw_info ravb_gen3_hw_info = {
 	.gstrings_stats = ravb_gstrings_stats,
 	.gstrings_size = sizeof(ravb_gstrings_stats),
+	.net_hw_features = NETIF_F_RXCSUM,
+	.net_features = NETIF_F_RXCSUM,
 	.chip_id = RCAR_GEN3,
 	.num_gstat_queue = NUM_RX_QUEUE,
 	.num_tx_desc = NUM_TX_DESC_GEN3,
@@ -1942,6 +1944,8 @@  static const struct ravb_hw_info ravb_gen3_hw_info = {
 static const struct ravb_hw_info ravb_gen2_hw_info = {
 	.gstrings_stats = ravb_gstrings_stats,
 	.gstrings_size = sizeof(ravb_gstrings_stats),
+	.net_hw_features = NETIF_F_RXCSUM,
+	.net_features = NETIF_F_RXCSUM,
 	.chip_id = RCAR_GEN2,
 	.num_gstat_queue = NUM_RX_QUEUE,
 	.num_tx_desc = NUM_TX_DESC_GEN2,
@@ -2077,14 +2081,14 @@  static int ravb_probe(struct platform_device *pdev)
 	if (!ndev)
 		return -ENOMEM;
 
-	ndev->features = NETIF_F_RXCSUM;
-	ndev->hw_features = NETIF_F_RXCSUM;
+	info = of_device_get_match_data(&pdev->dev);
+
+	ndev->features = info->net_features;
+	ndev->hw_features = info->net_hw_features;
 
 	pm_runtime_enable(&pdev->dev);
 	pm_runtime_get_sync(&pdev->dev);
 
-	info = of_device_get_match_data(&pdev->dev);
-
 	if (info->chip_id == RCAR_GEN3)
 		irq = platform_get_irq_byname(pdev, "ch22");
 	else