From patchwork Wed Jan 16 20:00:54 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Florian Fainelli X-Patchwork-Id: 1026168 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="LcVyfRx+"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 43fyng4rw9z9sDX for ; Thu, 17 Jan 2019 07:03:35 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1732193AbfAPUDe (ORCPT ); Wed, 16 Jan 2019 15:03:34 -0500 Received: from mail-yw1-f66.google.com ([209.85.161.66]:44538 "EHLO mail-yw1-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1732163AbfAPUDc (ORCPT ); Wed, 16 Jan 2019 15:03:32 -0500 Received: by mail-yw1-f66.google.com with SMTP id b63so2900768ywc.11 for ; Wed, 16 Jan 2019 12:03:31 -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=LcVyfRx+TCC10FZUoh5e6sdeuLvrE0m3wH1hnyZ+xrHFo9dPHp5p8CjPR/G8X+raXq DIr3XOvDORyYRfZaM5MgbT1ue5j8NIM/7f0MBU+5lRVP2z4IhSvof4Uo+GKpuugJK9oi YNS7PYa2VOyuv9E0+LZU2FHitpBWUFpAoopfE2OIAK3DjzTSoMsi5ldRXs2UeJutSAz3 djCPYpOnyhgMSTVnkM2Kwdxr1G4xhNy7sxg9QSvs+t6SrcGCb5I998y5h4gAsYDTpGEb VClUr2lU9ApQbGY9LrbuvO1NpIWJtOiit9iwUeM8LIctAQA7RmQGVQYrtbUB2vgHe8g9 GlRA== 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=OfGP8Y4rPE1ogn0vSRGTPPI16Fe6X8fvLkxwvlhwtq5xxJvU2n5qoNt8+fdwYv2Cwi //XjoIK8exwKk8ctYadK3i+sLBQGdMJSNQWsNYBGm1RG9XJOPnkLKpSwl9ucnVW5l4p3 YPvD3tKFkuS3lZCD/twgqtLf1f7z88OZVoGwfUmT+45GqmeSWNrazlbBtpPpG5tjmayf F8l/qGAegoALZjfbrdM/SBjjj6rdMAiEifNHZWR7pc/NHUjgHexwfXPqsFJbqPKF2wsP TLvZsyi9Hm8WgkUU51VR40NezmwxOtPCiV/MzFdC0LseTAj1yBaGdGwoJLawdfXSTP/U 5hAw== X-Gm-Message-State: AJcUukeViTV/QH5esLqo5Fexg7O2ekzsakZ1rbZp6hw0r9tRasPjCWHv Pex5FbixvlsD28QoeGgz1jIuDsFe X-Google-Smtp-Source: ALg8bN5C6rcIEfoZ8wHpX1awxHUusz1Q4zi6Ts0KN6D0mETMI7Jh94PVLxtpha7Et1daQl7g36c5rQ== X-Received: by 2002:a81:1c42:: with SMTP id c63mr8760353ywc.89.1547669010815; Wed, 16 Jan 2019 12:03:30 -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.28 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 16 Jan 2019 12:03:30 -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 06/14] net: dsa: b53: Add support for MDB Date: Wed, 16 Jan 2019 12:00:54 -0800 Message-Id: <20190116200102.2749-7-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 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);