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