36#include <sys/stdint.h>
37#include <sys/stddef.h>
42#include <sys/kernel.h>
44#include <sys/module.h>
47#include <sys/condvar.h>
48#include <sys/sysctl.h>
50#include <sys/unistd.h>
51#include <sys/callout.h>
52#include <sys/malloc.h>
58#include <dev/usb/usb.h>
59#include <dev/usb/usbdi.h>
60#include <dev/usb/usb_ioctl.h>
62#define USB_DEBUG_VAR usb_debug
63#include <dev/usb/usb_debug.h>
64#include <dev/usb/usb_dev.h>
70#define UBTBCMFW_CONFIG_NO 1
71#define UBTBCMFW_IFACE_IDX 0
73#define UBTBCMFW_BSIZE 1024
74#define UBTBCMFW_IFQ_MAXLEN 2
117 .basename[0] =
"ubtbcmfw",
118 .basename[1] =
"ubtbcmfw",
119 .basename[2] =
"ubtbcmfw",
134 .direction = UE_DIR_OUT,
137 .flags = { .pipe_bof = 1, .force_short_xfer = 1,
138 .proxy_buffer = 1, },
143 .type = UE_INTERRUPT,
145 .direction = UE_DIR_IN,
148 .flags = { .pipe_bof = 1, .short_xfer_ok = 1,
149 .proxy_buffer = 1, },
177 { USB_VPI(USB_VENDOR_BROADCOM, USB_PRODUCT_BROADCOM_BCM2033, 0) },
191 struct usb_attach_arg *uaa = device_get_ivars(dev);
193 if (uaa->usb_mode != USB_MODE_HOST)
196 if (uaa->info.bIfaceIndex != 0)
209 struct usb_attach_arg *uaa = device_get_ivars(dev);
216 device_set_usb_desc(dev);
218 mtx_init(&sc->
sc_mtx,
"ubtbcmfw lock", NULL, MTX_DEF | MTX_RECURSE);
221 error = usbd_transfer_setup(uaa->device, &iface_index, sc->
sc_xfer,
225 device_printf(dev,
"allocating USB transfers failed. %s\n",
230 error = usb_fifo_attach(uaa->device, sc, &sc->
sc_mtx,
232 device_get_unit(dev), 0 - 1, uaa->info.bIfaceIndex,
233 UID_ROOT, GID_OPERATOR, 0644);
235 device_printf(dev,
"could not attach fifo. %s\n",
274 struct usb_fifo *f = sc->
sc_fifo.fp[USB_FIFO_TX];
275 struct usb_page_cache *pc;
278 switch (USB_GET_STATE(xfer)) {
280 case USB_ST_TRANSFERRED:
282 pc = usbd_xfer_get_frame(xfer, 0);
283 if (usb_fifo_get_data(f, pc, 0, usbd_xfer_max_len(xfer),
285 usbd_xfer_set_frame_len(xfer, 0, actlen);
286 usbd_transfer_submit(xfer);
291 if (error != USB_ERR_CANCELLED) {
293 usbd_xfer_set_stall(xfer);
308 struct usb_fifo *fifo = sc->
sc_fifo.fp[USB_FIFO_RX];
309 struct usb_page_cache *pc;
312 usbd_xfer_status(xfer, &actlen, NULL, NULL, NULL);
314 switch (USB_GET_STATE(xfer)) {
315 case USB_ST_TRANSFERRED:
316 pc = usbd_xfer_get_frame(xfer, 0);
317 usb_fifo_put_data(fifo, pc, 0, actlen, 1);
322 if (usb_fifo_put_bytes_max(fifo) > 0) {
323 usbd_xfer_set_frame_len(xfer, 0, usbd_xfer_max_len(xfer));
324 usbd_transfer_submit(xfer);
329 if (error != USB_ERR_CANCELLED) {
331 usbd_xfer_set_stall(xfer);
395 struct usb_xfer *xfer;
404 else if (fflags & FWRITE)
409 if (usb_fifo_alloc_buffer(fifo, usbd_xfer_max_len(xfer),
423 if (fflags & (FREAD | FWRITE))
424 usb_fifo_free_buffer(fifo);
439 case USB_GET_DEVICE_DESC:
440 memcpy(
data, usbd_get_device_descriptor(sc->
sc_udev),
441 sizeof(
struct usb_device_descriptor));
struct usb_fifo_sc sc_fifo
struct usb_xfer * sc_xfer[UBTBCMFW_N_TRANSFER]
struct usb_device * sc_udev
static usb_fifo_close_t ubtbcmfw_close
static usb_fifo_cmd_t ubtbcmfw_start_write
static devclass_t ubtbcmfw_devclass
static usb_fifo_cmd_t ubtbcmfw_stop_write
static usb_callback_t ubtbcmfw_write_callback
static device_method_t ubtbcmfw_methods[]
static const struct usb_config ubtbcmfw_config[UBTBCMFW_N_TRANSFER]
static struct usb_fifo_methods ubtbcmfw_fifo_methods
static usb_fifo_open_t ubtbcmfw_open
static const STRUCT_USB_HOST_ID ubtbcmfw_devs[]
static device_probe_t ubtbcmfw_probe
DRIVER_MODULE(ubtbcmfw, uhub, ubtbcmfw_driver, ubtbcmfw_devclass, NULL, 0)
static usb_callback_t ubtbcmfw_read_callback
static usb_fifo_cmd_t ubtbcmfw_start_read
#define UBTBCMFW_IFACE_IDX
static driver_t ubtbcmfw_driver
MODULE_DEPEND(ubtbcmfw, usb, 1, 1, 1)
USB_PNP_HOST_INFO(ubtbcmfw_devs)
#define UBTBCMFW_IFQ_MAXLEN
static device_detach_t ubtbcmfw_detach
static device_attach_t ubtbcmfw_attach
static usb_fifo_ioctl_t ubtbcmfw_ioctl
static usb_fifo_cmd_t ubtbcmfw_stop_read