diff options
Diffstat (limited to 'drivers/net/ethernet/intel/e1000/e1000_main.c')
-rw-r--r-- | drivers/net/ethernet/intel/e1000/e1000_main.c | 27 |
1 files changed, 22 insertions, 5 deletions
diff --git a/drivers/net/ethernet/intel/e1000/e1000_main.c b/drivers/net/ethernet/intel/e1000/e1000_main.c index 1982f7917a8d..3dd4aeb2706d 100644 --- a/drivers/net/ethernet/intel/e1000/e1000_main.c +++ b/drivers/net/ethernet/intel/e1000/e1000_main.c | |||
@@ -945,7 +945,7 @@ static int e1000_init_hw_struct(struct e1000_adapter *adapter, | |||
945 | static int e1000_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | 945 | static int e1000_probe(struct pci_dev *pdev, const struct pci_device_id *ent) |
946 | { | 946 | { |
947 | struct net_device *netdev; | 947 | struct net_device *netdev; |
948 | struct e1000_adapter *adapter; | 948 | struct e1000_adapter *adapter = NULL; |
949 | struct e1000_hw *hw; | 949 | struct e1000_hw *hw; |
950 | 950 | ||
951 | static int cards_found; | 951 | static int cards_found; |
@@ -955,6 +955,7 @@ static int e1000_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
955 | u16 tmp = 0; | 955 | u16 tmp = 0; |
956 | u16 eeprom_apme_mask = E1000_EEPROM_APME; | 956 | u16 eeprom_apme_mask = E1000_EEPROM_APME; |
957 | int bars, need_ioport; | 957 | int bars, need_ioport; |
958 | bool disable_dev = false; | ||
958 | 959 | ||
959 | /* do not allocate ioport bars when not needed */ | 960 | /* do not allocate ioport bars when not needed */ |
960 | need_ioport = e1000_is_need_ioport(pdev); | 961 | need_ioport = e1000_is_need_ioport(pdev); |
@@ -1259,11 +1260,13 @@ err_mdio_ioremap: | |||
1259 | iounmap(hw->ce4100_gbe_mdio_base_virt); | 1260 | iounmap(hw->ce4100_gbe_mdio_base_virt); |
1260 | iounmap(hw->hw_addr); | 1261 | iounmap(hw->hw_addr); |
1261 | err_ioremap: | 1262 | err_ioremap: |
1263 | disable_dev = !test_and_set_bit(__E1000_DISABLED, &adapter->flags); | ||
1262 | free_netdev(netdev); | 1264 | free_netdev(netdev); |
1263 | err_alloc_etherdev: | 1265 | err_alloc_etherdev: |
1264 | pci_release_selected_regions(pdev, bars); | 1266 | pci_release_selected_regions(pdev, bars); |
1265 | err_pci_reg: | 1267 | err_pci_reg: |
1266 | pci_disable_device(pdev); | 1268 | if (!adapter || disable_dev) |
1269 | pci_disable_device(pdev); | ||
1267 | return err; | 1270 | return err; |
1268 | } | 1271 | } |
1269 | 1272 | ||
@@ -1281,6 +1284,7 @@ static void e1000_remove(struct pci_dev *pdev) | |||
1281 | struct net_device *netdev = pci_get_drvdata(pdev); | 1284 | struct net_device *netdev = pci_get_drvdata(pdev); |
1282 | struct e1000_adapter *adapter = netdev_priv(netdev); | 1285 | struct e1000_adapter *adapter = netdev_priv(netdev); |
1283 | struct e1000_hw *hw = &adapter->hw; | 1286 | struct e1000_hw *hw = &adapter->hw; |
1287 | bool disable_dev; | ||
1284 | 1288 | ||
1285 | e1000_down_and_stop(adapter); | 1289 | e1000_down_and_stop(adapter); |
1286 | e1000_release_manageability(adapter); | 1290 | e1000_release_manageability(adapter); |
@@ -1299,9 +1303,11 @@ static void e1000_remove(struct pci_dev *pdev) | |||
1299 | iounmap(hw->flash_address); | 1303 | iounmap(hw->flash_address); |
1300 | pci_release_selected_regions(pdev, adapter->bars); | 1304 | pci_release_selected_regions(pdev, adapter->bars); |
1301 | 1305 | ||
1306 | disable_dev = !test_and_set_bit(__E1000_DISABLED, &adapter->flags); | ||
1302 | free_netdev(netdev); | 1307 | free_netdev(netdev); |
1303 | 1308 | ||
1304 | pci_disable_device(pdev); | 1309 | if (disable_dev) |
1310 | pci_disable_device(pdev); | ||
1305 | } | 1311 | } |
1306 | 1312 | ||
1307 | /** | 1313 | /** |
@@ -5156,7 +5162,8 @@ static int __e1000_shutdown(struct pci_dev *pdev, bool *enable_wake) | |||
5156 | if (netif_running(netdev)) | 5162 | if (netif_running(netdev)) |
5157 | e1000_free_irq(adapter); | 5163 | e1000_free_irq(adapter); |
5158 | 5164 | ||
5159 | pci_disable_device(pdev); | 5165 | if (!test_and_set_bit(__E1000_DISABLED, &adapter->flags)) |
5166 | pci_disable_device(pdev); | ||
5160 | 5167 | ||
5161 | return 0; | 5168 | return 0; |
5162 | } | 5169 | } |
@@ -5200,6 +5207,10 @@ static int e1000_resume(struct pci_dev *pdev) | |||
5200 | pr_err("Cannot enable PCI device from suspend\n"); | 5207 | pr_err("Cannot enable PCI device from suspend\n"); |
5201 | return err; | 5208 | return err; |
5202 | } | 5209 | } |
5210 | |||
5211 | /* flush memory to make sure state is correct */ | ||
5212 | smp_mb__before_atomic(); | ||
5213 | clear_bit(__E1000_DISABLED, &adapter->flags); | ||
5203 | pci_set_master(pdev); | 5214 | pci_set_master(pdev); |
5204 | 5215 | ||
5205 | pci_enable_wake(pdev, PCI_D3hot, 0); | 5216 | pci_enable_wake(pdev, PCI_D3hot, 0); |
@@ -5274,7 +5285,9 @@ static pci_ers_result_t e1000_io_error_detected(struct pci_dev *pdev, | |||
5274 | 5285 | ||
5275 | if (netif_running(netdev)) | 5286 | if (netif_running(netdev)) |
5276 | e1000_down(adapter); | 5287 | e1000_down(adapter); |
5277 | pci_disable_device(pdev); | 5288 | |
5289 | if (!test_and_set_bit(__E1000_DISABLED, &adapter->flags)) | ||
5290 | pci_disable_device(pdev); | ||
5278 | 5291 | ||
5279 | /* Request a slot slot reset. */ | 5292 | /* Request a slot slot reset. */ |
5280 | return PCI_ERS_RESULT_NEED_RESET; | 5293 | return PCI_ERS_RESULT_NEED_RESET; |
@@ -5302,6 +5315,10 @@ static pci_ers_result_t e1000_io_slot_reset(struct pci_dev *pdev) | |||
5302 | pr_err("Cannot re-enable PCI device after reset.\n"); | 5315 | pr_err("Cannot re-enable PCI device after reset.\n"); |
5303 | return PCI_ERS_RESULT_DISCONNECT; | 5316 | return PCI_ERS_RESULT_DISCONNECT; |
5304 | } | 5317 | } |
5318 | |||
5319 | /* flush memory to make sure state is correct */ | ||
5320 | smp_mb__before_atomic(); | ||
5321 | clear_bit(__E1000_DISABLED, &adapter->flags); | ||
5305 | pci_set_master(pdev); | 5322 | pci_set_master(pdev); |
5306 | 5323 | ||
5307 | pci_enable_wake(pdev, PCI_D3hot, 0); | 5324 | pci_enable_wake(pdev, PCI_D3hot, 0); |