Messages in this thread - First message in thread
- "Brandeburg, Jesse"
- Chris Snook
- "Brandeburg, Jesse"
- "Brandeburg, Jesse"
- "Brandeburg, Jesse"
- "Brandeburg, Jesse"
- "Brandeburg, Jesse"
- "Brandeburg, Jesse"
- "Brandeburg, Jesse"
- "Brandeburg, Jesse"
- "Brandeburg, Jesse"
- "Brandeburg, Jesse"
- "Brandeburg, Jesse"
- "Brandeburg, Jesse"
- Jiri Kosina
- Karsten Keil
- "Jesse Brandeburg"
- Karsten Keil
- James Courtier-Dutton
Patch in this message | | | Date | Thu, 25 Sep 2008 19:11:40 -0700 (Pacific Daylight Time) | From | "Brandeburg, Jesse" <> | Subject | Re: e1000e NVM corruption issue status |
| |
e1000e: debug contention on NVM SWFLAG
From: Thomas Gleixner <tglx@linutronix.de>
This patch adds a mutex to the e1000e driver that would help catch any collisions of two e1000e threads accessing hardware at the same time.
description and patch updated by Jesse
Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Signed-off-by: Jesse Brandeburg <jesse.brandeburg@intel.com> ---
drivers/net/e1000e/ich8lan.c | 17 +++++++++++++++++ 1 files changed, 17 insertions(+), 0 deletions(-)
diff --git a/drivers/net/e1000e/ich8lan.c b/drivers/net/e1000e/ich8lan.c index f1a6e55..2b1aa2a 100644 --- a/drivers/net/e1000e/ich8lan.c +++ b/drivers/net/e1000e/ich8lan.c @@ -382,6 +382,9 @@ static s32 e1000_get_variants_ich8lan(struct e1000_adapter *adapter) return 0; } +static DEFINE_MUTEX(nvm_mutex); +static pid_t nvm_owner = -1; + /** * e1000_acquire_swflag_ich8lan - Acquire software control flag * @hw: pointer to the HW structure @@ -395,6 +398,15 @@ static s32 e1000_acquire_swflag_ich8lan(struct e1000_hw *hw) u32 extcnf_ctrl; u32 timeout = PHY_CFG_TIMEOUT; + WARN_ON(preempt_count()); + + if (!mutex_trylock(&nvm_mutex)) { + WARN(1, KERN_ERR "e1000e mutex contention. Owned by pid %d\n", + nvm_owner); + mutex_lock(&nvm_mutex); + } + nvm_owner = current->pid; + while (timeout) { extcnf_ctrl = er32(EXTCNF_CTRL); extcnf_ctrl |= E1000_EXTCNF_CTRL_SWFLAG; @@ -409,6 +421,8 @@ static s32 e1000_acquire_swflag_ich8lan(struct e1000_hw *hw) if (!timeout) { hw_dbg(hw, "FW or HW has locked the resource for too long.\n"); + nvm_owner = -1; + mutex_unlock(&nvm_mutex); return -E1000_ERR_CONFIG; } @@ -430,6 +444,9 @@ static void e1000_release_swflag_ich8lan(struct e1000_hw *hw) extcnf_ctrl = er32(EXTCNF_CTRL); extcnf_ctrl &= ~E1000_EXTCNF_CTRL_SWFLAG; ew32(EXTCNF_CTRL, extcnf_ctrl); + + nvm_owner = -1; + mutex_unlock(&nvm_mutex); } /**
| |