From patchwork Sat Aug 13 05:05:40 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Iyappan Subramanian X-Patchwork-Id: 658943 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3sB8pc44vhz9sDG for ; Sat, 13 Aug 2016 15:05:44 +1000 (AEST) Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=apm.com header.i=@apm.com header.b=Ym/yhtxA; dkim-atps=neutral Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753037AbcHMFFk (ORCPT ); Sat, 13 Aug 2016 01:05:40 -0400 Received: from mail-pf0-f178.google.com ([209.85.192.178]:35857 "EHLO mail-pf0-f178.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752517AbcHMFEz (ORCPT ); Sat, 13 Aug 2016 01:04:55 -0400 Received: by mail-pf0-f178.google.com with SMTP id h186so2048589pfg.3 for ; Fri, 12 Aug 2016 22:04:55 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=apm.com; s=apm; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=urQv9t+w8ck6gy1Lwrl8Gc9cORToNr3X0rDGGZ+9qbM=; b=Ym/yhtxAUBduT4u16/JE4NE4PNIKmKQhaFytNEv0afkLQsmTpxN8ksInuXMeGJ+gz8 WHiRt4IzramiUlYl7wjF+TEGs4fRl7uVw9JX7VEP628kAhQt1tS1PR3bmj/rSWZJwugK gKYhAiphEmvYZEaALRPOrMvE7kvq7XApP72S8= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=urQv9t+w8ck6gy1Lwrl8Gc9cORToNr3X0rDGGZ+9qbM=; b=XsZWRjOA/JFqC7B4139Ez9wbjR+wCk77SbCdi+fSuFp1iOnV2k10k5FaRq2dQex5dk Bw/k2a36BDp8AYsU2OyKCkjEZr/7PYwk8k8TsNzzpxdyAzlciOJNr6lR6EQK9isJIiim TvuBuBHPknAeVWROJS6SethY4Z9+y1sVXTAuRa1a2e6dqJLbXOOG9Z+JYVf0Hl6nRfc3 IWfa1gfFCsX47K5P0o4khKHDJqhfIY4orCo3cOZu6uOUDD3+/h7LERhgz4B3fPSg/Q0/ +mFQEwcSnkrH1Z+bo4PTx9TBIO6bme5g8T3g09Ab3RUBIvRXqL22SX/fP5EhGqu1/TOe e8Vg== X-Gm-Message-State: AEkoouvgrI8vPN177uOi9ygxkghYPbVe8TSOonZ23wRRBes4H9VByNFD2yoExTY5H1fNaXRm X-Received: by 10.98.54.134 with SMTP id d128mr33540643pfa.150.1471064694543; Fri, 12 Aug 2016 22:04:54 -0700 (PDT) Received: from isubrama-dev.amcc.com ([206.80.4.98]) by smtp.gmail.com with ESMTPSA id o2sm16753965pfg.10.2016.08.12.22.04.53 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Fri, 12 Aug 2016 22:04:53 -0700 (PDT) From: Iyappan Subramanian To: davem@davemloft.net, netdev@vger.kernel.org, devicetree@vger.kernel.org Cc: linux-arm-kernel@lists.infradead.org, patches@apm.com, linux@armlinux.org.uk, Iyappan Subramanian Subject: [PATCH net-next v2 04/12] drivers: net: xgene: Fix error deconstruction path Date: Fri, 12 Aug 2016 22:05:40 -0700 Message-Id: <1471064748-28033-5-git-send-email-isubramanian@apm.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1471064748-28033-1-git-send-email-isubramanian@apm.com> References: <1471064748-28033-1-git-send-email-isubramanian@apm.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Since register_netdev() call in xgene_enet_probe() was moved down to the end, it doesn't properly handle errors that may occur, by deconstructing everything that was setup before the error occurred. Signed-off-by: Iyappan Subramanian --- drivers/net/ethernet/apm/xgene/xgene_enet_main.c | 27 +++++++++++++++++------- 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/drivers/net/ethernet/apm/xgene/xgene_enet_main.c b/drivers/net/ethernet/apm/xgene/xgene_enet_main.c index 6b36e0f..a727da8 100644 --- a/drivers/net/ethernet/apm/xgene/xgene_enet_main.c +++ b/drivers/net/ethernet/apm/xgene/xgene_enet_main.c @@ -1641,8 +1641,8 @@ static int xgene_enet_probe(struct platform_device *pdev) } #endif if (!pdata->enet_id) { - free_netdev(ndev); - return -ENODEV; + ret = -ENODEV; + goto err; } ret = xgene_enet_get_resources(pdata); @@ -1665,7 +1665,7 @@ static int xgene_enet_probe(struct platform_device *pdev) ret = xgene_enet_init_hw(pdata); if (ret) - goto err_netdev; + goto err; link_state = pdata->mac_ops->link_state; if (pdata->phy_mode == PHY_INTERFACE_MODE_XGMII) { @@ -1675,21 +1675,32 @@ static int xgene_enet_probe(struct platform_device *pdev) ret = xgene_enet_mdio_config(pdata); else INIT_DELAYED_WORK(&pdata->link_work, link_state); + + if (ret) + goto err1; } - if (ret) - goto err; xgene_enet_napi_add(pdata); ret = register_netdev(ndev); if (ret) { netdev_err(ndev, "Failed to register netdev\n"); - goto err; + goto err2; } return 0; -err_netdev: - unregister_netdev(ndev); +err2: + /* + * If necessary, free_netdev() will call netif_napi_del() and undo + * the effects of xgene_enet_napi_add()'s calls to netif_napi_add(). + */ + + if (pdata->mdio_driver) + xgene_enet_phy_disconnect(pdata); + else if (pdata->phy_mode == PHY_INTERFACE_MODE_RGMII) + xgene_enet_mdio_remove(pdata); +err1: + xgene_enet_delete_desc_rings(pdata); err: free_netdev(ndev); return ret;