Skip to content

Commit

Permalink
libertas: use priv->upld_buf for command responses
Browse files Browse the repository at this point in the history
If we don't scribble over the command we sent, then we can retry it when
the firmware responds with 0x0004 (which means -EAGAIN).

Signed-off-by: David Woodhouse <dwmw2@infradead.org>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
  • Loading branch information
David Woodhouse authored and David S. Miller committed Jan 28, 2008
1 parent ac4cced commit 7003b07
Show file tree
Hide file tree
Showing 4 changed files with 4 additions and 30 deletions.
2 changes: 1 addition & 1 deletion drivers/net/wireless/libertas/cmdresp.c
Original file line number Diff line number Diff line change
Expand Up @@ -639,7 +639,7 @@ int lbs_process_rx_command(struct lbs_private *priv)
goto done;
}

resp = priv->cur_cmd->cmdbuf;
resp = (void *)priv->upld_buf;

curcmd = le16_to_cpu(resp->command);

Expand Down
10 changes: 1 addition & 9 deletions drivers/net/wireless/libertas/if_cs.c
Original file line number Diff line number Diff line change
Expand Up @@ -647,7 +647,6 @@ static int if_cs_get_int_status(struct lbs_private *priv, u8 *ireg)
struct if_cs_card *card = (struct if_cs_card *)priv->card;
int ret = 0;
u16 int_cause;
u8 *cmdbuf;
*ireg = 0;

lbs_deb_enter(LBS_DEB_CS);
Expand Down Expand Up @@ -679,14 +678,7 @@ static int if_cs_get_int_status(struct lbs_private *priv, u8 *ireg)
/* Card has a command result for us */
if (*ireg & IF_CS_C_S_CMD_UPLD_RDY) {
spin_lock(&priv->driver_lock);
if (!priv->cur_cmd) {
cmdbuf = priv->upld_buf;
priv->hisregcpy &= ~IF_CS_C_S_RX_UPLD_RDY;
} else {
cmdbuf = (u8 *) priv->cur_cmd->cmdbuf;
}

ret = if_cs_receive_cmdres(priv, cmdbuf, &priv->upld_len);
ret = if_cs_receive_cmdres(priv, priv->upld_buf, &priv->upld_len);
spin_unlock(&priv->driver_lock);
if (ret < 0)
lbs_pr_err("could not receive cmd from card\n");
Expand Down
8 changes: 1 addition & 7 deletions drivers/net/wireless/libertas/if_sdio.c
Original file line number Diff line number Diff line change
Expand Up @@ -136,20 +136,14 @@ static int if_sdio_handle_cmd(struct if_sdio_card *card,

spin_lock_irqsave(&card->priv->driver_lock, flags);

if (!card->priv->cur_cmd) {
lbs_deb_sdio("discarding spurious response\n");
ret = 0;
goto out;
}

if (size > LBS_CMD_BUFFER_SIZE) {
lbs_deb_sdio("response packet too large (%d bytes)\n",
(int)size);
ret = -E2BIG;
goto out;
}

memcpy(card->priv->cur_cmd->cmdbuf, buffer, size);
memcpy(card->priv->upld_buf, buffer, size);
card->priv->upld_len = size;

card->int_cause |= MRVDRV_CMD_UPLD_RDY;
Expand Down
14 changes: 1 addition & 13 deletions drivers/net/wireless/libertas/if_usb.c
Original file line number Diff line number Diff line change
Expand Up @@ -589,8 +589,6 @@ static inline void process_cmdrequest(int recvlength, uint8_t *recvbuff,
struct if_usb_card *cardp,
struct lbs_private *priv)
{
uint8_t *cmdbuf;

if (recvlength > LBS_CMD_BUFFER_SIZE) {
lbs_deb_usbd(&cardp->udev->dev,
"The receive buffer is too large\n");
Expand All @@ -602,19 +600,9 @@ static inline void process_cmdrequest(int recvlength, uint8_t *recvbuff,
BUG();

spin_lock(&priv->driver_lock);
/* take care of cur_cmd = NULL case by reading the
* data to clear the interrupt */
if (!priv->cur_cmd) {
lbs_deb_hex(LBS_DEB_HOST, "Unsolicited CMD_RESP",
(void *) recvbuff + MESSAGE_HEADER_LEN, priv->upld_len);
cmdbuf = priv->upld_buf;
priv->hisregcpy &= ~MRVDRV_CMD_UPLD_RDY;
} else
cmdbuf = (uint8_t *) priv->cur_cmd->cmdbuf;

cardp->usb_int_cause |= MRVDRV_CMD_UPLD_RDY;
priv->upld_len = (recvlength - MESSAGE_HEADER_LEN);
memcpy(cmdbuf, recvbuff + MESSAGE_HEADER_LEN, priv->upld_len);
memcpy(priv->upld_buf, recvbuff + MESSAGE_HEADER_LEN, priv->upld_len);

kfree_skb(skb);
lbs_interrupt(priv);
Expand Down

0 comments on commit 7003b07

Please sign in to comment.