Skip to content

Commit

Permalink
wl1271: Check result code of commands
Browse files Browse the repository at this point in the history
Check the result code of all commands, and return an error code if the
firmware reports an error in execution. Previously this error would go
ignored in most cases.

Signed-off-by: Juuso Oikarinen <juuso.oikarinen@nokia.com>
Reviewed-by: Luciano Coelho <luciano.coelho@nokia.com>
Signed-off-by: Luciano Coelho <luciano.coelho@nokia.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
  • Loading branch information
Juuso Oikarinen authored and John W. Linville committed Nov 2, 2009
1 parent 605351e commit 3b775b4
Show file tree
Hide file tree
Showing 2 changed files with 14 additions and 27 deletions.
34 changes: 9 additions & 25 deletions drivers/net/wireless/wl12xx/wl1271_cmd.c
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,15 @@ int wl1271_cmd_send(struct wl1271 *wl, u16 id, void *buf, size_t len)
intr = wl1271_spi_read32(wl, ACX_REG_INTERRUPT_NO_CLEAR);
}

/* read back the status code of the command */
wl1271_spi_read(wl, wl->cmd_box_addr, cmd,
sizeof(struct wl1271_cmd_header), false);

if (cmd->status != CMD_STATUS_SUCCESS) {
wl1271_error("command execute failure %d", cmd->status);
ret = -EIO;
}

wl1271_spi_write32(wl, ACX_REG_INTERRUPT_ACK,
WL1271_ACX_INTR_CMD_COMPLETE);

Expand Down Expand Up @@ -306,7 +315,6 @@ int wl1271_cmd_test(struct wl1271 *wl, void *buf, size_t buf_len, u8 answer)

if (answer) {
struct wl1271_command *cmd_answer;
u16 status;

/*
* The test command got in, we can read the answer.
Expand All @@ -316,10 +324,6 @@ int wl1271_cmd_test(struct wl1271 *wl, void *buf, size_t buf_len, u8 answer)
wl1271_spi_read(wl, wl->cmd_box_addr, buf, buf_len, false);

cmd_answer = buf;
status = le16_to_cpu(cmd_answer->header.status);

if (status != CMD_STATUS_SUCCESS)
wl1271_error("TEST command answer error: %d", status);
}

return 0;
Expand Down Expand Up @@ -354,11 +358,6 @@ int wl1271_cmd_interrogate(struct wl1271 *wl, u16 id, void *buf, size_t len)
/* the interrogate command got in, we can read the answer */
wl1271_spi_read(wl, wl->cmd_box_addr, buf, len, false);

acx = buf;
if (le16_to_cpu(acx->cmd.status) != CMD_STATUS_SUCCESS)
wl1271_error("INTERROGATE command error: %d",
le16_to_cpu(acx->cmd.status));

out:
return ret;
}
Expand Down Expand Up @@ -507,11 +506,6 @@ int wl1271_cmd_read_memory(struct wl1271 *wl, u32 addr, void *answer,

/* the read command got in, we can now read the answer */
wl1271_spi_read(wl, wl->cmd_box_addr, cmd, sizeof(*cmd), false);

if (le16_to_cpu(cmd->header.status) != CMD_STATUS_SUCCESS)
wl1271_error("error in read command result: %d",
le16_to_cpu(cmd->header.status));

memcpy(answer, cmd->value, len);

out:
Expand Down Expand Up @@ -639,17 +633,7 @@ int wl1271_cmd_scan(struct wl1271 *wl, u8 *ssid, size_t len,
ret = wl1271_cmd_send(wl, CMD_SCAN, params, sizeof(*params));
if (ret < 0) {
wl1271_error("SCAN failed");
goto out;
}

wl1271_spi_read(wl, wl->cmd_box_addr, params, sizeof(*params),
false);

if (le16_to_cpu(params->header.status) != CMD_STATUS_SUCCESS) {
wl1271_error("Scan command error: %d",
le16_to_cpu(params->header.status));
wl->scanning = false;
ret = -EIO;
goto out;
}

Expand Down
7 changes: 5 additions & 2 deletions drivers/net/wireless/wl12xx/wl1271_init.c
Original file line number Diff line number Diff line change
Expand Up @@ -303,12 +303,15 @@ int wl1271_hw_init(struct wl1271 *wl)
{
int ret;

/* FIXME: the following parameter setting functions return error
* codes - the reason is so far unknown. The -EIO is therefore
* ignored for the time being. */
ret = wl1271_init_general_parms(wl);
if (ret < 0)
if (ret < 0 && ret != -EIO)
return ret;

ret = wl1271_init_radio_parms(wl);
if (ret < 0)
if (ret < 0 && ret != -EIO)
return ret;

/* Template settings */
Expand Down

0 comments on commit 3b775b4

Please sign in to comment.