From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-9.1 required=3.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY, SPF_PASS,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 45D8FC43387 for ; Wed, 16 Jan 2019 20:03:50 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 0579020866 for ; Wed, 16 Jan 2019 20:03:50 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="NSsad5Zf" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1732325AbfAPUDt (ORCPT ); Wed, 16 Jan 2019 15:03:49 -0500 Received: from mail-yw1-f67.google.com ([209.85.161.67]:43661 "EHLO mail-yw1-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1732277AbfAPUDs (ORCPT ); Wed, 16 Jan 2019 15:03:48 -0500 Received: by mail-yw1-f67.google.com with SMTP id n21so2908200ywd.10 for ; Wed, 16 Jan 2019 12:03:47 -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=9X+G7UmBxLH47qeToljX8uA7p5u7jCs+886M6gHJ2Ko=; b=NSsad5ZfbBUX/InRSoURtRV/PAqtwH665HL18Z0SOTQ/qUarCs+qx/ldyiuMMIX889 3rlY8Y9j9ATyS5y8XaGim+ZnFFaCMGBcoPvQiO+GD0+M86rJT+t6jpHOAFkY7VYtM53s VlK9MKq0A1L5e6C69wH3QNARHYViUSd8A1ZWdlbnOSdfvboPCJNFdBbLybDx+eNN37vN YRGJA2c/npTbofSlzYgaxLHyTYXzU4ALiLIMTIhwSCYXYSDpLDhQE+CQIb2YwWLG5rUL wvmI8v+F5MahZvcvZNUQDIGXqA7OOIbWV7v2IO7Emr/9D0i+G7Bp07EvgiC7oxyk2e7A RuRw== 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=9X+G7UmBxLH47qeToljX8uA7p5u7jCs+886M6gHJ2Ko=; b=E60yHBQfwjt59LEMKKvcs/qlIzFLEMTYsL4Wu+MOUtKP8sEuFW0rJpdCNnQcTlLVlv SeTN4ywA1AnOfppgbfbbLMPJ45viaecet2xfjzLG68yXwMKQaRKskwUscmXuWd7ZE71o TBT3dLxKZ5M6NtiwaKOH0Y7jrIxYkZYVNK2flwZX4GyC34sIXEdtOVXWgJx5DhG9uabJ ciYnZA1xIWUV2XkCbYLgOEdhKuiYl85Dghd++BceyfFFe0vx8l+3xRe3Mq4ueJYp0y0+ q39WVDxmwSJtPIOISLQ5YQD214mIHL9wiwuN53DHZNcmF/KpHmUxEF6QxRrPUCnekb/f 5J+w== X-Gm-Message-State: AJcUukdxa1hlGmLIE7gVciX3lLUqXaIu5tzm+0Yzuc4iTP5vU0vsjgRw 6qKAG0MwWYvaN3yTUMp2d4se/nKK X-Google-Smtp-Source: ALg8bN5eqa5Pqu8K2RCptocwThaVj5/BaOyqR0c0hQ2aHQ03OgQg16kLMvyayj2/RWshC+sp3txQ1Q== X-Received: by 2002:a81:a6d7:: with SMTP id d206mr9346706ywh.484.1547669026494; Wed, 16 Jan 2019 12:03:46 -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.44 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 16 Jan 2019 12:03:45 -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 14/14] net: dsa: bcm_sf2: Enable management mode Date: Wed, 16 Jan 2019 12:01:02 -0800 Message-Id: <20190116200102.2749-15-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 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 2c9f6f6abdf3..37bc25107158 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 -- 2.17.1