iwlwifi: Fix synchronous host command
This patch replaces static variable from send_cmd_sync with flag in priv->status. It was used for reentrance protection but clearly made it impossible to stuck more cards into the same machine In addition it force check of return values of synchronous commands commands that doesn't requires return value async commands have to be used Signed-off-by: Tomas Winkler <tomas.winkler@intel.com> Signed-off-by: Yi Zhu <yi.zhu@intel.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
このコミットが含まれているのは:
@@ -151,17 +151,17 @@ int iwl_send_cmd_sync(struct iwl_priv *priv, struct iwl_host_cmd *cmd)
|
||||
{
|
||||
int cmd_idx;
|
||||
int ret;
|
||||
static atomic_t entry = ATOMIC_INIT(0); /* reentrance protection */
|
||||
|
||||
BUG_ON(cmd->meta.flags & CMD_ASYNC);
|
||||
|
||||
/* A synchronous command can not have a callback set. */
|
||||
BUG_ON(cmd->meta.u.callback != NULL);
|
||||
|
||||
if (atomic_xchg(&entry, 1)) {
|
||||
if (test_and_set_bit(STATUS_HCMD_SYNC_ACTIVE, &priv->status)) {
|
||||
IWL_ERROR("Error sending %s: Already sending a host command\n",
|
||||
get_cmd_string(cmd->id));
|
||||
return -EBUSY;
|
||||
ret = -EBUSY;
|
||||
goto out;
|
||||
}
|
||||
|
||||
set_bit(STATUS_HCMD_ACTIVE, &priv->status);
|
||||
@@ -231,7 +231,7 @@ fail:
|
||||
cmd->meta.u.skb = NULL;
|
||||
}
|
||||
out:
|
||||
atomic_set(&entry, 0);
|
||||
clear_bit(STATUS_HCMD_SYNC_ACTIVE, &priv->status);
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL(iwl_send_cmd_sync);
|
||||
|
新しいイシューから参照
ユーザーをブロックする