From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 4E5F9A0C53; Fri, 3 Sep 2021 09:15:00 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id CE49540DDE; Fri, 3 Sep 2021 09:14:59 +0200 (CEST) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [216.205.24.124]) by mails.dpdk.org (Postfix) with ESMTP id CDFFC406B4 for ; Fri, 3 Sep 2021 09:14:57 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1630653296; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: in-reply-to:in-reply-to:references:references; bh=NA0FzRp0FLRVjX5rgiuggJOXNqbFXx8ecJ9iqd8uum0=; b=D3qbLC91V1XJtvKTGa0PTL+H1UnsksH+PvgiBgRRqNyOF3PJLRdGIM6VVTO7AgFZa3e8D+ i76Qm1c95hZpM9RtE3kekXE8M9bw3YehzhZYzgOjl40ScGZXBJLC14zekAzqhT1GWBtliU +yxhgz+uTtHfoFRboaev9oBO0zhZ6Jk= Received: from mail-lj1-f198.google.com (mail-lj1-f198.google.com [209.85.208.198]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-201-CyhNvGIlOO2k4gUZHYCBnQ-1; Fri, 03 Sep 2021 03:14:48 -0400 X-MC-Unique: CyhNvGIlOO2k4gUZHYCBnQ-1 Received: by mail-lj1-f198.google.com with SMTP id x10-20020a05651c024a00b001cf8e423d60so1850459ljn.12 for ; Fri, 03 Sep 2021 00:14:48 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=NA0FzRp0FLRVjX5rgiuggJOXNqbFXx8ecJ9iqd8uum0=; b=rsmWhmZWErgmlCi2nbOaHSB3S0epjVgwJ92aDeUPxwa7WxAtJHyj49atc3oag5zqDB Dvuhxx833V4EpsCq90vDHyVq6HOlLU8B48gQO/TXHQqTK0u1RB/uyet6CuFMswaut/CX uwQMtmXQIkXgSFU+O7BWDDcIq9cEyrTzH3k9a4uOF1hsG3sMhseWcSwURZG4dRmRm0Z4 b+ySWGn17DudaW3dsEmjDjqMkhLlGFEh+EWgkypXG1AKOmq1Ls1DLPl/GehfyXqWpWAO sZXFWIGP/xTn1+h9LFW+eX54ES+H/F48S0CrPjNvOJdvrY3SykPrGHETlKU4oIfqwUqG lJjQ== X-Gm-Message-State: AOAM531lZKUgYwFLEYzm41IsXxyhJe+g8rdvGwSjmCwhMaJoX6wjoS+e Vwk/egtdKxazWZJI3ePbI3c3EPTmox0suArmxI+JObfWICtC7Ff4zCylfzpC/Qg3qdH/8iVfzeN PjbqY9yty/0JnhXA0Wbc= X-Received: by 2002:a2e:7d11:: with SMTP id y17mr1798416ljc.368.1630653286545; Fri, 03 Sep 2021 00:14:46 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwnflrZh7kqQR8Al/09tpVY9HUcBDlsaHDRIQmiuOFXmLBHhYFORi3V6TG3x0T8W7rQLgBwZROzhctG6pz2aJE= X-Received: by 2002:a2e:7d11:: with SMTP id y17mr1798398ljc.368.1630653286159; Fri, 03 Sep 2021 00:14:46 -0700 (PDT) MIME-Version: 1.0 References: <20210902175955.9202-1-apeksha.gupta@nxp.com> <20210902175955.9202-2-apeksha.gupta@nxp.com> In-Reply-To: <20210902175955.9202-2-apeksha.gupta@nxp.com> From: David Marchand Date: Fri, 3 Sep 2021 09:14:34 +0200 Message-ID: To: Apeksha Gupta Cc: Andrew Rybchenko , "Yigit, Ferruh" , dev , Hemant Agrawal , Sachin Saxena Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=dmarchan@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: text/plain; charset="UTF-8" Subject: Re: [dpdk-dev] [PATCH v2 1/5] net/enetfec: introduce NXP ENETFEC driver X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" On Thu, Sep 2, 2021 at 8:01 PM Apeksha Gupta wrote: > > ENETFEC (Fast Ethernet Controller) is a network poll mode driver > for NXP SoC i.MX 8M Mini. > > This patch adds skeleton for enetfec driver with probe function. > > Signed-off-by: Sachin Saxena > Signed-off-by: Apeksha Gupta > --- > doc/guides/nics/enetfec.rst | 121 ++++++++++++++++++++ > doc/guides/nics/features/enetfec.ini | 8 ++ > doc/guides/nics/index.rst | 1 + > drivers/net/enetfec/enet_ethdev.c | 95 ++++++++++++++++ > drivers/net/enetfec/enet_ethdev.h | 160 +++++++++++++++++++++++++++ > drivers/net/enetfec/enet_pmd_logs.h | 31 ++++++ > drivers/net/enetfec/meson.build | 15 +++ > drivers/net/enetfec/version.map | 3 + > drivers/net/meson.build | 1 + > 9 files changed, 435 insertions(+) > create mode 100644 doc/guides/nics/enetfec.rst > create mode 100644 doc/guides/nics/features/enetfec.ini > create mode 100644 drivers/net/enetfec/enet_ethdev.c > create mode 100644 drivers/net/enetfec/enet_ethdev.h > create mode 100644 drivers/net/enetfec/enet_pmd_logs.h > create mode 100644 drivers/net/enetfec/meson.build > create mode 100644 drivers/net/enetfec/version.map Please update MAINTAINERS and release notes in this first patch. > > diff --git a/doc/guides/nics/enetfec.rst b/doc/guides/nics/enetfec.rst > new file mode 100644 > index 0000000000..f151bb26c4 > --- /dev/null > +++ b/doc/guides/nics/enetfec.rst > @@ -0,0 +1,121 @@ > +.. SPDX-License-Identifier: BSD-3-Clause > + Copyright 2021 NXP > + > +ENETFEC Poll Mode Driver > +======================== > + > +The ENETFEC NIC PMD (**librte_net_enetfec**) provides poll mode driver > +support for the inbuilt NIC found in the ** NXP i.MX 8M Mini** SoC. > + > +More information can be found at NXP Official Website > + > + > +ENETFEC > +------- > + > +This section provides an overview of the NXP ENETFEC and how it is > +integrated into the DPDK. > + > +Contents summary > + > +- ENETFEC overview > +- ENETFEC features > +- Supported ENETFEC SoCs > +- Prerequisites > +- Driver compilation and testing > +- Limitations > + > +ENETFEC Overview > +~~~~~~~~~~~~~~~~ > +The i.MX 8M Mini Media Applications Processor is built to achieve both high > +performance and low power consumption. ENETFEC is a hardware programmable > +packet forwarding engine to provide high performance Ethernet interface. > +The diagram below shows a system level overview of ENETFEC: > + > + ====================================================+=============== > + US +-----------------------------------------+ | Kernel Space > + | | | > + | ENETFEC Driver | | > + +-----------------------------------------+ | > + ^ | | > + ENETFEC RXQ | | TXQ | > + PMD | | | > + | v | +----------+ Misalignment of the right part. > + +-------------+ | | fec-uio | What is fec-uio? I can't find it in upstream linux kernel. > + | net_enetfec | | +----------+ > + +-------------+ | > + ^ | | > + TXQ | | RXQ | > + | | | > + | v | > + ===================================================+=============== > + +----------------------------------------+ > + | | HW > + | i.MX 8M MINI EVK | > + | +-----+ | > + | | MAC | | > + +---------------+-----+------------------+ > + | PHY | > + +-----+ Misalignment. > + > +ENETFEC Ethernet driver is traditional DPDK PMD driver running in the userspace. > +The MAC and PHY are the hardware blocks. 'fec-uio' is the UIO driver, ENETFEC PMD > +uses UIO interface to interact with kernel for PHY initialisation and for mapping > +the allocated memory of register & BD in kernel with DPDK which gives access to > +non-cacheable memory for BD. net_enetfec is logical Ethernet interface, created by > +ENETFEC driver. > + > +- ENETFEC driver registers the device in virtual device driver. > +- RTE framework scans and will invoke the probe function of ENETFEC driver. > +- The probe function will set the basic device registers and also setups BD rings. > +- On packet Rx the respective BD Ring status bit is set which is then used for > + packet processing. > +- Then Tx is done first followed by Rx via logical interfaces. > + > +ENETFEC Features > +~~~~~~~~~~~~~~~~~ > + > +- ARMv8 > + > +Supported ENETFEC SoCs > +~~~~~~~~~~~~~~~~~~~~~~ > + > +- i.MX 8M Mini > + > +Prerequisites > +~~~~~~~~~~~~~ > + > +There are three main pre-requisites for executing ENETFEC PMD on a i.MX 8M Mini > +compatible board: > + > +1. **ARM 64 Tool Chain** > + > + For example, the `*aarch64* Linaro Toolchain `_. > + > +2. **Linux Kernel** > + > + It can be obtained from `NXP's Github hosting `_. > + > +3. **Rootfile system** > + > + Any *aarch64* supporting filesystem can be used. For example, > + Ubuntu 18.04 LTS (Bionic) or 20.04 LTS(Focal) userland which can be obtained > + from `here `_. > + > +4. The Ethernet device will be registered as virtual device, so ENETFEC has dependency on > + **rte_bus_vdev** library and it is mandatory to use `--vdev` with value `net_enetfec` to > + run DPDK application. > + > +Driver compilation and testing > +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ > + > +Follow instructions available in the document > +:ref:`compiling and testing a PMD for a NIC ` > +to launch **testpmd** dpdk-testpmd. > + > +Limitations > +~~~~~~~~~~~ > + > +- Multi queue is not supported. > +- Link status is down always. > +- Single Ethernet interface. > diff --git a/doc/guides/nics/features/enetfec.ini b/doc/guides/nics/features/enetfec.ini > new file mode 100644 > index 0000000000..5700697981 > --- /dev/null > +++ b/doc/guides/nics/features/enetfec.ini > @@ -0,0 +1,8 @@ > +; > +; Supported features of the 'enetfec' network poll mode driver. > +; > +; Refer to default.ini for the full list of available PMD features. > +; > +[Features] > +ARMv8 = Y > +Usage doc = Y > diff --git a/doc/guides/nics/index.rst b/doc/guides/nics/index.rst > index 784d5d39f6..777fdab4a0 100644 > --- a/doc/guides/nics/index.rst > +++ b/doc/guides/nics/index.rst > @@ -26,6 +26,7 @@ Network Interface Controller Drivers > e1000em > ena > enetc > + enetfec > enic > fm10k > hinic > diff --git a/drivers/net/enetfec/enet_ethdev.c b/drivers/net/enetfec/enet_ethdev.c > new file mode 100644 > index 0000000000..88774788cf > --- /dev/null > +++ b/drivers/net/enetfec/enet_ethdev.c > @@ -0,0 +1,95 @@ > +/* SPDX-License-Identifier: BSD-3-Clause > + * Copyright 2020-2021 NXP > + */ > + > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include "enet_ethdev.h" > +#include "enet_pmd_logs.h" > + > +#define ENETFEC_NAME_PMD net_enetfec > +#define ENETFEC_VDEV_GEM_ID_ARG "intf" > +#define ENETFEC_CDEV_INVALID_FD -1 > + > +int enetfec_logtype_pmd; If using RTE_LOG_REGISTER* macros (see below), you don't need this definition. > + > +static int > +enetfec_eth_init(struct rte_eth_dev *dev) > +{ > + rte_eth_dev_probing_finish(dev); > + return 0; > +} > + > +static int > +pmd_enetfec_probe(struct rte_vdev_device *vdev) > +{ > + struct rte_eth_dev *dev = NULL; > + struct enetfec_private *fep; > + const char *name; > + int rc; > + > + name = rte_vdev_device_name(vdev); > + if (name == NULL) > + return -EINVAL; > + ENETFEC_PMD_LOG(INFO, "Initializing pmd_fec for %s", name); > + > + dev = rte_eth_vdev_allocate(vdev, sizeof(*fep)); > + if (dev == NULL) > + return -ENOMEM; > + > + /* setup board info structure */ > + fep = dev->data->dev_private; > + fep->dev = dev; > + rc = enetfec_eth_init(dev); > + if (rc) > + goto failed_init; > + > + return 0; > + > +failed_init: > + ENETFEC_PMD_ERR("Failed to init"); > + return rc; > +} > + > +static int > +pmd_enetfec_remove(struct rte_vdev_device *vdev) > +{ > + struct rte_eth_dev *eth_dev = NULL; > + int ret; > + > + /* find the ethdev entry */ > + eth_dev = rte_eth_dev_allocated(rte_vdev_device_name(vdev)); > + if (eth_dev == NULL) > + return -ENODEV; > + > + ret = rte_eth_dev_release_port(eth_dev); > + if (ret != 0) > + return -EINVAL; > + > + ENETFEC_PMD_INFO("Closing sw device"); > + return 0; > +} > + > +static struct rte_vdev_driver pmd_enetfec_drv = { > + .probe = pmd_enetfec_probe, > + .remove = pmd_enetfec_remove, > +}; > + > +RTE_PMD_REGISTER_VDEV(ENETFEC_NAME_PMD, pmd_enetfec_drv); > +RTE_PMD_REGISTER_PARAM_STRING(ENETFEC_NAME_PMD, ENETFEC_VDEV_GEM_ID_ARG "="); > + > +RTE_INIT(enetfec_pmd_init_log) > +{ > + int ret; > + ret = rte_log_register_type_and_pick_level(ENETFEC_LOGTYPE_PREFIX "driver", > + RTE_LOG_NOTICE); > + enetfec_logtype_pmd = (ret < 0) ? RTE_LOGTYPE_PMD : ret; > +} Please use RTE_LOG_REGISTER_DEFAULT. > diff --git a/drivers/net/enetfec/enet_ethdev.h b/drivers/net/enetfec/enet_ethdev.h > new file mode 100644 > index 0000000000..8c61176fb5 > --- /dev/null > +++ b/drivers/net/enetfec/enet_ethdev.h > @@ -0,0 +1,160 @@ > +/* SPDX-License-Identifier: BSD-3-Clause > + * Copyright 2020-2021 NXP > + */ > + > +#ifndef __ENETFEC_ETHDEV_H__ > +#define __ENETFEC_ETHDEV_H__ > + > +#include > +#include > + > +/* Common log type name prefix */ > +#define ENETFEC_LOGTYPE_PREFIX "pmd.net.enetfec." > + > +/* > + * ENETFEC with AVB IP can support maximum 3 rx and tx queues. > + */ > +#define ENETFEC_MAX_Q 3 > + > +#define BD_LEN 49152 > +#define ENETFEC_TX_FR_SIZE 2048 > +#define MAX_TX_BD_RING_SIZE 512 /* It should be power of 2 */ > +#define MAX_RX_BD_RING_SIZE 512 > + > +/* full duplex or half duplex */ > +#define HALF_DUPLEX 0x00 > +#define FULL_DUPLEX 0x01 > +#define UNKNOWN_DUPLEX 0xff > + > +#define PKT_MAX_BUF_SIZE 1984 > +#define OPT_FRAME_SIZE (PKT_MAX_BUF_SIZE << 16) > +#define ETH_ALEN RTE_ETHER_ADDR_LEN > +#define ETH_HLEN RTE_ETHER_HDR_LEN > +#define VLAN_HLEN 4 > + > +struct bufdesc { > + uint16_t bd_datlen; /* buffer data length */ > + uint16_t bd_sc; /* buffer control & status */ > + uint32_t bd_bufaddr; /* buffer address */ > +}; > + > +struct bufdesc_ex { > + struct bufdesc desc; > + uint32_t bd_esc; > + uint32_t bd_prot; > + uint32_t bd_bdu; > + uint32_t ts; > + uint16_t res0[4]; > +}; > + > +struct bufdesc_prop { > + int que_id; > + /* Addresses of Tx and Rx buffers */ > + struct bufdesc *base; > + struct bufdesc *last; > + struct bufdesc *cur; > + void __iomem *active_reg_desc; > + uint64_t descr_baseaddr_p; > + unsigned short ring_size; > + unsigned char d_size; > + unsigned char d_size_log2; > +}; > + > +struct enetfec_priv_tx_q { > + struct bufdesc_prop bd; > + struct rte_mbuf *tx_mbuf[MAX_TX_BD_RING_SIZE]; > + struct bufdesc *dirty_tx; > + struct rte_mempool *pool; > + struct enetfec_private *fep; > +}; > + > +struct enetfec_priv_rx_q { > + struct bufdesc_prop bd; > + struct rte_mbuf *rx_mbuf[MAX_RX_BD_RING_SIZE]; > + struct rte_mempool *pool; > + struct enetfec_private *fep; > +}; > + > +/* Buffer descriptors of FEC are used to track the ring buffers. Buffer > + * descriptor base is x_bd_base. Currently available buffer are x_cur > + * and x_cur. where x is rx or tx. Current buffer is tracked by dirty_tx > + * that is sent by the controller. > + * The tx_cur and dirty_tx are same in completely full and empty > + * conditions. Actual condition is determined by empty & ready bits. > + */ > +struct enetfec_private { > + struct rte_eth_dev *dev; > + struct rte_eth_stats stats; > + struct rte_mempool *pool; > + uint16_t max_rx_queues; > + uint16_t max_tx_queues; > + unsigned int total_tx_ring_size; > + unsigned int total_rx_ring_size; > + bool bufdesc_ex; > + unsigned int tx_align; > + unsigned int rx_align; > + int full_duplex; > + unsigned int phy_speed; > + u_int32_t quirks; > + int flag_csum; > + int flag_pause; > + int flag_wol; > + bool rgmii_txc_delay; > + bool rgmii_rxc_delay; > + int link; > + void *hw_baseaddr_v; > + uint64_t hw_baseaddr_p; > + void *bd_addr_v; > + uint64_t bd_addr_p; > + uint64_t bd_addr_p_r[ENETFEC_MAX_Q]; > + uint64_t bd_addr_p_t[ENETFEC_MAX_Q]; > + void *dma_baseaddr_r[ENETFEC_MAX_Q]; > + void *dma_baseaddr_t[ENETFEC_MAX_Q]; > + uint64_t cbus_size; > + unsigned int reg_size; > + unsigned int bd_size; > + int hw_ts_rx_en; > + int hw_ts_tx_en; > + struct enetfec_priv_rx_q *rx_queues[ENETFEC_MAX_Q]; > + struct enetfec_priv_tx_q *tx_queues[ENETFEC_MAX_Q]; > +}; > + > +#define writel(v, p) ({*(volatile unsigned int *)(p) = (v); }) > +#define readl(p) rte_read32(p) > + > +static inline struct > +bufdesc *enet_get_nextdesc(struct bufdesc *bdp, struct bufdesc_prop *bd) > +{ > + return (bdp >= bd->last) ? bd->base > + : (struct bufdesc *)(((void *)bdp) + bd->d_size); > +} > + > +static inline struct > +bufdesc *enet_get_prevdesc(struct bufdesc *bdp, struct bufdesc_prop *bd) > +{ > + return (bdp <= bd->base) ? bd->last > + : (struct bufdesc *)(((void *)bdp) - bd->d_size); > +} > + > +static inline int > +enet_get_bd_index(struct bufdesc *bdp, struct bufdesc_prop *bd) > +{ > + return ((const char *)bdp - (const char *)bd->base) >> bd->d_size_log2; > +} > + > +static inline int > +fls64(unsigned long word) > +{ > + return (64 - __builtin_clzl(word)) - 1; > +} > + > +uint16_t enetfec_recv_pkts(void *rxq1, __rte_unused struct rte_mbuf **rx_pkts, > + uint16_t nb_pkts); > +uint16_t enetfec_xmit_pkts(void *tx_queue, struct rte_mbuf **tx_pkts, > + uint16_t nb_pkts); > +struct bufdesc *enet_get_nextdesc(struct bufdesc *bdp, > + struct bufdesc_prop *bd); > +int enet_new_rxbdp(struct enetfec_private *fep, struct bufdesc *bdp, > + struct rte_mbuf *mbuf); > + > +#endif /*__ENETFEC_ETHDEV_H__*/ > diff --git a/drivers/net/enetfec/enet_pmd_logs.h b/drivers/net/enetfec/enet_pmd_logs.h > new file mode 100644 > index 0000000000..e7b3964a0e > --- /dev/null > +++ b/drivers/net/enetfec/enet_pmd_logs.h > @@ -0,0 +1,31 @@ > +/* SPDX-License-Identifier: BSD-3-Clause > + * Copyright 2020-2021 NXP > + */ > + > +#ifndef _ENETFEC_LOGS_H_ > +#define _ENETFEC_LOGS_H_ > + > +extern int enetfec_logtype_pmd; > + > +/* PMD related logs */ > +#define ENETFEC_PMD_LOG(level, fmt, args...) \ > + rte_log(RTE_LOG_ ## level, enetfec_logtype_pmd, "\nfec_net: %s()" \ > + fmt "\n", __func__, ##args) > + > +#define PMD_INIT_FUNC_TRACE() ENET_PMD_LOG(DEBUG, " >>") > + > +#define ENETFEC_PMD_DEBUG(fmt, args...) \ > + ENETFEC_PMD_LOG(DEBUG, fmt, ## args) > +#define ENETFEC_PMD_ERR(fmt, args...) \ > + ENETFEC_PMD_LOG(ERR, fmt, ## args) > +#define ENETFEC_PMD_INFO(fmt, args...) \ > + ENETFEC_PMD_LOG(INFO, fmt, ## args) > + > +#define ENETFEC_PMD_WARN(fmt, args...) \ > + ENETFEC_PMD_LOG(WARNING, fmt, ## args) > + > +/* DP Logs, toggled out at compile time if level lower than current level */ > +#define ENETFEC_DP_LOG(level, fmt, args...) \ > + RTE_LOG_DP(level, PMD, fmt, ## args) > + > +#endif /* _ENETFEC_LOGS_H_ */ > diff --git a/drivers/net/enetfec/meson.build b/drivers/net/enetfec/meson.build > new file mode 100644 > index 0000000000..252bf83309 > --- /dev/null > +++ b/drivers/net/enetfec/meson.build > @@ -0,0 +1,15 @@ > +# SPDX-License-Identifier: BSD-3-Clause > +# Copyright 2021 NXP > + > +if not is_linux > + build = false > + reason = 'only supported on linux' The doc specifies that only armv8 is supported. > +endif > + > +deps += ['common_dpaax'] > + > +sources = files('enet_ethdev.c') > + > +if cc.has_argument('-Wno-pointer-arith') > + cflags += '-Wno-pointer-arith' > +endif Can't this be fixed in the code rather than ignored? > diff --git a/drivers/net/enetfec/version.map b/drivers/net/enetfec/version.map > new file mode 100644 > index 0000000000..170c04fe53 > --- /dev/null > +++ b/drivers/net/enetfec/version.map > @@ -0,0 +1,3 @@ > +DPDK_20.0 { Wrong ABI version. > + local: *; > +}; > diff --git a/drivers/net/meson.build b/drivers/net/meson.build > index bcf488f203..92f433d5e8 100644 > --- a/drivers/net/meson.build > +++ b/drivers/net/meson.build > @@ -19,6 +19,7 @@ drivers = [ > 'e1000', > 'ena', > 'enetc', > + 'enetfec', Indent. > 'enic', > 'failsafe', > 'fm10k', > -- > 2.17.1 > -- David Marchand