LCOV - code coverage report
Current view: top level - drivers/net/cxgbe - cxgbevf_ethdev.c (source / functions) Hit Total Coverage
Test: Code coverage Lines: 1 64 1.6 %
Date: 2024-12-01 18:57:19 Functions: 1 6 16.7 %
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed Branches: 0 18 0.0 %

           Branch data     Line data    Source code
       1                 :            : /* SPDX-License-Identifier: BSD-3-Clause
       2                 :            :  * Copyright(c) 2018 Chelsio Communications.
       3                 :            :  * All rights reserved.
       4                 :            :  */
       5                 :            : 
       6                 :            : #include <ethdev_driver.h>
       7                 :            : #include <ethdev_pci.h>
       8                 :            : 
       9                 :            : #include "cxgbe.h"
      10                 :            : #include "cxgbe_pfvf.h"
      11                 :            : 
      12                 :            : /*
      13                 :            :  * Macros needed to support the PCI Device ID Table ...
      14                 :            :  */
      15                 :            : #define CH_PCI_DEVICE_ID_TABLE_DEFINE_BEGIN \
      16                 :            :         static const struct rte_pci_id cxgb4vf_pci_tbl[] = {
      17                 :            : #define CH_PCI_DEVICE_ID_FUNCTION 0x8
      18                 :            : 
      19                 :            : #define PCI_VENDOR_ID_CHELSIO 0x1425
      20                 :            : 
      21                 :            : #define CH_PCI_ID_TABLE_ENTRY(devid) \
      22                 :            :                 { RTE_PCI_DEVICE(PCI_VENDOR_ID_CHELSIO, (devid)) }
      23                 :            : 
      24                 :            : #define CH_PCI_DEVICE_ID_TABLE_DEFINE_END \
      25                 :            :                 { .vendor_id = 0, } \
      26                 :            :         }
      27                 :            : 
      28                 :            : /*
      29                 :            :  *... and the PCI ID Table itself ...
      30                 :            :  */
      31                 :            : #include "base/t4_pci_id_tbl.h"
      32                 :            : 
      33                 :            : /*
      34                 :            :  * Get port statistics.
      35                 :            :  */
      36                 :          0 : static int cxgbevf_dev_stats_get(struct rte_eth_dev *eth_dev,
      37                 :            :                                  struct rte_eth_stats *eth_stats)
      38                 :            : {
      39                 :          0 :         struct port_info *pi = eth_dev->data->dev_private;
      40                 :          0 :         struct adapter *adapter = pi->adapter;
      41                 :            :         struct sge *s = &adapter->sge;
      42                 :            :         struct port_stats ps;
      43                 :            :         unsigned int i;
      44                 :            : 
      45                 :          0 :         cxgbevf_stats_get(pi, &ps);
      46                 :            : 
      47                 :            :         /* RX Stats */
      48                 :          0 :         eth_stats->ierrors  = ps.rx_len_err;
      49                 :            : 
      50                 :            :         /* TX Stats */
      51                 :          0 :         eth_stats->opackets = ps.tx_bcast_frames + ps.tx_mcast_frames +
      52                 :          0 :                               ps.tx_ucast_frames;
      53                 :          0 :         eth_stats->obytes = ps.tx_octets;
      54                 :          0 :         eth_stats->oerrors  = ps.tx_drop;
      55                 :            : 
      56         [ #  # ]:          0 :         for (i = 0; i < pi->n_rx_qsets; i++) {
      57                 :          0 :                 struct sge_eth_rxq *rxq = &s->ethrxq[pi->first_rxqset + i];
      58                 :            : 
      59                 :          0 :                 eth_stats->ipackets += rxq->stats.pkts;
      60                 :          0 :                 eth_stats->ibytes += rxq->stats.rx_bytes;
      61                 :            :         }
      62                 :            : 
      63                 :          0 :         return 0;
      64                 :            : }
      65                 :            : 
      66                 :            : static const struct eth_dev_ops cxgbevf_eth_dev_ops = {
      67                 :            :         .dev_start              = cxgbe_dev_start,
      68                 :            :         .dev_stop               = cxgbe_dev_stop,
      69                 :            :         .dev_close              = cxgbe_dev_close,
      70                 :            :         .promiscuous_enable     = cxgbe_dev_promiscuous_enable,
      71                 :            :         .promiscuous_disable    = cxgbe_dev_promiscuous_disable,
      72                 :            :         .allmulticast_enable    = cxgbe_dev_allmulticast_enable,
      73                 :            :         .allmulticast_disable   = cxgbe_dev_allmulticast_disable,
      74                 :            :         .dev_configure          = cxgbe_dev_configure,
      75                 :            :         .dev_infos_get          = cxgbe_dev_info_get,
      76                 :            :         .dev_supported_ptypes_get = cxgbe_dev_supported_ptypes_get,
      77                 :            :         .link_update            = cxgbe_dev_link_update,
      78                 :            :         .dev_set_link_up        = cxgbe_dev_set_link_up,
      79                 :            :         .dev_set_link_down      = cxgbe_dev_set_link_down,
      80                 :            :         .mtu_set                = cxgbe_dev_mtu_set,
      81                 :            :         .tx_queue_setup         = cxgbe_dev_tx_queue_setup,
      82                 :            :         .tx_queue_start         = cxgbe_dev_tx_queue_start,
      83                 :            :         .tx_queue_stop          = cxgbe_dev_tx_queue_stop,
      84                 :            :         .tx_queue_release       = cxgbe_dev_tx_queue_release,
      85                 :            :         .rx_queue_setup         = cxgbe_dev_rx_queue_setup,
      86                 :            :         .rx_queue_start         = cxgbe_dev_rx_queue_start,
      87                 :            :         .rx_queue_stop          = cxgbe_dev_rx_queue_stop,
      88                 :            :         .rx_queue_release       = cxgbe_dev_rx_queue_release,
      89                 :            :         .stats_get              = cxgbevf_dev_stats_get,
      90                 :            :         .xstats_get             = cxgbe_dev_xstats_get,
      91                 :            :         .xstats_get_by_id       = cxgbe_dev_xstats_get_by_id,
      92                 :            :         .xstats_get_names       = cxgbe_dev_xstats_get_names,
      93                 :            :         .xstats_get_names_by_id = cxgbe_dev_xstats_get_names_by_id,
      94                 :            :         .mac_addr_set           = cxgbe_mac_addr_set,
      95                 :            :         .fw_version_get         = cxgbe_fw_version_get,
      96                 :            : };
      97                 :            : 
      98                 :            : /*
      99                 :            :  * Initialize driver
     100                 :            :  * It returns 0 on success.
     101                 :            :  */
     102                 :          0 : static int eth_cxgbevf_dev_init(struct rte_eth_dev *eth_dev)
     103                 :            : {
     104                 :          0 :         struct port_info *pi = eth_dev->data->dev_private;
     105                 :            :         struct rte_pci_device *pci_dev;
     106                 :            :         char name[RTE_ETH_NAME_MAX_LEN];
     107                 :            :         struct adapter *adapter = NULL;
     108                 :            :         int err = 0;
     109                 :            : 
     110                 :          0 :         CXGBE_FUNC_TRACE();
     111                 :            : 
     112                 :          0 :         eth_dev->dev_ops = &cxgbevf_eth_dev_ops;
     113                 :          0 :         eth_dev->rx_pkt_burst = &cxgbe_recv_pkts;
     114                 :          0 :         eth_dev->tx_pkt_burst = &cxgbe_xmit_pkts;
     115                 :          0 :         pci_dev = RTE_ETH_DEV_TO_PCI(eth_dev);
     116                 :            : 
     117                 :            :         /* for secondary processes, we attach to ethdevs allocated by primary
     118                 :            :          * and do minimal initialization.
     119                 :            :          */
     120         [ #  # ]:          0 :         if (rte_eal_process_type() != RTE_PROC_PRIMARY) {
     121                 :            :                 int i;
     122                 :            : 
     123         [ #  # ]:          0 :                 for (i = 1; i < MAX_NPORTS; i++) {
     124                 :            :                         struct rte_eth_dev *rest_eth_dev;
     125                 :            :                         char namei[RTE_ETH_NAME_MAX_LEN];
     126                 :            : 
     127                 :          0 :                         snprintf(namei, sizeof(namei), "%s_%d",
     128                 :            :                                  pci_dev->device.name, i);
     129                 :          0 :                         rest_eth_dev = rte_eth_dev_attach_secondary(namei);
     130         [ #  # ]:          0 :                         if (rest_eth_dev) {
     131                 :          0 :                                 rest_eth_dev->device = &pci_dev->device;
     132                 :          0 :                                 rest_eth_dev->dev_ops =
     133                 :          0 :                                         eth_dev->dev_ops;
     134                 :          0 :                                 rest_eth_dev->rx_pkt_burst =
     135                 :          0 :                                         eth_dev->rx_pkt_burst;
     136                 :          0 :                                 rest_eth_dev->tx_pkt_burst =
     137                 :          0 :                                         eth_dev->tx_pkt_burst;
     138                 :          0 :                                 rte_eth_dev_probing_finish(rest_eth_dev);
     139                 :            :                         }
     140                 :            :                 }
     141                 :            :                 return 0;
     142                 :            :         }
     143                 :            : 
     144                 :          0 :         snprintf(name, sizeof(name), "cxgbevfadapter%d",
     145                 :          0 :                  eth_dev->data->port_id);
     146                 :          0 :         adapter = rte_zmalloc(name, sizeof(*adapter), 0);
     147         [ #  # ]:          0 :         if (!adapter)
     148                 :            :                 return -1;
     149                 :            : 
     150                 :          0 :         adapter->use_unpacked_mode = 1;
     151                 :          0 :         adapter->regs = (void *)pci_dev->mem_resource[0].addr;
     152         [ #  # ]:          0 :         if (!adapter->regs) {
     153                 :          0 :                 dev_err(adapter, "%s: cannot map device registers\n", __func__);
     154                 :            :                 err = -ENOMEM;
     155                 :          0 :                 goto out_free_adapter;
     156                 :            :         }
     157                 :          0 :         adapter->pdev = pci_dev;
     158                 :          0 :         adapter->eth_dev = eth_dev;
     159                 :          0 :         pi->adapter = adapter;
     160                 :            : 
     161                 :          0 :         cxgbe_process_devargs(adapter);
     162                 :            : 
     163                 :          0 :         err = cxgbevf_probe(adapter);
     164         [ #  # ]:          0 :         if (err) {
     165                 :          0 :                 dev_err(adapter, "%s: cxgbevf probe failed with err %d\n",
     166                 :            :                         __func__, err);
     167                 :          0 :                 goto out_free_adapter;
     168                 :            :         }
     169                 :            : 
     170                 :            :         return 0;
     171                 :            : 
     172                 :          0 : out_free_adapter:
     173                 :          0 :         rte_free(adapter);
     174                 :          0 :         return err;
     175                 :            : }
     176                 :            : 
     177                 :          0 : static int eth_cxgbevf_dev_uninit(struct rte_eth_dev *eth_dev)
     178                 :            : {
     179                 :          0 :         struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(eth_dev);
     180                 :            :         uint16_t port_id;
     181                 :            :         int err = 0;
     182                 :            : 
     183                 :            :         /* Free up other ports and all resources */
     184         [ #  # ]:          0 :         RTE_ETH_FOREACH_DEV_OF(port_id, &pci_dev->device)
     185                 :          0 :                 err |= rte_eth_dev_close(port_id);
     186                 :            : 
     187         [ #  # ]:          0 :         return err == 0 ? 0 : -EIO;
     188                 :            : }
     189                 :            : 
     190                 :          0 : static int eth_cxgbevf_pci_probe(struct rte_pci_driver *pci_drv __rte_unused,
     191                 :            :                                  struct rte_pci_device *pci_dev)
     192                 :            : {
     193                 :          0 :         return rte_eth_dev_pci_generic_probe(pci_dev, sizeof(struct port_info),
     194                 :            :                                              eth_cxgbevf_dev_init);
     195                 :            : }
     196                 :            : 
     197                 :          0 : static int eth_cxgbevf_pci_remove(struct rte_pci_device *pci_dev)
     198                 :            : {
     199                 :          0 :         return rte_eth_dev_pci_generic_remove(pci_dev, eth_cxgbevf_dev_uninit);
     200                 :            : }
     201                 :            : 
     202                 :            : static struct rte_pci_driver rte_cxgbevf_pmd = {
     203                 :            :         .id_table = cxgb4vf_pci_tbl,
     204                 :            :         .drv_flags = RTE_PCI_DRV_NEED_MAPPING,
     205                 :            :         .probe = eth_cxgbevf_pci_probe,
     206                 :            :         .remove = eth_cxgbevf_pci_remove,
     207                 :            : };
     208                 :            : 
     209                 :        251 : RTE_PMD_REGISTER_PCI(net_cxgbevf, rte_cxgbevf_pmd);
     210                 :            : RTE_PMD_REGISTER_PCI_TABLE(net_cxgbevf, cxgb4vf_pci_tbl);
     211                 :            : RTE_PMD_REGISTER_KMOD_DEP(net_cxgbevf, "* igb_uio | vfio-pci");
     212                 :            : RTE_PMD_REGISTER_PARAM_STRING(net_cxgbevf,
     213                 :            :                               CXGBE_DEVARG_CMN_KEEP_OVLAN "=<0|1> "
     214                 :            :                               CXGBE_DEVARG_CMN_TX_MODE_LATENCY "=<0|1> "
     215                 :            :                               CXGBE_DEVARG_VF_FORCE_LINK_UP "=<0|1> ");

Generated by: LCOV version 1.14