| 265 | } |
| 266 | |
| 267 | __checkReturn efx_rc_t |
| 268 | efx_mae_init( |
| 269 | __in efx_nic_t *enp) |
| 270 | { |
| 271 | const efx_nic_cfg_t *encp = efx_nic_cfg_get(enp); |
| 272 | efx_mae_field_cap_t *or_fcaps; |
| 273 | size_t or_fcaps_size; |
| 274 | efx_mae_field_cap_t *ar_fcaps; |
| 275 | size_t ar_fcaps_size; |
| 276 | efx_mae_t *maep; |
| 277 | efx_rc_t rc; |
| 278 | |
| 279 | if (encp->enc_mae_supported == B_FALSE) { |
| 280 | rc = ENOTSUP; |
| 281 | goto fail1; |
| 282 | } |
| 283 | |
| 284 | EFSYS_KMEM_ALLOC(enp->en_esip, sizeof (*maep), maep); |
| 285 | if (maep == NULL) { |
| 286 | rc = ENOMEM; |
| 287 | goto fail2; |
| 288 | } |
| 289 | |
| 290 | enp->en_maep = maep; |
| 291 | |
| 292 | rc = efx_mae_get_capabilities(enp); |
| 293 | if (rc != 0) |
| 294 | goto fail3; |
| 295 | |
| 296 | or_fcaps_size = maep->em_max_nfields * sizeof (*or_fcaps); |
| 297 | EFSYS_KMEM_ALLOC(enp->en_esip, or_fcaps_size, or_fcaps); |
| 298 | if (or_fcaps == NULL) { |
| 299 | rc = ENOMEM; |
| 300 | goto fail4; |
| 301 | } |
| 302 | |
| 303 | maep->em_outer_rule_field_caps_size = or_fcaps_size; |
| 304 | maep->em_outer_rule_field_caps = or_fcaps; |
| 305 | |
| 306 | rc = efx_mae_get_outer_rule_caps(enp, maep->em_max_nfields, or_fcaps); |
| 307 | if (rc != 0) |
| 308 | goto fail5; |
| 309 | |
| 310 | ar_fcaps_size = maep->em_max_nfields * sizeof (*ar_fcaps); |
| 311 | EFSYS_KMEM_ALLOC(enp->en_esip, ar_fcaps_size, ar_fcaps); |
| 312 | if (ar_fcaps == NULL) { |
| 313 | rc = ENOMEM; |
| 314 | goto fail6; |
| 315 | } |
| 316 | |
| 317 | maep->em_action_rule_field_caps_size = ar_fcaps_size; |
| 318 | maep->em_action_rule_field_caps = ar_fcaps; |
| 319 | |
| 320 | rc = efx_mae_get_action_rule_caps(enp, maep->em_max_nfields, ar_fcaps); |
| 321 | if (rc != 0) |
| 322 | goto fail7; |
| 323 | |
| 324 | return (0); |
no test coverage detected