From patchwork Wed Jan 30 00:55:37 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Florian Fainelli X-Patchwork-Id: 1033090 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="H0ukQyMy"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 43q4jD0ytvz9sBn for ; Wed, 30 Jan 2019 11:57:52 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727584AbfA3A5s (ORCPT ); Tue, 29 Jan 2019 19:57:48 -0500 Received: from mail-pl1-f196.google.com ([209.85.214.196]:44684 "EHLO mail-pl1-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727542AbfA3A5s (ORCPT ); Tue, 29 Jan 2019 19:57:48 -0500 Received: by mail-pl1-f196.google.com with SMTP id e11so10196377plt.11 for ; Tue, 29 Jan 2019 16:57:48 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=wc9CO6wt6GxEFh2balP2MsV9Pn/6V+hUg7OeAQiS3IE=; b=H0ukQyMykyF94ynnUzSgL+0GAYwO/oIFG2bfJ5aDtFfAxNevZ2tH/WL5GGQpR4zdUR eqGK0/JADLV5YZG18VclbOBE9MIBYuyVyCuh6LS0q5Hhe5OUogk5irijV3sRgJyU0ZAj F7hwyXXPgIrBVxSSukQ1YWSOdH2U1boosYrSy7cXfjEpwPdHr+Al+3/4pU9sCxRY1Hoz yBdJvj9NvnnRuN32wj/YL6flQMIFlf6b9dfB8b9IHR4riUiXshEw9J5dDpLIPCqhoUZu 8oz+fPcdwBpdWWoG6UjmuC5e6KWYes1b6RGsmoFALhJhd2kAZNDmWMYa0IvOfYoMFfYS W0RA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=wc9CO6wt6GxEFh2balP2MsV9Pn/6V+hUg7OeAQiS3IE=; b=iOom+/9XE3a2+hOOFxdYubmH3+T2///qholPKj8IukIH9ansDOkqxMJVTFxV8xtUSm 2Ct7A7SBEqvr/5bE9+R4OxqnequUJ7ctpIlrdN6wYJ6A/jlb6ONsJHJhEsE4QM+yJlV3 muqYNZlv288oALQMLtzICP0tS2hTdqn0TBQxU20KEztrgL9dxdaeQUncl15ooib7v9Ax FsT0knY2jwGRXjl5B/7rfaFAXO2zoMLP2l5Fst/c51QJd9n5kOEY9ZUKCz5o45qTDG58 vT49zvvr9z9kdZ7KW2DZi8P47o6K/N4XCuONJmrgtqI/Tq9oXLkVklIPckKtNtcXt8TO GJmw== X-Gm-Message-State: AJcUukfvq3DwwR2Siw72T3MAz0FEG/g9bmJqPIdMi9zj3Uzv4IyjxSpt FsIP6h43ZToSV/6ECmxPFGmqn9HC X-Google-Smtp-Source: ALg8bN5U0iU9//+P6w8jwBI0U+IgOgHt3p/fKSoLMdbuPC4ik9xkba6qvv1SN6sqHKNsviU/cDRoCQ== X-Received: by 2002:a17:902:8687:: with SMTP id g7mr27944062plo.96.1548809867010; Tue, 29 Jan 2019 16:57:47 -0800 (PST) Received: from fainelli-desktop.igp.broadcom.net ([192.19.223.250]) by smtp.gmail.com with ESMTPSA id v191sm67837137pgb.77.2019.01.29.16.57.44 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 29 Jan 2019 16:57:44 -0800 (PST) From: Florian Fainelli To: netdev@vger.kernel.org Cc: Florian Fainelli , andrew@lunn.ch, vivien.didelot@gmail.com, davem@davemloft.net, idosch@mellanox.com, jiri@mellanox.com, ilias.apalodimas@linaro.org, ivan.khoronzhuk@linaro.org, roopa@cumulusnetworks.com, nikolay@cumulusnetworks.com Subject: [PATCH net-next v2 01/12] net: bridge: multicast: Propagate br_mc_disabled_update() return Date: Tue, 29 Jan 2019 16:55:37 -0800 Message-Id: <20190130005548.2212-2-f.fainelli@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190130005548.2212-1-f.fainelli@gmail.com> References: <20190130005548.2212-1-f.fainelli@gmail.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Some Ethernet switches might not be able to support disabling multicast flooding globally when e.g: several bridges span the same physical device, propagate the return value of br_mc_disabled_update() such that this propagates correctly to user-space. Signed-off-by: Florian Fainelli --- net/bridge/br_multicast.c | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/net/bridge/br_multicast.c b/net/bridge/br_multicast.c index 3aeff0895669..aff5e003d34f 100644 --- a/net/bridge/br_multicast.c +++ b/net/bridge/br_multicast.c @@ -813,20 +813,22 @@ static void br_ip6_multicast_port_query_expired(struct timer_list *t) } #endif -static void br_mc_disabled_update(struct net_device *dev, bool value) +static int br_mc_disabled_update(struct net_device *dev, bool value) { struct switchdev_attr attr = { .orig_dev = dev, .id = SWITCHDEV_ATTR_ID_BRIDGE_MC_DISABLED, - .flags = SWITCHDEV_F_DEFER, + .flags = SWITCHDEV_F_DEFER | SWITCHDEV_F_SKIP_EOPNOTSUPP, .u.mc_disabled = !value, }; - switchdev_port_attr_set(dev, &attr); + return switchdev_port_attr_set(dev, &attr); } int br_multicast_add_port(struct net_bridge_port *port) { + int ret; + port->multicast_router = MDB_RTR_TYPE_TEMP_QUERY; timer_setup(&port->multicast_router_timer, @@ -837,8 +839,11 @@ int br_multicast_add_port(struct net_bridge_port *port) timer_setup(&port->ip6_own_query.timer, br_ip6_multicast_port_query_expired, 0); #endif - br_mc_disabled_update(port->dev, - br_opt_get(port->br, BROPT_MULTICAST_ENABLED)); + ret = br_mc_disabled_update(port->dev, + br_opt_get(port->br, + BROPT_MULTICAST_ENABLED)); + if (ret) + return ret; port->mcast_stats = netdev_alloc_pcpu_stats(struct bridge_mcast_stats); if (!port->mcast_stats) @@ -1937,12 +1942,16 @@ static void br_multicast_start_querier(struct net_bridge *br, int br_multicast_toggle(struct net_bridge *br, unsigned long val) { struct net_bridge_port *port; + int err = 0; spin_lock_bh(&br->multicast_lock); if (!!br_opt_get(br, BROPT_MULTICAST_ENABLED) == !!val) goto unlock; - br_mc_disabled_update(br->dev, val); + err = br_mc_disabled_update(br->dev, val); + if (err) + goto unlock; + br_opt_toggle(br, BROPT_MULTICAST_ENABLED, !!val); if (!br_opt_get(br, BROPT_MULTICAST_ENABLED)) goto unlock; @@ -1957,7 +1966,7 @@ int br_multicast_toggle(struct net_bridge *br, unsigned long val) unlock: spin_unlock_bh(&br->multicast_lock); - return 0; + return err; } bool br_multicast_enabled(const struct net_device *dev) From patchwork Wed Jan 30 00:55:38 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Florian Fainelli X-Patchwork-Id: 1033091 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="J5jutoUp"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 43q4jD61vcz9s9h for ; Wed, 30 Jan 2019 11:57:52 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727640AbfA3A5v (ORCPT ); Tue, 29 Jan 2019 19:57:51 -0500 Received: from mail-pg1-f193.google.com ([209.85.215.193]:45888 "EHLO mail-pg1-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727365AbfA3A5u (ORCPT ); Tue, 29 Jan 2019 19:57:50 -0500 Received: by mail-pg1-f193.google.com with SMTP id y4so9539910pgc.12 for ; Tue, 29 Jan 2019 16:57:50 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=y2qm7A+/CCgrfTstiWJF722XPuBVch01JWCyDALceMo=; b=J5jutoUpDrj4OYQchjDb1vI085XVkyHPq9y9ptyzA15uDgN254lE874WVlsvtEC2kW z9kCXvY8MnHBIhGvhpYWumrmqTX9TmY2rlL0UEfIe9qbNEGRxedyyUMl1mldEcgs1y/e KN900vgsbtA1pBhP0g+15AxUzh+kQT3kA7LuxO+Ik7YLfiX6qTEkCpm+qXwThoaJrgs/ qRhoULfG0vLUt3qIXT4v0NotbW6ArFMzmvx6QDCFh7iXZ7KtHS9RRHRheTQQeYBtM66H no/UVE0r1iTMqh1McPGLT0/UhkYOspa/fdQ0W9U34bmWiWPQpODbmdW2CQ7r66ckTrm+ sBZA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=y2qm7A+/CCgrfTstiWJF722XPuBVch01JWCyDALceMo=; b=KgRig8mws/Ip7RYCYdJIX/kH8xEaOAeE+rNzLCCBaL+jMlSZ4R8m/4EOiISrAoKoIB HSpvgZ67R7qKk/98By8cJ+Mkn1Ygxmq/rFDfSWt+6M5qBmW8boFbLH6rH7NJWH5eO1d4 HLrvWx0yIk6HlSxLBb1OCRu/FTI32SbSNTcLUBmIWi03WoHDOYbdlfbmAVPd5GmwwUrA ZYUGrYdgRQoFr5Py6IoYjcBG5G4dcE4HD3t6wyxZkkh3qO9vyO/6M71XbBh64z+zfSQ1 oT93/dqw5XZtdSQmol+hmElY5y+mNzY8M2J7S7TIEB2uD0C0lvEWCj9ZWYlR6OAJ754c jP7w== X-Gm-Message-State: AJcUukf47zaixdblb6jQGNEmsX16BgrwKn6EzOF02ubrXgttTWUk7uHa 4o7aZG704NOzK4U3ZhxuycZ8h+r4 X-Google-Smtp-Source: ALg8bN4TpCElqgdBV4z0IPEsJrEt4hIpnYrhB1L8FXPiPM7cXIdNRFGBjvq6RsEhGBDyg5ItWy1BSA== X-Received: by 2002:a63:304:: with SMTP id 4mr23490429pgd.99.1548809869104; Tue, 29 Jan 2019 16:57:49 -0800 (PST) Received: from fainelli-desktop.igp.broadcom.net ([192.19.223.250]) by smtp.gmail.com with ESMTPSA id v191sm67837137pgb.77.2019.01.29.16.57.47 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 29 Jan 2019 16:57:47 -0800 (PST) From: Florian Fainelli To: netdev@vger.kernel.org Cc: Florian Fainelli , andrew@lunn.ch, vivien.didelot@gmail.com, davem@davemloft.net, idosch@mellanox.com, jiri@mellanox.com, ilias.apalodimas@linaro.org, ivan.khoronzhuk@linaro.org, roopa@cumulusnetworks.com, nikolay@cumulusnetworks.com Subject: [PATCH net-next v2 02/12] net: dsa: b53: Fix default VLAN ID Date: Tue, 29 Jan 2019 16:55:38 -0800 Message-Id: <20190130005548.2212-3-f.fainelli@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190130005548.2212-1-f.fainelli@gmail.com> References: <20190130005548.2212-1-f.fainelli@gmail.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org We were not consistent in how the default VID of a given port was defined, b53_br_leave() would make sure the VLAN ID would be either 0/1 depending on the switch generation, but b53_configure_vlan(), which is the default configuration would unconditionally set it to 1. The correct value is 1 for 5325/5365 series and 0 otherwise. To avoid repeating that mistake ever again, introduce a helper function: b53_default_pvid() to factor that out. Fixes: 967dd82ffc52 ("net: dsa: b53: Add support for Broadcom RoboSwitch") Signed-off-by: Florian Fainelli --- drivers/net/dsa/b53/b53_common.c | 29 ++++++++++++++++------------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/drivers/net/dsa/b53/b53_common.c b/drivers/net/dsa/b53/b53_common.c index 0e4bbdcc614f..964a9ec4652a 100644 --- a/drivers/net/dsa/b53/b53_common.c +++ b/drivers/net/dsa/b53/b53_common.c @@ -632,15 +632,25 @@ static void b53_enable_mib(struct b53_device *dev) b53_write8(dev, B53_MGMT_PAGE, B53_GLOBAL_CONFIG, gc); } +static u16 b53_default_pvid(struct b53_device *dev) +{ + if (is5325(dev) || is5365(dev)) + return 1; + else + return 0; +} + int b53_configure_vlan(struct dsa_switch *ds) { struct b53_device *dev = ds->priv; struct b53_vlan vl = { 0 }; - int i; + int i, def_vid; + + def_vid = b53_default_pvid(dev); /* clear all vlan entries */ if (is5325(dev) || is5365(dev)) { - for (i = 1; i < dev->num_vlans; i++) + for (i = def_vid; i < dev->num_vlans; i++) b53_set_vlan_entry(dev, i, &vl); } else { b53_do_vlan_op(dev, VTA_CMD_CLEAR); @@ -650,7 +660,7 @@ int b53_configure_vlan(struct dsa_switch *ds) b53_for_each_port(dev, i) b53_write16(dev, B53_VLAN_PAGE, - B53_VLAN_PORT_DEF_TAG(i), 1); + B53_VLAN_PORT_DEF_TAG(i), def_vid); if (!is5325(dev) && !is5365(dev)) b53_set_jumbo(dev, dev->enable_jumbo, false); @@ -1326,12 +1336,8 @@ int b53_vlan_del(struct dsa_switch *ds, int port, vl->members &= ~BIT(port); - if (pvid == vid) { - if (is5325(dev) || is5365(dev)) - pvid = 1; - else - pvid = 0; - } + if (pvid == vid) + pvid = b53_default_pvid(dev); if (untagged && !dsa_is_cpu_port(ds, port)) vl->untag &= ~(BIT(port)); @@ -1644,10 +1650,7 @@ void b53_br_leave(struct dsa_switch *ds, int port, struct net_device *br) b53_write16(dev, B53_PVLAN_PAGE, B53_PVLAN_PORT_MASK(port), pvlan); dev->ports[port].vlan_ctl_mask = pvlan; - if (is5325(dev) || is5365(dev)) - pvid = 1; - else - pvid = 0; + pvid = b53_default_pvid(dev); /* Make this port join all VLANs without VLAN entries */ if (is58xx(dev)) { From patchwork Wed Jan 30 00:55:39 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Florian Fainelli X-Patchwork-Id: 1033094 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="vEEP+cgS"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 43q4jL3QnKz9sBZ for ; Wed, 30 Jan 2019 11:57:58 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727754AbfA3A5x (ORCPT ); Tue, 29 Jan 2019 19:57:53 -0500 Received: from mail-pg1-f193.google.com ([209.85.215.193]:43642 "EHLO mail-pg1-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727365AbfA3A5w (ORCPT ); Tue, 29 Jan 2019 19:57:52 -0500 Received: by mail-pg1-f193.google.com with SMTP id v28so9548656pgk.10 for ; Tue, 29 Jan 2019 16:57:51 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=Dn5Xrka7oPpFXUszSqf04vJKMymjYDaq2zGfoUQHWCo=; b=vEEP+cgS+MV8m16d0XMWTjg2r6ngkm+liLQWzuPuCAq6L9HP43seoHTDAGvdMOCBgA xEVRRFmx8MJV5giJu8OUt99z1jE19GnLwsVkUjA3CkCKq+PcGu8yaza6zFvZak5v8kNF 9ZauZDFBCrad2I4CWcXa7VyCmLMExhLrR1goBzpHSuSupE9qKnUzJ8RW39sNxgSywCeX kUOBMFPvspTYp8dm73RhMmEWE4/+hh6nckhe8KWIoQBL7/BWYOSrfNSK1yuYhUNwNNB+ FTPMxALh4cHkstQ4ntrjjWgtvLueXC7Rt1IVs9lI6cq3nOo6TlYruL71dkd4mVqEnRpW WbPQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=Dn5Xrka7oPpFXUszSqf04vJKMymjYDaq2zGfoUQHWCo=; b=QTd/aFA4+C/od9PMTcgjGihbt3PRcSS9MVkIgWxKaTzYWGPiRVBx1Ig3DggW6VbBCe gJOo0CgRDWvf8wXYMUWTE2YIPb7nUMxuMJZJP0vEPAbYl58QtlCENi9kvrFiXgRGUbqF xQ+xj0TPetUJWIZoQO53e1tjFAn7/mxEW/Iaa8tgVqdDFrsr7G6w2187pBuwV0FLAD9M ehxIHJ9i76nkG75Zwv0A677+ZufIXJGRRaTImNPTS31YCPZoLUJWYOyukfFJNR5Jf/v2 PcCiAIExZ4hYCkVz3sqoCo1PBnW0O9REA4EppQ03HflVUtuJTNgkiqavfYnXkQimk9W4 R1Zw== X-Gm-Message-State: AJcUukciKujY3COWlqCywixWIEiJtP02garVti77/5de/WeBZhIUe6xT m3XeV8Fm/1nBtTQNOxjEGXP6BrmV X-Google-Smtp-Source: ALg8bN5L71LaFy7zt+wCkk1i1lOj7Fz6gmt2n2CXz8oWZJ6H+UvWO9vXex6LzAatTJqCUHJLULos0g== X-Received: by 2002:a63:295:: with SMTP id 143mr25006507pgc.362.1548809870820; Tue, 29 Jan 2019 16:57:50 -0800 (PST) Received: from fainelli-desktop.igp.broadcom.net ([192.19.223.250]) by smtp.gmail.com with ESMTPSA id v191sm67837137pgb.77.2019.01.29.16.57.49 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 29 Jan 2019 16:57:49 -0800 (PST) From: Florian Fainelli To: netdev@vger.kernel.org Cc: Florian Fainelli , andrew@lunn.ch, vivien.didelot@gmail.com, davem@davemloft.net, idosch@mellanox.com, jiri@mellanox.com, ilias.apalodimas@linaro.org, ivan.khoronzhuk@linaro.org, roopa@cumulusnetworks.com, nikolay@cumulusnetworks.com Subject: [PATCH net-next v2 03/12] net: dsa: b53: Properly account for VLAN filtering Date: Tue, 29 Jan 2019 16:55:39 -0800 Message-Id: <20190130005548.2212-4-f.fainelli@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190130005548.2212-1-f.fainelli@gmail.com> References: <20190130005548.2212-1-f.fainelli@gmail.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org VLAN filtering can be built into the kernel, and also dynamically turned on/off through the bridge master device. Allow re-configuring the switch appropriately to account for that by deciding whether VLAN table (v_table) misses should lead to a drop or forward. Fixes: a2482d2ce349 ("net: dsa: b53: Plug in VLAN support") Signed-off-by: Florian Fainelli --- drivers/net/dsa/b53/b53_common.c | 59 +++++++++++++++++++++++++++++--- drivers/net/dsa/b53/b53_priv.h | 3 ++ 2 files changed, 57 insertions(+), 5 deletions(-) diff --git a/drivers/net/dsa/b53/b53_common.c b/drivers/net/dsa/b53/b53_common.c index 964a9ec4652a..2fef4c564420 100644 --- a/drivers/net/dsa/b53/b53_common.c +++ b/drivers/net/dsa/b53/b53_common.c @@ -344,7 +344,8 @@ static void b53_set_forwarding(struct b53_device *dev, int enable) b53_write8(dev, B53_CTRL_PAGE, B53_SWITCH_CTRL, mgmt); } -static void b53_enable_vlan(struct b53_device *dev, bool enable) +static void b53_enable_vlan(struct b53_device *dev, bool enable, + bool enable_filtering) { u8 mgmt, vc0, vc1, vc4 = 0, vc5; @@ -369,8 +370,13 @@ static void b53_enable_vlan(struct b53_device *dev, bool enable) vc0 |= VC0_VLAN_EN | VC0_VID_CHK_EN | VC0_VID_HASH_VID; vc1 |= VC1_RX_MCST_UNTAG_EN | VC1_RX_MCST_FWD_EN; vc4 &= ~VC4_ING_VID_CHECK_MASK; - vc4 |= VC4_ING_VID_VIO_DROP << VC4_ING_VID_CHECK_S; - vc5 |= VC5_DROP_VTABLE_MISS; + if (enable_filtering) { + vc4 |= VC4_ING_VID_VIO_DROP << VC4_ING_VID_CHECK_S; + vc5 |= VC5_DROP_VTABLE_MISS; + } else { + vc4 |= VC4_ING_VID_VIO_FWD << VC4_ING_VID_CHECK_S; + vc5 &= ~VC5_DROP_VTABLE_MISS; + } if (is5325(dev)) vc0 &= ~VC0_RESERVED_1; @@ -420,6 +426,9 @@ static void b53_enable_vlan(struct b53_device *dev, bool enable) } b53_write8(dev, B53_CTRL_PAGE, B53_SWITCH_MODE, mgmt); + + dev->vlan_enabled = enable; + dev->vlan_filtering_enabled = enable_filtering; } static int b53_set_jumbo(struct b53_device *dev, bool enable, bool allow_10_100) @@ -656,7 +665,7 @@ int b53_configure_vlan(struct dsa_switch *ds) b53_do_vlan_op(dev, VTA_CMD_CLEAR); } - b53_enable_vlan(dev, false); + b53_enable_vlan(dev, false, dev->vlan_filtering_enabled); b53_for_each_port(dev, i) b53_write16(dev, B53_VLAN_PAGE, @@ -1265,6 +1274,46 @@ EXPORT_SYMBOL(b53_phylink_mac_link_up); int b53_vlan_filtering(struct dsa_switch *ds, int port, bool vlan_filtering) { + struct b53_device *dev = ds->priv; + struct net_device *bridge_dev; + unsigned int i; + u16 pvid, new_pvid; + + /* Handle the case were multiple bridges span the same switch device + * and one of them has a different setting than what is being requested + * which would be breaking filtering semantics for any of the other + * bridge devices. + */ + b53_for_each_port(dev, i) { + bridge_dev = dsa_to_port(ds, i)->bridge_dev; + if (bridge_dev && + bridge_dev != dsa_to_port(ds, port)->bridge_dev && + br_vlan_enabled(bridge_dev) != vlan_filtering) { + netdev_err(bridge_dev, + "VLAN filtering is global to the switch!\n"); + return -EINVAL; + } + } + + b53_read16(dev, B53_VLAN_PAGE, B53_VLAN_PORT_DEF_TAG(port), &pvid); + new_pvid = pvid; + if (dev->vlan_filtering_enabled && !vlan_filtering) { + /* Filtering is currently enabled, use the default PVID since + * the bridge does not expect tagging anymore + */ + dev->ports[port].pvid = pvid; + new_pvid = b53_default_pvid(dev); + } else if (!dev->vlan_filtering_enabled && vlan_filtering) { + /* Filtering is currently disabled, restore the previous PVID */ + new_pvid = dev->ports[port].pvid; + } + + if (pvid != new_pvid) + b53_write16(dev, B53_VLAN_PAGE, B53_VLAN_PORT_DEF_TAG(port), + new_pvid); + + b53_enable_vlan(dev, dev->vlan_enabled, vlan_filtering); + return 0; } EXPORT_SYMBOL(b53_vlan_filtering); @@ -1280,7 +1329,7 @@ int b53_vlan_prepare(struct dsa_switch *ds, int port, if (vlan->vid_end > dev->num_vlans) return -ERANGE; - b53_enable_vlan(dev, true); + b53_enable_vlan(dev, true, dev->vlan_filtering_enabled); return 0; } diff --git a/drivers/net/dsa/b53/b53_priv.h b/drivers/net/dsa/b53/b53_priv.h index ec796482792d..4dc7ee38b258 100644 --- a/drivers/net/dsa/b53/b53_priv.h +++ b/drivers/net/dsa/b53/b53_priv.h @@ -91,6 +91,7 @@ enum { struct b53_port { u16 vlan_ctl_mask; struct ethtool_eee eee; + u16 pvid; }; struct b53_vlan { @@ -137,6 +138,8 @@ struct b53_device { unsigned int num_vlans; struct b53_vlan *vlans; + bool vlan_enabled; + bool vlan_filtering_enabled; unsigned int num_ports; struct b53_port *ports; }; From patchwork Wed Jan 30 00:55:40 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Florian Fainelli X-Patchwork-Id: 1033095 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="WXGs+HIq"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 43q4jM3x7Xz9s9h for ; Wed, 30 Jan 2019 11:57:59 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727818AbfA3A5z (ORCPT ); Tue, 29 Jan 2019 19:57:55 -0500 Received: from mail-pg1-f193.google.com ([209.85.215.193]:34464 "EHLO mail-pg1-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727739AbfA3A5y (ORCPT ); Tue, 29 Jan 2019 19:57:54 -0500 Received: by mail-pg1-f193.google.com with SMTP id j10so9574068pga.1 for ; Tue, 29 Jan 2019 16:57:53 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=HsO5n9L+refplPrRxaqotuOTnOW7UOzseqSjzGqsugI=; b=WXGs+HIqOcTnyhh6RWPZsDK/uS3GlcDSuD5Ann2ZadV5YZ6Gx2tY38DQGIIp1yq4K4 Wfm3q6zpGCn+4/zIABRWlcEaPkGk3LcS5uOPWS4Z3Cqj07D/0xljuNjGFKMqAH/yZVtq NQ4vjdeU4jFZQOEdEawnStqiLkWZLbKZbqCvORidsqzE9HYjdEYLvGMb2qAP1szMtW0q ntRm++H26v9t7yI6zXUu6CUlfJvPVyDr+lzhI+BoVTQoe+7hpP8n+kwQ9Qcrv3D+khf7 Hx0a9n0QWQ0v4dxYspFPdCmfznhzmZsmChNIqbgZVLLD0Md7vicn+n5IqhYjdsCy4Nf6 cewQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=HsO5n9L+refplPrRxaqotuOTnOW7UOzseqSjzGqsugI=; b=EDyW8HuSWNQ3ZF6T5gU/goSNVVPEU1+3cztsuMl1qfuBvN5p6LJ9xIZUxM6EQw4wnD L5H0NqWOrDHzuZfvf5sD/LvoS5FPeRb0WCs2jMG4/QBrf/c3OZMSlYkoxIBDXkcaaoAt +qs/759Bjb46BvKbOSerO0bxFAu5Plf//vvWmopWIBgtgIi5X0x1izgNkUaOoG5Ka+3+ e24iFcUdCZx2EqjdPbTW5Sw589rZ2yRp9q2ZP77befkabcXUrIWfvlIhNboO4+9Mfky4 sfKoVSmlmdjrTt9j/FADn/W9Vp5uD+7xvbw9+FGqYSCen9BiWTp89DlGBETtIh0Q9FbX 9fCQ== X-Gm-Message-State: AJcUukcsjpmLYLhEjdXfod2iKg7fA/QVEt605L+u6ImQY2dYF2tiTCo+ 2ODgq9XTqGIAV9rzWTDsRCoCCxSh X-Google-Smtp-Source: ALg8bN5IHRwR2F2NM7qyIJB9dch0ZplpbWGo/BXjiacKO+rCWHp4H5MSnWtuAozZkjUuzGb+DMhjxA== X-Received: by 2002:a63:e156:: with SMTP id h22mr25761948pgk.255.1548809872582; Tue, 29 Jan 2019 16:57:52 -0800 (PST) Received: from fainelli-desktop.igp.broadcom.net ([192.19.223.250]) by smtp.gmail.com with ESMTPSA id v191sm67837137pgb.77.2019.01.29.16.57.50 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 29 Jan 2019 16:57:51 -0800 (PST) From: Florian Fainelli To: netdev@vger.kernel.org Cc: Florian Fainelli , andrew@lunn.ch, vivien.didelot@gmail.com, davem@davemloft.net, idosch@mellanox.com, jiri@mellanox.com, ilias.apalodimas@linaro.org, ivan.khoronzhuk@linaro.org, roopa@cumulusnetworks.com, nikolay@cumulusnetworks.com Subject: [PATCH net-next v2 04/12] net: systemport: Fix reception of BPDUs Date: Tue, 29 Jan 2019 16:55:40 -0800 Message-Id: <20190130005548.2212-5-f.fainelli@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190130005548.2212-1-f.fainelli@gmail.com> References: <20190130005548.2212-1-f.fainelli@gmail.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org SYSTEMPORT has its RXCHK parser block that attempts to validate the packet structures, unfortunately setting the L2 header check bit will cause Bridge PDUs (BPDUs) to be incorrectly rejected because they look like LLC/SNAP packets with a non-IPv4 or non-IPv6 Ethernet Type. Fixes: 4e8aedfe78c7 ("net: systemport: Turn on offloads by default") Signed-off-by: Florian Fainelli --- drivers/net/ethernet/broadcom/bcmsysport.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/drivers/net/ethernet/broadcom/bcmsysport.c b/drivers/net/ethernet/broadcom/bcmsysport.c index f9521d0274b7..f374c8ddf719 100644 --- a/drivers/net/ethernet/broadcom/bcmsysport.c +++ b/drivers/net/ethernet/broadcom/bcmsysport.c @@ -134,6 +134,10 @@ static void bcm_sysport_set_rx_csum(struct net_device *dev, priv->rx_chk_en = !!(wanted & NETIF_F_RXCSUM); reg = rxchk_readl(priv, RXCHK_CONTROL); + /* Clear L2 header checks, which would prevent BPDUs + * from being received. + */ + reg &= ~RXCHK_L2_HDR_DIS; if (priv->rx_chk_en) reg |= RXCHK_EN; else From patchwork Wed Jan 30 00:55:41 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Florian Fainelli X-Patchwork-Id: 1033096 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="bSU07/DM"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 43q4jN1mXwz9sBZ for ; Wed, 30 Jan 2019 11:58:00 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727979AbfA3A55 (ORCPT ); Tue, 29 Jan 2019 19:57:57 -0500 Received: from mail-pg1-f194.google.com ([209.85.215.194]:36498 "EHLO mail-pg1-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727828AbfA3A5z (ORCPT ); Tue, 29 Jan 2019 19:57:55 -0500 Received: by mail-pg1-f194.google.com with SMTP id n2so9565525pgm.3 for ; Tue, 29 Jan 2019 16:57:55 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=5fH5gr9sNUrm8VK7d4y4RBnmbuL7cLAznMFlqfUMim4=; b=bSU07/DMsdH4PhoN6CLiIAgGsVoFfVSTy3G9PfXCCDfY8v4cJMx859vhPyMbfs8cVO 2h23Sro0LIr7iogaPTlC9ofXMNZO6OZcOswOMepnM/CqskqA6+RrnCLKJ66GhHvUMIoa SgB31ZJgvgFf+jriOK2lmgUvXu1UXGeaVKqBdFY8jRttprOD1UpYu+w1OdxTHZVvMPC2 fluXSeGqZl6pJZell6yCsq0bUrGZl3WKMiTQNdq+i1l4+tM8VPPSXhtvVzcuO37hdBXw 4Emb9kJktK20JngHy5zmeo3xwNEIfWbGkuwbDlg1IS0vGeY+xuCOCqw4t8Tl9fTN9nTY I/4Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=5fH5gr9sNUrm8VK7d4y4RBnmbuL7cLAznMFlqfUMim4=; b=uS8U1HYAes20k1qR86zDBUIaiEMM3ZSMufZstFwGFZ1bI9KGJvnWjGjV7KkM8GSkYY s0URUPEvFhvH3kLsRp8rXUXx70LsD3keiwb/5vofdHApO5p0BCvGctchaG4/Jhvn7sEo mhH9IuwVRjx9vFjCvdbYjxOvqrkUuIulx9qRqe1C1JtSQLJB8a0/n8F+DxthkfdDhKQ/ CjnCurPhThraCB3E5JLFuSXH9bC5PVduPBzhGCeZaIEif63pUh9lGWkY7hX4tjKvcCGO WIt/3Gsowrky2s/WhLjredB6AZa0hIdUbxKW5+iodyqPRIfTE3QVwPcK7D1l81qv00eA deNA== X-Gm-Message-State: AJcUukd03a4fpcS+iFpKr9ujtMcYgWRYv39mDvgGQ7JGUmaQ1P5HvuJ1 /JEbLWuJPM5GAEa0g+IIDtlbe5U9 X-Google-Smtp-Source: ALg8bN4P2r2/FXFP56UDUV7dHXdUTbEvKUPW0Y1m8+oVQT+RzG2ae1GenjhqLL0nd5SJSG9L2d+WPw== X-Received: by 2002:a63:cd4c:: with SMTP id a12mr26128843pgj.252.1548809874300; Tue, 29 Jan 2019 16:57:54 -0800 (PST) Received: from fainelli-desktop.igp.broadcom.net ([192.19.223.250]) by smtp.gmail.com with ESMTPSA id v191sm67837137pgb.77.2019.01.29.16.57.52 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 29 Jan 2019 16:57:53 -0800 (PST) From: Florian Fainelli To: netdev@vger.kernel.org Cc: Florian Fainelli , andrew@lunn.ch, vivien.didelot@gmail.com, davem@davemloft.net, idosch@mellanox.com, jiri@mellanox.com, ilias.apalodimas@linaro.org, ivan.khoronzhuk@linaro.org, roopa@cumulusnetworks.com, nikolay@cumulusnetworks.com Subject: [PATCH net-next v2 05/12] net: dsa: b53: Define registers for IGMP snooping Date: Tue, 29 Jan 2019 16:55:41 -0800 Message-Id: <20190130005548.2212-6-f.fainelli@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190130005548.2212-1-f.fainelli@gmail.com> References: <20190130005548.2212-1-f.fainelli@gmail.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Define all necessary registers in order to implement IGMP snooping later on, which are mostly comprised of the high-level protocol register control definitions. Signed-off-by: Florian Fainelli --- drivers/net/dsa/b53/b53_regs.h | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/drivers/net/dsa/b53/b53_regs.h b/drivers/net/dsa/b53/b53_regs.h index 2a9f421680aa..b4aecd4552b6 100644 --- a/drivers/net/dsa/b53/b53_regs.h +++ b/drivers/net/dsa/b53/b53_regs.h @@ -115,6 +115,8 @@ #define B53_UC_FLOOD_MASK 0x32 #define B53_MC_FLOOD_MASK 0x34 #define B53_IPMC_FLOOD_MASK 0x36 +#define B53_DIS_LEARN 0x3c +#define B53_SFT_LRN_CTRL 0x3e /* * Override Ports 0-7 State on devices with xMII interfaces (8 bit) @@ -253,6 +255,26 @@ /* Revision ID register (8 bit) */ #define B53_REV_ID 0x40 +/* High-level Protocol Control Register (32 bit) */ +#define B53_HL_PRTC_CTRL 0x50 +#define HL_PRTC_ARP_EN (1 << 0) +#define HL_PRTC_RARP_EN (1 << 1) +#define HL_PRTC_DHCP_EN (1 << 2) +#define HL_PRTC_ICMPV4_EN (1 << 3) +#define HL_PRTC_ICMPV6_EN (1 << 4) +#define HL_PRTC_ICMPV6_FWD_MODE (1 << 5) +#define HL_PRTC_IGMP_DIP_EN (1 << 8) +#define HL_PRTC_IGMP_RPTLVE_EN (1 << 9) +#define HL_PRTC_IGMP_RPTVLE_FWD_MODE (1 << 10) +#define HL_PRTC_IGMP_QRY_EN (1 << 11) +#define HL_PRTC_IGMP_QRY_FWD_MODE (1 << 12) +#define HL_PRTC_IGMP_UKN_EN (1 << 13) +#define HL_PRTC_IGMP_UKN_FWD_MODE (1 << 14) +#define HL_PRTC_MLD_RPTDONE_EN (1 << 15) +#define HL_PRTC_MLD_RPTDONE_FWD_MODE (1 << 16) +#define HL_PRTC_MLD_QRY_EN (1 << 17) +#define HL_PRTC_MLD_QRY_FWD_MODE (1 << 18) + /* Broadcom header RX control (16 bit) */ #define B53_BRCM_HDR_RX_DIS 0x60 From patchwork Wed Jan 30 00:55:42 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Florian Fainelli X-Patchwork-Id: 1033097 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="UsvK06oN"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 43q4jN6gHxz9s9h for ; Wed, 30 Jan 2019 11:58:00 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728299AbfA3A56 (ORCPT ); Tue, 29 Jan 2019 19:57:58 -0500 Received: from mail-pg1-f195.google.com ([209.85.215.195]:36501 "EHLO mail-pg1-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727942AbfA3A55 (ORCPT ); Tue, 29 Jan 2019 19:57:57 -0500 Received: by mail-pg1-f195.google.com with SMTP id n2so9565558pgm.3 for ; Tue, 29 Jan 2019 16:57:56 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=61kJRgAHiPAs/4u/rsaX9zX3GHTNWz6BIEpA+UYqK3w=; b=UsvK06oNis2dUV2LDwZ3rKKztzbw9D3I/ETiJSBr5gl1c9M9Sbbx2CbkEOEeX57bcK 5mCHAoMiI7EpFcV0PZXlB0ypLEhmhRHhDjwyutt6UEGKd+tdI2QULgzDeE1zYH8T95vC y9JQGExfppZUy+jB4U0ZHMQsO5+ybRtClePLXfewfPR8cGB8eqAKY7Xc1kcieRBt7Qqb ruViQZiknuWGALtwI3XGoc0n0vH+bXZORHMUkwWjLsNduZd5rvd3yWZcgTuukAQMES/u U7V/EQ04/Nwp5yRmgoTEiXevXDpzfIJlXhRUmF1SxrC9tL+yKW5DkrWcm4hfKOVlzjfc 6iRw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=61kJRgAHiPAs/4u/rsaX9zX3GHTNWz6BIEpA+UYqK3w=; b=nS1yKGpVr/G4105oh+JRYKfNsMixdoGNXkcv22lfFkvINBb0ZUqx25ZoJQXeOTqAOf mBef1kCUSQWIPHrJarXtpEhwO9MEmAOayswEJq/vekviJEQc0FF86BRizrC0Jux2F7xf 7seNVoAPgnjqp2MBm5wOVXMp1dV7VOIkugmpiphjJoPWweFqRoN8+bQXr06cgBQuv1o0 LTR527nOxKO7UfQ6PVXXcofD+YmDDf19aRJ056AR+bKkj+YftK6Oxqx4v5KIi3ANmZxs 3Se/IRUCPOPCFtm9+qlj2Ch1RVIcSp6MRxs4/ATcpyKbly6pqp5B1evAn0wOZp+Bm1Rk kovw== X-Gm-Message-State: AJcUukeis7cCAJt8NNcw9R7ePUqmcdv0hL0MU5+ucH1D2idbx6PRviSZ 0JYt1w/zSPjsVHjQFH6VJDpVgDZl X-Google-Smtp-Source: ALg8bN5LL3K13Nz1OZbYR+SUPN2HYMisEcq9afzNJuzozPkRrFHxqkxAHlz6Ao9l6np1KeM2JYXc3A== X-Received: by 2002:a63:6207:: with SMTP id w7mr24753164pgb.90.1548809876080; Tue, 29 Jan 2019 16:57:56 -0800 (PST) Received: from fainelli-desktop.igp.broadcom.net ([192.19.223.250]) by smtp.gmail.com with ESMTPSA id v191sm67837137pgb.77.2019.01.29.16.57.54 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 29 Jan 2019 16:57:55 -0800 (PST) From: Florian Fainelli To: netdev@vger.kernel.org Cc: Florian Fainelli , andrew@lunn.ch, vivien.didelot@gmail.com, davem@davemloft.net, idosch@mellanox.com, jiri@mellanox.com, ilias.apalodimas@linaro.org, ivan.khoronzhuk@linaro.org, roopa@cumulusnetworks.com, nikolay@cumulusnetworks.com Subject: [PATCH net-next v2 06/12] net: dsa: b53: Add support for MDB Date: Tue, 29 Jan 2019 16:55:42 -0800 Message-Id: <20190130005548.2212-7-f.fainelli@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190130005548.2212-1-f.fainelli@gmail.com> References: <20190130005548.2212-1-f.fainelli@gmail.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org In preparation for supporting IGMP snooping with or without the use of a bridge, add support within b53_common.c to program the ARL entries for multicast operations. The key difference is that a multicast ARL entry is comprised of a bitmask of enabled ports, instead of a port number. Signed-off-by: Florian Fainelli --- drivers/net/dsa/b53/b53_common.c | 62 ++++++++++++++++++++++++++++++-- drivers/net/dsa/b53/b53_priv.h | 8 ++++- 2 files changed, 67 insertions(+), 3 deletions(-) diff --git a/drivers/net/dsa/b53/b53_common.c b/drivers/net/dsa/b53/b53_common.c index 2fef4c564420..6c894ad4768a 100644 --- a/drivers/net/dsa/b53/b53_common.c +++ b/drivers/net/dsa/b53/b53_common.c @@ -1503,11 +1503,25 @@ static int b53_arl_op(struct b53_device *dev, int op, int port, idx = 1; } - memset(&ent, 0, sizeof(ent)); - ent.port = port; + /* For multicast address, the port is a bitmask and the validity + * is determined by having at least one port being still active + */ + if (!is_multicast_ether_addr(addr)) { + ent.port = port; + ent.is_valid = is_valid; + } else { + if (is_valid) + ent.port |= BIT(port); + else + ent.port &= ~BIT(port); + + ent.is_valid = !!(ent.port); + } + ent.is_valid = is_valid; ent.vid = vid; ent.is_static = true; + ent.is_age = false; memcpy(ent.mac, addr, ETH_ALEN); b53_arl_from_entry(&mac_vid, &fwd_entry, &ent); @@ -1626,6 +1640,47 @@ int b53_fdb_dump(struct dsa_switch *ds, int port, } EXPORT_SYMBOL(b53_fdb_dump); +int b53_mdb_prepare(struct dsa_switch *ds, int port, + const struct switchdev_obj_port_mdb *mdb) +{ + struct b53_device *priv = ds->priv; + + /* 5325 and 5365 require some more massaging, but could + * be supported eventually + */ + if (is5325(priv) || is5365(priv)) + return -EOPNOTSUPP; + + return 0; +} +EXPORT_SYMBOL(b53_mdb_prepare); + +void b53_mdb_add(struct dsa_switch *ds, int port, + const struct switchdev_obj_port_mdb *mdb) +{ + struct b53_device *priv = ds->priv; + int ret; + + ret = b53_arl_op(priv, 0, port, mdb->addr, mdb->vid, true); + if (ret) + dev_err(ds->dev, "failed to add MDB entry\n"); +} +EXPORT_SYMBOL(b53_mdb_add); + +int b53_mdb_del(struct dsa_switch *ds, int port, + const struct switchdev_obj_port_mdb *mdb) +{ + struct b53_device *priv = ds->priv; + int ret; + + ret = b53_arl_op(priv, 0, port, mdb->addr, mdb->vid, false); + if (ret) + dev_err(ds->dev, "failed to delete MDB entry\n"); + + return ret; +} +EXPORT_SYMBOL(b53_mdb_del); + int b53_br_join(struct dsa_switch *ds, int port, struct net_device *br) { struct b53_device *dev = ds->priv; @@ -1969,6 +2024,9 @@ static const struct dsa_switch_ops b53_switch_ops = { .port_fdb_del = b53_fdb_del, .port_mirror_add = b53_mirror_add, .port_mirror_del = b53_mirror_del, + .port_mdb_prepare = b53_mdb_prepare, + .port_mdb_add = b53_mdb_add, + .port_mdb_del = b53_mdb_del, }; struct b53_chip_data { diff --git a/drivers/net/dsa/b53/b53_priv.h b/drivers/net/dsa/b53/b53_priv.h index 4dc7ee38b258..620638ff9338 100644 --- a/drivers/net/dsa/b53/b53_priv.h +++ b/drivers/net/dsa/b53/b53_priv.h @@ -251,7 +251,7 @@ b53_build_op(write48, u64); b53_build_op(write64, u64); struct b53_arl_entry { - u8 port; + u16 port; u8 mac[ETH_ALEN]; u16 vid; u8 is_valid:1; @@ -350,6 +350,12 @@ int b53_fdb_del(struct dsa_switch *ds, int port, const unsigned char *addr, u16 vid); int b53_fdb_dump(struct dsa_switch *ds, int port, dsa_fdb_dump_cb_t *cb, void *data); +int b53_mdb_prepare(struct dsa_switch *ds, int port, + const struct switchdev_obj_port_mdb *mdb); +void b53_mdb_add(struct dsa_switch *ds, int port, + const struct switchdev_obj_port_mdb *mdb); +int b53_mdb_del(struct dsa_switch *ds, int port, + const struct switchdev_obj_port_mdb *mdb); int b53_mirror_add(struct dsa_switch *ds, int port, struct dsa_mall_mirror_tc_entry *mirror, bool ingress); enum dsa_tag_protocol b53_get_tag_protocol(struct dsa_switch *ds, int port); From patchwork Wed Jan 30 00:55:43 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Florian Fainelli X-Patchwork-Id: 1033098 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="qZo+4Opb"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 43q4jR1LPjz9s9h for ; Wed, 30 Jan 2019 11:58:03 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728541AbfA3A6B (ORCPT ); Tue, 29 Jan 2019 19:58:01 -0500 Received: from mail-pf1-f195.google.com ([209.85.210.195]:35905 "EHLO mail-pf1-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728176AbfA3A57 (ORCPT ); Tue, 29 Jan 2019 19:57:59 -0500 Received: by mail-pf1-f195.google.com with SMTP id b85so10564529pfc.3 for ; Tue, 29 Jan 2019 16:57:58 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=JImFDnBsP6enld2qA1tUibEu/Ic5jrKcfz2zWMVyGZ0=; b=qZo+4Opbw9aagxSbpdizVXC96jITB9xAtR43of6n56NX/a/wwyjNMAr166cUWNnNPA 9ejZIy7r7zgbXpaQcC72Y/2vAewHnv42G1EmiND1PJNACPfoCn6sALUmT1tsDl8khgyK L4R9jFndI/f+vHGO4CcfBcIowFb8ITELTcSLYVEQPksIrC4fsWv4oAHn2UxqmvYD3fv8 yG7WBvlP90ATNvBh3NZ7qgb7Ndv9DfoqFVrR4GV/5vouFxuXIg1mtV7y19Kixcc2psoL vBnc4tsbxdnVwcBN7xNcE4sTGUFSwQkQi8NhwuVYUuUZwNvOyK/1LGIfvNxIsdXWb/Cu IJ3w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=JImFDnBsP6enld2qA1tUibEu/Ic5jrKcfz2zWMVyGZ0=; b=gx6hkYKSqDJ35La0iaTBimAYuKvmqOhf/CvRLbIfzx3VenHfH6Xg/4du1VnVN+b8qp mTFP3S9sQ55fOpCLffehVCxy4ew4n9SenxXIvWD6f1qYsW2LuvaOJg81As3etIIwDpG2 6b4ZrYHuqXG4xT0/gEnwNFpZ7ugs5LJ+DPKr9OVDXGvQU5z6UT8NcATlOzCAn+TW1nLx GN7mrkUnBhXgMLnB3J1NIoDXIdLW1fdKOJez14557UtaXVJdVxLa2ucgNggecJSDAqVj i0vOkTL57QLdmlMXdRJnWCZg5KnCJG5VGAGZlIdsZqe16dP099R1wNT0jLcLzu3uCtqD kF9g== X-Gm-Message-State: AJcUukc5Y+Qr+1qaD1/Iwc2wSGC4pJg9kojLCSuD2tGkkWm1VA39dgF9 zxlugEEVoK0QoOrE43uthSpax5Jd X-Google-Smtp-Source: ALg8bN4jBFUdLjfMtySrEUIX4dx1CIR+vsbc4QcxO04PEIiL5tU5BXy/JmTBgy1etpieP1erpg07rA== X-Received: by 2002:aa7:8802:: with SMTP id c2mr28247520pfo.20.1548809877725; Tue, 29 Jan 2019 16:57:57 -0800 (PST) Received: from fainelli-desktop.igp.broadcom.net ([192.19.223.250]) by smtp.gmail.com with ESMTPSA id v191sm67837137pgb.77.2019.01.29.16.57.56 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 29 Jan 2019 16:57:56 -0800 (PST) From: Florian Fainelli To: netdev@vger.kernel.org Cc: Florian Fainelli , andrew@lunn.ch, vivien.didelot@gmail.com, davem@davemloft.net, idosch@mellanox.com, jiri@mellanox.com, ilias.apalodimas@linaro.org, ivan.khoronzhuk@linaro.org, roopa@cumulusnetworks.com, nikolay@cumulusnetworks.com Subject: [PATCH net-next v2 07/12] net: dsa: Add ability to program multicast filter for CPU port Date: Tue, 29 Jan 2019 16:55:43 -0800 Message-Id: <20190130005548.2212-8-f.fainelli@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190130005548.2212-1-f.fainelli@gmail.com> References: <20190130005548.2212-1-f.fainelli@gmail.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org When the switch ports operate as individual network devices, the switch driver might have configured the switch to flood multicast all the way to the CPU port. This is really undesireable as it can lead to receiving a lot of unwanted traffic that the network stack needs to filter in software. For each valid multicast address, program it into the switch's MDB only when the host is interested in receiving such traffic, e.g: running an multicast application. Signed-off-by: Florian Fainelli --- net/dsa/slave.c | 50 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/net/dsa/slave.c b/net/dsa/slave.c index 91de3a663226..a6a803262929 100644 --- a/net/dsa/slave.c +++ b/net/dsa/slave.c @@ -68,6 +68,39 @@ static int dsa_slave_get_iflink(const struct net_device *dev) return dsa_slave_to_master(dev)->ifindex; } +static int dsa_slave_sync_unsync_mdb_addr(struct net_device *dev, + const unsigned char *addr, bool add) +{ + struct switchdev_obj_port_mdb mdb = { + .obj = { + .id = SWITCHDEV_OBJ_ID_HOST_MDB, + .flags = SWITCHDEV_F_DEFER, + }, + .vid = 0, + }; + int ret = -EOPNOTSUPP; + + ether_addr_copy(mdb.addr, addr); + if (add) + ret = switchdev_port_obj_add(dev, &mdb.obj, NULL); + else + ret = switchdev_port_obj_del(dev, &mdb.obj); + + return ret; +} + +static int dsa_slave_sync_mdb_addr(struct net_device *dev, + const unsigned char *addr) +{ + return dsa_slave_sync_unsync_mdb_addr(dev, addr, true); +} + +static int dsa_slave_unsync_mdb_addr(struct net_device *dev, + const unsigned char *addr) +{ + return dsa_slave_sync_unsync_mdb_addr(dev, addr, false); +} + static int dsa_slave_open(struct net_device *dev) { struct net_device *master = dsa_slave_to_master(dev); @@ -126,6 +159,8 @@ static int dsa_slave_close(struct net_device *dev) dev_mc_unsync(master, dev); dev_uc_unsync(master, dev); + __hw_addr_unsync_dev(&dev->mc, dev, dsa_slave_unsync_mdb_addr); + if (dev->flags & IFF_ALLMULTI) dev_set_allmulti(master, -1); if (dev->flags & IFF_PROMISC) @@ -150,7 +185,17 @@ static void dsa_slave_change_rx_flags(struct net_device *dev, int change) static void dsa_slave_set_rx_mode(struct net_device *dev) { struct net_device *master = dsa_slave_to_master(dev); + struct dsa_port *dp = dsa_slave_to_port(dev); + /* If the port is bridged, the bridge takes care of sending + * SWITCHDEV_OBJ_ID_HOST_MDB to program the host's MC filter + */ + if (netdev_mc_empty(dev) || dp->bridge_dev) + goto out; + + __hw_addr_sync_dev(&dev->mc, dev, dsa_slave_sync_mdb_addr, + dsa_slave_unsync_mdb_addr); +out: dev_mc_sync(master, dev); dev_uc_sync(master, dev); } @@ -1396,6 +1441,11 @@ static int dsa_slave_changeupper(struct net_device *dev, if (netif_is_bridge_master(info->upper_dev)) { if (info->linking) { + /* Remove existing MC addresses that might have been + * programmed + */ + __hw_addr_unsync_dev(&dev->mc, dev, + dsa_slave_unsync_mdb_addr); err = dsa_port_bridge_join(dp, info->upper_dev); err = notifier_from_errno(err); } else { From patchwork Wed Jan 30 00:55:44 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Florian Fainelli X-Patchwork-Id: 1033099 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="WfyHA98O"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 43q4jT1mymz9s9h for ; Wed, 30 Jan 2019 11:58:05 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728580AbfA3A6D (ORCPT ); Tue, 29 Jan 2019 19:58:03 -0500 Received: from mail-pl1-f193.google.com ([209.85.214.193]:33985 "EHLO mail-pl1-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728442AbfA3A6B (ORCPT ); Tue, 29 Jan 2019 19:58:01 -0500 Received: by mail-pl1-f193.google.com with SMTP id w4so10237210plz.1 for ; Tue, 29 Jan 2019 16:58:00 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=MmWPYT+0hptxaYLTztAJ2wUfUnp9WNJXPWtt0gN545w=; b=WfyHA98OvnRknGoeuTt1vYZg+MZe1h+uQcRtRI91EVimgnZtl5g/BqGTTZ2ibmnGr1 5jAsnnsM/5Jh1qgvdboaQDhOqqmz93mVdoWlWdwlPW/N5jMoJbqAQrGiboLshzUvlBj5 HNZunHDvp3JahSjMU3iVzluxXLmbQVQ8+dgJ0cqyFJmssJQHQDaF9Pr7MqBeky/nuDHi mw+jwE5H7sQWqsbLlCE2RUhDhPrl8MnbWxXWpLJuNkvHghEBL8iHOc+PkS8bKfj6hPq9 bZLx4nLp7X2Kj1N3IEE+l9zPV2KvAwLzDcvnEQ/QWofq/Dzns36BaVUc9QU1WK+d1y4T x9mA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=MmWPYT+0hptxaYLTztAJ2wUfUnp9WNJXPWtt0gN545w=; b=liAYrPmGnfXsvGNr9qaJVD5BuuR1w7BLG6ZYzcGlZbNS4mkUUTBgoNFYY9JG8Rpgh2 WQtsUpyVdIcA8dnc6lDp3do/Vfs229j1SkhnvJcEaO8jOpewWKAUDOnNUyXKyb7C7LCL z3cguI5+XGxJTteU+UDzvC9fI6jhPZe6cPnl8fZKwUbz+iGj578A7afbazxJfrqSERrj 4SuDz7kiyRiyRhWgi/W96Bu9w8ZMWM9KNkPCU6Qb4ohvTgQ5GaTeEvcodrxrkX/xQFjl wSj5vqiQkwkxJ/EKYxRD8WcBWKnqQvnIf5S95UXmOb3dFqKskTLERI9oojxBQ1gBg+lg woeA== X-Gm-Message-State: AJcUukckzwmBUHbLGzEYqSYUnxRh5itdIBFso+CJl1jGll3yP4iqc/fO +BZh7y+2/Ep0HBkKFL4Xz/p3jF5F X-Google-Smtp-Source: ALg8bN7jFWajbR4C71cQ1VhAKB7GhOegaSUc0Z5OfmGO8hpiiq2T1iv0PJRF91qXR4Sn/lg+ql5Bjg== X-Received: by 2002:a17:902:145:: with SMTP id 63mr28102197plb.256.1548809879585; Tue, 29 Jan 2019 16:57:59 -0800 (PST) Received: from fainelli-desktop.igp.broadcom.net ([192.19.223.250]) by smtp.gmail.com with ESMTPSA id v191sm67837137pgb.77.2019.01.29.16.57.57 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 29 Jan 2019 16:57:58 -0800 (PST) From: Florian Fainelli To: netdev@vger.kernel.org Cc: Florian Fainelli , andrew@lunn.ch, vivien.didelot@gmail.com, davem@davemloft.net, idosch@mellanox.com, jiri@mellanox.com, ilias.apalodimas@linaro.org, ivan.khoronzhuk@linaro.org, roopa@cumulusnetworks.com, nikolay@cumulusnetworks.com Subject: [PATCH net-next v2 08/12] net: dsa: Add ndo_vlan_rx_{add, kill}_vid implementation Date: Tue, 29 Jan 2019 16:55:44 -0800 Message-Id: <20190130005548.2212-9-f.fainelli@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190130005548.2212-1-f.fainelli@gmail.com> References: <20190130005548.2212-1-f.fainelli@gmail.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org In order to properly support VLAN filtering being enabled/disabled on a bridge, while having other ports being non bridge port members, we need to support the ndo_vlan_rx_{add,kill}_vid callbacks in order to make sure the non-bridge ports can continue receiving VLAN tags, even when the switch is globally configured to do ingress/egress VID checking. We don't allow configuring VLAN devices on a bridge port member though, since the bridge with VLAN awareness should be taking care of that, if needed. Since we can call dsa_port_vlan_{add,del} with a bridge_dev pointer NULL, we now need to check that in these two functions. Signed-off-by: Florian Fainelli --- net/dsa/port.c | 12 +++++++++-- net/dsa/slave.c | 53 ++++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 62 insertions(+), 3 deletions(-) diff --git a/net/dsa/port.c b/net/dsa/port.c index 2d7e01b23572..185e85a4f5f0 100644 --- a/net/dsa/port.c +++ b/net/dsa/port.c @@ -252,7 +252,11 @@ int dsa_port_vlan_add(struct dsa_port *dp, .vlan = vlan, }; - if (br_vlan_enabled(dp->bridge_dev)) + /* Can be called from dsa_slave_port_obj_add() or + * dsa_slave_vlan_rx_add_vid() + */ + if ((dp->bridge_dev && br_vlan_enabled(dp->bridge_dev)) || + !dp->bridge_dev) return dsa_port_notify(dp, DSA_NOTIFIER_VLAN_ADD, &info); return 0; @@ -270,7 +274,11 @@ int dsa_port_vlan_del(struct dsa_port *dp, if (netif_is_bridge_master(vlan->obj.orig_dev)) return -EOPNOTSUPP; - if (br_vlan_enabled(dp->bridge_dev)) + /* Can be called from dsa_slave_port_obj_del() or + * dsa_slave_vlan_rx_kill_vid() + */ + if ((dp->bridge_dev && br_vlan_enabled(dp->bridge_dev)) || + !dp->bridge_dev) return dsa_port_notify(dp, DSA_NOTIFIER_VLAN_DEL, &info); return 0; diff --git a/net/dsa/slave.c b/net/dsa/slave.c index a6a803262929..306fd1b45f0c 100644 --- a/net/dsa/slave.c +++ b/net/dsa/slave.c @@ -1027,6 +1027,54 @@ static int dsa_slave_get_ts_info(struct net_device *dev, return ds->ops->get_ts_info(ds, p->dp->index, ts); } +static int dsa_slave_vlan_rx_add_vid(struct net_device *dev, __be16 proto, + u16 vid) +{ + struct dsa_port *dp = dsa_slave_to_port(dev); + struct switchdev_obj_port_vlan vlan = { }; + int ret = 0; + + /* If the port is bridged and the bridge is VLAN aware, let the bridge + * manage VLANs + */ + if (dp->bridge_dev && br_vlan_enabled(dp->bridge_dev)) + return -EINVAL; + + /* This API only allows programming tagged, non-PVID VIDs */ + vlan.vid_begin = vid; + vlan.vid_end = vid; + + ret = dsa_port_vlan_add(dp, &vlan, NULL); + if (ret == -EOPNOTSUPP) + ret = 0; + + return ret; +} + +static int dsa_slave_vlan_rx_kill_vid(struct net_device *dev, __be16 proto, + u16 vid) +{ + struct dsa_port *dp = dsa_slave_to_port(dev); + struct switchdev_obj_port_vlan vlan = { }; + int ret = 0; + + /* If the port is bridged and the bridge is VLAN aware, let the bridge + * manage VLANs + */ + if (dp->bridge_dev && br_vlan_enabled(dp->bridge_dev)) + return -EINVAL; + + /* This API only allows programming tagged, non-PVID VIDs */ + vlan.vid_begin = vid; + vlan.vid_end = vid; + + ret = dsa_port_vlan_del(dp, &vlan); + if (ret == -EOPNOTSUPP) + ret = 0; + + return ret; +} + static const struct ethtool_ops dsa_slave_ethtool_ops = { .get_drvinfo = dsa_slave_get_drvinfo, .get_regs_len = dsa_slave_get_regs_len, @@ -1091,6 +1139,8 @@ static const struct net_device_ops dsa_slave_netdev_ops = { .ndo_get_phys_port_name = dsa_slave_get_phys_port_name, .ndo_setup_tc = dsa_slave_setup_tc, .ndo_get_stats64 = dsa_slave_get_stats64, + .ndo_vlan_rx_add_vid = dsa_slave_vlan_rx_add_vid, + .ndo_vlan_rx_kill_vid = dsa_slave_vlan_rx_kill_vid, }; static const struct switchdev_ops dsa_slave_switchdev_ops = { @@ -1351,7 +1401,8 @@ int dsa_slave_create(struct dsa_port *port) if (slave_dev == NULL) return -ENOMEM; - slave_dev->features = master->vlan_features | NETIF_F_HW_TC; + slave_dev->features = master->vlan_features | NETIF_F_HW_TC | + NETIF_F_HW_VLAN_CTAG_FILTER; slave_dev->hw_features |= NETIF_F_HW_TC; slave_dev->ethtool_ops = &dsa_slave_ethtool_ops; eth_hw_addr_inherit(slave_dev, master); From patchwork Wed Jan 30 00:55:45 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Florian Fainelli X-Patchwork-Id: 1033101 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="SV02eINr"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 43q4jW5zP3z9s9h for ; Wed, 30 Jan 2019 11:58:07 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728752AbfA3A6G (ORCPT ); Tue, 29 Jan 2019 19:58:06 -0500 Received: from mail-pl1-f196.google.com ([209.85.214.196]:40351 "EHLO mail-pl1-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727833AbfA3A6C (ORCPT ); Tue, 29 Jan 2019 19:58:02 -0500 Received: by mail-pl1-f196.google.com with SMTP id u18so10206885plq.7 for ; Tue, 29 Jan 2019 16:58:02 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=fv90w/JFCT9ehavvNBU6jhgUvg4Ioz98Q6Ow6+7Fwdk=; b=SV02eINr41x7Ri28BrpEckXQwokK5QRG34ZcCHQ3ltysbenmCYJ3e6560Jf9Ymglbr ForfV4ECFWQyCpG7czToB/dYDVksYReRkbta+ypzOBkajczPPSJmtwa8gwZkAKZhGDwc 2xNK0CuC1AfHKiL0YVZ8w1YfaMJZwtHQ66jsIc2hD3GoO4e2p4UZiIEOQOQndpK47euw KR2GUAmrUAhekOhIwMDClFGJ9F05hCn1YQ8Doo9IMUOHXdZVz/albViOeR7pe1EPvMUl U/aLggc6EpVT6Q6IrsyaBdyQfB5wyD1knOZfHfQhpSteX6osM4F5gIsuHFVHYYlc60D5 GHoA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=fv90w/JFCT9ehavvNBU6jhgUvg4Ioz98Q6Ow6+7Fwdk=; b=tZ45QJaxnUb7Qm8PZZJTylAPBf3wZt0gZ8bJOaxtrUzYKqLVkLCr+tSLEujZcZF/OQ a+iZGJs3f7BBv40P7Y99RDQw5DmLrMeYm6THnDPmDbmwZ6bnDOAr0PU72JilF72RAZd2 bFGLj4douvKAIrwNbwmTVmA7Ax+phDbQJoaiY8nPIOlzKL1UAkj2Sg66tLEZPjvkZOPz SL48rXaJgAf6ize7AhrRp3dIxiHsfx+1PVkpIATdKEarP7CLIdMnOU2KvgbO+k3zknWY QwSYCNzc7vEUMBxqRvpmM8AQlXB98zThvI9PEam1VUJZ+WWQ6JcblvIJwHMnFNbudPyb nX2Q== X-Gm-Message-State: AJcUuke8onyU4klNUI1FBXWh6XSOHXfmKK1iouSTC9itJQweIYw+qv1l TwGTfrvoHtURlmjOcUiOgf3Qn9P3 X-Google-Smtp-Source: ALg8bN7vDfhEUrZhgfVRLyz/l4QclDSVQJILfTww3+AmiscVIi6xKiNZqlTmdyYu+zR/vDB2J1vBbQ== X-Received: by 2002:a17:902:c05:: with SMTP id 5mr28507801pls.155.1548809881282; Tue, 29 Jan 2019 16:58:01 -0800 (PST) Received: from fainelli-desktop.igp.broadcom.net ([192.19.223.250]) by smtp.gmail.com with ESMTPSA id v191sm67837137pgb.77.2019.01.29.16.57.59 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 29 Jan 2019 16:58:00 -0800 (PST) From: Florian Fainelli To: netdev@vger.kernel.org Cc: Florian Fainelli , andrew@lunn.ch, vivien.didelot@gmail.com, davem@davemloft.net, idosch@mellanox.com, jiri@mellanox.com, ilias.apalodimas@linaro.org, ivan.khoronzhuk@linaro.org, roopa@cumulusnetworks.com, nikolay@cumulusnetworks.com Subject: [PATCH net-next v2 09/12] net: dsa: Make VLAN filtering use DSA notifiers Date: Tue, 29 Jan 2019 16:55:45 -0800 Message-Id: <20190130005548.2212-10-f.fainelli@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190130005548.2212-1-f.fainelli@gmail.com> References: <20190130005548.2212-1-f.fainelli@gmail.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org In preparation for allowing for global checks that would apply to the entire switch and not just on a per-port basis, make the VLAN filtering attribute follow other switchdev attributes/objects and make it use the DSA notifier infrastructure. Signed-off-by: Florian Fainelli --- net/dsa/dsa_priv.h | 11 ++++++++++- net/dsa/port.c | 17 +++++++---------- net/dsa/switch.c | 29 +++++++++++++++++++++++++++++ 3 files changed, 46 insertions(+), 11 deletions(-) diff --git a/net/dsa/dsa_priv.h b/net/dsa/dsa_priv.h index 1f4972dab9f2..1e3db5f2a699 100644 --- a/net/dsa/dsa_priv.h +++ b/net/dsa/dsa_priv.h @@ -26,6 +26,7 @@ enum { DSA_NOTIFIER_MDB_DEL, DSA_NOTIFIER_VLAN_ADD, DSA_NOTIFIER_VLAN_DEL, + DSA_NOTIFIER_VLAN_FILTERING, }; /* DSA_NOTIFIER_AGEING_TIME */ @@ -57,7 +58,7 @@ struct dsa_notifier_mdb_info { int port; }; -/* DSA_NOTIFIER_VLAN_* */ +/* DSA_NOTIFIER_VLAN_{ADD,DEL} */ struct dsa_notifier_vlan_info { const struct switchdev_obj_port_vlan *vlan; struct switchdev_trans *trans; @@ -65,6 +66,14 @@ struct dsa_notifier_vlan_info { int port; }; +/* DSA_NOTIFIER_VLAN_FILTERING */ +struct dsa_notifier_vlan_filtering_info { + bool vlan_filtering; + struct switchdev_trans *trans; + int sw_index; + int port; +}; + struct dsa_slave_priv { /* Copy of CPU port xmit for faster access in slave transmit hot path */ struct sk_buff * (*xmit)(struct sk_buff *skb, diff --git a/net/dsa/port.c b/net/dsa/port.c index 185e85a4f5f0..d7b057d46460 100644 --- a/net/dsa/port.c +++ b/net/dsa/port.c @@ -146,17 +146,14 @@ void dsa_port_bridge_leave(struct dsa_port *dp, struct net_device *br) int dsa_port_vlan_filtering(struct dsa_port *dp, bool vlan_filtering, struct switchdev_trans *trans) { - struct dsa_switch *ds = dp->ds; - - /* bridge skips -EOPNOTSUPP, so skip the prepare phase */ - if (switchdev_trans_ph_prepare(trans)) - return 0; - - if (ds->ops->port_vlan_filtering) - return ds->ops->port_vlan_filtering(ds, dp->index, - vlan_filtering); + struct dsa_notifier_vlan_filtering_info info = { + .sw_index = dp->ds->index, + .port = dp->index, + .trans = trans, + .vlan_filtering = vlan_filtering, + }; - return 0; + return dsa_port_notify(dp, DSA_NOTIFIER_VLAN_FILTERING, &info); } int dsa_port_ageing_time(struct dsa_port *dp, clock_t ageing_clock, diff --git a/net/dsa/switch.c b/net/dsa/switch.c index 142b294d3446..831334dc5e79 100644 --- a/net/dsa/switch.c +++ b/net/dsa/switch.c @@ -235,6 +235,32 @@ static int dsa_switch_vlan_del(struct dsa_switch *ds, return 0; } +static int dsa_switch_vlan_filtering(struct dsa_switch *ds, + struct dsa_notifier_vlan_filtering_info *info) +{ + struct switchdev_trans *trans = info->trans; + bool vlan_filtering = info->vlan_filtering; + int port = info->port; + int err; + + /* bridge skips -EOPNOTSUPP, so skip the prepare phase */ + if (switchdev_trans_ph_prepare(trans)) + return 0; + + /* Build a mask of port members */ + bitmap_zero(ds->bitmap, ds->num_ports); + if (ds->index == info->sw_index) + set_bit(port, ds->bitmap); + + for_each_set_bit(port, ds->bitmap, ds->num_ports) { + err = ds->ops->port_vlan_filtering(ds, port, vlan_filtering); + if (err) + return err; + } + + return 0; +} + static int dsa_switch_event(struct notifier_block *nb, unsigned long event, void *info) { @@ -269,6 +295,9 @@ static int dsa_switch_event(struct notifier_block *nb, case DSA_NOTIFIER_VLAN_DEL: err = dsa_switch_vlan_del(ds, info); break; + case DSA_NOTIFIER_VLAN_FILTERING: + err = dsa_switch_vlan_filtering(ds, info); + break; default: err = -EOPNOTSUPP; break; From patchwork Wed Jan 30 00:55:46 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Florian Fainelli X-Patchwork-Id: 1033100 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="mPdPUsx8"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 43q4jV57gbz9s9h for ; Wed, 30 Jan 2019 11:58:06 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728651AbfA3A6F (ORCPT ); Tue, 29 Jan 2019 19:58:05 -0500 Received: from mail-pl1-f195.google.com ([209.85.214.195]:35567 "EHLO mail-pl1-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728442AbfA3A6E (ORCPT ); Tue, 29 Jan 2019 19:58:04 -0500 Received: by mail-pl1-f195.google.com with SMTP id p8so10210500plo.2 for ; Tue, 29 Jan 2019 16:58:03 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=3Wh5Uk0iCf29gQTid2GeZZ8gty1x5irON1nuM7SEXug=; b=mPdPUsx8gjjo/LGK1HEp25Ron0kpnUH5JCmx72Gs44PRSWgN6LrLke4+LOqbIAmcci cnMRutPt2GFonZitdLlGp4pc/oaVynTf7ivgoqKJDHN4vGNxhzGoIJyByIg8MEO4qLXD HB33kzmzkvJ9MwZHb6v/3KeiIrGc+SWypRGfvpNCroAmiusPvVx8ExC06dr6Ry2XliTW RNsKBsuKGNgmzSe9Rn0QEY7MB8sO1nE7hD1E3IBel+qZEKZtPNOvAO0cc6NaYRCJLF1I FDnSzcWH3j0Z77vB65fWp8Il/zX4tpOLwDf3yr6LhUUC5Ik6KmcTe8StsSsuTLaOS7r/ iAqg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=3Wh5Uk0iCf29gQTid2GeZZ8gty1x5irON1nuM7SEXug=; b=qz/wGbIyKmOUbZdTXMeb7d0VKV6bTZ/3/T9kYh1w2cKfswOrX1fzQHBrw9FjvxjSDz YY2PsdrIDcISf5Um9gl3yTupLYXBxywARI1rDLyZTnVgVfoJQrjpTBOhHBtYV5fDzdof hXR32HUK5cV3+Rw6AtL4u3gS7sSBg6+6bDQTRKjdoLc6DngymqSmWlSl9cdnZtq71ZGn a24RVPFawX430tpfxcnyBHXVufXak0lZK0vxfJlHk0Nt4YixEhCiIIeg0eA9O477zr6W O1NhvpLDLNZZxLdhbIOFXA0ICt2Qc5HtNm7f0u41yc0Itl9HEUcBiZXuB5uPJtVQjsnq DT8Q== X-Gm-Message-State: AJcUukeuVyKvZQBUgZp/1kfUD11QKRNm6aDm9goeejmONvzbipCQxzDg IvqgFtswtnlWBMScOxMwxDqrl3r+ X-Google-Smtp-Source: ALg8bN5HbdVqgtaPwWDkEFhKhMTkaQXxZu6ba2Fcf/+Kfkl24Hm92W+6ggCi/iOvDs9iRYUrRro0Ow== X-Received: by 2002:a17:902:583:: with SMTP id f3mr28992710plf.202.1548809882949; Tue, 29 Jan 2019 16:58:02 -0800 (PST) Received: from fainelli-desktop.igp.broadcom.net ([192.19.223.250]) by smtp.gmail.com with ESMTPSA id v191sm67837137pgb.77.2019.01.29.16.58.01 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 29 Jan 2019 16:58:02 -0800 (PST) From: Florian Fainelli To: netdev@vger.kernel.org Cc: Florian Fainelli , andrew@lunn.ch, vivien.didelot@gmail.com, davem@davemloft.net, idosch@mellanox.com, jiri@mellanox.com, ilias.apalodimas@linaro.org, ivan.khoronzhuk@linaro.org, roopa@cumulusnetworks.com, nikolay@cumulusnetworks.com Subject: [PATCH net-next v2 10/12] net: dsa: Wire up multicast IGMP snooping attribute notification Date: Tue, 29 Jan 2019 16:55:46 -0800 Message-Id: <20190130005548.2212-11-f.fainelli@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190130005548.2212-1-f.fainelli@gmail.com> References: <20190130005548.2212-1-f.fainelli@gmail.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org The bridge can at runtime be configured with or without IGMP snooping enabled but we were not processing the switchdev attribute that notifies about that toggle, do this now. Signed-off-by: Florian Fainelli --- include/net/dsa.h | 2 ++ net/dsa/dsa_priv.h | 11 +++++++++++ net/dsa/port.c | 13 +++++++++++++ net/dsa/slave.c | 4 ++++ net/dsa/switch.c | 28 ++++++++++++++++++++++++++++ 5 files changed, 58 insertions(+) diff --git a/include/net/dsa.h b/include/net/dsa.h index 7f2a668ef2cc..2ee1ede7df5c 100644 --- a/include/net/dsa.h +++ b/include/net/dsa.h @@ -425,6 +425,8 @@ struct dsa_switch_ops { /* * Multicast database */ + int (*port_multicast_toggle)(struct dsa_switch *ds, int port, + bool mc_disabled); int (*port_mdb_prepare)(struct dsa_switch *ds, int port, const struct switchdev_obj_port_mdb *mdb); void (*port_mdb_add)(struct dsa_switch *ds, int port, diff --git a/net/dsa/dsa_priv.h b/net/dsa/dsa_priv.h index 1e3db5f2a699..221753777cf5 100644 --- a/net/dsa/dsa_priv.h +++ b/net/dsa/dsa_priv.h @@ -27,6 +27,7 @@ enum { DSA_NOTIFIER_VLAN_ADD, DSA_NOTIFIER_VLAN_DEL, DSA_NOTIFIER_VLAN_FILTERING, + DSA_NOTIFIER_MC_DISABLED, }; /* DSA_NOTIFIER_AGEING_TIME */ @@ -74,6 +75,14 @@ struct dsa_notifier_vlan_filtering_info { int port; }; +/* DSA_NOTIFIER_MC_DISABLED */ +struct dsa_notifier_mc_disabled_info { + bool mc_disabled; + struct switchdev_trans *trans; + int sw_index; + int port; +}; + struct dsa_slave_priv { /* Copy of CPU port xmit for faster access in slave transmit hot path */ struct sk_buff * (*xmit)(struct sk_buff *skb, @@ -155,6 +164,8 @@ int dsa_port_enable(struct dsa_port *dp, struct phy_device *phy); void dsa_port_disable(struct dsa_port *dp, struct phy_device *phy); int dsa_port_bridge_join(struct dsa_port *dp, struct net_device *br); void dsa_port_bridge_leave(struct dsa_port *dp, struct net_device *br); +int dsa_port_multicast_toggle(struct dsa_port *dp, bool mc_disabled, + struct switchdev_trans *trans); int dsa_port_vlan_filtering(struct dsa_port *dp, bool vlan_filtering, struct switchdev_trans *trans); int dsa_port_ageing_time(struct dsa_port *dp, clock_t ageing_clock, diff --git a/net/dsa/port.c b/net/dsa/port.c index d7b057d46460..148458941b51 100644 --- a/net/dsa/port.c +++ b/net/dsa/port.c @@ -143,6 +143,19 @@ void dsa_port_bridge_leave(struct dsa_port *dp, struct net_device *br) dsa_port_set_state_now(dp, BR_STATE_FORWARDING); } +int dsa_port_multicast_toggle(struct dsa_port *dp, bool mc_disabled, + struct switchdev_trans *trans) +{ + struct dsa_notifier_mc_disabled_info info = { + .sw_index = dp->ds->index, + .port = dp->index, + .trans = trans, + .mc_disabled = mc_disabled, + }; + + return dsa_port_notify(dp, DSA_NOTIFIER_MC_DISABLED, &info); +} + int dsa_port_vlan_filtering(struct dsa_port *dp, bool vlan_filtering, struct switchdev_trans *trans) { diff --git a/net/dsa/slave.c b/net/dsa/slave.c index 306fd1b45f0c..f3b3cf34804f 100644 --- a/net/dsa/slave.c +++ b/net/dsa/slave.c @@ -337,6 +337,10 @@ static int dsa_slave_port_attr_set(struct net_device *dev, case SWITCHDEV_ATTR_ID_BRIDGE_AGEING_TIME: ret = dsa_port_ageing_time(dp, attr->u.ageing_time, trans); break; + case SWITCHDEV_ATTR_ID_BRIDGE_MC_DISABLED: + ret = dsa_port_multicast_toggle(dp, attr->u.mc_disabled, + trans); + break; default: ret = -EOPNOTSUPP; break; diff --git a/net/dsa/switch.c b/net/dsa/switch.c index 831334dc5e79..e095eb808434 100644 --- a/net/dsa/switch.c +++ b/net/dsa/switch.c @@ -261,6 +261,31 @@ static int dsa_switch_vlan_filtering(struct dsa_switch *ds, return 0; } +static int dsa_switch_mc_disabled(struct dsa_switch *ds, + struct dsa_notifier_mc_disabled_info *info) +{ + struct switchdev_trans *trans = info->trans; + bool mc_disabled = info->mc_disabled; + int port = info->port; + int err; + + if (switchdev_trans_ph_prepare(trans)) + return ds->ops->port_multicast_toggle ? 0 : -EOPNOTSUPP; + + /* Build a mask of port members */ + bitmap_zero(ds->bitmap, ds->num_ports); + if (ds->index == info->sw_index) + set_bit(port, ds->bitmap); + + for_each_set_bit(port, ds->bitmap, ds->num_ports) { + err = ds->ops->port_multicast_toggle(ds, port, mc_disabled); + if (err) + return err; + } + + return 0; +} + static int dsa_switch_event(struct notifier_block *nb, unsigned long event, void *info) { @@ -298,6 +323,9 @@ static int dsa_switch_event(struct notifier_block *nb, case DSA_NOTIFIER_VLAN_FILTERING: err = dsa_switch_vlan_filtering(ds, info); break; + case DSA_NOTIFIER_MC_DISABLED: + err = dsa_switch_mc_disabled(ds, info); + break; default: err = -EOPNOTSUPP; break; From patchwork Wed Jan 30 00:55:47 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Florian Fainelli X-Patchwork-Id: 1033103 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="iwuhiVXs"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 43q4jb6tmbz9sBZ for ; Wed, 30 Jan 2019 11:58:11 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729184AbfA3A6L (ORCPT ); Tue, 29 Jan 2019 19:58:11 -0500 Received: from mail-pl1-f196.google.com ([209.85.214.196]:44702 "EHLO mail-pl1-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728645AbfA3A6G (ORCPT ); Tue, 29 Jan 2019 19:58:06 -0500 Received: by mail-pl1-f196.google.com with SMTP id e11so10196742plt.11 for ; Tue, 29 Jan 2019 16:58:05 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=Fm1Zq0FkS1gu+XCkDmN+E7wJDkpsjMsTwpBCfwKEV/M=; b=iwuhiVXsNY1fX53SGThUzSEL15PjCwHE1uPJzIBA5eDeJE9EDo2vG+2FJV+EhZT7tK fMG6XD+WGu32DrvPvhwHpjNrVFgwTaALi7c8QCdRjeMb8zPme++JcFXTiW2wCMCLCGPX HPrjhFsydDdY8JHn2OO8bjGcJ3YEGp9aILl7kHmgVoBPuo7eo8BzyuwGJNL3j9UjP1Zq d8rOngcoAliQmbD+zZd1ZgFGMas+gydsyQ6qeYckqUn9l7R05UBmb0GByxF9R8eY1U8S qKHORH0Zos1lsBPjYAcy8909k4wgtdj+Mefm+plPRh7EnSCBGIS5cazGOfQBVySJXI9k 23YQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=Fm1Zq0FkS1gu+XCkDmN+E7wJDkpsjMsTwpBCfwKEV/M=; b=ifW2PcENzPTRbDUrZ/ewOvKN+ypq+zFQyRnyRgDQoiWS90Ml0Vp3harTBoVNDo4Pul wj3d83lW55s9cAIcSP0nw6qIEA/OuIMj44ZnPhVzp8yPdBhg1/BlSLtLPCOnoLXv7aMi Y0u/XRq6Lg6gZXHk0Qpemut2K1403acVrzEdOTrCR8wGLYT2m+os8QEOU7rxbhXBAiPM Q8ZqucnoiKPAzvxlAncJOn9dokVV6IFFxUUE4ZdeOqhnp1WqB/L5Nzewq4dnLKH2pfKz 6A/wOqM3+9AmMBPHrhWC4W4MqBBLIxc2gswuqCJASBq2Rq93DzNq/PvJujjmE4f3835z WKug== X-Gm-Message-State: AJcUukehWatIDpMzIc29zq4S6JgO9lDzXP1gSeef/DAHpoo2sEp0LPnX O43X8YHBN+ZwCgsCjH71MdXTdT4X X-Google-Smtp-Source: ALg8bN7lQV4sWchhe3TYGTd2Mkwn9g6Dh7fjvF3WjPwlcYrViYVSwERM3YXfSWHq1bVBsHUFeU0+wA== X-Received: by 2002:a17:902:a50a:: with SMTP id s10mr26916631plq.278.1548809884668; Tue, 29 Jan 2019 16:58:04 -0800 (PST) Received: from fainelli-desktop.igp.broadcom.net ([192.19.223.250]) by smtp.gmail.com with ESMTPSA id v191sm67837137pgb.77.2019.01.29.16.58.02 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 29 Jan 2019 16:58:03 -0800 (PST) From: Florian Fainelli To: netdev@vger.kernel.org Cc: Florian Fainelli , andrew@lunn.ch, vivien.didelot@gmail.com, davem@davemloft.net, idosch@mellanox.com, jiri@mellanox.com, ilias.apalodimas@linaro.org, ivan.khoronzhuk@linaro.org, roopa@cumulusnetworks.com, nikolay@cumulusnetworks.com Subject: [PATCH net-next v2 11/12] net: dsa: b53: Add support for toggling IGMP snooping Date: Tue, 29 Jan 2019 16:55:47 -0800 Message-Id: <20190130005548.2212-12-f.fainelli@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190130005548.2212-1-f.fainelli@gmail.com> References: <20190130005548.2212-1-f.fainelli@gmail.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Add the required configuration knobs to honor the turning off of IGMP snooping (typically through the bridge interface) which means that when IGMP snooping is off, we must be flooding mutlicast since we do not get any notifications about IGMP join/leave through the network stack running on the bridge. Signed-off-by: Florian Fainelli --- drivers/net/dsa/b53/b53_common.c | 68 ++++++++++++++++++++++++++++++++ drivers/net/dsa/b53/b53_priv.h | 2 + 2 files changed, 70 insertions(+) diff --git a/drivers/net/dsa/b53/b53_common.c b/drivers/net/dsa/b53/b53_common.c index 6c894ad4768a..c0c064a544b9 100644 --- a/drivers/net/dsa/b53/b53_common.c +++ b/drivers/net/dsa/b53/b53_common.c @@ -1640,6 +1640,73 @@ int b53_fdb_dump(struct dsa_switch *ds, int port, } EXPORT_SYMBOL(b53_fdb_dump); +int b53_multicast_toggle(struct dsa_switch *ds, int port, + bool mc_disabled) +{ + unsigned int cpu_port = dsa_to_port(ds, port)->cpu_dp->index; + struct b53_device *dev = ds->priv; + struct net_device *bridge_dev; + struct dsa_port *dp; + unsigned int i; + u8 port_ctrl; + u16 mc_ctrl; + + if (is5325(dev) || is5365(dev)) + return -EOPNOTSUPP; + + /* Handle the case were multiple bridges span the same switch device + * and one of them has a different setting than what is being requested + * which would be breaking filtering semantics for any of the other + * bridge devices. We must also take care of non-bridged ports which + * expect multicast filtering to remain turned on. + */ + for (i = 0; i < ds->num_ports; i++) { + if (dsa_is_unused_port(ds, i) || dsa_is_cpu_port(ds, i)) + continue; + + if (i == port) + continue; + + dp = dsa_to_port(ds, i); + bridge_dev = dp->bridge_dev; + if ((bridge_dev && + bridge_dev != dsa_to_port(ds, port)->bridge_dev && + br_multicast_enabled(bridge_dev) != !mc_disabled) || + (!bridge_dev && mc_disabled)) { + netdev_err(dp->slave, + "MC filtering is global to the switch!\n"); + return -EINVAL; + } + } + + /* Allow CPU port to receive multicast traffic */ + b53_read8(dev, B53_CTRL_PAGE, B53_PORT_CTRL(cpu_port), &port_ctrl); + if (mc_disabled) + port_ctrl |= PORT_CTRL_RX_MCST_EN; + else + port_ctrl &= ~PORT_CTRL_RX_MCST_EN; + b53_write8(dev, B53_CTRL_PAGE, B53_PORT_CTRL(cpu_port), port_ctrl); + + /* Allow port to flood multicast */ + b53_read16(dev, B53_CTRL_PAGE, B53_MC_FLOOD_MASK, &mc_ctrl); + if (mc_disabled) + mc_ctrl |= BIT(port); + else + mc_ctrl &= ~BIT(port); + b53_write16(dev, B53_CTRL_PAGE, B53_MC_FLOOD_MASK, mc_ctrl); + + /* And flood IP multicast as well */ + b53_read16(dev, B53_CTRL_PAGE, B53_IPMC_FLOOD_MASK, &mc_ctrl); + if (mc_disabled) + mc_ctrl |= BIT(port); + else + mc_ctrl &= ~BIT(port); + b53_write16(dev, B53_CTRL_PAGE, B53_IPMC_FLOOD_MASK, mc_ctrl); + + return 0; +} +EXPORT_SYMBOL(b53_multicast_toggle); + int b53_mdb_prepare(struct dsa_switch *ds, int port, const struct switchdev_obj_port_mdb *mdb) { @@ -2025,6 +2092,7 @@ static const struct dsa_switch_ops b53_switch_ops = { .port_mirror_add = b53_mirror_add, .port_mirror_del = b53_mirror_del, .port_mdb_prepare = b53_mdb_prepare, + .port_multicast_toggle = b53_multicast_toggle, .port_mdb_add = b53_mdb_add, .port_mdb_del = b53_mdb_del, }; diff --git a/drivers/net/dsa/b53/b53_priv.h b/drivers/net/dsa/b53/b53_priv.h index 620638ff9338..cd259fb8b00e 100644 --- a/drivers/net/dsa/b53/b53_priv.h +++ b/drivers/net/dsa/b53/b53_priv.h @@ -350,6 +350,8 @@ int b53_fdb_del(struct dsa_switch *ds, int port, const unsigned char *addr, u16 vid); int b53_fdb_dump(struct dsa_switch *ds, int port, dsa_fdb_dump_cb_t *cb, void *data); +int b53_multicast_toggle(struct dsa_switch *ds, int port, + bool mc_disabled); int b53_mdb_prepare(struct dsa_switch *ds, int port, const struct switchdev_obj_port_mdb *mdb); void b53_mdb_add(struct dsa_switch *ds, int port, From patchwork Wed Jan 30 00:55:48 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Florian Fainelli X-Patchwork-Id: 1033102 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="d/hwx3p1"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 43q4jZ5xTYz9s9h for ; Wed, 30 Jan 2019 11:58:10 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728893AbfA3A6J (ORCPT ); Tue, 29 Jan 2019 19:58:09 -0500 Received: from mail-pl1-f195.google.com ([209.85.214.195]:36212 "EHLO mail-pl1-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727833AbfA3A6H (ORCPT ); Tue, 29 Jan 2019 19:58:07 -0500 Received: by mail-pl1-f195.google.com with SMTP id g9so10212872plo.3 for ; Tue, 29 Jan 2019 16:58:07 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=+qzJi+agv1Pb1lZ5X861RzOx5D79MkSnSPigORN4tUs=; b=d/hwx3p1ETAbsByHZbzk61n/I0kMSzf4XseT08ISpNsU0rFt80mePFbwry8LsbZ62Z jPHTSKPYM3NVJz8Ljg4n3UO4Kh77QAttdRI3oaMAz0UEz2F6JoQH8gsw/IFUXBKAAGyB QgqbkYe3bojEPGjOhvU5MUiPK+sSryDUANuidy/Xe41KUhlzFBO7OTJpqDCBC0vsbgZN Ca/z+ouud62uhxhWhDgJXcw87stiP/CiEdcelQdA6NfXgLah2wFAbv/FDMSYegRYtzDl S/9yWrCdIXzZlJquwAyysrdhWpKAOL9dl+ZV/UAjq1dB4ccqsLrls3sCHe7Qu8hMVlPE j9pQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=+qzJi+agv1Pb1lZ5X861RzOx5D79MkSnSPigORN4tUs=; b=kMwjsSmhP0J5NGxLqPceW0CuT12lKehBLSBhzg4VpKf6urh5xLtLacg8YVQbRJ4/g9 aC/tOKB01kOueKBLU5GWVunOjB7msplFFuiBKG9aGb4chMKHGzfhRI1xpjbok0Nxkxck bKuvdeqqYkHk9sqAQO8dTfByZlbq+bKio2PzHS2sRFK+yOHbV3wCz7XszO/O0ZKTdLk6 E2hAAgBMjm9YzigvgOJxukjOOrhSafQR5bWYHGxoAFfOF1TXrS5UjoCCmxo9MQxOFokS kURfnjVB9oGaOgACC73uQKzsavP88pV1YebPl09luMOKa2M14f72zAsyhf7GzbtiaTJ5 EM4w== X-Gm-Message-State: AJcUukeDWYT+zl7amcMnOnZnvRJhjkzmKvEaq/LBFc0UWFE8QW00Ez8Y 4vnilq5FlIfeixKjUSRu0qDQzh/4 X-Google-Smtp-Source: ALg8bN528VD97IguySzuZ5f4W1VINi78vL7zZyK9iC3UqS3759JSqwBSEIHuzyLqjQl1Wge9kwAiwQ== X-Received: by 2002:a17:902:b112:: with SMTP id q18mr28328843plr.255.1548809886517; Tue, 29 Jan 2019 16:58:06 -0800 (PST) Received: from fainelli-desktop.igp.broadcom.net ([192.19.223.250]) by smtp.gmail.com with ESMTPSA id v191sm67837137pgb.77.2019.01.29.16.58.04 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 29 Jan 2019 16:58:05 -0800 (PST) From: Florian Fainelli To: netdev@vger.kernel.org Cc: Florian Fainelli , andrew@lunn.ch, vivien.didelot@gmail.com, davem@davemloft.net, idosch@mellanox.com, jiri@mellanox.com, ilias.apalodimas@linaro.org, ivan.khoronzhuk@linaro.org, roopa@cumulusnetworks.com, nikolay@cumulusnetworks.com Subject: [PATCH net-next v2 12/12] net: dsa: bcm_sf2: Enable management mode Date: Tue, 29 Jan 2019 16:55:48 -0800 Message-Id: <20190130005548.2212-13-f.fainelli@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190130005548.2212-1-f.fainelli@gmail.com> References: <20190130005548.2212-1-f.fainelli@gmail.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Now that we have all the necessary plumbing in place to get notified when a multicast MAC address must be programmed, configure the switch to oeprate in managed mode and let the network stack learn about management traffic. Signed-off-by: Florian Fainelli --- drivers/net/dsa/b53/b53_common.c | 39 ++++++++++++++++++++-- drivers/net/dsa/b53/b53_priv.h | 1 + drivers/net/dsa/bcm_sf2.c | 56 +++++++++++++++++++++++--------- drivers/net/dsa/bcm_sf2_regs.h | 5 +++ 4 files changed, 84 insertions(+), 17 deletions(-) diff --git a/drivers/net/dsa/b53/b53_common.c b/drivers/net/dsa/b53/b53_common.c index c0c064a544b9..10e115a43975 100644 --- a/drivers/net/dsa/b53/b53_common.c +++ b/drivers/net/dsa/b53/b53_common.c @@ -364,8 +364,6 @@ static void b53_enable_vlan(struct b53_device *dev, bool enable, b53_read8(dev, B53_VLAN_PAGE, B53_VLAN_CTRL5, &vc5); } - mgmt &= ~SM_SW_FWD_MODE; - if (enable) { vc0 |= VC0_VLAN_EN | VC0_VID_CHK_EN | VC0_VID_HASH_VID; vc1 |= VC1_RX_MCST_UNTAG_EN | VC1_RX_MCST_FWD_EN; @@ -490,6 +488,43 @@ static int b53_fast_age_vlan(struct b53_device *dev, u16 vid) return b53_flush_arl(dev, FAST_AGE_VLAN); } +void b53_port_learn_setup(struct dsa_switch *ds, int port) +{ + struct b53_device *dev = ds->priv; + u16 reg; + + /* Enable learning */ + b53_read16(dev, B53_CTRL_PAGE, B53_DIS_LEARN, ®); + reg &= ~BIT(port); + b53_write16(dev, B53_CTRL_PAGE, B53_DIS_LEARN, reg); + + /* Software learning control disabled */ + b53_read16(dev, B53_CTRL_PAGE, B53_SFT_LRN_CTRL, ®); + reg &= ~BIT(port); + b53_write16(dev, B53_CTRL_PAGE, B53_SFT_LRN_CTRL, reg); + + /* Configure IP multicast, allow Unicast ARL misses to be forwarded */ + b53_read16(dev, B53_CTRL_PAGE, B53_IP_MULTICAST_CTRL, ®); + reg |= B53_IPMC_FWD_EN | B53_UC_FWD_EN; + b53_write16(dev, B53_CTRL_PAGE, B53_IP_MULTICAST_CTRL, reg); + + /* Set port in Unicast lookup forward map */ + b53_read16(dev, B53_CTRL_PAGE, B53_UC_FLOOD_MASK, ®); + reg |= BIT(port); + b53_write16(dev, B53_CTRL_PAGE, B53_UC_FLOOD_MASK, reg); + + /* Do not set port in Multicast lookup forward map, learn */ + b53_read16(dev, B53_CTRL_PAGE, B53_MC_FLOOD_MASK, ®); + reg &= ~BIT(port); + b53_write16(dev, B53_CTRL_PAGE, B53_MC_FLOOD_MASK, reg); + + /* Do not set port in IP multicast lookup formward map, learn */ + b53_read16(dev, B53_CTRL_PAGE, B53_IPMC_FLOOD_MASK, ®); + reg &= ~BIT(port); + b53_write16(dev, B53_CTRL_PAGE, B53_IPMC_FLOOD_MASK, reg); +} +EXPORT_SYMBOL(b53_port_learn_setup); + void b53_imp_vlan_setup(struct dsa_switch *ds, int cpu_port) { struct b53_device *dev = ds->priv; diff --git a/drivers/net/dsa/b53/b53_priv.h b/drivers/net/dsa/b53/b53_priv.h index cd259fb8b00e..1806304c38cc 100644 --- a/drivers/net/dsa/b53/b53_priv.h +++ b/drivers/net/dsa/b53/b53_priv.h @@ -309,6 +309,7 @@ static inline int b53_switch_get_reset_gpio(struct b53_device *dev) #endif /* Exported functions towards other drivers */ +void b53_port_learn_setup(struct dsa_switch *ds, int port); void b53_imp_vlan_setup(struct dsa_switch *ds, int cpu_port); int b53_configure_vlan(struct dsa_switch *ds); void b53_get_strings(struct dsa_switch *ds, int port, u32 stringset, diff --git a/drivers/net/dsa/bcm_sf2.c b/drivers/net/dsa/bcm_sf2.c index 361fbde76654..c9e6ffb737a4 100644 --- a/drivers/net/dsa/bcm_sf2.c +++ b/drivers/net/dsa/bcm_sf2.c @@ -51,19 +51,19 @@ static void bcm_sf2_imp_setup(struct dsa_switch *ds, int port) reg &= ~P_TXQ_PSM_VDD(port); core_writel(priv, reg, CORE_MEM_PSM_VDD_CTRL); - /* Enable Broadcast, Multicast, Unicast forwarding to IMP port */ - reg = core_readl(priv, CORE_IMP_CTL); - reg |= (RX_BCST_EN | RX_MCST_EN | RX_UCST_EN); - reg &= ~(RX_DIS | TX_DIS); - core_writel(priv, reg, CORE_IMP_CTL); + /* Enable forwarding and managed mode */ + core_writel(priv, SW_FWDG_EN | SW_FWDG_MODE, CORE_SWMODE); - /* Enable forwarding */ - core_writel(priv, SW_FWDG_EN, CORE_SWMODE); + /* Configure port for learning */ + b53_port_learn_setup(ds, port); - /* Enable IMP port in dumb mode */ - reg = core_readl(priv, CORE_SWITCH_CTRL); - reg |= MII_DUMB_FWDG_EN; - core_writel(priv, reg, CORE_SWITCH_CTRL); + /* Enable IGMP and MLD high-level protocol snooping support */ + reg = HL_PRTC_IGMP_RPTLVE_EN | HL_PRTC_IGMP_RPTVLE_FWD_MODE | + HL_PRTC_IGMP_QRY_EN | HL_PRTC_IGMP_QRY_FWD_MODE | + HL_PRTC_IGMP_UKN_EN | HL_PRTC_IGMP_UKN_FWD_MODE | + HL_PRTC_MLD_RPTDONE_EN | HL_PRTC_MLD_RPTDONE_FWD_MODE | + HL_PRTC_MLD_QRY_EN | HL_PRTC_MLD_QRY_FWD_MODE; + b53_write32(priv->dev, B53_MGMT_PAGE, B53_HL_PRTC_CTRL, reg); /* Configure Traffic Class to QoS mapping, allow each priority to map * to a different queue number @@ -75,10 +75,26 @@ static void bcm_sf2_imp_setup(struct dsa_switch *ds, int port) b53_brcm_hdr_setup(ds, port); + /* Set IMP0 or IMP1 port to be managed port, enable BPDU */ + reg = core_readl(priv, CORE_GMNCFGCFG); + reg &= ~(FRM_MGNP_MASK << FRM_MGNP_SHIFT); + if (port == core_readl(priv, CORE_IMP0_PRT_ID)) + reg |= FRM_MNGP_IMP0 << FRM_MGNP_SHIFT; + if (port == core_readl(priv, CORE_IMP1_PRT_ID)) + reg |= FRM_MGNP_IMP_DUAL << FRM_MGNP_SHIFT; + reg |= RXBPDU_EN; + core_writel(priv, reg, CORE_GMNCFGCFG); + /* Force link status for IMP port */ reg = core_readl(priv, offset); reg |= (MII_SW_OR | LINK_STS); core_writel(priv, reg, offset); + + /* Enable Broadcast, Unicast forwarding to IMP port */ + reg = core_readl(priv, CORE_IMP_CTL); + reg |= (RX_BCST_EN | RX_UCST_EN); + reg &= ~(RX_DIS | TX_DIS); + core_writel(priv, reg, CORE_IMP_CTL); } static void bcm_sf2_gphy_enable_set(struct dsa_switch *ds, bool enable) @@ -166,10 +182,8 @@ static int bcm_sf2_port_setup(struct dsa_switch *ds, int port, reg &= ~P_TXQ_PSM_VDD(port); core_writel(priv, reg, CORE_MEM_PSM_VDD_CTRL); - /* Enable learning */ - reg = core_readl(priv, CORE_DIS_LEARN); - reg &= ~BIT(port); - core_writel(priv, reg, CORE_DIS_LEARN); + /* Configure port for learning */ + b53_port_learn_setup(ds, port); /* Enable Broadcom tags for that port if requested */ if (priv->brcm_tag_mask & BIT(port)) @@ -683,6 +697,7 @@ static int bcm_sf2_sw_suspend(struct dsa_switch *ds) { struct bcm_sf2_priv *priv = bcm_sf2_to_priv(ds); unsigned int port; + u32 reg; bcm_sf2_intr_disable(priv); @@ -695,6 +710,13 @@ static int bcm_sf2_sw_suspend(struct dsa_switch *ds) bcm_sf2_port_disable(ds, port, NULL); } + /* Disable management mode since we won't be able to + * perform any tasks while being suspended. + */ + reg = core_readl(priv, CORE_SWMODE); + reg &= ~SW_FWDG_MODE; + core_writel(priv, reg, CORE_SWMODE); + return 0; } @@ -930,6 +952,10 @@ static const struct dsa_switch_ops bcm_sf2_ops = { .set_rxnfc = bcm_sf2_set_rxnfc, .port_mirror_add = b53_mirror_add, .port_mirror_del = b53_mirror_del, + .port_multicast_toggle = b53_multicast_toggle, + .port_mdb_prepare = b53_mdb_prepare, + .port_mdb_add = b53_mdb_add, + .port_mdb_del = b53_mdb_del, }; struct bcm_sf2_of_data { diff --git a/drivers/net/dsa/bcm_sf2_regs.h b/drivers/net/dsa/bcm_sf2_regs.h index 0a1e530d52b7..211db9a2e9e9 100644 --- a/drivers/net/dsa/bcm_sf2_regs.h +++ b/drivers/net/dsa/bcm_sf2_regs.h @@ -222,8 +222,13 @@ enum bcm_sf2_reg_offs { #define CORE_GMNCFGCFG 0x0800 #define RST_MIB_CNT (1 << 0) #define RXBPDU_EN (1 << 1) +#define FRM_MGNP_SHIFT 6 +#define FRM_MGNP_MASK 0x3 +#define FRM_MNGP_IMP0 2 +#define FRM_MGNP_IMP_DUAL 3 #define CORE_IMP0_PRT_ID 0x0804 +#define CORE_IMP1_PRT_ID 0x0808 #define CORE_RST_MIB_CNT_EN 0x0950