public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: Michal Nazarewicz <mina86@mina86.com>
To: Krzysztof Opasiak <k.opasiak@samsung.com>,
	"'Felipe Balbi'" <balbi@ti.com>
Cc: Krzysztof Opasiak <k.opasiak@samsung.com>,
	linux-usb@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH 2/2] tools: ffs-test: convert to new descriptor format fixing compilation error
Date: Thu, 05 Jun 2014 13:56:24 +0200	[thread overview]
Message-ID: <xa1tvbsfmuxj.fsf@mina86.com> (raw)
In-Reply-To: <008101cf80b0$caf88dc0$60e9a940$%opasiak@samsung.com>

On Thu, Jun 05 2014, Krzysztof Opasiak <k.opasiak@samsung.com> wrote:
> I would suggest adding a suitable structure as you described in
> previous discussion[1]. Writing first 3 fields in each userspace
> program doesn't look quite good. Using:
>
> #ifndef USE_LEGACY_DESC_HEAD
> struct {
> 	struct usb_functionfs_desc_head2 header;
> 	__le32 fs_count
> 	(... and rest according to flags ...)
> } __attribute__((packed)) header;
> #else ...
>
> Would be shorter, more flexible and user friendly. Moreover it gives
> less places for mistake (writing fields in wrong order).

For ffs-test with USE_LEGACY_DESC_HEAD support it would be longer.
Compare:

----------- >8 ---------------------------------------------------------
static const struct {
	struct {
		__le32 magic;
		__le32 length;
#ifndef USE_LEGACY_DESC_HEAD
		__le32 flags;
#endif
		__le32 fs_count;
		__le32 hs_count;
	} __attribute__((packed)) header;
	/* … */
} __attribute__((packed)) descriptors = {
	.header = {
#ifdef USE_LEGACY_DESC_HEAD
		.magic = cpu_to_le32(FUNCTIONFS_DESCRIPTORS_MAGIC),
#else
		.magic = cpu_to_le32(FUNCTIONFS_DESCRIPTORS_MAGIC_V2),
		.flags = cpu_to_le32(FUNCTIONFS_HAS_FS_DESC |
				     FUNCTIONFS_HAS_HS_DESC),
#endif
		.length = cpu_to_le32(sizeof descriptors),
		.fs_count = 3,
		.hs_count = 3,
	},
	/* … */
};
----------- >8 ---------------------------------------------------------

with

----------- >8 ---------------------------------------------------------
static const struct {
#ifdef USE_LEGACY_DESC_HEAD
	struct usb_functionfs_descs_head header;
#else
	struct usb_functionfs_descs_head2 header;
	__le32 fs_count;
	__le32 hs_count;
#endif
	/* … */
} __attribute__((packed)) descriptors = {
#ifndef USE_LEGACY_DESC_HEAD
	.fs_count = 3,
	.hs_count = 3,
	.header = {
		.magic = cpu_to_le32(FUNCTIONFS_DESCRIPTORS_MAGIC_V2),
		.flags = cpu_to_le32(FUNCTIONFS_HAS_FS_DESC |
				     FUNCTIONFS_HAS_HS_DESC),
#else
		.magic = cpu_to_le32(FUNCTIONFS_DESCRIPTORS_MAGIC),
		.fs_count = 3,
		.hs_count = 3,
#endif
		.length = cpu_to_le32(sizeof descriptors),
	},
	/* … */
};
----------- >8 ---------------------------------------------------------

or with

----------- >8 ---------------------------------------------------------
static const struct {
#ifdef USE_LEGACY_DESC_HEAD
	struct usb_functionfs_descs_head header;
#else
	struct {
		struct usb_functionfs_descs_head2 header;
		__le32 fs_count;
		__le32 hs_count;
	} header;
#endif
	/* … */
} __attribute__((packed)) descriptors = {
	.header = {
#ifdef USE_LEGACY_DESC_HEAD
		.magic = cpu_to_le32(FUNCTIONFS_DESCRIPTORS_MAGIC),
		.length = cpu_to_le32(sizeof descriptors),
#else
		.header = {
			.magic = cpu_to_le32(FUNCTIONFS_DESCRIPTORS_MAGIC_V2),
			.flags = cpu_to_le32(FUNCTIONFS_HAS_FS_DESC |
					     FUNCTIONFS_HAS_HS_DESC),
			.length = cpu_to_le32(sizeof descriptors),
		},
#endif
		.fs_count = 3,
		.hs_count = 3,
	},
	/* … */
};
----------- >8 ---------------------------------------------------------

The second one uses an unreadable hack to match length of the first one
and the third one is two lines longer.  On top of that, the second and
third produce different structures, use more complicated preprocessing
directives, and repeat value of fs_count and hs_count twice.

Without legacy support, it would indeed be shorter (by two lines), but
would lead to awkward structures:

----------- >8 ---------------------------------------------------------
struct {
	struct usb_functionfs_descs_head2 header;
	/* Why aren't the two below fields inside of a header? */
	__le32 fs_count;  
	__le32 hs_count;
};

struct {
	struct {
		/* Why is there a header.header field? */
		struct usb_functionfs_descs_head2 header;
		__le32 fs_count;  
		__le32 hs_count;
	};
};
----------- >8 ---------------------------------------------------------

And I don't see how it would be more flexible.  If anything, it would be
less.

I understand, and share, your sentiment, but I don't think adding 
usb_functionfs_descs_head2 structure with magic, flags and length would
improve the situation.

Something I thought about shortly was:

----------- >8 ---------------------------------------------------------
#define USB_FFS_DESCS_HEAD(_flags) struct {				\
		__le32 magic, length, flags;				\
		__le32 data[!!(_flags & FUNCTIONFS_HAS_FS_DESC) +	\
			    !!(_flags & FUNCTIONFS_HAS_HS_DESC) +	\
			    !!(_flags & FUNCTIONFS_HAS_SS_DESC)];	\
	} __attribute__((packed))

#define USB_FFS_DESCS_HEAD_INIT(_flags, length, ...) {			\
		.magic = cpu_to_le32(FUNCTIONFS_DESCRIPTORS_MAGIC_V2),	\
		.flags = cpu_to_le32(flags),				\
		.langth = cpu_to_le32(length),				\
		.data = { __VA_ARGS__ }					\
	}

static const struct {
	USB_FFS_DESCS_HEAD(FUNCTIONFS_HAS_FS_DESC | FUNCTIONFS_HAS_HS_DESC),
	/* … */
} __attribute__((packed)) descriptors = {
	USB_FFS_DESCS_HEAD_INIT(FUNCTIONFS_HAS_FS_DESC | FUNCTIONFS_HAS_HS_DESC,
				sizeof(descriptors), 3, 3),
	/* … */
};
----------- >8 ---------------------------------------------------------

But whether this is nicer is arguable as well.

-- 
Best regards,                                         _     _
.o. | Liege of Serenely Enlightened Majesty of      o' \,=./ `o
..o | Computer Science,  Michał “mina86” Nazarewicz    (o o)
ooo +--<mpn@google.com>--<xmpp:mina86@jabber.org>--ooO--(_)--Ooo--

  reply	other threads:[~2014-06-05 11:56 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-06-05  7:43 [PATCH 1/2] usb: gadget: f_fs: resurect usb_functionfs_descs_head structure Michal Nazarewicz
2014-06-05  7:43 ` [PATCH 2/2] tools: ffs-test: convert to new descriptor format fixing compilation error Michal Nazarewicz
2014-06-05 11:25   ` Krzysztof Opasiak
2014-06-05 11:56     ` Michal Nazarewicz [this message]
2014-06-05 13:49       ` Krzysztof Opasiak
2014-06-05 14:09 ` [PATCH 1/2] usb: gadget: f_fs: resurect usb_functionfs_descs_head structure Sergei Shtylyov

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=xa1tvbsfmuxj.fsf@mina86.com \
    --to=mina86@mina86.com \
    --cc=balbi@ti.com \
    --cc=k.opasiak@samsung.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-usb@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox