The IOP interrupt handler iop_ism_irq() is used by the adb-iop
driver to poll for ADB request completion. Unfortunately, it is not
re-entrant. Fix the race condition by adding an iop_ism_irq_poll()
function with suitable mutual exclusion.
Tested-by: Stan Johnson <userm57@yahoo.com>
Signed-off-by: Finn Thain <fthain@telegraphics.com.au>
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Cc: linuxppc-dev@lists.ozlabs.org
Signed-off-by: Geert Uytterhoeven <geert@linux-m68k.org>
 extern void iop_upload_code(uint, __u8 *, uint, __u16);
 extern void iop_download_code(uint, __u8 *, uint, __u16);
 extern __u8 *iop_compare_code(uint, __u8 *, uint, __u16);
+extern void iop_ism_irq_poll(uint);
 
 extern void iop_register_interrupts(void);
 
 
        }
        return IRQ_HANDLED;
 }
+
+void iop_ism_irq_poll(uint iop_num)
+{
+       unsigned long flags;
+
+       local_irq_save(flags);
+       iop_ism_irq(0, (void *)iop_num);
+       local_irq_restore(flags);
+}
 
 
 /*#define DEBUG_ADB_IOP*/
 
-extern void iop_ism_irq(int, void *);
-
 static struct adb_request *current_req;
 static struct adb_request *last_req;
 #if 0
 void adb_iop_poll(void)
 {
        if (adb_iop_state == idle) adb_iop_start();
-       iop_ism_irq(0, (void *) ADB_IOP);
+       iop_ism_irq_poll(ADB_IOP);
 }
 
 int adb_iop_reset_bus(void)