mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
* [PATCH v2 net-next 0/2]  net: dsa: lan9303: Learn addresses on CPU port when bridged
@ 2017-10-26  9:00 Egil Hjelmeland
  2017-10-26  9:00 ` [PATCH v2 net-next 1/2] net: dsa: lan9303: Move struct lan9303 to include/linux/dsa/lan9303.h Egil Hjelmeland
                   ` (2 more replies)
  0 siblings, 3 replies; 5+ messages in thread
From: Egil Hjelmeland @ 2017-10-26  9:00 UTC (permalink / raw)
  To: andrew, vivien.didelot, f.fainelli, netdev, linux-kernel; +Cc: Egil Hjelmeland

When CPU transmit directly to port using tag, the LAN9303 does not
learn MAC addresses received on the CPU port into the ALR table.
ALR learning is performed only when transmitting using ALR lookup.

Solution:
If the two external ports are bridged and the packet is not STP BPDU,
then use ALR lookup to allow ALR learning on CPU port.
Otherwise transmit directly to port with STP state override.

The first patch moves struct lan9303 to include/linux/dsa/lan9303.h in
order to prepare for the second patch. 

Changes v1 -> v2:
 - new file: include/linux/dsa/lan9303.h instead of include/linux/lan9303.h
 - include linux/if_ether.h in include/linux/dsa/lan9303.h
 - renamed lan9303_tx_use_arl to lan9303_xmit_use_arl for consistency.
 - removed inline keyword to lan9303_xmit_use_arl


Egil Hjelmeland (2):
  net: dsa: lan9303: Move struct lan9303 to include/linux/dsa/lan9303.h
  net: dsa: lan9303: Learn addresses on CPU port when bridged

 MAINTAINERS                 |  1 +
 drivers/net/dsa/lan9303.h   | 34 +---------------------------------
 include/linux/dsa/lan9303.h | 36 ++++++++++++++++++++++++++++++++++++
 net/dsa/tag_lan9303.c       | 23 ++++++++++++++++++++++-
 4 files changed, 60 insertions(+), 34 deletions(-)
 create mode 100644 include/linux/dsa/lan9303.h

-- 
2.11.0

^ permalink raw reply	[flat|nested] 5+ messages in thread

* [PATCH v2 net-next 1/2] net: dsa: lan9303: Move struct lan9303 to include/linux/dsa/lan9303.h
  2017-10-26  9:00 [PATCH v2 net-next 0/2] net: dsa: lan9303: Learn addresses on CPU port when bridged Egil Hjelmeland
@ 2017-10-26  9:00 ` Egil Hjelmeland
  2017-10-26  9:00 ` [PATCH v2 net-next 2/2] net: dsa: lan9303: Learn addresses on CPU port when bridged Egil Hjelmeland
  2017-10-27 14:31 ` [PATCH v2 net-next 0/2] " David Miller
  2 siblings, 0 replies; 5+ messages in thread
From: Egil Hjelmeland @ 2017-10-26  9:00 UTC (permalink / raw)
  To: andrew, vivien.didelot, f.fainelli, netdev, linux-kernel; +Cc: Egil Hjelmeland

The next patch require net/dsa/tag_lan9303.c to access struct lan9303.
Therefore move struct lan9303 definitions from drivers/net/dsa/lan9303.h
to new file include/linux/dsa/lan9303.h.

Signed-off-by: Egil Hjelmeland <privat@egil-hjelmeland.no>
Reviewed-by: Andrew Lunn <andrew@lunn.ch>
---
 MAINTAINERS                 |  1 +
 drivers/net/dsa/lan9303.h   | 34 +---------------------------------
 include/linux/dsa/lan9303.h | 36 ++++++++++++++++++++++++++++++++++++
 3 files changed, 38 insertions(+), 33 deletions(-)
 create mode 100644 include/linux/dsa/lan9303.h

diff --git a/MAINTAINERS b/MAINTAINERS
index e3a7ca9d2783..c9ee7abf4627 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -9415,6 +9415,7 @@ M:	Florian Fainelli <f.fainelli@gmail.com>
 S:	Maintained
 F:	net/dsa/
 F:	include/net/dsa.h
+F:	include/linux/dsa/
 F:	drivers/net/dsa/
 
 NETWORKING [GENERAL]
diff --git a/drivers/net/dsa/lan9303.h b/drivers/net/dsa/lan9303.h
index d807b1be35f2..b868e5040830 100644
--- a/drivers/net/dsa/lan9303.h
+++ b/drivers/net/dsa/lan9303.h
@@ -2,39 +2,7 @@
 #include <linux/device.h>
 #include <net/dsa.h>
 
-struct lan9303;
-
-struct lan9303_phy_ops {
-	/* PHY 1 and 2 access*/
-	int	(*phy_read)(struct lan9303 *chip, int port, int regnum);
-	int	(*phy_write)(struct lan9303 *chip, int port,
-			     int regnum, u16 val);
-};
-
-#define LAN9303_NUM_ALR_RECORDS 512
-struct lan9303_alr_cache_entry {
-	u8  mac_addr[ETH_ALEN];
-	u8  port_map;           /* Bitmap of ports. Zero if unused entry */
-	u8  stp_override;       /* non zero if set ALR_DAT1_AGE_OVERRID */
-};
-
-struct lan9303 {
-	struct device *dev;
-	struct regmap *regmap;
-	struct regmap_irq_chip_data *irq_data;
-	struct gpio_desc *reset_gpio;
-	u32 reset_duration; /* in [ms] */
-	bool phy_addr_sel_strap;
-	struct dsa_switch *ds;
-	struct mutex indirect_mutex; /* protect indexed register access */
-	const struct lan9303_phy_ops *ops;
-	bool is_bridged; /* true if port 1 and 2 are bridged */
-	u32 swe_port_state; /* remember SWE_PORT_STATE while not bridged */
-	/* LAN9303 do not offer reading specific ALR entry. Cache all
-	 * static entries in a flat table
-	 **/
-	struct lan9303_alr_cache_entry alr_cache[LAN9303_NUM_ALR_RECORDS];
-};
+#include <linux/dsa/lan9303.h>
 
 extern const struct regmap_access_table lan9303_register_set;
 extern const struct lan9303_phy_ops lan9303_indirect_phy_ops;
diff --git a/include/linux/dsa/lan9303.h b/include/linux/dsa/lan9303.h
new file mode 100644
index 000000000000..05d8d136baab
--- /dev/null
+++ b/include/linux/dsa/lan9303.h
@@ -0,0 +1,36 @@
+/* Included by drivers/net/dsa/lan9303.h and net/dsa/tag_lan9303.c */
+#include <linux/if_ether.h>
+
+struct lan9303;
+
+struct lan9303_phy_ops {
+	/* PHY 1 and 2 access*/
+	int	(*phy_read)(struct lan9303 *chip, int port, int regnum);
+	int	(*phy_write)(struct lan9303 *chip, int port,
+			     int regnum, u16 val);
+};
+
+#define LAN9303_NUM_ALR_RECORDS 512
+struct lan9303_alr_cache_entry {
+	u8  mac_addr[ETH_ALEN];
+	u8  port_map;           /* Bitmap of ports. Zero if unused entry */
+	u8  stp_override;       /* non zero if set ALR_DAT1_AGE_OVERRID */
+};
+
+struct lan9303 {
+	struct device *dev;
+	struct regmap *regmap;
+	struct regmap_irq_chip_data *irq_data;
+	struct gpio_desc *reset_gpio;
+	u32 reset_duration; /* in [ms] */
+	bool phy_addr_sel_strap;
+	struct dsa_switch *ds;
+	struct mutex indirect_mutex; /* protect indexed register access */
+	const struct lan9303_phy_ops *ops;
+	bool is_bridged; /* true if port 1 and 2 are bridged */
+	u32 swe_port_state; /* remember SWE_PORT_STATE while not bridged */
+	/* LAN9303 do not offer reading specific ALR entry. Cache all
+	 * static entries in a flat table
+	 **/
+	struct lan9303_alr_cache_entry alr_cache[LAN9303_NUM_ALR_RECORDS];
+};
-- 
2.11.0

^ permalink raw reply	[flat|nested] 5+ messages in thread

* [PATCH v2 net-next 2/2] net: dsa: lan9303: Learn addresses on CPU port when bridged
  2017-10-26  9:00 [PATCH v2 net-next 0/2] net: dsa: lan9303: Learn addresses on CPU port when bridged Egil Hjelmeland
  2017-10-26  9:00 ` [PATCH v2 net-next 1/2] net: dsa: lan9303: Move struct lan9303 to include/linux/dsa/lan9303.h Egil Hjelmeland
@ 2017-10-26  9:00 ` Egil Hjelmeland
  2017-10-26 14:38   ` Andrew Lunn
  2017-10-27 14:31 ` [PATCH v2 net-next 0/2] " David Miller
  2 siblings, 1 reply; 5+ messages in thread
From: Egil Hjelmeland @ 2017-10-26  9:00 UTC (permalink / raw)
  To: andrew, vivien.didelot, f.fainelli, netdev, linux-kernel; +Cc: Egil Hjelmeland

When CPU transmit directly to port using tag, the LAN9303 does not
learn MAC addresses received on the CPU port into the ALR.
ALR learning is performed only when transmitting using ALR lookup.

Solution:
If the two external ports are bridged and the packet is not STP BPDU,
then use ALR lookup to allow ALR learning on CPU port.
Otherwise transmit directly to port with STP state override.

Signed-off-by: Egil Hjelmeland <privat@egil-hjelmeland.no>
---
 net/dsa/tag_lan9303.c | 23 ++++++++++++++++++++++-
 1 file changed, 22 insertions(+), 1 deletion(-)

diff --git a/net/dsa/tag_lan9303.c b/net/dsa/tag_lan9303.c
index 57519597c6fc..64092325aac3 100644
--- a/net/dsa/tag_lan9303.c
+++ b/net/dsa/tag_lan9303.c
@@ -11,6 +11,7 @@
  * GNU General Public License for more details.
  *
  */
+#include <linux/dsa/lan9303.h>
 #include <linux/etherdevice.h>
 #include <linux/list.h>
 #include <linux/slab.h>
@@ -39,6 +40,23 @@
  */
 
 #define LAN9303_TAG_LEN 4
+# define LAN9303_TAG_TX_USE_ALR BIT(3)
+# define LAN9303_TAG_TX_STP_OVERRIDE BIT(4)
+#define eth_stp_addr eth_reserved_addr_base
+
+/* Decide whether to transmit using ALR lookup, or transmit directly to
+ * port using tag. ALR learning is performed only when using ALR lookup.
+ * If the two external ports are bridged and the packet is not STP BPDU,
+ * then use ALR lookup to allow ALR learning on CPU port.
+ * Otherwise transmit directly to port with STP state override.
+ * See also: lan9303_separate_ports() and lan9303.pdf 6.4.10.1
+ */
+static int lan9303_xmit_use_arl(struct dsa_port *dp, u8 *dest_addr)
+{
+	struct lan9303 *chip = dp->ds->priv;
+
+	return chip->is_bridged && !ether_addr_equal(dest_addr, eth_stp_addr);
+}
 
 static struct sk_buff *lan9303_xmit(struct sk_buff *skb, struct net_device *dev)
 {
@@ -62,7 +80,10 @@ static struct sk_buff *lan9303_xmit(struct sk_buff *skb, struct net_device *dev)
 
 	lan9303_tag = (u16 *)(skb->data + 2 * ETH_ALEN);
 	lan9303_tag[0] = htons(ETH_P_8021Q);
-	lan9303_tag[1] = htons(dp->index | BIT(4));
+	lan9303_tag[1] = lan9303_xmit_use_arl(dp, skb->data) ?
+				LAN9303_TAG_TX_USE_ALR :
+				dp->index | LAN9303_TAG_TX_STP_OVERRIDE;
+	lan9303_tag[1] = htons(lan9303_tag[1]);
 
 	return skb;
 }
-- 
2.11.0

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH v2 net-next 2/2] net: dsa: lan9303: Learn addresses on CPU port when bridged
  2017-10-26  9:00 ` [PATCH v2 net-next 2/2] net: dsa: lan9303: Learn addresses on CPU port when bridged Egil Hjelmeland
@ 2017-10-26 14:38   ` Andrew Lunn
  0 siblings, 0 replies; 5+ messages in thread
From: Andrew Lunn @ 2017-10-26 14:38 UTC (permalink / raw)
  To: Egil Hjelmeland; +Cc: vivien.didelot, f.fainelli, netdev, linux-kernel

On Thu, Oct 26, 2017 at 11:00:49AM +0200, Egil Hjelmeland wrote:
> When CPU transmit directly to port using tag, the LAN9303 does not
> learn MAC addresses received on the CPU port into the ALR.
> ALR learning is performed only when transmitting using ALR lookup.
> 
> Solution:
> If the two external ports are bridged and the packet is not STP BPDU,
> then use ALR lookup to allow ALR learning on CPU port.
> Otherwise transmit directly to port with STP state override.
> 
> Signed-off-by: Egil Hjelmeland <privat@egil-hjelmeland.no>

Reviewed-by: Andrew Lunn <andrew@lunn.ch>

    Andrew

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH v2 net-next 0/2] net: dsa: lan9303: Learn addresses on CPU port when bridged
  2017-10-26  9:00 [PATCH v2 net-next 0/2] net: dsa: lan9303: Learn addresses on CPU port when bridged Egil Hjelmeland
  2017-10-26  9:00 ` [PATCH v2 net-next 1/2] net: dsa: lan9303: Move struct lan9303 to include/linux/dsa/lan9303.h Egil Hjelmeland
  2017-10-26  9:00 ` [PATCH v2 net-next 2/2] net: dsa: lan9303: Learn addresses on CPU port when bridged Egil Hjelmeland
@ 2017-10-27 14:31 ` David Miller
  2 siblings, 0 replies; 5+ messages in thread
From: David Miller @ 2017-10-27 14:31 UTC (permalink / raw)
  To: privat; +Cc: andrew, vivien.didelot, f.fainelli, netdev, linux-kernel

From: Egil Hjelmeland <privat@egil-hjelmeland.no>
Date: Thu, 26 Oct 2017 11:00:47 +0200

> When CPU transmit directly to port using tag, the LAN9303 does not
> learn MAC addresses received on the CPU port into the ALR table.
> ALR learning is performed only when transmitting using ALR lookup.
> 
> Solution:
> If the two external ports are bridged and the packet is not STP BPDU,
> then use ALR lookup to allow ALR learning on CPU port.
> Otherwise transmit directly to port with STP state override.
> 
> The first patch moves struct lan9303 to include/linux/dsa/lan9303.h in
> order to prepare for the second patch. 
> 
> Changes v1 -> v2:
>  - new file: include/linux/dsa/lan9303.h instead of include/linux/lan9303.h
>  - include linux/if_ether.h in include/linux/dsa/lan9303.h
>  - renamed lan9303_tx_use_arl to lan9303_xmit_use_arl for consistency.
>  - removed inline keyword to lan9303_xmit_use_arl

Series applied, thank you!

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2017-10-27 14:31 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-10-26  9:00 [PATCH v2 net-next 0/2] net: dsa: lan9303: Learn addresses on CPU port when bridged Egil Hjelmeland
2017-10-26  9:00 ` [PATCH v2 net-next 1/2] net: dsa: lan9303: Move struct lan9303 to include/linux/dsa/lan9303.h Egil Hjelmeland
2017-10-26  9:00 ` [PATCH v2 net-next 2/2] net: dsa: lan9303: Learn addresses on CPU port when bridged Egil Hjelmeland
2017-10-26 14:38   ` Andrew Lunn
2017-10-27 14:31 ` [PATCH v2 net-next 0/2] " David Miller

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

Powered by JetHome