Module Name:    src
Committed By:   jakllsch
Date:           Sun Feb 16 18:21:19 UTC 2025

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

Log Message:
ehci(4): only sync isochronous DMA in the necessary direction


To generate a diff of this commit:
cvs rdiff -u -r1.329 -r1.330 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.329 src/sys/dev/usb/ehci.c:1.330
--- src/sys/dev/usb/ehci.c:1.329	Fri Oct  4 10:25:51 2024
+++ src/sys/dev/usb/ehci.c	Sun Feb 16 18:21:19 2025
@@ -1,4 +1,4 @@
-/*	$NetBSD: ehci.c,v 1.329 2024/10/04 10:25:51 skrll Exp $ */
+/*	$NetBSD: ehci.c,v 1.330 2025/02/16 18:21:19 jakllsch Exp $ */
 
 /*
  * Copyright (c) 2004-2012,2016,2020 The NetBSD Foundation, Inc.
@@ -54,7 +54,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ehci.c,v 1.329 2024/10/04 10:25:51 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ehci.c,v 1.330 2025/02/16 18:21:19 jakllsch Exp $");
 
 #include "ohci.h"
 #include "uhci.h"
@@ -4397,6 +4397,7 @@ Static usbd_status
 ehci_device_fs_isoc_transfer(struct usbd_xfer *xfer)
 {
 	ehci_softc_t *sc = EHCI_XFER2SC(xfer);
+	const bool isread = usbd_xfer_isread(xfer);
 	struct ehci_pipe *epipe = EHCI_XFER2EPIPE(xfer);
 	struct usbd_device *dev = xfer->ux_pipe->up_dev;
 	struct ehci_xfer *exfer = EHCI_XFER2EXFER(xfer);
@@ -4540,7 +4541,7 @@ ehci_device_fs_isoc_transfer(struct usbd
 
 	if (xfer->ux_length)
 		usb_syncmem(&exfer->ex_xfer.ux_dmabuf, 0, xfer->ux_length,
-		    BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
+		    isread ? BUS_DMASYNC_PREREAD : BUS_DMASYNC_PREWRITE);
 
 	/*
 	 * Part 2: Transfer descriptors have now been set up, now they must
@@ -4638,6 +4639,7 @@ ehci_device_fs_isoc_done(struct usbd_xfe
 	struct ehci_xfer *exfer = EHCI_XFER2EXFER(xfer);
 	ehci_softc_t *sc = EHCI_XFER2SC(xfer);
 	struct ehci_pipe *epipe = EHCI_XFER2EPIPE(xfer);
+	const bool isread = usbd_xfer_isread(xfer);
 
 	KASSERT(mutex_owned(&sc->sc_lock));
 
@@ -4646,7 +4648,7 @@ ehci_device_fs_isoc_done(struct usbd_xfe
 
 	if (xfer->ux_length)
 		usb_syncmem(&xfer->ux_dmabuf, 0, xfer->ux_length,
-		    BUS_DMASYNC_POSTWRITE | BUS_DMASYNC_POSTREAD);
+		    isread ? BUS_DMASYNC_POSTREAD : BUS_DMASYNC_POSTWRITE);
 }
 
 /* -------------------------------------------------------------------------- */
@@ -4761,6 +4763,7 @@ Static usbd_status
 ehci_device_isoc_transfer(struct usbd_xfer *xfer)
 {
 	ehci_softc_t *sc = EHCI_XFER2SC(xfer);
+	const bool isread = usbd_xfer_isread(xfer);
 	struct ehci_pipe *epipe = EHCI_XFER2EPIPE(xfer);
 	struct ehci_xfer *exfer = EHCI_XFER2EXFER(xfer);
 	ehci_soft_itd_t *itd, *prev;
@@ -4917,7 +4920,7 @@ ehci_device_isoc_transfer(struct usbd_xf
 
 	if (xfer->ux_length)
 		usb_syncmem(&exfer->ex_xfer.ux_dmabuf, 0, xfer->ux_length,
-		    BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
+		    isread ? BUS_DMASYNC_PREREAD : BUS_DMASYNC_PREWRITE);
 
 	/*
 	 * Part 2: Transfer descriptors have now been set up, now they must
@@ -5020,6 +5023,7 @@ ehci_device_isoc_done(struct usbd_xfer *
 	struct ehci_xfer *exfer = EHCI_XFER2EXFER(xfer);
 	ehci_softc_t *sc = EHCI_XFER2SC(xfer);
 	struct ehci_pipe *epipe = EHCI_XFER2EPIPE(xfer);
+	const bool isread = usbd_xfer_isread(xfer);
 
 	KASSERT(mutex_owned(&sc->sc_lock));
 
@@ -5027,5 +5031,5 @@ ehci_device_isoc_done(struct usbd_xfer *
 	ehci_remove_itd_chain(sc, exfer->ex_sitdstart);
 	if (xfer->ux_length)
 		usb_syncmem(&xfer->ux_dmabuf, 0, xfer->ux_length,
-		    BUS_DMASYNC_POSTWRITE | BUS_DMASYNC_POSTREAD);
+		    isread ? BUS_DMASYNC_POSTREAD : BUS_DMASYNC_POSTWRITE);
 }

Reply via email to