* [PATCH bpf-next 3/5] samples/bpf: convert xdp_sample_pkts_user to perf_buffer API
From: Andrii Nakryiko @ 2019-07-23 4:31 UTC (permalink / raw)
To: bpf, netdev, ast, daniel; +Cc: andrii.nakryiko, kernel-team, Andrii Nakryiko
In-Reply-To: <20190723043112.3145810-1-andriin@fb.com>
Convert xdp_sample_pkts_user to libbpf's perf_buffer API.
Signed-off-by: Andrii Nakryiko <andriin@fb.com>
---
samples/bpf/xdp_sample_pkts_user.c | 61 +++++++++---------------------
1 file changed, 17 insertions(+), 44 deletions(-)
diff --git a/samples/bpf/xdp_sample_pkts_user.c b/samples/bpf/xdp_sample_pkts_user.c
index dc66345a929a..3002714e3cd5 100644
--- a/samples/bpf/xdp_sample_pkts_user.c
+++ b/samples/bpf/xdp_sample_pkts_user.c
@@ -17,14 +17,13 @@
#include <linux/if_link.h>
#include "perf-sys.h"
-#include "trace_helpers.h"
#define MAX_CPUS 128
-static int pmu_fds[MAX_CPUS], if_idx;
-static struct perf_event_mmap_page *headers[MAX_CPUS];
+static int if_idx;
static char *if_name;
static __u32 xdp_flags = XDP_FLAGS_UPDATE_IF_NOEXIST;
static __u32 prog_id;
+static struct perf_buffer *pb = NULL;
static int do_attach(int idx, int fd, const char *name)
{
@@ -73,7 +72,7 @@ static int do_detach(int idx, const char *name)
#define SAMPLE_SIZE 64
-static int print_bpf_output(void *data, int size)
+static void print_bpf_output(void *ctx, int cpu, void *data, __u32 size)
{
struct {
__u16 cookie;
@@ -83,45 +82,20 @@ static int print_bpf_output(void *data, int size)
int i;
if (e->cookie != 0xdead) {
- printf("BUG cookie %x sized %d\n",
- e->cookie, size);
- return LIBBPF_PERF_EVENT_ERROR;
+ printf("BUG cookie %x sized %d\n", e->cookie, size);
+ return;
}
printf("Pkt len: %-5d bytes. Ethernet hdr: ", e->pkt_len);
for (i = 0; i < 14 && i < e->pkt_len; i++)
printf("%02x ", e->pkt_data[i]);
printf("\n");
-
- return LIBBPF_PERF_EVENT_CONT;
-}
-
-static void test_bpf_perf_event(int map_fd, int num)
-{
- struct perf_event_attr attr = {
- .sample_type = PERF_SAMPLE_RAW,
- .type = PERF_TYPE_SOFTWARE,
- .config = PERF_COUNT_SW_BPF_OUTPUT,
- .wakeup_events = 1, /* get an fd notification for every event */
- };
- int i;
-
- for (i = 0; i < num; i++) {
- int key = i;
-
- pmu_fds[i] = sys_perf_event_open(&attr, -1/*pid*/, i/*cpu*/,
- -1/*group_fd*/, 0);
-
- assert(pmu_fds[i] >= 0);
- assert(bpf_map_update_elem(map_fd, &key,
- &pmu_fds[i], BPF_ANY) == 0);
- ioctl(pmu_fds[i], PERF_EVENT_IOC_ENABLE, 0);
- }
}
static void sig_handler(int signo)
{
do_detach(if_idx, if_name);
+ perf_buffer__free(pb);
exit(0);
}
@@ -140,13 +114,13 @@ int main(int argc, char **argv)
struct bpf_prog_load_attr prog_load_attr = {
.prog_type = BPF_PROG_TYPE_XDP,
};
+ struct perf_buffer_opts pb_opts = {};
const char *optstr = "F";
int prog_fd, map_fd, opt;
struct bpf_object *obj;
struct bpf_map *map;
char filename[256];
- int ret, err, i;
- int numcpus;
+ int ret, err;
while ((opt = getopt(argc, argv, optstr)) != -1) {
switch (opt) {
@@ -169,10 +143,6 @@ int main(int argc, char **argv)
return 1;
}
- numcpus = get_nprocs();
- if (numcpus > MAX_CPUS)
- numcpus = MAX_CPUS;
-
snprintf(filename, sizeof(filename), "%s_kern.o", argv[0]);
prog_load_attr.file = filename;
@@ -211,14 +181,17 @@ int main(int argc, char **argv)
return 1;
}
- test_bpf_perf_event(map_fd, numcpus);
+ pb_opts.sample_cb = print_bpf_output;
+ pb = perf_buffer__new(map_fd, 8, &pb_opts);
+ err = libbpf_get_error(pb);
+ if (err) {
+ perror("perf_buffer setup failed");
+ return 1;
+ }
- for (i = 0; i < numcpus; i++)
- if (perf_event_mmap_header(pmu_fds[i], &headers[i]) < 0)
- return 1;
+ while ((ret = perf_buffer__poll(pb, 1000)) >= 0) {
+ }
- ret = perf_event_poller_multi(pmu_fds, headers, numcpus,
- print_bpf_output);
kill(0, SIGINT);
return ret;
}
--
2.17.1
^ permalink raw reply related
* [PATCH bpf-next 2/5] selftests/bpf: switch test_tcpnotify to perf_buffer API
From: Andrii Nakryiko @ 2019-07-23 4:31 UTC (permalink / raw)
To: bpf, netdev, ast, daniel; +Cc: andrii.nakryiko, kernel-team, Andrii Nakryiko
In-Reply-To: <20190723043112.3145810-1-andriin@fb.com>
Switch test_tcpnotify test to use libbpf's perf_buffer API instead of
re-implementing portion of it.
Signed-off-by: Andrii Nakryiko <andriin@fb.com>
---
.../selftests/bpf/test_tcpnotify_user.c | 90 ++++++++-----------
1 file changed, 36 insertions(+), 54 deletions(-)
diff --git a/tools/testing/selftests/bpf/test_tcpnotify_user.c b/tools/testing/selftests/bpf/test_tcpnotify_user.c
index 86152d9ae95b..f9765ddf0761 100644
--- a/tools/testing/selftests/bpf/test_tcpnotify_user.c
+++ b/tools/testing/selftests/bpf/test_tcpnotify_user.c
@@ -17,6 +17,7 @@
#include <linux/rtnetlink.h>
#include <signal.h>
#include <linux/perf_event.h>
+#include <linux/err.h>
#include "bpf_rlimit.h"
#include "bpf_util.h"
@@ -30,28 +31,34 @@
pthread_t tid;
int rx_callbacks;
-static int dummyfn(void *data, int size)
+static void dummyfn(void *ctx, int cpu, void *data, __u32 size)
{
struct tcp_notifier *t = data;
if (t->type != 0xde || t->subtype != 0xad ||
t->source != 0xbe || t->hash != 0xef)
- return 1;
+ return;
rx_callbacks++;
- return 0;
}
-void tcp_notifier_poller(int fd)
+void tcp_notifier_poller(struct perf_buffer *pb)
{
- while (1)
- perf_event_poller(fd, dummyfn);
+ int err;
+
+ while (1) {
+ err = perf_buffer__poll(pb, 100);
+ if (err < 0 && err != -EINTR) {
+ printf("failed perf_buffer__poll: %d\n", err);
+ return;
+ }
+ }
}
static void *poller_thread(void *arg)
{
- int fd = *(int *)arg;
+ struct perf_buffer *pb = arg;
- tcp_notifier_poller(fd);
+ tcp_notifier_poller(pb);
return arg;
}
@@ -60,52 +67,20 @@ int verify_result(const struct tcpnotify_globals *result)
return (result->ncalls > 0 && result->ncalls == rx_callbacks ? 0 : 1);
}
-static int bpf_find_map(const char *test, struct bpf_object *obj,
- const char *name)
-{
- struct bpf_map *map;
-
- map = bpf_object__find_map_by_name(obj, name);
- if (!map) {
- printf("%s:FAIL:map '%s' not found\n", test, name);
- return -1;
- }
- return bpf_map__fd(map);
-}
-
-static int setup_bpf_perf_event(int mapfd)
-{
- struct perf_event_attr attr = {
- .sample_type = PERF_SAMPLE_RAW,
- .type = PERF_TYPE_SOFTWARE,
- .config = PERF_COUNT_SW_BPF_OUTPUT,
- };
- int key = 0;
- int pmu_fd;
-
- pmu_fd = syscall(__NR_perf_event_open, &attr, -1, 0, -1, 0);
- if (pmu_fd < 0)
- return pmu_fd;
- bpf_map_update_elem(mapfd, &key, &pmu_fd, BPF_ANY);
-
- ioctl(pmu_fd, PERF_EVENT_IOC_ENABLE, 0);
- return pmu_fd;
-}
-
int main(int argc, char **argv)
{
const char *file = "test_tcpnotify_kern.o";
- int prog_fd, map_fd, perf_event_fd;
+ struct bpf_map *perf_map, *global_map;
+ struct perf_buffer_opts pb_opts = {};
struct tcpnotify_globals g = {0};
+ struct perf_buffer *pb = NULL;
const char *cg_path = "/foo";
+ int prog_fd, rv, cg_fd = -1;
int error = EXIT_FAILURE;
struct bpf_object *obj;
- int cg_fd = -1;
- __u32 key = 0;
- int rv;
char test_script[80];
- int pmu_fd;
cpu_set_t cpuset;
+ __u32 key = 0;
CPU_ZERO(&cpuset);
CPU_SET(0, &cpuset);
@@ -133,19 +108,24 @@ int main(int argc, char **argv)
goto err;
}
- perf_event_fd = bpf_find_map(__func__, obj, "perf_event_map");
- if (perf_event_fd < 0)
+ perf_map = bpf_object__find_map_by_name(obj, "perf_event_map");
+ if (!perf_map) {
+ printf("FAIL:map '%s' not found\n", "perf_event_map");
goto err;
+ }
- map_fd = bpf_find_map(__func__, obj, "global_map");
- if (map_fd < 0)
- goto err;
+ global_map = bpf_object__find_map_by_name(obj, "global_map");
+ if (!global_map) {
+ printf("FAIL:map '%s' not found\n", "global_map");
+ return -1;
+ }
- pmu_fd = setup_bpf_perf_event(perf_event_fd);
- if (pmu_fd < 0 || perf_event_mmap(pmu_fd) < 0)
+ pb_opts.sample_cb = dummyfn;
+ pb = perf_buffer__new(bpf_map__fd(perf_map), 8, &pb_opts);
+ if (IS_ERR(pb))
goto err;
- pthread_create(&tid, NULL, poller_thread, (void *)&pmu_fd);
+ pthread_create(&tid, NULL, poller_thread, pb);
sprintf(test_script,
"iptables -A INPUT -p tcp --dport %d -j DROP",
@@ -162,7 +142,7 @@ int main(int argc, char **argv)
TESTPORT);
system(test_script);
- rv = bpf_map_lookup_elem(map_fd, &key, &g);
+ rv = bpf_map_lookup_elem(bpf_map__fd(global_map), &key, &g);
if (rv != 0) {
printf("FAILED: bpf_map_lookup_elem returns %d\n", rv);
goto err;
@@ -182,5 +162,7 @@ int main(int argc, char **argv)
bpf_prog_detach(cg_fd, BPF_CGROUP_SOCK_OPS);
close(cg_fd);
cleanup_cgroup_environment();
+ if (!IS_ERR_OR_NULL(pb))
+ perf_buffer__free(pb);
return error;
}
--
2.17.1
^ permalink raw reply related
* [PATCH bpf-next 5/5] selftests/bpf: remove perf buffer helpers
From: Andrii Nakryiko @ 2019-07-23 4:31 UTC (permalink / raw)
To: bpf, netdev, ast, daniel; +Cc: andrii.nakryiko, kernel-team, Andrii Nakryiko
In-Reply-To: <20190723043112.3145810-1-andriin@fb.com>
libbpf's perf_buffer API supersedes trace_helper.h's helpers.
Remove those helpers after all existing users were already moved to
perf_buffer API.
Signed-off-by: Andrii Nakryiko <andriin@fb.com>
---
tools/testing/selftests/bpf/trace_helpers.c | 125 --------------------
tools/testing/selftests/bpf/trace_helpers.h | 9 --
2 files changed, 134 deletions(-)
diff --git a/tools/testing/selftests/bpf/trace_helpers.c b/tools/testing/selftests/bpf/trace_helpers.c
index b47f205f0310..7f989b3e4e22 100644
--- a/tools/testing/selftests/bpf/trace_helpers.c
+++ b/tools/testing/selftests/bpf/trace_helpers.c
@@ -86,128 +86,3 @@ long ksym_get_addr(const char *name)
return 0;
}
-
-static int page_size;
-static int page_cnt = 8;
-static struct perf_event_mmap_page *header;
-
-int perf_event_mmap_header(int fd, struct perf_event_mmap_page **header)
-{
- void *base;
- int mmap_size;
-
- page_size = getpagesize();
- mmap_size = page_size * (page_cnt + 1);
-
- base = mmap(NULL, mmap_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
- if (base == MAP_FAILED) {
- printf("mmap err\n");
- return -1;
- }
-
- *header = base;
- return 0;
-}
-
-int perf_event_mmap(int fd)
-{
- return perf_event_mmap_header(fd, &header);
-}
-
-static int perf_event_poll(int fd)
-{
- struct pollfd pfd = { .fd = fd, .events = POLLIN };
-
- return poll(&pfd, 1, 1000);
-}
-
-struct perf_event_sample {
- struct perf_event_header header;
- __u32 size;
- char data[];
-};
-
-static enum bpf_perf_event_ret
-bpf_perf_event_print(struct perf_event_header *hdr, void *private_data)
-{
- struct perf_event_sample *e = (struct perf_event_sample *)hdr;
- perf_event_print_fn fn = private_data;
- int ret;
-
- if (e->header.type == PERF_RECORD_SAMPLE) {
- ret = fn(e->data, e->size);
- if (ret != LIBBPF_PERF_EVENT_CONT)
- return ret;
- } else if (e->header.type == PERF_RECORD_LOST) {
- struct {
- struct perf_event_header header;
- __u64 id;
- __u64 lost;
- } *lost = (void *) e;
- printf("lost %lld events\n", lost->lost);
- } else {
- printf("unknown event type=%d size=%d\n",
- e->header.type, e->header.size);
- }
-
- return LIBBPF_PERF_EVENT_CONT;
-}
-
-int perf_event_poller(int fd, perf_event_print_fn output_fn)
-{
- enum bpf_perf_event_ret ret;
- void *buf = NULL;
- size_t len = 0;
-
- for (;;) {
- perf_event_poll(fd);
- ret = bpf_perf_event_read_simple(header, page_cnt * page_size,
- page_size, &buf, &len,
- bpf_perf_event_print,
- output_fn);
- if (ret != LIBBPF_PERF_EVENT_CONT)
- break;
- }
- free(buf);
-
- return ret;
-}
-
-int perf_event_poller_multi(int *fds, struct perf_event_mmap_page **headers,
- int num_fds, perf_event_print_fn output_fn)
-{
- enum bpf_perf_event_ret ret;
- struct pollfd *pfds;
- void *buf = NULL;
- size_t len = 0;
- int i;
-
- pfds = calloc(num_fds, sizeof(*pfds));
- if (!pfds)
- return LIBBPF_PERF_EVENT_ERROR;
-
- for (i = 0; i < num_fds; i++) {
- pfds[i].fd = fds[i];
- pfds[i].events = POLLIN;
- }
-
- for (;;) {
- poll(pfds, num_fds, 1000);
- for (i = 0; i < num_fds; i++) {
- if (!pfds[i].revents)
- continue;
-
- ret = bpf_perf_event_read_simple(headers[i],
- page_cnt * page_size,
- page_size, &buf, &len,
- bpf_perf_event_print,
- output_fn);
- if (ret != LIBBPF_PERF_EVENT_CONT)
- break;
- }
- }
- free(buf);
- free(pfds);
-
- return ret;
-}
diff --git a/tools/testing/selftests/bpf/trace_helpers.h b/tools/testing/selftests/bpf/trace_helpers.h
index 18924f23db1b..aa4dcfe18050 100644
--- a/tools/testing/selftests/bpf/trace_helpers.h
+++ b/tools/testing/selftests/bpf/trace_helpers.h
@@ -3,7 +3,6 @@
#define __TRACE_HELPER_H
#include <libbpf.h>
-#include <linux/perf_event.h>
struct ksym {
long addr;
@@ -14,12 +13,4 @@ int load_kallsyms(void);
struct ksym *ksym_search(long key);
long ksym_get_addr(const char *name);
-typedef enum bpf_perf_event_ret (*perf_event_print_fn)(void *data, int size);
-
-int perf_event_mmap(int fd);
-int perf_event_mmap_header(int fd, struct perf_event_mmap_page **header);
-/* return LIBBPF_PERF_EVENT_DONE or LIBBPF_PERF_EVENT_ERROR */
-int perf_event_poller(int fd, perf_event_print_fn output_fn);
-int perf_event_poller_multi(int *fds, struct perf_event_mmap_page **headers,
- int num_fds, perf_event_print_fn output_fn);
#endif
--
2.17.1
^ permalink raw reply related
* [PATCH bpf-next 4/5] samples/bpf: switch trace_output sample to perf_buffer API
From: Andrii Nakryiko @ 2019-07-23 4:31 UTC (permalink / raw)
To: bpf, netdev, ast, daniel; +Cc: andrii.nakryiko, kernel-team, Andrii Nakryiko
In-Reply-To: <20190723043112.3145810-1-andriin@fb.com>
Convert trace_output sample to libbpf's perf_buffer API.
Signed-off-by: Andrii Nakryiko <andriin@fb.com>
---
samples/bpf/trace_output_user.c | 43 +++++++++++----------------------
1 file changed, 14 insertions(+), 29 deletions(-)
diff --git a/samples/bpf/trace_output_user.c b/samples/bpf/trace_output_user.c
index 2dd1d39b152a..8ee47699a870 100644
--- a/samples/bpf/trace_output_user.c
+++ b/samples/bpf/trace_output_user.c
@@ -18,9 +18,6 @@
#include <libbpf.h>
#include "bpf_load.h"
#include "perf-sys.h"
-#include "trace_helpers.h"
-
-static int pmu_fd;
static __u64 time_get_ns(void)
{
@@ -31,12 +28,12 @@ static __u64 time_get_ns(void)
}
static __u64 start_time;
+static __u64 cnt;
#define MAX_CNT 100000ll
-static int print_bpf_output(void *data, int size)
+static void print_bpf_output(void *ctx, int cpu, void *data, __u32 size)
{
- static __u64 cnt;
struct {
__u64 pid;
__u64 cookie;
@@ -45,7 +42,7 @@ static int print_bpf_output(void *data, int size)
if (e->cookie != 0x12345678) {
printf("BUG pid %llx cookie %llx sized %d\n",
e->pid, e->cookie, size);
- return LIBBPF_PERF_EVENT_ERROR;
+ return;
}
cnt++;
@@ -53,30 +50,14 @@ static int print_bpf_output(void *data, int size)
if (cnt == MAX_CNT) {
printf("recv %lld events per sec\n",
MAX_CNT * 1000000000ll / (time_get_ns() - start_time));
- return LIBBPF_PERF_EVENT_DONE;
+ return;
}
-
- return LIBBPF_PERF_EVENT_CONT;
-}
-
-static void test_bpf_perf_event(void)
-{
- struct perf_event_attr attr = {
- .sample_type = PERF_SAMPLE_RAW,
- .type = PERF_TYPE_SOFTWARE,
- .config = PERF_COUNT_SW_BPF_OUTPUT,
- };
- int key = 0;
-
- pmu_fd = sys_perf_event_open(&attr, -1/*pid*/, 0/*cpu*/, -1/*group_fd*/, 0);
-
- assert(pmu_fd >= 0);
- assert(bpf_map_update_elem(map_fd[0], &key, &pmu_fd, BPF_ANY) == 0);
- ioctl(pmu_fd, PERF_EVENT_IOC_ENABLE, 0);
}
int main(int argc, char **argv)
{
+ struct perf_buffer_opts pb_opts = {};
+ struct perf_buffer *pb;
char filename[256];
FILE *f;
int ret;
@@ -88,16 +69,20 @@ int main(int argc, char **argv)
return 1;
}
- test_bpf_perf_event();
-
- if (perf_event_mmap(pmu_fd) < 0)
+ pb_opts.sample_cb = print_bpf_output;
+ pb = perf_buffer__new(map_fd[0], 8, &pb_opts);
+ ret = libbpf_get_error(pb);
+ if (ret) {
+ printf("failed to setup perf_buffer: %d\n", ret);
return 1;
+ }
f = popen("taskset 1 dd if=/dev/zero of=/dev/null", "r");
(void) f;
start_time = time_get_ns();
- ret = perf_event_poller(pmu_fd, print_bpf_output);
+ while ((ret = perf_buffer__poll(pb, 1000)) >= 0 && cnt < MAX_CNT) {
+ }
kill(0, SIGINT);
return ret;
}
--
2.17.1
^ permalink raw reply related
* Re: [PATCH 3/3] net/xdp: convert put_page() to put_user_page*()
From: John Hubbard @ 2019-07-23 4:41 UTC (permalink / raw)
To: Ira Weiny, john.hubbard
Cc: Andrew Morton, Alexander Viro, Björn Töpel,
Boaz Harrosh, Christoph Hellwig, Daniel Vetter, Dan Williams,
Dave Chinner, David Airlie, David S . Miller, Ilya Dryomov,
Jan Kara, Jason Gunthorpe, Jens Axboe, Jérôme Glisse,
Johannes Thumshirn, Magnus Karlsson, Matthew Wilcox,
Miklos Szeredi, Ming Lei, Sage Weil, Santosh Shilimkar, Yan Zheng,
netdev, dri-devel, linux-mm, linux-rdma, bpf, LKML
In-Reply-To: <20190723002534.GA10284@iweiny-DESK2.sc.intel.com>
On 7/22/19 5:25 PM, Ira Weiny wrote:
> On Mon, Jul 22, 2019 at 03:34:15PM -0700, john.hubbard@gmail.com wrote:
>> From: John Hubbard <jhubbard@nvidia.com>
>>
>> For pages that were retained via get_user_pages*(), release those pages
>> via the new put_user_page*() routines, instead of via put_page() or
>> release_pages().
>>
>> This is part a tree-wide conversion, as described in commit fc1d8e7cca2d
>> ("mm: introduce put_user_page*(), placeholder versions").
>>
>> Cc: Björn Töpel <bjorn.topel@intel.com>
>> Cc: Magnus Karlsson <magnus.karlsson@intel.com>
>> Cc: David S. Miller <davem@davemloft.net>
>> Cc: netdev@vger.kernel.org
>> Signed-off-by: John Hubbard <jhubbard@nvidia.com>
>> ---
>> net/xdp/xdp_umem.c | 9 +--------
>> 1 file changed, 1 insertion(+), 8 deletions(-)
>>
>> diff --git a/net/xdp/xdp_umem.c b/net/xdp/xdp_umem.c
>> index 83de74ca729a..0325a17915de 100644
>> --- a/net/xdp/xdp_umem.c
>> +++ b/net/xdp/xdp_umem.c
>> @@ -166,14 +166,7 @@ void xdp_umem_clear_dev(struct xdp_umem *umem)
>>
>> static void xdp_umem_unpin_pages(struct xdp_umem *umem)
>> {
>> - unsigned int i;
>> -
>> - for (i = 0; i < umem->npgs; i++) {
>> - struct page *page = umem->pgs[i];
>> -
>> - set_page_dirty_lock(page);
>> - put_page(page);
>> - }
>> + put_user_pages_dirty_lock(umem->pgs, umem->npgs);
>
> What is the difference between this and
>
> __put_user_pages(umem->pgs, umem->npgs, PUP_FLAGS_DIRTY_LOCK);
>
> ?
No difference.
>
> I'm a bit concerned with adding another form of the same interface. We should
> either have 1 call with flags (enum in this case) or multiple calls. Given the
> previous discussion lets move in the direction of having the enum but don't
> introduce another caller of the "old" interface.
I disagree that this is a "problem". There is no maintenance pitfall here; there
are merely two ways to call the put_user_page*() API. Both are correct, and
neither one will get you into trouble.
Not only that, but there is ample precedent for this approach in other
kernel APIs.
>
> So I think on this patch NAK from me.
>
> I also don't like having a __* call in the exported interface but there is a
> __get_user_pages_fast() call so I guess there is precedent. :-/
>
I thought about this carefully, and looked at other APIs. And I noticed that
things like __get_user_pages*() are how it's often done:
* The leading underscores are often used for the more elaborate form of the
call (as oppposed to decorating the core function name with "_flags", for
example).
* There are often calls in which you can either call the simpler form, or the
form with flags and additional options, and yes, you'll get the same result.
Obviously, this stuff is all subject to a certain amount of opinion, but I
think I'm on really solid ground as far as precedent goes. So I'm pushing
back on the NAK... :)
thanks,
--
John Hubbard
NVIDIA
^ permalink raw reply
* [Patch net] ife: error out when nla attributes are empty
From: Cong Wang @ 2019-07-23 4:43 UTC (permalink / raw)
To: netdev; +Cc: Cong Wang, syzbot+fbb5b288c9cb6a2eeac4, Jamal Hadi Salim,
Jiri Pirko
act_ife at least requires TCA_IFE_PARMS, so we have to bail out
when there is no attribute passed in.
Reported-by: syzbot+fbb5b288c9cb6a2eeac4@syzkaller.appspotmail.com
Fixes: ef6980b6becb ("introduce IFE action")
Cc: Jamal Hadi Salim <jhs@mojatatu.com>
Cc: Jiri Pirko <jiri@resnulli.us>
Signed-off-by: Cong Wang <xiyou.wangcong@gmail.com>
---
net/sched/act_ife.c | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/net/sched/act_ife.c b/net/sched/act_ife.c
index 41d5398dd2f2..3578196d1600 100644
--- a/net/sched/act_ife.c
+++ b/net/sched/act_ife.c
@@ -481,6 +481,11 @@ static int tcf_ife_init(struct net *net, struct nlattr *nla,
int ret = 0;
int err;
+ if (!nla) {
+ NL_SET_ERR_MSG_MOD(extack, "IFE requires attributes to be passed");
+ return -EINVAL;
+ }
+
err = nla_parse_nested_deprecated(tb, TCA_IFE_MAX, nla, ife_policy,
NULL);
if (err < 0)
--
2.21.0
^ permalink raw reply related
* Re: [PATCH 1/3] mm/gup: introduce __put_user_pages()
From: Christoph Hellwig @ 2019-07-23 5:53 UTC (permalink / raw)
To: john.hubbard
Cc: Andrew Morton, Alexander Viro, Björn Töpel,
Boaz Harrosh, Christoph Hellwig, Daniel Vetter, Dan Williams,
Dave Chinner, David Airlie, David S . Miller, Ilya Dryomov,
Jan Kara, Jason Gunthorpe, Jens Axboe, Jérôme Glisse,
Johannes Thumshirn, Magnus Karlsson, Matthew Wilcox,
Miklos Szeredi, Ming Lei, Sage Weil, Santosh Shilimkar, Yan Zheng,
netdev, dri-devel, linux-mm, linux-rdma, bpf, LKML, John Hubbard
In-Reply-To: <20190722223415.13269-2-jhubbard@nvidia.com>
On Mon, Jul 22, 2019 at 03:34:13PM -0700, john.hubbard@gmail.com wrote:
> +enum pup_flags_t {
> + PUP_FLAGS_CLEAN = 0,
> + PUP_FLAGS_DIRTY = 1,
> + PUP_FLAGS_LOCK = 2,
> + PUP_FLAGS_DIRTY_LOCK = 3,
> +};
Well, the enum defeats the ease of just being able to pass a boolean
expression to the function, which would simplify a lot of the caller,
so if we need to support the !locked version I'd rather see that as
a separate helper.
But do we actually have callers where not using the _lock version is
not a bug? set_page_dirty makes sense in the context of a file systems
that have a reference to the inode the page hangs off, but that is
(almost?) never the case for get_user_pages.
^ permalink raw reply
* AW: [PATCH 3/3] uio: remove netx driver
From: Michael Trensch @ 2019-07-23 5:45 UTC (permalink / raw)
To: Arnd Bergmann, Greg Kroah-Hartman
Cc: netdev@vger.kernel.org, linux-serial@vger.kernel.org,
tglx@linutronix.de, davem@davemloft.net, Sascha Hauer,
Linus Walleij, Robert Schwebel, linux-kernel@vger.kernel.org
In-Reply-To: <20190722191552.252805-3-arnd@arndb.de>
The "uio_netx" driver is not used in conjunction with the removed netX SoC support.
It is used to handle netX-Based PCI(e) cards (https://www.hilscher.com/products/product-groups/pc-cards/) plugged into a PC or any kind of embedded hardware.
So a removal of this driver would render those extension cards unusable in future.
--
Michael Trensch | netX System
Phone: +49 (0) 6190 9907-0 | Fax: +49 (0) 6190 9907-50 | mtrensch@hilscher.com
> -----Ursprüngliche Nachricht-----
> Von: Arnd Bergmann <arnd@arndb.de>
> Gesendet: Montag, 22. Juli 2019 21:15
> An: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
> Cc: netdev@vger.kernel.org; linux-serial@vger.kernel.org; tglx@linutronix.de;
> davem@davemloft.net; Sascha Hauer <s.hauer@pengutronix.de>; Michael
> Trensch <MTrensch@hilscher.com>; Linus Walleij <linus.walleij@linaro.org>;
> Robert Schwebel <r.schwebel@pengutronix.de>; Arnd Bergmann
> <arnd@arndb.de>; linux-kernel@vger.kernel.org
> Betreff: [PATCH 3/3] uio: remove netx driver
>
> The netx platform got removed, so this driver is now useless.
>
> Signed-off-by: Arnd Bergmann <arnd@arndb.de>
> ---
> drivers/uio/Kconfig | 11 ---
> drivers/uio/Makefile | 1 -
> drivers/uio/uio_netx.c | 178 -----------------------------------------
> 3 files changed, 190 deletions(-)
> delete mode 100644 drivers/uio/uio_netx.c
>
> diff --git a/drivers/uio/Kconfig b/drivers/uio/Kconfig index
> 202ee81cfc2b..abc8dd97b474 100644
> --- a/drivers/uio/Kconfig
> +++ b/drivers/uio/Kconfig
> @@ -94,17 +94,6 @@ config UIO_PCI_GENERIC
> primarily, for virtualization scenarios.
> If you compile this as a module, it will be called uio_pci_generic.
>
> -config UIO_NETX
> -tristate "Hilscher NetX Card driver"
> -depends on PCI
> -help
> - Driver for Hilscher NetX based fieldbus cards (cifX, comX).
> - This driver requires a userspace component that comes with the card
> - or is available from Hilscher (http://www.hilscher.com).
> -
> - To compile this driver as a module, choose M here; the module
> - will be called uio_netx.
> -
> config UIO_FSL_ELBC_GPCM
> tristate "eLBC/GPCM driver"
> depends on FSL_LBC
> diff --git a/drivers/uio/Makefile b/drivers/uio/Makefile index
> c285dd2a4539..d94012263a42 100644
> --- a/drivers/uio/Makefile
> +++ b/drivers/uio/Makefile
> @@ -6,7 +6,6 @@ obj-$(CONFIG_UIO_DMEM_GENIRQ)+=
> uio_dmem_genirq.o
> obj-$(CONFIG_UIO_AEC)+= uio_aec.o
> obj-$(CONFIG_UIO_SERCOS3)+= uio_sercos3.o
> obj-$(CONFIG_UIO_PCI_GENERIC)+= uio_pci_generic.o
> -obj-$(CONFIG_UIO_NETX)+= uio_netx.o
> obj-$(CONFIG_UIO_PRUSS) += uio_pruss.o
> obj-$(CONFIG_UIO_MF624) += uio_mf624.o
> obj-$(CONFIG_UIO_FSL_ELBC_GPCM)+= uio_fsl_elbc_gpcm.o
> diff --git a/drivers/uio/uio_netx.c b/drivers/uio/uio_netx.c deleted file mode
> 100644 index 9ae29ffde410..000000000000
> --- a/drivers/uio/uio_netx.c
> +++ /dev/null
> @@ -1,178 +0,0 @@
> -// SPDX-License-Identifier: GPL-2.0
> -/*
> - * UIO driver for Hilscher NetX based fieldbus cards (cifX, comX).
> - * See http://www.hilscher.com for details.
> - *
> - * (C) 2007 Hans J. Koch <hjk@hansjkoch.de>
> - * (C) 2008 Manuel Traut <manut@linutronix.de>
> - *
> - */
> -
> -#include <linux/device.h>
> -#include <linux/io.h>
> -#include <linux/module.h>
> -#include <linux/pci.h>
> -#include <linux/slab.h>
> -#include <linux/uio_driver.h>
> -
> -#define PCI_VENDOR_ID_HILSCHER0x15CF
> -#define PCI_DEVICE_ID_HILSCHER_NETX0x0000
> -#define PCI_DEVICE_ID_HILSCHER_NETPLC0x0010
> -#define PCI_SUBDEVICE_ID_NETPLC_RAM0x0000
> -#define PCI_SUBDEVICE_ID_NETPLC_FLASH0x0001
> -#define PCI_SUBDEVICE_ID_NXSB_PCA0x3235
> -#define PCI_SUBDEVICE_ID_NXPCA0x3335
> -
> -#define DPM_HOST_INT_EN00xfff0
> -#define DPM_HOST_INT_STAT00xffe0
> -
> -#define DPM_HOST_INT_MASK0xe600ffff
> -#define DPM_HOST_INT_GLOBAL_EN0x80000000
> -
> -static irqreturn_t netx_handler(int irq, struct uio_info *dev_info) -{
> -void __iomem *int_enable_reg = dev_info->mem[0].internal_addr
> -+ DPM_HOST_INT_EN0;
> -void __iomem *int_status_reg = dev_info->mem[0].internal_addr
> -+ DPM_HOST_INT_STAT0;
> -
> -/* Is one of our interrupts enabled and active ? */
> -if (!(ioread32(int_enable_reg) & ioread32(int_status_reg)
> -& DPM_HOST_INT_MASK))
> -return IRQ_NONE;
> -
> -/* Disable interrupt */
> -iowrite32(ioread32(int_enable_reg) & ~DPM_HOST_INT_GLOBAL_EN,
> -int_enable_reg);
> -return IRQ_HANDLED;
> -}
> -
> -static int netx_pci_probe(struct pci_dev *dev,
> -const struct pci_device_id *id)
> -{
> -struct uio_info *info;
> -int bar;
> -
> -info = kzalloc(sizeof(struct uio_info), GFP_KERNEL);
> -if (!info)
> -return -ENOMEM;
> -
> -if (pci_enable_device(dev))
> -goto out_free;
> -
> -if (pci_request_regions(dev, "netx"))
> -goto out_disable;
> -
> -switch (id->device) {
> -case PCI_DEVICE_ID_HILSCHER_NETX:
> -bar = 0;
> -info->name = "netx";
> -break;
> -case PCI_DEVICE_ID_HILSCHER_NETPLC:
> -bar = 0;
> -info->name = "netplc";
> -break;
> -default:
> -bar = 2;
> -info->name = "netx_plx";
> -}
> -
> -/* BAR0 or 2 points to the card's dual port memory */
> -info->mem[0].addr = pci_resource_start(dev, bar);
> -if (!info->mem[0].addr)
> -goto out_release;
> -info->mem[0].internal_addr = ioremap(pci_resource_start(dev, bar),
> -pci_resource_len(dev, bar));
> -
> -if (!info->mem[0].internal_addr)
> -goto out_release;
> -
> -info->mem[0].size = pci_resource_len(dev, bar);
> -info->mem[0].memtype = UIO_MEM_PHYS;
> -info->irq = dev->irq;
> -info->irq_flags = IRQF_SHARED;
> -info->handler = netx_handler;
> -info->version = "0.0.1";
> -
> -/* Make sure all interrupts are disabled */
> -iowrite32(0, info->mem[0].internal_addr + DPM_HOST_INT_EN0);
> -
> -if (uio_register_device(&dev->dev, info))
> -goto out_unmap;
> -
> -pci_set_drvdata(dev, info);
> -dev_info(&dev->dev, "Found %s card, registered UIO device.\n",
> -info->name);
> -
> -return 0;
> -
> -out_unmap:
> -iounmap(info->mem[0].internal_addr);
> -out_release:
> -pci_release_regions(dev);
> -out_disable:
> -pci_disable_device(dev);
> -out_free:
> -kfree(info);
> -return -ENODEV;
> -}
> -
> -static void netx_pci_remove(struct pci_dev *dev) -{
> -struct uio_info *info = pci_get_drvdata(dev);
> -
> -/* Disable all interrupts */
> -iowrite32(0, info->mem[0].internal_addr + DPM_HOST_INT_EN0);
> -uio_unregister_device(info);
> -pci_release_regions(dev);
> -pci_disable_device(dev);
> -iounmap(info->mem[0].internal_addr);
> -
> -kfree(info);
> -}
> -
> -static struct pci_device_id netx_pci_ids[] = {
> -{
> -.vendor =PCI_VENDOR_ID_HILSCHER,
> -.device =PCI_DEVICE_ID_HILSCHER_NETX,
> -.subvendor =0,
> -.subdevice =0,
> -},
> -{
> -.vendor = PCI_VENDOR_ID_HILSCHER,
> -.device = PCI_DEVICE_ID_HILSCHER_NETPLC,
> -.subvendor = PCI_VENDOR_ID_HILSCHER,
> -.subdevice = PCI_SUBDEVICE_ID_NETPLC_RAM,
> -},
> -{
> -.vendor = PCI_VENDOR_ID_HILSCHER,
> -.device = PCI_DEVICE_ID_HILSCHER_NETPLC,
> -.subvendor = PCI_VENDOR_ID_HILSCHER,
> -.subdevice = PCI_SUBDEVICE_ID_NETPLC_FLASH,
> -},
> -{
> -.vendor =PCI_VENDOR_ID_PLX,
> -.device =PCI_DEVICE_ID_PLX_9030,
> -.subvendor =PCI_VENDOR_ID_PLX,
> -.subdevice =PCI_SUBDEVICE_ID_NXSB_PCA,
> -},
> -{
> -.vendor =PCI_VENDOR_ID_PLX,
> -.device =PCI_DEVICE_ID_PLX_9030,
> -.subvendor =PCI_VENDOR_ID_PLX,
> -.subdevice =PCI_SUBDEVICE_ID_NXPCA,
> -},
> -{ 0, }
> -};
> -
> -static struct pci_driver netx_pci_driver = {
> -.name = "netx",
> -.id_table = netx_pci_ids,
> -.probe = netx_pci_probe,
> -.remove = netx_pci_remove,
> -};
> -
> -module_pci_driver(netx_pci_driver);
> -MODULE_DEVICE_TABLE(pci, netx_pci_ids); -MODULE_LICENSE("GPL v2"); -
> MODULE_AUTHOR("Hans J. Koch, Manuel Traut");
> --
> 2.20.0
Hilscher Gesellschaft für Systemautomation mbH | Rheinstrasse 15 | 65795 Hattersheim | Germany | www.hilscher.com<http://www.hilscher.com>
Sitz der Gesellschaft / place of business: Hattersheim | Geschäftsführer / managing director: Dipl.-Ing. Hans-Jürgen Hilscher
Handelsregister / commercial register: Frankfurt B 26873 | Ust. Idnr. / VAT No.: DE113852715
Registergericht / register court: Amtsgericht Frankfurt/Main
Important Information:
This e-mail message including its attachments contains confidential and legally protected information solely intended for the addressee. If you are not the intended addressee of this message, please contact the addresser immediately and delete this message including its attachments. The unauthorized dissemination, copying and change of this e-mail are strictly forbidden. The addresser shall not be liable for the content of such changed e-mails.
Wichtiger Hinweis:
Diese E-Mail einschließlich ihrer Anhänge enthält vertrauliche und rechtlich geschützte Informationen, die nur für den Adressaten bestimmt sind. Sollten Sie nicht der bezeichnete Adressat sein, so teilen Sie dies bitte dem Absender umgehend mit und löschen Sie diese Nachricht und ihre Anhänge. Die unbefugte Weitergabe, das Anfertigen von Kopien und jede Veränderung der E-Mail ist untersagt. Der Absender haftet nicht für Inhalte von veränderten E-Mails.
^ permalink raw reply
* [PATCH net-next] qlge: Move drivers/net/ethernet/qlogic/qlge/ to drivers/staging/qlge/
From: Benjamin Poirier @ 2019-07-23 6:14 UTC (permalink / raw)
To: David Miller; +Cc: Greg Kroah-Hartman, Manish Chopra, GR-Linux-NIC-Dev, netdev
The hardware has been declared EOL by the vendor more than 5 years ago.
What's more relevant to the Linux kernel is that the quality of this driver
is not on par with many other mainline drivers.
Cc: Manish Chopra <manishc@marvell.com>
Message-id: <20190617074858.32467-1-bpoirier@suse.com>
Signed-off-by: Benjamin Poirier <bpoirier@suse.com>
---
Documentation/PCI/pci-error-recovery.rst | 1 -
MAINTAINERS | 2 +-
drivers/net/ethernet/qlogic/Kconfig | 9 ----
drivers/net/ethernet/qlogic/Makefile | 1 -
drivers/staging/Kconfig | 2 +
drivers/staging/Makefile | 1 +
drivers/staging/qlge/Kconfig | 10 ++++
.../ethernet/qlogic => staging}/qlge/Makefile | 0
drivers/staging/qlge/TODO | 46 +++++++++++++++++++
.../ethernet/qlogic => staging}/qlge/qlge.h | 0
.../qlogic => staging}/qlge/qlge_dbg.c | 0
.../qlogic => staging}/qlge/qlge_ethtool.c | 0
.../qlogic => staging}/qlge/qlge_main.c | 0
.../qlogic => staging}/qlge/qlge_mpi.c | 0
14 files changed, 60 insertions(+), 12 deletions(-)
create mode 100644 drivers/staging/qlge/Kconfig
rename drivers/{net/ethernet/qlogic => staging}/qlge/Makefile (100%)
create mode 100644 drivers/staging/qlge/TODO
rename drivers/{net/ethernet/qlogic => staging}/qlge/qlge.h (100%)
rename drivers/{net/ethernet/qlogic => staging}/qlge/qlge_dbg.c (100%)
rename drivers/{net/ethernet/qlogic => staging}/qlge/qlge_ethtool.c (100%)
rename drivers/{net/ethernet/qlogic => staging}/qlge/qlge_main.c (100%)
rename drivers/{net/ethernet/qlogic => staging}/qlge/qlge_mpi.c (100%)
diff --git a/Documentation/PCI/pci-error-recovery.rst b/Documentation/PCI/pci-error-recovery.rst
index 83db42092935..7e30f43a9659 100644
--- a/Documentation/PCI/pci-error-recovery.rst
+++ b/Documentation/PCI/pci-error-recovery.rst
@@ -421,4 +421,3 @@ That is, the recovery API only requires that:
- drivers/net/ixgbe
- drivers/net/cxgb3
- drivers/net/s2io.c
- - drivers/net/qlge
diff --git a/MAINTAINERS b/MAINTAINERS
index 783569e3c4b4..9bca7781d67e 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -13217,7 +13217,7 @@ M: Manish Chopra <manishc@marvell.com>
M: GR-Linux-NIC-Dev@marvell.com
L: netdev@vger.kernel.org
S: Supported
-F: drivers/net/ethernet/qlogic/qlge/
+F: drivers/staging/qlge/
QM1D1B0004 MEDIA DRIVER
M: Akihiro Tsukada <tskd08@gmail.com>
diff --git a/drivers/net/ethernet/qlogic/Kconfig b/drivers/net/ethernet/qlogic/Kconfig
index a391cf6ee4b2..55a29ec76680 100644
--- a/drivers/net/ethernet/qlogic/Kconfig
+++ b/drivers/net/ethernet/qlogic/Kconfig
@@ -66,15 +66,6 @@ config QLCNIC_HWMON
This data is available via the hwmon sysfs interface.
-config QLGE
- tristate "QLogic QLGE 10Gb Ethernet Driver Support"
- depends on PCI
- ---help---
- This driver supports QLogic ISP8XXX 10Gb Ethernet cards.
-
- To compile this driver as a module, choose M here: the module
- will be called qlge.
-
config NETXEN_NIC
tristate "NetXen Multi port (1/10) Gigabit Ethernet NIC"
depends on PCI
diff --git a/drivers/net/ethernet/qlogic/Makefile b/drivers/net/ethernet/qlogic/Makefile
index 6cd2e333a5fc..1ae4a0743bd5 100644
--- a/drivers/net/ethernet/qlogic/Makefile
+++ b/drivers/net/ethernet/qlogic/Makefile
@@ -5,7 +5,6 @@
obj-$(CONFIG_QLA3XXX) += qla3xxx.o
obj-$(CONFIG_QLCNIC) += qlcnic/
-obj-$(CONFIG_QLGE) += qlge/
obj-$(CONFIG_NETXEN_NIC) += netxen/
obj-$(CONFIG_QED) += qed/
obj-$(CONFIG_QEDE)+= qede/
diff --git a/drivers/staging/Kconfig b/drivers/staging/Kconfig
index 7c96a01eef6c..0b8a614be11e 100644
--- a/drivers/staging/Kconfig
+++ b/drivers/staging/Kconfig
@@ -120,4 +120,6 @@ source "drivers/staging/kpc2000/Kconfig"
source "drivers/staging/isdn/Kconfig"
+source "drivers/staging/qlge/Kconfig"
+
endif # STAGING
diff --git a/drivers/staging/Makefile b/drivers/staging/Makefile
index fcaac9693b83..741152511a10 100644
--- a/drivers/staging/Makefile
+++ b/drivers/staging/Makefile
@@ -50,3 +50,4 @@ obj-$(CONFIG_EROFS_FS) += erofs/
obj-$(CONFIG_FIELDBUS_DEV) += fieldbus/
obj-$(CONFIG_KPC2000) += kpc2000/
obj-$(CONFIG_ISDN_CAPI) += isdn/
+obj-$(CONFIG_QLGE) += qlge/
diff --git a/drivers/staging/qlge/Kconfig b/drivers/staging/qlge/Kconfig
new file mode 100644
index 000000000000..ae9ed2c5300b
--- /dev/null
+++ b/drivers/staging/qlge/Kconfig
@@ -0,0 +1,10 @@
+# SPDX-License-Identifier: GPL-2.0
+
+config QLGE
+ tristate "QLogic QLGE 10Gb Ethernet Driver Support"
+ depends on PCI
+ help
+ This driver supports QLogic ISP8XXX 10Gb Ethernet cards.
+
+ To compile this driver as a module, choose M here. The module will be
+ called qlge.
diff --git a/drivers/net/ethernet/qlogic/qlge/Makefile b/drivers/staging/qlge/Makefile
similarity index 100%
rename from drivers/net/ethernet/qlogic/qlge/Makefile
rename to drivers/staging/qlge/Makefile
diff --git a/drivers/staging/qlge/TODO b/drivers/staging/qlge/TODO
new file mode 100644
index 000000000000..51c509084e80
--- /dev/null
+++ b/drivers/staging/qlge/TODO
@@ -0,0 +1,46 @@
+* reception stalls permanently (until admin intervention) if the rx buffer
+ queues become empty because of allocation failures (ex. under memory
+ pressure)
+* commit 7c734359d350 ("qlge: Size RX buffers based on MTU.", v2.6.33-rc1)
+ introduced dead code in the receive routines, which should be rewritten
+ anyways by the admission of the author himself, see the comment above
+ ql_build_rx_skb(). That function is now used exclusively to handle packets
+ that underwent header splitting but it still contains code to handle non
+ split cases.
+* truesize accounting is incorrect (ex: a 9000B frame has skb->truesize 10280
+ while containing two frags of order-1 allocations, ie. >16K)
+* while in that area, using two 8k buffers to store one 9k frame is a poor
+ choice of buffer size.
+* in the "chain of large buffers" case, the driver uses an skb allocated with
+ head room but only puts data in the frags.
+* rename "rx" queues to "completion" queues. Calling tx completion queues "rx
+ queues" is confusing.
+* struct rx_ring is used for rx and tx completions, with some members relevant
+ to one case only
+* there is an inordinate amount of disparate debugging code, most of which is
+ of questionable value. In particular, qlge_dbg.c has hundreds of lines of
+ code bitrotting away in ifdef land (doesn't compile since commit
+ 18c49b91777c ("qlge: do vlan cleanup", v3.1-rc1), 8 years ago).
+* triggering an ethtool regdump will hexdump a 176k struct to dmesg depending
+ on some module parameters.
+* the flow control implementation in firmware is buggy (sends a flood of pause
+ frames, resets the link, device and driver buffer queues become
+ desynchronized), disable it by default
+* some structures are initialized redundantly (ex. memset 0 after
+ alloc_etherdev())
+* the driver has a habit of using runtime checks where compile time checks are
+ possible (ex. ql_free_rx_buffers(), ql_alloc_rx_buffers())
+* reorder struct members to avoid holes if it doesn't impact performance
+* in terms of namespace, the driver uses either qlge_, ql_ (used by
+ other qlogic drivers, with clashes, ex: ql_sem_spinlock) or nothing (with
+ clashes, ex: struct ob_mac_iocb_req). Rename everything to use the "qlge_"
+ prefix.
+* avoid legacy/deprecated apis (ex. replace pci_dma_*, replace pci_enable_msi,
+ use pci_iomap)
+* some "while" loops could be rewritten with simple "for", ex.
+ ql_wait_reg_rdy(), ql_start_rx_ring())
+* remove duplicate and useless comments
+* fix weird line wrapping (all over, ex. the ql_set_routing_reg() calls in
+ qlge_set_multicast_list()).
+* fix weird indentation (all over, ex. the for loops in qlge_get_stats())
+* fix checkpatch issues
diff --git a/drivers/net/ethernet/qlogic/qlge/qlge.h b/drivers/staging/qlge/qlge.h
similarity index 100%
rename from drivers/net/ethernet/qlogic/qlge/qlge.h
rename to drivers/staging/qlge/qlge.h
diff --git a/drivers/net/ethernet/qlogic/qlge/qlge_dbg.c b/drivers/staging/qlge/qlge_dbg.c
similarity index 100%
rename from drivers/net/ethernet/qlogic/qlge/qlge_dbg.c
rename to drivers/staging/qlge/qlge_dbg.c
diff --git a/drivers/net/ethernet/qlogic/qlge/qlge_ethtool.c b/drivers/staging/qlge/qlge_ethtool.c
similarity index 100%
rename from drivers/net/ethernet/qlogic/qlge/qlge_ethtool.c
rename to drivers/staging/qlge/qlge_ethtool.c
diff --git a/drivers/net/ethernet/qlogic/qlge/qlge_main.c b/drivers/staging/qlge/qlge_main.c
similarity index 100%
rename from drivers/net/ethernet/qlogic/qlge/qlge_main.c
rename to drivers/staging/qlge/qlge_main.c
diff --git a/drivers/net/ethernet/qlogic/qlge/qlge_mpi.c b/drivers/staging/qlge/qlge_mpi.c
similarity index 100%
rename from drivers/net/ethernet/qlogic/qlge/qlge_mpi.c
rename to drivers/staging/qlge/qlge_mpi.c
--
2.22.0
^ permalink raw reply related
* [net-next:master 13/14] drivers/net/ethernet/faraday/ftgmac100.c:777:13: error: 'skb_frag_t {aka struct bio_vec}' has no member named 'size'
From: kbuild test robot @ 2019-07-23 6:22 UTC (permalink / raw)
To: Matthew Wilcox (Oracle); +Cc: kbuild-all, netdev
[-- Attachment #1: Type: text/plain, Size: 152482 bytes --]
tree: https://kernel.googlesource.com/pub/scm/linux/kernel/git/davem/net-next.git master
head: d5c3a62d0bb9b763e9378fe8f4cd79502e16cce8
commit: 8842d285bafa9ff7719f4107b6545a11dcd41995 [13/14] net: Convert skb_frag_t to bio_vec
config: m68k-allyesconfig (attached as .config)
compiler: m68k-linux-gcc (GCC) 7.4.0
reproduce:
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
git checkout 8842d285bafa9ff7719f4107b6545a11dcd41995
# save the attached .config to linux build tree
GCC_VERSION=7.4.0 make.cross ARCH=m68k
If you fix the issue, kindly add following tag
Reported-by: kbuild test robot <lkp@intel.com>
All errors (new ones prefixed by >>):
drivers/net/ethernet/faraday/ftgmac100.c: In function 'ftgmac100_hard_start_xmit':
>> drivers/net/ethernet/faraday/ftgmac100.c:777:13: error: 'skb_frag_t {aka struct bio_vec}' has no member named 'size'
len = frag->size;
^~
vim +777 drivers/net/ethernet/faraday/ftgmac100.c
05690d633f309d7 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12 701
0a715156656bddf drivers/net/ethernet/faraday/ftgmac100.c YueHaibing 2018-09-26 702 static netdev_tx_t ftgmac100_hard_start_xmit(struct sk_buff *skb,
43b25ee712f72ec drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 703 struct net_device *netdev)
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 704 {
43b25ee712f72ec drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 705 struct ftgmac100 *priv = netdev_priv(netdev);
6db7470445f0757 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 706 struct ftgmac100_txdes *txdes, *first;
6db7470445f0757 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 707 unsigned int pointer, nfrags, len, i, j;
52c0cae8746513e drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 708 u32 f_ctl_stat, ctl_stat, csum_vlan;
43b25ee712f72ec drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 709 dma_addr_t map;
43b25ee712f72ec drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 710
9b0f7711d92bf44 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 711 /* The HW doesn't pad small frames */
9b0f7711d92bf44 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 712 if (eth_skb_pad(skb)) {
9b0f7711d92bf44 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 713 netdev->stats.tx_dropped++;
9b0f7711d92bf44 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 714 return NETDEV_TX_OK;
9b0f7711d92bf44 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 715 }
9b0f7711d92bf44 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 716
9b0f7711d92bf44 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 717 /* Reject oversize packets */
43b25ee712f72ec drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 718 if (unlikely(skb->len > MAX_PKT_SIZE)) {
43b25ee712f72ec drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 719 if (net_ratelimit())
43b25ee712f72ec drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 720 netdev_dbg(netdev, "tx packet too big\n");
3e427a3363edbc8 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 721 goto drop;
43b25ee712f72ec drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 722 }
43b25ee712f72ec drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 723
6db7470445f0757 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 724 /* Do we have a limit on #fragments ? I yet have to get a reply
6db7470445f0757 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 725 * from Aspeed. If there's one I haven't hit it.
6db7470445f0757 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 726 */
6db7470445f0757 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 727 nfrags = skb_shinfo(skb)->nr_frags;
6db7470445f0757 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 728
6db7470445f0757 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 729 /* Get header len */
6db7470445f0757 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 730 len = skb_headlen(skb);
6db7470445f0757 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 731
6db7470445f0757 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 732 /* Map the packet head */
6db7470445f0757 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 733 map = dma_map_single(priv->dev, skb->data, len, DMA_TO_DEVICE);
6db7470445f0757 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 734 if (dma_mapping_error(priv->dev, map)) {
43b25ee712f72ec drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 735 if (net_ratelimit())
6db7470445f0757 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 736 netdev_err(netdev, "map tx packet head failed\n");
3e427a3363edbc8 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 737 goto drop;
43b25ee712f72ec drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 738 }
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 739
83617317d2136ca drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 740 /* Grab the next free tx descriptor */
83617317d2136ca drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 741 pointer = priv->tx_pointer;
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12 742 txdes = first = &priv->txdes[pointer];
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 743
52c0cae8746513e drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 744 /* Setup it up with the packet head. Don't write the head to the
52c0cae8746513e drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 745 * ring just yet
52c0cae8746513e drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 746 */
83617317d2136ca drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 747 priv->tx_skbs[pointer] = skb;
52c0cae8746513e drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 748 f_ctl_stat = ftgmac100_base_tx_ctlstat(priv, pointer);
52c0cae8746513e drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 749 f_ctl_stat |= FTGMAC100_TXDES0_TXDMA_OWN;
52c0cae8746513e drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 750 f_ctl_stat |= FTGMAC100_TXDES0_TXBUF_SIZE(len);
52c0cae8746513e drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 751 f_ctl_stat |= FTGMAC100_TXDES0_FTS;
52c0cae8746513e drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 752 if (nfrags == 0)
52c0cae8746513e drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 753 f_ctl_stat |= FTGMAC100_TXDES0_LTS;
52c0cae8746513e drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 754 txdes->txdes3 = cpu_to_le32(map);
6db7470445f0757 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 755
6db7470445f0757 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 756 /* Setup HW checksumming */
52c0cae8746513e drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 757 csum_vlan = 0;
05690d633f309d7 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12 758 if (skb->ip_summed == CHECKSUM_PARTIAL &&
05690d633f309d7 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12 759 !ftgmac100_prep_tx_csum(skb, &csum_vlan))
05690d633f309d7 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12 760 goto drop;
0fb9968876c3866 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 761
0fb9968876c3866 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 762 /* Add VLAN tag */
0fb9968876c3866 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 763 if (skb_vlan_tag_present(skb)) {
0fb9968876c3866 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 764 csum_vlan |= FTGMAC100_TXDES1_INS_VLANTAG;
0fb9968876c3866 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 765 csum_vlan |= skb_vlan_tag_get(skb) & 0xffff;
0fb9968876c3866 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 766 }
0fb9968876c3866 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 767
52c0cae8746513e drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 768 txdes->txdes1 = cpu_to_le32(csum_vlan);
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 769
6db7470445f0757 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 770 /* Next descriptor */
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12 771 pointer = ftgmac100_next_tx_pointer(priv, pointer);
6db7470445f0757 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 772
6db7470445f0757 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 773 /* Add the fragments */
6db7470445f0757 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 774 for (i = 0; i < nfrags; i++) {
6db7470445f0757 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 775 skb_frag_t *frag = &skb_shinfo(skb)->frags[i];
6db7470445f0757 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 776
6db7470445f0757 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 @777 len = frag->size;
6db7470445f0757 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 778
6db7470445f0757 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 779 /* Map it */
6db7470445f0757 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 780 map = skb_frag_dma_map(priv->dev, frag, 0, len,
6db7470445f0757 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 781 DMA_TO_DEVICE);
6db7470445f0757 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 782 if (dma_mapping_error(priv->dev, map))
6db7470445f0757 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 783 goto dma_err;
6db7470445f0757 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 784
6db7470445f0757 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 785 /* Setup descriptor */
6db7470445f0757 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 786 priv->tx_skbs[pointer] = skb;
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12 787 txdes = &priv->txdes[pointer];
52c0cae8746513e drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 788 ctl_stat = ftgmac100_base_tx_ctlstat(priv, pointer);
52c0cae8746513e drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 789 ctl_stat |= FTGMAC100_TXDES0_TXDMA_OWN;
52c0cae8746513e drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 790 ctl_stat |= FTGMAC100_TXDES0_TXBUF_SIZE(len);
52c0cae8746513e drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 791 if (i == (nfrags - 1))
52c0cae8746513e drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 792 ctl_stat |= FTGMAC100_TXDES0_LTS;
52c0cae8746513e drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 793 txdes->txdes0 = cpu_to_le32(ctl_stat);
52c0cae8746513e drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 794 txdes->txdes1 = 0;
52c0cae8746513e drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 795 txdes->txdes3 = cpu_to_le32(map);
52c0cae8746513e drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 796
52c0cae8746513e drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 797 /* Next one */
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12 798 pointer = ftgmac100_next_tx_pointer(priv, pointer);
6db7470445f0757 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 799 }
6db7470445f0757 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 800
4a2712b2f0b6895 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 801 /* Order the previous packet and descriptor udpates
52c0cae8746513e drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 802 * before setting the OWN bit on the first descriptor.
4a2712b2f0b6895 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 803 */
4a2712b2f0b6895 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 804 dma_wmb();
52c0cae8746513e drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 805 first->txdes0 = cpu_to_le32(f_ctl_stat);
6ad3d7edcbdae23 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 806
83617317d2136ca drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 807 /* Update next TX pointer */
6db7470445f0757 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 808 priv->tx_pointer = pointer;
83617317d2136ca drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 809
6ad3d7edcbdae23 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 810 /* If there isn't enough room for all the fragments of a new packet
6ad3d7edcbdae23 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 811 * in the TX ring, stop the queue. The sequence below is race free
6ad3d7edcbdae23 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 812 * vs. a concurrent restart in ftgmac100_poll()
6ad3d7edcbdae23 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 813 */
6ad3d7edcbdae23 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 814 if (unlikely(ftgmac100_tx_buf_avail(priv) < TX_THRESHOLD)) {
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 815 netif_stop_queue(netdev);
6ad3d7edcbdae23 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 816 /* Order the queue stop with the test below */
6ad3d7edcbdae23 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 817 smp_mb();
6ad3d7edcbdae23 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 818 if (ftgmac100_tx_buf_avail(priv) >= TX_THRESHOLD)
6ad3d7edcbdae23 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 819 netif_wake_queue(netdev);
6ad3d7edcbdae23 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 820 }
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 821
8eecf7caad8687e drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12 822 /* Poke transmitter to read the updated TX descriptors */
8eecf7caad8687e drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12 823 iowrite32(1, priv->base + FTGMAC100_OFFSET_NPTXPD);
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 824
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 825 return NETDEV_TX_OK;
3e427a3363edbc8 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 826
6db7470445f0757 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 827 dma_err:
6db7470445f0757 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 828 if (net_ratelimit())
6db7470445f0757 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 829 netdev_err(netdev, "map tx fragment failed\n");
6db7470445f0757 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 830
6db7470445f0757 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 831 /* Free head */
6db7470445f0757 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 832 pointer = priv->tx_pointer;
52c0cae8746513e drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 833 ftgmac100_free_tx_packet(priv, pointer, skb, first, f_ctl_stat);
52c0cae8746513e drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 834 first->txdes0 = cpu_to_le32(f_ctl_stat & priv->txdes0_edotr_mask);
6db7470445f0757 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 835
6db7470445f0757 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 836 /* Then all fragments */
6db7470445f0757 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 837 for (j = 0; j < i; j++) {
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12 838 pointer = ftgmac100_next_tx_pointer(priv, pointer);
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12 839 txdes = &priv->txdes[pointer];
52c0cae8746513e drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 840 ctl_stat = le32_to_cpu(txdes->txdes0);
52c0cae8746513e drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 841 ftgmac100_free_tx_packet(priv, pointer, skb, txdes, ctl_stat);
52c0cae8746513e drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 842 txdes->txdes0 = cpu_to_le32(ctl_stat & priv->txdes0_edotr_mask);
6db7470445f0757 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 843 }
6db7470445f0757 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 844
6db7470445f0757 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 845 /* This cannot be reached if we successfully mapped the
6db7470445f0757 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 846 * last fragment, so we know ftgmac100_free_tx_packet()
6db7470445f0757 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 847 * hasn't freed the skb yet.
6db7470445f0757 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 848 */
3e427a3363edbc8 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 849 drop:
3e427a3363edbc8 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 850 /* Drop the packet */
3e427a3363edbc8 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 851 dev_kfree_skb_any(skb);
3e427a3363edbc8 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 852 netdev->stats.tx_dropped++;
3e427a3363edbc8 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 853
3e427a3363edbc8 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 854 return NETDEV_TX_OK;
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 855 }
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 856
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 857 static void ftgmac100_free_buffers(struct ftgmac100 *priv)
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 858 {
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 859 int i;
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 860
87d18757ec1677c drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 861 /* Free all RX buffers */
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12 862 for (i = 0; i < priv->rx_q_entries; i++) {
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12 863 struct ftgmac100_rxdes *rxdes = &priv->rxdes[i];
7b49cd1c9eca4ac drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-06 864 struct sk_buff *skb = priv->rx_skbs[i];
4ca24152d891950 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-06 865 dma_addr_t map = le32_to_cpu(rxdes->rxdes3);
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 866
7b49cd1c9eca4ac drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-06 867 if (!skb)
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 868 continue;
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 869
7b49cd1c9eca4ac drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-06 870 priv->rx_skbs[i] = NULL;
7b49cd1c9eca4ac drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-06 871 dma_unmap_single(priv->dev, map, RX_BUF_SIZE, DMA_FROM_DEVICE);
7b49cd1c9eca4ac drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-06 872 dev_kfree_skb_any(skb);
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 873 }
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 874
87d18757ec1677c drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 875 /* Free all TX buffers */
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12 876 for (i = 0; i < priv->tx_q_entries; i++) {
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12 877 struct ftgmac100_txdes *txdes = &priv->txdes[i];
83617317d2136ca drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 878 struct sk_buff *skb = priv->tx_skbs[i];
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 879
52c0cae8746513e drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 880 if (!skb)
52c0cae8746513e drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 881 continue;
52c0cae8746513e drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 882 ftgmac100_free_tx_packet(priv, i, skb, txdes,
52c0cae8746513e drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 883 le32_to_cpu(txdes->txdes0));
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 884 }
87d18757ec1677c drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 885 }
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 886
87d18757ec1677c drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 887 static void ftgmac100_free_rings(struct ftgmac100 *priv)
87d18757ec1677c drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 888 {
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12 889 /* Free skb arrays */
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12 890 kfree(priv->rx_skbs);
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12 891 kfree(priv->tx_skbs);
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12 892
87d18757ec1677c drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 893 /* Free descriptors */
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12 894 if (priv->rxdes)
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12 895 dma_free_coherent(priv->dev, MAX_RX_QUEUE_ENTRIES *
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12 896 sizeof(struct ftgmac100_rxdes),
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12 897 priv->rxdes, priv->rxdes_dma);
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12 898 priv->rxdes = NULL;
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12 899
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12 900 if (priv->txdes)
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12 901 dma_free_coherent(priv->dev, MAX_TX_QUEUE_ENTRIES *
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12 902 sizeof(struct ftgmac100_txdes),
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12 903 priv->txdes, priv->txdes_dma);
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12 904 priv->txdes = NULL;
d72e01a0430f8a1 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-06 905
d72e01a0430f8a1 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-06 906 /* Free scratch packet buffer */
d72e01a0430f8a1 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-06 907 if (priv->rx_scratch)
d72e01a0430f8a1 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-06 908 dma_free_coherent(priv->dev, RX_BUF_SIZE,
d72e01a0430f8a1 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-06 909 priv->rx_scratch, priv->rx_scratch_dma);
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 910 }
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 911
87d18757ec1677c drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 912 static int ftgmac100_alloc_rings(struct ftgmac100 *priv)
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 913 {
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12 914 /* Allocate skb arrays */
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12 915 priv->rx_skbs = kcalloc(MAX_RX_QUEUE_ENTRIES, sizeof(void *),
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12 916 GFP_KERNEL);
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12 917 if (!priv->rx_skbs)
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12 918 return -ENOMEM;
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12 919 priv->tx_skbs = kcalloc(MAX_TX_QUEUE_ENTRIES, sizeof(void *),
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12 920 GFP_KERNEL);
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12 921 if (!priv->tx_skbs)
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12 922 return -ENOMEM;
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12 923
87d18757ec1677c drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 924 /* Allocate descriptors */
750afb08ca71310 drivers/net/ethernet/faraday/ftgmac100.c Luis Chamberlain 2019-01-04 925 priv->rxdes = dma_alloc_coherent(priv->dev,
750afb08ca71310 drivers/net/ethernet/faraday/ftgmac100.c Luis Chamberlain 2019-01-04 926 MAX_RX_QUEUE_ENTRIES * sizeof(struct ftgmac100_rxdes),
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12 927 &priv->rxdes_dma, GFP_KERNEL);
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12 928 if (!priv->rxdes)
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12 929 return -ENOMEM;
750afb08ca71310 drivers/net/ethernet/faraday/ftgmac100.c Luis Chamberlain 2019-01-04 930 priv->txdes = dma_alloc_coherent(priv->dev,
750afb08ca71310 drivers/net/ethernet/faraday/ftgmac100.c Luis Chamberlain 2019-01-04 931 MAX_TX_QUEUE_ENTRIES * sizeof(struct ftgmac100_txdes),
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12 932 &priv->txdes_dma, GFP_KERNEL);
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12 933 if (!priv->txdes)
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 934 return -ENOMEM;
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 935
d72e01a0430f8a1 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-06 936 /* Allocate scratch packet buffer */
d72e01a0430f8a1 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-06 937 priv->rx_scratch = dma_alloc_coherent(priv->dev,
d72e01a0430f8a1 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-06 938 RX_BUF_SIZE,
d72e01a0430f8a1 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-06 939 &priv->rx_scratch_dma,
d72e01a0430f8a1 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-06 940 GFP_KERNEL);
d72e01a0430f8a1 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-06 941 if (!priv->rx_scratch)
d72e01a0430f8a1 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-06 942 return -ENOMEM;
d72e01a0430f8a1 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-06 943
87d18757ec1677c drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 944 return 0;
87d18757ec1677c drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 945 }
87d18757ec1677c drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 946
87d18757ec1677c drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 947 static void ftgmac100_init_rings(struct ftgmac100 *priv)
87d18757ec1677c drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 948 {
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12 949 struct ftgmac100_rxdes *rxdes = NULL;
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12 950 struct ftgmac100_txdes *txdes = NULL;
87d18757ec1677c drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 951 int i;
87d18757ec1677c drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 952
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12 953 /* Update entries counts */
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12 954 priv->rx_q_entries = priv->new_rx_q_entries;
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12 955 priv->tx_q_entries = priv->new_tx_q_entries;
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12 956
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12 957 if (WARN_ON(priv->rx_q_entries < MIN_RX_QUEUE_ENTRIES))
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12 958 return;
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12 959
87d18757ec1677c drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 960 /* Initialize RX ring */
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12 961 for (i = 0; i < priv->rx_q_entries; i++) {
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12 962 rxdes = &priv->rxdes[i];
d72e01a0430f8a1 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-06 963 rxdes->rxdes0 = 0;
4ca24152d891950 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-06 964 rxdes->rxdes3 = cpu_to_le32(priv->rx_scratch_dma);
d72e01a0430f8a1 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-06 965 }
4ca24152d891950 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-06 966 /* Mark the end of the ring */
4ca24152d891950 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-06 967 rxdes->rxdes0 |= cpu_to_le32(priv->rxdes0_edorr_mask);
87d18757ec1677c drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 968
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12 969 if (WARN_ON(priv->tx_q_entries < MIN_RX_QUEUE_ENTRIES))
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12 970 return;
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12 971
87d18757ec1677c drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 972 /* Initialize TX ring */
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12 973 for (i = 0; i < priv->tx_q_entries; i++) {
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12 974 txdes = &priv->txdes[i];
52c0cae8746513e drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 975 txdes->txdes0 = 0;
52c0cae8746513e drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 976 }
52c0cae8746513e drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 977 txdes->txdes0 |= cpu_to_le32(priv->txdes0_edotr_mask);
87d18757ec1677c drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 978 }
87d18757ec1677c drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 979
87d18757ec1677c drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 980 static int ftgmac100_alloc_rx_buffers(struct ftgmac100 *priv)
87d18757ec1677c drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 981 {
87d18757ec1677c drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 982 int i;
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 983
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12 984 for (i = 0; i < priv->rx_q_entries; i++) {
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12 985 struct ftgmac100_rxdes *rxdes = &priv->rxdes[i];
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 986
7b49cd1c9eca4ac drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-06 987 if (ftgmac100_alloc_rx_buf(priv, i, rxdes, GFP_KERNEL))
87d18757ec1677c drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 988 return -ENOMEM;
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 989 }
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 990 return 0;
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 991 }
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 992
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 993 static void ftgmac100_adjust_link(struct net_device *netdev)
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 994 {
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 995 struct ftgmac100 *priv = netdev_priv(netdev);
b3c40adcc9891a7 drivers/net/ethernet/faraday/ftgmac100.c Philippe Reynes 2016-05-16 996 struct phy_device *phydev = netdev->phydev;
7c8e5141ca633ae drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 997 bool tx_pause, rx_pause;
51764777354664b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 998 int new_speed;
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 999
51764777354664b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1000 /* We store "no link" as speed 0 */
51764777354664b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1001 if (!phydev->link)
51764777354664b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1002 new_speed = 0;
51764777354664b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1003 else
51764777354664b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1004 new_speed = phydev->speed;
51764777354664b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1005
7c8e5141ca633ae drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1006 /* Grab pause settings from PHY if configured to do so */
7c8e5141ca633ae drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1007 if (priv->aneg_pause) {
7c8e5141ca633ae drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1008 rx_pause = tx_pause = phydev->pause;
7c8e5141ca633ae drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1009 if (phydev->asym_pause)
7c8e5141ca633ae drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1010 tx_pause = !rx_pause;
7c8e5141ca633ae drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1011 } else {
7c8e5141ca633ae drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1012 rx_pause = priv->rx_pause;
7c8e5141ca633ae drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1013 tx_pause = priv->tx_pause;
7c8e5141ca633ae drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1014 }
7c8e5141ca633ae drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1015
7c8e5141ca633ae drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1016 /* Link hasn't changed, do nothing */
51764777354664b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1017 if (phydev->speed == priv->cur_speed &&
7c8e5141ca633ae drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1018 phydev->duplex == priv->cur_duplex &&
7c8e5141ca633ae drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1019 rx_pause == priv->rx_pause &&
7c8e5141ca633ae drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1020 tx_pause == priv->tx_pause)
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1021 return;
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1022
51764777354664b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1023 /* Print status if we have a link or we had one and just lost it,
51764777354664b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1024 * don't print otherwise.
51764777354664b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1025 */
51764777354664b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1026 if (new_speed || priv->cur_speed)
51764777354664b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1027 phy_print_status(phydev);
51764777354664b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1028
51764777354664b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1029 priv->cur_speed = new_speed;
51764777354664b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1030 priv->cur_duplex = phydev->duplex;
7c8e5141ca633ae drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1031 priv->rx_pause = rx_pause;
7c8e5141ca633ae drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1032 priv->tx_pause = tx_pause;
51764777354664b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1033
51764777354664b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1034 /* Link is down, do nothing else */
51764777354664b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1035 if (!new_speed)
51764777354664b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1036 return;
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1037
855944ce1cc4037 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1038 /* Disable all interrupts */
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1039 iowrite32(0, priv->base + FTGMAC100_OFFSET_IER);
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1040
855944ce1cc4037 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1041 /* Reset the adapter asynchronously */
855944ce1cc4037 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1042 schedule_work(&priv->reset_task);
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1043 }
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1044
abcc3eb00e10af3 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1045 static int ftgmac100_mii_probe(struct ftgmac100 *priv, phy_interface_t intf)
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1046 {
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1047 struct net_device *netdev = priv->netdev;
e574f39816f0227 drivers/net/ethernet/faraday/ftgmac100.c Guenter Roeck 2016-01-10 1048 struct phy_device *phydev;
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1049
e574f39816f0227 drivers/net/ethernet/faraday/ftgmac100.c Guenter Roeck 2016-01-10 1050 phydev = phy_find_first(priv->mii_bus);
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1051 if (!phydev) {
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1052 netdev_info(netdev, "%s: no PHY found\n", netdev->name);
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1053 return -ENODEV;
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1054 }
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1055
84eff6d194df442 drivers/net/ethernet/faraday/ftgmac100.c Andrew Lunn 2016-01-06 1056 phydev = phy_connect(netdev, phydev_name(phydev),
abcc3eb00e10af3 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1057 &ftgmac100_adjust_link, intf);
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1058
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1059 if (IS_ERR(phydev)) {
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1060 netdev_err(netdev, "%s: Could not attach to PHY\n", netdev->name);
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1061 return PTR_ERR(phydev);
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1062 }
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1063
7c8e5141ca633ae drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1064 /* Indicate that we support PAUSE frames (see comment in
cb1aaebea8d7986 drivers/net/ethernet/faraday/ftgmac100.c Mauro Carvalho Chehab 2019-06-07 1065 * Documentation/networking/phy.rst)
7c8e5141ca633ae drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1066 */
af8d9bb2f2f405a drivers/net/ethernet/faraday/ftgmac100.c Andrew Lunn 2018-09-12 1067 phy_support_asym_pause(phydev);
7c8e5141ca633ae drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1068
33de693248b4564 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1069 /* Display what we found */
33de693248b4564 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1070 phy_attached_info(phydev);
33de693248b4564 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1071
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1072 return 0;
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1073 }
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1074
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1075 static int ftgmac100_mdiobus_read(struct mii_bus *bus, int phy_addr, int regnum)
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1076 {
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1077 struct net_device *netdev = bus->priv;
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1078 struct ftgmac100 *priv = netdev_priv(netdev);
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1079 unsigned int phycr;
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1080 int i;
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1081
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1082 phycr = ioread32(priv->base + FTGMAC100_OFFSET_PHYCR);
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1083
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1084 /* preserve MDC cycle threshold */
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1085 phycr &= FTGMAC100_PHYCR_MDC_CYCTHR_MASK;
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1086
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1087 phycr |= FTGMAC100_PHYCR_PHYAD(phy_addr) |
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1088 FTGMAC100_PHYCR_REGAD(regnum) |
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1089 FTGMAC100_PHYCR_MIIRD;
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1090
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1091 iowrite32(phycr, priv->base + FTGMAC100_OFFSET_PHYCR);
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1092
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1093 for (i = 0; i < 10; i++) {
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1094 phycr = ioread32(priv->base + FTGMAC100_OFFSET_PHYCR);
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1095
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1096 if ((phycr & FTGMAC100_PHYCR_MIIRD) == 0) {
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1097 int data;
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1098
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1099 data = ioread32(priv->base + FTGMAC100_OFFSET_PHYDATA);
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1100 return FTGMAC100_PHYDATA_MIIRDATA(data);
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1101 }
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1102
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1103 udelay(100);
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1104 }
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1105
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1106 netdev_err(netdev, "mdio read timed out\n");
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1107 return -EIO;
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1108 }
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1109
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1110 static int ftgmac100_mdiobus_write(struct mii_bus *bus, int phy_addr,
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1111 int regnum, u16 value)
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1112 {
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1113 struct net_device *netdev = bus->priv;
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1114 struct ftgmac100 *priv = netdev_priv(netdev);
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1115 unsigned int phycr;
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1116 int data;
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1117 int i;
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1118
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1119 phycr = ioread32(priv->base + FTGMAC100_OFFSET_PHYCR);
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1120
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1121 /* preserve MDC cycle threshold */
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1122 phycr &= FTGMAC100_PHYCR_MDC_CYCTHR_MASK;
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1123
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1124 phycr |= FTGMAC100_PHYCR_PHYAD(phy_addr) |
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1125 FTGMAC100_PHYCR_REGAD(regnum) |
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1126 FTGMAC100_PHYCR_MIIWR;
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1127
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1128 data = FTGMAC100_PHYDATA_MIIWDATA(value);
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1129
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1130 iowrite32(data, priv->base + FTGMAC100_OFFSET_PHYDATA);
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1131 iowrite32(phycr, priv->base + FTGMAC100_OFFSET_PHYCR);
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1132
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1133 for (i = 0; i < 10; i++) {
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1134 phycr = ioread32(priv->base + FTGMAC100_OFFSET_PHYCR);
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1135
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1136 if ((phycr & FTGMAC100_PHYCR_MIIWR) == 0)
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1137 return 0;
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1138
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1139 udelay(100);
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1140 }
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1141
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1142 netdev_err(netdev, "mdio write timed out\n");
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1143 return -EIO;
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1144 }
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1145
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1146 static void ftgmac100_get_drvinfo(struct net_device *netdev,
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1147 struct ethtool_drvinfo *info)
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1148 {
7826d43f2db45c9 drivers/net/ethernet/faraday/ftgmac100.c Jiri Pirko 2013-01-06 1149 strlcpy(info->driver, DRV_NAME, sizeof(info->driver));
7826d43f2db45c9 drivers/net/ethernet/faraday/ftgmac100.c Jiri Pirko 2013-01-06 1150 strlcpy(info->version, DRV_VERSION, sizeof(info->version));
7826d43f2db45c9 drivers/net/ethernet/faraday/ftgmac100.c Jiri Pirko 2013-01-06 1151 strlcpy(info->bus_info, dev_name(&netdev->dev), sizeof(info->bus_info));
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1152 }
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1153
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12 1154 static void ftgmac100_get_ringparam(struct net_device *netdev,
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12 1155 struct ethtool_ringparam *ering)
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12 1156 {
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12 1157 struct ftgmac100 *priv = netdev_priv(netdev);
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12 1158
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12 1159 memset(ering, 0, sizeof(*ering));
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12 1160 ering->rx_max_pending = MAX_RX_QUEUE_ENTRIES;
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12 1161 ering->tx_max_pending = MAX_TX_QUEUE_ENTRIES;
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12 1162 ering->rx_pending = priv->rx_q_entries;
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12 1163 ering->tx_pending = priv->tx_q_entries;
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12 1164 }
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12 1165
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12 1166 static int ftgmac100_set_ringparam(struct net_device *netdev,
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12 1167 struct ethtool_ringparam *ering)
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12 1168 {
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12 1169 struct ftgmac100 *priv = netdev_priv(netdev);
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12 1170
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12 1171 if (ering->rx_pending > MAX_RX_QUEUE_ENTRIES ||
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12 1172 ering->tx_pending > MAX_TX_QUEUE_ENTRIES ||
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12 1173 ering->rx_pending < MIN_RX_QUEUE_ENTRIES ||
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12 1174 ering->tx_pending < MIN_TX_QUEUE_ENTRIES ||
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12 1175 !is_power_of_2(ering->rx_pending) ||
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12 1176 !is_power_of_2(ering->tx_pending))
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12 1177 return -EINVAL;
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12 1178
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12 1179 priv->new_rx_q_entries = ering->rx_pending;
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12 1180 priv->new_tx_q_entries = ering->tx_pending;
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12 1181 if (netif_running(netdev))
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12 1182 schedule_work(&priv->reset_task);
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12 1183
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12 1184 return 0;
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12 1185 }
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12 1186
7c8e5141ca633ae drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1187 static void ftgmac100_get_pauseparam(struct net_device *netdev,
7c8e5141ca633ae drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1188 struct ethtool_pauseparam *pause)
7c8e5141ca633ae drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1189 {
7c8e5141ca633ae drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1190 struct ftgmac100 *priv = netdev_priv(netdev);
7c8e5141ca633ae drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1191
7c8e5141ca633ae drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1192 pause->autoneg = priv->aneg_pause;
7c8e5141ca633ae drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1193 pause->tx_pause = priv->tx_pause;
7c8e5141ca633ae drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1194 pause->rx_pause = priv->rx_pause;
7c8e5141ca633ae drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1195 }
7c8e5141ca633ae drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1196
7c8e5141ca633ae drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1197 static int ftgmac100_set_pauseparam(struct net_device *netdev,
7c8e5141ca633ae drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1198 struct ethtool_pauseparam *pause)
7c8e5141ca633ae drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1199 {
7c8e5141ca633ae drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1200 struct ftgmac100 *priv = netdev_priv(netdev);
7c8e5141ca633ae drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1201 struct phy_device *phydev = netdev->phydev;
7c8e5141ca633ae drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1202
7c8e5141ca633ae drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1203 priv->aneg_pause = pause->autoneg;
7c8e5141ca633ae drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1204 priv->tx_pause = pause->tx_pause;
7c8e5141ca633ae drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1205 priv->rx_pause = pause->rx_pause;
7c8e5141ca633ae drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1206
70814e819c1139e drivers/net/ethernet/faraday/ftgmac100.c Andrew Lunn 2018-09-12 1207 if (phydev)
70814e819c1139e drivers/net/ethernet/faraday/ftgmac100.c Andrew Lunn 2018-09-12 1208 phy_set_asym_pause(phydev, pause->rx_pause, pause->tx_pause);
7c8e5141ca633ae drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1209
7c8e5141ca633ae drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1210 if (netif_running(netdev)) {
70814e819c1139e drivers/net/ethernet/faraday/ftgmac100.c Andrew Lunn 2018-09-12 1211 if (!(phydev && priv->aneg_pause))
7c8e5141ca633ae drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1212 ftgmac100_config_pause(priv);
7c8e5141ca633ae drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1213 }
7c8e5141ca633ae drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1214
7c8e5141ca633ae drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1215 return 0;
7c8e5141ca633ae drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1216 }
7c8e5141ca633ae drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1217
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1218 static const struct ethtool_ops ftgmac100_ethtool_ops = {
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1219 .get_drvinfo = ftgmac100_get_drvinfo,
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1220 .get_link = ethtool_op_get_link,
fd24d72ca9b5255 drivers/net/ethernet/faraday/ftgmac100.c Philippe Reynes 2016-05-16 1221 .get_link_ksettings = phy_ethtool_get_link_ksettings,
fd24d72ca9b5255 drivers/net/ethernet/faraday/ftgmac100.c Philippe Reynes 2016-05-16 1222 .set_link_ksettings = phy_ethtool_set_link_ksettings,
e98233a6192d75d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1223 .nway_reset = phy_ethtool_nway_reset,
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12 1224 .get_ringparam = ftgmac100_get_ringparam,
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12 1225 .set_ringparam = ftgmac100_set_ringparam,
7c8e5141ca633ae drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1226 .get_pauseparam = ftgmac100_get_pauseparam,
7c8e5141ca633ae drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1227 .set_pauseparam = ftgmac100_set_pauseparam,
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1228 };
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1229
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1230 static irqreturn_t ftgmac100_interrupt(int irq, void *dev_id)
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1231 {
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1232 struct net_device *netdev = dev_id;
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1233 struct ftgmac100 *priv = netdev_priv(netdev);
10cbd640760991b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1234 unsigned int status, new_mask = FTGMAC100_INT_BAD;
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1235
10cbd640760991b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1236 /* Fetch and clear interrupt bits, process abnormal ones */
10cbd640760991b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1237 status = ioread32(priv->base + FTGMAC100_OFFSET_ISR);
10cbd640760991b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1238 iowrite32(status, priv->base + FTGMAC100_OFFSET_ISR);
10cbd640760991b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1239 if (unlikely(status & FTGMAC100_INT_BAD)) {
10cbd640760991b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1240
10cbd640760991b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1241 /* RX buffer unavailable */
10cbd640760991b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1242 if (status & FTGMAC100_INT_NO_RXBUF)
10cbd640760991b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1243 netdev->stats.rx_over_errors++;
10cbd640760991b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1244
10cbd640760991b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1245 /* received packet lost due to RX FIFO full */
10cbd640760991b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1246 if (status & FTGMAC100_INT_RPKT_LOST)
10cbd640760991b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1247 netdev->stats.rx_fifo_errors++;
10cbd640760991b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1248
10cbd640760991b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1249 /* sent packet lost due to excessive TX collision */
10cbd640760991b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1250 if (status & FTGMAC100_INT_XPKT_LOST)
10cbd640760991b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1251 netdev->stats.tx_fifo_errors++;
10cbd640760991b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1252
10cbd640760991b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1253 /* AHB error -> Reset the chip */
10cbd640760991b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1254 if (status & FTGMAC100_INT_AHB_ERR) {
10cbd640760991b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1255 if (net_ratelimit())
10cbd640760991b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1256 netdev_warn(netdev,
10cbd640760991b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1257 "AHB bus error ! Resetting chip.\n");
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1258 iowrite32(0, priv->base + FTGMAC100_OFFSET_IER);
10cbd640760991b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1259 schedule_work(&priv->reset_task);
10cbd640760991b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1260 return IRQ_HANDLED;
10cbd640760991b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1261 }
10cbd640760991b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1262
10cbd640760991b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1263 /* We may need to restart the MAC after such errors, delay
10cbd640760991b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1264 * this until after we have freed some Rx buffers though
10cbd640760991b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1265 */
10cbd640760991b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1266 priv->need_mac_restart = true;
10cbd640760991b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1267
10cbd640760991b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1268 /* Disable those errors until we restart */
10cbd640760991b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1269 new_mask &= ~status;
10cbd640760991b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1270 }
10cbd640760991b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1271
10cbd640760991b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1272 /* Only enable "bad" interrupts while NAPI is on */
10cbd640760991b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1273 iowrite32(new_mask, priv->base + FTGMAC100_OFFSET_IER);
10cbd640760991b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1274
10cbd640760991b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1275 /* Schedule NAPI bh */
10cbd640760991b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1276 napi_schedule_irqoff(&priv->napi);
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1277
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1278 return IRQ_HANDLED;
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1279 }
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1280
4ca24152d891950 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-06 1281 static bool ftgmac100_check_rx(struct ftgmac100 *priv)
4ca24152d891950 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-06 1282 {
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12 1283 struct ftgmac100_rxdes *rxdes = &priv->rxdes[priv->rx_pointer];
4ca24152d891950 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-06 1284
4ca24152d891950 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-06 1285 /* Do we have a packet ? */
4ca24152d891950 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-06 1286 return !!(rxdes->rxdes0 & cpu_to_le32(FTGMAC100_RXDES0_RXPKT_RDY));
4ca24152d891950 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-06 1287 }
4ca24152d891950 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-06 1288
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1289 static int ftgmac100_poll(struct napi_struct *napi, int budget)
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1290 {
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1291 struct ftgmac100 *priv = container_of(napi, struct ftgmac100, napi);
6ad3d7edcbdae23 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 1292 int work_done = 0;
6ad3d7edcbdae23 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 1293 bool more;
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1294
6ad3d7edcbdae23 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 1295 /* Handle TX completions */
6ad3d7edcbdae23 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 1296 if (ftgmac100_tx_buf_cleanable(priv))
10cbd640760991b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1297 ftgmac100_tx_complete(priv);
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1298
6ad3d7edcbdae23 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 1299 /* Handle RX packets */
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1300 do {
6ad3d7edcbdae23 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 1301 more = ftgmac100_rx_packet(priv, &work_done);
6ad3d7edcbdae23 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 1302 } while (more && work_done < budget);
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1303
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1304
10cbd640760991b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1305 /* The interrupt is telling us to kick the MAC back to life
10cbd640760991b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1306 * after an RX overflow
10cbd640760991b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1307 */
10cbd640760991b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1308 if (unlikely(priv->need_mac_restart)) {
10cbd640760991b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1309 ftgmac100_start_hw(priv);
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1310
10cbd640760991b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1311 /* Re-enable "bad" interrupts */
10cbd640760991b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1312 iowrite32(FTGMAC100_INT_BAD,
10cbd640760991b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1313 priv->base + FTGMAC100_OFFSET_IER);
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1314 }
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1315
6ad3d7edcbdae23 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 1316 /* As long as we are waiting for transmit packets to be
6ad3d7edcbdae23 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 1317 * completed we keep NAPI going
6ad3d7edcbdae23 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 1318 */
6ad3d7edcbdae23 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 1319 if (ftgmac100_tx_buf_cleanable(priv))
6ad3d7edcbdae23 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 1320 work_done = budget;
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1321
6ad3d7edcbdae23 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 1322 if (work_done < budget) {
10cbd640760991b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1323 /* We are about to re-enable all interrupts. However
10cbd640760991b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1324 * the HW has been latching RX/TX packet interrupts while
10cbd640760991b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1325 * they were masked. So we clear them first, then we need
10cbd640760991b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1326 * to re-check if there's something to process
10cbd640760991b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1327 */
10cbd640760991b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1328 iowrite32(FTGMAC100_INT_RXTX,
10cbd640760991b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1329 priv->base + FTGMAC100_OFFSET_ISR);
ccaf725a1fd7904 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1330
ccaf725a1fd7904 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1331 /* Push the above (and provides a barrier vs. subsequent
ccaf725a1fd7904 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1332 * reads of the descriptor).
ccaf725a1fd7904 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1333 */
ccaf725a1fd7904 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1334 ioread32(priv->base + FTGMAC100_OFFSET_ISR);
ccaf725a1fd7904 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1335
ccaf725a1fd7904 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1336 /* Check RX and TX descriptors for more work to do */
6ad3d7edcbdae23 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 1337 if (ftgmac100_check_rx(priv) ||
6ad3d7edcbdae23 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 1338 ftgmac100_tx_buf_cleanable(priv))
10cbd640760991b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1339 return budget;
10cbd640760991b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1340
10cbd640760991b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1341 /* deschedule NAPI */
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1342 napi_complete(napi);
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1343
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1344 /* enable all interrupts */
10cbd640760991b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1345 iowrite32(FTGMAC100_INT_ALL,
fc6061cf93524c3 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan 2016-07-19 1346 priv->base + FTGMAC100_OFFSET_IER);
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1347 }
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1348
6ad3d7edcbdae23 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 1349 return work_done;
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1350 }
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1351
da40d9d4b5932d2 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1352 static int ftgmac100_init_all(struct ftgmac100 *priv, bool ignore_alloc_err)
da40d9d4b5932d2 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1353 {
da40d9d4b5932d2 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1354 int err = 0;
da40d9d4b5932d2 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1355
da40d9d4b5932d2 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1356 /* Re-init descriptors (adjust queue sizes) */
da40d9d4b5932d2 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1357 ftgmac100_init_rings(priv);
da40d9d4b5932d2 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1358
da40d9d4b5932d2 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1359 /* Realloc rx descriptors */
da40d9d4b5932d2 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1360 err = ftgmac100_alloc_rx_buffers(priv);
da40d9d4b5932d2 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1361 if (err && !ignore_alloc_err)
da40d9d4b5932d2 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1362 return err;
da40d9d4b5932d2 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1363
da40d9d4b5932d2 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1364 /* Reinit and restart HW */
da40d9d4b5932d2 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1365 ftgmac100_init_hw(priv);
7c8e5141ca633ae drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1366 ftgmac100_config_pause(priv);
da40d9d4b5932d2 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1367 ftgmac100_start_hw(priv);
da40d9d4b5932d2 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1368
da40d9d4b5932d2 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1369 /* Re-enable the device */
da40d9d4b5932d2 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1370 napi_enable(&priv->napi);
da40d9d4b5932d2 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1371 netif_start_queue(priv->netdev);
da40d9d4b5932d2 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1372
da40d9d4b5932d2 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1373 /* Enable all interrupts */
10cbd640760991b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1374 iowrite32(FTGMAC100_INT_ALL, priv->base + FTGMAC100_OFFSET_IER);
da40d9d4b5932d2 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1375
da40d9d4b5932d2 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1376 return err;
da40d9d4b5932d2 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1377 }
da40d9d4b5932d2 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1378
855944ce1cc4037 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1379 static void ftgmac100_reset_task(struct work_struct *work)
855944ce1cc4037 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1380 {
855944ce1cc4037 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1381 struct ftgmac100 *priv = container_of(work, struct ftgmac100,
855944ce1cc4037 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1382 reset_task);
855944ce1cc4037 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1383 struct net_device *netdev = priv->netdev;
855944ce1cc4037 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1384 int err;
855944ce1cc4037 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1385
855944ce1cc4037 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1386 netdev_dbg(netdev, "Resetting NIC...\n");
855944ce1cc4037 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1387
855944ce1cc4037 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1388 /* Lock the world */
855944ce1cc4037 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1389 rtnl_lock();
855944ce1cc4037 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1390 if (netdev->phydev)
855944ce1cc4037 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1391 mutex_lock(&netdev->phydev->lock);
855944ce1cc4037 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1392 if (priv->mii_bus)
855944ce1cc4037 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1393 mutex_lock(&priv->mii_bus->mdio_lock);
855944ce1cc4037 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1394
855944ce1cc4037 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1395
855944ce1cc4037 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1396 /* Check if the interface is still up */
855944ce1cc4037 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1397 if (!netif_running(netdev))
855944ce1cc4037 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1398 goto bail;
855944ce1cc4037 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1399
855944ce1cc4037 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1400 /* Stop the network stack */
855944ce1cc4037 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1401 netif_trans_update(netdev);
855944ce1cc4037 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1402 napi_disable(&priv->napi);
855944ce1cc4037 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1403 netif_tx_disable(netdev);
855944ce1cc4037 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1404
855944ce1cc4037 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1405 /* Stop and reset the MAC */
855944ce1cc4037 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1406 ftgmac100_stop_hw(priv);
874b55bf62330ca drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1407 err = ftgmac100_reset_and_config_mac(priv);
855944ce1cc4037 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1408 if (err) {
855944ce1cc4037 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1409 /* Not much we can do ... it might come back... */
855944ce1cc4037 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1410 netdev_err(netdev, "attempting to continue...\n");
855944ce1cc4037 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1411 }
855944ce1cc4037 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1412
855944ce1cc4037 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1413 /* Free all rx and tx buffers */
855944ce1cc4037 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1414 ftgmac100_free_buffers(priv);
855944ce1cc4037 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1415
855944ce1cc4037 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1416 /* Setup everything again and restart chip */
855944ce1cc4037 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1417 ftgmac100_init_all(priv, true);
855944ce1cc4037 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1418
855944ce1cc4037 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1419 netdev_dbg(netdev, "Reset done !\n");
855944ce1cc4037 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1420 bail:
855944ce1cc4037 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1421 if (priv->mii_bus)
855944ce1cc4037 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1422 mutex_unlock(&priv->mii_bus->mdio_lock);
855944ce1cc4037 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1423 if (netdev->phydev)
855944ce1cc4037 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1424 mutex_unlock(&netdev->phydev->lock);
855944ce1cc4037 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1425 rtnl_unlock();
855944ce1cc4037 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1426 }
855944ce1cc4037 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1427
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1428 static int ftgmac100_open(struct net_device *netdev)
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1429 {
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1430 struct ftgmac100 *priv = netdev_priv(netdev);
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1431 int err;
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1432
87d18757ec1677c drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1433 /* Allocate ring buffers */
87d18757ec1677c drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1434 err = ftgmac100_alloc_rings(priv);
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1435 if (err) {
87d18757ec1677c drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1436 netdev_err(netdev, "Failed to allocate descriptors\n");
87d18757ec1677c drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1437 return err;
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1438 }
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1439
51764777354664b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1440 /* When using NC-SI we force the speed to 100Mbit/s full duplex,
51764777354664b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1441 *
51764777354664b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1442 * Otherwise we leave it set to 0 (no link), the link
51764777354664b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1443 * message from the PHY layer will handle setting it up to
51764777354664b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1444 * something else if needed.
51764777354664b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1445 */
51764777354664b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1446 if (priv->use_ncsi) {
51764777354664b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1447 priv->cur_duplex = DUPLEX_FULL;
51764777354664b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1448 priv->cur_speed = SPEED_100;
51764777354664b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1449 } else {
51764777354664b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1450 priv->cur_duplex = 0;
51764777354664b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1451 priv->cur_speed = 0;
51764777354664b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1452 }
51764777354664b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1453
874b55bf62330ca drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1454 /* Reset the hardware */
874b55bf62330ca drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1455 err = ftgmac100_reset_and_config_mac(priv);
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1456 if (err)
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1457 goto err_hw;
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1458
b8dbecff9bab825 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1459 /* Initialize NAPI */
b8dbecff9bab825 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1460 netif_napi_add(netdev, &priv->napi, ftgmac100_poll, 64);
b8dbecff9bab825 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1461
81f1eca663c070e drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1462 /* Grab our interrupt */
81f1eca663c070e drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1463 err = request_irq(netdev->irq, ftgmac100_interrupt, 0, netdev->name, netdev);
81f1eca663c070e drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1464 if (err) {
81f1eca663c070e drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1465 netdev_err(netdev, "failed to request irq %d\n", netdev->irq);
81f1eca663c070e drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1466 goto err_irq;
81f1eca663c070e drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1467 }
81f1eca663c070e drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1468
da40d9d4b5932d2 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1469 /* Start things up */
da40d9d4b5932d2 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1470 err = ftgmac100_init_all(priv, false);
da40d9d4b5932d2 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1471 if (err) {
da40d9d4b5932d2 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1472 netdev_err(netdev, "Failed to allocate packet buffers\n");
da40d9d4b5932d2 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1473 goto err_alloc;
da40d9d4b5932d2 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1474 }
08c9c126004e999 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan 2016-09-22 1475
da40d9d4b5932d2 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1476 if (netdev->phydev) {
da40d9d4b5932d2 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1477 /* If we have a PHY, start polling */
b3c40adcc9891a7 drivers/net/ethernet/faraday/ftgmac100.c Philippe Reynes 2016-05-16 1478 phy_start(netdev->phydev);
da40d9d4b5932d2 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1479 } else if (priv->use_ncsi) {
da40d9d4b5932d2 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1480 /* If using NC-SI, set our carrier on and start the stack */
bd466c3fb5a4ff8 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan 2016-07-19 1481 netif_carrier_on(netdev);
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1482
bd466c3fb5a4ff8 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan 2016-07-19 1483 /* Start the NCSI device */
bd466c3fb5a4ff8 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan 2016-07-19 1484 err = ncsi_start_dev(priv->ndev);
bd466c3fb5a4ff8 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan 2016-07-19 1485 if (err)
bd466c3fb5a4ff8 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan 2016-07-19 1486 goto err_ncsi;
bd466c3fb5a4ff8 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan 2016-07-19 1487 }
bd466c3fb5a4ff8 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan 2016-07-19 1488
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1489 return 0;
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1490
bd466c3fb5a4ff8 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan 2016-07-19 1491 err_ncsi:
bd466c3fb5a4ff8 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan 2016-07-19 1492 napi_disable(&priv->napi);
bd466c3fb5a4ff8 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan 2016-07-19 1493 netif_stop_queue(netdev);
da40d9d4b5932d2 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1494 err_alloc:
da40d9d4b5932d2 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1495 ftgmac100_free_buffers(priv);
60b28a1167749c5 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1496 free_irq(netdev->irq, netdev);
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1497 err_irq:
81f1eca663c070e drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1498 netif_napi_del(&priv->napi);
81f1eca663c070e drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1499 err_hw:
81f1eca663c070e drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1500 iowrite32(0, priv->base + FTGMAC100_OFFSET_IER);
87d18757ec1677c drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1501 ftgmac100_free_rings(priv);
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1502 return err;
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1503 }
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1504
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1505 static int ftgmac100_stop(struct net_device *netdev)
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1506 {
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1507 struct ftgmac100 *priv = netdev_priv(netdev);
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1508
855944ce1cc4037 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1509 /* Note about the reset task: We are called with the rtnl lock
855944ce1cc4037 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1510 * held, so we are synchronized against the core of the reset
855944ce1cc4037 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1511 * task. We must not try to synchronously cancel it otherwise
855944ce1cc4037 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1512 * we can deadlock. But since it will test for netif_running()
855944ce1cc4037 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1513 * which has already been cleared by the net core, we don't
855944ce1cc4037 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1514 * anything special to do.
855944ce1cc4037 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1515 */
855944ce1cc4037 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1516
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1517 /* disable all interrupts */
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1518 iowrite32(0, priv->base + FTGMAC100_OFFSET_IER);
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1519
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1520 netif_stop_queue(netdev);
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1521 napi_disable(&priv->napi);
b8dbecff9bab825 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1522 netif_napi_del(&priv->napi);
bd466c3fb5a4ff8 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan 2016-07-19 1523 if (netdev->phydev)
b3c40adcc9891a7 drivers/net/ethernet/faraday/ftgmac100.c Philippe Reynes 2016-05-16 1524 phy_stop(netdev->phydev);
2c15f25b2923435 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan 2016-10-04 1525 else if (priv->use_ncsi)
2c15f25b2923435 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan 2016-10-04 1526 ncsi_stop_dev(priv->ndev);
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1527
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1528 ftgmac100_stop_hw(priv);
60b28a1167749c5 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1529 free_irq(netdev->irq, netdev);
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1530 ftgmac100_free_buffers(priv);
87d18757ec1677c drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1531 ftgmac100_free_rings(priv);
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1532
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1533 return 0;
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1534 }
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1535
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1536 /* optional */
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1537 static int ftgmac100_do_ioctl(struct net_device *netdev, struct ifreq *ifr, int cmd)
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1538 {
bd466c3fb5a4ff8 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan 2016-07-19 1539 if (!netdev->phydev)
bd466c3fb5a4ff8 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan 2016-07-19 1540 return -ENXIO;
bd466c3fb5a4ff8 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan 2016-07-19 1541
b3c40adcc9891a7 drivers/net/ethernet/faraday/ftgmac100.c Philippe Reynes 2016-05-16 1542 return phy_mii_ioctl(netdev->phydev, ifr, cmd);
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1543 }
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1544
d3ca8fb180dbec8 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 1545 static void ftgmac100_tx_timeout(struct net_device *netdev)
d3ca8fb180dbec8 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 1546 {
d3ca8fb180dbec8 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 1547 struct ftgmac100 *priv = netdev_priv(netdev);
d3ca8fb180dbec8 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 1548
d3ca8fb180dbec8 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 1549 /* Disable all interrupts */
d3ca8fb180dbec8 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 1550 iowrite32(0, priv->base + FTGMAC100_OFFSET_IER);
d3ca8fb180dbec8 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 1551
d3ca8fb180dbec8 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 1552 /* Do the reset outside of interrupt context */
d3ca8fb180dbec8 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 1553 schedule_work(&priv->reset_task);
d3ca8fb180dbec8 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 1554 }
d3ca8fb180dbec8 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 1555
0fb9968876c3866 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1556 static int ftgmac100_set_features(struct net_device *netdev,
0fb9968876c3866 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1557 netdev_features_t features)
0fb9968876c3866 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1558 {
0fb9968876c3866 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1559 struct ftgmac100 *priv = netdev_priv(netdev);
0fb9968876c3866 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1560 netdev_features_t changed = netdev->features ^ features;
0fb9968876c3866 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1561
0fb9968876c3866 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1562 if (!netif_running(netdev))
0fb9968876c3866 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1563 return 0;
0fb9968876c3866 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1564
0fb9968876c3866 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1565 /* Update the vlan filtering bit */
0fb9968876c3866 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1566 if (changed & NETIF_F_HW_VLAN_CTAG_RX) {
0fb9968876c3866 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1567 u32 maccr;
0fb9968876c3866 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1568
0fb9968876c3866 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1569 maccr = ioread32(priv->base + FTGMAC100_OFFSET_MACCR);
0fb9968876c3866 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1570 if (priv->netdev->features & NETIF_F_HW_VLAN_CTAG_RX)
0fb9968876c3866 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1571 maccr |= FTGMAC100_MACCR_RM_VLAN;
0fb9968876c3866 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1572 else
0fb9968876c3866 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1573 maccr &= ~FTGMAC100_MACCR_RM_VLAN;
0fb9968876c3866 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1574 iowrite32(maccr, priv->base + FTGMAC100_OFFSET_MACCR);
0fb9968876c3866 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1575 }
0fb9968876c3866 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1576
0fb9968876c3866 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1577 return 0;
0fb9968876c3866 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1578 }
0fb9968876c3866 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1579
030d9828703ec7e drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1580 #ifdef CONFIG_NET_POLL_CONTROLLER
030d9828703ec7e drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1581 static void ftgmac100_poll_controller(struct net_device *netdev)
030d9828703ec7e drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1582 {
030d9828703ec7e drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1583 unsigned long flags;
030d9828703ec7e drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1584
030d9828703ec7e drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1585 local_irq_save(flags);
030d9828703ec7e drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1586 ftgmac100_interrupt(netdev->irq, netdev);
030d9828703ec7e drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1587 local_irq_restore(flags);
030d9828703ec7e drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1588 }
030d9828703ec7e drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1589 #endif
030d9828703ec7e drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1590
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1591 static const struct net_device_ops ftgmac100_netdev_ops = {
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1592 .ndo_open = ftgmac100_open,
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1593 .ndo_stop = ftgmac100_stop,
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1594 .ndo_start_xmit = ftgmac100_hard_start_xmit,
113ce107afe9799 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan 2016-07-19 1595 .ndo_set_mac_address = ftgmac100_set_mac_addr,
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1596 .ndo_validate_addr = eth_validate_addr,
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1597 .ndo_do_ioctl = ftgmac100_do_ioctl,
d3ca8fb180dbec8 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 1598 .ndo_tx_timeout = ftgmac100_tx_timeout,
f48b3c0d5b6ab4d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1599 .ndo_set_rx_mode = ftgmac100_set_rx_mode,
0fb9968876c3866 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1600 .ndo_set_features = ftgmac100_set_features,
030d9828703ec7e drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1601 #ifdef CONFIG_NET_POLL_CONTROLLER
030d9828703ec7e drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1602 .ndo_poll_controller = ftgmac100_poll_controller,
030d9828703ec7e drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1603 #endif
51564585d8c6de2 drivers/net/ethernet/faraday/ftgmac100.c Samuel Mendoza-Jonas 2017-08-28 1604 .ndo_vlan_rx_add_vid = ncsi_vlan_rx_add_vid,
51564585d8c6de2 drivers/net/ethernet/faraday/ftgmac100.c Samuel Mendoza-Jonas 2017-08-28 1605 .ndo_vlan_rx_kill_vid = ncsi_vlan_rx_kill_vid,
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1606 };
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1607
eb4181849f58f31 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan 2016-07-19 1608 static int ftgmac100_setup_mdio(struct net_device *netdev)
eb4181849f58f31 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan 2016-07-19 1609 {
eb4181849f58f31 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan 2016-07-19 1610 struct ftgmac100 *priv = netdev_priv(netdev);
eb4181849f58f31 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan 2016-07-19 1611 struct platform_device *pdev = to_platform_device(priv->dev);
abcc3eb00e10af3 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1612 int phy_intf = PHY_INTERFACE_MODE_RGMII;
abcc3eb00e10af3 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1613 struct device_node *np = pdev->dev.of_node;
eb4181849f58f31 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan 2016-07-19 1614 int i, err = 0;
e07dc63ba22df2d drivers/net/ethernet/faraday/ftgmac100.c Joel Stanley 2016-09-22 1615 u32 reg;
eb4181849f58f31 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan 2016-07-19 1616
eb4181849f58f31 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan 2016-07-19 1617 /* initialize mdio bus */
eb4181849f58f31 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan 2016-07-19 1618 priv->mii_bus = mdiobus_alloc();
eb4181849f58f31 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan 2016-07-19 1619 if (!priv->mii_bus)
eb4181849f58f31 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan 2016-07-19 1620 return -EIO;
eb4181849f58f31 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan 2016-07-19 1621
78d28543a6093fa drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12 1622 if (priv->is_aspeed) {
e07dc63ba22df2d drivers/net/ethernet/faraday/ftgmac100.c Joel Stanley 2016-09-22 1623 /* This driver supports the old MDIO interface */
e07dc63ba22df2d drivers/net/ethernet/faraday/ftgmac100.c Joel Stanley 2016-09-22 1624 reg = ioread32(priv->base + FTGMAC100_OFFSET_REVR);
e07dc63ba22df2d drivers/net/ethernet/faraday/ftgmac100.c Joel Stanley 2016-09-22 1625 reg &= ~FTGMAC100_REVR_NEW_MDIO_INTERFACE;
e07dc63ba22df2d drivers/net/ethernet/faraday/ftgmac100.c Joel Stanley 2016-09-22 1626 iowrite32(reg, priv->base + FTGMAC100_OFFSET_REVR);
f819cd926ca7c91 drivers/net/ethernet/faraday/ftgmac100.c YueHaibing 2019-03-01 1627 }
e07dc63ba22df2d drivers/net/ethernet/faraday/ftgmac100.c Joel Stanley 2016-09-22 1628
abcc3eb00e10af3 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1629 /* Get PHY mode from device-tree */
abcc3eb00e10af3 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1630 if (np) {
abcc3eb00e10af3 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1631 /* Default to RGMII. It's a gigabit part after all */
abcc3eb00e10af3 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1632 phy_intf = of_get_phy_mode(np);
abcc3eb00e10af3 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1633 if (phy_intf < 0)
abcc3eb00e10af3 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1634 phy_intf = PHY_INTERFACE_MODE_RGMII;
abcc3eb00e10af3 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1635
abcc3eb00e10af3 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1636 /* Aspeed only supports these. I don't know about other IP
abcc3eb00e10af3 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1637 * block vendors so I'm going to just let them through for
abcc3eb00e10af3 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1638 * now. Note that this is only a warning if for some obscure
abcc3eb00e10af3 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1639 * reason the DT really means to lie about it or it's a newer
abcc3eb00e10af3 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1640 * part we don't know about.
abcc3eb00e10af3 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1641 *
abcc3eb00e10af3 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1642 * On the Aspeed SoC there are additionally straps and SCU
abcc3eb00e10af3 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1643 * control bits that could tell us what the interface is
abcc3eb00e10af3 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1644 * (or allow us to configure it while the IP block is held
abcc3eb00e10af3 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1645 * in reset). For now I chose to keep this driver away from
abcc3eb00e10af3 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1646 * those SoC specific bits and assume the device-tree is
abcc3eb00e10af3 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1647 * right and the SCU has been configured properly by pinmux
abcc3eb00e10af3 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1648 * or the firmware.
abcc3eb00e10af3 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1649 */
abcc3eb00e10af3 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1650 if (priv->is_aspeed &&
abcc3eb00e10af3 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1651 phy_intf != PHY_INTERFACE_MODE_RMII &&
abcc3eb00e10af3 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1652 phy_intf != PHY_INTERFACE_MODE_RGMII &&
abcc3eb00e10af3 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1653 phy_intf != PHY_INTERFACE_MODE_RGMII_ID &&
abcc3eb00e10af3 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1654 phy_intf != PHY_INTERFACE_MODE_RGMII_RXID &&
abcc3eb00e10af3 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1655 phy_intf != PHY_INTERFACE_MODE_RGMII_TXID) {
abcc3eb00e10af3 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1656 netdev_warn(netdev,
abcc3eb00e10af3 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1657 "Unsupported PHY mode %s !\n",
abcc3eb00e10af3 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1658 phy_modes(phy_intf));
abcc3eb00e10af3 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1659 }
abcc3eb00e10af3 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1660 }
abcc3eb00e10af3 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1661
eb4181849f58f31 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan 2016-07-19 1662 priv->mii_bus->name = "ftgmac100_mdio";
eb4181849f58f31 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan 2016-07-19 1663 snprintf(priv->mii_bus->id, MII_BUS_ID_SIZE, "%s-%d",
eb4181849f58f31 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan 2016-07-19 1664 pdev->name, pdev->id);
d57b9db1ae0cde3 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-07-24 1665 priv->mii_bus->parent = priv->dev;
eb4181849f58f31 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan 2016-07-19 1666 priv->mii_bus->priv = priv->netdev;
eb4181849f58f31 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan 2016-07-19 1667 priv->mii_bus->read = ftgmac100_mdiobus_read;
eb4181849f58f31 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan 2016-07-19 1668 priv->mii_bus->write = ftgmac100_mdiobus_write;
eb4181849f58f31 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan 2016-07-19 1669
eb4181849f58f31 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan 2016-07-19 1670 for (i = 0; i < PHY_MAX_ADDR; i++)
eb4181849f58f31 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan 2016-07-19 1671 priv->mii_bus->irq[i] = PHY_POLL;
eb4181849f58f31 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan 2016-07-19 1672
eb4181849f58f31 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan 2016-07-19 1673 err = mdiobus_register(priv->mii_bus);
eb4181849f58f31 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan 2016-07-19 1674 if (err) {
eb4181849f58f31 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan 2016-07-19 1675 dev_err(priv->dev, "Cannot register MDIO bus!\n");
eb4181849f58f31 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan 2016-07-19 1676 goto err_register_mdiobus;
eb4181849f58f31 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan 2016-07-19 1677 }
eb4181849f58f31 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan 2016-07-19 1678
abcc3eb00e10af3 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1679 err = ftgmac100_mii_probe(priv, phy_intf);
eb4181849f58f31 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan 2016-07-19 1680 if (err) {
eb4181849f58f31 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan 2016-07-19 1681 dev_err(priv->dev, "MII Probe failed!\n");
eb4181849f58f31 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan 2016-07-19 1682 goto err_mii_probe;
eb4181849f58f31 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan 2016-07-19 1683 }
eb4181849f58f31 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan 2016-07-19 1684
eb4181849f58f31 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan 2016-07-19 1685 return 0;
eb4181849f58f31 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan 2016-07-19 1686
eb4181849f58f31 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan 2016-07-19 1687 err_mii_probe:
eb4181849f58f31 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan 2016-07-19 1688 mdiobus_unregister(priv->mii_bus);
eb4181849f58f31 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan 2016-07-19 1689 err_register_mdiobus:
eb4181849f58f31 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan 2016-07-19 1690 mdiobus_free(priv->mii_bus);
eb4181849f58f31 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan 2016-07-19 1691 return err;
eb4181849f58f31 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan 2016-07-19 1692 }
eb4181849f58f31 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan 2016-07-19 1693
eb4181849f58f31 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan 2016-07-19 1694 static void ftgmac100_destroy_mdio(struct net_device *netdev)
eb4181849f58f31 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan 2016-07-19 1695 {
eb4181849f58f31 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan 2016-07-19 1696 struct ftgmac100 *priv = netdev_priv(netdev);
eb4181849f58f31 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan 2016-07-19 1697
eb4181849f58f31 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan 2016-07-19 1698 if (!netdev->phydev)
eb4181849f58f31 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan 2016-07-19 1699 return;
eb4181849f58f31 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan 2016-07-19 1700
eb4181849f58f31 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan 2016-07-19 1701 phy_disconnect(netdev->phydev);
eb4181849f58f31 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan 2016-07-19 1702 mdiobus_unregister(priv->mii_bus);
eb4181849f58f31 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan 2016-07-19 1703 mdiobus_free(priv->mii_bus);
eb4181849f58f31 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan 2016-07-19 1704 }
eb4181849f58f31 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan 2016-07-19 1705
bd466c3fb5a4ff8 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan 2016-07-19 1706 static void ftgmac100_ncsi_handler(struct ncsi_dev *nd)
bd466c3fb5a4ff8 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan 2016-07-19 1707 {
bd466c3fb5a4ff8 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan 2016-07-19 1708 if (unlikely(nd->state != ncsi_dev_state_functional))
bd466c3fb5a4ff8 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan 2016-07-19 1709 return;
bd466c3fb5a4ff8 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan 2016-07-19 1710
87975a0117815b9 drivers/net/ethernet/faraday/ftgmac100.c Joel Stanley 2018-06-19 1711 netdev_dbg(nd->dev, "NCSI interface %s\n",
bd466c3fb5a4ff8 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan 2016-07-19 1712 nd->link_up ? "up" : "down");
bd466c3fb5a4ff8 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan 2016-07-19 1713 }
bd466c3fb5a4ff8 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan 2016-07-19 1714
4b70c62b9eafcee drivers/net/ethernet/faraday/ftgmac100.c Joel Stanley 2017-10-13 1715 static void ftgmac100_setup_clk(struct ftgmac100 *priv)
4b70c62b9eafcee drivers/net/ethernet/faraday/ftgmac100.c Joel Stanley 2017-10-13 1716 {
4b70c62b9eafcee drivers/net/ethernet/faraday/ftgmac100.c Joel Stanley 2017-10-13 1717 priv->clk = devm_clk_get(priv->dev, NULL);
4b70c62b9eafcee drivers/net/ethernet/faraday/ftgmac100.c Joel Stanley 2017-10-13 1718 if (IS_ERR(priv->clk))
4b70c62b9eafcee drivers/net/ethernet/faraday/ftgmac100.c Joel Stanley 2017-10-13 1719 return;
4b70c62b9eafcee drivers/net/ethernet/faraday/ftgmac100.c Joel Stanley 2017-10-13 1720
4b70c62b9eafcee drivers/net/ethernet/faraday/ftgmac100.c Joel Stanley 2017-10-13 1721 clk_prepare_enable(priv->clk);
4b70c62b9eafcee drivers/net/ethernet/faraday/ftgmac100.c Joel Stanley 2017-10-13 1722
4b70c62b9eafcee drivers/net/ethernet/faraday/ftgmac100.c Joel Stanley 2017-10-13 1723 /* Aspeed specifies a 100MHz clock is required for up to
4b70c62b9eafcee drivers/net/ethernet/faraday/ftgmac100.c Joel Stanley 2017-10-13 1724 * 1000Mbit link speeds. As NCSI is limited to 100Mbit, 25MHz
4b70c62b9eafcee drivers/net/ethernet/faraday/ftgmac100.c Joel Stanley 2017-10-13 1725 * is sufficient
4b70c62b9eafcee drivers/net/ethernet/faraday/ftgmac100.c Joel Stanley 2017-10-13 1726 */
4b70c62b9eafcee drivers/net/ethernet/faraday/ftgmac100.c Joel Stanley 2017-10-13 1727 clk_set_rate(priv->clk, priv->use_ncsi ? FTGMAC_25MHZ :
4b70c62b9eafcee drivers/net/ethernet/faraday/ftgmac100.c Joel Stanley 2017-10-13 1728 FTGMAC_100MHZ);
4b70c62b9eafcee drivers/net/ethernet/faraday/ftgmac100.c Joel Stanley 2017-10-13 1729 }
4b70c62b9eafcee drivers/net/ethernet/faraday/ftgmac100.c Joel Stanley 2017-10-13 1730
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1731 static int ftgmac100_probe(struct platform_device *pdev)
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1732 {
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1733 struct resource *res;
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1734 int irq;
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1735 struct net_device *netdev;
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1736 struct ftgmac100 *priv;
78d28543a6093fa drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12 1737 struct device_node *np;
bd466c3fb5a4ff8 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan 2016-07-19 1738 int err = 0;
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1739
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1740 if (!pdev)
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1741 return -ENODEV;
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1742
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1743 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1744 if (!res)
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1745 return -ENXIO;
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1746
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1747 irq = platform_get_irq(pdev, 0);
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1748 if (irq < 0)
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1749 return irq;
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1750
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1751 /* setup net_device */
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1752 netdev = alloc_etherdev(sizeof(*priv));
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1753 if (!netdev) {
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1754 err = -ENOMEM;
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1755 goto err_alloc_etherdev;
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1756 }
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1757
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1758 SET_NETDEV_DEV(netdev, &pdev->dev);
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1759
7ad24ea4bf620a3 drivers/net/ethernet/faraday/ftgmac100.c Wilfried Klaebe 2014-05-11 1760 netdev->ethtool_ops = &ftgmac100_ethtool_ops;
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1761 netdev->netdev_ops = &ftgmac100_netdev_ops;
d3ca8fb180dbec8 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10 1762 netdev->watchdog_timeo = 5 * HZ;
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1763
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1764 platform_set_drvdata(pdev, netdev);
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1765
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1766 /* setup private data */
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1767 priv = netdev_priv(netdev);
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1768 priv->netdev = netdev;
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1769 priv->dev = &pdev->dev;
855944ce1cc4037 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1770 INIT_WORK(&priv->reset_task, ftgmac100_reset_task);
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1771
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1772 /* map io memory */
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1773 priv->res = request_mem_region(res->start, resource_size(res),
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1774 dev_name(&pdev->dev));
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1775 if (!priv->res) {
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1776 dev_err(&pdev->dev, "Could not reserve memory region\n");
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1777 err = -ENOMEM;
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1778 goto err_req_mem;
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1779 }
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1780
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1781 priv->base = ioremap(res->start, resource_size(res));
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1782 if (!priv->base) {
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1783 dev_err(&pdev->dev, "Failed to ioremap ethernet registers\n");
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1784 err = -EIO;
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1785 goto err_ioremap;
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1786 }
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1787
60b28a1167749c5 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1788 netdev->irq = irq;
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1789
7c8e5141ca633ae drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1790 /* Enable pause */
7c8e5141ca633ae drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1791 priv->tx_pause = true;
7c8e5141ca633ae drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1792 priv->rx_pause = true;
7c8e5141ca633ae drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1793 priv->aneg_pause = true;
7c8e5141ca633ae drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1794
113ce107afe9799 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan 2016-07-19 1795 /* MAC address from chip or random one */
ba1b1234d6a3ecb drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12 1796 ftgmac100_initial_mac(priv);
113ce107afe9799 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan 2016-07-19 1797
78d28543a6093fa drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12 1798 np = pdev->dev.of_node;
78d28543a6093fa drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12 1799 if (np && (of_device_is_compatible(np, "aspeed,ast2400-mac") ||
78d28543a6093fa drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12 1800 of_device_is_compatible(np, "aspeed,ast2500-mac"))) {
2a0ab8ebbec6341 drivers/net/ethernet/faraday/ftgmac100.c Joel Stanley 2016-09-22 1801 priv->rxdes0_edorr_mask = BIT(30);
2a0ab8ebbec6341 drivers/net/ethernet/faraday/ftgmac100.c Joel Stanley 2016-09-22 1802 priv->txdes0_edotr_mask = BIT(30);
78d28543a6093fa drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12 1803 priv->is_aspeed = true;
2a0ab8ebbec6341 drivers/net/ethernet/faraday/ftgmac100.c Joel Stanley 2016-09-22 1804 } else {
2a0ab8ebbec6341 drivers/net/ethernet/faraday/ftgmac100.c Joel Stanley 2016-09-22 1805 priv->rxdes0_edorr_mask = BIT(15);
2a0ab8ebbec6341 drivers/net/ethernet/faraday/ftgmac100.c Joel Stanley 2016-09-22 1806 priv->txdes0_edotr_mask = BIT(15);
2a0ab8ebbec6341 drivers/net/ethernet/faraday/ftgmac100.c Joel Stanley 2016-09-22 1807 }
2a0ab8ebbec6341 drivers/net/ethernet/faraday/ftgmac100.c Joel Stanley 2016-09-22 1808
78d28543a6093fa drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12 1809 if (np && of_get_property(np, "use-ncsi", NULL)) {
bd466c3fb5a4ff8 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan 2016-07-19 1810 if (!IS_ENABLED(CONFIG_NET_NCSI)) {
bd466c3fb5a4ff8 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan 2016-07-19 1811 dev_err(&pdev->dev, "NCSI stack not enabled\n");
bd466c3fb5a4ff8 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan 2016-07-19 1812 goto err_ncsi_dev;
bd466c3fb5a4ff8 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan 2016-07-19 1813 }
bd466c3fb5a4ff8 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan 2016-07-19 1814
bd466c3fb5a4ff8 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan 2016-07-19 1815 dev_info(&pdev->dev, "Using NCSI interface\n");
bd466c3fb5a4ff8 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan 2016-07-19 1816 priv->use_ncsi = true;
bd466c3fb5a4ff8 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan 2016-07-19 1817 priv->ndev = ncsi_register_dev(netdev, ftgmac100_ncsi_handler);
bd466c3fb5a4ff8 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan 2016-07-19 1818 if (!priv->ndev)
bd466c3fb5a4ff8 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan 2016-07-19 1819 goto err_ncsi_dev;
bd466c3fb5a4ff8 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan 2016-07-19 1820 } else {
bd466c3fb5a4ff8 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan 2016-07-19 1821 priv->use_ncsi = false;
eb4181849f58f31 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan 2016-07-19 1822 err = ftgmac100_setup_mdio(netdev);
eb4181849f58f31 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan 2016-07-19 1823 if (err)
eb4181849f58f31 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan 2016-07-19 1824 goto err_setup_mdio;
bd466c3fb5a4ff8 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan 2016-07-19 1825 }
bd466c3fb5a4ff8 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan 2016-07-19 1826
4b70c62b9eafcee drivers/net/ethernet/faraday/ftgmac100.c Joel Stanley 2017-10-13 1827 if (priv->is_aspeed)
4b70c62b9eafcee drivers/net/ethernet/faraday/ftgmac100.c Joel Stanley 2017-10-13 1828 ftgmac100_setup_clk(priv);
4b70c62b9eafcee drivers/net/ethernet/faraday/ftgmac100.c Joel Stanley 2017-10-13 1829
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12 1830 /* Default ring sizes */
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12 1831 priv->rx_q_entries = priv->new_rx_q_entries = DEF_RX_QUEUE_ENTRIES;
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12 1832 priv->tx_q_entries = priv->new_tx_q_entries = DEF_TX_QUEUE_ENTRIES;
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12 1833
6aff0bf641cf69e drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12 1834 /* Base feature set */
8c3ed1315e129e9 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12 1835 netdev->hw_features = NETIF_F_RXCSUM | NETIF_F_HW_CSUM |
0fb9968876c3866 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1836 NETIF_F_GRO | NETIF_F_SG | NETIF_F_HW_VLAN_CTAG_RX |
0fb9968876c3866 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18 1837 NETIF_F_HW_VLAN_CTAG_TX;
6aff0bf641cf69e drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12 1838
51564585d8c6de2 drivers/net/ethernet/faraday/ftgmac100.c Samuel Mendoza-Jonas 2017-08-28 1839 if (priv->use_ncsi)
51564585d8c6de2 drivers/net/ethernet/faraday/ftgmac100.c Samuel Mendoza-Jonas 2017-08-28 1840 netdev->hw_features |= NETIF_F_HW_VLAN_CTAG_FILTER;
51564585d8c6de2 drivers/net/ethernet/faraday/ftgmac100.c Samuel Mendoza-Jonas 2017-08-28 1841
6aff0bf641cf69e drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12 1842 /* AST2400 doesn't have working HW checksum generation */
6aff0bf641cf69e drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12 1843 if (np && (of_device_is_compatible(np, "aspeed,ast2400-mac")))
8c3ed1315e129e9 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12 1844 netdev->hw_features &= ~NETIF_F_HW_CSUM;
6aff0bf641cf69e drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12 1845 if (np && of_get_property(np, "no-hw-checksum", NULL))
8c3ed1315e129e9 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12 1846 netdev->hw_features &= ~(NETIF_F_HW_CSUM | NETIF_F_RXCSUM);
8c3ed1315e129e9 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12 1847 netdev->features |= netdev->hw_features;
bd466c3fb5a4ff8 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan 2016-07-19 1848
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1849 /* register network device */
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1850 err = register_netdev(netdev);
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1851 if (err) {
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1852 dev_err(&pdev->dev, "Failed to register netdev\n");
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1853 goto err_register_netdev;
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1854 }
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1855
60b28a1167749c5 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1856 netdev_info(netdev, "irq %d, mapped at %p\n", netdev->irq, priv->base);
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1857
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1858 return 0;
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1859
bd466c3fb5a4ff8 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan 2016-07-19 1860 err_ncsi_dev:
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1861 err_register_netdev:
eb4181849f58f31 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan 2016-07-19 1862 ftgmac100_destroy_mdio(netdev);
eb4181849f58f31 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan 2016-07-19 1863 err_setup_mdio:
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1864 iounmap(priv->base);
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1865 err_ioremap:
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1866 release_resource(priv->res);
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1867 err_req_mem:
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1868 free_netdev(netdev);
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1869 err_alloc_etherdev:
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1870 return err;
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1871 }
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1872
be12502e2e64854 drivers/net/ethernet/faraday/ftgmac100.c Dmitry Torokhov 2017-03-01 1873 static int ftgmac100_remove(struct platform_device *pdev)
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1874 {
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1875 struct net_device *netdev;
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1876 struct ftgmac100 *priv;
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1877
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1878 netdev = platform_get_drvdata(pdev);
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1879 priv = netdev_priv(netdev);
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1880
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1881 unregister_netdev(netdev);
855944ce1cc4037 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1882
4b70c62b9eafcee drivers/net/ethernet/faraday/ftgmac100.c Joel Stanley 2017-10-13 1883 clk_disable_unprepare(priv->clk);
4b70c62b9eafcee drivers/net/ethernet/faraday/ftgmac100.c Joel Stanley 2017-10-13 1884
855944ce1cc4037 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1885 /* There's a small chance the reset task will have been re-queued,
855944ce1cc4037 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1886 * during stop, make sure it's gone before we free the structure.
855944ce1cc4037 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1887 */
855944ce1cc4037 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1888 cancel_work_sync(&priv->reset_task);
855944ce1cc4037 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05 1889
eb4181849f58f31 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan 2016-07-19 1890 ftgmac100_destroy_mdio(netdev);
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1891
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1892 iounmap(priv->base);
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1893 release_resource(priv->res);
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1894
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1895 netif_napi_del(&priv->napi);
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1896 free_netdev(netdev);
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1897 return 0;
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1898 }
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1899
bb168e2e9e512e6 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan 2016-07-19 1900 static const struct of_device_id ftgmac100_of_match[] = {
bb168e2e9e512e6 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan 2016-07-19 1901 { .compatible = "faraday,ftgmac100" },
bb168e2e9e512e6 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan 2016-07-19 1902 { }
bb168e2e9e512e6 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan 2016-07-19 1903 };
bb168e2e9e512e6 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan 2016-07-19 1904 MODULE_DEVICE_TABLE(of, ftgmac100_of_match);
bb168e2e9e512e6 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan 2016-07-19 1905
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1906 static struct platform_driver ftgmac100_driver = {
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1907 .probe = ftgmac100_probe,
be12502e2e64854 drivers/net/ethernet/faraday/ftgmac100.c Dmitry Torokhov 2017-03-01 1908 .remove = ftgmac100_remove,
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1909 .driver = {
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1910 .name = DRV_NAME,
bb168e2e9e512e6 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan 2016-07-19 1911 .of_match_table = ftgmac100_of_match,
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1912 },
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1913 };
14f645d0deb4d18 drivers/net/ethernet/faraday/ftgmac100.c Sachin Kamat 2013-03-18 1914 module_platform_driver(ftgmac100_driver);
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1915
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1916 MODULE_AUTHOR("Po-Yu Chuang <ratbert@faraday-tech.com>");
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1917 MODULE_DESCRIPTION("FTGMAC100 driver");
69785b79ca9b1ac drivers/net/ftgmac100.c Po-Yu Chuang 2011-06-08 1918 MODULE_LICENSE("GPL");
:::::: The code at line 777 was first introduced by commit
:::::: 6db7470445f0757d2e8f23f57d86611338717ebe ftgmac100: Add support for fragmented tx
:::::: TO: Benjamin Herrenschmidt <benh@kernel.crashing.org>
:::::: CC: David S. Miller <davem@davemloft.net>
---
0-DAY kernel test infrastructure Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all Intel Corporation
[-- Attachment #2: .config.gz --]
[-- Type: application/gzip, Size: 51198 bytes --]
^ permalink raw reply
* Re: [bpf-next 0/6] Introduce a BPF helper to generate SYN cookies
From: Eric Dumazet @ 2019-07-23 6:30 UTC (permalink / raw)
To: Petar Penkov
Cc: netdev, bpf, David Miller, Alexei Starovoitov, Daniel Borkmann,
lmb, Stanislav Fomichev, Petar Penkov
In-Reply-To: <20190723002042.105927-1-ppenkov.kernel@gmail.com>
On Tue, Jul 23, 2019 at 2:20 AM Petar Penkov <ppenkov.kernel@gmail.com> wrote:
>
> From: Petar Penkov <ppenkov@google.com>
>
> This patch series introduces a BPF helper function that allows generating SYN
> cookies from BPF. Currently, this helper is enabled at both the TC hook and the
> XDP hook.
Please provide performance numbers ?
We want to know if we increase performance under synflood, or if it
does not change, or even decrease ;)
Thanks.
^ permalink raw reply
* Re: [PATCH 1/3] mm/gup: introduce __put_user_pages()
From: John Hubbard @ 2019-07-23 6:33 UTC (permalink / raw)
To: Christoph Hellwig, john.hubbard
Cc: Andrew Morton, Alexander Viro, Björn Töpel,
Boaz Harrosh, Daniel Vetter, Dan Williams, Dave Chinner,
David Airlie, David S . Miller, Ilya Dryomov, Jan Kara,
Jason Gunthorpe, Jens Axboe, Jérôme Glisse,
Johannes Thumshirn, Magnus Karlsson, Matthew Wilcox,
Miklos Szeredi, Ming Lei, Sage Weil, Santosh Shilimkar, Yan Zheng,
netdev, dri-devel, linux-mm, linux-rdma, bpf, LKML
In-Reply-To: <20190723055359.GC17148@lst.de>
On 7/22/19 10:53 PM, Christoph Hellwig wrote:
> On Mon, Jul 22, 2019 at 03:34:13PM -0700, john.hubbard@gmail.com wrote:
>> +enum pup_flags_t {
>> + PUP_FLAGS_CLEAN = 0,
>> + PUP_FLAGS_DIRTY = 1,
>> + PUP_FLAGS_LOCK = 2,
>> + PUP_FLAGS_DIRTY_LOCK = 3,
>> +};
>
> Well, the enum defeats the ease of just being able to pass a boolean
> expression to the function, which would simplify a lot of the caller,
> so if we need to support the !locked version I'd rather see that as
> a separate helper.
>
> But do we actually have callers where not using the _lock version is
> not a bug? set_page_dirty makes sense in the context of a file systems
> that have a reference to the inode the page hangs off, but that is
> (almost?) never the case for get_user_pages.
>
I'm seeing about 18 places where set_page_dirty() is used, in the call site
conversions so far, and about 20 places where set_page_dirty_lock() is
used. So without knowing how many of the former (if any) represent bugs,
you can see why the proposal here supports both DIRTY and DIRTY_LOCK.
Anyway, yes, I could change it, based on your estimation that most of the
set_page_dirty() calls really should be set_page_dirty_lock().
In that case, we would end up with approximately the following:
/* Here, "dirty" really means, "call set_page_dirty_lock()": */
void __put_user_pages(struct page **pages, unsigned long npages,
bool dirty);
/* Here, "dirty" really means, "call set_page_dirty()": */
void __put_user_pages_unlocked(struct page **pages, unsigned long npages,
bool dirty);
?
thanks,
--
John Hubbard
NVIDIA
^ permalink raw reply
* bpf-next boot error: WARNING: workqueue cpumask: online intersect > possible intersect (2)
From: syzbot @ 2019-07-23 6:38 UTC (permalink / raw)
To: linux-kernel, netdev, syzkaller-bugs
Hello,
syzbot found the following crash on:
HEAD commit: 66b5f1c4 net-ipv6-ndisc: add support for RFC7710 RA Captiv..
git tree: bpf-next
console output: https://syzkaller.appspot.com/x/log.txt?x=15513e78600000
kernel config: https://syzkaller.appspot.com/x/.config?x=9aec8cb13b5f7389
dashboard link: https://syzkaller.appspot.com/bug?extid=88c042e36cde4bcbd19b
compiler: gcc (GCC) 9.0.0 20181231 (experimental)
Unfortunately, I don't have any reproducer for this crash yet.
IMPORTANT: if you fix the bug, please add the following tag to the commit:
Reported-by: syzbot+88c042e36cde4bcbd19b@syzkaller.appspotmail.com
smpboot: CPU0: Intel(R) Xeon(R) CPU @ 2.30GHz (family: 0x6, model: 0x3f,
stepping: 0x0)
Performance Events: unsupported p6 CPU model 63 no PMU driver, software
events only.
rcu: Hierarchical SRCU implementation.
NMI watchdog: Perf NMI watchdog permanently disabled
smp: Bringing up secondary CPUs ...
x86: Booting SMP configuration:
.... node #0, CPUs: #1
MDS CPU bug present and SMT on, data leak possible. See
https://www.kernel.org/doc/html/latest/admin-guide/hw-vuln/mds.html for
more details.
smp: Brought up 2 nodes, 2 CPUs
smpboot: Max logical packages: 1
smpboot: Total of 2 processors activated (9200.00 BogoMIPS)
devtmpfs: initialized
clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns:
19112604462750000 ns
futex hash table entries: 512 (order: 4, 65536 bytes, vmalloc)
xor: automatically using best checksumming function avx
PM: RTC time: 00:21:51, date: 2019-07-23
NET: Registered protocol family 16
audit: initializing netlink subsys (disabled)
cpuidle: using governor menu
ACPI: bus type PCI registered
dca service started, version 1.12.1
PCI: Using configuration type 1 for base access
WARNING: workqueue cpumask: online intersect > possible intersect
HugeTLB registered 1.00 GiB page size, pre-allocated 0 pages
HugeTLB registered 2.00 MiB page size, pre-allocated 0 pages
cryptd: max_cpu_qlen set to 1000
raid6: avx2x4 gen() 12057 MB/s
raid6: avx2x4 xor() 6485 MB/s
raid6: avx2x2 gen() 5976 MB/s
raid6: avx2x2 xor() 3848 MB/s
raid6: avx2x1 gen() 921 MB/s
raid6: avx2x1 xor() 2173 MB/s
raid6: sse2x4 gen() 6202 MB/s
raid6: sse2x4 xor() 3397 MB/s
raid6: sse2x2 gen() 3875 MB/s
raid6: sse2x2 xor() 1961 MB/s
raid6: sse2x1 gen() 789 MB/s
raid6: sse2x1 xor() 964 MB/s
raid6: using algorithm avx2x4 gen() 12057 MB/s
raid6: .... xor() 6485 MB/s, rmw enabled
raid6: using avx2x2 recovery algorithm
ACPI: Added _OSI(Module Device)
ACPI: Added _OSI(Processor Device)
ACPI: Added _OSI(3.0 _SCP Extensions)
ACPI: Added _OSI(Processor Aggregator Device)
ACPI: Added _OSI(Linux-Dell-Video)
ACPI: Added _OSI(Linux-Lenovo-NV-HDMI-Audio)
ACPI: Added _OSI(Linux-HPI-Hybrid-Graphics)
ACPI: 2 ACPI AML tables successfully acquired and loaded
ACPI: Interpreter enabled
ACPI: (supports S0 S3 S4 S5)
ACPI: Using IOAPIC for interrupt routing
PCI: Using host bridge windows from ACPI; if necessary, use "pci=nocrs" and
report a bug
ACPI: Enabled 16 GPEs in block 00 to 0F
ACPI: PCI Root Bridge [PCI0] (domain 0000 [bus 00-ff])
acpi PNP0A03:00: _OSC: OS supports [ASPM ClockPM Segments MSI HPX-Type3]
acpi PNP0A03:00: fail to add MMCONFIG information, can't access extended
PCI configuration space under this bridge.
PCI host bridge to bus 0000:00
pci_bus 0000:00: root bus resource [io 0x0000-0x0cf7 window]
pci_bus 0000:00: root bus resource [io 0x0d00-0xffff window]
pci_bus 0000:00: root bus resource [mem 0x000a0000-0x000bffff window]
pci_bus 0000:00: root bus resource [mem 0xc0000000-0xfebfffff window]
pci_bus 0000:00: root bus resource [bus 00-ff]
pci 0000:00:00.0: [8086:1237] type 00 class 0x060000
pci 0000:00:01.0: [8086:7110] type 00 class 0x060100
pci 0000:00:01.3: [8086:7113] type 00 class 0x068000
pci 0000:00:01.3: quirk: [io 0xb000-0xb03f] claimed by PIIX4 ACPI
pci 0000:00:03.0: [1af4:1004] type 00 class 0x000000
pci 0000:00:03.0: reg 0x10: [io 0xc000-0xc03f]
pci 0000:00:03.0: reg 0x14: [mem 0xfebfe000-0xfebfe07f]
pci 0000:00:04.0: [1af4:1000] type 00 class 0x020000
pci 0000:00:04.0: reg 0x10: [io 0xc040-0xc07f]
pci 0000:00:04.0: reg 0x14: [mem 0xfebff000-0xfebff07f]
ACPI: PCI Interrupt Link [LNKA] (IRQs 5 *10 11)
ACPI: PCI Interrupt Link [LNKB] (IRQs 5 *10 11)
ACPI: PCI Interrupt Link [LNKC] (IRQs 5 10 *11)
ACPI: PCI Interrupt Link [LNKD] (IRQs 5 10 *11)
ACPI: PCI Interrupt Link [LNKS] (IRQs *9)
vgaarb: loaded
SCSI subsystem initialized
ACPI: bus type USB registered
usbcore: registered new interface driver usbfs
usbcore: registered new interface driver hub
usbcore: registered new device driver usb
mc: Linux media interface: v0.10
videodev: Linux video capture interface: v2.00
pps_core: LinuxPPS API ver. 1 registered
pps_core: Software ver. 5.3.6 - Copyright 2005-2007 Rodolfo Giometti
<giometti@linux.it>
PTP clock support registered
EDAC MC: Ver: 3.0.0
Advanced Linux Sound Architecture Driver Initialized.
PCI: Using ACPI for IRQ routing
Bluetooth: Core ver 2.22
NET: Registered protocol family 31
Bluetooth: HCI device and connection manager initialized
Bluetooth: HCI socket layer initialized
Bluetooth: L2CAP socket layer initialized
Bluetooth: SCO socket layer initialized
NET: Registered protocol family 8
NET: Registered protocol family 20
NetLabel: Initializing
NetLabel: domain hash size = 128
NetLabel: protocols = UNLABELED CIPSOv4 CALIPSO
NetLabel: unlabeled traffic allowed by default
nfc: nfc_init: NFC Core ver 0.1
NET: Registered protocol family 39
clocksource: Switched to clocksource kvm-clock
VFS: Disk quotas dquot_6.6.0
VFS: Dquot-cache hash table entries: 512 (order 0, 4096 bytes)
FS-Cache: Loaded
*** VALIDATE hugetlbfs ***
CacheFiles: Loaded
TOMOYO: 2.6.0
Mandatory Access Control activated.
AppArmor: AppArmor Filesystem Enabled
pnp: PnP ACPI init
pnp: PnP ACPI: found 7 devices
thermal_sys: Registered thermal governor 'step_wise'
thermal_sys: Registered thermal governor 'user_space'
clocksource: acpi_pm: mask: 0xffffff max_cycles: 0xffffff, max_idle_ns:
2085701024 ns
pci_bus 0000:00: resource 4 [io 0x0000-0x0cf7 window]
pci_bus 0000:00: resource 5 [io 0x0d00-0xffff window]
pci_bus 0000:00: resource 6 [mem 0x000a0000-0x000bffff window]
pci_bus 0000:00: resource 7 [mem 0xc0000000-0xfebfffff window]
NET: Registered protocol family 2
tcp_listen_portaddr_hash hash table entries: 4096 (order: 6, 294912 bytes,
vmalloc)
TCP established hash table entries: 65536 (order: 7, 524288 bytes, vmalloc)
TCP bind hash table entries: 65536 (order: 10, 4194304 bytes, vmalloc)
TCP: Hash tables configured (established 65536 bind 65536)
UDP hash table entries: 4096 (order: 7, 655360 bytes, vmalloc)
UDP-Lite hash table entries: 4096 (order: 7, 655360 bytes, vmalloc)
NET: Registered protocol family 1
RPC: Registered named UNIX socket transport module.
RPC: Registered udp transport module.
RPC: Registered tcp transport module.
RPC: Registered tcp NFSv4.1 backchannel transport module.
NET: Registered protocol family 44
pci 0000:00:00.0: Limiting direct PCI/PCI transfers
PCI: CLS 0 bytes, default 64
PCI-DMA: Using software bounce buffering for IO (SWIOTLB)
software IO TLB: mapped [mem 0xaa800000-0xae800000] (64MB)
RAPL PMU: API unit is 2^-32 Joules, 0 fixed counters, 10737418240 ms ovfl
timer
kvm: already loaded the other module
clocksource: tsc: mask: 0xffffffffffffffff max_cycles: 0x212735223b2,
max_idle_ns: 440795277976 ns
clocksource: Switched to clocksource tsc
mce: Machine check injector initialized
check: Scanning for low memory corruption every 60 seconds
Initialise system trusted keyrings
workingset: timestamp_bits=40 max_order=21 bucket_order=0
zbud: loaded
DLM installed
squashfs: version 4.0 (2009/01/31) Phillip Lougher
FS-Cache: Netfs 'nfs' registered for caching
NFS: Registering the id_resolver key type
Key type id_resolver registered
Key type id_legacy registered
nfs4filelayout_init: NFSv4 File Layout Driver Registering...
Installing knfsd (copyright (C) 1996 okir@monad.swb.de).
ntfs: driver 2.1.32 [Flags: R/W].
fuse: init (API version 7.31)
JFS: nTxBlock = 8192, nTxLock = 65536
SGI XFS with ACLs, security attributes, realtime, no debug enabled
9p: Installing v9fs 9p2000 file system support
FS-Cache: Netfs '9p' registered for caching
gfs2: GFS2 installed
FS-Cache: Netfs 'ceph' registered for caching
ceph: loaded (mds proto 32)
NET: Registered protocol family 38
async_tx: api initialized (async)
Key type asymmetric registered
Asymmetric key parser 'x509' registered
Asymmetric key parser 'pkcs8' registered
Key type pkcs7_test registered
Asymmetric key parser 'tpm_parser' registered
Block layer SCSI generic (bsg) driver version 0.4 loaded (major 246)
io scheduler mq-deadline registered
io scheduler kyber registered
io scheduler bfq registered
input: Power Button as /devices/LNXSYSTM:00/LNXPWRBN:00/input/input0
ACPI: Power Button [PWRF]
input: Sleep Button as /devices/LNXSYSTM:00/LNXSLPBN:00/input/input1
ACPI: Sleep Button [SLPF]
ioatdma: Intel(R) QuickData Technology Driver 5.00
PCI Interrupt Link [LNKC] enabled at IRQ 11
virtio-pci 0000:00:03.0: virtio_pci: leaving for legacy driver
PCI Interrupt Link [LNKD] enabled at IRQ 10
virtio-pci 0000:00:04.0: virtio_pci: leaving for legacy driver
HDLC line discipline maxframe=4096
N_HDLC line discipline registered.
Serial: 8250/16550 driver, 4 ports, IRQ sharing enabled
00:03: ttyS0 at I/O 0x3f8 (irq = 4, base_baud = 115200) is a 16550A
00:04: ttyS1 at I/O 0x2f8 (irq = 3, base_baud = 115200) is a 16550A
00:05: ttyS2 at I/O 0x3e8 (irq = 6, base_baud = 115200) is a 16550A
00:06: ttyS3 at I/O 0x2e8 (irq = 7, base_baud = 115200) is a 16550A
Non-volatile memory driver v1.3
Linux agpgart interface v0.103
[drm] Initialized vgem 1.0.0 20120112 for vgem on minor 0
[drm] Supports vblank timestamp caching Rev 2 (21.10.2013).
[drm] Driver supports precise vblank timestamp query.
[drm] Initialized vkms 1.0.0 20180514 for vkms on minor 1
usbcore: registered new interface driver udl
brd: module loaded
loop: module loaded
zram: Added device: zram0
null: module loaded
nfcsim 0.2 initialized
Loading iSCSI transport class v2.0-870.
scsi host0: Virtio SCSI HBA
st: Version 20160209, fixed bufsize 32768, s/g segs 256
kobject: 'sd' (00000000062140f2): kobject_uevent_env
kobject: 'sd' (00000000062140f2): fill_kobj_path: path
= '/bus/scsi/drivers/sd'
kobject: 'sr' (00000000ef64c50b): kobject_add_internal: parent: 'drivers',
set: 'drivers'
kobject: 'sr' (00000000ef64c50b): kobject_uevent_env
kobject: 'sr' (00000000ef64c50b): fill_kobj_path: path
= '/bus/scsi/drivers/sr'
kobject: 'scsi_generic' (00000000007b57bc): kobject_add_internal:
parent: 'class', set: 'class'
kobject: 'scsi_generic' (00000000007b57bc): kobject_uevent_env
kobject: 'scsi_generic' (00000000007b57bc): fill_kobj_path: path
= '/class/scsi_generic'
kobject: 'nvme-wq' (00000000b79e19cd): kobject_add_internal:
parent: 'workqueue', set: 'devices'
kobject: 'nvme-wq' (00000000b79e19cd): kobject_uevent_env
kobject: 'nvme-wq' (00000000b79e19cd): kobject_uevent_env: uevent_suppress
caused the event to drop!
kobject: 'nvme-wq' (00000000b79e19cd): kobject_uevent_env
kobject: 'nvme-wq' (00000000b79e19cd): fill_kobj_path: path
= '/devices/virtual/workqueue/nvme-wq'
kobject: 'nvme-reset-wq' (0000000070597663): kobject_add_internal:
parent: 'workqueue', set: 'devices'
kobject: 'nvme-reset-wq' (0000000070597663): kobject_uevent_env
kobject: 'nvme-reset-wq' (0000000070597663): kobject_uevent_env:
uevent_suppress caused the event to drop!
kobject: 'nvme-reset-wq' (0000000070597663): kobject_uevent_env
kobject: 'nvme-reset-wq' (0000000070597663): fill_kobj_path: path
= '/devices/virtual/workqueue/nvme-reset-wq'
kobject: 'nvme-delete-wq' (00000000c9ed28dd): kobject_add_internal:
parent: 'workqueue', set: 'devices'
kobject: 'nvme-delete-wq' (00000000c9ed28dd): kobject_uevent_env
kobject: 'nvme-delete-wq' (00000000c9ed28dd): kobject_uevent_env:
uevent_suppress caused the event to drop!
kobject: 'nvme-delete-wq' (00000000c9ed28dd): kobject_uevent_env
kobject: 'nvme-delete-wq' (00000000c9ed28dd): fill_kobj_path: path
= '/devices/virtual/workqueue/nvme-delete-wq'
---
This bug is generated by a bot. It may contain errors.
See https://goo.gl/tpsmEJ for more information about syzbot.
syzbot engineers can be reached at syzkaller@googlegroups.com.
syzbot will keep track of this bug report. See:
https://goo.gl/tpsmEJ#status for how to communicate with syzbot.
^ permalink raw reply
* net boot error: WARNING: workqueue cpumask: online intersect > possible intersect (2)
From: syzbot @ 2019-07-23 6:38 UTC (permalink / raw)
To: linux-kernel, netdev, syzkaller-bugs
Hello,
syzbot found the following crash on:
HEAD commit: 12185dfe bonding: Force slave speed check after link state..
git tree: net
console output: https://syzkaller.appspot.com/x/log.txt?x=1299b07c600000
kernel config: https://syzkaller.appspot.com/x/.config?x=9aec8cb13b5f7389
dashboard link: https://syzkaller.appspot.com/bug?extid=5afa6eb0187aa0db10d0
compiler: gcc (GCC) 9.0.0 20181231 (experimental)
Unfortunately, I don't have any reproducer for this crash yet.
IMPORTANT: if you fix the bug, please add the following tag to the commit:
Reported-by: syzbot+5afa6eb0187aa0db10d0@syzkaller.appspotmail.com
smpboot: CPU0: Intel(R) Xeon(R) CPU @ 2.30GHz (family: 0x6, model: 0x3f,
stepping: 0x0)
Performance Events: unsupported p6 CPU model 63 no PMU driver, software
events only.
rcu: Hierarchical SRCU implementation.
NMI watchdog: Perf NMI watchdog permanently disabled
smp: Bringing up secondary CPUs ...
x86: Booting SMP configuration:
.... node #0, CPUs: #1
MDS CPU bug present and SMT on, data leak possible. See
https://www.kernel.org/doc/html/latest/admin-guide/hw-vuln/mds.html for
more details.
smp: Brought up 2 nodes, 2 CPUs
smpboot: Max logical packages: 1
smpboot: Total of 2 processors activated (9200.00 BogoMIPS)
devtmpfs: initialized
clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns:
19112604462750000 ns
futex hash table entries: 512 (order: 4, 65536 bytes, vmalloc)
xor: automatically using best checksumming function avx
PM: RTC time: 23:29:51, date: 2019-07-22
NET: Registered protocol family 16
audit: initializing netlink subsys (disabled)
cpuidle: using governor menu
ACPI: bus type PCI registered
dca service started, version 1.12.1
PCI: Using configuration type 1 for base access
WARNING: workqueue cpumask: online intersect > possible intersect
HugeTLB registered 1.00 GiB page size, pre-allocated 0 pages
HugeTLB registered 2.00 MiB page size, pre-allocated 0 pages
cryptd: max_cpu_qlen set to 1000
raid6: avx2x4 gen() 12501 MB/s
raid6: avx2x4 xor() 6221 MB/s
raid6: avx2x2 gen() 4903 MB/s
raid6: avx2x2 xor() 3850 MB/s
raid6: avx2x1 gen() 1521 MB/s
raid6: avx2x1 xor() 2163 MB/s
raid6: sse2x4 gen() 6232 MB/s
raid6: sse2x4 xor() 3408 MB/s
raid6: sse2x2 gen() 3865 MB/s
raid6: sse2x2 xor() 1956 MB/s
raid6: sse2x1 gen() 1278 MB/s
raid6: sse2x1 xor() 961 MB/s
raid6: using algorithm avx2x4 gen() 12501 MB/s
raid6: .... xor() 6221 MB/s, rmw enabled
raid6: using avx2x2 recovery algorithm
ACPI: Added _OSI(Module Device)
ACPI: Added _OSI(Processor Device)
ACPI: Added _OSI(3.0 _SCP Extensions)
ACPI: Added _OSI(Processor Aggregator Device)
ACPI: Added _OSI(Linux-Dell-Video)
ACPI: Added _OSI(Linux-Lenovo-NV-HDMI-Audio)
ACPI: Added _OSI(Linux-HPI-Hybrid-Graphics)
ACPI: 2 ACPI AML tables successfully acquired and loaded
ACPI: Interpreter enabled
ACPI: (supports S0 S3 S4 S5)
ACPI: Using IOAPIC for interrupt routing
PCI: Using host bridge windows from ACPI; if necessary, use "pci=nocrs" and
report a bug
ACPI: Enabled 16 GPEs in block 00 to 0F
ACPI: PCI Root Bridge [PCI0] (domain 0000 [bus 00-ff])
acpi PNP0A03:00: _OSC: OS supports [ASPM ClockPM Segments MSI HPX-Type3]
acpi PNP0A03:00: fail to add MMCONFIG information, can't access extended
PCI configuration space under this bridge.
PCI host bridge to bus 0000:00
pci_bus 0000:00: root bus resource [io 0x0000-0x0cf7 window]
pci_bus 0000:00: root bus resource [io 0x0d00-0xffff window]
pci_bus 0000:00: root bus resource [mem 0x000a0000-0x000bffff window]
pci_bus 0000:00: root bus resource [mem 0xc0000000-0xfebfffff window]
pci_bus 0000:00: root bus resource [bus 00-ff]
pci 0000:00:00.0: [8086:1237] type 00 class 0x060000
pci 0000:00:01.0: [8086:7110] type 00 class 0x060100
pci 0000:00:01.3: [8086:7113] type 00 class 0x068000
pci 0000:00:01.3: quirk: [io 0xb000-0xb03f] claimed by PIIX4 ACPI
pci 0000:00:03.0: [1af4:1004] type 00 class 0x000000
pci 0000:00:03.0: reg 0x10: [io 0xc000-0xc03f]
pci 0000:00:03.0: reg 0x14: [mem 0xfebfe000-0xfebfe07f]
pci 0000:00:04.0: [1af4:1000] type 00 class 0x020000
pci 0000:00:04.0: reg 0x10: [io 0xc040-0xc07f]
pci 0000:00:04.0: reg 0x14: [mem 0xfebff000-0xfebff07f]
ACPI: PCI Interrupt Link [LNKA] (IRQs 5 *10 11)
ACPI: PCI Interrupt Link [LNKB] (IRQs 5 *10 11)
ACPI: PCI Interrupt Link [LNKC] (IRQs 5 10 *11)
ACPI: PCI Interrupt Link [LNKD] (IRQs 5 10 *11)
ACPI: PCI Interrupt Link [LNKS] (IRQs *9)
vgaarb: loaded
SCSI subsystem initialized
ACPI: bus type USB registered
usbcore: registered new interface driver usbfs
usbcore: registered new interface driver hub
usbcore: registered new device driver usb
mc: Linux media interface: v0.10
videodev: Linux video capture interface: v2.00
pps_core: LinuxPPS API ver. 1 registered
pps_core: Software ver. 5.3.6 - Copyright 2005-2007 Rodolfo Giometti
<giometti@linux.it>
PTP clock support registered
EDAC MC: Ver: 3.0.0
Advanced Linux Sound Architecture Driver Initialized.
PCI: Using ACPI for IRQ routing
Bluetooth: Core ver 2.22
NET: Registered protocol family 31
Bluetooth: HCI device and connection manager initialized
Bluetooth: HCI socket layer initialized
Bluetooth: L2CAP socket layer initialized
Bluetooth: SCO socket layer initialized
NET: Registered protocol family 8
NET: Registered protocol family 20
NetLabel: Initializing
NetLabel: domain hash size = 128
NetLabel: protocols = UNLABELED CIPSOv4 CALIPSO
NetLabel: unlabeled traffic allowed by default
nfc: nfc_init: NFC Core ver 0.1
NET: Registered protocol family 39
clocksource: Switched to clocksource kvm-clock
VFS: Disk quotas dquot_6.6.0
VFS: Dquot-cache hash table entries: 512 (order 0, 4096 bytes)
FS-Cache: Loaded
*** VALIDATE hugetlbfs ***
CacheFiles: Loaded
TOMOYO: 2.6.0
Mandatory Access Control activated.
AppArmor: AppArmor Filesystem Enabled
pnp: PnP ACPI init
pnp: PnP ACPI: found 7 devices
thermal_sys: Registered thermal governor 'step_wise'
thermal_sys: Registered thermal governor 'user_space'
clocksource: acpi_pm: mask: 0xffffff max_cycles: 0xffffff, max_idle_ns:
2085701024 ns
pci_bus 0000:00: resource 4 [io 0x0000-0x0cf7 window]
pci_bus 0000:00: resource 5 [io 0x0d00-0xffff window]
pci_bus 0000:00: resource 6 [mem 0x000a0000-0x000bffff window]
pci_bus 0000:00: resource 7 [mem 0xc0000000-0xfebfffff window]
NET: Registered protocol family 2
tcp_listen_portaddr_hash hash table entries: 4096 (order: 6, 294912 bytes,
vmalloc)
TCP established hash table entries: 65536 (order: 7, 524288 bytes, vmalloc)
TCP bind hash table entries: 65536 (order: 10, 4194304 bytes, vmalloc)
TCP: Hash tables configured (established 65536 bind 65536)
UDP hash table entries: 4096 (order: 7, 655360 bytes, vmalloc)
UDP-Lite hash table entries: 4096 (order: 7, 655360 bytes, vmalloc)
NET: Registered protocol family 1
RPC: Registered named UNIX socket transport module.
RPC: Registered udp transport module.
RPC: Registered tcp transport module.
RPC: Registered tcp NFSv4.1 backchannel transport module.
NET: Registered protocol family 44
pci 0000:00:00.0: Limiting direct PCI/PCI transfers
PCI: CLS 0 bytes, default 64
PCI-DMA: Using software bounce buffering for IO (SWIOTLB)
software IO TLB: mapped [mem 0xaa800000-0xae800000] (64MB)
RAPL PMU: API unit is 2^-32 Joules, 0 fixed counters, 10737418240 ms ovfl
timer
kvm: already loaded the other module
clocksource: tsc: mask: 0xffffffffffffffff max_cycles: 0x212735223b2,
max_idle_ns: 440795277976 ns
clocksource: Switched to clocksource tsc
mce: Machine check injector initialized
check: Scanning for low memory corruption every 60 seconds
Initialise system trusted keyrings
workingset: timestamp_bits=40 max_order=21 bucket_order=0
zbud: loaded
DLM installed
squashfs: version 4.0 (2009/01/31) Phillip Lougher
FS-Cache: Netfs 'nfs' registered for caching
NFS: Registering the id_resolver key type
Key type id_resolver registered
Key type id_legacy registered
nfs4filelayout_init: NFSv4 File Layout Driver Registering...
Installing knfsd (copyright (C) 1996 okir@monad.swb.de).
ntfs: driver 2.1.32 [Flags: R/W].
fuse: init (API version 7.31)
JFS: nTxBlock = 8192, nTxLock = 65536
SGI XFS with ACLs, security attributes, realtime, no debug enabled
9p: Installing v9fs 9p2000 file system support
FS-Cache: Netfs '9p' registered for caching
gfs2: GFS2 installed
FS-Cache: Netfs 'ceph' registered for caching
ceph: loaded (mds proto 32)
NET: Registered protocol family 38
async_tx: api initialized (async)
Key type asymmetric registered
Asymmetric key parser 'x509' registered
Asymmetric key parser 'pkcs8' registered
Key type pkcs7_test registered
Asymmetric key parser 'tpm_parser' registered
Block layer SCSI generic (bsg) driver version 0.4 loaded (major 246)
io scheduler mq-deadline registered
io scheduler kyber registered
io scheduler bfq registered
input: Power Button as /devices/LNXSYSTM:00/LNXPWRBN:00/input/input0
ACPI: Power Button [PWRF]
input: Sleep Button as /devices/LNXSYSTM:00/LNXSLPBN:00/input/input1
ACPI: Sleep Button [SLPF]
ioatdma: Intel(R) QuickData Technology Driver 5.00
PCI Interrupt Link [LNKC] enabled at IRQ 11
virtio-pci 0000:00:03.0: virtio_pci: leaving for legacy driver
PCI Interrupt Link [LNKD] enabled at IRQ 10
virtio-pci 0000:00:04.0: virtio_pci: leaving for legacy driver
HDLC line discipline maxframe=4096
N_HDLC line discipline registered.
Serial: 8250/16550 driver, 4 ports, IRQ sharing enabled
00:03: ttyS0 at I/O 0x3f8 (irq = 4, base_baud = 115200) is a 16550A
00:04: ttyS1 at I/O 0x2f8 (irq = 3, base_baud = 115200) is a 16550A
00:05: ttyS2 at I/O 0x3e8 (irq = 6, base_baud = 115200) is a 16550A
00:06: ttyS3 at I/O 0x2e8 (irq = 7, base_baud = 115200) is a 16550A
Non-volatile memory driver v1.3
Linux agpgart interface v0.103
[drm] Initialized vgem 1.0.0 20120112 for vgem on minor 0
[drm] Supports vblank timestamp caching Rev 2 (21.10.2013).
[drm] Driver supports precise vblank timestamp query.
[drm] Initialized vkms 1.0.0 20180514 for vkms on minor 1
usbcore: registered new interface driver udl
brd: module loaded
loop: module loaded
zram: Added device: zram0
null: module loaded
nfcsim 0.2 initialized
Loading iSCSI transport class v2.0-870.
scsi host0: Virtio SCSI HBA
st: Version 20160209, fixed bufsize 32768, s/g segs 256
kobject: 'sd' (00000000e065d5f3): kobject_uevent_env
kobject: 'sd' (00000000e065d5f3): fill_kobj_path: path
= '/bus/scsi/drivers/sd'
kobject: 'sr' (00000000bcad56ad): kobject_add_internal: parent: 'drivers',
set: 'drivers'
kobject: 'sr' (00000000bcad56ad): kobject_uevent_env
kobject: 'sr' (00000000bcad56ad): fill_kobj_path: path
= '/bus/scsi/drivers/sr'
kobject: 'scsi_generic' (0000000071c7cad3): kobject_add_internal:
parent: 'class', set: 'class'
kobject: 'scsi_generic' (0000000071c7cad3): kobject_uevent_env
kobject: 'scsi_generic' (0000000071c7cad3): fill_kobj_path: path
= '/class/scsi_generic'
kobject: 'nvme-wq' (000000003997c013): kobject_add_internal:
parent: 'workqueue', set: 'devices'
kobject: 'nvme-wq' (000000003997c013): kobject_uevent_env
kobject: 'nvme-wq' (000000003997c013): kobject_uevent_env: uevent_suppress
caused the event to drop!
kobject: 'nvme-wq' (000000003997c013): kobject_uevent_env
kobject: 'nvme-wq' (000000003997c013): fill_kobj_path: path
= '/devices/virtual/workqueue/nvme-wq'
kobject: 'nvme-reset-wq' (0000000085d6a1b9): kobject_add_internal:
parent: 'workqueue', set: 'devices'
kobject: 'nvme-reset-wq' (0000000085d6a1b9): kobject_uevent_env
kobject: 'nvme-reset-wq' (0000000085d6a1b9): kobject_uevent_env:
uevent_suppress caused the event to drop!
---
This bug is generated by a bot. It may contain errors.
See https://goo.gl/tpsmEJ for more information about syzbot.
syzbot engineers can be reached at syzkaller@googlegroups.com.
syzbot will keep track of this bug report. See:
https://goo.gl/tpsmEJ#status for how to communicate with syzbot.
^ permalink raw reply
* net-next boot error: WARNING: workqueue cpumask: online intersect > possible intersect (2)
From: syzbot @ 2019-07-23 6:38 UTC (permalink / raw)
To: linux-kernel, netdev, syzkaller-bugs
Hello,
syzbot found the following crash on:
HEAD commit: 7b5cf701 Merge branch 'sched-urgent-for-linus' of git://gi..
git tree: net-next
console output: https://syzkaller.appspot.com/x/log.txt?x=145c4d34600000
kernel config: https://syzkaller.appspot.com/x/.config?x=9aec8cb13b5f7389
dashboard link: https://syzkaller.appspot.com/bug?extid=3055cb4fd9eb553bd76c
compiler: gcc (GCC) 9.0.0 20181231 (experimental)
Unfortunately, I don't have any reproducer for this crash yet.
IMPORTANT: if you fix the bug, please add the following tag to the commit:
Reported-by: syzbot+3055cb4fd9eb553bd76c@syzkaller.appspotmail.com
smpboot: CPU0: Intel(R) Xeon(R) CPU @ 2.30GHz (family: 0x6, model: 0x3f,
stepping: 0x0)
Performance Events: unsupported p6 CPU model 63 no PMU driver, software
events only.
rcu: Hierarchical SRCU implementation.
NMI watchdog: Perf NMI watchdog permanently disabled
smp: Bringing up secondary CPUs ...
x86: Booting SMP configuration:
.... node #0, CPUs: #1
MDS CPU bug present and SMT on, data leak possible. See
https://www.kernel.org/doc/html/latest/admin-guide/hw-vuln/mds.html for
more details.
smp: Brought up 2 nodes, 2 CPUs
smpboot: Max logical packages: 1
smpboot: Total of 2 processors activated (9200.00 BogoMIPS)
devtmpfs: initialized
clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns:
19112604462750000 ns
futex hash table entries: 512 (order: 4, 65536 bytes, vmalloc)
xor: automatically using best checksumming function avx
PM: RTC time: 20:26:57, date: 2019-07-22
NET: Registered protocol family 16
audit: initializing netlink subsys (disabled)
cpuidle: using governor menu
ACPI: bus type PCI registered
dca service started, version 1.12.1
PCI: Using configuration type 1 for base access
WARNING: workqueue cpumask: online intersect > possible intersect
HugeTLB registered 1.00 GiB page size, pre-allocated 0 pages
HugeTLB registered 2.00 MiB page size, pre-allocated 0 pages
cryptd: max_cpu_qlen set to 1000
raid6: avx2x4 gen() 10942 MB/s
raid6: avx2x4 xor() 6383 MB/s
raid6: avx2x2 gen() 6482 MB/s
raid6: avx2x2 xor() 3541 MB/s
raid6: avx2x1 gen() 3326 MB/s
raid6: avx2x1 xor() 1978 MB/s
raid6: sse2x4 gen() 5350 MB/s
raid6: sse2x4 xor() 3129 MB/s
raid6: sse2x2 gen() 3754 MB/s
raid6: sse2x2 xor() 1760 MB/s
raid6: sse2x1 gen() 1702 MB/s
raid6: sse2x1 xor() 988 MB/s
raid6: using algorithm avx2x4 gen() 10942 MB/s
raid6: .... xor() 6383 MB/s, rmw enabled
raid6: using avx2x2 recovery algorithm
ACPI: Added _OSI(Module Device)
ACPI: Added _OSI(Processor Device)
ACPI: Added _OSI(3.0 _SCP Extensions)
ACPI: Added _OSI(Processor Aggregator Device)
ACPI: Added _OSI(Linux-Dell-Video)
ACPI: Added _OSI(Linux-Lenovo-NV-HDMI-Audio)
ACPI: Added _OSI(Linux-HPI-Hybrid-Graphics)
ACPI: 2 ACPI AML tables successfully acquired and loaded
ACPI: Interpreter enabled
ACPI: (supports S0 S3 S4 S5)
ACPI: Using IOAPIC for interrupt routing
PCI: Using host bridge windows from ACPI; if necessary, use "pci=nocrs" and
report a bug
ACPI: Enabled 16 GPEs in block 00 to 0F
ACPI: PCI Root Bridge [PCI0] (domain 0000 [bus 00-ff])
acpi PNP0A03:00: _OSC: OS supports [ASPM ClockPM Segments MSI HPX-Type3]
acpi PNP0A03:00: fail to add MMCONFIG information, can't access extended
PCI configuration space under this bridge.
PCI host bridge to bus 0000:00
pci_bus 0000:00: root bus resource [io 0x0000-0x0cf7 window]
pci_bus 0000:00: root bus resource [io 0x0d00-0xffff window]
pci_bus 0000:00: root bus resource [mem 0x000a0000-0x000bffff window]
pci_bus 0000:00: root bus resource [mem 0xc0000000-0xfebfffff window]
pci_bus 0000:00: root bus resource [bus 00-ff]
pci 0000:00:00.0: [8086:1237] type 00 class 0x060000
pci 0000:00:01.0: [8086:7110] type 00 class 0x060100
pci 0000:00:01.3: [8086:7113] type 00 class 0x068000
pci 0000:00:01.3: quirk: [io 0xb000-0xb03f] claimed by PIIX4 ACPI
pci 0000:00:03.0: [1af4:1004] type 00 class 0x000000
pci 0000:00:03.0: reg 0x10: [io 0xc000-0xc03f]
pci 0000:00:03.0: reg 0x14: [mem 0xfebfe000-0xfebfe07f]
pci 0000:00:04.0: [1af4:1000] type 00 class 0x020000
pci 0000:00:04.0: reg 0x10: [io 0xc040-0xc07f]
pci 0000:00:04.0: reg 0x14: [mem 0xfebff000-0xfebff07f]
ACPI: PCI Interrupt Link [LNKA] (IRQs 5 *10 11)
ACPI: PCI Interrupt Link [LNKB] (IRQs 5 *10 11)
ACPI: PCI Interrupt Link [LNKC] (IRQs 5 10 *11)
ACPI: PCI Interrupt Link [LNKD] (IRQs 5 10 *11)
ACPI: PCI Interrupt Link [LNKS] (IRQs *9)
vgaarb: loaded
SCSI subsystem initialized
ACPI: bus type USB registered
usbcore: registered new interface driver usbfs
usbcore: registered new interface driver hub
usbcore: registered new device driver usb
mc: Linux media interface: v0.10
videodev: Linux video capture interface: v2.00
pps_core: LinuxPPS API ver. 1 registered
pps_core: Software ver. 5.3.6 - Copyright 2005-2007 Rodolfo Giometti
<giometti@linux.it>
PTP clock support registered
EDAC MC: Ver: 3.0.0
Advanced Linux Sound Architecture Driver Initialized.
PCI: Using ACPI for IRQ routing
Bluetooth: Core ver 2.22
NET: Registered protocol family 31
Bluetooth: HCI device and connection manager initialized
Bluetooth: HCI socket layer initialized
Bluetooth: L2CAP socket layer initialized
Bluetooth: SCO socket layer initialized
NET: Registered protocol family 8
NET: Registered protocol family 20
NetLabel: Initializing
NetLabel: domain hash size = 128
NetLabel: protocols = UNLABELED CIPSOv4 CALIPSO
NetLabel: unlabeled traffic allowed by default
nfc: nfc_init: NFC Core ver 0.1
NET: Registered protocol family 39
clocksource: Switched to clocksource kvm-clock
VFS: Disk quotas dquot_6.6.0
VFS: Dquot-cache hash table entries: 512 (order 0, 4096 bytes)
FS-Cache: Loaded
*** VALIDATE hugetlbfs ***
CacheFiles: Loaded
TOMOYO: 2.6.0
Mandatory Access Control activated.
AppArmor: AppArmor Filesystem Enabled
pnp: PnP ACPI init
pnp: PnP ACPI: found 7 devices
thermal_sys: Registered thermal governor 'step_wise'
thermal_sys: Registered thermal governor 'user_space'
clocksource: acpi_pm: mask: 0xffffff max_cycles: 0xffffff, max_idle_ns:
2085701024 ns
pci_bus 0000:00: resource 4 [io 0x0000-0x0cf7 window]
pci_bus 0000:00: resource 5 [io 0x0d00-0xffff window]
pci_bus 0000:00: resource 6 [mem 0x000a0000-0x000bffff window]
pci_bus 0000:00: resource 7 [mem 0xc0000000-0xfebfffff window]
NET: Registered protocol family 2
tcp_listen_portaddr_hash hash table entries: 4096 (order: 6, 294912 bytes,
vmalloc)
TCP established hash table entries: 65536 (order: 7, 524288 bytes, vmalloc)
TCP bind hash table entries: 65536 (order: 10, 4194304 bytes, vmalloc)
TCP: Hash tables configured (established 65536 bind 65536)
UDP hash table entries: 4096 (order: 7, 655360 bytes, vmalloc)
UDP-Lite hash table entries: 4096 (order: 7, 655360 bytes, vmalloc)
NET: Registered protocol family 1
RPC: Registered named UNIX socket transport module.
RPC: Registered udp transport module.
RPC: Registered tcp transport module.
RPC: Registered tcp NFSv4.1 backchannel transport module.
NET: Registered protocol family 44
pci 0000:00:00.0: Limiting direct PCI/PCI transfers
PCI: CLS 0 bytes, default 64
PCI-DMA: Using software bounce buffering for IO (SWIOTLB)
software IO TLB: mapped [mem 0xaa800000-0xae800000] (64MB)
RAPL PMU: API unit is 2^-32 Joules, 0 fixed counters, 10737418240 ms ovfl
timer
kvm: already loaded the other module
clocksource: tsc: mask: 0xffffffffffffffff max_cycles: 0x212735223b2,
max_idle_ns: 440795277976 ns
clocksource: Switched to clocksource tsc
mce: Machine check injector initialized
check: Scanning for low memory corruption every 60 seconds
Initialise system trusted keyrings
workingset: timestamp_bits=40 max_order=21 bucket_order=0
zbud: loaded
DLM installed
squashfs: version 4.0 (2009/01/31) Phillip Lougher
FS-Cache: Netfs 'nfs' registered for caching
NFS: Registering the id_resolver key type
Key type id_resolver registered
Key type id_legacy registered
nfs4filelayout_init: NFSv4 File Layout Driver Registering...
Installing knfsd (copyright (C) 1996 okir@monad.swb.de).
ntfs: driver 2.1.32 [Flags: R/W].
fuse: init (API version 7.31)
JFS: nTxBlock = 8192, nTxLock = 65536
SGI XFS with ACLs, security attributes, realtime, no debug enabled
9p: Installing v9fs 9p2000 file system support
FS-Cache: Netfs '9p' registered for caching
gfs2: GFS2 installed
FS-Cache: Netfs 'ceph' registered for caching
ceph: loaded (mds proto 32)
NET: Registered protocol family 38
async_tx: api initialized (async)
Key type asymmetric registered
Asymmetric key parser 'x509' registered
Asymmetric key parser 'pkcs8' registered
Key type pkcs7_test registered
Asymmetric key parser 'tpm_parser' registered
Block layer SCSI generic (bsg) driver version 0.4 loaded (major 246)
io scheduler mq-deadline registered
io scheduler kyber registered
io scheduler bfq registered
input: Power Button as /devices/LNXSYSTM:00/LNXPWRBN:00/input/input0
ACPI: Power Button [PWRF]
input: Sleep Button as /devices/LNXSYSTM:00/LNXSLPBN:00/input/input1
ACPI: Sleep Button [SLPF]
ioatdma: Intel(R) QuickData Technology Driver 5.00
PCI Interrupt Link [LNKC] enabled at IRQ 11
virtio-pci 0000:00:03.0: virtio_pci: leaving for legacy driver
PCI Interrupt Link [LNKD] enabled at IRQ 10
virtio-pci 0000:00:04.0: virtio_pci: leaving for legacy driver
HDLC line discipline maxframe=4096
N_HDLC line discipline registered.
Serial: 8250/16550 driver, 4 ports, IRQ sharing enabled
00:03: ttyS0 at I/O 0x3f8 (irq = 4, base_baud = 115200) is a 16550A
00:04: ttyS1 at I/O 0x2f8 (irq = 3, base_baud = 115200) is a 16550A
00:05: ttyS2 at I/O 0x3e8 (irq = 6, base_baud = 115200) is a 16550A
00:06: ttyS3 at I/O 0x2e8 (irq = 7, base_baud = 115200) is a 16550A
Non-volatile memory driver v1.3
Linux agpgart interface v0.103
[drm] Initialized vgem 1.0.0 20120112 for vgem on minor 0
[drm] Supports vblank timestamp caching Rev 2 (21.10.2013).
[drm] Driver supports precise vblank timestamp query.
[drm] Initialized vkms 1.0.0 20180514 for vkms on minor 1
usbcore: registered new interface driver udl
brd: module loaded
loop: module loaded
zram: Added device: zram0
null: module loaded
nfcsim 0.2 initialized
Loading iSCSI transport class v2.0-870.
scsi host0: Virtio SCSI HBA
st: Version 20160209, fixed bufsize 32768, s/g segs 256
kobject: 'st' (000000004c8d7e58): fill_kobj_path: path
= '/bus/scsi/drivers/st'
kobject: 'scsi_disk' (00000000bdfbce9c): kobject_add_internal:
parent: 'class', set: 'class'
kobject: 'scsi_disk' (00000000bdfbce9c): kobject_uevent_env
kobject: 'scsi_disk' (00000000bdfbce9c): fill_kobj_path: path
= '/class/scsi_disk'
kobject: 'sd' (0000000055985a2d): kobject_add_internal: parent: 'drivers',
set: 'drivers'
kobject: 'sd' (0000000055985a2d): kobject_uevent_env
kobject: 'sd' (0000000055985a2d): fill_kobj_path: path
= '/bus/scsi/drivers/sd'
kobject: 'sr' (000000004054170b): kobject_add_internal: parent: 'drivers',
set: 'drivers'
kobject: 'sr' (000000004054170b): kobject_uevent_env
kobject: 'sr' (000000004054170b): fill_kobj_path: path
= '/bus/scsi/drivers/sr'
kobject: 'scsi_generic' (0000000098f3b229): kobject_add_internal:
parent: 'class', set: 'class'
kobject: 'scsi_generic' (0000000098f3b229): kobject_uevent_env
kobject: 'scsi_generic' (0000000098f3b229): fill_kobj_path: path
= '/class/scsi_generic'
kobject: 'nvme-wq' (00000000270c2331): kobject_add_internal:
parent: 'workqueue', set: 'devices'
kobject: 'nvme-wq' (00000000270c2331): kobject_uevent_env
kobject: 'nvme-wq' (00000000270c2331): kobject_uevent_env: uevent_suppress
caused the event to drop!
kobject: 'nvme-wq' (00000000270c2331): kobject_uevent_env
kobject: 'nvme-wq' (00000000270c2331): fill_kobj_path: path
= '/devices/virtual/workqueue/nvme-wq'
kobject: 'nvme-reset-wq' (000000003e1ba3d5): kobject_add_internal:
parent: 'workqueue', set: 'devices'
kobject: 'nvme-reset-wq' (000000003e1ba3d5): kobject_uevent_env
kobject: 'nvme-reset-wq' (000000003e1ba3d5): kobject_uevent_env:
uevent_suppress caused the event to drop!
kobject: 'nvme-reset-wq' (000000003e1ba3d5): kobject_uevent_env
kobject: 'nvme-reset-wq' (000000003e1ba3d5): fill_kobj_path: path
= '/devices/virtual/workqueue/nvme-reset-wq'
kobject: 'nvme-delete-wq' (000000005497d244): kobject_add_internal:
parent: 'workqueue', set: 'devices'
kobject: 'nvme-delete-wq' (000000005497d244): kobject_uevent_env
kobject: 'nvme-delete-wq' (000000005497d244): kobject_uevent_env:
uevent_suppress caused the event to drop!
kobject: 'nvme-delete-wq' (000000005497d244): kobject_uevent_env
kobject: 'nvme-delete-wq' (000000005497d244): fill_kobj_path: path
= '/devices/virtual/workqueue/nvme-delete-wq'
kobject: 'nvme' (000000008e6a29d7): kobject_add_internal: parent: 'class',
set: 'class'
kobject: 'nvme' (000000008e6a29d7): kobject_uevent_env
kobject: 'nvme' (000000008e6a29d7): fill_kobj_path: path = '/class/nvme'
kobject: 'nvme-subsystem' (000000001563dbee): kobject_add_internal:
parent: 'class', set: 'class'
kobject: 'nvme-subsystem' (000000001563dbee): kobject_uevent_env
kobject: 'nvme-subsystem' (000000001563dbee): fill_kobj_path: path
= '/class/nvme-subsystem'
kobject: 'nvme' (00000000c52b7e0e): kobject_add_internal:
parent: 'drivers', set: 'drivers'
kobject: 'drivers' (00000000f6d3710d): kobject_add_internal:
parent: 'nvme', set: '<NULL>'
kobject: 'nvme' (00000000c52b7e0e): kobject_uevent_env
kobject: 'nvme' (00000000c52b7e0e): fill_kobj_path: path
= '/bus/pci/drivers/nvme'
kobject: 'ahci' (00000000a29e777d): kobject_add_internal:
parent: 'drivers', set: 'drivers'
kobject: 'drivers' (000000003ed63ce6): kobject_add_internal:
parent: 'ahci', set: '<NULL>'
kobject: 'ahci' (00000000a29e777d): kobject_uevent_env
kobject: 'ahci' (00000000a29e777d): fill_kobj_path: path
= '/bus/pci/drivers/ahci'
kobject: 'ata_piix' (0000000087185d26): kobject_add_internal:
parent: 'drivers', set: 'drivers'
kobject: 'drivers' (000000004a065e79): kobject_add_internal:
parent: 'ata_piix', set: '<NULL>'
kobject: 'ata_piix' (0000000087185d26): kobject_uevent_env
kobject: 'ata_piix' (0000000087185d26): fill_kobj_path: path
= '/bus/pci/drivers/ata_piix'
kobject: 'pata_amd' (00000000519c7b49): kobject_add_internal:
parent: 'drivers', set: 'drivers'
kobject: 'drivers' (00000000cb24f8fd): kobject_add_internal:
parent: 'pata_amd', set: '<NULL>'
kobject: 'pata_amd' (00000000519c7b49): kobject_uevent_env
---
This bug is generated by a bot. It may contain errors.
See https://goo.gl/tpsmEJ for more information about syzbot.
syzbot engineers can be reached at syzkaller@googlegroups.com.
syzbot will keep track of this bug report. See:
https://goo.gl/tpsmEJ#status for how to communicate with syzbot.
^ permalink raw reply
* Re: [RFC PATCH net-next 00/12] drop_monitor: Capture dropped packets and metadata
From: Ido Schimmel @ 2019-07-23 6:46 UTC (permalink / raw)
To: Toke Høiland-Jørgensen
Cc: netdev, davem, nhorman, dsahern, roopa, nikolay, jakub.kicinski,
andy, f.fainelli, andrew, vivien.didelot, mlxsw, Ido Schimmel
In-Reply-To: <87imrt4zzg.fsf@toke.dk>
On Mon, Jul 22, 2019 at 09:43:15PM +0200, Toke Høiland-Jørgensen wrote:
> Is there a mechanism for the user to filter the packets before they are
> sent to userspace? A bpf filter would be the obvious choice I guess...
Hi Toke,
Yes, it's on my TODO list to write an eBPF program that only lets
"unique" packets to be enqueued on the netlink socket. Where "unique" is
defined as {5-tuple, PC}. The rest of the copies will be counted in an
eBPF map, which is just a hash table keyed by {5-tuple, PC}.
I think it would be good to have the program as part of the bcc
repository [1]. What do you think?
> For integrating with XDP the trick would be to find a way to do it that
> doesn't incur any overhead when it's not enabled. Are you envisioning
> that this would be enabled separately for the different "modes" (kernel,
> hardware, XDP, etc)?
Yes. Drop monitor have commands to enable and disable tracing, but they
don't carry any attributes at the moment. My plan is to add an attribute
(e.g., 'NET_DM_ATTR_DROP_TYPE') that will specify the type of drops
you're interested in - SW/HW/XDP. If the attribute is not specified,
then current behavior is maintained and all the drop types are traced.
But if you're only interested in SW drops, then overhead for the rest
should be zero.
For HW drops I'm going to have devlink call into drop monitor. The
function call will just be a NOP in case user is not interested in HW
drops. I'm not sure if for XDP you want to register a probe on a
tracepoint or call into drop monitor. If you want to use the former,
then you can just have drop monitor unregister its probe from the
tracepoint, which is what drop monitor is currently doing with the
kfree_skb() tracepoint.
Thanks!
[1] https://github.com/iovisor/bcc/tree/master/examples/networking
^ permalink raw reply
* [PATCH mlx5-next] net/mlx5: Fix modify_cq_in alignment
From: Leon Romanovsky @ 2019-07-23 7:12 UTC (permalink / raw)
To: Doug Ledford, Jason Gunthorpe
Cc: Edward Srouji, RDMA mailing list, Yishai Hadas, Saeed Mahameed,
linux-netdev, Leon Romanovsky
From: Edward Srouji <edwards@mellanox.com>
Fix modify_cq_in alignment to match the device specification.
After this fix the 'cq_umem_valid' field will be in the right offset.
Cc: <stable@vger.kernel.org> # 4.19
Fixes: bd37197554eb ("net/mlx5: Update mlx5_ifc with DEVX UID bits")
Signed-off-by: Edward Srouji <edwards@mellanox.com>
Reviewed-by: Yishai Hadas <yishaih@mellanox.com>
Signed-off-by: Leon Romanovsky <leonro@mellanox.com>
---
include/linux/mlx5/mlx5_ifc.h | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/include/linux/mlx5/mlx5_ifc.h b/include/linux/mlx5/mlx5_ifc.h
index b3d5752657d9..ec571fd7fcf8 100644
--- a/include/linux/mlx5/mlx5_ifc.h
+++ b/include/linux/mlx5/mlx5_ifc.h
@@ -5975,10 +5975,12 @@ struct mlx5_ifc_modify_cq_in_bits {
struct mlx5_ifc_cqc_bits cq_context;
- u8 reserved_at_280[0x40];
+ u8 reserved_at_280[0x60];
u8 cq_umem_valid[0x1];
- u8 reserved_at_2c1[0x5bf];
+ u8 reserved_at_2e1[0x1f];
+
+ u8 reserved_at_300[0x580];
u8 pas[0][0x40];
};
--
2.20.1
^ permalink raw reply related
* [PATCH net 0/2] DIM fixes for 5.3
From: Leon Romanovsky @ 2019-07-23 7:22 UTC (permalink / raw)
To: David S . Miller
Cc: Leon Romanovsky, Doug Ledford, Jason Gunthorpe, RDMA mailing list,
Tal Gilboa, Yamin Friedman, Saeed Mahameed, linux-netdev
From: Leon Romanovsky <leonro@mellanox.com>
Hi,
Those two fixes for recently merged DIM patches, both exposed through
RDMa DIM usage.
Thanks
Leon Romanovsky (1):
lib/dim: Fix -Wunused-const-variable warnings
Yamin Friedman (1):
linux/dim: Fix overflow in dim calculation
drivers/net/ethernet/broadcom/bcmsysport.c | 2 +-
drivers/net/ethernet/broadcom/bnxt/bnxt.c | 2 +-
.../net/ethernet/broadcom/genet/bcmgenet.c | 2 +-
.../net/ethernet/mellanox/mlx5/core/en_txrx.c | 4 +-
include/linux/dim.h | 56 -------------------
lib/dim/dim.c | 4 +-
lib/dim/net_dim.c | 56 +++++++++++++++++++
7 files changed, 63 insertions(+), 63 deletions(-)
--
2.20.1
^ permalink raw reply
* [PATCH net 1/2] linux/dim: Fix overflow in dim calculation
From: Leon Romanovsky @ 2019-07-23 7:22 UTC (permalink / raw)
To: David S . Miller
Cc: Leon Romanovsky, Doug Ledford, Jason Gunthorpe, RDMA mailing list,
Tal Gilboa, Yamin Friedman, Saeed Mahameed, linux-netdev
In-Reply-To: <20190723072248.6844-1-leon@kernel.org>
From: Yamin Friedman <yaminf@mellanox.com>
While using net_dim, a dim_sample was used without ever initializing the
comps value. Added use of DIV_ROUND_DOWN_ULL() to prevent potential
overflow, it should not be a problem to save the final result in an int
because after the division by epms the value should not be larger than a
few thousand.
[ 1040.127124] UBSAN: Undefined behaviour in lib/dim/dim.c:78:23
[ 1040.130118] signed integer overflow:
[ 1040.131643] 134718714 * 100 cannot be represented in type 'int'
Fixes: 398c2b05bbee ("linux/dim: Add completions count to dim_sample")
Signed-off-by: Yamin Friedman <yaminf@mellanox.com>
Signed-off-by: Leon Romanovsky <leonro@mellanox.com>
---
drivers/net/ethernet/broadcom/bcmsysport.c | 2 +-
drivers/net/ethernet/broadcom/bnxt/bnxt.c | 2 +-
drivers/net/ethernet/broadcom/genet/bcmgenet.c | 2 +-
drivers/net/ethernet/mellanox/mlx5/core/en_txrx.c | 4 ++--
lib/dim/dim.c | 4 ++--
5 files changed, 7 insertions(+), 7 deletions(-)
diff --git a/drivers/net/ethernet/broadcom/bcmsysport.c b/drivers/net/ethernet/broadcom/bcmsysport.c
index b9c5cea8db16..9483553ce444 100644
--- a/drivers/net/ethernet/broadcom/bcmsysport.c
+++ b/drivers/net/ethernet/broadcom/bcmsysport.c
@@ -992,7 +992,7 @@ static int bcm_sysport_poll(struct napi_struct *napi, int budget)
{
struct bcm_sysport_priv *priv =
container_of(napi, struct bcm_sysport_priv, napi);
- struct dim_sample dim_sample;
+ struct dim_sample dim_sample = {};
unsigned int work_done = 0;
work_done = bcm_sysport_desc_rx(priv, budget);
diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
index 7134d2c3eb1c..7070349915bc 100644
--- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c
+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
@@ -2136,7 +2136,7 @@ static int bnxt_poll(struct napi_struct *napi, int budget)
}
}
if (bp->flags & BNXT_FLAG_DIM) {
- struct dim_sample dim_sample;
+ struct dim_sample dim_sample = {};
dim_update_sample(cpr->event_ctr,
cpr->rx_packets,
diff --git a/drivers/net/ethernet/broadcom/genet/bcmgenet.c b/drivers/net/ethernet/broadcom/genet/bcmgenet.c
index a2b57807453b..d3a0b614dbfa 100644
--- a/drivers/net/ethernet/broadcom/genet/bcmgenet.c
+++ b/drivers/net/ethernet/broadcom/genet/bcmgenet.c
@@ -1895,7 +1895,7 @@ static int bcmgenet_rx_poll(struct napi_struct *napi, int budget)
{
struct bcmgenet_rx_ring *ring = container_of(napi,
struct bcmgenet_rx_ring, napi);
- struct dim_sample dim_sample;
+ struct dim_sample dim_sample = {};
unsigned int work_done;
work_done = bcmgenet_desc_rx(ring, budget);
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_txrx.c b/drivers/net/ethernet/mellanox/mlx5/core/en_txrx.c
index c50b6f0769c8..49b06b256c92 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en_txrx.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en_txrx.c
@@ -49,7 +49,7 @@ static inline bool mlx5e_channel_no_affinity_change(struct mlx5e_channel *c)
static void mlx5e_handle_tx_dim(struct mlx5e_txqsq *sq)
{
struct mlx5e_sq_stats *stats = sq->stats;
- struct dim_sample dim_sample;
+ struct dim_sample dim_sample = {};
if (unlikely(!test_bit(MLX5E_SQ_STATE_AM, &sq->state)))
return;
@@ -61,7 +61,7 @@ static void mlx5e_handle_tx_dim(struct mlx5e_txqsq *sq)
static void mlx5e_handle_rx_dim(struct mlx5e_rq *rq)
{
struct mlx5e_rq_stats *stats = rq->stats;
- struct dim_sample dim_sample;
+ struct dim_sample dim_sample = {};
if (unlikely(!test_bit(MLX5E_RQ_STATE_AM, &rq->state)))
return;
diff --git a/lib/dim/dim.c b/lib/dim/dim.c
index 439d641ec796..38045d6d0538 100644
--- a/lib/dim/dim.c
+++ b/lib/dim/dim.c
@@ -74,8 +74,8 @@ void dim_calc_stats(struct dim_sample *start, struct dim_sample *end,
delta_us);
curr_stats->cpms = DIV_ROUND_UP(ncomps * USEC_PER_MSEC, delta_us);
if (curr_stats->epms != 0)
- curr_stats->cpe_ratio =
- (curr_stats->cpms * 100) / curr_stats->epms;
+ curr_stats->cpe_ratio = DIV_ROUND_DOWN_ULL(
+ curr_stats->cpms * 100, curr_stats->epms);
else
curr_stats->cpe_ratio = 0;
--
2.20.1
^ permalink raw reply related
* [PATCH net 2/2] lib/dim: Fix -Wunused-const-variable warnings
From: Leon Romanovsky @ 2019-07-23 7:22 UTC (permalink / raw)
To: David S . Miller
Cc: Leon Romanovsky, Doug Ledford, Jason Gunthorpe, RDMA mailing list,
Tal Gilboa, Yamin Friedman, Saeed Mahameed, linux-netdev
In-Reply-To: <20190723072248.6844-1-leon@kernel.org>
From: Leon Romanovsky <leonro@mellanox.com>
DIM causes to the following warnings during kernel compilation
which indicates that tx_profile and rx_profile are supposed to
be declared in *.c and not in *.h files.
In file included from ./include/rdma/ib_verbs.h:64,
from ./include/linux/mlx5/device.h:37,
from ./include/linux/mlx5/driver.h:51,
from ./include/linux/mlx5/vport.h:36,
from drivers/infiniband/hw/mlx5/ib_virt.c:34:
./include/linux/dim.h:326:1: warning: _tx_profile_ defined but not used [-Wunused-const-variable=]
326 | tx_profile[DIM_CQ_PERIOD_NUM_MODES][NET_DIM_PARAMS_NUM_PROFILES] = {
| ^~~~~~~~~~
./include/linux/dim.h:320:1: warning: _rx_profile_ defined but not used [-Wunused-const-variable=]
320 | rx_profile[DIM_CQ_PERIOD_NUM_MODES][NET_DIM_PARAMS_NUM_PROFILES] = {
| ^~~~~~~~~~
Fixes: 4f75da3666c0 ("linux/dim: Move implementation to .c files")
Signed-off-by: Leon Romanovsky <leonro@mellanox.com>
---
include/linux/dim.h | 56 ---------------------------------------------
lib/dim/net_dim.c | 56 +++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 56 insertions(+), 56 deletions(-)
diff --git a/include/linux/dim.h b/include/linux/dim.h
index d3a0fbfff2bb..9fa4b3f88c39 100644
--- a/include/linux/dim.h
+++ b/include/linux/dim.h
@@ -272,62 +272,6 @@ dim_update_sample_with_comps(u16 event_ctr, u64 packets, u64 bytes, u64 comps,
/* Net DIM */
-/*
- * Net DIM profiles:
- * There are different set of profiles for each CQ period mode.
- * There are different set of profiles for RX/TX CQs.
- * Each profile size must be of NET_DIM_PARAMS_NUM_PROFILES
- */
-#define NET_DIM_PARAMS_NUM_PROFILES 5
-#define NET_DIM_DEFAULT_RX_CQ_MODERATION_PKTS_FROM_EQE 256
-#define NET_DIM_DEFAULT_TX_CQ_MODERATION_PKTS_FROM_EQE 128
-#define NET_DIM_DEF_PROFILE_CQE 1
-#define NET_DIM_DEF_PROFILE_EQE 1
-
-#define NET_DIM_RX_EQE_PROFILES { \
- {1, NET_DIM_DEFAULT_RX_CQ_MODERATION_PKTS_FROM_EQE}, \
- {8, NET_DIM_DEFAULT_RX_CQ_MODERATION_PKTS_FROM_EQE}, \
- {64, NET_DIM_DEFAULT_RX_CQ_MODERATION_PKTS_FROM_EQE}, \
- {128, NET_DIM_DEFAULT_RX_CQ_MODERATION_PKTS_FROM_EQE}, \
- {256, NET_DIM_DEFAULT_RX_CQ_MODERATION_PKTS_FROM_EQE}, \
-}
-
-#define NET_DIM_RX_CQE_PROFILES { \
- {2, 256}, \
- {8, 128}, \
- {16, 64}, \
- {32, 64}, \
- {64, 64} \
-}
-
-#define NET_DIM_TX_EQE_PROFILES { \
- {1, NET_DIM_DEFAULT_TX_CQ_MODERATION_PKTS_FROM_EQE}, \
- {8, NET_DIM_DEFAULT_TX_CQ_MODERATION_PKTS_FROM_EQE}, \
- {32, NET_DIM_DEFAULT_TX_CQ_MODERATION_PKTS_FROM_EQE}, \
- {64, NET_DIM_DEFAULT_TX_CQ_MODERATION_PKTS_FROM_EQE}, \
- {128, NET_DIM_DEFAULT_TX_CQ_MODERATION_PKTS_FROM_EQE} \
-}
-
-#define NET_DIM_TX_CQE_PROFILES { \
- {5, 128}, \
- {8, 64}, \
- {16, 32}, \
- {32, 32}, \
- {64, 32} \
-}
-
-static const struct dim_cq_moder
-rx_profile[DIM_CQ_PERIOD_NUM_MODES][NET_DIM_PARAMS_NUM_PROFILES] = {
- NET_DIM_RX_EQE_PROFILES,
- NET_DIM_RX_CQE_PROFILES,
-};
-
-static const struct dim_cq_moder
-tx_profile[DIM_CQ_PERIOD_NUM_MODES][NET_DIM_PARAMS_NUM_PROFILES] = {
- NET_DIM_TX_EQE_PROFILES,
- NET_DIM_TX_CQE_PROFILES,
-};
-
/**
* net_dim_get_rx_moderation - provide a CQ moderation object for the given RX profile
* @cq_period_mode: CQ period mode
diff --git a/lib/dim/net_dim.c b/lib/dim/net_dim.c
index 5bcc902c5388..a4db51c21266 100644
--- a/lib/dim/net_dim.c
+++ b/lib/dim/net_dim.c
@@ -5,6 +5,62 @@
#include <linux/dim.h>
+/*
+ * Net DIM profiles:
+ * There are different set of profiles for each CQ period mode.
+ * There are different set of profiles for RX/TX CQs.
+ * Each profile size must be of NET_DIM_PARAMS_NUM_PROFILES
+ */
+#define NET_DIM_PARAMS_NUM_PROFILES 5
+#define NET_DIM_DEFAULT_RX_CQ_MODERATION_PKTS_FROM_EQE 256
+#define NET_DIM_DEFAULT_TX_CQ_MODERATION_PKTS_FROM_EQE 128
+#define NET_DIM_DEF_PROFILE_CQE 1
+#define NET_DIM_DEF_PROFILE_EQE 1
+
+#define NET_DIM_RX_EQE_PROFILES { \
+ {1, NET_DIM_DEFAULT_RX_CQ_MODERATION_PKTS_FROM_EQE}, \
+ {8, NET_DIM_DEFAULT_RX_CQ_MODERATION_PKTS_FROM_EQE}, \
+ {64, NET_DIM_DEFAULT_RX_CQ_MODERATION_PKTS_FROM_EQE}, \
+ {128, NET_DIM_DEFAULT_RX_CQ_MODERATION_PKTS_FROM_EQE}, \
+ {256, NET_DIM_DEFAULT_RX_CQ_MODERATION_PKTS_FROM_EQE}, \
+}
+
+#define NET_DIM_RX_CQE_PROFILES { \
+ {2, 256}, \
+ {8, 128}, \
+ {16, 64}, \
+ {32, 64}, \
+ {64, 64} \
+}
+
+#define NET_DIM_TX_EQE_PROFILES { \
+ {1, NET_DIM_DEFAULT_TX_CQ_MODERATION_PKTS_FROM_EQE}, \
+ {8, NET_DIM_DEFAULT_TX_CQ_MODERATION_PKTS_FROM_EQE}, \
+ {32, NET_DIM_DEFAULT_TX_CQ_MODERATION_PKTS_FROM_EQE}, \
+ {64, NET_DIM_DEFAULT_TX_CQ_MODERATION_PKTS_FROM_EQE}, \
+ {128, NET_DIM_DEFAULT_TX_CQ_MODERATION_PKTS_FROM_EQE} \
+}
+
+#define NET_DIM_TX_CQE_PROFILES { \
+ {5, 128}, \
+ {8, 64}, \
+ {16, 32}, \
+ {32, 32}, \
+ {64, 32} \
+}
+
+static const struct dim_cq_moder
+rx_profile[DIM_CQ_PERIOD_NUM_MODES][NET_DIM_PARAMS_NUM_PROFILES] = {
+ NET_DIM_RX_EQE_PROFILES,
+ NET_DIM_RX_CQE_PROFILES,
+};
+
+static const struct dim_cq_moder
+tx_profile[DIM_CQ_PERIOD_NUM_MODES][NET_DIM_PARAMS_NUM_PROFILES] = {
+ NET_DIM_TX_EQE_PROFILES,
+ NET_DIM_TX_CQE_PROFILES,
+};
+
struct dim_cq_moder
net_dim_get_rx_moderation(u8 cq_period_mode, int ix)
{
--
2.20.1
^ permalink raw reply related
* Re: BUG: unable to handle kernel paging request in corrupted (2)
From: Dmitry Vyukov @ 2019-07-23 7:35 UTC (permalink / raw)
To: syzbot
Cc: dave.stevenson, David Miller, LKML, USB list, netdev,
syzkaller-bugs, unglinuxdriver, woojung.huh, John Fastabend
In-Reply-To: <000000000000fcdf6c058e076819@google.com>
On Fri, Jul 19, 2019 at 1:56 PM syzbot
<syzbot+08b7a2c58acdfa12c82d@syzkaller.appspotmail.com> wrote:
>
> syzbot has bisected this bug to:
>
> commit 9343ac87f2a4e09bf6e27b5f31e72e9e3a82abff
> Author: Dave Stevenson <dave.stevenson@raspberrypi.org>
> Date: Mon Jun 25 14:07:15 2018 +0000
>
> net: lan78xx: Use s/w csum check on VLANs without tag stripping
>
> bisection log: https://syzkaller.appspot.com/x/bisect.txt?x=102feb84600000
> start commit: 49d05fe2 ipv6: rt6_check should return NULL if 'from' is N..
> git tree: net
> final crash: https://syzkaller.appspot.com/x/report.txt?x=122feb84600000
> console output: https://syzkaller.appspot.com/x/log.txt?x=142feb84600000
> kernel config: https://syzkaller.appspot.com/x/.config?x=87305c3ca9c25c70
> dashboard link: https://syzkaller.appspot.com/bug?extid=08b7a2c58acdfa12c82d
> syz repro: https://syzkaller.appspot.com/x/repro.syz?x=143a78f4600000
>
> Reported-by: syzbot+08b7a2c58acdfa12c82d@syzkaller.appspotmail.com
> Fixes: 9343ac87f2a4 ("net: lan78xx: Use s/w csum check on VLANs without tag
> stripping")
>
> For information about bisection process see: https://goo.gl/tpsmEJ#bisection
From the repro it looks like the same bpf stack overflow bug. +John
We need to dup them onto some canonical report for this bug, or this
becomes unmanageable.
#syz dup: kernel panic: corrupted stack end in dput
^ permalink raw reply
* Re: kernel panic: stack is corrupted in pointer
From: Dmitry Vyukov @ 2019-07-23 7:38 UTC (permalink / raw)
To: syzbot, John Fastabend, bpf
Cc: David Airlie, alexander.deucher, amd-gfx, Alexei Starovoitov,
christian.koenig, Daniel Borkmann, david1.zhou, DRI, leo.liu,
LKML, netdev, syzkaller-bugs
In-Reply-To: <0000000000001a51c4058ddcb1b6@google.com>
On Wed, Jul 17, 2019 at 10:58 AM syzbot
<syzbot+79f5f028005a77ecb6bb@syzkaller.appspotmail.com> wrote:
>
> Hello,
>
> syzbot found the following crash on:
>
> HEAD commit: 1438cde7 Add linux-next specific files for 20190716
> git tree: linux-next
> console output: https://syzkaller.appspot.com/x/log.txt?x=13988058600000
> kernel config: https://syzkaller.appspot.com/x/.config?x=3430a151e1452331
> dashboard link: https://syzkaller.appspot.com/bug?extid=79f5f028005a77ecb6bb
> compiler: gcc (GCC) 9.0.0 20181231 (experimental)
> syz repro: https://syzkaller.appspot.com/x/repro.syz?x=111fc8afa00000
From the repro it looks like the same bpf stack overflow bug. +John
We need to dup them onto some canonical report for this bug, or this
becomes unmanageable.
#syz dup: kernel panic: corrupted stack end in dput
> The bug was bisected to:
>
> commit 96a5d8d4915f3e241ebb48d5decdd110ab9c7dcf
> Author: Leo Liu <leo.liu@amd.com>
> Date: Fri Jul 13 15:26:28 2018 +0000
>
> drm/amdgpu: Make sure IB tests flushed after IP resume
>
> bisection log: https://syzkaller.appspot.com/x/bisect.txt?x=14a46200600000
> final crash: https://syzkaller.appspot.com/x/report.txt?x=16a46200600000
> console output: https://syzkaller.appspot.com/x/log.txt?x=12a46200600000
>
> IMPORTANT: if you fix the bug, please add the following tag to the commit:
> Reported-by: syzbot+79f5f028005a77ecb6bb@syzkaller.appspotmail.com
> Fixes: 96a5d8d4915f ("drm/amdgpu: Make sure IB tests flushed after IP
> resume")
>
> Kernel panic - not syncing: stack-protector: Kernel stack is corrupted in:
> pointer+0x702/0x750 lib/vsprintf.c:2187
> Shutting down cpus with NMI
> Kernel Offset: disabled
>
>
> ---
> This bug is generated by a bot. It may contain errors.
> See https://goo.gl/tpsmEJ for more information about syzbot.
> syzbot engineers can be reached at syzkaller@googlegroups.com.
>
> syzbot will keep track of this bug report. See:
> https://goo.gl/tpsmEJ#status for how to communicate with syzbot.
> For information about bisection process see: https://goo.gl/tpsmEJ#bisection
> syzbot can test patches for this bug, for details see:
> https://goo.gl/tpsmEJ#testing-patches
^ permalink raw reply
* [PATCH 0/6] Fixes for meta data acceleration
From: Jason Wang @ 2019-07-23 7:57 UTC (permalink / raw)
To: mst, jasowang; +Cc: kvm, virtualization, netdev, linux-kernel
Hi all:
This series try to fix several issues introduced by meta data
accelreation series. Please review.
Jason Wang (6):
vhost: don't set uaddr for invalid address
vhost: validate MMU notifier registration
vhost: fix vhost map leak
vhost: reset invalidate_count in vhost_set_vring_num_addr()
vhost: mark dirty pages during map uninit
vhost: don't do synchronize_rcu() in vhost_uninit_vq_maps()
drivers/vhost/vhost.c | 56 +++++++++++++++++++++++++++++++------------
drivers/vhost/vhost.h | 1 +
2 files changed, 42 insertions(+), 15 deletions(-)
--
2.18.1
^ permalink raw reply
* [PATCH 1/6] vhost: don't set uaddr for invalid address
From: Jason Wang @ 2019-07-23 7:57 UTC (permalink / raw)
To: mst, jasowang; +Cc: kvm, virtualization, netdev, linux-kernel
In-Reply-To: <20190723075718.6275-1-jasowang@redhat.com>
We should not setup uaddr for the invalid address, otherwise we may
try to pin or prefetch mapping of wrong pages.
Fixes: 7f466032dc9e ("vhost: access vq metadata through kernel virtual address")
Signed-off-by: Jason Wang <jasowang@redhat.com>
---
drivers/vhost/vhost.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/drivers/vhost/vhost.c b/drivers/vhost/vhost.c
index dc9301d31f12..34c0d970bcbc 100644
--- a/drivers/vhost/vhost.c
+++ b/drivers/vhost/vhost.c
@@ -2083,7 +2083,8 @@ static long vhost_vring_set_num_addr(struct vhost_dev *d,
}
#if VHOST_ARCH_CAN_ACCEL_UACCESS
- vhost_setup_vq_uaddr(vq);
+ if (r == 0)
+ vhost_setup_vq_uaddr(vq);
if (d->mm)
mmu_notifier_register(&d->mmu_notifier, d->mm);
--
2.18.1
^ permalink raw reply related
* [PATCH 3/6] vhost: fix vhost map leak
From: Jason Wang @ 2019-07-23 7:57 UTC (permalink / raw)
To: mst, jasowang; +Cc: kvm, virtualization, netdev, linux-kernel
In-Reply-To: <20190723075718.6275-1-jasowang@redhat.com>
We don't free map during vhost_map_unprefetch(). This means it could
be leaked. Fixing by free the map.
Reported-by: Michael S. Tsirkin <mst@redhat.com>
Fixes: 7f466032dc9e ("vhost: access vq metadata through kernel virtual address")
Signed-off-by: Jason Wang <jasowang@redhat.com>
---
drivers/vhost/vhost.c | 4 +---
1 file changed, 1 insertion(+), 3 deletions(-)
diff --git a/drivers/vhost/vhost.c b/drivers/vhost/vhost.c
index 058191d5efad..03666b702498 100644
--- a/drivers/vhost/vhost.c
+++ b/drivers/vhost/vhost.c
@@ -303,9 +303,7 @@ static void vhost_vq_meta_reset(struct vhost_dev *d)
static void vhost_map_unprefetch(struct vhost_map *map)
{
kfree(map->pages);
- map->pages = NULL;
- map->npages = 0;
- map->addr = NULL;
+ kfree(map);
}
static void vhost_uninit_vq_maps(struct vhost_virtqueue *vq)
--
2.18.1
^ permalink raw reply related
page: next (older) | prev (newer) | latest
- recent:[subjects (threaded)|topics (new)|topics (active)]
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox