| 234 | |
| 235 | |
| 236 | __checkReturn efx_rc_t |
| 237 | efx_tx_init( |
| 238 | __in efx_nic_t *enp) |
| 239 | { |
| 240 | const efx_tx_ops_t *etxop; |
| 241 | efx_rc_t rc; |
| 242 | |
| 243 | EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC); |
| 244 | EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_NIC); |
| 245 | |
| 246 | if (!(enp->en_mod_flags & EFX_MOD_EV)) { |
| 247 | rc = EINVAL; |
| 248 | goto fail1; |
| 249 | } |
| 250 | |
| 251 | if (enp->en_mod_flags & EFX_MOD_TX) { |
| 252 | rc = EINVAL; |
| 253 | goto fail2; |
| 254 | } |
| 255 | |
| 256 | switch (enp->en_family) { |
| 257 | #if EFSYS_OPT_SIENA |
| 258 | case EFX_FAMILY_SIENA: |
| 259 | etxop = &__efx_tx_siena_ops; |
| 260 | break; |
| 261 | #endif /* EFSYS_OPT_SIENA */ |
| 262 | |
| 263 | #if EFSYS_OPT_HUNTINGTON |
| 264 | case EFX_FAMILY_HUNTINGTON: |
| 265 | etxop = &__efx_tx_hunt_ops; |
| 266 | break; |
| 267 | #endif /* EFSYS_OPT_HUNTINGTON */ |
| 268 | |
| 269 | #if EFSYS_OPT_MEDFORD |
| 270 | case EFX_FAMILY_MEDFORD: |
| 271 | etxop = &__efx_tx_medford_ops; |
| 272 | break; |
| 273 | #endif /* EFSYS_OPT_MEDFORD */ |
| 274 | |
| 275 | #if EFSYS_OPT_MEDFORD2 |
| 276 | case EFX_FAMILY_MEDFORD2: |
| 277 | etxop = &__efx_tx_medford2_ops; |
| 278 | break; |
| 279 | #endif /* EFSYS_OPT_MEDFORD2 */ |
| 280 | |
| 281 | #if EFSYS_OPT_RIVERHEAD |
| 282 | case EFX_FAMILY_RIVERHEAD: |
| 283 | etxop = &__efx_tx_rhead_ops; |
| 284 | break; |
| 285 | #endif /* EFSYS_OPT_RIVERHEAD */ |
| 286 | |
| 287 | default: |
| 288 | EFSYS_ASSERT(0); |
| 289 | rc = ENOTSUP; |
| 290 | goto fail3; |
| 291 | } |
| 292 | |
| 293 | EFSYS_ASSERT3U(enp->en_tx_qcount, ==, 0); |