diff options
| author | Sam Leffler <sam@FreeBSD.org> | 2008-03-20 16:19:25 +0000 |
|---|---|---|
| committer | Sam Leffler <sam@FreeBSD.org> | 2008-03-20 16:19:25 +0000 |
| commit | 43b1161d4d865e4cab9848ac3617bc84da4194d8 (patch) | |
| tree | 52505d59404b1e19473df0d19c16200000764b76 /sys/dev | |
| parent | 91a35e787094b1aca363bfd0ec8380d9a38ada53 (diff) | |
Notes
Diffstat (limited to 'sys/dev')
| -rw-r--r-- | sys/dev/usb/ehci.c | 16 | ||||
| -rw-r--r-- | sys/dev/usb/ohci.c | 16 |
2 files changed, 32 insertions, 0 deletions
diff --git a/sys/dev/usb/ehci.c b/sys/dev/usb/ehci.c index 661642f080ca..2cd5bc5c5340 100644 --- a/sys/dev/usb/ehci.c +++ b/sys/dev/usb/ehci.c @@ -653,6 +653,20 @@ ehci_pcd_enable(void *v_sc) ehci_pcd_able(sc, 1); } +/* + * XXX write back xfer data for architectures with a write-back + * data cache; this is a hack because usb is mis-architected + * in blindly mixing bus_dma w/ PIO. + */ +static __inline void +hacksync(usbd_xfer_handle xfer) +{ + usbd_pipe_handle pipe = xfer->pipe; + bus_dma_tag_t tag = pipe->device->bus->buffer_dmatag; + struct usb_dma_mapping *dmap = &xfer->dmamap; + bus_dmamap_sync(tag, dmap->map, BUS_DMASYNC_PREWRITE); +} + void ehci_pcd(ehci_softc_t *sc, usbd_xfer_handle xfer) { @@ -679,6 +693,7 @@ ehci_pcd(ehci_softc_t *sc, usbd_xfer_handle xfer) xfer->actlen = xfer->length; xfer->status = USBD_NORMAL_COMPLETION; + hacksync(xfer); /* XXX to compensate for usb_transfer_complete */ usb_transfer_complete(xfer); } @@ -2072,6 +2087,7 @@ ehci_root_ctrl_start(usbd_xfer_handle xfer) ret: xfer->status = err; s = splusb(); + hacksync(xfer); /* XXX to compensate for usb_transfer_complete */ usb_transfer_complete(xfer); splx(s); return (USBD_IN_PROGRESS); diff --git a/sys/dev/usb/ohci.c b/sys/dev/usb/ohci.c index 736bdf812311..3b953025f910 100644 --- a/sys/dev/usb/ohci.c +++ b/sys/dev/usb/ohci.c @@ -1560,6 +1560,20 @@ ohci_device_bulk_done(usbd_xfer_handle xfer) xfer->hcpriv = NULL; } +/* + * XXX write back xfer data for architectures with a write-back + * data cache; this is a hack because usb is mis-architected + * in blindly mixing bus_dma w/ PIO. + */ +static __inline void +hacksync(usbd_xfer_handle xfer) +{ + usbd_pipe_handle pipe = xfer->pipe; + bus_dma_tag_t tag = pipe->device->bus->buffer_dmatag; + struct usb_dma_mapping *dmap = &xfer->dmamap; + bus_dmamap_sync(tag, dmap->map, BUS_DMASYNC_PREWRITE); +} + void ohci_rhsc(ohci_softc_t *sc, usbd_xfer_handle xfer) { @@ -1591,6 +1605,7 @@ ohci_rhsc(ohci_softc_t *sc, usbd_xfer_handle xfer) xfer->actlen = xfer->length; xfer->status = USBD_NORMAL_COMPLETION; + hacksync(xfer); /* XXX to compensate for usb_transfer_complete */ usb_transfer_complete(xfer); } @@ -2722,6 +2737,7 @@ ohci_root_ctrl_start(usbd_xfer_handle xfer) ret: xfer->status = err; s = splusb(); + hacksync(xfer); /* XXX to compensate for usb_transfer_complete */ usb_transfer_complete(xfer); splx(s); return (USBD_IN_PROGRESS); |
