[OpenWrt-Devel] [PATCH] ralink: add support for mt7621 switch counters
John Crispin
blogic at openwrt.org
Fri May 22 10:02:39 EDT 2015
Hi,
instead of adding an extra parameter to mt7530_probe() use this macro
instead -> IS_ENABLED(CONFIG_SOC_MT7621)
John
On 14/05/2015 17:14, Cristian Morales Vega wrote:
> Signed-off-by: Cristian Morales Vega <cristian at samknows.com>
> ---
> .../drivers/net/ethernet/ralink/gsw_mt7620a.c | 8 +-
> .../files/drivers/net/ethernet/ralink/mt7530.c | 197 ++++++++++++++++++++-
> .../files/drivers/net/ethernet/ralink/mt7530.h | 3 +-
> 3 files changed, 199 insertions(+), 9 deletions(-)
>
> diff --git a/target/linux/ramips/files/drivers/net/ethernet/ralink/gsw_mt7620a.c b/target/linux/ramips/files/drivers/net/ethernet/ralink/gsw_mt7620a.c
> index 8039704..257a9c5 100644
> --- a/target/linux/ramips/files/drivers/net/ethernet/ralink/gsw_mt7620a.c
> +++ b/target/linux/ramips/files/drivers/net/ethernet/ralink/gsw_mt7620a.c
> @@ -728,10 +728,10 @@ int mt7620_gsw_config(struct fe_priv *priv)
>
> /* is the mt7530 internal or external */
> if (priv->mii_bus && priv->mii_bus->phy_map[0x1f]) {
> - mt7530_probe(priv->device, gsw->base, NULL, 0);
> - mt7530_probe(priv->device, NULL, priv->mii_bus, 1);
> + mt7530_probe(priv->device, gsw->base, NULL, 0, 0);
> + mt7530_probe(priv->device, NULL, priv->mii_bus, 1, 0);
> } else {
> - mt7530_probe(priv->device, gsw->base, NULL, 1);
> + mt7530_probe(priv->device, gsw->base, NULL, 1, 0);
> }
>
> return 0;
> @@ -740,7 +740,7 @@ int mt7620_gsw_config(struct fe_priv *priv)
> int mt7621_gsw_config(struct fe_priv *priv)
> {
> if (priv->mii_bus && priv->mii_bus->phy_map[0x1f])
> - mt7530_probe(priv->device, NULL, priv->mii_bus, 1);
> + mt7530_probe(priv->device, NULL, priv->mii_bus, 1, 1);
>
> return 0;
> }
> diff --git a/target/linux/ramips/files/drivers/net/ethernet/ralink/mt7530.c b/target/linux/ramips/files/drivers/net/ethernet/ralink/mt7530.c
> index 1352b25..cacf19e 100644
> --- a/target/linux/ramips/files/drivers/net/ethernet/ralink/mt7530.c
> +++ b/target/linux/ramips/files/drivers/net/ethernet/ralink/mt7530.c
> @@ -63,6 +63,107 @@ enum {
>
> #define REG_HWTRAP 0x7804
>
> +#define MIB_DESC(_s , _o, _n) \
> + { \
> + .size = (_s), \
> + .offset = (_o), \
> + .name = (_n), \
> + }
> +
> +struct mt7xxx_mib_desc {
> + unsigned int size;
> + unsigned int offset;
> + const char *name;
> +};
> +
> +#define MT7621_MIB_COUNTER_BASE 0x4000
> +#define MT7621_MIB_COUNTER_PORT_OFFSET 0x100
> +#define MT7621_STATS_TDPC 0x00
> +#define MT7621_STATS_TCRC 0x04
> +#define MT7621_STATS_TUPC 0x08
> +#define MT7621_STATS_TMPC 0x0C
> +#define MT7621_STATS_TBPC 0x10
> +#define MT7621_STATS_TCEC 0x14
> +#define MT7621_STATS_TSCEC 0x18
> +#define MT7621_STATS_TMCEC 0x1C
> +#define MT7621_STATS_TDEC 0x20
> +#define MT7621_STATS_TLCEC 0x24
> +#define MT7621_STATS_TXCEC 0x28
> +#define MT7621_STATS_TPPC 0x2C
> +#define MT7621_STATS_TL64PC 0x30
> +#define MT7621_STATS_TL65PC 0x34
> +#define MT7621_STATS_TL128PC 0x38
> +#define MT7621_STATS_TL256PC 0x3C
> +#define MT7621_STATS_TL512PC 0x40
> +#define MT7621_STATS_TL1024PC 0x44
> +#define MT7621_STATS_TOC 0x48
> +#define MT7621_STATS_RDPC 0x60
> +#define MT7621_STATS_RFPC 0x64
> +#define MT7621_STATS_RUPC 0x68
> +#define MT7621_STATS_RMPC 0x6C
> +#define MT7621_STATS_RBPC 0x70
> +#define MT7621_STATS_RAEPC 0x74
> +#define MT7621_STATS_RCEPC 0x78
> +#define MT7621_STATS_RUSPC 0x7C
> +#define MT7621_STATS_RFEPC 0x80
> +#define MT7621_STATS_ROSPC 0x84
> +#define MT7621_STATS_RJEPC 0x88
> +#define MT7621_STATS_RPPC 0x8C
> +#define MT7621_STATS_RL64PC 0x90
> +#define MT7621_STATS_RL65PC 0x94
> +#define MT7621_STATS_RL128PC 0x98
> +#define MT7621_STATS_RL256PC 0x9C
> +#define MT7621_STATS_RL512PC 0xA0
> +#define MT7621_STATS_RL1024PC 0xA4
> +#define MT7621_STATS_ROC 0xA8
> +#define MT7621_STATS_RDPC_CTRL 0xB0
> +#define MT7621_STATS_RDPC_ING 0xB4
> +#define MT7621_STATS_RDPC_ARL 0xB8
> +
> +static const struct mt7xxx_mib_desc mt7621_mibs[] = {
> + MIB_DESC(1, MT7621_STATS_TDPC, "TxDrop"),
> + MIB_DESC(1, MT7621_STATS_TCRC, "TxCRC"),
> + MIB_DESC(1, MT7621_STATS_TUPC, "TxUni"),
> + MIB_DESC(1, MT7621_STATS_TMPC, "TxMulti"),
> + MIB_DESC(1, MT7621_STATS_TBPC, "TxBroad"),
> + MIB_DESC(1, MT7621_STATS_TCEC, "TxCollision"),
> + MIB_DESC(1, MT7621_STATS_TSCEC, "TxSingleCol"),
> + MIB_DESC(1, MT7621_STATS_TMCEC, "TxMultiCol"),
> + MIB_DESC(1, MT7621_STATS_TDEC, "TxDefer"),
> + MIB_DESC(1, MT7621_STATS_TLCEC, "TxLateCol"),
> + MIB_DESC(1, MT7621_STATS_TXCEC, "TxExcCol"),
> + MIB_DESC(1, MT7621_STATS_TPPC, "TxPause"),
> + MIB_DESC(1, MT7621_STATS_TL64PC, "Tx64Byte"),
> + MIB_DESC(1, MT7621_STATS_TL65PC, "Tx65Byte"),
> + MIB_DESC(1, MT7621_STATS_TL128PC, "Tx128Byte"),
> + MIB_DESC(1, MT7621_STATS_TL256PC, "Tx256Byte"),
> + MIB_DESC(1, MT7621_STATS_TL512PC, "Tx512Byte"),
> + MIB_DESC(1, MT7621_STATS_TL1024PC, "Tx1024Byte"),
> + MIB_DESC(2, MT7621_STATS_TOC, "TxByte"),
> + MIB_DESC(1, MT7621_STATS_RDPC, "RxDrop"),
> + MIB_DESC(1, MT7621_STATS_RFPC, "RxFiltered"),
> + MIB_DESC(1, MT7621_STATS_RUPC, "RxUni"),
> + MIB_DESC(1, MT7621_STATS_RMPC, "RxMulti"),
> + MIB_DESC(1, MT7621_STATS_RBPC, "RxBroad"),
> + MIB_DESC(1, MT7621_STATS_RAEPC, "RxAlignErr"),
> + MIB_DESC(1, MT7621_STATS_RCEPC, "RxCRC"),
> + MIB_DESC(1, MT7621_STATS_RUSPC, "RxUnderSize"),
> + MIB_DESC(1, MT7621_STATS_RFEPC, "RxFragment"),
> + MIB_DESC(1, MT7621_STATS_ROSPC, "RxOverSize"),
> + MIB_DESC(1, MT7621_STATS_RJEPC, "RxJabber"),
> + MIB_DESC(1, MT7621_STATS_RPPC, "RxPause"),
> + MIB_DESC(1, MT7621_STATS_RL64PC, "Rx64Byte"),
> + MIB_DESC(1, MT7621_STATS_RL65PC, "Rx65Byte"),
> + MIB_DESC(1, MT7621_STATS_RL128PC, "Rx128Byte"),
> + MIB_DESC(1, MT7621_STATS_RL256PC, "Rx256Byte"),
> + MIB_DESC(1, MT7621_STATS_RL512PC, "Rx512Byte"),
> + MIB_DESC(1, MT7621_STATS_RL1024PC, "Rx1024Byte"),
> + MIB_DESC(2, MT7621_STATS_ROC, "RxByte"),
> + MIB_DESC(1, MT7621_STATS_RDPC_CTRL, "RxCtrlDrop"),
> + MIB_DESC(1, MT7621_STATS_RDPC_ING, "RxIngDrop"),
> + MIB_DESC(1, MT7621_STATS_RDPC_ARL, "RxARLDrop")
> +};
> +
> enum {
> /* Global attributes. */
> MT7530_ATTR_ENABLE_VLAN,
> @@ -500,6 +601,63 @@ static const struct switch_attr mt7530_global[] = {
> },
> };
>
> +static u64 get_mib_counter(struct mt7530_priv *priv, int i, int port)
> +{
> + unsigned int port_base;
> + u64 t;
> +
> + port_base = MT7621_MIB_COUNTER_BASE +
> + MT7621_MIB_COUNTER_PORT_OFFSET * port;
> +
> + t = mt7530_r32(priv, port_base + mt7621_mibs[i].offset);
> + if (mt7621_mibs[i].size == 2) {
> + u64 hi;
> +
> + hi = mt7530_r32(priv, port_base + mt7621_mibs[i].offset + 4);
> + t |= hi << 32;
> + }
> +
> + return t;
> +}
> +
> +static int mt7621_sw_get_port_mib(struct switch_dev *dev,
> + const struct switch_attr *attr,
> + struct switch_val *val)
> +{
> + static char buf[4096];
> + struct mt7530_priv *priv = container_of(dev, struct mt7530_priv, swdev);
> + int i, len = 0;
> +
> + if (val->port_vlan >= MT7530_NUM_PORTS)
> + return -EINVAL;
> +
> + len += snprintf(buf + len, sizeof(buf) - len,
> + "Port %d MIB counters\n", val->port_vlan);
> +
> + for (i = 0; i < sizeof(mt7621_mibs) / sizeof(*mt7621_mibs); ++i) {
> + u64 counter;
> + len += snprintf(buf + len, sizeof(buf) - len,
> + "%-11s: ", mt7621_mibs[i].name);
> + counter = get_mib_counter(priv, i, val->port_vlan);
> + len += snprintf(buf + len, sizeof(buf) - len, "%llu\n",
> + counter);
> + }
> +
> + val->value.s = buf;
> + val->len = len;
> + return 0;
> +}
> +
> +static const struct switch_attr mt7621_port[] = {
> + {
> + .type = SWITCH_TYPE_STRING,
> + .name = "mib",
> + .description = "Get MIB counters for port",
> + .get = mt7621_sw_get_port_mib,
> + .set = NULL,
> + },
> +};
> +
> static const struct switch_attr mt7530_port[] = {
> };
>
> @@ -514,6 +672,28 @@ static const struct switch_attr mt7530_vlan[] = {
> },
> };
>
> +static const struct switch_dev_ops mt7621_ops = {
> + .attr_global = {
> + .attr = mt7530_global,
> + .n_attr = ARRAY_SIZE(mt7530_global),
> + },
> + .attr_port = {
> + .attr = mt7621_port,
> + .n_attr = ARRAY_SIZE(mt7621_port),
> + },
> + .attr_vlan = {
> + .attr = mt7530_vlan,
> + .n_attr = ARRAY_SIZE(mt7530_vlan),
> + },
> + .get_vlan_ports = mt7530_get_vlan_ports,
> + .set_vlan_ports = mt7530_set_vlan_ports,
> + .get_port_pvid = mt7530_get_port_pvid,
> + .set_port_pvid = mt7530_set_port_pvid,
> + .get_port_link = mt7530_get_port_link,
> + .apply_config = mt7530_apply_config,
> + .reset_switch = mt7530_reset_switch,
> +};
> +
> static const struct switch_dev_ops mt7530_ops = {
> .attr_global = {
> .attr = mt7530_global,
> @@ -537,7 +717,8 @@ static const struct switch_dev_ops mt7530_ops = {
> };
>
> int
> -mt7530_probe(struct device *dev, void __iomem *base, struct mii_bus *bus, int vlan)
> +mt7530_probe(struct device *dev, void __iomem *base, struct mii_bus *bus,
> + int vlan, bool is_mt7621)
> {
> struct switch_dev *swdev;
> struct mt7530_priv *mt7530;
> @@ -557,13 +738,21 @@ mt7530_probe(struct device *dev, void __iomem *base, struct mii_bus *bus, int vl
> swdev->alias = "mt7530";
> swdev->name = "mt7530";
> } else {
> - swdev->alias = "mt7620";
> - swdev->name = "mt7620";
> + if (is_mt7621) {
> + swdev->alias = "mt7621";
> + swdev->name = "mt7621";
> + } else {
> + swdev->alias = "mt7620";
> + swdev->name = "mt7620";
> + }
> }
> swdev->cpu_port = MT7530_CPU_PORT;
> swdev->ports = MT7530_NUM_PORTS;
> swdev->vlans = MT7530_NUM_VLANS;
> - swdev->ops = &mt7530_ops;
> + if (is_mt7621)
> + swdev->ops = &mt7621_ops;
> + else
> + swdev->ops = &mt7530_ops;
>
> ret = register_switch(swdev, NULL);
> if (ret) {
> diff --git a/target/linux/ramips/files/drivers/net/ethernet/ralink/mt7530.h b/target/linux/ramips/files/drivers/net/ethernet/ralink/mt7530.h
> index 1fc8c62..d62b300 100644
> --- a/target/linux/ramips/files/drivers/net/ethernet/ralink/mt7530.h
> +++ b/target/linux/ramips/files/drivers/net/ethernet/ralink/mt7530.h
> @@ -15,6 +15,7 @@
> #ifndef _MT7530_H__
> #define _MT7530_H__
>
> -int mt7530_probe(struct device *dev, void __iomem *base, struct mii_bus *bus, int vlan);
> +int mt7530_probe(struct device *dev, void __iomem *base, struct mii_bus *bus,
> + int vlan, bool is_mt7621);
>
> #endif
>
_______________________________________________
openwrt-devel mailing list
openwrt-devel at lists.openwrt.org
https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-devel
More information about the openwrt-devel
mailing list