diff options
Diffstat (limited to 'drivers/net/wireless/libertas/cmdresp.c')
-rw-r--r-- | drivers/net/wireless/libertas/cmdresp.c | 23 |
1 files changed, 8 insertions, 15 deletions
diff --git a/drivers/net/wireless/libertas/cmdresp.c b/drivers/net/wireless/libertas/cmdresp.c index 22a697363381..20ca38c7f870 100644 --- a/drivers/net/wireless/libertas/cmdresp.c +++ b/drivers/net/wireless/libertas/cmdresp.c | |||
@@ -880,22 +880,15 @@ int lbs_process_rx_command(struct lbs_private *priv) | |||
880 | goto done; | 880 | goto done; |
881 | } | 881 | } |
882 | 882 | ||
883 | if (adapter->cur_cmd->pdata_size) { | 883 | spin_unlock_irqrestore(&adapter->driver_lock, flags); |
884 | struct cmd_ds_gen *r = (struct cmd_ds_gen *)resp; | 884 | |
885 | u16 sz = cpu_to_le16(resp->size) - S_DS_GEN; | 885 | if (adapter->cur_cmd && adapter->cur_cmd->callback) |
886 | if (sz > *adapter->cur_cmd->pdata_size) { | 886 | ret = adapter->cur_cmd->callback(respcmd, resp, priv); |
887 | lbs_pr_err("response 0x%04x doesn't fit into " | 887 | else |
888 | "buffer (%d > %d)\n", respcmd, | ||
889 | sz, *adapter->cur_cmd->pdata_size); | ||
890 | sz = *adapter->cur_cmd->pdata_size; | ||
891 | } | ||
892 | memcpy(adapter->cur_cmd->pdata_buf, r->cmdresp, sz); | ||
893 | *adapter->cur_cmd->pdata_size = sz; | ||
894 | } else { | ||
895 | spin_unlock_irqrestore(&adapter->driver_lock, flags); | ||
896 | ret = handle_cmd_response(respcmd, resp, priv); | 888 | ret = handle_cmd_response(respcmd, resp, priv); |
897 | spin_lock_irqsave(&adapter->driver_lock, flags); | 889 | |
898 | } | 890 | spin_lock_irqsave(&adapter->driver_lock, flags); |
891 | |||
899 | if (adapter->cur_cmd) { | 892 | if (adapter->cur_cmd) { |
900 | /* Clean up and Put current command back to cmdfreeq */ | 893 | /* Clean up and Put current command back to cmdfreeq */ |
901 | __lbs_cleanup_and_insert_cmd(priv, adapter->cur_cmd); | 894 | __lbs_cleanup_and_insert_cmd(priv, adapter->cur_cmd); |