generic: provide get_port_stats() on rtl836x switches
This patch provides a generic switch_dev_ops 'get_port_stats()' callback by taping into the relevant port MIB counters. This callback is used by swconfig_leds led trigger to blink LEDs with port network traffic. Signed-off-by: Thibaut VARENE <hacks@slashdirt.org>
This commit is contained in:
parent
3056d09b40
commit
0369e35891
6 changed files with 74 additions and 0 deletions
|
@ -1030,6 +1030,33 @@ int rtl8366_sw_get_port_mib(struct switch_dev *dev,
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(rtl8366_sw_get_port_mib);
|
EXPORT_SYMBOL_GPL(rtl8366_sw_get_port_mib);
|
||||||
|
|
||||||
|
int rtl8366_sw_get_port_stats(struct switch_dev *dev, int port,
|
||||||
|
struct switch_port_stats *stats,
|
||||||
|
int txb_id, int rxb_id)
|
||||||
|
{
|
||||||
|
struct rtl8366_smi *smi = sw_to_rtl8366_smi(dev);
|
||||||
|
unsigned long long counter = 0;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
if (port >= smi->num_ports)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
ret = smi->ops->get_mib_counter(smi, txb_id, port, &counter);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
stats->tx_bytes = counter;
|
||||||
|
|
||||||
|
ret = smi->ops->get_mib_counter(smi, rxb_id, port, &counter);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
stats->rx_bytes = counter;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(rtl8366_sw_get_port_stats);
|
||||||
|
|
||||||
int rtl8366_sw_get_vlan_info(struct switch_dev *dev,
|
int rtl8366_sw_get_vlan_info(struct switch_dev *dev,
|
||||||
const struct switch_attr *attr,
|
const struct switch_attr *attr,
|
||||||
struct switch_val *val)
|
struct switch_val *val)
|
||||||
|
|
|
@ -146,6 +146,9 @@ int rtl8366_sw_get_vlan_enable(struct switch_dev *dev,
|
||||||
int rtl8366_sw_set_vlan_enable(struct switch_dev *dev,
|
int rtl8366_sw_set_vlan_enable(struct switch_dev *dev,
|
||||||
const struct switch_attr *attr,
|
const struct switch_attr *attr,
|
||||||
struct switch_val *val);
|
struct switch_val *val);
|
||||||
|
int rtl8366_sw_get_port_stats(struct switch_dev *dev, int port,
|
||||||
|
struct switch_port_stats *stats,
|
||||||
|
int txb_id, int rxb_id);
|
||||||
|
|
||||||
struct rtl8366_smi* rtl8366_smi_probe(struct platform_device *pdev);
|
struct rtl8366_smi* rtl8366_smi_probe(struct platform_device *pdev);
|
||||||
|
|
||||||
|
|
|
@ -205,6 +205,9 @@
|
||||||
#define RTL8366RB_QOS_DEFAULT_PREIFG 1
|
#define RTL8366RB_QOS_DEFAULT_PREIFG 1
|
||||||
|
|
||||||
|
|
||||||
|
#define RTL8366RB_MIB_RXB_ID 0 /* IfInOctets */
|
||||||
|
#define RTL8366RB_MIB_TXB_ID 20 /* IfOutOctets */
|
||||||
|
|
||||||
static struct rtl8366_mib_counter rtl8366rb_mib_counters[] = {
|
static struct rtl8366_mib_counter rtl8366rb_mib_counters[] = {
|
||||||
{ 0, 0, 4, "IfInOctets" },
|
{ 0, 0, 4, "IfInOctets" },
|
||||||
{ 0, 4, 4, "EtherStatsOctets" },
|
{ 0, 4, 4, "EtherStatsOctets" },
|
||||||
|
@ -1146,6 +1149,13 @@ static int rtl8366rb_sw_reset_port_mibs(struct switch_dev *dev,
|
||||||
RTL8366RB_MIB_CTRL_PORT_RESET(val->port_vlan));
|
RTL8366RB_MIB_CTRL_PORT_RESET(val->port_vlan));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int rtl8366rb_sw_get_port_stats(struct switch_dev *dev, int port,
|
||||||
|
struct switch_port_stats *stats)
|
||||||
|
{
|
||||||
|
return (rtl8366_sw_get_port_stats(dev, port, stats,
|
||||||
|
RTL8366RB_MIB_TXB_ID, RTL8366RB_MIB_RXB_ID));
|
||||||
|
}
|
||||||
|
|
||||||
static struct switch_attr rtl8366rb_globals[] = {
|
static struct switch_attr rtl8366rb_globals[] = {
|
||||||
{
|
{
|
||||||
.type = SWITCH_TYPE_INT,
|
.type = SWITCH_TYPE_INT,
|
||||||
|
@ -1317,6 +1327,7 @@ static const struct switch_dev_ops rtl8366_ops = {
|
||||||
.set_port_pvid = rtl8366_sw_set_port_pvid,
|
.set_port_pvid = rtl8366_sw_set_port_pvid,
|
||||||
.reset_switch = rtl8366_sw_reset_switch,
|
.reset_switch = rtl8366_sw_reset_switch,
|
||||||
.get_port_link = rtl8366rb_sw_get_port_link,
|
.get_port_link = rtl8366rb_sw_get_port_link,
|
||||||
|
.get_port_stats = rtl8366rb_sw_get_port_stats,
|
||||||
};
|
};
|
||||||
|
|
||||||
static int rtl8366rb_switch_init(struct rtl8366_smi *smi)
|
static int rtl8366rb_switch_init(struct rtl8366_smi *smi)
|
||||||
|
|
|
@ -181,6 +181,9 @@
|
||||||
#define RTL8366S_VLAN_FID_SHIFT 12
|
#define RTL8366S_VLAN_FID_SHIFT 12
|
||||||
#define RTL8366S_VLAN_FID_MASK 0x7
|
#define RTL8366S_VLAN_FID_MASK 0x7
|
||||||
|
|
||||||
|
#define RTL8366S_MIB_RXB_ID 0 /* IfInOctets */
|
||||||
|
#define RTL8366S_MIB_TXB_ID 20 /* IfOutOctets */
|
||||||
|
|
||||||
static struct rtl8366_mib_counter rtl8366s_mib_counters[] = {
|
static struct rtl8366_mib_counter rtl8366s_mib_counters[] = {
|
||||||
{ 0, 0, 4, "IfInOctets" },
|
{ 0, 0, 4, "IfInOctets" },
|
||||||
{ 0, 4, 4, "EtherStatsOctets" },
|
{ 0, 4, 4, "EtherStatsOctets" },
|
||||||
|
@ -982,6 +985,13 @@ static int rtl8366s_sw_reset_port_mibs(struct switch_dev *dev,
|
||||||
0, (1 << (val->port_vlan + 3)));
|
0, (1 << (val->port_vlan + 3)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int rtl8366s_sw_get_port_stats(struct switch_dev *dev, int port,
|
||||||
|
struct switch_port_stats *stats)
|
||||||
|
{
|
||||||
|
return (rtl8366_sw_get_port_stats(dev, port, stats,
|
||||||
|
RTL8366S_MIB_TXB_ID, RTL8366S_MIB_RXB_ID));
|
||||||
|
}
|
||||||
|
|
||||||
static struct switch_attr rtl8366s_globals[] = {
|
static struct switch_attr rtl8366s_globals[] = {
|
||||||
{
|
{
|
||||||
.type = SWITCH_TYPE_INT,
|
.type = SWITCH_TYPE_INT,
|
||||||
|
@ -1105,6 +1115,7 @@ static const struct switch_dev_ops rtl8366_ops = {
|
||||||
.set_port_pvid = rtl8366_sw_set_port_pvid,
|
.set_port_pvid = rtl8366_sw_set_port_pvid,
|
||||||
.reset_switch = rtl8366_sw_reset_switch,
|
.reset_switch = rtl8366_sw_reset_switch,
|
||||||
.get_port_link = rtl8366s_sw_get_port_link,
|
.get_port_link = rtl8366s_sw_get_port_link,
|
||||||
|
.get_port_stats = rtl8366s_sw_get_port_stats,
|
||||||
};
|
};
|
||||||
|
|
||||||
static int rtl8366s_switch_init(struct rtl8366_smi *smi)
|
static int rtl8366s_switch_init(struct rtl8366_smi *smi)
|
||||||
|
|
|
@ -253,6 +253,9 @@ struct rtl8367_initval {
|
||||||
u16 val;
|
u16 val;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#define RTL8367_MIB_RXB_ID 0 /* IfInOctets */
|
||||||
|
#define RTL8367_MIB_TXB_ID 20 /* IfOutOctets */
|
||||||
|
|
||||||
static struct rtl8366_mib_counter rtl8367_mib_counters[] = {
|
static struct rtl8366_mib_counter rtl8367_mib_counters[] = {
|
||||||
{ 0, 0, 4, "IfInOctets" },
|
{ 0, 0, 4, "IfInOctets" },
|
||||||
{ 0, 4, 2, "Dot3StatsFCSErrors" },
|
{ 0, 4, 2, "Dot3StatsFCSErrors" },
|
||||||
|
@ -1535,6 +1538,13 @@ static int rtl8367_sw_reset_port_mibs(struct switch_dev *dev,
|
||||||
RTL8367_MIB_CTRL_PORT_RESET_MASK(port % 8));
|
RTL8367_MIB_CTRL_PORT_RESET_MASK(port % 8));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int rtl8367_sw_get_port_stats(struct switch_dev *dev, int port,
|
||||||
|
struct switch_port_stats *stats)
|
||||||
|
{
|
||||||
|
return (rtl8366_sw_get_port_stats(dev, port, stats,
|
||||||
|
RTL8367_MIB_TXB_ID, RTL8367_MIB_RXB_ID));
|
||||||
|
}
|
||||||
|
|
||||||
static struct switch_attr rtl8367_globals[] = {
|
static struct switch_attr rtl8367_globals[] = {
|
||||||
{
|
{
|
||||||
.type = SWITCH_TYPE_INT,
|
.type = SWITCH_TYPE_INT,
|
||||||
|
@ -1622,6 +1632,7 @@ static const struct switch_dev_ops rtl8367_sw_ops = {
|
||||||
.set_port_pvid = rtl8366_sw_set_port_pvid,
|
.set_port_pvid = rtl8366_sw_set_port_pvid,
|
||||||
.reset_switch = rtl8366_sw_reset_switch,
|
.reset_switch = rtl8366_sw_reset_switch,
|
||||||
.get_port_link = rtl8367_sw_get_port_link,
|
.get_port_link = rtl8367_sw_get_port_link,
|
||||||
|
.get_port_stats = rtl8367_sw_get_port_stats,
|
||||||
};
|
};
|
||||||
|
|
||||||
static int rtl8367_switch_init(struct rtl8366_smi *smi)
|
static int rtl8367_switch_init(struct rtl8366_smi *smi)
|
||||||
|
|
|
@ -235,6 +235,9 @@ struct rtl8367b_initval {
|
||||||
u16 val;
|
u16 val;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#define RTL8367B_MIB_RXB_ID 0 /* IfInOctets */
|
||||||
|
#define RTL8367B_MIB_TXB_ID 28 /* IfOutOctets */
|
||||||
|
|
||||||
static struct rtl8366_mib_counter
|
static struct rtl8366_mib_counter
|
||||||
rtl8367b_mib_counters[RTL8367B_NUM_MIB_COUNTERS] = {
|
rtl8367b_mib_counters[RTL8367B_NUM_MIB_COUNTERS] = {
|
||||||
{0, 0, 4, "ifInOctets" },
|
{0, 0, 4, "ifInOctets" },
|
||||||
|
@ -1302,6 +1305,13 @@ static int rtl8367b_sw_reset_port_mibs(struct switch_dev *dev,
|
||||||
RTL8367B_MIB_CTRL0_PORT_RESET_MASK(port % 8));
|
RTL8367B_MIB_CTRL0_PORT_RESET_MASK(port % 8));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int rtl8367b_sw_get_port_stats(struct switch_dev *dev, int port,
|
||||||
|
struct switch_port_stats *stats)
|
||||||
|
{
|
||||||
|
return (rtl8366_sw_get_port_stats(dev, port, stats,
|
||||||
|
RTL8367B_MIB_TXB_ID, RTL8367B_MIB_RXB_ID));
|
||||||
|
}
|
||||||
|
|
||||||
static struct switch_attr rtl8367b_globals[] = {
|
static struct switch_attr rtl8367b_globals[] = {
|
||||||
{
|
{
|
||||||
.type = SWITCH_TYPE_INT,
|
.type = SWITCH_TYPE_INT,
|
||||||
|
@ -1382,6 +1392,7 @@ static const struct switch_dev_ops rtl8367b_sw_ops = {
|
||||||
.set_port_pvid = rtl8366_sw_set_port_pvid,
|
.set_port_pvid = rtl8366_sw_set_port_pvid,
|
||||||
.reset_switch = rtl8366_sw_reset_switch,
|
.reset_switch = rtl8366_sw_reset_switch,
|
||||||
.get_port_link = rtl8367b_sw_get_port_link,
|
.get_port_link = rtl8367b_sw_get_port_link,
|
||||||
|
.get_port_stats = rtl8367b_sw_get_port_stats,
|
||||||
};
|
};
|
||||||
|
|
||||||
static int rtl8367b_switch_init(struct rtl8366_smi *smi)
|
static int rtl8367b_switch_init(struct rtl8366_smi *smi)
|
||||||
|
|
Loading…
Reference in a new issue