From patchwork Wed Jan 16 20:01:01 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Florian Fainelli X-Patchwork-Id: 1026176 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="vPBX2E4O"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 43fyp10khVz9sCh for ; Thu, 17 Jan 2019 07:03:53 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1732288AbfAPUDr (ORCPT ); Wed, 16 Jan 2019 15:03:47 -0500 Received: from mail-yw1-f67.google.com ([209.85.161.67]:45621 "EHLO mail-yw1-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1732244AbfAPUDq (ORCPT ); Wed, 16 Jan 2019 15:03:46 -0500 Received: by mail-yw1-f67.google.com with SMTP id d190so2895335ywd.12 for ; Wed, 16 Jan 2019 12:03:45 -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=mdUnN5x3Vn8Yt72tUN0LMxO57uYgS0rR0UfsRiQw270=; b=vPBX2E4O4cKS+/b03UCZwduEfF6G/mVsQFm/Kk9qUuGiQ8j8kHDJwzoHXoOhDzV3ZH YUfGeuy79STc3pDn54m/wX+yrHLVFRty6fHp0qyou/0YC4GiSwCMZP18dcu8oN2moAsD of0+qj8iwz55JsivNk12AGU2Rpev+nwZvW2GFV2ysU5OiSslIiZ3tUlq58CB/vPIzlPi V9o+f0Jzrp+M8H27hl78u6owddT0RJiul8OTMQPsfhP86L39nMGquMzb0q8yvUtXSzaV lML3R1XxR58SBY7vOXWG006BzxYif3z3UVZJw6bgKI2g9yyOMoCApUyoqRxntcx42Us3 prnQ== 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=mdUnN5x3Vn8Yt72tUN0LMxO57uYgS0rR0UfsRiQw270=; b=bEluu4yVCHM/9msX+RLJAyFsLecah73jGNbGkgCHJImHgJ6FRPDw7U3GC50zjyjxmM xUROoS+2NvgtUh7uqko59mOIzN8+I82JA4L38BYXBBOaRNQgzGMINy/8JVReXsCTOohK /jwkwpTEzCZUX+ijGH4dEc9Zp+mAwwUdzJPG45HhybKGhVLFGEi6esrlYU332U+WJLL/ oHWoRN4L9ZiGtIK3rDn0HeupO8R8dLz9/TL6sx/QcPb7/hepsx/+go5M5ThWhI3336x9 v+d9pkXEoEZUkacpQ9NyrnScfQcfcfne4NumZcDbxOIDlNSc5gKizb4LMuDqQwqdU1t5 +3SA== X-Gm-Message-State: AJcUukeKg8PmUe7gFR/SGpvQZcJb4aWSbFgOjkF5x/oSf8+VFuLQPe7I N/4+0rbFadpSZHX9cWy/2D5SAozE X-Google-Smtp-Source: ALg8bN4dnln0LFC+IZLMxfHOK2F4rrJEsgXBB94S80O8MTbkT4N6EGFz8I0ub6SlWBwdRgpFu3A+uQ== X-Received: by 2002:a81:a887:: with SMTP id f129mr9341976ywh.221.1547669024650; Wed, 16 Jan 2019 12:03:44 -0800 (PST) Received: from fainelli-desktop.igp.broadcom.net ([192.19.223.250]) by smtp.gmail.com with ESMTPSA id v128sm2475295ywf.44.2019.01.16.12.03.42 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 16 Jan 2019 12:03:43 -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 13/14] net: dsa: b53: Add support for toggling IGMP snooping Date: Wed, 16 Jan 2019 12:01:01 -0800 Message-Id: <20190116200102.2749-14-f.fainelli@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190116200102.2749-1-f.fainelli@gmail.com> References: <20190116200102.2749-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 | 30 ++++++++++++++++++++++++++++++ drivers/net/dsa/b53/b53_priv.h | 2 ++ 2 files changed, 32 insertions(+) diff --git a/drivers/net/dsa/b53/b53_common.c b/drivers/net/dsa/b53/b53_common.c index 6c894ad4768a..2c9f6f6abdf3 100644 --- a/drivers/net/dsa/b53/b53_common.c +++ b/drivers/net/dsa/b53/b53_common.c @@ -1640,6 +1640,35 @@ 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) +{ + struct b53_device *dev = ds->priv; + u16 mc_ctrl; + + if (is5325(dev) || is5365(dev)) + return -EOPNOTSUPP; + + /* 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 +2054,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,