diff options
author | Padmanabh Ratnakar <padmanabh.ratnakar@emulex.com> | 2012-10-20 02:02:27 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2012-10-21 22:15:36 -0400 |
commit | 67297ad8a61c88508ad86c6bda51c050cdc7f150 (patch) | |
tree | bbd2c9203d999260f11e13444640381905f3dc1f /drivers/net/ethernet/emulex/benet | |
parent | 704e4c88f0274e554439cc48b06ccc4fdfccc568 (diff) |
be2net: Wait till resources are available for VF in error recovery
After FW error, driver should wait for NO_RESOURCE error to disappear before
proceeding with recovery.
Signed-off-by: Padmanabh Ratnakar <padmanabh.ratnakar@emulex.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/ethernet/emulex/benet')
-rw-r--r-- | drivers/net/ethernet/emulex/benet/be_cmds.c | 31 | ||||
-rw-r--r-- | drivers/net/ethernet/emulex/benet/be_hw.h | 3 | ||||
-rw-r--r-- | drivers/net/ethernet/emulex/benet/be_main.c | 5 |
3 files changed, 37 insertions, 2 deletions
diff --git a/drivers/net/ethernet/emulex/benet/be_cmds.c b/drivers/net/ethernet/emulex/benet/be_cmds.c index 3980b5815d8d..9a12c4b99e26 100644 --- a/drivers/net/ethernet/emulex/benet/be_cmds.c +++ b/drivers/net/ethernet/emulex/benet/be_cmds.c | |||
@@ -452,10 +452,33 @@ int lancer_wait_ready(struct be_adapter *adapter) | |||
452 | return status; | 452 | return status; |
453 | } | 453 | } |
454 | 454 | ||
455 | static bool lancer_provisioning_error(struct be_adapter *adapter) | ||
456 | { | ||
457 | u32 sliport_status = 0, sliport_err1 = 0, sliport_err2 = 0; | ||
458 | sliport_status = ioread32(adapter->db + SLIPORT_STATUS_OFFSET); | ||
459 | if (sliport_status & SLIPORT_STATUS_ERR_MASK) { | ||
460 | sliport_err1 = ioread32(adapter->db + | ||
461 | SLIPORT_ERROR1_OFFSET); | ||
462 | sliport_err2 = ioread32(adapter->db + | ||
463 | SLIPORT_ERROR2_OFFSET); | ||
464 | |||
465 | if (sliport_err1 == SLIPORT_ERROR_NO_RESOURCE1 && | ||
466 | sliport_err2 == SLIPORT_ERROR_NO_RESOURCE2) | ||
467 | return true; | ||
468 | } | ||
469 | return false; | ||
470 | } | ||
471 | |||
455 | int lancer_test_and_set_rdy_state(struct be_adapter *adapter) | 472 | int lancer_test_and_set_rdy_state(struct be_adapter *adapter) |
456 | { | 473 | { |
457 | int status; | 474 | int status; |
458 | u32 sliport_status, err, reset_needed; | 475 | u32 sliport_status, err, reset_needed; |
476 | bool resource_error; | ||
477 | |||
478 | resource_error = lancer_provisioning_error(adapter); | ||
479 | if (resource_error) | ||
480 | return -1; | ||
481 | |||
459 | status = lancer_wait_ready(adapter); | 482 | status = lancer_wait_ready(adapter); |
460 | if (!status) { | 483 | if (!status) { |
461 | sliport_status = ioread32(adapter->db + SLIPORT_STATUS_OFFSET); | 484 | sliport_status = ioread32(adapter->db + SLIPORT_STATUS_OFFSET); |
@@ -477,6 +500,14 @@ int lancer_test_and_set_rdy_state(struct be_adapter *adapter) | |||
477 | status = -1; | 500 | status = -1; |
478 | } | 501 | } |
479 | } | 502 | } |
503 | /* Stop error recovery if error is not recoverable. | ||
504 | * No resource error is temporary errors and will go away | ||
505 | * when PF provisions resources. | ||
506 | */ | ||
507 | resource_error = lancer_provisioning_error(adapter); | ||
508 | if (status == -1 && !resource_error) | ||
509 | adapter->eeh_error = true; | ||
510 | |||
480 | return status; | 511 | return status; |
481 | } | 512 | } |
482 | 513 | ||
diff --git a/drivers/net/ethernet/emulex/benet/be_hw.h b/drivers/net/ethernet/emulex/benet/be_hw.h index b755f7061dce..4ccbc36874e9 100644 --- a/drivers/net/ethernet/emulex/benet/be_hw.h +++ b/drivers/net/ethernet/emulex/benet/be_hw.h | |||
@@ -59,6 +59,9 @@ | |||
59 | #define PHYSDEV_CONTROL_FW_RESET_MASK 0x00000002 | 59 | #define PHYSDEV_CONTROL_FW_RESET_MASK 0x00000002 |
60 | #define PHYSDEV_CONTROL_INP_MASK 0x40000000 | 60 | #define PHYSDEV_CONTROL_INP_MASK 0x40000000 |
61 | 61 | ||
62 | #define SLIPORT_ERROR_NO_RESOURCE1 0x2 | ||
63 | #define SLIPORT_ERROR_NO_RESOURCE2 0x9 | ||
64 | |||
62 | /********* Memory BAR register ************/ | 65 | /********* Memory BAR register ************/ |
63 | #define PCICFG_MEMBAR_CTRL_INT_CTRL_OFFSET 0xfc | 66 | #define PCICFG_MEMBAR_CTRL_INT_CTRL_OFFSET 0xfc |
64 | /* Host Interrupt Enable, if set interrupts are enabled although "PCI Interrupt | 67 | /* Host Interrupt Enable, if set interrupts are enabled although "PCI Interrupt |
diff --git a/drivers/net/ethernet/emulex/benet/be_main.c b/drivers/net/ethernet/emulex/benet/be_main.c index 41f935a2d05d..7a483fdd974b 100644 --- a/drivers/net/ethernet/emulex/benet/be_main.c +++ b/drivers/net/ethernet/emulex/benet/be_main.c | |||
@@ -3837,8 +3837,9 @@ static int lancer_recover_func(struct be_adapter *adapter) | |||
3837 | "Adapter SLIPORT recovery succeeded\n"); | 3837 | "Adapter SLIPORT recovery succeeded\n"); |
3838 | return 0; | 3838 | return 0; |
3839 | err: | 3839 | err: |
3840 | dev_err(&adapter->pdev->dev, | 3840 | if (adapter->eeh_error) |
3841 | "Adapter SLIPORT recovery failed\n"); | 3841 | dev_err(&adapter->pdev->dev, |
3842 | "Adapter SLIPORT recovery failed\n"); | ||
3842 | 3843 | ||
3843 | return status; | 3844 | return status; |
3844 | } | 3845 | } |