* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
+#include <config.h>
+
#include <sys/time.h>
#include <sys/types.h>
#include <dev/usb/usb.h>
-#include "libusb.h"
#include "libusbi.h"
struct device_priv {
};
struct handle_priv {
- int pipe[2]; /* for event notification */
int endpoints[USB_MAX_ENDPOINTS];
};
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 *);
/*
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() */
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() */
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
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);
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
close(dpriv->fd);
dpriv->fd = -1;
-
- usbi_remove_pollfd(HANDLE_CTX(handle), hpriv->pipe[0]);
-
- close(hpriv->pipe[0]);
- close(hpriv->pipe[1]);
}
int
}
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);
}
}
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
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;