[PATCH net-next 1/2] net: gve: convert strlcpy to strscpy

2021-03-25 Thread Daode Huang
Usage of strlcpy in linux kernel has been recently deprecated[1], so
convert gve driver to strscpy

[1] https://lore.kernel.org/lkml/CAHk-=wgfRnXz0W3D37d01q3JFkr_i_uTL
=v6a6g1ouzcprm...@mail.gmail.com/

Signed-off-by: Daode Huang 
---
 drivers/net/ethernet/google/gve/gve_ethtool.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/drivers/net/ethernet/google/gve/gve_ethtool.c 
b/drivers/net/ethernet/google/gve/gve_ethtool.c
index 0901fa6..e40e052 100644
--- a/drivers/net/ethernet/google/gve/gve_ethtool.c
+++ b/drivers/net/ethernet/google/gve/gve_ethtool.c
@@ -14,9 +14,9 @@ static void gve_get_drvinfo(struct net_device *netdev,
 {
struct gve_priv *priv = netdev_priv(netdev);
 
-   strlcpy(info->driver, "gve", sizeof(info->driver));
-   strlcpy(info->version, gve_version_str, sizeof(info->version));
-   strlcpy(info->bus_info, pci_name(priv->pdev), sizeof(info->bus_info));
+   strscpy(info->driver, "gve", sizeof(info->driver));
+   strscpy(info->version, gve_version_str, sizeof(info->version));
+   strscpy(info->bus_info, pci_name(priv->pdev), sizeof(info->bus_info));
 }
 
 static void gve_set_msglevel(struct net_device *netdev, u32 value)
-- 
2.8.1



[PATCH net-next 2/2] net: gve: remove duplicated allowed

2021-03-25 Thread Daode Huang
fix the WARNING of Possible repeated word: 'allowed'

Signed-off-by: Daode Huang 
---
 drivers/net/ethernet/google/gve/gve_ethtool.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/net/ethernet/google/gve/gve_ethtool.c 
b/drivers/net/ethernet/google/gve/gve_ethtool.c
index e40e052..5fb05cf 100644
--- a/drivers/net/ethernet/google/gve/gve_ethtool.c
+++ b/drivers/net/ethernet/google/gve/gve_ethtool.c
@@ -388,7 +388,7 @@ static int gve_set_channels(struct net_device *netdev,
 
gve_get_channels(netdev, &old_settings);
 
-   /* Changing combined is not allowed allowed */
+   /* Changing combined is not allowed */
if (cmd->combined_count != old_settings.combined_count)
return -EINVAL;
 
-- 
2.8.1



[PATCH net-next 0/2] net: gve: make cleanup for gve

2021-03-25 Thread Daode Huang
This patch set replace deprecated strlcpy by strscpy, remove
repeat word "allowed" in gve driver.
for more details, please refer to each patch.

Daode Huang (2):
  net: gve: convert strlcpy to strscpy
  net: gve: remove duplicated allowed

 drivers/net/ethernet/google/gve/gve_ethtool.c | 8 
 1 file changed, 4 insertions(+), 4 deletions(-)

-- 
2.8.1



[PATCH net-next 0/4] net: hinic; make some cleanup for hinic

2021-03-18 Thread Daode Huang
This set try to remove the unnecessary output message, add a blank line,
remove the dupliate word and change the deprecated strlcp functions in
hinic driver, for details, please refer to each patch.

Daode Huang (4):
  net: hinic: Remove unnecessary 'out of memory' message
  net: hinic: add a blank line after declarations
  net: hinic: remove the repeat word "the" in comment.
  net: hinic: convert strlcpy to strscpy

 drivers/net/ethernet/huawei/hinic/hinic_ethtool.c| 4 ++--
 drivers/net/ethernet/huawei/hinic/hinic_hw_api_cmd.c | 8 ++--
 drivers/net/ethernet/huawei/hinic/hinic_hw_if.c  | 2 +-
 drivers/net/ethernet/huawei/hinic/hinic_hw_mgmt.c| 5 +
 drivers/net/ethernet/huawei/hinic/hinic_hw_qp.c  | 1 -
 drivers/net/ethernet/huawei/hinic/hinic_rx.c | 8 ++--
 drivers/net/ethernet/huawei/hinic/hinic_tx.c | 1 +
 7 files changed, 9 insertions(+), 20 deletions(-)

-- 
2.8.1



[PATCH net-next 1/4] net: hinic: Remove unnecessary 'out of memory' message

2021-03-18 Thread Daode Huang
This patch removes unnecessary out of memory message in hinic driver,
fixes the following checkpatch.pl warning:
"WARNING: Possible unnecessary 'out of memory' message"

Signed-off-by: Daode Huang 
---
 drivers/net/ethernet/huawei/hinic/hinic_hw_api_cmd.c | 8 ++--
 drivers/net/ethernet/huawei/hinic/hinic_hw_mgmt.c| 5 +
 drivers/net/ethernet/huawei/hinic/hinic_hw_qp.c  | 1 -
 drivers/net/ethernet/huawei/hinic/hinic_rx.c | 8 ++--
 4 files changed, 5 insertions(+), 17 deletions(-)

diff --git a/drivers/net/ethernet/huawei/hinic/hinic_hw_api_cmd.c 
b/drivers/net/ethernet/huawei/hinic/hinic_hw_api_cmd.c
index 4e4029d..0658617 100644
--- a/drivers/net/ethernet/huawei/hinic/hinic_hw_api_cmd.c
+++ b/drivers/net/ethernet/huawei/hinic/hinic_hw_api_cmd.c
@@ -629,10 +629,8 @@ static int alloc_cmd_buf(struct hinic_api_cmd_chain *chain,
 
cmd_vaddr = dma_alloc_coherent(&pdev->dev, API_CMD_BUF_SIZE,
   &cmd_paddr, GFP_KERNEL);
-   if (!cmd_vaddr) {
-   dev_err(&pdev->dev, "Failed to allocate API CMD DMA memory\n");
+   if (!cmd_vaddr)
return -ENOMEM;
-   }
 
cell_ctxt = &chain->cell_ctxt[cell_idx];
 
@@ -679,10 +677,8 @@ static int api_cmd_create_cell(struct hinic_api_cmd_chain 
*chain,
 
node = dma_alloc_coherent(&pdev->dev, chain->cell_size, &node_paddr,
  GFP_KERNEL);
-   if (!node) {
-   dev_err(&pdev->dev, "Failed to allocate dma API CMD cell\n");
+   if (!node)
return -ENOMEM;
-   }
 
node->read.hw_wb_resp_paddr = 0;
 
diff --git a/drivers/net/ethernet/huawei/hinic/hinic_hw_mgmt.c 
b/drivers/net/ethernet/huawei/hinic/hinic_hw_mgmt.c
index 819fa13..6b9b94a 100644
--- a/drivers/net/ethernet/huawei/hinic/hinic_hw_mgmt.c
+++ b/drivers/net/ethernet/huawei/hinic/hinic_hw_mgmt.c
@@ -443,15 +443,12 @@ static void mgmt_recv_msg_handler(struct hinic_pf_to_mgmt 
*pf_to_mgmt,
struct pci_dev *pdev = pf_to_mgmt->hwif->pdev;
 
mgmt_work = kzalloc(sizeof(*mgmt_work), GFP_KERNEL);
-   if (!mgmt_work) {
-   dev_err(&pdev->dev, "Allocate mgmt work memory failed\n");
+   if (!mgmt_work)
return;
-   }
 
if (recv_msg->msg_len) {
mgmt_work->msg = kzalloc(recv_msg->msg_len, GFP_KERNEL);
if (!mgmt_work->msg) {
-   dev_err(&pdev->dev, "Allocate mgmt msg memory 
failed\n");
kfree(mgmt_work);
return;
}
diff --git a/drivers/net/ethernet/huawei/hinic/hinic_hw_qp.c 
b/drivers/net/ethernet/huawei/hinic/hinic_hw_qp.c
index fcf7bfe..dcba4d0 100644
--- a/drivers/net/ethernet/huawei/hinic/hinic_hw_qp.c
+++ b/drivers/net/ethernet/huawei/hinic/hinic_hw_qp.c
@@ -414,7 +414,6 @@ int hinic_init_rq(struct hinic_rq *rq, struct hinic_hwif 
*hwif,
rq->pi_virt_addr = dma_alloc_coherent(&pdev->dev, pi_size,
  &rq->pi_dma_addr, GFP_KERNEL);
if (!rq->pi_virt_addr) {
-   dev_err(&pdev->dev, "Failed to allocate PI address\n");
err = -ENOMEM;
goto err_pi_virt;
}
diff --git a/drivers/net/ethernet/huawei/hinic/hinic_rx.c 
b/drivers/net/ethernet/huawei/hinic/hinic_rx.c
index 070a7cc..cce0864 100644
--- a/drivers/net/ethernet/huawei/hinic/hinic_rx.c
+++ b/drivers/net/ethernet/huawei/hinic/hinic_rx.c
@@ -137,10 +137,8 @@ static struct sk_buff *rx_alloc_skb(struct hinic_rxq *rxq,
int err;
 
skb = netdev_alloc_skb_ip_align(rxq->netdev, rxq->rq->buf_sz);
-   if (!skb) {
-   netdev_err(rxq->netdev, "Failed to allocate Rx SKB\n");
+   if (!skb)
return NULL;
-   }
 
addr = dma_map_single(&pdev->dev, skb->data, rxq->rq->buf_sz,
  DMA_FROM_DEVICE);
@@ -212,10 +210,8 @@ static int rx_alloc_pkts(struct hinic_rxq *rxq)
 
for (i = 0; i < free_wqebbs; i++) {
skb = rx_alloc_skb(rxq, &dma_addr);
-   if (!skb) {
-   netdev_err(rxq->netdev, "Failed to alloc Rx skb\n");
+   if (!skb)
goto skb_out;
-   }
 
hinic_set_sge(&sge, dma_addr, skb->len);
 
-- 
2.8.1



[PATCH net-next 3/4] net: hinic: remove the repeat word "the" in comment.

2021-03-18 Thread Daode Huang
There is a duplicate "the" in the comment, so delete it.

Signed-off-by: Daode Huang 
---
 drivers/net/ethernet/huawei/hinic/hinic_hw_if.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/net/ethernet/huawei/hinic/hinic_hw_if.c 
b/drivers/net/ethernet/huawei/hinic/hinic_hw_if.c
index efbaed3..cab38ff 100644
--- a/drivers/net/ethernet/huawei/hinic/hinic_hw_if.c
+++ b/drivers/net/ethernet/huawei/hinic/hinic_hw_if.c
@@ -334,7 +334,7 @@ static void set_dma_attr(struct hinic_hwif *hwif, u32 
entry_idx,
 }
 
 /**
- * dma_attr_table_init - initialize the the default dma attributes
+ * dma_attr_table_init - initialize the default dma attributes
  * @hwif: the HW interface of a pci function device
  **/
 static void dma_attr_init(struct hinic_hwif *hwif)
-- 
2.8.1



[PATCH net-next 4/4] net: hinic: convert strlcpy to strscpy

2021-03-18 Thread Daode Huang
Usage of strlcpy in linux kernel has been recently
deprecated[1], so convert hinic driver to strscpy

[1] https://lore.kernel.org/lkml/CAHk-=wgfRnXz0W3D37d01q3JFkr_i_uTL
=v6a6g1ouzcprm...@mail.gmail.com/

Signed-off-by: Daode Huang 
---
 drivers/net/ethernet/huawei/hinic/hinic_ethtool.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/net/ethernet/huawei/hinic/hinic_ethtool.c 
b/drivers/net/ethernet/huawei/hinic/hinic_ethtool.c
index c340d9a..c7848c3 100644
--- a/drivers/net/ethernet/huawei/hinic/hinic_ethtool.c
+++ b/drivers/net/ethernet/huawei/hinic/hinic_ethtool.c
@@ -543,8 +543,8 @@ static void hinic_get_drvinfo(struct net_device *netdev,
struct hinic_hwif *hwif = hwdev->hwif;
int err;
 
-   strlcpy(info->driver, HINIC_DRV_NAME, sizeof(info->driver));
-   strlcpy(info->bus_info, pci_name(hwif->pdev), sizeof(info->bus_info));
+   strscpy(info->driver, HINIC_DRV_NAME, sizeof(info->driver));
+   strscpy(info->bus_info, pci_name(hwif->pdev), sizeof(info->bus_info));
 
err = hinic_get_mgmt_version(nic_dev, mgmt_ver);
if (err)
-- 
2.8.1



[PATCH net-next 2/4] net: hinic: add a blank line after declarations

2021-03-18 Thread Daode Huang
There should be a blank line after declarations, so just add it.

Signed-off-by: Daode Huang 
---
 drivers/net/ethernet/huawei/hinic/hinic_tx.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/drivers/net/ethernet/huawei/hinic/hinic_tx.c 
b/drivers/net/ethernet/huawei/hinic/hinic_tx.c
index 8da7d46..710c4ff 100644
--- a/drivers/net/ethernet/huawei/hinic/hinic_tx.c
+++ b/drivers/net/ethernet/huawei/hinic/hinic_tx.c
@@ -377,6 +377,7 @@ static int offload_csum(struct hinic_sq_task *task, u32 
*queue_info,
} else if (ip.v4->version == 6) {
unsigned char *exthdr;
__be16 frag_off;
+
l3_type = IPV6_PKT;
tunnel_type = TUNNEL_UDP_CSUM;
exthdr = ip.hdr + sizeof(*ip.v6);
-- 
2.8.1



Re: [PATCH v2 net-next 1/9] MAINTAINERS: add maintainers for hns driver

2016-06-30 Thread Daode Huang



On 2016/6/30 18:48, Joe Perches wrote:

On Thu, 2016-06-30 at 15:25 +0800, Yisen Zhuang wrote:

From: Daode Huang 

This patch adds maintainers for hisilicon network subsystem driver

[]

diff --git a/MAINTAINERS b/MAINTAINERS

[]

@@ -5421,6 +5421,15 @@ F:   include/uapi/linux/if_hippi.h
  F:net/802/hippi.c
  F:drivers/net/hippi/
  
+HISILICON NETWORK SUBSYSTEM DRIVER

+M: Yisen Zhuang 
+M: Salil Mehta 
+L: netdev@vger.kernel.org
+W: http://www.hisilicon.com
+S: Maintained
+F: drivers/net/ethernet/hisilicon/*

>From MAINTAINERS:

F: Files and directories with wildcard patterns.
   A trailing slash includes all files and subdirectory files.
   F:   drivers/net/all files in and below drivers/net
   F:   drivers/net/*   all files in drivers/net, but not below
   F:   */net/* all files in "any top level directory"/net
   One pattern per line.  Multiple F: lines acceptable.

So this pattern with the trailing /* matches only:

drivers/net/ethernet/hisilicon/Kconfig
drivers/net/ethernet/hisilicon/Makefile
drivers/net/ethernet/hisilicon/hip04_eth.c
drivers/net/ethernet/hisilicon/hix5hd2_gmac.c

and not any file in drivers/net/ethernet/hisilicon/hns/

Is that what you want?


We will maintain all files in hisilicon and any directory below it.
will fix it in next submit.

Thanks


using

F:  drivers/net/ethernet/hisilicon/

matches all files in hisilicon and any directory below it.



.






Re: [PATCH net-next 6/9] net: hns: normalize two different loop

2016-06-27 Thread Daode Huang



On 2016/6/27 20:13, Andy Shevchenko wrote:

On Mon, 2016-06-27 at 05:08 -0700, Joe Perches wrote:

On Mon, 2016-06-27 at 15:00 +0300, Andy Shevchenko wrote:

On Mon, 2016-06-27 at 04:49 -0700, Joe Perches wrote:

On Mon, 2016-06-27 at 17:54 +0800, Yisen Zhuang wrote:

From: Daode Huang 

There are two approaches to assign data, one does 2 loops,
another
does 1 loop. This patch normalize the different methods to 1
loop.

[]

diff --git a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c
b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c

[]

@@ -2567,15 +2567,15 @@ static char
*hns_dsaf_get_node_stats_strings(char *data, int node,
buff += ETH_GSTRING_LEN;
if (node < DSAF_SERVICE_NW_NUM && !is_ver1) {
for (i = 0; i < DSAF_PRIO_NR; i++) {
-   snprintf(buff, ETH_GSTRING_LEN,
-"inod%d_pfc_prio%d_pkts",
node,
i);
-   buff += ETH_GSTRING_LEN;
-   }
-   for (i = 0; i < DSAF_PRIO_NR; i++) {
-   snprintf(buff, ETH_GSTRING_LEN,
-"onod%d_pfc_prio%d_pkts",
node,
i);
+   snprintf(buff + 0 * ETH_GSTRING_LEN *
DSAF_PRIO_NR,
+ETH_GSTRING_LEN,
"inod%d_pfc_prio%d_pkts",
+node, i);
+   snprintf(buff + 1 * ETH_GSTRING_LEN *
DSAF_PRIO_NR,
+ETH_GSTRING_LEN,
"onod%d_pfc_prio%d_pkts",
+node, i);
buff += ETH_GSTRING_LEN;

This looks odd and likely incorrect.

Why? the idea is to print stats for Rx and Tx at once.

I hope it was tested.

It changes the order of the strings in buff.

I don't see how.

Hi Andy,
The patch has been tested when sent out.


Is a bug fix or a style fix?

If it's a bug fix, then it should likely be added
to the stable trees.

I doubt it's a bug fix.


Because the previous patch is accepted in net-next, and this set is
an appendix to the series, in order to avoid merge conflict, we also
send this bug fix to net-next.

thanks.








Re: [PATCH V2 net 0/6] net: hns: hns driver updates

2016-03-14 Thread Daode Huang

hi Dave,

Thanks for your reply, I am so sorry to interrupt your work.
Yes, the patch set should be reviewed by all the other developers.
I should not only ask you to review the patch.

I will resend all these patch after 4.6-rc-1 is released.
Thanks.

Daode.

.

On 2016/3/15 10:45, David Miller wrote:

From: Daode Huang 
Date: Tue, 15 Mar 2016 09:56:02 +0800


Could you please help me to review this patch set?

I am not reviewing anything until you guys sort out your submission
scheme, and resend these fresh using that central maintainer.

I am also not the only person in the world who is supposed to review
all of this stuff, other developers need to help with the review
process as well.

So it is never appropriate to ask me, and only me, to review your
work.

Thanks.

.






Re: [PATCH V2 net 0/6] net: hns: hns driver updates

2016-03-14 Thread Daode Huang

Hi Dave,

Could you please help me to review this patch set?
I am so sorry to send the patches in parallel to you, which increases 
you workload,
So next time we will pay more attention to it,  and learn more about 
kernel patch submitting.

Thanks.

MBR, Daode

On 2016/3/11 17:10, Daode Huang wrote:

Hi Dave,

This patch series are hisilicon network driver bug fix.
please merge them to the net repo.
Thanks

Daode Huang
---
changlog
v2: some minor change according to
 MBR Sergei  in
 [patch 3/6] [patch 4/6].

v1: initial version.

Daode Huang (6):
   net: hns: bug fix about the overflow of mss
   net: hns: fixes the hw interrupt bug in using napi
   net: hns: fixed portid bug in sending manage pkt
   net: hns: adds uc match for debug port
   net: hns: fixed service-ges setting MAC-addr bug
   net: hns: bug fix of getting hilink status

  drivers/net/ethernet/hisilicon/hns/hnae.h  |  3 ++
  drivers/net/ethernet/hisilicon/hns/hns_ae_adapt.c  |  1 +
  drivers/net/ethernet/hisilicon/hns/hns_dsaf_gmac.c | 29 +++
  drivers/net/ethernet/hisilicon/hns/hns_dsaf_misc.c | 41 --
  drivers/net/ethernet/hisilicon/hns/hns_dsaf_reg.h  |  4 +++
  drivers/net/ethernet/hisilicon/hns/hns_enet.c  | 32 +
  6 files changed, 70 insertions(+), 40 deletions(-)






Re: [PATCH net 3/6] net: hns: fixed portid bug in sending manage pkt

2016-03-13 Thread Daode Huang



On 2016/3/11 21:29, Sergei Shtylyov wrote:

Hello.

On 3/11/2016 4:53 AM, Daode Huang wrote:


In V2 chip, when sending mamagement packets, the driver should
config the port id to BD descs.

Signed-off-by: Daode Huang 
Signed-off-by: Lisheng 
---
  drivers/net/ethernet/hisilicon/hns/hnae.h | 3 +++
  drivers/net/ethernet/hisilicon/hns/hns_ae_adapt.c | 1 +
  drivers/net/ethernet/hisilicon/hns/hns_enet.c | 4 
  3 files changed, 8 insertions(+)

diff --git a/drivers/net/ethernet/hisilicon/hns/hnae.h
b/drivers/net/ethernet/hisilicon/hns/hnae.h
index 1cbcb9f..11a3f97 100644
--- a/drivers/net/ethernet/hisilicon/hns/hnae.h
+++ b/drivers/net/ethernet/hisilicon/hns/hnae.h

[...]

@@ -516,6 +518,7 @@ struct hnae_handle {
  int q_num;
  int vf_id;
  u32 eport_id;
+u32 dport_id;/*v2 tx bd should fill the dport_id*/


   Please add spaces after /* and before */ (like it's done in other 
places

in this driver).



Hi MBR, Sergei,


   Just in case: MBR stands for "my best regards", Sergei is my name. :-)

hi Sergei,

So sorry for my misunderstanding.
thanks for your reminding.

Best Regards
Daode.




Daode.


MBR, Sergei


.






[PATCH V2 net 2/6] net: hns: fixes the hw interrupt bug in using napi

2016-03-11 Thread Daode Huang
In V1 chip, common_poll should check and clean fbd pkts, because it
can not pend irq to clean them if there is no new pkt comes in.
But V2 chip hw fixes this bug, and will pend irq itself to do this.
So, for V2 chip, we set ring_data->fini_process to NULL.

Signed-off-by: Daode Huang 
Signed-off-by: Sheng Li 
---
 drivers/net/ethernet/hisilicon/hns/hns_enet.c | 9 +
 1 file changed, 5 insertions(+), 4 deletions(-)

diff --git a/drivers/net/ethernet/hisilicon/hns/hns_enet.c 
b/drivers/net/ethernet/hisilicon/hns/hns_enet.c
index 9d46d57..6250a42 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_enet.c
+++ b/drivers/net/ethernet/hisilicon/hns/hns_enet.c
@@ -946,8 +946,8 @@ static int hns_nic_common_poll(struct napi_struct *napi, 
int budget)
napi_complete(napi);
ring_data->ring->q->handle->dev->ops->toggle_ring_irq(
ring_data->ring, 0);
-
-   ring_data->fini_process(ring_data);
+   if (ring_data->fini_process)
+   ring_data->fini_process(ring_data);
return 0;
}
 
@@ -1710,6 +1710,7 @@ static int hns_nic_init_ring_data(struct hns_nic_priv 
*priv)
 {
struct hnae_handle *h = priv->ae_handle;
struct hns_nic_ring_data *rd;
+   bool is_ver1 = AE_IS_VER1(priv->enet_ver);
int i;
 
if (h->q_num > NIC_MAX_Q_PER_VF) {
@@ -1727,7 +1728,7 @@ static int hns_nic_init_ring_data(struct hns_nic_priv 
*priv)
rd->queue_index = i;
rd->ring = &h->qs[i]->tx_ring;
rd->poll_one = hns_nic_tx_poll_one;
-   rd->fini_process = hns_nic_tx_fini_pro;
+   rd->fini_process = is_ver1 ? hns_nic_tx_fini_pro : NULL;
 
netif_napi_add(priv->netdev, &rd->napi,
   hns_nic_common_poll, NIC_TX_CLEAN_MAX_NUM);
@@ -1739,7 +1740,7 @@ static int hns_nic_init_ring_data(struct hns_nic_priv 
*priv)
rd->ring = &h->qs[i - h->q_num]->rx_ring;
rd->poll_one = hns_nic_rx_poll_one;
rd->ex_process = hns_nic_rx_up_pro;
-   rd->fini_process = hns_nic_rx_fini_pro;
+   rd->fini_process = is_ver1 ? hns_nic_rx_fini_pro : NULL;
 
netif_napi_add(priv->netdev, &rd->napi,
   hns_nic_common_poll, NIC_RX_CLEAN_MAX_NUM);
-- 
1.9.1



[PATCH V2 net 1/6] net: hns: bug fix about the overflow of mss

2016-03-11 Thread Daode Huang
When set MTU to the minimum value 68, there are increasing number
of error packets occur, which is caused by the overflowed value of
mss. This patch fix the bug.

Signed-off-by: Daode Huang 
---
 drivers/net/ethernet/hisilicon/hns/hns_enet.c | 17 -
 1 file changed, 8 insertions(+), 9 deletions(-)

diff --git a/drivers/net/ethernet/hisilicon/hns/hns_enet.c 
b/drivers/net/ethernet/hisilicon/hns/hns_enet.c
index 3f77ff7..9d46d57 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_enet.c
+++ b/drivers/net/ethernet/hisilicon/hns/hns_enet.c
@@ -48,7 +48,6 @@ static void fill_v2_desc(struct hnae_ring *ring, void *priv,
struct iphdr *iphdr;
struct ipv6hdr *ipv6hdr;
struct sk_buff *skb;
-   int skb_tmp_len;
__be16 protocol;
u8 bn_pid = 0;
u8 rrcfv = 0;
@@ -90,13 +89,13 @@ static void fill_v2_desc(struct hnae_ring *ring, void *priv,
hnae_set_bit(rrcfv, HNSV2_TXD_L4CS_B, 1);
 
/* check for tcp/udp header */
-   if (iphdr->protocol == IPPROTO_TCP) {
+   if (iphdr->protocol == IPPROTO_TCP &&
+   skb_is_gso(skb)) {
hnae_set_bit(tvsvsn,
 HNSV2_TXD_TSE_B, 1);
-   skb_tmp_len = SKB_TMP_LEN(skb);
l4_len = tcp_hdrlen(skb);
-   mss = mtu - skb_tmp_len - ETH_FCS_LEN;
-   paylen = skb->len - skb_tmp_len;
+   mss = skb_shinfo(skb)->gso_size;
+   paylen = skb->len - SKB_TMP_LEN(skb);
}
} else if (skb->protocol == htons(ETH_P_IPV6)) {
hnae_set_bit(tvsvsn, HNSV2_TXD_IPV6_B, 1);
@@ -104,13 +103,13 @@ static void fill_v2_desc(struct hnae_ring *ring, void 
*priv,
hnae_set_bit(rrcfv, HNSV2_TXD_L4CS_B, 1);
 
/* check for tcp/udp header */
-   if (ipv6hdr->nexthdr == IPPROTO_TCP) {
+   if (ipv6hdr->nexthdr == IPPROTO_TCP &&
+   skb_is_gso(skb) && skb_is_gso_v6(skb)) {
hnae_set_bit(tvsvsn,
 HNSV2_TXD_TSE_B, 1);
-   skb_tmp_len = SKB_TMP_LEN(skb);
l4_len = tcp_hdrlen(skb);
-   mss = mtu - skb_tmp_len - ETH_FCS_LEN;
-   paylen = skb->len - skb_tmp_len;
+   mss = skb_shinfo(skb)->gso_size;
+   paylen = skb->len - SKB_TMP_LEN(skb);
}
}
desc->tx.ip_offset = ip_offset;
-- 
1.9.1



[PATCH V2 net 0/6] net: hns: hns driver updates

2016-03-11 Thread Daode Huang
Hi Dave,

This patch series are hisilicon network driver bug fix.
please merge them to the net repo.
Thanks

Daode Huang
---
changlog
v2: some minor change according to 
MBR Sergei  in
[patch 3/6] [patch 4/6].

v1: initial version.

Daode Huang (6):
  net: hns: bug fix about the overflow of mss
  net: hns: fixes the hw interrupt bug in using napi
  net: hns: fixed portid bug in sending manage pkt
  net: hns: adds uc match for debug port
  net: hns: fixed service-ges setting MAC-addr bug
  net: hns: bug fix of getting hilink status

 drivers/net/ethernet/hisilicon/hns/hnae.h  |  3 ++
 drivers/net/ethernet/hisilicon/hns/hns_ae_adapt.c  |  1 +
 drivers/net/ethernet/hisilicon/hns/hns_dsaf_gmac.c | 29 +++
 drivers/net/ethernet/hisilicon/hns/hns_dsaf_misc.c | 41 --
 drivers/net/ethernet/hisilicon/hns/hns_dsaf_reg.h  |  4 +++
 drivers/net/ethernet/hisilicon/hns/hns_enet.c  | 32 +
 6 files changed, 70 insertions(+), 40 deletions(-)

-- 
1.9.1



[PATCH V2 net 6/6] net: hns: bug fix of getting hilink status

2016-03-11 Thread Daode Huang
There are some differences in hilink status defination between
v1 and v2 chips.
for v1 chip, all ports connected to the same hilink share the same
hilink status register bit.
but for v2, all ports have separately hilink status register bit. And
the register addr is also changed.
So this patch fixes the bug.

Signed-off-by: Daode Huang 
Signed-off-by: Sheng Li 
---
 drivers/net/ethernet/hisilicon/hns/hns_dsaf_misc.c | 41 --
 drivers/net/ethernet/hisilicon/hns/hns_dsaf_reg.h  |  2 ++
 2 files changed, 24 insertions(+), 19 deletions(-)

diff --git a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_misc.c 
b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_misc.c
index 607c3be..8c32ff6 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_misc.c
+++ b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_misc.c
@@ -240,35 +240,38 @@ void hns_ppe_com_srst(struct ppe_common_cb *ppe_common, 
u32 val)
 /**
  * hns_mac_get_sds_mode - get phy ifterface form serdes mode
  * @mac_cb: mac control block
- * retuen phy interface
+ * return phy interface
  */
 phy_interface_t hns_mac_get_phy_if(struct hns_mac_cb *mac_cb)
 {
-   u32 hilink3_mode;
-   u32 hilink4_mode;
+   u32 reg, mode, shift;
void __iomem *sys_ctl_vaddr = mac_cb->sys_ctl_vaddr;
-   int dev_id = mac_cb->mac_id;
+   int mac_id = mac_cb->mac_id;
phy_interface_t phy_if = PHY_INTERFACE_MODE_NA;
+   bool is_ver1 = AE_IS_VER1(mac_cb->dsaf_dev->dsaf_ver);
 
-   hilink3_mode = dsaf_read_reg(sys_ctl_vaddr, HNS_MAC_HILINK3_REG);
-   hilink4_mode = dsaf_read_reg(sys_ctl_vaddr, HNS_MAC_HILINK4_REG);
-   if (dev_id >= 0 && dev_id <= 3) {
-   if (hilink4_mode == 0)
-   phy_if = PHY_INTERFACE_MODE_SGMII;
-   else
+   /* for hip05 soc, port6,7 only support ge mode */
+   if (is_ver1 && (mac_id >= 6 && mac_id <= 7)) {
+   phy_if = PHY_INTERFACE_MODE_SGMII;
+   } else  if (mac_id >= 0 && mac_id <= 3) {
+   reg = is_ver1 ? HNS_MAC_HILINK4_REG : HNS_MAC_HILINK4V2_REG;
+   mode = dsaf_read_reg(sys_ctl_vaddr, reg);
+   /* mac_id 0, 1, 2, 3 ---> hilink4 lane 0, 1, 2, 3 */
+   shift = is_ver1 ? 0 : mac_id;
+   if (dsaf_get_bit(mode, shift))
phy_if = PHY_INTERFACE_MODE_XGMII;
-   } else if (dev_id >= 4 && dev_id <= 5) {
-   if (hilink3_mode == 0)
-   phy_if = PHY_INTERFACE_MODE_SGMII;
else
+   phy_if = PHY_INTERFACE_MODE_SGMII;
+   } else if (mac_id >= 4 && mac_id <= 7) {
+   reg = is_ver1 ? HNS_MAC_HILINK3_REG : HNS_MAC_HILINK3V2_REG;
+   mode = dsaf_read_reg(sys_ctl_vaddr, reg);
+   /* mac_id 4, 5, 6, 7 ---> hilink3 lane 2, 3, 0, 1 */
+   shift = is_ver1 ? 0 : (mac_id <= 5 ? mac_id - 2 : mac_id - 6);
+   if (dsaf_get_bit(mode, shift))
phy_if = PHY_INTERFACE_MODE_XGMII;
-   } else {
-   phy_if = PHY_INTERFACE_MODE_SGMII;
+   else
+   phy_if = PHY_INTERFACE_MODE_SGMII;
}
-
-   dev_dbg(mac_cb->dev,
-   "hilink3_mode=%d, hilink4_mode=%d dev_id=%d, phy_if=%d\n",
-   hilink3_mode, hilink4_mode, dev_id, phy_if);
return phy_if;
 }
 
diff --git a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_reg.h 
b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_reg.h
index bf62687..e2206f9 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_reg.h
+++ b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_reg.h
@@ -103,6 +103,8 @@
 /*serdes offset**/
 #define HNS_MAC_HILINK3_REG DSAF_SUB_SC_HILINK3_CRG_CTRL0_REG
 #define HNS_MAC_HILINK4_REG DSAF_SUB_SC_HILINK4_CRG_CTRL0_REG
+#define HNS_MAC_HILINK3V2_REG DSAF_SUB_SC_HILINK3_CRG_CTRL1_REG
+#define HNS_MAC_HILINK4V2_REG DSAF_SUB_SC_HILINK4_CRG_CTRL1_REG
 #define HNS_MAC_LANE0_CTLEDFE_REG 0x000BFFCCULL
 #define HNS_MAC_LANE1_CTLEDFE_REG 0x000BFFBCULL
 #define HNS_MAC_LANE2_CTLEDFE_REG 0x000BFFACULL
-- 
1.9.1



[PATCH V2 net 3/6] net: hns: fixed portid bug in sending manage pkt

2016-03-11 Thread Daode Huang
In V2 chip, when sending mamagement packets, the driver should
config the port id to BD descs.

Signed-off-by: Daode Huang 
Signed-off-by: Sheng Li 
---
 v2: add space after /* and before */.
---
drivers/net/ethernet/hisilicon/hns/hnae.h | 3 +++
 drivers/net/ethernet/hisilicon/hns/hns_ae_adapt.c | 1 +
 drivers/net/ethernet/hisilicon/hns/hns_enet.c | 6 +-
 3 files changed, 9 insertions(+), 1 deletion(-)

diff --git a/drivers/net/ethernet/hisilicon/hns/hnae.h 
b/drivers/net/ethernet/hisilicon/hns/hnae.h
index 1cbcb9f..37d0cce 100644
--- a/drivers/net/ethernet/hisilicon/hns/hnae.h
+++ b/drivers/net/ethernet/hisilicon/hns/hnae.h
@@ -147,6 +147,8 @@ enum hnae_led_state {
 
 #define HNSV2_TXD_BUFNUM_S 0
 #define HNSV2_TXD_BUFNUM_M (0x7 << HNSV2_TXD_BUFNUM_S)
+#define HNSV2_TXD_PORTID_S 4
+#define HNSV2_TXD_PORTID_M (0X7 << HNSV2_TXD_PORTID_S)
 #define HNSV2_TXD_RI_B   1
 #define HNSV2_TXD_L4CS_B   2
 #define HNSV2_TXD_L3CS_B   3
@@ -516,6 +518,7 @@ struct hnae_handle {
int q_num;
int vf_id;
u32 eport_id;
+   u32 dport_id;   /* v2 tx bd should fill the dport_id */
enum hnae_port_type port_type;
struct list_head node;/* list to hnae_ae_dev->handle_list */
struct hnae_buf_ops *bops; /* operation for the buffer */
diff --git a/drivers/net/ethernet/hisilicon/hns/hns_ae_adapt.c 
b/drivers/net/ethernet/hisilicon/hns/hns_ae_adapt.c
index d4f92ed..90352d6 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_ae_adapt.c
+++ b/drivers/net/ethernet/hisilicon/hns/hns_ae_adapt.c
@@ -175,6 +175,7 @@ struct hnae_handle *hns_ae_get_handle(struct hnae_ae_dev 
*dev,
ae_handle->phy_node = vf_cb->mac_cb->phy_node;
ae_handle->if_support = vf_cb->mac_cb->if_support;
ae_handle->port_type = vf_cb->mac_cb->mac_type;
+   ae_handle->dport_id = port_idx;
 
return ae_handle;
 vf_id_err:
diff --git a/drivers/net/ethernet/hisilicon/hns/hns_enet.c 
b/drivers/net/ethernet/hisilicon/hns/hns_enet.c
index 6250a42..cb16b50 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_enet.c
+++ b/drivers/net/ethernet/hisilicon/hns/hns_enet.c
@@ -65,10 +65,14 @@ static void fill_v2_desc(struct hnae_ring *ring, void *priv,
desc->addr = cpu_to_le64(dma);
desc->tx.send_size = cpu_to_le16((u16)size);
 
-   /*config bd buffer end */
+   /* config bd buffer end */
hnae_set_bit(rrcfv, HNSV2_TXD_VLD_B, 1);
hnae_set_field(bn_pid, HNSV2_TXD_BUFNUM_M, 0, buf_num - 1);
 
+   /* fill port_id in the tx bd for sending management pkts */
+   hnae_set_field(bn_pid, HNSV2_TXD_PORTID_M,
+  HNSV2_TXD_PORTID_S, ring->q->handle->dport_id);
+
if (type == DESC_TYPE_SKB) {
skb = (struct sk_buff *)priv;
 
-- 
1.9.1



[PATCH V2 net 4/6] net: hns: adds uc match for debug port

2016-03-11 Thread Daode Huang
This patch adds uc match for debug port by:
1)Enables uc match of debug port when initializing gmac
2)Enables uc match of mac address register2

Signed-off-by: Daode Huang 
Signed-off-by: Peng Li 
---
changlog:
v2: fix the SoB name and code sytle according to Sergei .
---
drivers/net/ethernet/hisilicon/hns/hns_dsaf_gmac.c | 18 +-
 drivers/net/ethernet/hisilicon/hns/hns_dsaf_reg.h  |  2 ++
 2 files changed, 19 insertions(+), 1 deletion(-)

diff --git a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_gmac.c 
b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_gmac.c
index b8517b0..2591a51 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_gmac.c
+++ b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_gmac.c
@@ -290,6 +290,16 @@ static int hns_gmac_adjust_link(void *mac_drv, enum 
mac_speed speed,
return 0;
 }
 
+static void hns_gmac_set_uc_match(void *mac_drv, u16 en)
+{
+   struct mac_driver *drv = (struct mac_driver *)mac_drv;
+
+   dsaf_set_dev_bit(drv, GMAC_REC_FILT_CONTROL_REG,
+GMAC_UC_MATCH_EN_B, !en);
+   dsaf_set_dev_bit(drv, GMAC_STATION_ADDR_HIGH_2_REG,
+GMAC_ADDR_EN_B, !en);
+}
+
 static void hns_gmac_init(void *mac_drv)
 {
u32 port;
@@ -305,6 +315,8 @@ static void hns_gmac_init(void *mac_drv)
mdelay(10);
hns_gmac_disable(mac_drv, MAC_COMM_MODE_RX_AND_TX);
hns_gmac_tx_loop_pkt_dis(mac_drv);
+   if (drv->mac_cb->mac_type == HNAE_PORT_DEBUG)
+   hns_gmac_set_uc_match(mac_drv, 0);
 }
 
 void hns_gmac_update_stats(void *mac_drv)
@@ -407,8 +419,12 @@ static void hns_gmac_set_mac_addr(void *mac_drv, char 
*mac_addr)
 
u32 low_val = mac_addr[5] | (mac_addr[4] << 8)
| (mac_addr[3] << 16) | (mac_addr[2] << 24);
+
+   u32 val = dsaf_read_dev(drv, GMAC_STATION_ADDR_HIGH_2_REG);
+   u32 sta_addr_en = dsaf_get_bit(val, GMAC_ADDR_EN_B);
dsaf_write_dev(drv, GMAC_STATION_ADDR_LOW_2_REG, low_val);
-   dsaf_write_dev(drv, GMAC_STATION_ADDR_HIGH_2_REG, high_val);
+   dsaf_write_dev(drv, GMAC_STATION_ADDR_HIGH_2_REG,
+  high_val | (sta_addr_en << GMAC_ADDR_EN_B));
}
 }
 
diff --git a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_reg.h 
b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_reg.h
index 60d695d..bf62687 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_reg.h
+++ b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_reg.h
@@ -922,6 +922,8 @@
 #define GMAC_LP_REG_CF2MI_LP_EN_B  2
 
 #define GMAC_MODE_CHANGE_EB_B  0
+#define GMAC_UC_MATCH_EN_B 0
+#define GMAC_ADDR_EN_B 16
 
 #define GMAC_RECV_CTRL_STRIP_PAD_EN_B  3
 #define GMAC_RECV_CTRL_RUNT_PKT_EN_B   4
-- 
1.9.1



[PATCH V2 net 5/6] net: hns: fixed service-ges setting MAC-addr bug

2016-03-11 Thread Daode Huang
from: Sheng Li 

Service gmacs can not set mac add, this patch will fix the bug.

Signed-off-by: Daode Huang 
Signed-off-by: Sheng Li 
---
 drivers/net/ethernet/hisilicon/hns/hns_dsaf_gmac.c | 19 +--
 1 file changed, 9 insertions(+), 10 deletions(-)

diff --git a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_gmac.c 
b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_gmac.c
index 2591a51..eb86178 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_gmac.c
+++ b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_gmac.c
@@ -414,18 +414,17 @@ static void hns_gmac_set_mac_addr(void *mac_drv, char 
*mac_addr)
 {
struct mac_driver *drv = (struct mac_driver *)mac_drv;
 
-   if (drv->mac_id >= DSAF_SERVICE_NW_NUM) {
-   u32 high_val = mac_addr[1] | (mac_addr[0] << 8);
+   u32 high_val = mac_addr[1] | (mac_addr[0] << 8);
 
-   u32 low_val = mac_addr[5] | (mac_addr[4] << 8)
-   | (mac_addr[3] << 16) | (mac_addr[2] << 24);
+   u32 low_val = mac_addr[5] | (mac_addr[4] << 8)
+   | (mac_addr[3] << 16) | (mac_addr[2] << 24);
 
-   u32 val = dsaf_read_dev(drv, GMAC_STATION_ADDR_HIGH_2_REG);
-   u32 sta_addr_en = dsaf_get_bit(val, GMAC_ADDR_EN_B);
-   dsaf_write_dev(drv, GMAC_STATION_ADDR_LOW_2_REG, low_val);
-   dsaf_write_dev(drv, GMAC_STATION_ADDR_HIGH_2_REG,
-  high_val | (sta_addr_en << GMAC_ADDR_EN_B));
-   }
+   u32 val = dsaf_read_dev(drv, GMAC_STATION_ADDR_HIGH_2_REG);
+   u32 sta_addr_en = dsaf_get_bit(val, GMAC_ADDR_EN_B);
+
+   dsaf_write_dev(drv, GMAC_STATION_ADDR_LOW_2_REG, low_val);
+   dsaf_write_dev(drv, GMAC_STATION_ADDR_HIGH_2_REG,
+  high_val | (sta_addr_en << GMAC_ADDR_EN_B));
 }
 
 static int hns_gmac_config_loopback(void *mac_drv, enum hnae_loop loop_mode,
-- 
1.9.1



Re: [PATCH net 4/6] net: hns: adds uc match for debug port

2016-03-10 Thread Daode Huang



On 2016/3/4 21:39, Sergei Shtylyov wrote:

On 3/4/2016 4:09 AM, Daode Huang wrote:


This patch adds uc match for debug port by:
1)Enables uc match of debug port when initializing gmac
2)Enables uc match of mac address register2

Signed-off-by: Daode Huang 
Signed-off-by: lipeng 


Lipeng is his full name. i will change it to another style (Peng Li 
)



   True/full name is required here.


---
  drivers/net/ethernet/hisilicon/hns/hns_dsaf_gmac.c | 18 
+-

  drivers/net/ethernet/hisilicon/hns/hns_dsaf_reg.h  |  2 ++
  2 files changed, 19 insertions(+), 1 deletion(-)

diff --git a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_gmac.c 
b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_gmac.c

index b8517b0..2591a51 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_gmac.c
+++ b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_gmac.c

[...]
@@ -407,8 +419,12 @@ static void hns_gmac_set_mac_addr(void *mac_drv, 
char *mac_addr)


  u32 low_val = mac_addr[5] | (mac_addr[4] << 8)
  | (mac_addr[3] << 16) | (mac_addr[2] << 24);
+
+u32 val = dsaf_read_dev(drv, GMAC_STATION_ADDR_HIGH_2_REG);
+u32 sta_addr_en = dsaf_get_bit(val, GMAC_ADDR_EN_B);


   Empty line needed after declarations.



agree,
thanks
Daode.


  dsaf_write_dev(drv, GMAC_STATION_ADDR_LOW_2_REG, low_val);
-dsaf_write_dev(drv, GMAC_STATION_ADDR_HIGH_2_REG, high_val);
+dsaf_write_dev(drv, GMAC_STATION_ADDR_HIGH_2_REG,
+   high_val | (sta_addr_en << GMAC_ADDR_EN_B));
  }
  }


[...]

MBR, Sergei


.






Re: [PATCH net 3/6] net: hns: fixed portid bug in sending manage pkt

2016-03-10 Thread Daode Huang



On 2016/3/4 21:37, Sergei Shtylyov wrote:

Hello.

On 3/4/2016 4:09 AM, Daode Huang wrote:


In V2 chip, when sending mamagement packets, the driver should
config the port id to BD descs.

Signed-off-by: Daode Huang 
Signed-off-by: Lisheng 
---
  drivers/net/ethernet/hisilicon/hns/hnae.h | 3 +++
  drivers/net/ethernet/hisilicon/hns/hns_ae_adapt.c | 1 +
  drivers/net/ethernet/hisilicon/hns/hns_enet.c | 4 
  3 files changed, 8 insertions(+)

diff --git a/drivers/net/ethernet/hisilicon/hns/hnae.h 
b/drivers/net/ethernet/hisilicon/hns/hnae.h

index 1cbcb9f..11a3f97 100644
--- a/drivers/net/ethernet/hisilicon/hns/hnae.h
+++ b/drivers/net/ethernet/hisilicon/hns/hnae.h

[...]

@@ -516,6 +518,7 @@ struct hnae_handle {
  int q_num;
  int vf_id;
  u32 eport_id;
+u32 dport_id;/*v2 tx bd should fill the dport_id*/


   Please add spaces after /* and before */ (like it's done in other 
places in this driver).




Hi MBR, Sergei,
Thanks for you comments,
will change it in next version.
Daode.


[...]
diff --git a/drivers/net/ethernet/hisilicon/hns/hns_enet.c 
b/drivers/net/ethernet/hisilicon/hns/hns_enet.c

index 6250a42..b45dcc2 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_enet.c
+++ b/drivers/net/ethernet/hisilicon/hns/hns_enet.c
@@ -69,6 +69,10 @@ static void fill_v2_desc(struct hnae_ring *ring, 
void *priv,

  hnae_set_bit(rrcfv, HNSV2_TXD_VLD_B, 1);
  hnae_set_field(bn_pid, HNSV2_TXD_BUFNUM_M, 0, buf_num - 1);

+/*fill port_id in the tx bd for sending management pkts*/


   Likewise.


+hnae_set_field(bn_pid, HNSV2_TXD_PORTID_M,
+   HNSV2_TXD_PORTID_S, ring->q->handle->dport_id);
+
  if (type == DESC_TYPE_SKB) {
  skb = (struct sk_buff *)priv;



MBR, Sergei


.






[PATCH net 6/6] net: hns: bug fix of getting hilink status

2016-03-03 Thread Daode Huang
from Lisheng 

There is some difference in hilink status defination between
v1 and v2 chips.
for v1 chip, all ports connected to the same hilink share the same
hilink status register bit.
but for v2, all ports have separately hilink status register bit. And
the register addr is also changed.
So this patch fixes the bug.

Signed-off-by: Daode Huang 
Signed-off-by: Lisheng 
---
 drivers/net/ethernet/hisilicon/hns/hns_dsaf_misc.c | 39 +++---
 drivers/net/ethernet/hisilicon/hns/hns_dsaf_reg.h  |  2 ++
 2 files changed, 22 insertions(+), 19 deletions(-)

diff --git a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_misc.c 
b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_misc.c
index 607c3be..2fa38f1 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_misc.c
+++ b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_misc.c
@@ -240,35 +240,36 @@ void hns_ppe_com_srst(struct ppe_common_cb *ppe_common, 
u32 val)
 /**
  * hns_mac_get_sds_mode - get phy ifterface form serdes mode
  * @mac_cb: mac control block
- * retuen phy interface
+ * return phy interface
  */
 phy_interface_t hns_mac_get_phy_if(struct hns_mac_cb *mac_cb)
 {
-   u32 hilink3_mode;
-   u32 hilink4_mode;
+   u32 reg, mode, shift;
void __iomem *sys_ctl_vaddr = mac_cb->sys_ctl_vaddr;
-   int dev_id = mac_cb->mac_id;
+   int mac_id = mac_cb->mac_id;
phy_interface_t phy_if = PHY_INTERFACE_MODE_NA;
+   bool is_ver1 = AE_IS_VER1(mac_cb->dsaf_dev->dsaf_ver);
 
-   hilink3_mode = dsaf_read_reg(sys_ctl_vaddr, HNS_MAC_HILINK3_REG);
-   hilink4_mode = dsaf_read_reg(sys_ctl_vaddr, HNS_MAC_HILINK4_REG);
-   if (dev_id >= 0 && dev_id <= 3) {
-   if (hilink4_mode == 0)
-   phy_if = PHY_INTERFACE_MODE_SGMII;
-   else
+   /*for hip05 soc, port6,7 only support ge mode*/
+   if (is_ver1 && (mac_id >= 6 && mac_id <= 7)) {
+   phy_if = PHY_INTERFACE_MODE_SGMII;
+   } else  if (mac_id >= 0 && mac_id <= 3) {
+   reg = is_ver1 ? HNS_MAC_HILINK4_REG : HNS_MAC_HILINK4V2_REG;
+   mode = dsaf_read_reg(sys_ctl_vaddr, reg);
+   shift = is_ver1 ? 0 : mac_id;
+   if (dsaf_get_bit(mode, shift))
phy_if = PHY_INTERFACE_MODE_XGMII;
-   } else if (dev_id >= 4 && dev_id <= 5) {
-   if (hilink3_mode == 0)
-   phy_if = PHY_INTERFACE_MODE_SGMII;
else
+   phy_if = PHY_INTERFACE_MODE_SGMII;
+   } else if (mac_id >= 4 && mac_id <= 7) {
+   reg = is_ver1 ? HNS_MAC_HILINK3_REG : HNS_MAC_HILINK3V2_REG;
+   mode = dsaf_read_reg(sys_ctl_vaddr, reg);
+   shift = is_ver1 ? 0 : mac_id - 4;
+   if (dsaf_get_bit(mode, shift))
phy_if = PHY_INTERFACE_MODE_XGMII;
-   } else {
-   phy_if = PHY_INTERFACE_MODE_SGMII;
+   else
+   phy_if = PHY_INTERFACE_MODE_SGMII;
}
-
-   dev_dbg(mac_cb->dev,
-   "hilink3_mode=%d, hilink4_mode=%d dev_id=%d, phy_if=%d\n",
-   hilink3_mode, hilink4_mode, dev_id, phy_if);
return phy_if;
 }
 
diff --git a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_reg.h 
b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_reg.h
index d8c49b6..690e4ea 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_reg.h
+++ b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_reg.h
@@ -103,6 +103,8 @@
 /*serdes offset**/
 #define HNS_MAC_HILINK3_REG DSAF_SUB_SC_HILINK3_CRG_CTRL0_REG
 #define HNS_MAC_HILINK4_REG DSAF_SUB_SC_HILINK4_CRG_CTRL0_REG
+#define HNS_MAC_HILINK3V2_REG DSAF_SUB_SC_HILINK3_CRG_CTRL1_REG
+#define HNS_MAC_HILINK4V2_REG DSAF_SUB_SC_HILINK4_CRG_CTRL1_REG
 #define HNS_MAC_LANE0_CTLEDFE_REG 0x000BFFCCULL
 #define HNS_MAC_LANE1_CTLEDFE_REG 0x000BFFBCULL
 #define HNS_MAC_LANE2_CTLEDFE_REG 0x000BFFACULL
-- 
1.9.1



[PATCH net 2/6] net: hns: fixes the hw interrupt bug in using napi

2016-03-03 Thread Daode Huang
In V1 chip, common_poll should check and clean fbd pkts, because it
can not pend irq to clean them if there is no new pkt comes in.
But V2 chip hw fixes this bug, and will pend irq itself to do this.
So, for V2 chip, we set ring_data->fini_process to NULL.

Signed-off-by: Daode Huang 
Signed-off-by: Lisheng 
---
 drivers/net/ethernet/hisilicon/hns/hns_enet.c | 9 +
 1 file changed, 5 insertions(+), 4 deletions(-)

diff --git a/drivers/net/ethernet/hisilicon/hns/hns_enet.c 
b/drivers/net/ethernet/hisilicon/hns/hns_enet.c
index 9d46d57..6250a42 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_enet.c
+++ b/drivers/net/ethernet/hisilicon/hns/hns_enet.c
@@ -946,8 +946,8 @@ static int hns_nic_common_poll(struct napi_struct *napi, 
int budget)
napi_complete(napi);
ring_data->ring->q->handle->dev->ops->toggle_ring_irq(
ring_data->ring, 0);
-
-   ring_data->fini_process(ring_data);
+   if (ring_data->fini_process)
+   ring_data->fini_process(ring_data);
return 0;
}
 
@@ -1710,6 +1710,7 @@ static int hns_nic_init_ring_data(struct hns_nic_priv 
*priv)
 {
struct hnae_handle *h = priv->ae_handle;
struct hns_nic_ring_data *rd;
+   bool is_ver1 = AE_IS_VER1(priv->enet_ver);
int i;
 
if (h->q_num > NIC_MAX_Q_PER_VF) {
@@ -1727,7 +1728,7 @@ static int hns_nic_init_ring_data(struct hns_nic_priv 
*priv)
rd->queue_index = i;
rd->ring = &h->qs[i]->tx_ring;
rd->poll_one = hns_nic_tx_poll_one;
-   rd->fini_process = hns_nic_tx_fini_pro;
+   rd->fini_process = is_ver1 ? hns_nic_tx_fini_pro : NULL;
 
netif_napi_add(priv->netdev, &rd->napi,
   hns_nic_common_poll, NIC_TX_CLEAN_MAX_NUM);
@@ -1739,7 +1740,7 @@ static int hns_nic_init_ring_data(struct hns_nic_priv 
*priv)
rd->ring = &h->qs[i - h->q_num]->rx_ring;
rd->poll_one = hns_nic_rx_poll_one;
rd->ex_process = hns_nic_rx_up_pro;
-   rd->fini_process = hns_nic_rx_fini_pro;
+   rd->fini_process = is_ver1 ? hns_nic_rx_fini_pro : NULL;
 
netif_napi_add(priv->netdev, &rd->napi,
   hns_nic_common_poll, NIC_RX_CLEAN_MAX_NUM);
-- 
1.9.1



[PATCH net 5/6] net: hns: fixed service-ges setting MAC-addr bug

2016-03-03 Thread Daode Huang
From: Lisheng 

Service gmacs can not set mac add, this patch will fix the bug.

Signed-off-by: Daode Huang 
Signed-off-by: Lisheng 
---
 drivers/net/ethernet/hisilicon/hns/hns_dsaf_gmac.c | 19 +--
 1 file changed, 9 insertions(+), 10 deletions(-)

diff --git a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_gmac.c 
b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_gmac.c
index 2591a51..eb86178 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_gmac.c
+++ b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_gmac.c
@@ -414,18 +414,17 @@ static void hns_gmac_set_mac_addr(void *mac_drv, char 
*mac_addr)
 {
struct mac_driver *drv = (struct mac_driver *)mac_drv;
 
-   if (drv->mac_id >= DSAF_SERVICE_NW_NUM) {
-   u32 high_val = mac_addr[1] | (mac_addr[0] << 8);
+   u32 high_val = mac_addr[1] | (mac_addr[0] << 8);
 
-   u32 low_val = mac_addr[5] | (mac_addr[4] << 8)
-   | (mac_addr[3] << 16) | (mac_addr[2] << 24);
+   u32 low_val = mac_addr[5] | (mac_addr[4] << 8)
+   | (mac_addr[3] << 16) | (mac_addr[2] << 24);
 
-   u32 val = dsaf_read_dev(drv, GMAC_STATION_ADDR_HIGH_2_REG);
-   u32 sta_addr_en = dsaf_get_bit(val, GMAC_ADDR_EN_B);
-   dsaf_write_dev(drv, GMAC_STATION_ADDR_LOW_2_REG, low_val);
-   dsaf_write_dev(drv, GMAC_STATION_ADDR_HIGH_2_REG,
-  high_val | (sta_addr_en << GMAC_ADDR_EN_B));
-   }
+   u32 val = dsaf_read_dev(drv, GMAC_STATION_ADDR_HIGH_2_REG);
+   u32 sta_addr_en = dsaf_get_bit(val, GMAC_ADDR_EN_B);
+
+   dsaf_write_dev(drv, GMAC_STATION_ADDR_LOW_2_REG, low_val);
+   dsaf_write_dev(drv, GMAC_STATION_ADDR_HIGH_2_REG,
+  high_val | (sta_addr_en << GMAC_ADDR_EN_B));
 }
 
 static int hns_gmac_config_loopback(void *mac_drv, enum hnae_loop loop_mode,
-- 
1.9.1



[PATCH net 0/6]net: hns: hns driver updates

2016-03-03 Thread Daode Huang
Hi David,
This patch series are hisilicon network driver bug fix.

Best Regards
Daode.

Daode Huang (5):
  net: hns: bug fix about the overflow of mss
  net: hns: fixes the hw interrupt bug in using napi
  net: hns: fixed portid bug in sending manage pkt
  net: hns: adds uc match for debug port
  net: hns: bug fix of getting hilink status

Lisheng (1):
  net: hns: fixed service-ges setting MAC-addr bug

 drivers/net/ethernet/hisilicon/hns/hnae.h  |  3 ++
 drivers/net/ethernet/hisilicon/hns/hns_ae_adapt.c  |  1 +
 drivers/net/ethernet/hisilicon/hns/hns_dsaf_gmac.c | 29 
 drivers/net/ethernet/hisilicon/hns/hns_dsaf_misc.c | 39 +++---
 drivers/net/ethernet/hisilicon/hns/hns_dsaf_reg.h  |  4 +++
 drivers/net/ethernet/hisilicon/hns/hns_enet.c  | 30 +
 6 files changed, 67 insertions(+), 39 deletions(-)

-- 
1.9.1



[PATCH net 3/6] net: hns: fixed portid bug in sending manage pkt

2016-03-03 Thread Daode Huang
In V2 chip, when sending mamagement packets, the driver should
config the port id to BD descs.

Signed-off-by: Daode Huang 
Signed-off-by: Lisheng 
---
 drivers/net/ethernet/hisilicon/hns/hnae.h | 3 +++
 drivers/net/ethernet/hisilicon/hns/hns_ae_adapt.c | 1 +
 drivers/net/ethernet/hisilicon/hns/hns_enet.c | 4 
 3 files changed, 8 insertions(+)

diff --git a/drivers/net/ethernet/hisilicon/hns/hnae.h 
b/drivers/net/ethernet/hisilicon/hns/hnae.h
index 1cbcb9f..11a3f97 100644
--- a/drivers/net/ethernet/hisilicon/hns/hnae.h
+++ b/drivers/net/ethernet/hisilicon/hns/hnae.h
@@ -147,6 +147,8 @@ enum hnae_led_state {
 
 #define HNSV2_TXD_BUFNUM_S 0
 #define HNSV2_TXD_BUFNUM_M (0x7 << HNSV2_TXD_BUFNUM_S)
+#define HNSV2_TXD_PORTID_S 4
+#define HNSV2_TXD_PORTID_M (0X7 << HNSV2_TXD_PORTID_S)
 #define HNSV2_TXD_RI_B   1
 #define HNSV2_TXD_L4CS_B   2
 #define HNSV2_TXD_L3CS_B   3
@@ -516,6 +518,7 @@ struct hnae_handle {
int q_num;
int vf_id;
u32 eport_id;
+   u32 dport_id;   /*v2 tx bd should fill the dport_id*/
enum hnae_port_type port_type;
struct list_head node;/* list to hnae_ae_dev->handle_list */
struct hnae_buf_ops *bops; /* operation for the buffer */
diff --git a/drivers/net/ethernet/hisilicon/hns/hns_ae_adapt.c 
b/drivers/net/ethernet/hisilicon/hns/hns_ae_adapt.c
index a0070d0..ea2561a 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_ae_adapt.c
+++ b/drivers/net/ethernet/hisilicon/hns/hns_ae_adapt.c
@@ -175,6 +175,7 @@ struct hnae_handle *hns_ae_get_handle(struct hnae_ae_dev 
*dev,
ae_handle->phy_node = vf_cb->mac_cb->phy_node;
ae_handle->if_support = vf_cb->mac_cb->if_support;
ae_handle->port_type = vf_cb->mac_cb->mac_type;
+   ae_handle->dport_id = port_idx;
 
return ae_handle;
 vf_id_err:
diff --git a/drivers/net/ethernet/hisilicon/hns/hns_enet.c 
b/drivers/net/ethernet/hisilicon/hns/hns_enet.c
index 6250a42..b45dcc2 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_enet.c
+++ b/drivers/net/ethernet/hisilicon/hns/hns_enet.c
@@ -69,6 +69,10 @@ static void fill_v2_desc(struct hnae_ring *ring, void *priv,
hnae_set_bit(rrcfv, HNSV2_TXD_VLD_B, 1);
hnae_set_field(bn_pid, HNSV2_TXD_BUFNUM_M, 0, buf_num - 1);
 
+   /*fill port_id in the tx bd for sending management pkts*/
+   hnae_set_field(bn_pid, HNSV2_TXD_PORTID_M,
+  HNSV2_TXD_PORTID_S, ring->q->handle->dport_id);
+
if (type == DESC_TYPE_SKB) {
skb = (struct sk_buff *)priv;
 
-- 
1.9.1



[PATCH net 4/6] net: hns: adds uc match for debug port

2016-03-03 Thread Daode Huang
This patch adds uc match for debug port by:
1)Enables uc match of debug port when initializing gmac
2)Enables uc match of mac address register2

Signed-off-by: Daode Huang 
Signed-off-by: lipeng 
---
 drivers/net/ethernet/hisilicon/hns/hns_dsaf_gmac.c | 18 +-
 drivers/net/ethernet/hisilicon/hns/hns_dsaf_reg.h  |  2 ++
 2 files changed, 19 insertions(+), 1 deletion(-)

diff --git a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_gmac.c 
b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_gmac.c
index b8517b0..2591a51 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_gmac.c
+++ b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_gmac.c
@@ -290,6 +290,16 @@ static int hns_gmac_adjust_link(void *mac_drv, enum 
mac_speed speed,
return 0;
 }
 
+static void hns_gmac_set_uc_match(void *mac_drv, u16 en)
+{
+   struct mac_driver *drv = (struct mac_driver *)mac_drv;
+
+   dsaf_set_dev_bit(drv, GMAC_REC_FILT_CONTROL_REG,
+GMAC_UC_MATCH_EN_B, !en);
+   dsaf_set_dev_bit(drv, GMAC_STATION_ADDR_HIGH_2_REG,
+GMAC_ADDR_EN_B, !en);
+}
+
 static void hns_gmac_init(void *mac_drv)
 {
u32 port;
@@ -305,6 +315,8 @@ static void hns_gmac_init(void *mac_drv)
mdelay(10);
hns_gmac_disable(mac_drv, MAC_COMM_MODE_RX_AND_TX);
hns_gmac_tx_loop_pkt_dis(mac_drv);
+   if (drv->mac_cb->mac_type == HNAE_PORT_DEBUG)
+   hns_gmac_set_uc_match(mac_drv, 0);
 }
 
 void hns_gmac_update_stats(void *mac_drv)
@@ -407,8 +419,12 @@ static void hns_gmac_set_mac_addr(void *mac_drv, char 
*mac_addr)
 
u32 low_val = mac_addr[5] | (mac_addr[4] << 8)
| (mac_addr[3] << 16) | (mac_addr[2] << 24);
+
+   u32 val = dsaf_read_dev(drv, GMAC_STATION_ADDR_HIGH_2_REG);
+   u32 sta_addr_en = dsaf_get_bit(val, GMAC_ADDR_EN_B);
dsaf_write_dev(drv, GMAC_STATION_ADDR_LOW_2_REG, low_val);
-   dsaf_write_dev(drv, GMAC_STATION_ADDR_HIGH_2_REG, high_val);
+   dsaf_write_dev(drv, GMAC_STATION_ADDR_HIGH_2_REG,
+  high_val | (sta_addr_en << GMAC_ADDR_EN_B));
}
 }
 
diff --git a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_reg.h 
b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_reg.h
index f0c4f9b..d8c49b6 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_reg.h
+++ b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_reg.h
@@ -917,6 +917,8 @@
 #define GMAC_LP_REG_CF2MI_LP_EN_B  2
 
 #define GMAC_MODE_CHANGE_EB_B  0
+#define GMAC_UC_MATCH_EN_B 0
+#define GMAC_ADDR_EN_B 16
 
 #define GMAC_RECV_CTRL_STRIP_PAD_EN_B  3
 #define GMAC_RECV_CTRL_RUNT_PKT_EN_B   4
-- 
1.9.1



[PATCH net 1/6] net: hns: bug fix about the overflow of mss

2016-03-03 Thread Daode Huang
When set MTU to the minimum value 68, there are increasing number
of error packets occur, which is caused by the overflowed value of
mss. This patch fix the bug.

Signed-off-by: Daode Huang 
---
 drivers/net/ethernet/hisilicon/hns/hns_enet.c | 17 -
 1 file changed, 8 insertions(+), 9 deletions(-)

diff --git a/drivers/net/ethernet/hisilicon/hns/hns_enet.c 
b/drivers/net/ethernet/hisilicon/hns/hns_enet.c
index 3f77ff7..9d46d57 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_enet.c
+++ b/drivers/net/ethernet/hisilicon/hns/hns_enet.c
@@ -48,7 +48,6 @@ static void fill_v2_desc(struct hnae_ring *ring, void *priv,
struct iphdr *iphdr;
struct ipv6hdr *ipv6hdr;
struct sk_buff *skb;
-   int skb_tmp_len;
__be16 protocol;
u8 bn_pid = 0;
u8 rrcfv = 0;
@@ -90,13 +89,13 @@ static void fill_v2_desc(struct hnae_ring *ring, void *priv,
hnae_set_bit(rrcfv, HNSV2_TXD_L4CS_B, 1);
 
/* check for tcp/udp header */
-   if (iphdr->protocol == IPPROTO_TCP) {
+   if (iphdr->protocol == IPPROTO_TCP &&
+   skb_is_gso(skb)) {
hnae_set_bit(tvsvsn,
 HNSV2_TXD_TSE_B, 1);
-   skb_tmp_len = SKB_TMP_LEN(skb);
l4_len = tcp_hdrlen(skb);
-   mss = mtu - skb_tmp_len - ETH_FCS_LEN;
-   paylen = skb->len - skb_tmp_len;
+   mss = skb_shinfo(skb)->gso_size;
+   paylen = skb->len - SKB_TMP_LEN(skb);
}
} else if (skb->protocol == htons(ETH_P_IPV6)) {
hnae_set_bit(tvsvsn, HNSV2_TXD_IPV6_B, 1);
@@ -104,13 +103,13 @@ static void fill_v2_desc(struct hnae_ring *ring, void 
*priv,
hnae_set_bit(rrcfv, HNSV2_TXD_L4CS_B, 1);
 
/* check for tcp/udp header */
-   if (ipv6hdr->nexthdr == IPPROTO_TCP) {
+   if (ipv6hdr->nexthdr == IPPROTO_TCP &&
+   skb_is_gso(skb) && skb_is_gso_v6(skb)) {
hnae_set_bit(tvsvsn,
 HNSV2_TXD_TSE_B, 1);
-   skb_tmp_len = SKB_TMP_LEN(skb);
l4_len = tcp_hdrlen(skb);
-   mss = mtu - skb_tmp_len - ETH_FCS_LEN;
-   paylen = skb->len - skb_tmp_len;
+   mss = skb_shinfo(skb)->gso_size;
+   paylen = skb->len - SKB_TMP_LEN(skb);
}
}
desc->tx.ip_offset = ip_offset;
-- 
1.9.1



Re: [PATCH net 0/6]net: hns: hns driver updates

2016-03-03 Thread Daode Huang

sorry. please ignore this mail,
i will send out it again.

On 2016/3/4 9:09, Daode Huang wrote:

Hi David,
This patch series are hisilicon network driver bug fix.

Best Regards
Daode.

Daode Huang (5):
   net: hns: bug fix about the overflow of mss
   net: hns: fixes the hw interrupt bug in using napi
   net: hns: fixed portid bug in sending manage pkt
   net: hns: adds uc match for debug port
   net: hns: bug fix of getting hilink status

Lisheng (1):
   net: hns: fixed service-ges setting MAC-addr bug

  drivers/net/ethernet/hisilicon/hns/hnae.h  |  3 ++
  drivers/net/ethernet/hisilicon/hns/hns_ae_adapt.c  |  1 +
  drivers/net/ethernet/hisilicon/hns/hns_dsaf_gmac.c | 29 
  drivers/net/ethernet/hisilicon/hns/hns_dsaf_misc.c | 39 +++---
  drivers/net/ethernet/hisilicon/hns/hns_dsaf_reg.h  |  4 +++
  drivers/net/ethernet/hisilicon/hns/hns_enet.c  | 30 +
  6 files changed, 67 insertions(+), 39 deletions(-)






[PATCH net 6/6] net: hns: bug fix of getting hilink status

2016-03-03 Thread Daode Huang
from Lisheng 

There is some difference in hilink status defination between
v1 and v2 chips.
for v1 chip, all ports connected to the same hilink share the same
hilink status register bit.
but for v2, all ports have separately hilink status register bit. And
the register addr is also changed.
So this patch fixes the bug.

Signed-off-by: Daode Huang 
Signed-off-by: Lisheng 
---
 drivers/net/ethernet/hisilicon/hns/hns_dsaf_misc.c | 39 +++---
 drivers/net/ethernet/hisilicon/hns/hns_dsaf_reg.h  |  2 ++
 2 files changed, 22 insertions(+), 19 deletions(-)

diff --git a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_misc.c 
b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_misc.c
index 607c3be..2fa38f1 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_misc.c
+++ b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_misc.c
@@ -240,35 +240,36 @@ void hns_ppe_com_srst(struct ppe_common_cb *ppe_common, 
u32 val)
 /**
  * hns_mac_get_sds_mode - get phy ifterface form serdes mode
  * @mac_cb: mac control block
- * retuen phy interface
+ * return phy interface
  */
 phy_interface_t hns_mac_get_phy_if(struct hns_mac_cb *mac_cb)
 {
-   u32 hilink3_mode;
-   u32 hilink4_mode;
+   u32 reg, mode, shift;
void __iomem *sys_ctl_vaddr = mac_cb->sys_ctl_vaddr;
-   int dev_id = mac_cb->mac_id;
+   int mac_id = mac_cb->mac_id;
phy_interface_t phy_if = PHY_INTERFACE_MODE_NA;
+   bool is_ver1 = AE_IS_VER1(mac_cb->dsaf_dev->dsaf_ver);
 
-   hilink3_mode = dsaf_read_reg(sys_ctl_vaddr, HNS_MAC_HILINK3_REG);
-   hilink4_mode = dsaf_read_reg(sys_ctl_vaddr, HNS_MAC_HILINK4_REG);
-   if (dev_id >= 0 && dev_id <= 3) {
-   if (hilink4_mode == 0)
-   phy_if = PHY_INTERFACE_MODE_SGMII;
-   else
+   /*for hip05 soc, port6,7 only support ge mode*/
+   if (is_ver1 && (mac_id >= 6 && mac_id <= 7)) {
+   phy_if = PHY_INTERFACE_MODE_SGMII;
+   } else  if (mac_id >= 0 && mac_id <= 3) {
+   reg = is_ver1 ? HNS_MAC_HILINK4_REG : HNS_MAC_HILINK4V2_REG;
+   mode = dsaf_read_reg(sys_ctl_vaddr, reg);
+   shift = is_ver1 ? 0 : mac_id;
+   if (dsaf_get_bit(mode, shift))
phy_if = PHY_INTERFACE_MODE_XGMII;
-   } else if (dev_id >= 4 && dev_id <= 5) {
-   if (hilink3_mode == 0)
-   phy_if = PHY_INTERFACE_MODE_SGMII;
else
+   phy_if = PHY_INTERFACE_MODE_SGMII;
+   } else if (mac_id >= 4 && mac_id <= 7) {
+   reg = is_ver1 ? HNS_MAC_HILINK3_REG : HNS_MAC_HILINK3V2_REG;
+   mode = dsaf_read_reg(sys_ctl_vaddr, reg);
+   shift = is_ver1 ? 0 : mac_id - 4;
+   if (dsaf_get_bit(mode, shift))
phy_if = PHY_INTERFACE_MODE_XGMII;
-   } else {
-   phy_if = PHY_INTERFACE_MODE_SGMII;
+   else
+   phy_if = PHY_INTERFACE_MODE_SGMII;
}
-
-   dev_dbg(mac_cb->dev,
-   "hilink3_mode=%d, hilink4_mode=%d dev_id=%d, phy_if=%d\n",
-   hilink3_mode, hilink4_mode, dev_id, phy_if);
return phy_if;
 }
 
diff --git a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_reg.h 
b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_reg.h
index d8c49b6..690e4ea 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_reg.h
+++ b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_reg.h
@@ -103,6 +103,8 @@
 /*serdes offset**/
 #define HNS_MAC_HILINK3_REG DSAF_SUB_SC_HILINK3_CRG_CTRL0_REG
 #define HNS_MAC_HILINK4_REG DSAF_SUB_SC_HILINK4_CRG_CTRL0_REG
+#define HNS_MAC_HILINK3V2_REG DSAF_SUB_SC_HILINK3_CRG_CTRL1_REG
+#define HNS_MAC_HILINK4V2_REG DSAF_SUB_SC_HILINK4_CRG_CTRL1_REG
 #define HNS_MAC_LANE0_CTLEDFE_REG 0x000BFFCCULL
 #define HNS_MAC_LANE1_CTLEDFE_REG 0x000BFFBCULL
 #define HNS_MAC_LANE2_CTLEDFE_REG 0x000BFFACULL
-- 
1.9.1



[PATCH net 4/6] net: hns: adds uc match for debug port

2016-03-03 Thread Daode Huang
This patch adds uc match for debug port by:
1)Enables uc match of debug port when initializing gmac
2)Enables uc match of mac address register2

Signed-off-by: Daode Huang 
Signed-off-by: lipeng 
---
 drivers/net/ethernet/hisilicon/hns/hns_dsaf_gmac.c | 18 +-
 drivers/net/ethernet/hisilicon/hns/hns_dsaf_reg.h  |  2 ++
 2 files changed, 19 insertions(+), 1 deletion(-)

diff --git a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_gmac.c 
b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_gmac.c
index b8517b0..2591a51 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_gmac.c
+++ b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_gmac.c
@@ -290,6 +290,16 @@ static int hns_gmac_adjust_link(void *mac_drv, enum 
mac_speed speed,
return 0;
 }
 
+static void hns_gmac_set_uc_match(void *mac_drv, u16 en)
+{
+   struct mac_driver *drv = (struct mac_driver *)mac_drv;
+
+   dsaf_set_dev_bit(drv, GMAC_REC_FILT_CONTROL_REG,
+GMAC_UC_MATCH_EN_B, !en);
+   dsaf_set_dev_bit(drv, GMAC_STATION_ADDR_HIGH_2_REG,
+GMAC_ADDR_EN_B, !en);
+}
+
 static void hns_gmac_init(void *mac_drv)
 {
u32 port;
@@ -305,6 +315,8 @@ static void hns_gmac_init(void *mac_drv)
mdelay(10);
hns_gmac_disable(mac_drv, MAC_COMM_MODE_RX_AND_TX);
hns_gmac_tx_loop_pkt_dis(mac_drv);
+   if (drv->mac_cb->mac_type == HNAE_PORT_DEBUG)
+   hns_gmac_set_uc_match(mac_drv, 0);
 }
 
 void hns_gmac_update_stats(void *mac_drv)
@@ -407,8 +419,12 @@ static void hns_gmac_set_mac_addr(void *mac_drv, char 
*mac_addr)
 
u32 low_val = mac_addr[5] | (mac_addr[4] << 8)
| (mac_addr[3] << 16) | (mac_addr[2] << 24);
+
+   u32 val = dsaf_read_dev(drv, GMAC_STATION_ADDR_HIGH_2_REG);
+   u32 sta_addr_en = dsaf_get_bit(val, GMAC_ADDR_EN_B);
dsaf_write_dev(drv, GMAC_STATION_ADDR_LOW_2_REG, low_val);
-   dsaf_write_dev(drv, GMAC_STATION_ADDR_HIGH_2_REG, high_val);
+   dsaf_write_dev(drv, GMAC_STATION_ADDR_HIGH_2_REG,
+  high_val | (sta_addr_en << GMAC_ADDR_EN_B));
}
 }
 
diff --git a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_reg.h 
b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_reg.h
index f0c4f9b..d8c49b6 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_reg.h
+++ b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_reg.h
@@ -917,6 +917,8 @@
 #define GMAC_LP_REG_CF2MI_LP_EN_B  2
 
 #define GMAC_MODE_CHANGE_EB_B  0
+#define GMAC_UC_MATCH_EN_B 0
+#define GMAC_ADDR_EN_B 16
 
 #define GMAC_RECV_CTRL_STRIP_PAD_EN_B  3
 #define GMAC_RECV_CTRL_RUNT_PKT_EN_B   4
-- 
1.9.1



[PATCH net 3/6] net: hns: fixed portid bug in sending manage pkt

2016-03-03 Thread Daode Huang
In V2 chip, when sending mamagement packets, the driver should
config the port id to BD descs.

Signed-off-by: Daode Huang 
Signed-off-by: Lisheng 
---
 drivers/net/ethernet/hisilicon/hns/hnae.h | 3 +++
 drivers/net/ethernet/hisilicon/hns/hns_ae_adapt.c | 1 +
 drivers/net/ethernet/hisilicon/hns/hns_enet.c | 4 
 3 files changed, 8 insertions(+)

diff --git a/drivers/net/ethernet/hisilicon/hns/hnae.h 
b/drivers/net/ethernet/hisilicon/hns/hnae.h
index 1cbcb9f..11a3f97 100644
--- a/drivers/net/ethernet/hisilicon/hns/hnae.h
+++ b/drivers/net/ethernet/hisilicon/hns/hnae.h
@@ -147,6 +147,8 @@ enum hnae_led_state {
 
 #define HNSV2_TXD_BUFNUM_S 0
 #define HNSV2_TXD_BUFNUM_M (0x7 << HNSV2_TXD_BUFNUM_S)
+#define HNSV2_TXD_PORTID_S 4
+#define HNSV2_TXD_PORTID_M (0X7 << HNSV2_TXD_PORTID_S)
 #define HNSV2_TXD_RI_B   1
 #define HNSV2_TXD_L4CS_B   2
 #define HNSV2_TXD_L3CS_B   3
@@ -516,6 +518,7 @@ struct hnae_handle {
int q_num;
int vf_id;
u32 eport_id;
+   u32 dport_id;   /*v2 tx bd should fill the dport_id*/
enum hnae_port_type port_type;
struct list_head node;/* list to hnae_ae_dev->handle_list */
struct hnae_buf_ops *bops; /* operation for the buffer */
diff --git a/drivers/net/ethernet/hisilicon/hns/hns_ae_adapt.c 
b/drivers/net/ethernet/hisilicon/hns/hns_ae_adapt.c
index a0070d0..ea2561a 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_ae_adapt.c
+++ b/drivers/net/ethernet/hisilicon/hns/hns_ae_adapt.c
@@ -175,6 +175,7 @@ struct hnae_handle *hns_ae_get_handle(struct hnae_ae_dev 
*dev,
ae_handle->phy_node = vf_cb->mac_cb->phy_node;
ae_handle->if_support = vf_cb->mac_cb->if_support;
ae_handle->port_type = vf_cb->mac_cb->mac_type;
+   ae_handle->dport_id = port_idx;
 
return ae_handle;
 vf_id_err:
diff --git a/drivers/net/ethernet/hisilicon/hns/hns_enet.c 
b/drivers/net/ethernet/hisilicon/hns/hns_enet.c
index 6250a42..b45dcc2 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_enet.c
+++ b/drivers/net/ethernet/hisilicon/hns/hns_enet.c
@@ -69,6 +69,10 @@ static void fill_v2_desc(struct hnae_ring *ring, void *priv,
hnae_set_bit(rrcfv, HNSV2_TXD_VLD_B, 1);
hnae_set_field(bn_pid, HNSV2_TXD_BUFNUM_M, 0, buf_num - 1);
 
+   /*fill port_id in the tx bd for sending management pkts*/
+   hnae_set_field(bn_pid, HNSV2_TXD_PORTID_M,
+  HNSV2_TXD_PORTID_S, ring->q->handle->dport_id);
+
if (type == DESC_TYPE_SKB) {
skb = (struct sk_buff *)priv;
 
-- 
1.9.1



[PATCH net 5/6] net: hns: fixed service-ges setting MAC-addr bug

2016-03-03 Thread Daode Huang
From: Lisheng 

Service gmacs can not set mac add, this patch will fix the bug.

Signed-off-by: Daode Huang 
Signed-off-by: Lisheng 
---
 drivers/net/ethernet/hisilicon/hns/hns_dsaf_gmac.c | 19 +--
 1 file changed, 9 insertions(+), 10 deletions(-)

diff --git a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_gmac.c 
b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_gmac.c
index 2591a51..eb86178 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_gmac.c
+++ b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_gmac.c
@@ -414,18 +414,17 @@ static void hns_gmac_set_mac_addr(void *mac_drv, char 
*mac_addr)
 {
struct mac_driver *drv = (struct mac_driver *)mac_drv;
 
-   if (drv->mac_id >= DSAF_SERVICE_NW_NUM) {
-   u32 high_val = mac_addr[1] | (mac_addr[0] << 8);
+   u32 high_val = mac_addr[1] | (mac_addr[0] << 8);
 
-   u32 low_val = mac_addr[5] | (mac_addr[4] << 8)
-   | (mac_addr[3] << 16) | (mac_addr[2] << 24);
+   u32 low_val = mac_addr[5] | (mac_addr[4] << 8)
+   | (mac_addr[3] << 16) | (mac_addr[2] << 24);
 
-   u32 val = dsaf_read_dev(drv, GMAC_STATION_ADDR_HIGH_2_REG);
-   u32 sta_addr_en = dsaf_get_bit(val, GMAC_ADDR_EN_B);
-   dsaf_write_dev(drv, GMAC_STATION_ADDR_LOW_2_REG, low_val);
-   dsaf_write_dev(drv, GMAC_STATION_ADDR_HIGH_2_REG,
-  high_val | (sta_addr_en << GMAC_ADDR_EN_B));
-   }
+   u32 val = dsaf_read_dev(drv, GMAC_STATION_ADDR_HIGH_2_REG);
+   u32 sta_addr_en = dsaf_get_bit(val, GMAC_ADDR_EN_B);
+
+   dsaf_write_dev(drv, GMAC_STATION_ADDR_LOW_2_REG, low_val);
+   dsaf_write_dev(drv, GMAC_STATION_ADDR_HIGH_2_REG,
+  high_val | (sta_addr_en << GMAC_ADDR_EN_B));
 }
 
 static int hns_gmac_config_loopback(void *mac_drv, enum hnae_loop loop_mode,
-- 
1.9.1



[PATCH net 0/6]net: hns: hns driver updates

2016-03-03 Thread Daode Huang
Hi David,
This patch series are hisilicon network driver bug fix.

Best Regards
Daode.

Daode Huang (5):
  net: hns: bug fix about the overflow of mss
  net: hns: fixes the hw interrupt bug in using napi
  net: hns: fixed portid bug in sending manage pkt
  net: hns: adds uc match for debug port
  net: hns: bug fix of getting hilink status

Lisheng (1):
  net: hns: fixed service-ges setting MAC-addr bug

 drivers/net/ethernet/hisilicon/hns/hnae.h  |  3 ++
 drivers/net/ethernet/hisilicon/hns/hns_ae_adapt.c  |  1 +
 drivers/net/ethernet/hisilicon/hns/hns_dsaf_gmac.c | 29 
 drivers/net/ethernet/hisilicon/hns/hns_dsaf_misc.c | 39 +++---
 drivers/net/ethernet/hisilicon/hns/hns_dsaf_reg.h  |  4 +++
 drivers/net/ethernet/hisilicon/hns/hns_enet.c  | 30 +
 6 files changed, 67 insertions(+), 39 deletions(-)

-- 
1.9.1



[PATCH net 2/6] net: hns: fixes the hw interrupt bug in using napi

2016-03-03 Thread Daode Huang
In V1 chip, common_poll should check and clean fbd pkts, because it
can not pend irq to clean them if there is no new pkt comes in.
But V2 chip hw fixes this bug, and will pend irq itself to do this.
So, for V2 chip, we set ring_data->fini_process to NULL.

Signed-off-by: Daode Huang 
Signed-off-by: Lisheng 
---
 drivers/net/ethernet/hisilicon/hns/hns_enet.c | 9 +
 1 file changed, 5 insertions(+), 4 deletions(-)

diff --git a/drivers/net/ethernet/hisilicon/hns/hns_enet.c 
b/drivers/net/ethernet/hisilicon/hns/hns_enet.c
index 9d46d57..6250a42 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_enet.c
+++ b/drivers/net/ethernet/hisilicon/hns/hns_enet.c
@@ -946,8 +946,8 @@ static int hns_nic_common_poll(struct napi_struct *napi, 
int budget)
napi_complete(napi);
ring_data->ring->q->handle->dev->ops->toggle_ring_irq(
ring_data->ring, 0);
-
-   ring_data->fini_process(ring_data);
+   if (ring_data->fini_process)
+   ring_data->fini_process(ring_data);
return 0;
}
 
@@ -1710,6 +1710,7 @@ static int hns_nic_init_ring_data(struct hns_nic_priv 
*priv)
 {
struct hnae_handle *h = priv->ae_handle;
struct hns_nic_ring_data *rd;
+   bool is_ver1 = AE_IS_VER1(priv->enet_ver);
int i;
 
if (h->q_num > NIC_MAX_Q_PER_VF) {
@@ -1727,7 +1728,7 @@ static int hns_nic_init_ring_data(struct hns_nic_priv 
*priv)
rd->queue_index = i;
rd->ring = &h->qs[i]->tx_ring;
rd->poll_one = hns_nic_tx_poll_one;
-   rd->fini_process = hns_nic_tx_fini_pro;
+   rd->fini_process = is_ver1 ? hns_nic_tx_fini_pro : NULL;
 
netif_napi_add(priv->netdev, &rd->napi,
   hns_nic_common_poll, NIC_TX_CLEAN_MAX_NUM);
@@ -1739,7 +1740,7 @@ static int hns_nic_init_ring_data(struct hns_nic_priv 
*priv)
rd->ring = &h->qs[i - h->q_num]->rx_ring;
rd->poll_one = hns_nic_rx_poll_one;
rd->ex_process = hns_nic_rx_up_pro;
-   rd->fini_process = hns_nic_rx_fini_pro;
+   rd->fini_process = is_ver1 ? hns_nic_rx_fini_pro : NULL;
 
netif_napi_add(priv->netdev, &rd->napi,
   hns_nic_common_poll, NIC_RX_CLEAN_MAX_NUM);
-- 
1.9.1



[PATCH net 1/6] net: hns: bug fix about the overflow of mss

2016-03-03 Thread Daode Huang
When set MTU to the minimum value 68, there are increasing number
of error packets occur, which is caused by the overflowed value of
mss. This patch fix the bug.

This patch is just for huawei internal review, if there is no
comment for three days, I will send out to the mainline.

thanks

Signed-off-by: Daode Huang 
---
 drivers/net/ethernet/hisilicon/hns/hns_enet.c | 17 -
 1 file changed, 8 insertions(+), 9 deletions(-)

diff --git a/drivers/net/ethernet/hisilicon/hns/hns_enet.c 
b/drivers/net/ethernet/hisilicon/hns/hns_enet.c
index 3f77ff7..9d46d57 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_enet.c
+++ b/drivers/net/ethernet/hisilicon/hns/hns_enet.c
@@ -48,7 +48,6 @@ static void fill_v2_desc(struct hnae_ring *ring, void *priv,
struct iphdr *iphdr;
struct ipv6hdr *ipv6hdr;
struct sk_buff *skb;
-   int skb_tmp_len;
__be16 protocol;
u8 bn_pid = 0;
u8 rrcfv = 0;
@@ -90,13 +89,13 @@ static void fill_v2_desc(struct hnae_ring *ring, void *priv,
hnae_set_bit(rrcfv, HNSV2_TXD_L4CS_B, 1);
 
/* check for tcp/udp header */
-   if (iphdr->protocol == IPPROTO_TCP) {
+   if (iphdr->protocol == IPPROTO_TCP &&
+   skb_is_gso(skb)) {
hnae_set_bit(tvsvsn,
 HNSV2_TXD_TSE_B, 1);
-   skb_tmp_len = SKB_TMP_LEN(skb);
l4_len = tcp_hdrlen(skb);
-   mss = mtu - skb_tmp_len - ETH_FCS_LEN;
-   paylen = skb->len - skb_tmp_len;
+   mss = skb_shinfo(skb)->gso_size;
+   paylen = skb->len - SKB_TMP_LEN(skb);
}
} else if (skb->protocol == htons(ETH_P_IPV6)) {
hnae_set_bit(tvsvsn, HNSV2_TXD_IPV6_B, 1);
@@ -104,13 +103,13 @@ static void fill_v2_desc(struct hnae_ring *ring, void 
*priv,
hnae_set_bit(rrcfv, HNSV2_TXD_L4CS_B, 1);
 
/* check for tcp/udp header */
-   if (ipv6hdr->nexthdr == IPPROTO_TCP) {
+   if (ipv6hdr->nexthdr == IPPROTO_TCP &&
+   skb_is_gso(skb) && skb_is_gso_v6(skb)) {
hnae_set_bit(tvsvsn,
 HNSV2_TXD_TSE_B, 1);
-   skb_tmp_len = SKB_TMP_LEN(skb);
l4_len = tcp_hdrlen(skb);
-   mss = mtu - skb_tmp_len - ETH_FCS_LEN;
-   paylen = skb->len - skb_tmp_len;
+   mss = skb_shinfo(skb)->gso_size;
+   paylen = skb->len - SKB_TMP_LEN(skb);
}
}
desc->tx.ip_offset = ip_offset;
-- 
1.9.1