2 * Copyright (c) 2007-2015 Solarflare Communications Inc.
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
8 * 1. Redistributions of source code must retain the above copyright notice,
9 * this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright notice,
11 * this list of conditions and the following disclaimer in the documentation
12 * and/or other materials provided with the distribution.
14 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
15 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
16 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
17 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
18 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
19 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
20 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
21 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
22 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
23 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
24 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 * The views and conclusions contained in the software and documentation are
27 * those of the authors and should not be interpreted as representing official
28 * policies, either expressed or implied, of the FreeBSD Project.
31 #include <sys/cdefs.h>
32 __FBSDID("$FreeBSD$");
37 __checkReturn efx_rc_t
41 __out efx_family_t *efp)
43 if (venid == EFX_PCI_VENID_SFC) {
46 case EFX_PCI_DEVID_FALCON:
47 *efp = EFX_FAMILY_FALCON;
49 #endif /* EFSYS_OPT_FALCON */
52 case EFX_PCI_DEVID_SIENA_F1_UNINIT:
54 * Hardware default for PF0 of uninitialised Siena.
55 * manftest must be able to cope with this device id.
57 *efp = EFX_FAMILY_SIENA;
60 case EFX_PCI_DEVID_BETHPAGE:
61 case EFX_PCI_DEVID_SIENA:
62 *efp = EFX_FAMILY_SIENA;
64 #endif /* EFSYS_OPT_SIENA */
66 #if EFSYS_OPT_HUNTINGTON
67 case EFX_PCI_DEVID_HUNTINGTON_PF_UNINIT:
69 * Hardware default for PF0 of uninitialised Huntington.
70 * manftest must be able to cope with this device id.
72 *efp = EFX_FAMILY_HUNTINGTON;
75 case EFX_PCI_DEVID_FARMINGDALE:
76 case EFX_PCI_DEVID_GREENPORT:
77 *efp = EFX_FAMILY_HUNTINGTON;
80 case EFX_PCI_DEVID_FARMINGDALE_VF:
81 case EFX_PCI_DEVID_GREENPORT_VF:
82 *efp = EFX_FAMILY_HUNTINGTON;
84 #endif /* EFSYS_OPT_HUNTINGTON */
87 case EFX_PCI_DEVID_MEDFORD_PF_UNINIT:
89 * Hardware default for PF0 of uninitialised Medford.
90 * manftest must be able to cope with this device id.
92 *efp = EFX_FAMILY_MEDFORD;
95 case EFX_PCI_DEVID_MEDFORD:
96 *efp = EFX_FAMILY_MEDFORD;
99 case EFX_PCI_DEVID_MEDFORD_VF:
100 *efp = EFX_FAMILY_MEDFORD;
102 #endif /* EFSYS_OPT_MEDFORD */
109 *efp = EFX_FAMILY_INVALID;
114 * To support clients which aren't provided with any PCI context infer
115 * the hardware family by inspecting the hardware. Obviously the caller
116 * must be damn sure they're really talking to a supported device.
118 __checkReturn efx_rc_t
120 __in efsys_bar_t *esbp,
121 __out efx_family_t *efp)
125 unsigned int portnum;
128 EFSYS_BAR_READO(esbp, FR_AZ_CS_DEBUG_REG_OFST, &oword, B_TRUE);
129 portnum = EFX_OWORD_FIELD(oword, FRF_CZ_CS_PORT_NUM);
130 if ((portnum == 1) || (portnum == 2)) {
132 family = EFX_FAMILY_SIENA;
135 } else if (portnum == 0) {
139 EFSYS_BAR_READD(esbp, ER_DZ_BIU_HW_REV_ID_REG_OFST, &dword,
141 hw_rev = EFX_DWORD_FIELD(dword, ERF_DZ_HW_REV_ID);
142 if (hw_rev == ER_DZ_BIU_HW_REV_ID_REG_RESET) {
143 #if EFSYS_OPT_HUNTINGTON || EFSYS_OPT_MEDFORD
145 * BIU_HW_REV_ID is the same for Huntington and Medford.
146 * Assume Huntington, as Medford is very similar.
148 family = EFX_FAMILY_HUNTINGTON;
153 family = EFX_FAMILY_FALCON;
167 EFSYS_PROBE1(fail1, efx_rc_t, rc);
172 #define EFX_BIU_MAGIC0 0x01234567
173 #define EFX_BIU_MAGIC1 0xfedcba98
175 __checkReturn efx_rc_t
183 * Write magic values to scratch registers 0 and 1, then
184 * verify that the values were written correctly. Interleave
185 * the accesses to ensure that the BIU is not just reading
186 * back the cached value that was last written.
188 EFX_POPULATE_OWORD_1(oword, FRF_AZ_DRIVER_DW0, EFX_BIU_MAGIC0);
189 EFX_BAR_TBL_WRITEO(enp, FR_AZ_DRIVER_REG, 0, &oword, B_TRUE);
191 EFX_POPULATE_OWORD_1(oword, FRF_AZ_DRIVER_DW0, EFX_BIU_MAGIC1);
192 EFX_BAR_TBL_WRITEO(enp, FR_AZ_DRIVER_REG, 1, &oword, B_TRUE);
194 EFX_BAR_TBL_READO(enp, FR_AZ_DRIVER_REG, 0, &oword, B_TRUE);
195 if (EFX_OWORD_FIELD(oword, FRF_AZ_DRIVER_DW0) != EFX_BIU_MAGIC0) {
200 EFX_BAR_TBL_READO(enp, FR_AZ_DRIVER_REG, 1, &oword, B_TRUE);
201 if (EFX_OWORD_FIELD(oword, FRF_AZ_DRIVER_DW0) != EFX_BIU_MAGIC1) {
207 * Perform the same test, with the values swapped. This
208 * ensures that subsequent tests don't start with the correct
209 * values already written into the scratch registers.
211 EFX_POPULATE_OWORD_1(oword, FRF_AZ_DRIVER_DW0, EFX_BIU_MAGIC1);
212 EFX_BAR_TBL_WRITEO(enp, FR_AZ_DRIVER_REG, 0, &oword, B_TRUE);
214 EFX_POPULATE_OWORD_1(oword, FRF_AZ_DRIVER_DW0, EFX_BIU_MAGIC0);
215 EFX_BAR_TBL_WRITEO(enp, FR_AZ_DRIVER_REG, 1, &oword, B_TRUE);
217 EFX_BAR_TBL_READO(enp, FR_AZ_DRIVER_REG, 0, &oword, B_TRUE);
218 if (EFX_OWORD_FIELD(oword, FRF_AZ_DRIVER_DW0) != EFX_BIU_MAGIC1) {
223 EFX_BAR_TBL_READO(enp, FR_AZ_DRIVER_REG, 1, &oword, B_TRUE);
224 if (EFX_OWORD_FIELD(oword, FRF_AZ_DRIVER_DW0) != EFX_BIU_MAGIC0) {
238 EFSYS_PROBE1(fail1, efx_rc_t, rc);
245 static efx_nic_ops_t __efx_nic_falcon_ops = {
246 falcon_nic_probe, /* eno_probe */
247 NULL, /* eno_board_cfg */
248 NULL, /* eno_set_drv_limits */
249 falcon_nic_reset, /* eno_reset */
250 falcon_nic_init, /* eno_init */
251 NULL, /* eno_get_vi_pool */
252 NULL, /* eno_get_bar_region */
254 falcon_sram_test, /* eno_sram_test */
255 falcon_nic_register_test, /* eno_register_test */
256 #endif /* EFSYS_OPT_DIAG */
257 falcon_nic_fini, /* eno_fini */
258 falcon_nic_unprobe, /* eno_unprobe */
261 #endif /* EFSYS_OPT_FALCON */
265 static efx_nic_ops_t __efx_nic_siena_ops = {
266 siena_nic_probe, /* eno_probe */
267 NULL, /* eno_board_cfg */
268 NULL, /* eno_set_drv_limits */
269 siena_nic_reset, /* eno_reset */
270 siena_nic_init, /* eno_init */
271 NULL, /* eno_get_vi_pool */
272 NULL, /* eno_get_bar_region */
274 siena_sram_test, /* eno_sram_test */
275 siena_nic_register_test, /* eno_register_test */
276 #endif /* EFSYS_OPT_DIAG */
277 siena_nic_fini, /* eno_fini */
278 siena_nic_unprobe, /* eno_unprobe */
281 #endif /* EFSYS_OPT_SIENA */
283 #if EFSYS_OPT_HUNTINGTON
285 static efx_nic_ops_t __efx_nic_hunt_ops = {
286 ef10_nic_probe, /* eno_probe */
287 hunt_board_cfg, /* eno_board_cfg */
288 ef10_nic_set_drv_limits, /* eno_set_drv_limits */
289 ef10_nic_reset, /* eno_reset */
290 ef10_nic_init, /* eno_init */
291 ef10_nic_get_vi_pool, /* eno_get_vi_pool */
292 ef10_nic_get_bar_region, /* eno_get_bar_region */
294 ef10_sram_test, /* eno_sram_test */
295 ef10_nic_register_test, /* eno_register_test */
296 #endif /* EFSYS_OPT_DIAG */
297 ef10_nic_fini, /* eno_fini */
298 ef10_nic_unprobe, /* eno_unprobe */
301 #endif /* EFSYS_OPT_HUNTINGTON */
303 #if EFSYS_OPT_MEDFORD
305 static efx_nic_ops_t __efx_nic_medford_ops = {
306 ef10_nic_probe, /* eno_probe */
307 medford_board_cfg, /* eno_board_cfg */
308 ef10_nic_set_drv_limits, /* eno_set_drv_limits */
309 ef10_nic_reset, /* eno_reset */
310 ef10_nic_init, /* eno_init */
311 ef10_nic_get_vi_pool, /* eno_get_vi_pool */
312 ef10_nic_get_bar_region, /* eno_get_bar_region */
314 ef10_sram_test, /* eno_sram_test */
315 ef10_nic_register_test, /* eno_register_test */
316 #endif /* EFSYS_OPT_DIAG */
317 ef10_nic_fini, /* eno_fini */
318 ef10_nic_unprobe, /* eno_unprobe */
321 #endif /* EFSYS_OPT_MEDFORD */
324 __checkReturn efx_rc_t
326 __in efx_family_t family,
327 __in efsys_identifier_t *esip,
328 __in efsys_bar_t *esbp,
329 __in efsys_lock_t *eslp,
330 __deref_out efx_nic_t **enpp)
335 EFSYS_ASSERT3U(family, >, EFX_FAMILY_INVALID);
336 EFSYS_ASSERT3U(family, <, EFX_FAMILY_NTYPES);
338 /* Allocate a NIC object */
339 EFSYS_KMEM_ALLOC(esip, sizeof (efx_nic_t), enp);
346 enp->en_magic = EFX_NIC_MAGIC;
350 case EFX_FAMILY_FALCON:
351 enp->en_enop = (efx_nic_ops_t *)&__efx_nic_falcon_ops;
352 enp->en_features = 0;
354 #endif /* EFSYS_OPT_FALCON */
357 case EFX_FAMILY_SIENA:
358 enp->en_enop = (efx_nic_ops_t *)&__efx_nic_siena_ops;
361 EFX_FEATURE_LFSR_HASH_INSERT |
362 EFX_FEATURE_LINK_EVENTS |
363 EFX_FEATURE_PERIODIC_MAC_STATS |
366 EFX_FEATURE_LOOKAHEAD_SPLIT |
367 EFX_FEATURE_MAC_HEADER_FILTERS |
368 EFX_FEATURE_TX_SRC_FILTERS;
370 #endif /* EFSYS_OPT_SIENA */
372 #if EFSYS_OPT_HUNTINGTON
373 case EFX_FAMILY_HUNTINGTON:
374 enp->en_enop = (efx_nic_ops_t *)&__efx_nic_hunt_ops;
375 /* FIXME: Add WOL support */
378 EFX_FEATURE_LINK_EVENTS |
379 EFX_FEATURE_PERIODIC_MAC_STATS |
381 EFX_FEATURE_MAC_HEADER_FILTERS |
382 EFX_FEATURE_MCDI_DMA |
383 EFX_FEATURE_PIO_BUFFERS |
384 EFX_FEATURE_FW_ASSISTED_TSO |
385 EFX_FEATURE_FW_ASSISTED_TSO_V2;
387 #endif /* EFSYS_OPT_HUNTINGTON */
389 #if EFSYS_OPT_MEDFORD
390 case EFX_FAMILY_MEDFORD:
391 enp->en_enop = (efx_nic_ops_t *)&__efx_nic_medford_ops;
393 * FW_ASSISTED_TSO ommitted as Medford only supports firmware
394 * assisted TSO version 2, not the v1 scheme used on Huntington.
398 EFX_FEATURE_LINK_EVENTS |
399 EFX_FEATURE_PERIODIC_MAC_STATS |
401 EFX_FEATURE_MAC_HEADER_FILTERS |
402 EFX_FEATURE_MCDI_DMA |
403 EFX_FEATURE_PIO_BUFFERS;
405 #endif /* EFSYS_OPT_MEDFORD */
412 enp->en_family = family;
426 /* Free the NIC object */
427 EFSYS_KMEM_FREE(esip, sizeof (efx_nic_t), enp);
430 EFSYS_PROBE1(fail1, efx_rc_t, rc);
435 __checkReturn efx_rc_t
442 EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
444 EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_MCDI);
445 #endif /* EFSYS_OPT_MCDI */
446 EFSYS_ASSERT(!(enp->en_mod_flags & EFX_MOD_PROBE));
449 if ((rc = enop->eno_probe(enp)) != 0)
452 if ((rc = efx_phy_probe(enp)) != 0)
455 enp->en_mod_flags |= EFX_MOD_PROBE;
462 enop->eno_unprobe(enp);
465 EFSYS_PROBE1(fail1, efx_rc_t, rc);
470 __checkReturn efx_rc_t
471 efx_nic_set_drv_limits(
472 __inout efx_nic_t *enp,
473 __in efx_drv_limits_t *edlp)
475 efx_nic_ops_t *enop = enp->en_enop;
478 EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
479 EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_PROBE);
481 if (enop->eno_set_drv_limits != NULL) {
482 if ((rc = enop->eno_set_drv_limits(enp, edlp)) != 0)
489 EFSYS_PROBE1(fail1, efx_rc_t, rc);
494 __checkReturn efx_rc_t
495 efx_nic_get_bar_region(
497 __in efx_nic_region_t region,
498 __out uint32_t *offsetp,
501 efx_nic_ops_t *enop = enp->en_enop;
504 EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
505 EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_PROBE);
506 EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_NIC);
508 if (enop->eno_get_bar_region == NULL) {
512 if ((rc = (enop->eno_get_bar_region)(enp,
513 region, offsetp, sizep)) != 0) {
523 EFSYS_PROBE1(fail1, efx_rc_t, rc);
529 __checkReturn efx_rc_t
532 __out uint32_t *evq_countp,
533 __out uint32_t *rxq_countp,
534 __out uint32_t *txq_countp)
536 efx_nic_ops_t *enop = enp->en_enop;
537 efx_nic_cfg_t *encp = &enp->en_nic_cfg;
540 EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
541 EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_PROBE);
542 EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_NIC);
544 if (enop->eno_get_vi_pool != NULL) {
545 uint32_t vi_count = 0;
547 if ((rc = (enop->eno_get_vi_pool)(enp, &vi_count)) != 0)
550 *evq_countp = vi_count;
551 *rxq_countp = vi_count;
552 *txq_countp = vi_count;
554 /* Use NIC limits as default value */
555 *evq_countp = encp->enc_evq_limit;
556 *rxq_countp = encp->enc_rxq_limit;
557 *txq_countp = encp->enc_txq_limit;
563 EFSYS_PROBE1(fail1, efx_rc_t, rc);
569 __checkReturn efx_rc_t
573 efx_nic_ops_t *enop = enp->en_enop;
576 EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
577 EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_PROBE);
579 if (enp->en_mod_flags & EFX_MOD_NIC) {
584 if ((rc = enop->eno_init(enp)) != 0)
587 enp->en_mod_flags |= EFX_MOD_NIC;
594 EFSYS_PROBE1(fail1, efx_rc_t, rc);
603 efx_nic_ops_t *enop = enp->en_enop;
605 EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
606 EFSYS_ASSERT(enp->en_mod_flags & EFX_MOD_PROBE);
607 EFSYS_ASSERT(enp->en_mod_flags & EFX_MOD_NIC);
608 EFSYS_ASSERT(!(enp->en_mod_flags & EFX_MOD_INTR));
609 EFSYS_ASSERT(!(enp->en_mod_flags & EFX_MOD_EV));
610 EFSYS_ASSERT(!(enp->en_mod_flags & EFX_MOD_RX));
611 EFSYS_ASSERT(!(enp->en_mod_flags & EFX_MOD_TX));
615 enp->en_mod_flags &= ~EFX_MOD_NIC;
622 efx_nic_ops_t *enop = enp->en_enop;
624 EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
626 EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_MCDI);
627 #endif /* EFSYS_OPT_MCDI */
628 EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_PROBE);
629 EFSYS_ASSERT(!(enp->en_mod_flags & EFX_MOD_NIC));
630 EFSYS_ASSERT(!(enp->en_mod_flags & EFX_MOD_INTR));
631 EFSYS_ASSERT(!(enp->en_mod_flags & EFX_MOD_EV));
632 EFSYS_ASSERT(!(enp->en_mod_flags & EFX_MOD_RX));
633 EFSYS_ASSERT(!(enp->en_mod_flags & EFX_MOD_TX));
635 efx_phy_unprobe(enp);
637 enop->eno_unprobe(enp);
639 enp->en_mod_flags &= ~EFX_MOD_PROBE;
646 efsys_identifier_t *esip = enp->en_esip;
648 EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
649 EFSYS_ASSERT3U(enp->en_mod_flags, ==, 0);
660 /* Free the NIC object */
661 EFSYS_KMEM_FREE(esip, sizeof (efx_nic_t), enp);
664 __checkReturn efx_rc_t
668 efx_nic_ops_t *enop = enp->en_enop;
669 unsigned int mod_flags;
672 EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
673 EFSYS_ASSERT(enp->en_mod_flags & EFX_MOD_PROBE);
675 * All modules except the MCDI, PROBE, NVRAM, VPD, MON, LIC
676 * (which we do not reset here) must have been shut down or never
679 * A rule of thumb here is: If the controller or MC reboots, is *any*
680 * state lost. If it's lost and needs reapplying, then the module
681 * *must* not be initialised during the reset.
683 mod_flags = enp->en_mod_flags;
684 mod_flags &= ~(EFX_MOD_MCDI | EFX_MOD_PROBE | EFX_MOD_NVRAM |
685 EFX_MOD_VPD | EFX_MOD_MON | EFX_MOD_LIC);
686 EFSYS_ASSERT3U(mod_flags, ==, 0);
687 if (mod_flags != 0) {
692 if ((rc = enop->eno_reset(enp)) != 0)
695 enp->en_reset_flags |= EFX_RESET_MAC;
702 EFSYS_PROBE1(fail1, efx_rc_t, rc);
707 const efx_nic_cfg_t *
711 EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
713 return (&(enp->en_nic_cfg));
718 __checkReturn efx_rc_t
719 efx_nic_register_test(
722 efx_nic_ops_t *enop = enp->en_enop;
725 EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
726 EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_PROBE);
727 EFSYS_ASSERT(!(enp->en_mod_flags & EFX_MOD_NIC));
729 if ((rc = enop->eno_register_test(enp)) != 0)
735 EFSYS_PROBE1(fail1, efx_rc_t, rc);
740 __checkReturn efx_rc_t
741 efx_nic_test_registers(
743 __in efx_register_set_t *rsp,
747 efx_oword_t original;
753 /* This function is only suitable for registers */
754 EFSYS_ASSERT(rsp->rows == 1);
756 /* bit sweep on and off */
757 EFSYS_BAR_READO(enp->en_esbp, rsp->address, &original,
759 for (bit = 0; bit < 128; bit++) {
760 /* Is this bit in the mask? */
761 if (~(rsp->mask.eo_u32[bit >> 5]) & (1 << bit))
764 /* Test this bit can be set in isolation */
766 EFX_AND_OWORD(reg, rsp->mask);
767 EFX_SET_OWORD_BIT(reg, bit);
769 EFSYS_BAR_WRITEO(enp->en_esbp, rsp->address, ®,
771 EFSYS_BAR_READO(enp->en_esbp, rsp->address, &buf,
774 EFX_AND_OWORD(buf, rsp->mask);
775 if (memcmp(®, &buf, sizeof (reg))) {
780 /* Test this bit can be cleared in isolation */
781 EFX_OR_OWORD(reg, rsp->mask);
782 EFX_CLEAR_OWORD_BIT(reg, bit);
784 EFSYS_BAR_WRITEO(enp->en_esbp, rsp->address, ®,
786 EFSYS_BAR_READO(enp->en_esbp, rsp->address, &buf,
789 EFX_AND_OWORD(buf, rsp->mask);
790 if (memcmp(®, &buf, sizeof (reg))) {
796 /* Restore the old value */
797 EFSYS_BAR_WRITEO(enp->en_esbp, rsp->address, &original,
809 EFSYS_PROBE1(fail1, efx_rc_t, rc);
811 /* Restore the old value */
812 EFSYS_BAR_WRITEO(enp->en_esbp, rsp->address, &original, B_TRUE);
817 __checkReturn efx_rc_t
820 __in efx_register_set_t *rsp,
821 __in efx_pattern_type_t pattern,
824 efx_sram_pattern_fn_t func;
826 unsigned int address;
831 EFSYS_ASSERT(pattern < EFX_PATTERN_NTYPES);
832 func = __efx_sram_pattern_fns[pattern];
836 address = rsp->address;
837 for (index = 0; index < rsp->rows; ++index) {
838 func(2 * index + 0, B_FALSE, ®.eo_qword[0]);
839 func(2 * index + 1, B_FALSE, ®.eo_qword[1]);
840 EFX_AND_OWORD(reg, rsp->mask);
841 EFSYS_BAR_WRITEO(enp->en_esbp, address, ®, B_TRUE);
843 address += rsp->step;
847 address = rsp->address;
848 for (index = 0; index < rsp->rows; ++index) {
849 func(2 * index + 0, B_FALSE, ®.eo_qword[0]);
850 func(2 * index + 1, B_FALSE, ®.eo_qword[1]);
851 EFX_AND_OWORD(reg, rsp->mask);
852 EFSYS_BAR_READO(enp->en_esbp, address, &buf, B_TRUE);
853 if (memcmp(®, &buf, sizeof (reg))) {
858 address += rsp->step;
868 EFSYS_PROBE1(fail1, efx_rc_t, rc);
873 #endif /* EFSYS_OPT_DIAG */
875 #if EFSYS_OPT_LOOPBACK
879 __in efx_loopback_kind_t loopback_kind,
880 __out efx_qword_t *maskp)
884 EFSYS_ASSERT3U(loopback_kind, <, EFX_LOOPBACK_NKINDS);
885 EFSYS_ASSERT(maskp != NULL);
887 /* Assert the MC_CMD_LOOPBACK and EFX_LOOPBACK namespace agree */
888 EFX_STATIC_ASSERT(MC_CMD_LOOPBACK_NONE == EFX_LOOPBACK_OFF);
889 EFX_STATIC_ASSERT(MC_CMD_LOOPBACK_DATA == EFX_LOOPBACK_DATA);
890 EFX_STATIC_ASSERT(MC_CMD_LOOPBACK_GMAC == EFX_LOOPBACK_GMAC);
891 EFX_STATIC_ASSERT(MC_CMD_LOOPBACK_XGMII == EFX_LOOPBACK_XGMII);
892 EFX_STATIC_ASSERT(MC_CMD_LOOPBACK_XGXS == EFX_LOOPBACK_XGXS);
893 EFX_STATIC_ASSERT(MC_CMD_LOOPBACK_XAUI == EFX_LOOPBACK_XAUI);
894 EFX_STATIC_ASSERT(MC_CMD_LOOPBACK_GMII == EFX_LOOPBACK_GMII);
895 EFX_STATIC_ASSERT(MC_CMD_LOOPBACK_SGMII == EFX_LOOPBACK_SGMII);
896 EFX_STATIC_ASSERT(MC_CMD_LOOPBACK_XGBR == EFX_LOOPBACK_XGBR);
897 EFX_STATIC_ASSERT(MC_CMD_LOOPBACK_XFI == EFX_LOOPBACK_XFI);
898 EFX_STATIC_ASSERT(MC_CMD_LOOPBACK_XAUI_FAR == EFX_LOOPBACK_XAUI_FAR);
899 EFX_STATIC_ASSERT(MC_CMD_LOOPBACK_GMII_FAR == EFX_LOOPBACK_GMII_FAR);
900 EFX_STATIC_ASSERT(MC_CMD_LOOPBACK_SGMII_FAR == EFX_LOOPBACK_SGMII_FAR);
901 EFX_STATIC_ASSERT(MC_CMD_LOOPBACK_XFI_FAR == EFX_LOOPBACK_XFI_FAR);
902 EFX_STATIC_ASSERT(MC_CMD_LOOPBACK_GPHY == EFX_LOOPBACK_GPHY);
903 EFX_STATIC_ASSERT(MC_CMD_LOOPBACK_PHYXS == EFX_LOOPBACK_PHY_XS);
904 EFX_STATIC_ASSERT(MC_CMD_LOOPBACK_PCS == EFX_LOOPBACK_PCS);
905 EFX_STATIC_ASSERT(MC_CMD_LOOPBACK_PMAPMD == EFX_LOOPBACK_PMA_PMD);
906 EFX_STATIC_ASSERT(MC_CMD_LOOPBACK_XPORT == EFX_LOOPBACK_XPORT);
907 EFX_STATIC_ASSERT(MC_CMD_LOOPBACK_XGMII_WS == EFX_LOOPBACK_XGMII_WS);
908 EFX_STATIC_ASSERT(MC_CMD_LOOPBACK_XAUI_WS == EFX_LOOPBACK_XAUI_WS);
909 EFX_STATIC_ASSERT(MC_CMD_LOOPBACK_XAUI_WS_FAR ==
910 EFX_LOOPBACK_XAUI_WS_FAR);
911 EFX_STATIC_ASSERT(MC_CMD_LOOPBACK_XAUI_WS_NEAR ==
912 EFX_LOOPBACK_XAUI_WS_NEAR);
913 EFX_STATIC_ASSERT(MC_CMD_LOOPBACK_GMII_WS == EFX_LOOPBACK_GMII_WS);
914 EFX_STATIC_ASSERT(MC_CMD_LOOPBACK_XFI_WS == EFX_LOOPBACK_XFI_WS);
915 EFX_STATIC_ASSERT(MC_CMD_LOOPBACK_XFI_WS_FAR ==
916 EFX_LOOPBACK_XFI_WS_FAR);
917 EFX_STATIC_ASSERT(MC_CMD_LOOPBACK_PHYXS_WS == EFX_LOOPBACK_PHYXS_WS);
918 EFX_STATIC_ASSERT(MC_CMD_LOOPBACK_PMA_INT == EFX_LOOPBACK_PMA_INT);
919 EFX_STATIC_ASSERT(MC_CMD_LOOPBACK_SD_NEAR == EFX_LOOPBACK_SD_NEAR);
920 EFX_STATIC_ASSERT(MC_CMD_LOOPBACK_SD_FAR == EFX_LOOPBACK_SD_FAR);
921 EFX_STATIC_ASSERT(MC_CMD_LOOPBACK_PMA_INT_WS ==
922 EFX_LOOPBACK_PMA_INT_WS);
923 EFX_STATIC_ASSERT(MC_CMD_LOOPBACK_SD_FEP2_WS ==
924 EFX_LOOPBACK_SD_FEP2_WS);
925 EFX_STATIC_ASSERT(MC_CMD_LOOPBACK_SD_FEP1_5_WS ==
926 EFX_LOOPBACK_SD_FEP1_5_WS);
927 EFX_STATIC_ASSERT(MC_CMD_LOOPBACK_SD_FEP_WS == EFX_LOOPBACK_SD_FEP_WS);
928 EFX_STATIC_ASSERT(MC_CMD_LOOPBACK_SD_FES_WS == EFX_LOOPBACK_SD_FES_WS);
930 /* Build bitmask of possible loopback types */
931 EFX_ZERO_QWORD(mask);
933 if ((loopback_kind == EFX_LOOPBACK_KIND_OFF) ||
934 (loopback_kind == EFX_LOOPBACK_KIND_ALL)) {
935 EFX_SET_QWORD_BIT(mask, EFX_LOOPBACK_OFF);
938 if ((loopback_kind == EFX_LOOPBACK_KIND_MAC) ||
939 (loopback_kind == EFX_LOOPBACK_KIND_ALL)) {
941 * The "MAC" grouping has historically been used by drivers to
942 * mean loopbacks supported by on-chip hardware. Keep that
943 * meaning here, and include on-chip PHY layer loopbacks.
945 EFX_SET_QWORD_BIT(mask, EFX_LOOPBACK_DATA);
946 EFX_SET_QWORD_BIT(mask, EFX_LOOPBACK_GMAC);
947 EFX_SET_QWORD_BIT(mask, EFX_LOOPBACK_XGMII);
948 EFX_SET_QWORD_BIT(mask, EFX_LOOPBACK_XGXS);
949 EFX_SET_QWORD_BIT(mask, EFX_LOOPBACK_XAUI);
950 EFX_SET_QWORD_BIT(mask, EFX_LOOPBACK_GMII);
951 EFX_SET_QWORD_BIT(mask, EFX_LOOPBACK_SGMII);
952 EFX_SET_QWORD_BIT(mask, EFX_LOOPBACK_XGBR);
953 EFX_SET_QWORD_BIT(mask, EFX_LOOPBACK_XFI);
954 EFX_SET_QWORD_BIT(mask, EFX_LOOPBACK_XAUI_FAR);
955 EFX_SET_QWORD_BIT(mask, EFX_LOOPBACK_GMII_FAR);
956 EFX_SET_QWORD_BIT(mask, EFX_LOOPBACK_SGMII_FAR);
957 EFX_SET_QWORD_BIT(mask, EFX_LOOPBACK_XFI_FAR);
958 EFX_SET_QWORD_BIT(mask, EFX_LOOPBACK_PMA_INT);
959 EFX_SET_QWORD_BIT(mask, EFX_LOOPBACK_SD_NEAR);
960 EFX_SET_QWORD_BIT(mask, EFX_LOOPBACK_SD_FAR);
963 if ((loopback_kind == EFX_LOOPBACK_KIND_PHY) ||
964 (loopback_kind == EFX_LOOPBACK_KIND_ALL)) {
966 * The "PHY" grouping has historically been used by drivers to
967 * mean loopbacks supported by off-chip hardware. Keep that
970 EFX_SET_QWORD_BIT(mask, EFX_LOOPBACK_GPHY);
971 EFX_SET_QWORD_BIT(mask, EFX_LOOPBACK_PHY_XS);
972 EFX_SET_QWORD_BIT(mask, EFX_LOOPBACK_PCS);
973 EFX_SET_QWORD_BIT(mask, EFX_LOOPBACK_PMA_PMD);
979 __checkReturn efx_rc_t
980 efx_mcdi_get_loopback_modes(
983 efx_nic_cfg_t *encp = &(enp->en_nic_cfg);
985 uint8_t payload[MAX(MC_CMD_GET_LOOPBACK_MODES_IN_LEN,
986 MC_CMD_GET_LOOPBACK_MODES_OUT_LEN)];
991 (void) memset(payload, 0, sizeof (payload));
992 req.emr_cmd = MC_CMD_GET_LOOPBACK_MODES;
993 req.emr_in_buf = payload;
994 req.emr_in_length = MC_CMD_GET_LOOPBACK_MODES_IN_LEN;
995 req.emr_out_buf = payload;
996 req.emr_out_length = MC_CMD_GET_LOOPBACK_MODES_OUT_LEN;
998 efx_mcdi_execute(enp, &req);
1000 if (req.emr_rc != 0) {
1005 if (req.emr_out_length_used <
1006 MC_CMD_GET_LOOPBACK_MODES_OUT_SUGGESTED_OFST +
1007 MC_CMD_GET_LOOPBACK_MODES_OUT_SUGGESTED_LEN) {
1013 * We assert the MC_CMD_LOOPBACK and EFX_LOOPBACK namespaces agree
1014 * in efx_loopback_mask() and in siena_phy.c:siena_phy_get_link().
1016 efx_loopback_mask(EFX_LOOPBACK_KIND_ALL, &mask);
1019 *MCDI_OUT2(req, efx_qword_t, GET_LOOPBACK_MODES_OUT_SUGGESTED));
1021 modes = *MCDI_OUT2(req, efx_qword_t, GET_LOOPBACK_MODES_OUT_100M);
1022 EFX_AND_QWORD(modes, mask);
1023 encp->enc_loopback_types[EFX_LINK_100FDX] = modes;
1025 modes = *MCDI_OUT2(req, efx_qword_t, GET_LOOPBACK_MODES_OUT_1G);
1026 EFX_AND_QWORD(modes, mask);
1027 encp->enc_loopback_types[EFX_LINK_1000FDX] = modes;
1029 modes = *MCDI_OUT2(req, efx_qword_t, GET_LOOPBACK_MODES_OUT_10G);
1030 EFX_AND_QWORD(modes, mask);
1031 encp->enc_loopback_types[EFX_LINK_10000FDX] = modes;
1033 if (req.emr_out_length_used >=
1034 MC_CMD_GET_LOOPBACK_MODES_OUT_40G_OFST +
1035 MC_CMD_GET_LOOPBACK_MODES_OUT_40G_LEN) {
1036 /* Response includes 40G loopback modes */
1038 *MCDI_OUT2(req, efx_qword_t, GET_LOOPBACK_MODES_OUT_40G);
1039 EFX_AND_QWORD(modes, mask);
1040 encp->enc_loopback_types[EFX_LINK_40000FDX] = modes;
1043 EFX_ZERO_QWORD(modes);
1044 EFX_SET_QWORD_BIT(modes, EFX_LOOPBACK_OFF);
1045 EFX_OR_QWORD(modes, encp->enc_loopback_types[EFX_LINK_100FDX]);
1046 EFX_OR_QWORD(modes, encp->enc_loopback_types[EFX_LINK_1000FDX]);
1047 EFX_OR_QWORD(modes, encp->enc_loopback_types[EFX_LINK_10000FDX]);
1048 EFX_OR_QWORD(modes, encp->enc_loopback_types[EFX_LINK_40000FDX]);
1049 encp->enc_loopback_types[EFX_LINK_UNKNOWN] = modes;
1056 EFSYS_PROBE1(fail1, efx_rc_t, rc);
1061 #endif /* EFSYS_OPT_LOOPBACK */