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 #include #include #include @@ -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 #include +#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; }