diff options
author | hselasky <hselasky@FreeBSD.org> | 2015-05-18 16:18:04 +0000 |
---|---|---|
committer | hselasky <hselasky@FreeBSD.org> | 2015-05-18 16:18:04 +0000 |
commit | 669babe7257682b58c1a03b62bb475f971f9a0d5 (patch) | |
tree | eb79070671f76219490f1c47e38d8f7e9e70e050 /sys/dev/usb/controller/dwc_otg.c | |
parent | bbcb77ec6f508b0b86c89c66da2ac6d70d07e288 (diff) | |
download | FreeBSD-src-669babe7257682b58c1a03b62bb475f971f9a0d5.zip FreeBSD-src-669babe7257682b58c1a03b62bb475f971f9a0d5.tar.gz |
Make the FIFO configuration a bit more flexible for the DWC OTG in
device side mode.
Diffstat (limited to 'sys/dev/usb/controller/dwc_otg.c')
-rw-r--r-- | sys/dev/usb/controller/dwc_otg.c | 41 |
1 files changed, 19 insertions, 22 deletions
diff --git a/sys/dev/usb/controller/dwc_otg.c b/sys/dev/usb/controller/dwc_otg.c index 37b5333..ea59ae6 100644 --- a/sys/dev/usb/controller/dwc_otg.c +++ b/sys/dev/usb/controller/dwc_otg.c @@ -297,32 +297,29 @@ dwc_otg_init_fifo(struct dwc_otg_softc *sc, uint8_t mode) if (x < sc->sc_dev_in_ep_max) { uint32_t limit; - limit = (x == 1) ? DWC_OTG_MAX_TXN : - (DWC_OTG_MAX_TXN / 2); - - if (fifo_size >= limit) { - DWC_OTG_WRITE_4(sc, DOTG_DIEPTXF(x), - ((limit / 4) << 16) | - (tx_start / 4)); - tx_start += limit; - fifo_size -= limit; - pf->usb.max_in_frame_size = 0x200; - pf->usb.support_in = 1; - pf->max_buffer = limit; + limit = (x == 1) ? MIN(DWC_OTG_TX_MAX_FIFO_SIZE, + DWC_OTG_MAX_TXN) : MIN(DWC_OTG_MAX_TXN / 2, + DWC_OTG_TX_MAX_FIFO_SIZE); - } else if (fifo_size >= 0x80) { - DWC_OTG_WRITE_4(sc, DOTG_DIEPTXF(x), - ((0x80 / 4) << 16) | (tx_start / 4)); - tx_start += 0x80; - fifo_size -= 0x80; - pf->usb.max_in_frame_size = 0x40; + /* see if there is enough FIFO space */ + if (limit <= fifo_size) { + pf->max_buffer = limit; pf->usb.support_in = 1; - } else { - pf->usb.is_simplex = 1; - DWC_OTG_WRITE_4(sc, DOTG_DIEPTXF(x), - (0x0 << 16) | (tx_start / 4)); + limit = MIN(DWC_OTG_TX_MAX_FIFO_SIZE, 0x40); + if (limit <= fifo_size) { + pf->usb.support_in = 1; + } else { + pf->usb.is_simplex = 1; + limit = 0; + } } + /* set FIFO size */ + DWC_OTG_WRITE_4(sc, DOTG_DIEPTXF(x), + ((limit / 4) << 16) | (tx_start / 4)); + tx_start += limit; + fifo_size -= limit; + pf->usb.max_in_frame_size = limit; } else { pf->usb.is_simplex = 1; } |