blob: 597bdcfafa160b99213a06acb9ef5de8198f95cc [file] [log] [blame]
/*******************************************************************************
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.
*******************************************************************************/
#ifndef __mvUsbDevPrv_h__
#define __mvUsbDevPrv_h__
#include "usb/common/mvUsbCore.h"
#define USB_TEST_MODE_TEST_PACKET_LENGTH (53)
#define USB_XD_QADD(head,tail,XD) \
if ((head) == NULL) { \
(head) = (XD); \
} else { \
(tail)->SCRATCH_PTR->PRIVATE = (XD); \
} /* Endif */ \
(tail) = (XD); \
(XD)->SCRATCH_PTR->PRIVATE = NULL
#define USB_XD_QGET(head,tail,XD) \
(XD) = (head); \
if (head) { \
(head) = (XD_STRUCT_PTR)((head)->SCRATCH_PTR->PRIVATE); \
if ((head) == NULL) { \
(tail) = NULL; \
} /* Endif */ \
} /* Endif */
#define EHCI_DTD_QADD(head,tail,dTD) \
if ((head) == NULL) { \
(head) = (dTD); \
} else { \
(tail)->SCRATCH_PTR->PRIVATE = (void *) (dTD); \
} /* Endif */ \
(tail) = (dTD); \
(dTD)->SCRATCH_PTR->PRIVATE = NULL
#define EHCI_DTD_QGET(head,tail,dTD) \
(dTD) = (head); \
if (head) { \
(head) = (head)->SCRATCH_PTR->PRIVATE; \
if ((head) == NULL) { \
(tail) = NULL; \
} /* Endif */ \
} /* Endif */
/***************************************
**
** Data structures
**
*/
typedef struct
{
uint_32 usb_isr_count;
uint_32 usb_reset_count;
uint_32 usb_send_count;
uint_32 usb_recv_count;
uint_32 usb_setup_count;
uint_32 free_XD_count;
uint_32 free_dTD_count;
uint_32 usb_cancel_count;
uint_32 usb_add_count;
uint_32 usb_add_not_empty_count;
uint_32 usb_empty_isr_count;
uint_32 usb_empty_complete_count;
uint_32 usb_read_setup_count;
uint_32 usb_complete_isr_count;
uint_32 usb_complete_count;
uint_32 usb_complete_max_count;
uint_32 usb_port_change_count;
uint_32 usb_suspend_count;
uint_32 usb_complete_ep_count[ARC_USB_MAX_ENDPOINTS*2];
} USB_STATS;
/* Callback function storage structure */
typedef struct service_struct
{
uint_8 TYPE;
void (_CODE_PTR_ SERVICE)(pointer, uint_8, boolean, uint_8, uint_8_ptr, uint_32, uint_8);
struct service_struct _PTR_ NEXT;
} SERVICE_STRUCT, _PTR_ SERVICE_STRUCT_PTR;
typedef struct xd_struct
{
uint_8 EP_NUM; /* Endpoint number */
uint_8 BDIRECTION; /* Direction : Send/Receive */
uint_8 EP_TYPE; /* Type of the endpoint: Ctrl, Isoch, Bulk, Int */
uint_8 BSTATUS; /* Current transfer status */
uint_8_ptr WSTARTADDRESS; /* Address of first byte */
uint_32 WTOTALLENGTH; /* Number of bytes to send/recv */
uint_32 WSOFAR; /* Number of bytes recv'd so far */
uint_16 WMAXPACKETSIZE; /* Max Packet size */
boolean DONT_ZERO_TERMINATE;
uint_8 MAX_PKTS_PER_UFRAME;
SCRATCH_STRUCT *SCRATCH_PTR;
} XD_STRUCT, _PTR_ XD_STRUCT_PTR;
/* The USB Device State Structure */
typedef struct
{
boolean BUS_RESETTING; /* Device is
** being reset */
volatile VUSB20_REG_STRUCT_PTR CAP_REGS_PTR; /* Capabilities registers */
volatile VUSB20_REG_STRUCT_PTR DEV_PTR; /* Device Controller
** Register base
** address */
SERVICE_STRUCT_PTR SERVICE_HEAD_PTR; /* Head struct
** address of
** registered services
*/
XD_STRUCT_PTR TEMP_XD_PTR; /* Temp xd for ep init */
XD_STRUCT_PTR XD_BASE;
XD_STRUCT_PTR XD_HEAD; /* Head Transaction
** descriptors
*/
XD_STRUCT_PTR XD_TAIL; /* Tail Transaction
** descriptors
*/
uint_32 XD_ENTRIES;
uint_8* EP_QUEUE_HEAD_BASE;
uint_32 EP_QUEUE_HEAD_PHYS;
uint_32 EP_QUEUE_HEAD_SIZE;
VUSB20_EP_QUEUE_HEAD_STRUCT_PTR EP_QUEUE_HEAD_PTR; /* Endpoint Queue head */
uint_8* DTD_BASE_PTR; /* Device transfer descriptor pool address */
uint_32 DTD_BASE_PHYS;
uint_32 DTD_SIZE;
VUSB20_EP_TR_STRUCT_PTR DTD_ALIGNED_BASE_PTR;/* Aligned transfer descriptor pool address */
VUSB20_EP_TR_STRUCT_PTR DTD_HEAD;
VUSB20_EP_TR_STRUCT_PTR DTD_TAIL;
VUSB20_EP_TR_STRUCT_PTR EP_DTD_HEADS[ARC_USB_MAX_ENDPOINTS * 2];
VUSB20_EP_TR_STRUCT_PTR EP_DTD_TAILS[ARC_USB_MAX_ENDPOINTS * 2];
SCRATCH_STRUCT_PTR XD_SCRATCH_STRUCT_BASE;
SCRATCH_STRUCT_PTR SCRATCH_STRUCT_BASE;
uint_16 USB_STATE;
uint_16 USB_DEVICE_STATE;
uint_16 USB_SOF_COUNT;
uint_16 DTD_ENTRIES;
uint_16 ERRORS;
uint_16 ERROR_STATE;
uint_16 USB_DEV_STATE_B4_SUSPEND;
uint_8 DEV_NUM; /* USB device number
** on the board
*/
uint_8 SPEED; /* Low Speed,
** High Speed,
** Full Speed
*/
uint_8 MAX_ENDPOINTS; /* Max endpoints
** supported by this
** device
*/
uint_8 USB_CURR_CONFIG;
uint_8 DEVICE_ADDRESS;
uint_8 FORCE_FS;
USB_STATS STATS;
uint_8* STATUS_UNAIGNED_PTR;
uint_16* STATUS_PTR;
uint_8* TEST_PKT_UNAIGNED_PTR;
uint_8* TEST_PKT_PTR;
} USB_DEV_STATE_STRUCT, _PTR_ USB_DEV_STATE_STRUCT_PTR;
/* ONLY For data bases allocated by the driver (when PHYS and VIRT bases are known) */
#define USB_EP_QH_VIRT_TO_PHYS(handle, virtAddr) \
(((virtAddr) == NULL) ? 0 : ((handle)->EP_QUEUE_HEAD_PHYS + \
((uint_32)(virtAddr) - (uint_32)(handle)->EP_QUEUE_HEAD_BASE)))
#define USB_DTD_VIRT_TO_PHYS(handle, virtAddr) \
(((virtAddr) == NULL) ? 0 : ((handle)->DTD_BASE_PHYS + \
((uint_32)(virtAddr) - (uint_32)(handle)->DTD_BASE_PTR)))
#define USB_DTD_PHYS_TO_VIRT(handle, physAddr) \
(((physAddr) == 0) ? NULL : ((handle)->DTD_BASE_PTR + \
((physAddr) - (handle)->DTD_BASE_PHYS)))
/***************************************
**
** Prototypes
**
*/
#ifdef __cplusplus
extern "C" {
#endif
extern uint_8 _usb_device_call_service(void* handle, uint_8, boolean,
boolean, uint_8_ptr, uint_32, uint_8);
extern uint_8 _usb_dci_vusb20_init(uint_8, _usb_device_handle);
extern void _usb_device_free_XD(pointer);
extern void _usb_dci_vusb20_free_dTD(pointer);
extern uint_8 _usb_dci_vusb20_add_dTD(_usb_device_handle, XD_STRUCT_PTR);
extern uint_8 _usb_dci_vusb20_cancel_transfer(_usb_device_handle, uint_8, uint_8);
extern uint_8 _usb_dci_vusb20_get_transfer_status(_usb_device_handle, uint_8, uint_8);
extern XD_STRUCT_PTR _usb_dci_vusb20_get_transfer_details(_usb_device_handle, uint_8, uint_8);
extern void _usb_dci_vusb20_process_tr_complete(_usb_device_handle);
extern void _usb_dci_vusb20_process_reset(_usb_device_handle);
extern void _usb_dci_vusb20_process_tr_complete(_usb_device_handle);
extern void _usb_dci_vusb20_process_suspend(_usb_device_handle);
extern void _usb_dci_vusb20_process_SOF(_usb_device_handle);
extern void _usb_dci_vusb20_process_port_change(_usb_device_handle);
extern void _usb_dci_vusb20_process_error(_usb_device_handle);
extern void _usb_dci_vusb20_shutdown(_usb_device_handle);
extern void _usb_dci_vusb20_set_speed_full(_usb_device_handle, uint_8);
extern void _usb_dci_vusb20_suspend_phy(_usb_device_handle, uint_8);
extern void _usb_dci_vusb20_hnp_shutdown(void);
extern void _usb_dci_vusb20_set_address(_usb_device_handle, uint_8);
extern void _usb_dci_vusb20_get_setup_data(_usb_device_handle, uint_8, uint_8_ptr);
extern void _usb_dci_vusb20_assert_resume(_usb_device_handle);
extern uint_8 _usb_dci_vusb20_init_endpoint(_usb_device_handle, XD_STRUCT_PTR);
extern void _usb_dci_vusb20_stall_endpoint(_usb_device_handle, uint_8, uint_8);
extern void _usb_dci_vusb20_unstall_endpoint(_usb_device_handle, uint_8, uint_8);
extern uint_8 _usb_dci_vusb20_is_endpoint_stalled(_usb_device_handle, uint_8, uint_8);
extern uint_8 _usb_dci_vusb20_deinit_endpoint(_usb_device_handle, uint_8, uint_8);
extern void _usb_dci_vusb20_chip_initialize(_usb_device_handle);
extern void _usb_dci_vusb20_stop(_usb_device_handle handle);
extern void _usb_dci_vusb20_start(_usb_device_handle handle);
#if defined(USB_UNDERRUN_WA)
extern uint_8* usbSramBase;
extern int usbSramSize;
void _usb_reset_send_queue(void);
void usbSendComplete(void* handle, uint_8 type, boolean setup, uint_8 dir,
uint_8_ptr buffer, uint_32 length, uint_8 error);
#endif /* USB_UNDERRUN_WA */
#ifdef __cplusplus
}
#endif
#endif