Commit 8cb31cfc authored by John Allen's avatar John Allen Committed by David S. Miller

ibmvnic: Non-fatal error handling

Handle non-fatal error conditions. The process to do this when
resetting the driver is to just do __ibmvnic_close followed by
__ibmvnic_open.
Signed-off-by: default avatarJohn Allen <jallen@linux.vnet.ibm.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 10f76215
...@@ -1225,37 +1225,41 @@ static int do_reset(struct ibmvnic_adapter *adapter, ...@@ -1225,37 +1225,41 @@ static int do_reset(struct ibmvnic_adapter *adapter,
if (rc) if (rc)
return rc; return rc;
/* remove the closed state so when we call open it appears if (adapter->reset_reason != VNIC_RESET_NON_FATAL) {
* we are coming from the probed state. /* remove the closed state so when we call open it appears
*/ * we are coming from the probed state.
adapter->state = VNIC_PROBED; */
adapter->state = VNIC_PROBED;
release_resources(adapter); release_resources(adapter);
release_sub_crqs(adapter); release_sub_crqs(adapter);
release_crq_queue(adapter); release_crq_queue(adapter);
rc = ibmvnic_init(adapter); rc = ibmvnic_init(adapter);
if (rc) if (rc)
return 0; return 0;
/* If the adapter was in PROBE state prior to the reset, exit here. */ /* If the adapter was in PROBE state prior to the reset,
if (reset_state == VNIC_PROBED) * exit here.
return 0; */
if (reset_state == VNIC_PROBED)
return 0;
rc = ibmvnic_login(netdev); rc = ibmvnic_login(netdev);
if (rc) { if (rc) {
adapter->state = VNIC_PROBED; adapter->state = VNIC_PROBED;
return 0; return 0;
} }
rtnl_lock(); rtnl_lock();
rc = init_resources(adapter); rc = init_resources(adapter);
rtnl_unlock(); rtnl_unlock();
if (rc) if (rc)
return rc; return rc;
if (reset_state == VNIC_CLOSED) if (reset_state == VNIC_CLOSED)
return 0; return 0;
}
rc = __ibmvnic_open(netdev); rc = __ibmvnic_open(netdev);
if (rc) { if (rc) {
...@@ -2763,6 +2767,8 @@ static void handle_error_indication(union ibmvnic_crq *crq, ...@@ -2763,6 +2767,8 @@ static void handle_error_indication(union ibmvnic_crq *crq,
if (crq->error_indication.flags & IBMVNIC_FATAL_ERROR) if (crq->error_indication.flags & IBMVNIC_FATAL_ERROR)
ibmvnic_reset(adapter, VNIC_RESET_FATAL); ibmvnic_reset(adapter, VNIC_RESET_FATAL);
else
ibmvnic_reset(adapter, VNIC_RESET_NON_FATAL);
} }
static void handle_change_mac_rsp(union ibmvnic_crq *crq, static void handle_change_mac_rsp(union ibmvnic_crq *crq,
......
...@@ -925,6 +925,7 @@ enum vnic_state {VNIC_PROBING = 1, ...@@ -925,6 +925,7 @@ enum vnic_state {VNIC_PROBING = 1,
enum ibmvnic_reset_reason {VNIC_RESET_FAILOVER = 1, enum ibmvnic_reset_reason {VNIC_RESET_FAILOVER = 1,
VNIC_RESET_MOBILITY, VNIC_RESET_MOBILITY,
VNIC_RESET_FATAL, VNIC_RESET_FATAL,
VNIC_RESET_NON_FATAL,
VNIC_RESET_TIMEOUT}; VNIC_RESET_TIMEOUT};
struct ibmvnic_rwi { struct ibmvnic_rwi {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment