#
# CDDL HEADER START
#
# The contents of this file are subject to the terms of the
# Common Development and Distribution License (the "License").
# You may not use this file except in compliance with the License.
#
# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
# or http://www.opensolaris.org/os/licensing.
# See the License for the specific language governing permissions
# and limitations under the License.
#
# When distributing Covered Code, include this CDDL HEADER in each
# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
# If applicable, add the following below this CDDL HEADER, with the
# fields enclosed by brackets "[]" replaced with your own identifying
# information: Portions Copyright [yyyy] [name of copyright owner]
#
# CDDL HEADER END
#
/*
 * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
 * Use is subject to license terms.
 */


				USBA PIPE STATE TRANSITIONS INFORMATION
				---------------------------------------

1. Control pipe state transitions:-

   o Default control pipe (endpoint number 0):

     NOTE:- Queuing of control requests are allowed at USBA level.

     Calls			Current state		additional condition		Action			Next state
     -----			-------------		--------------------		------			-----------
     usb_pipe_open		USB_PIPE_STATE_CLOSED	-				Initialize pipe		USB_PIPE_STATE_IDLE

     usb_pipe_ctrl_xfer		USB_PIPE_STATE_IDLE	No outstanding request		send req to hcd		USB_PIPE_STATE_ACTIVE
   							Outstanding reqs pending	queue the requests	USB_PIPE_STATE_IDLE
 											(cb() will send
 											next reqs to hcd)
   
 				USB_PIPE_STATE_ACTIVE	-				queue the requests	USB_PIPE_STATE_ACTIVE
 											(cb() will send
 											next reqs to hcd)

 				USB_PIPE_STATE_ERROR	-				queue the requests	USB_PIPE_STATE_ERROR
 											(cb() will send
 											next reqs to hcd)
 											 										
 				USB_PIPE_STATE_CLOSING	-				return failure		USB_PIPE_STATE_CLOSING
 			
 			
     usba_hcdi_cb		USB_PIPE_STATE_ACTIVE	-				Before doing callback	USB_PIPE_STATE_IDLE
     (Normal callback)					No outstanding request		-			USB_PIPE_STATE_IDLE
  							Outstanding reqs pending	Send next req to hcd	USB_PIPE_STATE_ACTIVE

			
 				USB_PIPE_STATE_ERROR	-				Don't send any more req	USB_PIPE_STATE_ERROR
 				
 				USB_PIPE_STATE_CLOSING	-				Don't send any more req	USB_PIPE_STATE_CLOSING
 
 			
     usba_hcdi_cb
     (exceptional callback)	USB_PIPE_STATE_ACTIVE	-				Before auto clear	USB_PIPE_STATE_ERROR
							-				On auto clear		USB_PIPE_STATE_IDLE
											(Don't remove
											outstanding requests)
							No outstanding request		-			USB_PIPE_STATE_IDLE
							Outstanding reqs pending	Send next req to hcd	USB_PIPE_STATE_ACTIVE
							
     usb_pipe_reset		USB_PIPE_STATE_XXXX	-				Return failure		USB_PIPE_STATE_XXXX
  											(Not allowed)
  
			
     usb_pipe_close		USB_PIPE_STATE_IDLE	-				-			USB_PIPE_STATE_CLOSING
				USB_PIPE_STATE_ACTIVE
				USB_PIPE_STATE_ERROR
							Once pipe is closed		-			USB_PIPE_STATE_CLOSED


   o Normal control pipe (endpoint number > 0):

     NOTE:- Queuing of control requests are allowed at USBA level.

     Calls			Current state		additional condition		Action			Next state
     -----			-------------		--------------------		------			-----------
     usb_pipe_open		USB_PIPE_STATE_CLOSED	-				Initialize pipe		USB_PIPE_STATE_IDLE

     usb_pipe_ctrl_xfer		USB_PIPE_STATE_IDLE	No outstanding request		send req to hcd		USB_PIPE_STATE_ACTIVE
   							Outstanding reqs pending	queue the requests	USB_PIPE_STATE_IDLE
 											(cb() will send
 											next reqs to hcd)
   
 				USB_PIPE_STATE_ACTIVE	-				queue the requests	USB_PIPE_STATE_ACTIVE
 											(cb() will send
 											next reqs to hcd)

 				USB_PIPE_STATE_ERROR	-				return failure		USB_PIPE_STATE_ERROR
 											 										
 				USB_PIPE_STATE_CLOSING	-				return failure		USB_PIPE_STATE_CLOSING
 			
 			
     usba_hcdi_cb		USB_PIPE_STATE_ACTIVE	-				Before doing callback	USB_PIPE_STATE_IDLE
     (Normal callback)					No outstanding request		-			USB_PIPE_STATE_IDLE
  							Outstanding reqs pending	Send next req to hcd	USB_PIPE_STATE_ACTIVE

			
 				USB_PIPE_STATE_ERROR	-				Don't send any more req	USB_PIPE_STATE_ERROR
 				USB_PIPE_STATE_CLOSING
 
 			
     usba_hcdi_cb
     (exceptional callback)	USB_PIPE_STATE_ACTIVE	-				Before auto clear	USB_PIPE_STATE_ERROR
							-				On auto clear		USB_PIPE_STATE_IDLE
											(Remove all outstanding
											requests)
							
     usb_pipe_reset		USB_PIPE_STATE_XXXX	-				Remove all outstanding	USB_PIPE_STATE_IDLE
  											requests
  
			
     usb_pipe_close		USB_PIPE_STATE_IDLE	-				-			USB_PIPE_STATE_CLOSING
				USB_PIPE_STATE_ACTIVE
				USB_PIPE_STATE_ERROR
							Once pipe is closed		-			USB_PIPE_STATE_CLOSED

2. Bulk pipe state transitions (endpoint number > 1, both IN and OUT):-

   NOTE:- Queuing of bulk requests are allowed at USBA level.

   Calls			Current state		additional condition		Action			Next state
   -----			-------------		--------------------		------			-----------
   usb_pipe_open		USB_PIPE_STATE_CLOSED	-				Initialize pipe		USB_PIPE_STATE_IDLE

   usb_pipe_bulk_xfer		USB_PIPE_STATE_IDLE	No outstanding request		send req to hcd		USB_PIPE_STATE_ACTIVE

   
 				USB_PIPE_STATE_ACTIVE	-				send req to hcd		USB_PIPE_STATE_ACTIVE

 				USB_PIPE_STATE_ERROR	-				return failure		USB_PIPE_STATE_ERROR
 											 										
 				USB_PIPE_STATE_CLOSING	-				return failure		USB_PIPE_STATE_CLOSING
 			
   usba_hcdi_cb			USB_PIPE_STATE_ACTIVE	if no requests are pending	Before doing callback	USB_PIPE_STATE_IDLE
  							else outstanding reqs pending	Before doing callback	USB_PIPE_STATE_ACTIVE

			
 				USB_PIPE_STATE_ERROR	-				-			USB_PIPE_STATE_ERROR
 				USB_PIPE_STATE_CLOSING	-				-			USB_PIPE_STATE_CLOSING
 
 			
   usba_hcdi_cb
   (exceptional callback)	USB_PIPE_STATE_ACTIVE	-				Before auto clear	USB_PIPE_STATE_ERROR
							-				On auto clear		USB_PIPE_STATE_IDLE
											(Remove all outstanding
											requests)
							
   usb_pipe_reset		USB_PIPE_STATE_XXXX	-				Remove all outstanding	USB_PIPE_STATE_IDLE
  											requests
  
			
   usb_pipe_close		USB_PIPE_STATE_IDLE	-				-			USB_PIPE_STATE_CLOSING
				USB_PIPE_STATE_ACTIVE
				USB_PIPE_STATE_ERROR
							Once pipe is closed		-			USB_PIPE_STATE_CLOSED

3. Interrupt pipe state transitions (endpoint number > 1, both IN and OUT) :-

   Interrupt IN:

   Calls			Current state		additional condition		Action			Next state
   -----			-------------		--------------------		------			-----------
   usb_pipe_open		USB_PIPE_STATE_CLOSED	-				Initialize pipe		USB_PIPE_STATE_IDLE

   usb_pipe_intr_xfer		USB_PIPE_STATE_IDLE	-				send req to hcd		USB_PIPE_STATE_ACTIVE

 				USB_PIPE_STATE_ACTIVE	-				return failure		USB_PIPE_STATE_ACTIVE
 				USB_PIPE_STATE_ERROR				
 				USB_PIPE_STATE_CLOSING				
 			
   usba_hcdi_cb			USB_PIPE_STATE_ACTIVE	One time xfer			Before doing callback	USB_PIPE_STATE_IDLE
							USB_CR_STOPPED_POLLING
							USB_CR_PIPE_RESET
										
 				USB_PIPE_STATE_ERROR	-				-			USB_PIPE_STATE_ERROR
 				USB_PIPE_STATE_CLOSING	-				-			USB_PIPE_STATE_CLOSING
 
 			
   usba_hcdi_cb
   (exceptional callback)	USB_PIPE_STATE_ACTIVE	-				Before auto clear	USB_PIPE_STATE_ERROR
							-				On auto clear		USB_PIPE_STATE_IDLE
											(Remove all outstanding
											requests)
							
   usb_pipe_reset		USB_PIPE_STATE_XXXX	-				Remove all outstanding	USB_PIPE_STATE_IDLE
  											requests
  
			
   usb_pipe_close		USB_PIPE_STATE_IDLE	-				-			USB_PIPE_STATE_CLOSING
				USB_PIPE_STATE_ACTIVE
				USB_PIPE_STATE_ERROR
							Once pipe is closed		-			USB_PIPE_STATE_CLOSED

   Interrupt OUT:

   NOTE: Send all interrupt OUT requests to HCD and no queuing at USBA level.

   Calls			Current state		additional condition		Action			Next state
   -----			-------------		--------------------		------			-----------
   usb_pipe_open		USB_PIPE_STATE_CLOSED	-				Initialize pipe		USB_PIPE_STATE_IDLE

   usb_pipe_intr_xfer		USB_PIPE_STATE_IDLE	-				send req to hcd		USB_PIPE_STATE_ACTIVE

   
 				USB_PIPE_STATE_ACTIVE	-				send req to hcd		USB_PIPE_STATE_ACTIVE

 				USB_PIPE_STATE_ERROR	-				return failure		USB_PIPE_STATE_ERROR
 											 										
 				USB_PIPE_STATE_CLOSING	-				return failure		USB_PIPE_STATE_CLOSING
 			
   usba_hcdi_cb			USB_PIPE_STATE_ACTIVE	if no requests are pending	Before doing callback	USB_PIPE_STATE_IDLE
  							else outstanding reqs pending	Before doing callback	USB_PIPE_STATE_ACTIVE

			
 				USB_PIPE_STATE_ERROR	-				-			USB_PIPE_STATE_ERROR
 				USB_PIPE_STATE_CLOSING	-				-			USB_PIPE_STATE_CLOSING
 
 			
   usba_hcdi_cb
   (exceptional callback)	USB_PIPE_STATE_ACTIVE	-				Before auto clear	USB_PIPE_STATE_ERROR
							-				On auto clear		USB_PIPE_STATE_IDLE
											(Remove all outstanding
											requests)
							
   usb_pipe_reset		USB_PIPE_STATE_XXXX	-				Remove all outstanding	USB_PIPE_STATE_IDLE
  											requests
  
			
   usb_pipe_close		USB_PIPE_STATE_IDLE	-				-			USB_PIPE_STATE_CLOSING
				USB_PIPE_STATE_ACTIVE
				USB_PIPE_STATE_ERROR
							Once pipe is closed		-			USB_PIPE_STATE_CLOSED

4. Isochronous pipe state transitions (endpoint number > 1, both IN and OUT):-

   Isochronous IN:

   Calls			Current state		additional condition		Action			Next state
   -----			-------------		--------------------		------			-----------
   usb_pipe_open		USB_PIPE_STATE_CLOSED	-				Initialize pipe		USB_PIPE_STATE_IDLE

   usb_pipe_isoch_xfer		USB_PIPE_STATE_IDLE	-				send req to hcd		USB_PIPE_STATE_ACTIVE

 				USB_PIPE_STATE_ACTIVE	-				return failure		USB_PIPE_STATE_ACTIVE
 				USB_PIPE_STATE_ERROR				
 				USB_PIPE_STATE_CLOSING				
 			
   usba_hcdi_cb			USB_PIPE_STATE_ACTIVE	One time xfer			Before doing callback	USB_PIPE_STATE_IDLE
							USB_CR_STOPPED_POLLING
							USB_CR_PIPE_RESET
										
 				USB_PIPE_STATE_ERROR	-				-			USB_PIPE_STATE_ERROR
 				USB_PIPE_STATE_CLOSING	-				-			USB_PIPE_STATE_CLOSING
 
 			
   usba_hcdi_cb
   (exceptional callback)	USB_PIPE_STATE_ACTIVE	-				Before auto clear	USB_PIPE_STATE_ERROR
							-				On auto clear		USB_PIPE_STATE_IDLE
											(Remove all outstanding
											requests)
							
   usb_pipe_reset		USB_PIPE_STATE_XXXX	-				Remove all outstanding	USB_PIPE_STATE_IDLE
  											requests
  
			
   usb_pipe_close		USB_PIPE_STATE_IDLE	-				-			USB_PIPE_STATE_CLOSING
				USB_PIPE_STATE_ACTIVE
				USB_PIPE_STATE_ERROR
							Once pipe is closed		-			USB_PIPE_STATE_CLOSED

   Isochronous OUT:-

   NOTE: Send all isochronous OUT requests to HCD and no queuing at USBA level.

   Calls			Current state		additional condition		Action			Next state
   -----			-------------		--------------------		------			-----------
   usb_pipe_open		USB_PIPE_STATE_CLOSED	-				Initialize pipe		USB_PIPE_STATE_IDLE

   usb_pipe_intr_xfer		USB_PIPE_STATE_IDLE	-				send req to hcd		USB_PIPE_STATE_ACTIVE

   
 				USB_PIPE_STATE_ACTIVE	-				send req to hcd		USB_PIPE_STATE_ACTIVE

 				USB_PIPE_STATE_ERROR	-				return failure		USB_PIPE_STATE_ERROR
 											 										
 				USB_PIPE_STATE_CLOSING	-				return failure		USB_PIPE_STATE_CLOSING
 			
   usba_hcdi_cb			USB_PIPE_STATE_ACTIVE	if no requests are pending	Before doing callback	USB_PIPE_STATE_IDLE
  							else outstanding reqs pending	Before doing callback	USB_PIPE_STATE_ACTIVE

			
 				USB_PIPE_STATE_ERROR	-				-			USB_PIPE_STATE_ERROR
 				USB_PIPE_STATE_CLOSING	-				-			USB_PIPE_STATE_CLOSING
 
 			
   usba_hcdi_cb
   (exceptional callback)	USB_PIPE_STATE_ACTIVE	-				Before auto clear	USB_PIPE_STATE_ERROR
							-				On auto clear		USB_PIPE_STATE_IDLE
											(Remove all outstanding
											requests)
							
   usb_pipe_reset		USB_PIPE_STATE_XXXX	-				Remove all outstanding	USB_PIPE_STATE_IDLE
  											requests
  
			
   usb_pipe_close		USB_PIPE_STATE_IDLE	-				-			USB_PIPE_STATE_CLOSING
				USB_PIPE_STATE_ACTIVE
				USB_PIPE_STATE_ERROR
							Once pipe is closed		-			USB_PIPE_STATE_CLOSED