`daqboard2000_poll_cpld()` waits for a specified status bit in the CPLD
status register to be set, giving up after 50 tries over a period of
about 5 milliseconds.  It returns 1 if the status bit is set, otherwise
0.  It is only ever called to check the "INIT" status bit.  Replace it
with new function `daqboard2000_wait_cpld_init()`, which returns 0 if
the "INIT" status bit becomes set within 50 tries, or `-ETIMEDOUT` if
not set within 50 tries.  The firmware loading callback
`daqboard2000_load_firmware()` may return the error result from
`daqboard2000_wait_cpld_init()` if it has used up all its firmware
loading attempts and that was the last error.

Signed-off-by: Ian Abbott <abbo...@mev.co.uk>
---
 drivers/staging/comedi/drivers/daqboard2000.c | 33 +++++++++++++++------------
 1 file changed, 18 insertions(+), 15 deletions(-)

diff --git a/drivers/staging/comedi/drivers/daqboard2000.c 
b/drivers/staging/comedi/drivers/daqboard2000.c
index 49feec39c4c6..f4c738037e28 100644
--- a/drivers/staging/comedi/drivers/daqboard2000.c
+++ b/drivers/staging/comedi/drivers/daqboard2000.c
@@ -470,17 +470,17 @@ static void daqboard2000_pulse_prog_pin(struct 
comedi_device *dev)
        mdelay(10);     /* Not in the original code, but I like symmetry... */
 }
 
-static int daqboard2000_poll_cpld(struct comedi_device *dev, u16 mask)
+static int daqboard2000_wait_cpld_init(struct comedi_device *dev)
 {
-       int result = 0;
+       int result = -ETIMEDOUT;
        int i;
        u16 cpld;
 
        /* timeout after 50 tries -> 5ms */
        for (i = 0; i < 50; i++) {
                cpld = readw(dev->mmio + DB2K_REG_CPLD_STATUS);
-               if ((cpld & mask) == mask) {
-                       result = 1;
+               if (cpld & DB2K_CPLD_STATUS_INIT) {
+                       result = 0;
                        break;
                }
                usleep_range(100, 1000);
@@ -540,20 +540,23 @@ static int daqboard2000_load_firmware(struct 
comedi_device *dev,
                daqboard2000_reset_local_bus(dev);
                daqboard2000_reload_plx(dev);
                daqboard2000_pulse_prog_pin(dev);
-               if (daqboard2000_poll_cpld(dev, DB2K_CPLD_STATUS_INIT)) {
-                       for (; i < len; i += 2) {
-                               u16 data =
-                                   (cpld_array[i] << 8) + cpld_array[i + 1];
-                               if (!daqboard2000_write_cpld(dev, data))
-                                       break;
-                       }
-                       if (i >= len) {
-                               daqboard2000_reset_local_bus(dev);
-                               daqboard2000_reload_plx(dev);
-                               result = 0;
+               result = daqboard2000_wait_cpld_init(dev);
+               if (result)
+                       continue;
+
+               for (; i < len; i += 2) {
+                       u16 data = (cpld_array[i] << 8) + cpld_array[i + 1];
+
+                       if (!daqboard2000_write_cpld(dev, data)) {
+                               result = -EIO;
                                break;
                        }
                }
+               if (result == 0) {
+                       daqboard2000_reset_local_bus(dev);
+                       daqboard2000_reload_plx(dev);
+                       break;
+               }
        }
        return result;
 }
-- 
2.11.0

_______________________________________________
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel

Reply via email to