diff options
author | raj <raj@FreeBSD.org> | 2009-08-19 14:39:08 +0000 |
---|---|---|
committer | raj <raj@FreeBSD.org> | 2009-08-19 14:39:08 +0000 |
commit | 7decbe72dcf0fb6084a95d4c83f295cf89a862ca (patch) | |
tree | 4459564538300a0007311ae873d9d1ea600f4fda /sys/dev/usb/usb_busdma.c | |
parent | c06ca7508dd9df75b13c402b1f1b27a8cd71f406 (diff) | |
download | FreeBSD-src-7decbe72dcf0fb6084a95d4c83f295cf89a862ca.zip FreeBSD-src-7decbe72dcf0fb6084a95d4c83f295cf89a862ca.tar.gz |
Fix USB cache sync operations for platforms with non-coherent DMA.
- usb_pc_cpu_invalidate() is called between [consecutive] reads from a device,
so a sequence of BUS_DMASYNC_POSTREAD and _PREREAD should be used. Note we
cannot use or'ed shorthand ( _POSTREAD | _PREREAD) for BUS_DMASYNC flags, as
the low level bus dma sync operation is implementation dependent and we
cannot assume the required order of operations to be guaranteed.
- usb_pc_cpu_flush() is called before writing to a device, so
BUS_DMASYNC_PREWRITE should be used.
Submitted by: Grzegorz Bernacki
Reviewed by: HPS, arm@, usb@ ML
Tested by: HPS, Mike Tancsa
Approved by: re (kib)
Obtained from: Semihalf
Diffstat (limited to 'sys/dev/usb/usb_busdma.c')
-rw-r--r-- | sys/dev/usb/usb_busdma.c | 7 |
1 files changed, 3 insertions, 4 deletions
diff --git a/sys/dev/usb/usb_busdma.c b/sys/dev/usb/usb_busdma.c index e5d6ed7..3769102 100644 --- a/sys/dev/usb/usb_busdma.c +++ b/sys/dev/usb/usb_busdma.c @@ -679,8 +679,8 @@ usb_pc_cpu_invalidate(struct usb_page_cache *pc) /* nothing has been loaded into this page cache! */ return; } - bus_dmamap_sync(pc->tag, pc->map, - BUS_DMASYNC_POSTWRITE | BUS_DMASYNC_POSTREAD); + bus_dmamap_sync(pc->tag, pc->map, BUS_DMASYNC_POSTREAD); + bus_dmamap_sync(pc->tag, pc->map, BUS_DMASYNC_PREREAD); } /*------------------------------------------------------------------------* @@ -693,8 +693,7 @@ usb_pc_cpu_flush(struct usb_page_cache *pc) /* nothing has been loaded into this page cache! */ return; } - bus_dmamap_sync(pc->tag, pc->map, - BUS_DMASYNC_PREWRITE | BUS_DMASYNC_PREREAD); + bus_dmamap_sync(pc->tag, pc->map, BUS_DMASYNC_PREWRITE); } /*------------------------------------------------------------------------* |