| 2646 | } |
| 2647 | |
| 2648 | int ena_com_set_hash_function(struct ena_com_dev *ena_dev) |
| 2649 | { |
| 2650 | struct ena_com_admin_queue *admin_queue = &ena_dev->admin_queue; |
| 2651 | struct ena_rss *rss = &ena_dev->rss; |
| 2652 | struct ena_admin_set_feat_cmd cmd; |
| 2653 | struct ena_admin_set_feat_resp resp; |
| 2654 | struct ena_admin_get_feat_resp get_resp; |
| 2655 | int ret; |
| 2656 | |
| 2657 | if (!ena_com_check_supported_feature_id(ena_dev, |
| 2658 | ENA_ADMIN_RSS_HASH_FUNCTION)) { |
| 2659 | ena_trc_dbg(ena_dev, "Feature %d isn't supported\n", |
| 2660 | ENA_ADMIN_RSS_HASH_FUNCTION); |
| 2661 | return ENA_COM_UNSUPPORTED; |
| 2662 | } |
| 2663 | |
| 2664 | /* Validate hash function is supported */ |
| 2665 | ret = ena_com_get_feature(ena_dev, &get_resp, |
| 2666 | ENA_ADMIN_RSS_HASH_FUNCTION, 0); |
| 2667 | if (unlikely(ret)) |
| 2668 | return ret; |
| 2669 | |
| 2670 | if (!(get_resp.u.flow_hash_func.supported_func & BIT(rss->hash_func))) { |
| 2671 | ena_trc_err(ena_dev, "Func hash %d isn't supported by device, abort\n", |
| 2672 | rss->hash_func); |
| 2673 | return ENA_COM_UNSUPPORTED; |
| 2674 | } |
| 2675 | |
| 2676 | memset(&cmd, 0x0, sizeof(cmd)); |
| 2677 | |
| 2678 | cmd.aq_common_descriptor.opcode = ENA_ADMIN_SET_FEATURE; |
| 2679 | cmd.aq_common_descriptor.flags = |
| 2680 | ENA_ADMIN_AQ_COMMON_DESC_CTRL_DATA_INDIRECT_MASK; |
| 2681 | cmd.feat_common.feature_id = ENA_ADMIN_RSS_HASH_FUNCTION; |
| 2682 | cmd.u.flow_hash_func.init_val = rss->hash_init_val; |
| 2683 | cmd.u.flow_hash_func.selected_func = 1 << rss->hash_func; |
| 2684 | |
| 2685 | ret = ena_com_mem_addr_set(ena_dev, |
| 2686 | &cmd.control_buffer.address, |
| 2687 | rss->hash_key_dma_addr); |
| 2688 | if (unlikely(ret)) { |
| 2689 | ena_trc_err(ena_dev, "Memory address set failed\n"); |
| 2690 | return ret; |
| 2691 | } |
| 2692 | |
| 2693 | cmd.control_buffer.length = sizeof(*rss->hash_key); |
| 2694 | |
| 2695 | ret = ena_com_execute_admin_command(admin_queue, |
| 2696 | (struct ena_admin_aq_entry *)&cmd, |
| 2697 | sizeof(cmd), |
| 2698 | (struct ena_admin_acq_entry *)&resp, |
| 2699 | sizeof(resp)); |
| 2700 | if (unlikely(ret)) { |
| 2701 | ena_trc_err(ena_dev, "Failed to set hash function %d. error: %d\n", |
| 2702 | rss->hash_func, ret); |
| 2703 | return ENA_COM_INVAL; |
| 2704 | } |
| 2705 |
no test coverage detected