summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Fastabend <john.r.fastabend@intel.com>2010-06-29 18:28:36 +0000
committerDavid S. Miller <davem@davemloft.net>2010-06-29 23:12:40 -0700
commit9f756f018a6d9f83556f972ce7fcd6870274efae (patch)
treebea07e369110ef623c068acfc1f01e748cee4954
parentfa37813401ff52d78591c262d6542e4d5d935584 (diff)
downloadlinux-3.10-9f756f018a6d9f83556f972ce7fcd6870274efae.tar.gz
linux-3.10-9f756f018a6d9f83556f972ce7fcd6870274efae.tar.bz2
linux-3.10-9f756f018a6d9f83556f972ce7fcd6870274efae.zip
ixgbe: disable tx engine before disabling tx laser
Disabling the tx laser while receiving DMA requests can hang the device. After this occurs the device is in a bad state. The GPIO bit never clears when PCI master access is disabled and a reboot is required to get the device in a good state again. Signed-off-by: John Fastabend <john.r.fastabend@intel.com> Acked-by: Peter P Waskiewicz Jr <peter.p.waskiewicz.jr@intel.com> Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/ixgbe/ixgbe_main.c8
1 files changed, 4 insertions, 4 deletions
diff --git a/drivers/net/ixgbe/ixgbe_main.c b/drivers/net/ixgbe/ixgbe_main.c
index e237748995c..7ddd60e7d38 100644
--- a/drivers/net/ixgbe/ixgbe_main.c
+++ b/drivers/net/ixgbe/ixgbe_main.c
@@ -3684,10 +3684,6 @@ void ixgbe_down(struct ixgbe_adapter *adapter)
/* signal that we are down to the interrupt handler */
set_bit(__IXGBE_DOWN, &adapter->state);
- /* power down the optics */
- if (hw->phy.multispeed_fiber)
- hw->mac.ops.disable_tx_laser(hw);
-
/* disable receive for all VFs and wait one second */
if (adapter->num_vfs) {
/* ping all the active vfs to let them know we are going down */
@@ -3742,6 +3738,10 @@ void ixgbe_down(struct ixgbe_adapter *adapter)
(IXGBE_READ_REG(hw, IXGBE_DMATXCTL) &
~IXGBE_DMATXCTL_TE));
+ /* power down the optics */
+ if (hw->phy.multispeed_fiber)
+ hw->mac.ops.disable_tx_laser(hw);
+
/* clear n-tuple filters that are cached */
ethtool_ntuple_flush(netdev);