Intel Wired LAN drivers: Use static const
[pandora-kernel.git] / drivers / net / ixgbe / ixgbe_ethtool.c
index b884f90..90a740d 100644 (file)
@@ -431,15 +431,21 @@ static u32 ixgbe_get_tx_csum(struct net_device *netdev)
 static int ixgbe_set_tx_csum(struct net_device *netdev, u32 data)
 {
        struct ixgbe_adapter *adapter = netdev_priv(netdev);
+       u32 feature_list;
 
-       if (data) {
-               netdev->features |= NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM;
-               if (adapter->hw.mac.type == ixgbe_mac_82599EB)
-                       netdev->features |= NETIF_F_SCTP_CSUM;
-       } else {
-               netdev->features &= ~(NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM |
-                                     NETIF_F_SCTP_CSUM);
+       feature_list = (NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM);
+       switch (adapter->hw.mac.type) {
+       case ixgbe_mac_82599EB:
+       case ixgbe_mac_X540:
+               feature_list |= NETIF_F_SCTP_CSUM;
+               break;
+       default:
+               break;
        }
+       if (data)
+               netdev->features |= feature_list;
+       else
+               netdev->features &= ~feature_list;
 
        return 0;
 }
@@ -1151,7 +1157,7 @@ struct ixgbe_reg_test {
 #define TABLE64_TEST_HI        6
 
 /* default 82599 register test */
-static struct ixgbe_reg_test reg_test_82599[] = {
+static const struct ixgbe_reg_test reg_test_82599[] = {
        { IXGBE_FCRTL_82599(0), 1, PATTERN_TEST, 0x8007FFF0, 0x8007FFF0 },
        { IXGBE_FCRTH_82599(0), 1, PATTERN_TEST, 0x8007FFF0, 0x8007FFF0 },
        { IXGBE_PFCTOP, 1, PATTERN_TEST, 0xFFFFFFFF, 0xFFFFFFFF },
@@ -1175,7 +1181,7 @@ static struct ixgbe_reg_test reg_test_82599[] = {
 };
 
 /* default 82598 register test */
-static struct ixgbe_reg_test reg_test_82598[] = {
+static const struct ixgbe_reg_test reg_test_82598[] = {
        { IXGBE_FCRTL(0), 1, PATTERN_TEST, 0x8007FFF0, 0x8007FFF0 },
        { IXGBE_FCRTH(0), 1, PATTERN_TEST, 0x8007FFF0, 0x8007FFF0 },
        { IXGBE_PFCTOP, 1, PATTERN_TEST, 0xFFFFFFFF, 0xFFFFFFFF },
@@ -1202,18 +1208,22 @@ static struct ixgbe_reg_test reg_test_82598[] = {
        { 0, 0, 0, 0 }
 };
 
+static const u32 register_test_patterns[] = {
+       0x5A5A5A5A, 0xA5A5A5A5, 0x00000000, 0xFFFFFFFF
+};
+
 #define REG_PATTERN_TEST(R, M, W)                                             \
 {                                                                             \
        u32 pat, val, before;                                                 \
-       const u32 _test[] = {0x5A5A5A5A, 0xA5A5A5A5, 0x00000000, 0xFFFFFFFF}; \
-       for (pat = 0; pat < ARRAY_SIZE(_test); pat++) {                       \
+       for (pat = 0; pat < ARRAY_SIZE(register_test_patterns); pat++) {      \
                before = readl(adapter->hw.hw_addr + R);                      \
-               writel((_test[pat] & W), (adapter->hw.hw_addr + R));          \
+               writel((register_test_patterns[pat] & W),                     \
+                      (adapter->hw.hw_addr + R));                            \
                val = readl(adapter->hw.hw_addr + R);                         \
-               if (val != (_test[pat] & W & M)) {                            \
-                       e_err(drv, "pattern test reg %04X failed: got "   \
-                             "0x%08X expected 0x%08X\n",                     \
-                             R, val, (_test[pat] & W & M));                \
+               if (val != (register_test_patterns[pat] & W & M)) {           \
+                       e_err(drv, "pattern test reg %04X failed: got "       \
+                             "0x%08X expected 0x%08X\n",                     \
+                             R, val, (register_test_patterns[pat] & W & M)); \
                        *data = R;                                            \
                        writel(before, adapter->hw.hw_addr + R);              \
                        return 1;                                             \
@@ -1240,7 +1250,7 @@ static struct ixgbe_reg_test reg_test_82598[] = {
 
 static int ixgbe_reg_test(struct ixgbe_adapter *adapter, u64 *data)
 {
-       struct ixgbe_reg_test *test;
+       const struct ixgbe_reg_test *test;
        u32 value, before, after;
        u32 i, toggle;
 
@@ -1250,6 +1260,7 @@ static int ixgbe_reg_test(struct ixgbe_adapter *adapter, u64 *data)
                test = reg_test_82598;
                break;
        case ixgbe_mac_82599EB:
+       case ixgbe_mac_X540:
                toggle = 0x7FFFF30F;
                test = reg_test_82599;
                break;
@@ -1476,6 +1487,7 @@ static void ixgbe_free_desc_rings(struct ixgbe_adapter *adapter)
 
        switch (hw->mac.type) {
        case ixgbe_mac_82599EB:
+       case ixgbe_mac_X540:
                reg_ctl = IXGBE_READ_REG(hw, IXGBE_DMATXCTL);
                reg_ctl &= ~IXGBE_DMATXCTL_TE;
                IXGBE_WRITE_REG(hw, IXGBE_DMATXCTL, reg_ctl);
@@ -1512,6 +1524,7 @@ static int ixgbe_setup_desc_rings(struct ixgbe_adapter *adapter)
 
        switch (adapter->hw.mac.type) {
        case ixgbe_mac_82599EB:
+       case ixgbe_mac_X540:
                reg_data = IXGBE_READ_REG(&adapter->hw, IXGBE_DMATXCTL);
                reg_data |= IXGBE_DMATXCTL_TE;
                IXGBE_WRITE_REG(&adapter->hw, IXGBE_DMATXCTL, reg_data);
@@ -1870,7 +1883,16 @@ static int ixgbe_wol_exclusion(struct ixgbe_adapter *adapter,
        struct ixgbe_hw *hw = &adapter->hw;
        int retval = 1;
 
+       /* WOL not supported except for the following */
        switch(hw->device_id) {
+       case IXGBE_DEV_ID_82599_SFP:
+               /* Only this subdevice supports WOL */
+               if (hw->subsystem_device_id != IXGBE_SUBDEV_ID_82599_SFP) {
+                       wol->supported = 0;
+                       break;
+               }
+               retval = 0;
+               break;
        case IXGBE_DEV_ID_82599_COMBO_BACKPLANE:
                /* All except this subdevice support WOL */
                if (hw->subsystem_device_id ==
@@ -1878,6 +1900,8 @@ static int ixgbe_wol_exclusion(struct ixgbe_adapter *adapter,
                        wol->supported = 0;
                        break;
                }
+               retval = 0;
+               break;
        case IXGBE_DEV_ID_82599_KX4:
                retval = 0;
                break;
@@ -2198,6 +2222,22 @@ static int ixgbe_set_flags(struct net_device *netdev, u32 data)
                        case ixgbe_mac_82599EB:
                                need_reset = true;
                                break;
+                       case ixgbe_mac_X540: {
+                               int i;
+                               for (i = 0; i < adapter->num_rx_queues; i++) {
+                                       struct ixgbe_ring *ring =
+                                                         adapter->rx_ring[i];
+                                       if (adapter->flags2 &
+                                           IXGBE_FLAG2_RSC_ENABLED) {
+                                               ixgbe_configure_rscctl(adapter,
+                                                                      ring);
+                                       } else {
+                                               ixgbe_clear_rscctl(adapter,
+                                                                  ring);
+                                       }
+                               }
+                       }
+                               break;
                        default:
                                break;
                        }