Deleted Added
full compact
uhid.c (193045) uhid.c (194228)
1/* $NetBSD: uhid.c,v 1.46 2001/11/13 06:24:55 lukem Exp $ */
2
3/* Also already merged from NetBSD:
4 * $NetBSD: uhid.c,v 1.54 2002/09/23 05:51:21 simonb Exp $
5 */
6
7#include <sys/cdefs.h>
1/* $NetBSD: uhid.c,v 1.46 2001/11/13 06:24:55 lukem Exp $ */
2
3/* Also already merged from NetBSD:
4 * $NetBSD: uhid.c,v 1.54 2002/09/23 05:51:21 simonb Exp $
5 */
6
7#include <sys/cdefs.h>
8__FBSDID("$FreeBSD: head/sys/dev/usb/input/uhid.c 193045 2009-05-29 18:46:57Z thompsa $");
8__FBSDID("$FreeBSD: head/sys/dev/usb/input/uhid.c 194228 2009-06-15 01:02:43Z thompsa $");
9
10/*-
11 * Copyright (c) 1998 The NetBSD Foundation, Inc.
12 * All rights reserved.
13 *
14 * This code is derived from software contributed to The NetBSD Foundation
15 * by Lennart Augustsson (lennart@augustsson.net) at
16 * Carlstedt Research & Technology.

--- 137 unchanged lines hidden (view full) ---

154{
155 struct uhid_softc *sc = xfer->priv_sc;
156
157 switch (USB_GET_STATE(xfer)) {
158 case USB_ST_TRANSFERRED:
159 DPRINTF("transferred!\n");
160
161 if (xfer->actlen >= sc->sc_isize) {
9
10/*-
11 * Copyright (c) 1998 The NetBSD Foundation, Inc.
12 * All rights reserved.
13 *
14 * This code is derived from software contributed to The NetBSD Foundation
15 * by Lennart Augustsson (lennart@augustsson.net) at
16 * Carlstedt Research & Technology.

--- 137 unchanged lines hidden (view full) ---

154{
155 struct uhid_softc *sc = xfer->priv_sc;
156
157 switch (USB_GET_STATE(xfer)) {
158 case USB_ST_TRANSFERRED:
159 DPRINTF("transferred!\n");
160
161 if (xfer->actlen >= sc->sc_isize) {
162 usb2_fifo_put_data(
162 usb_fifo_put_data(
163 sc->sc_fifo.fp[USB_FIFO_RX],
164 xfer->frbuffers,
165 0, sc->sc_isize, 1);
166 } else {
167 /* ignore it */
168 DPRINTF("ignored short transfer, "
169 "%d bytes\n", xfer->actlen);
170 }
171
172 case USB_ST_SETUP:
173re_submit:
163 sc->sc_fifo.fp[USB_FIFO_RX],
164 xfer->frbuffers,
165 0, sc->sc_isize, 1);
166 } else {
167 /* ignore it */
168 DPRINTF("ignored short transfer, "
169 "%d bytes\n", xfer->actlen);
170 }
171
172 case USB_ST_SETUP:
173re_submit:
174 if (usb2_fifo_put_bytes_max(
174 if (usb_fifo_put_bytes_max(
175 sc->sc_fifo.fp[USB_FIFO_RX]) != 0) {
176 xfer->frlengths[0] = sc->sc_isize;
175 sc->sc_fifo.fp[USB_FIFO_RX]) != 0) {
176 xfer->frlengths[0] = sc->sc_isize;
177 usb2_start_hardware(xfer);
177 usbd_transfer_submit(xfer);
178 }
179 return;
180
181 default: /* Error */
182 if (xfer->error != USB_ERR_CANCELLED) {
183 /* try to clear stall first */
184 xfer->flags.stall_pipe = 1;
185 goto re_submit;

--- 36 unchanged lines hidden (view full) ---

222 uint8_t id;
223
224 switch (USB_GET_STATE(xfer)) {
225 case USB_ST_TRANSFERRED:
226 case USB_ST_SETUP:
227 /* try to extract the ID byte */
228 if (sc->sc_oid) {
229
178 }
179 return;
180
181 default: /* Error */
182 if (xfer->error != USB_ERR_CANCELLED) {
183 /* try to clear stall first */
184 xfer->flags.stall_pipe = 1;
185 goto re_submit;

--- 36 unchanged lines hidden (view full) ---

222 uint8_t id;
223
224 switch (USB_GET_STATE(xfer)) {
225 case USB_ST_TRANSFERRED:
226 case USB_ST_SETUP:
227 /* try to extract the ID byte */
228 if (sc->sc_oid) {
229
230 if (usb2_fifo_get_data(
230 if (usb_fifo_get_data(
231 sc->sc_fifo.fp[USB_FIFO_TX],
232 xfer->frbuffers,
233 0, 1, &actlen, 0)) {
234 if (actlen != 1) {
235 goto tr_error;
236 }
231 sc->sc_fifo.fp[USB_FIFO_TX],
232 xfer->frbuffers,
233 0, 1, &actlen, 0)) {
234 if (actlen != 1) {
235 goto tr_error;
236 }
237 usb2_copy_out(xfer->frbuffers, 0, &id, 1);
237 usbd_copy_out(xfer->frbuffers, 0, &id, 1);
238
239 } else {
240 return;
241 }
242 if (size) {
243 size--;
244 }
245 } else {
246 id = 0;
247 }
248
238
239 } else {
240 return;
241 }
242 if (size) {
243 size--;
244 }
245 } else {
246 id = 0;
247 }
248
249 if (usb2_fifo_get_data(
249 if (usb_fifo_get_data(
250 sc->sc_fifo.fp[USB_FIFO_TX],
251 xfer->frbuffers + 1,
252 0, UHID_BSIZE, &actlen, 1)) {
253 if (actlen != size) {
254 goto tr_error;
255 }
256 uhid_fill_set_report
257 (&req, sc->sc_iface_no,
258 UHID_OUTPUT_REPORT, id, size);
259
250 sc->sc_fifo.fp[USB_FIFO_TX],
251 xfer->frbuffers + 1,
252 0, UHID_BSIZE, &actlen, 1)) {
253 if (actlen != size) {
254 goto tr_error;
255 }
256 uhid_fill_set_report
257 (&req, sc->sc_iface_no,
258 UHID_OUTPUT_REPORT, id, size);
259
260 usb2_copy_in(xfer->frbuffers, 0, &req, sizeof(req));
260 usbd_copy_in(xfer->frbuffers, 0, &req, sizeof(req));
261
262 xfer->frlengths[0] = sizeof(req);
263 xfer->frlengths[1] = size;
264 xfer->nframes = xfer->frlengths[1] ? 2 : 1;
261
262 xfer->frlengths[0] = sizeof(req);
263 xfer->frlengths[1] = size;
264 xfer->nframes = xfer->frlengths[1] ? 2 : 1;
265 usb2_start_hardware(xfer);
265 usbd_transfer_submit(xfer);
266 }
267 return;
268
269 default:
270tr_error:
271 /* bomb out */
266 }
267 return;
268
269 default:
270tr_error:
271 /* bomb out */
272 usb2_fifo_get_data_error(sc->sc_fifo.fp[USB_FIFO_TX]);
272 usb_fifo_get_data_error(sc->sc_fifo.fp[USB_FIFO_TX]);
273 return;
274 }
275}
276
277static void
278uhid_read_callback(struct usb_xfer *xfer)
279{
280 struct uhid_softc *sc = xfer->priv_sc;
281 struct usb_device_request req;
282
283 switch (USB_GET_STATE(xfer)) {
284 case USB_ST_TRANSFERRED:
273 return;
274 }
275}
276
277static void
278uhid_read_callback(struct usb_xfer *xfer)
279{
280 struct uhid_softc *sc = xfer->priv_sc;
281 struct usb_device_request req;
282
283 switch (USB_GET_STATE(xfer)) {
284 case USB_ST_TRANSFERRED:
285 usb2_fifo_put_data(sc->sc_fifo.fp[USB_FIFO_RX], xfer->frbuffers,
285 usb_fifo_put_data(sc->sc_fifo.fp[USB_FIFO_RX], xfer->frbuffers,
286 sizeof(req), sc->sc_isize, 1);
287 return;
288
289 case USB_ST_SETUP:
290
286 sizeof(req), sc->sc_isize, 1);
287 return;
288
289 case USB_ST_SETUP:
290
291 if (usb2_fifo_put_bytes_max(sc->sc_fifo.fp[USB_FIFO_RX]) > 0) {
291 if (usb_fifo_put_bytes_max(sc->sc_fifo.fp[USB_FIFO_RX]) > 0) {
292
293 uhid_fill_get_report
294 (&req, sc->sc_iface_no, UHID_INPUT_REPORT,
295 sc->sc_iid, sc->sc_isize);
296
292
293 uhid_fill_get_report
294 (&req, sc->sc_iface_no, UHID_INPUT_REPORT,
295 sc->sc_iid, sc->sc_isize);
296
297 usb2_copy_in(xfer->frbuffers, 0, &req, sizeof(req));
297 usbd_copy_in(xfer->frbuffers, 0, &req, sizeof(req));
298
299 xfer->frlengths[0] = sizeof(req);
300 xfer->frlengths[1] = sc->sc_isize;
301 xfer->nframes = xfer->frlengths[1] ? 2 : 1;
298
299 xfer->frlengths[0] = sizeof(req);
300 xfer->frlengths[1] = sc->sc_isize;
301 xfer->nframes = xfer->frlengths[1] ? 2 : 1;
302 usb2_start_hardware(xfer);
302 usbd_transfer_submit(xfer);
303 }
304 return;
305
306 default: /* Error */
307 /* bomb out */
303 }
304 return;
305
306 default: /* Error */
307 /* bomb out */
308 usb2_fifo_put_data_error(sc->sc_fifo.fp[USB_FIFO_RX]);
308 usb_fifo_put_data_error(sc->sc_fifo.fp[USB_FIFO_RX]);
309 return;
310 }
311}
312
313static const struct usb_config uhid_config[UHID_N_TRANSFER] = {
314
315 [UHID_INTR_DT_RD] = {
316 .type = UE_INTERRUPT,

--- 24 unchanged lines hidden (view full) ---

341};
342
343static void
344uhid_start_read(struct usb_fifo *fifo)
345{
346 struct uhid_softc *sc = fifo->priv_sc0;
347
348 if (sc->sc_flags & UHID_FLAG_IMMED) {
309 return;
310 }
311}
312
313static const struct usb_config uhid_config[UHID_N_TRANSFER] = {
314
315 [UHID_INTR_DT_RD] = {
316 .type = UE_INTERRUPT,

--- 24 unchanged lines hidden (view full) ---

341};
342
343static void
344uhid_start_read(struct usb_fifo *fifo)
345{
346 struct uhid_softc *sc = fifo->priv_sc0;
347
348 if (sc->sc_flags & UHID_FLAG_IMMED) {
349 usb2_transfer_start(sc->sc_xfer[UHID_CTRL_DT_RD]);
349 usbd_transfer_start(sc->sc_xfer[UHID_CTRL_DT_RD]);
350 } else {
350 } else {
351 usb2_transfer_start(sc->sc_xfer[UHID_INTR_DT_RD]);
351 usbd_transfer_start(sc->sc_xfer[UHID_INTR_DT_RD]);
352 }
353}
354
355static void
356uhid_stop_read(struct usb_fifo *fifo)
357{
358 struct uhid_softc *sc = fifo->priv_sc0;
359
352 }
353}
354
355static void
356uhid_stop_read(struct usb_fifo *fifo)
357{
358 struct uhid_softc *sc = fifo->priv_sc0;
359
360 usb2_transfer_stop(sc->sc_xfer[UHID_CTRL_DT_RD]);
361 usb2_transfer_stop(sc->sc_xfer[UHID_INTR_DT_RD]);
360 usbd_transfer_stop(sc->sc_xfer[UHID_CTRL_DT_RD]);
361 usbd_transfer_stop(sc->sc_xfer[UHID_INTR_DT_RD]);
362}
363
364static void
365uhid_start_write(struct usb_fifo *fifo)
366{
367 struct uhid_softc *sc = fifo->priv_sc0;
368
362}
363
364static void
365uhid_start_write(struct usb_fifo *fifo)
366{
367 struct uhid_softc *sc = fifo->priv_sc0;
368
369 usb2_transfer_start(sc->sc_xfer[UHID_CTRL_DT_WR]);
369 usbd_transfer_start(sc->sc_xfer[UHID_CTRL_DT_WR]);
370}
371
372static void
373uhid_stop_write(struct usb_fifo *fifo)
374{
375 struct uhid_softc *sc = fifo->priv_sc0;
376
370}
371
372static void
373uhid_stop_write(struct usb_fifo *fifo)
374{
375 struct uhid_softc *sc = fifo->priv_sc0;
376
377 usb2_transfer_stop(sc->sc_xfer[UHID_CTRL_DT_WR]);
377 usbd_transfer_stop(sc->sc_xfer[UHID_CTRL_DT_WR]);
378}
379
380static int
381uhid_get_report(struct uhid_softc *sc, uint8_t type,
382 uint8_t id, void *kern_data, void *user_data,
383 uint16_t len)
384{
385 int err;
386 uint8_t free_data = 0;
387
388 if (kern_data == NULL) {
389 kern_data = malloc(len, M_USBDEV, M_WAITOK);
390 if (kern_data == NULL) {
391 err = ENOMEM;
392 goto done;
393 }
394 free_data = 1;
395 }
378}
379
380static int
381uhid_get_report(struct uhid_softc *sc, uint8_t type,
382 uint8_t id, void *kern_data, void *user_data,
383 uint16_t len)
384{
385 int err;
386 uint8_t free_data = 0;
387
388 if (kern_data == NULL) {
389 kern_data = malloc(len, M_USBDEV, M_WAITOK);
390 if (kern_data == NULL) {
391 err = ENOMEM;
392 goto done;
393 }
394 free_data = 1;
395 }
396 err = usb2_req_get_report(sc->sc_udev, NULL, kern_data,
396 err = usbd_req_get_report(sc->sc_udev, NULL, kern_data,
397 len, sc->sc_iface_index, type, id);
398 if (err) {
399 err = ENXIO;
400 goto done;
401 }
402 if (user_data) {
403 /* dummy buffer */
404 err = copyout(kern_data, user_data, len);

--- 23 unchanged lines hidden (view full) ---

428 goto done;
429 }
430 free_data = 1;
431 err = copyin(user_data, kern_data, len);
432 if (err) {
433 goto done;
434 }
435 }
397 len, sc->sc_iface_index, type, id);
398 if (err) {
399 err = ENXIO;
400 goto done;
401 }
402 if (user_data) {
403 /* dummy buffer */
404 err = copyout(kern_data, user_data, len);

--- 23 unchanged lines hidden (view full) ---

428 goto done;
429 }
430 free_data = 1;
431 err = copyin(user_data, kern_data, len);
432 if (err) {
433 goto done;
434 }
435 }
436 err = usb2_req_set_report(sc->sc_udev, NULL, kern_data,
436 err = usbd_req_set_report(sc->sc_udev, NULL, kern_data,
437 len, sc->sc_iface_index, type, id);
438 if (err) {
439 err = ENXIO;
440 goto done;
441 }
442done:
443 if (free_data) {
444 free(kern_data, M_USBDEV);

--- 9 unchanged lines hidden (view full) ---

454 /*
455 * The buffers are one byte larger than maximum so that one
456 * can detect too large read/writes and short transfers:
457 */
458 if (fflags & FREAD) {
459 /* reset flags */
460 sc->sc_flags &= ~UHID_FLAG_IMMED;
461
437 len, sc->sc_iface_index, type, id);
438 if (err) {
439 err = ENXIO;
440 goto done;
441 }
442done:
443 if (free_data) {
444 free(kern_data, M_USBDEV);

--- 9 unchanged lines hidden (view full) ---

454 /*
455 * The buffers are one byte larger than maximum so that one
456 * can detect too large read/writes and short transfers:
457 */
458 if (fflags & FREAD) {
459 /* reset flags */
460 sc->sc_flags &= ~UHID_FLAG_IMMED;
461
462 if (usb2_fifo_alloc_buffer(fifo,
462 if (usb_fifo_alloc_buffer(fifo,
463 sc->sc_isize + 1, UHID_FRAME_NUM)) {
464 return (ENOMEM);
465 }
466 }
467 if (fflags & FWRITE) {
463 sc->sc_isize + 1, UHID_FRAME_NUM)) {
464 return (ENOMEM);
465 }
466 }
467 if (fflags & FWRITE) {
468 if (usb2_fifo_alloc_buffer(fifo,
468 if (usb_fifo_alloc_buffer(fifo,
469 sc->sc_osize + 1, UHID_FRAME_NUM)) {
470 return (ENOMEM);
471 }
472 }
473 return (0);
474}
475
476static void
477uhid_close(struct usb_fifo *fifo, int fflags)
478{
479 if (fflags & (FREAD | FWRITE)) {
469 sc->sc_osize + 1, UHID_FRAME_NUM)) {
470 return (ENOMEM);
471 }
472 }
473 return (0);
474}
475
476static void
477uhid_close(struct usb_fifo *fifo, int fflags)
478{
479 if (fflags & (FREAD | FWRITE)) {
480 usb2_fifo_free_buffer(fifo);
480 usb_fifo_free_buffer(fifo);
481 }
482}
483
484static int
485uhid_ioctl(struct usb_fifo *fifo, u_long cmd, void *addr,
486 int fflags)
487{
488 struct uhid_softc *sc = fifo->priv_sc0;

--- 122 unchanged lines hidden (view full) ---

611 /* the Xbox 360 gamepad doesn't use the HID class */
612
613 if ((uaa->info.bInterfaceClass != UICLASS_VENDOR) ||
614 (uaa->info.bInterfaceSubClass != UISUBCLASS_XBOX360_CONTROLLER) ||
615 (uaa->info.bInterfaceProtocol != UIPROTO_XBOX360_GAMEPAD)) {
616 return (ENXIO);
617 }
618 }
481 }
482}
483
484static int
485uhid_ioctl(struct usb_fifo *fifo, u_long cmd, void *addr,
486 int fflags)
487{
488 struct uhid_softc *sc = fifo->priv_sc0;

--- 122 unchanged lines hidden (view full) ---

611 /* the Xbox 360 gamepad doesn't use the HID class */
612
613 if ((uaa->info.bInterfaceClass != UICLASS_VENDOR) ||
614 (uaa->info.bInterfaceSubClass != UISUBCLASS_XBOX360_CONTROLLER) ||
615 (uaa->info.bInterfaceProtocol != UIPROTO_XBOX360_GAMEPAD)) {
616 return (ENXIO);
617 }
618 }
619 if (usb2_test_quirk(uaa, UQ_HID_IGNORE)) {
619 if (usb_test_quirk(uaa, UQ_HID_IGNORE)) {
620 return (ENXIO);
621 }
622 return (0);
623}
624
625static int
626uhid_attach(device_t dev)
627{
628 struct usb_attach_arg *uaa = device_get_ivars(dev);
629 struct uhid_softc *sc = device_get_softc(dev);
630 int unit = device_get_unit(dev);
631 int error = 0;
632
633 DPRINTFN(10, "sc=%p\n", sc);
634
620 return (ENXIO);
621 }
622 return (0);
623}
624
625static int
626uhid_attach(device_t dev)
627{
628 struct usb_attach_arg *uaa = device_get_ivars(dev);
629 struct uhid_softc *sc = device_get_softc(dev);
630 int unit = device_get_unit(dev);
631 int error = 0;
632
633 DPRINTFN(10, "sc=%p\n", sc);
634
635 device_set_usb2_desc(dev);
635 device_set_usb_desc(dev);
636
637 mtx_init(&sc->sc_mtx, "uhid lock", NULL, MTX_DEF | MTX_RECURSE);
638
639 sc->sc_udev = uaa->device;
640
641 sc->sc_iface_no = uaa->info.bIfaceNum;
642 sc->sc_iface_index = uaa->info.bIfaceIndex;
643
636
637 mtx_init(&sc->sc_mtx, "uhid lock", NULL, MTX_DEF | MTX_RECURSE);
638
639 sc->sc_udev = uaa->device;
640
641 sc->sc_iface_no = uaa->info.bIfaceNum;
642 sc->sc_iface_index = uaa->info.bIfaceIndex;
643
644 error = usb2_transfer_setup(uaa->device,
644 error = usbd_transfer_setup(uaa->device,
645 &uaa->info.bIfaceIndex, sc->sc_xfer, uhid_config,
646 UHID_N_TRANSFER, sc, &sc->sc_mtx);
647
648 if (error) {
645 &uaa->info.bIfaceIndex, sc->sc_xfer, uhid_config,
646 UHID_N_TRANSFER, sc, &sc->sc_mtx);
647
648 if (error) {
649 DPRINTF("error=%s\n", usb2_errstr(error));
649 DPRINTF("error=%s\n", usbd_errstr(error));
650 goto detach;
651 }
652 if (uaa->info.idVendor == USB_VENDOR_WACOM) {
653
654 /* the report descriptor for the Wacom Graphire is broken */
655
656 if (uaa->info.idProduct == USB_PRODUCT_WACOM_GRAPHIRE) {
657

--- 5 unchanged lines hidden (view full) ---

663
664 static uint8_t reportbuf[] = {2, 2, 2};
665
666 /*
667 * The Graphire3 needs 0x0202 to be written to
668 * feature report ID 2 before it'll start
669 * returning digitizer data.
670 */
650 goto detach;
651 }
652 if (uaa->info.idVendor == USB_VENDOR_WACOM) {
653
654 /* the report descriptor for the Wacom Graphire is broken */
655
656 if (uaa->info.idProduct == USB_PRODUCT_WACOM_GRAPHIRE) {
657

--- 5 unchanged lines hidden (view full) ---

663
664 static uint8_t reportbuf[] = {2, 2, 2};
665
666 /*
667 * The Graphire3 needs 0x0202 to be written to
668 * feature report ID 2 before it'll start
669 * returning digitizer data.
670 */
671 error = usb2_req_set_report(uaa->device, NULL,
671 error = usbd_req_set_report(uaa->device, NULL,
672 reportbuf, sizeof(reportbuf),
673 uaa->info.bIfaceIndex, UHID_FEATURE_REPORT, 2);
674
675 if (error) {
676 DPRINTF("set report failed, error=%s (ignored)\n",
672 reportbuf, sizeof(reportbuf),
673 uaa->info.bIfaceIndex, UHID_FEATURE_REPORT, 2);
674
675 if (error) {
676 DPRINTF("set report failed, error=%s (ignored)\n",
677 usb2_errstr(error));
677 usbd_errstr(error));
678 }
679 sc->sc_repdesc_size = sizeof(uhid_graphire3_4x5_report_descr);
680 sc->sc_repdesc_ptr = USB_ADD_BYTES(uhid_graphire3_4x5_report_descr, 0);
681 sc->sc_flags |= UHID_FLAG_STATIC_DESC;
682 }
683 } else if ((uaa->info.bInterfaceClass == UICLASS_VENDOR) &&
684 (uaa->info.bInterfaceSubClass == UISUBCLASS_XBOX360_CONTROLLER) &&
685 (uaa->info.bInterfaceProtocol == UIPROTO_XBOX360_GAMEPAD)) {
686
687 /* the Xbox 360 gamepad has no report descriptor */
688 sc->sc_repdesc_size = sizeof(uhid_xb360gp_report_descr);
689 sc->sc_repdesc_ptr = USB_ADD_BYTES(uhid_xb360gp_report_descr, 0);
690 sc->sc_flags |= UHID_FLAG_STATIC_DESC;
691 }
692 if (sc->sc_repdesc_ptr == NULL) {
693
678 }
679 sc->sc_repdesc_size = sizeof(uhid_graphire3_4x5_report_descr);
680 sc->sc_repdesc_ptr = USB_ADD_BYTES(uhid_graphire3_4x5_report_descr, 0);
681 sc->sc_flags |= UHID_FLAG_STATIC_DESC;
682 }
683 } else if ((uaa->info.bInterfaceClass == UICLASS_VENDOR) &&
684 (uaa->info.bInterfaceSubClass == UISUBCLASS_XBOX360_CONTROLLER) &&
685 (uaa->info.bInterfaceProtocol == UIPROTO_XBOX360_GAMEPAD)) {
686
687 /* the Xbox 360 gamepad has no report descriptor */
688 sc->sc_repdesc_size = sizeof(uhid_xb360gp_report_descr);
689 sc->sc_repdesc_ptr = USB_ADD_BYTES(uhid_xb360gp_report_descr, 0);
690 sc->sc_flags |= UHID_FLAG_STATIC_DESC;
691 }
692 if (sc->sc_repdesc_ptr == NULL) {
693
694 error = usb2_req_get_hid_desc(uaa->device, NULL,
694 error = usbd_req_get_hid_desc(uaa->device, NULL,
695 &sc->sc_repdesc_ptr, &sc->sc_repdesc_size,
696 M_USBDEV, uaa->info.bIfaceIndex);
697
698 if (error) {
699 device_printf(dev, "no report descriptor\n");
700 goto detach;
701 }
702 }
695 &sc->sc_repdesc_ptr, &sc->sc_repdesc_size,
696 M_USBDEV, uaa->info.bIfaceIndex);
697
698 if (error) {
699 device_printf(dev, "no report descriptor\n");
700 goto detach;
701 }
702 }
703 error = usb2_req_set_idle(uaa->device, NULL,
703 error = usbd_req_set_idle(uaa->device, NULL,
704 uaa->info.bIfaceIndex, 0, 0);
705
706 if (error) {
707 DPRINTF("set idle failed, error=%s (ignored)\n",
704 uaa->info.bIfaceIndex, 0, 0);
705
706 if (error) {
707 DPRINTF("set idle failed, error=%s (ignored)\n",
708 usb2_errstr(error));
708 usbd_errstr(error));
709 }
710 sc->sc_isize = hid_report_size
711 (sc->sc_repdesc_ptr, sc->sc_repdesc_size, hid_input, &sc->sc_iid);
712
713 sc->sc_osize = hid_report_size
714 (sc->sc_repdesc_ptr, sc->sc_repdesc_size, hid_output, &sc->sc_oid);
715
716 sc->sc_fsize = hid_report_size

--- 13 unchanged lines hidden (view full) ---

730 }
731 if (sc->sc_fsize > UHID_BSIZE) {
732 DPRINTF("feature size is too large, "
733 "%d bytes (truncating)\n",
734 sc->sc_fsize);
735 sc->sc_fsize = UHID_BSIZE;
736 }
737
709 }
710 sc->sc_isize = hid_report_size
711 (sc->sc_repdesc_ptr, sc->sc_repdesc_size, hid_input, &sc->sc_iid);
712
713 sc->sc_osize = hid_report_size
714 (sc->sc_repdesc_ptr, sc->sc_repdesc_size, hid_output, &sc->sc_oid);
715
716 sc->sc_fsize = hid_report_size

--- 13 unchanged lines hidden (view full) ---

730 }
731 if (sc->sc_fsize > UHID_BSIZE) {
732 DPRINTF("feature size is too large, "
733 "%d bytes (truncating)\n",
734 sc->sc_fsize);
735 sc->sc_fsize = UHID_BSIZE;
736 }
737
738 error = usb2_fifo_attach(uaa->device, sc, &sc->sc_mtx,
738 error = usb_fifo_attach(uaa->device, sc, &sc->sc_mtx,
739 &uhid_fifo_methods, &sc->sc_fifo,
740 unit, 0 - 1, uaa->info.bIfaceIndex,
741 UID_ROOT, GID_OPERATOR, 0644);
742 if (error) {
743 goto detach;
744 }
745 return (0); /* success */
746
747detach:
748 uhid_detach(dev);
749 return (ENOMEM);
750}
751
752static int
753uhid_detach(device_t dev)
754{
755 struct uhid_softc *sc = device_get_softc(dev);
756
739 &uhid_fifo_methods, &sc->sc_fifo,
740 unit, 0 - 1, uaa->info.bIfaceIndex,
741 UID_ROOT, GID_OPERATOR, 0644);
742 if (error) {
743 goto detach;
744 }
745 return (0); /* success */
746
747detach:
748 uhid_detach(dev);
749 return (ENOMEM);
750}
751
752static int
753uhid_detach(device_t dev)
754{
755 struct uhid_softc *sc = device_get_softc(dev);
756
757 usb2_fifo_detach(&sc->sc_fifo);
757 usb_fifo_detach(&sc->sc_fifo);
758
758
759 usb2_transfer_unsetup(sc->sc_xfer, UHID_N_TRANSFER);
759 usbd_transfer_unsetup(sc->sc_xfer, UHID_N_TRANSFER);
760
761 if (sc->sc_repdesc_ptr) {
762 if (!(sc->sc_flags & UHID_FLAG_STATIC_DESC)) {
763 free(sc->sc_repdesc_ptr, M_USBDEV);
764 }
765 }
766 mtx_destroy(&sc->sc_mtx);
767

--- 20 unchanged lines hidden ---
760
761 if (sc->sc_repdesc_ptr) {
762 if (!(sc->sc_flags & UHID_FLAG_STATIC_DESC)) {
763 free(sc->sc_repdesc_ptr, M_USBDEV);
764 }
765 }
766 mtx_destroy(&sc->sc_mtx);
767

--- 20 unchanged lines hidden ---