xref: /openbmc/linux/drivers/usb/gadget/udc/mv_udc.h (revision 664b0bae0b87f69bc9deb098f5e0158b9cf18e04)
1*5fd54aceSGreg Kroah-Hartman // SPDX-License-Identifier: GPL-2.0+
290fccb52SAndrzej Pietrasiewicz /*
390fccb52SAndrzej Pietrasiewicz  * Copyright (C) 2011 Marvell International Ltd. All rights reserved.
490fccb52SAndrzej Pietrasiewicz  */
590fccb52SAndrzej Pietrasiewicz 
690fccb52SAndrzej Pietrasiewicz #ifndef __MV_UDC_H
790fccb52SAndrzej Pietrasiewicz #define __MV_UDC_H
890fccb52SAndrzej Pietrasiewicz 
990fccb52SAndrzej Pietrasiewicz #define VUSBHS_MAX_PORTS	8
1090fccb52SAndrzej Pietrasiewicz 
1190fccb52SAndrzej Pietrasiewicz #define DQH_ALIGNMENT		2048
1290fccb52SAndrzej Pietrasiewicz #define DTD_ALIGNMENT		64
1390fccb52SAndrzej Pietrasiewicz #define DMA_BOUNDARY		4096
1490fccb52SAndrzej Pietrasiewicz 
1590fccb52SAndrzej Pietrasiewicz #define EP_DIR_IN	1
1690fccb52SAndrzej Pietrasiewicz #define EP_DIR_OUT	0
1790fccb52SAndrzej Pietrasiewicz 
1890fccb52SAndrzej Pietrasiewicz #define DMA_ADDR_INVALID	(~(dma_addr_t)0)
1990fccb52SAndrzej Pietrasiewicz 
2090fccb52SAndrzej Pietrasiewicz #define EP0_MAX_PKT_SIZE	64
2190fccb52SAndrzej Pietrasiewicz /* ep0 transfer state */
2290fccb52SAndrzej Pietrasiewicz #define WAIT_FOR_SETUP		0
2390fccb52SAndrzej Pietrasiewicz #define DATA_STATE_XMIT		1
2490fccb52SAndrzej Pietrasiewicz #define DATA_STATE_NEED_ZLP	2
2590fccb52SAndrzej Pietrasiewicz #define WAIT_FOR_OUT_STATUS	3
2690fccb52SAndrzej Pietrasiewicz #define DATA_STATE_RECV		4
2790fccb52SAndrzej Pietrasiewicz 
2890fccb52SAndrzej Pietrasiewicz #define CAPLENGTH_MASK		(0xff)
2990fccb52SAndrzej Pietrasiewicz #define DCCPARAMS_DEN_MASK	(0x1f)
3090fccb52SAndrzej Pietrasiewicz 
3190fccb52SAndrzej Pietrasiewicz #define HCSPARAMS_PPC		(0x10)
3290fccb52SAndrzej Pietrasiewicz 
3390fccb52SAndrzej Pietrasiewicz /* Frame Index Register Bit Masks */
3490fccb52SAndrzej Pietrasiewicz #define USB_FRINDEX_MASKS	0x3fff
3590fccb52SAndrzej Pietrasiewicz 
3690fccb52SAndrzej Pietrasiewicz /* Command Register Bit Masks */
3790fccb52SAndrzej Pietrasiewicz #define USBCMD_RUN_STOP				(0x00000001)
3890fccb52SAndrzej Pietrasiewicz #define USBCMD_CTRL_RESET			(0x00000002)
3990fccb52SAndrzej Pietrasiewicz #define USBCMD_SETUP_TRIPWIRE_SET		(0x00002000)
4090fccb52SAndrzej Pietrasiewicz #define USBCMD_SETUP_TRIPWIRE_CLEAR		(~USBCMD_SETUP_TRIPWIRE_SET)
4190fccb52SAndrzej Pietrasiewicz 
4290fccb52SAndrzej Pietrasiewicz #define USBCMD_ATDTW_TRIPWIRE_SET		(0x00004000)
4390fccb52SAndrzej Pietrasiewicz #define USBCMD_ATDTW_TRIPWIRE_CLEAR		(~USBCMD_ATDTW_TRIPWIRE_SET)
4490fccb52SAndrzej Pietrasiewicz 
4590fccb52SAndrzej Pietrasiewicz /* bit 15,3,2 are for frame list size */
4690fccb52SAndrzej Pietrasiewicz #define USBCMD_FRAME_SIZE_1024			(0x00000000) /* 000 */
4790fccb52SAndrzej Pietrasiewicz #define USBCMD_FRAME_SIZE_512			(0x00000004) /* 001 */
4890fccb52SAndrzej Pietrasiewicz #define USBCMD_FRAME_SIZE_256			(0x00000008) /* 010 */
4990fccb52SAndrzej Pietrasiewicz #define USBCMD_FRAME_SIZE_128			(0x0000000C) /* 011 */
5090fccb52SAndrzej Pietrasiewicz #define USBCMD_FRAME_SIZE_64			(0x00008000) /* 100 */
5190fccb52SAndrzej Pietrasiewicz #define USBCMD_FRAME_SIZE_32			(0x00008004) /* 101 */
5290fccb52SAndrzej Pietrasiewicz #define USBCMD_FRAME_SIZE_16			(0x00008008) /* 110 */
5390fccb52SAndrzej Pietrasiewicz #define USBCMD_FRAME_SIZE_8			(0x0000800C) /* 111 */
5490fccb52SAndrzej Pietrasiewicz 
5590fccb52SAndrzej Pietrasiewicz #define EPCTRL_TX_ALL_MASK			(0xFFFF0000)
5690fccb52SAndrzej Pietrasiewicz #define EPCTRL_RX_ALL_MASK			(0x0000FFFF)
5790fccb52SAndrzej Pietrasiewicz 
5890fccb52SAndrzej Pietrasiewicz #define EPCTRL_TX_DATA_TOGGLE_RST		(0x00400000)
5990fccb52SAndrzej Pietrasiewicz #define EPCTRL_TX_EP_STALL			(0x00010000)
6090fccb52SAndrzej Pietrasiewicz #define EPCTRL_RX_EP_STALL			(0x00000001)
6190fccb52SAndrzej Pietrasiewicz #define EPCTRL_RX_DATA_TOGGLE_RST		(0x00000040)
6290fccb52SAndrzej Pietrasiewicz #define EPCTRL_RX_ENABLE			(0x00000080)
6390fccb52SAndrzej Pietrasiewicz #define EPCTRL_TX_ENABLE			(0x00800000)
6490fccb52SAndrzej Pietrasiewicz #define EPCTRL_CONTROL				(0x00000000)
6590fccb52SAndrzej Pietrasiewicz #define EPCTRL_ISOCHRONOUS			(0x00040000)
6690fccb52SAndrzej Pietrasiewicz #define EPCTRL_BULK				(0x00080000)
6790fccb52SAndrzej Pietrasiewicz #define EPCTRL_INT				(0x000C0000)
6890fccb52SAndrzej Pietrasiewicz #define EPCTRL_TX_TYPE				(0x000C0000)
6990fccb52SAndrzej Pietrasiewicz #define EPCTRL_RX_TYPE				(0x0000000C)
7090fccb52SAndrzej Pietrasiewicz #define EPCTRL_DATA_TOGGLE_INHIBIT		(0x00000020)
7190fccb52SAndrzej Pietrasiewicz #define EPCTRL_TX_EP_TYPE_SHIFT			(18)
7290fccb52SAndrzej Pietrasiewicz #define EPCTRL_RX_EP_TYPE_SHIFT			(2)
7390fccb52SAndrzej Pietrasiewicz 
7490fccb52SAndrzej Pietrasiewicz #define EPCOMPLETE_MAX_ENDPOINTS		(16)
7590fccb52SAndrzej Pietrasiewicz 
7690fccb52SAndrzej Pietrasiewicz /* endpoint list address bit masks */
7790fccb52SAndrzej Pietrasiewicz #define USB_EP_LIST_ADDRESS_MASK              0xfffff800
7890fccb52SAndrzej Pietrasiewicz 
7990fccb52SAndrzej Pietrasiewicz #define PORTSCX_W1C_BITS			0x2a
8090fccb52SAndrzej Pietrasiewicz #define PORTSCX_PORT_RESET			0x00000100
8190fccb52SAndrzej Pietrasiewicz #define PORTSCX_PORT_POWER			0x00001000
8290fccb52SAndrzej Pietrasiewicz #define PORTSCX_FORCE_FULL_SPEED_CONNECT	0x01000000
8390fccb52SAndrzej Pietrasiewicz #define PORTSCX_PAR_XCVR_SELECT			0xC0000000
8490fccb52SAndrzej Pietrasiewicz #define PORTSCX_PORT_FORCE_RESUME		0x00000040
8590fccb52SAndrzej Pietrasiewicz #define PORTSCX_PORT_SUSPEND			0x00000080
8690fccb52SAndrzej Pietrasiewicz #define PORTSCX_PORT_SPEED_FULL			0x00000000
8790fccb52SAndrzej Pietrasiewicz #define PORTSCX_PORT_SPEED_LOW			0x04000000
8890fccb52SAndrzej Pietrasiewicz #define PORTSCX_PORT_SPEED_HIGH			0x08000000
8990fccb52SAndrzej Pietrasiewicz #define PORTSCX_PORT_SPEED_MASK			0x0C000000
9090fccb52SAndrzej Pietrasiewicz 
9190fccb52SAndrzej Pietrasiewicz /* USB MODE Register Bit Masks */
9290fccb52SAndrzej Pietrasiewicz #define USBMODE_CTRL_MODE_IDLE			0x00000000
9390fccb52SAndrzej Pietrasiewicz #define USBMODE_CTRL_MODE_DEVICE		0x00000002
9490fccb52SAndrzej Pietrasiewicz #define USBMODE_CTRL_MODE_HOST			0x00000003
9590fccb52SAndrzej Pietrasiewicz #define USBMODE_CTRL_MODE_RSV			0x00000001
9690fccb52SAndrzej Pietrasiewicz #define USBMODE_SETUP_LOCK_OFF			0x00000008
9790fccb52SAndrzej Pietrasiewicz #define USBMODE_STREAM_DISABLE			0x00000010
9890fccb52SAndrzej Pietrasiewicz 
9990fccb52SAndrzej Pietrasiewicz /* USB STS Register Bit Masks */
10090fccb52SAndrzej Pietrasiewicz #define USBSTS_INT			0x00000001
10190fccb52SAndrzej Pietrasiewicz #define USBSTS_ERR			0x00000002
10290fccb52SAndrzej Pietrasiewicz #define USBSTS_PORT_CHANGE		0x00000004
10390fccb52SAndrzej Pietrasiewicz #define USBSTS_FRM_LST_ROLL		0x00000008
10490fccb52SAndrzej Pietrasiewicz #define USBSTS_SYS_ERR			0x00000010
10590fccb52SAndrzej Pietrasiewicz #define USBSTS_IAA			0x00000020
10690fccb52SAndrzej Pietrasiewicz #define USBSTS_RESET			0x00000040
10790fccb52SAndrzej Pietrasiewicz #define USBSTS_SOF			0x00000080
10890fccb52SAndrzej Pietrasiewicz #define USBSTS_SUSPEND			0x00000100
10990fccb52SAndrzej Pietrasiewicz #define USBSTS_HC_HALTED		0x00001000
11090fccb52SAndrzej Pietrasiewicz #define USBSTS_RCL			0x00002000
11190fccb52SAndrzej Pietrasiewicz #define USBSTS_PERIODIC_SCHEDULE	0x00004000
11290fccb52SAndrzej Pietrasiewicz #define USBSTS_ASYNC_SCHEDULE		0x00008000
11390fccb52SAndrzej Pietrasiewicz 
11490fccb52SAndrzej Pietrasiewicz 
11590fccb52SAndrzej Pietrasiewicz /* Interrupt Enable Register Bit Masks */
11690fccb52SAndrzej Pietrasiewicz #define USBINTR_INT_EN                          (0x00000001)
11790fccb52SAndrzej Pietrasiewicz #define USBINTR_ERR_INT_EN                      (0x00000002)
11890fccb52SAndrzej Pietrasiewicz #define USBINTR_PORT_CHANGE_DETECT_EN           (0x00000004)
11990fccb52SAndrzej Pietrasiewicz 
12090fccb52SAndrzej Pietrasiewicz #define USBINTR_ASYNC_ADV_AAE                   (0x00000020)
12190fccb52SAndrzej Pietrasiewicz #define USBINTR_ASYNC_ADV_AAE_ENABLE            (0x00000020)
12290fccb52SAndrzej Pietrasiewicz #define USBINTR_ASYNC_ADV_AAE_DISABLE           (0xFFFFFFDF)
12390fccb52SAndrzej Pietrasiewicz 
12490fccb52SAndrzej Pietrasiewicz #define USBINTR_RESET_EN                        (0x00000040)
12590fccb52SAndrzej Pietrasiewicz #define USBINTR_SOF_UFRAME_EN                   (0x00000080)
12690fccb52SAndrzej Pietrasiewicz #define USBINTR_DEVICE_SUSPEND                  (0x00000100)
12790fccb52SAndrzej Pietrasiewicz 
12890fccb52SAndrzej Pietrasiewicz #define USB_DEVICE_ADDRESS_MASK			(0xfe000000)
12990fccb52SAndrzej Pietrasiewicz #define USB_DEVICE_ADDRESS_BIT_SHIFT		(25)
13090fccb52SAndrzej Pietrasiewicz 
13190fccb52SAndrzej Pietrasiewicz struct mv_cap_regs {
13290fccb52SAndrzej Pietrasiewicz 	u32	caplength_hciversion;
13390fccb52SAndrzej Pietrasiewicz 	u32	hcsparams;	/* HC structural parameters */
13490fccb52SAndrzej Pietrasiewicz 	u32	hccparams;	/* HC Capability Parameters*/
13590fccb52SAndrzej Pietrasiewicz 	u32	reserved[5];
13690fccb52SAndrzej Pietrasiewicz 	u32	dciversion;	/* DC version number and reserved 16 bits */
13790fccb52SAndrzej Pietrasiewicz 	u32	dccparams;	/* DC Capability Parameters */
13890fccb52SAndrzej Pietrasiewicz };
13990fccb52SAndrzej Pietrasiewicz 
14090fccb52SAndrzej Pietrasiewicz struct mv_op_regs {
14190fccb52SAndrzej Pietrasiewicz 	u32	usbcmd;		/* Command register */
14290fccb52SAndrzej Pietrasiewicz 	u32	usbsts;		/* Status register */
14390fccb52SAndrzej Pietrasiewicz 	u32	usbintr;	/* Interrupt enable */
14490fccb52SAndrzej Pietrasiewicz 	u32	frindex;	/* Frame index */
14590fccb52SAndrzej Pietrasiewicz 	u32	reserved1[1];
14690fccb52SAndrzej Pietrasiewicz 	u32	deviceaddr;	/* Device Address */
14790fccb52SAndrzej Pietrasiewicz 	u32	eplistaddr;	/* Endpoint List Address */
14890fccb52SAndrzej Pietrasiewicz 	u32	ttctrl;		/* HOST TT status and control */
14990fccb52SAndrzej Pietrasiewicz 	u32	burstsize;	/* Programmable Burst Size */
15090fccb52SAndrzej Pietrasiewicz 	u32	txfilltuning;	/* Host Transmit Pre-Buffer Packet Tuning */
15190fccb52SAndrzej Pietrasiewicz 	u32	reserved[4];
15290fccb52SAndrzej Pietrasiewicz 	u32	epnak;		/* Endpoint NAK */
15390fccb52SAndrzej Pietrasiewicz 	u32	epnaken;	/* Endpoint NAK Enable */
15490fccb52SAndrzej Pietrasiewicz 	u32	configflag;	/* Configured Flag register */
15590fccb52SAndrzej Pietrasiewicz 	u32	portsc[VUSBHS_MAX_PORTS]; /* Port Status/Control x, x = 1..8 */
15690fccb52SAndrzej Pietrasiewicz 	u32	otgsc;
15790fccb52SAndrzej Pietrasiewicz 	u32	usbmode;	/* USB Host/Device mode */
15890fccb52SAndrzej Pietrasiewicz 	u32	epsetupstat;	/* Endpoint Setup Status */
15990fccb52SAndrzej Pietrasiewicz 	u32	epprime;	/* Endpoint Initialize */
16090fccb52SAndrzej Pietrasiewicz 	u32	epflush;	/* Endpoint De-initialize */
16190fccb52SAndrzej Pietrasiewicz 	u32	epstatus;	/* Endpoint Status */
16290fccb52SAndrzej Pietrasiewicz 	u32	epcomplete;	/* Endpoint Interrupt On Complete */
16390fccb52SAndrzej Pietrasiewicz 	u32	epctrlx[16];	/* Endpoint Control, where x = 0.. 15 */
16490fccb52SAndrzej Pietrasiewicz 	u32	mcr;		/* Mux Control */
16590fccb52SAndrzej Pietrasiewicz 	u32	isr;		/* Interrupt Status */
16690fccb52SAndrzej Pietrasiewicz 	u32	ier;		/* Interrupt Enable */
16790fccb52SAndrzej Pietrasiewicz };
16890fccb52SAndrzej Pietrasiewicz 
16990fccb52SAndrzej Pietrasiewicz struct mv_udc {
17090fccb52SAndrzej Pietrasiewicz 	struct usb_gadget		gadget;
17190fccb52SAndrzej Pietrasiewicz 	struct usb_gadget_driver	*driver;
17290fccb52SAndrzej Pietrasiewicz 	spinlock_t			lock;
17390fccb52SAndrzej Pietrasiewicz 	struct completion		*done;
17490fccb52SAndrzej Pietrasiewicz 	struct platform_device		*dev;
17590fccb52SAndrzej Pietrasiewicz 	int				irq;
17690fccb52SAndrzej Pietrasiewicz 
17790fccb52SAndrzej Pietrasiewicz 	struct mv_cap_regs __iomem	*cap_regs;
17890fccb52SAndrzej Pietrasiewicz 	struct mv_op_regs __iomem	*op_regs;
17990fccb52SAndrzej Pietrasiewicz 	void __iomem                    *phy_regs;
18090fccb52SAndrzej Pietrasiewicz 	unsigned int			max_eps;
18190fccb52SAndrzej Pietrasiewicz 	struct mv_dqh			*ep_dqh;
18290fccb52SAndrzej Pietrasiewicz 	size_t				ep_dqh_size;
18390fccb52SAndrzej Pietrasiewicz 	dma_addr_t			ep_dqh_dma;
18490fccb52SAndrzej Pietrasiewicz 
18590fccb52SAndrzej Pietrasiewicz 	struct dma_pool			*dtd_pool;
18690fccb52SAndrzej Pietrasiewicz 	struct mv_ep			*eps;
18790fccb52SAndrzej Pietrasiewicz 
18890fccb52SAndrzej Pietrasiewicz 	struct mv_dtd			*dtd_head;
18990fccb52SAndrzej Pietrasiewicz 	struct mv_dtd			*dtd_tail;
19090fccb52SAndrzej Pietrasiewicz 	unsigned int			dtd_entries;
19190fccb52SAndrzej Pietrasiewicz 
19290fccb52SAndrzej Pietrasiewicz 	struct mv_req			*status_req;
19390fccb52SAndrzej Pietrasiewicz 	struct usb_ctrlrequest		local_setup_buff;
19490fccb52SAndrzej Pietrasiewicz 
19590fccb52SAndrzej Pietrasiewicz 	unsigned int		resume_state;	/* USB state to resume */
19690fccb52SAndrzej Pietrasiewicz 	unsigned int		usb_state;	/* USB current state */
19790fccb52SAndrzej Pietrasiewicz 	unsigned int		ep0_state;	/* Endpoint zero state */
19890fccb52SAndrzej Pietrasiewicz 	unsigned int		ep0_dir;
19990fccb52SAndrzej Pietrasiewicz 
20090fccb52SAndrzej Pietrasiewicz 	unsigned int		dev_addr;
20190fccb52SAndrzej Pietrasiewicz 	unsigned int		test_mode;
20290fccb52SAndrzej Pietrasiewicz 
20390fccb52SAndrzej Pietrasiewicz 	int			errors;
20490fccb52SAndrzej Pietrasiewicz 	unsigned		softconnect:1,
20590fccb52SAndrzej Pietrasiewicz 				vbus_active:1,
20690fccb52SAndrzej Pietrasiewicz 				remote_wakeup:1,
20790fccb52SAndrzej Pietrasiewicz 				softconnected:1,
20890fccb52SAndrzej Pietrasiewicz 				force_fs:1,
20990fccb52SAndrzej Pietrasiewicz 				clock_gating:1,
21090fccb52SAndrzej Pietrasiewicz 				active:1,
21190fccb52SAndrzej Pietrasiewicz 				stopped:1;      /* stop bit is setted */
21290fccb52SAndrzej Pietrasiewicz 
21390fccb52SAndrzej Pietrasiewicz 	struct work_struct	vbus_work;
21490fccb52SAndrzej Pietrasiewicz 	struct workqueue_struct *qwork;
21590fccb52SAndrzej Pietrasiewicz 
21690fccb52SAndrzej Pietrasiewicz 	struct usb_phy		*transceiver;
21790fccb52SAndrzej Pietrasiewicz 
21890fccb52SAndrzej Pietrasiewicz 	struct mv_usb_platform_data     *pdata;
21990fccb52SAndrzej Pietrasiewicz 
22090fccb52SAndrzej Pietrasiewicz 	/* some SOC has mutiple clock sources for USB*/
22190fccb52SAndrzej Pietrasiewicz 	struct clk      *clk;
22290fccb52SAndrzej Pietrasiewicz };
22390fccb52SAndrzej Pietrasiewicz 
22490fccb52SAndrzej Pietrasiewicz /* endpoint data structure */
22590fccb52SAndrzej Pietrasiewicz struct mv_ep {
22690fccb52SAndrzej Pietrasiewicz 	struct usb_ep		ep;
22790fccb52SAndrzej Pietrasiewicz 	struct mv_udc		*udc;
22890fccb52SAndrzej Pietrasiewicz 	struct list_head	queue;
22990fccb52SAndrzej Pietrasiewicz 	struct mv_dqh		*dqh;
23090fccb52SAndrzej Pietrasiewicz 	u32			direction;
23190fccb52SAndrzej Pietrasiewicz 	char			name[14];
23290fccb52SAndrzej Pietrasiewicz 	unsigned		stopped:1,
23390fccb52SAndrzej Pietrasiewicz 				wedge:1,
23490fccb52SAndrzej Pietrasiewicz 				ep_type:2,
23590fccb52SAndrzej Pietrasiewicz 				ep_num:8;
23690fccb52SAndrzej Pietrasiewicz };
23790fccb52SAndrzej Pietrasiewicz 
23890fccb52SAndrzej Pietrasiewicz /* request data structure */
23990fccb52SAndrzej Pietrasiewicz struct mv_req {
24090fccb52SAndrzej Pietrasiewicz 	struct usb_request	req;
24190fccb52SAndrzej Pietrasiewicz 	struct mv_dtd		*dtd, *head, *tail;
24290fccb52SAndrzej Pietrasiewicz 	struct mv_ep		*ep;
24390fccb52SAndrzej Pietrasiewicz 	struct list_head	queue;
24490fccb52SAndrzej Pietrasiewicz 	unsigned int            test_mode;
24590fccb52SAndrzej Pietrasiewicz 	unsigned		dtd_count;
24690fccb52SAndrzej Pietrasiewicz 	unsigned		mapped:1;
24790fccb52SAndrzej Pietrasiewicz };
24890fccb52SAndrzej Pietrasiewicz 
24990fccb52SAndrzej Pietrasiewicz #define EP_QUEUE_HEAD_MULT_POS			30
25090fccb52SAndrzej Pietrasiewicz #define EP_QUEUE_HEAD_ZLT_SEL			0x20000000
25190fccb52SAndrzej Pietrasiewicz #define EP_QUEUE_HEAD_MAX_PKT_LEN_POS		16
25290fccb52SAndrzej Pietrasiewicz #define EP_QUEUE_HEAD_MAX_PKT_LEN(ep_info)	(((ep_info)>>16)&0x07ff)
25390fccb52SAndrzej Pietrasiewicz #define EP_QUEUE_HEAD_IOS			0x00008000
25490fccb52SAndrzej Pietrasiewicz #define EP_QUEUE_HEAD_NEXT_TERMINATE		0x00000001
25590fccb52SAndrzej Pietrasiewicz #define EP_QUEUE_HEAD_IOC			0x00008000
25690fccb52SAndrzej Pietrasiewicz #define EP_QUEUE_HEAD_MULTO			0x00000C00
25790fccb52SAndrzej Pietrasiewicz #define EP_QUEUE_HEAD_STATUS_HALT		0x00000040
25890fccb52SAndrzej Pietrasiewicz #define EP_QUEUE_HEAD_STATUS_ACTIVE		0x00000080
25990fccb52SAndrzej Pietrasiewicz #define EP_QUEUE_CURRENT_OFFSET_MASK		0x00000FFF
26090fccb52SAndrzej Pietrasiewicz #define EP_QUEUE_HEAD_NEXT_POINTER_MASK		0xFFFFFFE0
26190fccb52SAndrzej Pietrasiewicz #define EP_QUEUE_FRINDEX_MASK			0x000007FF
26290fccb52SAndrzej Pietrasiewicz #define EP_MAX_LENGTH_TRANSFER			0x4000
26390fccb52SAndrzej Pietrasiewicz 
26490fccb52SAndrzej Pietrasiewicz struct mv_dqh {
26590fccb52SAndrzej Pietrasiewicz 	/* Bits 16..26 Bit 15 is Interrupt On Setup */
26690fccb52SAndrzej Pietrasiewicz 	u32	max_packet_length;
26790fccb52SAndrzej Pietrasiewicz 	u32	curr_dtd_ptr;		/* Current dTD Pointer */
26890fccb52SAndrzej Pietrasiewicz 	u32	next_dtd_ptr;		/* Next dTD Pointer */
26990fccb52SAndrzej Pietrasiewicz 	/* Total bytes (16..30), IOC (15), INT (8), STS (0-7) */
27090fccb52SAndrzej Pietrasiewicz 	u32	size_ioc_int_sts;
27190fccb52SAndrzej Pietrasiewicz 	u32	buff_ptr0;		/* Buffer pointer Page 0 (12-31) */
27290fccb52SAndrzej Pietrasiewicz 	u32	buff_ptr1;		/* Buffer pointer Page 1 (12-31) */
27390fccb52SAndrzej Pietrasiewicz 	u32	buff_ptr2;		/* Buffer pointer Page 2 (12-31) */
27490fccb52SAndrzej Pietrasiewicz 	u32	buff_ptr3;		/* Buffer pointer Page 3 (12-31) */
27590fccb52SAndrzej Pietrasiewicz 	u32	buff_ptr4;		/* Buffer pointer Page 4 (12-31) */
27690fccb52SAndrzej Pietrasiewicz 	u32	reserved1;
27790fccb52SAndrzej Pietrasiewicz 	/* 8 bytes of setup data that follows the Setup PID */
27890fccb52SAndrzej Pietrasiewicz 	u8	setup_buffer[8];
27990fccb52SAndrzej Pietrasiewicz 	u32	reserved2[4];
28090fccb52SAndrzej Pietrasiewicz };
28190fccb52SAndrzej Pietrasiewicz 
28290fccb52SAndrzej Pietrasiewicz 
28390fccb52SAndrzej Pietrasiewicz #define DTD_NEXT_TERMINATE		(0x00000001)
28490fccb52SAndrzej Pietrasiewicz #define DTD_IOC				(0x00008000)
28590fccb52SAndrzej Pietrasiewicz #define DTD_STATUS_ACTIVE		(0x00000080)
28690fccb52SAndrzej Pietrasiewicz #define DTD_STATUS_HALTED		(0x00000040)
28790fccb52SAndrzej Pietrasiewicz #define DTD_STATUS_DATA_BUFF_ERR	(0x00000020)
28890fccb52SAndrzej Pietrasiewicz #define DTD_STATUS_TRANSACTION_ERR	(0x00000008)
28990fccb52SAndrzej Pietrasiewicz #define DTD_RESERVED_FIELDS		(0x00007F00)
29090fccb52SAndrzej Pietrasiewicz #define DTD_ERROR_MASK			(0x68)
29190fccb52SAndrzej Pietrasiewicz #define DTD_ADDR_MASK			(0xFFFFFFE0)
29290fccb52SAndrzej Pietrasiewicz #define DTD_PACKET_SIZE			0x7FFF0000
29390fccb52SAndrzej Pietrasiewicz #define DTD_LENGTH_BIT_POS		(16)
29490fccb52SAndrzej Pietrasiewicz 
29590fccb52SAndrzej Pietrasiewicz struct mv_dtd {
29690fccb52SAndrzej Pietrasiewicz 	u32	dtd_next;
29790fccb52SAndrzej Pietrasiewicz 	u32	size_ioc_sts;
29890fccb52SAndrzej Pietrasiewicz 	u32	buff_ptr0;		/* Buffer pointer Page 0 */
29990fccb52SAndrzej Pietrasiewicz 	u32	buff_ptr1;		/* Buffer pointer Page 1 */
30090fccb52SAndrzej Pietrasiewicz 	u32	buff_ptr2;		/* Buffer pointer Page 2 */
30190fccb52SAndrzej Pietrasiewicz 	u32	buff_ptr3;		/* Buffer pointer Page 3 */
30290fccb52SAndrzej Pietrasiewicz 	u32	buff_ptr4;		/* Buffer pointer Page 4 */
30390fccb52SAndrzej Pietrasiewicz 	u32	scratch_ptr;
30490fccb52SAndrzej Pietrasiewicz 	/* 32 bytes */
30590fccb52SAndrzej Pietrasiewicz 	dma_addr_t td_dma;		/* dma address for this td */
30690fccb52SAndrzej Pietrasiewicz 	struct mv_dtd *next_dtd_virt;
30790fccb52SAndrzej Pietrasiewicz };
30890fccb52SAndrzej Pietrasiewicz 
30990fccb52SAndrzej Pietrasiewicz #endif
310