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 #if EFSYS_OPT_PCIE_TUNE
472 __checkReturn efx_rc_t
477 EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
478 EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_PROBE);
479 EFSYS_ASSERT(!(enp->en_mod_flags & EFX_MOD_NIC));
482 if (enp->en_family == EFX_FAMILY_FALCON)
483 return (falcon_nic_pcie_tune(enp, nlanes));
488 __checkReturn efx_rc_t
489 efx_nic_pcie_extended_sync(
492 EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
493 EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_PROBE);
494 EFSYS_ASSERT(!(enp->en_mod_flags & EFX_MOD_NIC));
497 if (enp->en_family == EFX_FAMILY_SIENA)
498 return (siena_nic_pcie_extended_sync(enp));
504 #endif /* EFSYS_OPT_PCIE_TUNE */
506 __checkReturn efx_rc_t
507 efx_nic_set_drv_limits(
508 __inout efx_nic_t *enp,
509 __in efx_drv_limits_t *edlp)
511 efx_nic_ops_t *enop = enp->en_enop;
514 EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
515 EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_PROBE);
517 if (enop->eno_set_drv_limits != NULL) {
518 if ((rc = enop->eno_set_drv_limits(enp, edlp)) != 0)
525 EFSYS_PROBE1(fail1, efx_rc_t, rc);
530 __checkReturn efx_rc_t
531 efx_nic_get_bar_region(
533 __in efx_nic_region_t region,
534 __out uint32_t *offsetp,
537 efx_nic_ops_t *enop = enp->en_enop;
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_bar_region == NULL) {
548 if ((rc = (enop->eno_get_bar_region)(enp,
549 region, offsetp, sizep)) != 0) {
559 EFSYS_PROBE1(fail1, efx_rc_t, rc);
565 __checkReturn efx_rc_t
568 __out uint32_t *evq_countp,
569 __out uint32_t *rxq_countp,
570 __out uint32_t *txq_countp)
572 efx_nic_ops_t *enop = enp->en_enop;
573 efx_nic_cfg_t *encp = &enp->en_nic_cfg;
576 EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
577 EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_PROBE);
578 EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_NIC);
580 if (enop->eno_get_vi_pool != NULL) {
581 uint32_t vi_count = 0;
583 if ((rc = (enop->eno_get_vi_pool)(enp, &vi_count)) != 0)
586 *evq_countp = vi_count;
587 *rxq_countp = vi_count;
588 *txq_countp = vi_count;
590 /* Use NIC limits as default value */
591 *evq_countp = encp->enc_evq_limit;
592 *rxq_countp = encp->enc_rxq_limit;
593 *txq_countp = encp->enc_txq_limit;
599 EFSYS_PROBE1(fail1, efx_rc_t, rc);
605 __checkReturn efx_rc_t
609 efx_nic_ops_t *enop = enp->en_enop;
612 EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
613 EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_PROBE);
615 if (enp->en_mod_flags & EFX_MOD_NIC) {
620 if ((rc = enop->eno_init(enp)) != 0)
623 enp->en_mod_flags |= EFX_MOD_NIC;
630 EFSYS_PROBE1(fail1, efx_rc_t, rc);
639 efx_nic_ops_t *enop = enp->en_enop;
641 EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
642 EFSYS_ASSERT(enp->en_mod_flags & EFX_MOD_PROBE);
643 EFSYS_ASSERT(enp->en_mod_flags & EFX_MOD_NIC);
644 EFSYS_ASSERT(!(enp->en_mod_flags & EFX_MOD_INTR));
645 EFSYS_ASSERT(!(enp->en_mod_flags & EFX_MOD_EV));
646 EFSYS_ASSERT(!(enp->en_mod_flags & EFX_MOD_RX));
647 EFSYS_ASSERT(!(enp->en_mod_flags & EFX_MOD_TX));
651 enp->en_mod_flags &= ~EFX_MOD_NIC;
658 efx_nic_ops_t *enop = enp->en_enop;
660 EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
662 EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_MCDI);
663 #endif /* EFSYS_OPT_MCDI */
664 EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_PROBE);
665 EFSYS_ASSERT(!(enp->en_mod_flags & EFX_MOD_NIC));
666 EFSYS_ASSERT(!(enp->en_mod_flags & EFX_MOD_INTR));
667 EFSYS_ASSERT(!(enp->en_mod_flags & EFX_MOD_EV));
668 EFSYS_ASSERT(!(enp->en_mod_flags & EFX_MOD_RX));
669 EFSYS_ASSERT(!(enp->en_mod_flags & EFX_MOD_TX));
671 efx_phy_unprobe(enp);
673 enop->eno_unprobe(enp);
675 enp->en_mod_flags &= ~EFX_MOD_PROBE;
682 efsys_identifier_t *esip = enp->en_esip;
684 EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
685 EFSYS_ASSERT3U(enp->en_mod_flags, ==, 0);
696 /* Free the NIC object */
697 EFSYS_KMEM_FREE(esip, sizeof (efx_nic_t), enp);
700 __checkReturn efx_rc_t
704 efx_nic_ops_t *enop = enp->en_enop;
705 unsigned int mod_flags;
708 EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
709 EFSYS_ASSERT(enp->en_mod_flags & EFX_MOD_PROBE);
711 * All modules except the MCDI, PROBE, NVRAM, VPD, MON, LIC
712 * (which we do not reset here) must have been shut down or never
715 * A rule of thumb here is: If the controller or MC reboots, is *any*
716 * state lost. If it's lost and needs reapplying, then the module
717 * *must* not be initialised during the reset.
719 mod_flags = enp->en_mod_flags;
720 mod_flags &= ~(EFX_MOD_MCDI | EFX_MOD_PROBE | EFX_MOD_NVRAM |
721 EFX_MOD_VPD | EFX_MOD_MON | EFX_MOD_LIC);
722 EFSYS_ASSERT3U(mod_flags, ==, 0);
723 if (mod_flags != 0) {
728 if ((rc = enop->eno_reset(enp)) != 0)
731 enp->en_reset_flags |= EFX_RESET_MAC;
738 EFSYS_PROBE1(fail1, efx_rc_t, rc);
743 const efx_nic_cfg_t *
747 EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
749 return (&(enp->en_nic_cfg));
754 __checkReturn efx_rc_t
755 efx_nic_register_test(
758 efx_nic_ops_t *enop = enp->en_enop;
761 EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
762 EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_PROBE);
763 EFSYS_ASSERT(!(enp->en_mod_flags & EFX_MOD_NIC));
765 if ((rc = enop->eno_register_test(enp)) != 0)
771 EFSYS_PROBE1(fail1, efx_rc_t, rc);
776 __checkReturn efx_rc_t
777 efx_nic_test_registers(
779 __in efx_register_set_t *rsp,
783 efx_oword_t original;
789 /* This function is only suitable for registers */
790 EFSYS_ASSERT(rsp->rows == 1);
792 /* bit sweep on and off */
793 EFSYS_BAR_READO(enp->en_esbp, rsp->address, &original,
795 for (bit = 0; bit < 128; bit++) {
796 /* Is this bit in the mask? */
797 if (~(rsp->mask.eo_u32[bit >> 5]) & (1 << bit))
800 /* Test this bit can be set in isolation */
802 EFX_AND_OWORD(reg, rsp->mask);
803 EFX_SET_OWORD_BIT(reg, bit);
805 EFSYS_BAR_WRITEO(enp->en_esbp, rsp->address, ®,
807 EFSYS_BAR_READO(enp->en_esbp, rsp->address, &buf,
810 EFX_AND_OWORD(buf, rsp->mask);
811 if (memcmp(®, &buf, sizeof (reg))) {
816 /* Test this bit can be cleared in isolation */
817 EFX_OR_OWORD(reg, rsp->mask);
818 EFX_CLEAR_OWORD_BIT(reg, bit);
820 EFSYS_BAR_WRITEO(enp->en_esbp, rsp->address, ®,
822 EFSYS_BAR_READO(enp->en_esbp, rsp->address, &buf,
825 EFX_AND_OWORD(buf, rsp->mask);
826 if (memcmp(®, &buf, sizeof (reg))) {
832 /* Restore the old value */
833 EFSYS_BAR_WRITEO(enp->en_esbp, rsp->address, &original,
845 EFSYS_PROBE1(fail1, efx_rc_t, rc);
847 /* Restore the old value */
848 EFSYS_BAR_WRITEO(enp->en_esbp, rsp->address, &original, B_TRUE);
853 __checkReturn efx_rc_t
856 __in efx_register_set_t *rsp,
857 __in efx_pattern_type_t pattern,
860 efx_sram_pattern_fn_t func;
862 unsigned int address;
867 EFSYS_ASSERT(pattern < EFX_PATTERN_NTYPES);
868 func = __efx_sram_pattern_fns[pattern];
872 address = rsp->address;
873 for (index = 0; index < rsp->rows; ++index) {
874 func(2 * index + 0, B_FALSE, ®.eo_qword[0]);
875 func(2 * index + 1, B_FALSE, ®.eo_qword[1]);
876 EFX_AND_OWORD(reg, rsp->mask);
877 EFSYS_BAR_WRITEO(enp->en_esbp, address, ®, B_TRUE);
879 address += rsp->step;
883 address = rsp->address;
884 for (index = 0; index < rsp->rows; ++index) {
885 func(2 * index + 0, B_FALSE, ®.eo_qword[0]);
886 func(2 * index + 1, B_FALSE, ®.eo_qword[1]);
887 EFX_AND_OWORD(reg, rsp->mask);
888 EFSYS_BAR_READO(enp->en_esbp, address, &buf, B_TRUE);
889 if (memcmp(®, &buf, sizeof (reg))) {
894 address += rsp->step;
904 EFSYS_PROBE1(fail1, efx_rc_t, rc);
909 #endif /* EFSYS_OPT_DIAG */
911 #if EFSYS_OPT_LOOPBACK
915 __in efx_loopback_kind_t loopback_kind,
916 __out efx_qword_t *maskp)
920 EFSYS_ASSERT3U(loopback_kind, <, EFX_LOOPBACK_NKINDS);
921 EFSYS_ASSERT(maskp != NULL);
923 /* Assert the MC_CMD_LOOPBACK and EFX_LOOPBACK namespace agree */
924 EFX_STATIC_ASSERT(MC_CMD_LOOPBACK_NONE == EFX_LOOPBACK_OFF);
925 EFX_STATIC_ASSERT(MC_CMD_LOOPBACK_DATA == EFX_LOOPBACK_DATA);
926 EFX_STATIC_ASSERT(MC_CMD_LOOPBACK_GMAC == EFX_LOOPBACK_GMAC);
927 EFX_STATIC_ASSERT(MC_CMD_LOOPBACK_XGMII == EFX_LOOPBACK_XGMII);
928 EFX_STATIC_ASSERT(MC_CMD_LOOPBACK_XGXS == EFX_LOOPBACK_XGXS);
929 EFX_STATIC_ASSERT(MC_CMD_LOOPBACK_XAUI == EFX_LOOPBACK_XAUI);
930 EFX_STATIC_ASSERT(MC_CMD_LOOPBACK_GMII == EFX_LOOPBACK_GMII);
931 EFX_STATIC_ASSERT(MC_CMD_LOOPBACK_SGMII == EFX_LOOPBACK_SGMII);
932 EFX_STATIC_ASSERT(MC_CMD_LOOPBACK_XGBR == EFX_LOOPBACK_XGBR);
933 EFX_STATIC_ASSERT(MC_CMD_LOOPBACK_XFI == EFX_LOOPBACK_XFI);
934 EFX_STATIC_ASSERT(MC_CMD_LOOPBACK_XAUI_FAR == EFX_LOOPBACK_XAUI_FAR);
935 EFX_STATIC_ASSERT(MC_CMD_LOOPBACK_GMII_FAR == EFX_LOOPBACK_GMII_FAR);
936 EFX_STATIC_ASSERT(MC_CMD_LOOPBACK_SGMII_FAR == EFX_LOOPBACK_SGMII_FAR);
937 EFX_STATIC_ASSERT(MC_CMD_LOOPBACK_XFI_FAR == EFX_LOOPBACK_XFI_FAR);
938 EFX_STATIC_ASSERT(MC_CMD_LOOPBACK_GPHY == EFX_LOOPBACK_GPHY);
939 EFX_STATIC_ASSERT(MC_CMD_LOOPBACK_PHYXS == EFX_LOOPBACK_PHY_XS);
940 EFX_STATIC_ASSERT(MC_CMD_LOOPBACK_PCS == EFX_LOOPBACK_PCS);
941 EFX_STATIC_ASSERT(MC_CMD_LOOPBACK_PMAPMD == EFX_LOOPBACK_PMA_PMD);
942 EFX_STATIC_ASSERT(MC_CMD_LOOPBACK_XPORT == EFX_LOOPBACK_XPORT);
943 EFX_STATIC_ASSERT(MC_CMD_LOOPBACK_XGMII_WS == EFX_LOOPBACK_XGMII_WS);
944 EFX_STATIC_ASSERT(MC_CMD_LOOPBACK_XAUI_WS == EFX_LOOPBACK_XAUI_WS);
945 EFX_STATIC_ASSERT(MC_CMD_LOOPBACK_XAUI_WS_FAR ==
946 EFX_LOOPBACK_XAUI_WS_FAR);
947 EFX_STATIC_ASSERT(MC_CMD_LOOPBACK_XAUI_WS_NEAR ==
948 EFX_LOOPBACK_XAUI_WS_NEAR);
949 EFX_STATIC_ASSERT(MC_CMD_LOOPBACK_GMII_WS == EFX_LOOPBACK_GMII_WS);
950 EFX_STATIC_ASSERT(MC_CMD_LOOPBACK_XFI_WS == EFX_LOOPBACK_XFI_WS);
951 EFX_STATIC_ASSERT(MC_CMD_LOOPBACK_XFI_WS_FAR ==
952 EFX_LOOPBACK_XFI_WS_FAR);
953 EFX_STATIC_ASSERT(MC_CMD_LOOPBACK_PHYXS_WS == EFX_LOOPBACK_PHYXS_WS);
954 EFX_STATIC_ASSERT(MC_CMD_LOOPBACK_PMA_INT == EFX_LOOPBACK_PMA_INT);
955 EFX_STATIC_ASSERT(MC_CMD_LOOPBACK_SD_NEAR == EFX_LOOPBACK_SD_NEAR);
956 EFX_STATIC_ASSERT(MC_CMD_LOOPBACK_SD_FAR == EFX_LOOPBACK_SD_FAR);
957 EFX_STATIC_ASSERT(MC_CMD_LOOPBACK_PMA_INT_WS ==
958 EFX_LOOPBACK_PMA_INT_WS);
959 EFX_STATIC_ASSERT(MC_CMD_LOOPBACK_SD_FEP2_WS ==
960 EFX_LOOPBACK_SD_FEP2_WS);
961 EFX_STATIC_ASSERT(MC_CMD_LOOPBACK_SD_FEP1_5_WS ==
962 EFX_LOOPBACK_SD_FEP1_5_WS);
963 EFX_STATIC_ASSERT(MC_CMD_LOOPBACK_SD_FEP_WS == EFX_LOOPBACK_SD_FEP_WS);
964 EFX_STATIC_ASSERT(MC_CMD_LOOPBACK_SD_FES_WS == EFX_LOOPBACK_SD_FES_WS);
966 /* Build bitmask of possible loopback types */
967 EFX_ZERO_QWORD(mask);
969 if ((loopback_kind == EFX_LOOPBACK_KIND_OFF) ||
970 (loopback_kind == EFX_LOOPBACK_KIND_ALL)) {
971 EFX_SET_QWORD_BIT(mask, EFX_LOOPBACK_OFF);
974 if ((loopback_kind == EFX_LOOPBACK_KIND_MAC) ||
975 (loopback_kind == EFX_LOOPBACK_KIND_ALL)) {
977 * The "MAC" grouping has historically been used by drivers to
978 * mean loopbacks supported by on-chip hardware. Keep that
979 * meaning here, and include on-chip PHY layer loopbacks.
981 EFX_SET_QWORD_BIT(mask, EFX_LOOPBACK_DATA);
982 EFX_SET_QWORD_BIT(mask, EFX_LOOPBACK_GMAC);
983 EFX_SET_QWORD_BIT(mask, EFX_LOOPBACK_XGMII);
984 EFX_SET_QWORD_BIT(mask, EFX_LOOPBACK_XGXS);
985 EFX_SET_QWORD_BIT(mask, EFX_LOOPBACK_XAUI);
986 EFX_SET_QWORD_BIT(mask, EFX_LOOPBACK_GMII);
987 EFX_SET_QWORD_BIT(mask, EFX_LOOPBACK_SGMII);
988 EFX_SET_QWORD_BIT(mask, EFX_LOOPBACK_XGBR);
989 EFX_SET_QWORD_BIT(mask, EFX_LOOPBACK_XFI);
990 EFX_SET_QWORD_BIT(mask, EFX_LOOPBACK_XAUI_FAR);
991 EFX_SET_QWORD_BIT(mask, EFX_LOOPBACK_GMII_FAR);
992 EFX_SET_QWORD_BIT(mask, EFX_LOOPBACK_SGMII_FAR);
993 EFX_SET_QWORD_BIT(mask, EFX_LOOPBACK_XFI_FAR);
994 EFX_SET_QWORD_BIT(mask, EFX_LOOPBACK_PMA_INT);
995 EFX_SET_QWORD_BIT(mask, EFX_LOOPBACK_SD_NEAR);
996 EFX_SET_QWORD_BIT(mask, EFX_LOOPBACK_SD_FAR);
999 if ((loopback_kind == EFX_LOOPBACK_KIND_PHY) ||
1000 (loopback_kind == EFX_LOOPBACK_KIND_ALL)) {
1002 * The "PHY" grouping has historically been used by drivers to
1003 * mean loopbacks supported by off-chip hardware. Keep that
1006 EFX_SET_QWORD_BIT(mask, EFX_LOOPBACK_GPHY);
1007 EFX_SET_QWORD_BIT(mask, EFX_LOOPBACK_PHY_XS);
1008 EFX_SET_QWORD_BIT(mask, EFX_LOOPBACK_PCS);
1009 EFX_SET_QWORD_BIT(mask, EFX_LOOPBACK_PMA_PMD);
1015 __checkReturn efx_rc_t
1016 efx_mcdi_get_loopback_modes(
1017 __in efx_nic_t *enp)
1019 efx_nic_cfg_t *encp = &(enp->en_nic_cfg);
1021 uint8_t payload[MAX(MC_CMD_GET_LOOPBACK_MODES_IN_LEN,
1022 MC_CMD_GET_LOOPBACK_MODES_OUT_LEN)];
1027 (void) memset(payload, 0, sizeof (payload));
1028 req.emr_cmd = MC_CMD_GET_LOOPBACK_MODES;
1029 req.emr_in_buf = payload;
1030 req.emr_in_length = MC_CMD_GET_LOOPBACK_MODES_IN_LEN;
1031 req.emr_out_buf = payload;
1032 req.emr_out_length = MC_CMD_GET_LOOPBACK_MODES_OUT_LEN;
1034 efx_mcdi_execute(enp, &req);
1036 if (req.emr_rc != 0) {
1041 if (req.emr_out_length_used <
1042 MC_CMD_GET_LOOPBACK_MODES_OUT_SUGGESTED_OFST +
1043 MC_CMD_GET_LOOPBACK_MODES_OUT_SUGGESTED_LEN) {
1049 * We assert the MC_CMD_LOOPBACK and EFX_LOOPBACK namespaces agree
1050 * in efx_loopback_mask() and in siena_phy.c:siena_phy_get_link().
1052 efx_loopback_mask(EFX_LOOPBACK_KIND_ALL, &mask);
1055 *MCDI_OUT2(req, efx_qword_t, GET_LOOPBACK_MODES_OUT_SUGGESTED));
1057 modes = *MCDI_OUT2(req, efx_qword_t, GET_LOOPBACK_MODES_OUT_100M);
1058 EFX_AND_QWORD(modes, mask);
1059 encp->enc_loopback_types[EFX_LINK_100FDX] = modes;
1061 modes = *MCDI_OUT2(req, efx_qword_t, GET_LOOPBACK_MODES_OUT_1G);
1062 EFX_AND_QWORD(modes, mask);
1063 encp->enc_loopback_types[EFX_LINK_1000FDX] = modes;
1065 modes = *MCDI_OUT2(req, efx_qword_t, GET_LOOPBACK_MODES_OUT_10G);
1066 EFX_AND_QWORD(modes, mask);
1067 encp->enc_loopback_types[EFX_LINK_10000FDX] = modes;
1069 if (req.emr_out_length_used >=
1070 MC_CMD_GET_LOOPBACK_MODES_OUT_40G_OFST +
1071 MC_CMD_GET_LOOPBACK_MODES_OUT_40G_LEN) {
1072 /* Response includes 40G loopback modes */
1074 *MCDI_OUT2(req, efx_qword_t, GET_LOOPBACK_MODES_OUT_40G);
1075 EFX_AND_QWORD(modes, mask);
1076 encp->enc_loopback_types[EFX_LINK_40000FDX] = modes;
1079 EFX_ZERO_QWORD(modes);
1080 EFX_SET_QWORD_BIT(modes, EFX_LOOPBACK_OFF);
1081 EFX_OR_QWORD(modes, encp->enc_loopback_types[EFX_LINK_100FDX]);
1082 EFX_OR_QWORD(modes, encp->enc_loopback_types[EFX_LINK_1000FDX]);
1083 EFX_OR_QWORD(modes, encp->enc_loopback_types[EFX_LINK_10000FDX]);
1084 EFX_OR_QWORD(modes, encp->enc_loopback_types[EFX_LINK_40000FDX]);
1085 encp->enc_loopback_types[EFX_LINK_UNKNOWN] = modes;
1092 EFSYS_PROBE1(fail1, efx_rc_t, rc);
1097 #endif /* EFSYS_OPT_LOOPBACK */