m68k/mac: Add mutual exclusion for IOP interrupt polling
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>
This commit is contained in:
parent
8ee90c5c3f
commit
92178fcabb
|
@ -158,6 +158,7 @@ extern void iop_complete_message(struct iop_msg *);
|
|||
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);
|
||||
|
||||
|
|
|
@ -598,3 +598,12 @@ irqreturn_t iop_ism_irq(int irq, void *dev_id)
|
|||
}
|
||||
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);
|
||||
}
|
||||
|
|
|
@ -29,8 +29,6 @@
|
|||
|
||||
/*#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
|
||||
|
@ -265,7 +263,7 @@ int adb_iop_autopoll(int devs)
|
|||
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)
|
||||
|
|
Loading…
Reference in New Issue