imperfectism / rpms / kernel

Forked from rpms/kernel 4 years ago
Clone
e8384c
From 88f3beae583682a992de2429992256666d70a40a Mon Sep 17 00:00:00 2001
e8384c
From: Miroslav Lichvar <mlichvar@redhat.com>
e8384c
Date: Tue, 23 Oct 2018 14:37:39 +0200
e8384c
Subject: e1000e: allow non-monotonic SYSTIM readings
e8384c
e8384c
[ Upstream commit e1f65b0d70e9e5c80e15105cd96fa00174d7c436 ]
e8384c
e8384c
It seems with some NICs supported by the e1000e driver a SYSTIM reading
e8384c
may occasionally be few microseconds before the previous reading and if
e8384c
enabled also pass e1000e_sanitize_systim() without reaching the maximum
e8384c
number of rereads, even if the function is modified to check three
e8384c
consecutive readings (i.e. it doesn't look like a double read error).
e8384c
This causes an underflow in the timecounter and the PHC time jumps hours
e8384c
ahead.
e8384c
e8384c
This was observed on 82574, I217 and I219. The fastest way to reproduce
e8384c
it is to run a program that continuously calls the PTP_SYS_OFFSET ioctl
e8384c
on the PHC.
e8384c
e8384c
Modify e1000e_phc_gettime() to use timecounter_cyc2time() instead of
e8384c
timecounter_read() in order to allow non-monotonic SYSTIM readings and
e8384c
prevent the PHC from jumping.
e8384c
e8384c
Cc: Richard Cochran <richardcochran@gmail.com>
e8384c
Signed-off-by: Miroslav Lichvar <mlichvar@redhat.com>
e8384c
Acked-by: Jacob Keller <jacob.e.keller@intel.com>
e8384c
Tested-by: Aaron Brown <aaron.f.brown@intel.com>
e8384c
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
e8384c
Signed-off-by: Sasha Levin <sashal@kernel.org>
e8384c
---
e8384c
 drivers/net/ethernet/intel/e1000e/ptp.c | 13 ++++++++++---
e8384c
 1 file changed, 10 insertions(+), 3 deletions(-)
e8384c
e8384c
diff --git a/drivers/net/ethernet/intel/e1000e/ptp.c b/drivers/net/ethernet/intel/e1000e/ptp.c
e8384c
index 37c76945ad9b..e1f821edbc21 100644
e8384c
--- a/drivers/net/ethernet/intel/e1000e/ptp.c
e8384c
+++ b/drivers/net/ethernet/intel/e1000e/ptp.c
e8384c
@@ -173,10 +173,14 @@ static int e1000e_phc_gettime(struct ptp_clock_info *ptp, struct timespec64 *ts)
e8384c
 	struct e1000_adapter *adapter = container_of(ptp, struct e1000_adapter,
e8384c
 						     ptp_clock_info);
e8384c
 	unsigned long flags;
e8384c
-	u64 ns;
e8384c
+	u64 cycles, ns;
e8384c
 
e8384c
 	spin_lock_irqsave(&adapter->systim_lock, flags);
e8384c
-	ns = timecounter_read(&adapter->tc);
e8384c
+
e8384c
+	/* Use timecounter_cyc2time() to allow non-monotonic SYSTIM readings */
e8384c
+	cycles = adapter->cc.read(&adapter->cc);
e8384c
+	ns = timecounter_cyc2time(&adapter->tc, cycles);
e8384c
+
e8384c
 	spin_unlock_irqrestore(&adapter->systim_lock, flags);
e8384c
 
e8384c
 	*ts = ns_to_timespec64(ns);
e8384c
@@ -232,9 +236,12 @@ static void e1000e_systim_overflow_work(struct work_struct *work)
e8384c
 						     systim_overflow_work.work);
e8384c
 	struct e1000_hw *hw = &adapter->hw;
e8384c
 	struct timespec64 ts;
e8384c
+	u64 ns;
e8384c
 
e8384c
-	adapter->ptp_clock_info.gettime64(&adapter->ptp_clock_info, &ts);
e8384c
+	/* Update the timecounter */
e8384c
+	ns = timecounter_read(&adapter->tc);
e8384c
 
e8384c
+	ts = ns_to_timespec64(ns);
e8384c
 	e_dbg("SYSTIM overflow check at %lld.%09lu\n",
e8384c
 	      (long long) ts.tv_sec, ts.tv_nsec);
e8384c
 
e8384c
-- 
e8384c
cgit 1.2-0.3.lf.el7
e8384c
e8384c
From 49dd86f0f5ece4e7addc0f8db5e75a2fb404ede6 Mon Sep 17 00:00:00 2001
e8384c
From: Florian Fainelli <f.fainelli@gmail.com>
e8384c
Date: Thu, 21 Feb 2019 20:09:28 -0800
e8384c
Subject: e1000e: Fix -Wformat-truncation warnings
e8384c
e8384c
[ Upstream commit 135e7245479addc6b1f5d031e3d7e2ddb3d2b109 ]
e8384c
e8384c
Provide precision hints to snprintf() since we know the destination
e8384c
buffer size of the RX/TX ring names are IFNAMSIZ + 5 - 1. This fixes the
e8384c
following warnings:
e8384c
e8384c
drivers/net/ethernet/intel/e1000e/netdev.c: In function
e8384c
'e1000_request_msix':
e8384c
drivers/net/ethernet/intel/e1000e/netdev.c:2109:13: warning: 'snprintf'
e8384c
output may be truncated before the last format character
e8384c
[-Wformat-truncation=]
e8384c
     "%s-rx-0", netdev->name);
e8384c
             ^
e8384c
drivers/net/ethernet/intel/e1000e/netdev.c:2107:3: note: 'snprintf'
e8384c
output between 6 and 21 bytes into a destination of size 20
e8384c
   snprintf(adapter->rx_ring->name,
e8384c
   ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
e8384c
     sizeof(adapter->rx_ring->name) - 1,
e8384c
     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
e8384c
     "%s-rx-0", netdev->name);
e8384c
     ~~~~~~~~~~~~~~~~~~~~~~~~
e8384c
drivers/net/ethernet/intel/e1000e/netdev.c:2125:13: warning: 'snprintf'
e8384c
output may be truncated before the last format character
e8384c
[-Wformat-truncation=]
e8384c
     "%s-tx-0", netdev->name);
e8384c
             ^
e8384c
drivers/net/ethernet/intel/e1000e/netdev.c:2123:3: note: 'snprintf'
e8384c
output between 6 and 21 bytes into a destination of size 20
e8384c
   snprintf(adapter->tx_ring->name,
e8384c
   ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
e8384c
     sizeof(adapter->tx_ring->name) - 1,
e8384c
     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
e8384c
     "%s-tx-0", netdev->name);
e8384c
     ~~~~~~~~~~~~~~~~~~~~~~~~
e8384c
e8384c
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
e8384c
Signed-off-by: David S. Miller <davem@davemloft.net>
e8384c
Signed-off-by: Sasha Levin <sashal@kernel.org>
e8384c
---
e8384c
 drivers/net/ethernet/intel/e1000e/netdev.c | 4 ++--
e8384c
 1 file changed, 2 insertions(+), 2 deletions(-)
e8384c
e8384c
diff --git a/drivers/net/ethernet/intel/e1000e/netdev.c b/drivers/net/ethernet/intel/e1000e/netdev.c
e8384c
index 3ba0c90e7055..e3945469b5c8 100644
e8384c
--- a/drivers/net/ethernet/intel/e1000e/netdev.c
e8384c
+++ b/drivers/net/ethernet/intel/e1000e/netdev.c
e8384c
@@ -2106,7 +2106,7 @@ static int e1000_request_msix(struct e1000_adapter *adapter)
e8384c
 	if (strlen(netdev->name) < (IFNAMSIZ - 5))
e8384c
 		snprintf(adapter->rx_ring->name,
e8384c
 			 sizeof(adapter->rx_ring->name) - 1,
e8384c
-			 "%s-rx-0", netdev->name);
e8384c
+			 "%.14s-rx-0", netdev->name);
e8384c
 	else
e8384c
 		memcpy(adapter->rx_ring->name, netdev->name, IFNAMSIZ);
e8384c
 	err = request_irq(adapter->msix_entries[vector].vector,
e8384c
@@ -2122,7 +2122,7 @@ static int e1000_request_msix(struct e1000_adapter *adapter)
e8384c
 	if (strlen(netdev->name) < (IFNAMSIZ - 5))
e8384c
 		snprintf(adapter->tx_ring->name,
e8384c
 			 sizeof(adapter->tx_ring->name) - 1,
e8384c
-			 "%s-tx-0", netdev->name);
e8384c
+			 "%.14s-tx-0", netdev->name);
e8384c
 	else
e8384c
 		memcpy(adapter->tx_ring->name, netdev->name, IFNAMSIZ);
e8384c
 	err = request_irq(adapter->msix_entries[vector].vector,
e8384c
-- 
e8384c
cgit 1.2-0.3.lf.el7
e8384c
e8384c
From b9f257e27890c462cc07c3e6d4fa7509730ea396 Mon Sep 17 00:00:00 2001
e8384c
From: Kai-Heng Feng <kai.heng.feng@canonical.com>
e8384c
Date: Tue, 11 Dec 2018 15:59:37 +0800
e8384c
Subject: e1000e: Exclude device from suspend direct complete optimization
e8384c
e8384c
[ Upstream commit 59f58708c5047289589cbf6ee95146b76cf57d1e ]
e8384c
e8384c
e1000e sets different WoL settings in system suspend callback and
e8384c
runtime suspend callback.
e8384c
e8384c
The suspend direct complete optimization leaves e1000e in runtime
e8384c
suspended state with wrong WoL setting during system suspend.
e8384c
e8384c
To fix this, we need to disable suspend direct complete optimization to
e8384c
let e1000e always use suspend callback to set correct WoL during system
e8384c
suspend.
e8384c
e8384c
Signed-off-by: Kai-Heng Feng <kai.heng.feng@canonical.com>
e8384c
Tested-by: Aaron Brown <aaron.f.brown@intel.com>
e8384c
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
e8384c
Signed-off-by: Sasha Levin <sashal@kernel.org>
e8384c
---
e8384c
 drivers/net/ethernet/intel/e1000e/netdev.c | 2 ++
e8384c
 1 file changed, 2 insertions(+)
e8384c
e8384c
diff --git a/drivers/net/ethernet/intel/e1000e/netdev.c b/drivers/net/ethernet/intel/e1000e/netdev.c
e8384c
index 23edc1364487..8b11682ebba2 100644
e8384c
--- a/drivers/net/ethernet/intel/e1000e/netdev.c
e8384c
+++ b/drivers/net/ethernet/intel/e1000e/netdev.c
e8384c
@@ -7327,6 +7327,8 @@ static int e1000_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
e8384c
 
e8384c
 	e1000_print_device_info(adapter);
e8384c
 
e8384c
+	dev_pm_set_driver_flags(&pdev->dev, DPM_FLAG_NEVER_SKIP);
e8384c
+
e8384c
 	if (pci_dev_run_wake(pdev))
e8384c
 		pm_runtime_put_noidle(&pdev->dev);
e8384c
 
e8384c
-- 
e8384c
cgit 1.2-0.3.lf.el7
e8384c
e8384c
From 5ec9ba494db252d8a5baaed4fdaf5b4bbbc201dd Mon Sep 17 00:00:00 2001
e8384c
From: Kai-Heng Feng <kai.heng.feng@canonical.com>
e8384c
Date: Sun, 3 Feb 2019 01:40:16 +0800
e8384c
Subject: e1000e: Disable runtime PM on CNP+
e8384c
e8384c
[ Upstream commit 459d69c407f9ba122f12216555c3012284dc9fd7 ]
e8384c
e8384c
There are some new e1000e devices can only be woken up from D3 one time,
e8384c
by plugging Ethernet cable. Subsequent cable plugging does set PME bit
e8384c
correctly, but it still doesn't get woken up.
e8384c
e8384c
Since e1000e connects to the root complex directly, we rely on ACPI to
e8384c
wake it up. In this case, the GPE from _PRW only works once and stops
e8384c
working after that. Though it appears to be a platform bug, e1000e
e8384c
maintainers confirmed that I219 does not support D3.
e8384c
e8384c
So disable runtime PM on CNP+ chips. We may need to disable earlier
e8384c
generations if this bug also hit older platforms.
e8384c
e8384c
Bugzilla: https://bugzilla.kernel.org/attachment.cgi?id=280819
e8384c
Signed-off-by: Kai-Heng Feng <kai.heng.feng@canonical.com>
e8384c
Tested-by: Aaron Brown <aaron.f.brown@intel.com>
e8384c
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
e8384c
Signed-off-by: Sasha Levin <sashal@kernel.org>
e8384c
---
e8384c
 drivers/net/ethernet/intel/e1000e/netdev.c | 2 +-
e8384c
 1 file changed, 1 insertion(+), 1 deletion(-)
e8384c
e8384c
diff --git a/drivers/net/ethernet/intel/e1000e/netdev.c b/drivers/net/ethernet/intel/e1000e/netdev.c
e8384c
index 8b11682ebba2..8cd339c92c1a 100644
e8384c
--- a/drivers/net/ethernet/intel/e1000e/netdev.c
e8384c
+++ b/drivers/net/ethernet/intel/e1000e/netdev.c
e8384c
@@ -7329,7 +7329,7 @@ static int e1000_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
e8384c
 
e8384c
 	dev_pm_set_driver_flags(&pdev->dev, DPM_FLAG_NEVER_SKIP);
e8384c
 
e8384c
-	if (pci_dev_run_wake(pdev))
e8384c
+	if (pci_dev_run_wake(pdev) && hw->mac.type < e1000_pch_cnp)
e8384c
 		pm_runtime_put_noidle(&pdev->dev);
e8384c
 
e8384c
 	return 0;
e8384c
-- 
e8384c
cgit 1.2-0.3.lf.el7
e8384c
e8384c
From 8cff6598b3c03936022dc3998274dba43567cc05 Mon Sep 17 00:00:00 2001
e8384c
From: Konstantin Khlebnikov <khlebnikov@yandex-team.ru>
e8384c
Date: Wed, 17 Apr 2019 11:13:20 +0300
e8384c
Subject: e1000e: start network tx queue only when link is up
e8384c
e8384c
commit d17ba0f616a08f597d9348c372d89b8c0405ccf3 upstream.
e8384c
e8384c
Driver does not want to keep packets in Tx queue when link is lost.
e8384c
But present code only reset NIC to flush them, but does not prevent
e8384c
queuing new packets. Moreover reset sequence itself could generate
e8384c
new packets via netconsole and NIC falls into endless reset loop.
e8384c
e8384c
This patch wakes Tx queue only when NIC is ready to send packets.
e8384c
e8384c
This is proper fix for problem addressed by commit 0f9e980bf5ee
e8384c
("e1000e: fix cyclic resets at link up with active tx").
e8384c
e8384c
Signed-off-by: Konstantin Khlebnikov <khlebnikov@yandex-team.ru>
e8384c
Suggested-by: Alexander Duyck <alexander.duyck@gmail.com>
e8384c
Tested-by: Joseph Yasi <joe.yasi@gmail.com>
e8384c
Tested-by: Aaron Brown <aaron.f.brown@intel.com>
e8384c
Tested-by: Oleksandr Natalenko <oleksandr@redhat.com>
e8384c
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
e8384c
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
e8384c
---
e8384c
 drivers/net/ethernet/intel/e1000e/netdev.c | 6 ++++--
e8384c
 1 file changed, 4 insertions(+), 2 deletions(-)
e8384c
e8384c
diff --git a/drivers/net/ethernet/intel/e1000e/netdev.c b/drivers/net/ethernet/intel/e1000e/netdev.c
e8384c
index 31ef42a031f2..a7b5a47ab83d 100644
e8384c
--- a/drivers/net/ethernet/intel/e1000e/netdev.c
e8384c
+++ b/drivers/net/ethernet/intel/e1000e/netdev.c
e8384c
@@ -4208,7 +4208,7 @@ void e1000e_up(struct e1000_adapter *adapter)
e8384c
 		e1000_configure_msix(adapter);
e8384c
 	e1000_irq_enable(adapter);
e8384c
 
e8384c
-	netif_start_queue(adapter->netdev);
e8384c
+	/* Tx queue started by watchdog timer when link is up */
e8384c
 
e8384c
 	e1000e_trigger_lsc(adapter);
e8384c
 }
e8384c
@@ -4584,6 +4584,7 @@ int e1000e_open(struct net_device *netdev)
e8384c
 	pm_runtime_get_sync(&pdev->dev);
e8384c
 
e8384c
 	netif_carrier_off(netdev);
e8384c
+	netif_stop_queue(netdev);
e8384c
 
e8384c
 	/* allocate transmit descriptors */
e8384c
 	err = e1000e_setup_tx_resources(adapter->tx_ring);
e8384c
@@ -4644,7 +4645,6 @@ int e1000e_open(struct net_device *netdev)
e8384c
 	e1000_irq_enable(adapter);
e8384c
 
e8384c
 	adapter->tx_hang_recheck = false;
e8384c
-	netif_start_queue(netdev);
e8384c
 
e8384c
 	hw->mac.get_link_status = true;
e8384c
 	pm_runtime_put(&pdev->dev);
e8384c
@@ -5266,6 +5266,7 @@ static void e1000_watchdog_task(struct work_struct *work)
e8384c
 			if (phy->ops.cfg_on_link_up)
e8384c
 				phy->ops.cfg_on_link_up(hw);
e8384c
 
e8384c
+			netif_wake_queue(netdev);
e8384c
 			netif_carrier_on(netdev);
e8384c
 
e8384c
 			if (!test_bit(__E1000_DOWN, &adapter->state))
e8384c
@@ -5279,6 +5280,7 @@ static void e1000_watchdog_task(struct work_struct *work)
e8384c
 			/* Link status message must follow this format */
e8384c
 			pr_info("%s NIC Link is Down\n", adapter->netdev->name);
e8384c
 			netif_carrier_off(netdev);
e8384c
+			netif_stop_queue(netdev);
e8384c
 			if (!test_bit(__E1000_DOWN, &adapter->state))
e8384c
 				mod_timer(&adapter->phy_info_timer,
e8384c
 					  round_jiffies(jiffies + 2 * HZ));
e8384c
-- 
e8384c
cgit 1.2-0.3.lf.el7
e8384c