Re: [PATCH] net: hns: dereference ppe_cb->ppe_common_cb if it is non-null

2016-08-25 Thread Yisen Zhuang


在 2016/8/25 14:51, Colin King 写道:
> From: Colin Ian King <colin.k...@canonical.com>
> 
> ppe_cb->ppe_common_cb is being dereferenced before a null check is
> being made on it.  If ppe_cb->ppe_common_cb is null then we end up
> with a null pointer dereference when assigning dsaf_dev.  Fix this
> by moving the initialisation of dsaf_dev once we know
> ppe_cb->ppe_common_cb is OK to dereference.
> 
> Signed-off-by: Colin Ian King <colin.k...@canonical.com>

Acked-by: Yisen Zhuang <yisen.zhu...@huawei.com>



Re: [PATCH] net: hns: dereference ppe_cb->ppe_common_cb if it is non-null

2016-08-25 Thread Yisen Zhuang


在 2016/8/25 14:51, Colin King 写道:
> From: Colin Ian King 
> 
> ppe_cb->ppe_common_cb is being dereferenced before a null check is
> being made on it.  If ppe_cb->ppe_common_cb is null then we end up
> with a null pointer dereference when assigning dsaf_dev.  Fix this
> by moving the initialisation of dsaf_dev once we know
> ppe_cb->ppe_common_cb is OK to dereference.
> 
> Signed-off-by: Colin Ian King 

Acked-by: Yisen Zhuang 



Re: [PATCH 1/1 linux-next] net: hns: fix typo in g_gmac_stats_string[]

2016-08-10 Thread Yisen Zhuang
Hi Fabian,

This patch is fine to me, many thanks.

Yisen

在 2016/8/10 23:48, Fabian Frederick 写道:
> s/gamc/gmac/
> 
> Signed-off-by: Fabian Frederick 
> ---
>  drivers/net/ethernet/hisilicon/hns/hns_dsaf_gmac.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_gmac.c 
> b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_gmac.c
> index 1235c7f..1e1eb92 100644
> --- a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_gmac.c
> +++ b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_gmac.c
> @@ -17,7 +17,7 @@ static const struct mac_stats_string g_gmac_stats_string[] 
> = {
>   {"gmac_rx_octets_total_ok", MAC_STATS_FIELD_OFF(rx_good_bytes)},
>   {"gmac_rx_octets_bad", MAC_STATS_FIELD_OFF(rx_bad_bytes)},
>   {"gmac_rx_uc_pkts", MAC_STATS_FIELD_OFF(rx_uc_pkts)},
> - {"gamc_rx_mc_pkts", MAC_STATS_FIELD_OFF(rx_mc_pkts)},
> + {"gmac_rx_mc_pkts", MAC_STATS_FIELD_OFF(rx_mc_pkts)},
>   {"gmac_rx_bc_pkts", MAC_STATS_FIELD_OFF(rx_bc_pkts)},
>   {"gmac_rx_pkts_64octets", MAC_STATS_FIELD_OFF(rx_64bytes)},
>   {"gmac_rx_pkts_65to127", MAC_STATS_FIELD_OFF(rx_65to127)},
> 



Re: [PATCH 1/1 linux-next] net: hns: fix typo in g_gmac_stats_string[]

2016-08-10 Thread Yisen Zhuang
Hi Fabian,

This patch is fine to me, many thanks.

Yisen

在 2016/8/10 23:48, Fabian Frederick 写道:
> s/gamc/gmac/
> 
> Signed-off-by: Fabian Frederick 
> ---
>  drivers/net/ethernet/hisilicon/hns/hns_dsaf_gmac.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_gmac.c 
> b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_gmac.c
> index 1235c7f..1e1eb92 100644
> --- a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_gmac.c
> +++ b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_gmac.c
> @@ -17,7 +17,7 @@ static const struct mac_stats_string g_gmac_stats_string[] 
> = {
>   {"gmac_rx_octets_total_ok", MAC_STATS_FIELD_OFF(rx_good_bytes)},
>   {"gmac_rx_octets_bad", MAC_STATS_FIELD_OFF(rx_bad_bytes)},
>   {"gmac_rx_uc_pkts", MAC_STATS_FIELD_OFF(rx_uc_pkts)},
> - {"gamc_rx_mc_pkts", MAC_STATS_FIELD_OFF(rx_mc_pkts)},
> + {"gmac_rx_mc_pkts", MAC_STATS_FIELD_OFF(rx_mc_pkts)},
>   {"gmac_rx_bc_pkts", MAC_STATS_FIELD_OFF(rx_bc_pkts)},
>   {"gmac_rx_pkts_64octets", MAC_STATS_FIELD_OFF(rx_64bytes)},
>   {"gmac_rx_pkts_65to127", MAC_STATS_FIELD_OFF(rx_65to127)},
> 



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

2016-07-01 Thread Yisen Zhuang
From: Daode Huang <huangda...@hisilicon.com>

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

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

diff --git a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c 
b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c
index e36ee22..86ce28a 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c
+++ b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c
@@ -2567,15 +2567,15 @@ static char *hns_dsaf_get_node_stats_strings(char 
*data, int node,
buff += ETH_GSTRING_LEN;
if (node < DSAF_SERVICE_NW_NUM && !is_ver1) {
for (i = 0; i < DSAF_PRIO_NR; i++) {
-   snprintf(buff, ETH_GSTRING_LEN,
-"inod%d_pfc_prio%d_pkts", node, i);
-   buff += ETH_GSTRING_LEN;
-   }
-   for (i = 0; i < DSAF_PRIO_NR; i++) {
-   snprintf(buff, ETH_GSTRING_LEN,
-"onod%d_pfc_prio%d_pkts", node, i);
+   snprintf(buff + 0 * ETH_GSTRING_LEN * DSAF_PRIO_NR,
+ETH_GSTRING_LEN, "inod%d_pfc_prio%d_pkts",
+node, i);
+   snprintf(buff + 1 * ETH_GSTRING_LEN * DSAF_PRIO_NR,
+ETH_GSTRING_LEN, "onod%d_pfc_prio%d_pkts",
+node, i);
buff += ETH_GSTRING_LEN;
}
+   buff += 1 * DSAF_PRIO_NR * ETH_GSTRING_LEN;
}
snprintf(buff, ETH_GSTRING_LEN, "onnod%d_tx_pkts", node);
buff += ETH_GSTRING_LEN;
@@ -2606,8 +2606,8 @@ static u64 *hns_dsaf_get_node_stats(struct dsaf_device 
*ddev, u64 *data,
p[12] = hw_stats->stp_drop;
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[13 + i + 0 * DSAF_PRIO_NR] = hw_stats->rx_pfc[i];
+   p[13 + i + 1 * DSAF_PRIO_NR] = hw_stats->tx_pfc[i];
}
p[29] = hw_stats->tx_pkts;
return [30];
-- 
1.9.1



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

2016-07-01 Thread Yisen Zhuang
From: Daode Huang 

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

Signed-off-by: Daode Huang 
Signed-off-by: Yisen Zhuang 
---
 drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c | 18 +-
 1 file changed, 9 insertions(+), 9 deletions(-)

diff --git a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c 
b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c
index e36ee22..86ce28a 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c
+++ b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c
@@ -2567,15 +2567,15 @@ static char *hns_dsaf_get_node_stats_strings(char 
*data, int node,
buff += ETH_GSTRING_LEN;
if (node < DSAF_SERVICE_NW_NUM && !is_ver1) {
for (i = 0; i < DSAF_PRIO_NR; i++) {
-   snprintf(buff, ETH_GSTRING_LEN,
-"inod%d_pfc_prio%d_pkts", node, i);
-   buff += ETH_GSTRING_LEN;
-   }
-   for (i = 0; i < DSAF_PRIO_NR; i++) {
-   snprintf(buff, ETH_GSTRING_LEN,
-"onod%d_pfc_prio%d_pkts", node, i);
+   snprintf(buff + 0 * ETH_GSTRING_LEN * DSAF_PRIO_NR,
+ETH_GSTRING_LEN, "inod%d_pfc_prio%d_pkts",
+node, i);
+   snprintf(buff + 1 * ETH_GSTRING_LEN * DSAF_PRIO_NR,
+ETH_GSTRING_LEN, "onod%d_pfc_prio%d_pkts",
+node, i);
buff += ETH_GSTRING_LEN;
}
+   buff += 1 * DSAF_PRIO_NR * ETH_GSTRING_LEN;
}
snprintf(buff, ETH_GSTRING_LEN, "onnod%d_tx_pkts", node);
buff += ETH_GSTRING_LEN;
@@ -2606,8 +2606,8 @@ static u64 *hns_dsaf_get_node_stats(struct dsaf_device 
*ddev, u64 *data,
p[12] = hw_stats->stp_drop;
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[13 + i + 0 * DSAF_PRIO_NR] = hw_stats->rx_pfc[i];
+   p[13 + i + 1 * DSAF_PRIO_NR] = hw_stats->tx_pfc[i];
}
p[29] = hw_stats->tx_pkts;
return [30];
-- 
1.9.1



[PATCH v3 net-next 4/9] net: hns: delete redundant parenthese

2016-07-01 Thread Yisen Zhuang
From: Daode Huang <huangda...@hisilicon.com>

According to the previous review comments from Andy, this patch
deletes the redundant parens in the patch.

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

diff --git a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c 
b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c
index b9d01ea..e36ee22 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c
+++ b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c
@@ -2565,7 +2565,7 @@ static char *hns_dsaf_get_node_stats_strings(char *data, 
int node,
buff += ETH_GSTRING_LEN;
snprintf(buff, ETH_GSTRING_LEN, "innod%d_stp_drop_pkts", node);
buff += ETH_GSTRING_LEN;
-   if ((node < DSAF_SERVICE_NW_NUM) && (!is_ver1)) {
+   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);
@@ -2604,7 +2604,7 @@ 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;
-   if ((node_num < DSAF_SERVICE_NW_NUM) && (!is_ver1)) {
+   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];
-- 
1.9.1



[PATCH v3 net-next 4/9] net: hns: delete redundant parenthese

2016-07-01 Thread Yisen Zhuang
From: Daode Huang 

According to the previous review comments from Andy, this patch
deletes the redundant parens in the patch.

Signed-off-by: Daode Huang 
Signed-off-by: Yisen Zhuang 
---
 drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c 
b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c
index b9d01ea..e36ee22 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c
+++ b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c
@@ -2565,7 +2565,7 @@ static char *hns_dsaf_get_node_stats_strings(char *data, 
int node,
buff += ETH_GSTRING_LEN;
snprintf(buff, ETH_GSTRING_LEN, "innod%d_stp_drop_pkts", node);
buff += ETH_GSTRING_LEN;
-   if ((node < DSAF_SERVICE_NW_NUM) && (!is_ver1)) {
+   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);
@@ -2604,7 +2604,7 @@ 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;
-   if ((node_num < DSAF_SERVICE_NW_NUM) && (!is_ver1)) {
+   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];
-- 
1.9.1



[PATCH v3 net-next 7/9] net: hns: remove redundant hns_mac_dev_to_enet_if()

2016-07-01 Thread Yisen Zhuang
From: Kejian Yan <yankej...@huawei.com>

The sequence of hns_mac_dev_to_enet_if() is the same as
hns_get_enet_interface(), and hns_get_enet_interface() is called
by initialization to get the mac mode. And the mode is not changed
anywhere. Thus add hns_mac_dev_to_enet_if() function to get the mac
mode is obviously redundant.

Reported-by: Jinchuan Tian <tianjinchu...@huawei.com>
Signed-off-by: Kejian Yan <yankej...@huawei.com>
Signed-off-by: Yisen Zhuang <yisen.zhu...@huawei.com>
---
 drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.c | 15 ---
 1 file changed, 15 deletions(-)

diff --git a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.c 
b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.c
index c526558..d2effcc 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.c
+++ b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.c
@@ -56,20 +56,6 @@ static const enum mac_mode g_mac_mode_1000[] = {
[PHY_INTERFACE_MODE_RTBI]   = MAC_MODE_RTBI_1000
 };
 
-static enum mac_mode hns_mac_dev_to_enet_if(const struct hns_mac_cb *mac_cb)
-{
-   switch (mac_cb->max_speed) {
-   case MAC_SPEED_100:
-   return g_mac_mode_100[mac_cb->phy_if];
-   case MAC_SPEED_1000:
-   return g_mac_mode_1000[mac_cb->phy_if];
-   case MAC_SPEED_1:
-   return MAC_MODE_XGMII_1;
-   default:
-   return MAC_MODE_MII_100;
-   }
-}
-
 static enum mac_mode hns_get_enet_interface(const struct hns_mac_cb *mac_cb)
 {
switch (mac_cb->max_speed) {
@@ -134,7 +120,6 @@ void hns_mac_adjust_link(struct hns_mac_cb *mac_cb, int 
speed, int duplex)
 
mac_cb->speed = speed;
mac_cb->half_duplex = !duplex;
-   mac_ctrl_drv->mac_mode = hns_mac_dev_to_enet_if(mac_cb);
 
if (mac_ctrl_drv->adjust_link) {
ret = mac_ctrl_drv->adjust_link(mac_ctrl_drv,
-- 
1.9.1



[PATCH v3 net-next 7/9] net: hns: remove redundant hns_mac_dev_to_enet_if()

2016-07-01 Thread Yisen Zhuang
From: Kejian Yan 

The sequence of hns_mac_dev_to_enet_if() is the same as
hns_get_enet_interface(), and hns_get_enet_interface() is called
by initialization to get the mac mode. And the mode is not changed
anywhere. Thus add hns_mac_dev_to_enet_if() function to get the mac
mode is obviously redundant.

Reported-by: Jinchuan Tian 
Signed-off-by: Kejian Yan 
Signed-off-by: Yisen Zhuang 
---
 drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.c | 15 ---
 1 file changed, 15 deletions(-)

diff --git a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.c 
b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.c
index c526558..d2effcc 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.c
+++ b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.c
@@ -56,20 +56,6 @@ static const enum mac_mode g_mac_mode_1000[] = {
[PHY_INTERFACE_MODE_RTBI]   = MAC_MODE_RTBI_1000
 };
 
-static enum mac_mode hns_mac_dev_to_enet_if(const struct hns_mac_cb *mac_cb)
-{
-   switch (mac_cb->max_speed) {
-   case MAC_SPEED_100:
-   return g_mac_mode_100[mac_cb->phy_if];
-   case MAC_SPEED_1000:
-   return g_mac_mode_1000[mac_cb->phy_if];
-   case MAC_SPEED_1:
-   return MAC_MODE_XGMII_1;
-   default:
-   return MAC_MODE_MII_100;
-   }
-}
-
 static enum mac_mode hns_get_enet_interface(const struct hns_mac_cb *mac_cb)
 {
switch (mac_cb->max_speed) {
@@ -134,7 +120,6 @@ void hns_mac_adjust_link(struct hns_mac_cb *mac_cb, int 
speed, int duplex)
 
mac_cb->speed = speed;
mac_cb->half_duplex = !duplex;
-   mac_ctrl_drv->mac_mode = hns_mac_dev_to_enet_if(mac_cb);
 
if (mac_ctrl_drv->adjust_link) {
ret = mac_ctrl_drv->adjust_link(mac_ctrl_drv,
-- 
1.9.1



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

2016-07-01 Thread Yisen Zhuang
From: Daode Huang <huangda...@hisilicon.com>

This patch adds maintainers for hisilicon network subsystem driver

Signed-off-by: Daode Huang <huangda...@hisilicon.com>
Signed-off-by: Yisen Zhuang <yisen.zhu...@huawei.com>
---
change log:
 v3: match all files in and below drivers/net/ethernet/hisilicon/

 v2: the same as v1

 v1: first submit
  Link: https://lkml.org/lkml/2016/6/27/184
---
 MAINTAINERS | 9 +
 1 file changed, 9 insertions(+)

diff --git a/MAINTAINERS b/MAINTAINERS
index d8c0784..772c9ff 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -5437,6 +5437,15 @@ F:   include/uapi/linux/if_hippi.h
 F: net/802/hippi.c
 F: drivers/net/hippi/
 
+HISILICON NETWORK SUBSYSTEM DRIVER
+M: Yisen Zhuang <yisen.zhu...@huawei.com>
+M: Salil Mehta <salil.me...@huawei.com>
+L: net...@vger.kernel.org
+W: http://www.hisilicon.com
+S: Maintained
+F: drivers/net/ethernet/hisilicon/
+F: Documentation/devicetree/bindings/net/hisilicon*.txt
+
 HISILICON SAS Controller
 M: John Garry <john.ga...@huawei.com>
 W: http://www.hisilicon.com
-- 
1.9.1



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

2016-07-01 Thread Yisen Zhuang
From: Daode Huang 

This patch adds maintainers for hisilicon network subsystem driver

Signed-off-by: Daode Huang 
Signed-off-by: Yisen Zhuang 
---
change log:
 v3: match all files in and below drivers/net/ethernet/hisilicon/

 v2: the same as v1

 v1: first submit
  Link: https://lkml.org/lkml/2016/6/27/184
---
 MAINTAINERS | 9 +
 1 file changed, 9 insertions(+)

diff --git a/MAINTAINERS b/MAINTAINERS
index d8c0784..772c9ff 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -5437,6 +5437,15 @@ F:   include/uapi/linux/if_hippi.h
 F: net/802/hippi.c
 F: drivers/net/hippi/
 
+HISILICON NETWORK SUBSYSTEM DRIVER
+M: Yisen Zhuang 
+M: Salil Mehta 
+L: net...@vger.kernel.org
+W: http://www.hisilicon.com
+S: Maintained
+F: drivers/net/ethernet/hisilicon/
+F: Documentation/devicetree/bindings/net/hisilicon*.txt
+
 HISILICON SAS Controller
 M: John Garry 
 W: http://www.hisilicon.com
-- 
1.9.1



[PATCH v3 net-next 2/9] net: hns: fix code style about hns driver

2016-07-01 Thread Yisen Zhuang
From: Daode Huang <huangda...@hisilicon.com>

This patch fixes code sytle of hns driver to make it
simple.

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

diff --git a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_misc.c 
b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_misc.c
index 8473287..611b67b 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_misc.c
+++ b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_misc.c
@@ -253,10 +253,9 @@ static void hns_dsaf_ge_srst_by_port(struct dsaf_device 
*dsaf_dev, u32 port,
reg_val_1  = 0x1 << port;
port_rst_off = dsaf_dev->mac_cb[port]->port_rst_off;
/* there is difference between V1 and V2 in register.*/
-   if (AE_IS_VER1(dsaf_dev->dsaf_ver))
-   reg_val_2  = 0x1041041 << port_rst_off;
-   else
-   reg_val_2  = 0x2082082 << port_rst_off;
+   reg_val_2 = AE_IS_VER1(dsaf_dev->dsaf_ver) ?
+   0x1041041 : 0x2082082;
+   reg_val_2 <<= port_rst_off;
 
if (!dereset) {
dsaf_write_sub(dsaf_dev, DSAF_SUB_SC_GE_RESET_REQ1_REG,
@@ -272,12 +271,11 @@ static void hns_dsaf_ge_srst_by_port(struct dsaf_device 
*dsaf_dev, u32 port,
   reg_val_1);
}
} else {
-   reg_val_1 = 0x15540 << dsaf_dev->reset_offset;
+   reg_val_1 = 0x15540;
+   reg_val_2 = AE_IS_VER1(dsaf_dev->dsaf_ver) ? 0x100 : 0x40;
 
-   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 <<= 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,
-- 
1.9.1



[PATCH v3 net-next 0/9] net: hns: fix the typo of hns

2016-07-01 Thread Yisen Zhuang
This series includes typo fixes which review by Andy, adding
the hns maintainer to MAINTAINERS, as below:

 > from Daode: adds the maintainer for hns driver;

 > from Daode: fix the typo of hns reviewed by Andy Shevchenko;

 > from Kejian: one remove redundant function and two fix to get 
configuration from DT.

changlog:
 v2 -> v3:
  match all files in and below drivers/net/ethernet/hisilicon/

 v1 -> v2:
  fix the indentations reviewed by David.

Daode Huang (6):
  MAINTAINERS: add maintainers for hns driver
  net: hns: fix code style about hns driver
  net: hns: change code style from a = a + x to a += x
  net: hns: delete redundant parenthese
  net: hns: add a space before "*/"
  net: hns: normalize two different loop

Kejian Yan (3):
  net: hns: remove redundant hns_mac_dev_to_enet_if()
  net: hns: add media-type property for hns
  net: hns: get reset registers from DT

 MAINTAINERS|  9 +++
 drivers/net/ethernet/hisilicon/hns/hnae.h  |  9 +++
 drivers/net/ethernet/hisilicon/hns/hns_ae_adapt.c  |  1 +
 drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.c  | 41 +++
 drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.h  |  1 +
 drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c | 52 +++---
 drivers/net/ethernet/hisilicon/hns/hns_dsaf_misc.c | 16 ++---
 drivers/net/ethernet/hisilicon/hns/hns_enet.c  |  4 +-
 drivers/net/ethernet/hisilicon/hns/hns_ethtool.c   | 14 +++-
 drivers/net/ethernet/hisilicon/hns_mdio.c  | 80 ++
 10 files changed, 158 insertions(+), 69 deletions(-)

-- 
1.9.1



[PATCH v3 net-next 2/9] net: hns: fix code style about hns driver

2016-07-01 Thread Yisen Zhuang
From: Daode Huang 

This patch fixes code sytle of hns driver to make it
simple.

Signed-off-by: Daode Huang 
Signed-off-by: Yisen Zhuang 
---
 drivers/net/ethernet/hisilicon/hns/hns_dsaf_misc.c | 16 +++-
 1 file changed, 7 insertions(+), 9 deletions(-)

diff --git a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_misc.c 
b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_misc.c
index 8473287..611b67b 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_misc.c
+++ b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_misc.c
@@ -253,10 +253,9 @@ static void hns_dsaf_ge_srst_by_port(struct dsaf_device 
*dsaf_dev, u32 port,
reg_val_1  = 0x1 << port;
port_rst_off = dsaf_dev->mac_cb[port]->port_rst_off;
/* there is difference between V1 and V2 in register.*/
-   if (AE_IS_VER1(dsaf_dev->dsaf_ver))
-   reg_val_2  = 0x1041041 << port_rst_off;
-   else
-   reg_val_2  = 0x2082082 << port_rst_off;
+   reg_val_2 = AE_IS_VER1(dsaf_dev->dsaf_ver) ?
+   0x1041041 : 0x2082082;
+   reg_val_2 <<= port_rst_off;
 
if (!dereset) {
dsaf_write_sub(dsaf_dev, DSAF_SUB_SC_GE_RESET_REQ1_REG,
@@ -272,12 +271,11 @@ static void hns_dsaf_ge_srst_by_port(struct dsaf_device 
*dsaf_dev, u32 port,
   reg_val_1);
}
} else {
-   reg_val_1 = 0x15540 << dsaf_dev->reset_offset;
+   reg_val_1 = 0x15540;
+   reg_val_2 = AE_IS_VER1(dsaf_dev->dsaf_ver) ? 0x100 : 0x40;
 
-   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 <<= 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,
-- 
1.9.1



[PATCH v3 net-next 0/9] net: hns: fix the typo of hns

2016-07-01 Thread Yisen Zhuang
This series includes typo fixes which review by Andy, adding
the hns maintainer to MAINTAINERS, as below:

 > from Daode: adds the maintainer for hns driver;

 > from Daode: fix the typo of hns reviewed by Andy Shevchenko;

 > from Kejian: one remove redundant function and two fix to get 
configuration from DT.

changlog:
 v2 -> v3:
  match all files in and below drivers/net/ethernet/hisilicon/

 v1 -> v2:
  fix the indentations reviewed by David.

Daode Huang (6):
  MAINTAINERS: add maintainers for hns driver
  net: hns: fix code style about hns driver
  net: hns: change code style from a = a + x to a += x
  net: hns: delete redundant parenthese
  net: hns: add a space before "*/"
  net: hns: normalize two different loop

Kejian Yan (3):
  net: hns: remove redundant hns_mac_dev_to_enet_if()
  net: hns: add media-type property for hns
  net: hns: get reset registers from DT

 MAINTAINERS|  9 +++
 drivers/net/ethernet/hisilicon/hns/hnae.h  |  9 +++
 drivers/net/ethernet/hisilicon/hns/hns_ae_adapt.c  |  1 +
 drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.c  | 41 +++
 drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.h  |  1 +
 drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c | 52 +++---
 drivers/net/ethernet/hisilicon/hns/hns_dsaf_misc.c | 16 ++---
 drivers/net/ethernet/hisilicon/hns/hns_enet.c  |  4 +-
 drivers/net/ethernet/hisilicon/hns/hns_ethtool.c   | 14 +++-
 drivers/net/ethernet/hisilicon/hns_mdio.c  | 80 ++
 10 files changed, 158 insertions(+), 69 deletions(-)

-- 
1.9.1



[PATCH v3 net-next 5/9] net: hns: add a space before "*/"

2016-07-01 Thread Yisen Zhuang
From: Daode Huang <huangda...@hisilicon.com>

In comment line, some time miss a space before */, so this
patch adds a space before */.

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

diff --git a/drivers/net/ethernet/hisilicon/hns/hns_enet.c 
b/drivers/net/ethernet/hisilicon/hns/hns_enet.c
index d5297ec..d7e1f8c 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_enet.c
+++ b/drivers/net/ethernet/hisilicon/hns/hns_enet.c
@@ -762,13 +762,13 @@ static int hns_nic_rx_poll_one(struct hns_nic_ring_data 
*ring_data,
recv_pkts = 0, recv_bds = 0, clean_count = 0;
 recv:
while (recv_pkts < budget && recv_bds < num) {
-   /* reuse or realloc buffers*/
+   /* reuse or realloc buffers */
if (clean_count >= RCB_NOF_ALLOC_RX_BUFF_ONCE) {
hns_nic_alloc_rx_buffers(ring_data, clean_count);
clean_count = 0;
}
 
-   /* poll one pkt*/
+   /* poll one pkt */
err = hns_nic_poll_rx_skb(ring_data, , );
if (unlikely(!skb)) /* this fault cannot be repaired */
goto out;
-- 
1.9.1



[PATCH v3 net-next 8/9] net: hns: add media-type property for hns

2016-07-01 Thread Yisen Zhuang
From: Kejian Yan <yankej...@huawei.com>

It is PORT_TP type if the service port is GE mode. It is wrong to
judge the port type by using if it is service port. Adding the media
type to know port type.

Reported-by: Jinchuan Tian <tianjinchu...@huawei.com>
Signed-off-by: Kejian Yan <yankej...@huawei.com>
Signed-off-by: Yisen Zhuang <yisen.zhu...@huawei.com>
---
 drivers/net/ethernet/hisilicon/hns/hnae.h |  9 
 drivers/net/ethernet/hisilicon/hns/hns_ae_adapt.c |  1 +
 drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.c | 26 +++
 drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.h |  1 +
 drivers/net/ethernet/hisilicon/hns/hns_ethtool.c  | 14 +---
 5 files changed, 48 insertions(+), 3 deletions(-)

diff --git a/drivers/net/ethernet/hisilicon/hns/hnae.h 
b/drivers/net/ethernet/hisilicon/hns/hnae.h
index 3869322..e093cbf 100644
--- a/drivers/net/ethernet/hisilicon/hns/hnae.h
+++ b/drivers/net/ethernet/hisilicon/hns/hnae.h
@@ -363,6 +363,14 @@ enum hnae_port_type {
HNAE_PORT_DEBUG
 };
 
+/* mac media type */
+enum hnae_media_type {
+   HNAE_MEDIA_TYPE_UNKNOWN = 0,
+   HNAE_MEDIA_TYPE_FIBER,
+   HNAE_MEDIA_TYPE_COPPER,
+   HNAE_MEDIA_TYPE_BACKPLANE,
+};
+
 /* This struct defines the operation on the handle.
  *
  * get_handle(): (mandatory)
@@ -525,6 +533,7 @@ struct hnae_handle {
u32 eport_id;
u32 dport_id;   /* v2 tx bd should fill the dport_id */
enum hnae_port_type port_type;
+   enum hnae_media_type media_type;
struct list_head node;/* list to hnae_ae_dev->handle_list */
struct hnae_buf_ops *bops; /* operation for the buffer */
struct hnae_queue **qs;  /* array base of all queues */
diff --git a/drivers/net/ethernet/hisilicon/hns/hns_ae_adapt.c 
b/drivers/net/ethernet/hisilicon/hns/hns_ae_adapt.c
index 835521b..e28d960 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_ae_adapt.c
+++ b/drivers/net/ethernet/hisilicon/hns/hns_ae_adapt.c
@@ -134,6 +134,7 @@ struct hnae_handle *hns_ae_get_handle(struct hnae_ae_dev 
*dev,
ae_handle->phy_dev = vf_cb->mac_cb->phy_dev;
ae_handle->if_support = vf_cb->mac_cb->if_support;
ae_handle->port_type = vf_cb->mac_cb->mac_type;
+   ae_handle->media_type = vf_cb->mac_cb->media_type;
ae_handle->dport_id = port_id;
 
return ae_handle;
diff --git a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.c 
b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.c
index d2effcc..3fb87e2 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.c
+++ b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.c
@@ -733,6 +733,18 @@ static void hns_mac_register_phy(struct hns_mac_cb *mac_cb)
mac_cb->mac_id, addr);
 }
 
+#define MAC_MEDIA_TYPE_MAX_LEN 16
+
+static const struct {
+   enum hnae_media_type value;
+   const char *name;
+} media_type_defs[] = {
+   {HNAE_MEDIA_TYPE_UNKNOWN,   "unknown" },
+   {HNAE_MEDIA_TYPE_FIBER, "fiber" },
+   {HNAE_MEDIA_TYPE_COPPER,"copper" },
+   {HNAE_MEDIA_TYPE_BACKPLANE, "backplane" },
+};
+
 /**
  *hns_mac_get_info  - get mac information from device node
  *@mac_cb: mac device
@@ -744,10 +756,13 @@ static int  hns_mac_get_info(struct hns_mac_cb *mac_cb)
struct device_node *np;
struct regmap *syscon;
struct of_phandle_args cpld_args;
+   const char *media_type;
+   u32 i;
u32 ret;
 
mac_cb->link = false;
mac_cb->half_duplex = false;
+   mac_cb->media_type = HNAE_MEDIA_TYPE_UNKNOWN;
mac_cb->speed = mac_phy_to_speed[mac_cb->phy_if];
mac_cb->max_speed = mac_cb->speed;
 
@@ -849,6 +864,17 @@ static int  hns_mac_get_info(struct hns_mac_cb *mac_cb)
mac_cb->mac_id);
}
 
+   if (!fwnode_property_read_string(mac_cb->fw_port, "media-type",
+_type)) {
+   for (i = 0; i < ARRAY_SIZE(media_type_defs); i++) {
+   if (!strncmp(media_type_defs[i].name, media_type,
+MAC_MEDIA_TYPE_MAX_LEN)) {
+   mac_cb->media_type = media_type_defs[i].value;
+   break;
+   }
+   }
+   }
+
return 0;
 }
 
diff --git a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.h 
b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.h
index 05a6e8f..4cbdf14 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.h
+++ b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.h
@@ -335,6 +335,7 @@ struct hns_mac_cb {
u64 txpkt_for_led;
u64 rxpkt_for_led;
enum hnae_port_type mac_type;
+   enum hnae_media_type media_type;
phy_interface_t phy_if;
enum hnae_loop loop

[PATCH v3 net-next 5/9] net: hns: add a space before "*/"

2016-07-01 Thread Yisen Zhuang
From: Daode Huang 

In comment line, some time miss a space before */, so this
patch adds a space before */.

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

diff --git a/drivers/net/ethernet/hisilicon/hns/hns_enet.c 
b/drivers/net/ethernet/hisilicon/hns/hns_enet.c
index d5297ec..d7e1f8c 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_enet.c
+++ b/drivers/net/ethernet/hisilicon/hns/hns_enet.c
@@ -762,13 +762,13 @@ static int hns_nic_rx_poll_one(struct hns_nic_ring_data 
*ring_data,
recv_pkts = 0, recv_bds = 0, clean_count = 0;
 recv:
while (recv_pkts < budget && recv_bds < num) {
-   /* reuse or realloc buffers*/
+   /* reuse or realloc buffers */
if (clean_count >= RCB_NOF_ALLOC_RX_BUFF_ONCE) {
hns_nic_alloc_rx_buffers(ring_data, clean_count);
clean_count = 0;
}
 
-   /* poll one pkt*/
+   /* poll one pkt */
err = hns_nic_poll_rx_skb(ring_data, , );
if (unlikely(!skb)) /* this fault cannot be repaired */
goto out;
-- 
1.9.1



[PATCH v3 net-next 8/9] net: hns: add media-type property for hns

2016-07-01 Thread Yisen Zhuang
From: Kejian Yan 

It is PORT_TP type if the service port is GE mode. It is wrong to
judge the port type by using if it is service port. Adding the media
type to know port type.

Reported-by: Jinchuan Tian 
Signed-off-by: Kejian Yan 
Signed-off-by: Yisen Zhuang 
---
 drivers/net/ethernet/hisilicon/hns/hnae.h |  9 
 drivers/net/ethernet/hisilicon/hns/hns_ae_adapt.c |  1 +
 drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.c | 26 +++
 drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.h |  1 +
 drivers/net/ethernet/hisilicon/hns/hns_ethtool.c  | 14 +---
 5 files changed, 48 insertions(+), 3 deletions(-)

diff --git a/drivers/net/ethernet/hisilicon/hns/hnae.h 
b/drivers/net/ethernet/hisilicon/hns/hnae.h
index 3869322..e093cbf 100644
--- a/drivers/net/ethernet/hisilicon/hns/hnae.h
+++ b/drivers/net/ethernet/hisilicon/hns/hnae.h
@@ -363,6 +363,14 @@ enum hnae_port_type {
HNAE_PORT_DEBUG
 };
 
+/* mac media type */
+enum hnae_media_type {
+   HNAE_MEDIA_TYPE_UNKNOWN = 0,
+   HNAE_MEDIA_TYPE_FIBER,
+   HNAE_MEDIA_TYPE_COPPER,
+   HNAE_MEDIA_TYPE_BACKPLANE,
+};
+
 /* This struct defines the operation on the handle.
  *
  * get_handle(): (mandatory)
@@ -525,6 +533,7 @@ struct hnae_handle {
u32 eport_id;
u32 dport_id;   /* v2 tx bd should fill the dport_id */
enum hnae_port_type port_type;
+   enum hnae_media_type media_type;
struct list_head node;/* list to hnae_ae_dev->handle_list */
struct hnae_buf_ops *bops; /* operation for the buffer */
struct hnae_queue **qs;  /* array base of all queues */
diff --git a/drivers/net/ethernet/hisilicon/hns/hns_ae_adapt.c 
b/drivers/net/ethernet/hisilicon/hns/hns_ae_adapt.c
index 835521b..e28d960 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_ae_adapt.c
+++ b/drivers/net/ethernet/hisilicon/hns/hns_ae_adapt.c
@@ -134,6 +134,7 @@ struct hnae_handle *hns_ae_get_handle(struct hnae_ae_dev 
*dev,
ae_handle->phy_dev = vf_cb->mac_cb->phy_dev;
ae_handle->if_support = vf_cb->mac_cb->if_support;
ae_handle->port_type = vf_cb->mac_cb->mac_type;
+   ae_handle->media_type = vf_cb->mac_cb->media_type;
ae_handle->dport_id = port_id;
 
return ae_handle;
diff --git a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.c 
b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.c
index d2effcc..3fb87e2 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.c
+++ b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.c
@@ -733,6 +733,18 @@ static void hns_mac_register_phy(struct hns_mac_cb *mac_cb)
mac_cb->mac_id, addr);
 }
 
+#define MAC_MEDIA_TYPE_MAX_LEN 16
+
+static const struct {
+   enum hnae_media_type value;
+   const char *name;
+} media_type_defs[] = {
+   {HNAE_MEDIA_TYPE_UNKNOWN,   "unknown" },
+   {HNAE_MEDIA_TYPE_FIBER, "fiber" },
+   {HNAE_MEDIA_TYPE_COPPER,"copper" },
+   {HNAE_MEDIA_TYPE_BACKPLANE, "backplane" },
+};
+
 /**
  *hns_mac_get_info  - get mac information from device node
  *@mac_cb: mac device
@@ -744,10 +756,13 @@ static int  hns_mac_get_info(struct hns_mac_cb *mac_cb)
struct device_node *np;
struct regmap *syscon;
struct of_phandle_args cpld_args;
+   const char *media_type;
+   u32 i;
u32 ret;
 
mac_cb->link = false;
mac_cb->half_duplex = false;
+   mac_cb->media_type = HNAE_MEDIA_TYPE_UNKNOWN;
mac_cb->speed = mac_phy_to_speed[mac_cb->phy_if];
mac_cb->max_speed = mac_cb->speed;
 
@@ -849,6 +864,17 @@ static int  hns_mac_get_info(struct hns_mac_cb *mac_cb)
mac_cb->mac_id);
}
 
+   if (!fwnode_property_read_string(mac_cb->fw_port, "media-type",
+_type)) {
+   for (i = 0; i < ARRAY_SIZE(media_type_defs); i++) {
+   if (!strncmp(media_type_defs[i].name, media_type,
+MAC_MEDIA_TYPE_MAX_LEN)) {
+   mac_cb->media_type = media_type_defs[i].value;
+   break;
+   }
+   }
+   }
+
return 0;
 }
 
diff --git a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.h 
b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.h
index 05a6e8f..4cbdf14 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.h
+++ b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.h
@@ -335,6 +335,7 @@ struct hns_mac_cb {
u64 txpkt_for_led;
u64 rxpkt_for_led;
enum hnae_port_type mac_type;
+   enum hnae_media_type media_type;
phy_interface_t phy_if;
enum hnae_loop loop_mode;
 
diff --git a/drivers/net/ethernet/hisilicon/hns/hns_ethtool.c 
b/drivers/net/ethernet/hisilicon/hns/hns_ethtool

[PATCH v3 net-next 9/9] net: hns: get reset registers from DT

2016-07-01 Thread Yisen Zhuang
From: Kejian Yan <yankej...@huawei.com>

Since the registers of subctrl may be different, it is better to
mv the registers from hns mdio driver routine to device tree node.

Signed-off-by: Kejian Yan <yankej...@huawei.com>
Signed-off-by: Yisen Zhuang <yisen.zhu...@huawei.com>
---
change log:
 v2: fix the wrong indentations

 v1: first submit
  link: https://lkml.org/lkml/2016/6/27/182
---
 drivers/net/ethernet/hisilicon/hns_mdio.c | 80 +--
 1 file changed, 66 insertions(+), 14 deletions(-)

diff --git a/drivers/net/ethernet/hisilicon/hns_mdio.c 
b/drivers/net/ethernet/hisilicon/hns_mdio.c
index 761a32f..33f4c48 100644
--- a/drivers/net/ethernet/hisilicon/hns_mdio.c
+++ b/drivers/net/ethernet/hisilicon/hns_mdio.c
@@ -37,9 +37,19 @@
 
 #define MDIO_TIMEOUT   100
 
+struct hns_mdio_sc_reg {
+   u16 mdio_clk_en;
+   u16 mdio_clk_dis;
+   u16 mdio_reset_req;
+   u16 mdio_reset_dreq;
+   u16 mdio_clk_st;
+   u16 mdio_reset_st;
+};
+
 struct hns_mdio_device {
void *vbase;/* mdio reg base address */
struct regmap *subctrl_vbase;
+   struct hns_mdio_sc_reg sc_reg;
 };
 
 /* mdio reg */
@@ -93,7 +103,6 @@ enum mdio_c45_op_seq {
 #define MDIO_SC_CLK_DIS0x33C
 #define MDIO_SC_RESET_REQ  0xA38
 #define MDIO_SC_RESET_DREQ 0xA3C
-#define MDIO_SC_CTRL   0x2010
 #define MDIO_SC_CLK_ST 0x531C
 #define MDIO_SC_RESET_ST   0x5A1C
 
@@ -353,6 +362,7 @@ static int hns_mdio_read(struct mii_bus *bus, int phy_id, 
int regnum)
 static int hns_mdio_reset(struct mii_bus *bus)
 {
struct hns_mdio_device *mdio_dev = (struct hns_mdio_device *)bus->priv;
+   const struct hns_mdio_sc_reg *sc_reg;
int ret;
 
if (dev_of_node(bus->parent)) {
@@ -361,9 +371,10 @@ static int hns_mdio_reset(struct mii_bus *bus)
return -ENODEV;
}
 
+   sc_reg = _dev->sc_reg;
/* 1. reset req, and read reset st check */
-   ret = mdio_sc_cfg_reg_write(mdio_dev, MDIO_SC_RESET_REQ, 0x1,
-   MDIO_SC_RESET_ST, 0x1,
+   ret = mdio_sc_cfg_reg_write(mdio_dev, sc_reg->mdio_reset_req,
+   0x1, sc_reg->mdio_reset_st, 0x1,
MDIO_CHECK_SET_ST);
if (ret) {
dev_err(>dev, "MDIO reset fail\n");
@@ -371,8 +382,8 @@ static int hns_mdio_reset(struct mii_bus *bus)
}
 
/* 2. dis clk, and read clk st check */
-   ret = mdio_sc_cfg_reg_write(mdio_dev, MDIO_SC_CLK_DIS,
-   0x1, MDIO_SC_CLK_ST, 0x1,
+   ret = mdio_sc_cfg_reg_write(mdio_dev, sc_reg->mdio_clk_dis,
+   0x1, sc_reg->mdio_clk_st, 0x1,
MDIO_CHECK_CLR_ST);
if (ret) {
dev_err(>dev, "MDIO dis clk fail\n");
@@ -380,8 +391,8 @@ static int hns_mdio_reset(struct mii_bus *bus)
}
 
/* 3. reset dreq, and read reset st check */
-   ret = mdio_sc_cfg_reg_write(mdio_dev, MDIO_SC_RESET_DREQ, 0x1,
-   MDIO_SC_RESET_ST, 0x1,
+   ret = mdio_sc_cfg_reg_write(mdio_dev, sc_reg->mdio_reset_dreq,
+   0x1, sc_reg->mdio_reset_st, 0x1,
MDIO_CHECK_CLR_ST);
if (ret) {
dev_err(>dev, "MDIO dis clk fail\n");
@@ -389,8 +400,8 @@ static int hns_mdio_reset(struct mii_bus *bus)
}
 
/* 4. en clk, and read clk st check */
-   ret = mdio_sc_cfg_reg_write(mdio_dev, MDIO_SC_CLK_EN,
-   0x1, MDIO_SC_CLK_ST, 0x1,
+   ret = mdio_sc_cfg_reg_write(mdio_dev, sc_reg->mdio_clk_en,
+   0x1, sc_reg->mdio_clk_st, 0x1,
MDIO_CHECK_SET_ST);
if (ret)
dev_err(>dev, "MDIO en clk fail\n");
@@ -458,13 +469,54 @@ static int hns_mdio_probe(struct platform_device *pdev)
snprintf(new_bus->id, MII_BUS_ID_SIZE, "%s-%s", "Mii",
 dev_name(>dev));
if (dev_of_node(>dev)) {
-   mdio_dev->subctrl_vbase = syscon_node_to_regmap(
-   of_parse_phandle(pdev->dev.of_node,
-"subctrl-vbase", 0));
-   if (IS_ERR(mdio_dev->subctrl_vbase)) {
-   dev_warn(>dev, "no syscon 
hisilicon,peri-c-subctrl\n");
+   struct of_phan

[PATCH v3 net-next 9/9] net: hns: get reset registers from DT

2016-07-01 Thread Yisen Zhuang
From: Kejian Yan 

Since the registers of subctrl may be different, it is better to
mv the registers from hns mdio driver routine to device tree node.

Signed-off-by: Kejian Yan 
Signed-off-by: Yisen Zhuang 
---
change log:
 v2: fix the wrong indentations

 v1: first submit
  link: https://lkml.org/lkml/2016/6/27/182
---
 drivers/net/ethernet/hisilicon/hns_mdio.c | 80 +--
 1 file changed, 66 insertions(+), 14 deletions(-)

diff --git a/drivers/net/ethernet/hisilicon/hns_mdio.c 
b/drivers/net/ethernet/hisilicon/hns_mdio.c
index 761a32f..33f4c48 100644
--- a/drivers/net/ethernet/hisilicon/hns_mdio.c
+++ b/drivers/net/ethernet/hisilicon/hns_mdio.c
@@ -37,9 +37,19 @@
 
 #define MDIO_TIMEOUT   100
 
+struct hns_mdio_sc_reg {
+   u16 mdio_clk_en;
+   u16 mdio_clk_dis;
+   u16 mdio_reset_req;
+   u16 mdio_reset_dreq;
+   u16 mdio_clk_st;
+   u16 mdio_reset_st;
+};
+
 struct hns_mdio_device {
void *vbase;/* mdio reg base address */
struct regmap *subctrl_vbase;
+   struct hns_mdio_sc_reg sc_reg;
 };
 
 /* mdio reg */
@@ -93,7 +103,6 @@ enum mdio_c45_op_seq {
 #define MDIO_SC_CLK_DIS0x33C
 #define MDIO_SC_RESET_REQ  0xA38
 #define MDIO_SC_RESET_DREQ 0xA3C
-#define MDIO_SC_CTRL   0x2010
 #define MDIO_SC_CLK_ST 0x531C
 #define MDIO_SC_RESET_ST   0x5A1C
 
@@ -353,6 +362,7 @@ static int hns_mdio_read(struct mii_bus *bus, int phy_id, 
int regnum)
 static int hns_mdio_reset(struct mii_bus *bus)
 {
struct hns_mdio_device *mdio_dev = (struct hns_mdio_device *)bus->priv;
+   const struct hns_mdio_sc_reg *sc_reg;
int ret;
 
if (dev_of_node(bus->parent)) {
@@ -361,9 +371,10 @@ static int hns_mdio_reset(struct mii_bus *bus)
return -ENODEV;
}
 
+   sc_reg = _dev->sc_reg;
/* 1. reset req, and read reset st check */
-   ret = mdio_sc_cfg_reg_write(mdio_dev, MDIO_SC_RESET_REQ, 0x1,
-   MDIO_SC_RESET_ST, 0x1,
+   ret = mdio_sc_cfg_reg_write(mdio_dev, sc_reg->mdio_reset_req,
+   0x1, sc_reg->mdio_reset_st, 0x1,
MDIO_CHECK_SET_ST);
if (ret) {
dev_err(>dev, "MDIO reset fail\n");
@@ -371,8 +382,8 @@ static int hns_mdio_reset(struct mii_bus *bus)
}
 
/* 2. dis clk, and read clk st check */
-   ret = mdio_sc_cfg_reg_write(mdio_dev, MDIO_SC_CLK_DIS,
-   0x1, MDIO_SC_CLK_ST, 0x1,
+   ret = mdio_sc_cfg_reg_write(mdio_dev, sc_reg->mdio_clk_dis,
+   0x1, sc_reg->mdio_clk_st, 0x1,
MDIO_CHECK_CLR_ST);
if (ret) {
dev_err(>dev, "MDIO dis clk fail\n");
@@ -380,8 +391,8 @@ static int hns_mdio_reset(struct mii_bus *bus)
}
 
/* 3. reset dreq, and read reset st check */
-   ret = mdio_sc_cfg_reg_write(mdio_dev, MDIO_SC_RESET_DREQ, 0x1,
-   MDIO_SC_RESET_ST, 0x1,
+   ret = mdio_sc_cfg_reg_write(mdio_dev, sc_reg->mdio_reset_dreq,
+   0x1, sc_reg->mdio_reset_st, 0x1,
MDIO_CHECK_CLR_ST);
if (ret) {
dev_err(>dev, "MDIO dis clk fail\n");
@@ -389,8 +400,8 @@ static int hns_mdio_reset(struct mii_bus *bus)
}
 
/* 4. en clk, and read clk st check */
-   ret = mdio_sc_cfg_reg_write(mdio_dev, MDIO_SC_CLK_EN,
-   0x1, MDIO_SC_CLK_ST, 0x1,
+   ret = mdio_sc_cfg_reg_write(mdio_dev, sc_reg->mdio_clk_en,
+   0x1, sc_reg->mdio_clk_st, 0x1,
MDIO_CHECK_SET_ST);
if (ret)
dev_err(>dev, "MDIO en clk fail\n");
@@ -458,13 +469,54 @@ static int hns_mdio_probe(struct platform_device *pdev)
snprintf(new_bus->id, MII_BUS_ID_SIZE, "%s-%s", "Mii",
 dev_name(>dev));
if (dev_of_node(>dev)) {
-   mdio_dev->subctrl_vbase = syscon_node_to_regmap(
-   of_parse_phandle(pdev->dev.of_node,
-"subctrl-vbase", 0));
-   if (IS_ERR(mdio_dev->subctrl_vbase)) {
-   dev_warn(>dev, "no syscon 
hisilicon,peri-c-subctrl\n");
+   struct of_phandle_args reg_args;
+
+   ret = of_parse_phandle_with_fixed_args(p

[PATCH v3 net-next 3/9] net: hns: change code style from a = a + x to a += x

2016-07-01 Thread Yisen Zhuang
From: Daode Huang <huangda...@hisilicon.com>

This patch fixes the code style in hns driver. Change it from
"buff = buff + xxx" to "buff += xxx". The reveiw comments is
from andy.

Reviewed-by: Andriy Shevchenko <andriy.shevche...@linux.intel.com>
Signed-off-by: Daode Huang <huangda...@hisilicon.com>
Signed-off-by: Yisen Zhuang <yisen.zhu...@huawei.com>
---
 drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c | 32 +++---
 1 file changed, 16 insertions(+), 16 deletions(-)

diff --git a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c 
b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c
index 67e8e13..b9d01ea 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c
+++ b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c
@@ -2540,45 +2540,45 @@ static char *hns_dsaf_get_node_stats_strings(char 
*data, int node,
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;
+   buff += ETH_GSTRING_LEN;
snprintf(buff, ETH_GSTRING_LEN, "innod%d_manage_pkts", node);
-   buff = buff + ETH_GSTRING_LEN;
+   buff += ETH_GSTRING_LEN;
snprintf(buff, ETH_GSTRING_LEN, "innod%d_rx_pkts", node);
-   buff = buff + ETH_GSTRING_LEN;
+   buff += ETH_GSTRING_LEN;
snprintf(buff, ETH_GSTRING_LEN, "innod%d_rx_pkt_id", node);
-   buff = buff + ETH_GSTRING_LEN;
+   buff += ETH_GSTRING_LEN;
snprintf(buff, ETH_GSTRING_LEN, "innod%d_rx_pause_frame", node);
-   buff = buff + ETH_GSTRING_LEN;
+   buff += ETH_GSTRING_LEN;
snprintf(buff, ETH_GSTRING_LEN, "innod%d_release_buf_num", node);
-   buff = buff + ETH_GSTRING_LEN;
+   buff += ETH_GSTRING_LEN;
snprintf(buff, ETH_GSTRING_LEN, "innod%d_sbm_drop_pkts", node);
-   buff = buff + ETH_GSTRING_LEN;
+   buff += ETH_GSTRING_LEN;
snprintf(buff, ETH_GSTRING_LEN, "innod%d_crc_false_pkts", node);
-   buff = buff + ETH_GSTRING_LEN;
+   buff += ETH_GSTRING_LEN;
snprintf(buff, ETH_GSTRING_LEN, "innod%d_bp_drop_pkts", node);
-   buff = buff + ETH_GSTRING_LEN;
+   buff += ETH_GSTRING_LEN;
snprintf(buff, ETH_GSTRING_LEN, "innod%d_lookup_rslt_drop_pkts", node);
-   buff = buff + ETH_GSTRING_LEN;
+   buff += ETH_GSTRING_LEN;
snprintf(buff, ETH_GSTRING_LEN, "innod%d_local_rslt_fail_pkts", node);
-   buff = buff + ETH_GSTRING_LEN;
+   buff += ETH_GSTRING_LEN;
snprintf(buff, ETH_GSTRING_LEN, "innod%d_vlan_drop_pkts", node);
-   buff = buff + ETH_GSTRING_LEN;
+   buff += ETH_GSTRING_LEN;
snprintf(buff, ETH_GSTRING_LEN, "innod%d_stp_drop_pkts", node);
-   buff = buff + ETH_GSTRING_LEN;
+   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;
+   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;
+   buff += ETH_GSTRING_LEN;
}
}
snprintf(buff, ETH_GSTRING_LEN, "onnod%d_tx_pkts", node);
-   buff = buff + ETH_GSTRING_LEN;
+   buff += ETH_GSTRING_LEN;
 
return buff;
 }
-- 
1.9.1



[PATCH v3 net-next 3/9] net: hns: change code style from a = a + x to a += x

2016-07-01 Thread Yisen Zhuang
From: Daode Huang 

This patch fixes the code style in hns driver. Change it from
"buff = buff + xxx" to "buff += xxx". The reveiw comments is
from andy.

Reviewed-by: Andriy Shevchenko 
Signed-off-by: Daode Huang 
Signed-off-by: Yisen Zhuang 
---
 drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c | 32 +++---
 1 file changed, 16 insertions(+), 16 deletions(-)

diff --git a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c 
b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c
index 67e8e13..b9d01ea 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c
+++ b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c
@@ -2540,45 +2540,45 @@ static char *hns_dsaf_get_node_stats_strings(char 
*data, int node,
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;
+   buff += ETH_GSTRING_LEN;
snprintf(buff, ETH_GSTRING_LEN, "innod%d_manage_pkts", node);
-   buff = buff + ETH_GSTRING_LEN;
+   buff += ETH_GSTRING_LEN;
snprintf(buff, ETH_GSTRING_LEN, "innod%d_rx_pkts", node);
-   buff = buff + ETH_GSTRING_LEN;
+   buff += ETH_GSTRING_LEN;
snprintf(buff, ETH_GSTRING_LEN, "innod%d_rx_pkt_id", node);
-   buff = buff + ETH_GSTRING_LEN;
+   buff += ETH_GSTRING_LEN;
snprintf(buff, ETH_GSTRING_LEN, "innod%d_rx_pause_frame", node);
-   buff = buff + ETH_GSTRING_LEN;
+   buff += ETH_GSTRING_LEN;
snprintf(buff, ETH_GSTRING_LEN, "innod%d_release_buf_num", node);
-   buff = buff + ETH_GSTRING_LEN;
+   buff += ETH_GSTRING_LEN;
snprintf(buff, ETH_GSTRING_LEN, "innod%d_sbm_drop_pkts", node);
-   buff = buff + ETH_GSTRING_LEN;
+   buff += ETH_GSTRING_LEN;
snprintf(buff, ETH_GSTRING_LEN, "innod%d_crc_false_pkts", node);
-   buff = buff + ETH_GSTRING_LEN;
+   buff += ETH_GSTRING_LEN;
snprintf(buff, ETH_GSTRING_LEN, "innod%d_bp_drop_pkts", node);
-   buff = buff + ETH_GSTRING_LEN;
+   buff += ETH_GSTRING_LEN;
snprintf(buff, ETH_GSTRING_LEN, "innod%d_lookup_rslt_drop_pkts", node);
-   buff = buff + ETH_GSTRING_LEN;
+   buff += ETH_GSTRING_LEN;
snprintf(buff, ETH_GSTRING_LEN, "innod%d_local_rslt_fail_pkts", node);
-   buff = buff + ETH_GSTRING_LEN;
+   buff += ETH_GSTRING_LEN;
snprintf(buff, ETH_GSTRING_LEN, "innod%d_vlan_drop_pkts", node);
-   buff = buff + ETH_GSTRING_LEN;
+   buff += ETH_GSTRING_LEN;
snprintf(buff, ETH_GSTRING_LEN, "innod%d_stp_drop_pkts", node);
-   buff = buff + ETH_GSTRING_LEN;
+   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;
+   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;
+   buff += ETH_GSTRING_LEN;
}
}
snprintf(buff, ETH_GSTRING_LEN, "onnod%d_tx_pkts", node);
-   buff = buff + ETH_GSTRING_LEN;
+   buff += ETH_GSTRING_LEN;
 
return buff;
 }
-- 
1.9.1



[PATCH v2 net-next 5/9] net: hns: add a space before "*/"

2016-06-30 Thread Yisen Zhuang
From: Daode Huang 

In comment line, some time miss a space before */, so this
patch adds a space before */.

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

diff --git a/drivers/net/ethernet/hisilicon/hns/hns_enet.c 
b/drivers/net/ethernet/hisilicon/hns/hns_enet.c
index d5297ec..d7e1f8c 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_enet.c
+++ b/drivers/net/ethernet/hisilicon/hns/hns_enet.c
@@ -762,13 +762,13 @@ static int hns_nic_rx_poll_one(struct hns_nic_ring_data 
*ring_data,
recv_pkts = 0, recv_bds = 0, clean_count = 0;
 recv:
while (recv_pkts < budget && recv_bds < num) {
-   /* reuse or realloc buffers*/
+   /* reuse or realloc buffers */
if (clean_count >= RCB_NOF_ALLOC_RX_BUFF_ONCE) {
hns_nic_alloc_rx_buffers(ring_data, clean_count);
clean_count = 0;
}
 
-   /* poll one pkt*/
+   /* poll one pkt */
err = hns_nic_poll_rx_skb(ring_data, , );
if (unlikely(!skb)) /* this fault cannot be repaired */
goto out;
-- 
1.9.1



[PATCH v2 net-next 5/9] net: hns: add a space before "*/"

2016-06-30 Thread Yisen Zhuang
From: Daode Huang 

In comment line, some time miss a space before */, so this
patch adds a space before */.

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

diff --git a/drivers/net/ethernet/hisilicon/hns/hns_enet.c 
b/drivers/net/ethernet/hisilicon/hns/hns_enet.c
index d5297ec..d7e1f8c 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_enet.c
+++ b/drivers/net/ethernet/hisilicon/hns/hns_enet.c
@@ -762,13 +762,13 @@ static int hns_nic_rx_poll_one(struct hns_nic_ring_data 
*ring_data,
recv_pkts = 0, recv_bds = 0, clean_count = 0;
 recv:
while (recv_pkts < budget && recv_bds < num) {
-   /* reuse or realloc buffers*/
+   /* reuse or realloc buffers */
if (clean_count >= RCB_NOF_ALLOC_RX_BUFF_ONCE) {
hns_nic_alloc_rx_buffers(ring_data, clean_count);
clean_count = 0;
}
 
-   /* poll one pkt*/
+   /* poll one pkt */
err = hns_nic_poll_rx_skb(ring_data, , );
if (unlikely(!skb)) /* this fault cannot be repaired */
goto out;
-- 
1.9.1



[PATCH v2 net-next 9/9] net: hns: get reset registers from DT

2016-06-30 Thread Yisen Zhuang
From: Kejian Yan 

Since the registers of subctrl may be different, it is better to
mv the registers from hns mdio driver routine to device tree node.

Signed-off-by: Kejian Yan 
---
change log:
 v2: fix the wrong indentations

 v1: first submit
  link: https://lkml.org/lkml/2016/6/27/182
---
 drivers/net/ethernet/hisilicon/hns_mdio.c | 80 +--
 1 file changed, 66 insertions(+), 14 deletions(-)

diff --git a/drivers/net/ethernet/hisilicon/hns_mdio.c 
b/drivers/net/ethernet/hisilicon/hns_mdio.c
index 761a32f..33f4c48 100644
--- a/drivers/net/ethernet/hisilicon/hns_mdio.c
+++ b/drivers/net/ethernet/hisilicon/hns_mdio.c
@@ -37,9 +37,19 @@
 
 #define MDIO_TIMEOUT   100
 
+struct hns_mdio_sc_reg {
+   u16 mdio_clk_en;
+   u16 mdio_clk_dis;
+   u16 mdio_reset_req;
+   u16 mdio_reset_dreq;
+   u16 mdio_clk_st;
+   u16 mdio_reset_st;
+};
+
 struct hns_mdio_device {
void *vbase;/* mdio reg base address */
struct regmap *subctrl_vbase;
+   struct hns_mdio_sc_reg sc_reg;
 };
 
 /* mdio reg */
@@ -93,7 +103,6 @@ enum mdio_c45_op_seq {
 #define MDIO_SC_CLK_DIS0x33C
 #define MDIO_SC_RESET_REQ  0xA38
 #define MDIO_SC_RESET_DREQ 0xA3C
-#define MDIO_SC_CTRL   0x2010
 #define MDIO_SC_CLK_ST 0x531C
 #define MDIO_SC_RESET_ST   0x5A1C
 
@@ -353,6 +362,7 @@ static int hns_mdio_read(struct mii_bus *bus, int phy_id, 
int regnum)
 static int hns_mdio_reset(struct mii_bus *bus)
 {
struct hns_mdio_device *mdio_dev = (struct hns_mdio_device *)bus->priv;
+   const struct hns_mdio_sc_reg *sc_reg;
int ret;
 
if (dev_of_node(bus->parent)) {
@@ -361,9 +371,10 @@ static int hns_mdio_reset(struct mii_bus *bus)
return -ENODEV;
}
 
+   sc_reg = _dev->sc_reg;
/* 1. reset req, and read reset st check */
-   ret = mdio_sc_cfg_reg_write(mdio_dev, MDIO_SC_RESET_REQ, 0x1,
-   MDIO_SC_RESET_ST, 0x1,
+   ret = mdio_sc_cfg_reg_write(mdio_dev, sc_reg->mdio_reset_req,
+   0x1, sc_reg->mdio_reset_st, 0x1,
MDIO_CHECK_SET_ST);
if (ret) {
dev_err(>dev, "MDIO reset fail\n");
@@ -371,8 +382,8 @@ static int hns_mdio_reset(struct mii_bus *bus)
}
 
/* 2. dis clk, and read clk st check */
-   ret = mdio_sc_cfg_reg_write(mdio_dev, MDIO_SC_CLK_DIS,
-   0x1, MDIO_SC_CLK_ST, 0x1,
+   ret = mdio_sc_cfg_reg_write(mdio_dev, sc_reg->mdio_clk_dis,
+   0x1, sc_reg->mdio_clk_st, 0x1,
MDIO_CHECK_CLR_ST);
if (ret) {
dev_err(>dev, "MDIO dis clk fail\n");
@@ -380,8 +391,8 @@ static int hns_mdio_reset(struct mii_bus *bus)
}
 
/* 3. reset dreq, and read reset st check */
-   ret = mdio_sc_cfg_reg_write(mdio_dev, MDIO_SC_RESET_DREQ, 0x1,
-   MDIO_SC_RESET_ST, 0x1,
+   ret = mdio_sc_cfg_reg_write(mdio_dev, sc_reg->mdio_reset_dreq,
+   0x1, sc_reg->mdio_reset_st, 0x1,
MDIO_CHECK_CLR_ST);
if (ret) {
dev_err(>dev, "MDIO dis clk fail\n");
@@ -389,8 +400,8 @@ static int hns_mdio_reset(struct mii_bus *bus)
}
 
/* 4. en clk, and read clk st check */
-   ret = mdio_sc_cfg_reg_write(mdio_dev, MDIO_SC_CLK_EN,
-   0x1, MDIO_SC_CLK_ST, 0x1,
+   ret = mdio_sc_cfg_reg_write(mdio_dev, sc_reg->mdio_clk_en,
+   0x1, sc_reg->mdio_clk_st, 0x1,
MDIO_CHECK_SET_ST);
if (ret)
dev_err(>dev, "MDIO en clk fail\n");
@@ -458,13 +469,54 @@ static int hns_mdio_probe(struct platform_device *pdev)
snprintf(new_bus->id, MII_BUS_ID_SIZE, "%s-%s", "Mii",
 dev_name(>dev));
if (dev_of_node(>dev)) {
-   mdio_dev->subctrl_vbase = syscon_node_to_regmap(
-   of_parse_phandle(pdev->dev.of_node,
-"subctrl-vbase", 0));
-   if (IS_ERR(mdio_dev->subctrl_vbase)) {
-   dev_warn(>dev, "no syscon 
hisilicon,peri-c-subctrl\n");
+   struct of_phandle_args reg_args;
+
+   ret = of_parse_phandle_with_fixed_args(pdev->dev.of_node,
+  "subctrl-vbase",
+  4,
+  

[PATCH v2 net-next 8/9] net: hns: add media-type property for hns

2016-06-30 Thread Yisen Zhuang
From: Kejian Yan 

It is PORT_TP type if the service port is GE mode. It is wrong to
judge the port type by using if it is service port. Adding the media
type to know port type.

Reported-by: Jinchuan Tian 
Signed-off-by: Kejian Yan 
---
 drivers/net/ethernet/hisilicon/hns/hnae.h |  9 
 drivers/net/ethernet/hisilicon/hns/hns_ae_adapt.c |  1 +
 drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.c | 26 +++
 drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.h |  1 +
 drivers/net/ethernet/hisilicon/hns/hns_ethtool.c  | 14 +---
 5 files changed, 48 insertions(+), 3 deletions(-)

diff --git a/drivers/net/ethernet/hisilicon/hns/hnae.h 
b/drivers/net/ethernet/hisilicon/hns/hnae.h
index 3869322..e093cbf 100644
--- a/drivers/net/ethernet/hisilicon/hns/hnae.h
+++ b/drivers/net/ethernet/hisilicon/hns/hnae.h
@@ -363,6 +363,14 @@ enum hnae_port_type {
HNAE_PORT_DEBUG
 };
 
+/* mac media type */
+enum hnae_media_type {
+   HNAE_MEDIA_TYPE_UNKNOWN = 0,
+   HNAE_MEDIA_TYPE_FIBER,
+   HNAE_MEDIA_TYPE_COPPER,
+   HNAE_MEDIA_TYPE_BACKPLANE,
+};
+
 /* This struct defines the operation on the handle.
  *
  * get_handle(): (mandatory)
@@ -525,6 +533,7 @@ struct hnae_handle {
u32 eport_id;
u32 dport_id;   /* v2 tx bd should fill the dport_id */
enum hnae_port_type port_type;
+   enum hnae_media_type media_type;
struct list_head node;/* list to hnae_ae_dev->handle_list */
struct hnae_buf_ops *bops; /* operation for the buffer */
struct hnae_queue **qs;  /* array base of all queues */
diff --git a/drivers/net/ethernet/hisilicon/hns/hns_ae_adapt.c 
b/drivers/net/ethernet/hisilicon/hns/hns_ae_adapt.c
index 835521b..e28d960 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_ae_adapt.c
+++ b/drivers/net/ethernet/hisilicon/hns/hns_ae_adapt.c
@@ -134,6 +134,7 @@ struct hnae_handle *hns_ae_get_handle(struct hnae_ae_dev 
*dev,
ae_handle->phy_dev = vf_cb->mac_cb->phy_dev;
ae_handle->if_support = vf_cb->mac_cb->if_support;
ae_handle->port_type = vf_cb->mac_cb->mac_type;
+   ae_handle->media_type = vf_cb->mac_cb->media_type;
ae_handle->dport_id = port_id;
 
return ae_handle;
diff --git a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.c 
b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.c
index d2effcc..3fb87e2 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.c
+++ b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.c
@@ -733,6 +733,18 @@ static void hns_mac_register_phy(struct hns_mac_cb *mac_cb)
mac_cb->mac_id, addr);
 }
 
+#define MAC_MEDIA_TYPE_MAX_LEN 16
+
+static const struct {
+   enum hnae_media_type value;
+   const char *name;
+} media_type_defs[] = {
+   {HNAE_MEDIA_TYPE_UNKNOWN,   "unknown" },
+   {HNAE_MEDIA_TYPE_FIBER, "fiber" },
+   {HNAE_MEDIA_TYPE_COPPER,"copper" },
+   {HNAE_MEDIA_TYPE_BACKPLANE, "backplane" },
+};
+
 /**
  *hns_mac_get_info  - get mac information from device node
  *@mac_cb: mac device
@@ -744,10 +756,13 @@ static int  hns_mac_get_info(struct hns_mac_cb *mac_cb)
struct device_node *np;
struct regmap *syscon;
struct of_phandle_args cpld_args;
+   const char *media_type;
+   u32 i;
u32 ret;
 
mac_cb->link = false;
mac_cb->half_duplex = false;
+   mac_cb->media_type = HNAE_MEDIA_TYPE_UNKNOWN;
mac_cb->speed = mac_phy_to_speed[mac_cb->phy_if];
mac_cb->max_speed = mac_cb->speed;
 
@@ -849,6 +864,17 @@ static int  hns_mac_get_info(struct hns_mac_cb *mac_cb)
mac_cb->mac_id);
}
 
+   if (!fwnode_property_read_string(mac_cb->fw_port, "media-type",
+_type)) {
+   for (i = 0; i < ARRAY_SIZE(media_type_defs); i++) {
+   if (!strncmp(media_type_defs[i].name, media_type,
+MAC_MEDIA_TYPE_MAX_LEN)) {
+   mac_cb->media_type = media_type_defs[i].value;
+   break;
+   }
+   }
+   }
+
return 0;
 }
 
diff --git a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.h 
b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.h
index 05a6e8f..4cbdf14 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.h
+++ b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.h
@@ -335,6 +335,7 @@ struct hns_mac_cb {
u64 txpkt_for_led;
u64 rxpkt_for_led;
enum hnae_port_type mac_type;
+   enum hnae_media_type media_type;
phy_interface_t phy_if;
enum hnae_loop loop_mode;
 
diff --git a/drivers/net/ethernet/hisilicon/hns/hns_ethtool.c 
b/drivers/net/ethernet/hisilicon/hns/hns_ethtool.c
index a395ca1..ab33487 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_ethtool.c
+++ 

[PATCH v2 net-next 9/9] net: hns: get reset registers from DT

2016-06-30 Thread Yisen Zhuang
From: Kejian Yan 

Since the registers of subctrl may be different, it is better to
mv the registers from hns mdio driver routine to device tree node.

Signed-off-by: Kejian Yan 
---
change log:
 v2: fix the wrong indentations

 v1: first submit
  link: https://lkml.org/lkml/2016/6/27/182
---
 drivers/net/ethernet/hisilicon/hns_mdio.c | 80 +--
 1 file changed, 66 insertions(+), 14 deletions(-)

diff --git a/drivers/net/ethernet/hisilicon/hns_mdio.c 
b/drivers/net/ethernet/hisilicon/hns_mdio.c
index 761a32f..33f4c48 100644
--- a/drivers/net/ethernet/hisilicon/hns_mdio.c
+++ b/drivers/net/ethernet/hisilicon/hns_mdio.c
@@ -37,9 +37,19 @@
 
 #define MDIO_TIMEOUT   100
 
+struct hns_mdio_sc_reg {
+   u16 mdio_clk_en;
+   u16 mdio_clk_dis;
+   u16 mdio_reset_req;
+   u16 mdio_reset_dreq;
+   u16 mdio_clk_st;
+   u16 mdio_reset_st;
+};
+
 struct hns_mdio_device {
void *vbase;/* mdio reg base address */
struct regmap *subctrl_vbase;
+   struct hns_mdio_sc_reg sc_reg;
 };
 
 /* mdio reg */
@@ -93,7 +103,6 @@ enum mdio_c45_op_seq {
 #define MDIO_SC_CLK_DIS0x33C
 #define MDIO_SC_RESET_REQ  0xA38
 #define MDIO_SC_RESET_DREQ 0xA3C
-#define MDIO_SC_CTRL   0x2010
 #define MDIO_SC_CLK_ST 0x531C
 #define MDIO_SC_RESET_ST   0x5A1C
 
@@ -353,6 +362,7 @@ static int hns_mdio_read(struct mii_bus *bus, int phy_id, 
int regnum)
 static int hns_mdio_reset(struct mii_bus *bus)
 {
struct hns_mdio_device *mdio_dev = (struct hns_mdio_device *)bus->priv;
+   const struct hns_mdio_sc_reg *sc_reg;
int ret;
 
if (dev_of_node(bus->parent)) {
@@ -361,9 +371,10 @@ static int hns_mdio_reset(struct mii_bus *bus)
return -ENODEV;
}
 
+   sc_reg = _dev->sc_reg;
/* 1. reset req, and read reset st check */
-   ret = mdio_sc_cfg_reg_write(mdio_dev, MDIO_SC_RESET_REQ, 0x1,
-   MDIO_SC_RESET_ST, 0x1,
+   ret = mdio_sc_cfg_reg_write(mdio_dev, sc_reg->mdio_reset_req,
+   0x1, sc_reg->mdio_reset_st, 0x1,
MDIO_CHECK_SET_ST);
if (ret) {
dev_err(>dev, "MDIO reset fail\n");
@@ -371,8 +382,8 @@ static int hns_mdio_reset(struct mii_bus *bus)
}
 
/* 2. dis clk, and read clk st check */
-   ret = mdio_sc_cfg_reg_write(mdio_dev, MDIO_SC_CLK_DIS,
-   0x1, MDIO_SC_CLK_ST, 0x1,
+   ret = mdio_sc_cfg_reg_write(mdio_dev, sc_reg->mdio_clk_dis,
+   0x1, sc_reg->mdio_clk_st, 0x1,
MDIO_CHECK_CLR_ST);
if (ret) {
dev_err(>dev, "MDIO dis clk fail\n");
@@ -380,8 +391,8 @@ static int hns_mdio_reset(struct mii_bus *bus)
}
 
/* 3. reset dreq, and read reset st check */
-   ret = mdio_sc_cfg_reg_write(mdio_dev, MDIO_SC_RESET_DREQ, 0x1,
-   MDIO_SC_RESET_ST, 0x1,
+   ret = mdio_sc_cfg_reg_write(mdio_dev, sc_reg->mdio_reset_dreq,
+   0x1, sc_reg->mdio_reset_st, 0x1,
MDIO_CHECK_CLR_ST);
if (ret) {
dev_err(>dev, "MDIO dis clk fail\n");
@@ -389,8 +400,8 @@ static int hns_mdio_reset(struct mii_bus *bus)
}
 
/* 4. en clk, and read clk st check */
-   ret = mdio_sc_cfg_reg_write(mdio_dev, MDIO_SC_CLK_EN,
-   0x1, MDIO_SC_CLK_ST, 0x1,
+   ret = mdio_sc_cfg_reg_write(mdio_dev, sc_reg->mdio_clk_en,
+   0x1, sc_reg->mdio_clk_st, 0x1,
MDIO_CHECK_SET_ST);
if (ret)
dev_err(>dev, "MDIO en clk fail\n");
@@ -458,13 +469,54 @@ static int hns_mdio_probe(struct platform_device *pdev)
snprintf(new_bus->id, MII_BUS_ID_SIZE, "%s-%s", "Mii",
 dev_name(>dev));
if (dev_of_node(>dev)) {
-   mdio_dev->subctrl_vbase = syscon_node_to_regmap(
-   of_parse_phandle(pdev->dev.of_node,
-"subctrl-vbase", 0));
-   if (IS_ERR(mdio_dev->subctrl_vbase)) {
-   dev_warn(>dev, "no syscon 
hisilicon,peri-c-subctrl\n");
+   struct of_phandle_args reg_args;
+
+   ret = of_parse_phandle_with_fixed_args(pdev->dev.of_node,
+  "subctrl-vbase",
+  4,
+  

[PATCH v2 net-next 8/9] net: hns: add media-type property for hns

2016-06-30 Thread Yisen Zhuang
From: Kejian Yan 

It is PORT_TP type if the service port is GE mode. It is wrong to
judge the port type by using if it is service port. Adding the media
type to know port type.

Reported-by: Jinchuan Tian 
Signed-off-by: Kejian Yan 
---
 drivers/net/ethernet/hisilicon/hns/hnae.h |  9 
 drivers/net/ethernet/hisilicon/hns/hns_ae_adapt.c |  1 +
 drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.c | 26 +++
 drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.h |  1 +
 drivers/net/ethernet/hisilicon/hns/hns_ethtool.c  | 14 +---
 5 files changed, 48 insertions(+), 3 deletions(-)

diff --git a/drivers/net/ethernet/hisilicon/hns/hnae.h 
b/drivers/net/ethernet/hisilicon/hns/hnae.h
index 3869322..e093cbf 100644
--- a/drivers/net/ethernet/hisilicon/hns/hnae.h
+++ b/drivers/net/ethernet/hisilicon/hns/hnae.h
@@ -363,6 +363,14 @@ enum hnae_port_type {
HNAE_PORT_DEBUG
 };
 
+/* mac media type */
+enum hnae_media_type {
+   HNAE_MEDIA_TYPE_UNKNOWN = 0,
+   HNAE_MEDIA_TYPE_FIBER,
+   HNAE_MEDIA_TYPE_COPPER,
+   HNAE_MEDIA_TYPE_BACKPLANE,
+};
+
 /* This struct defines the operation on the handle.
  *
  * get_handle(): (mandatory)
@@ -525,6 +533,7 @@ struct hnae_handle {
u32 eport_id;
u32 dport_id;   /* v2 tx bd should fill the dport_id */
enum hnae_port_type port_type;
+   enum hnae_media_type media_type;
struct list_head node;/* list to hnae_ae_dev->handle_list */
struct hnae_buf_ops *bops; /* operation for the buffer */
struct hnae_queue **qs;  /* array base of all queues */
diff --git a/drivers/net/ethernet/hisilicon/hns/hns_ae_adapt.c 
b/drivers/net/ethernet/hisilicon/hns/hns_ae_adapt.c
index 835521b..e28d960 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_ae_adapt.c
+++ b/drivers/net/ethernet/hisilicon/hns/hns_ae_adapt.c
@@ -134,6 +134,7 @@ struct hnae_handle *hns_ae_get_handle(struct hnae_ae_dev 
*dev,
ae_handle->phy_dev = vf_cb->mac_cb->phy_dev;
ae_handle->if_support = vf_cb->mac_cb->if_support;
ae_handle->port_type = vf_cb->mac_cb->mac_type;
+   ae_handle->media_type = vf_cb->mac_cb->media_type;
ae_handle->dport_id = port_id;
 
return ae_handle;
diff --git a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.c 
b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.c
index d2effcc..3fb87e2 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.c
+++ b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.c
@@ -733,6 +733,18 @@ static void hns_mac_register_phy(struct hns_mac_cb *mac_cb)
mac_cb->mac_id, addr);
 }
 
+#define MAC_MEDIA_TYPE_MAX_LEN 16
+
+static const struct {
+   enum hnae_media_type value;
+   const char *name;
+} media_type_defs[] = {
+   {HNAE_MEDIA_TYPE_UNKNOWN,   "unknown" },
+   {HNAE_MEDIA_TYPE_FIBER, "fiber" },
+   {HNAE_MEDIA_TYPE_COPPER,"copper" },
+   {HNAE_MEDIA_TYPE_BACKPLANE, "backplane" },
+};
+
 /**
  *hns_mac_get_info  - get mac information from device node
  *@mac_cb: mac device
@@ -744,10 +756,13 @@ static int  hns_mac_get_info(struct hns_mac_cb *mac_cb)
struct device_node *np;
struct regmap *syscon;
struct of_phandle_args cpld_args;
+   const char *media_type;
+   u32 i;
u32 ret;
 
mac_cb->link = false;
mac_cb->half_duplex = false;
+   mac_cb->media_type = HNAE_MEDIA_TYPE_UNKNOWN;
mac_cb->speed = mac_phy_to_speed[mac_cb->phy_if];
mac_cb->max_speed = mac_cb->speed;
 
@@ -849,6 +864,17 @@ static int  hns_mac_get_info(struct hns_mac_cb *mac_cb)
mac_cb->mac_id);
}
 
+   if (!fwnode_property_read_string(mac_cb->fw_port, "media-type",
+_type)) {
+   for (i = 0; i < ARRAY_SIZE(media_type_defs); i++) {
+   if (!strncmp(media_type_defs[i].name, media_type,
+MAC_MEDIA_TYPE_MAX_LEN)) {
+   mac_cb->media_type = media_type_defs[i].value;
+   break;
+   }
+   }
+   }
+
return 0;
 }
 
diff --git a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.h 
b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.h
index 05a6e8f..4cbdf14 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.h
+++ b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.h
@@ -335,6 +335,7 @@ struct hns_mac_cb {
u64 txpkt_for_led;
u64 rxpkt_for_led;
enum hnae_port_type mac_type;
+   enum hnae_media_type media_type;
phy_interface_t phy_if;
enum hnae_loop loop_mode;
 
diff --git a/drivers/net/ethernet/hisilicon/hns/hns_ethtool.c 
b/drivers/net/ethernet/hisilicon/hns/hns_ethtool.c
index a395ca1..ab33487 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_ethtool.c
+++ b/drivers/net/ethernet/hisilicon/hns/hns_ethtool.c
@@ -165,13 +165,21 @@ 

[PATCH v2 net-next 3/9] net: hns: change code style from a = a + x to a += x

2016-06-30 Thread Yisen Zhuang
From: Daode Huang 

This patch fixes the code style in hns driver. Change it from
"buff = buff + xxx" to "buff += xxx". The reveiw comments is
from andy.

Reviewed-by: Andriy Shevchenko 
Signed-off-by: Daode Huang 
---
 drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c | 32 +++---
 1 file changed, 16 insertions(+), 16 deletions(-)

diff --git a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c 
b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c
index 67e8e13..b9d01ea 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c
+++ b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c
@@ -2540,45 +2540,45 @@ static char *hns_dsaf_get_node_stats_strings(char 
*data, int node,
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;
+   buff += ETH_GSTRING_LEN;
snprintf(buff, ETH_GSTRING_LEN, "innod%d_manage_pkts", node);
-   buff = buff + ETH_GSTRING_LEN;
+   buff += ETH_GSTRING_LEN;
snprintf(buff, ETH_GSTRING_LEN, "innod%d_rx_pkts", node);
-   buff = buff + ETH_GSTRING_LEN;
+   buff += ETH_GSTRING_LEN;
snprintf(buff, ETH_GSTRING_LEN, "innod%d_rx_pkt_id", node);
-   buff = buff + ETH_GSTRING_LEN;
+   buff += ETH_GSTRING_LEN;
snprintf(buff, ETH_GSTRING_LEN, "innod%d_rx_pause_frame", node);
-   buff = buff + ETH_GSTRING_LEN;
+   buff += ETH_GSTRING_LEN;
snprintf(buff, ETH_GSTRING_LEN, "innod%d_release_buf_num", node);
-   buff = buff + ETH_GSTRING_LEN;
+   buff += ETH_GSTRING_LEN;
snprintf(buff, ETH_GSTRING_LEN, "innod%d_sbm_drop_pkts", node);
-   buff = buff + ETH_GSTRING_LEN;
+   buff += ETH_GSTRING_LEN;
snprintf(buff, ETH_GSTRING_LEN, "innod%d_crc_false_pkts", node);
-   buff = buff + ETH_GSTRING_LEN;
+   buff += ETH_GSTRING_LEN;
snprintf(buff, ETH_GSTRING_LEN, "innod%d_bp_drop_pkts", node);
-   buff = buff + ETH_GSTRING_LEN;
+   buff += ETH_GSTRING_LEN;
snprintf(buff, ETH_GSTRING_LEN, "innod%d_lookup_rslt_drop_pkts", node);
-   buff = buff + ETH_GSTRING_LEN;
+   buff += ETH_GSTRING_LEN;
snprintf(buff, ETH_GSTRING_LEN, "innod%d_local_rslt_fail_pkts", node);
-   buff = buff + ETH_GSTRING_LEN;
+   buff += ETH_GSTRING_LEN;
snprintf(buff, ETH_GSTRING_LEN, "innod%d_vlan_drop_pkts", node);
-   buff = buff + ETH_GSTRING_LEN;
+   buff += ETH_GSTRING_LEN;
snprintf(buff, ETH_GSTRING_LEN, "innod%d_stp_drop_pkts", node);
-   buff = buff + ETH_GSTRING_LEN;
+   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;
+   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;
+   buff += ETH_GSTRING_LEN;
}
}
snprintf(buff, ETH_GSTRING_LEN, "onnod%d_tx_pkts", node);
-   buff = buff + ETH_GSTRING_LEN;
+   buff += ETH_GSTRING_LEN;
 
return buff;
 }
-- 
1.9.1



[PATCH v2 net-next 3/9] net: hns: change code style from a = a + x to a += x

2016-06-30 Thread Yisen Zhuang
From: Daode Huang 

This patch fixes the code style in hns driver. Change it from
"buff = buff + xxx" to "buff += xxx". The reveiw comments is
from andy.

Reviewed-by: Andriy Shevchenko 
Signed-off-by: Daode Huang 
---
 drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c | 32 +++---
 1 file changed, 16 insertions(+), 16 deletions(-)

diff --git a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c 
b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c
index 67e8e13..b9d01ea 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c
+++ b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c
@@ -2540,45 +2540,45 @@ static char *hns_dsaf_get_node_stats_strings(char 
*data, int node,
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;
+   buff += ETH_GSTRING_LEN;
snprintf(buff, ETH_GSTRING_LEN, "innod%d_manage_pkts", node);
-   buff = buff + ETH_GSTRING_LEN;
+   buff += ETH_GSTRING_LEN;
snprintf(buff, ETH_GSTRING_LEN, "innod%d_rx_pkts", node);
-   buff = buff + ETH_GSTRING_LEN;
+   buff += ETH_GSTRING_LEN;
snprintf(buff, ETH_GSTRING_LEN, "innod%d_rx_pkt_id", node);
-   buff = buff + ETH_GSTRING_LEN;
+   buff += ETH_GSTRING_LEN;
snprintf(buff, ETH_GSTRING_LEN, "innod%d_rx_pause_frame", node);
-   buff = buff + ETH_GSTRING_LEN;
+   buff += ETH_GSTRING_LEN;
snprintf(buff, ETH_GSTRING_LEN, "innod%d_release_buf_num", node);
-   buff = buff + ETH_GSTRING_LEN;
+   buff += ETH_GSTRING_LEN;
snprintf(buff, ETH_GSTRING_LEN, "innod%d_sbm_drop_pkts", node);
-   buff = buff + ETH_GSTRING_LEN;
+   buff += ETH_GSTRING_LEN;
snprintf(buff, ETH_GSTRING_LEN, "innod%d_crc_false_pkts", node);
-   buff = buff + ETH_GSTRING_LEN;
+   buff += ETH_GSTRING_LEN;
snprintf(buff, ETH_GSTRING_LEN, "innod%d_bp_drop_pkts", node);
-   buff = buff + ETH_GSTRING_LEN;
+   buff += ETH_GSTRING_LEN;
snprintf(buff, ETH_GSTRING_LEN, "innod%d_lookup_rslt_drop_pkts", node);
-   buff = buff + ETH_GSTRING_LEN;
+   buff += ETH_GSTRING_LEN;
snprintf(buff, ETH_GSTRING_LEN, "innod%d_local_rslt_fail_pkts", node);
-   buff = buff + ETH_GSTRING_LEN;
+   buff += ETH_GSTRING_LEN;
snprintf(buff, ETH_GSTRING_LEN, "innod%d_vlan_drop_pkts", node);
-   buff = buff + ETH_GSTRING_LEN;
+   buff += ETH_GSTRING_LEN;
snprintf(buff, ETH_GSTRING_LEN, "innod%d_stp_drop_pkts", node);
-   buff = buff + ETH_GSTRING_LEN;
+   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;
+   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;
+   buff += ETH_GSTRING_LEN;
}
}
snprintf(buff, ETH_GSTRING_LEN, "onnod%d_tx_pkts", node);
-   buff = buff + ETH_GSTRING_LEN;
+   buff += ETH_GSTRING_LEN;
 
return buff;
 }
-- 
1.9.1



[PATCH v2 net-next 7/9] net: hns: remove redundant hns_mac_dev_to_enet_if()

2016-06-30 Thread Yisen Zhuang
From: Kejian Yan 

The sequence of hns_mac_dev_to_enet_if() is the same as
hns_get_enet_interface(), and hns_get_enet_interface() is called
by initialization to get the mac mode. And the mode is not changed
anywhere. Thus add hns_mac_dev_to_enet_if() function to get the mac
mode is obviously redundant.

Reported-by: Jinchuan Tian 
Signed-off-by: Kejian Yan 
---
 drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.c | 15 ---
 1 file changed, 15 deletions(-)

diff --git a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.c 
b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.c
index c526558..d2effcc 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.c
+++ b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.c
@@ -56,20 +56,6 @@ static const enum mac_mode g_mac_mode_1000[] = {
[PHY_INTERFACE_MODE_RTBI]   = MAC_MODE_RTBI_1000
 };
 
-static enum mac_mode hns_mac_dev_to_enet_if(const struct hns_mac_cb *mac_cb)
-{
-   switch (mac_cb->max_speed) {
-   case MAC_SPEED_100:
-   return g_mac_mode_100[mac_cb->phy_if];
-   case MAC_SPEED_1000:
-   return g_mac_mode_1000[mac_cb->phy_if];
-   case MAC_SPEED_1:
-   return MAC_MODE_XGMII_1;
-   default:
-   return MAC_MODE_MII_100;
-   }
-}
-
 static enum mac_mode hns_get_enet_interface(const struct hns_mac_cb *mac_cb)
 {
switch (mac_cb->max_speed) {
@@ -134,7 +120,6 @@ void hns_mac_adjust_link(struct hns_mac_cb *mac_cb, int 
speed, int duplex)
 
mac_cb->speed = speed;
mac_cb->half_duplex = !duplex;
-   mac_ctrl_drv->mac_mode = hns_mac_dev_to_enet_if(mac_cb);
 
if (mac_ctrl_drv->adjust_link) {
ret = mac_ctrl_drv->adjust_link(mac_ctrl_drv,
-- 
1.9.1



[PATCH v2 net-next 7/9] net: hns: remove redundant hns_mac_dev_to_enet_if()

2016-06-30 Thread Yisen Zhuang
From: Kejian Yan 

The sequence of hns_mac_dev_to_enet_if() is the same as
hns_get_enet_interface(), and hns_get_enet_interface() is called
by initialization to get the mac mode. And the mode is not changed
anywhere. Thus add hns_mac_dev_to_enet_if() function to get the mac
mode is obviously redundant.

Reported-by: Jinchuan Tian 
Signed-off-by: Kejian Yan 
---
 drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.c | 15 ---
 1 file changed, 15 deletions(-)

diff --git a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.c 
b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.c
index c526558..d2effcc 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.c
+++ b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.c
@@ -56,20 +56,6 @@ static const enum mac_mode g_mac_mode_1000[] = {
[PHY_INTERFACE_MODE_RTBI]   = MAC_MODE_RTBI_1000
 };
 
-static enum mac_mode hns_mac_dev_to_enet_if(const struct hns_mac_cb *mac_cb)
-{
-   switch (mac_cb->max_speed) {
-   case MAC_SPEED_100:
-   return g_mac_mode_100[mac_cb->phy_if];
-   case MAC_SPEED_1000:
-   return g_mac_mode_1000[mac_cb->phy_if];
-   case MAC_SPEED_1:
-   return MAC_MODE_XGMII_1;
-   default:
-   return MAC_MODE_MII_100;
-   }
-}
-
 static enum mac_mode hns_get_enet_interface(const struct hns_mac_cb *mac_cb)
 {
switch (mac_cb->max_speed) {
@@ -134,7 +120,6 @@ void hns_mac_adjust_link(struct hns_mac_cb *mac_cb, int 
speed, int duplex)
 
mac_cb->speed = speed;
mac_cb->half_duplex = !duplex;
-   mac_ctrl_drv->mac_mode = hns_mac_dev_to_enet_if(mac_cb);
 
if (mac_ctrl_drv->adjust_link) {
ret = mac_ctrl_drv->adjust_link(mac_ctrl_drv,
-- 
1.9.1



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

2016-06-30 Thread Yisen Zhuang
From: Daode Huang <huangda...@hisilicon.com>

This patch adds maintainers for hisilicon network subsystem driver

Signed-off-by: Daode Huang <huangda...@hisilicon.com>
---
 MAINTAINERS | 9 +
 1 file changed, 9 insertions(+)

diff --git a/MAINTAINERS b/MAINTAINERS
index 3a171a9..c819659 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -5421,6 +5421,15 @@ F:   include/uapi/linux/if_hippi.h
 F: net/802/hippi.c
 F: drivers/net/hippi/
 
+HISILICON NETWORK SUBSYSTEM DRIVER
+M: Yisen Zhuang <yisen.zhu...@huawei.com>
+M: Salil Mehta <salil.me...@huawei.com>
+L: net...@vger.kernel.org
+W: http://www.hisilicon.com
+S: Maintained
+F: drivers/net/ethernet/hisilicon/*
+F: Documentation/devicetree/bindings/net/hisilicon*.txt
+
 HISILICON SAS Controller
 M: John Garry <john.ga...@huawei.com>
 W: http://www.hisilicon.com
-- 
1.9.1



[PATCH v2 net-next 0/9] net: hns: fix the typo of hns

2016-06-30 Thread Yisen Zhuang
This series includes typo fixes which review by Andy, adding
the hns maintainer to MAINTAINERS, as below:

 > from Daode: adds the maintainer for hns driver;

 > from Daode: fix the typo of hns reviewed by Andy Shevchenko;

 > from Kejian: one remove redundant function and two fix to get 
configuration from DT.

changlog:
 v1 -> v2:
  fix the indentations reviewed by David.

Daode Huang (6):
  MAINTAINERS: add maintainers for hns driver
  net: hns: fix code style about hns driver
  net: hns: change code style from a = a + x to a += x
  net: hns: delete redundant parens
  net: hns: add a space before "*/"
  net: hns: normalize two different loop

Kejian Yan (3):
  net: hns: remove redundant hns_mac_dev_to_enet_if()
  net: hns: add media-type property for hns
  net: hns: get reset registers from DT

 MAINTAINERS|  9 +++
 drivers/net/ethernet/hisilicon/hns/hnae.h  |  9 +++
 drivers/net/ethernet/hisilicon/hns/hns_ae_adapt.c  |  1 +
 drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.c  | 41 +++
 drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.h  |  1 +
 drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c | 52 +++---
 drivers/net/ethernet/hisilicon/hns/hns_dsaf_misc.c | 16 ++---
 drivers/net/ethernet/hisilicon/hns/hns_enet.c  |  4 +-
 drivers/net/ethernet/hisilicon/hns/hns_ethtool.c   | 14 +++-
 drivers/net/ethernet/hisilicon/hns_mdio.c  | 80 ++
 10 files changed, 158 insertions(+), 69 deletions(-)

-- 
1.9.1



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

2016-06-30 Thread Yisen Zhuang
From: Daode Huang 

This patch adds maintainers for hisilicon network subsystem driver

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

diff --git a/MAINTAINERS b/MAINTAINERS
index 3a171a9..c819659 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -5421,6 +5421,15 @@ F:   include/uapi/linux/if_hippi.h
 F: net/802/hippi.c
 F: drivers/net/hippi/
 
+HISILICON NETWORK SUBSYSTEM DRIVER
+M: Yisen Zhuang 
+M: Salil Mehta 
+L: net...@vger.kernel.org
+W: http://www.hisilicon.com
+S: Maintained
+F: drivers/net/ethernet/hisilicon/*
+F: Documentation/devicetree/bindings/net/hisilicon*.txt
+
 HISILICON SAS Controller
 M: John Garry 
 W: http://www.hisilicon.com
-- 
1.9.1



[PATCH v2 net-next 0/9] net: hns: fix the typo of hns

2016-06-30 Thread Yisen Zhuang
This series includes typo fixes which review by Andy, adding
the hns maintainer to MAINTAINERS, as below:

 > from Daode: adds the maintainer for hns driver;

 > from Daode: fix the typo of hns reviewed by Andy Shevchenko;

 > from Kejian: one remove redundant function and two fix to get 
configuration from DT.

changlog:
 v1 -> v2:
  fix the indentations reviewed by David.

Daode Huang (6):
  MAINTAINERS: add maintainers for hns driver
  net: hns: fix code style about hns driver
  net: hns: change code style from a = a + x to a += x
  net: hns: delete redundant parens
  net: hns: add a space before "*/"
  net: hns: normalize two different loop

Kejian Yan (3):
  net: hns: remove redundant hns_mac_dev_to_enet_if()
  net: hns: add media-type property for hns
  net: hns: get reset registers from DT

 MAINTAINERS|  9 +++
 drivers/net/ethernet/hisilicon/hns/hnae.h  |  9 +++
 drivers/net/ethernet/hisilicon/hns/hns_ae_adapt.c  |  1 +
 drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.c  | 41 +++
 drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.h  |  1 +
 drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c | 52 +++---
 drivers/net/ethernet/hisilicon/hns/hns_dsaf_misc.c | 16 ++---
 drivers/net/ethernet/hisilicon/hns/hns_enet.c  |  4 +-
 drivers/net/ethernet/hisilicon/hns/hns_ethtool.c   | 14 +++-
 drivers/net/ethernet/hisilicon/hns_mdio.c  | 80 ++
 10 files changed, 158 insertions(+), 69 deletions(-)

-- 
1.9.1



[PATCH v2 net-next 2/9] net: hns: fix code style about hns driver

2016-06-30 Thread Yisen Zhuang
From: Daode Huang 

This patch fixes code sytle of hns driver to make it
simple.

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

diff --git a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_misc.c 
b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_misc.c
index 8473287..611b67b 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_misc.c
+++ b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_misc.c
@@ -253,10 +253,9 @@ static void hns_dsaf_ge_srst_by_port(struct dsaf_device 
*dsaf_dev, u32 port,
reg_val_1  = 0x1 << port;
port_rst_off = dsaf_dev->mac_cb[port]->port_rst_off;
/* there is difference between V1 and V2 in register.*/
-   if (AE_IS_VER1(dsaf_dev->dsaf_ver))
-   reg_val_2  = 0x1041041 << port_rst_off;
-   else
-   reg_val_2  = 0x2082082 << port_rst_off;
+   reg_val_2 = AE_IS_VER1(dsaf_dev->dsaf_ver) ?
+   0x1041041 : 0x2082082;
+   reg_val_2 <<= port_rst_off;
 
if (!dereset) {
dsaf_write_sub(dsaf_dev, DSAF_SUB_SC_GE_RESET_REQ1_REG,
@@ -272,12 +271,11 @@ static void hns_dsaf_ge_srst_by_port(struct dsaf_device 
*dsaf_dev, u32 port,
   reg_val_1);
}
} else {
-   reg_val_1 = 0x15540 << dsaf_dev->reset_offset;
+   reg_val_1 = 0x15540;
+   reg_val_2 = AE_IS_VER1(dsaf_dev->dsaf_ver) ? 0x100 : 0x40;
 
-   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 <<= 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,
-- 
1.9.1



[PATCH v2 net-next 2/9] net: hns: fix code style about hns driver

2016-06-30 Thread Yisen Zhuang
From: Daode Huang 

This patch fixes code sytle of hns driver to make it
simple.

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

diff --git a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_misc.c 
b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_misc.c
index 8473287..611b67b 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_misc.c
+++ b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_misc.c
@@ -253,10 +253,9 @@ static void hns_dsaf_ge_srst_by_port(struct dsaf_device 
*dsaf_dev, u32 port,
reg_val_1  = 0x1 << port;
port_rst_off = dsaf_dev->mac_cb[port]->port_rst_off;
/* there is difference between V1 and V2 in register.*/
-   if (AE_IS_VER1(dsaf_dev->dsaf_ver))
-   reg_val_2  = 0x1041041 << port_rst_off;
-   else
-   reg_val_2  = 0x2082082 << port_rst_off;
+   reg_val_2 = AE_IS_VER1(dsaf_dev->dsaf_ver) ?
+   0x1041041 : 0x2082082;
+   reg_val_2 <<= port_rst_off;
 
if (!dereset) {
dsaf_write_sub(dsaf_dev, DSAF_SUB_SC_GE_RESET_REQ1_REG,
@@ -272,12 +271,11 @@ static void hns_dsaf_ge_srst_by_port(struct dsaf_device 
*dsaf_dev, u32 port,
   reg_val_1);
}
} else {
-   reg_val_1 = 0x15540 << dsaf_dev->reset_offset;
+   reg_val_1 = 0x15540;
+   reg_val_2 = AE_IS_VER1(dsaf_dev->dsaf_ver) ? 0x100 : 0x40;
 
-   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 <<= 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,
-- 
1.9.1



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

2016-06-30 Thread Yisen Zhuang
From: Daode Huang 

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

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

diff --git a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c 
b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c
index e36ee22..86ce28a 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c
+++ b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c
@@ -2567,15 +2567,15 @@ static char *hns_dsaf_get_node_stats_strings(char 
*data, int node,
buff += ETH_GSTRING_LEN;
if (node < DSAF_SERVICE_NW_NUM && !is_ver1) {
for (i = 0; i < DSAF_PRIO_NR; i++) {
-   snprintf(buff, ETH_GSTRING_LEN,
-"inod%d_pfc_prio%d_pkts", node, i);
-   buff += ETH_GSTRING_LEN;
-   }
-   for (i = 0; i < DSAF_PRIO_NR; i++) {
-   snprintf(buff, ETH_GSTRING_LEN,
-"onod%d_pfc_prio%d_pkts", node, i);
+   snprintf(buff + 0 * ETH_GSTRING_LEN * DSAF_PRIO_NR,
+ETH_GSTRING_LEN, "inod%d_pfc_prio%d_pkts",
+node, i);
+   snprintf(buff + 1 * ETH_GSTRING_LEN * DSAF_PRIO_NR,
+ETH_GSTRING_LEN, "onod%d_pfc_prio%d_pkts",
+node, i);
buff += ETH_GSTRING_LEN;
}
+   buff += 1 * DSAF_PRIO_NR * ETH_GSTRING_LEN;
}
snprintf(buff, ETH_GSTRING_LEN, "onnod%d_tx_pkts", node);
buff += ETH_GSTRING_LEN;
@@ -2606,8 +2606,8 @@ static u64 *hns_dsaf_get_node_stats(struct dsaf_device 
*ddev, u64 *data,
p[12] = hw_stats->stp_drop;
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[13 + i + 0 * DSAF_PRIO_NR] = hw_stats->rx_pfc[i];
+   p[13 + i + 1 * DSAF_PRIO_NR] = hw_stats->tx_pfc[i];
}
p[29] = hw_stats->tx_pkts;
return [30];
-- 
1.9.1



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

2016-06-30 Thread Yisen Zhuang
From: Daode Huang 

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

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

diff --git a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c 
b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c
index e36ee22..86ce28a 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c
+++ b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c
@@ -2567,15 +2567,15 @@ static char *hns_dsaf_get_node_stats_strings(char 
*data, int node,
buff += ETH_GSTRING_LEN;
if (node < DSAF_SERVICE_NW_NUM && !is_ver1) {
for (i = 0; i < DSAF_PRIO_NR; i++) {
-   snprintf(buff, ETH_GSTRING_LEN,
-"inod%d_pfc_prio%d_pkts", node, i);
-   buff += ETH_GSTRING_LEN;
-   }
-   for (i = 0; i < DSAF_PRIO_NR; i++) {
-   snprintf(buff, ETH_GSTRING_LEN,
-"onod%d_pfc_prio%d_pkts", node, i);
+   snprintf(buff + 0 * ETH_GSTRING_LEN * DSAF_PRIO_NR,
+ETH_GSTRING_LEN, "inod%d_pfc_prio%d_pkts",
+node, i);
+   snprintf(buff + 1 * ETH_GSTRING_LEN * DSAF_PRIO_NR,
+ETH_GSTRING_LEN, "onod%d_pfc_prio%d_pkts",
+node, i);
buff += ETH_GSTRING_LEN;
}
+   buff += 1 * DSAF_PRIO_NR * ETH_GSTRING_LEN;
}
snprintf(buff, ETH_GSTRING_LEN, "onnod%d_tx_pkts", node);
buff += ETH_GSTRING_LEN;
@@ -2606,8 +2606,8 @@ static u64 *hns_dsaf_get_node_stats(struct dsaf_device 
*ddev, u64 *data,
p[12] = hw_stats->stp_drop;
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[13 + i + 0 * DSAF_PRIO_NR] = hw_stats->rx_pfc[i];
+   p[13 + i + 1 * DSAF_PRIO_NR] = hw_stats->tx_pfc[i];
}
p[29] = hw_stats->tx_pkts;
return [30];
-- 
1.9.1



[PATCH v2 net-next 4/9] net: hns: delete redundant parenthese

2016-06-30 Thread Yisen Zhuang
From: Daode Huang 

According to the previous review comments from Andy, this patch
deletes the redundant parens in the patch.

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

diff --git a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c 
b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c
index b9d01ea..e36ee22 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c
+++ b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c
@@ -2565,7 +2565,7 @@ static char *hns_dsaf_get_node_stats_strings(char *data, 
int node,
buff += ETH_GSTRING_LEN;
snprintf(buff, ETH_GSTRING_LEN, "innod%d_stp_drop_pkts", node);
buff += ETH_GSTRING_LEN;
-   if ((node < DSAF_SERVICE_NW_NUM) && (!is_ver1)) {
+   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);
@@ -2604,7 +2604,7 @@ 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;
-   if ((node_num < DSAF_SERVICE_NW_NUM) && (!is_ver1)) {
+   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];
-- 
1.9.1



[PATCH v2 net-next 4/9] net: hns: delete redundant parenthese

2016-06-30 Thread Yisen Zhuang
From: Daode Huang 

According to the previous review comments from Andy, this patch
deletes the redundant parens in the patch.

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

diff --git a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c 
b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c
index b9d01ea..e36ee22 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c
+++ b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c
@@ -2565,7 +2565,7 @@ static char *hns_dsaf_get_node_stats_strings(char *data, 
int node,
buff += ETH_GSTRING_LEN;
snprintf(buff, ETH_GSTRING_LEN, "innod%d_stp_drop_pkts", node);
buff += ETH_GSTRING_LEN;
-   if ((node < DSAF_SERVICE_NW_NUM) && (!is_ver1)) {
+   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);
@@ -2604,7 +2604,7 @@ 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;
-   if ((node_num < DSAF_SERVICE_NW_NUM) && (!is_ver1)) {
+   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];
-- 
1.9.1



[PATCH net-next 0/9] net: hns: fix the typo of hns

2016-06-27 Thread Yisen Zhuang
This series includes typo fixes which review by Andy, adding
the hns maintainer to MAINTAINERS,

 > adds the maintainer for hns driver from Daode;

 > from Daode: fix the typo of hns reviewed by Andy Shevchenko;

 > from Kejian: one remove redundant function and two fix to get 
configuration from DT.

Daode Huang (6):
  MAINTAINERS: add maintainers for hns driver
  net: hns: fix code style about hns driver
  net: hns: change code style from a = a + x to a += x
  net: hns: delete redundant parens
  net: hns: add a space before "*/"
  net: hns: normalize two different loop

Kejian Yan (3):
  net: hns: remove redundant hns_mac_dev_to_enet_if()
  net: hns: add media-type property for hns
  net: hns: get reset registers from DT

 MAINTAINERS|  9 +++
 drivers/net/ethernet/hisilicon/hns/hnae.h  |  9 +++
 drivers/net/ethernet/hisilicon/hns/hns_ae_adapt.c  |  1 +
 drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.c  | 41 +++
 drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.h  |  1 +
 drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c | 52 +++---
 drivers/net/ethernet/hisilicon/hns/hns_dsaf_misc.c | 16 ++---
 drivers/net/ethernet/hisilicon/hns/hns_enet.c  |  4 +-
 drivers/net/ethernet/hisilicon/hns/hns_ethtool.c   | 14 +++-
 drivers/net/ethernet/hisilicon/hns_mdio.c  | 80 ++
 10 files changed, 158 insertions(+), 69 deletions(-)

-- 
1.9.1



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

2016-06-27 Thread Yisen Zhuang
From: Daode Huang <huangda...@hisilicon.com>

This patch adds maintainers for hisilicon network subsystem driver

Signed-off-by: Daode Huang <huangda...@hisilicon.com>
---
 MAINTAINERS | 9 +
 1 file changed, 9 insertions(+)

diff --git a/MAINTAINERS b/MAINTAINERS
index 3a171a9..c819659 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -5421,6 +5421,15 @@ F:   include/uapi/linux/if_hippi.h
 F: net/802/hippi.c
 F: drivers/net/hippi/
 
+HISILICON NETWORK SUBSYSTEM DRIVER
+M: Yisen Zhuang <yisen.zhu...@huawei.com>
+M: Salil Mehta <salil.me...@huawei.com>
+L: net...@vger.kernel.org
+W: http://www.hisilicon.com
+S: Maintained
+F: drivers/net/ethernet/hisilicon/*
+F: Documentation/devicetree/bindings/net/hisilicon*.txt
+
 HISILICON SAS Controller
 M: John Garry <john.ga...@huawei.com>
 W: http://www.hisilicon.com
-- 
1.9.1



[PATCH net-next 0/9] net: hns: fix the typo of hns

2016-06-27 Thread Yisen Zhuang
This series includes typo fixes which review by Andy, adding
the hns maintainer to MAINTAINERS,

 > adds the maintainer for hns driver from Daode;

 > from Daode: fix the typo of hns reviewed by Andy Shevchenko;

 > from Kejian: one remove redundant function and two fix to get 
configuration from DT.

Daode Huang (6):
  MAINTAINERS: add maintainers for hns driver
  net: hns: fix code style about hns driver
  net: hns: change code style from a = a + x to a += x
  net: hns: delete redundant parens
  net: hns: add a space before "*/"
  net: hns: normalize two different loop

Kejian Yan (3):
  net: hns: remove redundant hns_mac_dev_to_enet_if()
  net: hns: add media-type property for hns
  net: hns: get reset registers from DT

 MAINTAINERS|  9 +++
 drivers/net/ethernet/hisilicon/hns/hnae.h  |  9 +++
 drivers/net/ethernet/hisilicon/hns/hns_ae_adapt.c  |  1 +
 drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.c  | 41 +++
 drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.h  |  1 +
 drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c | 52 +++---
 drivers/net/ethernet/hisilicon/hns/hns_dsaf_misc.c | 16 ++---
 drivers/net/ethernet/hisilicon/hns/hns_enet.c  |  4 +-
 drivers/net/ethernet/hisilicon/hns/hns_ethtool.c   | 14 +++-
 drivers/net/ethernet/hisilicon/hns_mdio.c  | 80 ++
 10 files changed, 158 insertions(+), 69 deletions(-)

-- 
1.9.1



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

2016-06-27 Thread Yisen Zhuang
From: Daode Huang 

This patch adds maintainers for hisilicon network subsystem driver

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

diff --git a/MAINTAINERS b/MAINTAINERS
index 3a171a9..c819659 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -5421,6 +5421,15 @@ F:   include/uapi/linux/if_hippi.h
 F: net/802/hippi.c
 F: drivers/net/hippi/
 
+HISILICON NETWORK SUBSYSTEM DRIVER
+M: Yisen Zhuang 
+M: Salil Mehta 
+L: net...@vger.kernel.org
+W: http://www.hisilicon.com
+S: Maintained
+F: drivers/net/ethernet/hisilicon/*
+F: Documentation/devicetree/bindings/net/hisilicon*.txt
+
 HISILICON SAS Controller
 M: John Garry 
 W: http://www.hisilicon.com
-- 
1.9.1



[PATCH net-next 7/9] net: hns: remove redundant hns_mac_dev_to_enet_if()

2016-06-27 Thread Yisen Zhuang
From: Kejian Yan 

The sequence of hns_mac_dev_to_enet_if() is the same as
hns_get_enet_interface(), and hns_get_enet_interface() is called
by initialization to get the mac mode. And the mode is not changed
anywhere. Thus add hns_mac_dev_to_enet_if() function to get the mac
mode is obviously redundant.

Reported-by: Jinchuan Tian 
Signed-off-by: Kejian Yan 
---
 drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.c | 15 ---
 1 file changed, 15 deletions(-)

diff --git a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.c 
b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.c
index c526558..d2effcc 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.c
+++ b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.c
@@ -56,20 +56,6 @@ static const enum mac_mode g_mac_mode_1000[] = {
[PHY_INTERFACE_MODE_RTBI]   = MAC_MODE_RTBI_1000
 };
 
-static enum mac_mode hns_mac_dev_to_enet_if(const struct hns_mac_cb *mac_cb)
-{
-   switch (mac_cb->max_speed) {
-   case MAC_SPEED_100:
-   return g_mac_mode_100[mac_cb->phy_if];
-   case MAC_SPEED_1000:
-   return g_mac_mode_1000[mac_cb->phy_if];
-   case MAC_SPEED_1:
-   return MAC_MODE_XGMII_1;
-   default:
-   return MAC_MODE_MII_100;
-   }
-}
-
 static enum mac_mode hns_get_enet_interface(const struct hns_mac_cb *mac_cb)
 {
switch (mac_cb->max_speed) {
@@ -134,7 +120,6 @@ void hns_mac_adjust_link(struct hns_mac_cb *mac_cb, int 
speed, int duplex)
 
mac_cb->speed = speed;
mac_cb->half_duplex = !duplex;
-   mac_ctrl_drv->mac_mode = hns_mac_dev_to_enet_if(mac_cb);
 
if (mac_ctrl_drv->adjust_link) {
ret = mac_ctrl_drv->adjust_link(mac_ctrl_drv,
-- 
1.9.1



[PATCH net-next 3/9] net: hns: change code style from a = a + x to a += x

2016-06-27 Thread Yisen Zhuang
From: Daode Huang 

This patch fixes the code style in hns driver. Change it from
"buff = buff + xxx" to "buff += xxx". The reveiw comments is
from andy.

Reviewed-by: Andriy Shevchenko 
Signed-off-by: Daode Huang 
---
 drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c | 32 +++---
 1 file changed, 16 insertions(+), 16 deletions(-)

diff --git a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c 
b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c
index 67e8e13..b9d01ea 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c
+++ b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c
@@ -2540,45 +2540,45 @@ static char *hns_dsaf_get_node_stats_strings(char 
*data, int node,
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;
+   buff += ETH_GSTRING_LEN;
snprintf(buff, ETH_GSTRING_LEN, "innod%d_manage_pkts", node);
-   buff = buff + ETH_GSTRING_LEN;
+   buff += ETH_GSTRING_LEN;
snprintf(buff, ETH_GSTRING_LEN, "innod%d_rx_pkts", node);
-   buff = buff + ETH_GSTRING_LEN;
+   buff += ETH_GSTRING_LEN;
snprintf(buff, ETH_GSTRING_LEN, "innod%d_rx_pkt_id", node);
-   buff = buff + ETH_GSTRING_LEN;
+   buff += ETH_GSTRING_LEN;
snprintf(buff, ETH_GSTRING_LEN, "innod%d_rx_pause_frame", node);
-   buff = buff + ETH_GSTRING_LEN;
+   buff += ETH_GSTRING_LEN;
snprintf(buff, ETH_GSTRING_LEN, "innod%d_release_buf_num", node);
-   buff = buff + ETH_GSTRING_LEN;
+   buff += ETH_GSTRING_LEN;
snprintf(buff, ETH_GSTRING_LEN, "innod%d_sbm_drop_pkts", node);
-   buff = buff + ETH_GSTRING_LEN;
+   buff += ETH_GSTRING_LEN;
snprintf(buff, ETH_GSTRING_LEN, "innod%d_crc_false_pkts", node);
-   buff = buff + ETH_GSTRING_LEN;
+   buff += ETH_GSTRING_LEN;
snprintf(buff, ETH_GSTRING_LEN, "innod%d_bp_drop_pkts", node);
-   buff = buff + ETH_GSTRING_LEN;
+   buff += ETH_GSTRING_LEN;
snprintf(buff, ETH_GSTRING_LEN, "innod%d_lookup_rslt_drop_pkts", node);
-   buff = buff + ETH_GSTRING_LEN;
+   buff += ETH_GSTRING_LEN;
snprintf(buff, ETH_GSTRING_LEN, "innod%d_local_rslt_fail_pkts", node);
-   buff = buff + ETH_GSTRING_LEN;
+   buff += ETH_GSTRING_LEN;
snprintf(buff, ETH_GSTRING_LEN, "innod%d_vlan_drop_pkts", node);
-   buff = buff + ETH_GSTRING_LEN;
+   buff += ETH_GSTRING_LEN;
snprintf(buff, ETH_GSTRING_LEN, "innod%d_stp_drop_pkts", node);
-   buff = buff + ETH_GSTRING_LEN;
+   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;
+   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;
+   buff += ETH_GSTRING_LEN;
}
}
snprintf(buff, ETH_GSTRING_LEN, "onnod%d_tx_pkts", node);
-   buff = buff + ETH_GSTRING_LEN;
+   buff += ETH_GSTRING_LEN;
 
return buff;
 }
-- 
1.9.1



[PATCH net-next 4/9] net: hns: delete redundant parens

2016-06-27 Thread Yisen Zhuang
From: Daode Huang 

According to the previous review comments from Andy, this patch
deletes the redundant parens in the patch.

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

diff --git a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c 
b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c
index b9d01ea..e36ee22 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c
+++ b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c
@@ -2565,7 +2565,7 @@ static char *hns_dsaf_get_node_stats_strings(char *data, 
int node,
buff += ETH_GSTRING_LEN;
snprintf(buff, ETH_GSTRING_LEN, "innod%d_stp_drop_pkts", node);
buff += ETH_GSTRING_LEN;
-   if ((node < DSAF_SERVICE_NW_NUM) && (!is_ver1)) {
+   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);
@@ -2604,7 +2604,7 @@ 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;
-   if ((node_num < DSAF_SERVICE_NW_NUM) && (!is_ver1)) {
+   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];
-- 
1.9.1



[PATCH net-next 7/9] net: hns: remove redundant hns_mac_dev_to_enet_if()

2016-06-27 Thread Yisen Zhuang
From: Kejian Yan 

The sequence of hns_mac_dev_to_enet_if() is the same as
hns_get_enet_interface(), and hns_get_enet_interface() is called
by initialization to get the mac mode. And the mode is not changed
anywhere. Thus add hns_mac_dev_to_enet_if() function to get the mac
mode is obviously redundant.

Reported-by: Jinchuan Tian 
Signed-off-by: Kejian Yan 
---
 drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.c | 15 ---
 1 file changed, 15 deletions(-)

diff --git a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.c 
b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.c
index c526558..d2effcc 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.c
+++ b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.c
@@ -56,20 +56,6 @@ static const enum mac_mode g_mac_mode_1000[] = {
[PHY_INTERFACE_MODE_RTBI]   = MAC_MODE_RTBI_1000
 };
 
-static enum mac_mode hns_mac_dev_to_enet_if(const struct hns_mac_cb *mac_cb)
-{
-   switch (mac_cb->max_speed) {
-   case MAC_SPEED_100:
-   return g_mac_mode_100[mac_cb->phy_if];
-   case MAC_SPEED_1000:
-   return g_mac_mode_1000[mac_cb->phy_if];
-   case MAC_SPEED_1:
-   return MAC_MODE_XGMII_1;
-   default:
-   return MAC_MODE_MII_100;
-   }
-}
-
 static enum mac_mode hns_get_enet_interface(const struct hns_mac_cb *mac_cb)
 {
switch (mac_cb->max_speed) {
@@ -134,7 +120,6 @@ void hns_mac_adjust_link(struct hns_mac_cb *mac_cb, int 
speed, int duplex)
 
mac_cb->speed = speed;
mac_cb->half_duplex = !duplex;
-   mac_ctrl_drv->mac_mode = hns_mac_dev_to_enet_if(mac_cb);
 
if (mac_ctrl_drv->adjust_link) {
ret = mac_ctrl_drv->adjust_link(mac_ctrl_drv,
-- 
1.9.1



[PATCH net-next 3/9] net: hns: change code style from a = a + x to a += x

2016-06-27 Thread Yisen Zhuang
From: Daode Huang 

This patch fixes the code style in hns driver. Change it from
"buff = buff + xxx" to "buff += xxx". The reveiw comments is
from andy.

Reviewed-by: Andriy Shevchenko 
Signed-off-by: Daode Huang 
---
 drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c | 32 +++---
 1 file changed, 16 insertions(+), 16 deletions(-)

diff --git a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c 
b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c
index 67e8e13..b9d01ea 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c
+++ b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c
@@ -2540,45 +2540,45 @@ static char *hns_dsaf_get_node_stats_strings(char 
*data, int node,
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;
+   buff += ETH_GSTRING_LEN;
snprintf(buff, ETH_GSTRING_LEN, "innod%d_manage_pkts", node);
-   buff = buff + ETH_GSTRING_LEN;
+   buff += ETH_GSTRING_LEN;
snprintf(buff, ETH_GSTRING_LEN, "innod%d_rx_pkts", node);
-   buff = buff + ETH_GSTRING_LEN;
+   buff += ETH_GSTRING_LEN;
snprintf(buff, ETH_GSTRING_LEN, "innod%d_rx_pkt_id", node);
-   buff = buff + ETH_GSTRING_LEN;
+   buff += ETH_GSTRING_LEN;
snprintf(buff, ETH_GSTRING_LEN, "innod%d_rx_pause_frame", node);
-   buff = buff + ETH_GSTRING_LEN;
+   buff += ETH_GSTRING_LEN;
snprintf(buff, ETH_GSTRING_LEN, "innod%d_release_buf_num", node);
-   buff = buff + ETH_GSTRING_LEN;
+   buff += ETH_GSTRING_LEN;
snprintf(buff, ETH_GSTRING_LEN, "innod%d_sbm_drop_pkts", node);
-   buff = buff + ETH_GSTRING_LEN;
+   buff += ETH_GSTRING_LEN;
snprintf(buff, ETH_GSTRING_LEN, "innod%d_crc_false_pkts", node);
-   buff = buff + ETH_GSTRING_LEN;
+   buff += ETH_GSTRING_LEN;
snprintf(buff, ETH_GSTRING_LEN, "innod%d_bp_drop_pkts", node);
-   buff = buff + ETH_GSTRING_LEN;
+   buff += ETH_GSTRING_LEN;
snprintf(buff, ETH_GSTRING_LEN, "innod%d_lookup_rslt_drop_pkts", node);
-   buff = buff + ETH_GSTRING_LEN;
+   buff += ETH_GSTRING_LEN;
snprintf(buff, ETH_GSTRING_LEN, "innod%d_local_rslt_fail_pkts", node);
-   buff = buff + ETH_GSTRING_LEN;
+   buff += ETH_GSTRING_LEN;
snprintf(buff, ETH_GSTRING_LEN, "innod%d_vlan_drop_pkts", node);
-   buff = buff + ETH_GSTRING_LEN;
+   buff += ETH_GSTRING_LEN;
snprintf(buff, ETH_GSTRING_LEN, "innod%d_stp_drop_pkts", node);
-   buff = buff + ETH_GSTRING_LEN;
+   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;
+   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;
+   buff += ETH_GSTRING_LEN;
}
}
snprintf(buff, ETH_GSTRING_LEN, "onnod%d_tx_pkts", node);
-   buff = buff + ETH_GSTRING_LEN;
+   buff += ETH_GSTRING_LEN;
 
return buff;
 }
-- 
1.9.1



[PATCH net-next 4/9] net: hns: delete redundant parens

2016-06-27 Thread Yisen Zhuang
From: Daode Huang 

According to the previous review comments from Andy, this patch
deletes the redundant parens in the patch.

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

diff --git a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c 
b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c
index b9d01ea..e36ee22 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c
+++ b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c
@@ -2565,7 +2565,7 @@ static char *hns_dsaf_get_node_stats_strings(char *data, 
int node,
buff += ETH_GSTRING_LEN;
snprintf(buff, ETH_GSTRING_LEN, "innod%d_stp_drop_pkts", node);
buff += ETH_GSTRING_LEN;
-   if ((node < DSAF_SERVICE_NW_NUM) && (!is_ver1)) {
+   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);
@@ -2604,7 +2604,7 @@ 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;
-   if ((node_num < DSAF_SERVICE_NW_NUM) && (!is_ver1)) {
+   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];
-- 
1.9.1



[PATCH net-next 2/9] net: hns: fix code style about hns driver

2016-06-27 Thread Yisen Zhuang
From: Daode Huang 

This patch fixes code sytle of hns driver to make it
simple.

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

diff --git a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_misc.c 
b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_misc.c
index 8473287..611b67b 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_misc.c
+++ b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_misc.c
@@ -253,10 +253,9 @@ static void hns_dsaf_ge_srst_by_port(struct dsaf_device 
*dsaf_dev, u32 port,
reg_val_1  = 0x1 << port;
port_rst_off = dsaf_dev->mac_cb[port]->port_rst_off;
/* there is difference between V1 and V2 in register.*/
-   if (AE_IS_VER1(dsaf_dev->dsaf_ver))
-   reg_val_2  = 0x1041041 << port_rst_off;
-   else
-   reg_val_2  = 0x2082082 << port_rst_off;
+   reg_val_2 = AE_IS_VER1(dsaf_dev->dsaf_ver) ?
+   0x1041041 : 0x2082082;
+   reg_val_2 <<= port_rst_off;
 
if (!dereset) {
dsaf_write_sub(dsaf_dev, DSAF_SUB_SC_GE_RESET_REQ1_REG,
@@ -272,12 +271,11 @@ static void hns_dsaf_ge_srst_by_port(struct dsaf_device 
*dsaf_dev, u32 port,
   reg_val_1);
}
} else {
-   reg_val_1 = 0x15540 << dsaf_dev->reset_offset;
+   reg_val_1 = 0x15540;
+   reg_val_2 = AE_IS_VER1(dsaf_dev->dsaf_ver) ? 0x100 : 0x40;
 
-   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 <<= 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,
-- 
1.9.1



[PATCH net-next 2/9] net: hns: fix code style about hns driver

2016-06-27 Thread Yisen Zhuang
From: Daode Huang 

This patch fixes code sytle of hns driver to make it
simple.

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

diff --git a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_misc.c 
b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_misc.c
index 8473287..611b67b 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_misc.c
+++ b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_misc.c
@@ -253,10 +253,9 @@ static void hns_dsaf_ge_srst_by_port(struct dsaf_device 
*dsaf_dev, u32 port,
reg_val_1  = 0x1 << port;
port_rst_off = dsaf_dev->mac_cb[port]->port_rst_off;
/* there is difference between V1 and V2 in register.*/
-   if (AE_IS_VER1(dsaf_dev->dsaf_ver))
-   reg_val_2  = 0x1041041 << port_rst_off;
-   else
-   reg_val_2  = 0x2082082 << port_rst_off;
+   reg_val_2 = AE_IS_VER1(dsaf_dev->dsaf_ver) ?
+   0x1041041 : 0x2082082;
+   reg_val_2 <<= port_rst_off;
 
if (!dereset) {
dsaf_write_sub(dsaf_dev, DSAF_SUB_SC_GE_RESET_REQ1_REG,
@@ -272,12 +271,11 @@ static void hns_dsaf_ge_srst_by_port(struct dsaf_device 
*dsaf_dev, u32 port,
   reg_val_1);
}
} else {
-   reg_val_1 = 0x15540 << dsaf_dev->reset_offset;
+   reg_val_1 = 0x15540;
+   reg_val_2 = AE_IS_VER1(dsaf_dev->dsaf_ver) ? 0x100 : 0x40;
 
-   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 <<= 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,
-- 
1.9.1



[PATCH net-next 9/9] net: hns: get reset registers from DT

2016-06-27 Thread Yisen Zhuang
From: Kejian Yan 

Since the registers of subctrl may be different, it is better to
mv the registers from hns mdio driver routine to device tree node.

Signed-off-by: Kejian Yan 
---
 drivers/net/ethernet/hisilicon/hns_mdio.c | 80 +--
 1 file changed, 66 insertions(+), 14 deletions(-)

diff --git a/drivers/net/ethernet/hisilicon/hns_mdio.c 
b/drivers/net/ethernet/hisilicon/hns_mdio.c
index 761a32f..988ad69 100644
--- a/drivers/net/ethernet/hisilicon/hns_mdio.c
+++ b/drivers/net/ethernet/hisilicon/hns_mdio.c
@@ -37,9 +37,19 @@
 
 #define MDIO_TIMEOUT   100
 
+struct hns_mdio_sc_reg {
+   u16 mdio_clk_en;
+   u16 mdio_clk_dis;
+   u16 mdio_reset_req;
+   u16 mdio_reset_dreq;
+   u16 mdio_clk_st;
+   u16 mdio_reset_st;
+};
+
 struct hns_mdio_device {
void *vbase;/* mdio reg base address */
struct regmap *subctrl_vbase;
+   struct hns_mdio_sc_reg sc_reg;
 };
 
 /* mdio reg */
@@ -93,7 +103,6 @@ enum mdio_c45_op_seq {
 #define MDIO_SC_CLK_DIS0x33C
 #define MDIO_SC_RESET_REQ  0xA38
 #define MDIO_SC_RESET_DREQ 0xA3C
-#define MDIO_SC_CTRL   0x2010
 #define MDIO_SC_CLK_ST 0x531C
 #define MDIO_SC_RESET_ST   0x5A1C
 
@@ -353,6 +362,7 @@ static int hns_mdio_read(struct mii_bus *bus, int phy_id, 
int regnum)
 static int hns_mdio_reset(struct mii_bus *bus)
 {
struct hns_mdio_device *mdio_dev = (struct hns_mdio_device *)bus->priv;
+   const struct hns_mdio_sc_reg *sc_reg;
int ret;
 
if (dev_of_node(bus->parent)) {
@@ -361,9 +371,10 @@ static int hns_mdio_reset(struct mii_bus *bus)
return -ENODEV;
}
 
+   sc_reg = _dev->sc_reg;
/* 1. reset req, and read reset st check */
-   ret = mdio_sc_cfg_reg_write(mdio_dev, MDIO_SC_RESET_REQ, 0x1,
-   MDIO_SC_RESET_ST, 0x1,
+   ret = mdio_sc_cfg_reg_write(mdio_dev, sc_reg->mdio_reset_req, 0x1,
+   sc_reg->mdio_reset_st, 0x1,
MDIO_CHECK_SET_ST);
if (ret) {
dev_err(>dev, "MDIO reset fail\n");
@@ -371,8 +382,8 @@ static int hns_mdio_reset(struct mii_bus *bus)
}
 
/* 2. dis clk, and read clk st check */
-   ret = mdio_sc_cfg_reg_write(mdio_dev, MDIO_SC_CLK_DIS,
-   0x1, MDIO_SC_CLK_ST, 0x1,
+   ret = mdio_sc_cfg_reg_write(mdio_dev, sc_reg->mdio_clk_dis,
+   0x1, sc_reg->mdio_clk_st, 0x1,
MDIO_CHECK_CLR_ST);
if (ret) {
dev_err(>dev, "MDIO dis clk fail\n");
@@ -380,8 +391,8 @@ static int hns_mdio_reset(struct mii_bus *bus)
}
 
/* 3. reset dreq, and read reset st check */
-   ret = mdio_sc_cfg_reg_write(mdio_dev, MDIO_SC_RESET_DREQ, 0x1,
-   MDIO_SC_RESET_ST, 0x1,
+   ret = mdio_sc_cfg_reg_write(mdio_dev, sc_reg->mdio_reset_dreq, 0x1,
+   sc_reg->mdio_reset_st, 0x1,
MDIO_CHECK_CLR_ST);
if (ret) {
dev_err(>dev, "MDIO dis clk fail\n");
@@ -389,8 +400,8 @@ static int hns_mdio_reset(struct mii_bus *bus)
}
 
/* 4. en clk, and read clk st check */
-   ret = mdio_sc_cfg_reg_write(mdio_dev, MDIO_SC_CLK_EN,
-   0x1, MDIO_SC_CLK_ST, 0x1,
+   ret = mdio_sc_cfg_reg_write(mdio_dev, sc_reg->mdio_clk_en,
+   0x1, sc_reg->mdio_clk_st, 0x1,
MDIO_CHECK_SET_ST);
if (ret)
dev_err(>dev, "MDIO en clk fail\n");
@@ -458,13 +469,54 @@ static int hns_mdio_probe(struct platform_device *pdev)
snprintf(new_bus->id, MII_BUS_ID_SIZE, "%s-%s", "Mii",
 dev_name(>dev));
if (dev_of_node(>dev)) {
-   mdio_dev->subctrl_vbase = syscon_node_to_regmap(
-   of_parse_phandle(pdev->dev.of_node,
-"subctrl-vbase", 0));
-   if (IS_ERR(mdio_dev->subctrl_vbase)) {
-   dev_warn(>dev, "no syscon 
hisilicon,peri-c-subctrl\n");
+   struct of_phandle_args reg_args;
+
+   ret = of_parse_phandle_with_fixed_args(pdev->dev.of_node,
+  "subctrl-vbase",
+  4,
+  0,
+  _args);
+   if (!ret) {
+   

[PATCH net-next 9/9] net: hns: get reset registers from DT

2016-06-27 Thread Yisen Zhuang
From: Kejian Yan 

Since the registers of subctrl may be different, it is better to
mv the registers from hns mdio driver routine to device tree node.

Signed-off-by: Kejian Yan 
---
 drivers/net/ethernet/hisilicon/hns_mdio.c | 80 +--
 1 file changed, 66 insertions(+), 14 deletions(-)

diff --git a/drivers/net/ethernet/hisilicon/hns_mdio.c 
b/drivers/net/ethernet/hisilicon/hns_mdio.c
index 761a32f..988ad69 100644
--- a/drivers/net/ethernet/hisilicon/hns_mdio.c
+++ b/drivers/net/ethernet/hisilicon/hns_mdio.c
@@ -37,9 +37,19 @@
 
 #define MDIO_TIMEOUT   100
 
+struct hns_mdio_sc_reg {
+   u16 mdio_clk_en;
+   u16 mdio_clk_dis;
+   u16 mdio_reset_req;
+   u16 mdio_reset_dreq;
+   u16 mdio_clk_st;
+   u16 mdio_reset_st;
+};
+
 struct hns_mdio_device {
void *vbase;/* mdio reg base address */
struct regmap *subctrl_vbase;
+   struct hns_mdio_sc_reg sc_reg;
 };
 
 /* mdio reg */
@@ -93,7 +103,6 @@ enum mdio_c45_op_seq {
 #define MDIO_SC_CLK_DIS0x33C
 #define MDIO_SC_RESET_REQ  0xA38
 #define MDIO_SC_RESET_DREQ 0xA3C
-#define MDIO_SC_CTRL   0x2010
 #define MDIO_SC_CLK_ST 0x531C
 #define MDIO_SC_RESET_ST   0x5A1C
 
@@ -353,6 +362,7 @@ static int hns_mdio_read(struct mii_bus *bus, int phy_id, 
int regnum)
 static int hns_mdio_reset(struct mii_bus *bus)
 {
struct hns_mdio_device *mdio_dev = (struct hns_mdio_device *)bus->priv;
+   const struct hns_mdio_sc_reg *sc_reg;
int ret;
 
if (dev_of_node(bus->parent)) {
@@ -361,9 +371,10 @@ static int hns_mdio_reset(struct mii_bus *bus)
return -ENODEV;
}
 
+   sc_reg = _dev->sc_reg;
/* 1. reset req, and read reset st check */
-   ret = mdio_sc_cfg_reg_write(mdio_dev, MDIO_SC_RESET_REQ, 0x1,
-   MDIO_SC_RESET_ST, 0x1,
+   ret = mdio_sc_cfg_reg_write(mdio_dev, sc_reg->mdio_reset_req, 0x1,
+   sc_reg->mdio_reset_st, 0x1,
MDIO_CHECK_SET_ST);
if (ret) {
dev_err(>dev, "MDIO reset fail\n");
@@ -371,8 +382,8 @@ static int hns_mdio_reset(struct mii_bus *bus)
}
 
/* 2. dis clk, and read clk st check */
-   ret = mdio_sc_cfg_reg_write(mdio_dev, MDIO_SC_CLK_DIS,
-   0x1, MDIO_SC_CLK_ST, 0x1,
+   ret = mdio_sc_cfg_reg_write(mdio_dev, sc_reg->mdio_clk_dis,
+   0x1, sc_reg->mdio_clk_st, 0x1,
MDIO_CHECK_CLR_ST);
if (ret) {
dev_err(>dev, "MDIO dis clk fail\n");
@@ -380,8 +391,8 @@ static int hns_mdio_reset(struct mii_bus *bus)
}
 
/* 3. reset dreq, and read reset st check */
-   ret = mdio_sc_cfg_reg_write(mdio_dev, MDIO_SC_RESET_DREQ, 0x1,
-   MDIO_SC_RESET_ST, 0x1,
+   ret = mdio_sc_cfg_reg_write(mdio_dev, sc_reg->mdio_reset_dreq, 0x1,
+   sc_reg->mdio_reset_st, 0x1,
MDIO_CHECK_CLR_ST);
if (ret) {
dev_err(>dev, "MDIO dis clk fail\n");
@@ -389,8 +400,8 @@ static int hns_mdio_reset(struct mii_bus *bus)
}
 
/* 4. en clk, and read clk st check */
-   ret = mdio_sc_cfg_reg_write(mdio_dev, MDIO_SC_CLK_EN,
-   0x1, MDIO_SC_CLK_ST, 0x1,
+   ret = mdio_sc_cfg_reg_write(mdio_dev, sc_reg->mdio_clk_en,
+   0x1, sc_reg->mdio_clk_st, 0x1,
MDIO_CHECK_SET_ST);
if (ret)
dev_err(>dev, "MDIO en clk fail\n");
@@ -458,13 +469,54 @@ static int hns_mdio_probe(struct platform_device *pdev)
snprintf(new_bus->id, MII_BUS_ID_SIZE, "%s-%s", "Mii",
 dev_name(>dev));
if (dev_of_node(>dev)) {
-   mdio_dev->subctrl_vbase = syscon_node_to_regmap(
-   of_parse_phandle(pdev->dev.of_node,
-"subctrl-vbase", 0));
-   if (IS_ERR(mdio_dev->subctrl_vbase)) {
-   dev_warn(>dev, "no syscon 
hisilicon,peri-c-subctrl\n");
+   struct of_phandle_args reg_args;
+
+   ret = of_parse_phandle_with_fixed_args(pdev->dev.of_node,
+  "subctrl-vbase",
+  4,
+  0,
+  _args);
+   if (!ret) {
+   mdio_dev->subctrl_vbase =
+   

[PATCH net-next 5/9] net: hns: add a space before "*/"

2016-06-27 Thread Yisen Zhuang
From: Daode Huang 

In comment line, some time miss a space before */, so this
patch adds a space before */.

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

diff --git a/drivers/net/ethernet/hisilicon/hns/hns_enet.c 
b/drivers/net/ethernet/hisilicon/hns/hns_enet.c
index d5297ec..d7e1f8c 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_enet.c
+++ b/drivers/net/ethernet/hisilicon/hns/hns_enet.c
@@ -762,13 +762,13 @@ static int hns_nic_rx_poll_one(struct hns_nic_ring_data 
*ring_data,
recv_pkts = 0, recv_bds = 0, clean_count = 0;
 recv:
while (recv_pkts < budget && recv_bds < num) {
-   /* reuse or realloc buffers*/
+   /* reuse or realloc buffers */
if (clean_count >= RCB_NOF_ALLOC_RX_BUFF_ONCE) {
hns_nic_alloc_rx_buffers(ring_data, clean_count);
clean_count = 0;
}
 
-   /* poll one pkt*/
+   /* poll one pkt */
err = hns_nic_poll_rx_skb(ring_data, , );
if (unlikely(!skb)) /* this fault cannot be repaired */
goto out;
-- 
1.9.1



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

2016-06-27 Thread Yisen Zhuang
From: Daode Huang 

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

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

diff --git a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c 
b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c
index e36ee22..86ce28a 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c
+++ b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c
@@ -2567,15 +2567,15 @@ static char *hns_dsaf_get_node_stats_strings(char 
*data, int node,
buff += ETH_GSTRING_LEN;
if (node < DSAF_SERVICE_NW_NUM && !is_ver1) {
for (i = 0; i < DSAF_PRIO_NR; i++) {
-   snprintf(buff, ETH_GSTRING_LEN,
-"inod%d_pfc_prio%d_pkts", node, i);
-   buff += ETH_GSTRING_LEN;
-   }
-   for (i = 0; i < DSAF_PRIO_NR; i++) {
-   snprintf(buff, ETH_GSTRING_LEN,
-"onod%d_pfc_prio%d_pkts", node, i);
+   snprintf(buff + 0 * ETH_GSTRING_LEN * DSAF_PRIO_NR,
+ETH_GSTRING_LEN, "inod%d_pfc_prio%d_pkts",
+node, i);
+   snprintf(buff + 1 * ETH_GSTRING_LEN * DSAF_PRIO_NR,
+ETH_GSTRING_LEN, "onod%d_pfc_prio%d_pkts",
+node, i);
buff += ETH_GSTRING_LEN;
}
+   buff += 1 * DSAF_PRIO_NR * ETH_GSTRING_LEN;
}
snprintf(buff, ETH_GSTRING_LEN, "onnod%d_tx_pkts", node);
buff += ETH_GSTRING_LEN;
@@ -2606,8 +2606,8 @@ static u64 *hns_dsaf_get_node_stats(struct dsaf_device 
*ddev, u64 *data,
p[12] = hw_stats->stp_drop;
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[13 + i + 0 * DSAF_PRIO_NR] = hw_stats->rx_pfc[i];
+   p[13 + i + 1 * DSAF_PRIO_NR] = hw_stats->tx_pfc[i];
}
p[29] = hw_stats->tx_pkts;
return [30];
-- 
1.9.1



[PATCH net-next 5/9] net: hns: add a space before "*/"

2016-06-27 Thread Yisen Zhuang
From: Daode Huang 

In comment line, some time miss a space before */, so this
patch adds a space before */.

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

diff --git a/drivers/net/ethernet/hisilicon/hns/hns_enet.c 
b/drivers/net/ethernet/hisilicon/hns/hns_enet.c
index d5297ec..d7e1f8c 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_enet.c
+++ b/drivers/net/ethernet/hisilicon/hns/hns_enet.c
@@ -762,13 +762,13 @@ static int hns_nic_rx_poll_one(struct hns_nic_ring_data 
*ring_data,
recv_pkts = 0, recv_bds = 0, clean_count = 0;
 recv:
while (recv_pkts < budget && recv_bds < num) {
-   /* reuse or realloc buffers*/
+   /* reuse or realloc buffers */
if (clean_count >= RCB_NOF_ALLOC_RX_BUFF_ONCE) {
hns_nic_alloc_rx_buffers(ring_data, clean_count);
clean_count = 0;
}
 
-   /* poll one pkt*/
+   /* poll one pkt */
err = hns_nic_poll_rx_skb(ring_data, , );
if (unlikely(!skb)) /* this fault cannot be repaired */
goto out;
-- 
1.9.1



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

2016-06-27 Thread Yisen Zhuang
From: Daode Huang 

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

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

diff --git a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c 
b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c
index e36ee22..86ce28a 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c
+++ b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c
@@ -2567,15 +2567,15 @@ static char *hns_dsaf_get_node_stats_strings(char 
*data, int node,
buff += ETH_GSTRING_LEN;
if (node < DSAF_SERVICE_NW_NUM && !is_ver1) {
for (i = 0; i < DSAF_PRIO_NR; i++) {
-   snprintf(buff, ETH_GSTRING_LEN,
-"inod%d_pfc_prio%d_pkts", node, i);
-   buff += ETH_GSTRING_LEN;
-   }
-   for (i = 0; i < DSAF_PRIO_NR; i++) {
-   snprintf(buff, ETH_GSTRING_LEN,
-"onod%d_pfc_prio%d_pkts", node, i);
+   snprintf(buff + 0 * ETH_GSTRING_LEN * DSAF_PRIO_NR,
+ETH_GSTRING_LEN, "inod%d_pfc_prio%d_pkts",
+node, i);
+   snprintf(buff + 1 * ETH_GSTRING_LEN * DSAF_PRIO_NR,
+ETH_GSTRING_LEN, "onod%d_pfc_prio%d_pkts",
+node, i);
buff += ETH_GSTRING_LEN;
}
+   buff += 1 * DSAF_PRIO_NR * ETH_GSTRING_LEN;
}
snprintf(buff, ETH_GSTRING_LEN, "onnod%d_tx_pkts", node);
buff += ETH_GSTRING_LEN;
@@ -2606,8 +2606,8 @@ static u64 *hns_dsaf_get_node_stats(struct dsaf_device 
*ddev, u64 *data,
p[12] = hw_stats->stp_drop;
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[13 + i + 0 * DSAF_PRIO_NR] = hw_stats->rx_pfc[i];
+   p[13 + i + 1 * DSAF_PRIO_NR] = hw_stats->tx_pfc[i];
}
p[29] = hw_stats->tx_pkts;
return [30];
-- 
1.9.1



[PATCH net-next 8/9] net: hns: add media-type property for hns

2016-06-27 Thread Yisen Zhuang
From: Kejian Yan 

It is PORT_TP type if the service port is GE mode. It is wrong to
judge the port type by using if it is service port. Adding the media
type to know port type.

Reported-by: Jinchuan Tian 
Signed-off-by: Kejian Yan 
---
 drivers/net/ethernet/hisilicon/hns/hnae.h |  9 
 drivers/net/ethernet/hisilicon/hns/hns_ae_adapt.c |  1 +
 drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.c | 26 +++
 drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.h |  1 +
 drivers/net/ethernet/hisilicon/hns/hns_ethtool.c  | 14 +---
 5 files changed, 48 insertions(+), 3 deletions(-)

diff --git a/drivers/net/ethernet/hisilicon/hns/hnae.h 
b/drivers/net/ethernet/hisilicon/hns/hnae.h
index 3869322..e093cbf 100644
--- a/drivers/net/ethernet/hisilicon/hns/hnae.h
+++ b/drivers/net/ethernet/hisilicon/hns/hnae.h
@@ -363,6 +363,14 @@ enum hnae_port_type {
HNAE_PORT_DEBUG
 };
 
+/* mac media type */
+enum hnae_media_type {
+   HNAE_MEDIA_TYPE_UNKNOWN = 0,
+   HNAE_MEDIA_TYPE_FIBER,
+   HNAE_MEDIA_TYPE_COPPER,
+   HNAE_MEDIA_TYPE_BACKPLANE,
+};
+
 /* This struct defines the operation on the handle.
  *
  * get_handle(): (mandatory)
@@ -525,6 +533,7 @@ struct hnae_handle {
u32 eport_id;
u32 dport_id;   /* v2 tx bd should fill the dport_id */
enum hnae_port_type port_type;
+   enum hnae_media_type media_type;
struct list_head node;/* list to hnae_ae_dev->handle_list */
struct hnae_buf_ops *bops; /* operation for the buffer */
struct hnae_queue **qs;  /* array base of all queues */
diff --git a/drivers/net/ethernet/hisilicon/hns/hns_ae_adapt.c 
b/drivers/net/ethernet/hisilicon/hns/hns_ae_adapt.c
index 835521b..e28d960 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_ae_adapt.c
+++ b/drivers/net/ethernet/hisilicon/hns/hns_ae_adapt.c
@@ -134,6 +134,7 @@ struct hnae_handle *hns_ae_get_handle(struct hnae_ae_dev 
*dev,
ae_handle->phy_dev = vf_cb->mac_cb->phy_dev;
ae_handle->if_support = vf_cb->mac_cb->if_support;
ae_handle->port_type = vf_cb->mac_cb->mac_type;
+   ae_handle->media_type = vf_cb->mac_cb->media_type;
ae_handle->dport_id = port_id;
 
return ae_handle;
diff --git a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.c 
b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.c
index d2effcc..3fb87e2 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.c
+++ b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.c
@@ -733,6 +733,18 @@ static void hns_mac_register_phy(struct hns_mac_cb *mac_cb)
mac_cb->mac_id, addr);
 }
 
+#define MAC_MEDIA_TYPE_MAX_LEN 16
+
+static const struct {
+   enum hnae_media_type value;
+   const char *name;
+} media_type_defs[] = {
+   {HNAE_MEDIA_TYPE_UNKNOWN,   "unknown" },
+   {HNAE_MEDIA_TYPE_FIBER, "fiber" },
+   {HNAE_MEDIA_TYPE_COPPER,"copper" },
+   {HNAE_MEDIA_TYPE_BACKPLANE, "backplane" },
+};
+
 /**
  *hns_mac_get_info  - get mac information from device node
  *@mac_cb: mac device
@@ -744,10 +756,13 @@ static int  hns_mac_get_info(struct hns_mac_cb *mac_cb)
struct device_node *np;
struct regmap *syscon;
struct of_phandle_args cpld_args;
+   const char *media_type;
+   u32 i;
u32 ret;
 
mac_cb->link = false;
mac_cb->half_duplex = false;
+   mac_cb->media_type = HNAE_MEDIA_TYPE_UNKNOWN;
mac_cb->speed = mac_phy_to_speed[mac_cb->phy_if];
mac_cb->max_speed = mac_cb->speed;
 
@@ -849,6 +864,17 @@ static int  hns_mac_get_info(struct hns_mac_cb *mac_cb)
mac_cb->mac_id);
}
 
+   if (!fwnode_property_read_string(mac_cb->fw_port, "media-type",
+_type)) {
+   for (i = 0; i < ARRAY_SIZE(media_type_defs); i++) {
+   if (!strncmp(media_type_defs[i].name, media_type,
+MAC_MEDIA_TYPE_MAX_LEN)) {
+   mac_cb->media_type = media_type_defs[i].value;
+   break;
+   }
+   }
+   }
+
return 0;
 }
 
diff --git a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.h 
b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.h
index 05a6e8f..4cbdf14 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.h
+++ b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.h
@@ -335,6 +335,7 @@ struct hns_mac_cb {
u64 txpkt_for_led;
u64 rxpkt_for_led;
enum hnae_port_type mac_type;
+   enum hnae_media_type media_type;
phy_interface_t phy_if;
enum hnae_loop loop_mode;
 
diff --git a/drivers/net/ethernet/hisilicon/hns/hns_ethtool.c 
b/drivers/net/ethernet/hisilicon/hns/hns_ethtool.c
index a395ca1..ab33487 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_ethtool.c
+++ 

[PATCH net-next 8/9] net: hns: add media-type property for hns

2016-06-27 Thread Yisen Zhuang
From: Kejian Yan 

It is PORT_TP type if the service port is GE mode. It is wrong to
judge the port type by using if it is service port. Adding the media
type to know port type.

Reported-by: Jinchuan Tian 
Signed-off-by: Kejian Yan 
---
 drivers/net/ethernet/hisilicon/hns/hnae.h |  9 
 drivers/net/ethernet/hisilicon/hns/hns_ae_adapt.c |  1 +
 drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.c | 26 +++
 drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.h |  1 +
 drivers/net/ethernet/hisilicon/hns/hns_ethtool.c  | 14 +---
 5 files changed, 48 insertions(+), 3 deletions(-)

diff --git a/drivers/net/ethernet/hisilicon/hns/hnae.h 
b/drivers/net/ethernet/hisilicon/hns/hnae.h
index 3869322..e093cbf 100644
--- a/drivers/net/ethernet/hisilicon/hns/hnae.h
+++ b/drivers/net/ethernet/hisilicon/hns/hnae.h
@@ -363,6 +363,14 @@ enum hnae_port_type {
HNAE_PORT_DEBUG
 };
 
+/* mac media type */
+enum hnae_media_type {
+   HNAE_MEDIA_TYPE_UNKNOWN = 0,
+   HNAE_MEDIA_TYPE_FIBER,
+   HNAE_MEDIA_TYPE_COPPER,
+   HNAE_MEDIA_TYPE_BACKPLANE,
+};
+
 /* This struct defines the operation on the handle.
  *
  * get_handle(): (mandatory)
@@ -525,6 +533,7 @@ struct hnae_handle {
u32 eport_id;
u32 dport_id;   /* v2 tx bd should fill the dport_id */
enum hnae_port_type port_type;
+   enum hnae_media_type media_type;
struct list_head node;/* list to hnae_ae_dev->handle_list */
struct hnae_buf_ops *bops; /* operation for the buffer */
struct hnae_queue **qs;  /* array base of all queues */
diff --git a/drivers/net/ethernet/hisilicon/hns/hns_ae_adapt.c 
b/drivers/net/ethernet/hisilicon/hns/hns_ae_adapt.c
index 835521b..e28d960 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_ae_adapt.c
+++ b/drivers/net/ethernet/hisilicon/hns/hns_ae_adapt.c
@@ -134,6 +134,7 @@ struct hnae_handle *hns_ae_get_handle(struct hnae_ae_dev 
*dev,
ae_handle->phy_dev = vf_cb->mac_cb->phy_dev;
ae_handle->if_support = vf_cb->mac_cb->if_support;
ae_handle->port_type = vf_cb->mac_cb->mac_type;
+   ae_handle->media_type = vf_cb->mac_cb->media_type;
ae_handle->dport_id = port_id;
 
return ae_handle;
diff --git a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.c 
b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.c
index d2effcc..3fb87e2 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.c
+++ b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.c
@@ -733,6 +733,18 @@ static void hns_mac_register_phy(struct hns_mac_cb *mac_cb)
mac_cb->mac_id, addr);
 }
 
+#define MAC_MEDIA_TYPE_MAX_LEN 16
+
+static const struct {
+   enum hnae_media_type value;
+   const char *name;
+} media_type_defs[] = {
+   {HNAE_MEDIA_TYPE_UNKNOWN,   "unknown" },
+   {HNAE_MEDIA_TYPE_FIBER, "fiber" },
+   {HNAE_MEDIA_TYPE_COPPER,"copper" },
+   {HNAE_MEDIA_TYPE_BACKPLANE, "backplane" },
+};
+
 /**
  *hns_mac_get_info  - get mac information from device node
  *@mac_cb: mac device
@@ -744,10 +756,13 @@ static int  hns_mac_get_info(struct hns_mac_cb *mac_cb)
struct device_node *np;
struct regmap *syscon;
struct of_phandle_args cpld_args;
+   const char *media_type;
+   u32 i;
u32 ret;
 
mac_cb->link = false;
mac_cb->half_duplex = false;
+   mac_cb->media_type = HNAE_MEDIA_TYPE_UNKNOWN;
mac_cb->speed = mac_phy_to_speed[mac_cb->phy_if];
mac_cb->max_speed = mac_cb->speed;
 
@@ -849,6 +864,17 @@ static int  hns_mac_get_info(struct hns_mac_cb *mac_cb)
mac_cb->mac_id);
}
 
+   if (!fwnode_property_read_string(mac_cb->fw_port, "media-type",
+_type)) {
+   for (i = 0; i < ARRAY_SIZE(media_type_defs); i++) {
+   if (!strncmp(media_type_defs[i].name, media_type,
+MAC_MEDIA_TYPE_MAX_LEN)) {
+   mac_cb->media_type = media_type_defs[i].value;
+   break;
+   }
+   }
+   }
+
return 0;
 }
 
diff --git a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.h 
b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.h
index 05a6e8f..4cbdf14 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.h
+++ b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.h
@@ -335,6 +335,7 @@ struct hns_mac_cb {
u64 txpkt_for_led;
u64 rxpkt_for_led;
enum hnae_port_type mac_type;
+   enum hnae_media_type media_type;
phy_interface_t phy_if;
enum hnae_loop loop_mode;
 
diff --git a/drivers/net/ethernet/hisilicon/hns/hns_ethtool.c 
b/drivers/net/ethernet/hisilicon/hns/hns_ethtool.c
index a395ca1..ab33487 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_ethtool.c
+++ b/drivers/net/ethernet/hisilicon/hns/hns_ethtool.c
@@ -165,13 +165,21 @@ 

Re: [PATCH net-next 10/19] net: hns: bugfix about pfc pause frame statistics

2016-06-22 Thread Yisen Zhuang


在 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 <huangda...@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 = 
>>>>> 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

> 



Re: [PATCH net-next 10/19] net: hns: bugfix about pfc pause frame statistics

2016-06-22 Thread Yisen Zhuang


在 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 
>>>>
>>>> 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 = 
>>>>> 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

> 



Re: [PATCH net-next 16/19] net: hns: fix bug that alloc skb fail lead to port unavailable

2016-06-21 Thread Yisen Zhuang


在 2016/6/21 21:25, Sergei Shtylyov 写道:
> Hello.
> 
> On 6/21/2016 6:56 AM, Yisen Zhuang wrote:
> 
>> From: Jun He <hjat2...@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 <hjat2...@huawei.com>
>> Signed-off-by: Ding Tianhong <dingtianh...@huawei.com>
>> Signed-off-by: Yisen Zhuang <yisen.zhu...@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
> 
> 
> .
> 



Re: [PATCH net-next 16/19] net: hns: fix bug that alloc skb fail lead to port unavailable

2016-06-21 Thread Yisen Zhuang


在 2016/6/21 21:25, Sergei Shtylyov 写道:
> Hello.
> 
> On 6/21/2016 6:56 AM, Yisen Zhuang wrote:
> 
>> From: Jun He 
>>
>> 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 
>> Signed-off-by: Ding Tianhong 
>> Signed-off-by: Yisen Zhuang 
>> ---
>>  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
> 
> 
> .
> 



Re: [PATCH net-next 10/19] net: hns: bugfix about pfc pause frame statistics

2016-06-21 Thread Yisen Zhuang


在 2016/6/21 18:32, Andy Shevchenko 写道:
> On Tue, 2016-06-21 at 11:56 +0800, Yisen Zhuang wrote:
>> From: Daode Huang <huangda...@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 = >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 [30];
>> +}
>>  
>> +p[13] = hw_stats->tx_pkts;
>>  return [14];
>>  }
> 



Re: [PATCH net-next 10/19] net: hns: bugfix about pfc pause frame statistics

2016-06-21 Thread Yisen Zhuang


在 2016/6/21 18:32, Andy Shevchenko 写道:
> On Tue, 2016-06-21 at 11:56 +0800, Yisen Zhuang wrote:
>> From: Daode Huang 
>>
>> 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 = >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 [30];
>> +}
>>  
>> +p[13] = hw_stats->tx_pkts;
>>  return [14];
>>  }
> 



Re: [PATCH net-next 01/19] net: hns: bug fix of ge reset sequence

2016-06-21 Thread Yisen Zhuang


在 2016/6/21 18:35, Andy Shevchenko 写道:
> On Tue, 2016-06-21 at 11:56 +0800, Yisen Zhuang wrote:
>> From: Qianqian Xie <xieqianq...@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 <yankej...@huawei.com>
>> Signed-off-by: Qianqian Xie <xieqianq...@huawei.com>
>> Signed-off-by: Yisen Zhuang <yisen.zhu...@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,
> 



Re: [PATCH net-next 01/19] net: hns: bug fix of ge reset sequence

2016-06-21 Thread Yisen Zhuang


在 2016/6/21 18:35, Andy Shevchenko 写道:
> On Tue, 2016-06-21 at 11:56 +0800, Yisen Zhuang wrote:
>> From: Qianqian Xie 
>>
>> 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 
>> Signed-off-by: Qianqian Xie 
>> Signed-off-by: Yisen Zhuang 
>> ---
>>  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,
> 



[PATCH net-next 17/19] net: hns: fix sbm default parameters config error

2016-06-20 Thread Yisen Zhuang
From: Daode Huang <huangda...@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 <huangda...@hisilicon.com>
Signed-off-by: Yisen Zhuang <yisen.zhu...@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_CHN6
 #define DSAFV2_SBM_PPE_CHN1
-#define DASFV2_ROCEE_CRD_NUM  8
+#define DASFV2_ROC

[PATCH net-next 19/19] net: hns: bug fix about TSO on|off when there is traffic

2016-06-20 Thread Yisen Zhuang
From: Daode Huang <huangda...@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 <huangda...@hisilicon.com>
Signed-off-by: Yisen Zhuang <yisen.zhu...@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



[PATCH net-next 17/19] net: hns: fix sbm default parameters config error

2016-06-20 Thread Yisen Zhuang
From: Daode Huang 

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 
Signed-off-by: Yisen Zhuang 
---
 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_CHN6
 #define DSAFV2_SBM_PPE_CHN1
-#define DASFV2_ROCEE_CRD_NUM  8
+#define DASFV2_ROCEE_CRD_NUM  1
 
 #define DSAF_VOQ_NUM   DSAF_NODE_NUM
 #define DSAF_INODE_NUM DSAF_NO

[PATCH net-next 19/19] net: hns: bug fix about TSO on|off when there is traffic

2016-06-20 Thread Yisen Zhuang
From: Daode Huang 

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 
Signed-off-by: Yisen Zhuang 
---
 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



[PATCH net-next 06/19] net: hns: fix the error info when dma_set_mask_and_coherent fail

2016-06-20 Thread Yisen Zhuang
From: Qianqian Xie <xieqianq...@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 <xieqianq...@huawei.com>
Signed-off-by: Yisen Zhuang <yisen.zhu...@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



[PATCH net-next 05/19] net: hns: Remove unnecessary device resource free

2016-06-20 Thread Yisen Zhuang
From: Qianqian Xie <xieqianq...@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 <xieqianq...@huawei.com>
Reported-by: Kefeng Wang <wangkefeng.w...@huawei.com>
Signed-off-by: Yisen Zhuang <yisen.zhu...@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



[PATCH net-next 06/19] net: hns: fix the error info when dma_set_mask_and_coherent fail

2016-06-20 Thread Yisen Zhuang
From: Qianqian Xie 

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 
Signed-off-by: Yisen Zhuang 
---
 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



[PATCH net-next 05/19] net: hns: Remove unnecessary device resource free

2016-06-20 Thread Yisen Zhuang
From: Qianqian Xie 

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

Signed-off-by: Qianqian Xie 
Reported-by: Kefeng Wang 
Signed-off-by: Yisen Zhuang 
---
 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



[PATCH net-next 04/19] net: hns: typo fix of annotation info for hns_nic_reset_subtask()

2016-06-20 Thread Yisen Zhuang
From: Qianqian Xie <xieqianq...@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 <xieqianq...@huawei.com>
Signed-off-by: Yisen Zhuang <yisen.zhu...@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



[PATCH net-next 04/19] net: hns: typo fix of annotation info for hns_nic_reset_subtask()

2016-06-20 Thread Yisen Zhuang
From: Qianqian Xie 

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

Signed-off-by: Qianqian Xie 
Signed-off-by: Yisen Zhuang 
---
 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



[PATCH net-next 08/19] net: hns: fix ethtool loopback fail bug

2016-06-20 Thread Yisen Zhuang
From: Kejian Yan <yankej...@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 <hjat2...@huawei.com>
Signed-off-by: Kejian Yan <yankej...@huawei.com>
Signed-off-by: Yisen Zhuang <yisen.zhu...@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



[PATCH net-next 16/19] net: hns: fix bug that alloc skb fail lead to port unavailable

2016-06-20 Thread Yisen Zhuang
From: Jun He <hjat2...@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 <hjat2...@huawei.com>
Signed-off-by: Ding Tianhong <dingtianh...@huawei.com>
Signed-off-by: Yisen Zhuang <yisen.zhu...@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, , );
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



[PATCH net-next 08/19] net: hns: fix ethtool loopback fail bug

2016-06-20 Thread Yisen Zhuang
From: Kejian Yan 

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 
Signed-off-by: Kejian Yan 
Signed-off-by: Yisen Zhuang 
---
 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



[PATCH net-next 16/19] net: hns: fix bug that alloc skb fail lead to port unavailable

2016-06-20 Thread Yisen Zhuang
From: Jun He 

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 
Signed-off-by: Ding Tianhong 
Signed-off-by: Yisen Zhuang 
---
 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, , );
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



[PATCH net-next 14/19] net: hns: delete redundancy ring enable operations

2016-06-20 Thread Yisen Zhuang
From: Daode Huang <huangda...@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 <huangda...@hisilicon.com>
Signed-off-by: Yisen Zhuang <yisen.zhu...@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);
   

[PATCH net-next 02/19] net: hns: fix hns dsaf v1 dont support tx_pause close

2016-06-20 Thread Yisen Zhuang
From: Qianqian Xie <xieqiaq...@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 <xieqiaq...@huawei.com>
Signed-off-by: Yisen Zhuang <yisen.zhu...@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



[PATCH net-next 03/19] net: hns: add skb_reset_mac_header() after skb being alloc

2016-06-20 Thread Yisen Zhuang
From: Kejian Yan <yankej...@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 <yankej...@huawei.com>
Signed-off-by: Yisen Zhuang <yisen.zhu...@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



[PATCH net-next 02/19] net: hns: fix hns dsaf v1 dont support tx_pause close

2016-06-20 Thread Yisen Zhuang
From: Qianqian Xie 

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 
Signed-off-by: Yisen Zhuang 
---
 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



[PATCH net-next 03/19] net: hns: add skb_reset_mac_header() after skb being alloc

2016-06-20 Thread Yisen Zhuang
From: Kejian Yan 

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 
Signed-off-by: Yisen Zhuang 
---
 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



[PATCH net-next 14/19] net: hns: delete redundancy ring enable operations

2016-06-20 Thread Yisen Zhuang
From: Daode Huang 

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 
Signed-off-by: Yisen Zhuang 
---
 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 @@ sta

[PATCH net-next 15/19] net: hns: bug fix about led control logic when link down

2016-06-20 Thread Yisen Zhuang
From: Daode Huang <huangda...@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 <huangda...@hisilicon.com>
Signed-off-by: Yisen Zhuang <yisen.zhu...@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



[PATCH net-next 15/19] net: hns: bug fix about led control logic when link down

2016-06-20 Thread Yisen Zhuang
From: Daode Huang 

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 
Signed-off-by: Yisen Zhuang 
---
 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



[PATCH net-next 18/19] net: hns: change the default coalesce usecs

2016-06-20 Thread Yisen Zhuang
From: Daode Huang <huangda...@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 <huangda...@hisilicon.com>
Signed-off-by: Yisen Zhuang <yisen.zhu...@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_USECS0x3ff
-#define HNS_RCB_DEF_COALESCED_USECS3
+#define HNS_RCB_DEF_COALESCED_USECS50
 
 #define HNS_RCB_COMMON_ENDIAN  1
 
-- 
1.9.1



[PATCH net-next 00/19] net: hns: fix some bugs in hns driver

2016-06-20 Thread Yisen Zhuang
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



[PATCH net-next 18/19] net: hns: change the default coalesce usecs

2016-06-20 Thread Yisen Zhuang
From: Daode Huang 

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 
Signed-off-by: Yisen Zhuang 
---
 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_USECS0x3ff
-#define HNS_RCB_DEF_COALESCED_USECS3
+#define HNS_RCB_DEF_COALESCED_USECS50
 
 #define HNS_RCB_COMMON_ENDIAN  1
 
-- 
1.9.1



[PATCH net-next 00/19] net: hns: fix some bugs in hns driver

2016-06-20 Thread Yisen Zhuang
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



[PATCH net-next 01/19] net: hns: bug fix of ge reset sequence

2016-06-20 Thread Yisen Zhuang
From: Qianqian Xie <xieqianq...@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 <yankej...@huawei.com>
Signed-off-by: Qianqian Xie <xieqianq...@huawei.com>
Signed-off-by: Yisen Zhuang <yisen.zhu...@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



[PATCH net-next 10/19] net: hns: bugfix about pfc pause frame statistics

2016-06-20 Thread Yisen Zhuang
From: Daode Huang <huangda...@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 <huangda...@hisilicon.com>
Signed-off-by: Yisen Zhuang <yisen.zhu...@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
= _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] = 0x;
 }
 
-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)
   

  1   2   3   >