RE: [PATCH v2 28/37] usb: host: xhci: combine event TRB completion debugging messages

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

 



From: Janusz Dziedzic
> Sent: 24 January 2017 12:06
> On 23 January 2017 at 13:20, Mathias Nyman
> <mathias.nyman@xxxxxxxxxxxxxxx> wrote:
> > From: Felipe Balbi <felipe.balbi@xxxxxxxxxxxxxxx>
> >
> > If we just provide a helper to convert completion code to string, we can
> > combine all debugging messages into a single print.
> >
> > [keep the old debug messages, for warn and grep -Mathias]
> > Signed-off-by: Felipe Balbi <felipe.balbi@xxxxxxxxxxxxxxx>
> > Signed-off-by: Mathias Nyman <mathias.nyman@xxxxxxxxxxxxxxx>
> > ---
> >  drivers/usb/host/xhci.h | 80 +++++++++++++++++++++++++++++++++++++++++++++++++
> >  1 file changed, 80 insertions(+)
> >
> > diff --git a/drivers/usb/host/xhci.h b/drivers/usb/host/xhci.h
> > index aa63e38..ebdd920 100644
> > --- a/drivers/usb/host/xhci.h
> > +++ b/drivers/usb/host/xhci.h
> > @@ -1097,6 +1097,86 @@ struct xhci_transfer_event {
> >  #define COMP_SECONDARY_BANDWIDTH_ERROR         35
> >  #define COMP_SPLIT_TRANSACTION_ERROR           36
> >
> > +static inline const char *xhci_trb_comp_code_string(u8 status)
> > +{
> 
> BTW, maybe in the future we should use enum for status
> and next:
> 
> #define C2S(x) case x: return #x
> static inline const char *xhci_trb_comp_code_string(enum
> xhci_trb_comp_code code)
> {
>     switch(code) {
>         C2S(COMP_INVALID);
>         C2S(COMP_SUCCESS);
>         ...
>        default:
>             return "Unknown!!";
>     }
> }
> #undef C2S

A more interesting 'trick' is to get cpp to expand a macro in different ways.
So you have (if I type it correctly):

#define XHCI_ERRS(x) \
	x(COMP_SUCCESS), 0, "success") \
	... \
	x(COMP_SECONDARY_BANDWIDTH_ERROR, 35, "secondary bandwidth error") \
	x(COMP_SPLIT_TRANSACTION_ERROR,   36, "split transaction error") \

#define X(tag, val, str) tag = val,
enum (XHCI_ERRS(X) COMP_NUM_ERRS);
#undef X

const char * xhci_trb_comp_code_string(unsigned int code)
{
#define X(tag, val, str) [tag] = str,
static const char *const errmsg[] = { XHCI_ERRS(X) };
#undef X
	if (code < ARRAY_SIZE(errmsg))
		return errmsg[code];
	...
}

/* or */
const char * xhci_trb_comp_code_string(unsigned int code)
{
#define X(tag, val, str) case tag: return str;
	switch (code) {
	XHCI_ERRS(X);
	default:
		...
#undef X

This all has the advantage of keeping the error number and message text
on the same line of the header file.

	David

��.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