RE: [PATCH 05/31] usb: usbssp: Added first part of initialization sequence.

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

 



Hi,
> > Hi,
> >>
> >> Hi,
> >>
> >> On 19/07/18 20:57, Pawel Laszczak wrote:
> >>> Patch adds some initialization function. The initialization sequence
> >>> is quite complicated and this patch implements it only partially.
> >>> Initialization will be completed in next few patches.
> >>>
> >>> Patch introduce three new files:
> >>> 1. gadget-dbg.c - file contains functions used for debugging purpose.
> >>> 2. gadget-ext-caps.h - holds macro definition related to
> >>> 		       Extended Capabilities
> >>> 3. gadget-if - file implements stuff related to upper layer
> >>> 	(e.g usb_ep_ops, usb_gadget_ops interface).
> >>>
> >>> Signed-off-by: Pawel Laszczak <pawell@xxxxxxxxxxx>
> >>> ---
> >>>  drivers/usb/usbssp/Makefile          |   1 +
> >>>  drivers/usb/usbssp/gadget-dbg.c      |  30 ++++
> >>>  drivers/usb/usbssp/gadget-ext-caps.h |  53 ++++++
> >>>  drivers/usb/usbssp/gadget-if.c       |  24 +++
> >>>  drivers/usb/usbssp/gadget.c          | 242 +++++++++++++++++++++++++++
> >>>  drivers/usb/usbssp/gadget.h          |  15 ++
> >>>  6 files changed, 365 insertions(+)
> >>>  create mode 100644 drivers/usb/usbssp/gadget-dbg.c
> >>>  create mode 100644 drivers/usb/usbssp/gadget-ext-caps.h
> >>>  create mode 100644 drivers/usb/usbssp/gadget-if.c
> >>>
> >>> diff --git a/drivers/usb/usbssp/Makefile b/drivers/usb/usbssp/Makefile
> >>> index d85f15afb51c..0606f3c63cd0 100644
> >>> --- a/drivers/usb/usbssp/Makefile
> >>> +++ b/drivers/usb/usbssp/Makefile
> >>> @@ -5,6 +5,7 @@ CFLAGS_gadget-trace.o := -I$(src)
> >>>  obj-$(CONFIG_USB_USBSSP_GADGET) += usbssp.o
> >>>  usbssp-y 			:= usbssp-plat.o gadget-ring.o \
> >>>  				   gadget.o
> >>> +				    gadget-dbg.o
> >>>
> >>>  ifneq ($(CONFIG_TRACING),)
> >>>  	usbssp-y		+= gadget-trace.o
> >>> diff --git a/drivers/usb/usbssp/gadget-dbg.c b/drivers/usb/usbssp/gadget-dbg.c
> >>> new file mode 100644
> >>> index 000000000000..277617d1a996
> >>> --- /dev/null
> >>> +++ b/drivers/usb/usbssp/gadget-dbg.c
> >>> @@ -0,0 +1,30 @@
> >>> +// SPDX-License-Identifier: GPL-2.0
> >>> +/*
> >>> + * USBSSP device controller driver
> >>> + *
> >>> + * Copyright (C) 2018 Cadence.
> >>> + *
> >>> + * Author: Pawel Laszczak
> >>> + *
> >>> + * A lot of code based on Linux XHCI driver.
> >>> + * Origin: Copyright (C) 2008 Intel Corp
> >>> + */
> >>> +
> >>> +#include "gadget.h"
> >>> +
> >>> +void usbssp_dbg_trace(struct usbssp_udc *usbssp_data,
> >>> +		      void (*trace)(struct va_format *),
> >>> +		      const char *fmt, ...)
> >>> +{
> >>> +	struct va_format vaf;
> >>> +	va_list args;
> >>> +
> >>> +	va_start(args, fmt);
> >>> +	vaf.fmt = fmt;
> >>> +	vaf.va = &args;
> >>> +	dev_dbg(usbssp_data->dev, "%pV\n", &vaf);
> >>
> >> dev_dbg will mess up with timings to be useful.
> >> Why not just use one of the trace events you defined in gadget-trace.h?
> >
> > Function is equivalent of xhci_dbg_trace from XHCI driver.
> > It is a function of general use.
> > The problem with trace is that trace log is deleted after rebooting system.
> > Using trace log is problematic during developing and debugging driver.
> 
> OK. But I think trace log is more useful for I/O related debugging as it
> keeps the timing impact minimal. For things that don't come in the I/O path
> you could use dev_dbg().
> 
> > Do you know whether  trace log is saved anywhere on disk ?
> >
> I think trace_cmd allows you to record on the disk or even send it over the network.
> https://urldefense.proofpoint.com/v2/url?u=https-
> 3A__lwn.net_Articles_410200_&d=DwICaQ&c=aUq983L2pue2FqKFoP6PGHMJQyoJ7kl3s3GZ-_haXqY&r=e1OgxfvkL0qo9XO6fX1gscva-
> w03uSYC1nIyxl89-
> rI&m=6MvsISpCCpIMBnuBegpBOtoNlpzPXgvFMxqIROGhRVw&s=N3v03AhO0AP6HlVTyDvCRQqpJx4kcnqdw5appuOYG6U&e=

Thanks, I will try it.

> 
> >>> +	trace(&vaf);
> >>> +	va_end(args);
> >>> +}
> >>> +EXPORT_SYMBOL_GPL(usbssp_dbg_trace);
> >>> +
> 
> <snip>
> 
> >>>  int usbssp_gadget_init(struct usbssp_udc *usbssp_data)
> >>>  {
> >>>  	int ret;
> >>> +
> >>> +	/*
> >>> +	 * Check the compiler generated sizes of structures that must be laid
> >>> +	 * out in specific ways for hardware access.
> >>> +	 */
> >>> +	BUILD_BUG_ON(sizeof(struct usbssp_doorbell_array) != 2*32/8);
> >>> +	BUILD_BUG_ON(sizeof(struct usbssp_slot_ctx) != 8*32/8);
> >>> +	BUILD_BUG_ON(sizeof(struct usbssp_ep_ctx) != 8*32/8);
> >>> +	/* usbssp_device has eight fields, and also
> >>> +	 * embeds one usbssp_slot_ctx and 31 usbssp_ep_ctx
> >>> +	 */
> >>> +	BUILD_BUG_ON(sizeof(struct usbssp_stream_ctx) != 4*32/8);
> >>> +	BUILD_BUG_ON(sizeof(union usbssp_trb) != 4*32/8);
> >>> +	BUILD_BUG_ON(sizeof(struct usbssp_erst_entry) != 4*32/8);
> >>> +	BUILD_BUG_ON(sizeof(struct usbssp_cap_regs) != 8*32/8);
> >>> +	BUILD_BUG_ON(sizeof(struct usbssp_intr_reg) != 8*32/8);
> >>> +	/* usbssp_run_regs has eight fields and embeds 128 usbssp_intr_regs */
> >>> +	BUILD_BUG_ON(sizeof(struct usbssp_run_regs) != (8+8*128)*32/8);
> >>> +
> >>> +	/* fill gadget fields */
> >>> +	/*TODO: implements usbssp_gadget_ops object*/
> >>> +	//usbssp_data->gadget.ops = &usbssp_gadget_ops;
> >>> +	usbssp_data->gadget.name = "usbssp-gadget";
> >>> +	usbssp_data->gadget.max_speed = USB_SPEED_SUPER_PLUS;
> >>> +	usbssp_data->gadget.speed = USB_SPEED_UNKNOWN;
> >>> +	usbssp_data->gadget.sg_supported = true;
> >>> +	usbssp_data->gadget.lpm_capable = 1;
> >>> +
> >>> +	usbssp_data->setup_buf = kzalloc(USBSSP_EP0_SETUP_SIZE, GFP_KERNEL);
> >>> +	if (!usbssp_data->setup_buf)
> >>> +		return -ENOMEM;
> >>> +
> >>> +	/*USBSSP support not aligned buffer but this option
> >>> +	 * improve performance of this controller.
> >>> +	 */
> >>
> >> Multi-line comment formatting. Checkpach should complain.
> > It doesn't complain about this case. I don't know why.
> >
> 
> Can you try with --strict option to checkpatch?

With -options I see this warning and also many others related 
to "spaces preferred"

I have to check all patches again. 
> 
> >>> +	usbssp_data->gadget.quirk_ep_out_aligned_size = true;
> >>> +	ret = usbssp_gen_setup(usbssp_data);
> >>> +	if (ret < 0) {
> >>> +		dev_err(usbssp_data->dev,
> >>> +				"Generic initialization failed with error code%d\n",
> >>> +				ret);
> >>> +		goto err3;
> >>> +	}
> >>> +
> >>> +	ret = usbssp_gadget_init_endpoint(usbssp_data);
> >>> +	if (ret < 0) {
> >>> +		dev_err(usbssp_data->dev, "failed to initialize endpoints\n");
> >>> +		goto err1;
> >>> +	}
> >>> +
> >>> +	ret = usb_add_gadget_udc(usbssp_data->dev, &usbssp_data->gadget);
> >>> +
> >>> +	if (ret) {
> >>> +		dev_err(usbssp_data->dev, "failed to register udc\n");
> >>> +		goto err2;
> >>> +	}
> >>> +
> >>> +	return ret;
> >>> +err2:
> >>> +	usbssp_gadget_free_endpoint(usbssp_data);
> >>> +err1:
> >>> +	usbssp_halt(usbssp_data);
> >>> +	/*TODO add implementation of usbssp_reset function*/
> >>> +	//usbssp_reset(usbssp_data);
> >>> +	/*TODO add implementation of freeing memory*/
> >>> +	//usbssp_mem_cleanup(usbssp_data);
> >>> +err3:
> >>>  	return ret;
> >>>  }
> >>>
> >>> @@ -60,5 +298,9 @@ int usbssp_gadget_exit(struct usbssp_udc *usbssp_data)
> >>>  {
> >>>  	int ret = 0;
> >>>
> >>> +	usb_del_gadget_udc(&usbssp_data->gadget);
> >>> +	usbssp_gadget_free_endpoint(usbssp_data);
> >>> +	/*TODO: add usbssp_stop implementation*/
> >>> +	//usbssp_stop(usbssp_data);
> >>>  	return ret;
> >>>  }
> >>> diff --git a/drivers/usb/usbssp/gadget.h b/drivers/usb/usbssp/gadget.h
> >>> index 55e20795d900..5d8918f8da84 100644
> >>> --- a/drivers/usb/usbssp/gadget.h
> >>> +++ b/drivers/usb/usbssp/gadget.h
> >>> @@ -12,8 +12,10 @@
> >>>  #ifndef __LINUX_USBSSP_GADGET_H
> >>>  #define __LINUX_USBSSP_GADGET_H
> >>>
> >>> +#include <linux/irq.h>
> >>>  #include <linux/io-64-nonatomic-lo-hi.h>
> >>>  #include <linux/usb/gadget.h>
> >>> +#include "gadget-ext-caps.h"
> >>>
> >>>  /* Max number slots - only 1 is allowed */
> >>>  #define DEV_MAX_SLOTS		1
> >>> @@ -1676,7 +1678,18 @@ static inline void usbssp_write_64(struct usbssp_udc *usbssp_data,
> >>>  	lo_hi_writeq(val, regs);
> >>>  }
> >>>
> >>> +/* USBSSP memory management */
> >>> +void usbssp_dbg_trace(struct usbssp_udc *usbssp_data,
> >>> +		void (*trace)(struct va_format *),
> >>> +		const char *fmt, ...);
> >>
> >> what has this function to do with memory management?
> >>
> > Nothing,
> >
> >>>  /* USBSSP Device controller glue */
> >>> +void usbssp_bottom_irq(struct work_struct *work);
> >>
> >> usbssp_bottom_irq() wasn't defined in this patch.
> > Removed from this patch
> >
> >>> +int usbssp_init(struct usbssp_udc *usbssp_data);
> >>> +void usbssp_stop(struct usbssp_udc *usbssp_data);
> >>> +int usbssp_handshake(void __iomem *ptr, u32 mask, u32 done, int usec);
> >>> +void usbssp_quiesce(struct usbssp_udc *usbssp_data);
> >>> +extern int usbssp_reset(struct usbssp_udc *usbssp_data);
> >>> +
> >>>  int usbssp_suspend(struct usbssp_udc *usbssp_data, bool do_wakeup);
> >>>  int usbssp_resume(struct usbssp_udc *usbssp_data, bool hibernated);
> >>>
> >>> @@ -1689,6 +1702,8 @@ dma_addr_t usbssp_trb_virt_to_dma(struct usbssp_segment *seg,
> >>>  /* USBSSP gadget interface*/
> >>>  int usbssp_gadget_init(struct usbssp_udc *usbssp_data);
> >>>  int usbssp_gadget_exit(struct usbssp_udc *usbssp_data);
> >>> +void usbssp_gadget_free_endpoint(struct usbssp_udc *usbssp_data);
> >>> +int usbssp_gadget_init_endpoint(struct usbssp_udc *usbssp_data);
> >>>
> >>>  static inline char *usbssp_slot_state_string(u32 state)
> >>>  {
> >>>
> >>
> 
> --
> cheers,
> -roger
> 
> Texas Instruments Finland Oy, Porkkalankatu 22, 00180 Helsinki.
> Y-tunnus/Business ID: 0615521-4. Kotipaikka/Domicile: Helsinki
cheers,
Pawell
��.n��������+%������w��{.n�����{���)��jg��������ݢj����G�������j:+v���w�m������w�������h�����٥




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

  Powered by Linux