diff options
author | Emil Tantilov <emil.s.tantilov@intel.com> | 2014-12-03 22:03:38 -0500 |
---|---|---|
committer | Jeff Kirsher <jeffrey.t.kirsher@intel.com> | 2014-12-05 12:13:08 -0500 |
commit | 0fb6a55cc31ff216ef86332404ad3e425cb669eb (patch) | |
tree | f3e0e75d706cca8f6caf9eee77f8a33c60dd625c | |
parent | 9be4a9bb34746b8b87b6361462484ca42ac7089e (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.c | 10 |
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: | |||
8565 | static void ixgbe_remove(struct pci_dev *pdev) | 8566 | static 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); |