| 381 | } |
| 382 | |
| 383 | static int |
| 384 | sfc_set_fw_subvariant(struct sfc_adapter *sa) |
| 385 | { |
| 386 | struct sfc_adapter_shared *sas = sfc_sa2shared(sa); |
| 387 | const efx_nic_cfg_t *encp = efx_nic_cfg_get(sa->nic); |
| 388 | uint64_t tx_offloads = sa->eth_dev->data->dev_conf.txmode.offloads; |
| 389 | unsigned int txq_index; |
| 390 | efx_nic_fw_subvariant_t req_fw_subvariant; |
| 391 | efx_nic_fw_subvariant_t cur_fw_subvariant; |
| 392 | int rc; |
| 393 | |
| 394 | if (!encp->enc_fw_subvariant_no_tx_csum_supported) { |
| 395 | sfc_info(sa, "no-Tx-checksum subvariant not supported"); |
| 396 | return 0; |
| 397 | } |
| 398 | |
| 399 | for (txq_index = 0; txq_index < sas->txq_count; ++txq_index) { |
| 400 | struct sfc_txq_info *txq_info = &sas->txq_info[txq_index]; |
| 401 | |
| 402 | if (txq_info->state & SFC_TXQ_INITIALIZED) |
| 403 | tx_offloads |= txq_info->offloads; |
| 404 | } |
| 405 | |
| 406 | if (tx_offloads & (RTE_ETH_TX_OFFLOAD_IPV4_CKSUM | |
| 407 | RTE_ETH_TX_OFFLOAD_TCP_CKSUM | |
| 408 | RTE_ETH_TX_OFFLOAD_UDP_CKSUM | |
| 409 | RTE_ETH_TX_OFFLOAD_OUTER_IPV4_CKSUM)) |
| 410 | req_fw_subvariant = EFX_NIC_FW_SUBVARIANT_DEFAULT; |
| 411 | else |
| 412 | req_fw_subvariant = EFX_NIC_FW_SUBVARIANT_NO_TX_CSUM; |
| 413 | |
| 414 | rc = efx_nic_get_fw_subvariant(sa->nic, &cur_fw_subvariant); |
| 415 | if (rc != 0) { |
| 416 | sfc_err(sa, "failed to get FW subvariant: %d", rc); |
| 417 | return rc; |
| 418 | } |
| 419 | sfc_info(sa, "FW subvariant is %u vs required %u", |
| 420 | cur_fw_subvariant, req_fw_subvariant); |
| 421 | |
| 422 | if (cur_fw_subvariant == req_fw_subvariant) |
| 423 | return 0; |
| 424 | |
| 425 | rc = efx_nic_set_fw_subvariant(sa->nic, req_fw_subvariant); |
| 426 | if (rc != 0) { |
| 427 | sfc_err(sa, "failed to set FW subvariant %u: %d", |
| 428 | req_fw_subvariant, rc); |
| 429 | return rc; |
| 430 | } |
| 431 | sfc_info(sa, "FW subvariant set to %u", req_fw_subvariant); |
| 432 | |
| 433 | return 0; |
| 434 | } |
| 435 | |
| 436 | static int |
| 437 | sfc_try_start(struct sfc_adapter *sa) |
no test coverage detected