PERFORCE change 132103 for review
Hans Petter Selasky
hselasky at FreeBSD.org
Sun Dec 30 07:04:33 PST 2007
http://perforce.freebsd.org/chv.cgi?CH=132103
Change 132103 by hselasky at hselasky_laptop001 on 2007/12/30 15:04:26
Fix the "uchcom" interrupt endpoint callback(s).
Affected files ...
.. //depot/projects/usb/src/sys/dev/usb/uchcom.c#11 edit
Differences ...
==== //depot/projects/usb/src/sys/dev/usb/uchcom.c#11 (text+ko) ====
@@ -894,34 +894,60 @@
/* ----------------------------------------------------------------------
* callback when the modem status is changed.
*/
-void
-uchcom_intr(usbd_xfer_handle xfer, usbd_private_handle priv,
- usbd_status status)
+static void
+uchcom_intr_callback(struct usbd_xfer *xfer)
{
- struct uchcom_softc *sc = priv;
- u_char *buf = sc->sc_intr_buf;
+ struct uchcom_softc *sc = xfer->priv_sc;
+ uint8_t buf[UCHCOM_INTR_LEAST];
+
+ switch (USBD_GET_STATE(xfer)) {
+ case USBD_ST_TRANSFERRED:
- if (sc->sc_ucom.sc_dying)
- return;
+ DPRINTF(0, "actlen = %u\n", xfer->actlen);
- if (status != USBD_NORMAL_COMPLETION) {
- if (status == USBD_NOT_STARTED || status == USBD_CANCELLED)
- return;
+ if (xfer->actlen >= UCHCOM_INTR_LEAST) {
+ usbd_copy_out(xfer->frbuffers + 0, 0, buf,
+ UCHCOM_INTR_LEAST);
- DPRINTFN(0, "abnormal status: %s\n",
- usbd_errstr(status));
- usbd_clear_endpoint_stall_async(sc->sc_intr_pipe);
- return;
- }
- DPRINTFN(0, "intr: 0x%02X 0x%02X 0x%02X 0x%02X "
- "0x%02X 0x%02X 0x%02X 0x%02X\n",
+ DPRINTFN(0, "data = 0x%02X 0x%02X 0x%02X 0x%02X\n"
(unsigned)buf[0], (unsigned)buf[1],
- (unsigned)buf[2], (unsigned)buf[3],
- (unsigned)buf[4], (unsigned)buf[5],
- (unsigned)buf[6], (unsigned)buf[7]);
+ (unsigned)buf[2], (unsigned)buf[3]);
uchcom_convert_status(sc, buf[UCHCOM_INTR_STAT1]);
ucom_status_change(&sc->sc_ucom);
+ }
+
+ case USBD_ST_SETUP:
+ if (sc->sc_flag & UCHCOM_FLAG_INTR_STALL) {
+ usbd_transfer_start(sc->sc_xfer[5]);
+ } else {
+ xfer->frlengths[0] = xfer->max_data_length;
+ usbd_start_hardware(xfer);
+ }
+ break;
+
+ default: /* Error */
+ if (xfer->error != USBD_CANCELLED) {
+ sc->sc_flag |= UCHCOM_FLAG_INTR_STALL;
+ usbd_transfer_start(sc->sc_xfer[5]);
+ }
+ break;
+ }
+ return;
+}
+
+static void
+uchcom_intr_clear_stall_callback(struct usbd_xfer *xfer)
+{
+ struct uchcom_softc *sc = xfer->priv_sc;
+ struct usbd_xfer *xfer_other = sc->sc_xfer[4];
+
+ if (usbd_clear_stall_callback(xfer, xfer_other)) {
+ DPRINTF(0, "stall cleared\n");
+ sc->sc_flag &= ~UCHCOM_FLAG_INTR_STALL;
+ usbd_transfer_start(xfer_other);
+ }
+ return;
}
static device_method_t uchcom_methods[] = {
More information about the p4-projects
mailing list