Merge pull request #116 from ertugerata/kernel-4.1.7
kernel-4.17 and drivers
This commit is contained in:
@@ -11,7 +11,7 @@
|
||||
<Summary>Kernel module allowing to switch dedicated graphics card on Optimus laptops</Summary>
|
||||
<Description>kernel module allowing to switch dedicated graphics card on Optimus laptops</Description>
|
||||
<BuildDependencies>
|
||||
<Dependency version="4.1.6">kernel-module-headers</Dependency>
|
||||
<Dependency version="4.1.7">kernel-module-headers</Dependency>
|
||||
</BuildDependencies>
|
||||
<Archive sha1sum="e282ee682d794e3962baa4dead01917c42571e78" type="targz">https://github.com/Bumblebee-Project/bbswitch/archive/v0.8.tar.gz</Archive>
|
||||
<Patches>
|
||||
@@ -20,7 +20,7 @@
|
||||
<Package>
|
||||
<Name>module-bbswitch</Name>
|
||||
<RuntimeDependencies>
|
||||
<Dependency version="4.1.6">kernel</Dependency>
|
||||
<Dependency version="4.1.7">kernel</Dependency>
|
||||
</RuntimeDependencies>
|
||||
<Files>
|
||||
<Path fileType="library" permanent="true">/lib/modules</Path>
|
||||
@@ -34,6 +34,13 @@
|
||||
</Package>
|
||||
|
||||
<History>
|
||||
<Update release="28">
|
||||
<Date>2015-09-18</Date>
|
||||
<Version>0.8</Version>
|
||||
<Comment>Rebuild for kernel-4.1.7.</Comment>
|
||||
<Name>Ertuğrul Erata</Name>
|
||||
<Email>ertugrulerata@gmail.com</Email>
|
||||
</Update>
|
||||
<Update release="27">
|
||||
<Date>2015-08-18</Date>
|
||||
<Version>0.8</Version>
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
<Archive sha1sum="e02beac9cc713011551c483ae5f20f065f5b88c7" type="targz" target="i686">http://www.broadcom.com/docs/linux_sta/hybrid-v35-nodebug-pcoem-6_30_223_248.tar.gz</Archive>
|
||||
<Archive sha1sum="bd55f1fdc6b0a4d0a70dc4ba4bb4169a824e238c" type="targz" target="x86_64">http://www.broadcom.com/docs/linux_sta/hybrid-v35_64-nodebug-pcoem-6_30_223_248.tar.gz</Archive>
|
||||
<BuildDependencies>
|
||||
<Dependency version="4.1.6">kernel-module-headers</Dependency>
|
||||
<Dependency version="4.1.7">kernel-module-headers</Dependency>
|
||||
</BuildDependencies>
|
||||
<Patches>
|
||||
<Patch level="1">patch/linux-40.patch</Patch>
|
||||
@@ -30,7 +30,7 @@
|
||||
<Package>
|
||||
<Name>module-broadcom-wl</Name>
|
||||
<RuntimeDependencies>
|
||||
<Dependency version="4.1.6">kernel</Dependency>
|
||||
<Dependency version="4.1.7">kernel</Dependency>
|
||||
<Dependency release="current">module-broadcom-wl-userspace</Dependency>
|
||||
</RuntimeDependencies>
|
||||
<Replaces>
|
||||
@@ -62,6 +62,13 @@
|
||||
</Package>
|
||||
|
||||
<History>
|
||||
<Update release="48">
|
||||
<Date>2015-09-18</Date>
|
||||
<Version>6.30.223.248</Version>
|
||||
<Comment>Rebuild for kernel 4.1.7.</Comment>
|
||||
<Name>Ertuğrul Erata</Name>
|
||||
<Email>ertugrulerata@gmail.com</Email>
|
||||
</Update>
|
||||
<Update release="47">
|
||||
<Date>2015-08-18</Date>
|
||||
<Version>6.30.223.248</Version>
|
||||
|
||||
@@ -14,14 +14,14 @@
|
||||
<Description>This package provides the kernel modules needed for mouse integration and shared folder support between VirtualBox host and guest systems.</Description>
|
||||
<Archive sha1sum="82194515516139801fdc690198495b043d1c9cbe" type="tarxz">http://source.pisilinux.org/1.0/module-virtualbox-guest-4.3.28.tar.xz</Archive>
|
||||
<BuildDependencies>
|
||||
<Dependency version="4.1.6">kernel-module-headers</Dependency>
|
||||
<Dependency version="4.1.7">kernel-module-headers</Dependency>
|
||||
</BuildDependencies>
|
||||
</Source>
|
||||
|
||||
<Package>
|
||||
<Name>module-virtualbox-guest</Name>
|
||||
<RuntimeDependencies>
|
||||
<Dependency version="4.1.6">kernel</Dependency>
|
||||
<Dependency version="4.1.7">kernel</Dependency>
|
||||
<Dependency>baselayout</Dependency>
|
||||
<Dependency version="current">module-virtualbox-guest-userspace</Dependency>
|
||||
</RuntimeDependencies>
|
||||
@@ -55,7 +55,7 @@
|
||||
<Update release="49">
|
||||
<Date>2015-08-18</Date>
|
||||
<Version>4.3.28</Version>
|
||||
<Comment>Rebuild for kernel-4.1.6.</Comment>
|
||||
<Comment>Rebuild for kernel-4.1.7.</Comment>
|
||||
<Name>Ertuğrul Erata</Name>
|
||||
<Email>ertugrulerata@gmail.com</Email>
|
||||
</Update>
|
||||
|
||||
@@ -14,14 +14,14 @@
|
||||
<Description>This package provides the kernel support for VirtualBox.</Description>
|
||||
<Archive sha1sum="8850ebc24e00640835b682a5f8bbc8f05313d2d7" type="tarxz">http://source.pisilinux.org/1.0/module-virtualbox-4.3.28.tar.xz</Archive>
|
||||
<BuildDependencies>
|
||||
<Dependency version="4.1.6">kernel-module-headers</Dependency>
|
||||
<Dependency version="4.1.7">kernel-module-headers</Dependency>
|
||||
</BuildDependencies>
|
||||
</Source>
|
||||
|
||||
<Package>
|
||||
<Name>module-virtualbox</Name>
|
||||
<RuntimeDependencies>
|
||||
<Dependency version="4.1.6">kernel</Dependency>
|
||||
<Dependency version="4.1.7">kernel</Dependency>
|
||||
<Dependency version="current">module-virtualbox-userspace</Dependency>
|
||||
</RuntimeDependencies>
|
||||
<Files>
|
||||
@@ -47,6 +47,13 @@
|
||||
</Package>
|
||||
|
||||
<History>
|
||||
<Update release="52">
|
||||
<Date>2015-09-18</Date>
|
||||
<Version>4.3.28</Version>
|
||||
<Comment>Rebuild for kernel-4.1.7.</Comment>
|
||||
<Name>Ertuğrul Erata</Name>
|
||||
<Email>ertugrulerata@gmail.com</Email>
|
||||
</Update>
|
||||
<Update release="51">
|
||||
<Date>2015-08-18</Date>
|
||||
<Version>4.3.28</Version>
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
#
|
||||
# Automatically generated file; DO NOT EDIT.
|
||||
# Linux/x86_64 4.1.6 Kernel Configuration
|
||||
# Linux/x86_64 4.1.7 Kernel Configuration
|
||||
#
|
||||
CONFIG_64BIT=y
|
||||
CONFIG_X86_64=y
|
||||
|
||||
Binary file not shown.
@@ -0,0 +1,64 @@
|
||||
From eb38f3a4f6e86f8bb10a3217ebd85ecc5d763aae Mon Sep 17 00:00:00 2001
|
||||
From: Takashi Iwai <tiwai@suse.de>
|
||||
Date: Thu, 3 Sep 2015 22:20:00 -0700
|
||||
Subject: [PATCH] Input: evdev - do not report errors form flush()
|
||||
|
||||
We've got bug reports showing the old systemd-logind (at least
|
||||
system-210) aborting unexpectedly, and this turned out to be because
|
||||
of an invalid error code from close() call to evdev devices. close()
|
||||
is supposed to return only either EINTR or EBADFD, while the device
|
||||
returned ENODEV. logind was overreacting to it and decided to kill
|
||||
itself when an unexpected error code was received. What a tragedy.
|
||||
|
||||
The bad error code comes from flush fops, and actually evdev_flush()
|
||||
returns ENODEV when device is disconnected or client's access to it is
|
||||
revoked. But in these cases the fact that flush did not actually happen is
|
||||
not an error, but rather normal behavior. For non-disconnected devices
|
||||
result of flush is also not that interesting as there is no potential of
|
||||
data loss and even if it fails application has no way of handling the
|
||||
error. Because of that we are better off always returning success from
|
||||
evdev_flush().
|
||||
|
||||
Also returning EINTR from flush()/close() is discouraged (as it is not
|
||||
clear how application should handle this error), so let's stop taking
|
||||
evdev->mutex interruptibly.
|
||||
|
||||
Bugzilla: http://bugzilla.suse.com/show_bug.cgi?id=939834
|
||||
Cc: <stable@vger.kernel.org>
|
||||
Signed-off-by: Takashi Iwai <tiwai@suse.de>
|
||||
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
|
||||
---
|
||||
drivers/input/evdev.c | 13 ++++---------
|
||||
1 file changed, 4 insertions(+), 9 deletions(-)
|
||||
|
||||
diff --git a/drivers/input/evdev.c b/drivers/input/evdev.c
|
||||
index 9d35499..08d4964 100644
|
||||
--- a/drivers/input/evdev.c
|
||||
+++ b/drivers/input/evdev.c
|
||||
@@ -290,19 +290,14 @@ static int evdev_flush(struct file *file, fl_owner_t id)
|
||||
{
|
||||
struct evdev_client *client = file->private_data;
|
||||
struct evdev *evdev = client->evdev;
|
||||
- int retval;
|
||||
|
||||
- retval = mutex_lock_interruptible(&evdev->mutex);
|
||||
- if (retval)
|
||||
- return retval;
|
||||
+ mutex_lock(&evdev->mutex);
|
||||
|
||||
- if (!evdev->exist || client->revoked)
|
||||
- retval = -ENODEV;
|
||||
- else
|
||||
- retval = input_flush_device(&evdev->handle, file);
|
||||
+ if (evdev->exist && !client->revoked)
|
||||
+ input_flush_device(&evdev->handle, file);
|
||||
|
||||
mutex_unlock(&evdev->mutex);
|
||||
- return retval;
|
||||
+ return 0;
|
||||
}
|
||||
|
||||
static void evdev_free(struct device *dev)
|
||||
--
|
||||
2.3.8
|
||||
|
||||
-62
@@ -1,62 +0,0 @@
|
||||
From 512255a2ad2c832ca7d4de9f31245f73781922d0 Mon Sep 17 00:00:00 2001
|
||||
From: Andy Lutomirski <luto@kernel.org>
|
||||
Date: Mon, 17 Aug 2015 12:22:50 -0700
|
||||
Subject: [PATCH] Revert "sched/x86_64: Don't save flags on context switch"
|
||||
|
||||
This reverts commit:
|
||||
|
||||
2c7577a75837 ("sched/x86_64: Don't save flags on context switch")
|
||||
|
||||
It was a nice speedup. It's also not quite correct: SYSENTER
|
||||
enables interrupts too early.
|
||||
|
||||
We can re-add this optimization once the SYSENTER code is beaten
|
||||
into shape, which should happen in 4.3 or 4.4.
|
||||
|
||||
Signed-off-by: Andy Lutomirski <luto@kernel.org>
|
||||
Cc: Linus Torvalds <torvalds@linux-foundation.org>
|
||||
Cc: Peter Zijlstra <peterz@infradead.org>
|
||||
Cc: Thomas Gleixner <tglx@linutronix.de>
|
||||
Cc: stable@vger.kernel.org # v3.19
|
||||
Link: http://lkml.kernel.org/r/85f56651f59f76624e80785a8fd3bdfdd089a818.1439838962.git.luto@kernel.org
|
||||
Signed-off-by: Ingo Molnar <mingo@kernel.org>
|
||||
---
|
||||
arch/x86/include/asm/switch_to.h | 12 ++++--------
|
||||
1 file changed, 4 insertions(+), 8 deletions(-)
|
||||
|
||||
diff --git a/arch/x86/include/asm/switch_to.h b/arch/x86/include/asm/switch_to.h
|
||||
index 751bf4b..d7f3b3b 100644
|
||||
--- a/arch/x86/include/asm/switch_to.h
|
||||
+++ b/arch/x86/include/asm/switch_to.h
|
||||
@@ -79,12 +79,12 @@ do { \
|
||||
#else /* CONFIG_X86_32 */
|
||||
|
||||
/* frame pointer must be last for get_wchan */
|
||||
-#define SAVE_CONTEXT "pushq %%rbp ; movq %%rsi,%%rbp\n\t"
|
||||
-#define RESTORE_CONTEXT "movq %%rbp,%%rsi ; popq %%rbp\t"
|
||||
+#define SAVE_CONTEXT "pushf ; pushq %%rbp ; movq %%rsi,%%rbp\n\t"
|
||||
+#define RESTORE_CONTEXT "movq %%rbp,%%rsi ; popq %%rbp ; popf\t"
|
||||
|
||||
#define __EXTRA_CLOBBER \
|
||||
, "rcx", "rbx", "rdx", "r8", "r9", "r10", "r11", \
|
||||
- "r12", "r13", "r14", "r15", "flags"
|
||||
+ "r12", "r13", "r14", "r15"
|
||||
|
||||
#ifdef CONFIG_CC_STACKPROTECTOR
|
||||
#define __switch_canary \
|
||||
@@ -100,11 +100,7 @@ do { \
|
||||
#define __switch_canary_iparam
|
||||
#endif /* CC_STACKPROTECTOR */
|
||||
|
||||
-/*
|
||||
- * There is no need to save or restore flags, because flags are always
|
||||
- * clean in kernel mode, with the possible exception of IOPL. Kernel IOPL
|
||||
- * has no effect.
|
||||
- */
|
||||
+/* Save restore flags to clear handle leaking NT */
|
||||
#define switch_to(prev, next, last) \
|
||||
asm volatile(SAVE_CONTEXT \
|
||||
"movq %%rsp,%P[threadrsp](%[prev])\n\t" /* save RSP */ \
|
||||
--
|
||||
2.4.5
|
||||
|
||||
-83
@@ -1,83 +0,0 @@
|
||||
From 49718f0fb8c9af192b33d8af3a2826db04025371 Mon Sep 17 00:00:00 2001
|
||||
From: Alan Stern <stern@rowland.harvard.edu>
|
||||
Date: Mon, 17 Aug 2015 11:02:42 -0400
|
||||
Subject: [PATCH] SCSI: Fix NULL pointer dereference in runtime PM
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
The routines in scsi_rpm.c assume that if a runtime-PM callback is
|
||||
invoked for a SCSI device, it can only mean that the device's driver
|
||||
has asked the block layer to handle the runtime power management (by
|
||||
calling blk_pm_runtime_init(), which among other things sets q->dev).
|
||||
|
||||
However, this assumption turns out to be wrong for things like the ses
|
||||
driver. Normally ses devices are not allowed to do runtime PM, but
|
||||
userspace can override this setting. If this happens, the kernel gets
|
||||
a NULL pointer dereference when blk_post_runtime_resume() tries to use
|
||||
the uninitialized q->dev pointer.
|
||||
|
||||
This patch fixes the problem by calling the block layer's runtime-PM
|
||||
routines only if the device's driver really does have a runtime-PM
|
||||
callback routine. Since ses doesn't define any such callbacks, the
|
||||
crash won't occur.
|
||||
|
||||
This fixes Bugzilla #101371.
|
||||
|
||||
Signed-off-by: Alan Stern <stern@rowland.harvard.edu>
|
||||
Reported-by: Stanisław Pitucha <viraptor@gmail.com>
|
||||
Reported-by: Ilan Cohen <ilanco@gmail.com>
|
||||
Tested-by: Ilan Cohen <ilanco@gmail.com>
|
||||
Reviewed-by: Johannes Thumshirn <jthumshirn@suse.de>
|
||||
Cc: stable@vger.kernel.org
|
||||
Signed-off-by: James Bottomley <JBottomley@Odin.com>
|
||||
---
|
||||
drivers/scsi/scsi_pm.c | 22 +++++++++++-----------
|
||||
1 file changed, 11 insertions(+), 11 deletions(-)
|
||||
|
||||
diff --git a/drivers/scsi/scsi_pm.c b/drivers/scsi/scsi_pm.c
|
||||
index 9e43ae1..e4b7998 100644
|
||||
--- a/drivers/scsi/scsi_pm.c
|
||||
+++ b/drivers/scsi/scsi_pm.c
|
||||
@@ -217,15 +217,15 @@ static int sdev_runtime_suspend(struct device *dev)
|
||||
{
|
||||
const struct dev_pm_ops *pm = dev->driver ? dev->driver->pm : NULL;
|
||||
struct scsi_device *sdev = to_scsi_device(dev);
|
||||
- int err;
|
||||
+ int err = 0;
|
||||
|
||||
- err = blk_pre_runtime_suspend(sdev->request_queue);
|
||||
- if (err)
|
||||
- return err;
|
||||
- if (pm && pm->runtime_suspend)
|
||||
+ if (pm && pm->runtime_suspend) {
|
||||
+ err = blk_pre_runtime_suspend(sdev->request_queue);
|
||||
+ if (err)
|
||||
+ return err;
|
||||
err = pm->runtime_suspend(dev);
|
||||
- blk_post_runtime_suspend(sdev->request_queue, err);
|
||||
-
|
||||
+ blk_post_runtime_suspend(sdev->request_queue, err);
|
||||
+ }
|
||||
return err;
|
||||
}
|
||||
|
||||
@@ -248,11 +248,11 @@ static int sdev_runtime_resume(struct device *dev)
|
||||
const struct dev_pm_ops *pm = dev->driver ? dev->driver->pm : NULL;
|
||||
int err = 0;
|
||||
|
||||
- blk_pre_runtime_resume(sdev->request_queue);
|
||||
- if (pm && pm->runtime_resume)
|
||||
+ if (pm && pm->runtime_resume) {
|
||||
+ blk_pre_runtime_resume(sdev->request_queue);
|
||||
err = pm->runtime_resume(dev);
|
||||
- blk_post_runtime_resume(sdev->request_queue, err);
|
||||
-
|
||||
+ blk_post_runtime_resume(sdev->request_queue, err);
|
||||
+ }
|
||||
return err;
|
||||
}
|
||||
|
||||
--
|
||||
2.4.5
|
||||
|
||||
@@ -1,120 +0,0 @@
|
||||
From 74a80d67b8316eb3fbeb73dafc060a5a0a708587 Mon Sep 17 00:00:00 2001
|
||||
From: Tejun Heo <tj@kernel.org>
|
||||
Date: Mon, 3 Aug 2015 11:46:39 -0400
|
||||
Subject: [PATCH] Revert "libata: Implement NCQ autosense"
|
||||
|
||||
This reverts commit 42b966fbf35da9c87f08d98f9b8978edf9e717cf.
|
||||
|
||||
As implemented, ACS-4 sense reporting for ATA devices bypasses error
|
||||
diagnosis and handling in libata degrading EH behavior significantly.
|
||||
Revert the related changes for now.
|
||||
|
||||
Signed-off-by: Tejun Heo <tj@kernel.org>
|
||||
Cc: Hannes Reinecke <hare@suse.de>
|
||||
Cc: stable@vger.kernel.org #v4.1+
|
||||
---
|
||||
drivers/ata/libata-eh.c | 18 ------------------
|
||||
drivers/ata/libata-scsi.c | 9 ++-------
|
||||
drivers/ata/libata.h | 1 -
|
||||
include/linux/ata.h | 2 --
|
||||
4 files changed, 2 insertions(+), 28 deletions(-)
|
||||
|
||||
diff --git a/drivers/ata/libata-eh.c b/drivers/ata/libata-eh.c
|
||||
index 16125be..cb0508a 100644
|
||||
--- a/drivers/ata/libata-eh.c
|
||||
+++ b/drivers/ata/libata-eh.c
|
||||
@@ -1592,8 +1592,6 @@ static int ata_eh_read_log_10h(struct ata_device *dev,
|
||||
tf->hob_lbah = buf[10];
|
||||
tf->nsect = buf[12];
|
||||
tf->hob_nsect = buf[13];
|
||||
- if (ata_id_has_ncq_autosense(dev->id))
|
||||
- tf->auxiliary = buf[14] << 16 | buf[15] << 8 | buf[16];
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -1791,18 +1789,6 @@ void ata_eh_analyze_ncq_error(struct ata_link *link)
|
||||
memcpy(&qc->result_tf, &tf, sizeof(tf));
|
||||
qc->result_tf.flags = ATA_TFLAG_ISADDR | ATA_TFLAG_LBA | ATA_TFLAG_LBA48;
|
||||
qc->err_mask |= AC_ERR_DEV | AC_ERR_NCQ;
|
||||
- if (qc->result_tf.auxiliary) {
|
||||
- char sense_key, asc, ascq;
|
||||
-
|
||||
- sense_key = (qc->result_tf.auxiliary >> 16) & 0xff;
|
||||
- asc = (qc->result_tf.auxiliary >> 8) & 0xff;
|
||||
- ascq = qc->result_tf.auxiliary & 0xff;
|
||||
- ata_dev_dbg(dev, "NCQ Autosense %02x/%02x/%02x\n",
|
||||
- sense_key, asc, ascq);
|
||||
- ata_scsi_set_sense(qc->scsicmd, sense_key, asc, ascq);
|
||||
- qc->flags |= ATA_QCFLAG_SENSE_VALID;
|
||||
- }
|
||||
-
|
||||
ehc->i.err_mask &= ~AC_ERR_DEV;
|
||||
}
|
||||
|
||||
@@ -1832,10 +1818,6 @@ static unsigned int ata_eh_analyze_tf(struct ata_queued_cmd *qc,
|
||||
return ATA_EH_RESET;
|
||||
}
|
||||
|
||||
- /* Set by NCQ autosense */
|
||||
- if (qc->flags & ATA_QCFLAG_SENSE_VALID)
|
||||
- return 0;
|
||||
-
|
||||
if (stat & (ATA_ERR | ATA_DF))
|
||||
qc->err_mask |= AC_ERR_DEV;
|
||||
else
|
||||
diff --git a/drivers/ata/libata-scsi.c b/drivers/ata/libata-scsi.c
|
||||
index e1ecd2a..0d7f0da 100644
|
||||
--- a/drivers/ata/libata-scsi.c
|
||||
+++ b/drivers/ata/libata-scsi.c
|
||||
@@ -270,11 +270,8 @@ DEVICE_ATTR(unload_heads, S_IRUGO | S_IWUSR,
|
||||
ata_scsi_park_show, ata_scsi_park_store);
|
||||
EXPORT_SYMBOL_GPL(dev_attr_unload_heads);
|
||||
|
||||
-void ata_scsi_set_sense(struct scsi_cmnd *cmd, u8 sk, u8 asc, u8 ascq)
|
||||
+static void ata_scsi_set_sense(struct scsi_cmnd *cmd, u8 sk, u8 asc, u8 ascq)
|
||||
{
|
||||
- if (!cmd)
|
||||
- return;
|
||||
-
|
||||
cmd->result = (DRIVER_SENSE << 24) | SAM_STAT_CHECK_CONDITION;
|
||||
|
||||
scsi_build_sense_buffer(0, cmd->sense_buffer, sk, asc, ascq);
|
||||
@@ -1780,9 +1777,7 @@ static void ata_scsi_qc_complete(struct ata_queued_cmd *qc)
|
||||
((cdb[2] & 0x20) || need_sense)) {
|
||||
ata_gen_passthru_sense(qc);
|
||||
} else {
|
||||
- if (qc->flags & ATA_QCFLAG_SENSE_VALID) {
|
||||
- cmd->result = SAM_STAT_CHECK_CONDITION;
|
||||
- } else if (!need_sense) {
|
||||
+ if (!need_sense) {
|
||||
cmd->result = SAM_STAT_GOOD;
|
||||
} else {
|
||||
/* TODO: decide which descriptor format to use
|
||||
diff --git a/drivers/ata/libata.h b/drivers/ata/libata.h
|
||||
index 8cfdd96..f840ca1 100644
|
||||
--- a/drivers/ata/libata.h
|
||||
+++ b/drivers/ata/libata.h
|
||||
@@ -137,7 +137,6 @@ extern int ata_scsi_add_hosts(struct ata_host *host,
|
||||
struct scsi_host_template *sht);
|
||||
extern void ata_scsi_scan_host(struct ata_port *ap, int sync);
|
||||
extern int ata_scsi_offline_dev(struct ata_device *dev);
|
||||
-extern void ata_scsi_set_sense(struct scsi_cmnd *cmd, u8 sk, u8 asc, u8 ascq);
|
||||
extern void ata_scsi_media_change_notify(struct ata_device *dev);
|
||||
extern void ata_scsi_hotplug(struct work_struct *work);
|
||||
extern void ata_schedule_scsi_eh(struct Scsi_Host *shost);
|
||||
diff --git a/include/linux/ata.h b/include/linux/ata.h
|
||||
index 0e6a782..d2992bf 100644
|
||||
--- a/include/linux/ata.h
|
||||
+++ b/include/linux/ata.h
|
||||
@@ -528,8 +528,6 @@ struct ata_bmdma_prd {
|
||||
#define ata_id_cdb_intr(id) (((id)[ATA_ID_CONFIG] & 0x60) == 0x20)
|
||||
#define ata_id_has_da(id) ((id)[ATA_ID_SATA_CAPABILITY_2] & (1 << 4))
|
||||
#define ata_id_has_devslp(id) ((id)[ATA_ID_FEATURE_SUPP] & (1 << 8))
|
||||
-#define ata_id_has_ncq_autosense(id) \
|
||||
- ((id)[ATA_ID_FEATURE_SUPP] & (1 << 7))
|
||||
|
||||
static inline bool ata_id_has_hipm(const u16 *id)
|
||||
{
|
||||
--
|
||||
2.4.5
|
||||
|
||||
-212
@@ -1,212 +0,0 @@
|
||||
From 84ded2f8e7dda336fc2fb3570726ceb3b3b3590f Mon Sep 17 00:00:00 2001
|
||||
From: Tejun Heo <tj@kernel.org>
|
||||
Date: Mon, 3 Aug 2015 11:45:34 -0400
|
||||
Subject: [PATCH] Revert "libata: Implement support for sense data reporting"
|
||||
|
||||
This reverts commit fe7173c206de63fc28475ee6ae42ff95c05692de.
|
||||
|
||||
As implemented, ACS-4 sense reporting for ATA devices bypasses error
|
||||
diagnosis and handling in libata degrading EH behavior significantly.
|
||||
Revert the related changes for now.
|
||||
|
||||
ATA_ID_COMMAND_SET_3/4 constants are not reverted as they're used by
|
||||
later changes.
|
||||
|
||||
Signed-off-by: Tejun Heo <tj@kernel.org>
|
||||
Cc: Hannes Reinecke <hare@suse.de>
|
||||
Cc: stable@vger.kernel.org #v4.1+
|
||||
---
|
||||
drivers/ata/libata-core.c | 20 +----------
|
||||
drivers/ata/libata-eh.c | 86 ++---------------------------------------------
|
||||
include/linux/ata.h | 16 ---------
|
||||
3 files changed, 4 insertions(+), 118 deletions(-)
|
||||
|
||||
diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c
|
||||
index 426bc12..19bcb80 100644
|
||||
--- a/drivers/ata/libata-core.c
|
||||
+++ b/drivers/ata/libata-core.c
|
||||
@@ -2147,24 +2147,6 @@ static int ata_dev_config_ncq(struct ata_device *dev,
|
||||
return 0;
|
||||
}
|
||||
|
||||
-static void ata_dev_config_sense_reporting(struct ata_device *dev)
|
||||
-{
|
||||
- unsigned int err_mask;
|
||||
-
|
||||
- if (!ata_id_has_sense_reporting(dev->id))
|
||||
- return;
|
||||
-
|
||||
- if (ata_id_sense_reporting_enabled(dev->id))
|
||||
- return;
|
||||
-
|
||||
- err_mask = ata_dev_set_feature(dev, SETFEATURE_SENSE_DATA, 0x1);
|
||||
- if (err_mask) {
|
||||
- ata_dev_dbg(dev,
|
||||
- "failed to enable Sense Data Reporting, Emask 0x%x\n",
|
||||
- err_mask);
|
||||
- }
|
||||
-}
|
||||
-
|
||||
/**
|
||||
* ata_dev_configure - Configure the specified ATA/ATAPI device
|
||||
* @dev: Target device to configure
|
||||
@@ -2387,7 +2369,7 @@ int ata_dev_configure(struct ata_device *dev)
|
||||
dev->devslp_timing[i] = sata_setting[j];
|
||||
}
|
||||
}
|
||||
- ata_dev_config_sense_reporting(dev);
|
||||
+
|
||||
dev->cdb_len = 16;
|
||||
}
|
||||
|
||||
diff --git a/drivers/ata/libata-eh.c b/drivers/ata/libata-eh.c
|
||||
index af08d32..16125be 100644
|
||||
--- a/drivers/ata/libata-eh.c
|
||||
+++ b/drivers/ata/libata-eh.c
|
||||
@@ -1630,70 +1630,6 @@ unsigned int atapi_eh_tur(struct ata_device *dev, u8 *r_sense_key)
|
||||
}
|
||||
|
||||
/**
|
||||
- * ata_eh_request_sense - perform REQUEST_SENSE_DATA_EXT
|
||||
- * @dev: device to perform REQUEST_SENSE_SENSE_DATA_EXT to
|
||||
- * @sense_buf: result sense data buffer (SCSI_SENSE_BUFFERSIZE bytes long)
|
||||
- * @dfl_sense_key: default sense key to use
|
||||
- *
|
||||
- * Perform REQUEST_SENSE_DATA_EXT after the device reported CHECK
|
||||
- * SENSE. This function is EH helper.
|
||||
- *
|
||||
- * LOCKING:
|
||||
- * Kernel thread context (may sleep).
|
||||
- *
|
||||
- * RETURNS:
|
||||
- * encoded sense data on success, 0 on failure or if sense data
|
||||
- * is not available.
|
||||
- */
|
||||
-static u32 ata_eh_request_sense(struct ata_queued_cmd *qc,
|
||||
- struct scsi_cmnd *cmd)
|
||||
-{
|
||||
- struct ata_device *dev = qc->dev;
|
||||
- struct ata_taskfile tf;
|
||||
- unsigned int err_mask;
|
||||
-
|
||||
- if (!cmd)
|
||||
- return 0;
|
||||
-
|
||||
- DPRINTK("ATA request sense\n");
|
||||
- ata_dev_warn(dev, "request sense\n");
|
||||
- if (!ata_id_sense_reporting_enabled(dev->id)) {
|
||||
- ata_dev_warn(qc->dev, "sense data reporting disabled\n");
|
||||
- return 0;
|
||||
- }
|
||||
- ata_tf_init(dev, &tf);
|
||||
-
|
||||
- tf.flags |= ATA_TFLAG_ISADDR | ATA_TFLAG_DEVICE;
|
||||
- tf.flags |= ATA_TFLAG_LBA | ATA_TFLAG_LBA48;
|
||||
- tf.command = ATA_CMD_REQ_SENSE_DATA;
|
||||
- tf.protocol = ATA_PROT_NODATA;
|
||||
-
|
||||
- err_mask = ata_exec_internal(dev, &tf, NULL, DMA_NONE, NULL, 0, 0);
|
||||
- /*
|
||||
- * ACS-4 states:
|
||||
- * The device may set the SENSE DATA AVAILABLE bit to one in the
|
||||
- * STATUS field and clear the ERROR bit to zero in the STATUS field
|
||||
- * to indicate that the command returned completion without an error
|
||||
- * and the sense data described in table 306 is available.
|
||||
- *
|
||||
- * IOW the 'ATA_SENSE' bit might not be set even though valid
|
||||
- * sense data is available.
|
||||
- * So check for both.
|
||||
- */
|
||||
- if ((tf.command & ATA_SENSE) ||
|
||||
- tf.lbah != 0 || tf.lbam != 0 || tf.lbal != 0) {
|
||||
- ata_scsi_set_sense(cmd, tf.lbah, tf.lbam, tf.lbal);
|
||||
- qc->flags |= ATA_QCFLAG_SENSE_VALID;
|
||||
- ata_dev_warn(dev, "sense data %02x/%02x/%02x\n",
|
||||
- tf.lbah, tf.lbam, tf.lbal);
|
||||
- } else {
|
||||
- ata_dev_warn(dev, "request sense failed stat %02x emask %x\n",
|
||||
- tf.command, err_mask);
|
||||
- }
|
||||
- return err_mask;
|
||||
-}
|
||||
-
|
||||
-/**
|
||||
* atapi_eh_request_sense - perform ATAPI REQUEST_SENSE
|
||||
* @dev: device to perform REQUEST_SENSE to
|
||||
* @sense_buf: result sense data buffer (SCSI_SENSE_BUFFERSIZE bytes long)
|
||||
@@ -1896,22 +1832,7 @@ static unsigned int ata_eh_analyze_tf(struct ata_queued_cmd *qc,
|
||||
return ATA_EH_RESET;
|
||||
}
|
||||
|
||||
- /*
|
||||
- * Sense data reporting does not work if the
|
||||
- * device fault bit is set.
|
||||
- */
|
||||
- if ((stat & ATA_SENSE) && !(stat & ATA_DF) &&
|
||||
- !(qc->flags & ATA_QCFLAG_SENSE_VALID)) {
|
||||
- if (!(qc->ap->pflags & ATA_PFLAG_FROZEN)) {
|
||||
- tmp = ata_eh_request_sense(qc, qc->scsicmd);
|
||||
- if (tmp)
|
||||
- qc->err_mask |= tmp;
|
||||
- } else {
|
||||
- ata_dev_warn(qc->dev, "sense data available but port frozen\n");
|
||||
- }
|
||||
- }
|
||||
-
|
||||
- /* Set by NCQ autosense or request sense above */
|
||||
+ /* Set by NCQ autosense */
|
||||
if (qc->flags & ATA_QCFLAG_SENSE_VALID)
|
||||
return 0;
|
||||
|
||||
@@ -2658,15 +2579,14 @@ static void ata_eh_link_report(struct ata_link *link)
|
||||
|
||||
#ifdef CONFIG_ATA_VERBOSE_ERROR
|
||||
if (res->command & (ATA_BUSY | ATA_DRDY | ATA_DF | ATA_DRQ |
|
||||
- ATA_SENSE | ATA_ERR)) {
|
||||
+ ATA_ERR)) {
|
||||
if (res->command & ATA_BUSY)
|
||||
ata_dev_err(qc->dev, "status: { Busy }\n");
|
||||
else
|
||||
- ata_dev_err(qc->dev, "status: { %s%s%s%s%s}\n",
|
||||
+ ata_dev_err(qc->dev, "status: { %s%s%s%s}\n",
|
||||
res->command & ATA_DRDY ? "DRDY " : "",
|
||||
res->command & ATA_DF ? "DF " : "",
|
||||
res->command & ATA_DRQ ? "DRQ " : "",
|
||||
- res->command & ATA_SENSE ? "SENSE " : "",
|
||||
res->command & ATA_ERR ? "ERR " : "");
|
||||
}
|
||||
|
||||
diff --git a/include/linux/ata.h b/include/linux/ata.h
|
||||
index 6c78956..0e6a782 100644
|
||||
--- a/include/linux/ata.h
|
||||
+++ b/include/linux/ata.h
|
||||
@@ -385,8 +385,6 @@ enum {
|
||||
SATA_SSP = 0x06, /* Software Settings Preservation */
|
||||
SATA_DEVSLP = 0x09, /* Device Sleep */
|
||||
|
||||
- SETFEATURE_SENSE_DATA = 0xC3, /* Sense Data Reporting feature */
|
||||
-
|
||||
/* feature values for SET_MAX */
|
||||
ATA_SET_MAX_ADDR = 0x00,
|
||||
ATA_SET_MAX_PASSWD = 0x01,
|
||||
@@ -710,20 +708,6 @@ static inline bool ata_id_has_read_log_d
|
||||
return id[ATA_ID_COMMAND_SET_3] & (1 << 3);
|
||||
}
|
||||
|
||||
-static inline bool ata_id_has_sense_reporting(const u16 *id)
|
||||
-{
|
||||
- if (!(id[ATA_ID_CFS_ENABLE_2] & (1 << 15)))
|
||||
- return false;
|
||||
- return id[ATA_ID_COMMAND_SET_3] & (1 << 6);
|
||||
-}
|
||||
-
|
||||
-static inline bool ata_id_sense_reporting_enabled(const u16 *id)
|
||||
-{
|
||||
- if (!(id[ATA_ID_CFS_ENABLE_2] & (1 << 15)))
|
||||
- return false;
|
||||
- return id[ATA_ID_COMMAND_SET_4] & (1 << 6);
|
||||
-}
|
||||
-
|
||||
/**
|
||||
* ata_id_major_version - get ATA level of drive
|
||||
* @id: Identify data
|
||||
-169
@@ -1,169 +0,0 @@
|
||||
From fe16d4f202c59a560533a223bc6375739ee30944 Mon Sep 17 00:00:00 2001
|
||||
From: Tejun Heo <tj@kernel.org>
|
||||
Date: Mon, 3 Aug 2015 11:41:33 -0400
|
||||
Subject: [PATCH] Revert "libata-eh: Set 'information' field for autosense"
|
||||
|
||||
This reverts commit a1524f226a02aa6edebd90ae0752e97cfd78b159.
|
||||
|
||||
As implemented, ACS-4 sense reporting for ATA devices bypasses error
|
||||
diagnosis and handling in libata degrading EH behavior significantly.
|
||||
Revert the related changes for now.
|
||||
|
||||
Signed-off-by: Tejun Heo <tj@kernel.org>
|
||||
Cc: Hannes Reinecke <hare@suse.de>
|
||||
Cc: stable@vger.kernel.org #v4.1+
|
||||
---
|
||||
drivers/ata/libata-core.c | 4 ++--
|
||||
drivers/ata/libata-eh.c | 3 ---
|
||||
drivers/ata/libata-scsi.c | 12 ------------
|
||||
drivers/ata/libata.h | 5 +----
|
||||
drivers/scsi/scsi_error.c | 31 -------------------------------
|
||||
include/scsi/scsi_eh.h | 1 -
|
||||
6 files changed, 3 insertions(+), 53 deletions(-)
|
||||
|
||||
diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c
|
||||
index db5d9f7..426bc12 100644
|
||||
--- a/drivers/ata/libata-core.c
|
||||
+++ b/drivers/ata/libata-core.c
|
||||
@@ -694,11 +694,11 @@ static int ata_rwcmd_protocol(struct ata_taskfile *tf, struct ata_device *dev)
|
||||
* RETURNS:
|
||||
* Block address read from @tf.
|
||||
*/
|
||||
-u64 ata_tf_read_block(const struct ata_taskfile *tf, struct ata_device *dev)
|
||||
+u64 ata_tf_read_block(struct ata_taskfile *tf, struct ata_device *dev)
|
||||
{
|
||||
u64 block = 0;
|
||||
|
||||
- if (!dev || tf->flags & ATA_TFLAG_LBA) {
|
||||
+ if (tf->flags & ATA_TFLAG_LBA) {
|
||||
if (tf->flags & ATA_TFLAG_LBA48) {
|
||||
block |= (u64)tf->hob_lbah << 40;
|
||||
block |= (u64)tf->hob_lbam << 32;
|
||||
diff --git a/drivers/ata/libata-eh.c b/drivers/ata/libata-eh.c
|
||||
index 7465031..af08d32 100644
|
||||
--- a/drivers/ata/libata-eh.c
|
||||
+++ b/drivers/ata/libata-eh.c
|
||||
@@ -1864,7 +1864,6 @@ void ata_eh_analyze_ncq_error(struct ata_link *link)
|
||||
ata_dev_dbg(dev, "NCQ Autosense %02x/%02x/%02x\n",
|
||||
sense_key, asc, ascq);
|
||||
ata_scsi_set_sense(qc->scsicmd, sense_key, asc, ascq);
|
||||
- ata_scsi_set_sense_information(qc->scsicmd, &qc->result_tf);
|
||||
qc->flags |= ATA_QCFLAG_SENSE_VALID;
|
||||
}
|
||||
|
||||
@@ -1907,8 +1906,6 @@ static unsigned int ata_eh_analyze_tf(struct ata_queued_cmd *qc,
|
||||
tmp = ata_eh_request_sense(qc, qc->scsicmd);
|
||||
if (tmp)
|
||||
qc->err_mask |= tmp;
|
||||
- else
|
||||
- ata_scsi_set_sense_information(qc->scsicmd, tf);
|
||||
} else {
|
||||
ata_dev_warn(qc->dev, "sense data available but port frozen\n");
|
||||
}
|
||||
diff --git a/drivers/ata/libata-scsi.c b/drivers/ata/libata-scsi.c
|
||||
index 641a61a..e1ecd2a 100644
|
||||
--- a/drivers/ata/libata-scsi.c
|
||||
+++ b/drivers/ata/libata-scsi.c
|
||||
@@ -280,18 +280,6 @@ void ata_scsi_set_sense(struct scsi_cmnd *cmd, u8 sk, u8 asc, u8 ascq)
|
||||
scsi_build_sense_buffer(0, cmd->sense_buffer, sk, asc, ascq);
|
||||
}
|
||||
|
||||
-void ata_scsi_set_sense_information(struct scsi_cmnd *cmd,
|
||||
- const struct ata_taskfile *tf)
|
||||
-{
|
||||
- u64 information;
|
||||
-
|
||||
- if (!cmd)
|
||||
- return;
|
||||
-
|
||||
- information = ata_tf_read_block(tf, NULL);
|
||||
- scsi_set_sense_information(cmd->sense_buffer, information);
|
||||
-}
|
||||
-
|
||||
static ssize_t
|
||||
ata_scsi_em_message_store(struct device *dev, struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
diff --git a/drivers/ata/libata.h b/drivers/ata/libata.h
|
||||
index a998a17..8cfdd96 100644
|
||||
--- a/drivers/ata/libata.h
|
||||
+++ b/drivers/ata/libata.h
|
||||
@@ -67,8 +67,7 @@ extern struct ata_queued_cmd *ata_qc_new_init(struct ata_device *dev, int tag);
|
||||
extern int ata_build_rw_tf(struct ata_taskfile *tf, struct ata_device *dev,
|
||||
u64 block, u32 n_block, unsigned int tf_flags,
|
||||
unsigned int tag);
|
||||
-extern u64 ata_tf_read_block(const struct ata_taskfile *tf,
|
||||
- struct ata_device *dev);
|
||||
+extern u64 ata_tf_read_block(struct ata_taskfile *tf, struct ata_device *dev);
|
||||
extern unsigned ata_exec_internal(struct ata_device *dev,
|
||||
struct ata_taskfile *tf, const u8 *cdb,
|
||||
int dma_dir, void *buf, unsigned int buflen,
|
||||
@@ -139,8 +138,6 @@ extern int ata_scsi_add_hosts(struct ata_host *host,
|
||||
extern void ata_scsi_scan_host(struct ata_port *ap, int sync);
|
||||
extern int ata_scsi_offline_dev(struct ata_device *dev);
|
||||
extern void ata_scsi_set_sense(struct scsi_cmnd *cmd, u8 sk, u8 asc, u8 ascq);
|
||||
-extern void ata_scsi_set_sense_information(struct scsi_cmnd *cmd,
|
||||
- const struct ata_taskfile *tf);
|
||||
extern void ata_scsi_media_change_notify(struct ata_device *dev);
|
||||
extern void ata_scsi_hotplug(struct work_struct *work);
|
||||
extern void ata_schedule_scsi_eh(struct Scsi_Host *shost);
|
||||
diff --git a/drivers/scsi/scsi_error.c b/drivers/scsi/scsi_error.c
|
||||
index 106884a..b79bbea 100644
|
||||
--- a/drivers/scsi/scsi_error.c
|
||||
+++ b/drivers/scsi/scsi_error.c
|
||||
@@ -26,7 +26,6 @@
|
||||
#include <linux/blkdev.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/jiffies.h>
|
||||
-#include <asm/unaligned.h>
|
||||
|
||||
#include <scsi/scsi.h>
|
||||
#include <scsi/scsi_cmnd.h>
|
||||
@@ -2523,33 +2522,3 @@ void scsi_build_sense_buffer(int desc, u8 *buf, u8 key, u8 asc, u8 ascq)
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL(scsi_build_sense_buffer);
|
||||
-
|
||||
-/**
|
||||
- * scsi_set_sense_information - set the information field in a
|
||||
- * formatted sense data buffer
|
||||
- * @buf: Where to build sense data
|
||||
- * @info: 64-bit information value to be set
|
||||
- *
|
||||
- **/
|
||||
-void scsi_set_sense_information(u8 *buf, u64 info)
|
||||
-{
|
||||
- if ((buf[0] & 0x7f) == 0x72) {
|
||||
- u8 *ucp, len;
|
||||
-
|
||||
- len = buf[7];
|
||||
- ucp = (char *)scsi_sense_desc_find(buf, len + 8, 0);
|
||||
- if (!ucp) {
|
||||
- buf[7] = len + 0xa;
|
||||
- ucp = buf + 8 + len;
|
||||
- }
|
||||
- ucp[0] = 0;
|
||||
- ucp[1] = 0xa;
|
||||
- ucp[2] = 0x80; /* Valid bit */
|
||||
- ucp[3] = 0;
|
||||
- put_unaligned_be64(info, &ucp[4]);
|
||||
- } else if ((buf[0] & 0x7f) == 0x70) {
|
||||
- buf[0] |= 0x80;
|
||||
- put_unaligned_be64(info, &buf[3]);
|
||||
- }
|
||||
-}
|
||||
-EXPORT_SYMBOL(scsi_set_sense_information);
|
||||
diff --git a/include/scsi/scsi_eh.h b/include/scsi/scsi_eh.h
|
||||
index 4942710..8d1d7fa 100644
|
||||
--- a/include/scsi/scsi_eh.h
|
||||
+++ b/include/scsi/scsi_eh.h
|
||||
@@ -28,7 +28,6 @@ extern int scsi_get_sense_info_fld(const u8 * sense_buffer, int sb_len,
|
||||
u64 * info_out);
|
||||
|
||||
extern void scsi_build_sense_buffer(int desc, u8 *buf, u8 key, u8 asc, u8 ascq);
|
||||
-extern void scsi_set_sense_information(u8 *buf, u64 info);
|
||||
|
||||
extern int scsi_ioctl_reset(struct scsi_device *, int __user *);
|
||||
|
||||
--
|
||||
2.4.5
|
||||
|
||||
@@ -1,29 +0,0 @@
|
||||
|
||||
Fix broken async_suspend
|
||||
|
||||
https://bugzilla.kernel.org/show_bug.cgi?id=81551
|
||||
|
||||
--- a/drivers/pci/quirks.c
|
||||
+++ a/drivers/pci/quirks.c
|
||||
@@ -29,6 +29,21 @@
|
||||
#include "pci.h"
|
||||
|
||||
/*
|
||||
+ * For JMicron chips, we need to disable the async_suspend method, otherwise
|
||||
+ * they will hit the power-on issue when doing device resume, add one quick
|
||||
+ * solution to disable the async_suspend method.
|
||||
+ */
|
||||
+static void pci_async_suspend_fixup(struct pci_dev *pdev)
|
||||
+{
|
||||
+ /*
|
||||
+ * disabling the async_suspend method for JMicron chips to
|
||||
+ * avoid device resuming issue.
|
||||
+ */
|
||||
+ device_disable_async_suspend(&pdev->dev);
|
||||
+}
|
||||
+DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_JMICRON, PCI_ANY_ID, pci_async_suspend_fixup);
|
||||
+
|
||||
+/*
|
||||
* Decoding should be disabled for a PCI device during BAR sizing to avoid
|
||||
* conflict. But doing so may cause problems on host bridge and perhaps other
|
||||
* key system devices. For devices that need to have mmio decoding always-on,
|
||||
-68
@@ -1,68 +0,0 @@
|
||||
|
||||
This patch reverts:
|
||||
|
||||
From e6b7e41cdd8cae0591e04d9519b65470110e2d44 Mon Sep 17 00:00:00 2001
|
||||
From: Chuansheng Liu <chuansheng.liu@intel.com>
|
||||
Date: Mon, 1 Sep 2014 08:38:03 +0800
|
||||
Subject: [PATCH] ata: Disabling the async PM for JMicron chip 363/361
|
||||
|
||||
|
||||
in favour of the pci quirks based patch:
|
||||
https://bugzilla.kernel.org/show_bug.cgi?id=81551
|
||||
|
||||
Signed-off-by: Thomas Backlund <tmb@mageia.org>
|
||||
|
||||
---
|
||||
drivers/ata/ahci.c | 12 ------------
|
||||
drivers/ata/pata_jmicron.c | 12 ------------
|
||||
2 files changed, 24 deletions(-)
|
||||
|
||||
diff --git b/drivers/ata/ahci.c a/drivers/ata/ahci.c
|
||||
index f7da21b..bca3d64 100644
|
||||
--- b/drivers/ata/ahci.c
|
||||
+++ a/drivers/ata/ahci.c
|
||||
@@ -1337,18 +1337,6 @@ static int ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
|
||||
else if (pdev->vendor == 0x1c44 && pdev->device == 0x8000)
|
||||
ahci_pci_bar = AHCI_PCI_BAR_ENMOTUS;
|
||||
|
||||
- /*
|
||||
- * The JMicron chip 361/363 contains one SATA controller and one
|
||||
- * PATA controller,for powering on these both controllers, we must
|
||||
- * follow the sequence one by one, otherwise one of them can not be
|
||||
- * powered on successfully, so here we disable the async suspend
|
||||
- * method for these chips.
|
||||
- */
|
||||
- if (pdev->vendor == PCI_VENDOR_ID_JMICRON &&
|
||||
- (pdev->device == PCI_DEVICE_ID_JMICRON_JMB363 ||
|
||||
- pdev->device == PCI_DEVICE_ID_JMICRON_JMB361))
|
||||
- device_disable_async_suspend(&pdev->dev);
|
||||
-
|
||||
/* acquire resources */
|
||||
rc = pcim_enable_device(pdev);
|
||||
if (rc)
|
||||
diff --git b/drivers/ata/pata_jmicron.c a/drivers/ata/pata_jmicron.c
|
||||
index 47e418b..4d1a5d2 100644
|
||||
--- b/drivers/ata/pata_jmicron.c
|
||||
+++ a/drivers/ata/pata_jmicron.c
|
||||
@@ -143,18 +143,6 @@ static int jmicron_init_one (struct pci_dev *pdev, const struct pci_device_id *i
|
||||
};
|
||||
const struct ata_port_info *ppi[] = { &info, NULL };
|
||||
|
||||
- /*
|
||||
- * The JMicron chip 361/363 contains one SATA controller and one
|
||||
- * PATA controller,for powering on these both controllers, we must
|
||||
- * follow the sequence one by one, otherwise one of them can not be
|
||||
- * powered on successfully, so here we disable the async suspend
|
||||
- * method for these chips.
|
||||
- */
|
||||
- if (pdev->vendor == PCI_VENDOR_ID_JMICRON &&
|
||||
- (pdev->device == PCI_DEVICE_ID_JMICRON_JMB363 ||
|
||||
- pdev->device == PCI_DEVICE_ID_JMICRON_JMB361))
|
||||
- device_disable_async_suspend(&pdev->dev);
|
||||
-
|
||||
return ata_pci_bmdma_init_one(pdev, ppi, &jmicron_sht, NULL, 0);
|
||||
}
|
||||
|
||||
--
|
||||
1.8.5.6
|
||||
|
||||
@@ -1,81 +0,0 @@
|
||||
From ed63baaf849e91c84ac3e042b1fd6a0af07c16f3 Mon Sep 17 00:00:00 2001
|
||||
From: "Thulasimani,Sivakumar" <sivakumar.thulasimani@intel.com>
|
||||
Date: Tue, 18 Aug 2015 15:30:37 +0530
|
||||
Subject: [PATCH] drm/i915: Avoid TP3 on CHV
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
This patch removes TP3 support on CHV since there is no support
|
||||
for HBR2 on this platform.
|
||||
|
||||
v2: rename the function to indicate it checks source rates (Jani)
|
||||
v3: update comment to indicate TP3 dependency on HBR2 supported
|
||||
hardware (Jani)
|
||||
|
||||
Cc: stable@vger.kernel.org # v4.1+
|
||||
Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
|
||||
Signed-off-by: Sivakumar Thulasimani <sivakumar.thulasimani@intel.com>
|
||||
[Jani: fixed a couple of checkpatch warnings.]
|
||||
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
|
||||
|
||||
diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c
|
||||
index 7ad0e0b..1df0e1f 100644
|
||||
--- a/drivers/gpu/drm/i915/intel_dp.c
|
||||
+++ b/drivers/gpu/drm/i915/intel_dp.c
|
||||
@@ -1166,6 +1166,19 @@ intel_dp_sink_rates(struct intel_dp *intel_dp, const int **sink_rates)
|
||||
return (intel_dp_max_link_bw(intel_dp) >> 3) + 1;
|
||||
}
|
||||
|
||||
+static bool intel_dp_source_supports_hbr2(struct drm_device *dev)
|
||||
+{
|
||||
+ /* WaDisableHBR2:skl */
|
||||
+ if (IS_SKYLAKE(dev) && INTEL_REVID(dev) <= SKL_REVID_B0)
|
||||
+ return false;
|
||||
+
|
||||
+ if ((IS_HASWELL(dev) && !IS_HSW_ULX(dev)) || IS_BROADWELL(dev) ||
|
||||
+ (INTEL_INFO(dev)->gen >= 9))
|
||||
+ return true;
|
||||
+ else
|
||||
+ return false;
|
||||
+}
|
||||
+
|
||||
static int
|
||||
intel_dp_source_rates(struct drm_device *dev, const int **source_rates)
|
||||
{
|
||||
@@ -1176,12 +1189,8 @@ intel_dp_source_rates(struct drm_device *dev, const int **source_rates)
|
||||
|
||||
*source_rates = default_rates;
|
||||
|
||||
- /* WaDisableHBR2:skl */
|
||||
- if (IS_SKYLAKE(dev) && INTEL_REVID(dev) <= SKL_REVID_B0)
|
||||
- return (DP_LINK_BW_2_7 >> 3) + 1;
|
||||
-
|
||||
- if ((IS_HASWELL(dev) && !IS_HSW_ULX(dev)) || IS_BROADWELL(dev) ||
|
||||
- (INTEL_INFO(dev)->gen >= 9))
|
||||
+ /* This depends on the fact that 5.4 is last value in the array */
|
||||
+ if (intel_dp_source_supports_hbr2(dev))
|
||||
return (DP_LINK_BW_5_4 >> 3) + 1;
|
||||
else
|
||||
return (DP_LINK_BW_2_7 >> 3) + 1;
|
||||
@@ -3936,10 +3945,15 @@ intel_dp_get_dpcd(struct intel_dp *intel_dp)
|
||||
}
|
||||
}
|
||||
|
||||
- /* Training Pattern 3 support, both source and sink */
|
||||
+ /* Training Pattern 3 support, Intel platforms that support HBR2 alone
|
||||
+ * have support for TP3 hence that check is used along with dpcd check
|
||||
+ * to ensure TP3 can be enabled.
|
||||
+ * SKL < B0: due it's WaDisableHBR2 is the only exception where TP3 is
|
||||
+ * supported but still not enabled.
|
||||
+ */
|
||||
if (intel_dp->dpcd[DP_DPCD_REV] >= 0x12 &&
|
||||
intel_dp->dpcd[DP_MAX_LANE_COUNT] & DP_TPS3_SUPPORTED &&
|
||||
- (IS_HASWELL(dev_priv) || INTEL_INFO(dev_priv)->gen >= 8)) {
|
||||
+ intel_dp_source_supports_hbr2(dev)) {
|
||||
intel_dp->use_tps3 = true;
|
||||
DRM_DEBUG_KMS("Displayport TPS3 supported\n");
|
||||
} else
|
||||
--
|
||||
2.4.5
|
||||
|
||||
-44
@@ -1,44 +0,0 @@
|
||||
From 5e86dfe39f54ab13fd8079ac3d6cb100318909a3 Mon Sep 17 00:00:00 2001
|
||||
From: "Thulasimani,Sivakumar" <sivakumar.thulasimani@intel.com>
|
||||
Date: Tue, 18 Aug 2015 11:07:57 +0530
|
||||
Subject: [PATCH] drm/i915: remove HBR2 from chv supported list
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
This patch removes 5.4Gbps from supported link rate for CHV since
|
||||
it is not supported in it.
|
||||
|
||||
v2: change the ordering for better readability (Ville)
|
||||
|
||||
Cc: stable@vger.kernel.org # v4.1+
|
||||
Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
|
||||
Signed-off-by: Sivakumar Thulasimani <sivakumar.thulasimani@intel.com>
|
||||
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
|
||||
---
|
||||
drivers/gpu/drm/i915/intel_dp.c | 7 ++++---
|
||||
1 file changed, 4 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c
|
||||
index 6c8bf34..7ad0e0b 100644
|
||||
--- a/drivers/gpu/drm/i915/intel_dp.c
|
||||
+++ b/drivers/gpu/drm/i915/intel_dp.c
|
||||
@@ -1176,11 +1176,12 @@ intel_dp_source_rates(struct drm_device *dev, const int **source_rates)
|
||||
|
||||
*source_rates = default_rates;
|
||||
|
||||
+ /* WaDisableHBR2:skl */
|
||||
if (IS_SKYLAKE(dev) && INTEL_REVID(dev) <= SKL_REVID_B0)
|
||||
- /* WaDisableHBR2:skl */
|
||||
return (DP_LINK_BW_2_7 >> 3) + 1;
|
||||
- else if (INTEL_INFO(dev)->gen >= 8 ||
|
||||
- (IS_HASWELL(dev) && !IS_HSW_ULX(dev)))
|
||||
+
|
||||
+ if ((IS_HASWELL(dev) && !IS_HSW_ULX(dev)) || IS_BROADWELL(dev) ||
|
||||
+ (INTEL_INFO(dev)->gen >= 9))
|
||||
return (DP_LINK_BW_5_4 >> 3) + 1;
|
||||
else
|
||||
return (DP_LINK_BW_2_7 >> 3) + 1;
|
||||
--
|
||||
2.4.5
|
||||
|
||||
+74
@@ -0,0 +1,74 @@
|
||||
SCSI: Fix NULL pointer dereference in RTPM of block layer
|
||||
|
||||
The routines in scsi_pm.c assume that if a runtime-PM callback is
|
||||
invoked for a SCSI device, it can only mean that the device's driver
|
||||
has asked the block layer to handle the runtime power management (by
|
||||
calling blk_pm_runtime_init(), which among other things sets q->dev).
|
||||
|
||||
However, this assumption turns out to be wrong for things like the ses
|
||||
driver. Normally ses devices are not allowed to do runtime PM, but
|
||||
userspace can override this setting. If this happens, the kernel gets
|
||||
a NULL pointer dereference when blk_post_runtime_resume() tries to use
|
||||
the uninitialized q->dev pointer.
|
||||
|
||||
This patch fixes the problem by checking q->dev in block layer before
|
||||
handle runtime PM. Since ses doesn't define any PM callbacks and call
|
||||
blk_pm_runtime_init(), the crash won't occur.
|
||||
|
||||
This fixes Bugzilla #101371.
|
||||
https://bugzilla.kernel.org/show_bug.cgi?id=101371
|
||||
|
||||
Signed-off-by: Ken Xue <Ken.Xue@amd.com>
|
||||
Acked-by: Alan Stern <stern@rowland.harvard.edu>
|
||||
Cc: stable@vger.kernel.org
|
||||
|
||||
---
|
||||
block/blk-core.c | 12 ++++++++++++
|
||||
1 file changed, 12 insertions(+)
|
||||
|
||||
diff --git a/block/blk-core.c b/block/blk-core.c
|
||||
index 60912e9..a07ab18 100644
|
||||
--- a/block/blk-core.c
|
||||
+++ b/block/blk-core.c
|
||||
@@ -3280,6 +3280,9 @@ int blk_pre_runtime_suspend(struct request_queue *q)
|
||||
{
|
||||
int ret = 0;
|
||||
|
||||
+ if (!q->dev)
|
||||
+ return ret;
|
||||
+
|
||||
spin_lock_irq(q->queue_lock);
|
||||
if (q->nr_pending) {
|
||||
ret = -EBUSY;
|
||||
@@ -3307,6 +3310,9 @@ EXPORT_SYMBOL(blk_pre_runtime_suspend);
|
||||
*/
|
||||
void blk_post_runtime_suspend(struct request_queue *q, int err)
|
||||
{
|
||||
+ if (!q->dev)
|
||||
+ return;
|
||||
+
|
||||
spin_lock_irq(q->queue_lock);
|
||||
if (!err) {
|
||||
q->rpm_status = RPM_SUSPENDED;
|
||||
@@ -3331,6 +3337,9 @@ EXPORT_SYMBOL(blk_post_runtime_suspend);
|
||||
*/
|
||||
void blk_pre_runtime_resume(struct request_queue *q)
|
||||
{
|
||||
+ if (!q->dev)
|
||||
+ return;
|
||||
+
|
||||
spin_lock_irq(q->queue_lock);
|
||||
q->rpm_status = RPM_RESUMING;
|
||||
spin_unlock_irq(q->queue_lock);
|
||||
@@ -3353,6 +3362,9 @@ EXPORT_SYMBOL(blk_pre_runtime_resume);
|
||||
*/
|
||||
void blk_post_runtime_resume(struct request_queue *q, int err)
|
||||
{
|
||||
+ if (!q->dev)
|
||||
+ return;
|
||||
+
|
||||
spin_lock_irq(q->queue_lock);
|
||||
if (!err) {
|
||||
q->rpm_status = RPM_ACTIVE;
|
||||
--
|
||||
1.9.1
|
||||
+64
@@ -0,0 +1,64 @@
|
||||
Revert "SCSI: Fix NULL pointer dereference in runtime PM"
|
||||
|
||||
This reverts commit 49718f0fb8c9 ("SCSI: Fix NULL pointer dereference in
|
||||
runtime PM")
|
||||
|
||||
The old commit may lead to a issue that blk_{pre|post}_runtime_suspend and
|
||||
blk_{pre|post}_runtime_resume can not be called in pairs.
|
||||
|
||||
Take sr device as example, when sr device goes to runtime suspend,
|
||||
blk_{pre|post}_runtime_suspend will be called since sr device defined
|
||||
pm->runtime_suspend. But blk_{pre|post}_runtime_resume will not be called
|
||||
since sr device doesn't have pm->runtime_resume. Then sr device can not
|
||||
resume correctly anymore.
|
||||
|
||||
Signed-off-by: Ken Xue <Ken.Xue@amd.com>
|
||||
Acked-by: Alan Stern <stern@rowland.harvard.edu>
|
||||
Cc: stable@vger.kernel.org
|
||||
|
||||
---
|
||||
drivers/scsi/scsi_pm.c | 20 ++++++++++----------
|
||||
1 file changed, 10 insertions(+), 10 deletions(-)
|
||||
|
||||
diff --git a/drivers/scsi/scsi_pm.c b/drivers/scsi/scsi_pm.c
|
||||
index e4b7998..459abe1 100644
|
||||
--- a/drivers/scsi/scsi_pm.c
|
||||
+++ b/drivers/scsi/scsi_pm.c
|
||||
@@ -219,13 +219,13 @@ static int sdev_runtime_suspend(struct device *dev)
|
||||
struct scsi_device *sdev = to_scsi_device(dev);
|
||||
int err = 0;
|
||||
|
||||
- if (pm && pm->runtime_suspend) {
|
||||
- err = blk_pre_runtime_suspend(sdev->request_queue);
|
||||
- if (err)
|
||||
- return err;
|
||||
+ err = blk_pre_runtime_suspend(sdev->request_queue);
|
||||
+ if (err)
|
||||
+ return err;
|
||||
+ if (pm && pm->runtime_suspend)
|
||||
err = pm->runtime_suspend(dev);
|
||||
- blk_post_runtime_suspend(sdev->request_queue, err);
|
||||
- }
|
||||
+ blk_post_runtime_suspend(sdev->request_queue, err);
|
||||
+
|
||||
return err;
|
||||
}
|
||||
|
||||
@@ -248,11 +248,11 @@ static int sdev_runtime_resume(struct device *dev)
|
||||
const struct dev_pm_ops *pm = dev->driver ? dev->driver->pm : NULL;
|
||||
int err = 0;
|
||||
|
||||
- if (pm && pm->runtime_resume) {
|
||||
- blk_pre_runtime_resume(sdev->request_queue);
|
||||
+ blk_pre_runtime_resume(sdev->request_queue);
|
||||
+ if (pm && pm->runtime_resume)
|
||||
err = pm->runtime_resume(dev);
|
||||
- blk_post_runtime_resume(sdev->request_queue, err);
|
||||
- }
|
||||
+ blk_post_runtime_resume(sdev->request_queue, err);
|
||||
+
|
||||
return err;
|
||||
}
|
||||
|
||||
--
|
||||
1.9.1
|
||||
@@ -14,33 +14,72 @@
|
||||
###
|
||||
### Stable Queue
|
||||
###
|
||||
stable-ipc-sem-fix-use-after-free-on-ipc_rmid-after-a-task-using-same-semaphore-set-exits.patch
|
||||
stable-ipc-sem.c-update-correct-memory-barriers.patch
|
||||
stable-mm-hwpoison-fix-page-refcount-of-unknown-non-lru-page.patch
|
||||
stable-mm-hwpoison-fix-fail-isolate-hugetlbfs-page-w-refcount-held.patch
|
||||
stable-clk-pxa-pxa3xx-fix-cken-register-access.patch
|
||||
stable-xen-blkfront-don-t-add-indirect-pages-to-list-when.patch
|
||||
stable-xen-blkback-replace-work_pending-with-work_busy-in-purge_persistent_gnt.patch
|
||||
stable-rsi-fix-failure-to-load-firmware-after-memory-leak-fix-and-fix-the-leak.patch
|
||||
stable-perf-fix-fasync-handling-on-inherited-events.patch
|
||||
stable-perf-fix-running-time-accounting.patch
|
||||
stable-perf-fix-double-free-of-the-aux-buffer.patch
|
||||
stable-perf-fix-perf_event_ioc_period-migration-race.patch
|
||||
stable-iwlwifi-pcie-fix-prepare-card-flow.patch
|
||||
stable-rtlwifi-rtl8723be-add-module-parameter-for-msi-interrupts.patch
|
||||
stable-rtlwifi-fix-null-dereference-when-pci-driver-used-as-an-ap.patch
|
||||
stable-x86-xen-build-xen-pv-apic-driver-for-domu-as-well.patch
|
||||
stable-xen-xenbus-don-t-leak-memory-when-unmapping-the-ring-on-hvm-backend.patch
|
||||
stable-dm-thin-metadata-delete-btrees-when-releasing-metadata-snapshot.patch
|
||||
stable-localmodconfig-use-kbuild-files-too.patch
|
||||
stable-edac-ppc4xx-access-mci-csrows-array-elements-properly.patch
|
||||
stable-hid-hid-input-fix-accessing-freed-memory-during-device-disconnect.patch
|
||||
stable-hid-uclogic-fix-limit-in-uclogic_tablet_enable.patch
|
||||
stable-drm-radeon-add-new-oland-pci-id.patch
|
||||
stable-drm-vmwgfx-fix-execbuf-locking-issues.patch
|
||||
|
||||
# DaveM
|
||||
stable-net_41.mbox.patch
|
||||
stable-x86-ldt-make-modify_ldt-synchronous.patch
|
||||
stable-x86-ldt-correct-ldt-access-in-single-stepping-logic.patch
|
||||
stable-x86-ldt-correct-fpu-emulation-access-to-ldt.patch
|
||||
stable-x86-ldt-further-fix-fpu-emulation.patch
|
||||
stable-drm-radeon-don-t-link-train-displayport-on-hpd-until-we-get-the-dpcd.patch
|
||||
stable-drm-i915-apply-the-pci_d0-d3-hibernation-workaround-everywhere-on-pre-gen6.patch
|
||||
stable-drm-i915-check-dp-link-status-on-long-hpd-too.patch
|
||||
stable-drm-radeon-atom-send-out-the-full-aux-address.patch
|
||||
stable-drm-radeon-native-send-out-the-full-aux-address.patch
|
||||
stable-drm-radeon-fix-hdmi-quantization_range-for-pre-dce5-asics.patch
|
||||
stable-drm-i915-preserve-ssc-earlier.patch
|
||||
stable-drm-qxl-validate-monitors-config-modes.patch
|
||||
stable-drm-i915-allow-dsi-dual-link-to-be-configured-on-any-pipe.patch
|
||||
stable-drm-i915-always-mark-the-object-as-dirty-when-used-by-the-gpu.patch
|
||||
stable-drm-i915-limit-the-number-of-loops-for-reading-a-split-64bit-register.patch
|
||||
stable-s390-sclp-fix-compile-error.patch
|
||||
stable-s390-setup-fix-novx-parameter.patch
|
||||
stable-iio-bmg160-iio_buffer-and-iio_triggered_buffer-are-required.patch
|
||||
stable-iio-event-remove-negative-error-code-from-iio_event_poll.patch
|
||||
stable-iio-industrialio-buffer-fix-iio_buffer_poll-return-value.patch
|
||||
stable-iio-adis16400-fix-adis16448-gyroscope-scale.patch
|
||||
stable-iio-add-inverse-unit-conversion-macros.patch
|
||||
stable-iio-adis16480-fix-scale-factors.patch
|
||||
stable-sched-fix-cpu_active_mask-cpu_online_mask-race.patch
|
||||
stable-staging-comedi-adl_pci7x3x-fix-digital-output-on-pci-7230.patch
|
||||
stable-staging-comedi-usbduxsigma-don-t-clobber-ai_timer-in-command-test.patch
|
||||
stable-staging-comedi-usbduxsigma-don-t-clobber-ao_timer-in-command-test.patch
|
||||
stable-pm-clk-don-t-return-int-on-__pm_clk_enable.patch
|
||||
stable-clk-rockchip-rk3288-add-clk_set_rate_parent-to-sclk_mac.patch
|
||||
stable-clk-exynos4-fix-wrong-clock-for-exynos4x12-adc.patch
|
||||
stable-clk-s5pv210-add-missing-call-to.patch
|
||||
stable-clk-pistachio-fix-override-of-clk-pll-settings-from-boot-loader.patch
|
||||
stable-clk-pistachio-correct-critical-clock-list.patch
|
||||
stable-clk-versatile-off-by-one-in-clk_sp810_timerclken_of_get.patch
|
||||
stable-clk-pxa-fix-core-frequency-reporting-unit.patch
|
||||
stable-clk-qcom-set-clk_set_rate_parent-on-ce1-clocks.patch
|
||||
stable-clk-qcom-fix-msm8916-prng-clock-enable-bit.patch
|
||||
stable-pci-fix-ti816x-class-code-quirk.patch
|
||||
stable-pci-add-dev_flags-bit-to-access-vpd-through-function-0.patch
|
||||
stable-pci-add-vpd-function-0-quirk-for-intel-ethernet-devices.patch
|
||||
stable-pci-disable-async-suspend-resume-for-jmicron-multi-function-sata-ahci.patch
|
||||
stable-spi-bcm2835-set-up-spi-mode-before-asserting-cs-gpio.patch
|
||||
stable-spi-fix-regression-in-spi-bitbang-txrx.h.patch
|
||||
stable-spi-sh-msiof-fix-fifo-size-to-64-word-from-256-word.patch
|
||||
stable-spi-img-spfi-check-for-timeout-error-before-proceeding.patch
|
||||
stable-spi-img-spfi-fix-multiple-calls-to-request-gpio.patch
|
||||
stable-spi-img-spfi-fix-kbuild-test-robot-warning.patch
|
||||
stable-spi-dw-allow-interface-drivers-to-limit-data-i-o-to-word-sizes.patch
|
||||
stable-usb-symbolserial-use-usb_get_serial_port_data.patch
|
||||
stable-usb-qcserial-add-hp-lt4111-lte-ev-do-hspa-gobi-4g-module.patch
|
||||
stable-usb-ftdi_sio-added-custom-pid-for-customware-products.patch
|
||||
stable-usb-pl2303-fix-baud-rate-divisor-calculations.patch
|
||||
stable-libxfs-readahead-of-dir3-data-blocks-should-use-the-read-verifier.patch
|
||||
stable-xfs-fix-xfs_attr_leafblock-definition.patch
|
||||
stable-xfs-fix-file-type-directory-corruption-for-btree-directories.patch
|
||||
stable-usb-gadget-m66592-udc-forever-loop-in-set_feature.patch
|
||||
stable-doc-usb-gadget-testing-using-the-updated-testusb.c.patch
|
||||
stable-usb-dwc3-ep0-fix-mem-corruption-on-out-transfers-of-more-than-512-bytes.patch
|
||||
stable-usb-gadget-f_uac2-finalize-wmaxpacketsize-according-to-bandwidth.patch
|
||||
stable-usb-host-ehci-sys-delete-useless-bus_to_hcd-conversion.patch
|
||||
stable-tty-serial-men_z135_uart.c-fix-race-between-irq-and-set_termios.patch
|
||||
stable-asoc-rt5640-fix-line-out-no-sound-issue.patch
|
||||
stable-asoc-samsung-remove-redundant-arndale_audio_remove.patch
|
||||
stable-asoc-adav80x-remove-.read_flag_mask-setting-from-adav80x_regmap_config.patch
|
||||
stable-asoc-arizona-fix-gain-settings-of-fll-in-free-run-mode.patch
|
||||
stable-asoc-arizona-poll-for-fll-clock-ok-rather-than-use-interrupts.patch
|
||||
|
||||
###
|
||||
### Arch x86
|
||||
@@ -65,15 +104,6 @@ x86-increase-default-minimum-vmalloc-area-by-64MB-to-192MB.patch
|
||||
# slows down boot
|
||||
Revert-cpufreq-pcc-Enable-autoload-of-pcc-cpufreq-fo.patch
|
||||
|
||||
# wrong optimization
|
||||
Revert-sched-x86_64-Don-t-save-flags-on-context-swit.patch
|
||||
|
||||
# fix unbootable systems
|
||||
x86-apic-Fix-fallout-from-x2apic-cleanup.patch
|
||||
|
||||
# fixes powertop
|
||||
x86-idle-Restore-trace_cpu_idle-to-mwait_idle-calls.patch
|
||||
|
||||
###
|
||||
### Core
|
||||
###
|
||||
@@ -148,21 +178,13 @@ block-floppy-disable-pnp-modalias.patch
|
||||
# prefer ata over ide drivers
|
||||
ata-prefer-ata-drivers-over-ide-drivers-when-both-are-built.patch
|
||||
|
||||
# korg #81551
|
||||
ata-revert-Disabling-the-async-PM-for-JMicron-chip-363-361.patch
|
||||
ata-jmicron-disable-broken-async_suspend.patch
|
||||
|
||||
# Nice SSD speedup
|
||||
block-Make-CFQ-default-to-IOPS-mode-on-SSDs.patch
|
||||
block-cfq-iosched-fix-the-setting-of-IOPS-mode-on-SSDs.patch
|
||||
|
||||
# libata eh breakage
|
||||
ata-Revert-libata-eh-Set-information-field-for-autosense.patch
|
||||
ata-Revert-libata-Implement-support-for-sense-data-repor.patch
|
||||
ata-Revert-libata-Implement-NCQ-autosense.patch
|
||||
|
||||
# ses driver crash
|
||||
SCSI-Fix-NULL-pointer-dereference-in-runtime-PM.patch
|
||||
# properly fix null pointer deref introduced in 4.1.7
|
||||
scsi-Revert-SCSI-Fix-NULL-pointer-dereference-in-runtime-PM.patch
|
||||
scsi-Fix-NULL-pointer-dereference-in-RTPM-of-block-layer.patch
|
||||
|
||||
###
|
||||
### File-system
|
||||
@@ -208,10 +230,6 @@ gpu-drm-mach64-linux-3.14-buildfix.patch
|
||||
gpu-drm-mach64-3.17-buildfix.patch
|
||||
gpu-drm-mach64-3.18-buildfix.patch
|
||||
|
||||
# i915
|
||||
gpu-drm-i915-remove-HBR2-from-chv-supported-list.patch
|
||||
gpu-drm-i915-Avoid-TP3-on-CHV.patch
|
||||
|
||||
###
|
||||
### Hardware Monitoring
|
||||
###
|
||||
@@ -222,6 +240,9 @@ gpu-drm-i915-Avoid-TP3-on-CHV.patch
|
||||
|
||||
input-i8042-quirks-for-Fujitsu-Lifebook-A544-and-Lif.patch
|
||||
|
||||
# fixes systemd-logind killing itself
|
||||
Input-evdev-do-not-report-errors-form-flush.patch
|
||||
|
||||
###
|
||||
### idle
|
||||
###
|
||||
|
||||
+31
@@ -0,0 +1,31 @@
|
||||
From 9d8352864907f0ad76124c5b28f65b5a382d7d7c Mon Sep 17 00:00:00 2001
|
||||
From: Axel Lin <axel.lin@ingics.com>
|
||||
Date: Fri, 14 Aug 2015 17:54:07 +0800
|
||||
Subject: ASoC: adav80x: Remove .read_flag_mask setting from adav80x_regmap_config
|
||||
|
||||
From: Axel Lin <axel.lin@ingics.com>
|
||||
|
||||
commit 9d8352864907f0ad76124c5b28f65b5a382d7d7c upstream.
|
||||
|
||||
Don't set .read_flag_mask for adav803, it's for adav801 only.
|
||||
|
||||
Fixes: 0c2d69645628 ("ASoC: adav80x: Split SPI and I2C code into different modules")
|
||||
Signed-off-by: Axel Lin <axel.lin@ingics.com>
|
||||
Acked-by: Lars-Peter Clausen <lars@metafoo.de>
|
||||
Signed-off-by: Mark Brown <broonie@kernel.org>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
|
||||
---
|
||||
sound/soc/codecs/adav80x.c | 1 -
|
||||
1 file changed, 1 deletion(-)
|
||||
|
||||
--- a/sound/soc/codecs/adav80x.c
|
||||
+++ b/sound/soc/codecs/adav80x.c
|
||||
@@ -864,7 +864,6 @@ const struct regmap_config adav80x_regma
|
||||
.val_bits = 8,
|
||||
.pad_bits = 1,
|
||||
.reg_bits = 7,
|
||||
- .read_flag_mask = 0x01,
|
||||
|
||||
.max_register = ADAV80X_PLL_OUTE,
|
||||
|
||||
+33
@@ -0,0 +1,33 @@
|
||||
From 1cf5a330c05ae37a0a98ac7c9800a6f50d5579ec Mon Sep 17 00:00:00 2001
|
||||
From: Nikesh Oswal <Nikesh.Oswal@wolfsonmicro.com>
|
||||
Date: Wed, 19 Aug 2015 16:02:24 +0100
|
||||
Subject: ASoC: arizona: Fix gain settings of FLL in free-run mode
|
||||
|
||||
From: Nikesh Oswal <Nikesh.Oswal@wolfsonmicro.com>
|
||||
|
||||
commit 1cf5a330c05ae37a0a98ac7c9800a6f50d5579ec upstream.
|
||||
|
||||
The wrong register was used to set the gain of ref loop, when changing
|
||||
the FLL output on an active FLL. This patch corrects the offset of the
|
||||
gain register.
|
||||
|
||||
Signed-off-by: Nikesh Oswal <Nikesh.Oswal@wolfsonmicro.com>
|
||||
Signed-off-by: Charles Keepax <ckeepax@opensource.wolfsonmicro.com>
|
||||
Signed-off-by: Mark Brown <broonie@kernel.org>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
|
||||
---
|
||||
sound/soc/codecs/arizona.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
--- a/sound/soc/codecs/arizona.c
|
||||
+++ b/sound/soc/codecs/arizona.c
|
||||
@@ -1912,7 +1912,7 @@ static int arizona_enable_fll(struct ari
|
||||
|
||||
if (already_enabled) {
|
||||
/* Facilitate smooth refclk across the transition */
|
||||
- regmap_update_bits_async(fll->arizona->regmap, fll->base + 0x7,
|
||||
+ regmap_update_bits_async(fll->arizona->regmap, fll->base + 0x9,
|
||||
ARIZONA_FLL1_GAIN_MASK, 0);
|
||||
regmap_update_bits_async(fll->arizona->regmap, fll->base + 1,
|
||||
ARIZONA_FLL1_FREERUN,
|
||||
+141
@@ -0,0 +1,141 @@
|
||||
From 0e7659712836ca59b4735bc5cc94de38698a5e01 Mon Sep 17 00:00:00 2001
|
||||
From: Charles Keepax <ckeepax@opensource.wolfsonmicro.com>
|
||||
Date: Tue, 25 Aug 2015 12:43:48 +0100
|
||||
Subject: ASoC: arizona: Poll for FLL clock OK rather than use interrupts
|
||||
|
||||
From: Charles Keepax <ckeepax@opensource.wolfsonmicro.com>
|
||||
|
||||
commit 0e7659712836ca59b4735bc5cc94de38698a5e01 upstream.
|
||||
|
||||
The extcon driver takes the DAPM mutex from within the interrupt thread
|
||||
in several places, which makes it possible to get into a situation where
|
||||
the interrupt thread is blocked waiting on the DAPM mutex whilst a DAPM
|
||||
sequence is running which is attempting to configure the FLL. In this
|
||||
case the FLL completion can't be completed as as the IRQ handler is
|
||||
ONE_SHOT, which cause the FLL lock to use the full time out (250mS) and
|
||||
report that the process timed out.
|
||||
|
||||
It is not really practical to make the extcon driver not take the DAPM
|
||||
mutex from within the interrupt thread, at least not without extensive
|
||||
modification. So this patch fixes the issue by switching the wait for
|
||||
the FLL lock to polling. A few fast polls are done first as the FLL
|
||||
should lock quickly for a good quality reference clock, (indeed it hits
|
||||
on the first poll on my system) and it will poll every 20mS after that
|
||||
until it times out.
|
||||
|
||||
Signed-off-by: Charles Keepax <ckeepax@opensource.wolfsonmicro.com>
|
||||
Signed-off-by: Mark Brown <broonie@kernel.org>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
|
||||
---
|
||||
sound/soc/codecs/arizona.c | 47 ++++++++++++++++++---------------------------
|
||||
sound/soc/codecs/arizona.h | 1
|
||||
2 files changed, 19 insertions(+), 29 deletions(-)
|
||||
|
||||
--- a/sound/soc/codecs/arizona.c
|
||||
+++ b/sound/soc/codecs/arizona.c
|
||||
@@ -1610,17 +1610,6 @@ int arizona_init_dai(struct arizona_priv
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(arizona_init_dai);
|
||||
|
||||
-static irqreturn_t arizona_fll_clock_ok(int irq, void *data)
|
||||
-{
|
||||
- struct arizona_fll *fll = data;
|
||||
-
|
||||
- arizona_fll_dbg(fll, "clock OK\n");
|
||||
-
|
||||
- complete(&fll->ok);
|
||||
-
|
||||
- return IRQ_HANDLED;
|
||||
-}
|
||||
-
|
||||
static struct {
|
||||
unsigned int min;
|
||||
unsigned int max;
|
||||
@@ -1902,10 +1891,11 @@ static int arizona_is_enabled_fll(struct
|
||||
static int arizona_enable_fll(struct arizona_fll *fll)
|
||||
{
|
||||
struct arizona *arizona = fll->arizona;
|
||||
- unsigned long time_left;
|
||||
bool use_sync = false;
|
||||
int already_enabled = arizona_is_enabled_fll(fll);
|
||||
struct arizona_fll_cfg cfg;
|
||||
+ int i;
|
||||
+ unsigned int val;
|
||||
|
||||
if (already_enabled < 0)
|
||||
return already_enabled;
|
||||
@@ -1964,9 +1954,6 @@ static int arizona_enable_fll(struct ari
|
||||
if (!already_enabled)
|
||||
pm_runtime_get(arizona->dev);
|
||||
|
||||
- /* Clear any pending completions */
|
||||
- try_wait_for_completion(&fll->ok);
|
||||
-
|
||||
regmap_update_bits_async(arizona->regmap, fll->base + 1,
|
||||
ARIZONA_FLL1_ENA, ARIZONA_FLL1_ENA);
|
||||
if (use_sync)
|
||||
@@ -1978,10 +1965,24 @@ static int arizona_enable_fll(struct ari
|
||||
regmap_update_bits_async(arizona->regmap, fll->base + 1,
|
||||
ARIZONA_FLL1_FREERUN, 0);
|
||||
|
||||
- time_left = wait_for_completion_timeout(&fll->ok,
|
||||
- msecs_to_jiffies(250));
|
||||
- if (time_left == 0)
|
||||
+ arizona_fll_dbg(fll, "Waiting for FLL lock...\n");
|
||||
+ val = 0;
|
||||
+ for (i = 0; i < 15; i++) {
|
||||
+ if (i < 5)
|
||||
+ usleep_range(200, 400);
|
||||
+ else
|
||||
+ msleep(20);
|
||||
+
|
||||
+ regmap_read(arizona->regmap,
|
||||
+ ARIZONA_INTERRUPT_RAW_STATUS_5,
|
||||
+ &val);
|
||||
+ if (val & (ARIZONA_FLL1_CLOCK_OK_STS << (fll->id - 1)))
|
||||
+ break;
|
||||
+ }
|
||||
+ if (i == 15)
|
||||
arizona_fll_warn(fll, "Timed out waiting for lock\n");
|
||||
+ else
|
||||
+ arizona_fll_dbg(fll, "FLL locked (%d polls)\n", i);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -2066,11 +2067,8 @@ EXPORT_SYMBOL_GPL(arizona_set_fll);
|
||||
int arizona_init_fll(struct arizona *arizona, int id, int base, int lock_irq,
|
||||
int ok_irq, struct arizona_fll *fll)
|
||||
{
|
||||
- int ret;
|
||||
unsigned int val;
|
||||
|
||||
- init_completion(&fll->ok);
|
||||
-
|
||||
fll->id = id;
|
||||
fll->base = base;
|
||||
fll->arizona = arizona;
|
||||
@@ -2092,13 +2090,6 @@ int arizona_init_fll(struct arizona *ari
|
||||
snprintf(fll->clock_ok_name, sizeof(fll->clock_ok_name),
|
||||
"FLL%d clock OK", id);
|
||||
|
||||
- ret = arizona_request_irq(arizona, ok_irq, fll->clock_ok_name,
|
||||
- arizona_fll_clock_ok, fll);
|
||||
- if (ret != 0) {
|
||||
- dev_err(arizona->dev, "Failed to get FLL%d clock OK IRQ: %d\n",
|
||||
- id, ret);
|
||||
- }
|
||||
-
|
||||
regmap_update_bits(arizona->regmap, fll->base + 1,
|
||||
ARIZONA_FLL1_FREERUN, 0);
|
||||
|
||||
--- a/sound/soc/codecs/arizona.h
|
||||
+++ b/sound/soc/codecs/arizona.h
|
||||
@@ -233,7 +233,6 @@ struct arizona_fll {
|
||||
int id;
|
||||
unsigned int base;
|
||||
unsigned int vco_mult;
|
||||
- struct completion ok;
|
||||
|
||||
unsigned int fout;
|
||||
int sync_src;
|
||||
+89
@@ -0,0 +1,89 @@
|
||||
From 9b850ca4f1c5acd7fcbbd4b38a2d27132801a8d5 Mon Sep 17 00:00:00 2001
|
||||
From: John Lin <john.lin@realtek.com>
|
||||
Date: Tue, 11 Aug 2015 14:27:25 +0800
|
||||
Subject: ASoC: rt5640: fix line out no sound issue
|
||||
|
||||
From: John Lin <john.lin@realtek.com>
|
||||
|
||||
commit 9b850ca4f1c5acd7fcbbd4b38a2d27132801a8d5 upstream.
|
||||
|
||||
The power for line out was not turned on when line out is enabled.
|
||||
So we add "LOUT amp" widget to turn on the power for line out.
|
||||
|
||||
Signed-off-by: John Lin <john.lin@realtek.com>
|
||||
Signed-off-by: Mark Brown <broonie@kernel.org>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
|
||||
---
|
||||
sound/soc/codecs/rt5640.c | 40 +++++++++++++++++++++++++++++++++++++---
|
||||
1 file changed, 37 insertions(+), 3 deletions(-)
|
||||
|
||||
--- a/sound/soc/codecs/rt5640.c
|
||||
+++ b/sound/soc/codecs/rt5640.c
|
||||
@@ -985,6 +985,35 @@ static int rt5640_hp_event(struct snd_so
|
||||
return 0;
|
||||
}
|
||||
|
||||
+static int rt5640_lout_event(struct snd_soc_dapm_widget *w,
|
||||
+ struct snd_kcontrol *kcontrol, int event)
|
||||
+{
|
||||
+ struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
|
||||
+
|
||||
+ switch (event) {
|
||||
+ case SND_SOC_DAPM_POST_PMU:
|
||||
+ hp_amp_power_on(codec);
|
||||
+ snd_soc_update_bits(codec, RT5640_PWR_ANLG1,
|
||||
+ RT5640_PWR_LM, RT5640_PWR_LM);
|
||||
+ snd_soc_update_bits(codec, RT5640_OUTPUT,
|
||||
+ RT5640_L_MUTE | RT5640_R_MUTE, 0);
|
||||
+ break;
|
||||
+
|
||||
+ case SND_SOC_DAPM_PRE_PMD:
|
||||
+ snd_soc_update_bits(codec, RT5640_OUTPUT,
|
||||
+ RT5640_L_MUTE | RT5640_R_MUTE,
|
||||
+ RT5640_L_MUTE | RT5640_R_MUTE);
|
||||
+ snd_soc_update_bits(codec, RT5640_PWR_ANLG1,
|
||||
+ RT5640_PWR_LM, 0);
|
||||
+ break;
|
||||
+
|
||||
+ default:
|
||||
+ return 0;
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
static int rt5640_hp_power_event(struct snd_soc_dapm_widget *w,
|
||||
struct snd_kcontrol *kcontrol, int event)
|
||||
{
|
||||
@@ -1180,13 +1209,16 @@ static const struct snd_soc_dapm_widget
|
||||
0, rt5640_spo_l_mix, ARRAY_SIZE(rt5640_spo_l_mix)),
|
||||
SND_SOC_DAPM_MIXER("SPOR MIX", SND_SOC_NOPM, 0,
|
||||
0, rt5640_spo_r_mix, ARRAY_SIZE(rt5640_spo_r_mix)),
|
||||
- SND_SOC_DAPM_MIXER("LOUT MIX", RT5640_PWR_ANLG1, RT5640_PWR_LM_BIT, 0,
|
||||
+ SND_SOC_DAPM_MIXER("LOUT MIX", SND_SOC_NOPM, 0, 0,
|
||||
rt5640_lout_mix, ARRAY_SIZE(rt5640_lout_mix)),
|
||||
SND_SOC_DAPM_SUPPLY_S("Improve HP Amp Drv", 1, SND_SOC_NOPM,
|
||||
0, 0, rt5640_hp_power_event, SND_SOC_DAPM_POST_PMU),
|
||||
SND_SOC_DAPM_PGA_S("HP Amp", 1, SND_SOC_NOPM, 0, 0,
|
||||
rt5640_hp_event,
|
||||
SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU),
|
||||
+ SND_SOC_DAPM_PGA_S("LOUT amp", 1, SND_SOC_NOPM, 0, 0,
|
||||
+ rt5640_lout_event,
|
||||
+ SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU),
|
||||
SND_SOC_DAPM_SUPPLY("HP L Amp", RT5640_PWR_ANLG1,
|
||||
RT5640_PWR_HP_L_BIT, 0, NULL, 0),
|
||||
SND_SOC_DAPM_SUPPLY("HP R Amp", RT5640_PWR_ANLG1,
|
||||
@@ -1501,8 +1533,10 @@ static const struct snd_soc_dapm_route r
|
||||
{"HP R Playback", "Switch", "HP Amp"},
|
||||
{"HPOL", NULL, "HP L Playback"},
|
||||
{"HPOR", NULL, "HP R Playback"},
|
||||
- {"LOUTL", NULL, "LOUT MIX"},
|
||||
- {"LOUTR", NULL, "LOUT MIX"},
|
||||
+
|
||||
+ {"LOUT amp", NULL, "LOUT MIX"},
|
||||
+ {"LOUTL", NULL, "LOUT amp"},
|
||||
+ {"LOUTR", NULL, "LOUT amp"},
|
||||
};
|
||||
|
||||
static const struct snd_soc_dapm_route rt5640_specific_dapm_routes[] = {
|
||||
+48
@@ -0,0 +1,48 @@
|
||||
From 14a500fe1396934c6b3ed8f009459a4723da7862 Mon Sep 17 00:00:00 2001
|
||||
From: Vaishali Thakkar <vthakkar1994@gmail.com>
|
||||
Date: Thu, 20 Aug 2015 22:11:15 +0530
|
||||
Subject: ASoC: samsung: Remove redundant arndale_audio_remove
|
||||
|
||||
From: Vaishali Thakkar <vthakkar1994@gmail.com>
|
||||
|
||||
commit 14a500fe1396934c6b3ed8f009459a4723da7862 upstream.
|
||||
|
||||
There is no use of snd_soc_unregister_card in remove function
|
||||
as devm_snd_soc_register_card in probe function automatically
|
||||
handles it. So, remove use of snd_soc_unregister_card and with
|
||||
this change remove arndale_audio_remove as it is now redundant.
|
||||
|
||||
Signed-off-by: Vaishali Thakkar <vthakkar1994@gmail.com>
|
||||
Signed-off-by: Mark Brown <broonie@kernel.org>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
|
||||
---
|
||||
sound/soc/samsung/arndale_rt5631.c | 10 ----------
|
||||
1 file changed, 10 deletions(-)
|
||||
|
||||
--- a/sound/soc/samsung/arndale_rt5631.c
|
||||
+++ b/sound/soc/samsung/arndale_rt5631.c
|
||||
@@ -116,15 +116,6 @@ static int arndale_audio_probe(struct pl
|
||||
return ret;
|
||||
}
|
||||
|
||||
-static int arndale_audio_remove(struct platform_device *pdev)
|
||||
-{
|
||||
- struct snd_soc_card *card = platform_get_drvdata(pdev);
|
||||
-
|
||||
- snd_soc_unregister_card(card);
|
||||
-
|
||||
- return 0;
|
||||
-}
|
||||
-
|
||||
static const struct of_device_id samsung_arndale_rt5631_of_match[] __maybe_unused = {
|
||||
{ .compatible = "samsung,arndale-rt5631", },
|
||||
{ .compatible = "samsung,arndale-alc5631", },
|
||||
@@ -139,7 +130,6 @@ static struct platform_driver arndale_au
|
||||
.of_match_table = of_match_ptr(samsung_arndale_rt5631_of_match),
|
||||
},
|
||||
.probe = arndale_audio_probe,
|
||||
- .remove = arndale_audio_remove,
|
||||
};
|
||||
|
||||
module_platform_driver(arndale_audio_driver);
|
||||
+55
@@ -0,0 +1,55 @@
|
||||
From e323d56eb06b266b77c2b430cb5f1977ba549e03 Mon Sep 17 00:00:00 2001
|
||||
From: Krzysztof Kozlowski <k.kozlowski@samsung.com>
|
||||
Date: Fri, 12 Jun 2015 10:53:25 +0900
|
||||
Subject: clk: exynos4: Fix wrong clock for Exynos4x12 ADC
|
||||
|
||||
From: Krzysztof Kozlowski <k.kozlowski@samsung.com>
|
||||
|
||||
commit e323d56eb06b266b77c2b430cb5f1977ba549e03 upstream.
|
||||
|
||||
The TSADC gate clock was used in Exynos4x12 DTSI for exynos-adc driver.
|
||||
However TSADC is present only on Exynos4210 so on Trats2 board (with
|
||||
Exynos4412 SoC) the exynos-adc driver could not be probed:
|
||||
ERROR: could not get clock /adc@126C0000:adc(0)
|
||||
exynos-adc 126c0000.adc: failed getting clock, err = -2
|
||||
exynos-adc: probe of 126c0000.adc failed with error -2
|
||||
|
||||
Instead on Exynos4x12 SoCs the main clock used by Analog to Digital
|
||||
Converter is located in different register and it is named in datasheet
|
||||
as PCLK_ADC. Regardless of the name the purpose of this PCLK_ADC clock
|
||||
is the same as purpose of TSADC from Exynos4210.
|
||||
|
||||
The patch adds gate clock for Exynos4x12 using the proper register so
|
||||
backward compatibility is preserved. This fixes the probe of exynos-adc
|
||||
driver on Exynos4x12 boards and allows accessing sensors connected to it
|
||||
on Trats2 board (ntc,ncp15wb473 AP and battery thermistors).
|
||||
|
||||
Signed-off-by: Krzysztof Kozlowski <k.kozlowski@samsung.com>
|
||||
Fixes: c63c57433003 ("ARM: dts: Add ADC's dt data to read raw data for exynos4x12")
|
||||
Reviewed-by: Javier Martinez Canillas <javier.martinez@collabora.co.uk>
|
||||
Acked-by: Tomasz Figa <tomasz.figa@gmail.com>
|
||||
Signed-off-by: Stephen Boyd <sboyd@codeaurora.org>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
|
||||
---
|
||||
drivers/clk/samsung/clk-exynos4.c | 2 ++
|
||||
1 file changed, 2 insertions(+)
|
||||
|
||||
--- a/drivers/clk/samsung/clk-exynos4.c
|
||||
+++ b/drivers/clk/samsung/clk-exynos4.c
|
||||
@@ -85,6 +85,7 @@
|
||||
#define DIV_PERIL4 0xc560
|
||||
#define DIV_PERIL5 0xc564
|
||||
#define E4X12_DIV_CAM1 0xc568
|
||||
+#define E4X12_GATE_BUS_FSYS1 0xc744
|
||||
#define GATE_SCLK_CAM 0xc820
|
||||
#define GATE_IP_CAM 0xc920
|
||||
#define GATE_IP_TV 0xc924
|
||||
@@ -1095,6 +1096,7 @@ static struct samsung_gate_clock exynos4
|
||||
0),
|
||||
GATE(CLK_PPMUIMAGE, "ppmuimage", "aclk200", E4X12_GATE_IP_IMAGE, 9, 0,
|
||||
0),
|
||||
+ GATE(CLK_TSADC, "tsadc", "aclk133", E4X12_GATE_BUS_FSYS1, 16, 0, 0),
|
||||
GATE(CLK_MIPI_HSI, "mipi_hsi", "aclk133", GATE_IP_FSYS, 10, 0, 0),
|
||||
GATE(CLK_CHIPID, "chipid", "aclk100", E4X12_GATE_IP_PERIR, 0, 0, 0),
|
||||
GATE(CLK_SYSREG, "sysreg", "aclk100", E4X12_GATE_IP_PERIR, 1,
|
||||
+81
@@ -0,0 +1,81 @@
|
||||
From d31ff5f7f3b142b8d1ebb3da89187c54cdf2bc71 Mon Sep 17 00:00:00 2001
|
||||
From: "Damien.Horsley" <Damien.Horsley@imgtec.com>
|
||||
Date: Wed, 26 Aug 2015 17:11:40 +0100
|
||||
Subject: clk: pistachio: correct critical clock list
|
||||
|
||||
From: "Damien.Horsley" <Damien.Horsley@imgtec.com>
|
||||
|
||||
commit d31ff5f7f3b142b8d1ebb3da89187c54cdf2bc71 upstream.
|
||||
|
||||
Current critical clock list for pistachio enables
|
||||
only mips and sys clocks by default but there are
|
||||
also other clocks that are not claimed by anyone and
|
||||
needs to be enabled by default.
|
||||
|
||||
This patch updates the critical clocks that need
|
||||
to be enabled by default.
|
||||
|
||||
Add a separate struct to distinguish the critical clocks
|
||||
as listed:
|
||||
1.) core clocks:
|
||||
a.) mips clock
|
||||
2.) peripheral system clocks:
|
||||
a.) sys clock
|
||||
b.) sys_bus clock
|
||||
c.) DDR clock
|
||||
d.) ROM clock
|
||||
|
||||
Fixes: b35d7c33419c("CLK: Pistachio: Register core clocks")
|
||||
Reviewed-by: Andrew Bresticker <abrestic@chromium.org>
|
||||
Signed-off-by: Ezequiel Garcia <ezequiel.garcia@imgtec.com>
|
||||
Signed-off-by: Damien.Horsley <Damien.Horsley@imgtec.com>
|
||||
Signed-off-by: Govindraj Raja <govindraj.raja@imgtec.com>
|
||||
Signed-off-by: Stephen Boyd <sboyd@codeaurora.org>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
|
||||
---
|
||||
drivers/clk/pistachio/clk-pistachio.c | 19 ++++++++++++++-----
|
||||
1 file changed, 14 insertions(+), 5 deletions(-)
|
||||
|
||||
--- a/drivers/clk/pistachio/clk-pistachio.c
|
||||
+++ b/drivers/clk/pistachio/clk-pistachio.c
|
||||
@@ -159,9 +159,15 @@ PNAME(mux_debug) = { "mips_pll_mux", "rp
|
||||
"wifi_pll_mux", "bt_pll_mux" };
|
||||
static u32 mux_debug_idx[] = { 0x0, 0x1, 0x2, 0x4, 0x8, 0x10 };
|
||||
|
||||
-static unsigned int pistachio_critical_clks[] __initdata = {
|
||||
- CLK_MIPS,
|
||||
- CLK_PERIPH_SYS,
|
||||
+static unsigned int pistachio_critical_clks_core[] __initdata = {
|
||||
+ CLK_MIPS
|
||||
+};
|
||||
+
|
||||
+static unsigned int pistachio_critical_clks_sys[] __initdata = {
|
||||
+ PERIPH_CLK_SYS,
|
||||
+ PERIPH_CLK_SYS_BUS,
|
||||
+ PERIPH_CLK_DDR,
|
||||
+ PERIPH_CLK_ROM,
|
||||
};
|
||||
|
||||
static void __init pistachio_clk_init(struct device_node *np)
|
||||
@@ -193,8 +199,8 @@ static void __init pistachio_clk_init(st
|
||||
|
||||
pistachio_clk_register_provider(p);
|
||||
|
||||
- pistachio_clk_force_enable(p, pistachio_critical_clks,
|
||||
- ARRAY_SIZE(pistachio_critical_clks));
|
||||
+ pistachio_clk_force_enable(p, pistachio_critical_clks_core,
|
||||
+ ARRAY_SIZE(pistachio_critical_clks_core));
|
||||
}
|
||||
CLK_OF_DECLARE(pistachio_clk, "img,pistachio-clk", pistachio_clk_init);
|
||||
|
||||
@@ -261,6 +267,9 @@ static void __init pistachio_clk_periph_
|
||||
ARRAY_SIZE(pistachio_periph_gates));
|
||||
|
||||
pistachio_clk_register_provider(p);
|
||||
+
|
||||
+ pistachio_clk_force_enable(p, pistachio_critical_clks_sys,
|
||||
+ ARRAY_SIZE(pistachio_critical_clks_sys));
|
||||
}
|
||||
CLK_OF_DECLARE(pistachio_clk_periph, "img,pistachio-clk-periph",
|
||||
pistachio_clk_periph_init);
|
||||
+54
@@ -0,0 +1,54 @@
|
||||
From e53f21c761d141bbcbce06e9ddab3b4e0a828f2c Mon Sep 17 00:00:00 2001
|
||||
From: Zdenko Pulitika <zdenko.pulitika@imgtec.com>
|
||||
Date: Wed, 26 Aug 2015 17:11:38 +0100
|
||||
Subject: clk: pistachio: Fix override of clk-pll settings from boot loader
|
||||
|
||||
From: Zdenko Pulitika <zdenko.pulitika@imgtec.com>
|
||||
|
||||
commit e53f21c761d141bbcbce06e9ddab3b4e0a828f2c upstream.
|
||||
|
||||
PLL enable callbacks are overriding PLL mode (int/frac) and
|
||||
Noise reduction (on/off) settings set by the boot loader which
|
||||
results in the incorrect clock rate.
|
||||
|
||||
PLL mode and noise reduction are defined by the DSMPD and DACPD bits
|
||||
of the PLL control register. PLL .enable() callbacks enable PLL
|
||||
by deasserting all power-down bits of the PLL control register,
|
||||
including DSMPD and DACPD bits, which is not necessary since
|
||||
these bits don't actually enable/disable PLL.
|
||||
|
||||
This commit fixes the problem by removing DSMPD and DACPD bits
|
||||
from the "PLL enable" mask.
|
||||
|
||||
Fixes: 43049b0c83f17("CLK: Pistachio: Add PLL driver")
|
||||
Reviewed-by: Andrew Bresitcker <abrestic@chromium.org>
|
||||
Signed-off-by: Zdenko Pulitika <zdenko.pulitika@imgtec.com>
|
||||
Signed-off-by: Govindraj Raja <govindraj.raja@imgtec.com>
|
||||
Signed-off-by: Stephen Boyd <sboyd@codeaurora.org>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
|
||||
---
|
||||
drivers/clk/pistachio/clk-pll.c | 5 ++---
|
||||
1 file changed, 2 insertions(+), 3 deletions(-)
|
||||
|
||||
--- a/drivers/clk/pistachio/clk-pll.c
|
||||
+++ b/drivers/clk/pistachio/clk-pll.c
|
||||
@@ -115,8 +115,7 @@ static int pll_gf40lp_frac_enable(struct
|
||||
u32 val;
|
||||
|
||||
val = pll_readl(pll, PLL_CTRL3);
|
||||
- val &= ~(PLL_FRAC_CTRL3_PD | PLL_FRAC_CTRL3_DACPD |
|
||||
- PLL_FRAC_CTRL3_DSMPD | PLL_FRAC_CTRL3_FOUTPOSTDIVPD |
|
||||
+ val &= ~(PLL_FRAC_CTRL3_PD | PLL_FRAC_CTRL3_FOUTPOSTDIVPD |
|
||||
PLL_FRAC_CTRL3_FOUT4PHASEPD | PLL_FRAC_CTRL3_FOUTVCOPD);
|
||||
pll_writel(pll, val, PLL_CTRL3);
|
||||
|
||||
@@ -233,7 +232,7 @@ static int pll_gf40lp_laint_enable(struc
|
||||
u32 val;
|
||||
|
||||
val = pll_readl(pll, PLL_CTRL1);
|
||||
- val &= ~(PLL_INT_CTRL1_PD | PLL_INT_CTRL1_DSMPD |
|
||||
+ val &= ~(PLL_INT_CTRL1_PD |
|
||||
PLL_INT_CTRL1_FOUTPOSTDIVPD | PLL_INT_CTRL1_FOUTVCOPD);
|
||||
pll_writel(pll, val, PLL_CTRL1);
|
||||
|
||||
+61
@@ -0,0 +1,61 @@
|
||||
From 4b5fb7dc9096d949a22651370bb6bf11f21edb30 Mon Sep 17 00:00:00 2001
|
||||
From: Robert Jarzmik <robert.jarzmik@free.fr>
|
||||
Date: Sun, 12 Jul 2015 22:49:53 +0200
|
||||
Subject: clk: pxa: fix core frequency reporting unit
|
||||
|
||||
From: Robert Jarzmik <robert.jarzmik@free.fr>
|
||||
|
||||
commit 4b5fb7dc9096d949a22651370bb6bf11f21edb30 upstream.
|
||||
|
||||
Legacy drivers which are not yet ported, such as cpufreq-pxa[23]xx, rely
|
||||
on pxaXXx_get_clk_frequency_khz() to find the CPU core frequency.
|
||||
|
||||
This reporting was broken because the expected unit is kHz and not
|
||||
Hz. Fix the reporting for pxa25x, pxa27x and pxa3xx.
|
||||
|
||||
Fixes: fe7710fae477 ("clk: add pxa25x clock drivers")
|
||||
Fixes: d40670dc6169 ("clk: add pxa27x clock drivers")
|
||||
Fixes: 9bbb8a338fb2 ("clk: pxa: add pxa3xx clock driver")
|
||||
Signed-off-by: Robert Jarzmik <robert.jarzmik@free.fr>
|
||||
Signed-off-by: Stephen Boyd <sboyd@codeaurora.org>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
|
||||
---
|
||||
drivers/clk/pxa/clk-pxa25x.c | 2 +-
|
||||
drivers/clk/pxa/clk-pxa27x.c | 2 +-
|
||||
drivers/clk/pxa/clk-pxa3xx.c | 2 +-
|
||||
3 files changed, 3 insertions(+), 3 deletions(-)
|
||||
|
||||
--- a/drivers/clk/pxa/clk-pxa25x.c
|
||||
+++ b/drivers/clk/pxa/clk-pxa25x.c
|
||||
@@ -79,7 +79,7 @@ unsigned int pxa25x_get_clk_frequency_kh
|
||||
clks[3] / 1000000, (clks[3] % 1000000) / 10000);
|
||||
}
|
||||
|
||||
- return (unsigned int)clks[0];
|
||||
+ return (unsigned int)clks[0] / KHz;
|
||||
}
|
||||
|
||||
static unsigned long clk_pxa25x_memory_get_rate(struct clk_hw *hw,
|
||||
--- a/drivers/clk/pxa/clk-pxa27x.c
|
||||
+++ b/drivers/clk/pxa/clk-pxa27x.c
|
||||
@@ -80,7 +80,7 @@ unsigned int pxa27x_get_clk_frequency_kh
|
||||
pr_info("System bus clock: %ld.%02ldMHz\n",
|
||||
clks[4] / 1000000, (clks[4] % 1000000) / 10000);
|
||||
}
|
||||
- return (unsigned int)clks[0];
|
||||
+ return (unsigned int)clks[0] / KHz;
|
||||
}
|
||||
|
||||
bool pxa27x_is_ppll_disabled(void)
|
||||
--- a/drivers/clk/pxa/clk-pxa3xx.c
|
||||
+++ b/drivers/clk/pxa/clk-pxa3xx.c
|
||||
@@ -78,7 +78,7 @@ unsigned int pxa3xx_get_clk_frequency_kh
|
||||
pr_info("System bus clock: %ld.%02ldMHz\n",
|
||||
clks[4] / 1000000, (clks[4] % 1000000) / 10000);
|
||||
}
|
||||
- return (unsigned int)clks[0];
|
||||
+ return (unsigned int)clks[0] / KHz;
|
||||
}
|
||||
|
||||
static unsigned long clk_pxa3xx_ac97_get_rate(struct clk_hw *hw,
|
||||
-38
@@ -1,38 +0,0 @@
|
||||
From b93028c9af807b9474789e6aba34a6135b6cb708 Mon Sep 17 00:00:00 2001
|
||||
From: Robert Jarzmik <robert.jarzmik@free.fr>
|
||||
Date: Tue, 4 Aug 2015 08:21:33 +0200
|
||||
Subject: clk: pxa: pxa3xx: fix CKEN register access
|
||||
|
||||
From: Robert Jarzmik <robert.jarzmik@free.fr>
|
||||
|
||||
commit b93028c9af807b9474789e6aba34a6135b6cb708 upstream.
|
||||
|
||||
Clocks 0 to 31 are on CKENA, and not CKENB. The clock register names
|
||||
were inadequately inverted. As a consequence, all clock operations were
|
||||
happening on CKENB, because almost all but 2 clocks are on CKENA.
|
||||
|
||||
As the clocks were activated by the bootloader in the former tests, it
|
||||
escaped the testing that the wrong clock gate was manipulated. The error
|
||||
was revealed by changing the pxa3xx-nand driver to a module, where upon
|
||||
unloading, the wrong clock was disabled in CKENB.
|
||||
|
||||
Fixes: 9bbb8a338fb2 ("clk: pxa: add pxa3xx clock driver")
|
||||
Signed-off-by: Robert Jarzmik <robert.jarzmik@free.fr>
|
||||
Signed-off-by: Stephen Boyd <sboyd@codeaurora.org>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
|
||||
---
|
||||
drivers/clk/pxa/clk-pxa3xx.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/clk/pxa/clk-pxa3xx.c
|
||||
+++ b/drivers/clk/pxa/clk-pxa3xx.c
|
||||
@@ -126,7 +126,7 @@ PARENTS(pxa3xx_ac97_bus) = { "ring_osc_6
|
||||
PARENTS(pxa3xx_sbus) = { "ring_osc_60mhz", "system_bus" };
|
||||
PARENTS(pxa3xx_smemcbus) = { "ring_osc_60mhz", "smemc" };
|
||||
|
||||
-#define CKEN_AB(bit) ((CKEN_ ## bit > 31) ? &CKENA : &CKENB)
|
||||
+#define CKEN_AB(bit) ((CKEN_ ## bit > 31) ? &CKENB : &CKENA)
|
||||
#define PXA3XX_CKEN(dev_id, con_id, parents, mult_lp, div_lp, mult_hp, \
|
||||
div_hp, bit, is_lp, flags) \
|
||||
PXA_CKEN(dev_id, con_id, bit, parents, mult_lp, div_lp, \
|
||||
+32
@@ -0,0 +1,32 @@
|
||||
From 1c4b4b0eb1909010b8ebda1ef208bf3ed62e7487 Mon Sep 17 00:00:00 2001
|
||||
From: Georgi Djakov <georgi.djakov@linaro.org>
|
||||
Date: Tue, 25 Aug 2015 15:27:43 +0300
|
||||
Subject: clk: qcom: Fix MSM8916 prng clock enable bit
|
||||
|
||||
From: Georgi Djakov <georgi.djakov@linaro.org>
|
||||
|
||||
commit 1c4b4b0eb1909010b8ebda1ef208bf3ed62e7487 upstream.
|
||||
|
||||
Fix the enable bit of the pseudorandom number generator clock.
|
||||
|
||||
Reported-by: Stanimir Varbanov <stanimir.varbanov@linaro.org>
|
||||
Fixes: 3966fab8b6ab "clk: qcom: Add MSM8916 Global Clock Controller support"
|
||||
Signed-off-by: Georgi Djakov <georgi.djakov@linaro.org>
|
||||
Signed-off-by: Stephen Boyd <sboyd@codeaurora.org>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
|
||||
---
|
||||
drivers/clk/qcom/gcc-msm8916.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/clk/qcom/gcc-msm8916.c
|
||||
+++ b/drivers/clk/qcom/gcc-msm8916.c
|
||||
@@ -2278,7 +2278,7 @@ static struct clk_branch gcc_prng_ahb_cl
|
||||
.halt_check = BRANCH_HALT_VOTED,
|
||||
.clkr = {
|
||||
.enable_reg = 0x45004,
|
||||
- .enable_mask = BIT(0),
|
||||
+ .enable_mask = BIT(8),
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "gcc_prng_ahb_clk",
|
||||
.parent_names = (const char *[]){
|
||||
+45
@@ -0,0 +1,45 @@
|
||||
From d7a304e9d018c99dda80f4c16ec0fe817b5be4a1 Mon Sep 17 00:00:00 2001
|
||||
From: Stephen Boyd <sboyd@codeaurora.org>
|
||||
Date: Tue, 14 Jul 2015 16:57:29 -0700
|
||||
Subject: clk: qcom: Set CLK_SET_RATE_PARENT on ce1 clocks
|
||||
|
||||
From: Stephen Boyd <sboyd@codeaurora.org>
|
||||
|
||||
commit d7a304e9d018c99dda80f4c16ec0fe817b5be4a1 upstream.
|
||||
|
||||
The other ce clocks have the flag set, but ce1 doesn't, so
|
||||
clk_set_rate() doesn't propagate up the tree to the ce1_src_clk.
|
||||
Set the flag as this is supported.
|
||||
|
||||
Reported-by: Bjorn Andersson <bjorn.andersson@sonymobile.com>
|
||||
Tested-by: Bjorn Andersson <bjorn.andersson@sonymobile.com>
|
||||
Fixes: 02824653200b ("clk: qcom: Add APQ8084 Global Clock Controller support")
|
||||
Fixes: d33faa9ead8d ("clk: qcom: Add support for MSM8974's global clock controller (GCC)")
|
||||
Signed-off-by: Stephen Boyd <sboyd@codeaurora.org>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
|
||||
---
|
||||
drivers/clk/qcom/gcc-apq8084.c | 1 +
|
||||
drivers/clk/qcom/gcc-msm8974.c | 1 +
|
||||
2 files changed, 2 insertions(+)
|
||||
|
||||
--- a/drivers/clk/qcom/gcc-apq8084.c
|
||||
+++ b/drivers/clk/qcom/gcc-apq8084.c
|
||||
@@ -2105,6 +2105,7 @@ static struct clk_branch gcc_ce1_clk = {
|
||||
"ce1_clk_src",
|
||||
},
|
||||
.num_parents = 1,
|
||||
+ .flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
--- a/drivers/clk/qcom/gcc-msm8974.c
|
||||
+++ b/drivers/clk/qcom/gcc-msm8974.c
|
||||
@@ -1783,6 +1783,7 @@ static struct clk_branch gcc_ce1_clk = {
|
||||
"ce1_clk_src",
|
||||
},
|
||||
.num_parents = 1,
|
||||
+ .flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
+39
@@ -0,0 +1,39 @@
|
||||
From 4791eb61dbe8100ccac59fecfac9d93a15db1447 Mon Sep 17 00:00:00 2001
|
||||
From: Heiko Stuebner <heiko@sntech.de>
|
||||
Date: Thu, 18 Jun 2015 16:18:28 +0200
|
||||
Subject: clk: rockchip: rk3288: add CLK_SET_RATE_PARENT to sclk_mac
|
||||
|
||||
From: Heiko Stuebner <heiko@sntech.de>
|
||||
|
||||
commit 4791eb61dbe8100ccac59fecfac9d93a15db1447 upstream.
|
||||
|
||||
The dwmac ethernet controller on the rk3288 supports phys connected
|
||||
via rgmii and rmii. With rgmii phys it is expected that the mac clock
|
||||
is provided externally while with rmii phys the clock can be external
|
||||
but also generated from the plls. In the later case it of course needs
|
||||
be at 50MHz, which gets set from the dwmac_rk driver.
|
||||
As most devices use a rgmii phy it never surfaced so far that the mac
|
||||
clk mux, doesn't go up one lever to the pll clock in the rmii case with
|
||||
internal clock generation, as it is missing the CLK_SET_RATE_PARENT flag,
|
||||
and thus will not set the correct frequency in most cases.
|
||||
|
||||
Fixes: b9e4ba541607 ("clk: rockchip: add clock controller for rk3288")
|
||||
Signed-off-by: Heiko Stuebner <heiko@sntech.de>
|
||||
Signed-off-by: Stephen Boyd <sboyd@codeaurora.org>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
|
||||
---
|
||||
drivers/clk/rockchip/clk-rk3288.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/clk/rockchip/clk-rk3288.c
|
||||
+++ b/drivers/clk/rockchip/clk-rk3288.c
|
||||
@@ -578,7 +578,7 @@ static struct rockchip_clk_branch rk3288
|
||||
COMPOSITE(0, "mac_pll_src", mux_pll_src_npll_cpll_gpll_p, 0,
|
||||
RK3288_CLKSEL_CON(21), 0, 2, MFLAGS, 8, 5, DFLAGS,
|
||||
RK3288_CLKGATE_CON(2), 5, GFLAGS),
|
||||
- MUX(SCLK_MAC, "mac_clk", mux_mac_p, 0,
|
||||
+ MUX(SCLK_MAC, "mac_clk", mux_mac_p, CLK_SET_RATE_PARENT,
|
||||
RK3288_CLKSEL_CON(21), 4, 1, MFLAGS),
|
||||
GATE(SCLK_MACREF_OUT, "sclk_macref_out", "mac_clk", 0,
|
||||
RK3288_CLKGATE_CON(5), 3, GFLAGS),
|
||||
@@ -0,0 +1,37 @@
|
||||
From ba30011577330b7e29ecb5916d89c6db9fbc5b3d Mon Sep 17 00:00:00 2001
|
||||
From: Marek Szyprowski <m.szyprowski@samsung.com>
|
||||
Date: Wed, 12 Aug 2015 10:58:22 +0200
|
||||
Subject: clk: s5pv210: add missing call to
|
||||
samsung_clk_of_add_provider()
|
||||
|
||||
From: Marek Szyprowski <m.szyprowski@samsung.com>
|
||||
|
||||
commit ba30011577330b7e29ecb5916d89c6db9fbc5b3d upstream.
|
||||
|
||||
Commit d5e136a21b2028fb1f45143ea7112d5869bfc6c7 ("clk: samsung: Register
|
||||
clk provider only after registering its all clocks", merged to v3.17-rc1)
|
||||
modified a way that driver registers registers to core framework. This
|
||||
change has not been applied to s5pv210 clocks driver, which has been
|
||||
merged in parallel to that commit. This patch adds a missing call to
|
||||
samsung_clk_of_add_provider(), so the driver is operational again.
|
||||
|
||||
Signed-off-by: Marek Szyprowski <m.szyprowski@samsung.com>
|
||||
Acked-by: Tomasz Figa <tomasz.figa@gmail.com>
|
||||
Signed-off-by: Michael Turquette <mturquette@baylibre.com>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
|
||||
---
|
||||
drivers/clk/samsung/clk-s5pv210.c | 2 ++
|
||||
1 file changed, 2 insertions(+)
|
||||
|
||||
--- a/drivers/clk/samsung/clk-s5pv210.c
|
||||
+++ b/drivers/clk/samsung/clk-s5pv210.c
|
||||
@@ -828,6 +828,8 @@ static void __init __s5pv210_clk_init(st
|
||||
|
||||
s5pv210_clk_sleep_init();
|
||||
|
||||
+ samsung_clk_of_add_provider(np, ctx);
|
||||
+
|
||||
pr_info("%s clocks: mout_apll = %ld, mout_mpll = %ld\n"
|
||||
"\tmout_epll = %ld, mout_vpll = %ld\n",
|
||||
is_s5p6442 ? "S5P6442" : "S5PV210",
|
||||
+34
@@ -0,0 +1,34 @@
|
||||
From 3294bee87091be5f179474f6c39d1d87769635e2 Mon Sep 17 00:00:00 2001
|
||||
From: Dan Carpenter <dan.carpenter@oracle.com>
|
||||
Date: Wed, 29 Jul 2015 13:17:06 +0300
|
||||
Subject: clk: versatile: off by one in clk_sp810_timerclken_of_get()
|
||||
|
||||
From: Dan Carpenter <dan.carpenter@oracle.com>
|
||||
|
||||
commit 3294bee87091be5f179474f6c39d1d87769635e2 upstream.
|
||||
|
||||
The ">" should be ">=" or we end up reading beyond the end of the array.
|
||||
|
||||
Fixes: 6e973d2c4385 ('clk: vexpress: Add separate SP810 driver')
|
||||
Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
|
||||
Acked-by: Pawel Moll <pawel.moll@arm.com>
|
||||
Signed-off-by: Stephen Boyd <sboyd@codeaurora.org>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
|
||||
---
|
||||
drivers/clk/versatile/clk-sp810.c | 4 ++--
|
||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
--- a/drivers/clk/versatile/clk-sp810.c
|
||||
+++ b/drivers/clk/versatile/clk-sp810.c
|
||||
@@ -128,8 +128,8 @@ static struct clk *clk_sp810_timerclken_
|
||||
{
|
||||
struct clk_sp810 *sp810 = data;
|
||||
|
||||
- if (WARN_ON(clkspec->args_count != 1 || clkspec->args[0] >
|
||||
- ARRAY_SIZE(sp810->timerclken)))
|
||||
+ if (WARN_ON(clkspec->args_count != 1 ||
|
||||
+ clkspec->args[0] >= ARRAY_SIZE(sp810->timerclken)))
|
||||
return NULL;
|
||||
|
||||
return sp810->timerclken[clkspec->args[0]].clk;
|
||||
-33
@@ -1,33 +0,0 @@
|
||||
From 7f518ad0a212e2a6fd68630e176af1de395070a7 Mon Sep 17 00:00:00 2001
|
||||
From: Joe Thornber <ejt@redhat.com>
|
||||
Date: Wed, 12 Aug 2015 15:10:21 +0100
|
||||
Subject: dm thin metadata: delete btrees when releasing metadata snapshot
|
||||
|
||||
From: Joe Thornber <ejt@redhat.com>
|
||||
|
||||
commit 7f518ad0a212e2a6fd68630e176af1de395070a7 upstream.
|
||||
|
||||
The device details and mapping trees were just being decremented
|
||||
before. Now btree_del() is called to do a deep delete.
|
||||
|
||||
Signed-off-by: Joe Thornber <ejt@redhat.com>
|
||||
Signed-off-by: Mike Snitzer <snitzer@redhat.com>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
|
||||
---
|
||||
drivers/md/dm-thin-metadata.c | 4 ++--
|
||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
--- a/drivers/md/dm-thin-metadata.c
|
||||
+++ b/drivers/md/dm-thin-metadata.c
|
||||
@@ -1295,8 +1295,8 @@ static int __release_metadata_snap(struc
|
||||
return r;
|
||||
|
||||
disk_super = dm_block_data(copy);
|
||||
- dm_sm_dec_block(pmd->metadata_sm, le64_to_cpu(disk_super->data_mapping_root));
|
||||
- dm_sm_dec_block(pmd->metadata_sm, le64_to_cpu(disk_super->device_details_root));
|
||||
+ dm_btree_del(&pmd->info, le64_to_cpu(disk_super->data_mapping_root));
|
||||
+ dm_btree_del(&pmd->details_info, le64_to_cpu(disk_super->device_details_root));
|
||||
dm_sm_dec_block(pmd->metadata_sm, held_root);
|
||||
|
||||
return dm_tm_unlock(pmd->tm, copy);
|
||||
+44
@@ -0,0 +1,44 @@
|
||||
From f811a38300be3cdb603171aea5ad3fb42b71ca53 Mon Sep 17 00:00:00 2001
|
||||
From: Peter Chen <peter.chen@freescale.com>
|
||||
Date: Fri, 31 Jul 2015 16:36:30 +0800
|
||||
Subject: doc: usb: gadget-testing: using the updated testusb.c
|
||||
|
||||
From: Peter Chen <peter.chen@freescale.com>
|
||||
|
||||
commit f811a38300be3cdb603171aea5ad3fb42b71ca53 upstream.
|
||||
|
||||
testusb.c at http://www.linux-usb.org/usbtest/ is out of date,
|
||||
using the one at the kernel source folder.
|
||||
|
||||
Signed-off-by: Peter Chen <peter.chen@freescale.com>
|
||||
Signed-off-by: Felipe Balbi <balbi@ti.com>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
|
||||
---
|
||||
Documentation/usb/gadget-testing.txt | 7 ++-----
|
||||
1 file changed, 2 insertions(+), 5 deletions(-)
|
||||
|
||||
--- a/Documentation/usb/gadget-testing.txt
|
||||
+++ b/Documentation/usb/gadget-testing.txt
|
||||
@@ -237,9 +237,7 @@ Testing the LOOPBACK function
|
||||
-----------------------------
|
||||
|
||||
device: run the gadget
|
||||
-host: test-usb
|
||||
-
|
||||
-http://www.linux-usb.org/usbtest/testusb.c
|
||||
+host: test-usb (tools/usb/testusb.c)
|
||||
|
||||
8. MASS STORAGE function
|
||||
========================
|
||||
@@ -588,9 +586,8 @@ Testing the SOURCESINK function
|
||||
-------------------------------
|
||||
|
||||
device: run the gadget
|
||||
-host: test-usb
|
||||
+host: test-usb (tools/usb/testusb.c)
|
||||
|
||||
-http://www.linux-usb.org/usbtest/testusb.c
|
||||
|
||||
16. UAC1 function
|
||||
=================
|
||||
+58
@@ -0,0 +1,58 @@
|
||||
From 824257857fd81f5e749831ff9cd63566b5a86abe Mon Sep 17 00:00:00 2001
|
||||
From: Gaurav K Singh <gaurav.k.singh@intel.com>
|
||||
Date: Mon, 3 Aug 2015 15:45:32 +0530
|
||||
Subject: drm/i915: Allow DSI dual link to be configured on any pipe
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
From: Gaurav K Singh <gaurav.k.singh@intel.com>
|
||||
|
||||
commit 824257857fd81f5e749831ff9cd63566b5a86abe upstream.
|
||||
|
||||
Just like single link MIPI panels, similarly for dual link panels, pipe
|
||||
to be configured is based on the DVO port from VBT Block 2. In hardware,
|
||||
Port A is mapped with Pipe A and Port C is mapped with Pipe B.
|
||||
|
||||
This issue got introduced in -
|
||||
|
||||
commit 7e9804fdcffc650515c60f524b8b2076ee59e710
|
||||
Author: Jani Nikula <jani.nikula@intel.com>
|
||||
Date: Fri Jan 16 14:27:23 2015 +0200
|
||||
|
||||
drm/i915/dsi: add drm mipi dsi host support
|
||||
|
||||
Signed-off-by: Gaurav K Singh <gaurav.k.singh@intel.com>
|
||||
Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
|
||||
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
|
||||
---
|
||||
drivers/gpu/drm/i915/intel_dsi.c | 9 ++++-----
|
||||
1 file changed, 4 insertions(+), 5 deletions(-)
|
||||
|
||||
--- a/drivers/gpu/drm/i915/intel_dsi.c
|
||||
+++ b/drivers/gpu/drm/i915/intel_dsi.c
|
||||
@@ -1036,11 +1036,7 @@ void intel_dsi_init(struct drm_device *d
|
||||
intel_connector->unregister = intel_connector_unregister;
|
||||
|
||||
/* Pipe A maps to MIPI DSI port A, pipe B maps to MIPI DSI port C */
|
||||
- if (dev_priv->vbt.dsi.config->dual_link) {
|
||||
- /* XXX: does dual link work on either pipe? */
|
||||
- intel_encoder->crtc_mask = (1 << PIPE_A);
|
||||
- intel_dsi->ports = ((1 << PORT_A) | (1 << PORT_C));
|
||||
- } else if (dev_priv->vbt.dsi.port == DVO_PORT_MIPIA) {
|
||||
+ if (dev_priv->vbt.dsi.port == DVO_PORT_MIPIA) {
|
||||
intel_encoder->crtc_mask = (1 << PIPE_A);
|
||||
intel_dsi->ports = (1 << PORT_A);
|
||||
} else if (dev_priv->vbt.dsi.port == DVO_PORT_MIPIC) {
|
||||
@@ -1048,6 +1044,9 @@ void intel_dsi_init(struct drm_device *d
|
||||
intel_dsi->ports = (1 << PORT_C);
|
||||
}
|
||||
|
||||
+ if (dev_priv->vbt.dsi.config->dual_link)
|
||||
+ intel_dsi->ports = ((1 << PORT_A) | (1 << PORT_C));
|
||||
+
|
||||
/* Create a DSI host (and a device) for each port. */
|
||||
for_each_dsi_port(port, intel_dsi->ports) {
|
||||
struct intel_dsi_host *host;
|
||||
+58
@@ -0,0 +1,58 @@
|
||||
From 51bc140431e233284660b1d22c47dec9ecdb521e Mon Sep 17 00:00:00 2001
|
||||
From: Chris Wilson <chris@chris-wilson.co.uk>
|
||||
Date: Mon, 31 Aug 2015 15:10:39 +0100
|
||||
Subject: drm/i915: Always mark the object as dirty when used by the GPU
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
From: Chris Wilson <chris@chris-wilson.co.uk>
|
||||
|
||||
commit 51bc140431e233284660b1d22c47dec9ecdb521e upstream.
|
||||
|
||||
There have been many hard to track down bugs whereby userspace forgot to
|
||||
flag a write buffer and then cause graphics corruption or a hung GPU
|
||||
when that buffer was later purged under memory pressure (as the buffer
|
||||
appeared clean, its pages would have been evicted rather than preserved
|
||||
and any changes more recent than in the backing storage would be lost).
|
||||
In retrospect this is a rare optimisation against memory pressure,
|
||||
already the slow path. If we always mark the buffer as dirty when
|
||||
accessed by the GPU, anything not used can still be evicted cheaply
|
||||
(ideal behaviour for mark-and-sweep eviction) but we do not run the risk
|
||||
of corruption. For correct read serialisation, userspace still has to
|
||||
notify when the GPU writes to an object. However, there are certain
|
||||
situations under which userspace may wish to tell white lies to the
|
||||
kernel...
|
||||
|
||||
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
|
||||
Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
|
||||
Cc: Kristian Høgsberg <krh@bitplanet.net>
|
||||
Cc: Jesse Barnes <jbarnes@virtuousgeek.org>
|
||||
Cc: "Goel, Akash" <akash.goel@intel.co>
|
||||
Cc: Michał Winiarski <michal.winiarski@intel.com>
|
||||
Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch>
|
||||
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
|
||||
---
|
||||
drivers/gpu/drm/i915/i915_gem_execbuffer.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/gpu/drm/i915/i915_gem_execbuffer.c
|
||||
+++ b/drivers/gpu/drm/i915/i915_gem_execbuffer.c
|
||||
@@ -1025,6 +1025,7 @@ i915_gem_execbuffer_move_to_active(struc
|
||||
u32 old_read = obj->base.read_domains;
|
||||
u32 old_write = obj->base.write_domain;
|
||||
|
||||
+ obj->dirty = 1; /* be paranoid */
|
||||
obj->base.write_domain = obj->base.pending_write_domain;
|
||||
if (obj->base.write_domain == 0)
|
||||
obj->base.pending_read_domains |= obj->base.read_domains;
|
||||
@@ -1032,7 +1033,6 @@ i915_gem_execbuffer_move_to_active(struc
|
||||
|
||||
i915_vma_move_to_active(vma, ring);
|
||||
if (obj->base.write_domain) {
|
||||
- obj->dirty = 1;
|
||||
i915_gem_request_assign(&obj->last_write_req, req);
|
||||
|
||||
intel_fb_obj_invalidate(obj, ring, ORIGIN_CS);
|
||||
+79
@@ -0,0 +1,79 @@
|
||||
From 54875571bbfde00fc63741715c531cbb5246c3b2 Mon Sep 17 00:00:00 2001
|
||||
From: Imre Deak <imre.deak@intel.com>
|
||||
Date: Tue, 30 Jun 2015 17:06:47 +0300
|
||||
Subject: drm/i915: apply the PCI_D0/D3 hibernation workaround everywhere on pre GEN6
|
||||
|
||||
From: Imre Deak <imre.deak@intel.com>
|
||||
|
||||
commit 54875571bbfde00fc63741715c531cbb5246c3b2 upstream.
|
||||
|
||||
commit da2bc1b9db3351addd293e5b82757efe1f77ed1d
|
||||
Author: Imre Deak <imre.deak@intel.com>
|
||||
Date: Thu Oct 23 19:23:26 2014 +0300
|
||||
|
||||
drm/i915: add poweroff_late handler
|
||||
|
||||
introduced a regression on old platforms during hibernation. A workaround was
|
||||
added in
|
||||
|
||||
commit ab3be73fa7b43f4c3648ce29b5fd649ea54d3adb
|
||||
Author: Imre Deak <imre.deak@intel.com>
|
||||
Date: Mon Mar 2 13:04:41 2015 +0200
|
||||
|
||||
drm/i915: gen4: work around hang during hibernation
|
||||
|
||||
using an explicit blacklist for the GENs/BIOS vendors where the issue was
|
||||
reported. Later there we had reports of the same failure on platforms not on
|
||||
this list.
|
||||
|
||||
To my best knowledge the correct thing to do is still to put the device to PCI
|
||||
D3 state during hibernation, see [1] and [2] for the reasons. This also aligns
|
||||
with our future plans to unify more the runtime and system suspend/resume
|
||||
paths. Since an exact blacklist seems to be impractical (multiple GENs and
|
||||
BIOS vendors are affected) apply the workaround on everything pre GEN6.
|
||||
|
||||
[1] http://lists.freedesktop.org/archives/intel-gfx/2015-February/060710.html
|
||||
[2] https://lkml.org/lkml/2015/6/22/274
|
||||
|
||||
Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=95061
|
||||
Reported-by: Ilya Tumaykin <itumaykin@gmail.com>
|
||||
Reported-by: Dirk Griesbach <spamthis@freenet.de>
|
||||
Reported-by: Pavel Machek <pavel@ucw.cz>
|
||||
Reported-by: Mikko Rapeli <mikko.rapeli@iki.fi>
|
||||
Tested-by: Mikko Rapeli <mikko.rapeli@iki.fi>
|
||||
Reported-by: Paul Bolle <pebolle@tiscali.nl>
|
||||
Signed-off-by: Imre Deak <imre.deak@intel.com>
|
||||
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
|
||||
---
|
||||
drivers/gpu/drm/i915/i915_drv.c | 15 +++++++++------
|
||||
1 file changed, 9 insertions(+), 6 deletions(-)
|
||||
|
||||
--- a/drivers/gpu/drm/i915/i915_drv.c
|
||||
+++ b/drivers/gpu/drm/i915/i915_drv.c
|
||||
@@ -647,15 +647,18 @@ static int i915_drm_suspend_late(struct
|
||||
|
||||
pci_disable_device(drm_dev->pdev);
|
||||
/*
|
||||
- * During hibernation on some GEN4 platforms the BIOS may try to access
|
||||
+ * During hibernation on some platforms the BIOS may try to access
|
||||
* the device even though it's already in D3 and hang the machine. So
|
||||
* leave the device in D0 on those platforms and hope the BIOS will
|
||||
- * power down the device properly. Platforms where this was seen:
|
||||
- * Lenovo Thinkpad X301, X61s
|
||||
+ * power down the device properly. The issue was seen on multiple old
|
||||
+ * GENs with different BIOS vendors, so having an explicit blacklist
|
||||
+ * is inpractical; apply the workaround on everything pre GEN6. The
|
||||
+ * platforms where the issue was seen:
|
||||
+ * Lenovo Thinkpad X301, X61s, X60, T60, X41
|
||||
+ * Fujitsu FSC S7110
|
||||
+ * Acer Aspire 1830T
|
||||
*/
|
||||
- if (!(hibernation &&
|
||||
- drm_dev->pdev->subsystem_vendor == PCI_VENDOR_ID_LENOVO &&
|
||||
- INTEL_INFO(dev_priv)->gen == 4))
|
||||
+ if (!(hibernation && INTEL_INFO(dev_priv)->gen < 6))
|
||||
pci_set_power_state(drm_dev->pdev, PCI_D3hot);
|
||||
|
||||
return 0;
|
||||
+75
@@ -0,0 +1,75 @@
|
||||
From d14e7b6d1d8747826cb900db852351c550e00fdd Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Ville=20Syrj=C3=A4l=C3=A4?= <ville.syrjala@linux.intel.com>
|
||||
Date: Thu, 20 Aug 2015 19:37:29 +0300
|
||||
Subject: drm/i915: Check DP link status on long hpd too
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
From: =?UTF-8?q?Ville=20Syrj=C3=A4l=C3=A4?= <ville.syrjala@linux.intel.com>
|
||||
|
||||
commit d14e7b6d1d8747826cb900db852351c550e00fdd upstream.
|
||||
|
||||
We are no longer checkling the DP link status on long hpd. We used to do
|
||||
that from the .hot_plug() handler, but it was removed when MST got
|
||||
introduced.
|
||||
|
||||
If there's no userspace we now fail to retrain the link if the sink
|
||||
power is toggled (or cable yanked and replugged), meaning the user is
|
||||
left staring at a blank screen. With the retraining put back that should
|
||||
be fixed.
|
||||
|
||||
Also remove the leftover comment that referred to the old retraining
|
||||
from .hot_plug().
|
||||
|
||||
Fixes a regression introduced in:
|
||||
commit 0e32b39ceed665bfa4a77a4bc307b6652b991632
|
||||
Author: Dave Airlie <airlied@redhat.com>
|
||||
Date: Fri May 2 14:02:48 2014 +1000
|
||||
|
||||
drm/i915: add DP 1.2 MST support (v0.7)
|
||||
|
||||
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=89453
|
||||
Tested-by: Palmer Dabbelt <palmer@dabbelt.com>
|
||||
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=91407
|
||||
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=89461
|
||||
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=89594
|
||||
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=85641
|
||||
Cc: Dave Airlie <airlied@redhat.com>
|
||||
Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
|
||||
Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch>
|
||||
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
|
||||
---
|
||||
drivers/gpu/drm/i915/intel_dp.c | 11 +++++------
|
||||
1 file changed, 5 insertions(+), 6 deletions(-)
|
||||
|
||||
--- a/drivers/gpu/drm/i915/intel_dp.c
|
||||
+++ b/drivers/gpu/drm/i915/intel_dp.c
|
||||
@@ -4691,9 +4691,12 @@ intel_dp_hpd_pulse(struct intel_digital_
|
||||
|
||||
intel_dp_probe_oui(intel_dp);
|
||||
|
||||
- if (!intel_dp_probe_mst(intel_dp))
|
||||
+ if (!intel_dp_probe_mst(intel_dp)) {
|
||||
+ drm_modeset_lock(&dev->mode_config.connection_mutex, NULL);
|
||||
+ intel_dp_check_link_status(intel_dp);
|
||||
+ drm_modeset_unlock(&dev->mode_config.connection_mutex);
|
||||
goto mst_fail;
|
||||
-
|
||||
+ }
|
||||
} else {
|
||||
if (intel_dp->is_mst) {
|
||||
if (intel_dp_check_mst_status(intel_dp) == -EINVAL)
|
||||
@@ -4701,10 +4704,6 @@ intel_dp_hpd_pulse(struct intel_digital_
|
||||
}
|
||||
|
||||
if (!intel_dp->is_mst) {
|
||||
- /*
|
||||
- * we'll check the link status via the normal hot plug path later -
|
||||
- * but for short hpds we should check it now
|
||||
- */
|
||||
drm_modeset_lock(&dev->mode_config.connection_mutex, NULL);
|
||||
intel_dp_check_link_status(intel_dp);
|
||||
drm_modeset_unlock(&dev->mode_config.connection_mutex);
|
||||
+57
@@ -0,0 +1,57 @@
|
||||
From acd29f7b22262d9e848393b9b6ae13eb42d22514 Mon Sep 17 00:00:00 2001
|
||||
From: Chris Wilson <chris@chris-wilson.co.uk>
|
||||
Date: Tue, 8 Sep 2015 14:17:13 +0100
|
||||
Subject: drm/i915: Limit the number of loops for reading a split 64bit register
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
From: Chris Wilson <chris@chris-wilson.co.uk>
|
||||
|
||||
commit acd29f7b22262d9e848393b9b6ae13eb42d22514 upstream.
|
||||
|
||||
In I915_READ64_2x32 we attempt to read a 64bit register using 2 32bit
|
||||
reads. Due to the nature of the registers we try to read in this manner,
|
||||
they may increment between the two instruction (e.g. a timestamp
|
||||
counter). To keep the result accurate, we repeat the read if we detect
|
||||
an overflow (i.e. the upper value varies). However, some hardware is just
|
||||
plain flaky and may endless loop as the the upper 32bits are not stable.
|
||||
Just give up after a couple of tries and report whatever we read last.
|
||||
|
||||
v2: Use the most recent values when erring out on an unstable register.
|
||||
|
||||
Reported-by: russianneuromancer@ya.ru
|
||||
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=91906
|
||||
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
|
||||
Cc: Michał Winiarski <michal.winiarski@intel.com>
|
||||
Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
|
||||
Cc: Jani Nikula <jani.nikula@linux.intel.com>
|
||||
Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch>
|
||||
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
|
||||
---
|
||||
drivers/gpu/drm/i915/i915_drv.h | 10 +++++-----
|
||||
1 file changed, 5 insertions(+), 5 deletions(-)
|
||||
|
||||
--- a/drivers/gpu/drm/i915/i915_drv.h
|
||||
+++ b/drivers/gpu/drm/i915/i915_drv.h
|
||||
@@ -3190,13 +3190,13 @@ int intel_freq_opcode(struct drm_i915_pr
|
||||
#define I915_READ64(reg) dev_priv->uncore.funcs.mmio_readq(dev_priv, (reg), true)
|
||||
|
||||
#define I915_READ64_2x32(lower_reg, upper_reg) ({ \
|
||||
- u32 upper, lower, tmp; \
|
||||
- tmp = I915_READ(upper_reg); \
|
||||
+ u32 upper, lower, old_upper, loop = 0; \
|
||||
+ upper = I915_READ(upper_reg); \
|
||||
do { \
|
||||
- upper = tmp; \
|
||||
+ old_upper = upper; \
|
||||
lower = I915_READ(lower_reg); \
|
||||
- tmp = I915_READ(upper_reg); \
|
||||
- } while (upper != tmp); \
|
||||
+ upper = I915_READ(upper_reg); \
|
||||
+ } while (upper != old_upper && loop++ < 2); \
|
||||
(u64)upper << 32 | lower; })
|
||||
|
||||
#define POSTING_READ(reg) (void)I915_READ_NOTRACE(reg)
|
||||
@@ -0,0 +1,117 @@
|
||||
From 69f92f67b68ab7028ffe15f0eea76b59f8859383 Mon Sep 17 00:00:00 2001
|
||||
From: Lukas Wunner <lukas@wunner.de>
|
||||
Date: Wed, 15 Jul 2015 13:57:35 +0200
|
||||
Subject: drm/i915: Preserve SSC earlier
|
||||
|
||||
From: Lukas Wunner <lukas@wunner.de>
|
||||
|
||||
commit 69f92f67b68ab7028ffe15f0eea76b59f8859383 upstream.
|
||||
|
||||
Commit 92122789b2d6 ("drm/i915: preserve SSC if previously set v3")
|
||||
added code to intel_modeset_gem_init to override the SSC status read
|
||||
from VBT with the SSC status set by BIOS.
|
||||
|
||||
However, intel_modeset_gem_init is invoked *after* intel_modeset_init,
|
||||
which calls intel_setup_outputs, which *modifies* SSC status by way of
|
||||
intel_init_pch_refclk. So unlike advertised, intel_modeset_gem_init
|
||||
doesn't preserve the SSC status set by BIOS but whatever
|
||||
intel_init_pch_refclk decided on.
|
||||
|
||||
This is a problem on dual gpu laptops such as the MacBook Pro which
|
||||
require either a handler to switch DDC lines, or the discrete gpu
|
||||
to proxy DDC/AUX communication: Both the handler and the discrete
|
||||
gpu may initialize after the i915 driver, and consequently, an LVDS
|
||||
connector may initially seem disconnected and the SSC therefore
|
||||
is disabled by intel_init_pch_refclk, but on reprobe the connector
|
||||
may turn out to be connected and the SSC must then be enabled.
|
||||
|
||||
Due to 92122789b2d6 however, the SSC is not enabled on reprobe since
|
||||
it is assumed BIOS disabled it while in fact it was disabled by
|
||||
intel_init_pch_refclk.
|
||||
|
||||
Also, because the SSC status is preserved so late, the preserved value
|
||||
only ever gets used on resume but not on panel initialization:
|
||||
intel_modeset_init calls intel_init_display which indirectly calls
|
||||
intel_panel_use_ssc via multiple subroutines, *before* the BIOS value
|
||||
overrides the VBT value in intel_modeset_gem_init (intel_panel_use_ssc
|
||||
is the sole user of dev_priv->vbt.lvds_use_ssc).
|
||||
|
||||
Fix this by moving the code introduced by 92122789b2d6 from
|
||||
intel_modeset_gem_init to intel_modeset_init before the invocation
|
||||
of intel_setup_outputs and intel_init_display.
|
||||
|
||||
Add a DRM_DEBUG_KMS as suggested way back by Jani:
|
||||
http://lists.freedesktop.org/archives/intel-gfx/2014-June/046666.html
|
||||
|
||||
Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=88861
|
||||
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=61115
|
||||
Tested-by: Paul Hordiienko <pvt.gord@gmail.com>
|
||||
[MBP 6,2 2010 intel ILK + nvidia GT216 pre-retina]
|
||||
Tested-by: William Brown <william@blackhats.net.au>
|
||||
[MBP 8,2 2011 intel SNB + amd turks pre-retina]
|
||||
Tested-by: Lukas Wunner <lukas@wunner.de>
|
||||
[MBP 9,1 2012 intel IVB + nvidia GK107 pre-retina]
|
||||
Tested-by: Bruno Bierbaumer <bruno@bierbaumer.net>
|
||||
[MBP 11,3 2013 intel HSW + nvidia GK107 retina -- work in progress]
|
||||
Fixes: 92122789b2d6 ("drm/i915: preserve SSC if previously set v3")
|
||||
Signed-off-by: Lukas Wunner <lukas@wunner.de>
|
||||
Reviewed-by: Jesse Barnes <jbarnes@virtuousgeek.org>
|
||||
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
|
||||
---
|
||||
drivers/gpu/drm/i915/intel_display.c | 29 ++++++++++++++++++-----------
|
||||
1 file changed, 18 insertions(+), 11 deletions(-)
|
||||
|
||||
--- a/drivers/gpu/drm/i915/intel_display.c
|
||||
+++ b/drivers/gpu/drm/i915/intel_display.c
|
||||
@@ -13781,6 +13781,24 @@ void intel_modeset_init(struct drm_devic
|
||||
if (INTEL_INFO(dev)->num_pipes == 0)
|
||||
return;
|
||||
|
||||
+ /*
|
||||
+ * There may be no VBT; and if the BIOS enabled SSC we can
|
||||
+ * just keep using it to avoid unnecessary flicker. Whereas if the
|
||||
+ * BIOS isn't using it, don't assume it will work even if the VBT
|
||||
+ * indicates as much.
|
||||
+ */
|
||||
+ if (HAS_PCH_IBX(dev) || HAS_PCH_CPT(dev)) {
|
||||
+ bool bios_lvds_use_ssc = !!(I915_READ(PCH_DREF_CONTROL) &
|
||||
+ DREF_SSC1_ENABLE);
|
||||
+
|
||||
+ if (dev_priv->vbt.lvds_use_ssc != bios_lvds_use_ssc) {
|
||||
+ DRM_DEBUG_KMS("SSC %sabled by BIOS, overriding VBT which says %sabled\n",
|
||||
+ bios_lvds_use_ssc ? "en" : "dis",
|
||||
+ dev_priv->vbt.lvds_use_ssc ? "en" : "dis");
|
||||
+ dev_priv->vbt.lvds_use_ssc = bios_lvds_use_ssc;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
intel_init_display(dev);
|
||||
intel_init_audio(dev);
|
||||
|
||||
@@ -14266,7 +14284,6 @@ void intel_modeset_setup_hw_state(struct
|
||||
|
||||
void intel_modeset_gem_init(struct drm_device *dev)
|
||||
{
|
||||
- struct drm_i915_private *dev_priv = dev->dev_private;
|
||||
struct drm_crtc *c;
|
||||
struct drm_i915_gem_object *obj;
|
||||
int ret;
|
||||
@@ -14275,16 +14292,6 @@ void intel_modeset_gem_init(struct drm_d
|
||||
intel_init_gt_powersave(dev);
|
||||
mutex_unlock(&dev->struct_mutex);
|
||||
|
||||
- /*
|
||||
- * There may be no VBT; and if the BIOS enabled SSC we can
|
||||
- * just keep using it to avoid unnecessary flicker. Whereas if the
|
||||
- * BIOS isn't using it, don't assume it will work even if the VBT
|
||||
- * indicates as much.
|
||||
- */
|
||||
- if (HAS_PCH_IBX(dev) || HAS_PCH_CPT(dev))
|
||||
- dev_priv->vbt.lvds_use_ssc = !!(I915_READ(PCH_DREF_CONTROL) &
|
||||
- DREF_SSC1_ENABLE);
|
||||
-
|
||||
intel_modeset_init_hw(dev);
|
||||
|
||||
intel_setup_overlay(dev);
|
||||
+147
@@ -0,0 +1,147 @@
|
||||
From bd3e1c7c6de9f5f70d97cdb6c817151c0477c5e3 Mon Sep 17 00:00:00 2001
|
||||
From: Jonathon Jongsma <jjongsma@redhat.com>
|
||||
Date: Thu, 20 Aug 2015 14:04:32 -0500
|
||||
Subject: drm/qxl: validate monitors config modes
|
||||
|
||||
From: Jonathon Jongsma <jjongsma@redhat.com>
|
||||
|
||||
commit bd3e1c7c6de9f5f70d97cdb6c817151c0477c5e3 upstream.
|
||||
|
||||
Due to some recent changes in
|
||||
drm_helper_probe_single_connector_modes_merge_bits(), old custom modes
|
||||
were not being pruned properly. In current kernels,
|
||||
drm_mode_validate_basic() is called to sanity-check each mode in the
|
||||
list. If the sanity-check passes, the mode's status gets set to to
|
||||
MODE_OK. In older kernels this check was not done, so old custom modes
|
||||
would still have a status of MODE_UNVERIFIED at this point, and would
|
||||
therefore be pruned later in the function.
|
||||
|
||||
As a result of this new behavior, the list of modes for a device always
|
||||
includes every custom mode ever configured for the device, with the
|
||||
largest one listed first. Since desktop environments usually choose the
|
||||
first preferred mode when a hotplug event is emitted, this had the
|
||||
result of making it very difficult for the user to reduce the size of
|
||||
the display.
|
||||
|
||||
The qxl driver did implement the mode_valid connector function, but it
|
||||
was empty. In order to restore the old behavior where old custom modes
|
||||
are pruned, we implement a proper mode_valid function for the qxl
|
||||
driver. This function now checks each mode against the last configured
|
||||
custom mode and the list of standard modes. If the mode doesn't match
|
||||
any of these, its status is set to MODE_BAD so that it will be pruned as
|
||||
expected.
|
||||
|
||||
Signed-off-by: Jonathon Jongsma <jjongsma@redhat.com>
|
||||
Signed-off-by: Dave Airlie <airlied@redhat.com>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
|
||||
---
|
||||
drivers/gpu/drm/qxl/qxl_display.c | 66 +++++++++++++++++++++++---------------
|
||||
drivers/gpu/drm/qxl/qxl_drv.h | 2 +
|
||||
2 files changed, 42 insertions(+), 26 deletions(-)
|
||||
|
||||
--- a/drivers/gpu/drm/qxl/qxl_display.c
|
||||
+++ b/drivers/gpu/drm/qxl/qxl_display.c
|
||||
@@ -160,9 +160,35 @@ static int qxl_add_monitors_config_modes
|
||||
*pwidth = head->width;
|
||||
*pheight = head->height;
|
||||
drm_mode_probed_add(connector, mode);
|
||||
+ /* remember the last custom size for mode validation */
|
||||
+ qdev->monitors_config_width = mode->hdisplay;
|
||||
+ qdev->monitors_config_height = mode->vdisplay;
|
||||
return 1;
|
||||
}
|
||||
|
||||
+static struct mode_size {
|
||||
+ int w;
|
||||
+ int h;
|
||||
+} common_modes[] = {
|
||||
+ { 640, 480},
|
||||
+ { 720, 480},
|
||||
+ { 800, 600},
|
||||
+ { 848, 480},
|
||||
+ {1024, 768},
|
||||
+ {1152, 768},
|
||||
+ {1280, 720},
|
||||
+ {1280, 800},
|
||||
+ {1280, 854},
|
||||
+ {1280, 960},
|
||||
+ {1280, 1024},
|
||||
+ {1440, 900},
|
||||
+ {1400, 1050},
|
||||
+ {1680, 1050},
|
||||
+ {1600, 1200},
|
||||
+ {1920, 1080},
|
||||
+ {1920, 1200}
|
||||
+};
|
||||
+
|
||||
static int qxl_add_common_modes(struct drm_connector *connector,
|
||||
unsigned pwidth,
|
||||
unsigned pheight)
|
||||
@@ -170,29 +196,6 @@ static int qxl_add_common_modes(struct d
|
||||
struct drm_device *dev = connector->dev;
|
||||
struct drm_display_mode *mode = NULL;
|
||||
int i;
|
||||
- struct mode_size {
|
||||
- int w;
|
||||
- int h;
|
||||
- } common_modes[] = {
|
||||
- { 640, 480},
|
||||
- { 720, 480},
|
||||
- { 800, 600},
|
||||
- { 848, 480},
|
||||
- {1024, 768},
|
||||
- {1152, 768},
|
||||
- {1280, 720},
|
||||
- {1280, 800},
|
||||
- {1280, 854},
|
||||
- {1280, 960},
|
||||
- {1280, 1024},
|
||||
- {1440, 900},
|
||||
- {1400, 1050},
|
||||
- {1680, 1050},
|
||||
- {1600, 1200},
|
||||
- {1920, 1080},
|
||||
- {1920, 1200}
|
||||
- };
|
||||
-
|
||||
for (i = 0; i < ARRAY_SIZE(common_modes); i++) {
|
||||
mode = drm_cvt_mode(dev, common_modes[i].w, common_modes[i].h,
|
||||
60, false, false, false);
|
||||
@@ -823,11 +826,22 @@ static int qxl_conn_get_modes(struct drm
|
||||
static int qxl_conn_mode_valid(struct drm_connector *connector,
|
||||
struct drm_display_mode *mode)
|
||||
{
|
||||
+ struct drm_device *ddev = connector->dev;
|
||||
+ struct qxl_device *qdev = ddev->dev_private;
|
||||
+ int i;
|
||||
+
|
||||
/* TODO: is this called for user defined modes? (xrandr --add-mode)
|
||||
* TODO: check that the mode fits in the framebuffer */
|
||||
- DRM_DEBUG("%s: %dx%d status=%d\n", mode->name, mode->hdisplay,
|
||||
- mode->vdisplay, mode->status);
|
||||
- return MODE_OK;
|
||||
+
|
||||
+ if(qdev->monitors_config_width == mode->hdisplay &&
|
||||
+ qdev->monitors_config_height == mode->vdisplay)
|
||||
+ return MODE_OK;
|
||||
+
|
||||
+ for (i = 0; i < ARRAY_SIZE(common_modes); i++) {
|
||||
+ if (common_modes[i].w == mode->hdisplay && common_modes[i].h == mode->vdisplay)
|
||||
+ return MODE_OK;
|
||||
+ }
|
||||
+ return MODE_BAD;
|
||||
}
|
||||
|
||||
static struct drm_encoder *qxl_best_encoder(struct drm_connector *connector)
|
||||
--- a/drivers/gpu/drm/qxl/qxl_drv.h
|
||||
+++ b/drivers/gpu/drm/qxl/qxl_drv.h
|
||||
@@ -325,6 +325,8 @@ struct qxl_device {
|
||||
struct work_struct fb_work;
|
||||
|
||||
struct drm_property *hotplug_mode_update_property;
|
||||
+ int monitors_config_width;
|
||||
+ int monitors_config_height;
|
||||
};
|
||||
|
||||
/* forward declaration for QXL_INFO_IO */
|
||||
@@ -1,26 +0,0 @@
|
||||
From e037239e5e7b61007763984aa35a8329596d8c88 Mon Sep 17 00:00:00 2001
|
||||
From: Alex Deucher <alexander.deucher@amd.com>
|
||||
Date: Mon, 10 Aug 2015 15:28:49 -0400
|
||||
Subject: drm/radeon: add new OLAND pci id
|
||||
|
||||
From: Alex Deucher <alexander.deucher@amd.com>
|
||||
|
||||
commit e037239e5e7b61007763984aa35a8329596d8c88 upstream.
|
||||
|
||||
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
|
||||
---
|
||||
include/drm/drm_pciids.h | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
--- a/include/drm/drm_pciids.h
|
||||
+++ b/include/drm/drm_pciids.h
|
||||
@@ -172,6 +172,7 @@
|
||||
{0x1002, 0x6610, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_OLAND|RADEON_NEW_MEMMAP}, \
|
||||
{0x1002, 0x6611, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_OLAND|RADEON_NEW_MEMMAP}, \
|
||||
{0x1002, 0x6613, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_OLAND|RADEON_NEW_MEMMAP}, \
|
||||
+ {0x1002, 0x6617, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_OLAND|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \
|
||||
{0x1002, 0x6620, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_OLAND|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \
|
||||
{0x1002, 0x6621, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_OLAND|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \
|
||||
{0x1002, 0x6623, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_OLAND|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \
|
||||
+39
@@ -0,0 +1,39 @@
|
||||
From 3f8340cc72c9a1a4b49bce7802afd7f248400ef5 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Ville=20Syrj=C3=A4l=C3=A4?= <ville.syrjala@linux.intel.com>
|
||||
Date: Thu, 27 Aug 2015 17:23:31 +0300
|
||||
Subject: drm/radeon/atom: Send out the full AUX address
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
From: =?UTF-8?q?Ville=20Syrj=C3=A4l=C3=A4?= <ville.syrjala@linux.intel.com>
|
||||
|
||||
commit 3f8340cc72c9a1a4b49bce7802afd7f248400ef5 upstream.
|
||||
|
||||
AUX addresses are 20 bits long. Send out the entire address instead of
|
||||
just the low 16 bits.
|
||||
|
||||
Cc: Alex Deucher <alexander.deucher@amd.com>
|
||||
Cc: "Christian König" <christian.koenig@amd.com>
|
||||
Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
|
||||
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
|
||||
---
|
||||
drivers/gpu/drm/radeon/atombios_dp.c | 5 +++--
|
||||
1 file changed, 3 insertions(+), 2 deletions(-)
|
||||
|
||||
--- a/drivers/gpu/drm/radeon/atombios_dp.c
|
||||
+++ b/drivers/gpu/drm/radeon/atombios_dp.c
|
||||
@@ -171,8 +171,9 @@ radeon_dp_aux_transfer_atom(struct drm_d
|
||||
return -E2BIG;
|
||||
|
||||
tx_buf[0] = msg->address & 0xff;
|
||||
- tx_buf[1] = msg->address >> 8;
|
||||
- tx_buf[2] = msg->request << 4;
|
||||
+ tx_buf[1] = (msg->address >> 8) & 0xff;
|
||||
+ tx_buf[2] = (msg->request << 4) |
|
||||
+ ((msg->address >> 16) & 0xf);
|
||||
tx_buf[3] = msg->size ? (msg->size - 1) : 0;
|
||||
|
||||
switch (msg->request & ~DP_AUX_I2C_MOT) {
|
||||
+75
@@ -0,0 +1,75 @@
|
||||
From 924f92bf12bfbef3662619e3ed24a1cea7c1cbcd Mon Sep 17 00:00:00 2001
|
||||
From: Stephen Chandler Paul <cpaul@redhat.com>
|
||||
Date: Fri, 21 Aug 2015 14:16:12 -0400
|
||||
Subject: DRM - radeon: Don't link train DisplayPort on HPD until we get the dpcd
|
||||
|
||||
From: Stephen Chandler Paul <cpaul@redhat.com>
|
||||
|
||||
commit 924f92bf12bfbef3662619e3ed24a1cea7c1cbcd upstream.
|
||||
|
||||
Most of the time this isn't an issue since hotplugging an adaptor will
|
||||
trigger a crtc mode change which in turn, causes the driver to probe
|
||||
every DisplayPort for a dpcd. However, in cases where hotplugging
|
||||
doesn't cause a mode change (specifically when one unplugs a monitor
|
||||
from a DisplayPort connector, then plugs that same monitor back in
|
||||
seconds later on the same port without any other monitors connected), we
|
||||
never probe for the dpcd before starting the initial link training. What
|
||||
happens from there looks like this:
|
||||
|
||||
- GPU has only one monitor connected. It's connected via
|
||||
DisplayPort, and does not go through an adaptor of any sort.
|
||||
|
||||
- User unplugs DisplayPort connector from GPU.
|
||||
|
||||
- Change in HPD is detected by the driver, we probe every
|
||||
DisplayPort for a possible connection.
|
||||
|
||||
- Probe the port the user originally had the monitor connected
|
||||
on for it's dpcd. This fails, and we clear the first (and only
|
||||
the first) byte of the dpcd to indicate we no longer have a
|
||||
dpcd for this port.
|
||||
|
||||
- User plugs the previously disconnected monitor back into the
|
||||
same DisplayPort.
|
||||
|
||||
- radeon_connector_hotplug() is called before everyone else,
|
||||
and tries to handle the link training. Since only the first
|
||||
byte of the dpcd is zeroed, the driver is able to complete
|
||||
link training but does so against the wrong dpcd, causing it
|
||||
to initialize the link with the wrong settings.
|
||||
|
||||
- Display stays blank (usually), dpcd is probed after the
|
||||
initial link training, and the driver prints no obvious
|
||||
messages to the log.
|
||||
|
||||
In theory, since only one byte of the dpcd is chopped off (specifically,
|
||||
the byte that contains the revision information for DisplayPort), it's
|
||||
not entirely impossible that this bug may not show on certain monitors.
|
||||
For instance, the only reason this bug was visible on my ASUS PB238
|
||||
monitor was due to the fact that this monitor using the enhanced framing
|
||||
symbol sequence, the flag for which is ignored if the radeon driver
|
||||
thinks that the DisplayPort version is below 1.1.
|
||||
|
||||
Signed-off-by: Stephen Chandler Paul <cpaul@redhat.com>
|
||||
Reviewed-by: Jerome Glisse <jglisse@redhat.com>
|
||||
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
|
||||
---
|
||||
drivers/gpu/drm/radeon/radeon_connectors.c | 5 +++++
|
||||
1 file changed, 5 insertions(+)
|
||||
|
||||
--- a/drivers/gpu/drm/radeon/radeon_connectors.c
|
||||
+++ b/drivers/gpu/drm/radeon/radeon_connectors.c
|
||||
@@ -95,6 +95,11 @@ void radeon_connector_hotplug(struct drm
|
||||
if (!radeon_hpd_sense(rdev, radeon_connector->hpd.hpd)) {
|
||||
drm_helper_connector_dpms(connector, DRM_MODE_DPMS_OFF);
|
||||
} else if (radeon_dp_needs_link_train(radeon_connector)) {
|
||||
+ /* Don't try to start link training before we
|
||||
+ * have the dpcd */
|
||||
+ if (!radeon_dp_getdpcd(radeon_connector))
|
||||
+ return;
|
||||
+
|
||||
/* set it to OFF so that drm_helper_connector_dpms()
|
||||
* won't return immediately since the current state
|
||||
* is ON at this point.
|
||||
+47
@@ -0,0 +1,47 @@
|
||||
From 86b7709d48f0df8796bddd7e1ce45c6fb7a7c6ec Mon Sep 17 00:00:00 2001
|
||||
From: Alex Deucher <alexander.deucher@amd.com>
|
||||
Date: Thu, 27 Aug 2015 09:52:22 -0400
|
||||
Subject: drm/radeon: fix HDMI quantization_range for pre-DCE5 asics
|
||||
|
||||
From: Alex Deucher <alexander.deucher@amd.com>
|
||||
|
||||
commit 86b7709d48f0df8796bddd7e1ce45c6fb7a7c6ec upstream.
|
||||
|
||||
Support for output_csc is only available on DCE5 and newer so
|
||||
don't mess with the HDMI quantization_range on pre-DCE5 asics.
|
||||
|
||||
bug:
|
||||
https://bugs.freedesktop.org/show_bug.cgi?id=83226
|
||||
|
||||
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
|
||||
---
|
||||
drivers/gpu/drm/radeon/radeon_audio.c | 16 +++++++++-------
|
||||
1 file changed, 9 insertions(+), 7 deletions(-)
|
||||
|
||||
--- a/drivers/gpu/drm/radeon/radeon_audio.c
|
||||
+++ b/drivers/gpu/drm/radeon/radeon_audio.c
|
||||
@@ -522,13 +522,15 @@ static int radeon_audio_set_avi_packet(s
|
||||
return err;
|
||||
}
|
||||
|
||||
- if (drm_rgb_quant_range_selectable(radeon_connector_edid(connector))) {
|
||||
- if (radeon_encoder->output_csc == RADEON_OUTPUT_CSC_TVRGB)
|
||||
- frame.quantization_range = HDMI_QUANTIZATION_RANGE_LIMITED;
|
||||
- else
|
||||
- frame.quantization_range = HDMI_QUANTIZATION_RANGE_FULL;
|
||||
- } else {
|
||||
- frame.quantization_range = HDMI_QUANTIZATION_RANGE_DEFAULT;
|
||||
+ if (radeon_encoder->output_csc != RADEON_OUTPUT_CSC_BYPASS) {
|
||||
+ if (drm_rgb_quant_range_selectable(radeon_connector_edid(connector))) {
|
||||
+ if (radeon_encoder->output_csc == RADEON_OUTPUT_CSC_TVRGB)
|
||||
+ frame.quantization_range = HDMI_QUANTIZATION_RANGE_LIMITED;
|
||||
+ else
|
||||
+ frame.quantization_range = HDMI_QUANTIZATION_RANGE_FULL;
|
||||
+ } else {
|
||||
+ frame.quantization_range = HDMI_QUANTIZATION_RANGE_DEFAULT;
|
||||
+ }
|
||||
}
|
||||
|
||||
err = hdmi_avi_infoframe_pack(&frame, buffer, sizeof(buffer));
|
||||
+40
@@ -0,0 +1,40 @@
|
||||
From 7040c399aea2b0213a9aefd73e507369a6d641d6 Mon Sep 17 00:00:00 2001
|
||||
From: Alex Deucher <alexander.deucher@amd.com>
|
||||
Date: Mon, 31 Aug 2015 11:15:05 -0400
|
||||
Subject: drm/radeon/native: Send out the full AUX address
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
From: Alex Deucher <alexander.deucher@amd.com>
|
||||
|
||||
commit 7040c399aea2b0213a9aefd73e507369a6d641d6 upstream.
|
||||
|
||||
AUX addresses are 20 bits long. Send out the entire address instead of
|
||||
just the low 16 bits.
|
||||
|
||||
Port of:
|
||||
drm/radeon/atom: Send out the full AUX address
|
||||
to radeon non-atom aux path
|
||||
|
||||
Reviewed-by: Christian König <christian.koenig@amd.com>
|
||||
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
|
||||
---
|
||||
drivers/gpu/drm/radeon/radeon_dp_auxch.c | 4 ++--
|
||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
--- a/drivers/gpu/drm/radeon/radeon_dp_auxch.c
|
||||
+++ b/drivers/gpu/drm/radeon/radeon_dp_auxch.c
|
||||
@@ -116,8 +116,8 @@ radeon_dp_aux_transfer_native(struct drm
|
||||
AUX_SW_WR_BYTES(bytes));
|
||||
|
||||
/* write the data header into the registers */
|
||||
- /* request, addres, msg size */
|
||||
- byte = (msg->request << 4);
|
||||
+ /* request, address, msg size */
|
||||
+ byte = (msg->request << 4) | ((msg->address >> 16) & 0xf);
|
||||
WREG32(AUX_SW_DATA + aux_offset[instance],
|
||||
AUX_SW_DATA_MASK(byte) | AUX_SW_AUTOINCREMENT_DISABLE);
|
||||
|
||||
@@ -1,60 +0,0 @@
|
||||
From 3e04e2fe6d87807d27521ad6ebb9e7919d628f25 Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Hellstrom <thellstrom@vmware.com>
|
||||
Date: Tue, 11 Aug 2015 22:31:17 -0700
|
||||
Subject: drm/vmwgfx: Fix execbuf locking issues
|
||||
|
||||
From: Thomas Hellstrom <thellstrom@vmware.com>
|
||||
|
||||
commit 3e04e2fe6d87807d27521ad6ebb9e7919d628f25 upstream.
|
||||
|
||||
This addresses two issues that cause problems with viewperf maya-03 in
|
||||
situation with memory pressure.
|
||||
|
||||
The first issue causes attempts to unreserve buffers if batched
|
||||
reservation fails due to, for example, a signal pending. While previously
|
||||
the ttm_eu api was resistant against this type of error, it is no longer
|
||||
and the lockdep code will complain about attempting to unreserve buffers
|
||||
that are not reserved. The issue is resolved by avoid calling
|
||||
ttm_eu_backoff_reservation in the buffer reserve error path.
|
||||
|
||||
The second issue is that the binding_mutex may be held when user-space
|
||||
fence objects are created and hence during memory reclaims. This may cause
|
||||
recursive attempts to grab the binding mutex. The issue is resolved by not
|
||||
holding the binding mutex across fence creation and submission.
|
||||
|
||||
Signed-off-by: Thomas Hellstrom <thellstrom@vmware.com>
|
||||
Reviewed-by: Sinclair Yeh <syeh@vmware.com>
|
||||
Signed-off-by: Dave Airlie <airlied@redhat.com>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
|
||||
---
|
||||
drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c | 4 ++--
|
||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c
|
||||
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c
|
||||
@@ -2492,7 +2492,7 @@ int vmw_execbuf_process(struct drm_file
|
||||
ret = ttm_eu_reserve_buffers(&ticket, &sw_context->validate_nodes,
|
||||
true, NULL);
|
||||
if (unlikely(ret != 0))
|
||||
- goto out_err;
|
||||
+ goto out_err_nores;
|
||||
|
||||
ret = vmw_validate_buffers(dev_priv, sw_context);
|
||||
if (unlikely(ret != 0))
|
||||
@@ -2536,6 +2536,7 @@ int vmw_execbuf_process(struct drm_file
|
||||
vmw_resource_relocations_free(&sw_context->res_relocations);
|
||||
|
||||
vmw_fifo_commit(dev_priv, command_size);
|
||||
+ mutex_unlock(&dev_priv->binding_mutex);
|
||||
|
||||
vmw_query_bo_switch_commit(dev_priv, sw_context);
|
||||
ret = vmw_execbuf_fence_commands(file_priv, dev_priv,
|
||||
@@ -2551,7 +2552,6 @@ int vmw_execbuf_process(struct drm_file
|
||||
DRM_ERROR("Fence submission error. Syncing.\n");
|
||||
|
||||
vmw_resource_list_unreserve(&sw_context->resource_list, false);
|
||||
- mutex_unlock(&dev_priv->binding_mutex);
|
||||
|
||||
ttm_eu_fence_buffer_objects(&ticket, &sw_context->validate_nodes,
|
||||
(void *) fence);
|
||||
-39
@@ -1,39 +0,0 @@
|
||||
From 5c16179b550b9fd8114637a56b153c9768ea06a5 Mon Sep 17 00:00:00 2001
|
||||
From: Michael Walle <michael@walle.cc>
|
||||
Date: Tue, 21 Jul 2015 11:00:53 +0200
|
||||
Subject: EDAC, ppc4xx: Access mci->csrows array elements properly
|
||||
|
||||
From: Michael Walle <michael@walle.cc>
|
||||
|
||||
commit 5c16179b550b9fd8114637a56b153c9768ea06a5 upstream.
|
||||
|
||||
The commit
|
||||
|
||||
de3910eb79ac ("edac: change the mem allocation scheme to
|
||||
make Documentation/kobject.txt happy")
|
||||
|
||||
changed the memory allocation for the csrows member. But ppc4xx_edac was
|
||||
forgotten in the patch. Fix it.
|
||||
|
||||
Signed-off-by: Michael Walle <michael@walle.cc>
|
||||
Cc: linux-edac <linux-edac@vger.kernel.org>
|
||||
Cc: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
|
||||
Link: http://lkml.kernel.org/r/1437469253-8611-1-git-send-email-michael@walle.cc
|
||||
Signed-off-by: Borislav Petkov <bp@suse.de>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
|
||||
---
|
||||
drivers/edac/ppc4xx_edac.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/edac/ppc4xx_edac.c
|
||||
+++ b/drivers/edac/ppc4xx_edac.c
|
||||
@@ -920,7 +920,7 @@ static int ppc4xx_edac_init_csrows(struc
|
||||
*/
|
||||
|
||||
for (row = 0; row < mci->nr_csrows; row++) {
|
||||
- struct csrow_info *csi = &mci->csrows[row];
|
||||
+ struct csrow_info *csi = mci->csrows[row];
|
||||
|
||||
/*
|
||||
* Get the configuration settings for this
|
||||
-52
@@ -1,52 +0,0 @@
|
||||
From 0621809e37936e7c2b3eac9165cf2aad7f9189eb Mon Sep 17 00:00:00 2001
|
||||
From: Krzysztof Kozlowski <k.kozlowski@samsung.com>
|
||||
Date: Mon, 3 Aug 2015 14:57:30 +0900
|
||||
Subject: HID: hid-input: Fix accessing freed memory during device disconnect
|
||||
|
||||
From: Krzysztof Kozlowski <k.kozlowski@samsung.com>
|
||||
|
||||
commit 0621809e37936e7c2b3eac9165cf2aad7f9189eb upstream.
|
||||
|
||||
During unbinding the driver was dereferencing a pointer to memory
|
||||
already freed by power_supply_unregister().
|
||||
|
||||
Driver was freeing its internal description of battery through pointers
|
||||
stored in power_supply structure. However, because the core owns the
|
||||
power supply instance, after calling power_supply_unregister() this
|
||||
memory is freed and the driver cannot access these members.
|
||||
|
||||
Fix this by storing the pointer to internal description of battery in a
|
||||
local variable before calling power_supply_unregister(), so the pointer
|
||||
remains valid.
|
||||
|
||||
Signed-off-by: Krzysztof Kozlowski <k.kozlowski@samsung.com>
|
||||
Reported-by: H.J. Lu <hjl.tools@gmail.com>
|
||||
Fixes: 297d716f6260 ("power_supply: Change ownership from driver to core")
|
||||
Reviewed-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
|
||||
Signed-off-by: Jiri Kosina <jkosina@suse.com>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
|
||||
---
|
||||
drivers/hid/hid-input.c | 7 +++++--
|
||||
1 file changed, 5 insertions(+), 2 deletions(-)
|
||||
|
||||
--- a/drivers/hid/hid-input.c
|
||||
+++ b/drivers/hid/hid-input.c
|
||||
@@ -462,12 +462,15 @@ out:
|
||||
|
||||
static void hidinput_cleanup_battery(struct hid_device *dev)
|
||||
{
|
||||
+ const struct power_supply_desc *psy_desc;
|
||||
+
|
||||
if (!dev->battery)
|
||||
return;
|
||||
|
||||
+ psy_desc = dev->battery->desc;
|
||||
power_supply_unregister(dev->battery);
|
||||
- kfree(dev->battery->desc->name);
|
||||
- kfree(dev->battery->desc);
|
||||
+ kfree(psy_desc->name);
|
||||
+ kfree(psy_desc);
|
||||
dev->battery = NULL;
|
||||
}
|
||||
#else /* !CONFIG_HID_BATTERY_STRENGTH */
|
||||
-33
@@ -1,33 +0,0 @@
|
||||
From 4a8e70f5d0d80675fc17b9ba1e62db8ca6b91775 Mon Sep 17 00:00:00 2001
|
||||
From: Dan Carpenter <dan.carpenter@oracle.com>
|
||||
Date: Wed, 29 Jul 2015 13:16:06 +0300
|
||||
Subject: HID: uclogic: fix limit in uclogic_tablet_enable()
|
||||
|
||||
From: Dan Carpenter <dan.carpenter@oracle.com>
|
||||
|
||||
commit 4a8e70f5d0d80675fc17b9ba1e62db8ca6b91775 upstream.
|
||||
|
||||
The limit should be ARRAY_SIZE(params) (5 elements) here instead of
|
||||
sizeof(params) (20 bytes).
|
||||
|
||||
Fixes: 08177f40bd00 ('HID: uclogic: merge hid-huion driver in hid-uclogic')
|
||||
Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
|
||||
Reviewed-by: Nikolai Kondrashov <spbnick@gmail.com>
|
||||
Signed-off-by: Jiri Kosina <jkosina@suse.com>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
|
||||
---
|
||||
drivers/hid/hid-uclogic.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/hid/hid-uclogic.c
|
||||
+++ b/drivers/hid/hid-uclogic.c
|
||||
@@ -858,7 +858,7 @@ static int uclogic_tablet_enable(struct
|
||||
for (p = drvdata->rdesc;
|
||||
p <= drvdata->rdesc + drvdata->rsize - 4;) {
|
||||
if (p[0] == 0xFE && p[1] == 0xED && p[2] == 0x1D &&
|
||||
- p[3] < sizeof(params)) {
|
||||
+ p[3] < ARRAY_SIZE(params)) {
|
||||
v = params[p[3]];
|
||||
put_unaligned(cpu_to_le32(v), (s32 *)p);
|
||||
p += 4;
|
||||
+70
@@ -0,0 +1,70 @@
|
||||
From c689a923c867eac40ed3826c1d9328edea8b6bc7 Mon Sep 17 00:00:00 2001
|
||||
From: Lars-Peter Clausen <lars@metafoo.de>
|
||||
Date: Wed, 5 Aug 2015 15:38:14 +0200
|
||||
Subject: iio: Add inverse unit conversion macros
|
||||
|
||||
From: Lars-Peter Clausen <lars@metafoo.de>
|
||||
|
||||
commit c689a923c867eac40ed3826c1d9328edea8b6bc7 upstream.
|
||||
|
||||
Add inverse unit conversion macro to convert from standard IIO units to
|
||||
units that might be used by some devices.
|
||||
|
||||
Those are useful in combination with scale factors that are specified as
|
||||
IIO_VAL_FRACTIONAL. Typically the denominator for those specifications will
|
||||
contain the maximum raw value the sensor will generate and the numerator
|
||||
the value it maps to in a specific unit. Sometimes datasheets specify those
|
||||
in different units than the standard IIO units (e.g. degree/s instead of
|
||||
rad/s) and so we need to do a unit conversion.
|
||||
|
||||
From a mathematical point of view it does not make a difference whether we
|
||||
apply the unit conversion to the numerator or the inverse unit conversion
|
||||
to the denominator since (x / y) / z = x / (y * z). But as the denominator
|
||||
is typically a larger value and we are rounding both the numerator and
|
||||
denominator to integer values using the later method gives us a better
|
||||
precision (E.g. the relative error is smaller if we round 8000.3 to 8000
|
||||
rather than rounding 8.3 to 8).
|
||||
|
||||
This is where in inverse unit conversion macros will be used.
|
||||
|
||||
Marked for stable as used by some upcoming fixes.
|
||||
|
||||
Signed-off-by: Lars-Peter Clausen <lars@metafoo.de>
|
||||
Signed-off-by: Jonathan Cameron <jic23@kernel.org>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
|
||||
---
|
||||
include/linux/iio/iio.h | 17 +++++++++++++++++
|
||||
1 file changed, 17 insertions(+)
|
||||
|
||||
--- a/include/linux/iio/iio.h
|
||||
+++ b/include/linux/iio/iio.h
|
||||
@@ -642,6 +642,15 @@ int iio_str_to_fixpoint(const char *str,
|
||||
#define IIO_DEGREE_TO_RAD(deg) (((deg) * 314159ULL + 9000000ULL) / 18000000ULL)
|
||||
|
||||
/**
|
||||
+ * IIO_RAD_TO_DEGREE() - Convert rad to degree
|
||||
+ * @rad: A value in rad
|
||||
+ *
|
||||
+ * Returns the given value converted from rad to degree
|
||||
+ */
|
||||
+#define IIO_RAD_TO_DEGREE(rad) \
|
||||
+ (((rad) * 18000000ULL + 314159ULL / 2) / 314159ULL)
|
||||
+
|
||||
+/**
|
||||
* IIO_G_TO_M_S_2() - Convert g to meter / second**2
|
||||
* @g: A value in g
|
||||
*
|
||||
@@ -649,4 +658,12 @@ int iio_str_to_fixpoint(const char *str,
|
||||
*/
|
||||
#define IIO_G_TO_M_S_2(g) ((g) * 980665ULL / 100000ULL)
|
||||
|
||||
+/**
|
||||
+ * IIO_M_S_2_TO_G() - Convert meter / second**2 to g
|
||||
+ * @ms2: A value in meter / second**2
|
||||
+ *
|
||||
+ * Returns the given value converted from meter / second**2 to g
|
||||
+ */
|
||||
+#define IIO_M_S_2_TO_G(ms2) (((ms2) * 100000ULL + 980665ULL / 2) / 980665ULL)
|
||||
+
|
||||
#endif /* _INDUSTRIAL_IO_H_ */
|
||||
+30
@@ -0,0 +1,30 @@
|
||||
From 8166537283b31d7abaae9e56bd48fbbc30cdc579 Mon Sep 17 00:00:00 2001
|
||||
From: Lars-Peter Clausen <lars@metafoo.de>
|
||||
Date: Wed, 5 Aug 2015 15:38:13 +0200
|
||||
Subject: iio: adis16400: Fix adis16448 gyroscope scale
|
||||
|
||||
From: Lars-Peter Clausen <lars@metafoo.de>
|
||||
|
||||
commit 8166537283b31d7abaae9e56bd48fbbc30cdc579 upstream.
|
||||
|
||||
Use the correct scale for the adis16448 gyroscope output.
|
||||
|
||||
Signed-off-by: Lars-Peter Clausen <lars@metafoo.de>
|
||||
Signed-off-by: Jonathan Cameron <jic23@kernel.org>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
|
||||
---
|
||||
drivers/iio/imu/adis16400_core.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/iio/imu/adis16400_core.c
|
||||
+++ b/drivers/iio/imu/adis16400_core.c
|
||||
@@ -780,7 +780,7 @@ static struct adis16400_chip_info adis16
|
||||
.flags = ADIS16400_HAS_PROD_ID |
|
||||
ADIS16400_HAS_SERIAL_NUMBER |
|
||||
ADIS16400_BURST_DIAG_STAT,
|
||||
- .gyro_scale_micro = IIO_DEGREE_TO_RAD(10000), /* 0.01 deg/s */
|
||||
+ .gyro_scale_micro = IIO_DEGREE_TO_RAD(40000), /* 0.04 deg/s */
|
||||
.accel_scale_micro = IIO_G_TO_M_S_2(833), /* 1/1200 g */
|
||||
.temp_scale_nano = 73860000, /* 0.07386 C */
|
||||
.temp_offset = 31000000 / 73860, /* 31 C = 0x00 */
|
||||
@@ -0,0 +1,101 @@
|
||||
From 7abad1063deb0f77d275c61f58863ec319c58c5c Mon Sep 17 00:00:00 2001
|
||||
From: Lars-Peter Clausen <lars@metafoo.de>
|
||||
Date: Wed, 5 Aug 2015 15:38:15 +0200
|
||||
Subject: iio: adis16480: Fix scale factors
|
||||
|
||||
From: Lars-Peter Clausen <lars@metafoo.de>
|
||||
|
||||
commit 7abad1063deb0f77d275c61f58863ec319c58c5c upstream.
|
||||
|
||||
The different devices support by the adis16480 driver have slightly
|
||||
different scales for the gyroscope and accelerometer channels.
|
||||
|
||||
Signed-off-by: Lars-Peter Clausen <lars@metafoo.de>
|
||||
Signed-off-by: Jonathan Cameron <jic23@kernel.org>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
|
||||
---
|
||||
drivers/iio/imu/adis16480.c | 39 +++++++++++++++++++++++++++++++++------
|
||||
1 file changed, 33 insertions(+), 6 deletions(-)
|
||||
|
||||
--- a/drivers/iio/imu/adis16480.c
|
||||
+++ b/drivers/iio/imu/adis16480.c
|
||||
@@ -110,6 +110,10 @@
|
||||
struct adis16480_chip_info {
|
||||
unsigned int num_channels;
|
||||
const struct iio_chan_spec *channels;
|
||||
+ unsigned int gyro_max_val;
|
||||
+ unsigned int gyro_max_scale;
|
||||
+ unsigned int accel_max_val;
|
||||
+ unsigned int accel_max_scale;
|
||||
};
|
||||
|
||||
struct adis16480 {
|
||||
@@ -497,19 +501,21 @@ static int adis16480_set_filter_freq(str
|
||||
static int adis16480_read_raw(struct iio_dev *indio_dev,
|
||||
const struct iio_chan_spec *chan, int *val, int *val2, long info)
|
||||
{
|
||||
+ struct adis16480 *st = iio_priv(indio_dev);
|
||||
+
|
||||
switch (info) {
|
||||
case IIO_CHAN_INFO_RAW:
|
||||
return adis_single_conversion(indio_dev, chan, 0, val);
|
||||
case IIO_CHAN_INFO_SCALE:
|
||||
switch (chan->type) {
|
||||
case IIO_ANGL_VEL:
|
||||
- *val = 0;
|
||||
- *val2 = IIO_DEGREE_TO_RAD(20000); /* 0.02 degree/sec */
|
||||
- return IIO_VAL_INT_PLUS_MICRO;
|
||||
+ *val = st->chip_info->gyro_max_scale;
|
||||
+ *val2 = st->chip_info->gyro_max_val;
|
||||
+ return IIO_VAL_FRACTIONAL;
|
||||
case IIO_ACCEL:
|
||||
- *val = 0;
|
||||
- *val2 = IIO_G_TO_M_S_2(800); /* 0.8 mg */
|
||||
- return IIO_VAL_INT_PLUS_MICRO;
|
||||
+ *val = st->chip_info->accel_max_scale;
|
||||
+ *val2 = st->chip_info->accel_max_val;
|
||||
+ return IIO_VAL_FRACTIONAL;
|
||||
case IIO_MAGN:
|
||||
*val = 0;
|
||||
*val2 = 100; /* 0.0001 gauss */
|
||||
@@ -674,18 +680,39 @@ static const struct adis16480_chip_info
|
||||
[ADIS16375] = {
|
||||
.channels = adis16485_channels,
|
||||
.num_channels = ARRAY_SIZE(adis16485_channels),
|
||||
+ /*
|
||||
+ * storing the value in rad/degree and the scale in degree
|
||||
+ * gives us the result in rad and better precession than
|
||||
+ * storing the scale directly in rad.
|
||||
+ */
|
||||
+ .gyro_max_val = IIO_RAD_TO_DEGREE(22887),
|
||||
+ .gyro_max_scale = 300,
|
||||
+ .accel_max_val = IIO_M_S_2_TO_G(21973),
|
||||
+ .accel_max_scale = 18,
|
||||
},
|
||||
[ADIS16480] = {
|
||||
.channels = adis16480_channels,
|
||||
.num_channels = ARRAY_SIZE(adis16480_channels),
|
||||
+ .gyro_max_val = IIO_RAD_TO_DEGREE(22500),
|
||||
+ .gyro_max_scale = 450,
|
||||
+ .accel_max_val = IIO_M_S_2_TO_G(12500),
|
||||
+ .accel_max_scale = 5,
|
||||
},
|
||||
[ADIS16485] = {
|
||||
.channels = adis16485_channels,
|
||||
.num_channels = ARRAY_SIZE(adis16485_channels),
|
||||
+ .gyro_max_val = IIO_RAD_TO_DEGREE(22500),
|
||||
+ .gyro_max_scale = 450,
|
||||
+ .accel_max_val = IIO_M_S_2_TO_G(20000),
|
||||
+ .accel_max_scale = 5,
|
||||
},
|
||||
[ADIS16488] = {
|
||||
.channels = adis16480_channels,
|
||||
.num_channels = ARRAY_SIZE(adis16480_channels),
|
||||
+ .gyro_max_val = IIO_RAD_TO_DEGREE(22500),
|
||||
+ .gyro_max_scale = 450,
|
||||
+ .accel_max_val = IIO_M_S_2_TO_G(22500),
|
||||
+ .accel_max_scale = 18,
|
||||
},
|
||||
};
|
||||
|
||||
+33
@@ -0,0 +1,33 @@
|
||||
From 06d2f6ca5a38abe92f1f3a132b331eee773868c3 Mon Sep 17 00:00:00 2001
|
||||
From: Markus Pargmann <mpa@pengutronix.de>
|
||||
Date: Wed, 29 Jul 2015 15:46:03 +0200
|
||||
Subject: iio: bmg160: IIO_BUFFER and IIO_TRIGGERED_BUFFER are required
|
||||
|
||||
From: Markus Pargmann <mpa@pengutronix.de>
|
||||
|
||||
commit 06d2f6ca5a38abe92f1f3a132b331eee773868c3 upstream.
|
||||
|
||||
This patch adds selects for IIO_BUFFER and IIO_TRIGGERED_BUFFER. Without
|
||||
IIO_BUFFER, the driver does not compile.
|
||||
|
||||
Signed-off-by: Markus Pargmann <mpa@pengutronix.de>
|
||||
Reviewed-by: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
|
||||
Signed-off-by: Jonathan Cameron <jic23@kernel.org>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
|
||||
---
|
||||
drivers/iio/gyro/Kconfig | 3 ++-
|
||||
1 file changed, 2 insertions(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/iio/gyro/Kconfig
|
||||
+++ b/drivers/iio/gyro/Kconfig
|
||||
@@ -53,7 +53,8 @@ config ADXRS450
|
||||
config BMG160
|
||||
tristate "BOSCH BMG160 Gyro Sensor"
|
||||
depends on I2C
|
||||
- select IIO_TRIGGERED_BUFFER if IIO_BUFFER
|
||||
+ select IIO_BUFFER
|
||||
+ select IIO_TRIGGERED_BUFFER
|
||||
help
|
||||
Say yes here to build support for Bosch BMG160 Tri-axis Gyro Sensor
|
||||
driver. This driver also supports BMI055 gyroscope.
|
||||
+33
@@ -0,0 +1,33 @@
|
||||
From 41d903c00051d8f31c98a8136edbac67e6f8688f Mon Sep 17 00:00:00 2001
|
||||
From: Cristina Opriceana <cristina.opriceana@gmail.com>
|
||||
Date: Mon, 3 Aug 2015 13:00:47 +0300
|
||||
Subject: iio: event: Remove negative error code from iio_event_poll
|
||||
|
||||
From: Cristina Opriceana <cristina.opriceana@gmail.com>
|
||||
|
||||
commit 41d903c00051d8f31c98a8136edbac67e6f8688f upstream.
|
||||
|
||||
Negative return values are not supported by iio_event_poll since
|
||||
its return type is unsigned int.
|
||||
|
||||
Fixes: f18e7a068a0a3 ("iio: Return -ENODEV for file operations if the device has been unregistered")
|
||||
|
||||
Signed-off-by: Cristina Opriceana <cristina.opriceana@gmail.com>
|
||||
Signed-off-by: Jonathan Cameron <jic23@kernel.org>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
|
||||
---
|
||||
drivers/iio/industrialio-event.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/iio/industrialio-event.c
|
||||
+++ b/drivers/iio/industrialio-event.c
|
||||
@@ -84,7 +84,7 @@ static unsigned int iio_event_poll(struc
|
||||
unsigned int events = 0;
|
||||
|
||||
if (!indio_dev->info)
|
||||
- return -ENODEV;
|
||||
+ return events;
|
||||
|
||||
poll_wait(filep, &ev_int->wait, wait);
|
||||
|
||||
+34
@@ -0,0 +1,34 @@
|
||||
From 1bdc0293901cbea23c6dc29432e81919d4719844 Mon Sep 17 00:00:00 2001
|
||||
From: Cristina Opriceana <cristina.opriceana@gmail.com>
|
||||
Date: Mon, 3 Aug 2015 13:37:40 +0300
|
||||
Subject: iio: industrialio-buffer: Fix iio_buffer_poll return value
|
||||
|
||||
From: Cristina Opriceana <cristina.opriceana@gmail.com>
|
||||
|
||||
commit 1bdc0293901cbea23c6dc29432e81919d4719844 upstream.
|
||||
|
||||
Change return value to 0 if no device is bound since
|
||||
unsigned int cannot support negative error codes.
|
||||
|
||||
Fixes: f18e7a068 ("iio: Return -ENODEV for file operations if the
|
||||
device has been unregistered")
|
||||
|
||||
Signed-off-by: Cristina Opriceana <cristina.opriceana@gmail.com>
|
||||
Signed-off-by: Jonathan Cameron <jic23@kernel.org>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
|
||||
---
|
||||
drivers/iio/industrialio-buffer.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/iio/industrialio-buffer.c
|
||||
+++ b/drivers/iio/industrialio-buffer.c
|
||||
@@ -151,7 +151,7 @@ unsigned int iio_buffer_poll(struct file
|
||||
struct iio_buffer *rb = indio_dev->buffer;
|
||||
|
||||
if (!indio_dev->info)
|
||||
- return -ENODEV;
|
||||
+ return 0;
|
||||
|
||||
poll_wait(filp, &rb->pollq, wait);
|
||||
if (iio_buffer_ready(indio_dev, rb, rb->watermark, 0))
|
||||
-254
@@ -1,254 +0,0 @@
|
||||
From 602b8593d2b4138c10e922eeaafe306f6b51817b Mon Sep 17 00:00:00 2001
|
||||
From: "Herton R. Krzesinski" <herton@redhat.com>
|
||||
Date: Fri, 14 Aug 2015 15:35:02 -0700
|
||||
Subject: ipc,sem: fix use after free on IPC_RMID after a task using same semaphore set exits
|
||||
|
||||
From: "Herton R. Krzesinski" <herton@redhat.com>
|
||||
|
||||
commit 602b8593d2b4138c10e922eeaafe306f6b51817b upstream.
|
||||
|
||||
The current semaphore code allows a potential use after free: in
|
||||
exit_sem we may free the task's sem_undo_list while there is still
|
||||
another task looping through the same semaphore set and cleaning the
|
||||
sem_undo list at freeary function (the task called IPC_RMID for the same
|
||||
semaphore set).
|
||||
|
||||
For example, with a test program [1] running which keeps forking a lot
|
||||
of processes (which then do a semop call with SEM_UNDO flag), and with
|
||||
the parent right after removing the semaphore set with IPC_RMID, and a
|
||||
kernel built with CONFIG_SLAB, CONFIG_SLAB_DEBUG and
|
||||
CONFIG_DEBUG_SPINLOCK, you can easily see something like the following
|
||||
in the kernel log:
|
||||
|
||||
Slab corruption (Not tainted): kmalloc-64 start=ffff88003b45c1c0, len=64
|
||||
000: 6b 6b 6b 6b 6b 6b 6b 6b 00 6b 6b 6b 6b 6b 6b 6b kkkkkkkk.kkkkkkk
|
||||
010: ff ff ff ff 6b 6b 6b 6b ff ff ff ff ff ff ff ff ....kkkk........
|
||||
Prev obj: start=ffff88003b45c180, len=64
|
||||
000: 00 00 00 00 ad 4e ad de ff ff ff ff 5a 5a 5a 5a .....N......ZZZZ
|
||||
010: ff ff ff ff ff ff ff ff c0 fb 01 37 00 88 ff ff ...........7....
|
||||
Next obj: start=ffff88003b45c200, len=64
|
||||
000: 00 00 00 00 ad 4e ad de ff ff ff ff 5a 5a 5a 5a .....N......ZZZZ
|
||||
010: ff ff ff ff ff ff ff ff 68 29 a7 3c 00 88 ff ff ........h).<....
|
||||
BUG: spinlock wrong CPU on CPU#2, test/18028
|
||||
general protection fault: 0000 [#1] SMP
|
||||
Modules linked in: 8021q mrp garp stp llc nf_conntrack_ipv4 nf_defrag_ipv4 ip6t_REJECT nf_reject_ipv6 nf_conntrack_ipv6 nf_defrag_ipv6 xt_state nf_conntrack ip6table_filter ip6_tables binfmt_misc ppdev input_leds joydev parport_pc parport floppy serio_raw virtio_balloon virtio_rng virtio_console virtio_net iosf_mbi crct10dif_pclmul crc32_pclmul ghash_clmulni_intel pcspkr qxl ttm drm_kms_helper drm snd_hda_codec_generic i2c_piix4 snd_hda_intel snd_hda_codec snd_hda_core snd_hwdep snd_seq snd_seq_device snd_pcm snd_timer snd soundcore crc32c_intel virtio_pci virtio_ring virtio pata_acpi ata_generic [last unloaded: speedstep_lib]
|
||||
CPU: 2 PID: 18028 Comm: test Not tainted 4.2.0-rc5+ #1
|
||||
Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.8.1-20150318_183358- 04/01/2014
|
||||
RIP: spin_dump+0x53/0xc0
|
||||
Call Trace:
|
||||
spin_bug+0x30/0x40
|
||||
do_raw_spin_unlock+0x71/0xa0
|
||||
_raw_spin_unlock+0xe/0x10
|
||||
freeary+0x82/0x2a0
|
||||
? _raw_spin_lock+0xe/0x10
|
||||
semctl_down.clone.0+0xce/0x160
|
||||
? __do_page_fault+0x19a/0x430
|
||||
? __audit_syscall_entry+0xa8/0x100
|
||||
SyS_semctl+0x236/0x2c0
|
||||
? syscall_trace_leave+0xde/0x130
|
||||
entry_SYSCALL_64_fastpath+0x12/0x71
|
||||
Code: 8b 80 88 03 00 00 48 8d 88 60 05 00 00 48 c7 c7 a0 2c a4 81 31 c0 65 8b 15 eb 40 f3 7e e8 08 31 68 00 4d 85 e4 44 8b 4b 08 74 5e <45> 8b 84 24 88 03 00 00 49 8d 8c 24 60 05 00 00 8b 53 04 48 89
|
||||
RIP [<ffffffff810d6053>] spin_dump+0x53/0xc0
|
||||
RSP <ffff88003750fd68>
|
||||
---[ end trace 783ebb76612867a0 ]---
|
||||
NMI watchdog: BUG: soft lockup - CPU#3 stuck for 22s! [test:18053]
|
||||
Modules linked in: 8021q mrp garp stp llc nf_conntrack_ipv4 nf_defrag_ipv4 ip6t_REJECT nf_reject_ipv6 nf_conntrack_ipv6 nf_defrag_ipv6 xt_state nf_conntrack ip6table_filter ip6_tables binfmt_misc ppdev input_leds joydev parport_pc parport floppy serio_raw virtio_balloon virtio_rng virtio_console virtio_net iosf_mbi crct10dif_pclmul crc32_pclmul ghash_clmulni_intel pcspkr qxl ttm drm_kms_helper drm snd_hda_codec_generic i2c_piix4 snd_hda_intel snd_hda_codec snd_hda_core snd_hwdep snd_seq snd_seq_device snd_pcm snd_timer snd soundcore crc32c_intel virtio_pci virtio_ring virtio pata_acpi ata_generic [last unloaded: speedstep_lib]
|
||||
CPU: 3 PID: 18053 Comm: test Tainted: G D 4.2.0-rc5+ #1
|
||||
Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.8.1-20150318_183358- 04/01/2014
|
||||
RIP: native_read_tsc+0x0/0x20
|
||||
Call Trace:
|
||||
? delay_tsc+0x40/0x70
|
||||
__delay+0xf/0x20
|
||||
do_raw_spin_lock+0x96/0x140
|
||||
_raw_spin_lock+0xe/0x10
|
||||
sem_lock_and_putref+0x11/0x70
|
||||
SYSC_semtimedop+0x7bf/0x960
|
||||
? handle_mm_fault+0xbf6/0x1880
|
||||
? dequeue_task_fair+0x79/0x4a0
|
||||
? __do_page_fault+0x19a/0x430
|
||||
? kfree_debugcheck+0x16/0x40
|
||||
? __do_page_fault+0x19a/0x430
|
||||
? __audit_syscall_entry+0xa8/0x100
|
||||
? do_audit_syscall_entry+0x66/0x70
|
||||
? syscall_trace_enter_phase1+0x139/0x160
|
||||
SyS_semtimedop+0xe/0x10
|
||||
SyS_semop+0x10/0x20
|
||||
entry_SYSCALL_64_fastpath+0x12/0x71
|
||||
Code: 47 10 83 e8 01 85 c0 89 47 10 75 08 65 48 89 3d 1f 74 ff 7e c9 c3 0f 1f 44 00 00 55 48 89 e5 e8 87 17 04 00 66 90 c9 c3 0f 1f 00 <55> 48 89 e5 0f 31 89 c1 48 89 d0 48 c1 e0 20 89 c9 48 09 c8 c9
|
||||
Kernel panic - not syncing: softlockup: hung tasks
|
||||
|
||||
I wasn't able to trigger any badness on a recent kernel without the
|
||||
proper config debugs enabled, however I have softlockup reports on some
|
||||
kernel versions, in the semaphore code, which are similar as above (the
|
||||
scenario is seen on some servers running IBM DB2 which uses semaphore
|
||||
syscalls).
|
||||
|
||||
The patch here fixes the race against freeary, by acquiring or waiting
|
||||
on the sem_undo_list lock as necessary (exit_sem can race with freeary,
|
||||
while freeary sets un->semid to -1 and removes the same sem_undo from
|
||||
list_proc or when it removes the last sem_undo).
|
||||
|
||||
After the patch I'm unable to reproduce the problem using the test case
|
||||
[1].
|
||||
|
||||
[1] Test case used below:
|
||||
|
||||
#include <stdio.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/ipc.h>
|
||||
#include <sys/sem.h>
|
||||
#include <sys/wait.h>
|
||||
#include <stdlib.h>
|
||||
#include <time.h>
|
||||
#include <unistd.h>
|
||||
#include <errno.h>
|
||||
|
||||
#define NSEM 1
|
||||
#define NSET 5
|
||||
|
||||
int sid[NSET];
|
||||
|
||||
void thread()
|
||||
{
|
||||
struct sembuf op;
|
||||
int s;
|
||||
uid_t pid = getuid();
|
||||
|
||||
s = rand() % NSET;
|
||||
op.sem_num = pid % NSEM;
|
||||
op.sem_op = 1;
|
||||
op.sem_flg = SEM_UNDO;
|
||||
|
||||
semop(sid[s], &op, 1);
|
||||
exit(EXIT_SUCCESS);
|
||||
}
|
||||
|
||||
void create_set()
|
||||
{
|
||||
int i, j;
|
||||
pid_t p;
|
||||
union {
|
||||
int val;
|
||||
struct semid_ds *buf;
|
||||
unsigned short int *array;
|
||||
struct seminfo *__buf;
|
||||
} un;
|
||||
|
||||
/* Create and initialize semaphore set */
|
||||
for (i = 0; i < NSET; i++) {
|
||||
sid[i] = semget(IPC_PRIVATE , NSEM, 0644 | IPC_CREAT);
|
||||
if (sid[i] < 0) {
|
||||
perror("semget");
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
}
|
||||
un.val = 0;
|
||||
for (i = 0; i < NSET; i++) {
|
||||
for (j = 0; j < NSEM; j++) {
|
||||
if (semctl(sid[i], j, SETVAL, un) < 0)
|
||||
perror("semctl");
|
||||
}
|
||||
}
|
||||
|
||||
/* Launch threads that operate on semaphore set */
|
||||
for (i = 0; i < NSEM * NSET * NSET; i++) {
|
||||
p = fork();
|
||||
if (p < 0)
|
||||
perror("fork");
|
||||
if (p == 0)
|
||||
thread();
|
||||
}
|
||||
|
||||
/* Free semaphore set */
|
||||
for (i = 0; i < NSET; i++) {
|
||||
if (semctl(sid[i], NSEM, IPC_RMID))
|
||||
perror("IPC_RMID");
|
||||
}
|
||||
|
||||
/* Wait for forked processes to exit */
|
||||
while (wait(NULL)) {
|
||||
if (errno == ECHILD)
|
||||
break;
|
||||
};
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
pid_t p;
|
||||
|
||||
srand(time(NULL));
|
||||
|
||||
while (1) {
|
||||
p = fork();
|
||||
if (p < 0) {
|
||||
perror("fork");
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
if (p == 0) {
|
||||
create_set();
|
||||
goto end;
|
||||
}
|
||||
|
||||
/* Wait for forked processes to exit */
|
||||
while (wait(NULL)) {
|
||||
if (errno == ECHILD)
|
||||
break;
|
||||
};
|
||||
}
|
||||
end:
|
||||
return 0;
|
||||
}
|
||||
|
||||
[akpm@linux-foundation.org: use normal comment layout]
|
||||
Signed-off-by: Herton R. Krzesinski <herton@redhat.com>
|
||||
Acked-by: Manfred Spraul <manfred@colorfullife.com>
|
||||
Cc: Davidlohr Bueso <dave@stgolabs.net>
|
||||
Cc: Rafael Aquini <aquini@redhat.com>
|
||||
CC: Aristeu Rozanski <aris@redhat.com>
|
||||
Cc: David Jeffery <djeffery@redhat.com>
|
||||
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
|
||||
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
|
||||
|
||||
---
|
||||
ipc/sem.c | 23 +++++++++++++++++------
|
||||
1 file changed, 17 insertions(+), 6 deletions(-)
|
||||
|
||||
--- a/ipc/sem.c
|
||||
+++ b/ipc/sem.c
|
||||
@@ -2074,17 +2074,28 @@ void exit_sem(struct task_struct *tsk)
|
||||
rcu_read_lock();
|
||||
un = list_entry_rcu(ulp->list_proc.next,
|
||||
struct sem_undo, list_proc);
|
||||
- if (&un->list_proc == &ulp->list_proc)
|
||||
- semid = -1;
|
||||
- else
|
||||
- semid = un->semid;
|
||||
+ if (&un->list_proc == &ulp->list_proc) {
|
||||
+ /*
|
||||
+ * We must wait for freeary() before freeing this ulp,
|
||||
+ * in case we raced with last sem_undo. There is a small
|
||||
+ * possibility where we exit while freeary() didn't
|
||||
+ * finish unlocking sem_undo_list.
|
||||
+ */
|
||||
+ spin_unlock_wait(&ulp->lock);
|
||||
+ rcu_read_unlock();
|
||||
+ break;
|
||||
+ }
|
||||
+ spin_lock(&ulp->lock);
|
||||
+ semid = un->semid;
|
||||
+ spin_unlock(&ulp->lock);
|
||||
|
||||
+ /* exit_sem raced with IPC_RMID, nothing to do */
|
||||
if (semid == -1) {
|
||||
rcu_read_unlock();
|
||||
- break;
|
||||
+ continue;
|
||||
}
|
||||
|
||||
- sma = sem_obtain_object_check(tsk->nsproxy->ipc_ns, un->semid);
|
||||
+ sma = sem_obtain_object_check(tsk->nsproxy->ipc_ns, semid);
|
||||
/* exit_sem raced with IPC_RMID, nothing to do */
|
||||
if (IS_ERR(sma)) {
|
||||
rcu_read_unlock();
|
||||
-86
@@ -1,86 +0,0 @@
|
||||
From 3ed1f8a99d70ea1cd1508910eb107d0edcae5009 Mon Sep 17 00:00:00 2001
|
||||
From: Manfred Spraul <manfred@colorfullife.com>
|
||||
Date: Fri, 14 Aug 2015 15:35:10 -0700
|
||||
Subject: ipc/sem.c: update/correct memory barriers
|
||||
|
||||
From: Manfred Spraul <manfred@colorfullife.com>
|
||||
|
||||
commit 3ed1f8a99d70ea1cd1508910eb107d0edcae5009 upstream.
|
||||
|
||||
sem_lock() did not properly pair memory barriers:
|
||||
|
||||
!spin_is_locked() and spin_unlock_wait() are both only control barriers.
|
||||
The code needs an acquire barrier, otherwise the cpu might perform read
|
||||
operations before the lock test.
|
||||
|
||||
As no primitive exists inside <include/spinlock.h> and since it seems
|
||||
noone wants another primitive, the code creates a local primitive within
|
||||
ipc/sem.c.
|
||||
|
||||
With regards to -stable:
|
||||
|
||||
The change of sem_wait_array() is a bugfix, the change to sem_lock() is a
|
||||
nop (just a preprocessor redefinition to improve the readability). The
|
||||
bugfix is necessary for all kernels that use sem_wait_array() (i.e.:
|
||||
starting from 3.10).
|
||||
|
||||
Signed-off-by: Manfred Spraul <manfred@colorfullife.com>
|
||||
Reported-by: Oleg Nesterov <oleg@redhat.com>
|
||||
Acked-by: Peter Zijlstra (Intel) <peterz@infradead.org>
|
||||
Cc: "Paul E. McKenney" <paulmck@linux.vnet.ibm.com>
|
||||
Cc: Kirill Tkhai <ktkhai@parallels.com>
|
||||
Cc: Ingo Molnar <mingo@redhat.com>
|
||||
Cc: Josh Poimboeuf <jpoimboe@redhat.com>
|
||||
Cc: Davidlohr Bueso <dave@stgolabs.net>
|
||||
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
|
||||
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
|
||||
---
|
||||
ipc/sem.c | 18 ++++++++++++++----
|
||||
1 file changed, 14 insertions(+), 4 deletions(-)
|
||||
|
||||
--- a/ipc/sem.c
|
||||
+++ b/ipc/sem.c
|
||||
@@ -253,6 +253,16 @@ static void sem_rcu_free(struct rcu_head
|
||||
}
|
||||
|
||||
/*
|
||||
+ * spin_unlock_wait() and !spin_is_locked() are not memory barriers, they
|
||||
+ * are only control barriers.
|
||||
+ * The code must pair with spin_unlock(&sem->lock) or
|
||||
+ * spin_unlock(&sem_perm.lock), thus just the control barrier is insufficient.
|
||||
+ *
|
||||
+ * smp_rmb() is sufficient, as writes cannot pass the control barrier.
|
||||
+ */
|
||||
+#define ipc_smp_acquire__after_spin_is_unlocked() smp_rmb()
|
||||
+
|
||||
+/*
|
||||
* Wait until all currently ongoing simple ops have completed.
|
||||
* Caller must own sem_perm.lock.
|
||||
* New simple ops cannot start, because simple ops first check
|
||||
@@ -275,6 +285,7 @@ static void sem_wait_array(struct sem_ar
|
||||
sem = sma->sem_base + i;
|
||||
spin_unlock_wait(&sem->lock);
|
||||
}
|
||||
+ ipc_smp_acquire__after_spin_is_unlocked();
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -327,13 +338,12 @@ static inline int sem_lock(struct sem_ar
|
||||
/* Then check that the global lock is free */
|
||||
if (!spin_is_locked(&sma->sem_perm.lock)) {
|
||||
/*
|
||||
- * The ipc object lock check must be visible on all
|
||||
- * cores before rechecking the complex count. Otherwise
|
||||
- * we can race with another thread that does:
|
||||
+ * We need a memory barrier with acquire semantics,
|
||||
+ * otherwise we can race with another thread that does:
|
||||
* complex_count++;
|
||||
* spin_unlock(sem_perm.lock);
|
||||
*/
|
||||
- smp_rmb();
|
||||
+ ipc_smp_acquire__after_spin_is_unlocked();
|
||||
|
||||
/*
|
||||
* Now repeat the test of complex_count:
|
||||
@@ -1,83 +0,0 @@
|
||||
From c9fdec9f3970eeaa1b176422f46167f5f5158804 Mon Sep 17 00:00:00 2001
|
||||
From: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
|
||||
Date: Mon, 20 Jul 2015 12:14:39 +0300
|
||||
Subject: iwlwifi: pcie: fix prepare card flow
|
||||
|
||||
From: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
|
||||
|
||||
commit c9fdec9f3970eeaa1b176422f46167f5f5158804 upstream.
|
||||
|
||||
When the card is not owned by the PCIe bus, we need to
|
||||
acquire ownership first. This flow is implemented in
|
||||
iwl_pcie_prepare_card_hw. Because of a hardware bug, we
|
||||
need to disable link power management before we can
|
||||
request ownership otherwise the other user of the device
|
||||
won't get notified that we are requesting the device which
|
||||
will prevent us from acquire ownership.
|
||||
|
||||
Same holds for the down flow where we need to make sure
|
||||
that any other potential user is notified that the driver
|
||||
is going down.
|
||||
|
||||
Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
|
||||
---
|
||||
drivers/net/wireless/iwlwifi/pcie/trans.c | 22 +++++++++++++++++++---
|
||||
1 file changed, 19 insertions(+), 3 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/iwlwifi/pcie/trans.c
|
||||
+++ b/drivers/net/wireless/iwlwifi/pcie/trans.c
|
||||
@@ -457,10 +457,16 @@ static void iwl_pcie_apm_stop(struct iwl
|
||||
if (trans->cfg->device_family == IWL_DEVICE_FAMILY_7000)
|
||||
iwl_set_bits_prph(trans, APMG_PCIDEV_STT_REG,
|
||||
APMG_PCIDEV_STT_VAL_WAKE_ME);
|
||||
- else if (trans->cfg->device_family == IWL_DEVICE_FAMILY_8000)
|
||||
+ else if (trans->cfg->device_family == IWL_DEVICE_FAMILY_8000) {
|
||||
+ iwl_set_bit(trans, CSR_DBG_LINK_PWR_MGMT_REG,
|
||||
+ CSR_RESET_LINK_PWR_MGMT_DISABLED);
|
||||
iwl_set_bit(trans, CSR_HW_IF_CONFIG_REG,
|
||||
CSR_HW_IF_CONFIG_REG_PREPARE |
|
||||
CSR_HW_IF_CONFIG_REG_ENABLE_PME);
|
||||
+ mdelay(1);
|
||||
+ iwl_clear_bit(trans, CSR_DBG_LINK_PWR_MGMT_REG,
|
||||
+ CSR_RESET_LINK_PWR_MGMT_DISABLED);
|
||||
+ }
|
||||
mdelay(5);
|
||||
}
|
||||
|
||||
@@ -555,6 +561,10 @@ static int iwl_pcie_prepare_card_hw(stru
|
||||
if (ret >= 0)
|
||||
return 0;
|
||||
|
||||
+ iwl_set_bit(trans, CSR_DBG_LINK_PWR_MGMT_REG,
|
||||
+ CSR_RESET_LINK_PWR_MGMT_DISABLED);
|
||||
+ msleep(1);
|
||||
+
|
||||
for (iter = 0; iter < 10; iter++) {
|
||||
/* If HW is not ready, prepare the conditions to check again */
|
||||
iwl_set_bit(trans, CSR_HW_IF_CONFIG_REG,
|
||||
@@ -562,8 +572,10 @@ static int iwl_pcie_prepare_card_hw(stru
|
||||
|
||||
do {
|
||||
ret = iwl_pcie_set_hw_ready(trans);
|
||||
- if (ret >= 0)
|
||||
- return 0;
|
||||
+ if (ret >= 0) {
|
||||
+ ret = 0;
|
||||
+ goto out;
|
||||
+ }
|
||||
|
||||
usleep_range(200, 1000);
|
||||
t += 200;
|
||||
@@ -573,6 +585,10 @@ static int iwl_pcie_prepare_card_hw(stru
|
||||
|
||||
IWL_ERR(trans, "Couldn't prepare the card\n");
|
||||
|
||||
+out:
|
||||
+ iwl_clear_bit(trans, CSR_DBG_LINK_PWR_MGMT_REG,
|
||||
+ CSR_RESET_LINK_PWR_MGMT_DISABLED);
|
||||
+
|
||||
return ret;
|
||||
}
|
||||
|
||||
+37
@@ -0,0 +1,37 @@
|
||||
From 2f123bce18943fff819bc10f8868ffb9149fc622 Mon Sep 17 00:00:00 2001
|
||||
From: "Darrick J. Wong" <darrick.wong@oracle.com>
|
||||
Date: Wed, 19 Aug 2015 10:33:58 +1000
|
||||
Subject: libxfs: readahead of dir3 data blocks should use the read verifier
|
||||
|
||||
From: "Darrick J. Wong" <darrick.wong@oracle.com>
|
||||
|
||||
commit 2f123bce18943fff819bc10f8868ffb9149fc622 upstream.
|
||||
|
||||
In the dir3 data block readahead function, use the regular read
|
||||
verifier to check the block's CRC and spot-check the block contents
|
||||
instead of directly calling only the spot-checking routine. This
|
||||
prevents corrupted directory data blocks from being read into the
|
||||
kernel, which can lead to garbage ls output and directory loops (if
|
||||
say one of the entries contains slashes and other junk).
|
||||
|
||||
Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
|
||||
Reviewed-by: Dave Chinner <dchinner@redhat.com>
|
||||
Signed-off-by: Dave Chinner <david@fromorbit.com>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
|
||||
---
|
||||
fs/xfs/libxfs/xfs_dir2_data.c | 3 ++-
|
||||
1 file changed, 2 insertions(+), 1 deletion(-)
|
||||
|
||||
--- a/fs/xfs/libxfs/xfs_dir2_data.c
|
||||
+++ b/fs/xfs/libxfs/xfs_dir2_data.c
|
||||
@@ -252,7 +252,8 @@ xfs_dir3_data_reada_verify(
|
||||
return;
|
||||
case cpu_to_be32(XFS_DIR2_DATA_MAGIC):
|
||||
case cpu_to_be32(XFS_DIR3_DATA_MAGIC):
|
||||
- xfs_dir3_data_verify(bp);
|
||||
+ bp->b_ops = &xfs_dir3_data_buf_ops;
|
||||
+ bp->b_ops->verify_read(bp);
|
||||
return;
|
||||
default:
|
||||
xfs_buf_ioerror(bp, -EFSCORRUPTED);
|
||||
@@ -1,36 +0,0 @@
|
||||
From c0ddc8c745b7f89c50385fd7aa03c78dc543fa7a Mon Sep 17 00:00:00 2001
|
||||
From: Richard Weinberger <richard@nod.at>
|
||||
Date: Mon, 27 Jul 2015 00:06:55 +0200
|
||||
Subject: localmodconfig: Use Kbuild files too
|
||||
|
||||
From: Richard Weinberger <richard@nod.at>
|
||||
|
||||
commit c0ddc8c745b7f89c50385fd7aa03c78dc543fa7a upstream.
|
||||
|
||||
In kbuild it is allowed to define objects in files named "Makefile"
|
||||
and "Kbuild".
|
||||
Currently localmodconfig reads objects only from "Makefile"s and misses
|
||||
modules like nouveau.
|
||||
|
||||
Link: http://lkml.kernel.org/r/1437948415-16290-1-git-send-email-richard@nod.at
|
||||
|
||||
Reported-and-tested-by: Leonidas Spyropoulos <artafinde@gmail.com>
|
||||
Signed-off-by: Richard Weinberger <richard@nod.at>
|
||||
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
|
||||
---
|
||||
scripts/kconfig/streamline_config.pl | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
--- a/scripts/kconfig/streamline_config.pl
|
||||
+++ b/scripts/kconfig/streamline_config.pl
|
||||
@@ -137,7 +137,7 @@ my $ksource = ($ARGV[0] ? $ARGV[0] : '.'
|
||||
my $kconfig = $ARGV[1];
|
||||
my $lsmod_file = $ENV{'LSMOD'};
|
||||
|
||||
-my @makefiles = `find $ksource -name Makefile 2>/dev/null`;
|
||||
+my @makefiles = `find $ksource -name Makefile -or -name Kbuild 2>/dev/null`;
|
||||
chomp @makefiles;
|
||||
|
||||
my %depends;
|
||||
-48
@@ -1,48 +0,0 @@
|
||||
From 036138080a4376e5f3e5d0cca8ac99084c5cf06e Mon Sep 17 00:00:00 2001
|
||||
From: Wanpeng Li <wanpeng.li@hotmail.com>
|
||||
Date: Fri, 14 Aug 2015 15:34:59 -0700
|
||||
Subject: mm/hwpoison: fix fail isolate hugetlbfs page w/ refcount held
|
||||
|
||||
From: Wanpeng Li <wanpeng.li@hotmail.com>
|
||||
|
||||
commit 036138080a4376e5f3e5d0cca8ac99084c5cf06e upstream.
|
||||
|
||||
Hugetlbfs pages will get a refcount in get_any_page() or
|
||||
madvise_hwpoison() if soft offlining through madvise. The refcount which
|
||||
is held by the soft offline path should be released if we fail to isolate
|
||||
hugetlbfs pages.
|
||||
|
||||
Fix it by reducing the refcount for both isolation success and failure.
|
||||
|
||||
Signed-off-by: Wanpeng Li <wanpeng.li@hotmail.com>
|
||||
Acked-by: Naoya Horiguchi <n-horiguchi@ah.jp.nec.com>
|
||||
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
|
||||
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
|
||||
---
|
||||
mm/memory-failure.c | 13 ++++++-------
|
||||
1 file changed, 6 insertions(+), 7 deletions(-)
|
||||
|
||||
--- a/mm/memory-failure.c
|
||||
+++ b/mm/memory-failure.c
|
||||
@@ -1589,13 +1589,12 @@ static int soft_offline_huge_page(struct
|
||||
unlock_page(hpage);
|
||||
|
||||
ret = isolate_huge_page(hpage, &pagelist);
|
||||
- if (ret) {
|
||||
- /*
|
||||
- * get_any_page() and isolate_huge_page() takes a refcount each,
|
||||
- * so need to drop one here.
|
||||
- */
|
||||
- put_page(hpage);
|
||||
- } else {
|
||||
+ /*
|
||||
+ * get_any_page() and isolate_huge_page() takes a refcount each,
|
||||
+ * so need to drop one here.
|
||||
+ */
|
||||
+ put_page(hpage);
|
||||
+ if (!ret) {
|
||||
pr_info("soft offline: %#lx hugepage failed to isolate\n", pfn);
|
||||
return -EBUSY;
|
||||
}
|
||||
-37
@@ -1,37 +0,0 @@
|
||||
From 4f32be677b124a49459e2603321c7a5605ceb9f8 Mon Sep 17 00:00:00 2001
|
||||
From: Wanpeng Li <wanpeng.li@hotmail.com>
|
||||
Date: Fri, 14 Aug 2015 15:34:56 -0700
|
||||
Subject: mm/hwpoison: fix page refcount of unknown non LRU page
|
||||
|
||||
From: Wanpeng Li <wanpeng.li@hotmail.com>
|
||||
|
||||
commit 4f32be677b124a49459e2603321c7a5605ceb9f8 upstream.
|
||||
|
||||
After trying to drain pages from pagevec/pageset, we try to get reference
|
||||
count of the page again, however, the reference count of the page is not
|
||||
reduced if the page is still not on LRU list.
|
||||
|
||||
Fix it by adding the put_page() to drop the page reference which is from
|
||||
__get_any_page().
|
||||
|
||||
Signed-off-by: Wanpeng Li <wanpeng.li@hotmail.com>
|
||||
Acked-by: Naoya Horiguchi <n-horiguchi@ah.jp.nec.com>
|
||||
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
|
||||
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
|
||||
---
|
||||
mm/memory-failure.c | 2 ++
|
||||
1 file changed, 2 insertions(+)
|
||||
|
||||
--- a/mm/memory-failure.c
|
||||
+++ b/mm/memory-failure.c
|
||||
@@ -1558,6 +1558,8 @@ static int get_any_page(struct page *pag
|
||||
*/
|
||||
ret = __get_any_page(page, pfn, 0);
|
||||
if (!PageLRU(page)) {
|
||||
+ /* Drop page reference which is from __get_any_page() */
|
||||
+ put_page(page);
|
||||
pr_info("soft_offline: %#lx: unknown non LRU page type %lx\n",
|
||||
pfn, page->flags);
|
||||
return -EIO;
|
||||
File diff suppressed because it is too large
Load Diff
+135
@@ -0,0 +1,135 @@
|
||||
From 932c435caba8a2ce473a91753bad0173269ef334 Mon Sep 17 00:00:00 2001
|
||||
From: Mark Rustad <mark.d.rustad@intel.com>
|
||||
Date: Mon, 13 Jul 2015 11:40:02 -0700
|
||||
Subject: PCI: Add dev_flags bit to access VPD through function 0
|
||||
|
||||
From: Mark Rustad <mark.d.rustad@intel.com>
|
||||
|
||||
commit 932c435caba8a2ce473a91753bad0173269ef334 upstream.
|
||||
|
||||
Add a dev_flags bit, PCI_DEV_FLAGS_VPD_REF_F0, to access VPD through
|
||||
function 0 to provide VPD access on other functions. This is for hardware
|
||||
devices that provide copies of the same VPD capability registers in
|
||||
multiple functions. Because the kernel expects that each function has its
|
||||
own registers, both the locking and the state tracking are affected by VPD
|
||||
accesses to different functions.
|
||||
|
||||
On such devices for example, if a VPD write is performed on function 0,
|
||||
*any* later attempt to read VPD from any other function of that device will
|
||||
hang. This has to do with how the kernel tracks the expected value of the
|
||||
F bit per function.
|
||||
|
||||
Concurrent accesses to different functions of the same device can not only
|
||||
hang but also corrupt both read and write VPD data.
|
||||
|
||||
When hangs occur, typically the error message:
|
||||
|
||||
vpd r/w failed. This is likely a firmware bug on this device.
|
||||
|
||||
will be seen.
|
||||
|
||||
Never set this bit on function 0 or there will be an infinite recursion.
|
||||
|
||||
Signed-off-by: Mark Rustad <mark.d.rustad@intel.com>
|
||||
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
|
||||
Acked-by: Alexander Duyck <alexander.h.duyck@redhat.com>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
|
||||
---
|
||||
drivers/pci/access.c | 61 ++++++++++++++++++++++++++++++++++++++++++++++++++-
|
||||
include/linux/pci.h | 2 +
|
||||
2 files changed, 62 insertions(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/pci/access.c
|
||||
+++ b/drivers/pci/access.c
|
||||
@@ -439,6 +439,56 @@ static const struct pci_vpd_ops pci_vpd_
|
||||
.release = pci_vpd_pci22_release,
|
||||
};
|
||||
|
||||
+static ssize_t pci_vpd_f0_read(struct pci_dev *dev, loff_t pos, size_t count,
|
||||
+ void *arg)
|
||||
+{
|
||||
+ struct pci_dev *tdev = pci_get_slot(dev->bus, PCI_SLOT(dev->devfn));
|
||||
+ ssize_t ret;
|
||||
+
|
||||
+ if (!tdev)
|
||||
+ return -ENODEV;
|
||||
+
|
||||
+ ret = pci_read_vpd(tdev, pos, count, arg);
|
||||
+ pci_dev_put(tdev);
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
+static ssize_t pci_vpd_f0_write(struct pci_dev *dev, loff_t pos, size_t count,
|
||||
+ const void *arg)
|
||||
+{
|
||||
+ struct pci_dev *tdev = pci_get_slot(dev->bus, PCI_SLOT(dev->devfn));
|
||||
+ ssize_t ret;
|
||||
+
|
||||
+ if (!tdev)
|
||||
+ return -ENODEV;
|
||||
+
|
||||
+ ret = pci_write_vpd(tdev, pos, count, arg);
|
||||
+ pci_dev_put(tdev);
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
+static const struct pci_vpd_ops pci_vpd_f0_ops = {
|
||||
+ .read = pci_vpd_f0_read,
|
||||
+ .write = pci_vpd_f0_write,
|
||||
+ .release = pci_vpd_pci22_release,
|
||||
+};
|
||||
+
|
||||
+static int pci_vpd_f0_dev_check(struct pci_dev *dev)
|
||||
+{
|
||||
+ struct pci_dev *tdev = pci_get_slot(dev->bus, PCI_SLOT(dev->devfn));
|
||||
+ int ret = 0;
|
||||
+
|
||||
+ if (!tdev)
|
||||
+ return -ENODEV;
|
||||
+ if (!tdev->vpd || !tdev->multifunction ||
|
||||
+ dev->class != tdev->class || dev->vendor != tdev->vendor ||
|
||||
+ dev->device != tdev->device)
|
||||
+ ret = -ENODEV;
|
||||
+
|
||||
+ pci_dev_put(tdev);
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
int pci_vpd_pci22_init(struct pci_dev *dev)
|
||||
{
|
||||
struct pci_vpd_pci22 *vpd;
|
||||
@@ -447,12 +497,21 @@ int pci_vpd_pci22_init(struct pci_dev *d
|
||||
cap = pci_find_capability(dev, PCI_CAP_ID_VPD);
|
||||
if (!cap)
|
||||
return -ENODEV;
|
||||
+ if (dev->dev_flags & PCI_DEV_FLAGS_VPD_REF_F0) {
|
||||
+ int ret = pci_vpd_f0_dev_check(dev);
|
||||
+
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+ }
|
||||
vpd = kzalloc(sizeof(*vpd), GFP_ATOMIC);
|
||||
if (!vpd)
|
||||
return -ENOMEM;
|
||||
|
||||
vpd->base.len = PCI_VPD_PCI22_SIZE;
|
||||
- vpd->base.ops = &pci_vpd_pci22_ops;
|
||||
+ if (dev->dev_flags & PCI_DEV_FLAGS_VPD_REF_F0)
|
||||
+ vpd->base.ops = &pci_vpd_f0_ops;
|
||||
+ else
|
||||
+ vpd->base.ops = &pci_vpd_pci22_ops;
|
||||
mutex_init(&vpd->lock);
|
||||
vpd->cap = cap;
|
||||
vpd->busy = false;
|
||||
--- a/include/linux/pci.h
|
||||
+++ b/include/linux/pci.h
|
||||
@@ -180,6 +180,8 @@ enum pci_dev_flags {
|
||||
PCI_DEV_FLAGS_NO_BUS_RESET = (__force pci_dev_flags_t) (1 << 6),
|
||||
/* Do not use PM reset even if device advertises NoSoftRst- */
|
||||
PCI_DEV_FLAGS_NO_PM_RESET = (__force pci_dev_flags_t) (1 << 7),
|
||||
+ /* Get VPD from function 0 VPD */
|
||||
+ PCI_DEV_FLAGS_VPD_REF_F0 = (__force pci_dev_flags_t) (1 << 8),
|
||||
};
|
||||
|
||||
enum pci_irq_reroute_variant {
|
||||
+41
@@ -0,0 +1,41 @@
|
||||
From 7aa6ca4d39edf01f997b9e02cf6d2fdeb224f351 Mon Sep 17 00:00:00 2001
|
||||
From: Mark Rustad <mark.d.rustad@intel.com>
|
||||
Date: Mon, 13 Jul 2015 11:40:07 -0700
|
||||
Subject: PCI: Add VPD function 0 quirk for Intel Ethernet devices
|
||||
|
||||
From: Mark Rustad <mark.d.rustad@intel.com>
|
||||
|
||||
commit 7aa6ca4d39edf01f997b9e02cf6d2fdeb224f351 upstream.
|
||||
|
||||
Set the PCI_DEV_FLAGS_VPD_REF_F0 flag on all Intel Ethernet device
|
||||
functions other than function 0, so that on multi-function devices, we will
|
||||
always read VPD from function 0 instead of from the other functions.
|
||||
|
||||
[bhelgaas: changelog]
|
||||
Signed-off-by: Mark Rustad <mark.d.rustad@intel.com>
|
||||
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
|
||||
Acked-by: Alexander Duyck <alexander.h.duyck@redhat.com>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
|
||||
---
|
||||
drivers/pci/quirks.c | 9 +++++++++
|
||||
1 file changed, 9 insertions(+)
|
||||
|
||||
--- a/drivers/pci/quirks.c
|
||||
+++ b/drivers/pci/quirks.c
|
||||
@@ -1903,6 +1903,15 @@ static void quirk_netmos(struct pci_dev
|
||||
DECLARE_PCI_FIXUP_CLASS_HEADER(PCI_VENDOR_ID_NETMOS, PCI_ANY_ID,
|
||||
PCI_CLASS_COMMUNICATION_SERIAL, 8, quirk_netmos);
|
||||
|
||||
+static void quirk_f0_vpd_link(struct pci_dev *dev)
|
||||
+{
|
||||
+ if (!dev->multifunction || !PCI_FUNC(dev->devfn))
|
||||
+ return;
|
||||
+ dev->dev_flags |= PCI_DEV_FLAGS_VPD_REF_F0;
|
||||
+}
|
||||
+DECLARE_PCI_FIXUP_CLASS_EARLY(PCI_VENDOR_ID_INTEL, PCI_ANY_ID,
|
||||
+ PCI_CLASS_NETWORK_ETHERNET, 8, quirk_f0_vpd_link);
|
||||
+
|
||||
static void quirk_e100_interrupt(struct pci_dev *dev)
|
||||
{
|
||||
u16 command, pmcsr;
|
||||
+120
@@ -0,0 +1,120 @@
|
||||
From 91f15fb30c77d4a0d0d9b97e5cec647650853145 Mon Sep 17 00:00:00 2001
|
||||
From: Zhang Rui <rui.zhang@intel.com>
|
||||
Date: Mon, 24 Aug 2015 15:27:11 -0500
|
||||
Subject: PCI: Disable async suspend/resume for JMicron multi-function SATA/AHCI
|
||||
|
||||
From: Zhang Rui <rui.zhang@intel.com>
|
||||
|
||||
commit 91f15fb30c77d4a0d0d9b97e5cec647650853145 upstream.
|
||||
|
||||
On multi-function JMicron SATA/PATA/AHCI devices, the PATA controller at
|
||||
function 1 doesn't work if it is powered on before the SATA controller at
|
||||
function 0. The result is that PATA doesn't work after resume, and we
|
||||
print messages like this:
|
||||
|
||||
pata_jmicron 0000:02:00.1: Refused to change power state, currently in D3
|
||||
irq 17: nobody cared (try booting with the "irqpoll" option)
|
||||
|
||||
Async resume was introduced in v3.15 by 76569faa62c4 ("PM / sleep:
|
||||
Asynchronous threads for resume_noirq"). Prior to that, we powered on
|
||||
the functions in order, so this problem shouldn't happen.
|
||||
|
||||
e6b7e41cdd8c ("ata: Disabling the async PM for JMicron chip 363/361")
|
||||
solved the problem for JMicron 361 and 363 devices. With async suspend
|
||||
disabled, we always power on function 0 before function 1.
|
||||
|
||||
Barto then reported the same problem with a JMicron 368 (see comment #57 in
|
||||
the bugzilla).
|
||||
|
||||
Rather than extending the blacklist piecemeal, disable async suspend for
|
||||
all JMicron multi-function SATA/PATA/AHCI devices.
|
||||
|
||||
This quirk could stay in the ahci and pata_jmicron drivers, but it's likely
|
||||
the problem will occur even if pata_jmicron isn't loaded until after the
|
||||
suspend/resume. Making it a PCI quirk ensures that we'll preserve the
|
||||
power-on order even if the drivers aren't loaded.
|
||||
|
||||
[bhelgaas: changelog, limit to multi-function, limit to IDE/ATA]
|
||||
Link: https://bugzilla.kernel.org/show_bug.cgi?id=81551
|
||||
Reported-and-tested-by: Barto <mister.freeman@laposte.net>
|
||||
Signed-off-by: Zhang Rui <rui.zhang@intel.com>
|
||||
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
|
||||
---
|
||||
drivers/ata/ahci.c | 13 +------------
|
||||
drivers/ata/pata_jmicron.c | 12 ------------
|
||||
drivers/pci/quirks.c | 12 ++++++++++++
|
||||
3 files changed, 13 insertions(+), 24 deletions(-)
|
||||
|
||||
--- a/drivers/ata/ahci.c
|
||||
+++ b/drivers/ata/ahci.c
|
||||
@@ -349,6 +349,7 @@ static const struct pci_device_id ahci_p
|
||||
/* JMicron 362B and 362C have an AHCI function with IDE class code */
|
||||
{ PCI_VDEVICE(JMICRON, 0x2362), board_ahci_ign_iferr },
|
||||
{ PCI_VDEVICE(JMICRON, 0x236f), board_ahci_ign_iferr },
|
||||
+ /* May need to update quirk_jmicron_async_suspend() for additions */
|
||||
|
||||
/* ATI */
|
||||
{ PCI_VDEVICE(ATI, 0x4380), board_ahci_sb600 }, /* ATI SB600 */
|
||||
@@ -1377,18 +1378,6 @@ static int ahci_init_one(struct pci_dev
|
||||
else if (pdev->vendor == 0x1c44 && pdev->device == 0x8000)
|
||||
ahci_pci_bar = AHCI_PCI_BAR_ENMOTUS;
|
||||
|
||||
- /*
|
||||
- * The JMicron chip 361/363 contains one SATA controller and one
|
||||
- * PATA controller,for powering on these both controllers, we must
|
||||
- * follow the sequence one by one, otherwise one of them can not be
|
||||
- * powered on successfully, so here we disable the async suspend
|
||||
- * method for these chips.
|
||||
- */
|
||||
- if (pdev->vendor == PCI_VENDOR_ID_JMICRON &&
|
||||
- (pdev->device == PCI_DEVICE_ID_JMICRON_JMB363 ||
|
||||
- pdev->device == PCI_DEVICE_ID_JMICRON_JMB361))
|
||||
- device_disable_async_suspend(&pdev->dev);
|
||||
-
|
||||
/* acquire resources */
|
||||
rc = pcim_enable_device(pdev);
|
||||
if (rc)
|
||||
--- a/drivers/ata/pata_jmicron.c
|
||||
+++ b/drivers/ata/pata_jmicron.c
|
||||
@@ -143,18 +143,6 @@ static int jmicron_init_one (struct pci_
|
||||
};
|
||||
const struct ata_port_info *ppi[] = { &info, NULL };
|
||||
|
||||
- /*
|
||||
- * The JMicron chip 361/363 contains one SATA controller and one
|
||||
- * PATA controller,for powering on these both controllers, we must
|
||||
- * follow the sequence one by one, otherwise one of them can not be
|
||||
- * powered on successfully, so here we disable the async suspend
|
||||
- * method for these chips.
|
||||
- */
|
||||
- if (pdev->vendor == PCI_VENDOR_ID_JMICRON &&
|
||||
- (pdev->device == PCI_DEVICE_ID_JMICRON_JMB363 ||
|
||||
- pdev->device == PCI_DEVICE_ID_JMICRON_JMB361))
|
||||
- device_disable_async_suspend(&pdev->dev);
|
||||
-
|
||||
return ata_pci_bmdma_init_one(pdev, ppi, &jmicron_sht, NULL, 0);
|
||||
}
|
||||
|
||||
--- a/drivers/pci/quirks.c
|
||||
+++ b/drivers/pci/quirks.c
|
||||
@@ -1576,6 +1576,18 @@ DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDO
|
||||
|
||||
#endif
|
||||
|
||||
+static void quirk_jmicron_async_suspend(struct pci_dev *dev)
|
||||
+{
|
||||
+ if (dev->multifunction) {
|
||||
+ device_disable_async_suspend(&dev->dev);
|
||||
+ dev_info(&dev->dev, "async suspend disabled to avoid multi-function power-on ordering issue\n");
|
||||
+ }
|
||||
+}
|
||||
+DECLARE_PCI_FIXUP_CLASS_FINAL(PCI_VENDOR_ID_JMICRON, PCI_ANY_ID, PCI_CLASS_STORAGE_IDE, 8, quirk_jmicron_async_suspend);
|
||||
+DECLARE_PCI_FIXUP_CLASS_FINAL(PCI_VENDOR_ID_JMICRON, PCI_ANY_ID, PCI_CLASS_STORAGE_SATA_AHCI, 0, quirk_jmicron_async_suspend);
|
||||
+DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_JMICRON, 0x2362, quirk_jmicron_async_suspend);
|
||||
+DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_JMICRON, 0x236f, quirk_jmicron_async_suspend);
|
||||
+
|
||||
#ifdef CONFIG_X86_IO_APIC
|
||||
static void quirk_alder_ioapic(struct pci_dev *pdev)
|
||||
{
|
||||
@@ -0,0 +1,45 @@
|
||||
From d1541dc977d376406f4584d8eb055488655c98ec Mon Sep 17 00:00:00 2001
|
||||
From: Bjorn Helgaas <bhelgaas@google.com>
|
||||
Date: Fri, 19 Jun 2015 15:58:24 -0500
|
||||
Subject: PCI: Fix TI816X class code quirk
|
||||
|
||||
From: Bjorn Helgaas <bhelgaas@google.com>
|
||||
|
||||
commit d1541dc977d376406f4584d8eb055488655c98ec upstream.
|
||||
|
||||
In fixup_ti816x_class(), we assigned "class = PCI_CLASS_MULTIMEDIA_VIDEO".
|
||||
But PCI_CLASS_MULTIMEDIA_VIDEO is only the two-byte base class/sub-class
|
||||
and needs to be shifted to make space for the low-order interface byte.
|
||||
|
||||
Shift PCI_CLASS_MULTIMEDIA_VIDEO to set the correct class code.
|
||||
|
||||
Fixes: 63c4408074cb ("PCI: Add quirk for setting valid class for TI816X Endpoint")
|
||||
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
|
||||
CC: Hemant Pedanekar <hemantp@ti.com>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
|
||||
---
|
||||
drivers/pci/quirks.c | 9 ++++++---
|
||||
1 file changed, 6 insertions(+), 3 deletions(-)
|
||||
|
||||
--- a/drivers/pci/quirks.c
|
||||
+++ b/drivers/pci/quirks.c
|
||||
@@ -2838,12 +2838,15 @@ DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_IN
|
||||
|
||||
static void fixup_ti816x_class(struct pci_dev *dev)
|
||||
{
|
||||
+ u32 class = dev->class;
|
||||
+
|
||||
/* TI 816x devices do not have class code set when in PCIe boot mode */
|
||||
- dev_info(&dev->dev, "Setting PCI class for 816x PCIe device\n");
|
||||
- dev->class = PCI_CLASS_MULTIMEDIA_VIDEO;
|
||||
+ dev->class = PCI_CLASS_MULTIMEDIA_VIDEO << 8;
|
||||
+ dev_info(&dev->dev, "PCI class overridden (%#08x -> %#08x)\n",
|
||||
+ class, dev->class);
|
||||
}
|
||||
DECLARE_PCI_FIXUP_CLASS_EARLY(PCI_VENDOR_ID_TI, 0xb800,
|
||||
- PCI_CLASS_NOT_DEFINED, 0, fixup_ti816x_class);
|
||||
+ PCI_CLASS_NOT_DEFINED, 0, fixup_ti816x_class);
|
||||
|
||||
/* Some PCIe devices do not work reliably with the claimed maximum
|
||||
* payload size supported.
|
||||
-49
@@ -1,49 +0,0 @@
|
||||
From ee9397a6fb9bc4e52677f5e33eed4abee0f515e6 Mon Sep 17 00:00:00 2001
|
||||
From: Ben Hutchings <ben@decadent.org.uk>
|
||||
Date: Mon, 27 Jul 2015 00:31:08 +0100
|
||||
Subject: perf: Fix double-free of the AUX buffer
|
||||
|
||||
From: Ben Hutchings <ben@decadent.org.uk>
|
||||
|
||||
commit ee9397a6fb9bc4e52677f5e33eed4abee0f515e6 upstream.
|
||||
|
||||
If rb->aux_refcount is decremented to zero before rb->refcount,
|
||||
__rb_free_aux() may be called twice resulting in a double free of
|
||||
rb->aux_pages. Fix this by adding a check to __rb_free_aux().
|
||||
|
||||
Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
|
||||
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
|
||||
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
|
||||
Cc: Arnaldo Carvalho de Melo <acme@kernel.org>
|
||||
Cc: Linus Torvalds <torvalds@linux-foundation.org>
|
||||
Cc: Peter Zijlstra <peterz@infradead.org>
|
||||
Cc: Thomas Gleixner <tglx@linutronix.de>
|
||||
Fixes: 57ffc5ca679f ("perf: Fix AUX buffer refcounting")
|
||||
Link: http://lkml.kernel.org/r/1437953468.12842.17.camel@decadent.org.uk
|
||||
Signed-off-by: Ingo Molnar <mingo@kernel.org>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
|
||||
---
|
||||
kernel/events/ring_buffer.c | 10 ++++++----
|
||||
1 file changed, 6 insertions(+), 4 deletions(-)
|
||||
|
||||
--- a/kernel/events/ring_buffer.c
|
||||
+++ b/kernel/events/ring_buffer.c
|
||||
@@ -547,11 +547,13 @@ static void __rb_free_aux(struct ring_bu
|
||||
rb->aux_priv = NULL;
|
||||
}
|
||||
|
||||
- for (pg = 0; pg < rb->aux_nr_pages; pg++)
|
||||
- rb_free_aux_page(rb, pg);
|
||||
+ if (rb->aux_nr_pages) {
|
||||
+ for (pg = 0; pg < rb->aux_nr_pages; pg++)
|
||||
+ rb_free_aux_page(rb, pg);
|
||||
|
||||
- kfree(rb->aux_pages);
|
||||
- rb->aux_nr_pages = 0;
|
||||
+ kfree(rb->aux_pages);
|
||||
+ rb->aux_nr_pages = 0;
|
||||
+ }
|
||||
}
|
||||
|
||||
void rb_free_aux(struct ring_buffer *rb)
|
||||
-69
@@ -1,69 +0,0 @@
|
||||
From fed66e2cdd4f127a43fd11b8d92a99bdd429528c Mon Sep 17 00:00:00 2001
|
||||
From: Peter Zijlstra <peterz@infradead.org>
|
||||
Date: Thu, 11 Jun 2015 10:32:01 +0200
|
||||
Subject: perf: Fix fasync handling on inherited events
|
||||
|
||||
From: Peter Zijlstra <peterz@infradead.org>
|
||||
|
||||
commit fed66e2cdd4f127a43fd11b8d92a99bdd429528c upstream.
|
||||
|
||||
Vince reported that the fasync signal stuff doesn't work proper for
|
||||
inherited events. So fix that.
|
||||
|
||||
Installing fasync allocates memory and sets filp->f_flags |= FASYNC,
|
||||
which upon the demise of the file descriptor ensures the allocation is
|
||||
freed and state is updated.
|
||||
|
||||
Now for perf, we can have the events stick around for a while after the
|
||||
original FD is dead because of references from child events. So we
|
||||
cannot copy the fasync pointer around. We can however consistently use
|
||||
the parent's fasync, as that will be updated.
|
||||
|
||||
Reported-and-Tested-by: Vince Weaver <vincent.weaver@maine.edu>
|
||||
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
|
||||
Cc: Arnaldo Carvalho deMelo <acme@kernel.org>
|
||||
Cc: Linus Torvalds <torvalds@linux-foundation.org>
|
||||
Cc: Peter Zijlstra <peterz@infradead.org>
|
||||
Cc: Thomas Gleixner <tglx@linutronix.de>
|
||||
Cc: eranian@google.com
|
||||
Link: http://lkml.kernel.org/r/1434011521.1495.71.camel@twins
|
||||
Signed-off-by: Ingo Molnar <mingo@kernel.org>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
|
||||
---
|
||||
kernel/events/core.c | 12 ++++++++++--
|
||||
1 file changed, 10 insertions(+), 2 deletions(-)
|
||||
|
||||
--- a/kernel/events/core.c
|
||||
+++ b/kernel/events/core.c
|
||||
@@ -4766,12 +4766,20 @@ static const struct file_operations perf
|
||||
* to user-space before waking everybody up.
|
||||
*/
|
||||
|
||||
+static inline struct fasync_struct **perf_event_fasync(struct perf_event *event)
|
||||
+{
|
||||
+ /* only the parent has fasync state */
|
||||
+ if (event->parent)
|
||||
+ event = event->parent;
|
||||
+ return &event->fasync;
|
||||
+}
|
||||
+
|
||||
void perf_event_wakeup(struct perf_event *event)
|
||||
{
|
||||
ring_buffer_wakeup(event);
|
||||
|
||||
if (event->pending_kill) {
|
||||
- kill_fasync(&event->fasync, SIGIO, event->pending_kill);
|
||||
+ kill_fasync(perf_event_fasync(event), SIGIO, event->pending_kill);
|
||||
event->pending_kill = 0;
|
||||
}
|
||||
}
|
||||
@@ -6117,7 +6125,7 @@ static int __perf_event_overflow(struct
|
||||
else
|
||||
perf_event_output(event, data, regs);
|
||||
|
||||
- if (event->fasync && event->pending_kill) {
|
||||
+ if (*perf_event_fasync(event) && event->pending_kill) {
|
||||
event->pending_wakeup = 1;
|
||||
irq_work_queue(&event->pending);
|
||||
}
|
||||
-125
@@ -1,125 +0,0 @@
|
||||
From c7999c6f3fed9e383d3131474588f282ae6d56b9 Mon Sep 17 00:00:00 2001
|
||||
From: Peter Zijlstra <peterz@infradead.org>
|
||||
Date: Tue, 4 Aug 2015 19:22:49 +0200
|
||||
Subject: perf: Fix PERF_EVENT_IOC_PERIOD migration race
|
||||
|
||||
From: Peter Zijlstra <peterz@infradead.org>
|
||||
|
||||
commit c7999c6f3fed9e383d3131474588f282ae6d56b9 upstream.
|
||||
|
||||
I ran the perf fuzzer, which triggered some WARN()s which are due to
|
||||
trying to stop/restart an event on the wrong CPU.
|
||||
|
||||
Use the normal IPI pattern to ensure we run the code on the correct CPU.
|
||||
|
||||
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
|
||||
Cc: Vince Weaver <vincent.weaver@maine.edu>
|
||||
Cc: Linus Torvalds <torvalds@linux-foundation.org>
|
||||
Cc: Peter Zijlstra <peterz@infradead.org>
|
||||
Cc: Thomas Gleixner <tglx@linutronix.de>
|
||||
Fixes: bad7192b842c ("perf: Fix PERF_EVENT_IOC_PERIOD to force-reset the period")
|
||||
Signed-off-by: Ingo Molnar <mingo@kernel.org>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
|
||||
---
|
||||
kernel/events/core.c | 75 +++++++++++++++++++++++++++++++++++++--------------
|
||||
1 file changed, 55 insertions(+), 20 deletions(-)
|
||||
|
||||
--- a/kernel/events/core.c
|
||||
+++ b/kernel/events/core.c
|
||||
@@ -3976,28 +3976,21 @@ static void perf_event_for_each(struct p
|
||||
perf_event_for_each_child(sibling, func);
|
||||
}
|
||||
|
||||
-static int perf_event_period(struct perf_event *event, u64 __user *arg)
|
||||
-{
|
||||
- struct perf_event_context *ctx = event->ctx;
|
||||
- int ret = 0, active;
|
||||
+struct period_event {
|
||||
+ struct perf_event *event;
|
||||
u64 value;
|
||||
+};
|
||||
|
||||
- if (!is_sampling_event(event))
|
||||
- return -EINVAL;
|
||||
-
|
||||
- if (copy_from_user(&value, arg, sizeof(value)))
|
||||
- return -EFAULT;
|
||||
-
|
||||
- if (!value)
|
||||
- return -EINVAL;
|
||||
+static int __perf_event_period(void *info)
|
||||
+{
|
||||
+ struct period_event *pe = info;
|
||||
+ struct perf_event *event = pe->event;
|
||||
+ struct perf_event_context *ctx = event->ctx;
|
||||
+ u64 value = pe->value;
|
||||
+ bool active;
|
||||
|
||||
- raw_spin_lock_irq(&ctx->lock);
|
||||
+ raw_spin_lock(&ctx->lock);
|
||||
if (event->attr.freq) {
|
||||
- if (value > sysctl_perf_event_sample_rate) {
|
||||
- ret = -EINVAL;
|
||||
- goto unlock;
|
||||
- }
|
||||
-
|
||||
event->attr.sample_freq = value;
|
||||
} else {
|
||||
event->attr.sample_period = value;
|
||||
@@ -4016,11 +4009,53 @@ static int perf_event_period(struct perf
|
||||
event->pmu->start(event, PERF_EF_RELOAD);
|
||||
perf_pmu_enable(ctx->pmu);
|
||||
}
|
||||
+ raw_spin_unlock(&ctx->lock);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int perf_event_period(struct perf_event *event, u64 __user *arg)
|
||||
+{
|
||||
+ struct period_event pe = { .event = event, };
|
||||
+ struct perf_event_context *ctx = event->ctx;
|
||||
+ struct task_struct *task;
|
||||
+ u64 value;
|
||||
+
|
||||
+ if (!is_sampling_event(event))
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ if (copy_from_user(&value, arg, sizeof(value)))
|
||||
+ return -EFAULT;
|
||||
+
|
||||
+ if (!value)
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ if (event->attr.freq && value > sysctl_perf_event_sample_rate)
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ task = ctx->task;
|
||||
+ pe.value = value;
|
||||
+
|
||||
+ if (!task) {
|
||||
+ cpu_function_call(event->cpu, __perf_event_period, &pe);
|
||||
+ return 0;
|
||||
+ }
|
||||
+
|
||||
+retry:
|
||||
+ if (!task_function_call(task, __perf_event_period, &pe))
|
||||
+ return 0;
|
||||
+
|
||||
+ raw_spin_lock_irq(&ctx->lock);
|
||||
+ if (ctx->is_active) {
|
||||
+ raw_spin_unlock_irq(&ctx->lock);
|
||||
+ task = ctx->task;
|
||||
+ goto retry;
|
||||
+ }
|
||||
|
||||
-unlock:
|
||||
+ __perf_event_period(&pe);
|
||||
raw_spin_unlock_irq(&ctx->lock);
|
||||
|
||||
- return ret;
|
||||
+ return 0;
|
||||
}
|
||||
|
||||
static const struct file_operations perf_fops;
|
||||
@@ -1,49 +0,0 @@
|
||||
From 00a2916f7f82c348a2a94dbb572874173bc308a3 Mon Sep 17 00:00:00 2001
|
||||
From: Peter Zijlstra <peterz@infradead.org>
|
||||
Date: Mon, 27 Jul 2015 10:35:07 +0200
|
||||
Subject: perf: Fix running time accounting
|
||||
|
||||
From: Peter Zijlstra <peterz@infradead.org>
|
||||
|
||||
commit 00a2916f7f82c348a2a94dbb572874173bc308a3 upstream.
|
||||
|
||||
A recent fix to the shadow timestamp inadvertly broke the running time
|
||||
accounting.
|
||||
|
||||
We must not update the running timestamp if we fail to schedule the
|
||||
event, the event will not have ran. This can (and did) result in
|
||||
negative total runtime because the stopped timestamp was before the
|
||||
running timestamp (we 'started' but never stopped the event -- because
|
||||
it never really started we didn't have to stop it either).
|
||||
|
||||
Reported-and-Tested-by: Vince Weaver <vincent.weaver@maine.edu>
|
||||
Fixes: 72f669c0086f ("perf: Update shadow timestamp before add event")
|
||||
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
|
||||
Cc: Shaohua Li <shli@fb.com>
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
|
||||
---
|
||||
kernel/events/core.c | 4 ++--
|
||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
--- a/kernel/events/core.c
|
||||
+++ b/kernel/events/core.c
|
||||
@@ -1886,8 +1886,6 @@ event_sched_in(struct perf_event *event,
|
||||
|
||||
perf_pmu_disable(event->pmu);
|
||||
|
||||
- event->tstamp_running += tstamp - event->tstamp_stopped;
|
||||
-
|
||||
perf_set_shadow_time(event, ctx, tstamp);
|
||||
|
||||
perf_log_itrace_start(event);
|
||||
@@ -1899,6 +1897,8 @@ event_sched_in(struct perf_event *event,
|
||||
goto out;
|
||||
}
|
||||
|
||||
+ event->tstamp_running += tstamp - event->tstamp_stopped;
|
||||
+
|
||||
if (!is_software_event(event))
|
||||
cpuctx->active_oncpu++;
|
||||
if (!ctx->nr_active++)
|
||||
+48
@@ -0,0 +1,48 @@
|
||||
From f4745a92781b872455f32feb01d1dce92aefcb6c Mon Sep 17 00:00:00 2001
|
||||
From: Colin Ian King <colin.king@canonical.com>
|
||||
Date: Mon, 29 Jun 2015 22:13:38 +0100
|
||||
Subject: PM / clk: don't return int on __pm_clk_enable()
|
||||
|
||||
From: Colin Ian King <colin.king@canonical.com>
|
||||
|
||||
commit f4745a92781b872455f32feb01d1dce92aefcb6c upstream.
|
||||
|
||||
Static analysis by cppcheck found an issue that was recently introduced by
|
||||
commit 471f7707b6f0b1 ("PM / clock_ops: make __pm_clk_enable more generic")
|
||||
where a return status in ret was not being initialised and garbage
|
||||
being returned when ce->status >= PCE_STATUS_ERROR.
|
||||
|
||||
The fact that ret is not being checked by the caller and that
|
||||
ret is only used internally __pm_clk_enable() to check if clk_enable()
|
||||
was OK means we can ignore returning it instead turn
|
||||
__pm_clk_enable() into function with a void return.
|
||||
|
||||
Fixes: 471f7707b6f0b1 ("PM / clock_ops: make __pm_clk_enable more generic")
|
||||
Signed-off-by: Colin Ian King <colin.king@canonical.com>
|
||||
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
|
||||
---
|
||||
drivers/base/power/clock_ops.c | 4 +---
|
||||
1 file changed, 1 insertion(+), 3 deletions(-)
|
||||
|
||||
--- a/drivers/base/power/clock_ops.c
|
||||
+++ b/drivers/base/power/clock_ops.c
|
||||
@@ -37,7 +37,7 @@ struct pm_clock_entry {
|
||||
* @dev: The device for the given clock
|
||||
* @ce: PM clock entry corresponding to the clock.
|
||||
*/
|
||||
-static inline int __pm_clk_enable(struct device *dev, struct pm_clock_entry *ce)
|
||||
+static inline void __pm_clk_enable(struct device *dev, struct pm_clock_entry *ce)
|
||||
{
|
||||
int ret;
|
||||
|
||||
@@ -49,8 +49,6 @@ static inline int __pm_clk_enable(struct
|
||||
dev_err(dev, "%s: failed to enable clk %p, error %d\n",
|
||||
__func__, ce->clk, ret);
|
||||
}
|
||||
-
|
||||
- return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
-88
@@ -1,88 +0,0 @@
|
||||
From 5d5cd85ff441534a52f23f821d0a7c644d3b6cce Mon Sep 17 00:00:00 2001
|
||||
From: Mike Looijmans <mike.looijmans@topic.nl>
|
||||
Date: Tue, 28 Jul 2015 07:51:01 +0200
|
||||
Subject: rsi: Fix failure to load firmware after memory leak fix and fix the leak
|
||||
|
||||
From: Mike Looijmans <mike.looijmans@topic.nl>
|
||||
|
||||
commit 5d5cd85ff441534a52f23f821d0a7c644d3b6cce upstream.
|
||||
|
||||
Fixes commit eae79b4f3e82 ("rsi: fix memory leak in rsi_load_ta_instructions()")
|
||||
which stopped the driver from functioning.
|
||||
|
||||
Firmware data has been allocated using vmalloc(), resulting in memory
|
||||
that cannot be used for DMA. Hence the firmware was first copied to a
|
||||
buffer allocated with kmalloc() in the original code. This patch reverts
|
||||
the commit and only calls "kfree()" to release the buffer after sending
|
||||
the data. This fixes the memory leak without breaking the driver.
|
||||
|
||||
Add a comment to the kmemdup() calls to explain why this is done, and abort
|
||||
if memory allocation fails.
|
||||
|
||||
Tested on a Topic Miami-Florida board which contains the rsi SDIO chip.
|
||||
|
||||
Also added the same kfree() call to the USB glue driver. This was not
|
||||
tested on actual hardware though, as I only have the SDIO version.
|
||||
|
||||
Fixes: eae79b4f3e82 ("rsi: fix memory leak in rsi_load_ta_instructions()")
|
||||
Signed-off-by: Mike Looijmans <mike.looijmans@topic.nl>
|
||||
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
|
||||
---
|
||||
drivers/net/wireless/rsi/rsi_91x_sdio_ops.c | 8 +++++++-
|
||||
drivers/net/wireless/rsi/rsi_91x_usb_ops.c | 4 ++++
|
||||
2 files changed, 11 insertions(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/net/wireless/rsi/rsi_91x_sdio_ops.c
|
||||
+++ b/drivers/net/wireless/rsi/rsi_91x_sdio_ops.c
|
||||
@@ -172,6 +172,7 @@ static int rsi_load_ta_instructions(stru
|
||||
(struct rsi_91x_sdiodev *)adapter->rsi_dev;
|
||||
u32 len;
|
||||
u32 num_blocks;
|
||||
+ const u8 *fw;
|
||||
const struct firmware *fw_entry = NULL;
|
||||
u32 block_size = dev->tx_blk_size;
|
||||
int status = 0;
|
||||
@@ -200,6 +201,10 @@ static int rsi_load_ta_instructions(stru
|
||||
return status;
|
||||
}
|
||||
|
||||
+ /* Copy firmware into DMA-accessible memory */
|
||||
+ fw = kmemdup(fw_entry->data, fw_entry->size, GFP_KERNEL);
|
||||
+ if (!fw)
|
||||
+ return -ENOMEM;
|
||||
len = fw_entry->size;
|
||||
|
||||
if (len % 4)
|
||||
@@ -210,7 +215,8 @@ static int rsi_load_ta_instructions(stru
|
||||
rsi_dbg(INIT_ZONE, "%s: Instruction size:%d\n", __func__, len);
|
||||
rsi_dbg(INIT_ZONE, "%s: num blocks: %d\n", __func__, num_blocks);
|
||||
|
||||
- status = rsi_copy_to_card(common, fw_entry->data, len, num_blocks);
|
||||
+ status = rsi_copy_to_card(common, fw, len, num_blocks);
|
||||
+ kfree(fw);
|
||||
release_firmware(fw_entry);
|
||||
return status;
|
||||
}
|
||||
--- a/drivers/net/wireless/rsi/rsi_91x_usb_ops.c
|
||||
+++ b/drivers/net/wireless/rsi/rsi_91x_usb_ops.c
|
||||
@@ -146,7 +146,10 @@ static int rsi_load_ta_instructions(stru
|
||||
return status;
|
||||
}
|
||||
|
||||
+ /* Copy firmware into DMA-accessible memory */
|
||||
fw = kmemdup(fw_entry->data, fw_entry->size, GFP_KERNEL);
|
||||
+ if (!fw)
|
||||
+ return -ENOMEM;
|
||||
len = fw_entry->size;
|
||||
|
||||
if (len % 4)
|
||||
@@ -158,6 +161,7 @@ static int rsi_load_ta_instructions(stru
|
||||
rsi_dbg(INIT_ZONE, "%s: num blocks: %d\n", __func__, num_blocks);
|
||||
|
||||
status = rsi_copy_to_card(common, fw, len, num_blocks);
|
||||
+ kfree(fw);
|
||||
release_firmware(fw_entry);
|
||||
return status;
|
||||
}
|
||||
-59
@@ -1,59 +0,0 @@
|
||||
From 7c62940165e9ae4004ce4e6b5117330bab94df68 Mon Sep 17 00:00:00 2001
|
||||
From: Luis Felipe Dominguez Vega <lfdominguez@nauta.cu>
|
||||
Date: Wed, 29 Jul 2015 21:11:20 -0500
|
||||
Subject: rtlwifi: Fix NULL dereference when PCI driver used as an AP
|
||||
|
||||
From: Luis Felipe Dominguez Vega <lfdominguez@nauta.cu>
|
||||
|
||||
commit 7c62940165e9ae4004ce4e6b5117330bab94df68 upstream.
|
||||
|
||||
In commit 33511b157bbcebaef853cc1811992b664a2e5862 ("rtlwifi: add support to
|
||||
send beacon frame"), the mechanism for sending beacons was established. That
|
||||
patch works correctly for rtl8192cu, but there is a possibility of getting
|
||||
the following warnings in the PCI drivers:
|
||||
|
||||
WARNING: CPU: 1 PID: 2439 at net/mac80211/driver-ops.h:12
|
||||
ieee80211_bss_info_change_notify+0x179/0x1d0 [mac80211]()
|
||||
wlp5s0: Failed check-sdata-in-driver check, flags: 0x0
|
||||
|
||||
The warning is followed by a NULL pointer dereference as follows:
|
||||
|
||||
BUG: unable to handle kernel NULL pointer dereference at 0000000000000006
|
||||
IP: [<ffffffffc073998e>] rtl_get_tcb_desc+0x5e/0x760 [rtlwifi]
|
||||
|
||||
This problem was reported at http://thread.gmane.org/gmane.linux.kernel.wireless.general/138645,
|
||||
but no solution was found at that time.
|
||||
|
||||
The problem was also reported at https://bugzilla.kernel.org/show_bug.cgi?id=9744
|
||||
and this solution was developed and tested there.
|
||||
|
||||
The USB driver works with a NULL final argument in the adapter_tx() callback;
|
||||
however, the PCI drivers need a struct rtl_tcb_desc in that position.
|
||||
|
||||
Fixes: 33511b157bbc ("rtlwifi: add support to send beacon frame.")
|
||||
Signed-off-by: Luis Felipe Dominguez Vega <lfdominguez@nauta.cu>
|
||||
Signed-off-by: Larry Finger <Larry.Finger@lwfinger.net>
|
||||
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
|
||||
---
|
||||
drivers/net/wireless/rtlwifi/core.c | 7 +++++--
|
||||
1 file changed, 5 insertions(+), 2 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/rtlwifi/core.c
|
||||
+++ b/drivers/net/wireless/rtlwifi/core.c
|
||||
@@ -1015,9 +1015,12 @@ static void send_beacon_frame(struct iee
|
||||
{
|
||||
struct rtl_priv *rtlpriv = rtl_priv(hw);
|
||||
struct sk_buff *skb = ieee80211_beacon_get(hw, vif);
|
||||
+ struct rtl_tcb_desc tcb_desc;
|
||||
|
||||
- if (skb)
|
||||
- rtlpriv->intf_ops->adapter_tx(hw, NULL, skb, NULL);
|
||||
+ if (skb) {
|
||||
+ memset(&tcb_desc, 0, sizeof(struct rtl_tcb_desc));
|
||||
+ rtlpriv->intf_ops->adapter_tx(hw, NULL, skb, &tcb_desc);
|
||||
+ }
|
||||
}
|
||||
|
||||
static void rtl_op_bss_info_changed(struct ieee80211_hw *hw,
|
||||
-30
@@ -1,30 +0,0 @@
|
||||
From 741e3b9902d11585e18bfc7f8d47e913616bb070 Mon Sep 17 00:00:00 2001
|
||||
From: Larry Finger <Larry.Finger@lwfinger.net>
|
||||
Date: Sun, 2 Aug 2015 13:24:13 -0500
|
||||
Subject: rtlwifi: rtl8723be: Add module parameter for MSI interrupts
|
||||
|
||||
From: Larry Finger <Larry.Finger@lwfinger.net>
|
||||
|
||||
commit 741e3b9902d11585e18bfc7f8d47e913616bb070 upstream.
|
||||
|
||||
The driver code allows for the disabling of MSI interrupts; however the
|
||||
module_parm line was missed and the option fails to show with modinfo.
|
||||
|
||||
Signed-off-by: Larry Finger <Larry.Finger@lwfinger.net>
|
||||
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
|
||||
---
|
||||
drivers/net/wireless/rtlwifi/rtl8723be/sw.c | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
--- a/drivers/net/wireless/rtlwifi/rtl8723be/sw.c
|
||||
+++ b/drivers/net/wireless/rtlwifi/rtl8723be/sw.c
|
||||
@@ -385,6 +385,7 @@ module_param_named(debug, rtl8723be_mod_
|
||||
module_param_named(ips, rtl8723be_mod_params.inactiveps, bool, 0444);
|
||||
module_param_named(swlps, rtl8723be_mod_params.swctrl_lps, bool, 0444);
|
||||
module_param_named(fwlps, rtl8723be_mod_params.fwctrl_lps, bool, 0444);
|
||||
+module_param_named(msi, rtl8723be_mod_params.msi_support, bool, 0444);
|
||||
module_param_named(disable_watchdog, rtl8723be_mod_params.disable_watchdog,
|
||||
bool, 0444);
|
||||
MODULE_PARM_DESC(swenc, "Set to 1 for software crypto (default 0)\n");
|
||||
@@ -0,0 +1,35 @@
|
||||
From a313bdc5310dd807655d3ca3eb2219cd65dfe45a Mon Sep 17 00:00:00 2001
|
||||
From: Sebastian Ott <sebott@linux.vnet.ibm.com>
|
||||
Date: Thu, 25 Jun 2015 09:32:22 +0200
|
||||
Subject: s390/sclp: fix compile error
|
||||
|
||||
From: Sebastian Ott <sebott@linux.vnet.ibm.com>
|
||||
|
||||
commit a313bdc5310dd807655d3ca3eb2219cd65dfe45a upstream.
|
||||
|
||||
Fix this error when compiling with CONFIG_SMP=n and
|
||||
CONFIG_DYNAMIC_DEBUG=y:
|
||||
|
||||
drivers/s390/char/sclp_early.c: In function 'sclp_read_info_early':
|
||||
drivers/s390/char/sclp_early.c:87:19: error: 'EBUSY' undeclared (first use in this function)
|
||||
} while (rc == -EBUSY);
|
||||
^
|
||||
|
||||
Signed-off-by: Sebastian Ott <sebott@linux.vnet.ibm.com>
|
||||
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
|
||||
---
|
||||
drivers/s390/char/sclp_early.c | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
--- a/drivers/s390/char/sclp_early.c
|
||||
+++ b/drivers/s390/char/sclp_early.c
|
||||
@@ -7,6 +7,7 @@
|
||||
#define KMSG_COMPONENT "sclp_early"
|
||||
#define pr_fmt(fmt) KMSG_COMPONENT ": " fmt
|
||||
|
||||
+#include <linux/errno.h>
|
||||
#include <asm/ctl_reg.h>
|
||||
#include <asm/sclp.h>
|
||||
#include <asm/ipl.h>
|
||||
@@ -0,0 +1,74 @@
|
||||
From 89b1145e93771d727645c96e323539c029b63f1c Mon Sep 17 00:00:00 2001
|
||||
From: Martin Schwidefsky <schwidefsky@de.ibm.com>
|
||||
Date: Fri, 14 Aug 2015 13:20:28 +0200
|
||||
Subject: s390/setup: fix novx parameter
|
||||
|
||||
From: Martin Schwidefsky <schwidefsky@de.ibm.com>
|
||||
|
||||
commit 89b1145e93771d727645c96e323539c029b63f1c upstream.
|
||||
|
||||
The novx parameter disables the vector facility but the HWCAP_S390_VXRS
|
||||
bit in the ELf hardware capabilies is always set if the machine has
|
||||
the vector facility. If the user space program uses the "vx" string
|
||||
in the features field of /proc/cpuinfo to utilize vector instruction
|
||||
it will crash if the novx kernel paramter is set.
|
||||
|
||||
Convert setup_hwcaps to an arch_initcall and use MACHINE_HAS_VX to
|
||||
decide if the HWCAPS_S390_VXRS bit needs to be set.
|
||||
|
||||
Reported-by: Ulrich Weigand <uweigand@de.ibm.com>
|
||||
Reviewed-by: Heiko Carstens <heiko.carstens@de.ibm.com>
|
||||
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
|
||||
---
|
||||
arch/s390/kernel/setup.c | 15 +++++++--------
|
||||
1 file changed, 7 insertions(+), 8 deletions(-)
|
||||
|
||||
--- a/arch/s390/kernel/setup.c
|
||||
+++ b/arch/s390/kernel/setup.c
|
||||
@@ -683,7 +683,7 @@ static void __init setup_memory(void)
|
||||
/*
|
||||
* Setup hardware capabilities.
|
||||
*/
|
||||
-static void __init setup_hwcaps(void)
|
||||
+static int __init setup_hwcaps(void)
|
||||
{
|
||||
static const int stfl_bits[6] = { 0, 2, 7, 17, 19, 21 };
|
||||
struct cpuid cpu_id;
|
||||
@@ -749,9 +749,11 @@ static void __init setup_hwcaps(void)
|
||||
elf_hwcap |= HWCAP_S390_TE;
|
||||
|
||||
/*
|
||||
- * Vector extension HWCAP_S390_VXRS is bit 11.
|
||||
+ * Vector extension HWCAP_S390_VXRS is bit 11. The Vector extension
|
||||
+ * can be disabled with the "novx" parameter. Use MACHINE_HAS_VX
|
||||
+ * instead of facility bit 129.
|
||||
*/
|
||||
- if (test_facility(129))
|
||||
+ if (MACHINE_HAS_VX)
|
||||
elf_hwcap |= HWCAP_S390_VXRS;
|
||||
get_cpu_id(&cpu_id);
|
||||
add_device_randomness(&cpu_id, sizeof(cpu_id));
|
||||
@@ -788,7 +790,9 @@ static void __init setup_hwcaps(void)
|
||||
strcpy(elf_platform, "z13");
|
||||
break;
|
||||
}
|
||||
+ return 0;
|
||||
}
|
||||
+arch_initcall(setup_hwcaps);
|
||||
|
||||
/*
|
||||
* Add system information as device randomness
|
||||
@@ -871,11 +875,6 @@ void __init setup_arch(char **cmdline_p)
|
||||
cpu_init();
|
||||
|
||||
/*
|
||||
- * Setup capabilities (ELF_HWCAP & ELF_PLATFORM).
|
||||
- */
|
||||
- setup_hwcaps();
|
||||
-
|
||||
- /*
|
||||
* Create kernel page tables and switch to virtual addressing.
|
||||
*/
|
||||
paging_init();
|
||||
+146
@@ -0,0 +1,146 @@
|
||||
From dd9d3843755da95f63dd3a376f62b3e45c011210 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Jan=20H=2E=20Sch=C3=B6nherr?= <jschoenh@amazon.de>
|
||||
Date: Wed, 12 Aug 2015 21:35:56 +0200
|
||||
Subject: sched: Fix cpu_active_mask/cpu_online_mask race
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
From: =?UTF-8?q?Jan=20H=2E=20Sch=C3=B6nherr?= <jschoenh@amazon.de>
|
||||
|
||||
commit dd9d3843755da95f63dd3a376f62b3e45c011210 upstream.
|
||||
|
||||
There is a race condition in SMP bootup code, which may result
|
||||
in
|
||||
|
||||
WARNING: CPU: 0 PID: 1 at kernel/workqueue.c:4418
|
||||
workqueue_cpu_up_callback()
|
||||
or
|
||||
kernel BUG at kernel/smpboot.c:135!
|
||||
|
||||
It can be triggered with a bit of luck in Linux guests running
|
||||
on busy hosts.
|
||||
|
||||
CPU0 CPUn
|
||||
==== ====
|
||||
|
||||
_cpu_up()
|
||||
__cpu_up()
|
||||
start_secondary()
|
||||
set_cpu_online()
|
||||
cpumask_set_cpu(cpu,
|
||||
to_cpumask(cpu_online_bits));
|
||||
cpu_notify(CPU_ONLINE)
|
||||
<do stuff, see below>
|
||||
cpumask_set_cpu(cpu,
|
||||
to_cpumask(cpu_active_bits));
|
||||
|
||||
During the various CPU_ONLINE callbacks CPUn is online but not
|
||||
active. Several things can go wrong at that point, depending on
|
||||
the scheduling of tasks on CPU0.
|
||||
|
||||
Variant 1:
|
||||
|
||||
cpu_notify(CPU_ONLINE)
|
||||
workqueue_cpu_up_callback()
|
||||
rebind_workers()
|
||||
set_cpus_allowed_ptr()
|
||||
|
||||
This call fails because it requires an active CPU; rebind_workers()
|
||||
ends with a warning:
|
||||
|
||||
WARNING: CPU: 0 PID: 1 at kernel/workqueue.c:4418
|
||||
workqueue_cpu_up_callback()
|
||||
|
||||
Variant 2:
|
||||
|
||||
cpu_notify(CPU_ONLINE)
|
||||
smpboot_thread_call()
|
||||
smpboot_unpark_threads()
|
||||
..
|
||||
__kthread_unpark()
|
||||
__kthread_bind()
|
||||
wake_up_state()
|
||||
..
|
||||
select_task_rq()
|
||||
select_fallback_rq()
|
||||
|
||||
The ->wake_cpu of the unparked thread is not allowed, making a call
|
||||
to select_fallback_rq() necessary. Then, select_fallback_rq() cannot
|
||||
find an allowed, active CPU and promptly resets the allowed CPUs, so
|
||||
that the task in question ends up on CPU0.
|
||||
|
||||
When those unparked tasks are eventually executed, they run
|
||||
immediately into a BUG:
|
||||
|
||||
kernel BUG at kernel/smpboot.c:135!
|
||||
|
||||
Just changing the order in which the online/active bits are set
|
||||
(and adding some memory barriers), would solve the two issues
|
||||
above. However, it would change the order of operations back to
|
||||
the one before commit 6acbfb96976f ("sched: Fix hotplug vs.
|
||||
set_cpus_allowed_ptr()"), thus, reintroducing that particular
|
||||
problem.
|
||||
|
||||
Going further back into history, we have at least the following
|
||||
commits touching this topic:
|
||||
- commit 2baab4e90495 ("sched: Fix select_fallback_rq() vs cpu_active/cpu_online")
|
||||
- commit 5fbd036b552f ("sched: Cleanup cpu_active madness")
|
||||
|
||||
Together, these give us the following non-working solutions:
|
||||
|
||||
- secondary CPU sets active before online, because active is assumed to
|
||||
be a subset of online;
|
||||
|
||||
- secondary CPU sets online before active, because the primary CPU
|
||||
assumes that an online CPU is also active;
|
||||
|
||||
- secondary CPU sets online and waits for primary CPU to set active,
|
||||
because it might deadlock.
|
||||
|
||||
Commit 875ebe940d77 ("powerpc/smp: Wait until secondaries are
|
||||
active & online") introduces an arch-specific solution to this
|
||||
arch-independent problem.
|
||||
|
||||
Now, go for a more general solution without explicit waiting and
|
||||
simply set active twice: once on the secondary CPU after online
|
||||
was set and once on the primary CPU after online was seen.
|
||||
|
||||
set_cpus_allowed_ptr()")
|
||||
|
||||
Signed-off-by: Jan H. Schönherr <jschoenh@amazon.de>
|
||||
Acked-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
|
||||
Cc: Anton Blanchard <anton@samba.org>
|
||||
Cc: Borislav Petkov <bp@alien8.de>
|
||||
Cc: Joerg Roedel <jroedel@suse.de>
|
||||
Cc: Linus Torvalds <torvalds@linux-foundation.org>
|
||||
Cc: Matt Wilson <msw@amazon.com>
|
||||
Cc: Michael Ellerman <mpe@ellerman.id.au>
|
||||
Cc: Peter Zijlstra <peterz@infradead.org>
|
||||
Cc: Thomas Gleixner <tglx@linutronix.de>
|
||||
Fixes: 6acbfb96976f ("sched: Fix hotplug vs. set_cpus_allowed_ptr()")
|
||||
Link: http://lkml.kernel.org/r/1439408156-18840-1-git-send-email-jschoenh@amazon.de
|
||||
Signed-off-by: Ingo Molnar <mingo@kernel.org>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
|
||||
---
|
||||
kernel/sched/core.c | 8 ++++++++
|
||||
1 file changed, 8 insertions(+)
|
||||
|
||||
--- a/kernel/sched/core.c
|
||||
+++ b/kernel/sched/core.c
|
||||
@@ -5328,6 +5328,14 @@ static int sched_cpu_active(struct notif
|
||||
case CPU_STARTING:
|
||||
set_cpu_rq_start_time();
|
||||
return NOTIFY_OK;
|
||||
+ case CPU_ONLINE:
|
||||
+ /*
|
||||
+ * At this point a starting CPU has marked itself as online via
|
||||
+ * set_cpu_online(). But it might not yet have marked itself
|
||||
+ * as active, which is essential from here on.
|
||||
+ *
|
||||
+ * Thus, fall-through and help the starting CPU along.
|
||||
+ */
|
||||
case CPU_DOWN_FAILED:
|
||||
set_cpu_active((long)hcpu, true);
|
||||
return NOTIFY_OK;
|
||||
+88
@@ -0,0 +1,88 @@
|
||||
From acace73df2c1913a526c1b41e4741a4a6704c863 Mon Sep 17 00:00:00 2001
|
||||
From: Martin Sperl <kernel@martin.sperl.org>
|
||||
Date: Tue, 28 Jul 2015 14:03:12 +0000
|
||||
Subject: spi: bcm2835: set up spi-mode before asserting cs-gpio
|
||||
|
||||
From: Martin Sperl <kernel@martin.sperl.org>
|
||||
|
||||
commit acace73df2c1913a526c1b41e4741a4a6704c863 upstream.
|
||||
|
||||
When using reverse polarity for clock (spi-cpol) on a device
|
||||
the clock line gets altered after chip-select has been asserted
|
||||
resulting in an additional clock beat, which confuses hardware.
|
||||
|
||||
This did not show when using native-CS, as the same register
|
||||
is used to control cs as well as polarity, so the changes came
|
||||
into effect at the same time. Unfortunately this is not true
|
||||
with gpio-cs.
|
||||
|
||||
To avoid this situation this patch moves the setup of polarity
|
||||
(spi-cpol and spi-cpha) outside of the chip-select into
|
||||
prepare_message, which is run prior to asserting chip-select.
|
||||
|
||||
Also fixes resetting 3-wire mode after use of rx-mode, so that
|
||||
a 3-Wire sequence TX, RX, TX works as well (right now it runs
|
||||
TX, RX, RX instead)
|
||||
|
||||
Reported-by: Noralf Tronnes <noralf@tronnes.org>
|
||||
Signed-off-by: Martin Sperl <kernel@martin.sperl.org>
|
||||
Signed-off-by: Mark Brown <broonie@kernel.org>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
|
||||
---
|
||||
drivers/spi/spi-bcm2835.c | 28 +++++++++++++++++++++++-----
|
||||
1 file changed, 23 insertions(+), 5 deletions(-)
|
||||
|
||||
--- a/drivers/spi/spi-bcm2835.c
|
||||
+++ b/drivers/spi/spi-bcm2835.c
|
||||
@@ -257,13 +257,11 @@ static int bcm2835_spi_transfer_one(stru
|
||||
spi_used_hz = cdiv ? (clk_hz / cdiv) : (clk_hz / 65536);
|
||||
bcm2835_wr(bs, BCM2835_SPI_CLK, cdiv);
|
||||
|
||||
- /* handle all the modes */
|
||||
+ /* handle all the 3-wire mode */
|
||||
if ((spi->mode & SPI_3WIRE) && (tfr->rx_buf))
|
||||
cs |= BCM2835_SPI_CS_REN;
|
||||
- if (spi->mode & SPI_CPOL)
|
||||
- cs |= BCM2835_SPI_CS_CPOL;
|
||||
- if (spi->mode & SPI_CPHA)
|
||||
- cs |= BCM2835_SPI_CS_CPHA;
|
||||
+ else
|
||||
+ cs &= ~BCM2835_SPI_CS_REN;
|
||||
|
||||
/* for gpio_cs set dummy CS so that no HW-CS get changed
|
||||
* we can not run this in bcm2835_spi_set_cs, as it does
|
||||
@@ -291,6 +289,25 @@ static int bcm2835_spi_transfer_one(stru
|
||||
return bcm2835_spi_transfer_one_irq(master, spi, tfr, cs);
|
||||
}
|
||||
|
||||
+static int bcm2835_spi_prepare_message(struct spi_master *master,
|
||||
+ struct spi_message *msg)
|
||||
+{
|
||||
+ struct spi_device *spi = msg->spi;
|
||||
+ struct bcm2835_spi *bs = spi_master_get_devdata(master);
|
||||
+ u32 cs = bcm2835_rd(bs, BCM2835_SPI_CS);
|
||||
+
|
||||
+ cs &= ~(BCM2835_SPI_CS_CPOL | BCM2835_SPI_CS_CPHA);
|
||||
+
|
||||
+ if (spi->mode & SPI_CPOL)
|
||||
+ cs |= BCM2835_SPI_CS_CPOL;
|
||||
+ if (spi->mode & SPI_CPHA)
|
||||
+ cs |= BCM2835_SPI_CS_CPHA;
|
||||
+
|
||||
+ bcm2835_wr(bs, BCM2835_SPI_CS, cs);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
static void bcm2835_spi_handle_err(struct spi_master *master,
|
||||
struct spi_message *msg)
|
||||
{
|
||||
@@ -429,6 +446,7 @@ static int bcm2835_spi_probe(struct plat
|
||||
master->set_cs = bcm2835_spi_set_cs;
|
||||
master->transfer_one = bcm2835_spi_transfer_one;
|
||||
master->handle_err = bcm2835_spi_handle_err;
|
||||
+ master->prepare_message = bcm2835_spi_prepare_message;
|
||||
master->dev.of_node = pdev->dev.of_node;
|
||||
|
||||
bs = spi_master_get_devdata(master);
|
||||
+129
@@ -0,0 +1,129 @@
|
||||
From c4fe57f76269dbb2af135071513f260ca40229a3 Mon Sep 17 00:00:00 2001
|
||||
From: Michael van der Westhuizen <michael@smart-africa.com>
|
||||
Date: Tue, 18 Aug 2015 22:21:53 +0200
|
||||
Subject: spi: dw: Allow interface drivers to limit data I/O to word sizes
|
||||
|
||||
From: Michael van der Westhuizen <michael@smart-africa.com>
|
||||
|
||||
commit c4fe57f76269dbb2af135071513f260ca40229a3 upstream.
|
||||
|
||||
The commit dd11444327ce ("spi: dw-spi: Convert 16bit accesses to 32bit
|
||||
accesses") changed all 16bit accesses in the DW_apb_ssi driver to 32bit.
|
||||
This, unfortunately, breaks data register access on picoXcell, where the
|
||||
DW IP needs data register accesses to be word accesses (all other
|
||||
accesses appear to be OK).
|
||||
|
||||
This change introduces a new master variable to allow interface drivers
|
||||
to specify that 16bit data transfer I/O is required. This change also
|
||||
introduces the ability to set this variable via device tree bindings in
|
||||
the MMIO interface driver. Both the core and the MMIO interface driver
|
||||
default to the current 32bit behaviour.
|
||||
|
||||
Before this change, on a picoXcell pc3x3:
|
||||
spi_master spi32766: interrupt_transfer: fifo overrun/underrun
|
||||
m25p80 spi32766.0: error -5 reading 9f
|
||||
m25p80: probe of spi32766.0 failed with error -5
|
||||
|
||||
After this change:
|
||||
m25p80 spi32766.0: m25p40 (512 Kbytes)
|
||||
|
||||
Fixes: dd11444327ce ("spi: dw-spi: Convert 16bit accesses to 32bit accesses")
|
||||
Signed-off-by: Michael van der Westhuizen <michael@smart-africa.com>
|
||||
Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
|
||||
Signed-off-by: Mark Brown <broonie@kernel.org>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
|
||||
---
|
||||
drivers/spi/spi-dw-mmio.c | 3 +++
|
||||
drivers/spi/spi-dw.c | 4 ++--
|
||||
drivers/spi/spi-dw.h | 35 +++++++++++++++++++++++++++++++++++
|
||||
3 files changed, 40 insertions(+), 2 deletions(-)
|
||||
|
||||
--- a/drivers/spi/spi-dw-mmio.c
|
||||
+++ b/drivers/spi/spi-dw-mmio.c
|
||||
@@ -74,6 +74,9 @@ static int dw_spi_mmio_probe(struct plat
|
||||
|
||||
dws->max_freq = clk_get_rate(dwsmmio->clk);
|
||||
|
||||
+ of_property_read_u32(pdev->dev.of_node, "reg-io-width",
|
||||
+ &dws->reg_io_width);
|
||||
+
|
||||
num_cs = 4;
|
||||
|
||||
if (pdev->dev.of_node)
|
||||
--- a/drivers/spi/spi-dw.c
|
||||
+++ b/drivers/spi/spi-dw.c
|
||||
@@ -194,7 +194,7 @@ static void dw_writer(struct dw_spi *dws
|
||||
else
|
||||
txw = *(u16 *)(dws->tx);
|
||||
}
|
||||
- dw_writel(dws, DW_SPI_DR, txw);
|
||||
+ dw_write_io_reg(dws, DW_SPI_DR, txw);
|
||||
dws->tx += dws->n_bytes;
|
||||
}
|
||||
}
|
||||
@@ -205,7 +205,7 @@ static void dw_reader(struct dw_spi *dws
|
||||
u16 rxw;
|
||||
|
||||
while (max--) {
|
||||
- rxw = dw_readl(dws, DW_SPI_DR);
|
||||
+ rxw = dw_read_io_reg(dws, DW_SPI_DR);
|
||||
/* Care rx only if the transfer's original "rx" is not null */
|
||||
if (dws->rx_end - dws->len) {
|
||||
if (dws->n_bytes == 1)
|
||||
--- a/drivers/spi/spi-dw.h
|
||||
+++ b/drivers/spi/spi-dw.h
|
||||
@@ -109,6 +109,7 @@ struct dw_spi {
|
||||
u32 fifo_len; /* depth of the FIFO buffer */
|
||||
u32 max_freq; /* max bus freq supported */
|
||||
|
||||
+ u32 reg_io_width; /* DR I/O width in bytes */
|
||||
u16 bus_num;
|
||||
u16 num_cs; /* supported slave numbers */
|
||||
|
||||
@@ -145,11 +146,45 @@ static inline u32 dw_readl(struct dw_spi
|
||||
return __raw_readl(dws->regs + offset);
|
||||
}
|
||||
|
||||
+static inline u16 dw_readw(struct dw_spi *dws, u32 offset)
|
||||
+{
|
||||
+ return __raw_readw(dws->regs + offset);
|
||||
+}
|
||||
+
|
||||
static inline void dw_writel(struct dw_spi *dws, u32 offset, u32 val)
|
||||
{
|
||||
__raw_writel(val, dws->regs + offset);
|
||||
}
|
||||
|
||||
+static inline void dw_writew(struct dw_spi *dws, u32 offset, u16 val)
|
||||
+{
|
||||
+ __raw_writew(val, dws->regs + offset);
|
||||
+}
|
||||
+
|
||||
+static inline u32 dw_read_io_reg(struct dw_spi *dws, u32 offset)
|
||||
+{
|
||||
+ switch (dws->reg_io_width) {
|
||||
+ case 2:
|
||||
+ return dw_readw(dws, offset);
|
||||
+ case 4:
|
||||
+ default:
|
||||
+ return dw_readl(dws, offset);
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+static inline void dw_write_io_reg(struct dw_spi *dws, u32 offset, u32 val)
|
||||
+{
|
||||
+ switch (dws->reg_io_width) {
|
||||
+ case 2:
|
||||
+ dw_writew(dws, offset, val);
|
||||
+ break;
|
||||
+ case 4:
|
||||
+ default:
|
||||
+ dw_writel(dws, offset, val);
|
||||
+ break;
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
static inline void spi_enable_chip(struct dw_spi *dws, int enable)
|
||||
{
|
||||
dw_writel(dws, DW_SPI_SSIENR, (enable ? 1 : 0));
|
||||
+43
@@ -0,0 +1,43 @@
|
||||
From 26a67ec47a4c58fe79c6421c3dc3d697d322d2d6 Mon Sep 17 00:00:00 2001
|
||||
From: Lars Persson <lars.persson@axis.com>
|
||||
Date: Wed, 29 Jul 2015 09:32:02 +0200
|
||||
Subject: spi: Fix regression in spi-bitbang-txrx.h
|
||||
|
||||
From: Lars Persson <lars.persson@axis.com>
|
||||
|
||||
commit 26a67ec47a4c58fe79c6421c3dc3d697d322d2d6 upstream.
|
||||
|
||||
This patch fixes a regression introduced by commit 232a5adc5199 ("spi:
|
||||
bitbang: only toggle bitchanges"). The attempt to optimize writes of
|
||||
consecutive bit patterns broke most of the combinations of word size
|
||||
and SPI modes due to selecting the wrong bit as the MSB value.
|
||||
|
||||
Fixes: 232a5adc5199 (spi: bitbang: only toggle bitchanges)
|
||||
Signed-off-by: Lars Persson <larper@axis.com>
|
||||
Signed-off-by: Mark Brown <broonie@kernel.org>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
|
||||
---
|
||||
drivers/spi/spi-bitbang-txrx.h | 4 ++--
|
||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
--- a/drivers/spi/spi-bitbang-txrx.h
|
||||
+++ b/drivers/spi/spi-bitbang-txrx.h
|
||||
@@ -49,7 +49,7 @@ bitbang_txrx_be_cpha0(struct spi_device
|
||||
{
|
||||
/* if (cpol == 0) this is SPI_MODE_0; else this is SPI_MODE_2 */
|
||||
|
||||
- bool oldbit = !(word & 1);
|
||||
+ u32 oldbit = (!(word & (1<<(bits-1)))) << 31;
|
||||
/* clock starts at inactive polarity */
|
||||
for (word <<= (32 - bits); likely(bits); bits--) {
|
||||
|
||||
@@ -81,7 +81,7 @@ bitbang_txrx_be_cpha1(struct spi_device
|
||||
{
|
||||
/* if (cpol == 0) this is SPI_MODE_1; else this is SPI_MODE_3 */
|
||||
|
||||
- bool oldbit = !(word & (1 << 31));
|
||||
+ u32 oldbit = (!(word & (1<<(bits-1)))) << 31;
|
||||
/* clock starts at inactive polarity */
|
||||
for (word <<= (32 - bits); likely(bits); bits--) {
|
||||
|
||||
+48
@@ -0,0 +1,48 @@
|
||||
From 011710e2ab659c7ad6e5e554806414bd7a9508be Mon Sep 17 00:00:00 2001
|
||||
From: Sifan Naeem <sifan.naeem@imgtec.com>
|
||||
Date: Mon, 27 Jul 2015 13:11:15 +0100
|
||||
Subject: spi: img-spfi: check for timeout error before proceeding
|
||||
|
||||
From: Sifan Naeem <sifan.naeem@imgtec.com>
|
||||
|
||||
commit 011710e2ab659c7ad6e5e554806414bd7a9508be upstream.
|
||||
|
||||
Calling spfi_wait_all_done is not required if the transfer has timed
|
||||
out before all data is transferred.
|
||||
|
||||
spfi_wait_all_done polls for Alldone interrupt which is triggered to
|
||||
mark the transfer as complete and to indicate it is now safe to issue
|
||||
a new transfer.
|
||||
|
||||
Fixes: 8c2c8c0 ("spi: img-spfi: Control CS lines with GPIO")
|
||||
Signed-off-by: Sifan Naeem <sifan.naeem@imgtec.com>
|
||||
Reviewed-by: Andrew Bresticker <abrestic@chromium.org>
|
||||
Signed-off-by: Mark Brown <broonie@kernel.org>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
|
||||
---
|
||||
drivers/spi/spi-img-spfi.c | 8 ++++----
|
||||
1 file changed, 4 insertions(+), 4 deletions(-)
|
||||
|
||||
--- a/drivers/spi/spi-img-spfi.c
|
||||
+++ b/drivers/spi/spi-img-spfi.c
|
||||
@@ -267,15 +267,15 @@ static int img_spfi_start_pio(struct spi
|
||||
cpu_relax();
|
||||
}
|
||||
|
||||
- ret = spfi_wait_all_done(spfi);
|
||||
- if (ret < 0)
|
||||
- return ret;
|
||||
-
|
||||
if (rx_bytes > 0 || tx_bytes > 0) {
|
||||
dev_err(spfi->dev, "PIO transfer timed out\n");
|
||||
return -ETIMEDOUT;
|
||||
}
|
||||
|
||||
+ ret = spfi_wait_all_done(spfi);
|
||||
+ if (ret < 0)
|
||||
+ return ret;
|
||||
+
|
||||
return 0;
|
||||
}
|
||||
|
||||
+33
@@ -0,0 +1,33 @@
|
||||
From 9176c6657b5c313cf504d157e6d91496ee5c8708 Mon Sep 17 00:00:00 2001
|
||||
From: Sifan Naeem <sifan.naeem@imgtec.com>
|
||||
Date: Thu, 6 Aug 2015 10:33:01 +0100
|
||||
Subject: spi: img-spfi: fix kbuild test robot warning
|
||||
|
||||
From: Sifan Naeem <sifan.naeem@imgtec.com>
|
||||
|
||||
commit 9176c6657b5c313cf504d157e6d91496ee5c8708 upstream.
|
||||
|
||||
drivers/spi/spi-img-spfi.c: In function 'img_spfi_setup':
|
||||
drivers/spi/spi-img-spfi.c:446: warning: 'ret' may be used
|
||||
uninitialized in this function.
|
||||
|
||||
Fixes: commit b03ba9e314c1 ("spi: img-spfi: fix multiple calls to request gpio")
|
||||
Signed-off-by: Sifan Naeem <sifan.naeem@imgtec.com>
|
||||
Signed-off-by: Mark Brown <broonie@kernel.org>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
|
||||
---
|
||||
drivers/spi/spi-img-spfi.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/spi/spi-img-spfi.c
|
||||
+++ b/drivers/spi/spi-img-spfi.c
|
||||
@@ -444,7 +444,7 @@ static int img_spfi_unprepare(struct spi
|
||||
|
||||
static int img_spfi_setup(struct spi_device *spi)
|
||||
{
|
||||
- int ret;
|
||||
+ int ret = -EINVAL;
|
||||
struct img_spfi_device_data *spfi_data = spi_get_ctldata(spi);
|
||||
|
||||
if (!spfi_data) {
|
||||
+97
@@ -0,0 +1,97 @@
|
||||
From b03ba9e314c12b2127243145b5c1f41b2408de62 Mon Sep 17 00:00:00 2001
|
||||
From: Sifan Naeem <sifan.naeem@imgtec.com>
|
||||
Date: Wed, 29 Jul 2015 11:55:26 +0100
|
||||
Subject: spi: img-spfi: fix multiple calls to request gpio
|
||||
|
||||
From: Sifan Naeem <sifan.naeem@imgtec.com>
|
||||
|
||||
commit b03ba9e314c12b2127243145b5c1f41b2408de62 upstream.
|
||||
|
||||
spfi_setup may be called many times by the spi framework, but
|
||||
gpio_request_one can only be called once without freeing, repeatedly
|
||||
calling gpio_request_one will cause an error to be thrown, which
|
||||
causes the request to spi_setup to be marked as failed.
|
||||
|
||||
We can have a per-spi_device flag that indicates whether or not the
|
||||
gpio has been requested. If the gpio has already been requested use
|
||||
gpio_direction_output to set the direction of the gpio.
|
||||
|
||||
Fixes: 8c2c8c03cdcb ("spi: img-spfi: Control CS lines with GPIO")
|
||||
Signed-off-by: Sifan Naeem <sifan.naeem@imgtec.com>
|
||||
Signed-off-by: Mark Brown <broonie@kernel.org>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
|
||||
---
|
||||
drivers/spi/spi-img-spfi.c | 47 ++++++++++++++++++++++++++++++++++++++-------
|
||||
1 file changed, 40 insertions(+), 7 deletions(-)
|
||||
|
||||
--- a/drivers/spi/spi-img-spfi.c
|
||||
+++ b/drivers/spi/spi-img-spfi.c
|
||||
@@ -105,6 +105,10 @@ struct img_spfi {
|
||||
bool rx_dma_busy;
|
||||
};
|
||||
|
||||
+struct img_spfi_device_data {
|
||||
+ bool gpio_requested;
|
||||
+};
|
||||
+
|
||||
static inline u32 spfi_readl(struct img_spfi *spfi, u32 reg)
|
||||
{
|
||||
return readl(spfi->regs + reg);
|
||||
@@ -441,20 +445,49 @@ static int img_spfi_unprepare(struct spi
|
||||
static int img_spfi_setup(struct spi_device *spi)
|
||||
{
|
||||
int ret;
|
||||
+ struct img_spfi_device_data *spfi_data = spi_get_ctldata(spi);
|
||||
|
||||
- ret = gpio_request_one(spi->cs_gpio, (spi->mode & SPI_CS_HIGH) ?
|
||||
- GPIOF_OUT_INIT_LOW : GPIOF_OUT_INIT_HIGH,
|
||||
- dev_name(&spi->dev));
|
||||
- if (ret)
|
||||
- dev_err(&spi->dev, "can't request chipselect gpio %d\n",
|
||||
+ if (!spfi_data) {
|
||||
+ spfi_data = kzalloc(sizeof(*spfi_data), GFP_KERNEL);
|
||||
+ if (!spfi_data)
|
||||
+ return -ENOMEM;
|
||||
+ spfi_data->gpio_requested = false;
|
||||
+ spi_set_ctldata(spi, spfi_data);
|
||||
+ }
|
||||
+ if (!spfi_data->gpio_requested) {
|
||||
+ ret = gpio_request_one(spi->cs_gpio,
|
||||
+ (spi->mode & SPI_CS_HIGH) ?
|
||||
+ GPIOF_OUT_INIT_LOW : GPIOF_OUT_INIT_HIGH,
|
||||
+ dev_name(&spi->dev));
|
||||
+ if (ret)
|
||||
+ dev_err(&spi->dev, "can't request chipselect gpio %d\n",
|
||||
spi->cs_gpio);
|
||||
-
|
||||
+ else
|
||||
+ spfi_data->gpio_requested = true;
|
||||
+ } else {
|
||||
+ if (gpio_is_valid(spi->cs_gpio)) {
|
||||
+ int mode = ((spi->mode & SPI_CS_HIGH) ?
|
||||
+ GPIOF_OUT_INIT_LOW : GPIOF_OUT_INIT_HIGH);
|
||||
+
|
||||
+ ret = gpio_direction_output(spi->cs_gpio, mode);
|
||||
+ if (ret)
|
||||
+ dev_err(&spi->dev, "chipselect gpio %d setup failed (%d)\n",
|
||||
+ spi->cs_gpio, ret);
|
||||
+ }
|
||||
+ }
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void img_spfi_cleanup(struct spi_device *spi)
|
||||
{
|
||||
- gpio_free(spi->cs_gpio);
|
||||
+ struct img_spfi_device_data *spfi_data = spi_get_ctldata(spi);
|
||||
+
|
||||
+ if (spfi_data) {
|
||||
+ if (spfi_data->gpio_requested)
|
||||
+ gpio_free(spi->cs_gpio);
|
||||
+ kfree(spfi_data);
|
||||
+ spi_set_ctldata(spi, NULL);
|
||||
+ }
|
||||
}
|
||||
|
||||
static void img_spfi_config(struct spi_master *master, struct spi_device *spi,
|
||||
+66
@@ -0,0 +1,66 @@
|
||||
From fe78d0b7691c02744004b15f6979b3f106464bc4 Mon Sep 17 00:00:00 2001
|
||||
From: Koji Matsuoka <koji.matsuoka.xm@renesas.com>
|
||||
Date: Mon, 15 Jun 2015 02:25:05 +0900
|
||||
Subject: spi: sh-msiof: Fix FIFO size to 64 word from 256 word
|
||||
|
||||
From: Koji Matsuoka <koji.matsuoka.xm@renesas.com>
|
||||
|
||||
commit fe78d0b7691c02744004b15f6979b3f106464bc4 upstream.
|
||||
|
||||
The upper limit of Tx/Rx FIFO size is 64 word by the
|
||||
specification of H/W. This patch corrects to 64 word from 256 word.
|
||||
|
||||
Signed-off-by: Koji Matsuoka <koji.matsuoka.xm@renesas.com>
|
||||
Signed-off-by: Yoshihiro Kaneko <ykaneko0929@gmail.com>
|
||||
Signed-off-by: Mark Brown <broonie@kernel.org>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
|
||||
---
|
||||
drivers/spi/spi-sh-msiof.c | 15 +++++++++------
|
||||
1 file changed, 9 insertions(+), 6 deletions(-)
|
||||
|
||||
--- a/drivers/spi/spi-sh-msiof.c
|
||||
+++ b/drivers/spi/spi-sh-msiof.c
|
||||
@@ -48,8 +48,8 @@ struct sh_msiof_spi_priv {
|
||||
const struct sh_msiof_chipdata *chipdata;
|
||||
struct sh_msiof_spi_info *info;
|
||||
struct completion done;
|
||||
- int tx_fifo_size;
|
||||
- int rx_fifo_size;
|
||||
+ unsigned int tx_fifo_size;
|
||||
+ unsigned int rx_fifo_size;
|
||||
void *tx_dma_page;
|
||||
void *rx_dma_page;
|
||||
dma_addr_t tx_dma_addr;
|
||||
@@ -95,8 +95,6 @@ struct sh_msiof_spi_priv {
|
||||
#define MDR2_WDLEN1(i) (((i) - 1) << 16) /* Word Count (1-64/256 (SH, A1))) */
|
||||
#define MDR2_GRPMASK1 0x00000001 /* Group Output Mask 1 (SH, A1) */
|
||||
|
||||
-#define MAX_WDLEN 256U
|
||||
-
|
||||
/* TSCR and RSCR */
|
||||
#define SCR_BRPS_MASK 0x1f00 /* Prescaler Setting (1-32) */
|
||||
#define SCR_BRPS(i) (((i) - 1) << 8)
|
||||
@@ -850,7 +848,12 @@ static int sh_msiof_transfer_one(struct
|
||||
* DMA supports 32-bit words only, hence pack 8-bit and 16-bit
|
||||
* words, with byte resp. word swapping.
|
||||
*/
|
||||
- unsigned int l = min(len, MAX_WDLEN * 4);
|
||||
+ unsigned int l = 0;
|
||||
+
|
||||
+ if (tx_buf)
|
||||
+ l = min(len, p->tx_fifo_size * 4);
|
||||
+ if (rx_buf)
|
||||
+ l = min(len, p->rx_fifo_size * 4);
|
||||
|
||||
if (bits <= 8) {
|
||||
if (l & 3)
|
||||
@@ -963,7 +966,7 @@ static const struct sh_msiof_chipdata sh
|
||||
|
||||
static const struct sh_msiof_chipdata r8a779x_data = {
|
||||
.tx_fifo_size = 64,
|
||||
- .rx_fifo_size = 256,
|
||||
+ .rx_fifo_size = 64,
|
||||
.master_flags = SPI_MASTER_MUST_TX,
|
||||
};
|
||||
|
||||
+56
@@ -0,0 +1,56 @@
|
||||
From ad83dbd974feb2e2a8cc071a1d28782bd4d2c70e Mon Sep 17 00:00:00 2001
|
||||
From: Ian Abbott <abbotti@mev.co.uk>
|
||||
Date: Tue, 11 Aug 2015 13:05:10 +0100
|
||||
Subject: staging: comedi: adl_pci7x3x: fix digital output on PCI-7230
|
||||
|
||||
From: Ian Abbott <abbotti@mev.co.uk>
|
||||
|
||||
commit ad83dbd974feb2e2a8cc071a1d28782bd4d2c70e upstream.
|
||||
|
||||
The "adl_pci7x3x" driver replaced the "adl_pci7230" and "adl_pci7432"
|
||||
drivers in commits 8f567c373c4b ("staging: comedi: new adl_pci7x3x
|
||||
driver") and 657f77d173d3 ("staging: comedi: remove adl_pci7230 and
|
||||
adl_pci7432 drivers"). Although the new driver code agrees with the
|
||||
user manuals for the respective boards, digital outputs stopped working
|
||||
on the PCI-7230. This has 16 digital output channels and the previous
|
||||
adl_pci7230 driver shifted the 16 bit output state left by 16 bits
|
||||
before writing to the hardware register. The new adl_pci7x3x driver
|
||||
doesn't do that. Fix it in `adl_pci7x3x_do_insn_bits()` by checking
|
||||
for the special case of the subdevice having only 16 channels and
|
||||
duplicating the 16 bit output state into both halves of the 32-bit
|
||||
register. That should work both for what the board actually does and
|
||||
for what the user manual says it should do.
|
||||
|
||||
Fixes: 8f567c373c4b ("staging: comedi: new adl_pci7x3x driver")
|
||||
Signed-off-by: Ian Abbott <abbotti@mev.co.uk>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
|
||||
---
|
||||
drivers/staging/comedi/drivers/adl_pci7x3x.c | 16 ++++++++++++++--
|
||||
1 file changed, 14 insertions(+), 2 deletions(-)
|
||||
|
||||
--- a/drivers/staging/comedi/drivers/adl_pci7x3x.c
|
||||
+++ b/drivers/staging/comedi/drivers/adl_pci7x3x.c
|
||||
@@ -120,8 +120,20 @@ static int adl_pci7x3x_do_insn_bits(stru
|
||||
{
|
||||
unsigned long reg = (unsigned long)s->private;
|
||||
|
||||
- if (comedi_dio_update_state(s, data))
|
||||
- outl(s->state, dev->iobase + reg);
|
||||
+ if (comedi_dio_update_state(s, data)) {
|
||||
+ unsigned int val = s->state;
|
||||
+
|
||||
+ if (s->n_chan == 16) {
|
||||
+ /*
|
||||
+ * It seems the PCI-7230 needs the 16-bit DO state
|
||||
+ * to be shifted left by 16 bits before being written
|
||||
+ * to the 32-bit register. Set the value in both
|
||||
+ * halves of the register to be sure.
|
||||
+ */
|
||||
+ val |= val << 16;
|
||||
+ }
|
||||
+ outl(val, dev->iobase + reg);
|
||||
+ }
|
||||
|
||||
data[1] = s->state;
|
||||
|
||||
+87
@@ -0,0 +1,87 @@
|
||||
From 423b24c37dd5794a674c74b0ed56392003a69891 Mon Sep 17 00:00:00 2001
|
||||
From: Ian Abbott <abbotti@mev.co.uk>
|
||||
Date: Thu, 23 Jul 2015 16:46:57 +0100
|
||||
Subject: staging: comedi: usbduxsigma: don't clobber ai_timer in command test
|
||||
|
||||
From: Ian Abbott <abbotti@mev.co.uk>
|
||||
|
||||
commit 423b24c37dd5794a674c74b0ed56392003a69891 upstream.
|
||||
|
||||
`devpriv->ai_timer` is used while an asynchronous command is running on
|
||||
the AI subdevice. It also gets modified by the subdevice's `cmdtest`
|
||||
handler for checking new asynchronous commands
|
||||
(`usbduxsigma_ai_cmdtest()`), which is not correct as it's allowed to
|
||||
check new commands while an old command is still running. Fix it by
|
||||
moving the code which sets up `devpriv->ai_timer` and
|
||||
`devpriv->ai_interval` into the subdevice's `cmd` handler,
|
||||
`usbduxsigma_ai_cmd()`.
|
||||
|
||||
Note that the removed code in `usbduxsigma_ai_cmdtest()` checked that
|
||||
`devpriv->ai_timer` did not end up less than than 1, but that could not
|
||||
happen because `cmd->scan_begin_arg` had already been checked to be at
|
||||
least the minimum required value (at least when `cmd->scan_begin_src ==
|
||||
TRIG_TIMER`, which had also been checked to be the case).
|
||||
|
||||
Fixes: b986be8527c7 ("staging: comedi: usbduxsigma: tidy up analog input command support)
|
||||
Signed-off-by: Ian Abbott <abbotti@mev.co.uk>
|
||||
Reviewed-by: Bernd Porr <mail@berndporr.me.uk>
|
||||
Reviewed-by: H Hartley Sweeten <hsweeten@visionengravers.com>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
|
||||
---
|
||||
drivers/staging/comedi/drivers/usbduxsigma.c | 37 +++++++++++----------------
|
||||
1 file changed, 16 insertions(+), 21 deletions(-)
|
||||
|
||||
--- a/drivers/staging/comedi/drivers/usbduxsigma.c
|
||||
+++ b/drivers/staging/comedi/drivers/usbduxsigma.c
|
||||
@@ -550,27 +550,6 @@ static int usbduxsigma_ai_cmdtest(struct
|
||||
if (err)
|
||||
return 3;
|
||||
|
||||
- /* Step 4: fix up any arguments */
|
||||
-
|
||||
- if (high_speed) {
|
||||
- /*
|
||||
- * every 2 channels get a time window of 125us. Thus, if we
|
||||
- * sample all 16 channels we need 1ms. If we sample only one
|
||||
- * channel we need only 125us
|
||||
- */
|
||||
- devpriv->ai_interval = interval;
|
||||
- devpriv->ai_timer = cmd->scan_begin_arg / (125000 * interval);
|
||||
- } else {
|
||||
- /* interval always 1ms */
|
||||
- devpriv->ai_interval = 1;
|
||||
- devpriv->ai_timer = cmd->scan_begin_arg / 1000000;
|
||||
- }
|
||||
- if (devpriv->ai_timer < 1)
|
||||
- err |= -EINVAL;
|
||||
-
|
||||
- if (err)
|
||||
- return 4;
|
||||
-
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -668,6 +647,22 @@ static int usbduxsigma_ai_cmd(struct com
|
||||
|
||||
down(&devpriv->sem);
|
||||
|
||||
+ if (devpriv->high_speed) {
|
||||
+ /*
|
||||
+ * every 2 channels get a time window of 125us. Thus, if we
|
||||
+ * sample all 16 channels we need 1ms. If we sample only one
|
||||
+ * channel we need only 125us
|
||||
+ */
|
||||
+ unsigned int interval = usbduxsigma_chans_to_interval(len);
|
||||
+
|
||||
+ devpriv->ai_interval = interval;
|
||||
+ devpriv->ai_timer = cmd->scan_begin_arg / (125000 * interval);
|
||||
+ } else {
|
||||
+ /* interval always 1ms */
|
||||
+ devpriv->ai_interval = 1;
|
||||
+ devpriv->ai_timer = cmd->scan_begin_arg / 1000000;
|
||||
+ }
|
||||
+
|
||||
for (i = 0; i < len; i++) {
|
||||
unsigned int chan = CR_CHAN(cmd->chanlist[i]);
|
||||
|
||||
+90
@@ -0,0 +1,90 @@
|
||||
From c04a1f17803e0d3eeada586ca34a6b436959bc20 Mon Sep 17 00:00:00 2001
|
||||
From: Ian Abbott <abbotti@mev.co.uk>
|
||||
Date: Thu, 23 Jul 2015 16:46:58 +0100
|
||||
Subject: staging: comedi: usbduxsigma: don't clobber ao_timer in command test
|
||||
|
||||
From: Ian Abbott <abbotti@mev.co.uk>
|
||||
|
||||
commit c04a1f17803e0d3eeada586ca34a6b436959bc20 upstream.
|
||||
|
||||
`devpriv->ao_timer` is used while an asynchronous command is running on
|
||||
the AO subdevice. It also gets modified by the subdevice's `cmdtest`
|
||||
handler for checking new asynchronous commands,
|
||||
`usbduxsigma_ao_cmdtest()`, which is not correct as it's allowed to
|
||||
check new commands while an old command is still running. Fix it by
|
||||
moving the code which sets up `devpriv->ao_timer` into the subdevice's
|
||||
`cmd` handler, `usbduxsigma_ao_cmd()`.
|
||||
|
||||
Note that the removed code in `usbduxsigma_ao_cmdtest()` checked that
|
||||
`devpriv->ao_timer` did not end up less that 1, but that could not
|
||||
happen due because `cmd->scan_begin_arg` or `cmd->convert_arg` had
|
||||
already been range-checked.
|
||||
|
||||
Also note that we tested the `high_speed` variable in the old code, but
|
||||
that is currently always 0 and means that we always use "scan" timing
|
||||
(`cmd->scan_begin_src == TRIG_TIMER` and `cmd->convert_src == TRIG_NOW`)
|
||||
and never "convert" (individual sample) timing (`cmd->scan_begin_src ==
|
||||
TRIG_FOLLOW` and `cmd->convert_src == TRIG_TIMER`). The moved code
|
||||
tests `cmd->convert_src` instead to decide whether "scan" or "convert"
|
||||
timing is being used, although currently only "scan" timing is
|
||||
supported.
|
||||
|
||||
Fixes: fb1ef622e7a3 ("staging: comedi: usbduxsigma: tidy up analog output command support")
|
||||
Signed-off-by: Ian Abbott <abbotti@mev.co.uk>
|
||||
Reviewed-by: Bernd Porr <mail@berndporr.me.uk>
|
||||
Reviewed-by: H Hartley Sweeten <hsweeten@visionengravers.com>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
|
||||
---
|
||||
drivers/staging/comedi/drivers/usbduxsigma.c | 33 +++++++++++----------------
|
||||
1 file changed, 14 insertions(+), 19 deletions(-)
|
||||
|
||||
--- a/drivers/staging/comedi/drivers/usbduxsigma.c
|
||||
+++ b/drivers/staging/comedi/drivers/usbduxsigma.c
|
||||
@@ -912,25 +912,6 @@ static int usbduxsigma_ao_cmdtest(struct
|
||||
if (err)
|
||||
return 3;
|
||||
|
||||
- /* Step 4: fix up any arguments */
|
||||
-
|
||||
- /* we count in timer steps */
|
||||
- if (high_speed) {
|
||||
- /* timing of the conversion itself: every 125 us */
|
||||
- devpriv->ao_timer = cmd->convert_arg / 125000;
|
||||
- } else {
|
||||
- /*
|
||||
- * timing of the scan: every 1ms
|
||||
- * we get all channels at once
|
||||
- */
|
||||
- devpriv->ao_timer = cmd->scan_begin_arg / 1000000;
|
||||
- }
|
||||
- if (devpriv->ao_timer < 1)
|
||||
- err |= -EINVAL;
|
||||
-
|
||||
- if (err)
|
||||
- return 4;
|
||||
-
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -943,6 +924,20 @@ static int usbduxsigma_ao_cmd(struct com
|
||||
|
||||
down(&devpriv->sem);
|
||||
|
||||
+ if (cmd->convert_src == TRIG_TIMER) {
|
||||
+ /*
|
||||
+ * timing of the conversion itself: every 125 us
|
||||
+ * at high speed (not used yet)
|
||||
+ */
|
||||
+ devpriv->ao_timer = cmd->convert_arg / 125000;
|
||||
+ } else {
|
||||
+ /*
|
||||
+ * timing of the scan: every 1ms
|
||||
+ * we get all channels at once
|
||||
+ */
|
||||
+ devpriv->ao_timer = cmd->scan_begin_arg / 1000000;
|
||||
+ }
|
||||
+
|
||||
devpriv->ao_counter = devpriv->ao_timer;
|
||||
|
||||
if (cmd->start_src == TRIG_NOW) {
|
||||
+75
@@ -0,0 +1,75 @@
|
||||
From 8117e347406278fd399b077add4e638cd017ae2d Mon Sep 17 00:00:00 2001
|
||||
From: Johannes Thumshirn <jthumshirn@suse.de>
|
||||
Date: Thu, 6 Aug 2015 09:16:37 +0200
|
||||
Subject: tty: serial: men_z135_uart.c: Fix race between IRQ and set_termios()
|
||||
|
||||
From: Johannes Thumshirn <jthumshirn@suse.de>
|
||||
|
||||
commit 8117e347406278fd399b077add4e638cd017ae2d upstream.
|
||||
|
||||
Fix panic caused by a race between men_z135_intr() and men_z135_set_termios().
|
||||
|
||||
men_z135_intr() and men_z135_set_termios() both hold the struct uart_port::lock
|
||||
spinlock, but men_z135_intr() does a spin_lock_irqsave() and
|
||||
men_z135_set_termios() does a normal spin_lock(), which can lead to a deadlock
|
||||
when an interrupt is called while the lock is being helt by
|
||||
men_z135_set_termios().
|
||||
|
||||
This was discovered using a insmod, hardware looppback send/receive, rmmod
|
||||
stress test.
|
||||
|
||||
Signed-off-by: Johannes Thumshirn <jthumshirn@suse.de>
|
||||
Reviewed-by: Peter Hurley <peter@hurleysoftware.com>
|
||||
Cc: Andreas Werner <andreas.werner@men.de>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
|
||||
---
|
||||
drivers/tty/serial/men_z135_uart.c | 9 ++++-----
|
||||
1 file changed, 4 insertions(+), 5 deletions(-)
|
||||
|
||||
--- a/drivers/tty/serial/men_z135_uart.c
|
||||
+++ b/drivers/tty/serial/men_z135_uart.c
|
||||
@@ -392,7 +392,6 @@ static irqreturn_t men_z135_intr(int irq
|
||||
struct men_z135_port *uart = (struct men_z135_port *)data;
|
||||
struct uart_port *port = &uart->port;
|
||||
bool handled = false;
|
||||
- unsigned long flags;
|
||||
int irq_id;
|
||||
|
||||
uart->stat_reg = ioread32(port->membase + MEN_Z135_STAT_REG);
|
||||
@@ -401,7 +400,7 @@ static irqreturn_t men_z135_intr(int irq
|
||||
if (!irq_id)
|
||||
goto out;
|
||||
|
||||
- spin_lock_irqsave(&port->lock, flags);
|
||||
+ spin_lock(&port->lock);
|
||||
/* It's save to write to IIR[7:6] RXC[9:8] */
|
||||
iowrite8(irq_id, port->membase + MEN_Z135_STAT_REG);
|
||||
|
||||
@@ -427,7 +426,7 @@ static irqreturn_t men_z135_intr(int irq
|
||||
handled = true;
|
||||
}
|
||||
|
||||
- spin_unlock_irqrestore(&port->lock, flags);
|
||||
+ spin_unlock(&port->lock);
|
||||
out:
|
||||
return IRQ_RETVAL(handled);
|
||||
}
|
||||
@@ -717,7 +716,7 @@ static void men_z135_set_termios(struct
|
||||
|
||||
baud = uart_get_baud_rate(port, termios, old, 0, uart_freq / 16);
|
||||
|
||||
- spin_lock(&port->lock);
|
||||
+ spin_lock_irq(&port->lock);
|
||||
if (tty_termios_baud_rate(termios))
|
||||
tty_termios_encode_baud_rate(termios, baud, baud);
|
||||
|
||||
@@ -725,7 +724,7 @@ static void men_z135_set_termios(struct
|
||||
iowrite32(bd_reg, port->membase + MEN_Z135_BAUD_REG);
|
||||
|
||||
uart_update_timeout(port, termios->c_cflag, baud);
|
||||
- spin_unlock(&port->lock);
|
||||
+ spin_unlock_irq(&port->lock);
|
||||
}
|
||||
|
||||
static const char *men_z135_type(struct uart_port *port)
|
||||
+58
@@ -0,0 +1,58 @@
|
||||
From b2fb5b1a0f50d3ebc12342c8d8dead245e9c9d4e Mon Sep 17 00:00:00 2001
|
||||
From: Kishon Vijay Abraham I <kishon@ti.com>
|
||||
Date: Mon, 27 Jul 2015 12:25:27 +0530
|
||||
Subject: usb: dwc3: ep0: Fix mem corruption on OUT transfers of more than 512 bytes
|
||||
|
||||
From: Kishon Vijay Abraham I <kishon@ti.com>
|
||||
|
||||
commit b2fb5b1a0f50d3ebc12342c8d8dead245e9c9d4e upstream.
|
||||
|
||||
DWC3 uses bounce buffer to handle non max packet aligned OUT transfers and
|
||||
the size of bounce buffer is 512 bytes. However if the host initiates OUT
|
||||
transfers of size more than 512 bytes (and non max packet aligned), the
|
||||
driver throws a WARN dump but still programs the TRB to receive more than
|
||||
512 bytes. This will cause bounce buffer to overflow and corrupt the
|
||||
adjacent memory locations which can be fatal.
|
||||
|
||||
Fix it by programming the TRB to receive a maximum of DWC3_EP0_BOUNCE_SIZE
|
||||
(512) bytes.
|
||||
|
||||
Signed-off-by: Kishon Vijay Abraham I <kishon@ti.com>
|
||||
Signed-off-by: Felipe Balbi <balbi@ti.com>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
|
||||
---
|
||||
drivers/usb/dwc3/ep0.c | 12 ++++++++++--
|
||||
1 file changed, 10 insertions(+), 2 deletions(-)
|
||||
|
||||
--- a/drivers/usb/dwc3/ep0.c
|
||||
+++ b/drivers/usb/dwc3/ep0.c
|
||||
@@ -820,6 +820,11 @@ static void dwc3_ep0_complete_data(struc
|
||||
unsigned maxp = ep0->endpoint.maxpacket;
|
||||
|
||||
transfer_size += (maxp - (transfer_size % maxp));
|
||||
+
|
||||
+ /* Maximum of DWC3_EP0_BOUNCE_SIZE can only be received */
|
||||
+ if (transfer_size > DWC3_EP0_BOUNCE_SIZE)
|
||||
+ transfer_size = DWC3_EP0_BOUNCE_SIZE;
|
||||
+
|
||||
transferred = min_t(u32, ur->length,
|
||||
transfer_size - length);
|
||||
memcpy(ur->buf, dwc->ep0_bounce, transferred);
|
||||
@@ -941,11 +946,14 @@ static void __dwc3_ep0_do_control_data(s
|
||||
return;
|
||||
}
|
||||
|
||||
- WARN_ON(req->request.length > DWC3_EP0_BOUNCE_SIZE);
|
||||
-
|
||||
maxpacket = dep->endpoint.maxpacket;
|
||||
transfer_size = roundup(req->request.length, maxpacket);
|
||||
|
||||
+ if (transfer_size > DWC3_EP0_BOUNCE_SIZE) {
|
||||
+ dev_WARN(dwc->dev, "bounce buf can't handle req len\n");
|
||||
+ transfer_size = DWC3_EP0_BOUNCE_SIZE;
|
||||
+ }
|
||||
+
|
||||
dwc->ep0_bounced = true;
|
||||
|
||||
/*
|
||||
+51
@@ -0,0 +1,51 @@
|
||||
From 1fb8dc36384ae1140ee6ccc470de74397606a9d5 Mon Sep 17 00:00:00 2001
|
||||
From: Matthijs Kooijman <matthijs@stdin.nl>
|
||||
Date: Tue, 18 Aug 2015 10:33:56 +0200
|
||||
Subject: USB: ftdi_sio: Added custom PID for CustomWare products
|
||||
|
||||
From: Matthijs Kooijman <matthijs@stdin.nl>
|
||||
|
||||
commit 1fb8dc36384ae1140ee6ccc470de74397606a9d5 upstream.
|
||||
|
||||
CustomWare uses the FTDI VID with custom PIDs for their ShipModul MiniPlex
|
||||
products.
|
||||
|
||||
Signed-off-by: Matthijs Kooijman <matthijs@stdin.nl>
|
||||
Signed-off-by: Johan Hovold <johan@kernel.org>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
|
||||
---
|
||||
drivers/usb/serial/ftdi_sio.c | 4 ++++
|
||||
drivers/usb/serial/ftdi_sio_ids.h | 8 ++++++++
|
||||
2 files changed, 12 insertions(+)
|
||||
|
||||
--- a/drivers/usb/serial/ftdi_sio.c
|
||||
+++ b/drivers/usb/serial/ftdi_sio.c
|
||||
@@ -605,6 +605,10 @@ static const struct usb_device_id id_tab
|
||||
{ USB_DEVICE(FTDI_VID, FTDI_NT_ORIONLXM_PID),
|
||||
.driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
|
||||
{ USB_DEVICE(FTDI_VID, FTDI_SYNAPSE_SS200_PID) },
|
||||
+ { USB_DEVICE(FTDI_VID, FTDI_CUSTOMWARE_MINIPLEX_PID) },
|
||||
+ { USB_DEVICE(FTDI_VID, FTDI_CUSTOMWARE_MINIPLEX2_PID) },
|
||||
+ { USB_DEVICE(FTDI_VID, FTDI_CUSTOMWARE_MINIPLEX2WI_PID) },
|
||||
+ { USB_DEVICE(FTDI_VID, FTDI_CUSTOMWARE_MINIPLEX3_PID) },
|
||||
/*
|
||||
* ELV devices:
|
||||
*/
|
||||
--- a/drivers/usb/serial/ftdi_sio_ids.h
|
||||
+++ b/drivers/usb/serial/ftdi_sio_ids.h
|
||||
@@ -568,6 +568,14 @@
|
||||
*/
|
||||
#define FTDI_SYNAPSE_SS200_PID 0x9090 /* SS200 - SNAP Stick 200 */
|
||||
|
||||
+/*
|
||||
+ * CustomWare / ShipModul NMEA multiplexers product ids (FTDI_VID)
|
||||
+ */
|
||||
+#define FTDI_CUSTOMWARE_MINIPLEX_PID 0xfd48 /* MiniPlex first generation NMEA Multiplexer */
|
||||
+#define FTDI_CUSTOMWARE_MINIPLEX2_PID 0xfd49 /* MiniPlex-USB and MiniPlex-2 series */
|
||||
+#define FTDI_CUSTOMWARE_MINIPLEX2WI_PID 0xfd4a /* MiniPlex-2Wi */
|
||||
+#define FTDI_CUSTOMWARE_MINIPLEX3_PID 0xfd4b /* MiniPlex-3 series */
|
||||
+
|
||||
|
||||
/********************************/
|
||||
/** third-party VID/PID combos **/
|
||||
+87
@@ -0,0 +1,87 @@
|
||||
From 913e4a90b6f9687ac0f543e7b632753e4f51c441 Mon Sep 17 00:00:00 2001
|
||||
From: Peter Chen <peter.chen@freescale.com>
|
||||
Date: Thu, 30 Jul 2015 13:13:03 +0800
|
||||
Subject: usb: gadget: f_uac2: finalize wMaxPacketSize according to bandwidth
|
||||
|
||||
From: Peter Chen <peter.chen@freescale.com>
|
||||
|
||||
commit 913e4a90b6f9687ac0f543e7b632753e4f51c441 upstream.
|
||||
|
||||
According to USB Audio Device 2.0 Spec, Ch4.10.1.1:
|
||||
wMaxPacketSize is defined as follows:
|
||||
Maximum packet size this endpoint is capable of sending or receiving
|
||||
when this configuration is selected.
|
||||
This is determined by the audio bandwidth constraints of the endpoint.
|
||||
|
||||
In current code, the wMaxPacketSize is defined as the maximum packet size
|
||||
for ISO endpoint, and it will let the host reserve much more space than
|
||||
it really needs, so that we can't let more endpoints work together at
|
||||
one frame.
|
||||
|
||||
We find this issue when we try to let 4 f_uac2 gadgets work together [1]
|
||||
at FS connection.
|
||||
|
||||
[1]http://www.spinics.net/lists/linux-usb/msg123478.html
|
||||
|
||||
Acked-by: Daniel Mack <zonque@gmail.com>
|
||||
Cc: andrzej.p@samsung.com
|
||||
Cc: Daniel Mack <zonque@gmail.com>
|
||||
Cc: tiwai@suse.de
|
||||
Cc: Alan Stern <stern@rowland.harvard.edu>
|
||||
Signed-off-by: Peter Chen <peter.chen@freescale.com>
|
||||
Signed-off-by: Felipe Balbi <balbi@ti.com>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
|
||||
---
|
||||
drivers/usb/gadget/function/f_uac2.c | 31 +++++++++++++++++++++++++++++--
|
||||
1 file changed, 29 insertions(+), 2 deletions(-)
|
||||
|
||||
--- a/drivers/usb/gadget/function/f_uac2.c
|
||||
+++ b/drivers/usb/gadget/function/f_uac2.c
|
||||
@@ -975,6 +975,29 @@ free_ep(struct uac2_rtd_params *prm, str
|
||||
"%s:%d Error!\n", __func__, __LINE__);
|
||||
}
|
||||
|
||||
+static void set_ep_max_packet_size(const struct f_uac2_opts *uac2_opts,
|
||||
+ struct usb_endpoint_descriptor *ep_desc,
|
||||
+ unsigned int factor, bool is_playback)
|
||||
+{
|
||||
+ int chmask, srate, ssize;
|
||||
+ u16 max_packet_size;
|
||||
+
|
||||
+ if (is_playback) {
|
||||
+ chmask = uac2_opts->p_chmask;
|
||||
+ srate = uac2_opts->p_srate;
|
||||
+ ssize = uac2_opts->p_ssize;
|
||||
+ } else {
|
||||
+ chmask = uac2_opts->c_chmask;
|
||||
+ srate = uac2_opts->c_srate;
|
||||
+ ssize = uac2_opts->c_ssize;
|
||||
+ }
|
||||
+
|
||||
+ max_packet_size = num_channels(chmask) * ssize *
|
||||
+ DIV_ROUND_UP(srate, factor / (1 << (ep_desc->bInterval - 1)));
|
||||
+ ep_desc->wMaxPacketSize = cpu_to_le16(min(max_packet_size,
|
||||
+ le16_to_cpu(ep_desc->wMaxPacketSize)));
|
||||
+}
|
||||
+
|
||||
static int
|
||||
afunc_bind(struct usb_configuration *cfg, struct usb_function *fn)
|
||||
{
|
||||
@@ -1070,10 +1093,14 @@ afunc_bind(struct usb_configuration *cfg
|
||||
uac2->p_prm.uac2 = uac2;
|
||||
uac2->c_prm.uac2 = uac2;
|
||||
|
||||
+ /* Calculate wMaxPacketSize according to audio bandwidth */
|
||||
+ set_ep_max_packet_size(uac2_opts, &fs_epin_desc, 1000, true);
|
||||
+ set_ep_max_packet_size(uac2_opts, &fs_epout_desc, 1000, false);
|
||||
+ set_ep_max_packet_size(uac2_opts, &hs_epin_desc, 8000, true);
|
||||
+ set_ep_max_packet_size(uac2_opts, &hs_epout_desc, 8000, false);
|
||||
+
|
||||
hs_epout_desc.bEndpointAddress = fs_epout_desc.bEndpointAddress;
|
||||
- hs_epout_desc.wMaxPacketSize = fs_epout_desc.wMaxPacketSize;
|
||||
hs_epin_desc.bEndpointAddress = fs_epin_desc.bEndpointAddress;
|
||||
- hs_epin_desc.wMaxPacketSize = fs_epin_desc.wMaxPacketSize;
|
||||
|
||||
ret = usb_assign_descriptors(fn, fs_audio_desc, hs_audio_desc, NULL);
|
||||
if (ret)
|
||||
+32
@@ -0,0 +1,32 @@
|
||||
From 5feb5d2003499b1094d898c010a7604d7afddc4c Mon Sep 17 00:00:00 2001
|
||||
From: Dan Carpenter <dan.carpenter@oracle.com>
|
||||
Date: Thu, 30 Jul 2015 00:30:58 +0300
|
||||
Subject: usb: gadget: m66592-udc: forever loop in set_feature()
|
||||
|
||||
From: Dan Carpenter <dan.carpenter@oracle.com>
|
||||
|
||||
commit 5feb5d2003499b1094d898c010a7604d7afddc4c upstream.
|
||||
|
||||
There is an "&&" vs "||" typo here so this loops 3000 times or if we get
|
||||
unlucky it could loop forever.
|
||||
|
||||
Fixes: ceaa0a6eeadf ('usb: gadget: m66592-udc: add support for TEST_MODE')
|
||||
Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
|
||||
Signed-off-by: Felipe Balbi <balbi@ti.com>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
|
||||
---
|
||||
drivers/usb/gadget/udc/m66592-udc.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/usb/gadget/udc/m66592-udc.c
|
||||
+++ b/drivers/usb/gadget/udc/m66592-udc.c
|
||||
@@ -1052,7 +1052,7 @@ static void set_feature(struct m66592 *m
|
||||
tmp = m66592_read(m66592, M66592_INTSTS0) &
|
||||
M66592_CTSQ;
|
||||
udelay(1);
|
||||
- } while (tmp != M66592_CS_IDST || timeout-- > 0);
|
||||
+ } while (tmp != M66592_CS_IDST && timeout-- > 0);
|
||||
|
||||
if (tmp == M66592_CS_IDST)
|
||||
m66592_bset(m66592,
|
||||
+58
@@ -0,0 +1,58 @@
|
||||
From 0521cfd06e1ebcd575e7ae36aab068b38df23850 Mon Sep 17 00:00:00 2001
|
||||
From: Peter Chen <peter.chen@freescale.com>
|
||||
Date: Mon, 17 Aug 2015 10:23:03 +0800
|
||||
Subject: usb: host: ehci-sys: delete useless bus_to_hcd conversion
|
||||
|
||||
From: Peter Chen <peter.chen@freescale.com>
|
||||
|
||||
commit 0521cfd06e1ebcd575e7ae36aab068b38df23850 upstream.
|
||||
|
||||
The ehci platform device's drvdata is the pointer of struct usb_hcd
|
||||
already, so we doesn't need to call bus_to_hcd conversion again.
|
||||
|
||||
Signed-off-by: Peter Chen <peter.chen@freescale.com>
|
||||
Acked-by: Alan Stern <stern@rowland.harvard.edu>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
|
||||
---
|
||||
drivers/usb/host/ehci-sysfs.c | 8 ++++----
|
||||
1 file changed, 4 insertions(+), 4 deletions(-)
|
||||
|
||||
--- a/drivers/usb/host/ehci-sysfs.c
|
||||
+++ b/drivers/usb/host/ehci-sysfs.c
|
||||
@@ -29,7 +29,7 @@ static ssize_t show_companion(struct dev
|
||||
int count = PAGE_SIZE;
|
||||
char *ptr = buf;
|
||||
|
||||
- ehci = hcd_to_ehci(bus_to_hcd(dev_get_drvdata(dev)));
|
||||
+ ehci = hcd_to_ehci(dev_get_drvdata(dev));
|
||||
nports = HCS_N_PORTS(ehci->hcs_params);
|
||||
|
||||
for (index = 0; index < nports; ++index) {
|
||||
@@ -54,7 +54,7 @@ static ssize_t store_companion(struct de
|
||||
struct ehci_hcd *ehci;
|
||||
int portnum, new_owner;
|
||||
|
||||
- ehci = hcd_to_ehci(bus_to_hcd(dev_get_drvdata(dev)));
|
||||
+ ehci = hcd_to_ehci(dev_get_drvdata(dev));
|
||||
new_owner = PORT_OWNER; /* Owned by companion */
|
||||
if (sscanf(buf, "%d", &portnum) != 1)
|
||||
return -EINVAL;
|
||||
@@ -85,7 +85,7 @@ static ssize_t show_uframe_periodic_max(
|
||||
struct ehci_hcd *ehci;
|
||||
int n;
|
||||
|
||||
- ehci = hcd_to_ehci(bus_to_hcd(dev_get_drvdata(dev)));
|
||||
+ ehci = hcd_to_ehci(dev_get_drvdata(dev));
|
||||
n = scnprintf(buf, PAGE_SIZE, "%d\n", ehci->uframe_periodic_max);
|
||||
return n;
|
||||
}
|
||||
@@ -101,7 +101,7 @@ static ssize_t store_uframe_periodic_max
|
||||
unsigned long flags;
|
||||
ssize_t ret;
|
||||
|
||||
- ehci = hcd_to_ehci(bus_to_hcd(dev_get_drvdata(dev)));
|
||||
+ ehci = hcd_to_ehci(dev_get_drvdata(dev));
|
||||
if (kstrtouint(buf, 0, &uframe_periodic_max) < 0)
|
||||
return -EINVAL;
|
||||
|
||||
+97
@@ -0,0 +1,97 @@
|
||||
From 49bda21266fdf195142e8b5dea057f09e96ada9f Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Micha=C5=82=20Pecio?= <michal.pecio@gmail.com>
|
||||
Date: Sun, 26 Jul 2015 11:14:34 +0200
|
||||
Subject: USB: pl2303: fix baud-rate divisor calculations
|
||||
|
||||
From: =?UTF-8?q?Micha=C5=82=20Pecio?= <michal.pecio@gmail.com>
|
||||
|
||||
commit 49bda21266fdf195142e8b5dea057f09e96ada9f upstream.
|
||||
|
||||
This commit fixes the following issues:
|
||||
|
||||
1. The 9th bit of buf was believed to be the LSB of divisor's
|
||||
exponent, but the hardware interprets it as MSB (9th bit) of the
|
||||
mantissa. The exponent is actually one bit shorter and applies
|
||||
to base 4, not 2 as previously believed.
|
||||
|
||||
2. Loop iterations doubled the exponent instead of incrementing.
|
||||
|
||||
3. The exponent wasn't checked for overflow.
|
||||
|
||||
4. The function returned requested rate instead of actual rate.
|
||||
|
||||
Due to issue #2, the old code deviated from the wrong formula
|
||||
described in #1 and actually yielded correct rates when divisor
|
||||
was lower than 4096 by using exponents of 0, 2 or 4 base-2,
|
||||
interpreted as 0, 1, 2 base-4 with the 9th mantissa bit clear.
|
||||
However, at 93.75 kbaud or less the rate turned out too slow
|
||||
due to #2 or too fast due to #2 and #3.
|
||||
|
||||
I tested this patch by sending and validating 0x00,0x01,..,0xff
|
||||
to an FTDI dongle at 234, 987, 2401, 9601, 31415, 115199, 250k,
|
||||
500k, 750k, 1M, 1.5M, 3M+1 baud. All rates passed.
|
||||
|
||||
I also used pv to check speed at some rates unsupported by FTDI:
|
||||
45 (the lowest possible), 2M, 4M, 5M and 6M-1. Looked sane.
|
||||
|
||||
Signed-off-by: Michal Pecio <michal.pecio@gmail.com>
|
||||
Fixes: 399aa9a75ad3 ("USB: pl2303: use divisors for unsupported baud
|
||||
rates")
|
||||
[johan: update summary ]
|
||||
Signed-off-by: Johan Hovold <johan@kernel.org>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
|
||||
---
|
||||
drivers/usb/serial/pl2303.c | 35 ++++++++++++++++++++++++++---------
|
||||
1 file changed, 26 insertions(+), 9 deletions(-)
|
||||
|
||||
--- a/drivers/usb/serial/pl2303.c
|
||||
+++ b/drivers/usb/serial/pl2303.c
|
||||
@@ -362,21 +362,38 @@ static speed_t pl2303_encode_baud_rate_d
|
||||
static speed_t pl2303_encode_baud_rate_divisor(unsigned char buf[4],
|
||||
speed_t baud)
|
||||
{
|
||||
- unsigned int tmp;
|
||||
+ unsigned int baseline, mantissa, exponent;
|
||||
|
||||
/*
|
||||
* Apparently the formula is:
|
||||
- * baudrate = 12M * 32 / (2^buf[1]) / buf[0]
|
||||
+ * baudrate = 12M * 32 / (mantissa * 4^exponent)
|
||||
+ * where
|
||||
+ * mantissa = buf[8:0]
|
||||
+ * exponent = buf[11:9]
|
||||
*/
|
||||
- tmp = 12000000 * 32 / baud;
|
||||
+ baseline = 12000000 * 32;
|
||||
+ mantissa = baseline / baud;
|
||||
+ if (mantissa == 0)
|
||||
+ mantissa = 1; /* Avoid dividing by zero if baud > 32*12M. */
|
||||
+ exponent = 0;
|
||||
+ while (mantissa >= 512) {
|
||||
+ if (exponent < 7) {
|
||||
+ mantissa >>= 2; /* divide by 4 */
|
||||
+ exponent++;
|
||||
+ } else {
|
||||
+ /* Exponent is maxed. Trim mantissa and leave. */
|
||||
+ mantissa = 511;
|
||||
+ break;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
buf[3] = 0x80;
|
||||
buf[2] = 0;
|
||||
- buf[1] = (tmp >= 256);
|
||||
- while (tmp >= 256) {
|
||||
- tmp >>= 2;
|
||||
- buf[1] <<= 1;
|
||||
- }
|
||||
- buf[0] = tmp;
|
||||
+ buf[1] = exponent << 1 | mantissa >> 8;
|
||||
+ buf[0] = mantissa & 0xff;
|
||||
+
|
||||
+ /* Calculate and return the exact baud rate. */
|
||||
+ baud = (baseline / mantissa) >> (exponent << 1);
|
||||
|
||||
return baud;
|
||||
}
|
||||
+30
@@ -0,0 +1,30 @@
|
||||
From 44840dec6127e4d7c5074f75d2dd96bc4ab85fe3 Mon Sep 17 00:00:00 2001
|
||||
From: David Ward <david.ward@ll.mit.edu>
|
||||
Date: Tue, 18 Aug 2015 10:36:23 +0200
|
||||
Subject: USB: qcserial: add HP lt4111 LTE/EV-DO/HSPA+ Gobi 4G Module
|
||||
|
||||
From: David Ward <david.ward@ll.mit.edu>
|
||||
|
||||
commit 44840dec6127e4d7c5074f75d2dd96bc4ab85fe3 upstream.
|
||||
|
||||
This is an HP-branded Sierra Wireless EM7355:
|
||||
https://bugzilla.redhat.com/show_bug.cgi?id=1223646#c2
|
||||
|
||||
Signed-off-by: David Ward <david.ward@ll.mit.edu>
|
||||
Signed-off-by: Johan Hovold <johan@kernel.org>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
|
||||
---
|
||||
drivers/usb/serial/qcserial.c | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
--- a/drivers/usb/serial/qcserial.c
|
||||
+++ b/drivers/usb/serial/qcserial.c
|
||||
@@ -139,6 +139,7 @@ static const struct usb_device_id id_tab
|
||||
{USB_DEVICE(0x0AF0, 0x8120)}, /* Option GTM681W */
|
||||
|
||||
/* non-Gobi Sierra Wireless devices */
|
||||
+ {DEVICE_SWI(0x03f0, 0x4e1d)}, /* HP lt4111 LTE/EV-DO/HSPA+ Gobi 4G Module */
|
||||
{DEVICE_SWI(0x0f3d, 0x68a2)}, /* Sierra Wireless MC7700 */
|
||||
{DEVICE_SWI(0x114f, 0x68a2)}, /* Sierra Wireless MC7750 */
|
||||
{DEVICE_SWI(0x1199, 0x68a2)}, /* Sierra Wireless MC7710 */
|
||||
+52
@@ -0,0 +1,52 @@
|
||||
From 951d3793bbfc0a441d791d820183aa3085c83ea9 Mon Sep 17 00:00:00 2001
|
||||
From: Philipp Hachtmann <hachti@hachti.de>
|
||||
Date: Mon, 17 Aug 2015 17:31:46 +0200
|
||||
Subject: USB: symbolserial: Use usb_get_serial_port_data
|
||||
|
||||
From: Philipp Hachtmann <hachti@hachti.de>
|
||||
|
||||
commit 951d3793bbfc0a441d791d820183aa3085c83ea9 upstream.
|
||||
|
||||
The driver used usb_get_serial_data(port->serial) which compiled but resulted
|
||||
in a NULL pointer being returned (and subsequently used). I did not go deeper
|
||||
into this but I guess this is a regression.
|
||||
|
||||
Signed-off-by: Philipp Hachtmann <hachti@hachti.de>
|
||||
Fixes: a85796ee5149 ("USB: symbolserial: move private-data allocation to
|
||||
port_probe")
|
||||
Acked-by: Johan Hovold <johan@kernel.org>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
|
||||
---
|
||||
drivers/usb/serial/symbolserial.c | 6 +++---
|
||||
1 file changed, 3 insertions(+), 3 deletions(-)
|
||||
|
||||
--- a/drivers/usb/serial/symbolserial.c
|
||||
+++ b/drivers/usb/serial/symbolserial.c
|
||||
@@ -94,7 +94,7 @@ exit:
|
||||
|
||||
static int symbol_open(struct tty_struct *tty, struct usb_serial_port *port)
|
||||
{
|
||||
- struct symbol_private *priv = usb_get_serial_data(port->serial);
|
||||
+ struct symbol_private *priv = usb_get_serial_port_data(port);
|
||||
unsigned long flags;
|
||||
int result = 0;
|
||||
|
||||
@@ -120,7 +120,7 @@ static void symbol_close(struct usb_seri
|
||||
static void symbol_throttle(struct tty_struct *tty)
|
||||
{
|
||||
struct usb_serial_port *port = tty->driver_data;
|
||||
- struct symbol_private *priv = usb_get_serial_data(port->serial);
|
||||
+ struct symbol_private *priv = usb_get_serial_port_data(port);
|
||||
|
||||
spin_lock_irq(&priv->lock);
|
||||
priv->throttled = true;
|
||||
@@ -130,7 +130,7 @@ static void symbol_throttle(struct tty_s
|
||||
static void symbol_unthrottle(struct tty_struct *tty)
|
||||
{
|
||||
struct usb_serial_port *port = tty->driver_data;
|
||||
- struct symbol_private *priv = usb_get_serial_data(port->serial);
|
||||
+ struct symbol_private *priv = usb_get_serial_port_data(port);
|
||||
int result;
|
||||
bool was_throttled;
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user