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,