On Sat, 03 Oct 2015 11:57:34 +0200, Takashi Sakamoto wrote:
On 2015年10月03日 18:14, Clemens Ladisch wrote:
Takashi Sakamoto wrote:
23 data = be32_to_cpu(fw_dev->config_rom[28]);
About using 'be32_to_cpu()', the 'config_rom' member actually has 'const u32 *', while in the member caracters in the textual leaf are aligned in big-endian.
Strictly speaking, strings do not have an endianness.
Most data in the actual configuration ROM is organized as big-endian 32- bit values, so the FireWire core converts _all_ words from big endian to CPU endian. The words that are not actually 32-bit values but strings have to be converted back; the correct function for this is cpu_to_be32().
Yes. And I forgot a pair of cpu_to_be32/be32_to_cpu is symmetric each other! (I'm really a stupid guy, sigh...)
This patch solves the sparce warnings.
$ git diff diff --git a/sound/firewire/tascam/tascam.c b/sound/firewire/tascam/tascam.c index ee2f498..6e1087e 100644 --- a/sound/firewire/tascam/tascam.c +++ b/sound/firewire/tascam/tascam.c @@ -50,19 +50,19 @@ static int check_name(struct snd_tscm *tscm) struct fw_device *fw_dev = fw_parent_device(tscm->unit); char vendor[8]; char model[8];
__u32 data;
__be32 data; /* Retrieve model name. */
data = be32_to_cpu(fw_dev->config_rom[28]);
data = cpu_to_be32(fw_dev->config_rom[28]); memcpy(model, &data, 4);
data = be32_to_cpu(fw_dev->config_rom[29]);
data = cpu_to_be32(fw_dev->config_rom[29]); memcpy(model + 4, &data, 4); model[7] = '\0'; /* Retrieve vendor name. */
data = be32_to_cpu(fw_dev->config_rom[23]);
data = cpu_to_be32(fw_dev->config_rom[23]); memcpy(vendor, &data, 4);
data = be32_to_cpu(fw_dev->config_rom[24]);
data = cpu_to_be32(fw_dev->config_rom[24]); memcpy(vendor + 4, &data, 4); vendor[7] = '\0';
Iwai-san,
Should I re-post this patchset? Or you kindly merge them with your modification?
I already merged the latest patchset, so incremental patches are preferred.
thanks,
Takashi