From mboxrd@z Thu Jan 1 00:00:00 1970 From: Ioana Ciornei Subject: [PATCH net-next v2 1/2] dpaa2-eth: defer probe on object allocate Date: Fri, 9 Nov 2018 15:26:45 +0000 Message-ID: <1541777182-9135-2-git-send-email-ioana.ciornei@nxp.com> References: <1541777182-9135-1-git-send-email-ioana.ciornei@nxp.com> Mime-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Cc: Ioana Ciocoi Radulescu , Ioana Ciornei To: "netdev@vger.kernel.org" , "davem@davemloft.net" , "andrew@lunn.ch" Return-path: Received: from mail-eopbgr80077.outbound.protection.outlook.com ([40.107.8.77]:37920 "EHLO EUR04-VI1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1727802AbeKJBHx (ORCPT ); Fri, 9 Nov 2018 20:07:53 -0500 In-Reply-To: <1541777182-9135-1-git-send-email-ioana.ciornei@nxp.com> Content-Language: en-US Sender: netdev-owner@vger.kernel.org List-ID: The fsl_mc_object_allocate function can fail because not all allocatable objects are probed by the fsl_mc_allocator at the call time. Defer the dpaa2-eth probe when this happens. Signed-off-by: Ioana Ciornei --- Changes in v2: - proper handling of IS_ERR_OR_NULL drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c | 32 ++++++++++++++++----= ---- 1 file changed, 22 insertions(+), 10 deletions(-) diff --git a/drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c b/drivers/net= /ethernet/freescale/dpaa2/dpaa2-eth.c index 88f7acc..bdfb13b 100644 --- a/drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c +++ b/drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c @@ -1434,8 +1434,11 @@ static struct fsl_mc_device *setup_dpcon(struct dpaa= 2_eth_priv *priv) err =3D fsl_mc_object_allocate(to_fsl_mc_device(dev), FSL_MC_POOL_DPCON, &dpcon); if (err) { - dev_info(dev, "Not enough DPCONs, will go on as-is\n"); - return NULL; + if (err =3D=3D -ENXIO) + err =3D -EPROBE_DEFER; + else + dev_info(dev, "Not enough DPCONs, will go on as-is\n"); + return ERR_PTR(err); } =20 err =3D dpcon_open(priv->mc_io, 0, dpcon->obj_desc.id, &dpcon->mc_handle)= ; @@ -1493,8 +1496,10 @@ static void free_dpcon(struct dpaa2_eth_priv *priv, return NULL; =20 channel->dpcon =3D setup_dpcon(priv); - if (!channel->dpcon) + if (IS_ERR_OR_NULL(channel->dpcon)) { + err =3D PTR_ERR(channel->dpcon); goto err_setup; + } =20 err =3D dpcon_get_attributes(priv->mc_io, 0, channel->dpcon->mc_handle, &attr); @@ -1513,7 +1518,7 @@ static void free_dpcon(struct dpaa2_eth_priv *priv, free_dpcon(priv, channel->dpcon); err_setup: kfree(channel); - return NULL; + return ERR_PTR(err); } =20 static void free_channel(struct dpaa2_eth_priv *priv, @@ -1547,10 +1552,11 @@ static int setup_dpio(struct dpaa2_eth_priv *priv) for_each_online_cpu(i) { /* Try to allocate a channel */ channel =3D alloc_channel(priv); - if (!channel) { - dev_info(dev, - "No affine channel for cpu %d and above\n", i); - err =3D -ENODEV; + if (IS_ERR_OR_NULL(channel)) { + err =3D PTR_ERR(channel); + if (err !=3D -EPROBE_DEFER) + dev_info(dev, + "No affine channel for cpu %d and above\n", i); goto err_alloc_ch; } =20 @@ -1608,9 +1614,12 @@ static int setup_dpio(struct dpaa2_eth_priv *priv) err_service_reg: free_channel(priv, channel); err_alloc_ch: + if (err =3D=3D -EPROBE_DEFER) + return err; + if (cpumask_empty(&priv->dpio_cpumask)) { dev_err(dev, "No cpu with an affine DPIO/DPCON\n"); - return err; + return -ENODEV; } =20 dev_info(dev, "Cores %*pbl available for processing ingress traffic\n", @@ -1732,7 +1741,10 @@ static int setup_dpbp(struct dpaa2_eth_priv *priv) err =3D fsl_mc_object_allocate(to_fsl_mc_device(dev), FSL_MC_POOL_DPBP, &dpbp_dev); if (err) { - dev_err(dev, "DPBP device allocation failed\n"); + if (err =3D=3D -ENXIO) + err =3D -EPROBE_DEFER; + else + dev_err(dev, "DPBP device allocation failed\n"); return err; } =20 --=20 1.9.1