PERFORCE change 129492 for review
Hans Petter Selasky
hselasky at FreeBSD.org
Sun Nov 25 02:53:18 PST 2007
http://perforce.freebsd.org/chv.cgi?CH=129492
Change 129492 by hselasky at hselasky_laptop001 on 2007/11/25 10:53:09
Add BUS-DMA sync operations when loading virtual memory.
Affected files ...
.. //depot/projects/usb/src/sys/dev/usb/usb_subr.c#54 edit
.. //depot/projects/usb/src/sys/dev/usb/usb_subr.h#59 edit
.. //depot/projects/usb/src/sys/dev/usb/usb_transfer.c#48 edit
Differences ...
==== //depot/projects/usb/src/sys/dev/usb/usb_subr.c#54 (text+ko) ====
@@ -2244,6 +2244,28 @@
}
/*------------------------------------------------------------------------*
+ * usbd_dma_load_pre_sync - flush CPU cache, if any
+ *------------------------------------------------------------------------*/
+void
+usbd_dma_load_pre_sync(struct usbd_xfer *xfer)
+{
+ bus_dmamap_sync(xfer->udev->bus->dma_tag_1b, xfer->dma_tx_map,
+ BUS_DMASYNC_PREWRITE | BUS_DMASYNC_PREREAD);
+ return;
+}
+
+/*------------------------------------------------------------------------*
+ * usbd_dma_load_post_sync - invalidate CPU cache, if any
+ *------------------------------------------------------------------------*/
+void
+usbd_dma_load_post_sync(struct usbd_xfer *xfer)
+{
+ bus_dmamap_sync(xfer->udev->bus->dma_tag_1b, xfer->dma_rx_map,
+ BUS_DMASYNC_POSTWRITE | BUS_DMASYNC_POSTREAD);
+ return;
+}
+
+/*------------------------------------------------------------------------*
* usbd_page_cpu_invalidate - invalidate CPU cache
*------------------------------------------------------------------------*/
void
@@ -2269,7 +2291,8 @@
* usbd_dma_load_mem_callback - internal callback
*------------------------------------------------------------------------*/
static void
-usbd_dma_load_mem_callback(void *arg, bus_dma_segment_t *segs, int nseg, int error)
+usbd_dma_load_mem_callback(void *arg, bus_dma_segment_t *segs,
+ int nseg, int error)
{
struct usbd_page_cache *pc;
struct usbd_xfer *xfer;
==== //depot/projects/usb/src/sys/dev/usb/usb_subr.h#59 (text+ko) ====
@@ -710,6 +710,8 @@
void usbd_dma_tag_free(bus_dma_tag_t tag);
void *usbd_mem_alloc_sub(bus_dma_tag_t tag, struct usbd_page *page, uint32_t size, uint32_t alignment);
void usbd_mem_free_sub(struct usbd_page *page);
+void usbd_dma_load_pre_sync(struct usbd_xfer *xfer);
+void usbd_dma_load_post_sync(struct usbd_xfer *xfer);
void usbd_page_cpu_invalidate(struct usbd_page *page);
void usbd_page_cpu_flush(struct usbd_page *page);
void usbd_pio_load_mem(struct usbd_xfer *xfer, struct usbd_dma_load_mem_info *info);
==== //depot/projects/usb/src/sys/dev/usb/usb_transfer.c#48 (text+ko) ====
@@ -1520,6 +1520,9 @@
/* report error */
usbd_premature_callback(xfer, USBD_DMA_LOAD_FAILED);
} else {
+ if (xfer->flags_int.bdma_enable) {
+ usbd_dma_load_pre_sync(xfer);
+ }
/* finally start the hardware */
usbd_pipe_enter_wrapper(xfer);
}
@@ -1777,10 +1780,16 @@
xfer->usb_state = USBD_ST_SETUP;
} else {
xfer->flags_int.transferring = 0;
- if (xfer->error)
+ if (xfer->error) {
xfer->usb_state = USBD_ST_ERROR;
- else
+ } else {
xfer->usb_state = USBD_ST_TRANSFERRED;
+
+ if (xfer->flags.bdma_enable &&
+ xfer->flags_int.bdma_enable) {
+ usbd_dma_load_post_sync(xfer);
+ }
+ }
}
/* call processing routine */
More information about the p4-projects
mailing list