From patchwork Tue Jan 15 19:41:29 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Florian Fainelli X-Patchwork-Id: 1025398 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="XKH8iFBD"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 43fLNR04r4z9s9G for ; Wed, 16 Jan 2019 06:43:03 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2389480AbfAOTnB (ORCPT ); Tue, 15 Jan 2019 14:43:01 -0500 Received: from mail-pg1-f195.google.com ([209.85.215.195]:38377 "EHLO mail-pg1-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2389463AbfAOTmz (ORCPT ); Tue, 15 Jan 2019 14:42:55 -0500 Received: by mail-pg1-f195.google.com with SMTP id g189so1669480pgc.5 for ; Tue, 15 Jan 2019 11:42:54 -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=XKH8iFBD2cPcExLayX/f2MWJTs0I+u5CcavfqBAsJry2/+l0Xx6gUl3KHbJSOIHsln XQQs78Po4TfOEczPso+VIb8BbAq6RMJDDCAOCoU9WHweyHAxFIwYXkxTcPoPbGd2u8Lj 87JiNJ7sOEo3dWJNnXs8R1imPa8UGD+po1ea7NYDqFkbuf1En+ta6rtVpa5UP+b6wKtG 0dxQSSRApmqTplhCjpwdNu0SwKGMi7Hdf77p4qHsekiVZYZUUhivDkOCgLVXoC58hNKp gyK6iroPYP06APivwx6K+TD759g+NSuOD+V2Ju82jEGiReA5scYRDRWhuzjtB4UMonnL Wguw== 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=EBwW5Q5RZI/H+KdVw65tuUjNbqjazl34/6UULl+FHTovkDqzDn4z2rTYXzfLdaudPW CNP39g9+SJiZdpFgN/FN3baTqpUeJ9yR4YRCg3WRFXEy2yHROUIIvZ7G0da9ry8zQWcZ 0VYfpYNt+iVE8LYTsWP3SR2Q5l9a/qDoE4HzODQOmz/ELDalOn131i3WeFasHVb5dUoe 0rKPtDZC1vyEXwOLwnjBt1GoruUOmRLQZ1GkldUZaqyIsKmw31V6jMrHhUBPJle/ZK0N q11F1zC49lKR8ij3bBf19+89/+kj5rNu8/B0wzhFhHEf2IzcTEVLQRb3eZCSVdejCB+9 YTfQ== X-Gm-Message-State: AJcUukeoON9odegVlp7OsVxBwQVnZJIMPOD5X4Mr3oTa+y7jA4WkYpAt 8pzZTh9xINO9GNMBVl+i6SnT9w5w X-Google-Smtp-Source: ALg8bN68FwNwQ5kZ9NYx2aM+otO36WQPci2R52wqQFTPwR1tn0wGYHJAWTdIgaMiRPt9Buk0Qyyt8Q== X-Received: by 2002:a63:df13:: with SMTP id u19mr5302241pgg.294.1547581373302; Tue, 15 Jan 2019 11:42:53 -0800 (PST) Received: from fainelli-desktop.igp.broadcom.net ([192.19.223.250]) by smtp.gmail.com with ESMTPSA id 128sm6954262pfu.129.2019.01.15.11.42.51 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 15 Jan 2019 11:42:52 -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: [RFC net-next 13/14] net: dsa: b53: Add support for toggling IGMP snooping Date: Tue, 15 Jan 2019 11:41:29 -0800 Message-Id: <20190115194130.19896-14-f.fainelli@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190115194130.19896-1-f.fainelli@gmail.com> References: <20190115194130.19896-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,