From patchwork Tue Jan 15 19:41:22 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Florian Fainelli X-Patchwork-Id: 1025397 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="BGUpgvFZ"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 43fLNP1wSwz9s9G for ; Wed, 16 Jan 2019 06:43:01 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2389450AbfAOTmr (ORCPT ); Tue, 15 Jan 2019 14:42:47 -0500 Received: from mail-pg1-f196.google.com ([209.85.215.196]:44759 "EHLO mail-pg1-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2389415AbfAOTmm (ORCPT ); Tue, 15 Jan 2019 14:42:42 -0500 Received: by mail-pg1-f196.google.com with SMTP id t13so1655396pgr.11 for ; Tue, 15 Jan 2019 11:42:42 -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=BGUpgvFZ8FSrAoJtHAsqX53BCTIKOCP69yVIZ0NjToEzeV6qCJlIY2V7X3DVaxiduD XZBsS04aPuHQ01Dkm/kwy+6w+OHnQhS+LMUK/9nkeN3Gs0hJ6z44khiU8ZGo0nBt7Ame vcBAjDAt8QWN8JJfcJzjdkszAW2JVW74ietlBvN6xkWm8Wb2JIIcyKwQi/2e2uoA2RTi hnc2S001MiNSGZRbLw/tSGXVqQmdHYLn2ICAS5WYxKFDlKUUMAlbglAcOx9cgNRB+cLA NDWZfYQVlCoJCorJuKjEARmbBfFMcheRWABLQlRS1hTgEzYbuej4CqImB4wkn9pTAxvZ ThlA== 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=GZJRLhdZgUF2vGjfiQWNqEfAux2qoZ5GkLLasrh7SG6Fe50mvizgcUieCU+HJFzl2q BggaQwq6XPaMv/sunSKgdxIiTdChGTbVBeB8m6TazX9CQm03n+XqFTWErQ0YYS+a28NW 3gDYZQmCLlxBVR4u+JALlDYD7iesC0gDPyx5QnwLNHHGayNRzer5kzmOxbm/aCVk7aWF GqEzUsGz7TR/5M/rq3twOe6uRrb/TKjSr1O2uU8F8n1FqY7Wq8+uwbCon34PsTlgi6f6 I3hdbc2lRq36wTsPKowrgJSFole1P4Af0fFlekStsdVyI56E9jsumhnBZFFWblHbrQUk ozTA== X-Gm-Message-State: AJcUukd+6RPji7ZwpJyKPtn3Psf1xPaDFbJ7MNi2qxaAXz569bkbyFG2 MqExxy4Ijk7XQoZYF97dCQqk3iVe X-Google-Smtp-Source: ALg8bN4lW/TJ6/swu2JWmtNWaIc9TUgVP2TU90p4I1zyVBJXdoJXVk5iLYpzjKh/sC1oDd4rUfwKhQ== X-Received: by 2002:a63:c0f:: with SMTP id b15mr5314863pgl.314.1547581361245; Tue, 15 Jan 2019 11:42:41 -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.39 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 15 Jan 2019 11:42:40 -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 06/14] net: dsa: b53: Add support for MDB Date: Tue, 15 Jan 2019 11:41:22 -0800 Message-Id: <20190115194130.19896-7-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 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);