2014-03-26 06:36:28

by Surendra Patil

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

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 <[email protected]>
---
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;
@@ -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);

--
1.8.3.2


2014-03-26 17:33:16

by Surendra Patil

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

Thanks Marcel for the feedback,

In my previous patch joe/johan suggested me to make rom_version to __le32 ,
when i made changes i got an warning while compilation as " rom_version
expects __le32 getting unsigned int " hence i added second changes
cpu_to_32().

I am confused about what should be the proper change ? I have only built
the module on x86 with sparse.


On Wed, Mar 26, 2014 at 12:21 AM, Marcel Holtmann <[email protected]>wrote:

> 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 <[email protected]>
> > ---
> > 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
>
>


--
Best,
Surendra Patil

2014-03-26 07:21:22

by Marcel Holtmann

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

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 <[email protected]>
> ---
> 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