* [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
page: next (older) | prev (newer) | latest
- recent:[subjects (threaded)|topics (new)|topics (active)]
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox