@@ -0,0 +1,199 @@
|
||||
From: Seth Forshee <seth.forshee@canonical.com>
|
||||
Date: Wed, 13 Dec 2017 15:53:31 -0600
|
||||
Subject: [PATCH] Build fixes for Linux 4.15
|
||||
|
||||
Fixes two build issues for 4.15:
|
||||
|
||||
- init_timer() was eliminated in 4.15, and all callers were
|
||||
converted to using timer_setup(). The callback prototype has
|
||||
also changed to pass a timer_list argument instead of callback
|
||||
data, and from_timer() must be used to get to the object in
|
||||
which the timer is embedded.
|
||||
|
||||
- usb_get_status() was changed to take an additional argument,
|
||||
and usb_get_std_status() was added as a wrapper for callers to
|
||||
use as a replacment. Call the wrapper in 4.15 and later.
|
||||
|
||||
LP: #1737749
|
||||
---
|
||||
driver/ntoskernel.c | 19 ++++++++++++++++++-
|
||||
driver/usb.c | 10 ++++++++--
|
||||
driver/wrapndis.c | 28 ++++++++++++++++++++++++++++
|
||||
3 files changed, 54 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/driver/ntoskernel.c b/driver/ntoskernel.c
|
||||
index 4fe0dc1..156c688 100644
|
||||
--- a/driver/ntoskernel.c
|
||||
+++ b/driver/ntoskernel.c
|
||||
@@ -77,7 +77,6 @@ u64 wrap_ticks_to_boot;
|
||||
#if defined(CONFIG_X86_64)
|
||||
static struct timer_list shared_data_timer;
|
||||
struct kuser_shared_data kuser_shared_data;
|
||||
-static void update_user_shared_data_proc(unsigned long data);
|
||||
#endif
|
||||
|
||||
WIN_SYMBOL_MAP("KeTickCount", &jiffies)
|
||||
@@ -91,7 +90,11 @@ DEFINE_PER_CPU(struct irql_info, irql_info);
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_X86_64)
|
||||
+#if LINUX_VERSION_CODE < KERNEL_VERSION(4,15,0)
|
||||
static void update_user_shared_data_proc(unsigned long data)
|
||||
+#else
|
||||
+static void update_user_shared_data_proc(struct timer_list *t)
|
||||
+#endif
|
||||
{
|
||||
/* timer is supposed to be scheduled every 10ms, but bigger
|
||||
* intervals seem to work (tried up to 50ms) */
|
||||
@@ -407,9 +410,15 @@ static void initialize_object(struct dispatcher_header *dh, enum dh_type type,
|
||||
InitializeListHead(&dh->wait_blocks);
|
||||
}
|
||||
|
||||
+#if LINUX_VERSION_CODE < KERNEL_VERSION(4,15,0)
|
||||
static void timer_proc(unsigned long data)
|
||||
{
|
||||
struct wrap_timer *wrap_timer = (struct wrap_timer *)data;
|
||||
+#else
|
||||
+static void timer_proc(struct timer_list *t)
|
||||
+{
|
||||
+ struct wrap_timer *wrap_timer = from_timer(wrap_timer, t, timer);
|
||||
+#endif
|
||||
struct nt_timer *nt_timer;
|
||||
struct kdpc *kdpc;
|
||||
|
||||
@@ -452,9 +461,13 @@ void wrap_init_timer(struct nt_timer *nt_timer, enum timer_type type,
|
||||
return;
|
||||
}
|
||||
|
||||
+#if LINUX_VERSION_CODE < KERNEL_VERSION(4,15,0)
|
||||
init_timer(&wrap_timer->timer);
|
||||
wrap_timer->timer.data = (unsigned long)wrap_timer;
|
||||
wrap_timer->timer.function = timer_proc;
|
||||
+#else
|
||||
+ timer_setup(&wrap_timer->timer, timer_proc, 0);
|
||||
+#endif
|
||||
wrap_timer->nt_timer = nt_timer;
|
||||
#ifdef TIMER_DEBUG
|
||||
wrap_timer->wrap_timer_magic = WRAP_TIMER_MAGIC;
|
||||
@@ -2559,9 +2572,13 @@ int ntoskernel_init(void)
|
||||
#if defined(CONFIG_X86_64)
|
||||
memset(&kuser_shared_data, 0, sizeof(kuser_shared_data));
|
||||
*((ULONG64 *)&kuser_shared_data.system_time) = ticks_1601();
|
||||
+#if LINUX_VERSION_CODE < KERNEL_VERSION(4,15,0)
|
||||
init_timer(&shared_data_timer);
|
||||
shared_data_timer.function = update_user_shared_data_proc;
|
||||
shared_data_timer.data = 0;
|
||||
+#else
|
||||
+ timer_setup(&shared_data_timer, update_user_shared_data_proc, 0);
|
||||
+#endif
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
diff --git a/driver/usb.c b/driver/usb.c
|
||||
index 3e7021a..e55c2c6 100644
|
||||
--- a/driver/usb.c
|
||||
+++ b/driver/usb.c
|
||||
@@ -750,6 +750,12 @@ static USBD_STATUS wrap_set_clear_feature(struct usb_device *udev,
|
||||
USBEXIT(return NT_URB_STATUS(nt_urb));
|
||||
}
|
||||
|
||||
+#if LINUX_VERSION_CODE < KERNEL_VERSION(4,15,0)
|
||||
+#define wrap_usb_get_status usb_get_status
|
||||
+#else
|
||||
+#define wrap_usb_get_status usb_get_std_status
|
||||
+#endif
|
||||
+
|
||||
static USBD_STATUS wrap_get_status_request(struct usb_device *udev,
|
||||
struct irp *irp)
|
||||
{
|
||||
@@ -776,8 +782,8 @@ static USBD_STATUS wrap_get_status_request(struct usb_device *udev,
|
||||
return NT_URB_STATUS(nt_urb);
|
||||
}
|
||||
assert(status_req->transfer_buffer_length == sizeof(u16));
|
||||
- ret = usb_get_status(udev, type, status_req->index,
|
||||
- status_req->transfer_buffer);
|
||||
+ ret = wrap_usb_get_status(udev, type, status_req->index,
|
||||
+ status_req->transfer_buffer);
|
||||
if (ret >= 0) {
|
||||
assert(ret <= status_req->transfer_buffer_length);
|
||||
status_req->transfer_buffer_length = ret;
|
||||
diff --git a/driver/wrapndis.c b/driver/wrapndis.c
|
||||
index 870e4c2..f653440 100644
|
||||
--- a/driver/wrapndis.c
|
||||
+++ b/driver/wrapndis.c
|
||||
@@ -1093,9 +1093,15 @@ send_assoc_event:
|
||||
EXIT2(return);
|
||||
}
|
||||
|
||||
+#if LINUX_VERSION_CODE < KERNEL_VERSION(4,15,0)
|
||||
static void iw_stats_timer_proc(unsigned long data)
|
||||
{
|
||||
struct ndis_device *wnd = (struct ndis_device *)data;
|
||||
+#else
|
||||
+static void iw_stats_timer_proc(struct timer_list *t)
|
||||
+{
|
||||
+ struct ndis_device *wnd = from_timer(wnd, t, iw_stats_timer);
|
||||
+#endif
|
||||
|
||||
ENTER2("%d", wnd->iw_stats_interval);
|
||||
if (wnd->iw_stats_interval > 0) {
|
||||
@@ -1111,8 +1117,12 @@ static void add_iw_stats_timer(struct ndis_device *wnd)
|
||||
return;
|
||||
if (wnd->iw_stats_interval < 0)
|
||||
wnd->iw_stats_interval *= -1;
|
||||
+#if LINUX_VERSION_CODE < KERNEL_VERSION(4,15,0)
|
||||
wnd->iw_stats_timer.data = (unsigned long)wnd;
|
||||
wnd->iw_stats_timer.function = iw_stats_timer_proc;
|
||||
+#else
|
||||
+ timer_setup(&wnd->iw_stats_timer, iw_stats_timer_proc, 0);
|
||||
+#endif
|
||||
mod_timer(&wnd->iw_stats_timer, jiffies + wnd->iw_stats_interval);
|
||||
}
|
||||
|
||||
@@ -1124,9 +1134,15 @@ static void del_iw_stats_timer(struct ndis_device *wnd)
|
||||
EXIT2(return);
|
||||
}
|
||||
|
||||
+#if LINUX_VERSION_CODE < KERNEL_VERSION(4,15,0)
|
||||
static void hangcheck_proc(unsigned long data)
|
||||
{
|
||||
struct ndis_device *wnd = (struct ndis_device *)data;
|
||||
+#else
|
||||
+static void hangcheck_proc(struct timer_list *t)
|
||||
+{
|
||||
+ struct ndis_device *wnd = from_timer(wnd, t, hangcheck_timer);
|
||||
+#endif
|
||||
|
||||
ENTER3("%d", wnd->hangcheck_interval);
|
||||
if (wnd->hangcheck_interval > 0) {
|
||||
@@ -1147,8 +1163,12 @@ void hangcheck_add(struct ndis_device *wnd)
|
||||
wnd->hangcheck_interval = hangcheck_interval * HZ;
|
||||
if (wnd->hangcheck_interval < 0)
|
||||
wnd->hangcheck_interval *= -1;
|
||||
+#if LINUX_VERSION_CODE < KERNEL_VERSION(4,15,0)
|
||||
wnd->hangcheck_timer.data = (unsigned long)wnd;
|
||||
wnd->hangcheck_timer.function = hangcheck_proc;
|
||||
+#else
|
||||
+ timer_setup(&wnd->hangcheck_timer, hangcheck_proc, 0);
|
||||
+#endif
|
||||
mod_timer(&wnd->hangcheck_timer, jiffies + wnd->hangcheck_interval);
|
||||
EXIT2(return);
|
||||
}
|
||||
@@ -2138,9 +2158,17 @@ static NTSTATUS ndis_add_device(struct driver_object *drv_obj,
|
||||
wnd->dma_map_count = 0;
|
||||
wnd->dma_map_addr = NULL;
|
||||
wnd->nick[0] = 0;
|
||||
+#if LINUX_VERSION_CODE < KERNEL_VERSION(4,15,0)
|
||||
init_timer(&wnd->hangcheck_timer);
|
||||
+#else
|
||||
+ timer_setup(&wnd->hangcheck_timer, NULL, 0);
|
||||
+#endif
|
||||
wnd->scan_timestamp = 0;
|
||||
+#if LINUX_VERSION_CODE < KERNEL_VERSION(4,15,0)
|
||||
init_timer(&wnd->iw_stats_timer);
|
||||
+#else
|
||||
+ timer_setup(&wnd->iw_stats_timer, NULL, 0);
|
||||
+#endif
|
||||
wnd->iw_stats_interval = 10 * HZ;
|
||||
wnd->ndis_pending_work = 0;
|
||||
memset(&wnd->essid, 0, sizeof(wnd->essid));
|
||||
Reference in New Issue
Block a user