|
@@ -556,7 +556,7 @@ static int ibmvscsi_send_srp_event(struct srp_event_struct *evt_struct,
|
|
unsigned long timeout)
|
|
unsigned long timeout)
|
|
{
|
|
{
|
|
u64 *crq_as_u64 = (u64 *) &evt_struct->crq;
|
|
u64 *crq_as_u64 = (u64 *) &evt_struct->crq;
|
|
- int request_status;
|
|
|
|
|
|
+ int request_status = 0;
|
|
int rc;
|
|
int rc;
|
|
|
|
|
|
/* If we have exhausted our request limit, just fail this request,
|
|
/* If we have exhausted our request limit, just fail this request,
|
|
@@ -574,6 +574,13 @@ static int ibmvscsi_send_srp_event(struct srp_event_struct *evt_struct,
|
|
if (request_status < -1)
|
|
if (request_status < -1)
|
|
goto send_error;
|
|
goto send_error;
|
|
/* Otherwise, we may have run out of requests. */
|
|
/* Otherwise, we may have run out of requests. */
|
|
|
|
+ /* If request limit was 0 when we started the adapter is in the
|
|
|
|
+ * process of performing a login with the server adapter, or
|
|
|
|
+ * we may have run out of requests.
|
|
|
|
+ */
|
|
|
|
+ else if (request_status == -1 &&
|
|
|
|
+ evt_struct->iu.srp.login_req.opcode != SRP_LOGIN_REQ)
|
|
|
|
+ goto send_busy;
|
|
/* Abort and reset calls should make it through.
|
|
/* Abort and reset calls should make it through.
|
|
* Nothing except abort and reset should use the last two
|
|
* Nothing except abort and reset should use the last two
|
|
* slots unless we had two or less to begin with.
|
|
* slots unless we had two or less to begin with.
|
|
@@ -633,7 +640,8 @@ static int ibmvscsi_send_srp_event(struct srp_event_struct *evt_struct,
|
|
unmap_cmd_data(&evt_struct->iu.srp.cmd, evt_struct, hostdata->dev);
|
|
unmap_cmd_data(&evt_struct->iu.srp.cmd, evt_struct, hostdata->dev);
|
|
|
|
|
|
free_event_struct(&hostdata->pool, evt_struct);
|
|
free_event_struct(&hostdata->pool, evt_struct);
|
|
- atomic_inc(&hostdata->request_limit);
|
|
|
|
|
|
+ if (request_status != -1)
|
|
|
|
+ atomic_inc(&hostdata->request_limit);
|
|
return SCSI_MLQUEUE_HOST_BUSY;
|
|
return SCSI_MLQUEUE_HOST_BUSY;
|
|
|
|
|
|
send_error:
|
|
send_error:
|
|
@@ -927,10 +935,11 @@ static int send_srp_login(struct ibmvscsi_host_data *hostdata)
|
|
login->req_buf_fmt = SRP_BUF_FORMAT_DIRECT | SRP_BUF_FORMAT_INDIRECT;
|
|
login->req_buf_fmt = SRP_BUF_FORMAT_DIRECT | SRP_BUF_FORMAT_INDIRECT;
|
|
|
|
|
|
spin_lock_irqsave(hostdata->host->host_lock, flags);
|
|
spin_lock_irqsave(hostdata->host->host_lock, flags);
|
|
- /* Start out with a request limit of 1, since this is negotiated in
|
|
|
|
- * the login request we are just sending
|
|
|
|
|
|
+ /* Start out with a request limit of 0, since this is negotiated in
|
|
|
|
+ * the login request we are just sending and login requests always
|
|
|
|
+ * get sent by the driver regardless of request_limit.
|
|
*/
|
|
*/
|
|
- atomic_set(&hostdata->request_limit, 1);
|
|
|
|
|
|
+ atomic_set(&hostdata->request_limit, 0);
|
|
|
|
|
|
rc = ibmvscsi_send_srp_event(evt_struct, hostdata, init_timeout * 2);
|
|
rc = ibmvscsi_send_srp_event(evt_struct, hostdata, init_timeout * 2);
|
|
spin_unlock_irqrestore(hostdata->host->host_lock, flags);
|
|
spin_unlock_irqrestore(hostdata->host->host_lock, flags);
|