From owner-p4-projects@FreeBSD.ORG Sun Dec 30 14:43:10 2007 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 99FF116A41B; Sun, 30 Dec 2007 14:43:10 +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 5F4F516A417 for ; Sun, 30 Dec 2007 14:43:10 +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 4D8DA13C45B for ; Sun, 30 Dec 2007 14:43:10 +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 lBUEhALc093346 for ; Sun, 30 Dec 2007 14:43:10 GMT (envelope-from hselasky@FreeBSD.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.1/8.14.1/Submit) id lBUEhA5G093339 for perforce@freebsd.org; Sun, 30 Dec 2007 14:43:10 GMT (envelope-from hselasky@FreeBSD.org) Date: Sun, 30 Dec 2007 14:43:10 GMT Message-Id: <200712301443.lBUEhA5G093339@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 132100 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 14:43:11 -0000 http://perforce.freebsd.org/chv.cgi?CH=132100 Change 132100 by hselasky@hselasky_laptop001 on 2007/12/30 14:42:52 New function "uchcom_do_request". Handle control transfer errors centrally instead of everywhere in the code. When a read- control transfer fails we simply return 0x00 for data. Else we don't care except for printing out an error message. Optionally we could nicely loop in "uchcom_do_request" until the request succeeds. Affected files ... .. //depot/projects/usb/src/sys/dev/usb/uchcom.c#8 edit Differences ... ==== //depot/projects/usb/src/sys/dev/usb/uchcom.c#8 (text+ko) ==== @@ -398,7 +398,37 @@ * low level i/o */ -static usbd_status +static void +uchcom_do_request(struct uchcom_softc *sc, + usb_device_request_t *req, void *data) +{ + uint16_t length; + uint16_t actlen; + usbd_status_t err; + + length = UGETW(req->wLength); + actlen = 0; + + if (ucom_cfg_is_gone(&(sc->sc_ucom))) { + goto done; + } + err = usbd_do_request_flags(sc->sc_udev, &Giant, req, + data, USBD_SHORT_XFER_OK, &actlen, 1000); + + if (err) { + DPRINTFN(-1, "device request failed, err=%s " + "(ignored)\n", usbd_errstr(err)); + } +done: + if (length != actlen) { + if (req->bmRequestType & UT_READ) { + bzero(USBD_ADD_BYTES(data,actlen), length - actlen); + } + } + return; +} + +static void uchcom_ctrl_write(struct uchcom_softc *sc, uint8_t reqno, uint16_t value, uint16_t index) { @@ -410,13 +440,13 @@ USETW(req.wIndex, index); USETW(req.wLength, 0); - return (usbd_do_request(sc->sc_ucom.sc_udev, &req, 0)); + uchcom_do_request(sc, &req, NULL); + return; } -static usbd_status +static void uchcom_ctrl_read(struct uchcom_softc *sc, uint8_t reqno, - uint16_t value, uint16_t index, void *buf, int buflen, - int *actlen) + uint16_t value, uint16_t index, void *buf, uint16_t buflen) { usb_device_request_t req; @@ -424,47 +454,43 @@ req.bRequest = reqno; USETW(req.wValue, value); USETW(req.wIndex, index); - USETW(req.wLength, (uint16_t)buflen); + USETW(req.wLength, buflen); - return (usbd_do_request_flags(sc->sc_ucom.sc_udev, &req, buf, - USBD_SHORT_XFER_OK, actlen, - USBD_DEFAULT_TIMEOUT)); + uchcom_do_request(sc, &req, buf); + return; } -static usbd_status +static void uchcom_write_reg(struct uchcom_softc *sc, uint8_t reg1, uint8_t val1, uint8_t reg2, uint8_t val2) { - DPRINTF(("uchcom: write reg 0x%02X<-0x%02X, 0x%02X<-0x%02X\n", + DPRINTFN(0, "0x%02X<-0x%02X, 0x%02X<-0x%02X\n", (unsigned)reg1, (unsigned)val1, - (unsigned)reg2, (unsigned)val2)); - return (uchcom_ctrl_write( + (unsigned)reg2, (unsigned)val2); + uchcom_ctrl_write( sc, UCHCOM_REQ_WRITE_REG, - reg1|((uint16_t)reg2<<8), val1|((uint16_t)val2<<8))); + reg1|((uint16_t)reg2<<8), val1|((uint16_t)val2<<8)); + return; } -static usbd_status +static void uchcom_read_reg(struct uchcom_softc *sc, uint8_t reg1, uint8_t *rval1, uint8_t reg2, uint8_t *rval2) { uint8_t buf[UCHCOM_INPUT_BUF_SIZE]; - usbd_status err; - int actin; - err = uchcom_ctrl_read( + uchcom_ctrl_read( sc, UCHCOM_REQ_READ_REG, - reg1|((uint16_t)reg2<<8), 0, buf, sizeof buf, &actin); - if (err) - return (err); + reg1|((uint16_t)reg2<<8), 0, buf, sizeof(buf)); - DPRINTF(("uchcom: read reg 0x%02X->0x%02X, 0x%02X->0x%02X\n", + DPRINTFN(0, "0x%02X->0x%02X, 0x%02X->0x%02X\n", (unsigned)reg1, (unsigned)buf[0], - (unsigned)reg2, (unsigned)buf[1])); + (unsigned)reg2, (unsigned)buf[1]); if (rval1) *rval1 = buf[0]; if (rval2) *rval2 = buf[1]; - return (USBD_NORMAL_COMPLETION); + return; } static usbd_status @@ -472,12 +498,9 @@ { uint8_t buf[UCHCOM_INPUT_BUF_SIZE]; usbd_status err; - int actin; - err = uchcom_ctrl_read( - sc, UCHCOM_REQ_GET_VERSION, 0, 0, buf, sizeof buf, &actin); - if (err) - return (err); + uchcom_ctrl_read( + sc, UCHCOM_REQ_GET_VERSION, 0, 0, buf, sizeof(buf)); if (rver) *rver = buf[0]; @@ -487,19 +510,19 @@ static usbd_status uchcom_get_status(struct uchcom_softc *sc, uint8_t *rval) { - return (uchcom_read_reg(sc, UCHCOM_REG_STAT1, rval, UCHCOM_REG_STAT2, NULL)); + uchcom_read_reg(sc, UCHCOM_REG_STAT1, rval, UCHCOM_REG_STAT2, NULL); } static usbd_status uchcom_set_dtrrts_10(struct uchcom_softc *sc, uint8_t val) { - return (uchcom_write_reg(sc, UCHCOM_REG_STAT1, val, UCHCOM_REG_STAT1, val)); + uchcom_write_reg(sc, UCHCOM_REG_STAT1, val, UCHCOM_REG_STAT1, val); } static usbd_status uchcom_set_dtrrts_20(struct uchcom_softc *sc, uint8_t val) { - return (uchcom_ctrl_write(sc, UCHCOM_REQ_SET_DTRRTS, val, 0)); + uchcom_ctrl_write(sc, UCHCOM_REQ_SET_DTRRTS, val, 0); } @@ -580,9 +603,7 @@ usbd_status err; uint8_t brk1, brk2; - err = uchcom_read_reg(sc, UCHCOM_REG_BREAK1, &brk1, UCHCOM_REG_BREAK2, &brk2); - if (err) - return (EIO); + uchcom_read_reg(sc, UCHCOM_REG_BREAK1, &brk1, UCHCOM_REG_BREAK2, &brk2); if (onoff) { /* on - clear bits */ brk1 &= ~UCHCOM_BRK1_MASK; @@ -592,9 +613,7 @@ brk1 |= UCHCOM_BRK1_MASK; brk2 |= UCHCOM_BRK2_MASK; } - err = uchcom_write_reg(sc, UCHCOM_REG_BREAK1, brk1, UCHCOM_REG_BREAK2, brk2); - if (err) - return (EIO); + uchcom_write_reg(sc, UCHCOM_REG_BREAK1, brk1, UCHCOM_REG_BREAK2, brk2); return (0); } @@ -647,17 +666,12 @@ if (uchcom_calc_divider_settings(&dv, rate)) return (EINVAL); - if ((err = uchcom_write_reg(sc, + uchcom_write_reg(sc, UCHCOM_REG_BPS_PRE, dv.dv_prescaler, - UCHCOM_REG_BPS_DIV, dv.dv_div)) || - (err = uchcom_write_reg(sc, + UCHCOM_REG_BPS_DIV, dv.dv_div); + uchcom_write_reg(sc, UCHCOM_REG_BPS_MOD, dv.dv_mod, - UCHCOM_REG_BPS_PAD, 0))) { - device_printf(sc->sc_ucom.sc_dev, " cannot set DTE rate: %s\n", - usbd_errstr(err)); - return (EIO); - } - + UCHCOM_REG_BPS_PAD, 0); return (0); } @@ -667,12 +681,7 @@ usbd_status err; uint8_t lcr1 = 0, lcr2 = 0; - err = uchcom_read_reg(sc, UCHCOM_REG_LCR1, &lcr1, UCHCOM_REG_LCR2, &lcr2); - if (err) { - device_printf(sc->sc_ucom.sc_dev, " cannot get LCR: %s\n", - usbd_errstr(err)); - return (EIO); - } + uchcom_read_reg(sc, UCHCOM_REG_LCR1, &lcr1, UCHCOM_REG_LCR2, &lcr2); lcr1 &= ~UCHCOM_LCR1_MASK; lcr2 &= ~UCHCOM_LCR2_MASK; @@ -703,12 +712,7 @@ lcr2 |= UCHCOM_LCR2_PAREVEN; } - err = uchcom_write_reg(sc, UCHCOM_REG_LCR1, lcr1, UCHCOM_REG_LCR2, lcr2); - if (err) { - device_printf(sc->sc_ucom.sc_dev, "cannot set LCR: %s\n", - usbd_errstr(err)); - return (EIO); - } + uchcom_write_reg(sc, UCHCOM_REG_LCR1, lcr1, UCHCOM_REG_LCR2, lcr2); return (0); } @@ -716,17 +720,9 @@ static int uchcom_clear_chip(struct uchcom_softc *sc) { - usbd_status err; - DPRINTF(("%s: clear\n", USBDEVNAME(sc->sc_dev))); - err = uchcom_ctrl_write(sc, UCHCOM_REQ_RESET, 0, 0); - if (err) { - device_printf(sc->sc_ucom.sc_dev, "cannot clear: %s\n", - usbd_errstr(err)); - return (EIO); - } - - return (0); + uchcom_ctrl_write(sc, UCHCOM_REQ_RESET, 0, 0); + return; } static int @@ -736,17 +732,11 @@ uint8_t lcr1, lcr2, pre, div, mod; uint16_t val=0, idx=0; - err = uchcom_read_reg(sc, UCHCOM_REG_LCR1, &lcr1, UCHCOM_REG_LCR2, &lcr2); - if (err) - goto failed; + uchcom_read_reg(sc, UCHCOM_REG_LCR1, &lcr1, UCHCOM_REG_LCR2, &lcr2); - err = uchcom_read_reg(sc, UCHCOM_REG_BPS_PRE, &pre, UCHCOM_REG_BPS_DIV, &div); - if (err) - goto failed; + uchcom_read_reg(sc, UCHCOM_REG_BPS_PRE, &pre, UCHCOM_REG_BPS_DIV, &div); - err = uchcom_read_reg(sc, UCHCOM_REG_BPS_MOD, &mod, UCHCOM_REG_BPS_PAD, NULL); - if (err) - goto failed; + uchcom_read_reg(sc, UCHCOM_REG_BPS_MOD, &mod, UCHCOM_REG_BPS_PAD, NULL); val |= (uint16_t)(lcr1&0xF0) << 8; val |= 0x01; @@ -762,9 +752,7 @@ DPRINTF(("%s: reset v=0x%04X, i=0x%04X\n", USBDEVNAME(sc->sc_dev), val, idx)); - err = uchcom_ctrl_write(sc, UCHCOM_REQ_RESET, val, idx); - if (err) - goto failed; + uchcom_ctrl_write(sc, UCHCOM_REQ_RESET, val, idx); return (0);