Re: [PATCH] drivers:bluetooth:ath3k.c Fixed sparse warning for cast to restricted __le32

From: Marcel Holtmann
Date: Wed Mar 26 2014 - 03:21:36 EST


Hi Surendra,

> To fix the sparse warning "cast to restricted __le32" marked
> "rom_version" to __le32 instead of unsigned int in "struct ath3k_version"
> and added cpu_to_le32() for the expression assigning int value to "rom_version".
> Successfully built the module without warnings and errors on x86 machine with sparse.
>
> Signed-off-by: Surendra Patil <surendra.tux@xxxxxxxxx>
> ---
> drivers/bluetooth/ath3k.c | 4 ++--
> 1 file changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/bluetooth/ath3k.c b/drivers/bluetooth/ath3k.c
> index be571fe..5564207 100644
> --- a/drivers/bluetooth/ath3k.c
> +++ b/drivers/bluetooth/ath3k.c
> @@ -50,7 +50,7 @@
> #define ATH3K_NAME_LEN 0xFF
>
> struct ath3k_version {
> - unsigned int rom_version;
> + __le32 rom_version;
> unsigned int build_version;
> unsigned int ram_version;
> unsigned char ref_clock;

so I think this struct should be __packed in the first place and use strictly typed variables.

Seems like all fields have an endian issue.

> @@ -375,7 +375,7 @@ static int ath3k_load_patch(struct usb_device *udev)
> return ret;
> }
>
> - pt_version.rom_version = *(int *)(firmware->data + firmware->size - 8);
> + pt_version.rom_version = cpu_to_le32(*(int *)(firmware->data + firmware->size - 8));
> pt_version.build_version = *(int *)
> (firmware->data + firmware->size - 4);

I have no idea what this code is doing since that is just crazy. The variables are unsigned int and are now casted into int and not to mention that it is unaligned access. Has this code every been run on anything other than x86 at all. Does it happen to just work by pure luck.

Regards

Marcel

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/