diff options
author | David S. Miller <davem@davemloft.net> | 2018-08-11 12:38:53 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2018-08-11 12:38:53 -0400 |
commit | 556fdd857fb1a855c5dc2369800acb89429c3cbb (patch) | |
tree | ffe8720640aabf7712f1093710db624fd800582c | |
parent | e91e21894684cfff30e3a1a04e3d99af687dbb30 (diff) | |
parent | 803c4f64d79d2fced37a0650b94e6c84296dffd6 (diff) |
Merge branch 'cpsw-runtime-pm-fix'
Grygorii Strashko says:
====================
net: ethernet: ti: cpsw: fix runtime pm while add/del reserved vid
Here 2 not critical fixes for:
- vlan ale table leak while error if deleting vlan (simplifies next fix)
- runtime pm while try to set reserved vlan
====================
Reviewed-by: Grygorii Strashko <grygorii.strashko@ti.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | drivers/net/ethernet/ti/cpsw.c | 25 | ||||
-rw-r--r-- | drivers/net/ethernet/ti/cpsw_ale.c | 2 |
2 files changed, 12 insertions, 15 deletions
diff --git a/drivers/net/ethernet/ti/cpsw.c b/drivers/net/ethernet/ti/cpsw.c index 358edab9e72e..3e34cb8ac1d3 100644 --- a/drivers/net/ethernet/ti/cpsw.c +++ b/drivers/net/ethernet/ti/cpsw.c | |||
@@ -2086,14 +2086,16 @@ static int cpsw_ndo_vlan_rx_add_vid(struct net_device *ndev, | |||
2086 | int i; | 2086 | int i; |
2087 | 2087 | ||
2088 | for (i = 0; i < cpsw->data.slaves; i++) { | 2088 | for (i = 0; i < cpsw->data.slaves; i++) { |
2089 | if (vid == cpsw->slaves[i].port_vlan) | 2089 | if (vid == cpsw->slaves[i].port_vlan) { |
2090 | return -EINVAL; | 2090 | ret = -EINVAL; |
2091 | goto err; | ||
2092 | } | ||
2091 | } | 2093 | } |
2092 | } | 2094 | } |
2093 | 2095 | ||
2094 | dev_info(priv->dev, "Adding vlanid %d to vlan filter\n", vid); | 2096 | dev_info(priv->dev, "Adding vlanid %d to vlan filter\n", vid); |
2095 | ret = cpsw_add_vlan_ale_entry(priv, vid); | 2097 | ret = cpsw_add_vlan_ale_entry(priv, vid); |
2096 | 2098 | err: | |
2097 | pm_runtime_put(cpsw->dev); | 2099 | pm_runtime_put(cpsw->dev); |
2098 | return ret; | 2100 | return ret; |
2099 | } | 2101 | } |
@@ -2119,22 +2121,17 @@ static int cpsw_ndo_vlan_rx_kill_vid(struct net_device *ndev, | |||
2119 | 2121 | ||
2120 | for (i = 0; i < cpsw->data.slaves; i++) { | 2122 | for (i = 0; i < cpsw->data.slaves; i++) { |
2121 | if (vid == cpsw->slaves[i].port_vlan) | 2123 | if (vid == cpsw->slaves[i].port_vlan) |
2122 | return -EINVAL; | 2124 | goto err; |
2123 | } | 2125 | } |
2124 | } | 2126 | } |
2125 | 2127 | ||
2126 | dev_info(priv->dev, "removing vlanid %d from vlan filter\n", vid); | 2128 | dev_info(priv->dev, "removing vlanid %d from vlan filter\n", vid); |
2127 | ret = cpsw_ale_del_vlan(cpsw->ale, vid, 0); | 2129 | ret = cpsw_ale_del_vlan(cpsw->ale, vid, 0); |
2128 | if (ret != 0) | 2130 | ret |= cpsw_ale_del_ucast(cpsw->ale, priv->mac_addr, |
2129 | return ret; | 2131 | HOST_PORT_NUM, ALE_VLAN, vid); |
2130 | 2132 | ret |= cpsw_ale_del_mcast(cpsw->ale, priv->ndev->broadcast, | |
2131 | ret = cpsw_ale_del_ucast(cpsw->ale, priv->mac_addr, | 2133 | 0, ALE_VLAN, vid); |
2132 | HOST_PORT_NUM, ALE_VLAN, vid); | 2134 | err: |
2133 | if (ret != 0) | ||
2134 | return ret; | ||
2135 | |||
2136 | ret = cpsw_ale_del_mcast(cpsw->ale, priv->ndev->broadcast, | ||
2137 | 0, ALE_VLAN, vid); | ||
2138 | pm_runtime_put(cpsw->dev); | 2135 | pm_runtime_put(cpsw->dev); |
2139 | return ret; | 2136 | return ret; |
2140 | } | 2137 | } |
diff --git a/drivers/net/ethernet/ti/cpsw_ale.c b/drivers/net/ethernet/ti/cpsw_ale.c index 93dc05c194d3..5766225a4ce1 100644 --- a/drivers/net/ethernet/ti/cpsw_ale.c +++ b/drivers/net/ethernet/ti/cpsw_ale.c | |||
@@ -394,7 +394,7 @@ int cpsw_ale_del_mcast(struct cpsw_ale *ale, u8 *addr, int port_mask, | |||
394 | 394 | ||
395 | idx = cpsw_ale_match_addr(ale, addr, (flags & ALE_VLAN) ? vid : 0); | 395 | idx = cpsw_ale_match_addr(ale, addr, (flags & ALE_VLAN) ? vid : 0); |
396 | if (idx < 0) | 396 | if (idx < 0) |
397 | return -EINVAL; | 397 | return -ENOENT; |
398 | 398 | ||
399 | cpsw_ale_read(ale, idx, ale_entry); | 399 | cpsw_ale_read(ale, idx, ale_entry); |
400 | 400 | ||