Commit 42379b95 authored by Jakub Kicinski's avatar Jakub Kicinski

Merge branch 'dpaa2-eth-small-cleanup'

Ioana Ciornei says:

====================
dpaa2-eth: small cleanup

These 3 patches are just part of a small cleanup on the dpaa2-eth and
the dpaa2-switch drivers.

In case we are hitting a case in which the fwnode of the root dprc
device we initiate a deferred probe. On the dpaa2-switch side, if we are
on the remove path, make sure that we check for a non-NULL pointer
before accessing the port private structure.
====================

Link: https://lore.kernel.org/r/20220106135905.81923-1-ioana.ciornei@nxp.comSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parents 257367c0 d1a9b841
...@@ -41,7 +41,7 @@ static int phy_mode(enum dpmac_eth_if eth_if, phy_interface_t *if_mode) ...@@ -41,7 +41,7 @@ static int phy_mode(enum dpmac_eth_if eth_if, phy_interface_t *if_mode)
static struct fwnode_handle *dpaa2_mac_get_node(struct device *dev, static struct fwnode_handle *dpaa2_mac_get_node(struct device *dev,
u16 dpmac_id) u16 dpmac_id)
{ {
struct fwnode_handle *fwnode, *parent, *child = NULL; struct fwnode_handle *fwnode, *parent = NULL, *child = NULL;
struct device_node *dpmacs = NULL; struct device_node *dpmacs = NULL;
int err; int err;
u32 id; u32 id;
...@@ -54,8 +54,17 @@ static struct fwnode_handle *dpaa2_mac_get_node(struct device *dev, ...@@ -54,8 +54,17 @@ static struct fwnode_handle *dpaa2_mac_get_node(struct device *dev,
parent = of_fwnode_handle(dpmacs); parent = of_fwnode_handle(dpmacs);
} else if (is_acpi_node(fwnode)) { } else if (is_acpi_node(fwnode)) {
parent = fwnode; parent = fwnode;
} else {
/* The root dprc device didn't yet get to finalize it's probe,
* thus the fwnode field is not yet set. Defer probe if we are
* facing this situation.
*/
return ERR_PTR(-EPROBE_DEFER);
} }
if (!parent)
return NULL;
fwnode_for_each_child_node(parent, child) { fwnode_for_each_child_node(parent, child) {
err = -EINVAL; err = -EINVAL;
if (is_acpi_device_node(child)) if (is_acpi_device_node(child))
...@@ -327,6 +336,7 @@ int dpaa2_mac_open(struct dpaa2_mac *mac) ...@@ -327,6 +336,7 @@ int dpaa2_mac_open(struct dpaa2_mac *mac)
{ {
struct fsl_mc_device *dpmac_dev = mac->mc_dev; struct fsl_mc_device *dpmac_dev = mac->mc_dev;
struct net_device *net_dev = mac->net_dev; struct net_device *net_dev = mac->net_dev;
struct fwnode_handle *fw_node;
int err; int err;
err = dpmac_open(mac->mc_io, 0, dpmac_dev->obj_desc.id, err = dpmac_open(mac->mc_io, 0, dpmac_dev->obj_desc.id,
...@@ -346,7 +356,13 @@ int dpaa2_mac_open(struct dpaa2_mac *mac) ...@@ -346,7 +356,13 @@ int dpaa2_mac_open(struct dpaa2_mac *mac)
/* Find the device node representing the MAC device and link the device /* Find the device node representing the MAC device and link the device
* behind the associated netdev to it. * behind the associated netdev to it.
*/ */
mac->fw_node = dpaa2_mac_get_node(&mac->mc_dev->dev, mac->attr.id); fw_node = dpaa2_mac_get_node(&mac->mc_dev->dev, mac->attr.id);
if (IS_ERR(fw_node)) {
err = PTR_ERR(fw_node);
goto err_close_dpmac;
}
mac->fw_node = fw_node;
net_dev->dev.of_node = to_of_node(mac->fw_node); net_dev->dev.of_node = to_of_node(mac->fw_node);
return 0; return 0;
......
...@@ -394,6 +394,7 @@ static int dpaa2_switch_dellink(struct ethsw_core *ethsw, u16 vid) ...@@ -394,6 +394,7 @@ static int dpaa2_switch_dellink(struct ethsw_core *ethsw, u16 vid)
for (i = 0; i < ethsw->sw_attr.num_ifs; i++) { for (i = 0; i < ethsw->sw_attr.num_ifs; i++) {
ppriv_local = ethsw->ports[i]; ppriv_local = ethsw->ports[i];
if (ppriv_local)
ppriv_local->vlans[vid] = 0; ppriv_local->vlans[vid] = 0;
} }
...@@ -1896,9 +1897,11 @@ static int dpaa2_switch_port_del_vlan(struct ethsw_port_priv *port_priv, u16 vid ...@@ -1896,9 +1897,11 @@ static int dpaa2_switch_port_del_vlan(struct ethsw_port_priv *port_priv, u16 vid
/* Delete VLAN from switch if it is no longer configured on /* Delete VLAN from switch if it is no longer configured on
* any port * any port
*/ */
for (i = 0; i < ethsw->sw_attr.num_ifs; i++) for (i = 0; i < ethsw->sw_attr.num_ifs; i++) {
if (ethsw->ports[i]->vlans[vid] & ETHSW_VLAN_MEMBER) if (ethsw->ports[i] &&
ethsw->ports[i]->vlans[vid] & ETHSW_VLAN_MEMBER)
return 0; /* Found a port member in VID */ return 0; /* Found a port member in VID */
}
ethsw->vlans[vid] &= ~ETHSW_VLAN_GLOBAL; ethsw->vlans[vid] &= ~ETHSW_VLAN_GLOBAL;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment