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>