mirror of
https://github.com/Ysurac/openmptcprouter.git
synced 2025-02-12 19:31:52 +00:00
Update RPI patches
This commit is contained in:
parent
215d4b8773
commit
3aeefced93
27 changed files with 1803 additions and 215 deletions
|
@ -0,0 +1,227 @@
|
|||
From 3e676d8a73e2b2082113b9a0bf043cde7cc920de Mon Sep 17 00:00:00 2001
|
||||
From: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
Date: Fri, 1 Jun 2018 13:09:59 +0200
|
||||
Subject: [PATCH 416/496] staging: vc04_services: no need to check debugfs
|
||||
return values
|
||||
|
||||
commit 0723103f8ba15a019bbcaf6f130d73d05337332f upstream
|
||||
|
||||
When calling debugfs functions, there is no need to ever check the
|
||||
return value. The function can work or not, but the code logic should
|
||||
never do something different based on this.
|
||||
|
||||
Clean up the vchiq_arm code by not caring about the value of debugfs
|
||||
calls. This ends up removing a number of lines of code that are not
|
||||
needed.
|
||||
|
||||
Cc: Stefan Wahren <stefan.wahren@i2se.com>
|
||||
Cc: Kees Cook <keescook@chromium.org>
|
||||
Cc: Dan Carpenter <dan.carpenter@oracle.com>
|
||||
Cc: Arnd Bergmann <arnd@arndb.de>
|
||||
Cc: Keerthi Reddy <keerthigd4990@gmail.com>
|
||||
Cc: linux-rpi-kernel@lists.infradead.org
|
||||
Cc: linux-arm-kernel@lists.infradead.org
|
||||
Reviewed-by: Eric Anholt <eric@anholt.net>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
.../interface/vchiq_arm/vchiq_arm.c | 8 +-
|
||||
.../interface/vchiq_arm/vchiq_debugfs.c | 73 +++----------------
|
||||
.../interface/vchiq_arm/vchiq_debugfs.h | 4 +-
|
||||
3 files changed, 15 insertions(+), 70 deletions(-)
|
||||
|
||||
diff --git a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c
|
||||
index 63e4308a4f71..d67987fbf25e 100644
|
||||
--- a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c
|
||||
+++ b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c
|
||||
@@ -1748,7 +1748,7 @@ vchiq_open(struct inode *inode, struct file *file)
|
||||
instance->state = state;
|
||||
instance->pid = current->tgid;
|
||||
|
||||
- (void)vchiq_debugfs_add_instance(instance);
|
||||
+ vchiq_debugfs_add_instance(instance);
|
||||
|
||||
sema_init(&instance->insert_event, 0);
|
||||
sema_init(&instance->remove_event, 0);
|
||||
@@ -3432,9 +3432,7 @@ static int vchiq_probe(struct platform_device *pdev)
|
||||
goto failed_device_create;
|
||||
|
||||
/* create debugfs entries */
|
||||
- err = vchiq_debugfs_init();
|
||||
- if (err != 0)
|
||||
- goto failed_debugfs_init;
|
||||
+ vchiq_debugfs_init();
|
||||
|
||||
vchiq_log_info(vchiq_arm_log_level,
|
||||
"vchiq: initialised - version %d (min %d), device %d.%d",
|
||||
@@ -3443,8 +3441,6 @@ static int vchiq_probe(struct platform_device *pdev)
|
||||
|
||||
return 0;
|
||||
|
||||
-failed_debugfs_init:
|
||||
- device_destroy(vchiq_class, vchiq_devid);
|
||||
failed_device_create:
|
||||
class_destroy(vchiq_class);
|
||||
failed_class_create:
|
||||
diff --git a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_debugfs.c b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_debugfs.c
|
||||
index 9367a9a5aa3c..a568ec90f607 100644
|
||||
--- a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_debugfs.c
|
||||
+++ b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_debugfs.c
|
||||
@@ -160,15 +160,12 @@ static const struct file_operations debugfs_log_fops = {
|
||||
};
|
||||
|
||||
/* create an entry under <debugfs>/vchiq/log for each log category */
|
||||
-static int vchiq_debugfs_create_log_entries(struct dentry *top)
|
||||
+static void vchiq_debugfs_create_log_entries(struct dentry *top)
|
||||
{
|
||||
struct dentry *dir;
|
||||
size_t i;
|
||||
- int ret = 0;
|
||||
|
||||
dir = debugfs_create_dir("log", vchiq_debugfs_top());
|
||||
- if (!dir)
|
||||
- return -ENOMEM;
|
||||
debugfs_info.log_categories = dir;
|
||||
|
||||
for (i = 0; i < n_log_entries; i++) {
|
||||
@@ -179,14 +176,8 @@ static int vchiq_debugfs_create_log_entries(struct dentry *top)
|
||||
debugfs_info.log_categories,
|
||||
levp,
|
||||
&debugfs_log_fops);
|
||||
- if (!dir) {
|
||||
- ret = -ENOMEM;
|
||||
- break;
|
||||
- }
|
||||
-
|
||||
vchiq_debugfs_log_entries[i].dir = dir;
|
||||
}
|
||||
- return ret;
|
||||
}
|
||||
|
||||
static int debugfs_usecount_show(struct seq_file *f, void *offset)
|
||||
@@ -270,43 +261,22 @@ static const struct file_operations debugfs_trace_fops = {
|
||||
};
|
||||
|
||||
/* add an instance (process) to the debugfs entries */
|
||||
-int vchiq_debugfs_add_instance(VCHIQ_INSTANCE_T instance)
|
||||
+void vchiq_debugfs_add_instance(VCHIQ_INSTANCE_T instance)
|
||||
{
|
||||
char pidstr[16];
|
||||
- struct dentry *top, *use_count, *trace;
|
||||
+ struct dentry *top;
|
||||
struct dentry *clients = vchiq_clients_top();
|
||||
|
||||
snprintf(pidstr, sizeof(pidstr), "%d",
|
||||
vchiq_instance_get_pid(instance));
|
||||
|
||||
top = debugfs_create_dir(pidstr, clients);
|
||||
- if (!top)
|
||||
- goto fail_top;
|
||||
-
|
||||
- use_count = debugfs_create_file("use_count",
|
||||
- 0444, top,
|
||||
- instance,
|
||||
- &debugfs_usecount_fops);
|
||||
- if (!use_count)
|
||||
- goto fail_use_count;
|
||||
-
|
||||
- trace = debugfs_create_file("trace",
|
||||
- 0644, top,
|
||||
- instance,
|
||||
- &debugfs_trace_fops);
|
||||
- if (!trace)
|
||||
- goto fail_trace;
|
||||
-
|
||||
- vchiq_instance_get_debugfs_node(instance)->dentry = top;
|
||||
|
||||
- return 0;
|
||||
+ debugfs_create_file("use_count", 0444, top, instance,
|
||||
+ &debugfs_usecount_fops);
|
||||
+ debugfs_create_file("trace", 0644, top, instance, &debugfs_trace_fops);
|
||||
|
||||
-fail_trace:
|
||||
- debugfs_remove(use_count);
|
||||
-fail_use_count:
|
||||
- debugfs_remove(top);
|
||||
-fail_top:
|
||||
- return -ENOMEM;
|
||||
+ vchiq_instance_get_debugfs_node(instance)->dentry = top;
|
||||
}
|
||||
|
||||
void vchiq_debugfs_remove_instance(VCHIQ_INSTANCE_T instance)
|
||||
@@ -316,32 +286,13 @@ void vchiq_debugfs_remove_instance(VCHIQ_INSTANCE_T instance)
|
||||
debugfs_remove_recursive(node->dentry);
|
||||
}
|
||||
|
||||
-
|
||||
-int vchiq_debugfs_init(void)
|
||||
+void vchiq_debugfs_init(void)
|
||||
{
|
||||
- BUG_ON(debugfs_info.vchiq_cfg_dir != NULL);
|
||||
-
|
||||
debugfs_info.vchiq_cfg_dir = debugfs_create_dir("vchiq", NULL);
|
||||
- if (debugfs_info.vchiq_cfg_dir == NULL)
|
||||
- goto fail;
|
||||
-
|
||||
debugfs_info.clients = debugfs_create_dir("clients",
|
||||
vchiq_debugfs_top());
|
||||
- if (!debugfs_info.clients)
|
||||
- goto fail;
|
||||
-
|
||||
- if (vchiq_debugfs_create_log_entries(vchiq_debugfs_top()) != 0)
|
||||
- goto fail;
|
||||
-
|
||||
- return 0;
|
||||
|
||||
-fail:
|
||||
- vchiq_debugfs_deinit();
|
||||
- vchiq_log_error(vchiq_arm_log_level,
|
||||
- "%s: failed to create debugfs directory",
|
||||
- __func__);
|
||||
-
|
||||
- return -ENOMEM;
|
||||
+ vchiq_debugfs_create_log_entries(vchiq_debugfs_top());
|
||||
}
|
||||
|
||||
/* remove all the debugfs entries */
|
||||
@@ -363,18 +314,16 @@ static struct dentry *vchiq_debugfs_top(void)
|
||||
|
||||
#else /* CONFIG_DEBUG_FS */
|
||||
|
||||
-int vchiq_debugfs_init(void)
|
||||
+void vchiq_debugfs_init(void)
|
||||
{
|
||||
- return 0;
|
||||
}
|
||||
|
||||
void vchiq_debugfs_deinit(void)
|
||||
{
|
||||
}
|
||||
|
||||
-int vchiq_debugfs_add_instance(VCHIQ_INSTANCE_T instance)
|
||||
+void vchiq_debugfs_add_instance(VCHIQ_INSTANCE_T instance)
|
||||
{
|
||||
- return 0;
|
||||
}
|
||||
|
||||
void vchiq_debugfs_remove_instance(VCHIQ_INSTANCE_T instance)
|
||||
diff --git a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_debugfs.h b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_debugfs.h
|
||||
index 1d95e3d70621..3af6397ada19 100644
|
||||
--- a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_debugfs.h
|
||||
+++ b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_debugfs.h
|
||||
@@ -40,11 +40,11 @@ typedef struct vchiq_debugfs_node_struct {
|
||||
struct dentry *dentry;
|
||||
} VCHIQ_DEBUGFS_NODE_T;
|
||||
|
||||
-int vchiq_debugfs_init(void);
|
||||
+void vchiq_debugfs_init(void);
|
||||
|
||||
void vchiq_debugfs_deinit(void);
|
||||
|
||||
-int vchiq_debugfs_add_instance(VCHIQ_INSTANCE_T instance);
|
||||
+void vchiq_debugfs_add_instance(VCHIQ_INSTANCE_T instance);
|
||||
|
||||
void vchiq_debugfs_remove_instance(VCHIQ_INSTANCE_T instance);
|
||||
|
||||
--
|
||||
2.19.1
|
||||
|
|
@ -0,0 +1,109 @@
|
|||
From b03490c29c77c8796a2209107209af5cf3bb15ff Mon Sep 17 00:00:00 2001
|
||||
From: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
Date: Fri, 1 Jun 2018 13:10:00 +0200
|
||||
Subject: [PATCH 417/496] staging: vc04_services: remove odd
|
||||
vchiq_debugfs_top() wrapper
|
||||
|
||||
commit 2739deaece4bc25fba5df0566423f4a11c3f4e84 upstream
|
||||
|
||||
vchiq_debugfs_top() is only a wrapper around a pointer to a dentry, so
|
||||
just use the dentry directly instead, making it a static variable
|
||||
instead of part of a static structure.
|
||||
|
||||
This also removes the pointless BUG_ON() when checking that dentry as no
|
||||
one should ever care if debugfs is working or not, and the kernel should
|
||||
really not panic over something as trivial as that.
|
||||
|
||||
Suggested-by: Eric Anholt <eric@anholt.net>
|
||||
Cc: Stefan Wahren <stefan.wahren@i2se.com>
|
||||
Cc: Kees Cook <keescook@chromium.org>
|
||||
Cc: Dan Carpenter <dan.carpenter@oracle.com>
|
||||
Cc: Arnd Bergmann <arnd@arndb.de>
|
||||
Cc: Keerthi Reddy <keerthigd4990@gmail.com>
|
||||
Cc: linux-rpi-kernel@lists.infradead.org
|
||||
Cc: linux-arm-kernel@lists.infradead.org
|
||||
Reviewed-by: Eric Anholt <eric@anholt.net>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
.../interface/vchiq_arm/vchiq_debugfs.c | 24 +++++++------------
|
||||
1 file changed, 8 insertions(+), 16 deletions(-)
|
||||
|
||||
diff --git a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_debugfs.c b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_debugfs.c
|
||||
index a568ec90f607..f1c1ef0be795 100644
|
||||
--- a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_debugfs.c
|
||||
+++ b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_debugfs.c
|
||||
@@ -55,9 +55,6 @@
|
||||
|
||||
/* Top-level debug info */
|
||||
struct vchiq_debugfs_info {
|
||||
- /* Global 'vchiq' debugfs entry used by all instances */
|
||||
- struct dentry *vchiq_cfg_dir;
|
||||
-
|
||||
/* one entry per client process */
|
||||
struct dentry *clients;
|
||||
|
||||
@@ -67,6 +64,9 @@ struct vchiq_debugfs_info {
|
||||
|
||||
static struct vchiq_debugfs_info debugfs_info;
|
||||
|
||||
+/* Global 'vchiq' debugfs entry used by all instances */
|
||||
+struct dentry *vchiq_dbg_dir;
|
||||
+
|
||||
/* Log category debugfs entries */
|
||||
struct vchiq_debugfs_log_entry {
|
||||
const char *name;
|
||||
@@ -84,7 +84,6 @@ static struct vchiq_debugfs_log_entry vchiq_debugfs_log_entries[] = {
|
||||
static int n_log_entries = ARRAY_SIZE(vchiq_debugfs_log_entries);
|
||||
|
||||
static struct dentry *vchiq_clients_top(void);
|
||||
-static struct dentry *vchiq_debugfs_top(void);
|
||||
|
||||
static int debugfs_log_show(struct seq_file *f, void *offset)
|
||||
{
|
||||
@@ -165,7 +164,7 @@ static void vchiq_debugfs_create_log_entries(struct dentry *top)
|
||||
struct dentry *dir;
|
||||
size_t i;
|
||||
|
||||
- dir = debugfs_create_dir("log", vchiq_debugfs_top());
|
||||
+ dir = debugfs_create_dir("log", vchiq_dbg_dir);
|
||||
debugfs_info.log_categories = dir;
|
||||
|
||||
for (i = 0; i < n_log_entries; i++) {
|
||||
@@ -288,17 +287,16 @@ void vchiq_debugfs_remove_instance(VCHIQ_INSTANCE_T instance)
|
||||
|
||||
void vchiq_debugfs_init(void)
|
||||
{
|
||||
- debugfs_info.vchiq_cfg_dir = debugfs_create_dir("vchiq", NULL);
|
||||
- debugfs_info.clients = debugfs_create_dir("clients",
|
||||
- vchiq_debugfs_top());
|
||||
+ vchiq_dbg_dir = debugfs_create_dir("vchiq", NULL);
|
||||
+ debugfs_info.clients = debugfs_create_dir("clients", vchiq_dbg_dir);
|
||||
|
||||
- vchiq_debugfs_create_log_entries(vchiq_debugfs_top());
|
||||
+ vchiq_debugfs_create_log_entries(vchiq_dbg_dir);
|
||||
}
|
||||
|
||||
/* remove all the debugfs entries */
|
||||
void vchiq_debugfs_deinit(void)
|
||||
{
|
||||
- debugfs_remove_recursive(vchiq_debugfs_top());
|
||||
+ debugfs_remove_recursive(vchiq_dbg_dir);
|
||||
}
|
||||
|
||||
static struct dentry *vchiq_clients_top(void)
|
||||
@@ -306,12 +304,6 @@ static struct dentry *vchiq_clients_top(void)
|
||||
return debugfs_info.clients;
|
||||
}
|
||||
|
||||
-static struct dentry *vchiq_debugfs_top(void)
|
||||
-{
|
||||
- BUG_ON(debugfs_info.vchiq_cfg_dir == NULL);
|
||||
- return debugfs_info.vchiq_cfg_dir;
|
||||
-}
|
||||
-
|
||||
#else /* CONFIG_DEBUG_FS */
|
||||
|
||||
void vchiq_debugfs_init(void)
|
||||
--
|
||||
2.19.1
|
||||
|
|
@ -0,0 +1,99 @@
|
|||
From 468f8f61d465493f3597be7e715eddb7aac79b6c Mon Sep 17 00:00:00 2001
|
||||
From: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
Date: Fri, 1 Jun 2018 13:10:01 +0200
|
||||
Subject: [PATCH 418/496] staging: vc04_services: move client dbg directory
|
||||
into static variable
|
||||
|
||||
commit 24e8d3fc42f25936ff270e404847a3a462c38468 upstream
|
||||
|
||||
This does not need to be part of a wrapper function, or in a structure,
|
||||
just properly reference it directly as a single variable.
|
||||
|
||||
The whole variable will be going away soon anyway, this is just a step
|
||||
toward that direction.
|
||||
|
||||
Suggested-by: Eric Anholt <eric@anholt.net>
|
||||
Cc: Stefan Wahren <stefan.wahren@i2se.com>
|
||||
Cc: Kees Cook <keescook@chromium.org>
|
||||
Cc: Dan Carpenter <dan.carpenter@oracle.com>
|
||||
Cc: Arnd Bergmann <arnd@arndb.de>
|
||||
Cc: Keerthi Reddy <keerthigd4990@gmail.com>
|
||||
Cc: linux-rpi-kernel@lists.infradead.org
|
||||
Cc: linux-arm-kernel@lists.infradead.org
|
||||
Reviewed-by: Eric Anholt <eric@anholt.net>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
.../interface/vchiq_arm/vchiq_debugfs.c | 18 ++++--------------
|
||||
1 file changed, 4 insertions(+), 14 deletions(-)
|
||||
|
||||
diff --git a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_debugfs.c b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_debugfs.c
|
||||
index f1c1ef0be795..efdc985236ac 100644
|
||||
--- a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_debugfs.c
|
||||
+++ b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_debugfs.c
|
||||
@@ -55,17 +55,15 @@
|
||||
|
||||
/* Top-level debug info */
|
||||
struct vchiq_debugfs_info {
|
||||
- /* one entry per client process */
|
||||
- struct dentry *clients;
|
||||
-
|
||||
/* log categories */
|
||||
struct dentry *log_categories;
|
||||
};
|
||||
|
||||
static struct vchiq_debugfs_info debugfs_info;
|
||||
|
||||
-/* Global 'vchiq' debugfs entry used by all instances */
|
||||
+/* Global 'vchiq' debugfs and clients entry used by all instances */
|
||||
struct dentry *vchiq_dbg_dir;
|
||||
+struct dentry *vchiq_dbg_clients;
|
||||
|
||||
/* Log category debugfs entries */
|
||||
struct vchiq_debugfs_log_entry {
|
||||
@@ -83,8 +81,6 @@ static struct vchiq_debugfs_log_entry vchiq_debugfs_log_entries[] = {
|
||||
};
|
||||
static int n_log_entries = ARRAY_SIZE(vchiq_debugfs_log_entries);
|
||||
|
||||
-static struct dentry *vchiq_clients_top(void);
|
||||
-
|
||||
static int debugfs_log_show(struct seq_file *f, void *offset)
|
||||
{
|
||||
int *levp = f->private;
|
||||
@@ -264,12 +260,11 @@ void vchiq_debugfs_add_instance(VCHIQ_INSTANCE_T instance)
|
||||
{
|
||||
char pidstr[16];
|
||||
struct dentry *top;
|
||||
- struct dentry *clients = vchiq_clients_top();
|
||||
|
||||
snprintf(pidstr, sizeof(pidstr), "%d",
|
||||
vchiq_instance_get_pid(instance));
|
||||
|
||||
- top = debugfs_create_dir(pidstr, clients);
|
||||
+ top = debugfs_create_dir(pidstr, vchiq_dbg_clients);
|
||||
|
||||
debugfs_create_file("use_count", 0444, top, instance,
|
||||
&debugfs_usecount_fops);
|
||||
@@ -288,7 +283,7 @@ void vchiq_debugfs_remove_instance(VCHIQ_INSTANCE_T instance)
|
||||
void vchiq_debugfs_init(void)
|
||||
{
|
||||
vchiq_dbg_dir = debugfs_create_dir("vchiq", NULL);
|
||||
- debugfs_info.clients = debugfs_create_dir("clients", vchiq_dbg_dir);
|
||||
+ vchiq_dbg_clients = debugfs_create_dir("clients", vchiq_dbg_dir);
|
||||
|
||||
vchiq_debugfs_create_log_entries(vchiq_dbg_dir);
|
||||
}
|
||||
@@ -299,11 +294,6 @@ void vchiq_debugfs_deinit(void)
|
||||
debugfs_remove_recursive(vchiq_dbg_dir);
|
||||
}
|
||||
|
||||
-static struct dentry *vchiq_clients_top(void)
|
||||
-{
|
||||
- return debugfs_info.clients;
|
||||
-}
|
||||
-
|
||||
#else /* CONFIG_DEBUG_FS */
|
||||
|
||||
void vchiq_debugfs_init(void)
|
||||
--
|
||||
2.19.1
|
||||
|
|
@ -0,0 +1,68 @@
|
|||
From f731c29ba7438c48c624d7681d1824028741e69f Mon Sep 17 00:00:00 2001
|
||||
From: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
Date: Fri, 1 Jun 2018 13:10:02 +0200
|
||||
Subject: [PATCH 419/496] staging: vc04_services: remove struct
|
||||
vchiq_debugfs_info
|
||||
|
||||
commit 127892febb2d5d6612756da2d7d0bab526db3b51 upstream
|
||||
|
||||
This structure, and the one static variable that was declared with it,
|
||||
were not being used for anything. The log_categories field was being
|
||||
set, but never used again. So just remove it entirely as it is not
|
||||
needed at all.
|
||||
|
||||
Suggested-by: Eric Anholt <eric@anholt.net>
|
||||
Cc: Stefan Wahren <stefan.wahren@i2se.com>
|
||||
Cc: Kees Cook <keescook@chromium.org>
|
||||
Cc: Dan Carpenter <dan.carpenter@oracle.com>
|
||||
Cc: Arnd Bergmann <arnd@arndb.de>
|
||||
Cc: Keerthi Reddy <keerthigd4990@gmail.com>
|
||||
Cc: linux-rpi-kernel@lists.infradead.org
|
||||
Cc: linux-arm-kernel@lists.infradead.org
|
||||
Reviewed-by: Eric Anholt <eric@anholt.net>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
.../interface/vchiq_arm/vchiq_debugfs.c | 15 +--------------
|
||||
1 file changed, 1 insertion(+), 14 deletions(-)
|
||||
|
||||
diff --git a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_debugfs.c b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_debugfs.c
|
||||
index efdc985236ac..5893d9e45f5a 100644
|
||||
--- a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_debugfs.c
|
||||
+++ b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_debugfs.c
|
||||
@@ -52,15 +52,6 @@
|
||||
#define VCHIQ_LOG_INFO_STR "info"
|
||||
#define VCHIQ_LOG_TRACE_STR "trace"
|
||||
|
||||
-
|
||||
-/* Top-level debug info */
|
||||
-struct vchiq_debugfs_info {
|
||||
- /* log categories */
|
||||
- struct dentry *log_categories;
|
||||
-};
|
||||
-
|
||||
-static struct vchiq_debugfs_info debugfs_info;
|
||||
-
|
||||
/* Global 'vchiq' debugfs and clients entry used by all instances */
|
||||
struct dentry *vchiq_dbg_dir;
|
||||
struct dentry *vchiq_dbg_clients;
|
||||
@@ -161,16 +152,12 @@ static void vchiq_debugfs_create_log_entries(struct dentry *top)
|
||||
size_t i;
|
||||
|
||||
dir = debugfs_create_dir("log", vchiq_dbg_dir);
|
||||
- debugfs_info.log_categories = dir;
|
||||
|
||||
for (i = 0; i < n_log_entries; i++) {
|
||||
void *levp = (void *)vchiq_debugfs_log_entries[i].plevel;
|
||||
|
||||
dir = debugfs_create_file(vchiq_debugfs_log_entries[i].name,
|
||||
- 0644,
|
||||
- debugfs_info.log_categories,
|
||||
- levp,
|
||||
- &debugfs_log_fops);
|
||||
+ 0644, dir, levp, &debugfs_log_fops);
|
||||
vchiq_debugfs_log_entries[i].dir = dir;
|
||||
}
|
||||
}
|
||||
--
|
||||
2.19.1
|
||||
|
|
@ -0,0 +1,56 @@
|
|||
From c92dccec989d373f68a1756e461a06e584482292 Mon Sep 17 00:00:00 2001
|
||||
From: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
Date: Fri, 1 Jun 2018 13:10:03 +0200
|
||||
Subject: [PATCH 420/496] staging: vc04_services: vchiq_debugfs_log_entry can
|
||||
be a void *
|
||||
|
||||
commit 54f156968a1ca1655a53b4975e91b767552d8008 upstream
|
||||
|
||||
There's no need to set this to be int * when it is only used as a void *.
|
||||
This lets us remove the unneeded cast, and unneeded temporary variable
|
||||
the one place it is referenced in the code.
|
||||
|
||||
Suggested-by: Eric Anholt <eric@anholt.net>
|
||||
Cc: Stefan Wahren <stefan.wahren@i2se.com>
|
||||
Cc: Kees Cook <keescook@chromium.org>
|
||||
Cc: Dan Carpenter <dan.carpenter@oracle.com>
|
||||
Cc: Arnd Bergmann <arnd@arndb.de>
|
||||
Cc: Keerthi Reddy <keerthigd4990@gmail.com>
|
||||
Cc: linux-rpi-kernel@lists.infradead.org
|
||||
Cc: linux-arm-kernel@lists.infradead.org
|
||||
Reviewed-by: Eric Anholt <eric@anholt.net>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
.../vc04_services/interface/vchiq_arm/vchiq_debugfs.c | 8 ++++----
|
||||
1 file changed, 4 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_debugfs.c b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_debugfs.c
|
||||
index 5893d9e45f5a..e8f95ac5131f 100644
|
||||
--- a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_debugfs.c
|
||||
+++ b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_debugfs.c
|
||||
@@ -59,7 +59,7 @@ struct dentry *vchiq_dbg_clients;
|
||||
/* Log category debugfs entries */
|
||||
struct vchiq_debugfs_log_entry {
|
||||
const char *name;
|
||||
- int *plevel;
|
||||
+ void *plevel;
|
||||
struct dentry *dir;
|
||||
};
|
||||
|
||||
@@ -154,10 +154,10 @@ static void vchiq_debugfs_create_log_entries(struct dentry *top)
|
||||
dir = debugfs_create_dir("log", vchiq_dbg_dir);
|
||||
|
||||
for (i = 0; i < n_log_entries; i++) {
|
||||
- void *levp = (void *)vchiq_debugfs_log_entries[i].plevel;
|
||||
-
|
||||
dir = debugfs_create_file(vchiq_debugfs_log_entries[i].name,
|
||||
- 0644, dir, levp, &debugfs_log_fops);
|
||||
+ 0644, dir,
|
||||
+ vchiq_debugfs_log_entries[i].plevel,
|
||||
+ &debugfs_log_fops);
|
||||
vchiq_debugfs_log_entries[i].dir = dir;
|
||||
}
|
||||
}
|
||||
--
|
||||
2.19.1
|
||||
|
|
@ -0,0 +1,88 @@
|
|||
From da38e1d6f0d496c128150bd973816986dd23a290 Mon Sep 17 00:00:00 2001
|
||||
From: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
Date: Fri, 1 Jun 2018 13:10:04 +0200
|
||||
Subject: [PATCH 421/496] staging: vc04_services: no need to save the log
|
||||
debufs dentries
|
||||
|
||||
commit 3b93c0f4b6accb8105152900d7e414593a8b0c79 upstream
|
||||
|
||||
The log entry dentries are only set, never referenced, so no need to
|
||||
keep them around. Remove the pointer from struct
|
||||
vchiq_debugfs_log_entry as it is not needed anymore and get rid of the
|
||||
separate vchiq_debugfs_create_log_entries() function as it is only used
|
||||
in one place.
|
||||
|
||||
Suggested-by: Eric Anholt <eric@anholt.net>
|
||||
Cc: Stefan Wahren <stefan.wahren@i2se.com>
|
||||
Cc: Kees Cook <keescook@chromium.org>
|
||||
Cc: Dan Carpenter <dan.carpenter@oracle.com>
|
||||
Cc: Arnd Bergmann <arnd@arndb.de>
|
||||
Cc: Keerthi Reddy <keerthigd4990@gmail.com>
|
||||
Cc: linux-rpi-kernel@lists.infradead.org
|
||||
Cc: linux-arm-kernel@lists.infradead.org
|
||||
Reviewed-by: Eric Anholt <eric@anholt.net>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
.../interface/vchiq_arm/vchiq_debugfs.c | 29 +++++++------------
|
||||
1 file changed, 10 insertions(+), 19 deletions(-)
|
||||
|
||||
diff --git a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_debugfs.c b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_debugfs.c
|
||||
index e8f95ac5131f..db4f0c75a083 100644
|
||||
--- a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_debugfs.c
|
||||
+++ b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_debugfs.c
|
||||
@@ -60,7 +60,6 @@ struct dentry *vchiq_dbg_clients;
|
||||
struct vchiq_debugfs_log_entry {
|
||||
const char *name;
|
||||
void *plevel;
|
||||
- struct dentry *dir;
|
||||
};
|
||||
|
||||
static struct vchiq_debugfs_log_entry vchiq_debugfs_log_entries[] = {
|
||||
@@ -145,23 +144,6 @@ static const struct file_operations debugfs_log_fops = {
|
||||
.release = single_release,
|
||||
};
|
||||
|
||||
-/* create an entry under <debugfs>/vchiq/log for each log category */
|
||||
-static void vchiq_debugfs_create_log_entries(struct dentry *top)
|
||||
-{
|
||||
- struct dentry *dir;
|
||||
- size_t i;
|
||||
-
|
||||
- dir = debugfs_create_dir("log", vchiq_dbg_dir);
|
||||
-
|
||||
- for (i = 0; i < n_log_entries; i++) {
|
||||
- dir = debugfs_create_file(vchiq_debugfs_log_entries[i].name,
|
||||
- 0644, dir,
|
||||
- vchiq_debugfs_log_entries[i].plevel,
|
||||
- &debugfs_log_fops);
|
||||
- vchiq_debugfs_log_entries[i].dir = dir;
|
||||
- }
|
||||
-}
|
||||
-
|
||||
static int debugfs_usecount_show(struct seq_file *f, void *offset)
|
||||
{
|
||||
VCHIQ_INSTANCE_T instance = f->private;
|
||||
@@ -269,10 +251,19 @@ void vchiq_debugfs_remove_instance(VCHIQ_INSTANCE_T instance)
|
||||
|
||||
void vchiq_debugfs_init(void)
|
||||
{
|
||||
+ struct dentry *dir;
|
||||
+ int i;
|
||||
+
|
||||
vchiq_dbg_dir = debugfs_create_dir("vchiq", NULL);
|
||||
vchiq_dbg_clients = debugfs_create_dir("clients", vchiq_dbg_dir);
|
||||
|
||||
- vchiq_debugfs_create_log_entries(vchiq_dbg_dir);
|
||||
+ /* create an entry under <debugfs>/vchiq/log for each log category */
|
||||
+ dir = debugfs_create_dir("log", vchiq_dbg_dir);
|
||||
+
|
||||
+ for (i = 0; i < n_log_entries; i++)
|
||||
+ debugfs_create_file(vchiq_debugfs_log_entries[i].name, 0644,
|
||||
+ dir, vchiq_debugfs_log_entries[i].plevel,
|
||||
+ &debugfs_log_fops);
|
||||
}
|
||||
|
||||
/* remove all the debugfs entries */
|
||||
--
|
||||
2.19.1
|
||||
|
|
@ -0,0 +1,65 @@
|
|||
From b6bd1034b83c0c7ceeb0d58ea0abd9d141d55710 Mon Sep 17 00:00:00 2001
|
||||
From: Genki Sky <sky@genki.is>
|
||||
Date: Tue, 5 Dec 2017 19:09:54 -0500
|
||||
Subject: [PATCH 422/496] staging: vc04_services: Join multiline dereferences
|
||||
|
||||
commit 7260ea5fc327344974716e5109180f96f0483a85 upstream
|
||||
|
||||
This was found using checkpatch.pl's MULTILINE_DEREFERENCE warning.
|
||||
Putting the dereference onto one line makes them easier to read,
|
||||
especially when part of a larger expression (in this case, function
|
||||
arguments and ternary operator), and when the dereferences are short
|
||||
(as they are here).
|
||||
|
||||
Signed-off-by: Genki Sky <sky@genki.is>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
.../bcm2835-camera/bcm2835-camera.c | 16 ++++++----------
|
||||
1 file changed, 6 insertions(+), 10 deletions(-)
|
||||
|
||||
diff --git a/drivers/staging/vc04_services/bcm2835-camera/bcm2835-camera.c b/drivers/staging/vc04_services/bcm2835-camera/bcm2835-camera.c
|
||||
index 8bfd60e06a08..f31f8c756741 100644
|
||||
--- a/drivers/staging/vc04_services/bcm2835-camera/bcm2835-camera.c
|
||||
+++ b/drivers/staging/vc04_services/bcm2835-camera/bcm2835-camera.c
|
||||
@@ -356,11 +356,9 @@ static void buffer_cb(struct vchiq_mmal_instance *instance,
|
||||
pr_debug("Grab another frame");
|
||||
vchiq_mmal_port_parameter_set(
|
||||
instance,
|
||||
- dev->capture.
|
||||
- camera_port,
|
||||
+ dev->capture.camera_port,
|
||||
MMAL_PARAMETER_CAPTURE,
|
||||
- &dev->capture.
|
||||
- frame_count,
|
||||
+ &dev->capture.frame_count,
|
||||
sizeof(dev->capture.frame_count));
|
||||
}
|
||||
} else {
|
||||
@@ -419,11 +417,9 @@ static void buffer_cb(struct vchiq_mmal_instance *instance,
|
||||
"Grab another frame as buffer has EOS");
|
||||
vchiq_mmal_port_parameter_set(
|
||||
instance,
|
||||
- dev->capture.
|
||||
- camera_port,
|
||||
+ dev->capture.camera_port,
|
||||
MMAL_PARAMETER_CAPTURE,
|
||||
- &dev->capture.
|
||||
- frame_count,
|
||||
+ &dev->capture.frame_count,
|
||||
sizeof(dev->capture.frame_count));
|
||||
}
|
||||
} else {
|
||||
@@ -1267,8 +1263,8 @@ static int mmal_setup_components(struct bm2835_mmal_dev *dev,
|
||||
port->current_buffer.size =
|
||||
(f->fmt.pix.sizeimage <
|
||||
(100 << 10))
|
||||
- ? (100 << 10) : f->fmt.pix.
|
||||
- sizeimage;
|
||||
+ ? (100 << 10)
|
||||
+ : f->fmt.pix.sizeimage;
|
||||
}
|
||||
v4l2_dbg(1, bcm2835_v4l2_debug,
|
||||
&dev->v4l2_dev,
|
||||
--
|
||||
2.19.1
|
||||
|
|
@ -0,0 +1,33 @@
|
|||
From 00f0e834c44c492555e43fdaf9c112ed269db01f Mon Sep 17 00:00:00 2001
|
||||
From: popcornmix <popcornmix@gmail.com>
|
||||
Date: Wed, 15 Aug 2018 12:25:32 +0100
|
||||
Subject: [PATCH 444/496] Revert "mm: alloc_contig: re-allow CMA to compact FS
|
||||
pages"
|
||||
|
||||
The upstream commit caused poor video playback performance
|
||||
on a busy system for many users.
|
||||
|
||||
See: https://github.com/raspberrypi/linux/issues/2503
|
||||
|
||||
This reverts commit 424f6c4818bbf1b8ccf58aa012ecc19c0bb9b446.
|
||||
|
||||
Signed-off-by: popcornmix <popcornmix@gmail.com>
|
||||
---
|
||||
mm/page_alloc.c | 1 -
|
||||
1 file changed, 1 deletion(-)
|
||||
|
||||
diff --git a/mm/page_alloc.c b/mm/page_alloc.c
|
||||
index 9b31af7654d3..023e12c6e5cb 100644
|
||||
--- a/mm/page_alloc.c
|
||||
+++ b/mm/page_alloc.c
|
||||
@@ -7527,7 +7527,6 @@ int alloc_contig_range(unsigned long start, unsigned long end,
|
||||
.zone = page_zone(pfn_to_page(start)),
|
||||
.mode = MIGRATE_SYNC,
|
||||
.ignore_skip_hint = true,
|
||||
- .gfp_mask = current_gfp_context(gfp_mask),
|
||||
};
|
||||
INIT_LIST_HEAD(&cc.migratepages);
|
||||
|
||||
--
|
||||
2.19.1
|
||||
|
|
@ -0,0 +1,50 @@
|
|||
From 3dc96a250fab4720d0ea6121ac5d52c6c4989fc1 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Bj=C3=B8rn=20Mork?= <bjorn@mork.no>
|
||||
Date: Fri, 25 May 2018 15:00:20 +0200
|
||||
Subject: [PATCH 453/496] qmi_wwan: apply SET_DTR quirk to the SIMCOM shared
|
||||
device ID
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
commit 102cd909635612c0be784a519651954a7924c786 upstream.
|
||||
|
||||
SIMCOM are reusing a single device ID for many (all of their?)
|
||||
different modems, based on different chipsets and firmwares. Newer
|
||||
Qualcomm chipset generations require setting DTR to wake the QMI
|
||||
function. The SIM7600E modem is using such a chipset, making it
|
||||
fail to work with this driver despite the device ID match.
|
||||
|
||||
Fix by unconditionally enabling the SET_DTR quirk for all SIMCOM
|
||||
modems using this specific device ID. This is similar to what
|
||||
we already have done for another case of device IDs recycled over
|
||||
multiple chipset generations: 14cf4a771b30 ("drivers: net: usb:
|
||||
qmi_wwan: add QMI_QUIRK_SET_DTR for Telit PID 0x1201")
|
||||
|
||||
Initial testing on an older SIM7100 modem shows no immediate side
|
||||
effects.
|
||||
|
||||
Reported-by: Sebastian Sjoholm <sebastian.sjoholm@gmail.com>
|
||||
Cc: Reinhard Speyerer <rspmn@arcor.de>
|
||||
Signed-off-by: Bjørn Mork <bjorn@mork.no>
|
||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
---
|
||||
drivers/net/usb/qmi_wwan.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/drivers/net/usb/qmi_wwan.c b/drivers/net/usb/qmi_wwan.c
|
||||
index 6d3811c869fd..ee2760c060eb 100644
|
||||
--- a/drivers/net/usb/qmi_wwan.c
|
||||
+++ b/drivers/net/usb/qmi_wwan.c
|
||||
@@ -1249,7 +1249,7 @@ static const struct usb_device_id products[] = {
|
||||
{QMI_FIXED_INTF(0x03f0, 0x4e1d, 8)}, /* HP lt4111 LTE/EV-DO/HSPA+ Gobi 4G Module */
|
||||
{QMI_FIXED_INTF(0x03f0, 0x9d1d, 1)}, /* HP lt4120 Snapdragon X5 LTE */
|
||||
{QMI_FIXED_INTF(0x22de, 0x9061, 3)}, /* WeTelecom WPD-600N */
|
||||
- {QMI_FIXED_INTF(0x1e0e, 0x9001, 5)}, /* SIMCom 7230E */
|
||||
+ {QMI_QUIRK_SET_DTR(0x1e0e, 0x9001, 5)}, /* SIMCom 7100E, 7230E, 7600E ++ */
|
||||
{QMI_QUIRK_SET_DTR(0x2c7c, 0x0125, 4)}, /* Quectel EC25, EC20 R2.0 Mini PCIe */
|
||||
{QMI_QUIRK_SET_DTR(0x2c7c, 0x0121, 4)}, /* Quectel EC21 Mini PCIe */
|
||||
{QMI_QUIRK_SET_DTR(0x2c7c, 0x0191, 4)}, /* Quectel EG91 */
|
||||
--
|
||||
2.19.1
|
||||
|
|
@ -0,0 +1,26 @@
|
|||
From 91c64870bb6f940011e723f4a7d499f7d40a2923 Mon Sep 17 00:00:00 2001
|
||||
From: popcornmix <popcornmix@gmail.com>
|
||||
Date: Fri, 14 Sep 2018 20:13:29 +0100
|
||||
Subject: [PATCH 454/496] Revert "Revert "mm: alloc_contig: re-allow CMA to
|
||||
compact FS pages""
|
||||
|
||||
This reverts commit 00f0e834c44c492555e43fdaf9c112ed269db01f.
|
||||
---
|
||||
mm/page_alloc.c | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
diff --git a/mm/page_alloc.c b/mm/page_alloc.c
|
||||
index 023e12c6e5cb..9b31af7654d3 100644
|
||||
--- a/mm/page_alloc.c
|
||||
+++ b/mm/page_alloc.c
|
||||
@@ -7527,6 +7527,7 @@ int alloc_contig_range(unsigned long start, unsigned long end,
|
||||
.zone = page_zone(pfn_to_page(start)),
|
||||
.mode = MIGRATE_SYNC,
|
||||
.ignore_skip_hint = true,
|
||||
+ .gfp_mask = current_gfp_context(gfp_mask),
|
||||
};
|
||||
INIT_LIST_HEAD(&cc.migratepages);
|
||||
|
||||
--
|
||||
2.19.1
|
||||
|
|
@ -0,0 +1,57 @@
|
|||
From f92b55d534dcf9e740352b9c6c98f01f38aaa5e8 Mon Sep 17 00:00:00 2001
|
||||
From: Hermes Zhang <chenhuiz@axis.com>
|
||||
Date: Tue, 28 Aug 2018 09:48:30 +0800
|
||||
Subject: [PATCH 458/496] Bluetooth: hci_ldisc: Free rw_semaphore on close
|
||||
|
||||
commit e6a57d22f787e73635ce0d29eef0abb77928b3e9 upstream.
|
||||
|
||||
The percpu_rw_semaphore is not currently freed, and this leads to
|
||||
a crash when the stale rcu callback is invoked. DEBUG_OBJECTS
|
||||
detects this.
|
||||
|
||||
ODEBUG: free active (active state 1) object type: rcu_head hint: (null)
|
||||
------------[ cut here ]------------
|
||||
WARNING: CPU: 1 PID: 2024 at debug_print_object+0xac/0xc8
|
||||
PC is at debug_print_object+0xac/0xc8
|
||||
LR is at debug_print_object+0xac/0xc8
|
||||
Call trace:
|
||||
[<ffffff80082e2c2c>] debug_print_object+0xac/0xc8
|
||||
[<ffffff80082e40b0>] debug_check_no_obj_freed+0x1e8/0x228
|
||||
[<ffffff8008191254>] kfree+0x1cc/0x250
|
||||
[<ffffff80083cc03c>] hci_uart_tty_close+0x54/0x108
|
||||
[<ffffff800832e118>] tty_ldisc_close.isra.1+0x40/0x58
|
||||
[<ffffff800832e14c>] tty_ldisc_kill+0x1c/0x40
|
||||
[<ffffff800832e3dc>] tty_ldisc_release+0x94/0x170
|
||||
[<ffffff8008325554>] tty_release_struct+0x1c/0x58
|
||||
[<ffffff8008326400>] tty_release+0x3b0/0x490
|
||||
[<ffffff80081a3fe8>] __fput+0x88/0x1d0
|
||||
[<ffffff80081a418c>] ____fput+0xc/0x18
|
||||
[<ffffff80080c0624>] task_work_run+0x9c/0xc0
|
||||
[<ffffff80080a9e24>] do_exit+0x24c/0x8a0
|
||||
[<ffffff80080aa4e0>] do_group_exit+0x38/0xa0
|
||||
[<ffffff80080aa558>] __wake_up_parent+0x0/0x28
|
||||
[<ffffff8008082c00>] el0_svc_naked+0x34/0x38
|
||||
---[ end trace bfe08cbd89098cdf ]---
|
||||
|
||||
Signed-off-by: Hermes Zhang <chenhuiz@axis.com>
|
||||
Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
|
||||
---
|
||||
drivers/bluetooth/hci_ldisc.c | 2 ++
|
||||
1 file changed, 2 insertions(+)
|
||||
|
||||
diff --git a/drivers/bluetooth/hci_ldisc.c b/drivers/bluetooth/hci_ldisc.c
|
||||
index c823914b3a80..30bbe19b4b85 100644
|
||||
--- a/drivers/bluetooth/hci_ldisc.c
|
||||
+++ b/drivers/bluetooth/hci_ldisc.c
|
||||
@@ -539,6 +539,8 @@ static void hci_uart_tty_close(struct tty_struct *tty)
|
||||
}
|
||||
clear_bit(HCI_UART_PROTO_SET, &hu->flags);
|
||||
|
||||
+ percpu_free_rwsem(&hu->proto_lock);
|
||||
+
|
||||
kfree(hu);
|
||||
}
|
||||
|
||||
--
|
||||
2.19.1
|
||||
|
|
@ -0,0 +1,70 @@
|
|||
From 3b53ff15e81fa1ee7ae43a7e8a68e05768d4f9f9 Mon Sep 17 00:00:00 2001
|
||||
From: P33M <p33m@github.com>
|
||||
Date: Fri, 21 Sep 2018 14:05:09 +0100
|
||||
Subject: [PATCH 461/496] dwc_otg: fiq_fsm: fix incorrect DMA register offset
|
||||
calculation
|
||||
|
||||
Rationalise the offset and update all call sites.
|
||||
|
||||
Fixes https://github.com/raspberrypi/linux/issues/2408
|
||||
---
|
||||
drivers/usb/host/dwc_otg/dwc_otg_fiq_fsm.c | 8 ++++----
|
||||
drivers/usb/host/dwc_otg/dwc_otg_fiq_fsm.h | 2 +-
|
||||
2 files changed, 5 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/drivers/usb/host/dwc_otg/dwc_otg_fiq_fsm.c b/drivers/usb/host/dwc_otg/dwc_otg_fiq_fsm.c
|
||||
index ca362db1602a..c44650f80adc 100644
|
||||
--- a/drivers/usb/host/dwc_otg/dwc_otg_fiq_fsm.c
|
||||
+++ b/drivers/usb/host/dwc_otg/dwc_otg_fiq_fsm.c
|
||||
@@ -250,7 +250,7 @@ static int notrace fiq_increment_dma_buf(struct fiq_state *st, int num_channels,
|
||||
BUG();
|
||||
|
||||
hcdma.d32 = (dma_addr_t) &blob->channel[n].index[i].buf[0];
|
||||
- FIQ_WRITE(st->dwc_regs_base + HC_DMA + (HC_OFFSET * n), hcdma.d32);
|
||||
+ FIQ_WRITE(st->dwc_regs_base + HC_START + (HC_OFFSET * n) + HC_DMA, hcdma.d32);
|
||||
st->channel[n].dma_info.index = i;
|
||||
return 0;
|
||||
}
|
||||
@@ -302,7 +302,7 @@ static int notrace fiq_iso_out_advance(struct fiq_state *st, int num_channels, i
|
||||
|
||||
/* New DMA address - address of bounce buffer referred to in index */
|
||||
hcdma.d32 = (uint32_t) &blob->channel[n].index[i].buf[0];
|
||||
- //hcdma.d32 = FIQ_READ(st->dwc_regs_base + HC_DMA + (HC_OFFSET * n));
|
||||
+ //hcdma.d32 = FIQ_READ(st->dwc_regs_base + HC_START + (HC_OFFSET * n) + HC_DMA);
|
||||
//hcdma.d32 += st->channel[n].dma_info.slot_len[i];
|
||||
fiq_print(FIQDBG_INT, st, "LAST: %01d ", last);
|
||||
fiq_print(FIQDBG_INT, st, "LEN: %03d", st->channel[n].dma_info.slot_len[i]);
|
||||
@@ -317,7 +317,7 @@ static int notrace fiq_iso_out_advance(struct fiq_state *st, int num_channels, i
|
||||
st->channel[n].dma_info.index++;
|
||||
FIQ_WRITE(st->dwc_regs_base + HC_START + (HC_OFFSET * n) + HCSPLT, hcsplt.d32);
|
||||
FIQ_WRITE(st->dwc_regs_base + HC_START + (HC_OFFSET * n) + HCTSIZ, hctsiz.d32);
|
||||
- FIQ_WRITE(st->dwc_regs_base + HC_DMA + (HC_OFFSET * n), hcdma.d32);
|
||||
+ FIQ_WRITE(st->dwc_regs_base + HC_START + (HC_OFFSET * n) + HC_DMA, hcdma.d32);
|
||||
return last;
|
||||
}
|
||||
|
||||
@@ -564,7 +564,7 @@ static int notrace noinline fiq_fsm_update_hs_isoc(struct fiq_state *state, int
|
||||
|
||||
/* grab the next DMA address offset from the array */
|
||||
hcdma.d32 = st->hcdma_copy.d32 + st->hs_isoc_info.iso_desc[st->hs_isoc_info.index].offset;
|
||||
- FIQ_WRITE(state->dwc_regs_base + HC_DMA + (HC_OFFSET * n), hcdma.d32);
|
||||
+ FIQ_WRITE(state->dwc_regs_base + HC_START + (HC_OFFSET * n) + HC_DMA, hcdma.d32);
|
||||
|
||||
/* We need to set multi_count. This is a bit tricky - has to be set per-transaction as
|
||||
* the core needs to be told to send the correct number. Caution: for IN transfers,
|
||||
diff --git a/drivers/usb/host/dwc_otg/dwc_otg_fiq_fsm.h b/drivers/usb/host/dwc_otg/dwc_otg_fiq_fsm.h
|
||||
index ed088f34f210..06288ec08763 100644
|
||||
--- a/drivers/usb/host/dwc_otg/dwc_otg_fiq_fsm.h
|
||||
+++ b/drivers/usb/host/dwc_otg/dwc_otg_fiq_fsm.h
|
||||
@@ -94,7 +94,7 @@ do { \
|
||||
#define HC_START 0x500
|
||||
#define HC_OFFSET 0x020
|
||||
|
||||
-#define HC_DMA 0x514
|
||||
+#define HC_DMA 0x14
|
||||
|
||||
#define HCCHAR 0x00
|
||||
#define HCSPLT 0x04
|
||||
--
|
||||
2.19.1
|
||||
|
|
@ -0,0 +1,131 @@
|
|||
From e24b1f6c0c798508981c7c5f59a5d76ce6fe58e1 Mon Sep 17 00:00:00 2001
|
||||
From: detule <ogjoneski@gmail.com>
|
||||
Date: Tue, 2 Oct 2018 04:10:08 -0400
|
||||
Subject: [PATCH 467/496] vchiq_2835_arm: Implement a DMA pool for small bulk
|
||||
transfers (#2699)
|
||||
|
||||
During a bulk transfer we request a DMA allocation to hold the
|
||||
scatter-gather list. Most of the time, this allocation is small
|
||||
(<< PAGE_SIZE), however it can be requested at a high enough frequency
|
||||
to cause fragmentation and/or stress the CMA allocator (think time
|
||||
spent in compaction here, or during allocations elsewhere).
|
||||
|
||||
Implement a pool to serve up small DMA allocations, falling back
|
||||
to a coherent allocation if the request is greater than
|
||||
VCHIQ_DMA_POOL_SIZE.
|
||||
|
||||
Signed-off-by: Oliver Gjoneski <ogjoneski@gmail.com>
|
||||
---
|
||||
.../interface/vchiq_arm/vchiq_2835_arm.c | 40 +++++++++++++++----
|
||||
1 file changed, 33 insertions(+), 7 deletions(-)
|
||||
|
||||
diff --git a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_2835_arm.c b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_2835_arm.c
|
||||
index be08849175ea..59e21d2277de 100644
|
||||
--- a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_2835_arm.c
|
||||
+++ b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_2835_arm.c
|
||||
@@ -37,6 +37,7 @@
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/pagemap.h>
|
||||
#include <linux/dma-mapping.h>
|
||||
+#include <linux/dmapool.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/uaccess.h>
|
||||
@@ -59,6 +60,8 @@
|
||||
#define BELL0 0x00
|
||||
#define BELL2 0x08
|
||||
|
||||
+#define VCHIQ_DMA_POOL_SIZE PAGE_SIZE
|
||||
+
|
||||
typedef struct vchiq_2835_state_struct {
|
||||
int inited;
|
||||
VCHIQ_ARM_STATE_T arm_state;
|
||||
@@ -68,6 +71,7 @@ struct vchiq_pagelist_info {
|
||||
PAGELIST_T *pagelist;
|
||||
size_t pagelist_buffer_size;
|
||||
dma_addr_t dma_addr;
|
||||
+ bool is_from_pool;
|
||||
enum dma_data_direction dma_dir;
|
||||
unsigned int num_pages;
|
||||
unsigned int pages_need_release;
|
||||
@@ -78,6 +82,7 @@ struct vchiq_pagelist_info {
|
||||
|
||||
static void __iomem *g_regs;
|
||||
static unsigned int g_cache_line_size = sizeof(CACHE_LINE_SIZE);
|
||||
+static struct dma_pool *g_dma_pool;
|
||||
static unsigned int g_fragments_size;
|
||||
static char *g_fragments_base;
|
||||
static char *g_free_fragments;
|
||||
@@ -193,6 +198,14 @@ int vchiq_platform_init(struct platform_device *pdev, VCHIQ_STATE_T *state)
|
||||
}
|
||||
|
||||
g_dev = dev;
|
||||
+ g_dma_pool = dmam_pool_create("vchiq_scatter_pool", dev,
|
||||
+ VCHIQ_DMA_POOL_SIZE, g_cache_line_size,
|
||||
+ 0);
|
||||
+ if (!g_dma_pool) {
|
||||
+ dev_err(dev, "failed to create dma pool");
|
||||
+ return -ENOMEM;
|
||||
+ }
|
||||
+
|
||||
vchiq_log_info(vchiq_arm_log_level,
|
||||
"vchiq_init - done (slots %pK, phys %pad)",
|
||||
vchiq_slot_zero, &slot_phys);
|
||||
@@ -377,9 +390,14 @@ cleanup_pagelistinfo(struct vchiq_pagelist_info *pagelistinfo)
|
||||
for (i = 0; i < pagelistinfo->num_pages; i++)
|
||||
put_page(pagelistinfo->pages[i]);
|
||||
}
|
||||
-
|
||||
- dma_free_coherent(g_dev, pagelistinfo->pagelist_buffer_size,
|
||||
- pagelistinfo->pagelist, pagelistinfo->dma_addr);
|
||||
+ if (pagelistinfo->is_from_pool) {
|
||||
+ dma_pool_free(g_dma_pool, pagelistinfo->pagelist,
|
||||
+ pagelistinfo->dma_addr);
|
||||
+ } else {
|
||||
+ dma_free_coherent(g_dev, pagelistinfo->pagelist_buffer_size,
|
||||
+ pagelistinfo->pagelist,
|
||||
+ pagelistinfo->dma_addr);
|
||||
+ }
|
||||
}
|
||||
|
||||
/* There is a potential problem with partial cache lines (pages?)
|
||||
@@ -400,6 +418,7 @@ create_pagelist(char __user *buf, size_t count, unsigned short type,
|
||||
u32 *addrs;
|
||||
unsigned int num_pages, offset, i, k;
|
||||
int actual_pages;
|
||||
+ bool is_from_pool;
|
||||
size_t pagelist_size;
|
||||
struct scatterlist *scatterlist, *sg;
|
||||
int dma_buffers;
|
||||
@@ -417,10 +436,16 @@ create_pagelist(char __user *buf, size_t count, unsigned short type,
|
||||
/* Allocate enough storage to hold the page pointers and the page
|
||||
** list
|
||||
*/
|
||||
- pagelist = dma_zalloc_coherent(g_dev,
|
||||
- pagelist_size,
|
||||
- &dma_addr,
|
||||
- GFP_KERNEL);
|
||||
+ if (pagelist_size > VCHIQ_DMA_POOL_SIZE) {
|
||||
+ pagelist = dma_zalloc_coherent(g_dev,
|
||||
+ pagelist_size,
|
||||
+ &dma_addr,
|
||||
+ GFP_KERNEL);
|
||||
+ is_from_pool = false;
|
||||
+ } else {
|
||||
+ pagelist = dma_pool_zalloc(g_dma_pool, GFP_KERNEL, &dma_addr);
|
||||
+ is_from_pool = true;
|
||||
+ }
|
||||
|
||||
vchiq_log_trace(vchiq_arm_log_level, "create_pagelist - %pK",
|
||||
pagelist);
|
||||
@@ -441,6 +466,7 @@ create_pagelist(char __user *buf, size_t count, unsigned short type,
|
||||
pagelistinfo->pagelist = pagelist;
|
||||
pagelistinfo->pagelist_buffer_size = pagelist_size;
|
||||
pagelistinfo->dma_addr = dma_addr;
|
||||
+ pagelistinfo->is_from_pool = is_from_pool;
|
||||
pagelistinfo->dma_dir = (type == PAGELIST_WRITE) ?
|
||||
DMA_TO_DEVICE : DMA_FROM_DEVICE;
|
||||
pagelistinfo->num_pages = num_pages;
|
||||
--
|
||||
2.19.1
|
||||
|
|
@ -0,0 +1,101 @@
|
|||
From 3e4671e3c51a0ba0e107c0b6d118148dd0ed12da Mon Sep 17 00:00:00 2001
|
||||
From: Ram Chandrasekar <rkumbako@codeaurora.org>
|
||||
Date: Mon, 7 May 2018 11:54:08 -0600
|
||||
Subject: [PATCH 469/496] drivers: thermal: step_wise: add support for
|
||||
hysteresis
|
||||
|
||||
From: Ram Chandrasekar <rkumbako@codeaurora.org>
|
||||
|
||||
Step wise governor increases the mitigation level when the temperature
|
||||
goes above a threshold and will decrease the mitigation when the
|
||||
temperature falls below the threshold. If it were a case, where the
|
||||
temperature hovers around a threshold, the mitigation will be applied
|
||||
and removed at every iteration. This reaction to the temperature is
|
||||
inefficient for performance.
|
||||
|
||||
The use of hysteresis temperature could avoid this ping-pong of
|
||||
mitigation by relaxing the mitigation to happen only when the
|
||||
temperature goes below this lower hysteresis value.
|
||||
|
||||
Signed-off-by: Ram Chandrasekar <rkumbako@codeaurora.org>
|
||||
Signed-off-by: Lina Iyer <ilina@codeaurora.org>
|
||||
---
|
||||
drivers/thermal/step_wise.c | 33 +++++++++++++++++++++++----------
|
||||
1 file changed, 23 insertions(+), 10 deletions(-)
|
||||
|
||||
diff --git a/drivers/thermal/step_wise.c b/drivers/thermal/step_wise.c
|
||||
index ee047ca43084..cf07e2269291 100644
|
||||
--- a/drivers/thermal/step_wise.c
|
||||
+++ b/drivers/thermal/step_wise.c
|
||||
@@ -36,7 +36,7 @@
|
||||
* for this trip point
|
||||
* d. if the trend is THERMAL_TREND_DROP_FULL, use lower limit
|
||||
* for this trip point
|
||||
- * If the temperature is lower than a trip point,
|
||||
+ * If the temperature is lower than a hysteresis temperature,
|
||||
* a. if the trend is THERMAL_TREND_RAISING, do nothing
|
||||
* b. if the trend is THERMAL_TREND_DROPPING, use lower cooling
|
||||
* state for this trip point, if the cooling state already
|
||||
@@ -127,7 +127,7 @@ static void update_passive_instance(struct thermal_zone_device *tz,
|
||||
|
||||
static void thermal_zone_trip_update(struct thermal_zone_device *tz, int trip)
|
||||
{
|
||||
- int trip_temp;
|
||||
+ int trip_temp, hyst_temp;
|
||||
enum thermal_trip_type trip_type;
|
||||
enum thermal_trend trend;
|
||||
struct thermal_instance *instance;
|
||||
@@ -135,22 +135,23 @@ static void thermal_zone_trip_update(struct thermal_zone_device *tz, int trip)
|
||||
int old_target;
|
||||
|
||||
if (trip == THERMAL_TRIPS_NONE) {
|
||||
- trip_temp = tz->forced_passive;
|
||||
+ hyst_temp = trip_temp = tz->forced_passive;
|
||||
trip_type = THERMAL_TRIPS_NONE;
|
||||
} else {
|
||||
tz->ops->get_trip_temp(tz, trip, &trip_temp);
|
||||
+ hyst_temp = trip_temp;
|
||||
+ if (tz->ops->get_trip_hyst) {
|
||||
+ tz->ops->get_trip_hyst(tz, trip, &hyst_temp);
|
||||
+ hyst_temp = trip_temp - hyst_temp;
|
||||
+ }
|
||||
tz->ops->get_trip_type(tz, trip, &trip_type);
|
||||
}
|
||||
|
||||
trend = get_tz_trend(tz, trip);
|
||||
|
||||
- if (tz->temperature >= trip_temp) {
|
||||
- throttle = true;
|
||||
- trace_thermal_zone_trip(tz, trip, trip_type);
|
||||
- }
|
||||
-
|
||||
- dev_dbg(&tz->device, "Trip%d[type=%d,temp=%d]:trend=%d,throttle=%d\n",
|
||||
- trip, trip_type, trip_temp, trend, throttle);
|
||||
+ dev_dbg(&tz->device,
|
||||
+ "Trip%d[type=%d,temp=%d,hyst=%d]:trend=%d,throttle=%d\n",
|
||||
+ trip, trip_type, trip_temp, hyst_temp, trend, throttle);
|
||||
|
||||
mutex_lock(&tz->lock);
|
||||
|
||||
@@ -159,6 +160,18 @@ static void thermal_zone_trip_update(struct thermal_zone_device *tz, int trip)
|
||||
continue;
|
||||
|
||||
old_target = instance->target;
|
||||
+ throttle = false;
|
||||
+ /*
|
||||
+ * Lower the mitigation only if the temperature
|
||||
+ * goes below the hysteresis temperature.
|
||||
+ */
|
||||
+ if (tz->temperature >= trip_temp ||
|
||||
+ (tz->temperature >= hyst_temp &&
|
||||
+ old_target != THERMAL_NO_TARGET)) {
|
||||
+ throttle = true;
|
||||
+ trace_thermal_zone_trip(tz, trip, trip_type);
|
||||
+ }
|
||||
+
|
||||
instance->target = get_target_state(instance, trend, throttle);
|
||||
dev_dbg(&instance->cdev->device, "old_target=%d, target=%d\n",
|
||||
old_target, (int)instance->target);
|
||||
--
|
||||
2.19.1
|
||||
|
|
@ -0,0 +1,27 @@
|
|||
From d30f9834bfc33d6886bab67a3caad9e0e3edae77 Mon Sep 17 00:00:00 2001
|
||||
From: Serge Schneider <serge@raspberrypi.org>
|
||||
Date: Tue, 2 Oct 2018 11:14:15 +0100
|
||||
Subject: [PATCH 470/496] drivers: thermal: step_wise: avoid throttling at
|
||||
hysteresis temperature after dropping below it
|
||||
|
||||
Signed-off-by: Serge Schneider <serge@raspberrypi.org>
|
||||
---
|
||||
drivers/thermal/step_wise.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/drivers/thermal/step_wise.c b/drivers/thermal/step_wise.c
|
||||
index cf07e2269291..da695d8f2939 100644
|
||||
--- a/drivers/thermal/step_wise.c
|
||||
+++ b/drivers/thermal/step_wise.c
|
||||
@@ -167,7 +167,7 @@ static void thermal_zone_trip_update(struct thermal_zone_device *tz, int trip)
|
||||
*/
|
||||
if (tz->temperature >= trip_temp ||
|
||||
(tz->temperature >= hyst_temp &&
|
||||
- old_target != THERMAL_NO_TARGET)) {
|
||||
+ old_target == instance->upper)) {
|
||||
throttle = true;
|
||||
trace_thermal_zone_trip(tz, trip, trip_type);
|
||||
}
|
||||
--
|
||||
2.19.1
|
||||
|
|
@ -0,0 +1,70 @@
|
|||
From 6d27aa156c26977dfd079a7107e31670127d17d3 Mon Sep 17 00:00:00 2001
|
||||
From: Phil Elwell <phil@raspberrypi.org>
|
||||
Date: Wed, 18 Jul 2018 17:25:00 +0100
|
||||
Subject: [PATCH 473/496] overlays: Add gpio-no-bank0-irq overlay
|
||||
|
||||
See: https://github.com/raspberrypi/linux/issues/2590
|
||||
|
||||
Signed-off-by: Phil Elwell <phil@raspberrypi.org>
|
||||
---
|
||||
arch/arm/boot/dts/overlays/Makefile | 1 +
|
||||
arch/arm/boot/dts/overlays/README | 9 +++++++++
|
||||
.../dts/overlays/gpio-no-bank0-irq-overlay.dts | 14 ++++++++++++++
|
||||
3 files changed, 24 insertions(+)
|
||||
create mode 100755 arch/arm/boot/dts/overlays/gpio-no-bank0-irq-overlay.dts
|
||||
|
||||
diff --git a/arch/arm/boot/dts/overlays/Makefile b/arch/arm/boot/dts/overlays/Makefile
|
||||
index 7cdd0195e7eb..abe86d184488 100644
|
||||
--- a/arch/arm/boot/dts/overlays/Makefile
|
||||
+++ b/arch/arm/boot/dts/overlays/Makefile
|
||||
@@ -39,6 +39,7 @@ dtbo-$(CONFIG_ARCH_BCM2835) += \
|
||||
gpio-ir.dtbo \
|
||||
gpio-ir-tx.dtbo \
|
||||
gpio-key.dtbo \
|
||||
+ gpio-no-bank0-irq.dtbo \
|
||||
gpio-no-irq.dtbo \
|
||||
gpio-poweroff.dtbo \
|
||||
gpio-shutdown.dtbo \
|
||||
diff --git a/arch/arm/boot/dts/overlays/README b/arch/arm/boot/dts/overlays/README
|
||||
index 2c2b5ab76835..41e5028269e7 100644
|
||||
--- a/arch/arm/boot/dts/overlays/README
|
||||
+++ b/arch/arm/boot/dts/overlays/README
|
||||
@@ -619,6 +619,15 @@ Params: gpio GPIO pin to trigger on (default 3)
|
||||
keycode Set the key code for the button
|
||||
|
||||
|
||||
+Name: gpio-no-bank0-irq
|
||||
+Info: Use this overlay to disable GPIO interrupts for GPIOs in bank 0 (0-27),
|
||||
+ which can be useful for UIO drivers.
|
||||
+ N.B. Using this overlay will trigger a kernel WARN during booting, but
|
||||
+ this can safely be ignored - the system should work as expected.
|
||||
+Load: dtoverlay=gpio-no-bank0-irq
|
||||
+Params: <None>
|
||||
+
|
||||
+
|
||||
Name: gpio-no-irq
|
||||
Info: Use this overlay to disable all GPIO interrupts, which can be useful
|
||||
for user-space GPIO edge detection systems.
|
||||
diff --git a/arch/arm/boot/dts/overlays/gpio-no-bank0-irq-overlay.dts b/arch/arm/boot/dts/overlays/gpio-no-bank0-irq-overlay.dts
|
||||
new file mode 100755
|
||||
index 000000000000..96cbe80820b7
|
||||
--- /dev/null
|
||||
+++ b/arch/arm/boot/dts/overlays/gpio-no-bank0-irq-overlay.dts
|
||||
@@ -0,0 +1,14 @@
|
||||
+/dts-v1/;
|
||||
+/plugin/;
|
||||
+
|
||||
+/ {
|
||||
+ compatible = "brcm,bcm2835";
|
||||
+
|
||||
+ fragment@0 {
|
||||
+ // Configure the gpio pin controller
|
||||
+ target = <&gpio>;
|
||||
+ __overlay__ {
|
||||
+ interrupts = <255 255>, <2 18>;
|
||||
+ };
|
||||
+ };
|
||||
+};
|
||||
--
|
||||
2.19.1
|
||||
|
|
@ -0,0 +1,55 @@
|
|||
From eb5381fdbcdecacdc30636e1633e146da2f5fcb9 Mon Sep 17 00:00:00 2001
|
||||
From: Phil Elwell <phil@raspberrypi.org>
|
||||
Date: Fri, 26 Oct 2018 17:29:51 +0100
|
||||
Subject: [PATCH 477/496] mmc/bcm2835-sdhost: Recover from MMC_SEND_EXT_CSD
|
||||
|
||||
If the user issues an "mmc extcsd read", the SD controller receives
|
||||
what it thinks is a SEND_IF_COND command with an unexpected data block.
|
||||
The resulting operations leave the FSM stuck in READWAIT, a state which
|
||||
persists until the MMC framework resets the controller, by which point
|
||||
the root filesystem is likely to have been unmounted.
|
||||
|
||||
A less heavyweight solution is to detect the condition and nudge the
|
||||
FSM by asserting the (self-clearing) FORCE_DATA_MODE bit.
|
||||
|
||||
N.B. This workaround was essentially discovered by accident and without
|
||||
a full understanding the inner workings of the controller, so it is
|
||||
fortunate that the "fix" only modifies error paths.
|
||||
|
||||
See: https://github.com/raspberrypi/linux/issues/2728
|
||||
|
||||
Signed-off-by: Phil Elwell <phil@raspberrypi.org>
|
||||
---
|
||||
drivers/mmc/host/bcm2835-sdhost.c | 9 +++++++++
|
||||
1 file changed, 9 insertions(+)
|
||||
|
||||
diff --git a/drivers/mmc/host/bcm2835-sdhost.c b/drivers/mmc/host/bcm2835-sdhost.c
|
||||
index 273b1be058c5..c8a673e81ab7 100644
|
||||
--- a/drivers/mmc/host/bcm2835-sdhost.c
|
||||
+++ b/drivers/mmc/host/bcm2835-sdhost.c
|
||||
@@ -1244,6 +1244,8 @@ static void bcm2835_sdhost_finish_command(struct bcm2835_host *host,
|
||||
pr_info("%s: ignoring CRC7 error for CMD1\n",
|
||||
mmc_hostname(host->mmc));
|
||||
} else {
|
||||
+ u32 edm, fsm;
|
||||
+
|
||||
if (sdhsts & SDHSTS_CMD_TIME_OUT) {
|
||||
if (host->debug)
|
||||
pr_warn("%s: command %d timeout\n",
|
||||
@@ -1256,6 +1258,13 @@ static void bcm2835_sdhost_finish_command(struct bcm2835_host *host,
|
||||
host->cmd->opcode);
|
||||
host->cmd->error = -EILSEQ;
|
||||
}
|
||||
+
|
||||
+ edm = readl(host->ioaddr + SDEDM);
|
||||
+ fsm = edm & SDEDM_FSM_MASK;
|
||||
+ if (fsm == SDEDM_FSM_READWAIT ||
|
||||
+ fsm == SDEDM_FSM_WRITESTART1)
|
||||
+ writel(edm | SDEDM_FORCE_DATA_MODE,
|
||||
+ host->ioaddr + SDEDM);
|
||||
tasklet_schedule(&host->finish_tasklet);
|
||||
return;
|
||||
}
|
||||
--
|
||||
2.19.1
|
||||
|
|
@ -0,0 +1,55 @@
|
|||
From 37646b2e2fb9ca34203a5478c2b813e4cd323115 Mon Sep 17 00:00:00 2001
|
||||
From: Phil Elwell <phil@raspberrypi.org>
|
||||
Date: Fri, 26 Oct 2018 17:40:44 +0100
|
||||
Subject: [PATCH 478/496] mmc/bcm2835: Recover from MMC_SEND_EXT_CSD
|
||||
|
||||
If the user issues an "mmc extcsd read", the SD controller receives
|
||||
what it thinks is a SEND_IF_COND command with an unexpected data block.
|
||||
The resulting operations leave the FSM stuck in READWAIT, a state which
|
||||
persists until the MMC framework resets the controller, by which point
|
||||
the root filesystem is likely to have been unmounted.
|
||||
|
||||
A less heavyweight solution is to detect the condition and nudge the
|
||||
FSM by asserting the (self-clearing) FORCE_DATA_MODE bit.
|
||||
|
||||
N.B. This workaround was essentially discovered by accident and without
|
||||
a full understanding the inner workings of the controller, so it is
|
||||
fortunate that the "fix" only modifies error paths.
|
||||
|
||||
See: https://github.com/raspberrypi/linux/issues/2728
|
||||
|
||||
Signed-off-by: Phil Elwell <phil@raspberrypi.org>
|
||||
---
|
||||
drivers/mmc/host/bcm2835.c | 9 +++++++++
|
||||
1 file changed, 9 insertions(+)
|
||||
|
||||
diff --git a/drivers/mmc/host/bcm2835.c b/drivers/mmc/host/bcm2835.c
|
||||
index 768972af8b85..aef40e1739ee 100644
|
||||
--- a/drivers/mmc/host/bcm2835.c
|
||||
+++ b/drivers/mmc/host/bcm2835.c
|
||||
@@ -772,6 +772,8 @@ static void bcm2835_finish_command(struct bcm2835_host *host)
|
||||
|
||||
if (!(sdhsts & SDHSTS_CRC7_ERROR) ||
|
||||
(host->cmd->opcode != MMC_SEND_OP_COND)) {
|
||||
+ u32 edm, fsm;
|
||||
+
|
||||
if (sdhsts & SDHSTS_CMD_TIME_OUT) {
|
||||
host->cmd->error = -ETIMEDOUT;
|
||||
} else {
|
||||
@@ -780,6 +782,13 @@ static void bcm2835_finish_command(struct bcm2835_host *host)
|
||||
bcm2835_dumpregs(host);
|
||||
host->cmd->error = -EILSEQ;
|
||||
}
|
||||
+ edm = readl(host->ioaddr + SDEDM);
|
||||
+ fsm = edm & SDEDM_FSM_MASK;
|
||||
+ if (fsm == SDEDM_FSM_READWAIT ||
|
||||
+ fsm == SDEDM_FSM_WRITESTART1)
|
||||
+ /* Kick the FSM out of its wait */
|
||||
+ writel(edm | SDEDM_FORCE_DATA_MODE,
|
||||
+ host->ioaddr + SDEDM);
|
||||
bcm2835_finish_request(host);
|
||||
return;
|
||||
}
|
||||
--
|
||||
2.19.1
|
||||
|
|
@ -0,0 +1,61 @@
|
|||
From 8ec2a2d27dd3e3e32113445592f44ea974b21732 Mon Sep 17 00:00:00 2001
|
||||
From: Phil Elwell <phil@raspberrypi.org>
|
||||
Date: Mon, 29 Oct 2018 14:45:45 +0000
|
||||
Subject: [PATCH 480/496] Revert "rtc: pcf8523: properly handle oscillator stop
|
||||
bit"
|
||||
|
||||
This reverts commit ede44c908d44b166a5b6bd7caacd105c2ff5a70f.
|
||||
|
||||
See: https://github.com/raspberrypi/firmware/issues/1065
|
||||
|
||||
Signed-off-by: Phil Elwell <phil@raspberrypi.org>
|
||||
---
|
||||
drivers/rtc/rtc-pcf8523.c | 25 ++++++++++++++++++++++---
|
||||
1 file changed, 22 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/drivers/rtc/rtc-pcf8523.c b/drivers/rtc/rtc-pcf8523.c
|
||||
index 28c48b3c1946..988566caaaa6 100644
|
||||
--- a/drivers/rtc/rtc-pcf8523.c
|
||||
+++ b/drivers/rtc/rtc-pcf8523.c
|
||||
@@ -178,8 +178,28 @@ static int pcf8523_rtc_read_time(struct device *dev, struct rtc_time *tm)
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
||||
- if (regs[0] & REG_SECONDS_OS)
|
||||
- return -EINVAL;
|
||||
+ if (regs[0] & REG_SECONDS_OS) {
|
||||
+ /*
|
||||
+ * If the oscillator was stopped, try to clear the flag. Upon
|
||||
+ * power-up the flag is always set, but if we cannot clear it
|
||||
+ * the oscillator isn't running properly for some reason. The
|
||||
+ * sensible thing therefore is to return an error, signalling
|
||||
+ * that the clock cannot be assumed to be correct.
|
||||
+ */
|
||||
+
|
||||
+ regs[0] &= ~REG_SECONDS_OS;
|
||||
+
|
||||
+ err = pcf8523_write(client, REG_SECONDS, regs[0]);
|
||||
+ if (err < 0)
|
||||
+ return err;
|
||||
+
|
||||
+ err = pcf8523_read(client, REG_SECONDS, ®s[0]);
|
||||
+ if (err < 0)
|
||||
+ return err;
|
||||
+
|
||||
+ if (regs[0] & REG_SECONDS_OS)
|
||||
+ return -EAGAIN;
|
||||
+ }
|
||||
|
||||
tm->tm_sec = bcd2bin(regs[0] & 0x7f);
|
||||
tm->tm_min = bcd2bin(regs[1] & 0x7f);
|
||||
@@ -215,7 +235,6 @@ static int pcf8523_rtc_set_time(struct device *dev, struct rtc_time *tm)
|
||||
return err;
|
||||
|
||||
regs[0] = REG_SECONDS;
|
||||
- /* This will purposely overwrite REG_SECONDS_OS */
|
||||
regs[1] = bin2bcd(tm->tm_sec);
|
||||
regs[2] = bin2bcd(tm->tm_min);
|
||||
regs[3] = bin2bcd(tm->tm_hour);
|
||||
--
|
||||
2.19.1
|
||||
|
|
@ -0,0 +1,28 @@
|
|||
From 9ca74c53cbda1f104bce3b33850fd3bf33eb3793 Mon Sep 17 00:00:00 2001
|
||||
From: Phil Elwell <phil@raspberrypi.org>
|
||||
Date: Tue, 6 Nov 2018 12:57:48 +0000
|
||||
Subject: [PATCH 483/496] sc16is7xx: Don't spin if no data received
|
||||
|
||||
See: https://github.com/raspberrypi/linux/issues/2676
|
||||
|
||||
Signed-off-by: Phil Elwell <phil@raspberrypi.org>
|
||||
---
|
||||
drivers/tty/serial/sc16is7xx.c | 2 ++
|
||||
1 file changed, 2 insertions(+)
|
||||
|
||||
diff --git a/drivers/tty/serial/sc16is7xx.c b/drivers/tty/serial/sc16is7xx.c
|
||||
index 97fcacc00003..444d354d12d6 100644
|
||||
--- a/drivers/tty/serial/sc16is7xx.c
|
||||
+++ b/drivers/tty/serial/sc16is7xx.c
|
||||
@@ -701,6 +701,8 @@ static bool sc16is7xx_port_irq(struct sc16is7xx_port *s, int portno)
|
||||
rxlen = sc16is7xx_port_read(port, SC16IS7XX_RXLVL_REG);
|
||||
if (rxlen)
|
||||
sc16is7xx_handle_rx(port, rxlen, iir);
|
||||
+ else
|
||||
+ return false;
|
||||
break;
|
||||
case SC16IS7XX_IIR_THRI_SRC:
|
||||
sc16is7xx_handle_tx(port);
|
||||
--
|
||||
2.19.1
|
||||
|
|
@ -0,0 +1,63 @@
|
|||
From d1394b5739ff97a6e504be4755ce023e422a6d39 Mon Sep 17 00:00:00 2001
|
||||
From: Ben Wolsieffer <lopsided98@users.noreply.github.com>
|
||||
Date: Tue, 13 Nov 2018 08:30:17 -0500
|
||||
Subject: [PATCH 485/496] staging: vchiq_arm: fix compat
|
||||
VCHIQ_IOC_AWAIT_COMPLETION (#2703)
|
||||
|
||||
The compatibility ioctl wrapper for VCHIQ_IOC_AWAIT_COMPLETION assumes that
|
||||
the native ioctl always uses a message buffer and decrements msgbufcount.
|
||||
Certain message types do not use a message buffer and in this case
|
||||
msgbufcount is not decremented, and completion->header for the message is
|
||||
NULL. Because the wrapper unconditionally decrements msgbufcount, the
|
||||
calling process may assume that a message buffer has been used even when
|
||||
it has not.
|
||||
|
||||
This results in a memory leak in the userspace code that interfaces with
|
||||
this driver. When msgbufcount is decremented, the userspace code assumes
|
||||
that the buffer can be freed though the reference in completion->header,
|
||||
which cannot happen when the reference is NULL.
|
||||
|
||||
This patch causes the wrapper to only decrement msgbufcount when the
|
||||
native ioctl decrements it. Note that we cannot simply copy the native
|
||||
ioctl's value of msgbufcount, because the wrapper only retrieves messages
|
||||
from the native ioctl one at a time, while userspace may request multiple
|
||||
messages.
|
||||
|
||||
See https://github.com/raspberrypi/linux/pull/2703 for more discussion of
|
||||
this patch.
|
||||
|
||||
Fixes: 5569a12 ("staging: vchiq_arm: Add compatibility wrappers for ioctls")
|
||||
|
||||
Signed-off-by: Ben Wolsieffer <benwolsieffer@gmail.com>
|
||||
---
|
||||
.../staging/vc04_services/interface/vchiq_arm/vchiq_arm.c | 7 ++++++-
|
||||
1 file changed, 6 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c
|
||||
index d67987fbf25e..8ff0e7e860f3 100644
|
||||
--- a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c
|
||||
+++ b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c
|
||||
@@ -1461,6 +1461,7 @@ vchiq_compat_ioctl_await_completion(struct file *file,
|
||||
struct vchiq_await_completion32 args32;
|
||||
struct vchiq_completion_data32 completion32;
|
||||
unsigned int *msgbufcount32;
|
||||
+ unsigned int msgbufcount_native;
|
||||
compat_uptr_t msgbuf32;
|
||||
void *msgbuf;
|
||||
void **msgbufptr;
|
||||
@@ -1572,7 +1573,11 @@ vchiq_compat_ioctl_await_completion(struct file *file,
|
||||
sizeof(completion32)))
|
||||
return -EFAULT;
|
||||
|
||||
- args32.msgbufcount--;
|
||||
+ if (get_user(msgbufcount_native, &args->msgbufcount))
|
||||
+ return -EFAULT;
|
||||
+
|
||||
+ if (!msgbufcount_native)
|
||||
+ args32.msgbufcount--;
|
||||
|
||||
msgbufcount32 =
|
||||
&((struct vchiq_await_completion32 __user *)arg)->msgbufcount;
|
||||
--
|
||||
2.19.1
|
||||
|
|
@ -0,0 +1,30 @@
|
|||
From aed74fc13420b8c4ab6bd0c6f03544655b3acb4f Mon Sep 17 00:00:00 2001
|
||||
From: Dave Stevenson <dave.stevenson@raspberrypi.org>
|
||||
Date: Wed, 14 Nov 2018 11:54:46 +0000
|
||||
Subject: [PATCH 488/496] vcsm: Fix an NULL dereference in the import_dmabuf
|
||||
error path
|
||||
|
||||
resource was dereferenced even though it was NULL.
|
||||
|
||||
Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.org>
|
||||
---
|
||||
drivers/char/broadcom/vc_sm/vmcs_sm.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/drivers/char/broadcom/vc_sm/vmcs_sm.c b/drivers/char/broadcom/vc_sm/vmcs_sm.c
|
||||
index 1bc37ee88225..56a21658b538 100644
|
||||
--- a/drivers/char/broadcom/vc_sm/vmcs_sm.c
|
||||
+++ b/drivers/char/broadcom/vc_sm/vmcs_sm.c
|
||||
@@ -2315,8 +2315,8 @@ int vc_sm_ioctl_import_dmabuf(struct sm_priv_data_t *private,
|
||||
return 0;
|
||||
|
||||
error:
|
||||
- resource->res_stats[IMPORT_FAIL]++;
|
||||
if (resource) {
|
||||
+ resource->res_stats[IMPORT_FAIL]++;
|
||||
vc_sm_resource_deceased(resource, 1);
|
||||
kfree(resource);
|
||||
}
|
||||
--
|
||||
2.19.1
|
||||
|
|
@ -0,0 +1,135 @@
|
|||
From df22a8f70b97cd92dfd791082e580ede7e30237a Mon Sep 17 00:00:00 2001
|
||||
From: Phil Elwell <phil@raspberrypi.org>
|
||||
Date: Mon, 26 Nov 2018 19:46:58 +0000
|
||||
Subject: [PATCH 489/496] net: lan78xx: Support auto-downshift to 100Mb/s
|
||||
|
||||
Ethernet cables with faulty or missing pairs (specifically pairs C and
|
||||
D) allow auto-negotiation to 1000Mbs, but do not support the successful
|
||||
establishment of a link. Add a DT property, "microchip,downshift-after",
|
||||
to configure the number of auto-negotiation failures after which it
|
||||
falls back to 100Mbs. Valid values are 2, 3, 4, 5 and 0, where 0 means
|
||||
never downshift.
|
||||
|
||||
Signed-off-by: Phil Elwell <phil@raspberrypi.org>
|
||||
---
|
||||
drivers/net/phy/microchip.c | 33 +++++++++++++++++++++++++++++++++
|
||||
drivers/net/usb/lan78xx.c | 8 ++++++--
|
||||
include/linux/microchipphy.h | 11 +++++++++++
|
||||
3 files changed, 50 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/phy/microchip.c b/drivers/net/phy/microchip.c
|
||||
index 5418c662b08c..5773701cd1bc 100644
|
||||
--- a/drivers/net/phy/microchip.c
|
||||
+++ b/drivers/net/phy/microchip.c
|
||||
@@ -21,6 +21,7 @@
|
||||
#include <linux/phy.h>
|
||||
#include <linux/microchipphy.h>
|
||||
#include <linux/delay.h>
|
||||
+#include <linux/of.h>
|
||||
|
||||
#define DRIVER_AUTHOR "WOOJUNG HUH <woojung.huh@microchip.com>"
|
||||
#define DRIVER_DESC "Microchip LAN88XX PHY driver"
|
||||
@@ -225,6 +226,7 @@ static int lan88xx_probe(struct phy_device *phydev)
|
||||
{
|
||||
struct device *dev = &phydev->mdio.dev;
|
||||
struct lan88xx_priv *priv;
|
||||
+ u32 downshift_after = 0;
|
||||
|
||||
priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
|
||||
if (!priv)
|
||||
@@ -232,6 +234,37 @@ static int lan88xx_probe(struct phy_device *phydev)
|
||||
|
||||
priv->wolopts = 0;
|
||||
|
||||
+ if (!of_property_read_u32(dev->of_node,
|
||||
+ "microchip,downshift-after",
|
||||
+ &downshift_after)) {
|
||||
+ u32 mask = LAN78XX_PHY_CTRL3_DOWNSHIFT_CTRL_MASK;
|
||||
+ u32 val = LAN78XX_PHY_CTRL3_AUTO_DOWNSHIFT;
|
||||
+
|
||||
+ switch (downshift_after) {
|
||||
+ case 2:
|
||||
+ val |= LAN78XX_PHY_CTRL3_DOWNSHIFT_CTRL_2;
|
||||
+ break;
|
||||
+ case 3:
|
||||
+ val |= LAN78XX_PHY_CTRL3_DOWNSHIFT_CTRL_3;
|
||||
+ break;
|
||||
+ case 4:
|
||||
+ val |= LAN78XX_PHY_CTRL3_DOWNSHIFT_CTRL_4;
|
||||
+ break;
|
||||
+ case 5:
|
||||
+ val |= LAN78XX_PHY_CTRL3_DOWNSHIFT_CTRL_5;
|
||||
+ break;
|
||||
+ case 0:
|
||||
+ /* Disable completely */
|
||||
+ mask = LAN78XX_PHY_CTRL3_AUTO_DOWNSHIFT;
|
||||
+ val = 0;
|
||||
+ break;
|
||||
+ default:
|
||||
+ return -EINVAL;
|
||||
+ }
|
||||
+ (void)phy_modify_paged(phydev, 1, LAN78XX_PHY_CTRL3,
|
||||
+ mask, val);
|
||||
+ }
|
||||
+
|
||||
/* these values can be used to identify internal PHY */
|
||||
priv->chip_id = phy_read_mmd(phydev, 3, LAN88XX_MMD3_CHIP_ID);
|
||||
priv->chip_rev = phy_read_mmd(phydev, 3, LAN88XX_MMD3_CHIP_REV);
|
||||
diff --git a/drivers/net/usb/lan78xx.c b/drivers/net/usb/lan78xx.c
|
||||
index 1f9c5164159a..dd51b2f7376c 100644
|
||||
--- a/drivers/net/usb/lan78xx.c
|
||||
+++ b/drivers/net/usb/lan78xx.c
|
||||
@@ -36,7 +36,8 @@
|
||||
#include <linux/irq.h>
|
||||
#include <linux/irqchip/chained_irq.h>
|
||||
#include <linux/microchipphy.h>
|
||||
-#include <linux/phy.h>
|
||||
+#include <linux/phy_fixed.h>
|
||||
+#include <linux/of_mdio.h>
|
||||
#include <linux/of_net.h>
|
||||
#include "lan78xx.h"
|
||||
|
||||
@@ -1776,6 +1777,7 @@ static int lan78xx_mdiobus_write(struct mii_bus *bus, int phy_id, int idx,
|
||||
|
||||
static int lan78xx_mdio_init(struct lan78xx_net *dev)
|
||||
{
|
||||
+ struct device_node *node;
|
||||
int ret;
|
||||
|
||||
dev->mdiobus = mdiobus_alloc();
|
||||
@@ -1804,7 +1806,9 @@ static int lan78xx_mdio_init(struct lan78xx_net *dev)
|
||||
break;
|
||||
}
|
||||
|
||||
- ret = mdiobus_register(dev->mdiobus);
|
||||
+ node = of_get_child_by_name(dev->udev->dev.of_node, "mdio");
|
||||
+ ret = of_mdiobus_register(dev->mdiobus, node);
|
||||
+ of_node_put(node);
|
||||
if (ret) {
|
||||
netdev_err(dev->net, "can't register MDIO bus\n");
|
||||
goto exit1;
|
||||
diff --git a/include/linux/microchipphy.h b/include/linux/microchipphy.h
|
||||
index 8f9c90379732..004e1cd55c2f 100644
|
||||
--- a/include/linux/microchipphy.h
|
||||
+++ b/include/linux/microchipphy.h
|
||||
@@ -70,6 +70,17 @@
|
||||
#define LAN88XX_MMD3_CHIP_ID (32877)
|
||||
#define LAN88XX_MMD3_CHIP_REV (32878)
|
||||
|
||||
+/* Registers specific to the LAN7800/LAN7850 embedded phy */
|
||||
+#define LAN78XX_PHY_LED_MODE_SELECT (0x1D)
|
||||
+
|
||||
+#define LAN78XX_PHY_CTRL3 (0x14)
|
||||
+#define LAN78XX_PHY_CTRL3_AUTO_DOWNSHIFT (0x0010)
|
||||
+#define LAN78XX_PHY_CTRL3_DOWNSHIFT_CTRL_MASK (0x000c)
|
||||
+#define LAN78XX_PHY_CTRL3_DOWNSHIFT_CTRL_2 (0x0000)
|
||||
+#define LAN78XX_PHY_CTRL3_DOWNSHIFT_CTRL_3 (0x0004)
|
||||
+#define LAN78XX_PHY_CTRL3_DOWNSHIFT_CTRL_4 (0x0008)
|
||||
+#define LAN78XX_PHY_CTRL3_DOWNSHIFT_CTRL_5 (0x000c)
|
||||
+
|
||||
/* DSP registers */
|
||||
#define PHY_ARDENNES_MMD_DEV_3_PHY_CFG (0x806A)
|
||||
#define PHY_ARDENNES_MMD_DEV_3_PHY_CFG_ZD_DLY_EN_ (0x2000)
|
||||
--
|
||||
2.19.1
|
||||
|
|
@ -0,0 +1,37 @@
|
|||
From 45a0cd7d2d66d9954e13636437ca3cdc5f73b882 Mon Sep 17 00:00:00 2001
|
||||
From: Phil Elwell <phil@raspberrypi.org>
|
||||
Date: Tue, 27 Nov 2018 16:55:14 +0000
|
||||
Subject: [PATCH 490/496] ARM: dts: bcm283x: Set downshift-after for Pi 3B+
|
||||
|
||||
Enable the auto-downshift feature on Raspberry Pi 3B+ so that a link
|
||||
can eventually be established using a cable with pairs C and/or D
|
||||
missing or broken in a 1000Mbps-capable port.
|
||||
|
||||
Signed-off-by: Phil Elwell <phil@raspberrypi.org>
|
||||
---
|
||||
arch/arm/boot/dts/bcm283x-rpi-lan7515.dtsi | 9 +++++++++
|
||||
1 file changed, 9 insertions(+)
|
||||
|
||||
diff --git a/arch/arm/boot/dts/bcm283x-rpi-lan7515.dtsi b/arch/arm/boot/dts/bcm283x-rpi-lan7515.dtsi
|
||||
index 154d48b7c45d..d1fdeb44a625 100644
|
||||
--- a/arch/arm/boot/dts/bcm283x-rpi-lan7515.dtsi
|
||||
+++ b/arch/arm/boot/dts/bcm283x-rpi-lan7515.dtsi
|
||||
@@ -27,6 +27,15 @@
|
||||
* led1 = 6:link10/100/activity
|
||||
*/
|
||||
microchip,led-modes = <1 6>;
|
||||
+
|
||||
+ mdio {
|
||||
+ #address-cells = <0x1>;
|
||||
+ #size-cells = <0x0>;
|
||||
+ eth_phy: ethernet-phy@1 {
|
||||
+ reg = <1>;
|
||||
+ microchip,downshift-after = <2>;
|
||||
+ };
|
||||
+ };
|
||||
};
|
||||
};
|
||||
};
|
||||
--
|
||||
2.19.1
|
||||
|
|
@ -0,0 +1,62 @@
|
|||
From 12010ae212267f4b95496bfcfcb9f6230d4654eb Mon Sep 17 00:00:00 2001
|
||||
From: Phil Elwell <phil@raspberrypi.org>
|
||||
Date: Tue, 27 Nov 2018 16:56:50 +0000
|
||||
Subject: [PATCH 491/496] BCM270X_DT: Add new Ethernet DT parameters
|
||||
|
||||
Add "eth_downshift_after" DT parameter to allow the delay before the
|
||||
downshift to be specified. The default is 2 auto-negotiation cycles,
|
||||
and legal values are 2, 3, 4, 5 and 0 (disabled).
|
||||
|
||||
Add "eth_max_speed" DT parameter as a way of prohibiting 1000Mbps
|
||||
links. This can be used to avoid the delay until the downshift mechanism
|
||||
activates. Legal values are 10, 100 and 1000, where the default is
|
||||
unlimited (effectively 1000Mbps).
|
||||
|
||||
Signed-off-by: Phil Elwell <phil@raspberrypi.org>
|
||||
---
|
||||
arch/arm/boot/dts/bcm283x-rpi-lan7515.dtsi | 2 ++
|
||||
arch/arm/boot/dts/overlays/README | 9 +++++++++
|
||||
2 files changed, 11 insertions(+)
|
||||
|
||||
diff --git a/arch/arm/boot/dts/bcm283x-rpi-lan7515.dtsi b/arch/arm/boot/dts/bcm283x-rpi-lan7515.dtsi
|
||||
index d1fdeb44a625..9ae96c02bbb1 100644
|
||||
--- a/arch/arm/boot/dts/bcm283x-rpi-lan7515.dtsi
|
||||
+++ b/arch/arm/boot/dts/bcm283x-rpi-lan7515.dtsi
|
||||
@@ -48,5 +48,7 @@
|
||||
tx_lpi_timer = <ðernet>,"microchip,tx-lpi-timer:0";
|
||||
eth_led0 = <ðernet>,"microchip,led-modes:0";
|
||||
eth_led1 = <ðernet>,"microchip,led-modes:4";
|
||||
+ eth_downshift_after = <ð_phy>,"microchip,downshift-after:0";
|
||||
+ eth_max_speed = <ð_phy>,"max-speed:0";
|
||||
};
|
||||
};
|
||||
diff --git a/arch/arm/boot/dts/overlays/README b/arch/arm/boot/dts/overlays/README
|
||||
index 4ac8c2d6c4b7..91f5bfa2dbd1 100644
|
||||
--- a/arch/arm/boot/dts/overlays/README
|
||||
+++ b/arch/arm/boot/dts/overlays/README
|
||||
@@ -98,6 +98,11 @@ Params:
|
||||
compatible devices (default "on"). See also
|
||||
"tx_lpi_timer".
|
||||
|
||||
+ eth_downshift_after Set the number of auto-negotiation failures
|
||||
+ after which the 1000Mbps modes are disabled.
|
||||
+ Legal values are 2, 3, 4, 5 and 0, where
|
||||
+ 0 means never downshift (default 2).
|
||||
+
|
||||
eth_led0 Set mode of LED0 (usually orange) (default
|
||||
"1"). The legal values are:
|
||||
0=link/activity 1=link1000/activity
|
||||
@@ -108,6 +113,10 @@ Params:
|
||||
eth_led1 Set mode of LED1 (usually green) (default
|
||||
"6"). See eth_led0 for legal values.
|
||||
|
||||
+ eth_max_speed Set the maximum speed a link is allowed
|
||||
+ to negotiate. Legal values are 10, 100 and
|
||||
+ 1000 (default 1000).
|
||||
+
|
||||
i2c_arm Set to "on" to enable the ARM's i2c interface
|
||||
(default "off")
|
||||
|
||||
--
|
||||
2.19.1
|
||||
|
|
@ -1,166 +0,0 @@
|
|||
diff --git a/MAINTAINERS b/MAINTAINERS
|
||||
index b60179d..23735d9 100644
|
||||
--- a/MAINTAINERS
|
||||
+++ b/MAINTAINERS
|
||||
@@ -14573,6 +14573,7 @@ M: Microchip Linux Driver Support <UNGLinuxDriver@microchip.com>
|
||||
L: netdev@vger.kernel.org
|
||||
S: Maintained
|
||||
F: drivers/net/usb/lan78xx.*
|
||||
+F: include/dt-bindings/net/microchip-lan78xx.h
|
||||
|
||||
USB MASS STORAGE DRIVER
|
||||
M: Alan Stern <stern@rowland.harvard.edu>
|
||||
diff --git a/drivers/net/phy/microchip.c b/drivers/net/phy/microchip.c
|
||||
index 0f293ef..ef5e160 100644
|
||||
--- a/drivers/net/phy/microchip.c
|
||||
+++ b/drivers/net/phy/microchip.c
|
||||
@@ -20,7 +20,9 @@
|
||||
#include <linux/ethtool.h>
|
||||
#include <linux/phy.h>
|
||||
#include <linux/microchipphy.h>
|
||||
#include <linux/delay.h>
|
||||
+#include <linux/of.h>
|
||||
+#include <dt-bindings/net/microchip-lan78xx.h>
|
||||
|
||||
#define DRIVER_AUTHOR "WOOJUNG HUH <woojung.huh@microchip.com>"
|
||||
#define DRIVER_DESC "Microchip LAN88XX PHY driver"
|
||||
@@ -70,6 +72,8 @@ static int lan88xx_probe(struct phy_device *phydev)
|
||||
{
|
||||
struct device *dev = &phydev->mdio.dev;
|
||||
struct lan88xx_priv *priv;
|
||||
+ u32 led_modes[4];
|
||||
+ int len;
|
||||
|
||||
priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
|
||||
if (!priv)
|
||||
@@ -77,6 +81,27 @@ static int lan88xx_probe(struct phy_device *phydev)
|
||||
|
||||
priv->wolopts = 0;
|
||||
|
||||
+ len = of_property_read_variable_u32_array(dev->of_node,
|
||||
+ "microchip,led-modes",
|
||||
+ led_modes,
|
||||
+ 0,
|
||||
+ ARRAY_SIZE(led_modes));
|
||||
+ if (len >= 0) {
|
||||
+ u32 reg = 0;
|
||||
+ int i;
|
||||
+
|
||||
+ for (i = 0; i < len; i++) {
|
||||
+ if (led_modes[i] > 15)
|
||||
+ return -EINVAL;
|
||||
+ reg |= led_modes[i] << (i * 4);
|
||||
+ }
|
||||
+ for (; i < ARRAY_SIZE(led_modes); i++)
|
||||
+ reg |= LAN78XX_FORCE_LED_OFF << (i * 4);
|
||||
+ (void)phy_write(phydev, LAN78XX_PHY_LED_MODE_SELECT, reg);
|
||||
+ } else if (len == -EOVERFLOW) {
|
||||
+ return -EINVAL;
|
||||
+ }
|
||||
+
|
||||
/* these values can be used to identify internal PHY */
|
||||
priv->chip_id = phy_read_mmd(phydev, 3, LAN88XX_MMD3_CHIP_ID);
|
||||
priv->chip_rev = phy_read_mmd(phydev, 3, LAN88XX_MMD3_CHIP_REV);
|
||||
diff --git a/drivers/net/usb/lan78xx.c b/drivers/net/usb/lan78xx.c
|
||||
index a823f01..6b03b97 100644
|
||||
--- a/drivers/net/usb/lan78xx.c
|
||||
+++ b/drivers/net/usb/lan78xx.c
|
||||
@@ -37,6 +37,7 @@
|
||||
#include <linux/irqchip/chained_irq.h>
|
||||
#include <linux/microchipphy.h>
|
||||
#include <linux/phy.h>
|
||||
+#include <linux/of_mdio.h>
|
||||
#include <linux/of_net.h>
|
||||
#include "lan78xx.h"
|
||||
|
||||
@@ -1760,6 +1761,7 @@ static int lan78xx_mdiobus_write(struct mii_bus *bus, int phy_id, int idx,
|
||||
|
||||
static int lan78xx_mdio_init(struct lan78xx_net *dev)
|
||||
{
|
||||
+ struct device_node *node;
|
||||
int ret;
|
||||
|
||||
dev->mdiobus = mdiobus_alloc();
|
||||
@@ -1788,7 +1790,13 @@ static int lan78xx_mdio_init(struct lan78xx_net *dev)
|
||||
break;
|
||||
}
|
||||
|
||||
- ret = mdiobus_register(dev->mdiobus);
|
||||
+ node = of_get_child_by_name(dev->udev->dev.of_node, "mdio");
|
||||
+ if (node) {
|
||||
+ ret = of_mdiobus_register(dev->mdiobus, node);
|
||||
+ of_node_put(node);
|
||||
+ } else {
|
||||
+ ret = mdiobus_register(dev->mdiobus);
|
||||
+ }
|
||||
if (ret) {
|
||||
netdev_err(dev->net, "can't register MDIO bus\n");
|
||||
goto exit1;
|
||||
@@ -2077,6 +2085,28 @@ static int lan78xx_phy_init(struct lan78xx_net *dev)
|
||||
mii_adv = (u32)mii_advertise_flowctrl(dev->fc_request_control);
|
||||
phydev->advertising |= mii_adv_to_ethtool_adv_t(mii_adv);
|
||||
|
||||
+ if (phydev->mdio.dev.of_node) {
|
||||
+ u32 reg;
|
||||
+ int len;
|
||||
+
|
||||
+ len = of_property_count_elems_of_size(phydev->mdio.dev.of_node,
|
||||
+ "microchip,led-modes",
|
||||
+ sizeof(u32));
|
||||
+ if (len >= 0) {
|
||||
+ /* Ensure the appropriate LEDs are enabled */
|
||||
+ lan78xx_read_reg(dev, HW_CFG, ®);
|
||||
+ reg &= ~(HW_CFG_LED0_EN_ |
|
||||
+ HW_CFG_LED1_EN_ |
|
||||
+ HW_CFG_LED2_EN_ |
|
||||
+ HW_CFG_LED3_EN_);
|
||||
+ reg |= (len > 0) * HW_CFG_LED0_EN_ |
|
||||
+ (len > 1) * HW_CFG_LED1_EN_ |
|
||||
+ (len > 2) * HW_CFG_LED2_EN_ |
|
||||
+ (len > 3) * HW_CFG_LED3_EN_;
|
||||
+ lan78xx_write_reg(dev, HW_CFG, reg);
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
genphy_config_aneg(phydev);
|
||||
|
||||
dev->fc_autoneg = phydev->autoneg;
|
||||
diff --git a/include/dt-bindings/net/microchip-lan78xx.h b/include/dt-bindings/net/microchip-lan78xx.h
|
||||
new file mode 100644
|
||||
index 0000000..0742ff0
|
||||
--- /dev/null
|
||||
+++ b/include/dt-bindings/net/microchip-lan78xx.h
|
||||
@@ -0,0 +1,21 @@
|
||||
+/* SPDX-License-Identifier: GPL-2.0 */
|
||||
+#ifndef _DT_BINDINGS_MICROCHIP_LAN78XX_H
|
||||
+#define _DT_BINDINGS_MICROCHIP_LAN78XX_H
|
||||
+
|
||||
+/* LED modes for LAN7800/LAN7850 embedded PHY */
|
||||
+
|
||||
+#define LAN78XX_LINK_ACTIVITY 0
|
||||
+#define LAN78XX_LINK_1000_ACTIVITY 1
|
||||
+#define LAN78XX_LINK_100_ACTIVITY 2
|
||||
+#define LAN78XX_LINK_10_ACTIVITY 3
|
||||
+#define LAN78XX_LINK_100_1000_ACTIVITY 4
|
||||
+#define LAN78XX_LINK_10_1000_ACTIVITY 5
|
||||
+#define LAN78XX_LINK_10_100_ACTIVITY 6
|
||||
+#define LAN78XX_DUPLEX_COLLISION 8
|
||||
+#define LAN78XX_COLLISION 9
|
||||
+#define LAN78XX_ACTIVITY 10
|
||||
+#define LAN78XX_AUTONEG_FAULT 12
|
||||
+#define LAN78XX_FORCE_LED_OFF 14
|
||||
+#define LAN78XX_FORCE_LED_ON 15
|
||||
+
|
||||
+#endif
|
||||
diff --git a/include/linux/microchipphy.h b/include/linux/microchipphy.h
|
||||
index eb492d4..8e4015e 100644
|
||||
--- a/include/linux/microchipphy.h
|
||||
+++ b/include/linux/microchipphy.h
|
||||
@@ -70,4 +70,7 @@
|
||||
#define LAN88XX_MMD3_CHIP_ID (32877)
|
||||
#define LAN88XX_MMD3_CHIP_REV (32878)
|
||||
|
||||
+/* Registers specific to the LAN7800/LAN7850 embedded phy */
|
||||
+#define LAN78XX_PHY_LED_MODE_SELECT (0x1D)
|
||||
+
|
||||
#endif /* _MICROCHIPPHY_H */
|
|
@ -1,49 +0,0 @@
|
|||
--- a/arch/arm/boot/dts/bcm283x-rpi-lan7515.dtsi 2018-09-08 19:34:01.223685465 +0200
|
||||
+++ b/arch/arm/boot/dts/bcm283x-rpi-lan7515.dtsi 2018-09-08 19:37:11.689325045 +0200
|
||||
@@ -1,3 +1,5 @@
|
||||
+#include <dt-bindings/net/microchip-lan78xx.h>
|
||||
+
|
||||
/ {
|
||||
aliases {
|
||||
ethernet0 = ðernet;
|
||||
@@ -17,27 +17,22 @@
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
- ethernet: usbether@1 {
|
||||
+ ethernet: ethernet@1 {
|
||||
compatible = "usb424,7800";
|
||||
reg = <1>;
|
||||
- microchip,eee-enabled;
|
||||
- microchip,tx-lpi-timer = <600>; /* non-aggressive*/
|
||||
- /*
|
||||
- * led0 = 1:link1000/activity
|
||||
- * led1 = 6:link10/100/activity
|
||||
- */
|
||||
- microchip,led-modes = <1 6>;
|
||||
+
|
||||
+ mdio {
|
||||
+ #address-cells = <0x1>;
|
||||
+ #size-cells = <0x0>;
|
||||
+ eth_phy: ethernet-phy@1 {
|
||||
+ reg = <1>;
|
||||
+ microchip,led-modes = <
|
||||
+ LAN78XX_LINK_1000_ACTIVITY
|
||||
+ LAN78XX_LINK_10_100_ACTIVITY
|
||||
+ >;
|
||||
+ };
|
||||
+ };
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
-
|
||||
-
|
||||
-/ {
|
||||
- __overrides__ {
|
||||
- eee = <ðernet>,"microchip,eee-enabled?";
|
||||
- tx_lpi_timer = <ðernet>,"microchip,tx-lpi-timer:0";
|
||||
- eth_led0 = <ðernet>,"microchip,led-modes:0";
|
||||
- eth_led1 = <ðernet>,"microchip,led-modes:4";
|
||||
- };
|
||||
-};
|
Loading…
Reference in a new issue