iwlwifi: move lockdep assertion into DVM
The fact that the mutex must be held is an implementation detail of DVM, but something has to ensure that no two synchronous cmds are submitted concurrently. Move the lockdep assertion into the DVM-specific code, but also make the transport abort if there are two concurrently commands. The assertion is much more useful though as the transport check can only catch it when it actually happens, while the assertion makes sure it can't possibly happen. Signed-off-by: Johannes Berg <johannes.berg@intel.com> Signed-off-by: Wey-Yi Guy <wey-yi.w.guy@intel.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:
Родитель
721c32f72d
Коммит
2cc39c94c1
|
@ -1298,6 +1298,14 @@ int iwl_dvm_send_cmd(struct iwl_priv *priv, struct iwl_host_cmd *cmd)
|
||||||
return -EIO;
|
return -EIO;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Synchronous commands from this op-mode must hold
|
||||||
|
* the mutex, this ensures we don't try to send two
|
||||||
|
* (or more) synchronous commands at a time.
|
||||||
|
*/
|
||||||
|
if (cmd->flags & CMD_SYNC)
|
||||||
|
lockdep_assert_held(&priv->shrd->mutex);
|
||||||
|
|
||||||
return iwl_trans_send_cmd(trans(priv), cmd);
|
return iwl_trans_send_cmd(trans(priv), cmd);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -973,8 +973,6 @@ static int iwl_send_cmd_sync(struct iwl_trans *trans, struct iwl_host_cmd *cmd)
|
||||||
int cmd_idx;
|
int cmd_idx;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
lockdep_assert_held(&trans->shrd->mutex);
|
|
||||||
|
|
||||||
IWL_DEBUG_INFO(trans, "Attempting to send sync command %s\n",
|
IWL_DEBUG_INFO(trans, "Attempting to send sync command %s\n",
|
||||||
get_cmd_string(cmd->id));
|
get_cmd_string(cmd->id));
|
||||||
|
|
||||||
|
@ -983,7 +981,14 @@ static int iwl_send_cmd_sync(struct iwl_trans *trans, struct iwl_host_cmd *cmd)
|
||||||
get_cmd_string(cmd->id));
|
get_cmd_string(cmd->id));
|
||||||
return -EIO;
|
return -EIO;
|
||||||
}
|
}
|
||||||
set_bit(STATUS_HCMD_ACTIVE, &trans->shrd->status);
|
|
||||||
|
if (WARN_ON(test_and_set_bit(STATUS_HCMD_ACTIVE,
|
||||||
|
&trans->shrd->status))) {
|
||||||
|
IWL_ERR(trans, "Command %s: a command is already active!\n",
|
||||||
|
get_cmd_string(cmd->id));
|
||||||
|
return -EIO;
|
||||||
|
}
|
||||||
|
|
||||||
IWL_DEBUG_INFO(trans, "Setting HCMD_ACTIVE for command %s\n",
|
IWL_DEBUG_INFO(trans, "Setting HCMD_ACTIVE for command %s\n",
|
||||||
get_cmd_string(cmd->id));
|
get_cmd_string(cmd->id));
|
||||||
|
|
||||||
|
|
Загрузка…
Ссылка в новой задаче