From owner-p4-projects@FreeBSD.ORG Sun Dec 30 15:04:33 2007 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 1B0AE16A421; Sun, 30 Dec 2007 15:04:33 +0000 (UTC) Delivered-To: perforce@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id D473D16A41B for ; Sun, 30 Dec 2007 15:04:32 +0000 (UTC) (envelope-from hselasky@FreeBSD.org) Received: from repoman.freebsd.org (repoman.freebsd.org [IPv6:2001:4f8:fff6::29]) by mx1.freebsd.org (Postfix) with ESMTP id C474713C465 for ; Sun, 30 Dec 2007 15:04:32 +0000 (UTC) (envelope-from hselasky@FreeBSD.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.14.1/8.14.1) with ESMTP id lBUF4WTM004023 for ; Sun, 30 Dec 2007 15:04:32 GMT (envelope-from hselasky@FreeBSD.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.1/8.14.1/Submit) id lBUF4WoI004020 for perforce@freebsd.org; Sun, 30 Dec 2007 15:04:32 GMT (envelope-from hselasky@FreeBSD.org) Date: Sun, 30 Dec 2007 15:04:32 GMT Message-Id: <200712301504.lBUF4WoI004020@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to hselasky@FreeBSD.org using -f From: Hans Petter Selasky To: Perforce Change Reviews Cc: Subject: PERFORCE change 132103 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 30 Dec 2007 15:04:33 -0000 http://perforce.freebsd.org/chv.cgi?CH=132103 Change 132103 by hselasky@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[] = {