From 848a7f7af0fb490274dc6031b0a79f4440a4948f Mon Sep 17 00:00:00 2001 From: H Hartley Sweeten Date: Mon, 5 Oct 2015 14:23:08 -0700 Subject: [PATCH] staging: comedi: quatech_daqp_cs: fix daqp_ai_cancel() Make sure interrupts are disabled and the event flags are cleared when an analog input async command is canceled. Remove the unnecessary calls to stop any running conversions in the (*insn_read) and (*do_cmd) functions. The comedi core will only call these functions if the subdevice is not busy (it has already been canceled). Signed-off-by: H Hartley Sweeten Reviewed-by: Ian Abbott Signed-off-by: Greg Kroah-Hartman --- drivers/staging/comedi/drivers/quatech_daqp_cs.c | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/drivers/staging/comedi/drivers/quatech_daqp_cs.c b/drivers/staging/comedi/drivers/quatech_daqp_cs.c index c44e7ec..4b9626b 100644 --- a/drivers/staging/comedi/drivers/quatech_daqp_cs.c +++ b/drivers/staging/comedi/drivers/quatech_daqp_cs.c @@ -171,19 +171,21 @@ static int daqp_clear_events(struct comedi_device *dev, int loops) return -EBUSY; } -/* Cancel a running acquisition */ - -static int daqp_ai_cancel(struct comedi_device *dev, struct comedi_subdevice *s) +static int daqp_ai_cancel(struct comedi_device *dev, + struct comedi_subdevice *s) { struct daqp_private *devpriv = dev->private; if (devpriv->stop) return -EIO; + /* + * Stop any conversions, disable interrupts, and clear + * the status event flags. + */ outb(DAQP_CMD_STOP, dev->iobase + DAQP_CMD_REG); - - /* flush any linguring data in FIFO - superfluous here */ - /* outb(DAQP_CMD_RSTF, dev->iobase + DAQP_CMD_REG); */ + outb(0, dev->iobase + DAQP_CTRL_REG); + inb(dev->iobase + DAQP_STATUS_REG); return 0; } @@ -298,9 +300,6 @@ static int daqp_ai_insn_read(struct comedi_device *dev, if (devpriv->stop) return -EIO; - /* Stop any running conversion */ - daqp_ai_cancel(dev, s); - outb(0, dev->iobase + DAQP_AUX_REG); /* Reset scan list queue */ @@ -466,9 +465,6 @@ static int daqp_ai_cmd(struct comedi_device *dev, struct comedi_subdevice *s) if (devpriv->stop) return -EIO; - /* Stop any running conversion */ - daqp_ai_cancel(dev, s); - outb(0, dev->iobase + DAQP_AUX_REG); /* Reset scan list queue */ -- 2.7.4