diff --git a/drivers/staging/comedi/drivers/mite.c b/drivers/staging/comedi/drivers/mite.c
index 2233a412cf263fe753bd4a1f55d9993ce3b51a05..d97059217825cce44a7d85d4e1b4442d9fece4e0 100644
--- a/drivers/staging/comedi/drivers/mite.c
+++ b/drivers/staging/comedi/drivers/mite.c
@@ -778,7 +778,8 @@ static unsigned int mite_get_status(struct mite_channel *mite_chan)
 	return status;
 }
 
-unsigned int mite_ack_linkc(struct mite_channel *mite_chan)
+unsigned int mite_ack_linkc(struct mite_channel *mite_chan,
+			    struct comedi_subdevice *s)
 {
 	struct mite_struct *mite = mite_chan->mite;
 	unsigned int status;
@@ -787,6 +788,11 @@ unsigned int mite_ack_linkc(struct mite_channel *mite_chan)
 	if (status & CHSR_LINKC)
 		writel(CHOR_CLRLC,
 		       mite->mite_io_addr + MITE_CHOR(mite_chan->channel));
+	if (status & CHSR_XFERR) {
+		dev_err(s->device->class_dev,
+			"mite: transfer error %08x\n", status);
+		s->async->events |= COMEDI_CB_ERROR;
+	}
 
 	return status;
 }
diff --git a/drivers/staging/comedi/drivers/mite.h b/drivers/staging/comedi/drivers/mite.h
index 4942853fb41f1ff5b2f6f48d8a95969d57a901fb..f8364edf8ce88e2951c92d6b4c21d6ea271ff396 100644
--- a/drivers/staging/comedi/drivers/mite.h
+++ b/drivers/staging/comedi/drivers/mite.h
@@ -93,7 +93,8 @@ void mite_dma_arm(struct mite_channel *mite_chan);
 void mite_dma_disarm(struct mite_channel *mite_chan);
 void mite_sync_dma(struct mite_channel *mite_chan, struct comedi_subdevice *s);
 u32 mite_bytes_in_transit(struct mite_channel *mite_chan);
-unsigned int mite_ack_linkc(struct mite_channel *mite_chan);
+unsigned int mite_ack_linkc(struct mite_channel *mite_chan,
+			    struct comedi_subdevice *s);
 int mite_done(struct mite_channel *mite_chan);
 
 void mite_prep_dma(struct mite_channel *mite_chan,
diff --git a/drivers/staging/comedi/drivers/ni_mio_common.c b/drivers/staging/comedi/drivers/ni_mio_common.c
index 3312f978754b682b02f3620d5376ba2625a308a6..2e27815bd6329c0618cdab653de750ffd5f493ff 100644
--- a/drivers/staging/comedi/drivers/ni_mio_common.c
+++ b/drivers/staging/comedi/drivers/ni_mio_common.c
@@ -1317,16 +1317,6 @@ static void handle_a_interrupt(struct comedi_device *dev, unsigned short status,
 #ifdef PCIDMA
 	if (ai_mite_status & CHSR_LINKC)
 		ni_sync_ai_dma(dev);
-
-	if (ai_mite_status & ~(CHSR_INT | CHSR_LINKC | CHSR_DONE | CHSR_MRDY |
-			       CHSR_DRDY | CHSR_DRQ1 | CHSR_DRQ0 | CHSR_ERROR |
-			       CHSR_SABORT | CHSR_XFERR | CHSR_LERR_MASK)) {
-		dev_err(dev->class_dev,
-			"unknown mite interrupt (ai_mite_status=%08x)\n",
-			ai_mite_status);
-		s->async->events |= COMEDI_CB_ERROR;
-		/* disable_irq(dev->irq); */
-	}
 #endif
 
 	/* test for all uncommon interrupt events at the same time */
@@ -1422,15 +1412,6 @@ static void handle_b_interrupt(struct comedi_device *dev,
 
 		mite_handle_b_linkc(devpriv->mite, dev);
 	}
-
-	if (ao_mite_status & ~(CHSR_INT | CHSR_LINKC | CHSR_DONE | CHSR_MRDY |
-			       CHSR_DRDY | CHSR_DRQ1 | CHSR_DRQ0 | CHSR_ERROR |
-			       CHSR_SABORT | CHSR_XFERR | CHSR_LERR_MASK)) {
-		dev_err(dev->class_dev,
-			"unknown mite interrupt (ao_mite_status=%08x)\n",
-			ao_mite_status);
-		s->async->events |= COMEDI_CB_ERROR;
-	}
 #endif
 
 	if (b_status == 0xffff)
@@ -3697,7 +3678,7 @@ static void handle_cdio_interrupt(struct comedi_device *dev)
 
 	spin_lock_irqsave(&devpriv->mite_channel_lock, flags);
 	if (devpriv->cdo_mite_chan) {
-		mite_ack_linkc(devpriv->cdo_mite_chan);
+		mite_ack_linkc(devpriv->cdo_mite_chan, s);
 		mite_sync_dma(devpriv->cdo_mite_chan, s);
 	}
 	spin_unlock_irqrestore(&devpriv->mite_channel_lock, flags);
@@ -5217,9 +5198,11 @@ static irqreturn_t ni_E_interrupt(int irq, void *d)
 
 		spin_lock_irqsave(&devpriv->mite_channel_lock, flags_too);
 		if (devpriv->ai_mite_chan)
-			ai_mite_status = mite_ack_linkc(devpriv->ai_mite_chan);
+			ai_mite_status = mite_ack_linkc(devpriv->ai_mite_chan,
+							dev->read_subdev);
 		if (devpriv->ao_mite_chan)
-			ao_mite_status = mite_ack_linkc(devpriv->ao_mite_chan);
+			ao_mite_status = mite_ack_linkc(devpriv->ao_mite_chan,
+							dev->write_subdev);
 		spin_unlock_irqrestore(&devpriv->mite_channel_lock, flags_too);
 	}
 #endif
diff --git a/drivers/staging/comedi/drivers/ni_pcidio.c b/drivers/staging/comedi/drivers/ni_pcidio.c
index d2276de7ad6a59a4e565555565674beecd222e93..b4c6bab57a26077701d8ff98b3ce04f46ae65b80 100644
--- a/drivers/staging/comedi/drivers/ni_pcidio.c
+++ b/drivers/staging/comedi/drivers/ni_pcidio.c
@@ -400,19 +400,13 @@ static irqreturn_t nidio_interrupt(int irq, void *d)
 
 	spin_lock(&devpriv->mite_channel_lock);
 	if (devpriv->di_mite_chan) {
-		unsigned int m_status = mite_ack_linkc(devpriv->di_mite_chan);
+		unsigned int m_status = mite_ack_linkc(devpriv->di_mite_chan,
+						       s);
 
 		if (m_status & CHSR_LINKC) {
 			mite_sync_dma(devpriv->di_mite_chan, s);
 			/* XXX need to byteswap */
 		}
-		if (m_status & ~(CHSR_INT | CHSR_LINKC | CHSR_DONE | CHSR_DRDY |
-				 CHSR_DRQ1 | CHSR_MRDY)) {
-			dev_dbg(dev->class_dev,
-				"unknown mite interrupt, disabling IRQ\n");
-			async->events |= COMEDI_CB_ERROR;
-			disable_irq(dev->irq);
-		}
 	}
 	spin_unlock(&devpriv->mite_channel_lock);
 
diff --git a/drivers/staging/comedi/drivers/ni_tiocmd.c b/drivers/staging/comedi/drivers/ni_tiocmd.c
index 4c76cb80f34c52648adf4c5619a03010df663ee7..5228b9fc2a720ebdce329ad4304300e3c584daa8 100644
--- a/drivers/staging/comedi/drivers/ni_tiocmd.c
+++ b/drivers/staging/comedi/drivers/ni_tiocmd.c
@@ -429,7 +429,7 @@ void ni_tio_handle_interrupt(struct ni_gpct *counter,
 	}
 	spin_lock_irqsave(&counter->lock, flags);
 	if (counter->mite_chan) {
-		mite_ack_linkc(counter->mite_chan);
+		mite_ack_linkc(counter->mite_chan, s);
 		mite_sync_dma(counter->mite_chan, s);
 	}
 	spin_unlock_irqrestore(&counter->lock, flags);