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