|
|
@@ -4604,6 +4604,7 @@ static int create_rq(struct mlx5_ib_rwq *rwq, struct ib_pd *pd,
|
|
|
struct ib_wq_init_attr *init_attr)
|
|
|
{
|
|
|
struct mlx5_ib_dev *dev;
|
|
|
+ int has_net_offloads;
|
|
|
__be64 *rq_pas0;
|
|
|
void *in;
|
|
|
void *rqc;
|
|
|
@@ -4635,9 +4636,9 @@ static int create_rq(struct mlx5_ib_rwq *rwq, struct ib_pd *pd,
|
|
|
MLX5_SET(wq, wq, log_wq_pg_sz, rwq->log_page_size);
|
|
|
MLX5_SET(wq, wq, wq_signature, rwq->wq_sig);
|
|
|
MLX5_SET64(wq, wq, dbr_addr, rwq->db.dma);
|
|
|
+ has_net_offloads = MLX5_CAP_GEN(dev->mdev, eth_net_offloads);
|
|
|
if (init_attr->create_flags & IB_WQ_FLAGS_CVLAN_STRIPPING) {
|
|
|
- if (!(MLX5_CAP_GEN(dev->mdev, eth_net_offloads) &&
|
|
|
- MLX5_CAP_ETH(dev->mdev, vlan_cap))) {
|
|
|
+ if (!(has_net_offloads && MLX5_CAP_ETH(dev->mdev, vlan_cap))) {
|
|
|
mlx5_ib_dbg(dev, "VLAN offloads are not supported\n");
|
|
|
err = -EOPNOTSUPP;
|
|
|
goto out;
|
|
|
@@ -4645,6 +4646,14 @@ static int create_rq(struct mlx5_ib_rwq *rwq, struct ib_pd *pd,
|
|
|
} else {
|
|
|
MLX5_SET(rqc, rqc, vsd, 1);
|
|
|
}
|
|
|
+ if (init_attr->create_flags & IB_WQ_FLAGS_SCATTER_FCS) {
|
|
|
+ if (!(has_net_offloads && MLX5_CAP_ETH(dev->mdev, scatter_fcs))) {
|
|
|
+ mlx5_ib_dbg(dev, "Scatter FCS is not supported\n");
|
|
|
+ err = -EOPNOTSUPP;
|
|
|
+ goto out;
|
|
|
+ }
|
|
|
+ MLX5_SET(rqc, rqc, scatter_fcs, 1);
|
|
|
+ }
|
|
|
rq_pas0 = (__be64 *)MLX5_ADDR_OF(wq, wq, pas);
|
|
|
mlx5_ib_populate_pas(dev, rwq->umem, rwq->page_shift, rq_pas0, 0);
|
|
|
err = mlx5_core_create_rq_tracked(dev->mdev, in, inlen, &rwq->core_qp);
|