summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJohannes Berg <johannes.berg@intel.com>2011-06-27 06:06:42 -0700
committerWey-Yi Guy <wey-yi.w.guy@intel.com>2011-07-01 07:46:21 -0700
commit98a648e10a3c4eb30f8043281345506e17ace007 (patch)
tree0e1f04eb63b342018635f0bb38860e13cedaaa7d
parent9a4ba833a2d0016cf836827e136f0c219834bd41 (diff)
downloadlinux-98a648e10a3c4eb30f8043281345506e17ace007.tar.bz2
iwlagn: verify mutex held for sync commands
Emmanuel noticed that there's no explicit checking that prevents the driver from attempting to issue multiple synchronous commands at the same time and wrote a patch to check. However, his patch warns only if a collision actually happened, an unlikely thing since the driver mutex should be held for synchronous command submissions. So instead of checking that a collision happened add a check that the mutex is held which ensures that collisions can't happen. Signed-off-by: Johannes Berg <johannes.berg@intel.com> Signed-off-by: Wey-Yi Guy <wey-yi.w.guy@intel.com>
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-dev.h1
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-hcmd.c13
2 files changed, 3 insertions, 11 deletions
diff --git a/drivers/net/wireless/iwlwifi/iwl-dev.h b/drivers/net/wireless/iwlwifi/iwl-dev.h
index 8ec04f20c96a..ae2ecc24b91e 100644
--- a/drivers/net/wireless/iwlwifi/iwl-dev.h
+++ b/drivers/net/wireless/iwlwifi/iwl-dev.h
@@ -1301,7 +1301,6 @@ struct iwl_priv {
/* command queue number */
u8 cmd_queue;
- u8 last_sync_cmd_id;
/* max number of station keys */
u8 sta_key_max_num;
diff --git a/drivers/net/wireless/iwlwifi/iwl-hcmd.c b/drivers/net/wireless/iwlwifi/iwl-hcmd.c
index e3e5fb614178..107b38e2ee93 100644
--- a/drivers/net/wireless/iwlwifi/iwl-hcmd.c
+++ b/drivers/net/wireless/iwlwifi/iwl-hcmd.c
@@ -171,6 +171,8 @@ int iwl_send_cmd_sync(struct iwl_priv *priv, struct iwl_host_cmd *cmd)
int cmd_idx;
int ret;
+ lockdep_assert_held(&priv->mutex);
+
if (WARN_ON(cmd->flags & CMD_ASYNC))
return -EINVAL;
@@ -181,16 +183,7 @@ int iwl_send_cmd_sync(struct iwl_priv *priv, struct iwl_host_cmd *cmd)
IWL_DEBUG_INFO(priv, "Attempting to send sync command %s\n",
get_cmd_string(cmd->id));
- if (test_and_set_bit(STATUS_HCMD_ACTIVE, &priv->status)) {
- IWL_ERR(priv, "STATUS_HCMD_ACTIVE already set while sending %s"
- ". Previous SYNC cmdn is %s\n",
- get_cmd_string(cmd->id),
- get_cmd_string(priv->last_sync_cmd_id));
- WARN_ON(1);
- } else {
- priv->last_sync_cmd_id = cmd->id;
- }
-
+ set_bit(STATUS_HCMD_ACTIVE, &priv->status);
IWL_DEBUG_INFO(priv, "Setting HCMD_ACTIVE for command %s\n",
get_cmd_string(cmd->id));