Search Linux Wireless

Re: [PATCH] wl1251: fix sparse-generated warnings

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 07/22/2010 08:34 AM, Luciano Coelho wrote:
> Hi John,

Hi Luca and John,

> Great that someone finally made the endianess changes that we never had
> the time to do for wl1251. Thanks for that! :)

Yeah, it really is. wl1251 endian support has been broken almost from
day one. Unfortunately I don't any hardware to test wl1251 right now, so
we have to rely on careful review :/

>> @@ -467,7 +467,7 @@ static int wl1251_boot_upload_nvs(struct wl1251 *wl)
>>  		val = (nvs_ptr[0] | (nvs_ptr[1] << 8)
>>  		       | (nvs_ptr[2] << 16) | (nvs_ptr[3] << 24));
>>  
>> -		val = cpu_to_le32(val);
>> +		val = (u32 __force) cpu_to_le32(val);
> 
> This will work, but such casts always make me a bit suspicious.  I think
> this is fine for now

This line was very suspicious already from beginning, I can't remember
why it was added and I don't see why it's needed here.

> but later I think we should make sure that all the
> _write() functions explicitly receive __le32 as val, or receives the
> cpu's u32 and converts it before actually writing the value, for
> clarity reasons.  Kalle, what do you think?

I agree that we should change write() to handle endianess properly. I'm
in favor of having the conversion in write(), but I didn't think this
that much.

>> @@ -191,11 +191,13 @@ static int wl1251_tx_send_packet(struct wl1251 *wl, struct sk_buff *skb,
>>  	if (control->control.hw_key &&
>>  	    control->control.hw_key->alg == ALG_TKIP) {
>>  		int hdrlen;
>> -		u16 fc;
>> +		__le16 fc;
>> +		u16 length;
>>  		u8 *pos;
>>  
>> -		fc = *(u16 *)(skb->data + sizeof(*tx_hdr));
>> -		tx_hdr->length += WL1251_TKIP_IV_SPACE;
>> +		fc = *(__le16 *)(skb->data + sizeof(*tx_hdr));
> 
> Is this going to work? sizeof(*tx_hdr), and the operation, will be in
> the cpu's endianess, right?

I think this is correct. We first calculate a pointer to a __le16 value
and then dereference that value to a __le16 variable.

> Wouldn't the following be the right thing to
> do then?
> 
> fc = cpu_to_le16(le16_to_cpu(skb->data) + sizeof(*tx_hdr));
> 
> Maybe some casts are needed too, I didn't check that, but regarding the
> endianess, I think this is how it should go.  It's the same thing as the
> length parameter:
> 
>> +		length = le16_to_cpu(tx_hdr->length) + WL1251_TKIP_IV_SPACE;
>> +		tx_hdr->length = cpu_to_le16(length);
> 
> ...which is treated correctly here.

This is different. Here we are adding something to a __le16 value, not
calculating with pointers.

Kalle
--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux Host AP]     [ATH6KL]     [Linux Bluetooth]     [Linux Netdev]     [Kernel Newbies]     [Linux Kernel]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Samba]     [Device Mapper]
  Powered by Linux