diff --git a/drivers/staging/comedi/drivers/mite.c b/drivers/staging/comedi/drivers/mite.c index 2233a412cf26..d97059217825 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 4942853fb41f..f8364edf8ce8 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 3312f978754b..2e27815bd632 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 d2276de7ad6a..b4c6bab57a26 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 4c76cb80f34c..5228b9fc2a72 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);