net/txgbe: support probe and remove
[dpdk.git] / drivers / net / txgbe / txgbe_ethdev.c
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(c) 2015-2020
3  */
4
5 #include <rte_common.h>
6 #include <rte_ethdev_pci.h>
7 #include <rte_pci.h>
8
9 #include "txgbe_logs.h"
10 #include "base/txgbe.h"
11 #include "txgbe_ethdev.h"
12
13 /*
14  * The set of PCI devices this driver supports
15  */
16 static const struct rte_pci_id pci_id_txgbe_map[] = {
17         { RTE_PCI_DEVICE(PCI_VENDOR_ID_WANGXUN, TXGBE_DEV_ID_RAPTOR_SFP) },
18         { RTE_PCI_DEVICE(PCI_VENDOR_ID_WANGXUN, TXGBE_DEV_ID_WX1820_SFP) },
19         { .vendor_id = 0, /* sentinel */ },
20 };
21
22 static int
23 eth_txgbe_dev_init(struct rte_eth_dev *eth_dev, void *init_params __rte_unused)
24 {
25         RTE_SET_USED(eth_dev);
26
27         return 0;
28 }
29
30 static int
31 eth_txgbe_dev_uninit(struct rte_eth_dev *eth_dev)
32 {
33         RTE_SET_USED(eth_dev);
34
35         return 0;
36 }
37
38 static int
39 eth_txgbe_pci_probe(struct rte_pci_driver *pci_drv __rte_unused,
40                 struct rte_pci_device *pci_dev)
41 {
42         struct rte_eth_dev *pf_ethdev;
43         struct rte_eth_devargs eth_da;
44         int retval;
45
46         if (pci_dev->device.devargs) {
47                 retval = rte_eth_devargs_parse(pci_dev->device.devargs->args,
48                                 &eth_da);
49                 if (retval)
50                         return retval;
51         } else {
52                 memset(&eth_da, 0, sizeof(eth_da));
53         }
54
55         retval = rte_eth_dev_create(&pci_dev->device, pci_dev->device.name,
56                         sizeof(struct txgbe_adapter),
57                         eth_dev_pci_specific_init, pci_dev,
58                         eth_txgbe_dev_init, NULL);
59
60         if (retval || eth_da.nb_representor_ports < 1)
61                 return retval;
62
63         pf_ethdev = rte_eth_dev_allocated(pci_dev->device.name);
64         if (pf_ethdev == NULL)
65                 return -ENODEV;
66
67         return 0;
68 }
69
70 static int eth_txgbe_pci_remove(struct rte_pci_device *pci_dev)
71 {
72         struct rte_eth_dev *ethdev;
73
74         ethdev = rte_eth_dev_allocated(pci_dev->device.name);
75         if (!ethdev)
76                 return -ENODEV;
77
78         return rte_eth_dev_destroy(ethdev, eth_txgbe_dev_uninit);
79 }
80
81 static struct rte_pci_driver rte_txgbe_pmd = {
82         .id_table = pci_id_txgbe_map,
83         .drv_flags = RTE_PCI_DRV_NEED_MAPPING |
84                      RTE_PCI_DRV_INTR_LSC,
85         .probe = eth_txgbe_pci_probe,
86         .remove = eth_txgbe_pci_remove,
87 };
88
89 RTE_PMD_REGISTER_PCI(net_txgbe, rte_txgbe_pmd);
90 RTE_PMD_REGISTER_PCI_TABLE(net_txgbe, pci_id_txgbe_map);
91 RTE_PMD_REGISTER_KMOD_DEP(net_txgbe, "* igb_uio | uio_pci_generic | vfio-pci");
92
93 RTE_LOG_REGISTER(txgbe_logtype_init, pmd.net.txgbe.init, NOTICE);
94 RTE_LOG_REGISTER(txgbe_logtype_driver, pmd.net.txgbe.driver, NOTICE);
95
96 #ifdef RTE_LIBRTE_TXGBE_DEBUG_RX
97         RTE_LOG_REGISTER(txgbe_logtype_rx, pmd.net.txgbe.rx, DEBUG);
98 #endif
99 #ifdef RTE_LIBRTE_TXGBE_DEBUG_TX
100         RTE_LOG_REGISTER(txgbe_logtype_tx, pmd.net.txgbe.tx, DEBUG);
101 #endif
102
103 #ifdef RTE_LIBRTE_TXGBE_DEBUG_TX_FREE
104         RTE_LOG_REGISTER(txgbe_logtype_tx_free, pmd.net.txgbe.tx_free, DEBUG);
105 #endif