xref: /dpdk/drivers/net/sfc/sfc.c (revision 97b914f4e715565d53d38ac6e04815b9be5e58a9)
1 /* SPDX-License-Identifier: BSD-3-Clause
2  *
3  * Copyright(c) 2019-2021 Xilinx, Inc.
4  * Copyright(c) 2016-2019 Solarflare Communications Inc.
5  *
6  * This software was jointly developed between OKTET Labs (under contract
7  * for Solarflare) and Solarflare Communications, Inc.
8  */
9 
10 /* sysconf() */
11 #include <unistd.h>
12 
13 #include <rte_errno.h>
14 #include <rte_alarm.h>
15 
16 #include "efx.h"
17 
18 #include "sfc.h"
19 #include "sfc_debug.h"
20 #include "sfc_log.h"
21 #include "sfc_ev.h"
22 #include "sfc_rx.h"
23 #include "sfc_mae_counter.h"
24 #include "sfc_tx.h"
25 #include "sfc_kvargs.h"
26 #include "sfc_tweak.h"
27 #include "sfc_sw_stats.h"
28 #include "sfc_switch.h"
29 #include "sfc_nic_dma.h"
30 
31 bool
32 sfc_repr_supported(const struct sfc_adapter *sa)
33 {
34 	if (!sa->switchdev)
35 		return false;
36 
37 	/*
38 	 * Representor proxy should use service lcore on PF's socket
39 	 * (sa->socket_id) to be efficient. But the proxy will fall back
40 	 * to any socket if it is not possible to get the service core
41 	 * on the same socket. Check that at least service core on any
42 	 * socket is available.
43 	 */
44 	if (sfc_get_service_lcore(SOCKET_ID_ANY) == RTE_MAX_LCORE)
45 		return false;
46 
47 	return true;
48 }
49 
50 bool
51 sfc_repr_available(const struct sfc_adapter_shared *sas)
52 {
53 	return sas->nb_repr_rxq > 0 && sas->nb_repr_txq > 0;
54 }
55 
56 int
57 sfc_dma_alloc(struct sfc_adapter *sa, const char *name, uint16_t id,
58 	      efx_nic_dma_addr_type_t addr_type, size_t len, int socket_id,
59 	      efsys_mem_t *esmp)
60 {
61 	const struct rte_memzone *mz;
62 	int rc;
63 
64 	sfc_log_init(sa, "name=%s id=%u len=%zu socket_id=%d",
65 		     name, id, len, socket_id);
66 
67 	mz = rte_eth_dma_zone_reserve(sa->eth_dev, name, id, len,
68 				      sysconf(_SC_PAGESIZE), socket_id);
69 	if (mz == NULL) {
70 		sfc_err(sa, "cannot reserve DMA zone for %s:%u %#x@%d: %s",
71 			name, (unsigned int)id, (unsigned int)len, socket_id,
72 			rte_strerror(rte_errno));
73 		return ENOMEM;
74 	}
75 	if (mz->iova == RTE_BAD_IOVA) {
76 		(void)rte_memzone_free(mz);
77 		return EFAULT;
78 	}
79 
80 	rc = sfc_nic_dma_mz_map(sa, mz, addr_type, &esmp->esm_addr);
81 	if (rc != 0) {
82 		(void)rte_memzone_free(mz);
83 		return rc;
84 	}
85 
86 	esmp->esm_mz = mz;
87 	esmp->esm_base = mz->addr;
88 
89 	sfc_info(sa,
90 		 "DMA name=%s id=%u len=%lu socket_id=%d => virt=%p iova=%lx",
91 		 name, id, len, socket_id, esmp->esm_base,
92 		 (unsigned long)esmp->esm_addr);
93 
94 	return 0;
95 }
96 
97 void
98 sfc_dma_free(const struct sfc_adapter *sa, efsys_mem_t *esmp)
99 {
100 	int rc;
101 
102 	sfc_log_init(sa, "name=%s", esmp->esm_mz->name);
103 
104 	rc = rte_memzone_free(esmp->esm_mz);
105 	if (rc != 0)
106 		sfc_err(sa, "rte_memzone_free(() failed: %d", rc);
107 
108 	memset(esmp, 0, sizeof(*esmp));
109 }
110 
111 static uint32_t
112 sfc_phy_cap_from_link_speeds(uint32_t speeds)
113 {
114 	uint32_t phy_caps = 0;
115 
116 	if (~speeds & RTE_ETH_LINK_SPEED_FIXED) {
117 		phy_caps |= (1 << EFX_PHY_CAP_AN);
118 		/*
119 		 * If no speeds are specified in the mask, any supported
120 		 * may be negotiated
121 		 */
122 		if (speeds == RTE_ETH_LINK_SPEED_AUTONEG)
123 			phy_caps |=
124 				(1 << EFX_PHY_CAP_1000FDX) |
125 				(1 << EFX_PHY_CAP_10000FDX) |
126 				(1 << EFX_PHY_CAP_25000FDX) |
127 				(1 << EFX_PHY_CAP_40000FDX) |
128 				(1 << EFX_PHY_CAP_50000FDX) |
129 				(1 << EFX_PHY_CAP_100000FDX);
130 	}
131 	if (speeds & RTE_ETH_LINK_SPEED_1G)
132 		phy_caps |= (1 << EFX_PHY_CAP_1000FDX);
133 	if (speeds & RTE_ETH_LINK_SPEED_10G)
134 		phy_caps |= (1 << EFX_PHY_CAP_10000FDX);
135 	if (speeds & RTE_ETH_LINK_SPEED_25G)
136 		phy_caps |= (1 << EFX_PHY_CAP_25000FDX);
137 	if (speeds & RTE_ETH_LINK_SPEED_40G)
138 		phy_caps |= (1 << EFX_PHY_CAP_40000FDX);
139 	if (speeds & RTE_ETH_LINK_SPEED_50G)
140 		phy_caps |= (1 << EFX_PHY_CAP_50000FDX);
141 	if (speeds & RTE_ETH_LINK_SPEED_100G)
142 		phy_caps |= (1 << EFX_PHY_CAP_100000FDX);
143 
144 	return phy_caps;
145 }
146 
147 /*
148  * Check requested device level configuration.
149  * Receive and transmit configuration is checked in corresponding
150  * modules.
151  */
152 static int
153 sfc_check_conf(struct sfc_adapter *sa)
154 {
155 	const struct rte_eth_conf *conf = &sa->eth_dev->data->dev_conf;
156 	int rc = 0;
157 
158 	sa->port.phy_adv_cap =
159 		sfc_phy_cap_from_link_speeds(conf->link_speeds) &
160 		sa->port.phy_adv_cap_mask;
161 	if ((sa->port.phy_adv_cap & ~(1 << EFX_PHY_CAP_AN)) == 0) {
162 		sfc_err(sa, "No link speeds from mask %#x are supported",
163 			conf->link_speeds);
164 		rc = EINVAL;
165 	}
166 
167 #if !EFSYS_OPT_LOOPBACK
168 	if (conf->lpbk_mode != 0) {
169 		sfc_err(sa, "Loopback not supported");
170 		rc = EINVAL;
171 	}
172 #endif
173 
174 	if (conf->dcb_capability_en != 0) {
175 		sfc_err(sa, "Priority-based flow control not supported");
176 		rc = EINVAL;
177 	}
178 
179 	if (conf->fdir_conf.mode != RTE_FDIR_MODE_NONE) {
180 		sfc_err(sa, "Flow Director not supported");
181 		rc = EINVAL;
182 	}
183 
184 	if ((conf->intr_conf.lsc != 0) &&
185 	    (sa->intr.type != EFX_INTR_LINE) &&
186 	    (sa->intr.type != EFX_INTR_MESSAGE)) {
187 		sfc_err(sa, "Link status change interrupt not supported");
188 		rc = EINVAL;
189 	}
190 
191 	if (conf->intr_conf.rxq != 0 &&
192 	    (sa->priv.dp_rx->features & SFC_DP_RX_FEAT_INTR) == 0) {
193 		sfc_err(sa, "Receive queue interrupt not supported");
194 		rc = EINVAL;
195 	}
196 
197 	return rc;
198 }
199 
200 /*
201  * Find out maximum number of receive and transmit queues which could be
202  * advertised.
203  *
204  * NIC is kept initialized on success to allow other modules acquire
205  * defaults and capabilities.
206  */
207 static int
208 sfc_estimate_resource_limits(struct sfc_adapter *sa)
209 {
210 	const efx_nic_cfg_t *encp = efx_nic_cfg_get(sa->nic);
211 	struct sfc_adapter_shared *sas = sfc_sa2shared(sa);
212 	efx_drv_limits_t limits;
213 	int rc;
214 	uint32_t evq_allocated;
215 	uint32_t rxq_allocated;
216 	uint32_t txq_allocated;
217 
218 	memset(&limits, 0, sizeof(limits));
219 
220 	/* Request at least one Rx and Tx queue */
221 	limits.edl_min_rxq_count = 1;
222 	limits.edl_min_txq_count = 1;
223 	/* Management event queue plus event queue for each Tx and Rx queue */
224 	limits.edl_min_evq_count =
225 		1 + limits.edl_min_rxq_count + limits.edl_min_txq_count;
226 
227 	/* Divide by number of functions to guarantee that all functions
228 	 * will get promised resources
229 	 */
230 	/* FIXME Divide by number of functions (not 2) below */
231 	limits.edl_max_evq_count = encp->enc_evq_limit / 2;
232 	SFC_ASSERT(limits.edl_max_evq_count >= limits.edl_min_rxq_count);
233 
234 	/* Split equally between receive and transmit */
235 	limits.edl_max_rxq_count =
236 		MIN(encp->enc_rxq_limit, (limits.edl_max_evq_count - 1) / 2);
237 	SFC_ASSERT(limits.edl_max_rxq_count >= limits.edl_min_rxq_count);
238 
239 	limits.edl_max_txq_count =
240 		MIN(encp->enc_txq_limit,
241 		    limits.edl_max_evq_count - 1 - limits.edl_max_rxq_count);
242 
243 	if (sa->tso && encp->enc_fw_assisted_tso_v2_enabled)
244 		limits.edl_max_txq_count =
245 			MIN(limits.edl_max_txq_count,
246 			    encp->enc_fw_assisted_tso_v2_n_contexts /
247 			    encp->enc_hw_pf_count);
248 
249 	SFC_ASSERT(limits.edl_max_txq_count >= limits.edl_min_rxq_count);
250 
251 	/* Configure the minimum required resources needed for the
252 	 * driver to operate, and the maximum desired resources that the
253 	 * driver is capable of using.
254 	 */
255 	efx_nic_set_drv_limits(sa->nic, &limits);
256 
257 	sfc_log_init(sa, "init nic");
258 	rc = efx_nic_init(sa->nic);
259 	if (rc != 0)
260 		goto fail_nic_init;
261 
262 	/* Find resource dimensions assigned by firmware to this function */
263 	rc = efx_nic_get_vi_pool(sa->nic, &evq_allocated, &rxq_allocated,
264 				 &txq_allocated);
265 	if (rc != 0)
266 		goto fail_get_vi_pool;
267 
268 	/* It still may allocate more than maximum, ensure limit */
269 	evq_allocated = MIN(evq_allocated, limits.edl_max_evq_count);
270 	rxq_allocated = MIN(rxq_allocated, limits.edl_max_rxq_count);
271 	txq_allocated = MIN(txq_allocated, limits.edl_max_txq_count);
272 
273 	/*
274 	 * Subtract management EVQ not used for traffic
275 	 * The resource allocation strategy is as follows:
276 	 * - one EVQ for management
277 	 * - one EVQ for each ethdev RXQ
278 	 * - one EVQ for each ethdev TXQ
279 	 * - one EVQ and one RXQ for optional MAE counters.
280 	 */
281 	if (evq_allocated == 0) {
282 		sfc_err(sa, "count of allocated EvQ is 0");
283 		rc = ENOMEM;
284 		goto fail_allocate_evq;
285 	}
286 	evq_allocated--;
287 
288 	/*
289 	 * Reserve absolutely required minimum.
290 	 * Right now we use separate EVQ for Rx and Tx.
291 	 */
292 	if (rxq_allocated > 0 && evq_allocated > 0) {
293 		sa->rxq_max = 1;
294 		rxq_allocated--;
295 		evq_allocated--;
296 	}
297 	if (txq_allocated > 0 && evq_allocated > 0) {
298 		sa->txq_max = 1;
299 		txq_allocated--;
300 		evq_allocated--;
301 	}
302 
303 	if (sfc_mae_counter_rxq_required(sa) &&
304 	    rxq_allocated > 0 && evq_allocated > 0) {
305 		rxq_allocated--;
306 		evq_allocated--;
307 		sas->counters_rxq_allocated = true;
308 	} else {
309 		sas->counters_rxq_allocated = false;
310 	}
311 
312 	if (sfc_repr_supported(sa) &&
313 	    evq_allocated >= SFC_REPR_PROXY_NB_RXQ_MIN +
314 	    SFC_REPR_PROXY_NB_TXQ_MIN &&
315 	    rxq_allocated >= SFC_REPR_PROXY_NB_RXQ_MIN &&
316 	    txq_allocated >= SFC_REPR_PROXY_NB_TXQ_MIN) {
317 		unsigned int extra;
318 
319 		txq_allocated -= SFC_REPR_PROXY_NB_TXQ_MIN;
320 		rxq_allocated -= SFC_REPR_PROXY_NB_RXQ_MIN;
321 		evq_allocated -= SFC_REPR_PROXY_NB_RXQ_MIN +
322 			SFC_REPR_PROXY_NB_TXQ_MIN;
323 
324 		sas->nb_repr_rxq = SFC_REPR_PROXY_NB_RXQ_MIN;
325 		sas->nb_repr_txq = SFC_REPR_PROXY_NB_TXQ_MIN;
326 
327 		/* Allocate extra representor RxQs up to the maximum */
328 		extra = MIN(evq_allocated, rxq_allocated);
329 		extra = MIN(extra,
330 			    SFC_REPR_PROXY_NB_RXQ_MAX - sas->nb_repr_rxq);
331 		evq_allocated -= extra;
332 		rxq_allocated -= extra;
333 		sas->nb_repr_rxq += extra;
334 
335 		/* Allocate extra representor TxQs up to the maximum */
336 		extra = MIN(evq_allocated, txq_allocated);
337 		extra = MIN(extra,
338 			    SFC_REPR_PROXY_NB_TXQ_MAX - sas->nb_repr_txq);
339 		evq_allocated -= extra;
340 		txq_allocated -= extra;
341 		sas->nb_repr_txq += extra;
342 	} else {
343 		sas->nb_repr_rxq = 0;
344 		sas->nb_repr_txq = 0;
345 	}
346 
347 	/* Add remaining allocated queues */
348 	sa->rxq_max += MIN(rxq_allocated, evq_allocated / 2);
349 	sa->txq_max += MIN(txq_allocated, evq_allocated - sa->rxq_max);
350 
351 	/* Keep NIC initialized */
352 	return 0;
353 
354 fail_allocate_evq:
355 fail_get_vi_pool:
356 	efx_nic_fini(sa->nic);
357 fail_nic_init:
358 	return rc;
359 }
360 
361 static int
362 sfc_set_drv_limits(struct sfc_adapter *sa)
363 {
364 	struct sfc_adapter_shared *sas = sfc_sa2shared(sa);
365 	const struct rte_eth_dev_data *data = sa->eth_dev->data;
366 	uint32_t rxq_reserved = sfc_nb_reserved_rxq(sas);
367 	uint32_t txq_reserved = sfc_nb_txq_reserved(sas);
368 	efx_drv_limits_t lim;
369 
370 	memset(&lim, 0, sizeof(lim));
371 
372 	/*
373 	 * Limits are strict since take into account initial estimation.
374 	 * Resource allocation strategy is described in
375 	 * sfc_estimate_resource_limits().
376 	 */
377 	lim.edl_min_evq_count = lim.edl_max_evq_count =
378 		1 + data->nb_rx_queues + data->nb_tx_queues +
379 		rxq_reserved + txq_reserved;
380 	lim.edl_min_rxq_count = lim.edl_max_rxq_count =
381 		data->nb_rx_queues + rxq_reserved;
382 	lim.edl_min_txq_count = lim.edl_max_txq_count =
383 		data->nb_tx_queues + txq_reserved;
384 
385 	return efx_nic_set_drv_limits(sa->nic, &lim);
386 }
387 
388 static int
389 sfc_set_fw_subvariant(struct sfc_adapter *sa)
390 {
391 	struct sfc_adapter_shared *sas = sfc_sa2shared(sa);
392 	const efx_nic_cfg_t *encp = efx_nic_cfg_get(sa->nic);
393 	uint64_t tx_offloads = sa->eth_dev->data->dev_conf.txmode.offloads;
394 	unsigned int txq_index;
395 	efx_nic_fw_subvariant_t req_fw_subvariant;
396 	efx_nic_fw_subvariant_t cur_fw_subvariant;
397 	int rc;
398 
399 	if (!encp->enc_fw_subvariant_no_tx_csum_supported) {
400 		sfc_info(sa, "no-Tx-checksum subvariant not supported");
401 		return 0;
402 	}
403 
404 	for (txq_index = 0; txq_index < sas->txq_count; ++txq_index) {
405 		struct sfc_txq_info *txq_info = &sas->txq_info[txq_index];
406 
407 		if (txq_info->state & SFC_TXQ_INITIALIZED)
408 			tx_offloads |= txq_info->offloads;
409 	}
410 
411 	if (tx_offloads & (RTE_ETH_TX_OFFLOAD_IPV4_CKSUM |
412 			   RTE_ETH_TX_OFFLOAD_TCP_CKSUM |
413 			   RTE_ETH_TX_OFFLOAD_UDP_CKSUM |
414 			   RTE_ETH_TX_OFFLOAD_OUTER_IPV4_CKSUM))
415 		req_fw_subvariant = EFX_NIC_FW_SUBVARIANT_DEFAULT;
416 	else
417 		req_fw_subvariant = EFX_NIC_FW_SUBVARIANT_NO_TX_CSUM;
418 
419 	rc = efx_nic_get_fw_subvariant(sa->nic, &cur_fw_subvariant);
420 	if (rc != 0) {
421 		sfc_err(sa, "failed to get FW subvariant: %d", rc);
422 		return rc;
423 	}
424 	sfc_info(sa, "FW subvariant is %u vs required %u",
425 		 cur_fw_subvariant, req_fw_subvariant);
426 
427 	if (cur_fw_subvariant == req_fw_subvariant)
428 		return 0;
429 
430 	rc = efx_nic_set_fw_subvariant(sa->nic, req_fw_subvariant);
431 	if (rc != 0) {
432 		sfc_err(sa, "failed to set FW subvariant %u: %d",
433 			req_fw_subvariant, rc);
434 		return rc;
435 	}
436 	sfc_info(sa, "FW subvariant set to %u", req_fw_subvariant);
437 
438 	return 0;
439 }
440 
441 static int
442 sfc_try_start(struct sfc_adapter *sa)
443 {
444 	const efx_nic_cfg_t *encp;
445 	int rc;
446 
447 	sfc_log_init(sa, "entry");
448 
449 	SFC_ASSERT(sfc_adapter_is_locked(sa));
450 	SFC_ASSERT(sa->state == SFC_ETHDEV_STARTING);
451 
452 	sfc_log_init(sa, "set FW subvariant");
453 	rc = sfc_set_fw_subvariant(sa);
454 	if (rc != 0)
455 		goto fail_set_fw_subvariant;
456 
457 	sfc_log_init(sa, "set resource limits");
458 	rc = sfc_set_drv_limits(sa);
459 	if (rc != 0)
460 		goto fail_set_drv_limits;
461 
462 	sfc_log_init(sa, "init nic");
463 	rc = efx_nic_init(sa->nic);
464 	if (rc != 0)
465 		goto fail_nic_init;
466 
467 	sfc_log_init(sa, "reconfigure NIC DMA");
468 	rc = efx_nic_dma_reconfigure(sa->nic);
469 	if (rc != 0) {
470 		sfc_err(sa, "cannot reconfigure NIC DMA: %s", rte_strerror(rc));
471 		goto fail_nic_dma_reconfigure;
472 	}
473 
474 	encp = efx_nic_cfg_get(sa->nic);
475 
476 	/*
477 	 * Refresh (since it may change on NIC reset/restart) a copy of
478 	 * supported tunnel encapsulations in shared memory to be used
479 	 * on supported Rx packet type classes get.
480 	 */
481 	sa->priv.shared->tunnel_encaps =
482 		encp->enc_tunnel_encapsulations_supported;
483 
484 	if (encp->enc_tunnel_encapsulations_supported != 0) {
485 		sfc_log_init(sa, "apply tunnel config");
486 		rc = efx_tunnel_reconfigure(sa->nic);
487 		if (rc != 0)
488 			goto fail_tunnel_reconfigure;
489 	}
490 
491 	rc = sfc_intr_start(sa);
492 	if (rc != 0)
493 		goto fail_intr_start;
494 
495 	rc = sfc_ev_start(sa);
496 	if (rc != 0)
497 		goto fail_ev_start;
498 
499 	rc = sfc_port_start(sa);
500 	if (rc != 0)
501 		goto fail_port_start;
502 
503 	rc = sfc_rx_start(sa);
504 	if (rc != 0)
505 		goto fail_rx_start;
506 
507 	rc = sfc_tx_start(sa);
508 	if (rc != 0)
509 		goto fail_tx_start;
510 
511 	rc = sfc_flow_start(sa);
512 	if (rc != 0)
513 		goto fail_flows_insert;
514 
515 	rc = sfc_repr_proxy_start(sa);
516 	if (rc != 0)
517 		goto fail_repr_proxy_start;
518 
519 	sfc_log_init(sa, "done");
520 	return 0;
521 
522 fail_repr_proxy_start:
523 	sfc_flow_stop(sa);
524 
525 fail_flows_insert:
526 	sfc_tx_stop(sa);
527 
528 fail_tx_start:
529 	sfc_rx_stop(sa);
530 
531 fail_rx_start:
532 	sfc_port_stop(sa);
533 
534 fail_port_start:
535 	sfc_ev_stop(sa);
536 
537 fail_ev_start:
538 	sfc_intr_stop(sa);
539 
540 fail_intr_start:
541 fail_tunnel_reconfigure:
542 fail_nic_dma_reconfigure:
543 	efx_nic_fini(sa->nic);
544 
545 fail_nic_init:
546 fail_set_drv_limits:
547 fail_set_fw_subvariant:
548 	sfc_log_init(sa, "failed %d", rc);
549 	return rc;
550 }
551 
552 int
553 sfc_start(struct sfc_adapter *sa)
554 {
555 	unsigned int start_tries = 3;
556 	int rc;
557 
558 	sfc_log_init(sa, "entry");
559 
560 	SFC_ASSERT(sfc_adapter_is_locked(sa));
561 
562 	switch (sa->state) {
563 	case SFC_ETHDEV_CONFIGURED:
564 		break;
565 	case SFC_ETHDEV_STARTED:
566 		sfc_notice(sa, "already started");
567 		return 0;
568 	default:
569 		rc = EINVAL;
570 		goto fail_bad_state;
571 	}
572 
573 	sa->state = SFC_ETHDEV_STARTING;
574 
575 	rc = 0;
576 	do {
577 		/*
578 		 * FIXME Try to recreate vSwitch on start retry.
579 		 * vSwitch is absent after MC reboot like events and
580 		 * we should recreate it. May be we need proper
581 		 * indication instead of guessing.
582 		 */
583 		if (rc != 0) {
584 			sfc_sriov_vswitch_destroy(sa);
585 			rc = sfc_sriov_vswitch_create(sa);
586 			if (rc != 0)
587 				goto fail_sriov_vswitch_create;
588 		}
589 		rc = sfc_try_start(sa);
590 	} while ((--start_tries > 0) &&
591 		 (rc == EIO || rc == EAGAIN || rc == ENOENT || rc == EINVAL));
592 
593 	if (rc != 0)
594 		goto fail_try_start;
595 
596 	sa->state = SFC_ETHDEV_STARTED;
597 	sfc_log_init(sa, "done");
598 	return 0;
599 
600 fail_try_start:
601 fail_sriov_vswitch_create:
602 	sa->state = SFC_ETHDEV_CONFIGURED;
603 fail_bad_state:
604 	sfc_log_init(sa, "failed %d", rc);
605 	return rc;
606 }
607 
608 void
609 sfc_stop(struct sfc_adapter *sa)
610 {
611 	sfc_log_init(sa, "entry");
612 
613 	SFC_ASSERT(sfc_adapter_is_locked(sa));
614 
615 	switch (sa->state) {
616 	case SFC_ETHDEV_STARTED:
617 		break;
618 	case SFC_ETHDEV_CONFIGURED:
619 		sfc_notice(sa, "already stopped");
620 		return;
621 	default:
622 		sfc_err(sa, "stop in unexpected state %u", sa->state);
623 		SFC_ASSERT(B_FALSE);
624 		return;
625 	}
626 
627 	sa->state = SFC_ETHDEV_STOPPING;
628 
629 	sfc_repr_proxy_stop(sa);
630 	sfc_flow_stop(sa);
631 	sfc_tx_stop(sa);
632 	sfc_rx_stop(sa);
633 	sfc_port_stop(sa);
634 	sfc_ev_stop(sa);
635 	sfc_intr_stop(sa);
636 	efx_nic_fini(sa->nic);
637 
638 	sa->state = SFC_ETHDEV_CONFIGURED;
639 	sfc_log_init(sa, "done");
640 }
641 
642 static int
643 sfc_restart(struct sfc_adapter *sa)
644 {
645 	int rc;
646 
647 	SFC_ASSERT(sfc_adapter_is_locked(sa));
648 
649 	if (sa->state != SFC_ETHDEV_STARTED)
650 		return EINVAL;
651 
652 	sfc_stop(sa);
653 
654 	rc = sfc_start(sa);
655 	if (rc != 0)
656 		sfc_err(sa, "restart failed");
657 
658 	return rc;
659 }
660 
661 static void
662 sfc_restart_if_required(void *arg)
663 {
664 	struct sfc_adapter *sa = arg;
665 
666 	/* If restart is scheduled, clear the flag and do it */
667 	if (rte_atomic32_cmpset((volatile uint32_t *)&sa->restart_required,
668 				1, 0)) {
669 		sfc_adapter_lock(sa);
670 		if (sa->state == SFC_ETHDEV_STARTED)
671 			(void)sfc_restart(sa);
672 		sfc_adapter_unlock(sa);
673 	}
674 }
675 
676 void
677 sfc_schedule_restart(struct sfc_adapter *sa)
678 {
679 	int rc;
680 
681 	/* Schedule restart alarm if it is not scheduled yet */
682 	if (!rte_atomic32_test_and_set(&sa->restart_required))
683 		return;
684 
685 	rc = rte_eal_alarm_set(1, sfc_restart_if_required, sa);
686 	if (rc == -ENOTSUP)
687 		sfc_warn(sa, "alarms are not supported, restart is pending");
688 	else if (rc != 0)
689 		sfc_err(sa, "cannot arm restart alarm (rc=%d)", rc);
690 	else
691 		sfc_notice(sa, "restart scheduled");
692 }
693 
694 int
695 sfc_configure(struct sfc_adapter *sa)
696 {
697 	int rc;
698 
699 	sfc_log_init(sa, "entry");
700 
701 	SFC_ASSERT(sfc_adapter_is_locked(sa));
702 
703 	SFC_ASSERT(sa->state == SFC_ETHDEV_INITIALIZED ||
704 		   sa->state == SFC_ETHDEV_CONFIGURED);
705 	sa->state = SFC_ETHDEV_CONFIGURING;
706 
707 	rc = sfc_check_conf(sa);
708 	if (rc != 0)
709 		goto fail_check_conf;
710 
711 	rc = sfc_intr_configure(sa);
712 	if (rc != 0)
713 		goto fail_intr_configure;
714 
715 	rc = sfc_port_configure(sa);
716 	if (rc != 0)
717 		goto fail_port_configure;
718 
719 	rc = sfc_rx_configure(sa);
720 	if (rc != 0)
721 		goto fail_rx_configure;
722 
723 	rc = sfc_tx_configure(sa);
724 	if (rc != 0)
725 		goto fail_tx_configure;
726 
727 	rc = sfc_sw_xstats_configure(sa);
728 	if (rc != 0)
729 		goto fail_sw_xstats_configure;
730 
731 	sa->state = SFC_ETHDEV_CONFIGURED;
732 	sfc_log_init(sa, "done");
733 	return 0;
734 
735 fail_sw_xstats_configure:
736 	sfc_tx_close(sa);
737 
738 fail_tx_configure:
739 	sfc_rx_close(sa);
740 
741 fail_rx_configure:
742 	sfc_port_close(sa);
743 
744 fail_port_configure:
745 	sfc_intr_close(sa);
746 
747 fail_intr_configure:
748 fail_check_conf:
749 	sa->state = SFC_ETHDEV_INITIALIZED;
750 	sfc_log_init(sa, "failed %d", rc);
751 	return rc;
752 }
753 
754 void
755 sfc_close(struct sfc_adapter *sa)
756 {
757 	sfc_log_init(sa, "entry");
758 
759 	SFC_ASSERT(sfc_adapter_is_locked(sa));
760 
761 	SFC_ASSERT(sa->state == SFC_ETHDEV_CONFIGURED);
762 	sa->state = SFC_ETHDEV_CLOSING;
763 
764 	sfc_sw_xstats_close(sa);
765 	sfc_tx_close(sa);
766 	sfc_rx_close(sa);
767 	sfc_port_close(sa);
768 	sfc_intr_close(sa);
769 
770 	sa->state = SFC_ETHDEV_INITIALIZED;
771 	sfc_log_init(sa, "done");
772 }
773 
774 static int
775 sfc_mem_bar_init(struct sfc_adapter *sa, const efx_bar_region_t *mem_ebrp)
776 {
777 	struct rte_eth_dev *eth_dev = sa->eth_dev;
778 	struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(eth_dev);
779 	efsys_bar_t *ebp = &sa->mem_bar;
780 	struct rte_mem_resource *res =
781 		&pci_dev->mem_resource[mem_ebrp->ebr_index];
782 
783 	SFC_BAR_LOCK_INIT(ebp, eth_dev->data->name);
784 	ebp->esb_rid = mem_ebrp->ebr_index;
785 	ebp->esb_dev = pci_dev;
786 	ebp->esb_base = res->addr;
787 
788 	sa->fcw_offset = mem_ebrp->ebr_offset;
789 
790 	return 0;
791 }
792 
793 static void
794 sfc_mem_bar_fini(struct sfc_adapter *sa)
795 {
796 	efsys_bar_t *ebp = &sa->mem_bar;
797 
798 	SFC_BAR_LOCK_DESTROY(ebp);
799 	memset(ebp, 0, sizeof(*ebp));
800 }
801 
802 /*
803  * A fixed RSS key which has a property of being symmetric
804  * (symmetrical flows are distributed to the same CPU)
805  * and also known to give a uniform distribution
806  * (a good distribution of traffic between different CPUs)
807  */
808 static const uint8_t default_rss_key[EFX_RSS_KEY_SIZE] = {
809 	0x6d, 0x5a, 0x6d, 0x5a, 0x6d, 0x5a, 0x6d, 0x5a,
810 	0x6d, 0x5a, 0x6d, 0x5a, 0x6d, 0x5a, 0x6d, 0x5a,
811 	0x6d, 0x5a, 0x6d, 0x5a, 0x6d, 0x5a, 0x6d, 0x5a,
812 	0x6d, 0x5a, 0x6d, 0x5a, 0x6d, 0x5a, 0x6d, 0x5a,
813 	0x6d, 0x5a, 0x6d, 0x5a, 0x6d, 0x5a, 0x6d, 0x5a,
814 };
815 
816 static int
817 sfc_rss_attach(struct sfc_adapter *sa)
818 {
819 	struct sfc_rss *rss = &sfc_sa2shared(sa)->rss;
820 	int rc;
821 
822 	rc = efx_intr_init(sa->nic, sa->intr.type, NULL);
823 	if (rc != 0)
824 		goto fail_intr_init;
825 
826 	rc = efx_ev_init(sa->nic);
827 	if (rc != 0)
828 		goto fail_ev_init;
829 
830 	rc = efx_rx_init(sa->nic);
831 	if (rc != 0)
832 		goto fail_rx_init;
833 
834 	rc = efx_rx_scale_default_support_get(sa->nic, &rss->context_type);
835 	if (rc != 0)
836 		goto fail_scale_support_get;
837 
838 	rc = efx_rx_hash_default_support_get(sa->nic, &rss->hash_support);
839 	if (rc != 0)
840 		goto fail_hash_support_get;
841 
842 	rc = sfc_rx_hash_init(sa);
843 	if (rc != 0)
844 		goto fail_rx_hash_init;
845 
846 	efx_rx_fini(sa->nic);
847 	efx_ev_fini(sa->nic);
848 	efx_intr_fini(sa->nic);
849 
850 	rte_memcpy(rss->key, default_rss_key, sizeof(rss->key));
851 	memset(&rss->dummy_ctx, 0, sizeof(rss->dummy_ctx));
852 	rss->dummy_ctx.conf.qid_span = 1;
853 	rss->dummy_ctx.dummy = true;
854 
855 	return 0;
856 
857 fail_rx_hash_init:
858 fail_hash_support_get:
859 fail_scale_support_get:
860 	efx_rx_fini(sa->nic);
861 
862 fail_rx_init:
863 	efx_ev_fini(sa->nic);
864 
865 fail_ev_init:
866 	efx_intr_fini(sa->nic);
867 
868 fail_intr_init:
869 	return rc;
870 }
871 
872 static void
873 sfc_rss_detach(struct sfc_adapter *sa)
874 {
875 	sfc_rx_hash_fini(sa);
876 }
877 
878 int
879 sfc_attach(struct sfc_adapter *sa)
880 {
881 	const efx_nic_cfg_t *encp;
882 	efx_nic_t *enp = sa->nic;
883 	int rc;
884 
885 	sfc_log_init(sa, "entry");
886 
887 	SFC_ASSERT(sfc_adapter_is_locked(sa));
888 
889 	efx_mcdi_new_epoch(enp);
890 
891 	sfc_log_init(sa, "reset nic");
892 	rc = efx_nic_reset(enp);
893 	if (rc != 0)
894 		goto fail_nic_reset;
895 
896 	rc = sfc_sriov_attach(sa);
897 	if (rc != 0)
898 		goto fail_sriov_attach;
899 
900 	/*
901 	 * Probed NIC is sufficient for tunnel init.
902 	 * Initialize tunnel support to be able to use libefx
903 	 * efx_tunnel_config_udp_{add,remove}() in any state and
904 	 * efx_tunnel_reconfigure() on start up.
905 	 */
906 	rc = efx_tunnel_init(enp);
907 	if (rc != 0)
908 		goto fail_tunnel_init;
909 
910 	encp = efx_nic_cfg_get(sa->nic);
911 
912 	/*
913 	 * Make a copy of supported tunnel encapsulations in shared
914 	 * memory to be used on supported Rx packet type classes get.
915 	 */
916 	sa->priv.shared->tunnel_encaps =
917 		encp->enc_tunnel_encapsulations_supported;
918 
919 	if (sfc_dp_tx_offload_capa(sa->priv.dp_tx) & RTE_ETH_TX_OFFLOAD_TCP_TSO) {
920 		sa->tso = encp->enc_fw_assisted_tso_v2_enabled ||
921 			  encp->enc_tso_v3_enabled;
922 		if (!sa->tso)
923 			sfc_info(sa, "TSO support isn't available on this adapter");
924 	}
925 
926 	if (sa->tso &&
927 	    (sfc_dp_tx_offload_capa(sa->priv.dp_tx) &
928 	     (RTE_ETH_TX_OFFLOAD_VXLAN_TNL_TSO |
929 	      RTE_ETH_TX_OFFLOAD_GENEVE_TNL_TSO)) != 0) {
930 		sa->tso_encap = encp->enc_fw_assisted_tso_v2_encap_enabled ||
931 				encp->enc_tso_v3_enabled;
932 		if (!sa->tso_encap)
933 			sfc_info(sa, "Encapsulated TSO support isn't available on this adapter");
934 	}
935 
936 	sfc_log_init(sa, "estimate resource limits");
937 	rc = sfc_estimate_resource_limits(sa);
938 	if (rc != 0)
939 		goto fail_estimate_rsrc_limits;
940 
941 	sa->evq_max_entries = encp->enc_evq_max_nevs;
942 	SFC_ASSERT(rte_is_power_of_2(sa->evq_max_entries));
943 
944 	sa->evq_min_entries = encp->enc_evq_min_nevs;
945 	SFC_ASSERT(rte_is_power_of_2(sa->evq_min_entries));
946 
947 	sa->rxq_max_entries = encp->enc_rxq_max_ndescs;
948 	SFC_ASSERT(rte_is_power_of_2(sa->rxq_max_entries));
949 
950 	sa->rxq_min_entries = encp->enc_rxq_min_ndescs;
951 	SFC_ASSERT(rte_is_power_of_2(sa->rxq_min_entries));
952 
953 	sa->txq_max_entries = encp->enc_txq_max_ndescs;
954 	SFC_ASSERT(rte_is_power_of_2(sa->txq_max_entries));
955 
956 	sa->txq_min_entries = encp->enc_txq_min_ndescs;
957 	SFC_ASSERT(rte_is_power_of_2(sa->txq_min_entries));
958 
959 	rc = sfc_intr_attach(sa);
960 	if (rc != 0)
961 		goto fail_intr_attach;
962 
963 	rc = sfc_ev_attach(sa);
964 	if (rc != 0)
965 		goto fail_ev_attach;
966 
967 	rc = sfc_port_attach(sa);
968 	if (rc != 0)
969 		goto fail_port_attach;
970 
971 	rc = sfc_rss_attach(sa);
972 	if (rc != 0)
973 		goto fail_rss_attach;
974 
975 	rc = sfc_flow_rss_attach(sa);
976 	if (rc != 0)
977 		goto fail_flow_rss_attach;
978 
979 	rc = sfc_filter_attach(sa);
980 	if (rc != 0)
981 		goto fail_filter_attach;
982 
983 	rc = sfc_mae_counter_rxq_attach(sa);
984 	if (rc != 0)
985 		goto fail_mae_counter_rxq_attach;
986 
987 	rc = sfc_mae_attach(sa);
988 	if (rc != 0)
989 		goto fail_mae_attach;
990 
991 	rc = sfc_mae_switchdev_init(sa);
992 	if (rc != 0)
993 		goto fail_mae_switchdev_init;
994 
995 	rc = sfc_repr_proxy_attach(sa);
996 	if (rc != 0)
997 		goto fail_repr_proxy_attach;
998 
999 	sfc_log_init(sa, "fini nic");
1000 	efx_nic_fini(enp);
1001 
1002 	sfc_flow_init(sa);
1003 
1004 	rc = sfc_sw_xstats_init(sa);
1005 	if (rc != 0)
1006 		goto fail_sw_xstats_init;
1007 
1008 	/*
1009 	 * Create vSwitch to be able to use VFs when PF is not started yet
1010 	 * as DPDK port. VFs should be able to talk to each other even
1011 	 * if PF is down.
1012 	 */
1013 	rc = sfc_sriov_vswitch_create(sa);
1014 	if (rc != 0)
1015 		goto fail_sriov_vswitch_create;
1016 
1017 	sa->state = SFC_ETHDEV_INITIALIZED;
1018 
1019 	sfc_log_init(sa, "done");
1020 	return 0;
1021 
1022 fail_sriov_vswitch_create:
1023 	sfc_sw_xstats_close(sa);
1024 
1025 fail_sw_xstats_init:
1026 	sfc_flow_fini(sa);
1027 	sfc_repr_proxy_detach(sa);
1028 
1029 fail_repr_proxy_attach:
1030 	sfc_mae_switchdev_fini(sa);
1031 
1032 fail_mae_switchdev_init:
1033 	sfc_mae_detach(sa);
1034 
1035 fail_mae_attach:
1036 	sfc_mae_counter_rxq_detach(sa);
1037 
1038 fail_mae_counter_rxq_attach:
1039 	sfc_filter_detach(sa);
1040 
1041 fail_filter_attach:
1042 	sfc_flow_rss_detach(sa);
1043 
1044 fail_flow_rss_attach:
1045 	sfc_rss_detach(sa);
1046 
1047 fail_rss_attach:
1048 	sfc_port_detach(sa);
1049 
1050 fail_port_attach:
1051 	sfc_ev_detach(sa);
1052 
1053 fail_ev_attach:
1054 	sfc_intr_detach(sa);
1055 
1056 fail_intr_attach:
1057 	efx_nic_fini(sa->nic);
1058 
1059 fail_estimate_rsrc_limits:
1060 fail_tunnel_init:
1061 	efx_tunnel_fini(sa->nic);
1062 	sfc_sriov_detach(sa);
1063 
1064 fail_sriov_attach:
1065 fail_nic_reset:
1066 
1067 	sfc_log_init(sa, "failed %d", rc);
1068 	return rc;
1069 }
1070 
1071 void
1072 sfc_pre_detach(struct sfc_adapter *sa)
1073 {
1074 	sfc_log_init(sa, "entry");
1075 
1076 	SFC_ASSERT(!sfc_adapter_is_locked(sa));
1077 
1078 	sfc_repr_proxy_pre_detach(sa);
1079 
1080 	sfc_log_init(sa, "done");
1081 }
1082 
1083 void
1084 sfc_detach(struct sfc_adapter *sa)
1085 {
1086 	sfc_log_init(sa, "entry");
1087 
1088 	SFC_ASSERT(sfc_adapter_is_locked(sa));
1089 
1090 	sfc_sriov_vswitch_destroy(sa);
1091 
1092 	sfc_flow_fini(sa);
1093 
1094 	sfc_repr_proxy_detach(sa);
1095 	sfc_mae_switchdev_fini(sa);
1096 	sfc_mae_detach(sa);
1097 	sfc_mae_counter_rxq_detach(sa);
1098 	sfc_filter_detach(sa);
1099 	sfc_flow_rss_detach(sa);
1100 	sfc_rss_detach(sa);
1101 	sfc_port_detach(sa);
1102 	sfc_ev_detach(sa);
1103 	sfc_intr_detach(sa);
1104 	efx_tunnel_fini(sa->nic);
1105 	sfc_sriov_detach(sa);
1106 
1107 	sa->state = SFC_ETHDEV_UNINITIALIZED;
1108 }
1109 
1110 static int
1111 sfc_kvarg_fv_variant_handler(__rte_unused const char *key,
1112 			     const char *value_str, void *opaque)
1113 {
1114 	uint32_t *value = opaque;
1115 
1116 	if (strcasecmp(value_str, SFC_KVARG_FW_VARIANT_DONT_CARE) == 0)
1117 		*value = EFX_FW_VARIANT_DONT_CARE;
1118 	else if (strcasecmp(value_str, SFC_KVARG_FW_VARIANT_FULL_FEATURED) == 0)
1119 		*value = EFX_FW_VARIANT_FULL_FEATURED;
1120 	else if (strcasecmp(value_str, SFC_KVARG_FW_VARIANT_LOW_LATENCY) == 0)
1121 		*value = EFX_FW_VARIANT_LOW_LATENCY;
1122 	else if (strcasecmp(value_str, SFC_KVARG_FW_VARIANT_PACKED_STREAM) == 0)
1123 		*value = EFX_FW_VARIANT_PACKED_STREAM;
1124 	else if (strcasecmp(value_str, SFC_KVARG_FW_VARIANT_DPDK) == 0)
1125 		*value = EFX_FW_VARIANT_DPDK;
1126 	else
1127 		return -EINVAL;
1128 
1129 	return 0;
1130 }
1131 
1132 static int
1133 sfc_get_fw_variant(struct sfc_adapter *sa, efx_fw_variant_t *efv)
1134 {
1135 	efx_nic_fw_info_t enfi;
1136 	int rc;
1137 
1138 	rc = efx_nic_get_fw_version(sa->nic, &enfi);
1139 	if (rc != 0)
1140 		return rc;
1141 	else if (!enfi.enfi_dpcpu_fw_ids_valid)
1142 		return ENOTSUP;
1143 
1144 	/*
1145 	 * Firmware variant can be uniquely identified by the RxDPCPU
1146 	 * firmware id
1147 	 */
1148 	switch (enfi.enfi_rx_dpcpu_fw_id) {
1149 	case EFX_RXDP_FULL_FEATURED_FW_ID:
1150 		*efv = EFX_FW_VARIANT_FULL_FEATURED;
1151 		break;
1152 
1153 	case EFX_RXDP_LOW_LATENCY_FW_ID:
1154 		*efv = EFX_FW_VARIANT_LOW_LATENCY;
1155 		break;
1156 
1157 	case EFX_RXDP_PACKED_STREAM_FW_ID:
1158 		*efv = EFX_FW_VARIANT_PACKED_STREAM;
1159 		break;
1160 
1161 	case EFX_RXDP_DPDK_FW_ID:
1162 		*efv = EFX_FW_VARIANT_DPDK;
1163 		break;
1164 
1165 	default:
1166 		/*
1167 		 * Other firmware variants are not considered, since they are
1168 		 * not supported in the device parameters
1169 		 */
1170 		*efv = EFX_FW_VARIANT_DONT_CARE;
1171 		break;
1172 	}
1173 
1174 	return 0;
1175 }
1176 
1177 static const char *
1178 sfc_fw_variant2str(efx_fw_variant_t efv)
1179 {
1180 	switch (efv) {
1181 	case EFX_RXDP_FULL_FEATURED_FW_ID:
1182 		return SFC_KVARG_FW_VARIANT_FULL_FEATURED;
1183 	case EFX_RXDP_LOW_LATENCY_FW_ID:
1184 		return SFC_KVARG_FW_VARIANT_LOW_LATENCY;
1185 	case EFX_RXDP_PACKED_STREAM_FW_ID:
1186 		return SFC_KVARG_FW_VARIANT_PACKED_STREAM;
1187 	case EFX_RXDP_DPDK_FW_ID:
1188 		return SFC_KVARG_FW_VARIANT_DPDK;
1189 	default:
1190 		return "unknown";
1191 	}
1192 }
1193 
1194 static int
1195 sfc_kvarg_rxd_wait_timeout_ns(struct sfc_adapter *sa)
1196 {
1197 	int rc;
1198 	long value;
1199 
1200 	value = SFC_RXD_WAIT_TIMEOUT_NS_DEF;
1201 
1202 	rc = sfc_kvargs_process(sa, SFC_KVARG_RXD_WAIT_TIMEOUT_NS,
1203 				sfc_kvarg_long_handler, &value);
1204 	if (rc != 0)
1205 		return rc;
1206 
1207 	if (value < 0 ||
1208 	    (unsigned long)value > EFX_RXQ_ES_SUPER_BUFFER_HOL_BLOCK_MAX) {
1209 		sfc_err(sa, "wrong '" SFC_KVARG_RXD_WAIT_TIMEOUT_NS "' "
1210 			    "was set (%ld);", value);
1211 		sfc_err(sa, "it must not be less than 0 or greater than %u",
1212 			    EFX_RXQ_ES_SUPER_BUFFER_HOL_BLOCK_MAX);
1213 		return EINVAL;
1214 	}
1215 
1216 	sa->rxd_wait_timeout_ns = value;
1217 	return 0;
1218 }
1219 
1220 static int
1221 sfc_nic_probe(struct sfc_adapter *sa)
1222 {
1223 	efx_nic_t *enp = sa->nic;
1224 	efx_fw_variant_t preferred_efv;
1225 	efx_fw_variant_t efv;
1226 	int rc;
1227 
1228 	preferred_efv = EFX_FW_VARIANT_DONT_CARE;
1229 	rc = sfc_kvargs_process(sa, SFC_KVARG_FW_VARIANT,
1230 				sfc_kvarg_fv_variant_handler,
1231 				&preferred_efv);
1232 	if (rc != 0) {
1233 		sfc_err(sa, "invalid %s parameter value", SFC_KVARG_FW_VARIANT);
1234 		return rc;
1235 	}
1236 
1237 	rc = sfc_kvarg_rxd_wait_timeout_ns(sa);
1238 	if (rc != 0)
1239 		return rc;
1240 
1241 	rc = efx_nic_probe(enp, preferred_efv);
1242 	if (rc == EACCES) {
1243 		/* Unprivileged functions cannot set FW variant */
1244 		rc = efx_nic_probe(enp, EFX_FW_VARIANT_DONT_CARE);
1245 	}
1246 	if (rc != 0)
1247 		return rc;
1248 
1249 	rc = sfc_get_fw_variant(sa, &efv);
1250 	if (rc == ENOTSUP) {
1251 		sfc_warn(sa, "FW variant can not be obtained");
1252 		return 0;
1253 	}
1254 	if (rc != 0)
1255 		return rc;
1256 
1257 	/* Check that firmware variant was changed to the requested one */
1258 	if (preferred_efv != EFX_FW_VARIANT_DONT_CARE && preferred_efv != efv) {
1259 		sfc_warn(sa, "FW variant has not changed to the requested %s",
1260 			 sfc_fw_variant2str(preferred_efv));
1261 	}
1262 
1263 	sfc_notice(sa, "running FW variant is %s", sfc_fw_variant2str(efv));
1264 
1265 	return 0;
1266 }
1267 
1268 int
1269 sfc_probe(struct sfc_adapter *sa)
1270 {
1271 	efx_bar_region_t mem_ebrp;
1272 	struct rte_eth_dev *eth_dev = sa->eth_dev;
1273 	struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(eth_dev);
1274 	efx_nic_t *enp;
1275 	int rc;
1276 
1277 	sfc_log_init(sa, "entry");
1278 
1279 	SFC_ASSERT(sfc_adapter_is_locked(sa));
1280 
1281 	sa->socket_id = rte_socket_id();
1282 	rte_atomic32_init(&sa->restart_required);
1283 
1284 	sfc_log_init(sa, "get family");
1285 	rc = sfc_efx_family(pci_dev, &mem_ebrp, &sa->family);
1286 
1287 	if (rc != 0)
1288 		goto fail_family;
1289 	sfc_log_init(sa,
1290 		     "family is %u, membar is %u, function control window offset is %lu",
1291 		     sa->family, mem_ebrp.ebr_index, mem_ebrp.ebr_offset);
1292 
1293 	sfc_log_init(sa, "init mem bar");
1294 	rc = sfc_mem_bar_init(sa, &mem_ebrp);
1295 	if (rc != 0)
1296 		goto fail_mem_bar_init;
1297 
1298 	sfc_log_init(sa, "create nic");
1299 	rte_spinlock_init(&sa->nic_lock);
1300 	rc = efx_nic_create(sa->family, (efsys_identifier_t *)sa,
1301 			    &sa->mem_bar, mem_ebrp.ebr_offset,
1302 			    &sa->nic_lock, &enp);
1303 	if (rc != 0)
1304 		goto fail_nic_create;
1305 	sa->nic = enp;
1306 
1307 	rc = sfc_mcdi_init(sa);
1308 	if (rc != 0)
1309 		goto fail_mcdi_init;
1310 
1311 	sfc_log_init(sa, "probe nic");
1312 	rc = sfc_nic_probe(sa);
1313 	if (rc != 0)
1314 		goto fail_nic_probe;
1315 
1316 	sfc_log_init(sa, "done");
1317 	return 0;
1318 
1319 fail_nic_probe:
1320 	sfc_mcdi_fini(sa);
1321 
1322 fail_mcdi_init:
1323 	sfc_log_init(sa, "destroy nic");
1324 	sa->nic = NULL;
1325 	efx_nic_destroy(enp);
1326 
1327 fail_nic_create:
1328 	sfc_mem_bar_fini(sa);
1329 
1330 fail_mem_bar_init:
1331 fail_family:
1332 	sfc_log_init(sa, "failed %d", rc);
1333 	return rc;
1334 }
1335 
1336 void
1337 sfc_unprobe(struct sfc_adapter *sa)
1338 {
1339 	efx_nic_t *enp = sa->nic;
1340 
1341 	sfc_log_init(sa, "entry");
1342 
1343 	SFC_ASSERT(sfc_adapter_is_locked(sa));
1344 
1345 	sfc_log_init(sa, "unprobe nic");
1346 	efx_nic_unprobe(enp);
1347 
1348 	sfc_mcdi_fini(sa);
1349 
1350 	/*
1351 	 * Make sure there is no pending alarm to restart since we are
1352 	 * going to free device private which is passed as the callback
1353 	 * opaque data. A new alarm cannot be scheduled since MCDI is
1354 	 * shut down.
1355 	 */
1356 	rte_eal_alarm_cancel(sfc_restart_if_required, sa);
1357 
1358 	sfc_mae_clear_switch_port(sa->mae.switch_domain_id,
1359 				  sa->mae.switch_port_id);
1360 
1361 	sfc_log_init(sa, "destroy nic");
1362 	sa->nic = NULL;
1363 	efx_nic_destroy(enp);
1364 
1365 	sfc_mem_bar_fini(sa);
1366 
1367 	sfc_flow_fini(sa);
1368 	sa->state = SFC_ETHDEV_UNINITIALIZED;
1369 }
1370 
1371 uint32_t
1372 sfc_register_logtype(const struct rte_pci_addr *pci_addr,
1373 		     const char *lt_prefix_str, uint32_t ll_default)
1374 {
1375 	size_t lt_prefix_str_size = strlen(lt_prefix_str);
1376 	size_t lt_str_size_max;
1377 	char *lt_str = NULL;
1378 	int ret;
1379 
1380 	if (SIZE_MAX - PCI_PRI_STR_SIZE - 1 > lt_prefix_str_size) {
1381 		++lt_prefix_str_size; /* Reserve space for prefix separator */
1382 		lt_str_size_max = lt_prefix_str_size + PCI_PRI_STR_SIZE + 1;
1383 	} else {
1384 		return sfc_logtype_driver;
1385 	}
1386 
1387 	lt_str = rte_zmalloc("logtype_str", lt_str_size_max, 0);
1388 	if (lt_str == NULL)
1389 		return sfc_logtype_driver;
1390 
1391 	strncpy(lt_str, lt_prefix_str, lt_prefix_str_size);
1392 	lt_str[lt_prefix_str_size - 1] = '.';
1393 	rte_pci_device_name(pci_addr, lt_str + lt_prefix_str_size,
1394 			    lt_str_size_max - lt_prefix_str_size);
1395 	lt_str[lt_str_size_max - 1] = '\0';
1396 
1397 	ret = rte_log_register_type_and_pick_level(lt_str, ll_default);
1398 	rte_free(lt_str);
1399 
1400 	if (ret < 0)
1401 		return sfc_logtype_driver;
1402 
1403 	return ret;
1404 }
1405 
1406 struct sfc_hw_switch_id {
1407 	char	board_sn[RTE_SIZEOF_FIELD(efx_nic_board_info_t, enbi_serial)];
1408 };
1409 
1410 int
1411 sfc_hw_switch_id_init(struct sfc_adapter *sa,
1412 		      struct sfc_hw_switch_id **idp)
1413 {
1414 	efx_nic_board_info_t board_info;
1415 	struct sfc_hw_switch_id *id;
1416 	int rc;
1417 
1418 	if (idp == NULL)
1419 		return EINVAL;
1420 
1421 	id = rte_zmalloc("sfc_hw_switch_id", sizeof(*id), 0);
1422 	if (id == NULL)
1423 		return ENOMEM;
1424 
1425 	rc = efx_nic_get_board_info(sa->nic, &board_info);
1426 	if (rc != 0)
1427 		return rc;
1428 
1429 	memcpy(id->board_sn, board_info.enbi_serial, sizeof(id->board_sn));
1430 
1431 	*idp = id;
1432 
1433 	return 0;
1434 }
1435 
1436 void
1437 sfc_hw_switch_id_fini(__rte_unused struct sfc_adapter *sa,
1438 		      struct sfc_hw_switch_id *id)
1439 {
1440 	rte_free(id);
1441 }
1442 
1443 bool
1444 sfc_hw_switch_ids_equal(const struct sfc_hw_switch_id *left,
1445 			const struct sfc_hw_switch_id *right)
1446 {
1447 	return strncmp(left->board_sn, right->board_sn,
1448 		       sizeof(left->board_sn)) == 0;
1449 }
1450