/* Copyright (c) 2013-2016, The Linux Foundation. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are
 * met:
 *     * Redistributions of source code must retain the above copyright
 *       notice, this list of conditions and the following disclaimer.
 *     * Redistributions in binary form must reproduce the above
 *       copyright notice, this list of conditions and the following
 *       disclaimer in the documentation and/or other materials provided
 *       with the distribution.
 *     * Neither the name of The Linux Foundation nor the names of its
 *       contributors may be used to endorse or promote products derived
 *       from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
 * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
 * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

/* This file implements the UDC (usb device controller) layer to be used with
 * the new dwc controller.
 * It exposes APIs to initialize UDC (and thus usb) and perform data transfer
 * over usb.
 */

#include <reg.h>
#include <debug.h>
#include <string.h>
#include <malloc.h>
#include <stdlib.h>
#include <arch/defines.h>
#include <dev/udc.h>
#include <platform/iomap.h>
#include <usb30_dwc.h>
#include <usb30_wrapper.h>
#include <usb30_udc.h>
#include <smem.h>
#include <board.h>
#include <platform/timer.h>
#include <qmp_phy.h>
#include <usb30_dwc_hw.h>

//#define DEBUG_USB

#ifdef DEBUG_USB
#define DBG(...) dprintf(ALWAYS, __VA_ARGS__)
#else
#define DBG(...)
#endif

#define ERR(...) dprintf(ALWAYS, __VA_ARGS__)

/* control data transfer is max 512 bytes */
#define UDC_CONTROL_RX_BUF_SIZE     512
#define UDC_CONTROL_TX_BUF_SIZE     512

/* Buffer used by dwc driver to process events.
 * Must be multiple of 4: snps 6.2.7.2.
 */
#define UDC_DWC_EVENT_BUF_SIZE     4096

/* macro to parse setup request */
#define SETUP(type,request) (((type) << 8) | (request))

/* macro to generate bit representation of an EP */
#define EPT_TX(n) (1 << ((n) + 16))
#define EPT_RX(n) (1 << (n))

/* Macro for bulk SS EP descriptors */
#define EP_BULK_IN_INDEX          21
#define EP_BULK_OUT_INDEX         34

/* Local functions */
static struct udc_descriptor *udc_descriptor_alloc(uint32_t type,
												   uint32_t num,
												   uint32_t len,
												   udc_desc_spec_t spec);
static uint8_t udc_string_desc_alloc(udc_t *udc, const char *str);

static void udc_descriptor_register(udc_t *udc, struct udc_descriptor *desc);
static void udc_register_language_desc(udc_t *udc);
static void udc_register_bos_desc(udc_t *udc);
static void udc_register_device_desc_usb_20(udc_t *udc, struct udc_device *dev_info);
static void udc_register_device_desc_usb_30(udc_t *udc, struct udc_device *dev_info);
static void udc_register_config_desc_usb20(udc_t *udc, struct udc_gadget *gadget, uint8_t type);
static void udc_register_config_desc_usb30(udc_t *udc, struct udc_gadget *gadget);

static void udc_ept_desc_fill(struct udc_endpoint *ept, uint8_t *data, uint8_t type);
static void udc_ept_comp_desc_fill(struct udc_endpoint *ept, uint8_t *data);

static void udc_dwc_notify(void *context, dwc_notify_event_t event);
static int udc_handle_setup(void *context, uint8_t *data);
static bool stall_ep;
static bool udc_other_speed_cfg;
static bool udc_ss_capable;

/* TODO: This must be the only global var in this file, for now.
 * Ideally, all APIs should be sending
 * this to us and this ptr should be kept outside of this code.
 * This needs change in the common udc APIs and thus keeping it here until that
 * is done.
 */
static udc_t *udc_dev = NULL;


__WEAK int platform_is_8974()
{
	return 0;
}

__WEAK int platform_is_8974Pro()
{
	return 0;
}

static void phy_reset(usb_wrapper_dev_t *wrapper, struct udc_device *dev_info)
{
	/* phy reset is different for some platforms. */
	if (platform_is_8974() || platform_is_8974Pro())
	{
		/* SS PHY */
		usb_wrapper_ss_phy_reset(wrapper);

		/* For 8974: hs phy is reset as part of soft reset.
		 * No need for explicit reset.
		 */
	}
	else
	{
		if (dev_info->t_usb_if->phy_reset)
			dev_info->t_usb_if->phy_reset();

		/* On some CDPs PHY_COMMON reset does not set
		 * reset values in the phy_ctrl_common register.
		 * Due to this USB does not get enumerated in fastboot
		 * Force write the reset value
		 */
		if (board_platform_id() == APQ8084)
			usb_wrapper_hs_phy_ctrl_force_write(wrapper);
	}
}

/* Initialize HS phy */
void hs_phy_init(udc_t *dev)
{
	/* only for 8974 */
	if (platform_is_8974() || platform_is_8974Pro())
	{
		/* 5.a, 5.b */
		usb_wrapper_hs_phy_init(dev->wrapper_dev);

		/* 5.d */
		dwc_usb2_phy_soft_reset(dev->dwc);
	}
}

/* vbus override */
void vbus_override(udc_t *dev)
{
	/* when vbus signal is not available directly to the controller,
	 * simulate vbus presense.
	 */
	usb_wrapper_vbus_override(dev->wrapper_dev);
}


/* Initialize usb wrapper and dwc h/w blocks. */
static void usb30_init(struct udc_device *dev_info)
{
	usb_wrapper_dev_t* wrapper;
	usb_wrapper_config_t wrapper_config;

	dwc_dev_t *dwc;
	dwc_config_t dwc_config;

	/* initialize usb clocks */
	if (dev_info->t_usb_if->clock_init)
		dev_info->t_usb_if->clock_init();

	/* initialize the usb wrapper h/w block */
	wrapper_config.qscratch_base = (void*) MSM_USB30_QSCRATCH_BASE;

	wrapper = usb_wrapper_init(&wrapper_config);
	ASSERT(wrapper);

	/* save the wrapper ptr */
	udc_dev->wrapper_dev = wrapper;

	/* initialize the dwc device block */
	dwc_config.base           = (void*) MSM_USB30_BASE;

	/* buffer must be aligned to buf size. snps 8.2.2 */
	dwc_config.event_buf      = memalign(lcm(CACHE_LINE, UDC_DWC_EVENT_BUF_SIZE),
										 ROUNDUP(UDC_DWC_EVENT_BUF_SIZE, CACHE_LINE));
	ASSERT(dwc_config.event_buf);

	dwc_config.event_buf_size = UDC_DWC_EVENT_BUF_SIZE;

	/* notify handler */
	dwc_config.notify_context = udc_dev;
	dwc_config.notify         = udc_dwc_notify;

	/* setup handler */
	dwc_config.setup_context = udc_dev;
	dwc_config.setup_handler = udc_handle_setup;

	dwc = dwc_init(&dwc_config);
	ASSERT(dwc);

	/* save the dwc dev ptr */
	udc_dev->dwc = dwc;


	/* USB3.0 core and phy initialization as described in HPG */

	/* section 4.4.1 Control sequence */
	usb_wrapper_dbm_mode(wrapper, DBM_MODE_BYPASS);

	/* section 4.4.1: use config 0 - all of RAM1 */
	usb_wrapper_ram_configure(wrapper);

	/* section 4.4.2: Initialization and configuration sequences */

	/* 1. UTMI Mux configuration */
	if (dev_info->t_usb_if->mux_config)
		dev_info->t_usb_if->mux_config();

	/* 2. Put controller in reset */
	dwc_reset(dwc, 1);


	/* Steps 3 - 7 must be done while dwc is in reset condition */

	/* 3. Reset PHY */
	phy_reset(wrapper, dev_info);

	/* 4. SS phy config */
	if (!use_hsonly_mode())
		usb_wrapper_ss_phy_configure(wrapper);

	/* 5. HS phy init */
	usb_wrapper_hs_phy_init(wrapper);

	/* 6. hs phy config */
	usb_wrapper_hs_phy_configure(wrapper);

	/* 7. Reset PHY digital interface */
	dwc_phy_digital_reset(dwc);

	/* 8. Bring dwc controller out of reset */
	dwc_reset(dwc, 0);

	/* 9. */
	usb_wrapper_ss_phy_electrical_config(wrapper);

	/* Perform phy init */
	if (dev_info->t_usb_if->phy_init)
		dev_info->t_usb_if->phy_init();

	/* HS only mode support */
	if (use_hsonly_mode())
		usb_wrapper_hsonly_mode(wrapper);

	/* 10. */
	usb_wrapper_workaround_10(wrapper);

	/* 11. */
	usb_wrapper_workaround_11(wrapper);

	/* 12. */
	dwc_ss_phy_workaround_12(dwc);

	/* 13. */
	usb_wrapper_workaround_13(wrapper);

	/* 14. needed only for host mode. ignored. */

	/* If the target does not support vbus detection in controller,
	 * simulate vbus presence.
	 */
	if (dev_info->t_usb_if->vbus_override)
		vbus_override(udc_dev);

	/* 15 - 20 */
	dwc_device_init(dwc);
}

/* udc_init: creates and registers various usb descriptor */
int usb30_udc_init(struct udc_device *dev_info)
{
	/* create and initialize udc instance */
	udc_dev = (udc_t*) malloc(sizeof(udc_t));
	ASSERT(udc_dev);

	/* initialize everything to 0 */
	memset(udc_dev, 0 , sizeof(udc_t));

	/* malloc control data buffers */
	udc_dev->ctrl_rx_buf = memalign(CACHE_LINE, ROUNDUP(UDC_CONTROL_RX_BUF_SIZE, CACHE_LINE));
	ASSERT(udc_dev->ctrl_rx_buf);

	udc_dev->ctrl_tx_buf = memalign(CACHE_LINE, ROUNDUP(UDC_CONTROL_TX_BUF_SIZE, CACHE_LINE));
	ASSERT(udc_dev->ctrl_tx_buf);

	/* initialize string id */
	udc_dev->next_string_id  = 1;

	/* Initialize ept data */
	/* alloc table to assume EP0 In/OUT are already allocated.*/
	udc_dev->ept_alloc_table = EPT_TX(0) | EPT_RX(0);
	udc_dev->ept_list        = NULL;

	usb30_init(dev_info);

	/* register descriptors */
	udc_register_language_desc(udc_dev);
	udc_register_device_desc_usb_20(udc_dev, dev_info);
	udc_register_device_desc_usb_30(udc_dev, dev_info);
	udc_register_bos_desc(udc_dev);

	return 0;
}

/* application registers its gadget by calling this func.
 * gadget == interface descriptor
 */
int usb30_udc_register_gadget(struct udc_gadget *gadget)
{
	ASSERT(gadget);

	/* check if already registered */
	if (udc_dev->gadget)
	{
		ERR("\nonly one gadget supported\n");
		return -1;
	}

	/* create our configuration descriptors based on this gadget data */
	udc_register_config_desc_usb20(udc_dev, gadget, TYPE_CONFIGURATION);
	udc_register_config_desc_usb30(udc_dev, gadget);

	/* save the gadget */
	udc_dev->gadget = gadget;

	return 0;
}

/* udc_start: */
int usb30_udc_start(void)
{
	/* 19. run
	 * enable device to receive SOF packets and
	 * respond to control transfers on EP0 and generate events.
	 */
	dwc_device_run(udc_dev->dwc, 1);

	return 0;
}

/* Control data rx callback. Called by DWC layer when it receives control
 * data from host.
 */
void udc_control_rx_callback(void *context, unsigned actual, int status)
{
	udc_t *udc = (udc_t *) context;

	/* Force reload of buffer update by controller from memory */
	arch_invalidate_cache_range((addr_t) udc->ctrl_rx_buf, actual);

	/* TODO: for now, there is only one 3-stage write during 3.0 enumeration
	 * (SET_SEL), which causes this callback. Ideally, set_periodic() must
	 * be based on which control rx just happened.
	 * Also, the value of 0x65 should depend on the data received for SET_SEL.
	 * For now, this value works just fine.
	 */
	dwc_device_set_periodic_param(udc->dwc, 0x65);
}

/* lookup request name for debug purposes */
static const char *reqname(uint32_t r)
{
	switch (r) {
	case GET_STATUS:
		return "GET_STATUS";
	case CLEAR_FEATURE:
		return "CLEAR_FEATURE";
	case SET_FEATURE:
		return "SET_FEATURE";
	case SET_ADDRESS:
		return "SET_ADDRESS";
	case GET_DESCRIPTOR:
		return "GET_DESCRIPTOR";
	case SET_DESCRIPTOR:
		return "SET_DESCRIPTOR";
	case GET_CONFIGURATION:
		return "GET_CONFIGURATION";
	case SET_CONFIGURATION:
		return "SET_CONFIGURATION";
	case GET_INTERFACE:
		return "GET_INTERFACE";
	case SET_INTERFACE:
		return "SET_INTERFACE";
	case SET_SEL:
		return "SET_SEL";
	default:
		return "*UNKNOWN*";
	}
}

/* callback function called by DWC layer when a setup packed is received.
 * the return value tells dwc layer whether this setup pkt results in
 * a 2-stage or a 3-stage control transfer or stall.
 */
static int udc_handle_setup(void *context, uint8_t *data)
{
	udc_t *udc = (udc_t *) context;
	uint32_t len;

	ASSERT(udc);

	dwc_dev_t *dwc = udc->dwc;
	ASSERT(dwc);

	struct setup_packet s = *((struct setup_packet*) data);

	DBG("\n SETUP request: \n type    = 0x%x \n request = 0x%x \n value  = 0x%x"
		" \n index   = 0x%x \n length  = 0x%x\n",
		s.type, s.request, s.value, s.index, s.length);

	switch (SETUP(s.type, s.request))
	{
	case SETUP(ENDPOINT_READ, GET_STATUS):
	case SETUP(INTERFACE_READ, GET_STATUS):
	case SETUP(DEVICE_READ, GET_STATUS):
		{
			if (s.length == 2) {

				uint16_t status = 0;
				if (s.type == DEVICE_READ || (s.type == ENDPOINT_READ && stall_ep == true))
					status = 1; /* Self-powered is set for device read and Halt bit set for end point read */

				len = 2;

				if (udc->usb_state == UDC_CONFIGURED_STATE && udc->speed == UDC_SPEED_SS)
				{
					if (s.type == DEVICE_READ && dwc_device_u1_enabled(dwc))
						status |= (1 << 2); /* Set D2 to indicate U1 is enabled */
					if (s.type == DEVICE_READ && dwc_device_u2_enabled(dwc))
						status |= (1 << 3); /* Set D3 to indicate U3 is enabled */
				}

				/* copy to tx buffer */
				memcpy(udc->ctrl_tx_buf, &status, len);

				/* flush buffer to main memory before queueing the request */
				arch_clean_invalidate_cache_range((addr_t) udc->ctrl_tx_buf, len);

				dwc_transfer_request(udc->dwc,
									 0,
									 DWC_EP_DIRECTION_IN,
									 udc->ctrl_tx_buf,
									 len,
									 NULL,
									 NULL);

				return DWC_SETUP_3_STAGE;
			}
		}
		break;
	case SETUP(DEVICE_READ, GET_DESCRIPTOR):
		{
			DBG("\n DEVICE_READ : GET_DESCRIPTOR: value = %x\n", s.value);

			/* setup usb ep0-IN to send our device descriptor */
			struct udc_descriptor *desc;
			/* Device Qualifier */
			if (((s.value >> 8) == TYPE_DEVICE_QUALIFIER) && (udc->speed != UDC_SPEED_SS))
			{
				struct usb_qualifier_desc qual = {0};
				qual.bLength = sizeof(qual);
				qual.bDescriptorType = TYPE_DEVICE_QUALIFIER;
				qual.bcdUSB = 0x0200; /* USB2.0 version */
				qual.bDeviceClass = udc_dev->gadget->ifc_class;
				qual.bDeviceSubClass = udc_dev->gadget->ifc_subclass;
				qual.bDeviceProtocol = udc_dev->gadget->ifc_protocol;
				qual.bMaxPacketSize0 = (udc_dev->speed == UDC_SPEED_HS) ? 64 : 512;
				qual.bNumConfigurations = 1;
				qual.bReserved          = 0;

				if (sizeof(qual) > s.length)
					len = s.length;
				else
					len = sizeof(qual);

				/* copy to tx buffer */
				memcpy(udc->ctrl_tx_buf, (void *)&qual, len);

				/* flush buffer to main memory before queueing the request */
				arch_clean_invalidate_cache_range((addr_t) udc->ctrl_tx_buf, len);

				dwc_transfer_request(udc->dwc,
									 0,
									 DWC_EP_DIRECTION_IN,
									 udc->ctrl_tx_buf,
									 len,
									 NULL,
									 NULL);

				return DWC_SETUP_3_STAGE;
			}
			if (((s.value >> 8) == TYPE_OTHER_SPEED_CONFIG) && (udc->speed != UDC_SPEED_SS)) /* Other speed config */
			{
				if (!udc_other_speed_cfg)
				{
					udc_register_config_desc_usb20(udc, udc->gadget, TYPE_OTHER_SPEED_CONFIG);
					udc_other_speed_cfg = true;
				}
			}

			for (desc = udc->desc_list; desc; desc = desc->next)
			{
				/* tag must match the value AND
				 * if speed is SS, desc must comply with 30 spec OR
				 * if speed is not SS, desc must comply with 20 spec.
				 */
				if ((desc->tag == s.value) &&
					(((udc->speed == UDC_SPEED_SS) && (desc->spec & UDC_DESC_SPEC_30)) ||
					  ((udc->speed != UDC_SPEED_SS) && (desc->spec & UDC_DESC_SPEC_20)))
					)
				{
					if (desc->len > s.length)
						len = s.length;
					else
						len = desc->len;

					/* copy to tx buffer */
					memcpy(udc->ctrl_tx_buf, desc->data, len);

					/* flush buffer to main memory before queueing the request */
					arch_clean_invalidate_cache_range((addr_t) udc->ctrl_tx_buf, len);

					dwc_transfer_request(udc->dwc,
										 0,
										 DWC_EP_DIRECTION_IN,
										 udc->ctrl_tx_buf,
										 len,
										 NULL,
										 NULL);

					return DWC_SETUP_3_STAGE;
				}
			}
			DBG("\n Did not find matching descriptor: = 0x%x", s.value);
		}
		break;
	case SETUP(DEVICE_READ, GET_CONFIGURATION):
		{
			DBG("\n DEVICE_READ : GET_CONFIGURATION");

			if ((s.value == 0) && (s.index == 0) && (s.length == 1)) {

				len = 1;

				/* copy to tx buffer */
				memcpy(udc->ctrl_tx_buf, &udc->config_selected, len);

				/* flush buffer to main memory before queueing the request */
				arch_clean_invalidate_cache_range((addr_t) udc->ctrl_tx_buf, len);

				dwc_transfer_request(udc->dwc,
									 0,
									 DWC_EP_DIRECTION_IN,
									 udc->ctrl_tx_buf,
									 len,
									 NULL,
									 NULL);

				return DWC_SETUP_3_STAGE;
			}
			else
			{
				ASSERT(0);
			}
		}
		break;
	case SETUP(DEVICE_WRITE, SET_CONFIGURATION):
		{
			DBG("\n DEVICE_WRITE : SET_CONFIGURATION");

			/* select configuration 1 */
			/* Return the config if configuration value is not 0 and move the state to
			 * configured state
			 */
			if (s.value) {
				struct udc_endpoint *ept;
				/* enable endpoints */
				for (ept = udc->ept_list; ept; ept = ept->next) {
					if (ept->num == 0)
						continue;
					else
					{
						/* add this ep to dwc ep list */
						dwc_ep_t *ep = (dwc_ep_t *) malloc(sizeof(dwc_ep_t));

						if(!ep)
						{
							dprintf(CRITICAL, "udc_handle_setup: DEVICE_WRITE : SET_CONFIGURATION malloc failed for ep\n");
							ASSERT(0);
						}

						ep->number        = ept->num;
						ep->dir           = ept->in;
						ep->type          = ept->type;
						ep->max_pkt_size  = ept->maxpkt;
						ep->burst_size    = ept->maxburst;
						ep->zlp           = 0;
						ep->trb_count     = ept->trb_count;
						ep->trb           = ept->trb;

						dwc_device_add_ep(dwc, ep);

						if(ep)
							free(ep);
					}
				}

				/* now that we have saved the non-control EP details, set config */
				dwc_device_set_configuration(dwc);
				if (udc->speed == UDC_SPEED_SS)
					dwc_device_accept_u1u2(dwc);

				/* inform client that we are configured. */
				udc->gadget->notify(udc_dev->gadget, UDC_EVENT_ONLINE);

				udc->config_selected = 1;
				udc->usb_state = UDC_CONFIGURED_STATE;
				return DWC_SETUP_2_STAGE;
			}
			else if (s.value == 0)
			{
				/* 0 == de-configure. */
				udc->config_selected = 0;
				DBG("\n\n CONFIG = 0 !!!!!!!!!\n\n");
				/* If config value is '0' change the state to addressed state */
				udc->usb_state = UDC_ADDRESSED_STATE;
				return DWC_SETUP_2_STAGE;
			}
		}
		break;
	case SETUP(DEVICE_WRITE, SET_ADDRESS):
		{
			DBG("\n DEVICE_WRITE : SET_ADDRESS");

			dwc_device_set_addr(dwc, s.value);
			udc->usb_state = UDC_ADDRESSED_STATE;
			return DWC_SETUP_2_STAGE;
		}
		break;
	case SETUP(INTERFACE_WRITE, SET_INTERFACE):
		{
			DBG("\n INTERFACE_WRITE : SET_INTERFACE");
			/* if we ack this everything hangs */
			/* per spec, STALL is valid if there is not alt func */
			goto stall;
		}
		break;
	case SETUP(INTERFACE_WRITE, SET_FEATURE):
		{
			DBG("\n INTERFACE_WRITE : SET_FEATURE");
			if (s.value == FUNCTION_SUSPEND && udc->speed == UDC_SPEED_SS)
				return DWC_SETUP_2_STAGE;
		}
		break;
	case SETUP(INTERFACE_READ, GET_INTERFACE):
		{
			DBG("\n INTERFACE_READ : GET_INTERFACE");
			/* per spec, STALL is valid if there is not alt func */
			goto stall;
		}
		break;
	case SETUP(ENDPOINT_WRITE, SET_FEATURE):
		{
			DBG("\n ENDPOINT_WRITE : SET_FEATURE");
			if (s.value == ENDPOINT_HALT)
			{
				uint8_t usb_epnum;
				uint8_t dir;

				usb_epnum = (s.index & USB_EP_NUM_MASK);
				dir = ((s.index & USB_EP_DIR_MASK) == USB_EP_DIR_IN) ? 0x1 : 0x0;
				dwc_ep_cmd_stall(dwc, DWC_EP_PHY_NUM(usb_epnum, dir));
				stall_ep = true;
				return DWC_SETUP_2_STAGE;
			}
			else
				goto stall;
		}
	case SETUP(DEVICE_WRITE, SET_FEATURE):
		{
			DBG("\n DEVICE_WRITE : SET_FEATURE");

			if (s.value == TEST_MODE)
			{
				dwc->test_mode = s.index;

				switch(dwc->test_mode)
				{
				case TEST_J:
				case TEST_K:
				case TEST_SE0_NAK:
				case TEST_PACKET:
				case TEST_FORCE_ENABLE:
					/* Upper byte of Windex contain test mode */
					dwc->test_mode >>= 8;
					dwc->is_test_mode = true;
					break;
				default:
					DBG("\n Unknown test mode: %x\n", dwc->test_mode);
				}
				return DWC_SETUP_2_STAGE;
			}
			if (udc->usb_state == UDC_CONFIGURED_STATE && udc->speed == UDC_SPEED_SS)
			{
				/* Set U1 & U2 only in configured state */
				if (s.value == U1_ENABLE)
				{
					dwc_device_enable_u1(dwc, 1);
					return DWC_SETUP_2_STAGE;
				}
				if (s.value == U2_ENABLE)
				{
					dwc_device_enable_u2(dwc, 1);
					return DWC_SETUP_2_STAGE;
				}
			}
			goto stall;
		}
		break;
	case SETUP(DEVICE_WRITE, CLEAR_FEATURE):
		{
			DBG("\n DEVICE_WRITE : CLEAR_FEATURE");
			/* Clear U1 & U2 only in configured state */
			if (udc->usb_state == UDC_CONFIGURED_STATE && udc->speed == UDC_SPEED_SS)
			{
				if (s.value == U1_ENABLE)
				{
					dwc_device_enable_u1(dwc, 0);
					return DWC_SETUP_2_STAGE;
				}
				if (s.value == U2_ENABLE)
				{
					dwc_device_enable_u2(dwc, 0);
					return DWC_SETUP_2_STAGE;
				}
			}
			goto stall;
		}
		break;
	case SETUP(ENDPOINT_WRITE, CLEAR_FEATURE):
		{
			uint8_t usb_epnum;
			uint8_t dir;

			DBG("\n ENDPOINT_WRITE : CLEAR_FEATURE");

			/*
			 * setup packet received from the host has
			 * index field containing information about the USB
			 * endpoint as below:
			 *  __________________________________
			 * | (7)  |   (6 - 4)   |  (3 - 0)    |
			 * |DIR   |  Reserved   |  EP number  |
			 * |______|_____________|_____________|
			 */
			usb_epnum = (s.index & USB_EP_NUM_MASK);
			dir = ((s.index & USB_EP_DIR_MASK) == USB_EP_DIR_IN) ? 0x1 : 0x0;

			/*
			 * Convert the logical ep number to physical before
			 * sending the clear stall command.
			 * As per the data book we use fixed mapping as
			 * below:
			 * physical ep 0 --> logical ep0 OUT
			 * physical ep 1 --> logical ep0 IN
			 * physical ep 2 --> logical ep 1 OUT
			 * physical ep 3 --> logical ep 1 IN
			 * :
			 * :
			 * physical ep 30 --> logical ep 15 OUT
			 * physical ep 31 --> logical ep 15 IN
			 */
			dwc_ep_cmd_clear_stall(dwc, DWC_EP_PHY_NUM(usb_epnum, dir));
			stall_ep = false;

			return DWC_SETUP_2_STAGE;
		}
		break;
	case SETUP(DEVICE_WRITE, SET_SEL):
		{
			DBG("\n DEVICE_WRITE : SET_SEL");

			/* this is 3-stage write. need to receive data of s.length size. */
			if (s.length > 0) {
				dwc_transfer_request(udc->dwc,
									 0,
									 DWC_EP_DIRECTION_OUT,
									 udc->ctrl_rx_buf,
									 UDC_CONTROL_RX_BUF_SIZE,
									 udc_control_rx_callback,
									 (void *) udc);
				return DWC_SETUP_3_STAGE;
			}
			else
			{
				/* length must be non-zero */
				ASSERT(0);
			}
		}
		break;
	case SETUP(DEVICE_WRITE, SET_ISOCH_DELAY):
		{
			DBG("\n DEVICE_WRITE: SET_ISOCH_DELAY\n");
			return DWC_SETUP_2_STAGE;
		}
		break;
	default:
		/* some of the requests from host are not handled, add a debug
		 * for the command not being handled, this is not fatal
		 */
		DBG("\n Unknown setup req.\n type = 0x%x value = %d index = %d"
			" length = %d\n", s.type, s.value, s.index, s.length);
	}

stall:
	ERR("\nSTALL. Unsupported setup req: %s %d %d %d %d %d\n",
		reqname(s.request), s.type, s.request, s.value, s.index, s.length);

	return DWC_SETUP_ERROR;
}

/* Callback function called by DWC layer when a request to transfer data
 * on non-control EP is completed.
 */
void udc_request_complete(void *context, uint32_t actual, int status)
{
	struct udc_request *req = ((udc_t *) context)->queued_req;

	DBG("\n UDC: udc_request_callback: xferred %d bytes status = %d\n",
		actual, status);

	/* clear the queued request. */
	((udc_t *) context)->queued_req = NULL;

	if (req->complete)
	{
		req->complete(req, actual, status);
	}

	DBG("\n UDC: udc_request_callback: done fastboot callback\n");
}

/* App interface to queue in data transfer requests for control and data ep */
int usb30_udc_request_queue(struct udc_endpoint *ept, struct udc_request *req)
{
	int ret;
    dwc_dev_t *dwc_dev = udc_dev->dwc;

	/* ensure device is initialized before queuing request */
	ASSERT(dwc_dev);

	/* if device is not configured, return error */
	if(udc_dev->config_selected == 0)
	{
		return -1;
	}

	/* only one request at a time is supported.
	 * check if a request is already queued.
	 */
	if(udc_dev->queued_req)
	{
		return -1;
	}

	DBG("\n udc_request_queue: entry: ep_usb_num = %d", ept->num);

	/* save the queued request. */
	udc_dev->queued_req = req;

	ret = dwc_transfer_request(dwc_dev,
							   ept->num,
							   ept->in ? DWC_EP_DIRECTION_IN : DWC_EP_DIRECTION_OUT,
							   req->buf,
							   req->length,
							   udc_request_complete,
							   (void *) udc_dev);

	DBG("\n udc_request_queue: exit: ep_usb_num = %d", ept->num);

	return ret;
}

/* For HS device should have the version number as 0x0200.
 * Update the minor version to 0x00 when we receive the connect
 * event with HS or FS mode
 */
static void udc_update_usb20_desc(udc_t *udc)
{
	struct udc_descriptor *desc= NULL;
	if (udc_ss_capable)
		return;

	for (desc = udc->desc_list; desc; desc = desc->next)
	{
		if (desc->spec == UDC_DESC_SPEC_20 && desc->data[1] == TYPE_DEVICE)
			desc->data[2] = 0x00; /* usb spec minor rev */
	}
}

static void udc_update_ep_desc(udc_t *udc, uint16_t max_pkt_sz_bulk)
{
	struct udc_descriptor *desc= NULL;
	struct udc_endpoint *ept = NULL;

	/*
	 * By default the bulk EP are registered with 512 Bytes
	 * as the max packet size. As per SS spec the max packet
	 * size for bulk is 1024. Some hosts treat the descriptor
	 * as invalid if the packet size is < 1024. Update the
	 * descriptors once we are notifed with SS connect event
	 */
	for (desc = udc->desc_list; desc; desc = desc->next)
	{
		if (desc->data[EP_BULK_IN_INDEX] == EP_TYPE_BULK)
		{
			desc->data[EP_BULK_IN_INDEX + 1] = max_pkt_sz_bulk;
			desc->data[EP_BULK_IN_INDEX + 2]  = max_pkt_sz_bulk >> 8;
		}

		if (desc->data[EP_BULK_OUT_INDEX] == EP_TYPE_BULK)
		{
			desc->data[EP_BULK_OUT_INDEX + 1] = max_pkt_sz_bulk;
			desc->data[EP_BULK_OUT_INDEX + 2]  = max_pkt_sz_bulk >> 8;
		}
	}

	for (ept = udc->ept_list; ept; ept = ept->next)
	{
		ept->maxpkt = max_pkt_sz_bulk;
	}
}

/* callback function called by dwc layer if any dwc event occurs */
void udc_dwc_notify(void *context, dwc_notify_event_t event)
{
	udc_t *udc = (udc_t *) context;
	uint32_t max_pkt_size = 0;

	switch (event)
	{
	case DWC_NOTIFY_EVENT_CONNECTED_LS:
		udc->speed = UDC_SPEED_LS;
		break;
	case DWC_NOTIFY_EVENT_CONNECTED_FS:
		udc->speed = UDC_SPEED_FS;
		/* For FS connection update the ep descriptor
		 * with FS max packet size
		 */
		max_pkt_size = 64;
		udc_update_ep_desc(udc, max_pkt_size);
		/* Update the spec version for FS */
		udc_update_usb20_desc(udc);
		break;
	case DWC_NOTIFY_EVENT_CONNECTED_HS:
		udc->speed = UDC_SPEED_HS;
		/* For HS connection update the ep descriptor
		 * with HS max packet size
		 */
		max_pkt_size = 512;
		udc_update_ep_desc(udc, max_pkt_size);
		/* Update the spec version for HS */
		udc_update_usb20_desc(udc);
		break;
	case DWC_NOTIFY_EVENT_CONNECTED_SS:
		udc->speed = UDC_SPEED_SS;
		/* For SS connection update the ep descriptor
		 * with SS max packet size
		 */
		max_pkt_size = 1024;
		udc_ss_capable = true;
		udc_update_ep_desc(udc, max_pkt_size);
		break;
	case DWC_NOTIFY_EVENT_DISCONNECTED:
	case DWC_NOTIFY_EVENT_OFFLINE:
		udc->config_selected = 0;
		if (udc->gadget && udc->gadget->notify)
			udc->gadget->notify(udc->gadget, UDC_EVENT_OFFLINE);
		break;
	default:
		ASSERT(0);
	}
}


/******************* Function related to descriptor allocation etc.************/

static struct udc_endpoint *_udc_endpoint_alloc(uint8_t num,
												uint8_t in,
												uint8_t type,
												uint16_t max_pkt)
{
	struct udc_endpoint *ept;
	udc_t *udc = udc_dev;

	ept = malloc(sizeof(*ept));
	ASSERT(ept);

	ept->maxpkt     = max_pkt;
	ept->num        = num;
	ept->type       = type;
	ept->in         = !!in;
	ept->maxburst   = 4;      /* no performance improvement is seen beyond burst size of 4 */
	ept->trb_count  = 66;     /* each trb can transfer (16MB - 1). 65 for 1GB transfer + 1 for roundup/zero length pkt. */
	ept->trb        = memalign(lcm(CACHE_LINE, 16), ROUNDUP(ept->trb_count*sizeof(dwc_trb_t), CACHE_LINE)); /* TRB must be aligned to 16 */
	ASSERT(ept->trb);

	/* push it on top of ept_list */
	ept->next      = udc->ept_list;
	udc->ept_list  = ept;

	return ept;
}

/* Called to create non-control in/out End Point structures by the APP */
struct udc_endpoint *usb30_udc_endpoint_alloc(unsigned type, unsigned maxpkt)
{
	struct udc_endpoint *ept;
	uint8_t in;
	uint8_t n;
	udc_t *udc = udc_dev;

	if (type == UDC_TYPE_BULK_IN) {
		in = 1;
		type = EP_TYPE_BULK;
	} else if (type == UDC_TYPE_BULK_OUT) {
		in = 0;
		type = EP_TYPE_BULK;
	} else if (type == UDC_TYPE_INTR_IN) {
		in = 1;
		type = EP_TYPE_INTERRUPT;
	} else if (type == UDC_TYPE_INTR_OUT){
		in = 0;
		type = EP_TYPE_INTERRUPT;
	} else {
		return 0;
	}

	for (n = 1; n < 16; n++) {
		uint32_t bit = in ? EPT_TX(n) : EPT_RX(n);
		if (udc->ept_alloc_table & bit)
			continue;
		ept = _udc_endpoint_alloc(n, in, type, maxpkt);
		if (ept)
			udc->ept_alloc_table |= bit;
		return ept;
	}
	return 0;
}


/* create config + interface + ep desc for 2.0 */
static void udc_register_config_desc_usb20(udc_t *udc,
										   struct udc_gadget *gadget, uint8_t type)
{
	uint8_t  *data;
	uint16_t  size;
	struct udc_descriptor *desc;

	ASSERT(udc);
	ASSERT(gadget);

	/* create our configuration descriptor */

	/* size is the total size of (config + interface + all EPs) descriptor */
	size = UDC_DESC_SIZE_CONFIGURATION +
		   UDC_DESC_SIZE_INTERFACE +
		   (gadget->ifc_endpoints*UDC_DESC_SIZE_ENDPOINT);

	desc = udc_descriptor_alloc(type, 0, size, UDC_DESC_SPEC_20);

	data = desc->data;

	/* Config desc */
	data[0] = 0x09;
	data[1] = type;
	data[2] = size;
	data[3] = size >> 8;
	data[4] = 0x01;     /* number of interfaces */
	data[5] = 0x01;     /* configuration value */
	data[6] = 0x00;     /* configuration string */
	data[7] = 0xC0;     /* attributes: reserved and self-powered set */
	data[8] = 0x00;     /* max power: 0ma since we are self powered */
	data += 9;

	/* Interface desc */
	data[0] = 0x09;
	data[1] = TYPE_INTERFACE;
	data[2] = 0x00;     /* ifc number */
	data[3] = 0x00;     /* alt number */
	data[4] = gadget->ifc_endpoints;
	data[5] = gadget->ifc_class;
	data[6] = gadget->ifc_subclass;
	data[7] = gadget->ifc_protocol;
	data[8] = udc_string_desc_alloc(udc, gadget->ifc_string);
	data += 9;

	for (uint8_t n = 0; n < gadget->ifc_endpoints; n++) {
		udc_ept_desc_fill(gadget->ept[n], data, type);
		data += UDC_DESC_SIZE_ENDPOINT;
	}

	udc_descriptor_register(udc, desc);
}

/* create config + interface + ep desc for 3.0 */
static void udc_register_config_desc_usb30(udc_t *udc,
										   struct udc_gadget *gadget)
{
	uint8_t *data;
	uint16_t size;
	struct udc_descriptor *desc;

	ASSERT(udc);
	ASSERT(gadget);

	/* create our configuration descriptor */

	/* size is the total size of (config + interface + all EPs) descriptor */
	size = UDC_DESC_SIZE_CONFIGURATION +
		   UDC_DESC_SIZE_INTERFACE +
		   (gadget->ifc_endpoints*(UDC_DESC_SIZE_ENDPOINT + UDC_DESC_SIZE_ENDPOINT_COMP));

	desc = udc_descriptor_alloc(TYPE_CONFIGURATION, 0, size, UDC_DESC_SPEC_30);

	data = desc->data;

	/* Config desc */
	data[0] = 0x09;
	data[1] = TYPE_CONFIGURATION;
	data[2] = size;
	data[3] = size >> 8;
	data[4] = 0x01;     /* number of interfaces */
	data[5] = 0x01;     /* configuration value */
	data[6] = 0x00;     /* configuration string */
	data[7] = 0xC0;     /* attributes: reserved and self-powered set */
	data[8] = 0x00;     /* max power: 0ma since we are self powered */
	data += 9;

	/* Interface desc */
	data[0] = 0x09;
	data[1] = TYPE_INTERFACE;
	data[2] = 0x00;     /* ifc number */
	data[3] = 0x00;     /* alt number */
	data[4] = gadget->ifc_endpoints;
	data[5] = gadget->ifc_class;
	data[6] = gadget->ifc_subclass;
	data[7] = gadget->ifc_protocol;
	data[8] = udc_string_desc_alloc(udc, gadget->ifc_string);
	data += 9;

	for (uint8_t n = 0; n < gadget->ifc_endpoints; n++)
	{
		/* fill EP desc */
		udc_ept_desc_fill(gadget->ept[n], data, 0);
		data += UDC_DESC_SIZE_ENDPOINT;

		/* fill EP companion desc */
		udc_ept_comp_desc_fill(gadget->ept[n], data);
		data += UDC_DESC_SIZE_ENDPOINT_COMP;
	}

	udc_descriptor_register(udc, desc);
}


static void udc_register_device_desc_usb_20(udc_t *udc,
											struct udc_device *dev_info)
{
	uint8_t *data;
	struct udc_descriptor *desc;

	/* create our device descriptor */
	desc = udc_descriptor_alloc(TYPE_DEVICE, 0, 18, UDC_DESC_SPEC_20);
	data = desc->data;

	/* data 0 and 1 is filled by descriptor alloc routine.
	 * fill in the remaining entries.
	 */
	data[2] = 0x10; /* usb spec minor rev */
	data[3] = 0x02; /* usb spec major rev */
	data[4] = 0x00; /* class */
	data[5] = 0x00; /* subclass */
	data[6] = 0x00; /* protocol */
	data[7] = 0x40; /* max packet size on ept 0 */

	memcpy(data + 8,  &dev_info->vendor_id,  sizeof(short));
	memcpy(data + 10, &dev_info->product_id, sizeof(short));
	memcpy(data + 12, &dev_info->version_id, sizeof(short));

	data[14] = udc_string_desc_alloc(udc, dev_info->manufacturer);
	data[15] = udc_string_desc_alloc(udc, dev_info->product);
	data[16] = udc_string_desc_alloc(udc, dev_info->serialno);
	data[17] = 1; /* number of configurations */

	udc_descriptor_register(udc, desc);
}

static void udc_register_device_desc_usb_30(udc_t *udc, struct udc_device *dev_info)
{
	uint8_t *data;
	struct udc_descriptor *desc;

	/* create our device descriptor */
	desc = udc_descriptor_alloc(TYPE_DEVICE, 0, 18, UDC_DESC_SPEC_30);
	data = desc->data;

	/* data 0 and 1 is filled by descriptor alloc routine.
	 * fill in the remaining entries.
	 */
	data[2] = 0x00; /* usb spec minor rev */
	data[3] = 0x03; /* usb spec major rev */
	data[4] = 0x00; /* class */
	data[5] = 0x00; /* subclass */
	data[6] = 0x00; /* protocol */
	data[7] = 0x09; /* max packet size on ept 0 */
	memcpy(data +  8, &dev_info->vendor_id,  sizeof(short));
	memcpy(data + 10, &dev_info->product_id, sizeof(short));
	memcpy(data + 12, &dev_info->version_id, sizeof(short));
	data[14] = udc_string_desc_alloc(udc, dev_info->manufacturer);
	data[15] = udc_string_desc_alloc(udc, dev_info->product);
	data[16] = udc_string_desc_alloc(udc, dev_info->serialno);
	data[17] = 1; /* number of configurations */

	udc_descriptor_register(udc, desc);
}

static void udc_register_bos_desc(udc_t *udc)
{
	uint8_t *data;
	struct udc_descriptor *desc;

	/* create our device descriptor */
	desc = udc_descriptor_alloc(TYPE_BOS, 0, 0x16, UDC_DESC_SPEC_30); /* 22 is total length of bos + other descriptors inside it */
	data = desc->data;

	/* data 0 and 1 is filled by descriptor alloc routine.
	 * fill in the remaining entries.
	 */
	data[0] = 0x05;     /* BOS desc len */
	data[1] = TYPE_BOS; /* BOS desc type */
	data[2] = 0x16;     /* total len of bos desc and its sub desc */
	data[3] = 0x00;     /* total len of bos desc and its sub desc */
	data[4] = 0x02;     /* num of sub desc inside bos */

	/* USB2.0 extension Descriptor */
	data[5]  = 0x07;    /* Size of USB2.0 extension desc */
	data[6]  = 0x10;    /* Device capability desc */
	data[7]  = 0x02;    /* USB2.0 extension descriptor */
	data[8]  = 0x02;    /* LPM mode */
	data[9]  = 0x00;    /* Reserved */
	data[10] = 0x00;    /* Reserved */
	data[11] = 0x00;    /* Reserved */

	/* Super Speed device capability */
	data[12]  = 0x0A;    /* desc len */
	data[13]  = 0x10;    /* Device Capability desc */
	data[14]  = 0x03;    /* 3 == SuperSpeed capable */
	data[15]  = 0x00;    /* Attribute: latency tolerance msg: No */
	data[16]  = 0x0F;    /* Supported Speeds (bit mask): LS, FS, HS, SS */
	data[17] = 0x00;    /* Reserved part of supported wSupportedSpeeds */
	data[18] = 0x01;    /* lowest supported speed with full functionality: FS */
	data[19] = 0x00;    /* U1 device exit latency */
	data[20] = 0x00;    /* U2 device exit latency (lsb) */
	data[21] = 0x00;    /* U2 device exit latency (msb) */

	udc_descriptor_register(udc, desc);
}

static void udc_register_language_desc(udc_t *udc)
{
	/* create and register a language table descriptor */
	/* language 0x0409 is US English */
	struct udc_descriptor *desc = udc_descriptor_alloc(TYPE_STRING,
													   0,
													   4,
													   UDC_DESC_SPEC_20 | UDC_DESC_SPEC_30);
	desc->data[2] = 0x09;
	desc->data[3] = 0x04;
	udc_descriptor_register(udc, desc);
}

static void udc_ept_desc_fill(struct udc_endpoint *ept, uint8_t *data, uint8_t type)
{
	uint16_t max_pkt_sz = 0;

	/* For other speed configuration, populate the max packet size for the other speed
	 * mode. For eg: if currently host is operating in HS mode, return the configuration
	 * for FS mode
	 */
	if (type == TYPE_OTHER_SPEED_CONFIG && udc_dev->speed != UDC_SPEED_SS)
		max_pkt_sz = (udc_dev->speed == UDC_SPEED_FS) ? 512 : 64;
	else
		max_pkt_sz = ept->maxpkt;

	data[0] = 7;
	data[1] = TYPE_ENDPOINT;
	data[2] = ept->num | (ept->in ? 0x80 : 0x00);
	data[3] = 0x02; /* bulk -- the only kind we support */
	data[4] = max_pkt_sz;
	data[5] = max_pkt_sz >> 8;
	data[6] = 0; /* bInterval: must be 0 for bulk. */
}

static void udc_ept_comp_desc_fill(struct udc_endpoint *ept, uint8_t *data)
{
	data[0] = 6;               /* bLength */
	data[1] = TYPE_SS_EP_COMP; /* ep type */
	data[2] = ept->maxburst;   /* maxBurst */
	data[3] = 0x0;             /* maxStreams */
	data[4] = 0x0;             /* wBytesPerInterval */
	data[5] = 0x0;             /* wBytesPerInterval */
}

static uint8_t udc_string_desc_alloc(udc_t *udc, const char *str)
{
	uint32_t len;
	struct udc_descriptor *desc;
	uint8_t *data;

	if (udc->next_string_id > 255)
		return 0;

	if (!str)
		return 0;

	len = strlen(str);
	desc = udc_descriptor_alloc(TYPE_STRING,
								udc->next_string_id,
								len * 2 + 2,
								UDC_DESC_SPEC_20 | UDC_DESC_SPEC_30);
	if (!desc)
		return 0;
	udc->next_string_id++;

	/* expand ascii string to utf16 */
	data = desc->data + 2;
	while (len-- > 0) {
		*data++ = *str++;
		*data++ = 0;
	}

	udc_descriptor_register(udc, desc);
	return desc->tag & 0xff;
}


static struct udc_descriptor *udc_descriptor_alloc(uint32_t type,
												   uint32_t num,
												   uint32_t len,
												   udc_desc_spec_t spec)
{
	struct udc_descriptor *desc;
	if ((len > 255) || (len < 2) || (num > 255) || (type > 255))
	{
		dprintf(CRITICAL, "Invalid parameters for descriptor allocation\n");
		ASSERT(0);
	}

	desc = malloc(sizeof(struct udc_descriptor) + len);
	ASSERT(desc);

	desc->next    = 0;
	desc->tag     = (type << 8) | num;
	desc->len     = len;
	desc->spec    = spec;

	/* descriptor data */
	desc->data[0] = len;
	desc->data[1] = type;

	return desc;
}

static void udc_descriptor_register(udc_t *udc, struct udc_descriptor *desc)
{
	desc->next     = udc->desc_list;
	udc->desc_list = desc;
}


struct udc_request *usb30_udc_request_alloc(void)
{
	struct udc_request *req;

	req = malloc(sizeof(*req));
	ASSERT(req);

	req->buf      = 0;
	req->length   = 0;
	req->complete = NULL;
	req->context  = 0;

	return req;
}

void usb30_udc_request_free(struct udc_request *req)
{
	free(req);
}

void usb30_udc_endpoint_free(struct udc_endpoint *ept)
{
	/* TODO */
}

int usb30_udc_stop(void)
{
	dwc_device_run(udc_dev->dwc, 0);

	return 0;
}
