* txgbe_set_rsc - configure RSC related port HW registers * * Configures the port's RSC related registers. * * @dev port handle * * Returns 0 in case of success or a non-zero error code */
| 4116 | * Returns 0 in case of success or a non-zero error code |
| 4117 | */ |
| 4118 | static int |
| 4119 | txgbe_set_rsc(struct rte_eth_dev *dev) |
| 4120 | { |
| 4121 | struct rte_eth_rxmode *rx_conf = &dev->data->dev_conf.rxmode; |
| 4122 | struct txgbe_hw *hw = TXGBE_DEV_HW(dev); |
| 4123 | struct rte_eth_dev_info dev_info = { 0 }; |
| 4124 | bool rsc_capable = false; |
| 4125 | uint16_t i; |
| 4126 | uint32_t rdrxctl; |
| 4127 | uint32_t rfctl; |
| 4128 | |
| 4129 | /* Sanity check */ |
| 4130 | dev->dev_ops->dev_infos_get(dev, &dev_info); |
| 4131 | if (dev_info.rx_offload_capa & RTE_ETH_RX_OFFLOAD_TCP_LRO) |
| 4132 | rsc_capable = true; |
| 4133 | |
| 4134 | if (!rsc_capable && (rx_conf->offloads & RTE_ETH_RX_OFFLOAD_TCP_LRO)) { |
| 4135 | PMD_INIT_LOG(CRIT, "LRO is requested on HW that doesn't " |
| 4136 | "support it"); |
| 4137 | return -EINVAL; |
| 4138 | } |
| 4139 | |
| 4140 | /* RSC global configuration */ |
| 4141 | |
| 4142 | if ((rx_conf->offloads & RTE_ETH_RX_OFFLOAD_KEEP_CRC) && |
| 4143 | (rx_conf->offloads & RTE_ETH_RX_OFFLOAD_TCP_LRO)) { |
| 4144 | PMD_INIT_LOG(CRIT, "LRO can't be enabled when HW CRC " |
| 4145 | "is disabled"); |
| 4146 | return -EINVAL; |
| 4147 | } |
| 4148 | |
| 4149 | rfctl = rd32(hw, TXGBE_PSRCTL); |
| 4150 | if (rsc_capable && (rx_conf->offloads & RTE_ETH_RX_OFFLOAD_TCP_LRO)) |
| 4151 | rfctl &= ~TXGBE_PSRCTL_RSCDIA; |
| 4152 | else |
| 4153 | rfctl |= TXGBE_PSRCTL_RSCDIA; |
| 4154 | wr32(hw, TXGBE_PSRCTL, rfctl); |
| 4155 | |
| 4156 | /* If LRO hasn't been requested - we are done here. */ |
| 4157 | if (!(rx_conf->offloads & RTE_ETH_RX_OFFLOAD_TCP_LRO)) |
| 4158 | return 0; |
| 4159 | |
| 4160 | /* Set PSRCTL.RSCACK bit */ |
| 4161 | rdrxctl = rd32(hw, TXGBE_PSRCTL); |
| 4162 | rdrxctl |= TXGBE_PSRCTL_RSCACK; |
| 4163 | wr32(hw, TXGBE_PSRCTL, rdrxctl); |
| 4164 | |
| 4165 | /* Per-queue RSC configuration */ |
| 4166 | for (i = 0; i < dev->data->nb_rx_queues; i++) { |
| 4167 | struct txgbe_rx_queue *rxq = dev->data->rx_queues[i]; |
| 4168 | uint32_t srrctl = |
| 4169 | rd32(hw, TXGBE_RXCFG(rxq->reg_idx)); |
| 4170 | uint32_t psrtype = |
| 4171 | rd32(hw, TXGBE_POOLRSS(rxq->reg_idx)); |
| 4172 | uint32_t eitr = |
| 4173 | rd32(hw, TXGBE_ITR(rxq->reg_idx)); |
| 4174 | |
| 4175 | /* |
no test coverage detected