Message ID | 1431616464-22954-1-git-send-email-cristian@samknows.com |
---|---|
State | Changes Requested |
Headers | show |
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@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 >
I don't really have any experience with kernel development. But shouldn't "IS_ENABLED(CONFIG_SOC_MT7621)" be used only for *additional* stuff? I mean, the driver built with CONFIG_SOC_MT7621 shouldn't continue working with a MT7620? (as stupid as that situation would be). From a quick look into the MT7620 datasheet (I don't have one to test) at the very least it has the counters mapped to different addresses, so it would break. Anyway, I will submit a new patch later. On 22 May 2015 at 15:02, John Crispin <blogic@openwrt.org> wrote: > 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@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@lists.openwrt.org > https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-devel
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
Signed-off-by: Cristian Morales Vega <cristian@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(-)