Commit ff4a9f49 authored by Linus Torvalds's avatar Linus Torvalds
Browse files
Pull SCSI fixes from James Bottomley:
 "Three small fixes, one in drivers.

  The core changes are to the internal representation of flags in
  scsi_devices which removes space wasting bools in favour of single bit
  flags and to add a flag to force a runtime resume which is used by ATA
  devices"

* tag 'scsi-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi:
  scsi: sd: Fix system start for ATA devices
  scsi: Change SCSI device boolean fields to single bit flags
  scsi: ufs: core: Clear cmd if abort succeeds in MCQ mode
parents c1c09da0 b09d7f8f
Loading
Loading
Loading
Loading
+7 −2
Original line number Diff line number Diff line
@@ -1055,9 +1055,14 @@ int ata_scsi_dev_config(struct scsi_device *sdev, struct ata_device *dev)
		 * Ask the sd driver to issue START STOP UNIT on runtime suspend
		 * and resume and shutdown only. For system level suspend/resume,
		 * devices power state is handled directly by libata EH.
		 */
		sdev->manage_runtime_start_stop = true;
		sdev->manage_shutdown = true;
		 * Given that disks are always spun up on system resume, also
		 * make sure that the sd driver forces runtime suspended disks
		 * to be resumed to correctly reflect the power state of the
		 * device.
		 */
		sdev->manage_runtime_start_stop = 1;
		sdev->manage_shutdown = 1;
		sdev->force_runtime_start_on_system_start = 1;
	}

	/*
+3 −3
Original line number Diff line number Diff line
@@ -1519,9 +1519,9 @@ static int sbp2_scsi_slave_configure(struct scsi_device *sdev)
	sdev->use_10_for_rw = 1;

	if (sbp2_param_exclusive_login) {
		sdev->manage_system_start_stop = true;
		sdev->manage_runtime_start_stop = true;
		sdev->manage_shutdown = true;
		sdev->manage_system_start_stop = 1;
		sdev->manage_runtime_start_stop = 1;
		sdev->manage_shutdown = 1;
	}

	if (sdev->type == TYPE_ROM)
+8 −1
Original line number Diff line number Diff line
@@ -3949,8 +3949,15 @@ static int sd_resume(struct device *dev, bool runtime)

static int sd_resume_system(struct device *dev)
{
	if (pm_runtime_suspended(dev))
	if (pm_runtime_suspended(dev)) {
		struct scsi_disk *sdkp = dev_get_drvdata(dev);
		struct scsi_device *sdp = sdkp ? sdkp->device : NULL;

		if (sdp && sdp->force_runtime_start_on_system_start)
			pm_request_resume(dev);

		return 0;
	}

	return sd_resume(dev, false);
}
+13 −0
Original line number Diff line number Diff line
@@ -6444,11 +6444,24 @@ static bool ufshcd_abort_one(struct request *rq, void *priv)
	struct scsi_device *sdev = cmd->device;
	struct Scsi_Host *shost = sdev->host;
	struct ufs_hba *hba = shost_priv(shost);
	struct ufshcd_lrb *lrbp = &hba->lrb[tag];
	struct ufs_hw_queue *hwq;
	unsigned long flags;

	*ret = ufshcd_try_to_abort_task(hba, tag);
	dev_err(hba->dev, "Aborting tag %d / CDB %#02x %s\n", tag,
		hba->lrb[tag].cmd ? hba->lrb[tag].cmd->cmnd[0] : -1,
		*ret ? "failed" : "succeeded");

	/* Release cmd in MCQ mode if abort succeeds */
	if (is_mcq_enabled(hba) && (*ret == 0)) {
		hwq = ufshcd_mcq_req_to_hwq(hba, scsi_cmd_to_rq(lrbp->cmd));
		spin_lock_irqsave(&hwq->cq_lock, flags);
		if (ufshcd_cmd_inflight(lrbp->cmd))
			ufshcd_release_scsi_cmd(hba, lrbp);
		spin_unlock_irqrestore(&hwq->cq_lock, flags);
	}

	return *ret == 0;
}

+9 −3
Original line number Diff line number Diff line
@@ -167,19 +167,25 @@ struct scsi_device {
	 * power state for system suspend/resume (suspend to RAM and
	 * hibernation) operations.
	 */
	bool manage_system_start_stop;
	unsigned manage_system_start_stop:1;

	/*
	 * If true, let the high-level device driver (sd) manage the device
	 * power state for runtime device suspand and resume operations.
	 */
	bool manage_runtime_start_stop;
	unsigned manage_runtime_start_stop:1;

	/*
	 * If true, let the high-level device driver (sd) manage the device
	 * power state for system shutdown (power off) operations.
	 */
	bool manage_shutdown;
	unsigned manage_shutdown:1;

	/*
	 * If set and if the device is runtime suspended, ask the high-level
	 * device driver (sd) to force a runtime resume of the device.
	 */
	unsigned force_runtime_start_on_system_start:1;

	unsigned removable:1;
	unsigned changed:1;	/* Data invalid due to media change */