Module Name:    src
Committed By:   skrll
Date:           Mon Mar 16 21:21:46 UTC 2015

Modified Files:
        src/sys/dev/usb [nick-nhusb]: ehci.c

Log Message:
Correct / improve some usb_syncmem calls.


To generate a diff of this commit:
cvs rdiff -u -r1.234.2.41 -r1.234.2.42 src/sys/dev/usb/ehci.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/dev/usb/ehci.c
diff -u src/sys/dev/usb/ehci.c:1.234.2.41 src/sys/dev/usb/ehci.c:1.234.2.42
--- src/sys/dev/usb/ehci.c:1.234.2.41	Sun Mar 15 11:52:47 2015
+++ src/sys/dev/usb/ehci.c	Mon Mar 16 21:21:46 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: ehci.c,v 1.234.2.41 2015/03/15 11:52:47 skrll Exp $ */
+/*	$NetBSD: ehci.c,v 1.234.2.42 2015/03/16 21:21:46 skrll Exp $ */
 
 /*
  * Copyright (c) 2004-2012 The NetBSD Foundation, Inc.
@@ -53,7 +53,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ehci.c,v 1.234.2.41 2015/03/15 11:52:47 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ehci.c,v 1.234.2.42 2015/03/16 21:21:46 skrll Exp $");
 
 #include "ohci.h"
 #include "uhci.h"
@@ -950,6 +950,9 @@ ehci_check_itd_intr(ehci_softc_t *sc, st
 		goto done; /* All 8 descriptors inactive, it's done */
 	}
 
+	usb_syncmem(&itd->dma, itd->offs + offsetof(ehci_itd_t, itd_ctl),
+	    sizeof(itd->itd.itd_ctl), BUS_DMASYNC_PREREAD);
+
 	USBHIST_LOGN(ehcidebug, 10, "ex %p itd %p still active", ex,
 	    ex->ex_itdstart, 0, 0);
 	return;
@@ -988,13 +991,16 @@ ehci_check_sitd_intr(ehci_softc_t *sc, s
 	 * check no active transfers in last sitd, meaning we're finished
 	 */
 
-	usb_syncmem(&sitd->dma, sitd->offs + offsetof(ehci_sitd_t, sitd_buffer),
-		    sizeof(sitd->sitd.sitd_buffer), BUS_DMASYNC_POSTWRITE |
+	usb_syncmem(&sitd->dma, sitd->offs + offsetof(ehci_sitd_t, sitd_trans),
+	    sizeof(sitd->sitd.sitd_trans), BUS_DMASYNC_POSTWRITE |
 		    BUS_DMASYNC_POSTREAD);
 
 	if (le32toh(sitd->sitd.sitd_trans) & EHCI_SITD_ACTIVE)
 		return;
 
+	usb_syncmem(&sitd->dma, sitd->offs + offsetof(ehci_sitd_t, sitd_trans),
+	    sizeof(sitd->sitd.sitd_trans), BUS_DMASYNC_PREREAD);
+
 	USBHIST_LOGN(ehcidebug, 10, "ex=%p done", ex, 0, 0, 0);
 	callout_stop(&(ex->ex_xfer.ux_callout));
 	ehci_idone(ex);
@@ -1079,6 +1085,8 @@ ehci_idone(struct ehci_xfer *ex)
 				xfer->ux_frlengths[nframes++] = len;
 				actlen += len;
 			}
+			usb_syncmem(&itd->dma,itd->offs + offsetof(ehci_itd_t,itd_ctl),
+			    sizeof(itd->itd.itd_ctl), BUS_DMASYNC_PREREAD);
 
 			if (nframes >= xfer->ux_nframes)
 				break;
@@ -1098,8 +1106,8 @@ ehci_idone(struct ehci_xfer *ex)
 		actlen = 0;
 
 		for (sitd = ex->ex_sitdstart; sitd != NULL; sitd = sitd->xfer_next) {
-			usb_syncmem(&sitd->dma,sitd->offs + offsetof(ehci_sitd_t, sitd_buffer),
-			    sizeof(sitd->sitd.sitd_buffer), BUS_DMASYNC_POSTWRITE |
+			usb_syncmem(&sitd->dma, sitd->offs + offsetof(ehci_sitd_t, sitd_trans),
+			    sizeof(sitd->sitd.sitd_trans), BUS_DMASYNC_POSTWRITE |
 			    BUS_DMASYNC_POSTREAD);
 
 			/*
@@ -1113,6 +1121,9 @@ ehci_idone(struct ehci_xfer *ex)
 				break;
 
 			status = le32toh(sitd->sitd.sitd_trans);
+			usb_syncmem(&sitd->dma, sitd->offs + offsetof(ehci_sitd_t, sitd_trans),
+			    sizeof(sitd->sitd.sitd_trans), BUS_DMASYNC_PREREAD);
+
 			len = EHCI_SITD_GET_LEN(status);
 			if (status & (EHCI_SITD_ERR|EHCI_SITD_BUFERR|
 			    EHCI_SITD_BABBLE|EHCI_SITD_XACTERR|EHCI_SITD_MISS)) {
@@ -1153,6 +1164,8 @@ ehci_idone(struct ehci_xfer *ex)
 		usb_syncmem(&sqtd->dma, sqtd->offs, sizeof(sqtd->qtd),
 		    BUS_DMASYNC_POSTWRITE | BUS_DMASYNC_POSTREAD);
 		nstatus = le32toh(sqtd->qtd.qtd_status);
+		usb_syncmem(&sqtd->dma, sqtd->offs, sizeof(sqtd->qtd),
+		    BUS_DMASYNC_PREREAD);
 		if (nstatus & EHCI_QTD_ACTIVE)
 			break;
 
@@ -3227,6 +3240,10 @@ ehci_abort_xfer(usbd_xfer_handle xfer, u
 		    BUS_DMASYNC_PREWRITE | BUS_DMASYNC_PREREAD);
 	} else {
 		USBHIST_LOG(ehcidebug, "no hit", 0, 0, 0, 0);
+		usb_syncmem(&sqh->dma,
+		    sqh->offs + offsetof(ehci_qh_t, qh_curqtd),
+		    sizeof(sqh->qh.qh_curqtd),
+		    BUS_DMASYNC_PREREAD);
 	}
 
 	/*
@@ -4233,11 +4250,18 @@ ehci_device_fs_isoc_start(usbd_xfer_hand
 		sitd->sitd.sitd_sched = htole32(EHCI_SITD_SET_SMASK(sa) |
 		    EHCI_SITD_SET_CMASK(sb));
 
+		usb_syncmem(&sitd->dma, sitd->offs, sizeof(ehci_sitd_t),
+		    BUS_DMASYNC_PREWRITE | BUS_DMASYNC_PREREAD);
+
 		prev = sitd;
 	} /* End of frame */
 
 	sitd->sitd.sitd_trans |= htole32(EHCI_SITD_IOC);
 
+	usb_syncmem(&sitd->dma, sitd->offs + offsetof(ehci_sitd_t, sitd_trans),
+	    sizeof(sitd->sitd.sitd_trans),
+	    BUS_DMASYNC_PREWRITE | BUS_DMASYNC_PREREAD);
+
 	stop = sitd;
 	stop->xfer_next = NULL;
 
@@ -4273,6 +4297,11 @@ ehci_device_fs_isoc_start(usbd_xfer_hand
 		if (sitd == NULL)
 			panic("ehci: unexpectedly ran out of isoc sitds\n");
 
+		usb_syncmem(&sc->sc_fldma,
+		    sizeof(ehci_link_t) * frindex,
+		    sizeof(ehci_link_t),
+		    BUS_DMASYNC_POSTWRITE | BUS_DMASYNC_POSTREAD);
+
 		sitd->sitd.sitd_next = sc->sc_flist[frindex];
 		if (sitd->sitd.sitd_next == 0)
 			/* FIXME: frindex table gets initialized to NULL
@@ -4470,9 +4499,10 @@ ehci_device_isoc_start(usbd_xfer_handle 
 		if (prev != NULL) {
 			prev->itd.itd_next =
 			    htole32(itd->physaddr | EHCI_LINK_ITD);
-			usb_syncmem(&itd->dma,
-			    itd->offs + offsetof(ehci_itd_t, itd_next),
-			    sizeof(itd->itd.itd_next), BUS_DMASYNC_POSTWRITE);
+			usb_syncmem(&prev->dma,
+			    prev->offs + offsetof(ehci_itd_t, itd_next),
+			    sizeof(prev->itd.itd_next),
+			    BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
 
 			prev->xfer_next = itd;
 	    	} else {
@@ -4553,9 +4583,7 @@ ehci_device_isoc_start(usbd_xfer_handle 
 		itd->itd.itd_bufr[2] |=
 		    htole32(EHCI_ITD_SET_MULTI(UE_GET_TRANS(j)+1));
 
-		usb_syncmem(&itd->dma,
-		    itd->offs + offsetof(ehci_itd_t, itd_next),
-		    sizeof(ehci_itd_t),
+		usb_syncmem(&itd->dma, itd->offs, sizeof(ehci_itd_t),
 		    BUS_DMASYNC_PREWRITE | BUS_DMASYNC_PREREAD);
 
 		prev = itd;
@@ -4600,6 +4628,11 @@ ehci_device_isoc_start(usbd_xfer_handle 
 		if (itd == NULL)
 			panic("ehci: unexpectedly ran out of isoc itds, isoc_start\n");
 
+		usb_syncmem(&sc->sc_fldma,
+		    sizeof(ehci_link_t) * frindex,
+		    sizeof(ehci_link_t),
+		    BUS_DMASYNC_POSTWRITE | BUS_DMASYNC_POSTREAD);
+
 		itd->itd.itd_next = sc->sc_flist[frindex];
 		if (itd->itd.itd_next == 0)
 			/* FIXME: frindex table gets initialized to NULL

Reply via email to