summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThorsten Leemhuis <fedora@leemhuis.info>2016-09-07 18:34:56 +0200
committerThorsten Leemhuis <fedora@leemhuis.info>2016-09-07 18:34:56 +0200
commit372e1be826c02046a5e489641247ad5b3e8645df (patch)
tree0fa2929b38b48ea48b322be841413b5f43bfd6d4
parenta236a78b22a3f14eaaa9ed7931c65d26a11e0680 (diff)
parent4b8d25bc3d43e4eff06c268281857e654ef6189c (diff)
downloadkernel-372e1be826c02046a5e489641247ad5b3e8645df.tar.gz
kernel-372e1be826c02046a5e489641247ad5b3e8645df.tar.xz
kernel-372e1be826c02046a5e489641247ad5b3e8645df.zip
Merge remote-tracking branch 'origin/f24' into f24-user-thl-vanilla-fedorakernel-4.7.2-201.vanilla.knurd.1.fc24
-rw-r--r--0001-OOM-detection-regressions-since-4.7.patch121
-rw-r--r--0001-SUNRPC-Fix-infinite-looping-in-rpc_clnt_iterate_for_.patch46
-rw-r--r--0001-cgroup-reduce-read-locked-section-of-cgroup_threadgr.patch112
-rw-r--r--0001-udp-fix-poll-issue-with-zero-sized-packets.patch73
-rw-r--r--Initial-AllWinner-A64-and-PINE64-support.patch1200
-rw-r--r--aacraid-Check-size-values-after-double-fetch-from-us.patch65
-rw-r--r--bcm2837-initial-support.patch332
-rw-r--r--bcm283x-upstream-fixes.patch194
-rw-r--r--config-armv7-generic3
-rw-r--r--kernel-panic-TPROXY-vanilla-4.7.1.patch85
-rw-r--r--kernel.spec54
-rw-r--r--rc-core-fix-repeat-events.patch46
12 files changed, 929 insertions, 1402 deletions
diff --git a/0001-OOM-detection-regressions-since-4.7.patch b/0001-OOM-detection-regressions-since-4.7.patch
new file mode 100644
index 000000000..4616c7f87
--- /dev/null
+++ b/0001-OOM-detection-regressions-since-4.7.patch
@@ -0,0 +1,121 @@
+From a7f80308bac4013728e33e2bcb9b60eee78f60fb Mon Sep 17 00:00:00 2001
+From: Michal Hocko <mhocko@kernel.org>
+Date: Mon, 22 Aug 2016 11:32:49 +0200
+Subject: [PATCH] OOM detection regressions since 4.7
+
+Hi,
+there have been multiple reports [1][2][3][4][5] about pre-mature OOM
+killer invocations since 4.7 which contains oom detection rework. All of
+them were for order-2 (kernel stack) alloaction requests failing because
+of a high fragmentation and compaction failing to make any forward
+progress. While investigating this we have found out that the compaction
+just gives up too early. Vlastimil has been working on compaction
+improvement for quite some time and his series [6] is already sitting
+in mmotm tree. This already helps a lot because it drops some heuristics
+which are more aimed at lower latencies for high orders rather than
+reliability. Joonsoo has then identified further problem with too many
+blocks being marked as unmovable [7] and Vlastimil has prepared a patch
+on top of his series [8] which is also in the mmotm tree now.
+
+That being said, the regression is real and should be fixed for 4.7
+stable users. [6][8] was reported to help and ooms are no longer
+reproducible. I know we are quite late (rc3) in 4.8 but I would vote
+for mergeing those patches and have them in 4.8. For 4.7 I would go
+with a partial revert of the detection rework for high order requests
+(see patch below). This patch is really trivial. If those compaction
+improvements are just too large for 4.8 then we can use the same patch
+as for 4.7 stable for now and revert it in 4.9 after compaction changes
+are merged.
+
+Thoughts?
+
+[1] http://lkml.kernel.org/r/20160731051121.GB307@x4
+[2] http://lkml.kernel.org/r/201608120901.41463.a.miskiewicz@gmail.com
+[3] http://lkml.kernel.org/r/20160801192620.GD31957@dhcp22.suse.cz
+[4] https://lists.opensuse.org/opensuse-kernel/2016-08/msg00021.html
+[5] https://bugzilla.opensuse.org/show_bug.cgi?id=994066
+[6] http://lkml.kernel.org/r/20160810091226.6709-1-vbabka@suse.cz
+[7] http://lkml.kernel.org/r/20160816031222.GC16913@js1304-P5Q-DELUXE
+[8] http://lkml.kernel.org/r/f7a9ea9d-bb88-bfd6-e340-3a933559305a@suse.cz
+---
+ mm/page_alloc.c | 50 ++------------------------------------------------
+ 1 file changed, 2 insertions(+), 48 deletions(-)
+
+diff --git a/mm/page_alloc.c b/mm/page_alloc.c
+index 8b3e134..6e35419 100644
+--- a/mm/page_alloc.c
++++ b/mm/page_alloc.c
+@@ -3254,53 +3254,6 @@ __alloc_pages_direct_compact(gfp_t gfp_mask, unsigned int order,
+ return NULL;
+ }
+
+-static inline bool
+-should_compact_retry(struct alloc_context *ac, int order, int alloc_flags,
+- enum compact_result compact_result, enum migrate_mode *migrate_mode,
+- int compaction_retries)
+-{
+- int max_retries = MAX_COMPACT_RETRIES;
+-
+- if (!order)
+- return false;
+-
+- /*
+- * compaction considers all the zone as desperately out of memory
+- * so it doesn't really make much sense to retry except when the
+- * failure could be caused by weak migration mode.
+- */
+- if (compaction_failed(compact_result)) {
+- if (*migrate_mode == MIGRATE_ASYNC) {
+- *migrate_mode = MIGRATE_SYNC_LIGHT;
+- return true;
+- }
+- return false;
+- }
+-
+- /*
+- * make sure the compaction wasn't deferred or didn't bail out early
+- * due to locks contention before we declare that we should give up.
+- * But do not retry if the given zonelist is not suitable for
+- * compaction.
+- */
+- if (compaction_withdrawn(compact_result))
+- return compaction_zonelist_suitable(ac, order, alloc_flags);
+-
+- /*
+- * !costly requests are much more important than __GFP_REPEAT
+- * costly ones because they are de facto nofail and invoke OOM
+- * killer to move on while costly can fail and users are ready
+- * to cope with that. 1/4 retries is rather arbitrary but we
+- * would need much more detailed feedback from compaction to
+- * make a better decision.
+- */
+- if (order > PAGE_ALLOC_COSTLY_ORDER)
+- max_retries /= 4;
+- if (compaction_retries <= max_retries)
+- return true;
+-
+- return false;
+-}
+ #else
+ static inline struct page *
+ __alloc_pages_direct_compact(gfp_t gfp_mask, unsigned int order,
+@@ -3311,6 +3264,8 @@ __alloc_pages_direct_compact(gfp_t gfp_mask, unsigned int order,
+ return NULL;
+ }
+
++#endif /* CONFIG_COMPACTION */
++
+ static inline bool
+ should_compact_retry(struct alloc_context *ac, unsigned int order, int alloc_flags,
+ enum compact_result compact_result,
+@@ -3337,7 +3292,6 @@ should_compact_retry(struct alloc_context *ac, unsigned int order, int alloc_fla
+ }
+ return false;
+ }
+-#endif /* CONFIG_COMPACTION */
+
+ /* Perform direct synchronous page reclaim */
+ static int
+--
+2.7.4
+
diff --git a/0001-SUNRPC-Fix-infinite-looping-in-rpc_clnt_iterate_for_.patch b/0001-SUNRPC-Fix-infinite-looping-in-rpc_clnt_iterate_for_.patch
new file mode 100644
index 000000000..0373d3a2a
--- /dev/null
+++ b/0001-SUNRPC-Fix-infinite-looping-in-rpc_clnt_iterate_for_.patch
@@ -0,0 +1,46 @@
+From bdc54d8e3cb4a41dddcabfd86d9eb3aa5f622b75 Mon Sep 17 00:00:00 2001
+From: Trond Myklebust <trond.myklebust@primarydata.com>
+Date: Sat, 16 Jul 2016 11:47:00 -0400
+Subject: [PATCH] SUNRPC: Fix infinite looping in
+ rpc_clnt_iterate_for_each_xprt
+
+If there were less than 2 entries in the multipath list, then
+xprt_iter_next_entry_multiple() would never advance beyond the
+first entry, which is correct for round robin behaviour, but not
+for the list iteration.
+
+The end result would be infinite looping in rpc_clnt_iterate_for_each_xprt()
+as we would never see the xprt == NULL condition fulfilled.
+
+Reported-by: Oleg Drokin <green@linuxhacker.ru>
+Fixes: 80b14d5e61ca ("SUNRPC: Add a structure to track multiple transports")
+Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
+---
+ net/sunrpc/xprtmultipath.c | 8 +++-----
+ 1 file changed, 3 insertions(+), 5 deletions(-)
+
+diff --git a/net/sunrpc/xprtmultipath.c b/net/sunrpc/xprtmultipath.c
+index e7fd769..66c9d63 100644
+--- a/net/sunrpc/xprtmultipath.c
++++ b/net/sunrpc/xprtmultipath.c
+@@ -271,14 +271,12 @@ struct rpc_xprt *xprt_iter_next_entry_multiple(struct rpc_xprt_iter *xpi,
+ xprt_switch_find_xprt_t find_next)
+ {
+ struct rpc_xprt_switch *xps = rcu_dereference(xpi->xpi_xpswitch);
+- struct list_head *head;
+
+ if (xps == NULL)
+ return NULL;
+- head = &xps->xps_xprt_list;
+- if (xps->xps_nxprts < 2)
+- return xprt_switch_find_first_entry(head);
+- return xprt_switch_set_next_cursor(head, &xpi->xpi_cursor, find_next);
++ return xprt_switch_set_next_cursor(&xps->xps_xprt_list,
++ &xpi->xpi_cursor,
++ find_next);
+ }
+
+ static
+--
+2.7.4
+
diff --git a/0001-cgroup-reduce-read-locked-section-of-cgroup_threadgr.patch b/0001-cgroup-reduce-read-locked-section-of-cgroup_threadgr.patch
new file mode 100644
index 000000000..daad25310
--- /dev/null
+++ b/0001-cgroup-reduce-read-locked-section-of-cgroup_threadgr.patch
@@ -0,0 +1,112 @@
+From 568ac888215c7fb2fabe8ea739b00ec3c1f5d440 Mon Sep 17 00:00:00 2001
+From: Balbir Singh <bsingharora@gmail.com>
+Date: Wed, 10 Aug 2016 15:43:06 -0400
+Subject: [PATCH] cgroup: reduce read locked section of
+ cgroup_threadgroup_rwsem during fork
+
+cgroup_threadgroup_rwsem is acquired in read mode during process exit
+and fork. It is also grabbed in write mode during
+__cgroups_proc_write(). I've recently run into a scenario with lots
+of memory pressure and OOM and I am beginning to see
+
+systemd
+
+ __switch_to+0x1f8/0x350
+ __schedule+0x30c/0x990
+ schedule+0x48/0xc0
+ percpu_down_write+0x114/0x170
+ __cgroup_procs_write.isra.12+0xb8/0x3c0
+ cgroup_file_write+0x74/0x1a0
+ kernfs_fop_write+0x188/0x200
+ __vfs_write+0x6c/0xe0
+ vfs_write+0xc0/0x230
+ SyS_write+0x6c/0x110
+ system_call+0x38/0xb4
+
+This thread is waiting on the reader of cgroup_threadgroup_rwsem to
+exit. The reader itself is under memory pressure and has gone into
+reclaim after fork. There are times the reader also ends up waiting on
+oom_lock as well.
+
+ __switch_to+0x1f8/0x350
+ __schedule+0x30c/0x990
+ schedule+0x48/0xc0
+ jbd2_log_wait_commit+0xd4/0x180
+ ext4_evict_inode+0x88/0x5c0
+ evict+0xf8/0x2a0
+ dispose_list+0x50/0x80
+ prune_icache_sb+0x6c/0x90
+ super_cache_scan+0x190/0x210
+ shrink_slab.part.15+0x22c/0x4c0
+ shrink_zone+0x288/0x3c0
+ do_try_to_free_pages+0x1dc/0x590
+ try_to_free_pages+0xdc/0x260
+ __alloc_pages_nodemask+0x72c/0xc90
+ alloc_pages_current+0xb4/0x1a0
+ page_table_alloc+0xc0/0x170
+ __pte_alloc+0x58/0x1f0
+ copy_page_range+0x4ec/0x950
+ copy_process.isra.5+0x15a0/0x1870
+ _do_fork+0xa8/0x4b0
+ ppc_clone+0x8/0xc
+
+In the meanwhile, all processes exiting/forking are blocked almost
+stalling the system.
+
+This patch moves the threadgroup_change_begin from before
+cgroup_fork() to just before cgroup_canfork(). There is no nee to
+worry about threadgroup changes till the task is actually added to the
+threadgroup. This avoids having to call reclaim with
+cgroup_threadgroup_rwsem held.
+
+tj: Subject and description edits.
+
+Signed-off-by: Balbir Singh <bsingharora@gmail.com>
+Acked-by: Zefan Li <lizefan@huawei.com>
+Cc: Oleg Nesterov <oleg@redhat.com>
+Cc: Andrew Morton <akpm@linux-foundation.org>
+Cc: stable@vger.kernel.org # v4.2+
+Signed-off-by: Tejun Heo <tj@kernel.org>
+---
+ kernel/fork.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/kernel/fork.c b/kernel/fork.c
+index 52e725d..aaf7823 100644
+--- a/kernel/fork.c
++++ b/kernel/fork.c
+@@ -1404,7 +1404,6 @@ static struct task_struct *copy_process(unsigned long clone_flags,
+ p->real_start_time = ktime_get_boot_ns();
+ p->io_context = NULL;
+ p->audit_context = NULL;
+- threadgroup_change_begin(current);
+ cgroup_fork(p);
+ #ifdef CONFIG_NUMA
+ p->mempolicy = mpol_dup(p->mempolicy);
+@@ -1556,6 +1555,7 @@ static struct task_struct *copy_process(unsigned long clone_flags,
+ INIT_LIST_HEAD(&p->thread_group);
+ p->task_works = NULL;
+
++ threadgroup_change_begin(current);
+ /*
+ * Ensure that the cgroup subsystem policies allow the new process to be
+ * forked. It should be noted the the new process's css_set can be changed
+@@ -1656,6 +1656,7 @@ static struct task_struct *copy_process(unsigned long clone_flags,
+ bad_fork_cancel_cgroup:
+ cgroup_cancel_fork(p);
+ bad_fork_free_pid:
++ threadgroup_change_end(current);
+ if (pid != &init_struct_pid)
+ free_pid(pid);
+ bad_fork_cleanup_thread:
+@@ -1688,7 +1689,6 @@ bad_fork_cleanup_policy:
+ mpol_put(p->mempolicy);
+ bad_fork_cleanup_threadgroup_lock:
+ #endif
+- threadgroup_change_end(current);
+ delayacct_tsk_free(p);
+ bad_fork_cleanup_count:
+ atomic_dec(&p->cred->user->processes);
+--
+2.7.4
+
diff --git a/0001-udp-fix-poll-issue-with-zero-sized-packets.patch b/0001-udp-fix-poll-issue-with-zero-sized-packets.patch
new file mode 100644
index 000000000..f5edf2340
--- /dev/null
+++ b/0001-udp-fix-poll-issue-with-zero-sized-packets.patch
@@ -0,0 +1,73 @@
+From 9f30f83eb6347afa6b1d1df1065608c2b4485e2b Mon Sep 17 00:00:00 2001
+From: Eric Dumazet <edumazet@google.com>
+Date: Tue, 23 Aug 2016 13:59:33 -0700
+Subject: [PATCH] udp: fix poll() issue with zero sized packets
+
+Laura tracked poll() [and friends] regression caused by commit
+e6afc8ace6dd ("udp: remove headers from UDP packets before queueing")
+
+udp_poll() needs to know if there is a valid packet in receive queue,
+even if its payload length is 0.
+
+Change first_packet_length() to return an signed int, and use -1
+as the indication of an empty queue.
+
+Fixes: e6afc8ace6dd ("udp: remove headers from UDP packets before queueing")
+Reported-by: Laura Abbott <labbott@redhat.com>
+Signed-off-by: Eric Dumazet <edumazet@google.com>
+Tested-by: Laura Abbott <labbott@redhat.com>
+---
+ net/ipv4/udp.c | 12 ++++++------
+ 1 file changed, 6 insertions(+), 6 deletions(-)
+
+diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c
+index e61f7cd..00d18c5 100644
+--- a/net/ipv4/udp.c
++++ b/net/ipv4/udp.c
+@@ -1182,13 +1182,13 @@ out:
+ * @sk: socket
+ *
+ * Drops all bad checksum frames, until a valid one is found.
+- * Returns the length of found skb, or 0 if none is found.
++ * Returns the length of found skb, or -1 if none is found.
+ */
+-static unsigned int first_packet_length(struct sock *sk)
++static int first_packet_length(struct sock *sk)
+ {
+ struct sk_buff_head list_kill, *rcvq = &sk->sk_receive_queue;
+ struct sk_buff *skb;
+- unsigned int res;
++ int res;
+
+ __skb_queue_head_init(&list_kill);
+
+@@ -1203,7 +1203,7 @@ static unsigned int first_packet_length(struct sock *sk)
+ __skb_unlink(skb, rcvq);
+ __skb_queue_tail(&list_kill, skb);
+ }
+- res = skb ? skb->len : 0;
++ res = skb ? skb->len : -1;
+ spin_unlock_bh(&rcvq->lock);
+
+ if (!skb_queue_empty(&list_kill)) {
+@@ -1232,7 +1232,7 @@ int udp_ioctl(struct sock *sk, int cmd, unsigned long arg)
+
+ case SIOCINQ:
+ {
+- unsigned int amount = first_packet_length(sk);
++ int amount = max_t(int, 0, first_packet_length(sk));
+
+ return put_user(amount, (int __user *)arg);
+ }
+@@ -2184,7 +2184,7 @@ unsigned int udp_poll(struct file *file, struct socket *sock, poll_table *wait)
+
+ /* Check for false positives due to checksum errors */
+ if ((mask & POLLRDNORM) && !(file->f_flags & O_NONBLOCK) &&
+- !(sk->sk_shutdown & RCV_SHUTDOWN) && !first_packet_length(sk))
++ !(sk->sk_shutdown & RCV_SHUTDOWN) && first_packet_length(sk) == -1)
+ mask &= ~(POLLIN | POLLRDNORM);
+
+ return mask;
+--
+2.7.4
+
diff --git a/Initial-AllWinner-A64-and-PINE64-support.patch b/Initial-AllWinner-A64-and-PINE64-support.patch
deleted file mode 100644
index 966275a8f..000000000
--- a/Initial-AllWinner-A64-and-PINE64-support.patch
+++ /dev/null
@@ -1,1200 +0,0 @@
-From 97f002d28e975991226ab70599731bd2ccc8c060 Mon Sep 17 00:00:00 2001
-From: Peter Robinson <pbrobinson@gmail.com>
-Date: Sun, 6 Mar 2016 12:06:41 +0000
-Subject: [PATCH] Initial AllWinner A64 and PINE64 support
-
----
- Documentation/devicetree/bindings/arm/sunxi.txt | 1 +
- Documentation/devicetree/bindings/clock/sunxi.txt | 7 +
- .../devicetree/bindings/vendor-prefixes.txt | 1 +
- arch/arm/boot/dts/sun8i-h3.dtsi | 18 +-
- arch/arm/mach-sunxi/Kconfig | 7 +
- arch/arm64/Kconfig.platforms | 6 +
- arch/arm64/boot/dts/Makefile | 1 +
- arch/arm64/boot/dts/allwinner/Makefile | 5 +
- .../dts/allwinner/sun50i-a64-pine64-common.dtsi | 80 +++
- .../boot/dts/allwinner/sun50i-a64-pine64-plus.dts | 59 ++
- .../arm64/boot/dts/allwinner/sun50i-a64-pine64.dts | 58 ++
- arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi | 624 +++++++++++++++++++++
- drivers/clk/sunxi/Makefile | 1 +
- drivers/clk/sunxi/clk-factors.c | 3 +-
- drivers/clk/sunxi/clk-factors.h | 1 +
- drivers/clk/sunxi/clk-multi-gates.c | 105 ++++
- drivers/clk/sunxi/clk-sunxi.c | 4 +-
- drivers/crypto/Kconfig | 2 +-
- 23 files changed, 1582 insertions(+), 16 deletions(-)
- create mode 100644 arch/arm64/boot/dts/allwinner/Makefile
- create mode 100644 arch/arm64/boot/dts/allwinner/sun50i-a64-pine64-common.dtsi
- create mode 100644 arch/arm64/boot/dts/allwinner/sun50i-a64-pine64-plus.dts
- create mode 100644 arch/arm64/boot/dts/allwinner/sun50i-a64-pine64.dts
- create mode 100644 arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi
- create mode 100644 drivers/clk/sunxi/clk-multi-gates.c
- create mode 100644 drivers/pinctrl/sunxi/pinctrl-sun50i-a64.c
-
-diff --git a/Documentation/devicetree/bindings/arm/sunxi.txt b/Documentation/devicetree/bindings/arm/sunxi.txt
-index bb9b0faa..8b39d2b 100644
---- a/Documentation/devicetree/bindings/arm/sunxi.txt
-+++ b/Documentation/devicetree/bindings/arm/sunxi.txt
-@@ -13,3 +13,4 @@ using one of the following compatible strings:
- allwinner,sun8i-a83t
- allwinner,sun8i-h3
- allwinner,sun9i-a80
-+ allwinner,sun50i-a64
-diff --git a/Documentation/devicetree/bindings/clock/sunxi.txt b/Documentation/devicetree/bindings/clock/sunxi.txt
-index e59f57b..8af12b5 100644
---- a/Documentation/devicetree/bindings/clock/sunxi.txt
-+++ b/Documentation/devicetree/bindings/clock/sunxi.txt
-@@ -77,6 +77,8 @@ Required properties:
- "allwinner,sun9i-a80-usb-mod-clk" - for usb gates + resets on A80
- "allwinner,sun9i-a80-usb-phy-clk" - for usb phy gates + resets on A80
- "allwinner,sun4i-a10-ve-clk" - for the Video Engine clock
-+ "allwinner,sunxi-multi-bus-gates-clk" - for the multi-parent bus gates
-+ "allwinner,sun50i-a64-bus-gates-clk" - for the bus gates on A64
-
- Required properties for all clocks:
- - reg : shall be the control register address for the clock.
-@@ -117,6 +119,11 @@ For "allwinner,sun6i-a31-pll6-clk", there are 2 outputs. The first output
- is the normal PLL6 output, or "pll6". The second output is rate doubled
- PLL6, or "pll6x2".
-
-+The "allwinner,sunxi-multi-bus-gates-clk" holds the actual clocks in
-+child nodes, where each one specifies the parent clock that the particular
-+gates are depending from. The child nodes each follow the common clock
-+binding as described in this document.
-+
- The "allwinner,*-mmc-clk" clocks have three different outputs: the
- main clock, with the ID 0, and the output and sample clocks, with the
- IDs 1 and 2, respectively.
-diff --git a/Documentation/devicetree/bindings/vendor-prefixes.txt b/Documentation/devicetree/bindings/vendor-prefixes.txt
-index 72e2c5a..0c22fa9 100644
---- a/Documentation/devicetree/bindings/vendor-prefixes.txt
-+++ b/Documentation/devicetree/bindings/vendor-prefixes.txt
-@@ -175,6 +175,7 @@ parade Parade Technologies Inc.
- pericom Pericom Technology Inc.
- phytec PHYTEC Messtechnik GmbH
- picochip Picochip Ltd
-+pine64 Pine64
- plathome Plat'Home Co., Ltd.
- plda PLDA
- pixcir PIXCIR MICROELECTRONICS Co., Ltd
-diff --git a/arch/arm/boot/dts/sun8i-h3.dtsi b/arch/arm/boot/dts/sun8i-h3.dtsi
-index 1524130e..7c50fa0 100644
---- a/arch/arm/boot/dts/sun8i-h3.dtsi
-+++ b/arch/arm/boot/dts/sun8i-h3.dtsi
-@@ -137,12 +137,12 @@
- clock-output-names = "pll6d2";
- };
-
-- /* dummy clock until pll6 can be reused */
-- pll8: pll8_clk {
-- #clock-cells = <0>;
-- compatible = "fixed-clock";
-- clock-frequency = <1>;
-- clock-output-names = "pll8";
-+ pll8: clk@c01c20044 {
-+ #clock-cells = <1>;
-+ compatible = "allwinner,sun6i-a31-pll6-clk";
-+ reg = <0x01c20044 0x4>;
-+ clocks = <&osc24M>;
-+ clock-output-names = "pll8", "pll8x2";
- };
-
- cpu: cpu_clk@01c20050 {
-@@ -243,7 +243,7 @@
- #clock-cells = <1>;
- compatible = "allwinner,sun4i-a10-mmc-clk";
- reg = <0x01c20088 0x4>;
-- clocks = <&osc24M>, <&pll6 0>, <&pll8>;
-+ clocks = <&osc24M>, <&pll6 0>, <&pll8 0>;
- clock-output-names = "mmc0",
- "mmc0_output",
- "mmc0_sample";
-@@ -253,7 +253,7 @@
- #clock-cells = <1>;
- compatible = "allwinner,sun4i-a10-mmc-clk";
- reg = <0x01c2008c 0x4>;
-- clocks = <&osc24M>, <&pll6 0>, <&pll8>;
-+ clocks = <&osc24M>, <&pll6 0>, <&pll8 0>;
- clock-output-names = "mmc1",
- "mmc1_output",
- "mmc1_sample";
-@@ -263,7 +263,7 @@
- #clock-cells = <1>;
- compatible = "allwinner,sun4i-a10-mmc-clk";
- reg = <0x01c20090 0x4>;
-- clocks = <&osc24M>, <&pll6 0>, <&pll8>;
-+ clocks = <&osc24M>, <&pll6 0>, <&pll8 0>;
- clock-output-names = "mmc2",
- "mmc2_output",
- "mmc2_sample";
-diff --git a/arch/arm/mach-sunxi/Kconfig b/arch/arm/mach-sunxi/Kconfig
-index c124d65..b305f5b 100644
---- a/arch/arm/mach-sunxi/Kconfig
-+++ b/arch/arm/mach-sunxi/Kconfig
-@@ -46,4 +46,11 @@ config MACH_SUN9I
- default ARCH_SUNXI
- select ARM_GIC
-
-+config MACH_SUN50I
-+ bool "Allwinner A64 (sun50i) SoCs support"
-+ default ARCH_SUNXI
-+ select ARM_GIC
-+ select HAVE_ARM_ARCH_TIMER
-+ select PINCTRL_SUN50I_A64
-+
- endif
-diff --git a/arch/arm64/Kconfig.platforms b/arch/arm64/Kconfig.platforms
-index 21074f6..63a690d 100644
---- a/arch/arm64/Kconfig.platforms
-+++ b/arch/arm64/Kconfig.platforms
-@@ -72,6 +72,12 @@ config ARCH_SEATTLE
- config ARCH_SHMOBILE
- bool
-
-+config ARCH_SUNXI
-+ bool "Allwinner sunxi 64-bit SoC Family"
-+ select PINCTRL_SUN50I_A64
-+ help
-+ This enables support for Allwinner sunxi based SoCs like the A64.
-+
- config ARCH_RENESAS
- bool "Renesas SoC Platforms"
- select ARCH_SHMOBILE
-diff --git a/arch/arm64/boot/dts/Makefile b/arch/arm64/boot/dts/Makefile
-index f832b8a..3b7428a 100644
---- a/arch/arm64/boot/dts/Makefile
-+++ b/arch/arm64/boot/dts/Makefile
-@@ -2,3 +2,4 @@
- dts-dirs += al
-+dts-dirs += allwinner
- dts-dirs += altera
- dts-dirs += amd
-diff --git a/arch/arm64/boot/dts/allwinner/Makefile b/arch/arm64/boot/dts/allwinner/Makefile
-new file mode 100644
-index 0000000..1e29a5a
---- /dev/null
-+++ b/arch/arm64/boot/dts/allwinner/Makefile
-@@ -0,0 +1,5 @@
-+dtb-$(CONFIG_ARCH_SUNXI) += sun50i-a64-pine64-plus.dtb sun50i-a64-pine64.dtb
-+
-+always := $(dtb-y)
-+subdir-y := $(dts-dirs)
-+clean-files := *.dtb
-diff --git a/arch/arm64/boot/dts/allwinner/sun50i-a64-pine64-common.dtsi b/arch/arm64/boot/dts/allwinner/sun50i-a64-pine64-common.dtsi
-new file mode 100644
-index 0000000..d5a7249
---- /dev/null
-+++ b/arch/arm64/boot/dts/allwinner/sun50i-a64-pine64-common.dtsi
-@@ -0,0 +1,80 @@
-+/*
-+ * Copyright (c) 2016 ARM Ltd.
-+ *
-+ * This file is dual-licensed: you can use it either under the terms
-+ * of the GPL or the X11 license, at your option. Note that this dual
-+ * licensing only applies to this file, and not this project as a
-+ * whole.
-+ *
-+ * a) This library is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License as
-+ * published by the Free Software Foundation; either version 2 of the
-+ * License, or (at your option) any later version.
-+ *
-+ * This library is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ * GNU General Public License for more details.
-+ *
-+ * Or, alternatively,
-+ *
-+ * b) Permission is hereby granted, free of charge, to any person
-+ * obtaining a copy of this software and associated documentation
-+ * files (the "Software"), to deal in the Software without
-+ * restriction, including without limitation the rights to use,
-+ * copy, modify, merge, publish, distribute, sublicense, and/or
-+ * sell copies of the Software, and to permit persons to whom the
-+ * Software is furnished to do so, subject to the following
-+ * conditions:
-+ *
-+ * The above copyright notice and this permission notice shall be
-+ * included in all copies or substantial portions of the Software.
-+ *
-+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-+ * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-+ * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-+ * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
-+ * OTHER DEALINGS IN THE SOFTWARE.
-+ */
-+
-+#include "sun50i-a64.dtsi"
-+
-+/ {
-+
-+ aliases {
-+ serial0 = &uart0;
-+ };
-+
-+ soc {
-+ reg_vcc3v3: vcc3v3 {
-+ compatible = "regulator-fixed";
-+ regulator-name = "vcc3v3";
-+ regulator-min-microvolt = <3300000>;
-+ regulator-max-microvolt = <3300000>;
-+ };
-+ };
-+};
-+
-+&mmc0 {
-+ pinctrl-names = "default";
-+ pinctrl-0 = <&mmc0_pins>, <&mmc0_default_cd_pin>;
-+ vmmc-supply = <&reg_vcc3v3>;
-+ cd-gpios = <&pio 5 6 0>;
-+ cd-inverted;
-+ status = "okay";
-+};
-+
-+&uart0 {
-+ pinctrl-names = "default";
-+ pinctrl-0 = <&uart0_pins_a>;
-+ status = "okay";
-+};
-+
-+&i2c1 {
-+ pinctrl-names = "default";
-+ pinctrl-0 = <&i2c1_pins>;
-+ status = "okay";
-+};
-diff --git a/arch/arm64/boot/dts/allwinner/sun50i-a64-pine64-plus.dts b/arch/arm64/boot/dts/allwinner/sun50i-a64-pine64-plus.dts
-new file mode 100644
-index 0000000..549dc15
---- /dev/null
-+++ b/arch/arm64/boot/dts/allwinner/sun50i-a64-pine64-plus.dts
-@@ -0,0 +1,59 @@
-+/*
-+ * Copyright (c) 2016 ARM Ltd.
-+ *
-+ * This file is dual-licensed: you can use it either under the terms
-+ * of the GPL or the X11 license, at your option. Note that this dual
-+ * licensing only applies to this file, and not this project as a
-+ * whole.
-+ *
-+ * a) This library is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License as
-+ * published by the Free Software Foundation; either version 2 of the
-+ * License, or (at your option) any later version.
-+ *
-+ * This library is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ * GNU General Public License for more details.
-+ *
-+ * Or, alternatively,
-+ *
-+ * b) Permission is hereby granted, free of charge, to any person
-+ * obtaining a copy of this software and associated documentation
-+ * files (the "Software"), to deal in the Software without
-+ * restriction, including without limitation the rights to use,
-+ * copy, modify, merge, publish, distribute, sublicense, and/or
-+ * sell copies of the Software, and to permit persons to whom the
-+ * Software is furnished to do so, subject to the following
-+ * conditions:
-+ *
-+ * The above copyright notice and this permission notice shall be
-+ * included in all copies or substantial portions of the Software.
-+ *
-+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-+ * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-+ * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-+ * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
-+ * OTHER DEALINGS IN THE SOFTWARE.
-+ */
-+
-+/dts-v1/;
-+
-+#include "sun50i-a64-pine64-common.dtsi"
-+
-+/ {
-+ model = "Pine64+";
-+ compatible = "pine64,pine64-plus", "allwinner,sun50i-a64";
-+
-+ chosen {
-+ stdout-path = "serial0:115200n8";
-+ };
-+
-+ /* There is a model with 2GB of DRAM, but U-Boot fixes this for us. */
-+ memory {
-+ reg = <0x40000000 0x40000000>;
-+ };
-+};
-diff --git a/arch/arm64/boot/dts/allwinner/sun50i-a64-pine64.dts b/arch/arm64/boot/dts/allwinner/sun50i-a64-pine64.dts
-new file mode 100644
-index 0000000..ebe029e
---- /dev/null
-+++ b/arch/arm64/boot/dts/allwinner/sun50i-a64-pine64.dts
-@@ -0,0 +1,58 @@
-+/*
-+ * Copyright (c) 2016 ARM Ltd.
-+ *
-+ * This file is dual-licensed: you can use it either under the terms
-+ * of the GPL or the X11 license, at your option. Note that this dual
-+ * licensing only applies to this file, and not this project as a
-+ * whole.
-+ *
-+ * a) This library is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License as
-+ * published by the Free Software Foundation; either version 2 of the
-+ * License, or (at your option) any later version.
-+ *
-+ * This library is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ * GNU General Public License for more details.
-+ *
-+ * Or, alternatively,
-+ *
-+ * b) Permission is hereby granted, free of charge, to any person
-+ * obtaining a copy of this software and associated documentation
-+ * files (the "Software"), to deal in the Software without
-+ * restriction, including without limitation the rights to use,
-+ * copy, modify, merge, publish, distribute, sublicense, and/or
-+ * sell copies of the Software, and to permit persons to whom the
-+ * Software is furnished to do so, subject to the following
-+ * conditions:
-+ *
-+ * The above copyright notice and this permission notice shall be
-+ * included in all copies or substantial portions of the Software.
-+ *
-+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-+ * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-+ * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-+ * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
-+ * OTHER DEALINGS IN THE SOFTWARE.
-+ */
-+
-+/dts-v1/;
-+
-+#include "sun50i-a64-pine64-common.dtsi"
-+
-+/ {
-+ model = "Pine64";
-+ compatible = "pine64,pine64", "allwinner,sun50i-a64";
-+
-+ chosen {
-+ stdout-path = "serial0:115200n8";
-+ };
-+
-+ memory {
-+ reg = <0x40000000 0x20000000>;
-+ };
-+};
-diff --git a/arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi b/arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi
-new file mode 100644
-index 0000000..1bd436f
---- /dev/null
-+++ b/arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi
-@@ -0,0 +1,624 @@
-+/*
-+ * Copyright (C) 2016 ARM Ltd.
-+ * based on the Allwinner H3 dtsi:
-+ * Copyright (C) 2015 Jens Kuske <jenskuske@gmail.com>
-+ *
-+ * This file is dual-licensed: you can use it either under the terms
-+ * of the GPL or the X11 license, at your option. Note that this dual
-+ * licensing only applies to this file, and not this project as a
-+ * whole.
-+ *
-+ * a) This file is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License as
-+ * published by the Free Software Foundation; either version 2 of the
-+ * License, or (at your option) any later version.
-+ *
-+ * This file is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ * GNU General Public License for more details.
-+ *
-+ * Or, alternatively,
-+ *
-+ * b) Permission is hereby granted, free of charge, to any person
-+ * obtaining a copy of this software and associated documentation
-+ * files (the "Software"), to deal in the Software without
-+ * restriction, including without limitation the rights to use,
-+ * copy, modify, merge, publish, distribute, sublicense, and/or
-+ * sell copies of the Software, and to permit persons to whom the
-+ * Software is furnished to do so, subject to the following
-+ * conditions:
-+ *
-+ * The above copyright notice and this permission notice shall be
-+ * included in all copies or substantial portions of the Software.
-+ *
-+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-+ * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-+ * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-+ * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
-+ * OTHER DEALINGS IN THE SOFTWARE.
-+ */
-+
-+#include <dt-bindings/interrupt-controller/arm-gic.h>
-+#include <dt-bindings/pinctrl/sun4i-a10.h>
-+
-+/ {
-+ interrupt-parent = <&gic>;
-+ #address-cells = <1>;
-+ #size-cells = <1>;
-+
-+ cpus {
-+ #address-cells = <1>;
-+ #size-cells = <0>;
-+
-+ cpu@0 {
-+ compatible = "arm,cortex-a53", "arm,armv8";
-+ device_type = "cpu";
-+ reg = <0>;
-+ enable-method = "psci";
-+ };
-+
-+ cpu@1 {
-+ compatible = "arm,cortex-a53", "arm,armv8";
-+ device_type = "cpu";
-+ reg = <1>;
-+ enable-method = "psci";
-+ };
-+
-+ cpu@2 {
-+ compatible = "arm,cortex-a53", "arm,armv8";
-+ device_type = "cpu";
-+ reg = <2>;
-+ enable-method = "psci";
-+ };
-+
-+ cpu@3 {
-+ compatible = "arm,cortex-a53", "arm,armv8";
-+ device_type = "cpu";
-+ reg = <3>;
-+ enable-method = "psci";
-+ };
-+ };
-+
-+ psci {
-+ compatible = "arm,psci-0.2";
-+ method = "smc";
-+ };
-+
-+ memory {
-+ device_type = "memory";
-+ reg = <0x40000000 0>;
-+ };
-+
-+ gic: interrupt-controller@1c81000 {
-+ compatible = "arm,gic-400";
-+ interrupt-controller;
-+ #interrupt-cells = <3>;
-+ #address-cells = <0>;
-+
-+ reg = <0x01c81000 0x1000>,
-+ <0x01c82000 0x2000>,
-+ <0x01c84000 0x2000>,
-+ <0x01c86000 0x2000>;
-+ interrupts = <GIC_PPI 9
-+ (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_HIGH)>;
-+ };
-+
-+ timer {
-+ compatible = "arm,armv8-timer";
-+ interrupts = <GIC_PPI 13
-+ (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_HIGH)>,
-+ <GIC_PPI 14
-+ (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_HIGH)>,
-+ <GIC_PPI 11
-+ (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_HIGH)>,
-+ <GIC_PPI 10
-+ (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_HIGH)>;
-+ };
-+
-+ clocks {
-+ #address-cells = <1>;
-+ #size-cells = <1>;
-+ ranges;
-+
-+ osc24M: osc24M_clk {
-+ #clock-cells = <0>;
-+ compatible = "fixed-clock";
-+ clock-frequency = <24000000>;
-+ clock-output-names = "osc24M";
-+ };
-+
-+ osc32k: osc32k_clk {
-+ #clock-cells = <0>;
-+ compatible = "fixed-clock";
-+ clock-frequency = <32768>;
-+ clock-output-names = "osc32k";
-+ };
-+
-+ pll1: pll1_clk@1c20000 {
-+ #clock-cells = <0>;
-+ compatible = "allwinner,sun8i-a23-pll1-clk";
-+ reg = <0x01c20000 0x4>;
-+ clocks = <&osc24M>;
-+ clock-output-names = "pll1";
-+ };
-+
-+ pll6: pll6_clk@1c20028 {
-+ #clock-cells = <1>;
-+ compatible = "allwinner,sun6i-a31-pll6-clk";
-+ reg = <0x01c20028 0x4>;
-+ clocks = <&osc24M>;
-+ clock-output-names = "pll6", "pll6x2";
-+ };
-+
-+ pll6d2: pll6d2_clk {
-+ #clock-cells = <0>;
-+ compatible = "fixed-factor-clock";
-+ clock-div = <2>;
-+ clock-mult = <1>;
-+ clocks = <&pll6 0>;
-+ clock-output-names = "pll6d2";
-+ };
-+
-+ pll7: pll7_clk@1c2002c {
-+ #clock-cells = <1>;
-+ compatible = "allwinner,sun6i-a31-pll6-clk";
-+ reg = <0x01c2002c 0x4>;
-+ clocks = <&osc24M>;
-+ clock-output-names = "pll7", "pll7x2";
-+ };
-+
-+ cpu: cpu_clk@1c20050 {
-+ #clock-cells = <0>;
-+ compatible = "allwinner,sun4i-a10-cpu-clk";
-+ reg = <0x01c20050 0x4>;
-+ clocks = <&osc32k>, <&osc24M>, <&pll1>, <&pll1>;
-+ clock-output-names = "cpu";
-+ critical-clocks = <0>;
-+ };
-+
-+ axi: axi_clk@1c20050 {
-+ #clock-cells = <0>;
-+ compatible = "allwinner,sun4i-a10-axi-clk";
-+ reg = <0x01c20050 0x4>;
-+ clocks = <&cpu>;
-+ clock-output-names = "axi";
-+ };
-+
-+ ahb1: ahb1_clk@1c20054 {
-+ #clock-cells = <0>;
-+ compatible = "allwinner,sun6i-a31-ahb1-clk";
-+ reg = <0x01c20054 0x4>;
-+ clocks = <&osc32k>, <&osc24M>, <&axi>, <&pll6 0>;
-+ clock-output-names = "ahb1";
-+ };
-+
-+ ahb2: ahb2_clk@1c2005c {
-+ #clock-cells = <0>;
-+ compatible = "allwinner,sun8i-h3-ahb2-clk";
-+ reg = <0x01c2005c 0x4>;
-+ clocks = <&ahb1>, <&pll6d2>;
-+ clock-output-names = "ahb2";
-+ };
-+
-+ apb1: apb1_clk@1c20054 {
-+ #clock-cells = <0>;
-+ compatible = "allwinner,sun4i-a10-apb0-clk";
-+ reg = <0x01c20054 0x4>;
-+ clocks = <&ahb1>;
-+ clock-output-names = "apb1";
-+ };
-+
-+ apb2: apb2_clk@1c20058 {
-+ #clock-cells = <0>;
-+ compatible = "allwinner,sun4i-a10-apb1-clk";
-+ reg = <0x01c20058 0x4>;
-+ clocks = <&osc32k>, <&osc24M>, <&pll6 1>, <&pll6 1>;
-+ clock-output-names = "apb2";
-+ };
-+
-+ bus_gates: bus_gates_clk@1c20060 {
-+ #clock-cells = <1>;
-+ compatible = "allwinner,sun50i-a64-bus-gates-clk",
-+ "allwinner,sunxi-multi-bus-gates-clk";
-+ reg = <0x01c20060 0x14>;
-+ ahb1_parent {
-+ clocks = <&ahb1>;
-+ clock-indices = <1>, <5>,
-+ <6>, <8>,
-+ <9>, <10>,
-+ <13>, <14>,
-+ <18>, <19>,
-+ <20>, <21>,
-+ <23>, <24>,
-+ <25>, <28>,
-+ <32>, <35>,
-+ <36>, <37>,
-+ <40>, <43>,
-+ <44>, <52>,
-+ <53>, <54>,
-+ <135>;
-+ clock-output-names = "bus_mipidsi", "bus_ce",
-+ "bus_dma", "bus_mmc0",
-+ "bus_mmc1", "bus_mmc2",
-+ "bus_nand", "bus_sdram",
-+ "bus_ts", "bus_hstimer",
-+ "bus_spi0", "bus_spi1",
-+ "bus_otg", "bus_otg_ehci0",
-+ "bus_ehci0", "bus_otg_ohci0",
-+ "bus_ve", "bus_lcd0",
-+ "bus_lcd1", "bus_deint",
-+ "bus_csi", "bus_hdmi",
-+ "bus_de", "bus_gpu",
-+ "bus_msgbox", "bus_spinlock",
-+ "bus_dbg";
-+ };
-+ ahb2_parent {
-+ clocks = <&ahb2>;
-+ clock-indices = <17>, <29>;
-+ clock-output-names = "bus_gmac", "bus_ohci0";
-+ };
-+ apb1_parent {
-+ clocks = <&apb1>;
-+ clock-indices = <64>, <65>,
-+ <69>, <72>,
-+ <76>, <77>,
-+ <78>;
-+ clock-output-names = "bus_codec", "bus_spdif",
-+ "bus_pio", "bus_ths",
-+ "bus_i2s0", "bus_i2s1",
-+ "bus_i2s2";
-+ };
-+ abp2_parent {
-+ clocks = <&apb2>;
-+ clock-indices = <96>, <97>,
-+ <98>, <101>,
-+ <112>, <113>,
-+ <114>, <115>,
-+ <116>;
-+ clock-output-names = "bus_i2c0", "bus_i2c1",
-+ "bus_i2c2", "bus_scr",
-+ "bus_uart0", "bus_uart1",
-+ "bus_uart2", "bus_uart3",
-+ "bus_uart4";
-+ };
-+ };
-+
-+ mmc0_clk: mmc0_clk@1c20088 {
-+ #clock-cells = <0>;
-+ compatible = "allwinner,sun4i-a10-mod0-clk";
-+ reg = <0x01c20088 0x4>;
-+ clocks = <&osc24M>, <&pll6 1>, <&pll7 1>;
-+ clock-output-names = "mmc0";
-+ };
-+
-+ mmc1_clk: mmc1_clk@1c2008c {
-+ #clock-cells = <0>;
-+ compatible = "allwinner,sun4i-a10-mod0-clk";
-+ reg = <0x01c2008c 0x4>;
-+ clocks = <&osc24M>, <&pll6 1>, <&pll7 1>;
-+ clock-output-names = "mmc1";
-+ };
-+
-+ mmc2_clk: mmc2_clk@1c20090 {
-+ #clock-cells = <0>;
-+ compatible = "allwinner,sun4i-a10-mod0-clk";
-+ reg = <0x01c20090 0x4>;
-+ clocks = <&osc24M>, <&pll6 1>, <&pll7 1>;
-+ clock-output-names = "mmc2";
-+ };
-+ };
-+
-+ soc {
-+ compatible = "simple-bus";
-+ #address-cells = <1>;
-+ #size-cells = <1>;
-+ ranges;
-+
-+ mmc0: mmc@1c0f000 {
-+ compatible = "allwinner,sun50i-a64-mmc",
-+ "allwinner,sun5i-a13-mmc";
-+ reg = <0x01c0f000 0x1000>;
-+ clocks = <&bus_gates 8>, <&mmc0_clk>,
-+ <&mmc0_clk>, <&mmc0_clk>;
-+ clock-names = "ahb", "mmc",
-+ "output", "sample";
-+ resets = <&ahb_rst 8>;
-+ reset-names = "ahb";
-+ interrupts = <GIC_SPI 60 IRQ_TYPE_LEVEL_HIGH>;
-+ status = "disabled";
-+ #address-cells = <1>;
-+ #size-cells = <0>;
-+ };
-+
-+ mmc1: mmc@1c10000 {
-+ compatible = "allwinner,sun50i-a64-mmc",
-+ "allwinner,sun5i-a13-mmc";
-+ reg = <0x01c10000 0x1000>;
-+ clocks = <&bus_gates 9>, <&mmc1_clk>,
-+ <&mmc1_clk>, <&mmc1_clk>;
-+ clock-names = "ahb", "mmc",
-+ "output", "sample";
-+ resets = <&ahb_rst 9>;
-+ reset-names = "ahb";
-+ interrupts = <GIC_SPI 61 IRQ_TYPE_LEVEL_HIGH>;
-+ status = "disabled";
-+ #address-cells = <1>;
-+ #size-cells = <0>;
-+ };
-+
-+ mmc2: mmc@1c11000 {
-+ compatible = "allwinner,sun50i-a64-mmc",
-+ "allwinner,sun5i-a13-mmc";
-+ reg = <0x01c11000 0x1000>;
-+ clocks = <&bus_gates 10>, <&mmc2_clk>,
-+ <&mmc2_clk>, <&mmc2_clk>;
-+ clock-names = "ahb", "mmc",
-+ "output", "sample";
-+ resets = <&ahb_rst 10>;
-+ reset-names = "ahb";
-+ interrupts = <GIC_SPI 62 IRQ_TYPE_LEVEL_HIGH>;
-+ status = "disabled";
-+ #address-cells = <1>;
-+ #size-cells = <0>;
-+ };
-+
-+ pio: pinctrl@1c20800 {
-+ compatible = "allwinner,sun50i-a64-pinctrl";
-+ reg = <0x01c20800 0x400>;
-+ interrupts = <GIC_SPI 11 IRQ_TYPE_LEVEL_HIGH>,
-+ <GIC_SPI 17 IRQ_TYPE_LEVEL_HIGH>,
-+ <GIC_SPI 21 IRQ_TYPE_LEVEL_HIGH>;
-+ clocks = <&bus_gates 69>;
-+ gpio-controller;
-+ #gpio-cells = <3>;
-+ interrupt-controller;
-+ #interrupt-cells = <2>;
-+
-+ uart0_pins_a: uart0@0 {
-+ allwinner,pins = "PB8", "PB9";
-+ allwinner,function = "uart0";
-+ allwinner,drive = <SUN4I_PINCTRL_10_MA>;
-+ allwinner,pull = <SUN4I_PINCTRL_NO_PULL>;
-+ };
-+
-+ uart0_pins_b: uart0@1 {
-+ allwinner,pins = "PF2", "PF3";
-+ allwinner,function = "uart0";
-+ allwinner,drive = <SUN4I_PINCTRL_10_MA>;
-+ allwinner,pull = <SUN4I_PINCTRL_NO_PULL>;
-+ };
-+
-+ uart1_2pins: uart1_2@0 {
-+ allwinner,pins = "PG6", "PG7";
-+ allwinner,function = "uart1";
-+ allwinner,drive = <SUN4I_PINCTRL_10_MA>;
-+ allwinner,pull = <SUN4I_PINCTRL_NO_PULL>;
-+ };
-+
-+ uart1_4pins: uart1_4@0 {
-+ allwinner,pins = "PG6", "PG7", "PG8", "PG9";
-+ allwinner,function = "uart1";
-+ allwinner,drive = <SUN4I_PINCTRL_10_MA>;
-+ allwinner,pull = <SUN4I_PINCTRL_NO_PULL>;
-+ };
-+
-+ uart2_2pins: uart2_2@0 {
-+ allwinner,pins = "PB0", "PB1";
-+ allwinner,function = "uart2";
-+ allwinner,drive = <SUN4I_PINCTRL_10_MA>;
-+ allwinner,pull = <SUN4I_PINCTRL_NO_PULL>;
-+ };
-+
-+ uart2_4pins: uart2_4@0 {
-+ allwinner,pins = "PB0", "PB1", "PB2", "PB3";
-+ allwinner,function = "uart2";
-+ allwinner,drive = <SUN4I_PINCTRL_10_MA>;
-+ allwinner,pull = <SUN4I_PINCTRL_NO_PULL>;
-+ };
-+
-+ uart3_pins_a: uart3@0 {
-+ allwinner,pins = "PD0", "PD1";
-+ allwinner,function = "uart3";
-+ allwinner,drive = <SUN4I_PINCTRL_10_MA>;
-+ allwinner,pull = <SUN4I_PINCTRL_NO_PULL>;
-+ };
-+
-+ uart3_2pins_b: uart3_2@1 {
-+ allwinner,pins = "PH4", "PH5";
-+ allwinner,function = "uart3";
-+ allwinner,drive = <SUN4I_PINCTRL_10_MA>;
-+ allwinner,pull = <SUN4I_PINCTRL_NO_PULL>;
-+ };
-+
-+ uart3_4pins_b: uart3_4@1 {
-+ allwinner,pins = "PH4", "PH5", "PH6", "PH7";
-+ allwinner,function = "uart3";
-+ allwinner,drive = <SUN4I_PINCTRL_10_MA>;
-+ allwinner,pull = <SUN4I_PINCTRL_NO_PULL>;
-+ };
-+
-+ uart4_2pins: uart4_2@0 {
-+ allwinner,pins = "PD2", "PD3";
-+ allwinner,function = "uart4";
-+ allwinner,drive = <SUN4I_PINCTRL_10_MA>;
-+ allwinner,pull = <SUN4I_PINCTRL_NO_PULL>;
-+ };
-+
-+ uart4_4pins: uart4_4@0 {
-+ allwinner,pins = "PD2", "PD3", "PD4", "PD5";
-+ allwinner,function = "uart4";
-+ allwinner,drive = <SUN4I_PINCTRL_10_MA>;
-+ allwinner,pull = <SUN4I_PINCTRL_NO_PULL>;
-+ };
-+
-+ mmc0_pins: mmc0@0 {
-+ allwinner,pins = "PF0", "PF1", "PF2", "PF3",
-+ "PF4", "PF5";
-+ allwinner,function = "mmc0";
-+ allwinner,drive = <SUN4I_PINCTRL_30_MA>;
-+ allwinner,pull = <SUN4I_PINCTRL_NO_PULL>;
-+ };
-+
-+ mmc0_default_cd_pin: mmc0_cd_pin@0 {
-+ allwinner,pins = "PF6";
-+ allwinner,function = "gpio_in";
-+ allwinner,drive = <SUN4I_PINCTRL_10_MA>;
-+ allwinner,pull = <SUN4I_PINCTRL_PULL_UP>;
-+ };
-+
-+ mmc1_pins: mmc1@0 {
-+ allwinner,pins = "PG0", "PG1", "PG2", "PG3",
-+ "PG4", "PG5";
-+ allwinner,function = "mmc1";
-+ allwinner,drive = <SUN4I_PINCTRL_30_MA>;
-+ allwinner,pull = <SUN4I_PINCTRL_NO_PULL>;
-+ };
-+
-+ mmc2_pins: mmc2@0 {
-+ allwinner,pins = "PC1", "PC5", "PC6", "PC8",
-+ "PC9", "PC10";
-+ allwinner,function = "mmc2";
-+ allwinner,drive = <SUN4I_PINCTRL_30_MA>;
-+ allwinner,pull = <SUN4I_PINCTRL_NO_PULL>;
-+ };
-+
-+ i2c0_pins: i2c0_pins {
-+ allwinner,pins = "PH0", "PH1";
-+ allwinner,function = "i2c0";
-+ allwinner,drive = <SUN4I_PINCTRL_10_MA>;
-+ allwinner,pull = <SUN4I_PINCTRL_NO_PULL>;
-+ };
-+
-+ i2c1_pins: i2c1_pins {
-+ allwinner,pins = "PH2", "PH3";
-+ allwinner,function = "i2c1";
-+ allwinner,drive = <SUN4I_PINCTRL_10_MA>;
-+ allwinner,pull = <SUN4I_PINCTRL_NO_PULL>;
-+ };
-+
-+ i2c2_pins: i2c2_pins {
-+ allwinner,pins = "PE14", "PE15";
-+ allwinner,function = "i2c2";
-+ allwinner,drive = <SUN4I_PINCTRL_10_MA>;
-+ allwinner,pull = <SUN4I_PINCTRL_NO_PULL>;
-+ };
-+ };
-+
-+ ahb_rst: reset@1c202c0 {
-+ #reset-cells = <1>;
-+ compatible = "allwinner,sun6i-a31-clock-reset";
-+ reg = <0x01c202c0 0xc>;
-+ };
-+
-+ apb1_rst: reset@1c202d0 {
-+ #reset-cells = <1>;
-+ compatible = "allwinner,sun6i-a31-clock-reset";
-+ reg = <0x01c202d0 0x4>;
-+ };
-+
-+ apb2_rst: reset@1c202d8 {
-+ #reset-cells = <1>;
-+ compatible = "allwinner,sun6i-a31-clock-reset";
-+ reg = <0x01c202d8 0x4>;
-+ };
-+
-+ uart0: serial@1c28000 {
-+ compatible = "snps,dw-apb-uart";
-+ reg = <0x01c28000 0x400>;
-+ interrupts = <GIC_SPI 0 IRQ_TYPE_LEVEL_HIGH>;
-+ reg-shift = <2>;
-+ reg-io-width = <4>;
-+ clocks = <&bus_gates 112>;
-+ resets = <&apb2_rst 16>;
-+ status = "disabled";
-+ };
-+
-+ uart1: serial@1c28400 {
-+ compatible = "snps,dw-apb-uart";
-+ reg = <0x01c28400 0x400>;
-+ interrupts = <GIC_SPI 1 IRQ_TYPE_LEVEL_HIGH>;
-+ reg-shift = <2>;
-+ reg-io-width = <4>;
-+ clocks = <&bus_gates 113>;
-+ resets = <&apb2_rst 17>;
-+ status = "disabled";
-+ };
-+
-+ uart2: serial@1c28800 {
-+ compatible = "snps,dw-apb-uart";
-+ reg = <0x01c28800 0x400>;
-+ interrupts = <GIC_SPI 2 IRQ_TYPE_LEVEL_HIGH>;
-+ reg-shift = <2>;
-+ reg-io-width = <4>;
-+ clocks = <&bus_gates 114>;
-+ resets = <&apb2_rst 18>;
-+ status = "disabled";
-+ };
-+
-+ uart3: serial@1c28c00 {
-+ compatible = "snps,dw-apb-uart";
-+ reg = <0x01c28c00 0x400>;
-+ interrupts = <GIC_SPI 3 IRQ_TYPE_LEVEL_HIGH>;
-+ reg-shift = <2>;
-+ reg-io-width = <4>;
-+ clocks = <&bus_gates 115>;
-+ resets = <&apb2_rst 19>;
-+ status = "disabled";
-+ };
-+
-+ uart4: serial@1c29000 {
-+ compatible = "snps,dw-apb-uart";
-+ reg = <0x01c29000 0x400>;
-+ interrupts = <GIC_SPI 4 IRQ_TYPE_LEVEL_HIGH>;
-+ reg-shift = <2>;
-+ reg-io-width = <4>;
-+ clocks = <&bus_gates 116>;
-+ resets = <&apb2_rst 20>;
-+ status = "disabled";
-+ };
-+
-+ rtc: rtc@1f00000 {
-+ compatible = "allwinner,sun6i-a31-rtc";
-+ reg = <0x01f00000 0x54>;
-+ interrupts = <GIC_SPI 40 IRQ_TYPE_LEVEL_HIGH>,
-+ <GIC_SPI 41 IRQ_TYPE_LEVEL_HIGH>;
-+ };
-+
-+ i2c0: i2c@1c2ac00 {
-+ compatible = "allwinner,sun6i-a31-i2c";
-+ reg = <0x01c2ac00 0x400>;
-+ interrupts = <GIC_SPI 6 IRQ_TYPE_LEVEL_HIGH>;
-+ clocks = <&bus_gates 96>;
-+ resets = <&apb2_rst 0>;
-+ status = "disabled";
-+ #address-cells = <1>;
-+ #size-cells = <0>;
-+ };
-+
-+ i2c1: i2c@1c2b000 {
-+ compatible = "allwinner,sun6i-a31-i2c";
-+ reg = <0x01c2b000 0x400>;
-+ interrupts = <GIC_SPI 7 IRQ_TYPE_LEVEL_HIGH>;
-+ clocks = <&bus_gates 97>;
-+ resets = <&apb2_rst 1>;
-+ status = "disabled";
-+ #address-cells = <1>;
-+ #size-cells = <0>;
-+ };
-+
-+ i2c2: i2c@1c2b400 {
-+ compatible = "allwinner,sun6i-a31-i2c";
-+ reg = <0x01c2b400 0x400>;
-+ interrupts = <GIC_SPI 8 IRQ_TYPE_LEVEL_HIGH>;
-+ clocks = <&bus_gates 98>;
-+ resets = <&apb2_rst 2>;
-+ status = "disabled";
-+ #address-cells = <1>;
-+ #size-cells = <0>;
-+ };
-+ };
-+};
-diff --git a/drivers/clk/sunxi/Makefile b/drivers/clk/sunxi/Makefile
-index 3fd7901..3a9dc31 100644
---- a/drivers/clk/sunxi/Makefile
-+++ b/drivers/clk/sunxi/Makefile
-@@ -11,6 +11,7 @@ obj-y += clk-a10-ve.o
- obj-y += clk-a20-gmac.o
- obj-y += clk-mod0.o
- obj-y += clk-simple-gates.o
-+obj-y += clk-multi-gates.o
- obj-y += clk-sun8i-bus-gates.o
- obj-y += clk-sun8i-mbus.o
- obj-y += clk-sun9i-core.o
-diff --git a/drivers/clk/sunxi/clk-factors.c b/drivers/clk/sunxi/clk-factors.c
-index 59428db..607ba53 100644
---- a/drivers/clk/sunxi/clk-factors.c
-+++ b/drivers/clk/sunxi/clk-factors.c
-@@ -184,7 +184,8 @@ struct clk *sunxi_factors_register(struct device_node *node,
- if (data->name)
- clk_name = data->name;
- else
-- of_property_read_string(node, "clock-output-names", &clk_name);
-+ of_property_read_string_index(node, "clock-output-names",
-+ data->name_idx, &clk_name);
-
- factors = kzalloc(sizeof(struct clk_factors), GFP_KERNEL);
- if (!factors)
-diff --git a/drivers/clk/sunxi/clk-factors.h b/drivers/clk/sunxi/clk-factors.h
-index 171085a..cc89d1f 100644
---- a/drivers/clk/sunxi/clk-factors.h
-+++ b/drivers/clk/sunxi/clk-factors.h
-@@ -26,6 +26,7 @@ struct factors_data {
- void (*getter)(struct factors_request *req);
- void (*recalc)(struct factors_request *req);
- const char *name;
-+ int name_idx;
- };
-
- struct clk_factors {
-diff --git a/drivers/clk/sunxi/clk-multi-gates.c b/drivers/clk/sunxi/clk-multi-gates.c
-new file mode 100644
-index 0000000..76e715a
---- /dev/null
-+++ b/drivers/clk/sunxi/clk-multi-gates.c
-@@ -0,0 +1,105 @@
-+/*
-+ * Copyright (C) 2016 ARM Ltd.
-+ *
-+ * Based on clk-sun8i-bus-gates.c, which is:
-+ * Copyright (C) 2015 Jens Kuske <jenskuske@gmail.com>
-+ * Based on clk-simple-gates.c, which is:
-+ * Copyright 2015 Maxime Ripard <maxime.ripard@free-electrons.com>
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ * GNU General Public License for more details.
-+ */
-+
-+#include <linux/clk-provider.h>
-+#include <linux/of.h>
-+#include <linux/of_address.h>
-+#include <linux/slab.h>
-+#include <linux/spinlock.h>
-+
-+static DEFINE_SPINLOCK(gates_lock);
-+
-+static void __init sunxi_parse_parent(struct device_node *node,
-+ struct clk_onecell_data *clk_data,
-+ void __iomem *reg)
-+{
-+ const char *parent = of_clk_get_parent_name(node, 0);
-+ const char *clk_name;
-+ struct property *prop;
-+ struct clk *clk;
-+ const __be32 *p;
-+ int index, i = 0;
-+
-+ of_property_for_each_u32(node, "clock-indices", prop, p, index) {
-+ of_property_read_string_index(node, "clock-output-names",
-+ i, &clk_name);
-+
-+ clk = clk_register_gate(NULL, clk_name, parent, 0,
-+ reg + 4 * (index / 32), index % 32,
-+ 0, &gates_lock);
-+ i++;
-+ if (IS_ERR(clk)) {
-+ pr_warn("could not register gate clock \"%s\"\n",
-+ clk_name);
-+ continue;
-+ }
-+ if (clk_data->clks[index])
-+ pr_warn("bus-gate clock %s: index #%d already registered as %s\n",
-+ clk_name, index, "?");
-+ else
-+ clk_data->clks[index] = clk;
-+ }
-+}
-+
-+static void __init sunxi_multi_bus_gates_init(struct device_node *node)
-+{
-+ struct clk_onecell_data *clk_data;
-+ struct device_node *child;
-+ struct property *prop;
-+ struct resource res;
-+ void __iomem *reg;
-+ const __be32 *p;
-+ int number = 0;
-+ int index;
-+
-+ reg = of_io_request_and_map(node, 0, of_node_full_name(node));
-+ if (IS_ERR(reg))
-+ return;
-+
-+ clk_data = kmalloc(sizeof(struct clk_onecell_data), GFP_KERNEL);
-+ if (!clk_data)
-+ goto err_unmap;
-+
-+ for_each_child_of_node(node, child)
-+ of_property_for_each_u32(child, "clock-indices", prop, p, index)
-+ number = max(number, index);
-+
-+ clk_data->clks = kcalloc(number + 1, sizeof(struct clk *), GFP_KERNEL);
-+ if (!clk_data->clks)
-+ goto err_free_data;
-+
-+ for_each_child_of_node(node, child)
-+ sunxi_parse_parent(child, clk_data, reg);
-+
-+ clk_data->clk_num = number + 1;
-+ if (of_clk_add_provider(node, of_clk_src_onecell_get, clk_data))
-+ pr_err("registering bus-gate clock %s failed\n", node->name);
-+
-+ return;
-+
-+err_free_data:
-+ kfree(clk_data);
-+err_unmap:
-+ iounmap(reg);
-+ of_address_to_resource(node, 0, &res);
-+ release_mem_region(res.start, resource_size(&res));
-+}
-+
-+CLK_OF_DECLARE(sunxi_multi_bus_gates, "allwinner,sunxi-multi-bus-gates-clk",
-+ sunxi_multi_bus_gates_init);
-diff --git a/drivers/clk/sunxi/clk-sunxi.c b/drivers/clk/sunxi/clk-sunxi.c
-index 5ba2188..ca59458 100644
---- a/drivers/clk/sunxi/clk-sunxi.c
-+++ b/drivers/clk/sunxi/clk-sunxi.c
-@@ -711,14 +711,14 @@ static const struct factors_data sun4i_pll6_data __initconst = {
- .enable = 31,
- .table = &sun4i_pll5_config,
- .getter = sun4i_get_pll5_factors,
-- .name = "pll6",
-+ .name_idx = 2,
- };
-
- static const struct factors_data sun6i_a31_pll6_data __initconst = {
- .enable = 31,
- .table = &sun6i_a31_pll6_config,
- .getter = sun6i_a31_get_pll6_factors,
-- .name = "pll6x2",
-+ .name_idx = 1,
- };
-
- static const struct factors_data sun5i_a13_ahb_data __initconst = {
---
-2.5.0
-
diff --git a/aacraid-Check-size-values-after-double-fetch-from-us.patch b/aacraid-Check-size-values-after-double-fetch-from-us.patch
new file mode 100644
index 000000000..6ff771160
--- /dev/null
+++ b/aacraid-Check-size-values-after-double-fetch-from-us.patch
@@ -0,0 +1,65 @@
+From fa00c437eef8dc2e7b25f8cd868cfa405fcc2bb3 Mon Sep 17 00:00:00 2001
+From: Dave Carroll <david.carroll@microsemi.com>
+Date: Fri, 5 Aug 2016 13:44:10 -0600
+Subject: [PATCH] aacraid: Check size values after double-fetch from user
+
+In aacraid's ioctl_send_fib() we do two fetches from userspace, one the
+get the fib header's size and one for the fib itself. Later we use the
+size field from the second fetch to further process the fib. If for some
+reason the size from the second fetch is different than from the first
+fix, we may encounter an out-of- bounds access in aac_fib_send(). We
+also check the sender size to insure it is not out of bounds. This was
+reported in https://bugzilla.kernel.org/show_bug.cgi?id=116751 and was
+assigned CVE-2016-6480.
+
+Reported-by: Pengfei Wang <wpengfeinudt@gmail.com>
+Fixes: 7c00ffa31 '[SCSI] 2.6 aacraid: Variable FIB size (updated patch)'
+Cc: stable@vger.kernel.org
+Signed-off-by: Dave Carroll <david.carroll@microsemi.com>
+Reviewed-by: Johannes Thumshirn <jthumshirn@suse.de>
+Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
+---
+ drivers/scsi/aacraid/commctrl.c | 13 +++++++++++--
+ 1 file changed, 11 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/scsi/aacraid/commctrl.c b/drivers/scsi/aacraid/commctrl.c
+index b381b37..5648b71 100644
+--- a/drivers/scsi/aacraid/commctrl.c
++++ b/drivers/scsi/aacraid/commctrl.c
+@@ -63,7 +63,7 @@ static int ioctl_send_fib(struct aac_dev * dev, void __user *arg)
+ struct fib *fibptr;
+ struct hw_fib * hw_fib = (struct hw_fib *)0;
+ dma_addr_t hw_fib_pa = (dma_addr_t)0LL;
+- unsigned size;
++ unsigned int size, osize;
+ int retval;
+
+ if (dev->in_reset) {
+@@ -87,7 +87,8 @@ static int ioctl_send_fib(struct aac_dev * dev, void __user *arg)
+ * will not overrun the buffer when we copy the memory. Return
+ * an error if we would.
+ */
+- size = le16_to_cpu(kfib->header.Size) + sizeof(struct aac_fibhdr);
++ osize = size = le16_to_cpu(kfib->header.Size) +
++ sizeof(struct aac_fibhdr);
+ if (size < le16_to_cpu(kfib->header.SenderSize))
+ size = le16_to_cpu(kfib->header.SenderSize);
+ if (size > dev->max_fib_size) {
+@@ -118,6 +119,14 @@ static int ioctl_send_fib(struct aac_dev * dev, void __user *arg)
+ goto cleanup;
+ }
+
++ /* Sanity check the second copy */
++ if ((osize != le16_to_cpu(kfib->header.Size) +
++ sizeof(struct aac_fibhdr))
++ || (size < le16_to_cpu(kfib->header.SenderSize))) {
++ retval = -EINVAL;
++ goto cleanup;
++ }
++
+ if (kfib->header.Command == cpu_to_le16(TakeABreakPt)) {
+ aac_adapter_interrupt(dev);
+ /*
+--
+2.7.4
+
diff --git a/bcm2837-initial-support.patch b/bcm2837-initial-support.patch
new file mode 100644
index 000000000..ba3902c4b
--- /dev/null
+++ b/bcm2837-initial-support.patch
@@ -0,0 +1,332 @@
+From da77f737f9f5a487f3a1f80f8546585ee18cd7b9 Mon Sep 17 00:00:00 2001
+From: Eric Anholt <eric@anholt.net>
+Date: Fri, 4 Mar 2016 10:39:28 -0800
+Subject: [PATCH 27/36] dt-bindings: Add root properties for Raspberry Pi 3
+
+Signed-off-by: Eric Anholt <eric@anholt.net>
+Acked-by: Rob Herring <robh@kernel.org>
+---
+ Documentation/devicetree/bindings/arm/bcm/brcm,bcm2835.txt | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+diff --git a/Documentation/devicetree/bindings/arm/bcm/brcm,bcm2835.txt b/Documentation/devicetree/bindings/arm/bcm/brcm,bcm2835.txt
+index 11d3056..6ffe087 100644
+--- a/Documentation/devicetree/bindings/arm/bcm/brcm,bcm2835.txt
++++ b/Documentation/devicetree/bindings/arm/bcm/brcm,bcm2835.txt
+@@ -30,6 +30,10 @@ Raspberry Pi 2 Model B
+ Required root node properties:
+ compatible = "raspberrypi,2-model-b", "brcm,bcm2836";
+
++Raspberry Pi 3 Model B
++Required root node properties:
++compatible = "raspberrypi,3-model-b", "brcm,bcm2837";
++
+ Raspberry Pi Compute Module
+ Required root node properties:
+ compatible = "raspberrypi,compute-module", "brcm,bcm2835";
+--
+2.7.3
+
+From a2858804c7f5f4585b718543236b7ba3b3ec813a Mon Sep 17 00:00:00 2001
+From: Peter Robinson <pbrobinson@gmail.com>
+Date: Mon, 29 Aug 2016 09:14:15 +0100
+Subject: [PATCH] ARM: bcm283x: Add devicetree for the Raspberry Pi 3.
+
+For now this doesn't support the new hardware present on the Pi 3 (BT,
+wifi, GPIO expander).
+
+Rebased to the patch that went upstream for ARM64
+
+Signed-off-by: Peter Robinson <pbrobinson@gmail.com>
+---
+ arch/arm/boot/dts/Makefile | 3 +-
+ arch/arm/boot/dts/bcm2837-rpi-3-b.dts | 30 ++++++++++++++
+ arch/arm/boot/dts/bcm2837.dtsi | 76 +++++++++++++++++++++++++++++++++++
+ 3 files changed, 108 insertions(+), 1 deletion(-)
+ create mode 100644 arch/arm/boot/dts/bcm2837-rpi-3-b.dts
+ create mode 100644 arch/arm/boot/dts/bcm2837.dtsi
+
+diff --git a/arch/arm/boot/dts/Makefile b/arch/arm/boot/dts/Makefile
+index faacd52..ec41888 100644
+--- a/arch/arm/boot/dts/Makefile
++++ b/arch/arm/boot/dts/Makefile
+@@ -69,7 +69,8 @@ dtb-$(CONFIG_ARCH_BCM2835) += \
+ bcm2835-rpi-b-rev2.dtb \
+ bcm2835-rpi-b-plus.dtb \
+ bcm2835-rpi-a-plus.dtb \
+- bcm2836-rpi-2-b.dtb
++ bcm2836-rpi-2-b.dtb \
++ bcm2837-rpi-3-b.dtb
+ dtb-$(CONFIG_ARCH_BCM_5301X) += \
+ bcm4708-asus-rt-ac56u.dtb \
+ bcm4708-asus-rt-ac68u.dtb \
+diff --git a/arch/arm/boot/dts/bcm2837-rpi-3-b.dts b/arch/arm/boot/dts/bcm2837-rpi-3-b.dts
+new file mode 100644
+index 0000000..7841b72
+--- /dev/null
++++ b/arch/arm/boot/dts/bcm2837-rpi-3-b.dts
+@@ -0,0 +1,30 @@
++/dts-v1/;
++#include "bcm2837.dtsi"
++#include "bcm2835-rpi.dtsi"
++#include "bcm283x-rpi-smsc9514.dtsi"
++
++/ {
++ compatible = "raspberrypi,3-model-b", "brcm,bcm2837";
++ model = "Raspberry Pi 3 Model B";
++
++ memory {
++ reg = <0 0x40000000>;
++ };
++
++ leds {
++ act {
++ gpios = <&gpio 47 0>;
++ };
++
++ pwr {
++ label = "PWR";
++ gpios = <&gpio 35 0>;
++ default-state = "keep";
++ linux,default-trigger = "default-on";
++ };
++ };
++};
++
++&uart1 {
++ status = "okay";
++};
+diff --git a/arch/arm/boot/dts/bcm2837.dtsi b/arch/arm/boot/dts/bcm2837.dtsi
+new file mode 100644
+index 0000000..8216bbb
+--- /dev/null
++++ b/arch/arm/boot/dts/bcm2837.dtsi
+@@ -0,0 +1,76 @@
++#include "bcm283x.dtsi"
++
++/ {
++ compatible = "brcm,bcm2836";
++
++ soc {
++ ranges = <0x7e000000 0x3f000000 0x1000000>,
++ <0x40000000 0x40000000 0x00001000>;
++ dma-ranges = <0xc0000000 0x00000000 0x3f000000>;
++
++ local_intc: local_intc {
++ compatible = "brcm,bcm2836-l1-intc";
++ reg = <0x40000000 0x100>;
++ interrupt-controller;
++ #interrupt-cells = <1>;
++ interrupt-parent = <&local_intc>;
++ };
++ };
++
++ timer {
++ compatible = "arm,armv7-timer";
++ interrupt-parent = <&local_intc>;
++ interrupts = <0>, // PHYS_SECURE_PPI
++ <1>, // PHYS_NONSECURE_PPI
++ <3>, // VIRT_PPI
++ <2>; // HYP_PPI
++ always-on;
++ };
++
++ cpus: cpus {
++ #address-cells = <1>;
++ #size-cells = <0>;
++
++ cpu0: cpu@0 {
++ device_type = "cpu";
++ compatible = "arm,cortex-a53";
++ reg = <0>;
++ enable-method = "spin-table";
++ cpu-release-addr = <0x0 0x000000d8>;
++ };
++
++ cpu1: cpu@1 {
++ device_type = "cpu";
++ compatible = "arm,cortex-a53";
++ reg = <1>;
++ enable-method = "spin-table";
++ cpu-release-addr = <0x0 0x000000e0>;
++ };
++
++ cpu2: cpu@2 {
++ device_type = "cpu";
++ compatible = "arm,cortex-a53";
++ reg = <2>;
++ enable-method = "spin-table";
++ cpu-release-addr = <0x0 0x000000e8>;
++ };
++
++ cpu3: cpu@3 {
++ device_type = "cpu";
++ compatible = "arm,cortex-a53";
++ reg = <3>;
++ enable-method = "spin-table";
++ cpu-release-addr = <0x0 0x000000f0>;
++ };
++ };
++};
++
++/* Make the BCM2835-style global interrupt controller be a child of the
++ * CPU-local interrupt controller.
++ */
++&intc {
++ compatible = "brcm,bcm2836-armctrl-ic";
++ reg = <0x7e00b200 0x200>;
++ interrupt-parent = <&local_intc>;
++ interrupts = <8>;
++};
+--
+2.9.3
+
+From fc07a6d394f41a98f839507580082184ac684912 Mon Sep 17 00:00:00 2001
+From: Lubomir Rintel <lkundrak@v3.sk>
+Date: Mon, 2 May 2016 09:06:51 +0200
+Subject: [PATCH 1/2] ARM: bcm2835: dt: Add the ethernet to the device trees
+
+The hub and the ethernet in its port 1 are hardwired on the board.
+
+Compared to the adapters that can be plugged into the USB ports, this
+one has no serial EEPROM to store its MAC. Nevertheless, the Raspberry Pi
+has the MAC address for this adapter in its ROM, accessible from its
+firmware.
+
+U-Boot can read out the address and set the local-mac-address property of the
+node with "ethernet" alias. Let's add the node so that U-Boot can do its
+business.
+
+Model B rev2 and Model B+ entries were verified by me, the hierarchy and
+pid/vid pair for the Version 2 was provided by Peter Chen. Original
+Model B is a blind shot, though very likely correct.
+
+Signed-off-by: Lubomir Rintel <lkundrak@v3.sk>
+Acked-by: Stephen Warren <swarren@wwwdotorg.org>
+Signed-off-by: Eric Anholt <eric@anholt.net>
+---
+ arch/arm/boot/dts/bcm2835-rpi-b-plus.dts | 1 +
+ arch/arm/boot/dts/bcm2835-rpi-b-rev2.dts | 1 +
+ arch/arm/boot/dts/bcm2835-rpi-b.dts | 1 +
+ arch/arm/boot/dts/bcm2836-rpi-2-b.dts | 1 +
+ arch/arm/boot/dts/bcm283x-rpi-smsc9512.dtsi | 19 +++++++++++++++++++
+ arch/arm/boot/dts/bcm283x-rpi-smsc9514.dtsi | 19 +++++++++++++++++++
+ arch/arm/boot/dts/bcm283x.dtsi | 2 ++
+ 7 files changed, 44 insertions(+)
+ create mode 100644 arch/arm/boot/dts/bcm283x-rpi-smsc9512.dtsi
+ create mode 100644 arch/arm/boot/dts/bcm283x-rpi-smsc9514.dtsi
+
+diff --git a/arch/arm/boot/dts/bcm2835-rpi-b-plus.dts b/arch/arm/boot/dts/bcm2835-rpi-b-plus.dts
+index 57d313b..d5fdb8e 100644
+--- a/arch/arm/boot/dts/bcm2835-rpi-b-plus.dts
++++ b/arch/arm/boot/dts/bcm2835-rpi-b-plus.dts
+@@ -1,6 +1,7 @@
+ /dts-v1/;
+ #include "bcm2835.dtsi"
+ #include "bcm2835-rpi.dtsi"
++#include "bcm283x-rpi-smsc9514.dtsi"
+
+ / {
+ compatible = "raspberrypi,model-b-plus", "brcm,bcm2835";
+diff --git a/arch/arm/boot/dts/bcm2835-rpi-b-rev2.dts b/arch/arm/boot/dts/bcm2835-rpi-b-rev2.dts
+index cf2774e..bfc4bd9 100644
+--- a/arch/arm/boot/dts/bcm2835-rpi-b-rev2.dts
++++ b/arch/arm/boot/dts/bcm2835-rpi-b-rev2.dts
+@@ -1,6 +1,7 @@
+ /dts-v1/;
+ #include "bcm2835.dtsi"
+ #include "bcm2835-rpi.dtsi"
++#include "bcm283x-rpi-smsc9512.dtsi"
+
+ / {
+ compatible = "raspberrypi,model-b-rev2", "brcm,bcm2835";
+diff --git a/arch/arm/boot/dts/bcm2835-rpi-b.dts b/arch/arm/boot/dts/bcm2835-rpi-b.dts
+index 8b15f9c..0371bb7 100644
+--- a/arch/arm/boot/dts/bcm2835-rpi-b.dts
++++ b/arch/arm/boot/dts/bcm2835-rpi-b.dts
+@@ -1,6 +1,7 @@
+ /dts-v1/;
+ #include "bcm2835.dtsi"
+ #include "bcm2835-rpi.dtsi"
++#include "bcm283x-rpi-smsc9512.dtsi"
+
+ / {
+ compatible = "raspberrypi,model-b", "brcm,bcm2835";
+diff --git a/arch/arm/boot/dts/bcm2836-rpi-2-b.dts b/arch/arm/boot/dts/bcm2836-rpi-2-b.dts
+index c4743f4..29e1cfe 100644
+--- a/arch/arm/boot/dts/bcm2836-rpi-2-b.dts
++++ b/arch/arm/boot/dts/bcm2836-rpi-2-b.dts
+@@ -1,6 +1,7 @@
+ /dts-v1/;
+ #include "bcm2836.dtsi"
+ #include "bcm2835-rpi.dtsi"
++#include "bcm283x-rpi-smsc9514.dtsi"
+
+ / {
+ compatible = "raspberrypi,2-model-b", "brcm,bcm2836";
+diff --git a/arch/arm/boot/dts/bcm283x-rpi-smsc9512.dtsi b/arch/arm/boot/dts/bcm283x-rpi-smsc9512.dtsi
+new file mode 100644
+index 0000000..12c981e
+--- /dev/null
++++ b/arch/arm/boot/dts/bcm283x-rpi-smsc9512.dtsi
+@@ -0,0 +1,19 @@
++/ {
++ aliases {
++ ethernet = &ethernet;
++ };
++};
++
++&usb {
++ usb1@1 {
++ compatible = "usb424,9512";
++ reg = <1>;
++ #address-cells = <1>;
++ #size-cells = <0>;
++
++ ethernet: usbether@1 {
++ compatible = "usb424,ec00";
++ reg = <1>;
++ };
++ };
++};
+diff --git a/arch/arm/boot/dts/bcm283x-rpi-smsc9514.dtsi b/arch/arm/boot/dts/bcm283x-rpi-smsc9514.dtsi
+new file mode 100644
+index 0000000..3f0a56e
+--- /dev/null
++++ b/arch/arm/boot/dts/bcm283x-rpi-smsc9514.dtsi
+@@ -0,0 +1,19 @@
++/ {
++ aliases {
++ ethernet = &ethernet;
++ };
++};
++
++&usb {
++ usb1@1 {
++ compatible = "usb424,9514";
++ reg = <1>;
++ #address-cells = <1>;
++ #size-cells = <0>;
++
++ ethernet: usbether@1 {
++ compatible = "usb424,ec00";
++ reg = <1>;
++ };
++ };
++};
+diff --git a/arch/arm/boot/dts/bcm283x.dtsi b/arch/arm/boot/dts/bcm283x.dtsi
+index 10b27b9..b982522 100644
+--- a/arch/arm/boot/dts/bcm283x.dtsi
++++ b/arch/arm/boot/dts/bcm283x.dtsi
+@@ -287,6 +287,8 @@
+ compatible = "brcm,bcm2835-usb";
+ reg = <0x7e980000 0x10000>;
+ interrupts = <1 9>;
++ #address-cells = <1>;
++ #size-cells = <0>;
+ };
+
+ v3d: v3d@7ec00000 {
+--
+2.9.3
+
diff --git a/bcm283x-upstream-fixes.patch b/bcm283x-upstream-fixes.patch
deleted file mode 100644
index c5ee31784..000000000
--- a/bcm283x-upstream-fixes.patch
+++ /dev/null
@@ -1,194 +0,0 @@
-From da77f737f9f5a487f3a1f80f8546585ee18cd7b9 Mon Sep 17 00:00:00 2001
-From: Eric Anholt <eric@anholt.net>
-Date: Fri, 4 Mar 2016 10:39:28 -0800
-Subject: [PATCH 27/36] dt-bindings: Add root properties for Raspberry Pi 3
-
-Signed-off-by: Eric Anholt <eric@anholt.net>
-Acked-by: Rob Herring <robh@kernel.org>
----
- Documentation/devicetree/bindings/arm/bcm/brcm,bcm2835.txt | 4 ++++
- 1 file changed, 4 insertions(+)
-
-diff --git a/Documentation/devicetree/bindings/arm/bcm/brcm,bcm2835.txt b/Documentation/devicetree/bindings/arm/bcm/brcm,bcm2835.txt
-index 11d3056..6ffe087 100644
---- a/Documentation/devicetree/bindings/arm/bcm/brcm,bcm2835.txt
-+++ b/Documentation/devicetree/bindings/arm/bcm/brcm,bcm2835.txt
-@@ -30,6 +30,10 @@ Raspberry Pi 2 Model B
- Required root node properties:
- compatible = "raspberrypi,2-model-b", "brcm,bcm2836";
-
-+Raspberry Pi 3 Model B
-+Required root node properties:
-+compatible = "raspberrypi,3-model-b", "brcm,bcm2837";
-+
- Raspberry Pi Compute Module
- Required root node properties:
- compatible = "raspberrypi,compute-module", "brcm,bcm2835";
---
-2.7.3
-
-From b76b1cdf2e569cceab41dcf3b3f6a90965d0a02c Mon Sep 17 00:00:00 2001
-From: Eric Anholt <eric@anholt.net>
-Date: Fri, 4 Mar 2016 10:39:29 -0800
-Subject: [PATCH 28/36] ARM: bcm2835: Add devicetree for the Raspberry Pi 3.
-
-For now this doesn't support the new hardware present on the Pi 3 (BT,
-wifi, GPIO expander). Since the GPIO expander isn't supported, we
-also don't have the LEDs like the other board files do.
-
-Signed-off-by: Eric Anholt <eric@anholt.net>
-Acked-by: Stephen Warren <swarren@wwwdotorg.org>
----
- arch/arm/boot/dts/Makefile | 3 +-
- arch/arm/boot/dts/bcm2837-rpi-3-b.dts | 22 ++++++++++++
- arch/arm/boot/dts/bcm2837.dtsi | 68 +++++++++++++++++++++++++++++++++++
- 3 files changed, 92 insertions(+), 1 deletion(-)
- create mode 100644 arch/arm/boot/dts/bcm2837-rpi-3-b.dts
- create mode 100644 arch/arm/boot/dts/bcm2837.dtsi
-
-diff --git a/arch/arm/boot/dts/Makefile b/arch/arm/boot/dts/Makefile
-index d000814..a8a0767 100644
---- a/arch/arm/boot/dts/Makefile
-+++ b/arch/arm/boot/dts/Makefile
-@@ -64,7 +64,8 @@ dtb-$(CONFIG_ARCH_BCM2835) += \
- bcm2835-rpi-b-rev2.dtb \
- bcm2835-rpi-b-plus.dtb \
- bcm2835-rpi-a-plus.dtb \
-- bcm2836-rpi-2-b.dtb
-+ bcm2836-rpi-2-b.dtb \
-+ bcm2837-rpi-3-b.dtb
- dtb-$(CONFIG_ARCH_BCM_5301X) += \
- bcm4708-asus-rt-ac56u.dtb \
- bcm4708-asus-rt-ac68u.dtb \
-diff --git a/arch/arm/boot/dts/bcm2837-rpi-3-b.dts b/arch/arm/boot/dts/bcm2837-rpi-3-b.dts
-new file mode 100644
-index 0000000..5e8eafd
---- /dev/null
-+++ b/arch/arm/boot/dts/bcm2837-rpi-3-b.dts
-@@ -0,0 +1,22 @@
-+/dts-v1/;
-+#include "bcm2837.dtsi"
-+#include "bcm2835-rpi.dtsi"
-+
-+/ {
-+ compatible = "raspberrypi,3-model-b", "brcm,bcm2837";
-+ model = "Raspberry Pi 3 Model B";
-+
-+ memory {
-+ reg = <0 0x40000000>;
-+ };
-+};
-+
-+&gpio {
-+ pinctrl-0 = <&gpioout &alt0 &i2s_alt0 &alt3>;
-+
-+ /* I2S interface */
-+ i2s_alt0: i2s_alt0 {
-+ brcm,pins = <28 29 30 31>;
-+ brcm,function = <BCM2835_FSEL_ALT2>;
-+ };
-+};
-diff --git a/arch/arm/boot/dts/bcm2837.dtsi b/arch/arm/boot/dts/bcm2837.dtsi
-new file mode 100644
-index 0000000..2f36722
---- /dev/null
-+++ b/arch/arm/boot/dts/bcm2837.dtsi
-@@ -0,0 +1,68 @@
-+#include "bcm283x.dtsi"
-+
-+/ {
-+ compatible = "brcm,bcm2836";
-+
-+ soc {
-+ ranges = <0x7e000000 0x3f000000 0x1000000>,
-+ <0x40000000 0x40000000 0x00001000>;
-+ dma-ranges = <0xc0000000 0x00000000 0x3f000000>;
-+
-+ local_intc: local_intc {
-+ compatible = "brcm,bcm2836-l1-intc";
-+ reg = <0x40000000 0x100>;
-+ interrupt-controller;
-+ #interrupt-cells = <1>;
-+ interrupt-parent = <&local_intc>;
-+ };
-+ };
-+
-+ timer {
-+ compatible = "arm,armv7-timer";
-+ interrupt-parent = <&local_intc>;
-+ interrupts = <0>, // PHYS_SECURE_PPI
-+ <1>, // PHYS_NONSECURE_PPI
-+ <3>, // VIRT_PPI
-+ <2>; // HYP_PPI
-+ always-on;
-+ };
-+
-+ cpus: cpus {
-+ #address-cells = <1>;
-+ #size-cells = <0>;
-+
-+ cpu0: cpu@0 {
-+ device_type = "cpu";
-+ compatible = "arm,cortex-a53";
-+ reg = <0>;
-+ };
-+
-+ cpu1: cpu@1 {
-+ device_type = "cpu";
-+ compatible = "arm,cortex-a53";
-+ reg = <1>;
-+ };
-+
-+ cpu2: cpu@2 {
-+ device_type = "cpu";
-+ compatible = "arm,cortex-a53";
-+ reg = <2>;
-+ };
-+
-+ cpu3: cpu@3 {
-+ device_type = "cpu";
-+ compatible = "arm,cortex-a53";
-+ reg = <3>;
-+ };
-+ };
-+};
-+
-+/* Make the BCM2835-style global interrupt controller be a child of the
-+ * CPU-local interrupt controller.
-+ */
-+&intc {
-+ compatible = "brcm,bcm2836-armctrl-ic";
-+ reg = <0x7e00b200 0x200>;
-+ interrupt-parent = <&local_intc>;
-+ interrupts = <8>;
-+};
---
-2.7.3
-
-From 528285e99c25249456023d28f521689bf9e9eb8b Mon Sep 17 00:00:00 2001
-From: Peter Robinson <pbrobinson@gmail.com>
-Date: Wed, 30 Mar 2016 09:35:13 +0100
-Subject: [PATCH 32/36] drop usb power domain support for the moment, kills usb
-
----
- arch/arm/boot/dts/bcm2835-rpi.dtsi | 4 ----
- 1 file changed, 4 deletions(-)
-
-diff --git a/arch/arm/boot/dts/bcm2835-rpi.dtsi b/arch/arm/boot/dts/bcm2835-rpi.dtsi
-index caf2707..b1e8145 100644
---- a/arch/arm/boot/dts/bcm2835-rpi.dtsi
-+++ b/arch/arm/boot/dts/bcm2835-rpi.dtsi
-@@ -71,10 +71,6 @@
- status = "okay";
- };
-
--&usb {
-- power-domains = <&power RPI_POWER_DOMAIN_USB>;
--};
--
- &v3d {
- power-domains = <&power RPI_POWER_DOMAIN_V3D>;
- };
---
-2.7.3
-
diff --git a/config-armv7-generic b/config-armv7-generic
index dbbcbc81e..e619963bb 100644
--- a/config-armv7-generic
+++ b/config-armv7-generic
@@ -243,7 +243,7 @@ CONFIG_SERIAL_8250_BCM2835AUX=y
CONFIG_DMA_BCM2835=m
# CONFIG_MMC_SDHCI_BCM2835 is not set
CONFIG_MMC_SDHCI_IPROC=m
-CONFIG_BCM2835_MBOX=m
+CONFIG_BCM2835_MBOX=y
CONFIG_PWM_BCM2835=m
CONFIG_HW_RANDOM_BCM2835=m
CONFIG_I2C_BCM2835=m
@@ -557,7 +557,6 @@ CONFIG_RTC_DRV_TPS80031=m
# CONFIG_RTC_DRV_DS1347 is not set
# CONFIG_RTC_DRV_DS1343 is not set
# CONFIG_RTC_DRV_MCP795 is not set
-# CONFIG_RTC_DRV_XGENE is not set
# Regulators
# CONFIG_REGULATOR_ACT8865 is not set
diff --git a/kernel-panic-TPROXY-vanilla-4.7.1.patch b/kernel-panic-TPROXY-vanilla-4.7.1.patch
new file mode 100644
index 000000000..9d045cabe
--- /dev/null
+++ b/kernel-panic-TPROXY-vanilla-4.7.1.patch
@@ -0,0 +1,85 @@
+From patchwork Wed Aug 17 16:04:31 2016
+Content-Type: text/plain; charset="utf-8"
+MIME-Version: 1.0
+Content-Transfer-Encoding: 7bit
+Subject: kernel panic TPROXY , vanilla 4.7.1
+From: Eric Dumazet <eric.dumazet@gmail.com>
+X-Patchwork-Id: 660174
+X-Patchwork-Delegate: davem@davemloft.net
+Message-Id: <1471449871.29842.3.camel@edumazet-glaptop3.roam.corp.google.com>
+To: Denys Fedoryshchenko <nuclearcat@nuclearcat.com>
+Cc: Linux Kernel Network Developers <netdev@vger.kernel.org>,
+ netfilter-devel@vger.kernel.org
+Date: Wed, 17 Aug 2016 09:04:31 -0700
+
+On Wed, 2016-08-17 at 08:42 -0700, Eric Dumazet wrote:
+> On Wed, 2016-08-17 at 17:31 +0300, Denys Fedoryshchenko wrote:
+> > Hi!
+> >
+> > Tried to run squid on latest kernel, and hit a panic
+> > Sometimes it just shows warning in dmesg (but doesnt work properly)
+> > [ 75.701666] IPv4: Attempt to release TCP socket in state 10
+> > ffff88102d430780
+> > [ 83.866974] squid (2700) used greatest stack depth: 12912 bytes left
+> > [ 87.506644] IPv4: Attempt to release TCP socket in state 10
+> > ffff880078a48780
+> > [ 114.704295] IPv4: Attempt to release TCP socket in state 10
+> > ffff881029f8ad00
+> >
+> > I cannot catch yet oops/panic message, netconsole not working.
+> >
+> > After triggering warning message 3 times, i am unable to run squid
+> > anymore (without reboot), and in netstat it doesnt show port running.
+> >
+> > firewall is:
+> > *mangle
+> > -A PREROUTING -p tcp -m socket -j DIVERT
+> > -A PREROUTING -p tcp -m tcp --dport 80 -i eno1 -j TPROXY --on-port 3129
+> > --on-ip 0.0.0.0 --tproxy-mark 0x1/0x1
+> > -A DIVERT -j MARK --set-xmark 0x1/0xffffffff
+> > -A DIVERT -j ACCEPT
+> >
+> > routing
+> > ip rule add fwmark 1 lookup 100
+> > ip route add local default dev eno1 table 100
+> >
+> >
+> > squid config is default with tproxy option
+> > http_port 3129 tproxy
+> >
+>
+> Hmppff... sorry for this, I will send a fix.
+>
+> Thanks for the report !
+>
+
+
+Could you try the following ?
+
+Thanks !
+
+ net/netfilter/xt_TPROXY.c | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+diff --git a/net/netfilter/xt_TPROXY.c b/net/netfilter/xt_TPROXY.c
+index 7f4414d26a66..663c4c3c9072 100644
+--- a/net/netfilter/xt_TPROXY.c
++++ b/net/netfilter/xt_TPROXY.c
+@@ -127,6 +127,8 @@ nf_tproxy_get_sock_v4(struct net *net, struct sk_buff *skb, void *hp,
+ daddr, dport,
+ in->ifindex);
+
++ if (sk && !atomic_inc_not_zero(&sk->sk_refcnt))
++ sk = NULL;
+ /* NOTE: we return listeners even if bound to
+ * 0.0.0.0, those are filtered out in
+ * xt_socket, since xt_TPROXY needs 0 bound
+@@ -195,6 +197,8 @@ nf_tproxy_get_sock_v6(struct net *net, struct sk_buff *skb, int thoff, void *hp,
+ daddr, ntohs(dport),
+ in->ifindex);
+
++ if (sk && !atomic_inc_not_zero(&sk->sk_refcnt))
++ sk = NULL;
+ /* NOTE: we return listeners even if bound to
+ * 0.0.0.0, those are filtered out in
+ * xt_socket, since xt_TPROXY needs 0 bound
diff --git a/kernel.spec b/kernel.spec
index e3ed886c9..7b573ab71 100644
--- a/kernel.spec
+++ b/kernel.spec
@@ -44,7 +44,7 @@ Summary: The Linux kernel
# For non-released -rc kernels, this will be appended after the rcX and
# gitX tags, so a 3 here would become part of release "0.rcX.gitX.3"
#
-%global baserelease 200
+%global baserelease 201
%global fedora_build %{baserelease}
# base_sublevel is the kernel version we're starting with and patching
@@ -520,10 +520,6 @@ Patch420: arm64-avoid-needing-console-to-enable-serial-console.patch
# http://www.spinics.net/lists/arm-kernel/msg490981.html
Patch422: geekbox-v4-device-tree-support.patch
-# http://www.spinics.net/lists/arm-kernel/msg483898.html
-# This has major conflicts and needs to be rebased
-# Patch423: Initial-AllWinner-A64-and-PINE64-support.patch
-
Patch424: arm64-pcie-acpi.patch
Patch425: arm64-pcie-quirks-xgene.patch
@@ -533,7 +529,7 @@ Patch426: usb-phy-tegra-Add-38.4MHz-clock-table-entry.patch
# http://patchwork.ozlabs.org/patch/587554/
Patch430: ARM-tegra-usb-no-reset.patch
-Patch431: bcm283x-upstream-fixes.patch
+Patch431: bcm2837-initial-support.patch
Patch432: arm-i.MX6-Utilite-device-dtb.patch
@@ -647,6 +643,27 @@ Patch838: drm-i915-Acquire-audio-powerwell-for-HD-Audio-regist.patch
#rhbz 1353558
Patch844: 0001-selinux-Only-apply-bounds-checking-to-source-types.patch
+#CVE-2016-6480 rhbz 1362466 1362467
+Patch855: aacraid-Check-size-values-after-double-fetch-from-us.patch
+
+#rhbz 1365940
+Patch856: 0001-udp-fix-poll-issue-with-zero-sized-packets.patch
+
+#rhbz 13700161
+Patch857: kernel-panic-TPROXY-vanilla-4.7.1.patch
+
+# lkml.kernel.org/r/<20160822093249.GA14916@dhcp22.suse.cz>
+Patch858: 0001-OOM-detection-regressions-since-4.7.patch
+
+#rhbz 1360688
+Patch859: rc-core-fix-repeat-events.patch
+
+#rhbz 1371237
+Patch860: 0001-SUNRPC-Fix-infinite-looping-in-rpc_clnt_iterate_for_.patch
+
+# https://lkml.org/lkml/2016/8/30/566
+Patch861: 0001-cgroup-reduce-read-locked-section-of-cgroup_threadgr.patch
+
# END OF PATCH DEFINITIONS
%endif
@@ -1488,6 +1505,8 @@ BuildKernel() {
%ifarch aarch64
# arch/arm64/include/asm/xen references arch/arm
cp -a --parents arch/arm/include/asm/xen $RPM_BUILD_ROOT/lib/modules/$KernelVer/build/
+ # arch/arm64/include/asm/opcodes.h references arch/arm
+ cp -a --parents arch/arm/include/asm/opcodes.h $RPM_BUILD_ROOT/lib/modules/$KernelVer/build/
%endif
# include the machine specific headers for ARM variants, if available.
%ifarch %{arm}
@@ -2175,6 +2194,29 @@ fi
#
#
%changelog
+* Fri Sep 02 2016 <labbott@fedoraproject.org>
+- Add fix for known cgroup deadlock
+
+* Mon Aug 29 2016 Laura Abbott <labbott@fedoraproject.org>
+- Add event decoding fix (rhbz 1360688)
+- Add fix for NFS client issue (rhbz 1371237)
+
+* Sun Aug 28 2016 Peter Robinson <pbrobinson@fedoraproject.org>
+- Minor ARM updates
+
+* Fri Aug 26 2016 Laura Abbott <labbott@redhat.com> - 4.7.2-201
+- Bump and build
+
+* Thu Aug 25 2016 Laura Abbott <labbott@fedoraproject.org>
+- Fix for TPROXY panic (rhbz 1370061)
+- Fix for known OOM regression
+
+* Tue Aug 23 2016 Laura Abbott <labbot@fedoraproject.org>
+- Fix for inabiltiy to send zero sized UDP packets (rhbz 1365940)
+
+* Tue Aug 23 2016 Justin M. Forbes <jforbes@fedoraproject.org>
+- CVE-2016-6480 aacraid: Check size values after double-fetch from user (rhbz 1362466 1362467)
+
* Mon Aug 22 2016 Laura Abbott <labbott@redhat.com> - 4.7.2-200
- Linux v4.7.2
diff --git a/rc-core-fix-repeat-events.patch b/rc-core-fix-repeat-events.patch
new file mode 100644
index 000000000..c7bfce282
--- /dev/null
+++ b/rc-core-fix-repeat-events.patch
@@ -0,0 +1,46 @@
+From: "Ole Ernst <olebowle@unknown.net>"
+Date: Sat, 30 Jul 2016 15:19:27 +0200
+Subject: Partly revert "[media] rc-core: allow calling rc_open with device not initialized"
+
+This partly reverts commit 078600f514a12fd763ac84c86af68ef5b5267563.
+
+Due to the relocation of input_register_device() call, holding down a
+button on an IR remote no longer resulted in repeated key down events.
+
+See: http://www.spinics.net/lists/linux-media/msg103384.html
+
+Signed-off-by: Ole Ernst <olebowle@xxxxxxx>
+---
+ drivers/media/rc/rc-main.c | 9 ++++-----
+ 1 file changed, 4 insertions(+), 5 deletions(-)
+
+diff --git a/drivers/media/rc/rc-main.c b/drivers/media/rc/rc-main.c
+index 8e7f292..26fd63b 100644
+--- a/drivers/media/rc/rc-main.c
++++ b/drivers/media/rc/rc-main.c
+@@ -1460,6 +1460,10 @@ int rc_register_device(struct rc_dev *dev)
+ dev->input_dev->phys = dev->input_phys;
+ dev->input_dev->name = dev->input_name;
+
++ rc = input_register_device(dev->input_dev);
++ if (rc)
++ goto out_table;
++
+ /*
+ * Default delay of 250ms is too short for some protocols, especially
+ * since the timeout is currently set to 250ms. Increase it to 500ms,
+@@ -1475,11 +1479,6 @@ int rc_register_device(struct rc_dev *dev)
+ */
+ dev->input_dev->rep[REP_PERIOD] = 125;
+
+- /* rc_open will be called here */
+- rc = input_register_device(dev->input_dev);
+- if (rc)
+- goto out_table;
+-
+ path = kobject_get_path(&dev->dev.kobj, GFP_KERNEL);
+ dev_info(&dev->dev, "%s as %s\n",
+ dev->input_name ?: "Unspecified device", path ?: "N/A");
+--
+2.9.0
+