PERFORCE change 130965 for review
Hans Petter Selasky
hselasky at FreeBSD.org
Sat Dec 15 10:05:15 PST 2007
http://perforce.freebsd.org/chv.cgi?CH=130965
Change 130965 by hselasky at hselasky_laptop001 on 2007/12/15 18:04:21
Revert parts of change 130054 to "usb_subr.c". We now support
non-kernel virtual addresses again.
NOTE: usbd_copy_in, usbd_copy_out, usbd_uiomove, usbd_bzero
"struct usbd_page_cache" and "struct usbd_page" are
very generic and should be factored out one day using
some kind of system provided function and structures.
Affected files ...
.. //depot/projects/usb/src/sys/dev/usb/usb_subr.c#73 edit
Differences ...
==== //depot/projects/usb/src/sys/dev/usb/usb_subr.c#73 (text+ko) ====
@@ -2014,10 +2014,21 @@
usbd_copy_in(struct usbd_page_cache *cache, uint32_t offset,
const void *ptr, uint32_t len)
{
- void *dst;
+ struct usbd_page_search buf_res;
+
+ while (len != 0) {
+
+ usbd_get_page(cache, offset, &buf_res);
+
+ if (buf_res.length > len) {
+ buf_res.length = len;
+ }
+ bcopy(ptr, buf_res.buffer, buf_res.length);
- dst = USBD_ADD_BYTES(cache->buffer, offset);
- bcopy(ptr, dst, len);
+ offset += buf_res.length;
+ len -= buf_res.length;
+ ptr = USBD_ADD_BYTES(ptr, buf_res.length);
+ }
return;
}
@@ -2061,10 +2072,29 @@
usbd_uiomove(struct usbd_page_cache *pc, struct uio *uio,
uint32_t pc_offset, uint32_t len)
{
- void *ptr;
+ struct usbd_page_search res;
+ int error = 0;
+
+ while (len != 0) {
+
+ usbd_get_page(pc, pc_offset, &res);
+
+ if (res.length > len) {
+ res.length = len;
+ }
+ /*
+ * "uiomove()" can sleep so one needs to make a wrapper,
+ * exiting the mutex and checking things
+ */
+ error = uiomove(res.buffer, res.length, uio);
- ptr = USBD_ADD_BYTES(pc->buffer, pc_offset);
- return (uiomove(ptr, len, uio));
+ if (error) {
+ break;
+ }
+ pc_offset += res.length;
+ len -= res.length;
+ }
+ return (error);
}
/*------------------------------------------------------------------------*
@@ -2074,10 +2104,21 @@
usbd_copy_out(struct usbd_page_cache *cache, uint32_t offset,
void *ptr, uint32_t len)
{
- void *src;
+ struct usbd_page_search res;
+
+ while (len != 0) {
+
+ usbd_get_page(cache, offset, &res);
+
+ if (res.length > len) {
+ res.length = len;
+ }
+ bcopy(res.buffer, ptr, res.length);
- src = USBD_ADD_BYTES(cache->buffer, offset);
- bcopy(src, ptr, len);
+ offset += res.length;
+ len -= res.length;
+ ptr = USBD_ADD_BYTES(ptr, res.length);
+ }
return;
}
@@ -2087,10 +2128,20 @@
void
usbd_bzero(struct usbd_page_cache *cache, uint32_t offset, uint32_t len)
{
- void *ptr;
+ struct usbd_page_search res;
+
+ while (len != 0) {
+
+ usbd_get_page(cache, offset, &res);
+
+ if (res.length > len) {
+ res.length = len;
+ }
+ bzero(res.buffer, res.length);
- ptr = USBD_ADD_BYTES(cache->buffer, offset);
- bzero(ptr, len);
+ offset += res.length;
+ len -= res.length;
+ }
return;
}
More information about the p4-projects
mailing list