From 4aef9ccd299b603d609954750e86298b26d6d7c4 Mon Sep 17 00:00:00 2001 From: Zhu Yi Date: Mon, 20 Aug 2007 10:12:15 +0800 Subject: [PATCH 12/31] iwlwifi: split priv->hcmd_lock from priv->lock to protect hcmd queue The priv->lock is used to protect everything in priv. This patch splits priv->hcmd_lock from priv->lock to protect hardware command (hcmd) queue only. It makes fine granularity locking and fixes a recursive spinlock bug in the PS case in master mode. Signed-off-by: Zhu Yi --- drivers/net/wireless/iwl-base.c | 4 ++-- drivers/net/wireless/iwl-priv.h | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/drivers/net/wireless/iwl-base.c b/drivers/net/wireless/iwl-base.c index f0bf9c1..b80839d 100644 --- a/drivers/net/wireless/iwl-base.c +++ b/drivers/net/wireless/iwl-base.c @@ -696,7 +696,7 @@ static int iwl_enqueue_hcmd(struct iwl_priv *priv, struct iwl_host_cmd *cmd) return -ENOSPC; } - spin_lock_irqsave(&priv->lock, flags); + spin_lock_irqsave(&priv->hcmd_lock, flags); tfd = &txq->bd[q->first_empty]; memset(tfd, 0, sizeof(*tfd)); @@ -745,7 +745,7 @@ static int iwl_enqueue_hcmd(struct iwl_priv *priv, struct iwl_host_cmd *cmd) rc = iwl_tx_queue_update_write_ptr(priv, txq); #endif - spin_unlock_irqrestore(&priv->lock, flags); + spin_unlock_irqrestore(&priv->hcmd_lock, flags); return rc ? rc : idx; } diff --git a/drivers/net/wireless/iwl-priv.h b/drivers/net/wireless/iwl-priv.h index d503d68..c9cb11e 100644 --- a/drivers/net/wireless/iwl-priv.h +++ b/drivers/net/wireless/iwl-priv.h @@ -91,7 +91,8 @@ struct iwl_priv { u8 only_active_channel; /* spinlock */ - spinlock_t lock; + spinlock_t lock; /* protect general shared data */ + spinlock_t hcmd_lock; /* protect hcmd */ struct mutex mutex; /* basic pci-network driver stuff */ -- 1.5.2