diff options
Diffstat (limited to 'target/linux/ar71xx/files/drivers/net')
-rw-r--r-- | target/linux/ar71xx/files/drivers/net/phy/rtl8366_smi.c | 221 |
1 files changed, 119 insertions, 102 deletions
diff --git a/target/linux/ar71xx/files/drivers/net/phy/rtl8366_smi.c b/target/linux/ar71xx/files/drivers/net/phy/rtl8366_smi.c index a6ca06e67..6b909b564 100644 --- a/target/linux/ar71xx/files/drivers/net/phy/rtl8366_smi.c +++ b/target/linux/ar71xx/files/drivers/net/phy/rtl8366_smi.c @@ -165,40 +165,42 @@ struct rtl8366s_vlan4kentry { u16 member:6; }; -static const char *MIBCOUNTERS[] = { "IfInOctets ", - "EtherStatsOctets ", - "EtherStatsUnderSizePkts ", - "EtherFregament ", - "EtherStatsPkts64Octets ", - "EtherStatsPkts65to127Octets ", - "EtherStatsPkts128to255Octets ", - "EtherStatsPkts256to511Octets ", - "EtherStatsPkts512to1023Octets ", - "EtherStatsPkts1024to1518Octets ", - "EtherOversizeStats ", - "EtherStatsJabbers ", - "IfInUcastPkts ", - "EtherStatsMulticastPkts ", - "EtherStatsBroadcastPkts ", - "EtherStatsDropEvents ", - "Dot3StatsFCSErrors ", - "Dot3StatsSymbolErrors ", - "Dot3InPauseFrames ", - "Dot3ControlInUnknownOpcodes ", - "IfOutOctets ", - "Dot3StatsSingleCollisionFrames ", - "Dot3StatMultipleCollisionFrames ", - "Dot3sDeferredTransmissions ", - "Dot3StatsLateCollisions ", - "EtherStatsCollisions ", - "Dot3StatsExcessiveCollisions ", - "Dot3OutPauseFrames ", - "Dot1dBasePortDelayExceededDiscards", - "Dot1dTpPortInDiscards ", - "IfOutUcastPkts ", - "IfOutMulticastPkts ", - "IfOutBroadcastPkts ", - NULL }; +static const char *MIBCOUNTERS[] = { + "IfInOctets ", + "EtherStatsOctets ", + "EtherStatsUnderSizePkts ", + "EtherFregament ", + "EtherStatsPkts64Octets ", + "EtherStatsPkts65to127Octets ", + "EtherStatsPkts128to255Octets ", + "EtherStatsPkts256to511Octets ", + "EtherStatsPkts512to1023Octets ", + "EtherStatsPkts1024to1518Octets ", + "EtherOversizeStats ", + "EtherStatsJabbers ", + "IfInUcastPkts ", + "EtherStatsMulticastPkts ", + "EtherStatsBroadcastPkts ", + "EtherStatsDropEvents ", + "Dot3StatsFCSErrors ", + "Dot3StatsSymbolErrors ", + "Dot3InPauseFrames ", + "Dot3ControlInUnknownOpcodes ", + "IfOutOctets ", + "Dot3StatsSingleCollisionFrames ", + "Dot3StatMultipleCollisionFrames ", + "Dot3sDeferredTransmissions ", + "Dot3StatsLateCollisions ", + "EtherStatsCollisions ", + "Dot3StatsExcessiveCollisions ", + "Dot3OutPauseFrames ", + "Dot1dBasePortDelayExceededDiscards", + "Dot1dTpPortInDiscards ", + "IfOutUcastPkts ", + "IfOutMulticastPkts ", + "IfOutBroadcastPkts ", + NULL, +}; struct rtl8366_smi { struct platform_device *pdev; @@ -207,7 +209,7 @@ struct rtl8366_smi { struct mii_bus *mii_bus; struct switch_dev dev; int mii_irq[PHY_MAX_ADDR]; - char buf[4096]; + char buf[4096]; #ifdef CONFIG_RTL8366_SMI_DEBUG_FS struct dentry *debugfs_root; #endif @@ -561,10 +563,11 @@ static int rtl8366_get_mib_counter(struct rtl8366_smi *smi, int counter, addr = RTL8366S_MIB_COUNTER_BASE + regoffset; - - /* writing access counter address first */ - /* then ASIC will prepare 64bits counter wait for being retrived */ - data = 0;/* writing data will be discard by ASIC */ + /* + * Writing access counter address first + * then ASIC will prepare 64bits counter wait for being retrived + */ + data = 0; /* writing data will be discard by ASIC */ err = rtl8366_smi_write_reg(smi, addr, data); if (err) return err; @@ -697,7 +700,6 @@ static int rtl8366s_get_vlan_member_config(struct rtl8366_smi *smi, u32 index, tableaddr = (u16 *)vlanmc; addr = RTL8366S_VLAN_MEMCONF_BASE + (index << 1); - err = rtl8366_smi_read_reg(smi, addr, &data); if (err) return err; @@ -706,7 +708,6 @@ static int rtl8366s_get_vlan_member_config(struct rtl8366_smi *smi, u32 index, tableaddr++; addr = RTL8366S_VLAN_MEMCONF_BASE + 1 + (index << 1); - err = rtl8366_smi_read_reg(smi, addr, &data); if (err) return err; @@ -726,16 +727,15 @@ static int rtl8366s_set_vlan_member_config(struct rtl8366_smi *smi, u32 index, u16 *tableaddr; if (index >= RTL8366_NUM_VLANS || - vlanmc->vid >= RTL8366_NUM_VIDS || - vlanmc->priority > RTL8366S_PRIORITYMAX || - vlanmc->member > RTL8366_PORT_ALL || - vlanmc->untag > RTL8366_PORT_ALL || - vlanmc->fid > RTL8366S_FIDMAX) + vlanmc->vid >= RTL8366_NUM_VIDS || + vlanmc->priority > RTL8366S_PRIORITYMAX || + vlanmc->member > RTL8366_PORT_ALL || + vlanmc->untag > RTL8366_PORT_ALL || + vlanmc->fid > RTL8366S_FIDMAX) return -EINVAL; addr = RTL8366S_VLAN_MEMCONF_BASE + (index << 1); - tableaddr = (u16 *)vlanmc; data = *tableaddr; @@ -774,7 +774,6 @@ static int rtl8366_get_port_vlan_index(struct rtl8366_smi *smi, int port, return -EINVAL; addr = RTL8366S_PORT_VLAN_CTRL_BASE + addroffset[port]; - err = rtl8366_smi_read_reg(smi, addr, &data); if (err) return err; @@ -788,9 +787,9 @@ static int rtl8366_get_port_vlan_index(struct rtl8366_smi *smi, int port, static int rtl8366_get_vlan_port_pvid(struct rtl8366_smi *smi, int port, int *val) { + struct rtl8366s_vlanconfig vlanmc; int err; int index; - struct rtl8366s_vlanconfig vlanmc; err = rtl8366_get_port_vlan_index(smi, port, &index); if (err) @@ -854,16 +853,16 @@ static int rtl8366_set_vlan_port_pvid(struct rtl8366_smi *smi, int port, if (port >= RTL8366_NUM_PORTS || val >= RTL8366_NUM_VIDS) return -EINVAL; - - /* Updating the 4K entry; lookup it and change the port member set */ rtl8366s_get_vlan_4k_entry(smi, val, &vlan4k); vlan4k.member |= ((1 << port) | RTL8366_PORT_CPU); vlan4k.untag = RTL8366_PORT_ALL_BUT_CPU; rtl8366s_set_vlan_4k_entry(smi, &vlan4k); - /* For the 16 entries more work needs to be done. First see if such - VID is already there and change it */ + /* + * For the 16 entries more work needs to be done. First see if such + * VID is already there and change it + */ for (i = 0; i < RTL8366_NUM_VLANS; ++i) { rtl8366s_get_vlan_member_config(smi, i, &vlanmc); @@ -879,13 +878,17 @@ static int rtl8366_set_vlan_port_pvid(struct rtl8366_smi *smi, int port, } } - /* PVID could not be found from vlan table. Replace unused (one that - has no member ports) with new one */ + /* + * PVID could not be found from vlan table. Replace unused (one that + * has no member ports) with new one + */ for (i = 0; i < RTL8366_NUM_VLANS; ++i) { rtl8366s_get_vlan_member_config(smi, i, &vlanmc); - /* See if this vlan member configuration is unused. It is - unused if member set contains no ports or CPU port only */ + /* + * See if this vlan member configuration is unused. It is + * unused if member set contains no ports or CPU port only + */ if (!vlanmc.member || vlanmc.member == RTL8366_PORT_CPU) { vlanmc.vid = val; vlanmc.priority = 0; @@ -902,8 +905,9 @@ static int rtl8366_set_vlan_port_pvid(struct rtl8366_smi *smi, int port, } } - dev_err(&smi->pdev->dev, "All 16 vlan member configurations are in " - "use\n"); + dev_err(&smi->pdev->dev, + "All 16 vlan member configurations are in use\n"); + return -EINVAL; } @@ -911,6 +915,7 @@ static int rtl8366_set_vlan_port_pvid(struct rtl8366_smi *smi, int port, static int rtl8366_vlan_set_vlan(struct rtl8366_smi *smi, int enable) { u32 data = 0; + rtl8366_smi_read_reg(smi, RTL8366_CHIP_GLOBAL_CTRL_REG, &data); data &= ~(data & RTL8366_CHIP_CTRL_VLAN); @@ -923,6 +928,7 @@ static int rtl8366_vlan_set_vlan(struct rtl8366_smi *smi, int enable) static int rtl8366_vlan_set_4ktable(struct rtl8366_smi *smi, int enable) { u32 data = 0; + rtl8366_smi_read_reg(smi, RTL8366S_VLAN_TB_CTRL_REG, &data); data &= ~(data & 1); @@ -981,8 +987,8 @@ static ssize_t rtl8366_read_debugfs_mibs(struct file *file, char __user *user_buf, size_t count, loff_t *ppos) { - int i, j, len = 0; struct rtl8366_smi *smi = (struct rtl8366_smi *)file->private_data; + int i, j, len = 0; char *buf = smi->buf; len += snprintf(buf + len, sizeof(smi->buf) - len, "MIB Counters:\n"); @@ -992,17 +998,18 @@ static ssize_t rtl8366_read_debugfs_mibs(struct file *file, "Port 4\n"); for (i = 0; i < 33; ++i) { - len += snprintf(buf + len, sizeof(smi->buf) - len, "%d:%s ", i, MIBCOUNTERS[i]); for (j = 0; j < RTL8366_NUM_PORTS; ++j) { unsigned long long counter = 0; if (!rtl8366_get_mib_counter(smi, i, j, &counter)) - len += snprintf(buf + len, sizeof(smi->buf) - len, + len += snprintf(buf + len, + sizeof(smi->buf) - len, "[%llu]", counter); else - len += snprintf(buf + len, sizeof(smi->buf) - len, + len += snprintf(buf + len, + sizeof(smi->buf) - len, "[error]"); if (j != RTL8366_NUM_PORTS - 1) { @@ -1011,7 +1018,8 @@ static ssize_t rtl8366_read_debugfs_mibs(struct file *file, sizeof(smi->buf) - len, "\t"); - len += snprintf(buf + len, sizeof(smi->buf) - len, + len += snprintf(buf + len, + sizeof(smi->buf) - len, "\t"); } } @@ -1027,11 +1035,12 @@ static ssize_t rtl8366_read_debugfs_vlan(struct file *file, char __user *user_buf, size_t count, loff_t *ppos) { - int i, j, len = 0; struct rtl8366_smi *smi = (struct rtl8366_smi *)file->private_data; + int i, j, len = 0; char *buf = smi->buf; - len += snprintf(buf + len, sizeof(smi->buf) - len, "VLAN Member Config:\n"); + len += snprintf(buf + len, sizeof(smi->buf) - len, + "VLAN Member Config:\n"); len += snprintf(buf + len, sizeof(smi->buf) - len, "\t id \t vid \t prio \t member \t untag \t fid " "\tports\n"); @@ -1065,9 +1074,9 @@ static ssize_t rtl8366_read_debugfs_reg(struct file *file, char __user *user_buf, size_t count, loff_t *ppos) { + struct rtl8366_smi *smi = (struct rtl8366_smi *)file->private_data; u32 t, reg = g_dbg_reg; int err, len = 0; - struct rtl8366_smi *smi = (struct rtl8366_smi *)file->private_data; char *buf = smi->buf; memset(buf, '\0', sizeof(smi->buf)); @@ -1089,11 +1098,11 @@ static ssize_t rtl8366_write_debugfs_reg(struct file *file, const char __user *user_buf, size_t count, loff_t *ppos) { + struct rtl8366_smi *smi = (struct rtl8366_smi *)file->private_data; unsigned long data; u32 reg = g_dbg_reg; int err; size_t len; - struct rtl8366_smi *smi = (struct rtl8366_smi *)file->private_data; char *buf = smi->buf; len = min(count, sizeof(smi->buf) - 1); @@ -1170,16 +1179,16 @@ static void rtl8366_debugfs_init(struct rtl8366_smi *smi) node = debugfs_create_file("vlan", S_IRUSR, root, smi, &fops_rtl8366_vlan); if (!node) { - dev_err(&smi->pdev->dev, "Creating debugfs file vlan " - "failed\n"); + dev_err(&smi->pdev->dev, + "Creating debugfs file vlan failed\n"); return; } node = debugfs_create_file("mibs", S_IRUSR, root, smi, &fops_rtl8366_mibs); if (!node) { - dev_err(&smi->pdev->dev, "Creating debugfs file mibs " - "xfailed\n"); + dev_err(&smi->pdev->dev, + "Creating debugfs file mibs failed\n"); return; } } @@ -1201,8 +1210,8 @@ static int rtl8366_global_reset_mibs(struct switch_dev *dev, const struct switch_attr *attr, struct switch_val *val) { - u32 data = 0; struct rtl8366_smi *smi = sw_to_rtl8366(dev); + u32 data = 0; if (val->value.i == 1) { rtl8366_smi_read_reg(smi, RTL8366S_MIB_CTRL_REG, &data); @@ -1217,8 +1226,8 @@ static int rtl8366_get_vlan(struct switch_dev *dev, const struct switch_attr *attr, struct switch_val *val) { - u32 data; struct rtl8366_smi *smi = sw_to_rtl8366(dev); + u32 data; if (attr->ofs == 1) { rtl8366_smi_read_reg(smi, RTL8366_CHIP_GLOBAL_CTRL_REG, &data); @@ -1243,8 +1252,9 @@ static int rtl8366_global_get_blinkrate(struct switch_dev *dev, const struct switch_attr *attr, struct switch_val *val) { - u32 data; struct rtl8366_smi *smi = sw_to_rtl8366(dev); + u32 data; + rtl8366_smi_read_reg(smi, RTL8366_LED_BLINKRATE_REG, &data); val->value.i = (data & (RTL8366_LED_BLINKRATE_MASK)); @@ -1322,23 +1332,31 @@ static int rtl8366_attr_get_port_link(struct switch_dev *dev, "Link DOWN, Speed: "); if (speed == 0) - len += snprintf(buf + len, sizeof(smi->buf) - len, "10Base-TX "); + len += snprintf(buf + len, sizeof(smi->buf) - len, + "10Base-TX "); else if (speed == 1) - len += snprintf(buf + len, sizeof(smi->buf) - len, "100Base-TX "); + len += snprintf(buf + len, sizeof(smi->buf) - len, + "100Base-TX "); else if (speed == 2) - len += snprintf(buf + len, sizeof(smi->buf) - len, "1000Base-TX "); + len += snprintf(buf + len, sizeof(smi->buf) - len, + "1000Base-TX "); if (duplex) - len += snprintf(buf + len, sizeof(smi->buf) - len, "Full-Duplex, "); + len += snprintf(buf + len, sizeof(smi->buf) - len, + "Full-Duplex, "); else - len += snprintf(buf + len, sizeof(smi->buf) - len, "Half-Duplex, "); + len += snprintf(buf + len, sizeof(smi->buf) - len, + "Half-Duplex, "); if (txpause) - len += snprintf(buf + len, sizeof(smi->buf) - len, "TX-Pause "); + len += snprintf(buf + len, sizeof(smi->buf) - len, + "TX-Pause "); if (rxpause) - len += snprintf(buf + len, sizeof(smi->buf) - len, "RX-Pause "); + len += snprintf(buf + len, sizeof(smi->buf) - len, + "RX-Pause "); if (nway) - len += snprintf(buf + len, sizeof(smi->buf) - len, "nway "); + len += snprintf(buf + len, sizeof(smi->buf) - len, + "nway "); val->value.s = buf; val->len = len; @@ -1372,7 +1390,8 @@ static int rtl8366_attr_get_vlan_info(struct switch_dev *dev, int index = 0; if (!rtl8366_get_port_vlan_index(smi, i, &index) && index == val->port_vlan) - len += snprintf(buf + len, sizeof(smi->buf) - len, "%d", i); + len += snprintf(buf + len, sizeof(smi->buf) - len, + "%d", i); } len += snprintf(buf + len, sizeof(smi->buf) - len, "\n"); @@ -1398,8 +1417,9 @@ static int rtl8366_set_port_led(struct switch_dev *dev, const struct switch_attr *attr, struct switch_val *val) { - u32 data = 0; struct rtl8366_smi *smi = sw_to_rtl8366(dev); + u32 data = 0; + if (val->port_vlan >= RTL8366_NUM_PORTS || (1 << val->port_vlan) == RTL8366_PORT_UNKNOWN) return -EINVAL; @@ -1422,8 +1442,9 @@ static int rtl8366_get_port_led(struct switch_dev *dev, const struct switch_attr *attr, struct switch_val *val) { - u32 data = 0; struct rtl8366_smi *smi = sw_to_rtl8366(dev); + u32 data = 0; + if (val->port_vlan >= RTL8366_NUM_LEDGROUPS) return -EINVAL; @@ -1437,8 +1458,9 @@ static int rtl8366_reset_port_mibs(struct switch_dev *dev, const struct switch_attr *attr, struct switch_val *val) { - u32 data = 0; struct rtl8366_smi *smi = sw_to_rtl8366(dev); + u32 data = 0; + if (val->port_vlan >= RTL8366_NUM_PORTS) return -EINVAL; @@ -1453,18 +1475,19 @@ static int rtl8366_get_port_mib(struct switch_dev *dev, const struct switch_attr *attr, struct switch_val *val) { + struct rtl8366_smi *smi = sw_to_rtl8366(dev); int i, len = 0; unsigned long long counter = 0; - struct rtl8366_smi *smi = sw_to_rtl8366(dev); char *buf = smi->buf; if (val->port_vlan >= RTL8366_NUM_PORTS) return -EINVAL; - len += snprintf(buf + len, sizeof(smi->buf) - len, "Port %d MIB counters\n", + len += snprintf(buf + len, sizeof(smi->buf) - len, + "Port %d MIB counters\n", val->port_vlan); - for (i = 0; i < RTL8366S_MIB_COUNT; ++i) { + for (i = 0; i < RTL8366S_MIB_COUNT; ++i) { len += snprintf(buf + len, sizeof(smi->buf) - len, "%d:%s\t", i, MIBCOUNTERS[i]); if (!rtl8366_get_mib_counter(smi, i, val->port_vlan, &counter)) @@ -1588,8 +1611,7 @@ static struct switch_attr rtl8366_globals[] = { .get = rtl8366_get_vlan, .max = 1, .ofs = 1 - }, - { + }, { .type = SWITCH_TYPE_INT, .name = "enable_vlan4k", .description = "Enable VLAN 4K mode", @@ -1597,16 +1619,14 @@ static struct switch_attr rtl8366_globals[] = { .get = rtl8366_get_vlan, .max = 1, .ofs = 2 - }, - { + }, { .type = SWITCH_TYPE_INT, .name = "reset_mibs", .description = "Reset all MIB counters", .set = rtl8366_global_reset_mibs, .get = NULL, .max = 1 - }, - { + }, { .type = SWITCH_TYPE_INT, .name = "blinkrate", .description = "Get/Set LED blinking rate (0 = 43ms, 1 = 84ms," @@ -1625,24 +1645,21 @@ static struct switch_attr rtl8366_port[] = { .max = 1, .set = NULL, .get = rtl8366_attr_get_port_link - }, - { + }, { .type = SWITCH_TYPE_INT, .name = "reset_mib", .description = "Reset single port MIB counters", .max = 1, .set = rtl8366_reset_port_mibs, .get = NULL - }, - { + }, { .type = SWITCH_TYPE_STRING, .name = "mib", .description = "Get MIB counters for port", .max = 33, .set = NULL, .get = rtl8366_get_port_mib - }, - { + }, { .type = SWITCH_TYPE_INT, .name = "led", .description = "Get/Set port group (0 - 3) led mode (0 - 15)", |