1 /* SPDX-License-Identifier: BSD-3-Clause 2 * Copyright(C) 2019 Marvell International Ltd. 3 */ 4 5 #include "l2fwd_common.h" 6 7 int 8 l2fwd_event_init_ports(struct l2fwd_resources *rsrc) 9 { 10 uint16_t nb_rxd = RTE_TEST_RX_DESC_DEFAULT; 11 uint16_t nb_txd = RTE_TEST_TX_DESC_DEFAULT; 12 struct rte_eth_conf port_conf = { 13 .rxmode = { 14 .max_rx_pkt_len = RTE_ETHER_MAX_LEN, 15 .split_hdr_size = 0, 16 }, 17 .txmode = { 18 .mq_mode = ETH_MQ_TX_NONE, 19 }, 20 }; 21 uint16_t nb_ports_available = 0; 22 uint16_t port_id; 23 int ret; 24 25 if (rsrc->event_mode) { 26 port_conf.rxmode.mq_mode = ETH_MQ_RX_RSS; 27 port_conf.rx_adv_conf.rss_conf.rss_key = NULL; 28 port_conf.rx_adv_conf.rss_conf.rss_hf = ETH_RSS_IP; 29 } 30 31 /* Initialise each port */ 32 RTE_ETH_FOREACH_DEV(port_id) { 33 struct rte_eth_conf local_port_conf = port_conf; 34 struct rte_eth_dev_info dev_info; 35 struct rte_eth_rxconf rxq_conf; 36 struct rte_eth_txconf txq_conf; 37 38 /* skip ports that are not enabled */ 39 if ((rsrc->enabled_port_mask & (1 << port_id)) == 0) { 40 printf("Skipping disabled port %u\n", port_id); 41 continue; 42 } 43 nb_ports_available++; 44 45 /* init port */ 46 printf("Initializing port %u... ", port_id); 47 fflush(stdout); 48 49 ret = rte_eth_dev_info_get(port_id, &dev_info); 50 if (ret != 0) 51 rte_panic("Error during getting device (port %u) info: %s\n", 52 port_id, strerror(-ret)); 53 local_port_conf.rx_adv_conf.rss_conf.rss_hf &= 54 dev_info.flow_type_rss_offloads; 55 if (local_port_conf.rx_adv_conf.rss_conf.rss_hf != 56 port_conf.rx_adv_conf.rss_conf.rss_hf) { 57 printf("Port %u modified RSS hash function based on hardware support," 58 "requested:%#"PRIx64" configured:%#"PRIx64"", 59 port_id, 60 port_conf.rx_adv_conf.rss_conf.rss_hf, 61 local_port_conf.rx_adv_conf.rss_conf.rss_hf); 62 } 63 64 if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_MBUF_FAST_FREE) 65 local_port_conf.txmode.offloads |= 66 DEV_TX_OFFLOAD_MBUF_FAST_FREE; 67 ret = rte_eth_dev_configure(port_id, 1, 1, &local_port_conf); 68 if (ret < 0) 69 rte_panic("Cannot configure device: err=%d, port=%u\n", 70 ret, port_id); 71 72 ret = rte_eth_dev_adjust_nb_rx_tx_desc(port_id, &nb_rxd, 73 &nb_txd); 74 if (ret < 0) 75 rte_panic("Cannot adjust number of descriptors: err=%d, port=%u\n", 76 ret, port_id); 77 78 rte_eth_macaddr_get(port_id, &rsrc->eth_addr[port_id]); 79 80 /* init one RX queue */ 81 fflush(stdout); 82 rxq_conf = dev_info.default_rxconf; 83 rxq_conf.offloads = local_port_conf.rxmode.offloads; 84 ret = rte_eth_rx_queue_setup(port_id, 0, nb_rxd, 85 rte_eth_dev_socket_id(port_id), 86 &rxq_conf, 87 rsrc->pktmbuf_pool); 88 if (ret < 0) 89 rte_panic("rte_eth_rx_queue_setup:err=%d, port=%u\n", 90 ret, port_id); 91 92 /* init one TX queue on each port */ 93 fflush(stdout); 94 txq_conf = dev_info.default_txconf; 95 txq_conf.offloads = local_port_conf.txmode.offloads; 96 ret = rte_eth_tx_queue_setup(port_id, 0, nb_txd, 97 rte_eth_dev_socket_id(port_id), 98 &txq_conf); 99 if (ret < 0) 100 rte_panic("rte_eth_tx_queue_setup:err=%d, port=%u\n", 101 ret, port_id); 102 103 rte_eth_promiscuous_enable(port_id); 104 105 printf("Port %u,MAC address: %02X:%02X:%02X:%02X:%02X:%02X\n\n", 106 port_id, 107 rsrc->eth_addr[port_id].addr_bytes[0], 108 rsrc->eth_addr[port_id].addr_bytes[1], 109 rsrc->eth_addr[port_id].addr_bytes[2], 110 rsrc->eth_addr[port_id].addr_bytes[3], 111 rsrc->eth_addr[port_id].addr_bytes[4], 112 rsrc->eth_addr[port_id].addr_bytes[5]); 113 } 114 115 return nb_ports_available; 116 } 117