static u_int __init test_irq(u_short sock, int irq)
 {
     debug(2, "  testing ISA irq %d\n", irq);
-    if (request_irq(irq, i365_count_irq, 0, "scan", i365_count_irq) != 0)
+    if (request_irq(irq, i365_count_irq, SA_PROBEIRQ, "scan",
+                       i365_count_irq) != 0)
        return 1;
     irq_hits = 0; irq_sock = sock;
     msleep(10);
     } else {
        /* Fallback: just find interrupts that aren't in use */
        for (i = 0; i < 16; i++)
-           if ((mask0 & (1 << i)) && (_check_irq(i, 0) == 0))
+           if ((mask0 & (1 << i)) && (_check_irq(i, SA_PROBEIRQ) == 0))
                mask1 |= (1 << i);
        printk("default");
        /* If scan failed, default to polled status */
        u_int cs_mask = mask & ((cs_irq) ? (1<<cs_irq) : ~(1<<12));
        for (cs_irq = 15; cs_irq > 0; cs_irq--)
            if ((cs_mask & (1 << cs_irq)) &&
-               (_check_irq(cs_irq, 0) == 0))
+               (_check_irq(cs_irq, SA_PROBEIRQ) == 0))
                break;
        if (cs_irq) {
            grab_irq = 1;
 
  * SA_INTERRUPT is also used by the irq handling routines.
  * SA_SHIRQ is for shared interrupt support on PCI and EISA.
  */
-#define SA_PROBE               SA_ONESHOT
 #define SA_SAMPLE_RANDOM       SA_RESTART
 #define SA_SHIRQ               0x04000000
+#define SA_PROBEIRQ            0x08000000
 #endif
 
 #define SIG_BLOCK          0   /* for blocking signals */
 
  *
  * SA_INTERRUPT is also used by the irq handling routines.
  * SA_SHIRQ is for shared interrupt support on PCI and EISA.
+ * SA_PROBEIRQ is set by callers when they expect sharing mismatches to occur
  */
-#define SA_PROBE               SA_ONESHOT
 #define SA_SAMPLE_RANDOM       SA_RESTART
 #define SA_SHIRQ               0x04000000
+#define SA_PROBEIRQ            0x08000000
+
 /*
  * As above, these correspond to the IORESOURCE_IRQ_* defines in
  * linux/ioport.h to select the interrupt line behaviour.  When
 
 
 mismatch:
        spin_unlock_irqrestore(&desc->lock, flags);
-       printk(KERN_ERR "%s: irq handler mismatch\n", __FUNCTION__);
-       dump_stack();
+       if (!(new->flags & SA_PROBEIRQ)) {
+               printk(KERN_ERR "%s: irq handler mismatch\n", __FUNCTION__);
+               dump_stack();
+       }
        return -EBUSY;
 }