Use musb->endpoints[epnum].ep_in instead of ep_out when shared FIFO is used, because only ep_in get initialized when musb_g_init_endpoints() is called if the musb core use shared FIFO option. This was tested on Ubicom's IP7K Evaluation board. Signed-off-by: Kan Yan <kyan@xxxxxxxxxx> --- drivers/usb/musb/musb_gadget.c | 17 ++++++++++++++--- 1 files changed, 14 insertions(+), 3 deletions(-) diff --git a/drivers/usb/musb/musb_gadget.c b/drivers/usb/musb/musb_gadget.c index 8b3c4e2..1466326 100644 --- a/drivers/usb/musb/musb_gadget.c +++ b/drivers/usb/musb/musb_gadget.c @@ -585,10 +585,16 @@ static void rxstate(struct musb *musb, struct musb_request *req) u16 csr = 0; const u8 epnum = req->epnum; struct usb_request *request = &req->request; - struct musb_ep *musb_ep = &musb->endpoints[epnum].ep_out; + struct musb_ep *musb_ep; void __iomem *epio = musb->endpoints[epnum].regs; unsigned fifo_count = 0; - u16 len = musb_ep->packet_sz; + u16 len; + + if (musb->endpoints[epnum].is_shared_fifo) + musb_ep = &musb->endpoints[epnum].ep_in; + else + musb_ep = &musb->endpoints[epnum].ep_out; + len = musb_ep->packet_sz; csr = musb_readw(epio, MUSB_RXCSR); @@ -746,10 +752,15 @@ void musb_g_rx(struct musb *musb, u8 epnum) u16 csr; struct usb_request *request; void __iomem *mbase = musb->mregs; - struct musb_ep *musb_ep = &musb->endpoints[epnum].ep_out; + struct musb_ep *musb_ep; void __iomem *epio = musb->endpoints[epnum].regs; struct dma_channel *dma; + if (musb->endpoints[epnum].is_shared_fifo) + musb_ep = &musb->endpoints[epnum].ep_in; + else + musb_ep = &musb->endpoints[epnum].ep_out; + musb_ep_select(mbase, epnum); request = next_request(musb_ep); -- 1.6.1.1 -- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html