igb: Loopback functionality supports for i350 devices
authorAkeem G. Abodunrin <akeem.g.abodunrin@intel.com>
Thu, 8 Sep 2011 20:39:48 +0000 (20:39 +0000)
committerJeff Kirsher <jeffrey.t.kirsher@intel.com>
Thu, 13 Oct 2011 05:50:21 +0000 (22:50 -0700)
This patch adds VMDq loopback pf support for i350 devices. The patch
is necessary since the register that enabled loopback was moved and
renamed from DTXSWC to TXSWC.

Signed-off-by: "Akeem G. Abodunrin" <akeem.g.abodunrin@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
drivers/net/ethernet/intel/igb/e1000_82575.c
drivers/net/ethernet/intel/igb/e1000_regs.h

index 3771bd2..6580cea 100644 (file)
@@ -1580,14 +1580,31 @@ void igb_vmdq_set_anti_spoofing_pf(struct e1000_hw *hw, bool enable, int pf)
  **/
 void igb_vmdq_set_loopback_pf(struct e1000_hw *hw, bool enable)
 {
-       u32 dtxswc = rd32(E1000_DTXSWC);
+       u32 dtxswc;
+
+       switch (hw->mac.type) {
+       case e1000_82576:
+               dtxswc = rd32(E1000_DTXSWC);
+               if (enable)
+                       dtxswc |= E1000_DTXSWC_VMDQ_LOOPBACK_EN;
+               else
+                       dtxswc &= ~E1000_DTXSWC_VMDQ_LOOPBACK_EN;
+               wr32(E1000_DTXSWC, dtxswc);
+               break;
+       case e1000_i350:
+               dtxswc = rd32(E1000_TXSWC);
+               if (enable)
+                       dtxswc |= E1000_DTXSWC_VMDQ_LOOPBACK_EN;
+               else
+                       dtxswc &= ~E1000_DTXSWC_VMDQ_LOOPBACK_EN;
+               wr32(E1000_TXSWC, dtxswc);
+               break;
+       default:
+               /* Currently no other hardware supports loopback */
+               break;
+       }
 
-       if (enable)
-               dtxswc |= E1000_DTXSWC_VMDQ_LOOPBACK_EN;
-       else
-               dtxswc &= ~E1000_DTXSWC_VMDQ_LOOPBACK_EN;
 
-       wr32(E1000_DTXSWC, dtxswc);
 }
 
 /**
index 0990f6d..0a860bc 100644 (file)
 #define E1000_RPLOLR    0x05AF0 /* Replication Offload - RW */
 #define E1000_UTA       0x0A000 /* Unicast Table Array - RW */
 #define E1000_IOVTCL    0x05BBC /* IOV Control Register */
+#define E1000_TXSWC     0x05ACC /* Tx Switch Control */
 /* These act per VF so an array friendly macro is used */
 #define E1000_P2VMAILBOX(_n)   (0x00C00 + (4 * (_n)))
 #define E1000_VMBMEM(_n)       (0x00800 + (64 * (_n)))