Netdev List
 help / color / mirror / Atom feed
* [PATCH 3/6] vhost: fix vhost map leak
From: Jason Wang @ 2019-07-23  7:57 UTC (permalink / raw)
  To: mst, jasowang; +Cc: kvm, virtualization, netdev, linux-kernel
In-Reply-To: <20190723075718.6275-1-jasowang@redhat.com>

We don't free map during vhost_map_unprefetch(). This means it could
be leaked. Fixing by free the map.

Reported-by: Michael S. Tsirkin <mst@redhat.com>
Fixes: 7f466032dc9e ("vhost: access vq metadata through kernel virtual address")
Signed-off-by: Jason Wang <jasowang@redhat.com>
---
 drivers/vhost/vhost.c | 4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)

diff --git a/drivers/vhost/vhost.c b/drivers/vhost/vhost.c
index 058191d5efad..03666b702498 100644
--- a/drivers/vhost/vhost.c
+++ b/drivers/vhost/vhost.c
@@ -303,9 +303,7 @@ static void vhost_vq_meta_reset(struct vhost_dev *d)
 static void vhost_map_unprefetch(struct vhost_map *map)
 {
 	kfree(map->pages);
-	map->pages = NULL;
-	map->npages = 0;
-	map->addr = NULL;
+	kfree(map);
 }
 
 static void vhost_uninit_vq_maps(struct vhost_virtqueue *vq)
-- 
2.18.1


^ permalink raw reply related

* [PATCH 1/6] vhost: don't set uaddr for invalid address
From: Jason Wang @ 2019-07-23  7:57 UTC (permalink / raw)
  To: mst, jasowang; +Cc: kvm, virtualization, netdev, linux-kernel
In-Reply-To: <20190723075718.6275-1-jasowang@redhat.com>

We should not setup uaddr for the invalid address, otherwise we may
try to pin or prefetch mapping of wrong pages.

Fixes: 7f466032dc9e ("vhost: access vq metadata through kernel virtual address")
Signed-off-by: Jason Wang <jasowang@redhat.com>
---
 drivers/vhost/vhost.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/drivers/vhost/vhost.c b/drivers/vhost/vhost.c
index dc9301d31f12..34c0d970bcbc 100644
--- a/drivers/vhost/vhost.c
+++ b/drivers/vhost/vhost.c
@@ -2083,7 +2083,8 @@ static long vhost_vring_set_num_addr(struct vhost_dev *d,
 	}
 
 #if VHOST_ARCH_CAN_ACCEL_UACCESS
-	vhost_setup_vq_uaddr(vq);
+	if (r == 0)
+		vhost_setup_vq_uaddr(vq);
 
 	if (d->mm)
 		mmu_notifier_register(&d->mmu_notifier, d->mm);
-- 
2.18.1


^ permalink raw reply related

* [PATCH 0/6] Fixes for meta data acceleration
From: Jason Wang @ 2019-07-23  7:57 UTC (permalink / raw)
  To: mst, jasowang; +Cc: kvm, virtualization, netdev, linux-kernel

Hi all:

This series try to fix several issues introduced by meta data
accelreation series. Please review.

Jason Wang (6):
  vhost: don't set uaddr for invalid address
  vhost: validate MMU notifier registration
  vhost: fix vhost map leak
  vhost: reset invalidate_count in vhost_set_vring_num_addr()
  vhost: mark dirty pages during map uninit
  vhost: don't do synchronize_rcu() in vhost_uninit_vq_maps()

 drivers/vhost/vhost.c | 56 +++++++++++++++++++++++++++++++------------
 drivers/vhost/vhost.h |  1 +
 2 files changed, 42 insertions(+), 15 deletions(-)

-- 
2.18.1


^ permalink raw reply

* Re: kernel panic: stack is corrupted in pointer
From: Dmitry Vyukov @ 2019-07-23  7:38 UTC (permalink / raw)
  To: syzbot, John Fastabend, bpf
  Cc: David Airlie, alexander.deucher, amd-gfx, Alexei Starovoitov,
	christian.koenig, Daniel Borkmann, david1.zhou, DRI, leo.liu,
	LKML, netdev, syzkaller-bugs
In-Reply-To: <0000000000001a51c4058ddcb1b6@google.com>

On Wed, Jul 17, 2019 at 10:58 AM syzbot
<syzbot+79f5f028005a77ecb6bb@syzkaller.appspotmail.com> wrote:
>
> Hello,
>
> syzbot found the following crash on:
>
> HEAD commit:    1438cde7 Add linux-next specific files for 20190716
> git tree:       linux-next
> console output: https://syzkaller.appspot.com/x/log.txt?x=13988058600000
> kernel config:  https://syzkaller.appspot.com/x/.config?x=3430a151e1452331
> dashboard link: https://syzkaller.appspot.com/bug?extid=79f5f028005a77ecb6bb
> compiler:       gcc (GCC) 9.0.0 20181231 (experimental)
> syz repro:      https://syzkaller.appspot.com/x/repro.syz?x=111fc8afa00000

From the repro it looks like the same bpf stack overflow bug. +John
We need to dup them onto some canonical report for this bug, or this
becomes unmanageable.

#syz dup: kernel panic: corrupted stack end in dput

> The bug was bisected to:
>
> commit 96a5d8d4915f3e241ebb48d5decdd110ab9c7dcf
> Author: Leo Liu <leo.liu@amd.com>
> Date:   Fri Jul 13 15:26:28 2018 +0000
>
>      drm/amdgpu: Make sure IB tests flushed after IP resume
>
> bisection log:  https://syzkaller.appspot.com/x/bisect.txt?x=14a46200600000
> final crash:    https://syzkaller.appspot.com/x/report.txt?x=16a46200600000
> console output: https://syzkaller.appspot.com/x/log.txt?x=12a46200600000
>
> IMPORTANT: if you fix the bug, please add the following tag to the commit:
> Reported-by: syzbot+79f5f028005a77ecb6bb@syzkaller.appspotmail.com
> Fixes: 96a5d8d4915f ("drm/amdgpu: Make sure IB tests flushed after IP
> resume")
>
> Kernel panic - not syncing: stack-protector: Kernel stack is corrupted in:
> pointer+0x702/0x750 lib/vsprintf.c:2187
> Shutting down cpus with NMI
> Kernel Offset: disabled
>
>
> ---
> This bug is generated by a bot. It may contain errors.
> See https://goo.gl/tpsmEJ for more information about syzbot.
> syzbot engineers can be reached at syzkaller@googlegroups.com.
>
> syzbot will keep track of this bug report. See:
> https://goo.gl/tpsmEJ#status for how to communicate with syzbot.
> For information about bisection process see: https://goo.gl/tpsmEJ#bisection
> syzbot can test patches for this bug, for details see:
> https://goo.gl/tpsmEJ#testing-patches

^ permalink raw reply

* Re: BUG: unable to handle kernel paging request in corrupted (2)
From: Dmitry Vyukov @ 2019-07-23  7:35 UTC (permalink / raw)
  To: syzbot
  Cc: dave.stevenson, David Miller, LKML, USB list, netdev,
	syzkaller-bugs, unglinuxdriver, woojung.huh, John Fastabend
In-Reply-To: <000000000000fcdf6c058e076819@google.com>

On Fri, Jul 19, 2019 at 1:56 PM syzbot
<syzbot+08b7a2c58acdfa12c82d@syzkaller.appspotmail.com> wrote:
>
> syzbot has bisected this bug to:
>
> commit 9343ac87f2a4e09bf6e27b5f31e72e9e3a82abff
> Author: Dave Stevenson <dave.stevenson@raspberrypi.org>
> Date:   Mon Jun 25 14:07:15 2018 +0000
>
>      net: lan78xx: Use s/w csum check on VLANs without tag stripping
>
> bisection log:  https://syzkaller.appspot.com/x/bisect.txt?x=102feb84600000
> start commit:   49d05fe2 ipv6: rt6_check should return NULL if 'from' is N..
> git tree:       net
> final crash:    https://syzkaller.appspot.com/x/report.txt?x=122feb84600000
> console output: https://syzkaller.appspot.com/x/log.txt?x=142feb84600000
> kernel config:  https://syzkaller.appspot.com/x/.config?x=87305c3ca9c25c70
> dashboard link: https://syzkaller.appspot.com/bug?extid=08b7a2c58acdfa12c82d
> syz repro:      https://syzkaller.appspot.com/x/repro.syz?x=143a78f4600000
>
> Reported-by: syzbot+08b7a2c58acdfa12c82d@syzkaller.appspotmail.com
> Fixes: 9343ac87f2a4 ("net: lan78xx: Use s/w csum check on VLANs without tag
> stripping")
>
> For information about bisection process see: https://goo.gl/tpsmEJ#bisection

From the repro it looks like the same bpf stack overflow bug. +John
We need to dup them onto some canonical report for this bug, or this
becomes unmanageable.

#syz dup: kernel panic: corrupted stack end in dput

^ permalink raw reply

* [PATCH net 2/2] lib/dim: Fix -Wunused-const-variable warnings
From: Leon Romanovsky @ 2019-07-23  7:22 UTC (permalink / raw)
  To: David S . Miller
  Cc: Leon Romanovsky, Doug Ledford, Jason Gunthorpe, RDMA mailing list,
	Tal Gilboa, Yamin Friedman, Saeed Mahameed, linux-netdev
In-Reply-To: <20190723072248.6844-1-leon@kernel.org>

From: Leon Romanovsky <leonro@mellanox.com>

DIM causes to the following warnings during kernel compilation
which indicates that tx_profile and rx_profile are supposed to
be declared in *.c and not in *.h files.

In file included from ./include/rdma/ib_verbs.h:64,
                 from ./include/linux/mlx5/device.h:37,
                 from ./include/linux/mlx5/driver.h:51,
                 from ./include/linux/mlx5/vport.h:36,
                 from drivers/infiniband/hw/mlx5/ib_virt.c:34:
./include/linux/dim.h:326:1: warning: _tx_profile_ defined but not used [-Wunused-const-variable=]
  326 | tx_profile[DIM_CQ_PERIOD_NUM_MODES][NET_DIM_PARAMS_NUM_PROFILES] = {
      | ^~~~~~~~~~
./include/linux/dim.h:320:1: warning: _rx_profile_ defined but not used [-Wunused-const-variable=]
  320 | rx_profile[DIM_CQ_PERIOD_NUM_MODES][NET_DIM_PARAMS_NUM_PROFILES] = {
      | ^~~~~~~~~~

Fixes: 4f75da3666c0 ("linux/dim: Move implementation to .c files")
Signed-off-by: Leon Romanovsky <leonro@mellanox.com>
---
 include/linux/dim.h | 56 ---------------------------------------------
 lib/dim/net_dim.c   | 56 +++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 56 insertions(+), 56 deletions(-)

diff --git a/include/linux/dim.h b/include/linux/dim.h
index d3a0fbfff2bb..9fa4b3f88c39 100644
--- a/include/linux/dim.h
+++ b/include/linux/dim.h
@@ -272,62 +272,6 @@ dim_update_sample_with_comps(u16 event_ctr, u64 packets, u64 bytes, u64 comps,

 /* Net DIM */

-/*
- * Net DIM profiles:
- *        There are different set of profiles for each CQ period mode.
- *        There are different set of profiles for RX/TX CQs.
- *        Each profile size must be of NET_DIM_PARAMS_NUM_PROFILES
- */
-#define NET_DIM_PARAMS_NUM_PROFILES 5
-#define NET_DIM_DEFAULT_RX_CQ_MODERATION_PKTS_FROM_EQE 256
-#define NET_DIM_DEFAULT_TX_CQ_MODERATION_PKTS_FROM_EQE 128
-#define NET_DIM_DEF_PROFILE_CQE 1
-#define NET_DIM_DEF_PROFILE_EQE 1
-
-#define NET_DIM_RX_EQE_PROFILES { \
-	{1,   NET_DIM_DEFAULT_RX_CQ_MODERATION_PKTS_FROM_EQE}, \
-	{8,   NET_DIM_DEFAULT_RX_CQ_MODERATION_PKTS_FROM_EQE}, \
-	{64,  NET_DIM_DEFAULT_RX_CQ_MODERATION_PKTS_FROM_EQE}, \
-	{128, NET_DIM_DEFAULT_RX_CQ_MODERATION_PKTS_FROM_EQE}, \
-	{256, NET_DIM_DEFAULT_RX_CQ_MODERATION_PKTS_FROM_EQE}, \
-}
-
-#define NET_DIM_RX_CQE_PROFILES { \
-	{2,  256},             \
-	{8,  128},             \
-	{16, 64},              \
-	{32, 64},              \
-	{64, 64}               \
-}
-
-#define NET_DIM_TX_EQE_PROFILES { \
-	{1,   NET_DIM_DEFAULT_TX_CQ_MODERATION_PKTS_FROM_EQE},  \
-	{8,   NET_DIM_DEFAULT_TX_CQ_MODERATION_PKTS_FROM_EQE},  \
-	{32,  NET_DIM_DEFAULT_TX_CQ_MODERATION_PKTS_FROM_EQE},  \
-	{64,  NET_DIM_DEFAULT_TX_CQ_MODERATION_PKTS_FROM_EQE},  \
-	{128, NET_DIM_DEFAULT_TX_CQ_MODERATION_PKTS_FROM_EQE}   \
-}
-
-#define NET_DIM_TX_CQE_PROFILES { \
-	{5,  128},  \
-	{8,  64},  \
-	{16, 32},  \
-	{32, 32},  \
-	{64, 32}   \
-}
-
-static const struct dim_cq_moder
-rx_profile[DIM_CQ_PERIOD_NUM_MODES][NET_DIM_PARAMS_NUM_PROFILES] = {
-	NET_DIM_RX_EQE_PROFILES,
-	NET_DIM_RX_CQE_PROFILES,
-};
-
-static const struct dim_cq_moder
-tx_profile[DIM_CQ_PERIOD_NUM_MODES][NET_DIM_PARAMS_NUM_PROFILES] = {
-	NET_DIM_TX_EQE_PROFILES,
-	NET_DIM_TX_CQE_PROFILES,
-};
-
 /**
  *	net_dim_get_rx_moderation - provide a CQ moderation object for the given RX profile
  *	@cq_period_mode: CQ period mode
diff --git a/lib/dim/net_dim.c b/lib/dim/net_dim.c
index 5bcc902c5388..a4db51c21266 100644
--- a/lib/dim/net_dim.c
+++ b/lib/dim/net_dim.c
@@ -5,6 +5,62 @@

 #include <linux/dim.h>

+/*
+ * Net DIM profiles:
+ *        There are different set of profiles for each CQ period mode.
+ *        There are different set of profiles for RX/TX CQs.
+ *        Each profile size must be of NET_DIM_PARAMS_NUM_PROFILES
+ */
+#define NET_DIM_PARAMS_NUM_PROFILES 5
+#define NET_DIM_DEFAULT_RX_CQ_MODERATION_PKTS_FROM_EQE 256
+#define NET_DIM_DEFAULT_TX_CQ_MODERATION_PKTS_FROM_EQE 128
+#define NET_DIM_DEF_PROFILE_CQE 1
+#define NET_DIM_DEF_PROFILE_EQE 1
+
+#define NET_DIM_RX_EQE_PROFILES { \
+	{1,   NET_DIM_DEFAULT_RX_CQ_MODERATION_PKTS_FROM_EQE}, \
+	{8,   NET_DIM_DEFAULT_RX_CQ_MODERATION_PKTS_FROM_EQE}, \
+	{64,  NET_DIM_DEFAULT_RX_CQ_MODERATION_PKTS_FROM_EQE}, \
+	{128, NET_DIM_DEFAULT_RX_CQ_MODERATION_PKTS_FROM_EQE}, \
+	{256, NET_DIM_DEFAULT_RX_CQ_MODERATION_PKTS_FROM_EQE}, \
+}
+
+#define NET_DIM_RX_CQE_PROFILES { \
+	{2,  256},             \
+	{8,  128},             \
+	{16, 64},              \
+	{32, 64},              \
+	{64, 64}               \
+}
+
+#define NET_DIM_TX_EQE_PROFILES { \
+	{1,   NET_DIM_DEFAULT_TX_CQ_MODERATION_PKTS_FROM_EQE},  \
+	{8,   NET_DIM_DEFAULT_TX_CQ_MODERATION_PKTS_FROM_EQE},  \
+	{32,  NET_DIM_DEFAULT_TX_CQ_MODERATION_PKTS_FROM_EQE},  \
+	{64,  NET_DIM_DEFAULT_TX_CQ_MODERATION_PKTS_FROM_EQE},  \
+	{128, NET_DIM_DEFAULT_TX_CQ_MODERATION_PKTS_FROM_EQE}   \
+}
+
+#define NET_DIM_TX_CQE_PROFILES { \
+	{5,  128},  \
+	{8,  64},  \
+	{16, 32},  \
+	{32, 32},  \
+	{64, 32}   \
+}
+
+static const struct dim_cq_moder
+rx_profile[DIM_CQ_PERIOD_NUM_MODES][NET_DIM_PARAMS_NUM_PROFILES] = {
+	NET_DIM_RX_EQE_PROFILES,
+	NET_DIM_RX_CQE_PROFILES,
+};
+
+static const struct dim_cq_moder
+tx_profile[DIM_CQ_PERIOD_NUM_MODES][NET_DIM_PARAMS_NUM_PROFILES] = {
+	NET_DIM_TX_EQE_PROFILES,
+	NET_DIM_TX_CQE_PROFILES,
+};
+
 struct dim_cq_moder
 net_dim_get_rx_moderation(u8 cq_period_mode, int ix)
 {
--
2.20.1


^ permalink raw reply related

* [PATCH net 1/2] linux/dim: Fix overflow in dim calculation
From: Leon Romanovsky @ 2019-07-23  7:22 UTC (permalink / raw)
  To: David S . Miller
  Cc: Leon Romanovsky, Doug Ledford, Jason Gunthorpe, RDMA mailing list,
	Tal Gilboa, Yamin Friedman, Saeed Mahameed, linux-netdev
In-Reply-To: <20190723072248.6844-1-leon@kernel.org>

From: Yamin Friedman <yaminf@mellanox.com>

While using net_dim, a dim_sample was used without ever initializing the
comps value. Added use of DIV_ROUND_DOWN_ULL() to prevent potential
overflow, it should not be a problem to save the final result in an int
because after the division by epms the value should not be larger than a
few thousand.

[ 1040.127124] UBSAN: Undefined behaviour in lib/dim/dim.c:78:23
[ 1040.130118] signed integer overflow:
[ 1040.131643] 134718714 * 100 cannot be represented in type 'int'

Fixes: 398c2b05bbee ("linux/dim: Add completions count to dim_sample")
Signed-off-by: Yamin Friedman <yaminf@mellanox.com>
Signed-off-by: Leon Romanovsky <leonro@mellanox.com>
---
 drivers/net/ethernet/broadcom/bcmsysport.c        | 2 +-
 drivers/net/ethernet/broadcom/bnxt/bnxt.c         | 2 +-
 drivers/net/ethernet/broadcom/genet/bcmgenet.c    | 2 +-
 drivers/net/ethernet/mellanox/mlx5/core/en_txrx.c | 4 ++--
 lib/dim/dim.c                                     | 4 ++--
 5 files changed, 7 insertions(+), 7 deletions(-)

diff --git a/drivers/net/ethernet/broadcom/bcmsysport.c b/drivers/net/ethernet/broadcom/bcmsysport.c
index b9c5cea8db16..9483553ce444 100644
--- a/drivers/net/ethernet/broadcom/bcmsysport.c
+++ b/drivers/net/ethernet/broadcom/bcmsysport.c
@@ -992,7 +992,7 @@ static int bcm_sysport_poll(struct napi_struct *napi, int budget)
 {
 	struct bcm_sysport_priv *priv =
 		container_of(napi, struct bcm_sysport_priv, napi);
-	struct dim_sample dim_sample;
+	struct dim_sample dim_sample = {};
 	unsigned int work_done = 0;

 	work_done = bcm_sysport_desc_rx(priv, budget);
diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
index 7134d2c3eb1c..7070349915bc 100644
--- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c
+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
@@ -2136,7 +2136,7 @@ static int bnxt_poll(struct napi_struct *napi, int budget)
 		}
 	}
 	if (bp->flags & BNXT_FLAG_DIM) {
-		struct dim_sample dim_sample;
+		struct dim_sample dim_sample = {};

 		dim_update_sample(cpr->event_ctr,
 				  cpr->rx_packets,
diff --git a/drivers/net/ethernet/broadcom/genet/bcmgenet.c b/drivers/net/ethernet/broadcom/genet/bcmgenet.c
index a2b57807453b..d3a0b614dbfa 100644
--- a/drivers/net/ethernet/broadcom/genet/bcmgenet.c
+++ b/drivers/net/ethernet/broadcom/genet/bcmgenet.c
@@ -1895,7 +1895,7 @@ static int bcmgenet_rx_poll(struct napi_struct *napi, int budget)
 {
 	struct bcmgenet_rx_ring *ring = container_of(napi,
 			struct bcmgenet_rx_ring, napi);
-	struct dim_sample dim_sample;
+	struct dim_sample dim_sample = {};
 	unsigned int work_done;

 	work_done = bcmgenet_desc_rx(ring, budget);
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_txrx.c b/drivers/net/ethernet/mellanox/mlx5/core/en_txrx.c
index c50b6f0769c8..49b06b256c92 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en_txrx.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en_txrx.c
@@ -49,7 +49,7 @@ static inline bool mlx5e_channel_no_affinity_change(struct mlx5e_channel *c)
 static void mlx5e_handle_tx_dim(struct mlx5e_txqsq *sq)
 {
 	struct mlx5e_sq_stats *stats = sq->stats;
-	struct dim_sample dim_sample;
+	struct dim_sample dim_sample = {};

 	if (unlikely(!test_bit(MLX5E_SQ_STATE_AM, &sq->state)))
 		return;
@@ -61,7 +61,7 @@ static void mlx5e_handle_tx_dim(struct mlx5e_txqsq *sq)
 static void mlx5e_handle_rx_dim(struct mlx5e_rq *rq)
 {
 	struct mlx5e_rq_stats *stats = rq->stats;
-	struct dim_sample dim_sample;
+	struct dim_sample dim_sample = {};

 	if (unlikely(!test_bit(MLX5E_RQ_STATE_AM, &rq->state)))
 		return;
diff --git a/lib/dim/dim.c b/lib/dim/dim.c
index 439d641ec796..38045d6d0538 100644
--- a/lib/dim/dim.c
+++ b/lib/dim/dim.c
@@ -74,8 +74,8 @@ void dim_calc_stats(struct dim_sample *start, struct dim_sample *end,
 					delta_us);
 	curr_stats->cpms = DIV_ROUND_UP(ncomps * USEC_PER_MSEC, delta_us);
 	if (curr_stats->epms != 0)
-		curr_stats->cpe_ratio =
-				(curr_stats->cpms * 100) / curr_stats->epms;
+		curr_stats->cpe_ratio = DIV_ROUND_DOWN_ULL(
+			curr_stats->cpms * 100, curr_stats->epms);
 	else
 		curr_stats->cpe_ratio = 0;

--
2.20.1


^ permalink raw reply related

* [PATCH net 0/2] DIM fixes for 5.3
From: Leon Romanovsky @ 2019-07-23  7:22 UTC (permalink / raw)
  To: David S . Miller
  Cc: Leon Romanovsky, Doug Ledford, Jason Gunthorpe, RDMA mailing list,
	Tal Gilboa, Yamin Friedman, Saeed Mahameed, linux-netdev

From: Leon Romanovsky <leonro@mellanox.com>

Hi,

Those two fixes for recently merged DIM patches, both exposed through
RDMa DIM usage.

Thanks

Leon Romanovsky (1):
  lib/dim: Fix -Wunused-const-variable warnings

Yamin Friedman (1):
  linux/dim: Fix overflow in dim calculation

 drivers/net/ethernet/broadcom/bcmsysport.c    |  2 +-
 drivers/net/ethernet/broadcom/bnxt/bnxt.c     |  2 +-
 .../net/ethernet/broadcom/genet/bcmgenet.c    |  2 +-
 .../net/ethernet/mellanox/mlx5/core/en_txrx.c |  4 +-
 include/linux/dim.h                           | 56 -------------------
 lib/dim/dim.c                                 |  4 +-
 lib/dim/net_dim.c                             | 56 +++++++++++++++++++
 7 files changed, 63 insertions(+), 63 deletions(-)

--
2.20.1


^ permalink raw reply

* [PATCH mlx5-next] net/mlx5: Fix modify_cq_in alignment
From: Leon Romanovsky @ 2019-07-23  7:12 UTC (permalink / raw)
  To: Doug Ledford, Jason Gunthorpe
  Cc: Edward Srouji, RDMA mailing list, Yishai Hadas, Saeed Mahameed,
	linux-netdev, Leon Romanovsky

From: Edward Srouji <edwards@mellanox.com>

Fix modify_cq_in alignment to match the device specification.
After this fix the 'cq_umem_valid' field will be in the right offset.

Cc: <stable@vger.kernel.org> # 4.19
Fixes: bd37197554eb ("net/mlx5: Update mlx5_ifc with DEVX UID bits")
Signed-off-by: Edward Srouji <edwards@mellanox.com>
Reviewed-by: Yishai Hadas <yishaih@mellanox.com>
Signed-off-by: Leon Romanovsky <leonro@mellanox.com>
---
 include/linux/mlx5/mlx5_ifc.h | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/include/linux/mlx5/mlx5_ifc.h b/include/linux/mlx5/mlx5_ifc.h
index b3d5752657d9..ec571fd7fcf8 100644
--- a/include/linux/mlx5/mlx5_ifc.h
+++ b/include/linux/mlx5/mlx5_ifc.h
@@ -5975,10 +5975,12 @@ struct mlx5_ifc_modify_cq_in_bits {

 	struct mlx5_ifc_cqc_bits cq_context;

-	u8         reserved_at_280[0x40];
+	u8         reserved_at_280[0x60];

 	u8         cq_umem_valid[0x1];
-	u8         reserved_at_2c1[0x5bf];
+	u8         reserved_at_2e1[0x1f];
+
+	u8         reserved_at_300[0x580];

 	u8         pas[0][0x40];
 };
--
2.20.1


^ permalink raw reply related

* Re: [RFC PATCH net-next 00/12] drop_monitor: Capture dropped packets and metadata
From: Ido Schimmel @ 2019-07-23  6:46 UTC (permalink / raw)
  To: Toke Høiland-Jørgensen
  Cc: netdev, davem, nhorman, dsahern, roopa, nikolay, jakub.kicinski,
	andy, f.fainelli, andrew, vivien.didelot, mlxsw, Ido Schimmel
In-Reply-To: <87imrt4zzg.fsf@toke.dk>

On Mon, Jul 22, 2019 at 09:43:15PM +0200, Toke Høiland-Jørgensen wrote:
> Is there a mechanism for the user to filter the packets before they are
> sent to userspace? A bpf filter would be the obvious choice I guess...

Hi Toke,

Yes, it's on my TODO list to write an eBPF program that only lets
"unique" packets to be enqueued on the netlink socket. Where "unique" is
defined as {5-tuple, PC}. The rest of the copies will be counted in an
eBPF map, which is just a hash table keyed by {5-tuple, PC}.

I think it would be good to have the program as part of the bcc
repository [1]. What do you think?

> For integrating with XDP the trick would be to find a way to do it that
> doesn't incur any overhead when it's not enabled. Are you envisioning
> that this would be enabled separately for the different "modes" (kernel,
> hardware, XDP, etc)?

Yes. Drop monitor have commands to enable and disable tracing, but they
don't carry any attributes at the moment. My plan is to add an attribute
(e.g., 'NET_DM_ATTR_DROP_TYPE') that will specify the type of drops
you're interested in - SW/HW/XDP. If the attribute is not specified,
then current behavior is maintained and all the drop types are traced.
But if you're only interested in SW drops, then overhead for the rest
should be zero.

For HW drops I'm going to have devlink call into drop monitor. The
function call will just be a NOP in case user is not interested in HW
drops. I'm not sure if for XDP you want to register a probe on a
tracepoint or call into drop monitor. If you want to use the former,
then you can just have drop monitor unregister its probe from the
tracepoint, which is what drop monitor is currently doing with the
kfree_skb() tracepoint.

Thanks!

[1] https://github.com/iovisor/bcc/tree/master/examples/networking

^ permalink raw reply

* net-next boot error: WARNING: workqueue cpumask: online intersect > possible intersect (2)
From: syzbot @ 2019-07-23  6:38 UTC (permalink / raw)
  To: linux-kernel, netdev, syzkaller-bugs

Hello,

syzbot found the following crash on:

HEAD commit:    7b5cf701 Merge branch 'sched-urgent-for-linus' of git://gi..
git tree:       net-next
console output: https://syzkaller.appspot.com/x/log.txt?x=145c4d34600000
kernel config:  https://syzkaller.appspot.com/x/.config?x=9aec8cb13b5f7389
dashboard link: https://syzkaller.appspot.com/bug?extid=3055cb4fd9eb553bd76c
compiler:       gcc (GCC) 9.0.0 20181231 (experimental)

Unfortunately, I don't have any reproducer for this crash yet.

IMPORTANT: if you fix the bug, please add the following tag to the commit:
Reported-by: syzbot+3055cb4fd9eb553bd76c@syzkaller.appspotmail.com

smpboot: CPU0: Intel(R) Xeon(R) CPU @ 2.30GHz (family: 0x6, model: 0x3f,  
stepping: 0x0)
Performance Events: unsupported p6 CPU model 63 no PMU driver, software  
events only.
rcu: Hierarchical SRCU implementation.
NMI watchdog: Perf NMI watchdog permanently disabled
smp: Bringing up secondary CPUs ...
x86: Booting SMP configuration:
.... node  #0, CPUs:      #1
MDS CPU bug present and SMT on, data leak possible. See  
https://www.kernel.org/doc/html/latest/admin-guide/hw-vuln/mds.html for  
more details.
smp: Brought up 2 nodes, 2 CPUs
smpboot: Max logical packages: 1
smpboot: Total of 2 processors activated (9200.00 BogoMIPS)
devtmpfs: initialized
clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns:  
19112604462750000 ns
futex hash table entries: 512 (order: 4, 65536 bytes, vmalloc)
xor: automatically using best checksumming function   avx
PM: RTC time: 20:26:57, date: 2019-07-22
NET: Registered protocol family 16
audit: initializing netlink subsys (disabled)
cpuidle: using governor menu
ACPI: bus type PCI registered
dca service started, version 1.12.1
PCI: Using configuration type 1 for base access
WARNING: workqueue cpumask: online intersect > possible intersect
HugeTLB registered 1.00 GiB page size, pre-allocated 0 pages
HugeTLB registered 2.00 MiB page size, pre-allocated 0 pages
cryptd: max_cpu_qlen set to 1000
raid6: avx2x4   gen() 10942 MB/s
raid6: avx2x4   xor()  6383 MB/s
raid6: avx2x2   gen()  6482 MB/s
raid6: avx2x2   xor()  3541 MB/s
raid6: avx2x1   gen()  3326 MB/s
raid6: avx2x1   xor()  1978 MB/s
raid6: sse2x4   gen()  5350 MB/s
raid6: sse2x4   xor()  3129 MB/s
raid6: sse2x2   gen()  3754 MB/s
raid6: sse2x2   xor()  1760 MB/s
raid6: sse2x1   gen()  1702 MB/s
raid6: sse2x1   xor()   988 MB/s
raid6: using algorithm avx2x4 gen() 10942 MB/s
raid6: .... xor() 6383 MB/s, rmw enabled
raid6: using avx2x2 recovery algorithm
ACPI: Added _OSI(Module Device)
ACPI: Added _OSI(Processor Device)
ACPI: Added _OSI(3.0 _SCP Extensions)
ACPI: Added _OSI(Processor Aggregator Device)
ACPI: Added _OSI(Linux-Dell-Video)
ACPI: Added _OSI(Linux-Lenovo-NV-HDMI-Audio)
ACPI: Added _OSI(Linux-HPI-Hybrid-Graphics)
ACPI: 2 ACPI AML tables successfully acquired and loaded
ACPI: Interpreter enabled
ACPI: (supports S0 S3 S4 S5)
ACPI: Using IOAPIC for interrupt routing
PCI: Using host bridge windows from ACPI; if necessary, use "pci=nocrs" and  
report a bug
ACPI: Enabled 16 GPEs in block 00 to 0F
ACPI: PCI Root Bridge [PCI0] (domain 0000 [bus 00-ff])
acpi PNP0A03:00: _OSC: OS supports [ASPM ClockPM Segments MSI HPX-Type3]
acpi PNP0A03:00: fail to add MMCONFIG information, can't access extended  
PCI configuration space under this bridge.
PCI host bridge to bus 0000:00
pci_bus 0000:00: root bus resource [io  0x0000-0x0cf7 window]
pci_bus 0000:00: root bus resource [io  0x0d00-0xffff window]
pci_bus 0000:00: root bus resource [mem 0x000a0000-0x000bffff window]
pci_bus 0000:00: root bus resource [mem 0xc0000000-0xfebfffff window]
pci_bus 0000:00: root bus resource [bus 00-ff]
pci 0000:00:00.0: [8086:1237] type 00 class 0x060000
pci 0000:00:01.0: [8086:7110] type 00 class 0x060100
pci 0000:00:01.3: [8086:7113] type 00 class 0x068000
pci 0000:00:01.3: quirk: [io  0xb000-0xb03f] claimed by PIIX4 ACPI
pci 0000:00:03.0: [1af4:1004] type 00 class 0x000000
pci 0000:00:03.0: reg 0x10: [io  0xc000-0xc03f]
pci 0000:00:03.0: reg 0x14: [mem 0xfebfe000-0xfebfe07f]
pci 0000:00:04.0: [1af4:1000] type 00 class 0x020000
pci 0000:00:04.0: reg 0x10: [io  0xc040-0xc07f]
pci 0000:00:04.0: reg 0x14: [mem 0xfebff000-0xfebff07f]
ACPI: PCI Interrupt Link [LNKA] (IRQs 5 *10 11)
ACPI: PCI Interrupt Link [LNKB] (IRQs 5 *10 11)
ACPI: PCI Interrupt Link [LNKC] (IRQs 5 10 *11)
ACPI: PCI Interrupt Link [LNKD] (IRQs 5 10 *11)
ACPI: PCI Interrupt Link [LNKS] (IRQs *9)
vgaarb: loaded
SCSI subsystem initialized
ACPI: bus type USB registered
usbcore: registered new interface driver usbfs
usbcore: registered new interface driver hub
usbcore: registered new device driver usb
mc: Linux media interface: v0.10
videodev: Linux video capture interface: v2.00
pps_core: LinuxPPS API ver. 1 registered
pps_core: Software ver. 5.3.6 - Copyright 2005-2007 Rodolfo Giometti  
<giometti@linux.it>
PTP clock support registered
EDAC MC: Ver: 3.0.0
Advanced Linux Sound Architecture Driver Initialized.
PCI: Using ACPI for IRQ routing
Bluetooth: Core ver 2.22
NET: Registered protocol family 31
Bluetooth: HCI device and connection manager initialized
Bluetooth: HCI socket layer initialized
Bluetooth: L2CAP socket layer initialized
Bluetooth: SCO socket layer initialized
NET: Registered protocol family 8
NET: Registered protocol family 20
NetLabel: Initializing
NetLabel:  domain hash size = 128
NetLabel:  protocols = UNLABELED CIPSOv4 CALIPSO
NetLabel:  unlabeled traffic allowed by default
nfc: nfc_init: NFC Core ver 0.1
NET: Registered protocol family 39
clocksource: Switched to clocksource kvm-clock
VFS: Disk quotas dquot_6.6.0
VFS: Dquot-cache hash table entries: 512 (order 0, 4096 bytes)
FS-Cache: Loaded
*** VALIDATE hugetlbfs ***
CacheFiles: Loaded
TOMOYO: 2.6.0
Mandatory Access Control activated.
AppArmor: AppArmor Filesystem Enabled
pnp: PnP ACPI init
pnp: PnP ACPI: found 7 devices
thermal_sys: Registered thermal governor 'step_wise'
thermal_sys: Registered thermal governor 'user_space'
clocksource: acpi_pm: mask: 0xffffff max_cycles: 0xffffff, max_idle_ns:  
2085701024 ns
pci_bus 0000:00: resource 4 [io  0x0000-0x0cf7 window]
pci_bus 0000:00: resource 5 [io  0x0d00-0xffff window]
pci_bus 0000:00: resource 6 [mem 0x000a0000-0x000bffff window]
pci_bus 0000:00: resource 7 [mem 0xc0000000-0xfebfffff window]
NET: Registered protocol family 2
tcp_listen_portaddr_hash hash table entries: 4096 (order: 6, 294912 bytes,  
vmalloc)
TCP established hash table entries: 65536 (order: 7, 524288 bytes, vmalloc)
TCP bind hash table entries: 65536 (order: 10, 4194304 bytes, vmalloc)
TCP: Hash tables configured (established 65536 bind 65536)
UDP hash table entries: 4096 (order: 7, 655360 bytes, vmalloc)
UDP-Lite hash table entries: 4096 (order: 7, 655360 bytes, vmalloc)
NET: Registered protocol family 1
RPC: Registered named UNIX socket transport module.
RPC: Registered udp transport module.
RPC: Registered tcp transport module.
RPC: Registered tcp NFSv4.1 backchannel transport module.
NET: Registered protocol family 44
pci 0000:00:00.0: Limiting direct PCI/PCI transfers
PCI: CLS 0 bytes, default 64
PCI-DMA: Using software bounce buffering for IO (SWIOTLB)
software IO TLB: mapped [mem 0xaa800000-0xae800000] (64MB)
RAPL PMU: API unit is 2^-32 Joules, 0 fixed counters, 10737418240 ms ovfl  
timer
kvm: already loaded the other module
clocksource: tsc: mask: 0xffffffffffffffff max_cycles: 0x212735223b2,  
max_idle_ns: 440795277976 ns
clocksource: Switched to clocksource tsc
mce: Machine check injector initialized
check: Scanning for low memory corruption every 60 seconds
Initialise system trusted keyrings
workingset: timestamp_bits=40 max_order=21 bucket_order=0
zbud: loaded
DLM installed
squashfs: version 4.0 (2009/01/31) Phillip Lougher
FS-Cache: Netfs 'nfs' registered for caching
NFS: Registering the id_resolver key type
Key type id_resolver registered
Key type id_legacy registered
nfs4filelayout_init: NFSv4 File Layout Driver Registering...
Installing knfsd (copyright (C) 1996 okir@monad.swb.de).
ntfs: driver 2.1.32 [Flags: R/W].
fuse: init (API version 7.31)
JFS: nTxBlock = 8192, nTxLock = 65536
SGI XFS with ACLs, security attributes, realtime, no debug enabled
9p: Installing v9fs 9p2000 file system support
FS-Cache: Netfs '9p' registered for caching
gfs2: GFS2 installed
FS-Cache: Netfs 'ceph' registered for caching
ceph: loaded (mds proto 32)
NET: Registered protocol family 38
async_tx: api initialized (async)
Key type asymmetric registered
Asymmetric key parser 'x509' registered
Asymmetric key parser 'pkcs8' registered
Key type pkcs7_test registered
Asymmetric key parser 'tpm_parser' registered
Block layer SCSI generic (bsg) driver version 0.4 loaded (major 246)
io scheduler mq-deadline registered
io scheduler kyber registered
io scheduler bfq registered
input: Power Button as /devices/LNXSYSTM:00/LNXPWRBN:00/input/input0
ACPI: Power Button [PWRF]
input: Sleep Button as /devices/LNXSYSTM:00/LNXSLPBN:00/input/input1
ACPI: Sleep Button [SLPF]
ioatdma: Intel(R) QuickData Technology Driver 5.00
PCI Interrupt Link [LNKC] enabled at IRQ 11
virtio-pci 0000:00:03.0: virtio_pci: leaving for legacy driver
PCI Interrupt Link [LNKD] enabled at IRQ 10
virtio-pci 0000:00:04.0: virtio_pci: leaving for legacy driver
HDLC line discipline maxframe=4096
N_HDLC line discipline registered.
Serial: 8250/16550 driver, 4 ports, IRQ sharing enabled
00:03: ttyS0 at I/O 0x3f8 (irq = 4, base_baud = 115200) is a 16550A
00:04: ttyS1 at I/O 0x2f8 (irq = 3, base_baud = 115200) is a 16550A
00:05: ttyS2 at I/O 0x3e8 (irq = 6, base_baud = 115200) is a 16550A
00:06: ttyS3 at I/O 0x2e8 (irq = 7, base_baud = 115200) is a 16550A
Non-volatile memory driver v1.3
Linux agpgart interface v0.103
[drm] Initialized vgem 1.0.0 20120112 for vgem on minor 0
[drm] Supports vblank timestamp caching Rev 2 (21.10.2013).
[drm] Driver supports precise vblank timestamp query.
[drm] Initialized vkms 1.0.0 20180514 for vkms on minor 1
usbcore: registered new interface driver udl
brd: module loaded
loop: module loaded
zram: Added device: zram0
null: module loaded
nfcsim 0.2 initialized
Loading iSCSI transport class v2.0-870.
scsi host0: Virtio SCSI HBA
st: Version 20160209, fixed bufsize 32768, s/g segs 256
kobject: 'st' (000000004c8d7e58): fill_kobj_path: path  
= '/bus/scsi/drivers/st'
kobject: 'scsi_disk' (00000000bdfbce9c): kobject_add_internal:  
parent: 'class', set: 'class'
kobject: 'scsi_disk' (00000000bdfbce9c): kobject_uevent_env
kobject: 'scsi_disk' (00000000bdfbce9c): fill_kobj_path: path  
= '/class/scsi_disk'
kobject: 'sd' (0000000055985a2d): kobject_add_internal: parent: 'drivers',  
set: 'drivers'
kobject: 'sd' (0000000055985a2d): kobject_uevent_env
kobject: 'sd' (0000000055985a2d): fill_kobj_path: path  
= '/bus/scsi/drivers/sd'
kobject: 'sr' (000000004054170b): kobject_add_internal: parent: 'drivers',  
set: 'drivers'
kobject: 'sr' (000000004054170b): kobject_uevent_env
kobject: 'sr' (000000004054170b): fill_kobj_path: path  
= '/bus/scsi/drivers/sr'
kobject: 'scsi_generic' (0000000098f3b229): kobject_add_internal:  
parent: 'class', set: 'class'
kobject: 'scsi_generic' (0000000098f3b229): kobject_uevent_env
kobject: 'scsi_generic' (0000000098f3b229): fill_kobj_path: path  
= '/class/scsi_generic'
kobject: 'nvme-wq' (00000000270c2331): kobject_add_internal:  
parent: 'workqueue', set: 'devices'
kobject: 'nvme-wq' (00000000270c2331): kobject_uevent_env
kobject: 'nvme-wq' (00000000270c2331): kobject_uevent_env: uevent_suppress  
caused the event to drop!
kobject: 'nvme-wq' (00000000270c2331): kobject_uevent_env
kobject: 'nvme-wq' (00000000270c2331): fill_kobj_path: path  
= '/devices/virtual/workqueue/nvme-wq'
kobject: 'nvme-reset-wq' (000000003e1ba3d5): kobject_add_internal:  
parent: 'workqueue', set: 'devices'
kobject: 'nvme-reset-wq' (000000003e1ba3d5): kobject_uevent_env
kobject: 'nvme-reset-wq' (000000003e1ba3d5): kobject_uevent_env:  
uevent_suppress caused the event to drop!
kobject: 'nvme-reset-wq' (000000003e1ba3d5): kobject_uevent_env
kobject: 'nvme-reset-wq' (000000003e1ba3d5): fill_kobj_path: path  
= '/devices/virtual/workqueue/nvme-reset-wq'
kobject: 'nvme-delete-wq' (000000005497d244): kobject_add_internal:  
parent: 'workqueue', set: 'devices'
kobject: 'nvme-delete-wq' (000000005497d244): kobject_uevent_env
kobject: 'nvme-delete-wq' (000000005497d244): kobject_uevent_env:  
uevent_suppress caused the event to drop!
kobject: 'nvme-delete-wq' (000000005497d244): kobject_uevent_env
kobject: 'nvme-delete-wq' (000000005497d244): fill_kobj_path: path  
= '/devices/virtual/workqueue/nvme-delete-wq'
kobject: 'nvme' (000000008e6a29d7): kobject_add_internal: parent: 'class',  
set: 'class'
kobject: 'nvme' (000000008e6a29d7): kobject_uevent_env
kobject: 'nvme' (000000008e6a29d7): fill_kobj_path: path = '/class/nvme'
kobject: 'nvme-subsystem' (000000001563dbee): kobject_add_internal:  
parent: 'class', set: 'class'
kobject: 'nvme-subsystem' (000000001563dbee): kobject_uevent_env
kobject: 'nvme-subsystem' (000000001563dbee): fill_kobj_path: path  
= '/class/nvme-subsystem'
kobject: 'nvme' (00000000c52b7e0e): kobject_add_internal:  
parent: 'drivers', set: 'drivers'
kobject: 'drivers' (00000000f6d3710d): kobject_add_internal:  
parent: 'nvme', set: '<NULL>'
kobject: 'nvme' (00000000c52b7e0e): kobject_uevent_env
kobject: 'nvme' (00000000c52b7e0e): fill_kobj_path: path  
= '/bus/pci/drivers/nvme'
kobject: 'ahci' (00000000a29e777d): kobject_add_internal:  
parent: 'drivers', set: 'drivers'
kobject: 'drivers' (000000003ed63ce6): kobject_add_internal:  
parent: 'ahci', set: '<NULL>'
kobject: 'ahci' (00000000a29e777d): kobject_uevent_env
kobject: 'ahci' (00000000a29e777d): fill_kobj_path: path  
= '/bus/pci/drivers/ahci'
kobject: 'ata_piix' (0000000087185d26): kobject_add_internal:  
parent: 'drivers', set: 'drivers'
kobject: 'drivers' (000000004a065e79): kobject_add_internal:  
parent: 'ata_piix', set: '<NULL>'
kobject: 'ata_piix' (0000000087185d26): kobject_uevent_env
kobject: 'ata_piix' (0000000087185d26): fill_kobj_path: path  
= '/bus/pci/drivers/ata_piix'
kobject: 'pata_amd' (00000000519c7b49): kobject_add_internal:  
parent: 'drivers', set: 'drivers'
kobject: 'drivers' (00000000cb24f8fd): kobject_add_internal:  
parent: 'pata_amd', set: '<NULL>'
kobject: 'pata_amd' (00000000519c7b49): kobject_uevent_env


---
This bug is generated by a bot. It may contain errors.
See https://goo.gl/tpsmEJ for more information about syzbot.
syzbot engineers can be reached at syzkaller@googlegroups.com.

syzbot will keep track of this bug report. See:
https://goo.gl/tpsmEJ#status for how to communicate with syzbot.

^ permalink raw reply

* net boot error: WARNING: workqueue cpumask: online intersect > possible intersect (2)
From: syzbot @ 2019-07-23  6:38 UTC (permalink / raw)
  To: linux-kernel, netdev, syzkaller-bugs

Hello,

syzbot found the following crash on:

HEAD commit:    12185dfe bonding: Force slave speed check after link state..
git tree:       net
console output: https://syzkaller.appspot.com/x/log.txt?x=1299b07c600000
kernel config:  https://syzkaller.appspot.com/x/.config?x=9aec8cb13b5f7389
dashboard link: https://syzkaller.appspot.com/bug?extid=5afa6eb0187aa0db10d0
compiler:       gcc (GCC) 9.0.0 20181231 (experimental)

Unfortunately, I don't have any reproducer for this crash yet.

IMPORTANT: if you fix the bug, please add the following tag to the commit:
Reported-by: syzbot+5afa6eb0187aa0db10d0@syzkaller.appspotmail.com

smpboot: CPU0: Intel(R) Xeon(R) CPU @ 2.30GHz (family: 0x6, model: 0x3f,  
stepping: 0x0)
Performance Events: unsupported p6 CPU model 63 no PMU driver, software  
events only.
rcu: Hierarchical SRCU implementation.
NMI watchdog: Perf NMI watchdog permanently disabled
smp: Bringing up secondary CPUs ...
x86: Booting SMP configuration:
.... node  #0, CPUs:      #1
MDS CPU bug present and SMT on, data leak possible. See  
https://www.kernel.org/doc/html/latest/admin-guide/hw-vuln/mds.html for  
more details.
smp: Brought up 2 nodes, 2 CPUs
smpboot: Max logical packages: 1
smpboot: Total of 2 processors activated (9200.00 BogoMIPS)
devtmpfs: initialized
clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns:  
19112604462750000 ns
futex hash table entries: 512 (order: 4, 65536 bytes, vmalloc)
xor: automatically using best checksumming function   avx
PM: RTC time: 23:29:51, date: 2019-07-22
NET: Registered protocol family 16
audit: initializing netlink subsys (disabled)
cpuidle: using governor menu
ACPI: bus type PCI registered
dca service started, version 1.12.1
PCI: Using configuration type 1 for base access
WARNING: workqueue cpumask: online intersect > possible intersect
HugeTLB registered 1.00 GiB page size, pre-allocated 0 pages
HugeTLB registered 2.00 MiB page size, pre-allocated 0 pages
cryptd: max_cpu_qlen set to 1000
raid6: avx2x4   gen() 12501 MB/s
raid6: avx2x4   xor()  6221 MB/s
raid6: avx2x2   gen()  4903 MB/s
raid6: avx2x2   xor()  3850 MB/s
raid6: avx2x1   gen()  1521 MB/s
raid6: avx2x1   xor()  2163 MB/s
raid6: sse2x4   gen()  6232 MB/s
raid6: sse2x4   xor()  3408 MB/s
raid6: sse2x2   gen()  3865 MB/s
raid6: sse2x2   xor()  1956 MB/s
raid6: sse2x1   gen()  1278 MB/s
raid6: sse2x1   xor()   961 MB/s
raid6: using algorithm avx2x4 gen() 12501 MB/s
raid6: .... xor() 6221 MB/s, rmw enabled
raid6: using avx2x2 recovery algorithm
ACPI: Added _OSI(Module Device)
ACPI: Added _OSI(Processor Device)
ACPI: Added _OSI(3.0 _SCP Extensions)
ACPI: Added _OSI(Processor Aggregator Device)
ACPI: Added _OSI(Linux-Dell-Video)
ACPI: Added _OSI(Linux-Lenovo-NV-HDMI-Audio)
ACPI: Added _OSI(Linux-HPI-Hybrid-Graphics)
ACPI: 2 ACPI AML tables successfully acquired and loaded
ACPI: Interpreter enabled
ACPI: (supports S0 S3 S4 S5)
ACPI: Using IOAPIC for interrupt routing
PCI: Using host bridge windows from ACPI; if necessary, use "pci=nocrs" and  
report a bug
ACPI: Enabled 16 GPEs in block 00 to 0F
ACPI: PCI Root Bridge [PCI0] (domain 0000 [bus 00-ff])
acpi PNP0A03:00: _OSC: OS supports [ASPM ClockPM Segments MSI HPX-Type3]
acpi PNP0A03:00: fail to add MMCONFIG information, can't access extended  
PCI configuration space under this bridge.
PCI host bridge to bus 0000:00
pci_bus 0000:00: root bus resource [io  0x0000-0x0cf7 window]
pci_bus 0000:00: root bus resource [io  0x0d00-0xffff window]
pci_bus 0000:00: root bus resource [mem 0x000a0000-0x000bffff window]
pci_bus 0000:00: root bus resource [mem 0xc0000000-0xfebfffff window]
pci_bus 0000:00: root bus resource [bus 00-ff]
pci 0000:00:00.0: [8086:1237] type 00 class 0x060000
pci 0000:00:01.0: [8086:7110] type 00 class 0x060100
pci 0000:00:01.3: [8086:7113] type 00 class 0x068000
pci 0000:00:01.3: quirk: [io  0xb000-0xb03f] claimed by PIIX4 ACPI
pci 0000:00:03.0: [1af4:1004] type 00 class 0x000000
pci 0000:00:03.0: reg 0x10: [io  0xc000-0xc03f]
pci 0000:00:03.0: reg 0x14: [mem 0xfebfe000-0xfebfe07f]
pci 0000:00:04.0: [1af4:1000] type 00 class 0x020000
pci 0000:00:04.0: reg 0x10: [io  0xc040-0xc07f]
pci 0000:00:04.0: reg 0x14: [mem 0xfebff000-0xfebff07f]
ACPI: PCI Interrupt Link [LNKA] (IRQs 5 *10 11)
ACPI: PCI Interrupt Link [LNKB] (IRQs 5 *10 11)
ACPI: PCI Interrupt Link [LNKC] (IRQs 5 10 *11)
ACPI: PCI Interrupt Link [LNKD] (IRQs 5 10 *11)
ACPI: PCI Interrupt Link [LNKS] (IRQs *9)
vgaarb: loaded
SCSI subsystem initialized
ACPI: bus type USB registered
usbcore: registered new interface driver usbfs
usbcore: registered new interface driver hub
usbcore: registered new device driver usb
mc: Linux media interface: v0.10
videodev: Linux video capture interface: v2.00
pps_core: LinuxPPS API ver. 1 registered
pps_core: Software ver. 5.3.6 - Copyright 2005-2007 Rodolfo Giometti  
<giometti@linux.it>
PTP clock support registered
EDAC MC: Ver: 3.0.0
Advanced Linux Sound Architecture Driver Initialized.
PCI: Using ACPI for IRQ routing
Bluetooth: Core ver 2.22
NET: Registered protocol family 31
Bluetooth: HCI device and connection manager initialized
Bluetooth: HCI socket layer initialized
Bluetooth: L2CAP socket layer initialized
Bluetooth: SCO socket layer initialized
NET: Registered protocol family 8
NET: Registered protocol family 20
NetLabel: Initializing
NetLabel:  domain hash size = 128
NetLabel:  protocols = UNLABELED CIPSOv4 CALIPSO
NetLabel:  unlabeled traffic allowed by default
nfc: nfc_init: NFC Core ver 0.1
NET: Registered protocol family 39
clocksource: Switched to clocksource kvm-clock
VFS: Disk quotas dquot_6.6.0
VFS: Dquot-cache hash table entries: 512 (order 0, 4096 bytes)
FS-Cache: Loaded
*** VALIDATE hugetlbfs ***
CacheFiles: Loaded
TOMOYO: 2.6.0
Mandatory Access Control activated.
AppArmor: AppArmor Filesystem Enabled
pnp: PnP ACPI init
pnp: PnP ACPI: found 7 devices
thermal_sys: Registered thermal governor 'step_wise'
thermal_sys: Registered thermal governor 'user_space'
clocksource: acpi_pm: mask: 0xffffff max_cycles: 0xffffff, max_idle_ns:  
2085701024 ns
pci_bus 0000:00: resource 4 [io  0x0000-0x0cf7 window]
pci_bus 0000:00: resource 5 [io  0x0d00-0xffff window]
pci_bus 0000:00: resource 6 [mem 0x000a0000-0x000bffff window]
pci_bus 0000:00: resource 7 [mem 0xc0000000-0xfebfffff window]
NET: Registered protocol family 2
tcp_listen_portaddr_hash hash table entries: 4096 (order: 6, 294912 bytes,  
vmalloc)
TCP established hash table entries: 65536 (order: 7, 524288 bytes, vmalloc)
TCP bind hash table entries: 65536 (order: 10, 4194304 bytes, vmalloc)
TCP: Hash tables configured (established 65536 bind 65536)
UDP hash table entries: 4096 (order: 7, 655360 bytes, vmalloc)
UDP-Lite hash table entries: 4096 (order: 7, 655360 bytes, vmalloc)
NET: Registered protocol family 1
RPC: Registered named UNIX socket transport module.
RPC: Registered udp transport module.
RPC: Registered tcp transport module.
RPC: Registered tcp NFSv4.1 backchannel transport module.
NET: Registered protocol family 44
pci 0000:00:00.0: Limiting direct PCI/PCI transfers
PCI: CLS 0 bytes, default 64
PCI-DMA: Using software bounce buffering for IO (SWIOTLB)
software IO TLB: mapped [mem 0xaa800000-0xae800000] (64MB)
RAPL PMU: API unit is 2^-32 Joules, 0 fixed counters, 10737418240 ms ovfl  
timer
kvm: already loaded the other module
clocksource: tsc: mask: 0xffffffffffffffff max_cycles: 0x212735223b2,  
max_idle_ns: 440795277976 ns
clocksource: Switched to clocksource tsc
mce: Machine check injector initialized
check: Scanning for low memory corruption every 60 seconds
Initialise system trusted keyrings
workingset: timestamp_bits=40 max_order=21 bucket_order=0
zbud: loaded
DLM installed
squashfs: version 4.0 (2009/01/31) Phillip Lougher
FS-Cache: Netfs 'nfs' registered for caching
NFS: Registering the id_resolver key type
Key type id_resolver registered
Key type id_legacy registered
nfs4filelayout_init: NFSv4 File Layout Driver Registering...
Installing knfsd (copyright (C) 1996 okir@monad.swb.de).
ntfs: driver 2.1.32 [Flags: R/W].
fuse: init (API version 7.31)
JFS: nTxBlock = 8192, nTxLock = 65536
SGI XFS with ACLs, security attributes, realtime, no debug enabled
9p: Installing v9fs 9p2000 file system support
FS-Cache: Netfs '9p' registered for caching
gfs2: GFS2 installed
FS-Cache: Netfs 'ceph' registered for caching
ceph: loaded (mds proto 32)
NET: Registered protocol family 38
async_tx: api initialized (async)
Key type asymmetric registered
Asymmetric key parser 'x509' registered
Asymmetric key parser 'pkcs8' registered
Key type pkcs7_test registered
Asymmetric key parser 'tpm_parser' registered
Block layer SCSI generic (bsg) driver version 0.4 loaded (major 246)
io scheduler mq-deadline registered
io scheduler kyber registered
io scheduler bfq registered
input: Power Button as /devices/LNXSYSTM:00/LNXPWRBN:00/input/input0
ACPI: Power Button [PWRF]
input: Sleep Button as /devices/LNXSYSTM:00/LNXSLPBN:00/input/input1
ACPI: Sleep Button [SLPF]
ioatdma: Intel(R) QuickData Technology Driver 5.00
PCI Interrupt Link [LNKC] enabled at IRQ 11
virtio-pci 0000:00:03.0: virtio_pci: leaving for legacy driver
PCI Interrupt Link [LNKD] enabled at IRQ 10
virtio-pci 0000:00:04.0: virtio_pci: leaving for legacy driver
HDLC line discipline maxframe=4096
N_HDLC line discipline registered.
Serial: 8250/16550 driver, 4 ports, IRQ sharing enabled
00:03: ttyS0 at I/O 0x3f8 (irq = 4, base_baud = 115200) is a 16550A
00:04: ttyS1 at I/O 0x2f8 (irq = 3, base_baud = 115200) is a 16550A
00:05: ttyS2 at I/O 0x3e8 (irq = 6, base_baud = 115200) is a 16550A
00:06: ttyS3 at I/O 0x2e8 (irq = 7, base_baud = 115200) is a 16550A
Non-volatile memory driver v1.3
Linux agpgart interface v0.103
[drm] Initialized vgem 1.0.0 20120112 for vgem on minor 0
[drm] Supports vblank timestamp caching Rev 2 (21.10.2013).
[drm] Driver supports precise vblank timestamp query.
[drm] Initialized vkms 1.0.0 20180514 for vkms on minor 1
usbcore: registered new interface driver udl
brd: module loaded
loop: module loaded
zram: Added device: zram0
null: module loaded
nfcsim 0.2 initialized
Loading iSCSI transport class v2.0-870.
scsi host0: Virtio SCSI HBA
st: Version 20160209, fixed bufsize 32768, s/g segs 256
kobject: 'sd' (00000000e065d5f3): kobject_uevent_env
kobject: 'sd' (00000000e065d5f3): fill_kobj_path: path  
= '/bus/scsi/drivers/sd'
kobject: 'sr' (00000000bcad56ad): kobject_add_internal: parent: 'drivers',  
set: 'drivers'
kobject: 'sr' (00000000bcad56ad): kobject_uevent_env
kobject: 'sr' (00000000bcad56ad): fill_kobj_path: path  
= '/bus/scsi/drivers/sr'
kobject: 'scsi_generic' (0000000071c7cad3): kobject_add_internal:  
parent: 'class', set: 'class'
kobject: 'scsi_generic' (0000000071c7cad3): kobject_uevent_env
kobject: 'scsi_generic' (0000000071c7cad3): fill_kobj_path: path  
= '/class/scsi_generic'
kobject: 'nvme-wq' (000000003997c013): kobject_add_internal:  
parent: 'workqueue', set: 'devices'
kobject: 'nvme-wq' (000000003997c013): kobject_uevent_env
kobject: 'nvme-wq' (000000003997c013): kobject_uevent_env: uevent_suppress  
caused the event to drop!
kobject: 'nvme-wq' (000000003997c013): kobject_uevent_env
kobject: 'nvme-wq' (000000003997c013): fill_kobj_path: path  
= '/devices/virtual/workqueue/nvme-wq'
kobject: 'nvme-reset-wq' (0000000085d6a1b9): kobject_add_internal:  
parent: 'workqueue', set: 'devices'
kobject: 'nvme-reset-wq' (0000000085d6a1b9): kobject_uevent_env
kobject: 'nvme-reset-wq' (0000000085d6a1b9): kobject_uevent_env:  
uevent_suppress caused the event to drop!


---
This bug is generated by a bot. It may contain errors.
See https://goo.gl/tpsmEJ for more information about syzbot.
syzbot engineers can be reached at syzkaller@googlegroups.com.

syzbot will keep track of this bug report. See:
https://goo.gl/tpsmEJ#status for how to communicate with syzbot.

^ permalink raw reply

* bpf-next boot error: WARNING: workqueue cpumask: online intersect > possible intersect (2)
From: syzbot @ 2019-07-23  6:38 UTC (permalink / raw)
  To: linux-kernel, netdev, syzkaller-bugs

Hello,

syzbot found the following crash on:

HEAD commit:    66b5f1c4 net-ipv6-ndisc: add support for RFC7710 RA Captiv..
git tree:       bpf-next
console output: https://syzkaller.appspot.com/x/log.txt?x=15513e78600000
kernel config:  https://syzkaller.appspot.com/x/.config?x=9aec8cb13b5f7389
dashboard link: https://syzkaller.appspot.com/bug?extid=88c042e36cde4bcbd19b
compiler:       gcc (GCC) 9.0.0 20181231 (experimental)

Unfortunately, I don't have any reproducer for this crash yet.

IMPORTANT: if you fix the bug, please add the following tag to the commit:
Reported-by: syzbot+88c042e36cde4bcbd19b@syzkaller.appspotmail.com

smpboot: CPU0: Intel(R) Xeon(R) CPU @ 2.30GHz (family: 0x6, model: 0x3f,  
stepping: 0x0)
Performance Events: unsupported p6 CPU model 63 no PMU driver, software  
events only.
rcu: Hierarchical SRCU implementation.
NMI watchdog: Perf NMI watchdog permanently disabled
smp: Bringing up secondary CPUs ...
x86: Booting SMP configuration:
.... node  #0, CPUs:      #1
MDS CPU bug present and SMT on, data leak possible. See  
https://www.kernel.org/doc/html/latest/admin-guide/hw-vuln/mds.html for  
more details.
smp: Brought up 2 nodes, 2 CPUs
smpboot: Max logical packages: 1
smpboot: Total of 2 processors activated (9200.00 BogoMIPS)
devtmpfs: initialized
clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns:  
19112604462750000 ns
futex hash table entries: 512 (order: 4, 65536 bytes, vmalloc)
xor: automatically using best checksumming function   avx
PM: RTC time: 00:21:51, date: 2019-07-23
NET: Registered protocol family 16
audit: initializing netlink subsys (disabled)
cpuidle: using governor menu
ACPI: bus type PCI registered
dca service started, version 1.12.1
PCI: Using configuration type 1 for base access
WARNING: workqueue cpumask: online intersect > possible intersect
HugeTLB registered 1.00 GiB page size, pre-allocated 0 pages
HugeTLB registered 2.00 MiB page size, pre-allocated 0 pages
cryptd: max_cpu_qlen set to 1000
raid6: avx2x4   gen() 12057 MB/s
raid6: avx2x4   xor()  6485 MB/s
raid6: avx2x2   gen()  5976 MB/s
raid6: avx2x2   xor()  3848 MB/s
raid6: avx2x1   gen()   921 MB/s
raid6: avx2x1   xor()  2173 MB/s
raid6: sse2x4   gen()  6202 MB/s
raid6: sse2x4   xor()  3397 MB/s
raid6: sse2x2   gen()  3875 MB/s
raid6: sse2x2   xor()  1961 MB/s
raid6: sse2x1   gen()   789 MB/s
raid6: sse2x1   xor()   964 MB/s
raid6: using algorithm avx2x4 gen() 12057 MB/s
raid6: .... xor() 6485 MB/s, rmw enabled
raid6: using avx2x2 recovery algorithm
ACPI: Added _OSI(Module Device)
ACPI: Added _OSI(Processor Device)
ACPI: Added _OSI(3.0 _SCP Extensions)
ACPI: Added _OSI(Processor Aggregator Device)
ACPI: Added _OSI(Linux-Dell-Video)
ACPI: Added _OSI(Linux-Lenovo-NV-HDMI-Audio)
ACPI: Added _OSI(Linux-HPI-Hybrid-Graphics)
ACPI: 2 ACPI AML tables successfully acquired and loaded
ACPI: Interpreter enabled
ACPI: (supports S0 S3 S4 S5)
ACPI: Using IOAPIC for interrupt routing
PCI: Using host bridge windows from ACPI; if necessary, use "pci=nocrs" and  
report a bug
ACPI: Enabled 16 GPEs in block 00 to 0F
ACPI: PCI Root Bridge [PCI0] (domain 0000 [bus 00-ff])
acpi PNP0A03:00: _OSC: OS supports [ASPM ClockPM Segments MSI HPX-Type3]
acpi PNP0A03:00: fail to add MMCONFIG information, can't access extended  
PCI configuration space under this bridge.
PCI host bridge to bus 0000:00
pci_bus 0000:00: root bus resource [io  0x0000-0x0cf7 window]
pci_bus 0000:00: root bus resource [io  0x0d00-0xffff window]
pci_bus 0000:00: root bus resource [mem 0x000a0000-0x000bffff window]
pci_bus 0000:00: root bus resource [mem 0xc0000000-0xfebfffff window]
pci_bus 0000:00: root bus resource [bus 00-ff]
pci 0000:00:00.0: [8086:1237] type 00 class 0x060000
pci 0000:00:01.0: [8086:7110] type 00 class 0x060100
pci 0000:00:01.3: [8086:7113] type 00 class 0x068000
pci 0000:00:01.3: quirk: [io  0xb000-0xb03f] claimed by PIIX4 ACPI
pci 0000:00:03.0: [1af4:1004] type 00 class 0x000000
pci 0000:00:03.0: reg 0x10: [io  0xc000-0xc03f]
pci 0000:00:03.0: reg 0x14: [mem 0xfebfe000-0xfebfe07f]
pci 0000:00:04.0: [1af4:1000] type 00 class 0x020000
pci 0000:00:04.0: reg 0x10: [io  0xc040-0xc07f]
pci 0000:00:04.0: reg 0x14: [mem 0xfebff000-0xfebff07f]
ACPI: PCI Interrupt Link [LNKA] (IRQs 5 *10 11)
ACPI: PCI Interrupt Link [LNKB] (IRQs 5 *10 11)
ACPI: PCI Interrupt Link [LNKC] (IRQs 5 10 *11)
ACPI: PCI Interrupt Link [LNKD] (IRQs 5 10 *11)
ACPI: PCI Interrupt Link [LNKS] (IRQs *9)
vgaarb: loaded
SCSI subsystem initialized
ACPI: bus type USB registered
usbcore: registered new interface driver usbfs
usbcore: registered new interface driver hub
usbcore: registered new device driver usb
mc: Linux media interface: v0.10
videodev: Linux video capture interface: v2.00
pps_core: LinuxPPS API ver. 1 registered
pps_core: Software ver. 5.3.6 - Copyright 2005-2007 Rodolfo Giometti  
<giometti@linux.it>
PTP clock support registered
EDAC MC: Ver: 3.0.0
Advanced Linux Sound Architecture Driver Initialized.
PCI: Using ACPI for IRQ routing
Bluetooth: Core ver 2.22
NET: Registered protocol family 31
Bluetooth: HCI device and connection manager initialized
Bluetooth: HCI socket layer initialized
Bluetooth: L2CAP socket layer initialized
Bluetooth: SCO socket layer initialized
NET: Registered protocol family 8
NET: Registered protocol family 20
NetLabel: Initializing
NetLabel:  domain hash size = 128
NetLabel:  protocols = UNLABELED CIPSOv4 CALIPSO
NetLabel:  unlabeled traffic allowed by default
nfc: nfc_init: NFC Core ver 0.1
NET: Registered protocol family 39
clocksource: Switched to clocksource kvm-clock
VFS: Disk quotas dquot_6.6.0
VFS: Dquot-cache hash table entries: 512 (order 0, 4096 bytes)
FS-Cache: Loaded
*** VALIDATE hugetlbfs ***
CacheFiles: Loaded
TOMOYO: 2.6.0
Mandatory Access Control activated.
AppArmor: AppArmor Filesystem Enabled
pnp: PnP ACPI init
pnp: PnP ACPI: found 7 devices
thermal_sys: Registered thermal governor 'step_wise'
thermal_sys: Registered thermal governor 'user_space'
clocksource: acpi_pm: mask: 0xffffff max_cycles: 0xffffff, max_idle_ns:  
2085701024 ns
pci_bus 0000:00: resource 4 [io  0x0000-0x0cf7 window]
pci_bus 0000:00: resource 5 [io  0x0d00-0xffff window]
pci_bus 0000:00: resource 6 [mem 0x000a0000-0x000bffff window]
pci_bus 0000:00: resource 7 [mem 0xc0000000-0xfebfffff window]
NET: Registered protocol family 2
tcp_listen_portaddr_hash hash table entries: 4096 (order: 6, 294912 bytes,  
vmalloc)
TCP established hash table entries: 65536 (order: 7, 524288 bytes, vmalloc)
TCP bind hash table entries: 65536 (order: 10, 4194304 bytes, vmalloc)
TCP: Hash tables configured (established 65536 bind 65536)
UDP hash table entries: 4096 (order: 7, 655360 bytes, vmalloc)
UDP-Lite hash table entries: 4096 (order: 7, 655360 bytes, vmalloc)
NET: Registered protocol family 1
RPC: Registered named UNIX socket transport module.
RPC: Registered udp transport module.
RPC: Registered tcp transport module.
RPC: Registered tcp NFSv4.1 backchannel transport module.
NET: Registered protocol family 44
pci 0000:00:00.0: Limiting direct PCI/PCI transfers
PCI: CLS 0 bytes, default 64
PCI-DMA: Using software bounce buffering for IO (SWIOTLB)
software IO TLB: mapped [mem 0xaa800000-0xae800000] (64MB)
RAPL PMU: API unit is 2^-32 Joules, 0 fixed counters, 10737418240 ms ovfl  
timer
kvm: already loaded the other module
clocksource: tsc: mask: 0xffffffffffffffff max_cycles: 0x212735223b2,  
max_idle_ns: 440795277976 ns
clocksource: Switched to clocksource tsc
mce: Machine check injector initialized
check: Scanning for low memory corruption every 60 seconds
Initialise system trusted keyrings
workingset: timestamp_bits=40 max_order=21 bucket_order=0
zbud: loaded
DLM installed
squashfs: version 4.0 (2009/01/31) Phillip Lougher
FS-Cache: Netfs 'nfs' registered for caching
NFS: Registering the id_resolver key type
Key type id_resolver registered
Key type id_legacy registered
nfs4filelayout_init: NFSv4 File Layout Driver Registering...
Installing knfsd (copyright (C) 1996 okir@monad.swb.de).
ntfs: driver 2.1.32 [Flags: R/W].
fuse: init (API version 7.31)
JFS: nTxBlock = 8192, nTxLock = 65536
SGI XFS with ACLs, security attributes, realtime, no debug enabled
9p: Installing v9fs 9p2000 file system support
FS-Cache: Netfs '9p' registered for caching
gfs2: GFS2 installed
FS-Cache: Netfs 'ceph' registered for caching
ceph: loaded (mds proto 32)
NET: Registered protocol family 38
async_tx: api initialized (async)
Key type asymmetric registered
Asymmetric key parser 'x509' registered
Asymmetric key parser 'pkcs8' registered
Key type pkcs7_test registered
Asymmetric key parser 'tpm_parser' registered
Block layer SCSI generic (bsg) driver version 0.4 loaded (major 246)
io scheduler mq-deadline registered
io scheduler kyber registered
io scheduler bfq registered
input: Power Button as /devices/LNXSYSTM:00/LNXPWRBN:00/input/input0
ACPI: Power Button [PWRF]
input: Sleep Button as /devices/LNXSYSTM:00/LNXSLPBN:00/input/input1
ACPI: Sleep Button [SLPF]
ioatdma: Intel(R) QuickData Technology Driver 5.00
PCI Interrupt Link [LNKC] enabled at IRQ 11
virtio-pci 0000:00:03.0: virtio_pci: leaving for legacy driver
PCI Interrupt Link [LNKD] enabled at IRQ 10
virtio-pci 0000:00:04.0: virtio_pci: leaving for legacy driver
HDLC line discipline maxframe=4096
N_HDLC line discipline registered.
Serial: 8250/16550 driver, 4 ports, IRQ sharing enabled
00:03: ttyS0 at I/O 0x3f8 (irq = 4, base_baud = 115200) is a 16550A
00:04: ttyS1 at I/O 0x2f8 (irq = 3, base_baud = 115200) is a 16550A
00:05: ttyS2 at I/O 0x3e8 (irq = 6, base_baud = 115200) is a 16550A
00:06: ttyS3 at I/O 0x2e8 (irq = 7, base_baud = 115200) is a 16550A
Non-volatile memory driver v1.3
Linux agpgart interface v0.103
[drm] Initialized vgem 1.0.0 20120112 for vgem on minor 0
[drm] Supports vblank timestamp caching Rev 2 (21.10.2013).
[drm] Driver supports precise vblank timestamp query.
[drm] Initialized vkms 1.0.0 20180514 for vkms on minor 1
usbcore: registered new interface driver udl
brd: module loaded
loop: module loaded
zram: Added device: zram0
null: module loaded
nfcsim 0.2 initialized
Loading iSCSI transport class v2.0-870.
scsi host0: Virtio SCSI HBA
st: Version 20160209, fixed bufsize 32768, s/g segs 256
kobject: 'sd' (00000000062140f2): kobject_uevent_env
kobject: 'sd' (00000000062140f2): fill_kobj_path: path  
= '/bus/scsi/drivers/sd'
kobject: 'sr' (00000000ef64c50b): kobject_add_internal: parent: 'drivers',  
set: 'drivers'
kobject: 'sr' (00000000ef64c50b): kobject_uevent_env
kobject: 'sr' (00000000ef64c50b): fill_kobj_path: path  
= '/bus/scsi/drivers/sr'
kobject: 'scsi_generic' (00000000007b57bc): kobject_add_internal:  
parent: 'class', set: 'class'
kobject: 'scsi_generic' (00000000007b57bc): kobject_uevent_env
kobject: 'scsi_generic' (00000000007b57bc): fill_kobj_path: path  
= '/class/scsi_generic'
kobject: 'nvme-wq' (00000000b79e19cd): kobject_add_internal:  
parent: 'workqueue', set: 'devices'
kobject: 'nvme-wq' (00000000b79e19cd): kobject_uevent_env
kobject: 'nvme-wq' (00000000b79e19cd): kobject_uevent_env: uevent_suppress  
caused the event to drop!
kobject: 'nvme-wq' (00000000b79e19cd): kobject_uevent_env
kobject: 'nvme-wq' (00000000b79e19cd): fill_kobj_path: path  
= '/devices/virtual/workqueue/nvme-wq'
kobject: 'nvme-reset-wq' (0000000070597663): kobject_add_internal:  
parent: 'workqueue', set: 'devices'
kobject: 'nvme-reset-wq' (0000000070597663): kobject_uevent_env
kobject: 'nvme-reset-wq' (0000000070597663): kobject_uevent_env:  
uevent_suppress caused the event to drop!
kobject: 'nvme-reset-wq' (0000000070597663): kobject_uevent_env
kobject: 'nvme-reset-wq' (0000000070597663): fill_kobj_path: path  
= '/devices/virtual/workqueue/nvme-reset-wq'
kobject: 'nvme-delete-wq' (00000000c9ed28dd): kobject_add_internal:  
parent: 'workqueue', set: 'devices'
kobject: 'nvme-delete-wq' (00000000c9ed28dd): kobject_uevent_env
kobject: 'nvme-delete-wq' (00000000c9ed28dd): kobject_uevent_env:  
uevent_suppress caused the event to drop!
kobject: 'nvme-delete-wq' (00000000c9ed28dd): kobject_uevent_env
kobject: 'nvme-delete-wq' (00000000c9ed28dd): fill_kobj_path: path  
= '/devices/virtual/workqueue/nvme-delete-wq'


---
This bug is generated by a bot. It may contain errors.
See https://goo.gl/tpsmEJ for more information about syzbot.
syzbot engineers can be reached at syzkaller@googlegroups.com.

syzbot will keep track of this bug report. See:
https://goo.gl/tpsmEJ#status for how to communicate with syzbot.

^ permalink raw reply

* Re: [PATCH 1/3] mm/gup: introduce __put_user_pages()
From: John Hubbard @ 2019-07-23  6:33 UTC (permalink / raw)
  To: Christoph Hellwig, john.hubbard
  Cc: Andrew Morton, Alexander Viro, Björn Töpel,
	Boaz Harrosh, Daniel Vetter, Dan Williams, Dave Chinner,
	David Airlie, David S . Miller, Ilya Dryomov, Jan Kara,
	Jason Gunthorpe, Jens Axboe, Jérôme Glisse,
	Johannes Thumshirn, Magnus Karlsson, Matthew Wilcox,
	Miklos Szeredi, Ming Lei, Sage Weil, Santosh Shilimkar, Yan Zheng,
	netdev, dri-devel, linux-mm, linux-rdma, bpf, LKML
In-Reply-To: <20190723055359.GC17148@lst.de>

On 7/22/19 10:53 PM, Christoph Hellwig wrote:
> On Mon, Jul 22, 2019 at 03:34:13PM -0700, john.hubbard@gmail.com wrote:
>> +enum pup_flags_t {
>> +	PUP_FLAGS_CLEAN		= 0,
>> +	PUP_FLAGS_DIRTY		= 1,
>> +	PUP_FLAGS_LOCK		= 2,
>> +	PUP_FLAGS_DIRTY_LOCK	= 3,
>> +};
> 
> Well, the enum defeats the ease of just being able to pass a boolean
> expression to the function, which would simplify a lot of the caller,
> so if we need to support the !locked version I'd rather see that as
> a separate helper.
> 
> But do we actually have callers where not using the _lock version is
> not a bug?  set_page_dirty makes sense in the context of a file systems
> that have a reference to the inode the page hangs off, but that is
> (almost?) never the case for get_user_pages.
> 

I'm seeing about 18 places where set_page_dirty() is used, in the call site
conversions so far, and about 20 places where set_page_dirty_lock() is
used. So without knowing how many of the former (if any) represent bugs,
you can see why the proposal here supports both DIRTY and DIRTY_LOCK.

Anyway, yes, I could change it, based on your estimation that most of the 
set_page_dirty() calls really should be set_page_dirty_lock().
In that case, we would end up with approximately the following:

/* Here, "dirty" really means, "call set_page_dirty_lock()": */
void __put_user_pages(struct page **pages, unsigned long npages,
		      bool dirty);

/* Here, "dirty" really means, "call set_page_dirty()": */
void __put_user_pages_unlocked(struct page **pages, unsigned long npages,
			       bool dirty);

?


thanks,
-- 
John Hubbard
NVIDIA

^ permalink raw reply

* Re: [bpf-next 0/6] Introduce a BPF helper to generate SYN cookies
From: Eric Dumazet @ 2019-07-23  6:30 UTC (permalink / raw)
  To: Petar Penkov
  Cc: netdev, bpf, David Miller, Alexei Starovoitov, Daniel Borkmann,
	lmb, Stanislav Fomichev, Petar Penkov
In-Reply-To: <20190723002042.105927-1-ppenkov.kernel@gmail.com>

On Tue, Jul 23, 2019 at 2:20 AM Petar Penkov <ppenkov.kernel@gmail.com> wrote:
>
> From: Petar Penkov <ppenkov@google.com>
>
> This patch series introduces a BPF helper function that allows generating SYN
> cookies from BPF. Currently, this helper is enabled at both the TC hook and the
> XDP hook.


Please provide performance numbers ?

We want to know if we increase performance under synflood, or if it
does not change, or even decrease ;)

Thanks.

^ permalink raw reply

* [net-next:master 13/14] drivers/net/ethernet/faraday/ftgmac100.c:777:13: error: 'skb_frag_t {aka struct bio_vec}' has no member named 'size'
From: kbuild test robot @ 2019-07-23  6:22 UTC (permalink / raw)
  To: Matthew Wilcox (Oracle); +Cc: kbuild-all, netdev

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

tree:   https://kernel.googlesource.com/pub/scm/linux/kernel/git/davem/net-next.git master
head:   d5c3a62d0bb9b763e9378fe8f4cd79502e16cce8
commit: 8842d285bafa9ff7719f4107b6545a11dcd41995 [13/14] net: Convert skb_frag_t to bio_vec
config: m68k-allyesconfig (attached as .config)
compiler: m68k-linux-gcc (GCC) 7.4.0
reproduce:
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        git checkout 8842d285bafa9ff7719f4107b6545a11dcd41995
        # save the attached .config to linux build tree
        GCC_VERSION=7.4.0 make.cross ARCH=m68k 

If you fix the issue, kindly add following tag
Reported-by: kbuild test robot <lkp@intel.com>

All errors (new ones prefixed by >>):

   drivers/net/ethernet/faraday/ftgmac100.c: In function 'ftgmac100_hard_start_xmit':
>> drivers/net/ethernet/faraday/ftgmac100.c:777:13: error: 'skb_frag_t {aka struct bio_vec}' has no member named 'size'
      len = frag->size;
                ^~

vim +777 drivers/net/ethernet/faraday/ftgmac100.c

05690d633f309d7 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12   701  
0a715156656bddf drivers/net/ethernet/faraday/ftgmac100.c YueHaibing             2018-09-26   702  static netdev_tx_t ftgmac100_hard_start_xmit(struct sk_buff *skb,
43b25ee712f72ec drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10   703  					     struct net_device *netdev)
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08   704  {
43b25ee712f72ec drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10   705  	struct ftgmac100 *priv = netdev_priv(netdev);
6db7470445f0757 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10   706  	struct ftgmac100_txdes *txdes, *first;
6db7470445f0757 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10   707  	unsigned int pointer, nfrags, len, i, j;
52c0cae8746513e drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10   708  	u32 f_ctl_stat, ctl_stat, csum_vlan;
43b25ee712f72ec drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10   709  	dma_addr_t map;
43b25ee712f72ec drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10   710  
9b0f7711d92bf44 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10   711  	/* The HW doesn't pad small frames */
9b0f7711d92bf44 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10   712  	if (eth_skb_pad(skb)) {
9b0f7711d92bf44 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10   713  		netdev->stats.tx_dropped++;
9b0f7711d92bf44 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10   714  		return NETDEV_TX_OK;
9b0f7711d92bf44 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10   715  	}
9b0f7711d92bf44 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10   716  
9b0f7711d92bf44 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10   717  	/* Reject oversize packets */
43b25ee712f72ec drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10   718  	if (unlikely(skb->len > MAX_PKT_SIZE)) {
43b25ee712f72ec drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10   719  		if (net_ratelimit())
43b25ee712f72ec drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10   720  			netdev_dbg(netdev, "tx packet too big\n");
3e427a3363edbc8 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10   721  		goto drop;
43b25ee712f72ec drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10   722  	}
43b25ee712f72ec drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10   723  
6db7470445f0757 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10   724  	/* Do we have a limit on #fragments ? I yet have to get a reply
6db7470445f0757 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10   725  	 * from Aspeed. If there's one I haven't hit it.
6db7470445f0757 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10   726  	 */
6db7470445f0757 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10   727  	nfrags = skb_shinfo(skb)->nr_frags;
6db7470445f0757 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10   728  
6db7470445f0757 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10   729  	/* Get header len */
6db7470445f0757 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10   730  	len = skb_headlen(skb);
6db7470445f0757 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10   731  
6db7470445f0757 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10   732  	/* Map the packet head */
6db7470445f0757 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10   733  	map = dma_map_single(priv->dev, skb->data, len, DMA_TO_DEVICE);
6db7470445f0757 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10   734  	if (dma_mapping_error(priv->dev, map)) {
43b25ee712f72ec drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10   735  		if (net_ratelimit())
6db7470445f0757 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10   736  			netdev_err(netdev, "map tx packet head failed\n");
3e427a3363edbc8 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10   737  		goto drop;
43b25ee712f72ec drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10   738  	}
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08   739  
83617317d2136ca drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10   740  	/* Grab the next free tx descriptor */
83617317d2136ca drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10   741  	pointer = priv->tx_pointer;
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12   742  	txdes = first = &priv->txdes[pointer];
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08   743  
52c0cae8746513e drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10   744  	/* Setup it up with the packet head. Don't write the head to the
52c0cae8746513e drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10   745  	 * ring just yet
52c0cae8746513e drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10   746  	 */
83617317d2136ca drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10   747  	priv->tx_skbs[pointer] = skb;
52c0cae8746513e drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10   748  	f_ctl_stat = ftgmac100_base_tx_ctlstat(priv, pointer);
52c0cae8746513e drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10   749  	f_ctl_stat |= FTGMAC100_TXDES0_TXDMA_OWN;
52c0cae8746513e drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10   750  	f_ctl_stat |= FTGMAC100_TXDES0_TXBUF_SIZE(len);
52c0cae8746513e drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10   751  	f_ctl_stat |= FTGMAC100_TXDES0_FTS;
52c0cae8746513e drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10   752  	if (nfrags == 0)
52c0cae8746513e drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10   753  		f_ctl_stat |= FTGMAC100_TXDES0_LTS;
52c0cae8746513e drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10   754  	txdes->txdes3 = cpu_to_le32(map);
6db7470445f0757 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10   755  
6db7470445f0757 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10   756  	/* Setup HW checksumming */
52c0cae8746513e drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10   757  	csum_vlan = 0;
05690d633f309d7 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12   758  	if (skb->ip_summed == CHECKSUM_PARTIAL &&
05690d633f309d7 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12   759  	    !ftgmac100_prep_tx_csum(skb, &csum_vlan))
05690d633f309d7 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12   760  		goto drop;
0fb9968876c3866 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18   761  
0fb9968876c3866 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18   762  	/* Add VLAN tag */
0fb9968876c3866 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18   763  	if (skb_vlan_tag_present(skb)) {
0fb9968876c3866 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18   764  		csum_vlan |= FTGMAC100_TXDES1_INS_VLANTAG;
0fb9968876c3866 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18   765  		csum_vlan |= skb_vlan_tag_get(skb) & 0xffff;
0fb9968876c3866 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18   766  	}
0fb9968876c3866 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18   767  
52c0cae8746513e drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10   768  	txdes->txdes1 = cpu_to_le32(csum_vlan);
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08   769  
6db7470445f0757 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10   770  	/* Next descriptor */
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12   771  	pointer = ftgmac100_next_tx_pointer(priv, pointer);
6db7470445f0757 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10   772  
6db7470445f0757 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10   773  	/* Add the fragments */
6db7470445f0757 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10   774  	for (i = 0; i < nfrags; i++) {
6db7470445f0757 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10   775  		skb_frag_t *frag = &skb_shinfo(skb)->frags[i];
6db7470445f0757 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10   776  
6db7470445f0757 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10  @777  		len = frag->size;
6db7470445f0757 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10   778  
6db7470445f0757 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10   779  		/* Map it */
6db7470445f0757 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10   780  		map = skb_frag_dma_map(priv->dev, frag, 0, len,
6db7470445f0757 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10   781  				       DMA_TO_DEVICE);
6db7470445f0757 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10   782  		if (dma_mapping_error(priv->dev, map))
6db7470445f0757 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10   783  			goto dma_err;
6db7470445f0757 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10   784  
6db7470445f0757 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10   785  		/* Setup descriptor */
6db7470445f0757 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10   786  		priv->tx_skbs[pointer] = skb;
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12   787  		txdes = &priv->txdes[pointer];
52c0cae8746513e drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10   788  		ctl_stat = ftgmac100_base_tx_ctlstat(priv, pointer);
52c0cae8746513e drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10   789  		ctl_stat |= FTGMAC100_TXDES0_TXDMA_OWN;
52c0cae8746513e drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10   790  		ctl_stat |= FTGMAC100_TXDES0_TXBUF_SIZE(len);
52c0cae8746513e drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10   791  		if (i == (nfrags - 1))
52c0cae8746513e drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10   792  			ctl_stat |= FTGMAC100_TXDES0_LTS;
52c0cae8746513e drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10   793  		txdes->txdes0 = cpu_to_le32(ctl_stat);
52c0cae8746513e drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10   794  		txdes->txdes1 = 0;
52c0cae8746513e drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10   795  		txdes->txdes3 = cpu_to_le32(map);
52c0cae8746513e drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10   796  
52c0cae8746513e drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10   797  		/* Next one */
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12   798  		pointer = ftgmac100_next_tx_pointer(priv, pointer);
6db7470445f0757 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10   799  	}
6db7470445f0757 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10   800  
4a2712b2f0b6895 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10   801  	/* Order the previous packet and descriptor udpates
52c0cae8746513e drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10   802  	 * before setting the OWN bit on the first descriptor.
4a2712b2f0b6895 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10   803  	 */
4a2712b2f0b6895 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10   804  	dma_wmb();
52c0cae8746513e drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10   805  	first->txdes0 = cpu_to_le32(f_ctl_stat);
6ad3d7edcbdae23 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10   806  
83617317d2136ca drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10   807  	/* Update next TX pointer */
6db7470445f0757 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10   808  	priv->tx_pointer = pointer;
83617317d2136ca drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10   809  
6ad3d7edcbdae23 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10   810  	/* If there isn't enough room for all the fragments of a new packet
6ad3d7edcbdae23 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10   811  	 * in the TX ring, stop the queue. The sequence below is race free
6ad3d7edcbdae23 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10   812  	 * vs. a concurrent restart in ftgmac100_poll()
6ad3d7edcbdae23 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10   813  	 */
6ad3d7edcbdae23 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10   814  	if (unlikely(ftgmac100_tx_buf_avail(priv) < TX_THRESHOLD)) {
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08   815  		netif_stop_queue(netdev);
6ad3d7edcbdae23 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10   816  		/* Order the queue stop with the test below */
6ad3d7edcbdae23 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10   817  		smp_mb();
6ad3d7edcbdae23 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10   818  		if (ftgmac100_tx_buf_avail(priv) >= TX_THRESHOLD)
6ad3d7edcbdae23 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10   819  			netif_wake_queue(netdev);
6ad3d7edcbdae23 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10   820  	}
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08   821  
8eecf7caad8687e drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12   822  	/* Poke transmitter to read the updated TX descriptors */
8eecf7caad8687e drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12   823  	iowrite32(1, priv->base + FTGMAC100_OFFSET_NPTXPD);
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08   824  
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08   825  	return NETDEV_TX_OK;
3e427a3363edbc8 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10   826  
6db7470445f0757 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10   827   dma_err:
6db7470445f0757 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10   828  	if (net_ratelimit())
6db7470445f0757 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10   829  		netdev_err(netdev, "map tx fragment failed\n");
6db7470445f0757 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10   830  
6db7470445f0757 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10   831  	/* Free head */
6db7470445f0757 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10   832  	pointer = priv->tx_pointer;
52c0cae8746513e drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10   833  	ftgmac100_free_tx_packet(priv, pointer, skb, first, f_ctl_stat);
52c0cae8746513e drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10   834  	first->txdes0 = cpu_to_le32(f_ctl_stat & priv->txdes0_edotr_mask);
6db7470445f0757 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10   835  
6db7470445f0757 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10   836  	/* Then all fragments */
6db7470445f0757 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10   837  	for (j = 0; j < i; j++) {
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12   838  		pointer = ftgmac100_next_tx_pointer(priv, pointer);
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12   839  		txdes = &priv->txdes[pointer];
52c0cae8746513e drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10   840  		ctl_stat = le32_to_cpu(txdes->txdes0);
52c0cae8746513e drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10   841  		ftgmac100_free_tx_packet(priv, pointer, skb, txdes, ctl_stat);
52c0cae8746513e drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10   842  		txdes->txdes0 = cpu_to_le32(ctl_stat & priv->txdes0_edotr_mask);
6db7470445f0757 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10   843  	}
6db7470445f0757 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10   844  
6db7470445f0757 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10   845  	/* This cannot be reached if we successfully mapped the
6db7470445f0757 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10   846  	 * last fragment, so we know ftgmac100_free_tx_packet()
6db7470445f0757 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10   847  	 * hasn't freed the skb yet.
6db7470445f0757 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10   848  	 */
3e427a3363edbc8 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10   849   drop:
3e427a3363edbc8 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10   850  	/* Drop the packet */
3e427a3363edbc8 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10   851  	dev_kfree_skb_any(skb);
3e427a3363edbc8 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10   852  	netdev->stats.tx_dropped++;
3e427a3363edbc8 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10   853  
3e427a3363edbc8 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10   854  	return NETDEV_TX_OK;
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08   855  }
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08   856  
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08   857  static void ftgmac100_free_buffers(struct ftgmac100 *priv)
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08   858  {
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08   859  	int i;
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08   860  
87d18757ec1677c drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05   861  	/* Free all RX buffers */
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12   862  	for (i = 0; i < priv->rx_q_entries; i++) {
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12   863  		struct ftgmac100_rxdes *rxdes = &priv->rxdes[i];
7b49cd1c9eca4ac drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-06   864  		struct sk_buff *skb = priv->rx_skbs[i];
4ca24152d891950 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-06   865  		dma_addr_t map = le32_to_cpu(rxdes->rxdes3);
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08   866  
7b49cd1c9eca4ac drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-06   867  		if (!skb)
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08   868  			continue;
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08   869  
7b49cd1c9eca4ac drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-06   870  		priv->rx_skbs[i] = NULL;
7b49cd1c9eca4ac drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-06   871  		dma_unmap_single(priv->dev, map, RX_BUF_SIZE, DMA_FROM_DEVICE);
7b49cd1c9eca4ac drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-06   872  		dev_kfree_skb_any(skb);
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08   873  	}
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08   874  
87d18757ec1677c drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05   875  	/* Free all TX buffers */
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12   876  	for (i = 0; i < priv->tx_q_entries; i++) {
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12   877  		struct ftgmac100_txdes *txdes = &priv->txdes[i];
83617317d2136ca drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10   878  		struct sk_buff *skb = priv->tx_skbs[i];
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08   879  
52c0cae8746513e drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10   880  		if (!skb)
52c0cae8746513e drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10   881  			continue;
52c0cae8746513e drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10   882  		ftgmac100_free_tx_packet(priv, i, skb, txdes,
52c0cae8746513e drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10   883  					 le32_to_cpu(txdes->txdes0));
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08   884  	}
87d18757ec1677c drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05   885  }
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08   886  
87d18757ec1677c drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05   887  static void ftgmac100_free_rings(struct ftgmac100 *priv)
87d18757ec1677c drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05   888  {
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12   889  	/* Free skb arrays */
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12   890  	kfree(priv->rx_skbs);
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12   891  	kfree(priv->tx_skbs);
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12   892  
87d18757ec1677c drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05   893  	/* Free descriptors */
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12   894  	if (priv->rxdes)
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12   895  		dma_free_coherent(priv->dev, MAX_RX_QUEUE_ENTRIES *
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12   896  				  sizeof(struct ftgmac100_rxdes),
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12   897  				  priv->rxdes, priv->rxdes_dma);
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12   898  	priv->rxdes = NULL;
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12   899  
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12   900  	if (priv->txdes)
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12   901  		dma_free_coherent(priv->dev, MAX_TX_QUEUE_ENTRIES *
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12   902  				  sizeof(struct ftgmac100_txdes),
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12   903  				  priv->txdes, priv->txdes_dma);
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12   904  	priv->txdes = NULL;
d72e01a0430f8a1 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-06   905  
d72e01a0430f8a1 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-06   906  	/* Free scratch packet buffer */
d72e01a0430f8a1 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-06   907  	if (priv->rx_scratch)
d72e01a0430f8a1 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-06   908  		dma_free_coherent(priv->dev, RX_BUF_SIZE,
d72e01a0430f8a1 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-06   909  				  priv->rx_scratch, priv->rx_scratch_dma);
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08   910  }
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08   911  
87d18757ec1677c drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05   912  static int ftgmac100_alloc_rings(struct ftgmac100 *priv)
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08   913  {
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12   914  	/* Allocate skb arrays */
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12   915  	priv->rx_skbs = kcalloc(MAX_RX_QUEUE_ENTRIES, sizeof(void *),
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12   916  				GFP_KERNEL);
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12   917  	if (!priv->rx_skbs)
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12   918  		return -ENOMEM;
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12   919  	priv->tx_skbs = kcalloc(MAX_TX_QUEUE_ENTRIES, sizeof(void *),
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12   920  				GFP_KERNEL);
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12   921  	if (!priv->tx_skbs)
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12   922  		return -ENOMEM;
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12   923  
87d18757ec1677c drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05   924  	/* Allocate descriptors */
750afb08ca71310 drivers/net/ethernet/faraday/ftgmac100.c Luis Chamberlain       2019-01-04   925  	priv->rxdes = dma_alloc_coherent(priv->dev,
750afb08ca71310 drivers/net/ethernet/faraday/ftgmac100.c Luis Chamberlain       2019-01-04   926  					 MAX_RX_QUEUE_ENTRIES * sizeof(struct ftgmac100_rxdes),
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12   927  					 &priv->rxdes_dma, GFP_KERNEL);
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12   928  	if (!priv->rxdes)
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12   929  		return -ENOMEM;
750afb08ca71310 drivers/net/ethernet/faraday/ftgmac100.c Luis Chamberlain       2019-01-04   930  	priv->txdes = dma_alloc_coherent(priv->dev,
750afb08ca71310 drivers/net/ethernet/faraday/ftgmac100.c Luis Chamberlain       2019-01-04   931  					 MAX_TX_QUEUE_ENTRIES * sizeof(struct ftgmac100_txdes),
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12   932  					 &priv->txdes_dma, GFP_KERNEL);
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12   933  	if (!priv->txdes)
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08   934  		return -ENOMEM;
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08   935  
d72e01a0430f8a1 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-06   936  	/* Allocate scratch packet buffer */
d72e01a0430f8a1 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-06   937  	priv->rx_scratch = dma_alloc_coherent(priv->dev,
d72e01a0430f8a1 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-06   938  					      RX_BUF_SIZE,
d72e01a0430f8a1 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-06   939  					      &priv->rx_scratch_dma,
d72e01a0430f8a1 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-06   940  					      GFP_KERNEL);
d72e01a0430f8a1 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-06   941  	if (!priv->rx_scratch)
d72e01a0430f8a1 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-06   942  		return -ENOMEM;
d72e01a0430f8a1 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-06   943  
87d18757ec1677c drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05   944  	return 0;
87d18757ec1677c drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05   945  }
87d18757ec1677c drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05   946  
87d18757ec1677c drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05   947  static void ftgmac100_init_rings(struct ftgmac100 *priv)
87d18757ec1677c drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05   948  {
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12   949  	struct ftgmac100_rxdes *rxdes = NULL;
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12   950  	struct ftgmac100_txdes *txdes = NULL;
87d18757ec1677c drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05   951  	int i;
87d18757ec1677c drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05   952  
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12   953  	/* Update entries counts */
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12   954  	priv->rx_q_entries = priv->new_rx_q_entries;
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12   955  	priv->tx_q_entries = priv->new_tx_q_entries;
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12   956  
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12   957  	if (WARN_ON(priv->rx_q_entries < MIN_RX_QUEUE_ENTRIES))
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12   958  		return;
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12   959  
87d18757ec1677c drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05   960  	/* Initialize RX ring */
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12   961  	for (i = 0; i < priv->rx_q_entries; i++) {
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12   962  		rxdes = &priv->rxdes[i];
d72e01a0430f8a1 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-06   963  		rxdes->rxdes0 = 0;
4ca24152d891950 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-06   964  		rxdes->rxdes3 = cpu_to_le32(priv->rx_scratch_dma);
d72e01a0430f8a1 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-06   965  	}
4ca24152d891950 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-06   966  	/* Mark the end of the ring */
4ca24152d891950 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-06   967  	rxdes->rxdes0 |= cpu_to_le32(priv->rxdes0_edorr_mask);
87d18757ec1677c drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05   968  
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12   969  	if (WARN_ON(priv->tx_q_entries < MIN_RX_QUEUE_ENTRIES))
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12   970  		return;
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12   971  
87d18757ec1677c drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05   972  	/* Initialize TX ring */
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12   973  	for (i = 0; i < priv->tx_q_entries; i++) {
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12   974  		txdes = &priv->txdes[i];
52c0cae8746513e drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10   975  		txdes->txdes0 = 0;
52c0cae8746513e drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10   976  	}
52c0cae8746513e drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10   977  	txdes->txdes0 |= cpu_to_le32(priv->txdes0_edotr_mask);
87d18757ec1677c drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05   978  }
87d18757ec1677c drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05   979  
87d18757ec1677c drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05   980  static int ftgmac100_alloc_rx_buffers(struct ftgmac100 *priv)
87d18757ec1677c drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05   981  {
87d18757ec1677c drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05   982  	int i;
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08   983  
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12   984  	for (i = 0; i < priv->rx_q_entries; i++) {
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12   985  		struct ftgmac100_rxdes *rxdes = &priv->rxdes[i];
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08   986  
7b49cd1c9eca4ac drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-06   987  		if (ftgmac100_alloc_rx_buf(priv, i, rxdes, GFP_KERNEL))
87d18757ec1677c drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05   988  			return -ENOMEM;
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08   989  	}
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08   990  	return 0;
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08   991  }
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08   992  
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08   993  static void ftgmac100_adjust_link(struct net_device *netdev)
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08   994  {
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08   995  	struct ftgmac100 *priv = netdev_priv(netdev);
b3c40adcc9891a7 drivers/net/ethernet/faraday/ftgmac100.c Philippe Reynes        2016-05-16   996  	struct phy_device *phydev = netdev->phydev;
7c8e5141ca633ae drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18   997  	bool tx_pause, rx_pause;
51764777354664b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05   998  	int new_speed;
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08   999  
51764777354664b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1000  	/* We store "no link" as speed 0 */
51764777354664b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1001  	if (!phydev->link)
51764777354664b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1002  		new_speed = 0;
51764777354664b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1003  	else
51764777354664b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1004  		new_speed = phydev->speed;
51764777354664b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1005  
7c8e5141ca633ae drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1006  	/* Grab pause settings from PHY if configured to do so */
7c8e5141ca633ae drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1007  	if (priv->aneg_pause) {
7c8e5141ca633ae drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1008  		rx_pause = tx_pause = phydev->pause;
7c8e5141ca633ae drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1009  		if (phydev->asym_pause)
7c8e5141ca633ae drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1010  			tx_pause = !rx_pause;
7c8e5141ca633ae drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1011  	} else {
7c8e5141ca633ae drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1012  		rx_pause = priv->rx_pause;
7c8e5141ca633ae drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1013  		tx_pause = priv->tx_pause;
7c8e5141ca633ae drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1014  	}
7c8e5141ca633ae drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1015  
7c8e5141ca633ae drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1016  	/* Link hasn't changed, do nothing */
51764777354664b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1017  	if (phydev->speed == priv->cur_speed &&
7c8e5141ca633ae drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1018  	    phydev->duplex == priv->cur_duplex &&
7c8e5141ca633ae drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1019  	    rx_pause == priv->rx_pause &&
7c8e5141ca633ae drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1020  	    tx_pause == priv->tx_pause)
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1021  		return;
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1022  
51764777354664b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1023  	/* Print status if we have a link or we had one and just lost it,
51764777354664b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1024  	 * don't print otherwise.
51764777354664b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1025  	 */
51764777354664b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1026  	if (new_speed || priv->cur_speed)
51764777354664b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1027  		phy_print_status(phydev);
51764777354664b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1028  
51764777354664b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1029  	priv->cur_speed = new_speed;
51764777354664b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1030  	priv->cur_duplex = phydev->duplex;
7c8e5141ca633ae drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1031  	priv->rx_pause = rx_pause;
7c8e5141ca633ae drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1032  	priv->tx_pause = tx_pause;
51764777354664b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1033  
51764777354664b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1034  	/* Link is down, do nothing else */
51764777354664b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1035  	if (!new_speed)
51764777354664b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1036  		return;
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1037  
855944ce1cc4037 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1038  	/* Disable all interrupts */
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1039  	iowrite32(0, priv->base + FTGMAC100_OFFSET_IER);
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1040  
855944ce1cc4037 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1041  	/* Reset the adapter asynchronously */
855944ce1cc4037 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1042  	schedule_work(&priv->reset_task);
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1043  }
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1044  
abcc3eb00e10af3 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1045  static int ftgmac100_mii_probe(struct ftgmac100 *priv, phy_interface_t intf)
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1046  {
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1047  	struct net_device *netdev = priv->netdev;
e574f39816f0227 drivers/net/ethernet/faraday/ftgmac100.c Guenter Roeck          2016-01-10  1048  	struct phy_device *phydev;
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1049  
e574f39816f0227 drivers/net/ethernet/faraday/ftgmac100.c Guenter Roeck          2016-01-10  1050  	phydev = phy_find_first(priv->mii_bus);
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1051  	if (!phydev) {
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1052  		netdev_info(netdev, "%s: no PHY found\n", netdev->name);
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1053  		return -ENODEV;
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1054  	}
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1055  
84eff6d194df442 drivers/net/ethernet/faraday/ftgmac100.c Andrew Lunn            2016-01-06  1056  	phydev = phy_connect(netdev, phydev_name(phydev),
abcc3eb00e10af3 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1057  			     &ftgmac100_adjust_link, intf);
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1058  
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1059  	if (IS_ERR(phydev)) {
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1060  		netdev_err(netdev, "%s: Could not attach to PHY\n", netdev->name);
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1061  		return PTR_ERR(phydev);
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1062  	}
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1063  
7c8e5141ca633ae drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1064  	/* Indicate that we support PAUSE frames (see comment in
cb1aaebea8d7986 drivers/net/ethernet/faraday/ftgmac100.c Mauro Carvalho Chehab  2019-06-07  1065  	 * Documentation/networking/phy.rst)
7c8e5141ca633ae drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1066  	 */
af8d9bb2f2f405a drivers/net/ethernet/faraday/ftgmac100.c Andrew Lunn            2018-09-12  1067  	phy_support_asym_pause(phydev);
7c8e5141ca633ae drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1068  
33de693248b4564 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1069  	/* Display what we found */
33de693248b4564 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1070  	phy_attached_info(phydev);
33de693248b4564 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1071  
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1072  	return 0;
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1073  }
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1074  
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1075  static int ftgmac100_mdiobus_read(struct mii_bus *bus, int phy_addr, int regnum)
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1076  {
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1077  	struct net_device *netdev = bus->priv;
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1078  	struct ftgmac100 *priv = netdev_priv(netdev);
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1079  	unsigned int phycr;
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1080  	int i;
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1081  
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1082  	phycr = ioread32(priv->base + FTGMAC100_OFFSET_PHYCR);
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1083  
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1084  	/* preserve MDC cycle threshold */
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1085  	phycr &= FTGMAC100_PHYCR_MDC_CYCTHR_MASK;
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1086  
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1087  	phycr |= FTGMAC100_PHYCR_PHYAD(phy_addr) |
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1088  		 FTGMAC100_PHYCR_REGAD(regnum) |
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1089  		 FTGMAC100_PHYCR_MIIRD;
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1090  
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1091  	iowrite32(phycr, priv->base + FTGMAC100_OFFSET_PHYCR);
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1092  
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1093  	for (i = 0; i < 10; i++) {
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1094  		phycr = ioread32(priv->base + FTGMAC100_OFFSET_PHYCR);
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1095  
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1096  		if ((phycr & FTGMAC100_PHYCR_MIIRD) == 0) {
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1097  			int data;
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1098  
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1099  			data = ioread32(priv->base + FTGMAC100_OFFSET_PHYDATA);
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1100  			return FTGMAC100_PHYDATA_MIIRDATA(data);
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1101  		}
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1102  
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1103  		udelay(100);
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1104  	}
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1105  
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1106  	netdev_err(netdev, "mdio read timed out\n");
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1107  	return -EIO;
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1108  }
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1109  
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1110  static int ftgmac100_mdiobus_write(struct mii_bus *bus, int phy_addr,
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1111  				   int regnum, u16 value)
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1112  {
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1113  	struct net_device *netdev = bus->priv;
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1114  	struct ftgmac100 *priv = netdev_priv(netdev);
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1115  	unsigned int phycr;
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1116  	int data;
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1117  	int i;
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1118  
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1119  	phycr = ioread32(priv->base + FTGMAC100_OFFSET_PHYCR);
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1120  
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1121  	/* preserve MDC cycle threshold */
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1122  	phycr &= FTGMAC100_PHYCR_MDC_CYCTHR_MASK;
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1123  
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1124  	phycr |= FTGMAC100_PHYCR_PHYAD(phy_addr) |
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1125  		 FTGMAC100_PHYCR_REGAD(regnum) |
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1126  		 FTGMAC100_PHYCR_MIIWR;
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1127  
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1128  	data = FTGMAC100_PHYDATA_MIIWDATA(value);
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1129  
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1130  	iowrite32(data, priv->base + FTGMAC100_OFFSET_PHYDATA);
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1131  	iowrite32(phycr, priv->base + FTGMAC100_OFFSET_PHYCR);
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1132  
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1133  	for (i = 0; i < 10; i++) {
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1134  		phycr = ioread32(priv->base + FTGMAC100_OFFSET_PHYCR);
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1135  
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1136  		if ((phycr & FTGMAC100_PHYCR_MIIWR) == 0)
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1137  			return 0;
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1138  
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1139  		udelay(100);
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1140  	}
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1141  
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1142  	netdev_err(netdev, "mdio write timed out\n");
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1143  	return -EIO;
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1144  }
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1145  
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1146  static void ftgmac100_get_drvinfo(struct net_device *netdev,
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1147  				  struct ethtool_drvinfo *info)
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1148  {
7826d43f2db45c9 drivers/net/ethernet/faraday/ftgmac100.c Jiri Pirko             2013-01-06  1149  	strlcpy(info->driver, DRV_NAME, sizeof(info->driver));
7826d43f2db45c9 drivers/net/ethernet/faraday/ftgmac100.c Jiri Pirko             2013-01-06  1150  	strlcpy(info->version, DRV_VERSION, sizeof(info->version));
7826d43f2db45c9 drivers/net/ethernet/faraday/ftgmac100.c Jiri Pirko             2013-01-06  1151  	strlcpy(info->bus_info, dev_name(&netdev->dev), sizeof(info->bus_info));
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1152  }
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1153  
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12  1154  static void ftgmac100_get_ringparam(struct net_device *netdev,
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12  1155  				    struct ethtool_ringparam *ering)
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12  1156  {
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12  1157  	struct ftgmac100 *priv = netdev_priv(netdev);
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12  1158  
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12  1159  	memset(ering, 0, sizeof(*ering));
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12  1160  	ering->rx_max_pending = MAX_RX_QUEUE_ENTRIES;
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12  1161  	ering->tx_max_pending = MAX_TX_QUEUE_ENTRIES;
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12  1162  	ering->rx_pending = priv->rx_q_entries;
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12  1163  	ering->tx_pending = priv->tx_q_entries;
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12  1164  }
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12  1165  
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12  1166  static int ftgmac100_set_ringparam(struct net_device *netdev,
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12  1167  				   struct ethtool_ringparam *ering)
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12  1168  {
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12  1169  	struct ftgmac100 *priv = netdev_priv(netdev);
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12  1170  
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12  1171  	if (ering->rx_pending > MAX_RX_QUEUE_ENTRIES ||
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12  1172  	    ering->tx_pending > MAX_TX_QUEUE_ENTRIES ||
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12  1173  	    ering->rx_pending < MIN_RX_QUEUE_ENTRIES ||
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12  1174  	    ering->tx_pending < MIN_TX_QUEUE_ENTRIES ||
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12  1175  	    !is_power_of_2(ering->rx_pending) ||
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12  1176  	    !is_power_of_2(ering->tx_pending))
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12  1177  		return -EINVAL;
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12  1178  
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12  1179  	priv->new_rx_q_entries = ering->rx_pending;
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12  1180  	priv->new_tx_q_entries = ering->tx_pending;
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12  1181  	if (netif_running(netdev))
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12  1182  		schedule_work(&priv->reset_task);
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12  1183  
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12  1184  	return 0;
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12  1185  }
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12  1186  
7c8e5141ca633ae drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1187  static void ftgmac100_get_pauseparam(struct net_device *netdev,
7c8e5141ca633ae drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1188  				     struct ethtool_pauseparam *pause)
7c8e5141ca633ae drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1189  {
7c8e5141ca633ae drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1190  	struct ftgmac100 *priv = netdev_priv(netdev);
7c8e5141ca633ae drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1191  
7c8e5141ca633ae drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1192  	pause->autoneg = priv->aneg_pause;
7c8e5141ca633ae drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1193  	pause->tx_pause = priv->tx_pause;
7c8e5141ca633ae drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1194  	pause->rx_pause = priv->rx_pause;
7c8e5141ca633ae drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1195  }
7c8e5141ca633ae drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1196  
7c8e5141ca633ae drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1197  static int ftgmac100_set_pauseparam(struct net_device *netdev,
7c8e5141ca633ae drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1198  				    struct ethtool_pauseparam *pause)
7c8e5141ca633ae drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1199  {
7c8e5141ca633ae drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1200  	struct ftgmac100 *priv = netdev_priv(netdev);
7c8e5141ca633ae drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1201  	struct phy_device *phydev = netdev->phydev;
7c8e5141ca633ae drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1202  
7c8e5141ca633ae drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1203  	priv->aneg_pause = pause->autoneg;
7c8e5141ca633ae drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1204  	priv->tx_pause = pause->tx_pause;
7c8e5141ca633ae drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1205  	priv->rx_pause = pause->rx_pause;
7c8e5141ca633ae drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1206  
70814e819c1139e drivers/net/ethernet/faraday/ftgmac100.c Andrew Lunn            2018-09-12  1207  	if (phydev)
70814e819c1139e drivers/net/ethernet/faraday/ftgmac100.c Andrew Lunn            2018-09-12  1208  		phy_set_asym_pause(phydev, pause->rx_pause, pause->tx_pause);
7c8e5141ca633ae drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1209  
7c8e5141ca633ae drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1210  	if (netif_running(netdev)) {
70814e819c1139e drivers/net/ethernet/faraday/ftgmac100.c Andrew Lunn            2018-09-12  1211  		if (!(phydev && priv->aneg_pause))
7c8e5141ca633ae drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1212  			ftgmac100_config_pause(priv);
7c8e5141ca633ae drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1213  	}
7c8e5141ca633ae drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1214  
7c8e5141ca633ae drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1215  	return 0;
7c8e5141ca633ae drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1216  }
7c8e5141ca633ae drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1217  
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1218  static const struct ethtool_ops ftgmac100_ethtool_ops = {
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1219  	.get_drvinfo		= ftgmac100_get_drvinfo,
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1220  	.get_link		= ethtool_op_get_link,
fd24d72ca9b5255 drivers/net/ethernet/faraday/ftgmac100.c Philippe Reynes        2016-05-16  1221  	.get_link_ksettings	= phy_ethtool_get_link_ksettings,
fd24d72ca9b5255 drivers/net/ethernet/faraday/ftgmac100.c Philippe Reynes        2016-05-16  1222  	.set_link_ksettings	= phy_ethtool_set_link_ksettings,
e98233a6192d75d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1223  	.nway_reset		= phy_ethtool_nway_reset,
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12  1224  	.get_ringparam		= ftgmac100_get_ringparam,
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12  1225  	.set_ringparam		= ftgmac100_set_ringparam,
7c8e5141ca633ae drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1226  	.get_pauseparam		= ftgmac100_get_pauseparam,
7c8e5141ca633ae drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1227  	.set_pauseparam		= ftgmac100_set_pauseparam,
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1228  };
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1229  
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1230  static irqreturn_t ftgmac100_interrupt(int irq, void *dev_id)
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1231  {
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1232  	struct net_device *netdev = dev_id;
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1233  	struct ftgmac100 *priv = netdev_priv(netdev);
10cbd640760991b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1234  	unsigned int status, new_mask = FTGMAC100_INT_BAD;
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1235  
10cbd640760991b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1236  	/* Fetch and clear interrupt bits, process abnormal ones */
10cbd640760991b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1237  	status = ioread32(priv->base + FTGMAC100_OFFSET_ISR);
10cbd640760991b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1238  	iowrite32(status, priv->base + FTGMAC100_OFFSET_ISR);
10cbd640760991b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1239  	if (unlikely(status & FTGMAC100_INT_BAD)) {
10cbd640760991b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1240  
10cbd640760991b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1241  		/* RX buffer unavailable */
10cbd640760991b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1242  		if (status & FTGMAC100_INT_NO_RXBUF)
10cbd640760991b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1243  			netdev->stats.rx_over_errors++;
10cbd640760991b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1244  
10cbd640760991b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1245  		/* received packet lost due to RX FIFO full */
10cbd640760991b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1246  		if (status & FTGMAC100_INT_RPKT_LOST)
10cbd640760991b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1247  			netdev->stats.rx_fifo_errors++;
10cbd640760991b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1248  
10cbd640760991b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1249  		/* sent packet lost due to excessive TX collision */
10cbd640760991b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1250  		if (status & FTGMAC100_INT_XPKT_LOST)
10cbd640760991b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1251  			netdev->stats.tx_fifo_errors++;
10cbd640760991b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1252  
10cbd640760991b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1253  		/* AHB error -> Reset the chip */
10cbd640760991b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1254  		if (status & FTGMAC100_INT_AHB_ERR) {
10cbd640760991b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1255  			if (net_ratelimit())
10cbd640760991b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1256  				netdev_warn(netdev,
10cbd640760991b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1257  					   "AHB bus error ! Resetting chip.\n");
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1258  			iowrite32(0, priv->base + FTGMAC100_OFFSET_IER);
10cbd640760991b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1259  			schedule_work(&priv->reset_task);
10cbd640760991b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1260  			return IRQ_HANDLED;
10cbd640760991b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1261  		}
10cbd640760991b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1262  
10cbd640760991b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1263  		/* We may need to restart the MAC after such errors, delay
10cbd640760991b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1264  		 * this until after we have freed some Rx buffers though
10cbd640760991b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1265  		 */
10cbd640760991b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1266  		priv->need_mac_restart = true;
10cbd640760991b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1267  
10cbd640760991b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1268  		/* Disable those errors until we restart */
10cbd640760991b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1269  		new_mask &= ~status;
10cbd640760991b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1270  	}
10cbd640760991b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1271  
10cbd640760991b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1272  	/* Only enable "bad" interrupts while NAPI is on */
10cbd640760991b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1273  	iowrite32(new_mask, priv->base + FTGMAC100_OFFSET_IER);
10cbd640760991b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1274  
10cbd640760991b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1275  	/* Schedule NAPI bh */
10cbd640760991b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1276  	napi_schedule_irqoff(&priv->napi);
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1277  
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1278  	return IRQ_HANDLED;
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1279  }
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1280  
4ca24152d891950 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-06  1281  static bool ftgmac100_check_rx(struct ftgmac100 *priv)
4ca24152d891950 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-06  1282  {
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12  1283  	struct ftgmac100_rxdes *rxdes = &priv->rxdes[priv->rx_pointer];
4ca24152d891950 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-06  1284  
4ca24152d891950 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-06  1285  	/* Do we have a packet ? */
4ca24152d891950 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-06  1286  	return !!(rxdes->rxdes0 & cpu_to_le32(FTGMAC100_RXDES0_RXPKT_RDY));
4ca24152d891950 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-06  1287  }
4ca24152d891950 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-06  1288  
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1289  static int ftgmac100_poll(struct napi_struct *napi, int budget)
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1290  {
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1291  	struct ftgmac100 *priv = container_of(napi, struct ftgmac100, napi);
6ad3d7edcbdae23 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10  1292  	int work_done = 0;
6ad3d7edcbdae23 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10  1293  	bool more;
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1294  
6ad3d7edcbdae23 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10  1295  	/* Handle TX completions */
6ad3d7edcbdae23 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10  1296  	if (ftgmac100_tx_buf_cleanable(priv))
10cbd640760991b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1297  		ftgmac100_tx_complete(priv);
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1298  
6ad3d7edcbdae23 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10  1299  	/* Handle RX packets */
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1300  	do {
6ad3d7edcbdae23 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10  1301  		more = ftgmac100_rx_packet(priv, &work_done);
6ad3d7edcbdae23 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10  1302  	} while (more && work_done < budget);
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1303  
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1304  
10cbd640760991b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1305  	/* The interrupt is telling us to kick the MAC back to life
10cbd640760991b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1306  	 * after an RX overflow
10cbd640760991b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1307  	 */
10cbd640760991b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1308  	if (unlikely(priv->need_mac_restart)) {
10cbd640760991b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1309  		ftgmac100_start_hw(priv);
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1310  
10cbd640760991b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1311  		/* Re-enable "bad" interrupts */
10cbd640760991b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1312  		iowrite32(FTGMAC100_INT_BAD,
10cbd640760991b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1313  			  priv->base + FTGMAC100_OFFSET_IER);
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1314  	}
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1315  
6ad3d7edcbdae23 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10  1316  	/* As long as we are waiting for transmit packets to be
6ad3d7edcbdae23 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10  1317  	 * completed we keep NAPI going
6ad3d7edcbdae23 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10  1318  	 */
6ad3d7edcbdae23 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10  1319  	if (ftgmac100_tx_buf_cleanable(priv))
6ad3d7edcbdae23 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10  1320  		work_done = budget;
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1321  
6ad3d7edcbdae23 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10  1322  	if (work_done < budget) {
10cbd640760991b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1323  		/* We are about to re-enable all interrupts. However
10cbd640760991b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1324  		 * the HW has been latching RX/TX packet interrupts while
10cbd640760991b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1325  		 * they were masked. So we clear them first, then we need
10cbd640760991b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1326  		 * to re-check if there's something to process
10cbd640760991b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1327  		 */
10cbd640760991b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1328  		iowrite32(FTGMAC100_INT_RXTX,
10cbd640760991b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1329  			  priv->base + FTGMAC100_OFFSET_ISR);
ccaf725a1fd7904 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1330  
ccaf725a1fd7904 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1331  		/* Push the above (and provides a barrier vs. subsequent
ccaf725a1fd7904 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1332  		 * reads of the descriptor).
ccaf725a1fd7904 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1333  		 */
ccaf725a1fd7904 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1334  		ioread32(priv->base + FTGMAC100_OFFSET_ISR);
ccaf725a1fd7904 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1335  
ccaf725a1fd7904 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1336  		/* Check RX and TX descriptors for more work to do */
6ad3d7edcbdae23 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10  1337  		if (ftgmac100_check_rx(priv) ||
6ad3d7edcbdae23 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10  1338  		    ftgmac100_tx_buf_cleanable(priv))
10cbd640760991b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1339  			return budget;
10cbd640760991b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1340  
10cbd640760991b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1341  		/* deschedule NAPI */
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1342  		napi_complete(napi);
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1343  
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1344  		/* enable all interrupts */
10cbd640760991b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1345  		iowrite32(FTGMAC100_INT_ALL,
fc6061cf93524c3 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan             2016-07-19  1346  			  priv->base + FTGMAC100_OFFSET_IER);
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1347  	}
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1348  
6ad3d7edcbdae23 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10  1349  	return work_done;
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1350  }
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1351  
da40d9d4b5932d2 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1352  static int ftgmac100_init_all(struct ftgmac100 *priv, bool ignore_alloc_err)
da40d9d4b5932d2 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1353  {
da40d9d4b5932d2 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1354  	int err = 0;
da40d9d4b5932d2 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1355  
da40d9d4b5932d2 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1356  	/* Re-init descriptors (adjust queue sizes) */
da40d9d4b5932d2 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1357  	ftgmac100_init_rings(priv);
da40d9d4b5932d2 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1358  
da40d9d4b5932d2 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1359  	/* Realloc rx descriptors */
da40d9d4b5932d2 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1360  	err = ftgmac100_alloc_rx_buffers(priv);
da40d9d4b5932d2 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1361  	if (err && !ignore_alloc_err)
da40d9d4b5932d2 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1362  		return err;
da40d9d4b5932d2 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1363  
da40d9d4b5932d2 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1364  	/* Reinit and restart HW */
da40d9d4b5932d2 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1365  	ftgmac100_init_hw(priv);
7c8e5141ca633ae drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1366  	ftgmac100_config_pause(priv);
da40d9d4b5932d2 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1367  	ftgmac100_start_hw(priv);
da40d9d4b5932d2 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1368  
da40d9d4b5932d2 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1369  	/* Re-enable the device */
da40d9d4b5932d2 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1370  	napi_enable(&priv->napi);
da40d9d4b5932d2 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1371  	netif_start_queue(priv->netdev);
da40d9d4b5932d2 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1372  
da40d9d4b5932d2 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1373  	/* Enable all interrupts */
10cbd640760991b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1374  	iowrite32(FTGMAC100_INT_ALL, priv->base + FTGMAC100_OFFSET_IER);
da40d9d4b5932d2 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1375  
da40d9d4b5932d2 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1376  	return err;
da40d9d4b5932d2 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1377  }
da40d9d4b5932d2 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1378  
855944ce1cc4037 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1379  static void ftgmac100_reset_task(struct work_struct *work)
855944ce1cc4037 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1380  {
855944ce1cc4037 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1381  	struct ftgmac100 *priv = container_of(work, struct ftgmac100,
855944ce1cc4037 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1382  					      reset_task);
855944ce1cc4037 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1383  	struct net_device *netdev = priv->netdev;
855944ce1cc4037 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1384  	int err;
855944ce1cc4037 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1385  
855944ce1cc4037 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1386  	netdev_dbg(netdev, "Resetting NIC...\n");
855944ce1cc4037 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1387  
855944ce1cc4037 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1388  	/* Lock the world */
855944ce1cc4037 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1389  	rtnl_lock();
855944ce1cc4037 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1390  	if (netdev->phydev)
855944ce1cc4037 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1391  		mutex_lock(&netdev->phydev->lock);
855944ce1cc4037 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1392  	if (priv->mii_bus)
855944ce1cc4037 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1393  		mutex_lock(&priv->mii_bus->mdio_lock);
855944ce1cc4037 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1394  
855944ce1cc4037 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1395  
855944ce1cc4037 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1396  	/* Check if the interface is still up */
855944ce1cc4037 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1397  	if (!netif_running(netdev))
855944ce1cc4037 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1398  		goto bail;
855944ce1cc4037 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1399  
855944ce1cc4037 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1400  	/* Stop the network stack */
855944ce1cc4037 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1401  	netif_trans_update(netdev);
855944ce1cc4037 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1402  	napi_disable(&priv->napi);
855944ce1cc4037 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1403  	netif_tx_disable(netdev);
855944ce1cc4037 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1404  
855944ce1cc4037 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1405  	/* Stop and reset the MAC */
855944ce1cc4037 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1406  	ftgmac100_stop_hw(priv);
874b55bf62330ca drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1407  	err = ftgmac100_reset_and_config_mac(priv);
855944ce1cc4037 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1408  	if (err) {
855944ce1cc4037 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1409  		/* Not much we can do ... it might come back... */
855944ce1cc4037 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1410  		netdev_err(netdev, "attempting to continue...\n");
855944ce1cc4037 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1411  	}
855944ce1cc4037 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1412  
855944ce1cc4037 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1413  	/* Free all rx and tx buffers */
855944ce1cc4037 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1414  	ftgmac100_free_buffers(priv);
855944ce1cc4037 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1415  
855944ce1cc4037 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1416  	/* Setup everything again and restart chip */
855944ce1cc4037 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1417  	ftgmac100_init_all(priv, true);
855944ce1cc4037 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1418  
855944ce1cc4037 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1419  	netdev_dbg(netdev, "Reset done !\n");
855944ce1cc4037 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1420   bail:
855944ce1cc4037 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1421  	if (priv->mii_bus)
855944ce1cc4037 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1422  		mutex_unlock(&priv->mii_bus->mdio_lock);
855944ce1cc4037 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1423  	if (netdev->phydev)
855944ce1cc4037 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1424  		mutex_unlock(&netdev->phydev->lock);
855944ce1cc4037 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1425  	rtnl_unlock();
855944ce1cc4037 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1426  }
855944ce1cc4037 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1427  
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1428  static int ftgmac100_open(struct net_device *netdev)
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1429  {
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1430  	struct ftgmac100 *priv = netdev_priv(netdev);
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1431  	int err;
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1432  
87d18757ec1677c drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1433  	/* Allocate ring buffers  */
87d18757ec1677c drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1434  	err = ftgmac100_alloc_rings(priv);
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1435  	if (err) {
87d18757ec1677c drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1436  		netdev_err(netdev, "Failed to allocate descriptors\n");
87d18757ec1677c drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1437  		return err;
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1438  	}
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1439  
51764777354664b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1440  	/* When using NC-SI we force the speed to 100Mbit/s full duplex,
51764777354664b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1441  	 *
51764777354664b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1442  	 * Otherwise we leave it set to 0 (no link), the link
51764777354664b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1443  	 * message from the PHY layer will handle setting it up to
51764777354664b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1444  	 * something else if needed.
51764777354664b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1445  	 */
51764777354664b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1446  	if (priv->use_ncsi) {
51764777354664b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1447  		priv->cur_duplex = DUPLEX_FULL;
51764777354664b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1448  		priv->cur_speed = SPEED_100;
51764777354664b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1449  	} else {
51764777354664b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1450  		priv->cur_duplex = 0;
51764777354664b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1451  		priv->cur_speed = 0;
51764777354664b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1452  	}
51764777354664b drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1453  
874b55bf62330ca drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1454  	/* Reset the hardware */
874b55bf62330ca drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1455  	err = ftgmac100_reset_and_config_mac(priv);
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1456  	if (err)
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1457  		goto err_hw;
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1458  
b8dbecff9bab825 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1459  	/* Initialize NAPI */
b8dbecff9bab825 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1460  	netif_napi_add(netdev, &priv->napi, ftgmac100_poll, 64);
b8dbecff9bab825 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1461  
81f1eca663c070e drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1462  	/* Grab our interrupt */
81f1eca663c070e drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1463  	err = request_irq(netdev->irq, ftgmac100_interrupt, 0, netdev->name, netdev);
81f1eca663c070e drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1464  	if (err) {
81f1eca663c070e drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1465  		netdev_err(netdev, "failed to request irq %d\n", netdev->irq);
81f1eca663c070e drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1466  		goto err_irq;
81f1eca663c070e drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1467  	}
81f1eca663c070e drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1468  
da40d9d4b5932d2 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1469  	/* Start things up */
da40d9d4b5932d2 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1470  	err = ftgmac100_init_all(priv, false);
da40d9d4b5932d2 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1471  	if (err) {
da40d9d4b5932d2 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1472  		netdev_err(netdev, "Failed to allocate packet buffers\n");
da40d9d4b5932d2 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1473  		goto err_alloc;
da40d9d4b5932d2 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1474  	}
08c9c126004e999 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan             2016-09-22  1475  
da40d9d4b5932d2 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1476  	if (netdev->phydev) {
da40d9d4b5932d2 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1477  		/* If we have a PHY, start polling */
b3c40adcc9891a7 drivers/net/ethernet/faraday/ftgmac100.c Philippe Reynes        2016-05-16  1478  		phy_start(netdev->phydev);
da40d9d4b5932d2 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1479  	} else if (priv->use_ncsi) {
da40d9d4b5932d2 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1480  		/* If using NC-SI, set our carrier on and start the stack */
bd466c3fb5a4ff8 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan             2016-07-19  1481  		netif_carrier_on(netdev);
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1482  
bd466c3fb5a4ff8 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan             2016-07-19  1483  		/* Start the NCSI device */
bd466c3fb5a4ff8 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan             2016-07-19  1484  		err = ncsi_start_dev(priv->ndev);
bd466c3fb5a4ff8 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan             2016-07-19  1485  		if (err)
bd466c3fb5a4ff8 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan             2016-07-19  1486  			goto err_ncsi;
bd466c3fb5a4ff8 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan             2016-07-19  1487  	}
bd466c3fb5a4ff8 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan             2016-07-19  1488  
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1489  	return 0;
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1490  
bd466c3fb5a4ff8 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan             2016-07-19  1491   err_ncsi:
bd466c3fb5a4ff8 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan             2016-07-19  1492  	napi_disable(&priv->napi);
bd466c3fb5a4ff8 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan             2016-07-19  1493  	netif_stop_queue(netdev);
da40d9d4b5932d2 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1494   err_alloc:
da40d9d4b5932d2 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1495  	ftgmac100_free_buffers(priv);
60b28a1167749c5 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1496  	free_irq(netdev->irq, netdev);
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1497   err_irq:
81f1eca663c070e drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1498  	netif_napi_del(&priv->napi);
81f1eca663c070e drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1499   err_hw:
81f1eca663c070e drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1500  	iowrite32(0, priv->base + FTGMAC100_OFFSET_IER);
87d18757ec1677c drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1501  	ftgmac100_free_rings(priv);
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1502  	return err;
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1503  }
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1504  
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1505  static int ftgmac100_stop(struct net_device *netdev)
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1506  {
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1507  	struct ftgmac100 *priv = netdev_priv(netdev);
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1508  
855944ce1cc4037 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1509  	/* Note about the reset task: We are called with the rtnl lock
855944ce1cc4037 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1510  	 * held, so we are synchronized against the core of the reset
855944ce1cc4037 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1511  	 * task. We must not try to synchronously cancel it otherwise
855944ce1cc4037 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1512  	 * we can deadlock. But since it will test for netif_running()
855944ce1cc4037 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1513  	 * which has already been cleared by the net core, we don't
855944ce1cc4037 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1514  	 * anything special to do.
855944ce1cc4037 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1515  	 */
855944ce1cc4037 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1516  
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1517  	/* disable all interrupts */
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1518  	iowrite32(0, priv->base + FTGMAC100_OFFSET_IER);
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1519  
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1520  	netif_stop_queue(netdev);
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1521  	napi_disable(&priv->napi);
b8dbecff9bab825 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1522  	netif_napi_del(&priv->napi);
bd466c3fb5a4ff8 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan             2016-07-19  1523  	if (netdev->phydev)
b3c40adcc9891a7 drivers/net/ethernet/faraday/ftgmac100.c Philippe Reynes        2016-05-16  1524  		phy_stop(netdev->phydev);
2c15f25b2923435 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan             2016-10-04  1525  	else if (priv->use_ncsi)
2c15f25b2923435 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan             2016-10-04  1526  		ncsi_stop_dev(priv->ndev);
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1527  
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1528  	ftgmac100_stop_hw(priv);
60b28a1167749c5 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1529  	free_irq(netdev->irq, netdev);
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1530  	ftgmac100_free_buffers(priv);
87d18757ec1677c drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1531  	ftgmac100_free_rings(priv);
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1532  
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1533  	return 0;
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1534  }
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1535  
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1536  /* optional */
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1537  static int ftgmac100_do_ioctl(struct net_device *netdev, struct ifreq *ifr, int cmd)
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1538  {
bd466c3fb5a4ff8 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan             2016-07-19  1539  	if (!netdev->phydev)
bd466c3fb5a4ff8 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan             2016-07-19  1540  		return -ENXIO;
bd466c3fb5a4ff8 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan             2016-07-19  1541  
b3c40adcc9891a7 drivers/net/ethernet/faraday/ftgmac100.c Philippe Reynes        2016-05-16  1542  	return phy_mii_ioctl(netdev->phydev, ifr, cmd);
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1543  }
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1544  
d3ca8fb180dbec8 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10  1545  static void ftgmac100_tx_timeout(struct net_device *netdev)
d3ca8fb180dbec8 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10  1546  {
d3ca8fb180dbec8 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10  1547  	struct ftgmac100 *priv = netdev_priv(netdev);
d3ca8fb180dbec8 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10  1548  
d3ca8fb180dbec8 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10  1549  	/* Disable all interrupts */
d3ca8fb180dbec8 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10  1550  	iowrite32(0, priv->base + FTGMAC100_OFFSET_IER);
d3ca8fb180dbec8 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10  1551  
d3ca8fb180dbec8 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10  1552  	/* Do the reset outside of interrupt context */
d3ca8fb180dbec8 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10  1553  	schedule_work(&priv->reset_task);
d3ca8fb180dbec8 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10  1554  }
d3ca8fb180dbec8 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10  1555  
0fb9968876c3866 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1556  static int ftgmac100_set_features(struct net_device *netdev,
0fb9968876c3866 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1557  				  netdev_features_t features)
0fb9968876c3866 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1558  {
0fb9968876c3866 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1559  	struct ftgmac100 *priv = netdev_priv(netdev);
0fb9968876c3866 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1560  	netdev_features_t changed = netdev->features ^ features;
0fb9968876c3866 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1561  
0fb9968876c3866 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1562  	if (!netif_running(netdev))
0fb9968876c3866 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1563  		return 0;
0fb9968876c3866 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1564  
0fb9968876c3866 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1565  	/* Update the vlan filtering bit */
0fb9968876c3866 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1566  	if (changed & NETIF_F_HW_VLAN_CTAG_RX) {
0fb9968876c3866 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1567  		u32 maccr;
0fb9968876c3866 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1568  
0fb9968876c3866 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1569  		maccr = ioread32(priv->base + FTGMAC100_OFFSET_MACCR);
0fb9968876c3866 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1570  		if (priv->netdev->features & NETIF_F_HW_VLAN_CTAG_RX)
0fb9968876c3866 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1571  			maccr |= FTGMAC100_MACCR_RM_VLAN;
0fb9968876c3866 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1572  		else
0fb9968876c3866 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1573  			maccr &= ~FTGMAC100_MACCR_RM_VLAN;
0fb9968876c3866 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1574  		iowrite32(maccr, priv->base + FTGMAC100_OFFSET_MACCR);
0fb9968876c3866 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1575  	}
0fb9968876c3866 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1576  
0fb9968876c3866 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1577  	return 0;
0fb9968876c3866 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1578  }
0fb9968876c3866 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1579  
030d9828703ec7e drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1580  #ifdef CONFIG_NET_POLL_CONTROLLER
030d9828703ec7e drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1581  static void ftgmac100_poll_controller(struct net_device *netdev)
030d9828703ec7e drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1582  {
030d9828703ec7e drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1583  	unsigned long flags;
030d9828703ec7e drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1584  
030d9828703ec7e drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1585  	local_irq_save(flags);
030d9828703ec7e drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1586  	ftgmac100_interrupt(netdev->irq, netdev);
030d9828703ec7e drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1587  	local_irq_restore(flags);
030d9828703ec7e drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1588  }
030d9828703ec7e drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1589  #endif
030d9828703ec7e drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1590  
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1591  static const struct net_device_ops ftgmac100_netdev_ops = {
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1592  	.ndo_open		= ftgmac100_open,
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1593  	.ndo_stop		= ftgmac100_stop,
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1594  	.ndo_start_xmit		= ftgmac100_hard_start_xmit,
113ce107afe9799 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan             2016-07-19  1595  	.ndo_set_mac_address	= ftgmac100_set_mac_addr,
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1596  	.ndo_validate_addr	= eth_validate_addr,
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1597  	.ndo_do_ioctl		= ftgmac100_do_ioctl,
d3ca8fb180dbec8 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10  1598  	.ndo_tx_timeout		= ftgmac100_tx_timeout,
f48b3c0d5b6ab4d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1599  	.ndo_set_rx_mode	= ftgmac100_set_rx_mode,
0fb9968876c3866 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1600  	.ndo_set_features	= ftgmac100_set_features,
030d9828703ec7e drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1601  #ifdef CONFIG_NET_POLL_CONTROLLER
030d9828703ec7e drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1602  	.ndo_poll_controller	= ftgmac100_poll_controller,
030d9828703ec7e drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1603  #endif
51564585d8c6de2 drivers/net/ethernet/faraday/ftgmac100.c Samuel Mendoza-Jonas   2017-08-28  1604  	.ndo_vlan_rx_add_vid	= ncsi_vlan_rx_add_vid,
51564585d8c6de2 drivers/net/ethernet/faraday/ftgmac100.c Samuel Mendoza-Jonas   2017-08-28  1605  	.ndo_vlan_rx_kill_vid	= ncsi_vlan_rx_kill_vid,
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1606  };
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1607  
eb4181849f58f31 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan             2016-07-19  1608  static int ftgmac100_setup_mdio(struct net_device *netdev)
eb4181849f58f31 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan             2016-07-19  1609  {
eb4181849f58f31 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan             2016-07-19  1610  	struct ftgmac100 *priv = netdev_priv(netdev);
eb4181849f58f31 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan             2016-07-19  1611  	struct platform_device *pdev = to_platform_device(priv->dev);
abcc3eb00e10af3 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1612  	int phy_intf = PHY_INTERFACE_MODE_RGMII;
abcc3eb00e10af3 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1613  	struct device_node *np = pdev->dev.of_node;
eb4181849f58f31 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan             2016-07-19  1614  	int i, err = 0;
e07dc63ba22df2d drivers/net/ethernet/faraday/ftgmac100.c Joel Stanley           2016-09-22  1615  	u32 reg;
eb4181849f58f31 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan             2016-07-19  1616  
eb4181849f58f31 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan             2016-07-19  1617  	/* initialize mdio bus */
eb4181849f58f31 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan             2016-07-19  1618  	priv->mii_bus = mdiobus_alloc();
eb4181849f58f31 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan             2016-07-19  1619  	if (!priv->mii_bus)
eb4181849f58f31 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan             2016-07-19  1620  		return -EIO;
eb4181849f58f31 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan             2016-07-19  1621  
78d28543a6093fa drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12  1622  	if (priv->is_aspeed) {
e07dc63ba22df2d drivers/net/ethernet/faraday/ftgmac100.c Joel Stanley           2016-09-22  1623  		/* This driver supports the old MDIO interface */
e07dc63ba22df2d drivers/net/ethernet/faraday/ftgmac100.c Joel Stanley           2016-09-22  1624  		reg = ioread32(priv->base + FTGMAC100_OFFSET_REVR);
e07dc63ba22df2d drivers/net/ethernet/faraday/ftgmac100.c Joel Stanley           2016-09-22  1625  		reg &= ~FTGMAC100_REVR_NEW_MDIO_INTERFACE;
e07dc63ba22df2d drivers/net/ethernet/faraday/ftgmac100.c Joel Stanley           2016-09-22  1626  		iowrite32(reg, priv->base + FTGMAC100_OFFSET_REVR);
f819cd926ca7c91 drivers/net/ethernet/faraday/ftgmac100.c YueHaibing             2019-03-01  1627  	}
e07dc63ba22df2d drivers/net/ethernet/faraday/ftgmac100.c Joel Stanley           2016-09-22  1628  
abcc3eb00e10af3 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1629  	/* Get PHY mode from device-tree */
abcc3eb00e10af3 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1630  	if (np) {
abcc3eb00e10af3 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1631  		/* Default to RGMII. It's a gigabit part after all */
abcc3eb00e10af3 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1632  		phy_intf = of_get_phy_mode(np);
abcc3eb00e10af3 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1633  		if (phy_intf < 0)
abcc3eb00e10af3 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1634  			phy_intf = PHY_INTERFACE_MODE_RGMII;
abcc3eb00e10af3 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1635  
abcc3eb00e10af3 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1636  		/* Aspeed only supports these. I don't know about other IP
abcc3eb00e10af3 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1637  		 * block vendors so I'm going to just let them through for
abcc3eb00e10af3 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1638  		 * now. Note that this is only a warning if for some obscure
abcc3eb00e10af3 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1639  		 * reason the DT really means to lie about it or it's a newer
abcc3eb00e10af3 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1640  		 * part we don't know about.
abcc3eb00e10af3 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1641  		 *
abcc3eb00e10af3 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1642  		 * On the Aspeed SoC there are additionally straps and SCU
abcc3eb00e10af3 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1643  		 * control bits that could tell us what the interface is
abcc3eb00e10af3 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1644  		 * (or allow us to configure it while the IP block is held
abcc3eb00e10af3 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1645  		 * in reset). For now I chose to keep this driver away from
abcc3eb00e10af3 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1646  		 * those SoC specific bits and assume the device-tree is
abcc3eb00e10af3 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1647  		 * right and the SCU has been configured properly by pinmux
abcc3eb00e10af3 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1648  		 * or the firmware.
abcc3eb00e10af3 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1649  		 */
abcc3eb00e10af3 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1650  		if (priv->is_aspeed &&
abcc3eb00e10af3 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1651  		    phy_intf != PHY_INTERFACE_MODE_RMII &&
abcc3eb00e10af3 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1652  		    phy_intf != PHY_INTERFACE_MODE_RGMII &&
abcc3eb00e10af3 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1653  		    phy_intf != PHY_INTERFACE_MODE_RGMII_ID &&
abcc3eb00e10af3 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1654  		    phy_intf != PHY_INTERFACE_MODE_RGMII_RXID &&
abcc3eb00e10af3 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1655  		    phy_intf != PHY_INTERFACE_MODE_RGMII_TXID) {
abcc3eb00e10af3 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1656  			netdev_warn(netdev,
abcc3eb00e10af3 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1657  				   "Unsupported PHY mode %s !\n",
abcc3eb00e10af3 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1658  				   phy_modes(phy_intf));
abcc3eb00e10af3 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1659  		}
abcc3eb00e10af3 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1660  	}
abcc3eb00e10af3 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1661  
eb4181849f58f31 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan             2016-07-19  1662  	priv->mii_bus->name = "ftgmac100_mdio";
eb4181849f58f31 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan             2016-07-19  1663  	snprintf(priv->mii_bus->id, MII_BUS_ID_SIZE, "%s-%d",
eb4181849f58f31 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan             2016-07-19  1664  		 pdev->name, pdev->id);
d57b9db1ae0cde3 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-07-24  1665  	priv->mii_bus->parent = priv->dev;
eb4181849f58f31 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan             2016-07-19  1666  	priv->mii_bus->priv = priv->netdev;
eb4181849f58f31 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan             2016-07-19  1667  	priv->mii_bus->read = ftgmac100_mdiobus_read;
eb4181849f58f31 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan             2016-07-19  1668  	priv->mii_bus->write = ftgmac100_mdiobus_write;
eb4181849f58f31 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan             2016-07-19  1669  
eb4181849f58f31 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan             2016-07-19  1670  	for (i = 0; i < PHY_MAX_ADDR; i++)
eb4181849f58f31 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan             2016-07-19  1671  		priv->mii_bus->irq[i] = PHY_POLL;
eb4181849f58f31 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan             2016-07-19  1672  
eb4181849f58f31 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan             2016-07-19  1673  	err = mdiobus_register(priv->mii_bus);
eb4181849f58f31 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan             2016-07-19  1674  	if (err) {
eb4181849f58f31 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan             2016-07-19  1675  		dev_err(priv->dev, "Cannot register MDIO bus!\n");
eb4181849f58f31 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan             2016-07-19  1676  		goto err_register_mdiobus;
eb4181849f58f31 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan             2016-07-19  1677  	}
eb4181849f58f31 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan             2016-07-19  1678  
abcc3eb00e10af3 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1679  	err = ftgmac100_mii_probe(priv, phy_intf);
eb4181849f58f31 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan             2016-07-19  1680  	if (err) {
eb4181849f58f31 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan             2016-07-19  1681  		dev_err(priv->dev, "MII Probe failed!\n");
eb4181849f58f31 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan             2016-07-19  1682  		goto err_mii_probe;
eb4181849f58f31 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan             2016-07-19  1683  	}
eb4181849f58f31 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan             2016-07-19  1684  
eb4181849f58f31 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan             2016-07-19  1685  	return 0;
eb4181849f58f31 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan             2016-07-19  1686  
eb4181849f58f31 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan             2016-07-19  1687  err_mii_probe:
eb4181849f58f31 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan             2016-07-19  1688  	mdiobus_unregister(priv->mii_bus);
eb4181849f58f31 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan             2016-07-19  1689  err_register_mdiobus:
eb4181849f58f31 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan             2016-07-19  1690  	mdiobus_free(priv->mii_bus);
eb4181849f58f31 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan             2016-07-19  1691  	return err;
eb4181849f58f31 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan             2016-07-19  1692  }
eb4181849f58f31 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan             2016-07-19  1693  
eb4181849f58f31 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan             2016-07-19  1694  static void ftgmac100_destroy_mdio(struct net_device *netdev)
eb4181849f58f31 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan             2016-07-19  1695  {
eb4181849f58f31 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan             2016-07-19  1696  	struct ftgmac100 *priv = netdev_priv(netdev);
eb4181849f58f31 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan             2016-07-19  1697  
eb4181849f58f31 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan             2016-07-19  1698  	if (!netdev->phydev)
eb4181849f58f31 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan             2016-07-19  1699  		return;
eb4181849f58f31 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan             2016-07-19  1700  
eb4181849f58f31 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan             2016-07-19  1701  	phy_disconnect(netdev->phydev);
eb4181849f58f31 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan             2016-07-19  1702  	mdiobus_unregister(priv->mii_bus);
eb4181849f58f31 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan             2016-07-19  1703  	mdiobus_free(priv->mii_bus);
eb4181849f58f31 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan             2016-07-19  1704  }
eb4181849f58f31 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan             2016-07-19  1705  
bd466c3fb5a4ff8 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan             2016-07-19  1706  static void ftgmac100_ncsi_handler(struct ncsi_dev *nd)
bd466c3fb5a4ff8 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan             2016-07-19  1707  {
bd466c3fb5a4ff8 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan             2016-07-19  1708  	if (unlikely(nd->state != ncsi_dev_state_functional))
bd466c3fb5a4ff8 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan             2016-07-19  1709  		return;
bd466c3fb5a4ff8 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan             2016-07-19  1710  
87975a0117815b9 drivers/net/ethernet/faraday/ftgmac100.c Joel Stanley           2018-06-19  1711  	netdev_dbg(nd->dev, "NCSI interface %s\n",
bd466c3fb5a4ff8 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan             2016-07-19  1712  		   nd->link_up ? "up" : "down");
bd466c3fb5a4ff8 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan             2016-07-19  1713  }
bd466c3fb5a4ff8 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan             2016-07-19  1714  
4b70c62b9eafcee drivers/net/ethernet/faraday/ftgmac100.c Joel Stanley           2017-10-13  1715  static void ftgmac100_setup_clk(struct ftgmac100 *priv)
4b70c62b9eafcee drivers/net/ethernet/faraday/ftgmac100.c Joel Stanley           2017-10-13  1716  {
4b70c62b9eafcee drivers/net/ethernet/faraday/ftgmac100.c Joel Stanley           2017-10-13  1717  	priv->clk = devm_clk_get(priv->dev, NULL);
4b70c62b9eafcee drivers/net/ethernet/faraday/ftgmac100.c Joel Stanley           2017-10-13  1718  	if (IS_ERR(priv->clk))
4b70c62b9eafcee drivers/net/ethernet/faraday/ftgmac100.c Joel Stanley           2017-10-13  1719  		return;
4b70c62b9eafcee drivers/net/ethernet/faraday/ftgmac100.c Joel Stanley           2017-10-13  1720  
4b70c62b9eafcee drivers/net/ethernet/faraday/ftgmac100.c Joel Stanley           2017-10-13  1721  	clk_prepare_enable(priv->clk);
4b70c62b9eafcee drivers/net/ethernet/faraday/ftgmac100.c Joel Stanley           2017-10-13  1722  
4b70c62b9eafcee drivers/net/ethernet/faraday/ftgmac100.c Joel Stanley           2017-10-13  1723  	/* Aspeed specifies a 100MHz clock is required for up to
4b70c62b9eafcee drivers/net/ethernet/faraday/ftgmac100.c Joel Stanley           2017-10-13  1724  	 * 1000Mbit link speeds. As NCSI is limited to 100Mbit, 25MHz
4b70c62b9eafcee drivers/net/ethernet/faraday/ftgmac100.c Joel Stanley           2017-10-13  1725  	 * is sufficient
4b70c62b9eafcee drivers/net/ethernet/faraday/ftgmac100.c Joel Stanley           2017-10-13  1726  	 */
4b70c62b9eafcee drivers/net/ethernet/faraday/ftgmac100.c Joel Stanley           2017-10-13  1727  	clk_set_rate(priv->clk, priv->use_ncsi ? FTGMAC_25MHZ :
4b70c62b9eafcee drivers/net/ethernet/faraday/ftgmac100.c Joel Stanley           2017-10-13  1728  			FTGMAC_100MHZ);
4b70c62b9eafcee drivers/net/ethernet/faraday/ftgmac100.c Joel Stanley           2017-10-13  1729  }
4b70c62b9eafcee drivers/net/ethernet/faraday/ftgmac100.c Joel Stanley           2017-10-13  1730  
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1731  static int ftgmac100_probe(struct platform_device *pdev)
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1732  {
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1733  	struct resource *res;
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1734  	int irq;
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1735  	struct net_device *netdev;
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1736  	struct ftgmac100 *priv;
78d28543a6093fa drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12  1737  	struct device_node *np;
bd466c3fb5a4ff8 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan             2016-07-19  1738  	int err = 0;
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1739  
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1740  	if (!pdev)
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1741  		return -ENODEV;
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1742  
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1743  	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1744  	if (!res)
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1745  		return -ENXIO;
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1746  
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1747  	irq = platform_get_irq(pdev, 0);
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1748  	if (irq < 0)
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1749  		return irq;
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1750  
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1751  	/* setup net_device */
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1752  	netdev = alloc_etherdev(sizeof(*priv));
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1753  	if (!netdev) {
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1754  		err = -ENOMEM;
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1755  		goto err_alloc_etherdev;
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1756  	}
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1757  
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1758  	SET_NETDEV_DEV(netdev, &pdev->dev);
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1759  
7ad24ea4bf620a3 drivers/net/ethernet/faraday/ftgmac100.c Wilfried Klaebe        2014-05-11  1760  	netdev->ethtool_ops = &ftgmac100_ethtool_ops;
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1761  	netdev->netdev_ops = &ftgmac100_netdev_ops;
d3ca8fb180dbec8 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-10  1762  	netdev->watchdog_timeo = 5 * HZ;
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1763  
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1764  	platform_set_drvdata(pdev, netdev);
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1765  
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1766  	/* setup private data */
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1767  	priv = netdev_priv(netdev);
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1768  	priv->netdev = netdev;
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1769  	priv->dev = &pdev->dev;
855944ce1cc4037 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1770  	INIT_WORK(&priv->reset_task, ftgmac100_reset_task);
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1771  
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1772  	/* map io memory */
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1773  	priv->res = request_mem_region(res->start, resource_size(res),
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1774  				       dev_name(&pdev->dev));
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1775  	if (!priv->res) {
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1776  		dev_err(&pdev->dev, "Could not reserve memory region\n");
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1777  		err = -ENOMEM;
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1778  		goto err_req_mem;
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1779  	}
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1780  
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1781  	priv->base = ioremap(res->start, resource_size(res));
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1782  	if (!priv->base) {
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1783  		dev_err(&pdev->dev, "Failed to ioremap ethernet registers\n");
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1784  		err = -EIO;
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1785  		goto err_ioremap;
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1786  	}
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1787  
60b28a1167749c5 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1788  	netdev->irq = irq;
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1789  
7c8e5141ca633ae drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1790  	/* Enable pause */
7c8e5141ca633ae drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1791  	priv->tx_pause = true;
7c8e5141ca633ae drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1792  	priv->rx_pause = true;
7c8e5141ca633ae drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1793  	priv->aneg_pause = true;
7c8e5141ca633ae drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1794  
113ce107afe9799 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan             2016-07-19  1795  	/* MAC address from chip or random one */
ba1b1234d6a3ecb drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12  1796  	ftgmac100_initial_mac(priv);
113ce107afe9799 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan             2016-07-19  1797  
78d28543a6093fa drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12  1798  	np = pdev->dev.of_node;
78d28543a6093fa drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12  1799  	if (np && (of_device_is_compatible(np, "aspeed,ast2400-mac") ||
78d28543a6093fa drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12  1800  		   of_device_is_compatible(np, "aspeed,ast2500-mac"))) {
2a0ab8ebbec6341 drivers/net/ethernet/faraday/ftgmac100.c Joel Stanley           2016-09-22  1801  		priv->rxdes0_edorr_mask = BIT(30);
2a0ab8ebbec6341 drivers/net/ethernet/faraday/ftgmac100.c Joel Stanley           2016-09-22  1802  		priv->txdes0_edotr_mask = BIT(30);
78d28543a6093fa drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12  1803  		priv->is_aspeed = true;
2a0ab8ebbec6341 drivers/net/ethernet/faraday/ftgmac100.c Joel Stanley           2016-09-22  1804  	} else {
2a0ab8ebbec6341 drivers/net/ethernet/faraday/ftgmac100.c Joel Stanley           2016-09-22  1805  		priv->rxdes0_edorr_mask = BIT(15);
2a0ab8ebbec6341 drivers/net/ethernet/faraday/ftgmac100.c Joel Stanley           2016-09-22  1806  		priv->txdes0_edotr_mask = BIT(15);
2a0ab8ebbec6341 drivers/net/ethernet/faraday/ftgmac100.c Joel Stanley           2016-09-22  1807  	}
2a0ab8ebbec6341 drivers/net/ethernet/faraday/ftgmac100.c Joel Stanley           2016-09-22  1808  
78d28543a6093fa drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12  1809  	if (np && of_get_property(np, "use-ncsi", NULL)) {
bd466c3fb5a4ff8 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan             2016-07-19  1810  		if (!IS_ENABLED(CONFIG_NET_NCSI)) {
bd466c3fb5a4ff8 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan             2016-07-19  1811  			dev_err(&pdev->dev, "NCSI stack not enabled\n");
bd466c3fb5a4ff8 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan             2016-07-19  1812  			goto err_ncsi_dev;
bd466c3fb5a4ff8 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan             2016-07-19  1813  		}
bd466c3fb5a4ff8 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan             2016-07-19  1814  
bd466c3fb5a4ff8 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan             2016-07-19  1815  		dev_info(&pdev->dev, "Using NCSI interface\n");
bd466c3fb5a4ff8 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan             2016-07-19  1816  		priv->use_ncsi = true;
bd466c3fb5a4ff8 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan             2016-07-19  1817  		priv->ndev = ncsi_register_dev(netdev, ftgmac100_ncsi_handler);
bd466c3fb5a4ff8 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan             2016-07-19  1818  		if (!priv->ndev)
bd466c3fb5a4ff8 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan             2016-07-19  1819  			goto err_ncsi_dev;
bd466c3fb5a4ff8 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan             2016-07-19  1820  	} else {
bd466c3fb5a4ff8 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan             2016-07-19  1821  		priv->use_ncsi = false;
eb4181849f58f31 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan             2016-07-19  1822  		err = ftgmac100_setup_mdio(netdev);
eb4181849f58f31 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan             2016-07-19  1823  		if (err)
eb4181849f58f31 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan             2016-07-19  1824  			goto err_setup_mdio;
bd466c3fb5a4ff8 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan             2016-07-19  1825  	}
bd466c3fb5a4ff8 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan             2016-07-19  1826  
4b70c62b9eafcee drivers/net/ethernet/faraday/ftgmac100.c Joel Stanley           2017-10-13  1827  	if (priv->is_aspeed)
4b70c62b9eafcee drivers/net/ethernet/faraday/ftgmac100.c Joel Stanley           2017-10-13  1828  		ftgmac100_setup_clk(priv);
4b70c62b9eafcee drivers/net/ethernet/faraday/ftgmac100.c Joel Stanley           2017-10-13  1829  
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12  1830  	/* Default ring sizes */
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12  1831  	priv->rx_q_entries = priv->new_rx_q_entries = DEF_RX_QUEUE_ENTRIES;
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12  1832  	priv->tx_q_entries = priv->new_tx_q_entries = DEF_TX_QUEUE_ENTRIES;
52d9138fb31ac2d drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12  1833  
6aff0bf641cf69e drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12  1834  	/* Base feature set */
8c3ed1315e129e9 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12  1835  	netdev->hw_features = NETIF_F_RXCSUM | NETIF_F_HW_CSUM |
0fb9968876c3866 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1836  		NETIF_F_GRO | NETIF_F_SG | NETIF_F_HW_VLAN_CTAG_RX |
0fb9968876c3866 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-18  1837  		NETIF_F_HW_VLAN_CTAG_TX;
6aff0bf641cf69e drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12  1838  
51564585d8c6de2 drivers/net/ethernet/faraday/ftgmac100.c Samuel Mendoza-Jonas   2017-08-28  1839  	if (priv->use_ncsi)
51564585d8c6de2 drivers/net/ethernet/faraday/ftgmac100.c Samuel Mendoza-Jonas   2017-08-28  1840  		netdev->hw_features |= NETIF_F_HW_VLAN_CTAG_FILTER;
51564585d8c6de2 drivers/net/ethernet/faraday/ftgmac100.c Samuel Mendoza-Jonas   2017-08-28  1841  
6aff0bf641cf69e drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12  1842  	/* AST2400  doesn't have working HW checksum generation */
6aff0bf641cf69e drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12  1843  	if (np && (of_device_is_compatible(np, "aspeed,ast2400-mac")))
8c3ed1315e129e9 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12  1844  		netdev->hw_features &= ~NETIF_F_HW_CSUM;
6aff0bf641cf69e drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12  1845  	if (np && of_get_property(np, "no-hw-checksum", NULL))
8c3ed1315e129e9 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12  1846  		netdev->hw_features &= ~(NETIF_F_HW_CSUM | NETIF_F_RXCSUM);
8c3ed1315e129e9 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-12  1847  	netdev->features |= netdev->hw_features;
bd466c3fb5a4ff8 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan             2016-07-19  1848  
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1849  	/* register network device */
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1850  	err = register_netdev(netdev);
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1851  	if (err) {
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1852  		dev_err(&pdev->dev, "Failed to register netdev\n");
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1853  		goto err_register_netdev;
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1854  	}
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1855  
60b28a1167749c5 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1856  	netdev_info(netdev, "irq %d, mapped at %p\n", netdev->irq, priv->base);
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1857  
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1858  	return 0;
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1859  
bd466c3fb5a4ff8 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan             2016-07-19  1860  err_ncsi_dev:
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1861  err_register_netdev:
eb4181849f58f31 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan             2016-07-19  1862  	ftgmac100_destroy_mdio(netdev);
eb4181849f58f31 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan             2016-07-19  1863  err_setup_mdio:
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1864  	iounmap(priv->base);
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1865  err_ioremap:
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1866  	release_resource(priv->res);
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1867  err_req_mem:
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1868  	free_netdev(netdev);
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1869  err_alloc_etherdev:
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1870  	return err;
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1871  }
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1872  
be12502e2e64854 drivers/net/ethernet/faraday/ftgmac100.c Dmitry Torokhov        2017-03-01  1873  static int ftgmac100_remove(struct platform_device *pdev)
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1874  {
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1875  	struct net_device *netdev;
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1876  	struct ftgmac100 *priv;
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1877  
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1878  	netdev = platform_get_drvdata(pdev);
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1879  	priv = netdev_priv(netdev);
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1880  
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1881  	unregister_netdev(netdev);
855944ce1cc4037 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1882  
4b70c62b9eafcee drivers/net/ethernet/faraday/ftgmac100.c Joel Stanley           2017-10-13  1883  	clk_disable_unprepare(priv->clk);
4b70c62b9eafcee drivers/net/ethernet/faraday/ftgmac100.c Joel Stanley           2017-10-13  1884  
855944ce1cc4037 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1885  	/* There's a small chance the reset task will have been re-queued,
855944ce1cc4037 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1886  	 * during stop, make sure it's gone before we free the structure.
855944ce1cc4037 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1887  	 */
855944ce1cc4037 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1888  	cancel_work_sync(&priv->reset_task);
855944ce1cc4037 drivers/net/ethernet/faraday/ftgmac100.c Benjamin Herrenschmidt 2017-04-05  1889  
eb4181849f58f31 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan             2016-07-19  1890  	ftgmac100_destroy_mdio(netdev);
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1891  
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1892  	iounmap(priv->base);
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1893  	release_resource(priv->res);
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1894  
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1895  	netif_napi_del(&priv->napi);
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1896  	free_netdev(netdev);
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1897  	return 0;
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1898  }
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1899  
bb168e2e9e512e6 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan             2016-07-19  1900  static const struct of_device_id ftgmac100_of_match[] = {
bb168e2e9e512e6 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan             2016-07-19  1901  	{ .compatible = "faraday,ftgmac100" },
bb168e2e9e512e6 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan             2016-07-19  1902  	{ }
bb168e2e9e512e6 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan             2016-07-19  1903  };
bb168e2e9e512e6 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan             2016-07-19  1904  MODULE_DEVICE_TABLE(of, ftgmac100_of_match);
bb168e2e9e512e6 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan             2016-07-19  1905  
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1906  static struct platform_driver ftgmac100_driver = {
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1907  	.probe	= ftgmac100_probe,
be12502e2e64854 drivers/net/ethernet/faraday/ftgmac100.c Dmitry Torokhov        2017-03-01  1908  	.remove	= ftgmac100_remove,
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1909  	.driver	= {
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1910  		.name		= DRV_NAME,
bb168e2e9e512e6 drivers/net/ethernet/faraday/ftgmac100.c Gavin Shan             2016-07-19  1911  		.of_match_table	= ftgmac100_of_match,
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1912  	},
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1913  };
14f645d0deb4d18 drivers/net/ethernet/faraday/ftgmac100.c Sachin Kamat           2013-03-18  1914  module_platform_driver(ftgmac100_driver);
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1915  
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1916  MODULE_AUTHOR("Po-Yu Chuang <ratbert@faraday-tech.com>");
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1917  MODULE_DESCRIPTION("FTGMAC100 driver");
69785b79ca9b1ac drivers/net/ftgmac100.c                  Po-Yu Chuang           2011-06-08  1918  MODULE_LICENSE("GPL");

:::::: The code at line 777 was first introduced by commit
:::::: 6db7470445f0757d2e8f23f57d86611338717ebe ftgmac100: Add support for fragmented tx

:::::: TO: Benjamin Herrenschmidt <benh@kernel.crashing.org>
:::::: CC: David S. Miller <davem@davemloft.net>

---
0-DAY kernel test infrastructure                Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all                   Intel Corporation

[-- Attachment #2: .config.gz --]
[-- Type: application/gzip, Size: 51198 bytes --]

^ permalink raw reply

* [PATCH net-next] qlge: Move drivers/net/ethernet/qlogic/qlge/ to drivers/staging/qlge/
From: Benjamin Poirier @ 2019-07-23  6:14 UTC (permalink / raw)
  To: David Miller; +Cc: Greg Kroah-Hartman, Manish Chopra, GR-Linux-NIC-Dev, netdev

The hardware has been declared EOL by the vendor more than 5 years ago.
What's more relevant to the Linux kernel is that the quality of this driver
is not on par with many other mainline drivers.

Cc: Manish Chopra <manishc@marvell.com>
Message-id: <20190617074858.32467-1-bpoirier@suse.com>
Signed-off-by: Benjamin Poirier <bpoirier@suse.com>
---
 Documentation/PCI/pci-error-recovery.rst      |  1 -
 MAINTAINERS                                   |  2 +-
 drivers/net/ethernet/qlogic/Kconfig           |  9 ----
 drivers/net/ethernet/qlogic/Makefile          |  1 -
 drivers/staging/Kconfig                       |  2 +
 drivers/staging/Makefile                      |  1 +
 drivers/staging/qlge/Kconfig                  | 10 ++++
 .../ethernet/qlogic => staging}/qlge/Makefile |  0
 drivers/staging/qlge/TODO                     | 46 +++++++++++++++++++
 .../ethernet/qlogic => staging}/qlge/qlge.h   |  0
 .../qlogic => staging}/qlge/qlge_dbg.c        |  0
 .../qlogic => staging}/qlge/qlge_ethtool.c    |  0
 .../qlogic => staging}/qlge/qlge_main.c       |  0
 .../qlogic => staging}/qlge/qlge_mpi.c        |  0
 14 files changed, 60 insertions(+), 12 deletions(-)
 create mode 100644 drivers/staging/qlge/Kconfig
 rename drivers/{net/ethernet/qlogic => staging}/qlge/Makefile (100%)
 create mode 100644 drivers/staging/qlge/TODO
 rename drivers/{net/ethernet/qlogic => staging}/qlge/qlge.h (100%)
 rename drivers/{net/ethernet/qlogic => staging}/qlge/qlge_dbg.c (100%)
 rename drivers/{net/ethernet/qlogic => staging}/qlge/qlge_ethtool.c (100%)
 rename drivers/{net/ethernet/qlogic => staging}/qlge/qlge_main.c (100%)
 rename drivers/{net/ethernet/qlogic => staging}/qlge/qlge_mpi.c (100%)

diff --git a/Documentation/PCI/pci-error-recovery.rst b/Documentation/PCI/pci-error-recovery.rst
index 83db42092935..7e30f43a9659 100644
--- a/Documentation/PCI/pci-error-recovery.rst
+++ b/Documentation/PCI/pci-error-recovery.rst
@@ -421,4 +421,3 @@ That is, the recovery API only requires that:
    - drivers/net/ixgbe
    - drivers/net/cxgb3
    - drivers/net/s2io.c
-   - drivers/net/qlge
diff --git a/MAINTAINERS b/MAINTAINERS
index 783569e3c4b4..9bca7781d67e 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -13217,7 +13217,7 @@ M:	Manish Chopra <manishc@marvell.com>
 M:	GR-Linux-NIC-Dev@marvell.com
 L:	netdev@vger.kernel.org
 S:	Supported
-F:	drivers/net/ethernet/qlogic/qlge/
+F:	drivers/staging/qlge/
 
 QM1D1B0004 MEDIA DRIVER
 M:	Akihiro Tsukada <tskd08@gmail.com>
diff --git a/drivers/net/ethernet/qlogic/Kconfig b/drivers/net/ethernet/qlogic/Kconfig
index a391cf6ee4b2..55a29ec76680 100644
--- a/drivers/net/ethernet/qlogic/Kconfig
+++ b/drivers/net/ethernet/qlogic/Kconfig
@@ -66,15 +66,6 @@ config QLCNIC_HWMON
 
 	  This data is available via the hwmon sysfs interface.
 
-config QLGE
-	tristate "QLogic QLGE 10Gb Ethernet Driver Support"
-	depends on PCI
-	---help---
-	  This driver supports QLogic ISP8XXX 10Gb Ethernet cards.
-
-	  To compile this driver as a module, choose M here: the module
-	  will be called qlge.
-
 config NETXEN_NIC
 	tristate "NetXen Multi port (1/10) Gigabit Ethernet NIC"
 	depends on PCI
diff --git a/drivers/net/ethernet/qlogic/Makefile b/drivers/net/ethernet/qlogic/Makefile
index 6cd2e333a5fc..1ae4a0743bd5 100644
--- a/drivers/net/ethernet/qlogic/Makefile
+++ b/drivers/net/ethernet/qlogic/Makefile
@@ -5,7 +5,6 @@
 
 obj-$(CONFIG_QLA3XXX) += qla3xxx.o
 obj-$(CONFIG_QLCNIC) += qlcnic/
-obj-$(CONFIG_QLGE) += qlge/
 obj-$(CONFIG_NETXEN_NIC) += netxen/
 obj-$(CONFIG_QED) += qed/
 obj-$(CONFIG_QEDE)+= qede/
diff --git a/drivers/staging/Kconfig b/drivers/staging/Kconfig
index 7c96a01eef6c..0b8a614be11e 100644
--- a/drivers/staging/Kconfig
+++ b/drivers/staging/Kconfig
@@ -120,4 +120,6 @@ source "drivers/staging/kpc2000/Kconfig"
 
 source "drivers/staging/isdn/Kconfig"
 
+source "drivers/staging/qlge/Kconfig"
+
 endif # STAGING
diff --git a/drivers/staging/Makefile b/drivers/staging/Makefile
index fcaac9693b83..741152511a10 100644
--- a/drivers/staging/Makefile
+++ b/drivers/staging/Makefile
@@ -50,3 +50,4 @@ obj-$(CONFIG_EROFS_FS)		+= erofs/
 obj-$(CONFIG_FIELDBUS_DEV)     += fieldbus/
 obj-$(CONFIG_KPC2000)		+= kpc2000/
 obj-$(CONFIG_ISDN_CAPI)		+= isdn/
+obj-$(CONFIG_QLGE)		+= qlge/
diff --git a/drivers/staging/qlge/Kconfig b/drivers/staging/qlge/Kconfig
new file mode 100644
index 000000000000..ae9ed2c5300b
--- /dev/null
+++ b/drivers/staging/qlge/Kconfig
@@ -0,0 +1,10 @@
+# SPDX-License-Identifier: GPL-2.0
+
+config QLGE
+	tristate "QLogic QLGE 10Gb Ethernet Driver Support"
+	depends on PCI
+	help
+	This driver supports QLogic ISP8XXX 10Gb Ethernet cards.
+
+	To compile this driver as a module, choose M here. The module will be
+	called qlge.
diff --git a/drivers/net/ethernet/qlogic/qlge/Makefile b/drivers/staging/qlge/Makefile
similarity index 100%
rename from drivers/net/ethernet/qlogic/qlge/Makefile
rename to drivers/staging/qlge/Makefile
diff --git a/drivers/staging/qlge/TODO b/drivers/staging/qlge/TODO
new file mode 100644
index 000000000000..51c509084e80
--- /dev/null
+++ b/drivers/staging/qlge/TODO
@@ -0,0 +1,46 @@
+* reception stalls permanently (until admin intervention) if the rx buffer
+  queues become empty because of allocation failures (ex. under memory
+  pressure)
+* commit 7c734359d350 ("qlge: Size RX buffers based on MTU.", v2.6.33-rc1)
+  introduced dead code in the receive routines, which should be rewritten
+  anyways by the admission of the author himself, see the comment above
+  ql_build_rx_skb(). That function is now used exclusively to handle packets
+  that underwent header splitting but it still contains code to handle non
+  split cases.
+* truesize accounting is incorrect (ex: a 9000B frame has skb->truesize 10280
+  while containing two frags of order-1 allocations, ie. >16K)
+* while in that area, using two 8k buffers to store one 9k frame is a poor
+  choice of buffer size.
+* in the "chain of large buffers" case, the driver uses an skb allocated with
+  head room but only puts data in the frags.
+* rename "rx" queues to "completion" queues. Calling tx completion queues "rx
+  queues" is confusing.
+* struct rx_ring is used for rx and tx completions, with some members relevant
+  to one case only
+* there is an inordinate amount of disparate debugging code, most of which is
+  of questionable value. In particular, qlge_dbg.c has hundreds of lines of
+  code bitrotting away in ifdef land (doesn't compile since commit
+  18c49b91777c ("qlge: do vlan cleanup", v3.1-rc1), 8 years ago).
+* triggering an ethtool regdump will hexdump a 176k struct to dmesg depending
+  on some module parameters.
+* the flow control implementation in firmware is buggy (sends a flood of pause
+  frames, resets the link, device and driver buffer queues become
+  desynchronized), disable it by default
+* some structures are initialized redundantly (ex. memset 0 after
+  alloc_etherdev())
+* the driver has a habit of using runtime checks where compile time checks are
+  possible (ex. ql_free_rx_buffers(), ql_alloc_rx_buffers())
+* reorder struct members to avoid holes if it doesn't impact performance
+* in terms of namespace, the driver uses either qlge_, ql_ (used by
+  other qlogic drivers, with clashes, ex: ql_sem_spinlock) or nothing (with
+  clashes, ex: struct ob_mac_iocb_req). Rename everything to use the "qlge_"
+  prefix.
+* avoid legacy/deprecated apis (ex. replace pci_dma_*, replace pci_enable_msi,
+  use pci_iomap)
+* some "while" loops could be rewritten with simple "for", ex.
+  ql_wait_reg_rdy(), ql_start_rx_ring())
+* remove duplicate and useless comments
+* fix weird line wrapping (all over, ex. the ql_set_routing_reg() calls in
+  qlge_set_multicast_list()).
+* fix weird indentation (all over, ex. the for loops in qlge_get_stats())
+* fix checkpatch issues
diff --git a/drivers/net/ethernet/qlogic/qlge/qlge.h b/drivers/staging/qlge/qlge.h
similarity index 100%
rename from drivers/net/ethernet/qlogic/qlge/qlge.h
rename to drivers/staging/qlge/qlge.h
diff --git a/drivers/net/ethernet/qlogic/qlge/qlge_dbg.c b/drivers/staging/qlge/qlge_dbg.c
similarity index 100%
rename from drivers/net/ethernet/qlogic/qlge/qlge_dbg.c
rename to drivers/staging/qlge/qlge_dbg.c
diff --git a/drivers/net/ethernet/qlogic/qlge/qlge_ethtool.c b/drivers/staging/qlge/qlge_ethtool.c
similarity index 100%
rename from drivers/net/ethernet/qlogic/qlge/qlge_ethtool.c
rename to drivers/staging/qlge/qlge_ethtool.c
diff --git a/drivers/net/ethernet/qlogic/qlge/qlge_main.c b/drivers/staging/qlge/qlge_main.c
similarity index 100%
rename from drivers/net/ethernet/qlogic/qlge/qlge_main.c
rename to drivers/staging/qlge/qlge_main.c
diff --git a/drivers/net/ethernet/qlogic/qlge/qlge_mpi.c b/drivers/staging/qlge/qlge_mpi.c
similarity index 100%
rename from drivers/net/ethernet/qlogic/qlge/qlge_mpi.c
rename to drivers/staging/qlge/qlge_mpi.c
-- 
2.22.0


^ permalink raw reply related

* AW: [PATCH 3/3] uio: remove netx driver
From: Michael Trensch @ 2019-07-23  5:45 UTC (permalink / raw)
  To: Arnd Bergmann, Greg Kroah-Hartman
  Cc: netdev@vger.kernel.org, linux-serial@vger.kernel.org,
	tglx@linutronix.de, davem@davemloft.net, Sascha Hauer,
	Linus Walleij, Robert Schwebel, linux-kernel@vger.kernel.org
In-Reply-To: <20190722191552.252805-3-arnd@arndb.de>

The "uio_netx" driver is not used in conjunction with the removed netX SoC support.
It is used to handle netX-Based PCI(e) cards (https://www.hilscher.com/products/product-groups/pc-cards/) plugged into a PC or any kind of embedded hardware.

So a removal of this driver would render those extension cards unusable in future.

--
Michael Trensch | netX System
Phone: +49 (0) 6190 9907-0 | Fax: +49 (0) 6190 9907-50 | mtrensch@hilscher.com
> -----Ursprüngliche Nachricht-----
> Von: Arnd Bergmann <arnd@arndb.de>
> Gesendet: Montag, 22. Juli 2019 21:15
> An: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
> Cc: netdev@vger.kernel.org; linux-serial@vger.kernel.org; tglx@linutronix.de;
> davem@davemloft.net; Sascha Hauer <s.hauer@pengutronix.de>; Michael
> Trensch <MTrensch@hilscher.com>; Linus Walleij <linus.walleij@linaro.org>;
> Robert Schwebel <r.schwebel@pengutronix.de>; Arnd Bergmann
> <arnd@arndb.de>; linux-kernel@vger.kernel.org
> Betreff: [PATCH 3/3] uio: remove netx driver
>
> The netx platform got removed, so this driver is now useless.
>
> Signed-off-by: Arnd Bergmann <arnd@arndb.de>
> ---
>  drivers/uio/Kconfig    |  11 ---
>  drivers/uio/Makefile   |   1 -
>  drivers/uio/uio_netx.c | 178 -----------------------------------------
>  3 files changed, 190 deletions(-)
>  delete mode 100644 drivers/uio/uio_netx.c
>
> diff --git a/drivers/uio/Kconfig b/drivers/uio/Kconfig index
> 202ee81cfc2b..abc8dd97b474 100644
> --- a/drivers/uio/Kconfig
> +++ b/drivers/uio/Kconfig
> @@ -94,17 +94,6 @@ config UIO_PCI_GENERIC
>    primarily, for virtualization scenarios.
>    If you compile this as a module, it will be called uio_pci_generic.
>
> -config UIO_NETX
> -tristate "Hilscher NetX Card driver"
> -depends on PCI
> -help
> -  Driver for Hilscher NetX based fieldbus cards (cifX, comX).
> -  This driver requires a userspace component that comes with the card
> -  or is available from Hilscher (http://www.hilscher.com).
> -
> -  To compile this driver as a module, choose M here; the module
> -  will be called uio_netx.
> -
>  config UIO_FSL_ELBC_GPCM
>  tristate "eLBC/GPCM driver"
>  depends on FSL_LBC
> diff --git a/drivers/uio/Makefile b/drivers/uio/Makefile index
> c285dd2a4539..d94012263a42 100644
> --- a/drivers/uio/Makefile
> +++ b/drivers/uio/Makefile
> @@ -6,7 +6,6 @@ obj-$(CONFIG_UIO_DMEM_GENIRQ)+=
> uio_dmem_genirq.o
>  obj-$(CONFIG_UIO_AEC)+= uio_aec.o
>  obj-$(CONFIG_UIO_SERCOS3)+= uio_sercos3.o
>  obj-$(CONFIG_UIO_PCI_GENERIC)+= uio_pci_generic.o
> -obj-$(CONFIG_UIO_NETX)+= uio_netx.o
>  obj-$(CONFIG_UIO_PRUSS)         += uio_pruss.o
>  obj-$(CONFIG_UIO_MF624)         += uio_mf624.o
>  obj-$(CONFIG_UIO_FSL_ELBC_GPCM)+= uio_fsl_elbc_gpcm.o
> diff --git a/drivers/uio/uio_netx.c b/drivers/uio/uio_netx.c deleted file mode
> 100644 index 9ae29ffde410..000000000000
> --- a/drivers/uio/uio_netx.c
> +++ /dev/null
> @@ -1,178 +0,0 @@
> -// SPDX-License-Identifier: GPL-2.0
> -/*
> - * UIO driver for Hilscher NetX based fieldbus cards (cifX, comX).
> - * See http://www.hilscher.com for details.
> - *
> - * (C) 2007 Hans J. Koch <hjk@hansjkoch.de>
> - * (C) 2008 Manuel Traut <manut@linutronix.de>
> - *
> - */
> -
> -#include <linux/device.h>
> -#include <linux/io.h>
> -#include <linux/module.h>
> -#include <linux/pci.h>
> -#include <linux/slab.h>
> -#include <linux/uio_driver.h>
> -
> -#define PCI_VENDOR_ID_HILSCHER0x15CF
> -#define PCI_DEVICE_ID_HILSCHER_NETX0x0000
> -#define PCI_DEVICE_ID_HILSCHER_NETPLC0x0010
> -#define PCI_SUBDEVICE_ID_NETPLC_RAM0x0000
> -#define PCI_SUBDEVICE_ID_NETPLC_FLASH0x0001
> -#define PCI_SUBDEVICE_ID_NXSB_PCA0x3235
> -#define PCI_SUBDEVICE_ID_NXPCA0x3335
> -
> -#define DPM_HOST_INT_EN00xfff0
> -#define DPM_HOST_INT_STAT00xffe0
> -
> -#define DPM_HOST_INT_MASK0xe600ffff
> -#define DPM_HOST_INT_GLOBAL_EN0x80000000
> -
> -static irqreturn_t netx_handler(int irq, struct uio_info *dev_info) -{
> -void __iomem *int_enable_reg = dev_info->mem[0].internal_addr
> -+ DPM_HOST_INT_EN0;
> -void __iomem *int_status_reg = dev_info->mem[0].internal_addr
> -+ DPM_HOST_INT_STAT0;
> -
> -/* Is one of our interrupts enabled and active ? */
> -if (!(ioread32(int_enable_reg) & ioread32(int_status_reg)
> -& DPM_HOST_INT_MASK))
> -return IRQ_NONE;
> -
> -/* Disable interrupt */
> -iowrite32(ioread32(int_enable_reg) & ~DPM_HOST_INT_GLOBAL_EN,
> -int_enable_reg);
> -return IRQ_HANDLED;
> -}
> -
> -static int netx_pci_probe(struct pci_dev *dev,
> -const struct pci_device_id *id)
> -{
> -struct uio_info *info;
> -int bar;
> -
> -info = kzalloc(sizeof(struct uio_info), GFP_KERNEL);
> -if (!info)
> -return -ENOMEM;
> -
> -if (pci_enable_device(dev))
> -goto out_free;
> -
> -if (pci_request_regions(dev, "netx"))
> -goto out_disable;
> -
> -switch (id->device) {
> -case PCI_DEVICE_ID_HILSCHER_NETX:
> -bar = 0;
> -info->name = "netx";
> -break;
> -case PCI_DEVICE_ID_HILSCHER_NETPLC:
> -bar = 0;
> -info->name = "netplc";
> -break;
> -default:
> -bar = 2;
> -info->name = "netx_plx";
> -}
> -
> -/* BAR0 or 2 points to the card's dual port memory */
> -info->mem[0].addr = pci_resource_start(dev, bar);
> -if (!info->mem[0].addr)
> -goto out_release;
> -info->mem[0].internal_addr = ioremap(pci_resource_start(dev, bar),
> -pci_resource_len(dev, bar));
> -
> -if (!info->mem[0].internal_addr)
> -goto out_release;
> -
> -info->mem[0].size = pci_resource_len(dev, bar);
> -info->mem[0].memtype = UIO_MEM_PHYS;
> -info->irq = dev->irq;
> -info->irq_flags = IRQF_SHARED;
> -info->handler = netx_handler;
> -info->version = "0.0.1";
> -
> -/* Make sure all interrupts are disabled */
> -iowrite32(0, info->mem[0].internal_addr + DPM_HOST_INT_EN0);
> -
> -if (uio_register_device(&dev->dev, info))
> -goto out_unmap;
> -
> -pci_set_drvdata(dev, info);
> -dev_info(&dev->dev, "Found %s card, registered UIO device.\n",
> -info->name);
> -
> -return 0;
> -
> -out_unmap:
> -iounmap(info->mem[0].internal_addr);
> -out_release:
> -pci_release_regions(dev);
> -out_disable:
> -pci_disable_device(dev);
> -out_free:
> -kfree(info);
> -return -ENODEV;
> -}
> -
> -static void netx_pci_remove(struct pci_dev *dev) -{
> -struct uio_info *info = pci_get_drvdata(dev);
> -
> -/* Disable all interrupts */
> -iowrite32(0, info->mem[0].internal_addr + DPM_HOST_INT_EN0);
> -uio_unregister_device(info);
> -pci_release_regions(dev);
> -pci_disable_device(dev);
> -iounmap(info->mem[0].internal_addr);
> -
> -kfree(info);
> -}
> -
> -static struct pci_device_id netx_pci_ids[] = {
> -{
> -.vendor =PCI_VENDOR_ID_HILSCHER,
> -.device =PCI_DEVICE_ID_HILSCHER_NETX,
> -.subvendor =0,
> -.subdevice =0,
> -},
> -{
> -.vendor =       PCI_VENDOR_ID_HILSCHER,
> -.device =       PCI_DEVICE_ID_HILSCHER_NETPLC,
> -.subvendor =    PCI_VENDOR_ID_HILSCHER,
> -.subdevice =    PCI_SUBDEVICE_ID_NETPLC_RAM,
> -},
> -{
> -.vendor =       PCI_VENDOR_ID_HILSCHER,
> -.device =       PCI_DEVICE_ID_HILSCHER_NETPLC,
> -.subvendor =    PCI_VENDOR_ID_HILSCHER,
> -.subdevice =    PCI_SUBDEVICE_ID_NETPLC_FLASH,
> -},
> -{
> -.vendor =PCI_VENDOR_ID_PLX,
> -.device =PCI_DEVICE_ID_PLX_9030,
> -.subvendor =PCI_VENDOR_ID_PLX,
> -.subdevice =PCI_SUBDEVICE_ID_NXSB_PCA,
> -},
> -{
> -.vendor =PCI_VENDOR_ID_PLX,
> -.device =PCI_DEVICE_ID_PLX_9030,
> -.subvendor =PCI_VENDOR_ID_PLX,
> -.subdevice =PCI_SUBDEVICE_ID_NXPCA,
> -},
> -{ 0, }
> -};
> -
> -static struct pci_driver netx_pci_driver = {
> -.name = "netx",
> -.id_table = netx_pci_ids,
> -.probe = netx_pci_probe,
> -.remove = netx_pci_remove,
> -};
> -
> -module_pci_driver(netx_pci_driver);
> -MODULE_DEVICE_TABLE(pci, netx_pci_ids); -MODULE_LICENSE("GPL v2"); -
> MODULE_AUTHOR("Hans J. Koch, Manuel Traut");
> --
> 2.20.0


Hilscher Gesellschaft für Systemautomation mbH   |  Rheinstrasse 15  |  65795 Hattersheim  |  Germany  |  www.hilscher.com<http://www.hilscher.com>
Sitz der Gesellschaft / place of business: Hattersheim  |  Geschäftsführer / managing director: Dipl.-Ing. Hans-Jürgen Hilscher
Handelsregister / commercial register: Frankfurt B 26873  |  Ust. Idnr. / VAT No.: DE113852715
Registergericht / register court: Amtsgericht Frankfurt/Main

Important Information:
This e-mail message including its attachments contains confidential and legally protected information solely intended for the addressee. If you are not the intended addressee of this message, please contact the addresser immediately and delete this message including its attachments. The unauthorized dissemination, copying and change of this e-mail are strictly forbidden. The addresser shall not be liable for the content of such changed e-mails.

Wichtiger Hinweis:
Diese E-Mail einschließlich ihrer Anhänge enthält vertrauliche und rechtlich geschützte Informationen, die nur für den Adressaten bestimmt sind. Sollten Sie nicht der bezeichnete Adressat sein, so teilen Sie dies bitte dem Absender umgehend mit und löschen Sie diese Nachricht und ihre Anhänge. Die unbefugte Weitergabe, das Anfertigen von Kopien und jede Veränderung der E-Mail ist untersagt. Der Absender haftet nicht für Inhalte von veränderten E-Mails.

^ permalink raw reply

* Re: [PATCH 1/3] mm/gup: introduce __put_user_pages()
From: Christoph Hellwig @ 2019-07-23  5:53 UTC (permalink / raw)
  To: john.hubbard
  Cc: Andrew Morton, Alexander Viro, Björn Töpel,
	Boaz Harrosh, Christoph Hellwig, Daniel Vetter, Dan Williams,
	Dave Chinner, David Airlie, David S . Miller, Ilya Dryomov,
	Jan Kara, Jason Gunthorpe, Jens Axboe, Jérôme Glisse,
	Johannes Thumshirn, Magnus Karlsson, Matthew Wilcox,
	Miklos Szeredi, Ming Lei, Sage Weil, Santosh Shilimkar, Yan Zheng,
	netdev, dri-devel, linux-mm, linux-rdma, bpf, LKML, John Hubbard
In-Reply-To: <20190722223415.13269-2-jhubbard@nvidia.com>

On Mon, Jul 22, 2019 at 03:34:13PM -0700, john.hubbard@gmail.com wrote:
> +enum pup_flags_t {
> +	PUP_FLAGS_CLEAN		= 0,
> +	PUP_FLAGS_DIRTY		= 1,
> +	PUP_FLAGS_LOCK		= 2,
> +	PUP_FLAGS_DIRTY_LOCK	= 3,
> +};

Well, the enum defeats the ease of just being able to pass a boolean
expression to the function, which would simplify a lot of the caller,
so if we need to support the !locked version I'd rather see that as
a separate helper.

But do we actually have callers where not using the _lock version is
not a bug?  set_page_dirty makes sense in the context of a file systems
that have a reference to the inode the page hangs off, but that is
(almost?) never the case for get_user_pages.

^ permalink raw reply

* [Patch net] ife: error out when nla attributes are empty
From: Cong Wang @ 2019-07-23  4:43 UTC (permalink / raw)
  To: netdev; +Cc: Cong Wang, syzbot+fbb5b288c9cb6a2eeac4, Jamal Hadi Salim,
	Jiri Pirko

act_ife at least requires TCA_IFE_PARMS, so we have to bail out
when there is no attribute passed in.

Reported-by: syzbot+fbb5b288c9cb6a2eeac4@syzkaller.appspotmail.com
Fixes: ef6980b6becb ("introduce IFE action")
Cc: Jamal Hadi Salim <jhs@mojatatu.com>
Cc: Jiri Pirko <jiri@resnulli.us>
Signed-off-by: Cong Wang <xiyou.wangcong@gmail.com>
---
 net/sched/act_ife.c | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/net/sched/act_ife.c b/net/sched/act_ife.c
index 41d5398dd2f2..3578196d1600 100644
--- a/net/sched/act_ife.c
+++ b/net/sched/act_ife.c
@@ -481,6 +481,11 @@ static int tcf_ife_init(struct net *net, struct nlattr *nla,
 	int ret = 0;
 	int err;
 
+	if (!nla) {
+		NL_SET_ERR_MSG_MOD(extack, "IFE requires attributes to be passed");
+		return -EINVAL;
+	}
+
 	err = nla_parse_nested_deprecated(tb, TCA_IFE_MAX, nla, ife_policy,
 					  NULL);
 	if (err < 0)
-- 
2.21.0


^ permalink raw reply related

* Re: [PATCH 3/3] net/xdp: convert put_page() to put_user_page*()
From: John Hubbard @ 2019-07-23  4:41 UTC (permalink / raw)
  To: Ira Weiny, john.hubbard
  Cc: Andrew Morton, Alexander Viro, Björn Töpel,
	Boaz Harrosh, Christoph Hellwig, Daniel Vetter, Dan Williams,
	Dave Chinner, David Airlie, David S . Miller, Ilya Dryomov,
	Jan Kara, Jason Gunthorpe, Jens Axboe, Jérôme Glisse,
	Johannes Thumshirn, Magnus Karlsson, Matthew Wilcox,
	Miklos Szeredi, Ming Lei, Sage Weil, Santosh Shilimkar, Yan Zheng,
	netdev, dri-devel, linux-mm, linux-rdma, bpf, LKML
In-Reply-To: <20190723002534.GA10284@iweiny-DESK2.sc.intel.com>

On 7/22/19 5:25 PM, Ira Weiny wrote:
> On Mon, Jul 22, 2019 at 03:34:15PM -0700, john.hubbard@gmail.com wrote:
>> From: John Hubbard <jhubbard@nvidia.com>
>>
>> For pages that were retained via get_user_pages*(), release those pages
>> via the new put_user_page*() routines, instead of via put_page() or
>> release_pages().
>>
>> This is part a tree-wide conversion, as described in commit fc1d8e7cca2d
>> ("mm: introduce put_user_page*(), placeholder versions").
>>
>> Cc: Björn Töpel <bjorn.topel@intel.com>
>> Cc: Magnus Karlsson <magnus.karlsson@intel.com>
>> Cc: David S. Miller <davem@davemloft.net>
>> Cc: netdev@vger.kernel.org
>> Signed-off-by: John Hubbard <jhubbard@nvidia.com>
>> ---
>>   net/xdp/xdp_umem.c | 9 +--------
>>   1 file changed, 1 insertion(+), 8 deletions(-)
>>
>> diff --git a/net/xdp/xdp_umem.c b/net/xdp/xdp_umem.c
>> index 83de74ca729a..0325a17915de 100644
>> --- a/net/xdp/xdp_umem.c
>> +++ b/net/xdp/xdp_umem.c
>> @@ -166,14 +166,7 @@ void xdp_umem_clear_dev(struct xdp_umem *umem)
>>   
>>   static void xdp_umem_unpin_pages(struct xdp_umem *umem)
>>   {
>> -	unsigned int i;
>> -
>> -	for (i = 0; i < umem->npgs; i++) {
>> -		struct page *page = umem->pgs[i];
>> -
>> -		set_page_dirty_lock(page);
>> -		put_page(page);
>> -	}
>> +	put_user_pages_dirty_lock(umem->pgs, umem->npgs);
> 
> What is the difference between this and
> 
> __put_user_pages(umem->pgs, umem->npgs, PUP_FLAGS_DIRTY_LOCK);
> 
> ?

No difference.

> 
> I'm a bit concerned with adding another form of the same interface.  We should
> either have 1 call with flags (enum in this case) or multiple calls.  Given the
> previous discussion lets move in the direction of having the enum but don't
> introduce another caller of the "old" interface.

I disagree that this is a "problem". There is no maintenance pitfall here; there
are merely two ways to call the put_user_page*() API. Both are correct, and
neither one will get you into trouble.

Not only that, but there is ample precedent for this approach in other
kernel APIs.

> 
> So I think on this patch NAK from me.
> 
> I also don't like having a __* call in the exported interface but there is a
> __get_user_pages_fast() call so I guess there is precedent.  :-/
> 

I thought about this carefully, and looked at other APIs. And I noticed that
things like __get_user_pages*() are how it's often done:

* The leading underscores are often used for the more elaborate form of the
call (as oppposed to decorating the core function name with "_flags", for
example).

* There are often calls in which you can either call the simpler form, or the
form with flags and additional options, and yes, you'll get the same result.

Obviously, this stuff is all subject to a certain amount of opinion, but I
think I'm on really solid ground as far as precedent goes. So I'm pushing
back on the NAK... :)

thanks,
-- 
John Hubbard
NVIDIA


^ permalink raw reply

* [PATCH bpf-next 4/5] samples/bpf: switch trace_output sample to perf_buffer API
From: Andrii Nakryiko @ 2019-07-23  4:31 UTC (permalink / raw)
  To: bpf, netdev, ast, daniel; +Cc: andrii.nakryiko, kernel-team, Andrii Nakryiko
In-Reply-To: <20190723043112.3145810-1-andriin@fb.com>

Convert trace_output sample to libbpf's perf_buffer API.

Signed-off-by: Andrii Nakryiko <andriin@fb.com>
---
 samples/bpf/trace_output_user.c | 43 +++++++++++----------------------
 1 file changed, 14 insertions(+), 29 deletions(-)

diff --git a/samples/bpf/trace_output_user.c b/samples/bpf/trace_output_user.c
index 2dd1d39b152a..8ee47699a870 100644
--- a/samples/bpf/trace_output_user.c
+++ b/samples/bpf/trace_output_user.c
@@ -18,9 +18,6 @@
 #include <libbpf.h>
 #include "bpf_load.h"
 #include "perf-sys.h"
-#include "trace_helpers.h"
-
-static int pmu_fd;
 
 static __u64 time_get_ns(void)
 {
@@ -31,12 +28,12 @@ static __u64 time_get_ns(void)
 }
 
 static __u64 start_time;
+static __u64 cnt;
 
 #define MAX_CNT 100000ll
 
-static int print_bpf_output(void *data, int size)
+static void print_bpf_output(void *ctx, int cpu, void *data, __u32 size)
 {
-	static __u64 cnt;
 	struct {
 		__u64 pid;
 		__u64 cookie;
@@ -45,7 +42,7 @@ static int print_bpf_output(void *data, int size)
 	if (e->cookie != 0x12345678) {
 		printf("BUG pid %llx cookie %llx sized %d\n",
 		       e->pid, e->cookie, size);
-		return LIBBPF_PERF_EVENT_ERROR;
+		return;
 	}
 
 	cnt++;
@@ -53,30 +50,14 @@ static int print_bpf_output(void *data, int size)
 	if (cnt == MAX_CNT) {
 		printf("recv %lld events per sec\n",
 		       MAX_CNT * 1000000000ll / (time_get_ns() - start_time));
-		return LIBBPF_PERF_EVENT_DONE;
+		return;
 	}
-
-	return LIBBPF_PERF_EVENT_CONT;
-}
-
-static void test_bpf_perf_event(void)
-{
-	struct perf_event_attr attr = {
-		.sample_type = PERF_SAMPLE_RAW,
-		.type = PERF_TYPE_SOFTWARE,
-		.config = PERF_COUNT_SW_BPF_OUTPUT,
-	};
-	int key = 0;
-
-	pmu_fd = sys_perf_event_open(&attr, -1/*pid*/, 0/*cpu*/, -1/*group_fd*/, 0);
-
-	assert(pmu_fd >= 0);
-	assert(bpf_map_update_elem(map_fd[0], &key, &pmu_fd, BPF_ANY) == 0);
-	ioctl(pmu_fd, PERF_EVENT_IOC_ENABLE, 0);
 }
 
 int main(int argc, char **argv)
 {
+	struct perf_buffer_opts pb_opts = {};
+	struct perf_buffer *pb;
 	char filename[256];
 	FILE *f;
 	int ret;
@@ -88,16 +69,20 @@ int main(int argc, char **argv)
 		return 1;
 	}
 
-	test_bpf_perf_event();
-
-	if (perf_event_mmap(pmu_fd) < 0)
+	pb_opts.sample_cb = print_bpf_output;
+	pb = perf_buffer__new(map_fd[0], 8, &pb_opts);
+	ret = libbpf_get_error(pb);
+	if (ret) {
+		printf("failed to setup perf_buffer: %d\n", ret);
 		return 1;
+	}
 
 	f = popen("taskset 1 dd if=/dev/zero of=/dev/null", "r");
 	(void) f;
 
 	start_time = time_get_ns();
-	ret = perf_event_poller(pmu_fd, print_bpf_output);
+	while ((ret = perf_buffer__poll(pb, 1000)) >= 0 && cnt < MAX_CNT) {
+	}
 	kill(0, SIGINT);
 	return ret;
 }
-- 
2.17.1


^ permalink raw reply related

* [PATCH bpf-next 5/5] selftests/bpf: remove perf buffer helpers
From: Andrii Nakryiko @ 2019-07-23  4:31 UTC (permalink / raw)
  To: bpf, netdev, ast, daniel; +Cc: andrii.nakryiko, kernel-team, Andrii Nakryiko
In-Reply-To: <20190723043112.3145810-1-andriin@fb.com>

libbpf's perf_buffer API supersedes trace_helper.h's helpers.
Remove those helpers after all existing users were already moved to
perf_buffer API.

Signed-off-by: Andrii Nakryiko <andriin@fb.com>
---
 tools/testing/selftests/bpf/trace_helpers.c | 125 --------------------
 tools/testing/selftests/bpf/trace_helpers.h |   9 --
 2 files changed, 134 deletions(-)

diff --git a/tools/testing/selftests/bpf/trace_helpers.c b/tools/testing/selftests/bpf/trace_helpers.c
index b47f205f0310..7f989b3e4e22 100644
--- a/tools/testing/selftests/bpf/trace_helpers.c
+++ b/tools/testing/selftests/bpf/trace_helpers.c
@@ -86,128 +86,3 @@ long ksym_get_addr(const char *name)
 
 	return 0;
 }
-
-static int page_size;
-static int page_cnt = 8;
-static struct perf_event_mmap_page *header;
-
-int perf_event_mmap_header(int fd, struct perf_event_mmap_page **header)
-{
-	void *base;
-	int mmap_size;
-
-	page_size = getpagesize();
-	mmap_size = page_size * (page_cnt + 1);
-
-	base = mmap(NULL, mmap_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
-	if (base == MAP_FAILED) {
-		printf("mmap err\n");
-		return -1;
-	}
-
-	*header = base;
-	return 0;
-}
-
-int perf_event_mmap(int fd)
-{
-	return perf_event_mmap_header(fd, &header);
-}
-
-static int perf_event_poll(int fd)
-{
-	struct pollfd pfd = { .fd = fd, .events = POLLIN };
-
-	return poll(&pfd, 1, 1000);
-}
-
-struct perf_event_sample {
-	struct perf_event_header header;
-	__u32 size;
-	char data[];
-};
-
-static enum bpf_perf_event_ret
-bpf_perf_event_print(struct perf_event_header *hdr, void *private_data)
-{
-	struct perf_event_sample *e = (struct perf_event_sample *)hdr;
-	perf_event_print_fn fn = private_data;
-	int ret;
-
-	if (e->header.type == PERF_RECORD_SAMPLE) {
-		ret = fn(e->data, e->size);
-		if (ret != LIBBPF_PERF_EVENT_CONT)
-			return ret;
-	} else if (e->header.type == PERF_RECORD_LOST) {
-		struct {
-			struct perf_event_header header;
-			__u64 id;
-			__u64 lost;
-		} *lost = (void *) e;
-		printf("lost %lld events\n", lost->lost);
-	} else {
-		printf("unknown event type=%d size=%d\n",
-		       e->header.type, e->header.size);
-	}
-
-	return LIBBPF_PERF_EVENT_CONT;
-}
-
-int perf_event_poller(int fd, perf_event_print_fn output_fn)
-{
-	enum bpf_perf_event_ret ret;
-	void *buf = NULL;
-	size_t len = 0;
-
-	for (;;) {
-		perf_event_poll(fd);
-		ret = bpf_perf_event_read_simple(header, page_cnt * page_size,
-						 page_size, &buf, &len,
-						 bpf_perf_event_print,
-						 output_fn);
-		if (ret != LIBBPF_PERF_EVENT_CONT)
-			break;
-	}
-	free(buf);
-
-	return ret;
-}
-
-int perf_event_poller_multi(int *fds, struct perf_event_mmap_page **headers,
-			    int num_fds, perf_event_print_fn output_fn)
-{
-	enum bpf_perf_event_ret ret;
-	struct pollfd *pfds;
-	void *buf = NULL;
-	size_t len = 0;
-	int i;
-
-	pfds = calloc(num_fds, sizeof(*pfds));
-	if (!pfds)
-		return LIBBPF_PERF_EVENT_ERROR;
-
-	for (i = 0; i < num_fds; i++) {
-		pfds[i].fd = fds[i];
-		pfds[i].events = POLLIN;
-	}
-
-	for (;;) {
-		poll(pfds, num_fds, 1000);
-		for (i = 0; i < num_fds; i++) {
-			if (!pfds[i].revents)
-				continue;
-
-			ret = bpf_perf_event_read_simple(headers[i],
-							 page_cnt * page_size,
-							 page_size, &buf, &len,
-							 bpf_perf_event_print,
-							 output_fn);
-			if (ret != LIBBPF_PERF_EVENT_CONT)
-				break;
-		}
-	}
-	free(buf);
-	free(pfds);
-
-	return ret;
-}
diff --git a/tools/testing/selftests/bpf/trace_helpers.h b/tools/testing/selftests/bpf/trace_helpers.h
index 18924f23db1b..aa4dcfe18050 100644
--- a/tools/testing/selftests/bpf/trace_helpers.h
+++ b/tools/testing/selftests/bpf/trace_helpers.h
@@ -3,7 +3,6 @@
 #define __TRACE_HELPER_H
 
 #include <libbpf.h>
-#include <linux/perf_event.h>
 
 struct ksym {
 	long addr;
@@ -14,12 +13,4 @@ int load_kallsyms(void);
 struct ksym *ksym_search(long key);
 long ksym_get_addr(const char *name);
 
-typedef enum bpf_perf_event_ret (*perf_event_print_fn)(void *data, int size);
-
-int perf_event_mmap(int fd);
-int perf_event_mmap_header(int fd, struct perf_event_mmap_page **header);
-/* return LIBBPF_PERF_EVENT_DONE or LIBBPF_PERF_EVENT_ERROR */
-int perf_event_poller(int fd, perf_event_print_fn output_fn);
-int perf_event_poller_multi(int *fds, struct perf_event_mmap_page **headers,
-			    int num_fds, perf_event_print_fn output_fn);
 #endif
-- 
2.17.1


^ permalink raw reply related

* [PATCH bpf-next 2/5] selftests/bpf: switch test_tcpnotify to perf_buffer API
From: Andrii Nakryiko @ 2019-07-23  4:31 UTC (permalink / raw)
  To: bpf, netdev, ast, daniel; +Cc: andrii.nakryiko, kernel-team, Andrii Nakryiko
In-Reply-To: <20190723043112.3145810-1-andriin@fb.com>

Switch test_tcpnotify test to use libbpf's perf_buffer API instead of
re-implementing portion of it.

Signed-off-by: Andrii Nakryiko <andriin@fb.com>
---
 .../selftests/bpf/test_tcpnotify_user.c       | 90 ++++++++-----------
 1 file changed, 36 insertions(+), 54 deletions(-)

diff --git a/tools/testing/selftests/bpf/test_tcpnotify_user.c b/tools/testing/selftests/bpf/test_tcpnotify_user.c
index 86152d9ae95b..f9765ddf0761 100644
--- a/tools/testing/selftests/bpf/test_tcpnotify_user.c
+++ b/tools/testing/selftests/bpf/test_tcpnotify_user.c
@@ -17,6 +17,7 @@
 #include <linux/rtnetlink.h>
 #include <signal.h>
 #include <linux/perf_event.h>
+#include <linux/err.h>
 
 #include "bpf_rlimit.h"
 #include "bpf_util.h"
@@ -30,28 +31,34 @@
 pthread_t tid;
 int rx_callbacks;
 
-static int dummyfn(void *data, int size)
+static void dummyfn(void *ctx, int cpu, void *data, __u32 size)
 {
 	struct tcp_notifier *t = data;
 
 	if (t->type != 0xde || t->subtype != 0xad ||
 	    t->source != 0xbe || t->hash != 0xef)
-		return 1;
+		return;
 	rx_callbacks++;
-	return 0;
 }
 
-void tcp_notifier_poller(int fd)
+void tcp_notifier_poller(struct perf_buffer *pb)
 {
-	while (1)
-		perf_event_poller(fd, dummyfn);
+	int err;
+
+	while (1) {
+		err = perf_buffer__poll(pb, 100);
+		if (err < 0 && err != -EINTR) {
+			printf("failed perf_buffer__poll: %d\n", err);
+			return;
+		}
+	}
 }
 
 static void *poller_thread(void *arg)
 {
-	int fd = *(int *)arg;
+	struct perf_buffer *pb = arg;
 
-	tcp_notifier_poller(fd);
+	tcp_notifier_poller(pb);
 	return arg;
 }
 
@@ -60,52 +67,20 @@ int verify_result(const struct tcpnotify_globals *result)
 	return (result->ncalls > 0 && result->ncalls == rx_callbacks ? 0 : 1);
 }
 
-static int bpf_find_map(const char *test, struct bpf_object *obj,
-			const char *name)
-{
-	struct bpf_map *map;
-
-	map = bpf_object__find_map_by_name(obj, name);
-	if (!map) {
-		printf("%s:FAIL:map '%s' not found\n", test, name);
-		return -1;
-	}
-	return bpf_map__fd(map);
-}
-
-static int setup_bpf_perf_event(int mapfd)
-{
-	struct perf_event_attr attr = {
-		.sample_type = PERF_SAMPLE_RAW,
-		.type = PERF_TYPE_SOFTWARE,
-		.config = PERF_COUNT_SW_BPF_OUTPUT,
-	};
-	int key = 0;
-	int pmu_fd;
-
-	pmu_fd = syscall(__NR_perf_event_open, &attr, -1, 0, -1, 0);
-	if (pmu_fd < 0)
-		return pmu_fd;
-	bpf_map_update_elem(mapfd, &key, &pmu_fd, BPF_ANY);
-
-	ioctl(pmu_fd, PERF_EVENT_IOC_ENABLE, 0);
-	return pmu_fd;
-}
-
 int main(int argc, char **argv)
 {
 	const char *file = "test_tcpnotify_kern.o";
-	int prog_fd, map_fd, perf_event_fd;
+	struct bpf_map *perf_map, *global_map;
+	struct perf_buffer_opts pb_opts = {};
 	struct tcpnotify_globals g = {0};
+	struct perf_buffer *pb = NULL;
 	const char *cg_path = "/foo";
+	int prog_fd, rv, cg_fd = -1;
 	int error = EXIT_FAILURE;
 	struct bpf_object *obj;
-	int cg_fd = -1;
-	__u32 key = 0;
-	int rv;
 	char test_script[80];
-	int pmu_fd;
 	cpu_set_t cpuset;
+	__u32 key = 0;
 
 	CPU_ZERO(&cpuset);
 	CPU_SET(0, &cpuset);
@@ -133,19 +108,24 @@ int main(int argc, char **argv)
 		goto err;
 	}
 
-	perf_event_fd = bpf_find_map(__func__, obj, "perf_event_map");
-	if (perf_event_fd < 0)
+	perf_map = bpf_object__find_map_by_name(obj, "perf_event_map");
+	if (!perf_map) {
+		printf("FAIL:map '%s' not found\n", "perf_event_map");
 		goto err;
+	}
 
-	map_fd = bpf_find_map(__func__, obj, "global_map");
-	if (map_fd < 0)
-		goto err;
+	global_map = bpf_object__find_map_by_name(obj, "global_map");
+	if (!global_map) {
+		printf("FAIL:map '%s' not found\n", "global_map");
+		return -1;
+	}
 
-	pmu_fd = setup_bpf_perf_event(perf_event_fd);
-	if (pmu_fd < 0 || perf_event_mmap(pmu_fd) < 0)
+	pb_opts.sample_cb = dummyfn;
+	pb = perf_buffer__new(bpf_map__fd(perf_map), 8, &pb_opts);
+	if (IS_ERR(pb))
 		goto err;
 
-	pthread_create(&tid, NULL, poller_thread, (void *)&pmu_fd);
+	pthread_create(&tid, NULL, poller_thread, pb);
 
 	sprintf(test_script,
 		"iptables -A INPUT -p tcp --dport %d -j DROP",
@@ -162,7 +142,7 @@ int main(int argc, char **argv)
 		TESTPORT);
 	system(test_script);
 
-	rv = bpf_map_lookup_elem(map_fd, &key, &g);
+	rv = bpf_map_lookup_elem(bpf_map__fd(global_map), &key, &g);
 	if (rv != 0) {
 		printf("FAILED: bpf_map_lookup_elem returns %d\n", rv);
 		goto err;
@@ -182,5 +162,7 @@ int main(int argc, char **argv)
 	bpf_prog_detach(cg_fd, BPF_CGROUP_SOCK_OPS);
 	close(cg_fd);
 	cleanup_cgroup_environment();
+	if (!IS_ERR_OR_NULL(pb))
+		perf_buffer__free(pb);
 	return error;
 }
-- 
2.17.1


^ permalink raw reply related

* [PATCH bpf-next 3/5] samples/bpf: convert xdp_sample_pkts_user to perf_buffer API
From: Andrii Nakryiko @ 2019-07-23  4:31 UTC (permalink / raw)
  To: bpf, netdev, ast, daniel; +Cc: andrii.nakryiko, kernel-team, Andrii Nakryiko
In-Reply-To: <20190723043112.3145810-1-andriin@fb.com>

Convert xdp_sample_pkts_user to libbpf's perf_buffer API.

Signed-off-by: Andrii Nakryiko <andriin@fb.com>
---
 samples/bpf/xdp_sample_pkts_user.c | 61 +++++++++---------------------
 1 file changed, 17 insertions(+), 44 deletions(-)

diff --git a/samples/bpf/xdp_sample_pkts_user.c b/samples/bpf/xdp_sample_pkts_user.c
index dc66345a929a..3002714e3cd5 100644
--- a/samples/bpf/xdp_sample_pkts_user.c
+++ b/samples/bpf/xdp_sample_pkts_user.c
@@ -17,14 +17,13 @@
 #include <linux/if_link.h>
 
 #include "perf-sys.h"
-#include "trace_helpers.h"
 
 #define MAX_CPUS 128
-static int pmu_fds[MAX_CPUS], if_idx;
-static struct perf_event_mmap_page *headers[MAX_CPUS];
+static int if_idx;
 static char *if_name;
 static __u32 xdp_flags = XDP_FLAGS_UPDATE_IF_NOEXIST;
 static __u32 prog_id;
+static struct perf_buffer *pb = NULL;
 
 static int do_attach(int idx, int fd, const char *name)
 {
@@ -73,7 +72,7 @@ static int do_detach(int idx, const char *name)
 
 #define SAMPLE_SIZE 64
 
-static int print_bpf_output(void *data, int size)
+static void print_bpf_output(void *ctx, int cpu, void *data, __u32 size)
 {
 	struct {
 		__u16 cookie;
@@ -83,45 +82,20 @@ static int print_bpf_output(void *data, int size)
 	int i;
 
 	if (e->cookie != 0xdead) {
-		printf("BUG cookie %x sized %d\n",
-		       e->cookie, size);
-		return LIBBPF_PERF_EVENT_ERROR;
+		printf("BUG cookie %x sized %d\n", e->cookie, size);
+		return;
 	}
 
 	printf("Pkt len: %-5d bytes. Ethernet hdr: ", e->pkt_len);
 	for (i = 0; i < 14 && i < e->pkt_len; i++)
 		printf("%02x ", e->pkt_data[i]);
 	printf("\n");
-
-	return LIBBPF_PERF_EVENT_CONT;
-}
-
-static void test_bpf_perf_event(int map_fd, int num)
-{
-	struct perf_event_attr attr = {
-		.sample_type = PERF_SAMPLE_RAW,
-		.type = PERF_TYPE_SOFTWARE,
-		.config = PERF_COUNT_SW_BPF_OUTPUT,
-		.wakeup_events = 1, /* get an fd notification for every event */
-	};
-	int i;
-
-	for (i = 0; i < num; i++) {
-		int key = i;
-
-		pmu_fds[i] = sys_perf_event_open(&attr, -1/*pid*/, i/*cpu*/,
-						 -1/*group_fd*/, 0);
-
-		assert(pmu_fds[i] >= 0);
-		assert(bpf_map_update_elem(map_fd, &key,
-					   &pmu_fds[i], BPF_ANY) == 0);
-		ioctl(pmu_fds[i], PERF_EVENT_IOC_ENABLE, 0);
-	}
 }
 
 static void sig_handler(int signo)
 {
 	do_detach(if_idx, if_name);
+	perf_buffer__free(pb);
 	exit(0);
 }
 
@@ -140,13 +114,13 @@ int main(int argc, char **argv)
 	struct bpf_prog_load_attr prog_load_attr = {
 		.prog_type	= BPF_PROG_TYPE_XDP,
 	};
+	struct perf_buffer_opts pb_opts = {};
 	const char *optstr = "F";
 	int prog_fd, map_fd, opt;
 	struct bpf_object *obj;
 	struct bpf_map *map;
 	char filename[256];
-	int ret, err, i;
-	int numcpus;
+	int ret, err;
 
 	while ((opt = getopt(argc, argv, optstr)) != -1) {
 		switch (opt) {
@@ -169,10 +143,6 @@ int main(int argc, char **argv)
 		return 1;
 	}
 
-	numcpus = get_nprocs();
-	if (numcpus > MAX_CPUS)
-		numcpus = MAX_CPUS;
-
 	snprintf(filename, sizeof(filename), "%s_kern.o", argv[0]);
 	prog_load_attr.file = filename;
 
@@ -211,14 +181,17 @@ int main(int argc, char **argv)
 		return 1;
 	}
 
-	test_bpf_perf_event(map_fd, numcpus);
+	pb_opts.sample_cb = print_bpf_output;
+	pb = perf_buffer__new(map_fd, 8, &pb_opts);
+	err = libbpf_get_error(pb);
+	if (err) {
+		perror("perf_buffer setup failed");
+		return 1;
+	}
 
-	for (i = 0; i < numcpus; i++)
-		if (perf_event_mmap_header(pmu_fds[i], &headers[i]) < 0)
-			return 1;
+	while ((ret = perf_buffer__poll(pb, 1000)) >= 0) {
+	}
 
-	ret = perf_event_poller_multi(pmu_fds, headers, numcpus,
-				      print_bpf_output);
 	kill(0, SIGINT);
 	return ret;
 }
-- 
2.17.1


^ permalink raw reply related


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