--- src/driver.c.orig 2008-01-30 02:07:00.000000000 +0100 +++ src/driver.c 2008-01-30 02:07:00.000000000 +0100 @@ -91,8 +91,12 @@ static DECLARE_WAIT_QUEUE_HEAD(sched_wait); static DECLARE_WAIT_QUEUE_HEAD(tx_wait); static DECLARE_WAIT_QUEUE_HEAD(rx_wait); +static DECLARE_COMPLETION(hotplug); /* New DECLARE, */ +static DECLARE_COMPLETION(notify); /* New DECLARE, */ +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24)) static DECLARE_MUTEX_LOCKED(hotplug); static DECLARE_MUTEX_LOCKED(notify); +#endif /*---------------------------------------------------------------------------*\ \*---------------------------------------------------------------------------*/ @@ -754,7 +758,7 @@ close_func = func; close_data = data; - INIT_WORK (&closing_work, closing_worker); + INIT_WORK (&closing_work, (work_func_t)closing_worker); schedule_work (&closing_work); LOG("Worker scheduled.\n"); } /* start_closing_worker */ @@ -1171,7 +1175,10 @@ } } LOG("Scheduler thread stopped.\n"); + complete(&hotplug); /* Complete Thread Sync here */ + #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24)) up (&hotplug); + #endif return 0; } /* scheduler */ @@ -1206,7 +1213,10 @@ wake_up_interruptible (&wait); } LOG("Scheduler thread signalled, waiting...\n"); + wait_for_completion(&hotplug); /* Wait for complete Thread Sync */ + #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24)) down (&hotplug); + #endif LOG("Scheduler thread[%d] terminated.\n", thread_pid); } thread_pid = -1;