Branch data Line data Source code
1 : : /* SPDX-License-Identifier: BSD-3-Clause
2 : : * Copyright (C), 2025, Wuxi Stars Micro System Technologies Co., Ltd.
3 : : */
4 : :
5 : : #include <rte_os.h>
6 : : #include "sxe2_osal.h"
7 : : #include "sxe2_mac.h"
8 : : #include "sxe2_common_log.h"
9 : : #include "sxe2_ethdev.h"
10 : : #include "sxe2_cmd_chnl.h"
11 : : #include "sxe2_host_regs.h"
12 : :
13 : 0 : int32_t sxe2_mac_default_cfg(struct rte_eth_dev *dev)
14 : : {
15 : 0 : struct sxe2_adapter *adapter = SXE2_DEV_PRIVATE_TO_ADAPTER(dev);
16 : 0 : int32_t ret;
17 : 0 : struct rte_ether_addr broadcast = {
18 : : .addr_bytes = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff} };
19 : 0 : struct rte_ether_addr mac_addr;
20 : :
21 : 0 : rte_ether_addr_copy((struct rte_ether_addr *)
22 : 0 : adapter->dev_info.mac.perm_addr, &mac_addr);
23 : 0 : ret = sxe2_uc_filter_add(adapter, &mac_addr, true);
24 [ # # ]: 0 : if (ret != 0) {
25 : 0 : PMD_DEV_LOG_ERR(adapter, DRV, "Failed to add default MAC filter");
26 : 0 : goto l_end;
27 : : }
28 : :
29 : 0 : rte_ether_addr_copy(&broadcast, &mac_addr);
30 : 0 : ret = sxe2_mc_filter_add(adapter, &mac_addr, true);
31 [ # # ]: 0 : if (ret != 0) {
32 : 0 : PMD_DEV_LOG_ERR(adapter, DRV, "Failed to add broadcast MAC filter");
33 : 0 : goto l_end;
34 : : }
35 : :
36 : : ret = 0;
37 : 0 : l_end:
38 : 0 : return ret;
39 : : }
40 : :
41 : 0 : int32_t sxe2_mac_addr_init(struct rte_eth_dev *dev)
42 : : {
43 : 0 : struct sxe2_adapter *adapter = SXE2_DEV_PRIVATE_TO_ADAPTER(dev);
44 : 0 : int32_t ret = -1;
45 : 0 : PMD_INIT_FUNC_TRACE();
46 : :
47 : 0 : if (!rte_is_unicast_ether_addr
48 [ # # ]: 0 : ((struct rte_ether_addr *)adapter->dev_info.mac.perm_addr)) {
49 : 0 : PMD_DEV_LOG_ERR(adapter, DRV, "Invalid MAC address");
50 : 0 : ret = -EINVAL;
51 : 0 : goto l_end;
52 : : }
53 : :
54 : 0 : dev->data->mac_addrs = rte_zmalloc("sxe2_mac_adds",
55 : : sizeof(struct rte_ether_addr) * SXE2_NUM_MACADDR_MAX, 0);
56 [ # # ]: 0 : if (!dev->data->mac_addrs) {
57 : 0 : PMD_LOG_ERR(DRV, "Failed to allocate memory to store mac address");
58 : 0 : ret = -ENOMEM;
59 : 0 : goto l_end;
60 : : }
61 : :
62 : 0 : rte_ether_addr_copy((struct rte_ether_addr *)adapter->dev_info.mac.perm_addr,
63 : : &dev->data->mac_addrs[0]);
64 : :
65 : 0 : ret = 0;
66 : :
67 : 0 : l_end:
68 : 0 : return ret;
69 : : }
70 : :
71 : 0 : void sxe2_mac_addr_uinit(struct rte_eth_dev *dev)
72 : : {
73 : 0 : PMD_INIT_FUNC_TRACE();
74 [ # # # # ]: 0 : if (dev != NULL && dev->data->mac_addrs != NULL) {
75 : 0 : rte_free(dev->data->mac_addrs);
76 : 0 : dev->data->mac_addrs = NULL;
77 : : }
78 : 0 : }
79 : :
80 : 0 : int32_t sxe2_mac_addr_add(struct rte_eth_dev *dev, struct rte_ether_addr *mac_addr,
81 : : __rte_unused uint32_t index, __rte_unused uint32_t pool)
82 : : {
83 : 0 : struct sxe2_adapter *adapter = SXE2_DEV_PRIVATE_TO_ADAPTER(dev);
84 : 0 : int32_t ret = -1;
85 : :
86 [ # # ]: 0 : if (rte_is_zero_ether_addr(mac_addr)) {
87 : 0 : PMD_DEV_LOG_ERR(adapter, DRV, "Invalid MAC Address");
88 : 0 : ret = -EINVAL;
89 : 0 : goto l_end;
90 : : }
91 : :
92 [ # # ]: 0 : if (rte_is_multicast_ether_addr(mac_addr))
93 : 0 : ret = sxe2_mc_filter_add(adapter, mac_addr, true);
94 : : else
95 : 0 : ret = sxe2_uc_filter_add(adapter, mac_addr, false);
96 : :
97 [ # # ]: 0 : if (ret)
98 : 0 : PMD_DEV_LOG_ERR(adapter, DRV, "Failed to add MAC filter");
99 : :
100 : 0 : l_end:
101 : 0 : return ret;
102 : : }
103 : :
104 : 0 : void sxe2_mac_addr_del(struct rte_eth_dev *dev, uint32_t index)
105 : : {
106 : 0 : struct sxe2_adapter *adapter = SXE2_DEV_PRIVATE_TO_ADAPTER(dev);
107 : 0 : struct rte_ether_addr *mac_addr = &dev->data->mac_addrs[index];
108 : 0 : int32_t ret = -1;
109 : :
110 [ # # ]: 0 : if (rte_is_multicast_ether_addr(mac_addr))
111 : 0 : ret = sxe2_mc_filter_del(adapter, mac_addr);
112 : : else
113 : 0 : ret = sxe2_uc_filter_del(adapter, mac_addr);
114 : :
115 [ # # ]: 0 : if (ret)
116 : 0 : PMD_DEV_LOG_ERR(adapter, DRV, "Failed to remove MAC filter");
117 : 0 : }
118 : :
119 : 0 : int32_t sxe2_mac_addr_set(struct rte_eth_dev *dev, struct rte_ether_addr *mac_addr)
120 : : {
121 : 0 : struct sxe2_adapter *adapter = SXE2_DEV_PRIVATE_TO_ADAPTER(dev);
122 : 0 : int32_t ret = 0;
123 : 0 : struct rte_ether_addr *old_addr = (struct rte_ether_addr *)&adapter->dev_info.mac.perm_addr;
124 : 0 : struct rte_ether_addr temp_addr;
125 : :
126 [ # # ]: 0 : if (rte_is_same_ether_addr(old_addr, mac_addr))
127 : 0 : goto l_end;
128 : :
129 [ # # ]: 0 : if (rte_is_multicast_ether_addr(mac_addr)) {
130 : 0 : PMD_DEV_LOG_ERR(adapter, DRV, "Failed to set multicast addr");
131 : 0 : ret = -EINVAL;
132 : 0 : goto l_end;
133 : : }
134 : :
135 : 0 : ret = sxe2_uc_filter_del(adapter, old_addr);
136 [ # # ]: 0 : if (ret) {
137 : 0 : PMD_DEV_LOG_ERR(adapter, DRV, "Failed to remove MAC filter");
138 : 0 : goto l_end;
139 : : }
140 : :
141 : 0 : rte_ether_addr_copy(old_addr, &temp_addr);
142 : :
143 : 0 : rte_ether_addr_copy(mac_addr, old_addr);
144 : :
145 : 0 : ret = sxe2_uc_filter_add(adapter, mac_addr, true);
146 [ # # ]: 0 : if (ret) {
147 : 0 : PMD_DEV_LOG_ERR(adapter, DRV, "Failed to add MAC filter");
148 : 0 : rte_ether_addr_copy(&temp_addr, old_addr);
149 : 0 : (void)sxe2_uc_filter_add(adapter, old_addr, true);
150 : 0 : goto l_end;
151 : : }
152 : 0 : l_end:
153 : 0 : return ret;
154 : : }
155 : :
156 : 0 : int32_t sxe2_set_mc_addr_list(struct rte_eth_dev *dev,
157 : : struct rte_ether_addr *mc_addrs,
158 : : uint32_t mc_addrs_num)
159 : : {
160 : 0 : struct sxe2_adapter *adapter = SXE2_DEV_PRIVATE_TO_ADAPTER(dev);
161 : 0 : int32_t ret = 0;
162 : 0 : uint32_t i;
163 : 0 : const uint8_t *mac;
164 : :
165 [ # # ]: 0 : if (mc_addrs_num > SXE2_NUM_MACADDR_MAX) {
166 : 0 : PMD_DEV_LOG_ERR(adapter, DRV, "Too many multicast MAC addresses, ");
167 : 0 : ret = -1;
168 : 0 : goto l_end;
169 : : }
170 : :
171 : 0 : sxe2_mc_filter_clear(adapter, false);
172 : :
173 [ # # ]: 0 : for (i = 0; i < mc_addrs_num; i++) {
174 [ # # ]: 0 : if (!rte_is_multicast_ether_addr(&mc_addrs[i])) {
175 : 0 : mac = mc_addrs[i].addr_bytes;
176 : 0 : PMD_DEV_LOG_ERR(adapter, DRV,
177 : : "Invalid mac: %02x:%02x:%02x:%02x:%02x:%02x",
178 : : mac[0], mac[1], mac[2], mac[3], mac[4],
179 : : mac[5]);
180 : 0 : ret = -EINVAL;
181 : 0 : goto add_err;
182 : : }
183 : :
184 : 0 : ret = sxe2_mc_filter_add(adapter, &mc_addrs[i], false);
185 [ # # ]: 0 : if (ret) {
186 : 0 : PMD_DEV_LOG_ERR(adapter, DRV,
187 : : "Failed to remove old multicast MAC filter list");
188 : 0 : goto add_err;
189 : : }
190 : : }
191 : 0 : goto l_end;
192 : 0 : add_err:
193 : 0 : sxe2_mc_filter_clear(adapter, false);
194 : 0 : l_end:
195 : 0 : return ret;
196 : : }
197 : :
198 : 0 : int32_t sxe2_dev_vlan_filter_set(struct rte_eth_dev *dev, uint16_t vlan_id, int32_t on)
199 : : {
200 : 0 : struct sxe2_adapter *adapter = SXE2_DEV_PRIVATE_TO_ADAPTER(dev);
201 : 0 : struct sxe2_vlan vlan = {
202 : : .tpid = RTE_ETHER_TYPE_VLAN,
203 : : .vid = vlan_id,
204 : : .prio = 0
205 : : };
206 : 0 : int32_t ret = 0;
207 : :
208 [ # # ]: 0 : if (sxe2_dev_port_vlan_check(dev)) {
209 : 0 : PMD_DEV_LOG_ERR(adapter, DRV, "Filter not supported with Port VLAN");
210 : 0 : ret = -ENOTSUP;
211 : 0 : goto l_end;
212 : : }
213 : :
214 [ # # ]: 0 : if (vlan_id == 0)
215 : 0 : goto l_end;
216 : :
217 [ # # ]: 0 : if (on) {
218 : 0 : ret = sxe2_vlan_filter_add(adapter, &vlan, false);
219 [ # # ]: 0 : if (ret < 0) {
220 : 0 : PMD_DEV_LOG_ERR(adapter, DRV, "Failed to add vlan filter");
221 : 0 : goto l_end;
222 : : }
223 : : } else {
224 : 0 : ret = sxe2_vlan_filter_del(adapter, &vlan);
225 [ # # ]: 0 : if (ret < 0) {
226 : 0 : PMD_DEV_LOG_ERR(adapter, DRV, "Failed to remove vlan filter");
227 : 0 : goto l_end;
228 : : }
229 : : }
230 : :
231 : 0 : l_end:
232 : 0 : return ret;
233 : : }
234 : :
235 : 0 : int32_t sxe2_dev_vlan_offload_set(struct rte_eth_dev *dev, int32_t mask)
236 : : {
237 : 0 : struct sxe2_adapter *adapter = SXE2_DEV_PRIVATE_TO_ADAPTER(dev);
238 : 0 : int32_t ret = 0;
239 : 0 : struct rte_eth_rxmode *rxmode = &dev->data->dev_conf.rxmode;
240 : 0 : struct rte_eth_txmode *txmode = &dev->data->dev_conf.txmode;
241 : 0 : struct sxe2_vlan_info new_info = adapter->filter_ctxt.vlan_info;
242 : 0 : bool port_vlan = new_info.port_vlan_exist;
243 : :
244 : 0 : uint8_t out_strip_mask = SXE2_DPDK_OFFLOAD_OUTER_STRIP_8021Q |
245 : : SXE2_DPDK_OFFLOAD_OUTER_STRIP_8021AD |
246 : : SXE2_DPDK_OFFLOAD_OUTER_STRIP_QINQ1;
247 : :
248 [ # # ]: 0 : if (txmode->offloads & RTE_ETH_TX_OFFLOAD_QINQ_INSERT) {
249 [ # # ]: 0 : if (!(txmode->offloads & RTE_ETH_TX_OFFLOAD_VLAN_INSERT)) {
250 : 0 : PMD_DEV_LOG_ERR(adapter, DRV,
251 : : "VLAN INSERT must be enabled when QinQ INSERT is enabled");
252 : 0 : return -EINVAL;
253 : : }
254 [ # # ]: 0 : if (port_vlan) {
255 : 0 : PMD_DEV_LOG_ERR(adapter, DRV,
256 : : "QINQ INSERT not supported with Port VLAN");
257 : 0 : return -EINVAL;
258 : : }
259 : : }
260 : :
261 [ # # ]: 0 : if (mask & RTE_ETH_QINQ_STRIP_MASK) {
262 [ # # ]: 0 : if (rxmode->offloads & RTE_ETH_RX_OFFLOAD_QINQ_STRIP) {
263 [ # # ]: 0 : if (port_vlan) {
264 : 0 : PMD_DEV_LOG_ERR(adapter, DRV,
265 : : "QinQ strip not supported with Port VLAN");
266 : 0 : return -EINVAL;
267 : : }
268 : : new_info.inner_strip = SXE2_VSI_TSR_ID_VLAN;
269 : : } else {
270 : : new_info.inner_strip = 0;
271 : : }
272 : : }
273 : :
274 [ # # ]: 0 : if (mask & RTE_ETH_VLAN_STRIP_MASK) {
275 [ # # ]: 0 : if (rxmode->offloads & RTE_ETH_RX_OFFLOAD_VLAN_STRIP) {
276 [ # # ]: 0 : new_info.outer_strip =
277 : : port_vlan ? 0 : out_strip_mask;
278 : : new_info.inner_strip =
279 : : port_vlan ? new_info.inner_strip : new_info.inner_strip;
280 : : } else {
281 [ # # ]: 0 : if (new_info.inner_strip != 0) {
282 : 0 : PMD_DEV_LOG_ERR(adapter, DRV,
283 : : "Must disable QinQ strip before disabling VLAN strip");
284 : 0 : return -EINVAL;
285 : : }
286 : : new_info.outer_strip = 0;
287 : : }
288 : : }
289 : :
290 [ # # ]: 0 : if (mask & (RTE_ETH_VLAN_STRIP_MASK | RTE_ETH_QINQ_STRIP_MASK)) {
291 : 0 : struct sxe2_vlan_info old_info = adapter->filter_ctxt.vlan_info;
292 : 0 : adapter->filter_ctxt.vlan_info = new_info;
293 : :
294 : 0 : ret = sxe2_drv_vlan_insert_strip_cfg(adapter);
295 [ # # ]: 0 : if (ret) {
296 : 0 : adapter->filter_ctxt.vlan_info = old_info;
297 : 0 : return ret;
298 : : }
299 : : }
300 [ # # ]: 0 : if (mask & RTE_ETH_VLAN_FILTER_MASK) {
301 [ # # ]: 0 : if (adapter->filter_ctxt.vlan_info.port_vlan_exist) {
302 : 0 : ret = 0;
303 : 0 : PMD_DEV_LOG_INFO(adapter, INIT, "vlan filter is not support when port vlan is enabled");
304 : 0 : goto l_end;
305 : : }
306 : :
307 : 0 : ret = sxe2_vlan_filter_ctrl(adapter,
308 : 0 : !!(rxmode->offloads & RTE_ETH_RX_OFFLOAD_VLAN_FILTER));
309 [ # # ]: 0 : if (ret) {
310 : 0 : PMD_DEV_LOG_ERR(adapter, DRV,
311 : : "sxe2_drv_vlan_filter_switch failed ret:%d", ret);
312 : 0 : goto l_end;
313 : : }
314 : : }
315 : :
316 : 0 : PMD_DEV_LOG_DEBUG(adapter, DRV,
317 : : "mask:0x%x rx mode offload:0x%" PRIx64 " vlan offload set done",
318 : : mask, rxmode->offloads);
319 : : l_end:
320 : : return ret;
321 : : }
322 : :
323 : 0 : static int32_t sxe2_vlan_filter_zero(struct sxe2_adapter *adapter)
324 : : {
325 : 0 : struct sxe2_vlan vlan;
326 : 0 : int32_t ret;
327 : 0 : uint16_t tpids[] = {RTE_ETHER_TYPE_VLAN, RTE_ETHER_TYPE_QINQ, RTE_ETHER_TYPE_QINQ1};
328 : 0 : uint8_t i;
329 : :
330 : 0 : vlan = (struct sxe2_vlan){0, 0, 0};
331 : 0 : ret = sxe2_vlan_filter_add(adapter, &vlan, true);
332 [ # # ]: 0 : if (ret) {
333 : 0 : PMD_DEV_LOG_ERR(adapter, DRV, "Failed to add VLAN ID 0");
334 : 0 : goto l_end;
335 : : }
336 : :
337 [ # # ]: 0 : for (i = 0; i < RTE_DIM(tpids); i++) {
338 : 0 : vlan = (struct sxe2_vlan){tpids[i], 0, 0};
339 : 0 : ret = sxe2_vlan_filter_add(adapter, &vlan, true);
340 [ # # ]: 0 : if (ret) {
341 : 0 : PMD_DEV_LOG_ERR(adapter, DRV, "Failed to add VLAN ID 0 when tpid:0x%x",
342 : : tpids[i]);
343 : 0 : goto l_end;
344 : : }
345 : : }
346 : :
347 : 0 : l_end:
348 : 0 : return ret;
349 : : }
350 : :
351 : 0 : int32_t sxe2_vlan_cfg_init(struct rte_eth_dev *dev)
352 : : {
353 : 0 : struct sxe2_adapter *adapter = SXE2_DEV_PRIVATE_TO_ADAPTER(dev);
354 : 0 : int32_t ret = 0;
355 : :
356 : 0 : ret = sxe2_drv_vlan_config_query(adapter);
357 [ # # ]: 0 : if (ret) {
358 : 0 : PMD_DEV_LOG_ERR(adapter, DRV, "Failed to query vlan config, ret=%d", ret);
359 : 0 : goto l_end;
360 : : }
361 : :
362 [ # # ]: 0 : if (!sxe2_dev_port_vlan_check(dev))
363 : 0 : adapter->filter_ctxt.vlan_info.outer_insert =
364 : : SXE2_DPDK_OFFLOAD_OUTER_INSERT_8021Q |
365 : : SXE2_DPDK_OFFLOAD_INSERT_ENABLE;
366 : : else
367 : 0 : adapter->filter_ctxt.vlan_info.outer_insert = 0;
368 : :
369 : 0 : adapter->filter_ctxt.vlan_info.inner_insert =
370 : : SXE2_DPDK_OFFLOAD_INNER_INSERT_QINQ1 | SXE2_DPDK_OFFLOAD_INSERT_ENABLE;
371 : :
372 [ # # ]: 0 : if (!sxe2_dev_port_vlan_check(dev)) {
373 : 0 : ret = sxe2_vlan_filter_zero(adapter);
374 [ # # ]: 0 : if (ret != 0)
375 : 0 : PMD_DEV_LOG_ERR(adapter, DRV, "Failed to add vlan filter switch:0 "
376 : : "for port:%d", adapter->port_idx);
377 : : }
378 : :
379 : 0 : l_end:
380 : 0 : return ret;
381 : : }
382 : :
383 : 0 : int32_t sxe2_vlan_default_cfg(struct rte_eth_dev *dev)
384 : : {
385 : 0 : int32_t ret = 0;
386 : 0 : struct sxe2_adapter *adapter = SXE2_DEV_PRIVATE_TO_ADAPTER(dev);
387 : :
388 : 0 : ret = sxe2_dev_vlan_offload_set(dev, RTE_ETH_VLAN_STRIP_MASK |
389 : : RTE_ETH_QINQ_STRIP_MASK |
390 : : RTE_ETH_VLAN_FILTER_MASK);
391 [ # # ]: 0 : if (ret)
392 : 0 : PMD_DEV_LOG_ERR(adapter, DRV, "Failed to cfg vlan offload, ret:%d", ret);
393 : :
394 : 0 : return ret;
395 : : }
396 : :
397 : 0 : int32_t sxe2_promisc_enable(struct rte_eth_dev *dev)
398 : : {
399 : 0 : struct sxe2_adapter *adapter = SXE2_DEV_PRIVATE_TO_ADAPTER(dev);
400 : 0 : int32_t ret = 0;
401 : :
402 : 0 : ret = sxe2_promisc_add(adapter);
403 [ # # ]: 0 : if (ret)
404 : 0 : PMD_DEV_LOG_ERR(adapter, DRV, "Failed to enable promisc, ret:%d", ret);
405 : :
406 : 0 : return ret;
407 : : }
408 : :
409 : 0 : int32_t sxe2_promisc_disable(struct rte_eth_dev *dev)
410 : : {
411 : 0 : struct sxe2_adapter *adapter = SXE2_DEV_PRIVATE_TO_ADAPTER(dev);
412 : 0 : int32_t ret = 0;
413 : :
414 : 0 : ret = sxe2_promisc_del(adapter);
415 [ # # ]: 0 : if (ret)
416 : 0 : PMD_DEV_LOG_ERR(adapter, DRV, "Failed to disable promisc, ret:%d", ret);
417 : :
418 : 0 : return ret;
419 : : }
420 : :
421 : 0 : int32_t sxe2_allmulti_enable(struct rte_eth_dev *dev)
422 : : {
423 : 0 : struct sxe2_adapter *adapter = SXE2_DEV_PRIVATE_TO_ADAPTER(dev);
424 : 0 : int32_t ret = 0;
425 : :
426 : 0 : ret = sxe2_allmulti_add(adapter);
427 [ # # ]: 0 : if (ret)
428 : 0 : PMD_DEV_LOG_ERR(adapter, DRV, "Failed to enable allmulti, ret:%d", ret);
429 : :
430 : 0 : return ret;
431 : : }
432 : :
433 : 0 : int32_t sxe2_allmulti_disable(struct rte_eth_dev *dev)
434 : : {
435 : 0 : struct sxe2_adapter *adapter = SXE2_DEV_PRIVATE_TO_ADAPTER(dev);
436 : 0 : int32_t ret = 0;
437 : :
438 : 0 : ret = sxe2_allmulti_del(adapter);
439 [ # # ]: 0 : if (ret)
440 : 0 : PMD_DEV_LOG_ERR(adapter, DRV, "Failed to disable allmulti, ret:%d", ret);
441 : :
442 : 0 : return ret;
443 : : }
444 : :
445 : 0 : int32_t sxe2_link_update_init(struct rte_eth_dev *dev)
446 : : {
447 : 0 : struct sxe2_adapter *adapter = SXE2_DEV_PRIVATE_TO_ADAPTER(dev);
448 : 0 : int32_t ret;
449 : :
450 : 0 : PMD_INIT_FUNC_TRACE();
451 : :
452 : 0 : rte_spinlock_init(&adapter->link_ctxt.link_lock);
453 : :
454 : 0 : ret = sxe2_drv_mac_link_status_get(adapter);
455 [ # # ]: 0 : if (ret) {
456 : 0 : PMD_DEV_LOG_ERR(adapter, DRV, "Failed to get link status, ret=%d", ret);
457 : 0 : goto l_end;
458 : : }
459 : :
460 : 0 : (void)sxe2_link_update(dev, 0);
461 : :
462 : 0 : l_end:
463 : 0 : return ret;
464 : : }
465 : 0 : int32_t sxe2_link_update(struct rte_eth_dev *dev, __rte_unused int32_t wait_to_complete)
466 : : {
467 : 0 : struct rte_eth_link new_link;
468 : 0 : struct sxe2_adapter *adapter = SXE2_DEV_PRIVATE_TO_ADAPTER(dev);
469 : :
470 [ # # # # : 0 : memset(&new_link, 0, sizeof(new_link));
# # # # #
# ]
471 : :
472 [ # # # # : 0 : switch (adapter->link_ctxt.speed) {
# # # # #
# ]
473 : : case 0:
474 : : new_link.link_speed = RTE_ETH_SPEED_NUM_NONE;
475 : : break;
476 : 0 : case 10:
477 : 0 : new_link.link_speed = RTE_ETH_SPEED_NUM_10M;
478 : 0 : break;
479 : 0 : case 100:
480 : 0 : new_link.link_speed = RTE_ETH_SPEED_NUM_100M;
481 : 0 : break;
482 : 0 : case 1000:
483 : 0 : new_link.link_speed = RTE_ETH_SPEED_NUM_1G;
484 : 0 : break;
485 : 0 : case 10000:
486 : 0 : new_link.link_speed = RTE_ETH_SPEED_NUM_10G;
487 : 0 : break;
488 : 0 : case 20000:
489 : 0 : new_link.link_speed = RTE_ETH_SPEED_NUM_20G;
490 : 0 : break;
491 : 0 : case 25000:
492 : 0 : new_link.link_speed = RTE_ETH_SPEED_NUM_25G;
493 : 0 : break;
494 : 0 : case 40000:
495 : 0 : new_link.link_speed = RTE_ETH_SPEED_NUM_40G;
496 : 0 : break;
497 : 0 : case 50000:
498 : 0 : new_link.link_speed = RTE_ETH_SPEED_NUM_50G;
499 : 0 : break;
500 : 0 : case 100000:
501 : 0 : new_link.link_speed = RTE_ETH_SPEED_NUM_100G;
502 : 0 : break;
503 : : default:
504 : : new_link.link_speed = RTE_ETH_SPEED_NUM_NONE;
505 : : break;
506 : : }
507 : :
508 : 0 : new_link.link_duplex = RTE_ETH_LINK_FULL_DUPLEX;
509 : 0 : new_link.link_status = adapter->link_ctxt.link_up ? RTE_ETH_LINK_UP :
510 : : RTE_ETH_LINK_DOWN;
511 : 0 : new_link.link_autoneg = !(dev->data->dev_conf.link_speeds &
512 : : RTE_ETH_LINK_SPEED_FIXED);
513 : :
514 [ # # ]: 0 : return rte_eth_linkstatus_set(dev, &new_link);
515 : : }
516 : :
517 : 0 : int32_t sxe2_mtu_set(struct rte_eth_dev *dev, uint16_t mtu __rte_unused)
518 : : {
519 : 0 : struct sxe2_adapter *adapter = SXE2_DEV_PRIVATE_TO_ADAPTER(dev);
520 : :
521 : 0 : PMD_INIT_FUNC_TRACE();
522 : :
523 [ # # ]: 0 : if (dev->data->dev_started != 0) {
524 : 0 : PMD_DEV_LOG_ERR(adapter, DRV, "port %d must be stopped before configuration",
525 : : dev->data->port_id);
526 : 0 : return -EBUSY;
527 : : }
528 : :
529 : : return 0;
530 : : }
|