send_attr
int (*send_attr)(struct vio_driver_state *vio);
return vio->ops->send_attr(vio);
if (send_attr(vio) < 0)
if (!ops || !ops->send_attr || !ops->handle_attr ||
.send_attr = vdc_send_attr,
ste_attr.send_attr.opmod = MLX5HWS_WQE_GTA_OPMOD_STE;
ste_attr.send_attr.opcode = MLX5HWS_WQE_OPCODE_TBL_ACCESS;
ste_attr.send_attr.len = MLX5HWS_WQE_SZ_GTA_CTRL + MLX5HWS_WQE_SZ_GTA_DATA;
ste_attr.send_attr.user_data = &no_use;
ste_attr.send_attr.rule = NULL;
ste_attr.send_attr.fence = 1;
ste_attr.send_attr.notify_hw = true;
ste_attr.send_attr.match_definer_id = ctx->caps->trivial_match_definer;
ste_attr.send_attr.len += MLX5HWS_WQE_SZ_GTA_DATA;
ste_attr.send_attr.range_definer_id = mlx5hws_definer_get_id(range_definer);
mlx5d_arg_init_send_attr(struct mlx5hws_send_engine_post_attr *send_attr,
send_attr->opcode = MLX5HWS_WQE_OPCODE_TBL_ACCESS;
send_attr->opmod = MLX5HWS_WQE_GTA_OPMOD_MOD_ARG;
send_attr->len = MLX5HWS_WQE_SZ_GTA_CTRL + MLX5HWS_WQE_SZ_GTA_DATA;
send_attr->id = arg_idx;
send_attr->user_data = comp_data;
struct mlx5hws_send_engine_post_attr send_attr = {0};
mlx5d_arg_init_send_attr(&send_attr, NULL, arg_idx);
mlx5hws_send_engine_post_end(&ctrl, &send_attr);
struct mlx5hws_send_engine_post_attr send_attr = {0};
mlx5d_arg_init_send_attr(&send_attr, comp_data, arg_idx);
send_attr.id = arg_idx++;
mlx5hws_send_engine_post_end(&ctrl, &send_attr);
send_attr.id = arg_idx;
mlx5hws_send_engine_post_end(&ctrl, &send_attr);
ste_attr->send_attr.opmod = MLX5HWS_WQE_GTA_OPMOD_STE;
ste_attr->send_attr.opcode = MLX5HWS_WQE_OPCODE_TBL_ACCESS;
ste_attr->send_attr.len = MLX5HWS_WQE_SZ_GTA_CTRL + MLX5HWS_WQE_SZ_GTA_DATA;
ste_attr.send_attr.notify_hw = !attr->burst;
ste_attr.send_attr.user_data = dep_wqe->user_data;
ste_attr.send_attr.rule = dep_wqe->rule;
ste_attr.send_attr.opmod = MLX5HWS_WQE_GTA_OPMOD_STE;
ste_attr.send_attr.opcode = MLX5HWS_WQE_OPCODE_TBL_ACCESS;
ste_attr.send_attr.len = MLX5HWS_WQE_SZ_GTA_CTRL + MLX5HWS_WQE_SZ_GTA_DATA;
ste_attr.send_attr.rule = rule;
ste_attr.send_attr.notify_hw = !attr->burst;
ste_attr.send_attr.user_data = attr->user_data;
ste_attr.send_attr.fence = 0;
ste_attr.send_attr.opmod = MLX5HWS_WQE_GTA_OPMOD_STE;
ste_attr.send_attr.opcode = MLX5HWS_WQE_OPCODE_TBL_ACCESS;
ste_attr.send_attr.len = MLX5HWS_WQE_SZ_GTA_CTRL + MLX5HWS_WQE_SZ_GTA_DATA;
ste_attr.send_attr.rule = rule;
ste_attr.send_attr.notify_hw = 1;
ste_attr.send_attr.user_data = user_data;
ste_attr.send_attr.opmod = MLX5HWS_WQE_GTA_OPMOD_STE;
ste_attr.send_attr.opcode = MLX5HWS_WQE_OPCODE_TBL_ACCESS;
ste_attr.send_attr.len = MLX5HWS_WQE_SZ_GTA_CTRL + MLX5HWS_WQE_SZ_GTA_DATA;
ste_attr.send_attr.rule = rule;
ste_attr.send_attr.fence = 0;
ste_attr.send_attr.notify_hw = !attr->burst;
ste_attr.send_attr.user_data = attr->user_data;
struct mlx5hws_send_engine_post_attr *send_attr,
wqe_ctrl.opmod_idx_opcode = cpu_to_be32((send_attr->opmod << 24) | send_attr->opcode);
wqe_ctrl.qpn_ds = cpu_to_be32((send_attr->len + sizeof(struct mlx5hws_wqe_ctrl_seg)) / 16);
flags |= send_attr->notify_hw ? MLX5_WQE_CTRL_CQ_UPDATE : 0;
wqe_ctrl.imm = cpu_to_be32(send_attr->id);
gta_wqe_data0.rsvd1_definer = cpu_to_be32(send_attr->match_definer_id << 8);
gta_wqe_data1.rsvd1_definer = cpu_to_be32(send_attr->range_definer_id << 8);
*send_attr->used_id = send_attr->id;
if (send_attr->retry_id) {
wqe_ctrl.imm = cpu_to_be32(send_attr->retry_id);
send_attr->id = send_attr->retry_id;
send_attr->retry_id = 0;
struct mlx5hws_send_engine_post_attr *send_attr = &ste_attr->send_attr;
struct mlx5hws_rule *rule = send_attr->rule;
if (send_attr->fence)
send_attr->id = ste_attr->rtc_1;
send_attr->used_id = ste_attr->used_id_rtc_1;
send_attr->retry_id = ste_attr->retry_rtc_1;
ret = hws_send_wqe_fw(mdev, pdn, send_attr,
send_attr->id = ste_attr->rtc_0;
send_attr->used_id = ste_attr->used_id_rtc_0;
send_attr->retry_id = ste_attr->retry_rtc_0;
ret = hws_send_wqe_fw(mdev, pdn, send_attr,
mlx5hws_send_engine_gen_comp(queue, send_attr->user_data, MLX5HWS_FLOW_OP_SUCCESS);
mlx5hws_send_engine_gen_comp(queue, send_attr->user_data, MLX5HWS_FLOW_OP_ERROR);
struct mlx5hws_send_engine_post_attr *send_attr,
mlx5hws_send_engine_post_end(&ctrl, send_attr);
struct mlx5hws_send_engine_post_attr *send_attr = &ste_attr->send_attr;
u8 notify_hw = send_attr->notify_hw;
u8 fence = send_attr->fence;
send_attr->id = ste_attr->rtc_1;
send_attr->used_id = ste_attr->used_id_rtc_1;
send_attr->retry_id = ste_attr->retry_rtc_1;
send_attr->fence = fence;
send_attr->notify_hw = notify_hw && !ste_attr->rtc_0;
hws_send_wqe(queue, send_attr,
send_attr->id = ste_attr->rtc_0;
send_attr->used_id = ste_attr->used_id_rtc_0;
send_attr->retry_id = ste_attr->retry_rtc_0;
send_attr->fence = fence && !ste_attr->rtc_1;
send_attr->notify_hw = notify_hw;
hws_send_wqe(queue, send_attr,
send_attr->notify_hw = notify_hw;
send_attr->fence = fence;
struct mlx5hws_send_engine_post_attr send_attr = {0};
send_attr.rule = priv->rule;
send_attr.opcode = MLX5HWS_WQE_OPCODE_TBL_ACCESS;
send_attr.opmod = MLX5HWS_WQE_GTA_OPMOD_STE;
send_attr.len = MLX5_SEND_WQE_BB * 2 - sizeof(struct mlx5hws_wqe_ctrl_seg);
send_attr.notify_hw = 1;
send_attr.fence = 0;
send_attr.user_data = priv->user_data;
send_attr.id = priv->retry_id;
send_attr.used_id = priv->used_id;
mlx5hws_send_engine_post_end(&ctrl, &send_attr);
ste_attr.send_attr.opmod = MLX5HWS_WQE_GTA_OPMOD_STE;
ste_attr.send_attr.opcode = MLX5HWS_WQE_OPCODE_TBL_ACCESS;
ste_attr.send_attr.len = MLX5HWS_WQE_SZ_GTA_CTRL + MLX5HWS_WQE_SZ_GTA_DATA;
ste_attr.send_attr.fence = 1;
ste_attr.send_attr.notify_hw = (send_sq->tail_dep_idx == send_sq->head_dep_idx);
ste_attr.send_attr.user_data = dep_wqe->user_data;
ste_attr.send_attr.rule = dep_wqe->rule;
ste_attr.send_attr.fence = 0;
struct mlx5hws_send_engine_post_attr send_attr;
.send_attr = sunvnet_send_attr_common,
.send_attr = sunvnet_send_attr_common,