Module Name:    src
Committed By:   skrll
Date:           Sun Apr 28 08:55:03 UTC 2024

Modified Files:
        src/sys/dev/usb: ohci.c

Log Message:
Fix some usb_syncmem calls and add some missing ones.


To generate a diff of this commit:
cvs rdiff -u -r1.327 -r1.328 src/sys/dev/usb/ohci.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/ohci.c
diff -u src/sys/dev/usb/ohci.c:1.327 src/sys/dev/usb/ohci.c:1.328
--- src/sys/dev/usb/ohci.c:1.327	Sun Apr 28 07:52:52 2024
+++ src/sys/dev/usb/ohci.c	Sun Apr 28 08:55:03 2024
@@ -1,4 +1,4 @@
-/*	$NetBSD: ohci.c,v 1.327 2024/04/28 07:52:52 skrll Exp $	*/
+/*	$NetBSD: ohci.c,v 1.328 2024/04/28 08:55:03 skrll Exp $	*/
 
 /*
  * Copyright (c) 1998, 2004, 2005, 2012, 2016, 2020 The NetBSD Foundation, Inc.
@@ -42,7 +42,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ohci.c,v 1.327 2024/04/28 07:52:52 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ohci.c,v 1.328 2024/04/28 08:55:03 skrll Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_usb.h"
@@ -844,6 +844,9 @@ ohci_init(ohci_softc_t *sc)
 		goto bad1;
 	}
 	sc->sc_ctrl_head->ed.ed_flags |= HTOO32(OHCI_ED_SKIP);
+	usb_syncmem(&sc->sc_ctrl_head->dma, sc->sc_ctrl_head->offs,
+	    sizeof(sc->sc_ctrl_head->ed),
+	    BUS_DMASYNC_PREWRITE | BUS_DMASYNC_PREREAD);
 
 	/* Allocate dummy ED that starts the bulk list. */
 	sc->sc_bulk_head = ohci_alloc_sed(sc);
@@ -1609,6 +1612,10 @@ ohci_softintr(void *v)
 			for (i = 0, sitd = xfer->ux_hcpriv;;
 			    sitd = next) {
 				next = sitd->nextitd;
+
+				usb_syncmem(&sitd->dma, sitd->offs, sizeof(sitd->itd),
+				    BUS_DMASYNC_POSTWRITE | BUS_DMASYNC_POSTREAD);
+
 				if (OHCI_ITD_GET_CC(O32TOH(sitd->
 				    itd.itd_flags)) != OHCI_CC_NO_ERROR)
 					xfer->ux_status = USBD_IOERROR;
@@ -2259,8 +2266,7 @@ ohci_abortx(struct usbd_xfer *xfer)
 	 * waiting for the next start of frame (OHCI_SF)
 	 */
 	DPRINTFN(1, "stop ed=%#jx", (uintptr_t)sed, 0, 0, 0);
-	usb_syncmem(&sed->dma, sed->offs + offsetof(ohci_ed_t, ed_flags),
-	    sizeof(sed->ed.ed_flags),
+	usb_syncmem(&sed->dma, sed->offs, sizeof(sed->ed),
 	    BUS_DMASYNC_POSTWRITE | BUS_DMASYNC_POSTREAD);
 	if (!(sed->ed.ed_flags & OHCI_HALTED)) {
 		/* force hardware skip */
@@ -2337,6 +2343,9 @@ ohci_abortx(struct usbd_xfer *xfer)
 		hit |= headp == p->physaddr;
 		n = p->nexttd;
 
+		usb_syncmem(&p->dma, p->offs + offsetof(ohci_td_t, td_flags),
+		    sizeof(p->td.td_flags),
+		    BUS_DMASYNC_POSTWRITE | BUS_DMASYNC_POSTREAD);
 		int cc = OHCI_TD_GET_CC(O32TOH(p->td.td_flags));
 		if (!OHCI_CC_ACCESSED_P(cc)) {
 			ohci_hash_rem_td(sc, p);
@@ -2951,8 +2960,17 @@ ohci_device_clear_toggle(struct usbd_pip
 {
 	struct ohci_pipe *opipe = OHCI_PIPE2OPIPE(pipe);
 	ohci_softc_t *sc = OHCI_PIPE2SC(pipe);
+	ohci_soft_ed_t *sed = opipe->sed;
+
+	usb_syncmem(&sed->dma, sed->offs + offsetof(ohci_ed_t, ed_headp),
+	    sizeof(sed->ed.ed_headp),
+	    BUS_DMASYNC_POSTWRITE | BUS_DMASYNC_POSTREAD);
 
 	opipe->sed->ed.ed_headp &= HTOO32(~OHCI_TOGGLECARRY);
+
+	usb_syncmem(&sed->dma, sed->offs + offsetof(ohci_ed_t, ed_headp),
+	    sizeof(sed->ed.ed_headp),
+	    BUS_DMASYNC_PREWRITE | BUS_DMASYNC_PREREAD);
 }
 
 Static void
@@ -3403,17 +3421,21 @@ ohci_device_setintr(ohci_softc_t *sc, st
 	mutex_enter(&sc->sc_lock);
 	hsed = sc->sc_eds[best];
 	sed->next = hsed->next;
-	usb_syncmem(&hsed->dma, hsed->offs + offsetof(ohci_ed_t, ed_flags),
-	    sizeof(hsed->ed.ed_flags),
+	usb_syncmem(&sed->dma, sed->offs + offsetof(ohci_ed_t, ed_nexted),
+	    sizeof(sed->ed.ed_nexted),
 	    BUS_DMASYNC_POSTWRITE | BUS_DMASYNC_POSTREAD);
 	sed->ed.ed_nexted = hsed->ed.ed_nexted;
-	usb_syncmem(&sed->dma, sed->offs + offsetof(ohci_ed_t, ed_flags),
-	    sizeof(sed->ed.ed_flags),
+	usb_syncmem(&sed->dma, sed->offs + offsetof(ohci_ed_t, ed_nexted),
+	    sizeof(sed->ed.ed_nexted),
 	    BUS_DMASYNC_PREWRITE | BUS_DMASYNC_PREREAD);
+
 	hsed->next = sed;
+	usb_syncmem(&hsed->dma, hsed->offs + offsetof(ohci_ed_t, ed_nexted),
+	    sizeof(hsed->ed.ed_nexted),
+	    BUS_DMASYNC_POSTWRITE | BUS_DMASYNC_POSTREAD);
 	hsed->ed.ed_nexted = HTOO32(sed->physaddr);
-	usb_syncmem(&hsed->dma, hsed->offs + offsetof(ohci_ed_t, ed_flags),
-	    sizeof(hsed->ed.ed_flags),
+	usb_syncmem(&hsed->dma, hsed->offs + offsetof(ohci_ed_t, ed_nexted),
+	    sizeof(hsed->ed.ed_nexted),
 	    BUS_DMASYNC_PREWRITE | BUS_DMASYNC_PREREAD);
 	mutex_exit(&sc->sc_lock);
 
@@ -3685,8 +3707,7 @@ ohci_device_isoc_enter(struct usbd_xfer 
 	    BUS_DMASYNC_POSTWRITE | BUS_DMASYNC_POSTREAD);
 	sed->ed.ed_tailp = HTOO32(tail->physaddr);
 	sed->ed.ed_flags &= HTOO32(~OHCI_ED_SKIP);
-	usb_syncmem(&sed->dma, sed->offs + offsetof(ohci_ed_t, ed_flags),
-	    sizeof(sed->ed.ed_flags),
+	usb_syncmem(&sed->dma, sed->offs, sizeof(sed->ed),
 	    BUS_DMASYNC_PREWRITE | BUS_DMASYNC_PREREAD);
 }
 

Reply via email to