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);
}