Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932300AbaFYPaB (ORCPT ); Wed, 25 Jun 2014 11:30:01 -0400 Received: from mail-ig0-f171.google.com ([209.85.213.171]:63410 "EHLO mail-ig0-f171.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932212AbaFYP37 (ORCPT ); Wed, 25 Jun 2014 11:29:59 -0400 MIME-Version: 1.0 In-Reply-To: References: Date: Wed, 25 Jun 2014 10:29:58 -0500 Message-ID: Subject: Re: USB_MUSB_DA8XX with g_multi.ko From: Bin Liu To: Jon Ringle Cc: Felipe Balbi , Greg KH , linux-usb@vger.kernel.org, "linux-kernel@vger.kernel.org" Content-Type: text/plain; charset=UTF-8 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi, On Wed, Jun 25, 2014 at 10:13 AM, Jon Ringle wrote: > In commit 787f5627bec80094db487bfcb401e9744f181aed > usb: musb: make davinci and da8xx glues depend on BROKEN > > USB_MUSB_DA8XX was marked as BROKEN > > A few months ago, we updated the linux kernel on our AM1808 SoC based > embedded board from Linux 2.6.33 to the latest long term 3.12. > > I am interested in having the USB gadget support on my board, so I > removed BROKEN on USB_MUSB_DA8XX. I found that when I modprobe > g_ether, g_serial, and g_mass_storage (by themselves), they all appear > to work as expected, but if I try to use g_multi to have a composite > device supporting all three simultaneously, I run into failure during > initialization. > > Here is the USB related config: > # zcat /proc/config.gz |grep "^CONFIG_USB" > CONFIG_USB_HID=y > CONFIG_USB_OHCI_LITTLE_ENDIAN=y > CONFIG_USB_SUPPORT=y > CONFIG_USB_COMMON=y > CONFIG_USB_ARCH_HAS_HCD=y > CONFIG_USB=y > CONFIG_USB_ANNOUNCE_NEW_DEVICES=y > CONFIG_USB_DEFAULT_PERSIST=y > CONFIG_USB_OTG=y > CONFIG_USB_OHCI_HCD=y > CONFIG_USB_MUSB_HDRC=y > CONFIG_USB_MUSB_DUAL_ROLE=y > CONFIG_USB_MUSB_DA8XX=y > CONFIG_USB_STORAGE=y > CONFIG_USB_SERIAL=y > CONFIG_USB_SERIAL_CONSOLE=y > CONFIG_USB_SERIAL_GENERIC=y > CONFIG_USB_SERIAL_FTDI_SIO=y > CONFIG_USB_SERIAL_PL2303=y > CONFIG_USB_PHY=y > CONFIG_USB_ULPI=y > CONFIG_USB_GADGET=y > CONFIG_USB_GADGET_DEBUG=y > CONFIG_USB_GADGET_DEBUG_FILES=y > CONFIG_USB_GADGET_DEBUG_FS=y > CONFIG_USB_GADGET_VBUS_DRAW=2 > CONFIG_USB_GADGET_STORAGE_NUM_BUFFERS=2 > CONFIG_USB_LIBCOMPOSITE=m > CONFIG_USB_F_ACM=m > CONFIG_USB_U_SERIAL=m > CONFIG_USB_U_ETHER=m > CONFIG_USB_U_RNDIS=m > CONFIG_USB_F_SERIAL=m > CONFIG_USB_F_OBEX=m > CONFIG_USB_F_ECM=m > CONFIG_USB_F_SUBSET=m > CONFIG_USB_F_RNDIS=m > CONFIG_USB_ETH=m > CONFIG_USB_ETH_RNDIS=y > CONFIG_USB_MASS_STORAGE=m > CONFIG_USB_G_SERIAL=m > CONFIG_USB_G_MULTI=m > CONFIG_USB_G_MULTI_RNDIS=y > > # modprobe g_multi file=/root/backing_file > modprobe: can't load module g_multi > (kernel/drivers/usb/gadget/g_multi.ko): Unknown error 524 > > I added a couple of debug message to identify where I was failing in: > > diff --git a/drivers/usb/gadget/f_mass_storage.c > b/drivers/usb/gadget/f_mass_storage.c > index a01d7d3..3e7a22a 100644 > --- a/drivers/usb/gadget/f_mass_storage.c > +++ b/drivers/usb/gadget/f_mass_storage.c > @@ -2899,14 +2899,18 @@ static int fsg_bind(struct usb_configuration > *c, struct usb_function *f) > > /* Find all the endpoints we will use */ > ep = usb_ep_autoconfig(gadget, &fsg_fs_bulk_in_desc); > - if (!ep) > + if (!ep) { > + ERROR(fsg, "usb_ep_autoconfig in failed\n"); > goto autoconf_fail; > + } > ep->driver_data = fsg->common; /* claim the endpoint */ > fsg->bulk_in = ep; > > ep = usb_ep_autoconfig(gadget, &fsg_fs_bulk_out_desc); > - if (!ep) > + if (!ep) { > + ERROR(fsg, "usb_ep_autoconfig out failed\n"); > goto autoconf_fail; > + } > ep->driver_data = fsg->common; /* claim the endpoint */ > fsg->bulk_out = ep; > > @@ -2929,8 +2933,10 @@ static int fsg_bind(struct usb_configuration > *c, struct usb_function *f) > > ret = usb_assign_descriptors(f, fsg_fs_function, fsg_hs_function, > fsg_ss_function); > - if (ret) > + if (ret) { > + ERROR(fsg, "usb_assign_descriptors failed\n"); > goto autoconf_fail; > + } > > return 0; > > diff --git a/drivers/usb/musb/Kconfig b/drivers/usb/musb/Kconfig > index c258a97..5172b00 100644 > --- a/drivers/usb/musb/Kconfig > +++ b/drivers/usb/musb/Kconfig > @@ -67,7 +67,6 @@ config USB_MUSB_DAVINCI > config USB_MUSB_DA8XX > tristate "DA8xx/OMAP-L1x" > depends on ARCH_DAVINCI_DA8XX > - depends on BROKEN > > config USB_MUSB_TUSB6010 > tristate "TUSB6010" > > This is the kernel log I get from journalctl -f: > > Jun 25 14:36:00 Ringle1 kernel: calling multi_init+0x0/0xc [g_multi] @ 957 > Jun 25 14:36:01 Ringle1 kernel: udc musb-hdrc.0.auto: registering UDC > driver [g_multi] > Jun 25 14:36:01 Ringle1 kernel: g_multi gadget: using random self > ethernet address > Jun 25 14:36:01 Ringle1 kernel: g_multi gadget: using random host > ethernet address > Jun 25 14:36:01 Ringle1 kernel: usb0: MAC 22:34:67:82:df:aa > Jun 25 14:36:01 Ringle1 kernel: usb0: HOST MAC 0e:a8:d1:26:29:37 > Jun 25 14:36:01 Ringle1 kernel: calling userial_init+0x0/0x180 [u_serial] @ 963 > Jun 25 14:36:01 Ringle1 kernel: userial_init: registered 4 ttyGS* devices > Jun 25 14:36:01 Ringle1 kernel: initcall userial_init+0x0/0x180 > [u_serial] returned 0 after 87 usecs > Jun 25 14:36:01 Ringle1 kernel: calling acmmod_init+0x0/0xc [usb_f_acm] @ 963 > Jun 25 14:36:01 Ringle1 kernel: initcall acmmod_init+0x0/0xc > [usb_f_acm] returned 0 after 10 usecs > Jun 25 14:36:01 Ringle1 kernel: lun0: open backing file: /root/backing_file > Jun 25 14:36:01 Ringle1 kernel: g_multi gadget: Mass Storage Function, > version: 2009/09/11 > Jun 25 14:36:01 Ringle1 kernel: g_multi gadget: Number of LUNs=1 > Jun 25 14:36:01 Ringle1 kernel: lun0: LUN: file: /root/backing_file > Jun 25 14:36:01 Ringle1 kernel: g_multi gadget: I/O thread pid: 969 > Jun 25 14:36:01 Ringle1 kernel: g_multi gadget: adding config #1 > 'Multifunction with RNDIS'/bf034bbc > Jun 25 14:36:01 Ringle1 kernel: g_multi gadget: adding > 'rndis'/c0ad9f20 to config 'Multifunction with RNDIS'/bf034bbc > Jun 25 14:36:01 Ringle1 kernel: rndis_register: configNr = 0 > Jun 25 14:36:01 Ringle1 kernel: rndis_set_param_medium: 0 0 > Jun 25 14:36:01 Ringle1 kernel: g_multi gadget: RNDIS: dual speed > IN/ep1in OUT/ep1out NOTIFY/ep2in > Jun 25 14:36:01 Ringle1 kernel: g_multi gadget: adding 'acm'/c3934080 > to config 'Multifunction with RNDIS'/bf034bbc > Jun 25 14:36:01 Ringle1 kernel: g_multi gadget: acm ttyGS0: dual speed > IN/ep3 OUT/ep2out NOTIFY/ep4 > Jun 25 14:36:01 Ringle1 kernel: g_multi gadget: adding 'Mass Storage > Function'/c29169a0 to config 'Multifunction with RNDIS'/bf034bbc > Jun 25 14:36:01 Ringle1 kernel: g_multi gadget: usb_ep_autoconfig in failed > Jun 25 14:36:01 Ringle1 kernel: g_multi gadget: unable to > autoconfigure all endpoints > Jun 25 14:36:01 Ringle1 kernel: g_multi gadget: adding 'Mass Storage > Function'/c29169a0 --> -524 > Jun 25 14:36:01 Ringle1 kernel: g_multi gadget: acm ttyGS0 deactivated > Jun 25 14:36:01 Ringle1 kernel: g_multi gadget: unbind function 'rndis'/c0ad9f20 > Jun 25 14:36:01 Ringle1 kernel: rndis_deregister: > Jun 25 14:36:01 Ringle1 kernel: g_multi gadget: added config > 'Multifunction with RNDIS'/1 --> -524 > Jun 25 14:36:01 Ringle1 kernel: lun0: close backing file > Jun 25 14:36:01 Ringle1 kernel: g_multi musb-hdrc.0.auto: failed to > start g_multi: -524 > Jun 25 14:36:01 Ringle1 kernel: initcall multi_init+0x0/0xc [g_multi] > returned -524 after 253364 usecs > > From this I can see that it's failing on the following call in fsg_bind(): > ep = usb_ep_autoconfig(gadget, &fsg_fs_bulk_in_desc); Can you try to modify the g_multi driver to put the g_msc to be the first function? I remembered AM1808 only has a very limited hw endpoints. If g_msc ep_autoconfig will not fail if g_msc is the first function, I guess you run into hw endpoint limitation. Regards, -Bin. > > I appreciate any guidance on what I need to do to get g_multi working properly. > > Thanks! > > Jon > -- > To unsubscribe from this list: send the line "unsubscribe linux-usb" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/