iwlagn: verify that huge commands are synchronous
authorJohannes Berg <johannes.berg@intel.com>
Mon, 18 Apr 2011 16:22:10 +0000 (09:22 -0700)
committerWey-Yi Guy <wey-yi.w.guy@intel.com>
Mon, 18 Apr 2011 16:23:45 +0000 (09:23 -0700)
Since huge commands all share a single buffer,
there can only be a single one in flight at a
time since otherwise they'd overwrite each
other. This is true in the driver now, but it
seems like a possible source of bugs, so add
a test to verify that huge commands are always
sent synchronously.

Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Signed-off-by: Wey-Yi Guy <wey-yi.w.guy@intel.com>
drivers/net/wireless/iwlwifi/iwl-tx.c

index e7faba5..1b69507 100644 (file)
@@ -470,6 +470,14 @@ int iwl_enqueue_hcmd(struct iwl_priv *priv, struct iwl_host_cmd *cmd)
                return -EIO;
        }
 
+       /*
+        * As we only have a single huge buffer, check that the command
+        * is synchronous (otherwise buffers could end up being reused).
+        */
+
+       if (WARN_ON((cmd->flags & CMD_ASYNC) && (cmd->flags & CMD_SIZE_HUGE)))
+               return -EINVAL;
+
        spin_lock_irqsave(&priv->hcmd_lock, flags);
 
        if (iwl_queue_space(q) < ((cmd->flags & CMD_ASYNC) ? 2 : 1)) {