Merge branch '5.16/scsi-fixes' into 5.17/scsi-staging
Pull in the 5.16 fixes branch to resolve a conflict in the UFS driver core. Conflicts: drivers/scsi/ufs/ufshcd.c Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
This commit is contained in:
commit
87f77d37d3
@ -5090,14 +5090,9 @@ lpfc_cmpl_els_logo_acc(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
|
||||
/* NPort Recovery mode or node is just allocated */
|
||||
if (!lpfc_nlp_not_used(ndlp)) {
|
||||
/* A LOGO is completing and the node is in NPR state.
|
||||
* If this a fabric node that cleared its transport
|
||||
* registration, release the rpi.
|
||||
* Just unregister the RPI because the node is still
|
||||
* required.
|
||||
*/
|
||||
spin_lock_irq(&ndlp->lock);
|
||||
ndlp->nlp_flag &= ~NLP_NPR_2B_DISC;
|
||||
if (phba->sli_rev == LPFC_SLI_REV4)
|
||||
ndlp->nlp_flag |= NLP_RELEASE_RPI;
|
||||
spin_unlock_irq(&ndlp->lock);
|
||||
lpfc_unreg_rpi(vport, ndlp);
|
||||
} else {
|
||||
/* Indicate the node has already released, should
|
||||
|
@ -639,8 +639,8 @@ static void _base_sync_drv_fw_timestamp(struct MPT3SAS_ADAPTER *ioc)
|
||||
mpi_request->IOCParameter = MPI26_SET_IOC_PARAMETER_SYNC_TIMESTAMP;
|
||||
current_time = ktime_get_real();
|
||||
TimeStamp = ktime_to_ms(current_time);
|
||||
mpi_request->Reserved7 = cpu_to_le32(TimeStamp & 0xFFFFFFFF);
|
||||
mpi_request->IOCParameterValue = cpu_to_le32(TimeStamp >> 32);
|
||||
mpi_request->Reserved7 = cpu_to_le32(TimeStamp >> 32);
|
||||
mpi_request->IOCParameterValue = cpu_to_le32(TimeStamp & 0xFFFFFFFF);
|
||||
init_completion(&ioc->scsih_cmds.done);
|
||||
ioc->put_smid_default(ioc, smid);
|
||||
dinitprintk(ioc, ioc_info(ioc,
|
||||
|
@ -142,6 +142,8 @@
|
||||
|
||||
#define MPT_MAX_CALLBACKS 32
|
||||
|
||||
#define MPT_MAX_HBA_NUM_PHYS 32
|
||||
|
||||
#define INTERNAL_CMDS_COUNT 10 /* reserved cmds */
|
||||
/* reserved for issuing internally framed scsi io cmds */
|
||||
#define INTERNAL_SCSIIO_CMDS_COUNT 3
|
||||
@ -798,6 +800,7 @@ struct _sas_phy {
|
||||
* @enclosure_handle: handle for this a member of an enclosure
|
||||
* @device_info: bitwise defining capabilities of this sas_host/expander
|
||||
* @responding: used in _scsih_expander_device_mark_responding
|
||||
* @nr_phys_allocated: Allocated memory for this many count phys
|
||||
* @phy: a list of phys that make up this sas_host/expander
|
||||
* @sas_port_list: list of ports attached to this sas_host/expander
|
||||
* @port: hba port entry containing node's port number info
|
||||
@ -813,6 +816,7 @@ struct _sas_node {
|
||||
u16 enclosure_handle;
|
||||
u64 enclosure_logical_id;
|
||||
u8 responding;
|
||||
u8 nr_phys_allocated;
|
||||
struct hba_port *port;
|
||||
struct _sas_phy *phy;
|
||||
struct list_head sas_port_list;
|
||||
|
@ -3869,7 +3869,7 @@ _scsih_ublock_io_device(struct MPT3SAS_ADAPTER *ioc,
|
||||
|
||||
shost_for_each_device(sdev, ioc->shost) {
|
||||
sas_device_priv_data = sdev->hostdata;
|
||||
if (!sas_device_priv_data)
|
||||
if (!sas_device_priv_data || !sas_device_priv_data->sas_target)
|
||||
continue;
|
||||
if (sas_device_priv_data->sas_target->sas_address
|
||||
!= sas_address)
|
||||
@ -6406,11 +6406,26 @@ _scsih_sas_port_refresh(struct MPT3SAS_ADAPTER *ioc)
|
||||
int i, j, count = 0, lcount = 0;
|
||||
int ret;
|
||||
u64 sas_addr;
|
||||
u8 num_phys;
|
||||
|
||||
drsprintk(ioc, ioc_info(ioc,
|
||||
"updating ports for sas_host(0x%016llx)\n",
|
||||
(unsigned long long)ioc->sas_hba.sas_address));
|
||||
|
||||
mpt3sas_config_get_number_hba_phys(ioc, &num_phys);
|
||||
if (!num_phys) {
|
||||
ioc_err(ioc, "failure at %s:%d/%s()!\n",
|
||||
__FILE__, __LINE__, __func__);
|
||||
return;
|
||||
}
|
||||
|
||||
if (num_phys > ioc->sas_hba.nr_phys_allocated) {
|
||||
ioc_err(ioc, "failure at %s:%d/%s()!\n",
|
||||
__FILE__, __LINE__, __func__);
|
||||
return;
|
||||
}
|
||||
ioc->sas_hba.num_phys = num_phys;
|
||||
|
||||
port_table = kcalloc(ioc->sas_hba.num_phys,
|
||||
sizeof(struct hba_port), GFP_KERNEL);
|
||||
if (!port_table)
|
||||
@ -6611,6 +6626,30 @@ _scsih_sas_host_refresh(struct MPT3SAS_ADAPTER *ioc)
|
||||
ioc->sas_hba.phy[i].hba_vphy = 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* Add new HBA phys to STL if these new phys got added as part
|
||||
* of HBA Firmware upgrade/downgrade operation.
|
||||
*/
|
||||
if (!ioc->sas_hba.phy[i].phy) {
|
||||
if ((mpt3sas_config_get_phy_pg0(ioc, &mpi_reply,
|
||||
&phy_pg0, i))) {
|
||||
ioc_err(ioc, "failure at %s:%d/%s()!\n",
|
||||
__FILE__, __LINE__, __func__);
|
||||
continue;
|
||||
}
|
||||
ioc_status = le16_to_cpu(mpi_reply.IOCStatus) &
|
||||
MPI2_IOCSTATUS_MASK;
|
||||
if (ioc_status != MPI2_IOCSTATUS_SUCCESS) {
|
||||
ioc_err(ioc, "failure at %s:%d/%s()!\n",
|
||||
__FILE__, __LINE__, __func__);
|
||||
continue;
|
||||
}
|
||||
ioc->sas_hba.phy[i].phy_id = i;
|
||||
mpt3sas_transport_add_host_phy(ioc,
|
||||
&ioc->sas_hba.phy[i], phy_pg0,
|
||||
ioc->sas_hba.parent_dev);
|
||||
continue;
|
||||
}
|
||||
ioc->sas_hba.phy[i].handle = ioc->sas_hba.handle;
|
||||
attached_handle = le16_to_cpu(sas_iounit_pg0->PhyData[i].
|
||||
AttachedDevHandle);
|
||||
@ -6622,6 +6661,19 @@ _scsih_sas_host_refresh(struct MPT3SAS_ADAPTER *ioc)
|
||||
attached_handle, i, link_rate,
|
||||
ioc->sas_hba.phy[i].port);
|
||||
}
|
||||
/*
|
||||
* Clear the phy details if this phy got disabled as part of
|
||||
* HBA Firmware upgrade/downgrade operation.
|
||||
*/
|
||||
for (i = ioc->sas_hba.num_phys;
|
||||
i < ioc->sas_hba.nr_phys_allocated; i++) {
|
||||
if (ioc->sas_hba.phy[i].phy &&
|
||||
ioc->sas_hba.phy[i].phy->negotiated_linkrate >=
|
||||
SAS_LINK_RATE_1_5_GBPS)
|
||||
mpt3sas_transport_update_links(ioc,
|
||||
ioc->sas_hba.sas_address, 0, i,
|
||||
MPI2_SAS_NEG_LINK_RATE_PHY_DISABLED, NULL);
|
||||
}
|
||||
out:
|
||||
kfree(sas_iounit_pg0);
|
||||
}
|
||||
@ -6654,7 +6706,10 @@ _scsih_sas_host_add(struct MPT3SAS_ADAPTER *ioc)
|
||||
__FILE__, __LINE__, __func__);
|
||||
return;
|
||||
}
|
||||
ioc->sas_hba.phy = kcalloc(num_phys,
|
||||
|
||||
ioc->sas_hba.nr_phys_allocated = max_t(u8,
|
||||
MPT_MAX_HBA_NUM_PHYS, num_phys);
|
||||
ioc->sas_hba.phy = kcalloc(ioc->sas_hba.nr_phys_allocated,
|
||||
sizeof(struct _sas_phy), GFP_KERNEL);
|
||||
if (!ioc->sas_hba.phy) {
|
||||
ioc_err(ioc, "failure at %s:%d/%s()!\n",
|
||||
|
@ -282,12 +282,12 @@ static int pm8001_alloc(struct pm8001_hba_info *pm8001_ha,
|
||||
if (rc) {
|
||||
pm8001_dbg(pm8001_ha, FAIL,
|
||||
"pm8001_setup_irq failed [ret: %d]\n", rc);
|
||||
goto err_out_shost;
|
||||
goto err_out;
|
||||
}
|
||||
/* Request Interrupt */
|
||||
rc = pm8001_request_irq(pm8001_ha);
|
||||
if (rc)
|
||||
goto err_out_shost;
|
||||
goto err_out;
|
||||
|
||||
count = pm8001_ha->max_q_num;
|
||||
/* Queues are chosen based on the number of cores/msix availability */
|
||||
@ -423,8 +423,6 @@ static int pm8001_alloc(struct pm8001_hba_info *pm8001_ha,
|
||||
pm8001_tag_init(pm8001_ha);
|
||||
return 0;
|
||||
|
||||
err_out_shost:
|
||||
scsi_remove_host(pm8001_ha->shost);
|
||||
err_out_nodev:
|
||||
for (i = 0; i < pm8001_ha->max_memcnt; i++) {
|
||||
if (pm8001_ha->memoryMap.region[i].virt_ptr != NULL) {
|
||||
|
@ -732,7 +732,6 @@ static void qedi_process_cmd_cleanup_resp(struct qedi_ctx *qedi,
|
||||
{
|
||||
struct qedi_work_map *work, *work_tmp;
|
||||
u32 proto_itt = cqe->itid;
|
||||
itt_t protoitt = 0;
|
||||
int found = 0;
|
||||
struct qedi_cmd *qedi_cmd = NULL;
|
||||
u32 iscsi_cid;
|
||||
@ -812,16 +811,12 @@ unlock:
|
||||
return;
|
||||
|
||||
check_cleanup_reqs:
|
||||
if (qedi_conn->cmd_cleanup_req > 0) {
|
||||
QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_TID,
|
||||
if (atomic_inc_return(&qedi_conn->cmd_cleanup_cmpl) ==
|
||||
qedi_conn->cmd_cleanup_req) {
|
||||
QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_SCSI_TM,
|
||||
"Freeing tid=0x%x for cid=0x%x\n",
|
||||
cqe->itid, qedi_conn->iscsi_conn_id);
|
||||
qedi_conn->cmd_cleanup_cmpl++;
|
||||
wake_up(&qedi_conn->wait_queue);
|
||||
} else {
|
||||
QEDI_ERR(&qedi->dbg_ctx,
|
||||
"Delayed or untracked cleanup response, itt=0x%x, tid=0x%x, cid=0x%x\n",
|
||||
protoitt, cqe->itid, qedi_conn->iscsi_conn_id);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1163,7 +1158,7 @@ int qedi_cleanup_all_io(struct qedi_ctx *qedi, struct qedi_conn *qedi_conn,
|
||||
}
|
||||
|
||||
qedi_conn->cmd_cleanup_req = 0;
|
||||
qedi_conn->cmd_cleanup_cmpl = 0;
|
||||
atomic_set(&qedi_conn->cmd_cleanup_cmpl, 0);
|
||||
|
||||
QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_SCSI_TM,
|
||||
"active_cmd_count=%d, cid=0x%x, in_recovery=%d, lun_reset=%d\n",
|
||||
@ -1215,16 +1210,15 @@ int qedi_cleanup_all_io(struct qedi_ctx *qedi, struct qedi_conn *qedi_conn,
|
||||
qedi_conn->iscsi_conn_id);
|
||||
|
||||
rval = wait_event_interruptible_timeout(qedi_conn->wait_queue,
|
||||
((qedi_conn->cmd_cleanup_req ==
|
||||
qedi_conn->cmd_cleanup_cmpl) ||
|
||||
test_bit(QEDI_IN_RECOVERY,
|
||||
&qedi->flags)),
|
||||
(qedi_conn->cmd_cleanup_req ==
|
||||
atomic_read(&qedi_conn->cmd_cleanup_cmpl)) ||
|
||||
test_bit(QEDI_IN_RECOVERY, &qedi->flags),
|
||||
5 * HZ);
|
||||
if (rval) {
|
||||
QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_SCSI_TM,
|
||||
"i/o cmd_cleanup_req=%d, equal to cmd_cleanup_cmpl=%d, cid=0x%x\n",
|
||||
qedi_conn->cmd_cleanup_req,
|
||||
qedi_conn->cmd_cleanup_cmpl,
|
||||
atomic_read(&qedi_conn->cmd_cleanup_cmpl),
|
||||
qedi_conn->iscsi_conn_id);
|
||||
|
||||
return 0;
|
||||
@ -1233,7 +1227,7 @@ int qedi_cleanup_all_io(struct qedi_ctx *qedi, struct qedi_conn *qedi_conn,
|
||||
QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_SCSI_TM,
|
||||
"i/o cmd_cleanup_req=%d, not equal to cmd_cleanup_cmpl=%d, cid=0x%x\n",
|
||||
qedi_conn->cmd_cleanup_req,
|
||||
qedi_conn->cmd_cleanup_cmpl,
|
||||
atomic_read(&qedi_conn->cmd_cleanup_cmpl),
|
||||
qedi_conn->iscsi_conn_id);
|
||||
|
||||
iscsi_host_for_each_session(qedi->shost,
|
||||
@ -1243,9 +1237,8 @@ int qedi_cleanup_all_io(struct qedi_ctx *qedi, struct qedi_conn *qedi_conn,
|
||||
/* Enable IOs for all other sessions except current.*/
|
||||
if (!wait_event_interruptible_timeout(qedi_conn->wait_queue,
|
||||
(qedi_conn->cmd_cleanup_req ==
|
||||
qedi_conn->cmd_cleanup_cmpl) ||
|
||||
test_bit(QEDI_IN_RECOVERY,
|
||||
&qedi->flags),
|
||||
atomic_read(&qedi_conn->cmd_cleanup_cmpl)) ||
|
||||
test_bit(QEDI_IN_RECOVERY, &qedi->flags),
|
||||
5 * HZ)) {
|
||||
iscsi_host_for_each_session(qedi->shost,
|
||||
qedi_mark_device_available);
|
||||
@ -1266,7 +1259,7 @@ void qedi_clearsq(struct qedi_ctx *qedi, struct qedi_conn *qedi_conn,
|
||||
|
||||
qedi_ep = qedi_conn->ep;
|
||||
qedi_conn->cmd_cleanup_req = 0;
|
||||
qedi_conn->cmd_cleanup_cmpl = 0;
|
||||
atomic_set(&qedi_conn->cmd_cleanup_cmpl, 0);
|
||||
|
||||
if (!qedi_ep) {
|
||||
QEDI_WARN(&qedi->dbg_ctx,
|
||||
|
@ -412,7 +412,7 @@ static int qedi_conn_bind(struct iscsi_cls_session *cls_session,
|
||||
qedi_conn->iscsi_conn_id = qedi_ep->iscsi_cid;
|
||||
qedi_conn->fw_cid = qedi_ep->fw_cid;
|
||||
qedi_conn->cmd_cleanup_req = 0;
|
||||
qedi_conn->cmd_cleanup_cmpl = 0;
|
||||
atomic_set(&qedi_conn->cmd_cleanup_cmpl, 0);
|
||||
|
||||
if (qedi_bind_conn_to_iscsi_cid(qedi, qedi_conn)) {
|
||||
rc = -EINVAL;
|
||||
|
@ -155,7 +155,7 @@ struct qedi_conn {
|
||||
spinlock_t list_lock; /* internal conn lock */
|
||||
u32 active_cmd_count;
|
||||
u32 cmd_cleanup_req;
|
||||
u32 cmd_cleanup_cmpl;
|
||||
atomic_t cmd_cleanup_cmpl;
|
||||
|
||||
u32 iscsi_conn_id;
|
||||
int itt;
|
||||
|
@ -2491,6 +2491,9 @@ ql_dbg(uint level, scsi_qla_host_t *vha, uint id, const char *fmt, ...)
|
||||
struct va_format vaf;
|
||||
char pbuf[64];
|
||||
|
||||
if (!ql_mask_match(level) && !trace_ql_dbg_log_enabled())
|
||||
return;
|
||||
|
||||
va_start(va, fmt);
|
||||
|
||||
vaf.fmt = fmt;
|
||||
|
@ -865,7 +865,7 @@ qla_edif_app_getfcinfo(scsi_qla_host_t *vha, struct bsg_job *bsg_job)
|
||||
"APP request entry - portid=%06x.\n", tdid.b24);
|
||||
|
||||
/* Ran out of space */
|
||||
if (pcnt > app_req.num_ports)
|
||||
if (pcnt >= app_req.num_ports)
|
||||
break;
|
||||
|
||||
if (tdid.b24 != 0 && tdid.b24 != fcport->d_id.b24)
|
||||
|
@ -1695,10 +1695,8 @@ qla2x00_get_adapter_id(scsi_qla_host_t *vha, uint16_t *id, uint8_t *al_pa,
|
||||
mcp->in_mb |= MBX_13|MBX_12|MBX_11|MBX_10;
|
||||
if (IS_FWI2_CAPABLE(vha->hw))
|
||||
mcp->in_mb |= MBX_19|MBX_18|MBX_17|MBX_16;
|
||||
if (IS_QLA27XX(vha->hw) || IS_QLA28XX(vha->hw)) {
|
||||
mcp->in_mb |= MBX_15;
|
||||
mcp->out_mb |= MBX_7|MBX_21|MBX_22|MBX_23;
|
||||
}
|
||||
if (IS_QLA27XX(vha->hw) || IS_QLA28XX(vha->hw))
|
||||
mcp->in_mb |= MBX_15|MBX_21|MBX_22|MBX_23;
|
||||
|
||||
mcp->tov = MBX_TOV_SECONDS;
|
||||
mcp->flags = 0;
|
||||
|
@ -1189,7 +1189,7 @@ static int p_fill_from_dev_buffer(struct scsi_cmnd *scp, const void *arr,
|
||||
__func__, off_dst, scsi_bufflen(scp), act_len,
|
||||
scsi_get_resid(scp));
|
||||
n = scsi_bufflen(scp) - (off_dst + act_len);
|
||||
scsi_set_resid(scp, min_t(int, scsi_get_resid(scp), n));
|
||||
scsi_set_resid(scp, min_t(u32, scsi_get_resid(scp), n));
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -1562,7 +1562,8 @@ static int resp_inquiry(struct scsi_cmnd *scp, struct sdebug_dev_info *devip)
|
||||
unsigned char pq_pdt;
|
||||
unsigned char *arr;
|
||||
unsigned char *cmd = scp->cmnd;
|
||||
int alloc_len, n, ret;
|
||||
u32 alloc_len, n;
|
||||
int ret;
|
||||
bool have_wlun, is_disk, is_zbc, is_disk_zbc;
|
||||
|
||||
alloc_len = get_unaligned_be16(cmd + 3);
|
||||
@ -1585,7 +1586,8 @@ static int resp_inquiry(struct scsi_cmnd *scp, struct sdebug_dev_info *devip)
|
||||
kfree(arr);
|
||||
return check_condition_result;
|
||||
} else if (0x1 & cmd[1]) { /* EVPD bit set */
|
||||
int lu_id_num, port_group_id, target_dev_id, len;
|
||||
int lu_id_num, port_group_id, target_dev_id;
|
||||
u32 len;
|
||||
char lu_id_str[6];
|
||||
int host_no = devip->sdbg_host->shost->host_no;
|
||||
|
||||
@ -1676,9 +1678,9 @@ static int resp_inquiry(struct scsi_cmnd *scp, struct sdebug_dev_info *devip)
|
||||
kfree(arr);
|
||||
return check_condition_result;
|
||||
}
|
||||
len = min(get_unaligned_be16(arr + 2) + 4, alloc_len);
|
||||
len = min_t(u32, get_unaligned_be16(arr + 2) + 4, alloc_len);
|
||||
ret = fill_from_dev_buffer(scp, arr,
|
||||
min(len, SDEBUG_MAX_INQ_ARR_SZ));
|
||||
min_t(u32, len, SDEBUG_MAX_INQ_ARR_SZ));
|
||||
kfree(arr);
|
||||
return ret;
|
||||
}
|
||||
@ -1714,7 +1716,7 @@ static int resp_inquiry(struct scsi_cmnd *scp, struct sdebug_dev_info *devip)
|
||||
}
|
||||
put_unaligned_be16(0x2100, arr + n); /* SPL-4 no version claimed */
|
||||
ret = fill_from_dev_buffer(scp, arr,
|
||||
min_t(int, alloc_len, SDEBUG_LONG_INQ_SZ));
|
||||
min_t(u32, alloc_len, SDEBUG_LONG_INQ_SZ));
|
||||
kfree(arr);
|
||||
return ret;
|
||||
}
|
||||
@ -1729,8 +1731,8 @@ static int resp_requests(struct scsi_cmnd *scp,
|
||||
unsigned char *cmd = scp->cmnd;
|
||||
unsigned char arr[SCSI_SENSE_BUFFERSIZE]; /* assume >= 18 bytes */
|
||||
bool dsense = !!(cmd[1] & 1);
|
||||
int alloc_len = cmd[4];
|
||||
int len = 18;
|
||||
u32 alloc_len = cmd[4];
|
||||
u32 len = 18;
|
||||
int stopped_state = atomic_read(&devip->stopped);
|
||||
|
||||
memset(arr, 0, sizeof(arr));
|
||||
@ -1774,7 +1776,7 @@ static int resp_requests(struct scsi_cmnd *scp,
|
||||
arr[7] = 0xa;
|
||||
}
|
||||
}
|
||||
return fill_from_dev_buffer(scp, arr, min_t(int, len, alloc_len));
|
||||
return fill_from_dev_buffer(scp, arr, min_t(u32, len, alloc_len));
|
||||
}
|
||||
|
||||
static int resp_start_stop(struct scsi_cmnd *scp, struct sdebug_dev_info *devip)
|
||||
@ -2312,7 +2314,8 @@ static int resp_mode_sense(struct scsi_cmnd *scp,
|
||||
{
|
||||
int pcontrol, pcode, subpcode, bd_len;
|
||||
unsigned char dev_spec;
|
||||
int alloc_len, offset, len, target_dev_id;
|
||||
u32 alloc_len, offset, len;
|
||||
int target_dev_id;
|
||||
int target = scp->device->id;
|
||||
unsigned char *ap;
|
||||
unsigned char arr[SDEBUG_MAX_MSENSE_SZ];
|
||||
@ -2468,7 +2471,7 @@ static int resp_mode_sense(struct scsi_cmnd *scp,
|
||||
arr[0] = offset - 1;
|
||||
else
|
||||
put_unaligned_be16((offset - 2), arr + 0);
|
||||
return fill_from_dev_buffer(scp, arr, min_t(int, alloc_len, offset));
|
||||
return fill_from_dev_buffer(scp, arr, min_t(u32, alloc_len, offset));
|
||||
}
|
||||
|
||||
#define SDEBUG_MAX_MSELECT_SZ 512
|
||||
@ -2499,11 +2502,11 @@ static int resp_mode_select(struct scsi_cmnd *scp,
|
||||
__func__, param_len, res);
|
||||
md_len = mselect6 ? (arr[0] + 1) : (get_unaligned_be16(arr + 0) + 2);
|
||||
bd_len = mselect6 ? arr[3] : get_unaligned_be16(arr + 6);
|
||||
if (md_len > 2) {
|
||||
off = bd_len + (mselect6 ? 4 : 8);
|
||||
if (md_len > 2 || off >= res) {
|
||||
mk_sense_invalid_fld(scp, SDEB_IN_DATA, 0, -1);
|
||||
return check_condition_result;
|
||||
}
|
||||
off = bd_len + (mselect6 ? 4 : 8);
|
||||
mpage = arr[off] & 0x3f;
|
||||
ps = !!(arr[off] & 0x80);
|
||||
if (ps) {
|
||||
@ -2583,7 +2586,8 @@ static int resp_ie_l_pg(unsigned char *arr)
|
||||
static int resp_log_sense(struct scsi_cmnd *scp,
|
||||
struct sdebug_dev_info *devip)
|
||||
{
|
||||
int ppc, sp, pcode, subpcode, alloc_len, len, n;
|
||||
int ppc, sp, pcode, subpcode;
|
||||
u32 alloc_len, len, n;
|
||||
unsigned char arr[SDEBUG_MAX_LSENSE_SZ];
|
||||
unsigned char *cmd = scp->cmnd;
|
||||
|
||||
@ -2653,9 +2657,9 @@ static int resp_log_sense(struct scsi_cmnd *scp,
|
||||
mk_sense_invalid_fld(scp, SDEB_IN_CDB, 3, -1);
|
||||
return check_condition_result;
|
||||
}
|
||||
len = min_t(int, get_unaligned_be16(arr + 2) + 4, alloc_len);
|
||||
len = min_t(u32, get_unaligned_be16(arr + 2) + 4, alloc_len);
|
||||
return fill_from_dev_buffer(scp, arr,
|
||||
min_t(int, len, SDEBUG_MAX_INQ_ARR_SZ));
|
||||
min_t(u32, len, SDEBUG_MAX_INQ_ARR_SZ));
|
||||
}
|
||||
|
||||
static inline bool sdebug_dev_is_zoned(struct sdebug_dev_info *devip)
|
||||
@ -4338,7 +4342,7 @@ static int resp_report_zones(struct scsi_cmnd *scp,
|
||||
rep_max_zones = min((alloc_len - 64) >> ilog2(RZONES_DESC_HD),
|
||||
max_zones);
|
||||
|
||||
arr = kcalloc(RZONES_DESC_HD, alloc_len, GFP_ATOMIC);
|
||||
arr = kzalloc(alloc_len, GFP_ATOMIC);
|
||||
if (!arr) {
|
||||
mk_sense_buffer(scp, ILLEGAL_REQUEST, INSUFF_RES_ASC,
|
||||
INSUFF_RES_ASCQ);
|
||||
@ -4430,7 +4434,7 @@ static int resp_report_zones(struct scsi_cmnd *scp,
|
||||
put_unaligned_be64(sdebug_capacity - 1, arr + 8);
|
||||
|
||||
rep_len = (unsigned long)desc - (unsigned long)arr;
|
||||
ret = fill_from_dev_buffer(scp, arr, min_t(int, alloc_len, rep_len));
|
||||
ret = fill_from_dev_buffer(scp, arr, min_t(u32, alloc_len, rep_len));
|
||||
|
||||
fini:
|
||||
read_unlock(macc_lckp);
|
||||
@ -4653,6 +4657,7 @@ static void zbc_rwp_zone(struct sdebug_dev_info *devip,
|
||||
struct sdeb_zone_state *zsp)
|
||||
{
|
||||
enum sdebug_z_cond zc;
|
||||
struct sdeb_store_info *sip = devip2sip(devip, false);
|
||||
|
||||
if (zbc_zone_is_conv(zsp))
|
||||
return;
|
||||
@ -4664,6 +4669,10 @@ static void zbc_rwp_zone(struct sdebug_dev_info *devip,
|
||||
if (zsp->z_cond == ZC4_CLOSED)
|
||||
devip->nr_closed--;
|
||||
|
||||
if (zsp->z_wp > zsp->z_start)
|
||||
memset(sip->storep + zsp->z_start * sdebug_sector_size, 0,
|
||||
(zsp->z_wp - zsp->z_start) * sdebug_sector_size);
|
||||
|
||||
zsp->z_non_seq_resource = false;
|
||||
zsp->z_wp = zsp->z_start;
|
||||
zsp->z_cond = ZC1_EMPTY;
|
||||
|
@ -797,6 +797,7 @@ store_state_field(struct device *dev, struct device_attribute *attr,
|
||||
int i, ret;
|
||||
struct scsi_device *sdev = to_scsi_device(dev);
|
||||
enum scsi_device_state state = 0;
|
||||
bool rescan_dev = false;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(sdev_states); i++) {
|
||||
const int len = strlen(sdev_states[i].name);
|
||||
@ -815,7 +816,16 @@ store_state_field(struct device *dev, struct device_attribute *attr,
|
||||
}
|
||||
|
||||
mutex_lock(&sdev->state_mutex);
|
||||
if (sdev->sdev_state == SDEV_RUNNING && state == SDEV_RUNNING) {
|
||||
ret = 0;
|
||||
} else {
|
||||
ret = scsi_device_set_state(sdev, state);
|
||||
if (ret == 0 && state == SDEV_RUNNING)
|
||||
rescan_dev = true;
|
||||
}
|
||||
mutex_unlock(&sdev->state_mutex);
|
||||
|
||||
if (rescan_dev) {
|
||||
/*
|
||||
* If the device state changes to SDEV_RUNNING, we need to
|
||||
* run the queue to avoid I/O hang, and rescan the device
|
||||
@ -824,11 +834,9 @@ store_state_field(struct device *dev, struct device_attribute *attr,
|
||||
* blk_mq_freeze_queue_wait() and because that call may be
|
||||
* waiting for pending I/O to finish.
|
||||
*/
|
||||
if (ret == 0 && state == SDEV_RUNNING) {
|
||||
blk_mq_run_hw_queues(sdev->request_queue, true);
|
||||
scsi_rescan_device(dev);
|
||||
}
|
||||
mutex_unlock(&sdev->state_mutex);
|
||||
|
||||
return ret == 0 ? count : -EINVAL;
|
||||
}
|
||||
|
@ -1899,12 +1899,12 @@ static void session_recovery_timedout(struct work_struct *work)
|
||||
}
|
||||
spin_unlock_irqrestore(&session->lock, flags);
|
||||
|
||||
if (session->transport->session_recovery_timedout)
|
||||
session->transport->session_recovery_timedout(session);
|
||||
|
||||
ISCSI_DBG_TRANS_SESSION(session, "Unblocking SCSI target\n");
|
||||
scsi_target_unblock(&session->dev, SDEV_TRANSPORT_OFFLINE);
|
||||
ISCSI_DBG_TRANS_SESSION(session, "Completed unblocking SCSI target\n");
|
||||
|
||||
if (session->transport->session_recovery_timedout)
|
||||
session->transport->session_recovery_timedout(session);
|
||||
}
|
||||
|
||||
static void __iscsi_unblock_session(struct work_struct *work)
|
||||
|
@ -1189,6 +1189,7 @@ static int ufs_mtk_probe(struct platform_device *pdev)
|
||||
}
|
||||
link = device_link_add(dev, &reset_pdev->dev,
|
||||
DL_FLAG_AUTOPROBE_CONSUMER);
|
||||
put_device(&reset_pdev->dev);
|
||||
if (!link) {
|
||||
dev_notice(dev, "add reset device_link fail\n");
|
||||
goto skip_reset;
|
||||
|
@ -421,6 +421,13 @@ static int ufs_intel_lkf_init(struct ufs_hba *hba)
|
||||
return err;
|
||||
}
|
||||
|
||||
static int ufs_intel_adl_init(struct ufs_hba *hba)
|
||||
{
|
||||
hba->nop_out_timeout = 200;
|
||||
hba->quirks |= UFSHCD_QUIRK_BROKEN_AUTO_HIBERN8;
|
||||
return ufs_intel_common_init(hba);
|
||||
}
|
||||
|
||||
static struct ufs_hba_variant_ops ufs_intel_cnl_hba_vops = {
|
||||
.name = "intel-pci",
|
||||
.init = ufs_intel_common_init,
|
||||
@ -449,6 +456,15 @@ static struct ufs_hba_variant_ops ufs_intel_lkf_hba_vops = {
|
||||
.device_reset = ufs_intel_device_reset,
|
||||
};
|
||||
|
||||
static struct ufs_hba_variant_ops ufs_intel_adl_hba_vops = {
|
||||
.name = "intel-pci",
|
||||
.init = ufs_intel_adl_init,
|
||||
.exit = ufs_intel_common_exit,
|
||||
.link_startup_notify = ufs_intel_link_startup_notify,
|
||||
.resume = ufs_intel_resume,
|
||||
.device_reset = ufs_intel_device_reset,
|
||||
};
|
||||
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
static int ufshcd_pci_restore(struct device *dev)
|
||||
{
|
||||
@ -561,6 +577,8 @@ static const struct pci_device_id ufshcd_pci_tbl[] = {
|
||||
{ PCI_VDEVICE(INTEL, 0x4B41), (kernel_ulong_t)&ufs_intel_ehl_hba_vops },
|
||||
{ PCI_VDEVICE(INTEL, 0x4B43), (kernel_ulong_t)&ufs_intel_ehl_hba_vops },
|
||||
{ PCI_VDEVICE(INTEL, 0x98FA), (kernel_ulong_t)&ufs_intel_lkf_hba_vops },
|
||||
{ PCI_VDEVICE(INTEL, 0x51FF), (kernel_ulong_t)&ufs_intel_adl_hba_vops },
|
||||
{ PCI_VDEVICE(INTEL, 0x54FF), (kernel_ulong_t)&ufs_intel_adl_hba_vops },
|
||||
{ } /* terminate list */
|
||||
};
|
||||
|
||||
|
@ -6483,9 +6483,8 @@ static irqreturn_t ufshcd_tmc_handler(struct ufs_hba *hba)
|
||||
irqreturn_t ret = IRQ_NONE;
|
||||
int tag;
|
||||
|
||||
pending = ufshcd_readl(hba, REG_UTP_TASK_REQ_DOOR_BELL);
|
||||
|
||||
spin_lock_irqsave(hba->host->host_lock, flags);
|
||||
pending = ufshcd_readl(hba, REG_UTP_TASK_REQ_DOOR_BELL);
|
||||
issued = hba->outstanding_tasks & ~pending;
|
||||
for_each_set_bit(tag, &issued, hba->nutmrs) {
|
||||
struct request *req = hba->tmf_rqs[tag];
|
||||
@ -6648,11 +6647,6 @@ static int __ufshcd_issue_tm_cmd(struct ufs_hba *hba,
|
||||
err = wait_for_completion_io_timeout(&wait,
|
||||
msecs_to_jiffies(TM_CMD_TIMEOUT));
|
||||
if (!err) {
|
||||
/*
|
||||
* Make sure that ufshcd_compl_tm() does not trigger a
|
||||
* use-after-free.
|
||||
*/
|
||||
req->end_io_data = NULL;
|
||||
ufshcd_add_tm_upiu_trace(hba, task_tag, UFS_TM_ERR);
|
||||
dev_err(hba->dev, "%s: task management cmd 0x%.2x timed-out\n",
|
||||
__func__, tm_function);
|
||||
|
@ -330,7 +330,7 @@ ufshpb_set_hpb_read_to_upiu(struct ufs_hba *hba, struct ufshcd_lrb *lrbp,
|
||||
cdb[0] = UFSHPB_READ;
|
||||
|
||||
if (hba->dev_quirks & UFS_DEVICE_QUIRK_SWAP_L2P_ENTRY_FOR_HPB_READ)
|
||||
ppn_tmp = swab64(ppn);
|
||||
ppn_tmp = (__force __be64)swab64((__force u64)ppn);
|
||||
|
||||
/* ppn value is stored as big-endian in the host memory */
|
||||
memcpy(&cdb[6], &ppn_tmp, sizeof(__be64));
|
||||
|
@ -520,7 +520,7 @@ static ssize_t target_fabric_port_alua_tg_pt_gp_show(struct config_item *item,
|
||||
{
|
||||
struct se_lun *lun = item_to_lun(item);
|
||||
|
||||
if (!lun || !lun->lun_se_dev)
|
||||
if (!lun->lun_se_dev)
|
||||
return -ENODEV;
|
||||
|
||||
return core_alua_show_tg_pt_gp_info(lun, page);
|
||||
@ -531,7 +531,7 @@ static ssize_t target_fabric_port_alua_tg_pt_gp_store(struct config_item *item,
|
||||
{
|
||||
struct se_lun *lun = item_to_lun(item);
|
||||
|
||||
if (!lun || !lun->lun_se_dev)
|
||||
if (!lun->lun_se_dev)
|
||||
return -ENODEV;
|
||||
|
||||
return core_alua_store_tg_pt_gp_info(lun, page, count);
|
||||
@ -542,7 +542,7 @@ static ssize_t target_fabric_port_alua_tg_pt_offline_show(
|
||||
{
|
||||
struct se_lun *lun = item_to_lun(item);
|
||||
|
||||
if (!lun || !lun->lun_se_dev)
|
||||
if (!lun->lun_se_dev)
|
||||
return -ENODEV;
|
||||
|
||||
return core_alua_show_offline_bit(lun, page);
|
||||
@ -553,7 +553,7 @@ static ssize_t target_fabric_port_alua_tg_pt_offline_store(
|
||||
{
|
||||
struct se_lun *lun = item_to_lun(item);
|
||||
|
||||
if (!lun || !lun->lun_se_dev)
|
||||
if (!lun->lun_se_dev)
|
||||
return -ENODEV;
|
||||
|
||||
return core_alua_store_offline_bit(lun, page, count);
|
||||
@ -564,7 +564,7 @@ static ssize_t target_fabric_port_alua_tg_pt_status_show(
|
||||
{
|
||||
struct se_lun *lun = item_to_lun(item);
|
||||
|
||||
if (!lun || !lun->lun_se_dev)
|
||||
if (!lun->lun_se_dev)
|
||||
return -ENODEV;
|
||||
|
||||
return core_alua_show_secondary_status(lun, page);
|
||||
@ -575,7 +575,7 @@ static ssize_t target_fabric_port_alua_tg_pt_status_store(
|
||||
{
|
||||
struct se_lun *lun = item_to_lun(item);
|
||||
|
||||
if (!lun || !lun->lun_se_dev)
|
||||
if (!lun->lun_se_dev)
|
||||
return -ENODEV;
|
||||
|
||||
return core_alua_store_secondary_status(lun, page, count);
|
||||
@ -586,7 +586,7 @@ static ssize_t target_fabric_port_alua_tg_pt_write_md_show(
|
||||
{
|
||||
struct se_lun *lun = item_to_lun(item);
|
||||
|
||||
if (!lun || !lun->lun_se_dev)
|
||||
if (!lun->lun_se_dev)
|
||||
return -ENODEV;
|
||||
|
||||
return core_alua_show_secondary_write_metadata(lun, page);
|
||||
@ -597,7 +597,7 @@ static ssize_t target_fabric_port_alua_tg_pt_write_md_store(
|
||||
{
|
||||
struct se_lun *lun = item_to_lun(item);
|
||||
|
||||
if (!lun || !lun->lun_se_dev)
|
||||
if (!lun->lun_se_dev)
|
||||
return -ENODEV;
|
||||
|
||||
return core_alua_store_secondary_write_metadata(lun, page, count);
|
||||
|
@ -40,11 +40,11 @@ static void spc_fill_alua_data(struct se_lun *lun, unsigned char *buf)
|
||||
*
|
||||
* See spc4r17 section 6.4.2 Table 135
|
||||
*/
|
||||
spin_lock(&lun->lun_tg_pt_gp_lock);
|
||||
tg_pt_gp = lun->lun_tg_pt_gp;
|
||||
rcu_read_lock();
|
||||
tg_pt_gp = rcu_dereference(lun->lun_tg_pt_gp);
|
||||
if (tg_pt_gp)
|
||||
buf[5] |= tg_pt_gp->tg_pt_gp_alua_access_type;
|
||||
spin_unlock(&lun->lun_tg_pt_gp_lock);
|
||||
rcu_read_unlock();
|
||||
}
|
||||
|
||||
static u16
|
||||
@ -325,14 +325,14 @@ check_t10_vend_desc:
|
||||
* Get the PROTOCOL IDENTIFIER as defined by spc4r17
|
||||
* section 7.5.1 Table 362
|
||||
*/
|
||||
spin_lock(&lun->lun_tg_pt_gp_lock);
|
||||
tg_pt_gp = lun->lun_tg_pt_gp;
|
||||
rcu_read_lock();
|
||||
tg_pt_gp = rcu_dereference(lun->lun_tg_pt_gp);
|
||||
if (!tg_pt_gp) {
|
||||
spin_unlock(&lun->lun_tg_pt_gp_lock);
|
||||
rcu_read_unlock();
|
||||
goto check_lu_gp;
|
||||
}
|
||||
tg_pt_gp_id = tg_pt_gp->tg_pt_gp_id;
|
||||
spin_unlock(&lun->lun_tg_pt_gp_lock);
|
||||
rcu_read_unlock();
|
||||
|
||||
buf[off] = tpg->proto_id << 4;
|
||||
buf[off++] |= 0x1; /* CODE SET == Binary */
|
||||
|
Loading…
Reference in New Issue
Block a user