Netdev List
 help / color / mirror / Atom feed
* Re: [PATCH bpf-next 5/5] selftests/bpf: remove perf buffer helpers
From: Song Liu @ 2019-07-23  9:39 UTC (permalink / raw)
  To: Andrii Nakryiko
  Cc: bpf, netdev@vger.kernel.org, Alexei Starovoitov,
	daniel@iogearbox.net, andrii.nakryiko@gmail.com, Kernel Team
In-Reply-To: <20190723043112.3145810-6-andriin@fb.com>



> On Jul 22, 2019, at 9:31 PM, Andrii Nakryiko <andriin@fb.com> wrote:
> 
> 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>

Acked-by: Song Liu <songliubraving@fb.com>


^ permalink raw reply

* Re: [PATCH bpf-next 3/5] samples/bpf: convert xdp_sample_pkts_user to perf_buffer API
From: Song Liu @ 2019-07-23  9:39 UTC (permalink / raw)
  To: Andrii Nakryiko
  Cc: bpf, Networking, Alexei Starovoitov, daniel@iogearbox.net,
	andrii.nakryiko@gmail.com, Kernel Team
In-Reply-To: <20190723043112.3145810-4-andriin@fb.com>



> On Jul 22, 2019, at 9:31 PM, Andrii Nakryiko <andriin@fb.com> wrote:
> 
> Convert xdp_sample_pkts_user to libbpf's perf_buffer API.
> 
> Signed-off-by: Andrii Nakryiko <andriin@fb.com>

Acked-by: Song Liu <songliubraving@fb.com>

^ permalink raw reply

* Re: [bpf-next 6/6] selftests/bpf: add test for bpf_tcp_gen_syncookie
From: Lorenz Bauer @ 2019-07-23  9:37 UTC (permalink / raw)
  To: Petar Penkov
  Cc: Networking, bpf, davem, Alexei Starovoitov, Daniel Borkmann,
	Eric Dumazet, Stanislav Fomichev, Petar Penkov
In-Reply-To: <20190723002042.105927-7-ppenkov.kernel@gmail.com>

On Tue, 23 Jul 2019 at 01:20, Petar Penkov <ppenkov.kernel@gmail.com> wrote:
> +static __always_inline __s64 gen_syncookie(void *data_end, struct bpf_sock *sk,
> +                                          void *iph, __u32 ip_size,
> +                                          struct tcphdr *tcph)
> +{
> +       __u32 thlen = tcph->doff * 4;
> +
> +       if (tcph->syn && !tcph->ack) {
> +               // packet should only have an MSS option
> +               if (thlen != 24)
> +                       return 0;

Just for my own understanding: without this the verifier complains since
thlen is not a known value, even though it is in bounds due to the check below?

> +
> +               if ((void *)tcph + thlen > data_end)
> +                       return 0;
> +
> +               return bpf_tcp_gen_syncookie(sk, iph, ip_size, tcph, thlen);
> +       }
> +       return 0;
> +}
> +

-- 
Lorenz Bauer  |  Systems Engineer
6th Floor, County Hall/The Riverside Building, SE1 7PB, UK

www.cloudflare.com

^ permalink raw reply

* RE: [PATCH net-next 0/3] net: stmmac: Convert to phylink
From: Jose Abreu @ 2019-07-23  9:36 UTC (permalink / raw)
  To: Ondřej Jirman, Jose Abreu
  Cc: Andrew Lunn, linux-kernel@vger.kernel.org, netdev@vger.kernel.org,
	Joao Pinto, David S . Miller, Giuseppe Cavallaro,
	Alexandre Torgue, Russell King, Florian Fainelli, Heiner Kallweit
In-Reply-To: <20190722143955.uwzvcmhc4bdr2zr5@core.my.home>

From: Ondřej Jirman <megi@xff.cz>
Date: Jul/22/2019, 15:39:55 (UTC+00:00)

> On Mon, Jul 22, 2019 at 02:26:45PM +0000, Jose Abreu wrote:
> > From: Andrew Lunn <andrew@lunn.ch>
> > Date: Jul/22/2019, 15:19:43 (UTC+00:00)
> > 
> > > On Mon, Jul 22, 2019 at 01:58:20PM +0000, Jose Abreu wrote:
> > > > From: Andrew Lunn <andrew@lunn.ch>
> > > > Date: Jul/22/2019, 14:40:23 (UTC+00:00)
> > > > 
> > > > > Does this mean that all stmmac variants support 1G? There are none
> > > > > which just support Fast Ethernet?
> > > > 
> > > > This glue logic drivers sometimes reflect a custom IP that's Synopsys 
> > > > based but modified by customer, so I can't know before-hand what's the 
> > > > supported max speed. There are some old versions that don't support 1G 
> > > > but I expect that PHY driver limits this ...
> > > 
> > > If a Fast PHY is used, then yes, it would be limited. But sometimes a
> > > 1G PHY is used because they are cheaper than a Fast PHY.
> > >  
> > > > > I'm also not sure the change fits the problem. Why did it not
> > > > > negotiate 100FULL rather than 10Half? You are only moving the 1G
> > > > > speeds around, so 100 speeds should of been advertised and selected.
> > > > 
> > > > Hmm, now that I'm looking at it closer I agree with you. Maybe link 
> > > > partner or PHY doesn't support 100M ?
> > > 
> > > In the working case, ethtool shows the link partner supports 10, 100,
> > > and 1G. So something odd is going on here.
> > > 
> > > You fix does seems reasonable, and it has been reported to fix the
> > > issue, but it would be good to understand what is going on here.
> > 
> > Agreed!
> > 
> > Ondrej, can you please share dmesg log and ethtool output with the fixed 
> > patch ?
> 
> See the attachment, or this link:

So, I've removed all 1G link modes from stmmac and run it on an ARM 
based board. My link status resolves to 100M/Full using Generic PHY so 
maybe something is wrong with the PHY driver that Ondrej is using 
("RTL8211E Gigabit Ethernet") ?

---
Thanks,
Jose Miguel Abreu

^ permalink raw reply

* Re: [PATCH bpf-next 2/5] selftests/bpf: switch test_tcpnotify to perf_buffer API
From: Song Liu @ 2019-07-23  9:35 UTC (permalink / raw)
  To: Andrii Nakryiko
  Cc: bpf, netdev@vger.kernel.org, Alexei Starovoitov,
	daniel@iogearbox.net, andrii.nakryiko@gmail.com, Kernel Team
In-Reply-To: <20190723043112.3145810-3-andriin@fb.com>



> On Jul 22, 2019, at 9:31 PM, Andrii Nakryiko <andriin@fb.com> wrote:
> 
> 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>

Acked-by: Song Liu <songliubraving@fb.com>


^ permalink raw reply

* Re: [PATCH bpf-next 4/5] samples/bpf: switch trace_output sample to perf_buffer API
From: Song Liu @ 2019-07-23  9:29 UTC (permalink / raw)
  To: Andrii Nakryiko
  Cc: bpf, netdev@vger.kernel.org, Alexei Starovoitov,
	daniel@iogearbox.net, andrii.nakryiko@gmail.com, Kernel Team
In-Reply-To: <20190723043112.3145810-5-andriin@fb.com>



> On Jul 22, 2019, at 9:31 PM, Andrii Nakryiko <andriin@fb.com> wrote:
> 
> Convert trace_output sample to libbpf's perf_buffer API.
> 
> Signed-off-by: Andrii Nakryiko <andriin@fb.com>

Acked-by: Song Liu <songliubraving@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

* Re: [PATCH net-next v2 3/3] netlink: add validation of NLA_F_NESTED flag
From: Thomas Haller @ 2019-07-23  9:28 UTC (permalink / raw)
  To: Michal Kubecek, netdev
  Cc: David S. Miller, Johannes Berg, David Ahern, linux-kernel
In-Reply-To: <20190723090908.GA2204@unicorn.suse.cz>

[-- Attachment #1: Type: text/plain, Size: 1851 bytes --]

On Tue, 2019-07-23 at 11:09 +0200, Michal Kubecek wrote:
> On Tue, Jul 23, 2019 at 10:57:54AM +0200, Thomas Haller wrote:
> > Does this flag and strict validation really provide any value?
> > Commonly a netlink message is a plain TLV blob, and the meaning
> > depends entirely on the policy.
> > 
> > What I mean is that for example
> > 
> >   NLA_PUT_U32 (msg, ATTR_IFINDEX, (uint32_t) ifindex)
> >   NLA_PUT_STRING (msg, ATTR_IFNAME, "net")
> > 
> > results in a 4 bytes payload that does not encode whether the data
> > is
> > a number or a string.
> > 
> > Why is it valuable in this case to encode additional type
> > information
> > inside the message, when it's commonly not done and also not
> > necessary?
> 
> One big advantage of having nested attributes explicitly marked is
> that
> it allows parsers not aware of the semantics to recognize nested
> attributes and parse their inner structure.
> 
> This is very important e.g. for debugging purposes as without the
> flag,
> wireshark can only recurse into nested attributes if it understands
> the
> protocol and knows they are nested, otherwise it displays them only
> as
> an opaque blob (which is what happens for most netlink based
> protocols).
> Another example is mnl_nlmsg_fprintf() function from libmnl which is
> also a valuable debugging aid but without NLA_F_NESTED flags it
> cannot
> show message structure properly.

Hi,

I don't question the use of the flag. I question whether it's necessary
for kernel to strictly require the sending side to aid debuggability.

"e.g. for debugging purposes" makes it sound like it would be important
for something else. I wonder what else.


Anyway. What you elaborate makes sense!! Thanks


My main point was to raise awareness that this is a problem for libnl3.


best,
Thomas

[-- Attachment #2: This is a digitally signed message part --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

^ permalink raw reply

* Re: [PATCH bpf-next 1/5] selftests/bpf: convert test_get_stack_raw_tp to perf_buffer API
From: Song Liu @ 2019-07-23  9:25 UTC (permalink / raw)
  To: Andrii Nakryiko
  Cc: bpf, netdev@vger.kernel.org, Alexei Starovoitov,
	daniel@iogearbox.net, andrii.nakryiko@gmail.com, Kernel Team
In-Reply-To: <20190723043112.3145810-2-andriin@fb.com>



> On Jul 22, 2019, at 9:31 PM, Andrii Nakryiko <andriin@fb.com> wrote:
> 
> Convert test_get_stack_raw_tp test to new perf_buffer API.
> 
> Signed-off-by: Andrii Nakryiko <andriin@fb.com>
> ---
> .../bpf/prog_tests/get_stack_raw_tp.c         | 78 ++++++++++---------
> .../bpf/progs/test_get_stack_rawtp.c          |  2 +-
> 2 files changed, 44 insertions(+), 36 deletions(-)
> 
> diff --git a/tools/testing/selftests/bpf/prog_tests/get_stack_raw_tp.c b/tools/testing/selftests/bpf/prog_tests/get_stack_raw_tp.c
> index c2a0a9d5591b..473889e1b219 100644
> --- a/tools/testing/selftests/bpf/prog_tests/get_stack_raw_tp.c
> +++ b/tools/testing/selftests/bpf/prog_tests/get_stack_raw_tp.c
> @@ -1,8 +1,15 @@
> // SPDX-License-Identifier: GPL-2.0
> +#define _GNU_SOURCE
> +#include <pthread.h>
> +#include <sched.h>
> +#include <sys/socket.h>
> #include <test_progs.h>
> 
> #define MAX_CNT_RAWTP	10ull
> #define MAX_STACK_RAWTP	100
> +
> +static int duration = 0;
> +

Are we using "duration" at all?

> struct get_stack_trace_t {
> 	int pid;
> 	int kern_stack_size;
> @@ -13,7 +20,7 @@ struct get_stack_trace_t {
> 	struct bpf_stack_build_id user_stack_buildid[MAX_STACK_RAWTP];
> };
> 
> -static int get_stack_print_output(void *data, int size)
> +static void get_stack_print_output(void *ctx, int cpu, void *data, __u32 size)
> {
> 	bool good_kern_stack = false, good_user_stack = false;
> 	const char *nonjit_func = "___bpf_prog_run";
> @@ -65,75 +72,76 @@ static int get_stack_print_output(void *data, int size)
> 		if (e->user_stack_size > 0 && e->user_stack_buildid_size > 0)
> 			good_user_stack = true;
> 	}
> -	if (!good_kern_stack || !good_user_stack)
> -		return LIBBPF_PERF_EVENT_ERROR;
> 
> -	if (cnt == MAX_CNT_RAWTP)
> -		return LIBBPF_PERF_EVENT_DONE;
> -
> -	return LIBBPF_PERF_EVENT_CONT;
> +	if (!good_kern_stack)
> +	    CHECK(!good_kern_stack, "bad_kern_stack", "bad\n");

Two "bad" is a little weird. How about "kern stack", "bad"?

> +	if (!good_user_stack)
> +	    CHECK(!good_user_stack, "bad_user_stack", "bad\n");
> }
> 
> void test_get_stack_raw_tp(void)
> {
> 	const char *file = "./test_get_stack_rawtp.o";
> -	int i, efd, err, prog_fd, pmu_fd, perfmap_fd;
> -	struct perf_event_attr attr = {};
> +	const char *prog_name = "raw_tracepoint/sys_enter";
> +	int i, err, prog_fd, exp_cnt = MAX_CNT_RAWTP;
> +	struct perf_buffer_opts pb_opts = {};
> +	struct perf_buffer *pb = NULL;
> +	struct bpf_link *link = NULL;
> 	struct timespec tv = {0, 10};
> -	__u32 key = 0, duration = 0;
> +	struct bpf_program *prog;
> 	struct bpf_object *obj;
> +	struct bpf_map *map;
> +	cpu_set_t cpu_set;
> 
> 	err = bpf_prog_load(file, BPF_PROG_TYPE_RAW_TRACEPOINT, &obj, &prog_fd);
> 	if (CHECK(err, "prog_load raw tp", "err %d errno %d\n", err, errno))
> 		return;
> 
> -	efd = bpf_raw_tracepoint_open("sys_enter", prog_fd);
> -	if (CHECK(efd < 0, "raw_tp_open", "err %d errno %d\n", efd, errno))
> +	prog = bpf_object__find_program_by_title(obj, prog_name);
> +	if (CHECK(!prog, "find_probe", "prog '%s' not found\n", prog_name))
> 		goto close_prog;
> 
> -	perfmap_fd = bpf_find_map(__func__, obj, "perfmap");
> -	if (CHECK(perfmap_fd < 0, "bpf_find_map", "err %d errno %d\n",
> -		  perfmap_fd, errno))
> +	map = bpf_object__find_map_by_name(obj, "perfmap");
> +	if (CHECK(!map, "bpf_find_map", "not found\n"))
> 		goto close_prog;
> 
> 	err = load_kallsyms();
> 	if (CHECK(err < 0, "load_kallsyms", "err %d errno %d\n", err, errno))
> 		goto close_prog;
> 
> -	attr.sample_type = PERF_SAMPLE_RAW;
> -	attr.type = PERF_TYPE_SOFTWARE;
> -	attr.config = PERF_COUNT_SW_BPF_OUTPUT;
> -	pmu_fd = syscall(__NR_perf_event_open, &attr, getpid()/*pid*/, -1/*cpu*/,
> -			 -1/*group_fd*/, 0);
> -	if (CHECK(pmu_fd < 0, "perf_event_open", "err %d errno %d\n", pmu_fd,
> -		  errno))
> +	CPU_ZERO(&cpu_set);
> +	CPU_SET(0, &cpu_set);
> +	err = pthread_setaffinity_np(pthread_self(), sizeof(cpu_set), &cpu_set);
> +	if (CHECK(err, "set_affinity", "err %d, errno %d\n", err, errno))
> 		goto close_prog;
> 
> -	err = bpf_map_update_elem(perfmap_fd, &key, &pmu_fd, BPF_ANY);
> -	if (CHECK(err < 0, "bpf_map_update_elem", "err %d errno %d\n", err,
> -		  errno))
> +	link = bpf_program__attach_raw_tracepoint(prog, "sys_enter");
> +	if (CHECK(IS_ERR(link), "attach_raw_tp", "err %ld\n", PTR_ERR(link)))
> 		goto close_prog;
> 
> -	err = ioctl(pmu_fd, PERF_EVENT_IOC_ENABLE, 0);
> -	if (CHECK(err < 0, "ioctl PERF_EVENT_IOC_ENABLE", "err %d errno %d\n",
> -		  err, errno))
> -		goto close_prog;
> -
> -	err = perf_event_mmap(pmu_fd);
> -	if (CHECK(err < 0, "perf_event_mmap", "err %d errno %d\n", err, errno))
> +	pb_opts.sample_cb = get_stack_print_output;
> +	pb = perf_buffer__new(bpf_map__fd(map), 8, &pb_opts);
> +	if (CHECK(IS_ERR(pb), "perf_buf__new", "err %ld\n", PTR_ERR(pb)))
> 		goto close_prog;
> 
> 	/* trigger some syscall action */
> 	for (i = 0; i < MAX_CNT_RAWTP; i++)
> 		nanosleep(&tv, NULL);
> 
> -	err = perf_event_poller(pmu_fd, get_stack_print_output);
> -	if (CHECK(err < 0, "perf_event_poller", "err %d errno %d\n", err, errno))
> -		goto close_prog;
> +	while (exp_cnt > 0) {
> +		err = perf_buffer__poll(pb, 100);
> +		if (err < 0 && CHECK(err < 0, "pb__poll", "err %d\n", err))
> +			goto close_prog;
> +		exp_cnt -= err;
> +	}
> 
> 	goto close_prog_noerr;
> close_prog:
> 	error_cnt++;
> close_prog_noerr:
> +	if (!IS_ERR_OR_NULL(link))
> +		bpf_link__destroy(link);
> +	if (!IS_ERR_OR_NULL(pb))
> +		perf_buffer__free(pb);
> 	bpf_object__close(obj);
> }
> diff --git a/tools/testing/selftests/bpf/progs/test_get_stack_rawtp.c b/tools/testing/selftests/bpf/progs/test_get_stack_rawtp.c
> index 33254b771384..f8ffa3f3d44b 100644
> --- a/tools/testing/selftests/bpf/progs/test_get_stack_rawtp.c
> +++ b/tools/testing/selftests/bpf/progs/test_get_stack_rawtp.c
> @@ -55,7 +55,7 @@ struct {
> 	__type(value, raw_stack_trace_t);
> } rawdata_map SEC(".maps");
> 
> -SEC("tracepoint/raw_syscalls/sys_enter")
> +SEC("raw_tracepoint/sys_enter")
> int bpf_prog1(void *ctx)
> {
> 	int max_len, max_buildid_len, usize, ksize, total_size;
> -- 
> 2.17.1
> 


^ permalink raw reply

* Re: [PATCH 2/6] vhost: validate MMU notifier registration
From: Michael S. Tsirkin @ 2019-07-23  9:17 UTC (permalink / raw)
  To: Jason Wang; +Cc: kvm, virtualization, netdev, linux-kernel
In-Reply-To: <20190723075718.6275-3-jasowang@redhat.com>

On Tue, Jul 23, 2019 at 03:57:14AM -0400, Jason Wang wrote:
> The return value of mmu_notifier_register() is not checked in
> vhost_vring_set_num_addr(). This will cause an out of sync between mm
> and MMU notifier thus a double free. To solve this, introduce a
> boolean flag to track whether MMU notifier is registered and only do
> unregistering when it was true.
> 
> Reported-and-tested-by:
> syzbot+e58112d71f77113ddb7b@syzkaller.appspotmail.com
> Fixes: 7f466032dc9e ("vhost: access vq metadata through kernel virtual address")
> Signed-off-by: Jason Wang <jasowang@redhat.com>

Right. This fixes the bug.
But it's not great that simple things like
setting vq address put pressure on memory allocator.
Also, if we get a single during processing
notifier register will fail, disabling optimization permanently.

In fact, see below:


> ---
>  drivers/vhost/vhost.c | 19 +++++++++++++++----
>  drivers/vhost/vhost.h |  1 +
>  2 files changed, 16 insertions(+), 4 deletions(-)
> 
> diff --git a/drivers/vhost/vhost.c b/drivers/vhost/vhost.c
> index 34c0d970bcbc..058191d5efad 100644
> --- a/drivers/vhost/vhost.c
> +++ b/drivers/vhost/vhost.c
> @@ -630,6 +630,7 @@ void vhost_dev_init(struct vhost_dev *dev,
>  	dev->iov_limit = iov_limit;
>  	dev->weight = weight;
>  	dev->byte_weight = byte_weight;
> +	dev->has_notifier = false;
>  	init_llist_head(&dev->work_list);
>  	init_waitqueue_head(&dev->wait);
>  	INIT_LIST_HEAD(&dev->read_list);
> @@ -731,6 +732,7 @@ long vhost_dev_set_owner(struct vhost_dev *dev)
>  	if (err)
>  		goto err_mmu_notifier;
>  #endif
> +	dev->has_notifier = true;
>  
>  	return 0;
>  

I just noticed that set owner now fails if we get a signal.
Userspace could retry in theory but it does not:
this is userspace abi breakage since it used to only
fail on invalid input.

> @@ -960,7 +962,11 @@ void vhost_dev_cleanup(struct vhost_dev *dev)
>  	}
>  	if (dev->mm) {
>  #if VHOST_ARCH_CAN_ACCEL_UACCESS
> -		mmu_notifier_unregister(&dev->mmu_notifier, dev->mm);
> +		if (dev->has_notifier) {
> +			mmu_notifier_unregister(&dev->mmu_notifier,
> +						dev->mm);
> +			dev->has_notifier = false;
> +		}
>  #endif
>  		mmput(dev->mm);
>  	}
> @@ -2065,8 +2071,10 @@ static long vhost_vring_set_num_addr(struct vhost_dev *d,
>  	/* Unregister MMU notifer to allow invalidation callback
>  	 * can access vq->uaddrs[] without holding a lock.
>  	 */
> -	if (d->mm)
> +	if (d->has_notifier) {
>  		mmu_notifier_unregister(&d->mmu_notifier, d->mm);
> +		d->has_notifier = false;
> +	}
>  
>  	vhost_uninit_vq_maps(vq);
>  #endif
> @@ -2086,8 +2094,11 @@ static long vhost_vring_set_num_addr(struct vhost_dev *d,
>  	if (r == 0)
>  		vhost_setup_vq_uaddr(vq);
>  
> -	if (d->mm)
> -		mmu_notifier_register(&d->mmu_notifier, d->mm);
> +	if (d->mm) {
> +		r = mmu_notifier_register(&d->mmu_notifier, d->mm);
> +		if (!r)
> +			d->has_notifier = true;
> +	}
>  #endif
>  
>  	mutex_unlock(&vq->mutex);
> diff --git a/drivers/vhost/vhost.h b/drivers/vhost/vhost.h
> index 819296332913..a62f56a4cf72 100644
> --- a/drivers/vhost/vhost.h
> +++ b/drivers/vhost/vhost.h
> @@ -214,6 +214,7 @@ struct vhost_dev {
>  	int iov_limit;
>  	int weight;
>  	int byte_weight;
> +	bool has_notifier;
>  };
>  
>  bool vhost_exceeds_weight(struct vhost_virtqueue *vq, int pkts, int total_len);
> -- 
> 2.18.1

^ permalink raw reply

* Re: [PATCH 4/6] vhost: reset invalidate_count in vhost_set_vring_num_addr()
From: Michael S. Tsirkin @ 2019-07-23  9:17 UTC (permalink / raw)
  To: Jason Wang; +Cc: kvm, virtualization, netdev, linux-kernel
In-Reply-To: <20190723075718.6275-5-jasowang@redhat.com>

On Tue, Jul 23, 2019 at 03:57:16AM -0400, Jason Wang wrote:
> The vhost_set_vring_num_addr() could be called in the middle of
> invalidate_range_start() and invalidate_range_end(). If we don't reset
> invalidate_count after the un-registering of MMU notifier, the
> invalidate_cont will run out of sync (e.g never reach zero). This will
> in fact disable the fast accessor path. Fixing by reset the count to
> zero.
> 
> 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, 4 insertions(+)
> 
> diff --git a/drivers/vhost/vhost.c b/drivers/vhost/vhost.c
> index 03666b702498..89c9f08b5146 100644
> --- a/drivers/vhost/vhost.c
> +++ b/drivers/vhost/vhost.c
> @@ -2074,6 +2074,10 @@ static long vhost_vring_set_num_addr(struct vhost_dev *d,
>  		d->has_notifier = false;
>  	}
>  
> +	/* reset invalidate_count in case we are in the middle of
> +	 * invalidate_start() and invalidate_end().
> +	 */
> +	vq->invalidate_count = 0;

I think that the code is ok but the comments are not very clear:
- we are never in the middle since we just removed the notifier
- the result is not just disabling optimization:
  if notifier becomes negative, then later we
  can think it's ok to map when it isn't since
  notifier is active.

>  	vhost_uninit_vq_maps(vq);
>  #endif
>  
> -- 
> 2.18.1

^ permalink raw reply

* Re: [PATCH 5/6] vhost: mark dirty pages during map uninit
From: Michael S. Tsirkin @ 2019-07-23  9:17 UTC (permalink / raw)
  To: Jason Wang; +Cc: kvm, virtualization, netdev, linux-kernel
In-Reply-To: <20190723075718.6275-6-jasowang@redhat.com>

On Tue, Jul 23, 2019 at 03:57:17AM -0400, Jason Wang wrote:
> We don't mark dirty pages if the map was teared down outside MMU
> notifier. This will lead untracked dirty pages. Fixing by marking
> dirty pages during map uninit.
> 
> 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 | 22 ++++++++++++++++------
>  1 file changed, 16 insertions(+), 6 deletions(-)
> 
> diff --git a/drivers/vhost/vhost.c b/drivers/vhost/vhost.c
> index 89c9f08b5146..5b8821d00fe4 100644
> --- a/drivers/vhost/vhost.c
> +++ b/drivers/vhost/vhost.c
> @@ -306,6 +306,18 @@ static void vhost_map_unprefetch(struct vhost_map *map)
>  	kfree(map);
>  }
>  
> +static void vhost_set_map_dirty(struct vhost_virtqueue *vq,
> +				struct vhost_map *map, int index)
> +{
> +	struct vhost_uaddr *uaddr = &vq->uaddrs[index];
> +	int i;
> +
> +	if (uaddr->write) {
> +		for (i = 0; i < map->npages; i++)
> +			set_page_dirty(map->pages[i]);
> +	}
> +}
> +
>  static void vhost_uninit_vq_maps(struct vhost_virtqueue *vq)
>  {
>  	struct vhost_map *map[VHOST_NUM_ADDRS];
> @@ -315,8 +327,10 @@ static void vhost_uninit_vq_maps(struct vhost_virtqueue *vq)
>  	for (i = 0; i < VHOST_NUM_ADDRS; i++) {
>  		map[i] = rcu_dereference_protected(vq->maps[i],
>  				  lockdep_is_held(&vq->mmu_lock));
> -		if (map[i])
> +		if (map[i]) {
> +			vhost_set_map_dirty(vq, map[i], i);
>  			rcu_assign_pointer(vq->maps[i], NULL);
> +		}
>  	}
>  	spin_unlock(&vq->mmu_lock);
>  
> @@ -354,7 +368,6 @@ static void vhost_invalidate_vq_start(struct vhost_virtqueue *vq,
>  {
>  	struct vhost_uaddr *uaddr = &vq->uaddrs[index];
>  	struct vhost_map *map;
> -	int i;
>  
>  	if (!vhost_map_range_overlap(uaddr, start, end))
>  		return;
> @@ -365,10 +378,7 @@ static void vhost_invalidate_vq_start(struct vhost_virtqueue *vq,
>  	map = rcu_dereference_protected(vq->maps[index],
>  					lockdep_is_held(&vq->mmu_lock));
>  	if (map) {
> -		if (uaddr->write) {
> -			for (i = 0; i < map->npages; i++)
> -				set_page_dirty(map->pages[i]);
> -		}
> +		vhost_set_map_dirty(vq, map, index);
>  		rcu_assign_pointer(vq->maps[index], NULL);
>  	}
>  	spin_unlock(&vq->mmu_lock);

OK and the reason it's safe is because the invalidate counter
got incremented so we know page will not get mapped again.

But we *do* need to wait for page not to be mapped.
And if that means waiting for VQ processing to finish,
then I worry that is a very log time.


> -- 
> 2.18.1

^ permalink raw reply

* Re: [PATCH 6/6] vhost: don't do synchronize_rcu() in vhost_uninit_vq_maps()
From: Michael S. Tsirkin @ 2019-07-23  9:16 UTC (permalink / raw)
  To: Jason Wang; +Cc: kvm, virtualization, netdev, linux-kernel
In-Reply-To: <20190723075718.6275-7-jasowang@redhat.com>

On Tue, Jul 23, 2019 at 03:57:18AM -0400, Jason Wang wrote:
> There's no need for RCU synchronization in vhost_uninit_vq_maps()
> since we've already serialized with readers (memory accessors). This
> also avoid the possible userspace DOS through ioctl() because of the
> possible high latency caused by synchronize_rcu().
> 
> 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>

I agree synchronize_rcu in both mmu notifiers and ioctl
is a problem we must fix.

> ---
>  drivers/vhost/vhost.c | 4 +++-
>  1 file changed, 3 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/vhost/vhost.c b/drivers/vhost/vhost.c
> index 5b8821d00fe4..a17df1f4069a 100644
> --- a/drivers/vhost/vhost.c
> +++ b/drivers/vhost/vhost.c
> @@ -334,7 +334,9 @@ static void vhost_uninit_vq_maps(struct vhost_virtqueue *vq)
>  	}
>  	spin_unlock(&vq->mmu_lock);
>  
> -	synchronize_rcu();
> +	/* No need for synchronize_rcu() or kfree_rcu() since we are
> +	 * serialized with memory accessors (e.g vq mutex held).
> +	 */
>  
>  	for (i = 0; i < VHOST_NUM_ADDRS; i++)
>  		if (map[i])
> -- 
> 2.18.1

.. however we can not RCU with no synchronization in sight.
Sometimes there are hacks like using a lock/unlock
pair instead of sync, but here no one bothers.

specifically notifiers call reset vq maps which calls
uninit vq maps which is not under any lock.

You will get use after free when map is then accessed.

If you always have a lock then just take that lock
and no need for RCU.

-- 
MST

^ permalink raw reply

* Re: [PATCH net-next v2 3/3] netlink: add validation of NLA_F_NESTED flag
From: Michal Kubecek @ 2019-07-23  9:09 UTC (permalink / raw)
  To: netdev
  Cc: Thomas Haller, David S. Miller, Johannes Berg, David Ahern,
	linux-kernel
In-Reply-To: <0fc58a4883f6656208b9250876e53d723919e342.camel@redhat.com>

On Tue, Jul 23, 2019 at 10:57:54AM +0200, Thomas Haller wrote:
> Does this flag and strict validation really provide any value?
> Commonly a netlink message is a plain TLV blob, and the meaning
> depends entirely on the policy.
> 
> What I mean is that for example
> 
>   NLA_PUT_U32 (msg, ATTR_IFINDEX, (uint32_t) ifindex)
>   NLA_PUT_STRING (msg, ATTR_IFNAME, "net")
> 
> results in a 4 bytes payload that does not encode whether the data is
> a number or a string.
> 
> Why is it valuable in this case to encode additional type information
> inside the message, when it's commonly not done and also not
> necessary?

One big advantage of having nested attributes explicitly marked is that
it allows parsers not aware of the semantics to recognize nested
attributes and parse their inner structure.

This is very important e.g. for debugging purposes as without the flag,
wireshark can only recurse into nested attributes if it understands the
protocol and knows they are nested, otherwise it displays them only as
an opaque blob (which is what happens for most netlink based protocols).
Another example is mnl_nlmsg_fprintf() function from libmnl which is
also a valuable debugging aid but without NLA_F_NESTED flags it cannot
show message structure properly.

Michal Kubecek

^ permalink raw reply

* [PATCH V3 1/1] can: sja1000: f81601: add Fintek F81601 support
From: Ji-Ze Hong (Peter Hong) @ 2019-07-23  9:03 UTC (permalink / raw)
  To: wg, mkl, peter_hong
  Cc: davem, f.suligoi, linux-kernel, linux-can, netdev,
	Ji-Ze Hong (Peter Hong)

This patch add support for Fintek PCIE to 2 CAN controller support

Signed-off-by: Ji-Ze Hong (Peter Hong) <hpeter+linux_kernel@gmail.com>
---
v3:
	1: Fix module parameter "internal_clk" default from 1 to true.
	2: Remove non-usable pcim_iounmap().

v2:
	1: Fix comment on the spinlock with write access.
	2: Use ARRAY_SIZE instead of F81601_PCI_MAX_CHAN.
	3: Check the strap pin outside the loop.
	4: Fix the cleanup issue in f81601_pci_add_card().
	5: Remove unused "channels" in struct f81601_pci_card.

 drivers/net/can/sja1000/Kconfig  |   8 ++
 drivers/net/can/sja1000/Makefile |   1 +
 drivers/net/can/sja1000/f81601.c | 213 +++++++++++++++++++++++++++++++++++++++
 3 files changed, 222 insertions(+)
 create mode 100644 drivers/net/can/sja1000/f81601.c

diff --git a/drivers/net/can/sja1000/Kconfig b/drivers/net/can/sja1000/Kconfig
index f6dc89927ece..8588323c5138 100644
--- a/drivers/net/can/sja1000/Kconfig
+++ b/drivers/net/can/sja1000/Kconfig
@@ -101,4 +101,12 @@ config CAN_TSCAN1
 	  IRQ numbers are read from jumpers JP4 and JP5,
 	  SJA1000 IO base addresses are chosen heuristically (first that works).
 
+config CAN_F81601
+	tristate "Fintek F81601 PCIE to 2 CAN Controller"
+	depends on PCI
+	help
+	  This driver adds support for Fintek F81601 PCIE to 2 CAN Controller.
+	  It had internal 24MHz clock source, but it can be changed by
+	  manufacturer. We can use modinfo to get usage for parameters.
+	  Visit http://www.fintek.com.tw to get more information.
 endif
diff --git a/drivers/net/can/sja1000/Makefile b/drivers/net/can/sja1000/Makefile
index 9253aaf9e739..6f6268543bd9 100644
--- a/drivers/net/can/sja1000/Makefile
+++ b/drivers/net/can/sja1000/Makefile
@@ -13,3 +13,4 @@ obj-$(CONFIG_CAN_PEAK_PCMCIA) += peak_pcmcia.o
 obj-$(CONFIG_CAN_PEAK_PCI) += peak_pci.o
 obj-$(CONFIG_CAN_PLX_PCI) += plx_pci.o
 obj-$(CONFIG_CAN_TSCAN1) += tscan1.o
+obj-$(CONFIG_CAN_F81601) += f81601.o
diff --git a/drivers/net/can/sja1000/f81601.c b/drivers/net/can/sja1000/f81601.c
new file mode 100644
index 000000000000..3d0436efead9
--- /dev/null
+++ b/drivers/net/can/sja1000/f81601.c
@@ -0,0 +1,213 @@
+// SPDX-License-Identifier: GPL-2.0
+/* Fintek F81601 PCIE to 2 CAN controller driver
+ *
+ * Copyright (C) 2019 Peter Hong <peter_hong@fintek.com.tw>
+ * Copyright (C) 2019 Linux Foundation
+ */
+
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/interrupt.h>
+#include <linux/netdevice.h>
+#include <linux/delay.h>
+#include <linux/slab.h>
+#include <linux/pci.h>
+#include <linux/can/dev.h>
+#include <linux/io.h>
+#include <linux/version.h>
+
+#include "sja1000.h"
+
+#define F81601_PCI_MAX_CHAN		2
+
+#define F81601_DECODE_REG		0x209
+#define F81601_IO_MODE			BIT(7)
+#define F81601_MEM_MODE			BIT(6)
+#define F81601_CFG_MODE			BIT(5)
+#define F81601_CAN2_INTERNAL_CLK	BIT(3)
+#define F81601_CAN1_INTERNAL_CLK	BIT(2)
+#define F81601_CAN2_EN			BIT(1)
+#define F81601_CAN1_EN			BIT(0)
+
+#define F81601_TRAP_REG			0x20a
+#define F81601_CAN2_HAS_EN		BIT(4)
+
+struct f81601_pci_card {
+	void __iomem *addr;
+	spinlock_t lock;	/* use this spin lock only for write access */
+	struct pci_dev *dev;
+	struct net_device *net_dev[F81601_PCI_MAX_CHAN];
+};
+
+static const struct pci_device_id f81601_pci_tbl[] = {
+	{ PCI_DEVICE(0x1c29, 0x1703) },
+	{},
+};
+
+MODULE_DEVICE_TABLE(pci, f81601_pci_tbl);
+
+static bool internal_clk = true;
+module_param(internal_clk, bool, 0444);
+MODULE_PARM_DESC(internal_clk, "Use internal clock, default true (24MHz)");
+
+static unsigned int external_clk;
+module_param(external_clk, uint, 0444);
+MODULE_PARM_DESC(external_clk, "External clock when internal_clk disabled");
+
+static u8 f81601_pci_read_reg(const struct sja1000_priv *priv, int port)
+{
+	return readb(priv->reg_base + port);
+}
+
+static void f81601_pci_write_reg(const struct sja1000_priv *priv, int port,
+				 u8 val)
+{
+	struct f81601_pci_card *card = priv->priv;
+	unsigned long flags;
+
+	spin_lock_irqsave(&card->lock, flags);
+	writeb(val, priv->reg_base + port);
+	readb(priv->reg_base);
+	spin_unlock_irqrestore(&card->lock, flags);
+}
+
+static void f81601_pci_del_card(struct pci_dev *pdev)
+{
+	struct f81601_pci_card *card = pci_get_drvdata(pdev);
+	struct net_device *dev;
+	int i = 0;
+
+	for (i = 0; i < ARRAY_SIZE(card->net_dev); i++) {
+		dev = card->net_dev[i];
+		if (!dev)
+			continue;
+
+		dev_info(&pdev->dev, "%s: Removing %s\n", __func__, dev->name);
+
+		unregister_sja1000dev(dev);
+		free_sja1000dev(dev);
+	}
+}
+
+/* Probe F81601 based device for the SJA1000 chips and register each
+ * available CAN channel to SJA1000 Socket-CAN subsystem.
+ */
+static int f81601_pci_add_card(struct pci_dev *pdev,
+			       const struct pci_device_id *ent)
+{
+	struct sja1000_priv *priv;
+	struct net_device *dev;
+	struct f81601_pci_card *card;
+	int err, i, count;
+	u8 tmp;
+
+	if (pcim_enable_device(pdev) < 0) {
+		dev_err(&pdev->dev, "Failed to enable PCI device\n");
+		return -ENODEV;
+	}
+
+	dev_info(&pdev->dev, "Detected card at slot #%i\n",
+		 PCI_SLOT(pdev->devfn));
+
+	card = devm_kzalloc(&pdev->dev, sizeof(*card), GFP_KERNEL);
+	if (!card)
+		return -ENOMEM;
+
+	card->dev = pdev;
+	spin_lock_init(&card->lock);
+
+	pci_set_drvdata(pdev, card);
+
+	tmp = F81601_IO_MODE | F81601_MEM_MODE | F81601_CFG_MODE |
+		F81601_CAN2_EN | F81601_CAN1_EN;
+
+	if (internal_clk) {
+		tmp |= F81601_CAN2_INTERNAL_CLK | F81601_CAN1_INTERNAL_CLK;
+
+		dev_info(&pdev->dev,
+			 "F81601 running with internal clock: 24Mhz\n");
+	} else {
+		dev_info(&pdev->dev,
+			 "F81601 running with external clock: %dMhz\n",
+			 external_clk / 1000000);
+	}
+
+	pci_write_config_byte(pdev, F81601_DECODE_REG, tmp);
+
+	card->addr = pcim_iomap(pdev, 0, pci_resource_len(pdev, 0));
+
+	if (!card->addr) {
+		err = -ENOMEM;
+		dev_err(&pdev->dev, "%s: Failed to remap BAR\n", __func__);
+		goto failure_cleanup;
+	}
+
+	/* read CAN2_HW_EN strap pin to detect how many CANBUS do we have */
+	count = ARRAY_SIZE(card->net_dev);
+	pci_read_config_byte(pdev, F81601_TRAP_REG, &tmp);
+	if (!(tmp & F81601_CAN2_HAS_EN))
+		count = 1;
+
+	/* Detect available channels */
+	for (i = 0; i < count; i++) {
+		dev = alloc_sja1000dev(0);
+		if (!dev) {
+			err = -ENOMEM;
+			goto failure_cleanup;
+		}
+
+		priv = netdev_priv(dev);
+		priv->priv = card;
+		priv->irq_flags = IRQF_SHARED;
+		priv->reg_base = card->addr + 0x80 * i;
+		priv->read_reg = f81601_pci_read_reg;
+		priv->write_reg = f81601_pci_write_reg;
+
+		if (internal_clk)
+			priv->can.clock.freq = 24000000 / 2;
+		else
+			priv->can.clock.freq = external_clk / 2;
+
+		priv->ocr = OCR_TX0_PUSHPULL | OCR_TX1_PUSHPULL;
+		priv->cdr = CDR_CBP;
+
+		SET_NETDEV_DEV(dev, &pdev->dev);
+		dev->dev_id = i;
+		dev->irq = pdev->irq;
+
+		/* Register SJA1000 device */
+		err = register_sja1000dev(dev);
+		if (err) {
+			dev_err(&pdev->dev,
+				"%s: Registering device failed: %x\n", __func__,
+				err);
+			free_sja1000dev(dev);
+			goto failure_cleanup;
+		}
+
+		card->net_dev[i] = dev;
+		dev_info(&pdev->dev, "Channel #%d, %s at 0x%p, irq %d\n", i,
+			 dev->name, priv->reg_base, dev->irq);
+	}
+
+	return 0;
+
+failure_cleanup:
+	dev_err(&pdev->dev, "%s: failed: %d. Cleaning Up.\n", __func__, err);
+	f81601_pci_del_card(pdev);
+
+	return err;
+}
+
+static struct pci_driver f81601_pci_driver = {
+	.name =		"f81601",
+	.id_table =	f81601_pci_tbl,
+	.probe =	f81601_pci_add_card,
+	.remove =	f81601_pci_del_card,
+};
+
+MODULE_DESCRIPTION("Fintek F81601 PCIE to 2 CANBUS adaptor driver");
+MODULE_AUTHOR("Peter Hong <peter_hong@fintek.com.tw>");
+MODULE_LICENSE("GPL v2");
+
+module_pci_driver(f81601_pci_driver);
-- 
2.7.4


^ permalink raw reply related

* Re: [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: René van Dorst @ 2019-07-23  8:58 UTC (permalink / raw)
  To: Matthew Wilcox (Oracle); +Cc: kbuild-all, netdev, davem
In-Reply-To: <201907231400.Q5QaKepi%lkp@intel.com>

Hi Matthew,

I see the same issue for the mediatek/mtk_eth_soc driver.


Build error for mips.
In file included from ./include/linux/cache.h:5:0,
                  from ./arch/mips/include/asm/cpu-info.h:15,
                  from ./arch/mips/include/asm/cpu-features.h:13,
                  from ./arch/mips/include/asm/bitops.h:21,
                  from ./include/linux/bitops.h:19,
                  from ./include/linux/kernel.h:12,
                  from ./include/linux/list.h:9,
                  from ./include/linux/kobject.h:19,
                  from ./include/linux/device.h:16,
                  from ./include/linux/node.h:18,
                  from ./include/linux/cpu.h:17,
                  from ./include/linux/of_device.h:5,
                  from drivers/net/ethernet/mediatek/mtk_eth_soc.c:9:
drivers/net/ethernet/mediatek/mtk_eth_soc.c: In function 'mtk_cal_txd_req':
drivers/net/ethernet/mediatek/mtk_eth_soc.c:969:31: error: 'skb_frag_t  
{aka struct bio_vec}' has no member named 'size'
     nfrags += DIV_ROUND_UP(frag->size, MTK_TX_DMA_BUF_LEN);
                                ^
./include/uapi/linux/kernel.h:13:40: note: in definition of macro  
'__KERNEL_DIV_ROUND_UP'
  #define __KERNEL_DIV_ROUND_UP(n, d) (((n) + (d) - 1) / (d))
                                         ^
drivers/net/ethernet/mediatek/mtk_eth_soc.c:969:14: note: in expansion  
of macro 'DIV_ROUND_UP'
     nfrags += DIV_ROUND_UP(frag->size, MTK_TX_DMA_BUF_LEN);
               ^~~~~~~~~~~~
make[4]: *** [scripts/Makefile.build:274:  
drivers/net/ethernet/mediatek/mtk_eth_soc.o] Error 1
make[3]: *** [scripts/Makefile.build:490:  
drivers/net/ethernet/mediatek] Error 2
make[2]: *** [scripts/Makefile.build:490: drivers/net/ethernet] Error 2
make[1]: *** [scripts/Makefile.build:490: drivers/net] Error 2

Greats,

René


Quoting kbuild test robot <lkp@intel.com>:
> 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




^ permalink raw reply

* Re: [PATCH net-next v2 3/3] netlink: add validation of NLA_F_NESTED flag
From: Thomas Haller @ 2019-07-23  8:57 UTC (permalink / raw)
  To: Michal Kubecek, David S. Miller
  Cc: netdev, Johannes Berg, David Ahern, linux-kernel
In-Reply-To: <6b6ead21c5d8436470b82ab40355f6bd7dbbf14b.1556806084.git.mkubecek@suse.cz>

[-- Attachment #1: Type: text/plain, Size: 1628 bytes --]

On Thu, 2019-05-02 at 16:15 +0200, Michal Kubecek wrote:
> Add new validation flag NL_VALIDATE_NESTED which adds three
> consistency
> checks of NLA_F_NESTED_FLAG:
> 
>   - the flag is set on attributes with NLA_NESTED{,_ARRAY} policy
>   - the flag is not set on attributes with other policies except
> NLA_UNSPEC
>   - the flag is set on attribute passed to nla_parse_nested()
> 
> Signed-off-by: Michal Kubecek <mkubecek@suse.cz>
> 
> v2: change error messages to mention NLA_F_NESTED explicitly
> ---
>  include/net/netlink.h | 11 ++++++++++-
>  lib/nlattr.c          | 15 +++++++++++++++
>  2 files changed, 25 insertions(+), 1 deletion(-)

Hi,


libnl3 does currently not ever set NLA_F_NESTED flag.

That means, nla_nest_start() will not work as it used to.
https://github.com/thom311/libnl/blob/65b3dd5ac2d5de4c7a0c64e430596d9d27973527/lib/attr.c#L902

As workaround, one could call

  nla_nest_start(msg, NLA_F_NESTED | attr);


Of course, that is a bug in libnl3 that should be fixed. But it seems
quite unfortunate to me.


Does this flag and strict validation really provide any value? Commonly a netlink message
is a plain TLV blob, and the meaning depends entirely on the policy.

What I mean is that for example

  NLA_PUT_U32 (msg, ATTR_IFINDEX, (uint32_t) ifindex)
  NLA_PUT_STRING (msg, ATTR_IFNAME, "net")

results in a 4 bytes payload that does not encode whether the data is a number or
a string.

Why is it valuable in this case to encode additional type information inside the message,
when it's commonly not done and also not necessary?


best,
Thomas

[-- Attachment #2: This is a digitally signed message part --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

^ permalink raw reply

* [PATCH] ptp: ptp_dte: remove redundant dev_err message
From: Ding Xiang @ 2019-07-23  8:54 UTC (permalink / raw)
  To: richardcochran; +Cc: netdev, linux-kernel

devm_ioremap_resource already contains error message, so remove
the redundant dev_err message

Signed-off-by: Ding Xiang <dingxiang@cmss.chinamobile.com>
---
 drivers/ptp/ptp_dte.c | 5 +----
 1 file changed, 1 insertion(+), 4 deletions(-)

diff --git a/drivers/ptp/ptp_dte.c b/drivers/ptp/ptp_dte.c
index 5b6393e..0dcfdc8 100644
--- a/drivers/ptp/ptp_dte.c
+++ b/drivers/ptp/ptp_dte.c
@@ -248,11 +248,8 @@ static int ptp_dte_probe(struct platform_device *pdev)
 
 	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
 	ptp_dte->regs = devm_ioremap_resource(dev, res);
-	if (IS_ERR(ptp_dte->regs)) {
-		dev_err(dev,
-			"%s: io remap failed\n", __func__);
+	if (IS_ERR(ptp_dte->regs))
 		return PTR_ERR(ptp_dte->regs);
-	}
 
 	spin_lock_init(&ptp_dte->lock);
 
-- 
1.9.1




^ permalink raw reply related

* Re: KASAN: use-after-free Read in nr_rx_frame (2)
From: Dmitry Vyukov @ 2019-07-23  8:53 UTC (permalink / raw)
  To: Ralf Baechle, David Miller, linux-hams, netdev, Cong Wang
  Cc: LKML, syzkaller-bugs, syzbot
In-Reply-To: <000000000000e42667058e554371@google.com>

On Tue, Jul 23, 2019 at 10:49 AM syzbot
<syzbot+701728447042217b67c1@syzkaller.appspotmail.com> wrote:
>
> Hello,
>
> syzbot found the following crash on:
>
> HEAD commit:    3bfe1fc4 Merge tag 'for-5.3/dm-changes-2' of git://git.ker..
> git tree:       upstream
> console output: https://syzkaller.appspot.com/x/log.txt?x=10413e34600000
> kernel config:  https://syzkaller.appspot.com/x/.config?x=21511d77e11db3cb
> dashboard link: https://syzkaller.appspot.com/bug?extid=701728447042217b67c1
> compiler:       clang version 9.0.0 (/home/glider/llvm/clang
> 80fee25776c2fb61e74c1ecb1a523375c2500b69)
>
> Unfortunately, I don't have any reproducer for this crash yet.

+net/netrom/af_netrom.c maintainers


> IMPORTANT: if you fix the bug, please add the following tag to the commit:
> Reported-by: syzbot+701728447042217b67c1@syzkaller.appspotmail.com
>
> ==================================================================
> BUG: KASAN: use-after-free in atomic_read
> /./include/asm-generic/atomic-instrumented.h:26 [inline]
> BUG: KASAN: use-after-free in refcount_inc_not_zero_checked+0x7c/0x280
> /lib/refcount.c:123
> Read of size 4 at addr ffff88808ee52080 by task swapper/1/0
>
> CPU: 1 PID: 0 Comm: swapper/1 Not tainted 5.2.0+ #35
> Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS
> Google 01/01/2011
> Call Trace:
>   <IRQ>
>   __dump_stack /lib/dump_stack.c:77 [inline]
>   dump_stack+0x1d8/0x2f8 /lib/dump_stack.c:113
>   print_address_description+0x75/0x5b0 /mm/kasan/report.c:351
>   __kasan_report+0x14b/0x1c0 /mm/kasan/report.c:482
>   kasan_report+0x26/0x50 /mm/kasan/common.c:612
>   check_memory_region_inline /mm/kasan/generic.c:182 [inline]
>   check_memory_region+0x2cf/0x2e0 /mm/kasan/generic.c:192
>   __kasan_check_read+0x11/0x20 /mm/kasan/common.c:92
>   atomic_read /./include/asm-generic/atomic-instrumented.h:26 [inline]
>   refcount_inc_not_zero_checked+0x7c/0x280 /lib/refcount.c:123
>   refcount_inc_checked+0x15/0x50 /lib/refcount.c:156
>   sock_hold /./include/net/sock.h:649 [inline]
>   sk_add_node /./include/net/sock.h:701 [inline]
>   nr_insert_socket /net/netrom/af_netrom.c:137 [inline]
>   nr_rx_frame+0x17bc/0x1e40 /net/netrom/af_netrom.c:1023
>   nr_loopback_timer+0x6a/0x140 /net/netrom/nr_loopback.c:59
>   call_timer_fn+0xec/0x200 /kernel/time/timer.c:1322
>   expire_timers /kernel/time/timer.c:1366 [inline]
>   __run_timers+0x7cd/0x9c0 /kernel/time/timer.c:1685
>   run_timer_softirq+0x4a/0x90 /kernel/time/timer.c:1698
>   __do_softirq+0x333/0x7c4 /./arch/x86/include/asm/paravirt.h:777
>   invoke_softirq /kernel/softirq.c:373 [inline]
>   irq_exit+0x227/0x230 /kernel/softirq.c:413
>   exiting_irq /./arch/x86/include/asm/apic.h:537 [inline]
>   smp_apic_timer_interrupt+0x113/0x280 /arch/x86/kernel/apic/apic.c:1095
>   apic_timer_interrupt+0xf/0x20 /arch/x86/entry/entry_64.S:828
>   </IRQ>
> RIP: 0010:native_safe_halt+0xe/0x10 /./arch/x86/include/asm/irqflags.h:61
> Code: 06 fa eb ae 89 d9 80 e1 07 80 c1 03 38 c1 7c ba 48 89 df e8 c4 41 06
> fa eb b0 90 90 e9 07 00 00 00 0f 00 2d 76 67 56 00 fb f4 <c3> 90 e9 07 00
> 00 00 0f 00 2d 66 67 56 00 f4 c3 90 90 55 48 89 e5
> RSP: 0018:ffff8880a98cfd38 EFLAGS: 00000286 ORIG_RAX: ffffffffffffff13
> RAX: 1ffffffff11950db RBX: ffff8880a98bc340 RCX: dffffc0000000000
> RDX: 0000000000000000 RSI: ffffffff812d193a RDI: ffff8880a98bcb78
> RBP: ffff8880a98cfd40 R08: ffff8880a98bcb90 R09: ffffed1015317869
> R10: ffffed1015317869 R11: 0000000000000000 R12: 0000000000000001
> R13: 1ffff11015317868 R14: dffffc0000000000 R15: dffffc0000000000
>   arch_cpu_idle+0xa/0x10 /arch/x86/kernel/process.c:571
>   default_idle_call+0x59/0xa0 /kernel/sched/idle.c:94
>   cpuidle_idle_call /kernel/sched/idle.c:154 [inline]
>   do_idle+0x180/0x780 /kernel/sched/idle.c:263
>   cpu_startup_entry+0x25/0x30 /kernel/sched/idle.c:354
>   start_secondary+0x3f4/0x490 /arch/x86/kernel/smpboot.c:264
>   secondary_startup_64+0xa4/0xb0 /arch/x86/kernel/head_64.S:243
>
> Allocated by task 0:
>   save_stack /mm/kasan/common.c:69 [inline]
>   set_track /mm/kasan/common.c:77 [inline]
>   __kasan_kmalloc+0x11c/0x1b0 /mm/kasan/common.c:487
>   kasan_kmalloc+0x9/0x10 /mm/kasan/common.c:501
>   __do_kmalloc /mm/slab.c:3655 [inline]
>   __kmalloc+0x254/0x340 /mm/slab.c:3664
>   kmalloc /./include/linux/slab.h:557 [inline]
>   sk_prot_alloc+0xb0/0x290 /net/core/sock.c:1603
>   sk_alloc+0x38/0x950 /net/core/sock.c:1657
>   nr_make_new /net/netrom/af_netrom.c:476 [inline]
>   nr_rx_frame+0xabc/0x1e40 /net/netrom/af_netrom.c:959
>   nr_loopback_timer+0x6a/0x140 /net/netrom/nr_loopback.c:59
>   call_timer_fn+0xec/0x200 /kernel/time/timer.c:1322
>   expire_timers /kernel/time/timer.c:1366 [inline]
>   __run_timers+0x7cd/0x9c0 /kernel/time/timer.c:1685
>   run_timer_softirq+0x4a/0x90 /kernel/time/timer.c:1698
>   __do_softirq+0x333/0x7c4 /./arch/x86/include/asm/paravirt.h:777
>
> Freed by task 4044:
>   save_stack /mm/kasan/common.c:69 [inline]
>   set_track /mm/kasan/common.c:77 [inline]
>   __kasan_slab_free+0x12a/0x1e0 /mm/kasan/common.c:449
>   kasan_slab_free+0xe/0x10 /mm/kasan/common.c:457
>   __cache_free /mm/slab.c:3425 [inline]
>   kfree+0x115/0x200 /mm/slab.c:3756
>   sk_prot_free /net/core/sock.c:1640 [inline]
>   __sk_destruct+0x567/0x660 /net/core/sock.c:1726
>   sk_destruct /net/core/sock.c:1734 [inline]
>   __sk_free+0x317/0x3e0 /net/core/sock.c:1745
>   sk_free /net/core/sock.c:1756 [inline]
>   sock_put /./include/net/sock.h:1725 [inline]
>   sock_efree+0x60/0x80 /net/core/sock.c:2042
>   skb_release_head_state+0x100/0x220 /net/core/skbuff.c:652
>   skb_release_all /net/core/skbuff.c:663 [inline]
>   __kfree_skb+0x25/0x170 /net/core/skbuff.c:679
>   kfree_skb+0x6f/0xb0 /net/core/skbuff.c:697
>   nr_accept+0x4ef/0x650 /net/netrom/af_netrom.c:819
>   __sys_accept4+0x5bc/0x9a0 /net/socket.c:1750
>   __do_sys_accept /net/socket.c:1791 [inline]
>   __se_sys_accept /net/socket.c:1788 [inline]
>   __x64_sys_accept+0x7d/0x90 /net/socket.c:1788
>   do_syscall_64+0xfe/0x140 /arch/x86/entry/common.c:296
>   entry_SYSCALL_64_after_hwframe+0x49/0xbe
>
> The buggy address belongs to the object at ffff88808ee52000
>   which belongs to the cache kmalloc-2k of size 2048
> The buggy address is located 128 bytes inside of
>   2048-byte region [ffff88808ee52000, ffff88808ee52800)
> The buggy address belongs to the page:
> page:ffffea00023b9480 refcount:1 mapcount:0 mapping:ffff8880aa400e00
> index:0xffff88808ee53100 compound_mapcount: 0
> flags: 0x1fffc0000010200(slab|head)
> raw: 01fffc0000010200 ffffea0001732108 ffffea00025f5588 ffff8880aa400e00
> raw: ffff88808ee53100 ffff88808ee52000 0000000100000002 0000000000000000
> page dumped because: kasan: bad access detected
>
> Memory state around the buggy address:
>   ffff88808ee51f80: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc
>   ffff88808ee52000: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
> > ffff88808ee52080: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
>                     ^
>   ffff88808ee52100: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
>   ffff88808ee52180: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
> ==================================================================
>
>
> ---
> 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.
>
> --
> You received this message because you are subscribed to the Google Groups "syzkaller-bugs" group.
> To unsubscribe from this group and stop receiving emails from it, send an email to syzkaller-bugs+unsubscribe@googlegroups.com.
> To view this discussion on the web visit https://groups.google.com/d/msgid/syzkaller-bugs/000000000000e42667058e554371%40google.com.

^ permalink raw reply

* Re: INFO: rcu detected stall in ext4_write_checks
From: Dmitry Vyukov @ 2019-07-23  8:51 UTC (permalink / raw)
  To: Peter Zijlstra
  Cc: Paul E. McKenney, Theodore Ts'o, syzbot, Andreas Dilger,
	David Miller, eladr, Ido Schimmel, Jiri Pirko, John Stultz,
	linux-ext4, LKML, netdev, syzkaller-bugs, Thomas Gleixner,
	Ingo Molnar
In-Reply-To: <CACT4Y+bGgyZWbRQ7QNCHRLU0Zq2+cONSbyaycfzwvToqMwiwBQ@mail.gmail.com>

On Mon, Jul 22, 2019 at 12:03 PM Dmitry Vyukov <dvyukov@google.com> wrote:
>
> On Mon, Jul 15, 2019 at 3:46 PM Peter Zijlstra <peterz@infradead.org> wrote:
> >
> > On Mon, Jul 15, 2019 at 03:33:11PM +0200, Dmitry Vyukov wrote:
> > > On Mon, Jul 15, 2019 at 3:29 PM Peter Zijlstra <peterz@infradead.org> wrote:
> > > >
> > > > On Sun, Jul 14, 2019 at 11:49:15AM -0700, Paul E. McKenney wrote:
> > > > > On Sun, Jul 14, 2019 at 05:48:00PM +0300, Dmitry Vyukov wrote:
> > > > > > But short term I don't see any other solution than stop testing
> > > > > > sched_setattr because it does not check arguments enough to prevent
> > > > > > system misbehavior. Which is a pity because syzkaller has found some
> > > > > > bad misconfigurations that were oversight on checking side.
> > > > > > Any other suggestions?
> > > > >
> > > > > Keep the times down to a few seconds?  Of course, that might also
> > > > > fail to find interesting bugs.
> > > >
> > > > Right, if syzcaller can put a limit on the period/deadline parameters
> > > > (and make sure to not write "-1" to
> > > > /proc/sys/kernel/sched_rt_runtime_us) then per the in-kernel
> > > > access-control should not allow these things to happen.
> > >
> > > Since we are racing with emails, could you suggest a 100% safe
> > > parameters? Because I only hear people saying "safe", "sane",
> > > "well-behaving" :)
> > > If we move the check to user-space, it does not mean that we can get
> > > away without actually defining what that means.
> >
> > Right, well, that's part of the problem. I think Paul just did the
> > reverse math and figured that 95% of X must not be larger than my
> > watchdog timeout and landed on 14 seconds.
> >
> > I'm thinking 4 seconds (or rather 4.294967296) would be a very nice
> > number.
> >
> > > Now thinking of this, if we come up with some simple criteria, could
> > > we have something like a sysctl that would allow only really "safe"
> > > parameters?
> >
> > I suppose we could do that, something like:
> > sysctl_deadline_period_{min,max}. I'll have to dig back a bit on where
> > we last talked about that and what the problems where.
> >
> > For one, setting the min is a lot harder, but I suppose we can start at
> > TICK_NSEC or something.
>
>
> Now syzkaller will drop CAP_SYS_NICE for the test process:
> https://github.com/google/syzkaller/commit/f3ad68446455acbe562e0057931e6256b8b991e8
> I will close this bug report as invalid once the change reaches all
> syzbot instances, if nobody plans any other on this bug.

#syz invalid

^ permalink raw reply

* Re: [PATCH bpf-next] libbpf: provide more helpful message on uninitialized global var
From: Song Liu @ 2019-07-23  8:51 UTC (permalink / raw)
  To: Andrii Nakryiko
  Cc: bpf@vger.kernel.org, netdev@vger.kernel.org, Alexei Starovoitov,
	daniel@iogearbox.net, andrii.nakryiko@gmail.com, Kernel Team
In-Reply-To: <20190723042329.3121956-1-andriin@fb.com>



> On Jul 22, 2019, at 9:23 PM, Andrii Nakryiko <andriin@fb.com> wrote:
> 
> When BPF program defines uninitialized global variable, it's put into
> a special COMMON section. Libbpf will reject such programs, but will
> provide very unhelpful message with garbage-looking section index.
> 
> This patch detects special section cases and gives more explicit error
> message.
> 
> Signed-off-by: Andrii Nakryiko <andriin@fb.com>
> ---
> tools/lib/bpf/libbpf.c | 14 +++++++++++---
> 1 file changed, 11 insertions(+), 3 deletions(-)
> 
> diff --git a/tools/lib/bpf/libbpf.c b/tools/lib/bpf/libbpf.c
> index 794dd5064ae8..5f9e7eedb134 100644
> --- a/tools/lib/bpf/libbpf.c
> +++ b/tools/lib/bpf/libbpf.c
> @@ -1760,15 +1760,23 @@ bpf_program__collect_reloc(struct bpf_program *prog, GElf_Shdr *shdr,
> 			 (long long) sym.st_value, sym.st_name, name);
> 
> 		shdr_idx = sym.st_shndx;
> +		insn_idx = rel.r_offset / sizeof(struct bpf_insn);
> +		pr_debug("relocation: insn_idx=%u, shdr_idx=%u\n",
> +			 insn_idx, shdr_idx);
> +
> +		if (shdr_idx >= SHN_LORESERVE) {
> +			pr_warning("relocation: not yet supported relo for non-static global \'%s\' variable "
> +				   "in special section (0x%x) found in insns[%d].code 0x%x\n",

For easy grep, we should keep this one long long string. 

Thanks,
Song

^ permalink raw reply

* Re: [PATCH 2/3] serial: remove netx serial driver
From: Arnd Bergmann @ 2019-07-23  8:43 UTC (permalink / raw)
  To: Linus Walleij
  Cc: Greg Kroah-Hartman, netdev, linux-serial, Thomas Gleixner,
	David S. Miller, Sascha Hauer, Michael Trensch, Robert Schwebel,
	Jiri Slaby, linux-kernel@vger.kernel.org
In-Reply-To: <CACRpkdbm5MpcNdm8EGTR=U8MpK2VPzEg=Us0-AxZzOZ=vVJSmQ@mail.gmail.com>

On Tue, Jul 23, 2019 at 10:26 AM Linus Walleij <linus.walleij@linaro.org> wrote:
>
> On Mon, Jul 22, 2019 at 9:16 PM Arnd Bergmann <arnd@arndb.de> wrote:
>
> > The netx platform got removed, so this driver is now
> > useless.
> >
> > Signed-off-by: Arnd Bergmann <arnd@arndb.de>
>
> We seem so overlap :)
> https://marc.info/?l=linux-serial&m=156377843325488&w=2
>
> Anyways, the patches are identical except here:
>
> > -/* Hilscher netx */
> > +/* Hilscher netx (removed) */
> >  #define PORT_NETX      71
>
> Is there some reason for keeping the magical number around?
> When I looked over the file there seemed to be more "holes"
> in the list.

I looked at the same list and though I saw more obsolete entries
than holes. The last ones that I saw getting removed were
PORT_MFD in 2017 and PORT_V850E_UART in 2008.

It probably doesn't matter as we have precedence for both.

       Arnd

^ permalink raw reply

* Re: [PATCH 2/3] serial: remove netx serial driver
From: Linus Walleij @ 2019-07-23  8:26 UTC (permalink / raw)
  To: Arnd Bergmann
  Cc: Greg Kroah-Hartman, netdev, linux-serial, Thomas Gleixner,
	David S. Miller, Sascha Hauer, Michael Trensch, Robert Schwebel,
	Jiri Slaby, linux-kernel@vger.kernel.org
In-Reply-To: <20190722191552.252805-2-arnd@arndb.de>

On Mon, Jul 22, 2019 at 9:16 PM Arnd Bergmann <arnd@arndb.de> wrote:

> The netx platform got removed, so this driver is now
> useless.
>
> Signed-off-by: Arnd Bergmann <arnd@arndb.de>

We seem so overlap :)
https://marc.info/?l=linux-serial&m=156377843325488&w=2

Anyways, the patches are identical except here:

> -/* Hilscher netx */
> +/* Hilscher netx (removed) */
>  #define PORT_NETX      71

Is there some reason for keeping the magical number around?
When I looked over the file there seemed to be more "holes"
in the list.

Yours,
Linus Walleij

^ permalink raw reply

* Re: ss: Checking efficient analysis for network connections
From: Markus Elfring @ 2019-07-23  8:25 UTC (permalink / raw)
  To: David Miller, David Ahern, Stephen Hemminger, netdev
  Cc: Josh Hunt, linux-kernel
In-Reply-To: <20190601.164838.1496580524715275443.davem@davemloft.net>

> This whole discussion has zero to do with what text format 'ss' outputs.

Do any more software developers care for the clarification of
additional data formats for the usage of specific information by tools
around socket statistics (from the directory “/proc/net” and related ones)?

Would you like to achieve any improvements in this area?

Regards,
Markus

^ permalink raw reply

* Re: [PATCH 1/3] [net-next] net: remove netx ethernet driver
From: Linus Walleij @ 2019-07-23  8:23 UTC (permalink / raw)
  To: Arnd Bergmann
  Cc: David S. Miller, netdev, linux-serial, Thomas Gleixner, Greg KH,
	Sascha Hauer, linux-kernel@vger.kernel.org
In-Reply-To: <20190722191304.164929-1-arnd@arndb.de>

On Mon, Jul 22, 2019 at 9:13 PM Arnd Bergmann <arnd@arndb.de> wrote:

> The ARM netx platform got removed in 5.3, so this driver
> is now useless.
>
> Signed-off-by: Arnd Bergmann <arnd@arndb.de>

Acked-by: Linus Walleij <linus.walleij@linaro.org>

I thought I sent a patch like this yesterday but it apparently
never left the mailserver as I can't find it in the archives.

Linus Walleij

^ permalink raw reply

* [PATCH net 1/2] selftests: forwarding: gre_multipath: Enable IPv4 forwarding
From: Ido Schimmel @ 2019-07-23  8:19 UTC (permalink / raw)
  To: netdev; +Cc: davem, ssuryaextr, mlxsw, Ido Schimmel
In-Reply-To: <20190723081926.30647-1-idosch@idosch.org>

From: Ido Schimmel <idosch@mellanox.com>

The test did not enable IPv4 forwarding during its setup phase, which
causes the test to fail on machines where IPv4 forwarding is disabled.

Fixes: 54818c4c4b93 ("selftests: forwarding: Test multipath tunneling")
Signed-off-by: Ido Schimmel <idosch@mellanox.com>
Reported-by: Stephen Suryaputra <ssuryaextr@gmail.com>
Tested-by: Stephen Suryaputra <ssuryaextr@gmail.com>
---
 tools/testing/selftests/net/forwarding/gre_multipath.sh | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/tools/testing/selftests/net/forwarding/gre_multipath.sh b/tools/testing/selftests/net/forwarding/gre_multipath.sh
index cca2baa03fb8..37d7297e1cf8 100755
--- a/tools/testing/selftests/net/forwarding/gre_multipath.sh
+++ b/tools/testing/selftests/net/forwarding/gre_multipath.sh
@@ -187,12 +187,16 @@ setup_prepare()
 	sw1_create
 	sw2_create
 	h2_create
+
+	forwarding_enable
 }
 
 cleanup()
 {
 	pre_cleanup
 
+	forwarding_restore
+
 	h2_destroy
 	sw2_destroy
 	sw1_destroy
-- 
2.21.0


^ permalink raw reply related


This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox