aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEmil Tantilov <emil.s.tantilov@intel.com>2014-12-03 22:03:38 -0500
committerJeff Kirsher <jeffrey.t.kirsher@intel.com>2014-12-05 12:13:08 -0500
commit0fb6a55cc31ff216ef86332404ad3e425cb669eb (patch)
treef3e0e75d706cca8f6caf9eee77f8a33c60dd625c
parent9be4a9bb34746b8b87b6361462484ca42ac7089e (diff)
ixgbe: fix crash on rmmod after probe fail
The driver has logic to free up used data in case any of the checks in ixgbe_probe() fail, however there is a similar set of cleanups that can occur on driver unload in ixgbe_remove() which can cause the rmmod command to crash. This patch aims to fix the logic by moving pci_set_drvdata() after all error checks and then adds a check in ixgbe_remove() to skip it altogether if adapter comes up empty. Signed-off-by: Emil Tantilov <emil.s.tantilov@intel.com> Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
-rw-r--r--drivers/net/ethernet/intel/ixgbe/ixgbe_main.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
index 027c135f7334..82d418729dd4 100644
--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
+++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
@@ -8206,7 +8206,6 @@ static int ixgbe_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
8206 SET_NETDEV_DEV(netdev, &pdev->dev); 8206 SET_NETDEV_DEV(netdev, &pdev->dev);
8207 8207
8208 adapter = netdev_priv(netdev); 8208 adapter = netdev_priv(netdev);
8209 pci_set_drvdata(pdev, adapter);
8210 8209
8211 adapter->netdev = netdev; 8210 adapter->netdev = netdev;
8212 adapter->pdev = pdev; 8211 adapter->pdev = pdev;
@@ -8486,6 +8485,8 @@ skip_sriov:
8486 if (err) 8485 if (err)
8487 goto err_register; 8486 goto err_register;
8488 8487
8488 pci_set_drvdata(pdev, adapter);
8489
8489 /* power down the optics for 82599 SFP+ fiber */ 8490 /* power down the optics for 82599 SFP+ fiber */
8490 if (hw->mac.ops.disable_tx_laser) 8491 if (hw->mac.ops.disable_tx_laser)
8491 hw->mac.ops.disable_tx_laser(hw); 8492 hw->mac.ops.disable_tx_laser(hw);
@@ -8565,9 +8566,14 @@ err_dma:
8565static void ixgbe_remove(struct pci_dev *pdev) 8566static void ixgbe_remove(struct pci_dev *pdev)
8566{ 8567{
8567 struct ixgbe_adapter *adapter = pci_get_drvdata(pdev); 8568 struct ixgbe_adapter *adapter = pci_get_drvdata(pdev);
8568 struct net_device *netdev = adapter->netdev; 8569 struct net_device *netdev;
8569 bool disable_dev; 8570 bool disable_dev;
8570 8571
8572 /* if !adapter then we already cleaned up in probe */
8573 if (!adapter)
8574 return;
8575
8576 netdev = adapter->netdev;
8571 ixgbe_dbg_adapter_exit(adapter); 8577 ixgbe_dbg_adapter_exit(adapter);
8572 8578
8573 set_bit(__IXGBE_REMOVING, &adapter->state); 8579 set_bit(__IXGBE_REMOVING, &adapter->state);