e1000e: fix flush_desc_ring implementation
authorYanir Lubetkin <yanirx.lubetkin@intel.com>
Tue, 2 Jun 2015 14:05:38 +0000 (17:05 +0300)
committerJeff Kirsher <jeffrey.t.kirsher@intel.com>
Wed, 3 Jun 2015 10:38:01 +0000 (03:38 -0700)
The indication that a descriptor ring flush is required was read from
FEXTNVM7 by mistake. It should be read from the PCI config space.

Signed-off-by: Yanir Lubetkin <yanirx.lubetkin@intel.com>
Tested-by: Aaron Brown <aaron.f.brown@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
drivers/net/ethernet/intel/e1000e/e1000.h
drivers/net/ethernet/intel/e1000e/ich8lan.h
drivers/net/ethernet/intel/e1000e/netdev.c

index 0abc942c966e4a377af222c1d876af6983edb91a..e78487ab18da98465dd24f063b751970419bbb6a 100644 (file)
@@ -98,6 +98,8 @@ struct e1000_info;
 #define DEFAULT_RADV                   8
 #define BURST_RDTR                     0x20
 #define BURST_RADV                     0x20
+#define PCICFG_DESC_RING_STATUS                0xe4
+#define FLUSH_DESC_REQUIRED            0x100
 
 /* in the case of WTHRESH, it appears at least the 82571/2 hardware
  * writes back 4 descriptors when WTHRESH=5, and 3 descriptors when
index bf72ef809df8c60c46951a2fc937c2a38b422339..1500536a6748213bc27a11f6713eb79ffcbfc2cb 100644 (file)
 #define E1000_FEXTNVM7_DISABLE_PB_READ 0x00040000
 
 #define E1000_FEXTNVM7_DISABLE_SMB_PERST       0x00000020
-#define E1000_FEXTNVM7_NEED_DESCRING_FLUSH     0x00000100
 #define E1000_FEXTNVM11_DISABLE_MULR_FIX       0x00002000
 
 /* bit24: RXDCTL thresholds granularity: 0 - cache lines, 1 - descriptors */
index b2d77a5c25c0dce9c3faacdced2604167b643738..4f029b6d0cf0f23c87ac1a05d132c041264b864b 100644 (file)
@@ -3867,7 +3867,7 @@ static void e1000_flush_rx_ring(struct e1000_adapter *adapter)
 
 static void e1000_flush_desc_rings(struct e1000_adapter *adapter)
 {
-       u32 hang_state;
+       u16 hang_state;
        u32 fext_nvm11, tdlen;
        struct e1000_hw *hw = &adapter->hw;
 
@@ -3877,13 +3877,15 @@ static void e1000_flush_desc_rings(struct e1000_adapter *adapter)
        ew32(FEXTNVM11, fext_nvm11);
        /* do nothing if we're not in faulty state, or if the queue is empty */
        tdlen = er32(TDLEN(0));
-       hang_state = er32(FEXTNVM7);
-       if (!(hang_state & E1000_FEXTNVM7_NEED_DESCRING_FLUSH) || !tdlen)
+       pci_read_config_word(adapter->pdev, PCICFG_DESC_RING_STATUS,
+                            &hang_state);
+       if (!(hang_state & FLUSH_DESC_REQUIRED) || !tdlen)
                return;
        e1000_flush_tx_ring(adapter);
        /* recheck, maybe the fault is caused by the rx ring */
-       hang_state = er32(FEXTNVM7);
-       if (hang_state & E1000_FEXTNVM7_NEED_DESCRING_FLUSH)
+       pci_read_config_word(adapter->pdev, PCICFG_DESC_RING_STATUS,
+                            &hang_state);
+       if (hang_state & FLUSH_DESC_REQUIRED)
                e1000_flush_rx_ring(adapter);
 }