PERFORCE change 130963 for review

Hans Petter Selasky hselasky at FreeBSD.org
Sat Dec 15 09:37:46 PST 2007


http://perforce.freebsd.org/chv.cgi?CH=130963

Change 130963 by hselasky at 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);


More information about the p4-projects mailing list