mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-09 13:49:24 -04:00
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: Linyu Yuan <linyyuan@codeaurora.org>
This commit is contained in:
parent
32339e54ac
commit
29d4eacf52
3 changed files with 10 additions and 10 deletions
|
|
@ -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];
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
Loading…
Reference in a new issue