mirror of
https://github.com/SCST-project/scst.git
synced 2026-05-25 07:51:28 +00:00
Merge branch 'svn-trunk'
This commit is contained in:
@@ -202,6 +202,7 @@ qla24xx_dump_ram(struct qla_hw_data *ha, uint32_t addr, __be32 *ram,
|
||||
wrt_reg_word(®->mailbox0, MBC_DUMP_RISC_RAM_EXTENDED);
|
||||
wrt_reg_word(®->mailbox1, LSW(addr));
|
||||
wrt_reg_word(®->mailbox8, MSW(addr));
|
||||
wrt_reg_word(®->mailbox10, 0);
|
||||
|
||||
wrt_reg_word(®->mailbox2, MSW(LSD(dump_dma)));
|
||||
wrt_reg_word(®->mailbox3, LSW(LSD(dump_dma)));
|
||||
|
||||
@@ -2127,6 +2127,7 @@ typedef struct {
|
||||
#define CS_COMPLETE_CHKCOND 0x30 /* Error? */
|
||||
#define CS_IOCB_ERROR 0x31 /* Generic error for IOCB request
|
||||
failure */
|
||||
#define CS_REJECT_RECEIVED 0x4E /* Reject received */
|
||||
#define CS_BAD_PAYLOAD 0x80 /* Driver defined */
|
||||
#define CS_UNKNOWN 0x81 /* Driver defined */
|
||||
#define CS_RETRY 0x82 /* Driver defined */
|
||||
@@ -4172,6 +4173,17 @@ struct qla_hw_data {
|
||||
/* Bit 21 of fw_attributes decides the MCTP capabilities */
|
||||
#define IS_MCTP_CAPABLE(ha) (IS_QLA2031(ha) && \
|
||||
((ha)->fw_attributes_ext[0] & BIT_0))
|
||||
#define QLA_ABTS_FW_ENABLED(_ha) ((_ha)->fw_attributes_ext[0] & BIT_14)
|
||||
#define QLA_SRB_NVME_LS(_sp) ((_sp)->type == SRB_NVME_LS)
|
||||
#define QLA_SRB_NVME_CMD(_sp) ((_sp)->type == SRB_NVME_CMD)
|
||||
#define QLA_NVME_IOS(_sp) (QLA_SRB_NVME_CMD(_sp) || QLA_SRB_NVME_LS(_sp))
|
||||
#define QLA_LS_ABTS_WAIT_ENABLED(_sp) \
|
||||
(QLA_SRB_NVME_LS(_sp) && QLA_ABTS_FW_ENABLED(_sp->fcport->vha->hw))
|
||||
#define QLA_CMD_ABTS_WAIT_ENABLED(_sp) \
|
||||
(QLA_SRB_NVME_CMD(_sp) && QLA_ABTS_FW_ENABLED(_sp->fcport->vha->hw))
|
||||
#define QLA_ABTS_WAIT_ENABLED(_sp) \
|
||||
(QLA_NVME_IOS(_sp) && QLA_ABTS_FW_ENABLED(_sp->fcport->vha->hw))
|
||||
|
||||
#define IS_PI_UNINIT_CAPABLE(ha) (IS_QLA83XX(ha) || IS_QLA27XX(ha))
|
||||
#define IS_PI_IPGUARD_CAPABLE(ha) (IS_QLA83XX(ha) || IS_QLA27XX(ha))
|
||||
#define IS_PI_DIFB_DIX0_CAPABLE(ha) (0)
|
||||
|
||||
@@ -290,6 +290,10 @@ qla_dfs_tgt_counters_show(struct seq_file *s, void *unused)
|
||||
core_qla_snd_status, qla_core_ret_sta_ctio, core_qla_free_cmd,
|
||||
num_q_full_sent, num_alloc_iocb_failed, num_term_xchg_sent;
|
||||
u16 i;
|
||||
fc_port_t *fcport = NULL;
|
||||
|
||||
if (qla2x00_chip_is_down(vha))
|
||||
return 0;
|
||||
|
||||
qla_core_sbt_cmd = qpair->tgt_counters.qla_core_sbt_cmd;
|
||||
core_qla_que_buf = qpair->tgt_counters.core_qla_que_buf;
|
||||
@@ -353,6 +357,30 @@ qla_dfs_tgt_counters_show(struct seq_file *s, void *unused)
|
||||
vha->qla_stats.qla_dif_stats.dif_ref_tag_err);
|
||||
seq_printf(s, "DIF App tag err = %d\n",
|
||||
vha->qla_stats.qla_dif_stats.dif_app_tag_err);
|
||||
|
||||
seq_puts(s, "\n");
|
||||
seq_puts(s, "Initiator Error Counters\n");
|
||||
seq_printf(s, "HW Error Count = %14lld\n",
|
||||
vha->hw_err_cnt);
|
||||
seq_printf(s, "Link Down Count = %14lld\n",
|
||||
vha->short_link_down_cnt);
|
||||
seq_printf(s, "Interface Err Count = %14lld\n",
|
||||
vha->interface_err_cnt);
|
||||
seq_printf(s, "Cmd Timeout Count = %14lld\n",
|
||||
vha->cmd_timeout_cnt);
|
||||
seq_printf(s, "Reset Count = %14lld\n",
|
||||
vha->reset_cmd_err_cnt);
|
||||
seq_puts(s, "\n");
|
||||
|
||||
list_for_each_entry(fcport, &vha->vp_fcports, list) {
|
||||
if (!fcport->rport)
|
||||
continue;
|
||||
|
||||
seq_printf(s, "Target Num = %7d Link Down Count = %14lld\n",
|
||||
fcport->rport->number, fcport->tgt_short_link_down_cnt);
|
||||
}
|
||||
seq_puts(s, "\n");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -994,11 +994,18 @@ struct abort_entry_24xx {
|
||||
|
||||
uint32_t handle; /* System handle. */
|
||||
|
||||
__le16 nport_handle; /* N_PORT handle. */
|
||||
/* or Completion status. */
|
||||
union {
|
||||
__le16 nport_handle; /* N_PORT handle. */
|
||||
__le16 comp_status; /* Completion status. */
|
||||
};
|
||||
|
||||
__le16 options; /* Options. */
|
||||
#define AOF_NO_ABTS BIT_0 /* Do not send any ABTS. */
|
||||
#define AOF_NO_RRQ BIT_1 /* Do not send RRQ. */
|
||||
#define AOF_ABTS_TIMEOUT BIT_2 /* Disable logout on ABTS timeout. */
|
||||
#define AOF_ABTS_RTY_CNT BIT_3 /* Use driver specified retry count. */
|
||||
#define AOF_RSP_TIMEOUT BIT_4 /* Use specified response timeout. */
|
||||
|
||||
|
||||
uint32_t handle_to_abort; /* System handle to abort. */
|
||||
|
||||
@@ -1007,8 +1014,20 @@ struct abort_entry_24xx {
|
||||
|
||||
uint8_t port_id[3]; /* PortID of destination port. */
|
||||
uint8_t vp_index;
|
||||
|
||||
uint8_t reserved_2[12];
|
||||
u8 reserved_2[4];
|
||||
union {
|
||||
struct {
|
||||
__le16 abts_rty_cnt;
|
||||
__le16 rsp_timeout;
|
||||
} drv;
|
||||
struct {
|
||||
u8 ba_rjt_vendorUnique;
|
||||
u8 ba_rjt_reasonCodeExpl;
|
||||
u8 ba_rjt_reasonCode;
|
||||
u8 reserved_3;
|
||||
} fw;
|
||||
};
|
||||
u8 reserved_4[4];
|
||||
};
|
||||
|
||||
#define ABTS_RCV_TYPE 0x54
|
||||
|
||||
@@ -181,6 +181,7 @@ extern int ql2xexlogins;
|
||||
extern int ql2xdifbundlinginternalbuffers;
|
||||
extern int ql2xfulldump_on_mpifail;
|
||||
extern int ql2xenforce_iocb_limit;
|
||||
extern int ql2xabts_wait_nvme;
|
||||
|
||||
extern int qla2x00_loop_reset(scsi_qla_host_t *);
|
||||
extern void qla2x00_abort_all_cmds(scsi_qla_host_t *, int);
|
||||
@@ -950,6 +951,11 @@ int qla2x00_set_data_rate(scsi_qla_host_t *vha, uint16_t mode);
|
||||
extern void qla24xx_process_purex_list(struct purex_list *);
|
||||
extern void qla2x00_dfs_create_rport(scsi_qla_host_t *vha, struct fc_port *fp);
|
||||
extern void qla2x00_dfs_remove_rport(scsi_qla_host_t *vha, struct fc_port *fp);
|
||||
extern void qla_wait_nvme_release_cmd_kref(srb_t *sp);
|
||||
extern void qla_nvme_abort_set_option
|
||||
(struct abort_entry_24xx *abt, srb_t *sp);
|
||||
extern void qla_nvme_abort_process_comp_status
|
||||
(struct abort_entry_24xx *abt, srb_t *sp);
|
||||
|
||||
/* nvme.c */
|
||||
void qla_nvme_unregister_remote_port(struct fc_port *fcport);
|
||||
|
||||
@@ -136,6 +136,10 @@ static void qla24xx_abort_iocb_timeout(void *data)
|
||||
static void qla24xx_abort_sp_done(srb_t *sp, int res)
|
||||
{
|
||||
struct srb_iocb *abt = &sp->u.iocb_cmd;
|
||||
srb_t *orig_sp = sp->cmd_sp;
|
||||
|
||||
if (orig_sp)
|
||||
qla_wait_nvme_release_cmd_kref(orig_sp);
|
||||
|
||||
del_timer(&sp->u.iocb_cmd.timer);
|
||||
if (sp->flags & SRB_WAKEUP_ON_COMP)
|
||||
@@ -347,11 +351,11 @@ qla2x00_async_login(struct scsi_qla_host *vha, fc_port_t *fcport,
|
||||
if (NVME_TARGET(vha->hw, fcport))
|
||||
lio->u.logio.flags |= SRB_LOGIN_SKIP_PRLI;
|
||||
|
||||
ql_dbg(ql_dbg_disc, vha, 0x2072,
|
||||
"Async-login - %8phC hdl=%x, loopid=%x portid=%02x%02x%02x "
|
||||
"retries=%d.\n", fcport->port_name, sp->handle, fcport->loop_id,
|
||||
fcport->d_id.b.domain, fcport->d_id.b.area, fcport->d_id.b.al_pa,
|
||||
fcport->login_retry);
|
||||
ql_log(ql_log_warn, vha, 0x2072,
|
||||
"Async-login - %8phC hdl=%x, loopid=%x portid=%02x%02x%02x retries=%d.\n",
|
||||
fcport->port_name, sp->handle, fcport->loop_id,
|
||||
fcport->d_id.b.domain, fcport->d_id.b.area, fcport->d_id.b.al_pa,
|
||||
fcport->login_retry);
|
||||
|
||||
rval = qla2x00_start_sp(sp);
|
||||
if (rval != QLA_SUCCESS) {
|
||||
@@ -3371,8 +3375,7 @@ qla2x00_alloc_fw_dump(scsi_qla_host_t *vha)
|
||||
"Re-Allocated (%d KB) and save firmware dump.\n",
|
||||
dump_size / 1024);
|
||||
} else {
|
||||
if (ha->fw_dump)
|
||||
vfree(ha->fw_dump);
|
||||
vfree(ha->fw_dump);
|
||||
ha->fw_dump = fw_dump;
|
||||
|
||||
ha->fw_dump_len = ha->fw_dump_alloc_len =
|
||||
@@ -7855,8 +7858,7 @@ qla24xx_load_risc_flash(scsi_qla_host_t *vha, uint32_t *srisc_addr,
|
||||
templates = (risc_attr & BIT_9) ? 2 : 1;
|
||||
ql_dbg(ql_dbg_init, vha, 0x0160, "-> templates = %u\n", templates);
|
||||
for (j = 0; j < templates; j++, fwdt++) {
|
||||
if (fwdt->template)
|
||||
vfree(fwdt->template);
|
||||
vfree(fwdt->template);
|
||||
fwdt->template = NULL;
|
||||
fwdt->length = 0;
|
||||
|
||||
@@ -7916,8 +7918,7 @@ qla24xx_load_risc_flash(scsi_qla_host_t *vha, uint32_t *srisc_addr,
|
||||
return QLA_SUCCESS;
|
||||
|
||||
failed:
|
||||
if (fwdt->template)
|
||||
vfree(fwdt->template);
|
||||
vfree(fwdt->template);
|
||||
fwdt->template = NULL;
|
||||
fwdt->length = 0;
|
||||
|
||||
@@ -8113,8 +8114,7 @@ qla24xx_load_risc_blob(scsi_qla_host_t *vha, uint32_t *srisc_addr)
|
||||
templates = (risc_attr & BIT_9) ? 2 : 1;
|
||||
ql_dbg(ql_dbg_init, vha, 0x0170, "-> templates = %u\n", templates);
|
||||
for (j = 0; j < templates; j++, fwdt++) {
|
||||
if (fwdt->template)
|
||||
vfree(fwdt->template);
|
||||
vfree(fwdt->template);
|
||||
fwdt->template = NULL;
|
||||
fwdt->length = 0;
|
||||
|
||||
@@ -8174,8 +8174,7 @@ qla24xx_load_risc_blob(scsi_qla_host_t *vha, uint32_t *srisc_addr)
|
||||
return QLA_SUCCESS;
|
||||
|
||||
failed:
|
||||
if (fwdt->template)
|
||||
vfree(fwdt->template);
|
||||
vfree(fwdt->template);
|
||||
fwdt->template = NULL;
|
||||
fwdt->length = 0;
|
||||
|
||||
|
||||
@@ -2384,6 +2384,8 @@ qla24xx_prli_iocb(srb_t *sp, struct logio_entry_24xx *logio)
|
||||
logio->io_parameter[0] =
|
||||
cpu_to_le32(NVME_PRLI_SP_FIRST_BURST);
|
||||
if (sp->vha->flags.nvme2_enabled) {
|
||||
/* Set service parameter BIT_7 for NVME CONF support */
|
||||
logio->io_parameter[0] |= NVME_PRLI_SP_CONF;
|
||||
/* Set service parameter BIT_8 for SLER support */
|
||||
logio->io_parameter[0] |=
|
||||
cpu_to_le32(NVME_PRLI_SP_SLER);
|
||||
@@ -3589,6 +3591,7 @@ qla24xx_abort_iocb(srb_t *sp, struct abort_entry_24xx *abt_iocb)
|
||||
struct srb_iocb *aio = &sp->u.iocb_cmd;
|
||||
scsi_qla_host_t *vha = sp->vha;
|
||||
struct req_que *req = sp->qpair->req;
|
||||
srb_t *orig_sp = sp->cmd_sp;
|
||||
|
||||
memset(abt_iocb, 0, sizeof(struct abort_entry_24xx));
|
||||
abt_iocb->entry_type = ABORT_IOCB_TYPE;
|
||||
@@ -3605,6 +3608,11 @@ qla24xx_abort_iocb(srb_t *sp, struct abort_entry_24xx *abt_iocb)
|
||||
aio->u.abt.cmd_hndl);
|
||||
abt_iocb->vp_index = vha->vp_idx;
|
||||
abt_iocb->req_que_no = aio->u.abt.req_que_no;
|
||||
|
||||
/* need to pass original sp */
|
||||
if (orig_sp)
|
||||
qla_nvme_abort_set_option(abt_iocb, orig_sp);
|
||||
|
||||
/* Send the command to the firmware */
|
||||
wmb();
|
||||
}
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
*/
|
||||
#include "qla_def.h"
|
||||
#include "qla_target.h"
|
||||
#include "qla_gbl.h"
|
||||
|
||||
#include <linux/delay.h>
|
||||
#include <linux/slab.h>
|
||||
@@ -773,7 +774,7 @@ static void
|
||||
qla27xx_handle_8200_aen(scsi_qla_host_t *vha, uint16_t *mb)
|
||||
{
|
||||
struct qla_hw_data *ha = vha->hw;
|
||||
bool reset_isp_needed = 0;
|
||||
bool reset_isp_needed = false;
|
||||
|
||||
ql_log(ql_log_warn, vha, 0x02f0,
|
||||
"MPI Heartbeat stop. MPI reset is%s needed. "
|
||||
@@ -789,7 +790,7 @@ qla27xx_handle_8200_aen(scsi_qla_host_t *vha, uint16_t *mb)
|
||||
|
||||
if (ql2xfulldump_on_mpifail) {
|
||||
ha->isp_ops->fw_dump(vha);
|
||||
reset_isp_needed = 1;
|
||||
reset_isp_needed = true;
|
||||
}
|
||||
|
||||
ha->isp_ops->mpi_fw_dump(vha, 1);
|
||||
@@ -1454,9 +1455,9 @@ global_port_update:
|
||||
if (ha->flags.npiv_supported && vha->vp_idx != (mb[3] & 0xff))
|
||||
break;
|
||||
|
||||
ql_dbg(ql_dbg_async, vha, 0x5013,
|
||||
"RSCN database changed -- %04x %04x %04x.\n",
|
||||
mb[1], mb[2], mb[3]);
|
||||
ql_log(ql_log_warn, vha, 0x5013,
|
||||
"RSCN database changed -- %04x %04x %04x.\n",
|
||||
mb[1], mb[2], mb[3]);
|
||||
|
||||
rscn_entry = ((mb[1] & 0xff) << 16) | mb[2];
|
||||
host_pid = (vha->d_id.b.domain << 16) | (vha->d_id.b.area << 8)
|
||||
@@ -2226,12 +2227,12 @@ qla24xx_logio_entry(scsi_qla_host_t *vha, struct req_que *req,
|
||||
break;
|
||||
}
|
||||
|
||||
ql_dbg(ql_dbg_async, sp->vha, 0x5037,
|
||||
"Async-%s failed: handle=%x pid=%06x wwpn=%8phC comp_status=%x iop0=%x iop1=%x\n",
|
||||
type, sp->handle, fcport->d_id.b24, fcport->port_name,
|
||||
le16_to_cpu(logio->comp_status),
|
||||
le32_to_cpu(logio->io_parameter[0]),
|
||||
le32_to_cpu(logio->io_parameter[1]));
|
||||
ql_log(ql_log_warn, sp->vha, 0x5037,
|
||||
"Async-%s failed: handle=%x pid=%06x wwpn=%8phC comp_status=%x iop0=%x iop1=%x\n",
|
||||
type, sp->handle, fcport->d_id.b24, fcport->port_name,
|
||||
le16_to_cpu(logio->comp_status),
|
||||
le32_to_cpu(logio->io_parameter[0]),
|
||||
le32_to_cpu(logio->io_parameter[1]));
|
||||
|
||||
logio_done:
|
||||
sp->done(sp, 0);
|
||||
@@ -2405,9 +2406,9 @@ static void qla24xx_nvme_iocb_entry(scsi_qla_host_t *vha, struct req_que *req,
|
||||
tgt_xfer_len = 0;
|
||||
#endif
|
||||
if (fd->transferred_length != tgt_xfer_len) {
|
||||
ql_dbg(ql_dbg_io, fcport->vha, 0x3079,
|
||||
"Dropped frame(s) detected (sent/rcvd=%u/%u).\n",
|
||||
tgt_xfer_len, fd->transferred_length);
|
||||
ql_log(ql_log_warn, fcport->vha, 0x3079,
|
||||
"Dropped frame(s) detected (sent/rcvd=%u/%u).\n",
|
||||
tgt_xfer_len, fd->transferred_length);
|
||||
logit = 1;
|
||||
} else if (le16_to_cpu(comp_status) == CS_DATA_UNDERRUN) {
|
||||
/*
|
||||
@@ -3132,9 +3133,9 @@ qla2x00_status_entry(scsi_qla_host_t *vha, struct rsp_que *rsp, void *pkt)
|
||||
scsi_set_resid(cp, resid);
|
||||
if (scsi_status & SS_RESIDUAL_UNDER) {
|
||||
if (IS_FWI2_CAPABLE(ha) && fw_resid_len != resid_len) {
|
||||
ql_dbg(ql_dbg_io, fcport->vha, 0x301d,
|
||||
"Dropped frame(s) detected (0x%x of 0x%x bytes).\n",
|
||||
resid, scsi_bufflen(cp));
|
||||
ql_log(ql_log_warn, fcport->vha, 0x301d,
|
||||
"Dropped frame(s) detected (0x%x of 0x%x bytes).\n",
|
||||
resid, scsi_bufflen(cp));
|
||||
|
||||
res = DID_ERROR << 16 | lscsi_status;
|
||||
goto check_scsi_status;
|
||||
@@ -3157,9 +3158,9 @@ qla2x00_status_entry(scsi_qla_host_t *vha, struct rsp_que *rsp, void *pkt)
|
||||
* task not completed.
|
||||
*/
|
||||
|
||||
ql_dbg(ql_dbg_io, fcport->vha, 0x301f,
|
||||
"Dropped frame(s) detected (0x%x of 0x%x bytes).\n",
|
||||
resid, scsi_bufflen(cp));
|
||||
ql_log(ql_log_warn, fcport->vha, 0x301f,
|
||||
"Dropped frame(s) detected (0x%x of 0x%x bytes).\n",
|
||||
resid, scsi_bufflen(cp));
|
||||
|
||||
res = DID_ERROR << 16 | lscsi_status;
|
||||
goto check_scsi_status;
|
||||
@@ -3271,10 +3272,8 @@ check_scsi_status:
|
||||
|
||||
out:
|
||||
if (logit)
|
||||
ql_dbg(ql_dbg_io, fcport->vha, 0x3022,
|
||||
"FCP command status: 0x%x-0x%x (0x%x) nexus=%ld:%d:%llu "
|
||||
"portid=%02x%02x%02x oxid=0x%x cdb=%10phN len=0x%x "
|
||||
"rsp_info=0x%x resid=0x%x fw_resid=0x%x sp=%p cp=%p.\n",
|
||||
ql_log(ql_log_warn, fcport->vha, 0x3022,
|
||||
"FCP command status: 0x%x-0x%x (0x%x) nexus=%ld:%d:%llu portid=%02x%02x%02x oxid=0x%x cdb=%10phN len=0x%x rsp_info=0x%x resid=0x%x fw_resid=0x%x sp=%p cp=%p.\n",
|
||||
comp_status, scsi_status, res, vha->host_no,
|
||||
cp->device->id, (u64)cp->device->lun, fcport->d_id.b.domain,
|
||||
fcport->d_id.b.area, fcport->d_id.b.al_pa, ox_id,
|
||||
@@ -3447,6 +3446,7 @@ qla24xx_abort_iocb_entry(scsi_qla_host_t *vha, struct req_que *req,
|
||||
{
|
||||
const char func[] = "ABT_IOCB";
|
||||
srb_t *sp;
|
||||
srb_t *orig_sp = NULL;
|
||||
struct srb_iocb *abt;
|
||||
|
||||
sp = qla2x00_get_sp_from_handle(vha, func, req, pkt);
|
||||
@@ -3454,7 +3454,12 @@ qla24xx_abort_iocb_entry(scsi_qla_host_t *vha, struct req_que *req,
|
||||
return;
|
||||
|
||||
abt = &sp->u.iocb_cmd;
|
||||
abt->u.abt.comp_status = pkt->nport_handle;
|
||||
abt->u.abt.comp_status = le16_to_cpu(pkt->comp_status);
|
||||
orig_sp = sp->cmd_sp;
|
||||
/* Need to pass original sp */
|
||||
if (orig_sp)
|
||||
qla_nvme_abort_process_comp_status(pkt, orig_sp);
|
||||
|
||||
sp->done(sp, 0);
|
||||
}
|
||||
|
||||
|
||||
@@ -3234,6 +3234,8 @@ qla24xx_abort_command(srb_t *sp)
|
||||
abt->vp_index = fcport->vha->vp_idx;
|
||||
|
||||
abt->req_que_no = cpu_to_le16(req->id);
|
||||
/* Need to pass original sp */
|
||||
qla_nvme_abort_set_option(abt, sp);
|
||||
|
||||
rval = qla2x00_issue_iocb(vha, abt, abt_dma, 0);
|
||||
if (rval != QLA_SUCCESS) {
|
||||
@@ -3256,6 +3258,10 @@ qla24xx_abort_command(srb_t *sp)
|
||||
ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1091,
|
||||
"Done %s.\n", __func__);
|
||||
}
|
||||
if (rval == QLA_SUCCESS)
|
||||
qla_nvme_abort_process_comp_status(abt, sp);
|
||||
|
||||
qla_wait_nvme_release_cmd_kref(sp);
|
||||
|
||||
dma_pool_free(ha->s_dma_pool, abt, abt_dma);
|
||||
|
||||
@@ -4276,7 +4282,8 @@ qla2x00_dump_ram(scsi_qla_host_t *vha, dma_addr_t req_dma, uint32_t addr,
|
||||
if (MSW(addr) || IS_FWI2_CAPABLE(vha->hw)) {
|
||||
mcp->mb[0] = MBC_DUMP_RISC_RAM_EXTENDED;
|
||||
mcp->mb[8] = MSW(addr);
|
||||
mcp->out_mb = MBX_8|MBX_0;
|
||||
mcp->mb[10] = 0;
|
||||
mcp->out_mb = MBX_10|MBX_8|MBX_0;
|
||||
} else {
|
||||
mcp->mb[0] = MBC_DUMP_RISC_RAM;
|
||||
mcp->out_mb = MBX_0;
|
||||
|
||||
@@ -258,6 +258,13 @@ static void qla_nvme_abort_work(struct work_struct *work)
|
||||
__func__, (rval != QLA_SUCCESS) ? "Failed to abort" : "Aborted",
|
||||
sp, sp->handle, fcport, rval);
|
||||
|
||||
/*
|
||||
* Returned before decreasing kref so that I/O requests
|
||||
* are waited until ABTS complete. This kref is decreased
|
||||
* at qla24xx_abort_sp_done function.
|
||||
*/
|
||||
if (ql2xabts_wait_nvme && QLA_ABTS_WAIT_ENABLED(sp))
|
||||
return;
|
||||
out:
|
||||
/* kref_get was done before work was schedule. */
|
||||
kref_put(&sp->cmd_kref, sp->put_fn);
|
||||
@@ -297,7 +304,6 @@ static int qla_nvme_ls_req(struct nvme_fc_local_port *lport,
|
||||
struct qla_hw_data *ha;
|
||||
srb_t *sp;
|
||||
|
||||
|
||||
if (!fcport || (fcport && fcport->deleted))
|
||||
return rval;
|
||||
|
||||
@@ -604,6 +610,7 @@ static int qla_nvme_post_cmd(struct nvme_fc_local_port *lport,
|
||||
sp->put_fn = qla_nvme_release_fcp_cmd_kref;
|
||||
sp->qpair = qpair;
|
||||
sp->vha = vha;
|
||||
sp->cmd_sp = sp;
|
||||
nvme = &sp->u.iocb_cmd;
|
||||
nvme->u.nvme.desc = fd;
|
||||
|
||||
@@ -768,6 +775,89 @@ int qla_nvme_register_hba(struct scsi_qla_host *vha)
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
void qla_nvme_abort_set_option(struct abort_entry_24xx *abt, srb_t *orig_sp)
|
||||
{
|
||||
struct qla_hw_data *ha;
|
||||
|
||||
if (!(ql2xabts_wait_nvme && QLA_ABTS_WAIT_ENABLED(orig_sp)))
|
||||
return;
|
||||
|
||||
ha = orig_sp->fcport->vha->hw;
|
||||
|
||||
WARN_ON_ONCE(abt->options & cpu_to_le16(BIT_0));
|
||||
/* Use Driver Specified Retry Count */
|
||||
abt->options |= cpu_to_le16(AOF_ABTS_RTY_CNT);
|
||||
abt->drv.abts_rty_cnt = cpu_to_le16(2);
|
||||
/* Use specified response timeout */
|
||||
abt->options |= cpu_to_le16(AOF_RSP_TIMEOUT);
|
||||
/* set it to 2 * r_a_tov in secs */
|
||||
abt->drv.rsp_timeout = cpu_to_le16(2 * (ha->r_a_tov / 10));
|
||||
}
|
||||
|
||||
void qla_nvme_abort_process_comp_status(struct abort_entry_24xx *abt, srb_t *orig_sp)
|
||||
{
|
||||
u16 comp_status;
|
||||
struct scsi_qla_host *vha;
|
||||
|
||||
if (!(ql2xabts_wait_nvme && QLA_ABTS_WAIT_ENABLED(orig_sp)))
|
||||
return;
|
||||
|
||||
vha = orig_sp->fcport->vha;
|
||||
|
||||
comp_status = le16_to_cpu(abt->comp_status);
|
||||
switch (comp_status) {
|
||||
case CS_RESET: /* reset event aborted */
|
||||
case CS_ABORTED: /* IOCB was cleaned */
|
||||
/* N_Port handle is not currently logged in */
|
||||
case CS_TIMEOUT:
|
||||
/* N_Port handle was logged out while waiting for ABTS to complete */
|
||||
case CS_PORT_UNAVAILABLE:
|
||||
/* Firmware found that the port name changed */
|
||||
case CS_PORT_LOGGED_OUT:
|
||||
/* BA_RJT was received for the ABTS */
|
||||
case CS_PORT_CONFIG_CHG:
|
||||
ql_dbg(ql_dbg_async + ql_dbg_mbx, vha, 0xf09d,
|
||||
"Abort I/O IOCB completed with error, comp_status=%x\n",
|
||||
comp_status);
|
||||
break;
|
||||
|
||||
/* BA_RJT was received for the ABTS */
|
||||
case CS_REJECT_RECEIVED:
|
||||
ql_dbg(ql_dbg_async + ql_dbg_mbx, vha, 0xf09e,
|
||||
"BA_RJT was received for the ABTS rjt_vendorUnique = %u",
|
||||
abt->fw.ba_rjt_vendorUnique);
|
||||
ql_dbg(ql_dbg_async + ql_dbg_mbx, vha, 0xf09e,
|
||||
"ba_rjt_reasonCodeExpl = %u, ba_rjt_reasonCode = %u\n",
|
||||
abt->fw.ba_rjt_reasonCodeExpl, abt->fw.ba_rjt_reasonCode);
|
||||
break;
|
||||
|
||||
case CS_COMPLETE:
|
||||
ql_dbg(ql_dbg_async + ql_dbg_mbx, vha, 0xf09f,
|
||||
"IOCB request is completed successfully comp_status=%x\n",
|
||||
comp_status);
|
||||
break;
|
||||
|
||||
case CS_IOCB_ERROR:
|
||||
ql_dbg(ql_dbg_async + ql_dbg_mbx, vha, 0xf0a0,
|
||||
"IOCB request is failed, comp_status=%x\n", comp_status);
|
||||
break;
|
||||
|
||||
default:
|
||||
ql_dbg(ql_dbg_async + ql_dbg_mbx, vha, 0xf0a1,
|
||||
"Invalid Abort IO IOCB Completion Status %x\n",
|
||||
comp_status);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
inline void qla_wait_nvme_release_cmd_kref(srb_t *orig_sp)
|
||||
{
|
||||
if (!(ql2xabts_wait_nvme && QLA_ABTS_WAIT_ENABLED(orig_sp)))
|
||||
return;
|
||||
kref_put(&orig_sp->cmd_kref, orig_sp->put_fn);
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
void qla_nvme_unregister_remote_port(struct fc_port *fcport)
|
||||
|
||||
@@ -55,7 +55,7 @@ MODULE_PARM_DESC(ql2xfulldump_on_mpifail,
|
||||
int ql2xenforce_iocb_limit = 1;
|
||||
module_param(ql2xenforce_iocb_limit, int, S_IRUGO | S_IWUSR);
|
||||
MODULE_PARM_DESC(ql2xenforce_iocb_limit,
|
||||
"Enforce IOCB throttling, to avoid FW congestion. (default: 0)");
|
||||
"Enforce IOCB throttling, to avoid FW congestion. (default: 1)");
|
||||
|
||||
/*
|
||||
* CT6 CTX allocation cache
|
||||
@@ -345,6 +345,11 @@ MODULE_PARM_DESC(ql2xrdpenable,
|
||||
"Enables RDP responses. "
|
||||
"0 - no RDP responses (default). "
|
||||
"1 - provide RDP responses.");
|
||||
int ql2xabts_wait_nvme = 1;
|
||||
module_param(ql2xabts_wait_nvme, int, 0444);
|
||||
MODULE_PARM_DESC(ql2xabts_wait_nvme,
|
||||
"To wait for ABTS response on I/O timeouts for NVMe. (default: 1)");
|
||||
|
||||
|
||||
static void qla2x00_clear_drv_active(struct qla_hw_data *);
|
||||
static void qla2x00_free_device(scsi_qla_host_t *);
|
||||
@@ -994,7 +999,7 @@ qla2xxx_mqueuecommand(struct Scsi_Host *host, struct scsi_cmnd *cmd,
|
||||
srb_t *sp;
|
||||
int rval;
|
||||
|
||||
rval = rport ? fc_remote_port_chkready(rport) : FC_PORTSTATE_OFFLINE;
|
||||
rval = rport ? fc_remote_port_chkready(rport) : (DID_NO_CONNECT << 16);
|
||||
if (rval) {
|
||||
cmd->result = rval;
|
||||
ql_dbg(ql_dbg_io + ql_dbg_verbose, vha, 0x3076,
|
||||
|
||||
@@ -6,9 +6,9 @@
|
||||
/*
|
||||
* Driver version
|
||||
*/
|
||||
#define QLA2XXX_VERSION "10.02.00.104-k"
|
||||
#define QLA2XXX_VERSION "10.02.00.105-k"
|
||||
|
||||
#define QLA_DRIVER_MAJOR_VER 10
|
||||
#define QLA_DRIVER_MINOR_VER 2
|
||||
#define QLA_DRIVER_PATCH_VER 0
|
||||
#define QLA_DRIVER_BETA_VER 104
|
||||
#define QLA_DRIVER_BETA_VER 105
|
||||
|
||||
Reference in New Issue
Block a user