PERFORCE change 152597 for review

Hans Petter Selasky hselasky at FreeBSD.org
Thu Nov 6 15:02:43 PST 2008


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

Change 152597 by hselasky at hselasky_laptop001 on 2008/11/06 23:02:19

	
	Sometimes it is convenient to process data at the
	expense of a userland process instead of a kernel
	process or thread. Add support for data filters.

Affected files ...

.. //depot/projects/usb/src/sys/dev/usb2/core/usb2_dev.c#39 edit
.. //depot/projects/usb/src/sys/dev/usb2/core/usb2_dev.h#14 edit

Differences ...

==== //depot/projects/usb/src/sys/dev/usb2/core/usb2_dev.c#39 (text+ko) ====

@@ -1777,9 +1777,16 @@
 				break;
 			}
 			continue;
-		} else {
-			tr_data = 1;
+		}
+		if (f->methods->f_filter_read) {
+			/*
+			 * Sometimes it is convenient to process data at the
+			 * expense of a userland process instead of a kernel
+			 * process.
+			 */
+			(f->methods->f_filter_read) (f, m);
 		}
+		tr_data = 1;
 
 		io_len = MIN(m->cur_data_len, uio->uio_resid);
 
@@ -1914,9 +1921,8 @@
 				break;
 			}
 			continue;
-		} else {
-			tr_data = 1;
 		}
+		tr_data = 1;
 
 		USB_MBUF_RESET(m);
 
@@ -1933,10 +1939,19 @@
 		if (err) {
 			USB_IF_ENQUEUE(&f->free_q, m);
 			break;
-		} else {
-			USB_IF_ENQUEUE(&f->used_q, m);
-			(f->methods->f_start_write) (f);
+		}
+		if (f->methods->f_filter_write) {
+			/*
+			 * Sometimes it is convenient to process data at the
+			 * expense of a userland process instead of a kernel
+			 * process.
+			 */
+			(f->methods->f_filter_write) (f, m);
 		}
+		USB_IF_ENQUEUE(&f->used_q, m);
+
+		(f->methods->f_start_write) (f);
+
 	} while (uio->uio_resid > 0);
 done:
 	mtx_unlock(f->priv_mtx);
@@ -2561,33 +2576,18 @@
 {
 	struct usb2_mbuf *m;
 
-	USB_IF_DEQUEUE(&f->used_q, m);
+	USB_IF_POLL(&f->used_q, m);
 
 	if (m) {
 		*plen = m->cur_data_len;
 		*pptr = m->cur_data_ptr;
 
-		USB_IF_PREPEND(&f->used_q, m);
 		return (1);
 	}
 	return (0);
 }
 
 void
-usb2_fifo_get_data_next(struct usb2_fifo *f)
-{
-	struct usb2_mbuf *m;
-
-	USB_IF_DEQUEUE(&f->used_q, m);
-
-	if (m) {
-		USB_IF_ENQUEUE(&f->free_q, m);
-		usb2_fifo_wakeup(f);
-	}
-	return;
-}
-
-void
 usb2_fifo_get_data_error(struct usb2_fifo *f)
 {
 	f->flag_iserror = 1;

==== //depot/projects/usb/src/sys/dev/usb2/core/usb2_dev.h#14 (text+ko) ====

@@ -39,11 +39,13 @@
 #define	USB_FIFO_RX 1
 
 struct usb2_fifo;
+struct usb2_mbuf;
 
 typedef int (usb2_fifo_open_t)(struct usb2_fifo *fifo, int fflags, struct thread *td);
 typedef void (usb2_fifo_close_t)(struct usb2_fifo *fifo, int fflags, struct thread *td);
 typedef int (usb2_fifo_ioctl_t)(struct usb2_fifo *fifo, u_long cmd, void *addr, int fflags, struct thread *td);
 typedef void (usb2_fifo_cmd_t)(struct usb2_fifo *fifo);
+typedef void (usb2_fifo_filter_t)(struct usb2_fifo *fifo, struct usb2_mbuf *m);
 
 struct usb2_symlink {
 	TAILQ_ENTRY(usb2_symlink) sym_entry;
@@ -57,8 +59,8 @@
 
 /*
  * Locking note for the following functions.  All the
- * "usb2_fifo_cmd_t" functions are called locked. The others are
- * called unlocked.
+ * "usb2_fifo_cmd_t" and "usb2_fifo_filter_t" functions are called
+ * locked. The others are called unlocked.
  */
 struct usb2_fifo_methods {
 	usb2_fifo_open_t *f_open;
@@ -68,6 +70,8 @@
 	usb2_fifo_cmd_t *f_stop_read;
 	usb2_fifo_cmd_t *f_start_write;
 	usb2_fifo_cmd_t *f_stop_write;
+	usb2_fifo_filter_t *f_filter_read;
+	usb2_fifo_filter_t *f_filter_write;
 	const char *basename[4];
 	const char *postfix[4];
 };
@@ -134,7 +138,6 @@
 uint8_t	usb2_fifo_get_data(struct usb2_fifo *fifo, struct usb2_page_cache *pc, uint32_t offset, uint32_t len, uint32_t *actlen, uint8_t what);
 uint8_t	usb2_fifo_get_data_linear(struct usb2_fifo *fifo, void *ptr, uint32_t len, uint32_t *actlen, uint8_t what);
 uint8_t	usb2_fifo_get_data_buffer(struct usb2_fifo *f, void **pptr, uint32_t *plen);
-void	usb2_fifo_get_data_next(struct usb2_fifo *f);
 void	usb2_fifo_get_data_error(struct usb2_fifo *fifo);
 uint8_t	usb2_fifo_opened(struct usb2_fifo *fifo);
 void	usb2_fifo_free(struct usb2_fifo *f);


More information about the p4-projects mailing list