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

Commit 29d4eacf authored by Linyu Yuan's avatar Linyu Yuan
Browse files

usb: dwc3: fix msm_dwc3_perf_vote_work()



there is error when one static variable last_irq_cnt
used for multiple dwc3 instance.

Change-Id: I93201baec84a208d72ac4f4316eb50013e40a4da
Signed-off-by: default avatarLinyu Yuan <linyyuan@codeaurora.org>
parent 32339e54
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -1382,7 +1382,7 @@ struct dwc3 {

	/* IRQ timing statistics */
	int			irq;
	unsigned long		irq_cnt;
	atomic_t		irq_cnt;
	ktime_t			bh_start_time[MAX_INTR_STATS];
	unsigned int		bh_completion_time[MAX_INTR_STATS];
	unsigned int		bh_handled_evt_cnt[MAX_INTR_STATS];
+8 −8
Original line number Diff line number Diff line
@@ -521,6 +521,8 @@ struct dwc3_msm {

	struct device_node	*ss_redriver_node;
	bool			dual_port;

	bool			perf_mode;
};

#define USB_HSPHY_3P3_VOL_MIN		3050000 /* uV */
@@ -2366,7 +2368,7 @@ static void dwc3_msm_notify_event(struct dwc3 *dwc,
	case DWC3_CONTROLLER_ERROR_EVENT:
		dev_info(mdwc->dev,
			"DWC3_CONTROLLER_ERROR_EVENT received, irq cnt %lu\n",
			dwc->irq_cnt);
			atomic_read(&dwc->irq_cnt));

		dwc3_msm_write_reg(mdwc->base, DWC3_DEVTEN, 0x00);

@@ -5056,10 +5058,9 @@ static int dwc3_msm_host_notifier(struct notifier_block *nb,

static void msm_dwc3_perf_vote_update(struct dwc3_msm *mdwc, bool perf_mode)
{
	static bool curr_perf_mode;
	int latency = mdwc->pm_qos_latency;

	if ((curr_perf_mode == perf_mode) || !latency)
	if ((mdwc->perf_mode == perf_mode) || !latency)
		return;

	if (perf_mode)
@@ -5068,7 +5069,7 @@ static void msm_dwc3_perf_vote_update(struct dwc3_msm *mdwc, bool perf_mode)
		pm_qos_update_request(&mdwc->pm_qos_req_dma,
						PM_QOS_DEFAULT_VALUE);

	curr_perf_mode = perf_mode;
	mdwc->perf_mode = perf_mode;
	pr_debug("%s: latency updated to: %d\n", __func__,
			perf_mode ? latency : PM_QOS_DEFAULT_VALUE);
}
@@ -5078,16 +5079,15 @@ static void msm_dwc3_perf_vote_work(struct work_struct *w)
	struct dwc3_msm *mdwc = container_of(w, struct dwc3_msm,
						perf_vote_work.work);
	struct dwc3 *dwc = platform_get_drvdata(mdwc->dwc3);
	static unsigned long	last_irq_cnt;
	unsigned int irq_cnt = atomic_xchg(&dwc->irq_cnt, 0);
	bool in_perf_mode = false;

	if (dwc->irq_cnt - last_irq_cnt >= PM_QOS_THRESHOLD)
	if (irq_cnt >= PM_QOS_THRESHOLD)
		in_perf_mode = true;

	pr_debug("%s: in_perf_mode:%u, interrupts in last sample:%lu\n",
		 __func__, in_perf_mode, (dwc->irq_cnt - last_irq_cnt));
		 __func__, in_perf_mode, irq_cnt);

	last_irq_cnt = dwc->irq_cnt;
	msm_dwc3_perf_vote_update(mdwc, in_perf_mode);
	schedule_delayed_work(&mdwc->perf_vote_work,
			msecs_to_jiffies(1000 * PM_QOS_SAMPLE_SEC));
+1 −1
Original line number Diff line number Diff line
@@ -4107,7 +4107,7 @@ static irqreturn_t dwc3_check_event_buf(struct dwc3_event_buffer *evt)

	dwc = evt->dwc;
	start_time = ktime_get();
	dwc->irq_cnt++;
	atomic_inc(&dwc->irq_cnt);

	/* controller reset is still pending */
	if (dwc->err_evt_seen)