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