mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-12-27 07:35:36 -05:00
Merge tag 'scsi-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi
Pull SCSI fixes from James Bottomley: "Three HBA driver and one upper level driver (sg) fix. The sg change is the largest, but that results mostly from moving code to avoid the described race condition" * tag 'scsi-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi: scsi: ufs: core: Add ufshcd_update_evt_hist() for UFS suspend error scsi: sg: Fix occasional bogus elapsed time that exceeds timeout scsi: mpi3mr: Read missing IOCFacts flag for reply queue full overflow scsi: scsi_debug: Fix atomic write enable module param description
This commit is contained in:
@@ -166,6 +166,7 @@ struct mpi3_ioc_facts_data {
|
||||
#define MPI3_IOCFACTS_FLAGS_SIGNED_NVDATA_REQUIRED (0x00010000)
|
||||
#define MPI3_IOCFACTS_FLAGS_DMA_ADDRESS_WIDTH_MASK (0x0000ff00)
|
||||
#define MPI3_IOCFACTS_FLAGS_DMA_ADDRESS_WIDTH_SHIFT (8)
|
||||
#define MPI3_IOCFACTS_FLAGS_MAX_REQ_PER_REPLY_QUEUE_LIMIT (0x00000040)
|
||||
#define MPI3_IOCFACTS_FLAGS_INITIAL_PORT_ENABLE_MASK (0x00000030)
|
||||
#define MPI3_IOCFACTS_FLAGS_INITIAL_PORT_ENABLE_SHIFT (4)
|
||||
#define MPI3_IOCFACTS_FLAGS_INITIAL_PORT_ENABLE_NOT_STARTED (0x00000000)
|
||||
|
||||
@@ -3158,6 +3158,8 @@ static void mpi3mr_process_factsdata(struct mpi3mr_ioc *mrioc,
|
||||
mrioc->facts.dma_mask = (facts_flags &
|
||||
MPI3_IOCFACTS_FLAGS_DMA_ADDRESS_WIDTH_MASK) >>
|
||||
MPI3_IOCFACTS_FLAGS_DMA_ADDRESS_WIDTH_SHIFT;
|
||||
mrioc->facts.max_req_limit = (facts_flags &
|
||||
MPI3_IOCFACTS_FLAGS_MAX_REQ_PER_REPLY_QUEUE_LIMIT);
|
||||
mrioc->facts.protocol_flags = facts_data->protocol_flags;
|
||||
mrioc->facts.mpi_version = le32_to_cpu(facts_data->mpi_version.word);
|
||||
mrioc->facts.max_reqs = le16_to_cpu(facts_data->max_outstanding_requests);
|
||||
|
||||
@@ -7459,7 +7459,7 @@ MODULE_PARM_DESC(lbprz,
|
||||
MODULE_PARM_DESC(lbpu, "enable LBP, support UNMAP command (def=0)");
|
||||
MODULE_PARM_DESC(lbpws, "enable LBP, support WRITE SAME(16) with UNMAP bit (def=0)");
|
||||
MODULE_PARM_DESC(lbpws10, "enable LBP, support WRITE SAME(10) with UNMAP bit (def=0)");
|
||||
MODULE_PARM_DESC(atomic_write, "enable ATOMIC WRITE support, support WRITE ATOMIC(16) (def=0)");
|
||||
MODULE_PARM_DESC(atomic_wr, "enable ATOMIC WRITE support, support WRITE ATOMIC(16) (def=0)");
|
||||
MODULE_PARM_DESC(lowest_aligned, "lowest aligned lba (def=0)");
|
||||
MODULE_PARM_DESC(lun_format, "LUN format: 0->peripheral (def); 1 --> flat address method");
|
||||
MODULE_PARM_DESC(max_luns, "number of LUNs per target to simulate(def=1)");
|
||||
|
||||
@@ -731,6 +731,8 @@ sg_new_write(Sg_fd *sfp, struct file *file, const char __user *buf,
|
||||
sg_remove_request(sfp, srp);
|
||||
return -EFAULT;
|
||||
}
|
||||
hp->duration = jiffies_to_msecs(jiffies);
|
||||
|
||||
if (hp->interface_id != 'S') {
|
||||
sg_remove_request(sfp, srp);
|
||||
return -ENOSYS;
|
||||
@@ -815,7 +817,6 @@ sg_common_write(Sg_fd * sfp, Sg_request * srp,
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
hp->duration = jiffies_to_msecs(jiffies);
|
||||
if (hp->interface_id != '\0' && /* v3 (or later) interface */
|
||||
(SG_FLAG_Q_AT_TAIL & hp->flags))
|
||||
at_head = 0;
|
||||
@@ -1338,9 +1339,6 @@ sg_rq_end_io(struct request *rq, blk_status_t status)
|
||||
"sg_cmd_done: pack_id=%d, res=0x%x\n",
|
||||
srp->header.pack_id, result));
|
||||
srp->header.resid = resid;
|
||||
ms = jiffies_to_msecs(jiffies);
|
||||
srp->header.duration = (ms > srp->header.duration) ?
|
||||
(ms - srp->header.duration) : 0;
|
||||
if (0 != result) {
|
||||
struct scsi_sense_hdr sshdr;
|
||||
|
||||
@@ -1389,6 +1387,9 @@ sg_rq_end_io(struct request *rq, blk_status_t status)
|
||||
done = 0;
|
||||
}
|
||||
srp->done = done;
|
||||
ms = jiffies_to_msecs(jiffies);
|
||||
srp->header.duration = (ms > srp->header.duration) ?
|
||||
(ms - srp->header.duration) : 0;
|
||||
write_unlock_irqrestore(&sfp->rq_list_lock, iflags);
|
||||
|
||||
if (likely(done)) {
|
||||
@@ -2533,6 +2534,7 @@ static void sg_proc_debug_helper(struct seq_file *s, Sg_device * sdp)
|
||||
const sg_io_hdr_t *hp;
|
||||
const char * cp;
|
||||
unsigned int ms;
|
||||
unsigned int duration;
|
||||
|
||||
k = 0;
|
||||
list_for_each_entry(fp, &sdp->sfds, sfd_siblings) {
|
||||
@@ -2570,13 +2572,17 @@ static void sg_proc_debug_helper(struct seq_file *s, Sg_device * sdp)
|
||||
seq_printf(s, " id=%d blen=%d",
|
||||
srp->header.pack_id, blen);
|
||||
if (srp->done)
|
||||
seq_printf(s, " dur=%d", hp->duration);
|
||||
seq_printf(s, " dur=%u", hp->duration);
|
||||
else {
|
||||
ms = jiffies_to_msecs(jiffies);
|
||||
seq_printf(s, " t_o/elap=%d/%d",
|
||||
duration = READ_ONCE(hp->duration);
|
||||
if (duration)
|
||||
duration = (ms > duration ?
|
||||
ms - duration : 0);
|
||||
seq_printf(s, " t_o/elap=%u/%u",
|
||||
(new_interface ? hp->timeout :
|
||||
jiffies_to_msecs(fp->timeout)),
|
||||
(ms > hp->duration ? ms - hp->duration : 0));
|
||||
duration);
|
||||
}
|
||||
seq_printf(s, "ms sgat=%d op=0x%02x\n", usg,
|
||||
(int) srp->data.cmd_opcode);
|
||||
|
||||
@@ -10359,7 +10359,7 @@ static int ufshcd_suspend(struct ufs_hba *hba)
|
||||
ret = ufshcd_setup_clocks(hba, false);
|
||||
if (ret) {
|
||||
ufshcd_enable_irq(hba);
|
||||
return ret;
|
||||
goto out;
|
||||
}
|
||||
if (ufshcd_is_clkgating_allowed(hba)) {
|
||||
hba->clk_gating.state = CLKS_OFF;
|
||||
@@ -10371,6 +10371,9 @@ static int ufshcd_suspend(struct ufs_hba *hba)
|
||||
/* Put the host controller in low power mode if possible */
|
||||
ufshcd_hba_vreg_set_lpm(hba);
|
||||
ufshcd_pm_qos_update(hba, false);
|
||||
out:
|
||||
if (ret)
|
||||
ufshcd_update_evt_hist(hba, UFS_EVT_SUSPEND_ERR, (u32)ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user