2012-11-05 20:18:07

by Pontus Fuchs

[permalink] [raw]
Subject: [PATCH 1/2] ar5523: Fix sparse endianness warnings

__be32 variables where used a little careless leading to sparse warnings.
Treat them a little more gentle.

Reported-by: Fengguang Wu <[email protected]>
Signed-off-by: Pontus Fuchs <[email protected]>
---
drivers/net/wireless/ath/ar5523/ar5523.c | 43 ++++++++++++++-------------
drivers/net/wireless/ath/ar5523/ar5523_hw.h | 2 +-
2 files changed, 24 insertions(+), 21 deletions(-)

diff --git a/drivers/net/wireless/ath/ar5523/ar5523.c b/drivers/net/wireless/ath/ar5523/ar5523.c
index f782b6e..bb774b3 100644
--- a/drivers/net/wireless/ath/ar5523/ar5523.c
+++ b/drivers/net/wireless/ath/ar5523/ar5523.c
@@ -50,18 +50,19 @@ static void ar5523_read_reply(struct ar5523 *ar, struct ar5523_cmd_hdr *hdr,
struct ar5523_tx_cmd *cmd)
{
int dlen, olen;
- u32 *rp;
+ __be32 *rp;

- dlen = hdr->len - sizeof(*hdr);
+ dlen = be32_to_cpu(hdr->len) - sizeof(*hdr);

if (dlen < 0) {
WARN_ON(1);
goto out;
}

- ar5523_dbg(ar, "Code = %d len = %d\n", hdr->code & 0xff, dlen);
+ ar5523_dbg(ar, "Code = %d len = %d\n", be32_to_cpu(hdr->code) & 0xff,
+ dlen);

- rp = (u32 *)(hdr + 1);
+ rp = (__be32 *)(hdr + 1);
if (dlen >= sizeof(u32)) {
olen = be32_to_cpu(rp[0]);
dlen -= sizeof(u32);
@@ -95,6 +96,7 @@ static void ar5523_cmd_rx_cb(struct urb *urb)
struct ar5523_tx_cmd *cmd = &ar->tx_cmd;
struct ar5523_cmd_hdr *hdr = ar->rx_cmd_buf;
int dlen;
+ u32 code, hdrlen;

if (urb->status) {
if (urb->status != -ESHUTDOWN)
@@ -110,15 +112,15 @@ static void ar5523_cmd_rx_cb(struct urb *urb)
ar5523_dbg(ar, "%s code %02x priv %d\n", __func__,
be32_to_cpu(hdr->code) & 0xff, hdr->priv);

- hdr->code = be32_to_cpu(hdr->code);
- hdr->len = be32_to_cpu(hdr->len);
+ code = be32_to_cpu(hdr->code);
+ hdrlen = be32_to_cpu(hdr->len);

- switch (hdr->code & 0xff) {
+ switch (code & 0xff) {
default:
/* reply to a read command */
if (hdr->priv != AR5523_CMD_ID) {
ar5523_err(ar, "Unexpected command id: %02x\n",
- hdr->code & 0xff);
+ code & 0xff);
goto skip;
}
ar5523_read_reply(ar, hdr, cmd);
@@ -147,7 +149,7 @@ static void ar5523_cmd_rx_cb(struct urb *urb)
case WDCMSG_TARGET_START:
/* This command returns a bogus id so it needs special
handling */
- dlen = hdr->len - sizeof(*hdr);
+ dlen = hdrlen - sizeof(*hdr);
if (dlen != (int)sizeof(u32)) {
ar5523_err(ar, "Invalid reply to WDCMSG_TARGET_START");
return;
@@ -303,7 +305,7 @@ static int ar5523_config(struct ar5523 *ar, u32 reg, u32 val)

write.reg = cpu_to_be32(reg);
write.len = cpu_to_be32(0); /* 0 = single write */
- *(u32 *)write.data = cpu_to_be32(val);
+ *(__be32 *)write.data = cpu_to_be32(val);

error = ar5523_cmd_write(ar, WDCMSG_TARGET_SET_CONFIG, &write,
3 * sizeof(u32), 0);
@@ -335,29 +337,30 @@ static int ar5523_get_status(struct ar5523 *ar, u32 which, void *odata,
int olen)
{
int error;
+ __be32 which_be;

- which = cpu_to_be32(which);
+ which_be = cpu_to_be32(which);
error = ar5523_cmd_read(ar, WDCMSG_TARGET_GET_STATUS,
- &which, sizeof(which), odata, olen, AR5523_CMD_FLAG_MAGIC);
+ &which_be, sizeof(which_be), odata, olen, AR5523_CMD_FLAG_MAGIC);
if (error != 0)
- ar5523_err(ar, "could not read EEPROM offset 0x%02x\n",
- be32_to_cpu(which));
+ ar5523_err(ar, "could not read EEPROM offset 0x%02x\n", which);
return error;
}

static int ar5523_get_capability(struct ar5523 *ar, u32 cap, u32 *val)
{
int error;
+ __be32 cap_be, val_be;

- cap = cpu_to_be32(cap);
- error = ar5523_cmd_read(ar, WDCMSG_TARGET_GET_CAPABILITY,
- &cap, sizeof(cap), val, sizeof(u32), AR5523_CMD_FLAG_MAGIC);
+ cap_be = cpu_to_be32(cap);
+ error = ar5523_cmd_read(ar, WDCMSG_TARGET_GET_CAPABILITY, &cap_be,
+ sizeof(cap_be), &val_be, sizeof(__be32),
+ AR5523_CMD_FLAG_MAGIC);
if (error != 0) {
- ar5523_err(ar, "could not read capability %u\n",
- be32_to_cpu(cap));
+ ar5523_err(ar, "could not read capability %u\n", cap);
return error;
}
- *val = be32_to_cpu(*val);
+ *val = be32_to_cpu(val_be);
return error;
}

diff --git a/drivers/net/wireless/ath/ar5523/ar5523_hw.h b/drivers/net/wireless/ath/ar5523/ar5523_hw.h
index a0e8bf4..0fe2c80 100644
--- a/drivers/net/wireless/ath/ar5523/ar5523_hw.h
+++ b/drivers/net/wireless/ath/ar5523/ar5523_hw.h
@@ -161,7 +161,7 @@ struct ar5523_rx_desc {

struct ar5523_tx_desc {
__be32 msglen;
- __be32 msgid; /* msg id (supplied by host) */
+ u32 msgid; /* msg id (supplied by host) */
__be32 type; /* opcode: WDMSG_SEND or WDCMSG_FLUSH */
__be32 txqid; /* tx queue id and flags */
#define UATH_TXQID_MASK 0x0f
--
1.7.9.5



2012-11-05 20:18:08

by Pontus Fuchs

[permalink] [raw]
Subject: [PATCH 2/2] ar5523: Don't dereference sta if NULL

A missing else caused a potential NULL dereference.

Reported-by: Yuanhan Liu <[email protected]>
Signed-off-by: Pontus Fuchs <[email protected]>
---
drivers/net/wireless/ath/ar5523/ar5523.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/net/wireless/ath/ar5523/ar5523.c b/drivers/net/wireless/ath/ar5523/ar5523.c
index bb774b3..c312899 100644
--- a/drivers/net/wireless/ath/ar5523/ar5523.c
+++ b/drivers/net/wireless/ath/ar5523/ar5523.c
@@ -1196,8 +1196,8 @@ static void ar5523_create_rateset(struct ar5523 *ar,
if (!sta) {
ar5523_info(ar, "STA not found. Cannot set rates\n");
sta_rate_set = bss_conf->basic_rates;
- }
- sta_rate_set = sta->supp_rates[ar->hw->conf.channel->band];
+ } else
+ sta_rate_set = sta->supp_rates[ar->hw->conf.channel->band];

ar5523_dbg(ar, "sta rate_set = %08x\n", sta_rate_set);

--
1.7.9.5