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 <[email protected]> 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 <[email protected]> > >> --- > >> 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
signature.asc
Description: Digital signature
