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