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>

Changed files
+12 -15
drivers
net
ethernet
+11 -14
drivers/net/ethernet/ti/cpsw.c
··· 2086 2086 int i; 2087 2087 2088 2088 for (i = 0; i < cpsw->data.slaves; i++) { 2089 - if (vid == cpsw->slaves[i].port_vlan) 2090 - return -EINVAL; 2089 + if (vid == cpsw->slaves[i].port_vlan) { 2090 + ret = -EINVAL; 2091 + goto err; 2092 + } 2091 2093 } 2092 2094 } 2093 2095 2094 2096 dev_info(priv->dev, "Adding vlanid %d to vlan filter\n", vid); 2095 2097 ret = cpsw_add_vlan_ale_entry(priv, vid); 2096 - 2098 + err: 2097 2099 pm_runtime_put(cpsw->dev); 2098 2100 return ret; 2099 2101 } ··· 2121 2119 2122 2120 for (i = 0; i < cpsw->data.slaves; i++) { 2123 2121 if (vid == cpsw->slaves[i].port_vlan) 2124 - return -EINVAL; 2122 + goto err; 2125 2123 } 2126 2124 } 2127 2125 2128 2126 dev_info(priv->dev, "removing vlanid %d from vlan filter\n", vid); 2129 2127 ret = cpsw_ale_del_vlan(cpsw->ale, vid, 0); 2130 - if (ret != 0) 2131 - return ret; 2132 - 2133 - ret = cpsw_ale_del_ucast(cpsw->ale, priv->mac_addr, 2134 - HOST_PORT_NUM, ALE_VLAN, vid); 2135 - if (ret != 0) 2136 - return ret; 2137 - 2138 - ret = cpsw_ale_del_mcast(cpsw->ale, priv->ndev->broadcast, 2139 - 0, ALE_VLAN, vid); 2128 + ret |= cpsw_ale_del_ucast(cpsw->ale, priv->mac_addr, 2129 + HOST_PORT_NUM, ALE_VLAN, vid); 2130 + ret |= cpsw_ale_del_mcast(cpsw->ale, priv->ndev->broadcast, 2131 + 0, ALE_VLAN, vid); 2132 + err: 2140 2133 pm_runtime_put(cpsw->dev); 2141 2134 return ret; 2142 2135 }
+1 -1
drivers/net/ethernet/ti/cpsw_ale.c
··· 394 394 395 395 idx = cpsw_ale_match_addr(ale, addr, (flags & ALE_VLAN) ? vid : 0); 396 396 if (idx < 0) 397 - return -EINVAL; 397 + return -ENOENT; 398 398 399 399 cpsw_ale_read(ale, idx, ale_entry); 400 400