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
This commit is contained in:
parent
6c813c1ccc
commit
35d01728c6
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=196380
@ -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);
|
||||
}
|
||||
|
||||
/*------------------------------------------------------------------------*
|
||||
|
Loading…
Reference in New Issue
Block a user