From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from rcdn-iport-3.cisco.com (rcdn-iport-3.cisco.com [173.37.86.74]) by dpdk.org (Postfix) with ESMTP id EF4A67F78 for ; Fri, 21 Nov 2014 16:26:17 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=cisco.com; i=@cisco.com; l=20791; q=dns/txt; s=iport; t=1416584213; x=1417793813; h=from:to:cc:subject:date:message-id:references: in-reply-to:content-id:content-transfer-encoding: mime-version; bh=uctzKoG2IGWZtpbvyposvuSQE6xzeE84Mke7B0oZvnY=; b=NzMsifTk0mM/vTK9V57etE9oKGHqkO60ufdg0K5+Lzzvn2iEtto2EXh8 0Y7DowKLtrOiBMXAp28pFj6fUt+U52v9yhHLZ1vvH2Dktjp4QifUwOexy RGOzJk4x/J6r/OHCTKnFtuEXc4+D0Is+4af9TQH7aIbXMKadyzMdr20zF E=; X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AicFAHNbb1StJA2M/2dsb2JhbABcgw6BLgTTKgKBAhYBAQEBAX2EAwEBBCcTPxACAQgOCh4QMiUCBA4FiEHNdwEBAQEBAQEBAQEBAQEBAQEBAQEZkDAlMweESwWSV4kwglqBRZU2g3ttgQZCgQMBAQE X-IronPort-AV: E=Sophos;i="5.07,432,1413244800"; d="scan'208";a="374230471" Received: from alln-core-7.cisco.com ([173.36.13.140]) by rcdn-iport-3.cisco.com with ESMTP; 21 Nov 2014 15:36:51 +0000 Received: from xhc-aln-x07.cisco.com (xhc-aln-x07.cisco.com [173.36.12.81]) by alln-core-7.cisco.com (8.14.5/8.14.5) with ESMTP id sALFap1j024191 (version=TLSv1/SSLv3 cipher=AES128-SHA bits=128 verify=FAIL); Fri, 21 Nov 2014 15:36:51 GMT Received: from xmb-aln-x07.cisco.com ([169.254.2.43]) by xhc-aln-x07.cisco.com ([173.36.12.81]) with mapi id 14.03.0195.001; Fri, 21 Nov 2014 09:36:50 -0600 From: "Sujith Sankar (ssujith)" To: Neil Horman Thread-Topic: [dpdk-dev] [PATCH v2 5/6] DPDK-ENIC PMD interface Thread-Index: AQHQBVloFxvivGVvJUy7p7J34Ymlh5xrdu0AgACBFQA= Date: Fri, 21 Nov 2014 15:36:50 +0000 Message-ID: References: <1416587583-2021-1-git-send-email-ssujith@cisco.com> <1416587583-2021-6-git-send-email-ssujith@cisco.com> <20141121132448.GC20661@hmsreliant.think-freely.org> In-Reply-To: <20141121132448.GC20661@hmsreliant.think-freely.org> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: user-agent: Microsoft-MacOutlook/14.3.9.131030 x-originating-ip: [10.65.58.149] Content-Type: text/plain; charset="us-ascii" Content-ID: <858F168307475948B853CC1BCB3B36AF@emea.cisco.com> Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Cc: "dev@dpdk.org" Subject: Re: [dpdk-dev] [PATCH v2 5/6] DPDK-ENIC PMD interface X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: patches and discussions about DPDK List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 21 Nov 2014 15:26:19 -0000 Thanks for the comments, Neil. I shall include those in v3. Regards, -Sujith On 21/11/14 6:54 pm, "Neil Horman" wrote: >On Fri, Nov 21, 2014 at 10:03:02PM +0530, Sujith Sankar wrote: >> Signed-off-by: Sujith Sankar >> --- >> lib/librte_pmd_enic/enic_etherdev.c | 620 >>++++++++++++++++++++++++++++++++++++ >> 1 file changed, 620 insertions(+) >> create mode 100644 lib/librte_pmd_enic/enic_etherdev.c >>=20 >> diff --git a/lib/librte_pmd_enic/enic_etherdev.c >>b/lib/librte_pmd_enic/enic_etherdev.c >> new file mode 100644 >> index 0000000..90003f5 >> --- /dev/null >> +++ b/lib/librte_pmd_enic/enic_etherdev.c >> @@ -0,0 +1,620 @@ >> +/* >> + * Copyright 2008-2014 Cisco Systems, Inc. All rights reserved. >> + * Copyright 2007 Nuova Systems, Inc. All rights reserved. >> + * >> + * Copyright (c) 2014, Cisco Systems, Inc. >> + * All rights reserved. >> + * >> + * Redistribution and use in source and binary forms, with or without >> + * modification, are permitted provided that the following conditions >> + * are met: >> + * >> + * 1. Redistributions of source code must retain the above copyright >> + * notice, this list of conditions and the following disclaimer. >> + * >> + * 2. Redistributions in binary form must reproduce the above copyright >> + * notice, this list of conditions and the following disclaimer in >> + * the documentation and/or other materials provided with the >> + * distribution. >> + * >> + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS >> + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT >> + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS >> + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE >> + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, >> + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, >> + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; >> + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER >> + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT >> + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN >> + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE >> + * POSSIBILITY OF SUCH DAMAGE. >> + * >> + */ >> +#ident "$Id$" >> + >> +#include >> +#include >> + >> +#include >> +#include >> +#include >> +#include >> + >> +#include "vnic_intr.h" >> +#include "vnic_cq.h" >> +#include "vnic_wq.h" >> +#include "vnic_rq.h" >> +#include "vnic_enet.h" >> +#include "enic.h" >> + >> +#ifdef RTE_LIBRTE_ENIC_PMD_DEBUG_TRACE >> +#define ENICPMD_FUNC_TRACE() \ >> + do { \ >> + dev_trace(enic, "Entering %s\n", __func__); \ >> + } while (0) >You probably want to convert this to use: >rte_log(RTE_LOG_DEBUG, RTE_LOGTYPE_PMD, ...) >Currently you have dev_trace defined to printf, which won't work well on >systems >that have stdout/err closed. > >Also, you don't need the do{}while(0) construct here just don't add the >semicolon after the rte_log call, and you'll get the same behavior > >converting to rte_log will also let you remove the DEBUG_TRACE ifdef as >you can >just enable PMD log types and DEBUG log levels via the log api > >> +#else >> +#define ENICPMD_FUNC_TRACE() >> +#endif >> + >> + >> +/* >> + * The set of PCI devices this driver supports >> + */ >> +static struct rte_pci_id pci_id_enic_map[] =3D { >> +#define RTE_PCI_DEV_ID_DECL_ENIC(vend, dev) {RTE_PCI_DEVICE(vend, >>dev)}, >> +#ifndef PCI_VENDOR_ID_CISCO >> +#define PCI_VENDOR_ID_CISCO 0x1137 >> +#endif >> +#include "rte_pci_dev_ids.h" >> +RTE_PCI_DEV_ID_DECL_ENIC(PCI_VENDOR_ID_CISCO, >>PCI_DEVICE_ID_CISCO_VIC_ENET) >> +RTE_PCI_DEV_ID_DECL_ENIC(PCI_VENDOR_ID_CISCO, >>PCI_DEVICE_ID_CISCO_VIC_ENET_VF) >> +{.vendor_id =3D 0, /* Sentinal */}, >> +}; >> + >> +int enicpmd_fdir_remove_perfect_filter(struct rte_eth_dev *eth_dev, >> + struct rte_fdir_filter *fdir_filter, >> + uint16_t soft_id) >> +{ >> + struct enic *enic =3D pmd_priv(eth_dev); >> + >> + ENICPMD_FUNC_TRACE(); >> + return enic_fdir_del_fltr(enic, fdir_filter); >> +} >> + >> +int enicpmd_fdir_add_perfect_filter(struct rte_eth_dev *eth_dev, >> + struct rte_fdir_filter *fdir_filter, uint16_t soft_id, >> + uint8_t queue, uint8_t drop) >> +{ >> + struct enic *enic =3D pmd_priv(eth_dev); >> + >> + ENICPMD_FUNC_TRACE(); >> + return enic_fdir_add_fltr(enic, fdir_filter, (uint16_t)queue, drop); >> +} >> + >> +void enicpmd_fdir_info_get(struct rte_eth_dev *eth_dev, >> + struct rte_eth_fdir *fdir) >> +{ >> + struct enic *enic =3D pmd_priv(eth_dev); >> + >> + ENICPMD_FUNC_TRACE(); >> + *fdir =3D enic->fdir.stats; >> +} >> + >The three functions above should be static, as their exported via the >device >structure below. You don't want people able to call them directly. > >> +void enicpmd_dev_tx_queue_release(void *txq) >> +{ >> + ENICPMD_FUNC_TRACE(); >> + enic_free_wq(txq); >> +} >> + >> +static int enicpmd_dev_setup_intr(struct enic *enic) >> +{ >> + int ret; >> + int index; >> + >> + ENICPMD_FUNC_TRACE(); >> + >> + /* Are we done with the init of all the queues? */ >> + for (index =3D 0; index < enic->cq_count; index++) { >> + if (!enic->cq[index].ctrl) >> + break; >> + } >> + >> + if (enic->cq_count !=3D index) >> + return 0; >> + >> + ret =3D enic_alloc_intr_resources(enic); >> + if (ret) { >> + dev_err(enic, "alloc intr failed\n"); >> + return ret; >> + } >> + enic_init_vnic_resources(enic); >> + >> + ret =3D enic_setup_finish(enic); >> + if (ret) >> + dev_err(enic, "setup could not be finished\n"); >> + >> + return ret; >> +} >> + >> +int enicpmd_dev_tx_queue_setup(struct rte_eth_dev *eth_dev, >> + uint16_t queue_idx, >> + uint16_t nb_desc, >> + unsigned int socket_id, >> + const struct rte_eth_txconf *tx_conf) >> +{ >> + int ret; >> + struct enic *enic =3D pmd_priv(eth_dev); >> + >> + ENICPMD_FUNC_TRACE(); >> + eth_dev->data->tx_queues[queue_idx] =3D (void *)&enic->wq[queue_idx]; >> + >> + ret =3D enic_alloc_wq(enic, queue_idx, socket_id, nb_desc); >> + if (ret) { >> + dev_err(enic, "error in allocating wq\n"); >> + return ret; >> + } >> + >> + return enicpmd_dev_setup_intr(enic); >> +} >> + >> +int enicpmd_dev_tx_queue_start(struct rte_eth_dev *eth_dev, uint16_t >>queue_idx) >> +{ >> + struct enic *enic =3D pmd_priv(eth_dev); >> + >> + ENICPMD_FUNC_TRACE(); >> + >> + enic_start_wq(enic, queue_idx); >> + >> + return 0; >> +} >> + >> +int enicpmd_dev_tx_queue_stop(struct rte_eth_dev *eth_dev, uint16_t >>queue_idx) >> +{ >> + int ret; >> + struct enic *enic =3D pmd_priv(eth_dev); >> + >> + ENICPMD_FUNC_TRACE(); >> + >> + ret =3D enic_stop_wq(enic, queue_idx); >> + if (ret) >> + dev_err(enic, "error in stopping wq %d\n", queue_idx); >> + >> + return ret; >> +} >> + >> +int enicpmd_dev_rx_queue_start(struct rte_eth_dev *eth_dev, uint16_t >>queue_idx) >> +{ >> + struct enic *enic =3D pmd_priv(eth_dev); >> + >> + ENICPMD_FUNC_TRACE(); >> + >> + enic_start_rq(enic, queue_idx); >> + >> + return 0; >> +} >> + >> +int enicpmd_dev_rx_queue_stop(struct rte_eth_dev *eth_dev, uint16_t >>queue_idx) >> +{ >> + int ret; >> + struct enic *enic =3D pmd_priv(eth_dev); >> + >> + ENICPMD_FUNC_TRACE(); >> + >> + ret =3D enic_stop_rq(enic, queue_idx); >> + if (ret) >> + dev_err(enic, "error in stopping rq %d\n", queue_idx); >> + >> + return ret; >> +} >> + >> +void enicpmd_dev_rx_queue_release(void *rxq) >> +{ >> + ENICPMD_FUNC_TRACE(); >> + enic_free_rq(rxq); >> +} >> + >> +int enicpmd_dev_rx_queue_setup(struct rte_eth_dev *eth_dev, >> + uint16_t queue_idx, >> + uint16_t nb_desc, >> + unsigned int socket_id, >> + const struct rte_eth_rxconf *rx_conf, >> + struct rte_mempool *mp) >> +{ >> + int ret; >> + struct enic *enic =3D pmd_priv(eth_dev); >> + >> + ENICPMD_FUNC_TRACE(); >> + eth_dev->data->rx_queues[queue_idx] =3D (void *)&enic->rq[queue_idx]; >> + >> + ret =3D enic_alloc_rq(enic, queue_idx, socket_id, mp, nb_desc); >> + if (ret) { >> + dev_err(enic, "error in allocating rq\n"); >> + return ret; >> + } >> + >> + return enicpmd_dev_setup_intr(enic); >> +} >> + > >All of the above functions should be declared static as well, as they are >accessed through the eth device operations structure. > >> +static int enicpmd_vlan_filter_set(struct rte_eth_dev *eth_dev, >> + uint16_t vlan_id, int on) >> +{ >> + struct enic *enic =3D pmd_priv(eth_dev); >> + >> + ENICPMD_FUNC_TRACE(); >> + if (on) >> + enic_add_vlan(enic, vlan_id); >> + else >> + enic_del_vlan(enic, vlan_id); >> + return 0; >> +} >> + >> +static void enicpmd_vlan_offload_set(struct rte_eth_dev *eth_dev, int >>mask) >> +{ >> + struct enic *enic =3D pmd_priv(eth_dev); >> + >> + ENICPMD_FUNC_TRACE(); >> + >> + if (mask & ETH_VLAN_STRIP_MASK) { >> + if (eth_dev->data->dev_conf.rxmode.hw_vlan_strip) >> + enic->ig_vlan_strip_en =3D 1; >> + else >> + enic->ig_vlan_strip_en =3D 0; >> + } >> + enic_set_rss_nic_cfg(enic); >> + >> + >> + if (mask & ETH_VLAN_FILTER_MASK) { >> + dev_warning(enic, >> + "Configuration of VLAN filter is not supported\n"); >> + } >> + >> + if (mask & ETH_VLAN_EXTEND_MASK) { >> + dev_warning(enic, >> + "Configuration of extended VLAN is not supported\n"); >> + } >> +} >> + >> +static int enicpmd_dev_configure(struct rte_eth_dev *eth_dev) >> +{ >> + int ret; >> + struct enic *enic =3D pmd_priv(eth_dev); >> + >> + ENICPMD_FUNC_TRACE(); >> + ret =3D enic_set_vnic_res(enic); >> + if (ret) { >> + dev_err(enic, "Set vNIC resource num failed, aborting\n"); >> + return ret; >> + } >> + >> + if (eth_dev->data->dev_conf.rxmode.split_hdr_size && >> + eth_dev->data->dev_conf.rxmode.header_split) { >> + /* Enable header-data-split */ >> + enic_set_hdr_split_size(enic, >> + eth_dev->data->dev_conf.rxmode.split_hdr_size); >> + } >> + >> + enic->hw_ip_checksum =3D eth_dev->data->dev_conf.rxmode.hw_ip_checksum= ; >> + return 0; >> +} >> + >> +/* Start the device. >> + * It returns 0 on success. >> + */ >> +static int enicpmd_dev_start(struct rte_eth_dev *eth_dev) >> +{ >> + struct enic *enic =3D pmd_priv(eth_dev); >> + >> + ENICPMD_FUNC_TRACE(); >> + return enic_enable(enic); >> +} >> + >> +/* >> + * Stop device: disable rx and tx functions to allow for reconfiguring. >> + */ >> +static void enicpmd_dev_stop(struct rte_eth_dev *eth_dev) >> +{ >> + struct rte_eth_link link; >> + struct enic *enic =3D pmd_priv(eth_dev); >> + >> + ENICPMD_FUNC_TRACE(); >> + enic_disable(enic); >> + memset(&link, 0, sizeof(link)); >> + rte_atomic64_cmpset((uint64_t *)ð_dev->data->dev_link, >> + *(uint64_t *)ð_dev->data->dev_link, >> + *(uint64_t *)&link); >> +} >> + >> +/* >> + * Stop device. >> + */ >> +static void enicpmd_dev_close(struct rte_eth_dev *eth_dev) >> +{ >> + struct enic *enic =3D pmd_priv(eth_dev); >> + >> + ENICPMD_FUNC_TRACE(); >> + enic_remove(enic); >> +} >> + >> +static int enicpmd_dev_link_update(struct rte_eth_dev *eth_dev, >> + int wait_to_complete) >> +{ >> + struct enic *enic =3D pmd_priv(eth_dev); >> + int ret; >> + int link_status =3D 0; >> + >> + ENICPMD_FUNC_TRACE(); >> + link_status =3D enic_get_link_status(enic); >> + ret =3D (link_status =3D=3D enic->link_status); >> + enic->link_status =3D link_status; >> + eth_dev->data->dev_link.link_status =3D link_status; >> + eth_dev->data->dev_link.link_duplex =3D ETH_LINK_FULL_DUPLEX; >> + eth_dev->data->dev_link.link_speed =3D vnic_dev_port_speed(enic->vdev)= ; >> + return ret; >> +} >> + >> +static void enicpmd_dev_stats_get(struct rte_eth_dev *eth_dev, >> + struct rte_eth_stats *stats) >> +{ >> + struct enic *enic =3D pmd_priv(eth_dev); >> + >> + ENICPMD_FUNC_TRACE(); >> + enic_dev_stats_get(enic, stats); >> +} >> + >> +static void enicpmd_dev_stats_reset(struct rte_eth_dev *eth_dev) >> +{ >> + struct enic *enic =3D pmd_priv(eth_dev); >> + >> + ENICPMD_FUNC_TRACE(); >> + enic_dev_stats_clear(enic); >> +} >> + >> +static void enicpmd_dev_info_get(struct rte_eth_dev *eth_dev, >> + struct rte_eth_dev_info *device_info) >> +{ >> + struct enic *enic =3D pmd_priv(eth_dev); >> + >> + ENICPMD_FUNC_TRACE(); >> + device_info->max_rx_queues =3D enic->rq_count; >> + device_info->max_tx_queues =3D enic->wq_count; >> + device_info->min_rx_bufsize =3D ENIC_MIN_MTU; >> + device_info->max_rx_pktlen =3D enic->config.mtu; >> + device_info->max_mac_addrs =3D 1; >> + device_info->rx_offload_capa =3D >> + DEV_RX_OFFLOAD_VLAN_STRIP | >> + DEV_RX_OFFLOAD_IPV4_CKSUM | >> + DEV_RX_OFFLOAD_UDP_CKSUM | >> + DEV_RX_OFFLOAD_TCP_CKSUM; >> + device_info->tx_offload_capa =3D >> + DEV_TX_OFFLOAD_VLAN_INSERT | >> + DEV_TX_OFFLOAD_IPV4_CKSUM | >> + DEV_TX_OFFLOAD_UDP_CKSUM | >> + DEV_TX_OFFLOAD_TCP_CKSUM; >> +} >> + >> +static void enicpmd_dev_promiscuous_enable(struct rte_eth_dev *eth_dev) >> +{ >> + struct enic *enic =3D pmd_priv(eth_dev); >> + >> + ENICPMD_FUNC_TRACE(); >> + enic->promisc =3D 1; >> + enic_add_packet_filter(enic); >> +} >> + >> +static void enicpmd_dev_promiscuous_disable(struct rte_eth_dev >>*eth_dev) >> +{ >> + struct enic *enic =3D pmd_priv(eth_dev); >> + >> + ENICPMD_FUNC_TRACE(); >> + enic->promisc =3D 0; >> + enic_add_packet_filter(enic); >> +} >> + >> +static void enicpmd_dev_allmulticast_enable(struct rte_eth_dev >>*eth_dev) >> +{ >> + struct enic *enic =3D pmd_priv(eth_dev); >> + >> + ENICPMD_FUNC_TRACE(); >> + enic->allmulti =3D 1; >> + enic_add_packet_filter(enic); >> +} >> + >> +static void enicpmd_dev_allmulticast_disable(struct rte_eth_dev >>*eth_dev) >> +{ >> + struct enic *enic =3D pmd_priv(eth_dev); >> + >> + ENICPMD_FUNC_TRACE(); >> + enic->allmulti =3D 0; >> + enic_add_packet_filter(enic); >> +} >> + >> +static void enicpmd_add_mac_addr(struct rte_eth_dev *eth_dev, >> + struct ether_addr *mac_addr, >> + uint32_t index, uint32_t pool) >> +{ >> + struct enic *enic =3D pmd_priv(eth_dev); >> + >> + ENICPMD_FUNC_TRACE(); >> + enic_set_mac_address(enic, mac_addr->addr_bytes); >> +} >> + >> +static void enicpmd_remove_mac_addr(struct rte_eth_dev *eth_dev, >>uint32_t index) >> +{ >> + struct enic *enic =3D pmd_priv(eth_dev); >> + >> + ENICPMD_FUNC_TRACE(); >> + enic_del_mac_address(enic); >> +} >> + >> + >> +uint16_t enicpmd_xmit_pkts(void *tx_queue, struct rte_mbuf **tx_pkts, >> + uint16_t nb_pkts) >> +{ >> + unsigned int index; >> + unsigned int frags; >> + unsigned int pkt_len; >> + unsigned int seg_len; >> + unsigned int inc_len; >> + unsigned int nb_segs; >> + struct rte_mbuf *tx_pkt; >> + struct vnic_wq *wq =3D (struct vnic_wq *)tx_queue; >> + struct enic *enic =3D vnic_dev_priv(wq->vdev); >> + unsigned char *buf; >> + unsigned short vlan_id; >> + unsigned short ol_flags; >> + >> + ENICPMD_FUNC_TRACE(); >> + >> + for (index =3D 0; index < nb_pkts; index++) { >> + tx_pkt =3D *tx_pkts++; >> + inc_len =3D 0; >> + nb_segs =3D tx_pkt->nb_segs; >> + if (nb_segs > vnic_wq_desc_avail(wq)) { >> + /* wq cleanup and try again */ >> + if (!enic_cleanup_wq(enic, wq) || >> + (nb_segs > vnic_wq_desc_avail(wq))) >> + return index; >> + } >> + pkt_len =3D tx_pkt->pkt_len; >> + vlan_id =3D tx_pkt->vlan_tci; >> + ol_flags =3D tx_pkt->ol_flags; >> + for (frags =3D 0; inc_len < pkt_len; frags++) { >> + if (!tx_pkt) >> + break; >> + seg_len =3D tx_pkt->data_len; >> + inc_len +=3D seg_len; >> + if (enic_send_pkt(enic, wq, tx_pkt, >> + (unsigned short)seg_len, !frags, >> + (pkt_len =3D=3D inc_len), ol_flags, vlan_id)) { >> + break; >> + } >> + tx_pkt =3D tx_pkt->next; >> + } >> + } >> + >> + enic_cleanup_wq(enic, wq); >> + return index; >> +} >> + >static > >> +uint16_t enicpmd_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts, >> + uint16_t nb_pkts) >> +{ >> + struct vnic_rq *rq =3D (struct vnic_rq *)rx_queue; >> + unsigned int work_done; >> + >> + ENICPMD_FUNC_TRACE(); >> + >> + if (enic_poll(rq, rx_pkts, (unsigned int)nb_pkts, &work_done)) >> + dev_err(enic, "error in enicpmd poll\n"); >> + >> + return work_done; >> +} >> + >static > >> +static struct eth_dev_ops enicpmd_eth_dev_ops =3D { >> + .dev_configure =3D enicpmd_dev_configure, >> + .dev_start =3D enicpmd_dev_start, >> + .dev_stop =3D enicpmd_dev_stop, >> + .dev_set_link_up =3D NULL, >> + .dev_set_link_down =3D NULL, >> + .dev_close =3D enicpmd_dev_close, >> + .promiscuous_enable =3D enicpmd_dev_promiscuous_enable, >> + .promiscuous_disable =3D enicpmd_dev_promiscuous_disable, >> + .allmulticast_enable =3D enicpmd_dev_allmulticast_enable, >> + .allmulticast_disable =3D enicpmd_dev_allmulticast_disable, >> + .link_update =3D enicpmd_dev_link_update, >> + .stats_get =3D enicpmd_dev_stats_get, >> + .stats_reset =3D enicpmd_dev_stats_reset, >> + .queue_stats_mapping_set =3D NULL, >> + .dev_infos_get =3D enicpmd_dev_info_get, >> + .mtu_set =3D NULL, >> + .vlan_filter_set =3D enicpmd_vlan_filter_set, >> + .vlan_tpid_set =3D NULL, >> + .vlan_offload_set =3D enicpmd_vlan_offload_set, >> + .vlan_strip_queue_set =3D NULL, >> + .rx_queue_start =3D enicpmd_dev_rx_queue_start, >> + .rx_queue_stop =3D enicpmd_dev_rx_queue_stop, >> + .tx_queue_start =3D enicpmd_dev_tx_queue_start, >> + .tx_queue_stop =3D enicpmd_dev_tx_queue_stop, >> + .rx_queue_setup =3D enicpmd_dev_rx_queue_setup, >> + .rx_queue_release =3D enicpmd_dev_rx_queue_release, >> + .rx_queue_count =3D NULL, >> + .rx_descriptor_done =3D NULL, >> + .tx_queue_setup =3D enicpmd_dev_tx_queue_setup, >> + .tx_queue_release =3D enicpmd_dev_tx_queue_release, >> + .dev_led_on =3D NULL, >> + .dev_led_off =3D NULL, >> + .flow_ctrl_get =3D NULL, >> + .flow_ctrl_set =3D NULL, >> + .priority_flow_ctrl_set =3D NULL, >> + .mac_addr_add =3D enicpmd_add_mac_addr, >> + .mac_addr_remove =3D enicpmd_remove_mac_addr, >> + .fdir_add_signature_filter =3D NULL, >> + .fdir_update_signature_filter =3D NULL, >> + .fdir_remove_signature_filter =3D NULL, >> + .fdir_infos_get =3D enicpmd_fdir_info_get, >> + .fdir_add_perfect_filter =3D enicpmd_fdir_add_perfect_filter, >> + .fdir_update_perfect_filter =3D enicpmd_fdir_add_perfect_filter, >> + .fdir_remove_perfect_filter =3D enicpmd_fdir_remove_perfect_filter, >> + .fdir_set_masks =3D NULL, >> +}; >> + >> +struct enic *enicpmd_list_head =3D NULL; >> +/* Initialize the driver >> + * It returns 0 on success. >> + */ >> +static int eth_enicpmd_dev_init( >> + __attribute__((unused))struct eth_driver *eth_drv, >> + struct rte_eth_dev *eth_dev) >> +{ >> + struct rte_pci_device *pdev; >> + struct rte_pci_addr *addr; >> + struct enic *enic =3D pmd_priv(eth_dev); >> + >> + ENICPMD_FUNC_TRACE(); >> + >> + enic->rte_dev =3D eth_dev; >> + eth_dev->dev_ops =3D &enicpmd_eth_dev_ops; >> + eth_dev->rx_pkt_burst =3D &enicpmd_recv_pkts; >> + eth_dev->tx_pkt_burst =3D &enicpmd_xmit_pkts; >> + >> + pdev =3D eth_dev->pci_dev; >> + enic->pdev =3D pdev; >> + addr =3D &pdev->addr; >> + >> + snprintf(enic->bdf_name, ENICPMD_BDF_LENGTH, "%04x:%02x:%02x.%x", >> + addr->domain, addr->bus, addr->devid, addr->function); >> + >> + return enic_probe(enic); >> +} >> + >> +static struct eth_driver rte_enic_pmd =3D { >> + { >> + .name =3D "rte_enic_pmd", >> + .id_table =3D pci_id_enic_map, >> + .drv_flags =3D RTE_PCI_DRV_NEED_MAPPING, >> + }, >> + .eth_dev_init =3D eth_enicpmd_dev_init, >> + .dev_private_size =3D sizeof(struct enic), >> +}; >> + >> +/* Driver initialization routine. >> + * Invoked once at EAL init time. >> + * Register as the [Poll Mode] Driver of Cisco ENIC device. >> + */ >> +int rte_enic_pmd_init(const char *name __rte_unused, >> + const char *params __rte_unused) >> +{ >> + ENICPMD_FUNC_TRACE(); >> + >> + rte_eth_driver_register(&rte_enic_pmd); >> + return 0; >> +} >> + >static > >> +static struct rte_driver rte_enic_driver =3D { >> + .type =3D PMD_PDEV, >> + .init =3D rte_enic_pmd_init, >> +}; >> + >> +PMD_REGISTER_DRIVER(rte_enic_driver); >> + >> --=20 >> 1.9.1 >>=20 >>=20