diff options
| author | Kukjin Kim <kgene.kim@samsung.com> | 2014-05-30 13:36:49 -0400 |
|---|---|---|
| committer | Kukjin Kim <kgene.kim@samsung.com> | 2014-05-30 13:36:49 -0400 |
| commit | fced6dee29f6fb143fe16ea90331176ff77e6120 (patch) | |
| tree | 5b6e57e7a757adc2a6518ce291a4d2914397b917 /drivers/net/ethernet/emulex/benet/be_main.c | |
| parent | bfed1074f213051e94648bfad0d0611a16d81366 (diff) | |
| parent | be1f7c8d7e2bc8b8c76846aa6f276e8d2ef8975a (diff) | |
Merge branch 'v3.16-next/cleanup-samsung' into v3.16-next/platform-exynos
Diffstat (limited to 'drivers/net/ethernet/emulex/benet/be_main.c')
| -rw-r--r-- | drivers/net/ethernet/emulex/benet/be_main.c | 17 |
1 files changed, 13 insertions, 4 deletions
diff --git a/drivers/net/ethernet/emulex/benet/be_main.c b/drivers/net/ethernet/emulex/benet/be_main.c index 3e6df47b6973..a18645407d21 100644 --- a/drivers/net/ethernet/emulex/benet/be_main.c +++ b/drivers/net/ethernet/emulex/benet/be_main.c | |||
| @@ -2033,11 +2033,13 @@ static void be_tx_compl_clean(struct be_adapter *adapter) | |||
| 2033 | bool dummy_wrb; | 2033 | bool dummy_wrb; |
| 2034 | int i, pending_txqs; | 2034 | int i, pending_txqs; |
| 2035 | 2035 | ||
| 2036 | /* Wait for a max of 200ms for all the tx-completions to arrive. */ | 2036 | /* Stop polling for compls when HW has been silent for 10ms */ |
| 2037 | do { | 2037 | do { |
| 2038 | pending_txqs = adapter->num_tx_qs; | 2038 | pending_txqs = adapter->num_tx_qs; |
| 2039 | 2039 | ||
| 2040 | for_all_tx_queues(adapter, txo, i) { | 2040 | for_all_tx_queues(adapter, txo, i) { |
| 2041 | cmpl = 0; | ||
| 2042 | num_wrbs = 0; | ||
| 2041 | txq = &txo->q; | 2043 | txq = &txo->q; |
| 2042 | while ((txcp = be_tx_compl_get(&txo->cq))) { | 2044 | while ((txcp = be_tx_compl_get(&txo->cq))) { |
| 2043 | end_idx = | 2045 | end_idx = |
| @@ -2050,14 +2052,13 @@ static void be_tx_compl_clean(struct be_adapter *adapter) | |||
| 2050 | if (cmpl) { | 2052 | if (cmpl) { |
| 2051 | be_cq_notify(adapter, txo->cq.id, false, cmpl); | 2053 | be_cq_notify(adapter, txo->cq.id, false, cmpl); |
| 2052 | atomic_sub(num_wrbs, &txq->used); | 2054 | atomic_sub(num_wrbs, &txq->used); |
| 2053 | cmpl = 0; | 2055 | timeo = 0; |
| 2054 | num_wrbs = 0; | ||
| 2055 | } | 2056 | } |
| 2056 | if (atomic_read(&txq->used) == 0) | 2057 | if (atomic_read(&txq->used) == 0) |
| 2057 | pending_txqs--; | 2058 | pending_txqs--; |
| 2058 | } | 2059 | } |
| 2059 | 2060 | ||
| 2060 | if (pending_txqs == 0 || ++timeo > 200) | 2061 | if (pending_txqs == 0 || ++timeo > 10 || be_hw_error(adapter)) |
| 2061 | break; | 2062 | break; |
| 2062 | 2063 | ||
| 2063 | mdelay(1); | 2064 | mdelay(1); |
| @@ -2725,6 +2726,12 @@ static int be_close(struct net_device *netdev) | |||
| 2725 | struct be_eq_obj *eqo; | 2726 | struct be_eq_obj *eqo; |
| 2726 | int i; | 2727 | int i; |
| 2727 | 2728 | ||
| 2729 | /* This protection is needed as be_close() may be called even when the | ||
| 2730 | * adapter is in cleared state (after eeh perm failure) | ||
| 2731 | */ | ||
| 2732 | if (!(adapter->flags & BE_FLAGS_SETUP_DONE)) | ||
| 2733 | return 0; | ||
| 2734 | |||
| 2728 | be_roce_dev_close(adapter); | 2735 | be_roce_dev_close(adapter); |
| 2729 | 2736 | ||
| 2730 | if (adapter->flags & BE_FLAGS_NAPI_ENABLED) { | 2737 | if (adapter->flags & BE_FLAGS_NAPI_ENABLED) { |
| @@ -3055,6 +3062,7 @@ static int be_clear(struct be_adapter *adapter) | |||
| 3055 | be_clear_queues(adapter); | 3062 | be_clear_queues(adapter); |
| 3056 | 3063 | ||
| 3057 | be_msix_disable(adapter); | 3064 | be_msix_disable(adapter); |
| 3065 | adapter->flags &= ~BE_FLAGS_SETUP_DONE; | ||
| 3058 | return 0; | 3066 | return 0; |
| 3059 | } | 3067 | } |
| 3060 | 3068 | ||
| @@ -3559,6 +3567,7 @@ static int be_setup(struct be_adapter *adapter) | |||
| 3559 | adapter->phy.fc_autoneg = 1; | 3567 | adapter->phy.fc_autoneg = 1; |
| 3560 | 3568 | ||
| 3561 | be_schedule_worker(adapter); | 3569 | be_schedule_worker(adapter); |
| 3570 | adapter->flags |= BE_FLAGS_SETUP_DONE; | ||
| 3562 | return 0; | 3571 | return 0; |
| 3563 | err: | 3572 | err: |
| 3564 | be_clear(adapter); | 3573 | be_clear(adapter); |
