int mlx5_wq_ll_create(struct mlx5_core_dev *mdev, struct mlx5_wq_param *param, void *wqc, struct mlx5_wq_ll *wq, struct mlx5_wq_ctrl *wq_ctrl) { struct mlx5_wqe_srq_next_seg *next_seg; int max_direct = param->linear ? INT_MAX : 0; int err; int i; wq->log_stride = MLX5_GET(wq, wqc, log_wq_stride); wq->sz_m1 = (1 << MLX5_GET(wq, wqc, log_wq_sz)) - 1; err = mlx5_db_alloc_node(mdev, &wq_ctrl->db, param->db_numa_node); if (err) { mlx5_core_warn(mdev, "mlx5_db_alloc() failed, %d\n", err); return err; } err = mlx5_buf_alloc_node(mdev, mlx5_wq_ll_get_byte_size(wq), max_direct, &wq_ctrl->buf, param->buf_numa_node); if (err) { mlx5_core_warn(mdev, "mlx5_buf_alloc() failed, %d\n", err); goto err_db_free; } wq->buf = wq_ctrl->buf.direct.buf; wq->db = wq_ctrl->db.db; for (i = 0; i < wq->sz_m1; i++) { next_seg = mlx5_wq_ll_get_wqe(wq, i); next_seg->next_wqe_index = cpu_to_be16(i + 1); } next_seg = mlx5_wq_ll_get_wqe(wq, i); wq->tail_next = &next_seg->next_wqe_index; wq_ctrl->mdev = mdev; return 0; err_db_free: mlx5_db_free(mdev, &wq_ctrl->db); return err; }
int mlx5_wq_ll_create(struct mlx5_core_dev *mdev, struct mlx5_wq_param *param, void *wqc, struct mlx5_wq_ll *wq, struct mlx5_wq_ctrl *wq_ctrl) { struct mlx5_frag_buf_ctrl *fbc = &wq->fbc; struct mlx5_wqe_srq_next_seg *next_seg; int err; int i; mlx5_fill_fbc(MLX5_GET(wq, wqc, log_wq_stride), MLX5_GET(wq, wqc, log_wq_sz), fbc); err = mlx5_db_alloc_node(mdev, &wq_ctrl->db, param->db_numa_node); if (err) { mlx5_core_warn(mdev, "mlx5_db_alloc_node() failed, %d\n", err); return err; } err = mlx5_frag_buf_alloc_node(mdev, mlx5_wq_ll_get_byte_size(wq), &wq_ctrl->buf, param->buf_numa_node); if (err) { mlx5_core_warn(mdev, "mlx5_frag_buf_alloc_node() failed, %d\n", err); goto err_db_free; } wq->fbc.frag_buf = wq_ctrl->buf; wq->db = wq_ctrl->db.db; for (i = 0; i < fbc->sz_m1; i++) { next_seg = mlx5_wq_ll_get_wqe(wq, i); next_seg->next_wqe_index = cpu_to_be16(i + 1); } next_seg = mlx5_wq_ll_get_wqe(wq, i); wq->tail_next = &next_seg->next_wqe_index; wq_ctrl->mdev = mdev; return 0; err_db_free: mlx5_db_free(mdev, &wq_ctrl->db); return err; }