mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-29 13:53:33 +00:00
Merge patch series "qla2xxx misc. bug fixes"
Nilesh Javali <njavali@marvell.com> says: Please apply the qla2xxx driver miscellaneous bug fixes to the scsi tree at your earliest convenience. Link: https://lore.kernel.org/r/20240227164127.36465-1-njavali@marvell.com Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
This commit is contained in:
commit
48c0b76923
9 changed files with 138 additions and 95 deletions
|
@ -2741,7 +2741,13 @@ qla2x00_dev_loss_tmo_callbk(struct fc_rport *rport)
|
|||
return;
|
||||
|
||||
if (unlikely(pci_channel_offline(fcport->vha->hw->pdev))) {
|
||||
qla2x00_abort_all_cmds(fcport->vha, DID_NO_CONNECT << 16);
|
||||
/* Will wait for wind down of adapter */
|
||||
ql_dbg(ql_dbg_aer, fcport->vha, 0x900c,
|
||||
"%s pci offline detected (id %06x)\n", __func__,
|
||||
fcport->d_id.b24);
|
||||
qla_pci_set_eeh_busy(fcport->vha);
|
||||
qla2x00_eh_wait_for_pending_commands(fcport->vha, fcport->d_id.b24,
|
||||
0, WAIT_TARGET);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
@ -2763,7 +2769,11 @@ qla2x00_terminate_rport_io(struct fc_rport *rport)
|
|||
vha = fcport->vha;
|
||||
|
||||
if (unlikely(pci_channel_offline(fcport->vha->hw->pdev))) {
|
||||
qla2x00_abort_all_cmds(fcport->vha, DID_NO_CONNECT << 16);
|
||||
/* Will wait for wind down of adapter */
|
||||
ql_dbg(ql_dbg_aer, fcport->vha, 0x900b,
|
||||
"%s pci offline detected (id %06x)\n", __func__,
|
||||
fcport->d_id.b24);
|
||||
qla_pci_set_eeh_busy(vha);
|
||||
qla2x00_eh_wait_for_pending_commands(fcport->vha, fcport->d_id.b24,
|
||||
0, WAIT_TARGET);
|
||||
return;
|
||||
|
|
|
@ -82,7 +82,7 @@ typedef union {
|
|||
#include "qla_nvme.h"
|
||||
#define QLA2XXX_DRIVER_NAME "qla2xxx"
|
||||
#define QLA2XXX_APIDEV "ql2xapidev"
|
||||
#define QLA2XXX_MANUFACTURER "Marvell Semiconductor, Inc."
|
||||
#define QLA2XXX_MANUFACTURER "Marvell"
|
||||
|
||||
/*
|
||||
* We have MAILBOX_REGISTER_COUNT sized arrays in a few places,
|
||||
|
|
|
@ -44,7 +44,7 @@ extern int qla2x00_fabric_login(scsi_qla_host_t *, fc_port_t *, uint16_t *);
|
|||
extern int qla2x00_local_device_login(scsi_qla_host_t *, fc_port_t *);
|
||||
|
||||
extern int qla24xx_els_dcmd_iocb(scsi_qla_host_t *, int, port_id_t);
|
||||
extern int qla24xx_els_dcmd2_iocb(scsi_qla_host_t *, int, fc_port_t *, bool);
|
||||
extern int qla24xx_els_dcmd2_iocb(scsi_qla_host_t *, int, fc_port_t *);
|
||||
extern void qla2x00_els_dcmd2_free(scsi_qla_host_t *vha,
|
||||
struct els_plogi *els_plogi);
|
||||
|
||||
|
|
|
@ -1193,8 +1193,12 @@ int qla24xx_async_gnl(struct scsi_qla_host *vha, fc_port_t *fcport)
|
|||
return rval;
|
||||
|
||||
done_free_sp:
|
||||
/* ref: INIT */
|
||||
kref_put(&sp->cmd_kref, qla2x00_sp_release);
|
||||
/*
|
||||
* use qla24xx_async_gnl_sp_done to purge all pending gnl request.
|
||||
* kref_put is call behind the scene.
|
||||
*/
|
||||
sp->u.iocb_cmd.u.mbx.in_mb[0] = MBS_COMMAND_ERROR;
|
||||
qla24xx_async_gnl_sp_done(sp, QLA_COMMAND_ERROR);
|
||||
fcport->flags &= ~(FCF_ASYNC_SENT);
|
||||
done:
|
||||
fcport->flags &= ~(FCF_ASYNC_ACTIVE);
|
||||
|
@ -2665,6 +2669,40 @@ qla83xx_nic_core_fw_load(scsi_qla_host_t *vha)
|
|||
return rval;
|
||||
}
|
||||
|
||||
static void qla_enable_fce_trace(scsi_qla_host_t *vha)
|
||||
{
|
||||
int rval;
|
||||
struct qla_hw_data *ha = vha->hw;
|
||||
|
||||
if (ha->fce) {
|
||||
ha->flags.fce_enabled = 1;
|
||||
memset(ha->fce, 0, fce_calc_size(ha->fce_bufs));
|
||||
rval = qla2x00_enable_fce_trace(vha,
|
||||
ha->fce_dma, ha->fce_bufs, ha->fce_mb, &ha->fce_bufs);
|
||||
|
||||
if (rval) {
|
||||
ql_log(ql_log_warn, vha, 0x8033,
|
||||
"Unable to reinitialize FCE (%d).\n", rval);
|
||||
ha->flags.fce_enabled = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void qla_enable_eft_trace(scsi_qla_host_t *vha)
|
||||
{
|
||||
int rval;
|
||||
struct qla_hw_data *ha = vha->hw;
|
||||
|
||||
if (ha->eft) {
|
||||
memset(ha->eft, 0, EFT_SIZE);
|
||||
rval = qla2x00_enable_eft_trace(vha, ha->eft_dma, EFT_NUM_BUFFERS);
|
||||
|
||||
if (rval) {
|
||||
ql_log(ql_log_warn, vha, 0x8034,
|
||||
"Unable to reinitialize EFT (%d).\n", rval);
|
||||
}
|
||||
}
|
||||
}
|
||||
/*
|
||||
* qla2x00_initialize_adapter
|
||||
* Initialize board.
|
||||
|
@ -3668,9 +3706,8 @@ qla24xx_chip_diag(scsi_qla_host_t *vha)
|
|||
}
|
||||
|
||||
static void
|
||||
qla2x00_init_fce_trace(scsi_qla_host_t *vha)
|
||||
qla2x00_alloc_fce_trace(scsi_qla_host_t *vha)
|
||||
{
|
||||
int rval;
|
||||
dma_addr_t tc_dma;
|
||||
void *tc;
|
||||
struct qla_hw_data *ha = vha->hw;
|
||||
|
@ -3699,27 +3736,17 @@ qla2x00_init_fce_trace(scsi_qla_host_t *vha)
|
|||
return;
|
||||
}
|
||||
|
||||
rval = qla2x00_enable_fce_trace(vha, tc_dma, FCE_NUM_BUFFERS,
|
||||
ha->fce_mb, &ha->fce_bufs);
|
||||
if (rval) {
|
||||
ql_log(ql_log_warn, vha, 0x00bf,
|
||||
"Unable to initialize FCE (%d).\n", rval);
|
||||
dma_free_coherent(&ha->pdev->dev, FCE_SIZE, tc, tc_dma);
|
||||
return;
|
||||
}
|
||||
|
||||
ql_dbg(ql_dbg_init, vha, 0x00c0,
|
||||
"Allocated (%d KB) for FCE...\n", FCE_SIZE / 1024);
|
||||
|
||||
ha->flags.fce_enabled = 1;
|
||||
ha->fce_dma = tc_dma;
|
||||
ha->fce = tc;
|
||||
ha->fce_bufs = FCE_NUM_BUFFERS;
|
||||
}
|
||||
|
||||
static void
|
||||
qla2x00_init_eft_trace(scsi_qla_host_t *vha)
|
||||
qla2x00_alloc_eft_trace(scsi_qla_host_t *vha)
|
||||
{
|
||||
int rval;
|
||||
dma_addr_t tc_dma;
|
||||
void *tc;
|
||||
struct qla_hw_data *ha = vha->hw;
|
||||
|
@ -3744,14 +3771,6 @@ qla2x00_init_eft_trace(scsi_qla_host_t *vha)
|
|||
return;
|
||||
}
|
||||
|
||||
rval = qla2x00_enable_eft_trace(vha, tc_dma, EFT_NUM_BUFFERS);
|
||||
if (rval) {
|
||||
ql_log(ql_log_warn, vha, 0x00c2,
|
||||
"Unable to initialize EFT (%d).\n", rval);
|
||||
dma_free_coherent(&ha->pdev->dev, EFT_SIZE, tc, tc_dma);
|
||||
return;
|
||||
}
|
||||
|
||||
ql_dbg(ql_dbg_init, vha, 0x00c3,
|
||||
"Allocated (%d KB) EFT ...\n", EFT_SIZE / 1024);
|
||||
|
||||
|
@ -3759,13 +3778,6 @@ qla2x00_init_eft_trace(scsi_qla_host_t *vha)
|
|||
ha->eft = tc;
|
||||
}
|
||||
|
||||
static void
|
||||
qla2x00_alloc_offload_mem(scsi_qla_host_t *vha)
|
||||
{
|
||||
qla2x00_init_fce_trace(vha);
|
||||
qla2x00_init_eft_trace(vha);
|
||||
}
|
||||
|
||||
void
|
||||
qla2x00_alloc_fw_dump(scsi_qla_host_t *vha)
|
||||
{
|
||||
|
@ -3820,10 +3832,10 @@ qla2x00_alloc_fw_dump(scsi_qla_host_t *vha)
|
|||
if (ha->tgt.atio_ring)
|
||||
mq_size += ha->tgt.atio_q_length * sizeof(request_t);
|
||||
|
||||
qla2x00_init_fce_trace(vha);
|
||||
qla2x00_alloc_fce_trace(vha);
|
||||
if (ha->fce)
|
||||
fce_size = sizeof(struct qla2xxx_fce_chain) + FCE_SIZE;
|
||||
qla2x00_init_eft_trace(vha);
|
||||
qla2x00_alloc_eft_trace(vha);
|
||||
if (ha->eft)
|
||||
eft_size = EFT_SIZE;
|
||||
}
|
||||
|
@ -4253,7 +4265,6 @@ qla2x00_setup_chip(scsi_qla_host_t *vha)
|
|||
struct qla_hw_data *ha = vha->hw;
|
||||
struct device_reg_2xxx __iomem *reg = &ha->iobase->isp;
|
||||
unsigned long flags;
|
||||
uint16_t fw_major_version;
|
||||
int done_once = 0;
|
||||
|
||||
if (IS_P3P_TYPE(ha)) {
|
||||
|
@ -4320,7 +4331,6 @@ qla2x00_setup_chip(scsi_qla_host_t *vha)
|
|||
goto failed;
|
||||
|
||||
enable_82xx_npiv:
|
||||
fw_major_version = ha->fw_major_version;
|
||||
if (IS_P3P_TYPE(ha))
|
||||
qla82xx_check_md_needed(vha);
|
||||
else
|
||||
|
@ -4349,12 +4359,11 @@ qla2x00_setup_chip(scsi_qla_host_t *vha)
|
|||
if (rval != QLA_SUCCESS)
|
||||
goto failed;
|
||||
|
||||
if (!fw_major_version && !(IS_P3P_TYPE(ha)))
|
||||
qla2x00_alloc_offload_mem(vha);
|
||||
|
||||
if (ql2xallocfwdump && !(IS_P3P_TYPE(ha)))
|
||||
qla2x00_alloc_fw_dump(vha);
|
||||
|
||||
qla_enable_fce_trace(vha);
|
||||
qla_enable_eft_trace(vha);
|
||||
} else {
|
||||
goto failed;
|
||||
}
|
||||
|
@ -7487,12 +7496,12 @@ qla2x00_abort_isp_cleanup(scsi_qla_host_t *vha)
|
|||
int
|
||||
qla2x00_abort_isp(scsi_qla_host_t *vha)
|
||||
{
|
||||
int rval;
|
||||
uint8_t status = 0;
|
||||
struct qla_hw_data *ha = vha->hw;
|
||||
struct scsi_qla_host *vp, *tvp;
|
||||
struct req_que *req = ha->req_q_map[0];
|
||||
unsigned long flags;
|
||||
fc_port_t *fcport;
|
||||
|
||||
if (vha->flags.online) {
|
||||
qla2x00_abort_isp_cleanup(vha);
|
||||
|
@ -7561,6 +7570,15 @@ qla2x00_abort_isp(scsi_qla_host_t *vha)
|
|||
"ISP Abort - ISP reg disconnect post nvmram config, exiting.\n");
|
||||
return status;
|
||||
}
|
||||
|
||||
/* User may have updated [fcp|nvme] prefer in flash */
|
||||
list_for_each_entry(fcport, &vha->vp_fcports, list) {
|
||||
if (NVME_PRIORITY(ha, fcport))
|
||||
fcport->do_prli_nvme = 1;
|
||||
else
|
||||
fcport->do_prli_nvme = 0;
|
||||
}
|
||||
|
||||
if (!qla2x00_restart_isp(vha)) {
|
||||
clear_bit(RESET_MARKER_NEEDED, &vha->dpc_flags);
|
||||
|
||||
|
@ -7581,31 +7599,7 @@ qla2x00_abort_isp(scsi_qla_host_t *vha)
|
|||
|
||||
if (IS_QLA81XX(ha) || IS_QLA8031(ha))
|
||||
qla2x00_get_fw_version(vha);
|
||||
if (ha->fce) {
|
||||
ha->flags.fce_enabled = 1;
|
||||
memset(ha->fce, 0,
|
||||
fce_calc_size(ha->fce_bufs));
|
||||
rval = qla2x00_enable_fce_trace(vha,
|
||||
ha->fce_dma, ha->fce_bufs, ha->fce_mb,
|
||||
&ha->fce_bufs);
|
||||
if (rval) {
|
||||
ql_log(ql_log_warn, vha, 0x8033,
|
||||
"Unable to reinitialize FCE "
|
||||
"(%d).\n", rval);
|
||||
ha->flags.fce_enabled = 0;
|
||||
}
|
||||
}
|
||||
|
||||
if (ha->eft) {
|
||||
memset(ha->eft, 0, EFT_SIZE);
|
||||
rval = qla2x00_enable_eft_trace(vha,
|
||||
ha->eft_dma, EFT_NUM_BUFFERS);
|
||||
if (rval) {
|
||||
ql_log(ql_log_warn, vha, 0x8034,
|
||||
"Unable to reinitialize EFT "
|
||||
"(%d).\n", rval);
|
||||
}
|
||||
}
|
||||
} else { /* failed the ISP abort */
|
||||
vha->flags.online = 1;
|
||||
if (test_bit(ISP_ABORT_RETRY, &vha->dpc_flags)) {
|
||||
|
@ -7655,6 +7649,14 @@ qla2x00_abort_isp(scsi_qla_host_t *vha)
|
|||
atomic_inc(&vp->vref_count);
|
||||
spin_unlock_irqrestore(&ha->vport_slock, flags);
|
||||
|
||||
/* User may have updated [fcp|nvme] prefer in flash */
|
||||
list_for_each_entry(fcport, &vp->vp_fcports, list) {
|
||||
if (NVME_PRIORITY(ha, fcport))
|
||||
fcport->do_prli_nvme = 1;
|
||||
else
|
||||
fcport->do_prli_nvme = 0;
|
||||
}
|
||||
|
||||
qla2x00_vp_abort_isp(vp);
|
||||
|
||||
spin_lock_irqsave(&ha->vport_slock, flags);
|
||||
|
|
|
@ -2587,6 +2587,33 @@ void
|
|||
qla2x00_sp_release(struct kref *kref)
|
||||
{
|
||||
struct srb *sp = container_of(kref, struct srb, cmd_kref);
|
||||
struct scsi_qla_host *vha = sp->vha;
|
||||
|
||||
switch (sp->type) {
|
||||
case SRB_CT_PTHRU_CMD:
|
||||
/* GPSC & GFPNID use fcport->ct_desc.ct_sns for both req & rsp */
|
||||
if (sp->u.iocb_cmd.u.ctarg.req &&
|
||||
(!sp->fcport ||
|
||||
sp->u.iocb_cmd.u.ctarg.req != sp->fcport->ct_desc.ct_sns)) {
|
||||
dma_free_coherent(&vha->hw->pdev->dev,
|
||||
sp->u.iocb_cmd.u.ctarg.req_allocated_size,
|
||||
sp->u.iocb_cmd.u.ctarg.req,
|
||||
sp->u.iocb_cmd.u.ctarg.req_dma);
|
||||
sp->u.iocb_cmd.u.ctarg.req = NULL;
|
||||
}
|
||||
if (sp->u.iocb_cmd.u.ctarg.rsp &&
|
||||
(!sp->fcport ||
|
||||
sp->u.iocb_cmd.u.ctarg.rsp != sp->fcport->ct_desc.ct_sns)) {
|
||||
dma_free_coherent(&vha->hw->pdev->dev,
|
||||
sp->u.iocb_cmd.u.ctarg.rsp_allocated_size,
|
||||
sp->u.iocb_cmd.u.ctarg.rsp,
|
||||
sp->u.iocb_cmd.u.ctarg.rsp_dma);
|
||||
sp->u.iocb_cmd.u.ctarg.rsp = NULL;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
sp->free(sp);
|
||||
}
|
||||
|
@ -2610,7 +2637,8 @@ static void qla2x00_els_dcmd_sp_free(srb_t *sp)
|
|||
{
|
||||
struct srb_iocb *elsio = &sp->u.iocb_cmd;
|
||||
|
||||
kfree(sp->fcport);
|
||||
if (sp->fcport)
|
||||
qla2x00_free_fcport(sp->fcport);
|
||||
|
||||
if (elsio->u.els_logo.els_logo_pyld)
|
||||
dma_free_coherent(&sp->vha->hw->pdev->dev, DMA_POOL_SIZE,
|
||||
|
@ -2692,7 +2720,7 @@ qla24xx_els_dcmd_iocb(scsi_qla_host_t *vha, int els_opcode,
|
|||
*/
|
||||
sp = qla2x00_get_sp(vha, fcport, GFP_KERNEL);
|
||||
if (!sp) {
|
||||
kfree(fcport);
|
||||
qla2x00_free_fcport(fcport);
|
||||
ql_log(ql_log_info, vha, 0x70e6,
|
||||
"SRB allocation failed\n");
|
||||
return -ENOMEM;
|
||||
|
@ -2723,6 +2751,7 @@ qla24xx_els_dcmd_iocb(scsi_qla_host_t *vha, int els_opcode,
|
|||
if (!elsio->u.els_logo.els_logo_pyld) {
|
||||
/* ref: INIT */
|
||||
kref_put(&sp->cmd_kref, qla2x00_sp_release);
|
||||
qla2x00_free_fcport(fcport);
|
||||
return QLA_FUNCTION_FAILED;
|
||||
}
|
||||
|
||||
|
@ -2747,6 +2776,7 @@ qla24xx_els_dcmd_iocb(scsi_qla_host_t *vha, int els_opcode,
|
|||
if (rval != QLA_SUCCESS) {
|
||||
/* ref: INIT */
|
||||
kref_put(&sp->cmd_kref, qla2x00_sp_release);
|
||||
qla2x00_free_fcport(fcport);
|
||||
return QLA_FUNCTION_FAILED;
|
||||
}
|
||||
|
||||
|
@ -3012,7 +3042,7 @@ static void qla2x00_els_dcmd2_sp_done(srb_t *sp, int res)
|
|||
|
||||
int
|
||||
qla24xx_els_dcmd2_iocb(scsi_qla_host_t *vha, int els_opcode,
|
||||
fc_port_t *fcport, bool wait)
|
||||
fc_port_t *fcport)
|
||||
{
|
||||
srb_t *sp;
|
||||
struct srb_iocb *elsio = NULL;
|
||||
|
@ -3027,8 +3057,7 @@ qla24xx_els_dcmd2_iocb(scsi_qla_host_t *vha, int els_opcode,
|
|||
if (!sp) {
|
||||
ql_log(ql_log_info, vha, 0x70e6,
|
||||
"SRB allocation failed\n");
|
||||
fcport->flags &= ~FCF_ASYNC_ACTIVE;
|
||||
return -ENOMEM;
|
||||
goto done;
|
||||
}
|
||||
|
||||
fcport->flags |= FCF_ASYNC_SENT;
|
||||
|
@ -3037,9 +3066,6 @@ qla24xx_els_dcmd2_iocb(scsi_qla_host_t *vha, int els_opcode,
|
|||
ql_dbg(ql_dbg_io, vha, 0x3073,
|
||||
"%s Enter: PLOGI portid=%06x\n", __func__, fcport->d_id.b24);
|
||||
|
||||
if (wait)
|
||||
sp->flags = SRB_WAKEUP_ON_COMP;
|
||||
|
||||
sp->type = SRB_ELS_DCMD;
|
||||
sp->name = "ELS_DCMD";
|
||||
sp->fcport = fcport;
|
||||
|
@ -3055,7 +3081,7 @@ qla24xx_els_dcmd2_iocb(scsi_qla_host_t *vha, int els_opcode,
|
|||
|
||||
if (!elsio->u.els_plogi.els_plogi_pyld) {
|
||||
rval = QLA_FUNCTION_FAILED;
|
||||
goto out;
|
||||
goto done_free_sp;
|
||||
}
|
||||
|
||||
resp_ptr = elsio->u.els_plogi.els_resp_pyld =
|
||||
|
@ -3064,7 +3090,7 @@ qla24xx_els_dcmd2_iocb(scsi_qla_host_t *vha, int els_opcode,
|
|||
|
||||
if (!elsio->u.els_plogi.els_resp_pyld) {
|
||||
rval = QLA_FUNCTION_FAILED;
|
||||
goto out;
|
||||
goto done_free_sp;
|
||||
}
|
||||
|
||||
ql_dbg(ql_dbg_io, vha, 0x3073, "PLOGI %p %p\n", ptr, resp_ptr);
|
||||
|
@ -3080,7 +3106,6 @@ qla24xx_els_dcmd2_iocb(scsi_qla_host_t *vha, int els_opcode,
|
|||
|
||||
if (els_opcode == ELS_DCMD_PLOGI && DBELL_ACTIVE(vha)) {
|
||||
struct fc_els_flogi *p = ptr;
|
||||
|
||||
p->fl_csp.sp_features |= cpu_to_be16(FC_SP_FT_SEC);
|
||||
}
|
||||
|
||||
|
@ -3089,10 +3114,11 @@ qla24xx_els_dcmd2_iocb(scsi_qla_host_t *vha, int els_opcode,
|
|||
(uint8_t *)elsio->u.els_plogi.els_plogi_pyld,
|
||||
sizeof(*elsio->u.els_plogi.els_plogi_pyld));
|
||||
|
||||
init_completion(&elsio->u.els_plogi.comp);
|
||||
rval = qla2x00_start_sp(sp);
|
||||
if (rval != QLA_SUCCESS) {
|
||||
rval = QLA_FUNCTION_FAILED;
|
||||
fcport->flags |= FCF_LOGIN_NEEDED;
|
||||
set_bit(RELOGIN_NEEDED, &vha->dpc_flags);
|
||||
goto done_free_sp;
|
||||
} else {
|
||||
ql_dbg(ql_dbg_disc, vha, 0x3074,
|
||||
"%s PLOGI sent, hdl=%x, loopid=%x, to port_id %06x from port_id %06x\n",
|
||||
|
@ -3100,21 +3126,15 @@ qla24xx_els_dcmd2_iocb(scsi_qla_host_t *vha, int els_opcode,
|
|||
fcport->d_id.b24, vha->d_id.b24);
|
||||
}
|
||||
|
||||
if (wait) {
|
||||
wait_for_completion(&elsio->u.els_plogi.comp);
|
||||
return rval;
|
||||
|
||||
if (elsio->u.els_plogi.comp_status != CS_COMPLETE)
|
||||
rval = QLA_FUNCTION_FAILED;
|
||||
} else {
|
||||
goto done;
|
||||
}
|
||||
|
||||
out:
|
||||
fcport->flags &= ~(FCF_ASYNC_SENT | FCF_ASYNC_ACTIVE);
|
||||
done_free_sp:
|
||||
qla2x00_els_dcmd2_free(vha, &elsio->u.els_plogi);
|
||||
/* ref: INIT */
|
||||
kref_put(&sp->cmd_kref, qla2x00_sp_release);
|
||||
done:
|
||||
fcport->flags &= ~(FCF_ASYNC_SENT | FCF_ASYNC_ACTIVE);
|
||||
qla2x00_set_fcport_disc_state(fcport, DSC_DELETED);
|
||||
return rval;
|
||||
}
|
||||
|
||||
|
@ -3918,7 +3938,7 @@ qla2x00_start_sp(srb_t *sp)
|
|||
return -EAGAIN;
|
||||
}
|
||||
|
||||
pkt = __qla2x00_alloc_iocbs(sp->qpair, sp);
|
||||
pkt = qla2x00_alloc_iocbs_ready(sp->qpair, sp);
|
||||
if (!pkt) {
|
||||
rval = -EAGAIN;
|
||||
ql_log(ql_log_warn, vha, 0x700c,
|
||||
|
|
|
@ -194,7 +194,7 @@ qla2x00_mailbox_command(scsi_qla_host_t *vha, mbx_cmd_t *mcp)
|
|||
if (ha->flags.purge_mbox || chip_reset != ha->chip_reset ||
|
||||
ha->flags.eeh_busy) {
|
||||
ql_log(ql_log_warn, vha, 0xd035,
|
||||
"Error detected: purge[%d] eeh[%d] cmd=0x%x, Exiting.\n",
|
||||
"Purge mbox: purge[%d] eeh[%d] cmd=0x%x, Exiting.\n",
|
||||
ha->flags.purge_mbox, ha->flags.eeh_busy, mcp->mb[0]);
|
||||
rval = QLA_ABORTED;
|
||||
goto premature_exit;
|
||||
|
|
|
@ -4602,6 +4602,7 @@ qla2x00_mem_alloc(struct qla_hw_data *ha, uint16_t req_len, uint16_t rsp_len,
|
|||
ha->init_cb_dma = 0;
|
||||
fail_free_vp_map:
|
||||
kfree(ha->vp_map);
|
||||
ha->vp_map = NULL;
|
||||
fail:
|
||||
ql_log(ql_log_fatal, NULL, 0x0030,
|
||||
"Memory allocation failure.\n");
|
||||
|
@ -5583,7 +5584,7 @@ qla2x00_do_work(struct scsi_qla_host *vha)
|
|||
break;
|
||||
case QLA_EVT_ELS_PLOGI:
|
||||
qla24xx_els_dcmd2_iocb(vha, ELS_DCMD_PLOGI,
|
||||
e->u.fcport.fcport, false);
|
||||
e->u.fcport.fcport);
|
||||
break;
|
||||
case QLA_EVT_SA_REPLACE:
|
||||
rc = qla24xx_issue_sa_replace_iocb(vha, e);
|
||||
|
|
|
@ -1062,6 +1062,16 @@ void qlt_free_session_done(struct work_struct *work)
|
|||
"%s: sess %p logout completed\n", __func__, sess);
|
||||
}
|
||||
|
||||
/* check for any straggling io left behind */
|
||||
if (!(sess->flags & FCF_FCP2_DEVICE) &&
|
||||
qla2x00_eh_wait_for_pending_commands(sess->vha, sess->d_id.b24, 0, WAIT_TARGET)) {
|
||||
ql_log(ql_log_warn, vha, 0x3027,
|
||||
"IO not return. Resetting.\n");
|
||||
set_bit(ISP_ABORT_NEEDED, &vha->dpc_flags);
|
||||
qla2xxx_wake_dpc(vha);
|
||||
qla2x00_wait_for_chip_reset(vha);
|
||||
}
|
||||
|
||||
if (sess->logo_ack_needed) {
|
||||
sess->logo_ack_needed = 0;
|
||||
qla24xx_async_notify_ack(vha, sess,
|
||||
|
|
|
@ -6,9 +6,9 @@
|
|||
/*
|
||||
* Driver version
|
||||
*/
|
||||
#define QLA2XXX_VERSION "10.02.09.100-k"
|
||||
#define QLA2XXX_VERSION "10.02.09.200-k"
|
||||
|
||||
#define QLA_DRIVER_MAJOR_VER 10
|
||||
#define QLA_DRIVER_MINOR_VER 2
|
||||
#define QLA_DRIVER_PATCH_VER 9
|
||||
#define QLA_DRIVER_BETA_VER 100
|
||||
#define QLA_DRIVER_BETA_VER 200
|
||||
|
|
Loading…
Reference in a new issue