From owner-p4-projects@FreeBSD.ORG Sun Dec 9 12:32:17 2007 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id D959616A421; Sun, 9 Dec 2007 12:32:16 +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 3981B16A418 for ; Sun, 9 Dec 2007 12:32:16 +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 2971C13C457 for ; Sun, 9 Dec 2007 12:32:16 +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 lB9CWGdh090530 for ; Sun, 9 Dec 2007 12:32:16 GMT (envelope-from hselasky@FreeBSD.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.1/8.14.1/Submit) id lB9CWFMH090524 for perforce@freebsd.org; Sun, 9 Dec 2007 12:32:15 GMT (envelope-from hselasky@FreeBSD.org) Date: Sun, 9 Dec 2007 12:32:15 GMT Message-Id: <200712091232.lB9CWFMH090524@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 130543 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: Sun, 09 Dec 2007 12:32:17 -0000 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 !