--- linux-2.6.0-test4/drivers/cdrom/sonycd535.c Fri Aug 22 20:54:17 2003 +++ linux-2.6.0-test4-fwd/drivers/cdrom/sonycd535.c Tue Sep 2 18:24:10 2003 @@ -36,6 +36,10 @@ * module_init & module_exit. * Torben Mathiasen * + * September 2003 - Fix SMP support by removing cli/sti calls. + * Using spinlocks with a wait_queue instead + * Felipe Damasio + * * Things to do: * - handle errors and status better, put everything into a single word * - use interrupts (code mostly there, but a big hole still missing) @@ -219,6 +223,9 @@ static unsigned short data_reg; static spinlock_t sonycd535_lock = SPIN_LOCK_UNLOCKED; /* queue lock */ + +static spinlock_t cdu535_lock = SPIN_LOCK_UNLOCKED; /* Device lock */ + static struct request_queue *sonycd535_queue; static int initialized; /* Has the drive been initialized? */ @@ -340,10 +347,16 @@ if (sony535_irq_used <= 0) { /* poll */ yield(); } else { /* Interrupt driven */ - cli(); + DEFINE_WAIT(wait); + + spin_lock_irq(&cdu535_lock); enable_interrupts(); - interruptible_sleep_on(&cdu535_irq_wait); - sti(); + prepare_to_wait(&cdu535_irq_wait, &wait, TASK_INTERRUPTIBLE); + spin_unlock_irq(&cdu535_lock); + schedule(); + spin_lock_irq(&cdu535_lock); + finish_wait(&cdu535_irq_wait, &wait); + spin_unlock_irq(&cdu535_lock); } }