aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJacob Keller <jacob.e.keller@intel.com>2016-06-07 19:08:54 -0400
committerJeff Kirsher <jeffrey.t.kirsher@intel.com>2016-07-20 18:22:13 -0400
commit820c91aa9c39e1923fbe4a6593b3d2dfd7ad593f (patch)
treeda74395e710977c6767e469745005be77533d6a9
parentdc4b76c0fe1753940b15413ae5fb9829552824ec (diff)
fm10k: use common reset flow when handling io errors from PCI stack
Now that we have extracted the necessary steps for a split suspend/resume flow, re-use these functions instead of using the current open coded flow. This ensures that we don't miss any steps. It also ensures that we have the correct driver states set. Since we'll be handling all of the reset flow ourselves, we no longer need to request a reset in the io_slot_reset() function. Signed-off-by: Jacob Keller <jacob.e.keller@intel.com> Tested-by: Krishneil Singh <Krishneil.k.singh@intel.com> Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
-rw-r--r--drivers/net/ethernet/intel/fm10k/fm10k_pci.c60
1 files changed, 7 insertions, 53 deletions
diff --git a/drivers/net/ethernet/intel/fm10k/fm10k_pci.c b/drivers/net/ethernet/intel/fm10k/fm10k_pci.c
index a6ee046e9824..716a5c852143 100644
--- a/drivers/net/ethernet/intel/fm10k/fm10k_pci.c
+++ b/drivers/net/ethernet/intel/fm10k/fm10k_pci.c
@@ -2312,17 +2312,7 @@ static pci_ers_result_t fm10k_io_error_detected(struct pci_dev *pdev,
2312 if (state == pci_channel_io_perm_failure) 2312 if (state == pci_channel_io_perm_failure)
2313 return PCI_ERS_RESULT_DISCONNECT; 2313 return PCI_ERS_RESULT_DISCONNECT;
2314 2314
2315 rtnl_lock(); 2315 fm10k_prepare_suspend(interface);
2316
2317 if (netif_running(netdev))
2318 fm10k_close(netdev);
2319
2320 fm10k_mbx_free_irq(interface);
2321
2322 /* free interrupts */
2323 fm10k_clear_queueing_scheme(interface);
2324
2325 rtnl_unlock();
2326 2316
2327 /* Request a slot reset. */ 2317 /* Request a slot reset. */
2328 return PCI_ERS_RESULT_NEED_RESET; 2318 return PCI_ERS_RESULT_NEED_RESET;
@@ -2336,7 +2326,6 @@ static pci_ers_result_t fm10k_io_error_detected(struct pci_dev *pdev,
2336 */ 2326 */
2337static pci_ers_result_t fm10k_io_slot_reset(struct pci_dev *pdev) 2327static pci_ers_result_t fm10k_io_slot_reset(struct pci_dev *pdev)
2338{ 2328{
2339 struct fm10k_intfc *interface = pci_get_drvdata(pdev);
2340 pci_ers_result_t result; 2329 pci_ers_result_t result;
2341 2330
2342 if (pci_enable_device_mem(pdev)) { 2331 if (pci_enable_device_mem(pdev)) {
@@ -2354,12 +2343,6 @@ static pci_ers_result_t fm10k_io_slot_reset(struct pci_dev *pdev)
2354 2343
2355 pci_wake_from_d3(pdev, false); 2344 pci_wake_from_d3(pdev, false);
2356 2345
2357 /* refresh hw_addr in case it was dropped */
2358 interface->hw.hw_addr = interface->uc_addr;
2359
2360 interface->flags |= FM10K_FLAG_RESET_REQUESTED;
2361 fm10k_service_event_schedule(interface);
2362
2363 result = PCI_ERS_RESULT_RECOVERED; 2346 result = PCI_ERS_RESULT_RECOVERED;
2364 } 2347 }
2365 2348
@@ -2379,44 +2362,15 @@ static void fm10k_io_resume(struct pci_dev *pdev)
2379{ 2362{
2380 struct fm10k_intfc *interface = pci_get_drvdata(pdev); 2363 struct fm10k_intfc *interface = pci_get_drvdata(pdev);
2381 struct net_device *netdev = interface->netdev; 2364 struct net_device *netdev = interface->netdev;
2382 struct fm10k_hw *hw = &interface->hw; 2365 int err;
2383 int err = 0;
2384
2385 /* reset hardware to known state */
2386 err = hw->mac.ops.init_hw(&interface->hw);
2387 if (err) {
2388 dev_err(&pdev->dev, "init_hw failed: %d\n", err);
2389 return;
2390 }
2391
2392 /* reset statistics starting values */
2393 hw->mac.ops.rebind_hw_stats(hw, &interface->stats);
2394
2395 rtnl_lock();
2396
2397 err = fm10k_init_queueing_scheme(interface);
2398 if (err) {
2399 dev_err(&interface->pdev->dev,
2400 "init_queueing_scheme failed: %d\n", err);
2401 goto unlock;
2402 }
2403
2404 /* reassociate interrupts */
2405 fm10k_mbx_request_irq(interface);
2406
2407 rtnl_lock();
2408 if (netif_running(netdev))
2409 err = fm10k_open(netdev);
2410 rtnl_unlock();
2411 2366
2412 /* final check of hardware state before registering the interface */ 2367 err = fm10k_handle_resume(interface);
2413 err = err ? : fm10k_hw_ready(interface);
2414 2368
2415 if (!err) 2369 if (err)
2370 dev_warn(&pdev->dev,
2371 "fm10k_io_resume failed: %d\n", err);
2372 else
2416 netif_device_attach(netdev); 2373 netif_device_attach(netdev);
2417
2418unlock:
2419 rtnl_unlock();
2420} 2374}
2421 2375
2422static const struct pci_error_handlers fm10k_err_handler = { 2376static const struct pci_error_handlers fm10k_err_handler = {