From: Ivo van Doorn <ivdoorn@gmail.com>
To: Adrian Bunk <bunk@kernel.org>
Cc: "John W. Linville" <linville@tuxdriver.com>,
linux-wireless@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: drivers/net/wireless/rt2x00/: struct data_desc strangeness
Date: Sun, 14 Oct 2007 21:06:20 +0200 [thread overview]
Message-ID: <200710142106.20409.IvDoorn@gmail.com> (raw)
In-Reply-To: <20071014175032.GI4211@stusta.de>
On Sunday 14 October 2007, Adrian Bunk wrote:
> drivers/net/wireless/rt2x00/rt2x00ring.h contains the following:
>
> <-- snip -->
>
> ...
> /*
> * data_desc
> * Each data entry also contains a descriptor which is used by the
> * device to determine what should be done with the packet and
> * what the current status is.
> * This structure is greatly simplified, but the descriptors
> * are basically a list of little endian 32 bit values.
> * Make the array by default 1 word big, this will allow us
> * to use sizeof() correctly.
> */
> struct data_desc {
> __le32 word[1];
> };
> ...
> /*
> * TX/RX Descriptor access functions.
> */
> static inline void rt2x00_desc_read(struct data_desc *desc,
> const u8 word, u32 *value)
> {
> *value = le32_to_cpu(desc->word[word]);
> }
>
> static inline void rt2x00_desc_write(struct data_desc *desc,
> const u8 word, const u32 value)
> {
> desc->word[word] = cpu_to_le32(value);
> }
> ...
>
> <-- snip -->
>
> I haven't checked whether it might work in all cases, but passing
> non-zero values as second parameter to rt2x00_desc_{read,write}()
> (as is done in many cases) is even in the best case bad coding style.
Access to the array is correct, even with non-zero values the code that is
reading/writing to the array knows the exact size of the descriptor. Within
rt2x00 are however 5 drivers who have different descriptor sizes. That means
I can't create a structure which has the correct array length.
The structure itself is just a simple map over preallocated memory
(skb->data in case of USB or dma in case of PCI).
So possible solutions would be:
- remove struct data_desc and make it a void* or __le32*
This is at the cost of code readibility since the above pointers
have less meaning then a pointer to a structure which can be nicely
documented.
- increase the word[] array to something that fits all (+/- 20 entries)
This wouldn't really be a problem, all it requires is fixing the sizeof()
statements. But then the code should contain a big note about that it
is not allowed to read/write _all_ words in the entry since it depends on
the driver that uses it.
What would in this case be the best solution for good coding style?
Ivo
next prev parent reply other threads:[~2007-10-14 18:49 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-10-14 17:50 drivers/net/wireless/rt2x00/: struct data_desc strangeness Adrian Bunk
2007-10-14 19:06 ` Ivo van Doorn [this message]
2007-10-23 19:43 ` Adrian Bunk
2007-10-23 20:13 ` Ivo van Doorn
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=200710142106.20409.IvDoorn@gmail.com \
--to=ivdoorn@gmail.com \
--cc=bunk@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-wireless@vger.kernel.org \
--cc=linville@tuxdriver.com \
/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;
as well as URLs for NNTP newsgroup(s).