Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0b8a5c89 authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "scsi: ufs: optimize clock, pm_qos, hibern8 handling in queuecommand"

parents 175b30d8 8f3b3717
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -462,7 +462,7 @@ static int ufsdbg_host_regs_show(struct seq_file *file, void *data)
	ufsdbg_pr_buf_to_std(file, hba->mmio_base, UFSHCI_REG_SPACE_SIZE,
				"host regs");
	pm_runtime_put_sync(hba->dev);
	ufshcd_release(hba);
	ufshcd_release(hba, false);
	return 0;
}

+24 −24
Original line number Diff line number Diff line
@@ -1148,7 +1148,7 @@ out:
}

/* host lock must be held before calling this variant */
static void __ufshcd_release(struct ufs_hba *hba)
static void __ufshcd_release(struct ufs_hba *hba, bool no_sched)
{
	if (!ufshcd_is_clkgating_allowed(hba))
		return;
@@ -1159,7 +1159,7 @@ static void __ufshcd_release(struct ufs_hba *hba)
		|| hba->ufshcd_state != UFSHCD_STATE_OPERATIONAL
		|| hba->lrb_in_use || hba->outstanding_tasks
		|| hba->active_uic_cmd || hba->uic_async_done
		|| ufshcd_eh_in_progress(hba))
		|| ufshcd_eh_in_progress(hba) || no_sched)
		return;

	hba->clk_gating.state = REQ_CLKS_OFF;
@@ -1170,12 +1170,12 @@ static void __ufshcd_release(struct ufs_hba *hba)
			msecs_to_jiffies(hba->clk_gating.delay_ms));
}

void ufshcd_release(struct ufs_hba *hba)
void ufshcd_release(struct ufs_hba *hba, bool no_sched)
{
	unsigned long flags;

	spin_lock_irqsave(hba->host->host_lock, flags);
	__ufshcd_release(hba);
	__ufshcd_release(hba, no_sched);
	spin_unlock_irqrestore(hba->host->host_lock, flags);
}

@@ -1225,7 +1225,7 @@ static ssize_t ufshcd_clkgate_enable_store(struct device *dev,
		goto out;

	if (value) {
		ufshcd_release(hba);
		ufshcd_release(hba, false);
	} else {
		spin_lock_irqsave(hba->host->host_lock, flags);
		hba->clk_gating.active_reqs++;
@@ -1350,7 +1350,7 @@ out:
}

/* host lock must be held before calling this variant */
static void __ufshcd_hibern8_release(struct ufs_hba *hba)
static void __ufshcd_hibern8_release(struct ufs_hba *hba, bool no_sched)
{
	unsigned long delay_in_jiffies;

@@ -1365,7 +1365,7 @@ static void __ufshcd_hibern8_release(struct ufs_hba *hba)
		|| hba->ufshcd_state != UFSHCD_STATE_OPERATIONAL
		|| hba->lrb_in_use || hba->outstanding_tasks
		|| hba->active_uic_cmd || hba->uic_async_done
		|| ufshcd_eh_in_progress(hba))
		|| ufshcd_eh_in_progress(hba) || no_sched)
		return;

	hba->hibern8_on_idle.state = REQ_HIBERN8_ENTER;
@@ -1388,12 +1388,12 @@ static void __ufshcd_hibern8_release(struct ufs_hba *hba)
			      delay_in_jiffies);
}

void ufshcd_hibern8_release(struct ufs_hba *hba)
void ufshcd_hibern8_release(struct ufs_hba *hba, bool no_sched)
{
	unsigned long flags;

	spin_lock_irqsave(hba->host->host_lock, flags);
	__ufshcd_hibern8_release(hba);
	__ufshcd_hibern8_release(hba, no_sched);
	spin_unlock_irqrestore(hba->host->host_lock, flags);
}

@@ -1474,7 +1474,7 @@ static void ufshcd_hibern8_exit_work(struct work_struct *work)
	if (ufshcd_is_link_hibern8(hba)) {
		ufshcd_hold(hba, false);
		ret = ufshcd_uic_hibern8_exit(hba);
		ufshcd_release(hba);
		ufshcd_release(hba, false);
		if (!ret) {
			spin_lock_irqsave(hba->host->host_lock, flags);
			ufshcd_set_link_active(hba);
@@ -1649,24 +1649,24 @@ out:
}

/* Host lock is assumed to be held by caller */
static void __ufshcd_pm_qos_release(struct ufs_hba *hba)
static void __ufshcd_pm_qos_release(struct ufs_hba *hba, bool no_sched)
{
	if (!hba->pm_qos.cpu_dma_latency_us)
		return;

	if (--hba->pm_qos.active_reqs)
	if (--hba->pm_qos.active_reqs || no_sched)
		return;

	hba->pm_qos.state = PM_QOS_REQ_UNVOTE;
	schedule_work(&hba->pm_qos.unvote_work);
}

static void ufshcd_pm_qos_release(struct ufs_hba *hba)
static void ufshcd_pm_qos_release(struct ufs_hba *hba, bool no_sched)
{
	unsigned long flags;

	spin_lock_irqsave(hba->host->host_lock, flags);
	__ufshcd_pm_qos_release(hba);
	__ufshcd_pm_qos_release(hba, no_sched);
	spin_unlock_irqrestore(hba->host->host_lock, flags);
}

@@ -1762,9 +1762,9 @@ static void ufshcd_hold_all(struct ufs_hba *hba)

static void ufshcd_release_all(struct ufs_hba *hba)
{
	ufshcd_hibern8_release(hba);
	ufshcd_pm_qos_release(hba);
	ufshcd_release(hba);
	ufshcd_hibern8_release(hba, false);
	ufshcd_pm_qos_release(hba, false);
	ufshcd_release(hba, false);
}

/* Must be called with host lock acquired */
@@ -2378,7 +2378,7 @@ static int ufshcd_queuecommand(struct Scsi_Host *host, struct scsi_cmnd *cmd)
	if (err) {
		err = SCSI_MLQUEUE_HOST_BUSY;
		clear_bit_unlock(tag, &hba->lrb_in_use);
		ufshcd_release(hba);
		ufshcd_release(hba, true);
		goto out;
	}

@@ -2386,8 +2386,8 @@ static int ufshcd_queuecommand(struct Scsi_Host *host, struct scsi_cmnd *cmd)
	if (err) {
		clear_bit_unlock(tag, &hba->lrb_in_use);
		err = SCSI_MLQUEUE_HOST_BUSY;
		ufshcd_pm_qos_release(hba);
		ufshcd_release(hba);
		ufshcd_pm_qos_release(hba, true);
		ufshcd_release(hba, true);
		goto out;
	}
	WARN_ON(hba->hibern8_on_idle.state != HIBERN8_EXITED);
@@ -4702,9 +4702,9 @@ static void __ufshcd_transfer_req_compl(struct ufs_hba *hba,
			clear_bit_unlock(index, &hba->lrb_in_use);
			/* Do not touch lrbp after scsi done */
			cmd->scsi_done(cmd);
			__ufshcd_release(hba);
			__ufshcd_pm_qos_release(hba);
			__ufshcd_hibern8_release(hba);
			__ufshcd_release(hba, false);
			__ufshcd_pm_qos_release(hba, false);
			__ufshcd_hibern8_release(hba, false);
		} else if (lrbp->command_type == UTP_CMD_TYPE_DEV_MANAGE) {
			if (hba->dev_cmd.complete) {
				ufshcd_cond_add_cmd_trace(hba, index,
@@ -8012,7 +8012,7 @@ static ssize_t ufshcd_clkscale_enable_store(struct device *dev,
	}
	hba->clk_scaling.is_allowed = value;

	ufshcd_release(hba);
	ufshcd_release(hba, false);
	pm_runtime_put_sync(hba->dev);
out:
	return count;
+1 −1
Original line number Diff line number Diff line
@@ -924,7 +924,7 @@ int ufshcd_query_descriptor(struct ufs_hba *hba, enum query_opcode opcode,
	enum desc_idn idn, u8 index, u8 selector, u8 *desc_buf, int *buf_len);

int ufshcd_hold(struct ufs_hba *hba, bool async);
void ufshcd_release(struct ufs_hba *hba);
void ufshcd_release(struct ufs_hba *hba, bool no_sched);
int ufshcd_wait_for_doorbell_clr(struct ufs_hba *hba, u64 wait_timeout_us);
int ufshcd_change_power_mode(struct ufs_hba *hba,
			     struct ufs_pa_layer_attr *pwr_mode);