scsi: qla2xxx: edif: Add retry for ELS passthrough
Relating to EDIF, when sending IKE message, updating key or deleting key,
driver can encounter IOCB queue full. Add additional retries to reduce
higher level recovery.
Link: https://lore.kernel.org/r/20220607044627.19563-8-njavali@marvell.com
Fixes: dd30706e73
("scsi: qla2xxx: edif: Add key update")
Signed-off-by: Quinn Tran <qutran@marvell.com>
Signed-off-by: Nilesh Javali <njavali@marvell.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
This commit is contained in:
parent
cf79716e66
commit
0b3f3143d4
|
@ -1467,6 +1467,8 @@ qla24xx_check_sadb_avail_slot(struct bsg_job *bsg_job, fc_port_t *fcport,
|
|||
|
||||
#define QLA_SA_UPDATE_FLAGS_RX_KEY 0x0
|
||||
#define QLA_SA_UPDATE_FLAGS_TX_KEY 0x2
|
||||
#define EDIF_MSLEEP_INTERVAL 100
|
||||
#define EDIF_RETRY_COUNT 50
|
||||
|
||||
int
|
||||
qla24xx_sadb_update(struct bsg_job *bsg_job)
|
||||
|
@ -1479,7 +1481,7 @@ qla24xx_sadb_update(struct bsg_job *bsg_job)
|
|||
struct edif_list_entry *edif_entry = NULL;
|
||||
int found = 0;
|
||||
int rval = 0;
|
||||
int result = 0;
|
||||
int result = 0, cnt;
|
||||
struct qla_sa_update_frame sa_frame;
|
||||
struct srb_iocb *iocb_cmd;
|
||||
port_id_t portid;
|
||||
|
@ -1720,11 +1722,23 @@ force_rx_delete:
|
|||
sp->done = qla2x00_bsg_job_done;
|
||||
iocb_cmd = &sp->u.iocb_cmd;
|
||||
iocb_cmd->u.sa_update.sa_frame = sa_frame;
|
||||
|
||||
cnt = 0;
|
||||
retry:
|
||||
rval = qla2x00_start_sp(sp);
|
||||
if (rval != QLA_SUCCESS) {
|
||||
switch (rval) {
|
||||
case QLA_SUCCESS:
|
||||
break;
|
||||
case EAGAIN:
|
||||
msleep(EDIF_MSLEEP_INTERVAL);
|
||||
cnt++;
|
||||
if (cnt < EDIF_RETRY_COUNT)
|
||||
goto retry;
|
||||
|
||||
fallthrough;
|
||||
default:
|
||||
ql_log(ql_dbg_edif, vha, 0x70e3,
|
||||
"qla2x00_start_sp failed=%d.\n", rval);
|
||||
"%s qla2x00_start_sp failed=%d.\n",
|
||||
__func__, rval);
|
||||
|
||||
qla2x00_rel_sp(sp);
|
||||
rval = -EIO;
|
||||
|
@ -2398,7 +2412,6 @@ qla24xx_issue_sa_replace_iocb(scsi_qla_host_t *vha, struct qla_work_evt *e)
|
|||
rval = qla2x00_start_sp(sp);
|
||||
|
||||
if (rval != QLA_SUCCESS) {
|
||||
rval = QLA_FUNCTION_FAILED;
|
||||
goto done_free_sp;
|
||||
}
|
||||
|
||||
|
@ -3530,7 +3543,7 @@ int qla_edif_process_els(scsi_qla_host_t *vha, struct bsg_job *bsg_job)
|
|||
fc_port_t *fcport = NULL;
|
||||
struct qla_hw_data *ha = vha->hw;
|
||||
srb_t *sp;
|
||||
int rval = (DID_ERROR << 16);
|
||||
int rval = (DID_ERROR << 16), cnt;
|
||||
port_id_t d_id;
|
||||
struct qla_bsg_auth_els_request *p =
|
||||
(struct qla_bsg_auth_els_request *)bsg_job->request;
|
||||
|
@ -3625,17 +3638,26 @@ int qla_edif_process_els(scsi_qla_host_t *vha, struct bsg_job *bsg_job)
|
|||
sp->free = qla2x00_bsg_sp_free;
|
||||
sp->done = qla2x00_bsg_job_done;
|
||||
|
||||
cnt = 0;
|
||||
retry:
|
||||
rval = qla2x00_start_sp(sp);
|
||||
|
||||
ql_dbg(ql_dbg_edif, vha, 0x700a,
|
||||
"%s %s %8phN xchg %x ctlflag %x hdl %x reqlen %xh bsg ptr %p\n",
|
||||
__func__, sc_to_str(p->e.sub_cmd), fcport->port_name,
|
||||
p->e.extra_rx_xchg_address, p->e.extra_control_flags,
|
||||
sp->handle, sp->remap.req.len, bsg_job);
|
||||
|
||||
if (rval != QLA_SUCCESS) {
|
||||
switch (rval) {
|
||||
case QLA_SUCCESS:
|
||||
ql_dbg(ql_dbg_edif, vha, 0x700a,
|
||||
"%s %s %8phN xchg %x ctlflag %x hdl %x reqlen %xh bsg ptr %p\n",
|
||||
__func__, sc_to_str(p->e.sub_cmd), fcport->port_name,
|
||||
p->e.extra_rx_xchg_address, p->e.extra_control_flags,
|
||||
sp->handle, sp->remap.req.len, bsg_job);
|
||||
break;
|
||||
case EAGAIN:
|
||||
msleep(EDIF_MSLEEP_INTERVAL);
|
||||
cnt++;
|
||||
if (cnt < EDIF_RETRY_COUNT)
|
||||
goto retry;
|
||||
fallthrough;
|
||||
default:
|
||||
ql_log(ql_log_warn, vha, 0x700e,
|
||||
"qla2x00_start_sp failed = %d\n", rval);
|
||||
"%s qla2x00_start_sp failed = %d\n", __func__, rval);
|
||||
SET_DID_STATUS(bsg_reply->result, DID_IMM_RETRY);
|
||||
rval = -EIO;
|
||||
goto done_free_remap_rsp;
|
||||
|
|
|
@ -5472,7 +5472,7 @@ qla2x00_do_work(struct scsi_qla_host *vha)
|
|||
e->u.fcport.fcport, false);
|
||||
break;
|
||||
case QLA_EVT_SA_REPLACE:
|
||||
qla24xx_issue_sa_replace_iocb(vha, e);
|
||||
rc = qla24xx_issue_sa_replace_iocb(vha, e);
|
||||
break;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue