PERFORCE change 132105 for review
Hans Petter Selasky
hselasky at FreeBSD.org
Sun Dec 30 07:47:17 PST 2007
http://perforce.freebsd.org/chv.cgi?CH=132105
Change 132105 by hselasky at hselasky_laptop001 on 2007/12/30 15:47:08
Add more USB callbacks to "uchcom". These functions
were taken from "uplcom".
Affected files ...
.. //depot/projects/usb/src/sys/dev/usb/uchcom.c#13 edit
Differences ...
==== //depot/projects/usb/src/sys/dev/usb/uchcom.c#13 (text+ko) ====
@@ -893,6 +893,95 @@
return;
}
+static void
+uchcom_write_callback(struct usbd_xfer *xfer)
+{
+ struct uchcom_softc *sc = xfer->priv_sc;
+ uint32_t actlen;
+
+ switch (USBD_GET_STATE(xfer)) {
+ case USBD_ST_SETUP:
+ case USBD_ST_TRANSFERRED:
+ if (sc->sc_flag & UCHCOM_FLAG_WRITE_STALL) {
+ usbd_transfer_start(sc->sc_xfer[2]);
+ return;
+ }
+ if (ucom_get_data(&(sc->sc_ucom), xfer->frbuffers + 0, 0,
+ UCHCOM_BULK_BUF_SIZE, &actlen)) {
+
+ DPRINTF(0, "actlen = %d\n", actlen);
+
+ xfer->frlengths[0] = actlen;
+ usbd_start_hardware(xfer);
+ }
+ return;
+
+ default: /* Error */
+ if (xfer->error != USBD_CANCELLED) {
+ sc->sc_flag |= UCHCOM_FLAG_WRITE_STALL;
+ usbd_transfer_start(sc->sc_xfer[2]);
+ }
+ return;
+
+ }
+}
+
+static void
+uchcom_write_clear_stall_callback(struct usbd_xfer *xfer)
+{
+ struct uchcom_softc *sc = xfer->priv_sc;
+ struct usbd_xfer *xfer_other = sc->sc_xfer[0];
+
+ if (usbd_clear_stall_callback(xfer, xfer_other)) {
+ DPRINTF(0, "stall cleared\n");
+ sc->sc_flag &= ~UCHCOM_FLAG_WRITE_STALL;
+ usbd_transfer_start(xfer_other);
+ }
+ return;
+}
+
+static void
+uchcom_read_callback(struct usbd_xfer *xfer)
+{
+ struct uchcom_softc *sc = xfer->priv_sc;
+
+ switch (USBD_GET_STATE(xfer)) {
+ case USBD_ST_TRANSFERRED:
+ ucom_put_data(&(sc->sc_ucom), xfer->frbuffers + 0, 0, xfer->actlen);
+
+ case USBD_ST_SETUP:
+ if (sc->sc_flag & UCHCOM_FLAG_READ_STALL) {
+ usbd_transfer_start(sc->sc_xfer[3]);
+ } else {
+ xfer->frlengths[0] = xfer->max_data_length;
+ usbd_start_hardware(xfer);
+ }
+ return;
+
+ default: /* Error */
+ if (xfer->error != USBD_CANCELLED) {
+ sc->sc_flag |= UCHCOM_FLAG_READ_STALL;
+ usbd_transfer_start(sc->sc_xfer[3]);
+ }
+ return;
+
+ }
+}
+
+static void
+uchcom_read_clear_stall_callback(struct usbd_xfer *xfer)
+{
+ struct uchcom_softc *sc = xfer->priv_sc;
+ struct usbd_xfer *xfer_other = sc->sc_xfer[1];
+
+ if (usbd_clear_stall_callback(xfer, xfer_other)) {
+ DPRINTF(0, "stall cleared\n");
+ sc->sc_flag &= ~UCHCOM_FLAG_READ_STALL;
+ usbd_transfer_start(xfer_other);
+ }
+ return;
+}
+
static device_method_t uchcom_methods[] = {
/* Device interface */
DEVMETHOD(device_probe, uchcom_probe),
More information about the p4-projects
mailing list