17c125393SAlfredo Cardigliano /* SPDX-License-Identifier: (BSD-3-Clause OR GPL-2.0) 27c125393SAlfredo Cardigliano * Copyright(c) 2018-2019 Pensando Systems, Inc. All rights reserved. 37c125393SAlfredo Cardigliano */ 47c125393SAlfredo Cardigliano 55ef51809SAlfredo Cardigliano #include <rte_pci.h> 65ef51809SAlfredo Cardigliano #include <rte_bus_pci.h> 75ef51809SAlfredo Cardigliano #include <rte_ethdev.h> 8df96fd0dSBruce Richardson #include <ethdev_driver.h> 95ef51809SAlfredo Cardigliano #include <rte_malloc.h> 10df96fd0dSBruce Richardson #include <ethdev_pci.h> 115ef51809SAlfredo Cardigliano 127c125393SAlfredo Cardigliano #include "ionic_logs.h" 135ef51809SAlfredo Cardigliano #include "ionic.h" 145ef51809SAlfredo Cardigliano #include "ionic_dev.h" 155ef51809SAlfredo Cardigliano #include "ionic_mac_api.h" 16669c8de6SAlfredo Cardigliano #include "ionic_lif.h" 17669c8de6SAlfredo Cardigliano #include "ionic_ethdev.h" 18a27d9013SAlfredo Cardigliano #include "ionic_rxtx.h" 19669c8de6SAlfredo Cardigliano 20669c8de6SAlfredo Cardigliano static int eth_ionic_dev_init(struct rte_eth_dev *eth_dev, void *init_params); 21669c8de6SAlfredo Cardigliano static int eth_ionic_dev_uninit(struct rte_eth_dev *eth_dev); 22598f6726SAlfredo Cardigliano static int ionic_dev_info_get(struct rte_eth_dev *eth_dev, 23598f6726SAlfredo Cardigliano struct rte_eth_dev_info *dev_info); 24598f6726SAlfredo Cardigliano static int ionic_dev_configure(struct rte_eth_dev *dev); 25598f6726SAlfredo Cardigliano static int ionic_dev_mtu_set(struct rte_eth_dev *dev, uint16_t mtu); 26598f6726SAlfredo Cardigliano static int ionic_dev_start(struct rte_eth_dev *dev); 2762024eb8SIvan Ilchenko static int ionic_dev_stop(struct rte_eth_dev *dev); 28b142387bSThomas Monjalon static int ionic_dev_close(struct rte_eth_dev *dev); 29598f6726SAlfredo Cardigliano static int ionic_dev_set_link_up(struct rte_eth_dev *dev); 30598f6726SAlfredo Cardigliano static int ionic_dev_set_link_down(struct rte_eth_dev *dev); 31ec15c66bSAlfredo Cardigliano static int ionic_flow_ctrl_get(struct rte_eth_dev *eth_dev, 32ec15c66bSAlfredo Cardigliano struct rte_eth_fc_conf *fc_conf); 33ec15c66bSAlfredo Cardigliano static int ionic_flow_ctrl_set(struct rte_eth_dev *eth_dev, 34ec15c66bSAlfredo Cardigliano struct rte_eth_fc_conf *fc_conf); 35a27d9013SAlfredo Cardigliano static int ionic_vlan_offload_set(struct rte_eth_dev *eth_dev, int mask); 3622e7171bSAlfredo Cardigliano static int ionic_dev_rss_reta_update(struct rte_eth_dev *eth_dev, 3722e7171bSAlfredo Cardigliano struct rte_eth_rss_reta_entry64 *reta_conf, uint16_t reta_size); 3822e7171bSAlfredo Cardigliano static int ionic_dev_rss_reta_query(struct rte_eth_dev *eth_dev, 3922e7171bSAlfredo Cardigliano struct rte_eth_rss_reta_entry64 *reta_conf, uint16_t reta_size); 4022e7171bSAlfredo Cardigliano static int ionic_dev_rss_hash_conf_get(struct rte_eth_dev *eth_dev, 4122e7171bSAlfredo Cardigliano struct rte_eth_rss_conf *rss_conf); 4222e7171bSAlfredo Cardigliano static int ionic_dev_rss_hash_update(struct rte_eth_dev *eth_dev, 4322e7171bSAlfredo Cardigliano struct rte_eth_rss_conf *rss_conf); 443cdfd905SAlfredo Cardigliano static int ionic_dev_stats_get(struct rte_eth_dev *eth_dev, 453cdfd905SAlfredo Cardigliano struct rte_eth_stats *stats); 463cdfd905SAlfredo Cardigliano static int ionic_dev_stats_reset(struct rte_eth_dev *eth_dev); 473cdfd905SAlfredo Cardigliano static int ionic_dev_xstats_get(struct rte_eth_dev *dev, 483cdfd905SAlfredo Cardigliano struct rte_eth_xstat *xstats, unsigned int n); 493cdfd905SAlfredo Cardigliano static int ionic_dev_xstats_get_by_id(struct rte_eth_dev *dev, 503cdfd905SAlfredo Cardigliano const uint64_t *ids, uint64_t *values, unsigned int n); 513cdfd905SAlfredo Cardigliano static int ionic_dev_xstats_reset(struct rte_eth_dev *dev); 523cdfd905SAlfredo Cardigliano static int ionic_dev_xstats_get_names(struct rte_eth_dev *dev, 533cdfd905SAlfredo Cardigliano struct rte_eth_xstat_name *xstats_names, unsigned int size); 543cdfd905SAlfredo Cardigliano static int ionic_dev_xstats_get_names_by_id(struct rte_eth_dev *dev, 558c9f976fSAndrew Rybchenko const uint64_t *ids, struct rte_eth_xstat_name *xstats_names, 563cdfd905SAlfredo Cardigliano unsigned int limit); 57eec10fb0SAlfredo Cardigliano static int ionic_dev_fw_version_get(struct rte_eth_dev *eth_dev, 58eec10fb0SAlfredo Cardigliano char *fw_version, size_t fw_size); 597c125393SAlfredo Cardigliano 605ef51809SAlfredo Cardigliano static const struct rte_pci_id pci_id_ionic_map[] = { 615ef51809SAlfredo Cardigliano { RTE_PCI_DEVICE(IONIC_PENSANDO_VENDOR_ID, IONIC_DEV_ID_ETH_PF) }, 625ef51809SAlfredo Cardigliano { RTE_PCI_DEVICE(IONIC_PENSANDO_VENDOR_ID, IONIC_DEV_ID_ETH_VF) }, 635ef51809SAlfredo Cardigliano { RTE_PCI_DEVICE(IONIC_PENSANDO_VENDOR_ID, IONIC_DEV_ID_ETH_MGMT) }, 645ef51809SAlfredo Cardigliano { .vendor_id = 0, /* sentinel */ }, 655ef51809SAlfredo Cardigliano }; 665ef51809SAlfredo Cardigliano 67a27d9013SAlfredo Cardigliano static const struct rte_eth_desc_lim rx_desc_lim = { 68a27d9013SAlfredo Cardigliano .nb_max = IONIC_MAX_RING_DESC, 69a27d9013SAlfredo Cardigliano .nb_min = IONIC_MIN_RING_DESC, 70a27d9013SAlfredo Cardigliano .nb_align = 1, 71a27d9013SAlfredo Cardigliano }; 72a27d9013SAlfredo Cardigliano 7356117636SAndrew Boyer static const struct rte_eth_desc_lim tx_desc_lim_v1 = { 74a27d9013SAlfredo Cardigliano .nb_max = IONIC_MAX_RING_DESC, 75a27d9013SAlfredo Cardigliano .nb_min = IONIC_MIN_RING_DESC, 76a27d9013SAlfredo Cardigliano .nb_align = 1, 77d13d7829SAndrew Boyer .nb_seg_max = IONIC_TX_MAX_SG_ELEMS_V1 + 1, 78d13d7829SAndrew Boyer .nb_mtu_seg_max = IONIC_TX_MAX_SG_ELEMS_V1 + 1, 79a27d9013SAlfredo Cardigliano }; 80a27d9013SAlfredo Cardigliano 81669c8de6SAlfredo Cardigliano static const struct eth_dev_ops ionic_eth_dev_ops = { 82598f6726SAlfredo Cardigliano .dev_infos_get = ionic_dev_info_get, 83598f6726SAlfredo Cardigliano .dev_configure = ionic_dev_configure, 84598f6726SAlfredo Cardigliano .mtu_set = ionic_dev_mtu_set, 85598f6726SAlfredo Cardigliano .dev_start = ionic_dev_start, 86598f6726SAlfredo Cardigliano .dev_stop = ionic_dev_stop, 87598f6726SAlfredo Cardigliano .dev_close = ionic_dev_close, 88598f6726SAlfredo Cardigliano .link_update = ionic_dev_link_update, 89598f6726SAlfredo Cardigliano .dev_set_link_up = ionic_dev_set_link_up, 90598f6726SAlfredo Cardigliano .dev_set_link_down = ionic_dev_set_link_down, 9154fe083fSAlfredo Cardigliano .mac_addr_add = ionic_dev_add_mac, 9254fe083fSAlfredo Cardigliano .mac_addr_remove = ionic_dev_remove_mac, 9354fe083fSAlfredo Cardigliano .mac_addr_set = ionic_dev_set_mac, 9454fe083fSAlfredo Cardigliano .vlan_filter_set = ionic_dev_vlan_filter_set, 9554fe083fSAlfredo Cardigliano .promiscuous_enable = ionic_dev_promiscuous_enable, 9654fe083fSAlfredo Cardigliano .promiscuous_disable = ionic_dev_promiscuous_disable, 9754fe083fSAlfredo Cardigliano .allmulticast_enable = ionic_dev_allmulticast_enable, 9854fe083fSAlfredo Cardigliano .allmulticast_disable = ionic_dev_allmulticast_disable, 99ec15c66bSAlfredo Cardigliano .flow_ctrl_get = ionic_flow_ctrl_get, 100ec15c66bSAlfredo Cardigliano .flow_ctrl_set = ionic_flow_ctrl_set, 101a27d9013SAlfredo Cardigliano .rxq_info_get = ionic_rxq_info_get, 102a27d9013SAlfredo Cardigliano .txq_info_get = ionic_txq_info_get, 103a27d9013SAlfredo Cardigliano .rx_queue_setup = ionic_dev_rx_queue_setup, 104a27d9013SAlfredo Cardigliano .rx_queue_release = ionic_dev_rx_queue_release, 105a27d9013SAlfredo Cardigliano .rx_queue_start = ionic_dev_rx_queue_start, 106a27d9013SAlfredo Cardigliano .rx_queue_stop = ionic_dev_rx_queue_stop, 107a27d9013SAlfredo Cardigliano .tx_queue_setup = ionic_dev_tx_queue_setup, 108a27d9013SAlfredo Cardigliano .tx_queue_release = ionic_dev_tx_queue_release, 109a27d9013SAlfredo Cardigliano .tx_queue_start = ionic_dev_tx_queue_start, 110a27d9013SAlfredo Cardigliano .tx_queue_stop = ionic_dev_tx_queue_stop, 111a27d9013SAlfredo Cardigliano .vlan_offload_set = ionic_vlan_offload_set, 11222e7171bSAlfredo Cardigliano .reta_update = ionic_dev_rss_reta_update, 11322e7171bSAlfredo Cardigliano .reta_query = ionic_dev_rss_reta_query, 11422e7171bSAlfredo Cardigliano .rss_hash_conf_get = ionic_dev_rss_hash_conf_get, 11522e7171bSAlfredo Cardigliano .rss_hash_update = ionic_dev_rss_hash_update, 1163cdfd905SAlfredo Cardigliano .stats_get = ionic_dev_stats_get, 1173cdfd905SAlfredo Cardigliano .stats_reset = ionic_dev_stats_reset, 1183cdfd905SAlfredo Cardigliano .xstats_get = ionic_dev_xstats_get, 1193cdfd905SAlfredo Cardigliano .xstats_get_by_id = ionic_dev_xstats_get_by_id, 1203cdfd905SAlfredo Cardigliano .xstats_reset = ionic_dev_xstats_reset, 1213cdfd905SAlfredo Cardigliano .xstats_get_names = ionic_dev_xstats_get_names, 1223cdfd905SAlfredo Cardigliano .xstats_get_names_by_id = ionic_dev_xstats_get_names_by_id, 123eec10fb0SAlfredo Cardigliano .fw_version_get = ionic_dev_fw_version_get, 124669c8de6SAlfredo Cardigliano }; 125669c8de6SAlfredo Cardigliano 1263cdfd905SAlfredo Cardigliano struct rte_ionic_xstats_name_off { 1273cdfd905SAlfredo Cardigliano char name[RTE_ETH_XSTATS_NAME_SIZE]; 1283cdfd905SAlfredo Cardigliano unsigned int offset; 1293cdfd905SAlfredo Cardigliano }; 1303cdfd905SAlfredo Cardigliano 1313cdfd905SAlfredo Cardigliano static const struct rte_ionic_xstats_name_off rte_ionic_xstats_strings[] = { 1323cdfd905SAlfredo Cardigliano /* RX */ 1333cdfd905SAlfredo Cardigliano {"rx_ucast_bytes", offsetof(struct ionic_lif_stats, 1343cdfd905SAlfredo Cardigliano rx_ucast_bytes)}, 1353cdfd905SAlfredo Cardigliano {"rx_ucast_packets", offsetof(struct ionic_lif_stats, 1363cdfd905SAlfredo Cardigliano rx_ucast_packets)}, 1373cdfd905SAlfredo Cardigliano {"rx_mcast_bytes", offsetof(struct ionic_lif_stats, 1383cdfd905SAlfredo Cardigliano rx_mcast_bytes)}, 1393cdfd905SAlfredo Cardigliano {"rx_mcast_packets", offsetof(struct ionic_lif_stats, 1403cdfd905SAlfredo Cardigliano rx_mcast_packets)}, 1413cdfd905SAlfredo Cardigliano {"rx_bcast_bytes", offsetof(struct ionic_lif_stats, 1423cdfd905SAlfredo Cardigliano rx_bcast_bytes)}, 1433cdfd905SAlfredo Cardigliano {"rx_bcast_packets", offsetof(struct ionic_lif_stats, 1443cdfd905SAlfredo Cardigliano rx_bcast_packets)}, 1453cdfd905SAlfredo Cardigliano /* RX drops */ 1463cdfd905SAlfredo Cardigliano {"rx_ucast_drop_bytes", offsetof(struct ionic_lif_stats, 1473cdfd905SAlfredo Cardigliano rx_ucast_drop_bytes)}, 1483cdfd905SAlfredo Cardigliano {"rx_ucast_drop_packets", offsetof(struct ionic_lif_stats, 1493cdfd905SAlfredo Cardigliano rx_ucast_drop_packets)}, 1503cdfd905SAlfredo Cardigliano {"rx_mcast_drop_bytes", offsetof(struct ionic_lif_stats, 1513cdfd905SAlfredo Cardigliano rx_mcast_drop_bytes)}, 1523cdfd905SAlfredo Cardigliano {"rx_mcast_drop_packets", offsetof(struct ionic_lif_stats, 1533cdfd905SAlfredo Cardigliano rx_mcast_drop_packets)}, 1543cdfd905SAlfredo Cardigliano {"rx_bcast_drop_bytes", offsetof(struct ionic_lif_stats, 1553cdfd905SAlfredo Cardigliano rx_bcast_drop_bytes)}, 1563cdfd905SAlfredo Cardigliano {"rx_bcast_drop_packets", offsetof(struct ionic_lif_stats, 1573cdfd905SAlfredo Cardigliano rx_bcast_drop_packets)}, 1583cdfd905SAlfredo Cardigliano {"rx_dma_error", offsetof(struct ionic_lif_stats, 1593cdfd905SAlfredo Cardigliano rx_dma_error)}, 1603cdfd905SAlfredo Cardigliano /* TX */ 1613cdfd905SAlfredo Cardigliano {"tx_ucast_bytes", offsetof(struct ionic_lif_stats, 1623cdfd905SAlfredo Cardigliano tx_ucast_bytes)}, 1633cdfd905SAlfredo Cardigliano {"tx_ucast_packets", offsetof(struct ionic_lif_stats, 1643cdfd905SAlfredo Cardigliano tx_ucast_packets)}, 1653cdfd905SAlfredo Cardigliano {"tx_mcast_bytes", offsetof(struct ionic_lif_stats, 1663cdfd905SAlfredo Cardigliano tx_mcast_bytes)}, 1673cdfd905SAlfredo Cardigliano {"tx_mcast_packets", offsetof(struct ionic_lif_stats, 1683cdfd905SAlfredo Cardigliano tx_mcast_packets)}, 1693cdfd905SAlfredo Cardigliano {"tx_bcast_bytes", offsetof(struct ionic_lif_stats, 1703cdfd905SAlfredo Cardigliano tx_bcast_bytes)}, 1713cdfd905SAlfredo Cardigliano {"tx_bcast_packets", offsetof(struct ionic_lif_stats, 1723cdfd905SAlfredo Cardigliano tx_bcast_packets)}, 1733cdfd905SAlfredo Cardigliano /* TX drops */ 1743cdfd905SAlfredo Cardigliano {"tx_ucast_drop_bytes", offsetof(struct ionic_lif_stats, 1753cdfd905SAlfredo Cardigliano tx_ucast_drop_bytes)}, 1763cdfd905SAlfredo Cardigliano {"tx_ucast_drop_packets", offsetof(struct ionic_lif_stats, 1773cdfd905SAlfredo Cardigliano tx_ucast_drop_packets)}, 1783cdfd905SAlfredo Cardigliano {"tx_mcast_drop_bytes", offsetof(struct ionic_lif_stats, 1793cdfd905SAlfredo Cardigliano tx_mcast_drop_bytes)}, 1803cdfd905SAlfredo Cardigliano {"tx_mcast_drop_packets", offsetof(struct ionic_lif_stats, 1813cdfd905SAlfredo Cardigliano tx_mcast_drop_packets)}, 1823cdfd905SAlfredo Cardigliano {"tx_bcast_drop_bytes", offsetof(struct ionic_lif_stats, 1833cdfd905SAlfredo Cardigliano tx_bcast_drop_bytes)}, 1843cdfd905SAlfredo Cardigliano {"tx_bcast_drop_packets", offsetof(struct ionic_lif_stats, 1853cdfd905SAlfredo Cardigliano tx_bcast_drop_packets)}, 1863cdfd905SAlfredo Cardigliano {"tx_dma_error", offsetof(struct ionic_lif_stats, 1873cdfd905SAlfredo Cardigliano tx_dma_error)}, 1883cdfd905SAlfredo Cardigliano /* Rx Queue/Ring drops */ 1893cdfd905SAlfredo Cardigliano {"rx_queue_disabled", offsetof(struct ionic_lif_stats, 1903cdfd905SAlfredo Cardigliano rx_queue_disabled)}, 1913cdfd905SAlfredo Cardigliano {"rx_queue_empty", offsetof(struct ionic_lif_stats, 1923cdfd905SAlfredo Cardigliano rx_queue_empty)}, 1933cdfd905SAlfredo Cardigliano {"rx_queue_error", offsetof(struct ionic_lif_stats, 1943cdfd905SAlfredo Cardigliano rx_queue_error)}, 1953cdfd905SAlfredo Cardigliano {"rx_desc_fetch_error", offsetof(struct ionic_lif_stats, 1963cdfd905SAlfredo Cardigliano rx_desc_fetch_error)}, 1973cdfd905SAlfredo Cardigliano {"rx_desc_data_error", offsetof(struct ionic_lif_stats, 1983cdfd905SAlfredo Cardigliano rx_desc_data_error)}, 1993cdfd905SAlfredo Cardigliano /* Tx Queue/Ring drops */ 2003cdfd905SAlfredo Cardigliano {"tx_queue_disabled", offsetof(struct ionic_lif_stats, 2013cdfd905SAlfredo Cardigliano tx_queue_disabled)}, 2023cdfd905SAlfredo Cardigliano {"tx_queue_error", offsetof(struct ionic_lif_stats, 2033cdfd905SAlfredo Cardigliano tx_queue_error)}, 2043cdfd905SAlfredo Cardigliano {"tx_desc_fetch_error", offsetof(struct ionic_lif_stats, 2053cdfd905SAlfredo Cardigliano tx_desc_fetch_error)}, 2063cdfd905SAlfredo Cardigliano {"tx_desc_data_error", offsetof(struct ionic_lif_stats, 2073cdfd905SAlfredo Cardigliano tx_desc_data_error)}, 2083cdfd905SAlfredo Cardigliano }; 2093cdfd905SAlfredo Cardigliano 21076276d71SAndrew Boyer #define IONIC_NB_HW_STATS RTE_DIM(rte_ionic_xstats_strings) 2113cdfd905SAlfredo Cardigliano 212eec10fb0SAlfredo Cardigliano static int 213eec10fb0SAlfredo Cardigliano ionic_dev_fw_version_get(struct rte_eth_dev *eth_dev, 214eec10fb0SAlfredo Cardigliano char *fw_version, size_t fw_size) 215eec10fb0SAlfredo Cardigliano { 216eec10fb0SAlfredo Cardigliano struct ionic_lif *lif = IONIC_ETH_DEV_TO_LIF(eth_dev); 217eec10fb0SAlfredo Cardigliano struct ionic_adapter *adapter = lif->adapter; 218d345d6c9SFerruh Yigit int ret; 219eec10fb0SAlfredo Cardigliano 220d345d6c9SFerruh Yigit ret = snprintf(fw_version, fw_size, "%s", 221d345d6c9SFerruh Yigit adapter->fw_version); 222d345d6c9SFerruh Yigit if (ret < 0) 223eec10fb0SAlfredo Cardigliano return -EINVAL; 224eec10fb0SAlfredo Cardigliano 225d345d6c9SFerruh Yigit ret += 1; /* add the size of '\0' */ 226d345d6c9SFerruh Yigit if (fw_size < (size_t)ret) 227d345d6c9SFerruh Yigit return ret; 228d345d6c9SFerruh Yigit else 229eec10fb0SAlfredo Cardigliano return 0; 230eec10fb0SAlfredo Cardigliano } 231eec10fb0SAlfredo Cardigliano 232598f6726SAlfredo Cardigliano /* 233598f6726SAlfredo Cardigliano * Set device link up, enable tx. 234598f6726SAlfredo Cardigliano */ 235598f6726SAlfredo Cardigliano static int 236598f6726SAlfredo Cardigliano ionic_dev_set_link_up(struct rte_eth_dev *eth_dev) 237598f6726SAlfredo Cardigliano { 238598f6726SAlfredo Cardigliano struct ionic_lif *lif = IONIC_ETH_DEV_TO_LIF(eth_dev); 239598f6726SAlfredo Cardigliano int err; 240598f6726SAlfredo Cardigliano 241598f6726SAlfredo Cardigliano IONIC_PRINT_CALL(); 242598f6726SAlfredo Cardigliano 243be63459eSAndrew Boyer err = ionic_lif_start(lif); 244be63459eSAndrew Boyer if (err) 245be63459eSAndrew Boyer IONIC_PRINT(ERR, "Could not start lif to set link up"); 246598f6726SAlfredo Cardigliano 247be63459eSAndrew Boyer ionic_dev_link_update(lif->eth_dev, 0); 248be63459eSAndrew Boyer 249598f6726SAlfredo Cardigliano return err; 250598f6726SAlfredo Cardigliano } 251598f6726SAlfredo Cardigliano 252598f6726SAlfredo Cardigliano /* 253598f6726SAlfredo Cardigliano * Set device link down, disable tx. 254598f6726SAlfredo Cardigliano */ 255598f6726SAlfredo Cardigliano static int 256598f6726SAlfredo Cardigliano ionic_dev_set_link_down(struct rte_eth_dev *eth_dev) 257598f6726SAlfredo Cardigliano { 258598f6726SAlfredo Cardigliano struct ionic_lif *lif = IONIC_ETH_DEV_TO_LIF(eth_dev); 259598f6726SAlfredo Cardigliano 260598f6726SAlfredo Cardigliano IONIC_PRINT_CALL(); 261598f6726SAlfredo Cardigliano 262be63459eSAndrew Boyer ionic_lif_stop(lif); 263598f6726SAlfredo Cardigliano 264be63459eSAndrew Boyer ionic_dev_link_update(lif->eth_dev, 0); 265598f6726SAlfredo Cardigliano 266598f6726SAlfredo Cardigliano return 0; 267598f6726SAlfredo Cardigliano } 268598f6726SAlfredo Cardigliano 269be63459eSAndrew Boyer int 270598f6726SAlfredo Cardigliano ionic_dev_link_update(struct rte_eth_dev *eth_dev, 271598f6726SAlfredo Cardigliano int wait_to_complete __rte_unused) 272598f6726SAlfredo Cardigliano { 273598f6726SAlfredo Cardigliano struct ionic_lif *lif = IONIC_ETH_DEV_TO_LIF(eth_dev); 274598f6726SAlfredo Cardigliano struct ionic_adapter *adapter = lif->adapter; 275598f6726SAlfredo Cardigliano struct rte_eth_link link; 276598f6726SAlfredo Cardigliano 277598f6726SAlfredo Cardigliano IONIC_PRINT_CALL(); 278598f6726SAlfredo Cardigliano 279598f6726SAlfredo Cardigliano /* Initialize */ 280598f6726SAlfredo Cardigliano memset(&link, 0, sizeof(link)); 2810dad8b3dSAndrew Boyer 2820dad8b3dSAndrew Boyer if (adapter->idev.port_info->config.an_enable) { 283295968d1SFerruh Yigit link.link_autoneg = RTE_ETH_LINK_AUTONEG; 2840dad8b3dSAndrew Boyer } 285598f6726SAlfredo Cardigliano 286be63459eSAndrew Boyer if (!adapter->link_up || 287be63459eSAndrew Boyer !(lif->state & IONIC_LIF_F_UP)) { 288598f6726SAlfredo Cardigliano /* Interface is down */ 289295968d1SFerruh Yigit link.link_status = RTE_ETH_LINK_DOWN; 290295968d1SFerruh Yigit link.link_duplex = RTE_ETH_LINK_HALF_DUPLEX; 291295968d1SFerruh Yigit link.link_speed = RTE_ETH_SPEED_NUM_NONE; 292598f6726SAlfredo Cardigliano } else { 293598f6726SAlfredo Cardigliano /* Interface is up */ 294295968d1SFerruh Yigit link.link_status = RTE_ETH_LINK_UP; 295295968d1SFerruh Yigit link.link_duplex = RTE_ETH_LINK_FULL_DUPLEX; 296598f6726SAlfredo Cardigliano switch (adapter->link_speed) { 297598f6726SAlfredo Cardigliano case 10000: 298295968d1SFerruh Yigit link.link_speed = RTE_ETH_SPEED_NUM_10G; 299598f6726SAlfredo Cardigliano break; 300598f6726SAlfredo Cardigliano case 25000: 301295968d1SFerruh Yigit link.link_speed = RTE_ETH_SPEED_NUM_25G; 302598f6726SAlfredo Cardigliano break; 303598f6726SAlfredo Cardigliano case 40000: 304295968d1SFerruh Yigit link.link_speed = RTE_ETH_SPEED_NUM_40G; 305598f6726SAlfredo Cardigliano break; 306598f6726SAlfredo Cardigliano case 50000: 307295968d1SFerruh Yigit link.link_speed = RTE_ETH_SPEED_NUM_50G; 308598f6726SAlfredo Cardigliano break; 309598f6726SAlfredo Cardigliano case 100000: 310295968d1SFerruh Yigit link.link_speed = RTE_ETH_SPEED_NUM_100G; 311598f6726SAlfredo Cardigliano break; 312598f6726SAlfredo Cardigliano default: 313295968d1SFerruh Yigit link.link_speed = RTE_ETH_SPEED_NUM_NONE; 314598f6726SAlfredo Cardigliano break; 315598f6726SAlfredo Cardigliano } 316598f6726SAlfredo Cardigliano } 317598f6726SAlfredo Cardigliano 318598f6726SAlfredo Cardigliano return rte_eth_linkstatus_set(eth_dev, &link); 319598f6726SAlfredo Cardigliano } 320598f6726SAlfredo Cardigliano 32127b942c8SAlfredo Cardigliano /** 32227b942c8SAlfredo Cardigliano * Interrupt handler triggered by NIC for handling 32327b942c8SAlfredo Cardigliano * specific interrupt. 32427b942c8SAlfredo Cardigliano * 32527b942c8SAlfredo Cardigliano * @param param 32627b942c8SAlfredo Cardigliano * The address of parameter registered before. 32727b942c8SAlfredo Cardigliano * 32827b942c8SAlfredo Cardigliano * @return 32927b942c8SAlfredo Cardigliano * void 33027b942c8SAlfredo Cardigliano */ 33127b942c8SAlfredo Cardigliano static void 33227b942c8SAlfredo Cardigliano ionic_dev_interrupt_handler(void *param) 33327b942c8SAlfredo Cardigliano { 33427b942c8SAlfredo Cardigliano struct ionic_adapter *adapter = (struct ionic_adapter *)param; 33527b942c8SAlfredo Cardigliano 33627b942c8SAlfredo Cardigliano IONIC_PRINT(DEBUG, "->"); 33727b942c8SAlfredo Cardigliano 33800b65da5SAndrew Boyer if (adapter->lif) 33900b65da5SAndrew Boyer ionic_notifyq_handler(adapter->lif, -1); 34027b942c8SAlfredo Cardigliano } 34127b942c8SAlfredo Cardigliano 342669c8de6SAlfredo Cardigliano static int 343598f6726SAlfredo Cardigliano ionic_dev_mtu_set(struct rte_eth_dev *eth_dev, uint16_t mtu) 344598f6726SAlfredo Cardigliano { 345598f6726SAlfredo Cardigliano struct ionic_lif *lif = IONIC_ETH_DEV_TO_LIF(eth_dev); 346598f6726SAlfredo Cardigliano int err; 347598f6726SAlfredo Cardigliano 348598f6726SAlfredo Cardigliano IONIC_PRINT_CALL(); 349598f6726SAlfredo Cardigliano 350598f6726SAlfredo Cardigliano /* 351598f6726SAlfredo Cardigliano * Note: mtu check against IONIC_MIN_MTU, IONIC_MAX_MTU 3521bb4a528SFerruh Yigit * is done by the API. 353598f6726SAlfredo Cardigliano */ 354598f6726SAlfredo Cardigliano 355598f6726SAlfredo Cardigliano err = ionic_lif_change_mtu(lif, mtu); 356598f6726SAlfredo Cardigliano if (err) 357598f6726SAlfredo Cardigliano return err; 358598f6726SAlfredo Cardigliano 359598f6726SAlfredo Cardigliano return 0; 360598f6726SAlfredo Cardigliano } 361598f6726SAlfredo Cardigliano 362598f6726SAlfredo Cardigliano static int 363598f6726SAlfredo Cardigliano ionic_dev_info_get(struct rte_eth_dev *eth_dev, 364598f6726SAlfredo Cardigliano struct rte_eth_dev_info *dev_info) 365598f6726SAlfredo Cardigliano { 366598f6726SAlfredo Cardigliano struct ionic_lif *lif = IONIC_ETH_DEV_TO_LIF(eth_dev); 367598f6726SAlfredo Cardigliano struct ionic_adapter *adapter = lif->adapter; 368598f6726SAlfredo Cardigliano struct ionic_identity *ident = &adapter->ident; 36909f806e9SAndrew Boyer union ionic_lif_config *cfg = &ident->lif.eth.config; 370598f6726SAlfredo Cardigliano 371598f6726SAlfredo Cardigliano IONIC_PRINT_CALL(); 372598f6726SAlfredo Cardigliano 373598f6726SAlfredo Cardigliano dev_info->max_rx_queues = (uint16_t) 37409f806e9SAndrew Boyer rte_le_to_cpu_32(cfg->queue_count[IONIC_QTYPE_RXQ]); 375598f6726SAlfredo Cardigliano dev_info->max_tx_queues = (uint16_t) 37609f806e9SAndrew Boyer rte_le_to_cpu_32(cfg->queue_count[IONIC_QTYPE_TXQ]); 37709f806e9SAndrew Boyer 378598f6726SAlfredo Cardigliano /* Also add ETHER_CRC_LEN if the adapter is able to keep CRC */ 379598f6726SAlfredo Cardigliano dev_info->min_rx_bufsize = IONIC_MIN_MTU + RTE_ETHER_HDR_LEN; 380598f6726SAlfredo Cardigliano dev_info->max_rx_pktlen = IONIC_MAX_MTU + RTE_ETHER_HDR_LEN; 381598f6726SAlfredo Cardigliano dev_info->max_mac_addrs = adapter->max_mac_addrs; 382598f6726SAlfredo Cardigliano dev_info->min_mtu = IONIC_MIN_MTU; 383598f6726SAlfredo Cardigliano dev_info->max_mtu = IONIC_MAX_MTU; 384598f6726SAlfredo Cardigliano 38522e7171bSAlfredo Cardigliano dev_info->hash_key_size = IONIC_RSS_HASH_KEY_SIZE; 38609f806e9SAndrew Boyer dev_info->reta_size = rte_le_to_cpu_16(ident->lif.eth.rss_ind_tbl_sz); 38722e7171bSAlfredo Cardigliano dev_info->flow_type_rss_offloads = IONIC_ETH_RSS_OFFLOAD_ALL; 38822e7171bSAlfredo Cardigliano 389598f6726SAlfredo Cardigliano dev_info->speed_capa = 390295968d1SFerruh Yigit RTE_ETH_LINK_SPEED_10G | 391295968d1SFerruh Yigit RTE_ETH_LINK_SPEED_25G | 392295968d1SFerruh Yigit RTE_ETH_LINK_SPEED_40G | 393295968d1SFerruh Yigit RTE_ETH_LINK_SPEED_50G | 394295968d1SFerruh Yigit RTE_ETH_LINK_SPEED_100G; 395598f6726SAlfredo Cardigliano 396a27d9013SAlfredo Cardigliano /* 39718a44465SAndrew Boyer * Per-queue capabilities 39818a44465SAndrew Boyer * RTE does not support disabling a feature on a queue if it is 39918a44465SAndrew Boyer * enabled globally on the device. Thus the driver does not advertise 400295968d1SFerruh Yigit * capabilities like RTE_ETH_TX_OFFLOAD_IPV4_CKSUM as per-queue even 40118a44465SAndrew Boyer * though the driver would be otherwise capable of disabling it on 40218a44465SAndrew Boyer * a per-queue basis. 403a27d9013SAlfredo Cardigliano */ 404a27d9013SAlfredo Cardigliano 40518a44465SAndrew Boyer dev_info->rx_queue_offload_capa = 0; 40618a44465SAndrew Boyer dev_info->tx_queue_offload_capa = 0; 407a27d9013SAlfredo Cardigliano 408a27d9013SAlfredo Cardigliano /* 409a27d9013SAlfredo Cardigliano * Per-port capabilities 410a27d9013SAlfredo Cardigliano * See ionic_set_features to request and check supported features 411a27d9013SAlfredo Cardigliano */ 412a27d9013SAlfredo Cardigliano 413a27d9013SAlfredo Cardigliano dev_info->rx_offload_capa = dev_info->rx_queue_offload_capa | 414295968d1SFerruh Yigit RTE_ETH_RX_OFFLOAD_IPV4_CKSUM | 415295968d1SFerruh Yigit RTE_ETH_RX_OFFLOAD_UDP_CKSUM | 416295968d1SFerruh Yigit RTE_ETH_RX_OFFLOAD_TCP_CKSUM | 417295968d1SFerruh Yigit RTE_ETH_RX_OFFLOAD_VLAN_FILTER | 418295968d1SFerruh Yigit RTE_ETH_RX_OFFLOAD_VLAN_STRIP | 419295968d1SFerruh Yigit RTE_ETH_RX_OFFLOAD_SCATTER | 420295968d1SFerruh Yigit RTE_ETH_RX_OFFLOAD_RSS_HASH | 421a27d9013SAlfredo Cardigliano 0; 422a27d9013SAlfredo Cardigliano 423a27d9013SAlfredo Cardigliano dev_info->tx_offload_capa = dev_info->tx_queue_offload_capa | 424295968d1SFerruh Yigit RTE_ETH_TX_OFFLOAD_IPV4_CKSUM | 425295968d1SFerruh Yigit RTE_ETH_TX_OFFLOAD_UDP_CKSUM | 426295968d1SFerruh Yigit RTE_ETH_TX_OFFLOAD_TCP_CKSUM | 427295968d1SFerruh Yigit RTE_ETH_TX_OFFLOAD_OUTER_IPV4_CKSUM | 428295968d1SFerruh Yigit RTE_ETH_TX_OFFLOAD_OUTER_UDP_CKSUM | 429295968d1SFerruh Yigit RTE_ETH_TX_OFFLOAD_MULTI_SEGS | 430295968d1SFerruh Yigit RTE_ETH_TX_OFFLOAD_TCP_TSO | 431295968d1SFerruh Yigit RTE_ETH_TX_OFFLOAD_VLAN_INSERT | 432a27d9013SAlfredo Cardigliano 0; 433a27d9013SAlfredo Cardigliano 434a27d9013SAlfredo Cardigliano dev_info->rx_desc_lim = rx_desc_lim; 43556117636SAndrew Boyer dev_info->tx_desc_lim = tx_desc_lim_v1; 436a27d9013SAlfredo Cardigliano 437a27d9013SAlfredo Cardigliano /* Driver-preferred Rx/Tx parameters */ 438a27d9013SAlfredo Cardigliano dev_info->default_rxportconf.burst_size = 32; 439a27d9013SAlfredo Cardigliano dev_info->default_txportconf.burst_size = 32; 440a27d9013SAlfredo Cardigliano dev_info->default_rxportconf.nb_queues = 1; 441a27d9013SAlfredo Cardigliano dev_info->default_txportconf.nb_queues = 1; 442a27d9013SAlfredo Cardigliano dev_info->default_rxportconf.ring_size = IONIC_DEF_TXRX_DESC; 443a27d9013SAlfredo Cardigliano dev_info->default_txportconf.ring_size = IONIC_DEF_TXRX_DESC; 444a27d9013SAlfredo Cardigliano 44518a44465SAndrew Boyer dev_info->default_rxconf = (struct rte_eth_rxconf) { 44618a44465SAndrew Boyer /* Packets are always dropped if no desc are available */ 44718a44465SAndrew Boyer .rx_drop_en = 1, 44818a44465SAndrew Boyer }; 44918a44465SAndrew Boyer 450598f6726SAlfredo Cardigliano return 0; 451598f6726SAlfredo Cardigliano } 452598f6726SAlfredo Cardigliano 453598f6726SAlfredo Cardigliano static int 454ec15c66bSAlfredo Cardigliano ionic_flow_ctrl_get(struct rte_eth_dev *eth_dev, 455ec15c66bSAlfredo Cardigliano struct rte_eth_fc_conf *fc_conf) 456ec15c66bSAlfredo Cardigliano { 457ec15c66bSAlfredo Cardigliano struct ionic_lif *lif = IONIC_ETH_DEV_TO_LIF(eth_dev); 458ec15c66bSAlfredo Cardigliano struct ionic_adapter *adapter = lif->adapter; 459ec15c66bSAlfredo Cardigliano struct ionic_dev *idev = &adapter->idev; 460ec15c66bSAlfredo Cardigliano 461ec15c66bSAlfredo Cardigliano if (idev->port_info) { 462c3ab74fcSAndrew Boyer /* Flow control autoneg not supported */ 463c3ab74fcSAndrew Boyer fc_conf->autoneg = 0; 464ec15c66bSAlfredo Cardigliano 465ec15c66bSAlfredo Cardigliano if (idev->port_info->config.pause_type) 466295968d1SFerruh Yigit fc_conf->mode = RTE_ETH_FC_FULL; 467ec15c66bSAlfredo Cardigliano else 468295968d1SFerruh Yigit fc_conf->mode = RTE_ETH_FC_NONE; 469ec15c66bSAlfredo Cardigliano } 470ec15c66bSAlfredo Cardigliano 471ec15c66bSAlfredo Cardigliano return 0; 472ec15c66bSAlfredo Cardigliano } 473ec15c66bSAlfredo Cardigliano 474ec15c66bSAlfredo Cardigliano static int 475ec15c66bSAlfredo Cardigliano ionic_flow_ctrl_set(struct rte_eth_dev *eth_dev, 476ec15c66bSAlfredo Cardigliano struct rte_eth_fc_conf *fc_conf) 477ec15c66bSAlfredo Cardigliano { 478ec15c66bSAlfredo Cardigliano struct ionic_lif *lif = IONIC_ETH_DEV_TO_LIF(eth_dev); 479ec15c66bSAlfredo Cardigliano struct ionic_adapter *adapter = lif->adapter; 480ec15c66bSAlfredo Cardigliano struct ionic_dev *idev = &adapter->idev; 481ec15c66bSAlfredo Cardigliano uint8_t pause_type = IONIC_PORT_PAUSE_TYPE_NONE; 482c3ab74fcSAndrew Boyer int err; 483c3ab74fcSAndrew Boyer 484c3ab74fcSAndrew Boyer if (fc_conf->autoneg) { 485c3ab74fcSAndrew Boyer IONIC_PRINT(WARNING, "Flow control autoneg not supported"); 486c3ab74fcSAndrew Boyer return -ENOTSUP; 487c3ab74fcSAndrew Boyer } 488ec15c66bSAlfredo Cardigliano 489ec15c66bSAlfredo Cardigliano switch (fc_conf->mode) { 490295968d1SFerruh Yigit case RTE_ETH_FC_NONE: 491ec15c66bSAlfredo Cardigliano pause_type = IONIC_PORT_PAUSE_TYPE_NONE; 492ec15c66bSAlfredo Cardigliano break; 493295968d1SFerruh Yigit case RTE_ETH_FC_FULL: 494ec15c66bSAlfredo Cardigliano pause_type = IONIC_PORT_PAUSE_TYPE_LINK; 495ec15c66bSAlfredo Cardigliano break; 496295968d1SFerruh Yigit case RTE_ETH_FC_RX_PAUSE: 497295968d1SFerruh Yigit case RTE_ETH_FC_TX_PAUSE: 498ec15c66bSAlfredo Cardigliano return -ENOTSUP; 499ec15c66bSAlfredo Cardigliano } 500ec15c66bSAlfredo Cardigliano 501ec15c66bSAlfredo Cardigliano ionic_dev_cmd_port_pause(idev, pause_type); 502c3ab74fcSAndrew Boyer err = ionic_dev_cmd_wait_check(idev, IONIC_DEVCMD_TIMEOUT); 503c3ab74fcSAndrew Boyer if (err) 504c3ab74fcSAndrew Boyer IONIC_PRINT(WARNING, "Failed to configure flow control"); 505ec15c66bSAlfredo Cardigliano 506c3ab74fcSAndrew Boyer return err; 507ec15c66bSAlfredo Cardigliano } 508ec15c66bSAlfredo Cardigliano 509ec15c66bSAlfredo Cardigliano static int 510a27d9013SAlfredo Cardigliano ionic_vlan_offload_set(struct rte_eth_dev *eth_dev, int mask) 511a27d9013SAlfredo Cardigliano { 512a27d9013SAlfredo Cardigliano struct ionic_lif *lif = IONIC_ETH_DEV_TO_LIF(eth_dev); 513a27d9013SAlfredo Cardigliano 51418a44465SAndrew Boyer ionic_lif_configure_vlan_offload(lif, mask); 515a27d9013SAlfredo Cardigliano 516a27d9013SAlfredo Cardigliano ionic_lif_set_features(lif); 517a27d9013SAlfredo Cardigliano 518a27d9013SAlfredo Cardigliano return 0; 519a27d9013SAlfredo Cardigliano } 520a27d9013SAlfredo Cardigliano 521a27d9013SAlfredo Cardigliano static int 52222e7171bSAlfredo Cardigliano ionic_dev_rss_reta_update(struct rte_eth_dev *eth_dev, 52322e7171bSAlfredo Cardigliano struct rte_eth_rss_reta_entry64 *reta_conf, 52422e7171bSAlfredo Cardigliano uint16_t reta_size) 52522e7171bSAlfredo Cardigliano { 52622e7171bSAlfredo Cardigliano struct ionic_lif *lif = IONIC_ETH_DEV_TO_LIF(eth_dev); 52722e7171bSAlfredo Cardigliano struct ionic_adapter *adapter = lif->adapter; 52822e7171bSAlfredo Cardigliano struct ionic_identity *ident = &adapter->ident; 52922e7171bSAlfredo Cardigliano uint32_t i, j, index, num; 53009f806e9SAndrew Boyer uint16_t tbl_sz = rte_le_to_cpu_16(ident->lif.eth.rss_ind_tbl_sz); 53122e7171bSAlfredo Cardigliano 53222e7171bSAlfredo Cardigliano IONIC_PRINT_CALL(); 53322e7171bSAlfredo Cardigliano 53422e7171bSAlfredo Cardigliano if (!lif->rss_ind_tbl) { 53522e7171bSAlfredo Cardigliano IONIC_PRINT(ERR, "RSS RETA not initialized, " 53622e7171bSAlfredo Cardigliano "can't update the table"); 53722e7171bSAlfredo Cardigliano return -EINVAL; 53822e7171bSAlfredo Cardigliano } 53922e7171bSAlfredo Cardigliano 54009f806e9SAndrew Boyer if (reta_size != tbl_sz) { 54122e7171bSAlfredo Cardigliano IONIC_PRINT(ERR, "The size of hash lookup table configured " 5424ae96cb8SAndrew Boyer "(%d) does not match the number hardware can support " 54322e7171bSAlfredo Cardigliano "(%d)", 54409f806e9SAndrew Boyer reta_size, tbl_sz); 54522e7171bSAlfredo Cardigliano return -EINVAL; 54622e7171bSAlfredo Cardigliano } 54722e7171bSAlfredo Cardigliano 548295968d1SFerruh Yigit num = tbl_sz / RTE_ETH_RETA_GROUP_SIZE; 54922e7171bSAlfredo Cardigliano 55022e7171bSAlfredo Cardigliano for (i = 0; i < num; i++) { 551295968d1SFerruh Yigit for (j = 0; j < RTE_ETH_RETA_GROUP_SIZE; j++) { 55222e7171bSAlfredo Cardigliano if (reta_conf[i].mask & ((uint64_t)1 << j)) { 553295968d1SFerruh Yigit index = (i * RTE_ETH_RETA_GROUP_SIZE) + j; 55422e7171bSAlfredo Cardigliano lif->rss_ind_tbl[index] = reta_conf[i].reta[j]; 55522e7171bSAlfredo Cardigliano } 55622e7171bSAlfredo Cardigliano } 55722e7171bSAlfredo Cardigliano } 55822e7171bSAlfredo Cardigliano 55922e7171bSAlfredo Cardigliano return ionic_lif_rss_config(lif, lif->rss_types, NULL, NULL); 56022e7171bSAlfredo Cardigliano } 56122e7171bSAlfredo Cardigliano 56222e7171bSAlfredo Cardigliano static int 56322e7171bSAlfredo Cardigliano ionic_dev_rss_reta_query(struct rte_eth_dev *eth_dev, 56422e7171bSAlfredo Cardigliano struct rte_eth_rss_reta_entry64 *reta_conf, 56522e7171bSAlfredo Cardigliano uint16_t reta_size) 56622e7171bSAlfredo Cardigliano { 56722e7171bSAlfredo Cardigliano struct ionic_lif *lif = IONIC_ETH_DEV_TO_LIF(eth_dev); 56822e7171bSAlfredo Cardigliano struct ionic_adapter *adapter = lif->adapter; 56922e7171bSAlfredo Cardigliano struct ionic_identity *ident = &adapter->ident; 57022e7171bSAlfredo Cardigliano int i, num; 57109f806e9SAndrew Boyer uint16_t tbl_sz = rte_le_to_cpu_16(ident->lif.eth.rss_ind_tbl_sz); 57222e7171bSAlfredo Cardigliano 57322e7171bSAlfredo Cardigliano IONIC_PRINT_CALL(); 57422e7171bSAlfredo Cardigliano 57509f806e9SAndrew Boyer if (reta_size != tbl_sz) { 57622e7171bSAlfredo Cardigliano IONIC_PRINT(ERR, "The size of hash lookup table configured " 5774ae96cb8SAndrew Boyer "(%d) does not match the number hardware can support " 57822e7171bSAlfredo Cardigliano "(%d)", 57909f806e9SAndrew Boyer reta_size, tbl_sz); 58022e7171bSAlfredo Cardigliano return -EINVAL; 58122e7171bSAlfredo Cardigliano } 58222e7171bSAlfredo Cardigliano 58322e7171bSAlfredo Cardigliano if (!lif->rss_ind_tbl) { 58422e7171bSAlfredo Cardigliano IONIC_PRINT(ERR, "RSS RETA has not been built yet"); 58522e7171bSAlfredo Cardigliano return -EINVAL; 58622e7171bSAlfredo Cardigliano } 58722e7171bSAlfredo Cardigliano 588295968d1SFerruh Yigit num = reta_size / RTE_ETH_RETA_GROUP_SIZE; 58922e7171bSAlfredo Cardigliano 59022e7171bSAlfredo Cardigliano for (i = 0; i < num; i++) { 59122e7171bSAlfredo Cardigliano memcpy(reta_conf->reta, 592295968d1SFerruh Yigit &lif->rss_ind_tbl[i * RTE_ETH_RETA_GROUP_SIZE], 593295968d1SFerruh Yigit RTE_ETH_RETA_GROUP_SIZE); 59422e7171bSAlfredo Cardigliano reta_conf++; 59522e7171bSAlfredo Cardigliano } 59622e7171bSAlfredo Cardigliano 59722e7171bSAlfredo Cardigliano return 0; 59822e7171bSAlfredo Cardigliano } 59922e7171bSAlfredo Cardigliano 60022e7171bSAlfredo Cardigliano static int 60122e7171bSAlfredo Cardigliano ionic_dev_rss_hash_conf_get(struct rte_eth_dev *eth_dev, 60222e7171bSAlfredo Cardigliano struct rte_eth_rss_conf *rss_conf) 60322e7171bSAlfredo Cardigliano { 60422e7171bSAlfredo Cardigliano struct ionic_lif *lif = IONIC_ETH_DEV_TO_LIF(eth_dev); 60522e7171bSAlfredo Cardigliano uint64_t rss_hf = 0; 60622e7171bSAlfredo Cardigliano 60722e7171bSAlfredo Cardigliano IONIC_PRINT_CALL(); 60822e7171bSAlfredo Cardigliano 60922e7171bSAlfredo Cardigliano if (!lif->rss_ind_tbl) { 61022e7171bSAlfredo Cardigliano IONIC_PRINT(NOTICE, "RSS not enabled"); 61122e7171bSAlfredo Cardigliano return 0; 61222e7171bSAlfredo Cardigliano } 61322e7171bSAlfredo Cardigliano 61422e7171bSAlfredo Cardigliano /* Get key value (if not null, rss_key is 40-byte) */ 61522e7171bSAlfredo Cardigliano if (rss_conf->rss_key != NULL && 61622e7171bSAlfredo Cardigliano rss_conf->rss_key_len >= IONIC_RSS_HASH_KEY_SIZE) 61722e7171bSAlfredo Cardigliano memcpy(rss_conf->rss_key, lif->rss_hash_key, 61822e7171bSAlfredo Cardigliano IONIC_RSS_HASH_KEY_SIZE); 61922e7171bSAlfredo Cardigliano 62022e7171bSAlfredo Cardigliano if (lif->rss_types & IONIC_RSS_TYPE_IPV4) 621295968d1SFerruh Yigit rss_hf |= RTE_ETH_RSS_IPV4; 62222e7171bSAlfredo Cardigliano if (lif->rss_types & IONIC_RSS_TYPE_IPV4_TCP) 623295968d1SFerruh Yigit rss_hf |= RTE_ETH_RSS_NONFRAG_IPV4_TCP; 62422e7171bSAlfredo Cardigliano if (lif->rss_types & IONIC_RSS_TYPE_IPV4_UDP) 625295968d1SFerruh Yigit rss_hf |= RTE_ETH_RSS_NONFRAG_IPV4_UDP; 62622e7171bSAlfredo Cardigliano if (lif->rss_types & IONIC_RSS_TYPE_IPV6) 627295968d1SFerruh Yigit rss_hf |= RTE_ETH_RSS_IPV6; 62822e7171bSAlfredo Cardigliano if (lif->rss_types & IONIC_RSS_TYPE_IPV6_TCP) 629295968d1SFerruh Yigit rss_hf |= RTE_ETH_RSS_NONFRAG_IPV6_TCP; 63022e7171bSAlfredo Cardigliano if (lif->rss_types & IONIC_RSS_TYPE_IPV6_UDP) 631295968d1SFerruh Yigit rss_hf |= RTE_ETH_RSS_NONFRAG_IPV6_UDP; 63222e7171bSAlfredo Cardigliano 63322e7171bSAlfredo Cardigliano rss_conf->rss_hf = rss_hf; 63422e7171bSAlfredo Cardigliano 63522e7171bSAlfredo Cardigliano return 0; 63622e7171bSAlfredo Cardigliano } 63722e7171bSAlfredo Cardigliano 63822e7171bSAlfredo Cardigliano static int 63922e7171bSAlfredo Cardigliano ionic_dev_rss_hash_update(struct rte_eth_dev *eth_dev, 64022e7171bSAlfredo Cardigliano struct rte_eth_rss_conf *rss_conf) 64122e7171bSAlfredo Cardigliano { 64222e7171bSAlfredo Cardigliano struct ionic_lif *lif = IONIC_ETH_DEV_TO_LIF(eth_dev); 64322e7171bSAlfredo Cardigliano uint32_t rss_types = 0; 64422e7171bSAlfredo Cardigliano uint8_t *key = NULL; 64522e7171bSAlfredo Cardigliano 64622e7171bSAlfredo Cardigliano IONIC_PRINT_CALL(); 64722e7171bSAlfredo Cardigliano 64822e7171bSAlfredo Cardigliano if (rss_conf->rss_key) 64922e7171bSAlfredo Cardigliano key = rss_conf->rss_key; 65022e7171bSAlfredo Cardigliano 65122e7171bSAlfredo Cardigliano if ((rss_conf->rss_hf & IONIC_ETH_RSS_OFFLOAD_ALL) == 0) { 65222e7171bSAlfredo Cardigliano /* 65322e7171bSAlfredo Cardigliano * Can't disable rss through hash flags, 65422e7171bSAlfredo Cardigliano * if it is enabled by default during init 65522e7171bSAlfredo Cardigliano */ 65622e7171bSAlfredo Cardigliano if (lif->rss_ind_tbl) 65722e7171bSAlfredo Cardigliano return -EINVAL; 65822e7171bSAlfredo Cardigliano } else { 65922e7171bSAlfredo Cardigliano /* Can't enable rss if disabled by default during init */ 66022e7171bSAlfredo Cardigliano if (!lif->rss_ind_tbl) 66122e7171bSAlfredo Cardigliano return -EINVAL; 66222e7171bSAlfredo Cardigliano 663295968d1SFerruh Yigit if (rss_conf->rss_hf & RTE_ETH_RSS_IPV4) 66422e7171bSAlfredo Cardigliano rss_types |= IONIC_RSS_TYPE_IPV4; 665295968d1SFerruh Yigit if (rss_conf->rss_hf & RTE_ETH_RSS_NONFRAG_IPV4_TCP) 66622e7171bSAlfredo Cardigliano rss_types |= IONIC_RSS_TYPE_IPV4_TCP; 667295968d1SFerruh Yigit if (rss_conf->rss_hf & RTE_ETH_RSS_NONFRAG_IPV4_UDP) 66822e7171bSAlfredo Cardigliano rss_types |= IONIC_RSS_TYPE_IPV4_UDP; 669295968d1SFerruh Yigit if (rss_conf->rss_hf & RTE_ETH_RSS_IPV6) 67022e7171bSAlfredo Cardigliano rss_types |= IONIC_RSS_TYPE_IPV6; 671295968d1SFerruh Yigit if (rss_conf->rss_hf & RTE_ETH_RSS_NONFRAG_IPV6_TCP) 67222e7171bSAlfredo Cardigliano rss_types |= IONIC_RSS_TYPE_IPV6_TCP; 673295968d1SFerruh Yigit if (rss_conf->rss_hf & RTE_ETH_RSS_NONFRAG_IPV6_UDP) 67422e7171bSAlfredo Cardigliano rss_types |= IONIC_RSS_TYPE_IPV6_UDP; 67522e7171bSAlfredo Cardigliano 67622e7171bSAlfredo Cardigliano ionic_lif_rss_config(lif, rss_types, key, NULL); 67722e7171bSAlfredo Cardigliano } 67822e7171bSAlfredo Cardigliano 67922e7171bSAlfredo Cardigliano return 0; 68022e7171bSAlfredo Cardigliano } 68122e7171bSAlfredo Cardigliano 68222e7171bSAlfredo Cardigliano static int 6833cdfd905SAlfredo Cardigliano ionic_dev_stats_get(struct rte_eth_dev *eth_dev, 6843cdfd905SAlfredo Cardigliano struct rte_eth_stats *stats) 6853cdfd905SAlfredo Cardigliano { 6863cdfd905SAlfredo Cardigliano struct ionic_lif *lif = IONIC_ETH_DEV_TO_LIF(eth_dev); 6873cdfd905SAlfredo Cardigliano 6883cdfd905SAlfredo Cardigliano ionic_lif_get_stats(lif, stats); 6893cdfd905SAlfredo Cardigliano 6903cdfd905SAlfredo Cardigliano return 0; 6913cdfd905SAlfredo Cardigliano } 6923cdfd905SAlfredo Cardigliano 6933cdfd905SAlfredo Cardigliano static int 6943cdfd905SAlfredo Cardigliano ionic_dev_stats_reset(struct rte_eth_dev *eth_dev) 6953cdfd905SAlfredo Cardigliano { 6963cdfd905SAlfredo Cardigliano struct ionic_lif *lif = IONIC_ETH_DEV_TO_LIF(eth_dev); 6973cdfd905SAlfredo Cardigliano 6983cdfd905SAlfredo Cardigliano IONIC_PRINT_CALL(); 6993cdfd905SAlfredo Cardigliano 7003cdfd905SAlfredo Cardigliano ionic_lif_reset_stats(lif); 7013cdfd905SAlfredo Cardigliano 7023cdfd905SAlfredo Cardigliano return 0; 7033cdfd905SAlfredo Cardigliano } 7043cdfd905SAlfredo Cardigliano 7053cdfd905SAlfredo Cardigliano static int 7063cdfd905SAlfredo Cardigliano ionic_dev_xstats_get_names(__rte_unused struct rte_eth_dev *eth_dev, 7073cdfd905SAlfredo Cardigliano struct rte_eth_xstat_name *xstats_names, 7083cdfd905SAlfredo Cardigliano __rte_unused unsigned int size) 7093cdfd905SAlfredo Cardigliano { 7103cdfd905SAlfredo Cardigliano unsigned int i; 7113cdfd905SAlfredo Cardigliano 7123cdfd905SAlfredo Cardigliano if (xstats_names != NULL) { 7133cdfd905SAlfredo Cardigliano for (i = 0; i < IONIC_NB_HW_STATS; i++) { 7143cdfd905SAlfredo Cardigliano snprintf(xstats_names[i].name, 7153cdfd905SAlfredo Cardigliano sizeof(xstats_names[i].name), 7163cdfd905SAlfredo Cardigliano "%s", rte_ionic_xstats_strings[i].name); 7173cdfd905SAlfredo Cardigliano } 7183cdfd905SAlfredo Cardigliano } 7193cdfd905SAlfredo Cardigliano 7203cdfd905SAlfredo Cardigliano return IONIC_NB_HW_STATS; 7213cdfd905SAlfredo Cardigliano } 7223cdfd905SAlfredo Cardigliano 7233cdfd905SAlfredo Cardigliano static int 7243cdfd905SAlfredo Cardigliano ionic_dev_xstats_get_names_by_id(struct rte_eth_dev *eth_dev, 7258c9f976fSAndrew Rybchenko const uint64_t *ids, struct rte_eth_xstat_name *xstats_names, 7263cdfd905SAlfredo Cardigliano unsigned int limit) 7273cdfd905SAlfredo Cardigliano { 7283cdfd905SAlfredo Cardigliano struct rte_eth_xstat_name xstats_names_copy[IONIC_NB_HW_STATS]; 7293cdfd905SAlfredo Cardigliano uint16_t i; 7303cdfd905SAlfredo Cardigliano 7313cdfd905SAlfredo Cardigliano if (!ids) { 7323cdfd905SAlfredo Cardigliano if (xstats_names != NULL) { 7333cdfd905SAlfredo Cardigliano for (i = 0; i < IONIC_NB_HW_STATS; i++) { 7343cdfd905SAlfredo Cardigliano snprintf(xstats_names[i].name, 7353cdfd905SAlfredo Cardigliano sizeof(xstats_names[i].name), 7363cdfd905SAlfredo Cardigliano "%s", rte_ionic_xstats_strings[i].name); 7373cdfd905SAlfredo Cardigliano } 7383cdfd905SAlfredo Cardigliano } 7393cdfd905SAlfredo Cardigliano 7403cdfd905SAlfredo Cardigliano return IONIC_NB_HW_STATS; 7413cdfd905SAlfredo Cardigliano } 7423cdfd905SAlfredo Cardigliano 7438c9f976fSAndrew Rybchenko ionic_dev_xstats_get_names_by_id(eth_dev, NULL, xstats_names_copy, 7443cdfd905SAlfredo Cardigliano IONIC_NB_HW_STATS); 7453cdfd905SAlfredo Cardigliano 7463cdfd905SAlfredo Cardigliano for (i = 0; i < limit; i++) { 7473cdfd905SAlfredo Cardigliano if (ids[i] >= IONIC_NB_HW_STATS) { 7483cdfd905SAlfredo Cardigliano IONIC_PRINT(ERR, "id value isn't valid"); 7493cdfd905SAlfredo Cardigliano return -1; 7503cdfd905SAlfredo Cardigliano } 7513cdfd905SAlfredo Cardigliano 7523cdfd905SAlfredo Cardigliano strcpy(xstats_names[i].name, xstats_names_copy[ids[i]].name); 7533cdfd905SAlfredo Cardigliano } 7543cdfd905SAlfredo Cardigliano 7553cdfd905SAlfredo Cardigliano return limit; 7563cdfd905SAlfredo Cardigliano } 7573cdfd905SAlfredo Cardigliano 7583cdfd905SAlfredo Cardigliano static int 7593cdfd905SAlfredo Cardigliano ionic_dev_xstats_get(struct rte_eth_dev *eth_dev, struct rte_eth_xstat *xstats, 7603cdfd905SAlfredo Cardigliano unsigned int n) 7613cdfd905SAlfredo Cardigliano { 7623cdfd905SAlfredo Cardigliano struct ionic_lif *lif = IONIC_ETH_DEV_TO_LIF(eth_dev); 7633cdfd905SAlfredo Cardigliano struct ionic_lif_stats hw_stats; 7643cdfd905SAlfredo Cardigliano uint16_t i; 7653cdfd905SAlfredo Cardigliano 7663cdfd905SAlfredo Cardigliano if (n < IONIC_NB_HW_STATS) 7673cdfd905SAlfredo Cardigliano return IONIC_NB_HW_STATS; 7683cdfd905SAlfredo Cardigliano 7693cdfd905SAlfredo Cardigliano ionic_lif_get_hw_stats(lif, &hw_stats); 7703cdfd905SAlfredo Cardigliano 7713cdfd905SAlfredo Cardigliano for (i = 0; i < IONIC_NB_HW_STATS; i++) { 7723cdfd905SAlfredo Cardigliano xstats[i].value = *(uint64_t *)(((char *)&hw_stats) + 7733cdfd905SAlfredo Cardigliano rte_ionic_xstats_strings[i].offset); 7743cdfd905SAlfredo Cardigliano xstats[i].id = i; 7753cdfd905SAlfredo Cardigliano } 7763cdfd905SAlfredo Cardigliano 7773cdfd905SAlfredo Cardigliano return IONIC_NB_HW_STATS; 7783cdfd905SAlfredo Cardigliano } 7793cdfd905SAlfredo Cardigliano 7803cdfd905SAlfredo Cardigliano static int 7813cdfd905SAlfredo Cardigliano ionic_dev_xstats_get_by_id(struct rte_eth_dev *eth_dev, const uint64_t *ids, 7823cdfd905SAlfredo Cardigliano uint64_t *values, unsigned int n) 7833cdfd905SAlfredo Cardigliano { 7843cdfd905SAlfredo Cardigliano struct ionic_lif *lif = IONIC_ETH_DEV_TO_LIF(eth_dev); 7853cdfd905SAlfredo Cardigliano struct ionic_lif_stats hw_stats; 7863cdfd905SAlfredo Cardigliano uint64_t values_copy[IONIC_NB_HW_STATS]; 7873cdfd905SAlfredo Cardigliano uint16_t i; 7883cdfd905SAlfredo Cardigliano 7893cdfd905SAlfredo Cardigliano if (!ids) { 7903cdfd905SAlfredo Cardigliano if (!ids && n < IONIC_NB_HW_STATS) 7913cdfd905SAlfredo Cardigliano return IONIC_NB_HW_STATS; 7923cdfd905SAlfredo Cardigliano 7933cdfd905SAlfredo Cardigliano ionic_lif_get_hw_stats(lif, &hw_stats); 7943cdfd905SAlfredo Cardigliano 7953cdfd905SAlfredo Cardigliano for (i = 0; i < IONIC_NB_HW_STATS; i++) { 7963cdfd905SAlfredo Cardigliano values[i] = *(uint64_t *)(((char *)&hw_stats) + 7973cdfd905SAlfredo Cardigliano rte_ionic_xstats_strings[i].offset); 7983cdfd905SAlfredo Cardigliano } 7993cdfd905SAlfredo Cardigliano 8003cdfd905SAlfredo Cardigliano return IONIC_NB_HW_STATS; 8013cdfd905SAlfredo Cardigliano } 8023cdfd905SAlfredo Cardigliano 8033cdfd905SAlfredo Cardigliano ionic_dev_xstats_get_by_id(eth_dev, NULL, values_copy, 8043cdfd905SAlfredo Cardigliano IONIC_NB_HW_STATS); 8053cdfd905SAlfredo Cardigliano 8063cdfd905SAlfredo Cardigliano for (i = 0; i < n; i++) { 8073cdfd905SAlfredo Cardigliano if (ids[i] >= IONIC_NB_HW_STATS) { 8083cdfd905SAlfredo Cardigliano IONIC_PRINT(ERR, "id value isn't valid"); 8093cdfd905SAlfredo Cardigliano return -1; 8103cdfd905SAlfredo Cardigliano } 8113cdfd905SAlfredo Cardigliano 8123cdfd905SAlfredo Cardigliano values[i] = values_copy[ids[i]]; 8133cdfd905SAlfredo Cardigliano } 8143cdfd905SAlfredo Cardigliano 8153cdfd905SAlfredo Cardigliano return n; 8163cdfd905SAlfredo Cardigliano } 8173cdfd905SAlfredo Cardigliano 8183cdfd905SAlfredo Cardigliano static int 8193cdfd905SAlfredo Cardigliano ionic_dev_xstats_reset(struct rte_eth_dev *eth_dev) 8203cdfd905SAlfredo Cardigliano { 8213cdfd905SAlfredo Cardigliano struct ionic_lif *lif = IONIC_ETH_DEV_TO_LIF(eth_dev); 8223cdfd905SAlfredo Cardigliano 8233cdfd905SAlfredo Cardigliano ionic_lif_reset_hw_stats(lif); 8243cdfd905SAlfredo Cardigliano 8253cdfd905SAlfredo Cardigliano return 0; 8263cdfd905SAlfredo Cardigliano } 8273cdfd905SAlfredo Cardigliano 8283cdfd905SAlfredo Cardigliano static int 829598f6726SAlfredo Cardigliano ionic_dev_configure(struct rte_eth_dev *eth_dev) 830598f6726SAlfredo Cardigliano { 831598f6726SAlfredo Cardigliano struct ionic_lif *lif = IONIC_ETH_DEV_TO_LIF(eth_dev); 832598f6726SAlfredo Cardigliano 833598f6726SAlfredo Cardigliano IONIC_PRINT_CALL(); 834598f6726SAlfredo Cardigliano 83518a44465SAndrew Boyer ionic_lif_configure(lif); 83618a44465SAndrew Boyer 83718a44465SAndrew Boyer ionic_lif_set_features(lif); 838598f6726SAlfredo Cardigliano 839598f6726SAlfredo Cardigliano return 0; 840598f6726SAlfredo Cardigliano } 841598f6726SAlfredo Cardigliano 842598f6726SAlfredo Cardigliano static inline uint32_t 843598f6726SAlfredo Cardigliano ionic_parse_link_speeds(uint16_t link_speeds) 844598f6726SAlfredo Cardigliano { 845295968d1SFerruh Yigit if (link_speeds & RTE_ETH_LINK_SPEED_100G) 846598f6726SAlfredo Cardigliano return 100000; 847295968d1SFerruh Yigit else if (link_speeds & RTE_ETH_LINK_SPEED_50G) 848598f6726SAlfredo Cardigliano return 50000; 849295968d1SFerruh Yigit else if (link_speeds & RTE_ETH_LINK_SPEED_40G) 850598f6726SAlfredo Cardigliano return 40000; 851295968d1SFerruh Yigit else if (link_speeds & RTE_ETH_LINK_SPEED_25G) 852598f6726SAlfredo Cardigliano return 25000; 853295968d1SFerruh Yigit else if (link_speeds & RTE_ETH_LINK_SPEED_10G) 854598f6726SAlfredo Cardigliano return 10000; 855598f6726SAlfredo Cardigliano else 856598f6726SAlfredo Cardigliano return 0; 857598f6726SAlfredo Cardigliano } 858598f6726SAlfredo Cardigliano 859598f6726SAlfredo Cardigliano /* 860598f6726SAlfredo Cardigliano * Configure device link speed and setup link. 861598f6726SAlfredo Cardigliano * It returns 0 on success. 862598f6726SAlfredo Cardigliano */ 863598f6726SAlfredo Cardigliano static int 864598f6726SAlfredo Cardigliano ionic_dev_start(struct rte_eth_dev *eth_dev) 865598f6726SAlfredo Cardigliano { 866598f6726SAlfredo Cardigliano struct rte_eth_conf *dev_conf = ð_dev->data->dev_conf; 867598f6726SAlfredo Cardigliano struct ionic_lif *lif = IONIC_ETH_DEV_TO_LIF(eth_dev); 868598f6726SAlfredo Cardigliano struct ionic_adapter *adapter = lif->adapter; 869598f6726SAlfredo Cardigliano struct ionic_dev *idev = &adapter->idev; 8700dad8b3dSAndrew Boyer uint32_t speed = 0, allowed_speeds; 8710dad8b3dSAndrew Boyer uint8_t an_enable; 872598f6726SAlfredo Cardigliano int err; 873598f6726SAlfredo Cardigliano 874598f6726SAlfredo Cardigliano IONIC_PRINT_CALL(); 875598f6726SAlfredo Cardigliano 876598f6726SAlfredo Cardigliano allowed_speeds = 877295968d1SFerruh Yigit RTE_ETH_LINK_SPEED_FIXED | 878295968d1SFerruh Yigit RTE_ETH_LINK_SPEED_10G | 879295968d1SFerruh Yigit RTE_ETH_LINK_SPEED_25G | 880295968d1SFerruh Yigit RTE_ETH_LINK_SPEED_40G | 881295968d1SFerruh Yigit RTE_ETH_LINK_SPEED_50G | 882295968d1SFerruh Yigit RTE_ETH_LINK_SPEED_100G; 883598f6726SAlfredo Cardigliano 884598f6726SAlfredo Cardigliano if (dev_conf->link_speeds & ~allowed_speeds) { 885598f6726SAlfredo Cardigliano IONIC_PRINT(ERR, "Invalid link setting"); 886598f6726SAlfredo Cardigliano return -EINVAL; 887598f6726SAlfredo Cardigliano } 888598f6726SAlfredo Cardigliano 88920e577e4SAndrew Boyer if (dev_conf->lpbk_mode) 89020e577e4SAndrew Boyer IONIC_PRINT(WARNING, "Loopback mode not supported"); 89120e577e4SAndrew Boyer 892598f6726SAlfredo Cardigliano err = ionic_lif_start(lif); 893598f6726SAlfredo Cardigliano if (err) { 894598f6726SAlfredo Cardigliano IONIC_PRINT(ERR, "Cannot start LIF: %d", err); 895598f6726SAlfredo Cardigliano return err; 896598f6726SAlfredo Cardigliano } 897598f6726SAlfredo Cardigliano 8980dad8b3dSAndrew Boyer /* Configure link */ 899295968d1SFerruh Yigit an_enable = (dev_conf->link_speeds & RTE_ETH_LINK_SPEED_FIXED) == 0; 900598f6726SAlfredo Cardigliano 9010dad8b3dSAndrew Boyer ionic_dev_cmd_port_autoneg(idev, an_enable); 9020dad8b3dSAndrew Boyer err = ionic_dev_cmd_wait_check(idev, IONIC_DEVCMD_TIMEOUT); 9030dad8b3dSAndrew Boyer if (err) 9040dad8b3dSAndrew Boyer IONIC_PRINT(WARNING, "Failed to %s autonegotiation", 9050dad8b3dSAndrew Boyer an_enable ? "enable" : "disable"); 9060dad8b3dSAndrew Boyer 9070dad8b3dSAndrew Boyer if (!an_enable) 9080dad8b3dSAndrew Boyer speed = ionic_parse_link_speeds(dev_conf->link_speeds); 9090dad8b3dSAndrew Boyer if (speed) { 910598f6726SAlfredo Cardigliano ionic_dev_cmd_port_speed(idev, speed); 9110dad8b3dSAndrew Boyer err = ionic_dev_cmd_wait_check(idev, IONIC_DEVCMD_TIMEOUT); 9120dad8b3dSAndrew Boyer if (err) 9130dad8b3dSAndrew Boyer IONIC_PRINT(WARNING, "Failed to set link speed %u", 9140dad8b3dSAndrew Boyer speed); 915598f6726SAlfredo Cardigliano } 916598f6726SAlfredo Cardigliano 917598f6726SAlfredo Cardigliano ionic_dev_link_update(eth_dev, 0); 918598f6726SAlfredo Cardigliano 919598f6726SAlfredo Cardigliano return 0; 920598f6726SAlfredo Cardigliano } 921598f6726SAlfredo Cardigliano 922598f6726SAlfredo Cardigliano /* 923598f6726SAlfredo Cardigliano * Stop device: disable rx and tx functions to allow for reconfiguring. 924598f6726SAlfredo Cardigliano */ 92562024eb8SIvan Ilchenko static int 926598f6726SAlfredo Cardigliano ionic_dev_stop(struct rte_eth_dev *eth_dev) 927598f6726SAlfredo Cardigliano { 928598f6726SAlfredo Cardigliano struct ionic_lif *lif = IONIC_ETH_DEV_TO_LIF(eth_dev); 929598f6726SAlfredo Cardigliano 930598f6726SAlfredo Cardigliano IONIC_PRINT_CALL(); 931598f6726SAlfredo Cardigliano 932be63459eSAndrew Boyer ionic_lif_stop(lif); 93362024eb8SIvan Ilchenko 934be63459eSAndrew Boyer return 0; 935598f6726SAlfredo Cardigliano } 936598f6726SAlfredo Cardigliano 937175e4e7eSAndrew Boyer static void ionic_unconfigure_intr(struct ionic_adapter *adapter); 938175e4e7eSAndrew Boyer 939598f6726SAlfredo Cardigliano /* 940598f6726SAlfredo Cardigliano * Reset and stop device. 941598f6726SAlfredo Cardigliano */ 942b142387bSThomas Monjalon static int 943598f6726SAlfredo Cardigliano ionic_dev_close(struct rte_eth_dev *eth_dev) 944598f6726SAlfredo Cardigliano { 945598f6726SAlfredo Cardigliano struct ionic_lif *lif = IONIC_ETH_DEV_TO_LIF(eth_dev); 946175e4e7eSAndrew Boyer struct ionic_adapter *adapter = lif->adapter; 947598f6726SAlfredo Cardigliano 948598f6726SAlfredo Cardigliano IONIC_PRINT_CALL(); 94930410493SThomas Monjalon if (rte_eal_process_type() != RTE_PROC_PRIMARY) 95030410493SThomas Monjalon return 0; 951598f6726SAlfredo Cardigliano 952be63459eSAndrew Boyer ionic_lif_stop(lif); 953598f6726SAlfredo Cardigliano 954175e4e7eSAndrew Boyer ionic_lif_free_queues(lif); 955175e4e7eSAndrew Boyer 956175e4e7eSAndrew Boyer IONIC_PRINT(NOTICE, "Removing device %s", eth_dev->device->name); 957175e4e7eSAndrew Boyer ionic_unconfigure_intr(adapter); 958175e4e7eSAndrew Boyer 959175e4e7eSAndrew Boyer rte_eth_dev_destroy(eth_dev, eth_ionic_dev_uninit); 960175e4e7eSAndrew Boyer 961175e4e7eSAndrew Boyer ionic_port_reset(adapter); 962175e4e7eSAndrew Boyer ionic_reset(adapter); 963175e4e7eSAndrew Boyer 964175e4e7eSAndrew Boyer rte_free(adapter); 965b142387bSThomas Monjalon 966b142387bSThomas Monjalon return 0; 967598f6726SAlfredo Cardigliano } 968598f6726SAlfredo Cardigliano 969598f6726SAlfredo Cardigliano static int 970669c8de6SAlfredo Cardigliano eth_ionic_dev_init(struct rte_eth_dev *eth_dev, void *init_params) 971669c8de6SAlfredo Cardigliano { 972669c8de6SAlfredo Cardigliano struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(eth_dev); 973669c8de6SAlfredo Cardigliano struct ionic_lif *lif = IONIC_ETH_DEV_TO_LIF(eth_dev); 974669c8de6SAlfredo Cardigliano struct ionic_adapter *adapter = (struct ionic_adapter *)init_params; 975669c8de6SAlfredo Cardigliano int err; 976669c8de6SAlfredo Cardigliano 977669c8de6SAlfredo Cardigliano IONIC_PRINT_CALL(); 978669c8de6SAlfredo Cardigliano 979669c8de6SAlfredo Cardigliano eth_dev->dev_ops = &ionic_eth_dev_ops; 980a27d9013SAlfredo Cardigliano eth_dev->rx_pkt_burst = &ionic_recv_pkts; 981a27d9013SAlfredo Cardigliano eth_dev->tx_pkt_burst = &ionic_xmit_pkts; 982a27d9013SAlfredo Cardigliano eth_dev->tx_pkt_prepare = &ionic_prep_pkts; 983669c8de6SAlfredo Cardigliano 984669c8de6SAlfredo Cardigliano /* Multi-process not supported, primary does initialization anyway */ 985669c8de6SAlfredo Cardigliano if (rte_eal_process_type() != RTE_PROC_PRIMARY) 986669c8de6SAlfredo Cardigliano return 0; 987669c8de6SAlfredo Cardigliano 988669c8de6SAlfredo Cardigliano rte_eth_copy_pci_info(eth_dev, pci_dev); 989f30e69b4SFerruh Yigit eth_dev->data->dev_flags |= RTE_ETH_DEV_AUTOFILL_QUEUE_XSTATS; 990669c8de6SAlfredo Cardigliano 991669c8de6SAlfredo Cardigliano lif->eth_dev = eth_dev; 992669c8de6SAlfredo Cardigliano lif->adapter = adapter; 99300b65da5SAndrew Boyer adapter->lif = lif; 994669c8de6SAlfredo Cardigliano 995598f6726SAlfredo Cardigliano IONIC_PRINT(DEBUG, "Up to %u MAC addresses supported", 996598f6726SAlfredo Cardigliano adapter->max_mac_addrs); 997598f6726SAlfredo Cardigliano 998598f6726SAlfredo Cardigliano /* Allocate memory for storing MAC addresses */ 999598f6726SAlfredo Cardigliano eth_dev->data->mac_addrs = rte_zmalloc("ionic", 1000598f6726SAlfredo Cardigliano RTE_ETHER_ADDR_LEN * adapter->max_mac_addrs, 0); 1001598f6726SAlfredo Cardigliano 1002598f6726SAlfredo Cardigliano if (eth_dev->data->mac_addrs == NULL) { 1003598f6726SAlfredo Cardigliano IONIC_PRINT(ERR, "Failed to allocate %u bytes needed to " 1004598f6726SAlfredo Cardigliano "store MAC addresses", 1005598f6726SAlfredo Cardigliano RTE_ETHER_ADDR_LEN * adapter->max_mac_addrs); 1006598f6726SAlfredo Cardigliano err = -ENOMEM; 1007598f6726SAlfredo Cardigliano goto err; 1008598f6726SAlfredo Cardigliano } 1009598f6726SAlfredo Cardigliano 1010669c8de6SAlfredo Cardigliano err = ionic_lif_alloc(lif); 1011669c8de6SAlfredo Cardigliano if (err) { 1012669c8de6SAlfredo Cardigliano IONIC_PRINT(ERR, "Cannot allocate LIFs: %d, aborting", 1013669c8de6SAlfredo Cardigliano err); 1014669c8de6SAlfredo Cardigliano goto err; 1015669c8de6SAlfredo Cardigliano } 1016669c8de6SAlfredo Cardigliano 1017669c8de6SAlfredo Cardigliano err = ionic_lif_init(lif); 1018669c8de6SAlfredo Cardigliano if (err) { 1019669c8de6SAlfredo Cardigliano IONIC_PRINT(ERR, "Cannot init LIFs: %d, aborting", err); 1020669c8de6SAlfredo Cardigliano goto err_free_lif; 1021669c8de6SAlfredo Cardigliano } 1022669c8de6SAlfredo Cardigliano 1023598f6726SAlfredo Cardigliano /* Copy the MAC address */ 1024598f6726SAlfredo Cardigliano rte_ether_addr_copy((struct rte_ether_addr *)lif->mac_addr, 1025598f6726SAlfredo Cardigliano ð_dev->data->mac_addrs[0]); 1026598f6726SAlfredo Cardigliano 1027669c8de6SAlfredo Cardigliano IONIC_PRINT(DEBUG, "Port %u initialized", eth_dev->data->port_id); 1028669c8de6SAlfredo Cardigliano 1029669c8de6SAlfredo Cardigliano return 0; 1030669c8de6SAlfredo Cardigliano 1031669c8de6SAlfredo Cardigliano err_free_lif: 1032669c8de6SAlfredo Cardigliano ionic_lif_free(lif); 1033669c8de6SAlfredo Cardigliano err: 1034669c8de6SAlfredo Cardigliano return err; 1035669c8de6SAlfredo Cardigliano } 1036669c8de6SAlfredo Cardigliano 1037669c8de6SAlfredo Cardigliano static int 1038669c8de6SAlfredo Cardigliano eth_ionic_dev_uninit(struct rte_eth_dev *eth_dev) 1039669c8de6SAlfredo Cardigliano { 1040669c8de6SAlfredo Cardigliano struct ionic_lif *lif = IONIC_ETH_DEV_TO_LIF(eth_dev); 1041669c8de6SAlfredo Cardigliano struct ionic_adapter *adapter = lif->adapter; 1042669c8de6SAlfredo Cardigliano 1043669c8de6SAlfredo Cardigliano IONIC_PRINT_CALL(); 1044669c8de6SAlfredo Cardigliano 1045669c8de6SAlfredo Cardigliano if (rte_eal_process_type() != RTE_PROC_PRIMARY) 1046669c8de6SAlfredo Cardigliano return 0; 1047669c8de6SAlfredo Cardigliano 104800b65da5SAndrew Boyer adapter->lif = NULL; 1049669c8de6SAlfredo Cardigliano 1050669c8de6SAlfredo Cardigliano ionic_lif_deinit(lif); 1051669c8de6SAlfredo Cardigliano ionic_lif_free(lif); 1052669c8de6SAlfredo Cardigliano 1053be63459eSAndrew Boyer if (!(lif->state & IONIC_LIF_F_FW_RESET)) 1054be63459eSAndrew Boyer ionic_lif_reset(lif); 1055be63459eSAndrew Boyer 1056669c8de6SAlfredo Cardigliano return 0; 1057669c8de6SAlfredo Cardigliano } 1058669c8de6SAlfredo Cardigliano 10595ef51809SAlfredo Cardigliano static int 106027b942c8SAlfredo Cardigliano ionic_configure_intr(struct ionic_adapter *adapter) 106127b942c8SAlfredo Cardigliano { 106227b942c8SAlfredo Cardigliano struct rte_pci_device *pci_dev = adapter->pci_dev; 1063*d61138d4SHarman Kalra struct rte_intr_handle *intr_handle = pci_dev->intr_handle; 106427b942c8SAlfredo Cardigliano int err; 106527b942c8SAlfredo Cardigliano 106627b942c8SAlfredo Cardigliano IONIC_PRINT(DEBUG, "Configuring %u intrs", adapter->nintrs); 106727b942c8SAlfredo Cardigliano 106827b942c8SAlfredo Cardigliano if (rte_intr_efd_enable(intr_handle, adapter->nintrs)) { 106927b942c8SAlfredo Cardigliano IONIC_PRINT(ERR, "Fail to create eventfd"); 107027b942c8SAlfredo Cardigliano return -1; 107127b942c8SAlfredo Cardigliano } 107227b942c8SAlfredo Cardigliano 107327b942c8SAlfredo Cardigliano if (rte_intr_dp_is_en(intr_handle)) 107427b942c8SAlfredo Cardigliano IONIC_PRINT(DEBUG, 107527b942c8SAlfredo Cardigliano "Packet I/O interrupt on datapath is enabled"); 107627b942c8SAlfredo Cardigliano 1077*d61138d4SHarman Kalra if (rte_intr_vec_list_alloc(intr_handle, "intr_vec", adapter->nintrs)) { 107827b942c8SAlfredo Cardigliano IONIC_PRINT(ERR, "Failed to allocate %u vectors", 107927b942c8SAlfredo Cardigliano adapter->nintrs); 108027b942c8SAlfredo Cardigliano return -ENOMEM; 108127b942c8SAlfredo Cardigliano } 108227b942c8SAlfredo Cardigliano 108327b942c8SAlfredo Cardigliano err = rte_intr_callback_register(intr_handle, 108427b942c8SAlfredo Cardigliano ionic_dev_interrupt_handler, 108527b942c8SAlfredo Cardigliano adapter); 108627b942c8SAlfredo Cardigliano 108727b942c8SAlfredo Cardigliano if (err) { 108827b942c8SAlfredo Cardigliano IONIC_PRINT(ERR, 108927b942c8SAlfredo Cardigliano "Failure registering interrupts handler (%d)", 109027b942c8SAlfredo Cardigliano err); 109127b942c8SAlfredo Cardigliano return err; 109227b942c8SAlfredo Cardigliano } 109327b942c8SAlfredo Cardigliano 109427b942c8SAlfredo Cardigliano /* enable intr mapping */ 109527b942c8SAlfredo Cardigliano err = rte_intr_enable(intr_handle); 109627b942c8SAlfredo Cardigliano 109727b942c8SAlfredo Cardigliano if (err) { 109827b942c8SAlfredo Cardigliano IONIC_PRINT(ERR, "Failure enabling interrupts (%d)", err); 109927b942c8SAlfredo Cardigliano return err; 110027b942c8SAlfredo Cardigliano } 110127b942c8SAlfredo Cardigliano 110227b942c8SAlfredo Cardigliano return 0; 110327b942c8SAlfredo Cardigliano } 110427b942c8SAlfredo Cardigliano 110527b942c8SAlfredo Cardigliano static void 110627b942c8SAlfredo Cardigliano ionic_unconfigure_intr(struct ionic_adapter *adapter) 110727b942c8SAlfredo Cardigliano { 110827b942c8SAlfredo Cardigliano struct rte_pci_device *pci_dev = adapter->pci_dev; 1109*d61138d4SHarman Kalra struct rte_intr_handle *intr_handle = pci_dev->intr_handle; 111027b942c8SAlfredo Cardigliano 111127b942c8SAlfredo Cardigliano rte_intr_disable(intr_handle); 111227b942c8SAlfredo Cardigliano 111327b942c8SAlfredo Cardigliano rte_intr_callback_unregister(intr_handle, 111427b942c8SAlfredo Cardigliano ionic_dev_interrupt_handler, 111527b942c8SAlfredo Cardigliano adapter); 111627b942c8SAlfredo Cardigliano } 111727b942c8SAlfredo Cardigliano 111827b942c8SAlfredo Cardigliano static int 11195ef51809SAlfredo Cardigliano eth_ionic_pci_probe(struct rte_pci_driver *pci_drv __rte_unused, 11205ef51809SAlfredo Cardigliano struct rte_pci_device *pci_dev) 11215ef51809SAlfredo Cardigliano { 1122669c8de6SAlfredo Cardigliano char name[RTE_ETH_NAME_MAX_LEN]; 11235ef51809SAlfredo Cardigliano struct rte_mem_resource *resource; 11245ef51809SAlfredo Cardigliano struct ionic_adapter *adapter; 11255ef51809SAlfredo Cardigliano struct ionic_hw *hw; 11265ef51809SAlfredo Cardigliano unsigned long i; 11275ef51809SAlfredo Cardigliano int err; 11285ef51809SAlfredo Cardigliano 11295ef51809SAlfredo Cardigliano /* Check structs (trigger error at compilation time) */ 11305ef51809SAlfredo Cardigliano ionic_struct_size_checks(); 11315ef51809SAlfredo Cardigliano 11325ef51809SAlfredo Cardigliano /* Multi-process not supported */ 11335ef51809SAlfredo Cardigliano if (rte_eal_process_type() != RTE_PROC_PRIMARY) { 11345ef51809SAlfredo Cardigliano err = -EPERM; 11355ef51809SAlfredo Cardigliano goto err; 11365ef51809SAlfredo Cardigliano } 11375ef51809SAlfredo Cardigliano 11385ef51809SAlfredo Cardigliano IONIC_PRINT(DEBUG, "Initializing device %s", 11395ef51809SAlfredo Cardigliano pci_dev->device.name); 11405ef51809SAlfredo Cardigliano 11415ef51809SAlfredo Cardigliano adapter = rte_zmalloc("ionic", sizeof(*adapter), 0); 11425ef51809SAlfredo Cardigliano if (!adapter) { 11435ef51809SAlfredo Cardigliano IONIC_PRINT(ERR, "OOM"); 11445ef51809SAlfredo Cardigliano err = -ENOMEM; 11455ef51809SAlfredo Cardigliano goto err; 11465ef51809SAlfredo Cardigliano } 11475ef51809SAlfredo Cardigliano 11485ef51809SAlfredo Cardigliano adapter->pci_dev = pci_dev; 11495ef51809SAlfredo Cardigliano hw = &adapter->hw; 11505ef51809SAlfredo Cardigliano 11515ef51809SAlfredo Cardigliano hw->device_id = pci_dev->id.device_id; 11525ef51809SAlfredo Cardigliano hw->vendor_id = pci_dev->id.vendor_id; 11535ef51809SAlfredo Cardigliano 11545ef51809SAlfredo Cardigliano err = ionic_init_mac(hw); 11555ef51809SAlfredo Cardigliano if (err != 0) { 11565ef51809SAlfredo Cardigliano IONIC_PRINT(ERR, "Mac init failed: %d", err); 11575ef51809SAlfredo Cardigliano err = -EIO; 11585ef51809SAlfredo Cardigliano goto err_free_adapter; 11595ef51809SAlfredo Cardigliano } 11605ef51809SAlfredo Cardigliano 11615ef51809SAlfredo Cardigliano adapter->num_bars = 0; 11625ef51809SAlfredo Cardigliano for (i = 0; i < PCI_MAX_RESOURCE && i < IONIC_BARS_MAX; i++) { 11635ef51809SAlfredo Cardigliano resource = &pci_dev->mem_resource[i]; 11645ef51809SAlfredo Cardigliano if (resource->phys_addr == 0 || resource->len == 0) 11655ef51809SAlfredo Cardigliano continue; 11665ef51809SAlfredo Cardigliano adapter->bars[adapter->num_bars].vaddr = resource->addr; 11675ef51809SAlfredo Cardigliano adapter->bars[adapter->num_bars].bus_addr = resource->phys_addr; 11685ef51809SAlfredo Cardigliano adapter->bars[adapter->num_bars].len = resource->len; 11695ef51809SAlfredo Cardigliano adapter->num_bars++; 11705ef51809SAlfredo Cardigliano } 11715ef51809SAlfredo Cardigliano 11725ef51809SAlfredo Cardigliano /* Discover ionic dev resources */ 11735ef51809SAlfredo Cardigliano 11745ef51809SAlfredo Cardigliano err = ionic_setup(adapter); 11755ef51809SAlfredo Cardigliano if (err) { 11765ef51809SAlfredo Cardigliano IONIC_PRINT(ERR, "Cannot setup device: %d, aborting", err); 11775ef51809SAlfredo Cardigliano goto err_free_adapter; 11785ef51809SAlfredo Cardigliano } 11795ef51809SAlfredo Cardigliano 11805ef51809SAlfredo Cardigliano err = ionic_identify(adapter); 11815ef51809SAlfredo Cardigliano if (err) { 11825ef51809SAlfredo Cardigliano IONIC_PRINT(ERR, "Cannot identify device: %d, aborting", 11835ef51809SAlfredo Cardigliano err); 11845ef51809SAlfredo Cardigliano goto err_free_adapter; 11855ef51809SAlfredo Cardigliano } 11865ef51809SAlfredo Cardigliano 11875ef51809SAlfredo Cardigliano err = ionic_init(adapter); 11885ef51809SAlfredo Cardigliano if (err) { 11895ef51809SAlfredo Cardigliano IONIC_PRINT(ERR, "Cannot init device: %d, aborting", err); 11905ef51809SAlfredo Cardigliano goto err_free_adapter; 11915ef51809SAlfredo Cardigliano } 11925ef51809SAlfredo Cardigliano 119323bf4ddbSAlfredo Cardigliano /* Configure the ports */ 119423bf4ddbSAlfredo Cardigliano err = ionic_port_identify(adapter); 119523bf4ddbSAlfredo Cardigliano if (err) { 119623bf4ddbSAlfredo Cardigliano IONIC_PRINT(ERR, "Cannot identify port: %d, aborting", 119723bf4ddbSAlfredo Cardigliano err); 119823bf4ddbSAlfredo Cardigliano goto err_free_adapter; 119923bf4ddbSAlfredo Cardigliano } 120023bf4ddbSAlfredo Cardigliano 120123bf4ddbSAlfredo Cardigliano err = ionic_port_init(adapter); 120223bf4ddbSAlfredo Cardigliano if (err) { 120323bf4ddbSAlfredo Cardigliano IONIC_PRINT(ERR, "Cannot init port: %d, aborting", err); 120423bf4ddbSAlfredo Cardigliano goto err_free_adapter; 120523bf4ddbSAlfredo Cardigliano } 120623bf4ddbSAlfredo Cardigliano 1207669c8de6SAlfredo Cardigliano /* Configure LIFs */ 1208669c8de6SAlfredo Cardigliano err = ionic_lif_identify(adapter); 1209669c8de6SAlfredo Cardigliano if (err) { 1210669c8de6SAlfredo Cardigliano IONIC_PRINT(ERR, "Cannot identify lif: %d, aborting", err); 1211669c8de6SAlfredo Cardigliano goto err_free_adapter; 1212669c8de6SAlfredo Cardigliano } 1213669c8de6SAlfredo Cardigliano 1214669c8de6SAlfredo Cardigliano /* Allocate and init LIFs */ 1215669c8de6SAlfredo Cardigliano err = ionic_lifs_size(adapter); 1216669c8de6SAlfredo Cardigliano if (err) { 1217669c8de6SAlfredo Cardigliano IONIC_PRINT(ERR, "Cannot size LIFs: %d, aborting", err); 1218669c8de6SAlfredo Cardigliano goto err_free_adapter; 1219669c8de6SAlfredo Cardigliano } 1220669c8de6SAlfredo Cardigliano 122109f806e9SAndrew Boyer adapter->max_mac_addrs = 122209f806e9SAndrew Boyer rte_le_to_cpu_32(adapter->ident.lif.eth.max_ucast_filters); 1223598f6726SAlfredo Cardigliano 122409f806e9SAndrew Boyer if (rte_le_to_cpu_32(adapter->ident.dev.nlifs) != 1) { 122500b65da5SAndrew Boyer IONIC_PRINT(ERR, "Unexpected request for %d LIFs", 122609f806e9SAndrew Boyer rte_le_to_cpu_32(adapter->ident.dev.nlifs)); 122700b65da5SAndrew Boyer goto err_free_adapter; 1228669c8de6SAlfredo Cardigliano } 1229669c8de6SAlfredo Cardigliano 123000b65da5SAndrew Boyer snprintf(name, sizeof(name), "%s_lif", pci_dev->device.name); 123100b65da5SAndrew Boyer err = rte_eth_dev_create(&pci_dev->device, 123200b65da5SAndrew Boyer name, sizeof(struct ionic_lif), 123300b65da5SAndrew Boyer NULL, NULL, eth_ionic_dev_init, adapter); 123400b65da5SAndrew Boyer if (err) { 123500b65da5SAndrew Boyer IONIC_PRINT(ERR, "Cannot create eth device for %s", name); 123600b65da5SAndrew Boyer goto err_free_adapter; 1237669c8de6SAlfredo Cardigliano } 1238669c8de6SAlfredo Cardigliano 123927b942c8SAlfredo Cardigliano err = ionic_configure_intr(adapter); 124027b942c8SAlfredo Cardigliano 124127b942c8SAlfredo Cardigliano if (err) { 124227b942c8SAlfredo Cardigliano IONIC_PRINT(ERR, "Failed to configure interrupts"); 124327b942c8SAlfredo Cardigliano goto err_free_adapter; 124427b942c8SAlfredo Cardigliano } 124527b942c8SAlfredo Cardigliano 12465ef51809SAlfredo Cardigliano return 0; 12475ef51809SAlfredo Cardigliano 12485ef51809SAlfredo Cardigliano err_free_adapter: 12495ef51809SAlfredo Cardigliano rte_free(adapter); 12505ef51809SAlfredo Cardigliano err: 12515ef51809SAlfredo Cardigliano return err; 12525ef51809SAlfredo Cardigliano } 12535ef51809SAlfredo Cardigliano 12545ef51809SAlfredo Cardigliano static int 1255175e4e7eSAndrew Boyer eth_ionic_pci_remove(struct rte_pci_device *pci_dev) 12565ef51809SAlfredo Cardigliano { 1257669c8de6SAlfredo Cardigliano char name[RTE_ETH_NAME_MAX_LEN]; 1258669c8de6SAlfredo Cardigliano struct rte_eth_dev *eth_dev; 1259669c8de6SAlfredo Cardigliano 126000b65da5SAndrew Boyer /* Adapter lookup is using the eth_dev name */ 126100b65da5SAndrew Boyer snprintf(name, sizeof(name), "%s_lif", pci_dev->device.name); 1262669c8de6SAlfredo Cardigliano 1263669c8de6SAlfredo Cardigliano eth_dev = rte_eth_dev_allocated(name); 1264175e4e7eSAndrew Boyer if (eth_dev) 1265175e4e7eSAndrew Boyer ionic_dev_close(eth_dev); 1266175e4e7eSAndrew Boyer else 1267175e4e7eSAndrew Boyer IONIC_PRINT(DEBUG, "Cannot find device %s", 1268175e4e7eSAndrew Boyer pci_dev->device.name); 1269669c8de6SAlfredo Cardigliano 12705ef51809SAlfredo Cardigliano return 0; 12715ef51809SAlfredo Cardigliano } 12725ef51809SAlfredo Cardigliano 12735ef51809SAlfredo Cardigliano static struct rte_pci_driver rte_ionic_pmd = { 12745ef51809SAlfredo Cardigliano .id_table = pci_id_ionic_map, 12755ef51809SAlfredo Cardigliano .drv_flags = RTE_PCI_DRV_NEED_MAPPING | RTE_PCI_DRV_INTR_LSC, 12765ef51809SAlfredo Cardigliano .probe = eth_ionic_pci_probe, 12775ef51809SAlfredo Cardigliano .remove = eth_ionic_pci_remove, 12785ef51809SAlfredo Cardigliano }; 12795ef51809SAlfredo Cardigliano 12805ef51809SAlfredo Cardigliano RTE_PMD_REGISTER_PCI(net_ionic, rte_ionic_pmd); 12815ef51809SAlfredo Cardigliano RTE_PMD_REGISTER_PCI_TABLE(net_ionic, pci_id_ionic_map); 12825ef51809SAlfredo Cardigliano RTE_PMD_REGISTER_KMOD_DEP(net_ionic, "* igb_uio | uio_pci_generic | vfio-pci"); 1283eeded204SDavid Marchand RTE_LOG_REGISTER_DEFAULT(ionic_logtype, NOTICE); 1284