aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet/emulex/benet
diff options
context:
space:
mode:
authorPadmanabh Ratnakar <padmanabh.ratnakar@emulex.com>2012-10-20 02:02:27 -0400
committerDavid S. Miller <davem@davemloft.net>2012-10-21 22:15:36 -0400
commit67297ad8a61c88508ad86c6bda51c050cdc7f150 (patch)
treebbd2c9203d999260f11e13444640381905f3dc1f /drivers/net/ethernet/emulex/benet
parent704e4c88f0274e554439cc48b06ccc4fdfccc568 (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.c31
-rw-r--r--drivers/net/ethernet/emulex/benet/be_hw.h3
-rw-r--r--drivers/net/ethernet/emulex/benet/be_main.c5
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
455static 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
455int lancer_test_and_set_rdy_state(struct be_adapter *adapter) 472int 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;
3839err: 3839err:
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}