aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDoug Berger <opendmb@gmail.com>2017-03-09 19:58:43 -0500
committerDavid S. Miller <davem@davemloft.net>2017-03-09 21:39:01 -0500
commitffff71328a3c321f7c14cc1edd33577717037744 (patch)
tree06ed31c7750efdb558bb026abd7b24b3cab79000
parentd7aba644ffdebf756e51e26a2229055211838e89 (diff)
net: bcmgenet: correct the RBUF_OVFL_CNT and RBUF_ERR_CNT MIB values
The location of the RBUF overflow and error counters has moved between different version of the GENET MAC. This commit corrects the driver to read from the correct locations depending on the version of the GENET MAC. Fixes: 1c1008c793fa ("net: bcmgenet: add main driver file") Signed-off-by: Doug Berger <opendmb@gmail.com> Reviewed-by: Florian Fainelli <f.fainelli@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/ethernet/broadcom/genet/bcmgenet.c60
-rw-r--r--drivers/net/ethernet/broadcom/genet/bcmgenet.h10
2 files changed, 60 insertions, 10 deletions
diff --git a/drivers/net/ethernet/broadcom/genet/bcmgenet.c b/drivers/net/ethernet/broadcom/genet/bcmgenet.c
index f92896835d2a..f0fb7eca8eb4 100644
--- a/drivers/net/ethernet/broadcom/genet/bcmgenet.c
+++ b/drivers/net/ethernet/broadcom/genet/bcmgenet.c
@@ -1,7 +1,7 @@
1/* 1/*
2 * Broadcom GENET (Gigabit Ethernet) controller driver 2 * Broadcom GENET (Gigabit Ethernet) controller driver
3 * 3 *
4 * Copyright (c) 2014 Broadcom Corporation 4 * Copyright (c) 2014-2017 Broadcom
5 * 5 *
6 * This program is free software; you can redistribute it and/or modify 6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License version 2 as 7 * it under the terms of the GNU General Public License version 2 as
@@ -778,8 +778,9 @@ static const struct bcmgenet_stats bcmgenet_gstrings_stats[] = {
778 STAT_GENET_RUNT("rx_runt_bytes", mib.rx_runt_bytes), 778 STAT_GENET_RUNT("rx_runt_bytes", mib.rx_runt_bytes),
779 /* Misc UniMAC counters */ 779 /* Misc UniMAC counters */
780 STAT_GENET_MISC("rbuf_ovflow_cnt", mib.rbuf_ovflow_cnt, 780 STAT_GENET_MISC("rbuf_ovflow_cnt", mib.rbuf_ovflow_cnt,
781 UMAC_RBUF_OVFL_CNT), 781 UMAC_RBUF_OVFL_CNT_V1),
782 STAT_GENET_MISC("rbuf_err_cnt", mib.rbuf_err_cnt, UMAC_RBUF_ERR_CNT), 782 STAT_GENET_MISC("rbuf_err_cnt", mib.rbuf_err_cnt,
783 UMAC_RBUF_ERR_CNT_V1),
783 STAT_GENET_MISC("mdf_err_cnt", mib.mdf_err_cnt, UMAC_MDF_ERR_CNT), 784 STAT_GENET_MISC("mdf_err_cnt", mib.mdf_err_cnt, UMAC_MDF_ERR_CNT),
784 STAT_GENET_SOFT_MIB("alloc_rx_buff_failed", mib.alloc_rx_buff_failed), 785 STAT_GENET_SOFT_MIB("alloc_rx_buff_failed", mib.alloc_rx_buff_failed),
785 STAT_GENET_SOFT_MIB("rx_dma_failed", mib.rx_dma_failed), 786 STAT_GENET_SOFT_MIB("rx_dma_failed", mib.rx_dma_failed),
@@ -821,6 +822,45 @@ static void bcmgenet_get_strings(struct net_device *dev, u32 stringset,
821 } 822 }
822} 823}
823 824
825static u32 bcmgenet_update_stat_misc(struct bcmgenet_priv *priv, u16 offset)
826{
827 u16 new_offset;
828 u32 val;
829
830 switch (offset) {
831 case UMAC_RBUF_OVFL_CNT_V1:
832 if (GENET_IS_V2(priv))
833 new_offset = RBUF_OVFL_CNT_V2;
834 else
835 new_offset = RBUF_OVFL_CNT_V3PLUS;
836
837 val = bcmgenet_rbuf_readl(priv, new_offset);
838 /* clear if overflowed */
839 if (val == ~0)
840 bcmgenet_rbuf_writel(priv, 0, new_offset);
841 break;
842 case UMAC_RBUF_ERR_CNT_V1:
843 if (GENET_IS_V2(priv))
844 new_offset = RBUF_ERR_CNT_V2;
845 else
846 new_offset = RBUF_ERR_CNT_V3PLUS;
847
848 val = bcmgenet_rbuf_readl(priv, new_offset);
849 /* clear if overflowed */
850 if (val == ~0)
851 bcmgenet_rbuf_writel(priv, 0, new_offset);
852 break;
853 default:
854 val = bcmgenet_umac_readl(priv, offset);
855 /* clear if overflowed */
856 if (val == ~0)
857 bcmgenet_umac_writel(priv, 0, offset);
858 break;
859 }
860
861 return val;
862}
863
824static void bcmgenet_update_mib_counters(struct bcmgenet_priv *priv) 864static void bcmgenet_update_mib_counters(struct bcmgenet_priv *priv)
825{ 865{
826 int i, j = 0; 866 int i, j = 0;
@@ -845,10 +885,16 @@ static void bcmgenet_update_mib_counters(struct bcmgenet_priv *priv)
845 UMAC_MIB_START + j + offset); 885 UMAC_MIB_START + j + offset);
846 break; 886 break;
847 case BCMGENET_STAT_MISC: 887 case BCMGENET_STAT_MISC:
848 val = bcmgenet_umac_readl(priv, s->reg_offset); 888 if (GENET_IS_V1(priv)) {
849 /* clear if overflowed */ 889 val = bcmgenet_umac_readl(priv, s->reg_offset);
850 if (val == ~0) 890 /* clear if overflowed */
851 bcmgenet_umac_writel(priv, 0, s->reg_offset); 891 if (val == ~0)
892 bcmgenet_umac_writel(priv, 0,
893 s->reg_offset);
894 } else {
895 val = bcmgenet_update_stat_misc(priv,
896 s->reg_offset);
897 }
852 break; 898 break;
853 } 899 }
854 900
diff --git a/drivers/net/ethernet/broadcom/genet/bcmgenet.h b/drivers/net/ethernet/broadcom/genet/bcmgenet.h
index 1e2dc34d331a..d5fb0d772dcd 100644
--- a/drivers/net/ethernet/broadcom/genet/bcmgenet.h
+++ b/drivers/net/ethernet/broadcom/genet/bcmgenet.h
@@ -1,5 +1,5 @@
1/* 1/*
2 * Copyright (c) 2014 Broadcom Corporation 2 * Copyright (c) 2014-2017 Broadcom
3 * 3 *
4 * This program is free software; you can redistribute it and/or modify 4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License version 2 as 5 * it under the terms of the GNU General Public License version 2 as
@@ -214,7 +214,9 @@ struct bcmgenet_mib_counters {
214#define MDIO_REG_SHIFT 16 214#define MDIO_REG_SHIFT 16
215#define MDIO_REG_MASK 0x1F 215#define MDIO_REG_MASK 0x1F
216 216
217#define UMAC_RBUF_OVFL_CNT 0x61C 217#define UMAC_RBUF_OVFL_CNT_V1 0x61C
218#define RBUF_OVFL_CNT_V2 0x80
219#define RBUF_OVFL_CNT_V3PLUS 0x94
218 220
219#define UMAC_MPD_CTRL 0x620 221#define UMAC_MPD_CTRL 0x620
220#define MPD_EN (1 << 0) 222#define MPD_EN (1 << 0)
@@ -224,7 +226,9 @@ struct bcmgenet_mib_counters {
224 226
225#define UMAC_MPD_PW_MS 0x624 227#define UMAC_MPD_PW_MS 0x624
226#define UMAC_MPD_PW_LS 0x628 228#define UMAC_MPD_PW_LS 0x628
227#define UMAC_RBUF_ERR_CNT 0x634 229#define UMAC_RBUF_ERR_CNT_V1 0x634
230#define RBUF_ERR_CNT_V2 0x84
231#define RBUF_ERR_CNT_V3PLUS 0x98
228#define UMAC_MDF_ERR_CNT 0x638 232#define UMAC_MDF_ERR_CNT 0x638
229#define UMAC_MDF_CTRL 0x650 233#define UMAC_MDF_CTRL 0x650
230#define UMAC_MDF_ADDR 0x654 234#define UMAC_MDF_ADDR 0x654