diff options
Diffstat (limited to 'sys/dev/usb2/serial/umct2.c')
-rw-r--r-- | sys/dev/usb2/serial/umct2.c | 80 |
1 files changed, 44 insertions, 36 deletions
diff --git a/sys/dev/usb2/serial/umct2.c b/sys/dev/usb2/serial/umct2.c index ad0b800..23aea40 100644 --- a/sys/dev/usb2/serial/umct2.c +++ b/sys/dev/usb2/serial/umct2.c @@ -80,14 +80,22 @@ __FBSDID("$FreeBSD$"); #define UMCT_IFACE_INDEX 0 #define UMCT_CONFIG_INDEX 1 -#define UMCT_ENDPT_MAX 6 /* units */ +enum { + UMCT_BULK_DT_WR, + UMCT_BULK_DT_RD, + UMCT_BULK_CS_WR, + UMCT_BULK_CS_RD, + UMCT_INTR_DT_RD, + UMCT_INTR_CS_RD, + UMCT_N_TRANSFER = 6, +}; struct umct_softc { struct usb2_com_super_softc sc_super_ucom; struct usb2_com_softc sc_ucom; struct usb2_device *sc_udev; - struct usb2_xfer *sc_xfer[UMCT_ENDPT_MAX]; + struct usb2_xfer *sc_xfer[UMCT_N_TRANSFER]; uint32_t sc_unit; @@ -134,9 +142,9 @@ static void umct_stop_read(struct usb2_com_softc *); static void umct_start_write(struct usb2_com_softc *); static void umct_stop_write(struct usb2_com_softc *); -static const struct usb2_config umct_config[UMCT_ENDPT_MAX] = { +static const struct usb2_config umct_config[UMCT_N_TRANSFER] = { - [0] = { + [UMCT_BULK_DT_WR] = { .type = UE_BULK, .endpoint = UE_ADDR_ANY, .direction = UE_DIR_OUT, @@ -145,7 +153,7 @@ static const struct usb2_config umct_config[UMCT_ENDPT_MAX] = { .mh.callback = &umct_write_callback, }, - [1] = { + [UMCT_BULK_DT_RD] = { .type = UE_INTERRUPT, .endpoint = UE_ADDR_ANY, .direction = UE_DIR_IN, @@ -155,7 +163,7 @@ static const struct usb2_config umct_config[UMCT_ENDPT_MAX] = { .ep_index = 0, /* first interrupt endpoint */ }, - [2] = { + [UMCT_BULK_CS_WR] = { .type = UE_CONTROL, .endpoint = 0x00, /* Control pipe */ .direction = UE_DIR_ANY, @@ -166,7 +174,7 @@ static const struct usb2_config umct_config[UMCT_ENDPT_MAX] = { .mh.interval = 50, /* 50ms */ }, - [3] = { + [UMCT_BULK_CS_RD] = { .type = UE_CONTROL, .endpoint = 0x00, /* Control pipe */ .direction = UE_DIR_ANY, @@ -177,7 +185,7 @@ static const struct usb2_config umct_config[UMCT_ENDPT_MAX] = { .mh.interval = 50, /* 50ms */ }, - [4] = { + [UMCT_INTR_DT_RD] = { .type = UE_INTERRUPT, .endpoint = UE_ADDR_ANY, .direction = UE_DIR_IN, @@ -187,7 +195,7 @@ static const struct usb2_config umct_config[UMCT_ENDPT_MAX] = { .ep_index = 1, /* second interrupt endpoint */ }, - [5] = { + [UMCT_INTR_CS_RD] = { .type = UE_CONTROL, .endpoint = 0x00, /* Control pipe */ .direction = UE_DIR_ANY, @@ -280,7 +288,7 @@ umct_attach(device_t dev) iface_index = UMCT_IFACE_INDEX; error = usb2_transfer_setup(uaa->device, &iface_index, - sc->sc_xfer, umct_config, UMCT_ENDPT_MAX, sc, &Giant); + sc->sc_xfer, umct_config, UMCT_N_TRANSFER, sc, &Giant); if (error) { device_printf(dev, "allocating USB " @@ -292,20 +300,20 @@ umct_attach(device_t dev) * The only way to differentiate it from the real interrupt * endpoint is to look at the wMaxPacketSize field. */ - maxp = UGETW(sc->sc_xfer[1]->pipe->edesc->wMaxPacketSize); + maxp = UGETW(sc->sc_xfer[UMCT_BULK_DT_RD]->pipe->edesc->wMaxPacketSize); if (maxp == 0x2) { /* guessed wrong - switch around endpoints */ - struct usb2_xfer *temp = sc->sc_xfer[4]; + struct usb2_xfer *temp = sc->sc_xfer[UMCT_INTR_DT_RD]; - sc->sc_xfer[4] = sc->sc_xfer[1]; - sc->sc_xfer[1] = temp; + sc->sc_xfer[UMCT_INTR_DT_RD] = sc->sc_xfer[UMCT_BULK_DT_RD]; + sc->sc_xfer[UMCT_BULK_DT_RD] = temp; - sc->sc_xfer[1]->callback = &umct_read_callback; - sc->sc_xfer[4]->callback = &umct_intr_callback; + sc->sc_xfer[UMCT_BULK_DT_RD]->callback = &umct_read_callback; + sc->sc_xfer[UMCT_INTR_DT_RD]->callback = &umct_intr_callback; } - sc->sc_obufsize = sc->sc_xfer[0]->max_data_length; + sc->sc_obufsize = sc->sc_xfer[UMCT_BULK_DT_WR]->max_data_length; if (uaa->info.idProduct == USB_PRODUCT_MCT_SITECOM_USB232) { if (sc->sc_obufsize > 16) { @@ -331,7 +339,7 @@ umct_detach(device_t dev) usb2_com_detach(&sc->sc_super_ucom, &sc->sc_ucom, 1); - usb2_transfer_unsetup(sc->sc_xfer, UMCT_ENDPT_MAX); + usb2_transfer_unsetup(sc->sc_xfer, UMCT_N_TRANSFER); return (0); } @@ -373,7 +381,7 @@ static void umct_intr_clear_stall_callback(struct usb2_xfer *xfer) { struct umct_softc *sc = xfer->priv_sc; - struct usb2_xfer *xfer_other = sc->sc_xfer[4]; + struct usb2_xfer *xfer_other = sc->sc_xfer[UMCT_INTR_DT_RD]; if (usb2_clear_stall_callback(xfer, xfer_other)) { DPRINTF("stall cleared\n"); @@ -404,7 +412,7 @@ umct_intr_callback(struct usb2_xfer *xfer) case USB_ST_SETUP: tr_setup: if (sc->sc_flags & UMCT_FLAG_INTR_STALL) { - usb2_transfer_start(sc->sc_xfer[5]); + usb2_transfer_start(sc->sc_xfer[UMCT_INTR_CS_RD]); } else { xfer->frlengths[0] = xfer->max_data_length; usb2_start_hardware(xfer); @@ -415,7 +423,7 @@ tr_setup: if (xfer->error != USB_ERR_CANCELLED) { /* start clear stall */ sc->sc_flags |= UMCT_FLAG_INTR_STALL; - usb2_transfer_start(sc->sc_xfer[5]); + usb2_transfer_start(sc->sc_xfer[UMCT_INTR_CS_RD]); } return; @@ -553,10 +561,10 @@ umct_start_read(struct usb2_com_softc *ucom) struct umct_softc *sc = ucom->sc_parent; /* start interrupt endpoint */ - usb2_transfer_start(sc->sc_xfer[4]); + usb2_transfer_start(sc->sc_xfer[UMCT_INTR_DT_RD]); /* start read endpoint */ - usb2_transfer_start(sc->sc_xfer[1]); + usb2_transfer_start(sc->sc_xfer[UMCT_BULK_DT_RD]); } static void @@ -565,12 +573,12 @@ umct_stop_read(struct usb2_com_softc *ucom) struct umct_softc *sc = ucom->sc_parent; /* stop interrupt endpoint */ - usb2_transfer_stop(sc->sc_xfer[5]); - usb2_transfer_stop(sc->sc_xfer[4]); + usb2_transfer_stop(sc->sc_xfer[UMCT_INTR_CS_RD]); + usb2_transfer_stop(sc->sc_xfer[UMCT_INTR_DT_RD]); /* stop read endpoint */ - usb2_transfer_stop(sc->sc_xfer[3]); - usb2_transfer_stop(sc->sc_xfer[1]); + usb2_transfer_stop(sc->sc_xfer[UMCT_BULK_CS_RD]); + usb2_transfer_stop(sc->sc_xfer[UMCT_BULK_DT_RD]); } static void @@ -578,7 +586,7 @@ umct_start_write(struct usb2_com_softc *ucom) { struct umct_softc *sc = ucom->sc_parent; - usb2_transfer_start(sc->sc_xfer[0]); + usb2_transfer_start(sc->sc_xfer[UMCT_BULK_DT_WR]); } static void @@ -586,8 +594,8 @@ umct_stop_write(struct usb2_com_softc *ucom) { struct umct_softc *sc = ucom->sc_parent; - usb2_transfer_stop(sc->sc_xfer[2]); - usb2_transfer_stop(sc->sc_xfer[0]); + usb2_transfer_stop(sc->sc_xfer[UMCT_BULK_CS_WR]); + usb2_transfer_stop(sc->sc_xfer[UMCT_BULK_DT_WR]); } static void @@ -600,7 +608,7 @@ umct_write_callback(struct usb2_xfer *xfer) case USB_ST_SETUP: case USB_ST_TRANSFERRED: if (sc->sc_flags & UMCT_FLAG_WRITE_STALL) { - usb2_transfer_start(sc->sc_xfer[2]); + usb2_transfer_start(sc->sc_xfer[UMCT_BULK_CS_WR]); return; } if (usb2_com_get_data(&sc->sc_ucom, xfer->frbuffers, 0, @@ -614,7 +622,7 @@ umct_write_callback(struct usb2_xfer *xfer) default: /* Error */ if (xfer->error != USB_ERR_CANCELLED) { sc->sc_flags |= UMCT_FLAG_WRITE_STALL; - usb2_transfer_start(sc->sc_xfer[2]); + usb2_transfer_start(sc->sc_xfer[UMCT_BULK_CS_WR]); } return; @@ -625,7 +633,7 @@ static void umct_write_clear_stall_callback(struct usb2_xfer *xfer) { struct umct_softc *sc = xfer->priv_sc; - struct usb2_xfer *xfer_other = sc->sc_xfer[0]; + struct usb2_xfer *xfer_other = sc->sc_xfer[UMCT_BULK_DT_WR]; if (usb2_clear_stall_callback(xfer, xfer_other)) { DPRINTF("stall cleared\n"); @@ -646,7 +654,7 @@ umct_read_callback(struct usb2_xfer *xfer) case USB_ST_SETUP: if (sc->sc_flags & UMCT_FLAG_READ_STALL) { - usb2_transfer_start(sc->sc_xfer[3]); + usb2_transfer_start(sc->sc_xfer[UMCT_BULK_CS_RD]); } else { xfer->frlengths[0] = xfer->max_data_length; usb2_start_hardware(xfer); @@ -656,7 +664,7 @@ umct_read_callback(struct usb2_xfer *xfer) default: /* Error */ if (xfer->error != USB_ERR_CANCELLED) { sc->sc_flags |= UMCT_FLAG_READ_STALL; - usb2_transfer_start(sc->sc_xfer[3]); + usb2_transfer_start(sc->sc_xfer[UMCT_BULK_CS_RD]); } return; @@ -667,7 +675,7 @@ static void umct_read_clear_stall_callback(struct usb2_xfer *xfer) { struct umct_softc *sc = xfer->priv_sc; - struct usb2_xfer *xfer_other = sc->sc_xfer[1]; + struct usb2_xfer *xfer_other = sc->sc_xfer[UMCT_BULK_DT_RD]; if (usb2_clear_stall_callback(xfer, xfer_other)) { DPRINTF("stall cleared\n"); |