Re: [PATCH RESEND v2] usb: gadget: Add UDC driver for Broadcom USB3.0 device controller IP BDC

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi,

On Wed, Nov 12, 2014 at 12:24:11PM -0700, Ashwini Pahuja wrote:
> On Wed, Nov 5, 2014 at 12:18 PM, Felipe Balbi <balbi@xxxxxx> wrote:
> > On Fri, Oct 31, 2014 at 01:14:33PM -0700, Ashwini Pahuja wrote:
> >> This patch adds a UDC driver for Broadcom's USB3.0 Peripheral core
> >> named BDC. BDC is capable of supporting all transfer types control,
> >> bulk, Int and isoch on each endpoint.
> >>
> >> Signed-off-by: Ashwini Pahuja <ashwini.linux@xxxxxxxxx>
> >> ---
> >> Changes for v2:
> >> - Includes all the feedback provided by Felipe on the v1.
> >> - Removed unnecessary out of memory messages.
> >> - Added usb_gadget_giveback_request.
> >> - udc_stop: removed unnecessary driver argument.
> >> - Removed unused defines.
> >> - Renamed upsc to uspc.
> >
> > which platform uses this ? Is the platform working in mainline today ?
> 
> Currently our "brcmstb" platform in arch/arm/mach-bcm/brcmstb.c, which
> is in mainline and which supports (to some degree) BCM7439 does have
> this HW block. BDC is a generic IP that will go inside various kinds
> of application and there is no dependency on one particular chip. BDC
> driver is developed/tested on our FPGA-PCIe based platform that
> connects to x86 machine. BDC IP is also USB-IF certified, The 3.6
> kernel version of this driver was used during USB-IF certification in
> the Mass storage mode.
> 
> > Can you show me boot up logs and logs of this driver working with g_zero
> > and g_mass_storage ? Also make sure to run USB20CV chapter 9 with both
> > g_zero and mass_storage and post the logs somewhere I can access, or
> > just attach everything to this mail as a tarball or something.
> >
> Sure, I always run the USB30CV, USB20CV before sending out the code.
> Also testusb has been running for several days. I am attaching the
> logs with CONFIG_USB_GADGET_DEBUG enabled. Let me know if you need the
> logs with CONFIG_USB_GADGET_VERBOSE as well.

cool, I see you've been testing on v3.16-rc6, which should be fine, a
little bit on the old side, but still pretty recent :-)

[snip]

> >> +     gbdi = 0;
> >> +     dev_vdbg(bdc->dev,
> >> +             "Dump bd list for %s epnum:%d\n",
> >> +             ep->name, ep->ep_num);
> >> +
> >> +     dev_vdbg(bdc->dev,
> >> +             "tabs:%d max_bdi:%d eqp_bdi:%d hwd_bdi:%d num_bds_table:%d\n",
> >> +             bd_list->num_tabs, bd_list->max_bdi, bd_list->eqp_bdi,
> >> +             bd_list->hwd_bdi, bd_list->num_bds_table);
> >> +
> >> +     for (tbi = 0; tbi < bd_list->num_tabs; tbi++) {
> >> +             bd_table = bd_list->bd_table_array[tbi];
> >> +             for (bdi = 0; bdi < bd_list->num_bds_table; bdi++) {
> >> +                     bd =  bd_table->start_bd + bdi;
> >> +                     dma = bd_table->dma + (sizeof(struct bdc_bd) * bdi);
> >> +                     dev_vdbg(bdc->dev,
> >> +                             "tbi:%2d bdi:%2d gbdi:%2d virt:%p phys:%llx %08x %08x %08x %08x\n",
> >> +                             tbi, bdi, gbdi++, bd, (unsigned long long)dma,
> >> +                             le32_to_cpu(bd->offset[0]),
> >> +                             le32_to_cpu(bd->offset[1]),
> >> +                             le32_to_cpu(bd->offset[2]),
> >> +                             le32_to_cpu(bd->offset[3]));
> >> +             }
> >> +             dev_vdbg(bdc->dev, "\n\n");
> >> +     }
> >> +}
> >
> > all of these debugging features should be done either using tracepoints
> > or debugfs. At a minimum you should stub them out when building without
> > debug to avoid the extra overhead.
> >
> OK, I will stub these debug functions in v3. I will consider adding
> support for tracepoints/debugfs in near future.

cool, thanks.

> >> diff --git a/drivers/usb/gadget/udc/bdc/bdc_ep.c b/drivers/usb/gadget/udc/bdc/bdc_ep.c
> >> new file mode 100644
> >> index 0000000..f5adcb4
> >> --- /dev/null
> >> +++ b/drivers/usb/gadget/udc/bdc/bdc_ep.c
> >> @@ -0,0 +1,2019 @@
> >> +/*
> >> + * bdc_ep.c - BRCM BDC USB3.0 device controller endpoint related functions
> >> + *
> >> + * Copyright (C) 2014 Broadcom Corporation
> >> + *
> >> + * Author: Ashwini Pahuja
> >> + *
> >> + * Based on drivers under drivers/usb/
> >> + *
> >> + * This program is free software; you can redistribute it and/or modify it
> >> + * under the terms of the GNU General Public License as published by the
> >> + * Free Software Foundation; either version 2 of the License, or (at your
> >> + * option) any later version.
> >> + *
> >> + */
> >> +#include <linux/module.h>
> >> +#include <linux/pci.h>
> >> +#include <linux/dma-mapping.h>
> >> +#include <linux/kernel.h>
> >> +#include <linux/delay.h>
> >> +#include <linux/ioport.h>
> >> +#include <linux/sched.h>
> >> +#include <linux/slab.h>
> >> +#include <linux/errno.h>
> >> +#include <linux/init.h>
> >> +#include <linux/timer.h>
> >> +#include <linux/list.h>
> >> +#include <linux/interrupt.h>
> >> +#include <linux/moduleparam.h>
> >> +#include <linux/device.h>
> >> +#include <linux/usb/ch9.h>
> >> +#include <linux/usb/gadget.h>
> >> +#include <linux/usb/otg.h>
> >> +#include <linux/pm.h>
> >> +#include <linux/io.h>
> >> +#include <linux/irq.h>
> >> +#include <asm/unaligned.h>
> >> +#include <linux/platform_device.h>
> >> +#include <linux/usb/composite.h>
> >> +
> >> +#include "bdc.h"
> >> +#include "bdc_ep.h"
> >> +#include "bdc_cmd.h"
> >> +#include "bdc_dbg.h"
> >> +
> >> +static const char * const ep0_state_string[] =  {
> >
> > Shouldn't this be:
> >
> > static const char const * ep0_state_string
> >
> > instead ?
> >
> 
> why? We don’t want to modify where the pointer is pointing to and also
> the string pointed by the pointer, so const char * const  is correct.

I was under the impression C convention was to put const before the
type being "constified", maybe GCC accepts both, dunno.

> >> +static void ep_bd_list_free(struct bdc_ep *ep, u32 num_tabs)
> >> +{
> >> +     struct bd_list *bd_list = &ep->bd_list;
> >> +     struct bdc *bdc = ep->bdc;
> >> +     struct bd_table *bd_table;
> >> +     int index;
> >> +
> >> +     dev_dbg(bdc->dev, "%s ep:%s num_tabs:%d\n",
> >> +                              __func__, ep->name, num_tabs);
> >> +
> >> +     if (!bd_list->bd_table_array) {
> >> +             dev_dbg(bdc->dev, "%s already freed\n", ep->name);
> >> +             return;
> >> +     }
> >> +     for (index = 0; index < num_tabs; index++) {
> >> +             /*
> >> +              * check if the bd_table struct is allocated ?
> >> +              * if yes, then check if bd memory has been allocated, then
> >> +              * free the dma_pool and also the bd_table struct memory
> >> +             */
> >> +             bd_table = bd_list->bd_table_array[index];
> >> +             dev_dbg(bdc->dev, "bd_table:%p index:%d\n", bd_table, index);
> >> +             if (bd_table) {
> >
> > decrease the indentation here by shuffling things around:
> >
> >                 if (!bd_table) {
> >                         dev_dbg(bdc->dev, "bd_table not allocated\n");
> >                         continue;
> >                 }
> >
> >                 dma_pool_free(...);
> >
> > Go through the driver and modify it similarly on any other occurence.
> >
> OK thanks, fixed in v3.

alright, tks.

-- 
balbi

Attachment: signature.asc
Description: Digital signature


[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux