From patchwork Sat Dec 1 12:39:28 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Lino Sanfilippo X-Patchwork-Id: 203131 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 BB0BD2C008E for ; Sat, 1 Dec 2012 23:39:37 +1100 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751646Ab2LAMje (ORCPT ); Sat, 1 Dec 2012 07:39:34 -0500 Received: from mailout-de.gmx.net ([213.165.64.23]:59316 "HELO mailout-de.gmx.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with SMTP id S1751423Ab2LAMjd (ORCPT ); Sat, 1 Dec 2012 07:39:33 -0500 Received: (qmail invoked by alias); 01 Dec 2012 12:39:31 -0000 Received: from HSI-KBW-134-3-156-158.hsi14.kabel-badenwuerttemberg.de (EHLO neptun) [134.3.156.158] by mail.gmx.net (mp037) with SMTP; 01 Dec 2012 13:39:31 +0100 X-Authenticated: #4630777 X-Provags-ID: V01U2FsdGVkX19x8FZdfnpxIISwHX6A4dsyLKl/wAUDhz65iwUKsE Rzla3bBYWfGdJy Date: Sat, 1 Dec 2012 13:39:28 +0100 From: Lino Sanfilippo To: shemminger@vyatta.com, mlindner@marvell.com Cc: davem@davemloft.net, netdev@vger.kernel.org Subject: sky2: fix cleanup sequence in probe() function Message-ID: <20121201123928.GA3914@neptun> MIME-Version: 1.0 Content-Disposition: inline User-Agent: Mutt/1.5.21 (2010-09-15) X-Y-GMX-Trusted: 0 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org The cleanup sequence in sky2_probe() that is called in case of an error is mixed up in different places: - pci_disable_device() is not called in each case the device has been enabled before - same for pci_disable_msi(): test_msi() may return with an error != EOPNOTSUPP (due to failure of request_irq()). In that case msi is not disabled - also failure of register_netdev() does not disable msi This patch fixes the concerning parts. Signed-off-by: Lino Sanfilippo --- drivers/net/ethernet/marvell/sky2.c | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/drivers/net/ethernet/marvell/sky2.c b/drivers/net/ethernet/marvell/sky2.c index b20d2fd..eea58f6 100644 --- a/drivers/net/ethernet/marvell/sky2.c +++ b/drivers/net/ethernet/marvell/sky2.c @@ -4919,13 +4919,13 @@ static int __devinit sky2_probe(struct pci_dev *pdev, err = pci_read_config_dword(pdev, PCI_DEV_REG2, ®); if (err) { dev_err(&pdev->dev, "PCI read config failed\n"); - goto err_out; + goto err_out_disable; } if (~reg == 0) { dev_err(&pdev->dev, "PCI configuration read error\n"); err = -EIO; - goto err_out; + goto err_out_disable; } err = pci_request_regions(pdev, DRV_NAME); @@ -5012,10 +5012,11 @@ static int __devinit sky2_probe(struct pci_dev *pdev, if (!disable_msi && pci_enable_msi(pdev) == 0) { err = sky2_test_msi(hw); - if (err == -EOPNOTSUPP) + if (err) { pci_disable_msi(pdev); - else if (err) - goto err_out_free_netdev; + if (err != -EOPNOTSUPP) + goto err_out_free_netdev; + } } err = register_netdev(dev); @@ -5063,10 +5064,10 @@ err_out_unregister_dev1: err_out_free_dev1: free_netdev(dev1); err_out_unregister: - if (hw->flags & SKY2_HW_USE_MSI) - pci_disable_msi(pdev); unregister_netdev(dev); err_out_free_netdev: + if (hw->flags & SKY2_HW_USE_MSI) + pci_disable_msi(pdev); free_netdev(dev); err_out_free_pci: pci_free_consistent(pdev, hw->st_size * sizeof(struct sky2_status_le),