summaryrefslogtreecommitdiffstats
path: root/sys/dev/usb/input/uhid.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/dev/usb/input/uhid.c')
-rw-r--r--sys/dev/usb/input/uhid.c126
1 files changed, 70 insertions, 56 deletions
diff --git a/sys/dev/usb/input/uhid.c b/sys/dev/usb/input/uhid.c
index 9390a69..411aeb6 100644
--- a/sys/dev/usb/input/uhid.c
+++ b/sys/dev/usb/input/uhid.c
@@ -48,29 +48,39 @@ __FBSDID("$FreeBSD$");
* HID spec: http://www.usb.org/developers/devclass_docs/HID1_11.pdf
*/
+#include <sys/stdint.h>
+#include <sys/stddef.h>
+#include <sys/param.h>
+#include <sys/queue.h>
+#include <sys/types.h>
+#include <sys/systm.h>
+#include <sys/kernel.h>
+#include <sys/bus.h>
+#include <sys/linker_set.h>
+#include <sys/module.h>
+#include <sys/lock.h>
+#include <sys/mutex.h>
+#include <sys/condvar.h>
+#include <sys/sysctl.h>
+#include <sys/sx.h>
+#include <sys/unistd.h>
+#include <sys/callout.h>
+#include <sys/malloc.h>
+#include <sys/priv.h>
+#include <sys/conf.h>
+#include <sys/fcntl.h>
+
#include "usbdevs.h"
#include <dev/usb/usb.h>
-#include <dev/usb/usb_mfunc.h>
-#include <dev/usb/usb_error.h>
+#include <dev/usb/usbdi.h>
+#include <dev/usb/usbdi_util.h>
#include <dev/usb/usbhid.h>
#include <dev/usb/usb_ioctl.h>
#define USB_DEBUG_VAR uhid_debug
-
-#include <dev/usb/usb_core.h>
-#include <dev/usb/usb_util.h>
#include <dev/usb/usb_debug.h>
-#include <dev/usb/usb_busdma.h>
-#include <dev/usb/usb_process.h>
-#include <dev/usb/usb_transfer.h>
-#include <dev/usb/usb_request.h>
-#include <dev/usb/usb_dynamic.h>
-#include <dev/usb/usb_mbuf.h>
-#include <dev/usb/usb_dev.h>
-#include <dev/usb/usb_hid.h>
#include <dev/usb/input/usb_rdesc.h>
-
#include <dev/usb/quirk/usb_quirk.h>
#if USB_DEBUG
@@ -150,38 +160,40 @@ static struct usb_fifo_methods uhid_fifo_methods = {
};
static void
-uhid_intr_callback(struct usb_xfer *xfer)
+uhid_intr_callback(struct usb_xfer *xfer, usb_error_t error)
{
- struct uhid_softc *sc = xfer->priv_sc;
+ struct uhid_softc *sc = usbd_xfer_softc(xfer);
+ struct usb_page_cache *pc;
+ int actlen;
+
+ usbd_xfer_status(xfer, &actlen, NULL, NULL, NULL);
switch (USB_GET_STATE(xfer)) {
case USB_ST_TRANSFERRED:
DPRINTF("transferred!\n");
- if (xfer->actlen >= sc->sc_isize) {
- usb_fifo_put_data(
- sc->sc_fifo.fp[USB_FIFO_RX],
- xfer->frbuffers,
+ pc = usbd_xfer_get_frame(xfer, 0);
+ if (actlen >= sc->sc_isize) {
+ usb_fifo_put_data(sc->sc_fifo.fp[USB_FIFO_RX], pc,
0, sc->sc_isize, 1);
} else {
/* ignore it */
- DPRINTF("ignored short transfer, "
- "%d bytes\n", xfer->actlen);
+ DPRINTF("ignored short transfer, %d bytes\n", actlen);
}
case USB_ST_SETUP:
re_submit:
if (usb_fifo_put_bytes_max(
sc->sc_fifo.fp[USB_FIFO_RX]) != 0) {
- xfer->frlengths[0] = sc->sc_isize;
+ usbd_xfer_set_frame_len(xfer, 0, sc->sc_isize);
usbd_transfer_submit(xfer);
}
return;
default: /* Error */
- if (xfer->error != USB_ERR_CANCELLED) {
+ if (error != USB_ERR_CANCELLED) {
/* try to clear stall first */
- xfer->flags.stall_pipe = 1;
+ usbd_xfer_set_stall(xfer);
goto re_submit;
}
return;
@@ -213,10 +225,11 @@ uhid_fill_get_report(struct usb_device_request *req, uint8_t iface_no,
}
static void
-uhid_write_callback(struct usb_xfer *xfer)
+uhid_write_callback(struct usb_xfer *xfer, usb_error_t error)
{
- struct uhid_softc *sc = xfer->priv_sc;
+ struct uhid_softc *sc = usbd_xfer_softc(xfer);
struct usb_device_request req;
+ struct usb_page_cache *pc;
uint32_t size = sc->sc_osize;
uint32_t actlen;
uint8_t id;
@@ -226,15 +239,13 @@ uhid_write_callback(struct usb_xfer *xfer)
case USB_ST_SETUP:
/* try to extract the ID byte */
if (sc->sc_oid) {
-
- if (usb_fifo_get_data(
- sc->sc_fifo.fp[USB_FIFO_TX],
- xfer->frbuffers,
+ pc = usbd_xfer_get_frame(xfer, 0);
+ if (usb_fifo_get_data(sc->sc_fifo.fp[USB_FIFO_TX], pc,
0, 1, &actlen, 0)) {
if (actlen != 1) {
goto tr_error;
}
- usbd_copy_out(xfer->frbuffers, 0, &id, 1);
+ usbd_copy_out(pc, 0, &id, 1);
} else {
return;
@@ -246,9 +257,8 @@ uhid_write_callback(struct usb_xfer *xfer)
id = 0;
}
- if (usb_fifo_get_data(
- sc->sc_fifo.fp[USB_FIFO_TX],
- xfer->frbuffers + 1,
+ pc = usbd_xfer_get_frame(xfer, 1);
+ if (usb_fifo_get_data(sc->sc_fifo.fp[USB_FIFO_TX], pc,
0, UHID_BSIZE, &actlen, 1)) {
if (actlen != size) {
goto tr_error;
@@ -257,11 +267,12 @@ uhid_write_callback(struct usb_xfer *xfer)
(&req, sc->sc_iface_no,
UHID_OUTPUT_REPORT, id, size);
- usbd_copy_in(xfer->frbuffers, 0, &req, sizeof(req));
+ pc = usbd_xfer_get_frame(xfer, 0);
+ usbd_copy_in(pc, 0, &req, sizeof(req));
- xfer->frlengths[0] = sizeof(req);
- xfer->frlengths[1] = size;
- xfer->nframes = xfer->frlengths[1] ? 2 : 1;
+ usbd_xfer_set_frame_len(xfer, 0, sizeof(req));
+ usbd_xfer_set_frame_len(xfer, 1, size);
+ usbd_xfer_set_frames(xfer, size ? 2 : 1);
usbd_transfer_submit(xfer);
}
return;
@@ -275,15 +286,18 @@ tr_error:
}
static void
-uhid_read_callback(struct usb_xfer *xfer)
+uhid_read_callback(struct usb_xfer *xfer, usb_error_t error)
{
- struct uhid_softc *sc = xfer->priv_sc;
+ struct uhid_softc *sc = usbd_xfer_softc(xfer);
struct usb_device_request req;
+ struct usb_page_cache *pc;
+
+ pc = usbd_xfer_get_frame(xfer, 0);
switch (USB_GET_STATE(xfer)) {
case USB_ST_TRANSFERRED:
- usb_fifo_put_data(sc->sc_fifo.fp[USB_FIFO_RX], xfer->frbuffers,
- sizeof(req), sc->sc_isize, 1);
+ usb_fifo_put_data(sc->sc_fifo.fp[USB_FIFO_RX], pc, sizeof(req),
+ sc->sc_isize, 1);
return;
case USB_ST_SETUP:
@@ -294,11 +308,11 @@ uhid_read_callback(struct usb_xfer *xfer)
(&req, sc->sc_iface_no, UHID_INPUT_REPORT,
sc->sc_iid, sc->sc_isize);
- usbd_copy_in(xfer->frbuffers, 0, &req, sizeof(req));
+ usbd_copy_in(pc, 0, &req, sizeof(req));
- xfer->frlengths[0] = sizeof(req);
- xfer->frlengths[1] = sc->sc_isize;
- xfer->nframes = xfer->frlengths[1] ? 2 : 1;
+ usbd_xfer_set_frame_len(xfer, 0, sizeof(req));
+ usbd_xfer_set_frame_len(xfer, 1, sc->sc_isize);
+ usbd_xfer_set_frames(xfer, sc->sc_isize ? 2 : 1);
usbd_transfer_submit(xfer);
}
return;
@@ -343,7 +357,7 @@ static const struct usb_config uhid_config[UHID_N_TRANSFER] = {
static void
uhid_start_read(struct usb_fifo *fifo)
{
- struct uhid_softc *sc = fifo->priv_sc0;
+ struct uhid_softc *sc = usb_fifo_softc(fifo);
if (sc->sc_flags & UHID_FLAG_IMMED) {
usbd_transfer_start(sc->sc_xfer[UHID_CTRL_DT_RD]);
@@ -355,7 +369,7 @@ uhid_start_read(struct usb_fifo *fifo)
static void
uhid_stop_read(struct usb_fifo *fifo)
{
- struct uhid_softc *sc = fifo->priv_sc0;
+ struct uhid_softc *sc = usb_fifo_softc(fifo);
usbd_transfer_stop(sc->sc_xfer[UHID_CTRL_DT_RD]);
usbd_transfer_stop(sc->sc_xfer[UHID_INTR_DT_RD]);
@@ -364,7 +378,7 @@ uhid_stop_read(struct usb_fifo *fifo)
static void
uhid_start_write(struct usb_fifo *fifo)
{
- struct uhid_softc *sc = fifo->priv_sc0;
+ struct uhid_softc *sc = usb_fifo_softc(fifo);
usbd_transfer_start(sc->sc_xfer[UHID_CTRL_DT_WR]);
}
@@ -372,7 +386,7 @@ uhid_start_write(struct usb_fifo *fifo)
static void
uhid_stop_write(struct usb_fifo *fifo)
{
- struct uhid_softc *sc = fifo->priv_sc0;
+ struct uhid_softc *sc = usb_fifo_softc(fifo);
usbd_transfer_stop(sc->sc_xfer[UHID_CTRL_DT_WR]);
}
@@ -449,7 +463,7 @@ done:
static int
uhid_open(struct usb_fifo *fifo, int fflags)
{
- struct uhid_softc *sc = fifo->priv_sc0;
+ struct uhid_softc *sc = usb_fifo_softc(fifo);
/*
* The buffers are one byte larger than maximum so that one
@@ -485,7 +499,7 @@ static int
uhid_ioctl(struct usb_fifo *fifo, u_long cmd, void *addr,
int fflags)
{
- struct uhid_softc *sc = fifo->priv_sc0;
+ struct uhid_softc *sc = usb_fifo_softc(fifo);
struct usb_gen_descriptor *ugd;
uint32_t size;
int error = 0;
@@ -656,7 +670,7 @@ uhid_attach(device_t dev)
if (uaa->info.idProduct == USB_PRODUCT_WACOM_GRAPHIRE) {
sc->sc_repdesc_size = sizeof(uhid_graphire_report_descr);
- sc->sc_repdesc_ptr = USB_ADD_BYTES(uhid_graphire_report_descr, 0);
+ sc->sc_repdesc_ptr = &uhid_graphire_report_descr;
sc->sc_flags |= UHID_FLAG_STATIC_DESC;
} else if (uaa->info.idProduct == USB_PRODUCT_WACOM_GRAPHIRE3_4X5) {
@@ -677,7 +691,7 @@ uhid_attach(device_t dev)
usbd_errstr(error));
}
sc->sc_repdesc_size = sizeof(uhid_graphire3_4x5_report_descr);
- sc->sc_repdesc_ptr = USB_ADD_BYTES(uhid_graphire3_4x5_report_descr, 0);
+ sc->sc_repdesc_ptr = &uhid_graphire3_4x5_report_descr;
sc->sc_flags |= UHID_FLAG_STATIC_DESC;
}
} else if ((uaa->info.bInterfaceClass == UICLASS_VENDOR) &&
@@ -686,7 +700,7 @@ uhid_attach(device_t dev)
/* the Xbox 360 gamepad has no report descriptor */
sc->sc_repdesc_size = sizeof(uhid_xb360gp_report_descr);
- sc->sc_repdesc_ptr = USB_ADD_BYTES(uhid_xb360gp_report_descr, 0);
+ sc->sc_repdesc_ptr = &uhid_xb360gp_report_descr;
sc->sc_flags |= UHID_FLAG_STATIC_DESC;
}
if (sc->sc_repdesc_ptr == NULL) {
OpenPOWER on IntegriCloud