| 2977 | } |
| 2978 | |
| 2979 | int ena_com_indirect_table_set(struct ena_com_dev *ena_dev) |
| 2980 | { |
| 2981 | struct ena_com_admin_queue *admin_queue = &ena_dev->admin_queue; |
| 2982 | struct ena_rss *rss = &ena_dev->rss; |
| 2983 | struct ena_admin_set_feat_cmd cmd; |
| 2984 | struct ena_admin_set_feat_resp resp; |
| 2985 | int ret; |
| 2986 | |
| 2987 | if (!ena_com_check_supported_feature_id(ena_dev, |
| 2988 | ENA_ADMIN_RSS_INDIRECTION_TABLE_CONFIG)) { |
| 2989 | ena_trc_dbg(ena_dev, "Feature %d isn't supported\n", |
| 2990 | ENA_ADMIN_RSS_INDIRECTION_TABLE_CONFIG); |
| 2991 | return ENA_COM_UNSUPPORTED; |
| 2992 | } |
| 2993 | |
| 2994 | ret = ena_com_ind_tbl_convert_to_device(ena_dev); |
| 2995 | if (ret) { |
| 2996 | ena_trc_err(ena_dev, "Failed to convert host indirection table to device table\n"); |
| 2997 | return ret; |
| 2998 | } |
| 2999 | |
| 3000 | memset(&cmd, 0x0, sizeof(cmd)); |
| 3001 | |
| 3002 | cmd.aq_common_descriptor.opcode = ENA_ADMIN_SET_FEATURE; |
| 3003 | cmd.aq_common_descriptor.flags = |
| 3004 | ENA_ADMIN_AQ_COMMON_DESC_CTRL_DATA_INDIRECT_MASK; |
| 3005 | cmd.feat_common.feature_id = ENA_ADMIN_RSS_INDIRECTION_TABLE_CONFIG; |
| 3006 | cmd.u.ind_table.size = rss->tbl_log_size; |
| 3007 | cmd.u.ind_table.inline_index = 0xFFFFFFFF; |
| 3008 | |
| 3009 | ret = ena_com_mem_addr_set(ena_dev, |
| 3010 | &cmd.control_buffer.address, |
| 3011 | rss->rss_ind_tbl_dma_addr); |
| 3012 | if (unlikely(ret)) { |
| 3013 | ena_trc_err(ena_dev, "Memory address set failed\n"); |
| 3014 | return ret; |
| 3015 | } |
| 3016 | |
| 3017 | cmd.control_buffer.length = (1ULL << rss->tbl_log_size) * |
| 3018 | sizeof(struct ena_admin_rss_ind_table_entry); |
| 3019 | |
| 3020 | ret = ena_com_execute_admin_command(admin_queue, |
| 3021 | (struct ena_admin_aq_entry *)&cmd, |
| 3022 | sizeof(cmd), |
| 3023 | (struct ena_admin_acq_entry *)&resp, |
| 3024 | sizeof(resp)); |
| 3025 | |
| 3026 | if (unlikely(ret)) |
| 3027 | ena_trc_err(ena_dev, "Failed to set indirect table. error: %d\n", ret); |
| 3028 | |
| 3029 | return ret; |
| 3030 | } |
| 3031 | |
| 3032 | int ena_com_indirect_table_get(struct ena_com_dev *ena_dev, u32 *ind_tbl) |
| 3033 | { |
no test coverage detected