xref: /dpdk/drivers/net/sfc/sfc.c (revision c7e9729d)
1 /* SPDX-License-Identifier: BSD-3-Clause
2  *
3  * Copyright (c) 2016-2018 Solarflare Communications Inc.
4  * All rights reserved.
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_log.h"
20 #include "sfc_ev.h"
21 #include "sfc_rx.h"
22 #include "sfc_tx.h"
23 #include "sfc_kvargs.h"
24 
25 
26 int
27 sfc_dma_alloc(const struct sfc_adapter *sa, const char *name, uint16_t id,
28 	      size_t len, int socket_id, efsys_mem_t *esmp)
29 {
30 	const struct rte_memzone *mz;
31 
32 	sfc_log_init(sa, "name=%s id=%u len=%lu socket_id=%d",
33 		     name, id, len, socket_id);
34 
35 	mz = rte_eth_dma_zone_reserve(sa->eth_dev, name, id, len,
36 				      sysconf(_SC_PAGESIZE), socket_id);
37 	if (mz == NULL) {
38 		sfc_err(sa, "cannot reserve DMA zone for %s:%u %#x@%d: %s",
39 			name, (unsigned int)id, (unsigned int)len, socket_id,
40 			rte_strerror(rte_errno));
41 		return ENOMEM;
42 	}
43 
44 	esmp->esm_addr = mz->iova;
45 	if (esmp->esm_addr == RTE_BAD_IOVA) {
46 		(void)rte_memzone_free(mz);
47 		return EFAULT;
48 	}
49 
50 	esmp->esm_mz = mz;
51 	esmp->esm_base = mz->addr;
52 
53 	return 0;
54 }
55 
56 void
57 sfc_dma_free(const struct sfc_adapter *sa, efsys_mem_t *esmp)
58 {
59 	int rc;
60 
61 	sfc_log_init(sa, "name=%s", esmp->esm_mz->name);
62 
63 	rc = rte_memzone_free(esmp->esm_mz);
64 	if (rc != 0)
65 		sfc_err(sa, "rte_memzone_free(() failed: %d", rc);
66 
67 	memset(esmp, 0, sizeof(*esmp));
68 }
69 
70 static uint32_t
71 sfc_phy_cap_from_link_speeds(uint32_t speeds)
72 {
73 	uint32_t phy_caps = 0;
74 
75 	if (~speeds & ETH_LINK_SPEED_FIXED) {
76 		phy_caps |= (1 << EFX_PHY_CAP_AN);
77 		/*
78 		 * If no speeds are specified in the mask, any supported
79 		 * may be negotiated
80 		 */
81 		if (speeds == ETH_LINK_SPEED_AUTONEG)
82 			phy_caps |=
83 				(1 << EFX_PHY_CAP_1000FDX) |
84 				(1 << EFX_PHY_CAP_10000FDX) |
85 				(1 << EFX_PHY_CAP_25000FDX) |
86 				(1 << EFX_PHY_CAP_40000FDX) |
87 				(1 << EFX_PHY_CAP_50000FDX) |
88 				(1 << EFX_PHY_CAP_100000FDX);
89 	}
90 	if (speeds & ETH_LINK_SPEED_1G)
91 		phy_caps |= (1 << EFX_PHY_CAP_1000FDX);
92 	if (speeds & ETH_LINK_SPEED_10G)
93 		phy_caps |= (1 << EFX_PHY_CAP_10000FDX);
94 	if (speeds & ETH_LINK_SPEED_25G)
95 		phy_caps |= (1 << EFX_PHY_CAP_25000FDX);
96 	if (speeds & ETH_LINK_SPEED_40G)
97 		phy_caps |= (1 << EFX_PHY_CAP_40000FDX);
98 	if (speeds & ETH_LINK_SPEED_50G)
99 		phy_caps |= (1 << EFX_PHY_CAP_50000FDX);
100 	if (speeds & ETH_LINK_SPEED_100G)
101 		phy_caps |= (1 << EFX_PHY_CAP_100000FDX);
102 
103 	return phy_caps;
104 }
105 
106 /*
107  * Check requested device level configuration.
108  * Receive and transmit configuration is checked in corresponding
109  * modules.
110  */
111 static int
112 sfc_check_conf(struct sfc_adapter *sa)
113 {
114 	const struct rte_eth_conf *conf = &sa->eth_dev->data->dev_conf;
115 	int rc = 0;
116 
117 	sa->port.phy_adv_cap =
118 		sfc_phy_cap_from_link_speeds(conf->link_speeds) &
119 		sa->port.phy_adv_cap_mask;
120 	if ((sa->port.phy_adv_cap & ~(1 << EFX_PHY_CAP_AN)) == 0) {
121 		sfc_err(sa, "No link speeds from mask %#x are supported",
122 			conf->link_speeds);
123 		rc = EINVAL;
124 	}
125 
126 	if (conf->lpbk_mode != 0) {
127 		sfc_err(sa, "Loopback not supported");
128 		rc = EINVAL;
129 	}
130 
131 	if (conf->dcb_capability_en != 0) {
132 		sfc_err(sa, "Priority-based flow control not supported");
133 		rc = EINVAL;
134 	}
135 
136 	if (conf->fdir_conf.mode != RTE_FDIR_MODE_NONE) {
137 		sfc_err(sa, "Flow Director not supported");
138 		rc = EINVAL;
139 	}
140 
141 	if ((conf->intr_conf.lsc != 0) &&
142 	    (sa->intr.type != EFX_INTR_LINE) &&
143 	    (sa->intr.type != EFX_INTR_MESSAGE)) {
144 		sfc_err(sa, "Link status change interrupt not supported");
145 		rc = EINVAL;
146 	}
147 
148 	if (conf->intr_conf.rxq != 0) {
149 		sfc_err(sa, "Receive queue interrupt not supported");
150 		rc = EINVAL;
151 	}
152 
153 	return rc;
154 }
155 
156 /*
157  * Find out maximum number of receive and transmit queues which could be
158  * advertised.
159  *
160  * NIC is kept initialized on success to allow other modules acquire
161  * defaults and capabilities.
162  */
163 static int
164 sfc_estimate_resource_limits(struct sfc_adapter *sa)
165 {
166 	const efx_nic_cfg_t *encp = efx_nic_cfg_get(sa->nic);
167 	efx_drv_limits_t limits;
168 	int rc;
169 	uint32_t evq_allocated;
170 	uint32_t rxq_allocated;
171 	uint32_t txq_allocated;
172 
173 	memset(&limits, 0, sizeof(limits));
174 
175 	/* Request at least one Rx and Tx queue */
176 	limits.edl_min_rxq_count = 1;
177 	limits.edl_min_txq_count = 1;
178 	/* Management event queue plus event queue for each Tx and Rx queue */
179 	limits.edl_min_evq_count =
180 		1 + limits.edl_min_rxq_count + limits.edl_min_txq_count;
181 
182 	/* Divide by number of functions to guarantee that all functions
183 	 * will get promised resources
184 	 */
185 	/* FIXME Divide by number of functions (not 2) below */
186 	limits.edl_max_evq_count = encp->enc_evq_limit / 2;
187 	SFC_ASSERT(limits.edl_max_evq_count >= limits.edl_min_rxq_count);
188 
189 	/* Split equally between receive and transmit */
190 	limits.edl_max_rxq_count =
191 		MIN(encp->enc_rxq_limit, (limits.edl_max_evq_count - 1) / 2);
192 	SFC_ASSERT(limits.edl_max_rxq_count >= limits.edl_min_rxq_count);
193 
194 	limits.edl_max_txq_count =
195 		MIN(encp->enc_txq_limit,
196 		    limits.edl_max_evq_count - 1 - limits.edl_max_rxq_count);
197 
198 	if (sa->tso)
199 		limits.edl_max_txq_count =
200 			MIN(limits.edl_max_txq_count,
201 			    encp->enc_fw_assisted_tso_v2_n_contexts /
202 			    encp->enc_hw_pf_count);
203 
204 	SFC_ASSERT(limits.edl_max_txq_count >= limits.edl_min_rxq_count);
205 
206 	/* Configure the minimum required resources needed for the
207 	 * driver to operate, and the maximum desired resources that the
208 	 * driver is capable of using.
209 	 */
210 	efx_nic_set_drv_limits(sa->nic, &limits);
211 
212 	sfc_log_init(sa, "init nic");
213 	rc = efx_nic_init(sa->nic);
214 	if (rc != 0)
215 		goto fail_nic_init;
216 
217 	/* Find resource dimensions assigned by firmware to this function */
218 	rc = efx_nic_get_vi_pool(sa->nic, &evq_allocated, &rxq_allocated,
219 				 &txq_allocated);
220 	if (rc != 0)
221 		goto fail_get_vi_pool;
222 
223 	/* It still may allocate more than maximum, ensure limit */
224 	evq_allocated = MIN(evq_allocated, limits.edl_max_evq_count);
225 	rxq_allocated = MIN(rxq_allocated, limits.edl_max_rxq_count);
226 	txq_allocated = MIN(txq_allocated, limits.edl_max_txq_count);
227 
228 	/* Subtract management EVQ not used for traffic */
229 	SFC_ASSERT(evq_allocated > 0);
230 	evq_allocated--;
231 
232 	/* Right now we use separate EVQ for Rx and Tx */
233 	sa->rxq_max = MIN(rxq_allocated, evq_allocated / 2);
234 	sa->txq_max = MIN(txq_allocated, evq_allocated - sa->rxq_max);
235 
236 	/* Keep NIC initialized */
237 	return 0;
238 
239 fail_get_vi_pool:
240 fail_nic_init:
241 	efx_nic_fini(sa->nic);
242 	return rc;
243 }
244 
245 static int
246 sfc_set_drv_limits(struct sfc_adapter *sa)
247 {
248 	const struct rte_eth_dev_data *data = sa->eth_dev->data;
249 	efx_drv_limits_t lim;
250 
251 	memset(&lim, 0, sizeof(lim));
252 
253 	/* Limits are strict since take into account initial estimation */
254 	lim.edl_min_evq_count = lim.edl_max_evq_count =
255 		1 + data->nb_rx_queues + data->nb_tx_queues;
256 	lim.edl_min_rxq_count = lim.edl_max_rxq_count = data->nb_rx_queues;
257 	lim.edl_min_txq_count = lim.edl_max_txq_count = data->nb_tx_queues;
258 
259 	return efx_nic_set_drv_limits(sa->nic, &lim);
260 }
261 
262 static int
263 sfc_try_start(struct sfc_adapter *sa)
264 {
265 	const efx_nic_cfg_t *encp;
266 	int rc;
267 
268 	sfc_log_init(sa, "entry");
269 
270 	SFC_ASSERT(sfc_adapter_is_locked(sa));
271 	SFC_ASSERT(sa->state == SFC_ADAPTER_STARTING);
272 
273 	sfc_log_init(sa, "set resource limits");
274 	rc = sfc_set_drv_limits(sa);
275 	if (rc != 0)
276 		goto fail_set_drv_limits;
277 
278 	sfc_log_init(sa, "init nic");
279 	rc = efx_nic_init(sa->nic);
280 	if (rc != 0)
281 		goto fail_nic_init;
282 
283 	encp = efx_nic_cfg_get(sa->nic);
284 	if (encp->enc_tunnel_encapsulations_supported != 0) {
285 		sfc_log_init(sa, "apply tunnel config");
286 		rc = efx_tunnel_reconfigure(sa->nic);
287 		if (rc != 0)
288 			goto fail_tunnel_reconfigure;
289 	}
290 
291 	rc = sfc_intr_start(sa);
292 	if (rc != 0)
293 		goto fail_intr_start;
294 
295 	rc = sfc_ev_start(sa);
296 	if (rc != 0)
297 		goto fail_ev_start;
298 
299 	rc = sfc_port_start(sa);
300 	if (rc != 0)
301 		goto fail_port_start;
302 
303 	rc = sfc_rx_start(sa);
304 	if (rc != 0)
305 		goto fail_rx_start;
306 
307 	rc = sfc_tx_start(sa);
308 	if (rc != 0)
309 		goto fail_tx_start;
310 
311 	rc = sfc_flow_start(sa);
312 	if (rc != 0)
313 		goto fail_flows_insert;
314 
315 	sfc_log_init(sa, "done");
316 	return 0;
317 
318 fail_flows_insert:
319 	sfc_tx_stop(sa);
320 
321 fail_tx_start:
322 	sfc_rx_stop(sa);
323 
324 fail_rx_start:
325 	sfc_port_stop(sa);
326 
327 fail_port_start:
328 	sfc_ev_stop(sa);
329 
330 fail_ev_start:
331 	sfc_intr_stop(sa);
332 
333 fail_intr_start:
334 fail_tunnel_reconfigure:
335 	efx_nic_fini(sa->nic);
336 
337 fail_nic_init:
338 fail_set_drv_limits:
339 	sfc_log_init(sa, "failed %d", rc);
340 	return rc;
341 }
342 
343 int
344 sfc_start(struct sfc_adapter *sa)
345 {
346 	unsigned int start_tries = 3;
347 	int rc;
348 
349 	sfc_log_init(sa, "entry");
350 
351 	SFC_ASSERT(sfc_adapter_is_locked(sa));
352 
353 	switch (sa->state) {
354 	case SFC_ADAPTER_CONFIGURED:
355 		break;
356 	case SFC_ADAPTER_STARTED:
357 		sfc_notice(sa, "already started");
358 		return 0;
359 	default:
360 		rc = EINVAL;
361 		goto fail_bad_state;
362 	}
363 
364 	sa->state = SFC_ADAPTER_STARTING;
365 
366 	do {
367 		rc = sfc_try_start(sa);
368 	} while ((--start_tries > 0) &&
369 		 (rc == EIO || rc == EAGAIN || rc == ENOENT || rc == EINVAL));
370 
371 	if (rc != 0)
372 		goto fail_try_start;
373 
374 	sa->state = SFC_ADAPTER_STARTED;
375 	sfc_log_init(sa, "done");
376 	return 0;
377 
378 fail_try_start:
379 	sa->state = SFC_ADAPTER_CONFIGURED;
380 fail_bad_state:
381 	sfc_log_init(sa, "failed %d", rc);
382 	return rc;
383 }
384 
385 void
386 sfc_stop(struct sfc_adapter *sa)
387 {
388 	sfc_log_init(sa, "entry");
389 
390 	SFC_ASSERT(sfc_adapter_is_locked(sa));
391 
392 	switch (sa->state) {
393 	case SFC_ADAPTER_STARTED:
394 		break;
395 	case SFC_ADAPTER_CONFIGURED:
396 		sfc_notice(sa, "already stopped");
397 		return;
398 	default:
399 		sfc_err(sa, "stop in unexpected state %u", sa->state);
400 		SFC_ASSERT(B_FALSE);
401 		return;
402 	}
403 
404 	sa->state = SFC_ADAPTER_STOPPING;
405 
406 	sfc_flow_stop(sa);
407 	sfc_tx_stop(sa);
408 	sfc_rx_stop(sa);
409 	sfc_port_stop(sa);
410 	sfc_ev_stop(sa);
411 	sfc_intr_stop(sa);
412 	efx_nic_fini(sa->nic);
413 
414 	sa->state = SFC_ADAPTER_CONFIGURED;
415 	sfc_log_init(sa, "done");
416 }
417 
418 static int
419 sfc_restart(struct sfc_adapter *sa)
420 {
421 	int rc;
422 
423 	SFC_ASSERT(sfc_adapter_is_locked(sa));
424 
425 	if (sa->state != SFC_ADAPTER_STARTED)
426 		return EINVAL;
427 
428 	sfc_stop(sa);
429 
430 	rc = sfc_start(sa);
431 	if (rc != 0)
432 		sfc_err(sa, "restart failed");
433 
434 	return rc;
435 }
436 
437 static void
438 sfc_restart_if_required(void *arg)
439 {
440 	struct sfc_adapter *sa = arg;
441 
442 	/* If restart is scheduled, clear the flag and do it */
443 	if (rte_atomic32_cmpset((volatile uint32_t *)&sa->restart_required,
444 				1, 0)) {
445 		sfc_adapter_lock(sa);
446 		if (sa->state == SFC_ADAPTER_STARTED)
447 			(void)sfc_restart(sa);
448 		sfc_adapter_unlock(sa);
449 	}
450 }
451 
452 void
453 sfc_schedule_restart(struct sfc_adapter *sa)
454 {
455 	int rc;
456 
457 	/* Schedule restart alarm if it is not scheduled yet */
458 	if (!rte_atomic32_test_and_set(&sa->restart_required))
459 		return;
460 
461 	rc = rte_eal_alarm_set(1, sfc_restart_if_required, sa);
462 	if (rc == -ENOTSUP)
463 		sfc_warn(sa, "alarms are not supported, restart is pending");
464 	else if (rc != 0)
465 		sfc_err(sa, "cannot arm restart alarm (rc=%d)", rc);
466 	else
467 		sfc_notice(sa, "restart scheduled");
468 }
469 
470 int
471 sfc_configure(struct sfc_adapter *sa)
472 {
473 	int rc;
474 
475 	sfc_log_init(sa, "entry");
476 
477 	SFC_ASSERT(sfc_adapter_is_locked(sa));
478 
479 	SFC_ASSERT(sa->state == SFC_ADAPTER_INITIALIZED ||
480 		   sa->state == SFC_ADAPTER_CONFIGURED);
481 	sa->state = SFC_ADAPTER_CONFIGURING;
482 
483 	rc = sfc_check_conf(sa);
484 	if (rc != 0)
485 		goto fail_check_conf;
486 
487 	rc = sfc_intr_configure(sa);
488 	if (rc != 0)
489 		goto fail_intr_configure;
490 
491 	rc = sfc_port_configure(sa);
492 	if (rc != 0)
493 		goto fail_port_configure;
494 
495 	rc = sfc_rx_configure(sa);
496 	if (rc != 0)
497 		goto fail_rx_configure;
498 
499 	rc = sfc_tx_configure(sa);
500 	if (rc != 0)
501 		goto fail_tx_configure;
502 
503 	sa->state = SFC_ADAPTER_CONFIGURED;
504 	sfc_log_init(sa, "done");
505 	return 0;
506 
507 fail_tx_configure:
508 	sfc_rx_close(sa);
509 
510 fail_rx_configure:
511 	sfc_port_close(sa);
512 
513 fail_port_configure:
514 	sfc_intr_close(sa);
515 
516 fail_intr_configure:
517 fail_check_conf:
518 	sa->state = SFC_ADAPTER_INITIALIZED;
519 	sfc_log_init(sa, "failed %d", rc);
520 	return rc;
521 }
522 
523 void
524 sfc_close(struct sfc_adapter *sa)
525 {
526 	sfc_log_init(sa, "entry");
527 
528 	SFC_ASSERT(sfc_adapter_is_locked(sa));
529 
530 	SFC_ASSERT(sa->state == SFC_ADAPTER_CONFIGURED);
531 	sa->state = SFC_ADAPTER_CLOSING;
532 
533 	sfc_tx_close(sa);
534 	sfc_rx_close(sa);
535 	sfc_port_close(sa);
536 	sfc_intr_close(sa);
537 
538 	sa->state = SFC_ADAPTER_INITIALIZED;
539 	sfc_log_init(sa, "done");
540 }
541 
542 static int
543 sfc_mem_bar_init(struct sfc_adapter *sa, unsigned int membar)
544 {
545 	struct rte_eth_dev *eth_dev = sa->eth_dev;
546 	struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(eth_dev);
547 	efsys_bar_t *ebp = &sa->mem_bar;
548 	struct rte_mem_resource *res = &pci_dev->mem_resource[membar];
549 
550 	SFC_BAR_LOCK_INIT(ebp, eth_dev->data->name);
551 	ebp->esb_rid = membar;
552 	ebp->esb_dev = pci_dev;
553 	ebp->esb_base = res->addr;
554 	return 0;
555 }
556 
557 static void
558 sfc_mem_bar_fini(struct sfc_adapter *sa)
559 {
560 	efsys_bar_t *ebp = &sa->mem_bar;
561 
562 	SFC_BAR_LOCK_DESTROY(ebp);
563 	memset(ebp, 0, sizeof(*ebp));
564 }
565 
566 #if EFSYS_OPT_RX_SCALE
567 /*
568  * A fixed RSS key which has a property of being symmetric
569  * (symmetrical flows are distributed to the same CPU)
570  * and also known to give a uniform distribution
571  * (a good distribution of traffic between different CPUs)
572  */
573 static const uint8_t default_rss_key[EFX_RSS_KEY_SIZE] = {
574 	0x6d, 0x5a, 0x6d, 0x5a, 0x6d, 0x5a, 0x6d, 0x5a,
575 	0x6d, 0x5a, 0x6d, 0x5a, 0x6d, 0x5a, 0x6d, 0x5a,
576 	0x6d, 0x5a, 0x6d, 0x5a, 0x6d, 0x5a, 0x6d, 0x5a,
577 	0x6d, 0x5a, 0x6d, 0x5a, 0x6d, 0x5a, 0x6d, 0x5a,
578 	0x6d, 0x5a, 0x6d, 0x5a, 0x6d, 0x5a, 0x6d, 0x5a,
579 };
580 #endif
581 
582 #if EFSYS_OPT_RX_SCALE
583 static int
584 sfc_set_rss_defaults(struct sfc_adapter *sa)
585 {
586 	int rc;
587 
588 	rc = efx_intr_init(sa->nic, sa->intr.type, NULL);
589 	if (rc != 0)
590 		goto fail_intr_init;
591 
592 	rc = efx_ev_init(sa->nic);
593 	if (rc != 0)
594 		goto fail_ev_init;
595 
596 	rc = efx_rx_init(sa->nic);
597 	if (rc != 0)
598 		goto fail_rx_init;
599 
600 	rc = efx_rx_scale_default_support_get(sa->nic, &sa->rss_support);
601 	if (rc != 0)
602 		goto fail_scale_support_get;
603 
604 	rc = efx_rx_hash_default_support_get(sa->nic, &sa->hash_support);
605 	if (rc != 0)
606 		goto fail_hash_support_get;
607 
608 	efx_rx_fini(sa->nic);
609 	efx_ev_fini(sa->nic);
610 	efx_intr_fini(sa->nic);
611 
612 	sa->rss_hash_types = sfc_rte_to_efx_hash_type(SFC_RSS_OFFLOADS);
613 
614 	rte_memcpy(sa->rss_key, default_rss_key, sizeof(sa->rss_key));
615 
616 	return 0;
617 
618 fail_hash_support_get:
619 fail_scale_support_get:
620 fail_rx_init:
621 	efx_ev_fini(sa->nic);
622 
623 fail_ev_init:
624 	efx_intr_fini(sa->nic);
625 
626 fail_intr_init:
627 	return rc;
628 }
629 #else
630 static int
631 sfc_set_rss_defaults(__rte_unused struct sfc_adapter *sa)
632 {
633 	return 0;
634 }
635 #endif
636 
637 int
638 sfc_attach(struct sfc_adapter *sa)
639 {
640 	const efx_nic_cfg_t *encp;
641 	efx_nic_t *enp = sa->nic;
642 	int rc;
643 
644 	sfc_log_init(sa, "entry");
645 
646 	SFC_ASSERT(sfc_adapter_is_locked(sa));
647 
648 	efx_mcdi_new_epoch(enp);
649 
650 	sfc_log_init(sa, "reset nic");
651 	rc = efx_nic_reset(enp);
652 	if (rc != 0)
653 		goto fail_nic_reset;
654 
655 	/*
656 	 * Probed NIC is sufficient for tunnel init.
657 	 * Initialize tunnel support to be able to use libefx
658 	 * efx_tunnel_config_udp_{add,remove}() in any state and
659 	 * efx_tunnel_reconfigure() on start up.
660 	 */
661 	rc = efx_tunnel_init(enp);
662 	if (rc != 0)
663 		goto fail_tunnel_init;
664 
665 	encp = efx_nic_cfg_get(sa->nic);
666 
667 	if (sa->dp_tx->features & SFC_DP_TX_FEAT_TSO) {
668 		sa->tso = encp->enc_fw_assisted_tso_v2_enabled;
669 		if (!sa->tso)
670 			sfc_warn(sa,
671 				 "TSO support isn't available on this adapter");
672 	}
673 
674 	sfc_log_init(sa, "estimate resource limits");
675 	rc = sfc_estimate_resource_limits(sa);
676 	if (rc != 0)
677 		goto fail_estimate_rsrc_limits;
678 
679 	sa->txq_max_entries = encp->enc_txq_max_ndescs;
680 	SFC_ASSERT(rte_is_power_of_2(sa->txq_max_entries));
681 
682 	rc = sfc_intr_attach(sa);
683 	if (rc != 0)
684 		goto fail_intr_attach;
685 
686 	rc = sfc_ev_attach(sa);
687 	if (rc != 0)
688 		goto fail_ev_attach;
689 
690 	rc = sfc_port_attach(sa);
691 	if (rc != 0)
692 		goto fail_port_attach;
693 
694 	rc = sfc_set_rss_defaults(sa);
695 	if (rc != 0)
696 		goto fail_set_rss_defaults;
697 
698 	rc = sfc_filter_attach(sa);
699 	if (rc != 0)
700 		goto fail_filter_attach;
701 
702 	sfc_log_init(sa, "fini nic");
703 	efx_nic_fini(enp);
704 
705 	sfc_flow_init(sa);
706 
707 	sa->state = SFC_ADAPTER_INITIALIZED;
708 
709 	sfc_log_init(sa, "done");
710 	return 0;
711 
712 fail_filter_attach:
713 fail_set_rss_defaults:
714 	sfc_port_detach(sa);
715 
716 fail_port_attach:
717 	sfc_ev_detach(sa);
718 
719 fail_ev_attach:
720 	sfc_intr_detach(sa);
721 
722 fail_intr_attach:
723 	efx_nic_fini(sa->nic);
724 
725 fail_estimate_rsrc_limits:
726 fail_tunnel_init:
727 	efx_tunnel_fini(sa->nic);
728 
729 fail_nic_reset:
730 
731 	sfc_log_init(sa, "failed %d", rc);
732 	return rc;
733 }
734 
735 void
736 sfc_detach(struct sfc_adapter *sa)
737 {
738 	sfc_log_init(sa, "entry");
739 
740 	SFC_ASSERT(sfc_adapter_is_locked(sa));
741 
742 	sfc_flow_fini(sa);
743 
744 	sfc_filter_detach(sa);
745 	sfc_port_detach(sa);
746 	sfc_ev_detach(sa);
747 	sfc_intr_detach(sa);
748 	efx_tunnel_fini(sa->nic);
749 
750 	sa->state = SFC_ADAPTER_UNINITIALIZED;
751 }
752 
753 static int
754 sfc_kvarg_fv_variant_handler(__rte_unused const char *key,
755 			     const char *value_str, void *opaque)
756 {
757 	uint32_t *value = opaque;
758 
759 	if (strcasecmp(value_str, SFC_KVARG_FW_VARIANT_DONT_CARE) == 0)
760 		*value = EFX_FW_VARIANT_DONT_CARE;
761 	else if (strcasecmp(value_str, SFC_KVARG_FW_VARIANT_FULL_FEATURED) == 0)
762 		*value = EFX_FW_VARIANT_FULL_FEATURED;
763 	else if (strcasecmp(value_str, SFC_KVARG_FW_VARIANT_LOW_LATENCY) == 0)
764 		*value = EFX_FW_VARIANT_LOW_LATENCY;
765 	else if (strcasecmp(value_str, SFC_KVARG_FW_VARIANT_PACKED_STREAM) == 0)
766 		*value = EFX_FW_VARIANT_PACKED_STREAM;
767 	else
768 		return -EINVAL;
769 
770 	return 0;
771 }
772 
773 static int
774 sfc_get_fw_variant(struct sfc_adapter *sa, efx_fw_variant_t *efv)
775 {
776 	efx_nic_fw_info_t enfi;
777 	int rc;
778 
779 	rc = efx_nic_get_fw_version(sa->nic, &enfi);
780 	if (rc != 0)
781 		return rc;
782 	else if (!enfi.enfi_dpcpu_fw_ids_valid)
783 		return ENOTSUP;
784 
785 	/*
786 	 * Firmware variant can be uniquely identified by the RxDPCPU
787 	 * firmware id
788 	 */
789 	switch (enfi.enfi_rx_dpcpu_fw_id) {
790 	case EFX_RXDP_FULL_FEATURED_FW_ID:
791 		*efv = EFX_FW_VARIANT_FULL_FEATURED;
792 		break;
793 
794 	case EFX_RXDP_LOW_LATENCY_FW_ID:
795 		*efv = EFX_FW_VARIANT_LOW_LATENCY;
796 		break;
797 
798 	case EFX_RXDP_PACKED_STREAM_FW_ID:
799 		*efv = EFX_FW_VARIANT_PACKED_STREAM;
800 		break;
801 
802 	default:
803 		/*
804 		 * Other firmware variants are not considered, since they are
805 		 * not supported in the device parameters
806 		 */
807 		*efv = EFX_FW_VARIANT_DONT_CARE;
808 		break;
809 	}
810 
811 	return 0;
812 }
813 
814 static const char *
815 sfc_fw_variant2str(efx_fw_variant_t efv)
816 {
817 	switch (efv) {
818 	case EFX_RXDP_FULL_FEATURED_FW_ID:
819 		return SFC_KVARG_FW_VARIANT_FULL_FEATURED;
820 	case EFX_RXDP_LOW_LATENCY_FW_ID:
821 		return SFC_KVARG_FW_VARIANT_LOW_LATENCY;
822 	case EFX_RXDP_PACKED_STREAM_FW_ID:
823 		return SFC_KVARG_FW_VARIANT_PACKED_STREAM;
824 	default:
825 		return "unknown";
826 	}
827 }
828 
829 static int
830 sfc_nic_probe(struct sfc_adapter *sa)
831 {
832 	efx_nic_t *enp = sa->nic;
833 	efx_fw_variant_t preferred_efv;
834 	efx_fw_variant_t efv;
835 	int rc;
836 
837 	preferred_efv = EFX_FW_VARIANT_DONT_CARE;
838 	rc = sfc_kvargs_process(sa, SFC_KVARG_FW_VARIANT,
839 				sfc_kvarg_fv_variant_handler,
840 				&preferred_efv);
841 	if (rc != 0) {
842 		sfc_err(sa, "invalid %s parameter value", SFC_KVARG_FW_VARIANT);
843 		return rc;
844 	}
845 
846 	rc = efx_nic_probe(enp, preferred_efv);
847 	if (rc == EACCES) {
848 		/* Unprivileged functions cannot set FW variant */
849 		rc = efx_nic_probe(enp, EFX_FW_VARIANT_DONT_CARE);
850 	}
851 	if (rc != 0)
852 		return rc;
853 
854 	rc = sfc_get_fw_variant(sa, &efv);
855 	if (rc == ENOTSUP) {
856 		sfc_warn(sa, "FW variant can not be obtained");
857 		return 0;
858 	}
859 	if (rc != 0)
860 		return rc;
861 
862 	/* Check that firmware variant was changed to the requested one */
863 	if (preferred_efv != EFX_FW_VARIANT_DONT_CARE && preferred_efv != efv) {
864 		sfc_warn(sa, "FW variant has not changed to the requested %s",
865 			 sfc_fw_variant2str(preferred_efv));
866 	}
867 
868 	sfc_notice(sa, "running FW variant is %s", sfc_fw_variant2str(efv));
869 
870 	return 0;
871 }
872 
873 int
874 sfc_probe(struct sfc_adapter *sa)
875 {
876 	struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(sa->eth_dev);
877 	unsigned int membar;
878 	efx_nic_t *enp;
879 	int rc;
880 
881 	sfc_log_init(sa, "entry");
882 
883 	SFC_ASSERT(sfc_adapter_is_locked(sa));
884 
885 	sa->socket_id = rte_socket_id();
886 	rte_atomic32_init(&sa->restart_required);
887 
888 	sfc_log_init(sa, "get family");
889 	rc = efx_family(pci_dev->id.vendor_id, pci_dev->id.device_id,
890 			&sa->family, &membar);
891 	if (rc != 0)
892 		goto fail_family;
893 	sfc_log_init(sa, "family is %u, membar is %u", sa->family, membar);
894 
895 	sfc_log_init(sa, "init mem bar");
896 	rc = sfc_mem_bar_init(sa, membar);
897 	if (rc != 0)
898 		goto fail_mem_bar_init;
899 
900 	sfc_log_init(sa, "create nic");
901 	rte_spinlock_init(&sa->nic_lock);
902 	rc = efx_nic_create(sa->family, (efsys_identifier_t *)sa,
903 			    &sa->mem_bar, &sa->nic_lock, &enp);
904 	if (rc != 0)
905 		goto fail_nic_create;
906 	sa->nic = enp;
907 
908 	rc = sfc_mcdi_init(sa);
909 	if (rc != 0)
910 		goto fail_mcdi_init;
911 
912 	sfc_log_init(sa, "probe nic");
913 	rc = sfc_nic_probe(sa);
914 	if (rc != 0)
915 		goto fail_nic_probe;
916 
917 	sfc_log_init(sa, "done");
918 	return 0;
919 
920 fail_nic_probe:
921 	sfc_mcdi_fini(sa);
922 
923 fail_mcdi_init:
924 	sfc_log_init(sa, "destroy nic");
925 	sa->nic = NULL;
926 	efx_nic_destroy(enp);
927 
928 fail_nic_create:
929 	sfc_mem_bar_fini(sa);
930 
931 fail_mem_bar_init:
932 fail_family:
933 	sfc_log_init(sa, "failed %d", rc);
934 	return rc;
935 }
936 
937 void
938 sfc_unprobe(struct sfc_adapter *sa)
939 {
940 	efx_nic_t *enp = sa->nic;
941 
942 	sfc_log_init(sa, "entry");
943 
944 	SFC_ASSERT(sfc_adapter_is_locked(sa));
945 
946 	sfc_log_init(sa, "unprobe nic");
947 	efx_nic_unprobe(enp);
948 
949 	sfc_mcdi_fini(sa);
950 
951 	/*
952 	 * Make sure there is no pending alarm to restart since we are
953 	 * going to free device private which is passed as the callback
954 	 * opaque data. A new alarm cannot be scheduled since MCDI is
955 	 * shut down.
956 	 */
957 	rte_eal_alarm_cancel(sfc_restart_if_required, sa);
958 
959 	sfc_log_init(sa, "destroy nic");
960 	sa->nic = NULL;
961 	efx_nic_destroy(enp);
962 
963 	sfc_mem_bar_fini(sa);
964 
965 	sfc_flow_fini(sa);
966 	sa->state = SFC_ADAPTER_UNINITIALIZED;
967 }
968 
969 uint32_t
970 sfc_register_logtype(struct sfc_adapter *sa, const char *lt_prefix_str,
971 		     uint32_t ll_default)
972 {
973 	size_t lt_prefix_str_size = strlen(lt_prefix_str);
974 	size_t lt_str_size_max;
975 	char *lt_str = NULL;
976 	int ret;
977 
978 	if (SIZE_MAX - PCI_PRI_STR_SIZE - 1 > lt_prefix_str_size) {
979 		++lt_prefix_str_size; /* Reserve space for prefix separator */
980 		lt_str_size_max = lt_prefix_str_size + PCI_PRI_STR_SIZE + 1;
981 	} else {
982 		return RTE_LOGTYPE_PMD;
983 	}
984 
985 	lt_str = rte_zmalloc("logtype_str", lt_str_size_max, 0);
986 	if (lt_str == NULL)
987 		return RTE_LOGTYPE_PMD;
988 
989 	strncpy(lt_str, lt_prefix_str, lt_prefix_str_size);
990 	lt_str[lt_prefix_str_size - 1] = '.';
991 	rte_pci_device_name(&sa->pci_addr, lt_str + lt_prefix_str_size,
992 			    lt_str_size_max - lt_prefix_str_size);
993 	lt_str[lt_str_size_max - 1] = '\0';
994 
995 	ret = rte_log_register_type_and_pick_level(lt_str, ll_default);
996 	rte_free(lt_str);
997 
998 	return (ret < 0) ? RTE_LOGTYPE_PMD : ret;
999 }
1000