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:
parent
060e37567e
commit
886d66abcd
22 changed files with 291 additions and 275 deletions
|
@ -4,11 +4,11 @@ LINUX_RELEASE?=1
|
||||||
|
|
||||||
LINUX_VERSION-3.18 = .71
|
LINUX_VERSION-3.18 = .71
|
||||||
LINUX_VERSION-4.4 = .92
|
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-3.18.71 = 5abc9778ad44ce02ed6c8ab52ece8a21c6d20d21f6ed8a19287b4a38a50c1240
|
||||||
LINUX_KERNEL_HASH-4.4.92 = 53f8cd8b024444df0f242f8e6ab5147b0b009d7a30e8b2ed3854e8d17937460d
|
LINUX_KERNEL_HASH-4.4.92 = 53f8cd8b024444df0f242f8e6ab5147b0b009d7a30e8b2ed3854e8d17937460d
|
||||||
LINUX_KERNEL_HASH-4.9.54 = 651005db6efbce4fcd607415ebd697dd8d2f5a2abc2c632b11ece03a1a210fc5
|
LINUX_KERNEL_HASH-4.9.57 = 09230554ec6a34a12e2d2a6b32733aed3c9bc90b1662cc1b06dd67bf726c96a6
|
||||||
|
|
||||||
ifdef KERNEL_PATCHVER
|
ifdef KERNEL_PATCHVER
|
||||||
LINUX_VERSION:=$(KERNEL_PATCHVER)$(strip $(LINUX_VERSION-$(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.h"
|
||||||
#include "xhci-trace.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) { }
|
static void xhci_pme_acpi_rtd3_enable(struct pci_dev *dev) { }
|
||||||
#endif /* CONFIG_ACPI */
|
#endif /* CONFIG_ACPI */
|
||||||
|
|
||||||
|
@ -503,7 +503,7 @@ Signed-off-by: Christian Lamparter <chunkeey@googlemail.com>
|
||||||
/* called during probe() after chip reset completes */
|
/* called during probe() after chip reset completes */
|
||||||
static int xhci_pci_setup(struct usb_hcd *hcd)
|
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 hc_driver *driver;
|
||||||
struct usb_hcd *hcd;
|
struct usb_hcd *hcd;
|
||||||
|
|
||||||
|
@ -526,7 +526,7 @@ Signed-off-by: Christian Lamparter <chunkeey@googlemail.com>
|
||||||
driver = (struct hc_driver *)id->driver_data;
|
driver = (struct hc_driver *)id->driver_data;
|
||||||
|
|
||||||
/* Prevent runtime suspending between USB-2 and USB-3 initialization */
|
/* 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;
|
struct xhci_hcd *xhci;
|
||||||
|
|
||||||
|
|
|
@ -13,7 +13,7 @@ produce a noisy warning.
|
||||||
|
|
||||||
--- a/drivers/usb/host/xhci-pci.c
|
--- a/drivers/usb/host/xhci-pci.c
|
||||||
+++ b/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 &&
|
if (pdev->vendor == PCI_VENDOR_ID_RENESAS &&
|
||||||
pdev->device == 0x0015)
|
pdev->device == 0x0015)
|
||||||
|
|
|
@ -129,7 +129,7 @@ it on BCM4708 family.
|
||||||
+++ b/drivers/usb/host/xhci.h
|
+++ b/drivers/usb/host/xhci.h
|
||||||
@@ -1662,6 +1662,7 @@ struct xhci_hcd {
|
@@ -1662,6 +1662,7 @@ struct xhci_hcd {
|
||||||
#define XHCI_LIMIT_ENDPOINT_INTERVAL_7 (1 << 26)
|
#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_ASMEDIA_MODIFY_FLOWCONTROL (1 << 28)
|
||||||
+#define XHCI_FAKE_DOORBELL (1 << 29)
|
+#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_param_named(mousepoll, hid_mousepoll_interval, uint, 0644);
|
||||||
MODULE_PARM_DESC(mousepoll, "Polling interval of mice");
|
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. */
|
/* Change the polling interval of mice. */
|
||||||
|
|
|
@ -21,7 +21,7 @@ Signed-off-by: Eric Anholt <eric@anholt.net>
|
||||||
}
|
}
|
||||||
kfree(pagelist);
|
kfree(pagelist);
|
||||||
if (actual_pages == 0)
|
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;
|
offset = 0;
|
||||||
set_page_dirty(pg);
|
set_page_dirty(pg);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
--- a/drivers/net/phy/broadcom.c
|
--- a/drivers/net/phy/broadcom.c
|
||||||
+++ b/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. */
|
/* Write bits 14:0. */
|
||||||
reg |= (1 << 15);
|
reg |= (1 << 15);
|
||||||
phy_write(phydev, 0x18, reg);
|
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);
|
nval = cmpxchg(&tp->tsq_flags, oval, nval);
|
||||||
if (nval != oval)
|
if (nval != oval)
|
||||||
continue;
|
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)))
|
unlikely(tso_fragment(sk, skb, limit, mss_now, gfp)))
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
|
@ -19,7 +19,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||||
|
|
||||||
--- a/net/ipv4/tcp_output.c
|
--- a/net/ipv4/tcp_output.c
|
||||||
+++ b/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;
|
limit <<= factor;
|
||||||
|
|
||||||
if (atomic_read(&sk->sk_wmem_alloc) > limit) {
|
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
|
--- a/net/ipv4/tcp_output.c
|
||||||
+++ b/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)
|
static int tcp_mtu_probe(struct sock *sk)
|
||||||
{
|
{
|
||||||
|
|
|
@ -114,7 +114,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||||
if (nval != oval)
|
if (nval != oval)
|
||||||
continue;
|
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)
|
skb->prev == sk->sk_write_queue.next)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
@ -123,7 +123,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||||
/* It is possible TX completion already happened
|
/* It is possible TX completion already happened
|
||||||
* before we set TSQ_THROTTLED, so we must
|
* before we set TSQ_THROTTLED, so we must
|
||||||
* test again the condition.
|
* 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)))
|
unlikely(tso_fragment(sk, skb, limit, mss_now, gfp)))
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -134,7 +134,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||||
if (tcp_small_queue_check(sk, skb, 0))
|
if (tcp_small_queue_check(sk, skb, 0))
|
||||||
break;
|
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
|
/* We do not want pure acks influencing TCP Small Queues or fq/pacing
|
||||||
* too much.
|
* too much.
|
||||||
* SKB_TRUESIZE(max(1 .. 66, MAX_TCP_HEADER)) is unfortunately ~784
|
* 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);
|
EXPORT_SYMBOL(default_qdisc_ops);
|
||||||
|
|
||||||
/* Main transmission queue. */
|
/* 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)
|
void *_unused)
|
||||||
{
|
{
|
||||||
struct Qdisc *qdisc;
|
struct Qdisc *qdisc;
|
||||||
|
|
|
@ -327,7 +327,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||||
|
|
||||||
--- a/net/core/sock.c
|
--- a/net/core/sock.c
|
||||||
+++ b/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)
|
static int __init proto_init(void)
|
||||||
{
|
{
|
||||||
|
|
|
@ -30,7 +30,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||||
#define PACKET_FANOUT_LB 1
|
#define PACKET_FANOUT_LB 1
|
||||||
--- a/net/packet/af_packet.c
|
--- a/net/packet/af_packet.c
|
||||||
+++ b/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 sock *sk;
|
||||||
struct sockaddr_pkt *spkt;
|
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
|
* 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;
|
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
|
* 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.
|
* so that this procedure is noop.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
@ -55,7 +55,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
if (!net_eq(dev_net(dev), sock_net(sk)))
|
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;
|
unsigned int snaplen, res;
|
||||||
bool is_drop_n_account = false;
|
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)))
|
if (!net_eq(dev_net(dev), sock_net(sk)))
|
||||||
goto drop;
|
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.h2)) != 32);
|
||||||
BUILD_BUG_ON(TPACKET_ALIGN(sizeof(*h.h3)) != 48);
|
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)))
|
if (!net_eq(dev_net(dev), sock_net(sk)))
|
||||||
goto drop;
|
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);
|
mutex_init(&po->pg_vec_lock);
|
||||||
po->rollover = NULL;
|
po->rollover = NULL;
|
||||||
po->prot_hook.func = packet_rcv;
|
po->prot_hook.func = packet_rcv;
|
||||||
|
@ -95,7 +95,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||||
|
|
||||||
if (sock->type == SOCK_PACKET)
|
if (sock->type == SOCK_PACKET)
|
||||||
po->prot_hook.func = packet_rcv_spkt;
|
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;
|
po->xmit = val ? packet_direct_xmit : dev_queue_xmit;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -112,7 +112,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||||
default:
|
default:
|
||||||
return -ENOPROTOOPT;
|
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:
|
case PACKET_VNET_HDR:
|
||||||
val = po->has_vnet_hdr;
|
val = po->has_vnet_hdr;
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -300,7 +300,7 @@ Signed-off-by: Steven Barth <cyrus@openwrt.org>
|
||||||
/**
|
/**
|
||||||
* ip6_tnl_addr_conflict - compare packet addresses to tunnel's own
|
* ip6_tnl_addr_conflict - compare packet addresses to tunnel's own
|
||||||
* @t: the outgoing tunnel device
|
* @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 ip6_tnl *t = netdev_priv(dev);
|
||||||
struct ipv6hdr *ipv6h = ipv6_hdr(skb);
|
struct ipv6hdr *ipv6h = ipv6_hdr(skb);
|
||||||
|
@ -308,7 +308,7 @@ Signed-off-by: Steven Barth <cyrus@openwrt.org>
|
||||||
int encap_limit = -1;
|
int encap_limit = -1;
|
||||||
__u16 offset;
|
__u16 offset;
|
||||||
struct flowi6 fl6;
|
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;
|
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))
|
if (iptunnel_handle_offloads(skb, SKB_GSO_IPXIP6))
|
||||||
return -1;
|
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.flowinfo = p->flowinfo;
|
||||||
t->parms.link = p->link;
|
t->parms.link = p->link;
|
||||||
t->parms.proto = p->proto;
|
t->parms.proto = p->proto;
|
||||||
|
@ -342,7 +342,7 @@ Signed-off-by: Steven Barth <cyrus@openwrt.org>
|
||||||
dst_cache_reset(&t->dst_cache);
|
dst_cache_reset(&t->dst_cache);
|
||||||
ip6_tnl_link_config(t);
|
ip6_tnl_link_config(t);
|
||||||
return 0;
|
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->flowinfo = u->flowinfo;
|
||||||
p->link = u->link;
|
p->link = u->link;
|
||||||
p->proto = u->proto;
|
p->proto = u->proto;
|
||||||
|
@ -350,7 +350,7 @@ Signed-off-by: Steven Barth <cyrus@openwrt.org>
|
||||||
memcpy(p->name, u->name, sizeof(u->name));
|
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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -366,7 +366,7 @@ Signed-off-by: Steven Barth <cyrus@openwrt.org>
|
||||||
static void ip6_tnl_netlink_parms(struct nlattr *data[],
|
static void ip6_tnl_netlink_parms(struct nlattr *data[],
|
||||||
struct __ip6_tnl_parm *parms)
|
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])
|
if (data[IFLA_IPTUN_COLLECT_METADATA])
|
||||||
parms->collect_md = true;
|
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[],
|
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)
|
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
|
return
|
||||||
/* IFLA_IPTUN_LINK */
|
/* IFLA_IPTUN_LINK */
|
||||||
nla_total_size(4) +
|
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) +
|
nla_total_size(2) +
|
||||||
/* IFLA_IPTUN_COLLECT_METADATA */
|
/* IFLA_IPTUN_COLLECT_METADATA */
|
||||||
nla_total_size(0) +
|
nla_total_size(0) +
|
||||||
|
@ -451,7 +451,7 @@ Signed-off-by: Steven Barth <cyrus@openwrt.org>
|
||||||
0;
|
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 *tunnel = netdev_priv(dev);
|
||||||
struct __ip6_tnl_parm *parm = &tunnel->parms;
|
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) ||
|
if (nla_put_u32(skb, IFLA_IPTUN_LINK, parm->link) ||
|
||||||
nla_put_in6_addr(skb, IFLA_IPTUN_LOCAL, &parm->laddr) ||
|
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_u8(skb, IFLA_IPTUN_ENCAP_LIMIT, parm->encap_limit) ||
|
||||||
nla_put_be32(skb, IFLA_IPTUN_FLOWINFO, parm->flowinfo) ||
|
nla_put_be32(skb, IFLA_IPTUN_FLOWINFO, parm->flowinfo) ||
|
||||||
nla_put_u32(skb, IFLA_IPTUN_FLAGS, parm->flags) ||
|
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) ||
|
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_SPORT, tunnel->encap.sport) ||
|
||||||
nla_put_be16(skb, IFLA_IPTUN_ENCAP_DPORT, tunnel->encap.dport) ||
|
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_SPORT] = { .type = NLA_U16 },
|
||||||
[IFLA_IPTUN_ENCAP_DPORT] = { .type = NLA_U16 },
|
[IFLA_IPTUN_ENCAP_DPORT] = { .type = NLA_U16 },
|
||||||
[IFLA_IPTUN_COLLECT_METADATA] = { .type = NLA_FLAG },
|
[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)
|
static void mlx5e_set_rx_mode(struct net_device *dev)
|
||||||
--- a/drivers/net/ethernet/mellanox/mlxsw/spectrum.c
|
--- a/drivers/net/ethernet/mellanox/mlxsw/spectrum.c
|
||||||
+++ b/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,
|
/* Return the stats from a cache that is updated periodically,
|
||||||
* as this function might get called in an atomic context.
|
* 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;
|
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;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -47,7 +47,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
|
||||||
struct unity_map_entry *entry;
|
struct unity_map_entry *entry;
|
||||||
int devid;
|
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;
|
return;
|
||||||
|
|
||||||
list_for_each_entry(entry, &amd_iommu_unity_map, list) {
|
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));
|
struct dma_ops_domain *dma_dom = to_dma_ops_domain(to_pdomain(domain));
|
||||||
unsigned long start, end;
|
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,
|
.add_device = amd_iommu_add_device,
|
||||||
.remove_device = amd_iommu_remove_device,
|
.remove_device = amd_iommu_remove_device,
|
||||||
.device_group = amd_iommu_device_group,
|
.device_group = amd_iommu_device_group,
|
||||||
|
|
|
@ -1,7 +1,5 @@
|
||||||
Index: 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
|
||||||
--- 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
|
|
||||||
@@ -1533,7 +1533,10 @@ static void mtk_hwlro_rx_uninit(struct m
|
@@ -1533,7 +1533,10 @@ static void mtk_hwlro_rx_uninit(struct m
|
||||||
for (i = 0; i < 10; i++) {
|
for (i = 0; i < 10; i++) {
|
||||||
val = mtk_r32(eth, MTK_PDMA_LRO_CTRL_DW0);
|
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)"
|
bool "SGI IP22 (Indy/Indigo2)"
|
||||||
--- a/drivers/pinctrl/Kconfig
|
--- a/drivers/pinctrl/Kconfig
|
||||||
+++ b/drivers/pinctrl/Kconfig
|
+++ b/drivers/pinctrl/Kconfig
|
||||||
@@ -114,6 +114,11 @@ config PINCTRL_LPC18XX
|
@@ -115,6 +115,11 @@ config PINCTRL_LPC18XX
|
||||||
help
|
help
|
||||||
Pinctrl driver for NXP LPC18xx/43xx System Control Unit (SCU).
|
Pinctrl driver for NXP LPC18xx/43xx System Control Unit (SCU).
|
||||||
|
|
||||||
|
|
|
@ -2887,7 +2887,7 @@
|
||||||
+
|
+
|
||||||
+ /* Display RX ring */
|
+ /* Display RX ring */
|
||||||
+ priv->hw->desc->display_ring(head_rx, DMA_RX_SIZE, true);
|
+ priv->hw->desc->display_ring(head_rx, DMA_RX_SIZE, true);
|
||||||
}
|
+ }
|
||||||
+}
|
+}
|
||||||
+
|
+
|
||||||
+static void stmmac_display_tx_rings(struct stmmac_priv *priv)
|
+static void stmmac_display_tx_rings(struct stmmac_priv *priv)
|
||||||
|
@ -2906,15 +2906,15 @@
|
||||||
+ head_tx = (void *)tx_q->dma_etx;
|
+ head_tx = (void *)tx_q->dma_etx;
|
||||||
+ else
|
+ else
|
||||||
+ head_tx = (void *)tx_q->dma_tx;
|
+ head_tx = (void *)tx_q->dma_tx;
|
||||||
|
+
|
||||||
|
+ priv->hw->desc->display_ring(head_tx, DMA_TX_SIZE, false);
|
||||||
|
}
|
||||||
|
+}
|
||||||
|
|
||||||
- /* Display Rx ring */
|
- /* Display Rx ring */
|
||||||
- priv->hw->desc->display_ring(head_rx, DMA_RX_SIZE, true);
|
- priv->hw->desc->display_ring(head_rx, DMA_RX_SIZE, true);
|
||||||
- /* Display Tx ring */
|
- /* 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);
|
||||||
+ priv->hw->desc->display_ring(head_tx, DMA_TX_SIZE, false);
|
|
||||||
+ }
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static void stmmac_display_rings(struct stmmac_priv *priv)
|
+static void stmmac_display_rings(struct stmmac_priv *priv)
|
||||||
+{
|
+{
|
||||||
+ /* Display RX ring */
|
+ /* Display RX ring */
|
||||||
|
@ -3131,7 +3131,7 @@
|
||||||
|
|
||||||
if (priv->hw->mode->set_16kib_bfsize)
|
if (priv->hw->mode->set_16kib_bfsize)
|
||||||
bfsize = priv->hw->mode->set_16kib_bfsize(dev->mtu);
|
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;
|
priv->dma_buf_sz = bfsize;
|
||||||
|
|
||||||
|
@ -3163,7 +3163,10 @@
|
||||||
+ p = &((rx_q->dma_erx + i)->basic);
|
+ p = &((rx_q->dma_erx + i)->basic);
|
||||||
+ else
|
+ else
|
||||||
+ p = rx_q->dma_rx + i;
|
+ 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,
|
+ ret = stmmac_init_rx_buffers(priv, p, i, flags,
|
||||||
+ queue);
|
+ queue);
|
||||||
+ if (ret)
|
+ if (ret)
|
||||||
|
@ -3173,18 +3176,15 @@
|
||||||
+ rx_q->rx_skbuff[i], rx_q->rx_skbuff[i]->data,
|
+ rx_q->rx_skbuff[i], rx_q->rx_skbuff[i]->data,
|
||||||
+ (unsigned int)rx_q->rx_skbuff_dma[i]);
|
+ (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->cur_rx = 0;
|
||||||
+ rx_q->dirty_rx = (unsigned int)(i - DMA_RX_SIZE);
|
+ 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",
|
- netif_dbg(priv, probe, priv->dev, "[%p]\t[%p]\t[%x]\n",
|
||||||
- priv->rx_skbuff[i], priv->rx_skbuff[i]->data,
|
- priv->rx_skbuff[i], priv->rx_skbuff[i]->data,
|
||||||
- (unsigned int)priv->rx_skbuff_dma[i]);
|
- (unsigned int)priv->rx_skbuff_dma[i]);
|
||||||
+ stmmac_clear_rx_descriptors(priv, queue);
|
|
||||||
+
|
|
||||||
+ /* Setup the chained descriptor addresses */
|
+ /* Setup the chained descriptor addresses */
|
||||||
+ if (priv->mode == STMMAC_CHAIN_MODE) {
|
+ if (priv->mode == STMMAC_CHAIN_MODE) {
|
||||||
+ if (priv->extend_desc)
|
+ if (priv->extend_desc)
|
||||||
|
@ -3277,8 +3277,13 @@
|
||||||
+ priv->hw->mode->init(tx_q->dma_tx,
|
+ priv->hw->mode->init(tx_q->dma_tx,
|
||||||
+ tx_q->dma_tx_phy,
|
+ tx_q->dma_tx_phy,
|
||||||
+ DMA_TX_SIZE, 0);
|
+ 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++) {
|
+ for (i = 0; i < DMA_TX_SIZE; i++) {
|
||||||
+ struct dma_desc *p;
|
+ struct dma_desc *p;
|
||||||
+ if (priv->extend_desc)
|
+ if (priv->extend_desc)
|
||||||
|
@ -3300,13 +3305,8 @@
|
||||||
+ tx_q->tx_skbuff_dma[i].len = 0;
|
+ tx_q->tx_skbuff_dma[i].len = 0;
|
||||||
+ tx_q->tx_skbuff_dma[i].last_segment = false;
|
+ tx_q->tx_skbuff_dma[i].last_segment = false;
|
||||||
+ tx_q->tx_skbuff[i] = NULL;
|
+ 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->dirty_tx = 0;
|
||||||
+ tx_q->cur_tx = 0;
|
+ tx_q->cur_tx = 0;
|
||||||
+
|
+
|
||||||
|
@ -3387,17 +3387,10 @@
|
||||||
- priv->tx_skbuff_dma[i].buf,
|
- priv->tx_skbuff_dma[i].buf,
|
||||||
- priv->tx_skbuff_dma[i].len,
|
- priv->tx_skbuff_dma[i].len,
|
||||||
- DMA_TO_DEVICE);
|
- DMA_TO_DEVICE);
|
||||||
- }
|
|
||||||
+ for (i = 0; i < DMA_TX_SIZE; i++)
|
+ for (i = 0; i < DMA_TX_SIZE; i++)
|
||||||
+ stmmac_free_tx_buffer(priv, queue, 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
|
+ * free_dma_rx_desc_resources - free RX dma desc resources
|
||||||
+ * @priv: private structure
|
+ * @priv: private structure
|
||||||
|
@ -3426,11 +3419,10 @@
|
||||||
+
|
+
|
||||||
+ kfree(rx_q->rx_skbuff_dma);
|
+ kfree(rx_q->rx_skbuff_dma);
|
||||||
+ kfree(rx_q->rx_skbuff);
|
+ kfree(rx_q->rx_skbuff);
|
||||||
}
|
+ }
|
||||||
}
|
+}
|
||||||
|
+
|
||||||
/**
|
+/**
|
||||||
- * alloc_dma_desc_resources - alloc TX/RX resources.
|
|
||||||
+ * free_dma_tx_desc_resources - free TX dma desc resources
|
+ * free_dma_tx_desc_resources - free TX dma desc resources
|
||||||
+ * @priv: private structure
|
+ * @priv: private structure
|
||||||
+ */
|
+ */
|
||||||
|
@ -3463,90 +3455,36 @@
|
||||||
+
|
+
|
||||||
+/**
|
+/**
|
||||||
+ * alloc_dma_rx_desc_resources - alloc RX resources.
|
+ * alloc_dma_rx_desc_resources - alloc RX resources.
|
||||||
* @priv: private structure
|
+ * @priv: private structure
|
||||||
* Description: according to which descriptor can be used (extend or basic)
|
+ * Description: according to which descriptor can be used (extend or basic)
|
||||||
* this function allocates the resources for TX and RX paths. In case of
|
+ * 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
|
+ * reception, for example, it pre-allocated the RX socket buffer in order to
|
||||||
* allow zero-copy mechanism.
|
+ * allow zero-copy mechanism.
|
||||||
*/
|
+ */
|
||||||
-static int alloc_dma_desc_resources(struct stmmac_priv *priv)
|
|
||||||
+static int alloc_dma_rx_desc_resources(struct stmmac_priv *priv)
|
+static int alloc_dma_rx_desc_resources(struct stmmac_priv *priv)
|
||||||
{
|
+{
|
||||||
+ u32 rx_count = priv->plat->rx_queues_to_use;
|
+ u32 rx_count = priv->plat->rx_queues_to_use;
|
||||||
int ret = -ENOMEM;
|
+ int ret = -ENOMEM;
|
||||||
+ u32 queue;
|
+ 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 */
|
+ /* RX queues buffers and DMA */
|
||||||
+ for (queue = 0; queue < rx_count; queue++) {
|
+ for (queue = 0; queue < rx_count; queue++) {
|
||||||
+ struct stmmac_rx_queue *rx_q = &priv->rx_queue[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->queue_index = queue;
|
||||||
+ rx_q->priv_data = priv;
|
+ 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,
|
+ rx_q->rx_skbuff_dma = kmalloc_array(DMA_RX_SIZE,
|
||||||
+ sizeof(dma_addr_t),
|
+ sizeof(dma_addr_t),
|
||||||
GFP_KERNEL);
|
+ 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;
|
|
||||||
+ if (!rx_q->rx_skbuff_dma)
|
+ if (!rx_q->rx_skbuff_dma)
|
||||||
+ return -ENOMEM;
|
+ 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,
|
+ rx_q->rx_skbuff = kmalloc_array(DMA_RX_SIZE,
|
||||||
+ sizeof(struct sk_buff *),
|
+ sizeof(struct sk_buff *),
|
||||||
+ GFP_KERNEL);
|
+ GFP_KERNEL);
|
||||||
+ if (!rx_q->rx_skbuff)
|
+ if (!rx_q->rx_skbuff)
|
||||||
goto err_dma;
|
+ goto err_dma;
|
||||||
+
|
+
|
||||||
+ if (priv->extend_desc) {
|
+ if (priv->extend_desc) {
|
||||||
+ rx_q->dma_erx = dma_zalloc_coherent(priv->device,
|
+ rx_q->dma_erx = dma_zalloc_coherent(priv->device,
|
||||||
|
@ -3567,19 +3505,12 @@
|
||||||
+ GFP_KERNEL);
|
+ GFP_KERNEL);
|
||||||
+ if (!rx_q->dma_rx)
|
+ if (!rx_q->dma_rx)
|
||||||
+ goto err_dma;
|
+ goto err_dma;
|
||||||
}
|
+ }
|
||||||
}
|
+ }
|
||||||
|
+
|
||||||
return 0;
|
+ return 0;
|
||||||
|
+
|
||||||
err_dma:
|
+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);
|
|
||||||
+ free_dma_rx_desc_resources(priv);
|
+ free_dma_rx_desc_resources(priv);
|
||||||
+
|
+
|
||||||
+ return ret;
|
+ return ret;
|
||||||
|
@ -3636,7 +3567,7 @@
|
||||||
+ GFP_KERNEL);
|
+ GFP_KERNEL);
|
||||||
+ if (!tx_q->dma_tx)
|
+ if (!tx_q->dma_tx)
|
||||||
+ goto err_dma_buffers;
|
+ goto err_dma_buffers;
|
||||||
+ }
|
}
|
||||||
+ }
|
+ }
|
||||||
+
|
+
|
||||||
+ return 0;
|
+ return 0;
|
||||||
|
@ -3644,9 +3575,9 @@
|
||||||
+err_dma_buffers:
|
+err_dma_buffers:
|
||||||
+ free_dma_tx_desc_resources(priv);
|
+ free_dma_tx_desc_resources(priv);
|
||||||
+
|
+
|
||||||
return ret;
|
+ return ret;
|
||||||
}
|
+}
|
||||||
|
+
|
||||||
+/**
|
+/**
|
||||||
+ * alloc_dma_desc_resources - alloc TX/RX resources.
|
+ * alloc_dma_desc_resources - alloc TX/RX resources.
|
||||||
+ * @priv: private structure
|
+ * @priv: private structure
|
||||||
|
@ -3672,7 +3603,176 @@
|
||||||
+ * free_dma_desc_resources - free dma desc resources
|
+ * free_dma_desc_resources - free dma desc resources
|
||||||
+ * @priv: private structure
|
+ * @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 */
|
- /* Release the DMA TX/RX socket buffers */
|
||||||
- dma_free_rx_skbufs(priv);
|
- dma_free_rx_skbufs(priv);
|
||||||
|
@ -3698,99 +3798,6 @@
|
||||||
- kfree(priv->rx_skbuff);
|
- kfree(priv->rx_skbuff);
|
||||||
- kfree(priv->tx_skbuff_dma);
|
- kfree(priv->tx_skbuff_dma);
|
||||||
- kfree(priv->tx_skbuff);
|
- 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 rx_channels_count = priv->plat->rx_queues_to_use;
|
||||||
+ u32 tx_channels_count = priv->plat->tx_queues_to_use;
|
+ u32 tx_channels_count = priv->plat->tx_queues_to_use;
|
||||||
+ u32 chan = 0;
|
+ u32 chan = 0;
|
||||||
|
@ -3800,23 +3807,38 @@
|
||||||
+
|
+
|
||||||
+ for (chan = 0; chan < tx_channels_count; chan++)
|
+ for (chan = 0; chan < tx_channels_count; chan++)
|
||||||
+ stmmac_start_tx_dma(priv, 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
|
+ * stmmac_stop_all_dma - stop all RX and TX DMA channels
|
||||||
+ * @priv: driver private structure
|
+ * @priv: driver private structure
|
||||||
+ * Description:
|
+ * Description:
|
||||||
+ * This stops the RX and TX DMA channels
|
+ * 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)
|
+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 rx_channels_count = priv->plat->rx_queues_to_use;
|
||||||
+ u32 tx_channels_count = priv->plat->tx_queues_to_use;
|
+ u32 tx_channels_count = priv->plat->tx_queues_to_use;
|
||||||
+ u32 chan = 0;
|
+ 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++)
|
+ for (chan = 0; chan < rx_channels_count; chan++)
|
||||||
+ stmmac_stop_rx_dma(priv, 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++)
|
+ for (chan = 0; chan < tx_channels_count; chan++)
|
||||||
+ stmmac_stop_tx_dma(priv, 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
|
--- a/arch/arm/boot/dts/sun8i-h3-nanopi-neo.dts
|
||||||
===================================================================
|
+++ b/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
|
|
||||||
@@ -53,6 +53,7 @@
|
@@ -53,6 +53,7 @@
|
||||||
|
|
||||||
aliases {
|
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 ++++++++++++++++++++++++++++---
|
arch/arm/boot/dts/sun8i-h3-nanopi-neo.dts | 43 ++++++++++++++++++++++++++++---
|
||||||
1 file changed, 40 insertions(+), 3 deletions(-)
|
1 file changed, 40 insertions(+), 3 deletions(-)
|
||||||
|
|
||||||
Index: 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
|
||||||
--- 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
|
|
||||||
@@ -78,10 +78,30 @@
|
@@ -78,10 +78,30 @@
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in a new issue