| 605 | |
| 606 | |
| 607 | int |
| 608 | ixgbe_crypto_enable_ipsec(struct rte_eth_dev *dev) |
| 609 | { |
| 610 | struct ixgbe_hw *hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private); |
| 611 | uint32_t reg; |
| 612 | uint64_t rx_offloads; |
| 613 | uint64_t tx_offloads; |
| 614 | |
| 615 | rx_offloads = dev->data->dev_conf.rxmode.offloads; |
| 616 | tx_offloads = dev->data->dev_conf.txmode.offloads; |
| 617 | |
| 618 | /* sanity checks */ |
| 619 | if (rx_offloads & RTE_ETH_RX_OFFLOAD_TCP_LRO) { |
| 620 | PMD_DRV_LOG(ERR, "RSC and IPsec not supported"); |
| 621 | return -1; |
| 622 | } |
| 623 | if (rx_offloads & RTE_ETH_RX_OFFLOAD_KEEP_CRC) { |
| 624 | PMD_DRV_LOG(ERR, "HW CRC strip needs to be enabled for IPsec"); |
| 625 | return -1; |
| 626 | } |
| 627 | |
| 628 | |
| 629 | /* Set IXGBE_SECTXBUFFAF to 0x15 as required in the datasheet*/ |
| 630 | IXGBE_WRITE_REG(hw, IXGBE_SECTXBUFFAF, 0x15); |
| 631 | |
| 632 | /* IFG needs to be set to 3 when we are using security. Otherwise a Tx |
| 633 | * hang will occur with heavy traffic. |
| 634 | */ |
| 635 | reg = IXGBE_READ_REG(hw, IXGBE_SECTXMINIFG); |
| 636 | reg = (reg & 0xFFFFFFF0) | 0x3; |
| 637 | IXGBE_WRITE_REG(hw, IXGBE_SECTXMINIFG, reg); |
| 638 | |
| 639 | reg = IXGBE_READ_REG(hw, IXGBE_HLREG0); |
| 640 | reg |= IXGBE_HLREG0_TXCRCEN | IXGBE_HLREG0_RXCRCSTRP; |
| 641 | IXGBE_WRITE_REG(hw, IXGBE_HLREG0, reg); |
| 642 | |
| 643 | if (rx_offloads & RTE_ETH_RX_OFFLOAD_SECURITY) { |
| 644 | IXGBE_WRITE_REG(hw, IXGBE_SECRXCTRL, 0); |
| 645 | reg = IXGBE_READ_REG(hw, IXGBE_SECRXCTRL); |
| 646 | if (reg != 0) { |
| 647 | PMD_DRV_LOG(ERR, "Error enabling Rx Crypto"); |
| 648 | return -1; |
| 649 | } |
| 650 | } |
| 651 | if (tx_offloads & RTE_ETH_TX_OFFLOAD_SECURITY) { |
| 652 | IXGBE_WRITE_REG(hw, IXGBE_SECTXCTRL, |
| 653 | IXGBE_SECTXCTRL_STORE_FORWARD); |
| 654 | reg = IXGBE_READ_REG(hw, IXGBE_SECTXCTRL); |
| 655 | if (reg != IXGBE_SECTXCTRL_STORE_FORWARD) { |
| 656 | PMD_DRV_LOG(ERR, "Error enabling Rx Crypto"); |
| 657 | return -1; |
| 658 | } |
| 659 | } |
| 660 | |
| 661 | ixgbe_crypto_clear_ipsec_tables(dev); |
| 662 | |
| 663 | return 0; |
| 664 | } |
no test coverage detected