1 /* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright(C) 2019 Marvell International Ltd.
3 */
4
5 #include "l2fwd_common.h"
6
7 int
l2fwd_event_init_ports(struct l2fwd_resources * rsrc)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