/******************************************************************************* 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_recv_data * Returned Value : USB_OK or error code * Comments : * Receives data on a specified endpoint. * *END*-----------------------------------------------------------------*/ uint_8 _usb_device_recv_data ( /* [IN] the USB_USB_dev_initialize state structure */ _usb_device_handle handle, /* [IN] the Endpoint number */ uint_8 ep_num, /* [IN] buffer to receive data */ uint_8_ptr buff_ptr, /* [IN] length of the transfer */ uint_32 size ) { /* Body */ int lockKey; uint_8 error = USB_OK; XD_STRUCT_PTR xd_ptr; USB_DEV_STATE_STRUCT_PTR usb_dev_ptr; usb_dev_ptr = (USB_DEV_STATE_STRUCT_PTR)handle; ARC_DEBUG_TRACE(ARC_DEBUG_FLAG_RX, "recv_data: ep=%d, buf_ptr=0x%x, size=%d\n", ep_num, (unsigned)buff_ptr, (int)size); ARC_DEBUG_CODE(ARC_DEBUG_FLAG_STATS, (usb_dev_ptr->STATS.usb_recv_count++)); if(buff_ptr != NULL) USB_dcache_inv((pointer)buff_ptr,size); lockKey = USB_lock(); if (!usb_dev_ptr->XD_ENTRIES) { USB_unlock(lockKey); USB_printf("_usb_device_recv_data, transfer in progress\n"); return ARC_USB_STATUS_TRANSFER_IN_PROGRESS; } /* Endif */ /* Get a transfer descriptor for the specified endpoint ** and direction */ USB_XD_QGET(usb_dev_ptr->XD_HEAD, usb_dev_ptr->XD_TAIL, xd_ptr); usb_dev_ptr->XD_ENTRIES--; /* Initialize the new transfer descriptor */ xd_ptr->EP_NUM = ep_num; xd_ptr->BDIRECTION = ARC_USB_RECV; xd_ptr->WTOTALLENGTH = size; xd_ptr->WSOFAR = 0; xd_ptr->WSTARTADDRESS = buff_ptr; xd_ptr->BSTATUS = ARC_USB_STATUS_TRANSFER_ACCEPTED; error = _usb_dci_vusb20_add_dTD(handle, xd_ptr); USB_unlock(lockKey); if (error) { USB_printf("_usb_device_recv_data, receive failed\n"); return USBERR_RX_FAILED; } /* Endif */ return error; } /* EndBody */