linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH net-next 00/19] net: hns: fix some bugs in hns driver
@ 2016-06-21  3:56 Yisen Zhuang
  2016-06-21  3:56 ` [PATCH net-next 01/19] net: hns: bug fix of ge reset sequence Yisen Zhuang
                   ` (19 more replies)
  0 siblings, 20 replies; 29+ messages in thread
From: Yisen Zhuang @ 2016-06-21  3:56 UTC (permalink / raw)
  To: davem, yisen.zhuang, salil.mehta, yankejian
  Cc: liguozhu, huangdaode, arnd, andriy.shevchenko, andrew,
	geliangtang, ivecera, fengguang.wu, charles.chenxin, netdev,
	linux-kernel, linux-arm-kernel, linuxarm

This series includes some bugs fixed. All these patches needs to be
applied after the patchset about ACPI support, so this series is 
floated to net-next list.

The patches are:
 > from Daode, fixes about pfc pause frame, getting coaslesce, led 
control logic, TSO on|off and tcam table configuration.

 > from Jun He, fix the potential leak to port unavailable

 > from Kejian, fix bug of loopback and failing to test ping6

 > from Qianqian, fix the several typo in hns driver

For more details, please see individual patches.

MBR.

Daode Huang (9):
  net: hns: bugfix about pfc pause frame statistics
  net: hns: add spin lock for tcam table operation
  net: hns: fix bug of getting the wrong tcam data
  net: hns: add get_coalesce_range api for hns
  net: hns: delete redundancy ring enable operations
  net: hns: bug fix about led control logic when link down
  net: hns: fix sbm default parameters config error
  net: hns: change the default coalesce usecs
  net: hns: bug fix about TSO on|off when there is traffic

Jun He (1):
  net: hns: fix bug that alloc skb fail lead to port unavailable

Kejian Yan (3):
  net: hns: add skb_reset_mac_header() after skb being alloc
  net: hns: select Hilink before serdes loopback for HNS V2
  net: hns: fix ethtool loopback fail bug

Qianqian Xie (6):
  net: hns: bug fix of ge reset sequence
  net: hns: fix hns dsaf v1 dont support tx_pause close
  net: hns: typo fix of annotation info for hns_nic_reset_subtask()
  net: hns: Remove unnecessary device resource free
  net: hns: fix the error info when dma_set_mask_and_coherent fail
  net: hns: fix the wrong speed for bond

 drivers/net/ethernet/hisilicon/hns/hnae.c          |   1 -
 drivers/net/ethernet/hisilicon/hns/hnae.h          |   6 +-
 drivers/net/ethernet/hisilicon/hns/hns_ae_adapt.c  |  53 ++++--
 drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c | 190 ++++++++++++++-------
 drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.h |  12 +-
 drivers/net/ethernet/hisilicon/hns/hns_dsaf_misc.c |  44 +++--
 drivers/net/ethernet/hisilicon/hns/hns_dsaf_rcb.c  |   2 +-
 drivers/net/ethernet/hisilicon/hns/hns_dsaf_rcb.h  |   2 +-
 drivers/net/ethernet/hisilicon/hns/hns_dsaf_reg.h  |  21 ++-
 drivers/net/ethernet/hisilicon/hns/hns_enet.c      |  68 ++++----
 drivers/net/ethernet/hisilicon/hns/hns_ethtool.c   |  47 ++---
 11 files changed, 291 insertions(+), 155 deletions(-)

-- 
1.9.1

^ permalink raw reply	[flat|nested] 29+ messages in thread

* [PATCH net-next 01/19] net: hns: bug fix of ge reset sequence
  2016-06-21  3:56 [PATCH net-next 00/19] net: hns: fix some bugs in hns driver Yisen Zhuang
@ 2016-06-21  3:56 ` Yisen Zhuang
  2016-06-21 10:35   ` Andy Shevchenko
  2016-06-21  3:56 ` [PATCH net-next 02/19] net: hns: fix hns dsaf v1 dont support tx_pause close Yisen Zhuang
                   ` (18 subsequent siblings)
  19 siblings, 1 reply; 29+ messages in thread
From: Yisen Zhuang @ 2016-06-21  3:56 UTC (permalink / raw)
  To: davem, yisen.zhuang, salil.mehta, yankejian
  Cc: liguozhu, huangdaode, arnd, andriy.shevchenko, andrew,
	geliangtang, ivecera, fengguang.wu, charles.chenxin, netdev,
	linux-kernel, linux-arm-kernel, linuxarm

From: Qianqian Xie <xieqianqian@huawei.com>

The bit fileds of PPE reset register are different between HNS v1 and
HNS v2, but the current procedure just only match HNS v1. Here is a
patch to fix it.

Signed-off-by: Kejian Yan <yankejian@huawei.com>
Signed-off-by: Qianqian Xie <xieqianqian@huawei.com>
Signed-off-by: Yisen Zhuang <Yisen.Zhuang@huawei.com>
---
 drivers/net/ethernet/hisilicon/hns/hns_dsaf_misc.c | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_misc.c b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_misc.c
index 96cb628..09e60d6 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_misc.c
+++ b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_misc.c
@@ -271,7 +271,11 @@ static void hns_dsaf_ge_srst_by_port(struct dsaf_device *dsaf_dev, u32 port,
 		}
 	} else {
 		reg_val_1 = 0x15540 << dsaf_dev->reset_offset;
-		reg_val_2 = 0x100 << dsaf_dev->reset_offset;
+
+		if (AE_IS_VER1(dsaf_dev->dsaf_ver))
+			reg_val_2 = 0x100 << dsaf_dev->reset_offset;
+		else
+			reg_val_2 = 0x40 << dsaf_dev->reset_offset;
 
 		if (!dereset) {
 			dsaf_write_sub(dsaf_dev, DSAF_SUB_SC_GE_RESET_REQ1_REG,
-- 
1.9.1

^ permalink raw reply related	[flat|nested] 29+ messages in thread

* [PATCH net-next 02/19] net: hns: fix hns dsaf v1 dont support tx_pause close
  2016-06-21  3:56 [PATCH net-next 00/19] net: hns: fix some bugs in hns driver Yisen Zhuang
  2016-06-21  3:56 ` [PATCH net-next 01/19] net: hns: bug fix of ge reset sequence Yisen Zhuang
@ 2016-06-21  3:56 ` Yisen Zhuang
  2016-06-21  3:56 ` [PATCH net-next 03/19] net: hns: add skb_reset_mac_header() after skb being alloc Yisen Zhuang
                   ` (17 subsequent siblings)
  19 siblings, 0 replies; 29+ messages in thread
From: Yisen Zhuang @ 2016-06-21  3:56 UTC (permalink / raw)
  To: davem, yisen.zhuang, salil.mehta, yankejian
  Cc: liguozhu, huangdaode, arnd, andriy.shevchenko, andrew,
	geliangtang, ivecera, fengguang.wu, charles.chenxin, netdev,
	linux-kernel, linux-arm-kernel, linuxarm

From: Qianqian Xie <xieqiaqian@huawei.com>

For service port, hns dsaf v1 support to close tx_pause.
However, the port will be invalid when it run command
ethtool to close tx_pause. This patch will fix it.

Signed-off-by: Qianqian Xie <xieqiaqian@huawei.com>
Signed-off-by: Yisen Zhuang <Yisen.Zhuang@huawei.com>
---
 drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c
index ac03c4a..422f97d 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c
+++ b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c
@@ -1114,10 +1114,10 @@ int hns_dsaf_set_rx_mac_pause_en(struct dsaf_device *dsaf_dev, int mac_id,
 				 u32 en)
 {
 	if (AE_IS_VER1(dsaf_dev->dsaf_ver)) {
-		if (!en)
+		if (!en) {
 			dev_err(dsaf_dev->dev, "dsafv1 can't close rx_pause!\n");
-
-		return -EINVAL;
+			return -EINVAL;
+		}
 	}
 
 	dsaf_set_dev_bit(dsaf_dev, DSAF_PAUSE_CFG_REG + mac_id * 4,
-- 
1.9.1

^ permalink raw reply related	[flat|nested] 29+ messages in thread

* [PATCH net-next 03/19] net: hns: add skb_reset_mac_header() after skb being alloc
  2016-06-21  3:56 [PATCH net-next 00/19] net: hns: fix some bugs in hns driver Yisen Zhuang
  2016-06-21  3:56 ` [PATCH net-next 01/19] net: hns: bug fix of ge reset sequence Yisen Zhuang
  2016-06-21  3:56 ` [PATCH net-next 02/19] net: hns: fix hns dsaf v1 dont support tx_pause close Yisen Zhuang
@ 2016-06-21  3:56 ` Yisen Zhuang
  2016-06-21  3:56 ` [PATCH net-next 04/19] net: hns: typo fix of annotation info for hns_nic_reset_subtask() Yisen Zhuang
                   ` (16 subsequent siblings)
  19 siblings, 0 replies; 29+ messages in thread
From: Yisen Zhuang @ 2016-06-21  3:56 UTC (permalink / raw)
  To: davem, yisen.zhuang, salil.mehta, yankejian
  Cc: liguozhu, huangdaode, arnd, andriy.shevchenko, andrew,
	geliangtang, ivecera, fengguang.wu, charles.chenxin, netdev,
	linux-kernel, linux-arm-kernel, linuxarm

From: Kejian Yan <yankejian@huawei.com>

HNS receives a packet without doing anything, but it should call
skb_reset_mac_header() to initialize the header before using
eth_hdr().

Fixes: 0d6b425a3773c3445b0f51b2f333821beaacb619
Signed-off-by: Kejian Yan <yankejian@huawei.com>
Signed-off-by: Yisen Zhuang <Yisen.Zhuang@huawei.com>
---
 drivers/net/ethernet/hisilicon/hns/hns_enet.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/drivers/net/ethernet/hisilicon/hns/hns_enet.c b/drivers/net/ethernet/hisilicon/hns/hns_enet.c
index ad742a6..15200e4 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_enet.c
+++ b/drivers/net/ethernet/hisilicon/hns/hns_enet.c
@@ -600,6 +600,7 @@ static int hns_nic_poll_rx_skb(struct hns_nic_ring_data *ring_data,
 		ring->stats.sw_err_cnt++;
 		return -ENOMEM;
 	}
+	skb_reset_mac_header(skb);
 
 	prefetchw(skb->data);
 	length = le16_to_cpu(desc->rx.pkt_len);
-- 
1.9.1

^ permalink raw reply related	[flat|nested] 29+ messages in thread

* [PATCH net-next 04/19] net: hns: typo fix of annotation info for hns_nic_reset_subtask()
  2016-06-21  3:56 [PATCH net-next 00/19] net: hns: fix some bugs in hns driver Yisen Zhuang
                   ` (2 preceding siblings ...)
  2016-06-21  3:56 ` [PATCH net-next 03/19] net: hns: add skb_reset_mac_header() after skb being alloc Yisen Zhuang
@ 2016-06-21  3:56 ` Yisen Zhuang
  2016-06-21  3:56 ` [PATCH net-next 05/19] net: hns: Remove unnecessary device resource free Yisen Zhuang
                   ` (15 subsequent siblings)
  19 siblings, 0 replies; 29+ messages in thread
From: Yisen Zhuang @ 2016-06-21  3:56 UTC (permalink / raw)
  To: davem, yisen.zhuang, salil.mehta, yankejian
  Cc: liguozhu, huangdaode, arnd, andriy.shevchenko, andrew,
	geliangtang, ivecera, fengguang.wu, charles.chenxin, netdev,
	linux-kernel, linux-arm-kernel, linuxarm

From: Qianqian Xie <xieqianqian@huawei.com>

The annotation info for hns_nic_reset_subtask() should be
"for resetting subtask" instead of "for resetting suntask".

Signed-off-by: Qianqian Xie <xieqianqian@huawei.com>
Signed-off-by: Yisen Zhuang <Yisen.Zhuang@huawei.com>
---
 drivers/net/ethernet/hisilicon/hns/hns_enet.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/net/ethernet/hisilicon/hns/hns_enet.c b/drivers/net/ethernet/hisilicon/hns/hns_enet.c
index 15200e4..b978db4 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_enet.c
+++ b/drivers/net/ethernet/hisilicon/hns/hns_enet.c
@@ -1633,7 +1633,7 @@ static void hns_nic_dump(struct hns_nic_priv *priv)
 	}
 }
 
-/* for resetting suntask*/
+/* for resetting subtask */
 static void hns_nic_reset_subtask(struct hns_nic_priv *priv)
 {
 	enum hnae_port_type type = priv->ae_handle->port_type;
-- 
1.9.1

^ permalink raw reply related	[flat|nested] 29+ messages in thread

* [PATCH net-next 05/19] net: hns: Remove unnecessary device resource free
  2016-06-21  3:56 [PATCH net-next 00/19] net: hns: fix some bugs in hns driver Yisen Zhuang
                   ` (3 preceding siblings ...)
  2016-06-21  3:56 ` [PATCH net-next 04/19] net: hns: typo fix of annotation info for hns_nic_reset_subtask() Yisen Zhuang
@ 2016-06-21  3:56 ` Yisen Zhuang
  2016-06-21  3:56 ` [PATCH net-next 06/19] net: hns: fix the error info when dma_set_mask_and_coherent fail Yisen Zhuang
                   ` (14 subsequent siblings)
  19 siblings, 0 replies; 29+ messages in thread
From: Yisen Zhuang @ 2016-06-21  3:56 UTC (permalink / raw)
  To: davem, yisen.zhuang, salil.mehta, yankejian
  Cc: liguozhu, huangdaode, arnd, andriy.shevchenko, andrew,
	geliangtang, ivecera, fengguang.wu, charles.chenxin, netdev,
	linux-kernel, linux-arm-kernel, linuxarm

From: Qianqian Xie <xieqianqian@huawei.com>

The driver uses devm_ioremap_resource, it will unmap the map
automatically, remove the unnecessary the resource free.

Signed-off-by: Qianqian Xie <xieqianqian@huawei.com>
Reported-by: Kefeng Wang <wangkefeng.wang@huawei.com>
Signed-off-by: Yisen Zhuang <Yisen.Zhuang@huawei.com>
---
 drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c | 39 +++-------------------
 1 file changed, 4 insertions(+), 35 deletions(-)

diff --git a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c
index 422f97d..b8b2ff9 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c
+++ b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c
@@ -176,7 +176,7 @@ int hns_dsaf_get_cfg(struct dsaf_device *dsaf_dev)
 	    desc_num > HNS_DSAF_MAX_DESC_CNT) {
 		dev_err(dsaf_dev->dev, "get desc-num(%d) fail, ret=%d!\n",
 			desc_num, ret);
-		goto unmap_base_addr;
+		return -EINVAL;
 	}
 	dsaf_dev->desc_num = desc_num;
 
@@ -192,7 +192,7 @@ int hns_dsaf_get_cfg(struct dsaf_device *dsaf_dev)
 	if (ret < 0) {
 		dev_err(dsaf_dev->dev,
 			"get buf-size fail, ret=%d!\r\n", ret);
-		goto unmap_base_addr;
+		return ret;
 	}
 	dsaf_dev->buf_size = buf_size;
 
@@ -200,7 +200,7 @@ int hns_dsaf_get_cfg(struct dsaf_device *dsaf_dev)
 	if (dsaf_dev->buf_size_type < 0) {
 		dev_err(dsaf_dev->dev,
 			"buf_size(%d) is wrong!\n", buf_size);
-		goto unmap_base_addr;
+		return -EINVAL;
 	}
 
 	dsaf_dev->misc_op = hns_misc_op_get(dsaf_dev);
@@ -213,32 +213,6 @@ int hns_dsaf_get_cfg(struct dsaf_device *dsaf_dev)
 		dev_err(dsaf_dev->dev, "set mask to 64bit fail!\n");
 
 	return 0;
-
-unmap_base_addr:
-	if (dsaf_dev->io_base)
-		iounmap(dsaf_dev->io_base);
-	if (dsaf_dev->ppe_base)
-		iounmap(dsaf_dev->ppe_base);
-	if (dsaf_dev->sds_base)
-		iounmap(dsaf_dev->sds_base);
-	if (dsaf_dev->sc_base)
-		iounmap(dsaf_dev->sc_base);
-	return ret;
-}
-
-static void hns_dsaf_free_cfg(struct dsaf_device *dsaf_dev)
-{
-	if (dsaf_dev->io_base)
-		iounmap(dsaf_dev->io_base);
-
-	if (dsaf_dev->ppe_base)
-		iounmap(dsaf_dev->ppe_base);
-
-	if (dsaf_dev->sds_base)
-		iounmap(dsaf_dev->sds_base);
-
-	if (dsaf_dev->sc_base)
-		iounmap(dsaf_dev->sc_base);
 }
 
 /**
@@ -2645,7 +2619,7 @@ static int hns_dsaf_probe(struct platform_device *pdev)
 
 	ret = hns_dsaf_init(dsaf_dev);
 	if (ret)
-		goto free_cfg;
+		goto free_dev;
 
 	ret = hns_mac_init(dsaf_dev);
 	if (ret)
@@ -2670,9 +2644,6 @@ uninit_mac:
 uninit_dsaf:
 	hns_dsaf_free(dsaf_dev);
 
-free_cfg:
-	hns_dsaf_free_cfg(dsaf_dev);
-
 free_dev:
 	hns_dsaf_free_dev(dsaf_dev);
 
@@ -2695,8 +2666,6 @@ static int hns_dsaf_remove(struct platform_device *pdev)
 
 	hns_dsaf_free(dsaf_dev);
 
-	hns_dsaf_free_cfg(dsaf_dev);
-
 	hns_dsaf_free_dev(dsaf_dev);
 
 	return 0;
-- 
1.9.1

^ permalink raw reply related	[flat|nested] 29+ messages in thread

* [PATCH net-next 06/19] net: hns: fix the error info when dma_set_mask_and_coherent fail
  2016-06-21  3:56 [PATCH net-next 00/19] net: hns: fix some bugs in hns driver Yisen Zhuang
                   ` (4 preceding siblings ...)
  2016-06-21  3:56 ` [PATCH net-next 05/19] net: hns: Remove unnecessary device resource free Yisen Zhuang
@ 2016-06-21  3:56 ` Yisen Zhuang
  2016-06-21  3:56 ` [PATCH net-next 07/19] net: hns: select Hilink before serdes loopback for HNS V2 Yisen Zhuang
                   ` (13 subsequent siblings)
  19 siblings, 0 replies; 29+ messages in thread
From: Yisen Zhuang @ 2016-06-21  3:56 UTC (permalink / raw)
  To: davem, yisen.zhuang, salil.mehta, yankejian
  Cc: liguozhu, huangdaode, arnd, andriy.shevchenko, andrew,
	geliangtang, ivecera, fengguang.wu, charles.chenxin, netdev,
	linux-kernel, linux-arm-kernel, linuxarm

From: Qianqian Xie <xieqianqian@huawei.com>

The error info should be printed as "set mask to 64bit fail!" instead of
"set mask to 32bit fail!" in dma_set_mask_and_coherent().

Signed-off-by: Qianqian Xie <xieqianqian@huawei.com>
Signed-off-by: Yisen Zhuang <Yisen.Zhuang@huawei.com>
---
 drivers/net/ethernet/hisilicon/hns/hns_enet.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/net/ethernet/hisilicon/hns/hns_enet.c b/drivers/net/ethernet/hisilicon/hns/hns_enet.c
index b978db4..00e529f 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_enet.c
+++ b/drivers/net/ethernet/hisilicon/hns/hns_enet.c
@@ -1972,7 +1972,7 @@ static int hns_nic_dev_probe(struct platform_device *pdev)
 	if (!dma_set_mask_and_coherent(dev, DMA_BIT_MASK(64)))
 		dev_dbg(dev, "set mask to 64bit\n");
 	else
-		dev_err(dev, "set mask to 32bit fail!\n");
+		dev_err(dev, "set mask to 64bit fail!\n");
 
 	/* carrier off reporting is important to ethtool even BEFORE open */
 	netif_carrier_off(ndev);
-- 
1.9.1

^ permalink raw reply related	[flat|nested] 29+ messages in thread

* [PATCH net-next 07/19] net: hns: select Hilink before serdes loopback for HNS V2
  2016-06-21  3:56 [PATCH net-next 00/19] net: hns: fix some bugs in hns driver Yisen Zhuang
                   ` (5 preceding siblings ...)
  2016-06-21  3:56 ` [PATCH net-next 06/19] net: hns: fix the error info when dma_set_mask_and_coherent fail Yisen Zhuang
@ 2016-06-21  3:56 ` Yisen Zhuang
  2016-06-21  3:56 ` [PATCH net-next 08/19] net: hns: fix ethtool loopback fail bug Yisen Zhuang
                   ` (12 subsequent siblings)
  19 siblings, 0 replies; 29+ messages in thread
From: Yisen Zhuang @ 2016-06-21  3:56 UTC (permalink / raw)
  To: davem, yisen.zhuang, salil.mehta, yankejian
  Cc: liguozhu, huangdaode, arnd, andriy.shevchenko, andrew,
	geliangtang, ivecera, fengguang.wu, charles.chenxin, netdev,
	linux-kernel, linux-arm-kernel, linuxarm

From: Kejian Yan <yankejian@huawei.com>

As Hilink3 and Hilink4 use the same xge training and xge u adaptor for
HNSv2, it needs to select which Hilink to be set before relative serdes
being configed. The hilink_access_sel is the register to do that.

Signed-off-by: Kejian Yan <yankejian@huawei.com>
Signed-off-by: Yisen Zhuang <Yisen.Zhuang@huawei.com>
---
 drivers/net/ethernet/hisilicon/hns/hns_dsaf_misc.c | 26 +++++++++++++++++-----
 1 file changed, 20 insertions(+), 6 deletions(-)

diff --git a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_misc.c b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_misc.c
index 09e60d6..aff9d77 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_misc.c
+++ b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_misc.c
@@ -435,11 +435,6 @@ int hns_mac_get_sfp_prsnt(struct hns_mac_cb *mac_cb, int *sfp_prsnt)
  */
 static int hns_mac_config_sds_loopback(struct hns_mac_cb *mac_cb, bool en)
 {
-	/* port 0-3 hilink4 base is serdes_vaddr + 0x00280000
-	 * port 4-7 hilink3 base is serdes_vaddr + 0x00200000
-	 */
-	u8 *base_addr = (u8 *)mac_cb->serdes_vaddr +
-		       (mac_cb->mac_id <= 3 ? 0x00280000 : 0x00200000);
 	const u8 lane_id[] = {
 		0,	/* mac 0 -> lane 0 */
 		1,	/* mac 1 -> lane 1 */
@@ -465,11 +460,30 @@ static int hns_mac_config_sds_loopback(struct hns_mac_cb *mac_cb, bool en)
 	}
 
 	if (mac_cb->serdes_ctrl) {
-		u32 origin = dsaf_read_syscon(mac_cb->serdes_ctrl, reg_offset);
+		u32 origin;
+
+		if (!AE_IS_VER1(mac_cb->dsaf_dev->dsaf_ver)) {
+#define HILINK_ACCESS_SEL_CFG		0x40008
+			/* hilink4 & hilink3 use the same xge training and
+			 * xge u adaptor. There is a hilink access sel cfg
+			 * register to select which one to be configed
+			 */
+			if ((!HNS_DSAF_IS_DEBUG(mac_cb->dsaf_dev)) &&
+			    (mac_cb->mac_id <= 3))
+				dsaf_write_syscon(mac_cb->serdes_ctrl,
+						  HILINK_ACCESS_SEL_CFG, 0);
+			else
+				dsaf_write_syscon(mac_cb->serdes_ctrl,
+						  HILINK_ACCESS_SEL_CFG, 3);
+		}
+
+		origin = dsaf_read_syscon(mac_cb->serdes_ctrl, reg_offset);
 
 		dsaf_set_field(origin, 1ull << 10, 10, en);
 		dsaf_write_syscon(mac_cb->serdes_ctrl, reg_offset, origin);
 	} else {
+		u8 *base_addr = (u8 *)mac_cb->serdes_vaddr +
+				(mac_cb->mac_id <= 3 ? 0x00280000 : 0x00200000);
 		dsaf_set_reg_field(base_addr, reg_offset, 1ull << 10, 10, en);
 	}
 
-- 
1.9.1

^ permalink raw reply related	[flat|nested] 29+ messages in thread

* [PATCH net-next 08/19] net: hns: fix ethtool loopback fail bug
  2016-06-21  3:56 [PATCH net-next 00/19] net: hns: fix some bugs in hns driver Yisen Zhuang
                   ` (6 preceding siblings ...)
  2016-06-21  3:56 ` [PATCH net-next 07/19] net: hns: select Hilink before serdes loopback for HNS V2 Yisen Zhuang
@ 2016-06-21  3:56 ` Yisen Zhuang
  2016-06-21  3:56 ` [PATCH net-next 09/19] net: hns: fix the wrong speed for bond Yisen Zhuang
                   ` (11 subsequent siblings)
  19 siblings, 0 replies; 29+ messages in thread
From: Yisen Zhuang @ 2016-06-21  3:56 UTC (permalink / raw)
  To: davem, yisen.zhuang, salil.mehta, yankejian
  Cc: liguozhu, huangdaode, arnd, andriy.shevchenko, andrew,
	geliangtang, ivecera, fengguang.wu, charles.chenxin, netdev,
	linux-kernel, linux-arm-kernel, linuxarm

From: Kejian Yan <yankejian@huawei.com>

When run ethtool cmd(ethtool -t ethx) again and again for a long
time, it will be probabilistically fail. The PHYs' registers may
be on different pages, so it must be switch to the right page
before setting PHYs' registers.
And __lb_up() calls phy_start() to startup the PHYs device, but
this function may change Copper Control Register(Page 0, Register 0)
to an other value. It would cause phy loopback test fail. if we
remove phy_start(), we have to remove the relative phy_stop(),
phy_disconnect() when doing phy loopback to keep the phy stay in
right status.

Reported-by: hejun <hjat2005@huawei.com>
Signed-off-by: Kejian Yan <yankejian@huawei.com>
Signed-off-by: Yisen Zhuang <Yisen.Zhuang@huawei.com>
---
 drivers/net/ethernet/hisilicon/hns/hns_ethtool.c | 35 ++++++++++--------------
 1 file changed, 14 insertions(+), 21 deletions(-)

diff --git a/drivers/net/ethernet/hisilicon/hns/hns_ethtool.c b/drivers/net/ethernet/hisilicon/hns/hns_ethtool.c
index a809f52..5b3dccb 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_ethtool.c
+++ b/drivers/net/ethernet/hisilicon/hns/hns_ethtool.c
@@ -242,6 +242,7 @@ static const char hns_nic_test_strs[][ETH_GSTRING_LEN] = {
 static int hns_nic_config_phy_loopback(struct phy_device *phy_dev, u8 en)
 {
 #define COPPER_CONTROL_REG 0
+#define PHY_POWER_DOWN BIT(11)
 #define PHY_LOOP_BACK BIT(14)
 	u16 val = 0;
 
@@ -252,33 +253,40 @@ static int hns_nic_config_phy_loopback(struct phy_device *phy_dev, u8 en)
 		/* speed : 1000M */
 		phy_write(phy_dev, HNS_PHY_PAGE_REG, 2);
 		phy_write(phy_dev, 21, 0x1046);
+
+		phy_write(phy_dev, HNS_PHY_PAGE_REG, 0);
 		/* Force Master */
 		phy_write(phy_dev, 9, 0x1F00);
+
 		/* Soft-reset */
 		phy_write(phy_dev, 0, 0x9140);
 		/* If autoneg disabled,two soft-reset operations */
 		phy_write(phy_dev, 0, 0x9140);
-		phy_write(phy_dev, 22, 0xFA);
+
+		phy_write(phy_dev, HNS_PHY_PAGE_REG, 0xFA);
 
 		/* Default is 0x0400 */
 		phy_write(phy_dev, 1, 0x418);
 
 		/* Force 1000M Link, Default is 0x0200 */
 		phy_write(phy_dev, 7, 0x20C);
-		phy_write(phy_dev, 22, 0);
+		phy_write(phy_dev, HNS_PHY_PAGE_REG, 0);
 
-		/* Enable MAC loop-back */
+		/* Enable PHY loop-back */
 		val = phy_read(phy_dev, COPPER_CONTROL_REG);
 		val |= PHY_LOOP_BACK;
+		val &= ~PHY_POWER_DOWN;
 		phy_write(phy_dev, COPPER_CONTROL_REG, val);
 	} else {
-		phy_write(phy_dev, 22, 0xFA);
+		phy_write(phy_dev, HNS_PHY_PAGE_REG, 0xFA);
 		phy_write(phy_dev, 1, 0x400);
 		phy_write(phy_dev, 7, 0x200);
-		phy_write(phy_dev, 22, 0);
+		phy_write(phy_dev, HNS_PHY_PAGE_REG, 0);
+		phy_write(phy_dev, 9, 0xF00);
 
 		val = phy_read(phy_dev, COPPER_CONTROL_REG);
 		val &= ~PHY_LOOP_BACK;
+		val |= PHY_POWER_DOWN;
 		phy_write(phy_dev, COPPER_CONTROL_REG, val);
 	}
 	return 0;
@@ -339,28 +347,16 @@ static int __lb_up(struct net_device *ndev,
 
 	hns_nic_net_reset(ndev);
 
-	if (priv->phy) {
-		phy_disconnect(priv->phy);
-		msleep(100);
-
-		ret = hns_nic_init_phy(ndev, h);
-		if (ret)
-			return ret;
-	}
-
 	ret = __lb_setup(ndev, loop_mode);
 	if (ret)
 		return ret;
 
-	msleep(100);
+	msleep(200);
 
 	ret = h->dev->ops->start ? h->dev->ops->start(h) : 0;
 	if (ret)
 		return ret;
 
-	if (priv->phy)
-		phy_start(priv->phy);
-
 	/* link adjust duplex*/
 	if (priv->ae_handle->phy_if != PHY_INTERFACE_MODE_XGMII)
 		speed = 1000;
@@ -561,9 +557,6 @@ static int __lb_down(struct net_device *ndev)
 			   __func__,
 			   ret);
 
-	if (priv->phy)
-		phy_stop(priv->phy);
-
 	if (h->dev->ops->stop)
 		h->dev->ops->stop(h);
 
-- 
1.9.1

^ permalink raw reply related	[flat|nested] 29+ messages in thread

* [PATCH net-next 09/19] net: hns: fix the wrong speed for bond
  2016-06-21  3:56 [PATCH net-next 00/19] net: hns: fix some bugs in hns driver Yisen Zhuang
                   ` (7 preceding siblings ...)
  2016-06-21  3:56 ` [PATCH net-next 08/19] net: hns: fix ethtool loopback fail bug Yisen Zhuang
@ 2016-06-21  3:56 ` Yisen Zhuang
  2016-06-21  3:56 ` [PATCH net-next 10/19] net: hns: bugfix about pfc pause frame statistics Yisen Zhuang
                   ` (10 subsequent siblings)
  19 siblings, 0 replies; 29+ messages in thread
From: Yisen Zhuang @ 2016-06-21  3:56 UTC (permalink / raw)
  To: davem, yisen.zhuang, salil.mehta, yankejian
  Cc: liguozhu, huangdaode, arnd, andriy.shevchenko, andrew,
	geliangtang, ivecera, fengguang.wu, charles.chenxin, netdev,
	linux-kernel, linux-arm-kernel, linuxarm

From: Qianqian Xie <xieqianqian@huawei.com>

For debug-ports,there are two non-synchronized processes:
Speed-Auto-Negotiation and Link-Update-Status. The two
processes are towed by two different state machines.
Bond reads the speed when link up, but the speed maybe
not update the right value at that time.That make for bond's
wrong speed. Thus only one state machine should be used and
if phy_state_machine is used, it does not need to do
hns_nic_update_link_status().

Signed-off-by: Qianqian Xie <xieqianqian@huawei.com>
Signed-off-by: Yisen Zhuang <Yisen.Zhuang@huawei.com>
---
 drivers/net/ethernet/hisilicon/hns/hns_enet.c    | 43 +++++++++++++-----------
 drivers/net/ethernet/hisilicon/hns/hns_ethtool.c |  2 +-
 2 files changed, 25 insertions(+), 20 deletions(-)

diff --git a/drivers/net/ethernet/hisilicon/hns/hns_enet.c b/drivers/net/ethernet/hisilicon/hns/hns_enet.c
index 00e529f..cef9d12 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_enet.c
+++ b/drivers/net/ethernet/hisilicon/hns/hns_enet.c
@@ -991,8 +991,26 @@ static void hns_nic_adjust_link(struct net_device *ndev)
 {
 	struct hns_nic_priv *priv = netdev_priv(ndev);
 	struct hnae_handle *h = priv->ae_handle;
+	int state = 1;
+
+	if (priv->phy) {
+		h->dev->ops->adjust_link(h, ndev->phydev->speed,
+					 ndev->phydev->duplex);
+		state = priv->phy->link;
+	}
+	state = state && h->dev->ops->get_status(h);
 
-	h->dev->ops->adjust_link(h, ndev->phydev->speed, ndev->phydev->duplex);
+	if (state != priv->link) {
+		if (state) {
+			netif_carrier_on(ndev);
+			netif_tx_wake_all_queues(ndev);
+			netdev_info(ndev, "link up\n");
+		} else {
+			netif_carrier_off(ndev);
+			netdev_info(ndev, "link down\n");
+		}
+		priv->link = state;
+	}
 }
 
 /**
@@ -1577,27 +1595,14 @@ static void hns_nic_update_link_status(struct net_device *netdev)
 	struct hns_nic_priv *priv = netdev_priv(netdev);
 
 	struct hnae_handle *h = priv->ae_handle;
-	int state = 1;
 
-	if (priv->phy) {
-		if (!genphy_update_link(priv->phy))
-			state = priv->phy->link;
-		else
-			state = 0;
-	}
-	state = state && h->dev->ops->get_status(h);
+	if (h->phy_dev) {
+		if (h->phy_if != PHY_INTERFACE_MODE_XGMII)
+			return;
 
-	if (state != priv->link) {
-		if (state) {
-			netif_carrier_on(netdev);
-			netif_tx_wake_all_queues(netdev);
-			netdev_info(netdev, "link up\n");
-		} else {
-			netif_carrier_off(netdev);
-			netdev_info(netdev, "link down\n");
-		}
-		priv->link = state;
+		(void)genphy_read_status(h->phy_dev);
 	}
+	hns_nic_adjust_link(netdev);
 }
 
 /* for dumping key regs*/
diff --git a/drivers/net/ethernet/hisilicon/hns/hns_ethtool.c b/drivers/net/ethernet/hisilicon/hns/hns_ethtool.c
index 5b3dccb..564ae1e 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_ethtool.c
+++ b/drivers/net/ethernet/hisilicon/hns/hns_ethtool.c
@@ -49,7 +49,7 @@ static u32 hns_nic_get_link(struct net_device *net_dev)
 	h = priv->ae_handle;
 
 	if (priv->phy) {
-		if (!genphy_update_link(priv->phy))
+		if (!genphy_read_status(priv->phy))
 			link_stat = priv->phy->link;
 		else
 			link_stat = 0;
-- 
1.9.1

^ permalink raw reply related	[flat|nested] 29+ messages in thread

* [PATCH net-next 10/19] net: hns: bugfix about pfc pause frame statistics
  2016-06-21  3:56 [PATCH net-next 00/19] net: hns: fix some bugs in hns driver Yisen Zhuang
                   ` (8 preceding siblings ...)
  2016-06-21  3:56 ` [PATCH net-next 09/19] net: hns: fix the wrong speed for bond Yisen Zhuang
@ 2016-06-21  3:56 ` Yisen Zhuang
  2016-06-21 10:32   ` Andy Shevchenko
  2016-06-21  3:56 ` [PATCH net-next 11/19] net: hns: add spin lock for tcam table operation Yisen Zhuang
                   ` (9 subsequent siblings)
  19 siblings, 1 reply; 29+ messages in thread
From: Yisen Zhuang @ 2016-06-21  3:56 UTC (permalink / raw)
  To: davem, yisen.zhuang, salil.mehta, yankejian
  Cc: liguozhu, huangdaode, arnd, andriy.shevchenko, andrew,
	geliangtang, ivecera, fengguang.wu, charles.chenxin, netdev,
	linux-kernel, linux-arm-kernel, linuxarm

From: Daode Huang <huangdaode@hisilicon.com>

For SoC hip06, PFC pause handled in dsaf, while hip05 in XGMAC,
so change the statistics of pfc pause in dsaf and remove the old
pfc pause frame statistics.

Signed-off-by: Daode Huang <huangdaode@hisilicon.com>
Signed-off-by: Yisen Zhuang <Yisen.Zhuang@huawei.com>
---
 drivers/net/ethernet/hisilicon/hns/hns_ae_adapt.c  |  6 +-
 drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c | 72 +++++++++++++++++++---
 drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.h | 10 ++-
 drivers/net/ethernet/hisilicon/hns/hns_dsaf_reg.h  |  5 ++
 4 files changed, 81 insertions(+), 12 deletions(-)

diff --git a/drivers/net/ethernet/hisilicon/hns/hns_ae_adapt.c b/drivers/net/ethernet/hisilicon/hns/hns_ae_adapt.c
index d37b778..b97cc75 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_ae_adapt.c
+++ b/drivers/net/ethernet/hisilicon/hns/hns_ae_adapt.c
@@ -587,6 +587,7 @@ void hns_ae_get_strings(struct hnae_handle *handle,
 	int idx;
 	struct hns_mac_cb *mac_cb;
 	struct hns_ppe_cb *ppe_cb;
+	struct dsaf_device *dsaf_dev = hns_ae_get_dsaf_dev(handle->dev);
 	u8 *p = data;
 	struct	hnae_vf_cb *vf_cb;
 
@@ -609,13 +610,14 @@ void hns_ae_get_strings(struct hnae_handle *handle,
 	p += ETH_GSTRING_LEN * hns_mac_get_sset_count(mac_cb, stringset);
 
 	if (mac_cb->mac_type == HNAE_PORT_SERVICE)
-		hns_dsaf_get_strings(stringset, p, port);
+		hns_dsaf_get_strings(stringset, p, port, dsaf_dev);
 }
 
 int hns_ae_get_sset_count(struct hnae_handle *handle, int stringset)
 {
 	u32 sset_count = 0;
 	struct hns_mac_cb *mac_cb;
+	struct dsaf_device *dsaf_dev = hns_ae_get_dsaf_dev(handle->dev);
 
 	assert(handle);
 
@@ -626,7 +628,7 @@ int hns_ae_get_sset_count(struct hnae_handle *handle, int stringset)
 	sset_count += hns_mac_get_sset_count(mac_cb, stringset);
 
 	if (mac_cb->mac_type == HNAE_PORT_SERVICE)
-		sset_count += hns_dsaf_get_sset_count(stringset);
+		sset_count += hns_dsaf_get_sset_count(dsaf_dev, stringset);
 
 	return sset_count;
 }
diff --git a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c
index b8b2ff9..0edea9c 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c
+++ b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c
@@ -2096,11 +2096,24 @@ void hns_dsaf_fix_mac_mode(struct hns_mac_cb *mac_cb)
 	hns_dsaf_port_work_rate_cfg(dsaf_dev, mac_id, mode);
 }
 
+static u32 hns_dsaf_get_inode_prio_reg(int index)
+{
+	int base_index, offset;
+	u32 base_addr = DSAF_INODE_IN_PRIO_PAUSE_BASE_REG;
+
+	base_index = (index + 1) / DSAF_REG_PER_ZONE;
+	offset = (index + 1) % DSAF_REG_PER_ZONE;
+
+	return base_addr + DSAF_INODE_IN_PRIO_PAUSE_BASE_OFFSET * base_index +
+		DSAF_INODE_IN_PRIO_PAUSE_OFFSET * offset;
+}
+
 void hns_dsaf_update_stats(struct dsaf_device *dsaf_dev, u32 node_num)
 {
 	struct dsaf_hw_stats *hw_stats
 		= &dsaf_dev->hw_stats[node_num];
 	bool is_ver1 = AE_IS_VER1(dsaf_dev->dsaf_ver);
+	int i;
 	u32 reg_tmp;
 
 	hw_stats->pad_drop += dsaf_read_dev(dsaf_dev,
@@ -2135,6 +2148,18 @@ void hns_dsaf_update_stats(struct dsaf_device *dsaf_dev, u32 node_num)
 	hw_stats->stp_drop += dsaf_read_dev(dsaf_dev,
 		DSAF_INODE_IN_DATA_STP_DISC_0_REG + 0x80 * (u64)node_num);
 
+	/* pfc pause frame statistics stored in dsaf inode*/
+	if ((node_num < DSAF_SERVICE_NW_NUM) && !is_ver1) {
+		for (i = 0; i < DSAF_PRIO_NR; i++) {
+			reg_tmp = hns_dsaf_get_inode_prio_reg(i);
+			hw_stats->rx_pfc[i] += dsaf_read_dev(dsaf_dev,
+				reg_tmp + 0x4 * (u64)node_num);
+			hw_stats->tx_pfc[i] += dsaf_read_dev(dsaf_dev,
+				DSAF_XOD_XGE_PFC_PRIO_CNT_BASE_REG +
+				DSAF_XOD_XGE_PFC_PRIO_CNT_OFFSET * i +
+				0xF0 * (u64)node_num);
+		}
+	}
 	hw_stats->tx_pkts += dsaf_read_dev(dsaf_dev,
 		DSAF_XOD_RCVPKT_CNT_0_REG + 0x90 * (u64)node_num);
 }
@@ -2472,9 +2497,12 @@ void hns_dsaf_get_regs(struct dsaf_device *ddev, u32 port, void *data)
 		p[i] = 0xdddddddd;
 }
 
-static char *hns_dsaf_get_node_stats_strings(char *data, int node)
+static char *hns_dsaf_get_node_stats_strings(char *data, int node,
+					     struct dsaf_device *dsaf_dev)
 {
 	char *buff = data;
+	int i;
+	bool is_ver1 = AE_IS_VER1(dsaf_dev->dsaf_ver);
 
 	snprintf(buff, ETH_GSTRING_LEN, "innod%d_pad_drop_pkts", node);
 	buff = buff + ETH_GSTRING_LEN;
@@ -2502,6 +2530,18 @@ static char *hns_dsaf_get_node_stats_strings(char *data, int node)
 	buff = buff + ETH_GSTRING_LEN;
 	snprintf(buff, ETH_GSTRING_LEN, "innod%d_stp_drop_pkts", node);
 	buff = 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 = 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);
+			buff = buff + ETH_GSTRING_LEN;
+		}
+	}
 	snprintf(buff, ETH_GSTRING_LEN, "onnod%d_tx_pkts", node);
 	buff = buff + ETH_GSTRING_LEN;
 
@@ -2512,7 +2552,9 @@ static u64 *hns_dsaf_get_node_stats(struct dsaf_device *ddev, u64 *data,
 				    int node_num)
 {
 	u64 *p = data;
+	int i;
 	struct dsaf_hw_stats *hw_stats = &ddev->hw_stats[node_num];
+	bool is_ver1 = AE_IS_VER1(ddev->dsaf_ver);
 
 	p[0] = hw_stats->pad_drop;
 	p[1] = hw_stats->man_pkts;
@@ -2527,8 +2569,16 @@ static u64 *hns_dsaf_get_node_stats(struct dsaf_device *ddev, u64 *data,
 	p[10] = hw_stats->local_addr_false;
 	p[11] = hw_stats->vlan_drop;
 	p[12] = hw_stats->stp_drop;
-	p[13] = hw_stats->tx_pkts;
+	if ((node_num < DSAF_SERVICE_NW_NUM) && (!is_ver1)) {
+		for (i = 0; i < DSAF_PRIO_NR; i++) {
+			p[13 + i] = hw_stats->rx_pfc[i];
+			p[13 + i + DSAF_PRIO_NR] = hw_stats->tx_pfc[i];
+		}
+		p[29] = hw_stats->tx_pkts;
+		return &p[30];
+	}
 
+	p[13] = hw_stats->tx_pkts;
 	return &p[14];
 }
 
@@ -2556,11 +2606,16 @@ void hns_dsaf_get_stats(struct dsaf_device *ddev, u64 *data, int port)
  *@stringset: type of values in data
  *return dsaf string name count
  */
-int hns_dsaf_get_sset_count(int stringset)
+int hns_dsaf_get_sset_count(struct dsaf_device *dsaf_dev, int stringset)
 {
-	if (stringset == ETH_SS_STATS)
-		return DSAF_STATIC_NUM;
+	bool is_ver1 = AE_IS_VER1(dsaf_dev->dsaf_ver);
 
+	if (stringset == ETH_SS_STATS) {
+		if (is_ver1)
+			return DSAF_STATIC_NUM;
+		else
+			return DSAF_V2_STATIC_NUM;
+	}
 	return 0;
 }
 
@@ -2570,7 +2625,8 @@ int hns_dsaf_get_sset_count(int stringset)
  *@data:strings name value
  *@port:port index
  */
-void hns_dsaf_get_strings(int stringset, u8 *data, int port)
+void hns_dsaf_get_strings(int stringset, u8 *data, int port,
+			  struct dsaf_device *dsaf_dev)
 {
 	char *buff = (char *)data;
 	int node = port;
@@ -2579,11 +2635,11 @@ void hns_dsaf_get_strings(int stringset, u8 *data, int port)
 		return;
 
 	/* for ge/xge node info */
-	buff = hns_dsaf_get_node_stats_strings(buff, node);
+	buff = hns_dsaf_get_node_stats_strings(buff, node, dsaf_dev);
 
 	/* for ppe node info */
 	node = port + DSAF_PPE_INODE_BASE;
-	(void)hns_dsaf_get_node_stats_strings(buff, node);
+	(void)hns_dsaf_get_node_stats_strings(buff, node, dsaf_dev);
 }
 
 /**
diff --git a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.h b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.h
index 2e55b3c..00a13de 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.h
+++ b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.h
@@ -39,6 +39,9 @@ struct hns_mac_cb;
 
 #define DSAF_DUMP_REGS_NUM 504
 #define DSAF_STATIC_NUM 28
+#define DSAF_V2_STATIC_NUM	44
+#define DSAF_PRIO_NR	8
+#define DSAF_REG_PER_ZONE	3
 
 #define DSAF_STATS_READ(p, offset) (*((u64 *)((u8 *)(p) + (offset))))
 #define HNS_DSAF_IS_DEBUG(dev) (dev->dsaf_mode == DSAF_MODE_DISABLE_SP)
@@ -176,6 +179,8 @@ struct dsaf_hw_stats {
 	u64 local_addr_false;
 	u64 vlan_drop;
 	u64 stp_drop;
+	u64 rx_pfc[DSAF_PRIO_NR];
+	u64 tx_pfc[DSAF_PRIO_NR];
 	u64 tx_pkts;
 };
 
@@ -417,9 +422,10 @@ void hns_dsaf_ae_uninit(struct dsaf_device *dsaf_dev);
 
 void hns_dsaf_update_stats(struct dsaf_device *dsaf_dev, u32 inode_num);
 
-int hns_dsaf_get_sset_count(int stringset);
+int hns_dsaf_get_sset_count(struct dsaf_device *dsaf_dev, int stringset);
 void hns_dsaf_get_stats(struct dsaf_device *ddev, u64 *data, int port);
-void hns_dsaf_get_strings(int stringset, u8 *data, int port);
+void hns_dsaf_get_strings(int stringset, u8 *data, int port,
+			  struct dsaf_device *dsaf_dev);
 
 void hns_dsaf_get_regs(struct dsaf_device *ddev, u32 port, void *data);
 int hns_dsaf_get_regs_count(void);
diff --git a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_reg.h b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_reg.h
index 7c3b510..e35d0cb 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_reg.h
+++ b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_reg.h
@@ -166,6 +166,9 @@
 #define DSAF_INODE_GE_FC_EN_0_REG		0x1B00
 #define DSAF_INODE_VC0_IN_PKT_NUM_0_REG		0x1B50
 #define DSAF_INODE_VC1_IN_PKT_NUM_0_REG		0x1C00
+#define DSAF_INODE_IN_PRIO_PAUSE_BASE_REG	0x1C00
+#define DSAF_INODE_IN_PRIO_PAUSE_BASE_OFFSET	0x100
+#define DSAF_INODE_IN_PRIO_PAUSE_OFFSET		0x50
 
 #define DSAF_SBM_CFG_REG_0_REG			0x2000
 #define DSAF_SBM_BP_CFG_0_XGE_REG_0_REG		0x2004
@@ -232,6 +235,8 @@
 #define DSAF_XOD_ROCEE_RCVIN0_CNT_0_REG		0x3074
 #define DSAF_XOD_ROCEE_RCVIN1_CNT_0_REG		0x3078
 #define DSAF_XOD_FIFO_STATUS_0_REG		0x307C
+#define DSAF_XOD_XGE_PFC_PRIO_CNT_BASE_REG	0x3A00
+#define DSAF_XOD_XGE_PFC_PRIO_CNT_OFFSET	0x4
 
 #define DSAF_VOQ_ECC_INVERT_EN_0_REG		0x4004
 #define DSAF_VOQ_SRAM_PKT_NUM_0_REG		0x4008
-- 
1.9.1

^ permalink raw reply related	[flat|nested] 29+ messages in thread

* [PATCH net-next 11/19] net: hns: add spin lock for tcam table operation
  2016-06-21  3:56 [PATCH net-next 00/19] net: hns: fix some bugs in hns driver Yisen Zhuang
                   ` (9 preceding siblings ...)
  2016-06-21  3:56 ` [PATCH net-next 10/19] net: hns: bugfix about pfc pause frame statistics Yisen Zhuang
@ 2016-06-21  3:56 ` Yisen Zhuang
  2016-06-21  3:56 ` [PATCH net-next 12/19] net: hns: fix bug of getting the wrong tcam data Yisen Zhuang
                   ` (8 subsequent siblings)
  19 siblings, 0 replies; 29+ messages in thread
From: Yisen Zhuang @ 2016-06-21  3:56 UTC (permalink / raw)
  To: davem, yisen.zhuang, salil.mehta, yankejian
  Cc: liguozhu, huangdaode, arnd, andriy.shevchenko, andrew,
	geliangtang, ivecera, fengguang.wu, charles.chenxin, netdev,
	linux-kernel, linux-arm-kernel, linuxarm

From: Daode Huang <huangdaode@hisilicon.com>

This patch adds spin lock for tcam table operation,
there maybe a race condition happens when more than
one thread try to change the tcam talbe entries.

Signed-off-by: Daode Huang <huangdaode@hisilicon.com>
Signed-off-by: Yisen Zhuang <Yisen.Zhuang@huawei.com>
---
 drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c | 25 ++++++++++++++++++++++
 drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.h |  2 ++
 2 files changed, 27 insertions(+)

diff --git a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c
index 0edea9c..0958ceb 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c
+++ b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c
@@ -860,6 +860,8 @@ static void hns_dsaf_single_line_tbl_cfg(
 	struct dsaf_device *dsaf_dev,
 	u32 address, struct dsaf_tbl_line_cfg *ptbl_line)
 {
+	spin_lock_bh(&dsaf_dev->tcam_lock);
+
 	/*Write Addr*/
 	hns_dsaf_tbl_line_addr_cfg(dsaf_dev, address);
 
@@ -868,6 +870,8 @@ static void hns_dsaf_single_line_tbl_cfg(
 
 	/*Write Plus*/
 	hns_dsaf_tbl_line_pul(dsaf_dev);
+
+	spin_unlock_bh(&dsaf_dev->tcam_lock);
 }
 
 /**
@@ -881,6 +885,8 @@ static void hns_dsaf_tcam_uc_cfg(
 	struct dsaf_tbl_tcam_data *ptbl_tcam_data,
 	struct dsaf_tbl_tcam_ucast_cfg *ptbl_tcam_ucast)
 {
+	spin_lock_bh(&dsaf_dev->tcam_lock);
+
 	/*Write Addr*/
 	hns_dsaf_tbl_tcam_addr_cfg(dsaf_dev, address);
 	/*Write Tcam Data*/
@@ -889,6 +895,8 @@ static void hns_dsaf_tcam_uc_cfg(
 	hns_dsaf_tbl_tcam_ucast_cfg(dsaf_dev, ptbl_tcam_ucast);
 	/*Write Plus*/
 	hns_dsaf_tbl_tcam_data_ucast_pul(dsaf_dev);
+
+	spin_unlock_bh(&dsaf_dev->tcam_lock);
 }
 
 /**
@@ -903,6 +911,8 @@ static void hns_dsaf_tcam_mc_cfg(
 	struct dsaf_tbl_tcam_data *ptbl_tcam_data,
 	struct dsaf_tbl_tcam_mcast_cfg *ptbl_tcam_mcast)
 {
+	spin_lock_bh(&dsaf_dev->tcam_lock);
+
 	/*Write Addr*/
 	hns_dsaf_tbl_tcam_addr_cfg(dsaf_dev, address);
 	/*Write Tcam Data*/
@@ -911,6 +921,8 @@ static void hns_dsaf_tcam_mc_cfg(
 	hns_dsaf_tbl_tcam_mcast_cfg(dsaf_dev, ptbl_tcam_mcast);
 	/*Write Plus*/
 	hns_dsaf_tbl_tcam_data_mcast_pul(dsaf_dev);
+
+	spin_unlock_bh(&dsaf_dev->tcam_lock);
 }
 
 /**
@@ -920,6 +932,8 @@ static void hns_dsaf_tcam_mc_cfg(
  */
 static void hns_dsaf_tcam_mc_invld(struct dsaf_device *dsaf_dev, u32 address)
 {
+	spin_lock_bh(&dsaf_dev->tcam_lock);
+
 	/*Write Addr*/
 	hns_dsaf_tbl_tcam_addr_cfg(dsaf_dev, address);
 
@@ -932,6 +946,8 @@ static void hns_dsaf_tcam_mc_invld(struct dsaf_device *dsaf_dev, u32 address)
 
 	/*Write Plus*/
 	hns_dsaf_tbl_tcam_mcast_pul(dsaf_dev);
+
+	spin_unlock_bh(&dsaf_dev->tcam_lock);
 }
 
 /**
@@ -949,6 +965,8 @@ static void hns_dsaf_tcam_uc_get(
 	u32 tcam_read_data0;
 	u32 tcam_read_data4;
 
+	spin_lock_bh(&dsaf_dev->tcam_lock);
+
 	/*Write Addr*/
 	hns_dsaf_tbl_tcam_addr_cfg(dsaf_dev, address);
 
@@ -981,6 +999,8 @@ static void hns_dsaf_tcam_uc_get(
 				 DSAF_TBL_UCAST_CFG1_OUT_PORT_S);
 	ptbl_tcam_ucast->tbl_ucast_dvc
 		= dsaf_get_bit(tcam_read_data0, DSAF_TBL_UCAST_CFG1_DVC_S);
+
+	spin_unlock_bh(&dsaf_dev->tcam_lock);
 }
 
 /**
@@ -997,6 +1017,8 @@ static void hns_dsaf_tcam_mc_get(
 {
 	u32 data_tmp;
 
+	spin_lock_bh(&dsaf_dev->tcam_lock);
+
 	/*Write Addr*/
 	hns_dsaf_tbl_tcam_addr_cfg(dsaf_dev, address);
 
@@ -1027,6 +1049,8 @@ static void hns_dsaf_tcam_mc_get(
 	ptbl_tcam_mcast->tbl_mcast_port_msk[4] =
 		dsaf_get_field(data_tmp, DSAF_TBL_MCAST_CFG4_VM128_112_M,
 			       DSAF_TBL_MCAST_CFG4_VM128_112_S);
+
+	spin_unlock_bh(&dsaf_dev->tcam_lock);
 }
 
 /**
@@ -1351,6 +1375,7 @@ static int hns_dsaf_init(struct dsaf_device *dsaf_dev)
 	if (HNS_DSAF_IS_DEBUG(dsaf_dev))
 		return 0;
 
+	spin_lock_init(&dsaf_dev->tcam_lock);
 	ret = hns_dsaf_init_hw(dsaf_dev);
 	if (ret)
 		return ret;
diff --git a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.h b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.h
index 00a13de..1daf018 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.h
+++ b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.h
@@ -322,6 +322,8 @@ struct dsaf_device {
 
 	struct dsaf_hw_stats hw_stats[DSAF_NODE_NUM];
 	struct dsaf_int_stat int_stat;
+	/* make sure tcam table config spinlock */
+	spinlock_t tcam_lock;
 };
 
 static inline void *hns_dsaf_dev_priv(const struct dsaf_device *dsaf_dev)
-- 
1.9.1

^ permalink raw reply related	[flat|nested] 29+ messages in thread

* [PATCH net-next 12/19] net: hns: fix bug of getting the wrong tcam data
  2016-06-21  3:56 [PATCH net-next 00/19] net: hns: fix some bugs in hns driver Yisen Zhuang
                   ` (10 preceding siblings ...)
  2016-06-21  3:56 ` [PATCH net-next 11/19] net: hns: add spin lock for tcam table operation Yisen Zhuang
@ 2016-06-21  3:56 ` Yisen Zhuang
  2016-06-21  3:56 ` [PATCH net-next 13/19] net: hns: add get_coalesce_range api for hns Yisen Zhuang
                   ` (7 subsequent siblings)
  19 siblings, 0 replies; 29+ messages in thread
From: Yisen Zhuang @ 2016-06-21  3:56 UTC (permalink / raw)
  To: davem, yisen.zhuang, salil.mehta, yankejian
  Cc: liguozhu, huangdaode, arnd, andriy.shevchenko, andrew,
	geliangtang, ivecera, fengguang.wu, charles.chenxin, netdev,
	linux-kernel, linux-arm-kernel, linuxarm

From: Daode Huang <huangdaode@hisilicon.com>

The current driver stores the high bit value of tcam data register
to the tcam data low element, stores the low bit value of tcam data
register to tcam data high element, this patch fixes this bug.

Signed-off-by: Daode Huang <huangdaode@hisilicon.com>
Signed-off-by: Yisen Zhuang <Yisen.Zhuang@huawei.com>
---
 drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c
index 0958ceb..7f5c248 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c
+++ b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c
@@ -975,9 +975,9 @@ static void hns_dsaf_tcam_uc_get(
 
 	/*read tcam data*/
 	ptbl_tcam_data->tbl_tcam_data_high
-		= dsaf_read_dev(dsaf_dev, DSAF_TBL_TCAM_RDATA_LOW_0_REG);
-	ptbl_tcam_data->tbl_tcam_data_low
 		= dsaf_read_dev(dsaf_dev, DSAF_TBL_TCAM_RDATA_HIGH_0_REG);
+	ptbl_tcam_data->tbl_tcam_data_low
+		= dsaf_read_dev(dsaf_dev, DSAF_TBL_TCAM_RDATA_LOW_0_REG);
 
 	/*read tcam mcast*/
 	tcam_read_data0 = dsaf_read_dev(dsaf_dev,
@@ -1027,9 +1027,9 @@ static void hns_dsaf_tcam_mc_get(
 
 	/*read tcam data*/
 	ptbl_tcam_data->tbl_tcam_data_high =
-		dsaf_read_dev(dsaf_dev, DSAF_TBL_TCAM_RDATA_LOW_0_REG);
-	ptbl_tcam_data->tbl_tcam_data_low =
 		dsaf_read_dev(dsaf_dev, DSAF_TBL_TCAM_RDATA_HIGH_0_REG);
+	ptbl_tcam_data->tbl_tcam_data_low =
+		dsaf_read_dev(dsaf_dev, DSAF_TBL_TCAM_RDATA_LOW_0_REG);
 
 	/*read tcam mcast*/
 	ptbl_tcam_mcast->tbl_mcast_port_msk[0] =
-- 
1.9.1

^ permalink raw reply related	[flat|nested] 29+ messages in thread

* [PATCH net-next 13/19] net: hns: add get_coalesce_range api for hns
  2016-06-21  3:56 [PATCH net-next 00/19] net: hns: fix some bugs in hns driver Yisen Zhuang
                   ` (11 preceding siblings ...)
  2016-06-21  3:56 ` [PATCH net-next 12/19] net: hns: fix bug of getting the wrong tcam data Yisen Zhuang
@ 2016-06-21  3:56 ` Yisen Zhuang
  2016-06-21  3:56 ` [PATCH net-next 14/19] net: hns: delete redundancy ring enable operations Yisen Zhuang
                   ` (6 subsequent siblings)
  19 siblings, 0 replies; 29+ messages in thread
From: Yisen Zhuang @ 2016-06-21  3:56 UTC (permalink / raw)
  To: davem, yisen.zhuang, salil.mehta, yankejian
  Cc: liguozhu, huangdaode, arnd, andriy.shevchenko, andrew,
	geliangtang, ivecera, fengguang.wu, charles.chenxin, netdev,
	linux-kernel, linux-arm-kernel, linuxarm

From: Daode Huang <huangdaode@hisilicon.com>

This patch adds get_coalesce_range api for hns, it shows
range of coalesce usecs and frames that can be set on
this interface.

Signed-off-by: Daode Huang <huangdaode@hisilicon.com>
Signed-off-by: Yisen Zhuang <Yisen.Zhuang@huawei.com>
---
 drivers/net/ethernet/hisilicon/hns/hnae.h         |  5 +++++
 drivers/net/ethernet/hisilicon/hns/hns_ae_adapt.c | 25 +++++++++++++++++++++++
 drivers/net/ethernet/hisilicon/hns/hns_ethtool.c  | 10 +++++++++
 3 files changed, 40 insertions(+)

diff --git a/drivers/net/ethernet/hisilicon/hns/hnae.h b/drivers/net/ethernet/hisilicon/hns/hnae.h
index 529cb13..962e445 100644
--- a/drivers/net/ethernet/hisilicon/hns/hnae.h
+++ b/drivers/net/ethernet/hisilicon/hns/hnae.h
@@ -473,6 +473,11 @@ struct hnae_ae_ops {
 	int (*set_coalesce_usecs)(struct hnae_handle *handle, u32 timeout);
 	int (*set_coalesce_frames)(struct hnae_handle *handle,
 				   u32 coalesce_frames);
+	void (*get_coalesce_range)(struct hnae_handle *handle,
+				   u32 *tx_frames_low, u32 *rx_frames_low,
+				   u32 *tx_frames_high, u32 *rx_frames_high,
+				   u32 *tx_usecs_low, u32 *rx_usecs_low,
+				   u32 *tx_usecs_high, u32 *rx_usecs_high);
 	void (*set_promisc_mode)(struct hnae_handle *handle, u32 en);
 	int (*get_mac_addr)(struct hnae_handle *handle, void **p);
 	int (*set_mac_addr)(struct hnae_handle *handle, void *p);
diff --git a/drivers/net/ethernet/hisilicon/hns/hns_ae_adapt.c b/drivers/net/ethernet/hisilicon/hns/hns_ae_adapt.c
index b97cc75..6b3796f 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_ae_adapt.c
+++ b/drivers/net/ethernet/hisilicon/hns/hns_ae_adapt.c
@@ -465,6 +465,30 @@ static int  hns_ae_set_coalesce_frames(struct hnae_handle *handle,
 		ring_pair->port_id_in_comm, coalesce_frames);
 }
 
+static void hns_ae_get_coalesce_range(struct hnae_handle *handle,
+				      u32 *tx_frames_low, u32 *rx_frames_low,
+				      u32 *tx_frames_high, u32 *rx_frames_high,
+				      u32 *tx_usecs_low, u32 *rx_usecs_low,
+				      u32 *tx_usecs_high, u32 *rx_usecs_high)
+{
+	struct dsaf_device *dsaf_dev;
+
+	dsaf_dev = hns_ae_get_dsaf_dev(handle->dev);
+
+	*tx_frames_low  = HNS_RCB_MIN_COALESCED_FRAMES;
+	*rx_frames_low  = HNS_RCB_MIN_COALESCED_FRAMES;
+	*tx_frames_high =
+		(dsaf_dev->desc_num - 1 > HNS_RCB_MAX_COALESCED_FRAMES) ?
+		HNS_RCB_MAX_COALESCED_FRAMES : dsaf_dev->desc_num - 1;
+	*rx_frames_high =
+		(dsaf_dev->desc_num - 1 > HNS_RCB_MAX_COALESCED_FRAMES) ?
+		 HNS_RCB_MAX_COALESCED_FRAMES : dsaf_dev->desc_num - 1;
+	*tx_usecs_low   = 0;
+	*rx_usecs_low   = 0;
+	*tx_usecs_high  = HNS_RCB_MAX_COALESCED_USECS;
+	*rx_usecs_high  = HNS_RCB_MAX_COALESCED_USECS;
+}
+
 void hns_ae_update_stats(struct hnae_handle *handle,
 			 struct net_device_stats *net_stats)
 {
@@ -798,6 +822,7 @@ static struct hnae_ae_ops hns_dsaf_ops = {
 	.get_rx_max_coalesced_frames = hns_ae_get_rx_max_coalesced_frames,
 	.set_coalesce_usecs = hns_ae_set_coalesce_usecs,
 	.set_coalesce_frames = hns_ae_set_coalesce_frames,
+	.get_coalesce_range = hns_ae_get_coalesce_range,
 	.set_promisc_mode = hns_ae_set_promisc_mode,
 	.set_mac_addr = hns_ae_set_mac_address,
 	.set_mc_addr = hns_ae_set_multicast_one,
diff --git a/drivers/net/ethernet/hisilicon/hns/hns_ethtool.c b/drivers/net/ethernet/hisilicon/hns/hns_ethtool.c
index 564ae1e..a395ca1 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_ethtool.c
+++ b/drivers/net/ethernet/hisilicon/hns/hns_ethtool.c
@@ -751,6 +751,16 @@ static int hns_get_coalesce(struct net_device *net_dev,
 		&ec->tx_max_coalesced_frames,
 		&ec->rx_max_coalesced_frames);
 
+	ops->get_coalesce_range(priv->ae_handle,
+				&ec->tx_max_coalesced_frames_low,
+				&ec->rx_max_coalesced_frames_low,
+				&ec->tx_max_coalesced_frames_high,
+				&ec->rx_max_coalesced_frames_high,
+				&ec->tx_coalesce_usecs_low,
+				&ec->rx_coalesce_usecs_low,
+				&ec->tx_coalesce_usecs_high,
+				&ec->rx_coalesce_usecs_high);
+
 	return 0;
 }
 
-- 
1.9.1

^ permalink raw reply related	[flat|nested] 29+ messages in thread

* [PATCH net-next 14/19] net: hns: delete redundancy ring enable operations
  2016-06-21  3:56 [PATCH net-next 00/19] net: hns: fix some bugs in hns driver Yisen Zhuang
                   ` (12 preceding siblings ...)
  2016-06-21  3:56 ` [PATCH net-next 13/19] net: hns: add get_coalesce_range api for hns Yisen Zhuang
@ 2016-06-21  3:56 ` Yisen Zhuang
  2016-06-21  3:56 ` [PATCH net-next 15/19] net: hns: bug fix about led control logic when link down Yisen Zhuang
                   ` (5 subsequent siblings)
  19 siblings, 0 replies; 29+ messages in thread
From: Yisen Zhuang @ 2016-06-21  3:56 UTC (permalink / raw)
  To: davem, yisen.zhuang, salil.mehta, yankejian
  Cc: liguozhu, huangdaode, arnd, andriy.shevchenko, andrew,
	geliangtang, ivecera, fengguang.wu, charles.chenxin, netdev,
	linux-kernel, linux-arm-kernel, linuxarm

From: Daode Huang <huangdaode@hisilicon.com>

When network interface is enabled, the ring enable operation is
conducted twice. This patch deletes the redundancy code of ring enable,
and integrates hnae_ae_ops.toggle_queue_status other functions to
hns_ae_start.

Signed-off-by: Daode Huang <huangdaode@hisilicon.com>
Signed-off-by: Yisen Zhuang <Yisen.Zhuang@huawei.com>
---
 drivers/net/ethernet/hisilicon/hns/hnae.c         |  1 -
 drivers/net/ethernet/hisilicon/hns/hnae.h         |  1 -
 drivers/net/ethernet/hisilicon/hns/hns_ae_adapt.c | 22 +++++++++-------------
 drivers/net/ethernet/hisilicon/hns/hns_enet.c     |  7 +------
 4 files changed, 10 insertions(+), 21 deletions(-)

diff --git a/drivers/net/ethernet/hisilicon/hns/hnae.c b/drivers/net/ethernet/hisilicon/hns/hnae.c
index 5d3047c..c54c6fa 100644
--- a/drivers/net/ethernet/hisilicon/hns/hnae.c
+++ b/drivers/net/ethernet/hisilicon/hns/hnae.c
@@ -400,7 +400,6 @@ int hnae_ae_register(struct hnae_ae_dev *hdev, struct module *owner)
 
 	if (!hdev->ops || !hdev->ops->get_handle ||
 	    !hdev->ops->toggle_ring_irq ||
-	    !hdev->ops->toggle_queue_status ||
 	    !hdev->ops->get_status || !hdev->ops->adjust_link)
 		return -EINVAL;
 
diff --git a/drivers/net/ethernet/hisilicon/hns/hnae.h b/drivers/net/ethernet/hisilicon/hns/hnae.h
index 962e445..3869322 100644
--- a/drivers/net/ethernet/hisilicon/hns/hnae.h
+++ b/drivers/net/ethernet/hisilicon/hns/hnae.h
@@ -454,7 +454,6 @@ struct hnae_ae_ops {
 	int (*get_info)(struct hnae_handle *handle,
 			u8 *auto_neg, u16 *speed, u8 *duplex);
 	void (*toggle_ring_irq)(struct hnae_ring *ring, u32 val);
-	void (*toggle_queue_status)(struct hnae_queue *queue, u32 val);
 	void (*adjust_link)(struct hnae_handle *handle, int speed, int duplex);
 	int (*set_loopback)(struct hnae_handle *handle,
 			    enum hnae_loop loop_mode, int en);
diff --git a/drivers/net/ethernet/hisilicon/hns/hns_ae_adapt.c b/drivers/net/ethernet/hisilicon/hns/hns_ae_adapt.c
index 6b3796f..835521b 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_ae_adapt.c
+++ b/drivers/net/ethernet/hisilicon/hns/hns_ae_adapt.c
@@ -247,12 +247,21 @@ static void hns_ae_set_tso_stats(struct hnae_handle *handle, int enable)
 static int hns_ae_start(struct hnae_handle *handle)
 {
 	int ret;
+	int k;
 	struct hns_mac_cb *mac_cb = hns_get_mac_cb(handle);
 
 	ret = hns_mac_vm_config_bc_en(mac_cb, 0, true);
 	if (ret)
 		return ret;
 
+	for (k = 0; k < handle->q_num; k++) {
+		if (AE_IS_VER1(mac_cb->dsaf_dev->dsaf_ver))
+			hns_rcb_int_clr_hw(handle->qs[k],
+					   RCB_INT_FLAG_TX | RCB_INT_FLAG_RX);
+		else
+			hns_rcbv2_int_clr_hw(handle->qs[k],
+					     RCB_INT_FLAG_TX | RCB_INT_FLAG_RX);
+	}
 	hns_ae_ring_enable_all(handle, 1);
 	msleep(100);
 
@@ -313,18 +322,6 @@ static void hns_aev2_toggle_ring_irq(struct hnae_ring *ring, u32 mask)
 	hns_rcbv2_int_ctrl_hw(ring->q, flag, mask);
 }
 
-static void hns_ae_toggle_queue_status(struct hnae_queue *queue, u32 val)
-{
-	struct dsaf_device *dsaf_dev = hns_ae_get_dsaf_dev(queue->dev);
-
-	if (AE_IS_VER1(dsaf_dev->dsaf_ver))
-		hns_rcb_int_clr_hw(queue, RCB_INT_FLAG_TX | RCB_INT_FLAG_RX);
-	else
-		hns_rcbv2_int_clr_hw(queue, RCB_INT_FLAG_TX | RCB_INT_FLAG_RX);
-
-	hns_rcb_start(queue, val);
-}
-
 static int hns_ae_get_link_status(struct hnae_handle *handle)
 {
 	u32 link_status;
@@ -808,7 +805,6 @@ static struct hnae_ae_ops hns_dsaf_ops = {
 	.stop = hns_ae_stop,
 	.reset = hns_ae_reset,
 	.toggle_ring_irq = hns_ae_toggle_ring_irq,
-	.toggle_queue_status = hns_ae_toggle_queue_status,
 	.get_status = hns_ae_get_link_status,
 	.get_info = hns_ae_get_mac_info,
 	.adjust_link = hns_ae_adjust_link,
diff --git a/drivers/net/ethernet/hisilicon/hns/hns_enet.c b/drivers/net/ethernet/hisilicon/hns/hns_enet.c
index cef9d12..f49246d 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_enet.c
+++ b/drivers/net/ethernet/hisilicon/hns/hns_enet.c
@@ -1200,7 +1200,7 @@ static int hns_nic_net_up(struct net_device *ndev)
 {
 	struct hns_nic_priv *priv = netdev_priv(ndev);
 	struct hnae_handle *h = priv->ae_handle;
-	int i, j, k;
+	int i, j;
 	int ret;
 
 	ret = hns_nic_init_irq(priv);
@@ -1215,9 +1215,6 @@ static int hns_nic_net_up(struct net_device *ndev)
 			goto out_has_some_queues;
 	}
 
-	for (k = 0; k < h->q_num; k++)
-		h->dev->ops->toggle_queue_status(h->qs[k], 1);
-
 	ret = h->dev->ops->set_mac_addr(h, ndev->dev_addr);
 	if (ret)
 		goto out_set_mac_addr_err;
@@ -1237,8 +1234,6 @@ static int hns_nic_net_up(struct net_device *ndev)
 out_start_err:
 	netif_stop_queue(ndev);
 out_set_mac_addr_err:
-	for (k = 0; k < h->q_num; k++)
-		h->dev->ops->toggle_queue_status(h->qs[k], 0);
 out_has_some_queues:
 	for (j = i - 1; j >= 0; j--)
 		hns_nic_ring_close(ndev, j);
-- 
1.9.1

^ permalink raw reply related	[flat|nested] 29+ messages in thread

* [PATCH net-next 15/19] net: hns: bug fix about led control logic when link down
  2016-06-21  3:56 [PATCH net-next 00/19] net: hns: fix some bugs in hns driver Yisen Zhuang
                   ` (13 preceding siblings ...)
  2016-06-21  3:56 ` [PATCH net-next 14/19] net: hns: delete redundancy ring enable operations Yisen Zhuang
@ 2016-06-21  3:56 ` Yisen Zhuang
  2016-06-21  3:56 ` [PATCH net-next 16/19] net: hns: fix bug that alloc skb fail lead to port unavailable Yisen Zhuang
                   ` (4 subsequent siblings)
  19 siblings, 0 replies; 29+ messages in thread
From: Yisen Zhuang @ 2016-06-21  3:56 UTC (permalink / raw)
  To: davem, yisen.zhuang, salil.mehta, yankejian
  Cc: liguozhu, huangdaode, arnd, andriy.shevchenko, andrew,
	geliangtang, ivecera, fengguang.wu, charles.chenxin, netdev,
	linux-kernel, linux-arm-kernel, linuxarm

From: Daode Huang <huangdaode@hisilicon.com>

The default driver sets anchor led bit to 0 when link down,
actually, the anchor bit should be set to 1, so fixes it when
link status is down.
Secondly, change the return value of cpld_set_led_id to 0, which
means leave the cpld to control led blink frequece other than the
driver itself.

Signed-off-by: Daode Huang <huangdaode@hisilicon.com>
Signed-off-by: Yisen Zhuang <Yisen.Zhuang@huawei.com>
---
 drivers/net/ethernet/hisilicon/hns/hns_dsaf_misc.c | 12 +++++++-----
 1 file changed, 7 insertions(+), 5 deletions(-)

diff --git a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_misc.c b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_misc.c
index aff9d77..8473287 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_misc.c
+++ b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_misc.c
@@ -86,9 +86,10 @@ static void hns_cpld_set_led(struct hns_mac_cb *mac_cb, int link_status,
 			mac_cb->cpld_led_value = value;
 		}
 	} else {
-		dsaf_write_syscon(mac_cb->cpld_ctrl, mac_cb->cpld_ctrl_reg,
-				  CPLD_LED_DEFAULT_VALUE);
-		mac_cb->cpld_led_value = CPLD_LED_DEFAULT_VALUE;
+		value = (mac_cb->cpld_led_value) & (0x1 << DSAF_LED_ANCHOR_B);
+		dsaf_write_syscon(mac_cb->cpld_ctrl,
+				  mac_cb->cpld_ctrl_reg, value);
+		mac_cb->cpld_led_value = value;
 	}
 }
 
@@ -114,7 +115,7 @@ static int cpld_set_led_id(struct hns_mac_cb *mac_cb,
 			     CPLD_LED_ON_VALUE);
 		dsaf_write_syscon(mac_cb->cpld_ctrl, mac_cb->cpld_ctrl_reg,
 				  mac_cb->cpld_led_value);
-		return 2;
+		break;
 	case HNAE_LED_INACTIVE:
 		dsaf_set_bit(mac_cb->cpld_led_value, DSAF_LED_ANCHOR_B,
 			     CPLD_LED_DEFAULT_VALUE);
@@ -122,7 +123,8 @@ static int cpld_set_led_id(struct hns_mac_cb *mac_cb,
 				  mac_cb->cpld_led_value);
 		break;
 	default:
-		break;
+		dev_err(mac_cb->dev, "invalid led state: %d!", status);
+		return -EINVAL;
 	}
 
 	return 0;
-- 
1.9.1

^ permalink raw reply related	[flat|nested] 29+ messages in thread

* [PATCH net-next 16/19] net: hns: fix bug that alloc skb fail lead to port unavailable
  2016-06-21  3:56 [PATCH net-next 00/19] net: hns: fix some bugs in hns driver Yisen Zhuang
                   ` (14 preceding siblings ...)
  2016-06-21  3:56 ` [PATCH net-next 15/19] net: hns: bug fix about led control logic when link down Yisen Zhuang
@ 2016-06-21  3:56 ` Yisen Zhuang
  2016-06-21 13:25   ` Sergei Shtylyov
  2016-06-21  3:56 ` [PATCH net-next 17/19] net: hns: fix sbm default parameters config error Yisen Zhuang
                   ` (3 subsequent siblings)
  19 siblings, 1 reply; 29+ messages in thread
From: Yisen Zhuang @ 2016-06-21  3:56 UTC (permalink / raw)
  To: davem, yisen.zhuang, salil.mehta, yankejian
  Cc: liguozhu, huangdaode, arnd, andriy.shevchenko, andrew,
	geliangtang, ivecera, fengguang.wu, charles.chenxin, netdev,
	linux-kernel, linux-arm-kernel, linuxarm

From: Jun He <hjat2005@huawei.com>

When hns_nic_poll_rx_skb alloc skb fail, it will break receive cycle and
read new fbd_num to start new receive cycle. It recomputes cycle num is
fbd_num minus clean_count, actually this cycle num is too big because
it drop out receive cycle. It brings about the port unavailable.

So we will goto out when alloc skb fail to fix this bug.

Signed-off-by: Jun He <hjat2005@huawei.com>
Signed-off-by: Ding Tianhong <dingtianhong@huawei.com>
Signed-off-by: Yisen Zhuang <Yisen.Zhuang@huawei.com>
---
 drivers/net/ethernet/hisilicon/hns/hns_enet.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/drivers/net/ethernet/hisilicon/hns/hns_enet.c b/drivers/net/ethernet/hisilicon/hns/hns_enet.c
index f49246d..c0ce37b 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_enet.c
+++ b/drivers/net/ethernet/hisilicon/hns/hns_enet.c
@@ -768,10 +768,10 @@ recv:
 			clean_count = 0;
 		}
 
-		/* poll one pkg*/
+		/* poll one pkt*/
 		err = hns_nic_poll_rx_skb(ring_data, &skb, &bnum);
 		if (unlikely(!skb)) /* this fault cannot be repaired */
-			break;
+			goto out;
 
 		recv_bds += bnum;
 		clean_count += bnum;
@@ -797,6 +797,7 @@ recv:
 		}
 	}
 
+out:
 	/* make all data has been write before submit */
 	if (clean_count > 0)
 		hns_nic_alloc_rx_buffers(ring_data, clean_count);
-- 
1.9.1

^ permalink raw reply related	[flat|nested] 29+ messages in thread

* [PATCH net-next 17/19] net: hns: fix sbm default parameters config error
  2016-06-21  3:56 [PATCH net-next 00/19] net: hns: fix some bugs in hns driver Yisen Zhuang
                   ` (15 preceding siblings ...)
  2016-06-21  3:56 ` [PATCH net-next 16/19] net: hns: fix bug that alloc skb fail lead to port unavailable Yisen Zhuang
@ 2016-06-21  3:56 ` Yisen Zhuang
  2016-06-21  3:56 ` [PATCH net-next 18/19] net: hns: change the default coalesce usecs Yisen Zhuang
                   ` (2 subsequent siblings)
  19 siblings, 0 replies; 29+ messages in thread
From: Yisen Zhuang @ 2016-06-21  3:56 UTC (permalink / raw)
  To: davem, yisen.zhuang, salil.mehta, yankejian
  Cc: liguozhu, huangdaode, arnd, andriy.shevchenko, andrew,
	geliangtang, ivecera, fengguang.wu, charles.chenxin, netdev,
	linux-kernel, linux-arm-kernel, linuxarm

From: Daode Huang <huangdaode@hisilicon.com>

The default sbm config parameter leaves little buffer when there is heavy
traffic, which will cause packets drop. This patch changes them to make
enough buffers for handling packets.

Signed-off-by: Daode Huang <huangdaode@hisilicon.com>
Signed-off-by: Yisen Zhuang <Yisen.Zhuang@huawei.com>
---
 drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c | 40 ++++++++++++++--------
 drivers/net/ethernet/hisilicon/hns/hns_dsaf_reg.h  | 16 +++++++--
 2 files changed, 39 insertions(+), 17 deletions(-)

diff --git a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c
index 7f5c248..67e8e13 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c
+++ b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c
@@ -516,10 +516,10 @@ static void hns_dsafv2_sbm_bp_wl_cfg(struct dsaf_device *dsaf_dev)
 		o_sbm_bp_cfg = dsaf_read_dev(dsaf_dev, reg);
 		dsaf_set_field(o_sbm_bp_cfg,
 			       DSAFV2_SBM_CFG3_SET_BUF_NUM_NO_PFC_M,
-			       DSAFV2_SBM_CFG3_SET_BUF_NUM_NO_PFC_S, 110);
+			       DSAFV2_SBM_CFG3_SET_BUF_NUM_NO_PFC_S, 48);
 		dsaf_set_field(o_sbm_bp_cfg,
 			       DSAFV2_SBM_CFG3_RESET_BUF_NUM_NO_PFC_M,
-			       DSAFV2_SBM_CFG3_RESET_BUF_NUM_NO_PFC_S, 160);
+			       DSAFV2_SBM_CFG3_RESET_BUF_NUM_NO_PFC_S, 80);
 		dsaf_write_dev(dsaf_dev, reg, o_sbm_bp_cfg);
 
 		/* for no enable pfc mode */
@@ -527,29 +527,39 @@ static void hns_dsafv2_sbm_bp_wl_cfg(struct dsaf_device *dsaf_dev)
 		o_sbm_bp_cfg = dsaf_read_dev(dsaf_dev, reg);
 		dsaf_set_field(o_sbm_bp_cfg,
 			       DSAFV2_SBM_CFG4_SET_BUF_NUM_NO_PFC_M,
-			       DSAFV2_SBM_CFG4_SET_BUF_NUM_NO_PFC_S, 128);
+			       DSAFV2_SBM_CFG4_SET_BUF_NUM_NO_PFC_S, 192);
 		dsaf_set_field(o_sbm_bp_cfg,
 			       DSAFV2_SBM_CFG4_RESET_BUF_NUM_NO_PFC_M,
-			       DSAFV2_SBM_CFG4_RESET_BUF_NUM_NO_PFC_S, 192);
+			       DSAFV2_SBM_CFG4_RESET_BUF_NUM_NO_PFC_S, 240);
 		dsaf_write_dev(dsaf_dev, reg, o_sbm_bp_cfg);
 	}
 
 	/* PPE */
-	reg = DSAF_SBM_BP_CFG_2_PPE_REG_0_REG + 0x80 * i;
-	o_sbm_bp_cfg = dsaf_read_dev(dsaf_dev, reg);
-	dsaf_set_field(o_sbm_bp_cfg, DSAFV2_SBM_CFG2_SET_BUF_NUM_M,
-		       DSAFV2_SBM_CFG2_SET_BUF_NUM_S, 10);
-	dsaf_set_field(o_sbm_bp_cfg, DSAFV2_SBM_CFG2_RESET_BUF_NUM_M,
-		       DSAFV2_SBM_CFG2_RESET_BUF_NUM_S, 12);
-	dsaf_write_dev(dsaf_dev, reg, o_sbm_bp_cfg);
+	for (i = 0; i < DSAFV2_SBM_PPE_CHN; i++) {
+		reg = DSAF_SBM_BP_CFG_2_PPE_REG_0_REG + 0x80 * i;
+		o_sbm_bp_cfg = dsaf_read_dev(dsaf_dev, reg);
+		dsaf_set_field(o_sbm_bp_cfg,
+			       DSAFV2_SBM_CFG2_PPE_SET_BUF_NUM_M,
+			       DSAFV2_SBM_CFG2_PPE_SET_BUF_NUM_S, 2);
+		dsaf_set_field(o_sbm_bp_cfg,
+			       DSAFV2_SBM_CFG2_PPE_RESET_BUF_NUM_M,
+			       DSAFV2_SBM_CFG2_PPE_RESET_BUF_NUM_S, 3);
+		dsaf_set_field(o_sbm_bp_cfg,
+			       DSAFV2_SBM_CFG2_PPE_CFG_USEFUL_NUM_M,
+			       DSAFV2_SBM_CFG2_PPE_CFG_USEFUL_NUM_S, 52);
+		dsaf_write_dev(dsaf_dev, reg, o_sbm_bp_cfg);
+	}
+
 	/* RoCEE */
 	for (i = 0; i < DASFV2_ROCEE_CRD_NUM; i++) {
 		reg = DSAFV2_SBM_BP_CFG_2_ROCEE_REG_0_REG + 0x80 * i;
 		o_sbm_bp_cfg = dsaf_read_dev(dsaf_dev, reg);
-		dsaf_set_field(o_sbm_bp_cfg, DSAFV2_SBM_CFG2_SET_BUF_NUM_M,
-			       DSAFV2_SBM_CFG2_SET_BUF_NUM_S, 2);
-		dsaf_set_field(o_sbm_bp_cfg, DSAFV2_SBM_CFG2_RESET_BUF_NUM_M,
-			       DSAFV2_SBM_CFG2_RESET_BUF_NUM_S, 4);
+		dsaf_set_field(o_sbm_bp_cfg,
+			       DSAFV2_SBM_CFG2_ROCEE_SET_BUF_NUM_M,
+			       DSAFV2_SBM_CFG2_ROCEE_SET_BUF_NUM_S, 2);
+		dsaf_set_field(o_sbm_bp_cfg,
+			       DSAFV2_SBM_CFG2_ROCEE_RESET_BUF_NUM_M,
+			       DSAFV2_SBM_CFG2_ROCEE_RESET_BUF_NUM_S, 4);
 		dsaf_write_dev(dsaf_dev, reg, o_sbm_bp_cfg);
 	}
 }
diff --git a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_reg.h b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_reg.h
index e35d0cb..235f744 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_reg.h
+++ b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_reg.h
@@ -32,7 +32,7 @@
 #define DSAFV2_SBM_NUM		8
 #define DSAFV2_SBM_XGE_CHN    6
 #define DSAFV2_SBM_PPE_CHN    1
-#define DASFV2_ROCEE_CRD_NUM  8
+#define DASFV2_ROCEE_CRD_NUM  1
 
 #define DSAF_VOQ_NUM		DSAF_NODE_NUM
 #define DSAF_INODE_NUM		DSAF_NODE_NUM
@@ -178,7 +178,7 @@
 #define DSAF_SBM_BP_CFG_2_XGE_REG_0_REG		0x200C
 #define DSAF_SBM_BP_CFG_2_PPE_REG_0_REG		0x230C
 #define DSAF_SBM_BP_CFG_2_ROCEE_REG_0_REG	0x260C
-#define DSAFV2_SBM_BP_CFG_2_ROCEE_REG_0_REG		 0x238C
+#define DSAFV2_SBM_BP_CFG_2_ROCEE_REG_0_REG	0x238C
 #define DSAF_SBM_FREE_CNT_0_0_REG		0x2010
 #define DSAF_SBM_FREE_CNT_1_0_REG		0x2014
 #define DSAF_SBM_BP_CNT_0_0_REG			0x2018
@@ -796,6 +796,18 @@
 #define DSAFV2_SBM_CFG4_RESET_BUF_NUM_NO_PFC_S 9
 #define DSAFV2_SBM_CFG4_RESET_BUF_NUM_NO_PFC_M (((1ULL << 9) - 1) << 9)
 
+#define DSAFV2_SBM_CFG2_ROCEE_SET_BUF_NUM_S 0
+#define DSAFV2_SBM_CFG2_ROCEE_SET_BUF_NUM_M (((1ULL << 8) - 1) << 0)
+#define DSAFV2_SBM_CFG2_ROCEE_RESET_BUF_NUM_S 8
+#define DSAFV2_SBM_CFG2_ROCEE_RESET_BUF_NUM_M (((1ULL << 8) - 1) << 8)
+
+#define DSAFV2_SBM_CFG2_PPE_SET_BUF_NUM_S (0)
+#define DSAFV2_SBM_CFG2_PPE_SET_BUF_NUM_M (((1ULL << 6) - 1) << 0)
+#define DSAFV2_SBM_CFG2_PPE_RESET_BUF_NUM_S (6)
+#define DSAFV2_SBM_CFG2_PPE_RESET_BUF_NUM_M (((1ULL << 6) - 1) << 6)
+#define DSAFV2_SBM_CFG2_PPE_CFG_USEFUL_NUM_S (12)
+#define DSAFV2_SBM_CFG2_PPE_CFG_USEFUL_NUM_M (((1ULL << 6) - 1) << 12)
+
 #define DSAF_TBL_TCAM_ADDR_S 0
 #define DSAF_TBL_TCAM_ADDR_M ((1ULL << 9) - 1)
 
-- 
1.9.1

^ permalink raw reply related	[flat|nested] 29+ messages in thread

* [PATCH net-next 18/19] net: hns: change the default coalesce usecs
  2016-06-21  3:56 [PATCH net-next 00/19] net: hns: fix some bugs in hns driver Yisen Zhuang
                   ` (16 preceding siblings ...)
  2016-06-21  3:56 ` [PATCH net-next 17/19] net: hns: fix sbm default parameters config error Yisen Zhuang
@ 2016-06-21  3:56 ` Yisen Zhuang
  2016-06-21  3:56 ` [PATCH net-next 19/19] net: hns: bug fix about TSO on|off when there is traffic Yisen Zhuang
  2016-06-21  8:54 ` [PATCH net-next 00/19] net: hns: fix some bugs in hns driver David Miller
  19 siblings, 0 replies; 29+ messages in thread
From: Yisen Zhuang @ 2016-06-21  3:56 UTC (permalink / raw)
  To: davem, yisen.zhuang, salil.mehta, yankejian
  Cc: liguozhu, huangdaode, arnd, andriy.shevchenko, andrew,
	geliangtang, ivecera, fengguang.wu, charles.chenxin, netdev,
	linux-kernel, linux-arm-kernel, linuxarm

From: Daode Huang <huangdaode@hisilicon.com>

The default coalesce timeout is 3us, which is will cause CPU
usage is too high. This patch change it to 50us in order to reduce
CPU usage and the value makes sure network latency also meets requirement.

Signed-off-by: Daode Huang <huangdaode@hisilicon.com>
Signed-off-by: Yisen Zhuang <Yisen.Zhuang@huawei.com>
---
 drivers/net/ethernet/hisilicon/hns/hns_dsaf_rcb.c | 2 +-
 drivers/net/ethernet/hisilicon/hns/hns_dsaf_rcb.h | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_rcb.c b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_rcb.c
index 3ce2409..ef11077 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_rcb.c
+++ b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_rcb.c
@@ -540,7 +540,7 @@ int hns_rcb_set_coalesce_usecs(
 	}
 	if (timeout > HNS_RCB_MAX_COALESCED_USECS) {
 		dev_err(rcb_common->dsaf_dev->dev,
-			"error: not support coalesce %dus!\n", timeout);
+			"error: coalesce_usecs setting supports 0~1023us\n");
 		return -EINVAL;
 	}
 	hns_rcb_set_port_timeout(rcb_common, port_idx, timeout);
diff --git a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_rcb.h b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_rcb.h
index bd54dac..99b4e1b 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_rcb.h
+++ b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_rcb.h
@@ -40,7 +40,7 @@ struct rcb_common_cb;
 #define HNS_RCB_DEF_COALESCED_FRAMES		50
 #define HNS_RCB_CLK_FREQ_MHZ			350
 #define HNS_RCB_MAX_COALESCED_USECS		0x3ff
-#define HNS_RCB_DEF_COALESCED_USECS		3
+#define HNS_RCB_DEF_COALESCED_USECS		50
 
 #define HNS_RCB_COMMON_ENDIAN			1
 
-- 
1.9.1

^ permalink raw reply related	[flat|nested] 29+ messages in thread

* [PATCH net-next 19/19] net: hns: bug fix about TSO on|off when there is traffic
  2016-06-21  3:56 [PATCH net-next 00/19] net: hns: fix some bugs in hns driver Yisen Zhuang
                   ` (17 preceding siblings ...)
  2016-06-21  3:56 ` [PATCH net-next 18/19] net: hns: change the default coalesce usecs Yisen Zhuang
@ 2016-06-21  3:56 ` Yisen Zhuang
  2016-06-21  8:54 ` [PATCH net-next 00/19] net: hns: fix some bugs in hns driver David Miller
  19 siblings, 0 replies; 29+ messages in thread
From: Yisen Zhuang @ 2016-06-21  3:56 UTC (permalink / raw)
  To: davem, yisen.zhuang, salil.mehta, yankejian
  Cc: liguozhu, huangdaode, arnd, andriy.shevchenko, andrew,
	geliangtang, ivecera, fengguang.wu, charles.chenxin, netdev,
	linux-kernel, linux-arm-kernel, linuxarm

From: Daode Huang <huangdaode@hisilicon.com>

When enable/disable tso, the driver tries to access the hardware register,
but this operation will cause the port unavalible when there is traffic.
This patch tries to enable TSO when initialize, then control tso through
TSE bit in transmit descriptor.

Signed-off-by: Daode Huang <huangdaode@hisilicon.com>
Signed-off-by: Yisen Zhuang <Yisen.Zhuang@huawei.com>
---
 drivers/net/ethernet/hisilicon/hns/hns_enet.c | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/drivers/net/ethernet/hisilicon/hns/hns_enet.c b/drivers/net/ethernet/hisilicon/hns/hns_enet.c
index c0ce37b..d5297ec 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_enet.c
+++ b/drivers/net/ethernet/hisilicon/hns/hns_enet.c
@@ -1441,7 +1441,6 @@ static int hns_nic_set_features(struct net_device *netdev,
 				netdev_features_t features)
 {
 	struct hns_nic_priv *priv = netdev_priv(netdev);
-	struct hnae_handle *h = priv->ae_handle;
 
 	switch (priv->enet_ver) {
 	case AE_VERSION_1:
@@ -1454,11 +1453,9 @@ static int hns_nic_set_features(struct net_device *netdev,
 			priv->ops.maybe_stop_tx = hns_nic_maybe_stop_tso;
 			/* The chip only support 7*4096 */
 			netif_set_gso_max_size(netdev, 7 * 4096);
-			h->dev->ops->set_tso_stats(h, 1);
 		} else {
 			priv->ops.fill_desc = fill_v2_desc;
 			priv->ops.maybe_stop_tx = hns_nic_maybe_stop_tx;
-			h->dev->ops->set_tso_stats(h, 0);
 		}
 		break;
 	}
@@ -1804,11 +1801,14 @@ static void hns_nic_set_priv_ops(struct net_device *netdev)
 			priv->ops.maybe_stop_tx = hns_nic_maybe_stop_tso;
 			/* This chip only support 7*4096 */
 			netif_set_gso_max_size(netdev, 7 * 4096);
-			h->dev->ops->set_tso_stats(h, 1);
 		} else {
 			priv->ops.fill_desc = fill_v2_desc;
 			priv->ops.maybe_stop_tx = hns_nic_maybe_stop_tx;
 		}
+		/* enable tso when init
+		 * control tso on/off through TSE bit in bd
+		 */
+		h->dev->ops->set_tso_stats(h, 1);
 	}
 }
 
-- 
1.9.1

^ permalink raw reply related	[flat|nested] 29+ messages in thread

* Re: [PATCH net-next 00/19] net: hns: fix some bugs in hns driver
  2016-06-21  3:56 [PATCH net-next 00/19] net: hns: fix some bugs in hns driver Yisen Zhuang
                   ` (18 preceding siblings ...)
  2016-06-21  3:56 ` [PATCH net-next 19/19] net: hns: bug fix about TSO on|off when there is traffic Yisen Zhuang
@ 2016-06-21  8:54 ` David Miller
  19 siblings, 0 replies; 29+ messages in thread
From: David Miller @ 2016-06-21  8:54 UTC (permalink / raw)
  To: Yisen.Zhuang
  Cc: salil.mehta, yankejian, liguozhu, huangdaode, arnd,
	andriy.shevchenko, andrew, geliangtang, ivecera, fengguang.wu,
	charles.chenxin, netdev, linux-kernel, linux-arm-kernel,
	linuxarm

From: Yisen Zhuang <Yisen.Zhuang@huawei.com>
Date: Tue, 21 Jun 2016 11:56:20 +0800

> This series includes some bugs fixed. All these patches needs to be
> applied after the patchset about ACPI support, so this series is 
> floated to net-next list.

Series applied, thanks.

^ permalink raw reply	[flat|nested] 29+ messages in thread

* Re: [PATCH net-next 10/19] net: hns: bugfix about pfc pause frame statistics
  2016-06-21  3:56 ` [PATCH net-next 10/19] net: hns: bugfix about pfc pause frame statistics Yisen Zhuang
@ 2016-06-21 10:32   ` Andy Shevchenko
  2016-06-22  1:43     ` Yisen Zhuang
  0 siblings, 1 reply; 29+ messages in thread
From: Andy Shevchenko @ 2016-06-21 10:32 UTC (permalink / raw)
  To: Yisen Zhuang, davem, salil.mehta, yankejian
  Cc: liguozhu, huangdaode, arnd, andrew, geliangtang, ivecera,
	fengguang.wu, charles.chenxin, netdev, linux-kernel,
	linux-arm-kernel, linuxarm

On Tue, 2016-06-21 at 11:56 +0800, Yisen Zhuang wrote:
> From: Daode Huang <huangdaode@hisilicon.com>
> 
> For SoC hip06, PFC pause handled in dsaf, while hip05 in XGMAC,
> so change the statistics of pfc pause in dsaf and remove the old
> pfc pause frame statistics.
> 


> +static char *hns_dsaf_get_node_stats_strings(char *data, int node,
> +					     struct dsaf_device
> *dsaf_dev)
>  {
>  	char *buff = data;
> +	int i;
> +	bool is_ver1 = AE_IS_VER1(dsaf_dev->dsaf_ver);
>  
>  	snprintf(buff, ETH_GSTRING_LEN, "innod%d_pad_drop_pkts",
> node);
>  	buff = buff + ETH_GSTRING_LEN;
> @@ -2502,6 +2530,18 @@ static char
> *hns_dsaf_get_node_stats_strings(char *data, int node)
>  	buff = buff + ETH_GSTRING_LEN;
>  	snprintf(buff, ETH_GSTRING_LEN, "innod%d_stp_drop_pkts",
> node);
>  	buff = buff + ETH_GSTRING_LEN;
> +	if ((node < DSAF_SERVICE_NW_NUM) && (!is_ver1)) {

Redundant parens.

> +		for (i = 0; i < DSAF_PRIO_NR; i++) {
> +			snprintf(buff, ETH_GSTRING_LEN,
> +				 "inod%d_pfc_prio%d_pkts", node, i);
> +			buff = buff + ETH_GSTRING_LEN;

buff += ...

> +		}
> +		for (i = 0; i < DSAF_PRIO_NR; i++) {
> +			snprintf(buff, ETH_GSTRING_LEN,
> +				 "onod%d_pfc_prio%d_pkts", node, i);
> +			buff = buff + ETH_GSTRING_LEN;

Ditto.

>  {
>  	u64 *p = data;
> +	int i;
>  	struct dsaf_hw_stats *hw_stats = &ddev->hw_stats[node_num];
> +	bool is_ver1 = AE_IS_VER1(ddev->dsaf_ver);
>  
>  	p[0] = hw_stats->pad_drop;
>  	p[1] = hw_stats->man_pkts;
> @@ -2527,8 +2569,16 @@ static u64 *hns_dsaf_get_node_stats(struct
> dsaf_device *ddev, u64 *data,
>  	p[10] = hw_stats->local_addr_false;
>  	p[11] = hw_stats->vlan_drop;
>  	p[12] = hw_stats->stp_drop;
> -	p[13] = hw_stats->tx_pkts;
> +	if ((node_num < DSAF_SERVICE_NW_NUM) && (!is_ver1)) {
> +		for (i = 0; i < DSAF_PRIO_NR; i++) {
> +			p[13 + i] = hw_stats->rx_pfc[i];
> +			p[13 + i + DSAF_PRIO_NR] = hw_stats-
> >tx_pfc[i];
> +		}

Two different approaches how to assign data. Above uses 2 for-loops,
here you put everything to one.

> +		p[29] = hw_stats->tx_pkts;
> +		return &p[30];
> +	}
>  
> +	p[13] = hw_stats->tx_pkts;
>  	return &p[14];
>  }

-- 

Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Intel Finland Oy

^ permalink raw reply	[flat|nested] 29+ messages in thread

* Re: [PATCH net-next 01/19] net: hns: bug fix of ge reset sequence
  2016-06-21  3:56 ` [PATCH net-next 01/19] net: hns: bug fix of ge reset sequence Yisen Zhuang
@ 2016-06-21 10:35   ` Andy Shevchenko
  2016-06-22  1:33     ` Yisen Zhuang
  0 siblings, 1 reply; 29+ messages in thread
From: Andy Shevchenko @ 2016-06-21 10:35 UTC (permalink / raw)
  To: Yisen Zhuang, davem, salil.mehta, yankejian
  Cc: liguozhu, huangdaode, arnd, andrew, geliangtang, ivecera,
	fengguang.wu, charles.chenxin, netdev, linux-kernel,
	linux-arm-kernel, linuxarm

On Tue, 2016-06-21 at 11:56 +0800, Yisen Zhuang wrote:
> From: Qianqian Xie <xieqianqian@huawei.com>
> 
> The bit fileds of PPE reset register are different between HNS v1 and
> HNS v2, but the current procedure just only match HNS v1. Here is a
> patch to fix it.
> 
> Signed-off-by: Kejian Yan <yankejian@huawei.com>
> Signed-off-by: Qianqian Xie <xieqianqian@huawei.com>
> Signed-off-by: Yisen Zhuang <Yisen.Zhuang@huawei.com>
> ---
>  drivers/net/ethernet/hisilicon/hns/hns_dsaf_misc.c | 6 +++++-
>  1 file changed, 5 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_misc.c
> b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_misc.c
> index 96cb628..09e60d6 100644
> --- a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_misc.c
> +++ b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_misc.c
> @@ -271,7 +271,11 @@ static void hns_dsaf_ge_srst_by_port(struct
> dsaf_device *dsaf_dev, u32 port,
>  		}
>  	} else {
>  		reg_val_1 = 0x15540 << dsaf_dev->reset_offset;
> -		reg_val_2 = 0x100 << dsaf_dev->reset_offset;
> +
> +		if (AE_IS_VER1(dsaf_dev->dsaf_ver))
> +			reg_val_2 = 0x100 << dsaf_dev->reset_offset;
> +		else
> +			reg_val_2 = 0x40 << dsaf_dev->reset_offset;

reg_val_1 = 0x15540;
reg_val_2 = AE_IS_VER1(dsaf_dev->dsaf_ver) ? 0x100 : 0x40;

reg_val_1 <<= dsaf_dev->reset_offset;
reg_val_2 <<= dsaf_dev-
>reset_offset;


>  
>  		if (!dereset) {
>  			dsaf_write_sub(dsaf_dev,
> DSAF_SUB_SC_GE_RESET_REQ1_REG,

-- 

Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Intel Finland Oy

^ permalink raw reply	[flat|nested] 29+ messages in thread

* Re: [PATCH net-next 16/19] net: hns: fix bug that alloc skb fail lead to port unavailable
  2016-06-21  3:56 ` [PATCH net-next 16/19] net: hns: fix bug that alloc skb fail lead to port unavailable Yisen Zhuang
@ 2016-06-21 13:25   ` Sergei Shtylyov
  2016-06-22  1:41     ` Yisen Zhuang
  0 siblings, 1 reply; 29+ messages in thread
From: Sergei Shtylyov @ 2016-06-21 13:25 UTC (permalink / raw)
  To: Yisen Zhuang, davem, salil.mehta, yankejian
  Cc: liguozhu, huangdaode, arnd, andriy.shevchenko, andrew,
	geliangtang, ivecera, fengguang.wu, charles.chenxin, netdev,
	linux-kernel, linux-arm-kernel, linuxarm

Hello.

On 6/21/2016 6:56 AM, Yisen Zhuang wrote:

> From: Jun He <hjat2005@huawei.com>
>
> When hns_nic_poll_rx_skb alloc skb fail, it will break receive cycle and
> read new fbd_num to start new receive cycle. It recomputes cycle num is
> fbd_num minus clean_count, actually this cycle num is too big because
> it drop out receive cycle. It brings about the port unavailable.
>
> So we will goto out when alloc skb fail to fix this bug.
>
> Signed-off-by: Jun He <hjat2005@huawei.com>
> Signed-off-by: Ding Tianhong <dingtianhong@huawei.com>
> Signed-off-by: Yisen Zhuang <Yisen.Zhuang@huawei.com>
> ---
>  drivers/net/ethernet/hisilicon/hns/hns_enet.c | 5 +++--
>  1 file changed, 3 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/net/ethernet/hisilicon/hns/hns_enet.c b/drivers/net/ethernet/hisilicon/hns/hns_enet.c
> index f49246d..c0ce37b 100644
> --- a/drivers/net/ethernet/hisilicon/hns/hns_enet.c
> +++ b/drivers/net/ethernet/hisilicon/hns/hns_enet.c
> @@ -768,10 +768,10 @@ recv:
>  			clean_count = 0;
>  		}
>
> -		/* poll one pkg*/
> +		/* poll one pkt*/

    How about adding a space before */?

[...]

MBR, Sergei

^ permalink raw reply	[flat|nested] 29+ messages in thread

* Re: [PATCH net-next 01/19] net: hns: bug fix of ge reset sequence
  2016-06-21 10:35   ` Andy Shevchenko
@ 2016-06-22  1:33     ` Yisen Zhuang
  0 siblings, 0 replies; 29+ messages in thread
From: Yisen Zhuang @ 2016-06-22  1:33 UTC (permalink / raw)
  To: Andy Shevchenko, davem, salil.mehta, yankejian
  Cc: liguozhu, huangdaode, arnd, andrew, geliangtang, ivecera,
	fengguang.wu, charles.chenxin, netdev, linux-kernel,
	linux-arm-kernel, linuxarm



在 2016/6/21 18:35, Andy Shevchenko 写道:
> On Tue, 2016-06-21 at 11:56 +0800, Yisen Zhuang wrote:
>> From: Qianqian Xie <xieqianqian@huawei.com>
>>
>> The bit fileds of PPE reset register are different between HNS v1 and
>> HNS v2, but the current procedure just only match HNS v1. Here is a
>> patch to fix it.
>>
>> Signed-off-by: Kejian Yan <yankejian@huawei.com>
>> Signed-off-by: Qianqian Xie <xieqianqian@huawei.com>
>> Signed-off-by: Yisen Zhuang <Yisen.Zhuang@huawei.com>
>> ---
>>  drivers/net/ethernet/hisilicon/hns/hns_dsaf_misc.c | 6 +++++-
>>  1 file changed, 5 insertions(+), 1 deletion(-)
>>
>> diff --git a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_misc.c
>> b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_misc.c
>> index 96cb628..09e60d6 100644
>> --- a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_misc.c
>> +++ b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_misc.c
>> @@ -271,7 +271,11 @@ static void hns_dsaf_ge_srst_by_port(struct
>> dsaf_device *dsaf_dev, u32 port,
>>  		}
>>  	} else {
>>  		reg_val_1 = 0x15540 << dsaf_dev->reset_offset;
>> -		reg_val_2 = 0x100 << dsaf_dev->reset_offset;
>> +
>> +		if (AE_IS_VER1(dsaf_dev->dsaf_ver))
>> +			reg_val_2 = 0x100 << dsaf_dev->reset_offset;
>> +		else
>> +			reg_val_2 = 0x40 << dsaf_dev->reset_offset;
> 
> reg_val_1 = 0x15540;
> reg_val_2 = AE_IS_VER1(dsaf_dev->dsaf_ver) ? 0x100 : 0x40;
> 
> reg_val_1 <<= dsaf_dev->reset_offset;
> reg_val_2 <<= dsaf_dev-

I will fix it with a new patch.

Thanks,

Yisen

>> reset_offset;
> 
> 
>>  
>>  		if (!dereset) {
>>  			dsaf_write_sub(dsaf_dev,
>> DSAF_SUB_SC_GE_RESET_REQ1_REG,
> 

^ permalink raw reply	[flat|nested] 29+ messages in thread

* Re: [PATCH net-next 16/19] net: hns: fix bug that alloc skb fail lead to port unavailable
  2016-06-21 13:25   ` Sergei Shtylyov
@ 2016-06-22  1:41     ` Yisen Zhuang
  0 siblings, 0 replies; 29+ messages in thread
From: Yisen Zhuang @ 2016-06-22  1:41 UTC (permalink / raw)
  To: Sergei Shtylyov, davem, salil.mehta, yankejian
  Cc: liguozhu, huangdaode, arnd, andriy.shevchenko, andrew,
	geliangtang, ivecera, fengguang.wu, charles.chenxin, netdev,
	linux-kernel, linux-arm-kernel, linuxarm



在 2016/6/21 21:25, Sergei Shtylyov 写道:
> Hello.
> 
> On 6/21/2016 6:56 AM, Yisen Zhuang wrote:
> 
>> From: Jun He <hjat2005@huawei.com>
>>
>> When hns_nic_poll_rx_skb alloc skb fail, it will break receive cycle and
>> read new fbd_num to start new receive cycle. It recomputes cycle num is
>> fbd_num minus clean_count, actually this cycle num is too big because
>> it drop out receive cycle. It brings about the port unavailable.
>>
>> So we will goto out when alloc skb fail to fix this bug.
>>
>> Signed-off-by: Jun He <hjat2005@huawei.com>
>> Signed-off-by: Ding Tianhong <dingtianhong@huawei.com>
>> Signed-off-by: Yisen Zhuang <Yisen.Zhuang@huawei.com>
>> ---
>>  drivers/net/ethernet/hisilicon/hns/hns_enet.c | 5 +++--
>>  1 file changed, 3 insertions(+), 2 deletions(-)
>>
>> diff --git a/drivers/net/ethernet/hisilicon/hns/hns_enet.c b/drivers/net/ethernet/hisilicon/hns/hns_enet.c
>> index f49246d..c0ce37b 100644
>> --- a/drivers/net/ethernet/hisilicon/hns/hns_enet.c
>> +++ b/drivers/net/ethernet/hisilicon/hns/hns_enet.c
>> @@ -768,10 +768,10 @@ recv:
>>              clean_count = 0;
>>          }
>>
>> -        /* poll one pkg*/
>> +        /* poll one pkt*/

I will fix it with a new patch.

Thanks,

Yisen

> 
>    How about adding a space before */?
> 
> [...]
> 
> MBR, Sergei
> 
> 
> .
> 

^ permalink raw reply	[flat|nested] 29+ messages in thread

* Re: [PATCH net-next 10/19] net: hns: bugfix about pfc pause frame statistics
  2016-06-21 10:32   ` Andy Shevchenko
@ 2016-06-22  1:43     ` Yisen Zhuang
  2016-06-22  9:41       ` Andy Shevchenko
  0 siblings, 1 reply; 29+ messages in thread
From: Yisen Zhuang @ 2016-06-22  1:43 UTC (permalink / raw)
  To: Andy Shevchenko, davem, salil.mehta, yankejian
  Cc: liguozhu, huangdaode, arnd, andrew, geliangtang, ivecera,
	fengguang.wu, charles.chenxin, netdev, linux-kernel,
	linux-arm-kernel, linuxarm



在 2016/6/21 18:32, Andy Shevchenko 写道:
> On Tue, 2016-06-21 at 11:56 +0800, Yisen Zhuang wrote:
>> From: Daode Huang <huangdaode@hisilicon.com>
>>
>> For SoC hip06, PFC pause handled in dsaf, while hip05 in XGMAC,
>> so change the statistics of pfc pause in dsaf and remove the old
>> pfc pause frame statistics.
>>
> 
> 
>> +static char *hns_dsaf_get_node_stats_strings(char *data, int node,
>> +					     struct dsaf_device
>> *dsaf_dev)
>>  {
>>  	char *buff = data;
>> +	int i;
>> +	bool is_ver1 = AE_IS_VER1(dsaf_dev->dsaf_ver);
>>  
>>  	snprintf(buff, ETH_GSTRING_LEN, "innod%d_pad_drop_pkts",
>> node);
>>  	buff = buff + ETH_GSTRING_LEN;
>> @@ -2502,6 +2530,18 @@ static char
>> *hns_dsaf_get_node_stats_strings(char *data, int node)
>>  	buff = buff + ETH_GSTRING_LEN;
>>  	snprintf(buff, ETH_GSTRING_LEN, "innod%d_stp_drop_pkts",
>> node);
>>  	buff = buff + ETH_GSTRING_LEN;
>> +	if ((node < DSAF_SERVICE_NW_NUM) && (!is_ver1)) {
> 
> Redundant parens.
> 
>> +		for (i = 0; i < DSAF_PRIO_NR; i++) {
>> +			snprintf(buff, ETH_GSTRING_LEN,
>> +				 "inod%d_pfc_prio%d_pkts", node, i);
>> +			buff = buff + ETH_GSTRING_LEN;
> 
> buff += ...
> 
>> +		}
>> +		for (i = 0; i < DSAF_PRIO_NR; i++) {
>> +			snprintf(buff, ETH_GSTRING_LEN,
>> +				 "onod%d_pfc_prio%d_pkts", node, i);
>> +			buff = buff + ETH_GSTRING_LEN;
> 
> Ditto.
> 
>>  {
>>  	u64 *p = data;
>> +	int i;
>>  	struct dsaf_hw_stats *hw_stats = &ddev->hw_stats[node_num];
>> +	bool is_ver1 = AE_IS_VER1(ddev->dsaf_ver);
>>  
>>  	p[0] = hw_stats->pad_drop;
>>  	p[1] = hw_stats->man_pkts;
>> @@ -2527,8 +2569,16 @@ static u64 *hns_dsaf_get_node_stats(struct
>> dsaf_device *ddev, u64 *data,
>>  	p[10] = hw_stats->local_addr_false;
>>  	p[11] = hw_stats->vlan_drop;
>>  	p[12] = hw_stats->stp_drop;
>> -	p[13] = hw_stats->tx_pkts;
>> +	if ((node_num < DSAF_SERVICE_NW_NUM) && (!is_ver1)) {
>> +		for (i = 0; i < DSAF_PRIO_NR; i++) {
>> +			p[13 + i] = hw_stats->rx_pfc[i];
>> +			p[13 + i + DSAF_PRIO_NR] = hw_stats-
>>> tx_pfc[i];
>> +		}
> 
> Two different approaches how to assign data. Above uses 2 for-loops,
> here you put everything to one.

Above cann't be merged to 1 for-loop, because lenght of the string is unknowable.

And here we put everything to one to reduce codes.

I will generate a new patch to fix other comments.

Thanks,

Yisen

> 
>> +		p[29] = hw_stats->tx_pkts;
>> +		return &p[30];
>> +	}
>>  
>> +	p[13] = hw_stats->tx_pkts;
>>  	return &p[14];
>>  }
> 

^ permalink raw reply	[flat|nested] 29+ messages in thread

* Re: [PATCH net-next 10/19] net: hns: bugfix about pfc pause frame statistics
  2016-06-22  1:43     ` Yisen Zhuang
@ 2016-06-22  9:41       ` Andy Shevchenko
  2016-06-23  5:42         ` Yisen Zhuang
  0 siblings, 1 reply; 29+ messages in thread
From: Andy Shevchenko @ 2016-06-22  9:41 UTC (permalink / raw)
  To: Yisen Zhuang, davem, salil.mehta, yankejian
  Cc: liguozhu, huangdaode, arnd, andrew, geliangtang, ivecera,
	fengguang.wu, charles.chenxin, netdev, linux-kernel,
	linux-arm-kernel, linuxarm

On Wed, 2016-06-22 at 09:43 +0800, Yisen Zhuang wrote:
> 
> 在 2016/6/21 18:32, Andy Shevchenko 写道:
> > On Tue, 2016-06-21 at 11:56 +0800, Yisen Zhuang wrote:
> > > From: Daode Huang <huangdaode@hisilicon.com>
> > > 
> > > For SoC hip06, PFC pause handled in dsaf, while hip05 in XGMAC,
> > > so change the statistics of pfc pause in dsaf and remove the old
> > > pfc pause frame statistics.
> > > 
> > 
> > 
> > > +static char *hns_dsaf_get_node_stats_strings(char *data, int
> > > node,
> > > +					     struct dsaf_device
> > > *dsaf_dev)
> > >  {
> > >  	char *buff = data;
> > > +	int i;
> > > +	bool is_ver1 = AE_IS_VER1(dsaf_dev->dsaf_ver);
> > >  
> > >  	snprintf(buff, ETH_GSTRING_LEN, "innod%d_pad_drop_pkts",
> > > node);
> > >  	buff = buff + ETH_GSTRING_LEN;
> > > @@ -2502,6 +2530,18 @@ static char
> > > *hns_dsaf_get_node_stats_strings(char *data, int node)
> > >  	buff = buff + ETH_GSTRING_LEN;
> > >  	snprintf(buff, ETH_GSTRING_LEN, "innod%d_stp_drop_pkts",
> > > node);
> > >  	buff = buff + ETH_GSTRING_LEN;
> > > +	if ((node < DSAF_SERVICE_NW_NUM) && (!is_ver1)) {
> > 
> > Redundant parens.
> > 
> > > +		for (i = 0; i < DSAF_PRIO_NR; i++) {
> > > +			snprintf(buff, ETH_GSTRING_LEN,
> > > +				 "inod%d_pfc_prio%d_pkts", node,
> > > i);
> > > +			buff = buff + ETH_GSTRING_LEN;
> > 
> > buff += ...
> > 
> > > +		}
> > > +		for (i = 0; i < DSAF_PRIO_NR; i++) {
> > > +			snprintf(buff, ETH_GSTRING_LEN,
> > > +				 "onod%d_pfc_prio%d_pkts", node,
> > > i);
> > > +			buff = buff + ETH_GSTRING_LEN;
> > 
> > Ditto.
> > 
> > >  {
> > >  	u64 *p = data;
> > > +	int i;
> > >  	struct dsaf_hw_stats *hw_stats = &ddev-
> > > >hw_stats[node_num];
> > > +	bool is_ver1 = AE_IS_VER1(ddev->dsaf_ver);
> > >  
> > >  	p[0] = hw_stats->pad_drop;
> > >  	p[1] = hw_stats->man_pkts;
> > > @@ -2527,8 +2569,16 @@ static u64 *hns_dsaf_get_node_stats(struct
> > > dsaf_device *ddev, u64 *data,
> > >  	p[10] = hw_stats->local_addr_false;
> > >  	p[11] = hw_stats->vlan_drop;
> > >  	p[12] = hw_stats->stp_drop;
> > > -	p[13] = hw_stats->tx_pkts;
> > > +	if ((node_num < DSAF_SERVICE_NW_NUM) && (!is_ver1)) {
> > > +		for (i = 0; i < DSAF_PRIO_NR; i++) {
> > > +			p[13 + i] = hw_stats->rx_pfc[i];
> > > +			p[13 + i + DSAF_PRIO_NR] = hw_stats-
> > > > tx_pfc[i];
> > > +		}
> > 
> > Two different approaches how to assign data. Above uses 2 for-loops,
> > here you put everything to one.
> 
> Above cann't be merged to 1 for-loop, because lenght of the string is
> unknowable.

It doesn't matter since you are incrementing start position by
constant. 

snprintf(buff, ETH_GSTRING_LEN, "inod%d_pfc_prio%d_pkts", node, i);
snprintf(buff, ETH_GSTRING_LEN, "onod%d_pfc_prio%d_pkts", node, i);

Same approach as below can be used

snprintf(buff + 0 * ETH_GSTRING_LEN * DSAF_PRIO_NR, ETH_GSTRING_LEN, ...
snprintf(buff + 1 * ETH_GSTRING_LEN * DSAF_PRIO_NR, ETH_GSTRING_LEN, ...

Of course to make it less verbose you may add new definition(s) and/ or
variable(s).

> 
> And here we put everything to one to reduce codes.
> 

I would suggest to use following pattern for such lines
p[13 + i + 0 * DSAF_PRIO_NR] = hw_stats->rx_pfc[i];
p[13 + i + 1 * DSAF_PRIO_NR] = hw_stats->tx_pfc[i];

That's allow reader to see what are you doing here.

P.S. This is for the future patches since current is already applied.

-- 

Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Intel Finland Oy

^ permalink raw reply	[flat|nested] 29+ messages in thread

* Re: [PATCH net-next 10/19] net: hns: bugfix about pfc pause frame statistics
  2016-06-22  9:41       ` Andy Shevchenko
@ 2016-06-23  5:42         ` Yisen Zhuang
  0 siblings, 0 replies; 29+ messages in thread
From: Yisen Zhuang @ 2016-06-23  5:42 UTC (permalink / raw)
  To: Andy Shevchenko, davem, salil.mehta, yankejian
  Cc: liguozhu, huangdaode, arnd, andrew, geliangtang, ivecera,
	fengguang.wu, charles.chenxin, netdev, linux-kernel,
	linux-arm-kernel, linuxarm



在 2016/6/22 17:41, Andy Shevchenko 写道:
> On Wed, 2016-06-22 at 09:43 +0800, Yisen Zhuang wrote:
>>
>> 在 2016/6/21 18:32, Andy Shevchenko 写道:
>>> On Tue, 2016-06-21 at 11:56 +0800, Yisen Zhuang wrote:
>>>> From: Daode Huang <huangdaode@hisilicon.com>
>>>>
>>>> For SoC hip06, PFC pause handled in dsaf, while hip05 in XGMAC,
>>>> so change the statistics of pfc pause in dsaf and remove the old
>>>> pfc pause frame statistics.
>>>>
>>>  
>>>
>>>> +static char *hns_dsaf_get_node_stats_strings(char *data, int
>>>> node,
>>>> +					     struct dsaf_device
>>>> *dsaf_dev)
>>>>  {
>>>>  	char *buff = data;
>>>> +	int i;
>>>> +	bool is_ver1 = AE_IS_VER1(dsaf_dev->dsaf_ver);
>>>>  
>>>>  	snprintf(buff, ETH_GSTRING_LEN, "innod%d_pad_drop_pkts",
>>>> node);
>>>>  	buff = buff + ETH_GSTRING_LEN;
>>>> @@ -2502,6 +2530,18 @@ static char
>>>> *hns_dsaf_get_node_stats_strings(char *data, int node)
>>>>  	buff = buff + ETH_GSTRING_LEN;
>>>>  	snprintf(buff, ETH_GSTRING_LEN, "innod%d_stp_drop_pkts",
>>>> node);
>>>>  	buff = buff + ETH_GSTRING_LEN;
>>>> +	if ((node < DSAF_SERVICE_NW_NUM) && (!is_ver1)) {
>>>
>>> Redundant parens.
>>>
>>>> +		for (i = 0; i < DSAF_PRIO_NR; i++) {
>>>> +			snprintf(buff, ETH_GSTRING_LEN,
>>>> +				 "inod%d_pfc_prio%d_pkts", node,
>>>> i);
>>>> +			buff = buff + ETH_GSTRING_LEN;
>>>
>>> buff += ...
>>>
>>>> +		}
>>>> +		for (i = 0; i < DSAF_PRIO_NR; i++) {
>>>> +			snprintf(buff, ETH_GSTRING_LEN,
>>>> +				 "onod%d_pfc_prio%d_pkts", node,
>>>> i);
>>>> +			buff = buff + ETH_GSTRING_LEN;
>>>
>>> Ditto.
>>>
>>>>  {
>>>>  	u64 *p = data;
>>>> +	int i;
>>>>  	struct dsaf_hw_stats *hw_stats = &ddev-
>>>>> hw_stats[node_num];
>>>> +	bool is_ver1 = AE_IS_VER1(ddev->dsaf_ver);
>>>>  
>>>>  	p[0] = hw_stats->pad_drop;
>>>>  	p[1] = hw_stats->man_pkts;
>>>> @@ -2527,8 +2569,16 @@ static u64 *hns_dsaf_get_node_stats(struct
>>>> dsaf_device *ddev, u64 *data,
>>>>  	p[10] = hw_stats->local_addr_false;
>>>>  	p[11] = hw_stats->vlan_drop;
>>>>  	p[12] = hw_stats->stp_drop;
>>>> -	p[13] = hw_stats->tx_pkts;
>>>> +	if ((node_num < DSAF_SERVICE_NW_NUM) && (!is_ver1)) {
>>>> +		for (i = 0; i < DSAF_PRIO_NR; i++) {
>>>> +			p[13 + i] = hw_stats->rx_pfc[i];
>>>> +			p[13 + i + DSAF_PRIO_NR] = hw_stats-
>>>>> tx_pfc[i];
>>>> +		}
>>>
>>> Two different approaches how to assign data. Above uses 2 for-loops,
>>> here you put everything to one.
>>
>> Above cann't be merged to 1 for-loop, because lenght of the string is
>> unknowable.
> 
> It doesn't matter since you are incrementing start position by
> constant. 
> 
> snprintf(buff, ETH_GSTRING_LEN, "inod%d_pfc_prio%d_pkts", node, i);
> snprintf(buff, ETH_GSTRING_LEN, "onod%d_pfc_prio%d_pkts", node, i);
> 
> Same approach as below can be used
> 
> snprintf(buff + 0 * ETH_GSTRING_LEN * DSAF_PRIO_NR, ETH_GSTRING_LEN, ...
> snprintf(buff + 1 * ETH_GSTRING_LEN * DSAF_PRIO_NR, ETH_GSTRING_LEN, ...
> 
> Of course to make it less verbose you may add new definition(s) and/ or
> variable(s).
> 
>>
>> And here we put everything to one to reduce codes.
>>
> 
> I would suggest to use following pattern for such lines
> p[13 + i + 0 * DSAF_PRIO_NR] = hw_stats->rx_pfc[i];
> p[13 + i + 1 * DSAF_PRIO_NR] = hw_stats->tx_pfc[i];
> 
> That's allow reader to see what are you doing here.
> 
> P.S. This is for the future patches since current is already applied.

Hi Andy,

Many thanks for you suggestions. I will fix it with a new patch.

Thanks,

Yisen

> 

^ permalink raw reply	[flat|nested] 29+ messages in thread

end of thread, other threads:[~2016-06-23  5:43 UTC | newest]

Thread overview: 29+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-06-21  3:56 [PATCH net-next 00/19] net: hns: fix some bugs in hns driver Yisen Zhuang
2016-06-21  3:56 ` [PATCH net-next 01/19] net: hns: bug fix of ge reset sequence Yisen Zhuang
2016-06-21 10:35   ` Andy Shevchenko
2016-06-22  1:33     ` Yisen Zhuang
2016-06-21  3:56 ` [PATCH net-next 02/19] net: hns: fix hns dsaf v1 dont support tx_pause close Yisen Zhuang
2016-06-21  3:56 ` [PATCH net-next 03/19] net: hns: add skb_reset_mac_header() after skb being alloc Yisen Zhuang
2016-06-21  3:56 ` [PATCH net-next 04/19] net: hns: typo fix of annotation info for hns_nic_reset_subtask() Yisen Zhuang
2016-06-21  3:56 ` [PATCH net-next 05/19] net: hns: Remove unnecessary device resource free Yisen Zhuang
2016-06-21  3:56 ` [PATCH net-next 06/19] net: hns: fix the error info when dma_set_mask_and_coherent fail Yisen Zhuang
2016-06-21  3:56 ` [PATCH net-next 07/19] net: hns: select Hilink before serdes loopback for HNS V2 Yisen Zhuang
2016-06-21  3:56 ` [PATCH net-next 08/19] net: hns: fix ethtool loopback fail bug Yisen Zhuang
2016-06-21  3:56 ` [PATCH net-next 09/19] net: hns: fix the wrong speed for bond Yisen Zhuang
2016-06-21  3:56 ` [PATCH net-next 10/19] net: hns: bugfix about pfc pause frame statistics Yisen Zhuang
2016-06-21 10:32   ` Andy Shevchenko
2016-06-22  1:43     ` Yisen Zhuang
2016-06-22  9:41       ` Andy Shevchenko
2016-06-23  5:42         ` Yisen Zhuang
2016-06-21  3:56 ` [PATCH net-next 11/19] net: hns: add spin lock for tcam table operation Yisen Zhuang
2016-06-21  3:56 ` [PATCH net-next 12/19] net: hns: fix bug of getting the wrong tcam data Yisen Zhuang
2016-06-21  3:56 ` [PATCH net-next 13/19] net: hns: add get_coalesce_range api for hns Yisen Zhuang
2016-06-21  3:56 ` [PATCH net-next 14/19] net: hns: delete redundancy ring enable operations Yisen Zhuang
2016-06-21  3:56 ` [PATCH net-next 15/19] net: hns: bug fix about led control logic when link down Yisen Zhuang
2016-06-21  3:56 ` [PATCH net-next 16/19] net: hns: fix bug that alloc skb fail lead to port unavailable Yisen Zhuang
2016-06-21 13:25   ` Sergei Shtylyov
2016-06-22  1:41     ` Yisen Zhuang
2016-06-21  3:56 ` [PATCH net-next 17/19] net: hns: fix sbm default parameters config error Yisen Zhuang
2016-06-21  3:56 ` [PATCH net-next 18/19] net: hns: change the default coalesce usecs Yisen Zhuang
2016-06-21  3:56 ` [PATCH net-next 19/19] net: hns: bug fix about TSO on|off when there is traffic Yisen Zhuang
2016-06-21  8:54 ` [PATCH net-next 00/19] net: hns: fix some bugs in hns driver David Miller

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).