On 2014-09-15 13:59, Luca Ellero wrote:
Signed-off-by: Luca Ellero <luca.ell...@brickedbrain.com>
---
  drivers/staging/comedi/drivers/ni_usb6501.c |  110 +++++++++++++++++++++++++++
  1 file changed, 110 insertions(+)

diff --git a/drivers/staging/comedi/drivers/ni_usb6501.c 
b/drivers/staging/comedi/drivers/ni_usb6501.c
index f55b9f8..cef93d2 100644
--- a/drivers/staging/comedi/drivers/ni_usb6501.c
+++ b/drivers/staging/comedi/drivers/ni_usb6501.c
@@ -272,6 +272,116 @@ end:
        return ret;
  }

+static int ni6501_counter_command(struct comedi_device *dev, int command,
+                                 u32 *counter)
+{
+       struct usb_device *usb = comedi_to_usb_dev(dev);
+       struct ni6501_private *devpriv = dev->private;
+       int request_size, response_size;
+       u8 *tx = devpriv->usb_tx_buf;
+       int ret;
+
+       if (!tx)
+               return -EINVAL;
+
+       if ((command == READ_COUNTER || command ==  WRITE_COUNTER) && !counter)
+               return -EINVAL;
+
+       down(&devpriv->sem);
+
+       switch (command) {
+       case START_COUNTER:
+
+               request_size = sizeof(START_COUNTER_REQUEST);
+               response_size = sizeof(GENERIC_RESPONSE);
+
+               memcpy(tx, START_COUNTER_REQUEST, request_size);
+
+               break;
+
+       case STOP_COUNTER:
+
+               request_size = sizeof(STOP_COUNTER_REQUEST);
+               response_size = sizeof(GENERIC_RESPONSE);
+
+               memcpy(tx, STOP_COUNTER_REQUEST, request_size);
+
+               break;
+
+       case READ_COUNTER:
+
+               request_size = sizeof(READ_COUNTER_REQUEST);
+               response_size = sizeof(READ_COUNTER_RESPONSE);
+
+               memcpy(tx, READ_COUNTER_REQUEST, request_size);
+
+               break;
+
+       case WRITE_COUNTER:
+
+               request_size = sizeof(WRITE_COUNTER_REQUEST);
+               response_size = sizeof(GENERIC_RESPONSE);
+
+               memcpy(tx, WRITE_COUNTER_REQUEST, request_size);
+
+               /* Setup tx packet: bytes 12,13,14,15 hold the */
+               /* u32 counter value (Big Endian)              */
+               *((u32 *)&tx[12]) = cpu_to_be32(*counter);

It will work as-is, but to avoid "sparse" warnings, use:

                *((__be32 *)&tx[12]) = cpu_to_be32(*counter);

+
+               break;
+
+       default:
+               ret = -EINVAL;
+               goto end;
+       }
+
+       ret = usb_bulk_msg(usb,
+                          usb_sndbulkpipe(usb,
+                                          devpriv->ep_tx->bEndpointAddress),
+                          devpriv->usb_tx_buf,
+                          request_size,
+                          NULL,
+                          NI6501_TIMEOUT);
+       if (ret)
+               goto end;
+
+       ret = usb_bulk_msg(usb,
+                          usb_rcvbulkpipe(usb,
+                                          devpriv->ep_rx->bEndpointAddress),
+                          devpriv->usb_rx_buf,
+                          response_size,
+                          NULL,
+                          NI6501_TIMEOUT);
+       if (ret)
+               goto end;
+
+       /* Check if results are valid */
+
+       if (command == READ_COUNTER) {
+               int i;
+
+               /* Read counter value: bytes 12,13,14,15 of rx packet */
+               /* hold the u32 counter value (Big Endian)            */
+               *counter = be32_to_cpu(*((u32 *)&devpriv->usb_rx_buf[12]));

Similarly, to avoid "sparse" warning here, use:

                *counter = be32_to_cpu(*((__be32 *)&devpriv->usb_rx_buf[12]));


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

Reply via email to