mirror of
https://github.com/LibreELEC/LibreELEC.tv.git
synced 2025-07-30 22:26:42 +00:00
Merge pull request #2937 from MilhouseVH/linux4190-generic
linux (Generic): update to linux-4.19
This commit is contained in:
commit
e167e63dc9
@ -3,8 +3,8 @@
|
||||
# Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv)
|
||||
|
||||
PKG_NAME="RTL8188EU"
|
||||
PKG_VERSION="277e396"
|
||||
PKG_SHA256="5a3582ddd259b072d47956070f1df2985045c4005db3871fc152e43bc0f579e8"
|
||||
PKG_VERSION="4b0ecca485b9f11f58670b69aa9f90ecad7da02f"
|
||||
PKG_SHA256="cc872aa0991c044d35abfcc81543bad950c6aae487e37d5a09d1cbf8c4cb3058"
|
||||
PKG_LICENSE="GPL"
|
||||
# realtek: PKG_SITE="http://www.realtek.com.tw/downloads/downloadsView.aspx?Langid=1&PFid=48&Level=5&Conn=4&ProdID=274&DownTypeID=3&GetDown=false&Downloads=true"
|
||||
PKG_SITE="https://github.com/lwfinger/rtl8188eu"
|
||||
|
@ -3,8 +3,8 @@
|
||||
# Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv)
|
||||
|
||||
PKG_NAME="RTL8192CU"
|
||||
PKG_VERSION="756f2ec"
|
||||
PKG_SHA256="83e0858914dfe1455df9fd824ade8776746b8730143ae3946f7b7f9556fd9365"
|
||||
PKG_VERSION="26360110f3a80d91dd0707da096317152b0f379e"
|
||||
PKG_SHA256="eff13b2d8605d1c981f77b15b44142d40bf70a8bf9cf6cd79b8a8204e3987426"
|
||||
PKG_LICENSE="GPL"
|
||||
PKG_SITE="https://github.com/pvaret/rtl8192cu-fixes"
|
||||
PKG_URL="$PKG_SITE/archive/$PKG_VERSION.tar.gz"
|
||||
|
@ -3,8 +3,8 @@
|
||||
# Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv)
|
||||
|
||||
PKG_NAME="RTL8192DU"
|
||||
PKG_VERSION="a9deaec"
|
||||
PKG_SHA256="af71aa79c0382f056f2c7091b45a3c2d79b9c2848eb6bb1ffed22b6f0a63cbfd"
|
||||
PKG_VERSION="31a276df70c7cdbb534cf29de31cfc2d59c71eb8"
|
||||
PKG_SHA256="9dd97f3fbfc31714d8b2cba4966051371f9c0515cff78da13d6e2c98506ac888"
|
||||
PKG_LICENSE="GPL"
|
||||
PKG_SITE="https://github.com/lwfinger/rtl8192du"
|
||||
PKG_URL="https://github.com/lwfinger/rtl8192du/archive/$PKG_VERSION.tar.gz"
|
||||
|
@ -3,8 +3,8 @@
|
||||
# Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv)
|
||||
|
||||
PKG_NAME="RTL8192EU"
|
||||
PKG_VERSION="77bb7c3"
|
||||
PKG_SHA256="9cb7e5382edeb4b6323fae40aecfa041aa4ef80233ffaebf2be99fc7900b6a7f"
|
||||
PKG_VERSION="dcd752459cc93ee89e52331b26c93eb8209dc00b"
|
||||
PKG_SHA256="a8da10546ab7d1faabdc71fcd7793ab979a1b2a8d46854945b5956280aa7c698"
|
||||
PKG_LICENSE="GPL"
|
||||
PKG_SITE="https://github.com/Mange/rtl8192eu-linux-driver"
|
||||
PKG_URL="https://github.com/Mange/rtl8192eu-linux-driver/archive/$PKG_VERSION.tar.gz"
|
||||
|
@ -3,8 +3,8 @@
|
||||
# Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv)
|
||||
|
||||
PKG_NAME="RTL8812AU"
|
||||
PKG_VERSION="ff2f1dd"
|
||||
PKG_SHA256="79419ab37482b7098d9aa995c9be8e3f2f9bccfae20d0b0ccfefe0da9a03d144"
|
||||
PKG_VERSION="61d0cd95afc01eae64da0c446515803910de1a00"
|
||||
PKG_SHA256="8d36737540b1a47e56174ced61194f3b596999609ce8c18ac466dbd42b48bc0b"
|
||||
PKG_LICENSE="GPL"
|
||||
PKG_SITE="https://github.com/paspro/rtl8812au"
|
||||
PKG_URL="https://github.com/paspro/rtl8812au/archive/$PKG_VERSION.tar.gz"
|
||||
|
@ -3,8 +3,8 @@
|
||||
# Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv)
|
||||
|
||||
PKG_NAME="iwlwifi-firmware"
|
||||
PKG_VERSION="e8e1c45"
|
||||
PKG_SHA256="54409b92dc7a7edf4a0be6919c09f07c018d87d9fe0ea1335dc18bc152061b8e"
|
||||
PKG_VERSION="bc32183c521559114eb72c0677b850269772addb"
|
||||
PKG_SHA256="deaaac826b7d68d46936b327994312a298f81c446ac5b72dbeee2cbd4cf1b719"
|
||||
PKG_LICENSE="Free-to-use"
|
||||
PKG_SITE="https://github.com/LibreELEC/iwlwifi-firmware"
|
||||
PKG_URL="https://github.com/LibreELEC/iwlwifi-firmware/archive/$PKG_VERSION.tar.gz"
|
||||
|
@ -2,8 +2,8 @@
|
||||
# Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv)
|
||||
|
||||
PKG_NAME="kernel-firmware"
|
||||
PKG_VERSION="fea76a04f25fd0a217c0d566ff5ff8f23ad3e648"
|
||||
PKG_SHA256="952acdc725fb510eb55927f1b1581bac6e4967bedb82716800b4378711e92dbd"
|
||||
PKG_VERSION="1cb4e51018293c14642f115b5868cda92b879161"
|
||||
PKG_SHA256="8f726c1e64379fb0ef3744fe197ce00ec609aaa67e9cdbf6629b587898da8f0f"
|
||||
PKG_LICENSE="other"
|
||||
PKG_SITE="https://git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmware.git/"
|
||||
PKG_URL="https://git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmware.git/snapshot/$PKG_VERSION.tar.gz"
|
||||
|
@ -44,8 +44,8 @@ case "$LINUX" in
|
||||
PKG_SOURCE_NAME="linux-$LINUX-$PKG_VERSION.tar.gz"
|
||||
;;
|
||||
*)
|
||||
PKG_VERSION="4.18.16"
|
||||
PKG_SHA256="beba14e2f07259a545baa1dce5afdaf9f470cdadc8b378ac269e7c8a289c52e6"
|
||||
PKG_VERSION="4.19"
|
||||
PKG_SHA256="0c68f5655528aed4f99dae71a5b259edc93239fa899e2df79c055275c21749a1"
|
||||
PKG_URL="https://www.kernel.org/pub/linux/kernel/v4.x/$PKG_NAME-$PKG_VERSION.tar.xz"
|
||||
PKG_PATCH_DIRS="default"
|
||||
;;
|
||||
|
@ -1,277 +0,0 @@
|
||||
From patchwork Thu Jul 12 08:02:24 2018
|
||||
Content-Type: text/plain; charset="utf-8"
|
||||
MIME-Version: 1.0
|
||||
Content-Transfer-Encoding: 7bit
|
||||
Subject: [v4] drm/i915: Interactive RPS mode
|
||||
From: Chris Wilson <chris@chris-wilson.co.uk>
|
||||
X-Patchwork-Id: 10521163
|
||||
Message-Id: <20180712080224.29831-1-chris@chris-wilson.co.uk>
|
||||
To: intel-gfx@lists.freedesktop.org
|
||||
Date: Thu, 12 Jul 2018 09:02:24 +0100
|
||||
|
||||
RPS provides a feedback loop where we use the load during the previous
|
||||
evaluation interval to decide whether to up or down clock the GPU
|
||||
frequency. Our responsiveness is split into 3 regimes, a high and low
|
||||
plateau with the intent to keep the gpu clocked high to cover occasional
|
||||
stalls under high load, and low despite occasional glitches under steady
|
||||
low load, and inbetween. However, we run into situations like kodi where
|
||||
we want to stay at low power (video decoding is done efficiently
|
||||
inside the fixed function HW and doesn't need high clocks even for high
|
||||
bitrate streams), but just occasionally the pipeline is more complex
|
||||
than a video decode and we need a smidgen of extra GPU power to present
|
||||
on time. In the high power regime, we sample at sub frame intervals with
|
||||
a bias to upclocking, and conversely at low power we sample over a few
|
||||
frames worth to provide what we consider to be the right levels of
|
||||
responsiveness respectively. At low power, we more or less expect to be
|
||||
kicked out to high power at the start of a busy sequence by waitboosting.
|
||||
|
||||
Prior to commit e9af4ea2b9e7 ("drm/i915: Avoid waitboosting on the active
|
||||
request") whenever we missed the frame or stalled, we would immediate go
|
||||
full throttle and upclock the GPU to max. But in commit e9af4ea2b9e7, we
|
||||
relaxed the waitboosting to only apply if the pipeline was deep to avoid
|
||||
over-committing resources for a near miss. Sadly though, a near miss is
|
||||
still a miss, and perceptible as jitter in the frame delivery.
|
||||
|
||||
To try and prevent the near miss before having to resort to boosting
|
||||
after the fact, we use the pageflip queue as an indication that we are
|
||||
in an "interactive" regime and so should sample the load more frequently
|
||||
to provide power before the frame misses it vblank. This will make us
|
||||
more favorable to providing a small power increase (one or two bins) as
|
||||
required rather than going all the way to maximum and then having to
|
||||
work back down again. (We still keep the waitboosting mechanism around
|
||||
just in case a dramatic change in system load requires urgent uplocking,
|
||||
faster than we can provide in a few evaluation intervals.)
|
||||
|
||||
v2: Reduce rps_set_interactive to a boolean parameter to avoid the
|
||||
confusion of what if they wanted a new power mode after pinning to a
|
||||
different mode (which to choose?)
|
||||
v3: Only reprogram RPS while the GT is awake, it will be set when we
|
||||
wake the GT, and while off warns about being used outside of rpm.
|
||||
v4: Fix deferred application of interactive mode
|
||||
|
||||
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=107111
|
||||
Fixes: e9af4ea2b9e7 ("drm/i915: Avoid waitboosting on the active request")
|
||||
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
|
||||
Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
|
||||
Cc: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
|
||||
Cc: Radoslaw Szwichtenberg <radoslaw.szwichtenberg@intel.com>
|
||||
---
|
||||
drivers/gpu/drm/i915/i915_debugfs.c | 1 +
|
||||
drivers/gpu/drm/i915/i915_drv.h | 4 ++
|
||||
drivers/gpu/drm/i915/intel_display.c | 20 ++++++
|
||||
drivers/gpu/drm/i915/intel_drv.h | 2 +
|
||||
drivers/gpu/drm/i915/intel_pm.c | 91 +++++++++++++++++++---------
|
||||
5 files changed, 89 insertions(+), 29 deletions(-)
|
||||
|
||||
diff --git a/drivers/gpu/drm/i915/i915_debugfs.c b/drivers/gpu/drm/i915/i915_debugfs.c
|
||||
index 099f97ef2303..ac019bb927d0 100644
|
||||
--- a/drivers/gpu/drm/i915/i915_debugfs.c
|
||||
+++ b/drivers/gpu/drm/i915/i915_debugfs.c
|
||||
@@ -2218,6 +2218,7 @@ static int i915_rps_boost_info(struct seq_file *m, void *data)
|
||||
seq_printf(m, "CPU waiting? %d\n", count_irq_waiters(dev_priv));
|
||||
seq_printf(m, "Boosts outstanding? %d\n",
|
||||
atomic_read(&rps->num_waiters));
|
||||
+ seq_printf(m, "Interactive? %d\n", READ_ONCE(rps->interactive));
|
||||
seq_printf(m, "Frequency requested %d\n",
|
||||
intel_gpu_freq(dev_priv, rps->cur_freq));
|
||||
seq_printf(m, " min hard:%d, soft:%d; max soft:%d, hard:%d\n",
|
||||
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
|
||||
index 01dd29837233..f02fbeee553f 100644
|
||||
--- a/drivers/gpu/drm/i915/i915_drv.h
|
||||
+++ b/drivers/gpu/drm/i915/i915_drv.h
|
||||
@@ -784,6 +784,8 @@ struct intel_rps {
|
||||
|
||||
int last_adj;
|
||||
enum { LOW_POWER, BETWEEN, HIGH_POWER } power;
|
||||
+ unsigned int interactive;
|
||||
+ struct mutex power_lock;
|
||||
|
||||
bool enabled;
|
||||
atomic_t num_waiters;
|
||||
@@ -3429,6 +3431,8 @@ extern void i915_redisable_vga_power_on(struct drm_i915_private *dev_priv);
|
||||
extern bool ironlake_set_drps(struct drm_i915_private *dev_priv, u8 val);
|
||||
extern void intel_init_pch_refclk(struct drm_i915_private *dev_priv);
|
||||
extern int intel_set_rps(struct drm_i915_private *dev_priv, u8 val);
|
||||
+extern void intel_rps_set_interactive(struct drm_i915_private *dev_priv,
|
||||
+ bool state);
|
||||
extern bool intel_set_memory_cxsr(struct drm_i915_private *dev_priv,
|
||||
bool enable);
|
||||
|
||||
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
|
||||
index 7998e70a3174..5809366ff9f0 100644
|
||||
--- a/drivers/gpu/drm/i915/intel_display.c
|
||||
+++ b/drivers/gpu/drm/i915/intel_display.c
|
||||
@@ -13104,6 +13104,19 @@ intel_prepare_plane_fb(struct drm_plane *plane,
|
||||
add_rps_boost_after_vblank(new_state->crtc, new_state->fence);
|
||||
}
|
||||
|
||||
+ /*
|
||||
+ * We declare pageflips to be interactive and so merit a small bias
|
||||
+ * towards upclocking to deliver the frame on time. By only changing
|
||||
+ * the RPS thresholds to sample more regularly and aim for higher
|
||||
+ * clocks we can hopefully deliver low power workloads (like kodi)
|
||||
+ * that are not quite steady state without resorting to forcing
|
||||
+ * maximum clocks following a vblank miss (see do_rps_boost()).
|
||||
+ */
|
||||
+ if (!intel_state->rps_interactive) {
|
||||
+ intel_rps_set_interactive(dev_priv, true);
|
||||
+ intel_state->rps_interactive = true;
|
||||
+ }
|
||||
+
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -13120,8 +13133,15 @@ void
|
||||
intel_cleanup_plane_fb(struct drm_plane *plane,
|
||||
struct drm_plane_state *old_state)
|
||||
{
|
||||
+ struct intel_atomic_state *intel_state =
|
||||
+ to_intel_atomic_state(old_state->state);
|
||||
struct drm_i915_private *dev_priv = to_i915(plane->dev);
|
||||
|
||||
+ if (intel_state->rps_interactive) {
|
||||
+ intel_rps_set_interactive(dev_priv, false);
|
||||
+ intel_state->rps_interactive = false;
|
||||
+ }
|
||||
+
|
||||
/* Should only be called after a successful intel_prepare_plane_fb()! */
|
||||
mutex_lock(&dev_priv->drm.struct_mutex);
|
||||
intel_plane_unpin_fb(to_intel_plane_state(old_state));
|
||||
diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
|
||||
index 61e715ddd0d5..544812488821 100644
|
||||
--- a/drivers/gpu/drm/i915/intel_drv.h
|
||||
+++ b/drivers/gpu/drm/i915/intel_drv.h
|
||||
@@ -482,6 +482,8 @@ struct intel_atomic_state {
|
||||
*/
|
||||
bool skip_intermediate_wm;
|
||||
|
||||
+ bool rps_interactive;
|
||||
+
|
||||
/* Gen9+ only */
|
||||
struct skl_ddb_values wm_results;
|
||||
|
||||
diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c
|
||||
index 53aaaa3e6886..01475bf3196a 100644
|
||||
--- a/drivers/gpu/drm/i915/intel_pm.c
|
||||
+++ b/drivers/gpu/drm/i915/intel_pm.c
|
||||
@@ -6264,41 +6264,14 @@ static u32 intel_rps_limits(struct drm_i915_private *dev_priv, u8 val)
|
||||
return limits;
|
||||
}
|
||||
|
||||
-static void gen6_set_rps_thresholds(struct drm_i915_private *dev_priv, u8 val)
|
||||
+static void rps_set_power(struct drm_i915_private *dev_priv, int new_power)
|
||||
{
|
||||
struct intel_rps *rps = &dev_priv->gt_pm.rps;
|
||||
- int new_power;
|
||||
u32 threshold_up = 0, threshold_down = 0; /* in % */
|
||||
u32 ei_up = 0, ei_down = 0;
|
||||
|
||||
- new_power = rps->power;
|
||||
- switch (rps->power) {
|
||||
- case LOW_POWER:
|
||||
- if (val > rps->efficient_freq + 1 &&
|
||||
- val > rps->cur_freq)
|
||||
- new_power = BETWEEN;
|
||||
- break;
|
||||
+ lockdep_assert_held(&rps->power_lock);
|
||||
|
||||
- case BETWEEN:
|
||||
- if (val <= rps->efficient_freq &&
|
||||
- val < rps->cur_freq)
|
||||
- new_power = LOW_POWER;
|
||||
- else if (val >= rps->rp0_freq &&
|
||||
- val > rps->cur_freq)
|
||||
- new_power = HIGH_POWER;
|
||||
- break;
|
||||
-
|
||||
- case HIGH_POWER:
|
||||
- if (val < (rps->rp1_freq + rps->rp0_freq) >> 1 &&
|
||||
- val < rps->cur_freq)
|
||||
- new_power = BETWEEN;
|
||||
- break;
|
||||
- }
|
||||
- /* Max/min bins are special */
|
||||
- if (val <= rps->min_freq_softlimit)
|
||||
- new_power = LOW_POWER;
|
||||
- if (val >= rps->max_freq_softlimit)
|
||||
- new_power = HIGH_POWER;
|
||||
if (new_power == rps->power)
|
||||
return;
|
||||
|
||||
@@ -6365,9 +6338,68 @@ static void gen6_set_rps_thresholds(struct drm_i915_private *dev_priv, u8 val)
|
||||
rps->power = new_power;
|
||||
rps->up_threshold = threshold_up;
|
||||
rps->down_threshold = threshold_down;
|
||||
+}
|
||||
+
|
||||
+static void gen6_set_rps_thresholds(struct drm_i915_private *dev_priv, u8 val)
|
||||
+{
|
||||
+ struct intel_rps *rps = &dev_priv->gt_pm.rps;
|
||||
+ int new_power;
|
||||
+
|
||||
+ new_power = rps->power;
|
||||
+ switch (rps->power) {
|
||||
+ case LOW_POWER:
|
||||
+ if (val > rps->efficient_freq + 1 &&
|
||||
+ val > rps->cur_freq)
|
||||
+ new_power = BETWEEN;
|
||||
+ break;
|
||||
+
|
||||
+ case BETWEEN:
|
||||
+ if (val <= rps->efficient_freq &&
|
||||
+ val < rps->cur_freq)
|
||||
+ new_power = LOW_POWER;
|
||||
+ else if (val >= rps->rp0_freq &&
|
||||
+ val > rps->cur_freq)
|
||||
+ new_power = HIGH_POWER;
|
||||
+ break;
|
||||
+
|
||||
+ case HIGH_POWER:
|
||||
+ if (val < (rps->rp1_freq + rps->rp0_freq) >> 1 &&
|
||||
+ val < rps->cur_freq)
|
||||
+ new_power = BETWEEN;
|
||||
+ break;
|
||||
+ }
|
||||
+ /* Max/min bins are special */
|
||||
+ if (val <= rps->min_freq_softlimit)
|
||||
+ new_power = LOW_POWER;
|
||||
+ if (val >= rps->max_freq_softlimit)
|
||||
+ new_power = HIGH_POWER;
|
||||
+
|
||||
+ mutex_lock(&rps->power_lock);
|
||||
+ if (rps->interactive)
|
||||
+ new_power = HIGH_POWER;
|
||||
+ rps_set_power(dev_priv, new_power);
|
||||
+ mutex_unlock(&rps->power_lock);
|
||||
rps->last_adj = 0;
|
||||
}
|
||||
|
||||
+void intel_rps_set_interactive(struct drm_i915_private *dev_priv, bool state)
|
||||
+{
|
||||
+ struct intel_rps *rps = &dev_priv->gt_pm.rps;
|
||||
+
|
||||
+ if (INTEL_GEN(dev_priv) < 6)
|
||||
+ return;
|
||||
+
|
||||
+ mutex_lock(&rps->power_lock);
|
||||
+ if (state) {
|
||||
+ if (!rps->interactive++ && READ_ONCE(dev_priv->gt.awake))
|
||||
+ rps_set_power(dev_priv, HIGH_POWER);
|
||||
+ } else {
|
||||
+ GEM_BUG_ON(!rps->interactive);
|
||||
+ rps->interactive--;
|
||||
+ }
|
||||
+ mutex_unlock(&rps->power_lock);
|
||||
+}
|
||||
+
|
||||
static u32 gen6_rps_pm_mask(struct drm_i915_private *dev_priv, u8 val)
|
||||
{
|
||||
struct intel_rps *rps = &dev_priv->gt_pm.rps;
|
||||
@@ -9604,6 +9636,7 @@ int intel_freq_opcode(struct drm_i915_private *dev_priv, int val)
|
||||
void intel_pm_setup(struct drm_i915_private *dev_priv)
|
||||
{
|
||||
mutex_init(&dev_priv->pcu_lock);
|
||||
+ mutex_init(&dev_priv->gt_pm.rps.power_lock);
|
||||
|
||||
atomic_set(&dev_priv->gt_pm.rps.num_waiters, 0);
|
||||
|
@ -0,0 +1,47 @@
|
||||
From f02436d19bfd25e249184f4eff557ae96eed47ab Mon Sep 17 00:00:00 2001
|
||||
From: Heiner Kallweit <hkallweit1@gmail.com>
|
||||
Date: Thu, 25 Oct 2018 18:40:19 +0200
|
||||
Subject: [PATCH] r8169: fix broken Wake-on-LAN from S5 (poweroff)
|
||||
|
||||
It was reported that WoL from S5 is broken (WoL from S3 works) and the
|
||||
analysis showed that during system shutdown the network interface was
|
||||
brought down already when the actual kernel shutdown started.
|
||||
Therefore netif_running() returned false and as a consequence the PHY
|
||||
was suspended. Obviously WoL wasn't working then.
|
||||
To fix this the original patch needs to be effectively reverted.
|
||||
A side effect is that when normally bringing down the interface and
|
||||
WoL is enabled the PHY will remain powered on (like it was before the
|
||||
original patch).
|
||||
|
||||
Fixes: fe87bef01f9b ("r8169: don't check WoL when powering down PHY and interface is down")
|
||||
Reported-by: Neil MacLeod <neil@nmacleod.com>
|
||||
Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com>
|
||||
---
|
||||
drivers/net/ethernet/realtek/r8169.c | 9 +++++++--
|
||||
1 file changed, 7 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/ethernet/realtek/r8169.c b/drivers/net/ethernet/realtek/r8169.c
|
||||
index 2c35009..4930e03 100644
|
||||
--- a/drivers/net/ethernet/realtek/r8169.c
|
||||
+++ b/drivers/net/ethernet/realtek/r8169.c
|
||||
@@ -4175,10 +4175,15 @@ static void rtl_wol_suspend_quirk(struct rtl8169_private *tp)
|
||||
|
||||
static bool rtl_wol_pll_power_down(struct rtl8169_private *tp)
|
||||
{
|
||||
- if (!netif_running(tp->dev) || !__rtl8169_get_wol(tp))
|
||||
+ struct phy_device *phydev;
|
||||
+
|
||||
+ if (!__rtl8169_get_wol(tp))
|
||||
return false;
|
||||
|
||||
- phy_speed_down(tp->dev->phydev, false);
|
||||
+ /* phydev may not be attached to netdevice */
|
||||
+ phydev = mdiobus_get_phy(tp->mii_bus, 0);
|
||||
+
|
||||
+ phy_speed_down(phydev, false);
|
||||
rtl_wol_suspend_quirk(tp);
|
||||
|
||||
return true;
|
||||
--
|
||||
2.14.1
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -97,4 +97,4 @@
|
||||
# driver addons to install:
|
||||
# for a list of additional drivers see packages/linux-driver-addons
|
||||
# Space separated list is supported,
|
||||
DRIVER_ADDONS="crazycat digital_devices dvb-latest"
|
||||
DRIVER_ADDONS="digital_devices dvb-latest"
|
||||
|
Loading…
x
Reference in New Issue
Block a user