kernel: bump 4.9 to 4.9.57
Refresh patches. Compile-tested for ar71xx - Archer C7 v2 Runtime-tested on ar71xx - Archer C7 v2 Fixes the following CVEs: - CVE-2017-7518 - CVE-2017-0786 - CVE-2017-1000255 - CVE-2017-12188 - CVE-2017-15265 Signed-off-by: Kevin Darbyshire-Bryant <ldir@darbyshire-bryant.me.uk>
This commit is contained in:
		
				
					committed by
					
						
						Stijn Tintel
					
				
			
			
				
	
			
			
			
						parent
						
							060e37567e
						
					
				
				
					commit
					886d66abcd
				
			@@ -4,11 +4,11 @@ LINUX_RELEASE?=1
 | 
			
		||||
 | 
			
		||||
LINUX_VERSION-3.18 = .71
 | 
			
		||||
LINUX_VERSION-4.4 = .92
 | 
			
		||||
LINUX_VERSION-4.9 = .54
 | 
			
		||||
LINUX_VERSION-4.9 = .57
 | 
			
		||||
 | 
			
		||||
LINUX_KERNEL_HASH-3.18.71 = 5abc9778ad44ce02ed6c8ab52ece8a21c6d20d21f6ed8a19287b4a38a50c1240
 | 
			
		||||
LINUX_KERNEL_HASH-4.4.92 = 53f8cd8b024444df0f242f8e6ab5147b0b009d7a30e8b2ed3854e8d17937460d
 | 
			
		||||
LINUX_KERNEL_HASH-4.9.54 = 651005db6efbce4fcd607415ebd697dd8d2f5a2abc2c632b11ece03a1a210fc5
 | 
			
		||||
LINUX_KERNEL_HASH-4.9.57 = 09230554ec6a34a12e2d2a6b32733aed3c9bc90b1662cc1b06dd67bf726c96a6
 | 
			
		||||
 | 
			
		||||
ifdef KERNEL_PATCHVER
 | 
			
		||||
  LINUX_VERSION:=$(KERNEL_PATCHVER)$(strip $(LINUX_VERSION-$(KERNEL_PATCHVER)))
 | 
			
		||||
 
 | 
			
		||||
@@ -44,7 +44,7 @@ Signed-off-by: Christian Lamparter <chunkeey@googlemail.com>
 | 
			
		||||
 
 | 
			
		||||
 #include "xhci.h"
 | 
			
		||||
 #include "xhci-trace.h"
 | 
			
		||||
@@ -248,6 +250,458 @@ static void xhci_pme_acpi_rtd3_enable(st
 | 
			
		||||
@@ -236,6 +238,458 @@ static void xhci_pme_acpi_rtd3_enable(st
 | 
			
		||||
 static void xhci_pme_acpi_rtd3_enable(struct pci_dev *dev) { }
 | 
			
		||||
 #endif /* CONFIG_ACPI */
 | 
			
		||||
 
 | 
			
		||||
@@ -503,7 +503,7 @@ Signed-off-by: Christian Lamparter <chunkeey@googlemail.com>
 | 
			
		||||
 /* called during probe() after chip reset completes */
 | 
			
		||||
 static int xhci_pci_setup(struct usb_hcd *hcd)
 | 
			
		||||
 {
 | 
			
		||||
@@ -287,6 +741,22 @@ static int xhci_pci_probe(struct pci_dev
 | 
			
		||||
@@ -275,6 +729,22 @@ static int xhci_pci_probe(struct pci_dev
 | 
			
		||||
 	struct hc_driver *driver;
 | 
			
		||||
 	struct usb_hcd *hcd;
 | 
			
		||||
 
 | 
			
		||||
@@ -526,7 +526,7 @@ Signed-off-by: Christian Lamparter <chunkeey@googlemail.com>
 | 
			
		||||
 	driver = (struct hc_driver *)id->driver_data;
 | 
			
		||||
 
 | 
			
		||||
 	/* Prevent runtime suspending between USB-2 and USB-3 initialization */
 | 
			
		||||
@@ -344,6 +814,16 @@ static void xhci_pci_remove(struct pci_d
 | 
			
		||||
@@ -332,6 +802,16 @@ static void xhci_pci_remove(struct pci_d
 | 
			
		||||
 {
 | 
			
		||||
 	struct xhci_hcd *xhci;
 | 
			
		||||
 
 | 
			
		||||
 
 | 
			
		||||
@@ -13,7 +13,7 @@ produce a noisy warning.
 | 
			
		||||
 | 
			
		||||
--- a/drivers/usb/host/xhci-pci.c
 | 
			
		||||
+++ b/drivers/usb/host/xhci-pci.c
 | 
			
		||||
@@ -205,7 +205,7 @@ static void xhci_pci_quirks(struct devic
 | 
			
		||||
@@ -193,7 +193,7 @@ static void xhci_pci_quirks(struct devic
 | 
			
		||||
 	}
 | 
			
		||||
 	if (pdev->vendor == PCI_VENDOR_ID_RENESAS &&
 | 
			
		||||
 			pdev->device == 0x0015)
 | 
			
		||||
 
 | 
			
		||||
@@ -129,7 +129,7 @@ it on BCM4708 family.
 | 
			
		||||
+++ b/drivers/usb/host/xhci.h
 | 
			
		||||
@@ -1662,6 +1662,7 @@ struct xhci_hcd {
 | 
			
		||||
 #define XHCI_LIMIT_ENDPOINT_INTERVAL_7	(1 << 26)
 | 
			
		||||
 #define XHCI_U2_DISABLE_WAKE	(1 << 27)
 | 
			
		||||
 /* Reserved. It was XHCI_U2_DISABLE_WAKE */
 | 
			
		||||
 #define XHCI_ASMEDIA_MODIFY_FLOWCONTROL	(1 << 28)
 | 
			
		||||
+#define XHCI_FAKE_DOORBELL	(1 << 29)
 | 
			
		||||
 
 | 
			
		||||
 
 | 
			
		||||
@@ -19,7 +19,7 @@ Reduces overhead when using X
 | 
			
		||||
 module_param_named(mousepoll, hid_mousepoll_interval, uint, 0644);
 | 
			
		||||
 MODULE_PARM_DESC(mousepoll, "Polling interval of mice");
 | 
			
		||||
 
 | 
			
		||||
@@ -1083,8 +1083,12 @@ static int usbhid_start(struct hid_devic
 | 
			
		||||
@@ -1093,8 +1093,12 @@ static int usbhid_start(struct hid_devic
 | 
			
		||||
 		}
 | 
			
		||||
 
 | 
			
		||||
 		/* Change the polling interval of mice. */
 | 
			
		||||
 
 | 
			
		||||
@@ -21,7 +21,7 @@ Signed-off-by: Eric Anholt <eric@anholt.net>
 | 
			
		||||
 			}
 | 
			
		||||
 			kfree(pagelist);
 | 
			
		||||
 			if (actual_pages == 0)
 | 
			
		||||
@@ -577,7 +577,7 @@ free_pagelist(PAGELIST_T *pagelist, int
 | 
			
		||||
@@ -579,7 +579,7 @@ free_pagelist(PAGELIST_T *pagelist, int
 | 
			
		||||
 				offset = 0;
 | 
			
		||||
 				set_page_dirty(pg);
 | 
			
		||||
 			}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
--- a/drivers/net/phy/broadcom.c
 | 
			
		||||
+++ b/drivers/net/phy/broadcom.c
 | 
			
		||||
@@ -414,6 +414,11 @@ static int bcm5481_config_aneg(struct ph
 | 
			
		||||
@@ -420,6 +420,11 @@ static int bcm5481_config_aneg(struct ph
 | 
			
		||||
 		/* Write bits 14:0. */
 | 
			
		||||
 		reg |= (1 << 15);
 | 
			
		||||
 		phy_write(phydev, 0x18, reg);
 | 
			
		||||
 
 | 
			
		||||
@@ -60,7 +60,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net>
 | 
			
		||||
 		nval = cmpxchg(&tp->tsq_flags, oval, nval);
 | 
			
		||||
 		if (nval != oval)
 | 
			
		||||
 			continue;
 | 
			
		||||
@@ -2179,6 +2179,8 @@ static bool tcp_write_xmit(struct sock *
 | 
			
		||||
@@ -2182,6 +2182,8 @@ static bool tcp_write_xmit(struct sock *
 | 
			
		||||
 		    unlikely(tso_fragment(sk, skb, limit, mss_now, gfp)))
 | 
			
		||||
 			break;
 | 
			
		||||
 
 | 
			
		||||
 
 | 
			
		||||
@@ -19,7 +19,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net>
 | 
			
		||||
 | 
			
		||||
--- a/net/ipv4/tcp_output.c
 | 
			
		||||
+++ b/net/ipv4/tcp_output.c
 | 
			
		||||
@@ -2084,6 +2084,15 @@ static bool tcp_small_queue_check(struct
 | 
			
		||||
@@ -2087,6 +2087,15 @@ static bool tcp_small_queue_check(struct
 | 
			
		||||
 	limit <<= factor;
 | 
			
		||||
 
 | 
			
		||||
 	if (atomic_read(&sk->sk_wmem_alloc) > limit) {
 | 
			
		||||
 
 | 
			
		||||
@@ -17,7 +17,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net>
 | 
			
		||||
 | 
			
		||||
--- a/net/ipv4/tcp_output.c
 | 
			
		||||
+++ b/net/ipv4/tcp_output.c
 | 
			
		||||
@@ -1925,26 +1925,26 @@ static inline void tcp_mtu_check_reprobe
 | 
			
		||||
@@ -1928,26 +1928,26 @@ static inline void tcp_mtu_check_reprobe
 | 
			
		||||
  */
 | 
			
		||||
 static int tcp_mtu_probe(struct sock *sk)
 | 
			
		||||
 {
 | 
			
		||||
 
 | 
			
		||||
@@ -114,7 +114,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net>
 | 
			
		||||
 		if (nval != oval)
 | 
			
		||||
 			continue;
 | 
			
		||||
 
 | 
			
		||||
@@ -2093,7 +2093,7 @@ static bool tcp_small_queue_check(struct
 | 
			
		||||
@@ -2096,7 +2096,7 @@ static bool tcp_small_queue_check(struct
 | 
			
		||||
 		    skb->prev == sk->sk_write_queue.next)
 | 
			
		||||
 			return false;
 | 
			
		||||
 
 | 
			
		||||
@@ -123,7 +123,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net>
 | 
			
		||||
 		/* It is possible TX completion already happened
 | 
			
		||||
 		 * before we set TSQ_THROTTLED, so we must
 | 
			
		||||
 		 * test again the condition.
 | 
			
		||||
@@ -2191,8 +2191,8 @@ static bool tcp_write_xmit(struct sock *
 | 
			
		||||
@@ -2194,8 +2194,8 @@ static bool tcp_write_xmit(struct sock *
 | 
			
		||||
 		    unlikely(tso_fragment(sk, skb, limit, mss_now, gfp)))
 | 
			
		||||
 			break;
 | 
			
		||||
 
 | 
			
		||||
@@ -134,7 +134,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net>
 | 
			
		||||
 		if (tcp_small_queue_check(sk, skb, 0))
 | 
			
		||||
 			break;
 | 
			
		||||
 
 | 
			
		||||
@@ -3495,8 +3495,6 @@ void tcp_send_ack(struct sock *sk)
 | 
			
		||||
@@ -3508,8 +3508,6 @@ void tcp_send_ack(struct sock *sk)
 | 
			
		||||
 	/* We do not want pure acks influencing TCP Small Queues or fq/pacing
 | 
			
		||||
 	 * too much.
 | 
			
		||||
 	 * SKB_TRUESIZE(max(1 .. 66, MAX_TCP_HEADER)) is unfortunately ~784
 | 
			
		||||
 
 | 
			
		||||
@@ -83,7 +83,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
 | 
			
		||||
 EXPORT_SYMBOL(default_qdisc_ops);
 | 
			
		||||
 
 | 
			
		||||
 /* Main transmission queue. */
 | 
			
		||||
@@ -759,7 +759,7 @@ static void attach_one_default_qdisc(str
 | 
			
		||||
@@ -760,7 +760,7 @@ static void attach_one_default_qdisc(str
 | 
			
		||||
 				     void *_unused)
 | 
			
		||||
 {
 | 
			
		||||
 	struct Qdisc *qdisc;
 | 
			
		||||
 
 | 
			
		||||
@@ -327,7 +327,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
 | 
			
		||||
 
 | 
			
		||||
--- a/net/core/sock.c
 | 
			
		||||
+++ b/net/core/sock.c
 | 
			
		||||
@@ -3082,6 +3082,8 @@ static __net_initdata struct pernet_oper
 | 
			
		||||
@@ -3084,6 +3084,8 @@ static __net_initdata struct pernet_oper
 | 
			
		||||
 
 | 
			
		||||
 static int __init proto_init(void)
 | 
			
		||||
 {
 | 
			
		||||
 
 | 
			
		||||
@@ -30,7 +30,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
 | 
			
		||||
 #define PACKET_FANOUT_LB		1
 | 
			
		||||
--- a/net/packet/af_packet.c
 | 
			
		||||
+++ b/net/packet/af_packet.c
 | 
			
		||||
@@ -1772,6 +1772,7 @@ static int packet_rcv_spkt(struct sk_buf
 | 
			
		||||
@@ -1778,6 +1778,7 @@ static int packet_rcv_spkt(struct sk_buf
 | 
			
		||||
 {
 | 
			
		||||
 	struct sock *sk;
 | 
			
		||||
 	struct sockaddr_pkt *spkt;
 | 
			
		||||
@@ -38,7 +38,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
 | 
			
		||||
 
 | 
			
		||||
 	/*
 | 
			
		||||
 	 *	When we registered the protocol we saved the socket in the data
 | 
			
		||||
@@ -1779,6 +1780,7 @@ static int packet_rcv_spkt(struct sk_buf
 | 
			
		||||
@@ -1785,6 +1786,7 @@ static int packet_rcv_spkt(struct sk_buf
 | 
			
		||||
 	 */
 | 
			
		||||
 
 | 
			
		||||
 	sk = pt->af_packet_priv;
 | 
			
		||||
@@ -46,7 +46,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
 | 
			
		||||
 
 | 
			
		||||
 	/*
 | 
			
		||||
 	 *	Yank back the headers [hope the device set this
 | 
			
		||||
@@ -1791,7 +1793,7 @@ static int packet_rcv_spkt(struct sk_buf
 | 
			
		||||
@@ -1797,7 +1799,7 @@ static int packet_rcv_spkt(struct sk_buf
 | 
			
		||||
 	 *	so that this procedure is noop.
 | 
			
		||||
 	 */
 | 
			
		||||
 
 | 
			
		||||
@@ -55,7 +55,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
 | 
			
		||||
 		goto out;
 | 
			
		||||
 
 | 
			
		||||
 	if (!net_eq(dev_net(dev), sock_net(sk)))
 | 
			
		||||
@@ -2029,12 +2031,12 @@ static int packet_rcv(struct sk_buff *sk
 | 
			
		||||
@@ -2035,12 +2037,12 @@ static int packet_rcv(struct sk_buff *sk
 | 
			
		||||
 	unsigned int snaplen, res;
 | 
			
		||||
 	bool is_drop_n_account = false;
 | 
			
		||||
 
 | 
			
		||||
@@ -71,7 +71,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
 | 
			
		||||
 	if (!net_eq(dev_net(dev), sock_net(sk)))
 | 
			
		||||
 		goto drop;
 | 
			
		||||
 
 | 
			
		||||
@@ -2160,12 +2162,12 @@ static int tpacket_rcv(struct sk_buff *s
 | 
			
		||||
@@ -2166,12 +2168,12 @@ static int tpacket_rcv(struct sk_buff *s
 | 
			
		||||
 	BUILD_BUG_ON(TPACKET_ALIGN(sizeof(*h.h2)) != 32);
 | 
			
		||||
 	BUILD_BUG_ON(TPACKET_ALIGN(sizeof(*h.h3)) != 48);
 | 
			
		||||
 
 | 
			
		||||
@@ -87,7 +87,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
 | 
			
		||||
 	if (!net_eq(dev_net(dev), sock_net(sk)))
 | 
			
		||||
 		goto drop;
 | 
			
		||||
 
 | 
			
		||||
@@ -3240,6 +3242,7 @@ static int packet_create(struct net *net
 | 
			
		||||
@@ -3250,6 +3252,7 @@ static int packet_create(struct net *net
 | 
			
		||||
 	mutex_init(&po->pg_vec_lock);
 | 
			
		||||
 	po->rollover = NULL;
 | 
			
		||||
 	po->prot_hook.func = packet_rcv;
 | 
			
		||||
@@ -95,7 +95,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
 | 
			
		||||
 
 | 
			
		||||
 	if (sock->type == SOCK_PACKET)
 | 
			
		||||
 		po->prot_hook.func = packet_rcv_spkt;
 | 
			
		||||
@@ -3826,6 +3829,16 @@ packet_setsockopt(struct socket *sock, i
 | 
			
		||||
@@ -3836,6 +3839,16 @@ packet_setsockopt(struct socket *sock, i
 | 
			
		||||
 		po->xmit = val ? packet_direct_xmit : dev_queue_xmit;
 | 
			
		||||
 		return 0;
 | 
			
		||||
 	}
 | 
			
		||||
@@ -112,7 +112,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
 | 
			
		||||
 	default:
 | 
			
		||||
 		return -ENOPROTOOPT;
 | 
			
		||||
 	}
 | 
			
		||||
@@ -3878,6 +3891,13 @@ static int packet_getsockopt(struct sock
 | 
			
		||||
@@ -3888,6 +3901,13 @@ static int packet_getsockopt(struct sock
 | 
			
		||||
 	case PACKET_VNET_HDR:
 | 
			
		||||
 		val = po->has_vnet_hdr;
 | 
			
		||||
 		break;
 | 
			
		||||
 
 | 
			
		||||
@@ -300,7 +300,7 @@ Signed-off-by: Steven Barth <cyrus@openwrt.org>
 | 
			
		||||
 /**
 | 
			
		||||
  * ip6_tnl_addr_conflict - compare packet addresses to tunnel's own
 | 
			
		||||
  *   @t: the outgoing tunnel device
 | 
			
		||||
@@ -1285,6 +1425,7 @@ ip6ip6_tnl_xmit(struct sk_buff *skb, str
 | 
			
		||||
@@ -1286,6 +1426,7 @@ ip6ip6_tnl_xmit(struct sk_buff *skb, str
 | 
			
		||||
 {
 | 
			
		||||
 	struct ip6_tnl *t = netdev_priv(dev);
 | 
			
		||||
 	struct ipv6hdr *ipv6h = ipv6_hdr(skb);
 | 
			
		||||
@@ -308,7 +308,7 @@ Signed-off-by: Steven Barth <cyrus@openwrt.org>
 | 
			
		||||
 	int encap_limit = -1;
 | 
			
		||||
 	__u16 offset;
 | 
			
		||||
 	struct flowi6 fl6;
 | 
			
		||||
@@ -1343,6 +1484,18 @@ ip6ip6_tnl_xmit(struct sk_buff *skb, str
 | 
			
		||||
@@ -1344,6 +1485,18 @@ ip6ip6_tnl_xmit(struct sk_buff *skb, str
 | 
			
		||||
 			fl6.flowi6_mark = skb->mark;
 | 
			
		||||
 	}
 | 
			
		||||
 
 | 
			
		||||
@@ -327,7 +327,7 @@ Signed-off-by: Steven Barth <cyrus@openwrt.org>
 | 
			
		||||
 	if (iptunnel_handle_offloads(skb, SKB_GSO_IPXIP6))
 | 
			
		||||
 		return -1;
 | 
			
		||||
 
 | 
			
		||||
@@ -1470,6 +1623,14 @@ ip6_tnl_change(struct ip6_tnl *t, const
 | 
			
		||||
@@ -1471,6 +1624,14 @@ ip6_tnl_change(struct ip6_tnl *t, const
 | 
			
		||||
 	t->parms.flowinfo = p->flowinfo;
 | 
			
		||||
 	t->parms.link = p->link;
 | 
			
		||||
 	t->parms.proto = p->proto;
 | 
			
		||||
@@ -342,7 +342,7 @@ Signed-off-by: Steven Barth <cyrus@openwrt.org>
 | 
			
		||||
 	dst_cache_reset(&t->dst_cache);
 | 
			
		||||
 	ip6_tnl_link_config(t);
 | 
			
		||||
 	return 0;
 | 
			
		||||
@@ -1508,6 +1669,7 @@ ip6_tnl_parm_from_user(struct __ip6_tnl_
 | 
			
		||||
@@ -1509,6 +1670,7 @@ ip6_tnl_parm_from_user(struct __ip6_tnl_
 | 
			
		||||
 	p->flowinfo = u->flowinfo;
 | 
			
		||||
 	p->link = u->link;
 | 
			
		||||
 	p->proto = u->proto;
 | 
			
		||||
@@ -350,7 +350,7 @@ Signed-off-by: Steven Barth <cyrus@openwrt.org>
 | 
			
		||||
 	memcpy(p->name, u->name, sizeof(u->name));
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
@@ -1885,6 +2047,15 @@ static int ip6_tnl_validate(struct nlatt
 | 
			
		||||
@@ -1886,6 +2048,15 @@ static int ip6_tnl_validate(struct nlatt
 | 
			
		||||
 	return 0;
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
@@ -366,7 +366,7 @@ Signed-off-by: Steven Barth <cyrus@openwrt.org>
 | 
			
		||||
 static void ip6_tnl_netlink_parms(struct nlattr *data[],
 | 
			
		||||
 				  struct __ip6_tnl_parm *parms)
 | 
			
		||||
 {
 | 
			
		||||
@@ -1919,6 +2090,46 @@ static void ip6_tnl_netlink_parms(struct
 | 
			
		||||
@@ -1920,6 +2091,46 @@ static void ip6_tnl_netlink_parms(struct
 | 
			
		||||
 
 | 
			
		||||
 	if (data[IFLA_IPTUN_COLLECT_METADATA])
 | 
			
		||||
 		parms->collect_md = true;
 | 
			
		||||
@@ -413,7 +413,7 @@ Signed-off-by: Steven Barth <cyrus@openwrt.org>
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
 static bool ip6_tnl_netlink_encap_parms(struct nlattr *data[],
 | 
			
		||||
@@ -2028,6 +2239,12 @@ static void ip6_tnl_dellink(struct net_d
 | 
			
		||||
@@ -2029,6 +2240,12 @@ static void ip6_tnl_dellink(struct net_d
 | 
			
		||||
 
 | 
			
		||||
 static size_t ip6_tnl_get_size(const struct net_device *dev)
 | 
			
		||||
 {
 | 
			
		||||
@@ -426,7 +426,7 @@ Signed-off-by: Steven Barth <cyrus@openwrt.org>
 | 
			
		||||
 	return
 | 
			
		||||
 		/* IFLA_IPTUN_LINK */
 | 
			
		||||
 		nla_total_size(4) +
 | 
			
		||||
@@ -2055,6 +2272,24 @@ static size_t ip6_tnl_get_size(const str
 | 
			
		||||
@@ -2056,6 +2273,24 @@ static size_t ip6_tnl_get_size(const str
 | 
			
		||||
 		nla_total_size(2) +
 | 
			
		||||
 		/* IFLA_IPTUN_COLLECT_METADATA */
 | 
			
		||||
 		nla_total_size(0) +
 | 
			
		||||
@@ -451,7 +451,7 @@ Signed-off-by: Steven Barth <cyrus@openwrt.org>
 | 
			
		||||
 		0;
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
@@ -2062,6 +2297,9 @@ static int ip6_tnl_fill_info(struct sk_b
 | 
			
		||||
@@ -2063,6 +2298,9 @@ static int ip6_tnl_fill_info(struct sk_b
 | 
			
		||||
 {
 | 
			
		||||
 	struct ip6_tnl *tunnel = netdev_priv(dev);
 | 
			
		||||
 	struct __ip6_tnl_parm *parm = &tunnel->parms;
 | 
			
		||||
@@ -461,7 +461,7 @@ Signed-off-by: Steven Barth <cyrus@openwrt.org>
 | 
			
		||||
 
 | 
			
		||||
 	if (nla_put_u32(skb, IFLA_IPTUN_LINK, parm->link) ||
 | 
			
		||||
 	    nla_put_in6_addr(skb, IFLA_IPTUN_LOCAL, &parm->laddr) ||
 | 
			
		||||
@@ -2070,9 +2308,27 @@ static int ip6_tnl_fill_info(struct sk_b
 | 
			
		||||
@@ -2071,9 +2309,27 @@ static int ip6_tnl_fill_info(struct sk_b
 | 
			
		||||
 	    nla_put_u8(skb, IFLA_IPTUN_ENCAP_LIMIT, parm->encap_limit) ||
 | 
			
		||||
 	    nla_put_be32(skb, IFLA_IPTUN_FLOWINFO, parm->flowinfo) ||
 | 
			
		||||
 	    nla_put_u32(skb, IFLA_IPTUN_FLAGS, parm->flags) ||
 | 
			
		||||
@@ -490,7 +490,7 @@ Signed-off-by: Steven Barth <cyrus@openwrt.org>
 | 
			
		||||
 	if (nla_put_u16(skb, IFLA_IPTUN_ENCAP_TYPE, tunnel->encap.type) ||
 | 
			
		||||
 	    nla_put_be16(skb, IFLA_IPTUN_ENCAP_SPORT, tunnel->encap.sport) ||
 | 
			
		||||
 	    nla_put_be16(skb, IFLA_IPTUN_ENCAP_DPORT, tunnel->encap.dport) ||
 | 
			
		||||
@@ -2110,6 +2366,7 @@ static const struct nla_policy ip6_tnl_p
 | 
			
		||||
@@ -2111,6 +2367,7 @@ static const struct nla_policy ip6_tnl_p
 | 
			
		||||
 	[IFLA_IPTUN_ENCAP_SPORT]	= { .type = NLA_U16 },
 | 
			
		||||
 	[IFLA_IPTUN_ENCAP_DPORT]	= { .type = NLA_U16 },
 | 
			
		||||
 	[IFLA_IPTUN_COLLECT_METADATA]	= { .type = NLA_FLAG },
 | 
			
		||||
 
 | 
			
		||||
@@ -1065,7 +1065,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 | 
			
		||||
 static void mlx5e_set_rx_mode(struct net_device *dev)
 | 
			
		||||
--- a/drivers/net/ethernet/mellanox/mlxsw/spectrum.c
 | 
			
		||||
+++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum.c
 | 
			
		||||
@@ -948,15 +948,13 @@ out:
 | 
			
		||||
@@ -949,15 +949,13 @@ out:
 | 
			
		||||
 /* Return the stats from a cache that is updated periodically,
 | 
			
		||||
  * as this function might get called in an atomic context.
 | 
			
		||||
  */
 | 
			
		||||
 
 | 
			
		||||
@@ -34,7 +34,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 | 
			
		||||
 
 | 
			
		||||
 	return entry->group;
 | 
			
		||||
 }
 | 
			
		||||
@@ -3159,9 +3161,10 @@ static bool amd_iommu_capable(enum iommu
 | 
			
		||||
@@ -3160,9 +3162,10 @@ static bool amd_iommu_capable(enum iommu
 | 
			
		||||
 	return false;
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
@@ -47,7 +47,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 | 
			
		||||
 	struct unity_map_entry *entry;
 | 
			
		||||
 	int devid;
 | 
			
		||||
 
 | 
			
		||||
@@ -3170,41 +3173,56 @@ static void amd_iommu_get_dm_regions(str
 | 
			
		||||
@@ -3171,41 +3174,56 @@ static void amd_iommu_get_dm_regions(str
 | 
			
		||||
 		return;
 | 
			
		||||
 
 | 
			
		||||
 	list_for_each_entry(entry, &amd_iommu_unity_map, list) {
 | 
			
		||||
@@ -118,7 +118,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 | 
			
		||||
 {
 | 
			
		||||
 	struct dma_ops_domain *dma_dom = to_dma_ops_domain(to_pdomain(domain));
 | 
			
		||||
 	unsigned long start, end;
 | 
			
		||||
@@ -3228,9 +3246,9 @@ static const struct iommu_ops amd_iommu_
 | 
			
		||||
@@ -3229,9 +3247,9 @@ static const struct iommu_ops amd_iommu_
 | 
			
		||||
 	.add_device = amd_iommu_add_device,
 | 
			
		||||
 	.remove_device = amd_iommu_remove_device,
 | 
			
		||||
 	.device_group = amd_iommu_device_group,
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,5 @@
 | 
			
		||||
Index: linux-4.9.50/drivers/net/ethernet/mediatek/mtk_eth_soc.c
 | 
			
		||||
===================================================================
 | 
			
		||||
--- linux-4.9.50.orig/drivers/net/ethernet/mediatek/mtk_eth_soc.c
 | 
			
		||||
+++ linux-4.9.50/drivers/net/ethernet/mediatek/mtk_eth_soc.c
 | 
			
		||||
--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
 | 
			
		||||
+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
 | 
			
		||||
@@ -1533,7 +1533,10 @@ static void mtk_hwlro_rx_uninit(struct m
 | 
			
		||||
 	for (i = 0; i < 10; i++) {
 | 
			
		||||
 		val = mtk_r32(eth, MTK_PDMA_LRO_CTRL_DW0);
 | 
			
		||||
 
 | 
			
		||||
@@ -25,7 +25,7 @@ Signed-off-by: John Crispin <blogic@openwrt.org>
 | 
			
		||||
 	bool "SGI IP22 (Indy/Indigo2)"
 | 
			
		||||
--- a/drivers/pinctrl/Kconfig
 | 
			
		||||
+++ b/drivers/pinctrl/Kconfig
 | 
			
		||||
@@ -114,6 +114,11 @@ config PINCTRL_LPC18XX
 | 
			
		||||
@@ -115,6 +115,11 @@ config PINCTRL_LPC18XX
 | 
			
		||||
 	help
 | 
			
		||||
 	  Pinctrl driver for NXP LPC18xx/43xx System Control Unit (SCU).
 | 
			
		||||
 
 | 
			
		||||
 
 | 
			
		||||
@@ -2887,7 +2887,7 @@
 | 
			
		||||
+
 | 
			
		||||
+		/* Display RX ring */
 | 
			
		||||
+		priv->hw->desc->display_ring(head_rx, DMA_RX_SIZE, true);
 | 
			
		||||
 	}
 | 
			
		||||
+	}
 | 
			
		||||
+}
 | 
			
		||||
+
 | 
			
		||||
+static void stmmac_display_tx_rings(struct stmmac_priv *priv)
 | 
			
		||||
@@ -2906,15 +2906,15 @@
 | 
			
		||||
+			head_tx = (void *)tx_q->dma_etx;
 | 
			
		||||
+		else
 | 
			
		||||
+			head_tx = (void *)tx_q->dma_tx;
 | 
			
		||||
+
 | 
			
		||||
+		priv->hw->desc->display_ring(head_tx, DMA_TX_SIZE, false);
 | 
			
		||||
 	}
 | 
			
		||||
+}
 | 
			
		||||
 
 | 
			
		||||
-	/* Display Rx ring */
 | 
			
		||||
-	priv->hw->desc->display_ring(head_rx, DMA_RX_SIZE, true);
 | 
			
		||||
-	/* Display Tx ring */
 | 
			
		||||
-	priv->hw->desc->display_ring(head_tx, DMA_TX_SIZE, false);
 | 
			
		||||
+		priv->hw->desc->display_ring(head_tx, DMA_TX_SIZE, false);
 | 
			
		||||
+	}
 | 
			
		||||
+}
 | 
			
		||||
+
 | 
			
		||||
+static void stmmac_display_rings(struct stmmac_priv *priv)
 | 
			
		||||
+{
 | 
			
		||||
+	/* Display RX ring */
 | 
			
		||||
@@ -3131,7 +3131,7 @@
 | 
			
		||||
 
 | 
			
		||||
 	if (priv->hw->mode->set_16kib_bfsize)
 | 
			
		||||
 		bfsize = priv->hw->mode->set_16kib_bfsize(dev->mtu);
 | 
			
		||||
@@ -1018,235 +1228,409 @@ static int init_dma_desc_rings(struct ne
 | 
			
		||||
@@ -1018,257 +1228,516 @@ static int init_dma_desc_rings(struct ne
 | 
			
		||||
 
 | 
			
		||||
 	priv->dma_buf_sz = bfsize;
 | 
			
		||||
 
 | 
			
		||||
@@ -3163,7 +3163,10 @@
 | 
			
		||||
+				p = &((rx_q->dma_erx + i)->basic);
 | 
			
		||||
+			else
 | 
			
		||||
+				p = rx_q->dma_rx + i;
 | 
			
		||||
+
 | 
			
		||||
 
 | 
			
		||||
-		ret = stmmac_init_rx_buffers(priv, p, i, flags);
 | 
			
		||||
-		if (ret)
 | 
			
		||||
-			goto err_init_rx_buffers;
 | 
			
		||||
+			ret = stmmac_init_rx_buffers(priv, p, i, flags,
 | 
			
		||||
+						     queue);
 | 
			
		||||
+			if (ret)
 | 
			
		||||
@@ -3173,18 +3176,15 @@
 | 
			
		||||
+				  rx_q->rx_skbuff[i], rx_q->rx_skbuff[i]->data,
 | 
			
		||||
+				  (unsigned int)rx_q->rx_skbuff_dma[i]);
 | 
			
		||||
+		}
 | 
			
		||||
 
 | 
			
		||||
-		ret = stmmac_init_rx_buffers(priv, p, i, flags);
 | 
			
		||||
-		if (ret)
 | 
			
		||||
-			goto err_init_rx_buffers;
 | 
			
		||||
+
 | 
			
		||||
+		rx_q->cur_rx = 0;
 | 
			
		||||
+		rx_q->dirty_rx = (unsigned int)(i - DMA_RX_SIZE);
 | 
			
		||||
+
 | 
			
		||||
+		stmmac_clear_rx_descriptors(priv, queue);
 | 
			
		||||
 
 | 
			
		||||
-		netif_dbg(priv, probe, priv->dev, "[%p]\t[%p]\t[%x]\n",
 | 
			
		||||
-			  priv->rx_skbuff[i], priv->rx_skbuff[i]->data,
 | 
			
		||||
-			  (unsigned int)priv->rx_skbuff_dma[i]);
 | 
			
		||||
+		stmmac_clear_rx_descriptors(priv, queue);
 | 
			
		||||
+
 | 
			
		||||
+		/* Setup the chained descriptor addresses */
 | 
			
		||||
+		if (priv->mode == STMMAC_CHAIN_MODE) {
 | 
			
		||||
+			if (priv->extend_desc)
 | 
			
		||||
@@ -3277,8 +3277,13 @@
 | 
			
		||||
+				priv->hw->mode->init(tx_q->dma_tx,
 | 
			
		||||
+						     tx_q->dma_tx_phy,
 | 
			
		||||
+						     DMA_TX_SIZE, 0);
 | 
			
		||||
+		}
 | 
			
		||||
+
 | 
			
		||||
 		}
 | 
			
		||||
 
 | 
			
		||||
-		priv->tx_skbuff_dma[i].buf = 0;
 | 
			
		||||
-		priv->tx_skbuff_dma[i].map_as_page = false;
 | 
			
		||||
-		priv->tx_skbuff_dma[i].len = 0;
 | 
			
		||||
-		priv->tx_skbuff_dma[i].last_segment = false;
 | 
			
		||||
-		priv->tx_skbuff[i] = NULL;
 | 
			
		||||
+		for (i = 0; i < DMA_TX_SIZE; i++) {
 | 
			
		||||
+			struct dma_desc *p;
 | 
			
		||||
+			if (priv->extend_desc)
 | 
			
		||||
@@ -3300,13 +3305,8 @@
 | 
			
		||||
+			tx_q->tx_skbuff_dma[i].len = 0;
 | 
			
		||||
+			tx_q->tx_skbuff_dma[i].last_segment = false;
 | 
			
		||||
+			tx_q->tx_skbuff[i] = NULL;
 | 
			
		||||
 		}
 | 
			
		||||
 
 | 
			
		||||
-		priv->tx_skbuff_dma[i].buf = 0;
 | 
			
		||||
-		priv->tx_skbuff_dma[i].map_as_page = false;
 | 
			
		||||
-		priv->tx_skbuff_dma[i].len = 0;
 | 
			
		||||
-		priv->tx_skbuff_dma[i].last_segment = false;
 | 
			
		||||
-		priv->tx_skbuff[i] = NULL;
 | 
			
		||||
+		}
 | 
			
		||||
+
 | 
			
		||||
+		tx_q->dirty_tx = 0;
 | 
			
		||||
+		tx_q->cur_tx = 0;
 | 
			
		||||
+
 | 
			
		||||
@@ -3387,17 +3387,10 @@
 | 
			
		||||
-						 priv->tx_skbuff_dma[i].buf,
 | 
			
		||||
-						 priv->tx_skbuff_dma[i].len,
 | 
			
		||||
-						 DMA_TO_DEVICE);
 | 
			
		||||
-		}
 | 
			
		||||
+	for (i = 0; i < DMA_TX_SIZE; i++)
 | 
			
		||||
+		stmmac_free_tx_buffer(priv, queue, i);
 | 
			
		||||
+}
 | 
			
		||||
 
 | 
			
		||||
-		if (priv->tx_skbuff[i]) {
 | 
			
		||||
-			dev_kfree_skb_any(priv->tx_skbuff[i]);
 | 
			
		||||
-			priv->tx_skbuff[i] = NULL;
 | 
			
		||||
-			priv->tx_skbuff_dma[i].buf = 0;
 | 
			
		||||
-			priv->tx_skbuff_dma[i].map_as_page = false;
 | 
			
		||||
-		}
 | 
			
		||||
+
 | 
			
		||||
+/**
 | 
			
		||||
+ * free_dma_rx_desc_resources - free RX dma desc resources
 | 
			
		||||
+ * @priv: private structure
 | 
			
		||||
@@ -3426,11 +3419,10 @@
 | 
			
		||||
+
 | 
			
		||||
+		kfree(rx_q->rx_skbuff_dma);
 | 
			
		||||
+		kfree(rx_q->rx_skbuff);
 | 
			
		||||
 	}
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
 /**
 | 
			
		||||
- * alloc_dma_desc_resources - alloc TX/RX resources.
 | 
			
		||||
+	}
 | 
			
		||||
+}
 | 
			
		||||
+
 | 
			
		||||
+/**
 | 
			
		||||
+ * free_dma_tx_desc_resources - free TX dma desc resources
 | 
			
		||||
+ * @priv: private structure
 | 
			
		||||
+ */
 | 
			
		||||
@@ -3463,90 +3455,36 @@
 | 
			
		||||
+
 | 
			
		||||
+/**
 | 
			
		||||
+ * alloc_dma_rx_desc_resources - alloc RX resources.
 | 
			
		||||
  * @priv: private structure
 | 
			
		||||
  * Description: according to which descriptor can be used (extend or basic)
 | 
			
		||||
  * this function allocates the resources for TX and RX paths. In case of
 | 
			
		||||
  * reception, for example, it pre-allocated the RX socket buffer in order to
 | 
			
		||||
  * allow zero-copy mechanism.
 | 
			
		||||
  */
 | 
			
		||||
-static int alloc_dma_desc_resources(struct stmmac_priv *priv)
 | 
			
		||||
+ * @priv: private structure
 | 
			
		||||
+ * Description: according to which descriptor can be used (extend or basic)
 | 
			
		||||
+ * this function allocates the resources for TX and RX paths. In case of
 | 
			
		||||
+ * reception, for example, it pre-allocated the RX socket buffer in order to
 | 
			
		||||
+ * allow zero-copy mechanism.
 | 
			
		||||
+ */
 | 
			
		||||
+static int alloc_dma_rx_desc_resources(struct stmmac_priv *priv)
 | 
			
		||||
 {
 | 
			
		||||
+{
 | 
			
		||||
+	u32 rx_count = priv->plat->rx_queues_to_use;
 | 
			
		||||
 	int ret = -ENOMEM;
 | 
			
		||||
+	int ret = -ENOMEM;
 | 
			
		||||
+	u32 queue;
 | 
			
		||||
 
 | 
			
		||||
-	priv->rx_skbuff_dma = kmalloc_array(DMA_RX_SIZE, sizeof(dma_addr_t),
 | 
			
		||||
-					    GFP_KERNEL);
 | 
			
		||||
-	if (!priv->rx_skbuff_dma)
 | 
			
		||||
-		return -ENOMEM;
 | 
			
		||||
+
 | 
			
		||||
+	/* RX queues buffers and DMA */
 | 
			
		||||
+	for (queue = 0; queue < rx_count; queue++) {
 | 
			
		||||
+		struct stmmac_rx_queue *rx_q = &priv->rx_queue[queue];
 | 
			
		||||
 
 | 
			
		||||
-	priv->rx_skbuff = kmalloc_array(DMA_RX_SIZE, sizeof(struct sk_buff *),
 | 
			
		||||
-					GFP_KERNEL);
 | 
			
		||||
-	if (!priv->rx_skbuff)
 | 
			
		||||
-		goto err_rx_skbuff;
 | 
			
		||||
-
 | 
			
		||||
-	priv->tx_skbuff_dma = kmalloc_array(DMA_TX_SIZE,
 | 
			
		||||
-					    sizeof(*priv->tx_skbuff_dma),
 | 
			
		||||
-					    GFP_KERNEL);
 | 
			
		||||
-	if (!priv->tx_skbuff_dma)
 | 
			
		||||
-		goto err_tx_skbuff_dma;
 | 
			
		||||
-
 | 
			
		||||
-	priv->tx_skbuff = kmalloc_array(DMA_TX_SIZE, sizeof(struct sk_buff *),
 | 
			
		||||
-					GFP_KERNEL);
 | 
			
		||||
-	if (!priv->tx_skbuff)
 | 
			
		||||
-		goto err_tx_skbuff;
 | 
			
		||||
-
 | 
			
		||||
-	if (priv->extend_desc) {
 | 
			
		||||
-		priv->dma_erx = dma_zalloc_coherent(priv->device, DMA_RX_SIZE *
 | 
			
		||||
-						    sizeof(struct
 | 
			
		||||
-							   dma_extended_desc),
 | 
			
		||||
-						    &priv->dma_rx_phy,
 | 
			
		||||
-						    GFP_KERNEL);
 | 
			
		||||
-		if (!priv->dma_erx)
 | 
			
		||||
-			goto err_dma;
 | 
			
		||||
+
 | 
			
		||||
+		rx_q->queue_index = queue;
 | 
			
		||||
+		rx_q->priv_data = priv;
 | 
			
		||||
 
 | 
			
		||||
-		priv->dma_etx = dma_zalloc_coherent(priv->device, DMA_TX_SIZE *
 | 
			
		||||
-						    sizeof(struct
 | 
			
		||||
-							   dma_extended_desc),
 | 
			
		||||
-						    &priv->dma_tx_phy,
 | 
			
		||||
+
 | 
			
		||||
+		rx_q->rx_skbuff_dma = kmalloc_array(DMA_RX_SIZE,
 | 
			
		||||
+						    sizeof(dma_addr_t),
 | 
			
		||||
 						    GFP_KERNEL);
 | 
			
		||||
-		if (!priv->dma_etx) {
 | 
			
		||||
-			dma_free_coherent(priv->device, DMA_RX_SIZE *
 | 
			
		||||
-					  sizeof(struct dma_extended_desc),
 | 
			
		||||
-					  priv->dma_erx, priv->dma_rx_phy);
 | 
			
		||||
-			goto err_dma;
 | 
			
		||||
-		}
 | 
			
		||||
-	} else {
 | 
			
		||||
-		priv->dma_rx = dma_zalloc_coherent(priv->device, DMA_RX_SIZE *
 | 
			
		||||
-						   sizeof(struct dma_desc),
 | 
			
		||||
-						   &priv->dma_rx_phy,
 | 
			
		||||
-						   GFP_KERNEL);
 | 
			
		||||
-		if (!priv->dma_rx)
 | 
			
		||||
-			goto err_dma;
 | 
			
		||||
+						    GFP_KERNEL);
 | 
			
		||||
+		if (!rx_q->rx_skbuff_dma)
 | 
			
		||||
+			return -ENOMEM;
 | 
			
		||||
 
 | 
			
		||||
-		priv->dma_tx = dma_zalloc_coherent(priv->device, DMA_TX_SIZE *
 | 
			
		||||
-						   sizeof(struct dma_desc),
 | 
			
		||||
-						   &priv->dma_tx_phy,
 | 
			
		||||
-						   GFP_KERNEL);
 | 
			
		||||
-		if (!priv->dma_tx) {
 | 
			
		||||
-			dma_free_coherent(priv->device, DMA_RX_SIZE *
 | 
			
		||||
-					  sizeof(struct dma_desc),
 | 
			
		||||
-					  priv->dma_rx, priv->dma_rx_phy);
 | 
			
		||||
+
 | 
			
		||||
+		rx_q->rx_skbuff = kmalloc_array(DMA_RX_SIZE,
 | 
			
		||||
+						sizeof(struct sk_buff *),
 | 
			
		||||
+						GFP_KERNEL);
 | 
			
		||||
+		if (!rx_q->rx_skbuff)
 | 
			
		||||
 			goto err_dma;
 | 
			
		||||
+			goto err_dma;
 | 
			
		||||
+
 | 
			
		||||
+		if (priv->extend_desc) {
 | 
			
		||||
+			rx_q->dma_erx = dma_zalloc_coherent(priv->device,
 | 
			
		||||
@@ -3567,19 +3505,12 @@
 | 
			
		||||
+							   GFP_KERNEL);
 | 
			
		||||
+			if (!rx_q->dma_rx)
 | 
			
		||||
+				goto err_dma;
 | 
			
		||||
 		}
 | 
			
		||||
 	}
 | 
			
		||||
 
 | 
			
		||||
 	return 0;
 | 
			
		||||
 
 | 
			
		||||
 err_dma:
 | 
			
		||||
-	kfree(priv->tx_skbuff);
 | 
			
		||||
-err_tx_skbuff:
 | 
			
		||||
-	kfree(priv->tx_skbuff_dma);
 | 
			
		||||
-err_tx_skbuff_dma:
 | 
			
		||||
-	kfree(priv->rx_skbuff);
 | 
			
		||||
-err_rx_skbuff:
 | 
			
		||||
-	kfree(priv->rx_skbuff_dma);
 | 
			
		||||
+		}
 | 
			
		||||
+	}
 | 
			
		||||
+
 | 
			
		||||
+	return 0;
 | 
			
		||||
+
 | 
			
		||||
+err_dma:
 | 
			
		||||
+	free_dma_rx_desc_resources(priv);
 | 
			
		||||
+
 | 
			
		||||
+	return ret;
 | 
			
		||||
@@ -3636,7 +3567,7 @@
 | 
			
		||||
+							   GFP_KERNEL);
 | 
			
		||||
+			if (!tx_q->dma_tx)
 | 
			
		||||
+				goto err_dma_buffers;
 | 
			
		||||
+		}
 | 
			
		||||
 		}
 | 
			
		||||
+	}
 | 
			
		||||
+
 | 
			
		||||
+	return 0;
 | 
			
		||||
@@ -3644,9 +3575,9 @@
 | 
			
		||||
+err_dma_buffers:
 | 
			
		||||
+	free_dma_tx_desc_resources(priv);
 | 
			
		||||
+
 | 
			
		||||
 	return ret;
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
+	return ret;
 | 
			
		||||
+}
 | 
			
		||||
+
 | 
			
		||||
+/**
 | 
			
		||||
+ * alloc_dma_desc_resources - alloc TX/RX resources.
 | 
			
		||||
+ * @priv: private structure
 | 
			
		||||
@@ -3672,7 +3603,176 @@
 | 
			
		||||
+ * free_dma_desc_resources - free dma desc resources
 | 
			
		||||
+ * @priv: private structure
 | 
			
		||||
+ */
 | 
			
		||||
 static void free_dma_desc_resources(struct stmmac_priv *priv)
 | 
			
		||||
+static void free_dma_desc_resources(struct stmmac_priv *priv)
 | 
			
		||||
+{
 | 
			
		||||
+	/* Release the DMA RX socket buffers */
 | 
			
		||||
+	free_dma_rx_desc_resources(priv);
 | 
			
		||||
+
 | 
			
		||||
+	/* Release the DMA TX socket buffers */
 | 
			
		||||
+	free_dma_tx_desc_resources(priv);
 | 
			
		||||
+}
 | 
			
		||||
+
 | 
			
		||||
+/**
 | 
			
		||||
+ *  stmmac_mac_enable_rx_queues - Enable MAC rx queues
 | 
			
		||||
+ *  @priv: driver private structure
 | 
			
		||||
+ *  Description: It is used for enabling the rx queues in the MAC
 | 
			
		||||
+ */
 | 
			
		||||
+static void stmmac_mac_enable_rx_queues(struct stmmac_priv *priv)
 | 
			
		||||
+{
 | 
			
		||||
+	u32 rx_queues_count = priv->plat->rx_queues_to_use;
 | 
			
		||||
+	int queue;
 | 
			
		||||
+	u8 mode;
 | 
			
		||||
 
 | 
			
		||||
-		if (priv->tx_skbuff[i]) {
 | 
			
		||||
-			dev_kfree_skb_any(priv->tx_skbuff[i]);
 | 
			
		||||
-			priv->tx_skbuff[i] = NULL;
 | 
			
		||||
-			priv->tx_skbuff_dma[i].buf = 0;
 | 
			
		||||
-			priv->tx_skbuff_dma[i].map_as_page = false;
 | 
			
		||||
-		}
 | 
			
		||||
+	for (queue = 0; queue < rx_queues_count; queue++) {
 | 
			
		||||
+		mode = priv->plat->rx_queues_cfg[queue].mode_to_use;
 | 
			
		||||
+		priv->hw->mac->rx_queue_enable(priv->hw, mode, queue);
 | 
			
		||||
 	}
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
 /**
 | 
			
		||||
- * alloc_dma_desc_resources - alloc TX/RX resources.
 | 
			
		||||
- * @priv: private structure
 | 
			
		||||
- * Description: according to which descriptor can be used (extend or basic)
 | 
			
		||||
- * this function allocates the resources for TX and RX paths. In case of
 | 
			
		||||
- * reception, for example, it pre-allocated the RX socket buffer in order to
 | 
			
		||||
- * allow zero-copy mechanism.
 | 
			
		||||
+ * stmmac_start_rx_dma - start RX DMA channel
 | 
			
		||||
+ * @priv: driver private structure
 | 
			
		||||
+ * @chan: RX channel index
 | 
			
		||||
+ * Description:
 | 
			
		||||
+ * This starts a RX DMA channel
 | 
			
		||||
  */
 | 
			
		||||
-static int alloc_dma_desc_resources(struct stmmac_priv *priv)
 | 
			
		||||
+static void stmmac_start_rx_dma(struct stmmac_priv *priv, u32 chan)
 | 
			
		||||
 {
 | 
			
		||||
-	int ret = -ENOMEM;
 | 
			
		||||
-
 | 
			
		||||
-	priv->rx_skbuff_dma = kmalloc_array(DMA_RX_SIZE, sizeof(dma_addr_t),
 | 
			
		||||
-					    GFP_KERNEL);
 | 
			
		||||
-	if (!priv->rx_skbuff_dma)
 | 
			
		||||
-		return -ENOMEM;
 | 
			
		||||
-
 | 
			
		||||
-	priv->rx_skbuff = kmalloc_array(DMA_RX_SIZE, sizeof(struct sk_buff *),
 | 
			
		||||
-					GFP_KERNEL);
 | 
			
		||||
-	if (!priv->rx_skbuff)
 | 
			
		||||
-		goto err_rx_skbuff;
 | 
			
		||||
-
 | 
			
		||||
-	priv->tx_skbuff_dma = kmalloc_array(DMA_TX_SIZE,
 | 
			
		||||
-					    sizeof(*priv->tx_skbuff_dma),
 | 
			
		||||
-					    GFP_KERNEL);
 | 
			
		||||
-	if (!priv->tx_skbuff_dma)
 | 
			
		||||
-		goto err_tx_skbuff_dma;
 | 
			
		||||
-
 | 
			
		||||
-	priv->tx_skbuff = kmalloc_array(DMA_TX_SIZE, sizeof(struct sk_buff *),
 | 
			
		||||
-					GFP_KERNEL);
 | 
			
		||||
-	if (!priv->tx_skbuff)
 | 
			
		||||
-		goto err_tx_skbuff;
 | 
			
		||||
-
 | 
			
		||||
-	if (priv->extend_desc) {
 | 
			
		||||
-		priv->dma_erx = dma_zalloc_coherent(priv->device, DMA_RX_SIZE *
 | 
			
		||||
-						    sizeof(struct
 | 
			
		||||
-							   dma_extended_desc),
 | 
			
		||||
-						    &priv->dma_rx_phy,
 | 
			
		||||
-						    GFP_KERNEL);
 | 
			
		||||
-		if (!priv->dma_erx)
 | 
			
		||||
-			goto err_dma;
 | 
			
		||||
-
 | 
			
		||||
-		priv->dma_etx = dma_zalloc_coherent(priv->device, DMA_TX_SIZE *
 | 
			
		||||
-						    sizeof(struct
 | 
			
		||||
-							   dma_extended_desc),
 | 
			
		||||
-						    &priv->dma_tx_phy,
 | 
			
		||||
-						    GFP_KERNEL);
 | 
			
		||||
-		if (!priv->dma_etx) {
 | 
			
		||||
-			dma_free_coherent(priv->device, DMA_RX_SIZE *
 | 
			
		||||
-					  sizeof(struct dma_extended_desc),
 | 
			
		||||
-					  priv->dma_erx, priv->dma_rx_phy);
 | 
			
		||||
-			goto err_dma;
 | 
			
		||||
-		}
 | 
			
		||||
-	} else {
 | 
			
		||||
-		priv->dma_rx = dma_zalloc_coherent(priv->device, DMA_RX_SIZE *
 | 
			
		||||
-						   sizeof(struct dma_desc),
 | 
			
		||||
-						   &priv->dma_rx_phy,
 | 
			
		||||
-						   GFP_KERNEL);
 | 
			
		||||
-		if (!priv->dma_rx)
 | 
			
		||||
-			goto err_dma;
 | 
			
		||||
+	netdev_dbg(priv->dev, "DMA RX processes started in channel %d\n", chan);
 | 
			
		||||
+	priv->hw->dma->start_rx(priv->ioaddr, chan);
 | 
			
		||||
+}
 | 
			
		||||
 
 | 
			
		||||
-		priv->dma_tx = dma_zalloc_coherent(priv->device, DMA_TX_SIZE *
 | 
			
		||||
-						   sizeof(struct dma_desc),
 | 
			
		||||
-						   &priv->dma_tx_phy,
 | 
			
		||||
-						   GFP_KERNEL);
 | 
			
		||||
-		if (!priv->dma_tx) {
 | 
			
		||||
-			dma_free_coherent(priv->device, DMA_RX_SIZE *
 | 
			
		||||
-					  sizeof(struct dma_desc),
 | 
			
		||||
-					  priv->dma_rx, priv->dma_rx_phy);
 | 
			
		||||
-			goto err_dma;
 | 
			
		||||
-		}
 | 
			
		||||
-	}
 | 
			
		||||
+/**
 | 
			
		||||
+ * stmmac_start_tx_dma - start TX DMA channel
 | 
			
		||||
+ * @priv: driver private structure
 | 
			
		||||
+ * @chan: TX channel index
 | 
			
		||||
+ * Description:
 | 
			
		||||
+ * This starts a TX DMA channel
 | 
			
		||||
+ */
 | 
			
		||||
+static void stmmac_start_tx_dma(struct stmmac_priv *priv, u32 chan)
 | 
			
		||||
+{
 | 
			
		||||
+	netdev_dbg(priv->dev, "DMA TX processes started in channel %d\n", chan);
 | 
			
		||||
+	priv->hw->dma->start_tx(priv->ioaddr, chan);
 | 
			
		||||
+}
 | 
			
		||||
 
 | 
			
		||||
-	return 0;
 | 
			
		||||
+/**
 | 
			
		||||
+ * stmmac_stop_rx_dma - stop RX DMA channel
 | 
			
		||||
+ * @priv: driver private structure
 | 
			
		||||
+ * @chan: RX channel index
 | 
			
		||||
+ * Description:
 | 
			
		||||
+ * This stops a RX DMA channel
 | 
			
		||||
+ */
 | 
			
		||||
+static void stmmac_stop_rx_dma(struct stmmac_priv *priv, u32 chan)
 | 
			
		||||
+{
 | 
			
		||||
+	netdev_dbg(priv->dev, "DMA RX processes stopped in channel %d\n", chan);
 | 
			
		||||
+	priv->hw->dma->stop_rx(priv->ioaddr, chan);
 | 
			
		||||
+}
 | 
			
		||||
 
 | 
			
		||||
-err_dma:
 | 
			
		||||
-	kfree(priv->tx_skbuff);
 | 
			
		||||
-err_tx_skbuff:
 | 
			
		||||
-	kfree(priv->tx_skbuff_dma);
 | 
			
		||||
-err_tx_skbuff_dma:
 | 
			
		||||
-	kfree(priv->rx_skbuff);
 | 
			
		||||
-err_rx_skbuff:
 | 
			
		||||
-	kfree(priv->rx_skbuff_dma);
 | 
			
		||||
-	return ret;
 | 
			
		||||
+/**
 | 
			
		||||
+ * stmmac_stop_tx_dma - stop TX DMA channel
 | 
			
		||||
+ * @priv: driver private structure
 | 
			
		||||
+ * @chan: TX channel index
 | 
			
		||||
+ * Description:
 | 
			
		||||
+ * This stops a TX DMA channel
 | 
			
		||||
+ */
 | 
			
		||||
+static void stmmac_stop_tx_dma(struct stmmac_priv *priv, u32 chan)
 | 
			
		||||
+{
 | 
			
		||||
+	netdev_dbg(priv->dev, "DMA TX processes stopped in channel %d\n", chan);
 | 
			
		||||
+	priv->hw->dma->stop_tx(priv->ioaddr, chan);
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
-static void free_dma_desc_resources(struct stmmac_priv *priv)
 | 
			
		||||
+/**
 | 
			
		||||
+ * stmmac_start_all_dma - start all RX and TX DMA channels
 | 
			
		||||
+ * @priv: driver private structure
 | 
			
		||||
+ * Description:
 | 
			
		||||
+ * This starts all the RX and TX DMA channels
 | 
			
		||||
+ */
 | 
			
		||||
+static void stmmac_start_all_dma(struct stmmac_priv *priv)
 | 
			
		||||
 {
 | 
			
		||||
-	/* Release the DMA TX/RX socket buffers */
 | 
			
		||||
-	dma_free_rx_skbufs(priv);
 | 
			
		||||
@@ -3698,99 +3798,6 @@
 | 
			
		||||
-	kfree(priv->rx_skbuff);
 | 
			
		||||
-	kfree(priv->tx_skbuff_dma);
 | 
			
		||||
-	kfree(priv->tx_skbuff);
 | 
			
		||||
+	/* Release the DMA RX socket buffers */
 | 
			
		||||
+	free_dma_rx_desc_resources(priv);
 | 
			
		||||
+
 | 
			
		||||
+	/* Release the DMA TX socket buffers */
 | 
			
		||||
+	free_dma_tx_desc_resources(priv);
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
 /**
 | 
			
		||||
@@ -1256,19 +1640,104 @@ static void free_dma_desc_resources(stru
 | 
			
		||||
  */
 | 
			
		||||
 static void stmmac_mac_enable_rx_queues(struct stmmac_priv *priv)
 | 
			
		||||
 {
 | 
			
		||||
-	int rx_count = priv->dma_cap.number_rx_queues;
 | 
			
		||||
-	int queue = 0;
 | 
			
		||||
+	u32 rx_queues_count = priv->plat->rx_queues_to_use;
 | 
			
		||||
+	int queue;
 | 
			
		||||
+	u8 mode;
 | 
			
		||||
 
 | 
			
		||||
-	/* If GMAC does not have multiple queues, then this is not necessary*/
 | 
			
		||||
-	if (rx_count == 1)
 | 
			
		||||
-		return;
 | 
			
		||||
+	for (queue = 0; queue < rx_queues_count; queue++) {
 | 
			
		||||
+		mode = priv->plat->rx_queues_cfg[queue].mode_to_use;
 | 
			
		||||
+		priv->hw->mac->rx_queue_enable(priv->hw, mode, queue);
 | 
			
		||||
+	}
 | 
			
		||||
+}
 | 
			
		||||
 
 | 
			
		||||
-	/**
 | 
			
		||||
-	 *  If the core is synthesized with multiple rx queues / multiple
 | 
			
		||||
-	 *  dma channels, then rx queues will be disabled by default.
 | 
			
		||||
-	 *  For now only rx queue 0 is enabled.
 | 
			
		||||
-	 */
 | 
			
		||||
-	priv->hw->mac->rx_queue_enable(priv->hw, queue);
 | 
			
		||||
+/**
 | 
			
		||||
+ * stmmac_start_rx_dma - start RX DMA channel
 | 
			
		||||
+ * @priv: driver private structure
 | 
			
		||||
+ * @chan: RX channel index
 | 
			
		||||
+ * Description:
 | 
			
		||||
+ * This starts a RX DMA channel
 | 
			
		||||
+ */
 | 
			
		||||
+static void stmmac_start_rx_dma(struct stmmac_priv *priv, u32 chan)
 | 
			
		||||
+{
 | 
			
		||||
+	netdev_dbg(priv->dev, "DMA RX processes started in channel %d\n", chan);
 | 
			
		||||
+	priv->hw->dma->start_rx(priv->ioaddr, chan);
 | 
			
		||||
+}
 | 
			
		||||
+
 | 
			
		||||
+/**
 | 
			
		||||
+ * stmmac_start_tx_dma - start TX DMA channel
 | 
			
		||||
+ * @priv: driver private structure
 | 
			
		||||
+ * @chan: TX channel index
 | 
			
		||||
+ * Description:
 | 
			
		||||
+ * This starts a TX DMA channel
 | 
			
		||||
+ */
 | 
			
		||||
+static void stmmac_start_tx_dma(struct stmmac_priv *priv, u32 chan)
 | 
			
		||||
+{
 | 
			
		||||
+	netdev_dbg(priv->dev, "DMA TX processes started in channel %d\n", chan);
 | 
			
		||||
+	priv->hw->dma->start_tx(priv->ioaddr, chan);
 | 
			
		||||
+}
 | 
			
		||||
+
 | 
			
		||||
+/**
 | 
			
		||||
+ * stmmac_stop_rx_dma - stop RX DMA channel
 | 
			
		||||
+ * @priv: driver private structure
 | 
			
		||||
+ * @chan: RX channel index
 | 
			
		||||
+ * Description:
 | 
			
		||||
+ * This stops a RX DMA channel
 | 
			
		||||
+ */
 | 
			
		||||
+static void stmmac_stop_rx_dma(struct stmmac_priv *priv, u32 chan)
 | 
			
		||||
+{
 | 
			
		||||
+	netdev_dbg(priv->dev, "DMA RX processes stopped in channel %d\n", chan);
 | 
			
		||||
+	priv->hw->dma->stop_rx(priv->ioaddr, chan);
 | 
			
		||||
+}
 | 
			
		||||
+
 | 
			
		||||
+/**
 | 
			
		||||
+ * stmmac_stop_tx_dma - stop TX DMA channel
 | 
			
		||||
+ * @priv: driver private structure
 | 
			
		||||
+ * @chan: TX channel index
 | 
			
		||||
+ * Description:
 | 
			
		||||
+ * This stops a TX DMA channel
 | 
			
		||||
+ */
 | 
			
		||||
+static void stmmac_stop_tx_dma(struct stmmac_priv *priv, u32 chan)
 | 
			
		||||
+{
 | 
			
		||||
+	netdev_dbg(priv->dev, "DMA TX processes stopped in channel %d\n", chan);
 | 
			
		||||
+	priv->hw->dma->stop_tx(priv->ioaddr, chan);
 | 
			
		||||
+}
 | 
			
		||||
+
 | 
			
		||||
+/**
 | 
			
		||||
+ * stmmac_start_all_dma - start all RX and TX DMA channels
 | 
			
		||||
+ * @priv: driver private structure
 | 
			
		||||
+ * Description:
 | 
			
		||||
+ * This starts all the RX and TX DMA channels
 | 
			
		||||
+ */
 | 
			
		||||
+static void stmmac_start_all_dma(struct stmmac_priv *priv)
 | 
			
		||||
+{
 | 
			
		||||
+	u32 rx_channels_count = priv->plat->rx_queues_to_use;
 | 
			
		||||
+	u32 tx_channels_count = priv->plat->tx_queues_to_use;
 | 
			
		||||
+	u32 chan = 0;
 | 
			
		||||
@@ -3800,23 +3807,38 @@
 | 
			
		||||
+
 | 
			
		||||
+	for (chan = 0; chan < tx_channels_count; chan++)
 | 
			
		||||
+		stmmac_start_tx_dma(priv, chan);
 | 
			
		||||
+}
 | 
			
		||||
+
 | 
			
		||||
+/**
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
 /**
 | 
			
		||||
- *  stmmac_mac_enable_rx_queues - Enable MAC rx queues
 | 
			
		||||
- *  @priv: driver private structure
 | 
			
		||||
- *  Description: It is used for enabling the rx queues in the MAC
 | 
			
		||||
+ * stmmac_stop_all_dma - stop all RX and TX DMA channels
 | 
			
		||||
+ * @priv: driver private structure
 | 
			
		||||
+ * Description:
 | 
			
		||||
+ * This stops the RX and TX DMA channels
 | 
			
		||||
+ */
 | 
			
		||||
  */
 | 
			
		||||
-static void stmmac_mac_enable_rx_queues(struct stmmac_priv *priv)
 | 
			
		||||
+static void stmmac_stop_all_dma(struct stmmac_priv *priv)
 | 
			
		||||
+{
 | 
			
		||||
 {
 | 
			
		||||
-	int rx_count = priv->dma_cap.number_rx_queues;
 | 
			
		||||
-	int queue = 0;
 | 
			
		||||
+	u32 rx_channels_count = priv->plat->rx_queues_to_use;
 | 
			
		||||
+	u32 tx_channels_count = priv->plat->tx_queues_to_use;
 | 
			
		||||
+	u32 chan = 0;
 | 
			
		||||
+
 | 
			
		||||
 
 | 
			
		||||
-	/* If GMAC does not have multiple queues, then this is not necessary*/
 | 
			
		||||
-	if (rx_count == 1)
 | 
			
		||||
-		return;
 | 
			
		||||
+	for (chan = 0; chan < rx_channels_count; chan++)
 | 
			
		||||
+		stmmac_stop_rx_dma(priv, chan);
 | 
			
		||||
+
 | 
			
		||||
 
 | 
			
		||||
-	/**
 | 
			
		||||
-	 *  If the core is synthesized with multiple rx queues / multiple
 | 
			
		||||
-	 *  dma channels, then rx queues will be disabled by default.
 | 
			
		||||
-	 *  For now only rx queue 0 is enabled.
 | 
			
		||||
-	 */
 | 
			
		||||
-	priv->hw->mac->rx_queue_enable(priv->hw, queue);
 | 
			
		||||
+	for (chan = 0; chan < tx_channels_count; chan++)
 | 
			
		||||
+		stmmac_stop_tx_dma(priv, chan);
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,5 @@
 | 
			
		||||
Index: linux-4.9.51/arch/arm/boot/dts/sun8i-h3-nanopi-neo.dts
 | 
			
		||||
===================================================================
 | 
			
		||||
--- linux-4.9.51.orig/arch/arm/boot/dts/sun8i-h3-nanopi-neo.dts
 | 
			
		||||
+++ linux-4.9.51/arch/arm/boot/dts/sun8i-h3-nanopi-neo.dts
 | 
			
		||||
--- a/arch/arm/boot/dts/sun8i-h3-nanopi-neo.dts
 | 
			
		||||
+++ b/arch/arm/boot/dts/sun8i-h3-nanopi-neo.dts
 | 
			
		||||
@@ -53,6 +53,7 @@
 | 
			
		||||
 
 | 
			
		||||
 	aliases {
 | 
			
		||||
 
 | 
			
		||||
@@ -7,10 +7,8 @@ Subject: [PATCH] ARM: dts: sun8i: nanopi-neo: enable UART, USB and I2C pins
 | 
			
		||||
 arch/arm/boot/dts/sun8i-h3-nanopi-neo.dts | 43 ++++++++++++++++++++++++++++---
 | 
			
		||||
 1 file changed, 40 insertions(+), 3 deletions(-)
 | 
			
		||||
 | 
			
		||||
Index: linux-4.9.51/arch/arm/boot/dts/sun8i-h3-nanopi-neo.dts
 | 
			
		||||
===================================================================
 | 
			
		||||
--- linux-4.9.51.orig/arch/arm/boot/dts/sun8i-h3-nanopi-neo.dts
 | 
			
		||||
+++ linux-4.9.51/arch/arm/boot/dts/sun8i-h3-nanopi-neo.dts
 | 
			
		||||
--- a/arch/arm/boot/dts/sun8i-h3-nanopi-neo.dts
 | 
			
		||||
+++ b/arch/arm/boot/dts/sun8i-h3-nanopi-neo.dts
 | 
			
		||||
@@ -78,10 +78,30 @@
 | 
			
		||||
 	};
 | 
			
		||||
 };
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user