mirror of
https://github.com/SCST-project/scst.git
synced 2026-05-25 07:51:28 +00:00
qla2x00t-32gbit: 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: dd30706e73b7 ("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> [ commit 0b3f3143d473 upstream ]
This commit is contained in:
@@ -1468,6 +1468,8 @@ qla24xx_check_sadb_avail_slot(BSG_JOB_TYPE *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(BSG_JOB_TYPE *bsg_job)
|
||||
@@ -1480,7 +1482,7 @@ qla24xx_sadb_update(BSG_JOB_TYPE *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;
|
||||
@@ -1721,11 +1723,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;
|
||||
@@ -2399,7 +2413,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;
|
||||
}
|
||||
|
||||
@@ -3531,7 +3544,7 @@ int qla_edif_process_els(scsi_qla_host_t *vha, BSG_JOB_TYPE *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;
|
||||
@@ -3626,17 +3639,26 @@ int qla_edif_process_els(scsi_qla_host_t *vha, BSG_JOB_TYPE *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;
|
||||
|
||||
@@ -5505,7 +5505,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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user