From dbb37607c5cf34d71ec9af60d39e2b25c44977e5 Mon Sep 17 00:00:00 2001 From: Alexander Boettcher Date: Wed, 5 Sep 2018 09:20:55 +0200 Subject: [PATCH] usb: fix regression in setup_timer introduced by update to 4.16.3. Fixes page faults in OHCI USB driver part. Issue #2963 --- repos/dde_linux/src/lib/usb/include/lx_emul.h | 4 ++++ repos/dde_linux/src/lib/usb/lx_emul.cc | 18 ++++++++++++++++-- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/repos/dde_linux/src/lib/usb/include/lx_emul.h b/repos/dde_linux/src/lib/usb/include/lx_emul.h index c2a3940cbd..7f0ef63598 100644 --- a/repos/dde_linux/src/lib/usb/include/lx_emul.h +++ b/repos/dde_linux/src/lib/usb/include/lx_emul.h @@ -622,6 +622,10 @@ ktime_t ktime_mono_to_real(ktime_t mono); #define from_timer(var, callback_timer, timer_fieldname) \ container_of(callback_timer, typeof(*var), timer_fieldname) +void setup_timer(struct timer_list *timer, void (*function)(unsigned long), + unsigned long data); +void init_timer(struct timer_list *); +void set_timer_slack(struct timer_list *, int); /******************* ** linux/delay.h ** diff --git a/repos/dde_linux/src/lib/usb/lx_emul.cc b/repos/dde_linux/src/lib/usb/lx_emul.cc index 97138163c2..763e79a36d 100644 --- a/repos/dde_linux/src/lib/usb/lx_emul.cc +++ b/repos/dde_linux/src/lib/usb/lx_emul.cc @@ -1127,10 +1127,24 @@ int hex2bin(u8 *dst, const char *src, size_t count) extern "C" void init_timer(struct timer_list *) { } +struct callback_timer { + void (*function)(unsigned long); + unsigned long data; +}; + +static void timer_callback(struct timer_list *t) +{ + struct callback_timer * tc = (struct callback_timer *)t->data; + tc->function(tc->data); +} extern "C" void setup_timer(struct timer_list *timer, void (*function)(unsigned long), unsigned long data) { - timer_setup(timer, function, 0u); - timer->data = data; + callback_timer * tc = new (Lx::Malloc::mem()) callback_timer; + tc->function = function; + tc->data = data; + + timer_setup(timer, timer_callback, 0u); + timer->data = (unsigned long)tc; }