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 2/6] vhost: validate MMU notifier registration
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>

The return value of mmu_notifier_register() is not checked in
vhost_vring_set_num_addr(). This will cause an out of sync between mm
and MMU notifier thus a double free. To solve this, introduce a
boolean flag to track whether MMU notifier is registered and only do
unregistering when it was true.

Reported-and-tested-by:
syzbot+e58112d71f77113ddb7b@syzkaller.appspotmail.com
Fixes: 7f466032dc9e ("vhost: access vq metadata through kernel virtual address")
Signed-off-by: Jason Wang <jasowang@redhat.com>
---
 drivers/vhost/vhost.c | 19 +++++++++++++++----
 drivers/vhost/vhost.h |  1 +
 2 files changed, 16 insertions(+), 4 deletions(-)

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


^ permalink raw reply related

* [PATCH 4/6] vhost: reset invalidate_count in vhost_set_vring_num_addr()
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>

The vhost_set_vring_num_addr() could be called in the middle of
invalidate_range_start() and invalidate_range_end(). If we don't reset
invalidate_count after the un-registering of MMU notifier, the
invalidate_cont will run out of sync (e.g never reach zero). This will
in fact disable the fast accessor path. Fixing by reset the count to
zero.

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

diff --git a/drivers/vhost/vhost.c b/drivers/vhost/vhost.c
index 03666b702498..89c9f08b5146 100644
--- a/drivers/vhost/vhost.c
+++ b/drivers/vhost/vhost.c
@@ -2074,6 +2074,10 @@ static long vhost_vring_set_num_addr(struct vhost_dev *d,
 		d->has_notifier = false;
 	}
 
+	/* reset invalidate_count in case we are in the middle of
+	 * invalidate_start() and invalidate_end().
+	 */
+	vq->invalidate_count = 0;
 	vhost_uninit_vq_maps(vq);
 #endif
 
-- 
2.18.1


^ permalink raw reply related

* [PATCH 5/6] vhost: mark dirty pages during map uninit
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 mark dirty pages if the map was teared down outside MMU
notifier. This will lead untracked dirty pages. Fixing by marking
dirty pages during map uninit.

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

diff --git a/drivers/vhost/vhost.c b/drivers/vhost/vhost.c
index 89c9f08b5146..5b8821d00fe4 100644
--- a/drivers/vhost/vhost.c
+++ b/drivers/vhost/vhost.c
@@ -306,6 +306,18 @@ static void vhost_map_unprefetch(struct vhost_map *map)
 	kfree(map);
 }
 
+static void vhost_set_map_dirty(struct vhost_virtqueue *vq,
+				struct vhost_map *map, int index)
+{
+	struct vhost_uaddr *uaddr = &vq->uaddrs[index];
+	int i;
+
+	if (uaddr->write) {
+		for (i = 0; i < map->npages; i++)
+			set_page_dirty(map->pages[i]);
+	}
+}
+
 static void vhost_uninit_vq_maps(struct vhost_virtqueue *vq)
 {
 	struct vhost_map *map[VHOST_NUM_ADDRS];
@@ -315,8 +327,10 @@ static void vhost_uninit_vq_maps(struct vhost_virtqueue *vq)
 	for (i = 0; i < VHOST_NUM_ADDRS; i++) {
 		map[i] = rcu_dereference_protected(vq->maps[i],
 				  lockdep_is_held(&vq->mmu_lock));
-		if (map[i])
+		if (map[i]) {
+			vhost_set_map_dirty(vq, map[i], i);
 			rcu_assign_pointer(vq->maps[i], NULL);
+		}
 	}
 	spin_unlock(&vq->mmu_lock);
 
@@ -354,7 +368,6 @@ static void vhost_invalidate_vq_start(struct vhost_virtqueue *vq,
 {
 	struct vhost_uaddr *uaddr = &vq->uaddrs[index];
 	struct vhost_map *map;
-	int i;
 
 	if (!vhost_map_range_overlap(uaddr, start, end))
 		return;
@@ -365,10 +378,7 @@ static void vhost_invalidate_vq_start(struct vhost_virtqueue *vq,
 	map = rcu_dereference_protected(vq->maps[index],
 					lockdep_is_held(&vq->mmu_lock));
 	if (map) {
-		if (uaddr->write) {
-			for (i = 0; i < map->npages; i++)
-				set_page_dirty(map->pages[i]);
-		}
+		vhost_set_map_dirty(vq, map, index);
 		rcu_assign_pointer(vq->maps[index], NULL);
 	}
 	spin_unlock(&vq->mmu_lock);
-- 
2.18.1


^ permalink raw reply related

* [PATCH 6/6] vhost: don't do synchronize_rcu() in vhost_uninit_vq_maps()
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>

There's no need for RCU synchronization in vhost_uninit_vq_maps()
since we've already serialized with readers (memory accessors). This
also avoid the possible userspace DOS through ioctl() because of the
possible high latency caused by synchronize_rcu().

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

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


^ permalink raw reply related

* [PATCH net-next 0/2] mlxsw: Two small updates
From: Ido Schimmel @ 2019-07-23  7:57 UTC (permalink / raw)
  To: netdev; +Cc: davem, jiri, amitc, mlxsw, Ido Schimmel

From: Ido Schimmel <idosch@mellanox.com>

Patch #1, from Amit, exposes the size of the key-value database (KVD)
where different entries (e.g., routes, neighbours) are stored in the
device. This allows users to understand how many entries can be
offloaded and is also useful for writing scale tests.

Patch #2 increases the number of IPv6 nexthop groups mlxsw can offload.
The problem and solution are explained in detail in the commit message.

Amit Cohen (1):
  mlxsw: spectrum: Expose KVD size for Spectrum-2

Ido Schimmel (1):
  mlxsw: spectrum_router: Increase scale of IPv6 nexthop groups

 .../net/ethernet/mellanox/mlxsw/spectrum.c    | 22 ++++++++++++++++++-
 .../ethernet/mellanox/mlxsw/spectrum_router.c |  4 ++--
 2 files changed, 23 insertions(+), 3 deletions(-)

-- 
2.21.0


^ permalink raw reply

* [PATCH net-next 1/2] mlxsw: spectrum: Expose KVD size for Spectrum-2
From: Ido Schimmel @ 2019-07-23  7:57 UTC (permalink / raw)
  To: netdev; +Cc: davem, jiri, amitc, mlxsw, Ido Schimmel
In-Reply-To: <20190723075742.29029-1-idosch@idosch.org>

From: Amit Cohen <amitc@mellanox.com>

Unlike Spectrum-1, the KVD (Key-value database) of Spectrum-2 is not
partitioned, so only expose the entire KVD size. This enables users to
query the total size of the KVD.

Signed-off-by: Amit Cohen <amitc@mellanox.com>
Acked-by: Jiri Pirko <jiri@mellanox.com>
Signed-off-by: Ido Schimmel <idosch@mellanox.com>
---
 .../net/ethernet/mellanox/mlxsw/spectrum.c    | 22 ++++++++++++++++++-
 1 file changed, 21 insertions(+), 1 deletion(-)

diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum.c
index 650638152bbc..7e8a54068d92 100644
--- a/drivers/net/ethernet/mellanox/mlxsw/spectrum.c
+++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum.c
@@ -5026,6 +5026,26 @@ static int mlxsw_sp1_resources_kvd_register(struct mlxsw_core *mlxsw_core)
 	return 0;
 }
 
+static int mlxsw_sp2_resources_kvd_register(struct mlxsw_core *mlxsw_core)
+{
+	struct devlink *devlink = priv_to_devlink(mlxsw_core);
+	struct devlink_resource_size_params kvd_size_params;
+	u32 kvd_size;
+
+	if (!MLXSW_CORE_RES_VALID(mlxsw_core, KVD_SIZE))
+		return -EIO;
+
+	kvd_size = MLXSW_CORE_RES_GET(mlxsw_core, KVD_SIZE);
+	devlink_resource_size_params_init(&kvd_size_params, kvd_size, kvd_size,
+					  MLXSW_SP_KVD_GRANULARITY,
+					  DEVLINK_RESOURCE_UNIT_ENTRY);
+
+	return devlink_resource_register(devlink, MLXSW_SP_RESOURCE_NAME_KVD,
+					 kvd_size, MLXSW_SP_RESOURCE_KVD,
+					 DEVLINK_RESOURCE_ID_PARENT_TOP,
+					 &kvd_size_params);
+}
+
 static int mlxsw_sp1_resources_register(struct mlxsw_core *mlxsw_core)
 {
 	return mlxsw_sp1_resources_kvd_register(mlxsw_core);
@@ -5033,7 +5053,7 @@ static int mlxsw_sp1_resources_register(struct mlxsw_core *mlxsw_core)
 
 static int mlxsw_sp2_resources_register(struct mlxsw_core *mlxsw_core)
 {
-	return 0;
+	return mlxsw_sp2_resources_kvd_register(mlxsw_core);
 }
 
 static int mlxsw_sp_kvd_sizes_get(struct mlxsw_core *mlxsw_core,
-- 
2.21.0


^ permalink raw reply related

* [PATCH net-next 2/2] mlxsw: spectrum_router: Increase scale of IPv6 nexthop groups
From: Ido Schimmel @ 2019-07-23  7:57 UTC (permalink / raw)
  To: netdev; +Cc: davem, jiri, amitc, mlxsw, Ido Schimmel
In-Reply-To: <20190723075742.29029-1-idosch@idosch.org>

From: Ido Schimmel <idosch@mellanox.com>

Unlike IPv4, the kernel does not consolidate IPv6 nexthop groups. To
avoid exhausting the device's adjacency table - where nexthops are
stored - the driver does this consolidation instead.

Each nexthop group is hashed by XOR-ing the interface indexes of all the
member nexthop devices. However, the ifindex itself is not hashed, which
can result in identical keys used for different groups and finally an
-EBUSY error from rhashtable due to too long objects list.

Improve the situation by hashing the ifindex itself.

Signed-off-by: Ido Schimmel <idosch@mellanox.com>
Acked-by: Jiri Pirko <jiri@mellanox.com>
---
 drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c
index e618be7ce6c6..a330b369e899 100644
--- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c
+++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c
@@ -2943,7 +2943,7 @@ static u32 mlxsw_sp_nexthop_group_hash_obj(const void *data, u32 len, u32 seed)
 		val = nh_grp->count;
 		for (i = 0; i < nh_grp->count; i++) {
 			nh = &nh_grp->nexthops[i];
-			val ^= nh->ifindex;
+			val ^= jhash(&nh->ifindex, sizeof(nh->ifindex), seed);
 		}
 		return jhash(&val, sizeof(val), seed);
 	default:
@@ -2961,7 +2961,7 @@ mlxsw_sp_nexthop6_group_hash(struct mlxsw_sp_fib6_entry *fib6_entry, u32 seed)
 
 	list_for_each_entry(mlxsw_sp_rt6, &fib6_entry->rt6_list, list) {
 		dev = mlxsw_sp_rt6->rt->fib6_nh->fib_nh_dev;
-		val ^= dev->ifindex;
+		val ^= jhash(&dev->ifindex, sizeof(dev->ifindex), seed);
 	}
 
 	return jhash(&val, sizeof(val), seed);
-- 
2.21.0


^ permalink raw reply related

* [PATCH] atm: Use dev_get_drvdata
From: Chuhong Yuan @ 2019-07-23  8:13 UTC (permalink / raw)
  Cc: Chas Williams, linux-atm-general, netdev, linux-kernel,
	Chuhong Yuan

Instead of using to_pci_dev + pci_get_drvdata,
use dev_get_drvdata to make code simpler.

Signed-off-by: Chuhong Yuan <hslester96@gmail.com>
---
 drivers/atm/solos-pci.c | 9 +++------
 1 file changed, 3 insertions(+), 6 deletions(-)

diff --git a/drivers/atm/solos-pci.c b/drivers/atm/solos-pci.c
index 5c4c6eeb505c..c32f7dd9879a 100644
--- a/drivers/atm/solos-pci.c
+++ b/drivers/atm/solos-pci.c
@@ -516,9 +516,8 @@ struct geos_gpio_attr {
 static ssize_t geos_gpio_store(struct device *dev, struct device_attribute *attr,
 			       const char *buf, size_t count)
 {
-	struct pci_dev *pdev = to_pci_dev(dev);
 	struct geos_gpio_attr *gattr = container_of(attr, struct geos_gpio_attr, attr);
-	struct solos_card *card = pci_get_drvdata(pdev);
+	struct solos_card *card = dev_get_drvdata(dev);
 	uint32_t data32;
 
 	if (count != 1 && (count != 2 || buf[1] != '\n'))
@@ -542,9 +541,8 @@ static ssize_t geos_gpio_store(struct device *dev, struct device_attribute *attr
 static ssize_t geos_gpio_show(struct device *dev, struct device_attribute *attr,
 			      char *buf)
 {
-	struct pci_dev *pdev = to_pci_dev(dev);
 	struct geos_gpio_attr *gattr = container_of(attr, struct geos_gpio_attr, attr);
-	struct solos_card *card = pci_get_drvdata(pdev);
+	struct solos_card *card = dev_get_drvdata(dev);
 	uint32_t data32;
 
 	data32 = ioread32(card->config_regs + GPIO_STATUS);
@@ -556,9 +554,8 @@ static ssize_t geos_gpio_show(struct device *dev, struct device_attribute *attr,
 static ssize_t hardware_show(struct device *dev, struct device_attribute *attr,
 			     char *buf)
 {
-	struct pci_dev *pdev = to_pci_dev(dev);
 	struct geos_gpio_attr *gattr = container_of(attr, struct geos_gpio_attr, attr);
-	struct solos_card *card = pci_get_drvdata(pdev);
+	struct solos_card *card = dev_get_drvdata(dev);
 	uint32_t data32;
 
 	data32 = ioread32(card->config_regs + GPIO_STATUS);
-- 
2.20.1


^ permalink raw reply related

* Re: [PATCH 3/3] uio: remove netx driver
From: Arnd Bergmann @ 2019-07-23  8:14 UTC (permalink / raw)
  To: Michael Trensch
  Cc: Greg Kroah-Hartman, 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: <415f511480774ca58e068d6c005c917b@hilscher.com>

On Tue, Jul 23, 2019 at 7:45 AM Michael Trensch <MTrensch@hilscher.com> wrote:
>
> 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.

Ok, thanks for the quick reply, let's pretend I never sent that patch then.

      Arnd

^ permalink raw reply

* RE: [PATCH net-next 3/3] net: stmmac: Introducing support for Page Pool
From: Jose Abreu @ 2019-07-23  8:14 UTC (permalink / raw)
  To: Jon Hunter, Jose Abreu, Lars Persson, Ilias Apalodimas
  Cc: linux-kernel@vger.kernel.org, netdev@vger.kernel.org,
	linux-stm32@st-md-mailman.stormreply.com,
	linux-arm-kernel@lists.infradead.org, Joao Pinto,
	David S . Miller, Giuseppe Cavallaro, Alexandre Torgue,
	Maxime Coquelin, Maxime Ripard, Chen-Yu Tsai, linux-tegra
In-Reply-To: <BN8PR12MB3266664ECA192E02C06061EED3C40@BN8PR12MB3266.namprd12.prod.outlook.com>

From: Jose Abreu <joabreu@synopsys.com>
Date: Jul/22/2019, 15:04:49 (UTC+00:00)

> From: Jon Hunter <jonathanh@nvidia.com>
> Date: Jul/22/2019, 13:05:38 (UTC+00:00)
> 
> > 
> > On 22/07/2019 12:39, Jose Abreu wrote:
> > > From: Lars Persson <lists@bofh.nu>
> > > Date: Jul/22/2019, 12:11:50 (UTC+00:00)
> > > 
> > >> On Mon, Jul 22, 2019 at 12:18 PM Ilias Apalodimas
> > >> <ilias.apalodimas@linaro.org> wrote:
> > >>>
> > >>> On Thu, Jul 18, 2019 at 07:48:04AM +0000, Jose Abreu wrote:
> > >>>> From: Jon Hunter <jonathanh@nvidia.com>
> > >>>> Date: Jul/17/2019, 19:58:53 (UTC+00:00)
> > >>>>
> > >>>>> Let me know if you have any thoughts.
> > >>>>
> > >>>> Can you try attached patch ?
> > >>>>
> > >>>
> > >>> The log says  someone calls panic() right?
> > >>> Can we trye and figure were that happens during the stmmac init phase?
> > >>>
> > >>
> > >> The reason for the panic is hidden in this one line of the kernel logs:
> > >> Kernel panic - not syncing: Attempted to kill init! exitcode=0x0000000b
> > >>
> > >> The init process is killed by SIGSEGV (signal 11 = 0xb).
> > >>
> > >> I would suggest you look for data corruption bugs in the RX path. If
> > >> the code is fetched from the NFS mount then a corrupt RX buffer can
> > >> trigger a crash in userspace.
> > >>
> > >> /Lars
> > > 
> > > 
> > > Jon, I'm not familiar with ARM. Are the buffer addresses being allocated 
> > > in a coherent region ? Can you try attached patch which adds full memory 
> > > barrier before the sync ?
> > 
> > TBH I am not sure about the buffer addresses either. The attached patch
> > did not help. Same problem persists.
> 
> OK. I'm just guessing now at this stage but can you disable SMP ?
> 
> We have to narrow down if this is coherency issue but you said that 
> booting without NFS and then mounting manually the share works ... So, 
> can you share logs with same debug prints in this condition in order to 
> compare ?

Jon, I have one ARM based board and I can't face your issue but I 
noticed that my buffer addresses are being mapped using SWIOTLB. Can you 
disable IOMMU support on your setup and let me know if the problem 
persists ?

---
Thanks,
Jose Miguel Abreu

^ permalink raw reply

* [PATCH net 0/2] selftests: forwarding: GRE multipath fixes
From: Ido Schimmel @ 2019-07-23  8:19 UTC (permalink / raw)
  To: netdev; +Cc: davem, ssuryaextr, mlxsw, Ido Schimmel

From: Ido Schimmel <idosch@mellanox.com>

Patch #1 ensures IPv4 forwarding is enabled during the test.

Patch #2 fixes the flower filters used to measure the distribution of
the traffic between the two nexthops, so that the test will pass
regardless if traffic is offloaded or not.

Ido Schimmel (2):
  selftests: forwarding: gre_multipath: Enable IPv4 forwarding
  selftests: forwarding: gre_multipath: Fix flower filters

 .../selftests/net/forwarding/gre_multipath.sh | 28 +++++++++++--------
 1 file changed, 16 insertions(+), 12 deletions(-)

-- 
2.21.0


^ permalink raw reply

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

From: Ido Schimmel <idosch@mellanox.com>

The TC filters used in the test do not work with veth devices because the
outer Ethertype is 802.1Q and not IPv4. The test passes with mlxsw
netdevs since the hardware always looks at "The first Ethertype that
does not point to either: VLAN, CNTAG or configurable Ethertype".

Fix this by matching on the VLAN ID instead, but on the ingress side.
The reason why this is not performed at egress is explained in the
commit cited below.

Fixes: 541ad323db3a ("selftests: forwarding: gre_multipath: Update next-hop statistics match criteria")
Signed-off-by: Ido Schimmel <idosch@mellanox.com>
Reported-by: Stephen Suryaputra <ssuryaextr@gmail.com>
Tested-by: Stephen Suryaputra <ssuryaextr@gmail.com>
---
 .../selftests/net/forwarding/gre_multipath.sh | 24 +++++++++----------
 1 file changed, 12 insertions(+), 12 deletions(-)

diff --git a/tools/testing/selftests/net/forwarding/gre_multipath.sh b/tools/testing/selftests/net/forwarding/gre_multipath.sh
index 37d7297e1cf8..a8d8e8b3dc81 100755
--- a/tools/testing/selftests/net/forwarding/gre_multipath.sh
+++ b/tools/testing/selftests/net/forwarding/gre_multipath.sh
@@ -93,18 +93,10 @@ sw1_create()
 	ip route add vrf v$ol1 192.0.2.16/28 \
 	   nexthop dev g1a \
 	   nexthop dev g1b
-
-	tc qdisc add dev $ul1 clsact
-	tc filter add dev $ul1 egress pref 111 prot ipv4 \
-	   flower dst_ip 192.0.2.66 action pass
-	tc filter add dev $ul1 egress pref 222 prot ipv4 \
-	   flower dst_ip 192.0.2.82 action pass
 }
 
 sw1_destroy()
 {
-	tc qdisc del dev $ul1 clsact
-
 	ip route del vrf v$ol1 192.0.2.16/28
 
 	ip route del vrf v$ol1 192.0.2.82/32 via 192.0.2.146
@@ -139,10 +131,18 @@ sw2_create()
 	ip route add vrf v$ol2 192.0.2.0/28 \
 	   nexthop dev g2a \
 	   nexthop dev g2b
+
+	tc qdisc add dev $ul2 clsact
+	tc filter add dev $ul2 ingress pref 111 prot 802.1Q \
+	   flower vlan_id 111 action pass
+	tc filter add dev $ul2 ingress pref 222 prot 802.1Q \
+	   flower vlan_id 222 action pass
 }
 
 sw2_destroy()
 {
+	tc qdisc del dev $ul2 clsact
+
 	ip route del vrf v$ol2 192.0.2.0/28
 
 	ip route del vrf v$ol2 192.0.2.81/32 via 192.0.2.145
@@ -215,15 +215,15 @@ multipath4_test()
 	   nexthop dev g1a weight $weight1 \
 	   nexthop dev g1b weight $weight2
 
-	local t0_111=$(tc_rule_stats_get $ul1 111 egress)
-	local t0_222=$(tc_rule_stats_get $ul1 222 egress)
+	local t0_111=$(tc_rule_stats_get $ul2 111 ingress)
+	local t0_222=$(tc_rule_stats_get $ul2 222 ingress)
 
 	ip vrf exec v$h1 \
 	   $MZ $h1 -q -p 64 -A 192.0.2.1 -B 192.0.2.18 \
 	       -d 1msec -t udp "sp=1024,dp=0-32768"
 
-	local t1_111=$(tc_rule_stats_get $ul1 111 egress)
-	local t1_222=$(tc_rule_stats_get $ul1 222 egress)
+	local t1_111=$(tc_rule_stats_get $ul2 111 ingress)
+	local t1_222=$(tc_rule_stats_get $ul2 222 ingress)
 
 	local d111=$((t1_111 - t0_111))
 	local d222=$((t1_222 - t0_222))
-- 
2.21.0


^ permalink raw reply related

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

From: Ido Schimmel <idosch@mellanox.com>

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

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

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


^ permalink raw reply related

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

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

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

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

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

Linus Walleij

^ permalink raw reply

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

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

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

Would you like to achieve any improvements in this area?

Regards,
Markus

^ permalink raw reply

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

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

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

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

Anyways, the patches are identical except here:

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

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

Yours,
Linus Walleij

^ permalink raw reply

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

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

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

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

       Arnd

^ permalink raw reply

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



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

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

Thanks,
Song

^ permalink raw reply

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

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

#syz invalid

^ permalink raw reply

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

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

+net/netrom/af_netrom.c maintainers


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

^ permalink raw reply

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

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

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

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




^ permalink raw reply related

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

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

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

Hi,


libnl3 does currently not ever set NLA_F_NESTED flag.

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

As workaround, one could call

  nla_nest_start(msg, NLA_F_NESTED | attr);


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


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

What I mean is that for example

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

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

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


best,
Thomas

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

^ permalink raw reply

* Re: [net-next:master 13/14] drivers/net/ethernet/faraday/ftgmac100.c:777:13: error: 'skb_frag_t {aka struct bio_vec}' has no member named 'size'
From: René van Dorst @ 2019-07-23  8:58 UTC (permalink / raw)
  To: Matthew Wilcox (Oracle); +Cc: kbuild-all, netdev, davem
In-Reply-To: <201907231400.Q5QaKepi%lkp@intel.com>

Hi Matthew,

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


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

Greats,

René


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




^ permalink raw reply

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

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

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

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

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

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


^ permalink raw reply related


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