From patchwork Wed Oct 24 22:10:57 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ivan Khoronzhuk X-Patchwork-Id: 149505 Delivered-To: patch@linaro.org Received: by 2002:a2e:299d:0:0:0:0:0 with SMTP id p29-v6csp560898ljp; Wed, 24 Oct 2018 15:11:20 -0700 (PDT) X-Google-Smtp-Source: AJdET5cxbYg2ajhWEskwx9dYZm5GNjoaRvcshdUHVVm8F9cSYRK7mHLqRMoab6pkIp25CoRx/Iy9 X-Received: by 2002:a17:902:9a44:: with SMTP id x4-v6mr4020972plv.121.1540419079699; Wed, 24 Oct 2018 15:11:19 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1540419079; cv=none; d=google.com; s=arc-20160816; b=wNwbvl1JQj9O8qCgAaBJMMQ9D4wqzrr358jHzf+lh7X2CnWIBajfr8HAO8+rINJs4M f6jc7u2AbVM8WID8IC2pssf3utZG0JOJMn+Xo66TZTEo/lCpMATEsk3hu0dnzQoyF4+N rUudqRLWtRMXR6G2dGnoqseSKDFvhAtBhK2foAWWEr1Reu6cbnc+fq0yKie4Zo2ClgQe CtW8NMb7jTPCupziVVAfsZZgO9dBHwcfaiBNiCdZQbbDJX2AgIZu7EjQz+Sg0kmp7FlO 4BUpMnc1c4Z3KlKqZMpB/N0a0R4lUdkB1iAblGpWpJHekU8+mu6bQ6A+WMw1Y49BdgH5 95+A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:dkim-signature; bh=kt0ifiviCYm9e+arNneTDb/upc83BNkTvPy8eJnbc1A=; b=X/VAUUlW5YqRjyi6ghpkdd3D1l1B3GCqMULYaR+U+eYrt3idPP+9sIC2eiEPIDJ8oo cxrCUzPVkz3rPgTq6EbAWjjuZYb2HFTltoZfg7u+CIRldZDZp0XV14HDn3FUHx8D9Mku NFd8xvNBSIzPna77MCBZoqp0H9gZZspQtJg58iDh/yqUGpPvA000UigxK8lpBG3hjvW1 c4MDvpfP6b8SXkvjznYYOa7n+jDu3UFJoKa0/T8MxjHb4GMGP7BU2/ep4gznGMNcRykV vdtQN/N8OY3xruVplsxQoKo2LJmnlZ6NoY0Y70Rteq1ssKAI8A/HdcEjDDgUpuoy5goq 92zA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=ggodCmSy; spf=pass (google.com: best guess record for domain of netdev-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=netdev-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id e32-v6si6012599plb.309.2018.10.24.15.11.19; Wed, 24 Oct 2018 15:11:19 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of netdev-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=ggodCmSy; spf=pass (google.com: best guess record for domain of netdev-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=netdev-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727221AbeJYGlI (ORCPT + 10 others); Thu, 25 Oct 2018 02:41:08 -0400 Received: from mail-lf1-f65.google.com ([209.85.167.65]:43149 "EHLO mail-lf1-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725829AbeJYGlH (ORCPT ); Thu, 25 Oct 2018 02:41:07 -0400 Received: by mail-lf1-f65.google.com with SMTP id p34-v6so5196395lfg.10 for ; Wed, 24 Oct 2018 15:11:15 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=kt0ifiviCYm9e+arNneTDb/upc83BNkTvPy8eJnbc1A=; b=ggodCmSyrpsvTrMb5CjscBt0YsKysH+YCtsFI/jgJVBzUDXK2BPABys6p8rLaw0i2p aVqW20qx6zqgqdUjnGTxhIaHhaRXcP9YIP74tW8Tt/c4akq5mmCUZGsfZTjfADXyQyxQ 6G3hGh+dTm83w3pV9VJL+U8KALfm8X2QtQIAk= 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=kt0ifiviCYm9e+arNneTDb/upc83BNkTvPy8eJnbc1A=; b=jPu2HdKcUZjjtmlU4H0DwUoUrQCiTtu8wtlusmz4AirZVk/4u13rN999AQMJpeP5rr 789YWvxvLMBhBfrGcErEuRM/JecK1WuoRRThHKPuC9etHCZ33kKhsHvAAL0fJYPd/LS8 FQ6UIquof1Kw2nJjsKIQhELpgsNKsIXfRrAeeAdtZwTWwpAcCLwF8vddJ/JyoGDPccjp Es4xCQXGiQ8wa2vQi1NJhkDvoSoDRgBYvPYmRxmd1ELk72cpedwTXoJ9AtkLkudq2tAZ 2TLehZw4abGXtn9hNEdMxn1mFdRyDSkDIryUARz/fYh8uJ6onGUJ9Qr6foBJ4qVla78V Ud/w== X-Gm-Message-State: AGRZ1gLZyVfeOyZ6YNdnsDijiY6H5F54SlCsYZVQ86sl9PqQQYeS43Xy v2SOEGnBbWf2vjGBufyaS+GBTQ== X-Received: by 2002:a19:d824:: with SMTP id p36-v6mr73317lfg.23.1540419074714; Wed, 24 Oct 2018 15:11:14 -0700 (PDT) Received: from localhost.localdomain (59-201-94-178.pool.ukrtel.net. [178.94.201.59]) by smtp.gmail.com with ESMTPSA id f19-v6sm835350ljc.31.2018.10.24.15.11.13 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 24 Oct 2018 15:11:13 -0700 (PDT) From: Ivan Khoronzhuk To: grygorii.strashko@ti.com, davem@davemloft.net Cc: linux-omap@vger.kernel.org, netdev@vger.kernel.org, linux-kernel@vger.kernel.org, alexander.h.duyck@intel.com, bjorn@mork.no, Ivan Khoronzhuk Subject: [PATCH net-next 2/4] net: 8021q: vlan_core: allow use list of vlans for real device Date: Thu, 25 Oct 2018 01:10:57 +0300 Message-Id: <20181024221059.21834-3-ivan.khoronzhuk@linaro.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20181024221059.21834-1-ivan.khoronzhuk@linaro.org> References: <20181024221059.21834-1-ivan.khoronzhuk@linaro.org> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org It's redundancy for the drivers to hold the list of vlans when absolutely the same list exists in vlan core. In most cases it's needed only to traverse the vlan devices, their vids and sync some settings with h/w, so add API to simplify this. At least some of these drivers also can benefit: grep "for_each.*vid" -r drivers/net/ethernet/ drivers/net/ethernet/hisilicon/hns3/hns3_enet.c: drivers/net/ethernet/synopsys/dwc-xlgmac-hw.c: drivers/net/ethernet/qlogic/qlge/qlge_main.c: drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c: drivers/net/ethernet/via/via-rhine.c: drivers/net/ethernet/via/via-velocity.c: drivers/net/ethernet/intel/igb/igb_main.c: drivers/net/ethernet/intel/ice/ice_main.c: drivers/net/ethernet/intel/e1000/e1000_main.c: drivers/net/ethernet/intel/i40e/i40e_main.c: drivers/net/ethernet/intel/e1000e/netdev.c: drivers/net/ethernet/intel/igbvf/netdev.c: drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c: drivers/net/ethernet/intel/ixgb/ixgb_main.c: drivers/net/ethernet/intel/ixgbe/ixgbe_main.c: drivers/net/ethernet/amd/xgbe/xgbe-dev.c: drivers/net/ethernet/emulex/benet/be_main.c: drivers/net/ethernet/neterion/vxge/vxge-main.c: drivers/net/ethernet/adaptec/starfire.c: drivers/net/ethernet/brocade/bna/bnad.c: Reviewed-by: Grygorii Strashko Signed-off-by: Ivan Khoronzhuk --- include/linux/if_vlan.h | 11 +++++++++++ net/8021q/vlan_core.c | 27 +++++++++++++++++++++++++++ 2 files changed, 38 insertions(+) -- 2.17.1 diff --git a/include/linux/if_vlan.h b/include/linux/if_vlan.h index 83ea4df6ab81..410a14cd856c 100644 --- a/include/linux/if_vlan.h +++ b/include/linux/if_vlan.h @@ -133,6 +133,9 @@ struct vlan_pcpu_stats { extern struct net_device *__vlan_find_dev_deep_rcu(struct net_device *real_dev, __be16 vlan_proto, u16 vlan_id); +extern int vlan_for_each(struct net_device *dev, + int (*action)(struct net_device *dev, int vid, + void *arg), void *arg); extern struct net_device *vlan_dev_real_dev(const struct net_device *dev); extern u16 vlan_dev_vlan_id(const struct net_device *dev); extern __be16 vlan_dev_vlan_proto(const struct net_device *dev); @@ -236,6 +239,14 @@ __vlan_find_dev_deep_rcu(struct net_device *real_dev, return NULL; } +static inline int +vlan_for_each(struct net_device *dev, + int (*action)(struct net_device *dev, int vid, void *arg), + void *arg) +{ + return 0; +} + static inline struct net_device *vlan_dev_real_dev(const struct net_device *dev) { BUG(); diff --git a/net/8021q/vlan_core.c b/net/8021q/vlan_core.c index 4f60e86f4b8d..6308b5427a66 100644 --- a/net/8021q/vlan_core.c +++ b/net/8021q/vlan_core.c @@ -223,6 +223,33 @@ static int vlan_kill_rx_filter_info(struct net_device *dev, __be16 proto, u16 vi return -ENODEV; } +int vlan_for_each(struct net_device *dev, + int (*action)(struct net_device *dev, int vid, void *arg), + void *arg) +{ + struct vlan_vid_info *vid_info; + struct vlan_info *vlan_info; + struct net_device *vdev; + int ret; + + ASSERT_RTNL(); + + vlan_info = rtnl_dereference(dev->vlan_info); + if (!vlan_info) + return 0; + + list_for_each_entry(vid_info, &vlan_info->vid_list, list) { + vdev = vlan_group_get_device(&vlan_info->grp, vid_info->proto, + vid_info->vid); + ret = action(vdev, vid_info->vid, arg); + if (ret) + return ret; + } + + return 0; +} +EXPORT_SYMBOL(vlan_for_each); + int vlan_filter_push_vids(struct vlan_info *vlan_info, __be16 proto) { struct net_device *real_dev = vlan_info->real_dev; From patchwork Wed Oct 24 22:10:58 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ivan Khoronzhuk X-Patchwork-Id: 149507 Delivered-To: patch@linaro.org Received: by 2002:a2e:299d:0:0:0:0:0 with SMTP id p29-v6csp560927ljp; Wed, 24 Oct 2018 15:11:21 -0700 (PDT) X-Google-Smtp-Source: AJdET5dHnHvn42K4oMZWEKkUWEFoDJ2qB68GzmNvicec+PplxvEEyE0i/jjmX/sGGL5hUgCubLE0 X-Received: by 2002:aa7:84cc:: with SMTP id x12-v6mr4322681pfn.220.1540419081739; Wed, 24 Oct 2018 15:11:21 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1540419081; cv=none; d=google.com; s=arc-20160816; b=JO4f2aBPsnaEHgJ0XxJ217/RN9daYELcCVx7cMqFMsQhYkAwqWsy1izpEanIyM5A37 8ZNn03+/zn2UUHGIAsTZr/z/4XHywdsqtB1kB9n+1XYcjoY8OP7VmdvxQZwVvYnj5gGQ tpvZaecRBGsWeyFop1mX/SzGteLYDwOLIKtfGV5b3qolJ9PyatAjJSfAkhu3JFfTWuMi qucDbR/hVMjwrQw/nWOm78OvNjMwa/JlDjw5TvxOJrOzQeZl+avUYWQFduH4Ka9jdqrr 8yIhyWV2f110B6eciZc1C9/0uoqNYt9smqHneA4FlF36Jk+lIu5i6cCN3H+KpYCp283b 0BWQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:dkim-signature; bh=PUiuww+CWdHe5/9bJQng7EShpQKWC1i8aYNDyUPA2z0=; b=wfg+dVMdzKMmg5SXeJh/YPwP7U+hsRq23iNBr5uaunCZmfrFgGH26mDnphuFWgEfKR srJr/rJ/ii0taej2tZXK9HMXfCQwK2VVAhSf6M91POv5TIgmseQjlUSpnmmXusqIgVwm ByiFlCE3jPp7G/ZdHENQcFwkkezE7pwCIOzEh4783bwlT8pFB/99KUbMrAg6iza3XwYu 1mzkzn/LtDAVV0oHnm5zClthwILPpSxkTLnW2YeNniRVwfv3pJDwU39bhnNwIk0leaZm gCwNZYkt27sMCoKH7z50gUb8un48C5V1f9Uu9V31iJadtaFy7kwPAM5iGLiyO+MDAXtb 5gJg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=hcMAbRxv; spf=pass (google.com: best guess record for domain of netdev-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=netdev-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id e32-v6si6012599plb.309.2018.10.24.15.11.21; Wed, 24 Oct 2018 15:11:21 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of netdev-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=hcMAbRxv; spf=pass (google.com: best guess record for domain of netdev-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=netdev-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727367AbeJYGlL (ORCPT + 10 others); Thu, 25 Oct 2018 02:41:11 -0400 Received: from mail-lj1-f196.google.com ([209.85.208.196]:44509 "EHLO mail-lj1-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726236AbeJYGlJ (ORCPT ); Thu, 25 Oct 2018 02:41:09 -0400 Received: by mail-lj1-f196.google.com with SMTP id v6-v6so6256366ljc.11 for ; Wed, 24 Oct 2018 15:11:17 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=PUiuww+CWdHe5/9bJQng7EShpQKWC1i8aYNDyUPA2z0=; b=hcMAbRxvifU4qmZ1MlmdQ1YmXW7gGEXYLDI+TNG0ZAbIR1lezYSvPFNmv9B8rleeO9 xR59yhPENieK27UAILqcjjZ/6UXdD8s4exbcSO9stfARzHLhUO96nIxDAsSiAbkGPPQu gq4v66g3Lf2SLzN2KgM8I08Q61tBZmP+f2CwQ= 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=PUiuww+CWdHe5/9bJQng7EShpQKWC1i8aYNDyUPA2z0=; b=hAx4elk6gdWD+kAwpmAa6bxIwyIKiZUcVt9UufnFUNTKoNOOEp475SxGbHTtjIT06r PaZXZUN/eGErC4uu4DN4DHPfr9N9uGQ2woRJt5ZoxJfM9qtitsZHuCc/K9OU7/B2K0qx UX7YIuX1m8a5ObYgYWnE6e3N83Qgs+mOUo+SkpGFxL0oIxt2hk1en0La5/nRI6bNsHMu U+GcJPVbi7Q65gGFl3k5LHRniBK5ZPt03f9Tion3bL3DvcoU7zVz/EDJpaR4i6R+qPp+ SUoYEWCjx3T3xTF5rtdRU0A5qd3z5shwb8N/E1d8KHw9NxORKQLYGnBL5T4hksLIRtdQ guig== X-Gm-Message-State: AGRZ1gLmd5D38lWIXkRQtKNZlBgzVgGt94tU33f+Qai8e37jeUAQ+Vw9 wFlQZ7zqz6Gzu3Ve82XBjeJqaw== X-Received: by 2002:a2e:9355:: with SMTP id m21-v6mr2894707ljh.135.1540419076166; Wed, 24 Oct 2018 15:11:16 -0700 (PDT) Received: from localhost.localdomain (59-201-94-178.pool.ukrtel.net. [178.94.201.59]) by smtp.gmail.com with ESMTPSA id f19-v6sm835350ljc.31.2018.10.24.15.11.14 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 24 Oct 2018 15:11:15 -0700 (PDT) From: Ivan Khoronzhuk To: grygorii.strashko@ti.com, davem@davemloft.net Cc: linux-omap@vger.kernel.org, netdev@vger.kernel.org, linux-kernel@vger.kernel.org, alexander.h.duyck@intel.com, bjorn@mork.no, Ivan Khoronzhuk Subject: [PATCH net-next 3/4] net: ethernet: ti: cpsw: fix vlan mcast Date: Thu, 25 Oct 2018 01:10:58 +0300 Message-Id: <20181024221059.21834-4-ivan.khoronzhuk@linaro.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20181024221059.21834-1-ivan.khoronzhuk@linaro.org> References: <20181024221059.21834-1-ivan.khoronzhuk@linaro.org> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org At this moment, mcast addresses are added for real device only (reserved vlans for dual-emac mode), even if a mcast address was added for some vlan only, thus ALE doesn't have corresponding vlan mcast entries after vlan socket joined multicast group. So ALE drops vlan frames with mcast addresses intended for vlans and potentially can receive mcast frames for base ndev. That's not correct. So, fix it by creating only vlan/mcast entries as requested. Patch doesn't use any additional lists and is based on device mc address list and cpsw ALE table entries. In legacy switch mode ALE table can have untracked vlan addresses, it can conflict with method used to delete vlan mcast addresses, so for switch mode, do syncing as it is, leaving ability for a user to modify table in usual for him sequence. Signed-off-by: Ivan Khoronzhuk --- drivers/net/ethernet/ti/cpsw.c | 195 +++++++++++++++++++++++++++------ 1 file changed, 164 insertions(+), 31 deletions(-) -- 2.17.1 diff --git a/drivers/net/ethernet/ti/cpsw.c b/drivers/net/ethernet/ti/cpsw.c index 500f7ed8c58c..27e0a5d5ccf9 100644 --- a/drivers/net/ethernet/ti/cpsw.c +++ b/drivers/net/ethernet/ti/cpsw.c @@ -570,21 +570,6 @@ static inline int cpsw_get_slave_port(u32 slave_num) return slave_num + 1; } -static void cpsw_add_mcast(struct cpsw_priv *priv, const u8 *addr) -{ - struct cpsw_common *cpsw = priv->cpsw; - - if (cpsw->data.dual_emac) { - struct cpsw_slave *slave = cpsw->slaves + priv->emac_port; - - cpsw_ale_add_mcast(cpsw->ale, addr, ALE_PORT_HOST, - ALE_VLAN, slave->port_vlan, 0); - return; - } - - cpsw_ale_add_mcast(cpsw->ale, addr, ALE_ALL_PORTS, 0, 0, 0); -} - static void cpsw_set_promiscious(struct net_device *ndev, bool enable) { struct cpsw_common *cpsw = ndev_to_cpsw(ndev); @@ -640,7 +625,7 @@ static void cpsw_set_promiscious(struct net_device *ndev, bool enable) /* Clear all mcast from ALE */ cpsw_ale_flush_multicast(ale, ALE_ALL_PORTS, -1); - __dev_mc_unsync(ndev, NULL); + __hw_addr_ref_unsync_dev(&ndev->mc, ndev, NULL); /* Flood All Unicast Packets to Host port */ cpsw_ale_control_set(ale, 0, ALE_P0_UNI_FLOOD, 1); @@ -661,29 +646,174 @@ static void cpsw_set_promiscious(struct net_device *ndev, bool enable) } } -static int cpsw_add_mc_addr(struct net_device *ndev, const u8 *addr) +static int cpsw_switch_mode(struct net_device *ndev) { - struct cpsw_priv *priv = netdev_priv(ndev); + struct cpsw_common *cpsw = ndev_to_cpsw(ndev); - cpsw_add_mcast(priv, addr); - return 0; + return !(cpsw->data.dual_emac || cpsw->data.slaves == 1); } -static int cpsw_del_mc_addr(struct net_device *ndev, const u8 *addr) +struct addr_sync_ctx { + struct net_device *ndev; + const u8 *addr; /* address to be synched */ + int consumed; /* number of address instances */ + int flush; /* flush flag */ +}; + +/** + * cpsw_set_mc - adds multicast entry to the table if it's not added or deletes + * if it's not deleted + * @ndev: device to sync + * @addr: address to be added or deleted + * @vid: vlan id, if vid < 0 set/unset address for real device + * @add: add address if the flag is set or remove otherwise + */ +static int cpsw_set_mc(struct net_device *ndev, const u8 *addr, + int vid, int add) { struct cpsw_priv *priv = netdev_priv(ndev); struct cpsw_common *cpsw = priv->cpsw; - int vid, flags; + int mask, flags, ret; - if (cpsw->data.dual_emac) { - vid = cpsw->slaves[priv->emac_port].port_vlan; - flags = ALE_VLAN; - } else { - vid = 0; - flags = 0; + if (vid < 0) { + if (cpsw->data.dual_emac) + vid = cpsw->slaves[priv->emac_port].port_vlan; + else + vid = 0; + } + + mask = cpsw->data.dual_emac ? ALE_PORT_HOST : ALE_ALL_PORTS; + flags = vid ? ALE_VLAN : 0; + + if (add) + ret = cpsw_ale_add_mcast(cpsw->ale, addr, mask, flags, vid, 0); + else + ret = cpsw_ale_del_mcast(cpsw->ale, addr, 0, flags, vid); + + return ret; +} + +static int cpsw_update_vlan_mc(struct net_device *vdev, int vid, void *ctx) +{ + struct addr_sync_ctx *sync_ctx = ctx; + struct netdev_hw_addr *ha; + int found = 0, ret = 0; + + if (!vdev || !(vdev->flags & IFF_UP)) + return 0; + + /* vlan address is relevant if its sync_cnt != 0 */ + netdev_for_each_mc_addr(ha, vdev) { + if (ether_addr_equal(ha->addr, sync_ctx->addr)) { + found = ha->sync_cnt; + break; + } + } + + if (found) + sync_ctx->consumed++; + + if (sync_ctx->flush) { + if (!found) + cpsw_set_mc(sync_ctx->ndev, sync_ctx->addr, vid, 0); + return 0; + } + + if (found) + ret = cpsw_set_mc(sync_ctx->ndev, sync_ctx->addr, vid, 1); + + return ret; +} + +static int cpsw_add_mc_addr(struct net_device *ndev, const u8 *addr, int num) +{ + struct addr_sync_ctx sync_ctx; + int ret; + + /* leave for legacy switch mode untracked ALE entries */ + if (cpsw_switch_mode(ndev)) { + ret = cpsw_set_mc(ndev, addr, -1, 1); + return ret; + } + + sync_ctx.consumed = 0; + sync_ctx.addr = addr; + sync_ctx.ndev = ndev; + sync_ctx.flush = 0; + + ret = vlan_for_each(ndev, cpsw_update_vlan_mc, &sync_ctx); + if (sync_ctx.consumed < num && !ret) + ret = cpsw_set_mc(ndev, addr, -1, 1); + + return ret; +} + +static int cpsw_del_mc_addr(struct net_device *ndev, const u8 *addr, int num) +{ + struct addr_sync_ctx sync_ctx; + + /* leave for legacy switch mode untracked ALE entries */ + if (cpsw_switch_mode(ndev)) { + if (!num) + cpsw_set_mc(ndev, addr, -1, 0); + return 0; + } + + sync_ctx.consumed = 0; + sync_ctx.addr = addr; + sync_ctx.ndev = ndev; + sync_ctx.flush = 1; + + vlan_for_each(ndev, cpsw_update_vlan_mc, &sync_ctx); + if (sync_ctx.consumed == num) + cpsw_set_mc(ndev, addr, -1, 0); + + return 0; +} + +static int cpsw_purge_vlan_mc(struct net_device *vdev, int vid, void *ctx) +{ + struct addr_sync_ctx *sync_ctx = ctx; + struct netdev_hw_addr *ha; + int found = 0; + + if (!vdev || !(vdev->flags & IFF_UP)) + return 0; + + /* vlan address is relevant if its sync_cnt != 0 */ + netdev_for_each_mc_addr(ha, vdev) { + if (ether_addr_equal(ha->addr, sync_ctx->addr)) { + found = ha->sync_cnt; + break; + } } - cpsw_ale_del_mcast(cpsw->ale, addr, 0, flags, vid); + if (!found) + return 0; + + sync_ctx->consumed++; + cpsw_set_mc(sync_ctx->ndev, sync_ctx->addr, vid, 0); + return 0; +} + +static int cpsw_purge_all_mc(struct net_device *ndev, const u8 *addr, int num) +{ + struct addr_sync_ctx sync_ctx; + + /* leave for legacy switch mode untracked ALE entries */ + if (cpsw_switch_mode(ndev)) { + cpsw_set_mc(ndev, addr, -1, 0); + return 0; + } + + sync_ctx.addr = addr; + sync_ctx.ndev = ndev; + sync_ctx.consumed = 0; + + vlan_for_each(ndev, cpsw_purge_vlan_mc, &sync_ctx); + if (sync_ctx.consumed < num) + cpsw_set_mc(ndev, addr, -1, 0); + return 0; } @@ -704,7 +834,9 @@ static void cpsw_ndo_set_rx_mode(struct net_device *ndev) /* Restore allmulti on vlans if necessary */ cpsw_ale_set_allmulti(cpsw->ale, ndev->flags & IFF_ALLMULTI); - __dev_mc_sync(ndev, cpsw_add_mc_addr, cpsw_del_mc_addr); + /* add/remove mcast address either for real netdev or for vlan */ + __hw_addr_ref_sync_dev(&ndev->mc, ndev, cpsw_add_mc_addr, + cpsw_del_mc_addr); } static void cpsw_intr_enable(struct cpsw_common *cpsw) @@ -1964,7 +2096,7 @@ static int cpsw_ndo_stop(struct net_device *ndev) struct cpsw_common *cpsw = priv->cpsw; cpsw_info(priv, ifdown, "shutting down cpsw device\n"); - __dev_mc_unsync(priv->ndev, cpsw_del_mc_addr); + __hw_addr_ref_unsync_dev(&ndev->mc, ndev, cpsw_purge_all_mc); netif_tx_stop_all_queues(priv->ndev); netif_carrier_off(priv->ndev); @@ -2415,6 +2547,7 @@ static int cpsw_ndo_vlan_rx_kill_vid(struct net_device *ndev, HOST_PORT_NUM, ALE_VLAN, vid); ret |= cpsw_ale_del_mcast(cpsw->ale, priv->ndev->broadcast, 0, ALE_VLAN, vid); + ret |= cpsw_ale_flush_multicast(cpsw->ale, 0, vid); err: pm_runtime_put(cpsw->dev); return ret; From patchwork Wed Oct 24 22:10:59 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ivan Khoronzhuk X-Patchwork-Id: 149506 Delivered-To: patch@linaro.org Received: by 2002:a2e:299d:0:0:0:0:0 with SMTP id p29-v6csp560922ljp; Wed, 24 Oct 2018 15:11:21 -0700 (PDT) X-Google-Smtp-Source: AJdET5dUNrVQ0yfL8ImYdloUzyeE1hbYASvgyTTEnc9FccZAJcxsPCXArsy1JdYF6gDZfvTyMvNc X-Received: by 2002:a17:902:788b:: with SMTP id q11-v6mr4179033pll.54.1540419081181; Wed, 24 Oct 2018 15:11:21 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1540419081; cv=none; d=google.com; s=arc-20160816; b=i4FI8l65ss/GRIRf/YrzhaH22H1wlZxnQwSWbxiP55NrOnsNnI/YZEfsyaxltu7aXa RvJ8IPj+nN7b9ilSEBxvpBpDVGsze2WS23Klp4Tayrku01NFHvkIKLlvHQ980B30IHm2 bTjI1fFFuKnGKIuRNO64QdNu2hj65LeYFVTg07lqiQ9XfQlNhFjuWEI5eJeRRDIREFt9 KTmQdjVE8Vz5Dr4OfApCpRGoV+nrZ/s8Zz8/2aInITu37K8a/ApJxd95SDsZgJWlLoTx if0qvhEjg9BtuzblF+Bb7fRVilD3kSAtGv/XXJhp5vLM5kCmvkM2k3bMp0HlvlCxnTjo fyNw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:dkim-signature; bh=TR0EsogAgO34iqbw5VJcRTSY0YEnIrhIhjr9xb1cTvc=; b=H2+jwTeiSjbti7eqCzUfCAZRtPtLkvaW0BsL8MUMjlhFP5/636gRV2EeRoxyqPdfIe RUfeQbVJpbSHj6u3Kz8iRWljvxAeSeLe0XGU+sGa5Lwqnax+XVi2SZ0Ah3wE3wsPzx8h kUepi2zYMXyFWpMvI8taJ44G33TdOD1VbO50NcPmIB/5noaS7dtvSwbB3/HnhayRBx/g hfIAadJE0siFbRoNn0G77hbkqHeuKJxL9zCzE5/jmfu/DpPp7uocX1HjLtODSgGJ8tmW nFib4RwnAG2ba+8lt33tMkdP5tUskBonSUEBfaOIgq9k+YLNO/T/nZbl0rrg2Rcn0aCe SqvA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=QH4l17QX; spf=pass (google.com: best guess record for domain of netdev-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=netdev-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id e32-v6si6012599plb.309.2018.10.24.15.11.20; Wed, 24 Oct 2018 15:11:21 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of netdev-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=QH4l17QX; spf=pass (google.com: best guess record for domain of netdev-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=netdev-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727308AbeJYGlL (ORCPT + 10 others); Thu, 25 Oct 2018 02:41:11 -0400 Received: from mail-lj1-f196.google.com ([209.85.208.196]:38592 "EHLO mail-lj1-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727226AbeJYGlK (ORCPT ); Thu, 25 Oct 2018 02:41:10 -0400 Received: by mail-lj1-f196.google.com with SMTP id k11-v6so6263349lja.5 for ; Wed, 24 Oct 2018 15:11:18 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=TR0EsogAgO34iqbw5VJcRTSY0YEnIrhIhjr9xb1cTvc=; b=QH4l17QXxF0XBWk+z3/tnLL5j/cXJXpS/QtaI/1w62fb7r9KYN5Y65dC1lvQACWXHM ueVvCdK+DIwDu4w4OSSTQJd2uG8mHCeyihdzEZCFpc+ejNXzhsidz66vKNXDEmB166Ae VkGtsjN/WTeRBX7gLewyC6OEaA5jgepQ+gQhs= 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=TR0EsogAgO34iqbw5VJcRTSY0YEnIrhIhjr9xb1cTvc=; b=Byj5FkFfy3tYZbzCJ0DJoTdtNw5Rs3Kqb2PsYsNov7xjZ87mglqwPQe86eOavcofPh 1QAGRIuSpkRGddGk970Hga0c1GR9QHaGeQEjL8JjAP7j1mTttxSQ8jCVUrSxJqyepHbj kQJw2EJ6MjPt/4h7fKLFVtW0//CZfxJRiyLE6NcLZZXCjYAH2hbJCM/XfIAaQ0YeIQGT SHavawfD9GxRwOQ16lbPulP1MuAqZ8hVlc5MirtomzOFB6mFg9Yn6LC6G3QNVoxqaP3h uKGHKCfUPzvPM0qcTqaDPoVItlo/Uc4giE5xZleoz60iKjF3S7Cqq/jLDCXnh90YvRSc co5w== X-Gm-Message-State: AGRZ1gK3dXbV5rydMcViZxg20bPUy/iYEO7sRNIaiY5+JTwXKBZAhRxa TjD/DSBYOxvGZLSr6I+qPqTJbw== X-Received: by 2002:a2e:1311:: with SMTP id 17-v6mr2885804ljt.70.1540419077508; Wed, 24 Oct 2018 15:11:17 -0700 (PDT) Received: from localhost.localdomain (59-201-94-178.pool.ukrtel.net. [178.94.201.59]) by smtp.gmail.com with ESMTPSA id f19-v6sm835350ljc.31.2018.10.24.15.11.16 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 24 Oct 2018 15:11:16 -0700 (PDT) From: Ivan Khoronzhuk To: grygorii.strashko@ti.com, davem@davemloft.net Cc: linux-omap@vger.kernel.org, netdev@vger.kernel.org, linux-kernel@vger.kernel.org, alexander.h.duyck@intel.com, bjorn@mork.no, Ivan Khoronzhuk Subject: [PATCH net-next 4/4] net: ethernet: ti: cpsw: fix vlan configuration while down/up Date: Thu, 25 Oct 2018 01:10:59 +0300 Message-Id: <20181024221059.21834-5-ivan.khoronzhuk@linaro.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20181024221059.21834-1-ivan.khoronzhuk@linaro.org> References: <20181024221059.21834-1-ivan.khoronzhuk@linaro.org> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org The vlan configuration is not restored after interface donw/up sequence (if dual-emac - both interfaces). Tested on am572x EVM. Steps to check: ~# ip link add link eth1 name eth1.100 type vlan id 100 ~# ifconfig eth0 down ~# ifconfig eth1 down Try to remove vid and observe warning: ~# ip link del eth1.100 [ 739.526757] net eth1: removing vlanid 100 from vlan filter [ 739.533322] failed to kill vid 0081/100 for device eth1 This patch fixes it, restoring only vlan ALE entries and all other unicast/multicast entries are restored by system calling rx_mode ndo. Reviewed-by: Grygorii Strashko Signed-off-by: Ivan Khoronzhuk --- drivers/net/ethernet/ti/cpsw.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) -- 2.17.1 diff --git a/drivers/net/ethernet/ti/cpsw.c b/drivers/net/ethernet/ti/cpsw.c index 27e0a5d5ccf9..a061a12e3022 100644 --- a/drivers/net/ethernet/ti/cpsw.c +++ b/drivers/net/ethernet/ti/cpsw.c @@ -565,6 +565,9 @@ static const struct cpsw_stats cpsw_gstrings_ch_stats[] = { (func)(slave++, ##arg); \ } while (0) +static int cpsw_ndo_vlan_rx_add_vid(struct net_device *ndev, + __be16 proto, u16 vid); + static inline int cpsw_get_slave_port(u32 slave_num) { return slave_num + 1; @@ -1977,9 +1980,23 @@ static void cpsw_mqprio_resume(struct cpsw_slave *slave, struct cpsw_priv *priv) slave_write(slave, tx_prio_map, tx_prio_rg); } +static int cpsw_restore_vlans(struct net_device *vdev, int vid, void *arg) +{ + struct cpsw_priv *priv = arg; + + if (!vdev) + return 0; + + cpsw_ndo_vlan_rx_add_vid(priv->ndev, 0, vid); + return 0; +} + /* restore resources after port reset */ static void cpsw_restore(struct cpsw_priv *priv) { + /* restore vlan configurations */ + vlan_for_each(priv->ndev, cpsw_restore_vlans, priv); + /* restore MQPRIO offload */ for_each_slave(priv, cpsw_mqprio_resume, priv);