/*******************************************************************************

This software file (the "File") is distributed by Marvell International Ltd. 
or its affiliate(s) under the terms of the GNU General Public License Version 2, 
June 1991 (the "License").  You may use, redistribute and/or modify this File 
in accordance with the terms and conditions of the License, a copy of which 
is available along with the File in the license.txt file or by writing to the 
Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 
or on the worldwide web at http://www.gnu.org/licenses/gpl.txt.

THE FILE IS DISTRIBUTED AS-IS, WITHOUT WARRANTY OF ANY KIND, AND THE IMPLIED 
WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY 
DISCLAIMED.  The GPL License provides additional details about this warranty 
disclaimer.

(C) Copyright 2004 - 2007 Marvell Semiconductor Israel Ltd. All Rights Reserved.
(C) Copyright 1999 - 2004 Chipidea Microelectronica, S.A. All Rights Reserved.

*******************************************************************************/

#include "usb/api/mvUsbDevApi.h"
#include "usb/device/mvUsbDevPrv.h"


/*FUNCTION*-------------------------------------------------------------
*
*  Function Name  : _usb_device_unstall_endpoint
*  Returned Value : USB_OK or error code
*  Comments       :
*     Unstalls the endpoint in specified direction
*
*END*-----------------------------------------------------------------*/
void _usb_device_unstall_endpoint
   (
      /* [IN] the USB_USB_dev_initialize state structure */
      _usb_device_handle         handle,
            
      /* [IN] the Endpoint number */
      uint_8                     ep_num,
            
      /* [IN] direction */
      uint_8                     direction
   )
{ /* Body */
   USB_DEV_STATE_STRUCT_PTR   	usb_dev_ptr;
   int							lockKey;
   
   usb_dev_ptr = (USB_DEV_STATE_STRUCT_PTR)handle;
 
   lockKey = USB_lock();
   
   _usb_dci_vusb20_unstall_endpoint(handle, ep_num, direction);

   USB_unlock(lockKey);
  
} /* EndBody */

/*FUNCTION*----------------------------------------------------------------
* 
* Function Name  : _usb_device_get_status
* Returned Value : USB_OK or error code
* Comments       :
*     Provides API to access the USB internal state.
* 
*END*--------------------------------------------------------------------*/
uint_8 _usb_device_get_status
   (
      /* [IN] Handle to the USB device */
      _usb_device_handle   handle,
      
      /* [IN] What to get the status of */
      uint_8               component,
      
      /* [OUT] The requested status */
      uint_16_ptr          status
   )
{ /* Body */
   	USB_DEV_STATE_STRUCT_PTR 	usb_dev_ptr;
	int							lockKey;

   usb_dev_ptr = (USB_DEV_STATE_STRUCT_PTR)handle;
  
   lockKey = USB_lock();

   switch (component) 
   {
      case ARC_USB_STATUS_DEVICE_STATE:
         *status = usb_dev_ptr->USB_STATE;
         break;

      case ARC_USB_STATUS_DEVICE:
         *status = usb_dev_ptr->USB_DEVICE_STATE;
         break;

      case ARC_USB_STATUS_INTERFACE:
          *status = 0;
         break;
         
      case ARC_USB_STATUS_ADDRESS:
         *status = usb_dev_ptr->DEVICE_ADDRESS;
         break;
         
      case ARC_USB_STATUS_CURRENT_CONFIG:
         *status = usb_dev_ptr->USB_CURR_CONFIG;
         break;

      case ARC_USB_STATUS_SOF_COUNT:
         *status = usb_dev_ptr->USB_SOF_COUNT;
         break;
   
      default:
            USB_unlock(lockKey);
            USB_printf("_usb_device_get_status, bad status\n");
            return USBERR_BAD_STATUS;
  
   } /* Endswitch */
   USB_unlock(lockKey);
  
   return USB_OK;   
} /* EndBody */  
 
/*FUNCTION*----------------------------------------------------------------
* 
* Function Name  : _usb_device_set_status
* Returned Value : USB_OK or error code
* Comments       :
*     Provides API to set internal state
* 
*END*--------------------------------------------------------------------*/
uint_8 _usb_device_set_status
   (
      /* [IN] Handle to the usb device */
      _usb_device_handle   handle,
      
      /* [IN] What to set the status of */
      uint_8               component,
      
      /* [IN] What to set the status to */
      uint_16              setting
   )
{ /* Body */
   USB_DEV_STATE_STRUCT_PTR usb_dev_ptr;
   int 					    lockKey;

   ARC_DEBUG_TRACE(ARC_DEBUG_FLAG_STATUS, 
            "set_status: component=0x%x, value=0x%x\n", component, setting);
   
   usb_dev_ptr = (USB_DEV_STATE_STRUCT_PTR)handle;
   lockKey = USB_lock();

   switch (component) 
   {
      case ARC_USB_STATUS_DEVICE_STATE:
         usb_dev_ptr->USB_STATE = setting;
         break;

      case ARC_USB_STATUS_DEVICE:
         usb_dev_ptr->USB_DEVICE_STATE = setting;
         break;

      case ARC_USB_STATUS_INTERFACE:
         break;

      case ARC_USB_STATUS_CURRENT_CONFIG:
         usb_dev_ptr->USB_CURR_CONFIG = setting;
         break;

      case ARC_USB_STATUS_SOF_COUNT:
         usb_dev_ptr->USB_SOF_COUNT = setting;
         break;

      case ARC_USB_FORCE_FULL_SPEED:
         _usb_dci_vusb20_set_speed_full((pointer)usb_dev_ptr, setting);
         break;

      case ARC_USB_PHY_LOW_POWER_SUSPEND:
         _usb_dci_vusb20_suspend_phy((pointer)usb_dev_ptr, setting);
         break;

      case ARC_USB_STATUS_ADDRESS:
         usb_dev_ptr->DEVICE_ADDRESS = setting;

         _usb_dci_vusb20_set_address((pointer)usb_dev_ptr, setting);
         break;
      
      case ARC_USB_STATUS_TEST_MODE:
         _usb_dci_vusb20_set_test_mode(handle, setting);
         break;
         
      default:
            USB_unlock(lockKey);
            USB_printf("_usb_device_set_status, bad status\n");
            return USBERR_BAD_STATUS;
  
   } /* Endswitch */

   USB_unlock(lockKey);
   
   return USB_OK;   
} /* EndBody */

/*FUNCTION*-------------------------------------------------------------
*
*  Function Name  : _usb_device_stall_endpoint
*  Returned Value : USB_OK or error code
*  Comments       :
*     Stalls the endpoint.
*
*END*-----------------------------------------------------------------*/
void _usb_device_stall_endpoint
   (
      /* [IN] the USB_USB_dev_initialize state structure */
      _usb_device_handle         handle,
            
      /* [IN] the Endpoint number */
      uint_8                     ep_num,
            
      /* [IN] direction */
      uint_8                     direction
   )
{ /* Body */
   USB_DEV_STATE_STRUCT_PTR     usb_dev_ptr;
   int							lockKey;

   usb_dev_ptr = (USB_DEV_STATE_STRUCT_PTR)handle;

   lockKey = USB_lock();

   _usb_dci_vusb20_stall_endpoint(handle, ep_num, direction);

   USB_unlock(lockKey);
   
} /* EndBody */

/*FUNCTION*-------------------------------------------------------------
*
*  Function Name  : _usb_device_is_endpoint_stalled
*  Returned Value : USB_OK or error code
*  Comments       :
*     Stalls the endpoint.
*
*END*-----------------------------------------------------------------*/
uint_8 _usb_device_is_endpoint_stalled
   (
      /* [IN] the USB_USB_dev_initialize state structure */
      _usb_device_handle         handle,
            
      /* [IN] the Endpoint number */
      uint_8                     ep_num,
            
      /* [IN] direction */
      uint_8                     direction
   )
{ /* Body */
   USB_DEV_STATE_STRUCT_PTR     usb_dev_ptr;
   uint_8                       val;
   int							lockKey;

   usb_dev_ptr = (USB_DEV_STATE_STRUCT_PTR)handle;

   lockKey = USB_lock();

   val = _usb_dci_vusb20_is_endpoint_stalled(handle, ep_num, direction);

   USB_unlock(lockKey);

   return val;
   
} /* EndBody */


/*FUNCTION*-------------------------------------------------------------
*
*  Function Name  : _usb_device_process_resume
*  Returned Value : USB_OK or error code
*  Comments       :
*        Process Resume event
*
*END*-----------------------------------------------------------------*/
void _usb_device_assert_resume
   (
      /* [IN] the USB_USB_dev_initialize state structure */
      _usb_device_handle         handle
   )
{ /* Body */
   USB_DEV_STATE_STRUCT_PTR      usb_dev_ptr;
   
   usb_dev_ptr = (USB_DEV_STATE_STRUCT_PTR)handle;

   _usb_dci_vusb20_assert_resume(handle);

} /* EndBody */


/***************************/
/* ARC USB Debug functions */
/***************************/
void _usb_status(void* usbHandle)
{
    USB_DEV_STATE_STRUCT*   pUsbDev = (USB_DEV_STATE_STRUCT*)usbHandle;

    if(pUsbDev == NULL)
    {
        USB_printf("USB Device core is not initialized\n");
        return;
    }

    USB_printf("\n\tUSB Status\n\n");

    USB_printf("DEV_NUM=%d, DEV_ADDR=%d, CAP_REGS=0x%x, DEV_REGS=0x%x, MAX_EP=%d\n",
                pUsbDev->DEV_NUM,
                pUsbDev->DEVICE_ADDRESS,
                (unsigned)pUsbDev->CAP_REGS_PTR, 
                (unsigned)pUsbDev->DEV_PTR, 
                pUsbDev->MAX_ENDPOINTS);

    USB_printf("BUS_RESET=%s, STATE=0x%02x, DEV_STATE=0x%02x, SPEED=%d, ERRORS=%d, ERROR_STATE=0x%04x\n",
                pUsbDev->BUS_RESETTING ? "Yes" : "No",
                pUsbDev->USB_STATE,
                pUsbDev->USB_DEVICE_STATE,
                pUsbDev->SPEED, 
                pUsbDev->ERRORS,
                pUsbDev->ERROR_STATE);

    USB_printf("EP_QUEUE_HEAD: SIZE=%d, BASE=%p (0x%08x), ALIGNED=%p, SERVICE_HEAD=%p\n",
                pUsbDev->EP_QUEUE_HEAD_SIZE,
                pUsbDev->EP_QUEUE_HEAD_BASE, 
                pUsbDev->EP_QUEUE_HEAD_PHYS,
                pUsbDev->EP_QUEUE_HEAD_PTR,
                pUsbDev->SERVICE_HEAD_PTR);

    USB_printf("XD: BASE=%p, HEAD=%p, TAIL=%p, ENTRIES=%d, SCRATCH=%p, TEMP=%p\n",
                pUsbDev->XD_BASE,
                pUsbDev->XD_HEAD,
                pUsbDev->XD_TAIL,
                pUsbDev->XD_ENTRIES,
                pUsbDev->XD_SCRATCH_STRUCT_BASE,
                pUsbDev->TEMP_XD_PTR);

    USB_printf("DTD: SIZE=%d, BASE=%p (0x%08x), ALIGNED=%p, HEAD=0x%08x, TAIL=0x%08x, ENTRIES=%d, SCRATCH=%p\n",
                pUsbDev->DTD_SIZE,
                pUsbDev->DTD_BASE_PTR,
                pUsbDev->DTD_BASE_PHYS,
                pUsbDev->DTD_ALIGNED_BASE_PTR,
                pUsbDev->DTD_HEAD,
                pUsbDev->DTD_TAIL,
                pUsbDev->DTD_ENTRIES,
                pUsbDev->SCRATCH_STRUCT_BASE);
}

void _usb_stats(void* usbHandle)
{
    USB_DEV_STATE_STRUCT*   pUsbDev = (USB_DEV_STATE_STRUCT*)usbHandle;
    USB_STATS*              pUsbStats = &pUsbDev->STATS;
    int                     i;

    USB_printf("\n\tUSB Statistics\n\n");

    USB_printf("isr=%u, empty_isr=%u, reset=%u, setup=%u, read_setup=%u\n", 
                    pUsbStats->usb_isr_count, pUsbStats->usb_empty_isr_count, 
                    pUsbStats->usb_reset_count, pUsbStats->usb_setup_count, 
                    pUsbStats->usb_read_setup_count);

    USB_printf("recv=%u, send=%u, add=%u (%u), cancel=%u\n", 
                pUsbStats->usb_recv_count, pUsbStats->usb_send_count, 
                pUsbStats->usb_add_count, pUsbStats->usb_add_not_empty_count, 
                pUsbStats->usb_cancel_count);

    USB_printf("free_XD=%u, free_dTD=%u\n", 
            pUsbStats->free_XD_count, pUsbStats->free_dTD_count);

    USB_printf("complete_isr=%u, complete=%u, empty_complete=%u, max_complete=%u\n", 
                pUsbStats->usb_complete_isr_count, pUsbStats->usb_complete_count, 
                pUsbStats->usb_empty_complete_count, pUsbStats->usb_complete_max_count);

    USB_printf("port_change=%u, suspend=%u\n", 
                pUsbStats->usb_port_change_count, pUsbStats->usb_suspend_count);
    for(i=0; i<(pUsbDev->MAX_ENDPOINTS); i++)
    {
        if( (pUsbStats->usb_complete_ep_count[i*2] == 0) && 
            (pUsbStats->usb_complete_ep_count[i*2+1] == 0) )
            continue;

        USB_printf("EP #%d: RECV (OUT) = %3u, \tSEND (IN) = %u\n", i,
                    pUsbStats->usb_complete_ep_count[i*2], 
                    pUsbStats->usb_complete_ep_count[i*2+1]);
    }
    USB_printf("\n");
}

void _usb_clear_stats(void* usbHandle)
{
    USB_DEV_STATE_STRUCT*   pUsbDev = (USB_DEV_STATE_STRUCT*)usbHandle;

    USB_memzero(&pUsbDev->STATS, sizeof(pUsbDev->STATS));
}

void _usb_regs(void* usbHandle)
{
    USB_DEV_STATE_STRUCT*   pUsbDev = (USB_DEV_STATE_STRUCT*)usbHandle;
    VUSB20_REG_STRUCT*      cap_regs, *dev_regs;
    int                     dev_num;

    if(pUsbDev == NULL)
    {
        USB_printf("USB Device core is not initialized\n");
        return;
    }
    USB_printf("\n\tUSB Capability Registers\n\n");

    cap_regs = pUsbDev->CAP_REGS_PTR;
    USB_printf("CAPLENGTH_HCIVER (0x%08x) = 0x%08x\n", 
        (unsigned)&cap_regs->REGISTERS.CAPABILITY_REGISTERS.CAPLENGTH_HCIVER,
        (unsigned)USB_32BIT_LE(cap_regs->REGISTERS.CAPABILITY_REGISTERS.CAPLENGTH_HCIVER));

    USB_printf("DCI_VERSION      (0x%08x) = 0x%08x\n", 
        (unsigned)&cap_regs->REGISTERS.CAPABILITY_REGISTERS.DCI_VERSION,
        (unsigned)USB_32BIT_LE(cap_regs->REGISTERS.CAPABILITY_REGISTERS.DCI_VERSION));

    USB_printf("DCC_PARAMS       (0x%08x) = 0x%08x\n", 
        (unsigned)&cap_regs->REGISTERS.CAPABILITY_REGISTERS.DCC_PARAMS,
        (unsigned)USB_32BIT_LE(cap_regs->REGISTERS.CAPABILITY_REGISTERS.DCC_PARAMS));

    dev_regs = pUsbDev->DEV_PTR;
    dev_num = pUsbDev->DEV_NUM;
    USB_printf("\n\tUSB Device Operational Registers\n\n");

    USB_printf("USB_CMD          (0x%08x) = 0x%08x\n", 
        (unsigned)&dev_regs->REGISTERS.OPERATIONAL_DEVICE_REGISTERS.USB_CMD,
        (unsigned)USB_32BIT_LE(dev_regs->REGISTERS.OPERATIONAL_DEVICE_REGISTERS.USB_CMD));

    USB_printf("USB_STS          (0x%08x) = 0x%08x\n", 
        (unsigned)&dev_regs->REGISTERS.OPERATIONAL_DEVICE_REGISTERS.USB_STS,
        (unsigned)USB_32BIT_LE(dev_regs->REGISTERS.OPERATIONAL_DEVICE_REGISTERS.USB_STS));

    USB_printf("USB_INTR         (0x%08x) = 0x%08x\n", 
        (unsigned)&dev_regs->REGISTERS.OPERATIONAL_DEVICE_REGISTERS.USB_INTR,
        (unsigned)USB_32BIT_LE(dev_regs->REGISTERS.OPERATIONAL_DEVICE_REGISTERS.USB_INTR));

    USB_printf("USB_FRINDEX      (0x%08x) = 0x%08x\n", 
        (unsigned)&dev_regs->REGISTERS.OPERATIONAL_DEVICE_REGISTERS.USB_FRINDEX,
        (unsigned)USB_32BIT_LE(dev_regs->REGISTERS.OPERATIONAL_DEVICE_REGISTERS.USB_FRINDEX));

    /* Skip CTRLDSSEGMENT register */
    USB_printf("DEVICE_ADDR      (0x%08x) = 0x%08x\n", 
        (unsigned)&dev_regs->REGISTERS.OPERATIONAL_DEVICE_REGISTERS.DEVICE_ADDR,
        (unsigned)USB_32BIT_LE(dev_regs->REGISTERS.OPERATIONAL_DEVICE_REGISTERS.DEVICE_ADDR));

    USB_printf("EP_LIST_ADDR     (0x%08x) = 0x%08x\n", 
        (unsigned)&dev_regs->REGISTERS.OPERATIONAL_DEVICE_REGISTERS.EP_LIST_ADDR,
        (unsigned)USB_32BIT_LE(dev_regs->REGISTERS.OPERATIONAL_DEVICE_REGISTERS.EP_LIST_ADDR));

    /* Skip CONFIG_FLAG register */

    /* Skip PORTSCX[0..15] registers*/
    USB_printf("PORTSCX[0]       (0x%08x) = 0x%08x\n", 
        (unsigned)&dev_regs->REGISTERS.OPERATIONAL_DEVICE_REGISTERS.PORTSCX[0],
        (unsigned)USB_32BIT_LE(dev_regs->REGISTERS.OPERATIONAL_DEVICE_REGISTERS.PORTSCX[0]));

    /* Skip OTGSC register */

    USB_printf("USB_MODE         (0x%08x) = 0x%08x\n", 
        (unsigned)&dev_regs->REGISTERS.OPERATIONAL_DEVICE_REGISTERS.USB_MODE,
        (unsigned)USB_32BIT_LE(dev_regs->REGISTERS.OPERATIONAL_DEVICE_REGISTERS.USB_MODE));

    USB_printf("ENDPT_SETUP_STAT (0x%08x) = 0x%08x\n", 
        (unsigned)&dev_regs->REGISTERS.OPERATIONAL_DEVICE_REGISTERS.ENDPT_SETUP_STAT,
        (unsigned)USB_32BIT_LE(dev_regs->REGISTERS.OPERATIONAL_DEVICE_REGISTERS.ENDPT_SETUP_STAT));

    USB_printf("ENDPTPRIME       (0x%08x) = 0x%08x\n", 
        (unsigned)&dev_regs->REGISTERS.OPERATIONAL_DEVICE_REGISTERS.ENDPTPRIME,
        (unsigned)USB_32BIT_LE(dev_regs->REGISTERS.OPERATIONAL_DEVICE_REGISTERS.ENDPTPRIME));

    USB_printf("ENDPTFLUSH       (0x%08x) = 0x%08x\n", 
        (unsigned)&dev_regs->REGISTERS.OPERATIONAL_DEVICE_REGISTERS.ENDPTFLUSH,
        (unsigned)USB_32BIT_LE(dev_regs->REGISTERS.OPERATIONAL_DEVICE_REGISTERS.ENDPTFLUSH));

    USB_printf("ENDPTSTATUS      (0x%08x) = 0x%08x\n", 
        (unsigned)&dev_regs->REGISTERS.OPERATIONAL_DEVICE_REGISTERS.ENDPTSTATUS,
        (unsigned)USB_32BIT_LE(dev_regs->REGISTERS.OPERATIONAL_DEVICE_REGISTERS.ENDPTSTATUS));

    USB_printf("ENDPTCOMPLETE    (0x%08x) = 0x%08x\n", 
        (unsigned)&dev_regs->REGISTERS.OPERATIONAL_DEVICE_REGISTERS.ENDPTCOMPLETE,
        (unsigned)USB_32BIT_LE(dev_regs->REGISTERS.OPERATIONAL_DEVICE_REGISTERS.ENDPTCOMPLETE));
}

    
void _usb_ep_status(void* usbHandle, int ep_num, int direction)
{
    USB_DEV_STATE_STRUCT*               pUsbDev = (USB_DEV_STATE_STRUCT*)usbHandle;
    int                                 i, ep_idx;
    VUSB20_EP_QUEUE_HEAD_STRUCT_PTR     ep_queue_head_ptr;
    VUSB20_EP_TR_STRUCT_PTR             dTD_ptr, head_dTD_ptr, tail_dTD_ptr, next_dTD_ptr;
    XD_STRUCT_PTR                       xd_ptr, next_xd_ptr;
    VUSB20_REG_STRUCT_PTR               dev_regs;

    if(pUsbDev == NULL)
    {
        USB_printf("USB Device core is not initialized\n");
        return;
    }

    USB_printf("\n\tUSB Endpoint #%d - %s status\n\n", ep_num,
        (direction == ARC_USB_SEND) ? "SEND (IN)" : "RECV (OUT)" );

    ep_idx = ep_num*2 + direction;
    dev_regs = pUsbDev->DEV_PTR;

    USB_printf("ENDPTCTRLX[%d]    (0x%08x) = 0x%08x\n", ep_num,
        (unsigned)&dev_regs->REGISTERS.OPERATIONAL_DEVICE_REGISTERS.ENDPTCTRLX[ep_num],
        (unsigned)USB_32BIT_LE(dev_regs->REGISTERS.OPERATIONAL_DEVICE_REGISTERS.ENDPTCTRLX[ep_num]));

    ep_queue_head_ptr = (VUSB20_EP_QUEUE_HEAD_STRUCT_PTR)pUsbDev->EP_QUEUE_HEAD_PTR + ep_idx;

    head_dTD_ptr = pUsbDev->EP_DTD_HEADS[ep_idx];
    tail_dTD_ptr = pUsbDev->EP_DTD_TAILS[ep_idx];

    USB_printf("EP_QH=0x%08x: MAX_PKT=0x%x, SIZE_IOC_INT_STS=0x%x, CURR_DTD=0x%x, NEXT_DTD=0x%x\n", 
                (unsigned)ep_queue_head_ptr, (unsigned)USB_32BIT_LE(ep_queue_head_ptr->MAX_PKT_LENGTH), 
                (unsigned)USB_32BIT_LE(ep_queue_head_ptr->SIZE_IOC_INT_STS), 
                (unsigned)USB_32BIT_LE(ep_queue_head_ptr->CURR_DTD_PTR), 
                (unsigned)USB_32BIT_LE(ep_queue_head_ptr->NEXT_DTD_PTR));

    USB_printf("\tBUF_0=0x%08x, BUF_1=0x%08x, BUF_2=0x%08x, BUF_3=0x%08x, BUF_4=0x%08x\n",
                (unsigned)USB_32BIT_LE(ep_queue_head_ptr->BUFF_PTR0), 
                (unsigned)USB_32BIT_LE(ep_queue_head_ptr->BUFF_PTR1), 
                (unsigned)USB_32BIT_LE(ep_queue_head_ptr->BUFF_PTR2), 
                (unsigned)USB_32BIT_LE(ep_queue_head_ptr->BUFF_PTR3), 
                (unsigned)USB_32BIT_LE(ep_queue_head_ptr->BUFF_PTR4));
    
    USB_printf("\tSETUP_BUFFER (%p): ", ep_queue_head_ptr->SETUP_BUFFER);
    for(i=0; i<sizeof(ep_queue_head_ptr->SETUP_BUFFER); i++)
        USB_printf("%02x", ep_queue_head_ptr->SETUP_BUFFER[i] & 0xFF);
    USB_printf("\n");

    USB_printf("\ndTD_HEAD=0x%08x, dTD_TAIL=0x%08x\n", 
                (unsigned)head_dTD_ptr, (unsigned)tail_dTD_ptr);

    dTD_ptr = head_dTD_ptr;
    i = 0;
    while(dTD_ptr != NULL)
    {
        USB_printf("%d. dTD=0x%08x (0x%08x), SIZE_IOC_STS=0x%08x, BUF_0=0x%08x, NEXT=0x%08x\n", 
                    i, (unsigned)dTD_ptr, USB_DTD_VIRT_TO_PHYS(pUsbDev, dTD_ptr),
                    (unsigned)USB_32BIT_LE(dTD_ptr->SIZE_IOC_STS), 
                    (unsigned)USB_32BIT_LE(dTD_ptr->BUFF_PTR0), 
                    (unsigned)USB_32BIT_LE(dTD_ptr->NEXT_TR_ELEM_PTR));

        xd_ptr = dTD_ptr->SCRATCH_PTR->XD_FOR_THIS_DTD;

        next_dTD_ptr = (VUSB20_EP_TR_STRUCT_PTR)USB_DTD_PHYS_TO_VIRT(pUsbDev, 
                           (uint_32)(USB_32BIT_LE(dTD_ptr->NEXT_TR_ELEM_PTR) & VUSBHS_TD_ADDR_MASK));
        if(next_dTD_ptr != NULL) 
            next_xd_ptr = next_dTD_ptr->SCRATCH_PTR->XD_FOR_THIS_DTD;
        else
            next_xd_ptr = NULL;

        if(next_xd_ptr != xd_ptr)
        {
            USB_printf("\tXD=0x%08x, ADDR=0x%08x, SIZE=%u, STATUS=0x%02x\n",
                (unsigned)xd_ptr, (unsigned)xd_ptr->WSTARTADDRESS, 
                (unsigned)xd_ptr->WTOTALLENGTH, xd_ptr->BSTATUS);
        }
        i++;
        dTD_ptr = next_dTD_ptr;
    }
}


/* DEBUG */
uint_32 usbDebugFlags = ARC_DEBUG_FLAG_STATS
                      | ARC_DEBUG_FLAG_INIT 
                      | ARC_DEBUG_FLAG_ERROR 
                      | ARC_DEBUG_FLAG_STALL
                      | ARC_DEBUG_FLAG_RESET;
                      /*| ARC_DEBUG_FLAG_TRANSFER;*/

void    _usb_debug_set_flags(uint_32 flags)     
{
    usbDebugFlags = (flags);                        
}

uint_32 _usb_debug_get_flags(void)     
{
    return usbDebugFlags;  
}

#if defined(MV_USB_TRACE_LOG)

uint_16 DEBUG_TRACE_ARRAY_COUNTER = 0;
char    DEBUG_TRACE_ARRAY[TRACE_ARRAY_SIZE][MAX_STRING_SIZE];

void  _usb_debug_init_trace_log(void)                   
{                                                  
    USB_memzero(DEBUG_TRACE_ARRAY, TRACE_ARRAY_SIZE*MAX_STRING_SIZE);
	DEBUG_TRACE_ARRAY_COUNTER =0;                  
}                               

void    _usb_debug_print_trace_log(void)                     
{                                                       
    int     i;                                          
                                                        
    USB_printf("USB Trace log: start=0x%x, end=0x%x, idx=%d, flags=0x%x\n\n", 
               &DEBUG_TRACE_ARRAY[0][0], &DEBUG_TRACE_ARRAY[TRACE_ARRAY_SIZE-1][0], 
               DEBUG_TRACE_ARRAY_COUNTER, usbDebugFlags);      

    for(i=DEBUG_TRACE_ARRAY_COUNTER; i<TRACE_ARRAY_SIZE; i++)                      
    {                                                 
        if(DEBUG_TRACE_ARRAY[i][0] == '\0')              
            continue;                     
        
        USB_printf("%3d. %s", i, DEBUG_TRACE_ARRAY[i]);
    }                                                 
    for(i=0; i<DEBUG_TRACE_ARRAY_COUNTER; i++)       
    {                                                 
        if(DEBUG_TRACE_ARRAY[i][0] == '\0')           
            continue;                                 
        USB_printf("%3d. %s", i, DEBUG_TRACE_ARRAY[i]);
    }                          
    _usb_debug_init_trace_log();
}
#else
void  _usb_debug_init_trace_log(void)                   
{
}

void    _usb_debug_print_trace_log(void)
{
    USB_printf("USB trace log is not supported\n");
}
#endif /* MV_USB_TRACE_LOG */




