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); }
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); }