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