From patchwork Wed Jan 30 00:55:42 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Florian Fainelli X-Patchwork-Id: 1033097 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="UsvK06oN"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 43q4jN6gHxz9s9h for ; Wed, 30 Jan 2019 11:58:00 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728299AbfA3A56 (ORCPT ); Tue, 29 Jan 2019 19:57:58 -0500 Received: from mail-pg1-f195.google.com ([209.85.215.195]:36501 "EHLO mail-pg1-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727942AbfA3A55 (ORCPT ); Tue, 29 Jan 2019 19:57:57 -0500 Received: by mail-pg1-f195.google.com with SMTP id n2so9565558pgm.3 for ; Tue, 29 Jan 2019 16:57:56 -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=UsvK06oNis2dUV2LDwZ3rKKztzbw9D3I/ETiJSBr5gl1c9M9Sbbx2CbkEOEeX57bcK 5mCHAoMiI7EpFcV0PZXlB0ypLEhmhRHhDjwyutt6UEGKd+tdI2QULgzDeE1zYH8T95vC y9JQGExfppZUy+jB4U0ZHMQsO5+ybRtClePLXfewfPR8cGB8eqAKY7Xc1kcieRBt7Qqb ruViQZiknuWGALtwI3XGoc0n0vH+bXZORHMUkwWjLsNduZd5rvd3yWZcgTuukAQMES/u U7V/EQ04/Nwp5yRmgoTEiXevXDpzfIJlXhRUmF1SxrC9tL+yKW5DkrWcm4hfKOVlzjfc 6iRw== 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=nS1yKGpVr/G4105oh+JRYKfNsMixdoGNXkcv22lfFkvINBb0ZUqx25ZoJQXeOTqAOf mBef1kCUSQWIPHrJarXtpEhwO9MEmAOayswEJq/vekviJEQc0FF86BRizrC0Jux2F7xf 7seNVoAPgnjqp2MBm5wOVXMp1dV7VOIkugmpiphjJoPWweFqRoN8+bQXr06cgBQuv1o0 LTR527nOxKO7UfQ6PVXXcofD+YmDDf19aRJ056AR+bKkj+YftK6Oxqx4v5KIi3ANmZxs 3Se/IRUCPOPCFtm9+qlj2Ch1RVIcSp6MRxs4/ATcpyKbly6pqp5B1evAn0wOZp+Bm1Rk kovw== X-Gm-Message-State: AJcUukeis7cCAJt8NNcw9R7ePUqmcdv0hL0MU5+ucH1D2idbx6PRviSZ 0JYt1w/zSPjsVHjQFH6VJDpVgDZl X-Google-Smtp-Source: ALg8bN5LL3K13Nz1OZbYR+SUPN2HYMisEcq9afzNJuzozPkRrFHxqkxAHlz6Ao9l6np1KeM2JYXc3A== X-Received: by 2002:a63:6207:: with SMTP id w7mr24753164pgb.90.1548809876080; Tue, 29 Jan 2019 16:57:56 -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.57.54 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 29 Jan 2019 16:57:55 -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 06/12] net: dsa: b53: Add support for MDB Date: Tue, 29 Jan 2019 16:55:42 -0800 Message-Id: <20190130005548.2212-7-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 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);