| From e2337f1320d2562e19663f895464c053507bf8c5 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Fri, 26 Jun 2020 21:17:04 +0300 |
| Subject: net: ethernet: ti: am65-cpsw-nuss: restore vlan configuration while |
| down/up |
| |
| From: Grygorii Strashko <grygorii.strashko@ti.com> |
| |
| [ Upstream commit 7bcffde02152dd3cb180f6f3aef27e8586b2a905 ] |
| |
| The vlan configuration is not restored after interface down/up sequence. |
| |
| Steps to check: |
| # ip link add link eth0 name eth0.100 type vlan id 100 |
| # ifconfig eth0 down |
| # ifconfig eth0 up |
| |
| This patch fixes it, restoring vlan ALE entries on .ndo_open(). |
| |
| Fixes: 93a76530316a ("net: ethernet: ti: introduce am65x/j721e gigabit eth subsystem driver") |
| Signed-off-by: Grygorii Strashko <grygorii.strashko@ti.com> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/net/ethernet/ti/am65-cpsw-nuss.c | 19 +++++++++++++++++++ |
| 1 file changed, 19 insertions(+) |
| |
| diff --git a/drivers/net/ethernet/ti/am65-cpsw-nuss.c b/drivers/net/ethernet/ti/am65-cpsw-nuss.c |
| index 3e4388e6b5fa1..61b59a3b277ec 100644 |
| --- a/drivers/net/ethernet/ti/am65-cpsw-nuss.c |
| +++ b/drivers/net/ethernet/ti/am65-cpsw-nuss.c |
| @@ -217,6 +217,9 @@ static int am65_cpsw_nuss_ndo_slave_add_vid(struct net_device *ndev, |
| u32 port_mask, unreg_mcast = 0; |
| int ret; |
| |
| + if (!netif_running(ndev) || !vid) |
| + return 0; |
| + |
| ret = pm_runtime_get_sync(common->dev); |
| if (ret < 0) { |
| pm_runtime_put_noidle(common->dev); |
| @@ -240,6 +243,9 @@ static int am65_cpsw_nuss_ndo_slave_kill_vid(struct net_device *ndev, |
| struct am65_cpsw_common *common = am65_ndev_to_common(ndev); |
| int ret; |
| |
| + if (!netif_running(ndev) || !vid) |
| + return 0; |
| + |
| ret = pm_runtime_get_sync(common->dev); |
| if (ret < 0) { |
| pm_runtime_put_noidle(common->dev); |
| @@ -565,6 +571,16 @@ static int am65_cpsw_nuss_ndo_slave_stop(struct net_device *ndev) |
| return 0; |
| } |
| |
| +static int cpsw_restore_vlans(struct net_device *vdev, int vid, void *arg) |
| +{ |
| + struct am65_cpsw_port *port = arg; |
| + |
| + if (!vdev) |
| + return 0; |
| + |
| + return am65_cpsw_nuss_ndo_slave_add_vid(port->ndev, 0, vid); |
| +} |
| + |
| static int am65_cpsw_nuss_ndo_slave_open(struct net_device *ndev) |
| { |
| struct am65_cpsw_common *common = am65_ndev_to_common(ndev); |
| @@ -638,6 +654,9 @@ static int am65_cpsw_nuss_ndo_slave_open(struct net_device *ndev) |
| } |
| } |
| |
| + /* restore vlan configurations */ |
| + vlan_for_each(ndev, cpsw_restore_vlans, port); |
| + |
| phy_attached_info(port->slave.phy); |
| phy_start(port->slave.phy); |
| |
| -- |
| 2.25.1 |
| |