Merge branch '5.9/scsi-fixes' into 5.10/scsi-ufs
Resolve UFS discrepancies between fixes and queue. Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
This commit is contained in:
Коммит
02f7415054
|
@ -193,7 +193,7 @@ static int ixgbe_fcoe_ddp_setup(struct net_device *netdev, u16 xid,
|
|||
}
|
||||
|
||||
/* alloc the udl from per cpu ddp pool */
|
||||
ddp->udl = dma_pool_alloc(ddp_pool->pool, GFP_KERNEL, &ddp->udp);
|
||||
ddp->udl = dma_pool_alloc(ddp_pool->pool, GFP_ATOMIC, &ddp->udp);
|
||||
if (!ddp->udl) {
|
||||
e_err(drv, "failed allocated ddp context\n");
|
||||
goto out_noddp_unmap;
|
||||
|
|
|
@ -434,7 +434,7 @@ static void zfcp_fsf_req_complete(struct zfcp_fsf_req *req)
|
|||
return;
|
||||
}
|
||||
|
||||
del_timer(&req->timer);
|
||||
del_timer_sync(&req->timer);
|
||||
zfcp_fsf_protstatus_eval(req);
|
||||
zfcp_fsf_fsfstatus_eval(req);
|
||||
req->handler(req);
|
||||
|
@ -867,7 +867,7 @@ static int zfcp_fsf_req_send(struct zfcp_fsf_req *req)
|
|||
req->qdio_req.qdio_outb_usage = atomic_read(&qdio->req_q_free);
|
||||
req->issued = get_tod_clock();
|
||||
if (zfcp_qdio_send(qdio, &req->qdio_req)) {
|
||||
del_timer(&req->timer);
|
||||
del_timer_sync(&req->timer);
|
||||
/* lookup request again, list might have changed */
|
||||
zfcp_reqlist_find_rm(adapter->req_list, req_id);
|
||||
zfcp_erp_adapter_reopen(adapter, 0, "fsrs__1");
|
||||
|
|
|
@ -2457,10 +2457,10 @@ int cxgbi_conn_xmit_pdu(struct iscsi_task *task)
|
|||
return err;
|
||||
}
|
||||
|
||||
__kfree_skb(skb);
|
||||
log_debug(1 << CXGBI_DBG_ISCSI | 1 << CXGBI_DBG_PDU_TX,
|
||||
"itt 0x%x, skb 0x%p, len %u/%u, xmit err %d.\n",
|
||||
task->itt, skb, skb->len, skb->data_len, err);
|
||||
__kfree_skb(skb);
|
||||
iscsi_conn_printk(KERN_ERR, task->conn, "xmit err %d.\n", err);
|
||||
iscsi_conn_failure(task->conn, ISCSI_ERR_XMIT_FAILED);
|
||||
return err;
|
||||
|
|
|
@ -634,8 +634,6 @@ free_fp:
|
|||
fc_frame_free(fp);
|
||||
out:
|
||||
kref_put(&rdata->kref, fc_rport_destroy);
|
||||
if (!IS_ERR(fp))
|
||||
fc_frame_free(fp);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -209,7 +209,10 @@ static unsigned int sas_ata_qc_issue(struct ata_queued_cmd *qc)
|
|||
task->num_scatter = si;
|
||||
}
|
||||
|
||||
task->data_dir = qc->dma_dir;
|
||||
if (qc->tf.protocol == ATA_PROT_NODATA)
|
||||
task->data_dir = DMA_NONE;
|
||||
else
|
||||
task->data_dir = qc->dma_dir;
|
||||
task->scatter = qc->sg;
|
||||
task->ata_task.retry_count = 1;
|
||||
task->task_state_flags = SAS_TASK_STATE_PENDING;
|
||||
|
|
|
@ -182,10 +182,11 @@ int sas_notify_lldd_dev_found(struct domain_device *dev)
|
|||
pr_warn("driver on host %s cannot handle device %016llx, error:%d\n",
|
||||
dev_name(sas_ha->dev),
|
||||
SAS_ADDR(dev->sas_addr), res);
|
||||
return res;
|
||||
}
|
||||
set_bit(SAS_DEV_FOUND, &dev->state);
|
||||
kref_get(&dev->kref);
|
||||
return res;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -3517,6 +3517,9 @@ lpfc_issue_els_rdf(struct lpfc_vport *vport, uint8_t retry)
|
|||
FC_TLV_DESC_LENGTH_FROM_SZ(prdf->reg_d1));
|
||||
prdf->reg_d1.reg_desc.count = cpu_to_be32(ELS_RDF_REG_TAG_CNT);
|
||||
prdf->reg_d1.desc_tags[0] = cpu_to_be32(ELS_DTAG_LNK_INTEGRITY);
|
||||
prdf->reg_d1.desc_tags[1] = cpu_to_be32(ELS_DTAG_DELIVERY);
|
||||
prdf->reg_d1.desc_tags[2] = cpu_to_be32(ELS_DTAG_PEER_CONGEST);
|
||||
prdf->reg_d1.desc_tags[3] = cpu_to_be32(ELS_DTAG_CONGESTION);
|
||||
|
||||
lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_CMD,
|
||||
"Issue RDF: did:x%x",
|
||||
|
@ -4656,7 +4659,9 @@ lpfc_cmpl_els_rsp(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
|
|||
out:
|
||||
if (ndlp && NLP_CHK_NODE_ACT(ndlp) && shost) {
|
||||
spin_lock_irq(shost->host_lock);
|
||||
ndlp->nlp_flag &= ~(NLP_ACC_REGLOGIN | NLP_RM_DFLT_RPI);
|
||||
if (mbox)
|
||||
ndlp->nlp_flag &= ~NLP_ACC_REGLOGIN;
|
||||
ndlp->nlp_flag &= ~NLP_RM_DFLT_RPI;
|
||||
spin_unlock_irq(shost->host_lock);
|
||||
|
||||
/* If the node is not being used by another discovery thread,
|
||||
|
|
|
@ -4800,7 +4800,7 @@ struct send_frame_wqe {
|
|||
uint32_t fc_hdr_wd5; /* word 15 */
|
||||
};
|
||||
|
||||
#define ELS_RDF_REG_TAG_CNT 1
|
||||
#define ELS_RDF_REG_TAG_CNT 4
|
||||
struct lpfc_els_rdf_reg_desc {
|
||||
struct fc_df_desc_fpin_reg reg_desc; /* descriptor header */
|
||||
__be32 desc_tags[ELS_RDF_REG_TAG_CNT];
|
||||
|
|
|
@ -11376,7 +11376,6 @@ lpfc_irq_clear_aff(struct lpfc_hba_eq_hdl *eqhdl)
|
|||
{
|
||||
cpumask_clear(&eqhdl->aff_mask);
|
||||
irq_clear_status_flags(eqhdl->irq, IRQ_NO_BALANCING);
|
||||
irq_set_affinity_hint(eqhdl->irq, &eqhdl->aff_mask);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -20,7 +20,7 @@
|
|||
* included with this package. *
|
||||
*******************************************************************/
|
||||
|
||||
#define LPFC_DRIVER_VERSION "12.8.0.3"
|
||||
#define LPFC_DRIVER_VERSION "12.8.0.4"
|
||||
#define LPFC_DRIVER_NAME "lpfc"
|
||||
|
||||
/* Used for SLI 2/3 */
|
||||
|
|
|
@ -3689,7 +3689,7 @@ int megasas_irqpoll(struct irq_poll *irqpoll, int budget)
|
|||
instance = irq_ctx->instance;
|
||||
|
||||
if (irq_ctx->irq_line_enable) {
|
||||
disable_irq(irq_ctx->os_irq);
|
||||
disable_irq_nosync(irq_ctx->os_irq);
|
||||
irq_ctx->irq_line_enable = false;
|
||||
}
|
||||
|
||||
|
|
|
@ -1731,7 +1731,7 @@ _base_irqpoll(struct irq_poll *irqpoll, int budget)
|
|||
reply_q = container_of(irqpoll, struct adapter_reply_queue,
|
||||
irqpoll);
|
||||
if (reply_q->irq_line_enable) {
|
||||
disable_irq(reply_q->os_irq);
|
||||
disable_irq_nosync(reply_q->os_irq);
|
||||
reply_q->irq_line_enable = false;
|
||||
}
|
||||
num_entries = _base_process_reply_queue(reply_q);
|
||||
|
|
|
@ -818,7 +818,7 @@ pm8001_exec_internal_task_abort(struct pm8001_hba_info *pm8001_ha,
|
|||
|
||||
res = pm8001_tag_alloc(pm8001_ha, &ccb_tag);
|
||||
if (res)
|
||||
return res;
|
||||
goto ex_err;
|
||||
ccb = &pm8001_ha->ccb_info[ccb_tag];
|
||||
ccb->device = pm8001_dev;
|
||||
ccb->ccb_tag = ccb_tag;
|
||||
|
|
|
@ -3958,7 +3958,7 @@ void qedf_stag_change_work(struct work_struct *work)
|
|||
container_of(work, struct qedf_ctx, stag_work.work);
|
||||
|
||||
if (!qedf) {
|
||||
QEDF_ERR(&qedf->dbg_ctx, "qedf is NULL");
|
||||
QEDF_ERR(NULL, "qedf is NULL");
|
||||
return;
|
||||
}
|
||||
QEDF_ERR(&qedf->dbg_ctx, "Performing software context reset.\n");
|
||||
|
|
|
@ -380,5 +380,8 @@ extern int qla24xx_soft_reset(struct qla_hw_data *);
|
|||
static inline int
|
||||
ql_mask_match(uint level)
|
||||
{
|
||||
if (ql2xextended_error_logging == 1)
|
||||
ql2xextended_error_logging = QL_DBG_DEFAULT1_MASK;
|
||||
|
||||
return (level & ql2xextended_error_logging) == level;
|
||||
}
|
||||
|
|
|
@ -1626,7 +1626,7 @@ typedef struct {
|
|||
*/
|
||||
uint8_t firmware_options[2];
|
||||
|
||||
uint16_t frame_payload_size;
|
||||
__le16 frame_payload_size;
|
||||
__le16 max_iocb_allocation;
|
||||
__le16 execution_throttle;
|
||||
uint8_t retry_count;
|
||||
|
@ -3880,6 +3880,7 @@ struct qla_hw_data {
|
|||
uint32_t scm_supported_f:1;
|
||||
/* Enabled in Driver */
|
||||
uint32_t scm_enabled:1;
|
||||
uint32_t max_req_queue_warned:1;
|
||||
} flags;
|
||||
|
||||
uint16_t max_exchg;
|
||||
|
|
|
@ -1505,11 +1505,11 @@ qla2x00_prep_ct_fdmi_req(struct ct_sns_pkt *p, uint16_t cmd,
|
|||
static uint
|
||||
qla25xx_fdmi_port_speed_capability(struct qla_hw_data *ha)
|
||||
{
|
||||
uint speeds = 0;
|
||||
|
||||
if (IS_CNA_CAPABLE(ha))
|
||||
return FDMI_PORT_SPEED_10GB;
|
||||
if (IS_QLA28XX(ha) || IS_QLA27XX(ha)) {
|
||||
uint speeds = 0;
|
||||
|
||||
if (ha->max_supported_speed == 2) {
|
||||
if (ha->min_supported_speed <= 6)
|
||||
speeds |= FDMI_PORT_SPEED_64GB;
|
||||
|
@ -1536,9 +1536,16 @@ qla25xx_fdmi_port_speed_capability(struct qla_hw_data *ha)
|
|||
}
|
||||
return speeds;
|
||||
}
|
||||
if (IS_QLA2031(ha))
|
||||
return FDMI_PORT_SPEED_16GB|FDMI_PORT_SPEED_8GB|
|
||||
FDMI_PORT_SPEED_4GB;
|
||||
if (IS_QLA2031(ha)) {
|
||||
if ((ha->pdev->subsystem_vendor == 0x103C) &&
|
||||
(ha->pdev->subsystem_device == 0x8002)) {
|
||||
speeds = FDMI_PORT_SPEED_16GB;
|
||||
} else {
|
||||
speeds = FDMI_PORT_SPEED_16GB|FDMI_PORT_SPEED_8GB|
|
||||
FDMI_PORT_SPEED_4GB;
|
||||
}
|
||||
return speeds;
|
||||
}
|
||||
if (IS_QLA25XX(ha))
|
||||
return FDMI_PORT_SPEED_8GB|FDMI_PORT_SPEED_4GB|
|
||||
FDMI_PORT_SPEED_2GB|FDMI_PORT_SPEED_1GB;
|
||||
|
@ -3436,7 +3443,6 @@ void qla24xx_async_gnnft_done(scsi_qla_host_t *vha, srb_t *sp)
|
|||
list_for_each_entry(fcport, &vha->vp_fcports, list) {
|
||||
if ((fcport->flags & FCF_FABRIC_DEVICE) != 0) {
|
||||
fcport->scan_state = QLA_FCPORT_SCAN;
|
||||
fcport->logout_on_delete = 0;
|
||||
}
|
||||
}
|
||||
goto login_logout;
|
||||
|
@ -3532,10 +3538,22 @@ login_logout:
|
|||
}
|
||||
|
||||
if (fcport->scan_state != QLA_FCPORT_FOUND) {
|
||||
bool do_delete = false;
|
||||
|
||||
if (fcport->scan_needed &&
|
||||
fcport->disc_state == DSC_LOGIN_PEND) {
|
||||
/* Cable got disconnected after we sent
|
||||
* a login. Do delete to prevent timeout.
|
||||
*/
|
||||
fcport->logout_on_delete = 1;
|
||||
do_delete = true;
|
||||
}
|
||||
|
||||
fcport->scan_needed = 0;
|
||||
if ((qla_dual_mode_enabled(vha) ||
|
||||
qla_ini_mode_enabled(vha)) &&
|
||||
atomic_read(&fcport->state) == FCS_ONLINE) {
|
||||
if (((qla_dual_mode_enabled(vha) ||
|
||||
qla_ini_mode_enabled(vha)) &&
|
||||
atomic_read(&fcport->state) == FCS_ONLINE) ||
|
||||
do_delete) {
|
||||
if (fcport->loop_id != FC_NO_LOOP_ID) {
|
||||
if (fcport->flags & FCF_FCP2_DEVICE)
|
||||
fcport->logout_on_delete = 0;
|
||||
|
@ -3736,6 +3754,18 @@ static void qla2x00_async_gpnft_gnnft_sp_done(srb_t *sp, int res)
|
|||
unsigned long flags;
|
||||
const char *name = sp->name;
|
||||
|
||||
if (res == QLA_OS_TIMER_EXPIRED) {
|
||||
/* switch is ignoring all commands.
|
||||
* This might be a zone disable behavior.
|
||||
* This means we hit 64s timeout.
|
||||
* 22s GPNFT + 44s Abort = 64s
|
||||
*/
|
||||
ql_dbg(ql_dbg_disc, vha, 0xffff,
|
||||
"%s: Switch Zone check please .\n",
|
||||
name);
|
||||
qla2x00_mark_all_devices_lost(vha);
|
||||
}
|
||||
|
||||
/*
|
||||
* We are in an Interrupt context, queue up this
|
||||
* sp for GNNFT_DONE work. This will allow all
|
||||
|
|
|
@ -4613,18 +4613,18 @@ qla2x00_nvram_config(scsi_qla_host_t *vha)
|
|||
nv->firmware_options[1] = BIT_7 | BIT_5;
|
||||
nv->add_firmware_options[0] = BIT_5;
|
||||
nv->add_firmware_options[1] = BIT_5 | BIT_4;
|
||||
nv->frame_payload_size = 2048;
|
||||
nv->frame_payload_size = cpu_to_le16(2048);
|
||||
nv->special_options[1] = BIT_7;
|
||||
} else if (IS_QLA2200(ha)) {
|
||||
nv->firmware_options[0] = BIT_2 | BIT_1;
|
||||
nv->firmware_options[1] = BIT_7 | BIT_5;
|
||||
nv->add_firmware_options[0] = BIT_5;
|
||||
nv->add_firmware_options[1] = BIT_5 | BIT_4;
|
||||
nv->frame_payload_size = 1024;
|
||||
nv->frame_payload_size = cpu_to_le16(1024);
|
||||
} else if (IS_QLA2100(ha)) {
|
||||
nv->firmware_options[0] = BIT_3 | BIT_1;
|
||||
nv->firmware_options[1] = BIT_5;
|
||||
nv->frame_payload_size = 1024;
|
||||
nv->frame_payload_size = cpu_to_le16(1024);
|
||||
}
|
||||
|
||||
nv->max_iocb_allocation = cpu_to_le16(256);
|
||||
|
|
|
@ -2024,8 +2024,8 @@ qla24xx_els_ct_entry(scsi_qla_host_t *vha, struct req_que *req,
|
|||
res = DID_ERROR << 16;
|
||||
}
|
||||
}
|
||||
ql_dbg(ql_dbg_user, vha, 0x503f,
|
||||
"ELS IOCB Done -%s error hdl=%x comp_status=0x%x error subcode 1=0x%x error subcode 2=0x%x total_byte=0x%x\n",
|
||||
ql_dbg(ql_dbg_disc, vha, 0x503f,
|
||||
"ELS IOCB Done -%s hdl=%x comp_status=0x%x error subcode 1=0x%x error subcode 2=0x%x total_byte=0x%x\n",
|
||||
type, sp->handle, comp_status, fw_status[1], fw_status[2],
|
||||
le32_to_cpu(ese->total_byte_count));
|
||||
goto els_ct_done;
|
||||
|
|
|
@ -334,14 +334,6 @@ qla2x00_mailbox_command(scsi_qla_host_t *vha, mbx_cmd_t *mcp)
|
|||
if (time_after(jiffies, wait_time))
|
||||
break;
|
||||
|
||||
/*
|
||||
* Check if it's UNLOADING, cause we cannot poll in
|
||||
* this case, or else a NULL pointer dereference
|
||||
* is triggered.
|
||||
*/
|
||||
if (unlikely(test_bit(UNLOADING, &base_vha->dpc_flags)))
|
||||
return QLA_FUNCTION_TIMEOUT;
|
||||
|
||||
/* Check for pending interrupts. */
|
||||
qla2x00_poll(ha->rsp_q_map[0]);
|
||||
|
||||
|
@ -5238,7 +5230,7 @@ qla2x00_read_ram_word(scsi_qla_host_t *vha, uint32_t risc_addr, uint32_t *data)
|
|||
mcp->mb[8] = MSW(risc_addr);
|
||||
mcp->out_mb = MBX_8|MBX_1|MBX_0;
|
||||
mcp->in_mb = MBX_3|MBX_2|MBX_0;
|
||||
mcp->tov = 30;
|
||||
mcp->tov = MBX_TOV_SECONDS;
|
||||
mcp->flags = 0;
|
||||
rval = qla2x00_mailbox_command(vha, mcp);
|
||||
if (rval != QLA_SUCCESS) {
|
||||
|
@ -5426,7 +5418,7 @@ qla2x00_write_ram_word(scsi_qla_host_t *vha, uint32_t risc_addr, uint32_t data)
|
|||
mcp->mb[8] = MSW(risc_addr);
|
||||
mcp->out_mb = MBX_8|MBX_3|MBX_2|MBX_1|MBX_0;
|
||||
mcp->in_mb = MBX_1|MBX_0;
|
||||
mcp->tov = 30;
|
||||
mcp->tov = MBX_TOV_SECONDS;
|
||||
mcp->flags = 0;
|
||||
rval = qla2x00_mailbox_command(vha, mcp);
|
||||
if (rval != QLA_SUCCESS) {
|
||||
|
@ -5698,7 +5690,7 @@ qla24xx_set_fcp_prio(scsi_qla_host_t *vha, uint16_t loop_id, uint16_t priority,
|
|||
mcp->mb[9] = vha->vp_idx;
|
||||
mcp->out_mb = MBX_9|MBX_4|MBX_3|MBX_2|MBX_1|MBX_0;
|
||||
mcp->in_mb = MBX_4|MBX_3|MBX_1|MBX_0;
|
||||
mcp->tov = 30;
|
||||
mcp->tov = MBX_TOV_SECONDS;
|
||||
mcp->flags = 0;
|
||||
rval = qla2x00_mailbox_command(vha, mcp);
|
||||
if (mb != NULL) {
|
||||
|
@ -5785,7 +5777,7 @@ qla82xx_mbx_intr_enable(scsi_qla_host_t *vha)
|
|||
|
||||
mcp->out_mb = MBX_1|MBX_0;
|
||||
mcp->in_mb = MBX_0;
|
||||
mcp->tov = 30;
|
||||
mcp->tov = MBX_TOV_SECONDS;
|
||||
mcp->flags = 0;
|
||||
|
||||
rval = qla2x00_mailbox_command(vha, mcp);
|
||||
|
@ -5820,7 +5812,7 @@ qla82xx_mbx_intr_disable(scsi_qla_host_t *vha)
|
|||
|
||||
mcp->out_mb = MBX_1|MBX_0;
|
||||
mcp->in_mb = MBX_0;
|
||||
mcp->tov = 30;
|
||||
mcp->tov = MBX_TOV_SECONDS;
|
||||
mcp->flags = 0;
|
||||
|
||||
rval = qla2x00_mailbox_command(vha, mcp);
|
||||
|
@ -6012,7 +6004,7 @@ qla81xx_set_led_config(scsi_qla_host_t *vha, uint16_t *led_cfg)
|
|||
if (IS_QLA8031(ha))
|
||||
mcp->out_mb |= MBX_6|MBX_5|MBX_4|MBX_3;
|
||||
mcp->in_mb = MBX_0;
|
||||
mcp->tov = 30;
|
||||
mcp->tov = MBX_TOV_SECONDS;
|
||||
mcp->flags = 0;
|
||||
|
||||
rval = qla2x00_mailbox_command(vha, mcp);
|
||||
|
@ -6048,7 +6040,7 @@ qla81xx_get_led_config(scsi_qla_host_t *vha, uint16_t *led_cfg)
|
|||
mcp->in_mb = MBX_2|MBX_1|MBX_0;
|
||||
if (IS_QLA8031(ha))
|
||||
mcp->in_mb |= MBX_6|MBX_5|MBX_4|MBX_3;
|
||||
mcp->tov = 30;
|
||||
mcp->tov = MBX_TOV_SECONDS;
|
||||
mcp->flags = 0;
|
||||
|
||||
rval = qla2x00_mailbox_command(vha, mcp);
|
||||
|
|
|
@ -536,6 +536,11 @@ static int qla_nvme_post_cmd(struct nvme_fc_local_port *lport,
|
|||
struct nvme_private *priv = fd->private;
|
||||
struct qla_nvme_rport *qla_rport = rport->private;
|
||||
|
||||
if (!priv) {
|
||||
/* nvme association has been torn down */
|
||||
return rval;
|
||||
}
|
||||
|
||||
fcport = qla_rport->fcport;
|
||||
|
||||
if (!qpair || !fcport || (qpair && !qpair->fw_started) ||
|
||||
|
@ -687,7 +692,15 @@ int qla_nvme_register_hba(struct scsi_qla_host *vha)
|
|||
tmpl = &qla_nvme_fc_transport;
|
||||
|
||||
WARN_ON(vha->nvme_local_port);
|
||||
WARN_ON(ha->max_req_queues < 3);
|
||||
|
||||
if (ha->max_req_queues < 3) {
|
||||
if (!ha->flags.max_req_queue_warned)
|
||||
ql_log(ql_log_info, vha, 0x2120,
|
||||
"%s: Disabling FC-NVME due to lack of free queue pairs (%d).\n",
|
||||
__func__, ha->max_req_queues);
|
||||
ha->flags.max_req_queue_warned = 1;
|
||||
return ret;
|
||||
}
|
||||
|
||||
qla_nvme_fc_transport.max_hw_queues =
|
||||
min((uint8_t)(qla_nvme_fc_transport.max_hw_queues),
|
||||
|
|
|
@ -2017,6 +2017,11 @@ skip_pio:
|
|||
/* Determine queue resources */
|
||||
ha->max_req_queues = ha->max_rsp_queues = 1;
|
||||
ha->msix_count = QLA_BASE_VECTORS;
|
||||
|
||||
/* Check if FW supports MQ or not */
|
||||
if (!(ha->fw_attributes & BIT_6))
|
||||
goto mqiobase_exit;
|
||||
|
||||
if (!ql2xmqsupport || !ql2xnvmeenable ||
|
||||
(!IS_QLA25XX(ha) && !IS_QLA81XX(ha)))
|
||||
goto mqiobase_exit;
|
||||
|
@ -2829,10 +2834,6 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
|
|||
/* This may fail but that's ok */
|
||||
pci_enable_pcie_error_reporting(pdev);
|
||||
|
||||
/* Turn off T10-DIF when FC-NVMe is enabled */
|
||||
if (ql2xnvmeenable)
|
||||
ql2xenabledif = 0;
|
||||
|
||||
ha = kzalloc(sizeof(struct qla_hw_data), GFP_KERNEL);
|
||||
if (!ha) {
|
||||
ql_log_pci(ql_log_fatal, pdev, 0x0009,
|
||||
|
|
|
@ -1270,7 +1270,7 @@ void qlt_schedule_sess_for_deletion(struct fc_port *sess)
|
|||
|
||||
qla24xx_chk_fcp_state(sess);
|
||||
|
||||
ql_dbg(ql_dbg_tgt, sess->vha, 0xe001,
|
||||
ql_dbg(ql_dbg_disc, sess->vha, 0xe001,
|
||||
"Scheduling sess %p for deletion %8phC\n",
|
||||
sess, sess->port_name);
|
||||
|
||||
|
|
|
@ -4487,8 +4487,6 @@ static int resp_open_zone(struct scsi_cmnd *scp, struct sdebug_dev_info *devip)
|
|||
goto fini;
|
||||
}
|
||||
|
||||
if (zc == ZC2_IMPLICIT_OPEN)
|
||||
zbc_close_zone(devip, zsp);
|
||||
zbc_open_zone(devip, zsp, true);
|
||||
fini:
|
||||
write_unlock(macc_lckp);
|
||||
|
@ -5500,9 +5498,11 @@ static int schedule_resp(struct scsi_cmnd *cmnd, struct sdebug_dev_info *devip,
|
|||
u64 d = ktime_get_boottime_ns() - ns_from_boot;
|
||||
|
||||
if (kt <= d) { /* elapsed duration >= kt */
|
||||
spin_lock_irqsave(&sqp->qc_lock, iflags);
|
||||
sqcp->a_cmnd = NULL;
|
||||
atomic_dec(&devip->num_in_q);
|
||||
clear_bit(k, sqp->in_use_bm);
|
||||
spin_unlock_irqrestore(&sqp->qc_lock, iflags);
|
||||
if (new_sd_dp)
|
||||
kfree(sd_dp);
|
||||
/* call scsi_done() from this thread */
|
||||
|
|
|
@ -38,6 +38,7 @@ static int ti_j721e_ufs_probe(struct platform_device *pdev)
|
|||
/* Select MPHY refclk frequency */
|
||||
clk = devm_clk_get(dev, NULL);
|
||||
if (IS_ERR(clk)) {
|
||||
ret = PTR_ERR(clk);
|
||||
dev_err(dev, "Cannot claim MPHY clock.\n");
|
||||
goto clk_err;
|
||||
}
|
||||
|
|
|
@ -257,7 +257,7 @@ static int ufs_mtk_wait_link_state(struct ufs_hba *hba, u32 state,
|
|||
ktime_t timeout, time_checked;
|
||||
u32 val;
|
||||
|
||||
timeout = ktime_add_us(ktime_get(), ms_to_ktime(max_wait_ms));
|
||||
timeout = ktime_add_ms(ktime_get(), max_wait_ms);
|
||||
do {
|
||||
time_checked = ktime_get();
|
||||
ufshcd_writel(hba, 0x20, REG_UFS_DEBUG_SEL);
|
||||
|
|
|
@ -44,11 +44,23 @@ static int ufs_intel_link_startup_notify(struct ufs_hba *hba,
|
|||
return err;
|
||||
}
|
||||
|
||||
static int ufs_intel_ehl_init(struct ufs_hba *hba)
|
||||
{
|
||||
hba->quirks |= UFSHCD_QUIRK_BROKEN_AUTO_HIBERN8;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct ufs_hba_variant_ops ufs_intel_cnl_hba_vops = {
|
||||
.name = "intel-pci",
|
||||
.link_startup_notify = ufs_intel_link_startup_notify,
|
||||
};
|
||||
|
||||
static struct ufs_hba_variant_ops ufs_intel_ehl_hba_vops = {
|
||||
.name = "intel-pci",
|
||||
.init = ufs_intel_ehl_init,
|
||||
.link_startup_notify = ufs_intel_link_startup_notify,
|
||||
};
|
||||
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
/**
|
||||
* ufshcd_pci_suspend - suspend power management function
|
||||
|
@ -177,8 +189,8 @@ static const struct dev_pm_ops ufshcd_pci_pm_ops = {
|
|||
static const struct pci_device_id ufshcd_pci_tbl[] = {
|
||||
{ PCI_VENDOR_ID_SAMSUNG, 0xC00C, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
|
||||
{ PCI_VDEVICE(INTEL, 0x9DFA), (kernel_ulong_t)&ufs_intel_cnl_hba_vops },
|
||||
{ PCI_VDEVICE(INTEL, 0x4B41), (kernel_ulong_t)&ufs_intel_cnl_hba_vops },
|
||||
{ PCI_VDEVICE(INTEL, 0x4B43), (kernel_ulong_t)&ufs_intel_cnl_hba_vops },
|
||||
{ PCI_VDEVICE(INTEL, 0x4B41), (kernel_ulong_t)&ufs_intel_ehl_hba_vops },
|
||||
{ PCI_VDEVICE(INTEL, 0x4B43), (kernel_ulong_t)&ufs_intel_ehl_hba_vops },
|
||||
{ } /* terminate list */
|
||||
};
|
||||
|
||||
|
|
|
@ -1579,6 +1579,7 @@ unblock_reqs:
|
|||
int ufshcd_hold(struct ufs_hba *hba, bool async)
|
||||
{
|
||||
int rc = 0;
|
||||
bool flush_result;
|
||||
unsigned long flags;
|
||||
|
||||
if (!ufshcd_is_clkgating_allowed(hba))
|
||||
|
@ -1605,7 +1606,9 @@ start:
|
|||
break;
|
||||
}
|
||||
spin_unlock_irqrestore(hba->host->host_lock, flags);
|
||||
flush_work(&hba->clk_gating.ungate_work);
|
||||
flush_result = flush_work(&hba->clk_gating.ungate_work);
|
||||
if (hba->clk_gating.is_suspended && !flush_result)
|
||||
goto out;
|
||||
spin_lock_irqsave(hba->host->host_lock, flags);
|
||||
goto start;
|
||||
}
|
||||
|
@ -6144,7 +6147,7 @@ static irqreturn_t ufshcd_sl_intr(struct ufs_hba *hba, u32 intr_status)
|
|||
*/
|
||||
static irqreturn_t ufshcd_intr(int irq, void *__hba)
|
||||
{
|
||||
u32 intr_status, enabled_intr_status;
|
||||
u32 intr_status, enabled_intr_status = 0;
|
||||
irqreturn_t retval = IRQ_NONE;
|
||||
struct ufs_hba *hba = __hba;
|
||||
int retries = hba->nutrs;
|
||||
|
@ -6160,7 +6163,7 @@ static irqreturn_t ufshcd_intr(int irq, void *__hba)
|
|||
* read, make sure we handle them by checking the interrupt status
|
||||
* again in a loop until we process all of the reqs before returning.
|
||||
*/
|
||||
do {
|
||||
while (intr_status && retries--) {
|
||||
enabled_intr_status =
|
||||
intr_status & ufshcd_readl(hba, REG_INTERRUPT_ENABLE);
|
||||
if (intr_status)
|
||||
|
@ -6169,9 +6172,9 @@ static irqreturn_t ufshcd_intr(int irq, void *__hba)
|
|||
retval |= ufshcd_sl_intr(hba, enabled_intr_status);
|
||||
|
||||
intr_status = ufshcd_readl(hba, REG_INTERRUPT_STATUS);
|
||||
} while (intr_status && --retries);
|
||||
}
|
||||
|
||||
if (retval == IRQ_NONE) {
|
||||
if (enabled_intr_status && retval == IRQ_NONE) {
|
||||
dev_err(hba->dev, "%s: Unhandled interrupt 0x%08x\n",
|
||||
__func__, intr_status);
|
||||
ufshcd_dump_regs(hba, 0, UFSHCI_REG_SPACE_SIZE, "host_regs: ");
|
||||
|
@ -6711,14 +6714,8 @@ static int ufshcd_abort(struct scsi_cmnd *cmd)
|
|||
goto out;
|
||||
}
|
||||
|
||||
if (!(reg & (1 << tag))) {
|
||||
dev_err(hba->dev,
|
||||
"%s: cmd was completed, but without a notifying intr, tag = %d",
|
||||
__func__, tag);
|
||||
}
|
||||
|
||||
/* Print Transfer Request of aborted task */
|
||||
dev_err(hba->dev, "%s: Device abort task at tag %d\n", __func__, tag);
|
||||
dev_info(hba->dev, "%s: Device abort task at tag %d\n", __func__, tag);
|
||||
|
||||
/*
|
||||
* Print detailed info about aborted request.
|
||||
|
@ -6739,22 +6736,25 @@ static int ufshcd_abort(struct scsi_cmnd *cmd)
|
|||
}
|
||||
hba->req_abort_count++;
|
||||
|
||||
/* Skip task abort in case previous aborts failed and report failure */
|
||||
if (lrbp->req_abort_skip) {
|
||||
err = -EIO;
|
||||
goto out;
|
||||
if (!(reg & (1 << tag))) {
|
||||
dev_err(hba->dev,
|
||||
"%s: cmd was completed, but without a notifying intr, tag = %d",
|
||||
__func__, tag);
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
err = ufshcd_try_to_abort_task(hba, tag);
|
||||
if (err)
|
||||
goto out;
|
||||
/* Skip task abort in case previous aborts failed and report failure */
|
||||
if (lrbp->req_abort_skip)
|
||||
err = -EIO;
|
||||
else
|
||||
err = ufshcd_try_to_abort_task(hba, tag);
|
||||
|
||||
spin_lock_irqsave(host->host_lock, flags);
|
||||
__ufshcd_transfer_req_compl(hba, (1UL << tag));
|
||||
spin_unlock_irqrestore(host->host_lock, flags);
|
||||
|
||||
out:
|
||||
if (!err) {
|
||||
cleanup:
|
||||
spin_lock_irqsave(host->host_lock, flags);
|
||||
__ufshcd_transfer_req_compl(hba, (1UL << tag));
|
||||
spin_unlock_irqrestore(host->host_lock, flags);
|
||||
out:
|
||||
err = SUCCESS;
|
||||
} else {
|
||||
dev_err(hba->dev, "%s: failed with err %d\n", __func__, err);
|
||||
|
|
|
@ -531,10 +531,17 @@ enum ufshcd_quirks {
|
|||
*/
|
||||
UFSHCD_QUIRK_BROKEN_OCS_FATAL_ERROR = 1 << 10,
|
||||
|
||||
/*
|
||||
* This quirk needs to be enabled if the host controller has
|
||||
* auto-hibernate capability but it doesn't work.
|
||||
*/
|
||||
UFSHCD_QUIRK_BROKEN_AUTO_HIBERN8 = 1 << 11,
|
||||
|
||||
/*
|
||||
* This quirk needs to disable manual flush for write booster
|
||||
*/
|
||||
UFSHCI_QUIRK_SKIP_MANUAL_WB_FLUSH_CTRL = 1 << 11,
|
||||
UFSHCI_QUIRK_SKIP_MANUAL_WB_FLUSH_CTRL = 1 << 12,
|
||||
|
||||
};
|
||||
|
||||
enum ufshcd_caps {
|
||||
|
@ -824,7 +831,8 @@ return true;
|
|||
|
||||
static inline bool ufshcd_is_auto_hibern8_supported(struct ufs_hba *hba)
|
||||
{
|
||||
return (hba->capabilities & MASK_AUTO_HIBERN8_SUPPORT);
|
||||
return (hba->capabilities & MASK_AUTO_HIBERN8_SUPPORT) &&
|
||||
!(hba->quirks & UFSHCD_QUIRK_BROKEN_AUTO_HIBERN8);
|
||||
}
|
||||
|
||||
static inline bool ufshcd_is_auto_hibern8_enabled(struct ufs_hba *hba)
|
||||
|
|
|
@ -1389,14 +1389,27 @@ static u32 iscsit_do_crypto_hash_sg(
|
|||
sg = cmd->first_data_sg;
|
||||
page_off = cmd->first_data_sg_off;
|
||||
|
||||
if (data_length && page_off) {
|
||||
struct scatterlist first_sg;
|
||||
u32 len = min_t(u32, data_length, sg->length - page_off);
|
||||
|
||||
sg_init_table(&first_sg, 1);
|
||||
sg_set_page(&first_sg, sg_page(sg), len, sg->offset + page_off);
|
||||
|
||||
ahash_request_set_crypt(hash, &first_sg, NULL, len);
|
||||
crypto_ahash_update(hash);
|
||||
|
||||
data_length -= len;
|
||||
sg = sg_next(sg);
|
||||
}
|
||||
|
||||
while (data_length) {
|
||||
u32 cur_len = min_t(u32, data_length, (sg->length - page_off));
|
||||
u32 cur_len = min_t(u32, data_length, sg->length);
|
||||
|
||||
ahash_request_set_crypt(hash, sg, NULL, cur_len);
|
||||
crypto_ahash_update(hash);
|
||||
|
||||
data_length -= cur_len;
|
||||
page_off = 0;
|
||||
/* iscsit_map_iovec has already checked for invalid sg pointers */
|
||||
sg = sg_next(sg);
|
||||
}
|
||||
|
|
|
@ -1149,7 +1149,7 @@ void iscsit_free_conn(struct iscsi_conn *conn)
|
|||
}
|
||||
|
||||
void iscsi_target_login_sess_out(struct iscsi_conn *conn,
|
||||
struct iscsi_np *np, bool zero_tsih, bool new_sess)
|
||||
bool zero_tsih, bool new_sess)
|
||||
{
|
||||
if (!new_sess)
|
||||
goto old_sess_out;
|
||||
|
@ -1167,7 +1167,6 @@ void iscsi_target_login_sess_out(struct iscsi_conn *conn,
|
|||
conn->sess = NULL;
|
||||
|
||||
old_sess_out:
|
||||
iscsi_stop_login_thread_timer(np);
|
||||
/*
|
||||
* If login negotiation fails check if the Time2Retain timer
|
||||
* needs to be restarted.
|
||||
|
@ -1407,8 +1406,9 @@ static int __iscsi_target_login_thread(struct iscsi_np *np)
|
|||
new_sess_out:
|
||||
new_sess = true;
|
||||
old_sess_out:
|
||||
iscsi_stop_login_thread_timer(np);
|
||||
tpg_np = conn->tpg_np;
|
||||
iscsi_target_login_sess_out(conn, np, zero_tsih, new_sess);
|
||||
iscsi_target_login_sess_out(conn, zero_tsih, new_sess);
|
||||
new_sess = false;
|
||||
|
||||
if (tpg) {
|
||||
|
|
|
@ -22,8 +22,7 @@ extern int iscsit_put_login_tx(struct iscsi_conn *, struct iscsi_login *, u32);
|
|||
extern void iscsit_free_conn(struct iscsi_conn *);
|
||||
extern int iscsit_start_kthreads(struct iscsi_conn *);
|
||||
extern void iscsi_post_login_handler(struct iscsi_np *, struct iscsi_conn *, u8);
|
||||
extern void iscsi_target_login_sess_out(struct iscsi_conn *, struct iscsi_np *,
|
||||
bool, bool);
|
||||
extern void iscsi_target_login_sess_out(struct iscsi_conn *, bool, bool);
|
||||
extern int iscsi_target_login_thread(void *);
|
||||
extern void iscsi_handle_login_thread_timeout(struct timer_list *t);
|
||||
|
||||
|
|
|
@ -535,12 +535,11 @@ static bool iscsi_target_sk_check_and_clear(struct iscsi_conn *conn, unsigned in
|
|||
|
||||
static void iscsi_target_login_drop(struct iscsi_conn *conn, struct iscsi_login *login)
|
||||
{
|
||||
struct iscsi_np *np = login->np;
|
||||
bool zero_tsih = login->zero_tsih;
|
||||
|
||||
iscsi_remove_failed_auth_entry(conn);
|
||||
iscsi_target_nego_release(conn);
|
||||
iscsi_target_login_sess_out(conn, np, zero_tsih, true);
|
||||
iscsi_target_login_sess_out(conn, zero_tsih, true);
|
||||
}
|
||||
|
||||
struct conn_timeout {
|
||||
|
|
Загрузка…
Ссылка в новой задаче