From: Grygorii Strashko <grygorii.strashko@ti.com> To: <netdev@vger.kernel.org>, Ilias Apalodimas <ilias.apalodimas@linaro.org>, "David S . Miller" <davem@davemloft.net>, Ivan Khoronzhuk <ivan.khoronzhuk@linaro.org> Cc: Florian Fainelli <f.fainelli@gmail.com>, Andrew Lunn <andrew@lunn.ch>, Sekhar Nori <nsekhar@ti.com>, <linux-kernel@vger.kernel.org>, <linux-omap@vger.kernel.org>, Murali Karicheri <m-karicheri2@ti.com>, Grygorii Strashko <grygorii.strashko@ti.com> Subject: [PATCH net-next 11/19] net: ethernet: ti: cpsw: fix allmulti cfg in dual_mac mode Date: Tue, 23 Apr 2019 16:09:02 +0300 [thread overview] Message-ID: <1556024950-20752-12-git-send-email-grygorii.strashko@ti.com> (raw) In-Reply-To: <1556024950-20752-1-git-send-email-grygorii.strashko@ti.com> Now CPSW ALE will set/clean Host port bit in Unregistered Multicast Flood Mask (UNREG_MCAST_FLOOD_MASK) for every VLAN without checking if this port belongs to VLAN or not when ALLMULTI mode flag is set for nedev. This is working in non dual_mac mode, but in dual_mac - it causes enabling/disabling ALLMULTI flag for both ports. Hence fix it by adding additional parameter to cpsw_ale_set_allmulti() to specify ALE port number for which ALLMULTI has to be enabled and check if port belongs to VLAN before modifying UNREG_MCAST_FLOOD_MASK. Signed-off-by: Grygorii Strashko <grygorii.strashko@ti.com> --- drivers/net/ethernet/ti/cpsw.c | 12 +++++++++--- drivers/net/ethernet/ti/cpsw_ale.c | 12 ++++++++++-- drivers/net/ethernet/ti/cpsw_ale.h | 2 +- 3 files changed, 20 insertions(+), 6 deletions(-) diff --git a/drivers/net/ethernet/ti/cpsw.c b/drivers/net/ethernet/ti/cpsw.c index fe3d145846d2..c497992f01f7 100644 --- a/drivers/net/ethernet/ti/cpsw.c +++ b/drivers/net/ethernet/ti/cpsw.c @@ -793,12 +793,17 @@ static int cpsw_purge_all_mc(struct net_device *ndev, const u8 *addr, int num) static void cpsw_ndo_set_rx_mode(struct net_device *ndev) { - struct cpsw_common *cpsw = ndev_to_cpsw(ndev); + struct cpsw_priv *priv = netdev_priv(ndev); + struct cpsw_common *cpsw = priv->cpsw; + int slave_port = -1; + + if (cpsw->data.dual_emac) + slave_port = priv->emac_port + 1; if (ndev->flags & IFF_PROMISC) { /* Enable promiscuous mode */ cpsw_set_promiscious(ndev, true); - cpsw_ale_set_allmulti(cpsw->ale, IFF_ALLMULTI); + cpsw_ale_set_allmulti(cpsw->ale, IFF_ALLMULTI, slave_port); return; } else { /* Disable promiscuous mode */ @@ -806,7 +811,8 @@ 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); + cpsw_ale_set_allmulti(cpsw->ale, + ndev->flags & IFF_ALLMULTI, slave_port); /* add/remove mcast address either for real netdev or for vlan */ __hw_addr_ref_sync_dev(&ndev->mc, ndev, cpsw_add_mc_addr, diff --git a/drivers/net/ethernet/ti/cpsw_ale.c b/drivers/net/ethernet/ti/cpsw_ale.c index 83ccb422dddd..f7369982ae33 100644 --- a/drivers/net/ethernet/ti/cpsw_ale.c +++ b/drivers/net/ethernet/ti/cpsw_ale.c @@ -468,11 +468,11 @@ int cpsw_ale_del_vlan(struct cpsw_ale *ale, u16 vid, int port_mask) return 0; } -void cpsw_ale_set_allmulti(struct cpsw_ale *ale, int allmulti) +void cpsw_ale_set_allmulti(struct cpsw_ale *ale, int allmulti, int port) { u32 ale_entry[ALE_ENTRY_WORDS]; - int type, idx; int unreg_mcast = 0; + int type, idx; /* Only bother doing the work if the setting is actually changing */ if (ale->allmulti == allmulti) @@ -482,10 +482,18 @@ void cpsw_ale_set_allmulti(struct cpsw_ale *ale, int allmulti) ale->allmulti = allmulti; for (idx = 0; idx < ale->params.ale_entries; idx++) { + int vlan_members; + cpsw_ale_read(ale, idx, ale_entry); type = cpsw_ale_get_entry_type(ale_entry); if (type != ALE_TYPE_VLAN) continue; + vlan_members = + cpsw_ale_get_vlan_member_list(ale_entry, + ale->vlan_field_bits); + + if (port != -1 && !(vlan_members & BIT(port))) + continue; unreg_mcast = cpsw_ale_get_vlan_unreg_mcast(ale_entry, diff --git a/drivers/net/ethernet/ti/cpsw_ale.h b/drivers/net/ethernet/ti/cpsw_ale.h index 4777d626fac8..8a0d25950dc1 100644 --- a/drivers/net/ethernet/ti/cpsw_ale.h +++ b/drivers/net/ethernet/ti/cpsw_ale.h @@ -109,7 +109,7 @@ int cpsw_ale_del_mcast(struct cpsw_ale *ale, const u8 *addr, int port_mask, int cpsw_ale_add_vlan(struct cpsw_ale *ale, u16 vid, int port, int untag, int reg_mcast, int unreg_mcast); int cpsw_ale_del_vlan(struct cpsw_ale *ale, u16 vid, int port); -void cpsw_ale_set_allmulti(struct cpsw_ale *ale, int allmulti); +void cpsw_ale_set_allmulti(struct cpsw_ale *ale, int allmulti, int port); int cpsw_ale_control_get(struct cpsw_ale *ale, int port, int control); int cpsw_ale_control_set(struct cpsw_ale *ale, int port, -- 2.17.1
WARNING: multiple messages have this Message-ID (diff)
From: Grygorii Strashko <grygorii.strashko@ti.com> To: netdev@vger.kernel.org, Ilias Apalodimas <ilias.apalodimas@linaro.org>, "David S . Miller" <davem@davemloft.net>, Ivan Khoronzhuk <ivan.khoronzhuk@linaro.org> Cc: Florian Fainelli <f.fainelli@gmail.com>, Andrew Lunn <andrew@lunn.ch>, Sekhar Nori <nsekhar@ti.com>, linux-kernel@vger.kernel.org, linux-omap@vger.kernel.org, Murali Karicheri <m-karicheri2@ti.com>, Grygorii Strashko <grygorii.strashko@ti.com> Subject: [PATCH net-next 11/19] net: ethernet: ti: cpsw: fix allmulti cfg in dual_mac mode Date: Tue, 23 Apr 2019 16:09:02 +0300 [thread overview] Message-ID: <1556024950-20752-12-git-send-email-grygorii.strashko@ti.com> (raw) In-Reply-To: <1556024950-20752-1-git-send-email-grygorii.strashko@ti.com> Now CPSW ALE will set/clean Host port bit in Unregistered Multicast Flood Mask (UNREG_MCAST_FLOOD_MASK) for every VLAN without checking if this port belongs to VLAN or not when ALLMULTI mode flag is set for nedev. This is working in non dual_mac mode, but in dual_mac - it causes enabling/disabling ALLMULTI flag for both ports. Hence fix it by adding additional parameter to cpsw_ale_set_allmulti() to specify ALE port number for which ALLMULTI has to be enabled and check if port belongs to VLAN before modifying UNREG_MCAST_FLOOD_MASK. Signed-off-by: Grygorii Strashko <grygorii.strashko@ti.com> --- drivers/net/ethernet/ti/cpsw.c | 12 +++++++++--- drivers/net/ethernet/ti/cpsw_ale.c | 12 ++++++++++-- drivers/net/ethernet/ti/cpsw_ale.h | 2 +- 3 files changed, 20 insertions(+), 6 deletions(-) diff --git a/drivers/net/ethernet/ti/cpsw.c b/drivers/net/ethernet/ti/cpsw.c index fe3d145846d2..c497992f01f7 100644 --- a/drivers/net/ethernet/ti/cpsw.c +++ b/drivers/net/ethernet/ti/cpsw.c @@ -793,12 +793,17 @@ static int cpsw_purge_all_mc(struct net_device *ndev, const u8 *addr, int num) static void cpsw_ndo_set_rx_mode(struct net_device *ndev) { - struct cpsw_common *cpsw = ndev_to_cpsw(ndev); + struct cpsw_priv *priv = netdev_priv(ndev); + struct cpsw_common *cpsw = priv->cpsw; + int slave_port = -1; + + if (cpsw->data.dual_emac) + slave_port = priv->emac_port + 1; if (ndev->flags & IFF_PROMISC) { /* Enable promiscuous mode */ cpsw_set_promiscious(ndev, true); - cpsw_ale_set_allmulti(cpsw->ale, IFF_ALLMULTI); + cpsw_ale_set_allmulti(cpsw->ale, IFF_ALLMULTI, slave_port); return; } else { /* Disable promiscuous mode */ @@ -806,7 +811,8 @@ 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); + cpsw_ale_set_allmulti(cpsw->ale, + ndev->flags & IFF_ALLMULTI, slave_port); /* add/remove mcast address either for real netdev or for vlan */ __hw_addr_ref_sync_dev(&ndev->mc, ndev, cpsw_add_mc_addr, diff --git a/drivers/net/ethernet/ti/cpsw_ale.c b/drivers/net/ethernet/ti/cpsw_ale.c index 83ccb422dddd..f7369982ae33 100644 --- a/drivers/net/ethernet/ti/cpsw_ale.c +++ b/drivers/net/ethernet/ti/cpsw_ale.c @@ -468,11 +468,11 @@ int cpsw_ale_del_vlan(struct cpsw_ale *ale, u16 vid, int port_mask) return 0; } -void cpsw_ale_set_allmulti(struct cpsw_ale *ale, int allmulti) +void cpsw_ale_set_allmulti(struct cpsw_ale *ale, int allmulti, int port) { u32 ale_entry[ALE_ENTRY_WORDS]; - int type, idx; int unreg_mcast = 0; + int type, idx; /* Only bother doing the work if the setting is actually changing */ if (ale->allmulti == allmulti) @@ -482,10 +482,18 @@ void cpsw_ale_set_allmulti(struct cpsw_ale *ale, int allmulti) ale->allmulti = allmulti; for (idx = 0; idx < ale->params.ale_entries; idx++) { + int vlan_members; + cpsw_ale_read(ale, idx, ale_entry); type = cpsw_ale_get_entry_type(ale_entry); if (type != ALE_TYPE_VLAN) continue; + vlan_members = + cpsw_ale_get_vlan_member_list(ale_entry, + ale->vlan_field_bits); + + if (port != -1 && !(vlan_members & BIT(port))) + continue; unreg_mcast = cpsw_ale_get_vlan_unreg_mcast(ale_entry, diff --git a/drivers/net/ethernet/ti/cpsw_ale.h b/drivers/net/ethernet/ti/cpsw_ale.h index 4777d626fac8..8a0d25950dc1 100644 --- a/drivers/net/ethernet/ti/cpsw_ale.h +++ b/drivers/net/ethernet/ti/cpsw_ale.h @@ -109,7 +109,7 @@ int cpsw_ale_del_mcast(struct cpsw_ale *ale, const u8 *addr, int port_mask, int cpsw_ale_add_vlan(struct cpsw_ale *ale, u16 vid, int port, int untag, int reg_mcast, int unreg_mcast); int cpsw_ale_del_vlan(struct cpsw_ale *ale, u16 vid, int port); -void cpsw_ale_set_allmulti(struct cpsw_ale *ale, int allmulti); +void cpsw_ale_set_allmulti(struct cpsw_ale *ale, int allmulti, int port); int cpsw_ale_control_get(struct cpsw_ale *ale, int port, int control); int cpsw_ale_control_set(struct cpsw_ale *ale, int port, -- 2.17.1
next prev parent reply other threads:[~2019-04-23 13:09 UTC|newest] Thread overview: 67+ messages / expand[flat|nested] mbox.gz Atom feed top 2019-04-23 13:08 [PATCH net-next 00/19] net: ethernet: ti: clean up and optimizations Grygorii Strashko 2019-04-23 13:08 ` Grygorii Strashko 2019-04-23 13:08 ` [PATCH net-next 01/19] net: ethernet: ti: convert to SPDX license identifiers Grygorii Strashko 2019-04-23 13:08 ` Grygorii Strashko 2019-04-23 13:58 ` Andrew Lunn 2019-04-24 9:31 ` Grygorii Strashko 2019-04-24 9:31 ` Grygorii Strashko 2019-04-23 13:08 ` [PATCH net-next 02/19] net: ethernet: ti: cpsw: drop TI_DAVINCI_CPDMA config option Grygorii Strashko 2019-04-23 13:08 ` Grygorii Strashko 2019-04-24 0:27 ` Jakub Kicinski 2019-04-24 0:27 ` Jakub Kicinski 2019-04-24 9:31 ` Grygorii Strashko 2019-04-24 9:31 ` Grygorii Strashko 2019-04-25 13:44 ` Murali Karicheri 2019-04-25 13:44 ` Murali Karicheri 2019-04-23 13:08 ` [PATCH net-next 03/19] net: ethernet: ti: cpsw: drop CONFIG_TI_CPSW_ALE " Grygorii Strashko 2019-04-23 13:08 ` Grygorii Strashko 2019-04-23 18:37 ` Andrew Lunn 2019-04-23 13:08 ` [PATCH net-next 04/19] net: ethernet: ti: cpsw: update cpsw_split_res() to accept cpsw_common Grygorii Strashko 2019-04-23 13:08 ` Grygorii Strashko 2019-04-23 13:08 ` [PATCH net-next 05/19] net: ethernet: ti: cpsw: use local var dev in probe Grygorii Strashko 2019-04-23 13:08 ` Grygorii Strashko 2019-04-23 18:40 ` Andrew Lunn 2019-04-24 9:20 ` Grygorii Strashko 2019-04-24 9:20 ` Grygorii Strashko 2019-04-23 13:08 ` [PATCH net-next 06/19] net: ethernet: ti: cpsw: drop pinctrl_pm_select_default_state call Grygorii Strashko 2019-04-23 13:08 ` Grygorii Strashko 2019-04-23 18:40 ` Andrew Lunn 2019-04-23 13:08 ` [PATCH net-next 07/19] net: ethernet: ti: cpsw: use devm_alloc_etherdev_mqs() Grygorii Strashko 2019-04-23 13:08 ` Grygorii Strashko 2019-04-23 18:41 ` Andrew Lunn 2019-04-23 13:08 ` [PATCH net-next 08/19] net: ethernet: ti: cpsw: drop cpsw_tx_packet_submit() Grygorii Strashko 2019-04-23 13:08 ` Grygorii Strashko 2019-04-23 18:42 ` Andrew Lunn 2019-04-23 13:09 ` [PATCH net-next 09/19] net: ethernet: ti: ale: fix mcast super setting Grygorii Strashko 2019-04-23 13:09 ` Grygorii Strashko 2019-04-23 13:09 ` [PATCH net-next 10/19] net: ethernet: ti: ale: use define for host port in cpsw_ale_set_allmulti() Grygorii Strashko 2019-04-23 13:09 ` Grygorii Strashko 2019-04-23 18:43 ` Andrew Lunn 2019-04-23 13:09 ` Grygorii Strashko [this message] 2019-04-23 13:09 ` [PATCH net-next 11/19] net: ethernet: ti: cpsw: fix allmulti cfg in dual_mac mode Grygorii Strashko 2019-04-24 11:00 ` Ivan Khoronzhuk 2019-04-24 12:22 ` Ivan Khoronzhuk 2019-04-24 14:55 ` Grygorii Strashko 2019-04-24 14:55 ` Grygorii Strashko 2019-04-23 13:09 ` [PATCH net-next 12/19] net: ethernet: ti: ale: do not auto delete mcast super entries Grygorii Strashko 2019-04-23 13:09 ` Grygorii Strashko 2019-04-23 13:09 ` [PATCH net-next 13/19] net: ethernet: ti: davinci_mdio: use devm_ioremap() Grygorii Strashko 2019-04-23 13:09 ` Grygorii Strashko 2019-04-23 13:09 ` [PATCH net-next 14/19] net: ethernet: ti: cpsw: refactor probe to group common hw initialization Grygorii Strashko 2019-04-23 13:09 ` Grygorii Strashko 2019-04-23 13:09 ` [PATCH net-next 15/19] net: ethernet: ti: cpsw: move cpsw definitions in priv header Grygorii Strashko 2019-04-23 13:09 ` Grygorii Strashko 2019-04-23 13:09 ` [PATCH net-next 16/19] net: ethernet: ti: cpsw: move common hw init code in separate func Grygorii Strashko 2019-04-23 13:09 ` Grygorii Strashko 2019-04-23 18:53 ` Andrew Lunn 2019-04-25 13:38 ` Murali Karicheri 2019-04-25 13:38 ` Murali Karicheri 2019-04-25 14:14 ` Grygorii Strashko 2019-04-25 14:14 ` Grygorii Strashko 2019-04-23 13:09 ` [PATCH net-next 17/19] net: ethernet: ti: cpsw: introduce mac sl module api Grygorii Strashko 2019-04-23 13:09 ` Grygorii Strashko 2019-04-23 19:01 ` Andrew Lunn 2019-04-23 13:09 ` [PATCH net-next 18/19] net: ethernet: ti: cpsw: switch to use mac sl api Grygorii Strashko 2019-04-23 13:09 ` Grygorii Strashko 2019-04-23 13:09 ` [PATCH net-next 19/19] net: ethernet: ti: cpsw: move ethtool func in separate file Grygorii Strashko 2019-04-23 13:09 ` Grygorii Strashko
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=1556024950-20752-12-git-send-email-grygorii.strashko@ti.com \ --to=grygorii.strashko@ti.com \ --cc=andrew@lunn.ch \ --cc=davem@davemloft.net \ --cc=f.fainelli@gmail.com \ --cc=ilias.apalodimas@linaro.org \ --cc=ivan.khoronzhuk@linaro.org \ --cc=linux-kernel@vger.kernel.org \ --cc=linux-omap@vger.kernel.org \ --cc=m-karicheri2@ti.com \ --cc=netdev@vger.kernel.org \ --cc=nsekhar@ti.com \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.