| 2502 | } |
| 2503 | |
| 2504 | int |
| 2505 | ngbe_dev_rss_reta_update(struct rte_eth_dev *dev, |
| 2506 | struct rte_eth_rss_reta_entry64 *reta_conf, |
| 2507 | uint16_t reta_size) |
| 2508 | { |
| 2509 | uint8_t i, j, mask; |
| 2510 | uint32_t reta; |
| 2511 | uint16_t idx, shift; |
| 2512 | struct ngbe_adapter *adapter = ngbe_dev_adapter(dev); |
| 2513 | struct ngbe_hw *hw = ngbe_dev_hw(dev); |
| 2514 | |
| 2515 | PMD_INIT_FUNC_TRACE(); |
| 2516 | |
| 2517 | if (!hw->is_pf) { |
| 2518 | PMD_DRV_LOG(ERR, "RSS reta update is not supported on this " |
| 2519 | "NIC."); |
| 2520 | return -ENOTSUP; |
| 2521 | } |
| 2522 | |
| 2523 | if (reta_size != RTE_ETH_RSS_RETA_SIZE_128) { |
| 2524 | PMD_DRV_LOG(ERR, "The size of hash lookup table configured " |
| 2525 | "(%d) doesn't match the number hardware can supported " |
| 2526 | "(%d)", reta_size, RTE_ETH_RSS_RETA_SIZE_128); |
| 2527 | return -EINVAL; |
| 2528 | } |
| 2529 | |
| 2530 | for (i = 0; i < reta_size; i += 4) { |
| 2531 | idx = i / RTE_ETH_RETA_GROUP_SIZE; |
| 2532 | shift = i % RTE_ETH_RETA_GROUP_SIZE; |
| 2533 | mask = (uint8_t)RS64(reta_conf[idx].mask, shift, 0xF); |
| 2534 | if (!mask) |
| 2535 | continue; |
| 2536 | |
| 2537 | reta = rd32a(hw, NGBE_REG_RSSTBL, i >> 2); |
| 2538 | for (j = 0; j < 4; j++) { |
| 2539 | if (RS8(mask, j, 0x1)) { |
| 2540 | reta &= ~(MS32(8 * j, 0xFF)); |
| 2541 | reta |= LS32(reta_conf[idx].reta[shift + j], |
| 2542 | 8 * j, 0xFF); |
| 2543 | } |
| 2544 | } |
| 2545 | wr32a(hw, NGBE_REG_RSSTBL, i >> 2, reta); |
| 2546 | } |
| 2547 | adapter->rss_reta_updated = 1; |
| 2548 | |
| 2549 | return 0; |
| 2550 | } |
| 2551 | |
| 2552 | int |
| 2553 | ngbe_dev_rss_reta_query(struct rte_eth_dev *dev, |
nothing calls this directly
no test coverage detected