/*
 * MUSB OTG driver host support
 *
 * Copyright 2005 Mentor Graphics Corporation
 * Copyright (C) 2005-2006 by Texas Instruments
 * Copyright (C) 2006-2007 Nokia Corporation
 * Copyright (C) 2008-2009 MontaVista Software, Inc. <source@mvista.com>
 *
 * Copyright 2015 Mediatek Inc.
 *	Marvin Lin <marvin.lin@mediatek.com>
 *	Arvin Wang <arvin.wang@mediatek.com>
 *	Vincent Fan <vincent.fan@mediatek.com>
 *	Bryant Lu <bryant.lu@mediatek.com>
 *	Yu-Chang Wang <yu-chang.wang@mediatek.com>
 *	Macpaul Lin <macpaul.lin@mediatek.com>
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * version 2 as published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.
 *
 * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
 * NO EVENT SHALL THE AUTHORS 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.
 */

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/delay.h>
#include <linux/sched.h>
#include <linux/slab.h>
#include <linux/errno.h>
#include <linux/init.h>
#include <linux/list.h>

#include "musbfsh_core.h"
#include "musbfsh_host.h"
#include "musbfsh_dma.h"
#include "usb.h"
#include "musbfsh_qmu.h"
#include "mtk11_qmu.h"

/* MUSB HOST status 22-mar-2006
 *
 * - There's still lots of partial code duplication for fault paths, so
 *   they aren't handled as consistently as they need to be.
 *
 * - PIO mostly behaved when last tested.
 *     + including ep0, with all usbtest cases 9, 10
 *     + usbtest 14 (ep0out) doesn't seem to run at all
 *     + double buffered OUT/TX endpoints saw stalls(!) with certain usbtest
 *       configurations, but otherwise double buffering passes basic tests.
 *     + for 2.6.N, for N > ~10, needs API changes for hcd framework.
 *
 * - DMA (CPPI) ... partially behaves, not currently recommended
 *     + about 1/15 the speed of typical EHCI implementations (PCI)
 *     + RX, all too often reqpkt seems to misbehave after tx
 *     + TX, no known issues (other than evident silicon issue)
 *
 * - DMA (Mentor/OMAP) ...has at least toggle update problems
 *
 * - [23-feb-2009] minimal traffic scheduling to avoid bulk RX packet
 *   starvation ... nothing yet for TX, interrupt, or bulk.
 *
 * - Not tested with HNP, but some SRP paths seem to behave.
 *
 * NOTE 24-August-2006:
 *
 * - Bulk traffic finally uses both sides of hardware ep1, freeing up an
 *   extra endpoint for periodic use enabling hub + keybd + mouse.  That
 *   mostly works, except that with "usbnet" it's easy to trigger cases
 *   with "ping" where RX loses.  (a) ping to davinci, even "ping -f",
 *   fine; but (b) ping _from_ davinci, even "ping -c 1", ICMP RX loses
 *   although ARP RX wins.  (That test was done with a full speed link.)
 */

/*
 * NOTE on endpoint usage:
 *
 * CONTROL transfers all go through ep0.  BULK ones go through dedicated IN
 * and OUT endpoints ... hardware is dedicated for those "async" queue(s).
 * (Yes, bulk _could_ use more of the endpoints than that, and would even
 * benefit from it.)
 *
 * INTERUPPT and ISOCHRONOUS transfers are scheduled to the other endpoints.
 * So far that scheduling is both dumb and optimistic:  the endpoint will be
 * "claimed" until its software queue is no longer refilled.  No multiplexing
 * of transfers between endpoints, or anything clever.
 */

static u8 dynamic_fifo_total_slot = 15;
int musbfsh_host_alloc_ep_fifo(struct musbfsh *musbfsh, struct musbfsh_qh *qh, u8 is_in)
{
	void __iomem *mbase = musbfsh->mregs;
	int epnum = qh->hw_ep->epnum;
	u16 maxpacket;
	u16 request_fifo_sz, fifo_unit_nr;
	u16 idx_start = 0;
	u8 index, i;
	u16 c_off = 0;
	u8 c_size = 0;
	u16 free_uint = 0;
	u8 found = 0;

	maxpacket = qh->maxpacket * qh->hb_mult;
	if (maxpacket <= 512) {
		request_fifo_sz = 512;
		fifo_unit_nr = 1;
		c_size = 6;
	} else if (maxpacket <= 1024) {
		request_fifo_sz = 1024;
		fifo_unit_nr = 2;
		c_size = 7;
	} else if (maxpacket <= 2048) {
		request_fifo_sz = 2048;
		fifo_unit_nr = 4;
		c_size = 8;
	} else if (maxpacket <= 4096) {
		request_fifo_sz = 4096;
		fifo_unit_nr = 8;
		c_size = 9;
	} else {
		ERR("should not be here qh maxp:%d maxp:%d\n", qh->maxpacket, maxpacket);
		request_fifo_sz = 0;
		fifo_unit_nr = 0;
		musbfsh_bug();
		return -ENOSPC;
	}

	for (i = 0; i < dynamic_fifo_total_slot; i++) {
		if (!(musbfsh_host_dynamic_fifo_usage_msk & (1 << i)))
			free_uint++;
		else
			free_uint = 0;

		if (free_uint == fifo_unit_nr) {
			found = 1;
			break;
		}
	}

	if (found == 0) {
		ERR("!enough, dynamic_fifo_usage_msk:0x%x,maxp:%d,req_len:%d,ep%d-%s\n",
				musbfsh_host_dynamic_fifo_usage_msk, maxpacket,
				request_fifo_sz, epnum, is_in ? "in":"out");
		return -1;
	}

	idx_start = i - (fifo_unit_nr - 1);
	c_off = (64 >> 3) + idx_start * (512 >> 3);

	for (i = 0; i < fifo_unit_nr; i++)
		musbfsh_host_dynamic_fifo_usage_msk |= (1 << (idx_start + i));

	index = musbfsh_readb(mbase, MUSBFSH_INDEX);
	musbfsh_writeb(musbfsh->mregs, MUSBFSH_INDEX, epnum);
	if (is_in) {
		musbfsh_write_rxfifosz(mbase, c_size);
		musbfsh_write_rxfifoadd(mbase, c_off);

		INFO("addr:0x%x, size:0x%x\n", musbfsh_read_rxfifoadd(mbase), musbfsh_read_rxfifosz(mbase));
	} else {
		musbfsh_write_txfifosz(mbase, c_size);
		musbfsh_write_txfifoadd(mbase, c_off);
		INFO("addr:0x%x, size:0x%x\n", musbfsh_read_txfifoadd(mbase), musbfsh_read_txfifosz(mbase));
	}
	musbfsh_writeb(mbase, MUSBFSH_INDEX, index);

	INFO("maxp:%d, req_len:%d, dynamic_fifo_usage_msk:0x%x, ep%d-%s, qh->type:%d\n",
	    maxpacket, request_fifo_sz, musbfsh_host_dynamic_fifo_usage_msk, epnum, is_in ? "in":"out", qh->type);
	return 0;
}

void musbfsh_host_free_ep_fifo(struct musbfsh *musbfsh, struct musbfsh_qh *qh, u8 is_in)
{
	void __iomem *mbase = musbfsh->mregs;
	int epnum = qh->hw_ep->epnum;
	u16 maxpacket = qh->maxpacket;
	u16 request_fifo_sz, fifo_unit_nr;
	u16 idx_start = 0;
	u8 index, i;
	u16 c_off = 0;

	maxpacket = qh->maxpacket * qh->hb_mult;
	if (maxpacket <= 512) {
		request_fifo_sz = 512;
		fifo_unit_nr = 1;
	} else if (maxpacket <= 1024) {
		request_fifo_sz = 1024;
		fifo_unit_nr = 2;
	} else if (maxpacket <= 2048) {
		request_fifo_sz = 2048;
		fifo_unit_nr = 4;
	} else if (maxpacket <= 4096) {
		request_fifo_sz = 4096;
		fifo_unit_nr = 8;
	} else {
		ERR("should not be here qh maxp:%d maxp:%d\n", qh->maxpacket, maxpacket);
		request_fifo_sz = 0;
		fifo_unit_nr = 0;
		musbfsh_bug();
	}

	index = musbfsh_readb(mbase, MUSBFSH_INDEX);
	musbfsh_writeb(mbase, MUSBFSH_INDEX, epnum);

	if (is_in)
		c_off =  musbfsh_read_rxfifoadd(mbase);
	else
		c_off = musbfsh_read_txfifoadd(mbase);

	idx_start = (c_off - (64 >> 3)) / (512 >> 3);

	for (i = 0; i < fifo_unit_nr; i++)
		musbfsh_host_dynamic_fifo_usage_msk &= ~(1 << (idx_start + i));

	if (is_in) {
		musbfsh_write_rxfifosz(mbase, 0);
		musbfsh_write_rxfifoadd(mbase, 0);
	} else {
		musbfsh_write_txfifosz(mbase, 0);
		musbfsh_write_txfifoadd(mbase, 0);
	}
	musbfsh_writeb(mbase, MUSBFSH_INDEX, index);

	INFO("maxp:%d, req_len:%d, dynamic_fifo_usage_msk:0x%x, ep%d-%s, qh->type:%d\n",
	    maxpacket, request_fifo_sz, musbfsh_host_dynamic_fifo_usage_msk, epnum, is_in ? "in":"out", qh->type);
}

static void musbfsh_ep_program(struct musbfsh *musbfsh, u8 epnum,
			       struct urb *urb, int is_out, u8 *buf,
			       u32 offset, u32 len);

void musbfsh_bug(void)
{
	/* make KE happen */
	char *ptr = NULL;

	*ptr = 10;
}

/*
 * Clear TX fifo. Needed to avoid BABBLE errors.
 */
void musbfsh_h_tx_flush_fifo(struct musbfsh_hw_ep *ep)
{
	void __iomem *epio = ep->regs;
	u16 csr;
	u16 lastcsr = 0;
	int retries = 1000;

	INFO("%s++\r\n", __func__);
	csr = musbfsh_readw(epio, MUSBFSH_TXCSR);
	while (csr & MUSBFSH_TXCSR_FIFONOTEMPTY) {
		if (csr != lastcsr)
			INFO("Host TX FIFONOTEMPTY csr: %02x\n", csr);
		lastcsr = csr;
		csr &= ~MUSBFSH_TXCSR_TXPKTRDY;
		csr |= MUSBFSH_TXCSR_FLUSHFIFO;
		musbfsh_writew(epio, MUSBFSH_TXCSR, csr);
		csr = musbfsh_readw(epio, MUSBFSH_TXCSR);
		if (retries-- < 1) {
			WARNING("Could not flush host TX%d fifo: csr: %04x\n",
				ep->epnum, csr);
			return;
		}
		mdelay(1);
	}
}

static void musbfsh_h_ep0_flush_fifo(struct musbfsh_hw_ep *ep)
{
	void __iomem *epio = ep->regs;
	u16 csr;
	int retries = 5;

	INFO("%s++\r\n", __func__);
	/* scrub any data left in the fifo */
	do {
		csr = musbfsh_readw(epio, MUSBFSH_TXCSR);
		if (!(csr & (MUSBFSH_CSR0_TXPKTRDY | MUSBFSH_CSR0_RXPKTRDY)))
			break;
		musbfsh_writew(epio, MUSBFSH_TXCSR, MUSBFSH_CSR0_FLUSHFIFO);
		csr = musbfsh_readw(epio, MUSBFSH_TXCSR);
		udelay(10);
	} while (--retries);

	if (!retries)
		WARNING("Could not flush host TX%d fifo: csr: %04x\n",
			ep->epnum, csr);

	/* and reset for the next transfer */
	musbfsh_writew(epio, MUSBFSH_TXCSR, 0);
}

/*
 * Start transmit. Caller is responsible for locking shared resources.
 * musb must be locked.
 */
static inline void musbfsh_h_tx_start(struct musbfsh_hw_ep *ep)
{
	u16 txcsr;

	INFO("%s++\r\n", __func__);
	/* NOTE: no locks here; caller should lock and select EP */
	if (ep->epnum) {
		txcsr = musbfsh_readw(ep->regs, MUSBFSH_TXCSR);
		INFO("txcsr=0x%x for ep%d\n", txcsr, ep->epnum);
		txcsr |= MUSBFSH_TXCSR_TXPKTRDY | MUSBFSH_TXCSR_H_WZC_BITS;
		musbfsh_writew(ep->regs, MUSBFSH_TXCSR, txcsr);
		txcsr = musbfsh_readw(ep->regs, MUSBFSH_TXCSR);
		INFO("txcsr=0x%x for ep%d\n", txcsr, ep->epnum);
	} else {
		txcsr = musbfsh_readw(ep->regs, MUSBFSH_CSR0);
		INFO("txcsr=0x%x for ep%d\n", txcsr, ep->epnum);
		txcsr = MUSBFSH_CSR0_H_DIS_PING |  MUSBFSH_CSR0_H_SETUPPKT | MUSBFSH_CSR0_TXPKTRDY;
		musbfsh_writew(ep->regs, MUSBFSH_CSR0, txcsr);
		txcsr = musbfsh_readw(ep->regs, MUSBFSH_TXCSR);
		INFO("txcsr=0x%x for ep%d\n", txcsr, ep->epnum);
	}

}

void musbfsh_ep_set_qh(struct musbfsh_hw_ep *ep, int is_in,
			      struct musbfsh_qh *qh)
{
	if (is_in != 0 || ep->is_shared_fifo)
		ep->in_qh = qh;
	if (is_in == 0 || ep->is_shared_fifo)
		ep->out_qh = qh;
}

struct musbfsh_qh *musbfsh_ep_get_qh(struct musbfsh_hw_ep *ep, int is_in)
{
	INFO("%s++, hw_ep%d, is_in=%d\r\n",
	     __func__, ep->epnum, is_in);
	return is_in ? ep->in_qh : ep->out_qh;
}

/*
 * Start the URB at the front of an endpoint's queue
 * end must be claimed from the caller.
 *
 * Context: controller locked, irqs blocked
 */
static void musbfsh_start_urb(struct musbfsh *musbfsh, int is_in,
			      struct musbfsh_qh *qh)
{
	u16 frame;
	u32 len;
	struct urb *urb = next_urb(qh);
	void *buf = urb->transfer_buffer;
	u32 offset = 0;
	struct musbfsh_hw_ep *hw_ep = qh->hw_ep;
	unsigned pipe = urb->pipe;
	u8 address = usb_pipedevice(pipe);
	int epnum = hw_ep->epnum;
	void __iomem *mbase = musbfsh->mregs;

	INFO("%s++, addr=%d, hw_ep->epnum=%d, urb_ep_addr:0x%x \r\n",
	     __func__, address, epnum, urb->ep->desc.bEndpointAddress);
	/*
	 * MYDBG("urb:%x, blen:%d, alen:%d, hep:%x, ep:%x\n",
	 *	urb, urb->transfer_buffer_length, urb->actual_length,
	 *	epnum, urb->ep->desc.bEndpointAddress);
	 */

	/* initialize software qh state */
	/* indicate the buffer pointer now. */
	qh->offset = 0;
	qh->segsize = 0;

	/* gather right source of data */
	switch (qh->type) {
	case USB_ENDPOINT_XFER_CONTROL:	/* PIO mode only */
		/* control transfers always start with SETUP */
		/* setup packet should be sent out of the controller. */
		is_in = 0;
		musbfsh->ep0_stage = MUSBFSH_EP0_START;
		buf = urb->setup_packet;	/* contain the request. */
		len = 8;
		break;
	case USB_ENDPOINT_XFER_ISOC:
		qh->iso_idx = 0;
		qh->frame = 0;
		offset = urb->iso_frame_desc[0].offset;
		len = urb->iso_frame_desc[0].length;
		break;
	default:
		/* bulk, interrupt */
		/* actual_length may be nonzero on retry paths */
		/* before the urb, actual_length should be 0. */
		buf = urb->transfer_buffer + urb->actual_length;
		len = urb->transfer_buffer_length - urb->actual_length;
	}
	INFO("qh %p urb %p dev%d ep%d %s %s, hw_ep %d, %p/%d\n",
		qh, urb, address, qh->epnum, is_in ? "in" : "out",
		({ char *s;
			switch (qh->type) {
			case USB_ENDPOINT_XFER_CONTROL:
				s = "-ctl";
				break;
			case USB_ENDPOINT_XFER_BULK:
				s = "-bulk";
				break;
			default:
				s = "-intr";
				break;
			};
			s;
		}),
		epnum, buf + offset, len);
	/* Configure endpoint */
	musbfsh_ep_set_qh(hw_ep, is_in, qh);

	/* !is_in, because the fourth parameter of this func is is_out */
	musbfsh_ep_program(musbfsh, epnum, urb, !is_in, buf, offset, len);

	/* transmit may have more work: start it when it is time */
	/*
	 * Rx,has configure OK in the func: musbfsh_ep_program,
	 * so return directly
	 */
	if (is_in)
		return;

	INFO("Start TX%d %s\n", epnum, hw_ep->tx_channel ? "dma" : "pio");
	switch (qh->type) {
	case USB_ENDPOINT_XFER_ISOC:
	case USB_ENDPOINT_XFER_INT:
		INFO("check whether there's still time for periodic Tx\n");
		frame = musbfsh_readw(mbase, MUSBFSH_FRAME);
		/* FIXME this doesn't implement that scheduling policy ...
		 * or handle framecounter wrapping
		 */
		if ((urb->transfer_flags & URB_ISO_ASAP)
		    || (frame >= urb->start_frame)) {
			/* REVISIT the SOF irq handler shouldn't duplicate
			 * this code; and we don't init urb->start_frame...
			 */
			qh->frame = 0;
			goto start;
		} else {
			qh->frame = urb->start_frame;
			/* enable SOF interrupt so we can count down */
			INFO("SOF for %d\n", epnum);
			musbfsh_writeb(mbase, MUSBFSH_INTRUSBE, 0xff);
		}
		break;
	default:
start:
		INFO("Start TX%d %s\n", epnum, hw_ep->tx_channel ? "dma" : "pio");

		if (!hw_ep->tx_channel) {
			/* for pio mode, dma mode will send data after the configuration of the dma channel */
			musbfsh_h_tx_start(hw_ep);
		}
		/* else if (is_cppi_enabled() || tusb_dma_omap()) */
		/* musb_h_tx_dma_start(hw_ep); */
	}
}

/* Context: caller owns controller lock, IRQs are blocked */
static void musbfsh_giveback(struct musbfsh *musbfsh, struct urb *urb,
			     int status)
__releases(musbfsh->lock) __acquires(musbfsh->lock)
{
	INFO("%s++, complete %p %pF (%d), dev%d ep%d%s, %d/%d\n",
		__func__, urb, urb->complete, status,
		usb_pipedevice(urb->pipe),
		usb_pipeendpoint(urb->pipe),
		usb_pipein(urb->pipe) ? "in" : "out",
		urb->actual_length, urb->transfer_buffer_length);

	/*
	 * MYDBG("urb:%x, blen:%d, alen:%d, ep:%x\n", urb,
	 * urb->transfer_buffer_length, urb->actual_length,
	 * urb->ep->desc.bEndpointAddress);
	 */

	if (is_dma_capable() && usb_pipein(urb->pipe) && usb_pipeendpoint(urb->pipe))
		complete(&urb->done);

	usb_hcd_unlink_urb_from_ep(musbfsh_to_hcd(musbfsh), urb);
	spin_unlock(&musbfsh->lock);
	usb_hcd_giveback_urb(musbfsh_to_hcd(musbfsh), urb, status);
	spin_lock(&musbfsh->lock);
}

/* For bulk/interrupt endpoints only */
static inline void musbfsh_save_toggle(struct musbfsh_qh *qh, int is_in,
				       struct urb *urb)
{
	struct musbfsh *musbfsh = qh->hw_ep->musbfsh;
	u8 epnum = qh->hw_ep->epnum;
	int toggle;

	INFO("%s++\r\n", __func__);
	/*
	 * FIXME: the current Mentor DMA code seems to have
	 * problems getting toggle correct.
	 */
	if (is_in) {
		toggle = musbfsh_readl(musbfsh->mregs, MUSBFSH_RXTOG);
		INFO("toggle_IN=0x%x\n", toggle);
	} else {
		toggle = musbfsh_readl(musbfsh->mregs, MUSBFSH_TXTOG);
		INFO("toggle_OUT=0x%x\n", toggle);
	}

	if (toggle & (1 << epnum))
		usb_settoggle(urb->dev, qh->epnum, !is_in, 1);
	else
		usb_settoggle(urb->dev, qh->epnum, !is_in, 0);
}

static inline void musbfsh_set_toggle(struct musbfsh_qh *qh, int is_in,
				      struct urb *urb)
{
	struct musbfsh *musbfsh = qh->hw_ep->musbfsh;
	u8 epnum = qh->hw_ep->epnum;
	int tog; /* toggle */

	INFO("%s++: qh->hw_ep->epnum %d, qh->epnum %d\n",
	     __func__, qh->hw_ep->epnum,
	     qh->epnum);

	tog = usb_gettoggle(urb->dev, qh->epnum, !is_in);
	if (is_in) {
		INFO("qh->dev->toggle[IN]=0x%x\n", qh->dev->toggle[!is_in]);
		musbfsh_writel(musbfsh->mregs, MUSBFSH_RXTOG,
			       (((1 << epnum) << 16) | (tog << epnum)));
		musbfsh_writel(musbfsh->mregs, MUSBFSH_RXTOG, (tog << epnum));
	} else {
		INFO("qh->dev->toggle[OUT]=0x%x\n", qh->dev->toggle[!is_in]);
		musbfsh_writel(musbfsh->mregs, MUSBFSH_TXTOG,
			       (((1 << epnum) << 16) | (tog << epnum)));
		musbfsh_writel(musbfsh->mregs, MUSBFSH_TXTOG, (tog << epnum));
	}
}

/*
 * Advance this hardware endpoint's queue, completing the specified URB and
 * advancing to either the next URB queued to that qh, or else invalidating
 * that qh and advancing to the next qh scheduled after the current one.
 *
 * Context: caller owns controller lock, IRQs are blocked
 */
void musbfsh_advance_schedule(struct musbfsh *musbfsh, struct urb *urb,
				     struct musbfsh_hw_ep *hw_ep, int is_in)
{
	struct musbfsh_qh *qh;
	struct musbfsh_hw_ep *ep;
	int ready;
	int status;

	/* the current qh */
	qh = musbfsh_ep_get_qh(hw_ep, is_in);
	ep = qh->hw_ep;
	ready = qh->is_ready;

	INFO("%s++\r\n", __func__);
	status = (urb->status == -EINPROGRESS) ? 0 : urb->status;

	/* save toggle eagerly, for paranoia */
	switch (qh->type) {
	case USB_ENDPOINT_XFER_BULK:
	case USB_ENDPOINT_XFER_INT:
		/* after the urb, should save the toggle for the ep! */
		musbfsh_save_toggle(qh, is_in, urb);
		break;
	case USB_ENDPOINT_XFER_ISOC:
		if (status == 0 && urb->error_count)
			status = -EXDEV;
		break;
	}

	qh->is_ready = 0;
	musbfsh_giveback(musbfsh, urb, status);
	if ((is_in && !hw_ep->in_qh)
			|| (!is_in && !hw_ep->out_qh)) {
		WARNING("QH already freed\n");
		return;
	}
	qh->is_ready = ready;

	/* work around from tablet, avoid KE for qh->hep content 0x6b6b6b6b...
	* side effect will cause touch memory after free
	*/
	/* if the urb list is empty, the next qh will be excute. */
#ifdef CONFIG_MTK_MUSBFSH_BIND_DEV_EP
	if (list_empty(&qh->hep->urb_list)) {
		struct list_head *head;
		struct dma_controller *dma = musbfsh->dma_controller;

		if (is_in) {
			ep->rx_reinit = 1;
			if (ep->rx_channel) {
				dma->channel_release(ep->rx_channel);
				ep->rx_channel = NULL;
			}
		} else {
			ep->tx_reinit = 1;
			if (ep->tx_channel) {
				dma->channel_release(ep->tx_channel);
				ep->tx_channel = NULL;
			}
		}

		/* Clobber old pointers to this qh */
#ifdef CONFIG_MTK_DT_USB_SUPPORT
		mark_qh_activity(qh->epnum, ep->epnum, is_in, 1);
#endif

#ifdef CONFIG_MTK_MUSBFSH_QMU_SUPPORT
		if (qh->is_use_qmu)
			mtk11_disable_q(musbfsh, hw_ep->epnum, is_in);
#endif

		if (qh->type == USB_ENDPOINT_XFER_CONTROL) {
			musbfsh_ep_set_qh(ep, is_in, NULL);
			qh->hep->hcpriv = NULL;
			if (qh->mux == 1) {
				head = qh->ring.prev;
				list_del(&qh->ring);
				kfree(qh);
				qh = first_qh(head);
			}
		} else
			qh->resubmit = 1;
	}
#else
	if (list_empty(&qh->hep->urb_list)) {
		struct list_head *head;

		if (is_in)
			ep->rx_reinit = 1;
		else
			ep->tx_reinit = 1;

		/* Clobber old pointers to this qh */
#ifdef CONFIG_MTK_DT_USB_SUPPORT
		mark_qh_activity(qh->epnum, ep->epnum, is_in, 1);
#endif

		musbfsh_ep_set_qh(ep, is_in, NULL);
		qh->hep->hcpriv = NULL;

		if (musbfsh_host_dynamic_fifo && qh->type != USB_ENDPOINT_XFER_CONTROL)
			musbfsh_host_free_ep_fifo(musbfsh, qh, is_in);

#ifdef CONFIG_MTK_MUSBFSH_QMU_SUPPORT
		if (qh->is_use_qmu)
			mtk11_disable_q(musbfsh, hw_ep->epnum, is_in);
#endif

		switch (qh->type) {
		case USB_ENDPOINT_XFER_CONTROL:
		case USB_ENDPOINT_XFER_BULK:
			/*
			 * fifo policy for these lists, except that NAKing
			 * should rotate a qh to the end (for fairness).
			 */
			if (qh->mux == 1) {
				head = qh->ring.prev;
				list_del(&qh->ring);
				kfree(qh);
				qh = first_qh(head);
				break;
			}
		case USB_ENDPOINT_XFER_INT:
		case USB_ENDPOINT_XFER_ISOC:
			/*
			 * this is where periodic bandwidth should be
			 * de-allocated if it's tracked and allocated;
			 * and where we'd update the schedule tree...
			 */
			kfree(qh);
			qh = NULL;
			break;
		}
	}
#endif

#ifdef CONFIG_MTK_MUSBFSH_BIND_DEV_EP
	if (qh != NULL && qh->is_ready && next_urb(qh))
#else
	if (qh != NULL && qh->is_ready)
#endif
	{
		INFO("... next ep%d %cX urb %p\n",
		     hw_ep->epnum, is_in ? 'R' : 'T', next_urb(qh));
#ifdef CONFIG_MTK_MUSBFSH_QMU_SUPPORT
		if (qh->is_use_qmu && !mtk11_host_qmu_concurrent) {
			musbfsh_ep_set_qh(hw_ep, is_in, qh);
			mtk11_kick_CmdQ(musbfsh, is_in ? 1:0, qh, next_urb(qh));
		} else if (!qh->is_use_qmu)
			musbfsh_start_urb(musbfsh, is_in, qh);
#else
		musbfsh_start_urb(musbfsh, is_in, qh);
#endif
	}
}

u16 musbfsh_h_flush_rxfifo(struct musbfsh_hw_ep *hw_ep, u16 csr)
{
	/* we don't want fifo to fill itself again;
	 * ignore dma (various models),
	 * leave toggle alone (may not have been saved yet)
	 */
	INFO("%s++\r\n", __func__);
	csr |= MUSBFSH_RXCSR_FLUSHFIFO;
	csr &= ~(MUSBFSH_RXCSR_H_REQPKT | MUSBFSH_RXCSR_H_AUTOREQ |
		MUSBFSH_RXCSR_AUTOCLEAR | MUSBFSH_RXCSR_RXPKTRDY);

	/* write 2x to allow double buffering */
	musbfsh_writew(hw_ep->regs, MUSBFSH_RXCSR, csr);
	musbfsh_writew(hw_ep->regs, MUSBFSH_RXCSR, csr);

	/* flush writebuffer */
	return musbfsh_readw(hw_ep->regs, MUSBFSH_RXCSR);
}

/*
 * PIO RX for a packet (or part of it).
 */
static bool musbfsh_host_packet_rx(struct musbfsh *musbfsh, struct urb *urb,
				   u8 epnum, u8 iso_err)
{
	u16 rx_count;
	u8 *buf;
	u16 csr;
	bool done = false;
	u32 length;
	int do_flush = 0;
	struct musbfsh_hw_ep *hw_ep = musbfsh->endpoints + epnum;
	void __iomem *epio = hw_ep->regs;
	struct musbfsh_qh *qh = hw_ep->in_qh;
	void *buffer = urb->transfer_buffer;

	/* musbfsh_ep_select(mbase, epnum); */
	rx_count = musbfsh_readw(epio, MUSBFSH_RXCOUNT);
	INFO("%s++: real RX%d count %d, buffer %p len %d/%d\n",
	     __func__, epnum, rx_count, urb->transfer_buffer, qh->offset,
	     urb->transfer_buffer_length);
	/* unload FIFO */
	if (usb_pipeisoc(urb->pipe)) {
		int status = 0;
		struct usb_iso_packet_descriptor *d;

		if (iso_err) {
			status = -EILSEQ;
			urb->error_count++;
		}

		d = urb->iso_frame_desc + qh->iso_idx;
		buf = buffer + d->offset;
		length = d->length;
		if (rx_count > length) {
			if (status == 0) {
				status = -EOVERFLOW;
				urb->error_count++;
			}
			WARNING("** OVERFLOW %d into %d\n", rx_count, length);
			do_flush = 1;
		} else
			length = rx_count;
		urb->actual_length += length;
		d->actual_length = length;

		d->status = status;

		/* see if we are done */
		done = (++qh->iso_idx >= urb->number_of_packets);
	} else {
		/* non-isoch */
		buf = buffer + qh->offset;
		length = urb->transfer_buffer_length - qh->offset;
		if (rx_count > length) {
			if (urb->status == -EINPROGRESS)
				urb->status = -EOVERFLOW;
			WARNING("** OVERFLOW %d into %d\n", rx_count, length);
			do_flush = 1;
		} else
			length = rx_count;
		urb->actual_length += length;
		qh->offset += length;

		/* see if we are done */
		done = (urb->actual_length == urb->transfer_buffer_length)
		    || (rx_count < qh->maxpacket)
		    || (urb->status != -EINPROGRESS);
		if (done && (urb->status == -EINPROGRESS)
		    && (urb->transfer_flags & URB_SHORT_NOT_OK)
		    && (urb->actual_length < urb->transfer_buffer_length))
			urb->status = -EREMOTEIO;
	}

	musbfsh_read_fifo(hw_ep, length, buf);

	csr = musbfsh_readw(epio, MUSBFSH_RXCSR);
	csr |= MUSBFSH_RXCSR_H_WZC_BITS;
	if (unlikely(do_flush))
		musbfsh_h_flush_rxfifo(hw_ep, csr);
	else {
		/* REVISIT this assumes AUTOCLEAR is never set */
		csr &= ~(MUSBFSH_RXCSR_RXPKTRDY | MUSBFSH_RXCSR_H_REQPKT);
		if (!done)
			csr |= MUSBFSH_RXCSR_H_REQPKT;
		musbfsh_writew(epio, MUSBFSH_RXCSR, csr);
	}

	return done;
}

/* we don't always need to reinit a given side of an endpoint...
 * when we do, use tx/rx reinit routine and then construct a new CSR
 * to address data toggle, NYET, and DMA or PIO.
 *
 * it's possible that driver bugs (especially for DMA) or aborting a
 * transfer might have left the endpoint busier than it should be.
 * the busy/not-empty tests are basically paranoia.
 */
static void
musbfsh_rx_reinit(struct musbfsh *musbfsh, struct musbfsh_qh *qh,
		  struct musbfsh_hw_ep *ep)
{
	u16 csr;

	INFO("%s++\r\n", __func__);
	/* NOTE:  we know the "rx" fifo reinit never triggers for ep0.
	 * That always uses tx_reinit since ep0 repurposes TX register
	 * offsets; the initial SETUP packet is also a kind of OUT.
	 */

	/* if programmed for Tx, put it in RX mode */
	if (ep->is_shared_fifo) {
		csr = musbfsh_readw(ep->regs, MUSBFSH_TXCSR);
		if (csr & MUSBFSH_TXCSR_MODE) {
			musbfsh_h_tx_flush_fifo(ep);
			csr = musbfsh_readw(ep->regs, MUSBFSH_TXCSR);
			musbfsh_writew(ep->regs, MUSBFSH_TXCSR,
				       csr | MUSBFSH_TXCSR_FRCDATATOG);
		}

		/*
		 * Clear the MODE bit (and everything else) to enable Rx.
		 * NOTE: we mustn't clear the DMAMODE bit before DMAENAB.
		 */
		if (csr & MUSBFSH_TXCSR_DMAMODE)
			musbfsh_writew(ep->regs, MUSBFSH_TXCSR,
				       MUSBFSH_TXCSR_DMAMODE);
		musbfsh_writew(ep->regs, MUSBFSH_TXCSR, 0);

		/* scrub all previous state, clearing toggle */
	} else {
		csr = musbfsh_readw(ep->regs, MUSBFSH_RXCSR);
		if (csr & MUSBFSH_RXCSR_RXPKTRDY)
			INFO("musbfsh::rx%d, packet/%d ready?\n", ep->epnum,
			     musbfsh_readw(ep->regs, MUSBFSH_RXCOUNT));

		musbfsh_h_flush_rxfifo(ep, 0);
	}

	/* target addr and (for multipoint) hub addr/port */
	if (musbfsh->is_multipoint) {
		musbfsh_write_rxfunaddr(musbfsh->mregs, ep->epnum,
					qh->addr_reg);
		musbfsh_write_rxhubaddr(musbfsh->mregs, ep->epnum,
					qh->h_addr_reg);
		musbfsh_write_rxhubport(musbfsh->mregs, ep->epnum,
					qh->h_port_reg);
	} else {
		musbfsh_writeb(musbfsh->mregs, MUSBFSH_FADDR, qh->addr_reg);
	}

	/* protocol/endpoint, interval/NAKlimit, i/o size */
	musbfsh_writeb(ep->regs, MUSBFSH_RXTYPE, qh->type_reg);
	musbfsh_writeb(ep->regs, MUSBFSH_RXINTERVAL, qh->intv_reg);

	musbfsh_writew(ep->regs, MUSBFSH_RXMAXP, qh->maxpacket);

	ep->rx_reinit = 0;
}

static bool musbfsh_tx_dma_program(struct dma_controller *dma,
				   struct musbfsh_hw_ep *hw_ep,
				   struct musbfsh_qh *qh,
				   struct urb *urb, u32 offset, u32 len)
{
	struct dma_channel *channel = hw_ep->tx_channel;
	void __iomem *epio = hw_ep->regs;
	u16 pkt_size = qh->maxpacket;
	u16 csr;
	u8 mode;

	INFO("%s++\r\n", __func__);
	if (len > channel->max_len)
		len = channel->max_len;

	csr = musbfsh_readw(epio, MUSBFSH_TXCSR);
	if (len > pkt_size) {
		INFO("%s: mode 1\r\n", __func__);
		mode = 1;
		csr |= MUSBFSH_TXCSR_DMAMODE | MUSBFSH_TXCSR_DMAENAB;
		csr |= MUSBFSH_TXCSR_AUTOSET;
	} else {
		INFO("%s: mode 0\r\n", __func__);
		mode = 0;
		csr &= ~(MUSBFSH_TXCSR_AUTOSET | MUSBFSH_TXCSR_DMAMODE);
		csr |= MUSBFSH_TXCSR_DMAENAB;	/* against programmer's guide */
	}
	channel->desired_mode = mode;
	INFO("%s: txcsr=0x%x\r\n", __func__, csr);
	/* finish the configration for TXCSR register. */
	musbfsh_writew(epio, MUSBFSH_TXCSR, csr);
	qh->segsize = len;

	/*
	 * Ensure the data reaches to main memory before starting
	 * DMA transfer
	 */
	wmb();

	if (!dma->channel_program(channel, pkt_size, mode,
				  urb->transfer_dma + offset, len)) {
		/* give up the channel, so other ep can use it */
		dma->channel_release(channel);
		hw_ep->tx_channel = NULL;

		csr = musbfsh_readw(epio, MUSBFSH_TXCSR);
		csr &= ~(MUSBFSH_TXCSR_AUTOSET | MUSBFSH_TXCSR_DMAENAB);
		musbfsh_writew(epio, MUSBFSH_TXCSR,
			       csr | MUSBFSH_TXCSR_H_WZC_BITS);
		return false;
	}
	return true;
}

/*
 * Program an HDRC endpoint as per the given URB
 * Context: irqs blocked, controller lock held
 * u8 epnum: the index number, not the real number
 * int is_out: so the parameter sent to this func is !is_in.
 */
static void musbfsh_ep_program(struct musbfsh *musbfsh, u8 epnum,
			       struct urb *urb, int is_out,
			       u8 *buf, u32 offset, u32 len)
{
	struct dma_controller *dma_controller;
	struct dma_channel *dma_channel;
	void __iomem *mbase = musbfsh->mregs;
	struct musbfsh_hw_ep *hw_ep = musbfsh->endpoints + epnum;
	void __iomem *epio = hw_ep->regs;
	/* the parameter sent to musbfsh_ep_get_qh is is_in */
	struct musbfsh_qh *qh = musbfsh_ep_get_qh(hw_ep, !is_out);
	u16 packet_sz = qh->maxpacket;

	INFO("%s++: %s hw%d urb %p spd%d",
	     __func__, is_out ? "-->" : "<--",
	     epnum, urb, urb->dev->speed);
	INFO("%s  : dev%d ep%d%s h_addr%02x h_port%02x bytes %d\n",
	     __func__,
	     qh->addr_reg, qh->epnum, is_out ? "out" : "in",
	     qh->h_addr_reg, qh->h_port_reg, len);

	/* very important, then we can use the register via epio */
	musbfsh_ep_select(mbase, epnum);

	/* candidate for DMA? */
	/*
	 * wz:for MT65xx, there are not enough dma channels for all of the eps,
	 * so I think we should add a flag in the hw_ep struct to indicate
	 * whether it has a dma channel.
	 * And check it here to set the dma_channel
	 */
	dma_controller = musbfsh->dma_controller;

	/* will check epnum, indicate dma is not used for ep0! */
	if (is_dma_capable() && epnum && dma_controller) {
		INFO("Using DMA epnum%d\n", epnum);

		/* not all eps have dma channel */
		dma_channel = is_out ? hw_ep->tx_channel : hw_ep->rx_channel;

		/*
		 * if no dma channel yet,
		 * will allocate a channel for this ep!
		 */
		if (!dma_channel) {
			/*
			 * maybe return NULL, if all of the dma channels
			 * have been used.
			 */
			dma_channel =
				dma_controller->channel_alloc(dma_controller,
							      hw_ep, is_out);
			if (dma_channel) {
				INFO("Got a DMA channel for ep%d\n", epnum);
				if (is_out)
					hw_ep->tx_channel = dma_channel;
				else
					hw_ep->rx_channel = dma_channel;
			} else {
				WARNING("DMA channel alloc fail for ep%d\n",
					epnum);
			}
		}
	} else {
		INFO("Using PIO for ep%d\n", epnum);
		dma_channel = NULL;
	}

	/* make sure we clear DMAEnab, autoSet bits from previous run */

	/* OUT/transmit/EP0 or IN/receive? */
	if (is_out) {
		u16 csr;
		u16 int_txe;
		u16 load_count;

		csr = musbfsh_readw(epio, MUSBFSH_TXCSR);

		/* disable interrupt in case we flush */
		int_txe = musbfsh_readw(mbase, MUSBFSH_INTRTXE);
		musbfsh_writew(mbase, MUSBFSH_INTRTXE, int_txe & ~(1 << epnum));

		/* general endpoint setup, not ep0 */
		if (epnum) {	/* Tx endpoint */
			/* flush all old state, set default */
			musbfsh_h_tx_flush_fifo(hw_ep);

			/*
			 * We must not clear the DMAMODE bit before or in
			 * the same cycle with the DMAENAB bit, so we clear
			 * the latter first...
			 */
			csr &= ~(MUSBFSH_TXCSR_H_NAKTIMEOUT	|
				MUSBFSH_TXCSR_AUTOSET		|
				MUSBFSH_TXCSR_DMAENAB		|
				MUSBFSH_TXCSR_FRCDATATOG	|
				MUSBFSH_TXCSR_H_RXSTALL		|
				MUSBFSH_TXCSR_H_ERROR		|
				MUSBFSH_TXCSR_TXPKTRDY);

			/* wz add to init the toggle */
			musbfsh_set_toggle(qh, !is_out, urb);

			musbfsh_writew(epio, MUSBFSH_TXCSR, csr);
			/* REVISIT may need to clear FLUSHFIFO ... */
			csr &= ~MUSBFSH_TXCSR_DMAMODE;
			musbfsh_writew(epio, MUSBFSH_TXCSR, csr);
			csr = musbfsh_readw(epio, MUSBFSH_TXCSR);
		} else {
			/* endpoint 0: just flush */
			musbfsh_h_ep0_flush_fifo(hw_ep);
		}

		/* target addr and (for multipoint) hub addr/port */
		if (musbfsh->is_multipoint) {
			musbfsh_write_txfunaddr(mbase, epnum, qh->addr_reg);
			musbfsh_write_txhubaddr(mbase, epnum, qh->h_addr_reg);
			musbfsh_write_txhubport(mbase, epnum, qh->h_port_reg);
			INFO("set address! h_port_reg 0x%x h_addr_reg 0x%x\n",
			     qh->h_port_reg, qh->h_addr_reg);
		} else {
			/* set the address of the device,very important!! */
			musbfsh_writeb(mbase, MUSBFSH_FADDR, qh->addr_reg);
			INFO("set address! 0x%x\n", qh->addr_reg);
		}

		/* protocol/endpoint/interval/NAKlimit */
		if (epnum) {
			/* set the transfer type and endpoint number */
			musbfsh_writeb(epio, MUSBFSH_TXTYPE, qh->type_reg);
			musbfsh_writew(epio, MUSBFSH_TXMAXP, qh->maxpacket);
			musbfsh_writeb(epio, MUSBFSH_TXINTERVAL, qh->intv_reg);
		} else {	/* ep0 */
			musbfsh_writeb(epio, MUSBFSH_NAKLIMIT0, qh->intv_reg);
			if (musbfsh->is_multipoint)
				musbfsh_writeb(epio, MUSBFSH_TYPE0,
					       qh->type_reg);
		}
		load_count = min_t(u32, packet_sz, len);

		/* write data to the fifo */
		if (dma_channel && musbfsh_tx_dma_program(dma_controller,
							  hw_ep, qh, urb,
							  offset, len))
			load_count = 0;

		if (load_count) {	/* dma is not available */
			/* PIO to load FIFO */
			qh->segsize = load_count;
			musbfsh_write_fifo(hw_ep, load_count, buf);
		}

		/* re-enable interrupt */
		/* after load the data to fifo, but not set txpakready */
		musbfsh_writew(mbase, MUSBFSH_INTRTXE, int_txe);

		/* IN/receive */
	} else {
		u16 csr;

		if (hw_ep->rx_reinit) {
			musbfsh_rx_reinit(musbfsh, qh, hw_ep);
			/* wz add to init the toggle */
			musbfsh_set_toggle(qh, !is_out, urb);
			csr = 0;

			/* disable NYET for interrupt transfer */
			if (qh->type == USB_ENDPOINT_XFER_INT)
				csr |= MUSBFSH_RXCSR_DISNYET;

		} else {	/* bulk IN */
			csr = musbfsh_readw(hw_ep->regs, MUSBFSH_RXCSR);

			if (csr & (MUSBFSH_RXCSR_RXPKTRDY |
				   MUSBFSH_RXCSR_DMAENAB  |
				   MUSBFSH_RXCSR_H_REQPKT))
				ERR("broken !rx_reinit, ep%d csr %04x\n",
				    hw_ep->epnum, csr);

			/* scrub any stale state, leaving toggle alone */
			csr &= MUSBFSH_RXCSR_DISNYET;
		}

		/* kick things off */

		csr |= MUSBFSH_RXCSR_H_REQPKT;	/* ask packet from the device */
		INFO("RXCSR%d := %04x\n", epnum, csr);
		musbfsh_writew(hw_ep->regs, MUSBFSH_RXCSR, csr);
		csr = musbfsh_readw(hw_ep->regs, MUSBFSH_RXCSR);
	}
}


/*
 * Service the default endpoint (ep0) as host.
 * Return false until it's time to start the status stage.
 */
static bool musbfsh_h_ep0_continue(struct musbfsh *musbfsh, u16 len,
				   struct urb *urb)
{
	bool more = false;
	u8 *fifo_dest = NULL;
	u16 fifo_count = 0;
	struct musbfsh_hw_ep *hw_ep = musbfsh->control_ep;
	struct musbfsh_qh *qh = hw_ep->in_qh;
	struct usb_ctrlrequest *request;

	INFO("%s++\r\n", __func__);
	switch (musbfsh->ep0_stage) {
	case MUSBFSH_EP0_IN:
		/* actual_length: the data number transferred */
		fifo_dest = urb->transfer_buffer + urb->actual_length;
		fifo_count = min_t(size_t, len,
				   urb->transfer_buffer_length -
					urb->actual_length);

		/* len: the data number in the EP0 fifo */
		if (fifo_count < len)
			urb->status = -EOVERFLOW;

		/* not use dma for ep0 */
		musbfsh_read_fifo(hw_ep, fifo_count, fifo_dest);

		/* update the actual_length! */
		urb->actual_length += fifo_count;
		/*
		 * the in transaction is complete,
		 * should run to status stage.
		 */
		if (len < qh->maxpacket) {
			/* always terminate on short read; it's
			 * rarely reported as an error.
			 more = false;//add by zheng wang
			 */
		} else if (urb->actual_length < urb->transfer_buffer_length)
			more = true;
		break;
	case MUSBFSH_EP0_START:
		request = (struct usb_ctrlrequest *)urb->setup_packet;

		if (!request->wLength) {
			INFO("start no-DATA\n");
			break;
		} else if (request->bRequestType & USB_DIR_IN) {
			INFO("start IN-DATA\n");
			musbfsh->ep0_stage = MUSBFSH_EP0_IN;
			more = true;
			break;	/*wait for next interrupt! */
		}

		INFO("start OUT-DATA\n");
		musbfsh->ep0_stage = MUSBFSH_EP0_OUT;
		more = true;
		/* no break here, send data right now! */
		/* FALLTHROUGH */
	case MUSBFSH_EP0_OUT:
		fifo_count = min_t(size_t, qh->maxpacket,
				   urb->transfer_buffer_length -
					urb->actual_length);
		if (fifo_count) {
			fifo_dest =
				(u8 *)(urb->transfer_buffer +
					urb->actual_length);
			INFO("Sending %d byte%s to ep0 fifo %p\n",
			     fifo_count,
			     (fifo_count == 1) ? "" : "s",
			     fifo_dest);
			musbfsh_write_fifo(hw_ep, fifo_count, fifo_dest);

			urb->actual_length += fifo_count;
			more = true;
		}
		break;
	default:
		ERR("bogus ep0 stage %d\n", musbfsh->ep0_stage);
		break;
	}

	return more;
}

/*
 * Handle default endpoint interrupt as host. Only called in IRQ time
 * from musbfsh_interrupt().
 *
 * called with controller irqlocked
 */
irqreturn_t musbfsh_h_ep0_irq(struct musbfsh *musbfsh)
{
	struct urb *urb;
	u16 csr, len;
	int status = 0;
	void __iomem *mbase = musbfsh->mregs;
	struct musbfsh_hw_ep *hw_ep = musbfsh->control_ep;
	void __iomem *epio = hw_ep->regs;
	struct musbfsh_qh *qh = hw_ep->in_qh;
	bool complete = false;
	irqreturn_t retval = IRQ_NONE;

	INFO("%s++\r\n", __func__);
	/* ep0 only has one queue, "in" */
	urb = next_urb(qh);

	musbfsh_ep_select(mbase, 0);
	csr = musbfsh_readw(epio, MUSBFSH_CSR0);
	len = (csr & MUSBFSH_CSR0_RXPKTRDY)
	    ? musbfsh_readb(epio, MUSBFSH_COUNT0)
	    : 0;

	INFO("<== csr0 %04x, qh %p, count %d, urb %p, stage %d\n",
		csr, qh, len, urb, musbfsh->ep0_stage);

	/* if we just did status stage, we are done */
	if (musbfsh->ep0_stage == MUSBFSH_EP0_STATUS) {
		retval = IRQ_HANDLED;
		complete = true;
	}

	/* prepare status */
	if (csr & MUSBFSH_CSR0_H_RXSTALL) {
		WARNING("STALLING ENDPOINT\n");
		status = -EPIPE;

	} else if (csr & MUSBFSH_CSR0_H_ERROR) {
		WARNING("no response, csr0 %04x\n", csr);
		status = -EPROTO;

	} else if (csr & MUSBFSH_CSR0_H_NAKTIMEOUT) {
		WARNING("control NAK timeout\n");

		/* NOTE:  this code path would be a good place to PAUSE a
		 * control transfer, if another one is queued, so that
		 * ep0 is more likely to stay busy.  That's already done
		 * for bulk RX transfers.
		 *
		 * if (qh->ring.next != &musbfsh->control), then
		 * we have a candidate... NAKing is *NOT* an error
		 */
		musbfsh_writew(epio, MUSBFSH_CSR0, 0);
		retval = IRQ_HANDLED;
	}

	/* if there is an error in the control transfer, and abort it! */
	if (status) {
		INFO("aborting\n");
		retval = IRQ_HANDLED;
		if (urb)
			urb->status = status;
		complete = true;

		/* use the proper sequence to abort the transfer */
		if (csr & MUSBFSH_CSR0_H_REQPKT) {
			csr &= ~MUSBFSH_CSR0_H_REQPKT;
			musbfsh_writew(epio, MUSBFSH_CSR0, csr);
			csr &= ~MUSBFSH_CSR0_H_NAKTIMEOUT;
			musbfsh_writew(epio, MUSBFSH_CSR0, csr);
		} else {
			musbfsh_h_ep0_flush_fifo(hw_ep);
		}

		musbfsh_writeb(epio, MUSBFSH_NAKLIMIT0, 0);

		/* clear it */
		musbfsh_writew(epio, MUSBFSH_CSR0, 0);
	}

	if (unlikely(!urb)) {
		/* stop endpoint since we have no place for its data, this
		 * SHOULD NEVER HAPPEN!
		 */
		ERR("no URB for end 0\n");

		musbfsh_h_ep0_flush_fifo(hw_ep);
		goto done;
	}

	if (!complete) {	/* not the status stage */
		/* call common logic and prepare response */
		if (musbfsh_h_ep0_continue(musbfsh, len, urb)) {
			/* more packets required */
			/*
			 * wz, I think the following code can be
			 * run in musbfsh_h_ep0_continue
			 */
			csr = (musbfsh->ep0_stage == MUSBFSH_EP0_IN)
			    ? MUSBFSH_CSR0_H_REQPKT : MUSBFSH_CSR0_TXPKTRDY;
		} else {
			/* data transfer complete; perform status phase */
			/*
			 * indicate no data stage,
			 * so there is no need to set the stage in
			 * musbfsh_h_ep0_continue
			 */
			if (usb_pipeout(urb->pipe)
			    || !urb->transfer_buffer_length)
				csr = MUSBFSH_CSR0_H_STATUSPKT |
				      MUSBFSH_CSR0_H_REQPKT;
			else
				csr = MUSBFSH_CSR0_H_STATUSPKT |
				      MUSBFSH_CSR0_TXPKTRDY;

			/* flag status stage */
			musbfsh->ep0_stage = MUSBFSH_EP0_STATUS;

			INFO("ep0 STATUS, csr %04x\n", csr);

		}
		musbfsh_writew(epio, MUSBFSH_CSR0, csr);
		retval = IRQ_HANDLED;
	} else
		musbfsh->ep0_stage = MUSBFSH_EP0_IDLE;

	/* call completion handler if done */
	if (complete) {
		/* MYDBG(""); */
		musbfsh_advance_schedule(musbfsh, urb, hw_ep, 1);
	}
done:
	return retval;
}

/* Host side TX (OUT) using Mentor DMA works as follows:
	*	submit_urb ->
	*	- if queue was empty, Program Endpoint
	*	- ... which starts DMA to fifo in mode 1 or 0
	*
	*DMA Isr (transfer complete) -> TxAvail()
	*	- Stop DMA (~DmaEnab)	(<--- Alert ... currently happens
	*				only in musb_cleanup_urb)
	*	- TxPktRdy has to be set in mode 0 or for
	*		short packets in mode 1.
*/

/* Service a Tx-Available or dma completion irq for the endpoint */
void musbfsh_host_tx(struct musbfsh *musbfsh, u8 epnum)	/* real ep num */
{
	int pipe;
	bool done = false;
	u16 tx_csr;
	size_t length = 0;
	size_t offset = 0;
	struct musbfsh_hw_ep *hw_ep = musbfsh->endpoints + epnum;
	void __iomem *epio = hw_ep->regs;
	struct musbfsh_qh *qh = hw_ep->out_qh;

	struct urb *urb = next_urb(qh);	/* the current urb been processing */

	/* indicate the transfer error, if status=0, there is no error! */
	u32 status = 0;
	void __iomem *mbase = musbfsh->mregs;
	struct dma_channel *dma;
	bool transfer_pending = false;

#ifdef CONFIG_MTK_MUSBFSH_QMU_SUPPORT
		if (qh && qh->is_use_qmu)
			return;
#endif

	INFO("%s++, real ep=%d\r\n", __func__, epnum);
	musbfsh_ep_select(mbase, epnum);
	tx_csr = musbfsh_readw(epio, MUSBFSH_TXCSR);

	/* with CPPI, DMA sometimes triggers "extra" irqs */
	if (!urb) {
		INFO("extra TX%d ready, csr %04x\n", epnum, tx_csr);
		return;
	}

	pipe = urb->pipe;
	dma = is_dma_capable() ? hw_ep->tx_channel : NULL;
	INFO("OUT/TX%d end, csr %04x%s\n",
	     epnum, tx_csr, dma ? ", dma" : "pio");

	/* check for errors */
	if (tx_csr & MUSBFSH_TXCSR_H_RXSTALL) {
		/* dma was disabled, fifo flushed */
		WARNING("TX end %d stall\n", epnum);

		/* stall; record URB status */
		status = -EPIPE;

	} else if (tx_csr & MUSBFSH_TXCSR_H_ERROR) {
		/* (NON-ISO) dma was disabled, fifo flushed */
		WARNING("TX 3strikes on ep=%d\n", epnum);

		status = -ETIMEDOUT;

	} else if (tx_csr & MUSBFSH_TXCSR_H_NAKTIMEOUT) {
		WARNING("TX end=%d device not responding\n", epnum);

		/* NOTE:  this code path would be a good place to PAUSE a
		 * transfer, if there's some other (nonperiodic) tx urb
		 * that could use this fifo.  (dma complicates it...)
		 * That's already done for bulk RX transfers.
		 *
		 * if (bulk && qh->ring.next != &musbfsh->out_bulk), then
		 * we have a candidate... NAKing is *NOT* an error
		 */
		musbfsh_ep_select(mbase, epnum);
		musbfsh_writew(epio, MUSBFSH_TXCSR,
			       MUSBFSH_TXCSR_H_WZC_BITS |
			       MUSBFSH_TXCSR_TXPKTRDY);
		return;
	}

	/* if status is not 0, have error, will stop to send data. */
	if (status) {
		if (dma_channel_status(dma) == MUSBFSH_DMA_STATUS_BUSY) {
			dma->status = MUSBFSH_DMA_STATUS_CORE_ABORT;
			(void)musbfsh->dma_controller->channel_abort(dma);
		}

		/* do the proper sequence to abort the transfer in the
		 * usb core; the dma engine should already be stopped.
		 */
		musbfsh_h_tx_flush_fifo(hw_ep);
		tx_csr &= ~(MUSBFSH_TXCSR_AUTOSET |
			    MUSBFSH_TXCSR_DMAENAB |
			    MUSBFSH_TXCSR_H_ERROR |
			    MUSBFSH_TXCSR_H_RXSTALL |
			    MUSBFSH_TXCSR_H_NAKTIMEOUT);

		musbfsh_ep_select(mbase, epnum);
		musbfsh_writew(epio, MUSBFSH_TXCSR, tx_csr);
		/* REVISIT may need to clear FLUSHFIFO ... */
		musbfsh_writew(epio, MUSBFSH_TXCSR, tx_csr);
		musbfsh_writeb(epio, MUSBFSH_TXINTERVAL, 0);

		done = true;
	}

	/* second cppi case */
	if (dma_channel_status(dma) == MUSBFSH_DMA_STATUS_BUSY) {
		INFO("extra TX%d ready, csr %04x\n", epnum, tx_csr);
		return;
	}

	if (is_dma_capable() && dma && !status) {
		/*
		 * DMA has completed.  But if we're using DMA mode 1 (multi
		 * packet DMA), we need a terminal TXPKTRDY interrupt before
		 * we can consider this transfer completed, lest we trash
		 * its last packet when writing the next URB's data.  So we
		 * switch back to mode 0 to get that interrupt; we'll come
		 * back here once it happens.
		 */
		if (tx_csr & MUSBFSH_TXCSR_DMAMODE) {
			/*
			 * We shouldn't clear DMAMODE with DMAENAB set; so
			 * clear them in a safe order.  That should be OK
			 * once TXPKTRDY has been set (and I've never seen
			 * it being 0 at this moment -- DMA interrupt latency
			 * is significant) but if it hasn't been then we have
			 * no choice but to stop being polite and ignore the
			 * programmer's guide... :-)
			 *
			 * Note that we must write TXCSR with TXPKTRDY cleared
			 * in order not to re-trigger the packet send (this bit
			 * can't be cleared by CPU), and there's another caveat:
			 * TXPKTRDY may be set shortly and then cleared in the
			 * double-buffered FIFO mode, so we do an extra TXCSR
			 * read for debouncing...
			 */
			tx_csr &= musbfsh_readw(epio, MUSBFSH_TXCSR);
			if (tx_csr & MUSBFSH_TXCSR_TXPKTRDY) {
				tx_csr &= ~(MUSBFSH_TXCSR_DMAENAB |
					    MUSBFSH_TXCSR_TXPKTRDY);
				musbfsh_writew(epio, MUSBFSH_TXCSR,
					       tx_csr |
					       MUSBFSH_TXCSR_H_WZC_BITS);
			}
			tx_csr &= ~(MUSBFSH_TXCSR_DMAMODE |
				    MUSBFSH_TXCSR_TXPKTRDY);
			musbfsh_writew(epio, MUSBFSH_TXCSR,
				       tx_csr | MUSBFSH_TXCSR_H_WZC_BITS);

			/*
			 * There is no guarantee that we'll get an interrupt
			 * after clearing DMAMODE as we might have done this
			 * too late (after TXPKTRDY was cleared by controller).
			 * Re-read TXCSR as we have spoiled its previous value.
			 */
			tx_csr = musbfsh_readw(epio, MUSBFSH_TXCSR);
		}

		/*
		 * We may get here from a DMA completion or TXPKTRDY interrupt.
		 * In any case, we must check the FIFO status here and bail out
		 * only if the FIFO still has data -- that should prevent the
		 * "missed" TXPKTRDY interrupts and deal with double-buffered
		 * FIFO mode too...
		 */
		if (tx_csr &
			(MUSBFSH_TXCSR_FIFONOTEMPTY | MUSBFSH_TXCSR_TXPKTRDY)) {
			INFO("DMA complete but Data still in FIFO, CSR %04x\n",
			     tx_csr);
			return;
		}
	}

	if (!status || dma || usb_pipeisoc(pipe)) {
		if (dma)
			length = dma->actual_len;
		else
			length = qh->segsize;
		qh->offset += length;

		if (usb_pipeisoc(pipe)) {
			struct usb_iso_packet_descriptor *d;

			d = urb->iso_frame_desc + qh->iso_idx;
			d->actual_length = length;
			d->status = status;
			if (++qh->iso_idx >= urb->number_of_packets) {
				done = true;
			} else {
				d++;
				offset = d->offset;
				length = d->length;
			}
/* } else if (dma) { */
		} else if (dma && urb->transfer_buffer_length == qh->offset) {
			done = true;
		} else {
			/* see if we need to send more data, or ZLP */
			/* sent a short packet */
			if (qh->segsize < qh->maxpacket)
				done = true;
			else if (qh->offset == urb->transfer_buffer_length
				 && !(urb->transfer_flags & URB_ZERO_PACKET))
				done = true;
			if (!done) {
				offset = qh->offset;
				length = urb->transfer_buffer_length - offset;
				transfer_pending = true;
			}
		}
	}

	/* urb->status != -EINPROGRESS means request has been faulted,
	 * so we must abort this transfer after cleanup
	 */
	if (urb->status != -EINPROGRESS) {
		done = true;
		if (status == 0)
			status = urb->status;
	}

	if (done) {
		/* set status */
		urb->status = status;
		urb->actual_length = qh->offset;
		musbfsh_advance_schedule(musbfsh, urb, hw_ep, USB_DIR_OUT);
		return;
	} else if (transfer_pending && dma) {
		if (musbfsh_tx_dma_program(musbfsh->dma_controller,
					   hw_ep, qh, urb, offset, length))
			return;
	} else if (tx_csr & MUSBFSH_TXCSR_DMAENAB) {
		WARNING("not complete, but DMA enabled?\n");
		return;
	}

	/*
	 * PIO: start next packet in this URB.
	 *
	 * REVISIT: some docs say that when hw_ep->tx_double_buffered,
	 * (and presumably, FIFO is not half-full) we should write *two*
	 * packets before updating TXCSR; other docs disagree...
	 */
	if (length > qh->maxpacket)
		length = qh->maxpacket;
	/* Unmap the buffer so that CPU can use it */
	usb_hcd_unmap_urb_for_dma(musbfsh_to_hcd(musbfsh), urb);
	musbfsh_write_fifo(hw_ep, length, urb->transfer_buffer + offset);
	qh->segsize = length;

	musbfsh_ep_select(mbase, epnum);
	musbfsh_writew(epio, MUSBFSH_TXCSR, MUSBFSH_TXCSR_H_WZC_BITS |
		       MUSBFSH_TXCSR_TXPKTRDY);
}


/* Host side RX (IN) using Mentor DMA works as follows:
	*	submit_urb ->
	*	- if queue was empty, ProgramEndpoint
	*	- first IN token is sent out (by setting ReqPkt)
	*LinuxIsr -> RxReady()
	*	/\	=> first packet is received
	*	|	- Set in mode 0 (DmaEnab, ~ReqPkt)
	*	|		-> DMA Isr (transfer complete) -> RxReady()
	*	|		    - Ack receive (~RxPktRdy), turn off DMA (~DmaEnab)
	*	|		    - if urb not complete, send next IN token (ReqPkt)
	*	|			   |		else complete urb.
	*	|			   |
	*---------------------------
 *
 * Nuances of mode 1:
 *	For short packets, no ack (+RxPktRdy) is sent automatically
 *	(even if AutoClear is ON)
 *	For full packets, ack (~RxPktRdy) and next IN token (+ReqPkt) is sent
 *	automatically => major problem, as collecting the next packet becomes
 *	difficult. Hence mode 1 is not used.
 *
 * REVISIT
 *	All we care about at this driver level is that
 *       (a) all URBs terminate with REQPKT cleared and fifo(s) empty;
 *       (b) termination conditions are: short RX, or buffer full;
 *       (c) fault modes include
 *           - iff URB_SHORT_NOT_OK, short RX status is -EREMOTEIO.
 *             (and that endpoint's dma queue stops immediately)
 *           - overflow (full, PLUS more bytes in the terminal packet)
 *
 *	So for example, usb-storage sets URB_SHORT_NOT_OK, and would
 *	thus be a great candidate for using mode 1 ... for all but the
 *	last packet of one URB's transfer.
 */

/* Schedule next QH from musbfsh->in_bulk and move the current qh to
 * the end; avoids starvation for other endpoints.
 */
static void musbfsh_bulk_rx_nak_timeout(struct musbfsh *musbfsh,
					struct musbfsh_hw_ep *ep)
{
	struct dma_channel *dma;
	struct urb *urb;
	void __iomem *mbase = musbfsh->mregs;
	void __iomem *epio = ep->regs;
	struct musbfsh_qh *cur_qh, *next_qh;
	u16 rx_csr;

	INFO("musbfsh_bulk_rx_nak_timeout++\r\n");
	musbfsh_ep_select(mbase, ep->epnum);
	dma = is_dma_capable() ? ep->rx_channel : NULL;

	/* clear nak timeout bit */
	rx_csr = musbfsh_readw(epio, MUSBFSH_RXCSR);
	rx_csr |= MUSBFSH_RXCSR_H_WZC_BITS;
	rx_csr &= ~MUSBFSH_RXCSR_DATAERROR;
	musbfsh_writew(epio, MUSBFSH_RXCSR, rx_csr);

	cur_qh = first_qh(&musbfsh->in_bulk);
	if (cur_qh) {
		urb = next_urb(cur_qh);
		if (dma_channel_status(dma) == MUSBFSH_DMA_STATUS_BUSY) {
			dma->status = MUSBFSH_DMA_STATUS_CORE_ABORT;
			musbfsh->dma_controller->channel_abort(dma);
			urb->actual_length += dma->actual_len;
			dma->actual_len = 0L;
		}
		musbfsh_save_toggle(cur_qh, 1, urb);

		/* move cur_qh to end of queue */
		list_move_tail(&cur_qh->ring, &musbfsh->in_bulk);

		/* get the next qh from musbfsh->in_bulk */
		next_qh = first_qh(&musbfsh->in_bulk);

		/* set rx_reinit and schedule the next qh */
		ep->rx_reinit = 1;
		/* MYDBG("musbfsh_start_urb go\n"); */
		musbfsh_start_urb(musbfsh, 1, next_qh);
	}
}

/*
 * Service an RX interrupt for the given IN endpoint; docs cover bulk, iso,
 * and high-bandwidth IN transfer cases.
 */
void musbfsh_host_rx(struct musbfsh *musbfsh, u8 epnum)
{
	struct urb *urb;
	struct musbfsh_hw_ep *hw_ep = musbfsh->endpoints + epnum;
	void __iomem *epio = hw_ep->regs;
	struct musbfsh_qh *qh = hw_ep->in_qh;
	size_t xfer_len;
	void __iomem *mbase = musbfsh->mregs;
	int pipe;
	u16 rx_csr, val;
	bool done = false;
	u32 status;
	struct dma_channel *dma;
	bool iso_err = false;

#ifdef CONFIG_MTK_MUSBFSH_QMU_SUPPORT
	if (qh && qh->is_use_qmu)
		return;
#endif

	INFO("musbfsh_host_rx++,real ep=%d\r\n", epnum);
	musbfsh_ep_select(mbase, epnum);

	urb = next_urb(qh);	/* current urb */
	dma = is_dma_capable() ? hw_ep->rx_channel : NULL;

	if (dma && (dma->status == MUSBFSH_DMA_STATUS_BUSY)) {
		INFO("not Dma interrupt %s, @Line %d\n", __func__, __LINE__);
		return;
	}

	status = 0;
	xfer_len = 0;

	rx_csr = musbfsh_readw(epio, MUSBFSH_RXCSR);
	val = rx_csr;

	if (unlikely(!urb)) {
		/* REVISIT -- THIS SHOULD NEVER HAPPEN ... but, at least
		 * usbtest #11 (unlinks) triggers it regularly, sometimes
		 * with fifo full.  (Only with DMA??)
		 */
		WARNING("BOGUS RX%d ready, csr %04x, count %d\n", epnum, val,
			musbfsh_readw(epio, MUSBFSH_RXCOUNT));
		musbfsh_h_flush_rxfifo(hw_ep, 0);
		return;
	}

	pipe = urb->pipe;

	INFO("<==real hw %d rxcsr %04x, urb actual %d (+dma %zu)\n",
	     epnum, rx_csr, urb->actual_length, dma ? dma->actual_len : 0);

	/* check for errors, concurrent stall & unlink is not really
	 * handled yet!
	 */
	if (rx_csr & MUSBFSH_RXCSR_H_RXSTALL) {
		WARNING("RX end %d STALL\n", epnum);
		rx_csr &= ~MUSBFSH_RXCSR_H_RXSTALL;
		musbfsh_writew(epio, MUSBFSH_RXCSR, rx_csr);
		/* stall; record URB status */
		status = -EPIPE;

	} else if (rx_csr & MUSBFSH_RXCSR_H_ERROR) {
		WARNING("end %d RX proto error\n", epnum);

		status = -EPROTO;
		musbfsh_writeb(epio, MUSBFSH_RXINTERVAL, 0);

	} else if (rx_csr & MUSBFSH_RXCSR_DATAERROR) {
		if (qh->type != USB_ENDPOINT_XFER_ISOC) {
			INFO("RX end %d NAK timeout\n", epnum);
			/* removed due to too many logs */

			/* NOTE: NAKing is *NOT* an error, so we want to
			 * continue.  Except ... if there's a request for
			 * another QH, use that instead of starving it.
			 *
			 * Devices like Ethernet and serial adapters keep
			 * reads posted at all times, which will starve
			 * other devices without this logic.
			 */
			if (usb_pipebulk(urb->pipe)
			    && qh->mux == 1 && !list_is_singular(&musbfsh->in_bulk)) {
				musbfsh_bulk_rx_nak_timeout(musbfsh, hw_ep);
				return;
			}
			musbfsh_ep_select(mbase, epnum);
			rx_csr |= MUSBFSH_RXCSR_H_WZC_BITS;
			rx_csr &= ~MUSBFSH_RXCSR_DATAERROR;
			musbfsh_writew(epio, MUSBFSH_RXCSR, rx_csr);
			goto finish;
		} else {
			INFO("RX end %d ISO data error\n", epnum);
			/* packet error reported later */
			iso_err = true;
		}
	} else if (rx_csr & MUSBFSH_RXCSR_INCOMPRX) {
		WARNING("end %d high bandwidth incomplete ISO packet RX\n",
			epnum);
		status = -EPROTO;
	}

	/* faults abort the transfer */
	if (status) {
		/* clean up dma and collect transfer count */
		if (dma_channel_status(dma) == MUSBFSH_DMA_STATUS_BUSY) {
			dma->status = MUSBFSH_DMA_STATUS_CORE_ABORT;
			(void)musbfsh->dma_controller->channel_abort(dma);
			xfer_len = dma->actual_len;
			dma->actual_len = 0L;
		}
		musbfsh_h_flush_rxfifo(hw_ep, 0);
		musbfsh_writeb(epio, MUSBFSH_RXINTERVAL, 0);

#ifdef CONFIG_MTK_DT_USB_SUPPORT
		if (!musbfsh_connect_flag) {
			MYDBG("err(%d) after disc\n", status);
			return;
		}
#endif

		done = true;
		goto finish;
	}

	if (unlikely(dma_channel_status(dma) == MUSBFSH_DMA_STATUS_BUSY)) {
		/* SHOULD NEVER HAPPEN ... but at least DaVinci has done it */
		ERR("RX%d dma busy, csr %04x\n", epnum, rx_csr);
		goto finish;
	}

	/* thorough shutdown for now ... given more precise fault handling
	 * and better queueing support, we might keep a DMA pipeline going
	 * while processing this irq for earlier completions.
	 */

	/* FIXME this is _way_ too much in-line logic for Mentor DMA */
	/* here rx_csr & MUSBFSH_RXCSR_DMAENAB is very very important! */
	if (dma && (rx_csr & MUSBFSH_RXCSR_DMAENAB)) {
		xfer_len = dma->actual_len;

		/* These should be clear! */
		val &= ~(MUSBFSH_RXCSR_DMAENAB |
			MUSBFSH_RXCSR_H_AUTOREQ |
			MUSBFSH_RXCSR_AUTOCLEAR |
			MUSBFSH_RXCSR_RXPKTRDY);
		musbfsh_writew(hw_ep->regs, MUSBFSH_RXCSR, val);

		if (usb_pipeisoc(pipe)) {
			struct usb_iso_packet_descriptor *d;

			d = urb->iso_frame_desc + qh->iso_idx;
			d->actual_length = xfer_len;

			/* even if there was an error, we did the dma
			 * for iso_frame_desc->length
			 */
			if (d->status != -EILSEQ && d->status != -EOVERFLOW)
				d->status = 0;

			if (++qh->iso_idx >= urb->number_of_packets)
				done = true;
			else
				done = false;
		} else
			done = (urb->actual_length + xfer_len >=
				urb->transfer_buffer_length ||
				dma->actual_len < qh->maxpacket);

		dma->actual_len = 0L;

		/* send IN token for next packet, without AUTOREQ */
		if (!done) {
			val |= MUSBFSH_RXCSR_H_REQPKT;
			musbfsh_writew(epio, MUSBFSH_RXCSR,
				       MUSBFSH_RXCSR_H_WZC_BITS | val);
		}

		INFO("ep %d dma %s, rxcsr %04x, rxcount %d\n", epnum,
		     done ? "off" : "reset",
		     musbfsh_readw(epio, MUSBFSH_RXCSR),
				   musbfsh_readw(epio, MUSBFSH_RXCOUNT));
	} else if (urb->status == -EINPROGRESS) {
		/* if no errors, be sure a packet is ready for unloading */
		if (unlikely(!(rx_csr & MUSBFSH_RXCSR_RXPKTRDY))) {
			status = -EPROTO;
			ERR("Rx interrupt with no errors or packet!\n");

			/* FIXME this is another "SHOULD NEVER HAPPEN" */

			/* SCRUB (RX) */
			/* do the proper sequence to abort the transfer */
			musbfsh_ep_select(mbase, epnum);
			val &= ~MUSBFSH_RXCSR_H_REQPKT;
			musbfsh_writew(epio, MUSBFSH_RXCSR, val);
			goto finish;
		}

		/* we are expecting IN packets */
		if (dma) {
			struct dma_controller *c;
			u16 rx_count;
			int ret, length;
			dma_addr_t buf;

			rx_count = musbfsh_readw(epio, MUSBFSH_RXCOUNT);

			INFO("RX%d count %d, buffer 0x%x len %d/%d\n",
			     epnum, rx_count,
			     (unsigned int)urb->transfer_dma
			     + urb->actual_length, qh->offset,
			     urb->transfer_buffer_length);

			c = musbfsh->dma_controller;
			if (usb_pipeisoc(pipe)) {
				int d_status = 0;
				struct usb_iso_packet_descriptor *d;

				d = urb->iso_frame_desc + qh->iso_idx;

				if (iso_err) {
					d_status = -EILSEQ;
					urb->error_count++;
				}
				if (rx_count > d->length) {
					if (d_status == 0) {
						d_status = -EOVERFLOW;
						urb->error_count++;
					}
					INFO("** OVERFLOW %d into %d\n", rx_count, d->length);

					length = d->length;
				} else
					length = rx_count;
				d->status = d_status;
				buf = urb->transfer_dma + d->offset;
			} else {
				length = rx_count;
				buf = urb->transfer_dma + urb->actual_length;
			}
			dma->desired_mode = 0;
#ifdef USE_MODE1
			/* because of the issue below, mode 1 will
			 * only rarely behave with correct semantics.
			 */
			if ((urb->transfer_flags & URB_SHORT_NOT_OK) &&
			    (urb->transfer_buffer_length - urb->actual_length) >
			    qh->maxpacket)
				dma->desired_mode = 1;
			if (rx_count < hw_ep->max_packet_sz_rx) {
				length = rx_count;
				dma->desired_mode = 0;
			} else {
				length = urb->transfer_buffer_length;
			}
#endif

			/*
			 * Disadvantage of using mode 1:
			 *      It's basically usable only for mass storage
			 *	class; essentially all other protocols also
			 *	terminate transfers on short packets.
			 *
			 * Details:
			 *      An extra IN token is sent at the end of the
			 *	transfer (due to AUTOREQ). If you try to use
			 *	mode 1 for (transfer_buffer_length - 512),
			 *	and try to use the extra IN token to grab the
			 *	last packet using mode 0, then the problem is
			 *	that you cannot be sure when the device will
			 *	send the last packet and RxPktRdy set.
			 *	Sometimes the packet is recd too soon such that
			 *	it gets lost when RxCSR is re-set at the end of
			 *	the mode 1 transfer, while sometimes it is recd
			 *	just a little late so that if you try to
			 *	configure for mode 0 soon after the mode 1
			 *	transfer is completed, you will find rxcount 0.
			 *
			 *	Okay, so you might think why not
			 *      wait for an interrupt when the pkt is recd.
			 *	Well, you won't get any!
			 */

			val = musbfsh_readw(epio, MUSBFSH_RXCSR);
			val &= ~MUSBFSH_RXCSR_H_REQPKT;

			if (dma->desired_mode == 0)
				val &= ~MUSBFSH_RXCSR_H_AUTOREQ;
			else
				val |= MUSBFSH_RXCSR_H_AUTOREQ;

			val |= MUSBFSH_RXCSR_DMAENAB;

			musbfsh_writew(epio, MUSBFSH_RXCSR,
				       MUSBFSH_RXCSR_H_WZC_BITS | val);

			/* REVISIT if when actual_length != 0,
			 * transfer_buffer_length needs to be
			 * adjusted first...
			 */
			/*
			 * dma is a dma channel, which is already allocated for
			 * the Rx EP in the func:musbfsh_ep_program
			 */
			ret = c->channel_program(dma, qh->maxpacket,
						 dma->desired_mode, buf,
						 length);

			if (!ret) {
				c->channel_release(dma);
				hw_ep->rx_channel = NULL;
				dma = NULL;
				/* REVISIT reset CSR */
			}
		}

		if (!dma) {
			/* Unmap the buffer so that CPU can use it */
			usb_hcd_unmap_urb_for_dma(musbfsh_to_hcd(musbfsh), urb);
			done = musbfsh_host_packet_rx(musbfsh, urb, epnum, iso_err);
			INFO("read %spacket\n", done ? "last " : "");
		}
	}

finish:
	urb->actual_length += xfer_len;
	qh->offset += xfer_len;
	if (done) {
		if (urb->status == -EINPROGRESS)
			urb->status = status;
		musbfsh_advance_schedule(musbfsh, urb, hw_ep, USB_DIR_IN);
	}
}

/* schedule nodes correspond to peripheral endpoints, like an OHCI QH.
 * the software schedule associates multiple such nodes with a given
 * host side hardware endpoint + direction; scheduling may activate
 * that hardware endpoint.
 */
static int musbfsh_schedule(struct musbfsh *musbfsh, struct musbfsh_qh *qh,
			    int is_in)
{
	int idle;
	int epnum, hw_end = 0;
	struct musbfsh_hw_ep *hw_ep = NULL;
	struct list_head *head = NULL;

	INFO("%s++, qh->epnum=%d, is_in=%d\r\n",
	     __func__, qh->epnum, (unsigned int)is_in);
	/* use fixed hardware for control and bulk */
	if (qh->type == USB_ENDPOINT_XFER_CONTROL) {
		head = &musbfsh->control;
		hw_ep = musbfsh->control_ep;
		goto success;
	}

#ifdef MUSBFSH_QMU_LIMIT_SUPPORT
	if (mtk11_isoc_ep_gpd_count
		&& qh->is_use_qmu) {
		for (epnum = 1, hw_ep = musbfsh->endpoints + 1;
				epnum <= MAX_QMU_EP; epnum++, hw_ep++) {
			/* int	diff; */

			if (musbfsh_ep_get_qh(hw_ep, is_in) != NULL)
				continue;

			hw_end = epnum;
			hw_ep = musbfsh->endpoints + hw_end;	/* got the right ep */
			break;
		}

		if (hw_end) {
			idle = 1;
			qh->mux = 0;
			goto success;
		}
	}
	qh->is_use_qmu = 0;
	for (epnum = (MAX_QMU_EP + 1), hw_ep = musbfsh->endpoints + (MAX_QMU_EP + 1);
		epnum < musbfsh->nr_endpoints; epnum++, hw_ep++) {
		if (musbfsh_ep_get_qh(hw_ep, is_in) != NULL)
			continue;

		hw_end = epnum;
		hw_ep = musbfsh->endpoints + hw_end;	/* got the right ep */
		break;
	}

	if (hw_end) {
		idle = 1;
		qh->mux = 0;
		goto success;
	}

	if (!hw_end) {
		for (epnum = 1, hw_ep = musbfsh->endpoints + 1;
				epnum <= MAX_QMU_EP; epnum++, hw_ep++) {
			/* int	diff; */

			if (musbfsh_ep_get_qh(hw_ep, is_in) != NULL)
				continue;

			hw_end = epnum;
			hw_ep = musbfsh->endpoints + hw_end;	/* got the right ep */
			break;
		}
	}

	if (hw_end) {
		idle = 1;
		qh->mux = 0;
		goto success;
	} else {
		WARNING("EP OVERFLOW.\n");
		return -ENOSPC;
	}
#endif

#ifdef CONFIG_MTK_MUSBFSH_QMU_SUPPORT
	if (mtk11_isoc_ep_gpd_count
		&& qh->type == USB_ENDPOINT_XFER_ISOC) {
		for (epnum = mtk11_isoc_ep_start_idx, hw_ep = musbfsh->endpoints + mtk11_isoc_ep_start_idx;
				epnum < musbfsh->nr_endpoints; epnum++, hw_ep++) {
			/* int	diff; */

			if (musbfsh_ep_get_qh(hw_ep, is_in) != NULL)
				continue;

			hw_end = epnum;
			hw_ep = musbfsh->endpoints + hw_end;	/* got the right ep */
			break;
		}

		if (hw_end) {
			idle = 1;
			qh->mux = 0;
			goto success;
		}
	}
#endif

	/* else, periodic transfers get muxed to other endpoints */

	/*
	 * We know this qh hasn't been scheduled, so all we need to do
	 * is choose which hardware endpoint to put it on ...
	 *
	 * REVISIT what we really want here is a regular schedule tree
	 * like e.g. OHCI uses.
	 */
	for (epnum = 1, hw_ep = musbfsh->endpoints + 1;
	     epnum < musbfsh->nr_endpoints; epnum++, hw_ep++) {

		if (musbfsh_ep_get_qh(hw_ep, is_in) != NULL)
			continue;

#ifdef CONFIG_MTK_MUSBFSH_QMU_SUPPORT
		if (mtk11_isoc_ep_gpd_count && (epnum >= mtk11_isoc_ep_start_idx)) {
			epnum = musbfsh->nr_endpoints;
			continue;
		}
#endif

		hw_end = epnum;
		hw_ep = musbfsh->endpoints + hw_end;	/* got the right ep */
		break;
	}

#ifdef CONFIG_MTK_MUSBFSH_QMU_SUPPORT
	/* grab isoc ep if no other ep is available */
	if (mtk11_isoc_ep_gpd_count &&
		!hw_end &&
		qh->type != USB_ENDPOINT_XFER_ISOC) {
		for (epnum = mtk11_isoc_ep_start_idx, hw_ep = musbfsh->endpoints + mtk11_isoc_ep_start_idx;
				epnum < musbfsh->nr_endpoints; epnum++, hw_ep++) {
			/* int	diff; */

			if (musbfsh_ep_get_qh(hw_ep, is_in) != NULL)
				continue;

			hw_end = epnum;
			hw_ep = musbfsh->endpoints + hw_end;	/* got the right ep */
			break;
		}
	}
#endif
	if (!hw_end)
		return -ENOSPC;

	idle = 1;
	qh->mux = 0;
success:
	if (head) {
#ifdef CONFIG_MTK_DT_USB_SUPPORT
		MYDBG("head!=NULL\n");
#endif
		idle = list_empty(head);
		list_add_tail(&qh->ring, head);
		qh->mux = 1;
	}
	qh->hw_ep = hw_ep;
	qh->hep->hcpriv = qh;

	if (musbfsh_host_dynamic_fifo && qh->type != USB_ENDPOINT_XFER_CONTROL) {
		int ret;

		/* take this after qh->hw_ep is set */
		ret = musbfsh_host_alloc_ep_fifo(musbfsh, qh, is_in);
		if (ret) {
			qh->hw_ep = NULL;
			qh->hep->hcpriv = NULL;
			WARNING("NOT ENOUGH FIFO\n");
			return -ENOSPC;
		}
	}
	hw_ep->type = qh->type;
	/* the new urb added is the first urb now, excute it! */
	if (idle) {
#ifdef CONFIG_MTK_DT_USB_SUPPORT
		mark_qh_activity(qh->epnum, hw_ep->epnum, is_in, 0);
#endif

/* downgrade to non-qmu if no specific ep grabbed whenmtk11_ isoc_ep_gpd_count is set*/
#ifdef CONFIG_MTK_MUSBFSH_QMU_SUPPORT
#ifdef MUSBFSH_QMU_LIMIT_SUPPORT
		if (mtk11_isoc_ep_gpd_count &&
			qh->is_use_qmu &&
			hw_end <= MAX_QMU_EP)
			qh->is_use_qmu = 1;
#else
		if (mtk11_isoc_ep_gpd_count &&
			qh->type == USB_ENDPOINT_XFER_ISOC &&
			hw_end < mtk11_isoc_ep_start_idx)
			qh->is_use_qmu = 0;
#endif

		if (qh->is_use_qmu) {
			musbfsh_ep_set_qh(hw_ep, is_in, qh);
			mtk11_kick_CmdQ(musbfsh, is_in ? 1:0, qh, next_urb(qh));
		} else
			musbfsh_start_urb(musbfsh, is_in, qh);
#else
		musbfsh_start_urb(musbfsh, is_in, qh);
#endif

	}
	return 0;
}

static int musbfsh_urb_enqueue(struct usb_hcd *hcd, struct urb *urb,
			       gfp_t mem_flags)
{
	unsigned long flags;
	struct musbfsh *musbfsh = hcd_to_musbfsh(hcd);
	struct usb_host_endpoint *hep = urb->ep;
	struct musbfsh_qh *qh;
	struct usb_endpoint_descriptor *epd = &hep->desc;
	int ret;
	unsigned type_reg;
	unsigned interval;

	INFO("musbfsh_urb_enqueue++:urb addr=0x%p\r\n", urb);

	/*
	 * MYDBG("urb:%x, blen:%d, alen:%d, ep:%x\n",
	 * urb, urb->transfer_buffer_length, urb->actual_length,
	 * epd->bEndpointAddress);
	 */
	/*
	 * workaround for DMA issue,
	 * to make usb core jump over unmap_urb_for_dma
	 * in usb_hcd_giveback_urb for control message
	 */
	if (usb_endpoint_num(epd) == 0)
		urb->transfer_flags &= ~URB_DMA_MAP_SINGLE;
	spin_lock_irqsave(&musbfsh->lock, flags);

	init_completion(&urb->done);

	/* add the urb to the ep, return 0 for no error. */
	ret = usb_hcd_link_urb_to_ep(hcd, urb);
	qh = ret ? NULL : hep->hcpriv;
	if (qh)
		urb->hcpriv = qh;

#ifdef CONFIG_MTK_MUSBFSH_BIND_DEV_EP
	if (qh && (ret == 0) && qh->resubmit) {
		qh->resubmit = 0;

#ifdef CONFIG_MTK_MUSBFSH_QMU_SUPPORT
		if (mtk11_host_qmu_concurrent && qh && qh->is_use_qmu && (ret == 0)) {
			mtk11_kick_CmdQ(musbfsh, (epd->bEndpointAddress & USB_ENDPOINT_DIR_MASK) ? 1:0, qh, urb);
			spin_unlock_irqrestore(&musbfsh->lock, flags);
			return ret;
		}
#endif
		musbfsh_start_urb(musbfsh, (epd->bEndpointAddress & USB_ENDPOINT_DIR_MASK) ? 1:0, qh);
		spin_unlock_irqrestore(&musbfsh->lock, flags);
		return ret;
	}
#endif

	/* DMA mapping was already done, if needed, and this urb is on
	 * hep->urb_list now ... so we're done, unless hep wasn't yet
	 * scheduled onto a live qh.
	 *
	 * REVISIT best to keep hep->hcpriv valid until the endpoint gets
	 * disabled, testing for empty qh->ring and avoiding qh setup costs
	 * except for the first urb queued after a config change.
	 */
#ifdef CONFIG_MTK_MUSBFSH_QMU_SUPPORT
	if (mtk11_host_qmu_concurrent && qh && qh->is_use_qmu && (ret == 0)) {
		mtk11_kick_CmdQ(musbfsh, (epd->bEndpointAddress & USB_ENDPOINT_DIR_MASK) ? 1:0, qh, urb);
		spin_unlock_irqrestore(&musbfsh->lock, flags);
		return ret;
	}
#endif
	if (qh || ret) {
		spin_unlock_irqrestore(&musbfsh->lock, flags);
		return ret;
	}

	/* Allocate and initialize qh, minimizing the work done each time
	 * hw_ep gets reprogrammed, or with irqs blocked.  Then schedule it.
	 *
	 * REVISIT consider a dedicated qh kmem_cache, so it's harder
	 * for bugs in other kernel code to break this driver...
	 */
	qh = kzalloc(sizeof(*qh), GFP_ATOMIC);
	if (!qh) {
		usb_hcd_unlink_urb_from_ep(hcd, urb);
		spin_unlock_irqrestore(&musbfsh->lock, flags);
		return -ENOMEM;
	}

	qh->hep = hep;
	qh->dev = urb->dev;
	INIT_LIST_HEAD(&qh->ring);
	qh->is_ready = 1;

	qh->maxpacket = le16_to_cpu(epd->wMaxPacketSize);
	qh->type = usb_endpoint_type(epd);
	INFO("desc type=%d\r\n", qh->type);
	/* Bits 11 & 12 of wMaxPacketSize encode high bandwidth multiplier.
	 * Some musb cores don't support high bandwidth ISO transfers; and
	 * we don't (yet!) support high bandwidth interrupt transfers.
	 */
	qh->hb_mult = 1 + ((qh->maxpacket >> 11) & 0x03);
	if (qh->hb_mult > 1) {
		int ok = (qh->type == USB_ENDPOINT_XFER_ISOC);

		if (ok)
			ok = (usb_pipein(urb->pipe) && musbfsh->hb_iso_rx)
				|| (usb_pipeout(urb->pipe) && musbfsh->hb_iso_tx);

		if (!ok) {
			ret = -EMSGSIZE;
			goto done;
		}
		qh->maxpacket &= 0x7ff;
	}
	qh->epnum = usb_endpoint_num(epd);
	INFO("desc epnum=%d\r\n", qh->epnum);

	/* NOTE: urb->dev->devnum is wrong during SET_ADDRESS */
	qh->addr_reg = (u8) usb_pipedevice(urb->pipe);
	INFO("desc pipe=0x%x, desc devnum=%d\r\n", urb->pipe, urb->dev->devnum);

	/* precompute rxtype/txtype/type0 register */
	type_reg = (qh->type << 4) | qh->epnum;
	switch (urb->dev->speed) {
	case USB_SPEED_LOW:
		type_reg |= 0xc0;
		break;
	case USB_SPEED_FULL:
		type_reg |= 0x80;
		break;
	default:
		type_reg |= 0x40;
	}
	qh->type_reg = type_reg;

	/* Precompute RXINTERVAL/TXINTERVAL register */
	switch (qh->type) {
	case USB_ENDPOINT_XFER_INT:
		/*
		 * Full/low speeds use the  linear encoding,
		 * high speed uses the logarithmic encoding.
		 */
		if (urb->dev->speed <= USB_SPEED_FULL) {
			interval = max_t(u8, epd->bInterval, 1);
			break;
		}
	case USB_ENDPOINT_XFER_ISOC:
		/* ISO always uses logarithmic encoding */
		interval = min_t(u8, epd->bInterval, 16);
		break;
	default:
		/* REVISIT we actually want to use NAK limits, hinting to the
		 * transfer scheduling logic to try some other qh, e.g. try
		 * for 2 msec first:
		 *
		 * interval = (USB_SPEED_HIGH == urb->dev->speed) ? 16 : 2;
		 *
		 * The downside of disabling this is that transfer scheduling
		 * gets VERY unfair for nonperiodic transfers; a misbehaving
		 * peripheral could make that hurt.  That's perfectly normal
		 * for reads from network or serial adapters ... so we have
		 * partial NAKlimit support for bulk RX.
		 *
		 * The upside of disabling it is simpler transfer scheduling.
		 */
		interval = 0;
	}
	qh->intv_reg = interval;

	/* precompute addressing for external hub/tt ports */
	if (musbfsh->is_multipoint) {
		struct usb_device *parent = urb->dev->parent;

		if (parent != hcd->self.root_hub) {
			qh->h_addr_reg = (u8) parent->devnum;

			/* set up tt info if needed */
			if (urb->dev->tt) {
				qh->h_port_reg = (u8) urb->dev->ttport;
				if (urb->dev->tt->hub)
					qh->h_addr_reg =
						(u8)urb->dev->tt->hub->devnum;
				if (urb->dev->tt->multi)
					qh->h_addr_reg |= 0x80;
			}
		}
		INFO("addr_reg=0x%x,h_addr_reg=0x%x,h_port_reg=0x%x",
			qh->addr_reg, qh->h_addr_reg, qh->h_port_reg);
	}

	/* invariant: hep->hcpriv is null OR the qh that's already scheduled.
	 * until we get real dma queues (with an entry for each urb/buffer),
	 * we only have work to do in the former case.
	 */
	if (hep->hcpriv) {
		/* some concurrent activity submitted another urb to hep...
		 * odd, rare, error prone, but legal.
		 */
		kfree(qh);
		qh = NULL;
		ret = 0;
	} else {
#ifdef CONFIG_MTK_MUSBFSH_QMU_SUPPORT
		if ((!usb_pipecontrol(urb->pipe)) && ((usb_pipetype(urb->pipe) + 1) & mtk11_host_qmu_pipe_msk))
			qh->is_use_qmu = 1;
#endif
		ret = musbfsh_schedule(musbfsh, qh,
			(epd->bEndpointAddress & USB_ENDPOINT_DIR_MASK));
		/*
		 * MYDBG("after musbfsh_schedule,
		 * urb:%x, ret:%d, ep:%x\n", urb, ret,
		 * epd->bEndpointAddress);
		 */
	}

	if (ret == 0) {
		urb->hcpriv = qh;
		/*
		 * FIXME: set urb->start_frame for iso/intr, it's tested in
		 * musbfsh_start_urb(), but otherwise only konicawc cares ...
		 */
	}
done:
	spin_unlock_irqrestore(&musbfsh->lock, flags);
	if (ret != 0) {
		spin_lock_irqsave(&musbfsh->lock, flags);
		usb_hcd_unlink_urb_from_ep(hcd, urb);
		spin_unlock_irqrestore(&musbfsh->lock, flags);
		kfree(qh);
	}
	return ret;
}

/*
 * abort a transfer that's at the head of a hardware queue.
 * called with controller locked, irqs blocked
 * that hardware queue advances to the next transfer, unless prevented
 */
static int musbfsh_cleanup_urb(struct urb *urb, struct musbfsh_qh *qh)
{
	struct musbfsh_hw_ep *ep = qh->hw_ep;
	void __iomem *epio = ep->regs;
	unsigned hw_end = ep->epnum;
	void __iomem *regs = ep->musbfsh->mregs;
	int is_in = usb_pipein(urb->pipe);
	int stat = 0;
	u16 csr;

	INFO("%s++\r\n", __func__);
	musbfsh_ep_select(regs, hw_end);

	if (is_dma_capable()) {
		struct dma_channel *dma;

		dma = is_in ? ep->rx_channel : ep->tx_channel;
		if (dma) {
			stat = ep->musbfsh->dma_controller->channel_abort(dma);
			INFO("abort %cX%d DMA for urb %p --> %d\n",
				is_in ? 'R' : 'T', ep->epnum, urb, stat);
			urb->actual_length += dma->actual_len;
			dma->actual_len = 0L;
		}
	}

	/* turn off DMA requests, discard state, stop polling ... */
	if (is_in) {
		/* giveback saves bulk toggle */
		csr = musbfsh_h_flush_rxfifo(ep, 0);

		/* REVISIT we still get an irq; should likely clear the
		 * endpoint's irq stat here to avoid bogus irqs.
		 * clearing that stat is platform-specific...
		 */
	} else if (ep->epnum) {
		musbfsh_h_tx_flush_fifo(ep);
		csr = musbfsh_readw(epio, MUSBFSH_TXCSR);
		csr &= ~(MUSBFSH_TXCSR_AUTOSET
			 | MUSBFSH_TXCSR_DMAENAB
			 | MUSBFSH_TXCSR_H_RXSTALL
			 | MUSBFSH_TXCSR_H_NAKTIMEOUT
			 | MUSBFSH_TXCSR_H_ERROR | MUSBFSH_TXCSR_TXPKTRDY);
		musbfsh_writew(epio, MUSBFSH_TXCSR, csr);
		/* REVISIT may need to clear FLUSHFIFO ... */
		musbfsh_writew(epio, MUSBFSH_TXCSR, csr);
		/* flush cpu writebuffer */
		csr = musbfsh_readw(epio, MUSBFSH_TXCSR);
	} else {
		musbfsh_h_ep0_flush_fifo(ep);
	}
	if (stat == 0)
		musbfsh_advance_schedule(ep->musbfsh, urb, ep, is_in);
	return stat;
}

static int musbfsh_urb_dequeue(struct usb_hcd *hcd, struct urb *urb, int status)
{
	struct musbfsh *musbfsh = hcd_to_musbfsh(hcd);
	struct musbfsh_qh *qh;
	unsigned long flags;
	int is_in = usb_pipein(urb->pipe);
	int ret;

	INFO("urb=%p, dev%d ep%d%s\n", urb,
		usb_pipedevice(urb->pipe), usb_pipeendpoint(urb->pipe),
		is_in ? "in" : "out");

	spin_lock_irqsave(&musbfsh->lock, flags);
	ret = usb_hcd_check_unlink_urb(hcd, urb, status);
	if (ret)
		goto done;

	qh = urb->hcpriv;
	if (!qh)
		goto done;

	/*
	 * Any URB not actively programmed into endpoint hardware can be
	 * immediately given back; that's any URB not at the head of an
	 * endpoint queue, unless someday we get real DMA queues.  And even
	 * if it's at the head, it might not be known to the hardware...
	 *
	 * Otherwise abort current transfer, pending DMA, etc.; urb->status
	 * has already been updated.  This is a synchronous abort; it'd be
	 * OK to hold off until after some IRQ, though.
	 *
	 * NOTE: qh is invalid unless !list_empty(&hep->urb_list)
	 */
	if (!qh->is_ready
	    || urb->urb_list.prev != &qh->hep->urb_list
	    || musbfsh_ep_get_qh(qh->hw_ep, is_in) != qh) {
		int ready = qh->is_ready;

		qh->is_ready = 0;
		musbfsh_giveback(musbfsh, urb, 0);
		qh->is_ready = ready;

		/* If nothing else (usually musbfsh_giveback) is using it
		 * and its URB list has emptied, recycle this qh.
		 */
		if (ready && list_empty(&qh->hep->urb_list)) {
#ifdef CONFIG_MTK_MUSBFSH_QMU_SUPPORT
			if (qh->is_use_qmu)
				mtk11_disable_q(musbfsh, qh->hw_ep->epnum, is_in);
#endif
			qh->hep->hcpriv = NULL;
			list_del(&qh->ring);
			if (musbfsh_host_dynamic_fifo && qh->type != USB_ENDPOINT_XFER_CONTROL)
				musbfsh_host_free_ep_fifo(musbfsh, qh, is_in);
			kfree(qh);
		}
	} else {
		spin_unlock_irqrestore(&musbfsh->lock, flags);
		if (is_dma_capable() && is_in && usb_pipeendpoint(urb->pipe)) {
			ret = wait_for_completion_timeout(&urb->done, msecs_to_jiffies(50));
			if (ret)
				return status;

			INFO("wait time out\n");
		}
		spin_lock_irqsave(&musbfsh->lock, flags);
		ret = musbfsh_cleanup_urb(urb, qh);
	}
done:
	spin_unlock_irqrestore(&musbfsh->lock, flags);
	return ret;
}

/* disable an endpoint */
static void musbfsh_h_disable(struct usb_hcd *hcd,
			      struct usb_host_endpoint *hep)
{
	u8 is_in = hep->desc.bEndpointAddress & USB_DIR_IN;
	unsigned long flags;
	struct musbfsh *musbfsh = hcd_to_musbfsh(hcd);
	struct musbfsh_qh *qh;
	struct urb *urb;

	WARNING("%s++: ep: 0x%x\r\n",
		__func__, hep->desc.bEndpointAddress);
	spin_lock_irqsave(&musbfsh->lock, flags);

	qh = hep->hcpriv;
	if (qh == NULL) {
		MYDBG("qh == NULL\n");
		goto exit;
	}

	/* NOTE: qh is invalid unless !list_empty(&hep->urb_list) */

	/* Kick the first URB off the hardware, if needed */
	qh->is_ready = 0;
	if (musbfsh_ep_get_qh(qh->hw_ep, is_in) == qh) {
		urb = next_urb(qh);

		/*
		 * work around from tablet,
		 * avoid KE for qh->hep content 0x6b6b6b6b...
		 * side effect will cause touch memory after free
		 */

		/*
		 * enable this workaround for
		 * irq->adv_schedule / musbfsh_h_disable
		 * cocurrency issue
		 */
		if (!virt_addr_valid(urb)) {
			MYDBG("urb(%p) addr error\n", urb);
			goto exit;
		}
		/* make software (then hardware) stop ASAP */
		if (!urb->unlinked)
			urb->status = -ESHUTDOWN;

		/* cleanup */
		musbfsh_cleanup_urb(urb, qh);

		/* Then nuke all the others ... and advance the
		 * queue on hw_ep (e.g. bulk ring) when we're done.
		 */
		while (!list_empty(&hep->urb_list)) {
			urb = next_urb(qh);
			urb->status = -ESHUTDOWN;
			musbfsh_advance_schedule(musbfsh, urb, qh->hw_ep,
						 is_in);
		}
	} else {
		/* Just empty the queue; the hardware is busy with
		 * other transfers, and since !qh->is_ready nothing
		 * will activate any of these as it advances.
		 */
		while (!list_empty(&hep->urb_list))
			musbfsh_giveback(musbfsh, next_urb(qh), -ESHUTDOWN);

#ifndef CONFIG_MTK_MUSBFSH_BIND_DEV_EP
#ifdef CONFIG_MTK_MUSBFSH_QMU_SUPPORT
		if (qh->is_use_qmu)
			mtk11_disable_q(musbfsh, qh->hw_ep->epnum, is_in);
#endif
		hep->hcpriv = NULL;
		list_del(&qh->ring);

		if (musbfsh_host_dynamic_fifo && qh->type != USB_ENDPOINT_XFER_CONTROL)
			musbfsh_host_free_ep_fifo(musbfsh, qh, is_in);
		kfree(qh);
#endif
	}
exit:
#ifdef CONFIG_MTK_MUSBFSH_BIND_DEV_EP
	if (hep->hcpriv) {
		struct dma_controller *dma = musbfsh->dma_controller;
		struct musbfsh_hw_ep *hw_ep;

		qh = hep->hcpriv;
		hw_ep = qh->hw_ep;

		if (is_in) {
			hw_ep->rx_reinit = 1;
			if (hw_ep->rx_channel) {
				dma->channel_release(hw_ep->rx_channel);
				hw_ep->rx_channel = NULL;
			}
		} else {
			hw_ep->tx_reinit = 1;
			if (hw_ep->tx_channel) {
				dma->channel_release(hw_ep->tx_channel);
				hw_ep->tx_channel = NULL;
			}
		}

		musbfsh_ep_set_qh(qh->hw_ep, is_in, NULL);
		hep->hcpriv = NULL;

		if (musbfsh_host_dynamic_fifo && qh->type != USB_ENDPOINT_XFER_CONTROL)
			musbfsh_host_free_ep_fifo(musbfsh, qh, is_in);

#ifdef CONFIG_MTK_MUSBFSH_QMU_SUPPORT
		if (qh->is_use_qmu)
			mtk11_disable_q(musbfsh, qh->hw_ep->epnum, is_in);
#endif

		if (qh->mux == 1) {
			struct list_head *head;

			head = qh->ring.prev;
			list_del(&qh->ring);
			kfree(qh);
			qh = first_qh(head);
		} else {
			kfree(qh);
			qh = NULL;
		}
	}
#endif
	spin_unlock_irqrestore(&musbfsh->lock, flags);
}

static int musbfsh_h_get_frame_number(struct usb_hcd *hcd)
{
	struct musbfsh *musbfsh = hcd_to_musbfsh(hcd);

	return musbfsh_readw(musbfsh->mregs, MUSBFSH_FRAME);
}

static int musbfsh_h_start(struct usb_hcd *hcd)
{
	struct musbfsh *musbfsh = hcd_to_musbfsh(hcd);

	INFO("musbfsh_h_start++\r\n");
	/* NOTE: musbfsh_start() is called when the hub driver turns
	 * on port power, or when (OTG) peripheral starts.
	 */
	hcd->state = HC_STATE_RUNNING;
	musbfsh->port1_status = 0;
	return 0;
}

static void musbfsh_h_stop(struct usb_hcd *hcd)
{
	INFO("musbfsh_h_stop++\r\n");
	musbfsh_stop(hcd_to_musbfsh(hcd));
	hcd->state = HC_STATE_HALT;
}

/* only send suspend signal to bus */
static int musbfsh_bus_suspend(struct usb_hcd *hcd)
{
	struct musbfsh *musbfsh = hcd_to_musbfsh(hcd);
	unsigned char power = musbfsh_readb(musbfsh->mregs, MUSBFSH_POWER);

	WARNING("musbfsh_bus_suspend++,power=0x%x\r\n", power);
#ifdef CONFIG_MTK_DT_USB_SUPPORT
#if defined(CONFIG_PM_RUNTIME)
	usb11_plat_suspend();
#endif
#endif

#ifdef CONFIG_MTK_DT_USB_SUPPORT
#if defined(CONFIG_PM_RUNTIME) && defined(USB11_REMOTE_IRQ_NON_AUTO_MASK)
	enable_remote_wake_up();
#endif
#endif

#ifdef MTK_USB_RUNTIME_SUPPORT
	/*
	 * Edge triggered EINT interrupt will be hold after masked (only one),
	 * and reported after unmasked.
	 */
	mt_eint_unmask(CUST_EINT_MT6280_USB_WAKEUP_NUM);
#endif
	/*
	 * wx, let child port do the job;
	 * joson,runtime suspend not ready now,i
	 * set suspend signal here
	 */
	return 0;
}

/* only send resume signal to bus */
static int musbfsh_bus_resume(struct usb_hcd *hcd)
{
	/* resuming child port does the work */
	struct musbfsh *musbfsh = hcd_to_musbfsh(hcd);
	unsigned char power;

#ifdef CONFIG_MTK_DT_USB_SUPPORT
#if defined(CONFIG_PM_RUNTIME)
	usb11_plat_resume();
	return 0;
#endif
#endif

#ifdef MTK_USB_RUNTIME_SUPPORT
	mt_eint_mask(CUST_EINT_MT6280_USB_WAKEUP_NUM);
#endif
	power = musbfsh_readb(musbfsh->mregs, MUSBFSH_POWER);
	WARNING("musbfsh_bus_resume++,power=0x%x\r\n", power);

	/*
	 * wx, let child port do the job;
	 * joson,runtime suspend not ready now,
	 * set resume signal here
	 */
	return 0;
}

struct hc_driver musbfsh_hc_driver = {
	.description = "musbfsh-hcd",
	.product_desc = "MUSBFSH HDRC host driver",
	.hcd_priv_size = sizeof(struct musbfsh),
	.flags = HCD_USB2 | HCD_MEMORY,

	/*
	 * not using irq handler or reset hooks from usbcore, since
	 * those must be shared with peripheral code for OTG configs
	 */

	.start = musbfsh_h_start,
	.stop = musbfsh_h_stop,

	.get_frame_number = musbfsh_h_get_frame_number,

	.urb_enqueue = musbfsh_urb_enqueue,
	.urb_dequeue = musbfsh_urb_dequeue,
	.endpoint_disable = musbfsh_h_disable,

	.hub_status_data = musbfsh_hub_status_data,
	.hub_control = musbfsh_hub_control,
	.bus_suspend = musbfsh_bus_suspend,
	.bus_resume = musbfsh_bus_resume,
	/* .start_port_reset    = NULL, */
	/* .hub_irq_enable      = NULL, */
};
