Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/patches/816791/?format=api
{ "id": 816791, "url": "http://patchwork.ozlabs.org/api/patches/816791/?format=api", "web_url": "http://patchwork.ozlabs.org/project/netdev/patch/20170921094139.4250-3-privat@egil-hjelmeland.no/", "project": { "id": 7, "url": "http://patchwork.ozlabs.org/api/projects/7/?format=api", "name": "Linux network development", "link_name": "netdev", "list_id": "netdev.vger.kernel.org", "list_email": "netdev@vger.kernel.org", "web_url": null, "scm_url": null, "webscm_url": null, "list_archive_url": "", "list_archive_url_format": "", "commit_url_format": "" }, "msgid": "<20170921094139.4250-3-privat@egil-hjelmeland.no>", "list_archive_url": null, "date": "2017-09-21T09:41:39", "name": "[net-next,2/2] net: dsa: lan9303: Add basic offloading of unicast traffic", "commit_ref": null, "pull_url": null, "state": "changes-requested", "archived": true, "hash": "f7ab343f1fc038421a22d7d0defa04d804792b1e", "submitter": { "id": 72044, "url": "http://patchwork.ozlabs.org/api/people/72044/?format=api", "name": "Egil Hjelmeland", "email": "privat@egil-hjelmeland.no" }, "delegate": { "id": 34, "url": "http://patchwork.ozlabs.org/api/users/34/?format=api", "username": "davem", "first_name": "David", "last_name": "Miller", "email": "davem@davemloft.net" }, "mbox": "http://patchwork.ozlabs.org/project/netdev/patch/20170921094139.4250-3-privat@egil-hjelmeland.no/mbox/", "series": [ { "id": 4342, "url": "http://patchwork.ozlabs.org/api/series/4342/?format=api", "web_url": "http://patchwork.ozlabs.org/project/netdev/list/?series=4342", "date": "2017-09-21T09:41:38", "name": "lan9303: Add basic offloading of unicast traffic", "version": 1, "mbox": "http://patchwork.ozlabs.org/series/4342/mbox/" } ], "comments": "http://patchwork.ozlabs.org/api/patches/816791/comments/", "check": "pending", "checks": "http://patchwork.ozlabs.org/api/patches/816791/checks/", "tags": {}, "related": [], "headers": { "Return-Path": "<netdev-owner@vger.kernel.org>", "X-Original-To": "patchwork-incoming@ozlabs.org", "Delivered-To": "patchwork-incoming@ozlabs.org", "Authentication-Results": "ozlabs.org;\n\tspf=none (mailfrom) smtp.mailfrom=vger.kernel.org\n\t(client-ip=209.132.180.67; helo=vger.kernel.org;\n\tenvelope-from=netdev-owner@vger.kernel.org;\n\treceiver=<UNKNOWN>)", "Received": [ "from vger.kernel.org (vger.kernel.org [209.132.180.67])\n\tby ozlabs.org (Postfix) with ESMTP id 3xyWrc0mhJz9ryv\n\tfor <patchwork-incoming@ozlabs.org>;\n\tThu, 21 Sep 2017 19:43:28 +1000 (AEST)", "(majordomo@vger.kernel.org) by vger.kernel.org via listexpand\n\tid S1751877AbdIUJmG (ORCPT <rfc822;patchwork-incoming@ozlabs.org>);\n\tThu, 21 Sep 2017 05:42:06 -0400", "from aibo.runbox.com ([91.220.196.211]:46530 \"EHLO aibo.runbox.com\"\n\trhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP\n\tid S1751864AbdIUJmF (ORCPT <rfc822;netdev@vger.kernel.org>);\n\tThu, 21 Sep 2017 05:42:05 -0400", "from [10.9.9.211] (helo=mailfront11.runbox.com)\n\tby mailtransmit02.runbox with esmtp (Exim 4.86_2)\n\t(envelope-from <privat@egil-hjelmeland.no>)\n\tid 1duxzd-0000Gi-GV; Thu, 21 Sep 2017 11:42:01 +0200", "from 93.89.113.32.ip.vitnett.no ([93.89.113.32]\n\thelo=localhost.localdomain)\n\tby mailfront11.runbox.com with esmtpsa (uid:646232 )\n\t(TLS1.2:DHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.82)\n\tid 1duxzS-0002Gh-5p; Thu, 21 Sep 2017 11:41:50 +0200" ], "From": "Egil Hjelmeland <privat@egil-hjelmeland.no>", "To": "andrew@lunn.ch, vivien.didelot@savoirfairelinux.com,\n\tf.fainelli@gmail.com, netdev@vger.kernel.org,\n\tlinux-kernel@vger.kernel.org", "Cc": "Egil Hjelmeland <privat@egil-hjelmeland.no>", "Subject": "[PATCH net-next 2/2] net: dsa: lan9303: Add basic offloading of\n\tunicast traffic", "Date": "Thu, 21 Sep 2017 11:41:39 +0200", "Message-Id": "<20170921094139.4250-3-privat@egil-hjelmeland.no>", "X-Mailer": "git-send-email 2.11.0", "In-Reply-To": "<20170921094139.4250-1-privat@egil-hjelmeland.no>", "References": "<20170921094139.4250-1-privat@egil-hjelmeland.no>", "Sender": "netdev-owner@vger.kernel.org", "Precedence": "bulk", "List-ID": "<netdev.vger.kernel.org>", "X-Mailing-List": "netdev@vger.kernel.org" }, "content": "When both user ports are joined to the same bridge, the normal\nHW MAC learning is enabled. This means that unicast traffic is forwarded\nin HW.\n\nIf one of the user ports leave the bridge,\nthe ports goes back to the initial separated operation.\n\nPort separation relies on disabled HW MAC learning. Hence the condition\nthat both ports must join same bridge.\n\nAdd brigde methods port_bridge_join, port_bridge_leave and\nport_stp_state_set.\n\nSigned-off-by: Egil Hjelmeland <privat@egil-hjelmeland.no>\n---\n drivers/net/dsa/lan9303-core.c | 88 ++++++++++++++++++++++++++++++++++++++++++\n drivers/net/dsa/lan9303.h | 1 +\n 2 files changed, 89 insertions(+)", "diff": "diff --git a/drivers/net/dsa/lan9303-core.c b/drivers/net/dsa/lan9303-core.c\nindex bba875e114e7..76112674fe6a 100644\n--- a/drivers/net/dsa/lan9303-core.c\n+++ b/drivers/net/dsa/lan9303-core.c\n@@ -18,6 +18,7 @@\n #include <linux/mutex.h>\n #include <linux/mii.h>\n #include <linux/phy.h>\n+#include <linux/if_bridge.h>\n \n #include \"lan9303.h\"\n \n@@ -146,6 +147,7 @@\n # define LAN9303_SWE_PORT_STATE_FORWARDING_PORT0 (0)\n # define LAN9303_SWE_PORT_STATE_LEARNING_PORT0 BIT(1)\n # define LAN9303_SWE_PORT_STATE_BLOCKING_PORT0 BIT(0)\n+# define LAN9303_SWE_PORT_STATE_DISABLED_PORT0 (3)\n #define LAN9303_SWE_PORT_MIRROR 0x1846\n # define LAN9303_SWE_PORT_MIRROR_SNIFF_ALL BIT(8)\n # define LAN9303_SWE_PORT_MIRROR_SNIFFER_PORT2 BIT(7)\n@@ -431,6 +433,20 @@ static int lan9303_read_switch_reg(struct lan9303 *chip, u16 regnum, u32 *val)\n \treturn ret;\n }\n \n+static int lan9303_write_switch_reg_mask(\n+\tstruct lan9303 *chip, u16 regnum, u32 val, u32 mask)\n+{\n+\tint ret;\n+\tu32 reg;\n+\n+\tret = lan9303_read_switch_reg(chip, regnum, ®);\n+\tif (ret)\n+\t\treturn ret;\n+\treg = (reg & ~mask) | val;\n+\n+\treturn lan9303_write_switch_reg(chip, regnum, reg);\n+}\n+\n static int lan9303_write_switch_port(struct lan9303 *chip, int port,\n \t\t\t\t u16 regnum, u32 val)\n {\n@@ -556,6 +572,12 @@ static int lan9303_separate_ports(struct lan9303 *chip)\n \t\t\t\tLAN9303_SWE_PORT_STATE_BLOCKING_PORT2);\n }\n \n+static void lan9303_bridge_ports(struct lan9303 *chip)\n+{\n+\t/* ports bridged: remove mirroring */\n+\tlan9303_write_switch_reg(chip, LAN9303_SWE_PORT_MIRROR, 0);\n+}\n+\n static int lan9303_handle_reset(struct lan9303 *chip)\n {\n \tif (!chip->reset_gpio)\n@@ -844,6 +866,69 @@ static void lan9303_port_disable(struct dsa_switch *ds, int port,\n \t}\n }\n \n+static int lan9303_port_bridge_join(struct dsa_switch *ds, int port,\n+\t\t\t\t struct net_device *br)\n+{\n+\tstruct lan9303 *chip = ds->priv;\n+\n+\tdev_dbg(chip->dev, \"%s(port %d)\\n\", __func__, port);\n+\tif (ds->ports[1].bridge_dev == ds->ports[2].bridge_dev) {\n+\t\tlan9303_bridge_ports(chip);\n+\t\tchip->is_bridged = true; /* unleash stp_state_set() */\n+\t}\n+\n+\treturn 0;\n+}\n+\n+static void lan9303_port_bridge_leave(struct dsa_switch *ds, int port,\n+\t\t\t\t struct net_device *br)\n+{\n+\tstruct lan9303 *chip = ds->priv;\n+\n+\tdev_dbg(chip->dev, \"%s(port %d)\\n\", __func__, port);\n+\tif (chip->is_bridged) {\n+\t\tlan9303_separate_ports(chip);\n+\t\tchip->is_bridged = false;\n+\t}\n+}\n+\n+static void lan9303_port_stp_state_set(struct dsa_switch *ds, int port,\n+\t\t\t\t u8 state)\n+{\n+\tint portmask, portstate;\n+\tstruct lan9303 *chip = ds->priv;\n+\n+\tdev_dbg(chip->dev, \"%s(port %d, state %d)\\n\",\n+\t\t__func__, port, state);\n+\tif (!chip->is_bridged)\n+\t\treturn; /* touching SWE_PORT_STATE will break port separation */\n+\n+\tswitch (state) {\n+\tcase BR_STATE_DISABLED:\n+\t\tportstate = LAN9303_SWE_PORT_STATE_DISABLED_PORT0;\n+\t\tbreak;\n+\tcase BR_STATE_BLOCKING:\n+\tcase BR_STATE_LISTENING:\n+\t\tportstate = LAN9303_SWE_PORT_STATE_BLOCKING_PORT0;\n+\t\tbreak;\n+\tcase BR_STATE_LEARNING:\n+\t\tportstate = LAN9303_SWE_PORT_STATE_LEARNING_PORT0;\n+\t\tbreak;\n+\tcase BR_STATE_FORWARDING:\n+\t\tportstate = LAN9303_SWE_PORT_STATE_FORWARDING_PORT0;\n+\t\tbreak;\n+\tdefault:\n+\t\tportstate = LAN9303_SWE_PORT_STATE_DISABLED_PORT0;\n+\t\tdev_err(chip->dev, \"unknown stp state: port %d, state %d\\n\",\n+\t\t\tport, state);\n+\t}\n+\n+\tportmask = 0x3 << (port * 2);\n+\tportstate <<= (port * 2);\n+\tlan9303_write_switch_reg_mask(chip, LAN9303_SWE_PORT_STATE,\n+\t\t\t\t portstate, portmask);\n+}\n+\n static const struct dsa_switch_ops lan9303_switch_ops = {\n \t.get_tag_protocol = lan9303_get_tag_protocol,\n \t.setup = lan9303_setup,\n@@ -855,6 +940,9 @@ static const struct dsa_switch_ops lan9303_switch_ops = {\n \t.get_sset_count = lan9303_get_sset_count,\n \t.port_enable = lan9303_port_enable,\n \t.port_disable = lan9303_port_disable,\n+\t.port_bridge_join = lan9303_port_bridge_join,\n+\t.port_bridge_leave = lan9303_port_bridge_leave,\n+\t.port_stp_state_set = lan9303_port_stp_state_set,\n };\n \n static int lan9303_register_switch(struct lan9303 *chip)\ndiff --git a/drivers/net/dsa/lan9303.h b/drivers/net/dsa/lan9303.h\nindex 4d8be555ff4d..5be246f05965 100644\n--- a/drivers/net/dsa/lan9303.h\n+++ b/drivers/net/dsa/lan9303.h\n@@ -21,6 +21,7 @@ struct lan9303 {\n \tstruct dsa_switch *ds;\n \tstruct mutex indirect_mutex; /* protect indexed register access */\n \tconst struct lan9303_phy_ops *ops;\n+\tbool is_bridged; /* true if port 1 and 2 is bridged */\n };\n \n extern const struct regmap_access_table lan9303_register_set;\n", "prefixes": [ "net-next", "2/2" ] }