From owner-p4-projects@FreeBSD.ORG Sat Dec 22 11:25:32 2007 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id B2DBA16A41A; Sat, 22 Dec 2007 11:25:32 +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 0E14F16A468 for ; Sat, 22 Dec 2007 11:25: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 0B12813C4EA for ; Sat, 22 Dec 2007 11:25: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 lBMBPVpo041175 for ; Sat, 22 Dec 2007 11:25:31 GMT (envelope-from hselasky@FreeBSD.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.1/8.14.1/Submit) id lBMBPVXn041171 for perforce@freebsd.org; Sat, 22 Dec 2007 11:25:31 GMT (envelope-from hselasky@FreeBSD.org) Date: Sat, 22 Dec 2007 11:25:31 GMT Message-Id: <200712221125.lBMBPVXn041171@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 131426 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: Sat, 22 Dec 2007 11:25:33 -0000 http://perforce.freebsd.org/chv.cgi?CH=131426 Change 131426 by hselasky@hselasky_laptop001 on 2007/12/22 11:25:27 Some minor updates and improvements. One of the supported uplcom adapters has been tested an verified to work. Affected files ... .. //depot/projects/usb/src/sys/dev/usb/uplcom.c#36 edit Differences ... ==== //depot/projects/usb/src/sys/dev/usb/uplcom.c#36 (text+ko) ==== @@ -127,8 +127,7 @@ #endif #define UPLCOM_BULK_BUF_SIZE 1024 /* bytes */ -#define UPLCOM_N_DATA_TRANSFER 4 -#define UPLCOM_N_INTR_TRANSFER 2 +#define UPLCOM_N_TRANSFER 6 #define UPLCOM_SET_REQUEST 0x01 #define UPLCOM_SET_CRTSCTS 0x41 @@ -144,8 +143,7 @@ struct ucom_super_softc sc_super_ucom; struct ucom_softc sc_ucom; - struct usbd_xfer *sc_xfer_intr[UPLCOM_N_INTR_TRANSFER]; - struct usbd_xfer *sc_xfer_data[UPLCOM_N_DATA_TRANSFER]; + struct usbd_xfer *sc_xfer[UPLCOM_N_TRANSFER]; struct usbd_device *sc_udev; uint16_t sc_line; @@ -159,9 +157,8 @@ uint8_t sc_msr; /* uplcom status register */ uint8_t sc_chiptype; /* type of chip */ uint8_t sc_ctrl_iface_no; - uint8_t sc_ctrl_iface_index; uint8_t sc_data_iface_no; - uint8_t sc_data_iface_index; + uint8_t sc_iface_index[2]; }; /* prototypes */ @@ -194,7 +191,7 @@ static usbd_callback_t uplcom_read_callback; static usbd_callback_t uplcom_read_clear_stall_callback; -static const struct usbd_config uplcom_config_data[UPLCOM_N_DATA_TRANSFER] = { +static const struct usbd_config uplcom_config_data[UPLCOM_N_TRANSFER] = { [0] = { .type = UE_BULK, @@ -203,6 +200,7 @@ .bufsize = UPLCOM_BULK_BUF_SIZE, .flags = {.pipe_bof = 1,.force_short_xfer = 1,}, .cb[USB_MODE_HOST] = &uplcom_write_callback, + .if_index = 0, }, [1] = { @@ -212,6 +210,7 @@ .bufsize = UPLCOM_BULK_BUF_SIZE, .flags = {.pipe_bof = 1,.short_xfer_ok = 1,}, .cb[USB_MODE_HOST] = &uplcom_read_callback, + .if_index = 0, }, [2] = { @@ -222,6 +221,7 @@ .cb[USB_MODE_HOST] = &uplcom_write_clear_stall_callback, .timeout = 1000, /* 1 second */ .interval = 50, /* 50ms */ + .if_index = 0, }, [3] = { @@ -232,20 +232,20 @@ .cb[USB_MODE_HOST] = &uplcom_read_clear_stall_callback, .timeout = 1000, /* 1 second */ .interval = 50, /* 50ms */ + .if_index = 0, }, -}; -static const struct usbd_config uplcom_config_intr[UPLCOM_N_INTR_TRANSFER] = { - [0] = { + [4] = { .type = UE_INTERRUPT, .endpoint = UE_ADDR_ANY, .direction = UE_DIR_IN, .flags = {.pipe_bof = 1,.short_xfer_ok = 1,}, .bufsize = 0, /* use wMaxPacketSize */ .cb[USB_MODE_HOST] = &uplcom_intr_callback, + .if_index = 1, }, - [1] = { + [5] = { .type = UE_CONTROL, .endpoint = 0x00, /* Control pipe */ .direction = UE_DIR_ANY, @@ -253,6 +253,7 @@ .cb[USB_MODE_HOST] = &uplcom_intr_clear_stall_callback, .timeout = 1000, /* 1 second */ .interval = 50, /* 50ms */ + .if_index = 1, }, }; @@ -434,7 +435,7 @@ goto detach; } sc->sc_ctrl_iface_no = id->bInterfaceNumber; - sc->sc_ctrl_iface_index = UPLCOM_IFACE_INDEX; + sc->sc_iface_index[1] = UPLCOM_IFACE_INDEX; iface = usbd_get_iface(uaa->device, UPLCOM_SECOND_IFACE_INDEX); @@ -446,33 +447,22 @@ goto detach; } sc->sc_data_iface_no = id->bInterfaceNumber; - sc->sc_data_iface_index = UPLCOM_SECOND_IFACE_INDEX; + sc->sc_iface_index[0] = UPLCOM_SECOND_IFACE_INDEX; } else { sc->sc_data_iface_no = sc->sc_ctrl_iface_no; - sc->sc_data_iface_index = sc->sc_ctrl_iface_index; + sc->sc_iface_index[0] = UPLCOM_IFACE_INDEX; } error = usbd_transfer_setup(uaa->device, - &(sc->sc_data_iface_index), sc->sc_xfer_data, - uplcom_config_data, UPLCOM_N_DATA_TRANSFER, - sc, &Giant); + sc->sc_iface_index, sc->sc_xfer, uplcom_config_data, + UPLCOM_N_TRANSFER, sc, &Giant); if (error) { - DPRINTF(0, "one or more missing data " - "pipes, error=%s\n", usbd_errstr(error)); - goto detach; - } - error = usbd_transfer_setup(uaa->device, - &(sc->sc_ctrl_iface_index), sc->sc_xfer_intr, - uplcom_config_intr, UPLCOM_N_INTR_TRANSFER, sc, &Giant); - - if (error) { - DPRINTF(0, "no interrupt pipe, error=%s\n", - usbd_errstr(error)); + DPRINTF(0, "one or more missing USB endpoints, " + "error=%s\n", usbd_errstr(error)); goto detach; } error = uplcom_reset(sc, uaa->device); - if (error) { device_printf(dev, "reset failed, error=%s\n", usbd_errstr(error)); @@ -513,10 +503,8 @@ ucom_detach(&(sc->sc_super_ucom), &(sc->sc_ucom), 1); - usbd_transfer_unsetup(sc->sc_xfer_intr, UPLCOM_N_INTR_TRANSFER); + usbd_transfer_unsetup(sc->sc_xfer, UPLCOM_N_TRANSFER); - usbd_transfer_unsetup(sc->sc_xfer_data, UPLCOM_N_DATA_TRANSFER); - return (0); } @@ -544,17 +532,19 @@ }; static const struct pl2303x_init pl2303x[] = { - {UT_READ_VENDOR_DEVICE, UPLCOM_SET_REQUEST, 0x8484, 0, 0}, + {UT_READ_VENDOR_DEVICE, UPLCOM_SET_REQUEST, 0x8484, 0, 1}, {UT_WRITE_VENDOR_DEVICE, UPLCOM_SET_REQUEST, 0x0404, 0, 0}, - {UT_READ_VENDOR_DEVICE, UPLCOM_SET_REQUEST, 0x8484, 0, 0}, - {UT_READ_VENDOR_DEVICE, UPLCOM_SET_REQUEST, 0x8383, 0, 0}, - {UT_READ_VENDOR_DEVICE, UPLCOM_SET_REQUEST, 0x8484, 0, 0}, + {UT_READ_VENDOR_DEVICE, UPLCOM_SET_REQUEST, 0x8484, 0, 1}, + {UT_READ_VENDOR_DEVICE, UPLCOM_SET_REQUEST, 0x8383, 0, 1}, + {UT_READ_VENDOR_DEVICE, UPLCOM_SET_REQUEST, 0x8484, 0, 1}, {UT_WRITE_VENDOR_DEVICE, UPLCOM_SET_REQUEST, 0x0404, 1, 0}, - {UT_READ_VENDOR_DEVICE, UPLCOM_SET_REQUEST, 0x8484, 0, 0}, - {UT_READ_VENDOR_DEVICE, UPLCOM_SET_REQUEST, 0x8383, 0, 0}, + {UT_READ_VENDOR_DEVICE, UPLCOM_SET_REQUEST, 0x8484, 0, 1}, + {UT_READ_VENDOR_DEVICE, UPLCOM_SET_REQUEST, 0x8383, 0, 1}, {UT_WRITE_VENDOR_DEVICE, UPLCOM_SET_REQUEST, 0, 1, 0}, {UT_WRITE_VENDOR_DEVICE, UPLCOM_SET_REQUEST, 1, 0, 0}, - {UT_WRITE_VENDOR_DEVICE, UPLCOM_SET_REQUEST, 2, 0x44, 0} + {UT_WRITE_VENDOR_DEVICE, UPLCOM_SET_REQUEST, 2, 0x44, 0}, + {UT_WRITE_VENDOR_DEVICE, UPLCOM_SET_REQUEST, 8, 0, 0}, + {UT_WRITE_VENDOR_DEVICE, UPLCOM_SET_REQUEST, 9, 0, 0}, }; #define N_PL2302X_INIT (sizeof(pl2303x)/sizeof(pl2303x[0])) @@ -564,16 +554,17 @@ { usb_device_request_t req; usbd_status_t err; - int i; + uint8_t buf[4]; + uint8_t i; - for (i = 0; i < N_PL2302X_INIT; i++) { + for (i = 0; i != N_PL2302X_INIT; i++) { req.bmRequestType = pl2303x[i].req_type; req.bRequest = pl2303x[i].request; USETW(req.wValue, pl2303x[i].value); USETW(req.wIndex, pl2303x[i].index); USETW(req.wLength, pl2303x[i].length); - err = usbd_do_request(udev, &Giant, &req, NULL); + err = usbd_do_request(udev, &Giant, &req, buf); if (err) { DPRINTF(0, "error=%s\n", usbd_errstr(err)); return (EIO); @@ -667,7 +658,7 @@ static int uplcom_pre_param(struct ucom_softc *ucom, struct termios *t) { - uint32_t i; + uint8_t i; DPRINTF(0, "\n"); @@ -675,7 +666,7 @@ for (i = 0;; i++) { - if (i < N_UPLCOM_RATES) { + if (i != N_UPLCOM_RATES) { if (uplcom_rates[i] == t->c_ospeed) { break; } @@ -701,12 +692,21 @@ USETDW(ls.dwDTERate, t->c_ospeed); - ls.bCharFormat = (t->c_cflag & CSTOPB) ? - UCDC_STOP_BIT_2 : UCDC_STOP_BIT_1; + if (t->c_cflag & CSTOPB) { + ls.bCharFormat = UCDC_STOP_BIT_2; + } else { + ls.bCharFormat = UCDC_STOP_BIT_1; + } - ls.bParityType = (t->c_cflag & PARENB) ? - ((t->c_cflag & PARODD) ? - UCDC_PARITY_ODD : UCDC_PARITY_EVEN) : UCDC_PARITY_NONE; + if (t->c_cflag & PARENB) { + if (t->c_cflag & PARODD) { + ls.bParityType = UCDC_PARITY_ODD; + } else { + ls.bParityType = UCDC_PARITY_EVEN; + } + } else { + ls.bParityType = UCDC_PARITY_NONE; + } switch (t->c_cflag & CSIZE) { case CS5: @@ -750,6 +750,13 @@ USETW(req.wLength, 0); uplcom_cfg_do_request(sc, &req, NULL); + } else { + req.bmRequestType = UT_WRITE_VENDOR_DEVICE; + req.bRequest = UPLCOM_SET_REQUEST; + USETW(req.wValue, 0); + USETW(req.wIndex, 0); + USETW(req.wLength, 0); + uplcom_cfg_do_request(sc, &req, NULL); } return; } @@ -760,10 +767,10 @@ struct uplcom_softc *sc = ucom->sc_parent; /* start interrupt endpoint */ - usbd_transfer_start(sc->sc_xfer_intr[0]); + usbd_transfer_start(sc->sc_xfer[4]); /* start read endpoint */ - usbd_transfer_start(sc->sc_xfer_data[1]); + usbd_transfer_start(sc->sc_xfer[1]); return; } @@ -773,11 +780,11 @@ struct uplcom_softc *sc = ucom->sc_parent; /* stop interrupt endpoint */ - usbd_transfer_stop(sc->sc_xfer_intr[0]); + usbd_transfer_stop(sc->sc_xfer[4]); /* stop read endpoint */ - usbd_transfer_stop(sc->sc_xfer_data[3]); - usbd_transfer_stop(sc->sc_xfer_data[1]); + usbd_transfer_stop(sc->sc_xfer[3]); + usbd_transfer_stop(sc->sc_xfer[1]); return; } @@ -786,7 +793,7 @@ { struct uplcom_softc *sc = ucom->sc_parent; - usbd_transfer_start(sc->sc_xfer_data[0]); + usbd_transfer_start(sc->sc_xfer[0]); return; } @@ -795,8 +802,8 @@ { struct uplcom_softc *sc = ucom->sc_parent; - usbd_transfer_stop(sc->sc_xfer_data[2]); - usbd_transfer_stop(sc->sc_xfer_data[0]); + usbd_transfer_stop(sc->sc_xfer[2]); + usbd_transfer_stop(sc->sc_xfer[0]); return; } @@ -827,6 +834,9 @@ switch (USBD_GET_STATE(xfer)) { case USBD_ST_TRANSFERRED: + + DPRINTF(0, "actlen = %u\n", xfer->actlen); + if (xfer->actlen >= 9) { usbd_copy_out(xfer->frbuffers + 0, 0, buf, sizeof(buf)); @@ -849,7 +859,7 @@ } case USBD_ST_SETUP: if (sc->sc_flag & UPLCOM_FLAG_INTR_STALL) { - usbd_transfer_start(sc->sc_xfer_intr[1]); + usbd_transfer_start(sc->sc_xfer[5]); } else { xfer->frlengths[0] = xfer->max_data_length; usbd_start_hardware(xfer); @@ -859,7 +869,7 @@ default: /* Error */ if (xfer->error != USBD_CANCELLED) { sc->sc_flag |= UPLCOM_FLAG_INTR_STALL; - usbd_transfer_start(sc->sc_xfer_intr[1]); + usbd_transfer_start(sc->sc_xfer[5]); } return; @@ -870,7 +880,7 @@ uplcom_intr_clear_stall_callback(struct usbd_xfer *xfer) { struct uplcom_softc *sc = xfer->priv_sc; - struct usbd_xfer *xfer_other = sc->sc_xfer_intr[0]; + struct usbd_xfer *xfer_other = sc->sc_xfer[4]; if (usbd_clear_stall_callback(xfer, xfer_other)) { DPRINTF(0, "stall cleared\n"); @@ -890,12 +900,14 @@ case USBD_ST_SETUP: case USBD_ST_TRANSFERRED: if (sc->sc_flag & UPLCOM_FLAG_WRITE_STALL) { - usbd_transfer_start(sc->sc_xfer_data[2]); + usbd_transfer_start(sc->sc_xfer[2]); return; } if (ucom_get_data(&(sc->sc_ucom), xfer->frbuffers + 0, 0, UPLCOM_BULK_BUF_SIZE, &actlen)) { + DPRINTF(0, "actlen = %d\n", actlen); + xfer->frlengths[0] = actlen; usbd_start_hardware(xfer); } @@ -904,7 +916,7 @@ default: /* Error */ if (xfer->error != USBD_CANCELLED) { sc->sc_flag |= UPLCOM_FLAG_WRITE_STALL; - usbd_transfer_start(sc->sc_xfer_data[2]); + usbd_transfer_start(sc->sc_xfer[2]); } return; @@ -915,7 +927,7 @@ uplcom_write_clear_stall_callback(struct usbd_xfer *xfer) { struct uplcom_softc *sc = xfer->priv_sc; - struct usbd_xfer *xfer_other = sc->sc_xfer_data[0]; + struct usbd_xfer *xfer_other = sc->sc_xfer[0]; if (usbd_clear_stall_callback(xfer, xfer_other)) { DPRINTF(0, "stall cleared\n"); @@ -936,7 +948,7 @@ case USBD_ST_SETUP: if (sc->sc_flag & UPLCOM_FLAG_READ_STALL) { - usbd_transfer_start(sc->sc_xfer_data[3]); + usbd_transfer_start(sc->sc_xfer[3]); } else { xfer->frlengths[0] = xfer->max_data_length; usbd_start_hardware(xfer); @@ -946,7 +958,7 @@ default: /* Error */ if (xfer->error != USBD_CANCELLED) { sc->sc_flag |= UPLCOM_FLAG_READ_STALL; - usbd_transfer_start(sc->sc_xfer_data[3]); + usbd_transfer_start(sc->sc_xfer[3]); } return; @@ -957,7 +969,7 @@ uplcom_read_clear_stall_callback(struct usbd_xfer *xfer) { struct uplcom_softc *sc = xfer->priv_sc; - struct usbd_xfer *xfer_other = sc->sc_xfer_data[1]; + struct usbd_xfer *xfer_other = sc->sc_xfer[1]; if (usbd_clear_stall_callback(xfer, xfer_other)) { DPRINTF(0, "stall cleared\n");