net: dsa: add QCA AR8xxx switch family support
Subsystems (5)
cover net: dsa: add QCA AR8xxx switch family support
This patch set adds initial support for AR8xxx switches using the DSA subsystem. It currently supports QCA8337 switch, and can be extended to other hardware in the same family.
This switch was already discussed in the following thread:
https://www.marc.info/?t=142601417400004&r=1&w=2
Below is a typical picture of a QCA8337 used in a standard home gateway configuration:
+-----------+ +-----------+
| | SGMII | |
| eth0+-------+ +------ 1000baseT MDI ("WAN")
| wan| | 7-port +------ 1000baseT MDI ("LAN1")
| CPU | | ethernet +------ 1000baseT MDI ("LAN2")
| | RGMII | switch +------ 1000baseT MDI ("LAN3")
| eth1+-------+ w/5 PHYs +------ 1000baseT MDI ("LAN4")
| lan| | |
+-----------+ +-----------+
| MDIO |
\------------/The switch is connected to the CPU using 2 xMII interfaces. As DSA only supports one logical interface to the switch, we split the switch using device-tree information into 2 parts:
*port 6 (one of the xMII switch port) will be dedicated to one
particular Ethernet port. From a system perspective, it will be seen as a regular PHY.
*port 0 (the other xMII port) will act as the switch master interface
When 2 xMII are used, the switch will therefore be seen as 2 devices: 1 PHY + 1 DSA switch. The configuration of this split is done using driver specific options in device-tree.
The exact properties are detailed in the Documentation patch below.
Mathieu Olivari (7):
net: dsa: add new driver for ar8xxx family
net: dsa: ar8xxx: add ethtool hw statistics support
net: dsa: ar8xxx: add regmap support
net: dsa: add QCA tag support
net: dsa: ar8xxx: enable QCA header support on AR8xxx
net: dsa: ar8xxx: add support for second xMII interfaces through DT
Documentation: devicetree: add ar8xxx binding
.../devicetree/bindings/net/dsa/qca-ar8xxx.txt | 70 +++ drivers/net/dsa/Kconfig | 9 + drivers/net/dsa/Makefile | 1 + drivers/net/dsa/ar8xxx.c | 530 +++++++++++++++++++++ drivers/net/dsa/ar8xxx.h | 157 ++++++ include/net/dsa.h | 1 + net/dsa/Kconfig | 3 + net/dsa/Makefile | 1 + net/dsa/dsa.c | 6 + net/dsa/dsa_priv.h | 2 + net/dsa/slave.c | 5 + net/dsa/tag_qca.c | 159 +++++++ 12 files changed, 944 insertions(+) create mode 100644 Documentation/devicetree/bindings/net/dsa/qca-ar8xxx.txt create mode 100644 drivers/net/dsa/ar8xxx.c create mode 100644 drivers/net/dsa/ar8xxx.h create mode 100644 net/dsa/tag_qca.c
Signature · 1 line
2.1.4
PATCH 1/7 net: dsa: add new driver for ar8xxx family
This patch contains initial init & registration code for QCA8337. It will detect a QCA8337 switch, if present and declared in DT/platform.
Each port will be represented through a standalone net_device interface, as for other DSA switches. CPU can communicate with any of the ports by setting an IP@ on ethN interface. Ports cannot communicate with each other just yet.
Link status will be reported through polling, and we don't use any encapsulation.
--- drivers/net/dsa/Kconfig | 7 ++ drivers/net/dsa/Makefile | 1 + drivers/net/dsa/ar8xxx.c | 303 +++++++++++++++++++++++++++++++++++++++++++++++ drivers/net/dsa/ar8xxx.h | 82 +++++++++++++ net/dsa/dsa.c | 1 + 5 files changed, 394 insertions(+) create mode 100644 drivers/net/dsa/ar8xxx.c create mode 100644 drivers/net/dsa/ar8xxx.h
drivers/net/dsa/Kconfig +7 -0
@@ -65,4 +65,11 @@ config NET_DSA_BCM_SF2 This enables support for the Broadcom Starfighter 2 Ethernet switch chips. +config NET_DSA_AR8XXX + tristate "Qualcomm Atheros AR8XXX Ethernet switch family support" + depends on NET_DSA + ---help--- + This enables support for the Qualcomm Atheros AR8XXX Ethernet + switch chips. + endmenu
drivers/net/dsa/Makefile +1 -0
@@ -14,3 +14,4 @@ ifdef CONFIG_NET_DSA_MV88E6171 mv88e6xxx_drv-y += mv88e6171.o endif obj-$(CONFIG_NET_DSA_BCM_SF2) += bcm_sf2.o +obj-$(CONFIG_NET_DSA_AR8XXX) += ar8xxx.o
drivers/net/dsa/ar8xxx.c new file +303 -0
303 lines not on this page · raw message
drivers/net/dsa/ar8xxx.h new file +82 -0
82 lines not on this page · raw message
net/dsa/dsa.c +1 -0
@@ -893,6 +893,7 @@ static SIMPLE_DEV_PM_OPS(dsa_pm_ops, dsa_suspend, dsa_resume);static const struct of_device_id dsa_of_match_table[] = { { .compatible ="brcm,bcm7445-switch-v4.0" }, + { .compatible ="qca,ar8xxx" , }, { .compatible ="marvell,dsa" , }, {} };
Signature · 6 lines
2.1.4 -- To unsubscribe from this list: send the line "unsubscribe devicetree" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
Andrew Lunn
maintainerRe: [PATCH 1/7] net: dsa: add new driver for ar8xxx family
Quoted 9 lines
drivers/net/dsa/ar8xxx.c new file +9
-0+static int ar8xxx_set_pad_ctrl (struct dsa_switch *ds,int port,int mode) +{ +int reg; + +switch (port) { +case 0 : + reg =AR8327_REG_PORT0_PAD_CTRL ; +break ; +case 6 :
drivers/net/dsa/ar8xxx.c line 148
Quoted 10 lines
drivers/net/dsa/ar8xxx.c new file +10
-0+ reg =AR8327_REG_PORT6_PAD_CTRL ; +break ; +default : +pr_err ("Can't set PAD_CTRL on port %d\n" , port); +return -EINVAL ; + } + +/* DSA only supports 1 CPU port for now, so we'll take the assumption +* that P0 is connected to the CPU master_dev. +*/
I don't like this assumption. Hardware i have with Marvell switches has the CPU connected to ports 5, or 6, or 0.
Calling dsa_upstream_port() will tell you which is the CPU port.
Andrew
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH 1/7] net: dsa: add new driver for ar8xxx family
In reply to Mathieu OlivariJust a nit: a license mismatch.
drivers/net/dsa/ar8xxx.c line 13
Quoted 11 lines · Mathieu Olivari
drivers/net/dsa/ar8xxx.c new file +8
-0+* This program is free software; you can redistribute it and/or modify +* it under the terms of the GNU General Public License version 2 and +* only version 2 as published by the Free Software Foundation. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details.
This states the license is GPL v2.
Quoted 1 line
+MODULE_LICENSE("GPL");
And this states, according to include/linux/module.h, that the license is GPL v2 or later. So I think that either the comment at the top of this file or the ident used in the MODULE_LICENSE() macro needs to change.
Paul Bolle
PATCH 2/7 net: dsa: ar8xxx: add ethtool hw statistics support
In reply to Mathieu OlivariMIB counters can now be reported through each switch port by using "ethtool -S".
--- drivers/net/dsa/ar8xxx.c | 106 +++++++++++++++++++++++++++++++++++++++++++---- drivers/net/dsa/ar8xxx.h | 47 +++++++++++++++++++++ 2 files changed, 146 insertions(+), 7 deletions(-)
drivers/net/dsa/ar8xxx.c +99 -7
@@ -22,6 +22,55 @@#include "ar8xxx.h" +#define MIB_DESC (_s, _o, _n) \ + { \ + .size = (_s), \ + .offset = (_o), \ + .name = (_n), \ + } + +static const struct ar8xxx_mib_desc ar8327_mib[] = { +MIB_DESC (1 ,0x00 ,"RxBroad" ), +MIB_DESC (1 ,0x04 ,"RxPause" ), +MIB_DESC (1 ,0x08 ,"RxMulti" ), +MIB_DESC (1 ,0x0c ,"RxFcsErr" ), +MIB_DESC (1 ,0x10 ,"RxAlignErr" ), +MIB_DESC (1 ,0x14 ,"RxRunt" ), +MIB_DESC (1 ,0x18 ,"RxFragment" ), +MIB_DESC (1 ,0x1c ,"Rx64Byte" ), +MIB_DESC (1 ,0x20 ,"Rx128Byte" ), +MIB_DESC (1 ,0x24 ,"Rx256Byte" ), +MIB_DESC (1 ,0x28 ,"Rx512Byte" ), +MIB_DESC (1 ,0x2c ,"Rx1024Byte" ), +MIB_DESC (1 ,0x30 ,"Rx1518Byte" ), +MIB_DESC (1 ,0x34 ,"RxMaxByte" ), +MIB_DESC (1 ,0x38 ,"RxTooLong" ), +MIB_DESC (2 ,0x3c ,"RxGoodByte" ), +MIB_DESC (2 ,0x44 ,"RxBadByte" ), +MIB_DESC (1 ,0x4c ,"RxOverFlow" ), +MIB_DESC (1 ,0x50 ,"Filtered" ), +MIB_DESC (1 ,0x54 ,"TxBroad" ), +MIB_DESC (1 ,0x58 ,"TxPause" ), +MIB_DESC (1 ,0x5c ,"TxMulti" ), +MIB_DESC (1 ,0x60 ,"TxUnderRun" ), +MIB_DESC (1 ,0x64 ,"Tx64Byte" ), +MIB_DESC (1 ,0x68 ,"Tx128Byte" ), +MIB_DESC (1 ,0x6c ,"Tx256Byte" ), +MIB_DESC (1 ,0x70 ,"Tx512Byte" ), +MIB_DESC (1 ,0x74 ,"Tx1024Byte" ), +MIB_DESC (1 ,0x78 ,"Tx1518Byte" ), +MIB_DESC (1 ,0x7c ,"TxMaxByte" ), +MIB_DESC (1 ,0x80 ,"TxOverSize" ), +MIB_DESC (2 ,0x84 ,"TxByte" ), +MIB_DESC (1 ,0x8c ,"TxCollision" ), +MIB_DESC (1 ,0x90 ,"TxAbortCol" ), +MIB_DESC (1 ,0x94 ,"TxMultiCol" ), +MIB_DESC (1 ,0x98 ,"TxSingleCol" ), +MIB_DESC (1 ,0x9c ,"TxExcDefer" ), +MIB_DESC (1 ,0xa0 ,"TxDefer" ), +MIB_DESC (1 ,0xa4 ,"TxLateCol" ), +}; +u32 ar8xxx_mii_read32 (struct mii_bus *bus,int phy_id,int regnum) {
@@ -184,6 +233,10 @@ static int ar8xxx_setup(struct dsa_switch *ds)if (ret <0 )return ret; +/* Enable MIB counters */ +ar8xxx_reg_set (ds,AR8327_REG_MIB ,AR8327_MIB_CPU_KEEP ); +ar8xxx_write (ds,AR8327_REG_MODULE_EN ,AR8327_MODULE_EN_MIB ); +/* Disable forwarding by default on all ports */ for (i =0 ; i <AR8327_NUM_PORTS ; i++) ar8xxx_rmw(ds, AR8327_PORT_LOOKUP_CTRL(i),
@@ -228,6 +281,42 @@ ar8xxx_phy_write(struct dsa_switch *ds, int phy, int regnum, u16 val)return mdiobus_write (bus, phy, regnum, val); } +static void ar8xxx_get_strings (struct dsa_switch *ds,int phy,uint8_t *data) +{ +int i; + +for (i =0 ; i <ARRAY_SIZE (ar8327_mib); i++) { +strncpy (data + i *ETH_GSTRING_LEN , ar8327_mib[i].name, +ETH_GSTRING_LEN ); + } +} + +static void ar8xxx_get_ethtool_stats (struct dsa_switch *ds,int phy, +uint64_t *data) +{ +const struct ar8xxx_mib_desc *mib; +uint32_t reg, i, port; +u64 hi; + + port =phy_to_port (phy); + +for (i =0 ; i <ARRAY_SIZE (ar8327_mib); i++) { + mib = &ar8327_mib[i]; + reg =AR8327_PORT_MIB_COUNTER (port) + mib->offset; + + data[i] =ar8xxx_read (ds, reg); +if (mib->size ==2 ) { + hi =ar8xxx_read (ds, reg +4 ); + data[i] |= hi <<32 ; + } + } +} + +static int ar8xxx_get_sset_count (struct dsa_switch *ds) +{ +return ARRAY_SIZE (ar8327_mib); +} +static void ar8xxx_poll_link (struct dsa_switch *ds) {int i =0 ;
@@ -275,13 +364,16 @@ static void ar8xxx_poll_link(struct dsa_switch *ds) }static struct dsa_switch_driver ar8xxx_switch_driver = { - .tag_protocol =DSA_TAG_PROTO_NONE , - .probe = ar8xxx_probe, - .setup = ar8xxx_setup, - .set_addr = ar8xxx_set_addr, - .poll_link = ar8xxx_poll_link, - .phy_read = ar8xxx_phy_read, - .phy_write = ar8xxx_phy_write, + .tag_protocol =DSA_TAG_PROTO_NONE , + .probe = ar8xxx_probe, + .setup = ar8xxx_setup, + .set_addr = ar8xxx_set_addr, + .poll_link = ar8xxx_poll_link, + .phy_read = ar8xxx_phy_read, + .phy_write = ar8xxx_phy_write, + .get_strings = ar8xxx_get_strings, + .get_ethtool_stats = ar8xxx_get_ethtool_stats, + .get_sset_count = ar8xxx_get_sset_count, };static int __init ar8xxx_init (void )
drivers/net/dsa/ar8xxx.h +47 -0
75 lines not on this page · raw message
Signature · 6 lines
2.1.4 -- To unsubscribe from this list: send the line "unsubscribe devicetree" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
PATCH 3/7 net: dsa: ar8xxx: add regmap support
In reply to Mathieu OlivariAll switch registers can now be dumped using regmap/debugfs.
\# cat /sys/kernel/debug/regmap/<mdiobus>/registers 0000: 00001302
0004: ...
...
--- drivers/net/dsa/Kconfig | 1 + drivers/net/dsa/ar8xxx.c | 60 ++++++++++++++++++++++++++++++++++++++++++++++++ drivers/net/dsa/ar8xxx.h | 5 ++++ 3 files changed, 66 insertions(+)
drivers/net/dsa/Kconfig +1 -0
@@ -68,6 +68,7 @@ config NET_DSA_BCM_SF2 config NET_DSA_AR8XXX tristate "Qualcomm Atheros AR8XXX Ethernet switch family support" depends on NET_DSA + select REGMAP ---help--- This enables support for the Qualcomm Atheros AR8XXX Ethernet switch chips.
drivers/net/dsa/ar8xxx.c +60 -0
81 lines not on this page · raw message
drivers/net/dsa/ar8xxx.h +5 -0
@@ -17,6 +17,11 @@#define __AR8XXX_H#include <linux/delay.h> +#include <linux/regmap.h> + +struct ar8xxx_priv { +struct regmap *regmap; +};struct ar8xxx_mib_desc {unsigned int size;
Signature · 1 line
2.1.4
Re: [PATCH 3/7] net: dsa: ar8xxx: add regmap support
Quoted 6 lines · Mathieu Olivari
All switch registers can now be dumped using regmap/debugfs.
\# cat /sys/kernel/debug/regmap/<mdiobus>/registers 0000: 00001302
0004: ...
...
ethtool has a register dump command, which should already be supported by the current code in net/dsa/slave.c, is there a particular reason why you use debugfs here instead?
Signature · 1 line
Florian
Andrew Lunn
maintainerRe: [PATCH 3/7] net: dsa: ar8xxx: add regmap support
Quoted 11 lines · Florian Fainelli
Quoted 6 lines · Mathieu Olivari
All switch registers can now be dumped using regmap/debugfs.
\# cat /sys/kernel/debug/regmap/<mdiobus>/registers 0000: 00001302
0004: ...
...ethtool has a register dump command, which should already be supported by the current code in
net/dsa/slave.c, is there a particular reason why you use debugfs here instead?
Hi Florian
ethtool -d allows you to dump the registers for a port which has a slave device. It is sometimes useful to dump the cpu ports registers, or DSA ports, i.e. inter switch ports. Marvell devices also have two sets of global registers, not specific to any port.
For my debugging, i have code which allows you to read the registers via debugfs.
Andrew
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH 3/7] net: dsa: ar8xxx: add regmap support
Quoted 15 lines · Andrew Lunn
Quoted 11 lines · Florian Fainelli
Quoted 6 lines · Mathieu Olivari
All switch registers can now be dumped using regmap/debugfs.
\# cat /sys/kernel/debug/regmap/<mdiobus>/registers 0000: 00001302
0004: ...
...ethtool has a register dump command, which should already be supported by the current code in
net/dsa/slave.c, is there a particular reason why you use debugfs here instead?Hi Florian
Quoted 7 lines
ethtool -d allows you to dump the registers for a port which has a slave device. It is sometimes useful to dump the cpu ports registers, or DSA ports, i.e. inter switch ports. Marvell devices also have two sets of global registers, not specific to any port.
For my debugging, i have code which allows you to read the registers via debugfs.
Fair enough, are there other global "things" besides counters that could deserve adding maybe some sort of global/master net_device to help query switch-wide information?
Signature · 5 lines
Florian -- To unsubscribe from this list: send the line "unsubscribe devicetree" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
Andrew Lunn
maintainerRe: [PATCH 3/7] net: dsa: ar8xxx: add regmap support
Quoted 3 lines
Fair enough, are there other global "things" besides counters that could deserve adding maybe some sort of global/master
net_deviceto help query switch-wide information?
This was discussed a while back. I like the current abstraction, all interfaces are real interfaces you can send and receive packets over. This pseudo interface cannot be used for packet transfer, which seems odd.
Having access to registers for debugging, so debugfs seems like the best option to me.
Andrew
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
RE: [PATCH 3/7] net: dsa: ar8xxx: add regmap support
Alternatively, we could have something similar to what happens for the phy in the wireless subsystems. Wireless PHYs are not registered as net_device but they can still be listed, queried or configured through netlink. Just thinking out loud here.
Thanks,
Mathieu
-----Original Message-----
From: Andrew Lunn [mailto:[email protected]]
Sent: Thursday, May 28, 2015 7:44 PM
To: Florian Fainelli
Cc: Mathieu Olivari; [email protected]; [email protected]; [email protected]; [email protected]; [email protected]; davem-fT/PcQaiUtIeIZ0/[email protected]; [email protected]; [email protected]; [email protected]; leitec-z4FmpzNVuK5Wk0Htik3J/[email protected]; [email protected]; [email protected]; [email protected]; [email protected]; [email protected]; [email protected]; [email protected]; [email protected]; [email protected]
Subject: Re: [PATCH 3/7] net: dsa: ar8xxx: add regmap support
Quoted 3 lines
Fair enough, are there other global "things" besides counters that could deserve adding maybe some sort of global/master
net_deviceto help query switch-wide information?
This was discussed a while back. I like the current abstraction, all interfaces are real interfaces you can send and receive packets over. This pseudo interface cannot be used for packet transfer, which seems odd.
Having access to registers for debugging, so debugfs seems like the best option to me.
Andrew
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
Andrew Lunn
maintainerRe: [PATCH 3/7] net: dsa: ar8xxx: add regmap support
Quoted 3 lines · Mathieu Olivari
Alternatively, we could have something similar to what happens for the phy in the wireless subsystems. Wireless PHYs are not registered as
net_devicebut they can still be listed, queried or configured through netlink.
It is a reasonable idea, but you retrieve most of the useful information using ethtool. That, as far as i know, operates on net_devices, not phys.
Andrew
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH 3/7] net: dsa: ar8xxx: add regmap support
2015-05-29 20:59 GMT+03:00 Andrew Lunn <[email protected]>:
Quoted 9 lines · Mathieu Olivari
Quoted 3 lines
Alternatively, we could have something similar to what happens for the phy in the wireless subsystems. Wireless PHYs are not registered as
net_devicebut they can still be listed, queried or configured through netlink.It is a reasonable idea, but you retrieve most of the useful information using ethtool. That, as far as i know, operates on
net_devices, not phys.
May be it's time to rework Ethernet cards handling to decouple "Network interfaces" from "Ethernet ports"?
Signature · 1 line
Sergey
PATCH 4/7 net: dsa: add QCA tag support
In reply to Mathieu OlivariQCA tags are used on QCA ar8xxx switch family. This change adds support for encap/decap using 2 bytes header mode.
--- include/net/dsa.h | 1 + net/dsa/Kconfig | 3 + net/dsa/Makefile | 1 + net/dsa/dsa.c | 5 ++ net/dsa/dsa_priv.h | 2 + net/dsa/slave.c | 5 ++ net/dsa/tag_qca.c | 158 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 7 files changed, 175 insertions(+) create mode 100644 net/dsa/tag_qca.c
include/net/dsa.h +1 -0
@@ -26,6 +26,7 @@ enum dsa_tag_protocol {DSA_TAG_PROTO_TRAILER ,DSA_TAG_PROTO_EDSA ,DSA_TAG_PROTO_BRCM , + DSA_TAG_PROTO_QCA, };#define DSA_MAX_SWITCHES 4
net/dsa/Kconfig +3 -0
@@ -26,6 +26,9 @@ config NET_DSA_HWMON via the hwmon sysfs interface and exposes the onboard sensors. # tagging formats +config NET_DSA_TAG_QCA + bool + config NET_DSA_TAG_BRCM bool
net/dsa/Makefile +1 -0
@@ -3,6 +3,7 @@ obj-$(CONFIG_NET_DSA) += dsa_core.o dsa_core-y += dsa.o slave.o # tagging formats +dsa_core-$(CONFIG_NET_DSA_TAG_QCA) += tag_qca.o dsa_core-$(CONFIG_NET_DSA_TAG_BRCM) += tag_brcm.o dsa_core-$(CONFIG_NET_DSA_TAG_DSA) += tag_dsa.o dsa_core-$(CONFIG_NET_DSA_TAG_EDSA) += tag_edsa.o
net/dsa/dsa.c +5 -0
@@ -249,6 +249,11 @@ static int dsa_switch_setup_one(struct dsa_switch *ds, struct device *parent) dst->rcv = brcm_netdev_ops.rcv;break ;#endif +#ifdef CONFIG_NET_DSA_TAG_QCA +case DSA_TAG_PROTO_QCA : + dst->rcv = qca_netdev_ops.rcv; +break ; +#endif case DSA_TAG_PROTO_NONE :break ;default :
net/dsa/dsa_priv.h +2 -0
@@ -74,5 +74,7 @@ extern const struct dsa_device_ops trailer_netdev_ops;/* tag_brcm.c */ extern const struct dsa_device_ops brcm_netdev_ops; +/* tag_qca.c */ +extern const struct dsa_device_ops qca_netdev_ops;#endif
net/dsa/slave.c +5 -0
@@ -925,6 +925,11 @@ int dsa_slave_create(struct dsa_switch *ds, struct device *parent, p->xmit = brcm_netdev_ops.xmit;break ;#endif +#ifdef CONFIG_NET_DSA_TAG_QCA +case DSA_TAG_PROTO_QCA : + p->xmit = qca_netdev_ops.xmit; +break ; +#endif default : p->xmit = dsa_slave_notag_xmit;break ;
net/dsa/tag_qca.c new file +158 -0
158 lines not on this page · raw message
Signature · 1 line
2.1.4
PATCH 5/7 net: dsa: ar8xxx: enable QCA header support on AR8xxx
In reply to Mathieu OlivariThis change enable support for the QCA headers in QCA83337 driver. A 2 bytes header will be added by the switch on every incoming packet to identify the ingress port, and the DSA tagging code will add a similar 2 bytes header to control which port is used to send a particular packet.
--- drivers/net/dsa/Kconfig | 1 + drivers/net/dsa/ar8xxx.c | 28 ++++++++++++++++++++++++++-- drivers/net/dsa/ar8xxx.h | 22 ++++++++++++++++++++++ 3 files changed, 49 insertions(+), 2 deletions(-)
drivers/net/dsa/Kconfig +1 -0
@@ -68,6 +68,7 @@ config NET_DSA_BCM_SF2 config NET_DSA_AR8XXX tristate "Qualcomm Atheros AR8XXX Ethernet switch family support" depends on NET_DSA + select NET_DSA_TAG_QCA select REGMAP ---help--- This enables support for the Qualcomm Atheros AR8XXX Ethernet
drivers/net/dsa/ar8xxx.c +26 -2
@@ -292,15 +292,31 @@ static int ar8xxx_setup(struct dsa_switch *ds)if (ret <0 )return ret; +/* Enable CPU Port */ +ar8xxx_reg_set (ds,AR8327_REG_GLOBAL_FW_CTRL0 , +AR8327_GLOBAL_FW_CTRL0_CPU_PORT_EN ); +/* Enable MIB counters */ ar8xxx_reg_set (ds,AR8327_REG_MIB ,AR8327_MIB_CPU_KEEP );ar8xxx_write (ds,AR8327_REG_MODULE_EN ,AR8327_MODULE_EN_MIB ); +/* Enable QCA header mode on Port 0 */ +ar8xxx_write (ds,AR8327_REG_PORT_HDR_CTRL (0 ), +AR8327_PORT_HDR_CTRL_ALL <<AR8327_PORT_HDR_CTRL_TX_S | +AR8327_PORT_HDR_CTRL_ALL <<AR8327_PORT_HDR_CTRL_RX_S ); +/* Disable forwarding by default on all ports */ for (i =0 ; i <AR8327_NUM_PORTS ; i++)ar8xxx_rmw (ds,AR8327_PORT_LOOKUP_CTRL (i),AR8327_PORT_LOOKUP_MEMBER ,0 ); +/* Forward all unknown frames to CPU port for Linux processing */ +ar8xxx_write (ds,AR8327_REG_GLOBAL_FW_CTRL1 , +BIT (0 ) <<AR8327_GLOBAL_FW_CTRL1_IGMP_DP_S | +BIT (0 ) <<AR8327_GLOBAL_FW_CTRL1_BC_DP_S | +BIT (0 ) <<AR8327_GLOBAL_FW_CTRL1_MC_DP_S | +BIT (0 ) <<AR8327_GLOBAL_FW_CTRL1_UC_DP_S ); +/* Setup connection between CPU ports & PHYs */ for (i =0 ; i <DSA_MAX_PORTS ; i++) {/* CPU port gets connected to all PHYs in the switch */
@@ -312,8 +328,16 @@ static int ar8xxx_setup(struct dsa_switch *ds)/* Invividual PHYs gets connected to CPU port only */ if (ds->phys_port_mask &BIT (i)) { -ar8xxx_rmw (ds,AR8327_PORT_LOOKUP_CTRL (phy_to_port (i)), +int phy =phy_to_port (i); + +ar8xxx_rmw (ds,AR8327_PORT_LOOKUP_CTRL (phy),AR8327_PORT_LOOKUP_MEMBER ,BIT (0 )); + +/* Disable Auto-learning by default so the switch +* doesn't try to forward the frame to another port +*/ +ar8xxx_reg_clear (ds,AR8327_PORT_LOOKUP_CTRL (phy), +AR8327_PORT_LOOKUP_LEARN ); } }
@@ -423,7 +447,7 @@ static void ar8xxx_poll_link(struct dsa_switch *ds) }static struct dsa_switch_driver ar8xxx_switch_driver = { - .tag_protocol =DSA_TAG_PROTO_NONE , + .tag_protocol =DSA_TAG_PROTO_QCA , .priv_size =sizeof (struct ar8xxx_priv ), .probe = ar8xxx_probe, .setup = ar8xxx_setup,
drivers/net/dsa/ar8xxx.h +22 -0
@@ -62,6 +62,28 @@ struct ar8xxx_mib_desc {#define AR8XXX_PORT_STATUS_LINK_AUTO BIT(9)#define AR8XXX_PORT_STATUS_LINK_PAUSE BIT(10) +#define AR8327_REG_PORT_HDR_CTRL (_i) (0x9c + (_i * 4)) +#define AR8327_PORT_HDR_CTRL_RX_MASK GENMASK(3, 2) +#define AR8327_PORT_HDR_CTRL_RX_S 2 +#define AR8327_PORT_HDR_CTRL_TX_MASK GENMASK(1, 0) +#define AR8327_PORT_HDR_CTRL_TX_S 0 +#define AR8327_PORT_HDR_CTRL_ALL 2 +#define AR8327_PORT_HDR_CTRL_MGMT 1 +#define AR8327_PORT_HDR_CTRL_NONE 0 + +#define AR8327_REG_GLOBAL_FW_CTRL0 0x620 +#define AR8327_GLOBAL_FW_CTRL0_CPU_PORT_EN BIT(10) + +#define AR8327_REG_GLOBAL_FW_CTRL1 0x624 +#define AR8327_GLOBAL_FW_CTRL1_IGMP_DP_MASK GENMASK(30, 24) +#define AR8327_GLOBAL_FW_CTRL1_IGMP_DP_S 24 +#define AR8327_GLOBAL_FW_CTRL1_BC_DP_MASK GENMASK(22, 16) +#define AR8327_GLOBAL_FW_CTRL1_BC_DP_S 16 +#define AR8327_GLOBAL_FW_CTRL1_MC_DP_MASK GENMASK(14, 8) +#define AR8327_GLOBAL_FW_CTRL1_MC_DP_S 8 +#define AR8327_GLOBAL_FW_CTRL1_UC_DP_MASK GENMASK(6, 0) +#define AR8327_GLOBAL_FW_CTRL1_UC_DP_S 0 +#define AR8327_PORT_LOOKUP_CTRL (_i) (0x660 + (_i) * 0xc)#define AR8327_PORT_LOOKUP_MEMBER GENMASK(6, 0)#define AR8327_PORT_LOOKUP_IN_MODE GENMASK(9, 8)
Signature · 6 lines
2.1.4 -- To unsubscribe from this list: send the line "unsubscribe devicetree" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
PATCH 6/7 net: dsa: ar8xxx: add support for second xMII interfaces through DT
In reply to Mathieu OlivariThis patch is adding support for port6 specific options to device tree. They can be used to setup the second xMII interface, and connect it to one of the switch port.
--- drivers/net/dsa/ar8xxx.c | 50 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+)
drivers/net/dsa/ar8xxx.c +50 -0
@@ -19,6 +19,7 @@#include <net/dsa.h> #include <linux/phy.h> #include <linux/of_net.h> +#include <linux/of_platform.h> #include "ar8xxx.h"
@@ -260,6 +261,9 @@ static int ar8xxx_set_pad_ctrl(struct dsa_switch *ds, int port, int mode)ar8xxx_write (ds,AR8327_REG_PORT5_PAD_CTRL ,AR8327_PORT_PAD_RGMII_RX_DELAY_EN );break ; +case PHY_INTERFACE_MODE_SGMII : +ar8xxx_write (ds, reg,AR8327_PORT_PAD_SGMII_EN ); +break ;default :pr_err ("xMII mode %d not supported\n" , mode);return -EINVAL ;
@@ -268,6 +272,48 @@ static int ar8xxx_set_pad_ctrl(struct dsa_switch *ds, int port, int mode)return 0 ; } +static int ar8xxx_of_setup (struct dsa_switch *ds) +{ +struct device_node *dn = ds->pd->of_node; +const char *s_phymode; +int ret, mode; +u32 phy_id, ctrl; + +/* If port6-phy-mode property exists, configure it accordingly */ +if (!of_property_read_string (dn,"qca,port6-phy-mode" , &s_phymode)) { +for (mode =0 ; mode <PHY_INTERFACE_MODE_MAX ; mode++) +if (!strcasecmp (s_phymode,phy_modes (mode))) +break ; + +if (mode ==PHY_INTERFACE_MODE_MAX ) +pr_err ("Unknown phy-mode: \"%s\"\n" , s_phymode); + + ret =ar8xxx_set_pad_ctrl (ds,6 , mode); +if (ret <0 ) +return ret; + } + +/* If a phy ID is specified for PORT6 mac, connect them together */ +if (!of_property_read_u32 (dn,"qca,port6-phy-id" , &phy_id)) { +ar8xxx_rmw (ds,AR8327_PORT_LOOKUP_CTRL (6 ), +AR8327_PORT_LOOKUP_MEMBER ,BIT (phy_to_port (phy_id))); +ar8xxx_rmw (ds,AR8327_PORT_LOOKUP_CTRL (phy_to_port (phy_id)), +AR8327_PORT_LOOKUP_MEMBER ,BIT (6 )); + +/* We want the switch to be pass-through and act like a PHY on +* these ports. So BC/MC/UC & IGMP frames need to be accepted +*/ + ctrl =BIT (phy_to_port (phy_id)) |BIT (6 ); +ar8xxx_reg_set (ds,AR8327_REG_GLOBAL_FW_CTRL1 , + ctrl <<AR8327_GLOBAL_FW_CTRL1_IGMP_DP_S | + ctrl <<AR8327_GLOBAL_FW_CTRL1_BC_DP_S | + ctrl <<AR8327_GLOBAL_FW_CTRL1_MC_DP_S | + ctrl <<AR8327_GLOBAL_FW_CTRL1_UC_DP_S ); + } + +return 0 ; +} +static int ar8xxx_setup (struct dsa_switch *ds) {struct ar8xxx_priv *priv =ds_to_priv (ds);
@@ -341,6 +387,10 @@ static int ar8xxx_setup(struct dsa_switch *ds) } } + ret =ar8xxx_of_setup (ds); +if (ret <0 ) +return ret; +return 0 ; }
Signature · 1 line
2.1.4
PATCH 7/7 Documentation: devicetree: add ar8xxx binding
In reply to Mathieu OlivariAdd device-tree binding for ar8xxx switch families.
--- .../devicetree/bindings/net/dsa/qca-ar8xxx.txt | 70 ++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 Documentation/devicetree/bindings/net/dsa/qca-ar8xxx.txt
Documentation/devicetree/bindings/net/dsa/qca-ar8xxx.txt new file +70 -0
@@ -0,0 +1,70 @@ +* Qualcomm Atheros AR8xxx switch family + +Required properties: + +- compatible: should be "qca,ar8xxx" +- dsa,mii-bus: phandle to the MDIO bus controller, see dsa/dsa.txt +- dsa,ethernet: phandle to the CPU network interface controller, see dsa/dsa.txt +- #size-cells: must be 0 +- #address-cells: must be 2, see dsa/dsa.txt + +Subnodes: + +The integrated switch subnode should be specified according to the binding +described in dsa/dsa.txt. + +Optional properties: + +- qca,port6-phy-mode: if specified, the driver will configure Port 6 in the + given phy-mode. See Documentation/devicetree/bindings/net/ethernet.txt for + the list of valid phy-mode. + +- qca,port6-phy-id: if specified, the driver will connect Port 6 to the PHY + given as a parameter. In this case, Port6 and the corresponding PHY will be + isolated from the rest of the switch. From a system perspective, they will + act as a regular PHY. + +Example: + + dsa@0 { + compatible = "qca,ar8xxx"; + #address-cells = <2>; + #size-cells = <0>; + + dsa,ethernet = <ðernet0>; + dsa,mii-bus = <&mii_bus0>; + + switch@0 { + #address-cells = <1>; + #size-cells = <0>; + reg = <0 0>; /* MDIO address 0, switch 0 in tree */ + + qca,port6-phy-mode = "sgmii"; + qca,port6-phy-id = <4>; + + port@0 { + reg = <11>; + label = "cpu"; + }; + + port@1 { + reg = <0>; + label = "lan1"; + }; + + port@2 { + reg = <1>; + label = "lan2"; + }; + + port@3 { + reg = <2>; + label = "lan3"; + }; + + port@4 { + reg = <3>; + label = "lan4"; + }; + }; + };
Signature · 1 line
2.1.4
Re: [PATCH 7/7] Documentation: devicetree: add ar8xxx binding
Quoted 24 lines · Mathieu Olivari
Add device-tree binding for ar8xxx switch families.
Signed-off-by Mathieu Olivari <[email protected]>--- .../devicetree/bindings/net/dsa/qca-ar8xxx.txt | 70 ++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 Documentation/devicetree/bindings/net/dsa/qca-ar8xxx.txtDocumentation/devicetree/bindings/net/dsa/qca-ar8xxx.txt new file +10
-0@@ -0,0 +1,70 @@ +* Qualcomm Atheros AR8xxx switch family + +Required properties: + +- compatible: should be "qca,ar8xxx" +- dsa,mii-bus: phandle to the MDIO bus controller, see dsa/dsa.txt +- dsa,ethernet: phandle to the CPU network interface controller, see dsa/dsa.txt +- #size-cells: must be 0 +- #address-cells: must be 2, see dsa/dsa.txt +
Documentation/devicetree/bindings/net/dsa/qca-ar8xxx.txt line 20
Quoted 10 lines
Documentation/devicetree/bindings/net/dsa/qca-ar8xxx.txt new file +10
-0+Subnodes: + +The integrated switch subnode should be specified according to the binding +described in dsa/dsa.txt. + +Optional properties: + +- qca,port6-phy-mode: if specified, the driver will configure Port 6 in the + given phy-mode. See Documentation/devicetree/bindings/net/ethernet.txt for + the list of valid phy-mode.
Is there a reason why this is a custom property and not a standard "phy-mode" property here such that you could utilize of_get_phy_mode() with this directly?
Documentation/devicetree/bindings/net/dsa/qca-ar8xxx.txt line 25
Quoted 5 lines
Documentation/devicetree/bindings/net/dsa/qca-ar8xxx.txt new file +5
-0+ +- qca,port6-phy-id: if specified, the driver will connect Port 6 to the PHY + given as a parameter. In this case, Port6 and the corresponding PHY will be + isolated from the rest of the switch. From a system perspective, they will + act as a regular PHY.
Same here, is there a reason why this is not a "phy-handle" property to a PHY node that sits on a (potentially different) MDIO bus?
Quoted 46 lines
Documentation/devicetree/bindings/net/dsa/qca-ar8xxx.txt new file +45
-0+ +Example: + + dsa@0 { + compatible = "qca,ar8xxx"; + #address-cells = <2>; + #size-cells = <0>; + + dsa,ethernet = <ðernet0>; + dsa,mii-bus = <&mii_bus0>; + + switch@0 { + #address-cells = <1>; + #size-cells = <0>; + reg = <0 0>; /* MDIO address 0, switch 0 in tree */ + + qca,port6-phy-mode = "sgmii"; + qca,port6-phy-id = <4>; + + port@0 { + reg = <11>; + label = "cpu"; + }; + + port@1 { + reg = <0>; + label = "lan1"; + }; + + port@2 { + reg = <1>; + label = "lan2"; + }; + + port@3 { + reg = <2>; + label = "lan3"; + }; + + port@4 { + reg = <3>; + label = "lan4"; + }; + }; + };
Signature · 5 lines
Florian -- To unsubscribe from this list: send the line "unsubscribe devicetree" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
Andrew Lunn
maintainerQuoted 22 lines · Mathieu Olivari
This patch set adds initial support for AR8xxx switches using the DSA subsystem. It currently supports QCA8337 switch, and can be extended to other hardware in the same family.
This switch was already discussed in the following thread:
https://www.marc.info/?t=142601417400004&r=1&w=2Below is a typical picture of a QCA8337 used in a standard home gateway configuration:
+-----------+ +-----------+ | | SGMII | | | eth0+-------+ +------ 1000baseT MDI ("WAN") | wan| | 7-port +------ 1000baseT MDI ("LAN1") | CPU | | ethernet +------ 1000baseT MDI ("LAN2") | | RGMII | switch +------ 1000baseT MDI ("LAN3") | eth1+-------+ w/5 PHYs +------ 1000baseT MDI ("LAN4") | lan| | | +-----------+ +-----------+ | MDIO | \------------/
Quoted 7 lines
The switch is connected to the CPU using 2 xMII interfaces. As DSA only supports one logical interface to the switch, we split the switch using device-tree information into 2 parts:
*port 6 (one of the xMII switch port) will be dedicated to one
particular Ethernet port. From a system perspective, it will be seen as a regular PHY.
*port 0 (the other xMII port) will act as the switch master interface
FYI:
I have patches which allow DSA to use two cpu interfaces. Seems to work on my DIR665 with a Marvell Switch.
I will post the patches as an RFC.
Andrew
Re: [PATCH 0/7] net: dsa: add QCA AR8xxx switch family support\
Quoted 8 lines · Andrew Lunn
FYI:
I have patches which allow DSA to use two cpu interfaces. Seems to work on my DIR665 with a Marvell Switch.
I will post the patches as an RFC.
Andrew
Does it require the switch CPU ports to support LAG or is it generic enough to allow switch partitioning?
Andrew Lunn
maintainerRe: [PATCH 0/7] net: dsa: add QCA AR8xxx switch family support\
Quoted 6 lines · Mathieu Olivari
Quoted 5 lines · Andrew Lunn
FYI:
I have patches which allow DSA to use two cpu interfaces. Seems to work on my DIR665 with a Marvell Switch.
Quoted 6 lines
Quoted 3 lines
I will post the patches as an RFC.
Andrew
Does it require the switch CPU ports to support LAG or is it generic enough to allow switch partitioning?
When using tags, DSA by default partitions the switch. Each user port is separate from other ports. lan4 will not bridge to lan1 unless you either do it in software, or you implement the .port_join_bridge/.port_leave_bridge/.port_stp_update methods of dsa_switch_driver.
What it requires is that for each user port, you can configure what cpu port it should use. Marvell devices have this ability, and at a first look, it seems like SF2 does as well, but i will leave Florian to answer definitively.
I will be posting an RFC patchset later today.
Andrew
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH 0/7] net: dsa: add QCA AR8xxx switch family support\
Quoted 20 lines · Andrew Lunn
Quoted 6 lines · Mathieu Olivari
Quoted 5 lines · Andrew Lunn
FYI:
I have patches which allow DSA to use two cpu interfaces. Seems to work on my DIR665 with a Marvell Switch.
Quoted 6 lines
Quoted 3 lines
I will post the patches as an RFC.
Andrew
Does it require the switch CPU ports to support LAG or is it generic enough to allow switch partitioning?
When using tags, DSA by default partitions the switch. Each user port is separate from other ports. lan4 will not bridge to lan1 unless you either do it in software, or you implement the .port_join_bridge/.port_leave_bridge/.port_stp_update methods of
dsa_switch_driver.
Quoted 4 lines
What it requires is that for each user port, you can configure what cpu port it should use. Marvell devices have this ability, and at a first look, it seems like SF2 does as well, but i will leave Florian to answer definitively.
That's right, such configuration happens by using VLAN_CTL in the context of SF2, by default only Port <N> and CPU can talk to each other. Bridging ports involving putting them in the same domain, e.g: updating the VLAN_CTL bitmask to include all bridge members.
Signature · 1 line
Florian
Re: [PATCH 0/7] net: dsa: add QCA AR8xxx switch family support\
Quoted 26 lines · Florian Fainelli
Quoted 20 lines · Andrew Lunn
Quoted 6 lines · Mathieu Olivari
Quoted 5 lines · Andrew Lunn
FYI:
I have patches which allow DSA to use two cpu interfaces. Seems to work on my DIR665 with a Marvell Switch.
Quoted 6 lines
Quoted 3 lines
I will post the patches as an RFC.
Andrew
Does it require the switch CPU ports to support LAG or is it generic enough to allow switch partitioning?
When using tags, DSA by default partitions the switch. Each user port is separate from other ports. lan4 will not bridge to lan1 unless you either do it in software, or you implement the .port_join_bridge/.port_leave_bridge/.port_stp_update methods of
dsa_switch_driver.Quoted 4 lines
What it requires is that for each user port, you can configure what cpu port it should use. Marvell devices have this ability, and at a first look, it seems like SF2 does as well, but i will leave Florian to answer definitively.
Quoted 4 lines
That's right, such configuration happens by using
VLAN_CTLin the context of SF2, by default only Port <N> and CPU can talk to each other. Bridging ports involving putting them in the same domain, e.g: updating theVLAN_CTLbitmask to include all bridge members.
Similar here. That would work for ar8xxx too.
Quoted 2 lines
Signature · 1 line
Florian
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
Andrew Lunn
maintainerRe: [PATCH 0/7] net: dsa: add QCA AR8xxx switch family support\
Quoted 11 lines
Quoted 9 lines
Quoted 4 lines
What it requires is that for each user port, you can configure what cpu port it should use. Marvell devices have this ability, and at a first look, it seems like SF2 does as well, but i will leave Florian to answer definitively.
That's right, such configuration happens by using
VLAN_CTLin the context of SF2, by default only Port <N> and CPU can talk to each other. Bridging ports involving putting them in the same domain, e.g: updating theVLAN_CTLbitmask to include all bridge members.Similar here. That would work for ar8xxx too.
Great.
I posted the patches. Comments welcome and lets try to make them work for all device types, if they don't already.
Andre
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html