mirror of
https://github.com/SCST-project/scst.git
synced 2026-07-25 01:23:14 +00:00
Merge branch 'svn-trunk'
This commit is contained in:
@@ -1008,7 +1008,7 @@ static struct isert_device *isert_device_create(struct ib_device *ib_dev)
|
||||
}
|
||||
|
||||
pd = ib_alloc_pd(ib_dev, 0);
|
||||
if (unlikely(IS_ERR(pd))) {
|
||||
if (IS_ERR(pd)) {
|
||||
err = PTR_ERR(pd);
|
||||
PRINT_ERROR("Failed to alloc iser dev pd, err:%d", err);
|
||||
goto fail_pd;
|
||||
@@ -1016,7 +1016,7 @@ static struct isert_device *isert_device_create(struct ib_device *ib_dev)
|
||||
|
||||
#ifndef IB_PD_HAS_LOCAL_DMA_LKEY
|
||||
mr = ib_get_dma_mr(pd, IB_ACCESS_LOCAL_WRITE);
|
||||
if (unlikely(IS_ERR(mr))) {
|
||||
if (IS_ERR(mr)) {
|
||||
err = PTR_ERR(mr);
|
||||
PRINT_ERROR("Failed to get dma mr, err: %d", err);
|
||||
goto fail_mr;
|
||||
@@ -1083,7 +1083,7 @@ static struct isert_device *isert_device_create(struct ib_device *ib_dev)
|
||||
&ia);
|
||||
}
|
||||
#endif
|
||||
if (unlikely(IS_ERR(cq))) {
|
||||
if (IS_ERR(cq)) {
|
||||
cq_desc->cq = NULL;
|
||||
err = PTR_ERR(cq);
|
||||
PRINT_ERROR("Failed to create iser dev cq, err:%d",
|
||||
@@ -1466,7 +1466,7 @@ static int isert_cm_conn_req_handler(struct rdma_cm_id *cm_id,
|
||||
isert_dev = isert_device_find(ib_dev);
|
||||
if (!isert_dev) {
|
||||
isert_dev = isert_device_create(ib_dev);
|
||||
if (unlikely(IS_ERR(isert_dev))) {
|
||||
if (IS_ERR(isert_dev)) {
|
||||
err = PTR_ERR(isert_dev);
|
||||
mutex_unlock(&dev_list_mutex);
|
||||
goto fail_dev_create;
|
||||
@@ -1476,7 +1476,7 @@ static int isert_cm_conn_req_handler(struct rdma_cm_id *cm_id,
|
||||
mutex_unlock(&dev_list_mutex);
|
||||
|
||||
isert_conn = isert_conn_create(cm_id, isert_dev);
|
||||
if (unlikely(IS_ERR(isert_conn))) {
|
||||
if (IS_ERR(isert_conn)) {
|
||||
err = PTR_ERR(isert_conn);
|
||||
goto fail_conn_create;
|
||||
}
|
||||
@@ -1815,7 +1815,7 @@ struct isert_portal *isert_portal_create(void)
|
||||
cm_id = rdma_create_id(&init_net, isert_cm_evt_handler, portal,
|
||||
RDMA_PS_TCP, IB_QPT_RC);
|
||||
#endif
|
||||
if (unlikely(IS_ERR(cm_id))) {
|
||||
if (IS_ERR(cm_id)) {
|
||||
err = PTR_ERR(cm_id);
|
||||
PRINT_ERROR("Failed to create rdma id, err:%d", err);
|
||||
goto create_id_err;
|
||||
@@ -1944,7 +1944,7 @@ struct isert_portal *isert_portal_start(struct sockaddr *sa, size_t addr_len)
|
||||
int err;
|
||||
|
||||
portal = isert_portal_create();
|
||||
if (unlikely(IS_ERR(portal)))
|
||||
if (IS_ERR(portal))
|
||||
return portal;
|
||||
|
||||
err = isert_portal_listen(portal, sa, addr_len);
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
|
||||
ifeq ($(BUILD_2X_MODULE),)
|
||||
|
||||
qla2xxx-y := qla_os.o qla_init.o qla_mbx.o qla_iocb.o qla_isr.o qla_gs.o \
|
||||
|
||||
@@ -440,9 +440,6 @@ qla2x00_sysfs_write_optrom_ctl(struct file *filp, struct kobject *kobj,
|
||||
valid = 0;
|
||||
if (ha->optrom_size == OPTROM_SIZE_2300 && start == 0)
|
||||
valid = 1;
|
||||
else if (start == (ha->flt_region_boot * 4) ||
|
||||
start == (ha->flt_region_fw * 4))
|
||||
valid = 1;
|
||||
else if (IS_QLA24XX_TYPE(ha) || IS_QLA25XX(ha))
|
||||
valid = 1;
|
||||
if (!valid) {
|
||||
@@ -489,8 +486,10 @@ qla2x00_sysfs_write_optrom_ctl(struct file *filp, struct kobject *kobj,
|
||||
"Writing flash region -- 0x%x/0x%x.\n",
|
||||
ha->optrom_region_start, ha->optrom_region_size);
|
||||
|
||||
ha->isp_ops->write_optrom(vha, ha->optrom_buffer,
|
||||
rval = ha->isp_ops->write_optrom(vha, ha->optrom_buffer,
|
||||
ha->optrom_region_start, ha->optrom_region_size);
|
||||
if (rval)
|
||||
rval = -EIO;
|
||||
break;
|
||||
default:
|
||||
rval = -EINVAL;
|
||||
@@ -2920,6 +2919,8 @@ qla24xx_vport_delete(struct fc_vport *fc_vport)
|
||||
struct qla_hw_data *ha = vha->hw;
|
||||
uint16_t id = vha->vp_idx;
|
||||
|
||||
set_bit(VPORT_DELETE, &vha->dpc_flags);
|
||||
|
||||
while (test_bit(LOOP_RESYNC_ACTIVE, &vha->dpc_flags) ||
|
||||
test_bit(FCPORT_UPDATE_NEEDED, &vha->dpc_flags))
|
||||
msleep(1000);
|
||||
@@ -2956,6 +2957,8 @@ qla24xx_vport_delete(struct fc_vport *fc_vport)
|
||||
dma_free_coherent(&ha->pdev->dev, vha->gnl.size, vha->gnl.l,
|
||||
vha->gnl.ldma);
|
||||
|
||||
vha->gnl.l = NULL;
|
||||
|
||||
vfree(vha->scan.l);
|
||||
|
||||
if (vha->qpair && vha->qpair->vp_idx == vha->vp_idx) {
|
||||
|
||||
@@ -292,7 +292,7 @@ qla2x00_process_els(struct bsg_job *bsg_job)
|
||||
srb_t *sp;
|
||||
const char *type;
|
||||
int req_sg_cnt, rsp_sg_cnt;
|
||||
int rval = (DRIVER_ERROR << 16);
|
||||
int rval = (DID_ERROR << 16);
|
||||
uint16_t nextlid = 0;
|
||||
|
||||
if (bsg_request->msgcode == FC_BSG_RPT_ELS) {
|
||||
@@ -384,7 +384,7 @@ qla2x00_process_els(struct bsg_job *bsg_job)
|
||||
|
||||
rsp_sg_cnt = dma_map_sg(&ha->pdev->dev, bsg_job->reply_payload.sg_list,
|
||||
bsg_job->reply_payload.sg_cnt, DMA_FROM_DEVICE);
|
||||
if (!rsp_sg_cnt) {
|
||||
if (!rsp_sg_cnt) {
|
||||
dma_unmap_sg(&ha->pdev->dev, bsg_job->reply_payload.sg_list,
|
||||
bsg_job->reply_payload.sg_cnt, DMA_FROM_DEVICE);
|
||||
rval = -ENOMEM;
|
||||
@@ -476,7 +476,7 @@ qla2x00_process_ct(struct bsg_job *bsg_job)
|
||||
struct Scsi_Host *host = fc_bsg_to_shost(bsg_job);
|
||||
scsi_qla_host_t *vha = shost_priv(host);
|
||||
struct qla_hw_data *ha = vha->hw;
|
||||
int rval = (DRIVER_ERROR << 16);
|
||||
int rval = (DID_ERROR << 16);
|
||||
int req_sg_cnt, rsp_sg_cnt;
|
||||
uint16_t loop_id;
|
||||
struct fc_port *fcport;
|
||||
@@ -2070,7 +2070,7 @@ qlafx00_mgmt_cmd(struct bsg_job *bsg_job)
|
||||
struct Scsi_Host *host = fc_bsg_to_shost(bsg_job);
|
||||
scsi_qla_host_t *vha = shost_priv(host);
|
||||
struct qla_hw_data *ha = vha->hw;
|
||||
int rval = (DRIVER_ERROR << 16);
|
||||
int rval = (DID_ERROR << 16);
|
||||
struct qla_mt_iocb_rqst_fx00 *piocb_rqst;
|
||||
srb_t *sp;
|
||||
int req_sg_cnt = 0, rsp_sg_cnt = 0;
|
||||
|
||||
@@ -2422,6 +2422,7 @@ typedef struct fc_port {
|
||||
unsigned int query:1;
|
||||
unsigned int id_changed:1;
|
||||
unsigned int scan_needed:1;
|
||||
unsigned int n2n_flag:1;
|
||||
|
||||
struct completion nvme_del_done;
|
||||
uint32_t nvme_prli_service_param;
|
||||
@@ -2473,7 +2474,6 @@ typedef struct fc_port {
|
||||
uint8_t fc4_type;
|
||||
uint8_t fc4f_nvme;
|
||||
uint8_t scan_state;
|
||||
uint8_t n2n_flag;
|
||||
|
||||
unsigned long last_queue_full;
|
||||
unsigned long last_ramp_up;
|
||||
@@ -3063,6 +3063,7 @@ enum scan_flags_t {
|
||||
enum fc4type_t {
|
||||
FS_FC4TYPE_FCP = BIT_0,
|
||||
FS_FC4TYPE_NVME = BIT_1,
|
||||
FS_FCP_IS_N2N = BIT_7,
|
||||
};
|
||||
|
||||
struct fab_scan_rp {
|
||||
@@ -4421,6 +4422,7 @@ typedef struct scsi_qla_host {
|
||||
#define IOCB_WORK_ACTIVE 31
|
||||
#define SET_ZIO_THRESHOLD_NEEDED 32
|
||||
#define ISP_ABORT_TO_ROM 33
|
||||
#define VPORT_DELETE 34
|
||||
|
||||
unsigned long pci_flags;
|
||||
#define PFLG_DISCONNECTED 0 /* PCI device removed */
|
||||
|
||||
@@ -3102,7 +3102,8 @@ int qla24xx_post_gpnid_work(struct scsi_qla_host *vha, port_id_t *id)
|
||||
{
|
||||
struct qla_work_evt *e;
|
||||
|
||||
if (test_bit(UNLOADING, &vha->dpc_flags))
|
||||
if (test_bit(UNLOADING, &vha->dpc_flags) ||
|
||||
(vha->vp_idx && test_bit(VPORT_DELETE, &vha->dpc_flags)))
|
||||
return 0;
|
||||
|
||||
e = qla2x00_alloc_work(vha, QLA_EVT_GPNID);
|
||||
@@ -3452,7 +3453,7 @@ void qla24xx_async_gffid_sp_done(srb_t *sp, int res)
|
||||
fcport->fc4_type =
|
||||
ct_rsp->rsp.gff_id.fc4_features[GFF_FCP_SCSI_OFFSET];
|
||||
fcport->fc4_type &= 0xf;
|
||||
}
|
||||
}
|
||||
|
||||
if (ct_rsp->rsp.gff_id.fc4_features[GFF_NVME_OFFSET] & 0xf) {
|
||||
/* w5 [00:03]/28h */
|
||||
@@ -3628,7 +3629,6 @@ void qla24xx_async_gnnft_done(scsi_qla_host_t *vha, srb_t *sp)
|
||||
list_for_each_entry(fcport, &vha->vp_fcports, list) {
|
||||
if (memcmp(rp->port_name, fcport->port_name, WWN_SIZE))
|
||||
continue;
|
||||
fcport->scan_needed = 0;
|
||||
fcport->scan_state = QLA_FCPORT_FOUND;
|
||||
found = true;
|
||||
/*
|
||||
@@ -3637,10 +3637,12 @@ void qla24xx_async_gnnft_done(scsi_qla_host_t *vha, srb_t *sp)
|
||||
if ((fcport->flags & FCF_FABRIC_DEVICE) == 0) {
|
||||
qla2x00_clear_loop_id(fcport);
|
||||
fcport->flags |= FCF_FABRIC_DEVICE;
|
||||
} else if (fcport->d_id.b24 != rp->id.b24) {
|
||||
} else if (fcport->d_id.b24 != rp->id.b24 ||
|
||||
fcport->scan_needed) {
|
||||
qlt_schedule_sess_for_deletion(fcport);
|
||||
}
|
||||
fcport->d_id.b24 = rp->id.b24;
|
||||
fcport->scan_needed = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
+91
-59
@@ -745,12 +745,15 @@ static void qla24xx_handle_gnl_done_event(scsi_qla_host_t *vha,
|
||||
break;
|
||||
default:
|
||||
if ((id.b24 != fcport->d_id.b24 &&
|
||||
fcport->d_id.b24) ||
|
||||
fcport->d_id.b24 &&
|
||||
fcport->loop_id != FC_NO_LOOP_ID) ||
|
||||
(fcport->loop_id != FC_NO_LOOP_ID &&
|
||||
fcport->loop_id != loop_id)) {
|
||||
ql_dbg(ql_dbg_disc, vha, 0x20e3,
|
||||
"%s %d %8phC post del sess\n",
|
||||
__func__, __LINE__, fcport->port_name);
|
||||
if (fcport->n2n_flag)
|
||||
fcport->d_id.b24 = 0;
|
||||
qlt_schedule_sess_for_deletion(fcport);
|
||||
return;
|
||||
}
|
||||
@@ -758,6 +761,8 @@ static void qla24xx_handle_gnl_done_event(scsi_qla_host_t *vha,
|
||||
}
|
||||
|
||||
fcport->loop_id = loop_id;
|
||||
if (fcport->n2n_flag)
|
||||
fcport->d_id.b24 = id.b24;
|
||||
|
||||
wwn = wwn_to_u64(fcport->port_name);
|
||||
qlt_find_sess_invalidate_other(vha, wwn,
|
||||
@@ -807,6 +812,15 @@ static void qla24xx_handle_gnl_done_event(scsi_qla_host_t *vha,
|
||||
fcport->fw_login_state = current_login_state;
|
||||
fcport->d_id = id;
|
||||
switch (current_login_state) {
|
||||
case DSC_LS_PRLI_PEND:
|
||||
/*
|
||||
* In the middle of PRLI. Let it finish.
|
||||
* Allow relogin code to recheck state again
|
||||
* with GNL. Push disc_state back to DELETED
|
||||
* so GNL can go out again
|
||||
*/
|
||||
fcport->disc_state = DSC_DELETED;
|
||||
break;
|
||||
case DSC_LS_PRLI_COMP:
|
||||
if ((e->prli_svc_param_word_3[0] & BIT_4) == 0)
|
||||
fcport->port_type = FCT_INITIATOR;
|
||||
@@ -962,7 +976,7 @@ static void qla24xx_async_gnl_sp_done(srb_t *sp, int res)
|
||||
wwn = wwn_to_u64(e->port_name);
|
||||
|
||||
ql_dbg(ql_dbg_disc + ql_dbg_verbose, vha, 0x20e8,
|
||||
"%s %8phC %02x:%02x:%02x state %d/%d lid %x \n",
|
||||
"%s %8phC %02x:%02x:%02x CLS %x/%x lid %x \n",
|
||||
__func__, (void *)&wwn, e->port_id[2], e->port_id[1],
|
||||
e->port_id[0], e->current_login_state, e->last_login_state,
|
||||
(loop_id & 0x7fff));
|
||||
@@ -1473,7 +1487,7 @@ int qla24xx_fcport_handle_login(struct scsi_qla_host *vha, fc_port_t *fcport)
|
||||
u64 wwn;
|
||||
u16 sec;
|
||||
|
||||
ql_dbg(ql_dbg_disc + ql_dbg_verbose, vha, 0x20d8,
|
||||
ql_dbg(ql_dbg_disc, vha, 0x20d8,
|
||||
"%s %8phC DS %d LS %d P %d fl %x confl %p rscn %d|%d login %d lid %d scan %d\n",
|
||||
__func__, fcport->port_name, fcport->disc_state,
|
||||
fcport->fw_login_state, fcport->login_pause, fcport->flags,
|
||||
@@ -1484,11 +1498,13 @@ int qla24xx_fcport_handle_login(struct scsi_qla_host *vha, fc_port_t *fcport)
|
||||
return 0;
|
||||
|
||||
if ((fcport->loop_id != FC_NO_LOOP_ID) &&
|
||||
qla_dual_mode_enabled(vha) &&
|
||||
((fcport->fw_login_state == DSC_LS_PLOGI_PEND) ||
|
||||
(fcport->fw_login_state == DSC_LS_PRLI_PEND)))
|
||||
return 0;
|
||||
|
||||
if (fcport->fw_login_state == DSC_LS_PLOGI_COMP) {
|
||||
if (fcport->fw_login_state == DSC_LS_PLOGI_COMP &&
|
||||
!N2N_TOPO(vha->hw)) {
|
||||
if (time_before_eq(jiffies, fcport->plogi_nack_done_deadline)) {
|
||||
set_bit(RELOGIN_NEEDED, &vha->dpc_flags);
|
||||
return 0;
|
||||
@@ -1559,8 +1575,9 @@ int qla24xx_fcport_handle_login(struct scsi_qla_host *vha, fc_port_t *fcport)
|
||||
qla24xx_post_gpdb_work(vha, fcport, 0);
|
||||
} else {
|
||||
ql_dbg(ql_dbg_disc, vha, 0x2118,
|
||||
"%s %d %8phC post NVMe PRLI\n",
|
||||
__func__, __LINE__, fcport->port_name);
|
||||
"%s %d %8phC post %s PRLI\n",
|
||||
__func__, __LINE__, fcport->port_name,
|
||||
fcport->fc4f_nvme ? "NVME" : "FC");
|
||||
qla24xx_post_prli_work(vha, fcport);
|
||||
}
|
||||
break;
|
||||
@@ -1673,17 +1690,6 @@ void qla24xx_handle_relogin_event(scsi_qla_host_t *vha,
|
||||
fcport->last_login_gen, fcport->login_gen,
|
||||
fcport->flags);
|
||||
|
||||
if ((fcport->fw_login_state == DSC_LS_PLOGI_PEND) ||
|
||||
(fcport->fw_login_state == DSC_LS_PRLI_PEND))
|
||||
return;
|
||||
|
||||
if (fcport->fw_login_state == DSC_LS_PLOGI_COMP) {
|
||||
if (time_before_eq(jiffies, fcport->plogi_nack_done_deadline)) {
|
||||
set_bit(RELOGIN_NEEDED, &vha->dpc_flags);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (fcport->last_rscn_gen != fcport->rscn_gen) {
|
||||
ql_dbg(ql_dbg_disc, vha, 0x20e9, "%s %d %8phC post gnl\n",
|
||||
__func__, __LINE__, fcport->port_name);
|
||||
@@ -1853,17 +1859,38 @@ qla24xx_handle_prli_done_event(struct scsi_qla_host *vha, struct event_arg *ea)
|
||||
break;
|
||||
}
|
||||
|
||||
if (ea->fcport->n2n_flag) {
|
||||
if (ea->fcport->fc4f_nvme) {
|
||||
ql_dbg(ql_dbg_disc, vha, 0x2118,
|
||||
"%s %d %8phC post fc4 prli\n",
|
||||
__func__, __LINE__, ea->fcport->port_name);
|
||||
ea->fcport->fc4f_nvme = 0;
|
||||
ea->fcport->n2n_flag = 0;
|
||||
qla24xx_post_prli_work(vha, ea->fcport);
|
||||
return;
|
||||
}
|
||||
|
||||
/* at this point both PRLI NVME & PRLI FCP failed */
|
||||
if (N2N_TOPO(vha->hw)) {
|
||||
if (ea->fcport->n2n_link_reset_cnt < 3) {
|
||||
ea->fcport->n2n_link_reset_cnt++;
|
||||
/*
|
||||
* remote port is not sending Plogi. Reset
|
||||
* link to kick start his state machine
|
||||
*/
|
||||
set_bit(N2N_LINK_RESET, &vha->dpc_flags);
|
||||
} else {
|
||||
ql_log(ql_log_warn, vha, 0x2119,
|
||||
"%s %d %8phC Unable to reconnect\n",
|
||||
__func__, __LINE__, ea->fcport->port_name);
|
||||
}
|
||||
} else {
|
||||
/*
|
||||
* switch connect. login failed. Take connection
|
||||
* down and allow relogin to retrigger
|
||||
*/
|
||||
ea->fcport->flags &= ~FCF_ASYNC_SENT;
|
||||
ea->fcport->keep_nport_handle = 0;
|
||||
qlt_schedule_sess_for_deletion(ea->fcport);
|
||||
}
|
||||
ql_dbg(ql_dbg_disc, vha, 0x2119,
|
||||
"%s %d %8phC unhandle event of %x\n",
|
||||
__func__, __LINE__, ea->fcport->port_name, ea->data[0]);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -3190,7 +3217,7 @@ qla2x00_alloc_fw_dump(scsi_qla_host_t *vha)
|
||||
|
||||
for (j = 0; j < 2; j++, fwdt++) {
|
||||
if (!fwdt->template) {
|
||||
ql_log(ql_log_warn, vha, 0x00ba,
|
||||
ql_dbg(ql_dbg_init, vha, 0x00ba,
|
||||
"-> fwdt%u no template\n", j);
|
||||
continue;
|
||||
}
|
||||
@@ -4510,20 +4537,6 @@ qla2x00_nvram_config(scsi_qla_host_t *vha)
|
||||
rval = 1;
|
||||
}
|
||||
|
||||
#if defined(CONFIG_IA64_GENERIC) || defined(CONFIG_IA64_SGI_SN2)
|
||||
/*
|
||||
* The SN2 does not provide BIOS emulation which means you can't change
|
||||
* potentially bogus BIOS settings. Force the use of default settings
|
||||
* for link rate and frame size. Hope that the rest of the settings
|
||||
* are valid.
|
||||
*/
|
||||
if (ia64_platform_is("sn2")) {
|
||||
nv->frame_payload_size = 2048;
|
||||
if (IS_QLA23XX(ha))
|
||||
nv->special_options[1] = BIT_7;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Reset Initialization control block */
|
||||
memset(icb, 0, ha->init_cb_size);
|
||||
|
||||
@@ -4812,7 +4825,7 @@ qla2x00_alloc_fcport(scsi_qla_host_t *vha, gfp_t flags)
|
||||
ql_log(ql_log_warn, vha, 0xd049,
|
||||
"Failed to allocate ct_sns request.\n");
|
||||
kfree(fcport);
|
||||
fcport = NULL;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
INIT_WORK(&fcport->del_work, qla24xx_delete_sess_fn);
|
||||
@@ -5000,28 +5013,47 @@ qla2x00_configure_local_loop(scsi_qla_host_t *vha)
|
||||
unsigned long flags;
|
||||
|
||||
/* Inititae N2N login. */
|
||||
if (test_and_clear_bit(N2N_LOGIN_NEEDED, &vha->dpc_flags)) {
|
||||
/* borrowing */
|
||||
u32 *bp, i, sz;
|
||||
if (N2N_TOPO(ha)) {
|
||||
if (test_and_clear_bit(N2N_LOGIN_NEEDED, &vha->dpc_flags)) {
|
||||
/* borrowing */
|
||||
u32 *bp, i, sz;
|
||||
|
||||
memset(ha->init_cb, 0, ha->init_cb_size);
|
||||
sz = min_t(int, sizeof(struct els_plogi_payload),
|
||||
ha->init_cb_size);
|
||||
rval = qla24xx_get_port_login_templ(vha, ha->init_cb_dma,
|
||||
(void *)ha->init_cb, sz);
|
||||
if (rval == QLA_SUCCESS) {
|
||||
bp = (uint32_t *)ha->init_cb;
|
||||
for (i = 0; i < sz/4 ; i++, bp++)
|
||||
*bp = cpu_to_be32(*bp);
|
||||
memset(ha->init_cb, 0, ha->init_cb_size);
|
||||
sz = min_t(int, sizeof(struct els_plogi_payload),
|
||||
ha->init_cb_size);
|
||||
rval = qla24xx_get_port_login_templ(vha,
|
||||
ha->init_cb_dma, (void *)ha->init_cb, sz);
|
||||
if (rval == QLA_SUCCESS) {
|
||||
bp = (uint32_t *)ha->init_cb;
|
||||
for (i = 0; i < sz/4 ; i++, bp++)
|
||||
*bp = cpu_to_be32(*bp);
|
||||
|
||||
memcpy(&ha->plogi_els_payld.data, (void *)ha->init_cb,
|
||||
sizeof(ha->plogi_els_payld.data));
|
||||
set_bit(RELOGIN_NEEDED, &vha->dpc_flags);
|
||||
} else {
|
||||
ql_dbg(ql_dbg_init, vha, 0x00d1,
|
||||
"PLOGI ELS param read fail.\n");
|
||||
memcpy(&ha->plogi_els_payld.data,
|
||||
(void *)ha->init_cb,
|
||||
sizeof(ha->plogi_els_payld.data));
|
||||
set_bit(RELOGIN_NEEDED, &vha->dpc_flags);
|
||||
} else {
|
||||
ql_dbg(ql_dbg_init, vha, 0x00d1,
|
||||
"PLOGI ELS param read fail.\n");
|
||||
goto skip_login;
|
||||
}
|
||||
}
|
||||
|
||||
list_for_each_entry(fcport, &vha->vp_fcports, list) {
|
||||
if (fcport->n2n_flag) {
|
||||
qla24xx_fcport_handle_login(vha, fcport);
|
||||
return QLA_SUCCESS;
|
||||
}
|
||||
}
|
||||
skip_login:
|
||||
spin_lock_irqsave(&vha->work_lock, flags);
|
||||
vha->scan.scan_retry++;
|
||||
spin_unlock_irqrestore(&vha->work_lock, flags);
|
||||
|
||||
if (vha->scan.scan_retry < MAX_SCAN_RETRIES) {
|
||||
set_bit(LOCAL_LOOP_UPDATE, &vha->dpc_flags);
|
||||
set_bit(LOOP_RESYNC_NEEDED, &vha->dpc_flags);
|
||||
}
|
||||
return QLA_SUCCESS;
|
||||
}
|
||||
|
||||
found_devs = 0;
|
||||
@@ -8228,7 +8260,7 @@ qla81xx_nvram_config(scsi_qla_host_t *vha)
|
||||
active_regions.aux.vpd_nvram == QLA27XX_PRIMARY_IMAGE ?
|
||||
"primary" : "secondary");
|
||||
}
|
||||
qla24xx_read_flash_data(vha, ha->vpd, faddr, ha->vpd_size >> 2);
|
||||
ha->isp_ops->read_optrom(vha, ha->vpd, faddr << 2, ha->vpd_size);
|
||||
|
||||
/* Get NVRAM data into cache and calculate checksum. */
|
||||
faddr = ha->flt_region_nvram;
|
||||
@@ -8240,7 +8272,7 @@ qla81xx_nvram_config(scsi_qla_host_t *vha)
|
||||
"Loading %s nvram image.\n",
|
||||
active_regions.aux.vpd_nvram == QLA27XX_PRIMARY_IMAGE ?
|
||||
"primary" : "secondary");
|
||||
qla24xx_read_flash_data(vha, ha->nvram, faddr, ha->nvram_size >> 2);
|
||||
ha->isp_ops->read_optrom(vha, ha->nvram, faddr << 2, ha->nvram_size);
|
||||
|
||||
dptr = (uint32_t *)nv;
|
||||
for (cnt = 0, chksum = 0; cnt < ha->nvram_size >> 2; cnt++, dptr++)
|
||||
|
||||
@@ -2662,9 +2662,10 @@ qla24xx_els_logo_iocb(srb_t *sp, struct els_entry_24xx *els_iocb)
|
||||
els_iocb->port_id[0] = sp->fcport->d_id.b.al_pa;
|
||||
els_iocb->port_id[1] = sp->fcport->d_id.b.area;
|
||||
els_iocb->port_id[2] = sp->fcport->d_id.b.domain;
|
||||
els_iocb->s_id[0] = vha->d_id.b.al_pa;
|
||||
els_iocb->s_id[1] = vha->d_id.b.area;
|
||||
els_iocb->s_id[2] = vha->d_id.b.domain;
|
||||
/* For SID the byte order is different than DID */
|
||||
els_iocb->s_id[1] = vha->d_id.b.al_pa;
|
||||
els_iocb->s_id[2] = vha->d_id.b.area;
|
||||
els_iocb->s_id[0] = vha->d_id.b.domain;
|
||||
|
||||
if (elsio->u.els_logo.els_cmd == ELS_DCMD_PLOGI) {
|
||||
els_iocb->control_flags = 0;
|
||||
|
||||
@@ -2861,8 +2861,6 @@ qla2x00_status_cont_entry(struct rsp_que *rsp, sts_cont_entry_t *pkt)
|
||||
if (sense_len == 0) {
|
||||
rsp->status_srb = NULL;
|
||||
sp->done(sp, cp->result);
|
||||
} else {
|
||||
WARN_ON_ONCE(true);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3559,10 +3557,8 @@ msix_failed:
|
||||
ha->msix_count, ret);
|
||||
goto msix_out;
|
||||
} else if (ret < ha->msix_count) {
|
||||
ql_log(ql_log_warn, vha, 0x00c6,
|
||||
"MSI-X: Failed to enable support "
|
||||
"with %d vectors, using %d vectors.\n",
|
||||
ha->msix_count, ret);
|
||||
ql_log(ql_log_info, vha, 0x00c6,
|
||||
"MSI-X: Using %d vectors\n", ret);
|
||||
ha->msix_count = ret;
|
||||
/* Recalculate queue values */
|
||||
if (ha->mqiobase && (ql2xmqsupport || ql2xnvmeenable)) {
|
||||
@@ -3797,6 +3793,8 @@ qla2x00_free_irqs(scsi_qla_host_t *vha)
|
||||
{
|
||||
struct qla_hw_data *ha = vha->hw;
|
||||
struct rsp_que *rsp;
|
||||
struct qla_msix_entry *qentry;
|
||||
int i;
|
||||
|
||||
/*
|
||||
* We need to check that ha->rsp_q_map is valid in case we are called
|
||||
@@ -3807,16 +3805,12 @@ qla2x00_free_irqs(scsi_qla_host_t *vha)
|
||||
rsp = ha->rsp_q_map[0];
|
||||
|
||||
if (ha->flags.msix_enabled) {
|
||||
struct qla_msix_entry *qentry;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < ha->msix_count; i++) {
|
||||
qentry = &ha->msix_entries[i];
|
||||
if (qentry->have_irq) {
|
||||
irq_set_affinity_notifier(qentry->vector, NULL);
|
||||
#if HAVE_PCI_IRQ_VECTOR
|
||||
free_irq(pci_irq_vector(ha->pdev, i),
|
||||
qentry->handle);
|
||||
free_irq(pci_irq_vector(ha->pdev, i), qentry->handle);
|
||||
#else
|
||||
free_irq(qentry->vector, qentry->handle);
|
||||
#endif
|
||||
|
||||
+26
-18
@@ -253,21 +253,9 @@ qla2x00_mailbox_command(scsi_qla_host_t *vha, mbx_cmd_t *mcp)
|
||||
if ((!abort_active && io_lock_on) || IS_NOPOLLING_TYPE(ha)) {
|
||||
set_bit(MBX_INTR_WAIT, &ha->mbx_cmd_flags);
|
||||
|
||||
if (IS_P3P_TYPE(ha)) {
|
||||
if (RD_REG_DWORD(®->isp82.hint) &
|
||||
HINT_MBX_INT_PENDING) {
|
||||
ha->flags.mbox_busy = 0;
|
||||
spin_unlock_irqrestore(&ha->hardware_lock,
|
||||
flags);
|
||||
|
||||
atomic_dec(&ha->num_pend_mbx_stage2);
|
||||
ql_dbg(ql_dbg_mbx, vha, 0x1010,
|
||||
"Pending mailbox timeout, exiting.\n");
|
||||
rval = QLA_FUNCTION_TIMEOUT;
|
||||
goto premature_exit;
|
||||
}
|
||||
if (IS_P3P_TYPE(ha))
|
||||
WRT_REG_DWORD(®->isp82.hint, HINT_MBX_INT_PENDING);
|
||||
} else if (IS_FWI2_CAPABLE(ha))
|
||||
else if (IS_FWI2_CAPABLE(ha))
|
||||
WRT_REG_DWORD(®->isp24.hccr, HCCRX_SET_HOST_INT);
|
||||
else
|
||||
WRT_REG_WORD(®->isp.hccr, HCCR_SET_HOST_INT);
|
||||
@@ -714,6 +702,7 @@ qla2x00_execute_fw(scsi_qla_host_t *vha, uint32_t risc_addr)
|
||||
mcp->mb[2] = LSW(risc_addr);
|
||||
mcp->mb[3] = 0;
|
||||
mcp->mb[4] = 0;
|
||||
mcp->mb[11] = 0;
|
||||
ha->flags.using_lr_setting = 0;
|
||||
if (IS_QLA25XX(ha) || IS_QLA81XX(ha) || IS_QLA83XX(ha) ||
|
||||
IS_QLA27XX(ha) || IS_QLA28XX(ha)) {
|
||||
@@ -758,7 +747,7 @@ qla2x00_execute_fw(scsi_qla_host_t *vha, uint32_t risc_addr)
|
||||
if (ha->flags.exchoffld_enabled)
|
||||
mcp->mb[4] |= ENABLE_EXCHANGE_OFFLD;
|
||||
|
||||
mcp->out_mb |= MBX_4|MBX_3|MBX_2|MBX_1;
|
||||
mcp->out_mb |= MBX_4 | MBX_3 | MBX_2 | MBX_1 | MBX_11;
|
||||
mcp->in_mb |= MBX_3 | MBX_2 | MBX_1;
|
||||
} else {
|
||||
mcp->mb[1] = LSW(risc_addr);
|
||||
@@ -2261,7 +2250,7 @@ qla2x00_lip_reset(scsi_qla_host_t *vha)
|
||||
mbx_cmd_t mc;
|
||||
mbx_cmd_t *mcp = &mc;
|
||||
|
||||
ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x105a,
|
||||
ql_dbg(ql_dbg_disc, vha, 0x105a,
|
||||
"Entered %s.\n", __func__);
|
||||
|
||||
if (IS_CNA_CAPABLE(vha->hw)) {
|
||||
@@ -3895,14 +3884,24 @@ qla24xx_report_id_acquisition(scsi_qla_host_t *vha,
|
||||
case TOPO_N2N:
|
||||
ha->current_topology = ISP_CFG_N;
|
||||
spin_lock_irqsave(&vha->hw->tgt.sess_lock, flags);
|
||||
list_for_each_entry(fcport, &vha->vp_fcports, list) {
|
||||
fcport->scan_state = QLA_FCPORT_SCAN;
|
||||
fcport->n2n_flag = 0;
|
||||
}
|
||||
|
||||
fcport = qla2x00_find_fcport_by_wwpn(vha,
|
||||
rptid_entry->u.f1.port_name, 1);
|
||||
spin_unlock_irqrestore(&vha->hw->tgt.sess_lock, flags);
|
||||
|
||||
if (fcport) {
|
||||
fcport->plogi_nack_done_deadline = jiffies + HZ;
|
||||
fcport->dm_login_expire = jiffies + 3*HZ;
|
||||
fcport->dm_login_expire = jiffies + 2*HZ;
|
||||
fcport->scan_state = QLA_FCPORT_FOUND;
|
||||
fcport->n2n_flag = 1;
|
||||
fcport->keep_nport_handle = 1;
|
||||
if (vha->flags.nvme_enabled)
|
||||
fcport->fc4f_nvme = 1;
|
||||
|
||||
switch (fcport->disc_state) {
|
||||
case DSC_DELETED:
|
||||
set_bit(RELOGIN_NEEDED,
|
||||
@@ -3936,7 +3935,7 @@ qla24xx_report_id_acquisition(scsi_qla_host_t *vha,
|
||||
rptid_entry->u.f1.port_name,
|
||||
rptid_entry->u.f1.node_name,
|
||||
NULL,
|
||||
FC4_TYPE_UNKNOWN);
|
||||
FS_FCP_IS_N2N);
|
||||
}
|
||||
|
||||
/* if our portname is higher then initiate N2N login */
|
||||
@@ -4035,6 +4034,7 @@ qla24xx_report_id_acquisition(scsi_qla_host_t *vha,
|
||||
|
||||
list_for_each_entry(fcport, &vha->vp_fcports, list) {
|
||||
fcport->scan_state = QLA_FCPORT_SCAN;
|
||||
fcport->n2n_flag = 0;
|
||||
}
|
||||
|
||||
fcport = qla2x00_find_fcport_by_wwpn(vha,
|
||||
@@ -4044,6 +4044,14 @@ qla24xx_report_id_acquisition(scsi_qla_host_t *vha,
|
||||
fcport->login_retry = vha->hw->login_retry_count;
|
||||
fcport->plogi_nack_done_deadline = jiffies + HZ;
|
||||
fcport->scan_state = QLA_FCPORT_FOUND;
|
||||
fcport->keep_nport_handle = 1;
|
||||
fcport->n2n_flag = 1;
|
||||
fcport->d_id.b.domain =
|
||||
rptid_entry->u.f2.remote_nport_id[2];
|
||||
fcport->d_id.b.area =
|
||||
rptid_entry->u.f2.remote_nport_id[1];
|
||||
fcport->d_id.b.al_pa =
|
||||
rptid_entry->u.f2.remote_nport_id[0];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+22
-10
@@ -66,6 +66,7 @@ qla24xx_deallocate_vp_id(scsi_qla_host_t *vha)
|
||||
uint16_t vp_id;
|
||||
struct qla_hw_data *ha = vha->hw;
|
||||
unsigned long flags = 0;
|
||||
u8 i;
|
||||
|
||||
mutex_lock(&ha->vport_lock);
|
||||
/*
|
||||
@@ -75,8 +76,9 @@ qla24xx_deallocate_vp_id(scsi_qla_host_t *vha)
|
||||
* ensures no active vp_list traversal while the vport is removed
|
||||
* from the queue)
|
||||
*/
|
||||
wait_event_timeout(vha->vref_waitq, !atomic_read(&vha->vref_count),
|
||||
10*HZ);
|
||||
for (i = 0; i < 10 && atomic_read(&vha->vref_count); i++)
|
||||
wait_event_timeout(vha->vref_waitq,
|
||||
atomic_read(&vha->vref_count), HZ);
|
||||
|
||||
spin_lock_irqsave(&ha->vport_slock, flags);
|
||||
if (atomic_read(&vha->vref_count)) {
|
||||
@@ -262,6 +264,9 @@ qla2x00_alert_all_vps(struct rsp_que *rsp, uint16_t *mb)
|
||||
spin_lock_irqsave(&ha->vport_slock, flags);
|
||||
list_for_each_entry(vha, &ha->vp_list, list) {
|
||||
if (vha->vp_idx) {
|
||||
if (test_bit(VPORT_DELETE, &vha->dpc_flags))
|
||||
continue;
|
||||
|
||||
atomic_inc(&vha->vref_count);
|
||||
spin_unlock_irqrestore(&ha->vport_slock, flags);
|
||||
|
||||
@@ -300,6 +305,20 @@ qla2x00_alert_all_vps(struct rsp_que *rsp, uint16_t *mb)
|
||||
int
|
||||
qla2x00_vp_abort_isp(scsi_qla_host_t *vha)
|
||||
{
|
||||
fc_port_t *fcport;
|
||||
|
||||
/*
|
||||
* To exclusively reset vport, we need to log it out first.
|
||||
* Note: This control_vp can fail if ISP reset is already
|
||||
* issued, this is expected, as the vp would be already
|
||||
* logged out due to ISP reset.
|
||||
*/
|
||||
if (!test_bit(ABORT_ISP_ACTIVE, &vha->dpc_flags)) {
|
||||
qla24xx_control_vp(vha, VCE_COMMAND_DISABLE_VPS_LOGO_ALL);
|
||||
list_for_each_entry(fcport, &vha->vp_fcports, list)
|
||||
fcport->logout_on_delete = 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Physical port will do most of the abort and recovery work. We can
|
||||
* just treat it as a loop down
|
||||
@@ -312,16 +331,9 @@ qla2x00_vp_abort_isp(scsi_qla_host_t *vha)
|
||||
atomic_set(&vha->loop_down_timer, LOOP_DOWN_TIME);
|
||||
}
|
||||
|
||||
/*
|
||||
* To exclusively reset vport, we need to log it out first. Note: this
|
||||
* control_vp can fail if ISP reset is already issued, this is
|
||||
* expected, as the vp would be already logged out due to ISP reset.
|
||||
*/
|
||||
if (!test_bit(ABORT_ISP_ACTIVE, &vha->dpc_flags))
|
||||
qla24xx_control_vp(vha, VCE_COMMAND_DISABLE_VPS_LOGO_ALL);
|
||||
|
||||
ql_dbg(ql_dbg_taskm, vha, 0x801d,
|
||||
"Scheduling enable of Vport %d.\n", vha->vp_idx);
|
||||
|
||||
return qla24xx_enable_vp(vha);
|
||||
}
|
||||
|
||||
|
||||
@@ -1976,7 +1976,7 @@ qla82xx_check_rcvpeg_state(struct qla_hw_data *ha)
|
||||
} while (--retries);
|
||||
|
||||
ql_log(ql_log_fatal, vha, 0x00ac,
|
||||
"Rcv Peg initializatin failed: 0x%x.\n", val);
|
||||
"Rcv Peg initialization failed: 0x%x.\n", val);
|
||||
read_lock(&ha->hw_lock);
|
||||
qla82xx_wr_32(ha, CRB_RCVPEG_STATE, PHAN_INITIALIZE_FAILED);
|
||||
read_unlock(&ha->hw_lock);
|
||||
@@ -2286,7 +2286,9 @@ qla82xx_disable_intrs(struct qla_hw_data *ha)
|
||||
{
|
||||
scsi_qla_host_t *vha = pci_get_drvdata(ha->pdev);
|
||||
|
||||
qla82xx_mbx_intr_disable(vha);
|
||||
if (ha->interrupts_on)
|
||||
qla82xx_mbx_intr_disable(vha);
|
||||
|
||||
spin_lock_irq(&ha->hardware_lock);
|
||||
if (IS_QLA8044(ha))
|
||||
qla8044_wr_reg(ha, LEG_INTR_MASK_OFFSET, 1);
|
||||
|
||||
@@ -1152,9 +1152,15 @@ static inline int test_fcport_count(scsi_qla_host_t *vha)
|
||||
void
|
||||
qla2x00_wait_for_sess_deletion(scsi_qla_host_t *vha)
|
||||
{
|
||||
u8 i;
|
||||
|
||||
qla2x00_mark_all_devices_lost(vha, 0);
|
||||
|
||||
wait_event_timeout(vha->fcport_waitQ, test_fcport_count(vha), 10*HZ);
|
||||
for (i = 0; i < 10; i++)
|
||||
wait_event_timeout(vha->fcport_waitQ, test_fcport_count(vha),
|
||||
HZ);
|
||||
|
||||
flush_workqueue(vha->hw->wq);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -3268,6 +3274,10 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
|
||||
req->req_q_in, req->req_q_out, rsp->rsp_q_in, rsp->rsp_q_out);
|
||||
|
||||
ha->wq = alloc_workqueue("qla2xxx_wq", 0, 0);
|
||||
if (unlikely(!ha->wq)) {
|
||||
ret = -ENOMEM;
|
||||
goto probe_failed;
|
||||
}
|
||||
|
||||
if (ha->isp_ops->initialize_adapter(base_vha)) {
|
||||
ql_log(ql_log_fatal, base_vha, 0x00d6,
|
||||
@@ -3477,6 +3487,12 @@ skip_dpc:
|
||||
return 0;
|
||||
|
||||
probe_failed:
|
||||
if (base_vha->gnl.l) {
|
||||
dma_free_coherent(&ha->pdev->dev, base_vha->gnl.size,
|
||||
base_vha->gnl.l, base_vha->gnl.ldma);
|
||||
base_vha->gnl.l = NULL;
|
||||
}
|
||||
|
||||
if (base_vha->timer_active)
|
||||
qla2x00_stop_timer(base_vha);
|
||||
base_vha->flags.online = 0;
|
||||
@@ -3569,6 +3585,10 @@ qla2x00_shutdown(struct pci_dev *pdev)
|
||||
qla2x00_try_to_stop_firmware(vha);
|
||||
}
|
||||
|
||||
/* Disable timer */
|
||||
if (vha->timer_active)
|
||||
qla2x00_stop_timer(vha);
|
||||
|
||||
/* Turn adapter off line */
|
||||
vha->flags.online = 0;
|
||||
|
||||
@@ -3710,7 +3730,7 @@ qla2x00_remove_one(struct pci_dev *pdev)
|
||||
if (!atomic_read(&pdev->enable_cnt)) {
|
||||
dma_free_coherent(&ha->pdev->dev, base_vha->gnl.size,
|
||||
base_vha->gnl.l, base_vha->gnl.ldma);
|
||||
|
||||
base_vha->gnl.l = NULL;
|
||||
scsi_host_put(base_vha->host);
|
||||
kfree(ha);
|
||||
pci_set_drvdata(pdev, NULL);
|
||||
@@ -3750,6 +3770,8 @@ qla2x00_remove_one(struct pci_dev *pdev)
|
||||
dma_free_coherent(&ha->pdev->dev,
|
||||
base_vha->gnl.size, base_vha->gnl.l, base_vha->gnl.ldma);
|
||||
|
||||
base_vha->gnl.l = NULL;
|
||||
|
||||
vfree(base_vha->scan.l);
|
||||
|
||||
if (IS_QLAFX00(ha))
|
||||
@@ -4853,6 +4875,7 @@ struct scsi_qla_host *qla2x00_create_host(struct scsi_host_template *sht,
|
||||
"Alloc failed for scan database.\n");
|
||||
dma_free_coherent(&ha->pdev->dev, vha->gnl.size,
|
||||
vha->gnl.l, vha->gnl.ldma);
|
||||
vha->gnl.l = NULL;
|
||||
scsi_host_put(vha->host);
|
||||
return NULL;
|
||||
}
|
||||
@@ -5081,6 +5104,10 @@ void qla24xx_create_new_sess(struct scsi_qla_host *vha, struct qla_work_evt *e)
|
||||
|
||||
memcpy(fcport->port_name, e->u.new_sess.port_name,
|
||||
WWN_SIZE);
|
||||
|
||||
if (e->u.new_sess.fc4_type & FS_FCP_IS_N2N)
|
||||
fcport->n2n_flag = 1;
|
||||
|
||||
} else {
|
||||
ql_dbg(ql_dbg_disc, vha, 0xffff,
|
||||
"%s %8phC mem alloc fail.\n",
|
||||
@@ -5179,11 +5206,9 @@ void qla24xx_create_new_sess(struct scsi_qla_host *vha, struct qla_work_evt *e)
|
||||
if (dfcp)
|
||||
qlt_schedule_sess_for_deletion(tfcp);
|
||||
|
||||
|
||||
if (N2N_TOPO(vha->hw))
|
||||
fcport->flags &= ~FCF_FABRIC_DEVICE;
|
||||
|
||||
if (N2N_TOPO(vha->hw)) {
|
||||
fcport->flags &= ~FCF_FABRIC_DEVICE;
|
||||
fcport->keep_nport_handle = 1;
|
||||
if (vha->flags.nvme_enabled) {
|
||||
fcport->fc4f_nvme = 1;
|
||||
fcport->n2n_flag = 1;
|
||||
|
||||
@@ -682,8 +682,8 @@ qla2xxx_get_flt_info(scsi_qla_host_t *vha, uint32_t flt_addr)
|
||||
|
||||
ha->flt_region_flt = flt_addr;
|
||||
wptr = (uint16_t *)ha->flt;
|
||||
qla24xx_read_flash_data(vha, (void *)flt, flt_addr,
|
||||
(sizeof(struct qla_flt_header) + FLT_REGIONS_SIZE) >> 2);
|
||||
ha->isp_ops->read_optrom(vha, (void *)flt, flt_addr << 2,
|
||||
(sizeof(struct qla_flt_header) + FLT_REGIONS_SIZE));
|
||||
|
||||
if (le16_to_cpu(*wptr) == 0xffff)
|
||||
goto no_flash_data;
|
||||
@@ -950,11 +950,11 @@ qla2xxx_get_fdt_info(scsi_qla_host_t *vha)
|
||||
struct req_que *req = ha->req_q_map[0];
|
||||
uint16_t cnt, chksum;
|
||||
uint16_t *wptr = (void *)req->ring;
|
||||
struct qla_fdt_layout *fdt = (void *)req->ring;
|
||||
struct qla_fdt_layout *fdt = (struct qla_fdt_layout *)req->ring;
|
||||
uint8_t man_id, flash_id;
|
||||
uint16_t mid = 0, fid = 0;
|
||||
|
||||
qla24xx_read_flash_data(vha, (void *)fdt, ha->flt_region_fdt,
|
||||
ha->isp_ops->read_optrom(vha, fdt, ha->flt_region_fdt << 2,
|
||||
OPTROM_BURST_DWORDS);
|
||||
if (le16_to_cpu(*wptr) == 0xffff)
|
||||
goto no_flash_data;
|
||||
|
||||
@@ -966,7 +966,7 @@ void qlt_free_session_done(struct work_struct *work)
|
||||
struct qla_hw_data *ha = vha->hw;
|
||||
unsigned long flags;
|
||||
bool logout_started = false;
|
||||
scsi_qla_host_t *base_vha;
|
||||
scsi_qla_host_t *base_vha = pci_get_drvdata(ha->pdev);
|
||||
struct qlt_plogi_ack_t *own =
|
||||
sess->plogi_link[QLT_PLOGI_LINK_SAME_WWN];
|
||||
|
||||
@@ -1033,6 +1033,7 @@ void qlt_free_session_done(struct work_struct *work)
|
||||
|
||||
if (logout_started) {
|
||||
bool traced = false;
|
||||
u16 cnt = 0;
|
||||
|
||||
while (!READ_ONCE(sess->logout_completed)) {
|
||||
if (!traced) {
|
||||
@@ -1042,6 +1043,9 @@ void qlt_free_session_done(struct work_struct *work)
|
||||
traced = true;
|
||||
}
|
||||
msleep(100);
|
||||
cnt++;
|
||||
if (cnt > 200)
|
||||
break;
|
||||
}
|
||||
|
||||
ql_dbg(ql_dbg_disc, vha, 0xf087,
|
||||
@@ -1114,6 +1118,7 @@ void qlt_free_session_done(struct work_struct *work)
|
||||
}
|
||||
|
||||
spin_unlock_irqrestore(&ha->tgt.sess_lock, flags);
|
||||
sess->free_pending = 0;
|
||||
|
||||
ql_dbg(ql_dbg_tgt_mgt, vha, 0xf001,
|
||||
"Unregistration of sess %p %8phC finished fcp_cnt %d\n",
|
||||
@@ -1122,17 +1127,9 @@ void qlt_free_session_done(struct work_struct *work)
|
||||
if (tgt && (tgt->sess_count == 0))
|
||||
wake_up_all(&tgt->waitQ);
|
||||
|
||||
if (vha->fcport_count == 0)
|
||||
wake_up_all(&vha->fcport_waitQ);
|
||||
|
||||
base_vha = pci_get_drvdata(ha->pdev);
|
||||
|
||||
sess->free_pending = 0;
|
||||
|
||||
if (test_bit(PFLG_DRIVER_REMOVING, &base_vha->pci_flags))
|
||||
return;
|
||||
|
||||
if ((!tgt || !tgt->tgt_stop) && !LOOP_TRANSITION(vha)) {
|
||||
if (!test_bit(PFLG_DRIVER_REMOVING, &base_vha->pci_flags) &&
|
||||
!(vha->vp_idx && test_bit(VPORT_DELETE, &vha->dpc_flags)) &&
|
||||
(!tgt || !tgt->tgt_stop) && !LOOP_TRANSITION(vha)) {
|
||||
switch (vha->host->active_mode) {
|
||||
case MODE_INITIATOR:
|
||||
case MODE_DUAL:
|
||||
@@ -1145,6 +1142,9 @@ void qlt_free_session_done(struct work_struct *work)
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (vha->fcport_count == 0)
|
||||
wake_up_all(&vha->fcport_waitQ);
|
||||
}
|
||||
|
||||
/* ha->tgt.sess_lock supposed to be held on entry */
|
||||
@@ -1173,7 +1173,7 @@ void qlt_unreg_sess(struct fc_port *sess)
|
||||
sess->last_rscn_gen = sess->rscn_gen;
|
||||
sess->last_login_gen = sess->login_gen;
|
||||
|
||||
schedule_work(&sess->free_work);
|
||||
queue_work(sess->vha->hw->wq, &sess->free_work);
|
||||
}
|
||||
EXPORT_SYMBOL(qlt_unreg_sess);
|
||||
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
/*
|
||||
* Driver version
|
||||
*/
|
||||
#define QLA2XXX_VERSION "10.01.00.18-k"
|
||||
#define QLA2XXX_VERSION "10.01.00.19-k"
|
||||
|
||||
#define QLA_DRIVER_MAJOR_VER 10
|
||||
#define QLA_DRIVER_MINOR_VER 1
|
||||
|
||||
Reference in New Issue
Block a user