mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-01-11 17:10:13 +00:00
SCSI fixes on 20251226
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. Signed-off-by: James E.J. Bottomley <James.Bottomley@HansenPartnership.com> -----BEGIN PGP SIGNATURE----- iLgEABMIAGAWIQTnYEDbdso9F2cI+arnQslM7pishQUCaU9UWRsUgAAAAAAEAA5t YW51MiwyLjUrMS4xMSwyLDImHGphbWVzLmJvdHRvbWxleUBoYW5zZW5wYXJ0bmVy c2hpcC5jb20ACgkQ50LJTO6YrIUsFQEA49RD3/43W3fNYU1RfqcjDFmaJgDeUpvk q+JF6RTzjaQA/j7t4sGNLnPq8kDBhacYhStIFUUMoeHkiS8Nq+s0TuWL =T0c1 -----END PGP SIGNATURE----- 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:
commit
c53f467229
@ -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;
|
||||
}
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user