| 103 | #if EFSYS_OPT_LOOPBACK |
| 104 | |
| 105 | __checkReturn efx_rc_t |
| 106 | efx_port_loopback_set( |
| 107 | __in efx_nic_t *enp, |
| 108 | __in efx_link_mode_t link_mode, |
| 109 | __in efx_loopback_type_t loopback_type) |
| 110 | { |
| 111 | efx_port_t *epp = &(enp->en_port); |
| 112 | efx_nic_cfg_t *encp = &(enp->en_nic_cfg); |
| 113 | const efx_mac_ops_t *emop = epp->ep_emop; |
| 114 | efx_rc_t rc; |
| 115 | |
| 116 | EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC); |
| 117 | EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_PORT); |
| 118 | EFSYS_ASSERT(emop != NULL); |
| 119 | |
| 120 | EFSYS_ASSERT(link_mode < EFX_LINK_NMODES); |
| 121 | |
| 122 | if (EFX_TEST_QWORD_BIT(encp->enc_loopback_types[link_mode], |
| 123 | (int)loopback_type) == 0) { |
| 124 | rc = ENOTSUP; |
| 125 | goto fail1; |
| 126 | } |
| 127 | |
| 128 | if (epp->ep_loopback_type == loopback_type && |
| 129 | epp->ep_loopback_link_mode == link_mode) |
| 130 | return (0); |
| 131 | |
| 132 | if ((rc = emop->emo_loopback_set(enp, link_mode, loopback_type)) != 0) |
| 133 | goto fail2; |
| 134 | |
| 135 | return (0); |
| 136 | |
| 137 | fail2: |
| 138 | EFSYS_PROBE(fail2); |
| 139 | fail1: |
| 140 | EFSYS_PROBE1(fail1, efx_rc_t, rc); |
| 141 | |
| 142 | return (rc); |
| 143 | } |
| 144 | |
| 145 | #if EFSYS_OPT_NAMES |
| 146 | |