aboutsummaryrefslogtreecommitdiff
path: root/sys/dev
diff options
context:
space:
mode:
authorSam Leffler <sam@FreeBSD.org>2008-03-20 16:19:25 +0000
committerSam Leffler <sam@FreeBSD.org>2008-03-20 16:19:25 +0000
commit43b1161d4d865e4cab9848ac3617bc84da4194d8 (patch)
tree52505d59404b1e19473df0d19c16200000764b76 /sys/dev
parent91a35e787094b1aca363bfd0ec8380d9a38ada53 (diff)
Notes
Diffstat (limited to 'sys/dev')
-rw-r--r--sys/dev/usb/ehci.c16
-rw-r--r--sys/dev/usb/ohci.c16
2 files changed, 32 insertions, 0 deletions
diff --git a/sys/dev/usb/ehci.c b/sys/dev/usb/ehci.c
index 661642f080ca..2cd5bc5c5340 100644
--- a/sys/dev/usb/ehci.c
+++ b/sys/dev/usb/ehci.c
@@ -653,6 +653,20 @@ ehci_pcd_enable(void *v_sc)
ehci_pcd_able(sc, 1);
}
+/*
+ * XXX write back xfer data for architectures with a write-back
+ * data cache; this is a hack because usb is mis-architected
+ * in blindly mixing bus_dma w/ PIO.
+ */
+static __inline void
+hacksync(usbd_xfer_handle xfer)
+{
+ usbd_pipe_handle pipe = xfer->pipe;
+ bus_dma_tag_t tag = pipe->device->bus->buffer_dmatag;
+ struct usb_dma_mapping *dmap = &xfer->dmamap;
+ bus_dmamap_sync(tag, dmap->map, BUS_DMASYNC_PREWRITE);
+}
+
void
ehci_pcd(ehci_softc_t *sc, usbd_xfer_handle xfer)
{
@@ -679,6 +693,7 @@ ehci_pcd(ehci_softc_t *sc, usbd_xfer_handle xfer)
xfer->actlen = xfer->length;
xfer->status = USBD_NORMAL_COMPLETION;
+ hacksync(xfer); /* XXX to compensate for usb_transfer_complete */
usb_transfer_complete(xfer);
}
@@ -2072,6 +2087,7 @@ ehci_root_ctrl_start(usbd_xfer_handle xfer)
ret:
xfer->status = err;
s = splusb();
+ hacksync(xfer); /* XXX to compensate for usb_transfer_complete */
usb_transfer_complete(xfer);
splx(s);
return (USBD_IN_PROGRESS);
diff --git a/sys/dev/usb/ohci.c b/sys/dev/usb/ohci.c
index 736bdf812311..3b953025f910 100644
--- a/sys/dev/usb/ohci.c
+++ b/sys/dev/usb/ohci.c
@@ -1560,6 +1560,20 @@ ohci_device_bulk_done(usbd_xfer_handle xfer)
xfer->hcpriv = NULL;
}
+/*
+ * XXX write back xfer data for architectures with a write-back
+ * data cache; this is a hack because usb is mis-architected
+ * in blindly mixing bus_dma w/ PIO.
+ */
+static __inline void
+hacksync(usbd_xfer_handle xfer)
+{
+ usbd_pipe_handle pipe = xfer->pipe;
+ bus_dma_tag_t tag = pipe->device->bus->buffer_dmatag;
+ struct usb_dma_mapping *dmap = &xfer->dmamap;
+ bus_dmamap_sync(tag, dmap->map, BUS_DMASYNC_PREWRITE);
+}
+
void
ohci_rhsc(ohci_softc_t *sc, usbd_xfer_handle xfer)
{
@@ -1591,6 +1605,7 @@ ohci_rhsc(ohci_softc_t *sc, usbd_xfer_handle xfer)
xfer->actlen = xfer->length;
xfer->status = USBD_NORMAL_COMPLETION;
+ hacksync(xfer); /* XXX to compensate for usb_transfer_complete */
usb_transfer_complete(xfer);
}
@@ -2722,6 +2737,7 @@ ohci_root_ctrl_start(usbd_xfer_handle xfer)
ret:
xfer->status = err;
s = splusb();
+ hacksync(xfer); /* XXX to compensate for usb_transfer_complete */
usb_transfer_complete(xfer);
splx(s);
return (USBD_IN_PROGRESS);