PERFORCE change 131426 for review

Hans Petter Selasky hselasky at FreeBSD.org
Sat Dec 22 03:25:33 PST 2007


http://perforce.freebsd.org/chv.cgi?CH=131426

Change 131426 by hselasky at 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");


More information about the p4-projects mailing list