From: Greg Kroah-Hartman Date: Wed, 4 Jun 2014 21:04:03 +0000 (-0700) Subject: 3.10-stable patches X-Git-Tag: v3.14.6~38 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=784696a59173ab0dfa0d17983489b88ee594ce13;p=thirdparty%2Fkernel%2Fstable-queue.git 3.10-stable patches added patches: acpi-blacklist-add-dmi_enable_osi_linux-quirk-for-asus-eee-pc-1015px.patch dm-crypt-fix-cpu-hotplug-crash-by-removing-per-cpu-structure.patch i2c-designware-mask-all-interrupts-during-i2c-controller-enable.patch i2c-rcar-bail-out-on-zero-length-transfers.patch i2c-s3c2410-resume-race-fix.patch libata-clean-up-zpodd-when-a-port-is-detached.patch --- diff --git a/queue-3.10/acpi-blacklist-add-dmi_enable_osi_linux-quirk-for-asus-eee-pc-1015px.patch b/queue-3.10/acpi-blacklist-add-dmi_enable_osi_linux-quirk-for-asus-eee-pc-1015px.patch new file mode 100644 index 00000000000..01f2bd86d3a --- /dev/null +++ b/queue-3.10/acpi-blacklist-add-dmi_enable_osi_linux-quirk-for-asus-eee-pc-1015px.patch @@ -0,0 +1,49 @@ +From f6e6e1b9fee88c90586787b71dc49bb3ce62bb89 Mon Sep 17 00:00:00 2001 +From: Hans de Goede +Date: Mon, 5 May 2014 11:38:09 +0200 +Subject: ACPI / blacklist: Add dmi_enable_osi_linux quirk for Asus EEE PC 1015PX + +From: Hans de Goede + +commit f6e6e1b9fee88c90586787b71dc49bb3ce62bb89 upstream. + +Without this this EEE PC exports a non working WMI interface, with this it +exports a working "good old" eeepc_laptop interface, fixing brightness control +not working as well as rfkill being stuck in a permanent wireless blocked +state. + +This is not an ideal way to fix this, but various attempts to fix this +otherwise have failed, see: + +References: https://bugzilla.redhat.com/show_bug.cgi?id=1067181 +Reported-and-tested-by: lou.cardone@gmail.com +Signed-off-by: Hans de Goede +Signed-off-by: Rafael J. Wysocki +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/acpi/blacklist.c | 13 +++++++++++++ + 1 file changed, 13 insertions(+) + +--- a/drivers/acpi/blacklist.c ++++ b/drivers/acpi/blacklist.c +@@ -327,6 +327,19 @@ static struct dmi_system_id acpi_osi_dmi + DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad T500"), + }, + }, ++ /* ++ * Without this this EEEpc exports a non working WMI interface, with ++ * this it exports a working "good old" eeepc_laptop interface, fixing ++ * both brightness control, and rfkill not working. ++ */ ++ { ++ .callback = dmi_enable_osi_linux, ++ .ident = "Asus EEE PC 1015PX", ++ .matches = { ++ DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK Computer INC."), ++ DMI_MATCH(DMI_PRODUCT_NAME, "1015PX"), ++ }, ++ }, + {} + }; + diff --git a/queue-3.10/dm-crypt-fix-cpu-hotplug-crash-by-removing-per-cpu-structure.patch b/queue-3.10/dm-crypt-fix-cpu-hotplug-crash-by-removing-per-cpu-structure.patch new file mode 100644 index 00000000000..fdac86d1ead --- /dev/null +++ b/queue-3.10/dm-crypt-fix-cpu-hotplug-crash-by-removing-per-cpu-structure.patch @@ -0,0 +1,224 @@ +From 610f2de3559c383caf8fbbf91e9968102dff7ca0 Mon Sep 17 00:00:00 2001 +From: Mikulas Patocka +Date: Thu, 20 Feb 2014 18:01:01 -0500 +Subject: dm crypt: fix cpu hotplug crash by removing per-cpu structure + +From: Mikulas Patocka + +commit 610f2de3559c383caf8fbbf91e9968102dff7ca0 upstream. + +The DM crypt target used per-cpu structures to hold pointers to a +ablkcipher_request structure. The code assumed that the work item keeps +executing on a single CPU, so it didn't use synchronization when +accessing this structure. + +If a CPU is disabled by writing 0 to /sys/devices/system/cpu/cpu*/online, +the work item could be moved to another CPU. This causes dm-crypt +crashes, like the following, because the code starts using an incorrect +ablkcipher_request: + + smpboot: CPU 7 is now offline + BUG: unable to handle kernel NULL pointer dereference at 0000000000000130 + IP: [] crypt_convert+0x12d/0x3c0 [dm_crypt] + ... + Call Trace: + [] ? kcryptd_crypt+0x305/0x470 [dm_crypt] + [] ? finish_task_switch+0x40/0xc0 + [] ? process_one_work+0x168/0x470 + [] ? worker_thread+0x10b/0x390 + [] ? manage_workers.isra.26+0x290/0x290 + [] ? kthread+0xaf/0xc0 + [] ? kthread_create_on_node+0x120/0x120 + [] ? ret_from_fork+0x7c/0xb0 + [] ? kthread_create_on_node+0x120/0x120 + +Fix this bug by removing the per-cpu definition. The structure +ablkcipher_request is accessed via a pointer from convert_context. +Consequently, if the work item is rescheduled to a different CPU, the +thread still uses the same ablkcipher_request. + +This change may undermine performance improvements intended by commit +c0297721 ("dm crypt: scale to multiple cpus") on select hardware. In +practice no performance difference was observed on recent hardware. But +regardless, correctness is more important than performance. + +Signed-off-by: Mikulas Patocka +Signed-off-by: Mike Snitzer +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/md/dm-crypt.c | 61 +++++++++----------------------------------------- + 1 file changed, 12 insertions(+), 49 deletions(-) + +--- a/drivers/md/dm-crypt.c ++++ b/drivers/md/dm-crypt.c +@@ -18,7 +18,6 @@ + #include + #include + #include +-#include + #include + #include + #include +@@ -44,6 +43,7 @@ struct convert_context { + unsigned int idx_out; + sector_t cc_sector; + atomic_t cc_pending; ++ struct ablkcipher_request *req; + }; + + /* +@@ -105,15 +105,7 @@ struct iv_lmk_private { + enum flags { DM_CRYPT_SUSPENDED, DM_CRYPT_KEY_VALID }; + + /* +- * Duplicated per-CPU state for cipher. +- */ +-struct crypt_cpu { +- struct ablkcipher_request *req; +-}; +- +-/* +- * The fields in here must be read only after initialization, +- * changing state should be in crypt_cpu. ++ * The fields in here must be read only after initialization. + */ + struct crypt_config { + struct dm_dev *dev; +@@ -143,12 +135,6 @@ struct crypt_config { + sector_t iv_offset; + unsigned int iv_size; + +- /* +- * Duplicated per cpu state. Access through +- * per_cpu_ptr() only. +- */ +- struct crypt_cpu __percpu *cpu; +- + /* ESSIV: struct crypto_cipher *essiv_tfm */ + void *iv_private; + struct crypto_ablkcipher **tfms; +@@ -184,11 +170,6 @@ static void clone_init(struct dm_crypt_i + static void kcryptd_queue_crypt(struct dm_crypt_io *io); + static u8 *iv_of_dmreq(struct crypt_config *cc, struct dm_crypt_request *dmreq); + +-static struct crypt_cpu *this_crypt_config(struct crypt_config *cc) +-{ +- return this_cpu_ptr(cc->cpu); +-} +- + /* + * Use this to access cipher attributes that are the same for each CPU. + */ +@@ -738,16 +719,15 @@ static void kcryptd_async_done(struct cr + static void crypt_alloc_req(struct crypt_config *cc, + struct convert_context *ctx) + { +- struct crypt_cpu *this_cc = this_crypt_config(cc); + unsigned key_index = ctx->cc_sector & (cc->tfms_count - 1); + +- if (!this_cc->req) +- this_cc->req = mempool_alloc(cc->req_pool, GFP_NOIO); ++ if (!ctx->req) ++ ctx->req = mempool_alloc(cc->req_pool, GFP_NOIO); + +- ablkcipher_request_set_tfm(this_cc->req, cc->tfms[key_index]); +- ablkcipher_request_set_callback(this_cc->req, ++ ablkcipher_request_set_tfm(ctx->req, cc->tfms[key_index]); ++ ablkcipher_request_set_callback(ctx->req, + CRYPTO_TFM_REQ_MAY_BACKLOG | CRYPTO_TFM_REQ_MAY_SLEEP, +- kcryptd_async_done, dmreq_of_req(cc, this_cc->req)); ++ kcryptd_async_done, dmreq_of_req(cc, ctx->req)); + } + + /* +@@ -756,7 +736,6 @@ static void crypt_alloc_req(struct crypt + static int crypt_convert(struct crypt_config *cc, + struct convert_context *ctx) + { +- struct crypt_cpu *this_cc = this_crypt_config(cc); + int r; + + atomic_set(&ctx->cc_pending, 1); +@@ -768,7 +747,7 @@ static int crypt_convert(struct crypt_co + + atomic_inc(&ctx->cc_pending); + +- r = crypt_convert_block(cc, ctx, this_cc->req); ++ r = crypt_convert_block(cc, ctx, ctx->req); + + switch (r) { + /* async */ +@@ -777,7 +756,7 @@ static int crypt_convert(struct crypt_co + INIT_COMPLETION(ctx->restart); + /* fall through*/ + case -EINPROGRESS: +- this_cc->req = NULL; ++ ctx->req = NULL; + ctx->cc_sector++; + continue; + +@@ -876,6 +855,7 @@ static struct dm_crypt_io *crypt_io_allo + io->sector = sector; + io->error = 0; + io->base_io = NULL; ++ io->ctx.req = NULL; + atomic_set(&io->io_pending, 0); + + return io; +@@ -901,6 +881,8 @@ static void crypt_dec_pending(struct dm_ + if (!atomic_dec_and_test(&io->io_pending)) + return; + ++ if (io->ctx.req) ++ mempool_free(io->ctx.req, cc->req_pool); + mempool_free(io, cc->io_pool); + + if (likely(!base_io)) +@@ -1326,8 +1308,6 @@ static int crypt_wipe_key(struct crypt_c + static void crypt_dtr(struct dm_target *ti) + { + struct crypt_config *cc = ti->private; +- struct crypt_cpu *cpu_cc; +- int cpu; + + ti->private = NULL; + +@@ -1339,13 +1319,6 @@ static void crypt_dtr(struct dm_target * + if (cc->crypt_queue) + destroy_workqueue(cc->crypt_queue); + +- if (cc->cpu) +- for_each_possible_cpu(cpu) { +- cpu_cc = per_cpu_ptr(cc->cpu, cpu); +- if (cpu_cc->req) +- mempool_free(cpu_cc->req, cc->req_pool); +- } +- + crypt_free_tfms(cc); + + if (cc->bs) +@@ -1364,9 +1337,6 @@ static void crypt_dtr(struct dm_target * + if (cc->dev) + dm_put_device(ti, cc->dev); + +- if (cc->cpu) +- free_percpu(cc->cpu); +- + kzfree(cc->cipher); + kzfree(cc->cipher_string); + +@@ -1421,13 +1391,6 @@ static int crypt_ctr_cipher(struct dm_ta + if (tmp) + DMWARN("Ignoring unexpected additional cipher options"); + +- cc->cpu = __alloc_percpu(sizeof(*(cc->cpu)), +- __alignof__(struct crypt_cpu)); +- if (!cc->cpu) { +- ti->error = "Cannot allocate per cpu state"; +- goto bad_mem; +- } +- + /* + * For compatibility with the original dm-crypt mapping format, if + * only the cipher name is supplied, use cbc-plain. diff --git a/queue-3.10/i2c-designware-mask-all-interrupts-during-i2c-controller-enable.patch b/queue-3.10/i2c-designware-mask-all-interrupts-during-i2c-controller-enable.patch new file mode 100644 index 00000000000..de4901cd2b1 --- /dev/null +++ b/queue-3.10/i2c-designware-mask-all-interrupts-during-i2c-controller-enable.patch @@ -0,0 +1,58 @@ +From 47bb27e78867997040a228328f2a631c3c7f2c82 Mon Sep 17 00:00:00 2001 +From: "Du, Wenkai" +Date: Thu, 10 Apr 2014 23:03:19 +0000 +Subject: i2c: designware: Mask all interrupts during i2c controller enable + +From: "Du, Wenkai" + +commit 47bb27e78867997040a228328f2a631c3c7f2c82 upstream. + +There have been "i2c_designware 80860F41:00: controller timed out" errors +on a number of Baytrail platforms. The issue is caused by incorrect value in +Interrupt Mask Register (DW_IC_INTR_MASK) when i2c core is being enabled. +This causes call to __i2c_dw_enable() to immediately start the transfer which +leads to timeout. There are 3 failure modes observed: + +1. Failure in S0 to S3 resume path + +The default value after reset for DW_IC_INTR_MASK is 0x8ff. When we start +the first transaction after resuming from system sleep, TX_EMPTY interrupt +is already unmasked because of the hardware default. + +2. Failure in normal operational path + +This failure happens rarely and is hard to reproduce. Debug trace showed that +DW_IC_INTR_MASK had value of 0x254 when failure occurred, which meant +TX_EMPTY was unmasked. + +3. Failure in S3 to S0 suspend path + +This failure also happens rarely and is hard to reproduce. Adding debug trace +that read DW_IC_INTR_MASK made this failure not reproducible. But from ISR +call trace we could conclude TX_EMPTY was unmasked when problem occurred. + +The patch masks all interrupts before the controller is enabled to resolve the +faulty DW_IC_INTR_MASK conditions. + +Signed-off-by: Wenkai Du +Acked-by: Mika Westerberg +[wsa: improved the comment and removed typo in commit msg] +Signed-off-by: Wolfram Sang +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/i2c/busses/i2c-designware-core.c | 3 +++ + 1 file changed, 3 insertions(+) + +--- a/drivers/i2c/busses/i2c-designware-core.c ++++ b/drivers/i2c/busses/i2c-designware-core.c +@@ -380,6 +380,9 @@ static void i2c_dw_xfer_init(struct dw_i + ic_con &= ~DW_IC_CON_10BITADDR_MASTER; + dw_writel(dev, ic_con, DW_IC_CON); + ++ /* enforce disabled interrupts (due to HW issues) */ ++ i2c_dw_disable_int(dev); ++ + /* Enable the adapter */ + __i2c_dw_enable(dev, true); + diff --git a/queue-3.10/i2c-rcar-bail-out-on-zero-length-transfers.patch b/queue-3.10/i2c-rcar-bail-out-on-zero-length-transfers.patch new file mode 100644 index 00000000000..3242979f377 --- /dev/null +++ b/queue-3.10/i2c-rcar-bail-out-on-zero-length-transfers.patch @@ -0,0 +1,46 @@ +From d7653964c590ba846aa11a8f6edf409773cbc492 Mon Sep 17 00:00:00 2001 +From: Wolfram Sang +Date: Mon, 5 May 2014 18:36:21 +0200 +Subject: i2c: rcar: bail out on zero length transfers + +From: Wolfram Sang + +commit d7653964c590ba846aa11a8f6edf409773cbc492 upstream. + +This hardware does not support zero length transfers. Instead, the +driver does one (random) byte transfers currently with undefined results +for the slaves. We now bail out. + +Signed-off-by: Wolfram Sang +Signed-off-by: Wolfram Sang +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/i2c/busses/i2c-rcar.c | 9 ++++++++- + 1 file changed, 8 insertions(+), 1 deletion(-) + +--- a/drivers/i2c/busses/i2c-rcar.c ++++ b/drivers/i2c/busses/i2c-rcar.c +@@ -541,6 +541,12 @@ static int rcar_i2c_master_xfer(struct i + + ret = -EINVAL; + for (i = 0; i < num; i++) { ++ /* This HW can't send STOP after address phase */ ++ if (msgs[i].len == 0) { ++ ret = -EOPNOTSUPP; ++ break; ++ } ++ + /*-------------- spin lock -----------------*/ + spin_lock_irqsave(&priv->lock, flags); + +@@ -605,7 +611,8 @@ static int rcar_i2c_master_xfer(struct i + + static u32 rcar_i2c_func(struct i2c_adapter *adap) + { +- return I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL; ++ /* This HW can't do SMBUS_QUICK and NOSTART */ ++ return I2C_FUNC_I2C | (I2C_FUNC_SMBUS_EMUL & ~I2C_FUNC_SMBUS_QUICK); + } + + static const struct i2c_algorithm rcar_i2c_algo = { diff --git a/queue-3.10/i2c-s3c2410-resume-race-fix.patch b/queue-3.10/i2c-s3c2410-resume-race-fix.patch new file mode 100644 index 00000000000..5424143c44c --- /dev/null +++ b/queue-3.10/i2c-s3c2410-resume-race-fix.patch @@ -0,0 +1,40 @@ +From ce78cc071f5f541480e381cc0241d37590041a9d Mon Sep 17 00:00:00 2001 +From: Olof Johansson +Date: Fri, 11 Apr 2014 15:19:41 -0700 +Subject: i2c: s3c2410: resume race fix + +From: Olof Johansson + +commit ce78cc071f5f541480e381cc0241d37590041a9d upstream. + +Don't unmark the device as suspended until after it's been re-setup. + +The main race would be w.r.t. an i2c driver that gets resumed at the same +time (asyncronously), that is allowed to do a transfer since suspended +is set to 0 before reinit, but really should have seen the -EIO return +instead. + +Signed-off-by: Olof Johansson +Signed-off-by: Doug Anderson +Acked-by: Kukjin Kim +Signed-off-by: Wolfram Sang +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/i2c/busses/i2c-s3c2410.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/drivers/i2c/busses/i2c-s3c2410.c ++++ b/drivers/i2c/busses/i2c-s3c2410.c +@@ -1204,10 +1204,10 @@ static int s3c24xx_i2c_resume(struct dev + struct platform_device *pdev = to_platform_device(dev); + struct s3c24xx_i2c *i2c = platform_get_drvdata(pdev); + +- i2c->suspended = 0; + clk_prepare_enable(i2c->clk); + s3c24xx_i2c_init(i2c); + clk_disable_unprepare(i2c->clk); ++ i2c->suspended = 0; + + return 0; + } diff --git a/queue-3.10/libata-clean-up-zpodd-when-a-port-is-detached.patch b/queue-3.10/libata-clean-up-zpodd-when-a-port-is-detached.patch new file mode 100644 index 00000000000..8b1efa132af --- /dev/null +++ b/queue-3.10/libata-clean-up-zpodd-when-a-port-is-detached.patch @@ -0,0 +1,50 @@ +From a6f9bf4d2f965b862b95213303d154e02957eed8 Mon Sep 17 00:00:00 2001 +From: Levente Kurusa +Date: Tue, 6 May 2014 15:57:48 +0200 +Subject: libata: clean up ZPODD when a port is detached + +From: Levente Kurusa + +commit a6f9bf4d2f965b862b95213303d154e02957eed8 upstream. + +When a ZPODD device is unbound via sysfs, the ACPI notify handler +is not removed. This causes panics as observed in Bug #74601. The +panic only happens when the wake happens from outside the kernel +(i.e. inserting a media or pressing a button). Add a loop to +ata_port_detach which loops through the port's devices and checks +if zpodd is enabled, if so call zpodd_exit. + +Reviewed-by: Aaron Lu +Signed-off-by: Levente Kurusa +Signed-off-by: Tejun Heo +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/ata/libata-core.c | 9 +++++++++ + 1 file changed, 9 insertions(+) + +--- a/drivers/ata/libata-core.c ++++ b/drivers/ata/libata-core.c +@@ -6300,6 +6300,8 @@ int ata_host_activate(struct ata_host *h + static void ata_port_detach(struct ata_port *ap) + { + unsigned long flags; ++ struct ata_link *link; ++ struct ata_device *dev; + + if (!ap->ops->error_handler) + goto skip_eh; +@@ -6319,6 +6321,13 @@ static void ata_port_detach(struct ata_p + cancel_delayed_work_sync(&ap->hotplug_task); + + skip_eh: ++ /* clean up zpodd on port removal */ ++ ata_for_each_link(link, ap, HOST_FIRST) { ++ ata_for_each_dev(dev, link, ALL) { ++ if (zpodd_dev_enabled(dev)) ++ zpodd_exit(dev); ++ } ++ } + if (ap->pmp_link) { + int i; + for (i = 0; i < SATA_PMP_MAX_PORTS; i++) diff --git a/queue-3.10/series b/queue-3.10/series index 109fd506cfc..03a01006e8d 100644 --- a/queue-3.10/series +++ b/queue-3.10/series @@ -87,3 +87,9 @@ target-iser-fix-wrong-connection-requests-list-addition.patch target-iser-fix-iscsit_accept_np-and-rdma_cm-racy-flow.patch target-don-t-allow-setting-wc-emulation-if-device-doesn-t-support.patch powerpc-tm-fix-crash-when-forking-inside-a-transaction.patch +dm-crypt-fix-cpu-hotplug-crash-by-removing-per-cpu-structure.patch +libata-clean-up-zpodd-when-a-port-is-detached.patch +acpi-blacklist-add-dmi_enable_osi_linux-quirk-for-asus-eee-pc-1015px.patch +i2c-rcar-bail-out-on-zero-length-transfers.patch +i2c-designware-mask-all-interrupts-during-i2c-controller-enable.patch +i2c-s3c2410-resume-race-fix.patch