+++ /dev/null
-diff -ur linux-gpib-4.1.0/drivers/gpib/agilent_82357a/agilent_82357a.c linux-gpib-4.1.0-k415/drivers/gpib/agilent_82357a/agilent_82357a.c
---- linux-gpib-4.1.0/drivers/gpib/agilent_82357a/agilent_82357a.c 2017-01-16 10:26:30.000000000 +0100
-+++ linux-gpib-4.1.0-k415/drivers/gpib/agilent_82357a/agilent_82357a.c 2018-01-29 20:55:10.341502118 +0100
-@@ -42,9 +42,16 @@
- up(&context->complete);
- }
-
-+#ifdef HAVE_TIMER_SETUP
-+static void agilent_82357a_timeout_handler(struct timer_list *t)
-+{
-+ agilent_82357a_private_t *a_priv = from_timer(a_priv, t, bulk_timer);
-+#else
- static void agilent_82357a_timeout_handler(unsigned long arg)
- {
-- agilent_82357a_urb_context_t *context = (agilent_82357a_urb_context_t *) arg;
-+ agilent_82357a_private_t *a_priv = (agilent_82357a_private_t *) arg;
-+#endif
-+ agilent_82357a_urb_context_t *context = &a_priv->context;
- context->timed_out = 1;
- up(&context->complete);
- }
-@@ -55,8 +62,7 @@
- struct usb_device *usb_dev;
- int retval;
- unsigned int out_pipe;
-- agilent_82357a_urb_context_t context;
-- struct timer_list *timer = NULL;
-+ agilent_82357a_urb_context_t *context = &a_priv->context;
-
- *actual_data_length = 0;
- retval = mutex_lock_interruptible(&a_priv->bulk_alloc_lock);
-@@ -79,25 +85,14 @@
- }
- usb_dev = interface_to_usbdev(a_priv->bus_interface);
- out_pipe = usb_sndbulkpipe(usb_dev, a_priv->bulk_out_endpoint);
-- sema_init(&context.complete, 0);
-- context.timed_out = 0;
-+ sema_init(&context->complete, 0);
-+ context->timed_out = 0;
- usb_fill_bulk_urb(a_priv->bulk_urb, usb_dev, out_pipe, data, data_length,
-- &agilent_82357a_bulk_complete, &context);
-+ &agilent_82357a_bulk_complete, context);
-+
- if(timeout_msecs)
-- {
-- timer = kmalloc(sizeof(struct timer_list), GFP_KERNEL);
-- if(timer == NULL)
-- {
-- mutex_unlock(&a_priv->bulk_alloc_lock);
-- retval = -ENOMEM;
-- goto cleanup;
-- }
-- init_timer(timer);
-- timer->expires = jiffies + msecs_to_jiffies(timeout_msecs);
-- timer->function = agilent_82357a_timeout_handler;
-- timer->data = (unsigned long) &context;
-- add_timer(timer);
-- }
-+ mod_timer(&a_priv->bulk_timer, jiffies + msecs_to_jiffies(timeout_msecs));
-+
- //printk("%s: submitting urb\n", __FUNCTION__);
- retval = usb_submit_urb(a_priv->bulk_urb, GFP_KERNEL);
- if(retval)
-@@ -107,13 +102,13 @@
- goto cleanup;
- }
- mutex_unlock(&a_priv->bulk_alloc_lock);
-- if(down_interruptible(&context.complete))
-+ if(down_interruptible(&context->complete))
- {
- printk("%s: %s: interrupted\n", __FILE__, __FUNCTION__);
- retval = -ERESTARTSYS;
- goto cleanup;
- }
-- if(context.timed_out)
-+ if(context->timed_out)
- {
- retval = -ETIMEDOUT;
- }else
-@@ -122,11 +117,10 @@
- *actual_data_length = a_priv->bulk_urb->actual_length;
- }
- cleanup:
-- if(timer)
-+ if(timeout_msecs)
- {
-- if(timer_pending(timer))
-- del_timer_sync(timer);
-- kfree(timer);
-+ if(timer_pending(&a_priv->bulk_timer))
-+ del_timer_sync(&a_priv->bulk_timer);
- }
- mutex_lock(&a_priv->bulk_alloc_lock);
- if(a_priv->bulk_urb)
-@@ -145,8 +139,7 @@
- struct usb_device *usb_dev;
- int retval;
- unsigned int in_pipe;
-- agilent_82357a_urb_context_t context;
-- struct timer_list *timer = NULL;
-+ agilent_82357a_urb_context_t *context = &a_priv->context;
-
- *actual_data_length = 0;
- retval = mutex_lock_interruptible(&a_priv->bulk_alloc_lock);
-@@ -169,25 +162,14 @@
- }
- usb_dev = interface_to_usbdev(a_priv->bus_interface);
- in_pipe = usb_rcvbulkpipe(usb_dev, AGILENT_82357_BULK_IN_ENDPOINT);
-- sema_init(&context.complete, 0);
-- context.timed_out = 0;
-+ sema_init(&context->complete, 0);
-+ context->timed_out = 0;
- usb_fill_bulk_urb(a_priv->bulk_urb, usb_dev, in_pipe, data, data_length,
-- &agilent_82357a_bulk_complete, &context);
-+ &agilent_82357a_bulk_complete, context);
-+
- if(timeout_msecs)
-- {
-- timer = kmalloc(sizeof(struct timer_list), GFP_KERNEL);
-- if(timer == NULL)
-- {
-- retval = -ENOMEM;
-- mutex_unlock(&a_priv->bulk_alloc_lock);
-- goto cleanup;
-- }
-- init_timer(timer);
-- timer->expires = jiffies + msecs_to_jiffies(timeout_msecs);
-- timer->function = agilent_82357a_timeout_handler;
-- timer->data = (unsigned long) &context;
-- add_timer(timer);
-- }
-+ mod_timer(&a_priv->bulk_timer, jiffies + msecs_to_jiffies(timeout_msecs));
-+
- //printk("%s: submitting urb\n", __FUNCTION__);
- retval = usb_submit_urb(a_priv->bulk_urb, GFP_KERNEL);
- if(retval)
-@@ -197,13 +179,13 @@
- goto cleanup;
- }
- mutex_unlock(&a_priv->bulk_alloc_lock);
-- if(down_interruptible(&context.complete))
-+ if(down_interruptible(&context->complete))
- {
- printk("%s: %s: interrupted\n", __FILE__, __FUNCTION__);
- retval = -ERESTARTSYS;
- goto cleanup;
- }
-- if(context.timed_out)
-+ if(context->timed_out)
- {
- retval = -ETIMEDOUT;
- goto cleanup;
-@@ -211,14 +193,9 @@
- retval = a_priv->bulk_urb->status;
- *actual_data_length = a_priv->bulk_urb->actual_length;
- cleanup:
-- if(timer)
-- {
-- if(timer_pending(timer))
-- {
-- del_timer_sync(timer);
-- }
-- kfree(timer);
-- }
-+ if(timeout_msecs)
-+ del_timer_sync(&a_priv->bulk_timer);
-+
- mutex_lock(&a_priv->bulk_alloc_lock);
- if(a_priv->bulk_urb)
- {
-@@ -1351,13 +1328,22 @@
- return retval;
- }
- //printk("%s: finished setup_urbs()()\n", __FUNCTION__);
-+
-+#ifdef HAVE_TIMER_SETUP
-+ timer_setup(&a_priv->bulk_timer, agilent_82357a_timeout_handler, 0);
-+#else
-+ setup_timer(&a_priv->bulk_timer, agilent_82357a_timeout_handler, (unsigned long) a_priv);
-+#endif
-+
- retval = agilent_82357a_init(board);
-+
- if(retval < 0)
- {
- mutex_unlock(&agilent_82357a_hotplug_lock);
- return retval;
- }
- //printk("%s: finished init()\n", __FUNCTION__);
-+
- printk("%s: attached\n", __FUNCTION__);
- mutex_unlock(&agilent_82357a_hotplug_lock);
- return retval;
-diff -ur linux-gpib-4.1.0/drivers/gpib/agilent_82357a/agilent_82357a.h linux-gpib-4.1.0-k415/drivers/gpib/agilent_82357a/agilent_82357a.h
---- linux-gpib-4.1.0/drivers/gpib/agilent_82357a/agilent_82357a.h 2017-01-16 09:31:39.000000000 +0100
-+++ linux-gpib-4.1.0-k415/drivers/gpib/agilent_82357a/agilent_82357a.h 2018-01-29 20:55:10.341502118 +0100
-@@ -19,6 +19,7 @@
- #ifndef _AGILENT_82357_H
- #define _AGILENT_82357_H
-
-+#include <linux/kernel.h>
- #include <linux/mutex.h>
- #include <linux/semaphore.h>
- #include <linux/usb.h>
-@@ -140,6 +141,12 @@
- #define STATUS_DATA_LEN 8
- #define INTERRUPT_BUF_LEN 8
-
-+typedef struct
-+{
-+ struct semaphore complete;
-+ unsigned timed_out : 1;
-+} agilent_82357a_urb_context_t ;
-+
- // struct which defines local data for each 82357 device
- typedef struct
- {
-@@ -155,17 +162,14 @@
- struct mutex bulk_alloc_lock;
- struct mutex interrupt_alloc_lock;
- struct mutex control_alloc_lock;
-+ struct timer_list bulk_timer;
-+ agilent_82357a_urb_context_t context;
- unsigned bulk_out_endpoint;
- unsigned interrupt_in_endpoint;
- uint8_t *status_data;
- unsigned is_cic : 1;
- } agilent_82357a_private_t;
-
--typedef struct
--{
-- struct semaphore complete;
-- unsigned timed_out : 1;
--} agilent_82357a_urb_context_t;
-
- struct agilent_82357a_register_pairlet
- {
-diff -ur linux-gpib-4.1.0/drivers/gpib/include/gpib_proto.h linux-gpib-4.1.0-k415/drivers/gpib/include/gpib_proto.h
---- linux-gpib-4.1.0/drivers/gpib/include/gpib_proto.h 2016-06-22 10:48:46.000000000 +0200
-+++ linux-gpib-4.1.0-k415/drivers/gpib/include/gpib_proto.h 2018-01-29 20:55:10.341502118 +0100
-@@ -9,7 +9,7 @@
- long ibioctl(struct file *filep, unsigned int cmd, unsigned long arg );
- int osInit( void );
- void osReset( void );
--void watchdog_timeout( unsigned long arg );
-+//void watchdog_timeout( struct timer_list *t );
- void osStartTimer( gpib_board_t *board, unsigned int usec_timeout );
- void osRemoveTimer( gpib_board_t *board );
- void osSendEOI( void );
-diff -ur linux-gpib-4.1.0/drivers/gpib/include/gpib_types.h linux-gpib-4.1.0-k415/drivers/gpib/include/gpib_types.h
---- linux-gpib-4.1.0/drivers/gpib/include/gpib_types.h 2018-01-29 21:01:19.642149223 +0100
-+++ linux-gpib-4.1.0-k415/drivers/gpib/include/gpib_types.h 2018-01-29 20:55:10.344835496 +0100
-@@ -32,6 +32,10 @@
- #include <linux/timer.h>
- #include <linux/interrupt.h>
-
-+#if defined(timer_setup) && defined(from_timer)
-+#define HAVE_TIMER_SETUP
-+#endif
-+
- typedef struct gpib_interface_struct gpib_interface_t;
- typedef struct gpib_board_struct gpib_board_t;
-
-@@ -157,14 +161,21 @@
- {
- struct timer_list timer;
- irqreturn_t (*handler)(int, void * PT_REGS_ARG);
-+ gpib_board_t *board;
- atomic_t active;
- };
-
- static inline void init_gpib_pseudo_irq( struct gpib_pseudo_irq *pseudo_irq)
- {
- pseudo_irq->handler = NULL;
-- init_timer(&pseudo_irq->timer);
-+#ifdef HAVE_TIMER_SETUP
-+ timer_setup(&pseudo_irq->timer, NULL, 0);
-+#else
-+ setup_timer(&pseudo_irq->timer, NULL, (unsigned long)pseudo_irq);
-+#endif
-+ smp_mb__before_atomic();
- atomic_set(&pseudo_irq->active, 0);
-+ smp_mb__after_atomic();
- }
-
- /* list so we can make a linked list of drivers */
-diff -ur linux-gpib-4.1.0/drivers/gpib/ni_usb/ni_usb_gpib.c linux-gpib-4.1.0-k415/drivers/gpib/ni_usb/ni_usb_gpib.c
---- linux-gpib-4.1.0/drivers/gpib/ni_usb/ni_usb_gpib.c 2017-09-02 19:29:49.000000000 +0200
-+++ linux-gpib-4.1.0-k415/drivers/gpib/ni_usb/ni_usb_gpib.c 2018-01-29 20:55:10.341502118 +0100
-@@ -81,9 +81,16 @@
- up(&context->complete);
- }
-
--static void ni_usb_timeout_handler(unsigned long arg)
-+#ifdef HAVE_TIMER_SETUP
-+static void ni_usb_timeout_handler(struct timer_list *t)
- {
-- ni_usb_urb_context_t *context = (ni_usb_urb_context_t *) arg;
-+ ni_usb_private_t *ni_priv = from_timer(ni_priv, t, bulk_timer);
-+#else
-+static void ni_usb_timeout_handler (unsigned long arg)
-+{
-+ ni_usb_private_t *ni_priv = (ni_usb_private_t *) arg;
-+#endif
-+ ni_usb_urb_context_t *context = &ni_priv->context;
- context->timed_out = 1;
- up(&context->complete);
- };
-@@ -94,8 +101,7 @@
- struct usb_device *usb_dev;
- int retval;
- unsigned int out_pipe;
-- ni_usb_urb_context_t context;
-- struct timer_list timer;
-+ ni_usb_urb_context_t *context = &ni_priv->context;
-
- *actual_data_length = 0;
- mutex_lock(&ni_priv->bulk_transfer_lock);
-@@ -117,24 +123,19 @@
- }
- usb_dev = interface_to_usbdev(ni_priv->bus_interface);
- out_pipe = usb_sndbulkpipe(usb_dev, ni_priv->bulk_out_endpoint);
-- sema_init(&context.complete, 0);
-- context.timed_out = 0;
-+ sema_init(&context->complete, 0);
-+ context->timed_out = 0;
- usb_fill_bulk_urb(ni_priv->bulk_urb, usb_dev, out_pipe, data, data_length,
-- &ni_usb_bulk_complete, &context);
-- init_timer(&timer);
-+ &ni_usb_bulk_complete, context);
-+
- if(timeout_msecs)
-- {
-- timer.expires = jiffies + msecs_to_jiffies(timeout_msecs);
-- timer.function = ni_usb_timeout_handler;
-- timer.data = (unsigned long) &context;
-- add_timer(&timer);
-- }
-+ mod_timer(&ni_priv->bulk_timer, jiffies + msecs_to_jiffies(timeout_msecs));
-+
- //printk("%s: submitting urb\n", __FUNCTION__);
- retval = usb_submit_urb(ni_priv->bulk_urb, GFP_KERNEL);
- if(retval)
- {
-- if(timer_pending(&timer))
-- del_timer_sync(&timer);
-+ del_timer_sync(&ni_priv->bulk_timer);
- usb_free_urb(ni_priv->bulk_urb);
- ni_priv->bulk_urb = NULL;
- printk("%s: failed to submit bulk out urb, retval=%i\n", __FILE__, retval);
-@@ -142,16 +143,16 @@
- return retval;
- }
- mutex_unlock(&ni_priv->bulk_transfer_lock);
-- down(&context.complete); // wait for ni_usb_bulk_complete
-- if(context.timed_out)
-+ down(&context->complete); // wait for ni_usb_bulk_complete
-+ if(context->timed_out)
- {
- usb_kill_urb(ni_priv->bulk_urb);
- printk("%s: killed urb due to timeout\n", __FUNCTION__);
- retval = -ETIMEDOUT;
- }else
- retval = ni_priv->bulk_urb->status;
-- if(timer_pending(&timer))
-- del_timer_sync(&timer);
-+
-+ del_timer_sync(&ni_priv->bulk_timer);
- *actual_data_length = ni_priv->bulk_urb->actual_length;
- mutex_lock(&ni_priv->bulk_transfer_lock);
- usb_free_urb(ni_priv->bulk_urb);
-@@ -183,8 +184,7 @@
- struct usb_device *usb_dev;
- int retval;
- unsigned int in_pipe;
-- ni_usb_urb_context_t context;
-- struct timer_list timer;
-+ ni_usb_urb_context_t *context = &ni_priv->context;
-
- *actual_data_length = 0;
- mutex_lock(&ni_priv->bulk_transfer_lock);
-@@ -206,24 +206,19 @@
- }
- usb_dev = interface_to_usbdev(ni_priv->bus_interface);
- in_pipe = usb_rcvbulkpipe(usb_dev, ni_priv->bulk_in_endpoint);
-- sema_init(&context.complete, 0);
-- context.timed_out = 0;
-+ sema_init(&context->complete, 0);
-+ context->timed_out = 0;
- usb_fill_bulk_urb(ni_priv->bulk_urb, usb_dev, in_pipe, data, data_length,
-- &ni_usb_bulk_complete, &context);
-- init_timer(&timer);
-+ &ni_usb_bulk_complete, context);
-+
- if(timeout_msecs)
-- {
-- timer.expires = jiffies + msecs_to_jiffies(timeout_msecs);
-- timer.function = ni_usb_timeout_handler;
-- timer.data = (unsigned long) &context;
-- add_timer(&timer);
-- }
-+ mod_timer(&ni_priv->bulk_timer, jiffies + msecs_to_jiffies(timeout_msecs));
-+
- //printk("%s: submitting urb\n", __FUNCTION__);
- retval = usb_submit_urb(ni_priv->bulk_urb, GFP_KERNEL);
- if(retval)
- {
-- if(timer_pending(&timer))
-- del_timer_sync(&timer);
-+ del_timer_sync(&ni_priv->bulk_timer);
- usb_free_urb(ni_priv->bulk_urb);
- ni_priv->bulk_urb = NULL;
- printk("%s: failed to submit bulk out urb, retval=%i\n", __FILE__, retval);
-@@ -233,7 +228,7 @@
- mutex_unlock(&ni_priv->bulk_transfer_lock);
- if(interruptible)
- {
-- if(down_interruptible(&context.complete))
-+ if(down_interruptible(&context->complete))
- {
- /* If we got interrupted by a signal while waiting for the usb gpib
- to respond, we should send a stop command so it will finish
-@@ -242,21 +237,21 @@
- retval = -ERESTARTSYS;
- /* now do an uninterruptible wait, it shouldn't take long
- for the board to respond now. */
-- down(&context.complete);
-+ down(&context->complete);
- }
- }else
- {
-- down(&context.complete);
-+ down(&context->complete);
- }
-- if(context.timed_out)
-+ if(context->timed_out)
- {
- usb_kill_urb(ni_priv->bulk_urb);
- printk("%s: killed urb due to timeout\n", __FUNCTION__);
- retval = -ETIMEDOUT;
- }else if(ni_priv->bulk_urb->status)
- retval = ni_priv->bulk_urb->status;
-- if(timer_pending(&timer))
-- del_timer_sync(&timer);
-+
-+ del_timer_sync(&ni_priv->bulk_timer);
- *actual_data_length = ni_priv->bulk_urb->actual_length;
- mutex_lock(&ni_priv->bulk_transfer_lock);
- usb_free_urb(ni_priv->bulk_urb);
-@@ -2170,6 +2165,13 @@
- mutex_unlock(&ni_usb_hotplug_lock);
- return retval;
- }
-+
-+#ifdef HAVE_TIMER_SETUP
-+ timer_setup(&ni_priv->bulk_timer, ni_usb_timeout_handler, 0);
-+#else
-+ setup_timer(&ni_priv->bulk_timer, ni_usb_timeout_handler, (unsigned long)ni_priv);
-+#endif
-+
- retval = ni_usb_init(board);
- if(retval < 0)
- {
-@@ -2182,6 +2184,7 @@
- mutex_unlock(&ni_usb_hotplug_lock);
- return retval;
- }
-+
- mutex_unlock(&ni_usb_hotplug_lock);
- return retval;
- }
-diff -ur linux-gpib-4.1.0/drivers/gpib/ni_usb/ni_usb_gpib.h linux-gpib-4.1.0-k415/drivers/gpib/ni_usb/ni_usb_gpib.h
---- linux-gpib-4.1.0/drivers/gpib/ni_usb/ni_usb_gpib.h 2017-09-01 17:32:15.000000000 +0200
-+++ linux-gpib-4.1.0-k415/drivers/gpib/ni_usb/ni_usb_gpib.h 2018-01-29 20:55:10.341502118 +0100
-@@ -73,6 +73,12 @@
- NIUSB_HS_PLUS_INTERRUPT_IN_ENDPOINT = 0x3,
- };
-
-+typedef struct
-+{
-+ struct semaphore complete;
-+ unsigned timed_out : 1;
-+} ni_usb_urb_context_t;
-+
- // struct which defines private_data for ni_usb devices
- typedef struct
- {
-@@ -90,14 +96,10 @@
- struct mutex bulk_transfer_lock;
- struct mutex control_transfer_lock;
- struct mutex interrupt_transfer_lock;
-+ struct timer_list bulk_timer;
-+ ni_usb_urb_context_t context;
- } ni_usb_private_t;
-
--typedef struct
--{
-- struct semaphore complete;
-- unsigned timed_out : 1;
--} ni_usb_urb_context_t;
--
- struct ni_usb_status_block
- {
- short id;
-diff -ur linux-gpib-4.1.0/drivers/gpib/sys/ibwait.c linux-gpib-4.1.0-k415/drivers/gpib/sys/ibwait.c
---- linux-gpib-4.1.0/drivers/gpib/sys/ibwait.c 2017-09-02 15:19:47.000000000 +0200
-+++ linux-gpib-4.1.0-k415/drivers/gpib/sys/ibwait.c 2018-01-29 20:55:10.341502118 +0100
-@@ -28,11 +28,29 @@
- unsigned long usec_timeout;
- };
-
-+
-+#ifdef HAVE_TIMER_SETUP
-+static void wait_timeout( struct timer_list *t )
-+{
-+ struct wait_info *winfo = from_timer(winfo, t, timer);
-+#else
-+static void wait_timeout( unsigned long arg )
-+{
-+ struct wait_info *winfo = ( struct wait_info * ) arg;
-+#endif
-+ winfo->timed_out = 1;
-+ wake_up_interruptible( &winfo->board->wait );
-+}
-+
- static void init_wait_info( struct wait_info *winfo )
- {
- winfo->board = NULL;
-- init_timer( &winfo->timer );
- winfo->timed_out = 0;
-+#ifdef HAVE_TIMER_SETUP
-+ timer_setup_on_stack( &winfo->timer, wait_timeout, 0 );
-+#else
-+ setup_timer( &winfo->timer, wait_timeout, (unsigned long)winfo );
-+#endif
- }
-
- static int wait_satisfied( struct wait_info *winfo, gpib_status_queue_t *status_queue,
-@@ -63,15 +81,6 @@
- return 0;
- }
-
--static void wait_timeout( unsigned long arg )
--/* Watchdog timeout routine */
--{
-- struct wait_info *winfo = ( struct wait_info * ) arg;
--
-- winfo->timed_out = 1;
-- wake_up_interruptible( &winfo->board->wait );
--}
--
- /* install timer interrupt handler */
- static void startWaitTimer( struct wait_info *winfo )
- /* Starts the timeout task */
-@@ -80,17 +89,16 @@
-
- if( winfo->usec_timeout > 0 )
- {
-- winfo->timer.expires = jiffies + usec_to_jiffies( winfo->usec_timeout );
-- winfo->timer.function = wait_timeout;
-- winfo->timer.data = (unsigned long) winfo;
-- add_timer( &winfo->timer ); /* add timer */
-+ mod_timer( &winfo->timer, jiffies + usec_to_jiffies( winfo->usec_timeout ));
- }
- }
-
- static void removeWaitTimer( struct wait_info *winfo )
- {
-- if( timer_pending( &winfo->timer ) )
-- del_timer_sync( &winfo->timer );
-+ del_timer_sync( &winfo->timer );
-+#ifdef HAVE_TIMER_SETUP
-+ destroy_timer_on_stack( &winfo->timer );
-+#endif
- }
-
- /*
-diff -ur linux-gpib-4.1.0/drivers/gpib/sys/osinit.c linux-gpib-4.1.0-k415/drivers/gpib/sys/osinit.c
---- linux-gpib-4.1.0/drivers/gpib/sys/osinit.c 2017-09-29 19:25:30.000000000 +0200
-+++ linux-gpib-4.1.0-k415/drivers/gpib/sys/osinit.c 2018-01-29 20:55:10.341502118 +0100
-@@ -115,7 +115,11 @@
- board->locking_pid = 0;
- spin_lock_init(&board->locking_pid_spinlock);
- spin_lock_init(&board->spinlock);
-- init_timer(&board->timer);
-+#ifdef HAVE_TIMER_SETUP
-+ timer_setup(&board->timer, NULL, 0);
-+#else
-+ setup_timer(&board->timer, NULL, (unsigned long)board);
-+#endif
- board->ibbase = 0;
- board->ibirq = 0;
- board->ibdma = 0;
-diff -ur linux-gpib-4.1.0/drivers/gpib/sys/ostimer.c linux-gpib-4.1.0-k415/drivers/gpib/sys/ostimer.c
---- linux-gpib-4.1.0/drivers/gpib/sys/ostimer.c 2016-06-22 10:48:48.000000000 +0200
-+++ linux-gpib-4.1.0-k415/drivers/gpib/sys/ostimer.c 2018-01-29 21:00:09.728177393 +0100
-@@ -20,11 +20,17 @@
- /*
- * Timer functions
- */
--void watchdog_timeout( unsigned long arg )
- /* Watchdog timeout routine */
-+
-+#ifdef HAVE_TIMER_SETUP
-+void watchdog_timeout( struct timer_list *t )
-+{
-+ gpib_board_t *board = from_timer(board, t, timer);
-+#else
-+void watchdog_timeout( unsigned long arg )
- {
- gpib_board_t *board = (gpib_board_t*) arg;
--
-+#endif
- set_bit( TIMO_NUM, &board->status );
- wake_up_interruptible( &board->wait );
- }
-@@ -42,10 +48,8 @@
-
- if( usec_timeout > 0 )
- {
-- board->timer.expires = jiffies + usec_to_jiffies( usec_timeout ); /* set number of ticks */
- board->timer.function = watchdog_timeout;
-- board->timer.data = (unsigned long) board;
-- add_timer( &board->timer ); /* add timer */
-+ mod_timer(&board->timer, jiffies + usec_to_jiffies( usec_timeout )); /* set number of ticks */
- }
- }
-
-diff -ur linux-gpib-4.1.0/drivers/gpib/sys/osutil.c linux-gpib-4.1.0-k415/drivers/gpib/sys/osutil.c
---- linux-gpib-4.1.0/drivers/gpib/sys/osutil.c 2016-06-22 10:48:48.000000000 +0200
-+++ linux-gpib-4.1.0-k415/drivers/gpib/sys/osutil.c 2018-01-29 20:59:08.427580118 +0100
-@@ -49,19 +49,25 @@
- return (HZ + 99) / 100;
- }
-
-+#ifdef HAVE_TIMER_SETUP
-+void pseudo_irq_handler(struct timer_list *t)
-+{
-+ struct gpib_pseudo_irq *pseudo_irq = from_timer(pseudo_irq, t, timer);
-+#else
- void pseudo_irq_handler(unsigned long arg)
- {
-- gpib_board_t *board = (gpib_board_t*) arg;
-- if(board->pseudo_irq.handler)
-- board->pseudo_irq.handler(0, board
-+ struct gpib_pseudo_irq *pseudo_irq = (struct gpib_pseudo_irq *)arg;
-+#endif
-+ if(pseudo_irq->handler)
-+ pseudo_irq->handler(0, pseudo_irq->board
- #ifdef HAVE_PT_REGS
- , NULL
- #endif
- );
- else
- printk("gpib: bug! pseudo_irq.handler is NULL\n");
-- if(atomic_read(&board->pseudo_irq.active))
-- mod_timer(&board->pseudo_irq.timer, jiffies + pseudo_irq_period());
-+ if(atomic_read(&pseudo_irq->active))
-+ mod_timer(&pseudo_irq->timer, jiffies + pseudo_irq_period());
- }
-
- int gpib_request_pseudo_irq(gpib_board_t *board, irqreturn_t (*handler)(int, void * PT_REGS_ARG))
-@@ -73,11 +79,10 @@
- }
-
- board->pseudo_irq.handler = handler;
-- board->pseudo_irq.timer.expires = jiffies + pseudo_irq_period();
- board->pseudo_irq.timer.function = pseudo_irq_handler;
-- board->pseudo_irq.timer.data = (unsigned long) board;
-+ board->pseudo_irq.board = board;
- atomic_set(&board->pseudo_irq.active, 1);
-- add_timer(&board->pseudo_irq.timer);
-+ mod_timer(&board->pseudo_irq.timer, jiffies + pseudo_irq_period());
-
- return 0;
- }