From patchwork Wed Jan 30 00:55:48 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Florian Fainelli X-Patchwork-Id: 1033102 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="d/hwx3p1"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 43q4jZ5xTYz9s9h for ; Wed, 30 Jan 2019 11:58:10 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728893AbfA3A6J (ORCPT ); Tue, 29 Jan 2019 19:58:09 -0500 Received: from mail-pl1-f195.google.com ([209.85.214.195]:36212 "EHLO mail-pl1-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727833AbfA3A6H (ORCPT ); Tue, 29 Jan 2019 19:58:07 -0500 Received: by mail-pl1-f195.google.com with SMTP id g9so10212872plo.3 for ; Tue, 29 Jan 2019 16:58:07 -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=+qzJi+agv1Pb1lZ5X861RzOx5D79MkSnSPigORN4tUs=; b=d/hwx3p1ETAbsByHZbzk61n/I0kMSzf4XseT08ISpNsU0rFt80mePFbwry8LsbZ62Z jPHTSKPYM3NVJz8Ljg4n3UO4Kh77QAttdRI3oaMAz0UEz2F6JoQH8gsw/IFUXBKAAGyB QgqbkYe3bojEPGjOhvU5MUiPK+sSryDUANuidy/Xe41KUhlzFBO7OTJpqDCBC0vsbgZN Ca/z+ouud62uhxhWhDgJXcw87stiP/CiEdcelQdA6NfXgLah2wFAbv/FDMSYegRYtzDl S/9yWrCdIXzZlJquwAyysrdhWpKAOL9dl+ZV/UAjq1dB4ccqsLrls3sCHe7Qu8hMVlPE j9pQ== 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=+qzJi+agv1Pb1lZ5X861RzOx5D79MkSnSPigORN4tUs=; b=kMwjsSmhP0J5NGxLqPceW0CuT12lKehBLSBhzg4VpKf6urh5xLtLacg8YVQbRJ4/g9 aC/tOKB01kOueKBLU5GWVunOjB7msplFFuiBKG9aGb4chMKHGzfhRI1xpjbok0Nxkxck bKuvdeqqYkHk9sqAQO8dTfByZlbq+bKio2PzHS2sRFK+yOHbV3wCz7XszO/O0ZKTdLk6 E2hAAgBMjm9YzigvgOJxukjOOrhSafQR5bWYHGxoAFfOF1TXrS5UjoCCmxo9MQxOFokS kURfnjVB9oGaOgACC73uQKzsavP88pV1YebPl09luMOKa2M14f72zAsyhf7GzbtiaTJ5 EM4w== X-Gm-Message-State: AJcUukeDWYT+zl7amcMnOnZnvRJhjkzmKvEaq/LBFc0UWFE8QW00Ez8Y 4vnilq5FlIfeixKjUSRu0qDQzh/4 X-Google-Smtp-Source: ALg8bN528VD97IguySzuZ5f4W1VINi78vL7zZyK9iC3UqS3759JSqwBSEIHuzyLqjQl1Wge9kwAiwQ== X-Received: by 2002:a17:902:b112:: with SMTP id q18mr28328843plr.255.1548809886517; Tue, 29 Jan 2019 16:58:06 -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.58.04 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 29 Jan 2019 16:58:05 -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 12/12] net: dsa: bcm_sf2: Enable management mode Date: Tue, 29 Jan 2019 16:55:48 -0800 Message-Id: <20190130005548.2212-13-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 Now that we have all the necessary plumbing in place to get notified when a multicast MAC address must be programmed, configure the switch to oeprate in managed mode and let the network stack learn about management traffic. Signed-off-by: Florian Fainelli --- drivers/net/dsa/b53/b53_common.c | 39 ++++++++++++++++++++-- drivers/net/dsa/b53/b53_priv.h | 1 + drivers/net/dsa/bcm_sf2.c | 56 +++++++++++++++++++++++--------- drivers/net/dsa/bcm_sf2_regs.h | 5 +++ 4 files changed, 84 insertions(+), 17 deletions(-) diff --git a/drivers/net/dsa/b53/b53_common.c b/drivers/net/dsa/b53/b53_common.c index c0c064a544b9..10e115a43975 100644 --- a/drivers/net/dsa/b53/b53_common.c +++ b/drivers/net/dsa/b53/b53_common.c @@ -364,8 +364,6 @@ static void b53_enable_vlan(struct b53_device *dev, bool enable, b53_read8(dev, B53_VLAN_PAGE, B53_VLAN_CTRL5, &vc5); } - mgmt &= ~SM_SW_FWD_MODE; - if (enable) { vc0 |= VC0_VLAN_EN | VC0_VID_CHK_EN | VC0_VID_HASH_VID; vc1 |= VC1_RX_MCST_UNTAG_EN | VC1_RX_MCST_FWD_EN; @@ -490,6 +488,43 @@ static int b53_fast_age_vlan(struct b53_device *dev, u16 vid) return b53_flush_arl(dev, FAST_AGE_VLAN); } +void b53_port_learn_setup(struct dsa_switch *ds, int port) +{ + struct b53_device *dev = ds->priv; + u16 reg; + + /* Enable learning */ + b53_read16(dev, B53_CTRL_PAGE, B53_DIS_LEARN, ®); + reg &= ~BIT(port); + b53_write16(dev, B53_CTRL_PAGE, B53_DIS_LEARN, reg); + + /* Software learning control disabled */ + b53_read16(dev, B53_CTRL_PAGE, B53_SFT_LRN_CTRL, ®); + reg &= ~BIT(port); + b53_write16(dev, B53_CTRL_PAGE, B53_SFT_LRN_CTRL, reg); + + /* Configure IP multicast, allow Unicast ARL misses to be forwarded */ + b53_read16(dev, B53_CTRL_PAGE, B53_IP_MULTICAST_CTRL, ®); + reg |= B53_IPMC_FWD_EN | B53_UC_FWD_EN; + b53_write16(dev, B53_CTRL_PAGE, B53_IP_MULTICAST_CTRL, reg); + + /* Set port in Unicast lookup forward map */ + b53_read16(dev, B53_CTRL_PAGE, B53_UC_FLOOD_MASK, ®); + reg |= BIT(port); + b53_write16(dev, B53_CTRL_PAGE, B53_UC_FLOOD_MASK, reg); + + /* Do not set port in Multicast lookup forward map, learn */ + b53_read16(dev, B53_CTRL_PAGE, B53_MC_FLOOD_MASK, ®); + reg &= ~BIT(port); + b53_write16(dev, B53_CTRL_PAGE, B53_MC_FLOOD_MASK, reg); + + /* Do not set port in IP multicast lookup formward map, learn */ + b53_read16(dev, B53_CTRL_PAGE, B53_IPMC_FLOOD_MASK, ®); + reg &= ~BIT(port); + b53_write16(dev, B53_CTRL_PAGE, B53_IPMC_FLOOD_MASK, reg); +} +EXPORT_SYMBOL(b53_port_learn_setup); + void b53_imp_vlan_setup(struct dsa_switch *ds, int cpu_port) { struct b53_device *dev = ds->priv; diff --git a/drivers/net/dsa/b53/b53_priv.h b/drivers/net/dsa/b53/b53_priv.h index cd259fb8b00e..1806304c38cc 100644 --- a/drivers/net/dsa/b53/b53_priv.h +++ b/drivers/net/dsa/b53/b53_priv.h @@ -309,6 +309,7 @@ static inline int b53_switch_get_reset_gpio(struct b53_device *dev) #endif /* Exported functions towards other drivers */ +void b53_port_learn_setup(struct dsa_switch *ds, int port); void b53_imp_vlan_setup(struct dsa_switch *ds, int cpu_port); int b53_configure_vlan(struct dsa_switch *ds); void b53_get_strings(struct dsa_switch *ds, int port, u32 stringset, diff --git a/drivers/net/dsa/bcm_sf2.c b/drivers/net/dsa/bcm_sf2.c index 361fbde76654..c9e6ffb737a4 100644 --- a/drivers/net/dsa/bcm_sf2.c +++ b/drivers/net/dsa/bcm_sf2.c @@ -51,19 +51,19 @@ static void bcm_sf2_imp_setup(struct dsa_switch *ds, int port) reg &= ~P_TXQ_PSM_VDD(port); core_writel(priv, reg, CORE_MEM_PSM_VDD_CTRL); - /* Enable Broadcast, Multicast, Unicast forwarding to IMP port */ - reg = core_readl(priv, CORE_IMP_CTL); - reg |= (RX_BCST_EN | RX_MCST_EN | RX_UCST_EN); - reg &= ~(RX_DIS | TX_DIS); - core_writel(priv, reg, CORE_IMP_CTL); + /* Enable forwarding and managed mode */ + core_writel(priv, SW_FWDG_EN | SW_FWDG_MODE, CORE_SWMODE); - /* Enable forwarding */ - core_writel(priv, SW_FWDG_EN, CORE_SWMODE); + /* Configure port for learning */ + b53_port_learn_setup(ds, port); - /* Enable IMP port in dumb mode */ - reg = core_readl(priv, CORE_SWITCH_CTRL); - reg |= MII_DUMB_FWDG_EN; - core_writel(priv, reg, CORE_SWITCH_CTRL); + /* Enable IGMP and MLD high-level protocol snooping support */ + reg = HL_PRTC_IGMP_RPTLVE_EN | HL_PRTC_IGMP_RPTVLE_FWD_MODE | + HL_PRTC_IGMP_QRY_EN | HL_PRTC_IGMP_QRY_FWD_MODE | + HL_PRTC_IGMP_UKN_EN | HL_PRTC_IGMP_UKN_FWD_MODE | + HL_PRTC_MLD_RPTDONE_EN | HL_PRTC_MLD_RPTDONE_FWD_MODE | + HL_PRTC_MLD_QRY_EN | HL_PRTC_MLD_QRY_FWD_MODE; + b53_write32(priv->dev, B53_MGMT_PAGE, B53_HL_PRTC_CTRL, reg); /* Configure Traffic Class to QoS mapping, allow each priority to map * to a different queue number @@ -75,10 +75,26 @@ static void bcm_sf2_imp_setup(struct dsa_switch *ds, int port) b53_brcm_hdr_setup(ds, port); + /* Set IMP0 or IMP1 port to be managed port, enable BPDU */ + reg = core_readl(priv, CORE_GMNCFGCFG); + reg &= ~(FRM_MGNP_MASK << FRM_MGNP_SHIFT); + if (port == core_readl(priv, CORE_IMP0_PRT_ID)) + reg |= FRM_MNGP_IMP0 << FRM_MGNP_SHIFT; + if (port == core_readl(priv, CORE_IMP1_PRT_ID)) + reg |= FRM_MGNP_IMP_DUAL << FRM_MGNP_SHIFT; + reg |= RXBPDU_EN; + core_writel(priv, reg, CORE_GMNCFGCFG); + /* Force link status for IMP port */ reg = core_readl(priv, offset); reg |= (MII_SW_OR | LINK_STS); core_writel(priv, reg, offset); + + /* Enable Broadcast, Unicast forwarding to IMP port */ + reg = core_readl(priv, CORE_IMP_CTL); + reg |= (RX_BCST_EN | RX_UCST_EN); + reg &= ~(RX_DIS | TX_DIS); + core_writel(priv, reg, CORE_IMP_CTL); } static void bcm_sf2_gphy_enable_set(struct dsa_switch *ds, bool enable) @@ -166,10 +182,8 @@ static int bcm_sf2_port_setup(struct dsa_switch *ds, int port, reg &= ~P_TXQ_PSM_VDD(port); core_writel(priv, reg, CORE_MEM_PSM_VDD_CTRL); - /* Enable learning */ - reg = core_readl(priv, CORE_DIS_LEARN); - reg &= ~BIT(port); - core_writel(priv, reg, CORE_DIS_LEARN); + /* Configure port for learning */ + b53_port_learn_setup(ds, port); /* Enable Broadcom tags for that port if requested */ if (priv->brcm_tag_mask & BIT(port)) @@ -683,6 +697,7 @@ static int bcm_sf2_sw_suspend(struct dsa_switch *ds) { struct bcm_sf2_priv *priv = bcm_sf2_to_priv(ds); unsigned int port; + u32 reg; bcm_sf2_intr_disable(priv); @@ -695,6 +710,13 @@ static int bcm_sf2_sw_suspend(struct dsa_switch *ds) bcm_sf2_port_disable(ds, port, NULL); } + /* Disable management mode since we won't be able to + * perform any tasks while being suspended. + */ + reg = core_readl(priv, CORE_SWMODE); + reg &= ~SW_FWDG_MODE; + core_writel(priv, reg, CORE_SWMODE); + return 0; } @@ -930,6 +952,10 @@ static const struct dsa_switch_ops bcm_sf2_ops = { .set_rxnfc = bcm_sf2_set_rxnfc, .port_mirror_add = b53_mirror_add, .port_mirror_del = b53_mirror_del, + .port_multicast_toggle = b53_multicast_toggle, + .port_mdb_prepare = b53_mdb_prepare, + .port_mdb_add = b53_mdb_add, + .port_mdb_del = b53_mdb_del, }; struct bcm_sf2_of_data { diff --git a/drivers/net/dsa/bcm_sf2_regs.h b/drivers/net/dsa/bcm_sf2_regs.h index 0a1e530d52b7..211db9a2e9e9 100644 --- a/drivers/net/dsa/bcm_sf2_regs.h +++ b/drivers/net/dsa/bcm_sf2_regs.h @@ -222,8 +222,13 @@ enum bcm_sf2_reg_offs { #define CORE_GMNCFGCFG 0x0800 #define RST_MIB_CNT (1 << 0) #define RXBPDU_EN (1 << 1) +#define FRM_MGNP_SHIFT 6 +#define FRM_MGNP_MASK 0x3 +#define FRM_MNGP_IMP0 2 +#define FRM_MGNP_IMP_DUAL 3 #define CORE_IMP0_PRT_ID 0x0804 +#define CORE_IMP1_PRT_ID 0x0808 #define CORE_RST_MIB_CNT_EN 0x0950