From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from lists.gentoo.org (pigeon.gentoo.org [208.92.234.80]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by finch.gentoo.org (Postfix) with ESMTPS id 29F3A1382C5 for ; Sun, 8 Apr 2018 14:35:36 +0000 (UTC) Received: from pigeon.gentoo.org (localhost [127.0.0.1]) by pigeon.gentoo.org (Postfix) with SMTP id CBDF1E0AB2; Sun, 8 Apr 2018 14:33:28 +0000 (UTC) Received: from smtp.gentoo.org (woodpecker.gentoo.org [IPv6:2001:470:ea4a:1:5054:ff:fec7:86e4]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by pigeon.gentoo.org (Postfix) with ESMTPS id 9360EE0AB2 for ; Sun, 8 Apr 2018 14:33:28 +0000 (UTC) Received: from oystercatcher.gentoo.org (oystercatcher.gentoo.org [148.251.78.52]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.gentoo.org (Postfix) with ESMTPS id 4A540335C49 for ; Sun, 8 Apr 2018 14:33:27 +0000 (UTC) Received: from localhost.localdomain (localhost [IPv6:::1]) by oystercatcher.gentoo.org (Postfix) with ESMTP id 2D3D026D for ; Sun, 8 Apr 2018 14:33:25 +0000 (UTC) From: "Mike Pagano" To: gentoo-commits@lists.gentoo.org Content-Transfer-Encoding: 8bit Content-type: text/plain; charset=UTF-8 Reply-To: gentoo-dev@lists.gentoo.org, "Mike Pagano" Message-ID: <1523197993.54a987e8d15fbef1c13b71b424ebf95aa5905d57.mpagano@gentoo> Subject: [gentoo-commits] proj/linux-patches:4.16 commit in: / X-VCS-Repository: proj/linux-patches X-VCS-Files: 0000_README 1000_linux-4.16.1.patch X-VCS-Directories: / X-VCS-Committer: mpagano X-VCS-Committer-Name: Mike Pagano X-VCS-Revision: 54a987e8d15fbef1c13b71b424ebf95aa5905d57 X-VCS-Branch: 4.16 Date: Sun, 8 Apr 2018 14:33:25 +0000 (UTC) Precedence: bulk List-Post: List-Help: List-Unsubscribe: List-Subscribe: List-Id: Gentoo Linux mail X-BeenThere: gentoo-commits@lists.gentoo.org X-Archives-Salt: 4084ac21-470a-43a2-ad5b-5061f2ee35cd X-Archives-Hash: 3d4980ec7a42fdbcb52906ed9a7675b3 commit: 54a987e8d15fbef1c13b71b424ebf95aa5905d57 Author: Mike Pagano gentoo org> AuthorDate: Sun Apr 8 14:33:13 2018 +0000 Commit: Mike Pagano gentoo org> CommitDate: Sun Apr 8 14:33:13 2018 +0000 URL: https://gitweb.gentoo.org/proj/linux-patches.git/commit/?id=54a987e8 Linux patch 4.16.1 0000_README | 4 + 1000_linux-4.16.1.patch | 1197 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 1201 insertions(+) diff --git a/0000_README b/0000_README index 01553d4..c464ac8 100644 --- a/0000_README +++ b/0000_README @@ -43,6 +43,10 @@ EXPERIMENTAL Individual Patch Descriptions: -------------------------------------------------------------------------- +Patch: 1000_linux-4.16.1.patch +From: http://www.kernel.org +Desc: Linux 4.16.1 + Patch: 1500_XATTR_USER_PREFIX.patch From: https://bugs.gentoo.org/show_bug.cgi?id=470644 Desc: Support for namespace user.pax.* on tmpfs. diff --git a/1000_linux-4.16.1.patch b/1000_linux-4.16.1.patch new file mode 100644 index 0000000..e02e1ee --- /dev/null +++ b/1000_linux-4.16.1.patch @@ -0,0 +1,1197 @@ +diff --git a/Documentation/devicetree/bindings/serial/8250.txt b/Documentation/devicetree/bindings/serial/8250.txt +index dad3b2ec66d4..aeb6db4e35c3 100644 +--- a/Documentation/devicetree/bindings/serial/8250.txt ++++ b/Documentation/devicetree/bindings/serial/8250.txt +@@ -24,6 +24,7 @@ Required properties: + - "ti,da830-uart" + - "aspeed,ast2400-vuart" + - "aspeed,ast2500-vuart" ++ - "nuvoton,npcm750-uart" + - "serial" if the port type is unknown. + - reg : offset and length of the register set for the device. + - interrupts : should contain uart interrupt. +diff --git a/Makefile b/Makefile +index 363dd096e46e..1773c718074e 100644 +--- a/Makefile ++++ b/Makefile +@@ -1,7 +1,7 @@ + # SPDX-License-Identifier: GPL-2.0 + VERSION = 4 + PATCHLEVEL = 16 +-SUBLEVEL = 0 ++SUBLEVEL = 1 + EXTRAVERSION = + NAME = Fearless Coyote + +diff --git a/arch/arm/crypto/Makefile b/arch/arm/crypto/Makefile +index 30ef8e291271..c9919c2b7ad1 100644 +--- a/arch/arm/crypto/Makefile ++++ b/arch/arm/crypto/Makefile +@@ -54,6 +54,7 @@ crct10dif-arm-ce-y := crct10dif-ce-core.o crct10dif-ce-glue.o + crc32-arm-ce-y:= crc32-ce-core.o crc32-ce-glue.o + chacha20-neon-y := chacha20-neon-core.o chacha20-neon-glue.o + ++ifdef REGENERATE_ARM_CRYPTO + quiet_cmd_perl = PERL $@ + cmd_perl = $(PERL) $(<) > $(@) + +@@ -62,5 +63,6 @@ $(src)/sha256-core.S_shipped: $(src)/sha256-armv4.pl + + $(src)/sha512-core.S_shipped: $(src)/sha512-armv4.pl + $(call cmd,perl) ++endif + + .PRECIOUS: $(obj)/sha256-core.S $(obj)/sha512-core.S +diff --git a/arch/arm64/crypto/Makefile b/arch/arm64/crypto/Makefile +index cee9b8d9830b..dfe651bdf993 100644 +--- a/arch/arm64/crypto/Makefile ++++ b/arch/arm64/crypto/Makefile +@@ -67,6 +67,7 @@ CFLAGS_aes-glue-ce.o := -DUSE_V8_CRYPTO_EXTENSIONS + $(obj)/aes-glue-%.o: $(src)/aes-glue.c FORCE + $(call if_changed_rule,cc_o_c) + ++ifdef REGENERATE_ARM64_CRYPTO + quiet_cmd_perlasm = PERLASM $@ + cmd_perlasm = $(PERL) $(<) void $(@) + +@@ -75,5 +76,6 @@ $(src)/sha256-core.S_shipped: $(src)/sha512-armv8.pl + + $(src)/sha512-core.S_shipped: $(src)/sha512-armv8.pl + $(call cmd,perlasm) ++endif + + .PRECIOUS: $(obj)/sha256-core.S $(obj)/sha512-core.S +diff --git a/arch/x86/crypto/cast5_avx_glue.c b/arch/x86/crypto/cast5_avx_glue.c +index dbea6020ffe7..575292a33bdf 100644 +--- a/arch/x86/crypto/cast5_avx_glue.c ++++ b/arch/x86/crypto/cast5_avx_glue.c +@@ -66,8 +66,6 @@ static int ecb_crypt(struct blkcipher_desc *desc, struct blkcipher_walk *walk, + void (*fn)(struct cast5_ctx *ctx, u8 *dst, const u8 *src); + int err; + +- fn = (enc) ? cast5_ecb_enc_16way : cast5_ecb_dec_16way; +- + err = blkcipher_walk_virt(desc, walk); + desc->flags &= ~CRYPTO_TFM_REQ_MAY_SLEEP; + +@@ -79,6 +77,7 @@ static int ecb_crypt(struct blkcipher_desc *desc, struct blkcipher_walk *walk, + + /* Process multi-block batch */ + if (nbytes >= bsize * CAST5_PARALLEL_BLOCKS) { ++ fn = (enc) ? cast5_ecb_enc_16way : cast5_ecb_dec_16way; + do { + fn(ctx, wdst, wsrc); + +diff --git a/block/bio.c b/block/bio.c +index e1708db48258..53e0f0a1ed94 100644 +--- a/block/bio.c ++++ b/block/bio.c +@@ -43,9 +43,9 @@ + * break badly! cannot be bigger than what you can fit into an + * unsigned short + */ +-#define BV(x) { .nr_vecs = x, .name = "biovec-"__stringify(x) } ++#define BV(x, n) { .nr_vecs = x, .name = "biovec-"#n } + static struct biovec_slab bvec_slabs[BVEC_POOL_NR] __read_mostly = { +- BV(1), BV(4), BV(16), BV(64), BV(128), BV(BIO_MAX_PAGES), ++ BV(1, 1), BV(4, 4), BV(16, 16), BV(64, 64), BV(128, 128), BV(BIO_MAX_PAGES, max), + }; + #undef BV + +diff --git a/crypto/ahash.c b/crypto/ahash.c +index 266fc1d64f61..c03cc177870b 100644 +--- a/crypto/ahash.c ++++ b/crypto/ahash.c +@@ -92,13 +92,14 @@ int crypto_hash_walk_done(struct crypto_hash_walk *walk, int err) + + if (nbytes && walk->offset & alignmask && !err) { + walk->offset = ALIGN(walk->offset, alignmask + 1); +- walk->data += walk->offset; +- + nbytes = min(nbytes, + ((unsigned int)(PAGE_SIZE)) - walk->offset); + walk->entrylen -= nbytes; + +- return nbytes; ++ if (nbytes) { ++ walk->data += walk->offset; ++ return nbytes; ++ } + } + + if (walk->flags & CRYPTO_ALG_ASYNC) +diff --git a/crypto/lrw.c b/crypto/lrw.c +index cbbd7c50ad19..1d813a6d3fec 100644 +--- a/crypto/lrw.c ++++ b/crypto/lrw.c +@@ -313,7 +313,7 @@ static void exit_crypt(struct skcipher_request *req) + rctx->left = 0; + + if (rctx->ext) +- kfree(rctx->ext); ++ kzfree(rctx->ext); + } + + static int do_encrypt(struct skcipher_request *req, int err) +diff --git a/crypto/testmgr.h b/crypto/testmgr.h +index 6044f6906bd6..69fb51e7b6f1 100644 +--- a/crypto/testmgr.h ++++ b/crypto/testmgr.h +@@ -548,7 +548,7 @@ static const struct akcipher_testvec rsa_tv_template[] = { + static const struct akcipher_testvec pkcs1pad_rsa_tv_template[] = { + { + .key = +- "\x30\x82\x03\x1f\x02\x01\x10\x02\x82\x01\x01\x00\xd7\x1e\x77\x82" ++ "\x30\x82\x03\x1f\x02\x01\x00\x02\x82\x01\x01\x00\xd7\x1e\x77\x82" + "\x8c\x92\x31\xe7\x69\x02\xa2\xd5\x5c\x78\xde\xa2\x0c\x8f\xfe\x28" + "\x59\x31\xdf\x40\x9c\x60\x61\x06\xb9\x2f\x62\x40\x80\x76\xcb\x67" + "\x4a\xb5\x59\x56\x69\x17\x07\xfa\xf9\x4c\xbd\x6c\x37\x7a\x46\x7d" +@@ -597,8 +597,8 @@ static const struct akcipher_testvec pkcs1pad_rsa_tv_template[] = { + "\xfe\xf8\x27\x1b\xd6\x55\x60\x5e\x48\xb7\x6d\x9a\xa8\x37\xf9\x7a" + "\xde\x1b\xcd\x5d\x1a\x30\xd4\xe9\x9e\x5b\x3c\x15\xf8\x9c\x1f\xda" + "\xd1\x86\x48\x55\xce\x83\xee\x8e\x51\xc7\xde\x32\x12\x47\x7d\x46" +- "\xb8\x35\xdf\x41\x02\x01\x30\x02\x01\x30\x02\x01\x30\x02\x01\x30" +- "\x02\x01\x30", ++ "\xb8\x35\xdf\x41\x02\x01\x00\x02\x01\x00\x02\x01\x00\x02\x01\x00" ++ "\x02\x01\x00", + .key_len = 804, + /* + * m is SHA256 hash of following message: +diff --git a/drivers/base/arch_topology.c b/drivers/base/arch_topology.c +index 52ec5174bcb1..e7cb0c6ade81 100644 +--- a/drivers/base/arch_topology.c ++++ b/drivers/base/arch_topology.c +@@ -169,11 +169,11 @@ bool __init topology_parse_cpu_capacity(struct device_node *cpu_node, int cpu) + } + + #ifdef CONFIG_CPU_FREQ +-static cpumask_var_t cpus_to_visit __initdata; +-static void __init parsing_done_workfn(struct work_struct *work); +-static __initdata DECLARE_WORK(parsing_done_work, parsing_done_workfn); ++static cpumask_var_t cpus_to_visit; ++static void parsing_done_workfn(struct work_struct *work); ++static DECLARE_WORK(parsing_done_work, parsing_done_workfn); + +-static int __init ++static int + init_cpu_capacity_callback(struct notifier_block *nb, + unsigned long val, + void *data) +@@ -209,7 +209,7 @@ init_cpu_capacity_callback(struct notifier_block *nb, + return 0; + } + +-static struct notifier_block init_cpu_capacity_notifier __initdata = { ++static struct notifier_block init_cpu_capacity_notifier = { + .notifier_call = init_cpu_capacity_callback, + }; + +@@ -242,7 +242,7 @@ static int __init register_cpufreq_notifier(void) + } + core_initcall(register_cpufreq_notifier); + +-static void __init parsing_done_workfn(struct work_struct *work) ++static void parsing_done_workfn(struct work_struct *work) + { + cpufreq_unregister_notifier(&init_cpu_capacity_notifier, + CPUFREQ_POLICY_NOTIFIER); +diff --git a/drivers/bluetooth/hci_bcm.c b/drivers/bluetooth/hci_bcm.c +index 40b9fb247010..47a4127a6067 100644 +--- a/drivers/bluetooth/hci_bcm.c ++++ b/drivers/bluetooth/hci_bcm.c +@@ -1080,6 +1080,7 @@ static const struct hci_uart_proto bcm_proto = { + #ifdef CONFIG_ACPI + static const struct acpi_device_id bcm_acpi_match[] = { + { "BCM2E1A", (kernel_ulong_t)&acpi_bcm_int_last_gpios }, ++ { "BCM2E38", (kernel_ulong_t)&acpi_bcm_int_last_gpios }, + { "BCM2E39", (kernel_ulong_t)&acpi_bcm_int_last_gpios }, + { "BCM2E3A", (kernel_ulong_t)&acpi_bcm_int_last_gpios }, + { "BCM2E3D", (kernel_ulong_t)&acpi_bcm_int_last_gpios }, +@@ -1092,12 +1093,17 @@ static const struct acpi_device_id bcm_acpi_match[] = { + { "BCM2E67", (kernel_ulong_t)&acpi_bcm_int_last_gpios }, + { "BCM2E71", (kernel_ulong_t)&acpi_bcm_int_last_gpios }, + { "BCM2E72", (kernel_ulong_t)&acpi_bcm_int_last_gpios }, ++ { "BCM2E74", (kernel_ulong_t)&acpi_bcm_int_last_gpios }, + { "BCM2E7B", (kernel_ulong_t)&acpi_bcm_int_last_gpios }, + { "BCM2E7C", (kernel_ulong_t)&acpi_bcm_int_last_gpios }, + { "BCM2E7E", (kernel_ulong_t)&acpi_bcm_int_first_gpios }, ++ { "BCM2E83", (kernel_ulong_t)&acpi_bcm_int_first_gpios }, ++ { "BCM2E84", (kernel_ulong_t)&acpi_bcm_int_last_gpios }, ++ { "BCM2E90", (kernel_ulong_t)&acpi_bcm_int_last_gpios }, + { "BCM2E95", (kernel_ulong_t)&acpi_bcm_int_first_gpios }, + { "BCM2E96", (kernel_ulong_t)&acpi_bcm_int_first_gpios }, + { "BCM2EA4", (kernel_ulong_t)&acpi_bcm_int_first_gpios }, ++ { "BCM2EAA", (kernel_ulong_t)&acpi_bcm_int_first_gpios }, + { }, + }; + MODULE_DEVICE_TABLE(acpi, bcm_acpi_match); +diff --git a/drivers/char/mem.c b/drivers/char/mem.c +index 052011bcf100..ffeb60d3434c 100644 +--- a/drivers/char/mem.c ++++ b/drivers/char/mem.c +@@ -137,7 +137,7 @@ static ssize_t read_mem(struct file *file, char __user *buf, + + while (count > 0) { + unsigned long remaining; +- int allowed; ++ int allowed, probe; + + sz = size_inside_page(p, count); + +@@ -160,9 +160,9 @@ static ssize_t read_mem(struct file *file, char __user *buf, + if (!ptr) + goto failed; + +- err = probe_kernel_read(bounce, ptr, sz); ++ probe = probe_kernel_read(bounce, ptr, sz); + unxlate_dev_mem_ptr(p, ptr); +- if (err) ++ if (probe) + goto failed; + + remaining = copy_to_user(buf, bounce, sz); +diff --git a/drivers/crypto/caam/ctrl.c b/drivers/crypto/caam/ctrl.c +index e843cf410373..361e750f9cba 100644 +--- a/drivers/crypto/caam/ctrl.c ++++ b/drivers/crypto/caam/ctrl.c +@@ -815,9 +815,6 @@ static int caam_probe(struct platform_device *pdev) + return 0; + + caam_remove: +-#ifdef CONFIG_DEBUG_FS +- debugfs_remove_recursive(ctrlpriv->dfs_root); +-#endif + caam_remove(pdev); + return ret; + +diff --git a/drivers/crypto/ccp/ccp-crypto-aes-cmac.c b/drivers/crypto/ccp/ccp-crypto-aes-cmac.c +index 60fc0fa26fd3..26687f318de6 100644 +--- a/drivers/crypto/ccp/ccp-crypto-aes-cmac.c ++++ b/drivers/crypto/ccp/ccp-crypto-aes-cmac.c +@@ -46,7 +46,7 @@ static int ccp_aes_cmac_complete(struct crypto_async_request *async_req, + } + + /* Update result area if supplied */ +- if (req->result) ++ if (req->result && rctx->final) + memcpy(req->result, rctx->iv, digest_size); + + e_free: +diff --git a/drivers/crypto/ccp/ccp-crypto-rsa.c b/drivers/crypto/ccp/ccp-crypto-rsa.c +index e6db8672d89c..05850dfd7940 100644 +--- a/drivers/crypto/ccp/ccp-crypto-rsa.c ++++ b/drivers/crypto/ccp/ccp-crypto-rsa.c +@@ -60,10 +60,9 @@ static int ccp_rsa_complete(struct crypto_async_request *async_req, int ret) + + static unsigned int ccp_rsa_maxsize(struct crypto_akcipher *tfm) + { +- if (ccp_version() > CCP_VERSION(3, 0)) +- return CCP5_RSA_MAXMOD; +- else +- return CCP_RSA_MAXMOD; ++ struct ccp_ctx *ctx = akcipher_tfm_ctx(tfm); ++ ++ return ctx->u.rsa.n_len; + } + + static int ccp_rsa_crypt(struct akcipher_request *req, bool encrypt) +diff --git a/drivers/crypto/ccp/ccp-crypto-sha.c b/drivers/crypto/ccp/ccp-crypto-sha.c +index 8b9b16d433f7..871c9628a2ee 100644 +--- a/drivers/crypto/ccp/ccp-crypto-sha.c ++++ b/drivers/crypto/ccp/ccp-crypto-sha.c +@@ -47,7 +47,7 @@ static int ccp_sha_complete(struct crypto_async_request *async_req, int ret) + } + + /* Update result area if supplied */ +- if (req->result) ++ if (req->result && rctx->final) + memcpy(req->result, rctx->ctx, digest_size); + + e_free: +diff --git a/drivers/crypto/inside-secure/safexcel.c b/drivers/crypto/inside-secure/safexcel.c +index 225e74a7f724..0dd3a7ac1dd1 100644 +--- a/drivers/crypto/inside-secure/safexcel.c ++++ b/drivers/crypto/inside-secure/safexcel.c +@@ -894,7 +894,7 @@ static int safexcel_probe(struct platform_device *pdev) + return PTR_ERR(priv->base); + } + +- priv->clk = of_clk_get(dev->of_node, 0); ++ priv->clk = devm_clk_get(&pdev->dev, NULL); + if (!IS_ERR(priv->clk)) { + ret = clk_prepare_enable(priv->clk); + if (ret) { +diff --git a/drivers/crypto/talitos.c b/drivers/crypto/talitos.c +index 6882fa2f8bad..c805d0122c0b 100644 +--- a/drivers/crypto/talitos.c ++++ b/drivers/crypto/talitos.c +@@ -832,8 +832,6 @@ struct talitos_ctx { + unsigned int keylen; + unsigned int enckeylen; + unsigned int authkeylen; +- dma_addr_t dma_buf; +- dma_addr_t dma_hw_context; + }; + + #define HASH_MAX_BLOCK_SIZE SHA512_BLOCK_SIZE +@@ -1130,10 +1128,10 @@ static int sg_to_link_tbl_offset(struct scatterlist *sg, int sg_count, + return count; + } + +-static int talitos_sg_map(struct device *dev, struct scatterlist *src, +- unsigned int len, struct talitos_edesc *edesc, +- struct talitos_ptr *ptr, +- int sg_count, unsigned int offset, int tbl_off) ++static int talitos_sg_map_ext(struct device *dev, struct scatterlist *src, ++ unsigned int len, struct talitos_edesc *edesc, ++ struct talitos_ptr *ptr, int sg_count, ++ unsigned int offset, int tbl_off, int elen) + { + struct talitos_private *priv = dev_get_drvdata(dev); + bool is_sec1 = has_ftr_sec1(priv); +@@ -1142,6 +1140,7 @@ static int talitos_sg_map(struct device *dev, struct scatterlist *src, + to_talitos_ptr(ptr, 0, 0, is_sec1); + return 1; + } ++ to_talitos_ptr_ext_set(ptr, elen, is_sec1); + if (sg_count == 1) { + to_talitos_ptr(ptr, sg_dma_address(src) + offset, len, is_sec1); + return sg_count; +@@ -1150,7 +1149,7 @@ static int talitos_sg_map(struct device *dev, struct scatterlist *src, + to_talitos_ptr(ptr, edesc->dma_link_tbl + offset, len, is_sec1); + return sg_count; + } +- sg_count = sg_to_link_tbl_offset(src, sg_count, offset, len, ++ sg_count = sg_to_link_tbl_offset(src, sg_count, offset, len + elen, + &edesc->link_tbl[tbl_off]); + if (sg_count == 1) { + /* Only one segment now, so no link tbl needed*/ +@@ -1164,6 +1163,15 @@ static int talitos_sg_map(struct device *dev, struct scatterlist *src, + return sg_count; + } + ++static int talitos_sg_map(struct device *dev, struct scatterlist *src, ++ unsigned int len, struct talitos_edesc *edesc, ++ struct talitos_ptr *ptr, int sg_count, ++ unsigned int offset, int tbl_off) ++{ ++ return talitos_sg_map_ext(dev, src, len, edesc, ptr, sg_count, offset, ++ tbl_off, 0); ++} ++ + /* + * fill in and submit ipsec_esp descriptor + */ +@@ -1181,7 +1189,7 @@ static int ipsec_esp(struct talitos_edesc *edesc, struct aead_request *areq, + unsigned int ivsize = crypto_aead_ivsize(aead); + int tbl_off = 0; + int sg_count, ret; +- int sg_link_tbl_len; ++ int elen = 0; + bool sync_needed = false; + struct talitos_private *priv = dev_get_drvdata(dev); + bool is_sec1 = has_ftr_sec1(priv); +@@ -1223,17 +1231,11 @@ static int ipsec_esp(struct talitos_edesc *edesc, struct aead_request *areq, + * extent is bytes of HMAC postpended to ciphertext, + * typically 12 for ipsec + */ +- sg_link_tbl_len = cryptlen; +- +- if (is_ipsec_esp) { +- to_talitos_ptr_ext_set(&desc->ptr[4], authsize, is_sec1); +- +- if (desc->hdr & DESC_HDR_MODE1_MDEU_CICV) +- sg_link_tbl_len += authsize; +- } ++ if (is_ipsec_esp && (desc->hdr & DESC_HDR_MODE1_MDEU_CICV)) ++ elen = authsize; + +- ret = talitos_sg_map(dev, areq->src, sg_link_tbl_len, edesc, +- &desc->ptr[4], sg_count, areq->assoclen, tbl_off); ++ ret = talitos_sg_map_ext(dev, areq->src, cryptlen, edesc, &desc->ptr[4], ++ sg_count, areq->assoclen, tbl_off, elen); + + if (ret > 1) { + tbl_off += ret; +@@ -1690,9 +1692,30 @@ static void common_nonsnoop_hash_unmap(struct device *dev, + struct ahash_request *areq) + { + struct talitos_ahash_req_ctx *req_ctx = ahash_request_ctx(areq); ++ struct talitos_private *priv = dev_get_drvdata(dev); ++ bool is_sec1 = has_ftr_sec1(priv); ++ struct talitos_desc *desc = &edesc->desc; ++ struct talitos_desc *desc2 = desc + 1; ++ ++ unmap_single_talitos_ptr(dev, &edesc->desc.ptr[5], DMA_FROM_DEVICE); ++ if (desc->next_desc && ++ desc->ptr[5].ptr != desc2->ptr[5].ptr) ++ unmap_single_talitos_ptr(dev, &desc2->ptr[5], DMA_FROM_DEVICE); + + talitos_sg_unmap(dev, edesc, req_ctx->psrc, NULL, 0, 0); + ++ /* When using hashctx-in, must unmap it. */ ++ if (from_talitos_ptr_len(&edesc->desc.ptr[1], is_sec1)) ++ unmap_single_talitos_ptr(dev, &edesc->desc.ptr[1], ++ DMA_TO_DEVICE); ++ else if (desc->next_desc) ++ unmap_single_talitos_ptr(dev, &desc2->ptr[1], ++ DMA_TO_DEVICE); ++ ++ if (is_sec1 && req_ctx->nbuf) ++ unmap_single_talitos_ptr(dev, &desc->ptr[3], ++ DMA_TO_DEVICE); ++ + if (edesc->dma_len) + dma_unmap_single(dev, edesc->dma_link_tbl, edesc->dma_len, + DMA_BIDIRECTIONAL); +@@ -1766,8 +1789,10 @@ static int common_nonsnoop_hash(struct talitos_edesc *edesc, + + /* hash context in */ + if (!req_ctx->first || req_ctx->swinit) { +- to_talitos_ptr(&desc->ptr[1], ctx->dma_hw_context, +- req_ctx->hw_context_size, is_sec1); ++ map_single_talitos_ptr(dev, &desc->ptr[1], ++ req_ctx->hw_context_size, ++ (char *)req_ctx->hw_context, ++ DMA_TO_DEVICE); + req_ctx->swinit = 0; + } + /* Indicate next op is not the first. */ +@@ -1793,10 +1818,9 @@ static int common_nonsnoop_hash(struct talitos_edesc *edesc, + * data in + */ + if (is_sec1 && req_ctx->nbuf) { +- dma_addr_t dma_buf = ctx->dma_buf + req_ctx->buf_idx * +- HASH_MAX_BLOCK_SIZE; +- +- to_talitos_ptr(&desc->ptr[3], dma_buf, req_ctx->nbuf, is_sec1); ++ map_single_talitos_ptr(dev, &desc->ptr[3], req_ctx->nbuf, ++ req_ctx->buf[req_ctx->buf_idx], ++ DMA_TO_DEVICE); + } else { + sg_count = talitos_sg_map(dev, req_ctx->psrc, length, edesc, + &desc->ptr[3], sg_count, offset, 0); +@@ -1812,8 +1836,9 @@ static int common_nonsnoop_hash(struct talitos_edesc *edesc, + crypto_ahash_digestsize(tfm), + areq->result, DMA_FROM_DEVICE); + else +- to_talitos_ptr(&desc->ptr[5], ctx->dma_hw_context, +- req_ctx->hw_context_size, is_sec1); ++ map_single_talitos_ptr(dev, &desc->ptr[5], ++ req_ctx->hw_context_size, ++ req_ctx->hw_context, DMA_FROM_DEVICE); + + /* last DWORD empty */ + +@@ -1832,9 +1857,14 @@ static int common_nonsnoop_hash(struct talitos_edesc *edesc, + desc->hdr |= DESC_HDR_MODE0_MDEU_CONT; + desc->hdr &= ~DESC_HDR_DONE_NOTIFY; + +- to_talitos_ptr(&desc2->ptr[1], ctx->dma_hw_context, +- req_ctx->hw_context_size, is_sec1); +- ++ if (desc->ptr[1].ptr) ++ copy_talitos_ptr(&desc2->ptr[1], &desc->ptr[1], ++ is_sec1); ++ else ++ map_single_talitos_ptr(dev, &desc2->ptr[1], ++ req_ctx->hw_context_size, ++ req_ctx->hw_context, ++ DMA_TO_DEVICE); + copy_talitos_ptr(&desc2->ptr[2], &desc->ptr[2], is_sec1); + sg_count = talitos_sg_map(dev, req_ctx->psrc, length, edesc, + &desc2->ptr[3], sg_count, offset, 0); +@@ -1842,8 +1872,10 @@ static int common_nonsnoop_hash(struct talitos_edesc *edesc, + sync_needed = true; + copy_talitos_ptr(&desc2->ptr[5], &desc->ptr[5], is_sec1); + if (req_ctx->last) +- to_talitos_ptr(&desc->ptr[5], ctx->dma_hw_context, +- req_ctx->hw_context_size, is_sec1); ++ map_single_talitos_ptr(dev, &desc->ptr[5], ++ req_ctx->hw_context_size, ++ req_ctx->hw_context, ++ DMA_FROM_DEVICE); + + next_desc = dma_map_single(dev, &desc2->hdr1, TALITOS_DESC_SIZE, + DMA_BIDIRECTIONAL); +@@ -1881,12 +1913,8 @@ static struct talitos_edesc *ahash_edesc_alloc(struct ahash_request *areq, + static int ahash_init(struct ahash_request *areq) + { + struct crypto_ahash *tfm = crypto_ahash_reqtfm(areq); +- struct talitos_ctx *ctx = crypto_ahash_ctx(tfm); +- struct device *dev = ctx->dev; + struct talitos_ahash_req_ctx *req_ctx = ahash_request_ctx(areq); + unsigned int size; +- struct talitos_private *priv = dev_get_drvdata(dev); +- bool is_sec1 = has_ftr_sec1(priv); + + /* Initialize the context */ + req_ctx->buf_idx = 0; +@@ -1898,18 +1926,6 @@ static int ahash_init(struct ahash_request *areq) + : TALITOS_MDEU_CONTEXT_SIZE_SHA384_SHA512; + req_ctx->hw_context_size = size; + +- if (ctx->dma_hw_context) +- dma_unmap_single(dev, ctx->dma_hw_context, size, +- DMA_BIDIRECTIONAL); +- ctx->dma_hw_context = dma_map_single(dev, req_ctx->hw_context, size, +- DMA_BIDIRECTIONAL); +- if (ctx->dma_buf) +- dma_unmap_single(dev, ctx->dma_buf, sizeof(req_ctx->buf), +- DMA_TO_DEVICE); +- if (is_sec1) +- ctx->dma_buf = dma_map_single(dev, req_ctx->buf, +- sizeof(req_ctx->buf), +- DMA_TO_DEVICE); + return 0; + } + +@@ -1920,9 +1936,6 @@ static int ahash_init(struct ahash_request *areq) + static int ahash_init_sha224_swinit(struct ahash_request *areq) + { + struct talitos_ahash_req_ctx *req_ctx = ahash_request_ctx(areq); +- struct crypto_ahash *tfm = crypto_ahash_reqtfm(areq); +- struct talitos_ctx *ctx = crypto_ahash_ctx(tfm); +- struct device *dev = ctx->dev; + + ahash_init(areq); + req_ctx->swinit = 1;/* prevent h/w initting context with sha256 values*/ +@@ -1940,9 +1953,6 @@ static int ahash_init_sha224_swinit(struct ahash_request *areq) + req_ctx->hw_context[8] = 0; + req_ctx->hw_context[9] = 0; + +- dma_sync_single_for_device(dev, ctx->dma_hw_context, +- req_ctx->hw_context_size, DMA_TO_DEVICE); +- + return 0; + } + +@@ -2046,13 +2056,6 @@ static int ahash_process_req(struct ahash_request *areq, unsigned int nbytes) + /* request SEC to INIT hash. */ + if (req_ctx->first && !req_ctx->swinit) + edesc->desc.hdr |= DESC_HDR_MODE0_MDEU_INIT; +- if (is_sec1) { +- dma_addr_t dma_buf = ctx->dma_buf + req_ctx->buf_idx * +- HASH_MAX_BLOCK_SIZE; +- +- dma_sync_single_for_device(dev, dma_buf, +- req_ctx->nbuf, DMA_TO_DEVICE); +- } + + /* When the tfm context has a keylen, it's an HMAC. + * A first or last (ie. not middle) descriptor must request HMAC. +@@ -2106,12 +2109,7 @@ static int ahash_export(struct ahash_request *areq, void *out) + { + struct talitos_ahash_req_ctx *req_ctx = ahash_request_ctx(areq); + struct talitos_export_state *export = out; +- struct crypto_ahash *ahash = crypto_ahash_reqtfm(areq); +- struct talitos_ctx *ctx = crypto_ahash_ctx(ahash); +- struct device *dev = ctx->dev; + +- dma_sync_single_for_cpu(dev, ctx->dma_hw_context, +- req_ctx->hw_context_size, DMA_FROM_DEVICE); + memcpy(export->hw_context, req_ctx->hw_context, + req_ctx->hw_context_size); + memcpy(export->buf, req_ctx->buf[req_ctx->buf_idx], req_ctx->nbuf); +@@ -2130,31 +2128,14 @@ static int ahash_import(struct ahash_request *areq, const void *in) + struct crypto_ahash *tfm = crypto_ahash_reqtfm(areq); + const struct talitos_export_state *export = in; + unsigned int size; +- struct talitos_ctx *ctx = crypto_ahash_ctx(tfm); +- struct device *dev = ctx->dev; +- struct talitos_private *priv = dev_get_drvdata(dev); +- bool is_sec1 = has_ftr_sec1(priv); + + memset(req_ctx, 0, sizeof(*req_ctx)); + size = (crypto_ahash_digestsize(tfm) <= SHA256_DIGEST_SIZE) + ? TALITOS_MDEU_CONTEXT_SIZE_MD5_SHA1_SHA256 + : TALITOS_MDEU_CONTEXT_SIZE_SHA384_SHA512; + req_ctx->hw_context_size = size; +- if (ctx->dma_hw_context) +- dma_unmap_single(dev, ctx->dma_hw_context, size, +- DMA_BIDIRECTIONAL); +- + memcpy(req_ctx->hw_context, export->hw_context, size); +- ctx->dma_hw_context = dma_map_single(dev, req_ctx->hw_context, size, +- DMA_BIDIRECTIONAL); +- if (ctx->dma_buf) +- dma_unmap_single(dev, ctx->dma_buf, sizeof(req_ctx->buf), +- DMA_TO_DEVICE); + memcpy(req_ctx->buf[0], export->buf, export->nbuf); +- if (is_sec1) +- ctx->dma_buf = dma_map_single(dev, req_ctx->buf, +- sizeof(req_ctx->buf), +- DMA_TO_DEVICE); + req_ctx->swinit = export->swinit; + req_ctx->first = export->first; + req_ctx->last = export->last; +@@ -3064,27 +3045,6 @@ static void talitos_cra_exit(struct crypto_tfm *tfm) + dma_unmap_single(dev, ctx->dma_key, ctx->keylen, DMA_TO_DEVICE); + } + +-static void talitos_cra_exit_ahash(struct crypto_tfm *tfm) +-{ +- struct talitos_ctx *ctx = crypto_tfm_ctx(tfm); +- struct device *dev = ctx->dev; +- unsigned int size; +- +- talitos_cra_exit(tfm); +- +- size = (crypto_ahash_digestsize(__crypto_ahash_cast(tfm)) <= +- SHA256_DIGEST_SIZE) +- ? TALITOS_MDEU_CONTEXT_SIZE_MD5_SHA1_SHA256 +- : TALITOS_MDEU_CONTEXT_SIZE_SHA384_SHA512; +- +- if (ctx->dma_hw_context) +- dma_unmap_single(dev, ctx->dma_hw_context, size, +- DMA_BIDIRECTIONAL); +- if (ctx->dma_buf) +- dma_unmap_single(dev, ctx->dma_buf, HASH_MAX_BLOCK_SIZE * 2, +- DMA_TO_DEVICE); +-} +- + /* + * given the alg's descriptor header template, determine whether descriptor + * type and primary/secondary execution units required match the hw +@@ -3183,7 +3143,7 @@ static struct talitos_crypto_alg *talitos_alg_alloc(struct device *dev, + case CRYPTO_ALG_TYPE_AHASH: + alg = &t_alg->algt.alg.hash.halg.base; + alg->cra_init = talitos_cra_init_ahash; +- alg->cra_exit = talitos_cra_exit_ahash; ++ alg->cra_exit = talitos_cra_exit; + alg->cra_type = &crypto_ahash_type; + t_alg->algt.alg.hash.init = ahash_init; + t_alg->algt.alg.hash.update = ahash_update; +diff --git a/drivers/input/mouse/alps.c b/drivers/input/mouse/alps.c +index dbe57da8c1a1..4a3bc168a4a7 100644 +--- a/drivers/input/mouse/alps.c ++++ b/drivers/input/mouse/alps.c +@@ -2544,13 +2544,31 @@ static int alps_update_btn_info_ss4_v2(unsigned char otp[][4], + } + + static int alps_update_dual_info_ss4_v2(unsigned char otp[][4], +- struct alps_data *priv) ++ struct alps_data *priv, ++ struct psmouse *psmouse) + { + bool is_dual = false; ++ int reg_val = 0; ++ struct ps2dev *ps2dev = &psmouse->ps2dev; + +- if (IS_SS4PLUS_DEV(priv->dev_id)) ++ if (IS_SS4PLUS_DEV(priv->dev_id)) { + is_dual = (otp[0][0] >> 4) & 0x01; + ++ if (!is_dual) { ++ /* For support TrackStick of Thinkpad L/E series */ ++ if (alps_exit_command_mode(psmouse) == 0 && ++ alps_enter_command_mode(psmouse) == 0) { ++ reg_val = alps_command_mode_read_reg(psmouse, ++ 0xD7); ++ } ++ alps_exit_command_mode(psmouse); ++ ps2_command(ps2dev, NULL, PSMOUSE_CMD_ENABLE); ++ ++ if (reg_val == 0x0C || reg_val == 0x1D) ++ is_dual = true; ++ } ++ } ++ + if (is_dual) + priv->flags |= ALPS_DUALPOINT | + ALPS_DUALPOINT_WITH_PRESSURE; +@@ -2573,7 +2591,7 @@ static int alps_set_defaults_ss4_v2(struct psmouse *psmouse, + + alps_update_btn_info_ss4_v2(otp, priv); + +- alps_update_dual_info_ss4_v2(otp, priv); ++ alps_update_dual_info_ss4_v2(otp, priv, psmouse); + + return 0; + } +diff --git a/drivers/input/serio/i8042-x86ia64io.h b/drivers/input/serio/i8042-x86ia64io.h +index 6cbbdc6e9687..b353d494ad40 100644 +--- a/drivers/input/serio/i8042-x86ia64io.h ++++ b/drivers/input/serio/i8042-x86ia64io.h +@@ -530,6 +530,20 @@ static const struct dmi_system_id __initconst i8042_dmi_nomux_table[] = { + { } + }; + ++static const struct dmi_system_id i8042_dmi_forcemux_table[] __initconst = { ++ { ++ /* ++ * Sony Vaio VGN-CS series require MUX or the touch sensor ++ * buttons will disturb touchpad operation ++ */ ++ .matches = { ++ DMI_MATCH(DMI_SYS_VENDOR, "Sony Corporation"), ++ DMI_MATCH(DMI_PRODUCT_NAME, "VGN-CS"), ++ }, ++ }, ++ { } ++}; ++ + /* + * On some Asus laptops, just running self tests cause problems. + */ +@@ -620,6 +634,13 @@ static const struct dmi_system_id __initconst i8042_dmi_reset_table[] = { + DMI_MATCH(DMI_PRODUCT_NAME, "20046"), + }, + }, ++ { ++ /* Lenovo ThinkPad L460 */ ++ .matches = { ++ DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), ++ DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad L460"), ++ }, ++ }, + { + /* Clevo P650RS, 650RP6, Sager NP8152-S, and others */ + .matches = { +@@ -1163,6 +1184,9 @@ static int __init i8042_platform_init(void) + if (dmi_check_system(i8042_dmi_nomux_table)) + i8042_nomux = true; + ++ if (dmi_check_system(i8042_dmi_forcemux_table)) ++ i8042_nomux = false; ++ + if (dmi_check_system(i8042_dmi_notimeout_table)) + i8042_notimeout = true; + +diff --git a/drivers/media/usb/usbtv/usbtv-core.c b/drivers/media/usb/usbtv/usbtv-core.c +index 127f8a0c098b..0c2e628e8723 100644 +--- a/drivers/media/usb/usbtv/usbtv-core.c ++++ b/drivers/media/usb/usbtv/usbtv-core.c +@@ -112,6 +112,8 @@ static int usbtv_probe(struct usb_interface *intf, + return 0; + + usbtv_audio_fail: ++ /* we must not free at this point */ ++ usb_get_dev(usbtv->udev); + usbtv_video_free(usbtv); + + usbtv_video_fail: +diff --git a/drivers/misc/mei/main.c b/drivers/misc/mei/main.c +index 758dc73602d5..7bb013644aeb 100644 +--- a/drivers/misc/mei/main.c ++++ b/drivers/misc/mei/main.c +@@ -507,7 +507,6 @@ static long mei_ioctl(struct file *file, unsigned int cmd, unsigned long data) + break; + + default: +- dev_err(dev->dev, ": unsupported ioctl %d.\n", cmd); + rets = -ENOIOCTLCMD; + } + +diff --git a/drivers/parport/parport_pc.c b/drivers/parport/parport_pc.c +index 489492b608cf..380916bff9e0 100644 +--- a/drivers/parport/parport_pc.c ++++ b/drivers/parport/parport_pc.c +@@ -2646,6 +2646,7 @@ enum parport_pc_pci_cards { + netmos_9901, + netmos_9865, + quatech_sppxp100, ++ wch_ch382l, + }; + + +@@ -2708,6 +2709,7 @@ static struct parport_pc_pci { + /* netmos_9901 */ { 1, { { 0, -1 }, } }, + /* netmos_9865 */ { 1, { { 0, -1 }, } }, + /* quatech_sppxp100 */ { 1, { { 0, 1 }, } }, ++ /* wch_ch382l */ { 1, { { 2, -1 }, } }, + }; + + static const struct pci_device_id parport_pc_pci_tbl[] = { +@@ -2797,6 +2799,8 @@ static const struct pci_device_id parport_pc_pci_tbl[] = { + /* Quatech SPPXP-100 Parallel port PCI ExpressCard */ + { PCI_VENDOR_ID_QUATECH, PCI_DEVICE_ID_QUATECH_SPPXP_100, + PCI_ANY_ID, PCI_ANY_ID, 0, 0, quatech_sppxp100 }, ++ /* WCH CH382L PCI-E single parallel port card */ ++ { 0x1c00, 0x3050, 0x1c00, 0x3050, 0, 0, wch_ch382l }, + { 0, } /* terminate list */ + }; + MODULE_DEVICE_TABLE(pci, parport_pc_pci_tbl); +diff --git a/drivers/siox/siox-core.c b/drivers/siox/siox-core.c +index fdfcdea25867..16590dfaafa4 100644 +--- a/drivers/siox/siox-core.c ++++ b/drivers/siox/siox-core.c +@@ -594,7 +594,7 @@ static ssize_t device_add_store(struct device *dev, + size_t inbytes = 0, outbytes = 0; + u8 statustype = 0; + +- ret = sscanf(buf, "%20s %zu %zu %hhu", type, &inbytes, ++ ret = sscanf(buf, "%19s %zu %zu %hhu", type, &inbytes, + &outbytes, &statustype); + if (ret != 3 && ret != 4) + return -EINVAL; +diff --git a/drivers/staging/comedi/drivers/ni_mio_common.c b/drivers/staging/comedi/drivers/ni_mio_common.c +index 5d610af6799f..9753042b7e1f 100644 +--- a/drivers/staging/comedi/drivers/ni_mio_common.c ++++ b/drivers/staging/comedi/drivers/ni_mio_common.c +@@ -1275,6 +1275,8 @@ static void ack_a_interrupt(struct comedi_device *dev, unsigned short a_status) + ack |= NISTC_INTA_ACK_AI_START; + if (a_status & NISTC_AI_STATUS1_STOP) + ack |= NISTC_INTA_ACK_AI_STOP; ++ if (a_status & NISTC_AI_STATUS1_OVER) ++ ack |= NISTC_INTA_ACK_AI_ERR; + if (ack) + ni_stc_writew(dev, ack, NISTC_INTA_ACK_REG); + } +diff --git a/drivers/tty/serial/8250/8250_of.c b/drivers/tty/serial/8250/8250_of.c +index 160b8906d9b9..9835b1c1cbe1 100644 +--- a/drivers/tty/serial/8250/8250_of.c ++++ b/drivers/tty/serial/8250/8250_of.c +@@ -316,6 +316,7 @@ static const struct of_device_id of_platform_serial_table[] = { + { .compatible = "mrvl,mmp-uart", + .data = (void *)PORT_XSCALE, }, + { .compatible = "ti,da830-uart", .data = (void *)PORT_DA830, }, ++ { .compatible = "nuvoton,npcm750-uart", .data = (void *)PORT_NPCM, }, + { /* end of list */ }, + }; + MODULE_DEVICE_TABLE(of, of_platform_serial_table); +diff --git a/drivers/tty/serial/8250/8250_port.c b/drivers/tty/serial/8250/8250_port.c +index 1328c7e70108..804c1af6fd33 100644 +--- a/drivers/tty/serial/8250/8250_port.c ++++ b/drivers/tty/serial/8250/8250_port.c +@@ -47,6 +47,10 @@ + #define UART_EXAR_SLEEP 0x8b /* Sleep mode */ + #define UART_EXAR_DVID 0x8d /* Device identification */ + ++/* Nuvoton NPCM timeout register */ ++#define UART_NPCM_TOR 7 ++#define UART_NPCM_TOIE BIT(7) /* Timeout Interrupt Enable */ ++ + /* + * Debugging. + */ +@@ -293,6 +297,15 @@ static const struct serial8250_config uart_config[] = { + UART_FCR_CLEAR_RCVR | UART_FCR_CLEAR_XMIT, + .flags = UART_CAP_FIFO, + }, ++ [PORT_NPCM] = { ++ .name = "Nuvoton 16550", ++ .fifo_size = 16, ++ .tx_loadsz = 16, ++ .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10 | ++ UART_FCR_CLEAR_RCVR | UART_FCR_CLEAR_XMIT, ++ .rxtrig_bytes = {1, 4, 8, 14}, ++ .flags = UART_CAP_FIFO, ++ }, + }; + + /* Uart divisor latch read */ +@@ -2140,6 +2153,15 @@ int serial8250_do_startup(struct uart_port *port) + UART_DA830_PWREMU_MGMT_FREE); + } + ++ if (port->type == PORT_NPCM) { ++ /* ++ * Nuvoton calls the scratch register 'UART_TOR' (timeout ++ * register). Enable it, and set TIOC (timeout interrupt ++ * comparator) to be 0x20 for correct operation. ++ */ ++ serial_port_out(port, UART_NPCM_TOR, UART_NPCM_TOIE | 0x20); ++ } ++ + #ifdef CONFIG_SERIAL_8250_RSA + /* + * If this is an RSA port, see if we can kick it up to the +@@ -2462,6 +2484,15 @@ static unsigned int xr17v35x_get_divisor(struct uart_8250_port *up, + return quot_16 >> 4; + } + ++/* Nuvoton NPCM UARTs have a custom divisor calculation */ ++static unsigned int npcm_get_divisor(struct uart_8250_port *up, ++ unsigned int baud) ++{ ++ struct uart_port *port = &up->port; ++ ++ return DIV_ROUND_CLOSEST(port->uartclk, 16 * baud + 2) - 2; ++} ++ + static unsigned int serial8250_get_divisor(struct uart_8250_port *up, + unsigned int baud, + unsigned int *frac) +@@ -2482,6 +2513,8 @@ static unsigned int serial8250_get_divisor(struct uart_8250_port *up, + quot = 0x8002; + else if (up->port.type == PORT_XR17V35X) + quot = xr17v35x_get_divisor(up, baud, frac); ++ else if (up->port.type == PORT_NPCM) ++ quot = npcm_get_divisor(up, baud); + else + quot = uart_get_divisor(port, baud); + +diff --git a/drivers/tty/vt/vt.c b/drivers/tty/vt/vt.c +index b4e57c5a8bba..f97251f39c26 100644 +--- a/drivers/tty/vt/vt.c ++++ b/drivers/tty/vt/vt.c +@@ -1354,6 +1354,11 @@ static void csi_m(struct vc_data *vc) + case 3: + vc->vc_italic = 1; + break; ++ case 21: ++ /* ++ * No console drivers support double underline, so ++ * convert it to a single underline. ++ */ + case 4: + vc->vc_underline = 1; + break; +@@ -1389,7 +1394,6 @@ static void csi_m(struct vc_data *vc) + vc->vc_disp_ctrl = 1; + vc->vc_toggle_meta = 1; + break; +- case 21: + case 22: + vc->vc_intensity = 1; + break; +diff --git a/drivers/usb/serial/cp210x.c b/drivers/usb/serial/cp210x.c +index 06d502b3e913..de1e759dd512 100644 +--- a/drivers/usb/serial/cp210x.c ++++ b/drivers/usb/serial/cp210x.c +@@ -155,6 +155,7 @@ static const struct usb_device_id id_table[] = { + { USB_DEVICE(0x12B8, 0xEC62) }, /* Link G4+ ECU */ + { USB_DEVICE(0x13AD, 0x9999) }, /* Baltech card reader */ + { USB_DEVICE(0x1555, 0x0004) }, /* Owen AC4 USB-RS485 Converter */ ++ { USB_DEVICE(0x155A, 0x1006) }, /* ELDAT Easywave RX09 */ + { USB_DEVICE(0x166A, 0x0201) }, /* Clipsal 5500PACA C-Bus Pascal Automation Controller */ + { USB_DEVICE(0x166A, 0x0301) }, /* Clipsal 5800PC C-Bus Wireless PC Interface */ + { USB_DEVICE(0x166A, 0x0303) }, /* Clipsal 5500PCU C-Bus USB interface */ +diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c +index f58c4ff6b387..87202ad5a50d 100644 +--- a/drivers/usb/serial/ftdi_sio.c ++++ b/drivers/usb/serial/ftdi_sio.c +@@ -769,6 +769,7 @@ static const struct usb_device_id id_table_combined[] = { + .driver_info = (kernel_ulong_t)&ftdi_NDI_device_quirk }, + { USB_DEVICE(TELLDUS_VID, TELLDUS_TELLSTICK_PID) }, + { USB_DEVICE(NOVITUS_VID, NOVITUS_BONO_E_PID) }, ++ { USB_DEVICE(FTDI_VID, RTSYSTEMS_USB_VX8_PID) }, + { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_S03_PID) }, + { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_59_PID) }, + { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_57A_PID) }, +@@ -931,6 +932,7 @@ static const struct usb_device_id id_table_combined[] = { + { USB_DEVICE(FTDI_VID, FTDI_SCIENCESCOPE_LS_LOGBOOK_PID) }, + { USB_DEVICE(FTDI_VID, FTDI_SCIENCESCOPE_HS_LOGBOOK_PID) }, + { USB_DEVICE(FTDI_VID, FTDI_CINTERION_MC55I_PID) }, ++ { USB_DEVICE(FTDI_VID, FTDI_FHE_PID) }, + { USB_DEVICE(FTDI_VID, FTDI_DOTEC_PID) }, + { USB_DEVICE(QIHARDWARE_VID, MILKYMISTONE_JTAGSERIAL_PID), + .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk }, +diff --git a/drivers/usb/serial/ftdi_sio_ids.h b/drivers/usb/serial/ftdi_sio_ids.h +index 8b4ecd2bd297..975d02666c5a 100644 +--- a/drivers/usb/serial/ftdi_sio_ids.h ++++ b/drivers/usb/serial/ftdi_sio_ids.h +@@ -923,6 +923,9 @@ + /* + * RT Systems programming cables for various ham radios + */ ++/* This device uses the VID of FTDI */ ++#define RTSYSTEMS_USB_VX8_PID 0x9e50 /* USB-VX8 USB to 7 pin modular plug for Yaesu VX-8 radio */ ++ + #define RTSYSTEMS_VID 0x2100 /* Vendor ID */ + #define RTSYSTEMS_USB_S03_PID 0x9001 /* RTS-03 USB to Serial Adapter */ + #define RTSYSTEMS_USB_59_PID 0x9e50 /* USB-59 USB to 8 pin plug */ +@@ -1441,6 +1444,12 @@ + */ + #define FTDI_CINTERION_MC55I_PID 0xA951 + ++/* ++ * Product: FirmwareHubEmulator ++ * Manufacturer: Harman Becker Automotive Systems ++ */ ++#define FTDI_FHE_PID 0xA9A0 ++ + /* + * Product: Comet Caller ID decoder + * Manufacturer: Crucible Technologies +diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c +index f53470112670..c7b75dd58fad 100644 +--- a/fs/btrfs/inode.c ++++ b/fs/btrfs/inode.c +@@ -1262,6 +1262,8 @@ static noinline int csum_exist_in_range(struct btrfs_fs_info *fs_info, + list_del(&sums->list); + kfree(sums); + } ++ if (ret < 0) ++ return ret; + return 1; + } + +@@ -1394,10 +1396,23 @@ static noinline int run_delalloc_nocow(struct inode *inode, + goto out_check; + if (btrfs_extent_readonly(fs_info, disk_bytenr)) + goto out_check; +- if (btrfs_cross_ref_exist(root, ino, +- found_key.offset - +- extent_offset, disk_bytenr)) ++ ret = btrfs_cross_ref_exist(root, ino, ++ found_key.offset - ++ extent_offset, disk_bytenr); ++ if (ret) { ++ /* ++ * ret could be -EIO if the above fails to read ++ * metadata. ++ */ ++ if (ret < 0) { ++ if (cow_start != (u64)-1) ++ cur_offset = cow_start; ++ goto error; ++ } ++ ++ WARN_ON_ONCE(nolock); + goto out_check; ++ } + disk_bytenr += extent_offset; + disk_bytenr += cur_offset - found_key.offset; + num_bytes = min(end + 1, extent_end) - cur_offset; +@@ -1415,10 +1430,22 @@ static noinline int run_delalloc_nocow(struct inode *inode, + * this ensure that csum for a given extent are + * either valid or do not exist. + */ +- if (csum_exist_in_range(fs_info, disk_bytenr, +- num_bytes)) { ++ ret = csum_exist_in_range(fs_info, disk_bytenr, ++ num_bytes); ++ if (ret) { + if (!nolock) + btrfs_end_write_no_snapshotting(root); ++ ++ /* ++ * ret could be -EIO if the above fails to read ++ * metadata. ++ */ ++ if (ret < 0) { ++ if (cow_start != (u64)-1) ++ cur_offset = cow_start; ++ goto error; ++ } ++ WARN_ON_ONCE(nolock); + goto out_check; + } + if (!btrfs_inc_nocow_writers(fs_info, disk_bytenr)) { +diff --git a/include/linux/bitmap.h b/include/linux/bitmap.h +index 5f11fbdc27f8..1ee46f492267 100644 +--- a/include/linux/bitmap.h ++++ b/include/linux/bitmap.h +@@ -302,12 +302,20 @@ static inline void bitmap_complement(unsigned long *dst, const unsigned long *sr + __bitmap_complement(dst, src, nbits); + } + ++#ifdef __LITTLE_ENDIAN ++#define BITMAP_MEM_ALIGNMENT 8 ++#else ++#define BITMAP_MEM_ALIGNMENT (8 * sizeof(unsigned long)) ++#endif ++#define BITMAP_MEM_MASK (BITMAP_MEM_ALIGNMENT - 1) ++ + static inline int bitmap_equal(const unsigned long *src1, + const unsigned long *src2, unsigned int nbits) + { + if (small_const_nbits(nbits)) + return !((*src1 ^ *src2) & BITMAP_LAST_WORD_MASK(nbits)); +- if (__builtin_constant_p(nbits & 7) && IS_ALIGNED(nbits, 8)) ++ if (__builtin_constant_p(nbits & BITMAP_MEM_MASK) && ++ IS_ALIGNED(nbits, BITMAP_MEM_ALIGNMENT)) + return !memcmp(src1, src2, nbits / 8); + return __bitmap_equal(src1, src2, nbits); + } +@@ -358,8 +366,10 @@ static __always_inline void bitmap_set(unsigned long *map, unsigned int start, + { + if (__builtin_constant_p(nbits) && nbits == 1) + __set_bit(start, map); +- else if (__builtin_constant_p(start & 7) && IS_ALIGNED(start, 8) && +- __builtin_constant_p(nbits & 7) && IS_ALIGNED(nbits, 8)) ++ else if (__builtin_constant_p(start & BITMAP_MEM_MASK) && ++ IS_ALIGNED(start, BITMAP_MEM_ALIGNMENT) && ++ __builtin_constant_p(nbits & BITMAP_MEM_MASK) && ++ IS_ALIGNED(nbits, BITMAP_MEM_ALIGNMENT)) + memset((char *)map + start / 8, 0xff, nbits / 8); + else + __bitmap_set(map, start, nbits); +@@ -370,8 +380,10 @@ static __always_inline void bitmap_clear(unsigned long *map, unsigned int start, + { + if (__builtin_constant_p(nbits) && nbits == 1) + __clear_bit(start, map); +- else if (__builtin_constant_p(start & 7) && IS_ALIGNED(start, 8) && +- __builtin_constant_p(nbits & 7) && IS_ALIGNED(nbits, 8)) ++ else if (__builtin_constant_p(start & BITMAP_MEM_MASK) && ++ IS_ALIGNED(start, BITMAP_MEM_ALIGNMENT) && ++ __builtin_constant_p(nbits & BITMAP_MEM_MASK) && ++ IS_ALIGNED(nbits, BITMAP_MEM_ALIGNMENT)) + memset((char *)map + start / 8, 0, nbits / 8); + else + __bitmap_clear(map, start, nbits); +diff --git a/include/linux/compat.h b/include/linux/compat.h +index 16c3027074a2..6970e7922c69 100644 +--- a/include/linux/compat.h ++++ b/include/linux/compat.h +@@ -222,6 +222,8 @@ typedef struct compat_siginfo { + #ifdef __ARCH_SI_TRAPNO + int _trapno; /* TRAP # which caused the signal */ + #endif ++#define __COMPAT_ADDR_BND_PKEY_PAD (__alignof__(compat_uptr_t) < sizeof(short) ? \ ++ sizeof(short) : __alignof__(compat_uptr_t)) + union { + /* + * used when si_code=BUS_MCEERR_AR or +@@ -230,13 +232,13 @@ typedef struct compat_siginfo { + short int _addr_lsb; /* Valid LSB of the reported address. */ + /* used when si_code=SEGV_BNDERR */ + struct { +- compat_uptr_t _dummy_bnd; ++ char _dummy_bnd[__COMPAT_ADDR_BND_PKEY_PAD]; + compat_uptr_t _lower; + compat_uptr_t _upper; + } _addr_bnd; + /* used when si_code=SEGV_PKUERR */ + struct { +- compat_uptr_t _dummy_pkey; ++ char _dummy_pkey[__COMPAT_ADDR_BND_PKEY_PAD]; + u32 _pkey; + } _addr_pkey; + }; +diff --git a/include/uapi/asm-generic/siginfo.h b/include/uapi/asm-generic/siginfo.h +index 99c902e460c2..65d405770b95 100644 +--- a/include/uapi/asm-generic/siginfo.h ++++ b/include/uapi/asm-generic/siginfo.h +@@ -94,6 +94,9 @@ typedef struct siginfo { + unsigned int _flags; /* see ia64 si_flags */ + unsigned long _isr; /* isr */ + #endif ++ ++#define __ADDR_BND_PKEY_PAD (__alignof__(void *) < sizeof(short) ? \ ++ sizeof(short) : __alignof__(void *)) + union { + /* + * used when si_code=BUS_MCEERR_AR or +@@ -102,13 +105,13 @@ typedef struct siginfo { + short _addr_lsb; /* LSB of the reported address */ + /* used when si_code=SEGV_BNDERR */ + struct { +- void *_dummy_bnd; ++ char _dummy_bnd[__ADDR_BND_PKEY_PAD]; + void __user *_lower; + void __user *_upper; + } _addr_bnd; + /* used when si_code=SEGV_PKUERR */ + struct { +- void *_dummy_pkey; ++ char _dummy_pkey[__ADDR_BND_PKEY_PAD]; + __u32 _pkey; + } _addr_pkey; + }; +diff --git a/include/uapi/linux/serial_core.h b/include/uapi/linux/serial_core.h +index 1c8413f93e3d..dce5f9dae121 100644 +--- a/include/uapi/linux/serial_core.h ++++ b/include/uapi/linux/serial_core.h +@@ -76,6 +76,9 @@ + #define PORT_SUNZILOG 38 + #define PORT_SUNSAB 39 + ++/* Nuvoton UART */ ++#define PORT_NPCM 40 ++ + /* Intel EG20 */ + #define PORT_PCH_8LINE 44 + #define PORT_PCH_2LINE 45