Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 9 Dec 2007 12:32:15 GMT
From:      Hans Petter Selasky <hselasky@FreeBSD.org>
To:        Perforce Change Reviews <perforce@FreeBSD.org>
Subject:   PERFORCE change 130543 for review
Message-ID:  <200712091232.lB9CWFMH090524@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=130543

Change 130543 by hselasky@hselasky_laptop001 on 2007/12/09 12:31:44

	
	Add information to the USB transfer structure about
	what context the callback is called from. This can
	be used to make smart decisions about whether to
	hand certain commands over to another thread or not.

Affected files ...

.. //depot/projects/usb/src/sys/dev/usb/usb_subr.h#72 edit
.. //depot/projects/usb/src/sys/dev/usb/usb_transfer.c#67 edit

Differences ...

==== //depot/projects/usb/src/sys/dev/usb/usb_subr.h#72 (text+ko) ====

@@ -136,6 +136,15 @@
 	USBD_STD_ROOT_TR_PRE_CALLBACK,
 };
 
+/* USB contexts */
+
+enum {
+	USBD_CONTEXT_UNDEFINED,
+	USBD_CONTEXT_START,
+	USBD_CONTEXT_STOP,
+	USBD_CONTEXT_CALLBACK,
+};
+
 struct usbd_temp_setup {
 	void   *buf;
 	uint32_t size;
@@ -433,6 +442,7 @@
 					 * operation */
 	uint8_t	isochronous_xfr:1;	/* set if isochronous transfer */
 	uint8_t	usb_mode:1;		/* shadow copy of "udev->usb_mode" */
+	uint8_t	context:2;		/* see USBD_CONTEXT_XXX */
 };
 
 struct usbd_config {
@@ -810,7 +820,6 @@
 void	usbd_transfer_drain(struct usbd_xfer *xfer);
 void	usbd_set_frame_data(struct usbd_xfer *xfer, void *ptr, uint32_t frindex);
 void	usbd_set_frame_offset(struct usbd_xfer *xfer, uint32_t offset, uint32_t frindex);
-void	usbd_callback_wrapper(struct usbd_xfer *xfer);
 void	usbd_do_callback(struct usbd_xfer **pp_xfer, struct thread *td);
 void	usbd_transfer_enqueue(struct usbd_xfer *xfer);
 void	usbd_transfer_dequeue(struct usbd_xfer *xfer, usbd_status_t error);

==== //depot/projects/usb/src/sys/dev/usb/usb_transfer.c#67 (text+ko) ====

@@ -59,6 +59,7 @@
 static void usbd_delayed_transfer_start(void *arg);
 static void usbd_bdma_work_loop(struct usbd_memory_info *info);
 static void usbd_bdma_cancel_event(struct usbd_xfer *xfer);
+static void usbd_callback_wrapper(struct usbd_xfer *xfer, uint8_t context);
 
 #ifdef USB_DEBUG
 void
@@ -1391,7 +1392,7 @@
 	mtx_lock(xfer->usb_mtx);
 	usbd_transfer_dequeue(xfer, error);
 	mtx_unlock(xfer->usb_mtx);
-	usbd_callback_wrapper(xfer);
+	usbd_callback_wrapper(xfer, USBD_CONTEXT_CALLBACK);
 	return;
 }
 
@@ -1830,7 +1831,7 @@
 		return;
 	}
 	/* call callback */
-	usbd_callback_wrapper(xfer);
+	usbd_callback_wrapper(xfer, USBD_CONTEXT_START);
 
 	/*
 	 * wait for completion if polling is selected
@@ -1915,7 +1916,7 @@
 		 * call callback, which will clear
 		 * "flags_int.transferring"
 		 */
-		usbd_callback_wrapper(xfer);
+		usbd_callback_wrapper(xfer, USBD_CONTEXT_STOP);
 	}
 	return;
 }
@@ -2008,8 +2009,8 @@
  * This is a wrapper for USB callbacks, which handles
  * recursation, which can happen during boot.
  *------------------------------------------------------------------------*/
-void
-usbd_callback_wrapper(struct usbd_xfer *xfer)
+static void
+usbd_callback_wrapper(struct usbd_xfer *xfer, uint8_t context)
 {
 	mtx_assert(xfer->priv_mtx, MA_OWNED);
 
@@ -2020,6 +2021,9 @@
 			xfer->flags_int.recursed_1 = 1;
 			xfer->flags_int.recursed_2 = 1;
 
+			/* set which context we are in */
+			xfer->flags_int.context = context;
+
 			/* set correct USB state for callback */
 			if (!xfer->flags_int.transferring) {
 				xfer->usb_state = USBD_ST_SETUP;
@@ -2083,7 +2087,7 @@
 
 		if (tmp) {
 			/* call callback */
-			usbd_callback_wrapper(xfer);
+			usbd_callback_wrapper(xfer, USBD_CONTEXT_CALLBACK);
 		}
 		/*
 		 * else already called back !



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200712091232.lB9CWFMH090524>