Commit c98d9cc4 authored by Dany Madden's avatar Dany Madden Committed by Jakub Kicinski

ibmvnic: send_login should check for crq errors

send_login() does not check for the result of ibmvnic_send_crq() of the
login request. This results in the driver needlessly retrying the login
10 times even when CRQ is no longer active. Check the return code and
give up in case of errors in sending the CRQ.

The only time we want to retry is if we get a PARITALSUCCESS response
from the partner.

Fixes: 032c5e82 ("Driver for IBM System i/p VNIC protocol")
Signed-off-by: default avatarDany Madden <drt@linux.ibm.com>
Signed-off-by: default avatarSukadev Bhattiprolu <sukadev@linux.ibm.com>
Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent 76cdc5c5
...@@ -850,10 +850,8 @@ static int ibmvnic_login(struct net_device *netdev) ...@@ -850,10 +850,8 @@ static int ibmvnic_login(struct net_device *netdev)
adapter->init_done_rc = 0; adapter->init_done_rc = 0;
reinit_completion(&adapter->init_done); reinit_completion(&adapter->init_done);
rc = send_login(adapter); rc = send_login(adapter);
if (rc) { if (rc)
netdev_warn(netdev, "Unable to login\n");
return rc; return rc;
}
if (!wait_for_completion_timeout(&adapter->init_done, if (!wait_for_completion_timeout(&adapter->init_done,
timeout)) { timeout)) {
...@@ -3729,15 +3727,16 @@ static int send_login(struct ibmvnic_adapter *adapter) ...@@ -3729,15 +3727,16 @@ static int send_login(struct ibmvnic_adapter *adapter)
struct ibmvnic_login_rsp_buffer *login_rsp_buffer; struct ibmvnic_login_rsp_buffer *login_rsp_buffer;
struct ibmvnic_login_buffer *login_buffer; struct ibmvnic_login_buffer *login_buffer;
struct device *dev = &adapter->vdev->dev; struct device *dev = &adapter->vdev->dev;
struct vnic_login_client_data *vlcd;
dma_addr_t rsp_buffer_token; dma_addr_t rsp_buffer_token;
dma_addr_t buffer_token; dma_addr_t buffer_token;
size_t rsp_buffer_size; size_t rsp_buffer_size;
union ibmvnic_crq crq; union ibmvnic_crq crq;
int client_data_len;
size_t buffer_size; size_t buffer_size;
__be64 *tx_list_p; __be64 *tx_list_p;
__be64 *rx_list_p; __be64 *rx_list_p;
int client_data_len; int rc;
struct vnic_login_client_data *vlcd;
int i; int i;
if (!adapter->tx_scrq || !adapter->rx_scrq) { if (!adapter->tx_scrq || !adapter->rx_scrq) {
...@@ -3843,16 +3842,23 @@ static int send_login(struct ibmvnic_adapter *adapter) ...@@ -3843,16 +3842,23 @@ static int send_login(struct ibmvnic_adapter *adapter)
crq.login.len = cpu_to_be32(buffer_size); crq.login.len = cpu_to_be32(buffer_size);
adapter->login_pending = true; adapter->login_pending = true;
ibmvnic_send_crq(adapter, &crq); rc = ibmvnic_send_crq(adapter, &crq);
if (rc) {
adapter->login_pending = false;
netdev_err(adapter->netdev, "Failed to send login, rc=%d\n", rc);
goto buf_rsp_map_failed;
}
return 0; return 0;
buf_rsp_map_failed: buf_rsp_map_failed:
kfree(login_rsp_buffer); kfree(login_rsp_buffer);
adapter->login_rsp_buf = NULL;
buf_rsp_alloc_failed: buf_rsp_alloc_failed:
dma_unmap_single(dev, buffer_token, buffer_size, DMA_TO_DEVICE); dma_unmap_single(dev, buffer_token, buffer_size, DMA_TO_DEVICE);
buf_map_failed: buf_map_failed:
kfree(login_buffer); kfree(login_buffer);
adapter->login_buf = NULL;
buf_alloc_failed: buf_alloc_failed:
return -1; return -1;
} }
......
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