コード例 #1
0
ファイル: usba10_calls.c プロジェクト: andreiw/polaris
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));
}
コード例 #2
0
ファイル: uftdi_dsd.c プロジェクト: madhavsuresh/illumos-gate
/*
 * 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);
}