diff options
author | n_hibma <n_hibma@FreeBSD.org> | 2000-02-10 18:50:19 +0000 |
---|---|---|
committer | n_hibma <n_hibma@FreeBSD.org> | 2000-02-10 18:50:19 +0000 |
commit | e8b624173afd0d3abbffcee785b504b298ae4b4b (patch) | |
tree | f52d0cdd18364528cfc25ca3ccdb2c2656d5aff8 /sys/dev/usb/usbdi.c | |
parent | ca6bc8a505ef28bf23c51720be7efccdec424c56 (diff) | |
download | FreeBSD-src-e8b624173afd0d3abbffcee785b504b298ae4b4b.zip FreeBSD-src-e8b624173afd0d3abbffcee785b504b298ae4b4b.tar.gz |
Correctly handle the conversion from virtual to physical addresses. The
problem was basically (for offset > 4096):
vtophys(addr) + offset != vtophys(addr + offset)
Also, use TD's with a maximum size of 4k instead of 8kb for OHCI
controllers.
This problem occurs in drivers that use large transfer sizes:
umass, host2host and ethernet with jumbo frames.
Diffstat (limited to 'sys/dev/usb/usbdi.c')
-rw-r--r-- | sys/dev/usb/usbdi.c | 8 |
1 files changed, 4 insertions, 4 deletions
diff --git a/sys/dev/usb/usbdi.c b/sys/dev/usb/usbdi.c index 23063df..2949b23 100644 --- a/sys/dev/usb/usbdi.c +++ b/sys/dev/usb/usbdi.c @@ -282,7 +282,7 @@ usbd_transfer(xfer) /* Copy data if going out. */ if (!(xfer->flags & USBD_NO_COPY) && size != 0 && !usbd_xfer_isread(xfer)) - memcpy(KERNADDR(dmap), xfer->buffer, size); + memcpy(KERNADDR(dmap, 0), xfer->buffer, size); err = pipe->methods->transfer(xfer); @@ -348,7 +348,7 @@ usbd_alloc_buffer(xfer, size) if (err) return (0); xfer->rqflags |= URQ_DEV_DMABUF; - return (KERNADDR(&xfer->dmabuf)); + return (KERNADDR(&xfer->dmabuf, 0)); } void @@ -371,7 +371,7 @@ usbd_get_buffer(xfer) { if (!(xfer->rqflags & URQ_DEV_DMABUF)) return (0); - return (KERNADDR(&xfer->dmabuf)); + return (KERNADDR(&xfer->dmabuf, 0)); } usbd_xfer_handle @@ -800,7 +800,7 @@ usb_transfer_complete(xfer) xfer->actlen = xfer->length; } #endif - memcpy(xfer->buffer, KERNADDR(dmap), xfer->actlen); + memcpy(xfer->buffer, KERNADDR(dmap, 0), xfer->actlen); } /* if we allocated the buffer in usbd_transfer() we free it here. */ |