Beispiel #1
0
int
uplcom_open(void *addr, int portno)
{
	struct uplcom_softc *sc = addr;
	usbd_status err;

	if (sc->sc_dying)
		return (EIO);

	DPRINTF(("uplcom_open: sc=%p\n", sc));

	/* Some unknown device frobbing. */
	if (sc->sc_type == UPLCOM_TYPE_HX)
		uplcom_vendor_control_write(sc->sc_udev, 2, 0x44);
	else
		uplcom_vendor_control_write(sc->sc_udev, 2, 0x24);
	
	if (sc->sc_intr_number != -1 && sc->sc_intr_pipe == NULL) {
		sc->sc_intr_buf = malloc(sc->sc_isize, M_USBDEV, M_WAITOK);
		err = usbd_open_pipe_intr(sc->sc_intr_iface, sc->sc_intr_number,
			USBD_SHORT_XFER_OK, &sc->sc_intr_pipe, sc,
			sc->sc_intr_buf, sc->sc_isize,
			uplcom_intr, USBD_DEFAULT_INTERVAL);
		if (err) {
			DPRINTF(("%s: cannot open interrupt pipe (addr %d)\n",
				USBDEVNAME(sc->sc_dev), sc->sc_intr_number));
					return (EIO);
		}
	}

	if (sc->sc_type == UPLCOM_TYPE_HX)
		return (uplcom_pl2303x_init(sc));

	return (0);
}
Beispiel #2
0
static int
uplcom_open(void *addr, int portno)
{
	struct uplcom_softc *sc = addr;
	int err;

	if (sc->sc_ucom.sc_dying)
		return (ENXIO);

	DPRINTF(("uplcom_open: sc = %p\n", sc));

	if (sc->sc_intr_number != -1 && sc->sc_intr_pipe == NULL) {
		sc->sc_status = 0; /* clear status bit */
		sc->sc_intr_buf = malloc(sc->sc_isize, M_USBDEV, M_WAITOK);
		err = usbd_open_pipe_intr(sc->sc_intr_iface,
					  sc->sc_intr_number,
					  USBD_SHORT_XFER_OK,
					  &sc->sc_intr_pipe,
					  sc,
					  sc->sc_intr_buf,
					  sc->sc_isize,
					  uplcom_intr,
					  uplcominterval);
		if (err) {
			printf("%s: cannot open interrupt pipe (addr %d)\n",
			       device_get_nameunit(sc->sc_ucom.sc_dev),
			       sc->sc_intr_number);
			return (EIO);
		}
	}

	if (sc->sc_chiptype == TYPE_PL2303X)
		return (uplcom_pl2303x_init(sc));

	return (0);
}