From owner-p4-projects@FreeBSD.ORG Sat Dec 15 17:37:46 2007 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id DA23616A419; Sat, 15 Dec 2007 17:37:45 +0000 (UTC) Delivered-To: perforce@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id A034016A418 for ; Sat, 15 Dec 2007 17:37:45 +0000 (UTC) (envelope-from hselasky@FreeBSD.org) Received: from repoman.freebsd.org (repoman.freebsd.org [IPv6:2001:4f8:fff6::29]) by mx1.freebsd.org (Postfix) with ESMTP id 89A8713C457 for ; Sat, 15 Dec 2007 17:37:45 +0000 (UTC) (envelope-from hselasky@FreeBSD.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.14.1/8.14.1) with ESMTP id lBFHbjOj084848 for ; Sat, 15 Dec 2007 17:37:45 GMT (envelope-from hselasky@FreeBSD.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.1/8.14.1/Submit) id lBFHbjan084845 for perforce@freebsd.org; Sat, 15 Dec 2007 17:37:45 GMT (envelope-from hselasky@FreeBSD.org) Date: Sat, 15 Dec 2007 17:37:45 GMT Message-Id: <200712151737.lBFHbjan084845@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to hselasky@FreeBSD.org using -f From: Hans Petter Selasky To: Perforce Change Reviews Cc: Subject: PERFORCE change 130963 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 15 Dec 2007 17:37:46 -0000 http://perforce.freebsd.org/chv.cgi?CH=130963 Change 130963 by hselasky@hselasky_laptop001 on 2007/12/15 17:37:43 Reintroduce support for non-kernel virtual memory after advice from Julian Elischer. Affected files ... .. //depot/projects/usb/src/sys/dev/usb/usb_subr.c#71 edit .. //depot/projects/usb/src/sys/dev/usb/usb_subr.h#76 edit Differences ... ==== //depot/projects/usb/src/sys/dev/usb/usb_subr.c#71 (text+ko) ==== @@ -1968,22 +1968,19 @@ { struct usbd_page *page; - res->buffer = USBD_ADD_BYTES(pc->buffer, offset); + if (pc->page_start) { + + /* Case 1 - something has been loaded into DMA */ - offset += pc->page_offset_buf; + if (pc->buffer) { - /* range check */ + /* Case 1a - Kernel Virtual Address */ - if ((offset >= pc->page_offset_end) || - (offset < pc->page_offset_buf)) { + res->buffer = USBD_ADD_BYTES(pc->buffer, offset); + } - /* we've reached the end */ + offset += pc->page_offset_buf; - res->length = 0; - res->buffer = NULL; - res->physaddr = 0; - return; - } /* compute destination page */ page = pc->page_start; @@ -1994,20 +1991,24 @@ res->length = USB_PAGE_SIZE - offset; res->physaddr = page->physaddr + offset; + if (!pc->buffer) { + /* Case 1b - Non Kernel Virtual Address */ + + res->buffer = USBD_ADD_BYTES(page->buffer, offset); + } + } else { + + /* Case 2 - Plain PIO */ + + res->buffer = USBD_ADD_BYTES(pc->buffer, offset); + res->length = 0-1; + res->physaddr = 0; + } return; } /*------------------------------------------------------------------------* - * usbd_get_buffer - *------------------------------------------------------------------------*/ -void * -usbd_get_buffer(struct usbd_page_cache *pc, uint32_t offset) -{ - return (USBD_ADD_BYTES(pc->buffer, offset)); -} - -/*------------------------------------------------------------------------* * usbd_copy_in - copy directly to DMA-able memory *------------------------------------------------------------------------*/ void ==== //depot/projects/usb/src/sys/dev/usb/usb_subr.h#76 (text+ko) ==== @@ -219,6 +219,7 @@ struct usbd_page { bus_size_t physaddr; + void *buffer; /* non Kernel Virtual Address */ }; struct usbd_page_search { @@ -798,7 +799,6 @@ void usbd_set_desc(device_t dev, struct usbd_device *udev); void *usbd_alloc_mbufs(struct malloc_type *type, struct usbd_ifqueue *ifq, uint32_t block_size, uint16_t block_number); void usbd_get_page(struct usbd_page_cache *cache, uint32_t offset, struct usbd_page_search *res); -void *usbd_get_buffer(struct usbd_page_cache *pc, uint32_t offset); void usbd_copy_in(struct usbd_page_cache *cache, uint32_t offset, const void *ptr, uint32_t len); void usbd_m_copy_in(struct usbd_page_cache *cache, uint32_t dst_offset, struct mbuf *m, uint32_t src_offset, uint32_t src_len); int usbd_uiomove(struct usbd_page_cache *pc, struct uio *uio, uint32_t pc_offset, uint32_t len);