]> git.kernelconcepts.de Git - karo-tx-linux.git/blobdiff - drivers/net/ethernet/intel/e1000e/netdev.c
Merge tag 'hwmon-for-linus-v4.8' of git://git.kernel.org/pub/scm/linux/kernel/git...
[karo-tx-linux.git] / drivers / net / ethernet / intel / e1000e / netdev.c
index 9b4ec13d9161df41410571b2e1ad771f5774ff4e..2b2e2f8c636994219e997bdb53ff8d3379275bb9 100644 (file)
@@ -242,7 +242,7 @@ static void e1000e_dump(struct e1000_adapter *adapter)
                dev_info(&adapter->pdev->dev, "Net device Info\n");
                pr_info("Device Name     state            trans_start      last_rx\n");
                pr_info("%-15s %016lX %016lX %016lX\n", netdev->name,
-                       netdev->state, netdev->trans_start, netdev->last_rx);
+                       netdev->state, dev_trans_start(netdev), netdev->last_rx);
        }
 
        /* Print Registers */
@@ -317,8 +317,8 @@ static void e1000e_dump(struct e1000_adapter *adapter)
                else
                        next_desc = "";
                pr_info("T%c[0x%03X]    %016llX %016llX %016llX %04X  %3X %016llX %p%s\n",
-                       (!(le64_to_cpu(u0->b) & (1 << 29)) ? 'l' :
-                        ((le64_to_cpu(u0->b) & (1 << 20)) ? 'd' : 'c')),
+                       (!(le64_to_cpu(u0->b) & BIT(29)) ? 'l' :
+                        ((le64_to_cpu(u0->b) & BIT(20)) ? 'd' : 'c')),
                        i,
                        (unsigned long long)le64_to_cpu(u0->a),
                        (unsigned long long)le64_to_cpu(u0->b),
@@ -2018,7 +2018,7 @@ static void e1000_configure_msix(struct e1000_adapter *adapter)
        adapter->eiac_mask |= E1000_IMS_OTHER;
 
        /* Cause Tx interrupts on every write back */
-       ivar |= (1 << 31);
+       ivar |= BIT(31);
 
        ew32(IVAR, ivar);
 
@@ -2709,7 +2709,7 @@ static int e1000_vlan_rx_add_vid(struct net_device *netdev,
        if (adapter->flags & FLAG_HAS_HW_VLAN_FILTER) {
                index = (vid >> 5) & 0x7F;
                vfta = E1000_READ_REG_ARRAY(hw, E1000_VFTA, index);
-               vfta |= (1 << (vid & 0x1F));
+               vfta |= BIT((vid & 0x1F));
                hw->mac.ops.write_vfta(hw, index, vfta);
        }
 
@@ -2737,7 +2737,7 @@ static int e1000_vlan_rx_kill_vid(struct net_device *netdev,
        if (adapter->flags & FLAG_HAS_HW_VLAN_FILTER) {
                index = (vid >> 5) & 0x7F;
                vfta = E1000_READ_REG_ARRAY(hw, E1000_VFTA, index);
-               vfta &= ~(1 << (vid & 0x1F));
+               vfta &= ~BIT((vid & 0x1F));
                hw->mac.ops.write_vfta(hw, index, vfta);
        }
 
@@ -2789,7 +2789,7 @@ static void e1000e_vlan_filter_enable(struct e1000_adapter *adapter)
 }
 
 /**
- * e1000e_vlan_strip_enable - helper to disable HW VLAN stripping
+ * e1000e_vlan_strip_disable - helper to disable HW VLAN stripping
  * @adapter: board private structure to initialize
  **/
 static void e1000e_vlan_strip_disable(struct e1000_adapter *adapter)
@@ -2878,7 +2878,7 @@ static void e1000_init_manageability_pt(struct e1000_adapter *adapter)
 
                        /* Enable this decision filter in MANC2H */
                        if (mdef)
-                               manc2h |= (1 << i);
+                               manc2h |= BIT(i);
 
                        j |= mdef;
                }
@@ -2891,7 +2891,7 @@ static void e1000_init_manageability_pt(struct e1000_adapter *adapter)
                        if (er32(MDEF(i)) == 0) {
                                ew32(MDEF(i), (E1000_MDEF_PORT_623 |
                                               E1000_MDEF_PORT_664));
-                               manc2h |= (1 << 1);
+                               manc2h |= BIT(1);
                                j++;
                                break;
                        }
@@ -2971,7 +2971,7 @@ static void e1000_configure_tx(struct e1000_adapter *adapter)
                /* set the speed mode bit, we'll clear it if we're not at
                 * gigabit link later
                 */
-#define SPEED_MODE_BIT (1 << 21)
+#define SPEED_MODE_BIT BIT(21)
                tarc |= SPEED_MODE_BIT;
                ew32(TARC(0), tarc);
        }
@@ -3071,12 +3071,12 @@ static void e1000_setup_rctl(struct e1000_adapter *adapter)
 
                e1e_rphy(hw, PHY_REG(770, 26), &phy_data);
                phy_data &= 0xfff8;
-               phy_data |= (1 << 2);
+               phy_data |= BIT(2);
                e1e_wphy(hw, PHY_REG(770, 26), phy_data);
 
                e1e_rphy(hw, 22, &phy_data);
                phy_data &= 0x0fff;
-               phy_data |= (1 << 14);
+               phy_data |= BIT(14);
                e1e_wphy(hw, 0x10, 0x2823);
                e1e_wphy(hw, 0x11, 0x0003);
                e1e_wphy(hw, 22, phy_data);
@@ -3368,12 +3368,12 @@ static int e1000e_write_uc_addr_list(struct net_device *netdev)
                 * combining
                 */
                netdev_for_each_uc_addr(ha, netdev) {
-                       int rval;
+                       int ret_val;
 
                        if (!rar_entries)
                                break;
-                       rval = hw->mac.ops.rar_set(hw, ha->addr, rar_entries--);
-                       if (rval < 0)
+                       ret_val = hw->mac.ops.rar_set(hw, ha->addr, rar_entries--);
+                       if (ret_val < 0)
                                return -ENOMEM;
                        count++;
                }
@@ -3503,8 +3503,8 @@ s32 e1000e_get_base_timinca(struct e1000_adapter *adapter, u32 *timinca)
            !(er32(TSYNCRXCTL) & E1000_TSYNCRXCTL_ENABLED)) {
                u32 fextnvm7 = er32(FEXTNVM7);
 
-               if (!(fextnvm7 & (1 << 0))) {
-                       ew32(FEXTNVM7, fextnvm7 | (1 << 0));
+               if (!(fextnvm7 & BIT(0))) {
+                       ew32(FEXTNVM7, fextnvm7 | BIT(0));
                        e1e_flush();
                }
        }
@@ -3580,7 +3580,6 @@ static int e1000e_config_hwtstamp(struct e1000_adapter *adapter,
        bool is_l4 = false;
        bool is_l2 = false;
        u32 regval;
-       s32 ret_val;
 
        if (!(adapter->flags & FLAG_HAS_HW_TIMESTAMP))
                return -EINVAL;
@@ -3719,16 +3718,6 @@ static int e1000e_config_hwtstamp(struct e1000_adapter *adapter,
        er32(RXSTMPH);
        er32(TXSTMPH);
 
-       /* Get and set the System Time Register SYSTIM base frequency */
-       ret_val = e1000e_get_base_timinca(adapter, &regval);
-       if (ret_val)
-               return ret_val;
-       ew32(TIMINCA, regval);
-
-       /* reset the ns time counter */
-       timecounter_init(&adapter->tc, &adapter->cc,
-                        ktime_to_ns(ktime_get_real()));
-
        return 0;
 }
 
@@ -3839,7 +3828,7 @@ static void e1000_flush_rx_ring(struct e1000_adapter *adapter)
        /* update thresholds: prefetch threshold to 31, host threshold to 1
         * and make sure the granularity is "descriptors" and not "cache lines"
         */
-       rxdctl |= (0x1F | (1 << 8) | E1000_RXDCTL_THRESH_UNIT_DESC);
+       rxdctl |= (0x1F | BIT(8) | E1000_RXDCTL_THRESH_UNIT_DESC);
 
        ew32(RXDCTL(0), rxdctl);
        /* momentarily enable the RX ring for the changes to take effect */
@@ -3884,6 +3873,53 @@ static void e1000_flush_desc_rings(struct e1000_adapter *adapter)
                e1000_flush_rx_ring(adapter);
 }
 
+/**
+ * e1000e_systim_reset - reset the timesync registers after a hardware reset
+ * @adapter: board private structure
+ *
+ * When the MAC is reset, all hardware bits for timesync will be reset to the
+ * default values. This function will restore the settings last in place.
+ * Since the clock SYSTIME registers are reset, we will simply restore the
+ * cyclecounter to the kernel real clock time.
+ **/
+static void e1000e_systim_reset(struct e1000_adapter *adapter)
+{
+       struct ptp_clock_info *info = &adapter->ptp_clock_info;
+       struct e1000_hw *hw = &adapter->hw;
+       unsigned long flags;
+       u32 timinca;
+       s32 ret_val;
+
+       if (!(adapter->flags & FLAG_HAS_HW_TIMESTAMP))
+               return;
+
+       if (info->adjfreq) {
+               /* restore the previous ptp frequency delta */
+               ret_val = info->adjfreq(info, adapter->ptp_delta);
+       } else {
+               /* set the default base frequency if no adjustment possible */
+               ret_val = e1000e_get_base_timinca(adapter, &timinca);
+               if (!ret_val)
+                       ew32(TIMINCA, timinca);
+       }
+
+       if (ret_val) {
+               dev_warn(&adapter->pdev->dev,
+                        "Failed to restore TIMINCA clock rate delta: %d\n",
+                        ret_val);
+               return;
+       }
+
+       /* reset the systim ns time counter */
+       spin_lock_irqsave(&adapter->systim_lock, flags);
+       timecounter_init(&adapter->tc, &adapter->cc,
+                        ktime_to_ns(ktime_get_real()));
+       spin_unlock_irqrestore(&adapter->systim_lock, flags);
+
+       /* restore the previous hwtstamp configuration settings */
+       e1000e_config_hwtstamp(adapter, &adapter->hwtstamp_config);
+}
+
 /**
  * e1000e_reset - bring the hardware into a known good state
  *
@@ -4063,8 +4099,8 @@ void e1000e_reset(struct e1000_adapter *adapter)
 
        e1000e_reset_adaptive(hw);
 
-       /* initialize systim and reset the ns time counter */
-       e1000e_config_hwtstamp(adapter, &adapter->hwtstamp_config);
+       /* restore systim and hwtstamp settings */
+       e1000e_systim_reset(adapter);
 
        /* Set EEE advertisement as appropriate */
        if (adapter->flags2 & FLAG2_HAS_EEE) {
@@ -4275,7 +4311,7 @@ static cycle_t e1000e_cyclecounter_read(const struct cyclecounter *cc)
        struct e1000_adapter *adapter = container_of(cc, struct e1000_adapter,
                                                     cc);
        struct e1000_hw *hw = &adapter->hw;
-       u32 systimel_1, systimel_2, systimeh;
+       u32 systimel, systimeh;
        cycle_t systim, systim_next;
        /* SYSTIMH latching upon SYSTIML read does not work well.
         * This means that if SYSTIML overflows after we read it but before
@@ -4283,24 +4319,25 @@ static cycle_t e1000e_cyclecounter_read(const struct cyclecounter *cc)
         * will experience a huge non linear increment in the systime value
         * to fix that we test for overflow and if true, we re-read systime.
         */
-       systimel_1 = er32(SYSTIML);
+       systimel = er32(SYSTIML);
        systimeh = er32(SYSTIMH);
-       systimel_2 = er32(SYSTIML);
-       /* Check for overflow. If there was no overflow, use the values */
-       if (systimel_1 < systimel_2) {
-               systim = (cycle_t)systimel_1;
-               systim |= (cycle_t)systimeh << 32;
-       } else {
-               /* There was an overflow, read again SYSTIMH, and use
-                * systimel_2
-                */
-               systimeh = er32(SYSTIMH);
-               systim = (cycle_t)systimel_2;
-               systim |= (cycle_t)systimeh << 32;
+       /* Is systimel is so large that overflow is possible? */
+       if (systimel >= (u32)0xffffffff - E1000_TIMINCA_INCVALUE_MASK) {
+               u32 systimel_2 = er32(SYSTIML);
+               if (systimel > systimel_2) {
+                       /* There was an overflow, read again SYSTIMH, and use
+                        * systimel_2
+                        */
+                       systimeh = er32(SYSTIMH);
+                       systimel = systimel_2;
+               }
        }
+       systim = (cycle_t)systimel;
+       systim |= (cycle_t)systimeh << 32;
 
        if ((hw->mac.type == e1000_82574) || (hw->mac.type == e1000_82583)) {
-               u64 incvalue, time_delta, rem, temp;
+               u64 time_delta, rem, temp;
+               u32 incvalue;
                int i;
 
                /* errata for 82574/82583 possible bad bits read from SYSTIMH/L
@@ -4495,7 +4532,7 @@ static int e1000_test_msi(struct e1000_adapter *adapter)
 }
 
 /**
- * e1000_open - Called when a network interface is made active
+ * e1000e_open - Called when a network interface is made active
  * @netdev: network interface device structure
  *
  * Returns 0 on success, negative value on failure
@@ -4506,7 +4543,7 @@ static int e1000_test_msi(struct e1000_adapter *adapter)
  * handler is registered with the OS, the watchdog timer is started,
  * and the stack is notified that the interface is ready.
  **/
-static int e1000_open(struct net_device *netdev)
+int e1000e_open(struct net_device *netdev)
 {
        struct e1000_adapter *adapter = netdev_priv(netdev);
        struct e1000_hw *hw = &adapter->hw;
@@ -4604,7 +4641,7 @@ err_setup_tx:
 }
 
 /**
- * e1000_close - Disables a network interface
+ * e1000e_close - Disables a network interface
  * @netdev: network interface device structure
  *
  * Returns 0, this is not allowed to fail
@@ -4614,7 +4651,7 @@ err_setup_tx:
  * needs to be disabled.  A global MAC reset is issued to stop the
  * hardware, and all transmit and receive resources are freed.
  **/
-static int e1000_close(struct net_device *netdev)
+int e1000e_close(struct net_device *netdev)
 {
        struct e1000_adapter *adapter = netdev_priv(netdev);
        struct pci_dev *pdev = adapter->pdev;
@@ -6861,7 +6898,7 @@ static void e1000_eeprom_checks(struct e1000_adapter *adapter)
 
        ret_val = e1000_read_nvm(hw, NVM_INIT_CONTROL2_REG, 1, &buf);
        le16_to_cpus(&buf);
-       if (!ret_val && (!(buf & (1 << 0)))) {
+       if (!ret_val && (!(buf & BIT(0)))) {
                /* Deep Smart Power Down (DSPD) */
                dev_warn(&adapter->pdev->dev,
                         "Warning: detected DSPD enabled in EEPROM\n");
@@ -6878,6 +6915,14 @@ static netdev_features_t e1000_fix_features(struct net_device *netdev,
        if ((hw->mac.type >= e1000_pch2lan) && (netdev->mtu > ETH_DATA_LEN))
                features &= ~NETIF_F_RXFCS;
 
+       /* Since there is no support for separate Rx/Tx vlan accel
+        * enable/disable make sure Tx flag is always in same state as Rx.
+        */
+       if (features & NETIF_F_HW_VLAN_CTAG_RX)
+               features |= NETIF_F_HW_VLAN_CTAG_TX;
+       else
+               features &= ~NETIF_F_HW_VLAN_CTAG_TX;
+
        return features;
 }
 
@@ -6920,8 +6965,8 @@ static int e1000_set_features(struct net_device *netdev,
 }
 
 static const struct net_device_ops e1000e_netdev_ops = {
-       .ndo_open               = e1000_open,
-       .ndo_stop               = e1000_close,
+       .ndo_open               = e1000e_open,
+       .ndo_stop               = e1000e_close,
        .ndo_start_xmit         = e1000_xmit_frame,
        .ndo_get_stats64        = e1000e_get_stats64,
        .ndo_set_rx_mode        = e1000e_set_rx_mode,
@@ -6965,7 +7010,7 @@ static int e1000_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
        int bars, i, err, pci_using_dac;
        u16 eeprom_data = 0;
        u16 eeprom_apme_mask = E1000_EEPROM_APME;
-       s32 rval = 0;
+       s32 ret_val = 0;
 
        if (ei->flags2 & FLAG2_DISABLE_ASPM_L0S)
                aspm_disable_flag = PCIE_LINK_STATE_L0S;
@@ -7200,18 +7245,18 @@ static int e1000_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
        } else if (adapter->flags & FLAG_APME_IN_CTRL3) {
                if (adapter->flags & FLAG_APME_CHECK_PORT_B &&
                    (adapter->hw.bus.func == 1))
-                       rval = e1000_read_nvm(&adapter->hw,
+                       ret_val = e1000_read_nvm(&adapter->hw,
                                              NVM_INIT_CONTROL3_PORT_B,
                                              1, &eeprom_data);
                else
-                       rval = e1000_read_nvm(&adapter->hw,
+                       ret_val = e1000_read_nvm(&adapter->hw,
                                              NVM_INIT_CONTROL3_PORT_A,
                                              1, &eeprom_data);
        }
 
        /* fetch WoL from EEPROM */
-       if (rval)
-               e_dbg("NVM read error getting WoL initial values: %d\n", rval);
+       if (ret_val)
+               e_dbg("NVM read error getting WoL initial values: %d\n", ret_val);
        else if (eeprom_data & eeprom_apme_mask)
                adapter->eeprom_wol |= E1000_WUFC_MAG;
 
@@ -7231,13 +7276,16 @@ static int e1000_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
                device_wakeup_enable(&pdev->dev);
 
        /* save off EEPROM version number */
-       rval = e1000_read_nvm(&adapter->hw, 5, 1, &adapter->eeprom_vers);
+       ret_val = e1000_read_nvm(&adapter->hw, 5, 1, &adapter->eeprom_vers);
 
-       if (rval) {
-               e_dbg("NVM read error getting EEPROM version: %d\n", rval);
+       if (ret_val) {
+               e_dbg("NVM read error getting EEPROM version: %d\n", ret_val);
                adapter->eeprom_vers = 0;
        }
 
+       /* init PTP hardware clock */
+       e1000e_ptp_init(adapter);
+
        /* reset the hardware with the new settings */
        e1000e_reset(adapter);
 
@@ -7256,9 +7304,6 @@ static int e1000_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
        /* carrier off reporting is important to ethtool even BEFORE open */
        netif_carrier_off(netdev);
 
-       /* init PTP hardware clock */
-       e1000e_ptp_init(adapter);
-
        e1000_print_device_info(adapter);
 
        if (pci_dev_run_wake(pdev))