]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
e1000e: log when swflag is cleared unexpectedly on ICH/PCH devices
authorBruce Allan <bruce.w.allan@intel.com>
Fri, 13 May 2011 07:19:53 +0000 (07:19 +0000)
committerJoe Jin <joe.jin@oracle.com>
Thu, 2 Feb 2012 13:18:55 +0000 (21:18 +0800)
Since EXTCNF_CTRL.SWFLAG (used in the ownership arbitration of shared
resources, e.g. the PHY shared between the s/w, f/w, and h/w clients)
can be cleared by any of those clients, log a debug message when
software attempts to clear it and it is already cleared unexpectedly.
And since the swflag is cleared by a hardware reset, the driver does
not need to do that, but the mutex acquired when the bit is set must
still be cleared.

Signed-off-by: Bruce Allan <bruce.w.allan@intel.com>
Tested-by: Aaron Brown <aaron.f.brown@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
(cherry picked from commit c5caf4825b22957e4ad70fd94316e91ce8cfb51c)

Signed-off-by: Joe Jin <joe.jin@oracle.com>
drivers/net/e1000e/ich8lan.c

index d7693a48eeb0d85c661c20df6fe5e288acc2bd44..2f7121cc697d4211f0a16eb3084ae2c568f791f1 100644 (file)
@@ -890,8 +890,13 @@ static void e1000_release_swflag_ich8lan(struct e1000_hw *hw)
        u32 extcnf_ctrl;
 
        extcnf_ctrl = er32(EXTCNF_CTRL);
-       extcnf_ctrl &= ~E1000_EXTCNF_CTRL_SWFLAG;
-       ew32(EXTCNF_CTRL, extcnf_ctrl);
+
+       if (extcnf_ctrl & E1000_EXTCNF_CTRL_SWFLAG) {
+               extcnf_ctrl &= ~E1000_EXTCNF_CTRL_SWFLAG;
+               ew32(EXTCNF_CTRL, extcnf_ctrl);
+       } else {
+               e_dbg("Semaphore unexpectedly released by sw/fw/hw\n");
+       }
 
        mutex_unlock(&swflag_mutex);
 }
@@ -3075,7 +3080,7 @@ static s32 e1000_reset_hw_ich8lan(struct e1000_hw *hw)
        msleep(20);
 
        if (!ret_val)
-               e1000_release_swflag_ich8lan(hw);
+               mutex_unlock(&swflag_mutex);
 
        if (ctrl & E1000_CTRL_PHY_RST) {
                ret_val = hw->phy.ops.get_cfg_done(hw);