Re: [PATCH 49/51 v2] staging: comedi: ni_labpc: fix labpc_eeprom_insn_write()

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 2013-03-22 16:58, H Hartley Sweeten wrote:
The comedi core expects the (*insn_write) operations to write insn->n
values and return the number of values actually wrote.

Make this function work like the core expects.

Also, remove the noise about invalid channels.

Signed-off-by: H Hartley Sweeten <hsweeten@xxxxxxxxxxxxxxxxxxx>
Cc: Ian Abbott <abbotti@xxxxxxxxx>
Cc: Greg Kroah-Hartman <gregkh@xxxxxxxxxxxxxxxxxxx>
---
  drivers/staging/comedi/drivers/ni_labpc.c | 20 ++++++++++----------
  1 file changed, 10 insertions(+), 10 deletions(-)

diff --git a/drivers/staging/comedi/drivers/ni_labpc.c b/drivers/staging/comedi/drivers/ni_labpc.c
index 0afcede..6461a46 100644
--- a/drivers/staging/comedi/drivers/ni_labpc.c
+++ b/drivers/staging/comedi/drivers/ni_labpc.c
@@ -1568,21 +1568,21 @@ static int labpc_eeprom_insn_write(struct comedi_device *dev,
  				   struct comedi_insn *insn,
  				   unsigned int *data)
  {
-	int channel = CR_CHAN(insn->chanspec);
+	unsigned int chan = CR_CHAN(insn->chanspec);
  	int ret;
+	int i;

-	/*  only allow writes to user area of eeprom */
-	if (channel < 16 || channel > 127) {
-		dev_dbg(dev->class_dev,
-			"eeprom writes are only allowed to channels 16 through 127 (the pointer and user areas)\n");
+	/* only allow writes to user area of eeprom */
+	if (chan < 16 || chan > 127)
  		return -EINVAL;
-	}

-	ret = labpc_eeprom_write(dev, channel, data[0]);
-	if (ret < 0)
-		return ret;
+	for (i = 0; i < insn->n; i++) {
+		ret = labpc_eeprom_write(dev, chan, data[i]);
+		if (ret)
+			return ret;
+	}

-	return 1;
+	return insn->n;
  }

This might not actually work if insn->n > 0 as the second call to labpc_eeprom_write() might time out (it starts off reading a status register up to 10000 times waiting for a previous call to labpc_eeprom_write() to complete, but the only delay in the loop is the register access itself).

It's probably safer to just write the last data value as follows, as the preceding data would be overwritten anyway:

	if (insn->n > 0) {
		ret = labpc_eeprom_write(dev, chan, data[insn->n - 1]);
		if (ret)
			return ret;
	}

	return insn->n;

--
-=( Ian Abbott @ MEV Ltd.    E-mail: <abbotti@xxxxxxxxx>        )=-
-=( Tel: +44 (0)161 477 1898   FAX: +44 (0)161 718 3587         )=-
_______________________________________________
devel mailing list
devel@xxxxxxxxxxxxxxxxxxxxxx
http://driverdev.linuxdriverproject.org/mailman/listinfo/devel




[Index of Archives]     [Linux Driver Backports]     [DMA Engine]     [Linux GPIO]     [Linux SPI]     [Video for Linux]     [Linux USB Devel]     [Linux Coverity]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]
  Powered by Linux