[PATCH 3/3] net: sxgbe: fixed mtl and dma channel feature

2014-05-08 Thread Byungho An

This patch fixes mtl queue and dma channel value
and adds mtl qsize for FIFO setting.

Signed-off-by: Byungho An 
---
 drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c |   13 +
 1 file changed, 9 insertions(+), 4 deletions(-)

diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c 
b/drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c
index 7dc3449..bf4447a 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c
@@ -889,14 +889,19 @@ static int sxgbe_get_hw_features(struct sxgbe_priv_data * 
const priv)
/* Read First Capability Register CAP[2] */
rval = priv->hw->mac->get_hw_feature(priv->ioaddr, 2);
if (rval) {
-   features->rx_mtl_queues = SXGBE_HW_FEAT_RX_MTL_QUEUES(rval);
-   features->tx_mtl_queues = SXGBE_HW_FEAT_TX_MTL_QUEUES(rval);
-   features->rx_dma_channels = SXGBE_HW_FEAT_RX_DMA_CHANNELS(rval);
-   features->tx_dma_channels = SXGBE_HW_FEAT_TX_DMA_CHANNELS(rval);
+   features->rx_mtl_queues = SXGBE_HW_FEAT_RX_MTL_QUEUES(rval) + 1;
+   features->tx_mtl_queues = SXGBE_HW_FEAT_TX_MTL_QUEUES(rval) + 1;
+   features->rx_dma_channels = SXGBE_HW_FEAT_RX_DMA_CHANNELS(rval) 
+ 1;
+   features->tx_dma_channels = SXGBE_HW_FEAT_TX_DMA_CHANNELS(rval) 
+ 1;
features->pps_output_count = SXGBE_HW_FEAT_PPS_OUTPUTS(rval);
features->aux_input_count = SXGBE_HW_FEAT_AUX_SNAPSHOTS(rval);
}
 
+   features->rx_mtl_qsize = (1 << (features->rxfifo_size + 7)) /
+ features->rx_mtl_queues;
+   features->tx_mtl_qsize = (1 << (features->txfifo_size + 7)) /
+ features->tx_mtl_queues;
+
return rval;
 }
 
-- 
1.7.10.4


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


[PATCH 1/3] net: sxgbe: Added condition for non fix_burst mode

2014-05-08 Thread Byungho An

This patch adds the condition for non fixed burst mode
and seperates into two conditions for pbl value.

Signed-off-by: Byungho An 
---
 drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.c  |   32 ---
 drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.h  |2 +-
 drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c |3 ++-
 3 files changed, 32 insertions(+), 5 deletions(-)

diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.c 
b/drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.c
index bb9b5b8..49240c9 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.c
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.c
@@ -45,7 +45,8 @@ static int sxgbe_dma_init(void __iomem *ioaddr, int 
fix_burst, int burst_map)
 
 static void sxgbe_dma_channel_init(void __iomem *ioaddr, int cha_num,
   int fix_burst, int pbl, dma_addr_t dma_tx,
-  dma_addr_t dma_rx, int t_rsize, int r_rsize)
+  dma_addr_t dma_rx, int t_rsize, int r_rsize,
+  int buf_size)
 {
u32 reg_val;
dma_addr_t dma_addr;
@@ -57,12 +58,37 @@ static void sxgbe_dma_channel_init(void __iomem *ioaddr, 
int cha_num,
writel(reg_val, ioaddr + SXGBE_DMA_CHA_CTL_REG(cha_num));
/* program the TX pbl */
reg_val = readl(ioaddr + SXGBE_DMA_CHA_TXCTL_REG(cha_num));
-   reg_val |= (pbl << SXGBE_DMA_TXPBL_LSHIFT);
+   reg_val |= pbl << SXGBE_DMA_TXPBL_LSHIFT;
writel(reg_val, ioaddr + SXGBE_DMA_CHA_TXCTL_REG(cha_num));
/* program the RX pbl */
reg_val = readl(ioaddr + SXGBE_DMA_CHA_RXCTL_REG(cha_num));
-   reg_val |= (pbl << SXGBE_DMA_RXPBL_LSHIFT);
+   reg_val |= pbl << SXGBE_DMA_RXPBL_LSHIFT;
writel(reg_val, ioaddr + SXGBE_DMA_CHA_RXCTL_REG(cha_num));
+   } else {
+   if (pbl > 32) {
+   /* program the pblx8  */
+   reg_val |= SXGBE_DMA_PBL_X8MODE;
+   writel(reg_val, ioaddr + 
SXGBE_DMA_CHA_CTL_REG(cha_num));
+   /* program the TX pbl */
+   reg_val = readl(ioaddr + 
SXGBE_DMA_CHA_TXCTL_REG(cha_num));
+   reg_val |= (pbl >> 3) << SXGBE_DMA_TXPBL_LSHIFT;
+   writel(reg_val, ioaddr + 
SXGBE_DMA_CHA_TXCTL_REG(cha_num));
+   /* program the RX pbl */
+   reg_val = readl(ioaddr + 
SXGBE_DMA_CHA_RXCTL_REG(cha_num));
+   reg_val |= (pbl >> 3) << SXGBE_DMA_RXPBL_LSHIFT |
+  buf_size << SXGBE_DMA_BLENMAP_LSHIFT;
+   writel(reg_val, ioaddr + 
SXGBE_DMA_CHA_RXCTL_REG(cha_num));
+   } else {
+   /* program the TX pbl */
+   reg_val = readl(ioaddr + 
SXGBE_DMA_CHA_TXCTL_REG(cha_num));
+   reg_val |= pbl << SXGBE_DMA_TXPBL_LSHIFT;
+   writel(reg_val, ioaddr + 
SXGBE_DMA_CHA_TXCTL_REG(cha_num));
+   /* program the RX pbl */
+   reg_val = readl(ioaddr + 
SXGBE_DMA_CHA_RXCTL_REG(cha_num));
+   reg_val |= pbl << SXGBE_DMA_RXPBL_LSHIFT |
+  buf_size << SXGBE_DMA_BLENMAP_LSHIFT;
+   writel(reg_val, ioaddr + 
SXGBE_DMA_CHA_RXCTL_REG(cha_num));
+   }
}
 
/* program desc registers */
diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.h 
b/drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.h
index 1607b54..843fa9b 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.h
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.h
@@ -25,7 +25,7 @@ struct sxgbe_dma_ops {
int (*init)(void __iomem *ioaddr, int fix_burst, int burst_map);
void (*cha_init)(void __iomem *ioaddr, int cha_num, int fix_burst,
 int pbl, dma_addr_t dma_tx, dma_addr_t dma_rx,
-int t_rzie, int r_rsize);
+int t_rzie, int r_rsize, int buf_size);
void (*enable_dma_transmission)(void __iomem *ioaddr, int dma_cnum);
void (*enable_dma_irq)(void __iomem *ioaddr, int dma_cnum);
void (*disable_dma_irq)(void __iomem *ioaddr, int dma_cnum);
diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c 
b/drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c
index 82a9a98..93bf151 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c
@@ -944,7 +944,8 @@ static int sxgbe_init_dma_engine(struct sxgbe_priv_data 
*priv)
fixed_burst, pbl,
(priv->txq[queue_num])->dma_tx_phy,
   

[PATCH 2/3] net: sxgbe: Added tail point update

2014-05-08 Thread Byungho An

This patch adds tail point update function for rx path
after rx_refill function. It indicate tail point to rx
dma.

Signed-off-by: Byungho An 
---
 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)
+{
+   u32 reg_val;
+
+   reg_val = (dma_rx_phy & 0x) + ((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 linux-samsung-soc" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH 0/3] net: sxgbe: Added dma related function and non-burst mode support

2014-05-08 Thread Byungho An
This series added 
- functions to update rx descriptor tail pointer 
- non burst mode support
- fixed dma channel feature.


Byungho An (3):
  net: sxgbe: Added condition for non fix_burst mode
  net: sxgbe: Added tail point update
  net: sxgbe: Fixed mtl and dma channel feature

 drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.c  |   46 +--
 drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.h  |6 ++-
 drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c |   21 ---
 3 files changed, 63 insertions(+), 10 deletions(-)

--
1.7.10.4

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


RE: [PATCH] net: sxgbe: Added tail point update

2014-05-08 Thread Byungho An
Francois Romieu wrote :
> Byungho An  :
> > 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 majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


RE: [PATCH] net: sxgbe: Added tail point update

2014-05-07 Thread Byungho An

Florian Fainelli wrote: 
> 2014-05-07 1:14 GMT-07:00 Byungho An :
> >
> > 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 
> > ---
> >  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 linux-samsung-soc" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


RE: [PATCH] net: sxgbe: Added condition for non fix_burst mode

2014-05-07 Thread Byungho An

David Miller wrote:
> Please start numbering your patches and submit patch sets properly.
> 
> You need to provide:
> 
> 1) A header posting with subject "[PATCH 0/${N}] blah blah blah"
>that describes at a high level what the patch series does.
> 
> 2) The patches, in the correct order, numbered in the subject
>line in the format "[PATCH X/${N}] ..."
> 
> Otherwise I have no idea what order the patches are supposed
> to be applied, whether the patches depend upon eachother, and
> if so in what way.
> 
> I'm not applying these sxgbe patches until you start posting
> them properly, thank you.

Ok, I'll repost patches

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


[PATCH] net: sxgbe: fixed mtl and dma channel feature

2014-05-07 Thread Byungho An

This patch fixes mtl queue and dma channel value
and adds mtl qsize for FIFO setting.

Signed-off-by: Byungho An 
---
 drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c |   13 +
 1 file changed, 9 insertions(+), 4 deletions(-)

diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c 
b/drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c
index 7dc3449..bf4447a 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c
@@ -889,14 +889,19 @@ static int sxgbe_get_hw_features(struct sxgbe_priv_data * 
const priv)
/* Read First Capability Register CAP[2] */
rval = priv->hw->mac->get_hw_feature(priv->ioaddr, 2);
if (rval) {
-   features->rx_mtl_queues = SXGBE_HW_FEAT_RX_MTL_QUEUES(rval);
-   features->tx_mtl_queues = SXGBE_HW_FEAT_TX_MTL_QUEUES(rval);
-   features->rx_dma_channels = SXGBE_HW_FEAT_RX_DMA_CHANNELS(rval);
-   features->tx_dma_channels = SXGBE_HW_FEAT_TX_DMA_CHANNELS(rval);
+   features->rx_mtl_queues = SXGBE_HW_FEAT_RX_MTL_QUEUES(rval) + 1;
+   features->tx_mtl_queues = SXGBE_HW_FEAT_TX_MTL_QUEUES(rval) + 1;
+   features->rx_dma_channels = SXGBE_HW_FEAT_RX_DMA_CHANNELS(rval) 
+ 1;
+   features->tx_dma_channels = SXGBE_HW_FEAT_TX_DMA_CHANNELS(rval) 
+ 1;
features->pps_output_count = SXGBE_HW_FEAT_PPS_OUTPUTS(rval);
features->aux_input_count = SXGBE_HW_FEAT_AUX_SNAPSHOTS(rval);
}
 
+   features->rx_mtl_qsize = (1 << (features->rxfifo_size + 7)) /
+ features->rx_mtl_queues;
+   features->tx_mtl_qsize = (1 << (features->txfifo_size + 7)) /
+ features->tx_mtl_queues;
+
return rval;
 }
 
-- 
1.7.10.4


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


[PATCH] net: sxgbe: Added condition for non fix_burst mode

2014-05-07 Thread Byungho An

This patch adds the condition for non fixed burst mode
and separates into two conditions depending on pbl value.

Signed-off-by: Byungho An 
---
 drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.c  |   32 ---
 drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.h  |2 +-
 drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c |3 ++-
 3 files changed, 32 insertions(+), 5 deletions(-)

diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.c 
b/drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.c
index bb9b5b8..49240c9 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.c
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.c
@@ -45,7 +45,8 @@ static int sxgbe_dma_init(void __iomem *ioaddr, int 
fix_burst, int burst_map)
 
 static void sxgbe_dma_channel_init(void __iomem *ioaddr, int cha_num,
   int fix_burst, int pbl, dma_addr_t dma_tx,
-  dma_addr_t dma_rx, int t_rsize, int r_rsize)
+  dma_addr_t dma_rx, int t_rsize, int r_rsize,
+  int buf_size)
 {
u32 reg_val;
dma_addr_t dma_addr;
@@ -57,12 +58,37 @@ static void sxgbe_dma_channel_init(void __iomem *ioaddr, 
int cha_num,
writel(reg_val, ioaddr + SXGBE_DMA_CHA_CTL_REG(cha_num));
/* program the TX pbl */
reg_val = readl(ioaddr + SXGBE_DMA_CHA_TXCTL_REG(cha_num));
-   reg_val |= (pbl << SXGBE_DMA_TXPBL_LSHIFT);
+   reg_val |= pbl << SXGBE_DMA_TXPBL_LSHIFT;
writel(reg_val, ioaddr + SXGBE_DMA_CHA_TXCTL_REG(cha_num));
/* program the RX pbl */
reg_val = readl(ioaddr + SXGBE_DMA_CHA_RXCTL_REG(cha_num));
-   reg_val |= (pbl << SXGBE_DMA_RXPBL_LSHIFT);
+   reg_val |= pbl << SXGBE_DMA_RXPBL_LSHIFT;
writel(reg_val, ioaddr + SXGBE_DMA_CHA_RXCTL_REG(cha_num));
+   } else {
+   if (pbl > 32) {
+   /* program the pblx8  */
+   reg_val |= SXGBE_DMA_PBL_X8MODE;
+   writel(reg_val, ioaddr + 
SXGBE_DMA_CHA_CTL_REG(cha_num));
+   /* program the TX pbl */
+   reg_val = readl(ioaddr + 
SXGBE_DMA_CHA_TXCTL_REG(cha_num));
+   reg_val |= (pbl >> 3) << SXGBE_DMA_TXPBL_LSHIFT;
+   writel(reg_val, ioaddr + 
SXGBE_DMA_CHA_TXCTL_REG(cha_num));
+   /* program the RX pbl */
+   reg_val = readl(ioaddr + 
SXGBE_DMA_CHA_RXCTL_REG(cha_num));
+   reg_val |= (pbl >> 3) << SXGBE_DMA_RXPBL_LSHIFT |
+  buf_size << SXGBE_DMA_BLENMAP_LSHIFT;
+   writel(reg_val, ioaddr + 
SXGBE_DMA_CHA_RXCTL_REG(cha_num));
+   } else {
+   /* program the TX pbl */
+   reg_val = readl(ioaddr + 
SXGBE_DMA_CHA_TXCTL_REG(cha_num));
+   reg_val |= pbl << SXGBE_DMA_TXPBL_LSHIFT;
+   writel(reg_val, ioaddr + 
SXGBE_DMA_CHA_TXCTL_REG(cha_num));
+   /* program the RX pbl */
+   reg_val = readl(ioaddr + 
SXGBE_DMA_CHA_RXCTL_REG(cha_num));
+   reg_val |= pbl << SXGBE_DMA_RXPBL_LSHIFT |
+  buf_size << SXGBE_DMA_BLENMAP_LSHIFT;
+   writel(reg_val, ioaddr + 
SXGBE_DMA_CHA_RXCTL_REG(cha_num));
+   }
}
 
/* program desc registers */
diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.h 
b/drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.h
index 1607b54..843fa9b 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.h
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.h
@@ -25,7 +25,7 @@ struct sxgbe_dma_ops {
int (*init)(void __iomem *ioaddr, int fix_burst, int burst_map);
void (*cha_init)(void __iomem *ioaddr, int cha_num, int fix_burst,
 int pbl, dma_addr_t dma_tx, dma_addr_t dma_rx,
-int t_rzie, int r_rsize);
+int t_rzie, int r_rsize, int buf_size);
void (*enable_dma_transmission)(void __iomem *ioaddr, int dma_cnum);
void (*enable_dma_irq)(void __iomem *ioaddr, int dma_cnum);
void (*disable_dma_irq)(void __iomem *ioaddr, int dma_cnum);
diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c 
b/drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c
index 82a9a98..93bf151 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c
@@ -944,7 +944,8 @@ static int sxgbe_init_dma_engine(struct sxgbe_priv_data 
*priv)
fixed_burst, pbl,
(priv->txq[queue_num])->dma_tx_phy,
   

[PATCH] net: sxgbe: Added tail point update

2014-05-07 Thread Byungho An

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 
---
 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)
+{
+   u32 reg_val;
+
+   reg_val = (dma_rx_phy & 0x) + ((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 linux-samsung-soc" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH] net: sxgbe: Added rxqueue enable function

2014-04-28 Thread Byungho An

This patch adds rxqueue enable function according to number of rxqueue
and adds rxqueue disable function for removing.

Signed-off-by: Byungho An 
---
 drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h |2 ++
 drivers/net/ethernet/samsung/sxgbe/sxgbe_core.c   |   22 +
 drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c   |8 
 drivers/net/ethernet/samsung/sxgbe/sxgbe_reg.h|4 
 4 files changed, 36 insertions(+)

diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h 
b/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h
index 6203c7d..4501964 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h
@@ -358,6 +358,8 @@ struct sxgbe_core_ops {
/* Enable disable checksum offload operations */
void (*enable_rx_csum)(void __iomem *ioaddr);
void (*disable_rx_csum)(void __iomem *ioaddr);
+   void (*enable_rxqueue)(void __iomem *ioaddr, int queue_num);
+   void (*disable_rxqueue)(void __iomem *ioaddr, int queue_num);
 };
 
 const struct sxgbe_core_ops *sxgbe_get_core_ops(void);
diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_core.c 
b/drivers/net/ethernet/samsung/sxgbe/sxgbe_core.c
index c4da7a2..58c3569 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_core.c
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_core.c
@@ -165,6 +165,26 @@ static void sxgbe_core_set_speed(void __iomem *ioaddr, 
unsigned char speed)
writel(tx_cfg, ioaddr + SXGBE_CORE_TX_CONFIG_REG);
 }
 
+static void sxgbe_core_enable_rxqueue(void __iomem *ioaddr, int queue_num)
+{
+   u32 reg_val;
+
+   reg_val = readl(ioaddr + SXGBE_CORE_RX_CTL0_REG);
+   reg_val &= ~(SXGBE_CORE_RXQ_ENABLE_MASK << queue_num);
+   reg_val |= SXGBE_CORE_RXQ_ENABLE;
+   writel(reg_val, ioaddr + SXGBE_CORE_RX_CTL0_REG);
+}
+
+static void sxgbe_core_disable_rxqueue(void __iomem *ioaddr, int queue_num)
+{
+   u32 reg_val;
+
+   reg_val = readl(ioaddr + SXGBE_CORE_RX_CTL0_REG);
+   reg_val &= ~(SXGBE_CORE_RXQ_ENABLE_MASK << queue_num);
+   reg_val |= SXGBE_CORE_RXQ_DISABLE;
+   writel(reg_val, ioaddr + SXGBE_CORE_RX_CTL0_REG);
+}
+
 static void  sxgbe_set_eee_mode(void __iomem *ioaddr)
 {
u32 ctrl;
@@ -254,6 +274,8 @@ static const struct sxgbe_core_ops core_ops = {
.set_eee_pls= sxgbe_set_eee_pls,
.enable_rx_csum = sxgbe_enable_rx_csum,
.disable_rx_csum= sxgbe_disable_rx_csum,
+   .enable_rxqueue = sxgbe_core_enable_rxqueue,
+   .disable_rxqueue= sxgbe_core_disable_rxqueue,
 };
 
 const struct sxgbe_core_ops *sxgbe_get_core_ops(void)
diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c 
b/drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c
index 6ad7b3a..fd5c428 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c
@@ -1076,6 +1076,9 @@ static int sxgbe_open(struct net_device *dev)
 
/* Initialize the MAC Core */
priv->hw->mac->core_init(priv->ioaddr);
+   SXGBE_FOR_EACH_QUEUE(SXGBE_RX_QUEUES, queue_num) {
+   priv->hw->mac->enable_rxqueue(priv->ioaddr, queue_num);
+   }
 
/* Request the IRQ lines */
ret = devm_request_irq(priv->device, priv->irq, sxgbe_common_interrupt,
@@ -2240,9 +2243,14 @@ error_free_netdev:
 int sxgbe_drv_remove(struct net_device *ndev)
 {
struct sxgbe_priv_data *priv = netdev_priv(ndev);
+   u8 queue_num;
 
netdev_info(ndev, "%s: removing driver\n", __func__);
 
+   SXGBE_FOR_EACH_QUEUE(SXGBE_RX_QUEUES, queue_num) {
+   priv->hw->mac->disable_rxqueue(priv->ioaddr, queue_num);
+   }
+
priv->hw->dma->stop_rx(priv->ioaddr, SXGBE_RX_QUEUES);
priv->hw->dma->stop_tx(priv->ioaddr, SXGBE_TX_QUEUES);
 
diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_reg.h 
b/drivers/net/ethernet/samsung/sxgbe/sxgbe_reg.h
index 5a89acb..56f8bf5 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_reg.h
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_reg.h
@@ -52,6 +52,10 @@
 #define SXGBE_CORE_RX_CTL2_REG 0x00A8
 #define SXGBE_CORE_RX_CTL3_REG 0x00AC
 
+#define SXGBE_CORE_RXQ_ENABLE_MASK 0x0003
+#define SXGBE_CORE_RXQ_ENABLE  0x0002
+#define SXGBE_CORE_RXQ_DISABLE 0x
+
 /* Interrupt Registers */
 #define SXGBE_CORE_INT_STATUS_REG  0x00B0
 #define SXGBE_CORE_INT_ENABLE_REG  0x00B4
-- 
1.7.10.4


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


[PATCH] net: sxgbe: Added set function for interrupt on complete

2014-04-28 Thread Byungho An

This patch adds set_rx_int_on_com function for interrupt when
dma is completed.

Signed-off-by: Byungho An 
---
 drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.c |7 +++
 drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.h |3 +++
 drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c |1 +
 3 files changed, 11 insertions(+)

diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.c 
b/drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.c
index d71691b..2686bb5 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.c
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.c
@@ -233,6 +233,12 @@ static void sxgbe_set_rx_owner(struct sxgbe_rx_norm_desc 
*p)
p->rdes23.rx_rd_des23.own_bit = 1;
 }
 
+/* Set Interrupt on completion bit */
+static void sxgbe_set_rx_int_on_com(struct sxgbe_rx_norm_desc *p)
+{
+   p->rdes23.rx_rd_des23.int_on_com = 1;
+}
+
 /* Get the receive frame size */
 static int sxgbe_get_rx_frame_len(struct sxgbe_rx_norm_desc *p)
 {
@@ -498,6 +504,7 @@ static const struct sxgbe_desc_ops desc_ops = {
.init_rx_desc   = sxgbe_init_rx_desc,
.get_rx_owner   = sxgbe_get_rx_owner,
.set_rx_owner   = sxgbe_set_rx_owner,
+   .set_rx_int_on_com  = sxgbe_set_rx_int_on_com,
.get_rx_frame_len   = sxgbe_get_rx_frame_len,
.get_rx_fd_status   = sxgbe_get_rx_fd_status,
.get_rx_ld_status   = sxgbe_get_rx_ld_status,
diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.h 
b/drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.h
index 0226300..1860932 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.h
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.h
@@ -258,6 +258,9 @@ struct sxgbe_desc_ops {
/* Set own bit */
void (*set_rx_owner)(struct sxgbe_rx_norm_desc *p);
 
+   /* Set Interrupt on completion bit */
+   void (*set_rx_int_on_com)(struct sxgbe_rx_norm_desc *p);
+
/* Get the receive frame size */
int (*get_rx_frame_len)(struct sxgbe_rx_norm_desc *p);
 
diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c 
b/drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c
index fd5c428..82a9a98 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c
@@ -1456,6 +1456,7 @@ static void sxgbe_rx_refill(struct sxgbe_priv_data *priv)
/* Added memory barrier for RX descriptor modification */
wmb();
priv->hw->desc->set_rx_owner(p);
+   priv->hw->desc->set_rx_int_on_com(p);
/* Added memory barrier for RX descriptor modification */
wmb();
}
-- 
1.7.10.4


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


[PATCH] net: sxgbe: sw reset moved to probe function

2014-04-28 Thread Byungho An

This patch moves sw reset to probe function because
sw reset is needed early stage before open function.

Signed-off-by: Byungho An 
---
 drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.c  |   13 -
 drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c |   22 ++
 2 files changed, 22 insertions(+), 13 deletions(-)

diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.c 
b/drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.c
index 4d989ff..bb9b5b8 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.c
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.c
@@ -23,21 +23,8 @@
 /* DMA core initialization */
 static int sxgbe_dma_init(void __iomem *ioaddr, int fix_burst, int burst_map)
 {
-   int retry_count = 10;
u32 reg_val;
 
-   /* reset the DMA */
-   writel(SXGBE_DMA_SOFT_RESET, ioaddr + SXGBE_DMA_MODE_REG);
-   while (retry_count--) {
-   if (!(readl(ioaddr + SXGBE_DMA_MODE_REG) &
- SXGBE_DMA_SOFT_RESET))
-   break;
-   mdelay(10);
-   }
-
-   if (retry_count < 0)
-   return -EBUSY;
-
reg_val = readl(ioaddr + SXGBE_DMA_SYSBUS_MODE_REG);
 
/* if fix_burst = 0, Set UNDEF = 1 of DMA_Sys_Mode Register.
diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c 
b/drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c
index 27e8c82..6ad7b3a 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c
@@ -2070,6 +2070,24 @@ static int sxgbe_hw_init(struct sxgbe_priv_data * const 
priv)
return 0;
 }
 
+static int sxgbe_sw_reset(void __iomem *addr)
+{
+   int retry_count = 10;
+
+   writel(SXGBE_DMA_SOFT_RESET, addr + SXGBE_DMA_MODE_REG);
+   while (retry_count--) {
+   if (!(readl(addr + SXGBE_DMA_MODE_REG) &
+ SXGBE_DMA_SOFT_RESET))
+   break;
+   mdelay(10);
+   }
+
+   if (retry_count < 0)
+   return -EBUSY;
+
+   return 0;
+}
+
 /**
  * sxgbe_drv_probe
  * @device: device pointer
@@ -2102,6 +2120,10 @@ struct sxgbe_priv_data *sxgbe_drv_probe(struct device 
*device,
priv->plat = plat_dat;
priv->ioaddr = addr;
 
+   ret = sxgbe_sw_reset(priv->ioaddr);
+   if (ret)
+   goto error_free_netdev;
+
/* Verify driver arguments */
sxgbe_verify_args();
 
-- 
1.7.10.4


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


[PATCH] net: sxgbe: Added phy_found error path

2014-04-18 Thread Byungho An

This patch adds phy_found error path when there is no phy device 
and changes bus_name.

Signed-off-by: Byungho An 
---
 drivers/net/ethernet/samsung/sxgbe/sxgbe_mdio.c |   14 --
 1 file changed, 12 insertions(+), 2 deletions(-)

diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_mdio.c 
b/drivers/net/ethernet/samsung/sxgbe/sxgbe_mdio.c
index 01af2cb..7dcaf1a 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_mdio.c
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_mdio.c
@@ -27,7 +27,7 @@
 #define SXGBE_SMA_PREAD_CMD0x02 /* post read  increament address */
 #define SXGBE_SMA_READ_CMD 0x03 /* read command */
 #define SXGBE_SMA_SKIP_ADDRFRM 0x0004 /* skip the address frame */
-#define SXGBE_MII_BUSY 0x0080 /* mii busy */
+#define SXGBE_MII_BUSY 0x0040 /* mii busy */
 
 static int sxgbe_mdio_busy_wait(void __iomem *ioaddr, unsigned int mii_data)
 {
@@ -147,6 +147,7 @@ int sxgbe_mdio_register(struct net_device *ndev)
struct sxgbe_mdio_bus_data *mdio_data = priv->plat->mdio_bus_data;
int err, phy_addr;
int *irqlist;
+   bool phy_found = false;
bool act;
 
/* allocate the new mdio bus */
@@ -162,7 +163,7 @@ int sxgbe_mdio_register(struct net_device *ndev)
irqlist = priv->mii_irq;
 
/* assign mii bus fields */
-   mdio_bus->name = "samsxgbe";
+   mdio_bus->name = "sxgbe";
mdio_bus->read = &sxgbe_mdio_read;
mdio_bus->write = &sxgbe_mdio_write;
snprintf(mdio_bus->id, MII_BUS_ID_SIZE, "%s-%x",
@@ -216,13 +217,22 @@ int sxgbe_mdio_register(struct net_device *ndev)
netdev_info(ndev, "PHY ID %08x at %d IRQ %s (%s)%s\n",
phy->phy_id, phy_addr, irq_str,
dev_name(&phy->dev), act ? " active" : "");
+   phy_found = true;
}
}
 
+   if (!phy_found) {
+   netdev_err(ndev, "PHY not found\n");
+   goto phyfound_err;
+   }
+
priv->mii = mdio_bus;
 
return 0;
 
+phyfound_err:
+   err = -ENODEV;
+   mdiobus_unregister(mdio_bus);
 mdiobus_err:
mdiobus_free(mdio_bus);
return err;
-- 
1.7.10.4


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


[PATCH] net: sxgbe: rearrange dma descriptor

2014-04-18 Thread Byungho An

This patch moves cksum_ctl to tx_rd_des23 from cksum_pktlen for correct 
checksum 
offloading and modifies size for Tx/Rx descriptor.

Signed-off-by: Byungho An 
---
 drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.c |4 +--
 drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.h |   39 ++-
 2 files changed, 19 insertions(+), 24 deletions(-)

diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.c 
b/drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.c
index e896dbb..d71691b 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.c
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.c
@@ -45,10 +45,10 @@ static void sxgbe_prepare_tx_desc(struct sxgbe_tx_norm_desc 
*p, u8 is_fd,
p->tdes23.tx_rd_des23.first_desc = is_fd;
p->tdes23.tx_rd_des23.buf1_size = buf1_len;
 
-   p->tdes23.tx_rd_des23.tx_pkt_len.cksum_pktlen.total_pkt_len = pkt_len;
+   p->tdes23.tx_rd_des23.tx_pkt_len.pkt_len.total_pkt_len = pkt_len;
 
if (cksum)
-   p->tdes23.tx_rd_des23.tx_pkt_len.cksum_pktlen.cksum_ctl = 
cic_full;
+   p->tdes23.tx_rd_des23.cksum_ctl = cic_full;
 }
 
 /* Set VLAN control information */
diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.h 
b/drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.h
index 838cb9f..0226300 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.h
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.h
@@ -39,22 +39,22 @@ struct sxgbe_tx_norm_desc {
u32 int_on_com:1;
/* TDES3 */
union {
-   u32 tcp_payload_len:18;
+   u16 tcp_payload_len;
struct {
u32 total_pkt_len:15;
u32 reserved1:1;
-   u32 cksum_ctl:2;
-   } cksum_pktlen;
+   } pkt_len;
} tx_pkt_len;
 
-   u32 tse_bit:1;
-   u32 tcp_hdr_len:4;
-   u32 sa_insert_ctl:3;
-   u32 crc_pad_ctl:2;
-   u32 last_desc:1;
-   u32 first_desc:1;
-   u32 ctxt_bit:1;
-   u32 own_bit:1;
+   u16 cksum_ctl:2;
+   u16 tse_bit:1;
+   u16 tcp_hdr_len:4;
+   u16 sa_insert_ctl:3;
+   u16 crc_pad_ctl:2;
+   u16 last_desc:1;
+   u16 first_desc:1;
+   u16 ctxt_bit:1;
+   u16 own_bit:1;
} tx_rd_des23;
 
/* tx write back Desc 2,3 */
@@ -70,25 +70,20 @@ struct sxgbe_tx_norm_desc {
 
 struct sxgbe_rx_norm_desc {
union {
-   u32 rdes0; /* buf1 address */
-   struct {
+   u64 rdes01; /* buf1 address */
+   union {
u32 out_vlan_tag:16;
u32 in_vlan_tag:16;
-   } wb_rx_des0;
-   } rd_wb_des0;
-
-   union {
-   u32 rdes1;  /* buf2 address or buf1[63:32] */
-   u32 rss_hash;   /* Write-back RX */
-   } rd_wb_des1;
+   u32 rss_hash;
+   } rx_wb_des01;
+   } rdes01;
 
union {
/* RX Read format Desc 2,3 */
struct{
/* RDES2 */
-   u32 buf2_addr;
+   u64 buf2_addr:62;
/* RDES3 */
-   u32 buf2_hi_addr:30;
u32 int_on_com:1;
u32 own_bit:1;
} rx_rd_des23;
-- 
1.7.10.4


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


[PATCH net-next] net: sxgbe: fix sparse warnings about static declaration

2014-03-28 Thread Byungho An
From: Byungho An 

This fixes followings:

sparse warnings: (new ones prefixed by >>)

>> drivers/net/ethernet/samsung/sxgbe/sxgbe_platform.c:197:5: 
sparse: symbol 'sxgbe_platform_freeze' was not declared. Should it be static?
>> drivers/net/ethernet/samsung/sxgbe/sxgbe_platform.c:204:5: 
sparse: symbol 'sxgbe_platform_restore' was not declared. Should it be static?
>> drivers/net/ethernet/samsung/sxgbe/sxgbe_platform.c:228:24: 
sparse: symbol 'sxgbe_platform_driver' was not declared. Should it be static?

>> drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c:1795:6: 
sparse: symbol 'sxgbe_get_ops' was not declared. Should it be static?

Reported-by: kbuild test robot 
Signed-off-by: Byungho An 
---
 drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c |2 +-
 drivers/net/ethernet/samsung/sxgbe/sxgbe_platform.c |6 +++---
 2 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c 
b/drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c
index 1869d4c6..ee1fd3c 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c
@@ -2013,7 +2013,7 @@ static const struct net_device_ops sxgbe_netdev_ops = {
 };
 
 /* Get the hardware ops */
-void sxgbe_get_ops(struct sxgbe_ops * const ops_ptr)
+static void sxgbe_get_ops(struct sxgbe_ops * const ops_ptr)
 {
ops_ptr->mac= sxgbe_get_core_ops();
ops_ptr->desc   = sxgbe_get_desc_ops();
diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_platform.c 
b/drivers/net/ethernet/samsung/sxgbe/sxgbe_platform.c
index 94c2cd7..b147d46 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_platform.c
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_platform.c
@@ -200,14 +200,14 @@ static int sxgbe_platform_resume(struct device *dev)
return sxgbe_resume(ndev);
 }
 
-int sxgbe_platform_freeze(struct device *dev)
+static int sxgbe_platform_freeze(struct device *dev)
 {
struct net_device *ndev = dev_get_drvdata(dev);
 
return sxgbe_freeze(ndev);
 }
 
-int sxgbe_platform_restore(struct device *dev)
+static int sxgbe_platform_restore(struct device *dev)
 {
struct net_device *ndev = dev_get_drvdata(dev);
 
@@ -231,7 +231,7 @@ static const struct of_device_id sxgbe_dt_ids[] = {
 };
 MODULE_DEVICE_TABLE(of, sxgbe_dt_ids);
 
-struct platform_driver sxgbe_platform_driver = {
+static struct platform_driver sxgbe_platform_driver = {
.probe  = sxgbe_platform_probe,
.remove = sxgbe_platform_remove,
.driver = {
-- 
1.7.10.4


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


[PATCH net-next] net: sxgbe: fix potential null dereference

2014-03-28 Thread Byungho An
From: Byungho An 

This fixes following:

drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c:1828 sxgbe_hw_init()
error: potential null dereference 'priv->hw'.  (kmalloc returns null)

Reported-by: kbuild test robot 
Signed-off-by: Byungho An 
---
 drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c |   10 --
 1 file changed, 8 insertions(+), 2 deletions(-)

diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c 
b/drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c
index ee1fd3c..a72688e 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c
@@ -2039,11 +2039,13 @@ static void sxgbe_get_ops(struct sxgbe_ops * const 
ops_ptr)
  *  Description: this function checks the HW capability
  *  (if supported) and sets the driver's features.
  */
-static void sxgbe_hw_init(struct sxgbe_priv_data * const priv)
+static int sxgbe_hw_init(struct sxgbe_priv_data * const priv)
 {
u32 ctrl_ids;
 
priv->hw = kmalloc(sizeof(*priv->hw), GFP_KERNEL);
+   if(!priv->hw)
+   return -ENOMEM;
 
/* get the hardware ops */
sxgbe_get_ops(priv->hw);
@@ -2064,6 +2066,8 @@ static void sxgbe_hw_init(struct sxgbe_priv_data * const 
priv)
 
if (priv->hw_cap.rx_csum_offload)
pr_info("RX Checksum offload supported\n");
+
+   return 0;
 }
 
 /**
@@ -2102,7 +2106,9 @@ struct sxgbe_priv_data *sxgbe_drv_probe(struct device 
*device,
sxgbe_verify_args();
 
/* Init MAC and get the capabilities */
-   sxgbe_hw_init(priv);
+   ret = sxgbe_hw_init(priv);
+   if (ret)
+   goto error_free_netdev;
 
/* allocate memory resources for Descriptor rings */
ret = txring_mem_alloc(priv);
-- 
1.7.10.4


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


[PATCH V14 0/7] add new Samsung SXGBE driver

2014-03-25 Thread Byungho An
Hi all,

This is 14th posting for SAMSUNG SXGBE driver.

Changes since v1:
- changed name of driver to SXGbE as per Ben's comment
- squashed Joe's neatening for many stuff in original patches

Changes since v2:
- updated and split binding document as per Mark's comment
- clean up codes as per Joe's comment
- removed unused fields and clean up codes as per Francois's comment
- removed module parameters as per Dave's comment
- moved driver directory to samsung/sxgbe/

Changes since v3:
- fixed Missing a blank line after declarations as per Dave's comment
- clean up codes as per Joe's comment
- removed reference of net_device.{irq, base_addr} as per Francois's comment

Changes since v4:
- updated binding document and DT related function as per Mark's comment

Changes since v5:
- updated binding document and DT related function as per Florian's comment
- fixed typo and shortened code as per Joe's comment

Changes since v6:
- updated TSO related functions as per Rayagond's comment
- updated binding document as per Mark's comment
- removed WoL patch from this patch set

Changes since v7:
- updated TSO related functions as per Rayagond's comment

Changes since v8:
- removed select and depends statement from vendor sub-section as per 
  Dave's comment

Changes since v9:
- removed adv-add-map, force-sf-dma-modei and force-thresh-dma-mode from 
  binding documnet as per Mark's comment

Changes since v10:
- clean up codes as per Francois's comment

Changes since v11:
- clean up mdio_read/write codes as per Francois's comment
- changed irq acquisition error path as per Francois's comment
- updated mdio and platform related codes as per Tomasz'comment
- clean up dma related codes as per Vince's comment

Changes since v12:
- fixed typo

Changes since v13:
- clean up error path codes for irqs as per Francois's comment
- removed unsupported functions for ehttoolirq as per Ben's comment

Byungho An (1):
  MAINTAINERS: add maintainer for Samsung sxgbe driver

Girish K S (1):
  net: sxgbe: add EEE(Energy Efficient Ethernet) for Samsung sxgbe

Siva Reddy (2):
  sxgbe: Add device-tree binding support document
  net: sxgbe: add basic framework for Samsung 10Gb ethernet driver

Vipul Pandya (3):
  net: sxgbe: add TSO support for Samsung sxgbe
  net: sxgbe: add Checksum offload support for Samsung sxgbe
  net: sxgbe: add ethtool related functions support Samsung sxgbe

 .../devicetree/bindings/net/samsung-sxgbe.txt  |   52 +
 MAINTAINERS|9 +
 drivers/net/ethernet/Kconfig   |1 +
 drivers/net/ethernet/Makefile  |1 +
 drivers/net/ethernet/samsung/Kconfig   |   16 +
 drivers/net/ethernet/samsung/Makefile  |5 +
 drivers/net/ethernet/samsung/sxgbe/Kconfig |9 +
 drivers/net/ethernet/samsung/sxgbe/Makefile|4 +
 drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h  |  538 +
 drivers/net/ethernet/samsung/sxgbe/sxgbe_core.c|  262 +++
 drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.c|  515 +
 drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.h|  298 +++
 drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.c |  382 
 drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.h |   50 +
 drivers/net/ethernet/samsung/sxgbe/sxgbe_ethtool.c |  524 +
 drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c| 2310 
 drivers/net/ethernet/samsung/sxgbe/sxgbe_mdio.c|  251 +++
 drivers/net/ethernet/samsung/sxgbe/sxgbe_mtl.c |  254 +++
 drivers/net/ethernet/samsung/sxgbe/sxgbe_mtl.h |  104 +
 .../net/ethernet/samsung/sxgbe/sxgbe_platform.c|  259 +++
 drivers/net/ethernet/samsung/sxgbe/sxgbe_reg.h |  488 +
 drivers/net/ethernet/samsung/sxgbe/sxgbe_xpcs.c|   91 +
 drivers/net/ethernet/samsung/sxgbe/sxgbe_xpcs.h    |   38 +
 include/linux/sxgbe_platform.h |   54 +
 24 files changed, 6515 insertions(+)

Thanks,
Byungho An

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


[PATCH V14 4/7] net: sxgbe: add EEE(Energy Efficient Ethernet) for Samsung sxgbe

2014-03-25 Thread Byungho An
From: Girish K S 

Added support for the EEE(Energy Efficient Ethernet) in 10G ethernet driver.

Signed-off-by: Girish K S 
Neatening-by: Joe Perches 
Signed-off-by: Byungho An 
---
 drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h  |   53 +++
 drivers/net/ethernet/samsung/sxgbe/sxgbe_core.c|   86 +-
 drivers/net/ethernet/samsung/sxgbe/sxgbe_ethtool.c |   47 ++
 drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c|  165 +++-
 .../net/ethernet/samsung/sxgbe/sxgbe_platform.c|6 +
 drivers/net/ethernet/samsung/sxgbe/sxgbe_reg.h |5 +
 6 files changed, 360 insertions(+), 2 deletions(-)

diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h 
b/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h
index cf7ed07..7293c4c 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h
@@ -118,6 +118,33 @@ struct sxgbe_mtl_ops;
 #define RX_PTP_SIGNAL  0x0A
 #define RX_PTP_RESV_MSG0x0F
 
+/* EEE-LPI mode  flags*/
+#define TX_ENTRY_LPI_MODE  0x10
+#define TX_EXIT_LPI_MODE   0x20
+#define RX_ENTRY_LPI_MODE  0x40
+#define RX_EXIT_LPI_MODE   0x80
+
+/* EEE-LPI Interrupt status flag */
+#define LPI_INT_STATUS BIT(5)
+
+/* EEE-LPI Default timer values */
+#define LPI_LINK_STATUS_TIMER  0x3E8
+#define LPI_MAC_WAIT_TIMER 0x00
+
+/* EEE-LPI Control and status definitions */
+#define LPI_CTRL_STATUS_TXABIT(19)
+#define LPI_CTRL_STATUS_PLSDIS BIT(18)
+#define LPI_CTRL_STATUS_PLSBIT(17)
+#define LPI_CTRL_STATUS_LPIEN  BIT(16)
+#define LPI_CTRL_STATUS_TXRSTP BIT(11)
+#define LPI_CTRL_STATUS_RXRSTP BIT(10)
+#define LPI_CTRL_STATUS_RLPIST BIT(9)
+#define LPI_CTRL_STATUS_TLPIST BIT(8)
+#define LPI_CTRL_STATUS_RLPIEX BIT(3)
+#define LPI_CTRL_STATUS_RLPIEN BIT(2)
+#define LPI_CTRL_STATUS_TLPIEX BIT(1)
+#define LPI_CTRL_STATUS_TLPIEN BIT(0)
+
 enum dma_irq_status {
tx_hard_error   = BIT(0),
tx_bump_tc  = BIT(1),
@@ -202,6 +229,13 @@ struct sxgbe_extra_stats {
unsigned long rx_buffer_access_err;
unsigned long rx_data_transfer_err;
 
+   /* EEE-LPI stats */
+   unsigned long tx_lpi_entry_n;
+   unsigned long tx_lpi_exit_n;
+   unsigned long rx_lpi_entry_n;
+   unsigned long rx_lpi_exit_n;
+   unsigned long eee_wakeup_error_n;
+
/* RX specific */
/* L2 error */
unsigned long rx_code_gmii_err;
@@ -299,6 +333,13 @@ struct sxgbe_core_ops {
   unsigned char feature_index);
/* adjust SXGBE speed */
void (*set_speed)(void __iomem *ioaddr, unsigned char speed);
+
+   /* EEE-LPI specific operations */
+   void (*set_eee_mode)(void __iomem *ioaddr);
+   void (*reset_eee_mode)(void __iomem *ioaddr);
+   void (*set_eee_timer)(void __iomem *ioaddr, const int ls,
+ const int tw);
+   void (*set_eee_pls)(void __iomem *ioaddr, const int link);
 };
 
 const struct sxgbe_core_ops *sxgbe_get_core_ops(void);
@@ -355,6 +396,8 @@ struct sxgbe_hw_features {
/* IEEE 1588-2008 */
unsigned int atime_stamp;
 
+   unsigned int eee;
+
unsigned int tx_csum_offload;
unsigned int rx_csum_offload;
unsigned int multi_macaddr;
@@ -438,6 +481,13 @@ struct sxgbe_priv_data {
/* tc control */
int tx_tc;
int rx_tc;
+   /* EEE-LPI specific members */
+   struct timer_list eee_ctrl_timer;
+   bool tx_path_in_lpi_mode;
+   int lpi_irq;
+   int eee_enabled;
+   int eee_active;
+   int tx_lpi_timer;
 };
 
 /* Function prototypes */
@@ -460,4 +510,7 @@ int sxgbe_restore(struct net_device *ndev);
 
 const struct sxgbe_mtl_ops *sxgbe_get_mtl_ops(void);
 
+void sxgbe_disable_eee_mode(struct sxgbe_priv_data * const priv);
+bool sxgbe_eee_init(struct sxgbe_priv_data * const priv);
+
 #endif /* __SXGBE_COMMON_H__ */
diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_core.c 
b/drivers/net/ethernet/samsung/sxgbe/sxgbe_core.c
index 4ad31bb..0164790 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_core.c
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_core.c
@@ -48,11 +48,38 @@ static void sxgbe_core_dump_regs(void __iomem *ioaddr)
 {
 }
 
+static int sxgbe_get_lpi_status(void __iomem *ioaddr, const u32 irq_status)
+{
+   int status = 0;
+   int lpi_status;
+
+   /* Reading this register shall clear all the LPI status bits */
+   lpi_status = readl(ioaddr + SXGBE_CORE_LPI_CTRL_STATUS);
+
+   if (lpi_status & LPI_CTRL_STATUS_TLPIEN)
+   status |= TX_ENTRY_LPI_MODE;
+   if (lpi_status & LPI_CTRL_STATUS_TLPIEX)
+   status |= TX_EXIT_LPI_MODE;
+   if (lpi_status & LPI_CTRL_STATUS_RLPIEN)
+   status |= RX_ENTRY_LPI_MODE;
+   if (lpi_status & LPI_CTRL_STATUS_RLPIEX)
+   status |= RX_EXIT_LPI_MODE;
+
+   return status;
+}
+
 /* Handle extra ev

[PATCH V14 1/7] sxgbe: Add device-tree binding support document

2014-03-25 Thread Byungho An
From: Siva Reddy 

This patch adds binding document for SXGBE ethernet driver via device-tree.

Signed-off-by: Siva Reddy Kallam 
Signed-off-by: Byungho An 
---
 .../devicetree/bindings/net/samsung-sxgbe.txt  |   52 
 1 file changed, 52 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/net/samsung-sxgbe.txt

diff --git a/Documentation/devicetree/bindings/net/samsung-sxgbe.txt 
b/Documentation/devicetree/bindings/net/samsung-sxgbe.txt
new file mode 100644
index 000..989f6c9
--- /dev/null
+++ b/Documentation/devicetree/bindings/net/samsung-sxgbe.txt
@@ -0,0 +1,52 @@
+* Samsung 10G Ethernet driver (SXGBE)
+
+Required properties:
+- compatible: Should be "samsung,sxgbe-v2.0a"
+- reg: Address and length of the register set for the device
+- interrupt-parent: Should be the phandle for the interrupt controller
+  that services interrupts for this device
+- interrupts: Should contain the SXGBE interrupts
+  These interrupts are ordered by fixed and follows variable
+  trasmit DMA interrupts, receive DMA interrupts and lpi interrupt.
+  index 0 - this is fixed common interrupt of SXGBE and it is always
+  available.
+  index 1 to 25 - 8 variable trasmit interrupts, variable 16 receive interrupts
+  and 1 optional lpi interrupt.
+- phy-mode: String, operation mode of the PHY interface.
+  Supported values are: "sgmii", "xgmii".
+- samsung,pbl: Integer, Programmable Burst Length.
+  Supported values are 1, 2, 4, 8, 16, or 32.
+- samsung,burst-map: Integer, Program the possible bursts supported by sxgbe
+  This is an interger and represents allowable DMA bursts when fixed burst.
+  Allowable range is 0x01-0x3F. When this field is set fixed burst is enabled.
+  When fixed length is needed for burst mode, it can be set within allowable
+  range.
+
+Optional properties:
+- mac-address: 6 bytes, mac address
+- max-frame-size: Maximum Transfer Unit (IEEE defined MTU), rather
+ than the maximum frame size.
+
+Example:
+
+   aliases {
+   ethernet0 = <&sxgbe0>;
+   };
+
+   sxgbe0: ethernet@1a04 {
+   compatible = "samsung,sxgbe-v2.0a";
+   reg = <0 0x1a04 0 0x1>;
+   interrupt-parent = <&gic>;
+   interrupts = <0 209 4>, <0 185 4>, <0 186 4>, <0 187 4>,
+<0 188 4>, <0 189 4>, <0 190 4>, <0 191 4>,
+<0 192 4>, <0 193 4>, <0 194 4>, <0 195 4>,
+<0 196 4>, <0 197 4>, <0 198 4>, <0 199 4>,
+<0 200 4>, <0 201 4>, <0 202 4>, <0 203 4>,
+<0 204 4>, <0 205 4>, <0 206 4>, <0 207 4>,
+<0 208 4>, <0 210 4>;
+   samsung,pbl = <0x08>
+   samsung,burst-map = <0x20>
+   mac-address = [ 00 11 22 33 44 55 ]; /* Filled in by U-Boot */
+   max-frame-size = <9000>;
+   phy-mode = "xgmii";
+   };
-- 
1.7.10.4


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


[PATCH V14 6/7] net: sxgbe: add ethtool related functions support Samsung sxgbe

2014-03-25 Thread Byungho An
From: Vipul Pandya 

This patch adds ethtool related functions.

Signed-off-by: Vipul Pandya 
Neatening-by: Joe Perches 
Signed-off-by: Byungho An 
---
 drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h  |   16 +-
 drivers/net/ethernet/samsung/sxgbe/sxgbe_ethtool.c |  433 
 drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c|4 +
 drivers/net/ethernet/samsung/sxgbe/sxgbe_reg.h |6 +
 4 files changed, 458 insertions(+), 1 deletion(-)

diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h 
b/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h
index 4893cfd..6203c7d 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h
@@ -197,6 +197,20 @@ enum dma_irq_status {
 #define SXGBE_FOR_EACH_QUEUE(max_queues, queue_num)\
for (queue_num = 0; queue_num < max_queues; queue_num++)
 
+#define DRV_VERSION "1.0.0"
+
+#define SXGBE_MAX_RX_CHANNELS  16
+#define SXGBE_MAX_TX_CHANNELS  16
+
+#define START_MAC_REG_OFFSET   0x
+#define MAX_MAC_REG_OFFSET 0x0DFC
+#define START_MTL_REG_OFFSET   0x1000
+#define MAX_MTL_REG_OFFSET 0x18FC
+#define START_DMA_REG_OFFSET   0x3000
+#define MAX_DMA_REG_OFFSET 0x38FC
+
+#define REG_SPACE_SIZE 0x2000
+
 /* sxgbe statistics counters */
 struct sxgbe_extra_stats {
/* TX/RX IRQ events */
@@ -482,6 +496,7 @@ struct sxgbe_priv_data {
/* advanced time stamp support */
u32 adv_ts;
int use_riwt;
+   struct ptp_clock *ptp_clock;
 
/* tc control */
int tx_tc;
@@ -517,5 +532,4 @@ const struct sxgbe_mtl_ops *sxgbe_get_mtl_ops(void);
 
 void sxgbe_disable_eee_mode(struct sxgbe_priv_data * const priv);
 bool sxgbe_eee_init(struct sxgbe_priv_data * const priv);
-
 #endif /* __SXGBE_COMMON_H__ */
diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_ethtool.c 
b/drivers/net/ethernet/samsung/sxgbe/sxgbe_ethtool.c
index ca95f1d..0415fa5 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_ethtool.c
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_ethtool.c
@@ -12,11 +12,17 @@
 
 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
 
+#include 
+#include 
 #include 
 #include 
+#include 
 #include 
+#include 
 
 #include "sxgbe_common.h"
+#include "sxgbe_reg.h"
+#include "sxgbe_dma.h"
 
 struct sxgbe_stats {
char stat_string[ETH_GSTRING_LEN];
@@ -32,11 +38,100 @@ struct sxgbe_stats {
 }
 
 static const struct sxgbe_stats sxgbe_gstrings_stats[] = {
+   /* TX/RX IRQ events */
+   SXGBE_STAT(tx_process_stopped_irq),
+   SXGBE_STAT(tx_ctxt_desc_err),
+   SXGBE_STAT(tx_threshold),
+   SXGBE_STAT(rx_threshold),
+   SXGBE_STAT(tx_pkt_n),
+   SXGBE_STAT(rx_pkt_n),
+   SXGBE_STAT(normal_irq_n),
+   SXGBE_STAT(tx_normal_irq_n),
+   SXGBE_STAT(rx_normal_irq_n),
+   SXGBE_STAT(napi_poll),
+   SXGBE_STAT(tx_clean),
+   SXGBE_STAT(tx_reset_ic_bit),
+   SXGBE_STAT(rx_process_stopped_irq),
+   SXGBE_STAT(rx_underflow_irq),
+
+   /* Bus access errors */
+   SXGBE_STAT(fatal_bus_error_irq),
+   SXGBE_STAT(tx_read_transfer_err),
+   SXGBE_STAT(tx_write_transfer_err),
+   SXGBE_STAT(tx_desc_access_err),
+   SXGBE_STAT(tx_buffer_access_err),
+   SXGBE_STAT(tx_data_transfer_err),
+   SXGBE_STAT(rx_read_transfer_err),
+   SXGBE_STAT(rx_write_transfer_err),
+   SXGBE_STAT(rx_desc_access_err),
+   SXGBE_STAT(rx_buffer_access_err),
+   SXGBE_STAT(rx_data_transfer_err),
+
+   /* EEE-LPI stats */
SXGBE_STAT(tx_lpi_entry_n),
SXGBE_STAT(tx_lpi_exit_n),
SXGBE_STAT(rx_lpi_entry_n),
SXGBE_STAT(rx_lpi_exit_n),
SXGBE_STAT(eee_wakeup_error_n),
+
+   /* RX specific */
+   /* L2 error */
+   SXGBE_STAT(rx_code_gmii_err),
+   SXGBE_STAT(rx_watchdog_err),
+   SXGBE_STAT(rx_crc_err),
+   SXGBE_STAT(rx_gaint_pkt_err),
+   SXGBE_STAT(ip_hdr_err),
+   SXGBE_STAT(ip_payload_err),
+   SXGBE_STAT(overflow_error),
+
+   /* L2 Pkt type */
+   SXGBE_STAT(len_pkt),
+   SXGBE_STAT(mac_ctl_pkt),
+   SXGBE_STAT(dcb_ctl_pkt),
+   SXGBE_STAT(arp_pkt),
+   SXGBE_STAT(oam_pkt),
+   SXGBE_STAT(untag_okt),
+   SXGBE_STAT(other_pkt),
+   SXGBE_STAT(svlan_tag_pkt),
+   SXGBE_STAT(cvlan_tag_pkt),
+   SXGBE_STAT(dvlan_ocvlan_icvlan_pkt),
+   SXGBE_STAT(dvlan_osvlan_isvlan_pkt),
+   SXGBE_STAT(dvlan_osvlan_icvlan_pkt),
+   SXGBE_STAT(dvan_ocvlan_icvlan_pkt),
+
+   /* L3/L4 Pkt type */
+   SXGBE_STAT(not_ip_pkt),
+   SXGBE_STAT(ip4_tcp_pkt),
+   SXGBE_STAT(ip4_udp_pkt),
+   SXGBE_STAT(ip4_icmp_pkt),
+   SXGBE_STAT(ip4_unknown_pkt),
+   SXGBE_STAT(ip6_tcp_pkt),
+   SXGBE_STAT(ip6_udp_pkt),
+   SXGBE_STAT(ip6_icmp_pkt),
+   SXGBE_STAT(ip6_unknown_pkt),
+
+   /* Filter specific */
+   SXGBE_STAT(vlan_filter_match),
+   SXGBE_ST

[PATCH V14 5/7] net: sxgbe: add Checksum offload support for Samsung sxgbe

2014-03-25 Thread Byungho An
From: Vipul Pandya 

This patch adds TX and RX checksum offload support.

Signed-off-by: Vipul Pandya 
Neatening-by: Joe Perches 
Signed-off-by: Byungho An 
---
 drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h |5 +++
 drivers/net/ethernet/samsung/sxgbe/sxgbe_core.c   |   20 +
 drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.h   |2 +-
 drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c   |   46 -
 4 files changed, 61 insertions(+), 12 deletions(-)

diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h 
b/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h
index 7293c4c..4893cfd 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h
@@ -340,6 +340,10 @@ struct sxgbe_core_ops {
void (*set_eee_timer)(void __iomem *ioaddr, const int ls,
  const int tw);
void (*set_eee_pls)(void __iomem *ioaddr, const int link);
+
+   /* Enable disable checksum offload operations */
+   void (*enable_rx_csum)(void __iomem *ioaddr);
+   void (*disable_rx_csum)(void __iomem *ioaddr);
 };
 
 const struct sxgbe_core_ops *sxgbe_get_core_ops(void);
@@ -452,6 +456,7 @@ struct sxgbe_priv_data {
struct sxgbe_ops *hw;   /* sxgbe specific ops */
int no_csum_insertion;
int irq;
+   int rxcsum_insertion;
spinlock_t stats_lock;  /* lock for tx/rx statatics */
 
struct phy_device *phydev;
diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_core.c 
b/drivers/net/ethernet/samsung/sxgbe/sxgbe_core.c
index 0164790..66d4a74 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_core.c
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_core.c
@@ -218,6 +218,24 @@ static void  sxgbe_set_eee_timer(void __iomem *ioaddr,
writel(value, ioaddr + SXGBE_CORE_LPI_TIMER_CTRL);
 }
 
+static void sxgbe_enable_rx_csum(void __iomem *ioaddr)
+{
+   u32 ctrl;
+
+   ctrl = readl(ioaddr + SXGBE_CORE_RX_CONFIG_REG);
+   ctrl |= SXGBE_RX_CSUMOFFLOAD_ENABLE;
+   writel(ctrl, ioaddr + SXGBE_CORE_RX_CONFIG_REG);
+}
+
+static void sxgbe_disable_rx_csum(void __iomem *ioaddr)
+{
+   u32 ctrl;
+
+   ctrl = readl(ioaddr + SXGBE_CORE_RX_CONFIG_REG);
+   ctrl &= ~SXGBE_RX_CSUMOFFLOAD_ENABLE;
+   writel(ctrl, ioaddr + SXGBE_CORE_RX_CONFIG_REG);
+}
+
 const struct sxgbe_core_ops core_ops = {
.core_init  = sxgbe_core_init,
.dump_regs  = sxgbe_core_dump_regs,
@@ -234,6 +252,8 @@ const struct sxgbe_core_ops core_ops = {
.reset_eee_mode = sxgbe_reset_eee_mode,
.set_eee_timer  = sxgbe_set_eee_timer,
.set_eee_pls= sxgbe_set_eee_pls,
+   .enable_rx_csum = sxgbe_enable_rx_csum,
+   .disable_rx_csum= sxgbe_disable_rx_csum,
 };
 
 const struct sxgbe_core_ops *sxgbe_get_core_ops(void)
diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.h 
b/drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.h
index 6d44b9f..838cb9f 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.h
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.h
@@ -113,7 +113,7 @@ struct sxgbe_rx_norm_desc {
/* WB RDES3 */
u32 pkt_len:14;
u32 rdes3_reserved:1;
-   u32 err_summary:15;
+   u32 err_summary:1;
u32 err_l2_type:4;
u32 layer34_pkt_type:4;
u32 no_coagulation_pkt:1;
diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c 
b/drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c
index dc0249b..96b4b2c 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c
@@ -1252,6 +1252,7 @@ void sxgbe_tso_prepare(struct sxgbe_priv_data *priv,
 static netdev_tx_t sxgbe_xmit(struct sk_buff *skb, struct net_device *dev)
 {
unsigned int entry, frag_num;
+   int cksum_flag = 0;
struct netdev_queue *dev_txq;
unsigned txq_index = skb_get_queue_mapping(skb);
struct sxgbe_priv_data *priv = netdev_priv(dev);
@@ -1332,7 +1333,7 @@ static netdev_tx_t sxgbe_xmit(struct sk_buff *skb, struct 
net_device *dev)
   __func__);
 
priv->hw->desc->prepare_tx_desc(tx_desc, 1, no_pagedlen,
-   no_pagedlen, 0);
+   no_pagedlen, 
cksum_flag);
}
}
 
@@ -1350,7 +1351,7 @@ static netdev_tx_t sxgbe_xmit(struct sk_buff *skb, struct 
net_device *dev)
 
/* prepare the descriptor */
priv->hw->desc->prepare_tx_desc(tx_desc, 0, len,
-   len, 0);
+   len, cksum_flag);
/* memory barri

[PATCH V14 7/7] MAINTAINERS: add maintainer for Samsung sxgbe driver

2014-03-25 Thread Byungho An
From: Byungho An 

Signed-off-by: Byungho An 
---
 MAINTAINERS |9 +
 1 file changed, 9 insertions(+)

diff --git a/MAINTAINERS b/MAINTAINERS
index b7befe7..aeb81f2 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -7536,6 +7536,15 @@ S:   Supported
 L: linux-samsung-soc@vger.kernel.org (moderated for non-subscribers)
 F: drivers/clk/samsung/
 
+SAMSUNG SXGBE DRIVERS
+M: Byungho An 
+M: Girish K S 
+M: Siva Reddy Kallam 
+M: Vipul Pandya 
+S: Supported
+L: net...@vger.kernel.org
+F: drivers/net/ethernet/samsung/sxgbe/
+
 SERIAL DRIVERS
 M: Greg Kroah-Hartman 
 L: linux-ser...@vger.kernel.org
-- 
1.7.10.4


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


[PATCH V14 3/7] net: sxgbe: add TSO support for Samsung sxgbe

2014-03-25 Thread Byungho An
From: Vipul Pandya 

Enable TSO during initialization for each DMA channels

Signed-off-by: Vipul Pandya 
Neatening-by: Joe Perches 
Signed-off-by: Byungho An 
---
 drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h |1 +
 drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.c   |2 +-
 drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.h   |4 +-
 drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.c|   10 +++
 drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.h|2 +
 drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c   |   84 +++--
 6 files changed, 92 insertions(+), 11 deletions(-)

diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h 
b/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h
index c7803f1..cf7ed07 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h
@@ -330,6 +330,7 @@ struct sxgbe_tx_queue {
u32 tx_coal_frames;
u32 tx_coal_timer;
int hwts_tx_en;
+   u16 prev_mss;
u8 queue_no;
 };
 
diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.c 
b/drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.c
index 7cb5520..e896dbb 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.c
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.c
@@ -133,7 +133,7 @@ static int sxgbe_tx_ctxt_desc_get_owner(struct 
sxgbe_tx_ctxt_desc *p)
 }
 
 /* Set TX mss in TX context Descriptor */
-static void sxgbe_tx_ctxt_desc_set_mss(struct sxgbe_tx_ctxt_desc *p, int mss)
+static void sxgbe_tx_ctxt_desc_set_mss(struct sxgbe_tx_ctxt_desc *p, u16 mss)
 {
p->maxseg_size = mss;
 }
diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.h 
b/drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.h
index 2caef1a..6d44b9f 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.h
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.h
@@ -168,7 +168,7 @@ struct sxgbe_desc_ops {
 
/* Invoked by the xmit function to prepare the tx descriptor */
void (*tx_desc_enable_tse)(struct sxgbe_tx_norm_desc *p, u8 is_tse,
-  u32 total_hdr_len, u32 payload_len,
+  u32 total_hdr_len, u32 tcp_hdr_len,
   u32 tcp_payload_len);
 
/* Assign buffer lengths for descriptor */
@@ -217,7 +217,7 @@ struct sxgbe_desc_ops {
int (*get_tx_ctxt_owner)(struct sxgbe_tx_ctxt_desc *p);
 
/* Set TX mss */
-   void (*tx_ctxt_desc_set_mss)(struct sxgbe_tx_ctxt_desc *p, int mss);
+   void (*tx_ctxt_desc_set_mss)(struct sxgbe_tx_ctxt_desc *p, u16 mss);
 
/* Set TX mss */
int (*tx_ctxt_desc_get_mss)(struct sxgbe_tx_ctxt_desc *p);
diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.c 
b/drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.c
index 59d2d39..28f89c4 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.c
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.c
@@ -349,6 +349,15 @@ static void sxgbe_dma_rx_watchdog(void __iomem *ioaddr, 
u32 riwt)
}
 }
 
+static void sxgbe_enable_tso(void __iomem *ioaddr, u8 chan_num)
+{
+   u32 ctrl;
+
+   ctrl = readl(ioaddr + SXGBE_DMA_CHA_TXCTL_REG(chan_num));
+   ctrl |= SXGBE_DMA_CHA_TXCTL_TSE_ENABLE;
+   writel(ctrl, ioaddr + SXGBE_DMA_CHA_TXCTL_REG(chan_num));
+}
+
 static const struct sxgbe_dma_ops sxgbe_dma_ops = {
.init   = sxgbe_dma_init,
.cha_init   = sxgbe_dma_channel_init,
@@ -364,6 +373,7 @@ static const struct sxgbe_dma_ops sxgbe_dma_ops = {
.tx_dma_int_status  = sxgbe_tx_dma_int_status,
.rx_dma_int_status  = sxgbe_rx_dma_int_status,
.rx_watchdog= sxgbe_dma_rx_watchdog,
+   .enable_tso = sxgbe_enable_tso,
 };
 
 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 bbf167e..1607b54 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.h
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.h
@@ -41,6 +41,8 @@ struct sxgbe_dma_ops {
 struct sxgbe_extra_stats *x);
/* Program the HW RX Watchdog */
void (*rx_watchdog)(void __iomem *ioaddr, u32 riwt);
+   /* Enable TSO for each DMA channel */
+   void (*enable_tso)(void __iomem *ioaddr, u8 chan_num);
 };
 
 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 75ba57c..20b9b2b 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c
@@ -1096,6 +1096,28 @@ static int sxgbe_release(struct net_device *dev)
return 0;
 }
 
+/* Prepare first Tx descriptor for doing TSO operation */
+void sxgbe_tso_prepare(struct sxgbe_priv_data *priv,
+  str

RE: [PATCH V13 2/7] net: sxgbe: add basic framework for Samsung 10Gb ethernet driver

2014-03-25 Thread Byungho An
Francois Romieu :
> Byungho An  :
> [...]
> > How about below ?
> 
> The for loops should be unrolled.
> 
> (style: no need to join before branching)
> 
> I must go to work, so you'll have to fill the dots in the code below:
> 
> priv = sxgbe_drv_probe(&(pdev->dev), plat_dat, addr);
> if (!priv) {
> pr_err("%s: main driver probe failed\n", __func__);
> goto err_something;
> }
> 
> /* Get the SXGBE common INT information */
> priv->irq  = irq_of_parse_and_map(node, 0);
> if (priv->irq <= 0) {
> dev_err(dev, "sxgbe common irq parsing failed\n");
> goto err_drv_remove;
> }
> 
> /* Get the TX/RX IRQ numbers */
> for (i = 0, chan = 1; i < SXGBE_TX_QUEUES; i++) {
> priv->txq[i]->irq_no = irq_of_parse_and_map(node, chan++);
> if (priv->txq[i]->irq_no <= 0) {
> dev_err(dev, "sxgbe tx irq parsing failed\n");
> goto err_tx_irq_unmap;
> }
> }
> 
> for (i = 0; i < SXGBE_RX_QUEUES; i++) {
> priv->rxq[i]->irq_no = irq_of_parse_and_map(node, chan++);
> if (priv->rxq[i]->irq_no <= 0) {
> dev_err(dev, "sxgbe rx irq parsing failed\n");
> goto err_rx_irq_unmap;
> }
> }
> 
> platform_set_drvdata(pdev, priv->dev);
> 
> pr_debug("platform driver registration completed\n");
> 
> return 0;
> 
> err_rx_irq_unmap:
>   /* TODO: check that 'i' isn't unsigned. */
>   while (i--)
>   irq_dispose_mapping(priv->rx[i]->irq_no);
>   i = SXGBE_TX_QUEUES;
> err_tx_irq_unmap:
>   while (i--)
>   irq_dispose_mapping(priv->tx[i]->irq_no);
>   irq_dispose_mapping(priv->irq);
> err_drv_remove:
> sxgbe_drv_remove(ndev);
> err_something:
>   ...
> 
OK, thanks
> --
> Ueimor

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


RE: [PATCH V13 2/7] net: sxgbe: add basic framework for Samsung 10Gb ethernet driver

2014-03-24 Thread Byungho An
Francois Romieu  :
> > +static int sxgbe_platform_probe(struct platform_device *pdev)
> [...]
> > +   /* Get the SXGBE common INT information */
> > +   priv->irq  = irq_of_parse_and_map(node, 0);
> > +   if (priv->irq <= 0) {
> > +   dev_err(dev, "sxgbe common irq parsing failed\n");
> > +   irq_dispose_mapping(priv->irq);
> > +   sxgbe_drv_remove(ndev);
> 
> sxgbe_drv_probe has not been issued at this point.
I missed, sxgbe_drv_probe will be moved before that.

> 
> > +   return -EINVAL;
> > +   }
> > +
> > +   /* Get the TX/RX IRQ numbers */
> > +   for (i = 0, chan = 1; i < SXGBE_TX_QUEUES; i++) {
> > +   priv->txq[i]->irq_no = irq_of_parse_and_map(node, chan++);
> > +   if (priv->txq[i]->irq_no <= 0) {
> > +   dev_err(dev, "sxgbe tx irq parsing failed\n");
> > +   irq_dispose_mapping(priv->txq[i]->irq_no);
> 
> Releasing the failed irq_no and leaking the i - 1  succeeded ones can't be
right.
> 
> > +   sxgbe_drv_remove(ndev);
> 
> Sic.
> 
> > +   return -EINVAL;
> > +   }
> > +   }
> > +
> > +   for (i = 0; i < SXGBE_RX_QUEUES; i++) {
> > +   priv->rxq[i]->irq_no = irq_of_parse_and_map(node, chan++);
> > +   if (priv->rxq[i]->irq_no <= 0) {
> > +   dev_err(dev, "sxgbe rx irq parsing failed\n");
> > +   irq_dispose_mapping(priv->rxq[i]->irq_no);
> > +   sxgbe_drv_remove(ndev);
> 
> Same problem(s) as above + priv->txq[.]->irq_no leak.
> 
> Please use goto for the unwind path.

How about below?
[snip]

priv = sxgbe_drv_probe(&(pdev->dev), plat_dat, addr);
if (!priv) {
pr_err("%s: main driver probe failed\n", __func__);
goto err_out;
}

/* Get the SXGBE common INT information */
priv->irq  = irq_of_parse_and_map(node, 0);
if (priv->irq <= 0) {
dev_err(dev, "sxgbe common irq parsing failed\n");
goto err_irq_unmap;
}

/* Get the TX/RX IRQ numbers */
for (i = 0, chan = 1; i < SXGBE_TX_QUEUES; i++) {
priv->txq[i]->irq_no = irq_of_parse_and_map(node, chan++);
if (priv->txq[i]->irq_no <= 0) {
dev_err(dev, "sxgbe tx irq parsing failed\n");
goto err_irq_unmap;
}
}

for (i = 0; i < SXGBE_RX_QUEUES; i++) {
priv->rxq[i]->irq_no = irq_of_parse_and_map(node, chan++);
if (priv->rxq[i]->irq_no <= 0) {
dev_err(dev, "sxgbe rx irq parsing failed\n");
goto err_irq_unmap;
}
}

platform_set_drvdata(pdev, priv->dev);

pr_debug("platform driver registration completed\n");

return 0;

err_irq_unmap:
if (priv->irq != NO_IRQ)
irq_dispose_mapping(priv->irq);
if (priv->txq[i - 1]->irq_no != NO_IRQ)
irq_dispose_mapping(priv->txq[i - 1]->irq_no);
if (priv->rxq[i - 1]->irq_no != NO_IRQ)
irq_dispose_mapping(priv->rxq[i - 1]->irq_no);
err_out:
sxgbe_drv_remove(ndev);
return -ENODEV
[snip]

> 
> > +   return -EINVAL;
> > +   }
> > +   }
> > +
> > +   priv = sxgbe_drv_probe(&(pdev->dev), plat_dat, addr);
> > +   if (!priv) {
> > +   pr_err("%s: main driver probe failed\n", __func__);
> > +   return -ENODEV;
> 
> The error path is wrong.
> 
> --
> Ueimor

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


[PATCH V13 4/7] net: sxgbe: add EEE(Energy Efficient Ethernet) for Samsung sxgbe

2014-03-23 Thread Byungho An
From: Girish K S 

Added support for the EEE(Energy Efficient Ethernet) in 10G ethernet driver.

Signed-off-by: Girish K S 
Neatening-by: Joe Perches 
Signed-off-by: Byungho An 
---
 drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h  |   53 +++
 drivers/net/ethernet/samsung/sxgbe/sxgbe_core.c|   86 +-
 drivers/net/ethernet/samsung/sxgbe/sxgbe_ethtool.c |   47 ++
 drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c|  165 +++-
 .../net/ethernet/samsung/sxgbe/sxgbe_platform.c|8 +
 drivers/net/ethernet/samsung/sxgbe/sxgbe_reg.h |5 +
 6 files changed, 362 insertions(+), 2 deletions(-)

diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h 
b/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h
index ec5271d..58e1ace 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h
@@ -115,6 +115,33 @@ struct sxgbe_mtl_ops;
 #define RX_PTP_SIGNAL  0x0A
 #define RX_PTP_RESV_MSG0x0F
 
+/* EEE-LPI mode  flags*/
+#define TX_ENTRY_LPI_MODE  0x10
+#define TX_EXIT_LPI_MODE   0x20
+#define RX_ENTRY_LPI_MODE  0x40
+#define RX_EXIT_LPI_MODE   0x80
+
+/* EEE-LPI Interrupt status flag */
+#define LPI_INT_STATUS BIT(5)
+
+/* EEE-LPI Default timer values */
+#define LPI_LINK_STATUS_TIMER  0x3E8
+#define LPI_MAC_WAIT_TIMER 0x00
+
+/* EEE-LPI Control and status definitions */
+#define LPI_CTRL_STATUS_TXABIT(19)
+#define LPI_CTRL_STATUS_PLSDIS BIT(18)
+#define LPI_CTRL_STATUS_PLSBIT(17)
+#define LPI_CTRL_STATUS_LPIEN  BIT(16)
+#define LPI_CTRL_STATUS_TXRSTP BIT(11)
+#define LPI_CTRL_STATUS_RXRSTP BIT(10)
+#define LPI_CTRL_STATUS_RLPIST BIT(9)
+#define LPI_CTRL_STATUS_TLPIST BIT(8)
+#define LPI_CTRL_STATUS_RLPIEX BIT(3)
+#define LPI_CTRL_STATUS_RLPIEN BIT(2)
+#define LPI_CTRL_STATUS_TLPIEX BIT(1)
+#define LPI_CTRL_STATUS_TLPIEN BIT(0)
+
 enum dma_irq_status {
tx_hard_error   = BIT(0),
tx_bump_tc  = BIT(1),
@@ -199,6 +226,13 @@ struct sxgbe_extra_stats {
unsigned long rx_buffer_access_err;
unsigned long rx_data_transfer_err;
 
+   /* EEE-LPI stats */
+   unsigned long tx_lpi_entry_n;
+   unsigned long tx_lpi_exit_n;
+   unsigned long rx_lpi_entry_n;
+   unsigned long rx_lpi_exit_n;
+   unsigned long eee_wakeup_error_n;
+
/* RX specific */
/* L2 error */
unsigned long rx_code_gmii_err;
@@ -296,6 +330,13 @@ struct sxgbe_core_ops {
   unsigned char feature_index);
/* adjust SXGBE speed */
void (*set_speed)(void __iomem *ioaddr, unsigned char speed);
+
+   /* EEE-LPI specific operations */
+   void (*set_eee_mode)(void __iomem *ioaddr);
+   void (*reset_eee_mode)(void __iomem *ioaddr);
+   void (*set_eee_timer)(void __iomem *ioaddr, const int ls,
+ const int tw);
+   void (*set_eee_pls)(void __iomem *ioaddr, const int link);
 };
 
 const struct sxgbe_core_ops *sxgbe_get_core_ops(void);
@@ -352,6 +393,8 @@ struct sxgbe_hw_features {
/* IEEE 1588-2008 */
unsigned int atime_stamp;
 
+   unsigned int eee;
+
unsigned int tx_csum_offload;
unsigned int rx_csum_offload;
unsigned int multi_macaddr;
@@ -435,6 +478,13 @@ struct sxgbe_priv_data {
/* tc control */
int tx_tc;
int rx_tc;
+   /* EEE-LPI specific members */
+   struct timer_list eee_ctrl_timer;
+   bool tx_path_in_lpi_mode;
+   int lpi_irq;
+   int eee_enabled;
+   int eee_active;
+   int tx_lpi_timer;
 };
 
 /* Function prototypes */
@@ -457,4 +507,7 @@ int sxgbe_restore(struct net_device *ndev);
 
 const struct sxgbe_mtl_ops *sxgbe_get_mtl_ops(void);
 
+void sxgbe_disable_eee_mode(struct sxgbe_priv_data * const priv);
+bool sxgbe_eee_init(struct sxgbe_priv_data * const priv);
+
 #endif /* __SXGBE_COMMON_H__ */
diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_core.c 
b/drivers/net/ethernet/samsung/sxgbe/sxgbe_core.c
index 4ad31bb..0164790 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_core.c
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_core.c
@@ -48,11 +48,38 @@ static void sxgbe_core_dump_regs(void __iomem *ioaddr)
 {
 }
 
+static int sxgbe_get_lpi_status(void __iomem *ioaddr, const u32 irq_status)
+{
+   int status = 0;
+   int lpi_status;
+
+   /* Reading this register shall clear all the LPI status bits */
+   lpi_status = readl(ioaddr + SXGBE_CORE_LPI_CTRL_STATUS);
+
+   if (lpi_status & LPI_CTRL_STATUS_TLPIEN)
+   status |= TX_ENTRY_LPI_MODE;
+   if (lpi_status & LPI_CTRL_STATUS_TLPIEX)
+   status |= TX_EXIT_LPI_MODE;
+   if (lpi_status & LPI_CTRL_STATUS_RLPIEN)
+   status |= RX_ENTRY_LPI_MODE;
+   if (lpi_status & LPI_CTRL_STATUS_RLPIEX)
+   status |= RX_EXIT_LPI_MODE;
+
+   return status;
+}
+
 /* Handle extra ev

[PATCH V13 6/7] net: sxgbe: add ethtool related functions support Samsung sxgbe

2014-03-23 Thread Byungho An
From: Vipul Pandya 

This patch adds ethtool related functions.

Signed-off-by: Vipul Pandya 
Neatening-by: Joe Perches 
Signed-off-by: Byungho An 
---
 drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h  |   25 +-
 drivers/net/ethernet/samsung/sxgbe/sxgbe_ethtool.c |  509 +++-
 drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c|5 +
 drivers/net/ethernet/samsung/sxgbe/sxgbe_reg.h |6 +
 4 files changed, 537 insertions(+), 8 deletions(-)

diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h 
b/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h
index 36a72a3..6e8ef39 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h
@@ -42,8 +42,12 @@ struct sxgbe_mtl_ops;
 #define SXGBE_RX_QUEUES   16
 
 /* Max/Min RI Watchdog Timer count value */
-#define SXGBE_MAX_DMA_RIWT 0xff
-#define SXGBE_MIN_DMA_RIWT 0x20
+/* Calculated based how much time does it take to fill 256KB Rx memory
+ * at 10Gb speed at 156MHz clock rate and considered little less then
+ * the actual value.
+ */
+#define SXGBE_MAX_DMA_RIWT 0x70
+#define SXGBE_MIN_DMA_RIWT 0x01
 
 /* Tx coalesce parameters */
 #define SXGBE_COAL_TX_TIMER4
@@ -194,6 +198,20 @@ enum dma_irq_status {
 #define SXGBE_FOR_EACH_QUEUE(max_queues, queue_num)\
for (queue_num = 0; queue_num < max_queues; queue_num++)
 
+#define DRV_VERSION "1.0.0"
+
+#define SXGBE_MAX_RX_CHANNELS  16
+#define SXGBE_MAX_TX_CHANNELS  16
+
+#define START_MAC_REG_OFFSET   0x
+#define MAX_MAC_REG_OFFSET 0x0DFC
+#define START_MTL_REG_OFFSET   0x1000
+#define MAX_MTL_REG_OFFSET 0x18FC
+#define START_DMA_REG_OFFSET   0x3000
+#define MAX_DMA_REG_OFFSET 0x38FC
+
+#define REG_SPACE_SIZE 0x2000
+
 /* sxgbe statistics counters */
 struct sxgbe_extra_stats {
/* TX/RX IRQ events */
@@ -479,6 +497,7 @@ struct sxgbe_priv_data {
/* advanced time stamp support */
u32 adv_ts;
int use_riwt;
+   struct ptp_clock *ptp_clock;
 
/* tc control */
int tx_tc;
@@ -515,4 +534,6 @@ const struct sxgbe_mtl_ops *sxgbe_get_mtl_ops(void);
 void sxgbe_disable_eee_mode(struct sxgbe_priv_data * const priv);
 bool sxgbe_eee_init(struct sxgbe_priv_data * const priv);
 
+int sxgbe_set_flow_ctrl(struct sxgbe_priv_data *priv, int rx, int tx);
+
 #endif /* __SXGBE_COMMON_H__ */
diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_ethtool.c 
b/drivers/net/ethernet/samsung/sxgbe/sxgbe_ethtool.c
index 9083300..471bc89 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_ethtool.c
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_ethtool.c
@@ -12,11 +12,17 @@
 
 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
 
+#include 
+#include 
 #include 
 #include 
+#include 
 #include 
+#include 
 
 #include "sxgbe_common.h"
+#include "sxgbe_reg.h"
+#include "sxgbe_dma.h"
 
 struct sxgbe_stats {
char stat_string[ETH_GSTRING_LEN];
@@ -32,16 +38,105 @@ struct sxgbe_stats {
 }
 
 static const struct sxgbe_stats sxgbe_gstrings_stats[] = {
+   /* TX/RX IRQ events */
+   SXGBE_STAT(tx_process_stopped_irq),
+   SXGBE_STAT(tx_ctxt_desc_err),
+   SXGBE_STAT(tx_threshold),
+   SXGBE_STAT(rx_threshold),
+   SXGBE_STAT(tx_pkt_n),
+   SXGBE_STAT(rx_pkt_n),
+   SXGBE_STAT(normal_irq_n),
+   SXGBE_STAT(tx_normal_irq_n),
+   SXGBE_STAT(rx_normal_irq_n),
+   SXGBE_STAT(napi_poll),
+   SXGBE_STAT(tx_clean),
+   SXGBE_STAT(tx_reset_ic_bit),
+   SXGBE_STAT(rx_process_stopped_irq),
+   SXGBE_STAT(rx_underflow_irq),
+
+   /* Bus access errors */
+   SXGBE_STAT(fatal_bus_error_irq),
+   SXGBE_STAT(tx_read_transfer_err),
+   SXGBE_STAT(tx_write_transfer_err),
+   SXGBE_STAT(tx_desc_access_err),
+   SXGBE_STAT(tx_buffer_access_err),
+   SXGBE_STAT(tx_data_transfer_err),
+   SXGBE_STAT(rx_read_transfer_err),
+   SXGBE_STAT(rx_write_transfer_err),
+   SXGBE_STAT(rx_desc_access_err),
+   SXGBE_STAT(rx_buffer_access_err),
+   SXGBE_STAT(rx_data_transfer_err),
+
+   /* EEE-LPI stats */
SXGBE_STAT(tx_lpi_entry_n),
SXGBE_STAT(tx_lpi_exit_n),
SXGBE_STAT(rx_lpi_entry_n),
SXGBE_STAT(rx_lpi_exit_n),
SXGBE_STAT(eee_wakeup_error_n),
+
+   /* RX specific */
+   /* L2 error */
+   SXGBE_STAT(rx_code_gmii_err),
+   SXGBE_STAT(rx_watchdog_err),
+   SXGBE_STAT(rx_crc_err),
+   SXGBE_STAT(rx_gaint_pkt_err),
+   SXGBE_STAT(ip_hdr_err),
+   SXGBE_STAT(ip_payload_err),
+   SXGBE_STAT(overflow_error),
+
+   /* L2 Pkt type */
+   SXGBE_STAT(len_pkt),
+   SXGBE_STAT(mac_ctl_pkt),
+   SXGBE_STAT(dcb_ctl_pkt),
+   SXGBE_STAT(arp_pkt),
+   SXGBE_STAT(oam_pkt),
+   SXGBE_STAT(untag_okt),
+   SXGBE_STAT(other_pkt),
+   SXGBE_STAT(svlan_tag_pkt),
+   SXGBE_STAT(cvlan_tag_pkt),
+   SX

[PATCH V13 7/7] MAINTAINERS: add maintainer for Samsung sxgbe driver

2014-03-23 Thread Byungho An
From: Byungho An 

Signed-off-by: Byungho An 
---
 MAINTAINERS |9 +
 1 file changed, 9 insertions(+)

diff --git a/MAINTAINERS b/MAINTAINERS
index b7befe7..aeb81f2 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -7536,6 +7536,15 @@ S:   Supported
 L: linux-samsung-soc@vger.kernel.org (moderated for non-subscribers)
 F: drivers/clk/samsung/
 
+SAMSUNG SXGBE DRIVERS
+M: Byungho An 
+M: Girish K S 
+M: Siva Reddy Kallam 
+M: Vipul Pandya 
+S: Supported
+L: net...@vger.kernel.org
+F: drivers/net/ethernet/samsung/sxgbe/
+
 SERIAL DRIVERS
 M: Greg Kroah-Hartman 
 L: linux-ser...@vger.kernel.org
-- 
1.7.10.4


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


[PATCH V13 1/7] sxgbe: Add device-tree binding support document

2014-03-23 Thread Byungho An
From: Siva Reddy 

This patch adds binding document for SXGBE ethernet driver via device-tree.

Signed-off-by: Siva Reddy Kallam 
Signed-off-by: Byungho An 
---
 .../devicetree/bindings/net/samsung-sxgbe.txt  |   52 
 1 file changed, 52 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/net/samsung-sxgbe.txt

diff --git a/Documentation/devicetree/bindings/net/samsung-sxgbe.txt 
b/Documentation/devicetree/bindings/net/samsung-sxgbe.txt
new file mode 100644
index 000..989f6c9
--- /dev/null
+++ b/Documentation/devicetree/bindings/net/samsung-sxgbe.txt
@@ -0,0 +1,52 @@
+* Samsung 10G Ethernet driver (SXGBE)
+
+Required properties:
+- compatible: Should be "samsung,sxgbe-v2.0a"
+- reg: Address and length of the register set for the device
+- interrupt-parent: Should be the phandle for the interrupt controller
+  that services interrupts for this device
+- interrupts: Should contain the SXGBE interrupts
+  These interrupts are ordered by fixed and follows variable
+  trasmit DMA interrupts, receive DMA interrupts and lpi interrupt.
+  index 0 - this is fixed common interrupt of SXGBE and it is always
+  available.
+  index 1 to 25 - 8 variable trasmit interrupts, variable 16 receive interrupts
+  and 1 optional lpi interrupt.
+- phy-mode: String, operation mode of the PHY interface.
+  Supported values are: "sgmii", "xgmii".
+- samsung,pbl: Integer, Programmable Burst Length.
+  Supported values are 1, 2, 4, 8, 16, or 32.
+- samsung,burst-map: Integer, Program the possible bursts supported by sxgbe
+  This is an interger and represents allowable DMA bursts when fixed burst.
+  Allowable range is 0x01-0x3F. When this field is set fixed burst is enabled.
+  When fixed length is needed for burst mode, it can be set within allowable
+  range.
+
+Optional properties:
+- mac-address: 6 bytes, mac address
+- max-frame-size: Maximum Transfer Unit (IEEE defined MTU), rather
+ than the maximum frame size.
+
+Example:
+
+   aliases {
+   ethernet0 = <&sxgbe0>;
+   };
+
+   sxgbe0: ethernet@1a04 {
+   compatible = "samsung,sxgbe-v2.0a";
+   reg = <0 0x1a04 0 0x1>;
+   interrupt-parent = <&gic>;
+   interrupts = <0 209 4>, <0 185 4>, <0 186 4>, <0 187 4>,
+<0 188 4>, <0 189 4>, <0 190 4>, <0 191 4>,
+<0 192 4>, <0 193 4>, <0 194 4>, <0 195 4>,
+<0 196 4>, <0 197 4>, <0 198 4>, <0 199 4>,
+<0 200 4>, <0 201 4>, <0 202 4>, <0 203 4>,
+<0 204 4>, <0 205 4>, <0 206 4>, <0 207 4>,
+<0 208 4>, <0 210 4>;
+   samsung,pbl = <0x08>
+   samsung,burst-map = <0x20>
+   mac-address = [ 00 11 22 33 44 55 ]; /* Filled in by U-Boot */
+   max-frame-size = <9000>;
+   phy-mode = "xgmii";
+   };
-- 
1.7.10.4


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


[PATCH V13 3/7] net: sxgbe: add TSO support for Samsung sxgbe

2014-03-23 Thread Byungho An
From: Vipul Pandya 

Enable TSO during initialization for each DMA channels

Signed-off-by: Vipul Pandya 
Neatening-by: Joe Perches 
Signed-off-by: Byungho An 
---
 drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h |1 +
 drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.c   |2 +-
 drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.h   |4 +-
 drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.c|   10 +++
 drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.h|2 +
 drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c   |   84 +++--
 6 files changed, 92 insertions(+), 11 deletions(-)

diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h 
b/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h
index 3e36ae1..ec5271d 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h
@@ -327,6 +327,7 @@ struct sxgbe_tx_queue {
u32 tx_coal_frames;
u32 tx_coal_timer;
int hwts_tx_en;
+   u16 prev_mss;
u8 queue_no;
 };
 
diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.c 
b/drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.c
index 7cb5520..e896dbb 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.c
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.c
@@ -133,7 +133,7 @@ static int sxgbe_tx_ctxt_desc_get_owner(struct 
sxgbe_tx_ctxt_desc *p)
 }
 
 /* Set TX mss in TX context Descriptor */
-static void sxgbe_tx_ctxt_desc_set_mss(struct sxgbe_tx_ctxt_desc *p, int mss)
+static void sxgbe_tx_ctxt_desc_set_mss(struct sxgbe_tx_ctxt_desc *p, u16 mss)
 {
p->maxseg_size = mss;
 }
diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.h 
b/drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.h
index 2caef1a..6d44b9f 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.h
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.h
@@ -168,7 +168,7 @@ struct sxgbe_desc_ops {
 
/* Invoked by the xmit function to prepare the tx descriptor */
void (*tx_desc_enable_tse)(struct sxgbe_tx_norm_desc *p, u8 is_tse,
-  u32 total_hdr_len, u32 payload_len,
+  u32 total_hdr_len, u32 tcp_hdr_len,
   u32 tcp_payload_len);
 
/* Assign buffer lengths for descriptor */
@@ -217,7 +217,7 @@ struct sxgbe_desc_ops {
int (*get_tx_ctxt_owner)(struct sxgbe_tx_ctxt_desc *p);
 
/* Set TX mss */
-   void (*tx_ctxt_desc_set_mss)(struct sxgbe_tx_ctxt_desc *p, int mss);
+   void (*tx_ctxt_desc_set_mss)(struct sxgbe_tx_ctxt_desc *p, u16 mss);
 
/* Set TX mss */
int (*tx_ctxt_desc_get_mss)(struct sxgbe_tx_ctxt_desc *p);
diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.c 
b/drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.c
index 59d2d39..28f89c4 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.c
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.c
@@ -349,6 +349,15 @@ static void sxgbe_dma_rx_watchdog(void __iomem *ioaddr, 
u32 riwt)
}
 }
 
+static void sxgbe_enable_tso(void __iomem *ioaddr, u8 chan_num)
+{
+   u32 ctrl;
+
+   ctrl = readl(ioaddr + SXGBE_DMA_CHA_TXCTL_REG(chan_num));
+   ctrl |= SXGBE_DMA_CHA_TXCTL_TSE_ENABLE;
+   writel(ctrl, ioaddr + SXGBE_DMA_CHA_TXCTL_REG(chan_num));
+}
+
 static const struct sxgbe_dma_ops sxgbe_dma_ops = {
.init   = sxgbe_dma_init,
.cha_init   = sxgbe_dma_channel_init,
@@ -364,6 +373,7 @@ static const struct sxgbe_dma_ops sxgbe_dma_ops = {
.tx_dma_int_status  = sxgbe_tx_dma_int_status,
.rx_dma_int_status  = sxgbe_rx_dma_int_status,
.rx_watchdog= sxgbe_dma_rx_watchdog,
+   .enable_tso = sxgbe_enable_tso,
 };
 
 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 bbf167e..1607b54 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.h
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.h
@@ -41,6 +41,8 @@ struct sxgbe_dma_ops {
 struct sxgbe_extra_stats *x);
/* Program the HW RX Watchdog */
void (*rx_watchdog)(void __iomem *ioaddr, u32 riwt);
+   /* Enable TSO for each DMA channel */
+   void (*enable_tso)(void __iomem *ioaddr, u8 chan_num);
 };
 
 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 b932175..7b38bd0 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c
@@ -1096,6 +1096,28 @@ static int sxgbe_release(struct net_device *dev)
return 0;
 }
 
+/* Prepare first Tx descriptor for doing TSO operation */
+void sxgbe_tso_prepare(struct sxgbe_priv_data *priv,
+  str

[PATCH V13 5/7] net: sxgbe: add Checksum offload support for Samsung sxgbe

2014-03-23 Thread Byungho An
From: Vipul Pandya 

This patch adds TX and RX checksum offload support.

Signed-off-by: Vipul Pandya 
Neatening-by: Joe Perches 
Signed-off-by: Byungho An 
---
 drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h |5 +++
 drivers/net/ethernet/samsung/sxgbe/sxgbe_core.c   |   20 +
 drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.h   |2 +-
 drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c   |   46 -
 4 files changed, 61 insertions(+), 12 deletions(-)

diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h 
b/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h
index 58e1ace..36a72a3 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h
@@ -337,6 +337,10 @@ struct sxgbe_core_ops {
void (*set_eee_timer)(void __iomem *ioaddr, const int ls,
  const int tw);
void (*set_eee_pls)(void __iomem *ioaddr, const int link);
+
+   /* Enable disable checksum offload operations */
+   void (*enable_rx_csum)(void __iomem *ioaddr);
+   void (*disable_rx_csum)(void __iomem *ioaddr);
 };
 
 const struct sxgbe_core_ops *sxgbe_get_core_ops(void);
@@ -449,6 +453,7 @@ struct sxgbe_priv_data {
struct sxgbe_ops *hw;   /* sxgbe specific ops */
int no_csum_insertion;
int irq;
+   int rxcsum_insertion;
spinlock_t stats_lock;  /* lock for tx/rx statatics */
 
struct phy_device *phydev;
diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_core.c 
b/drivers/net/ethernet/samsung/sxgbe/sxgbe_core.c
index 0164790..66d4a74 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_core.c
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_core.c
@@ -218,6 +218,24 @@ static void  sxgbe_set_eee_timer(void __iomem *ioaddr,
writel(value, ioaddr + SXGBE_CORE_LPI_TIMER_CTRL);
 }
 
+static void sxgbe_enable_rx_csum(void __iomem *ioaddr)
+{
+   u32 ctrl;
+
+   ctrl = readl(ioaddr + SXGBE_CORE_RX_CONFIG_REG);
+   ctrl |= SXGBE_RX_CSUMOFFLOAD_ENABLE;
+   writel(ctrl, ioaddr + SXGBE_CORE_RX_CONFIG_REG);
+}
+
+static void sxgbe_disable_rx_csum(void __iomem *ioaddr)
+{
+   u32 ctrl;
+
+   ctrl = readl(ioaddr + SXGBE_CORE_RX_CONFIG_REG);
+   ctrl &= ~SXGBE_RX_CSUMOFFLOAD_ENABLE;
+   writel(ctrl, ioaddr + SXGBE_CORE_RX_CONFIG_REG);
+}
+
 const struct sxgbe_core_ops core_ops = {
.core_init  = sxgbe_core_init,
.dump_regs  = sxgbe_core_dump_regs,
@@ -234,6 +252,8 @@ const struct sxgbe_core_ops core_ops = {
.reset_eee_mode = sxgbe_reset_eee_mode,
.set_eee_timer  = sxgbe_set_eee_timer,
.set_eee_pls= sxgbe_set_eee_pls,
+   .enable_rx_csum = sxgbe_enable_rx_csum,
+   .disable_rx_csum= sxgbe_disable_rx_csum,
 };
 
 const struct sxgbe_core_ops *sxgbe_get_core_ops(void)
diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.h 
b/drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.h
index 6d44b9f..838cb9f 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.h
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.h
@@ -113,7 +113,7 @@ struct sxgbe_rx_norm_desc {
/* WB RDES3 */
u32 pkt_len:14;
u32 rdes3_reserved:1;
-   u32 err_summary:15;
+   u32 err_summary:1;
u32 err_l2_type:4;
u32 layer34_pkt_type:4;
u32 no_coagulation_pkt:1;
diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c 
b/drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c
index c44464d..e433969 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c
@@ -1252,6 +1252,7 @@ void sxgbe_tso_prepare(struct sxgbe_priv_data *priv,
 static netdev_tx_t sxgbe_xmit(struct sk_buff *skb, struct net_device *dev)
 {
unsigned int entry, frag_num;
+   int cksum_flag = 0;
struct netdev_queue *dev_txq;
unsigned txq_index = skb_get_queue_mapping(skb);
struct sxgbe_priv_data *priv = netdev_priv(dev);
@@ -1332,7 +1333,7 @@ static netdev_tx_t sxgbe_xmit(struct sk_buff *skb, struct 
net_device *dev)
   __func__);
 
priv->hw->desc->prepare_tx_desc(tx_desc, 1, no_pagedlen,
-   no_pagedlen, 0);
+   no_pagedlen, 
cksum_flag);
}
}
 
@@ -1350,7 +1351,7 @@ static netdev_tx_t sxgbe_xmit(struct sk_buff *skb, struct 
net_device *dev)
 
/* prepare the descriptor */
priv->hw->desc->prepare_tx_desc(tx_desc, 0, len,
-   len, 0);
+   len, cksum_flag);
/* memory barri

[PATCH V13 0/7] add new Samsung SXGBE driver

2014-03-23 Thread Byungho An
Hi all,

This is 13th posting for SAMSUNG SXGBE driver.

Changes since v1:
- changed name of driver to SXGbE as per Ben's comment
- squashed Joe's neatening for many stuff in original patches

Changes since v2:
- updated and split binding document as per Mark's comment
- clean up codes as per Joe's comment
- removed unused fields and clean up codes as per Francois's comment
- removed module parameters as per Dave's comment
- moved driver directory to samsung/sxgbe/

Changes since v3:
- fixed Missing a blank line after declarations as per Dave's comment
- clean up codes as per Joe's comment
- removed reference of net_device.{irq, base_addr} as per Francois's comment

Changes since v4:
- updated binding document and DT related function as per Mark's comment

Changes since v5:
- updated binding document and DT related function as per Florian's comment
- fixed typo and shortened code as per Joe's comment

Changes since v6:
- updated TSO related functions as per Rayagond's comment
- updated binding document as per Mark's comment
- removed WoL patch from this patch set

Changes since v7:
- updated TSO related functions as per Rayagond's comment

Changes since v8:
- removed select and depends statement from vendor sub-section as per 
  Dave's comment

Changes since v9:
- removed adv-add-map, force-sf-dma-modei and force-thresh-dma-mode from 
  binding documnet as per Mark's comment

Changes since v10:
- clean up codes as per Francois's comment

Changes since v11:
- clean up mdio_read/write codes as per Francois's comment
- changed irq acquisition error path as per Francois's comment
- updated mdio and platform related codes as per Tomasz'comment
- clean up dma related codes as per Vince's comment

Changes since v12:
- fixed typo

Byungho An (1):
  MAINTAINERS: add maintainer for Samsung sxgbe driver

Girish K S (1):
  net: sxgbe: add EEE(Energy Efficient Ethernet) for Samsung sxgbe

Siva Reddy (2):
  sxgbe: Add device-tree binding support document
  net: sxgbe: add basic framework for Samsung 10Gb ethernet driver

Vipul Pandya (3):
  net: sxgbe: add TSO support for Samsung sxgbe
  net: sxgbe: add Checksum offload support for Samsung sxgbe
  net: sxgbe: add ethtool related functions support Samsung sxgbe

 .../devicetree/bindings/net/samsung-sxgbe.txt  |   52 +
 MAINTAINERS|9 +
 drivers/net/ethernet/Kconfig   |1 +
 drivers/net/ethernet/Makefile  |1 +
 drivers/net/ethernet/samsung/Kconfig   |   16 +
 drivers/net/ethernet/samsung/Makefile  |5 +
 drivers/net/ethernet/samsung/sxgbe/Kconfig |9 +
 drivers/net/ethernet/samsung/sxgbe/Makefile|4 +
 drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h  |  539 +
 drivers/net/ethernet/samsung/sxgbe/sxgbe_core.c|  262 +++
 drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.c|  515 +
 drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.h|  298 +++
 drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.c |  382 
 drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.h |   50 +
 drivers/net/ethernet/samsung/sxgbe/sxgbe_ethtool.c |  588 +
 drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c| 2310 
 drivers/net/ethernet/samsung/sxgbe/sxgbe_mdio.c|  251 +++
 drivers/net/ethernet/samsung/sxgbe/sxgbe_mtl.c |  254 +++
 drivers/net/ethernet/samsung/sxgbe/sxgbe_mtl.h |  104 +
 .../net/ethernet/samsung/sxgbe/sxgbe_platform.c|  254 +++
 drivers/net/ethernet/samsung/sxgbe/sxgbe_reg.h |  488 +
 drivers/net/ethernet/samsung/sxgbe/sxgbe_xpcs.c|   91 +
 drivers/net/ethernet/samsung/sxgbe/sxgbe_xpcs.h|   38 +
 include/linux/sxgbe_platform.h |   54 +
 24 files changed, 6575 insertions(+)

Thanks,
Byungho An

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


[PATCH V12 3/7] net: sxgbe: add TSO support for Samsung sxgbe

2014-03-22 Thread Byungho An
From: Vipul Pandya 

Enable TSO during initialization for each DMA channels

Signed-off-by: Vipul Pandya 
Neatening-by: Joe Perches 
Signed-off-by: Byungho An 
---
 drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h |1 +
 drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.c   |2 +-
 drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.h   |4 +-
 drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.c|   10 +++
 drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.h|2 +
 drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c   |   84 +++--
 6 files changed, 92 insertions(+), 11 deletions(-)

diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h 
b/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h
index 3e36ae1..ec5271d 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h
@@ -327,6 +327,7 @@ struct sxgbe_tx_queue {
u32 tx_coal_frames;
u32 tx_coal_timer;
int hwts_tx_en;
+   u16 prev_mss;
u8 queue_no;
 };
 
diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.c 
b/drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.c
index 7cb5520..e896dbb 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.c
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.c
@@ -133,7 +133,7 @@ static int sxgbe_tx_ctxt_desc_get_owner(struct 
sxgbe_tx_ctxt_desc *p)
 }
 
 /* Set TX mss in TX context Descriptor */
-static void sxgbe_tx_ctxt_desc_set_mss(struct sxgbe_tx_ctxt_desc *p, int mss)
+static void sxgbe_tx_ctxt_desc_set_mss(struct sxgbe_tx_ctxt_desc *p, u16 mss)
 {
p->maxseg_size = mss;
 }
diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.h 
b/drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.h
index 2caef1a..6d44b9f 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.h
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.h
@@ -168,7 +168,7 @@ struct sxgbe_desc_ops {
 
/* Invoked by the xmit function to prepare the tx descriptor */
void (*tx_desc_enable_tse)(struct sxgbe_tx_norm_desc *p, u8 is_tse,
-  u32 total_hdr_len, u32 payload_len,
+  u32 total_hdr_len, u32 tcp_hdr_len,
   u32 tcp_payload_len);
 
/* Assign buffer lengths for descriptor */
@@ -217,7 +217,7 @@ struct sxgbe_desc_ops {
int (*get_tx_ctxt_owner)(struct sxgbe_tx_ctxt_desc *p);
 
/* Set TX mss */
-   void (*tx_ctxt_desc_set_mss)(struct sxgbe_tx_ctxt_desc *p, int mss);
+   void (*tx_ctxt_desc_set_mss)(struct sxgbe_tx_ctxt_desc *p, u16 mss);
 
/* Set TX mss */
int (*tx_ctxt_desc_get_mss)(struct sxgbe_tx_ctxt_desc *p);
diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.c 
b/drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.c
index 59d2d39..28f89c4 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.c
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.c
@@ -349,6 +349,15 @@ static void sxgbe_dma_rx_watchdog(void __iomem *ioaddr, 
u32 riwt)
}
 }
 
+static void sxgbe_enable_tso(void __iomem *ioaddr, u8 chan_num)
+{
+   u32 ctrl;
+
+   ctrl = readl(ioaddr + SXGBE_DMA_CHA_TXCTL_REG(chan_num));
+   ctrl |= SXGBE_DMA_CHA_TXCTL_TSE_ENABLE;
+   writel(ctrl, ioaddr + SXGBE_DMA_CHA_TXCTL_REG(chan_num));
+}
+
 static const struct sxgbe_dma_ops sxgbe_dma_ops = {
.init   = sxgbe_dma_init,
.cha_init   = sxgbe_dma_channel_init,
@@ -364,6 +373,7 @@ static const struct sxgbe_dma_ops sxgbe_dma_ops = {
.tx_dma_int_status  = sxgbe_tx_dma_int_status,
.rx_dma_int_status  = sxgbe_rx_dma_int_status,
.rx_watchdog= sxgbe_dma_rx_watchdog,
+   .enable_tso = sxgbe_enable_tso,
 };
 
 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 bbf167e..1607b54 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.h
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.h
@@ -41,6 +41,8 @@ struct sxgbe_dma_ops {
 struct sxgbe_extra_stats *x);
/* Program the HW RX Watchdog */
void (*rx_watchdog)(void __iomem *ioaddr, u32 riwt);
+   /* Enable TSO for each DMA channel */
+   void (*enable_tso)(void __iomem *ioaddr, u8 chan_num);
 };
 
 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 b932175..7b38bd0 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c
@@ -1096,6 +1096,28 @@ static int sxgbe_release(struct net_device *dev)
return 0;
 }
 
+/* Prepare first Tx descriptor for doing TSO operation */
+void sxgbe_tso_prepare(struct sxgbe_priv_data *priv,
+  str

[PATCH V12 7/7] MAINTAINERS: add maintainer for Samsung sxgbe driver

2014-03-22 Thread Byungho An
From: Byungho An 

Signed-off-by: Byungho An 
---
 MAINTAINERS |9 +
 1 file changed, 9 insertions(+)

diff --git a/MAINTAINERS b/MAINTAINERS
index b7befe7..aeb81f2 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -7536,6 +7536,15 @@ S:   Supported
 L: linux-samsung-soc@vger.kernel.org (moderated for non-subscribers)
 F: drivers/clk/samsung/
 
+SAMSUNG SXGBE DRIVERS
+M: Byungho An 
+M: Girish K S 
+M: Siva Reddy Kallam 
+M: Vipul Pandya 
+S: Supported
+L: net...@vger.kernel.org
+F: drivers/net/ethernet/samsung/sxgbe/
+
 SERIAL DRIVERS
 M: Greg Kroah-Hartman 
 L: linux-ser...@vger.kernel.org
-- 
1.7.10.4


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


[PATCH V12 4/7] net: sxgbe: add EEE(Energy Efficient Ethernet) for Samsung sxgbe

2014-03-22 Thread Byungho An
From: Girish K S 

Added support for the EEE(Energy Efficient Ethernet) in 10G ethernet driver.

Signed-off-by: Girish K S 
Neatening-by: Joe Perches 
Signed-off-by: Byungho An 
---
 drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h  |   53 +++
 drivers/net/ethernet/samsung/sxgbe/sxgbe_core.c|   86 +-
 drivers/net/ethernet/samsung/sxgbe/sxgbe_ethtool.c |   47 ++
 drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c|  165 +++-
 .../net/ethernet/samsung/sxgbe/sxgbe_platform.c|8 +
 drivers/net/ethernet/samsung/sxgbe/sxgbe_reg.h |5 +
 6 files changed, 362 insertions(+), 2 deletions(-)

diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h 
b/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h
index ec5271d..58e1ace 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h
@@ -115,6 +115,33 @@ struct sxgbe_mtl_ops;
 #define RX_PTP_SIGNAL  0x0A
 #define RX_PTP_RESV_MSG0x0F
 
+/* EEE-LPI mode  flags*/
+#define TX_ENTRY_LPI_MODE  0x10
+#define TX_EXIT_LPI_MODE   0x20
+#define RX_ENTRY_LPI_MODE  0x40
+#define RX_EXIT_LPI_MODE   0x80
+
+/* EEE-LPI Interrupt status flag */
+#define LPI_INT_STATUS BIT(5)
+
+/* EEE-LPI Default timer values */
+#define LPI_LINK_STATUS_TIMER  0x3E8
+#define LPI_MAC_WAIT_TIMER 0x00
+
+/* EEE-LPI Control and status definitions */
+#define LPI_CTRL_STATUS_TXABIT(19)
+#define LPI_CTRL_STATUS_PLSDIS BIT(18)
+#define LPI_CTRL_STATUS_PLSBIT(17)
+#define LPI_CTRL_STATUS_LPIEN  BIT(16)
+#define LPI_CTRL_STATUS_TXRSTP BIT(11)
+#define LPI_CTRL_STATUS_RXRSTP BIT(10)
+#define LPI_CTRL_STATUS_RLPIST BIT(9)
+#define LPI_CTRL_STATUS_TLPIST BIT(8)
+#define LPI_CTRL_STATUS_RLPIEX BIT(3)
+#define LPI_CTRL_STATUS_RLPIEN BIT(2)
+#define LPI_CTRL_STATUS_TLPIEX BIT(1)
+#define LPI_CTRL_STATUS_TLPIEN BIT(0)
+
 enum dma_irq_status {
tx_hard_error   = BIT(0),
tx_bump_tc  = BIT(1),
@@ -199,6 +226,13 @@ struct sxgbe_extra_stats {
unsigned long rx_buffer_access_err;
unsigned long rx_data_transfer_err;
 
+   /* EEE-LPI stats */
+   unsigned long tx_lpi_entry_n;
+   unsigned long tx_lpi_exit_n;
+   unsigned long rx_lpi_entry_n;
+   unsigned long rx_lpi_exit_n;
+   unsigned long eee_wakeup_error_n;
+
/* RX specific */
/* L2 error */
unsigned long rx_code_gmii_err;
@@ -296,6 +330,13 @@ struct sxgbe_core_ops {
   unsigned char feature_index);
/* adjust SXGBE speed */
void (*set_speed)(void __iomem *ioaddr, unsigned char speed);
+
+   /* EEE-LPI specific operations */
+   void (*set_eee_mode)(void __iomem *ioaddr);
+   void (*reset_eee_mode)(void __iomem *ioaddr);
+   void (*set_eee_timer)(void __iomem *ioaddr, const int ls,
+ const int tw);
+   void (*set_eee_pls)(void __iomem *ioaddr, const int link);
 };
 
 const struct sxgbe_core_ops *sxgbe_get_core_ops(void);
@@ -352,6 +393,8 @@ struct sxgbe_hw_features {
/* IEEE 1588-2008 */
unsigned int atime_stamp;
 
+   unsigned int eee;
+
unsigned int tx_csum_offload;
unsigned int rx_csum_offload;
unsigned int multi_macaddr;
@@ -435,6 +478,13 @@ struct sxgbe_priv_data {
/* tc control */
int tx_tc;
int rx_tc;
+   /* EEE-LPI specific members */
+   struct timer_list eee_ctrl_timer;
+   bool tx_path_in_lpi_mode;
+   int lpi_irq;
+   int eee_enabled;
+   int eee_active;
+   int tx_lpi_timer;
 };
 
 /* Function prototypes */
@@ -457,4 +507,7 @@ int sxgbe_restore(struct net_device *ndev);
 
 const struct sxgbe_mtl_ops *sxgbe_get_mtl_ops(void);
 
+void sxgbe_disable_eee_mode(struct sxgbe_priv_data * const priv);
+bool sxgbe_eee_init(struct sxgbe_priv_data * const priv);
+
 #endif /* __SXGBE_COMMON_H__ */
diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_core.c 
b/drivers/net/ethernet/samsung/sxgbe/sxgbe_core.c
index 4ad31bb..0164790 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_core.c
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_core.c
@@ -48,11 +48,38 @@ static void sxgbe_core_dump_regs(void __iomem *ioaddr)
 {
 }
 
+static int sxgbe_get_lpi_status(void __iomem *ioaddr, const u32 irq_status)
+{
+   int status = 0;
+   int lpi_status;
+
+   /* Reading this register shall clear all the LPI status bits */
+   lpi_status = readl(ioaddr + SXGBE_CORE_LPI_CTRL_STATUS);
+
+   if (lpi_status & LPI_CTRL_STATUS_TLPIEN)
+   status |= TX_ENTRY_LPI_MODE;
+   if (lpi_status & LPI_CTRL_STATUS_TLPIEX)
+   status |= TX_EXIT_LPI_MODE;
+   if (lpi_status & LPI_CTRL_STATUS_RLPIEN)
+   status |= RX_ENTRY_LPI_MODE;
+   if (lpi_status & LPI_CTRL_STATUS_RLPIEX)
+   status |= RX_EXIT_LPI_MODE;
+
+   return status;
+}
+
 /* Handle extra ev

[PATCH V12 6/7] net: sxgbe: add ethtool related functions support Samsung sxgbe

2014-03-22 Thread Byungho An
From: Vipul Pandya 

This patch adds ethtool related functions.

Signed-off-by: Vipul Pandya 
Neatening-by: Joe Perches 
Signed-off-by: Byungho An 
---
 drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h  |   25 +-
 drivers/net/ethernet/samsung/sxgbe/sxgbe_ethtool.c |  509 +++-
 drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c|5 +
 drivers/net/ethernet/samsung/sxgbe/sxgbe_reg.h |6 +
 4 files changed, 537 insertions(+), 8 deletions(-)

diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h 
b/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h
index 36a72a3..6e8ef39 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h
@@ -42,8 +42,12 @@ struct sxgbe_mtl_ops;
 #define SXGBE_RX_QUEUES   16
 
 /* Max/Min RI Watchdog Timer count value */
-#define SXGBE_MAX_DMA_RIWT 0xff
-#define SXGBE_MIN_DMA_RIWT 0x20
+/* Calculated based how much time does it take to fill 256KB Rx memory
+ * at 10Gb speed at 156MHz clock rate and considered little less then
+ * the actual value.
+ */
+#define SXGBE_MAX_DMA_RIWT 0x70
+#define SXGBE_MIN_DMA_RIWT 0x01
 
 /* Tx coalesce parameters */
 #define SXGBE_COAL_TX_TIMER4
@@ -194,6 +198,20 @@ enum dma_irq_status {
 #define SXGBE_FOR_EACH_QUEUE(max_queues, queue_num)\
for (queue_num = 0; queue_num < max_queues; queue_num++)
 
+#define DRV_VERSION "1.0.0"
+
+#define SXGBE_MAX_RX_CHANNELS  16
+#define SXGBE_MAX_TX_CHANNELS  16
+
+#define START_MAC_REG_OFFSET   0x
+#define MAX_MAC_REG_OFFSET 0x0DFC
+#define START_MTL_REG_OFFSET   0x1000
+#define MAX_MTL_REG_OFFSET 0x18FC
+#define START_DMA_REG_OFFSET   0x3000
+#define MAX_DMA_REG_OFFSET 0x38FC
+
+#define REG_SPACE_SIZE 0x2000
+
 /* sxgbe statistics counters */
 struct sxgbe_extra_stats {
/* TX/RX IRQ events */
@@ -479,6 +497,7 @@ struct sxgbe_priv_data {
/* advanced time stamp support */
u32 adv_ts;
int use_riwt;
+   struct ptp_clock *ptp_clock;
 
/* tc control */
int tx_tc;
@@ -515,4 +534,6 @@ const struct sxgbe_mtl_ops *sxgbe_get_mtl_ops(void);
 void sxgbe_disable_eee_mode(struct sxgbe_priv_data * const priv);
 bool sxgbe_eee_init(struct sxgbe_priv_data * const priv);
 
+int sxgbe_set_flow_ctrl(struct sxgbe_priv_data *priv, int rx, int tx);
+
 #endif /* __SXGBE_COMMON_H__ */
diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_ethtool.c 
b/drivers/net/ethernet/samsung/sxgbe/sxgbe_ethtool.c
index 9083300..471bc89 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_ethtool.c
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_ethtool.c
@@ -12,11 +12,17 @@
 
 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
 
+#include 
+#include 
 #include 
 #include 
+#include 
 #include 
+#include 
 
 #include "sxgbe_common.h"
+#include "sxgbe_reg.h"
+#include "sxgbe_dma.h"
 
 struct sxgbe_stats {
char stat_string[ETH_GSTRING_LEN];
@@ -32,16 +38,105 @@ struct sxgbe_stats {
 }
 
 static const struct sxgbe_stats sxgbe_gstrings_stats[] = {
+   /* TX/RX IRQ events */
+   SXGBE_STAT(tx_process_stopped_irq),
+   SXGBE_STAT(tx_ctxt_desc_err),
+   SXGBE_STAT(tx_threshold),
+   SXGBE_STAT(rx_threshold),
+   SXGBE_STAT(tx_pkt_n),
+   SXGBE_STAT(rx_pkt_n),
+   SXGBE_STAT(normal_irq_n),
+   SXGBE_STAT(tx_normal_irq_n),
+   SXGBE_STAT(rx_normal_irq_n),
+   SXGBE_STAT(napi_poll),
+   SXGBE_STAT(tx_clean),
+   SXGBE_STAT(tx_reset_ic_bit),
+   SXGBE_STAT(rx_process_stopped_irq),
+   SXGBE_STAT(rx_underflow_irq),
+
+   /* Bus access errors */
+   SXGBE_STAT(fatal_bus_error_irq),
+   SXGBE_STAT(tx_read_transfer_err),
+   SXGBE_STAT(tx_write_transfer_err),
+   SXGBE_STAT(tx_desc_access_err),
+   SXGBE_STAT(tx_buffer_access_err),
+   SXGBE_STAT(tx_data_transfer_err),
+   SXGBE_STAT(rx_read_transfer_err),
+   SXGBE_STAT(rx_write_transfer_err),
+   SXGBE_STAT(rx_desc_access_err),
+   SXGBE_STAT(rx_buffer_access_err),
+   SXGBE_STAT(rx_data_transfer_err),
+
+   /* EEE-LPI stats */
SXGBE_STAT(tx_lpi_entry_n),
SXGBE_STAT(tx_lpi_exit_n),
SXGBE_STAT(rx_lpi_entry_n),
SXGBE_STAT(rx_lpi_exit_n),
SXGBE_STAT(eee_wakeup_error_n),
+
+   /* RX specific */
+   /* L2 error */
+   SXGBE_STAT(rx_code_gmii_err),
+   SXGBE_STAT(rx_watchdog_err),
+   SXGBE_STAT(rx_crc_err),
+   SXGBE_STAT(rx_gaint_pkt_err),
+   SXGBE_STAT(ip_hdr_err),
+   SXGBE_STAT(ip_payload_err),
+   SXGBE_STAT(overflow_error),
+
+   /* L2 Pkt type */
+   SXGBE_STAT(len_pkt),
+   SXGBE_STAT(mac_ctl_pkt),
+   SXGBE_STAT(dcb_ctl_pkt),
+   SXGBE_STAT(arp_pkt),
+   SXGBE_STAT(oam_pkt),
+   SXGBE_STAT(untag_okt),
+   SXGBE_STAT(other_pkt),
+   SXGBE_STAT(svlan_tag_pkt),
+   SXGBE_STAT(cvlan_tag_pkt),
+   SX

[PATCH V12 5/7] net: sxgbe: add Checksum offload support for Samsung sxgbe

2014-03-22 Thread Byungho An
From: Vipul Pandya 

This patch adds TX and RX checksum offload support.

Signed-off-by: Vipul Pandya 
Neatening-by: Joe Perches 
Signed-off-by: Byungho An 
---
 drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h |5 +++
 drivers/net/ethernet/samsung/sxgbe/sxgbe_core.c   |   20 +
 drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.h   |2 +-
 drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c   |   46 -
 4 files changed, 61 insertions(+), 12 deletions(-)

diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h 
b/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h
index 58e1ace..36a72a3 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h
@@ -337,6 +337,10 @@ struct sxgbe_core_ops {
void (*set_eee_timer)(void __iomem *ioaddr, const int ls,
  const int tw);
void (*set_eee_pls)(void __iomem *ioaddr, const int link);
+
+   /* Enable disable checksum offload operations */
+   void (*enable_rx_csum)(void __iomem *ioaddr);
+   void (*disable_rx_csum)(void __iomem *ioaddr);
 };
 
 const struct sxgbe_core_ops *sxgbe_get_core_ops(void);
@@ -449,6 +453,7 @@ struct sxgbe_priv_data {
struct sxgbe_ops *hw;   /* sxgbe specific ops */
int no_csum_insertion;
int irq;
+   int rxcsum_insertion;
spinlock_t stats_lock;  /* lock for tx/rx statatics */
 
struct phy_device *phydev;
diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_core.c 
b/drivers/net/ethernet/samsung/sxgbe/sxgbe_core.c
index 0164790..66d4a74 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_core.c
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_core.c
@@ -218,6 +218,24 @@ static void  sxgbe_set_eee_timer(void __iomem *ioaddr,
writel(value, ioaddr + SXGBE_CORE_LPI_TIMER_CTRL);
 }
 
+static void sxgbe_enable_rx_csum(void __iomem *ioaddr)
+{
+   u32 ctrl;
+
+   ctrl = readl(ioaddr + SXGBE_CORE_RX_CONFIG_REG);
+   ctrl |= SXGBE_RX_CSUMOFFLOAD_ENABLE;
+   writel(ctrl, ioaddr + SXGBE_CORE_RX_CONFIG_REG);
+}
+
+static void sxgbe_disable_rx_csum(void __iomem *ioaddr)
+{
+   u32 ctrl;
+
+   ctrl = readl(ioaddr + SXGBE_CORE_RX_CONFIG_REG);
+   ctrl &= ~SXGBE_RX_CSUMOFFLOAD_ENABLE;
+   writel(ctrl, ioaddr + SXGBE_CORE_RX_CONFIG_REG);
+}
+
 const struct sxgbe_core_ops core_ops = {
.core_init  = sxgbe_core_init,
.dump_regs  = sxgbe_core_dump_regs,
@@ -234,6 +252,8 @@ const struct sxgbe_core_ops core_ops = {
.reset_eee_mode = sxgbe_reset_eee_mode,
.set_eee_timer  = sxgbe_set_eee_timer,
.set_eee_pls= sxgbe_set_eee_pls,
+   .enable_rx_csum = sxgbe_enable_rx_csum,
+   .disable_rx_csum= sxgbe_disable_rx_csum,
 };
 
 const struct sxgbe_core_ops *sxgbe_get_core_ops(void)
diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.h 
b/drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.h
index 6d44b9f..838cb9f 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.h
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.h
@@ -113,7 +113,7 @@ struct sxgbe_rx_norm_desc {
/* WB RDES3 */
u32 pkt_len:14;
u32 rdes3_reserved:1;
-   u32 err_summary:15;
+   u32 err_summary:1;
u32 err_l2_type:4;
u32 layer34_pkt_type:4;
u32 no_coagulation_pkt:1;
diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c 
b/drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c
index c44464d..e433969 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c
@@ -1252,6 +1252,7 @@ void sxgbe_tso_prepare(struct sxgbe_priv_data *priv,
 static netdev_tx_t sxgbe_xmit(struct sk_buff *skb, struct net_device *dev)
 {
unsigned int entry, frag_num;
+   int cksum_flag = 0;
struct netdev_queue *dev_txq;
unsigned txq_index = skb_get_queue_mapping(skb);
struct sxgbe_priv_data *priv = netdev_priv(dev);
@@ -1332,7 +1333,7 @@ static netdev_tx_t sxgbe_xmit(struct sk_buff *skb, struct 
net_device *dev)
   __func__);
 
priv->hw->desc->prepare_tx_desc(tx_desc, 1, no_pagedlen,
-   no_pagedlen, 0);
+   no_pagedlen, 
cksum_flag);
}
}
 
@@ -1350,7 +1351,7 @@ static netdev_tx_t sxgbe_xmit(struct sk_buff *skb, struct 
net_device *dev)
 
/* prepare the descriptor */
priv->hw->desc->prepare_tx_desc(tx_desc, 0, len,
-   len, 0);
+   len, cksum_flag);
/* memory barri

[PATCH V12 1/7] sxgbe: Add device-tree binding support document

2014-03-22 Thread Byungho An
From: Siva Reddy 

This patch adds binding document for SXGBE ethernet driver via device-tree.

Signed-off-by: Siva Reddy Kallam 
Signed-off-by: Byungho An 
---
 .../devicetree/bindings/net/samsung-sxgbe.txt  |   52 
 1 file changed, 52 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/net/samsung-sxgbe.txt

diff --git a/Documentation/devicetree/bindings/net/samsung-sxgbe.txt 
b/Documentation/devicetree/bindings/net/samsung-sxgbe.txt
new file mode 100644
index 000..989f6c9
--- /dev/null
+++ b/Documentation/devicetree/bindings/net/samsung-sxgbe.txt
@@ -0,0 +1,52 @@
+* Samsung 10G Ethernet driver (SXGBE)
+
+Required properties:
+- compatible: Should be "samsung,sxgbe-v2.0a"
+- reg: Address and length of the register set for the device
+- interrupt-parent: Should be the phandle for the interrupt controller
+  that services interrupts for this device
+- interrupts: Should contain the SXGBE interrupts
+  These interrupts are ordered by fixed and follows variable
+  trasmit DMA interrupts, receive DMA interrupts and lpi interrupt.
+  index 0 - this is fixed common interrupt of SXGBE and it is always
+  available.
+  index 1 to 25 - 8 variable trasmit interrupts, variable 16 receive interrupts
+  and 1 optional lpi interrupt.
+- phy-mode: String, operation mode of the PHY interface.
+  Supported values are: "sgmii", "xgmii".
+- samsung,pbl: Integer, Programmable Burst Length.
+  Supported values are 1, 2, 4, 8, 16, or 32.
+- samsung,burst-map: Integer, Program the possible bursts supported by sxgbe
+  This is an interger and represents allowable DMA bursts when fixed burst.
+  Allowable range is 0x01-0x3F. When this field is set fixed burst is enabled.
+  When fixed length is needed for burst mode, it can be set within allowable
+  range.
+
+Optional properties:
+- mac-address: 6 bytes, mac address
+- max-frame-size: Maximum Transfer Unit (IEEE defined MTU), rather
+ than the maximum frame size.
+
+Example:
+
+   aliases {
+   ethernet0 = <&sxgbe0>;
+   };
+
+   sxgbe0: ethernet@1a04 {
+   compatible = "samsung,sxgbe-v2.0a";
+   reg = <0 0x1a04 0 0x1>;
+   interrupt-parent = <&gic>;
+   interrupts = <0 209 4>, <0 185 4>, <0 186 4>, <0 187 4>,
+<0 188 4>, <0 189 4>, <0 190 4>, <0 191 4>,
+<0 192 4>, <0 193 4>, <0 194 4>, <0 195 4>,
+<0 196 4>, <0 197 4>, <0 198 4>, <0 199 4>,
+<0 200 4>, <0 201 4>, <0 202 4>, <0 203 4>,
+<0 204 4>, <0 205 4>, <0 206 4>, <0 207 4>,
+<0 208 4>, <0 210 4>;
+   samsung,pbl = <0x08>
+   samsung,burst-map = <0x20>
+   mac-address = [ 00 11 22 33 44 55 ]; /* Filled in by U-Boot */
+   max-frame-size = <9000>;
+   phy-mode = "xgmii";
+   };
-- 
1.7.10.4


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


[PATCH V12 0/7] add new Samsung SXGBE driver

2014-03-22 Thread Byungho An
Hi all,

This is 12th posting for SAMSUNG SXGBE driver.

Changes since v1:
- changed name of driver to SXGbE as per Ben's comment
- squashed Joe's neatening for many stuff in original patches

Changes since v2:
- updated and split binding document as per Mark's comment
- clean up codes as per Joe's comment
- removed unused fields and clean up codes as per Francois's comment
- removed module parameters as per Dave's comment
- moved driver directory to samsung/sxgbe/

Changes since v3:
- fixed Missing a blank line after declarations as per Dave's comment
- clean up codes as per Joe's comment
- removed reference of net_device.{irq, base_addr} as per Francois's comment

Changes since v4:
- updated binding document and DT related function as per Mark's comment

Changes since v5:
- updated binding document and DT related function as per Florian's comment
- fixed typo and shortened code as per Joe's comment

Changes since v6:
- updated TSO related functions as per Rayagond's comment
- updated binding document as per Mark's comment
- removed WoL patch from this patch set

Changes since v7:
- updated TSO related functions as per Rayagond's comment

Changes since v8:
- removed select and depends statement from vendor sub-section as per 
  Dave's comment

Changes since v9:
- removed adv-add-map, force-sf-dma-modei and force-thresh-dma-mode from 
  binding documnet as per Mark's comment

Changes since v10:
- clean up codes as per Francois's comment

Changes since v11:
- clean up mdio_read/write codes as per Francois's comment
- changed irq acquisition error path as per Francois's comment
- updated mdio and platform related codes as per Tomasz'comment
- clean up dma related codes as per Vince's comment

Byungho An (1):
  MAINTAINERS: add maintainer for Samsung sxgbe driver

Girish K S (1):
  net: sxgbe: add EEE(Energy Efficient Ethernet) for Samsung sxgbe

Siva Reddy (2):
  sxgbe: Add device-tree binding support document
  net: sxgbe: add basic framework for Samsung 10Gb ethernet driver

Vipul Pandya (3):
  net: sxgbe: add TSO support for Samsung sxgbe
  net: sxgbe: add Checksum offload support for Samsung sxgbe
  net: sxgbe: add ethtool related functions support Samsung sxgbe

 .../devicetree/bindings/net/samsung-sxgbe.txt  |   52 +
 MAINTAINERS|9 +
 drivers/net/ethernet/Kconfig   |1 +
 drivers/net/ethernet/Makefile  |1 +
 drivers/net/ethernet/samsung/Kconfig   |   16 +
 drivers/net/ethernet/samsung/Makefile  |5 +
 drivers/net/ethernet/samsung/sxgbe/Kconfig |9 +
 drivers/net/ethernet/samsung/sxgbe/Makefile|4 +
 drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h  |  539 +
 drivers/net/ethernet/samsung/sxgbe/sxgbe_core.c|  262 +++
 drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.c|  515 +
 drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.h|  298 +++
 drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.c |  382 
 drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.h |   50 +
 drivers/net/ethernet/samsung/sxgbe/sxgbe_ethtool.c |  588 +
 drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c| 2310 
 drivers/net/ethernet/samsung/sxgbe/sxgbe_mdio.c|  251 +++
 drivers/net/ethernet/samsung/sxgbe/sxgbe_mtl.c |  254 +++
 drivers/net/ethernet/samsung/sxgbe/sxgbe_mtl.h |  104 +
 .../net/ethernet/samsung/sxgbe/sxgbe_platform.c|  254 +++
 drivers/net/ethernet/samsung/sxgbe/sxgbe_reg.h |  488 +
 drivers/net/ethernet/samsung/sxgbe/sxgbe_xpcs.c|   91 +
 drivers/net/ethernet/samsung/sxgbe/sxgbe_xpcs.h|   38 +
 include/linux/sxgbe_platform.h |   54 +
 24 files changed, 6575 insertions(+)

Thanks,
Byungho An

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


RE: [PATCH V11 2/7] net: sxgbe: add basic framework for Samsung 10Gb ethernet driver

2014-03-22 Thread Byungho An
Vince Bridgers  :
> On Sat, Mar 22, 2014 at 1:23 AM, Byungho An  wrote:
> > From: Siva Reddy 
> >
> > This patch adds support for Samsung 10Gb ethernet driver(sxgbe).

[snip]

> > +   /* Stop Advertising 1000BASE Capability if interface is not GMII
*/
> > +   if ((phy_iface == PHY_INTERFACE_MODE_MII) ||
> > +   (phy_iface == PHY_INTERFACE_MODE_RMII))
> > +   phydev->advertising &= ~(SUPPORTED_1000baseT_Half |
> > +SUPPORTED_1000baseT_Full);
> 
> Your bindings document says sgmii and xgmii are possible. This code
> implies MII, RMII are possible (since you're checking for it). Is this
> needed?
As of now it is not needed, it is for future compatibility. anyway i'll remove
in this serise.

[sinp]

> > +   next_entry = (++priv->rxq[qnum]->cur_rx) % rxsize;
> > +   prefetch(priv->rxq[qnum]->dma_rx + next_entry);
> > +
> > +   /*TO DO read the status of the incoming frame */
> 
> Did you intend to leave a "TO DO" in a V11 submission?
it is not for this patch but for later patch.

> 
> 
> All the best,
> 
> Vince
> 
> >
> >
> > --
> > To unsubscribe from this list: send the line "unsubscribe netdev" in
> > the body of a message to majord...@vger.kernel.org
> > More majordomo info at  http://vger.kernel.org/majordomo-info.html

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


RE: [PATCH V11 2/7] net: sxgbe: add basic framework for Samsung 10Gb ethernet driver

2014-03-22 Thread Byungho An

Vince Bridgers  :
> See comments inline
> 
> On Sat, Mar 22, 2014 at 1:23 AM, Byungho An  wrote:
> > From: Siva Reddy 
> >
> > This patch adds support for Samsung 10Gb ethernet driver(sxgbe).
> >

[snip]

> > +   /* program desc registers */
> > +   writel(dma_tx >> 32,
> > +  ioaddr + SXGBE_DMA_CHA_TXDESC_HADD_REG(cha_num));
> > +   writel(dma_tx & 0x,
> > +  ioaddr + SXGBE_DMA_CHA_TXDESC_LADD_REG(cha_num));
> > +
> > +   writel(dma_rx >> 32,
> > +  ioaddr + SXGBE_DMA_CHA_RXDESC_HADD_REG(cha_num));
> > +   writel(dma_rx & 0x,
> > +  ioaddr + SXGBE_DMA_CHA_RXDESC_LADD_REG(cha_num));
> 
> use upper_32_bits and lower_32_bits for extracting the upper/lower
> 32-bit portions of a phys addrs. See
> https://www.kernel.org/doc/htmldocs/device-drivers/API-upper-32-bits.html.
OK.

[snip]

> > +   /* save the skb address */
> > +   tqueue->tx_skbuff[entry] = skb;
> > +
> > +   if (!is_jumbo) {
> > +   tx_desc->tdes01 = dma_map_single(priv->device, skb->data,
> > +  no_pagedlen,
DMA_TO_DEVICE);
> > +   if (dma_mapping_error(priv->device, tx_desc->tdes01))
> > +   pr_err("%s: TX dma mapping failed!!\n", __func__);
> > +
> > +   priv->hw->desc->prepare_tx_desc(tx_desc, 1, no_pagedlen,
> > +   no_pagedlen);
> 
> you're prototype is void (*prepare_tx_desc)(struct sxgbe_tx_norm_desc
> *p, u8 is_fd, int buf1_len, int pkt_len, int cksum) defined in
> sxgbe_desc.h, but you're usage is different? Am I missing something
> here? I found this when I tried to download this first patch and
> compile it independent of the application of the entire series.
OK, I'll fix it actually csum will be used after this patch

> 
> > +   }
> > +
> > +   for (frag_num = 0; frag_num < nr_frags; frag_num++) {
> > +   const skb_frag_t *frag =
&skb_shinfo(skb)->frags[frag_num];
> > +   int len = skb_frag_size(frag);
> > +
> > +   entry = (++tqueue->cur_tx) % tx_rsize;
> > +   tx_desc = tqueue->dma_tx + entry;
> > +   tx_desc->tdes01 = skb_frag_dma_map(priv->device, frag, 0,
len,
> > +  DMA_TO_DEVICE);
> > +
> > +   tqueue->tx_skbuff_dma[entry] = tx_desc->tdes01;
> > +   tqueue->tx_skbuff[entry] = NULL;
> > +
> > +   /* prepare the descriptor */
> > +   priv->hw->desc->prepare_tx_desc(tx_desc, 0, len,
> > +   len);
> 
> you're prototype is void (*prepare_tx_desc)(struct sxgbe_tx_norm_desc
> *p, u8 is_fd, int buf1_len, int pkt_len, int cksum) defined in
> sxgbe_desc.h, but you're usage is different? Am I missing something
> here? I found this when I tried to download this first patch and
> compile it independent of the application of the entire series.
same above

[snip]

> > +#endif /* __SXGBE_PLATFORM_H__ */
> > --
> > 1.7.10.4
> 
> Have you tried applying this series to this point and compiling? Since
> the prepare_tx_desc usage and prototype are different, I'm not so sure
> the series applied up to this patch will successfully compile.
sure with this series.. please refer above.

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

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


RE: [PATCH V11 2/7] net: sxgbe: add basic framework for Samsung 10Gb ethernet driver

2014-03-22 Thread Byungho An

Tomasz Figa  :
> On 22.03.2014 22:55, Byungho An wrote:
> >
> > Tomasz Figa  :
> 
> [snip]
> 
> >>> + if (priv->irq <= 0) {
> >>> + dev_err(dev, "sxgbe common irq parsing failed\n");
> >>> + sxgbe_drv_remove(ndev);
> >>> + return -EINVAL;
> >>> + }
> >>> +
> >>> + /* Get the TX/RX IRQ numbers */
> >>> + for (i = 0, chan = 0; i < SXGBE_TX_QUEUES; i++) {
> >>> + priv->txq[i]->irq_no = irq_of_parse_and_map(node, chan++);
> >>
> >> Hmm, this call looks suspicious. The "chan" variable starts here as 0
> >> and so
> > the
> >> first call to irq_of_parse_and_map() will end up with parsing the
> >> first
> > (zeroth)
> >> entry of "interrupts" property, which would be the same as returned
> >> by platform_get_irq(..., 0) above. Maybe this was the point where the
> "loop"
> >> variable should be used?
> > OK. it will be chan instead of loop.
> > thanks I missed.
> >
> >>
> >> Anyway, why you couldn't simply use platform_get_irq() here as well?
> > I'll change platform_get_irq to irq_of_parse_and_map because latter
> > can support PCI and nonPCI
> 
> Hmm, since this function is for probing only platform devices, I don't see
how
> this code could be used for PCI. For platform devices
> platform_get_irq() is preferred.
Those things will be added after this serise.

> 
> Best regards,
> Tomasz

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


RE: [PATCH V11 2/7] net: sxgbe: add basic framework for Samsung 10Gb ethernet driver

2014-03-22 Thread Byungho An

Vince Bridgers  :
> On Sat, Mar 22, 2014 at 1:23 AM, Byungho An  wrote:
> > From: Siva Reddy 
> >
> > This patch adds support for Samsung 10Gb ethernet driver(sxgbe).
> >

[snip]

> > +static int sxgbe_init_rx_buffers(struct net_device *dev,
> > +struct sxgbe_rx_norm_desc *p, int i,
> > +unsigned int dma_buf_sz,
> > +struct sxgbe_rx_queue *rx_ring)
> > +{
> > +   struct sxgbe_priv_data *priv = netdev_priv(dev);
> > +   struct sk_buff *skb;
> > +
> > +   skb = __netdev_alloc_skb(dev, dma_buf_sz, GFP_KERNEL);
> > +   if (!skb)
> > +   return -ENOMEM;
> > +
> > +   skb_reserve(skb, NET_IP_ALIGN);
> 
> Considering using netdev_alloc_skb_ip_align here as well. Looks like
> it was changed in refill, but not here
OK. Thanks

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

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


RE: [PATCH V11 2/7] net: sxgbe: add basic framework for Samsung 10Gb ethernet driver

2014-03-22 Thread Byungho An

Tomasz Figa  :
> Hi,
> 
> I have reviewed the non-net-specific parts of this driver, e.g. platform
driver
> and Device Tree code. Please see my comments inline.
> 
> On 22.03.2014 07:23, Byungho An wrote:
> > From: Siva Reddy 
> >
> > This patch adds support for Samsung 10Gb ethernet driver(sxgbe).
> >

[snip]

> > +   struct device_node *np = pdev->dev.of_node;
> > +   struct sxgbe_dma_cfg *dma_cfg;
> > +
> > +   if (!np)
> > +   return -ENODEV;
> > +
> > +   *mac = of_get_mac_address(np);
> > +   plat->interface = of_get_phy_mode(np);
> > +
> > +   plat->bus_id = of_alias_get_id(np, "ethernet");
> > +   if (plat->bus_id < 0)
> > +   plat->bus_id = 0;
> > +
> > +   plat->mdio_bus_data = devm_kzalloc(&pdev->dev,
> > +  sizeof(struct sxgbe_mdio_bus_data),
> > +  GFP_KERNEL);
> 
> If plat->mdio_bus_data is assumed to be of the same type as the data
> allocated here, then the following would be preferred:
> 
> sizeof(*plat->mdio_bus_data)
> 
> Also you should probably check for allocation failure.
OK and it is same type.
 
> 
> > +
> > +   dma_cfg = devm_kzalloc(&pdev->dev, sizeof(*dma_cfg),
> GFP_KERNEL);
> > +   if (!dma_cfg)
> > +   return -ENOMEM;
> > +
> > +   plat->dma_cfg = dma_cfg;
> > +   of_property_read_u32(np, "samsung,pbl", &dma_cfg->pbl);
> > +   if (of_property_read_u32(np, "samsung,burst-map", &dma_cfg-
> >burst_map) == 0)
> > +   dma_cfg->fixed_burst = true;
> > +
> > +   return 0;
> > +}
> 
> [snip]
> 
> > +static int sxgbe_platform_probe(struct platform_device *pdev) {
> > +   int ret;
> > +   int loop = 0;
> > +   int i, chan;
> > +   struct resource *res;
> > +   struct device *dev = &pdev->dev;
> > +   void __iomem *addr;
> > +   struct sxgbe_priv_data *priv = NULL;
> > +   struct sxgbe_plat_data *plat_dat = NULL;
> > +   const char *mac = NULL;
> > +   struct net_device *ndev = platform_get_drvdata(pdev);
> > +   struct device_node *node = dev->of_node;
> > +
> > +   /* Get memory resource */
> > +   res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
> > +   if (!res)
> > +   return -ENODEV;
> > +
> > +   addr = devm_ioremap_resource(dev, res);
> > +   if (IS_ERR(addr))
> > +   return PTR_ERR(addr);
> > +
> > +   if (pdev->dev.of_node) {
> > +   plat_dat = devm_kzalloc(&pdev->dev,
> > +   sizeof(struct sxgbe_plat_data),
> > +   GFP_KERNEL);
> > +   if (!plat_dat)
> > +   return  -ENOMEM;
> > +
> > +   ret = sxgbe_probe_config_dt(pdev, plat_dat, &mac);
> > +   if (ret) {
> > +   pr_err("%s: main dt probe failed\n", __func__);
> > +   return ret;
> > +   }
> > +   }
> > +
> > +   priv = sxgbe_drv_probe(&(pdev->dev), plat_dat, addr);
> > +   if (!priv) {
> > +   pr_err("%s: main driver probe failed\n", __func__);
> > +   return -ENODEV;
> > +   }
> > +
> > +   /* Get MAC address if available (DT) */
> > +   if (mac)
> > +   ether_addr_copy(priv->dev->dev_addr, mac);
> > +
> > +   /* Get the SXGBE common INT information */
> > +   priv->irq  = platform_get_irq(pdev, loop++);
> 
> The name "loop" of the variable is quite misleading here. Probably something
> like "irq_num", would be more meaningful.
> 
> Anyway, it doesn't look like it's used anywhere else in this function, so
> platform_get_irq(pdev, 0) could be simply used.
> 
> > +   if (priv->irq <= 0) {
> > +   dev_err(dev, "sxgbe common irq parsing failed\n");
> > +   sxgbe_drv_remove(ndev);
> > +   return -EINVAL;
> > +   }
> > +
> > +   /* Get the TX/RX IRQ numbers */
> > +   for (i = 0, chan = 0; i < SXGBE_TX_QUEUES; i++) {
> > +   priv->txq[i]->irq_no = irq_of_parse_and_map(node, chan++);
> 
> Hmm, this call looks suspicious. The "chan" variable starts here as 0 and so
the
> first call to irq_of_parse_and_map() will end up with parsing the first
(zeroth)
> entry of "interrupts" property, which would be the same as returned by
> platform_get_irq(..., 0) 

RE: [PATCH V11 2/7] net: sxgbe: add basic framework for Samsung 10Gb ethernet driver

2014-03-22 Thread Byungho An

Francois Romieu  wrote :
> Byungho An  :
> [...]
> > +static int sxgbe_init_rx_buffers(struct net_device *dev,
> > +struct sxgbe_rx_norm_desc *p, int i,
> > +unsigned int dma_buf_sz,
> > +struct sxgbe_rx_queue *rx_ring)
> > +{
> > +   struct sxgbe_priv_data *priv = netdev_priv(dev);
> > +   struct sk_buff *skb;
> > +
> > +   skb = __netdev_alloc_skb(dev, dma_buf_sz, GFP_KERNEL);
> > +   if (!skb)
> > +   return -ENOMEM;
> > +
> > +   skb_reserve(skb, NET_IP_ALIGN);
> 
> __netdev_alloc_skb_ip_align
OK.

> 
> [...]
> > +static int sxgbe_platform_probe(struct platform_device *pdev) {
> [...]
> > +   priv = sxgbe_drv_probe(&(pdev->dev), plat_dat, addr);
> > +   if (!priv) {
> > +   pr_err("%s: main driver probe failed\n", __func__);
> > +   return -ENODEV;
> > +   }
> > +
> > +   /* Get MAC address if available (DT) */
> > +   if (mac)
> > +   ether_addr_copy(priv->dev->dev_addr, mac);
> > +
> > +   /* Get the SXGBE common INT information */
> > +   priv->irq  = platform_get_irq(pdev, loop++);
> > +   if (priv->irq <= 0) {
> > +   dev_err(dev, "sxgbe common irq parsing failed\n");
> > +   sxgbe_drv_remove(ndev);
> > +   return -EINVAL;
> > +   }
> > +
> > +   /* Get the TX/RX IRQ numbers */
> > +   for (i = 0, chan = 0; i < SXGBE_TX_QUEUES; i++) {
> > +   priv->txq[i]->irq_no = irq_of_parse_and_map(node, chan++);
> > +   if (priv->txq[i]->irq_no <= 0) {
> > +   dev_err(dev, "sxgbe tx irq parsing failed\n");
> > +   return -EINVAL;
> > +   }
> > +   }
> > +
> > +   for (i = 0; i < SXGBE_RX_QUEUES; i++) {
> > +   priv->rxq[i]->irq_no = irq_of_parse_and_map(node, chan++);
> > +   if (priv->rxq[i]->irq_no <= 0) {
> > +   dev_err(dev, "sxgbe rx irq parsing failed\n");
> > +   return -EINVAL;
> > +   }
> > +   }
> 
> The error path should use sxgbe_drv_remove.
> 
> It should use irq_dispose_mapping as well to unwind irq_create_mapping
> (called by irq_of_parse_and_map).
OK

> 
> [...]
> > +int sxgbe_xpcs_init(struct net_device *ndev) {
> > +   u32 value;
> > +
> > +   value = sxgbe_xpcs_read(ndev, SR_PCS_MMD_CONTROL1);
> > +   /* 10G XAUI mode */
> > +   sxgbe_xpcs_write(ndev, SR_PCS_CONTROL2, XPCS_TYPE_SEL_X);
> > +   sxgbe_xpcs_write(ndev, VR_PCS_MMD_XAUI_MODE_CONTROL,
> XPCS_XAUI_MODE);
> > +   sxgbe_xpcs_write(ndev, VR_PCS_MMD_XAUI_MODE_CONTROL,
> value | BIT(13));
> > +   sxgbe_xpcs_write(ndev, SR_PCS_MMD_CONTROL1, value | BIT(11));
> > +
> > +   do {
> > +   value = sxgbe_xpcs_read(ndev,
> VR_PCS_MMD_DIGITAL_STATUS);
> > +
> > +   } while ((value & XPCS_QSEQ_STATE_MPLLOFF) ==
> > +XPCS_QSEQ_STATE_STABLE);
> 
> Excess empty line.
OK.

Thanks
> 
> --
> Ueimor

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


RE: [PATCH V10 2/7] net: sxgbe: add basic framework for Samsung 10Gb ethernet driver

2014-03-22 Thread Byungho An

Francois Romieu  wrote:
> Byungho An  :
> [...]
> > > Nit: you may consider reorganizing the variables in an inverted xmas
> > > tree fashion at some point.
> > Does it look better? No problem.
> 
> Marginally if not more. Consider it a guideline to avoid unusual or ugly
layout.
OK. I'll consider it.

> 
> [...]
> > > > +  priv->ioaddr + SXGBE_MDIO_CLAUSE22_PORT_REG);
> > > > +   /* set mdio address register */
> > > > +   reg_val = (phyaddr << 16) | (phyreg & 0x1F);
> > > > +   writel(reg_val, priv->ioaddr + mii_addr);
> > > > +
> > > > +   /* set mdio control/data register */
> > > > +   reg_val = ((SXGBE_SMA_READ_CMD << 16) |
> > > SXGBE_SMA_SKIP_ADDRFRM |
> > > > +  ((priv->clk_csr & 0x7) << 19) |
SXGBE_MII_BUSY);
> > > > +   writel(reg_val, priv->ioaddr + mii_data);
> > > > +   }
> > >
> > > The whole 'if (phyreg & MII_ADDR_C45) { ... } else { ... }' chunk is
> > > shared
> > with
> > > sxgbe_mdio_write(..., phydata = 0). Factor out ?
> > Not exactly same.
> 
> Almost :o)
> 
> static void sxgbe_mdio_ctrl_data(struct spgbe_priv_data *sp, u32 cmd,
>u16 phydata)
> {
>   u32 reg = phydata;
> 
>   reg |= (cmd << 16) | SXGBE_SMA_SKIP_ADDRFRM |
>  ((sp->clk_csr & 0x7) << 19) | SXGBE_MII_BUSY;
>   writel(reg, sp->ioaddr + sp->hw->mii.data); }
> 
> static void sxgbe_mdio_c45(struct spgbe_priv_data *sp, u32 cmd, int phyaddr,
>  int phyreg, u16 phydata)
> {
>   u32 reg;
> 
>   /* set mdio address register */
>   reg = ((phyreg >> 16) & 0x1f) << 21;
>   reg |= (phyaddr << 16) | (phyreg & 0x);
>   writel(reg, sp->ioaddr + sp->hw->mii.addr);
> 
>   sxgbe_mdio_ctrl_data(sp, cmd, phydata); }
> 
> static int sxgbe_mdio_c22(struct spgbe_priv_data *sp, u32 cmd, int phyaddr,
> int phyreg, u16 phydata)
> {
>   u32 reg
> 
>   writel(1 << phyaddr, ioaddr + SXGBE_MDIO_CLAUSE22_PORT_REG);
> 
>   /* set mdio address register */
>   reg = (phyaddr << 16) | (phyreg & 0x1f);
>   writel(reg, sp->ioaddr + sp->hw->mii.addr);
> 
>   sxgbe_mdio_ctrl_data(sp, cmd, phydata); }
> 
> static int spgbe_mdio_access(struct spgbe_priv_data *sp, u32 cmd, int
phyaddr,
>int phyreg, u16 phydata)
> {
>   const struct mii_regs *mii = &sp->hw->mii;
>   int rc;
> 
>   rc = spgbe_mdio_busy_wait(sp->ioaddr, mii->data);
>   if (rc < 0)
>   return rc;
> 
>   if (phyreg & MII_ADDR_C45) {
>   spgbe_mdio_c45(sp, cmd, phyaddr, phyreg, phydata);
>   } else {
>/* Ports 0-3 only support C22. */
>   if (phyaddr >= 4)
>   return -ENODEV;
> 
>   spgbe_mdio_c22(sp, cmd, phyaddr, phyreg, phydata);
>   }
> 
>   return spgbe_mdio_busy_wait(sp->ioaddr, mii->data); }
> 
> static int sxgbe_mdio_read(struct mii_bus *bus, int phyaddr, int phyreg) {
>   struct net_device *ndev = bus->priv;
>   struct sxgbe_priv_data *priv = netdev_priv(ndev);
>   int rc;
> 
>   rc = sxgbe_mdio_access(priv, SXGBE_SMA_READ_CMD, phyaddr,
> phyreg, 0);
>   if (rc < 0)
>   return rc;
> 
>   return readl(priv->ioaddr + priv->hw->mii.data) & 0x; }
> 
> static int sxgbe_mdio_write(struct mii_bus *bus, int phyaddr, int phyreg,
>   u16 phydata)
> {
>   struct net_device *ndev = bus->priv;
>   struct sxgbe_priv_data *priv = netdev_priv(ndev);
> 
>   return sxgbe_mdio_access(priv, SXGBE_SMA_WRITE_CMD, phyaddr,
> phyreg,
>phydata);
> }
> 
> It fixes an unchecked sxgbe_mdio_busy_wait in sxgbe_mdio_write btw.
> 
> sxgbe_mdio_read and sxgbe_mdio_write are mostly the same. Their core is
> imho worth sharing. You're of course free to rewrite or used the code above
as
> fits your needs.
OK.

> 
> sxgbe_priv_data should probably be sxgbe_priv, sxgbe or sx. It's everywhere
> and it's a first class type in the code. It's exceedingly litterate whereas
common
> drivers choose to be more lean.
OK.

> 
> --
> Ueimor

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


[PATCH V11 7/7] MAINTAINERS: add maintainer for Samsung sxgbe driver

2014-03-21 Thread Byungho An
From: Byungho An 

Signed-off-by: Byungho An 
---
 MAINTAINERS |9 +
 1 file changed, 9 insertions(+)

diff --git a/MAINTAINERS b/MAINTAINERS
index b7befe7..aeb81f2 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -7536,6 +7536,15 @@ S:   Supported
 L: linux-samsung-soc@vger.kernel.org (moderated for non-subscribers)
 F: drivers/clk/samsung/
 
+SAMSUNG SXGBE DRIVERS
+M: Byungho An 
+M: Girish K S 
+M: Siva Reddy Kallam 
+M: Vipul Pandya 
+S: Supported
+L: net...@vger.kernel.org
+F: drivers/net/ethernet/samsung/sxgbe/
+
 SERIAL DRIVERS
 M: Greg Kroah-Hartman 
 L: linux-ser...@vger.kernel.org
-- 
1.7.10.4


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


[PATCH V11 6/7] net: sxgbe: add ethtool related functions support Samsung sxgbe

2014-03-21 Thread Byungho An
From: Vipul Pandya 

This patch adds ethtool related functions.

Signed-off-by: Vipul Pandya 
Neatening-by: Joe Perches 
Signed-off-by: Byungho An 
---
 drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h  |   25 +-
 drivers/net/ethernet/samsung/sxgbe/sxgbe_ethtool.c |  509 +++-
 drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c|8 +-
 drivers/net/ethernet/samsung/sxgbe/sxgbe_reg.h |6 +
 4 files changed, 537 insertions(+), 11 deletions(-)

diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h 
b/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h
index 36a72a3..6e8ef39 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h
@@ -42,8 +42,12 @@ struct sxgbe_mtl_ops;
 #define SXGBE_RX_QUEUES   16
 
 /* Max/Min RI Watchdog Timer count value */
-#define SXGBE_MAX_DMA_RIWT 0xff
-#define SXGBE_MIN_DMA_RIWT 0x20
+/* Calculated based how much time does it take to fill 256KB Rx memory
+ * at 10Gb speed at 156MHz clock rate and considered little less then
+ * the actual value.
+ */
+#define SXGBE_MAX_DMA_RIWT 0x70
+#define SXGBE_MIN_DMA_RIWT 0x01
 
 /* Tx coalesce parameters */
 #define SXGBE_COAL_TX_TIMER4
@@ -194,6 +198,20 @@ enum dma_irq_status {
 #define SXGBE_FOR_EACH_QUEUE(max_queues, queue_num)\
for (queue_num = 0; queue_num < max_queues; queue_num++)
 
+#define DRV_VERSION "1.0.0"
+
+#define SXGBE_MAX_RX_CHANNELS  16
+#define SXGBE_MAX_TX_CHANNELS  16
+
+#define START_MAC_REG_OFFSET   0x
+#define MAX_MAC_REG_OFFSET 0x0DFC
+#define START_MTL_REG_OFFSET   0x1000
+#define MAX_MTL_REG_OFFSET 0x18FC
+#define START_DMA_REG_OFFSET   0x3000
+#define MAX_DMA_REG_OFFSET 0x38FC
+
+#define REG_SPACE_SIZE 0x2000
+
 /* sxgbe statistics counters */
 struct sxgbe_extra_stats {
/* TX/RX IRQ events */
@@ -479,6 +497,7 @@ struct sxgbe_priv_data {
/* advanced time stamp support */
u32 adv_ts;
int use_riwt;
+   struct ptp_clock *ptp_clock;
 
/* tc control */
int tx_tc;
@@ -515,4 +534,6 @@ const struct sxgbe_mtl_ops *sxgbe_get_mtl_ops(void);
 void sxgbe_disable_eee_mode(struct sxgbe_priv_data * const priv);
 bool sxgbe_eee_init(struct sxgbe_priv_data * const priv);
 
+int sxgbe_set_flow_ctrl(struct sxgbe_priv_data *priv, int rx, int tx);
+
 #endif /* __SXGBE_COMMON_H__ */
diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_ethtool.c 
b/drivers/net/ethernet/samsung/sxgbe/sxgbe_ethtool.c
index 9083300..471bc89 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_ethtool.c
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_ethtool.c
@@ -12,11 +12,17 @@
 
 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
 
+#include 
+#include 
 #include 
 #include 
+#include 
 #include 
+#include 
 
 #include "sxgbe_common.h"
+#include "sxgbe_reg.h"
+#include "sxgbe_dma.h"
 
 struct sxgbe_stats {
char stat_string[ETH_GSTRING_LEN];
@@ -32,16 +38,105 @@ struct sxgbe_stats {
 }
 
 static const struct sxgbe_stats sxgbe_gstrings_stats[] = {
+   /* TX/RX IRQ events */
+   SXGBE_STAT(tx_process_stopped_irq),
+   SXGBE_STAT(tx_ctxt_desc_err),
+   SXGBE_STAT(tx_threshold),
+   SXGBE_STAT(rx_threshold),
+   SXGBE_STAT(tx_pkt_n),
+   SXGBE_STAT(rx_pkt_n),
+   SXGBE_STAT(normal_irq_n),
+   SXGBE_STAT(tx_normal_irq_n),
+   SXGBE_STAT(rx_normal_irq_n),
+   SXGBE_STAT(napi_poll),
+   SXGBE_STAT(tx_clean),
+   SXGBE_STAT(tx_reset_ic_bit),
+   SXGBE_STAT(rx_process_stopped_irq),
+   SXGBE_STAT(rx_underflow_irq),
+
+   /* Bus access errors */
+   SXGBE_STAT(fatal_bus_error_irq),
+   SXGBE_STAT(tx_read_transfer_err),
+   SXGBE_STAT(tx_write_transfer_err),
+   SXGBE_STAT(tx_desc_access_err),
+   SXGBE_STAT(tx_buffer_access_err),
+   SXGBE_STAT(tx_data_transfer_err),
+   SXGBE_STAT(rx_read_transfer_err),
+   SXGBE_STAT(rx_write_transfer_err),
+   SXGBE_STAT(rx_desc_access_err),
+   SXGBE_STAT(rx_buffer_access_err),
+   SXGBE_STAT(rx_data_transfer_err),
+
+   /* EEE-LPI stats */
SXGBE_STAT(tx_lpi_entry_n),
SXGBE_STAT(tx_lpi_exit_n),
SXGBE_STAT(rx_lpi_entry_n),
SXGBE_STAT(rx_lpi_exit_n),
SXGBE_STAT(eee_wakeup_error_n),
+
+   /* RX specific */
+   /* L2 error */
+   SXGBE_STAT(rx_code_gmii_err),
+   SXGBE_STAT(rx_watchdog_err),
+   SXGBE_STAT(rx_crc_err),
+   SXGBE_STAT(rx_gaint_pkt_err),
+   SXGBE_STAT(ip_hdr_err),
+   SXGBE_STAT(ip_payload_err),
+   SXGBE_STAT(overflow_error),
+
+   /* L2 Pkt type */
+   SXGBE_STAT(len_pkt),
+   SXGBE_STAT(mac_ctl_pkt),
+   SXGBE_STAT(dcb_ctl_pkt),
+   SXGBE_STAT(arp_pkt),
+   SXGBE_STAT(oam_pkt),
+   SXGBE_STAT(untag_okt),
+   SXGBE_STAT(other_pkt),
+   SXGBE_STAT(svlan_tag_pkt),
+   SXGBE_STAT(cvlan_tag_pkt),
+   SX

[PATCH V11 1/7] sxgbe: Add device-tree binding support document

2014-03-21 Thread Byungho An
From: Siva Reddy 

This patch adds binding document for SXGBE ethernet driver via device-tree.

Signed-off-by: Siva Reddy Kallam 
Signed-off-by: Byungho An 
---
 .../devicetree/bindings/net/samsung-sxgbe.txt  |   52 
 1 file changed, 52 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/net/samsung-sxgbe.txt

diff --git a/Documentation/devicetree/bindings/net/samsung-sxgbe.txt 
b/Documentation/devicetree/bindings/net/samsung-sxgbe.txt
new file mode 100644
index 000..989f6c9
--- /dev/null
+++ b/Documentation/devicetree/bindings/net/samsung-sxgbe.txt
@@ -0,0 +1,52 @@
+* Samsung 10G Ethernet driver (SXGBE)
+
+Required properties:
+- compatible: Should be "samsung,sxgbe-v2.0a"
+- reg: Address and length of the register set for the device
+- interrupt-parent: Should be the phandle for the interrupt controller
+  that services interrupts for this device
+- interrupts: Should contain the SXGBE interrupts
+  These interrupts are ordered by fixed and follows variable
+  trasmit DMA interrupts, receive DMA interrupts and lpi interrupt.
+  index 0 - this is fixed common interrupt of SXGBE and it is always
+  available.
+  index 1 to 25 - 8 variable trasmit interrupts, variable 16 receive interrupts
+  and 1 optional lpi interrupt.
+- phy-mode: String, operation mode of the PHY interface.
+  Supported values are: "sgmii", "xgmii".
+- samsung,pbl: Integer, Programmable Burst Length.
+  Supported values are 1, 2, 4, 8, 16, or 32.
+- samsung,burst-map: Integer, Program the possible bursts supported by sxgbe
+  This is an interger and represents allowable DMA bursts when fixed burst.
+  Allowable range is 0x01-0x3F. When this field is set fixed burst is enabled.
+  When fixed length is needed for burst mode, it can be set within allowable
+  range.
+
+Optional properties:
+- mac-address: 6 bytes, mac address
+- max-frame-size: Maximum Transfer Unit (IEEE defined MTU), rather
+ than the maximum frame size.
+
+Example:
+
+   aliases {
+   ethernet0 = <&sxgbe0>;
+   };
+
+   sxgbe0: ethernet@1a04 {
+   compatible = "samsung,sxgbe-v2.0a";
+   reg = <0 0x1a04 0 0x1>;
+   interrupt-parent = <&gic>;
+   interrupts = <0 209 4>, <0 185 4>, <0 186 4>, <0 187 4>,
+<0 188 4>, <0 189 4>, <0 190 4>, <0 191 4>,
+<0 192 4>, <0 193 4>, <0 194 4>, <0 195 4>,
+<0 196 4>, <0 197 4>, <0 198 4>, <0 199 4>,
+<0 200 4>, <0 201 4>, <0 202 4>, <0 203 4>,
+<0 204 4>, <0 205 4>, <0 206 4>, <0 207 4>,
+<0 208 4>, <0 210 4>;
+   samsung,pbl = <0x08>
+   samsung,burst-map = <0x20>
+   mac-address = [ 00 11 22 33 44 55 ]; /* Filled in by U-Boot */
+   max-frame-size = <9000>;
+   phy-mode = "xgmii";
+   };
-- 
1.7.10.4


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


[PATCH V11 3/7] net: sxgbe: add TSO support for Samsung sxgbe

2014-03-21 Thread Byungho An
From: Vipul Pandya 

Enable TSO during initialization for each DMA channels

Signed-off-by: Vipul Pandya 
Neatening-by: Joe Perches 
Signed-off-by: Byungho An 
---
 drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h |1 +
 drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.h   |   17 +++--
 drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.c|   10 +++
 drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.h|2 +
 drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c   |   84 +++--
 5 files changed, 101 insertions(+), 13 deletions(-)

diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h 
b/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h
index 3e36ae1..ec5271d 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h
@@ -327,6 +327,7 @@ struct sxgbe_tx_queue {
u32 tx_coal_frames;
u32 tx_coal_timer;
int hwts_tx_en;
+   u16 prev_mss;
u8 queue_no;
 };
 
diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.h 
b/drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.h
index 4f5bb86..e553687 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.h
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.h
@@ -167,8 +167,9 @@ struct sxgbe_desc_ops {
void (*init_tx_desc)(struct sxgbe_tx_norm_desc *p);
 
/* Invoked by the xmit function to prepare the tx descriptor */
-   void (*tx_enable_tse)(struct sxgbe_tx_norm_desc *p, u8 is_tse,
- u32 hdr_len, u32 payload_len);
+   void (*tx_desc_enable_tse)(struct sxgbe_tx_norm_desc *p, u8 is_tse,
+  u32 total_hdr_len, u32 tcp_hdr_len,
+  u32 tcp_payload_len);
 
/* Assign buffer lengths for descriptor */
void (*prepare_tx_desc)(struct sxgbe_tx_norm_desc *p, u8 is_fd,
@@ -207,20 +208,26 @@ struct sxgbe_desc_ops {
int (*get_tx_timestamp_status)(struct sxgbe_tx_norm_desc *p);
 
/* TX Context Descripto Specific */
-   void (*init_tx_ctxt_desc)(struct sxgbe_tx_ctxt_desc *p);
+   void (*tx_ctxt_desc_set_ctxt)(struct sxgbe_tx_ctxt_desc *p);
 
/* Set the owner of the TX context descriptor */
-   void (*set_tx_ctxt_owner)(struct sxgbe_tx_ctxt_desc *p);
+   void (*tx_ctxt_desc_set_owner)(struct sxgbe_tx_ctxt_desc *p);
 
/* Get the owner of the TX context descriptor */
int (*get_tx_ctxt_owner)(struct sxgbe_tx_ctxt_desc *p);
 
/* Set TX mss */
-   void (*tx_ctxt_desc_setmss)(struct sxgbe_tx_ctxt_desc *p, int mss);
+   void (*tx_ctxt_desc_set_mss)(struct sxgbe_tx_ctxt_desc *p, u16 mss);
 
/* Set TX mss */
int (*tx_ctxt_desc_get_mss)(struct sxgbe_tx_ctxt_desc *p);
 
+   /* Set TX tcmssv */
+   void (*tx_ctxt_desc_set_tcmssv)(struct sxgbe_tx_ctxt_desc *p);
+
+   /* Reset TX ostc */
+   void (*tx_ctxt_desc_reset_ostc)(struct sxgbe_tx_ctxt_desc *p);
+
/* Set IVLAN information */
void (*tx_ctxt_desc_set_ivlantag)(struct sxgbe_tx_ctxt_desc *p,
  int is_ivlanvalid, int ivlan_tag,
diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.c 
b/drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.c
index ad82ad0..16e39d5 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.c
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.c
@@ -349,6 +349,15 @@ static void sxgbe_dma_rx_watchdog(void __iomem *ioaddr, 
u32 riwt)
}
 }
 
+static void sxgbe_enable_tso(void __iomem *ioaddr, u8 chan_num)
+{
+   u32 ctrl;
+
+   ctrl = readl(ioaddr + SXGBE_DMA_CHA_TXCTL_REG(chan_num));
+   ctrl |= SXGBE_DMA_CHA_TXCTL_TSE_ENABLE;
+   writel(ctrl, ioaddr + SXGBE_DMA_CHA_TXCTL_REG(chan_num));
+}
+
 static const struct sxgbe_dma_ops sxgbe_dma_ops = {
.init   = sxgbe_dma_init,
.cha_init   = sxgbe_dma_channel_init,
@@ -364,6 +373,7 @@ static const struct sxgbe_dma_ops sxgbe_dma_ops = {
.tx_dma_int_status  = sxgbe_tx_dma_int_status,
.rx_dma_int_status  = sxgbe_rx_dma_int_status,
.rx_watchdog= sxgbe_dma_rx_watchdog,
+   .enable_tso = sxgbe_enable_tso,
 };
 
 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 bbf167e..1607b54 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.h
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.h
@@ -41,6 +41,8 @@ struct sxgbe_dma_ops {
 struct sxgbe_extra_stats *x);
/* Program the HW RX Watchdog */
void (*rx_watchdog)(void __iomem *ioaddr, u32 riwt);
+   /* Enable TSO for each DMA channel */
+   void (*enable_tso)(void __iomem *ioaddr, u8 chan_num);
 };
 
 const struct sxgbe_dma_ops *sxgbe_get_dma_ops(void);
diff --git a/drivers/net/ethernet/samsung/sxgbe

[PATCH V11 4/7] net: sxgbe: add EEE(Energy Efficient Ethernet) for Samsung sxgbe

2014-03-21 Thread Byungho An
From: Girish K S 

Added support for the EEE(Energy Efficient Ethernet) in 10G ethernet driver.

Signed-off-by: Girish K S 
Neatening-by: Joe Perches 
Signed-off-by: Byungho An 
---
 drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h  |   53 +++
 drivers/net/ethernet/samsung/sxgbe/sxgbe_core.c|   86 +-
 drivers/net/ethernet/samsung/sxgbe/sxgbe_ethtool.c |   47 ++
 drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c|  165 +++-
 .../net/ethernet/samsung/sxgbe/sxgbe_platform.c|4 +
 drivers/net/ethernet/samsung/sxgbe/sxgbe_reg.h |5 +
 6 files changed, 358 insertions(+), 2 deletions(-)

diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h 
b/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h
index ec5271d..58e1ace 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h
@@ -115,6 +115,33 @@ struct sxgbe_mtl_ops;
 #define RX_PTP_SIGNAL  0x0A
 #define RX_PTP_RESV_MSG0x0F
 
+/* EEE-LPI mode  flags*/
+#define TX_ENTRY_LPI_MODE  0x10
+#define TX_EXIT_LPI_MODE   0x20
+#define RX_ENTRY_LPI_MODE  0x40
+#define RX_EXIT_LPI_MODE   0x80
+
+/* EEE-LPI Interrupt status flag */
+#define LPI_INT_STATUS BIT(5)
+
+/* EEE-LPI Default timer values */
+#define LPI_LINK_STATUS_TIMER  0x3E8
+#define LPI_MAC_WAIT_TIMER 0x00
+
+/* EEE-LPI Control and status definitions */
+#define LPI_CTRL_STATUS_TXABIT(19)
+#define LPI_CTRL_STATUS_PLSDIS BIT(18)
+#define LPI_CTRL_STATUS_PLSBIT(17)
+#define LPI_CTRL_STATUS_LPIEN  BIT(16)
+#define LPI_CTRL_STATUS_TXRSTP BIT(11)
+#define LPI_CTRL_STATUS_RXRSTP BIT(10)
+#define LPI_CTRL_STATUS_RLPIST BIT(9)
+#define LPI_CTRL_STATUS_TLPIST BIT(8)
+#define LPI_CTRL_STATUS_RLPIEX BIT(3)
+#define LPI_CTRL_STATUS_RLPIEN BIT(2)
+#define LPI_CTRL_STATUS_TLPIEX BIT(1)
+#define LPI_CTRL_STATUS_TLPIEN BIT(0)
+
 enum dma_irq_status {
tx_hard_error   = BIT(0),
tx_bump_tc  = BIT(1),
@@ -199,6 +226,13 @@ struct sxgbe_extra_stats {
unsigned long rx_buffer_access_err;
unsigned long rx_data_transfer_err;
 
+   /* EEE-LPI stats */
+   unsigned long tx_lpi_entry_n;
+   unsigned long tx_lpi_exit_n;
+   unsigned long rx_lpi_entry_n;
+   unsigned long rx_lpi_exit_n;
+   unsigned long eee_wakeup_error_n;
+
/* RX specific */
/* L2 error */
unsigned long rx_code_gmii_err;
@@ -296,6 +330,13 @@ struct sxgbe_core_ops {
   unsigned char feature_index);
/* adjust SXGBE speed */
void (*set_speed)(void __iomem *ioaddr, unsigned char speed);
+
+   /* EEE-LPI specific operations */
+   void (*set_eee_mode)(void __iomem *ioaddr);
+   void (*reset_eee_mode)(void __iomem *ioaddr);
+   void (*set_eee_timer)(void __iomem *ioaddr, const int ls,
+ const int tw);
+   void (*set_eee_pls)(void __iomem *ioaddr, const int link);
 };
 
 const struct sxgbe_core_ops *sxgbe_get_core_ops(void);
@@ -352,6 +393,8 @@ struct sxgbe_hw_features {
/* IEEE 1588-2008 */
unsigned int atime_stamp;
 
+   unsigned int eee;
+
unsigned int tx_csum_offload;
unsigned int rx_csum_offload;
unsigned int multi_macaddr;
@@ -435,6 +478,13 @@ struct sxgbe_priv_data {
/* tc control */
int tx_tc;
int rx_tc;
+   /* EEE-LPI specific members */
+   struct timer_list eee_ctrl_timer;
+   bool tx_path_in_lpi_mode;
+   int lpi_irq;
+   int eee_enabled;
+   int eee_active;
+   int tx_lpi_timer;
 };
 
 /* Function prototypes */
@@ -457,4 +507,7 @@ int sxgbe_restore(struct net_device *ndev);
 
 const struct sxgbe_mtl_ops *sxgbe_get_mtl_ops(void);
 
+void sxgbe_disable_eee_mode(struct sxgbe_priv_data * const priv);
+bool sxgbe_eee_init(struct sxgbe_priv_data * const priv);
+
 #endif /* __SXGBE_COMMON_H__ */
diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_core.c 
b/drivers/net/ethernet/samsung/sxgbe/sxgbe_core.c
index 4ad31bb..0164790 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_core.c
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_core.c
@@ -48,11 +48,38 @@ static void sxgbe_core_dump_regs(void __iomem *ioaddr)
 {
 }
 
+static int sxgbe_get_lpi_status(void __iomem *ioaddr, const u32 irq_status)
+{
+   int status = 0;
+   int lpi_status;
+
+   /* Reading this register shall clear all the LPI status bits */
+   lpi_status = readl(ioaddr + SXGBE_CORE_LPI_CTRL_STATUS);
+
+   if (lpi_status & LPI_CTRL_STATUS_TLPIEN)
+   status |= TX_ENTRY_LPI_MODE;
+   if (lpi_status & LPI_CTRL_STATUS_TLPIEX)
+   status |= TX_EXIT_LPI_MODE;
+   if (lpi_status & LPI_CTRL_STATUS_RLPIEN)
+   status |= RX_ENTRY_LPI_MODE;
+   if (lpi_status & LPI_CTRL_STATUS_RLPIEX)
+   status |= RX_EXIT_LPI_MODE;
+
+   return status;
+}
+
 /* Handle extra ev

[PATCH V11 0/7] add new Samsung SXGBE driver

2014-03-21 Thread Byungho An
Hi all,

This is 11th posting for SAMSUNG SXGBE driver.

Changes since v1:
- changed name of driver to SXGbE as per Ben's comment
- squashed Joe's neatening for many stuff in original patches

Changes since v2:
- updated and split binding document as per Mark's comment
- clean up codes as per Joe's comment
- removed unused fields and clean up codes as per Francois's comment
- removed module parameters as per Dave's comment
- moved driver directory to samsung/sxgbe/

Changes since v3:
- fixed Missing a blank line after declarations as per Dave's comment
- clean up codes as per Joe's comment
- removed reference of net_device.{irq, base_addr} as per Francois's comment

Changes since v4:
- updated binding document and DT related function as per Mark's comment

Changes since v5:
- updated binding document and DT related function as per Florian's comment
- fixed typo and shortened code as per Joe's comment

Changes since v6:
- updated TSO related functions as per Rayagond's comment
- updated binding document as per Mark's comment
- removed WoL patch from this patch set

Changes since v7:
- updated TSO related functions as per Rayagond's comment

Changes since v8:
- removed select and depends statement from vendor sub-section as per 
  Dave's comment

Changes since v9:
- removed adv-add-map, force-sf-dma-modei and force-thresh-dma-mode from 
  binding documnet as per Mark's comment

Changes since v10:
- clean up codes as per Francois's comment

Byungho An (1):
  MAINTAINERS: add maintainer for Samsung sxgbe driver

Girish K S (1):
  net: sxgbe: add EEE(Energy Efficient Ethernet) for Samsung sxgbe

Siva Reddy (2):
  sxgbe: Add device-tree binding support document
  net: sxgbe: add basic framework for Samsung 10Gb ethernet driver

Vipul Pandya (3):
  net: sxgbe: add TSO support for Samsung sxgbe
  net: sxgbe: add Checksum offload support for Samsung sxgbe
  net: sxgbe: add ethtool related functions support Samsung sxgbe

 .../devicetree/bindings/net/samsung-sxgbe.txt  |   52 +
 MAINTAINERS|9 +
 drivers/net/ethernet/Kconfig   |1 +
 drivers/net/ethernet/Makefile  |1 +
 drivers/net/ethernet/samsung/Kconfig   |   16 +
 drivers/net/ethernet/samsung/Makefile  |5 +
 drivers/net/ethernet/samsung/sxgbe/Kconfig |9 +
 drivers/net/ethernet/samsung/sxgbe/Makefile|4 +
 drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h  |  539 +
 drivers/net/ethernet/samsung/sxgbe/sxgbe_core.c|  262 +++
 drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.c|  515 +
 drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.h|  298 +++
 drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.c |  382 
 drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.h |   50 +
 drivers/net/ethernet/samsung/sxgbe/sxgbe_ethtool.c |  588 +
 drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c| 2316 
 drivers/net/ethernet/samsung/sxgbe/sxgbe_mdio.c|  266 +++
 drivers/net/ethernet/samsung/sxgbe/sxgbe_mtl.c |  254 +++
 drivers/net/ethernet/samsung/sxgbe/sxgbe_mtl.h |  104 +
 .../net/ethernet/samsung/sxgbe/sxgbe_platform.c|  246 +++
 drivers/net/ethernet/samsung/sxgbe/sxgbe_reg.h |  488 +
 drivers/net/ethernet/samsung/sxgbe/sxgbe_xpcs.c|   92 +
 drivers/net/ethernet/samsung/sxgbe/sxgbe_xpcs.h|   38 +
 include/linux/sxgbe_platform.h |   54 +
 24 files changed, 6589 insertions(+)

Thanks,
Byungho An

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


[PATCH V11 5/7] net: sxgbe: add Checksum offload support for Samsung sxgbe

2014-03-21 Thread Byungho An
From: Vipul Pandya 

This patch adds TX and RX checksum offload support.

Signed-off-by: Vipul Pandya 
Neatening-by: Joe Perches 
Signed-off-by: Byungho An 
---
 drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h |5 +++
 drivers/net/ethernet/samsung/sxgbe/sxgbe_core.c   |   20 +
 drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.h   |6 +--
 drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c   |   46 -
 4 files changed, 63 insertions(+), 14 deletions(-)

diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h 
b/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h
index 58e1ace..36a72a3 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h
@@ -337,6 +337,10 @@ struct sxgbe_core_ops {
void (*set_eee_timer)(void __iomem *ioaddr, const int ls,
  const int tw);
void (*set_eee_pls)(void __iomem *ioaddr, const int link);
+
+   /* Enable disable checksum offload operations */
+   void (*enable_rx_csum)(void __iomem *ioaddr);
+   void (*disable_rx_csum)(void __iomem *ioaddr);
 };
 
 const struct sxgbe_core_ops *sxgbe_get_core_ops(void);
@@ -449,6 +453,7 @@ struct sxgbe_priv_data {
struct sxgbe_ops *hw;   /* sxgbe specific ops */
int no_csum_insertion;
int irq;
+   int rxcsum_insertion;
spinlock_t stats_lock;  /* lock for tx/rx statatics */
 
struct phy_device *phydev;
diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_core.c 
b/drivers/net/ethernet/samsung/sxgbe/sxgbe_core.c
index 0164790..66d4a74 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_core.c
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_core.c
@@ -218,6 +218,24 @@ static void  sxgbe_set_eee_timer(void __iomem *ioaddr,
writel(value, ioaddr + SXGBE_CORE_LPI_TIMER_CTRL);
 }
 
+static void sxgbe_enable_rx_csum(void __iomem *ioaddr)
+{
+   u32 ctrl;
+
+   ctrl = readl(ioaddr + SXGBE_CORE_RX_CONFIG_REG);
+   ctrl |= SXGBE_RX_CSUMOFFLOAD_ENABLE;
+   writel(ctrl, ioaddr + SXGBE_CORE_RX_CONFIG_REG);
+}
+
+static void sxgbe_disable_rx_csum(void __iomem *ioaddr)
+{
+   u32 ctrl;
+
+   ctrl = readl(ioaddr + SXGBE_CORE_RX_CONFIG_REG);
+   ctrl &= ~SXGBE_RX_CSUMOFFLOAD_ENABLE;
+   writel(ctrl, ioaddr + SXGBE_CORE_RX_CONFIG_REG);
+}
+
 const struct sxgbe_core_ops core_ops = {
.core_init  = sxgbe_core_init,
.dump_regs  = sxgbe_core_dump_regs,
@@ -234,6 +252,8 @@ const struct sxgbe_core_ops core_ops = {
.reset_eee_mode = sxgbe_reset_eee_mode,
.set_eee_timer  = sxgbe_set_eee_timer,
.set_eee_pls= sxgbe_set_eee_pls,
+   .enable_rx_csum = sxgbe_enable_rx_csum,
+   .disable_rx_csum= sxgbe_disable_rx_csum,
 };
 
 const struct sxgbe_core_ops *sxgbe_get_core_ops(void)
diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.h 
b/drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.h
index e553687..838cb9f 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.h
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.h
@@ -113,7 +113,7 @@ struct sxgbe_rx_norm_desc {
/* WB RDES3 */
u32 pkt_len:14;
u32 rdes3_reserved:1;
-   u32 err_summary:15;
+   u32 err_summary:1;
u32 err_l2_type:4;
u32 layer34_pkt_type:4;
u32 no_coagulation_pkt:1;
@@ -273,8 +273,8 @@ struct sxgbe_desc_ops {
int (*get_rx_ld_status)(struct sxgbe_rx_norm_desc *p);
 
/* Return the reception status looking at the RDES1 */
-   void (*rx_wbstatus)(struct sxgbe_rx_norm_desc *p,
-   struct sxgbe_extra_stats *x);
+   int (*rx_wbstatus)(struct sxgbe_rx_norm_desc *p,
+  struct sxgbe_extra_stats *x, int *checksum);
 
/* Get own bit */
int (*get_rx_ctxt_owner)(struct sxgbe_rx_ctxt_desc *p);
diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c 
b/drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c
index b4b7689..1a8cee4 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c
@@ -1255,6 +1255,7 @@ void sxgbe_tso_prepare(struct sxgbe_priv_data *priv,
 static netdev_tx_t sxgbe_xmit(struct sk_buff *skb, struct net_device *dev)
 {
unsigned int entry, frag_num;
+   int cksum_flag = 0;
struct netdev_queue *dev_txq;
unsigned txq_index = skb_get_queue_mapping(skb);
struct sxgbe_priv_data *priv = netdev_priv(dev);
@@ -1335,7 +1336,7 @@ static netdev_tx_t sxgbe_xmit(struct sk_buff *skb, struct 
net_device *dev)
   __func__);
 
priv->hw->desc->prepare_tx_desc(tx_desc, 1, no_pagedlen,
- 

RE: [PATCH V10 2/7] net: sxgbe: add basic framework for Samsung 10Gb ethernet driver

2014-03-21 Thread Byungho An
Francois Romieu  :
> Byungho An  :
> [...]
> > +static int sxgbe_hw_init(struct sxgbe_priv_data * const priv) {
> 
>   struct sxgbe_ops *hw = priv->hw;
> 
> > +   u32 ctrl_ids;
> [...]
> > +struct sxgbe_priv_data *sxgbe_dvr_probe(struct device *device,
> 
> nit: s/dvr/drv/ ?
Yes, it is tiriva. but drv is looks better.

> 
> (several occurences in the driver)
> 
> > +   struct sxgbe_plat_data *plat_dat,
> > +   void __iomem *addr)
> > +{
> > +   int ret = 0;
> 
> Useless init.
> 
OK

> > +   struct net_device *ndev = NULL;
> 
> Useless init.
OK

> 
> > +   struct sxgbe_priv_data *priv;
> 
> Nit: you may consider reorganizing the variables in an inverted xmas tree
> fashion at some point.
Does it look better? No problem.

> 
> > +
> > +   ndev = alloc_etherdev_mqs(sizeof(struct sxgbe_priv_data),
> > + SXGBE_TX_QUEUES, SXGBE_RX_QUEUES);
> > +   if (!ndev)
> > +   return NULL;
> > +
> > +   SET_NETDEV_DEV(ndev, device);
> > +
> > +   priv = netdev_priv(ndev);
> > +   priv->device = device;
> > +   priv->dev = ndev;
> > +
> > +   ether_setup(ndev);
> 
> Useless.
> 
> (see alloc_etherdev_mqs vs alloc_netdev_mqs)
OK, removal.

> 
> > +
> > +   sxgbe_set_ethtool_ops(ndev);
> > +   priv->plat = plat_dat;
> > +   priv->ioaddr = addr;
> > +
> > +   /* Init MAC and get the capabilities */
> > +   ret = sxgbe_hw_init(priv);
> 
> sxgbe_hw_init can't fail. It should return void.
OK

> 
> [...]
> > +   /* MDIO bus Registration */
> > +   ret = sxgbe_mdio_register(ndev);
> > +   if (ret < 0) {
> > +   netdev_dbg(ndev, "%s: MDIO bus (id: %d) registration
> failed\n",
> > +  __func__, priv->plat->bus_id);
> > +   goto error_mdio_register;
> > +   }
> > +
> > +   ret = register_netdev(ndev);
> > +   if (ret) {
> > +   pr_err("%s: ERROR %i registering the device\n", __func__,
ret);
> > +   goto error_netdev_register;
> 
> sxgbe_mdio_register is left unbalanced in the error path.
> 
> I am more used to 'goto what_should_be_done' style than 'goto
> where_it_comes_from' (both require to check if the label are correctly
ordered
> in the unwind path though).
I think it seems that current style has no problem.

> 
> > +   }
> > +
> > +   sxgbe_check_ether_addr(priv);
> > +
> > +   return priv;
> > +
> > +error_mdio_register:
> > +   clk_put(priv->sxgbe_clk);
> > +error_clk_get:
> > +   unregister_netdev(ndev);
> 
> There's no failure point past register_netdev: unregister_netdev can't be
> needed.
OK

> 
> > +error_netdev_register:
> > +   netif_napi_del(&priv->napi);
> > +error_free_netdev:
> > +   free_netdev(ndev);
> > +
> > +   return NULL;
> 
> Nit: you may use ERR_PTR and always return 'priv'. The caller could thus
> propagate the error code.
I'll consider it, not for this patch set.

> 
> > +}
> > +
> > +/**
> > + * sxgbe_dvr_remove
> > + * @ndev: net device pointer
> > + * Description: this function resets the TX/RX processes, disables
> > +the MAC RX/TX
> > + * changes the link status, releases the DMA descriptor rings.
> > + */
> > +int sxgbe_dvr_remove(struct net_device *ndev) {
> > +   struct sxgbe_priv_data *priv = netdev_priv(ndev);
> 
>   struct sxgbe_ops *hw = priv->hw;
> 
> > +
> > +   netdev_info(ndev, "%s: removing driver\n", __func__);
> > +
> > +   priv->hw->dma->stop_rx(priv->ioaddr, SXGBE_RX_QUEUES);
> > +   priv->hw->dma->stop_tx(priv->ioaddr, SXGBE_TX_QUEUES);
> > +
> > +   priv->hw->mac->enable_tx(priv->ioaddr, false);
> > +   priv->hw->mac->enable_rx(priv->ioaddr, false);
> [...]
> > +static int sxgbe_mdio_read(struct mii_bus *bus, int phyaddr, int
> > +phyreg) {
> > +   struct net_device *ndev = bus->priv;
> > +   struct sxgbe_priv_data *priv = netdev_priv(ndev);
> > +   u32 devaddr, reg_val;
> 
> Excess scope for devaddr.
> 
> > +   u32 mii_addr = priv->hw->mii.addr;
> > +   u32 mii_data = priv->hw->mii.data;
> 
> const ?
Those can be const

> 
> > +
> > +   /* check for busy wait */
> 
> Useless comment. Pure noise for the reviewer / maintainer.
Really?

> 
> > +   if (sxgbe_mdio_bus

[PATCH V10 6/7] net: sxgbe: add ethtool related functions support Samsung sxgbe

2014-03-21 Thread Byungho An
From: Vipul Pandya 

This patch adds ethtool related functions.

Signed-off-by: Vipul Pandya 
Neatening-by: Joe Perches 
Signed-off-by: Byungho An 
---
 drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h  |   25 +-
 drivers/net/ethernet/samsung/sxgbe/sxgbe_ethtool.c |  509 +++-
 drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c|8 +-
 drivers/net/ethernet/samsung/sxgbe/sxgbe_reg.h |6 +
 4 files changed, 537 insertions(+), 11 deletions(-)

diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h 
b/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h
index f06d439..ef7dc80 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h
@@ -42,8 +42,12 @@ struct sxgbe_mtl_ops;
 #define SXGBE_RX_QUEUES   16
 
 /* Max/Min RI Watchdog Timer count value */
-#define SXGBE_MAX_DMA_RIWT 0xff
-#define SXGBE_MIN_DMA_RIWT 0x20
+/* Calculated based how much time does it take to fill 256KB Rx memory
+ * at 10Gb speed at 156MHz clock rate and considered little less then
+ * the actual value.
+ */
+#define SXGBE_MAX_DMA_RIWT 0x70
+#define SXGBE_MIN_DMA_RIWT 0x01
 
 /* Tx coalesce parameters */
 #define SXGBE_COAL_TX_TIMER4
@@ -194,6 +198,20 @@ enum dma_irq_status {
 #define SXGBE_FOR_EACH_QUEUE(max_queues, queue_num)\
for (queue_num = 0; queue_num < max_queues; queue_num++)
 
+#define DRV_VERSION "1.0.0"
+
+#define SXGBE_MAX_RX_CHANNELS  16
+#define SXGBE_MAX_TX_CHANNELS  16
+
+#define START_MAC_REG_OFFSET   0x
+#define MAX_MAC_REG_OFFSET 0x0DFC
+#define START_MTL_REG_OFFSET   0x1000
+#define MAX_MTL_REG_OFFSET 0x18FC
+#define START_DMA_REG_OFFSET   0x3000
+#define MAX_DMA_REG_OFFSET 0x38FC
+
+#define REG_SPACE_SIZE 0x2000
+
 /* sxgbe statistics counters */
 struct sxgbe_extra_stats {
/* TX/RX IRQ events */
@@ -479,6 +497,7 @@ struct sxgbe_priv_data {
/* advanced time stamp support */
u32 adv_ts;
int use_riwt;
+   struct ptp_clock *ptp_clock;
 
/* tc control */
int tx_tc;
@@ -515,4 +534,6 @@ const struct sxgbe_mtl_ops *sxgbe_get_mtl_ops(void);
 void sxgbe_disable_eee_mode(struct sxgbe_priv_data * const priv);
 bool sxgbe_eee_init(struct sxgbe_priv_data * const priv);
 
+int sxgbe_set_flow_ctrl(struct sxgbe_priv_data *priv, int rx, int tx);
+
 #endif /* __SXGBE_COMMON_H__ */
diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_ethtool.c 
b/drivers/net/ethernet/samsung/sxgbe/sxgbe_ethtool.c
index 9083300..471bc89 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_ethtool.c
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_ethtool.c
@@ -12,11 +12,17 @@
 
 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
 
+#include 
+#include 
 #include 
 #include 
+#include 
 #include 
+#include 
 
 #include "sxgbe_common.h"
+#include "sxgbe_reg.h"
+#include "sxgbe_dma.h"
 
 struct sxgbe_stats {
char stat_string[ETH_GSTRING_LEN];
@@ -32,16 +38,105 @@ struct sxgbe_stats {
 }
 
 static const struct sxgbe_stats sxgbe_gstrings_stats[] = {
+   /* TX/RX IRQ events */
+   SXGBE_STAT(tx_process_stopped_irq),
+   SXGBE_STAT(tx_ctxt_desc_err),
+   SXGBE_STAT(tx_threshold),
+   SXGBE_STAT(rx_threshold),
+   SXGBE_STAT(tx_pkt_n),
+   SXGBE_STAT(rx_pkt_n),
+   SXGBE_STAT(normal_irq_n),
+   SXGBE_STAT(tx_normal_irq_n),
+   SXGBE_STAT(rx_normal_irq_n),
+   SXGBE_STAT(napi_poll),
+   SXGBE_STAT(tx_clean),
+   SXGBE_STAT(tx_reset_ic_bit),
+   SXGBE_STAT(rx_process_stopped_irq),
+   SXGBE_STAT(rx_underflow_irq),
+
+   /* Bus access errors */
+   SXGBE_STAT(fatal_bus_error_irq),
+   SXGBE_STAT(tx_read_transfer_err),
+   SXGBE_STAT(tx_write_transfer_err),
+   SXGBE_STAT(tx_desc_access_err),
+   SXGBE_STAT(tx_buffer_access_err),
+   SXGBE_STAT(tx_data_transfer_err),
+   SXGBE_STAT(rx_read_transfer_err),
+   SXGBE_STAT(rx_write_transfer_err),
+   SXGBE_STAT(rx_desc_access_err),
+   SXGBE_STAT(rx_buffer_access_err),
+   SXGBE_STAT(rx_data_transfer_err),
+
+   /* EEE-LPI stats */
SXGBE_STAT(tx_lpi_entry_n),
SXGBE_STAT(tx_lpi_exit_n),
SXGBE_STAT(rx_lpi_entry_n),
SXGBE_STAT(rx_lpi_exit_n),
SXGBE_STAT(eee_wakeup_error_n),
+
+   /* RX specific */
+   /* L2 error */
+   SXGBE_STAT(rx_code_gmii_err),
+   SXGBE_STAT(rx_watchdog_err),
+   SXGBE_STAT(rx_crc_err),
+   SXGBE_STAT(rx_gaint_pkt_err),
+   SXGBE_STAT(ip_hdr_err),
+   SXGBE_STAT(ip_payload_err),
+   SXGBE_STAT(overflow_error),
+
+   /* L2 Pkt type */
+   SXGBE_STAT(len_pkt),
+   SXGBE_STAT(mac_ctl_pkt),
+   SXGBE_STAT(dcb_ctl_pkt),
+   SXGBE_STAT(arp_pkt),
+   SXGBE_STAT(oam_pkt),
+   SXGBE_STAT(untag_okt),
+   SXGBE_STAT(other_pkt),
+   SXGBE_STAT(svlan_tag_pkt),
+   SXGBE_STAT(cvlan_tag_pkt),
+   SX

[PATCH V10 4/7] net: sxgbe: add EEE(Energy Efficient Ethernet) for Samsung sxgbe

2014-03-21 Thread Byungho An
From: Girish K S 

Added support for the EEE(Energy Efficient Ethernet) in 10G ethernet driver.

Signed-off-by: Girish K S 
Neatening-by: Joe Perches 
Signed-off-by: Byungho An 
---
 drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h  |   53 +++
 drivers/net/ethernet/samsung/sxgbe/sxgbe_core.c|   86 +-
 drivers/net/ethernet/samsung/sxgbe/sxgbe_ethtool.c |   47 ++
 drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c|  165 +++-
 .../net/ethernet/samsung/sxgbe/sxgbe_platform.c|4 +
 drivers/net/ethernet/samsung/sxgbe/sxgbe_reg.h |5 +
 6 files changed, 358 insertions(+), 2 deletions(-)

diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h 
b/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h
index f8ba7e4..5f1d02c 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h
@@ -115,6 +115,33 @@ struct sxgbe_mtl_ops;
 #define RX_PTP_SIGNAL  0x0A
 #define RX_PTP_RESV_MSG0x0F
 
+/* EEE-LPI mode  flags*/
+#define TX_ENTRY_LPI_MODE  0x10
+#define TX_EXIT_LPI_MODE   0x20
+#define RX_ENTRY_LPI_MODE  0x40
+#define RX_EXIT_LPI_MODE   0x80
+
+/* EEE-LPI Interrupt status flag */
+#define LPI_INT_STATUS BIT(5)
+
+/* EEE-LPI Default timer values */
+#define LPI_LINK_STATUS_TIMER  0x3E8
+#define LPI_MAC_WAIT_TIMER 0x00
+
+/* EEE-LPI Control and status definitions */
+#define LPI_CTRL_STATUS_TXABIT(19)
+#define LPI_CTRL_STATUS_PLSDIS BIT(18)
+#define LPI_CTRL_STATUS_PLSBIT(17)
+#define LPI_CTRL_STATUS_LPIEN  BIT(16)
+#define LPI_CTRL_STATUS_TXRSTP BIT(11)
+#define LPI_CTRL_STATUS_RXRSTP BIT(10)
+#define LPI_CTRL_STATUS_RLPIST BIT(9)
+#define LPI_CTRL_STATUS_TLPIST BIT(8)
+#define LPI_CTRL_STATUS_RLPIEX BIT(3)
+#define LPI_CTRL_STATUS_RLPIEN BIT(2)
+#define LPI_CTRL_STATUS_TLPIEX BIT(1)
+#define LPI_CTRL_STATUS_TLPIEN BIT(0)
+
 enum dma_irq_status {
tx_hard_error   = BIT(0),
tx_bump_tc  = BIT(1),
@@ -199,6 +226,13 @@ struct sxgbe_extra_stats {
unsigned long rx_buffer_access_err;
unsigned long rx_data_transfer_err;
 
+   /* EEE-LPI stats */
+   unsigned long tx_lpi_entry_n;
+   unsigned long tx_lpi_exit_n;
+   unsigned long rx_lpi_entry_n;
+   unsigned long rx_lpi_exit_n;
+   unsigned long eee_wakeup_error_n;
+
/* RX specific */
/* L2 error */
unsigned long rx_code_gmii_err;
@@ -296,6 +330,13 @@ struct sxgbe_core_ops {
   unsigned char feature_index);
/* adjust SXGBE speed */
void (*set_speed)(void __iomem *ioaddr, unsigned char speed);
+
+   /* EEE-LPI specific operations */
+   void (*set_eee_mode)(void __iomem *ioaddr);
+   void (*reset_eee_mode)(void __iomem *ioaddr);
+   void (*set_eee_timer)(void __iomem *ioaddr, const int ls,
+ const int tw);
+   void (*set_eee_pls)(void __iomem *ioaddr, const int link);
 };
 
 const struct sxgbe_core_ops *sxgbe_get_core_ops(void);
@@ -352,6 +393,8 @@ struct sxgbe_hw_features {
/* IEEE 1588-2008 */
unsigned int atime_stamp;
 
+   unsigned int eee;
+
unsigned int tx_csum_offload;
unsigned int rx_csum_offload;
unsigned int multi_macaddr;
@@ -435,6 +478,13 @@ struct sxgbe_priv_data {
/* tc control */
int tx_tc;
int rx_tc;
+   /* EEE-LPI specific members */
+   struct timer_list eee_ctrl_timer;
+   bool tx_path_in_lpi_mode;
+   int lpi_irq;
+   int eee_enabled;
+   int eee_active;
+   int tx_lpi_timer;
 };
 
 /* Function prototypes */
@@ -457,4 +507,7 @@ int sxgbe_restore(struct net_device *ndev);
 
 const struct sxgbe_mtl_ops *sxgbe_get_mtl_ops(void);
 
+void sxgbe_disable_eee_mode(struct sxgbe_priv_data * const priv);
+bool sxgbe_eee_init(struct sxgbe_priv_data * const priv);
+
 #endif /* __SXGBE_COMMON_H__ */
diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_core.c 
b/drivers/net/ethernet/samsung/sxgbe/sxgbe_core.c
index 17eea58..bf93b16 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_core.c
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_core.c
@@ -47,11 +47,38 @@ static void sxgbe_core_dump_regs(void __iomem *ioaddr)
 {
 }
 
+static int sxgbe_get_lpi_status(void __iomem *ioaddr, const u32 irq_status)
+{
+   int status = 0;
+   int lpi_status;
+
+   /* Reading this register shall clear all the LPI status bits */
+   lpi_status = readl(ioaddr + SXGBE_CORE_LPI_CTRL_STATUS);
+
+   if (lpi_status & LPI_CTRL_STATUS_TLPIEN)
+   status |= TX_ENTRY_LPI_MODE;
+   if (lpi_status & LPI_CTRL_STATUS_TLPIEX)
+   status |= TX_EXIT_LPI_MODE;
+   if (lpi_status & LPI_CTRL_STATUS_RLPIEN)
+   status |= RX_ENTRY_LPI_MODE;
+   if (lpi_status & LPI_CTRL_STATUS_RLPIEX)
+   status |= RX_EXIT_LPI_MODE;
+
+   return status;
+}
+
 /* Handle extra ev

[PATCH V10 7/7] MAINTAINERS: add maintainer for Samsung sxgbe driver

2014-03-21 Thread Byungho An
From: Byungho An 

Signed-off-by: Byungho An 
---
 MAINTAINERS |9 +
 1 file changed, 9 insertions(+)

diff --git a/MAINTAINERS b/MAINTAINERS
index b7befe7..aeb81f2 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -7536,6 +7536,15 @@ S:   Supported
 L: linux-samsung-soc@vger.kernel.org (moderated for non-subscribers)
 F: drivers/clk/samsung/
 
+SAMSUNG SXGBE DRIVERS
+M: Byungho An 
+M: Girish K S 
+M: Siva Reddy Kallam 
+M: Vipul Pandya 
+S: Supported
+L: net...@vger.kernel.org
+F: drivers/net/ethernet/samsung/sxgbe/
+
 SERIAL DRIVERS
 M: Greg Kroah-Hartman 
 L: linux-ser...@vger.kernel.org
-- 
1.7.10.4


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


[PATCH V10 5/7] net: sxgbe: add Checksum offload support for Samsung sxgbe

2014-03-21 Thread Byungho An
From: Vipul Pandya 

This patch adds TX and RX checksum offload support.

Signed-off-by: Vipul Pandya 
Neatening-by: Joe Perches 
Signed-off-by: Byungho An 
---
 drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h |5 +++
 drivers/net/ethernet/samsung/sxgbe/sxgbe_core.c   |   20 +
 drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.h   |6 +--
 drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c   |   46 -
 4 files changed, 63 insertions(+), 14 deletions(-)

diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h 
b/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h
index 5f1d02c..f06d439 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h
@@ -337,6 +337,10 @@ struct sxgbe_core_ops {
void (*set_eee_timer)(void __iomem *ioaddr, const int ls,
  const int tw);
void (*set_eee_pls)(void __iomem *ioaddr, const int link);
+
+   /* Enable disable checksum offload operations */
+   void (*enable_rx_csum)(void __iomem *ioaddr);
+   void (*disable_rx_csum)(void __iomem *ioaddr);
 };
 
 const struct sxgbe_core_ops *sxgbe_get_core_ops(void);
@@ -449,6 +453,7 @@ struct sxgbe_priv_data {
struct sxgbe_ops *hw;   /* sxgbe specific ops */
int no_csum_insertion;
int irq;
+   int rxcsum_insertion;
spinlock_t stats_lock;  /* lock for tx/rx statatics */
 
struct phy_device *phydev;
diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_core.c 
b/drivers/net/ethernet/samsung/sxgbe/sxgbe_core.c
index bf93b16..5885fd6 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_core.c
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_core.c
@@ -217,6 +217,24 @@ static void  sxgbe_set_eee_timer(void __iomem *ioaddr,
writel(value, ioaddr + SXGBE_CORE_LPI_TIMER_CTRL);
 }
 
+static void sxgbe_enable_rx_csum(void __iomem *ioaddr)
+{
+   u32 ctrl;
+
+   ctrl = readl(ioaddr + SXGBE_CORE_RX_CONFIG_REG);
+   ctrl |= SXGBE_RX_CSUMOFFLOAD_ENABLE;
+   writel(ctrl, ioaddr + SXGBE_CORE_RX_CONFIG_REG);
+}
+
+static void sxgbe_disable_rx_csum(void __iomem *ioaddr)
+{
+   u32 ctrl;
+
+   ctrl = readl(ioaddr + SXGBE_CORE_RX_CONFIG_REG);
+   ctrl &= ~SXGBE_RX_CSUMOFFLOAD_ENABLE;
+   writel(ctrl, ioaddr + SXGBE_CORE_RX_CONFIG_REG);
+}
+
 const struct sxgbe_core_ops core_ops = {
.core_init = sxgbe_core_init,
.dump_regs = sxgbe_core_dump_regs,
@@ -233,6 +251,8 @@ const struct sxgbe_core_ops core_ops = {
.reset_eee_mode = sxgbe_reset_eee_mode,
.set_eee_timer = sxgbe_set_eee_timer,
.set_eee_pls = sxgbe_set_eee_pls,
+   .enable_rx_csum = sxgbe_enable_rx_csum,
+   .disable_rx_csum = sxgbe_disable_rx_csum,
 };
 
 const struct sxgbe_core_ops *sxgbe_get_core_ops(void)
diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.h 
b/drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.h
index 547edf3..3c0b5a8 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.h
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.h
@@ -113,7 +113,7 @@ struct sxgbe_rx_norm_desc {
/* WB RDES3 */
u32 pkt_len:14;
u32 rdes3_reserved:1;
-   u32 err_summary:15;
+   u32 err_summary:1;
u32 err_l2_type:4;
u32 layer34_pkt_type:4;
u32 no_coagulation_pkt:1;
@@ -273,8 +273,8 @@ struct sxgbe_desc_ops {
int (*get_rx_ld_status)(struct sxgbe_rx_norm_desc *p);
 
/* Return the reception status looking at the RDES1 */
-   void (*rx_wbstatus)(struct sxgbe_rx_norm_desc *p,
-   struct sxgbe_extra_stats *x);
+   int (*rx_wbstatus)(struct sxgbe_rx_norm_desc *p,
+  struct sxgbe_extra_stats *x, int *checksum);
 
/* Get own bit */
int (*get_rx_ctxt_owner)(struct sxgbe_rx_ctxt_desc *p);
diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c 
b/drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c
index fb22c7e..e3f16c3 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c
@@ -1252,6 +1252,7 @@ void sxgbe_tso_prepare(struct sxgbe_priv_data *priv,
 static netdev_tx_t sxgbe_xmit(struct sk_buff *skb, struct net_device *dev)
 {
unsigned int entry, frag_num;
+   int cksum_flag = 0;
struct netdev_queue *dev_txq;
unsigned txq_index = skb_get_queue_mapping(skb);
struct sxgbe_priv_data *priv = netdev_priv(dev);
@@ -1332,7 +1333,7 @@ static netdev_tx_t sxgbe_xmit(struct sk_buff *skb, struct 
net_device *dev)
   __func__);
 
priv->hw->desc->prepare_tx_desc(tx_desc, 1, no_pagedlen,
-   no_pagedlen);
+ 

[PATCH V10 1/7] sxgbe: Add device-tree binding support document

2014-03-21 Thread Byungho An
From: Siva Reddy 

This patch adds binding document for SXGBE ethernet driver via device-tree.

Signed-off-by: Siva Reddy Kallam 
Signed-off-by: Byungho An 
---
 .../devicetree/bindings/net/samsung-sxgbe.txt  |   52 
 1 file changed, 52 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/net/samsung-sxgbe.txt

diff --git a/Documentation/devicetree/bindings/net/samsung-sxgbe.txt 
b/Documentation/devicetree/bindings/net/samsung-sxgbe.txt
new file mode 100644
index 000..989f6c9
--- /dev/null
+++ b/Documentation/devicetree/bindings/net/samsung-sxgbe.txt
@@ -0,0 +1,52 @@
+* Samsung 10G Ethernet driver (SXGBE)
+
+Required properties:
+- compatible: Should be "samsung,sxgbe-v2.0a"
+- reg: Address and length of the register set for the device
+- interrupt-parent: Should be the phandle for the interrupt controller
+  that services interrupts for this device
+- interrupts: Should contain the SXGBE interrupts
+  These interrupts are ordered by fixed and follows variable
+  trasmit DMA interrupts, receive DMA interrupts and lpi interrupt.
+  index 0 - this is fixed common interrupt of SXGBE and it is always
+  available.
+  index 1 to 25 - 8 variable trasmit interrupts, variable 16 receive interrupts
+  and 1 optional lpi interrupt.
+- phy-mode: String, operation mode of the PHY interface.
+  Supported values are: "sgmii", "xgmii".
+- samsung,pbl: Integer, Programmable Burst Length.
+  Supported values are 1, 2, 4, 8, 16, or 32.
+- samsung,burst-map: Integer, Program the possible bursts supported by sxgbe
+  This is an interger and represents allowable DMA bursts when fixed burst.
+  Allowable range is 0x01-0x3F. When this field is set fixed burst is enabled.
+  When fixed length is needed for burst mode, it can be set within allowable
+  range.
+
+Optional properties:
+- mac-address: 6 bytes, mac address
+- max-frame-size: Maximum Transfer Unit (IEEE defined MTU), rather
+ than the maximum frame size.
+
+Example:
+
+   aliases {
+   ethernet0 = <&sxgbe0>;
+   };
+
+   sxgbe0: ethernet@1a04 {
+   compatible = "samsung,sxgbe-v2.0a";
+   reg = <0 0x1a04 0 0x1>;
+   interrupt-parent = <&gic>;
+   interrupts = <0 209 4>, <0 185 4>, <0 186 4>, <0 187 4>,
+<0 188 4>, <0 189 4>, <0 190 4>, <0 191 4>,
+<0 192 4>, <0 193 4>, <0 194 4>, <0 195 4>,
+<0 196 4>, <0 197 4>, <0 198 4>, <0 199 4>,
+<0 200 4>, <0 201 4>, <0 202 4>, <0 203 4>,
+<0 204 4>, <0 205 4>, <0 206 4>, <0 207 4>,
+<0 208 4>, <0 210 4>;
+   samsung,pbl = <0x08>
+   samsung,burst-map = <0x20>
+   mac-address = [ 00 11 22 33 44 55 ]; /* Filled in by U-Boot */
+   max-frame-size = <9000>;
+   phy-mode = "xgmii";
+   };
-- 
1.7.10.4


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


[PATCH V10 3/7] net: sxgbe: add TSO support for Samsung sxgbe

2014-03-21 Thread Byungho An
From: Vipul Pandya 

Enable TSO during initialization for each DMA channels

Signed-off-by: Vipul Pandya 
Neatening-by: Joe Perches 
Signed-off-by: Byungho An 
---
 drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h |1 +
 drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.h   |   17 +++--
 drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.c|   10 +++
 drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.h|2 +
 drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c   |   84 +++--
 5 files changed, 101 insertions(+), 13 deletions(-)

diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h 
b/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h
index 587b691..f8ba7e4 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h
@@ -327,6 +327,7 @@ struct sxgbe_tx_queue {
u32 tx_coal_frames;
u32 tx_coal_timer;
int hwts_tx_en;
+   u16 prev_mss;
u8 queue_no;
 };
 
diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.h 
b/drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.h
index 41844d4..547edf3 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.h
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.h
@@ -167,8 +167,9 @@ struct sxgbe_desc_ops {
void (*init_tx_desc)(struct sxgbe_tx_norm_desc *p);
 
/* Invoked by the xmit function to prepare the tx descriptor */
-   void (*tx_enable_tse)(struct sxgbe_tx_norm_desc *p, u8 is_tse,
-   u32 hdr_len, u32 payload_len);
+   void (*tx_desc_enable_tse)(struct sxgbe_tx_norm_desc *p, u8 is_tse,
+  u32 total_hdr_len, u32 tcp_hdr_len,
+  u32 tcp_payload_len);
 
/* Assign buffer lengths for descriptor */
void (*prepare_tx_desc)(struct sxgbe_tx_norm_desc *p, u8 is_fd,
@@ -207,20 +208,26 @@ struct sxgbe_desc_ops {
int (*get_tx_timestamp_status)(struct sxgbe_tx_norm_desc *p);
 
/* TX Context Descripto Specific */
-   void (*init_tx_ctxt_desc)(struct sxgbe_tx_ctxt_desc *p);
+   void (*tx_ctxt_desc_set_ctxt)(struct sxgbe_tx_ctxt_desc *p);
 
/* Set the owner of the TX context descriptor */
-   void (*set_tx_ctxt_owner)(struct sxgbe_tx_ctxt_desc *p);
+   void (*tx_ctxt_desc_set_owner)(struct sxgbe_tx_ctxt_desc *p);
 
/* Get the owner of the TX context descriptor */
int (*get_tx_ctxt_owner)(struct sxgbe_tx_ctxt_desc *p);
 
/* Set TX mss */
-   void (*tx_ctxt_desc_setmss)(struct sxgbe_tx_ctxt_desc *p, int mss);
+   void (*tx_ctxt_desc_set_mss)(struct sxgbe_tx_ctxt_desc *p, u16 mss);
 
/* Set TX mss */
int (*tx_ctxt_desc_get_mss)(struct sxgbe_tx_ctxt_desc *p);
 
+   /* Set TX tcmssv */
+   void (*tx_ctxt_desc_set_tcmssv)(struct sxgbe_tx_ctxt_desc *p);
+
+   /* Reset TX ostc */
+   void (*tx_ctxt_desc_reset_ostc)(struct sxgbe_tx_ctxt_desc *p);
+
/* Set IVLAN information */
void (*tx_ctxt_desc_set_ivlantag)(struct sxgbe_tx_ctxt_desc *p,
  int is_ivlanvalid, int ivlan_tag,
diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.c 
b/drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.c
index 8e3f7bf..7b17fc9 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.c
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.c
@@ -349,6 +349,15 @@ static void sxgbe_dma_rx_watchdog(void __iomem *ioaddr, 
u32 riwt)
}
 }
 
+static void sxgbe_enable_tso(void __iomem *ioaddr, u8 chan_num)
+{
+   u32 ctrl;
+
+   ctrl = readl(ioaddr + SXGBE_DMA_CHA_TXCTL_REG(chan_num));
+   ctrl |= SXGBE_DMA_CHA_TXCTL_TSE_ENABLE;
+   writel(ctrl, ioaddr + SXGBE_DMA_CHA_TXCTL_REG(chan_num));
+}
+
 static const struct sxgbe_dma_ops sxgbe_dma_ops = {
.init = sxgbe_dma_init,
.cha_init = sxgbe_dma_channel_init,
@@ -364,6 +373,7 @@ static const struct sxgbe_dma_ops sxgbe_dma_ops = {
.tx_dma_int_status = sxgbe_tx_dma_int_status,
.rx_dma_int_status = sxgbe_rx_dma_int_status,
.rx_watchdog = sxgbe_dma_rx_watchdog,
+   .enable_tso = sxgbe_enable_tso,
 };
 
 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 51bfb9f..60de088 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.h
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.h
@@ -41,6 +41,8 @@ struct sxgbe_dma_ops {
 struct sxgbe_extra_stats *x);
/* Program the HW RX Watchdog */
void (*rx_watchdog)(void __iomem *ioaddr, u32 riwt);
+   /* Enable TSO for each DMA channel */
+   void (*enable_tso)(void __iomem *ioaddr, u8 chan_num);
 };
 
 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 ecee6f1..7f1a191 100644
--- a/drivers/net

[PATCH V10 0/7] add new Samsung SXGBE driver

2014-03-21 Thread Byungho An
Hi all,

This is 10th posting for SAMSUNG SXGBE driver.

Changes since v1:
- changed name of driver to SXGbE as per Ben's comment
- squashed Joe's neatening for many stuff in original patches

Changes since v2:
- updated and split binding document as per Mark's comment
- clean up codes as per Joe's comment
- removed unused fields and clean up codes as per Francois's comment
- removed module parameters as per Dave's comment
- moved driver directory to samsung/sxgbe/

Changes since v3:
- fixed Missing a blank line after declarations as per Dave's comment
- clean up codes as per Joe's comment
- removed reference of net_device.{irq, base_addr} as per Francois's comment

Changes since v4:
- updated binding document and DT related function as per Mark's comment

Changes since v5:
- updated binding document and DT related function as per Florian's comment
- fixed typo and shortened code as per Joe's comment

Changes since v6:
- updated TSO related functions as per Rayagond's comment
- updated binding document as per Mark's comment
- removed WoL patch from this patch set

Changes since v7:
- updated TSO related functions as per Rayagond's comment

Changes since v8:
- removed select and depends statement from vendor sub-section as per 
  Dave's comment

Changes since v9:
- removed adv-add-map, force-sf-dma-modei and force-thresh-dma-mode from 
  binding document and updated platform_get_irq as per Mark's comment

Byungho An (1):
  MAINTAINERS: add maintainer for Samsung sxgbe driver

Girish K S (1):
  net: sxgbe: add EEE(Energy Efficient Ethernet) for Samsung sxgbe

Siva Reddy (2):
  sxgbe: Add device-tree binding support document
  net: sxgbe: add basic framework for Samsung 10Gb ethernet driver

Vipul Pandya (3):
  net: sxgbe: add TSO support for Samsung sxgbe
  net: sxgbe: add Checksum offload support for Samsung sxgbe
  net: sxgbe: add ethtool related functions support Samsung sxgbe

 .../devicetree/bindings/net/samsung-sxgbe.txt  |   52 +
 MAINTAINERS|9 +
 drivers/net/ethernet/Kconfig   |1 +
 drivers/net/ethernet/Makefile  |1 +
 drivers/net/ethernet/samsung/Kconfig   |   16 +
 drivers/net/ethernet/samsung/Makefile  |5 +
 drivers/net/ethernet/samsung/sxgbe/Kconfig |9 +
 drivers/net/ethernet/samsung/sxgbe/Makefile|4 +
 drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h  |  539 +
 drivers/net/ethernet/samsung/sxgbe/sxgbe_core.c|  261 +++
 drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.c|  515 +
 drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.h|  298 +++
 drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.c |  382 
 drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.h |   50 +
 drivers/net/ethernet/samsung/sxgbe/sxgbe_ethtool.c |  588 +
 drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c| 2313 
 drivers/net/ethernet/samsung/sxgbe/sxgbe_mdio.c|  271 +++
 drivers/net/ethernet/samsung/sxgbe/sxgbe_mtl.c |  252 +++
 drivers/net/ethernet/samsung/sxgbe/sxgbe_mtl.h |  104 +
 .../net/ethernet/samsung/sxgbe/sxgbe_platform.c|  249 +++
 drivers/net/ethernet/samsung/sxgbe/sxgbe_reg.h |  488 +
 drivers/net/ethernet/samsung/sxgbe/sxgbe_xpcs.c|   92 +
 drivers/net/ethernet/samsung/sxgbe/sxgbe_xpcs.h|   38 +
 include/linux/sxgbe_platform.h     |   54 +
 24 files changed, 6591 insertions(+)

Thanks,
Byungho An

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


RE: [PATCH V7 6/7] net: sxgbe: add ethtool related functions support Samsung sxgbe

2014-03-21 Thread Byungho An

Vince Bridgers  wrote :
> On Wed, Mar 19, 2014 at 9:26 PM, Byungho An 
> wrote:
> > From: Vipul Pandya 
> >
> > This patch adds ethtool related functions.
> >
> > Signed-off-by: Vipul Pandya 
> > Neatening-by: Joe Perches 
> > Signed-off-by: Byungho An 
> > ---
> >  drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h  |   25 +-
> >  drivers/net/ethernet/samsung/sxgbe/sxgbe_ethtool.c |  509
> +++-
> >  drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c|8 +-
> >  drivers/net/ethernet/samsung/sxgbe/sxgbe_reg.h |6 +
> >  4 files changed, 537 insertions(+), 11 deletions(-)
> >
> > diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h
> > b/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h
> > index f06d439..ef7dc80 100644
> > --- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h
> > +++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h
> > @@ -42,8 +42,12 @@ struct sxgbe_mtl_ops;
> >  #define SXGBE_RX_QUEUES   16
> >
> >  /* Max/Min RI Watchdog Timer count value */
> > -#define SXGBE_MAX_DMA_RIWT 0xff
> > -#define SXGBE_MIN_DMA_RIWT 0x20
> > +/* Calculated based how much time does it take to fill 256KB Rx
> > +memory
> > + * at 10Gb speed at 156MHz clock rate and considered little less then
> > + * the actual value.
> > + */
> > +#define SXGBE_MAX_DMA_RIWT 0x70
> > +#define SXGBE_MIN_DMA_RIWT 0x01
> >
> >  /* Tx coalesce parameters */
> >  #define SXGBE_COAL_TX_TIMER4
> > @@ -194,6 +198,20 @@ enum dma_irq_status {
> >  #define SXGBE_FOR_EACH_QUEUE(max_queues, queue_num)\
> > for (queue_num = 0; queue_num < max_queues; queue_num++)
> >
> > +#define DRV_VERSION "1.0.0"
> > +
> > +#define SXGBE_MAX_RX_CHANNELS  16
> > +#define SXGBE_MAX_TX_CHANNELS  16
> > +
> > +#define START_MAC_REG_OFFSET   0x
> > +#define MAX_MAC_REG_OFFSET 0x0DFC
> > +#define START_MTL_REG_OFFSET   0x1000
> > +#define MAX_MTL_REG_OFFSET 0x18FC
> > +#define START_DMA_REG_OFFSET   0x3000
> > +#define MAX_DMA_REG_OFFSET 0x38FC
> > +
> > +#define REG_SPACE_SIZE 0x2000
> > +
> >  /* sxgbe statistics counters */
> >  struct sxgbe_extra_stats {
> > /* TX/RX IRQ events */
> > @@ -479,6 +497,7 @@ struct sxgbe_priv_data {
> > /* advanced time stamp support */
> > u32 adv_ts;
> > int use_riwt;
> > +   struct ptp_clock *ptp_clock;
> >
> > /* tc control */
> > int tx_tc;
> > @@ -515,4 +534,6 @@ const struct sxgbe_mtl_ops
> > *sxgbe_get_mtl_ops(void);  void sxgbe_disable_eee_mode(struct
> > sxgbe_priv_data * const priv);  bool sxgbe_eee_init(struct
> > sxgbe_priv_data * const priv);
> >
> > +int sxgbe_set_flow_ctrl(struct sxgbe_priv_data *priv, int rx, int
> > +tx);
> > +
> >  #endif /* __SXGBE_COMMON_H__ */
> > diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_ethtool.c
> > b/drivers/net/ethernet/samsung/sxgbe/sxgbe_ethtool.c
> > index 9083300..471bc89 100644
> > --- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_ethtool.c
> > +++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_ethtool.c
> > @@ -12,11 +12,17 @@
> >
> >  #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
> >
> > +#include 
> > +#include 
> >  #include 
> >  #include 
> > +#include 
> >  #include 
> > +#include 
> >
> >  #include "sxgbe_common.h"
> > +#include "sxgbe_reg.h"
> > +#include "sxgbe_dma.h"
> >
> >  struct sxgbe_stats {
> > char stat_string[ETH_GSTRING_LEN]; @@ -32,16 +38,105 @@ struct
> > sxgbe_stats {  }
> >
> >  static const struct sxgbe_stats sxgbe_gstrings_stats[] = {
> > +   /* TX/RX IRQ events */
> > +   SXGBE_STAT(tx_process_stopped_irq),
> > +   SXGBE_STAT(tx_ctxt_desc_err),
> > +   SXGBE_STAT(tx_threshold),
> > +   SXGBE_STAT(rx_threshold),
> > +   SXGBE_STAT(tx_pkt_n),
> > +   SXGBE_STAT(rx_pkt_n),
> > +   SXGBE_STAT(normal_irq_n),
> > +   SXGBE_STAT(tx_normal_irq_n),
> > +   SXGBE_STAT(rx_normal_irq_n),
> > +   SXGBE_STAT(napi_poll),
> > +   SXGBE_STAT(tx_clean),
> > +   SXGBE_STAT(tx_reset_ic_bit),
> > +   SXGBE_STAT(rx_process_stopped_irq),
> > +   SXGBE_STAT(rx_underflow_irq),
> > +
> > +   /* Bus access errors */
> > +   SXGBE_STAT(fatal_bus_error_irq),
> > +   S

RE: [PATCH V4 1/8] sxgbe: Add device-tree binding support document

2014-03-21 Thread Byungho An

Mark Rutland  wrote :
> On Wed, Mar 19, 2014 at 10:32:48PM +0000, Byungho An wrote:
> > Mark Rutland  :
> > > On Tue, Mar 18, 2014 at 04:27:46PM +, Byungho An wrote:
> > > > Mark Rutland  :
> > > > > Hi,
> > > > >
> > > > > As a general note it's helpful for devicetree to be Cc'd on the
> > > > > entire
> > > > series
> > > > > (though the binding document should be a separate patch) as it
> > > > > provides
> > > > useful
> > > > > context for reviewing the binding.
> > > > OK.
> > > >
> > > > >
> > > > > On Tue, Mar 18, 2014 at 06:47:13AM +, Byungho An wrote:
> > > > > > From: Siva Reddy 
> > > > > >
> > > > > > This patch adds binding document for SXGBE ethernet driver via
> > > > device-tree.
> > > > > >
> > > > > > Signed-off-by: Siva Reddy Kallam 
> > > > > > Signed-off-by: Byungho An 
> > > > > > ---
> > > > > >  .../devicetree/bindings/net/samsung-sxgbe.txt  |   53
> > > > > > 
> > > > > >  1 file changed, 53 insertions(+)  create mode 100644
> > > > > > Documentation/devicetree/bindings/net/samsung-sxgbe.txt
> > > > > >
> > > > > > diff --git
> > > > > > a/Documentation/devicetree/bindings/net/samsung-sxgbe.txt
> > > > > > b/Documentation/devicetree/bindings/net/samsung-sxgbe.txt
> > > > > > new file mode 100644
> > > > > > index 000..ca27947
> > > > > > --- /dev/null
> > > > > > +++ b/Documentation/devicetree/bindings/net/samsung-sxgbe.txt
> > > > > > @@ -0,0 +1,53 @@
> > > > > > +* Samsung 10G Ethernet driver (SXGBE)
> > > > > > +
> > > > > > +Required properties:
> > > > > > +- compatible: Should be "samsung,sxgbe-v2.0a"
> > > > > > +- reg: Address and length of the register set for the device
> > > > > > +- interrupt-parent: Should be the phandle for the interrupt
> > > > > > +controller
> > > > > > +  that services interrupts for this device
> > > > > > +- interrupts: Should contain the SXGBE interrupts
> > > > > > +  These interrupts are ordered by fixed and follows variable
> > > > > > +  trasmit DMA interrupts, receive DMA interrupts and lpi
interrupt.
> > > > > > +  index 0 - this is fixed common interrupt of SXGBE and it is
> > > > > > +always
> > > > > > +  available.
> > > > > > +  index 1 to 25 - 8 variable trasmit interrupts, variable 16
> > > > > > +receive
> > > > > > interrupts
> > > > > > +  and 1 optional lpi interrupt.
> > > > > > +- phy-mode: String, operation mode of the PHY interface.
> > > > > > +  Supported values are: "xaui", "gmii".
> > > > > > +- samsung,pbl: Integer, Programmable Burst Length.
> > > > > > +  Supported values are 1, 2, 4, 8, 16, or 32.
> > > > >
> > > > > There's no need to abbreviate to "pbl".
> > > > >
> > > > > Is this a property of the hardware, or configuration that the
> > > > > kernel will
> > > > program
> > > > > in? If the latter, why can the kernel not choose?
> > > > Yes, this is hardware property
> > >
> > > Ok.
> > >
> > > >
> > > > >
> > > > > > +- samsung,fixed-burst: Boolean, Program the DMA to use the
> > > > > > +fixed burst mode
> > > > > > +- samsung,burst-map: Integer, Program the possible bursts
> > > > > > +supported by sxgbe
> > > > > > +  This is an interger and represents allowable DMA bursts
> > > > > > +when fixed
> > > > burst.
> > > > > > +  Allowable range is 0x00-0x3F. This field is valid only when
> > > > > > +fixed burst is
> > > > > > +  enabled, otherwise ignored.
> > > > >
> > > > > If that's the case, why not have just this property and have it
> > > > > imply the
> > > > use of
> > > > > fixed burst mode?
> > > > OK. It will be implemente

RE: [PATCH V8 1/7] sxgbe: Add device-tree binding support document

2014-03-21 Thread Byungho An
Mark Rutland  wrote:
> > +Example:
> > +
> > +   aliases {
> > +   ethernet0 = <&sxgbe0>;
> > +   };
> > +
> > +   sxgbe0: ethernet@1a04 {
> > +   compatible = "samsung,sxgbe-v2.0a";
> > +   reg = <0 0x1a04 0 0x1>;
> > +   interrupt-parent = <&gic>;
> > +   interrupts = <0 209 4>, <0 185 4>, <0 186 4>, <0 187 4>,
> > +<0 188 4>, <0 189 4>, <0 190 4>, <0 191 4>,
> > +<0 192 4>, <0 193 4>, <0 194 4>, <0 195 4>,
> > +<0 196 4>, <0 197 4>, <0 198 4>, <0 199 4>,
> > +<0 200 4>, <0 201 4>, <0 202 4>, <0 203 4>,
> > +<0 204 4>, <0 205 4>, <0 206 4>, <0 207 4>,
> > +<0 208 4>, <0 210 4>;
> > +   samsung,pbl = <0x08>
> > +   samsung,burst-map = <0x20>
> > +   samsung,adv-addr-mode = "true"
> > +   samsung,force-sf-dma-mode = "true"
> 
> You don't need these strings for boolean properties. Their presence of the
> property alone (even in the absende of a value) is sufficient. These should
> simply be:
> 
>   samsung,adv-addr-map;
>   samsung,force-sf-dma-mode;
OK. It looks better

> 
> It is still an open question as to whether these properties are necessary.
I understood, actually those two properties are for future.
"samsung,adv-addr-map" is needed for more than 32 bit addressing and
"force-sf-dma-mode" to use full dma fifo.
As of now these are not mandatory property.
These will be added later, I'll remove it this patch series.

> 
> Cheers,
> Mark.
> --
> To unsubscribe from this list: send the line "unsubscribe netdev" in the
body of
> a message to majord...@vger.kernel.org More majordomo info at
> http://vger.kernel.org/majordomo-info.html

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


RE: [PATCH V8 4/7] net: sxgbe: add EEE(Energy Efficient Ethernet) for Samsung sxgbe

2014-03-21 Thread Byungho An

Mark Rutland  wrote:
> On Thu, Mar 20, 2014 at 05:26:06PM +0000, Byungho An wrote:
> > From: Girish K S 
> >
> > Added support for the EEE(Energy Efficient Ethernet) in 10G ethernet
driver.
> >
> > Signed-off-by: Girish K S 
> > Neatening-by: Joe Perches 
> > Signed-off-by: Byungho An 
> > ---
> >  drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h  |   53 +++
> >  drivers/net/ethernet/samsung/sxgbe/sxgbe_core.c|   86 +-
> >  drivers/net/ethernet/samsung/sxgbe/sxgbe_ethtool.c |   47 ++
> >  drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c|  165
> +++-
> >  .../net/ethernet/samsung/sxgbe/sxgbe_platform.c|4 +
> >  drivers/net/ethernet/samsung/sxgbe/sxgbe_reg.h |5 +
> >  6 files changed, 358 insertions(+), 2 deletions(-)
> 
> [...]
> 
> > diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_platform.c
> > b/drivers/net/ethernet/samsung/sxgbe/sxgbe_platform.c
> > index e410d84..b23ec57 100644
> > --- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_platform.c
> > +++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_platform.c
> > @@ -160,6 +160,10 @@ static int sxgbe_platform_probe(struct
> platform_device *pdev)
> > }
> > }
> >
> > +   priv->lpi_irq = irq_of_parse_and_map(dev->of_node, loop++);
> 
> You can use platform_get_irq(pdev, loop++) here. The interrupts have already
> been parsed elsewhere.
OK.

> 
> Cheers,
> Mark.
> --
> To unsubscribe from this list: send the line "unsubscribe netdev" in the
body of
> a message to majord...@vger.kernel.org More majordomo info at
> http://vger.kernel.org/majordomo-info.html

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


[PATCH V9 1/7] sxgbe: Add device-tree binding support document

2014-03-20 Thread Byungho An
From: Siva Reddy 

This patch adds binding document for SXGBE ethernet driver via device-tree.

Signed-off-by: Siva Reddy Kallam 
Signed-off-by: Byungho An 
---
 .../devicetree/bindings/net/samsung-sxgbe.txt  |   60 
 1 file changed, 60 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/net/samsung-sxgbe.txt

diff --git a/Documentation/devicetree/bindings/net/samsung-sxgbe.txt 
b/Documentation/devicetree/bindings/net/samsung-sxgbe.txt
new file mode 100644
index 000..231acf8
--- /dev/null
+++ b/Documentation/devicetree/bindings/net/samsung-sxgbe.txt
@@ -0,0 +1,60 @@
+* Samsung 10G Ethernet driver (SXGBE)
+
+Required properties:
+- compatible: Should be "samsung,sxgbe-v2.0a"
+- reg: Address and length of the register set for the device
+- interrupt-parent: Should be the phandle for the interrupt controller
+  that services interrupts for this device
+- interrupts: Should contain the SXGBE interrupts
+  These interrupts are ordered by fixed and follows variable
+  trasmit DMA interrupts, receive DMA interrupts and lpi interrupt.
+  index 0 - this is fixed common interrupt of SXGBE and it is always
+  available.
+  index 1 to 25 - 8 variable trasmit interrupts, variable 16 receive interrupts
+  and 1 optional lpi interrupt.
+- phy-mode: String, operation mode of the PHY interface.
+  Supported values are: "sgmii", "xgmii".
+- samsung,pbl: Integer, Programmable Burst Length.
+  Supported values are 1, 2, 4, 8, 16, or 32.
+- samsung,burst-map: Integer, Program the possible bursts supported by sxgbe
+  This is an interger and represents allowable DMA bursts when fixed burst.
+  Allowable range is 0x01-0x3F. When this field is set fixed burst is enabled.
+  When fixed length is needed for burst mode, it can be set within allowable
+  range.
+- samsung,adv-addr-mode: Boolean, Program the DMA to use Enhanced address mode.
+  When enhanced address mode is needed, it can be set.
+- samsung,force-thresh-dma-mode: Boolean, Force DMA to use the threshold mode
+  for both tx and rx.
+- samsung,force-sf-dma-mode: Boolean, Force DMA to use the Store and Forward
+  mode for both tx and rx. This flag is ignored if force-thresh-dma-mode is 
set.
+
+Optional properties:
+- mac-address: 6 bytes, mac address
+- max-frame-size: Maximum Transfer Unit (IEEE defined MTU), rather
+ than the maximum frame size.
+
+Example:
+
+   aliases {
+   ethernet0 = <&sxgbe0>;
+   };
+
+   sxgbe0: ethernet@1a04 {
+   compatible = "samsung,sxgbe-v2.0a";
+   reg = <0 0x1a04 0 0x1>;
+   interrupt-parent = <&gic>;
+   interrupts = <0 209 4>, <0 185 4>, <0 186 4>, <0 187 4>,
+<0 188 4>, <0 189 4>, <0 190 4>, <0 191 4>,
+<0 192 4>, <0 193 4>, <0 194 4>, <0 195 4>,
+<0 196 4>, <0 197 4>, <0 198 4>, <0 199 4>,
+<0 200 4>, <0 201 4>, <0 202 4>, <0 203 4>,
+<0 204 4>, <0 205 4>, <0 206 4>, <0 207 4>,
+<0 208 4>, <0 210 4>;
+   samsung,pbl = <0x08>
+   samsung,burst-map = <0x20>
+   samsung,adv-addr-mode = "true"
+   samsung,force-sf-dma-mode = "true"
+   mac-address = [ 00 11 22 33 44 55 ]; /* Filled in by U-Boot */
+   max-frame-size = <9000>;
+   phy-mode = "xgmii";
+   };
-- 
1.7.10.4


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


[PATCH V9 4/7] net: sxgbe: add EEE(Energy Efficient Ethernet) for Samsung sxgbe

2014-03-20 Thread Byungho An
From: Girish K S 

Added support for the EEE(Energy Efficient Ethernet) in 10G ethernet driver.

Signed-off-by: Girish K S 
Neatening-by: Joe Perches 
Signed-off-by: Byungho An 
---
 drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h  |   53 +++
 drivers/net/ethernet/samsung/sxgbe/sxgbe_core.c|   86 +-
 drivers/net/ethernet/samsung/sxgbe/sxgbe_ethtool.c |   47 ++
 drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c|  165 +++-
 .../net/ethernet/samsung/sxgbe/sxgbe_platform.c|4 +
 drivers/net/ethernet/samsung/sxgbe/sxgbe_reg.h |5 +
 6 files changed, 358 insertions(+), 2 deletions(-)

diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h 
b/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h
index f8ba7e4..5f1d02c 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h
@@ -115,6 +115,33 @@ struct sxgbe_mtl_ops;
 #define RX_PTP_SIGNAL  0x0A
 #define RX_PTP_RESV_MSG0x0F
 
+/* EEE-LPI mode  flags*/
+#define TX_ENTRY_LPI_MODE  0x10
+#define TX_EXIT_LPI_MODE   0x20
+#define RX_ENTRY_LPI_MODE  0x40
+#define RX_EXIT_LPI_MODE   0x80
+
+/* EEE-LPI Interrupt status flag */
+#define LPI_INT_STATUS BIT(5)
+
+/* EEE-LPI Default timer values */
+#define LPI_LINK_STATUS_TIMER  0x3E8
+#define LPI_MAC_WAIT_TIMER 0x00
+
+/* EEE-LPI Control and status definitions */
+#define LPI_CTRL_STATUS_TXABIT(19)
+#define LPI_CTRL_STATUS_PLSDIS BIT(18)
+#define LPI_CTRL_STATUS_PLSBIT(17)
+#define LPI_CTRL_STATUS_LPIEN  BIT(16)
+#define LPI_CTRL_STATUS_TXRSTP BIT(11)
+#define LPI_CTRL_STATUS_RXRSTP BIT(10)
+#define LPI_CTRL_STATUS_RLPIST BIT(9)
+#define LPI_CTRL_STATUS_TLPIST BIT(8)
+#define LPI_CTRL_STATUS_RLPIEX BIT(3)
+#define LPI_CTRL_STATUS_RLPIEN BIT(2)
+#define LPI_CTRL_STATUS_TLPIEX BIT(1)
+#define LPI_CTRL_STATUS_TLPIEN BIT(0)
+
 enum dma_irq_status {
tx_hard_error   = BIT(0),
tx_bump_tc  = BIT(1),
@@ -199,6 +226,13 @@ struct sxgbe_extra_stats {
unsigned long rx_buffer_access_err;
unsigned long rx_data_transfer_err;
 
+   /* EEE-LPI stats */
+   unsigned long tx_lpi_entry_n;
+   unsigned long tx_lpi_exit_n;
+   unsigned long rx_lpi_entry_n;
+   unsigned long rx_lpi_exit_n;
+   unsigned long eee_wakeup_error_n;
+
/* RX specific */
/* L2 error */
unsigned long rx_code_gmii_err;
@@ -296,6 +330,13 @@ struct sxgbe_core_ops {
   unsigned char feature_index);
/* adjust SXGBE speed */
void (*set_speed)(void __iomem *ioaddr, unsigned char speed);
+
+   /* EEE-LPI specific operations */
+   void (*set_eee_mode)(void __iomem *ioaddr);
+   void (*reset_eee_mode)(void __iomem *ioaddr);
+   void (*set_eee_timer)(void __iomem *ioaddr, const int ls,
+ const int tw);
+   void (*set_eee_pls)(void __iomem *ioaddr, const int link);
 };
 
 const struct sxgbe_core_ops *sxgbe_get_core_ops(void);
@@ -352,6 +393,8 @@ struct sxgbe_hw_features {
/* IEEE 1588-2008 */
unsigned int atime_stamp;
 
+   unsigned int eee;
+
unsigned int tx_csum_offload;
unsigned int rx_csum_offload;
unsigned int multi_macaddr;
@@ -435,6 +478,13 @@ struct sxgbe_priv_data {
/* tc control */
int tx_tc;
int rx_tc;
+   /* EEE-LPI specific members */
+   struct timer_list eee_ctrl_timer;
+   bool tx_path_in_lpi_mode;
+   int lpi_irq;
+   int eee_enabled;
+   int eee_active;
+   int tx_lpi_timer;
 };
 
 /* Function prototypes */
@@ -457,4 +507,7 @@ int sxgbe_restore(struct net_device *ndev);
 
 const struct sxgbe_mtl_ops *sxgbe_get_mtl_ops(void);
 
+void sxgbe_disable_eee_mode(struct sxgbe_priv_data * const priv);
+bool sxgbe_eee_init(struct sxgbe_priv_data * const priv);
+
 #endif /* __SXGBE_COMMON_H__ */
diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_core.c 
b/drivers/net/ethernet/samsung/sxgbe/sxgbe_core.c
index 17eea58..bf93b16 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_core.c
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_core.c
@@ -47,11 +47,38 @@ static void sxgbe_core_dump_regs(void __iomem *ioaddr)
 {
 }
 
+static int sxgbe_get_lpi_status(void __iomem *ioaddr, const u32 irq_status)
+{
+   int status = 0;
+   int lpi_status;
+
+   /* Reading this register shall clear all the LPI status bits */
+   lpi_status = readl(ioaddr + SXGBE_CORE_LPI_CTRL_STATUS);
+
+   if (lpi_status & LPI_CTRL_STATUS_TLPIEN)
+   status |= TX_ENTRY_LPI_MODE;
+   if (lpi_status & LPI_CTRL_STATUS_TLPIEX)
+   status |= TX_EXIT_LPI_MODE;
+   if (lpi_status & LPI_CTRL_STATUS_RLPIEN)
+   status |= RX_ENTRY_LPI_MODE;
+   if (lpi_status & LPI_CTRL_STATUS_RLPIEX)
+   status |= RX_EXIT_LPI_MODE;
+
+   return status;
+}
+
 /* Handle extra ev

[PATCH V9 5/7] net: sxgbe: add Checksum offload support for Samsung sxgbe

2014-03-20 Thread Byungho An
From: Vipul Pandya 

This patch adds TX and RX checksum offload support.

Signed-off-by: Vipul Pandya 
Neatening-by: Joe Perches 
Signed-off-by: Byungho An 
---
 drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h |5 +++
 drivers/net/ethernet/samsung/sxgbe/sxgbe_core.c   |   20 +
 drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.h   |6 +--
 drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c   |   46 -
 4 files changed, 63 insertions(+), 14 deletions(-)

diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h 
b/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h
index 5f1d02c..f06d439 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h
@@ -337,6 +337,10 @@ struct sxgbe_core_ops {
void (*set_eee_timer)(void __iomem *ioaddr, const int ls,
  const int tw);
void (*set_eee_pls)(void __iomem *ioaddr, const int link);
+
+   /* Enable disable checksum offload operations */
+   void (*enable_rx_csum)(void __iomem *ioaddr);
+   void (*disable_rx_csum)(void __iomem *ioaddr);
 };
 
 const struct sxgbe_core_ops *sxgbe_get_core_ops(void);
@@ -449,6 +453,7 @@ struct sxgbe_priv_data {
struct sxgbe_ops *hw;   /* sxgbe specific ops */
int no_csum_insertion;
int irq;
+   int rxcsum_insertion;
spinlock_t stats_lock;  /* lock for tx/rx statatics */
 
struct phy_device *phydev;
diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_core.c 
b/drivers/net/ethernet/samsung/sxgbe/sxgbe_core.c
index bf93b16..5885fd6 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_core.c
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_core.c
@@ -217,6 +217,24 @@ static void  sxgbe_set_eee_timer(void __iomem *ioaddr,
writel(value, ioaddr + SXGBE_CORE_LPI_TIMER_CTRL);
 }
 
+static void sxgbe_enable_rx_csum(void __iomem *ioaddr)
+{
+   u32 ctrl;
+
+   ctrl = readl(ioaddr + SXGBE_CORE_RX_CONFIG_REG);
+   ctrl |= SXGBE_RX_CSUMOFFLOAD_ENABLE;
+   writel(ctrl, ioaddr + SXGBE_CORE_RX_CONFIG_REG);
+}
+
+static void sxgbe_disable_rx_csum(void __iomem *ioaddr)
+{
+   u32 ctrl;
+
+   ctrl = readl(ioaddr + SXGBE_CORE_RX_CONFIG_REG);
+   ctrl &= ~SXGBE_RX_CSUMOFFLOAD_ENABLE;
+   writel(ctrl, ioaddr + SXGBE_CORE_RX_CONFIG_REG);
+}
+
 const struct sxgbe_core_ops core_ops = {
.core_init = sxgbe_core_init,
.dump_regs = sxgbe_core_dump_regs,
@@ -233,6 +251,8 @@ const struct sxgbe_core_ops core_ops = {
.reset_eee_mode = sxgbe_reset_eee_mode,
.set_eee_timer = sxgbe_set_eee_timer,
.set_eee_pls = sxgbe_set_eee_pls,
+   .enable_rx_csum = sxgbe_enable_rx_csum,
+   .disable_rx_csum = sxgbe_disable_rx_csum,
 };
 
 const struct sxgbe_core_ops *sxgbe_get_core_ops(void)
diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.h 
b/drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.h
index 547edf3..3c0b5a8 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.h
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.h
@@ -113,7 +113,7 @@ struct sxgbe_rx_norm_desc {
/* WB RDES3 */
u32 pkt_len:14;
u32 rdes3_reserved:1;
-   u32 err_summary:15;
+   u32 err_summary:1;
u32 err_l2_type:4;
u32 layer34_pkt_type:4;
u32 no_coagulation_pkt:1;
@@ -273,8 +273,8 @@ struct sxgbe_desc_ops {
int (*get_rx_ld_status)(struct sxgbe_rx_norm_desc *p);
 
/* Return the reception status looking at the RDES1 */
-   void (*rx_wbstatus)(struct sxgbe_rx_norm_desc *p,
-   struct sxgbe_extra_stats *x);
+   int (*rx_wbstatus)(struct sxgbe_rx_norm_desc *p,
+  struct sxgbe_extra_stats *x, int *checksum);
 
/* Get own bit */
int (*get_rx_ctxt_owner)(struct sxgbe_rx_ctxt_desc *p);
diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c 
b/drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c
index d105b2c..b845322 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c
@@ -1255,6 +1255,7 @@ void sxgbe_tso_prepare(struct sxgbe_priv_data *priv,
 static netdev_tx_t sxgbe_xmit(struct sk_buff *skb, struct net_device *dev)
 {
unsigned int entry, frag_num;
+   int cksum_flag = 0;
struct netdev_queue *dev_txq;
unsigned txq_index = skb_get_queue_mapping(skb);
struct sxgbe_priv_data *priv = netdev_priv(dev);
@@ -1335,7 +1336,7 @@ static netdev_tx_t sxgbe_xmit(struct sk_buff *skb, struct 
net_device *dev)
   __func__);
 
priv->hw->desc->prepare_tx_desc(tx_desc, 1, no_pagedlen,
-   no_pagedlen);
+ 

[PATCH V9 7/7] MAINTAINERS: add maintainer for Samsung sxgbe driver

2014-03-20 Thread Byungho An
From: Byungho An 

Signed-off-by: Byungho An 
---
 MAINTAINERS |9 +
 1 file changed, 9 insertions(+)

diff --git a/MAINTAINERS b/MAINTAINERS
index b7befe7..aeb81f2 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -7536,6 +7536,15 @@ S:   Supported
 L: linux-samsung-soc@vger.kernel.org (moderated for non-subscribers)
 F: drivers/clk/samsung/
 
+SAMSUNG SXGBE DRIVERS
+M: Byungho An 
+M: Girish K S 
+M: Siva Reddy Kallam 
+M: Vipul Pandya 
+S: Supported
+L: net...@vger.kernel.org
+F: drivers/net/ethernet/samsung/sxgbe/
+
 SERIAL DRIVERS
 M: Greg Kroah-Hartman 
 L: linux-ser...@vger.kernel.org
-- 
1.7.10.4


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


[PATCH V9 0/7] add new Samsung SXGBE driver

2014-03-20 Thread Byungho An
Hi all,

This is 9th posting for SAMSUNG SXGBE driver.

Changes since v1:
- changed name of driver to SXGbE as per Ben's comment
- squashed Joe's neatening for many stuff in original patches

Changes since v2:
- updated and split binding document as per Mark's comment
- clean up codes as per Joe's comment
- removed unused fields and clean up codes as per Francois's comment
- removed module parameters as per Dave's comment
- moved driver directory to samsung/sxgbe/

Changes since v3:
- fixed Missing a blank line after declarations as per Dave's comment
- clean up codes as per Joe's comment
- removed reference of net_device.{irq, base_addr} as per Francois's comment

Changes since v4:
- updated binding document and DT related function as per Mark's comment

Changes since v5:
- updated binding document and DT related function as per Florian's comment
- fixed typo and shortened code as per Joe's comment

Changes since v6:
- updated TSO related functions as per Rayagond's comment
- updated binding document as per Mark's comment
- removed WoL patch from this patch set

Changes since v7:
- updated TSO related functions as per Rayagond's comment

Changes since v8:
- removed select and depends statement from vendor sub-section as per 
  Dave's comment

Byungho An (1):
  MAINTAINERS: add maintainer for Samsung sxgbe driver

Girish K S (1):
  net: sxgbe: add EEE(Energy Efficient Ethernet) for Samsung sxgbe

Siva Reddy (2):
  sxgbe: Add device-tree binding support document
  net: sxgbe: add basic framework for Samsung 10Gb ethernet driver

Vipul Pandya (3):
  net: sxgbe: add TSO support for Samsung sxgbe
  net: sxgbe: add Checksum offload support for Samsung sxgbe
  net: sxgbe: add ethtool related functions support Samsung sxgbe

 .../devicetree/bindings/net/samsung-sxgbe.txt  |   60 +
 MAINTAINERS|9 +
 drivers/net/ethernet/Kconfig   |1 +
 drivers/net/ethernet/Makefile  |1 +
 drivers/net/ethernet/samsung/Kconfig   |   16 +
 drivers/net/ethernet/samsung/Makefile  |5 +
 drivers/net/ethernet/samsung/sxgbe/Kconfig |9 +
 drivers/net/ethernet/samsung/sxgbe/Makefile|4 +
 drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h  |  539 +
 drivers/net/ethernet/samsung/sxgbe/sxgbe_core.c|  261 +++
 drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.c|  515 +
 drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.h|  298 +++
 drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.c |  387 
 drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.h |   51 +
 drivers/net/ethernet/samsung/sxgbe/sxgbe_ethtool.c |  588 +
 drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c| 2316 
 drivers/net/ethernet/samsung/sxgbe/sxgbe_mdio.c|  271 +++
 drivers/net/ethernet/samsung/sxgbe/sxgbe_mtl.c |  252 +++
 drivers/net/ethernet/samsung/sxgbe/sxgbe_mtl.h |  104 +
 .../net/ethernet/samsung/sxgbe/sxgbe_platform.c|  262 +++
 drivers/net/ethernet/samsung/sxgbe/sxgbe_reg.h |  488 +
 drivers/net/ethernet/samsung/sxgbe/sxgbe_xpcs.c|   92 +
 drivers/net/ethernet/samsung/sxgbe/sxgbe_xpcs.h|   38 +
 include/linux/sxgbe_platform.h     |   54 +
 24 files changed, 6621 insertions(+)

Thanks,
Byungho An

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


[PATCH V9 6/7] net: sxgbe: add ethtool related functions support Samsung sxgbe

2014-03-20 Thread Byungho An
From: Vipul Pandya 

This patch adds ethtool related functions.

Signed-off-by: Vipul Pandya 
Neatening-by: Joe Perches 
Signed-off-by: Byungho An 
---
 drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h  |   25 +-
 drivers/net/ethernet/samsung/sxgbe/sxgbe_ethtool.c |  509 +++-
 drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c|8 +-
 drivers/net/ethernet/samsung/sxgbe/sxgbe_reg.h |6 +
 4 files changed, 537 insertions(+), 11 deletions(-)

diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h 
b/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h
index f06d439..ef7dc80 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h
@@ -42,8 +42,12 @@ struct sxgbe_mtl_ops;
 #define SXGBE_RX_QUEUES   16
 
 /* Max/Min RI Watchdog Timer count value */
-#define SXGBE_MAX_DMA_RIWT 0xff
-#define SXGBE_MIN_DMA_RIWT 0x20
+/* Calculated based how much time does it take to fill 256KB Rx memory
+ * at 10Gb speed at 156MHz clock rate and considered little less then
+ * the actual value.
+ */
+#define SXGBE_MAX_DMA_RIWT 0x70
+#define SXGBE_MIN_DMA_RIWT 0x01
 
 /* Tx coalesce parameters */
 #define SXGBE_COAL_TX_TIMER4
@@ -194,6 +198,20 @@ enum dma_irq_status {
 #define SXGBE_FOR_EACH_QUEUE(max_queues, queue_num)\
for (queue_num = 0; queue_num < max_queues; queue_num++)
 
+#define DRV_VERSION "1.0.0"
+
+#define SXGBE_MAX_RX_CHANNELS  16
+#define SXGBE_MAX_TX_CHANNELS  16
+
+#define START_MAC_REG_OFFSET   0x
+#define MAX_MAC_REG_OFFSET 0x0DFC
+#define START_MTL_REG_OFFSET   0x1000
+#define MAX_MTL_REG_OFFSET 0x18FC
+#define START_DMA_REG_OFFSET   0x3000
+#define MAX_DMA_REG_OFFSET 0x38FC
+
+#define REG_SPACE_SIZE 0x2000
+
 /* sxgbe statistics counters */
 struct sxgbe_extra_stats {
/* TX/RX IRQ events */
@@ -479,6 +497,7 @@ struct sxgbe_priv_data {
/* advanced time stamp support */
u32 adv_ts;
int use_riwt;
+   struct ptp_clock *ptp_clock;
 
/* tc control */
int tx_tc;
@@ -515,4 +534,6 @@ const struct sxgbe_mtl_ops *sxgbe_get_mtl_ops(void);
 void sxgbe_disable_eee_mode(struct sxgbe_priv_data * const priv);
 bool sxgbe_eee_init(struct sxgbe_priv_data * const priv);
 
+int sxgbe_set_flow_ctrl(struct sxgbe_priv_data *priv, int rx, int tx);
+
 #endif /* __SXGBE_COMMON_H__ */
diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_ethtool.c 
b/drivers/net/ethernet/samsung/sxgbe/sxgbe_ethtool.c
index 9083300..471bc89 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_ethtool.c
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_ethtool.c
@@ -12,11 +12,17 @@
 
 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
 
+#include 
+#include 
 #include 
 #include 
+#include 
 #include 
+#include 
 
 #include "sxgbe_common.h"
+#include "sxgbe_reg.h"
+#include "sxgbe_dma.h"
 
 struct sxgbe_stats {
char stat_string[ETH_GSTRING_LEN];
@@ -32,16 +38,105 @@ struct sxgbe_stats {
 }
 
 static const struct sxgbe_stats sxgbe_gstrings_stats[] = {
+   /* TX/RX IRQ events */
+   SXGBE_STAT(tx_process_stopped_irq),
+   SXGBE_STAT(tx_ctxt_desc_err),
+   SXGBE_STAT(tx_threshold),
+   SXGBE_STAT(rx_threshold),
+   SXGBE_STAT(tx_pkt_n),
+   SXGBE_STAT(rx_pkt_n),
+   SXGBE_STAT(normal_irq_n),
+   SXGBE_STAT(tx_normal_irq_n),
+   SXGBE_STAT(rx_normal_irq_n),
+   SXGBE_STAT(napi_poll),
+   SXGBE_STAT(tx_clean),
+   SXGBE_STAT(tx_reset_ic_bit),
+   SXGBE_STAT(rx_process_stopped_irq),
+   SXGBE_STAT(rx_underflow_irq),
+
+   /* Bus access errors */
+   SXGBE_STAT(fatal_bus_error_irq),
+   SXGBE_STAT(tx_read_transfer_err),
+   SXGBE_STAT(tx_write_transfer_err),
+   SXGBE_STAT(tx_desc_access_err),
+   SXGBE_STAT(tx_buffer_access_err),
+   SXGBE_STAT(tx_data_transfer_err),
+   SXGBE_STAT(rx_read_transfer_err),
+   SXGBE_STAT(rx_write_transfer_err),
+   SXGBE_STAT(rx_desc_access_err),
+   SXGBE_STAT(rx_buffer_access_err),
+   SXGBE_STAT(rx_data_transfer_err),
+
+   /* EEE-LPI stats */
SXGBE_STAT(tx_lpi_entry_n),
SXGBE_STAT(tx_lpi_exit_n),
SXGBE_STAT(rx_lpi_entry_n),
SXGBE_STAT(rx_lpi_exit_n),
SXGBE_STAT(eee_wakeup_error_n),
+
+   /* RX specific */
+   /* L2 error */
+   SXGBE_STAT(rx_code_gmii_err),
+   SXGBE_STAT(rx_watchdog_err),
+   SXGBE_STAT(rx_crc_err),
+   SXGBE_STAT(rx_gaint_pkt_err),
+   SXGBE_STAT(ip_hdr_err),
+   SXGBE_STAT(ip_payload_err),
+   SXGBE_STAT(overflow_error),
+
+   /* L2 Pkt type */
+   SXGBE_STAT(len_pkt),
+   SXGBE_STAT(mac_ctl_pkt),
+   SXGBE_STAT(dcb_ctl_pkt),
+   SXGBE_STAT(arp_pkt),
+   SXGBE_STAT(oam_pkt),
+   SXGBE_STAT(untag_okt),
+   SXGBE_STAT(other_pkt),
+   SXGBE_STAT(svlan_tag_pkt),
+   SXGBE_STAT(cvlan_tag_pkt),
+   SX

[PATCH V9 3/7] net: sxgbe: add TSO support for Samsung sxgbe

2014-03-20 Thread Byungho An
From: Vipul Pandya 

Enable TSO during initialization for each DMA channels

Signed-off-by: Vipul Pandya 
Neatening-by: Joe Perches 
Signed-off-by: Byungho An 
---
 drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h |1 +
 drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.h   |   17 +++--
 drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.c|   10 +++
 drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.h|2 +
 drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c   |   84 +++--
 5 files changed, 101 insertions(+), 13 deletions(-)

diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h 
b/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h
index 587b691..f8ba7e4 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h
@@ -327,6 +327,7 @@ struct sxgbe_tx_queue {
u32 tx_coal_frames;
u32 tx_coal_timer;
int hwts_tx_en;
+   u16 prev_mss;
u8 queue_no;
 };
 
diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.h 
b/drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.h
index 41844d4..547edf3 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.h
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.h
@@ -167,8 +167,9 @@ struct sxgbe_desc_ops {
void (*init_tx_desc)(struct sxgbe_tx_norm_desc *p);
 
/* Invoked by the xmit function to prepare the tx descriptor */
-   void (*tx_enable_tse)(struct sxgbe_tx_norm_desc *p, u8 is_tse,
-   u32 hdr_len, u32 payload_len);
+   void (*tx_desc_enable_tse)(struct sxgbe_tx_norm_desc *p, u8 is_tse,
+  u32 total_hdr_len, u32 tcp_hdr_len,
+  u32 tcp_payload_len);
 
/* Assign buffer lengths for descriptor */
void (*prepare_tx_desc)(struct sxgbe_tx_norm_desc *p, u8 is_fd,
@@ -207,20 +208,26 @@ struct sxgbe_desc_ops {
int (*get_tx_timestamp_status)(struct sxgbe_tx_norm_desc *p);
 
/* TX Context Descripto Specific */
-   void (*init_tx_ctxt_desc)(struct sxgbe_tx_ctxt_desc *p);
+   void (*tx_ctxt_desc_set_ctxt)(struct sxgbe_tx_ctxt_desc *p);
 
/* Set the owner of the TX context descriptor */
-   void (*set_tx_ctxt_owner)(struct sxgbe_tx_ctxt_desc *p);
+   void (*tx_ctxt_desc_set_owner)(struct sxgbe_tx_ctxt_desc *p);
 
/* Get the owner of the TX context descriptor */
int (*get_tx_ctxt_owner)(struct sxgbe_tx_ctxt_desc *p);
 
/* Set TX mss */
-   void (*tx_ctxt_desc_setmss)(struct sxgbe_tx_ctxt_desc *p, int mss);
+   void (*tx_ctxt_desc_set_mss)(struct sxgbe_tx_ctxt_desc *p, u16 mss);
 
/* Set TX mss */
int (*tx_ctxt_desc_get_mss)(struct sxgbe_tx_ctxt_desc *p);
 
+   /* Set TX tcmssv */
+   void (*tx_ctxt_desc_set_tcmssv)(struct sxgbe_tx_ctxt_desc *p);
+
+   /* Reset TX ostc */
+   void (*tx_ctxt_desc_reset_ostc)(struct sxgbe_tx_ctxt_desc *p);
+
/* Set IVLAN information */
void (*tx_ctxt_desc_set_ivlantag)(struct sxgbe_tx_ctxt_desc *p,
  int is_ivlanvalid, int ivlan_tag,
diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.c 
b/drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.c
index 1e68ef3..1edc451 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.c
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.c
@@ -354,6 +354,15 @@ static void sxgbe_dma_rx_watchdog(void __iomem *ioaddr, 
u32 riwt)
}
 }
 
+static void sxgbe_enable_tso(void __iomem *ioaddr, u8 chan_num)
+{
+   u32 ctrl;
+
+   ctrl = readl(ioaddr + SXGBE_DMA_CHA_TXCTL_REG(chan_num));
+   ctrl |= SXGBE_DMA_CHA_TXCTL_TSE_ENABLE;
+   writel(ctrl, ioaddr + SXGBE_DMA_CHA_TXCTL_REG(chan_num));
+}
+
 static const struct sxgbe_dma_ops sxgbe_dma_ops = {
.init = sxgbe_dma_init,
.cha_init = sxgbe_dma_channel_init,
@@ -369,6 +378,7 @@ static const struct sxgbe_dma_ops sxgbe_dma_ops = {
.tx_dma_int_status = sxgbe_tx_dma_int_status,
.rx_dma_int_status = sxgbe_rx_dma_int_status,
.rx_watchdog = sxgbe_dma_rx_watchdog,
+   .enable_tso = sxgbe_enable_tso,
 };
 
 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 50c8054..6c070ac 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.h
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.h
@@ -42,6 +42,8 @@ struct sxgbe_dma_ops {
 struct sxgbe_extra_stats *x);
/* Program the HW RX Watchdog */
void (*rx_watchdog)(void __iomem *ioaddr, u32 riwt);
+   /* Enable TSO for each DMA channel */
+   void (*enable_tso)(void __iomem *ioaddr, u8 chan_num);
 };
 
 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 1714fd7..a49591e 100644
--- a/drivers/net

RE: [PATCH V8 2/7] net: sxgbe: add basic framework for Samsung 10Gb ethernet driver

2014-03-20 Thread Byungho An

David Miller  :
> From: Byungho An 
> Date: Thu, 20 Mar 2014 10:25:59 -0700
> 
> > +config NET_VENDOR_SAMSUNG
> > +   bool "Samsung Ethernet device"
> > +   default y
> > +   depends on HAS_IOMEM && HAS_DMA
> > +   select PHYLIB
> > +   select CRC32
> > +   select PTP_1588_CLOCK
> > +   ---help---
> > + This is the driver for the SXGBE 10G Ethernet IP block found on
Samsung
> > + platforms.
> 
> The vendor sub-section does not necessarily need these select and depends
statements.
> 
> These should be put only in the individual driver entries.
OK.

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

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


[PATCH V8 5/7] net: sxgbe: add Checksum offload support for Samsung sxgbe

2014-03-20 Thread Byungho An
From: Vipul Pandya 

This patch adds TX and RX checksum offload support.

Signed-off-by: Vipul Pandya 
Neatening-by: Joe Perches 
Signed-off-by: Byungho An 
---
 drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h |5 +++
 drivers/net/ethernet/samsung/sxgbe/sxgbe_core.c   |   20 +
 drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.h   |6 +--
 drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c   |   46 -
 4 files changed, 63 insertions(+), 14 deletions(-)

diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h 
b/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h
index 5f1d02c..f06d439 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h
@@ -337,6 +337,10 @@ struct sxgbe_core_ops {
void (*set_eee_timer)(void __iomem *ioaddr, const int ls,
  const int tw);
void (*set_eee_pls)(void __iomem *ioaddr, const int link);
+
+   /* Enable disable checksum offload operations */
+   void (*enable_rx_csum)(void __iomem *ioaddr);
+   void (*disable_rx_csum)(void __iomem *ioaddr);
 };
 
 const struct sxgbe_core_ops *sxgbe_get_core_ops(void);
@@ -449,6 +453,7 @@ struct sxgbe_priv_data {
struct sxgbe_ops *hw;   /* sxgbe specific ops */
int no_csum_insertion;
int irq;
+   int rxcsum_insertion;
spinlock_t stats_lock;  /* lock for tx/rx statatics */
 
struct phy_device *phydev;
diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_core.c 
b/drivers/net/ethernet/samsung/sxgbe/sxgbe_core.c
index bf93b16..5885fd6 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_core.c
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_core.c
@@ -217,6 +217,24 @@ static void  sxgbe_set_eee_timer(void __iomem *ioaddr,
writel(value, ioaddr + SXGBE_CORE_LPI_TIMER_CTRL);
 }
 
+static void sxgbe_enable_rx_csum(void __iomem *ioaddr)
+{
+   u32 ctrl;
+
+   ctrl = readl(ioaddr + SXGBE_CORE_RX_CONFIG_REG);
+   ctrl |= SXGBE_RX_CSUMOFFLOAD_ENABLE;
+   writel(ctrl, ioaddr + SXGBE_CORE_RX_CONFIG_REG);
+}
+
+static void sxgbe_disable_rx_csum(void __iomem *ioaddr)
+{
+   u32 ctrl;
+
+   ctrl = readl(ioaddr + SXGBE_CORE_RX_CONFIG_REG);
+   ctrl &= ~SXGBE_RX_CSUMOFFLOAD_ENABLE;
+   writel(ctrl, ioaddr + SXGBE_CORE_RX_CONFIG_REG);
+}
+
 const struct sxgbe_core_ops core_ops = {
.core_init = sxgbe_core_init,
.dump_regs = sxgbe_core_dump_regs,
@@ -233,6 +251,8 @@ const struct sxgbe_core_ops core_ops = {
.reset_eee_mode = sxgbe_reset_eee_mode,
.set_eee_timer = sxgbe_set_eee_timer,
.set_eee_pls = sxgbe_set_eee_pls,
+   .enable_rx_csum = sxgbe_enable_rx_csum,
+   .disable_rx_csum = sxgbe_disable_rx_csum,
 };
 
 const struct sxgbe_core_ops *sxgbe_get_core_ops(void)
diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.h 
b/drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.h
index 547edf3..3c0b5a8 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.h
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.h
@@ -113,7 +113,7 @@ struct sxgbe_rx_norm_desc {
/* WB RDES3 */
u32 pkt_len:14;
u32 rdes3_reserved:1;
-   u32 err_summary:15;
+   u32 err_summary:1;
u32 err_l2_type:4;
u32 layer34_pkt_type:4;
u32 no_coagulation_pkt:1;
@@ -273,8 +273,8 @@ struct sxgbe_desc_ops {
int (*get_rx_ld_status)(struct sxgbe_rx_norm_desc *p);
 
/* Return the reception status looking at the RDES1 */
-   void (*rx_wbstatus)(struct sxgbe_rx_norm_desc *p,
-   struct sxgbe_extra_stats *x);
+   int (*rx_wbstatus)(struct sxgbe_rx_norm_desc *p,
+  struct sxgbe_extra_stats *x, int *checksum);
 
/* Get own bit */
int (*get_rx_ctxt_owner)(struct sxgbe_rx_ctxt_desc *p);
diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c 
b/drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c
index d105b2c..b845322 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c
@@ -1255,6 +1255,7 @@ void sxgbe_tso_prepare(struct sxgbe_priv_data *priv,
 static netdev_tx_t sxgbe_xmit(struct sk_buff *skb, struct net_device *dev)
 {
unsigned int entry, frag_num;
+   int cksum_flag = 0;
struct netdev_queue *dev_txq;
unsigned txq_index = skb_get_queue_mapping(skb);
struct sxgbe_priv_data *priv = netdev_priv(dev);
@@ -1335,7 +1336,7 @@ static netdev_tx_t sxgbe_xmit(struct sk_buff *skb, struct 
net_device *dev)
   __func__);
 
priv->hw->desc->prepare_tx_desc(tx_desc, 1, no_pagedlen,
-   no_pagedlen);
+ 

[PATCH V8 1/7] sxgbe: Add device-tree binding support document

2014-03-20 Thread Byungho An
From: Siva Reddy 

This patch adds binding document for SXGBE ethernet driver via device-tree.

Signed-off-by: Siva Reddy Kallam 
Signed-off-by: Byungho An 
---
 .../devicetree/bindings/net/samsung-sxgbe.txt  |   60 
 1 file changed, 60 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/net/samsung-sxgbe.txt

diff --git a/Documentation/devicetree/bindings/net/samsung-sxgbe.txt 
b/Documentation/devicetree/bindings/net/samsung-sxgbe.txt
new file mode 100644
index 000..231acf8
--- /dev/null
+++ b/Documentation/devicetree/bindings/net/samsung-sxgbe.txt
@@ -0,0 +1,60 @@
+* Samsung 10G Ethernet driver (SXGBE)
+
+Required properties:
+- compatible: Should be "samsung,sxgbe-v2.0a"
+- reg: Address and length of the register set for the device
+- interrupt-parent: Should be the phandle for the interrupt controller
+  that services interrupts for this device
+- interrupts: Should contain the SXGBE interrupts
+  These interrupts are ordered by fixed and follows variable
+  trasmit DMA interrupts, receive DMA interrupts and lpi interrupt.
+  index 0 - this is fixed common interrupt of SXGBE and it is always
+  available.
+  index 1 to 25 - 8 variable trasmit interrupts, variable 16 receive interrupts
+  and 1 optional lpi interrupt.
+- phy-mode: String, operation mode of the PHY interface.
+  Supported values are: "sgmii", "xgmii".
+- samsung,pbl: Integer, Programmable Burst Length.
+  Supported values are 1, 2, 4, 8, 16, or 32.
+- samsung,burst-map: Integer, Program the possible bursts supported by sxgbe
+  This is an interger and represents allowable DMA bursts when fixed burst.
+  Allowable range is 0x01-0x3F. When this field is set fixed burst is enabled.
+  When fixed length is needed for burst mode, it can be set within allowable
+  range.
+- samsung,adv-addr-mode: Boolean, Program the DMA to use Enhanced address mode.
+  When enhanced address mode is needed, it can be set.
+- samsung,force-thresh-dma-mode: Boolean, Force DMA to use the threshold mode
+  for both tx and rx.
+- samsung,force-sf-dma-mode: Boolean, Force DMA to use the Store and Forward
+  mode for both tx and rx. This flag is ignored if force-thresh-dma-mode is 
set.
+
+Optional properties:
+- mac-address: 6 bytes, mac address
+- max-frame-size: Maximum Transfer Unit (IEEE defined MTU), rather
+ than the maximum frame size.
+
+Example:
+
+   aliases {
+   ethernet0 = <&sxgbe0>;
+   };
+
+   sxgbe0: ethernet@1a04 {
+   compatible = "samsung,sxgbe-v2.0a";
+   reg = <0 0x1a04 0 0x1>;
+   interrupt-parent = <&gic>;
+   interrupts = <0 209 4>, <0 185 4>, <0 186 4>, <0 187 4>,
+<0 188 4>, <0 189 4>, <0 190 4>, <0 191 4>,
+<0 192 4>, <0 193 4>, <0 194 4>, <0 195 4>,
+<0 196 4>, <0 197 4>, <0 198 4>, <0 199 4>,
+<0 200 4>, <0 201 4>, <0 202 4>, <0 203 4>,
+<0 204 4>, <0 205 4>, <0 206 4>, <0 207 4>,
+<0 208 4>, <0 210 4>;
+   samsung,pbl = <0x08>
+   samsung,burst-map = <0x20>
+   samsung,adv-addr-mode = "true"
+   samsung,force-sf-dma-mode = "true"
+   mac-address = [ 00 11 22 33 44 55 ]; /* Filled in by U-Boot */
+   max-frame-size = <9000>;
+   phy-mode = "xgmii";
+   };
-- 
1.7.10.4


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


[PATCH V8 3/7] net: sxgbe: add TSO support for Samsung sxgbe

2014-03-20 Thread Byungho An
From: Vipul Pandya 

Enable TSO during initialization for each DMA channels

Signed-off-by: Vipul Pandya 
Neatening-by: Joe Perches 
Signed-off-by: Byungho An 
---
 drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h |1 +
 drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.h   |   17 +++--
 drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.c|   10 +++
 drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.h|2 +
 drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c   |   84 +++--
 5 files changed, 101 insertions(+), 13 deletions(-)

diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h 
b/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h
index 587b691..f8ba7e4 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h
@@ -327,6 +327,7 @@ struct sxgbe_tx_queue {
u32 tx_coal_frames;
u32 tx_coal_timer;
int hwts_tx_en;
+   u16 prev_mss;
u8 queue_no;
 };
 
diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.h 
b/drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.h
index 41844d4..547edf3 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.h
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.h
@@ -167,8 +167,9 @@ struct sxgbe_desc_ops {
void (*init_tx_desc)(struct sxgbe_tx_norm_desc *p);
 
/* Invoked by the xmit function to prepare the tx descriptor */
-   void (*tx_enable_tse)(struct sxgbe_tx_norm_desc *p, u8 is_tse,
-   u32 hdr_len, u32 payload_len);
+   void (*tx_desc_enable_tse)(struct sxgbe_tx_norm_desc *p, u8 is_tse,
+  u32 total_hdr_len, u32 tcp_hdr_len,
+  u32 tcp_payload_len);
 
/* Assign buffer lengths for descriptor */
void (*prepare_tx_desc)(struct sxgbe_tx_norm_desc *p, u8 is_fd,
@@ -207,20 +208,26 @@ struct sxgbe_desc_ops {
int (*get_tx_timestamp_status)(struct sxgbe_tx_norm_desc *p);
 
/* TX Context Descripto Specific */
-   void (*init_tx_ctxt_desc)(struct sxgbe_tx_ctxt_desc *p);
+   void (*tx_ctxt_desc_set_ctxt)(struct sxgbe_tx_ctxt_desc *p);
 
/* Set the owner of the TX context descriptor */
-   void (*set_tx_ctxt_owner)(struct sxgbe_tx_ctxt_desc *p);
+   void (*tx_ctxt_desc_set_owner)(struct sxgbe_tx_ctxt_desc *p);
 
/* Get the owner of the TX context descriptor */
int (*get_tx_ctxt_owner)(struct sxgbe_tx_ctxt_desc *p);
 
/* Set TX mss */
-   void (*tx_ctxt_desc_setmss)(struct sxgbe_tx_ctxt_desc *p, int mss);
+   void (*tx_ctxt_desc_set_mss)(struct sxgbe_tx_ctxt_desc *p, u16 mss);
 
/* Set TX mss */
int (*tx_ctxt_desc_get_mss)(struct sxgbe_tx_ctxt_desc *p);
 
+   /* Set TX tcmssv */
+   void (*tx_ctxt_desc_set_tcmssv)(struct sxgbe_tx_ctxt_desc *p);
+
+   /* Reset TX ostc */
+   void (*tx_ctxt_desc_reset_ostc)(struct sxgbe_tx_ctxt_desc *p);
+
/* Set IVLAN information */
void (*tx_ctxt_desc_set_ivlantag)(struct sxgbe_tx_ctxt_desc *p,
  int is_ivlanvalid, int ivlan_tag,
diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.c 
b/drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.c
index 1e68ef3..1edc451 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.c
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.c
@@ -354,6 +354,15 @@ static void sxgbe_dma_rx_watchdog(void __iomem *ioaddr, 
u32 riwt)
}
 }
 
+static void sxgbe_enable_tso(void __iomem *ioaddr, u8 chan_num)
+{
+   u32 ctrl;
+
+   ctrl = readl(ioaddr + SXGBE_DMA_CHA_TXCTL_REG(chan_num));
+   ctrl |= SXGBE_DMA_CHA_TXCTL_TSE_ENABLE;
+   writel(ctrl, ioaddr + SXGBE_DMA_CHA_TXCTL_REG(chan_num));
+}
+
 static const struct sxgbe_dma_ops sxgbe_dma_ops = {
.init = sxgbe_dma_init,
.cha_init = sxgbe_dma_channel_init,
@@ -369,6 +378,7 @@ static const struct sxgbe_dma_ops sxgbe_dma_ops = {
.tx_dma_int_status = sxgbe_tx_dma_int_status,
.rx_dma_int_status = sxgbe_rx_dma_int_status,
.rx_watchdog = sxgbe_dma_rx_watchdog,
+   .enable_tso = sxgbe_enable_tso,
 };
 
 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 50c8054..6c070ac 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.h
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.h
@@ -42,6 +42,8 @@ struct sxgbe_dma_ops {
 struct sxgbe_extra_stats *x);
/* Program the HW RX Watchdog */
void (*rx_watchdog)(void __iomem *ioaddr, u32 riwt);
+   /* Enable TSO for each DMA channel */
+   void (*enable_tso)(void __iomem *ioaddr, u8 chan_num);
 };
 
 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 1714fd7..a49591e 100644
--- a/drivers/net

[PATCH V8 6/7] net: sxgbe: add ethtool related functions support Samsung sxgbe

2014-03-20 Thread Byungho An
From: Vipul Pandya 

This patch adds ethtool related functions.

Signed-off-by: Vipul Pandya 
Neatening-by: Joe Perches 
Signed-off-by: Byungho An 
---
 drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h  |   25 +-
 drivers/net/ethernet/samsung/sxgbe/sxgbe_ethtool.c |  509 +++-
 drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c|8 +-
 drivers/net/ethernet/samsung/sxgbe/sxgbe_reg.h |6 +
 4 files changed, 537 insertions(+), 11 deletions(-)

diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h 
b/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h
index f06d439..ef7dc80 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h
@@ -42,8 +42,12 @@ struct sxgbe_mtl_ops;
 #define SXGBE_RX_QUEUES   16
 
 /* Max/Min RI Watchdog Timer count value */
-#define SXGBE_MAX_DMA_RIWT 0xff
-#define SXGBE_MIN_DMA_RIWT 0x20
+/* Calculated based how much time does it take to fill 256KB Rx memory
+ * at 10Gb speed at 156MHz clock rate and considered little less then
+ * the actual value.
+ */
+#define SXGBE_MAX_DMA_RIWT 0x70
+#define SXGBE_MIN_DMA_RIWT 0x01
 
 /* Tx coalesce parameters */
 #define SXGBE_COAL_TX_TIMER4
@@ -194,6 +198,20 @@ enum dma_irq_status {
 #define SXGBE_FOR_EACH_QUEUE(max_queues, queue_num)\
for (queue_num = 0; queue_num < max_queues; queue_num++)
 
+#define DRV_VERSION "1.0.0"
+
+#define SXGBE_MAX_RX_CHANNELS  16
+#define SXGBE_MAX_TX_CHANNELS  16
+
+#define START_MAC_REG_OFFSET   0x
+#define MAX_MAC_REG_OFFSET 0x0DFC
+#define START_MTL_REG_OFFSET   0x1000
+#define MAX_MTL_REG_OFFSET 0x18FC
+#define START_DMA_REG_OFFSET   0x3000
+#define MAX_DMA_REG_OFFSET 0x38FC
+
+#define REG_SPACE_SIZE 0x2000
+
 /* sxgbe statistics counters */
 struct sxgbe_extra_stats {
/* TX/RX IRQ events */
@@ -479,6 +497,7 @@ struct sxgbe_priv_data {
/* advanced time stamp support */
u32 adv_ts;
int use_riwt;
+   struct ptp_clock *ptp_clock;
 
/* tc control */
int tx_tc;
@@ -515,4 +534,6 @@ const struct sxgbe_mtl_ops *sxgbe_get_mtl_ops(void);
 void sxgbe_disable_eee_mode(struct sxgbe_priv_data * const priv);
 bool sxgbe_eee_init(struct sxgbe_priv_data * const priv);
 
+int sxgbe_set_flow_ctrl(struct sxgbe_priv_data *priv, int rx, int tx);
+
 #endif /* __SXGBE_COMMON_H__ */
diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_ethtool.c 
b/drivers/net/ethernet/samsung/sxgbe/sxgbe_ethtool.c
index 9083300..471bc89 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_ethtool.c
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_ethtool.c
@@ -12,11 +12,17 @@
 
 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
 
+#include 
+#include 
 #include 
 #include 
+#include 
 #include 
+#include 
 
 #include "sxgbe_common.h"
+#include "sxgbe_reg.h"
+#include "sxgbe_dma.h"
 
 struct sxgbe_stats {
char stat_string[ETH_GSTRING_LEN];
@@ -32,16 +38,105 @@ struct sxgbe_stats {
 }
 
 static const struct sxgbe_stats sxgbe_gstrings_stats[] = {
+   /* TX/RX IRQ events */
+   SXGBE_STAT(tx_process_stopped_irq),
+   SXGBE_STAT(tx_ctxt_desc_err),
+   SXGBE_STAT(tx_threshold),
+   SXGBE_STAT(rx_threshold),
+   SXGBE_STAT(tx_pkt_n),
+   SXGBE_STAT(rx_pkt_n),
+   SXGBE_STAT(normal_irq_n),
+   SXGBE_STAT(tx_normal_irq_n),
+   SXGBE_STAT(rx_normal_irq_n),
+   SXGBE_STAT(napi_poll),
+   SXGBE_STAT(tx_clean),
+   SXGBE_STAT(tx_reset_ic_bit),
+   SXGBE_STAT(rx_process_stopped_irq),
+   SXGBE_STAT(rx_underflow_irq),
+
+   /* Bus access errors */
+   SXGBE_STAT(fatal_bus_error_irq),
+   SXGBE_STAT(tx_read_transfer_err),
+   SXGBE_STAT(tx_write_transfer_err),
+   SXGBE_STAT(tx_desc_access_err),
+   SXGBE_STAT(tx_buffer_access_err),
+   SXGBE_STAT(tx_data_transfer_err),
+   SXGBE_STAT(rx_read_transfer_err),
+   SXGBE_STAT(rx_write_transfer_err),
+   SXGBE_STAT(rx_desc_access_err),
+   SXGBE_STAT(rx_buffer_access_err),
+   SXGBE_STAT(rx_data_transfer_err),
+
+   /* EEE-LPI stats */
SXGBE_STAT(tx_lpi_entry_n),
SXGBE_STAT(tx_lpi_exit_n),
SXGBE_STAT(rx_lpi_entry_n),
SXGBE_STAT(rx_lpi_exit_n),
SXGBE_STAT(eee_wakeup_error_n),
+
+   /* RX specific */
+   /* L2 error */
+   SXGBE_STAT(rx_code_gmii_err),
+   SXGBE_STAT(rx_watchdog_err),
+   SXGBE_STAT(rx_crc_err),
+   SXGBE_STAT(rx_gaint_pkt_err),
+   SXGBE_STAT(ip_hdr_err),
+   SXGBE_STAT(ip_payload_err),
+   SXGBE_STAT(overflow_error),
+
+   /* L2 Pkt type */
+   SXGBE_STAT(len_pkt),
+   SXGBE_STAT(mac_ctl_pkt),
+   SXGBE_STAT(dcb_ctl_pkt),
+   SXGBE_STAT(arp_pkt),
+   SXGBE_STAT(oam_pkt),
+   SXGBE_STAT(untag_okt),
+   SXGBE_STAT(other_pkt),
+   SXGBE_STAT(svlan_tag_pkt),
+   SXGBE_STAT(cvlan_tag_pkt),
+   SX

[PATCH V8 7/7] MAINTAINERS: add maintainer for Samsung sxgbe driver

2014-03-20 Thread Byungho An
From: Byungho An 

Signed-off-by: Byungho An 
---
 MAINTAINERS |9 +
 1 file changed, 9 insertions(+)

diff --git a/MAINTAINERS b/MAINTAINERS
index b7befe7..aeb81f2 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -7536,6 +7536,15 @@ S:   Supported
 L: linux-samsung-soc@vger.kernel.org (moderated for non-subscribers)
 F: drivers/clk/samsung/
 
+SAMSUNG SXGBE DRIVERS
+M: Byungho An 
+M: Girish K S 
+M: Siva Reddy Kallam 
+M: Vipul Pandya 
+S: Supported
+L: net...@vger.kernel.org
+F: drivers/net/ethernet/samsung/sxgbe/
+
 SERIAL DRIVERS
 M: Greg Kroah-Hartman 
 L: linux-ser...@vger.kernel.org
-- 
1.7.10.4


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


[PATCH V8 4/7] net: sxgbe: add EEE(Energy Efficient Ethernet) for Samsung sxgbe

2014-03-20 Thread Byungho An
From: Girish K S 

Added support for the EEE(Energy Efficient Ethernet) in 10G ethernet driver.

Signed-off-by: Girish K S 
Neatening-by: Joe Perches 
Signed-off-by: Byungho An 
---
 drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h  |   53 +++
 drivers/net/ethernet/samsung/sxgbe/sxgbe_core.c|   86 +-
 drivers/net/ethernet/samsung/sxgbe/sxgbe_ethtool.c |   47 ++
 drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c|  165 +++-
 .../net/ethernet/samsung/sxgbe/sxgbe_platform.c|4 +
 drivers/net/ethernet/samsung/sxgbe/sxgbe_reg.h |5 +
 6 files changed, 358 insertions(+), 2 deletions(-)

diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h 
b/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h
index f8ba7e4..5f1d02c 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h
@@ -115,6 +115,33 @@ struct sxgbe_mtl_ops;
 #define RX_PTP_SIGNAL  0x0A
 #define RX_PTP_RESV_MSG0x0F
 
+/* EEE-LPI mode  flags*/
+#define TX_ENTRY_LPI_MODE  0x10
+#define TX_EXIT_LPI_MODE   0x20
+#define RX_ENTRY_LPI_MODE  0x40
+#define RX_EXIT_LPI_MODE   0x80
+
+/* EEE-LPI Interrupt status flag */
+#define LPI_INT_STATUS BIT(5)
+
+/* EEE-LPI Default timer values */
+#define LPI_LINK_STATUS_TIMER  0x3E8
+#define LPI_MAC_WAIT_TIMER 0x00
+
+/* EEE-LPI Control and status definitions */
+#define LPI_CTRL_STATUS_TXABIT(19)
+#define LPI_CTRL_STATUS_PLSDIS BIT(18)
+#define LPI_CTRL_STATUS_PLSBIT(17)
+#define LPI_CTRL_STATUS_LPIEN  BIT(16)
+#define LPI_CTRL_STATUS_TXRSTP BIT(11)
+#define LPI_CTRL_STATUS_RXRSTP BIT(10)
+#define LPI_CTRL_STATUS_RLPIST BIT(9)
+#define LPI_CTRL_STATUS_TLPIST BIT(8)
+#define LPI_CTRL_STATUS_RLPIEX BIT(3)
+#define LPI_CTRL_STATUS_RLPIEN BIT(2)
+#define LPI_CTRL_STATUS_TLPIEX BIT(1)
+#define LPI_CTRL_STATUS_TLPIEN BIT(0)
+
 enum dma_irq_status {
tx_hard_error   = BIT(0),
tx_bump_tc  = BIT(1),
@@ -199,6 +226,13 @@ struct sxgbe_extra_stats {
unsigned long rx_buffer_access_err;
unsigned long rx_data_transfer_err;
 
+   /* EEE-LPI stats */
+   unsigned long tx_lpi_entry_n;
+   unsigned long tx_lpi_exit_n;
+   unsigned long rx_lpi_entry_n;
+   unsigned long rx_lpi_exit_n;
+   unsigned long eee_wakeup_error_n;
+
/* RX specific */
/* L2 error */
unsigned long rx_code_gmii_err;
@@ -296,6 +330,13 @@ struct sxgbe_core_ops {
   unsigned char feature_index);
/* adjust SXGBE speed */
void (*set_speed)(void __iomem *ioaddr, unsigned char speed);
+
+   /* EEE-LPI specific operations */
+   void (*set_eee_mode)(void __iomem *ioaddr);
+   void (*reset_eee_mode)(void __iomem *ioaddr);
+   void (*set_eee_timer)(void __iomem *ioaddr, const int ls,
+ const int tw);
+   void (*set_eee_pls)(void __iomem *ioaddr, const int link);
 };
 
 const struct sxgbe_core_ops *sxgbe_get_core_ops(void);
@@ -352,6 +393,8 @@ struct sxgbe_hw_features {
/* IEEE 1588-2008 */
unsigned int atime_stamp;
 
+   unsigned int eee;
+
unsigned int tx_csum_offload;
unsigned int rx_csum_offload;
unsigned int multi_macaddr;
@@ -435,6 +478,13 @@ struct sxgbe_priv_data {
/* tc control */
int tx_tc;
int rx_tc;
+   /* EEE-LPI specific members */
+   struct timer_list eee_ctrl_timer;
+   bool tx_path_in_lpi_mode;
+   int lpi_irq;
+   int eee_enabled;
+   int eee_active;
+   int tx_lpi_timer;
 };
 
 /* Function prototypes */
@@ -457,4 +507,7 @@ int sxgbe_restore(struct net_device *ndev);
 
 const struct sxgbe_mtl_ops *sxgbe_get_mtl_ops(void);
 
+void sxgbe_disable_eee_mode(struct sxgbe_priv_data * const priv);
+bool sxgbe_eee_init(struct sxgbe_priv_data * const priv);
+
 #endif /* __SXGBE_COMMON_H__ */
diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_core.c 
b/drivers/net/ethernet/samsung/sxgbe/sxgbe_core.c
index 17eea58..bf93b16 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_core.c
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_core.c
@@ -47,11 +47,38 @@ static void sxgbe_core_dump_regs(void __iomem *ioaddr)
 {
 }
 
+static int sxgbe_get_lpi_status(void __iomem *ioaddr, const u32 irq_status)
+{
+   int status = 0;
+   int lpi_status;
+
+   /* Reading this register shall clear all the LPI status bits */
+   lpi_status = readl(ioaddr + SXGBE_CORE_LPI_CTRL_STATUS);
+
+   if (lpi_status & LPI_CTRL_STATUS_TLPIEN)
+   status |= TX_ENTRY_LPI_MODE;
+   if (lpi_status & LPI_CTRL_STATUS_TLPIEX)
+   status |= TX_EXIT_LPI_MODE;
+   if (lpi_status & LPI_CTRL_STATUS_RLPIEN)
+   status |= RX_ENTRY_LPI_MODE;
+   if (lpi_status & LPI_CTRL_STATUS_RLPIEX)
+   status |= RX_EXIT_LPI_MODE;
+
+   return status;
+}
+
 /* Handle extra ev

[PATCH V8 0/7] add new Samsung SXGBE driver

2014-03-20 Thread Byungho An
Hi all,

This is 8th posting for SAMSUNG SXGBE driver.

Changes since v1:
- changed name of driver to SXGbE as per Ben's comment
- squashed Joe's neatening for many stuff in original patches

Changes since v2:
- updated and split binding document as per Mark's comment
- clean up codes as per Joe's comment
- removed unused fields and clean up codes as per Francois's comment
- removed module parameters as per Dave's comment
- moved driver directory to samsung/sxgbe/

Changes since v3:
- fixed Missing a blank line after declarations as per Dave's comment
- clean up codes as per Joe's comment
- removed reference of net_device.{irq, base_addr} as per Francois's comment

Changes since v4:
- updated binding document and DT related function as per Mark's comment

Changes since v5:
- updated binding document and DT related function as per Florian's comment
- fixed typo and shortened code as per Joe's comment

Changes since v6:
- updated TSO related functions as per Rayagond's comment
- updated binding document as per Mark's comment
- removed WoL patch from this patch set

Changes since v7:
- updated TSO related functions as per Rayagond's comment

Byungho An (1):
  MAINTAINERS: add maintainer for Samsung sxgbe driver

Girish K S (1):
  net: sxgbe: add EEE(Energy Efficient Ethernet) for Samsung sxgbe

Siva Reddy (2):
  sxgbe: Add device-tree binding support document
  net: sxgbe: add basic framework for Samsung 10Gb ethernet driver

Vipul Pandya (3):
  net: sxgbe: add TSO support for Samsung sxgbe
  net: sxgbe: add Checksum offload support for Samsung sxgbe
  net: sxgbe: add ethtool related functions support Samsung sxgbe

 .../devicetree/bindings/net/samsung-sxgbe.txt  |   60 +
 MAINTAINERS|9 +
 drivers/net/ethernet/Kconfig   |1 +
 drivers/net/ethernet/Makefile  |1 +
 drivers/net/ethernet/samsung/Kconfig   |   20 +
 drivers/net/ethernet/samsung/Makefile  |5 +
 drivers/net/ethernet/samsung/sxgbe/Kconfig |9 +
 drivers/net/ethernet/samsung/sxgbe/Makefile|4 +
 drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h  |  539 +
 drivers/net/ethernet/samsung/sxgbe/sxgbe_core.c|  261 +++
 drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.c|  515 +
 drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.h|  298 +++
 drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.c |  387 
 drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.h |   51 +
 drivers/net/ethernet/samsung/sxgbe/sxgbe_ethtool.c |  588 +
 drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c| 2316 
 drivers/net/ethernet/samsung/sxgbe/sxgbe_mdio.c|  271 +++
 drivers/net/ethernet/samsung/sxgbe/sxgbe_mtl.c |  252 +++
 drivers/net/ethernet/samsung/sxgbe/sxgbe_mtl.h |  104 +
 .../net/ethernet/samsung/sxgbe/sxgbe_platform.c|  262 +++
 drivers/net/ethernet/samsung/sxgbe/sxgbe_reg.h |  488 +
 drivers/net/ethernet/samsung/sxgbe/sxgbe_xpcs.c|   92 +
 drivers/net/ethernet/samsung/sxgbe/sxgbe_xpcs.h|   38 +
 include/linux/sxgbe_platform.h         |   54 +
 24 files changed, 6625 insertions(+)

Thanks,
Byungho An

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


RE: [PATCH V7 3/7] net: sxgbe: add TSO support for Samsung sxgbe

2014-03-20 Thread Byungho An

Rayagond Kokatanur  wrote :
> On Thu, Mar 20, 2014 at 7:56 AM, Byungho An  wrote:
> > From: Vipul Pandya 
> >
> > Enable TSO during initialization for each DMA channels
> >
> > Signed-off-by: Vipul Pandya 
> > Neatening-by: Joe Perches 
> > Signed-off-by: Byungho An 
> > ---
> >  drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h |1 +
> >  drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.h   |   17 +++--
> >  drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.c|   10 +++
> >  drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.h|2 +
> >  drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c   |   81
> +++--
> >  5 files changed, 98 insertions(+), 13 deletions(-)
> >
> > diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h
> > b/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h
> > index 587b691..f8ba7e4 100644
> > --- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h
> > +++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h
> > @@ -327,6 +327,7 @@ struct sxgbe_tx_queue {
> > u32 tx_coal_frames;
> > u32 tx_coal_timer;
> > int hwts_tx_en;
> > +   u16 prev_mss;
> > u8 queue_no;
> >  };
> >
> > diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.h
> > b/drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.h
> > index 41844d4..547edf3 100644
> > --- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.h
> > +++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.h
> > @@ -167,8 +167,9 @@ struct sxgbe_desc_ops {
> > void (*init_tx_desc)(struct sxgbe_tx_norm_desc *p);
> >
> > /* Invoked by the xmit function to prepare the tx descriptor */
> > -   void (*tx_enable_tse)(struct sxgbe_tx_norm_desc *p, u8 is_tse,
> > -   u32 hdr_len, u32 payload_len);
> > +   void (*tx_desc_enable_tse)(struct sxgbe_tx_norm_desc *p, u8
is_tse,
> > +  u32 total_hdr_len, u32 tcp_hdr_len,
> > +  u32 tcp_payload_len);
> >
> > /* Assign buffer lengths for descriptor */
> > void (*prepare_tx_desc)(struct sxgbe_tx_norm_desc *p, u8
> > is_fd, @@ -207,20 +208,26 @@ struct sxgbe_desc_ops {
> > int (*get_tx_timestamp_status)(struct sxgbe_tx_norm_desc *p);
> >
> > /* TX Context Descripto Specific */
> > -   void (*init_tx_ctxt_desc)(struct sxgbe_tx_ctxt_desc *p);
> > +   void (*tx_ctxt_desc_set_ctxt)(struct sxgbe_tx_ctxt_desc *p);
> >
> > /* Set the owner of the TX context descriptor */
> > -   void (*set_tx_ctxt_owner)(struct sxgbe_tx_ctxt_desc *p);
> > +   void (*tx_ctxt_desc_set_owner)(struct sxgbe_tx_ctxt_desc *p);
> >
> > /* Get the owner of the TX context descriptor */
> > int (*get_tx_ctxt_owner)(struct sxgbe_tx_ctxt_desc *p);
> >
> > /* Set TX mss */
> > -   void (*tx_ctxt_desc_setmss)(struct sxgbe_tx_ctxt_desc *p, int
mss);
> > +   void (*tx_ctxt_desc_set_mss)(struct sxgbe_tx_ctxt_desc *p, u16
> > + mss);
> >
> > /* Set TX mss */
> > int (*tx_ctxt_desc_get_mss)(struct sxgbe_tx_ctxt_desc *p);
> >
> > +   /* Set TX tcmssv */
> > +   void (*tx_ctxt_desc_set_tcmssv)(struct sxgbe_tx_ctxt_desc *p);
> > +
> > +   /* Reset TX ostc */
> > +   void (*tx_ctxt_desc_reset_ostc)(struct sxgbe_tx_ctxt_desc *p);
> > +
> > /* Set IVLAN information */
> > void (*tx_ctxt_desc_set_ivlantag)(struct sxgbe_tx_ctxt_desc *p,
> >   int is_ivlanvalid, int
> > ivlan_tag, diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.c
> > b/drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.c
> > index 1e68ef3..1edc451 100644
> > --- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.c
> > +++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.c
> > @@ -354,6 +354,15 @@ static void sxgbe_dma_rx_watchdog(void __iomem
> *ioaddr, u32 riwt)
> > }
> >  }
> >
> > +static void sxgbe_enable_tso(void __iomem *ioaddr, u8 chan_num) {
> > +   u32 ctrl;
> > +
> > +   ctrl = readl(ioaddr + SXGBE_DMA_CHA_TXCTL_REG(chan_num));
> > +   ctrl |= SXGBE_DMA_CHA_TXCTL_TSE_ENABLE;
> > +   writel(ctrl, ioaddr + SXGBE_DMA_CHA_TXCTL_REG(chan_num));
> > +}
> > +
> >  static const struct sxgbe_dma_ops sxgbe_dma_ops = {
> > .init = sxgbe_dma_init,
> > .cha_init = sxgbe_dma_channel_init, @@ -369,6 +378,7 @@ static
> > const struct sxgbe_dma_ops sxgbe_dma_ops

[PATCH V7 5/7] net: sxgbe: add Checksum offload support for Samsung sxgbe

2014-03-19 Thread Byungho An
From: Vipul Pandya 

This patch adds TX and RX checksum offload support.

Signed-off-by: Vipul Pandya 
Neatening-by: Joe Perches 
Signed-off-by: Byungho An 
---
 drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h |5 +++
 drivers/net/ethernet/samsung/sxgbe/sxgbe_core.c   |   20 +
 drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.h   |6 +--
 drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c   |   46 -
 4 files changed, 63 insertions(+), 14 deletions(-)

diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h 
b/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h
index 5f1d02c..f06d439 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h
@@ -337,6 +337,10 @@ struct sxgbe_core_ops {
void (*set_eee_timer)(void __iomem *ioaddr, const int ls,
  const int tw);
void (*set_eee_pls)(void __iomem *ioaddr, const int link);
+
+   /* Enable disable checksum offload operations */
+   void (*enable_rx_csum)(void __iomem *ioaddr);
+   void (*disable_rx_csum)(void __iomem *ioaddr);
 };
 
 const struct sxgbe_core_ops *sxgbe_get_core_ops(void);
@@ -449,6 +453,7 @@ struct sxgbe_priv_data {
struct sxgbe_ops *hw;   /* sxgbe specific ops */
int no_csum_insertion;
int irq;
+   int rxcsum_insertion;
spinlock_t stats_lock;  /* lock for tx/rx statatics */
 
struct phy_device *phydev;
diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_core.c 
b/drivers/net/ethernet/samsung/sxgbe/sxgbe_core.c
index bf93b16..5885fd6 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_core.c
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_core.c
@@ -217,6 +217,24 @@ static void  sxgbe_set_eee_timer(void __iomem *ioaddr,
writel(value, ioaddr + SXGBE_CORE_LPI_TIMER_CTRL);
 }
 
+static void sxgbe_enable_rx_csum(void __iomem *ioaddr)
+{
+   u32 ctrl;
+
+   ctrl = readl(ioaddr + SXGBE_CORE_RX_CONFIG_REG);
+   ctrl |= SXGBE_RX_CSUMOFFLOAD_ENABLE;
+   writel(ctrl, ioaddr + SXGBE_CORE_RX_CONFIG_REG);
+}
+
+static void sxgbe_disable_rx_csum(void __iomem *ioaddr)
+{
+   u32 ctrl;
+
+   ctrl = readl(ioaddr + SXGBE_CORE_RX_CONFIG_REG);
+   ctrl &= ~SXGBE_RX_CSUMOFFLOAD_ENABLE;
+   writel(ctrl, ioaddr + SXGBE_CORE_RX_CONFIG_REG);
+}
+
 const struct sxgbe_core_ops core_ops = {
.core_init = sxgbe_core_init,
.dump_regs = sxgbe_core_dump_regs,
@@ -233,6 +251,8 @@ const struct sxgbe_core_ops core_ops = {
.reset_eee_mode = sxgbe_reset_eee_mode,
.set_eee_timer = sxgbe_set_eee_timer,
.set_eee_pls = sxgbe_set_eee_pls,
+   .enable_rx_csum = sxgbe_enable_rx_csum,
+   .disable_rx_csum = sxgbe_disable_rx_csum,
 };
 
 const struct sxgbe_core_ops *sxgbe_get_core_ops(void)
diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.h 
b/drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.h
index 547edf3..3c0b5a8 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.h
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.h
@@ -113,7 +113,7 @@ struct sxgbe_rx_norm_desc {
/* WB RDES3 */
u32 pkt_len:14;
u32 rdes3_reserved:1;
-   u32 err_summary:15;
+   u32 err_summary:1;
u32 err_l2_type:4;
u32 layer34_pkt_type:4;
u32 no_coagulation_pkt:1;
@@ -273,8 +273,8 @@ struct sxgbe_desc_ops {
int (*get_rx_ld_status)(struct sxgbe_rx_norm_desc *p);
 
/* Return the reception status looking at the RDES1 */
-   void (*rx_wbstatus)(struct sxgbe_rx_norm_desc *p,
-   struct sxgbe_extra_stats *x);
+   int (*rx_wbstatus)(struct sxgbe_rx_norm_desc *p,
+  struct sxgbe_extra_stats *x, int *checksum);
 
/* Get own bit */
int (*get_rx_ctxt_owner)(struct sxgbe_rx_ctxt_desc *p);
diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c 
b/drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c
index 752b2c5..dbbb7ab 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c
@@ -1255,6 +1255,7 @@ void sxgbe_tso_prepare(struct sxgbe_priv_data *priv,
 static netdev_tx_t sxgbe_xmit(struct sk_buff *skb, struct net_device *dev)
 {
unsigned int entry, frag_num;
+   int cksum_flag = 0;
struct netdev_queue *dev_txq;
unsigned txq_index = skb_get_queue_mapping(skb);
struct sxgbe_priv_data *priv = netdev_priv(dev);
@@ -1331,7 +1332,7 @@ static netdev_tx_t sxgbe_xmit(struct sk_buff *skb, struct 
net_device *dev)
   __func__);
 
priv->hw->desc->prepare_tx_desc(tx_desc, 1, no_pagedlen,
-   no_pagedlen);
+ 

[PATCH V7 6/7] net: sxgbe: add ethtool related functions support Samsung sxgbe

2014-03-19 Thread Byungho An
From: Vipul Pandya 

This patch adds ethtool related functions.

Signed-off-by: Vipul Pandya 
Neatening-by: Joe Perches 
Signed-off-by: Byungho An 
---
 drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h  |   25 +-
 drivers/net/ethernet/samsung/sxgbe/sxgbe_ethtool.c |  509 +++-
 drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c|8 +-
 drivers/net/ethernet/samsung/sxgbe/sxgbe_reg.h |6 +
 4 files changed, 537 insertions(+), 11 deletions(-)

diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h 
b/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h
index f06d439..ef7dc80 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h
@@ -42,8 +42,12 @@ struct sxgbe_mtl_ops;
 #define SXGBE_RX_QUEUES   16
 
 /* Max/Min RI Watchdog Timer count value */
-#define SXGBE_MAX_DMA_RIWT 0xff
-#define SXGBE_MIN_DMA_RIWT 0x20
+/* Calculated based how much time does it take to fill 256KB Rx memory
+ * at 10Gb speed at 156MHz clock rate and considered little less then
+ * the actual value.
+ */
+#define SXGBE_MAX_DMA_RIWT 0x70
+#define SXGBE_MIN_DMA_RIWT 0x01
 
 /* Tx coalesce parameters */
 #define SXGBE_COAL_TX_TIMER4
@@ -194,6 +198,20 @@ enum dma_irq_status {
 #define SXGBE_FOR_EACH_QUEUE(max_queues, queue_num)\
for (queue_num = 0; queue_num < max_queues; queue_num++)
 
+#define DRV_VERSION "1.0.0"
+
+#define SXGBE_MAX_RX_CHANNELS  16
+#define SXGBE_MAX_TX_CHANNELS  16
+
+#define START_MAC_REG_OFFSET   0x
+#define MAX_MAC_REG_OFFSET 0x0DFC
+#define START_MTL_REG_OFFSET   0x1000
+#define MAX_MTL_REG_OFFSET 0x18FC
+#define START_DMA_REG_OFFSET   0x3000
+#define MAX_DMA_REG_OFFSET 0x38FC
+
+#define REG_SPACE_SIZE 0x2000
+
 /* sxgbe statistics counters */
 struct sxgbe_extra_stats {
/* TX/RX IRQ events */
@@ -479,6 +497,7 @@ struct sxgbe_priv_data {
/* advanced time stamp support */
u32 adv_ts;
int use_riwt;
+   struct ptp_clock *ptp_clock;
 
/* tc control */
int tx_tc;
@@ -515,4 +534,6 @@ const struct sxgbe_mtl_ops *sxgbe_get_mtl_ops(void);
 void sxgbe_disable_eee_mode(struct sxgbe_priv_data * const priv);
 bool sxgbe_eee_init(struct sxgbe_priv_data * const priv);
 
+int sxgbe_set_flow_ctrl(struct sxgbe_priv_data *priv, int rx, int tx);
+
 #endif /* __SXGBE_COMMON_H__ */
diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_ethtool.c 
b/drivers/net/ethernet/samsung/sxgbe/sxgbe_ethtool.c
index 9083300..471bc89 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_ethtool.c
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_ethtool.c
@@ -12,11 +12,17 @@
 
 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
 
+#include 
+#include 
 #include 
 #include 
+#include 
 #include 
+#include 
 
 #include "sxgbe_common.h"
+#include "sxgbe_reg.h"
+#include "sxgbe_dma.h"
 
 struct sxgbe_stats {
char stat_string[ETH_GSTRING_LEN];
@@ -32,16 +38,105 @@ struct sxgbe_stats {
 }
 
 static const struct sxgbe_stats sxgbe_gstrings_stats[] = {
+   /* TX/RX IRQ events */
+   SXGBE_STAT(tx_process_stopped_irq),
+   SXGBE_STAT(tx_ctxt_desc_err),
+   SXGBE_STAT(tx_threshold),
+   SXGBE_STAT(rx_threshold),
+   SXGBE_STAT(tx_pkt_n),
+   SXGBE_STAT(rx_pkt_n),
+   SXGBE_STAT(normal_irq_n),
+   SXGBE_STAT(tx_normal_irq_n),
+   SXGBE_STAT(rx_normal_irq_n),
+   SXGBE_STAT(napi_poll),
+   SXGBE_STAT(tx_clean),
+   SXGBE_STAT(tx_reset_ic_bit),
+   SXGBE_STAT(rx_process_stopped_irq),
+   SXGBE_STAT(rx_underflow_irq),
+
+   /* Bus access errors */
+   SXGBE_STAT(fatal_bus_error_irq),
+   SXGBE_STAT(tx_read_transfer_err),
+   SXGBE_STAT(tx_write_transfer_err),
+   SXGBE_STAT(tx_desc_access_err),
+   SXGBE_STAT(tx_buffer_access_err),
+   SXGBE_STAT(tx_data_transfer_err),
+   SXGBE_STAT(rx_read_transfer_err),
+   SXGBE_STAT(rx_write_transfer_err),
+   SXGBE_STAT(rx_desc_access_err),
+   SXGBE_STAT(rx_buffer_access_err),
+   SXGBE_STAT(rx_data_transfer_err),
+
+   /* EEE-LPI stats */
SXGBE_STAT(tx_lpi_entry_n),
SXGBE_STAT(tx_lpi_exit_n),
SXGBE_STAT(rx_lpi_entry_n),
SXGBE_STAT(rx_lpi_exit_n),
SXGBE_STAT(eee_wakeup_error_n),
+
+   /* RX specific */
+   /* L2 error */
+   SXGBE_STAT(rx_code_gmii_err),
+   SXGBE_STAT(rx_watchdog_err),
+   SXGBE_STAT(rx_crc_err),
+   SXGBE_STAT(rx_gaint_pkt_err),
+   SXGBE_STAT(ip_hdr_err),
+   SXGBE_STAT(ip_payload_err),
+   SXGBE_STAT(overflow_error),
+
+   /* L2 Pkt type */
+   SXGBE_STAT(len_pkt),
+   SXGBE_STAT(mac_ctl_pkt),
+   SXGBE_STAT(dcb_ctl_pkt),
+   SXGBE_STAT(arp_pkt),
+   SXGBE_STAT(oam_pkt),
+   SXGBE_STAT(untag_okt),
+   SXGBE_STAT(other_pkt),
+   SXGBE_STAT(svlan_tag_pkt),
+   SXGBE_STAT(cvlan_tag_pkt),
+   SX

[PATCH V7 4/7] net: sxgbe: add EEE(Energy Efficient Ethernet) for Samsung sxgbe

2014-03-19 Thread Byungho An
From: Girish K S 

Added support for the EEE(Energy Efficient Ethernet) in 10G ethernet driver.

Signed-off-by: Girish K S 
Neatening-by: Joe Perches 
Signed-off-by: Byungho An 
---
 drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h  |   53 +++
 drivers/net/ethernet/samsung/sxgbe/sxgbe_core.c|   86 +-
 drivers/net/ethernet/samsung/sxgbe/sxgbe_ethtool.c |   47 ++
 drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c|  165 +++-
 .../net/ethernet/samsung/sxgbe/sxgbe_platform.c|4 +
 drivers/net/ethernet/samsung/sxgbe/sxgbe_reg.h |5 +
 6 files changed, 358 insertions(+), 2 deletions(-)

diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h 
b/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h
index f8ba7e4..5f1d02c 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h
@@ -115,6 +115,33 @@ struct sxgbe_mtl_ops;
 #define RX_PTP_SIGNAL  0x0A
 #define RX_PTP_RESV_MSG0x0F
 
+/* EEE-LPI mode  flags*/
+#define TX_ENTRY_LPI_MODE  0x10
+#define TX_EXIT_LPI_MODE   0x20
+#define RX_ENTRY_LPI_MODE  0x40
+#define RX_EXIT_LPI_MODE   0x80
+
+/* EEE-LPI Interrupt status flag */
+#define LPI_INT_STATUS BIT(5)
+
+/* EEE-LPI Default timer values */
+#define LPI_LINK_STATUS_TIMER  0x3E8
+#define LPI_MAC_WAIT_TIMER 0x00
+
+/* EEE-LPI Control and status definitions */
+#define LPI_CTRL_STATUS_TXABIT(19)
+#define LPI_CTRL_STATUS_PLSDIS BIT(18)
+#define LPI_CTRL_STATUS_PLSBIT(17)
+#define LPI_CTRL_STATUS_LPIEN  BIT(16)
+#define LPI_CTRL_STATUS_TXRSTP BIT(11)
+#define LPI_CTRL_STATUS_RXRSTP BIT(10)
+#define LPI_CTRL_STATUS_RLPIST BIT(9)
+#define LPI_CTRL_STATUS_TLPIST BIT(8)
+#define LPI_CTRL_STATUS_RLPIEX BIT(3)
+#define LPI_CTRL_STATUS_RLPIEN BIT(2)
+#define LPI_CTRL_STATUS_TLPIEX BIT(1)
+#define LPI_CTRL_STATUS_TLPIEN BIT(0)
+
 enum dma_irq_status {
tx_hard_error   = BIT(0),
tx_bump_tc  = BIT(1),
@@ -199,6 +226,13 @@ struct sxgbe_extra_stats {
unsigned long rx_buffer_access_err;
unsigned long rx_data_transfer_err;
 
+   /* EEE-LPI stats */
+   unsigned long tx_lpi_entry_n;
+   unsigned long tx_lpi_exit_n;
+   unsigned long rx_lpi_entry_n;
+   unsigned long rx_lpi_exit_n;
+   unsigned long eee_wakeup_error_n;
+
/* RX specific */
/* L2 error */
unsigned long rx_code_gmii_err;
@@ -296,6 +330,13 @@ struct sxgbe_core_ops {
   unsigned char feature_index);
/* adjust SXGBE speed */
void (*set_speed)(void __iomem *ioaddr, unsigned char speed);
+
+   /* EEE-LPI specific operations */
+   void (*set_eee_mode)(void __iomem *ioaddr);
+   void (*reset_eee_mode)(void __iomem *ioaddr);
+   void (*set_eee_timer)(void __iomem *ioaddr, const int ls,
+ const int tw);
+   void (*set_eee_pls)(void __iomem *ioaddr, const int link);
 };
 
 const struct sxgbe_core_ops *sxgbe_get_core_ops(void);
@@ -352,6 +393,8 @@ struct sxgbe_hw_features {
/* IEEE 1588-2008 */
unsigned int atime_stamp;
 
+   unsigned int eee;
+
unsigned int tx_csum_offload;
unsigned int rx_csum_offload;
unsigned int multi_macaddr;
@@ -435,6 +478,13 @@ struct sxgbe_priv_data {
/* tc control */
int tx_tc;
int rx_tc;
+   /* EEE-LPI specific members */
+   struct timer_list eee_ctrl_timer;
+   bool tx_path_in_lpi_mode;
+   int lpi_irq;
+   int eee_enabled;
+   int eee_active;
+   int tx_lpi_timer;
 };
 
 /* Function prototypes */
@@ -457,4 +507,7 @@ int sxgbe_restore(struct net_device *ndev);
 
 const struct sxgbe_mtl_ops *sxgbe_get_mtl_ops(void);
 
+void sxgbe_disable_eee_mode(struct sxgbe_priv_data * const priv);
+bool sxgbe_eee_init(struct sxgbe_priv_data * const priv);
+
 #endif /* __SXGBE_COMMON_H__ */
diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_core.c 
b/drivers/net/ethernet/samsung/sxgbe/sxgbe_core.c
index 17eea58..bf93b16 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_core.c
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_core.c
@@ -47,11 +47,38 @@ static void sxgbe_core_dump_regs(void __iomem *ioaddr)
 {
 }
 
+static int sxgbe_get_lpi_status(void __iomem *ioaddr, const u32 irq_status)
+{
+   int status = 0;
+   int lpi_status;
+
+   /* Reading this register shall clear all the LPI status bits */
+   lpi_status = readl(ioaddr + SXGBE_CORE_LPI_CTRL_STATUS);
+
+   if (lpi_status & LPI_CTRL_STATUS_TLPIEN)
+   status |= TX_ENTRY_LPI_MODE;
+   if (lpi_status & LPI_CTRL_STATUS_TLPIEX)
+   status |= TX_EXIT_LPI_MODE;
+   if (lpi_status & LPI_CTRL_STATUS_RLPIEN)
+   status |= RX_ENTRY_LPI_MODE;
+   if (lpi_status & LPI_CTRL_STATUS_RLPIEX)
+   status |= RX_EXIT_LPI_MODE;
+
+   return status;
+}
+
 /* Handle extra ev

[PATCH V7 0/7] add new Samsung SXGBE driver

2014-03-19 Thread Byungho An
Hi all,

This is 7th posting for SAMSUNG SXGBE driver.

Changes since v1:
- changed name of driver to SXGbE as per Ben's comment
- squashed Joe's neatening for many stuff in original patches

Changes since v2:
- updated and split binding document as per Mark's comment
- clean up codes as per Joe's comment
- removed unused fields and clean up codes as per Francois's comment
- removed module parameters as per Dave's comment
- moved driver directory to samsung/sxgbe/

Changes since v3:
- fixed Missing a blank line after declarations as per Dave's comment
- clean up codes as per Joe's comment
- removed reference of net_device.{irq, base_addr} as per Francois's comment

Changes since v4:
- updated binding document and DT related function as per Mark's comment

Changes since v5:
- updated binding document and DT related function as per Florian's comment
- fixed typo and shortened code as per Joe's comment

Changes since v6:
- updated TSO related functions as per Rayagond's comment
- updated binding document as per Mark's comment
- removed WoL from this patch set

Byungho An (1):
  MAINTAINERS: add maintainer for Samsung sxgbe driver

Girish K S (1):
  net: sxgbe: add EEE(Energy Efficient Ethernet) for Samsung sxgbe

Siva Reddy (2):
  sxgbe: Add device-tree binding support document
  net: sxgbe: add basic framework for Samsung 10Gb ethernet driver

Vipul Pandya (3):
  net: sxgbe: add TSO support for Samsung sxgbe
  net: sxgbe: add Checksum offload support for Samsung sxgbe
  net: sxgbe: add ethtool related functions support Samsung sxgbe

 .../devicetree/bindings/net/samsung-sxgbe.txt  |   60 +
 MAINTAINERS|9 +
 drivers/net/ethernet/Kconfig   |1 +
 drivers/net/ethernet/Makefile  |1 +
 drivers/net/ethernet/samsung/Kconfig   |   20 +
 drivers/net/ethernet/samsung/Makefile  |5 +
 drivers/net/ethernet/samsung/sxgbe/Kconfig |9 +
 drivers/net/ethernet/samsung/sxgbe/Makefile|4 +
 drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h  |  539 +
 drivers/net/ethernet/samsung/sxgbe/sxgbe_core.c|  261 +++
 drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.c|  515 +
 drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.h|  298 +++
 drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.c |  387 
 drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.h |   51 +
 drivers/net/ethernet/samsung/sxgbe/sxgbe_ethtool.c |  588 +
 drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c| 2313 
 drivers/net/ethernet/samsung/sxgbe/sxgbe_mdio.c|  271 +++
 drivers/net/ethernet/samsung/sxgbe/sxgbe_mtl.c |  252 +++
 drivers/net/ethernet/samsung/sxgbe/sxgbe_mtl.h |  104 +
 .../net/ethernet/samsung/sxgbe/sxgbe_platform.c|  262 +++
 drivers/net/ethernet/samsung/sxgbe/sxgbe_reg.h |  488 +
 drivers/net/ethernet/samsung/sxgbe/sxgbe_xpcs.c|   92 +
 drivers/net/ethernet/samsung/sxgbe/sxgbe_xpcs.h|   38 +
 include/linux/sxgbe_platform.h         |   54 +
 24 files changed, 6622 insertions(+)

Thanks,
Byungho An

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


[PATCH V7 1/7] sxgbe: Add device-tree binding support document

2014-03-19 Thread Byungho An
From: Siva Reddy 

This patch adds binding document for SXGBE ethernet driver via device-tree.

Signed-off-by: Siva Reddy Kallam 
Signed-off-by: Byungho An 
---
 .../devicetree/bindings/net/samsung-sxgbe.txt  |   60 
 1 file changed, 60 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/net/samsung-sxgbe.txt

diff --git a/Documentation/devicetree/bindings/net/samsung-sxgbe.txt 
b/Documentation/devicetree/bindings/net/samsung-sxgbe.txt
new file mode 100644
index 000..231acf8
--- /dev/null
+++ b/Documentation/devicetree/bindings/net/samsung-sxgbe.txt
@@ -0,0 +1,60 @@
+* Samsung 10G Ethernet driver (SXGBE)
+
+Required properties:
+- compatible: Should be "samsung,sxgbe-v2.0a"
+- reg: Address and length of the register set for the device
+- interrupt-parent: Should be the phandle for the interrupt controller
+  that services interrupts for this device
+- interrupts: Should contain the SXGBE interrupts
+  These interrupts are ordered by fixed and follows variable
+  trasmit DMA interrupts, receive DMA interrupts and lpi interrupt.
+  index 0 - this is fixed common interrupt of SXGBE and it is always
+  available.
+  index 1 to 25 - 8 variable trasmit interrupts, variable 16 receive interrupts
+  and 1 optional lpi interrupt.
+- phy-mode: String, operation mode of the PHY interface.
+  Supported values are: "sgmii", "xgmii".
+- samsung,pbl: Integer, Programmable Burst Length.
+  Supported values are 1, 2, 4, 8, 16, or 32.
+- samsung,burst-map: Integer, Program the possible bursts supported by sxgbe
+  This is an interger and represents allowable DMA bursts when fixed burst.
+  Allowable range is 0x01-0x3F. When this field is set fixed burst is enabled.
+  When fixed length is needed for burst mode, it can be set within allowable
+  range.
+- samsung,adv-addr-mode: Boolean, Program the DMA to use Enhanced address mode.
+  When enhanced address mode is needed, it can be set.
+- samsung,force-thresh-dma-mode: Boolean, Force DMA to use the threshold mode
+  for both tx and rx.
+- samsung,force-sf-dma-mode: Boolean, Force DMA to use the Store and Forward
+  mode for both tx and rx. This flag is ignored if force-thresh-dma-mode is 
set.
+
+Optional properties:
+- mac-address: 6 bytes, mac address
+- max-frame-size: Maximum Transfer Unit (IEEE defined MTU), rather
+ than the maximum frame size.
+
+Example:
+
+   aliases {
+   ethernet0 = <&sxgbe0>;
+   };
+
+   sxgbe0: ethernet@1a04 {
+   compatible = "samsung,sxgbe-v2.0a";
+   reg = <0 0x1a04 0 0x1>;
+   interrupt-parent = <&gic>;
+   interrupts = <0 209 4>, <0 185 4>, <0 186 4>, <0 187 4>,
+<0 188 4>, <0 189 4>, <0 190 4>, <0 191 4>,
+<0 192 4>, <0 193 4>, <0 194 4>, <0 195 4>,
+<0 196 4>, <0 197 4>, <0 198 4>, <0 199 4>,
+<0 200 4>, <0 201 4>, <0 202 4>, <0 203 4>,
+<0 204 4>, <0 205 4>, <0 206 4>, <0 207 4>,
+<0 208 4>, <0 210 4>;
+   samsung,pbl = <0x08>
+   samsung,burst-map = <0x20>
+   samsung,adv-addr-mode = "true"
+   samsung,force-sf-dma-mode = "true"
+   mac-address = [ 00 11 22 33 44 55 ]; /* Filled in by U-Boot */
+   max-frame-size = <9000>;
+   phy-mode = "xgmii";
+   };
-- 
1.7.10.4


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


[PATCH V7 3/7] net: sxgbe: add TSO support for Samsung sxgbe

2014-03-19 Thread Byungho An
From: Vipul Pandya 

Enable TSO during initialization for each DMA channels

Signed-off-by: Vipul Pandya 
Neatening-by: Joe Perches 
Signed-off-by: Byungho An 
---
 drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h |1 +
 drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.h   |   17 +++--
 drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.c|   10 +++
 drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.h|2 +
 drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c   |   81 +++--
 5 files changed, 98 insertions(+), 13 deletions(-)

diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h 
b/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h
index 587b691..f8ba7e4 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h
@@ -327,6 +327,7 @@ struct sxgbe_tx_queue {
u32 tx_coal_frames;
u32 tx_coal_timer;
int hwts_tx_en;
+   u16 prev_mss;
u8 queue_no;
 };
 
diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.h 
b/drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.h
index 41844d4..547edf3 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.h
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.h
@@ -167,8 +167,9 @@ struct sxgbe_desc_ops {
void (*init_tx_desc)(struct sxgbe_tx_norm_desc *p);
 
/* Invoked by the xmit function to prepare the tx descriptor */
-   void (*tx_enable_tse)(struct sxgbe_tx_norm_desc *p, u8 is_tse,
-   u32 hdr_len, u32 payload_len);
+   void (*tx_desc_enable_tse)(struct sxgbe_tx_norm_desc *p, u8 is_tse,
+  u32 total_hdr_len, u32 tcp_hdr_len,
+  u32 tcp_payload_len);
 
/* Assign buffer lengths for descriptor */
void (*prepare_tx_desc)(struct sxgbe_tx_norm_desc *p, u8 is_fd,
@@ -207,20 +208,26 @@ struct sxgbe_desc_ops {
int (*get_tx_timestamp_status)(struct sxgbe_tx_norm_desc *p);
 
/* TX Context Descripto Specific */
-   void (*init_tx_ctxt_desc)(struct sxgbe_tx_ctxt_desc *p);
+   void (*tx_ctxt_desc_set_ctxt)(struct sxgbe_tx_ctxt_desc *p);
 
/* Set the owner of the TX context descriptor */
-   void (*set_tx_ctxt_owner)(struct sxgbe_tx_ctxt_desc *p);
+   void (*tx_ctxt_desc_set_owner)(struct sxgbe_tx_ctxt_desc *p);
 
/* Get the owner of the TX context descriptor */
int (*get_tx_ctxt_owner)(struct sxgbe_tx_ctxt_desc *p);
 
/* Set TX mss */
-   void (*tx_ctxt_desc_setmss)(struct sxgbe_tx_ctxt_desc *p, int mss);
+   void (*tx_ctxt_desc_set_mss)(struct sxgbe_tx_ctxt_desc *p, u16 mss);
 
/* Set TX mss */
int (*tx_ctxt_desc_get_mss)(struct sxgbe_tx_ctxt_desc *p);
 
+   /* Set TX tcmssv */
+   void (*tx_ctxt_desc_set_tcmssv)(struct sxgbe_tx_ctxt_desc *p);
+
+   /* Reset TX ostc */
+   void (*tx_ctxt_desc_reset_ostc)(struct sxgbe_tx_ctxt_desc *p);
+
/* Set IVLAN information */
void (*tx_ctxt_desc_set_ivlantag)(struct sxgbe_tx_ctxt_desc *p,
  int is_ivlanvalid, int ivlan_tag,
diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.c 
b/drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.c
index 1e68ef3..1edc451 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.c
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.c
@@ -354,6 +354,15 @@ static void sxgbe_dma_rx_watchdog(void __iomem *ioaddr, 
u32 riwt)
}
 }
 
+static void sxgbe_enable_tso(void __iomem *ioaddr, u8 chan_num)
+{
+   u32 ctrl;
+
+   ctrl = readl(ioaddr + SXGBE_DMA_CHA_TXCTL_REG(chan_num));
+   ctrl |= SXGBE_DMA_CHA_TXCTL_TSE_ENABLE;
+   writel(ctrl, ioaddr + SXGBE_DMA_CHA_TXCTL_REG(chan_num));
+}
+
 static const struct sxgbe_dma_ops sxgbe_dma_ops = {
.init = sxgbe_dma_init,
.cha_init = sxgbe_dma_channel_init,
@@ -369,6 +378,7 @@ static const struct sxgbe_dma_ops sxgbe_dma_ops = {
.tx_dma_int_status = sxgbe_tx_dma_int_status,
.rx_dma_int_status = sxgbe_rx_dma_int_status,
.rx_watchdog = sxgbe_dma_rx_watchdog,
+   .enable_tso = sxgbe_enable_tso,
 };
 
 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 50c8054..6c070ac 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.h
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.h
@@ -42,6 +42,8 @@ struct sxgbe_dma_ops {
 struct sxgbe_extra_stats *x);
/* Program the HW RX Watchdog */
void (*rx_watchdog)(void __iomem *ioaddr, u32 riwt);
+   /* Enable TSO for each DMA channel */
+   void (*enable_tso)(void __iomem *ioaddr, u8 chan_num);
 };
 
 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 1714fd7..dc07ee6 100644
--- a/drivers/net

[PATCH V7 7/7] MAINTAINERS: add maintainer for Samsung sxgbe driver

2014-03-19 Thread Byungho An
From: Byungho An 

Signed-off-by: Byungho An 
---
 MAINTAINERS |9 +
 1 file changed, 9 insertions(+)

diff --git a/MAINTAINERS b/MAINTAINERS
index b7befe7..aeb81f2 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -7536,6 +7536,15 @@ S:   Supported
 L: linux-samsung-soc@vger.kernel.org (moderated for non-subscribers)
 F: drivers/clk/samsung/
 
+SAMSUNG SXGBE DRIVERS
+M: Byungho An 
+M: Girish K S 
+M: Siva Reddy Kallam 
+M: Vipul Pandya 
+S: Supported
+L: net...@vger.kernel.org
+F: drivers/net/ethernet/samsung/sxgbe/
+
 SERIAL DRIVERS
 M: Greg Kroah-Hartman 
 L: linux-ser...@vger.kernel.org
-- 
1.7.10.4


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


RE: [PATCH V4 1/8] sxgbe: Add device-tree binding support document

2014-03-19 Thread Byungho An
Mark Rutland  :
> On Tue, Mar 18, 2014 at 04:27:46PM +0000, Byungho An wrote:
> > Mark Rutland  :
> > > Hi,
> > >
> > > As a general note it's helpful for devicetree to be Cc'd on the
> > > entire
> > series
> > > (though the binding document should be a separate patch) as it
> > > provides
> > useful
> > > context for reviewing the binding.
> > OK.
> >
> > >
> > > On Tue, Mar 18, 2014 at 06:47:13AM +, Byungho An wrote:
> > > > From: Siva Reddy 
> > > >
> > > > This patch adds binding document for SXGBE ethernet driver via
> > device-tree.
> > > >
> > > > Signed-off-by: Siva Reddy Kallam 
> > > > Signed-off-by: Byungho An 
> > > > ---
> > > >  .../devicetree/bindings/net/samsung-sxgbe.txt  |   53
> > > > 
> > > >  1 file changed, 53 insertions(+)
> > > >  create mode 100644
> > > > Documentation/devicetree/bindings/net/samsung-sxgbe.txt
> > > >
> > > > diff --git
> > > > a/Documentation/devicetree/bindings/net/samsung-sxgbe.txt
> > > > b/Documentation/devicetree/bindings/net/samsung-sxgbe.txt
> > > > new file mode 100644
> > > > index 000..ca27947
> > > > --- /dev/null
> > > > +++ b/Documentation/devicetree/bindings/net/samsung-sxgbe.txt
> > > > @@ -0,0 +1,53 @@
> > > > +* Samsung 10G Ethernet driver (SXGBE)
> > > > +
> > > > +Required properties:
> > > > +- compatible: Should be "samsung,sxgbe-v2.0a"
> > > > +- reg: Address and length of the register set for the device
> > > > +- interrupt-parent: Should be the phandle for the interrupt
> > > > +controller
> > > > +  that services interrupts for this device
> > > > +- interrupts: Should contain the SXGBE interrupts
> > > > +  These interrupts are ordered by fixed and follows variable
> > > > +  trasmit DMA interrupts, receive DMA interrupts and lpi interrupt.
> > > > +  index 0 - this is fixed common interrupt of SXGBE and it is
> > > > +always
> > > > +  available.
> > > > +  index 1 to 25 - 8 variable trasmit interrupts, variable 16
> > > > +receive
> > > > interrupts
> > > > +  and 1 optional lpi interrupt.
> > > > +- phy-mode: String, operation mode of the PHY interface.
> > > > +  Supported values are: "xaui", "gmii".
> > > > +- samsung,pbl: Integer, Programmable Burst Length.
> > > > +  Supported values are 1, 2, 4, 8, 16, or 32.
> > >
> > > There's no need to abbreviate to "pbl".
> > >
> > > Is this a property of the hardware, or configuration that the kernel
> > > will
> > program
> > > in? If the latter, why can the kernel not choose?
> > Yes, this is hardware property
> 
> Ok.
> 
> >
> > >
> > > > +- samsung,fixed-burst: Boolean, Program the DMA to use the fixed
> > > > +burst mode
> > > > +- samsung,burst-map: Integer, Program the possible bursts
> > > > +supported by sxgbe
> > > > +  This is an interger and represents allowable DMA bursts when
> > > > +fixed
> > burst.
> > > > +  Allowable range is 0x00-0x3F. This field is valid only when
> > > > +fixed burst is
> > > > +  enabled, otherwise ignored.
> > >
> > > If that's the case, why not have just this property and have it
> > > imply the
> > use of
> > > fixed burst mode?
> > OK. It will be implemented in next patch set.
> >
> > >
> > > When is it necessary to use fixed burst mode?
> > This is the configurable mode of DMA an used internally by hardware to
> > fetch data from platform bus
> 
> Sure, but that doesn't describe when it is necessary. Is this the way the
DMA
> was configured at integration time, or the way the kernel should configure
it?
It is needed when fixed length of burst is needed. 
if it is not configured, the length of burst will be variable(not fixed).
Anyway, I'll add description more for it.

> 
> If the latter, is it absolutely necessary for correctness to use fixed-burst
mode?
> Or is it just always sensible to use it if available? 
It is not absolutely necessary, as I mentioned above.

> 
> What does the driver do if fixed burst mode is not available? Would this
work in
> the presence of fixed-burt mode?
Fixed burst mode is alway

RE: [PATCH V6 3/8] net: sxgbe: add TSO support for Samsung sxgbe

2014-03-19 Thread Byungho An
Rayagond Kokatanur  wrote:
> On Wed, Mar 19, 2014 at 11:02 AM, Byungho An  wrote:
[snip]
> >
> > /* save the skb address */
> > tqueue->tx_skbuff[entry] = skb;
> >
> > if (!is_jumbo) {
> > -   tx_desc->tdes01 = dma_map_single(priv->device, skb->data,
> > -  no_pagedlen,
DMA_TO_DEVICE);
> > -   if (dma_mapping_error(priv->device, tx_desc->tdes01))
> > -   pr_err("%s: TX dma mapping failed!!\n", __func__);
> > -
> > -   priv->hw->desc->prepare_tx_desc(tx_desc, 1, no_pagedlen,
> > -   no_pagedlen);
> > +   if (likely(skb_is_gso(skb))) {
> > +   /* TSO support */
> > +   mss = skb_shinfo(skb)->gso_size;
> > +
> > + priv->hw->desc->tx_ctxt_desc_set_mss(ctxt_desc, mss);
> 
> No need to issue context descriptor for every TSO packets. Program context
descriptor only if MSS value is value is changed compared
> to previous TSO packet MSS value. By this way we can reduce the one extra
descriptor fetch by device and improve the performance.
OK. This will be applied in the  next post.

[snip]
> > @@ -1893,7 +1943,9 @@ struct sxgbe_priv_data *sxgbe_dvr_probe(struct
> > device *device,
> >
> > ndev->netdev_ops = &sxgbe_netdev_ops;
> >
> > -   ndev->hw_features = NETIF_F_SG | NETIF_F_RXCSUM;
> > +   ndev->hw_features = NETIF_F_SG | NETIF_F_IP_CSUM |
NETIF_F_IPV6_CSUM |
> > +   NETIF_F_RXCSUM | NETIF_F_TSO | NETIF_F_TSO6 |
> > +   NETIF_F_GRO;
> 
> Enable TSO only if HW supports, hence we have to check for HW
feature/capability registers here also.
OK. Thanks

> 
> > ndev->features |= ndev->hw_features | NETIF_F_HIGHDMA;
> > ndev->watchdog_timeo = msecs_to_jiffies(TX_TIMEO);
> >
> > @@ -1905,6 +1957,13 @@ struct sxgbe_priv_data *sxgbe_dvr_probe(struct
device *device,
> > if (flow_ctrl)
> > priv->flow_ctrl = SXGBE_FLOW_AUTO;  /* RX/TX pause on
*/
> >
> > +   /* Enable TCP segmentation offload for all DMA channels */
> > +   if (priv->hw_cap.tcpseg_offload) {
> > +   SXGBE_FOR_EACH_QUEUE(SXGBE_TX_QUEUES, queue_num) {
> > +   priv->hw->dma->enable_tso(priv->ioaddr,
queue_num);
> > +   }
> > +   }
> > +
> > /* Rx Watchdog is available, enable depend on platform data */
> > if (!priv->plat->riwt_off) {
> > priv->use_riwt = 1;
> > --
> > 1.7.10.4
> >
> >
> > --
> > To unsubscribe from this list: send the line "unsubscribe netdev" in
> > the body of a message to majord...@vger.kernel.org More majordomo info
> > at  http://vger.kernel.org/majordomo-info.html
> --
> To unsubscribe from this list: send the line "unsubscribe netdev" in the
body of a message to majord...@vger.kernel.org More
> majordomo info at  http://vger.kernel.org/majordomo-info.html

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


[PATCH V6 6/8] net: sxgbe: add WOL(Wakeup-On-Lan)support for Samsung sxgbe

2014-03-18 Thread Byungho An
From: Girish K S 

This patch adds support for wake up on magic frame arrival.
Also remote wake up on all other packets (unicast, multicast broadcast) is 
supported.

Signed-off-by: Girish K S 
Neatening-by: Joe Perches 
Signed-off-by: Byungho An 
---
 drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h  |   15 +
 drivers/net/ethernet/samsung/sxgbe/sxgbe_core.c|   29 
 drivers/net/ethernet/samsung/sxgbe/sxgbe_ethtool.c |   47 +
 drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c|   71 
 drivers/net/ethernet/samsung/sxgbe/sxgbe_mtl.c |   43 +++-
 drivers/net/ethernet/samsung/sxgbe/sxgbe_mtl.h |4 ++
 .../net/ethernet/samsung/sxgbe/sxgbe_platform.c|4 ++
 drivers/net/ethernet/samsung/sxgbe/sxgbe_reg.h |3 +
 8 files changed, 215 insertions(+), 1 deletion(-)

diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h 
b/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h
index 7937493..30adc81 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h
@@ -121,9 +121,18 @@ struct sxgbe_mtl_ops;
 #define RX_ENTRY_LPI_MODE  0x40
 #define RX_EXIT_LPI_MODE   0x80
 
+/* PMT mode bits */
+#define PMT_PWRDWN BIT(0)
+#define PMT_MGPKT_EN   BIT(1)
+#define PMT_RWKPKT_EN  BIT(2)
+#define PMT_GUCAST_EN  BIT(9)
+
 /* EEE-LPI Interrupt status flag */
 #define LPI_INT_STATUS BIT(5)
 
+/* PMT Interrupt status */
+#define PMT_INT_STATUS BIT(4)
+
 /* EEE-LPI Default timer values */
 #define LPI_LINK_STATUS_TIMER  0x3E8
 #define LPI_MAC_WAIT_TIMER 0x00
@@ -225,6 +234,7 @@ struct sxgbe_extra_stats {
unsigned long rx_desc_access_err;
unsigned long rx_buffer_access_err;
unsigned long rx_data_transfer_err;
+   unsigned long pmt_irq_event_n;
 
/* EEE-LPI stats */
unsigned long tx_lpi_entry_n;
@@ -489,6 +499,11 @@ struct sxgbe_priv_data {
int eee_enabled;
int eee_active;
int tx_lpi_timer;
+
+   /* PM-WOL specific members */
+   int wolopts;
+   int wolenabled;
+   int wol_irq;
 };
 
 /* Function prototypes */
diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_core.c 
b/drivers/net/ethernet/samsung/sxgbe/sxgbe_core.c
index 5885fd6..334d196 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_core.c
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_core.c
@@ -78,12 +78,41 @@ static int sxgbe_core_host_irq_status(void __iomem *ioaddr,
if (unlikely(irq_status & LPI_INT_STATUS))
status |= sxgbe_get_lpi_status(ioaddr, irq_status);
 
+   if (unlikely(irq_status & PMT_INT_STATUS)) {
+   /* clear the PMT bits 5 and 6 by reading the PMT status reg */
+   readl(ioaddr + SXGBE_CORE_PMT_CTL_STATUS_REG);
+   x->pmt_irq_event_n++;
+   }
+
return status;
 }
 
 /* Set power management mode (e.g. magic frame) */
 static void sxgbe_core_pmt(void __iomem *ioaddr, unsigned long mode)
 {
+   unsigned int pmt = 0;
+
+   if (mode & WAKE_MAGIC) {
+   pr_debug("WOL Magic frame\n");
+   pmt |= PMT_MGPKT_EN;
+   }
+   if (mode & WAKE_UCAST) {
+   pr_debug("WOL on global unicast\n");
+   pmt |= PMT_GUCAST_EN;
+   }
+   if (mode & (WAKE_MCAST | WAKE_BCAST)) {
+   pr_debug("WOL on any other packet\n");
+   pmt |= PMT_RWKPKT_EN;
+   }
+
+   writel(pmt, ioaddr + SXGBE_CORE_PMT_CTL_STATUS_REG);
+
+   /* Enable power down bit if any of the requested mode is enabled */
+   if (pmt) {
+   writel(SXGBE_RX_ENABLE, ioaddr + SXGBE_CORE_RX_CONFIG_REG);
+   pmt |= PMT_PWRDWN;
+   writel(pmt, ioaddr + SXGBE_CORE_PMT_CTL_STATUS_REG);
+   }
 }
 
 /* Set/Get Unicast MAC addresses */
diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_ethtool.c 
b/drivers/net/ethernet/samsung/sxgbe/sxgbe_ethtool.c
index 9083300..89b1450 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_ethtool.c
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_ethtool.c
@@ -12,6 +12,7 @@
 
 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
 
+#include 
 #include 
 #include 
 #include 
@@ -37,6 +38,7 @@ static const struct sxgbe_stats sxgbe_gstrings_stats[] = {
SXGBE_STAT(rx_lpi_entry_n),
SXGBE_STAT(rx_lpi_exit_n),
SXGBE_STAT(eee_wakeup_error_n),
+   SXGBE_STAT(pmt_irq_event_n),
 };
 #define SXGBE_STATS_LEN ARRAY_SIZE(sxgbe_gstrings_stats)
 
@@ -80,9 +82,54 @@ static int sxgbe_ethtool_set_eee(struct net_device *dev,
return phy_ethtool_set_eee(priv->phydev, edata);
 }
 
+static void sxgbe_get_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
+{
+   struct sxgbe_priv_data *priv = netdev_priv(dev);
+
+   wol->wolopts = 0;
+   if (!device_can_wakeup(priv->device)) {
+  

[PATCH V6 5/8] net: sxgbe: add Checksum offload support for Samsung sxgbe

2014-03-18 Thread Byungho An
From: Vipul Pandya 

This patch adds TX and RX checksum offload support.

Signed-off-by: Vipul Pandya 
Neatening-by: Joe Perches 
Signed-off-by: Byungho An 
---
 drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h |5 +++
 drivers/net/ethernet/samsung/sxgbe/sxgbe_core.c   |   20 +
 drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.h   |6 +--
 drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c   |   46 -
 4 files changed, 63 insertions(+), 14 deletions(-)

diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h 
b/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h
index 937969c..7937493 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h
@@ -337,6 +337,10 @@ struct sxgbe_core_ops {
void (*set_eee_timer)(void __iomem *ioaddr, const int ls,
  const int tw);
void (*set_eee_pls)(void __iomem *ioaddr, const int link);
+
+   /* Enable disable checksum offload operations */
+   void (*enable_rx_csum)(void __iomem *ioaddr);
+   void (*disable_rx_csum)(void __iomem *ioaddr);
 };
 
 const struct sxgbe_core_ops *sxgbe_get_core_ops(void);
@@ -448,6 +452,7 @@ struct sxgbe_priv_data {
struct sxgbe_ops *hw;   /* sxgbe specific ops */
int no_csum_insertion;
int irq;
+   int rxcsum_insertion;
spinlock_t stats_lock;  /* lock for tx/rx statatics */
 
struct phy_device *phydev;
diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_core.c 
b/drivers/net/ethernet/samsung/sxgbe/sxgbe_core.c
index bf93b16..5885fd6 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_core.c
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_core.c
@@ -217,6 +217,24 @@ static void  sxgbe_set_eee_timer(void __iomem *ioaddr,
writel(value, ioaddr + SXGBE_CORE_LPI_TIMER_CTRL);
 }
 
+static void sxgbe_enable_rx_csum(void __iomem *ioaddr)
+{
+   u32 ctrl;
+
+   ctrl = readl(ioaddr + SXGBE_CORE_RX_CONFIG_REG);
+   ctrl |= SXGBE_RX_CSUMOFFLOAD_ENABLE;
+   writel(ctrl, ioaddr + SXGBE_CORE_RX_CONFIG_REG);
+}
+
+static void sxgbe_disable_rx_csum(void __iomem *ioaddr)
+{
+   u32 ctrl;
+
+   ctrl = readl(ioaddr + SXGBE_CORE_RX_CONFIG_REG);
+   ctrl &= ~SXGBE_RX_CSUMOFFLOAD_ENABLE;
+   writel(ctrl, ioaddr + SXGBE_CORE_RX_CONFIG_REG);
+}
+
 const struct sxgbe_core_ops core_ops = {
.core_init = sxgbe_core_init,
.dump_regs = sxgbe_core_dump_regs,
@@ -233,6 +251,8 @@ const struct sxgbe_core_ops core_ops = {
.reset_eee_mode = sxgbe_reset_eee_mode,
.set_eee_timer = sxgbe_set_eee_timer,
.set_eee_pls = sxgbe_set_eee_pls,
+   .enable_rx_csum = sxgbe_enable_rx_csum,
+   .disable_rx_csum = sxgbe_disable_rx_csum,
 };
 
 const struct sxgbe_core_ops *sxgbe_get_core_ops(void)
diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.h 
b/drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.h
index 547edf3..3c0b5a8 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.h
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.h
@@ -113,7 +113,7 @@ struct sxgbe_rx_norm_desc {
/* WB RDES3 */
u32 pkt_len:14;
u32 rdes3_reserved:1;
-   u32 err_summary:15;
+   u32 err_summary:1;
u32 err_l2_type:4;
u32 layer34_pkt_type:4;
u32 no_coagulation_pkt:1;
@@ -273,8 +273,8 @@ struct sxgbe_desc_ops {
int (*get_rx_ld_status)(struct sxgbe_rx_norm_desc *p);
 
/* Return the reception status looking at the RDES1 */
-   void (*rx_wbstatus)(struct sxgbe_rx_norm_desc *p,
-   struct sxgbe_extra_stats *x);
+   int (*rx_wbstatus)(struct sxgbe_rx_norm_desc *p,
+  struct sxgbe_extra_stats *x, int *checksum);
 
/* Get own bit */
int (*get_rx_ctxt_owner)(struct sxgbe_rx_ctxt_desc *p);
diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c 
b/drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c
index 25a7ad5..f0ee143 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c
@@ -1255,6 +1255,7 @@ void sxgbe_tso_prepare(struct sxgbe_priv_data *priv,
 static netdev_tx_t sxgbe_xmit(struct sk_buff *skb, struct net_device *dev)
 {
unsigned int entry, frag_num;
+   int cksum_flag = 0;
struct netdev_queue *dev_txq;
unsigned txq_index = skb_get_queue_mapping(skb);
struct sxgbe_priv_data *priv = netdev_priv(dev);
@@ -1326,7 +1327,7 @@ static netdev_tx_t sxgbe_xmit(struct sk_buff *skb, struct 
net_device *dev)
   __func__);
 
priv->hw->desc->prepare_tx_desc(tx_desc, 1, no_pagedlen,
-   no_pagedlen);
+ 

[PATCH V6 1/8] sxgbe: Add device-tree binding support document

2014-03-18 Thread Byungho An
From: Siva Reddy 

This patch adds binding document for SXGBE ethernet driver via device-tree.

Signed-off-by: Siva Reddy Kallam 
Signed-off-by: Byungho An 
---
 .../devicetree/bindings/net/samsung-sxgbe.txt  |   58 
 1 file changed, 58 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/net/samsung-sxgbe.txt

diff --git a/Documentation/devicetree/bindings/net/samsung-sxgbe.txt 
b/Documentation/devicetree/bindings/net/samsung-sxgbe.txt
new file mode 100644
index 000..4fc05ab
--- /dev/null
+++ b/Documentation/devicetree/bindings/net/samsung-sxgbe.txt
@@ -0,0 +1,58 @@
+* Samsung 10G Ethernet driver (SXGBE)
+
+Required properties:
+- compatible: Should be "samsung,sxgbe-v2.0a"
+- reg: Address and length of the register set for the device
+- interrupt-parent: Should be the phandle for the interrupt controller
+  that services interrupts for this device
+- interrupts: Should contain the SXGBE interrupts
+  These interrupts are ordered by fixed and follows variable
+  trasmit DMA interrupts, receive DMA interrupts and lpi interrupt.
+  index 0 - this is fixed common interrupt of SXGBE and it is always
+  available.
+  index 1 to 25 - 8 variable trasmit interrupts, variable 16 receive interrupts
+  and 1 optional lpi interrupt.
+- phy-mode: String, operation mode of the PHY interface.
+  Supported values are: "sgmii", "xgmii".
+- samsung,pbl: Integer, Programmable Burst Length.
+  Supported values are 1, 2, 4, 8, 16, or 32.
+- samsung,burst-map: Integer, Program the possible bursts supported by sxgbe
+  This is an interger and represents allowable DMA bursts when fixed burst.
+  Allowable range is 0x00-0x3F. This field is valid only when fixed burst is
+  enabled, otherwise ignored.
+- samsung,adv-addr-mode: Boolean, Program the DMA to use Enhanced address mode.
+- samsung,force-thresh-dma-mode: Boolean, Force DMA to use the threshold mode
+  for both tx and rx
+- samsung,force-sf-dma-mode: Boolean, Force DMA to use the Store and Forward
+  mode for both tx and rx. This flag is ignored if force-thresh-dma-mode is 
set.
+
+Optional properties:
+- mac-address: 6 bytes, mac address
+- max-frame-size: Maximum Transfer Unit (IEEE defined MTU), rather
+ than the maximum frame size.
+
+Example:
+
+   aliases {
+   ethernet0 = <&sxgbe0>;
+   };
+
+   sxgbe0: ethernet@1a04 {
+   compatible = "samsung,sxgbe-v2.0a";
+   reg = <0 0x1a04 0 0x1>;
+   interrupt-parent = <&gic>;
+   interrupts = <0 209 4>, <0 185 4>, <0 186 4>, <0 187 4>,
+<0 188 4>, <0 189 4>, <0 190 4>, <0 191 4>,
+<0 192 4>, <0 193 4>, <0 194 4>, <0 195 4>,
+<0 196 4>, <0 197 4>, <0 198 4>, <0 199 4>,
+<0 200 4>, <0 201 4>, <0 202 4>, <0 203 4>,
+<0 204 4>, <0 205 4>, <0 206 4>, <0 207 4>,
+<0 208 4>, <0 210 4>;
+   samsung,pbl = <0x08>
+   samsung,burst-map = <0x20>
+   samsung,adv-addr-mode = "true"
+   samsung,force-sf-dma-mode = "true"
+   mac-address = [ 00 11 22 33 44 55 ]; /* Filled in by U-Boot */
+   max-frame-size = <9000>;
+   phy-mode = "xgmii";
+   };
-- 
1.7.10.4


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


[PATCH V6 7/8] net: sxgbe: add ethtool related functions support Samsung sxgbe

2014-03-18 Thread Byungho An
From: Vipul Pandya 

This patch adds ethtool related functions.

Signed-off-by: Vipul Pandya 
Neatening-by: Joe Perches 
Signed-off-by: Byungho An 
---
 drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h  |   25 +-
 drivers/net/ethernet/samsung/sxgbe/sxgbe_ethtool.c |  510 +++-
 drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c|8 +-
 drivers/net/ethernet/samsung/sxgbe/sxgbe_reg.h |6 +
 4 files changed, 537 insertions(+), 12 deletions(-)

diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h 
b/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h
index 30adc81..c592841 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h
@@ -42,8 +42,12 @@ struct sxgbe_mtl_ops;
 #define SXGBE_RX_QUEUES   16
 
 /* Max/Min RI Watchdog Timer count value */
-#define SXGBE_MAX_DMA_RIWT 0xff
-#define SXGBE_MIN_DMA_RIWT 0x20
+/* Calculated based how much time does it take to fill 256KB Rx memory
+ * at 10Gb speed at 156MHz clock rate and considered little less then
+ * the actual value.
+ */
+#define SXGBE_MAX_DMA_RIWT 0x70
+#define SXGBE_MIN_DMA_RIWT 0x01
 
 /* Tx coalesce parameters */
 #define SXGBE_COAL_TX_TIMER4
@@ -203,6 +207,20 @@ enum dma_irq_status {
 #define SXGBE_FOR_EACH_QUEUE(max_queues, queue_num)\
for (queue_num = 0; queue_num < max_queues; queue_num++)
 
+#define DRV_VERSION "1.0.0"
+
+#define SXGBE_MAX_RX_CHANNELS  16
+#define SXGBE_MAX_TX_CHANNELS  16
+
+#define START_MAC_REG_OFFSET   0x
+#define MAX_MAC_REG_OFFSET 0x0DFC
+#define START_MTL_REG_OFFSET   0x1000
+#define MAX_MTL_REG_OFFSET 0x18FC
+#define START_DMA_REG_OFFSET   0x3000
+#define MAX_DMA_REG_OFFSET 0x38FC
+
+#define REG_SPACE_SIZE 0x2000
+
 /* sxgbe statistics counters */
 struct sxgbe_extra_stats {
/* TX/RX IRQ events */
@@ -488,6 +506,7 @@ struct sxgbe_priv_data {
/* advanced time stamp support */
u32 adv_ts;
int use_riwt;
+   struct ptp_clock *ptp_clock;
 
/* tc control */
int tx_tc;
@@ -529,4 +548,6 @@ const struct sxgbe_mtl_ops *sxgbe_get_mtl_ops(void);
 void sxgbe_disable_eee_mode(struct sxgbe_priv_data * const priv);
 bool sxgbe_eee_init(struct sxgbe_priv_data * const priv);
 
+int sxgbe_set_flow_ctrl(struct sxgbe_priv_data *priv, int rx, int tx);
+
 #endif /* __SXGBE_COMMON_H__ */
diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_ethtool.c 
b/drivers/net/ethernet/samsung/sxgbe/sxgbe_ethtool.c
index 89b1450..3421ca2 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_ethtool.c
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_ethtool.c
@@ -12,12 +12,17 @@
 
 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
 
+#include 
 #include 
 #include 
 #include 
+#include 
 #include 
+#include 
 
 #include "sxgbe_common.h"
+#include "sxgbe_reg.h"
+#include "sxgbe_dma.h"
 
 struct sxgbe_stats {
char stat_string[ETH_GSTRING_LEN];
@@ -33,17 +38,106 @@ struct sxgbe_stats {
 }
 
 static const struct sxgbe_stats sxgbe_gstrings_stats[] = {
+   /* TX/RX IRQ events */
+   SXGBE_STAT(tx_process_stopped_irq),
+   SXGBE_STAT(tx_ctxt_desc_err),
+   SXGBE_STAT(tx_threshold),
+   SXGBE_STAT(rx_threshold),
+   SXGBE_STAT(tx_pkt_n),
+   SXGBE_STAT(rx_pkt_n),
+   SXGBE_STAT(normal_irq_n),
+   SXGBE_STAT(tx_normal_irq_n),
+   SXGBE_STAT(rx_normal_irq_n),
+   SXGBE_STAT(napi_poll),
+   SXGBE_STAT(tx_clean),
+   SXGBE_STAT(tx_reset_ic_bit),
+   SXGBE_STAT(rx_process_stopped_irq),
+   SXGBE_STAT(rx_underflow_irq),
+
+   /* Bus access errors */
+   SXGBE_STAT(fatal_bus_error_irq),
+   SXGBE_STAT(tx_read_transfer_err),
+   SXGBE_STAT(tx_write_transfer_err),
+   SXGBE_STAT(tx_desc_access_err),
+   SXGBE_STAT(tx_buffer_access_err),
+   SXGBE_STAT(tx_data_transfer_err),
+   SXGBE_STAT(rx_read_transfer_err),
+   SXGBE_STAT(rx_write_transfer_err),
+   SXGBE_STAT(rx_desc_access_err),
+   SXGBE_STAT(rx_buffer_access_err),
+   SXGBE_STAT(rx_data_transfer_err),
+   SXGBE_STAT(pmt_irq_event_n),
+
+   /* EEE-LPI stats */
SXGBE_STAT(tx_lpi_entry_n),
SXGBE_STAT(tx_lpi_exit_n),
SXGBE_STAT(rx_lpi_entry_n),
SXGBE_STAT(rx_lpi_exit_n),
SXGBE_STAT(eee_wakeup_error_n),
-   SXGBE_STAT(pmt_irq_event_n),
+
+   /* RX specific */
+   /* L2 error */
+   SXGBE_STAT(rx_code_gmii_err),
+   SXGBE_STAT(rx_watchdog_err),
+   SXGBE_STAT(rx_crc_err),
+   SXGBE_STAT(rx_gaint_pkt_err),
+   SXGBE_STAT(ip_hdr_err),
+   SXGBE_STAT(ip_payload_err),
+   SXGBE_STAT(overflow_error),
+
+   /* L2 Pkt type */
+   SXGBE_STAT(len_pkt),
+   SXGBE_STAT(mac_ctl_pkt),
+   SXGBE_STAT(dcb_ctl_pkt),
+   SXGBE_STAT(arp_pkt),
+   SXGBE_STAT(oam_pkt),
+   SXGBE_STAT(untag_okt),
+   SXGBE_STAT(other_pkt),
+   SXGBE_

[PATCH V6 4/8] net: sxgbe: add EEE(Energy Efficient Ethernet) for Samsung sxgbe

2014-03-18 Thread Byungho An
From: Girish K S 

Added support for the EEE(Energy Efficient Ethernet)in 10G ethernet driver.

Signed-off-by: Girish K S 
Neatening-by: Joe Perches 
Signed-off-by: Byungho An 
---
 drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h  |   53 +++
 drivers/net/ethernet/samsung/sxgbe/sxgbe_core.c|   86 +-
 drivers/net/ethernet/samsung/sxgbe/sxgbe_ethtool.c |   47 ++
 drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c|  165 +++-
 .../net/ethernet/samsung/sxgbe/sxgbe_platform.c|4 +
 drivers/net/ethernet/samsung/sxgbe/sxgbe_reg.h |5 +
 6 files changed, 358 insertions(+), 2 deletions(-)

diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h 
b/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h
index 587b691..937969c 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h
@@ -115,6 +115,33 @@ struct sxgbe_mtl_ops;
 #define RX_PTP_SIGNAL  0x0A
 #define RX_PTP_RESV_MSG0x0F
 
+/* EEE-LPI mode  flags*/
+#define TX_ENTRY_LPI_MODE  0x10
+#define TX_EXIT_LPI_MODE   0x20
+#define RX_ENTRY_LPI_MODE  0x40
+#define RX_EXIT_LPI_MODE   0x80
+
+/* EEE-LPI Interrupt status flag */
+#define LPI_INT_STATUS BIT(5)
+
+/* EEE-LPI Default timer values */
+#define LPI_LINK_STATUS_TIMER  0x3E8
+#define LPI_MAC_WAIT_TIMER 0x00
+
+/* EEE-LPI Control and status definitions */
+#define LPI_CTRL_STATUS_TXABIT(19)
+#define LPI_CTRL_STATUS_PLSDIS BIT(18)
+#define LPI_CTRL_STATUS_PLSBIT(17)
+#define LPI_CTRL_STATUS_LPIEN  BIT(16)
+#define LPI_CTRL_STATUS_TXRSTP BIT(11)
+#define LPI_CTRL_STATUS_RXRSTP BIT(10)
+#define LPI_CTRL_STATUS_RLPIST BIT(9)
+#define LPI_CTRL_STATUS_TLPIST BIT(8)
+#define LPI_CTRL_STATUS_RLPIEX BIT(3)
+#define LPI_CTRL_STATUS_RLPIEN BIT(2)
+#define LPI_CTRL_STATUS_TLPIEX BIT(1)
+#define LPI_CTRL_STATUS_TLPIEN BIT(0)
+
 enum dma_irq_status {
tx_hard_error   = BIT(0),
tx_bump_tc  = BIT(1),
@@ -199,6 +226,13 @@ struct sxgbe_extra_stats {
unsigned long rx_buffer_access_err;
unsigned long rx_data_transfer_err;
 
+   /* EEE-LPI stats */
+   unsigned long tx_lpi_entry_n;
+   unsigned long tx_lpi_exit_n;
+   unsigned long rx_lpi_entry_n;
+   unsigned long rx_lpi_exit_n;
+   unsigned long eee_wakeup_error_n;
+
/* RX specific */
/* L2 error */
unsigned long rx_code_gmii_err;
@@ -296,6 +330,13 @@ struct sxgbe_core_ops {
   unsigned char feature_index);
/* adjust SXGBE speed */
void (*set_speed)(void __iomem *ioaddr, unsigned char speed);
+
+   /* EEE-LPI specific operations */
+   void (*set_eee_mode)(void __iomem *ioaddr);
+   void (*reset_eee_mode)(void __iomem *ioaddr);
+   void (*set_eee_timer)(void __iomem *ioaddr, const int ls,
+ const int tw);
+   void (*set_eee_pls)(void __iomem *ioaddr, const int link);
 };
 
 const struct sxgbe_core_ops *sxgbe_get_core_ops(void);
@@ -351,6 +392,8 @@ struct sxgbe_hw_features {
/* IEEE 1588-2008 */
unsigned int atime_stamp;
 
+   unsigned int eee;
+
unsigned int tx_csum_offload;
unsigned int rx_csum_offload;
unsigned int multi_macaddr;
@@ -434,6 +477,13 @@ struct sxgbe_priv_data {
/* tc control */
int tx_tc;
int rx_tc;
+   /* EEE-LPI specific members */
+   struct timer_list eee_ctrl_timer;
+   bool tx_path_in_lpi_mode;
+   int lpi_irq;
+   int eee_enabled;
+   int eee_active;
+   int tx_lpi_timer;
 };
 
 /* Function prototypes */
@@ -456,4 +506,7 @@ int sxgbe_restore(struct net_device *ndev);
 
 const struct sxgbe_mtl_ops *sxgbe_get_mtl_ops(void);
 
+void sxgbe_disable_eee_mode(struct sxgbe_priv_data * const priv);
+bool sxgbe_eee_init(struct sxgbe_priv_data * const priv);
+
 #endif /* __SXGBE_COMMON_H__ */
diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_core.c 
b/drivers/net/ethernet/samsung/sxgbe/sxgbe_core.c
index 17eea58..bf93b16 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_core.c
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_core.c
@@ -47,11 +47,38 @@ static void sxgbe_core_dump_regs(void __iomem *ioaddr)
 {
 }
 
+static int sxgbe_get_lpi_status(void __iomem *ioaddr, const u32 irq_status)
+{
+   int status = 0;
+   int lpi_status;
+
+   /* Reading this register shall clear all the LPI status bits */
+   lpi_status = readl(ioaddr + SXGBE_CORE_LPI_CTRL_STATUS);
+
+   if (lpi_status & LPI_CTRL_STATUS_TLPIEN)
+   status |= TX_ENTRY_LPI_MODE;
+   if (lpi_status & LPI_CTRL_STATUS_TLPIEX)
+   status |= TX_EXIT_LPI_MODE;
+   if (lpi_status & LPI_CTRL_STATUS_RLPIEN)
+   status |= RX_ENTRY_LPI_MODE;
+   if (lpi_status & LPI_CTRL_STATUS_RLPIEX)
+   status |= RX_EXIT_LPI_MODE;
+
+   return status;
+}
+
 /* Handle extra ev

[PATCH V6 3/8] net: sxgbe: add TSO support for Samsung sxgbe

2014-03-18 Thread Byungho An
From: Vipul Pandya 

Enable TSO during initialization for each DMA channels

Signed-off-by: Vipul Pandya 
Neatening-by: Joe Perches 
Signed-off-by: Byungho An 
---
 drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.h |   17 +++--
 drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.c  |   10 +++
 drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.h  |2 +
 drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c |   75 ---
 4 files changed, 91 insertions(+), 13 deletions(-)

diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.h 
b/drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.h
index 41844d4..547edf3 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.h
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.h
@@ -167,8 +167,9 @@ struct sxgbe_desc_ops {
void (*init_tx_desc)(struct sxgbe_tx_norm_desc *p);
 
/* Invoked by the xmit function to prepare the tx descriptor */
-   void (*tx_enable_tse)(struct sxgbe_tx_norm_desc *p, u8 is_tse,
-   u32 hdr_len, u32 payload_len);
+   void (*tx_desc_enable_tse)(struct sxgbe_tx_norm_desc *p, u8 is_tse,
+  u32 total_hdr_len, u32 tcp_hdr_len,
+  u32 tcp_payload_len);
 
/* Assign buffer lengths for descriptor */
void (*prepare_tx_desc)(struct sxgbe_tx_norm_desc *p, u8 is_fd,
@@ -207,20 +208,26 @@ struct sxgbe_desc_ops {
int (*get_tx_timestamp_status)(struct sxgbe_tx_norm_desc *p);
 
/* TX Context Descripto Specific */
-   void (*init_tx_ctxt_desc)(struct sxgbe_tx_ctxt_desc *p);
+   void (*tx_ctxt_desc_set_ctxt)(struct sxgbe_tx_ctxt_desc *p);
 
/* Set the owner of the TX context descriptor */
-   void (*set_tx_ctxt_owner)(struct sxgbe_tx_ctxt_desc *p);
+   void (*tx_ctxt_desc_set_owner)(struct sxgbe_tx_ctxt_desc *p);
 
/* Get the owner of the TX context descriptor */
int (*get_tx_ctxt_owner)(struct sxgbe_tx_ctxt_desc *p);
 
/* Set TX mss */
-   void (*tx_ctxt_desc_setmss)(struct sxgbe_tx_ctxt_desc *p, int mss);
+   void (*tx_ctxt_desc_set_mss)(struct sxgbe_tx_ctxt_desc *p, u16 mss);
 
/* Set TX mss */
int (*tx_ctxt_desc_get_mss)(struct sxgbe_tx_ctxt_desc *p);
 
+   /* Set TX tcmssv */
+   void (*tx_ctxt_desc_set_tcmssv)(struct sxgbe_tx_ctxt_desc *p);
+
+   /* Reset TX ostc */
+   void (*tx_ctxt_desc_reset_ostc)(struct sxgbe_tx_ctxt_desc *p);
+
/* Set IVLAN information */
void (*tx_ctxt_desc_set_ivlantag)(struct sxgbe_tx_ctxt_desc *p,
  int is_ivlanvalid, int ivlan_tag,
diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.c 
b/drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.c
index 1e68ef3..1edc451 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.c
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.c
@@ -354,6 +354,15 @@ static void sxgbe_dma_rx_watchdog(void __iomem *ioaddr, 
u32 riwt)
}
 }
 
+static void sxgbe_enable_tso(void __iomem *ioaddr, u8 chan_num)
+{
+   u32 ctrl;
+
+   ctrl = readl(ioaddr + SXGBE_DMA_CHA_TXCTL_REG(chan_num));
+   ctrl |= SXGBE_DMA_CHA_TXCTL_TSE_ENABLE;
+   writel(ctrl, ioaddr + SXGBE_DMA_CHA_TXCTL_REG(chan_num));
+}
+
 static const struct sxgbe_dma_ops sxgbe_dma_ops = {
.init = sxgbe_dma_init,
.cha_init = sxgbe_dma_channel_init,
@@ -369,6 +378,7 @@ static const struct sxgbe_dma_ops sxgbe_dma_ops = {
.tx_dma_int_status = sxgbe_tx_dma_int_status,
.rx_dma_int_status = sxgbe_rx_dma_int_status,
.rx_watchdog = sxgbe_dma_rx_watchdog,
+   .enable_tso = sxgbe_enable_tso,
 };
 
 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 50c8054..6c070ac 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.h
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.h
@@ -42,6 +42,8 @@ struct sxgbe_dma_ops {
 struct sxgbe_extra_stats *x);
/* Program the HW RX Watchdog */
void (*rx_watchdog)(void __iomem *ioaddr, u32 riwt);
+   /* Enable TSO for each DMA channel */
+   void (*enable_tso)(void __iomem *ioaddr, u8 chan_num);
 };
 
 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 1714fd7..84475fa 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c
@@ -1099,6 +1099,28 @@ static int sxgbe_release(struct net_device *dev)
return 0;
 }
 
+/* Prepare first Tx descriptor for doing TSO operation */
+void sxgbe_tso_prepare(struct sxgbe_priv_data *priv,
+  struct sxgbe_tx_norm_desc *first_desc,
+  struct sk_buff *skb)
+{
+   unsigned int total_hdr_len, tcp_hdr_len;
+
+   /* Write first Tx descriptor

[PATCH V6 8/8] MAINTAINERS: add maintainer for Samsung sxgbe driver

2014-03-18 Thread Byungho An
From: Byungho An 

Signed-off-by: Byungho An 
---
 MAINTAINERS |9 +
 1 file changed, 9 insertions(+)

diff --git a/MAINTAINERS b/MAINTAINERS
index b7befe7..aeb81f2 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -7536,6 +7536,15 @@ S:   Supported
 L: linux-samsung-soc@vger.kernel.org (moderated for non-subscribers)
 F: drivers/clk/samsung/
 
+SAMSUNG SXGBE DRIVERS
+M: Byungho An 
+M: Girish K S 
+M: Siva Reddy Kallam 
+M: Vipul Pandya 
+S: Supported
+L: net...@vger.kernel.org
+F: drivers/net/ethernet/samsung/sxgbe/
+
 SERIAL DRIVERS
 M: Greg Kroah-Hartman 
 L: linux-ser...@vger.kernel.org
-- 
1.7.10.4


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


[PATCH V6 0/8] add new Samsung SXGBE driver

2014-03-18 Thread Byungho An
Hi all,

This is 6th posting for SAMSUNG SXGBE driver.

Changes since v1:
- changed name of driver to SXGbE as per Ben's comment
- squashed Joe's neatening for many stuff in original patches

Changes since v2:
- updated and split binding document as per Mark's comment
- clean up codes as per Joe's comment
- removed unused fields and clean up codes as per Francois's comment
- removed module parameters as per Dave's comment
- moved driver directory to samsung/sxgbe/

Changes since v3:
- fixed Missing a blank line after declarations as per Dave's comment
- clean up codes as per Joe's comment
- removed reference of net_device.{irq, base_addr}

Changes since v4:
- updated binding document and DT related function as per Mark's comment

Changes since v5:
- updated binding document and DT related function as per Florian's comment
- fixed typo and shortened code as per Joe's comment

Byungho An (1):
  MAINTAINERS: add maintainer for Samsung sxgbe driver

Girish K S (2):
  net: sxgbe: add EEE(Energy Efficient Ethernet) for Samsung sxgbe
  net: sxgbe: add WOL(Wakeup-On-Lan)support for Samsung sxgbe

Siva Reddy (2):
  sxgbe: Add device-tree binding support document
  net: sxgbe: add basic framework for Samsung 10Gb ethernet driver

Vipul Pandya (3):
  net: sxgbe: add TSO support for Samsung sxgbe
  net: sxgbe: add Checksum offload support for Samsung sxgbe
  net: sxgbe: add ethtool related functions support Samsung sxgbe

 .../devicetree/bindings/net/samsung-sxgbe.txt  |   58 +
 MAINTAINERS|9 +
 drivers/net/ethernet/Kconfig   |1 +
 drivers/net/ethernet/Makefile  |1 +
 drivers/net/ethernet/samsung/Kconfig   |   20 +
 drivers/net/ethernet/samsung/Makefile  |5 +
 drivers/net/ethernet/samsung/sxgbe/Kconfig |9 +
 drivers/net/ethernet/samsung/sxgbe/Makefile|4 +
 drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h  |  553 +
 drivers/net/ethernet/samsung/sxgbe/sxgbe_core.c|  290 +++
 drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.c|  515 +
 drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.h|  298 +++
 drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.c |  387 
 drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.h |   51 +
 drivers/net/ethernet/samsung/sxgbe/sxgbe_ethtool.c |  634 ++
 drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c| 2378 
 drivers/net/ethernet/samsung/sxgbe/sxgbe_mdio.c|  271 +++
 drivers/net/ethernet/samsung/sxgbe/sxgbe_mtl.c |  293 +++
 drivers/net/ethernet/samsung/sxgbe/sxgbe_mtl.h |  108 +
 .../net/ethernet/samsung/sxgbe/sxgbe_platform.c|  266 +++
 drivers/net/ethernet/samsung/sxgbe/sxgbe_reg.h |  491 
 drivers/net/ethernet/samsung/sxgbe/sxgbe_xpcs.c|   92 +
 drivers/net/ethernet/samsung/sxgbe/sxgbe_xpcs.h|   38 +
 include/linux/sxgbe_platform.h |   54 +
 24 files changed, 6826 insertions(+)

Thanks,
Byungho An

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


RE: [PATCH V5 2/8] net: sxgbe: add basic framework for Samsung 10Gb ethernet driver

2014-03-18 Thread Byungho An
Florian Fainelli   wrote :
> 2014-03-18 15:16 GMT-07:00 Byungho An :
> > Florian Fainelli  wrote:
> >> 2014-03-18 11:19 GMT-07:00 Byungho An :
> >> > From: Siva Reddy 
> >> >
> >> > This patch adds support for Samsung 10Gb ethernet driver(sxgbe).
> >> >
> >> > - sxgbe core initialization
> >> > - Tx and Rx support
> >> > - MDIO support
> >> > - ISRs for Tx and Rx
> >> > - ifconfig support to driver
> >>
> >> Too many files to review at once, the diffstat was around 5000+ lines!
> >> You should split this into logical parts, or just submit the basic
> >> bits for now and add the features later.
> > Yes. but I think it is one logically, after this patch there won't be much 
> > code at once.
> 
> Since you are adding multiple objects to the Makefile at once, you could very 
> well split the patches to reflect that and submit one
> object as a separate patch. Also, sometimes, even if the driver is feature 
> complete, it helps submitting the basic support first, and
> then start adding new features to it progressively.
But it is basic framework itself.
Since this #2 patch contains changes that are required for its basic 
functionality, it is not easy to split.

> 
> >
> >>
> >> [snip]
> >>
> >> > +   ret = register_netdev(ndev);
> >> > +   if (ret) {
> >> > +   pr_err("%s: ERROR %i registering the device\n", 
> >> > __func__, ret);
> >> > +   goto error_netdev_register;
> >> > +   }
> >> > +
> >> > +   priv->sxgbe_clk = clk_get(priv->device, SXGBE_RESOURCE_NAME);
> >> > +   if (IS_ERR(priv->sxgbe_clk)) {
> >> > +   netdev_warn(ndev, "%s: warning: cannot get CSR clock\n",
> >> > +   __func__);
> >> > +   goto error_clk_get;
> >> > +   }
> >>
> >> This is racy, after register_netdev() is called, the network stack is
> >> free to use the interface, which means that as much as possible needs
> >> to be initialized before you call it, including clocks, and MDIO.
> >>
> >> > +
> >> > +   /* If a specific clk_csr value is passed from the platform
> >> > +* this means that the CSR Clock Range selection cannot be
> >> > +* changed at run-time and it is fixed. Viceversa the driver'll 
> >> > try to
> >> > +* set the MDC clock dynamically according to the csr actual
> >> > +* clock input.
> >> > +*/
> >> > +   if (!priv->plat->clk_csr)
> >> > +   sxgbe_clk_csr_set(priv);
> >> > +   else
> >> > +   priv->clk_csr = priv->plat->clk_csr;
> >> > +
> >> > +   /* MDIO bus Registration */
> >> > +   ret = sxgbe_mdio_register(ndev);
> >> > +   if (ret < 0) {
> >> > +   netdev_dbg(ndev, "%s: MDIO bus (id: %d) registration 
> >> > failed\n",
> >> > +  __func__, priv->plat->bus_id);
> >> > +   goto error_mdio_register;
> >> > +   }
> >>
> >> Don't do this, register your MDIO bus before calling register_netdev().
> > OK.
> >
> >>
> >> > +
> >> > +   sxgbe_check_ether_addr(priv);
> >> > +
> >> > +   return priv;
> >> > +
> >> > +error_mdio_register:
> >> > +   clk_put(priv->sxgbe_clk);
> >> > +error_clk_get:
> >> > +   unregister_netdev(ndev);
> >> > +error_netdev_register:
> >> > +   netif_napi_del(&priv->napi);
> >> > +error_free_netdev:
> >> > +   free_netdev(ndev);
> >> > +
> >> > +   return NULL;
> >> > +}
> >> > +
> >> > +/**
> >> > + * sxgbe_dvr_remove
> >> > + * @ndev: net device pointer
> >> > + * Description: this function resets the TX/RX processes, disables
> >> > +the MAC RX/TX
> >> > + * changes the link status, releases the DMA descriptor rings.
> >> > + */
> >> > +int sxgbe_dvr_remove(struct net_device *ndev) {
> >> > +   struct sxgbe_priv_data *priv = netdev_priv(ndev);
> >> > +
> >> > +   netdev_info(ndev

  1   2   >