core: Add provisions for per-context private backend data
[platform/upstream/libusb.git] / libusb / os / netbsd_usb.c
index 1e8d602..93a1e22 100644 (file)
@@ -16,6 +16,8 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
+#include <config.h>
+
 #include <sys/time.h>
 #include <sys/types.h>
 
@@ -28,7 +30,6 @@
 
 #include <dev/usb/usb.h>
 
-#include "libusb.h"
 #include "libusbi.h"
 
 struct device_priv {
@@ -40,7 +41,6 @@ struct device_priv {
 };
 
 struct handle_priv {
-       int pipe[2];                            /* for event notification */
        int endpoints[USB_MAX_ENDPOINTS];
 };
 
@@ -74,8 +74,7 @@ static void netbsd_destroy_device(struct libusb_device *);
 static int netbsd_submit_transfer(struct usbi_transfer *);
 static int netbsd_cancel_transfer(struct usbi_transfer *);
 static void netbsd_clear_transfer_priv(struct usbi_transfer *);
-static int netbsd_handle_events(struct libusb_context *ctx, struct pollfd *,
-    nfds_t, int);
+static int netbsd_handle_transfer_completion(struct usbi_transfer *);
 static int netbsd_clock_gettime(int, struct timespec *);
 
 /*
@@ -87,7 +86,7 @@ static int _sync_control_transfer(struct usbi_transfer *);
 static int _sync_gen_transfer(struct usbi_transfer *);
 static int _access_endpoint(struct libusb_transfer *);
 
-const struct usbi_os_backend netbsd_backend = {
+const struct usbi_os_backend usbi_backend = {
        "Synchronous NetBSD backend",
        0,
        NULL,                           /* init() */
@@ -112,6 +111,12 @@ const struct usbi_os_backend netbsd_backend = {
        netbsd_clear_halt,
        netbsd_reset_device,
 
+       NULL,                           /* alloc_streams */
+       NULL,                           /* free_streams */
+
+       NULL,                           /* dev_mem_alloc() */
+       NULL,                           /* dev_mem_free() */
+
        NULL,                           /* kernel_driver_active() */
        NULL,                           /* detach_kernel_driver() */
        NULL,                           /* attach_kernel_driver() */
@@ -122,13 +127,14 @@ const struct usbi_os_backend netbsd_backend = {
        netbsd_cancel_transfer,
        netbsd_clear_transfer_priv,
 
-       netbsd_handle_events,
+       NULL,                           /* handle_events() */
+       netbsd_handle_transfer_completion,
 
        netbsd_clock_gettime,
+       0,                              /* context_priv_size */
        sizeof(struct device_priv),
        sizeof(struct handle_priv),
        0,                              /* transfer_priv_size */
-       0,                              /* add_iso_packet_size */
 };
 
 int
@@ -161,9 +167,7 @@ netbsd_get_device_list(struct libusb_context * ctx,
                session_id = (di.udi_bus << 8 | di.udi_addr);
                dev = usbi_get_device_by_session_id(ctx, session_id);
 
-               if (dev) {
-                       dev = libusb_ref_device(dev);
-               } else {
+               if (dev == NULL) {
                        dev = usbi_alloc_device(ctx, session_id);
                        if (dev == NULL)
                                return (LIBUSB_ERROR_NO_MEM);
@@ -221,10 +225,7 @@ netbsd_open(struct libusb_device_handle *handle)
 
        usbi_dbg("open %s: fd %d", dpriv->devnode, dpriv->fd);
 
-       if (pipe(hpriv->pipe) < 0)
-               return _errno_to_libusb(errno);
-
-       return usbi_add_pollfd(HANDLE_CTX(handle), hpriv->pipe[0], POLLIN);
+       return (LIBUSB_SUCCESS);
 }
 
 void
@@ -237,11 +238,6 @@ netbsd_close(struct libusb_device_handle *handle)
 
        close(dpriv->fd);
        dpriv->fd = -1;
-
-       usbi_remove_pollfd(HANDLE_CTX(handle), hpriv->pipe[0]);
-
-       close(hpriv->pipe[0]);
-       close(hpriv->pipe[1]);
 }
 
 int
@@ -460,13 +456,15 @@ netbsd_submit_transfer(struct usbi_transfer *itransfer)
                }
                err = _sync_gen_transfer(itransfer);
                break;
+       case LIBUSB_TRANSFER_TYPE_BULK_STREAM:
+               err = LIBUSB_ERROR_NOT_SUPPORTED;
+               break;
        }
 
        if (err)
                return (err);
 
-       if (write(hpriv->pipe[1], &itransfer, sizeof(itransfer)) < 0)
-               return _errno_to_libusb(errno);
+       usbi_signal_transfer_completion(itransfer);
 
        return (LIBUSB_SUCCESS);
 }
@@ -488,63 +486,9 @@ netbsd_clear_transfer_priv(struct usbi_transfer *itransfer)
 }
 
 int
-netbsd_handle_events(struct libusb_context *ctx, struct pollfd *fds, nfds_t nfds,
-    int num_ready)
+netbsd_handle_transfer_completion(struct usbi_transfer *itransfer)
 {
-       struct libusb_device_handle *handle;
-       struct handle_priv *hpriv = NULL;
-       struct usbi_transfer *itransfer;
-       struct pollfd *pollfd;
-       int i, err = 0;
-
-       usbi_dbg("");
-
-       pthread_mutex_lock(&ctx->open_devs_lock);
-       for (i = 0; i < nfds && num_ready > 0; i++) {
-               pollfd = &fds[i];
-
-               if (!pollfd->revents)
-                       continue;
-
-               hpriv = NULL;
-               num_ready--;
-               list_for_each_entry(handle, &ctx->open_devs, list,
-                   struct libusb_device_handle) {
-                       hpriv = (struct handle_priv *)handle->os_priv;
-
-                       if (hpriv->pipe[0] == pollfd->fd)
-                               break;
-
-                       hpriv = NULL;
-               }
-
-               if (NULL == hpriv) {
-                       usbi_dbg("fd %d is not an event pipe!", pollfd->fd);
-                       err = ENOENT;
-                       break;
-               }
-
-               if (pollfd->revents & POLLERR) {
-                       usbi_remove_pollfd(HANDLE_CTX(handle), hpriv->pipe[0]);
-                       usbi_handle_disconnect(handle);
-                       continue;
-               }
-
-               if (read(hpriv->pipe[0], &itransfer, sizeof(itransfer)) < 0) {
-                       err = errno;
-                       break;
-               }
-
-               if ((err = usbi_handle_transfer_completion(itransfer,
-                   LIBUSB_TRANSFER_COMPLETED)))
-                       break;
-       }
-       pthread_mutex_unlock(&ctx->open_devs_lock);
-
-       if (err)
-               return _errno_to_libusb(err);
-
-       return (LIBUSB_SUCCESS);
+       return usbi_handle_transfer_completion(itransfer, LIBUSB_TRANSFER_COMPLETED);
 }
 
 int
@@ -641,7 +585,7 @@ _sync_control_transfer(struct usbi_transfer *itransfer)
 
        req.ucr_request.bmRequestType = setup->bmRequestType;
        req.ucr_request.bRequest = setup->bRequest;
-       /* Don't use USETW, libusbx already deals with the endianness */
+       /* Don't use USETW, libusb already deals with the endianness */
        (*(uint16_t *)req.ucr_request.wValue) = setup->wValue;
        (*(uint16_t *)req.ucr_request.wIndex) = setup->wIndex;
        (*(uint16_t *)req.ucr_request.wLength) = setup->wLength;