--- /dev/null
+From foo@baz Sat Jan 13 10:51:05 CET 2018
+From: Cong Wang <xiyou.wangcong@gmail.com>
+Date: Tue, 9 Jan 2018 13:40:41 -0800
+Subject: 8021q: fix a memory leak for VLAN 0 device
+
+From: Cong Wang <xiyou.wangcong@gmail.com>
+
+
+[ Upstream commit 78bbb15f2239bc8e663aa20bbe1987c91a0b75f6 ]
+
+A vlan device with vid 0 is allow to creat by not able to be fully
+cleaned up by unregister_vlan_dev() which checks for vlan_id!=0.
+
+Also, VLAN 0 is probably not a valid number and it is kinda
+"reserved" for HW accelerating devices, but it is probably too
+late to reject it from creation even if makes sense. Instead,
+just remove the check in unregister_vlan_dev().
+
+Reported-by: Dmitry Vyukov <dvyukov@google.com>
+Fixes: ad1afb003939 ("vlan_dev: VLAN 0 should be treated as "no vlan tag" (802.1p packet)")
+Cc: Vlad Yasevich <vyasevich@gmail.com>
+Cc: Ben Hutchings <ben.hutchings@codethink.co.uk>
+Signed-off-by: Cong Wang <xiyou.wangcong@gmail.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ net/8021q/vlan.c | 7 +------
+ 1 file changed, 1 insertion(+), 6 deletions(-)
+
+--- a/net/8021q/vlan.c
++++ b/net/8021q/vlan.c
+@@ -111,12 +111,7 @@ void unregister_vlan_dev(struct net_devi
+ vlan_gvrp_uninit_applicant(real_dev);
+ }
+
+- /* Take it out of our own structures, but be sure to interlock with
+- * HW accelerating devices or SW vlan input packet processing if
+- * VLAN is not 0 (leave it there for 802.1p).
+- */
+- if (vlan_id)
+- vlan_vid_del(real_dev, vlan->vlan_proto, vlan_id);
++ vlan_vid_del(real_dev, vlan->vlan_proto, vlan_id);
+
+ /* Get rid of the vlan's reference to real_dev */
+ dev_put(real_dev);
--- /dev/null
+From foo@baz Sat Jan 13 10:51:05 CET 2018
+From: Stephen Hemminger <stephen@networkplumber.org>
+Date: Fri, 29 Dec 2017 10:02:52 -0800
+Subject: ethtool: do not print warning for applications using legacy API
+
+From: Stephen Hemminger <stephen@networkplumber.org>
+
+
+[ Upstream commit 71891e2dab6b55a870f8f7735e44a2963860b5c6 ]
+
+In kernel log ths message appears on every boot:
+ "warning: `NetworkChangeNo' uses legacy ethtool link settings API,
+ link modes are only partially reported"
+
+When ethtool link settings API changed, it started complaining about
+usages of old API. Ironically, the original patch was from google but
+the application using the legacy API is chrome.
+
+Linux ABI is fixed as much as possible. The kernel must not break it
+and should not complain about applications using legacy API's.
+This patch just removes the warning since using legacy API's
+in Linux is perfectly acceptable.
+
+Fixes: 3f1ac7a700d0 ("net: ethtool: add new ETHTOOL_xLINKSETTINGS API")
+Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
+Signed-off-by: David Decotigny <decot@googlers.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ net/core/ethtool.c | 15 ++-------------
+ 1 file changed, 2 insertions(+), 13 deletions(-)
+
+--- a/net/core/ethtool.c
++++ b/net/core/ethtool.c
+@@ -754,15 +754,6 @@ static int ethtool_set_link_ksettings(st
+ return dev->ethtool_ops->set_link_ksettings(dev, &link_ksettings);
+ }
+
+-static void
+-warn_incomplete_ethtool_legacy_settings_conversion(const char *details)
+-{
+- char name[sizeof(current->comm)];
+-
+- pr_info_once("warning: `%s' uses legacy ethtool link settings API, %s\n",
+- get_task_comm(name, current), details);
+-}
+-
+ /* Query device for its ethtool_cmd settings.
+ *
+ * Backward compatibility note: for compatibility with legacy ethtool,
+@@ -789,10 +780,8 @@ static int ethtool_get_settings(struct n
+ &link_ksettings);
+ if (err < 0)
+ return err;
+- if (!convert_link_ksettings_to_legacy_settings(&cmd,
+- &link_ksettings))
+- warn_incomplete_ethtool_legacy_settings_conversion(
+- "link modes are only partially reported");
++ convert_link_ksettings_to_legacy_settings(&cmd,
++ &link_ksettings);
+
+ /* send a sensible cmd tag back to user */
+ cmd.cmd = ETHTOOL_GSET;
--- /dev/null
+From foo@baz Sat Jan 13 10:51:05 CET 2018
+From: Eli Cooper <elicooper@gmx.com>
+Date: Mon, 25 Dec 2017 10:43:49 +0800
+Subject: ip6_tunnel: disable dst caching if tunnel is dual-stack
+
+From: Eli Cooper <elicooper@gmx.com>
+
+
+[ Upstream commit 23263ec86a5f44312d2899323872468752324107 ]
+
+When an ip6_tunnel is in mode 'any', where the transport layer
+protocol can be either 4 or 41, dst_cache must be disabled.
+
+This is because xfrm policies might apply to only one of the two
+protocols. Caching dst would cause xfrm policies for one protocol
+incorrectly used for the other.
+
+Signed-off-by: Eli Cooper <elicooper@gmx.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ net/ipv6/ip6_tunnel.c | 9 +++++----
+ 1 file changed, 5 insertions(+), 4 deletions(-)
+
+--- a/net/ipv6/ip6_tunnel.c
++++ b/net/ipv6/ip6_tunnel.c
+@@ -1081,10 +1081,11 @@ int ip6_tnl_xmit(struct sk_buff *skb, st
+ memcpy(&fl6->daddr, addr6, sizeof(fl6->daddr));
+ neigh_release(neigh);
+ }
+- } else if (!(t->parms.flags &
+- (IP6_TNL_F_USE_ORIG_TCLASS | IP6_TNL_F_USE_ORIG_FWMARK))) {
+- /* enable the cache only only if the routing decision does
+- * not depend on the current inner header value
++ } else if (t->parms.proto != 0 && !(t->parms.flags &
++ (IP6_TNL_F_USE_ORIG_TCLASS |
++ IP6_TNL_F_USE_ORIG_FWMARK))) {
++ /* enable the cache only if neither the outer protocol nor the
++ * routing decision depends on the current inner header value
+ */
+ use_cache = true;
+ }
--- /dev/null
+From foo@baz Sat Jan 13 10:51:05 CET 2018
+From: Eric Dumazet <edumazet@google.com>
+Date: Wed, 10 Jan 2018 03:45:49 -0800
+Subject: ipv6: fix possible mem leaks in ipv6_make_skb()
+
+From: Eric Dumazet <edumazet@google.com>
+
+
+[ Upstream commit 862c03ee1deb7e19e0f9931682e0294ecd1fcaf9 ]
+
+ip6_setup_cork() might return an error, while memory allocations have
+been done and must be rolled back.
+
+Fixes: 6422398c2ab0 ("ipv6: introduce ipv6_make_skb")
+Signed-off-by: Eric Dumazet <edumazet@google.com>
+Cc: Vlad Yasevich <vyasevich@gmail.com>
+Reported-by: Mike Maloney <maloney@google.com>
+Acked-by: Mike Maloney <maloney@google.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ net/ipv6/ip6_output.c | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+--- a/net/ipv6/ip6_output.c
++++ b/net/ipv6/ip6_output.c
+@@ -1735,9 +1735,10 @@ struct sk_buff *ip6_make_skb(struct sock
+ cork.base.opt = NULL;
+ v6_cork.opt = NULL;
+ err = ip6_setup_cork(sk, &cork, &v6_cork, ipc6, rt, fl6);
+- if (err)
++ if (err) {
++ ip6_cork_release(&cork, &v6_cork);
+ return ERR_PTR(err);
+-
++ }
+ if (ipc6->dontfrag < 0)
+ ipc6->dontfrag = inet6_sk(sk)->dontfrag;
+
--- /dev/null
+From foo@baz Sat Jan 13 10:51:05 CET 2018
+From: Mathieu Xhonneux <m.xhonneux@gmail.com>
+Date: Wed, 10 Jan 2018 13:35:49 +0000
+Subject: ipv6: sr: fix TLVs not being copied using setsockopt
+
+From: Mathieu Xhonneux <m.xhonneux@gmail.com>
+
+
+[ Upstream commit ccc12b11c5332c84442ef120dcd631523be75089 ]
+
+Function ipv6_push_rthdr4 allows to add an IPv6 Segment Routing Header
+to a socket through setsockopt, but the current implementation doesn't
+copy possible TLVs at the end of the SRH received from userspace.
+
+Therefore, the execution of the following branch if (sr_has_hmac(sr_phdr))
+{ ... } will never complete since the len and type fields of a possible
+HMAC TLV are not copied, hence seg6_get_tlv_hmac will return an error,
+and the HMAC will not be computed.
+
+This commit adds a memcpy in case TLVs have been appended to the SRH.
+
+Fixes: a149e7c7ce81 ("ipv6: sr: add support for SRH injection through setsockopt")
+Acked-by: David Lebrun <dlebrun@google.com>
+Signed-off-by: Mathieu Xhonneux <m.xhonneux@gmail.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ net/ipv6/exthdrs.c | 9 +++++++++
+ 1 file changed, 9 insertions(+)
+
+--- a/net/ipv6/exthdrs.c
++++ b/net/ipv6/exthdrs.c
+@@ -884,6 +884,15 @@ static void ipv6_push_rthdr4(struct sk_b
+ sr_phdr->segments[0] = **addr_p;
+ *addr_p = &sr_ihdr->segments[sr_ihdr->segments_left];
+
++ if (sr_ihdr->hdrlen > hops * 2) {
++ int tlvs_offset, tlvs_length;
++
++ tlvs_offset = (1 + hops * 2) << 3;
++ tlvs_length = (sr_ihdr->hdrlen - hops * 2) << 3;
++ memcpy((char *)sr_phdr + tlvs_offset,
++ (char *)sr_ihdr + tlvs_offset, tlvs_length);
++ }
++
+ #ifdef CONFIG_IPV6_SEG6_HMAC
+ if (sr_has_hmac(sr_phdr)) {
+ struct net *net = NULL;
--- /dev/null
+From foo@baz Sat Jan 13 10:51:05 CET 2018
+From: Ido Schimmel <idosch@mellanox.com>
+Date: Mon, 25 Dec 2017 09:05:33 +0100
+Subject: mlxsw: spectrum: Relax sanity checks during enslavement
+
+From: Ido Schimmel <idosch@mellanox.com>
+
+
+[ Upstream commit 90045fc9c78855bdc625a0ab185d97b72a937613 ]
+
+Since commit 25cc72a33835 ("mlxsw: spectrum: Forbid linking to devices that
+have uppers") the driver forbids enslavement to netdevs that already
+have uppers of their own, as this can result in various ordering
+problems.
+
+This requirement proved to be too strict for some users who need to be
+able to enslave ports to a bridge that already has uppers. In this case,
+we can allow the enslavement if the bridge is already known to us, as
+any configuration performed on top of the bridge was already reflected
+to the device.
+
+Fixes: 25cc72a33835 ("mlxsw: spectrum: Forbid linking to devices that have uppers")
+Signed-off-by: Ido Schimmel <idosch@mellanox.com>
+Reported-by: Alexander Petrovskiy <alexpe@mellanox.com>
+Tested-by: Alexander Petrovskiy <alexpe@mellanox.com>
+Signed-off-by: Jiri Pirko <jiri@mellanox.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/net/ethernet/mellanox/mlxsw/spectrum.c | 11 +++++++++--
+ drivers/net/ethernet/mellanox/mlxsw/spectrum.h | 2 ++
+ drivers/net/ethernet/mellanox/mlxsw/spectrum_switchdev.c | 6 ++++++
+ 3 files changed, 17 insertions(+), 2 deletions(-)
+
+--- a/drivers/net/ethernet/mellanox/mlxsw/spectrum.c
++++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum.c
+@@ -4235,7 +4235,10 @@ static int mlxsw_sp_netdevice_port_upper
+ return -EINVAL;
+ if (!info->linking)
+ break;
+- if (netdev_has_any_upper_dev(upper_dev))
++ if (netdev_has_any_upper_dev(upper_dev) &&
++ (!netif_is_bridge_master(upper_dev) ||
++ !mlxsw_sp_bridge_device_is_offloaded(mlxsw_sp,
++ upper_dev)))
+ return -EINVAL;
+ if (netif_is_lag_master(upper_dev) &&
+ !mlxsw_sp_master_lag_check(mlxsw_sp, upper_dev,
+@@ -4347,6 +4350,7 @@ static int mlxsw_sp_netdevice_port_vlan_
+ u16 vid)
+ {
+ struct mlxsw_sp_port *mlxsw_sp_port = netdev_priv(dev);
++ struct mlxsw_sp *mlxsw_sp = mlxsw_sp_port->mlxsw_sp;
+ struct netdev_notifier_changeupper_info *info = ptr;
+ struct net_device *upper_dev;
+ int err = 0;
+@@ -4358,7 +4362,10 @@ static int mlxsw_sp_netdevice_port_vlan_
+ return -EINVAL;
+ if (!info->linking)
+ break;
+- if (netdev_has_any_upper_dev(upper_dev))
++ if (netdev_has_any_upper_dev(upper_dev) &&
++ (!netif_is_bridge_master(upper_dev) ||
++ !mlxsw_sp_bridge_device_is_offloaded(mlxsw_sp,
++ upper_dev)))
+ return -EINVAL;
+ break;
+ case NETDEV_CHANGEUPPER:
+--- a/drivers/net/ethernet/mellanox/mlxsw/spectrum.h
++++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum.h
+@@ -326,6 +326,8 @@ int mlxsw_sp_port_bridge_join(struct mlx
+ void mlxsw_sp_port_bridge_leave(struct mlxsw_sp_port *mlxsw_sp_port,
+ struct net_device *brport_dev,
+ struct net_device *br_dev);
++bool mlxsw_sp_bridge_device_is_offloaded(const struct mlxsw_sp *mlxsw_sp,
++ const struct net_device *br_dev);
+
+ /* spectrum.c */
+ int mlxsw_sp_port_ets_set(struct mlxsw_sp_port *mlxsw_sp_port,
+--- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_switchdev.c
++++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_switchdev.c
+@@ -134,6 +134,12 @@ mlxsw_sp_bridge_device_find(const struct
+ return NULL;
+ }
+
++bool mlxsw_sp_bridge_device_is_offloaded(const struct mlxsw_sp *mlxsw_sp,
++ const struct net_device *br_dev)
++{
++ return !!mlxsw_sp_bridge_device_find(mlxsw_sp->bridge, br_dev);
++}
++
+ static struct mlxsw_sp_bridge_device *
+ mlxsw_sp_bridge_device_create(struct mlxsw_sp_bridge *bridge,
+ struct net_device *br_dev)
--- /dev/null
+From foo@baz Sat Jan 13 10:51:05 CET 2018
+From: Ido Schimmel <idosch@mellanox.com>
+Date: Mon, 25 Dec 2017 08:57:35 +0100
+Subject: mlxsw: spectrum_router: Fix NULL pointer deref
+
+From: Ido Schimmel <idosch@mellanox.com>
+
+
+[ Upstream commit 8764a8267b128405cf383157d5e9a4a3735d2409 ]
+
+When we remove the neighbour associated with a nexthop we should always
+refuse to write the nexthop to the adjacency table. Regardless if it is
+already present in the table or not.
+
+Otherwise, we risk dereferencing the NULL pointer that was set instead
+of the neighbour.
+
+Fixes: a7ff87acd995 ("mlxsw: spectrum_router: Implement next-hop routing")
+Signed-off-by: Ido Schimmel <idosch@mellanox.com>
+Reported-by: Alexander Petrovskiy <alexpe@mellanox.com>
+Signed-off-by: Jiri Pirko <jiri@mellanox.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c
++++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c
+@@ -2536,7 +2536,7 @@ static void __mlxsw_sp_nexthop_neigh_upd
+ {
+ if (!removing)
+ nh->should_offload = 1;
+- else if (nh->offloaded)
++ else
+ nh->should_offload = 0;
+ nh->update = 1;
+ }
--- /dev/null
+From foo@baz Sat Jan 13 10:51:05 CET 2018
+From: Andrii Vladyka <tulup@mail.ru>
+Date: Thu, 4 Jan 2018 13:09:17 +0200
+Subject: net: core: fix module type in sock_diag_bind
+
+From: Andrii Vladyka <tulup@mail.ru>
+
+
+[ Upstream commit b8fd0823e0770c2d5fdbd865bccf0d5e058e5287 ]
+
+Use AF_INET6 instead of AF_INET in IPv6-related code path
+
+Signed-off-by: Andrii Vladyka <tulup@mail.ru>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ net/core/sock_diag.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/net/core/sock_diag.c
++++ b/net/core/sock_diag.c
+@@ -288,7 +288,7 @@ static int sock_diag_bind(struct net *ne
+ case SKNLGRP_INET6_UDP_DESTROY:
+ if (!sock_diag_handlers[AF_INET6])
+ request_module("net-pf-%d-proto-%d-type-%d", PF_NETLINK,
+- NETLINK_SOCK_DIAG, AF_INET);
++ NETLINK_SOCK_DIAG, AF_INET6);
+ break;
+ }
+ return 0;
--- /dev/null
+From foo@baz Sat Jan 13 10:51:05 CET 2018
+From: Fugang Duan <fugang.duan@nxp.com>
+Date: Wed, 3 Jan 2018 10:39:30 +0800
+Subject: net: fec: defer probe if regulator is not ready
+
+From: Fugang Duan <fugang.duan@nxp.com>
+
+
+[ Upstream commit 3f38c683033a9a0a2738e7067f449deefabfa3ef ]
+
+Defer probe if regulator is not ready. E.g. some regulator is fixed
+regulator controlled by i2c expander gpio, the i2c device may be probed
+after the driver, then it should handle the case of defer probe error.
+
+Signed-off-by: Fugang Duan <fugang.duan@nxp.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/net/ethernet/freescale/fec_main.c | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+--- a/drivers/net/ethernet/freescale/fec_main.c
++++ b/drivers/net/ethernet/freescale/fec_main.c
+@@ -3458,6 +3458,10 @@ fec_probe(struct platform_device *pdev)
+ goto failed_regulator;
+ }
+ } else {
++ if (PTR_ERR(fep->reg_phy) == -EPROBE_DEFER) {
++ ret = -EPROBE_DEFER;
++ goto failed_regulator;
++ }
+ fep->reg_phy = NULL;
+ }
+
--- /dev/null
+From foo@baz Sat Jan 13 10:51:05 CET 2018
+From: Fugang Duan <fugang.duan@nxp.com>
+Date: Thu, 4 Jan 2018 10:47:20 +0800
+Subject: net: fec: free/restore resource in related probe error pathes
+
+From: Fugang Duan <fugang.duan@nxp.com>
+
+
+[ Upstream commit d1616f07e8f1a4a490d1791316d4a68906b284aa ]
+
+Fixes in probe error path:
+- Restore dev_id before failed_ioremap path.
+ Fixes: ("net: fec: restore dev_id in the cases of probe error")
+- Call of_node_put(phy_node) before failed_phy path.
+ Fixes: ("net: fec: Support phys probed from devicetree and fixed-link")
+
+Signed-off-by: Fugang Duan <fugang.duan@nxp.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/net/ethernet/freescale/fec_main.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+--- a/drivers/net/ethernet/freescale/fec_main.c
++++ b/drivers/net/ethernet/freescale/fec_main.c
+@@ -3543,11 +3543,11 @@ failed_clk_ipg:
+ failed_clk:
+ if (of_phy_is_fixed_link(np))
+ of_phy_deregister_fixed_link(np);
+-failed_phy:
+ of_node_put(phy_node);
++failed_phy:
++ dev_id--;
+ failed_ioremap:
+ free_netdev(ndev);
+- dev_id--;
+
+ return ret;
+ }
--- /dev/null
+From foo@baz Sat Jan 13 10:51:05 CET 2018
+From: Fugang Duan <fugang.duan@nxp.com>
+Date: Wed, 3 Jan 2018 10:39:29 +0800
+Subject: net: fec: restore dev_id in the cases of probe error
+
+From: Fugang Duan <fugang.duan@nxp.com>
+
+
+[ Upstream commit e90f686b4358d7d7e5dbaa48b8e78c9a4e41826e ]
+
+The static variable dev_id always plus one before netdev registerred.
+It should restore the dev_id value in the cases of probe error.
+
+Signed-off-by: Fugang Duan <fugang.duan@nxp.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/net/ethernet/freescale/fec_main.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+--- a/drivers/net/ethernet/freescale/fec_main.c
++++ b/drivers/net/ethernet/freescale/fec_main.c
+@@ -3543,6 +3543,7 @@ failed_phy:
+ of_node_put(phy_node);
+ failed_ioremap:
+ free_netdev(ndev);
++ dev_id--;
+
+ return ret;
+ }
--- /dev/null
+From foo@baz Sat Jan 13 10:51:05 CET 2018
+From: Roi Dayan <roid@mellanox.com>
+Date: Tue, 26 Dec 2017 07:48:51 +0200
+Subject: net/sched: Fix update of lastuse in act modules implementing stats_update
+
+From: Roi Dayan <roid@mellanox.com>
+
+
+[ Upstream commit 3bb23421a504f01551b7cb9dff0e41dbf16656b0 ]
+
+We need to update lastuse to to the most updated value between what
+is already set and the new value.
+If HW matching fails, i.e. because of an issue, the stats are not updated
+but it could be that software did match and updated lastuse.
+
+Fixes: 5712bf9c5c30 ("net/sched: act_mirred: Use passed lastuse argument")
+Fixes: 9fea47d93bcc ("net/sched: act_gact: Update statistics when offloaded to hardware")
+Signed-off-by: Roi Dayan <roid@mellanox.com>
+Reviewed-by: Paul Blakey <paulb@mellanox.com>
+Acked-by: Jiri Pirko <jiri@mellanox.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ net/sched/act_gact.c | 2 +-
+ net/sched/act_mirred.c | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+--- a/net/sched/act_gact.c
++++ b/net/sched/act_gact.c
+@@ -159,7 +159,7 @@ static void tcf_gact_stats_update(struct
+ if (action == TC_ACT_SHOT)
+ this_cpu_ptr(gact->common.cpu_qstats)->drops += packets;
+
+- tm->lastuse = lastuse;
++ tm->lastuse = max_t(u64, tm->lastuse, lastuse);
+ }
+
+ static int tcf_gact_dump(struct sk_buff *skb, struct tc_action *a,
+--- a/net/sched/act_mirred.c
++++ b/net/sched/act_mirred.c
+@@ -238,7 +238,7 @@ static void tcf_stats_update(struct tc_a
+ struct tcf_t *tm = &m->tcf_tm;
+
+ _bstats_cpu_update(this_cpu_ptr(a->cpu_bstats), bytes, packets);
+- tm->lastuse = lastuse;
++ tm->lastuse = max_t(u64, tm->lastuse, lastuse);
+ }
+
+ static int tcf_mirred_dump(struct sk_buff *skb, struct tc_action *a, int bind,
--- /dev/null
+From foo@baz Sat Jan 13 10:51:05 CET 2018
+From: Jerome Brunet <jbrunet@baylibre.com>
+Date: Wed, 3 Jan 2018 16:46:29 +0100
+Subject: net: stmmac: enable EEE in MII, GMII or RGMII only
+
+From: Jerome Brunet <jbrunet@baylibre.com>
+
+
+[ Upstream commit 879626e3a52630316d817cbda7cec9a5446d1d82 ]
+
+Note in the databook - Section 4.4 - EEE :
+" The EEE feature is not supported when the MAC is configured to use the
+TBI, RTBI, SMII, RMII or SGMII single PHY interface. Even if the MAC
+supports multiple PHY interfaces, you should activate the EEE mode only
+when the MAC is operating with GMII, MII, or RGMII interface."
+
+Applying this restriction solves a stability issue observed on Amlogic
+gxl platforms operating with RMII interface and the internal PHY.
+
+Fixes: 83bf79b6bb64 ("stmmac: disable at run-time the EEE if not supported")
+Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>
+Tested-by: Arnaud Patard <arnaud.patard@rtp-net.org>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | 6 ++++++
+ 1 file changed, 6 insertions(+)
+
+--- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
++++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
+@@ -364,9 +364,15 @@ static void stmmac_eee_ctrl_timer(unsign
+ bool stmmac_eee_init(struct stmmac_priv *priv)
+ {
+ struct net_device *ndev = priv->dev;
++ int interface = priv->plat->interface;
+ unsigned long flags;
+ bool ret = false;
+
++ if ((interface != PHY_INTERFACE_MODE_MII) &&
++ (interface != PHY_INTERFACE_MODE_GMII) &&
++ !phy_interface_mode_is_rgmii(interface))
++ goto out;
++
+ /* Using PCS we cannot dial with the phy registers at this stage
+ * so we do not support extra feature like EEE.
+ */
--- /dev/null
+From foo@baz Sat Jan 13 10:51:05 CET 2018
+From: Russell King <rmk+kernel@armlinux.org.uk>
+Date: Tue, 26 Dec 2017 23:15:12 +0000
+Subject: phylink: ensure we report link down when LOS asserted
+
+From: Russell King <rmk+kernel@armlinux.org.uk>
+
+
+[ Upstream commit ac817f5ad066697e4d4d35ec68c974eba2c5f17a ]
+
+Although we disable the netdev carrier, we fail to report in the kernel
+log that the link went down. Fix this.
+
+Fixes: 9525ae83959b ("phylink: add phylink infrastructure")
+Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
+Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/net/phy/phylink.c | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+--- a/drivers/net/phy/phylink.c
++++ b/drivers/net/phy/phylink.c
+@@ -1428,9 +1428,8 @@ static void phylink_sfp_link_down(void *
+ WARN_ON(!lockdep_rtnl_is_held());
+
+ set_bit(PHYLINK_DISABLE_LINK, &pl->phylink_disable_state);
++ queue_work(system_power_efficient_wq, &pl->resolve);
+ flush_work(&pl->resolve);
+-
+- netif_carrier_off(pl->netdev);
+ }
+
+ static void phylink_sfp_link_up(void *upstream)
--- /dev/null
+From foo@baz Sat Jan 13 10:51:05 CET 2018
+From: Mohamed Ghannam <simo.ghannam@gmail.com>
+Date: Tue, 2 Jan 2018 19:44:34 +0000
+Subject: RDS: Heap OOB write in rds_message_alloc_sgs()
+
+From: Mohamed Ghannam <simo.ghannam@gmail.com>
+
+
+[ Upstream commit c095508770aebf1b9218e77026e48345d719b17c ]
+
+When args->nr_local is 0, nr_pages gets also 0 due some size
+calculation via rds_rm_size(), which is later used to allocate
+pages for DMA, this bug produces a heap Out-Of-Bound write access
+to a specific memory region.
+
+Signed-off-by: Mohamed Ghannam <simo.ghannam@gmail.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ net/rds/rdma.c | 3 +++
+ 1 file changed, 3 insertions(+)
+
+--- a/net/rds/rdma.c
++++ b/net/rds/rdma.c
+@@ -525,6 +525,9 @@ int rds_rdma_extra_size(struct rds_rdma_
+
+ local_vec = (struct rds_iovec __user *)(unsigned long) args->local_vec_addr;
+
++ if (args->nr_local == 0)
++ return -EINVAL;
++
+ /* figure out the number of pages in the vector */
+ for (i = 0; i < args->nr_local; i++) {
+ if (copy_from_user(&vec, &local_vec[i],
--- /dev/null
+From foo@baz Sat Jan 13 10:51:05 CET 2018
+From: Mohamed Ghannam <simo.ghannam@gmail.com>
+Date: Wed, 3 Jan 2018 21:06:06 +0000
+Subject: RDS: null pointer dereference in rds_atomic_free_op
+
+From: Mohamed Ghannam <simo.ghannam@gmail.com>
+
+
+[ Upstream commit 7d11f77f84b27cef452cee332f4e469503084737 ]
+
+set rm->atomic.op_active to 0 when rds_pin_pages() fails
+or the user supplied address is invalid,
+this prevents a NULL pointer usage in rds_atomic_free_op()
+
+Signed-off-by: Mohamed Ghannam <simo.ghannam@gmail.com>
+Acked-by: Santosh Shilimkar <santosh.shilimkar@oracle.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ net/rds/rdma.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+--- a/net/rds/rdma.c
++++ b/net/rds/rdma.c
+@@ -877,6 +877,7 @@ int rds_cmsg_atomic(struct rds_sock *rs,
+ err:
+ if (page)
+ put_page(page);
++ rm->atomic.op_active = 0;
+ kfree(rm->atomic.op_notifier);
+
+ return ret;
--- /dev/null
+From foo@baz Sat Jan 13 10:51:05 CET 2018
+From: "David S. Miller" <davem@davemloft.net>
+Date: Fri, 12 Jan 2018 16:09:58 -0500
+Subject: Revert "Revert "xfrm: Fix stack-out-of-bounds read in xfrm_state_find.""
+
+From: "David S. Miller" <davem@davemloft.net>
+
+
+This reverts commit 94802151894d482e82c324edf2c658f8e6b96508.
+
+It breaks transport mode when the policy template has
+wildcard addresses configured.
+
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ net/xfrm/xfrm_policy.c | 29 +++++++++++------------------
+ 1 file changed, 11 insertions(+), 18 deletions(-)
+
+--- a/net/xfrm/xfrm_policy.c
++++ b/net/xfrm/xfrm_policy.c
+@@ -1362,36 +1362,29 @@ xfrm_tmpl_resolve_one(struct xfrm_policy
+ struct net *net = xp_net(policy);
+ int nx;
+ int i, error;
+- xfrm_address_t *daddr = xfrm_flowi_daddr(fl, family);
+- xfrm_address_t *saddr = xfrm_flowi_saddr(fl, family);
+ xfrm_address_t tmp;
+
+ for (nx = 0, i = 0; i < policy->xfrm_nr; i++) {
+ struct xfrm_state *x;
+- xfrm_address_t *remote = daddr;
+- xfrm_address_t *local = saddr;
++ xfrm_address_t *local;
++ xfrm_address_t *remote;
+ struct xfrm_tmpl *tmpl = &policy->xfrm_vec[i];
+
+- if (tmpl->mode == XFRM_MODE_TUNNEL ||
+- tmpl->mode == XFRM_MODE_BEET) {
+- remote = &tmpl->id.daddr;
+- local = &tmpl->saddr;
+- if (xfrm_addr_any(local, tmpl->encap_family)) {
+- error = xfrm_get_saddr(net, fl->flowi_oif,
+- &tmp, remote,
+- tmpl->encap_family, 0);
+- if (error)
+- goto fail;
+- local = &tmp;
+- }
++ remote = &tmpl->id.daddr;
++ local = &tmpl->saddr;
++ if (xfrm_addr_any(local, tmpl->encap_family)) {
++ error = xfrm_get_saddr(net, fl->flowi_oif,
++ &tmp, remote,
++ tmpl->encap_family, 0);
++ if (error)
++ goto fail;
++ local = &tmp;
+ }
+
+ x = xfrm_state_find(remote, local, fl, tmpl, policy, &error, family);
+
+ if (x && x->km.state == XFRM_STATE_VALID) {
+ xfrm[nx++] = x;
+- daddr = remote;
+- saddr = local;
+ continue;
+ }
+ if (x) {
--- /dev/null
+From foo@baz Sat Jan 13 10:51:05 CET 2018
+From: Marcelo Ricardo Leitner <marcelo.leitner@gmail.com>
+Date: Fri, 5 Jan 2018 11:17:17 -0200
+Subject: sctp: do not retransmit upon FragNeeded if PMTU discovery is disabled
+
+From: Marcelo Ricardo Leitner <marcelo.leitner@gmail.com>
+
+
+[ Upstream commit cc35c3d1edf7a8373a1a5daa80a912dec96a9cd5 ]
+
+Currently, if PMTU discovery is disabled on a given transport, but the
+configured value is higher than the actual PMTU, it is likely that we
+will get some icmp Frag Needed. The issue is, if PMTU discovery is
+disabled, we won't update the information and will issue a
+retransmission immediately, which may very well trigger another ICMP,
+and another retransmission, leading to a loop.
+
+The fix is to simply not trigger immediate retransmissions if PMTU
+discovery is disabled on the given transport.
+
+Changes from v2:
+- updated stale comment, noticed by Xin Long
+
+Signed-off-by: Marcelo Ricardo Leitner <marcelo.leitner@gmail.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ net/sctp/input.c | 24 ++++++++++++------------
+ 1 file changed, 12 insertions(+), 12 deletions(-)
+
+--- a/net/sctp/input.c
++++ b/net/sctp/input.c
+@@ -399,20 +399,20 @@ void sctp_icmp_frag_needed(struct sock *
+ return;
+ }
+
+- if (t->param_flags & SPP_PMTUD_ENABLE) {
+- /* Update transports view of the MTU */
+- sctp_transport_update_pmtu(t, pmtu);
++ if (!(t->param_flags & SPP_PMTUD_ENABLE))
++ /* We can't allow retransmitting in such case, as the
++ * retransmission would be sized just as before, and thus we
++ * would get another icmp, and retransmit again.
++ */
++ return;
+
+- /* Update association pmtu. */
+- sctp_assoc_sync_pmtu(asoc);
+- }
++ /* Update transports view of the MTU */
++ sctp_transport_update_pmtu(t, pmtu);
++
++ /* Update association pmtu. */
++ sctp_assoc_sync_pmtu(asoc);
+
+- /* Retransmit with the new pmtu setting.
+- * Normally, if PMTU discovery is disabled, an ICMP Fragmentation
+- * Needed will never be sent, but if a message was sent before
+- * PMTU discovery was disabled that was larger than the PMTU, it
+- * would not be fragmented, so it must be re-transmitted fragmented.
+- */
++ /* Retransmit with the new pmtu setting. */
+ sctp_retransmit(&asoc->outqueue, t, SCTP_RTXR_PMTUD);
+ }
+
--- /dev/null
+From foo@baz Sat Jan 13 10:51:05 CET 2018
+From: Marcelo Ricardo Leitner <marcelo.leitner@gmail.com>
+Date: Fri, 5 Jan 2018 11:17:18 -0200
+Subject: sctp: fix the handling of ICMP Frag Needed for too small MTUs
+
+From: Marcelo Ricardo Leitner <marcelo.leitner@gmail.com>
+
+
+[ Upstream commit b6c5734db07079c9410147b32407f2366d584e6c ]
+
+syzbot reported a hang involving SCTP, on which it kept flooding dmesg
+with the message:
+[ 246.742374] sctp: sctp_transport_update_pmtu: Reported pmtu 508 too
+low, using default minimum of 512
+
+That happened because whenever SCTP hits an ICMP Frag Needed, it tries
+to adjust to the new MTU and triggers an immediate retransmission. But
+it didn't consider the fact that MTUs smaller than the SCTP minimum MTU
+allowed (512) would not cause the PMTU to change, and issued the
+retransmission anyway (thus leading to another ICMP Frag Needed, and so
+on).
+
+As IPv4 (ip_rt_min_pmtu=556) and IPv6 (IPV6_MIN_MTU=1280) minimum MTU
+are higher than that, sctp_transport_update_pmtu() is changed to
+re-fetch the PMTU that got set after our request, and with that, detect
+if there was an actual change or not.
+
+The fix, thus, skips the immediate retransmission if the received ICMP
+resulted in no change, in the hope that SCTP will select another path.
+
+Note: The value being used for the minimum MTU (512,
+SCTP_DEFAULT_MINSEGMENT) is not right and instead it should be (576,
+SCTP_MIN_PMTU), but such change belongs to another patch.
+
+Changes from v1:
+- do not disable PMTU discovery, in the light of commit
+06ad391919b2 ("[SCTP] Don't disable PMTU discovery when mtu is small")
+and as suggested by Xin Long.
+- changed the way to break the rtx loop by detecting if the icmp
+ resulted in a change or not
+Changes from v2:
+none
+
+See-also: https://lkml.org/lkml/2017/12/22/811
+Reported-by: syzbot <syzkaller@googlegroups.com>
+Signed-off-by: Marcelo Ricardo Leitner <marcelo.leitner@gmail.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ include/net/sctp/structs.h | 2 +-
+ net/sctp/input.c | 8 ++++++--
+ net/sctp/transport.c | 29 +++++++++++++++++++----------
+ 3 files changed, 26 insertions(+), 13 deletions(-)
+
+--- a/include/net/sctp/structs.h
++++ b/include/net/sctp/structs.h
+@@ -955,7 +955,7 @@ void sctp_transport_burst_limited(struct
+ void sctp_transport_burst_reset(struct sctp_transport *);
+ unsigned long sctp_transport_timeout(struct sctp_transport *);
+ void sctp_transport_reset(struct sctp_transport *t);
+-void sctp_transport_update_pmtu(struct sctp_transport *t, u32 pmtu);
++bool sctp_transport_update_pmtu(struct sctp_transport *t, u32 pmtu);
+ void sctp_transport_immediate_rtx(struct sctp_transport *);
+ void sctp_transport_dst_release(struct sctp_transport *t);
+ void sctp_transport_dst_confirm(struct sctp_transport *t);
+--- a/net/sctp/input.c
++++ b/net/sctp/input.c
+@@ -406,8 +406,12 @@ void sctp_icmp_frag_needed(struct sock *
+ */
+ return;
+
+- /* Update transports view of the MTU */
+- sctp_transport_update_pmtu(t, pmtu);
++ /* Update transports view of the MTU. Return if no update was needed.
++ * If an update wasn't needed/possible, it also doesn't make sense to
++ * try to retransmit now.
++ */
++ if (!sctp_transport_update_pmtu(t, pmtu))
++ return;
+
+ /* Update association pmtu. */
+ sctp_assoc_sync_pmtu(asoc);
+--- a/net/sctp/transport.c
++++ b/net/sctp/transport.c
+@@ -251,28 +251,37 @@ void sctp_transport_pmtu(struct sctp_tra
+ transport->pathmtu = SCTP_DEFAULT_MAXSEGMENT;
+ }
+
+-void sctp_transport_update_pmtu(struct sctp_transport *t, u32 pmtu)
++bool sctp_transport_update_pmtu(struct sctp_transport *t, u32 pmtu)
+ {
+ struct dst_entry *dst = sctp_transport_dst_check(t);
++ bool change = true;
+
+ if (unlikely(pmtu < SCTP_DEFAULT_MINSEGMENT)) {
+- pr_warn("%s: Reported pmtu %d too low, using default minimum of %d\n",
+- __func__, pmtu, SCTP_DEFAULT_MINSEGMENT);
+- /* Use default minimum segment size and disable
+- * pmtu discovery on this transport.
+- */
+- t->pathmtu = SCTP_DEFAULT_MINSEGMENT;
+- } else {
+- t->pathmtu = pmtu;
++ pr_warn_ratelimited("%s: Reported pmtu %d too low, using default minimum of %d\n",
++ __func__, pmtu, SCTP_DEFAULT_MINSEGMENT);
++ /* Use default minimum segment instead */
++ pmtu = SCTP_DEFAULT_MINSEGMENT;
+ }
++ pmtu = SCTP_TRUNC4(pmtu);
+
+ if (dst) {
+ dst->ops->update_pmtu(dst, t->asoc->base.sk, NULL, pmtu);
+ dst = sctp_transport_dst_check(t);
+ }
+
+- if (!dst)
++ if (!dst) {
+ t->af_specific->get_dst(t, &t->saddr, &t->fl, t->asoc->base.sk);
++ dst = t->dst;
++ }
++
++ if (dst) {
++ /* Re-fetch, as under layers may have a higher minimum size */
++ pmtu = SCTP_TRUNC4(dst_mtu(dst));
++ change = t->pathmtu != pmtu;
++ }
++ t->pathmtu = pmtu;
++
++ return change;
+ }
+
+ /* Caches the dst entry and source address for a transport's destination
alsa-aloop-fix-inconsistent-format-due-to-incomplete-rule.patch
alsa-aloop-fix-racy-hw-constraints-adjustment.patch
x86-acpi-reduce-code-duplication-in-mp_override_legacy_irq.patch
+8021q-fix-a-memory-leak-for-vlan-0-device.patch
+ip6_tunnel-disable-dst-caching-if-tunnel-is-dual-stack.patch
+net-core-fix-module-type-in-sock_diag_bind.patch
+phylink-ensure-we-report-link-down-when-los-asserted.patch
+rds-heap-oob-write-in-rds_message_alloc_sgs.patch
+rds-null-pointer-dereference-in-rds_atomic_free_op.patch
+net-fec-restore-dev_id-in-the-cases-of-probe-error.patch
+net-fec-defer-probe-if-regulator-is-not-ready.patch
+net-fec-free-restore-resource-in-related-probe-error-pathes.patch
+sctp-do-not-retransmit-upon-fragneeded-if-pmtu-discovery-is-disabled.patch
+sctp-fix-the-handling-of-icmp-frag-needed-for-too-small-mtus.patch
+sh_eth-fix-tsu-resource-handling.patch
+net-stmmac-enable-eee-in-mii-gmii-or-rgmii-only.patch
+sh_eth-fix-sh7757-gether-initialization.patch
+ipv6-fix-possible-mem-leaks-in-ipv6_make_skb.patch
+ethtool-do-not-print-warning-for-applications-using-legacy-api.patch
+mlxsw-spectrum_router-fix-null-pointer-deref.patch
+net-sched-fix-update-of-lastuse-in-act-modules-implementing-stats_update.patch
+ipv6-sr-fix-tlvs-not-being-copied-using-setsockopt.patch
+mlxsw-spectrum-relax-sanity-checks-during-enslavement.patch
+sfp-fix-sfp-bus-oops-when-removing-socket-upstream.patch
+revert-revert-xfrm-fix-stack-out-of-bounds-read-in-xfrm_state_find.patch
--- /dev/null
+From foo@baz Sat Jan 13 10:51:05 CET 2018
+From: Russell King <rmk+kernel@armlinux.org.uk>
+Date: Tue, 26 Dec 2017 23:15:17 +0000
+Subject: sfp: fix sfp-bus oops when removing socket/upstream
+
+From: Russell King <rmk+kernel@armlinux.org.uk>
+
+
+[ Upstream commit 0b2122e4934c7783d336397864e34ee53aad0965 ]
+
+When we remove a socket or upstream, and the other side isn't
+registered, we dereference a NULL pointer, causing a kernel oops.
+Fix this.
+
+Fixes: ce0aa27ff3f6 ("sfp: add sfp-bus to bridge between network devices and sfp cages")
+Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
+Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/net/phy/sfp-bus.c | 6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
+
+--- a/drivers/net/phy/sfp-bus.c
++++ b/drivers/net/phy/sfp-bus.c
+@@ -359,7 +359,8 @@ EXPORT_SYMBOL_GPL(sfp_register_upstream)
+ void sfp_unregister_upstream(struct sfp_bus *bus)
+ {
+ rtnl_lock();
+- sfp_unregister_bus(bus);
++ if (bus->sfp)
++ sfp_unregister_bus(bus);
+ bus->upstream = NULL;
+ bus->netdev = NULL;
+ rtnl_unlock();
+@@ -464,7 +465,8 @@ EXPORT_SYMBOL_GPL(sfp_register_socket);
+ void sfp_unregister_socket(struct sfp_bus *bus)
+ {
+ rtnl_lock();
+- sfp_unregister_bus(bus);
++ if (bus->netdev)
++ sfp_unregister_bus(bus);
+ bus->sfp_dev = NULL;
+ bus->sfp = NULL;
+ bus->socket_ops = NULL;
--- /dev/null
+From foo@baz Sat Jan 13 10:51:05 CET 2018
+From: Sergei Shtylyov <sergei.shtylyov@cogentembedded.com>
+Date: Thu, 4 Jan 2018 21:06:49 +0300
+Subject: sh_eth: fix SH7757 GEther initialization
+
+From: Sergei Shtylyov <sergei.shtylyov@cogentembedded.com>
+
+
+[ Upstream commit 5133550296d43236439494aa955bfb765a89f615 ]
+
+Renesas SH7757 has 2 Fast and 2 Gigabit Ether controllers, while the
+'sh_eth' driver can only reset and initialize TSU of the first controller
+pair. Shimoda-san tried to solve that adding the 'needs_init' member to the
+'struct sh_eth_plat_data', however the platform code still never sets this
+flag. I think that we can infer this information from the 'devno' variable
+(set to 'platform_device::id') and reset/init the Ether controller pair
+only for an even 'devno'; therefore 'sh_eth_plat_data::needs_init' can be
+removed...
+
+Fixes: 150647fb2c31 ("net: sh_eth: change the condition of initialization")
+Signed-off-by: Sergei Shtylyov <sergei.shtylyov@cogentembedded.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/net/ethernet/renesas/sh_eth.c | 4 ++--
+ include/linux/sh_eth.h | 1 -
+ 2 files changed, 2 insertions(+), 3 deletions(-)
+
+--- a/drivers/net/ethernet/renesas/sh_eth.c
++++ b/drivers/net/ethernet/renesas/sh_eth.c
+@@ -3241,8 +3241,8 @@ static int sh_eth_drv_probe(struct platf
+ ndev->features = NETIF_F_HW_VLAN_CTAG_FILTER;
+ }
+
+- /* initialize first or needed device */
+- if (!devno || pd->needs_init) {
++ /* Need to init only the first port of the two sharing a TSU */
++ if (devno % 2 == 0) {
+ if (mdp->cd->chip_reset)
+ mdp->cd->chip_reset(ndev);
+
+--- a/include/linux/sh_eth.h
++++ b/include/linux/sh_eth.h
+@@ -17,7 +17,6 @@ struct sh_eth_plat_data {
+ unsigned char mac_addr[ETH_ALEN];
+ unsigned no_ether_link:1;
+ unsigned ether_link_active_low:1;
+- unsigned needs_init:1;
+ };
+
+ #endif
--- /dev/null
+From foo@baz Sat Jan 13 10:51:05 CET 2018
+From: Sergei Shtylyov <sergei.shtylyov@cogentembedded.com>
+Date: Wed, 3 Jan 2018 20:09:49 +0300
+Subject: sh_eth: fix TSU resource handling
+
+From: Sergei Shtylyov <sergei.shtylyov@cogentembedded.com>
+
+
+[ Upstream commit dfe8266b8dd10e12a731c985b725fcf7f0e537f0 ]
+
+When switching the driver to the managed device API, I managed to break
+the case of a dual Ether devices sharing a single TSU: the 2nd Ether port
+wouldn't probe. Iwamatsu-san has tried to fix this but his patch was buggy
+and he then dropped the ball...
+
+The solution is to limit calling devm_request_mem_region() to the first
+of the two ports sharing the same TSU, so devm_ioremap_resource() can't
+be used anymore for the TSU resource...
+
+Fixes: d5e07e69218f ("sh_eth: use managed device API")
+Reported-by: Nobuhiro Iwamatsu <nobuhiro.iwamatsu.yj@renesas.com>
+Signed-off-by: Sergei Shtylyov <sergei.shtylyov@cogentembedded.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/net/ethernet/renesas/sh_eth.c | 25 ++++++++++++++++++++++---
+ 1 file changed, 22 insertions(+), 3 deletions(-)
+
+--- a/drivers/net/ethernet/renesas/sh_eth.c
++++ b/drivers/net/ethernet/renesas/sh_eth.c
+@@ -3212,10 +3212,29 @@ static int sh_eth_drv_probe(struct platf
+ /* ioremap the TSU registers */
+ if (mdp->cd->tsu) {
+ struct resource *rtsu;
++
+ rtsu = platform_get_resource(pdev, IORESOURCE_MEM, 1);
+- mdp->tsu_addr = devm_ioremap_resource(&pdev->dev, rtsu);
+- if (IS_ERR(mdp->tsu_addr)) {
+- ret = PTR_ERR(mdp->tsu_addr);
++ if (!rtsu) {
++ dev_err(&pdev->dev, "no TSU resource\n");
++ ret = -ENODEV;
++ goto out_release;
++ }
++ /* We can only request the TSU region for the first port
++ * of the two sharing this TSU for the probe to succeed...
++ */
++ if (devno % 2 == 0 &&
++ !devm_request_mem_region(&pdev->dev, rtsu->start,
++ resource_size(rtsu),
++ dev_name(&pdev->dev))) {
++ dev_err(&pdev->dev, "can't request TSU resource.\n");
++ ret = -EBUSY;
++ goto out_release;
++ }
++ mdp->tsu_addr = devm_ioremap(&pdev->dev, rtsu->start,
++ resource_size(rtsu));
++ if (!mdp->tsu_addr) {
++ dev_err(&pdev->dev, "TSU region ioremap() failed.\n");
++ ret = -ENOMEM;
+ goto out_release;
+ }
+ mdp->port = devno % 2;