| 7623 | } |
| 7624 | |
| 7625 | int |
| 7626 | i40e_set_rss_key(struct i40e_vsi *vsi, uint8_t *key, uint8_t key_len) |
| 7627 | { |
| 7628 | struct i40e_pf *pf = I40E_VSI_TO_PF(vsi); |
| 7629 | struct i40e_hw *hw = I40E_VSI_TO_HW(vsi); |
| 7630 | uint16_t key_idx = (vsi->type == I40E_VSI_SRIOV) ? |
| 7631 | I40E_VFQF_HKEY_MAX_INDEX : |
| 7632 | I40E_PFQF_HKEY_MAX_INDEX; |
| 7633 | |
| 7634 | if (!key || key_len == 0) { |
| 7635 | PMD_DRV_LOG(DEBUG, "No key to be configured"); |
| 7636 | return 0; |
| 7637 | } else if (key_len != (key_idx + 1) * |
| 7638 | sizeof(uint32_t)) { |
| 7639 | PMD_DRV_LOG(ERR, "Invalid key length %u", key_len); |
| 7640 | return -EINVAL; |
| 7641 | } |
| 7642 | |
| 7643 | if (pf->flags & I40E_FLAG_RSS_AQ_CAPABLE) { |
| 7644 | struct i40e_aqc_get_set_rss_key_data *key_dw = |
| 7645 | (struct i40e_aqc_get_set_rss_key_data *)key; |
| 7646 | enum i40e_status_code status = |
| 7647 | i40e_aq_set_rss_key(hw, vsi->vsi_id, key_dw); |
| 7648 | |
| 7649 | if (status) { |
| 7650 | PMD_DRV_LOG(ERR, |
| 7651 | "Failed to configure RSS key via AQ, error status: %d", |
| 7652 | status); |
| 7653 | return -EIO; |
| 7654 | } |
| 7655 | } else { |
| 7656 | uint32_t *hash_key = (uint32_t *)key; |
| 7657 | uint16_t i; |
| 7658 | |
| 7659 | if (vsi->type == I40E_VSI_SRIOV) { |
| 7660 | for (i = 0; i <= I40E_VFQF_HKEY_MAX_INDEX; i++) |
| 7661 | I40E_WRITE_REG( |
| 7662 | hw, |
| 7663 | I40E_VFQF_HKEY1(i, vsi->user_param), |
| 7664 | hash_key[i]); |
| 7665 | |
| 7666 | } else { |
| 7667 | for (i = 0; i <= I40E_PFQF_HKEY_MAX_INDEX; i++) |
| 7668 | I40E_WRITE_REG(hw, I40E_PFQF_HKEY(i), |
| 7669 | hash_key[i]); |
| 7670 | } |
| 7671 | I40E_WRITE_FLUSH(hw); |
| 7672 | } |
| 7673 | |
| 7674 | return 0; |
| 7675 | } |
| 7676 | |
| 7677 | static int |
| 7678 | i40e_get_rss_key(struct i40e_vsi *vsi, uint8_t *key, uint8_t *key_len) |
no test coverage detected