PERFORCE change 157136 for review
Hans Petter Selasky
hselasky at FreeBSD.org
Wed Feb 4 05:49:46 PST 2009
http://perforce.freebsd.org/chv.cgi?CH=157136
Change 157136 by hselasky at hselasky_laptop001 on 2009/02/04 13:49:30
USB serial drivers cleanup by me.
- factor out all clear stall handling
- factor out all usb2_do_request() calls.
Affected files ...
.. //depot/projects/usb/src/sys/dev/usb2/serial/u3g2.c#10 edit
.. //depot/projects/usb/src/sys/dev/usb2/serial/uark2.c#16 edit
.. //depot/projects/usb/src/sys/dev/usb2/serial/ubsa2.c#22 edit
.. //depot/projects/usb/src/sys/dev/usb2/serial/ubser2.c#16 edit
.. //depot/projects/usb/src/sys/dev/usb2/serial/uchcom2.c#19 edit
.. //depot/projects/usb/src/sys/dev/usb2/serial/ucycom2.c#17 edit
.. //depot/projects/usb/src/sys/dev/usb2/serial/ufoma2.c#22 edit
.. //depot/projects/usb/src/sys/dev/usb2/serial/uftdi2.c#19 edit
.. //depot/projects/usb/src/sys/dev/usb2/serial/uftdi2_reg.h#5 edit
.. //depot/projects/usb/src/sys/dev/usb2/serial/ugensa2.c#23 edit
.. //depot/projects/usb/src/sys/dev/usb2/serial/uipaq2.c#19 edit
.. //depot/projects/usb/src/sys/dev/usb2/serial/ulpt2.c#15 edit
.. //depot/projects/usb/src/sys/dev/usb2/serial/umct2.c#16 edit
.. //depot/projects/usb/src/sys/dev/usb2/serial/umodem2.c#19 edit
.. //depot/projects/usb/src/sys/dev/usb2/serial/umoscom2.c#17 edit
.. //depot/projects/usb/src/sys/dev/usb2/serial/uplcom2.c#19 edit
.. //depot/projects/usb/src/sys/dev/usb2/serial/usb2_serial.c#24 edit
.. //depot/projects/usb/src/sys/dev/usb2/serial/usb2_serial.h#13 edit
.. //depot/projects/usb/src/sys/dev/usb2/serial/uvisor2.c#17 edit
.. //depot/projects/usb/src/sys/dev/usb2/serial/uvscom2.c#19 edit
Differences ...
==== //depot/projects/usb/src/sys/dev/usb2/serial/u3g2.c#10 (text+ko) ====
@@ -88,7 +88,7 @@
enum {
U3G_BULK_WR,
U3G_BULK_RD,
- U3G_N_TRANSFER = 2,
+ U3G_N_TRANSFER,
};
struct u3g_softc {
==== //depot/projects/usb/src/sys/dev/usb2/serial/uark2.c#16 (text+ko) ====
@@ -64,9 +64,7 @@
enum {
UARK_BULK_DT_WR,
UARK_BULK_DT_RD,
- UARK_BULK_CS_WR,
- UARK_BULK_CS_RD,
- UARK_N_TRANSFER = 4,
+ UARK_N_TRANSFER,
};
struct uark_softc {
@@ -76,9 +74,6 @@
struct usb2_xfer *sc_xfer[UARK_N_TRANSFER];
struct usb2_device *sc_udev;
- uint8_t sc_flags;
-#define UARK_FLAG_BULK_READ_STALL 0x01
-#define UARK_FLAG_BULK_WRITE_STALL 0x02
uint8_t sc_msr;
uint8_t sc_lsr;
};
@@ -90,9 +85,7 @@
static device_detach_t uark_detach;
static usb2_callback_t uark_bulk_write_callback;
-static usb2_callback_t uark_bulk_write_clear_stall_callback;
static usb2_callback_t uark_bulk_read_callback;
-static usb2_callback_t uark_bulk_read_clear_stall_callback;
static void uark_start_read(struct usb2_com_softc *);
static void uark_stop_read(struct usb2_com_softc *);
@@ -125,28 +118,6 @@
.mh.flags = {.pipe_bof = 1,.short_xfer_ok = 1,},
.mh.callback = &uark_bulk_read_callback,
},
-
- [UARK_BULK_CS_WR] = {
- .type = UE_CONTROL,
- .endpoint = 0x00, /* Control pipe */
- .direction = UE_DIR_ANY,
- .mh.bufsize = sizeof(struct usb2_device_request),
- .mh.flags = {},
- .mh.callback = &uark_bulk_write_clear_stall_callback,
- .mh.timeout = 1000, /* 1 second */
- .mh.interval = 50, /* 50ms */
- },
-
- [UARK_BULK_CS_RD] = {
- .type = UE_CONTROL,
- .endpoint = 0x00, /* Control pipe */
- .direction = UE_DIR_ANY,
- .mh.bufsize = sizeof(struct usb2_device_request),
- .mh.flags = {},
- .mh.callback = &uark_bulk_read_clear_stall_callback,
- .mh.timeout = 1000, /* 1 second */
- .mh.interval = 50, /* 50ms */
- },
};
static const struct usb2_com_callback uark_callback = {
@@ -224,8 +195,8 @@
goto detach;
}
/* clear stall at first run */
- sc->sc_flags |= (UARK_FLAG_BULK_WRITE_STALL |
- UARK_FLAG_BULK_READ_STALL);
+ usb2_transfer_set_stall(sc->sc_xfer[UARK_BULK_DT_WR]);
+ usb2_transfer_set_stall(sc->sc_xfer[UARK_BULK_DT_RD]);
error = usb2_com_attach(&sc->sc_super_ucom, &sc->sc_ucom, 1, sc,
&uark_callback, &Giant);
@@ -261,10 +232,7 @@
switch (USB_GET_STATE(xfer)) {
case USB_ST_SETUP:
case USB_ST_TRANSFERRED:
- if (sc->sc_flags & UARK_FLAG_BULK_WRITE_STALL) {
- usb2_transfer_start(sc->sc_xfer[UARK_BULK_CS_WR]);
- return;
- }
+tr_setup:
if (usb2_com_get_data(&sc->sc_ucom, xfer->frbuffers, 0,
UARK_BUF_SIZE, &actlen)) {
xfer->frlengths[0] = actlen;
@@ -274,8 +242,9 @@
default: /* Error */
if (xfer->error != USB_ERR_CANCELLED) {
- sc->sc_flags |= UARK_FLAG_BULK_WRITE_STALL;
- usb2_transfer_start(sc->sc_xfer[UARK_BULK_CS_WR]);
+ /* try to clear stall first */
+ xfer->flags.stall_pipe = 1;
+ goto tr_setup;
}
return;
@@ -283,19 +252,6 @@
}
static void
-uark_bulk_write_clear_stall_callback(struct usb2_xfer *xfer)
-{
- struct uark_softc *sc = xfer->priv_sc;
- struct usb2_xfer *xfer_other = sc->sc_xfer[UARK_BULK_DT_WR];
-
- if (usb2_clear_stall_callback(xfer, xfer_other)) {
- DPRINTF("stall cleared\n");
- sc->sc_flags &= ~UARK_FLAG_BULK_WRITE_STALL;
- usb2_transfer_start(xfer_other);
- }
-}
-
-static void
uark_bulk_read_callback(struct usb2_xfer *xfer)
{
struct uark_softc *sc = xfer->priv_sc;
@@ -306,34 +262,18 @@
xfer->actlen);
case USB_ST_SETUP:
- if (sc->sc_flags & UARK_FLAG_BULK_READ_STALL) {
- usb2_transfer_start(sc->sc_xfer[UARK_BULK_CS_RD]);
- } else {
- xfer->frlengths[0] = xfer->max_data_length;
- usb2_start_hardware(xfer);
- }
+tr_setup:
+ xfer->frlengths[0] = xfer->max_data_length;
+ usb2_start_hardware(xfer);
return;
default: /* Error */
if (xfer->error != USB_ERR_CANCELLED) {
- sc->sc_flags |= UARK_FLAG_BULK_READ_STALL;
- usb2_transfer_start(sc->sc_xfer[UARK_BULK_CS_RD]);
+ /* try to clear stall first */
+ xfer->flags.stall_pipe = 1;
+ goto tr_setup;
}
return;
-
- }
-}
-
-static void
-uark_bulk_read_clear_stall_callback(struct usb2_xfer *xfer)
-{
- struct uark_softc *sc = xfer->priv_sc;
- struct usb2_xfer *xfer_other = sc->sc_xfer[UARK_BULK_DT_RD];
-
- if (usb2_clear_stall_callback(xfer, xfer_other)) {
- DPRINTF("stall cleared\n");
- sc->sc_flags &= ~UARK_FLAG_BULK_READ_STALL;
- usb2_transfer_start(xfer_other);
}
}
@@ -350,7 +290,6 @@
{
struct uark_softc *sc = ucom->sc_parent;
- usb2_transfer_stop(sc->sc_xfer[UARK_BULK_CS_RD]);
usb2_transfer_stop(sc->sc_xfer[UARK_BULK_DT_RD]);
}
@@ -367,7 +306,6 @@
{
struct uark_softc *sc = ucom->sc_parent;
- usb2_transfer_stop(sc->sc_xfer[UARK_BULK_CS_WR]);
usb2_transfer_stop(sc->sc_xfer[UARK_BULK_DT_WR]);
}
@@ -454,18 +392,14 @@
struct usb2_device_request req;
usb2_error_t err;
- if (usb2_com_cfg_is_gone(&sc->sc_ucom)) {
- return;
- }
req.bmRequestType = UARK_WRITE;
req.bRequest = UARK_REQUEST;
USETW(req.wValue, value);
USETW(req.wIndex, index);
USETW(req.wLength, 0);
- err = usb2_do_request_flags
- (sc->sc_udev, &Giant, &req, NULL, 0, NULL, 1000);
-
+ err = usb2_com_cfg_do_request(sc->sc_udev, &sc->sc_ucom,
+ &req, NULL, 0, 1000);
if (err) {
DPRINTFN(0, "device request failed, err=%s "
"(ignored)\n", usb2_errstr(err));
==== //depot/projects/usb/src/sys/dev/usb2/serial/ubsa2.c#22 (text+ko) ====
@@ -143,11 +143,8 @@
enum {
UBSA_BULK_DT_WR,
UBSA_BULK_DT_RD,
- UBSA_BULK_CS_WR,
- UBSA_BULK_CS_RD,
UBSA_INTR_DT_RD,
- UBSA_INTR_CS_RD,
- UBSA_N_TRANSFER = 6,
+ UBSA_N_TRANSFER,
};
struct ubsa_softc {
@@ -157,11 +154,6 @@
struct usb2_xfer *sc_xfer[UBSA_N_TRANSFER];
struct usb2_device *sc_udev;
- uint16_t sc_flag;
-#define UBSA_FLAG_WRITE_STALL 0x0001
-#define UBSA_FLAG_READ_STALL 0x0002
-#define UBSA_FLAG_INTR_STALL 0x0004
-
uint8_t sc_iface_no; /* interface number */
uint8_t sc_iface_index; /* interface index */
uint8_t sc_lsr; /* local status register */
@@ -173,11 +165,8 @@
static device_detach_t ubsa_detach;
static usb2_callback_t ubsa_write_callback;
-static usb2_callback_t ubsa_write_clear_stall_callback;
static usb2_callback_t ubsa_read_callback;
-static usb2_callback_t ubsa_read_clear_stall_callback;
static usb2_callback_t ubsa_intr_callback;
-static usb2_callback_t ubsa_intr_clear_stall_callback;
static void ubsa_cfg_request(struct ubsa_softc *, uint8_t, uint16_t);
static void ubsa_cfg_set_dtr(struct usb2_com_softc *, uint8_t);
@@ -212,26 +201,6 @@
.mh.callback = &ubsa_read_callback,
},
- [UBSA_BULK_CS_WR] = {
- .type = UE_CONTROL,
- .endpoint = 0x00, /* Control pipe */
- .direction = UE_DIR_ANY,
- .mh.bufsize = sizeof(struct usb2_device_request),
- .mh.callback = &ubsa_write_clear_stall_callback,
- .mh.timeout = 1000, /* 1 second */
- .mh.interval = 50, /* 50ms */
- },
-
- [UBSA_BULK_CS_RD] = {
- .type = UE_CONTROL,
- .endpoint = 0x00, /* Control pipe */
- .direction = UE_DIR_ANY,
- .mh.bufsize = sizeof(struct usb2_device_request),
- .mh.callback = &ubsa_read_clear_stall_callback,
- .mh.timeout = 1000, /* 1 second */
- .mh.interval = 50, /* 50ms */
- },
-
[UBSA_INTR_DT_RD] = {
.type = UE_INTERRUPT,
.endpoint = UE_ADDR_ANY,
@@ -240,16 +209,6 @@
.mh.bufsize = 0, /* use wMaxPacketSize */
.mh.callback = &ubsa_intr_callback,
},
-
- [UBSA_INTR_CS_RD] = {
- .type = UE_CONTROL,
- .endpoint = 0x00, /* Control pipe */
- .direction = UE_DIR_ANY,
- .mh.bufsize = sizeof(struct usb2_device_request),
- .mh.callback = &ubsa_intr_clear_stall_callback,
- .mh.timeout = 1000, /* 1 second */
- .mh.interval = 50, /* 50ms */
- },
};
static const struct usb2_com_callback ubsa_callback = {
@@ -343,8 +302,8 @@
goto detach;
}
/* clear stall at first run */
- sc->sc_flag |= (UBSA_FLAG_WRITE_STALL |
- UBSA_FLAG_READ_STALL);
+ usb2_transfer_set_stall(sc->sc_xfer[UBSA_BULK_DT_WR]);
+ usb2_transfer_set_stall(sc->sc_xfer[UBSA_BULK_DT_RD]);
error = usb2_com_attach(&sc->sc_super_ucom, &sc->sc_ucom, 1, sc,
&ubsa_callback, &Giant);
@@ -379,9 +338,6 @@
struct usb2_device_request req;
usb2_error_t err;
- if (usb2_com_cfg_is_gone(&sc->sc_ucom)) {
- return;
- }
req.bmRequestType = UT_WRITE_VENDOR_DEVICE;
req.bRequest = index;
USETW(req.wValue, value);
@@ -389,9 +345,8 @@
req.wIndex[1] = 0;
USETW(req.wLength, 0);
- err = usb2_do_request_flags
- (sc->sc_udev, &Giant, &req, NULL, 0, NULL, 1000);
-
+ err = usb2_com_cfg_do_request(sc->sc_udev, &sc->sc_ucom,
+ &req, NULL, 0, 1000);
if (err) {
DPRINTFN(0, "device request failed, err=%s "
"(ignored)\n", usb2_errstr(err));
@@ -544,11 +499,9 @@
struct ubsa_softc *sc = ucom->sc_parent;
/* stop interrupt endpoint */
- usb2_transfer_stop(sc->sc_xfer[UBSA_INTR_CS_RD]);
usb2_transfer_stop(sc->sc_xfer[UBSA_INTR_DT_RD]);
/* stop read endpoint */
- usb2_transfer_stop(sc->sc_xfer[UBSA_BULK_CS_RD]);
usb2_transfer_stop(sc->sc_xfer[UBSA_BULK_DT_RD]);
}
@@ -565,7 +518,6 @@
{
struct ubsa_softc *sc = ucom->sc_parent;
- usb2_transfer_stop(sc->sc_xfer[UBSA_BULK_CS_WR]);
usb2_transfer_stop(sc->sc_xfer[UBSA_BULK_DT_WR]);
}
@@ -589,10 +541,7 @@
switch (USB_GET_STATE(xfer)) {
case USB_ST_SETUP:
case USB_ST_TRANSFERRED:
- if (sc->sc_flag & UBSA_FLAG_WRITE_STALL) {
- usb2_transfer_start(sc->sc_xfer[UBSA_BULK_CS_WR]);
- return;
- }
+tr_setup:
if (usb2_com_get_data(&sc->sc_ucom, xfer->frbuffers, 0,
UBSA_BSIZE, &actlen)) {
@@ -603,8 +552,9 @@
default: /* Error */
if (xfer->error != USB_ERR_CANCELLED) {
- sc->sc_flag |= UBSA_FLAG_WRITE_STALL;
- usb2_transfer_start(sc->sc_xfer[UBSA_BULK_CS_WR]);
+ /* try to clear stall first */
+ xfer->flags.stall_pipe = 1;
+ goto tr_setup;
}
return;
@@ -612,19 +562,6 @@
}
static void
-ubsa_write_clear_stall_callback(struct usb2_xfer *xfer)
-{
- struct ubsa_softc *sc = xfer->priv_sc;
- struct usb2_xfer *xfer_other = sc->sc_xfer[UBSA_BULK_DT_WR];
-
- if (usb2_clear_stall_callback(xfer, xfer_other)) {
- DPRINTF("stall cleared\n");
- sc->sc_flag &= ~UBSA_FLAG_WRITE_STALL;
- usb2_transfer_start(xfer_other);
- }
-}
-
-static void
ubsa_read_callback(struct usb2_xfer *xfer)
{
struct ubsa_softc *sc = xfer->priv_sc;
@@ -634,18 +571,16 @@
usb2_com_put_data(&sc->sc_ucom, xfer->frbuffers, 0, xfer->actlen);
case USB_ST_SETUP:
- if (sc->sc_flag & UBSA_FLAG_READ_STALL) {
- usb2_transfer_start(sc->sc_xfer[UBSA_BULK_CS_RD]);
- } else {
- xfer->frlengths[0] = xfer->max_data_length;
- usb2_start_hardware(xfer);
- }
+tr_setup:
+ xfer->frlengths[0] = xfer->max_data_length;
+ usb2_start_hardware(xfer);
return;
default: /* Error */
if (xfer->error != USB_ERR_CANCELLED) {
- sc->sc_flag |= UBSA_FLAG_READ_STALL;
- usb2_transfer_start(sc->sc_xfer[UBSA_BULK_CS_RD]);
+ /* try to clear stall first */
+ xfer->flags.stall_pipe = 1;
+ goto tr_setup;
}
return;
@@ -653,19 +588,6 @@
}
static void
-ubsa_read_clear_stall_callback(struct usb2_xfer *xfer)
-{
- struct ubsa_softc *sc = xfer->priv_sc;
- struct usb2_xfer *xfer_other = sc->sc_xfer[UBSA_BULK_DT_RD];
-
- if (usb2_clear_stall_callback(xfer, xfer_other)) {
- DPRINTF("stall cleared\n");
- sc->sc_flag &= ~UBSA_FLAG_READ_STALL;
- usb2_transfer_start(xfer_other);
- }
-}
-
-static void
ubsa_intr_callback(struct usb2_xfer *xfer)
{
struct ubsa_softc *sc = xfer->priv_sc;
@@ -695,33 +617,18 @@
}
case USB_ST_SETUP:
- if (sc->sc_flag & UBSA_FLAG_INTR_STALL) {
- usb2_transfer_start(sc->sc_xfer[UBSA_INTR_CS_RD]);
- } else {
- xfer->frlengths[0] = xfer->max_data_length;
- usb2_start_hardware(xfer);
- }
+tr_setup:
+ xfer->frlengths[0] = xfer->max_data_length;
+ usb2_start_hardware(xfer);
return;
default: /* Error */
if (xfer->error != USB_ERR_CANCELLED) {
- sc->sc_flag |= UBSA_FLAG_INTR_STALL;
- usb2_transfer_start(sc->sc_xfer[UBSA_INTR_CS_RD]);
+ /* try to clear stall first */
+ xfer->flags.stall_pipe = 1;
+ goto tr_setup;
}
return;
}
}
-
-static void
-ubsa_intr_clear_stall_callback(struct usb2_xfer *xfer)
-{
- struct ubsa_softc *sc = xfer->priv_sc;
- struct usb2_xfer *xfer_other = sc->sc_xfer[UBSA_INTR_DT_RD];
-
- if (usb2_clear_stall_callback(xfer, xfer_other)) {
- DPRINTF("stall cleared\n");
- sc->sc_flag &= ~UBSA_FLAG_INTR_STALL;
- usb2_transfer_start(xfer_other);
- }
-}
==== //depot/projects/usb/src/sys/dev/usb2/serial/ubser2.c#16 (text+ko) ====
@@ -113,9 +113,7 @@
enum {
UBSER_BULK_DT_WR,
UBSER_BULK_DT_RD,
- UBSER_BULK_CS_WR,
- UBSER_BULK_CS_RD,
- UBSER_N_TRANSFER = 4,
+ UBSER_N_TRANSFER,
};
struct ubser_softc {
@@ -128,10 +126,6 @@
uint16_t sc_tx_size;
uint8_t sc_numser;
- uint8_t sc_flags;
-#define UBSER_FLAG_READ_STALL 0x01
-#define UBSER_FLAG_WRITE_STALL 0x02
-
uint8_t sc_iface_no;
uint8_t sc_iface_index;
uint8_t sc_curr_tx_unit;
@@ -144,9 +138,7 @@
static device_attach_t ubser_attach;
static device_detach_t ubser_detach;
-static usb2_callback_t ubser_write_clear_stall_callback;
static usb2_callback_t ubser_write_callback;
-static usb2_callback_t ubser_read_clear_stall_callback;
static usb2_callback_t ubser_read_callback;
static int ubser_pre_param(struct usb2_com_softc *, struct termios *);
@@ -177,28 +169,6 @@
.mh.flags = {.pipe_bof = 1,.short_xfer_ok = 1,},
.mh.callback = &ubser_read_callback,
},
-
- [UBSER_BULK_CS_WR] = {
- .type = UE_CONTROL,
- .endpoint = 0x00, /* Control pipe */
- .direction = UE_DIR_ANY,
- .mh.bufsize = sizeof(struct usb2_device_request),
- .mh.flags = {},
- .mh.callback = &ubser_write_clear_stall_callback,
- .mh.timeout = 1000, /* 1 second */
- .mh.interval = 50, /* 50ms */
- },
-
- [UBSER_BULK_CS_RD] = {
- .type = UE_CONTROL,
- .endpoint = 0x00, /* Control pipe */
- .direction = UE_DIR_ANY,
- .mh.bufsize = sizeof(struct usb2_device_request),
- .mh.flags = {},
- .mh.callback = &ubser_read_clear_stall_callback,
- .mh.timeout = 1000, /* 1 second */
- .mh.interval = 50, /* 50ms */
- },
};
static const struct usb2_com_callback ubser_callback = {
@@ -311,8 +281,8 @@
}
mtx_lock(&Giant);
- sc->sc_flags |= (UBSER_FLAG_READ_STALL |
- UBSER_FLAG_WRITE_STALL);
+ usb2_transfer_set_stall(sc->sc_xfer[UBSER_BULK_DT_WR]);
+ usb2_transfer_set_stall(sc->sc_xfer[UBSER_BULK_DT_RD]);
usb2_transfer_start(sc->sc_xfer[UBSER_BULK_DT_RD]);
@@ -329,22 +299,11 @@
ubser_detach(device_t dev)
{
struct ubser_softc *sc = device_get_softc(dev);
- uint8_t n;
DPRINTF("\n");
usb2_com_detach(&sc->sc_super_ucom, sc->sc_ucom, sc->sc_numser);
- /*
- * need to stop all transfers atomically, hence when clear stall
- * completes, it might start other transfers !
- */
- mtx_lock(&Giant);
- for (n = 0; n < UBSER_N_TRANSFER; n++) {
- usb2_transfer_stop(sc->sc_xfer[n]);
- }
- mtx_unlock(&Giant);
-
usb2_transfer_unsetup(sc->sc_xfer, UBSER_N_TRANSFER);
return (0);
@@ -409,19 +368,6 @@
}
static void
-ubser_write_clear_stall_callback(struct usb2_xfer *xfer)
-{
- struct ubser_softc *sc = xfer->priv_sc;
- struct usb2_xfer *xfer_other = sc->sc_xfer[UBSER_BULK_DT_WR];
-
- if (usb2_clear_stall_callback(xfer, xfer_other)) {
- DPRINTF("stall cleared\n");
- sc->sc_flags &= ~UBSER_FLAG_WRITE_STALL;
- usb2_transfer_start(xfer_other);
- }
-}
-
-static void
ubser_write_callback(struct usb2_xfer *xfer)
{
struct ubser_softc *sc = xfer->priv_sc;
@@ -432,10 +378,7 @@
switch (USB_GET_STATE(xfer)) {
case USB_ST_SETUP:
case USB_ST_TRANSFERRED:
- if (sc->sc_flags & UBSER_FLAG_WRITE_STALL) {
- usb2_transfer_start(sc->sc_xfer[UBSER_BULK_CS_WR]);
- return;
- }
+tr_setup:
do {
if (usb2_com_get_data(sc->sc_ucom + sc->sc_curr_tx_unit,
xfer->frbuffers, 1, sc->sc_tx_size - 1,
@@ -460,8 +403,9 @@
default: /* Error */
if (xfer->error != USB_ERR_CANCELLED) {
- sc->sc_flags |= UBSER_FLAG_WRITE_STALL;
- usb2_transfer_start(sc->sc_xfer[UBSER_BULK_CS_WR]);
+ /* try to clear stall first */
+ xfer->flags.stall_pipe = 1;
+ goto tr_setup;
}
return;
@@ -469,19 +413,6 @@
}
static void
-ubser_read_clear_stall_callback(struct usb2_xfer *xfer)
-{
- struct ubser_softc *sc = xfer->priv_sc;
- struct usb2_xfer *xfer_other = sc->sc_xfer[UBSER_BULK_DT_RD];
-
- if (usb2_clear_stall_callback(xfer, xfer_other)) {
- DPRINTF("stall cleared\n");
- sc->sc_flags &= ~UBSER_FLAG_READ_STALL;
- usb2_transfer_start(xfer_other);
- }
-}
-
-static void
ubser_read_callback(struct usb2_xfer *xfer)
{
struct ubser_softc *sc = xfer->priv_sc;
@@ -504,18 +435,15 @@
case USB_ST_SETUP:
tr_setup:
- if (sc->sc_flags & UBSER_FLAG_READ_STALL) {
- usb2_transfer_start(sc->sc_xfer[UBSER_BULK_CS_RD]);
- } else {
- xfer->frlengths[0] = xfer->max_data_length;
- usb2_start_hardware(xfer);
- }
+ xfer->frlengths[0] = xfer->max_data_length;
+ usb2_start_hardware(xfer);
return;
default: /* Error */
if (xfer->error != USB_ERR_CANCELLED) {
- sc->sc_flags |= UBSER_FLAG_READ_STALL;
- usb2_transfer_start(sc->sc_xfer[UBSER_BULK_CS_RD]);
+ /* try to clear stall first */
+ xfer->flags.stall_pipe = 1;
+ goto tr_setup;
}
return;
@@ -540,9 +468,8 @@
req.wIndex[1] = 0;
USETW(req.wLength, 0);
- err = usb2_do_request_flags
- (sc->sc_udev, &Giant, &req, NULL, 0, NULL, 1000);
-
+ err = usb2_com_cfg_do_request(sc->sc_udev, ucom,
+ &req, NULL, 0, 1000);
if (err) {
DPRINTFN(0, "send break failed, error=%s\n",
usb2_errstr(err));
@@ -571,7 +498,6 @@
{
struct ubser_softc *sc = ucom->sc_parent;
- usb2_transfer_stop(sc->sc_xfer[UBSER_BULK_CS_RD]);
usb2_transfer_stop(sc->sc_xfer[UBSER_BULK_DT_RD]);
}
@@ -588,6 +514,5 @@
{
struct ubser_softc *sc = ucom->sc_parent;
- usb2_transfer_stop(sc->sc_xfer[UBSER_BULK_CS_WR]);
usb2_transfer_stop(sc->sc_xfer[UBSER_BULK_DT_WR]);
}
==== //depot/projects/usb/src/sys/dev/usb2/serial/uchcom2.c#19 (text+ko) ====
@@ -148,11 +148,8 @@
enum {
UCHCOM_BULK_DT_WR,
UCHCOM_BULK_DT_RD,
- UCHCOM_BULK_CS_WR,
- UCHCOM_BULK_CS_RD,
UCHCOM_INTR_DT_RD,
- UCHCOM_INTR_CS_RD,
- UCHCOM_N_TRANSFER = 6,
+ UCHCOM_N_TRANSFER,
};
struct uchcom_softc {
@@ -167,10 +164,6 @@
uint8_t sc_version;
uint8_t sc_msr;
uint8_t sc_lsr; /* local status register */
- uint8_t sc_flag;
-#define UCHCOM_FLAG_INTR_STALL 0x01
-#define UCHCOM_FLAG_READ_STALL 0x02
-#define UCHCOM_FLAG_WRITE_STALL 0x04
};
struct uchcom_divider {
@@ -230,11 +223,8 @@
static device_detach_t uchcom_detach;
static usb2_callback_t uchcom_intr_callback;
-static usb2_callback_t uchcom_intr_clear_stall_callback;
static usb2_callback_t uchcom_write_callback;
-static usb2_callback_t uchcom_write_clear_stall_callback;
static usb2_callback_t uchcom_read_callback;
-static usb2_callback_t uchcom_read_clear_stall_callback;
static const struct usb2_config uchcom_config_data[UCHCOM_N_TRANSFER] = {
@@ -256,26 +246,6 @@
.mh.callback = &uchcom_read_callback,
},
- [UCHCOM_BULK_CS_WR] = {
- .type = UE_CONTROL,
- .endpoint = 0x00, /* Control pipe */
- .direction = UE_DIR_ANY,
- .mh.bufsize = sizeof(struct usb2_device_request),
- .mh.callback = &uchcom_write_clear_stall_callback,
- .mh.timeout = 1000, /* 1 second */
- .mh.interval = 50, /* 50ms */
- },
-
- [UCHCOM_BULK_CS_RD] = {
- .type = UE_CONTROL,
- .endpoint = 0x00, /* Control pipe */
- .direction = UE_DIR_ANY,
- .mh.bufsize = sizeof(struct usb2_device_request),
- .mh.callback = &uchcom_read_clear_stall_callback,
- .mh.timeout = 1000, /* 1 second */
- .mh.interval = 50, /* 50ms */
- },
-
[UCHCOM_INTR_DT_RD] = {
.type = UE_INTERRUPT,
.endpoint = UE_ADDR_ANY,
@@ -284,16 +254,6 @@
.mh.bufsize = 0, /* use wMaxPacketSize */
.mh.callback = &uchcom_intr_callback,
},
-
- [UCHCOM_INTR_CS_RD] = {
- .type = UE_CONTROL,
- .endpoint = 0x00, /* Control pipe */
- .direction = UE_DIR_ANY,
- .mh.bufsize = sizeof(struct usb2_device_request),
- .mh.callback = &uchcom_intr_clear_stall_callback,
- .mh.timeout = 1000, /* 1 second */
- .mh.interval = 50, /* 50ms */
- },
};
struct usb2_com_callback uchcom_callback = {
@@ -378,8 +338,8 @@
sc->sc_rts = 1;
/* clear stall at first run */
- sc->sc_flag |= (UCHCOM_FLAG_READ_STALL |
- UCHCOM_FLAG_WRITE_STALL);
+ usb2_transfer_set_stall(sc->sc_xfer[UCHCOM_BULK_DT_WR]);
+ usb2_transfer_set_stall(sc->sc_xfer[UCHCOM_BULK_DT_RD]);
error = usb2_com_attach(&sc->sc_super_ucom, &sc->sc_ucom, 1, sc,
&uchcom_callback, &Giant);
@@ -412,35 +372,6 @@
*/
static void
-uchcom_do_request(struct uchcom_softc *sc,
- struct usb2_device_request *req, void *data)
-{
- uint16_t length;
- uint16_t actlen;
- usb2_error_t err;
-
- length = UGETW(req->wLength);
- actlen = 0;
-
- if (usb2_com_cfg_is_gone(&sc->sc_ucom)) {
- goto done;
- }
- err = usb2_do_request_flags(sc->sc_udev, &Giant, req,
- data, USB_SHORT_XFER_OK, &actlen, 1000);
-
- if (err) {
- DPRINTFN(0, "device request failed, err=%s "
- "(ignored)\n", usb2_errstr(err));
- }
-done:
- if (length != actlen) {
- if (req->bmRequestType & UT_READ) {
- bzero(USB_ADD_BYTES(data, actlen), length - actlen);
- }
- }
-}
-
-static void
uchcom_ctrl_write(struct uchcom_softc *sc, uint8_t reqno,
uint16_t value, uint16_t index)
{
@@ -452,7 +383,8 @@
USETW(req.wIndex, index);
USETW(req.wLength, 0);
- uchcom_do_request(sc, &req, NULL);
+ usb2_com_cfg_do_request(sc->sc_udev,
+ &sc->sc_ucom, &req, NULL, 0, 1000);
}
static void
@@ -467,7 +399,8 @@
USETW(req.wIndex, index);
USETW(req.wLength, buflen);
- uchcom_do_request(sc, &req, buf);
+ usb2_com_cfg_do_request(sc->sc_udev,
+ &sc->sc_ucom, &req, buf, USB_SHORT_XFER_OK, 1000);
}
static void
@@ -812,7 +745,6 @@
usb2_transfer_stop(sc->sc_xfer[UCHCOM_INTR_DT_RD]);
/* stop read endpoint */
- usb2_transfer_stop(sc->sc_xfer[UCHCOM_BULK_CS_RD]);
usb2_transfer_stop(sc->sc_xfer[UCHCOM_BULK_DT_RD]);
}
@@ -829,7 +761,6 @@
{
struct uchcom_softc *sc = ucom->sc_parent;
- usb2_transfer_stop(sc->sc_xfer[UCHCOM_BULK_CS_WR]);
usb2_transfer_stop(sc->sc_xfer[UCHCOM_BULK_DT_WR]);
}
@@ -859,37 +790,22 @@
usb2_com_status_change(&sc->sc_ucom);
}
case USB_ST_SETUP:
- if (sc->sc_flag & UCHCOM_FLAG_INTR_STALL) {
- usb2_transfer_start(sc->sc_xfer[UCHCOM_INTR_CS_RD]);
- } else {
- xfer->frlengths[0] = xfer->max_data_length;
- usb2_start_hardware(xfer);
- }
+tr_setup:
+ xfer->frlengths[0] = xfer->max_data_length;
+ usb2_start_hardware(xfer);
break;
default: /* Error */
if (xfer->error != USB_ERR_CANCELLED) {
- sc->sc_flag |= UCHCOM_FLAG_INTR_STALL;
- usb2_transfer_start(sc->sc_xfer[UCHCOM_INTR_CS_RD]);
+ /* try to clear stall first */
+ xfer->flags.stall_pipe = 1;
+ goto tr_setup;
}
break;
}
}
static void
-uchcom_intr_clear_stall_callback(struct usb2_xfer *xfer)
-{
- struct uchcom_softc *sc = xfer->priv_sc;
- struct usb2_xfer *xfer_other = sc->sc_xfer[UCHCOM_INTR_DT_RD];
-
- if (usb2_clear_stall_callback(xfer, xfer_other)) {
- DPRINTF("stall cleared\n");
- sc->sc_flag &= ~UCHCOM_FLAG_INTR_STALL;
- usb2_transfer_start(xfer_other);
- }
-}
-
-static void
uchcom_write_callback(struct usb2_xfer *xfer)
{
struct uchcom_softc *sc = xfer->priv_sc;
@@ -898,10 +814,7 @@
switch (USB_GET_STATE(xfer)) {
case USB_ST_SETUP:
case USB_ST_TRANSFERRED:
- if (sc->sc_flag & UCHCOM_FLAG_WRITE_STALL) {
- usb2_transfer_start(sc->sc_xfer[UCHCOM_BULK_CS_WR]);
- return;
- }
+tr_setup:
if (usb2_com_get_data(&sc->sc_ucom, xfer->frbuffers, 0,
UCHCOM_BULK_BUF_SIZE, &actlen)) {
@@ -914,8 +827,9 @@
default: /* Error */
if (xfer->error != USB_ERR_CANCELLED) {
- sc->sc_flag |= UCHCOM_FLAG_WRITE_STALL;
- usb2_transfer_start(sc->sc_xfer[UCHCOM_BULK_CS_WR]);
+ /* try to clear stall first */
+ xfer->flags.stall_pipe = 1;
+ goto tr_setup;
}
return;
@@ -923,19 +837,6 @@
}
static void
-uchcom_write_clear_stall_callback(struct usb2_xfer *xfer)
-{
- struct uchcom_softc *sc = xfer->priv_sc;
- struct usb2_xfer *xfer_other = sc->sc_xfer[UCHCOM_BULK_DT_WR];
-
- if (usb2_clear_stall_callback(xfer, xfer_other)) {
- DPRINTF("stall cleared\n");
- sc->sc_flag &= ~UCHCOM_FLAG_WRITE_STALL;
- usb2_transfer_start(xfer_other);
- }
-}
-
-static void
uchcom_read_callback(struct usb2_xfer *xfer)
{
struct uchcom_softc *sc = xfer->priv_sc;
@@ -945,34 +846,18 @@
usb2_com_put_data(&sc->sc_ucom, xfer->frbuffers, 0, xfer->actlen);
case USB_ST_SETUP:
- if (sc->sc_flag & UCHCOM_FLAG_READ_STALL) {
- usb2_transfer_start(sc->sc_xfer[UCHCOM_BULK_CS_RD]);
- } else {
- xfer->frlengths[0] = xfer->max_data_length;
- usb2_start_hardware(xfer);
- }
+tr_setup:
+ xfer->frlengths[0] = xfer->max_data_length;
+ usb2_start_hardware(xfer);
return;
default: /* Error */
if (xfer->error != USB_ERR_CANCELLED) {
- sc->sc_flag |= UCHCOM_FLAG_READ_STALL;
- usb2_transfer_start(sc->sc_xfer[UCHCOM_BULK_CS_RD]);
+ /* try to clear stall first */
+ xfer->flags.stall_pipe = 1;
+ goto tr_setup;
}
return;
-
- }
-}
>>> TRUNCATED FOR MAIL (1000 lines) <<<
More information about the p4-projects
mailing list