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(-) mode change 100644 => 100755 drivers/usb/musb/musb_gadget.c diff --git a/drivers/usb/musb/musb_gadget.c b/drivers/usb/musb/musb_gadget.c old mode 100644 new mode 100755 index 8b3c4e2..d17575b --- 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 = NULL; void __iomem *epio = musb->endpoints[epnum].regs; unsigned fifo_count = 0; - u16 len = musb_ep->packet_sz; + u16 len = 0; + + 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 = NULL; 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); -- -- 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