Skip to content

Commit

Permalink
libertas: add opaque extra argument to cmd callback function
Browse files Browse the repository at this point in the history
This will be useful for letting callbacks do stuff like copying the
response into a buffer provided by the caller of lbs_cmd()

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 b6b8abe commit 1309b55
Show file tree
Hide file tree
Showing 5 changed files with 16 additions and 9 deletions.
6 changes: 5 additions & 1 deletion drivers/net/wireless/libertas/cmd.c
Original file line number Diff line number Diff line change
Expand Up @@ -1642,6 +1642,7 @@ static void cleanup_cmdnode(struct cmd_ctrl_node *ptempnode)
ptempnode->wait_option = 0;
ptempnode->pdata_buf = NULL;
ptempnode->callback = NULL;
ptempnode->callback_arg = 0;

if (ptempnode->bufvirtualaddr != NULL)
memset(ptempnode->bufvirtualaddr, 0, MRVDRV_SIZE_OF_CMD_BUFFER);
Expand Down Expand Up @@ -1670,6 +1671,7 @@ void lbs_set_cmd_ctrl_node(struct lbs_private *priv,
ptempnode->wait_option = wait_option;
ptempnode->pdata_buf = pdata_buf;
ptempnode->callback = NULL;
ptempnode->callback_arg = 0;

lbs_deb_leave(LBS_DEB_HOST);
}
Expand Down Expand Up @@ -1993,7 +1995,8 @@ void lbs_ps_confirm_sleep(struct lbs_private *priv, u16 psmode)
*/

int lbs_cmd(struct lbs_private *priv, uint16_t command, void *cmd, int cmd_size,
int (*callback)(uint16_t, struct cmd_ds_command *, struct lbs_private *))
int (*callback)(struct lbs_private *, unsigned long, struct cmd_ds_command *),
unsigned long callback_arg)
{
struct cmd_ctrl_node *cmdnode;
struct cmd_ds_gen *cmdptr;
Expand Down Expand Up @@ -2028,6 +2031,7 @@ int lbs_cmd(struct lbs_private *priv, uint16_t command, void *cmd, int cmd_size,
cmdptr = (struct cmd_ds_gen *)cmdnode->bufvirtualaddr;
cmdnode->wait_option = CMD_OPTION_WAITFORRSP;
cmdnode->callback = callback;
cmdnode->callback_arg = callback_arg;

/* Set sequence number, clean result, move to buffer */
priv->seqnum++;
Expand Down
11 changes: 6 additions & 5 deletions drivers/net/wireless/libertas/cmdresp.c
Original file line number Diff line number Diff line change
Expand Up @@ -552,12 +552,13 @@ static int lbs_ret_802_11_subscribe_event(struct lbs_private *priv,
return 0;
}

static inline int handle_cmd_response(u16 respcmd,
struct cmd_ds_command *resp,
struct lbs_private *priv)
static inline int handle_cmd_response(struct lbs_private *priv,
unsigned long dummy,
struct cmd_ds_command *resp)
{
int ret = 0;
unsigned long flags;
uint16_t respcmd = le16_to_cpu(resp->command);

lbs_deb_enter(LBS_DEB_HOST);

Expand Down Expand Up @@ -861,9 +862,9 @@ int lbs_process_rx_command(struct lbs_private *priv)
spin_unlock_irqrestore(&priv->driver_lock, flags);

if (priv->cur_cmd && priv->cur_cmd->callback)
ret = priv->cur_cmd->callback(respcmd, resp, priv);
ret = priv->cur_cmd->callback(priv, priv->cur_cmd->callback_arg, resp);
else
ret = handle_cmd_response(respcmd, resp, priv);
ret = handle_cmd_response(priv, 0, resp);

spin_lock_irqsave(&priv->driver_lock, flags);

Expand Down
3 changes: 2 additions & 1 deletion drivers/net/wireless/libertas/decl.h
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,8 @@ void lbs_send_tx_feedback(struct lbs_private *priv);
int lbs_free_cmd_buffer(struct lbs_private *priv);

int lbs_cmd(struct lbs_private *priv, uint16_t command, void *cmd, int cmd_size,
int (*callback)(uint16_t, struct cmd_ds_command *, struct lbs_private *));
int (*callback)(struct lbs_private *, unsigned long, struct cmd_ds_command *),
unsigned long callback_arg);

int lbs_prepare_and_send_command(struct lbs_private *priv,
u16 cmd_no,
Expand Down
3 changes: 2 additions & 1 deletion drivers/net/wireless/libertas/hostcmd.h
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,8 @@ struct cmd_ctrl_node {
u16 wait_option;
/* command response */
void *pdata_buf;
int (*callback)(uint16_t respcmd, struct cmd_ds_command *resp, struct lbs_private *priv);
int (*callback)(struct lbs_private *priv, unsigned long arg, struct cmd_ds_command *resp);
unsigned long callback_arg;
/* command data */
u8 *bufvirtualaddr;
/* wait queue */
Expand Down
2 changes: 1 addition & 1 deletion drivers/net/wireless/libertas/if_usb.c
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,7 @@ static void if_usb_set_boot2_ver(struct lbs_private *priv)
b2_cmd.action = 0;
b2_cmd.version = priv->boot2_version;

if (lbs_cmd(priv, CMD_SET_BOOT2_VER, &b2_cmd, sizeof(b2_cmd), NULL))
if (lbs_cmd(priv, CMD_SET_BOOT2_VER, &b2_cmd, sizeof(b2_cmd), NULL, 0))
lbs_deb_usb("Setting boot2 version failed\n");
}

Expand Down

0 comments on commit 1309b55

Please sign in to comment.