net: sxgbe: Added tail point update

Message ID 008b01cf69cc$4d304e50$e790eaf0$%an@samsung.com
State New
Headers show

Commit Message

Byungho An May 7, 2014, 8:14 a.m.
This patch adds tail point update function for rx path
after rx_refill function. It indicates tail point for rx dma.

Signed-off-by: Byungho An <bh74.an@samsung.com>
---
 drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.c  |   14 +++++++++++++-
 drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.h  |    4 ++++
 drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c |    5 +++++
 3 files changed, 22 insertions(+), 1 deletion(-)

Comments

Florian Fainelli May 7, 2014, 7:09 p.m. | #1
2014-05-07 1:14 GMT-07:00 Byungho An <bh74.an@samsung.com>:
>
> This patch adds tail point update function for rx path
> after rx_refill function. It indicates tail point for rx dma.
>
> Signed-off-by: Byungho An <bh74.an@samsung.com>
> ---
>  drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.c  |   14 +++++++++++++-
>  drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.h  |    4 ++++
>  drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c |    5 +++++
>  3 files changed, 22 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.c b/drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.c
> index 49240c9..249b0e0 100644
> --- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.c
> +++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.c
> @@ -112,7 +112,7 @@ static void sxgbe_dma_channel_init(void __iomem *ioaddr, int cha_num,
>
>         dma_addr = dma_rx + ((r_rsize - 1) * SXGBE_DESC_SIZE_BYTES);
>         writel(lower_32_bits(dma_addr),
> -              ioaddr + SXGBE_DMA_CHA_RXDESC_LADD_REG(cha_num));
> +              ioaddr + SXGBE_DMA_CHA_RXDESC_TAILPTR_REG(cha_num));
>         /* program the ring sizes */
>         writel(t_rsize - 1, ioaddr + SXGBE_DMA_CHA_TXDESC_RINGLEN_REG(cha_num));
>         writel(r_rsize - 1, ioaddr + SXGBE_DMA_CHA_RXDESC_RINGLEN_REG(cha_num));
> @@ -370,6 +370,17 @@ static void sxgbe_enable_tso(void __iomem *ioaddr, u8 chan_num)
>         writel(ctrl, ioaddr + SXGBE_DMA_CHA_TXCTL_REG(chan_num));
>  }
>
> +static void sxgbe_dma_update_rxdesc_tail_ptr(void __iomem *ioaddr, u8 chan_num,
> +                                             dma_addr_t dma_rx_phy, int cur_rx,
> +                                             int rxsize)

I think that at some point you should revisit your abstraction, all
the patches that I see do take a void __iomem * argument as the first
function argument, you should probably use your driver private context
here. The day you support a different version of the hardware, there
might be other differences that need to be taken care of.

> +{
> +       u32 reg_val;
> +
> +       reg_val = (dma_rx_phy & 0xFFFFFFFF) + ((cur_rx % rxsize) *
> +                                              SXGBE_DESC_SIZE_BYTES);
> +       writel(reg_val, ioaddr + SXGBE_DMA_CHA_RXDESC_TAILPTR_REG(chan_num));
> +}
> +
>  static const struct sxgbe_dma_ops sxgbe_dma_ops = {
>         .init                           = sxgbe_dma_init,
>         .cha_init                       = sxgbe_dma_channel_init,
> @@ -386,6 +397,7 @@ static const struct sxgbe_dma_ops sxgbe_dma_ops = {
>         .rx_dma_int_status              = sxgbe_rx_dma_int_status,
>         .rx_watchdog                    = sxgbe_dma_rx_watchdog,
>         .enable_tso                     = sxgbe_enable_tso,
> +       .update_rxdesc_tail_ptr         = sxgbe_dma_update_rxdesc_tail_ptr,
>  };
>
>  const struct sxgbe_dma_ops *sxgbe_get_dma_ops(void)
> diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.h b/drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.h
> index 843fa9b..a06e01e 100644
> --- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.h
> +++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.h
> @@ -43,6 +43,10 @@ struct sxgbe_dma_ops {
>         void (*rx_watchdog)(void __iomem *ioaddr, u32 riwt);
>         /* Enable TSO for each DMA channel */
>         void (*enable_tso)(void __iomem *ioaddr, u8 chan_num);
> +       void (*update_rxdesc_tail_ptr)(void __iomem *ioaddr, u8 chan_num,
> +                                      dma_addr_t dma_rx, int r_rentry,
> +                                      int r_rsize);
> +
>  };
>
>  const struct sxgbe_dma_ops *sxgbe_get_dma_ops(void);
> diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c b/drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c
> index 93bf151..7dc3449 100644
> --- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c
> +++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c
> @@ -1521,6 +1521,7 @@ static int sxgbe_rx(struct sxgbe_priv_data *priv, int limit)
>                 skb_put(skb, frame_len);
>
>                 skb->ip_summed = checksum;
> +               skb->protocol = eth_type_trans(skb, priv->dev);
>                 if (checksum == CHECKSUM_NONE)
>                         netif_receive_skb(skb);
>                 else
> @@ -1530,6 +1531,10 @@ static int sxgbe_rx(struct sxgbe_priv_data *priv, int limit)
>         }
>
>         sxgbe_rx_refill(priv);
> +       priv->hw->dma->update_rxdesc_tail_ptr(priv->ioaddr, qnum,
> +                                             priv->rxq[qnum]->dma_rx_phy,
> +                                             priv->rxq[qnum]->cur_rx,
> +                                             priv->dma_rx_size);
>
>         return count;
>  }
> --
> 1.7.10.4
>
>
> --
> To unsubscribe from this list: send the line "unsubscribe netdev" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
Byungho An May 8, 2014, 1:20 a.m. | #2
Florian Fainelli wrote: 
> 2014-05-07 1:14 GMT-07:00 Byungho An <bh74.an@samsung.com>:
> >
> > This patch adds tail point update function for rx path
> > after rx_refill function. It indicates tail point for rx dma.
> >
> > Signed-off-by: Byungho An <bh74.an@samsung.com>
> > ---
> >  drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.c  |   14 +++++++++++++-
> >  drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.h  |    4 ++++
> >  drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c |    5 +++++
> >  3 files changed, 22 insertions(+), 1 deletion(-)
> >
> > diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.c
> b/drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.c
> > index 49240c9..249b0e0 100644
> > --- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.c
> > +++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.c
> > @@ -112,7 +112,7 @@ static void sxgbe_dma_channel_init(void __iomem
> *ioaddr, int cha_num,
> >
> >         dma_addr = dma_rx + ((r_rsize - 1) * SXGBE_DESC_SIZE_BYTES);
> >         writel(lower_32_bits(dma_addr),
> > -              ioaddr + SXGBE_DMA_CHA_RXDESC_LADD_REG(cha_num));
> > +              ioaddr + SXGBE_DMA_CHA_RXDESC_TAILPTR_REG(cha_num));
> >         /* program the ring sizes */
> >         writel(t_rsize - 1, ioaddr +
> SXGBE_DMA_CHA_TXDESC_RINGLEN_REG(cha_num));
> >         writel(r_rsize - 1, ioaddr +
> SXGBE_DMA_CHA_RXDESC_RINGLEN_REG(cha_num));
> > @@ -370,6 +370,17 @@ static void sxgbe_enable_tso(void __iomem *ioaddr,
> u8 chan_num)
> >         writel(ctrl, ioaddr + SXGBE_DMA_CHA_TXCTL_REG(chan_num));
> >  }
> >
> > +static void sxgbe_dma_update_rxdesc_tail_ptr(void __iomem *ioaddr, u8
> chan_num,
> > +                                             dma_addr_t dma_rx_phy, int cur_rx,
> > +                                             int rxsize)
> 
> I think that at some point you should revisit your abstraction, all
> the patches that I see do take a void __iomem * argument as the first
> function argument, you should probably use your driver private context
> here. The day you support a different version of the hardware, there
> might be other differences that need to be taken care of.
> 
I agree with you, it would be more robust for different version of the hardware and make simple function argument.
But most functions of this driver deal with read/write register using ioaddr.
As of now I think it is enough but I'll consider it later.

[snip]

> 
> 
> --
> Florian

--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Francois Romieu May 8, 2014, 8:44 a.m. | #3
Byungho An <bh74.an@samsung.com> :
> Florian Fainelli wrote: 
[...]
> > I think that at some point you should revisit your abstraction, all
> > the patches that I see do take a void __iomem * argument as the first
> > function argument, you should probably use your driver private context
> > here. The day you support a different version of the hardware, there
> > might be other differences that need to be taken care of.
> > 
> I agree with you, it would be more robust for different version of the hardware and make simple function argument.
> But most functions of this driver deal with read/write register using ioaddr.

It does not imply that they should urge on ioaddr.

drivers/net/ethernet/broadcom/tg3.c gets it right and there is no reason
why sxgbe should be different.

> As of now I think it is enough but I'll consider it later.

In the meantime:
1) more use-once function pointers are added
2) their parameter list keeps growing

Please reconsider sooner than later.
Byungho An May 9, 2014, 12:48 a.m. | #4
Francois Romieu wrote :
> Byungho An <bh74.an@samsung.com> :
> > Florian Fainelli wrote:
> [...]
> > > I think that at some point you should revisit your abstraction, all
> > > the patches that I see do take a void __iomem * argument as the first
> > > function argument, you should probably use your driver private context
> > > here. The day you support a different version of the hardware, there
> > > might be other differences that need to be taken care of.
> > >
> > I agree with you, it would be more robust for different version of the
> hardware and make simple function argument.
> > But most functions of this driver deal with read/write register using
> ioaddr.
> 
> It does not imply that they should urge on ioaddr.
> 
> drivers/net/ethernet/broadcom/tg3.c gets it right and there is no reason
> why sxgbe should be different.
> 
I fully understood.

> > As of now I think it is enough but I'll consider it later.
> 
> In the meantime:
> 1) more use-once function pointers are added
> 2) their parameter list keeps growing
> 
> Please reconsider sooner than later.
I'll revisit above things sooner (after this patch set).
Thanks.

> 
> --
> Ueimor

--
To unsubscribe from this list: send the line "unsubscribe linux-samsung-soc" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Patch

diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.c b/drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.c
index 49240c9..249b0e0 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.c
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.c
@@ -112,7 +112,7 @@  static void sxgbe_dma_channel_init(void __iomem *ioaddr, int cha_num,
 
 	dma_addr = dma_rx + ((r_rsize - 1) * SXGBE_DESC_SIZE_BYTES);
 	writel(lower_32_bits(dma_addr),
-	       ioaddr + SXGBE_DMA_CHA_RXDESC_LADD_REG(cha_num));
+	       ioaddr + SXGBE_DMA_CHA_RXDESC_TAILPTR_REG(cha_num));
 	/* program the ring sizes */
 	writel(t_rsize - 1, ioaddr + SXGBE_DMA_CHA_TXDESC_RINGLEN_REG(cha_num));
 	writel(r_rsize - 1, ioaddr + SXGBE_DMA_CHA_RXDESC_RINGLEN_REG(cha_num));
@@ -370,6 +370,17 @@  static void sxgbe_enable_tso(void __iomem *ioaddr, u8 chan_num)
 	writel(ctrl, ioaddr + SXGBE_DMA_CHA_TXCTL_REG(chan_num));
 }
 
+static void sxgbe_dma_update_rxdesc_tail_ptr(void __iomem *ioaddr, u8 chan_num,
+					      dma_addr_t dma_rx_phy, int cur_rx,
+					      int rxsize)
+{
+	u32 reg_val;
+
+	reg_val = (dma_rx_phy & 0xFFFFFFFF) + ((cur_rx % rxsize) *
+					       SXGBE_DESC_SIZE_BYTES);
+	writel(reg_val, ioaddr + SXGBE_DMA_CHA_RXDESC_TAILPTR_REG(chan_num));
+}
+
 static const struct sxgbe_dma_ops sxgbe_dma_ops = {
 	.init				= sxgbe_dma_init,
 	.cha_init			= sxgbe_dma_channel_init,
@@ -386,6 +397,7 @@  static const struct sxgbe_dma_ops sxgbe_dma_ops = {
 	.rx_dma_int_status		= sxgbe_rx_dma_int_status,
 	.rx_watchdog			= sxgbe_dma_rx_watchdog,
 	.enable_tso			= sxgbe_enable_tso,
+	.update_rxdesc_tail_ptr		= sxgbe_dma_update_rxdesc_tail_ptr,
 };
 
 const struct sxgbe_dma_ops *sxgbe_get_dma_ops(void)
diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.h b/drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.h
index 843fa9b..a06e01e 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.h
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.h
@@ -43,6 +43,10 @@  struct sxgbe_dma_ops {
 	void (*rx_watchdog)(void __iomem *ioaddr, u32 riwt);
 	/* Enable TSO for each DMA channel */
 	void (*enable_tso)(void __iomem *ioaddr, u8 chan_num);
+	void (*update_rxdesc_tail_ptr)(void __iomem *ioaddr, u8 chan_num,
+				       dma_addr_t dma_rx, int r_rentry,
+				       int r_rsize);
+
 };
 
 const struct sxgbe_dma_ops *sxgbe_get_dma_ops(void);
diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c b/drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c
index 93bf151..7dc3449 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c
@@ -1521,6 +1521,7 @@  static int sxgbe_rx(struct sxgbe_priv_data *priv, int limit)
 		skb_put(skb, frame_len);
 
 		skb->ip_summed = checksum;
+		skb->protocol = eth_type_trans(skb, priv->dev);
 		if (checksum == CHECKSUM_NONE)
 			netif_receive_skb(skb);
 		else
@@ -1530,6 +1531,10 @@  static int sxgbe_rx(struct sxgbe_priv_data *priv, int limit)
 	}
 
 	sxgbe_rx_refill(priv);
+	priv->hw->dma->update_rxdesc_tail_ptr(priv->ioaddr, qnum,
+					      priv->rxq[qnum]->dma_rx_phy,
+					      priv->rxq[qnum]->cur_rx,
+					      priv->dma_rx_size);
 
 	return count;
 }