Merge Official Source

Signed-off-by: Tianling Shen <cnsztl@immortalwrt.org>
This commit is contained in:
Tianling Shen 2025-03-02 18:55:54 +08:00
commit 95e5892265
No known key found for this signature in database
GPG Key ID: 6850B6345C862176
55 changed files with 874 additions and 535 deletions

View File

@ -1,2 +1,2 @@
LINUX_VERSION-6.6 = .79
LINUX_KERNEL_HASH-6.6.79 = 07a6f904470da1a099aa1683e3025a999dd82f2438f78b006b80c6ae2e9dfe8d
LINUX_VERSION-6.6 = .80
LINUX_KERNEL_HASH-6.6.80 = 6cf911d01324f45c9dd2f44cf06f55bda0ecf383bc498f132a0c549768531327

View File

@ -8,6 +8,7 @@ touch /etc/config/ubootenv
board=$(board_name)
case "$board" in
linksys,mr5500|\
linksys,mx2000|\
linksys,mx5500|\
linksys,spnmx56)

View File

@ -39,6 +39,7 @@ ALLWIFIBOARDS:= \
edgecore_eap102 \
edimax_cax1800 \
linksys_homewrk \
linksys_mr5500 \
linksys_mr7350 \
linksys_mx2000 \
linksys_mx4200 \
@ -179,6 +180,7 @@ $(eval $(call generate-ipq-wifi-package,dynalink_dl-wrx36,Dynalink DL-WRX36))
$(eval $(call generate-ipq-wifi-package,edgecore_eap102,Edgecore EAP102))
$(eval $(call generate-ipq-wifi-package,edimax_cax1800,Edimax CAX1800))
$(eval $(call generate-ipq-wifi-package,linksys_homewrk,Linksys HomeWRK))
$(eval $(call generate-ipq-wifi-package,linksys_mr5500,Linksys MR5500))
$(eval $(call generate-ipq-wifi-package,linksys_mr7350,Linksys MR7350))
$(eval $(call generate-ipq-wifi-package,linksys_mx2000,Linksys MX2000))
$(eval $(call generate-ipq-wifi-package,linksys_mx4200,Linksys MX4200))

View File

@ -10,9 +10,9 @@ include $(TOPDIR)/rules.mk
PKG_NAME:=unetd
PKG_SOURCE_PROTO:=git
PKG_SOURCE_URL=$(PROJECT_GIT)/project/unetd.git
PKG_SOURCE_DATE:=2025-01-29
PKG_SOURCE_VERSION:=082b5482b97f20dc4745bc3d645e33b584cc28e4
PKG_MIRROR_HASH:=090e7dab3b9a3358706dcee4f1889b7a1f0bdf535f2d6a0580f4160e23ccf9cb
PKG_SOURCE_DATE:=2025-02-28
PKG_SOURCE_VERSION:=edc8fdae463ad7ce9bfb876af0c653ab1da197df
PKG_MIRROR_HASH:=2f0ce439b9e4815b3f20b9aaf4378e3aac114f429bb8bfd06739df118b3da9c8
PKG_LICENSE:=GPL-2.0
PKG_MAINTAINER:=Felix Fietkau <nbd@nbd.name>
@ -32,7 +32,7 @@ define Package/unetd
SECTION:=net
CATEGORY:=Network
TITLE:=WireGuard based VPN connection manager for OpenWrt
DEPENDS:=+libubox +libubus +libblobmsg-json +libnl-tiny +kmod-wireguard +UNETD_VXLAN_SUPPORT:libbpf
DEPENDS:=+libubox +libubus +libudebug +libblobmsg-json +libnl-tiny +kmod-wireguard +UNETD_VXLAN_SUPPORT:libbpf
endef
define Package/unetd/config

View File

@ -151,7 +151,7 @@ function network_sign_data(ctx, name, network, pw_file, upload)
return true;
}
function network_create_uci(name, iface)
function network_create_uci(model, name, iface)
{
let cur = uci.cursor();
cur.set("network", name, "interface");
@ -344,7 +344,7 @@ function network_create(ctx, argv, named) {
if (!network_sign_data(ctx, named.network, network, pw_file))
return;
network_create_uci(named.network, {
network_create_uci(ctx.model, named.network, {
proto: "unet",
metric: named.metric,
zone: named.zone,
@ -580,7 +580,7 @@ function network_join_peer_update(model, ctx, msg)
if (joinreq.connect)
iface.connect = joinreq.connect;
network_create_uci(name, iface);
network_create_uci(model, name, iface);
model.status_msg("Configuration added for interface " + name);

View File

@ -311,7 +311,10 @@ function completion(count) {
add = " ";
cat = "";
add += sprintf("%-"+len+"s", entry.name);
let name = entry.name;
if (entry.incomplete)
name += "...";
add += sprintf("%-"+len+"s", name);
str += add;
x += length(add);

View File

@ -355,7 +355,36 @@ function complete_arg_list(e, ctx, arg_info, args, base_args, named_args)
for (let i = 0; i <= cur_idx; i++)
val = shift(args);
return complete_param(e, ctx, cur, val, base_args, named_args);
let ret = complete_param(e, ctx, cur, val, base_args, named_args);
if (!cur.prefix_separator)
return ret;
let prefix_len = length(val);
let vals = [];
let match_prefix;
for (let cur_val in ret.value) {
let cur_str = cur_val.name;
let cur_suffix = substr(cur_str, prefix_len);
let idx = index(cur_suffix, cur.prefix_separator);
if (idx < 0) {
push(vals, cur_val);
continue;
}
let cur_prefix = substr(cur_str, 0, prefix_len + idx + 1);
if (cur_prefix == match_prefix)
continue;
match_prefix = cur_prefix;
push(vals, {
...cur_val,
name: cur_prefix,
incomplete: true
});
}
ret.value = vals;
return ret;
}
function handle_empty_param(entry, spec, name, argv, named_args)

View File

@ -122,7 +122,7 @@ function run_hook(name, ...args)
return;
for (let hook in hooks)
call(hook, this, {}, ...args);
call(hook, this, this.scope, ...args);
}
function init()

View File

@ -306,34 +306,42 @@ export function new(info, node)
export function object_destroy_call(ctx, argv, named)
{
let type_name = argv[0];
if (!type_name)
return ctx.invalid_argument();
let type_info, type_name;
let info = this.object_info;
let type_info = info.types[type_name];
if (info.types) {
type_name = shift(argv);
if (!type_name)
return ctx.invalid_argument();
type_info = info.types[type_name];
} else {
type_info = info.type;
type_name = type_info.name;
}
if (!type_info)
return ctx.invalid_argument();
let obj_name = type_info.object ?? type_name;
let name = argv[1];
if (type_info.delete)
return call(type_info.delete, info, ctx.model.scope, ctx, type, name);
let name = shift(argv);
if (type_info.delete) {
if (!call(type_info.delete, info, ctx.model.scope, ctx, type, name))
return;
} else {
let obj = ctx.data.object_edit[obj_name];
if (!obj)
return ctx.unknown_error();
let obj = ctx.data.object_edit[obj_name];
if (!obj)
return ctx.unknown_error();
if (!obj[name])
return ctx.not_found();
if (!obj[name])
return ctx.not_found();
delete obj[name];
delete obj[name];
}
if (info.change_cb)
call(info.change_cb, info, ctx.model.scope, ctx, argv);
return ctx.ok(`Deleted ${argv[0]} '${name}'`);
return ctx.ok(`Deleted ${type_name} '${name}'`);
};
const create_edit_param = {
@ -361,34 +369,38 @@ export function object_create_params(node)
export function object_create_call(ctx, argv, named)
{
let type_name = argv[0];
if (!type_name)
return ctx.invalid_argument();
let type_info, type_name;
let info = this.object_info;
let type_info = info.types[type_name];
if (info.types) {
type_name = shift(argv);
if (!type_name)
return ctx.invalid_argument();
type_info = info.types[type_name];
} else {
type_info = info.type;
type_name = type_info.name;
}
if (!type_info)
return ctx.invalid_argument();
let obj_name = type_info.object ?? type_name;
let name = argv[1];
let name = shift(argv);
let obj, data;
if (type_info.add) {
data = call(type_info.add, info, ctx.model.scope, ctx, type, name);
data = call(type_info.add, info, ctx.model.scope, ctx, type_name, name, named);
if (!data)
return;
} else {
data = {};
}
ctx.data.object_edit[obj_name] ??= {};
obj = ctx.data.object_edit[obj_name];
let entry = type_info.node.set;
if (entry) {
ctx.apply_defaults();
let subctx = ctx.clone();
subctx.data.name = name;
subctx.data.edit = data;
try {
@ -404,10 +416,17 @@ export function object_create_call(ctx, argv, named)
}
}
obj[name] = data;
if (type_info.insert) {
if (!call(type_info.insert, info, ctx.model.scope, ctx, type_name, name, data, named))
return;
} else {
ctx.data.object_edit[obj_name] ??= {};
obj = ctx.data.object_edit[obj_name];
obj[name] = data;
}
if (named.edit)
ctx.select(type_name, name);
ctx.select(info.type ? "edit" : type_name, name);
return ctx.ok(`Added ${type_name} '${name}'`);
};
@ -415,11 +434,19 @@ export function object_create_call(ctx, argv, named)
function object_lookup(ctx, entry, type_name)
{
let info = entry.object_info;
let type_info = info.types[type_name];
let type_info = info.types ? info.types[type_name] : info.type;
if (!type_info)
return [];
return {};
let obj_name = type_info.object ?? type_name;
if (type_info.get_object) {
let objs = call(type_info.get_object, info, ctx.model.scope, ctx, type_name);
if (type(objs) != "object")
objs = {};
return objs;
}
let obj_name = type_info.object ?? (info.types ? type_name : type_info.name);
return ctx.data.object_edit[obj_name];
}
@ -435,18 +462,65 @@ function object_values(ctx, entry, type_name)
export function object_list_call(ctx, argv, named)
{
return ctx.list(argv[0] + " list", object_values(ctx, this, argv[0]));
let info = this.object_info;
let type_name = info.types ? argv[0] : info.type.name;
return ctx.list(type_name + " list", object_values(ctx, this, type_name));
};
function object_show_call_single(ctx, entry, type_info, type_name, name)
{
let obj = object_lookup(ctx, entry, type_name);
if (!obj)
return;
entry = obj[name];
if (!entry)
return;
let callctx = ctx.clone();
callctx.data.name = name;
callctx.data.edit = entry;
call(type_info.node.show.call, type_info.node.show, ctx.model.scope, callctx, [], {});
if (callctx.result.ok)
return callctx.result.data;
}
export function object_show_call(ctx, argv, named)
{
let info = this.object_info;
let type_name = info.type.name;
if (argv[0]) {
let data = object_show_call_single(ctx, this, info.type, type_name, argv[0]);
if (!data)
return;
return ctx.table("Values", data);
}
let ret = {};
for (let name in object_values(ctx, this, type_name)) {
let data = object_show_call_single(ctx, this, info.type, type_name, name);
if (!data)
continue;
ret[type_name + " " + name] = data;
}
return ctx.multi_table(type_name + " list", ret);
};
export function edit_create_destroy(info, node)
{
let type_arg = {
name: "type",
help: "Type",
type: "enum",
required: true,
value: keys(info.types),
};
let type_arg = [];
if (info.types)
type_arg = [{
name: "type",
help: "Type",
type: "enum",
required: true,
value: keys(info.types),
}];
let name_arg = {
name: "name",
help: "Name",
@ -460,31 +534,41 @@ export function edit_create_destroy(info, node)
return object_values(ctx, this, argv[0]);
}
};
let show_name_arg = {
...delete_name_arg,
required: false,
};
let create_params = {};
for (let name, val in info.types)
create_params[name] = object_create_params(val.node);
if (info.types) {
for (let name, val in info.types)
create_params[name] = object_create_params(val.node);
} else {
create_params = object_create_params(info.type.node);
}
let types_info = " (" + join(", ", keys(info.types)) + ")";
let types_info = info.types ? "(" + join(", ", keys(info.types)) + ")" : info.type.name;
let cmds = {
destroy: {
object_info: info,
help: "Delete object" + types_info,
args: [ type_arg, delete_name_arg ],
help: "Delete " + types_info,
args: [ ...type_arg, delete_name_arg ],
call: object_destroy_call,
},
list: {
object_info: info,
help: "List objects" + types_info,
args: [ type_arg ],
help: "List " + types_info,
args: [ ...type_arg ],
call: object_list_call,
},
create: {
object_info: info,
help: "Create object" + types_info,
args: [ type_arg, name_arg ],
help: "Create " + types_info,
args: [ ...type_arg, name_arg ],
type_params: create_params,
named_args: function(ctx, argv) {
if (!this.object_info.types)
return this.type_params;
if (!argv[0])
return;
return this.type_params[argv[0]];
@ -493,8 +577,22 @@ export function edit_create_destroy(info, node)
},
};
for (let name, val in info.types) {
cmds[name] = {
let info_types = info.types;
if (!info_types) {
info_types = {};
info_types[info.type.name] = info.type;
cmds.show = {
object_info: info,
help: "Show " + types_info,
args: [ show_name_arg ],
call: object_show_call,
};
}
for (let name, val in info_types) {
let cmd_name = info.types ? name : "edit";
cmds[cmd_name] = {
object_name: name,
object_info: info,
help: "Edit " + name,
@ -527,8 +625,6 @@ export function edit_create_destroy(info, node)
return;
}
let info = this.object_info;
let type_info = info.types[this.object_name];
return ctx.set(`${this.object_name} "${name}"`, {
name,
edit: entry,

View File

@ -52,6 +52,7 @@ enum vt100_escape {
VT100_CURSOR_WORD_LEFT,
VT100_CURSOR_RIGHT,
VT100_CURSOR_WORD_RIGHT,
VT100_CURSOR_POS,
VT100_HOME,
VT100_END,
VT100_INSERT,
@ -63,7 +64,7 @@ enum vt100_escape {
};
ssize_t utf8_nsyms(const char *str, size_t len);
enum vt100_escape vt100_esc_decode(const char *str);
enum vt100_escape vt100_esc_decode(const char *str, uint32_t *data);
// helpers:
void __vt100_csi_num(FILE *out, int num, char code);
@ -191,4 +192,15 @@ static inline void vt100_ding(FILE *out)
fflush(out);
}
static inline void vt100_request_window_size(FILE *out)
{
fputs(
"\e7" /* save cursor position */
"\e[r" /* reset margins */
"\e[999;999H" /* move cursor to bottom right */
"\e[6n" /* report cursor position */
"\e8", /* restore cursor position */
out);
}
#endif

View File

@ -101,13 +101,16 @@ update_window_size(struct uline_state *s, bool init)
#ifdef TIOCGWINSZ
struct winsize ws = {};
if (!ioctl(fileno(s->output), TIOCGWINSZ, &ws)) {
if (ws.ws_col)
cols = ws.ws_col;
if (ws.ws_row)
rows = ws.ws_row;
}
if (s->ioctl_winsize &&
!ioctl(fileno(s->output), TIOCGWINSZ, &ws) &&
ws.ws_col && ws.ws_row) {
cols = ws.ws_col;
rows = ws.ws_row;
} else
#endif
{
s->ioctl_winsize = false;
}
s->sigwinch_count = sigwinch_count;
if (s->cols == cols && s->rows == rows)
@ -534,7 +537,7 @@ move_word_right(struct uline_state *s, struct linebuf *line)
}
static bool
process_esc(struct uline_state *s, enum vt100_escape esc)
process_esc(struct uline_state *s, enum vt100_escape esc, uint32_t data)
{
struct linebuf *line = &s->line;
@ -552,6 +555,15 @@ process_esc(struct uline_state *s, enum vt100_escape esc)
return move_right(s, line);
case VT100_CURSOR_WORD_RIGHT:
return move_word_right(s, line);
case VT100_CURSOR_POS:
if (s->rows == (data & 0xffff) &&
s->cols == data >> 16)
return false;
s->rows = data & 0xffff;
s->cols = data >> 16;
s->full_update = true;
s->cb->event(s, EDITLINE_EV_WINDOW_CHANGED);
return true;
case VT100_HOME:
line->pos = 0;
return true;
@ -682,9 +694,9 @@ process_ctrl(struct uline_state *s, char c)
linebuf_reset(line);
return true;
case KEY_SOH:
return process_esc(s, VT100_HOME);
return process_esc(s, VT100_HOME, 0);
case KEY_ENQ:
return process_esc(s, VT100_END);
return process_esc(s, VT100_END, 0);
case KEY_VT:
// TODO: kill
return false;
@ -718,18 +730,19 @@ static void
process_char(struct uline_state *s, char c)
{
enum vt100_escape esc;
uint32_t data = 0;
check_key_repeat(s, c);
if (s->esc_idx >= 0) {
s->esc_seq[s->esc_idx++] = c;
s->esc_seq[s->esc_idx] = 0;
esc = vt100_esc_decode(s->esc_seq);
esc = vt100_esc_decode(s->esc_seq, &data);
if (esc == VT100_INCOMPLETE &&
s->esc_idx < (int)sizeof(s->esc_seq) - 1)
return;
s->esc_idx = -1;
if (!process_esc(s, esc))
if (!process_esc(s, esc, data))
return;
} else if (s->cb->key_input &&
!check_utf8(s, (unsigned char )c) &&
@ -901,7 +914,7 @@ void uline_init(struct uline_state *s, const struct uline_cb *cb,
s->utf8 = utf8;
s->input = in_fd;
s->output = out_stream;
update_window_size(s, true);
s->ioctl_winsize = true;
reset_input_state(s);
#ifdef USE_SYSTEM_WCHAR
@ -916,6 +929,12 @@ void uline_init(struct uline_state *s, const struct uline_cb *cb,
s->has_termios = true;
termios_set_native_mode(s);
}
update_window_size(s, true);
if (!s->ioctl_winsize) {
vt100_request_window_size(s->output);
fflush(s->output);
}
}
void uline_free(struct uline_state *s)

View File

@ -82,12 +82,13 @@ struct uline_state {
unsigned int rows, cols;
struct pos cursor_pos;
struct pos end_pos;
bool ioctl_winsize;
bool full_update;
bool stop;
bool utf8;
char esc_seq[8];
char esc_seq[32];
int8_t esc_idx;
uint8_t utf8_cont;
};

View File

@ -7,10 +7,10 @@
#include "uline.h"
#include "private.h"
enum vt100_escape vt100_esc_decode(const char *str)
enum vt100_escape vt100_esc_decode(const char *str, uint32_t *data)
{
unsigned long code;
size_t idx;
unsigned long code, code2;
char *err;
switch (*(str++)) {
case 0:
@ -45,23 +45,36 @@ enum vt100_escape vt100_esc_decode(const char *str)
case '0' ... '4':
case '6' ... '9':
str--;
idx = strspn(str, "0123456789");
if (!str[idx])
code = strtoul(str, &err, 10);
switch (*err) {
case 0:
return VT100_INCOMPLETE;
if (str[idx] != '~')
return VT100_UNKNOWN;
code = strtoul(str, NULL, 10);
switch (code) {
case 1:
return VT100_HOME;
case 3:
return VT100_DELETE;
case 4:
return VT100_END;
case 200:
case 201:
// paste start/end
return VT100_IGNORE;
case '~':
switch (code) {
case 1:
return VT100_HOME;
case 3:
return VT100_DELETE;
case 4:
return VT100_END;
case 200:
case 201:
// paste start/end
return VT100_IGNORE;
default:
return VT100_UNKNOWN;
}
case ';':
code2 = strtoul(err + 1, &err, 10);
switch (*err) {
case 0:
return VT100_INCOMPLETE;
case 'R':
*data = (code2 << 16) | (code & 0xffff);
return VT100_CURSOR_POS;
default:
return VT100_UNKNOWN;
}
default:
return VT100_UNKNOWN;
}

View File

@ -751,7 +751,7 @@ SVN-Revision: 35130
EXPORT_SYMBOL(xfrm_parse_spi);
--- a/net/ipv4/tcp_input.c
+++ b/net/ipv4/tcp_input.c
@@ -4262,14 +4262,16 @@ static bool tcp_parse_aligned_timestamp(
@@ -4268,14 +4268,16 @@ static bool tcp_parse_aligned_timestamp(
{
const __be32 *ptr = (const __be32 *)(th + 1);

View File

@ -89,7 +89,7 @@ Signed-off-by: Maxime Ripard <maxime@cerno.tech>
commit->event = kzalloc(sizeof(*commit->event),
--- a/drivers/gpu/drm/i915/display/intel_display.c
+++ b/drivers/gpu/drm/i915/display/intel_display.c
@@ -7280,6 +7280,19 @@ int intel_atomic_commit(struct drm_devic
@@ -7298,6 +7298,19 @@ int intel_atomic_commit(struct drm_devic
state->base.legacy_cursor_update = false;
}

View File

@ -1196,7 +1196,7 @@ Signed-off-by: Martin KaFai Lau <martin.lau@kernel.org>
#include <net/tcx.h>
#define IS_FD_ARRAY(map) ((map)->map_type == BPF_MAP_TYPE_PERF_EVENT_ARRAY || \
@@ -3827,6 +3828,8 @@ attach_type_to_prog_type(enum bpf_attach
@@ -3828,6 +3829,8 @@ attach_type_to_prog_type(enum bpf_attach
return BPF_PROG_TYPE_LSM;
case BPF_TCX_INGRESS:
case BPF_TCX_EGRESS:
@ -1205,7 +1205,7 @@ Signed-off-by: Martin KaFai Lau <martin.lau@kernel.org>
return BPF_PROG_TYPE_SCHED_CLS;
default:
return BPF_PROG_TYPE_UNSPEC;
@@ -3883,7 +3886,9 @@ static int bpf_prog_attach_check_attach_
@@ -3884,7 +3887,9 @@ static int bpf_prog_attach_check_attach_
return 0;
case BPF_PROG_TYPE_SCHED_CLS:
if (attach_type != BPF_TCX_INGRESS &&
@ -1216,7 +1216,7 @@ Signed-off-by: Martin KaFai Lau <martin.lau@kernel.org>
return -EINVAL;
return 0;
default:
@@ -3966,7 +3971,11 @@ static int bpf_prog_attach(const union b
@@ -3967,7 +3972,11 @@ static int bpf_prog_attach(const union b
ret = cgroup_bpf_prog_attach(attr, ptype, prog);
break;
case BPF_PROG_TYPE_SCHED_CLS:
@ -1229,7 +1229,7 @@ Signed-off-by: Martin KaFai Lau <martin.lau@kernel.org>
break;
default:
ret = -EINVAL;
@@ -4027,7 +4036,11 @@ static int bpf_prog_detach(const union b
@@ -4028,7 +4037,11 @@ static int bpf_prog_detach(const union b
ret = cgroup_bpf_prog_detach(attr, ptype);
break;
case BPF_PROG_TYPE_SCHED_CLS:
@ -1242,7 +1242,7 @@ Signed-off-by: Martin KaFai Lau <martin.lau@kernel.org>
break;
default:
ret = -EINVAL;
@@ -4089,6 +4102,9 @@ static int bpf_prog_query(const union bp
@@ -4090,6 +4103,9 @@ static int bpf_prog_query(const union bp
case BPF_TCX_INGRESS:
case BPF_TCX_EGRESS:
return tcx_prog_query(attr, uattr);
@ -1252,7 +1252,7 @@ Signed-off-by: Martin KaFai Lau <martin.lau@kernel.org>
default:
return -EINVAL;
}
@@ -5070,7 +5086,11 @@ static int link_create(union bpf_attr *a
@@ -5071,7 +5087,11 @@ static int link_create(union bpf_attr *a
ret = bpf_xdp_link_attach(attr, prog);
break;
case BPF_PROG_TYPE_SCHED_CLS:

View File

@ -32,7 +32,7 @@ Signed-off-by: Paolo Abeni <pabeni@redhat.com>
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -4483,13 +4483,7 @@ static inline void ____napi_schedule(str
@@ -4514,13 +4514,7 @@ static inline void ____napi_schedule(str
*/
thread = READ_ONCE(napi->thread);
if (thread) {
@ -47,7 +47,7 @@ Signed-off-by: Paolo Abeni <pabeni@redhat.com>
wake_up_process(thread);
return;
}
@@ -6645,8 +6639,6 @@ static int napi_poll(struct napi_struct
@@ -6676,8 +6670,6 @@ static int napi_poll(struct napi_struct
static int napi_thread_wait(struct napi_struct *napi)
{
@ -56,7 +56,7 @@ Signed-off-by: Paolo Abeni <pabeni@redhat.com>
set_current_state(TASK_INTERRUPTIBLE);
while (!kthread_should_stop()) {
@@ -6655,15 +6647,13 @@ static int napi_thread_wait(struct napi_
@@ -6686,15 +6678,13 @@ static int napi_thread_wait(struct napi_
* Testing SCHED bit is not enough because SCHED bit might be
* set by some other busy poll thread or by napi_disable().
*/

View File

@ -108,7 +108,7 @@ Signed-off-by: Paolo Abeni <pabeni@redhat.com>
static inline void rps_lock_irqsave(struct softnet_data *sd,
unsigned long *flags)
{
@@ -4451,6 +4477,7 @@ EXPORT_SYMBOL(__dev_direct_xmit);
@@ -4482,6 +4508,7 @@ EXPORT_SYMBOL(__dev_direct_xmit);
/*************************************************************************
* Receiver routines
*************************************************************************/
@ -116,7 +116,7 @@ Signed-off-by: Paolo Abeni <pabeni@redhat.com>
int netdev_max_backlog __read_mostly = 1000;
EXPORT_SYMBOL(netdev_max_backlog);
@@ -4483,12 +4510,16 @@ static inline void ____napi_schedule(str
@@ -4514,12 +4541,16 @@ static inline void ____napi_schedule(str
*/
thread = READ_ONCE(napi->thread);
if (thread) {
@ -133,7 +133,7 @@ Signed-off-by: Paolo Abeni <pabeni@redhat.com>
list_add_tail(&napi->poll_list, &sd->poll_list);
WRITE_ONCE(napi->list_owner, smp_processor_id());
/* If not called from net_rx_action()
@@ -4734,6 +4765,11 @@ static void napi_schedule_rps(struct sof
@@ -4765,6 +4796,11 @@ static void napi_schedule_rps(struct sof
#ifdef CONFIG_RPS
if (sd != mysd) {
@ -145,7 +145,7 @@ Signed-off-by: Paolo Abeni <pabeni@redhat.com>
sd->rps_ipi_next = mysd->rps_ipi_list;
mysd->rps_ipi_list = sd;
@@ -5957,7 +5993,7 @@ static void net_rps_action_and_irq_enabl
@@ -5988,7 +6024,7 @@ static void net_rps_action_and_irq_enabl
#ifdef CONFIG_RPS
struct softnet_data *remsd = sd->rps_ipi_list;
@ -154,7 +154,7 @@ Signed-off-by: Paolo Abeni <pabeni@redhat.com>
sd->rps_ipi_list = NULL;
local_irq_enable();
@@ -5972,7 +6008,7 @@ static void net_rps_action_and_irq_enabl
@@ -6003,7 +6039,7 @@ static void net_rps_action_and_irq_enabl
static bool sd_has_rps_ipi_waiting(struct softnet_data *sd)
{
#ifdef CONFIG_RPS
@ -163,7 +163,7 @@ Signed-off-by: Paolo Abeni <pabeni@redhat.com>
#else
return false;
#endif
@@ -6016,7 +6052,7 @@ static int process_backlog(struct napi_s
@@ -6047,7 +6083,7 @@ static int process_backlog(struct napi_s
* We can use a plain write instead of clear_bit(),
* and we dont need an smp_mb() memory barrier.
*/
@ -172,7 +172,7 @@ Signed-off-by: Paolo Abeni <pabeni@redhat.com>
again = false;
} else {
skb_queue_splice_tail_init(&sd->input_pkt_queue,
@@ -6682,43 +6718,48 @@ static void skb_defer_free_flush(struct
@@ -6713,43 +6749,48 @@ static void skb_defer_free_flush(struct
}
}
@ -250,7 +250,7 @@ Signed-off-by: Paolo Abeni <pabeni@redhat.com>
return 0;
}
@@ -11303,7 +11344,7 @@ static int dev_cpu_dead(unsigned int old
@@ -11334,7 +11375,7 @@ static int dev_cpu_dead(unsigned int old
list_del_init(&napi->poll_list);
if (napi->poll == process_backlog)
@ -259,7 +259,7 @@ Signed-off-by: Paolo Abeni <pabeni@redhat.com>
else
____napi_schedule(sd, napi);
}
@@ -11311,12 +11352,14 @@ static int dev_cpu_dead(unsigned int old
@@ -11342,12 +11383,14 @@ static int dev_cpu_dead(unsigned int old
raise_softirq_irqoff(NET_TX_SOFTIRQ);
local_irq_enable();
@ -278,7 +278,7 @@ Signed-off-by: Paolo Abeni <pabeni@redhat.com>
/* Process offline CPU's input_pkt_queue */
while ((skb = __skb_dequeue(&oldsd->process_queue))) {
@@ -11579,6 +11622,38 @@ static struct pernet_operations __net_in
@@ -11610,6 +11653,38 @@ static struct pernet_operations __net_in
*
*/
@ -317,7 +317,7 @@ Signed-off-by: Paolo Abeni <pabeni@redhat.com>
/*
* This is called single threaded during boot, so no need
* to take the rtnl semaphore.
@@ -11629,7 +11704,10 @@ static int __init net_dev_init(void)
@@ -11660,7 +11735,10 @@ static int __init net_dev_init(void)
init_gro_hash(&sd->backlog);
sd->backlog.poll = process_backlog;
sd->backlog.weight = weight_p;

View File

@ -36,7 +36,7 @@ Signed-off-by: Paolo Abeni <pabeni@redhat.com>
--- a/include/linux/netdevice.h
+++ b/include/linux/netdevice.h
@@ -3306,6 +3306,7 @@ static inline void dev_xmit_recursion_de
@@ -3308,6 +3308,7 @@ static inline void dev_xmit_recursion_de
__this_cpu_dec(softnet_data.xmit.recursion);
}
@ -82,7 +82,7 @@ Signed-off-by: Paolo Abeni <pabeni@redhat.com>
spin_unlock_irq(&sd->input_pkt_queue.lock);
else if (!IS_ENABLED(CONFIG_PREEMPT_RT))
local_irq_enable();
@@ -4784,6 +4784,23 @@ static void napi_schedule_rps(struct sof
@@ -4815,6 +4815,23 @@ static void napi_schedule_rps(struct sof
__napi_schedule_irqoff(&mysd->backlog);
}

View File

@ -67,7 +67,7 @@ Signed-off-by: Paolo Abeni <pabeni@redhat.com>
{
if (IS_ENABLED(CONFIG_RPS) || use_backlog_threads())
spin_unlock_irq(&sd->input_pkt_queue.lock);
@@ -4789,12 +4789,12 @@ void kick_defer_list_purge(struct softne
@@ -4820,12 +4820,12 @@ void kick_defer_list_purge(struct softne
unsigned long flags;
if (use_backlog_threads()) {
@ -82,7 +82,7 @@ Signed-off-by: Paolo Abeni <pabeni@redhat.com>
} else if (!cmpxchg(&sd->defer_ipi_scheduled, 0, 1)) {
smp_call_function_single_async(cpu, &sd->defer_csd);
@@ -4856,7 +4856,7 @@ static int enqueue_to_backlog(struct sk_
@@ -4887,7 +4887,7 @@ static int enqueue_to_backlog(struct sk_
reason = SKB_DROP_REASON_NOT_SPECIFIED;
sd = &per_cpu(softnet_data, cpu);
@ -91,7 +91,7 @@ Signed-off-by: Paolo Abeni <pabeni@redhat.com>
if (!netif_running(skb->dev))
goto drop;
qlen = skb_queue_len(&sd->input_pkt_queue);
@@ -4865,7 +4865,7 @@ static int enqueue_to_backlog(struct sk_
@@ -4896,7 +4896,7 @@ static int enqueue_to_backlog(struct sk_
enqueue:
__skb_queue_tail(&sd->input_pkt_queue, skb);
input_queue_tail_incr_save(sd, qtail);
@ -100,7 +100,7 @@ Signed-off-by: Paolo Abeni <pabeni@redhat.com>
return NET_RX_SUCCESS;
}
@@ -4880,7 +4880,7 @@ enqueue:
@@ -4911,7 +4911,7 @@ enqueue:
drop:
sd->dropped++;
@ -109,7 +109,7 @@ Signed-off-by: Paolo Abeni <pabeni@redhat.com>
dev_core_stats_rx_dropped_inc(skb->dev);
kfree_skb_reason(skb, reason);
@@ -5911,7 +5911,7 @@ static void flush_backlog(struct work_st
@@ -5942,7 +5942,7 @@ static void flush_backlog(struct work_st
local_bh_disable();
sd = this_cpu_ptr(&softnet_data);
@ -118,7 +118,7 @@ Signed-off-by: Paolo Abeni <pabeni@redhat.com>
skb_queue_walk_safe(&sd->input_pkt_queue, skb, tmp) {
if (skb->dev->reg_state == NETREG_UNREGISTERING) {
__skb_unlink(skb, &sd->input_pkt_queue);
@@ -5919,7 +5919,7 @@ static void flush_backlog(struct work_st
@@ -5950,7 +5950,7 @@ static void flush_backlog(struct work_st
input_queue_head_incr(sd);
}
}
@ -127,7 +127,7 @@ Signed-off-by: Paolo Abeni <pabeni@redhat.com>
skb_queue_walk_safe(&sd->process_queue, skb, tmp) {
if (skb->dev->reg_state == NETREG_UNREGISTERING) {
@@ -5937,14 +5937,14 @@ static bool flush_required(int cpu)
@@ -5968,14 +5968,14 @@ static bool flush_required(int cpu)
struct softnet_data *sd = &per_cpu(softnet_data, cpu);
bool do_flush;
@ -144,7 +144,7 @@ Signed-off-by: Paolo Abeni <pabeni@redhat.com>
return do_flush;
#endif
@@ -6059,7 +6059,7 @@ static int process_backlog(struct napi_s
@@ -6090,7 +6090,7 @@ static int process_backlog(struct napi_s
}
@ -153,7 +153,7 @@ Signed-off-by: Paolo Abeni <pabeni@redhat.com>
if (skb_queue_empty(&sd->input_pkt_queue)) {
/*
* Inline a custom version of __napi_complete().
@@ -6075,7 +6075,7 @@ static int process_backlog(struct napi_s
@@ -6106,7 +6106,7 @@ static int process_backlog(struct napi_s
skb_queue_splice_tail_init(&sd->input_pkt_queue,
&sd->process_queue);
}

View File

@ -20,7 +20,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -9765,6 +9765,15 @@ static void netdev_sync_lower_features(s
@@ -9796,6 +9796,15 @@ static void netdev_sync_lower_features(s
}
}
@ -36,7 +36,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
static netdev_features_t netdev_fix_features(struct net_device *dev,
netdev_features_t features)
{
@@ -9846,15 +9855,9 @@ static netdev_features_t netdev_fix_feat
@@ -9877,15 +9886,9 @@ static netdev_features_t netdev_fix_feat
features &= ~NETIF_F_LRO;
}
@ -55,7 +55,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
}
if ((features & NETIF_F_HW_TLS_RX) && !(features & NETIF_F_RXCSUM)) {
@@ -9862,6 +9865,11 @@ static netdev_features_t netdev_fix_feat
@@ -9893,6 +9896,11 @@ static netdev_features_t netdev_fix_feat
features &= ~NETIF_F_HW_TLS_RX;
}

View File

@ -18,7 +18,7 @@ Signed-off-by: Paolo Abeni <pabeni@redhat.com>
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -10672,6 +10672,8 @@ struct rtnl_link_stats64 *dev_get_stats(
@@ -10703,6 +10703,8 @@ struct rtnl_link_stats64 *dev_get_stats(
ops->ndo_get_stats64(dev, storage);
} else if (ops->ndo_get_stats) {
netdev_stats_to_stats64(storage, ops->ndo_get_stats(dev));

View File

@ -37,7 +37,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net>
--- a/include/linux/netdevice.h
+++ b/include/linux/netdevice.h
@@ -4567,6 +4567,9 @@ static inline void netif_addr_unlock_bh(
@@ -4569,6 +4569,9 @@ static inline void netif_addr_unlock_bh(
void ether_setup(struct net_device *dev);
@ -49,7 +49,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net>
unsigned char name_assign_type,
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -10359,25 +10359,12 @@ err_free_name:
@@ -10390,25 +10390,12 @@ err_free_name:
}
EXPORT_SYMBOL(register_netdevice);
@ -79,7 +79,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net>
/* make sure we BUG if trying to hit standard
* register/unregister code path
*/
@@ -10397,12 +10384,32 @@ int init_dummy_netdev(struct net_device
@@ -10428,12 +10415,32 @@ int init_dummy_netdev(struct net_device
* because users of this 'device' dont need to change
* its refcount.
*/
@ -113,7 +113,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net>
/**
* register_netdev - register a network device
* @dev: device to register
@@ -10996,6 +11003,19 @@ void free_netdev(struct net_device *dev)
@@ -11027,6 +11034,19 @@ void free_netdev(struct net_device *dev)
EXPORT_SYMBOL(free_netdev);
/**

View File

@ -85,7 +85,7 @@ Signed-off-by: Paolo Abeni <pabeni@redhat.com>
/**
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -6612,7 +6612,7 @@ static int __napi_poll(struct napi_struc
@@ -6643,7 +6643,7 @@ static int __napi_poll(struct napi_struc
* accidentally calling ->poll() when NAPI is not scheduled.
*/
work = 0;

View File

@ -48,7 +48,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
mtd->nvmem = nvmem_register(&config);
--- a/drivers/nvmem/core.c
+++ b/drivers/nvmem/core.c
@@ -940,7 +940,7 @@ struct nvmem_device *nvmem_register(cons
@@ -918,7 +918,7 @@ struct nvmem_device *nvmem_register(cons
nvmem->nkeepout = config->nkeepout;
if (config->of_node)
nvmem->dev.of_node = config->of_node;
@ -59,7 +59,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
switch (config->id) {
--- a/include/linux/nvmem-provider.h
+++ b/include/linux/nvmem-provider.h
@@ -89,7 +89,6 @@ struct nvmem_cell_info {
@@ -91,7 +91,6 @@ struct nvmem_cell_info {
* @read_only: Device is read-only.
* @root_only: Device is accessibly to root only.
* @of_node: If given, this will be used instead of the parent's of_node.
@ -67,7 +67,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
* @reg_read: Callback to read data.
* @reg_write: Callback to write data.
* @size: Device size.
@@ -122,7 +121,6 @@ struct nvmem_config {
@@ -126,7 +125,6 @@ struct nvmem_config {
bool ignore_wp;
struct nvmem_layout *layout;
struct device_node *of_node;

View File

@ -25,7 +25,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
--- a/drivers/nvmem/core.c
+++ b/drivers/nvmem/core.c
@@ -846,14 +846,6 @@ static int nvmem_add_cells_from_layout(s
@@ -823,14 +823,6 @@ static int nvmem_add_cells_from_layout(s
}
#if IS_ENABLED(CONFIG_OF)
@ -65,7 +65,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
#endif /* ifndef _LINUX_NVMEM_CONSUMER_H */
--- a/include/linux/nvmem-provider.h
+++ b/include/linux/nvmem-provider.h
@@ -244,6 +244,27 @@ nvmem_layout_get_match_data(struct nvmem
@@ -241,6 +241,27 @@ nvmem_layout_get_match_data(struct nvmem
#endif /* CONFIG_NVMEM */

View File

@ -1,91 +0,0 @@
From ec9c08a1cb8dc5e8e003f95f5f62de41dde235bb Mon Sep 17 00:00:00 2001
From: Miquel Raynal <miquel.raynal@bootlin.com>
Date: Fri, 15 Dec 2023 11:15:29 +0000
Subject: [PATCH] nvmem: Create a header for internal sharing
Before adding all the NVMEM layout bus infrastructure to the core, let's
move the main nvmem_device structure in an internal header, only
available to the core. This way all the additional code can be added in
a dedicated file in order to keep the current core file tidy.
Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
Link: https://lore.kernel.org/r/20231215111536.316972-4-srinivas.kandagatla@linaro.org
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
---
drivers/nvmem/core.c | 24 +-----------------------
drivers/nvmem/internals.h | 35 +++++++++++++++++++++++++++++++++++
2 files changed, 36 insertions(+), 23 deletions(-)
create mode 100644 drivers/nvmem/internals.h
--- a/drivers/nvmem/core.c
+++ b/drivers/nvmem/core.c
@@ -19,29 +19,7 @@
#include <linux/of.h>
#include <linux/slab.h>
-struct nvmem_device {
- struct module *owner;
- struct device dev;
- int stride;
- int word_size;
- int id;
- struct kref refcnt;
- size_t size;
- bool read_only;
- bool root_only;
- int flags;
- enum nvmem_type type;
- struct bin_attribute eeprom;
- struct device *base_dev;
- struct list_head cells;
- const struct nvmem_keepout *keepout;
- unsigned int nkeepout;
- nvmem_reg_read_t reg_read;
- nvmem_reg_write_t reg_write;
- struct gpio_desc *wp_gpio;
- struct nvmem_layout *layout;
- void *priv;
-};
+#include "internals.h"
#define to_nvmem_device(d) container_of(d, struct nvmem_device, dev)
--- /dev/null
+++ b/drivers/nvmem/internals.h
@@ -0,0 +1,35 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+
+#ifndef _LINUX_NVMEM_INTERNALS_H
+#define _LINUX_NVMEM_INTERNALS_H
+
+#include <linux/device.h>
+#include <linux/nvmem-consumer.h>
+#include <linux/nvmem-provider.h>
+
+struct nvmem_device {
+ struct module *owner;
+ struct device dev;
+ struct list_head node;
+ int stride;
+ int word_size;
+ int id;
+ struct kref refcnt;
+ size_t size;
+ bool read_only;
+ bool root_only;
+ int flags;
+ enum nvmem_type type;
+ struct bin_attribute eeprom;
+ struct device *base_dev;
+ struct list_head cells;
+ const struct nvmem_keepout *keepout;
+ unsigned int nkeepout;
+ nvmem_reg_read_t reg_read;
+ nvmem_reg_write_t reg_write;
+ struct gpio_desc *wp_gpio;
+ struct nvmem_layout *layout;
+ void *priv;
+};
+
+#endif /* ifndef _LINUX_NVMEM_INTERNALS_H */

View File

@ -1,79 +0,0 @@
From 1b7c298a4ecbc28cc6ee94005734bff55eb83d22 Mon Sep 17 00:00:00 2001
From: Miquel Raynal <miquel.raynal@bootlin.com>
Date: Fri, 15 Dec 2023 11:15:30 +0000
Subject: [PATCH] nvmem: Simplify the ->add_cells() hook
The layout entry is not used and will anyway be made useless by the new
layout bus infrastructure coming next, so drop it. While at it, clarify
the kdoc entry.
Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
Link: https://lore.kernel.org/r/20231215111536.316972-5-srinivas.kandagatla@linaro.org
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
---
drivers/nvmem/core.c | 2 +-
drivers/nvmem/layouts/onie-tlv.c | 3 +--
drivers/nvmem/layouts/sl28vpd.c | 3 +--
include/linux/nvmem-provider.h | 8 +++-----
4 files changed, 6 insertions(+), 10 deletions(-)
--- a/drivers/nvmem/core.c
+++ b/drivers/nvmem/core.c
@@ -815,7 +815,7 @@ static int nvmem_add_cells_from_layout(s
int ret;
if (layout && layout->add_cells) {
- ret = layout->add_cells(&nvmem->dev, nvmem, layout);
+ ret = layout->add_cells(&nvmem->dev, nvmem);
if (ret)
return ret;
}
--- a/drivers/nvmem/layouts/onie-tlv.c
+++ b/drivers/nvmem/layouts/onie-tlv.c
@@ -182,8 +182,7 @@ static bool onie_tlv_crc_is_valid(struct
return true;
}
-static int onie_tlv_parse_table(struct device *dev, struct nvmem_device *nvmem,
- struct nvmem_layout *layout)
+static int onie_tlv_parse_table(struct device *dev, struct nvmem_device *nvmem)
{
struct onie_tlv_hdr hdr;
size_t table_len, data_len, hdr_len;
--- a/drivers/nvmem/layouts/sl28vpd.c
+++ b/drivers/nvmem/layouts/sl28vpd.c
@@ -80,8 +80,7 @@ static int sl28vpd_v1_check_crc(struct d
return 0;
}
-static int sl28vpd_add_cells(struct device *dev, struct nvmem_device *nvmem,
- struct nvmem_layout *layout)
+static int sl28vpd_add_cells(struct device *dev, struct nvmem_device *nvmem)
{
const struct nvmem_cell_info *pinfo;
struct nvmem_cell_info info = {0};
--- a/include/linux/nvmem-provider.h
+++ b/include/linux/nvmem-provider.h
@@ -156,9 +156,8 @@ struct nvmem_cell_table {
*
* @name: Layout name.
* @of_match_table: Open firmware match table.
- * @add_cells: Will be called if a nvmem device is found which
- * has this layout. The function will add layout
- * specific cells with nvmem_add_one_cell().
+ * @add_cells: Called to populate the layout using
+ * nvmem_add_one_cell().
* @fixup_cell_info: Will be called before a cell is added. Can be
* used to modify the nvmem_cell_info.
* @owner: Pointer to struct module.
@@ -172,8 +171,7 @@ struct nvmem_cell_table {
struct nvmem_layout {
const char *name;
const struct of_device_id *of_match_table;
- int (*add_cells)(struct device *dev, struct nvmem_device *nvmem,
- struct nvmem_layout *layout);
+ int (*add_cells)(struct device *dev, struct nvmem_device *nvmem);
void (*fixup_cell_info)(struct nvmem_device *nvmem,
struct nvmem_layout *layout,
struct nvmem_cell_info *cell);

View File

@ -1,169 +0,0 @@
From 1172460e716784ac7e1049a537bdca8edbf97360 Mon Sep 17 00:00:00 2001
From: Miquel Raynal <miquel.raynal@bootlin.com>
Date: Fri, 15 Dec 2023 11:15:31 +0000
Subject: [PATCH] nvmem: Move and rename ->fixup_cell_info()
This hook is meant to be used by any provider and instantiating a layout
just for this is useless. Let's instead move this hook to the nvmem
device and add it to the config structure to be easily shared by the
providers.
While at moving this hook, rename it ->fixup_dt_cell_info() to clarify
its main intended purpose.
Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
Link: https://lore.kernel.org/r/20231215111536.316972-6-srinivas.kandagatla@linaro.org
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
---
drivers/nvmem/core.c | 6 +++---
drivers/nvmem/imx-ocotp.c | 11 +++--------
drivers/nvmem/internals.h | 2 ++
drivers/nvmem/mtk-efuse.c | 11 +++--------
include/linux/nvmem-provider.h | 9 ++++-----
5 files changed, 15 insertions(+), 24 deletions(-)
--- a/drivers/nvmem/core.c
+++ b/drivers/nvmem/core.c
@@ -674,7 +674,6 @@ static int nvmem_validate_keepouts(struc
static int nvmem_add_cells_from_dt(struct nvmem_device *nvmem, struct device_node *np)
{
- struct nvmem_layout *layout = nvmem->layout;
struct device *dev = &nvmem->dev;
struct device_node *child;
const __be32 *addr;
@@ -704,8 +703,8 @@ static int nvmem_add_cells_from_dt(struc
info.np = of_node_get(child);
- if (layout && layout->fixup_cell_info)
- layout->fixup_cell_info(nvmem, layout, &info);
+ if (nvmem->fixup_dt_cell_info)
+ nvmem->fixup_dt_cell_info(nvmem, &info);
ret = nvmem_add_one_cell(nvmem, &info);
kfree(info.name);
@@ -894,6 +893,7 @@ struct nvmem_device *nvmem_register(cons
kref_init(&nvmem->refcnt);
INIT_LIST_HEAD(&nvmem->cells);
+ nvmem->fixup_dt_cell_info = config->fixup_dt_cell_info;
nvmem->owner = config->owner;
if (!nvmem->owner && config->dev->driver)
--- a/drivers/nvmem/imx-ocotp.c
+++ b/drivers/nvmem/imx-ocotp.c
@@ -583,17 +583,12 @@ static const struct of_device_id imx_oco
};
MODULE_DEVICE_TABLE(of, imx_ocotp_dt_ids);
-static void imx_ocotp_fixup_cell_info(struct nvmem_device *nvmem,
- struct nvmem_layout *layout,
- struct nvmem_cell_info *cell)
+static void imx_ocotp_fixup_dt_cell_info(struct nvmem_device *nvmem,
+ struct nvmem_cell_info *cell)
{
cell->read_post_process = imx_ocotp_cell_pp;
}
-static struct nvmem_layout imx_ocotp_layout = {
- .fixup_cell_info = imx_ocotp_fixup_cell_info,
-};
-
static int imx_ocotp_probe(struct platform_device *pdev)
{
struct device *dev = &pdev->dev;
@@ -619,7 +614,7 @@ static int imx_ocotp_probe(struct platfo
imx_ocotp_nvmem_config.size = 4 * priv->params->nregs;
imx_ocotp_nvmem_config.dev = dev;
imx_ocotp_nvmem_config.priv = priv;
- imx_ocotp_nvmem_config.layout = &imx_ocotp_layout;
+ imx_ocotp_nvmem_config.fixup_dt_cell_info = &imx_ocotp_fixup_dt_cell_info;
priv->config = &imx_ocotp_nvmem_config;
--- a/drivers/nvmem/internals.h
+++ b/drivers/nvmem/internals.h
@@ -23,6 +23,8 @@ struct nvmem_device {
struct bin_attribute eeprom;
struct device *base_dev;
struct list_head cells;
+ void (*fixup_dt_cell_info)(struct nvmem_device *nvmem,
+ struct nvmem_cell_info *cell);
const struct nvmem_keepout *keepout;
unsigned int nkeepout;
nvmem_reg_read_t reg_read;
--- a/drivers/nvmem/mtk-efuse.c
+++ b/drivers/nvmem/mtk-efuse.c
@@ -45,9 +45,8 @@ static int mtk_efuse_gpu_speedbin_pp(voi
return 0;
}
-static void mtk_efuse_fixup_cell_info(struct nvmem_device *nvmem,
- struct nvmem_layout *layout,
- struct nvmem_cell_info *cell)
+static void mtk_efuse_fixup_dt_cell_info(struct nvmem_device *nvmem,
+ struct nvmem_cell_info *cell)
{
size_t sz = strlen(cell->name);
@@ -61,10 +60,6 @@ static void mtk_efuse_fixup_cell_info(st
cell->read_post_process = mtk_efuse_gpu_speedbin_pp;
}
-static struct nvmem_layout mtk_efuse_layout = {
- .fixup_cell_info = mtk_efuse_fixup_cell_info,
-};
-
static int mtk_efuse_probe(struct platform_device *pdev)
{
struct device *dev = &pdev->dev;
@@ -91,7 +86,7 @@ static int mtk_efuse_probe(struct platfo
econfig.priv = priv;
econfig.dev = dev;
if (pdata->uses_post_processing)
- econfig.layout = &mtk_efuse_layout;
+ econfig.fixup_dt_cell_info = &mtk_efuse_fixup_dt_cell_info;
nvmem = devm_nvmem_register(dev, &econfig);
return PTR_ERR_OR_ZERO(nvmem);
--- a/include/linux/nvmem-provider.h
+++ b/include/linux/nvmem-provider.h
@@ -83,6 +83,8 @@ struct nvmem_cell_info {
* @cells: Optional array of pre-defined NVMEM cells.
* @ncells: Number of elements in cells.
* @add_legacy_fixed_of_cells: Read fixed NVMEM cells from old OF syntax.
+ * @fixup_dt_cell_info: Will be called before a cell is added. Can be
+ * used to modify the nvmem_cell_info.
* @keepout: Optional array of keepout ranges (sorted ascending by start).
* @nkeepout: Number of elements in the keepout array.
* @type: Type of the nvmem storage
@@ -113,6 +115,8 @@ struct nvmem_config {
const struct nvmem_cell_info *cells;
int ncells;
bool add_legacy_fixed_of_cells;
+ void (*fixup_dt_cell_info)(struct nvmem_device *nvmem,
+ struct nvmem_cell_info *cell);
const struct nvmem_keepout *keepout;
unsigned int nkeepout;
enum nvmem_type type;
@@ -158,8 +162,6 @@ struct nvmem_cell_table {
* @of_match_table: Open firmware match table.
* @add_cells: Called to populate the layout using
* nvmem_add_one_cell().
- * @fixup_cell_info: Will be called before a cell is added. Can be
- * used to modify the nvmem_cell_info.
* @owner: Pointer to struct module.
* @node: List node.
*
@@ -172,9 +174,6 @@ struct nvmem_layout {
const char *name;
const struct of_device_id *of_match_table;
int (*add_cells)(struct device *dev, struct nvmem_device *nvmem);
- void (*fixup_cell_info)(struct nvmem_device *nvmem,
- struct nvmem_layout *layout,
- struct nvmem_cell_info *cell);
/* private */
struct module *owner;

View File

@ -40,7 +40,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
}
memcpy(val, ((u8 *)p) + skipbytes, bytes);
@@ -157,8 +161,30 @@ static const struct ocotp_devtype_data i
@@ -179,8 +183,30 @@ static const struct ocotp_devtype_data i
},
};

View File

@ -23,7 +23,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net>
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -10989,7 +10989,8 @@ void free_netdev(struct net_device *dev)
@@ -11020,7 +11020,8 @@ void free_netdev(struct net_device *dev)
dev->xdp_bulkq = NULL;
/* Compatibility with error handling in drivers */

View File

@ -105,7 +105,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
help
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -3597,6 +3597,11 @@ static int xmit_one(struct sk_buff *skb,
@@ -3628,6 +3628,11 @@ static int xmit_one(struct sk_buff *skb,
if (dev_nit_active(dev))
dev_queue_xmit_nit(skb, dev);

View File

@ -31,7 +31,7 @@ Signe-off-by: Felix Fietkau <nbd@nbd.name>
static inline void gro_normal_list(struct napi_struct *napi)
--- a/include/net/tcp.h
+++ b/include/net/tcp.h
@@ -2084,7 +2084,10 @@ void tcp_v4_destroy_sock(struct sock *sk
@@ -2101,7 +2101,10 @@ void tcp_v4_destroy_sock(struct sock *sk
struct sk_buff *tcp_gso_segment(struct sk_buff *skb,
netdev_features_t features);

View File

@ -57,7 +57,7 @@ Signed-off-by: Bjorn Andersson <andersson@kernel.org>
static int __qcom_scm_set_dload_mode(struct device *dev, bool enable)
{
struct qcom_scm_desc desc = {
@@ -1473,6 +1496,13 @@ static int qcom_scm_probe(struct platfor
@@ -1474,6 +1497,13 @@ static int qcom_scm_probe(struct platfor
__get_convention();

View File

@ -15,7 +15,7 @@ Signed-off-by: Robert Marko <robimarko@gmail.com>
--- a/drivers/firmware/qcom_scm.c
+++ b/drivers/firmware/qcom_scm.c
@@ -1528,7 +1528,8 @@ static int qcom_scm_probe(struct platfor
@@ -1529,7 +1529,8 @@ static int qcom_scm_probe(struct platfor
static void qcom_scm_shutdown(struct platform_device *pdev)
{
/* Clean shutdown, disable download mode to allow normal restart */

View File

@ -85,8 +85,22 @@
reg = <5>;
compatible = "ethernet-phy-ieee802.3-c45";
/* LED0: Amber ; LED1: nc ; LED2: nc ; LED3: Green */
mxl,led-config = <0x3b0 0x0 0x0 0x3c0>;
leds {
#address-cells = <1>;
#size-cells = <0>;
led-0 {
reg = <0>;
color = <LED_COLOR_ID_AMBER>;
function = LED_FUNCTION_WAN;
};
led-3 {
reg = <3>;
color = <LED_COLOR_ID_GREEN>;
function = LED_FUNCTION_WAN;
};
};
};
};

View File

@ -186,8 +186,23 @@
reset-gpios = <&pio 6 GPIO_ACTIVE_LOW>;
reset-assert-us = <10000>;
reset-deassert-us = <10000>;
/* LED0: nc ; LED1: nc ; LED2: amber ; LED3: green */
mxl,led-config = <0x0 0x0 0x370 0x380>;
leds {
#address-cells = <1>;
#size-cells = <0>;
led-2 {
reg = <2>;
color = <LED_COLOR_ID_AMBER>;
function = LED_FUNCTION_WAN;
};
led-3 {
reg = <3>;
color = <LED_COLOR_ID_GREEN>;
function = LED_FUNCTION_WAN;
};
};
};
};

View File

@ -172,8 +172,23 @@
reset-gpios = <&pio 6 GPIO_ACTIVE_LOW>;
reset-assert-us = <10000>;
reset-deassert-us = <10000>;
/* LED0: nc ; LED1: nc ; LED2: amber ; LED3: green */
mxl,led-config = <0x0 0x0 0x370 0x380>;
leds {
#address-cells = <1>;
#size-cells = <0>;
led-2 {
reg = <2>;
color = <LED_COLOR_ID_AMBER>;
function = LED_FUNCTION_WAN;
};
led-3 {
reg = <3>;
color = <LED_COLOR_ID_GREEN>;
function = LED_FUNCTION_WAN;
};
};
};
};

View File

@ -146,16 +146,33 @@
compatible = "ethernet-phy-ieee802.3-c45";
reg = <5>;
mxl,led-drive-vdd;
mxl,led-config = <0x03f0 0x0 0x0 0x0>;
leds {
#address-cells = <1>;
#size-cells = <0>;
led-0 {
reg = <0>;
active-high;
color = <LED_COLOR_ID_WHITE>;
function = LED_FUNCTION_LAN;
};
};
};
phy6: phy@6 {
compatible = "ethernet-phy-ieee802.3-c45";
reg = <6>;
/* LED0: CONN (WAN white) */
mxl,led-config = <0x03f0 0x0 0x0 0x0>;
leds {
#address-cells = <1>;
#size-cells = <0>;
led-0 {
reg = <0>;
color = <LED_COLOR_ID_WHITE>;
function = LED_FUNCTION_WAN;
};
};
};
switch: switch@1f {

View File

@ -11,9 +11,18 @@ abt,asr3000)
ucidef_set_led_netdev "wlan2g" "WLAN2G" "green:wlan-2ghz" "phy0-ap0"
ucidef_set_led_netdev "wlan5g" "WLAN5G" "green:wlan-5ghz" "phy1-ap0"
;;
acer,predator-w6|\
acer,predator-w6d)
ucidef_set_led_netdev "internet" "INTERNET" "mdio-bus:06:amber:wan" "eth1" "link_10 link_100 link_1000 tx rx"
ucidef_set_led_netdev "internet" "INTERNET" "mdio-bus:06:green:wan" "eth1" "link_2500 tx rx"
;;
asus,tuf-ax4200)
ucidef_set_led_netdev "wan" "WAN" "mdio-bus:06:white:wan" "eth1" "link tx rx"
;;
asus,tuf-ax6000)
ucidef_set_led_netdev "lan5" "LAN5" "mdio-bus:05:white:lan" "lan5" "link tx rx"
ucidef_set_led_netdev "wan" "WAN" "mdio-bus:06:white:wan" "eth1" "link tx rx"
;;
bananapi,bpi-r3-mini)
ucidef_set_led_netdev "lan1" "LAN" "mdio-bus:0e:green:lan" "eth0" "link_2500 link_1000 tx rx"
ucidef_set_led_netdev "lan2" "LAN" "mdio-bus:0e:yellow:lan" "eth0" "link_2500 link_100 tx rx"
@ -161,6 +170,10 @@ zyxel,ex5601-t0-ubootmod)
ucidef_set_led_netdev "wifi-24g" "WIFI-2.4G" "green:wifi24g" "phy0-ap0" "link tx rx"
ucidef_set_led_netdev "wifi-5g" "WIFI-5G" "green:wifi5g" "phy1-ap0" "link tx rx"
;;
zyxel,nwa50ax-pro)
ucidef_set_led_netdev "uplink" "UPLINK" "mdio-bus:05:amber:wan" "eth0" "link_10 link_100 link_2500 tx rx"
ucidef_set_led_netdev "uplink" "UPLINK" "mdio-bus:05:green:wan" "eth0" "link_1000 link_2500 tx rx"
;;
esac
board_config_flush

View File

@ -0,0 +1,387 @@
/dts-v1/;
#include "ipq5018.dtsi"
#include "ipq5018-mx-base.dtsi"
/ {
model = "Linksys MR5500";
compatible = "linksys,mr5500", "qcom,ipq5018";
gpio-leds {
compatible = "gpio-leds";
usb {
color = <LED_COLOR_ID_BLUE>;
function = LED_FUNCTION_USB;
gpios = <&tlmm 19 GPIO_ACTIVE_HIGH>;
trigger-sources = <&usb_port1>;
linux,default-trigger = "usbport";
};
};
regulator_fixed_5p0: regulator-s0500 {
compatible = "regulator-fixed";
regulator-min-microvolt = <500000>;
regulator-max-microvolt = <500000>;
regulator-name = "fixed_5p0";
gpio = <&tlmm 17 GPIO_ACTIVE_LOW>;
};
};
/*
* ===============================================================
* _______________________ _______________________
* | IPQ5018 | | QCA8337 |
* | +------+ +--------+ | | +--------+ +------+ |
* | | MAC0 |---| GE Phy | | | | Phy0 |---| MAC1 | |
* | +------+ +--------+ | | +--------+ +------+ |
* | +------+ +--------+ | | +--------+ +------+ |
* | | MAC1 |---| Uniphy |-+-SGMII-+-| SerDes |---| MAC6 | |
* | +------+ +--------+ | | +--------+ +------+ |
* |_______________________| |_______________________|
*
* ===============================================================
*/
&switch {
status = "okay";
switch_mac_mode = <MAC_MODE_SGMII_CHANNEL0>;
qcom,port_phyinfo {
// MAC0 -> GE Phy
port@0 {
port_id = <1>;
mdiobus = <&mdio0>;
phy_address = <7>;
};
// MAC1 ---SGMII---> QCA8337 SerDes
port@1 {
port_id = <2>;
forced-speed = <1000>;
forced-duplex = <1>;
};
};
};
// MAC1 ---SGMII---> QCA8337 SerDes
&dp2 {
status = "okay";
nvmem-cells = <&hw_mac_addr 0>;
nvmem-cell-names = "mac-address";
fixed-link {
speed = <1000>;
full-duplex;
};
};
&mdio0 {
status = "okay";
};
&mdio1 {
status = "okay";
pinctrl-0 = <&mdio1_pins>;
pinctrl-names = "default";
reset-gpios = <&tlmm 39 GPIO_ACTIVE_LOW>;
switch1: ethernet-switch@17 {
compatible = "qca,qca8337";
reg = <17>;
#address-cells = <1>;
#size-cells = <0>;
ports {
#address-cells = <1>;
#size-cells = <0>;
port@1 {
reg = <1>;
label = "lan1";
phy-handle = <&qca8337_0>;
phy-mode = "internal";
leds {
#address-cells = <1>;
#size-cells = <0>;
led@0 {
reg = <0>;
color = <LED_COLOR_ID_GREEN>;
function = LED_FUNCTION_LAN;
default-state = "keep";
};
led@1 {
reg = <1>;
color = <LED_COLOR_ID_AMBER>;
function = LED_FUNCTION_LAN;
default-state = "keep";
};
};
};
port@2 {
reg = <2>;
label = "lan2";
phy-handle = <&qca8337_1>;
phy-mode = "internal";
leds {
#address-cells = <1>;
#size-cells = <0>;
led@0 {
reg = <0>;
color = <LED_COLOR_ID_GREEN>;
function = LED_FUNCTION_LAN;
default-state = "keep";
};
led@1 {
reg = <1>;
color = <LED_COLOR_ID_AMBER>;
function = LED_FUNCTION_LAN;
default-state = "keep";
};
};
};
port@3 {
reg = <3>;
label = "lan3";
phy-handle = <&qca8337_2>;
phy-mode = "internal";
leds {
#address-cells = <1>;
#size-cells = <0>;
led@0 {
reg = <0>;
color = <LED_COLOR_ID_GREEN>;
function = LED_FUNCTION_LAN;
default-state = "keep";
};
led@1 {
reg = <1>;
color = <LED_COLOR_ID_AMBER>;
function = LED_FUNCTION_LAN;
default-state = "keep";
};
};
};
port@4 {
reg = <4>;
label = "lan4";
phy-handle = <&qca8337_3>;
phy-mode = "internal";
leds {
#address-cells = <1>;
#size-cells = <0>;
led@0 {
reg = <0>;
color = <LED_COLOR_ID_GREEN>;
function = LED_FUNCTION_LAN;
default-state = "keep";
};
led@1 {
reg = <1>;
color = <LED_COLOR_ID_AMBER>;
function = LED_FUNCTION_LAN;
default-state = "keep";
};
};
};
port@5 {
reg = <5>;
label = "wan";
phy-handle = <&qca8337_4>;
phy-mode = "internal";
leds {
#address-cells = <1>;
#size-cells = <0>;
led@0 {
reg = <0>;
color = <LED_COLOR_ID_GREEN>;
function = LED_FUNCTION_WAN;
default-state = "keep";
};
led@1 {
reg = <1>;
color = <LED_COLOR_ID_AMBER>;
function = LED_FUNCTION_WAN;
default-state = "keep";
};
};
};
port@6 {
reg = <6>;
label = "cpu";
phy-mode = "sgmii";
ethernet = <&dp2>;
qca,sgmii-enable-pll;
fixed-link {
speed = <1000>;
full-duplex;
};
};
};
mdio {
#address-cells = <1>;
#size-cells = <0>;
// QCA8337 Phy0 -> LAN1
qca8337_0: ethernet-phy@0 {
reg = <0>;
};
// QCA8337 Phy1 -> LAN2
qca8337_1: ethernet-phy@1 {
reg = <1>;
};
// QCA8337 Phy2 -> LAN3
qca8337_2: ethernet-phy@2 {
reg = <2>;
};
// QCA8337 Phy3 -> LAN4
qca8337_3: ethernet-phy@3 {
reg = <3>;
};
// QCA8337 Phy4 -> WAN
qca8337_4: ethernet-phy@4 {
reg = <4>;
};
};
};
};
&usbphy0 {
status = "okay";
vdd-supply = <&regulator_fixed_5p0>;
};
&usb {
status = "okay";
vbus-supply = <&regulator_fixed_5p0>;
};
&usb_dwc {
address-cells = <1>;
#size-cells = <0>;
dr_mode = "host";
usb_port1: port@1 {
reg = <1>;
#trigger-source-cells = <0>;
};
};
&pcie0_phy {
status = "okay";
};
&pcie0 {
status = "okay";
perst-gpios = <&tlmm 15 GPIO_ACTIVE_LOW>;
bridge@0,0 {
reg = <0x00000000 0 0 0 0>;
#address-cells = <3>;
#size-cells = <2>;
ranges;
wifi@1,0 {
status = "okay";
/* QCN9074: ath11k lacks DT compatible for PCI cards */
compatible = "pci17cb,1104";
reg = <0x00010000 0 0 0 0>;
qcom,ath11k-calibration-variant = "Linksys-MR5500";
};
};
};
&q6v5_wcss {
status = "okay";
memory-region = <&q6_mem_regions>;
firmware-name = "ath11k/IPQ5018/hw1.0/q6_fw.mdt",
"ath11k/IPQ5018/hw1.0/m3_fw.mdt";
// IPQ5018
q6_wcss_pd1: pd-1 {
firmware-name = "ath11k/IPQ5018/hw1.0/q6_fw.mdt";
resets =
<&gcc GCC_WCSSAON_RESET>,
<&gcc GCC_WCSS_BCR>,
<&gcc GCC_CE_BCR>;
reset-names =
"wcss_aon_reset",
"wcss_reset",
"ce_reset";
clocks =
<&gcc GCC_WCSS_AHB_S_CLK>,
<&gcc GCC_WCSS_ACMT_CLK>,
<&gcc GCC_WCSS_AXI_M_CLK>;
clock-names =
"gcc_wcss_ahb_s_clk",
"gcc_wcss_acmt_clk",
"gcc_wcss_axi_m_clk";
interrupts-extended =
<&wcss_smp2p_in 8 0>,
<&wcss_smp2p_in 9 0>,
<&wcss_smp2p_in 12 0>,
<&wcss_smp2p_in 11 0>;
interrupt-names =
"fatal",
"ready",
"spawn-ack",
"stop-ack";
qcom,smem-states =
<&wcss_smp2p_out 8>,
<&wcss_smp2p_out 9>,
<&wcss_smp2p_out 10>;
qcom,smem-state-names =
"shutdown",
"stop",
"spawn";
};
};
&wifi0 {
// IPQ5018
qcom,rproc = <&q6_wcss_pd1>;
qcom,ath11k-calibration-variant = "Linksys-MR5500";
qcom,ath11k-fw-memory-mode = <2>;
qcom,bdf-addr = <0x4c400000>;
status = "okay";
};

View File

@ -11,6 +11,17 @@ define Device/linksys_ipq50xx_mx_base
IMAGE/factory.bin := append-kernel | pad-to $$$$(KERNEL_SIZE) | append-ubi | linksys-image type=$$$$(DEVICE_MODEL)
endef
define Device/linksys_mr5500
$(call Device/linksys_ipq50xx_mx_base)
DEVICE_MODEL := MR5500
DEVICE_DTS_CONFIG := config@mp03.1
DEVICE_PACKAGES := kmod-ath11k-pci \
ath11k-firmware-qcn9074 \
ipq-wifi-linksys_mr5500 \
kmod-usb-ledtrig-usbport
endef
TARGET_DEVICES += linksys_mr5500
define Device/linksys_mx2000
$(call Device/linksys_ipq50xx_mx_base)
DEVICE_MODEL := MX2000

View File

@ -0,0 +1,28 @@
#
# Copyright (C) 2015 OpenWrt.org
#
. /lib/functions/uci-defaults.sh
board_config_update
board=$(board_name)
case "$board" in
linksys,mr5500)
ucidef_set_led_netdev "lan1-port-link" "LAN1-PORT-LINK" "qca8k-0.0:00:green:lan" "lan1" "link_10 link_100 link_1000"
ucidef_set_led_netdev "lan1-port-activity" "LAN1-PORT-ACTIVITY" "qca8k-0.0:00:amber:lan" "lan1" "tx rx"
ucidef_set_led_netdev "lan2-port-link" "LAN2-PORT-LINK" "qca8k-0.0:01:green:lan" "lan2" "link_10 link_100 link_1000"
ucidef_set_led_netdev "lan2-port-activity" "LAN2-PORT-ACTIVITY" "qca8k-0.0:01:amber:lan" "lan2" "tx rx"
ucidef_set_led_netdev "lan3-port-link" "LAN3-PORT-LINK" "qca8k-0.0:02:green:lan" "lan3" "link_10 link_100 link_1000"
ucidef_set_led_netdev "lan3-port-activity" "LAN3-PORT-ACTIVITY" "qca8k-0.0:02:amber:lan" "lan3" "tx rx"
ucidef_set_led_netdev "lan4-port-link" "LAN4-PORT-LINK" "qca8k-0.0:03:green:lan" "lan4" "link_10 link_100 link_1000"
ucidef_set_led_netdev "lan4-port-activity" "LAN4-PORT-ACTIVITY" "qca8k-0.0:03:amber:lan" "lan4" "tx rx"
ucidef_set_led_netdev "wan-port-link" "WAN-PORT-LINK" "qca8k-0.0:04:green:wan" "wan" "link_10 link_100 link_1000"
ucidef_set_led_netdev "wan-port-activity" "WAN-PORT-ACTIVITY" "qca8k-0.0:04:amber:wan" "wan" "tx rx"
;;
esac
board_config_flush
exit 0

View File

@ -7,6 +7,9 @@ ipq50xx_setup_interfaces()
{
local board="$1"
case $board in
linksys,mr5500)
ucidef_set_interfaces_lan_wan "lan1 lan2 lan3 lan4" "wan"
;;
linksys,mx2000|\
linksys,mx5500|\
linksys,spnmx56)

View File

@ -9,6 +9,7 @@ board=$(board_name)
case "$FIRMWARE" in
"ath11k/IPQ5018/hw1.0/cal-ahb-c000000.wifi.bin")
case "$board" in
linksys,mr5500|\
linksys,mx2000|\
linksys,mx5500|\
linksys,spnmx56)
@ -33,6 +34,7 @@ case "$FIRMWARE" in
;;
"ath11k/QCN9074/hw1.0/cal-pci-0001:01:00.0.bin")
case "$board" in
linksys,mr5500|\
linksys,mx5500|\
linksys,spnmx56)
caldata_extract "0:ART" 0x26800 0x20000

View File

@ -4,6 +4,7 @@ START=99
boot() {
case $(board_name) in
linksys,mr5500|\
linksys,mx2000|\
linksys,mx5500|\
linksys,spnmx56)

View File

@ -71,6 +71,7 @@ platform_check_image() {
platform_do_upgrade() {
case "$(board_name)" in
linksys,mr5500|\
linksys,mx2000|\
linksys,mx5500|\
linksys,spnmx56)

View File

@ -7,6 +7,7 @@ CONFIG_MTD_SPI_NAND=y
CONFIG_NET_DEVLINK=y
CONFIG_NET_DSA=y
CONFIG_NET_DSA_QCA8K=y
CONFIG_NET_DSA_QCA8K_LEDS_SUPPORT=y
CONFIG_NET_DSA_TAG_QCA=y
CONFIG_PHYLINK=y
CONFIG_PHY_QCOM_M31_USB=y

View File

@ -57,7 +57,7 @@ Signed-off-by: Bjorn Andersson <andersson@kernel.org>
static int __qcom_scm_set_dload_mode(struct device *dev, bool enable)
{
struct qcom_scm_desc desc = {
@@ -1473,6 +1496,13 @@ static int qcom_scm_probe(struct platfor
@@ -1474,6 +1497,13 @@ static int qcom_scm_probe(struct platfor
__get_convention();

View File

@ -234,7 +234,7 @@ Signed-off-by: John Crispin <blogic@openwrt.org>
/* Format flags */
#define UVC_FMT_FLAG_COMPRESSED 0x00000001
@@ -587,6 +589,7 @@ struct uvc_device {
@@ -591,6 +593,7 @@ struct uvc_device {
struct input_dev *input;
char input_phys[64];

View File

@ -2,10 +2,34 @@
#include "rtl8380_netgear_gigabit.dtsi"
#include <dt-bindings/leds/common.h>
/ {
compatible = "netgear,gs310tp-v1", "realtek,rtl838x-soc";
model = "Netgear GS310TP v1";
aliases {
led-boot = &led_power_green;
led-failsafe = &led_power_amber;
led-running = &led_power_green;
led-upgrade = &led_power_amber;
};
leds {
compatible = "gpio-leds";
led_power_amber: led-0 {
color = <LED_COLOR_ID_AMBER>;
function = LED_FUNCTION_POWER;
gpios = <&gpio1 32 GPIO_ACTIVE_LOW>;
};
led_power_green: led-1 {
color = <LED_COLOR_ID_GREEN>;
function = LED_FUNCTION_POWER;
gpios = <&gpio1 31 GPIO_ACTIVE_LOW>;
};
};
};
&gpio1 {

View File

@ -17,7 +17,6 @@
compatible = "gpio-leds";
led_power: led-0 {
label = "green:power";
color = <LED_COLOR_ID_GREEN>;
function = LED_FUNCTION_POWER;
gpios = <&gpio0 9 GPIO_ACTIVE_HIGH>;

View File

@ -1,29 +0,0 @@
From bc9111d1b82684123e6c48817c04d0f8a08669bf Mon Sep 17 00:00:00 2001
From: Tianling Shen <cnsztl@gmail.com>
Date: Sun, 19 Jan 2025 16:24:10 +0800
Subject: [PATCH] arm64: dts: rockchip: change eth phy mode to rgmii-id for
orangepi r1 plus lts
In general the delay should be added by the PHY instead of the MAC,
and this improves network stability on some boards which seem to
need different delay.
Fixes: 387b3bbac5ea ("arm64: dts: rockchip: Add Xunlong OrangePi R1 Plus LTS")
Cc: stable@vger.kernel.org # 6.6+
Signed-off-by: Tianling Shen <cnsztl@gmail.com>
---
arch/arm64/boot/dts/rockchip/rk3328-orangepi-r1-plus-lts.dts | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
--- a/arch/arm64/boot/dts/rockchip/rk3328-orangepi-r1-plus-lts.dts
+++ b/arch/arm64/boot/dts/rockchip/rk3328-orangepi-r1-plus-lts.dts
@@ -16,8 +16,7 @@
&gmac2io {
phy-handle = <&yt8531c>;
- tx_delay = <0x19>;
- rx_delay = <0x05>;
+ phy-mode = "rgmii-id";
mdio {
/delete-node/ ethernet-phy@1;

View File

@ -64,7 +64,7 @@ Signed-off-by: David Bauer <mail@david-bauer.net>
--- a/arch/arm64/boot/dts/rockchip/rk3328-orangepi-r1-plus-lts.dts
+++ b/arch/arm64/boot/dts/rockchip/rk3328-orangepi-r1-plus-lts.dts
@@ -30,6 +30,7 @@
@@ -33,6 +33,7 @@
motorcomm,keep-pll-enabled;
motorcomm,rx-clk-drv-microamp = <5020>;
motorcomm,rx-data-drv-microamp = <5020>;
@ -72,7 +72,7 @@ Signed-off-by: David Bauer <mail@david-bauer.net>
pinctrl-0 = <&eth_phy_reset_pin>;
pinctrl-names = "default";
@@ -39,3 +40,7 @@
@@ -42,3 +43,7 @@
};
};
};

View File

@ -96,8 +96,8 @@ Signed-off-by: hmz007 <hmz007@gmail.com>
+};
+
&gmac2io {
phy-handle = <&yt8531c>;
phy-mode = "rgmii-id";
/delete-property/ tx_delay;
/delete-property/ rx_delay;
--- a/arch/arm64/boot/dts/rockchip/rk3328-roc-cc.dts
+++ b/arch/arm64/boot/dts/rockchip/rk3328-roc-cc.dts
@@ -134,6 +134,64 @@