diff options
author | Padmanabh Ratnakar <padmanabh.ratnakar@emulex.com> | 2012-07-11 23:56:58 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2012-07-12 11:16:46 -0400 |
commit | bf99e50dc2ec49fc1256f9499987699a3f7f158b (patch) | |
tree | e97f373260bb15d4edc3f1cece0e548f9df1c192 /drivers/net | |
parent | 7aeb21564332bcf0dacc198e4f795e8e5e347126 (diff) |
be2net: Fix initialization sequence for Lancer
Invoke only required initialization routines for Lancer.
Remove invocation of unnecessary routines.
Signed-off-by: Padmanabh Ratnakar <padmanabh.ratnakar@emulex.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net')
-rw-r--r-- | drivers/net/ethernet/emulex/benet/be_cmds.c | 76 | ||||
-rw-r--r-- | drivers/net/ethernet/emulex/benet/be_cmds.h | 4 | ||||
-rw-r--r-- | drivers/net/ethernet/emulex/benet/be_main.c | 75 |
3 files changed, 87 insertions, 68 deletions
diff --git a/drivers/net/ethernet/emulex/benet/be_cmds.c b/drivers/net/ethernet/emulex/benet/be_cmds.c index d75c9fb9a188..431f7749eea2 100644 --- a/drivers/net/ethernet/emulex/benet/be_cmds.c +++ b/drivers/net/ethernet/emulex/benet/be_cmds.c | |||
@@ -426,12 +426,65 @@ static int be_POST_stage_get(struct be_adapter *adapter, u16 *stage) | |||
426 | return 0; | 426 | return 0; |
427 | } | 427 | } |
428 | 428 | ||
429 | int be_cmd_POST(struct be_adapter *adapter) | 429 | int lancer_wait_ready(struct be_adapter *adapter) |
430 | { | ||
431 | #define SLIPORT_READY_TIMEOUT 30 | ||
432 | u32 sliport_status; | ||
433 | int status = 0, i; | ||
434 | |||
435 | for (i = 0; i < SLIPORT_READY_TIMEOUT; i++) { | ||
436 | sliport_status = ioread32(adapter->db + SLIPORT_STATUS_OFFSET); | ||
437 | if (sliport_status & SLIPORT_STATUS_RDY_MASK) | ||
438 | break; | ||
439 | |||
440 | msleep(1000); | ||
441 | } | ||
442 | |||
443 | if (i == SLIPORT_READY_TIMEOUT) | ||
444 | status = -1; | ||
445 | |||
446 | return status; | ||
447 | } | ||
448 | |||
449 | int lancer_test_and_set_rdy_state(struct be_adapter *adapter) | ||
450 | { | ||
451 | int status; | ||
452 | u32 sliport_status, err, reset_needed; | ||
453 | status = lancer_wait_ready(adapter); | ||
454 | if (!status) { | ||
455 | sliport_status = ioread32(adapter->db + SLIPORT_STATUS_OFFSET); | ||
456 | err = sliport_status & SLIPORT_STATUS_ERR_MASK; | ||
457 | reset_needed = sliport_status & SLIPORT_STATUS_RN_MASK; | ||
458 | if (err && reset_needed) { | ||
459 | iowrite32(SLI_PORT_CONTROL_IP_MASK, | ||
460 | adapter->db + SLIPORT_CONTROL_OFFSET); | ||
461 | |||
462 | /* check adapter has corrected the error */ | ||
463 | status = lancer_wait_ready(adapter); | ||
464 | sliport_status = ioread32(adapter->db + | ||
465 | SLIPORT_STATUS_OFFSET); | ||
466 | sliport_status &= (SLIPORT_STATUS_ERR_MASK | | ||
467 | SLIPORT_STATUS_RN_MASK); | ||
468 | if (status || sliport_status) | ||
469 | status = -1; | ||
470 | } else if (err || reset_needed) { | ||
471 | status = -1; | ||
472 | } | ||
473 | } | ||
474 | return status; | ||
475 | } | ||
476 | |||
477 | int be_fw_wait_ready(struct be_adapter *adapter) | ||
430 | { | 478 | { |
431 | u16 stage; | 479 | u16 stage; |
432 | int status, timeout = 0; | 480 | int status, timeout = 0; |
433 | struct device *dev = &adapter->pdev->dev; | 481 | struct device *dev = &adapter->pdev->dev; |
434 | 482 | ||
483 | if (lancer_chip(adapter)) { | ||
484 | status = lancer_wait_ready(adapter); | ||
485 | return status; | ||
486 | } | ||
487 | |||
435 | do { | 488 | do { |
436 | status = be_POST_stage_get(adapter, &stage); | 489 | status = be_POST_stage_get(adapter, &stage); |
437 | if (status) { | 490 | if (status) { |
@@ -562,6 +615,9 @@ int be_cmd_fw_init(struct be_adapter *adapter) | |||
562 | u8 *wrb; | 615 | u8 *wrb; |
563 | int status; | 616 | int status; |
564 | 617 | ||
618 | if (lancer_chip(adapter)) | ||
619 | return 0; | ||
620 | |||
565 | if (mutex_lock_interruptible(&adapter->mbox_lock)) | 621 | if (mutex_lock_interruptible(&adapter->mbox_lock)) |
566 | return -1; | 622 | return -1; |
567 | 623 | ||
@@ -589,6 +645,9 @@ int be_cmd_fw_clean(struct be_adapter *adapter) | |||
589 | u8 *wrb; | 645 | u8 *wrb; |
590 | int status; | 646 | int status; |
591 | 647 | ||
648 | if (lancer_chip(adapter)) | ||
649 | return 0; | ||
650 | |||
592 | if (mutex_lock_interruptible(&adapter->mbox_lock)) | 651 | if (mutex_lock_interruptible(&adapter->mbox_lock)) |
593 | return -1; | 652 | return -1; |
594 | 653 | ||
@@ -607,6 +666,7 @@ int be_cmd_fw_clean(struct be_adapter *adapter) | |||
607 | mutex_unlock(&adapter->mbox_lock); | 666 | mutex_unlock(&adapter->mbox_lock); |
608 | return status; | 667 | return status; |
609 | } | 668 | } |
669 | |||
610 | int be_cmd_eq_create(struct be_adapter *adapter, | 670 | int be_cmd_eq_create(struct be_adapter *adapter, |
611 | struct be_queue_info *eq, int eq_delay) | 671 | struct be_queue_info *eq, int eq_delay) |
612 | { | 672 | { |
@@ -1682,6 +1742,20 @@ int be_cmd_reset_function(struct be_adapter *adapter) | |||
1682 | struct be_cmd_req_hdr *req; | 1742 | struct be_cmd_req_hdr *req; |
1683 | int status; | 1743 | int status; |
1684 | 1744 | ||
1745 | if (lancer_chip(adapter)) { | ||
1746 | status = lancer_wait_ready(adapter); | ||
1747 | if (!status) { | ||
1748 | iowrite32(SLI_PORT_CONTROL_IP_MASK, | ||
1749 | adapter->db + SLIPORT_CONTROL_OFFSET); | ||
1750 | status = lancer_test_and_set_rdy_state(adapter); | ||
1751 | } | ||
1752 | if (status) { | ||
1753 | dev_err(&adapter->pdev->dev, | ||
1754 | "Adapter in non recoverable error\n"); | ||
1755 | } | ||
1756 | return status; | ||
1757 | } | ||
1758 | |||
1685 | if (mutex_lock_interruptible(&adapter->mbox_lock)) | 1759 | if (mutex_lock_interruptible(&adapter->mbox_lock)) |
1686 | return -1; | 1760 | return -1; |
1687 | 1761 | ||
diff --git a/drivers/net/ethernet/emulex/benet/be_cmds.h b/drivers/net/ethernet/emulex/benet/be_cmds.h index 3c938f55c00b..cfc0620b747b 100644 --- a/drivers/net/ethernet/emulex/benet/be_cmds.h +++ b/drivers/net/ethernet/emulex/benet/be_cmds.h | |||
@@ -1656,7 +1656,7 @@ struct be_cmd_req_set_ext_fat_caps { | |||
1656 | }; | 1656 | }; |
1657 | 1657 | ||
1658 | extern int be_pci_fnum_get(struct be_adapter *adapter); | 1658 | extern int be_pci_fnum_get(struct be_adapter *adapter); |
1659 | extern int be_cmd_POST(struct be_adapter *adapter); | 1659 | extern int be_fw_wait_ready(struct be_adapter *adapter); |
1660 | extern int be_cmd_mac_addr_query(struct be_adapter *adapter, u8 *mac_addr, | 1660 | extern int be_cmd_mac_addr_query(struct be_adapter *adapter, u8 *mac_addr, |
1661 | u8 type, bool permanent, u32 if_handle, u32 pmac_id); | 1661 | u8 type, bool permanent, u32 if_handle, u32 pmac_id); |
1662 | extern int be_cmd_pmac_add(struct be_adapter *adapter, u8 *mac_addr, | 1662 | extern int be_cmd_pmac_add(struct be_adapter *adapter, u8 *mac_addr, |
@@ -1765,4 +1765,6 @@ extern int be_cmd_get_ext_fat_capabilites(struct be_adapter *adapter, | |||
1765 | extern int be_cmd_set_ext_fat_capabilites(struct be_adapter *adapter, | 1765 | extern int be_cmd_set_ext_fat_capabilites(struct be_adapter *adapter, |
1766 | struct be_dma_mem *cmd, | 1766 | struct be_dma_mem *cmd, |
1767 | struct be_fat_conf_params *cfgs); | 1767 | struct be_fat_conf_params *cfgs); |
1768 | extern int lancer_wait_ready(struct be_adapter *adapter); | ||
1769 | extern int lancer_test_and_set_rdy_state(struct be_adapter *adapter); | ||
1768 | 1770 | ||
diff --git a/drivers/net/ethernet/emulex/benet/be_main.c b/drivers/net/ethernet/emulex/benet/be_main.c index 2436c3a60f93..a3641baa8604 100644 --- a/drivers/net/ethernet/emulex/benet/be_main.c +++ b/drivers/net/ethernet/emulex/benet/be_main.c | |||
@@ -2573,9 +2573,6 @@ static int be_clear(struct be_adapter *adapter) | |||
2573 | be_tx_queues_destroy(adapter); | 2573 | be_tx_queues_destroy(adapter); |
2574 | be_evt_queues_destroy(adapter); | 2574 | be_evt_queues_destroy(adapter); |
2575 | 2575 | ||
2576 | /* tell fw we're done with firing cmds */ | ||
2577 | be_cmd_fw_clean(adapter); | ||
2578 | |||
2579 | be_msix_disable(adapter); | 2576 | be_msix_disable(adapter); |
2580 | return 0; | 2577 | return 0; |
2581 | } | 2578 | } |
@@ -3476,6 +3473,9 @@ static void __devexit be_remove(struct pci_dev *pdev) | |||
3476 | 3473 | ||
3477 | be_clear(adapter); | 3474 | be_clear(adapter); |
3478 | 3475 | ||
3476 | /* tell fw we're done with firing cmds */ | ||
3477 | be_cmd_fw_clean(adapter); | ||
3478 | |||
3479 | be_stats_cleanup(adapter); | 3479 | be_stats_cleanup(adapter); |
3480 | 3480 | ||
3481 | be_ctrl_cleanup(adapter); | 3481 | be_ctrl_cleanup(adapter); |
@@ -3625,54 +3625,6 @@ static int be_dev_type_check(struct be_adapter *adapter) | |||
3625 | return 0; | 3625 | return 0; |
3626 | } | 3626 | } |
3627 | 3627 | ||
3628 | static int lancer_wait_ready(struct be_adapter *adapter) | ||
3629 | { | ||
3630 | #define SLIPORT_READY_TIMEOUT 30 | ||
3631 | u32 sliport_status; | ||
3632 | int status = 0, i; | ||
3633 | |||
3634 | for (i = 0; i < SLIPORT_READY_TIMEOUT; i++) { | ||
3635 | sliport_status = ioread32(adapter->db + SLIPORT_STATUS_OFFSET); | ||
3636 | if (sliport_status & SLIPORT_STATUS_RDY_MASK) | ||
3637 | break; | ||
3638 | |||
3639 | msleep(1000); | ||
3640 | } | ||
3641 | |||
3642 | if (i == SLIPORT_READY_TIMEOUT) | ||
3643 | status = -1; | ||
3644 | |||
3645 | return status; | ||
3646 | } | ||
3647 | |||
3648 | static int lancer_test_and_set_rdy_state(struct be_adapter *adapter) | ||
3649 | { | ||
3650 | int status; | ||
3651 | u32 sliport_status, err, reset_needed; | ||
3652 | status = lancer_wait_ready(adapter); | ||
3653 | if (!status) { | ||
3654 | sliport_status = ioread32(adapter->db + SLIPORT_STATUS_OFFSET); | ||
3655 | err = sliport_status & SLIPORT_STATUS_ERR_MASK; | ||
3656 | reset_needed = sliport_status & SLIPORT_STATUS_RN_MASK; | ||
3657 | if (err && reset_needed) { | ||
3658 | iowrite32(SLI_PORT_CONTROL_IP_MASK, | ||
3659 | adapter->db + SLIPORT_CONTROL_OFFSET); | ||
3660 | |||
3661 | /* check adapter has corrected the error */ | ||
3662 | status = lancer_wait_ready(adapter); | ||
3663 | sliport_status = ioread32(adapter->db + | ||
3664 | SLIPORT_STATUS_OFFSET); | ||
3665 | sliport_status &= (SLIPORT_STATUS_ERR_MASK | | ||
3666 | SLIPORT_STATUS_RN_MASK); | ||
3667 | if (status || sliport_status) | ||
3668 | status = -1; | ||
3669 | } else if (err || reset_needed) { | ||
3670 | status = -1; | ||
3671 | } | ||
3672 | } | ||
3673 | return status; | ||
3674 | } | ||
3675 | |||
3676 | static void lancer_test_and_recover_fn_err(struct be_adapter *adapter) | 3628 | static void lancer_test_and_recover_fn_err(struct be_adapter *adapter) |
3677 | { | 3629 | { |
3678 | int status; | 3630 | int status; |
@@ -3820,22 +3772,9 @@ static int __devinit be_probe(struct pci_dev *pdev, | |||
3820 | if (status) | 3772 | if (status) |
3821 | goto free_netdev; | 3773 | goto free_netdev; |
3822 | 3774 | ||
3823 | if (lancer_chip(adapter)) { | ||
3824 | status = lancer_wait_ready(adapter); | ||
3825 | if (!status) { | ||
3826 | iowrite32(SLI_PORT_CONTROL_IP_MASK, | ||
3827 | adapter->db + SLIPORT_CONTROL_OFFSET); | ||
3828 | status = lancer_test_and_set_rdy_state(adapter); | ||
3829 | } | ||
3830 | if (status) { | ||
3831 | dev_err(&pdev->dev, "Adapter in non recoverable error\n"); | ||
3832 | goto ctrl_clean; | ||
3833 | } | ||
3834 | } | ||
3835 | |||
3836 | /* sync up with fw's ready state */ | 3775 | /* sync up with fw's ready state */ |
3837 | if (be_physfn(adapter)) { | 3776 | if (be_physfn(adapter)) { |
3838 | status = be_cmd_POST(adapter); | 3777 | status = be_fw_wait_ready(adapter); |
3839 | if (status) | 3778 | if (status) |
3840 | goto ctrl_clean; | 3779 | goto ctrl_clean; |
3841 | } | 3780 | } |
@@ -4033,7 +3972,7 @@ static pci_ers_result_t be_eeh_reset(struct pci_dev *pdev) | |||
4033 | pci_restore_state(pdev); | 3972 | pci_restore_state(pdev); |
4034 | 3973 | ||
4035 | /* Check if card is ok and fw is ready */ | 3974 | /* Check if card is ok and fw is ready */ |
4036 | status = be_cmd_POST(adapter); | 3975 | status = be_fw_wait_ready(adapter); |
4037 | if (status) | 3976 | if (status) |
4038 | return PCI_ERS_RESULT_DISCONNECT; | 3977 | return PCI_ERS_RESULT_DISCONNECT; |
4039 | 3978 | ||
@@ -4055,6 +3994,10 @@ static void be_eeh_resume(struct pci_dev *pdev) | |||
4055 | if (status) | 3994 | if (status) |
4056 | goto err; | 3995 | goto err; |
4057 | 3996 | ||
3997 | status = be_cmd_reset_function(adapter); | ||
3998 | if (status) | ||
3999 | goto err; | ||
4000 | |||
4058 | status = be_setup(adapter); | 4001 | status = be_setup(adapter); |
4059 | if (status) | 4002 | if (status) |
4060 | goto err; | 4003 | goto err; |