lkml.org 
[lkml]   [2008]   [Sep]   [25]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    SubjectRe: 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);
    }

    /**

    \
     
     \ /
      Last update: 2008-09-26 04:15    [W:0.023 / U:60.584 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site