int usba10_usb_register_event_cbs( dev_info_t *dip, usb_event_t *usb_evt_data, usb_flags_t flags) { return (usb_register_event_cbs(dip, usb_evt_data, flags)); }
/* * ds_attach */ static int uftdi_attach(ds_attach_info_t *aip) { uftdi_state_t *uf; usb_dev_descr_t *dd; int recognized; uf = kmem_zalloc(sizeof (*uf), KM_SLEEP); uf->uf_dip = aip->ai_dip; uf->uf_usb_events = aip->ai_usb_events; *aip->ai_hdl = (ds_hdl_t)uf; /* only one port */ *aip->ai_port_cnt = 1; if (usb_client_attach(uf->uf_dip, USBDRV_VERSION, 0) != USB_SUCCESS) { uftdi_cleanup(uf, 1); return (USB_FAILURE); } if (usb_get_dev_data(uf->uf_dip, &uf->uf_dev_data, USB_PARSE_LVL_IF, 0) != USB_SUCCESS) { uftdi_cleanup(uf, 2); return (USB_FAILURE); } uf->uf_hwport = FTDI_PIT_SIOA + uf->uf_dev_data->dev_curr_if; mutex_init(&uf->uf_lock, NULL, MUTEX_DRIVER, uf->uf_dev_data->dev_iblock_cookie); cv_init(&uf->uf_tx_cv, NULL, CV_DRIVER, NULL); uf->uf_lh = usb_alloc_log_hdl(uf->uf_dip, "uftdi", &uftdi_errlevel, &uftdi_errmask, &uftdi_instance_debug, 0); /* * This device and its clones has numerous physical instantiations. */ recognized = B_TRUE; dd = uf->uf_dev_data->dev_descr; switch (dd->idVendor) { case USB_VENDOR_FTDI: switch (dd->idProduct) { case USB_PRODUCT_FTDI_SERIAL_8U232AM: case USB_PRODUCT_FTDI_SEMC_DSS20: case USB_PRODUCT_FTDI_CFA_631: case USB_PRODUCT_FTDI_CFA_632: case USB_PRODUCT_FTDI_CFA_633: case USB_PRODUCT_FTDI_CFA_634: case USB_PRODUCT_FTDI_CFA_635: case USB_PRODUCT_FTDI_USBSERIAL: case USB_PRODUCT_FTDI_MX2_3: case USB_PRODUCT_FTDI_MX4_5: case USB_PRODUCT_FTDI_LK202: case USB_PRODUCT_FTDI_LK204: case USB_PRODUCT_FTDI_TACTRIX_OPENPORT_13M: case USB_PRODUCT_FTDI_TACTRIX_OPENPORT_13S: case USB_PRODUCT_FTDI_TACTRIX_OPENPORT_13U: case USB_PRODUCT_FTDI_EISCOU: case USB_PRODUCT_FTDI_UOPTBR: case USB_PRODUCT_FTDI_EMCU2D: case USB_PRODUCT_FTDI_PCMSFU: case USB_PRODUCT_FTDI_EMCU2H: break; default: recognized = B_FALSE; break; } break; case USB_VENDOR_SIIG2: switch (dd->idProduct) { case USB_PRODUCT_SIIG2_US2308: break; default: recognized = B_FALSE; break; } break; case USB_VENDOR_INTREPIDCS: switch (dd->idProduct) { case USB_PRODUCT_INTREPIDCS_VALUECAN: case USB_PRODUCT_INTREPIDCS_NEOVI: break; default: recognized = B_FALSE; break; } break; case USB_VENDOR_BBELECTRONICS: switch (dd->idProduct) { case USB_PRODUCT_BBELECTRONICS_USOTL4: break; default: recognized = B_FALSE; break; } break; case USB_VENDOR_MELCO: switch (dd->idProduct) { case USB_PRODUCT_MELCO_PCOPRS1: break; default: recognized = B_FALSE; break; } break; case USB_VENDOR_MARVELL: switch (dd->idProduct) { case USB_PRODUCT_MARVELL_SHEEVAPLUG_JTAG: break; default: recognized = B_FALSE; break; } break; default: recognized = B_FALSE; break; } /* * Set 'uftdi_attach_unrecognized' to non-zero to * experiment with newer devices .. */ if (!recognized && !uftdi_attach_unrecognized) { uftdi_cleanup(uf, 3); return (USB_FAILURE); } USB_DPRINTF_L3(DPRINT_ATTACH, uf->uf_lh, "uftdi: matched vendor 0x%x product 0x%x port %d", dd->idVendor, dd->idProduct, uf->uf_hwport); uf->uf_def_ph = uf->uf_dev_data->dev_default_ph; mutex_enter(&uf->uf_lock); uf->uf_dev_state = USB_DEV_ONLINE; uf->uf_port_state = UFTDI_PORT_CLOSED; mutex_exit(&uf->uf_lock); if (uftdi_create_pm_components(uf) != USB_SUCCESS) { uftdi_cleanup(uf, 3); return (USB_FAILURE); } if (usb_register_event_cbs(uf->uf_dip, uf->uf_usb_events, 0) != USB_SUCCESS) { uftdi_cleanup(uf, 4); return (USB_FAILURE); } if (usb_pipe_get_max_bulk_transfer_size(uf->uf_dip, &uf->uf_xfer_sz) != USB_SUCCESS) { uftdi_cleanup(uf, 5); return (USB_FAILURE); } /* * TODO: modern ftdi devices have deeper (and asymmetric) * fifos than this minimal 64 bytes .. but how to tell * -safely- ? */ #define FTDI_MAX_XFERSIZE 64 if (uf->uf_xfer_sz > FTDI_MAX_XFERSIZE) uf->uf_xfer_sz = FTDI_MAX_XFERSIZE; if (uftdi_dev_attach(uf) != USB_SUCCESS) { uftdi_cleanup(uf, 5); return (USB_FAILURE); } return (USB_SUCCESS); }