Skip to content

Commit

Permalink
libertas: switch lbs_cmd() to take a callback function pointer
Browse files Browse the repository at this point in the history
All existing code which sends commands is set up to have some function
called with the results, not to get data back. It's more versatile this
way, and providing it with a callback function which involves memcpy()
is hardly difficult.

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 ac47246 commit 448a51a
Show file tree
Hide file tree
Showing 4 changed files with 7 additions and 35 deletions.
30 changes: 4 additions & 26 deletions drivers/net/wireless/libertas/cmd.c
Original file line number Diff line number Diff line change
Expand Up @@ -1657,7 +1657,6 @@ static void cleanup_cmdnode(struct cmd_ctrl_node *ptempnode)
wake_up_interruptible(&ptempnode->cmdwait_q);
ptempnode->wait_option = 0;
ptempnode->pdata_buf = NULL;
ptempnode->pdata_size = NULL;
ptempnode->callback = NULL;

if (ptempnode->bufvirtualaddr != NULL)
Expand Down Expand Up @@ -1686,7 +1685,6 @@ void lbs_set_cmd_ctrl_node(struct lbs_private *priv,

ptempnode->wait_option = wait_option;
ptempnode->pdata_buf = pdata_buf;
ptempnode->pdata_size = NULL;
ptempnode->callback = NULL;

lbs_deb_leave(LBS_DEB_HOST);
Expand Down Expand Up @@ -2013,25 +2011,8 @@ void lbs_ps_confirm_sleep(struct lbs_private *priv, u16 psmode)
* the result code from the firmware
*/

static int lbs_cmd_callback(uint16_t respcmd, struct cmd_ds_command *resp, struct lbs_private *priv)
{
struct cmd_ds_gen *r = (struct cmd_ds_gen *)resp;
struct lbs_adapter *adapter = priv->adapter;
u16 sz = le16_to_cpu(resp->size) - S_DS_GEN;

if (sz > *adapter->cur_cmd->pdata_size) {
lbs_pr_err("response 0x%04x doesn't fit into buffer (%d > %d)\n",
respcmd, sz, *adapter->cur_cmd->pdata_size);
sz = *adapter->cur_cmd->pdata_size;
}
memcpy(adapter->cur_cmd->pdata_buf, r->cmdresp, sz);
*adapter->cur_cmd->pdata_size = sz;

return 0;
}

int lbs_cmd(struct lbs_private *priv, u16 command, void *cmd, int cmd_size,
void *rsp, int *rsp_size)
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 *))
{
struct lbs_adapter *adapter = priv->adapter;
struct cmd_ctrl_node *cmdnode;
Expand All @@ -2040,9 +2021,8 @@ int lbs_cmd(struct lbs_private *priv, u16 command, void *cmd, int cmd_size,
int ret = 0;

lbs_deb_enter(LBS_DEB_HOST);
lbs_deb_host("rsp at %p, rsp_size at %p\n", rsp, rsp_size);

if (!adapter || !rsp_size) {
if (!adapter) {
lbs_deb_host("PREP_CMD: adapter is NULL\n");
ret = -1;
goto done;
Expand All @@ -2067,9 +2047,7 @@ int lbs_cmd(struct lbs_private *priv, u16 command, void *cmd, int cmd_size,

cmdptr = (struct cmd_ds_gen *)cmdnode->bufvirtualaddr;
cmdnode->wait_option = CMD_OPTION_WAITFORRSP;
cmdnode->pdata_buf = rsp;
cmdnode->pdata_size = rsp_size;
cmdnode->callback = lbs_cmd_callback;
cmdnode->callback = callback;

/* Set sequence number, clean result, move to buffer */
adapter->seqnum++;
Expand Down
6 changes: 2 additions & 4 deletions drivers/net/wireless/libertas/decl.h
Original file line number Diff line number Diff line change
Expand Up @@ -24,10 +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,
u16 command,
void *cmd, int cmd_size,
void *resp, int *resp_size);
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 lbs_prepare_and_send_command(struct lbs_private *priv,
u16 cmd_no,
Expand Down
1 change: 0 additions & 1 deletion drivers/net/wireless/libertas/hostcmd.h
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,6 @@ struct cmd_ctrl_node {
u16 wait_option;
/* command response */
void *pdata_buf;
int *pdata_size;
int (*callback)(uint16_t respcmd, struct cmd_ds_command *resp, struct lbs_private *priv);
/* command data */
u8 *bufvirtualaddr;
Expand Down
5 changes: 1 addition & 4 deletions drivers/net/wireless/libertas/if_usb.c
Original file line number Diff line number Diff line change
Expand Up @@ -104,15 +104,12 @@ static void if_usb_free(struct usb_card_rec *cardp)
static void if_usb_set_boot2_ver(struct lbs_private *priv)
{
struct cmd_ds_set_boot2_ver b2_cmd;
int rsp_len = sizeof(b2_cmd);

b2_cmd.action = 0;
b2_cmd.version = priv->boot2_version;

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


Expand Down

0 comments on commit 448a51a

Please sign in to comment.