|
@@ -666,6 +666,19 @@ static int set_qp_rss(struct mlx4_ib_dev *dev, struct mlx4_ib_rss *rss_ctx,
|
|
|
return (-EOPNOTSUPP);
|
|
|
}
|
|
|
|
|
|
+ if (ucmd->rx_hash_fields_mask & ~(MLX4_IB_RX_HASH_SRC_IPV4 |
|
|
|
+ MLX4_IB_RX_HASH_DST_IPV4 |
|
|
|
+ MLX4_IB_RX_HASH_SRC_IPV6 |
|
|
|
+ MLX4_IB_RX_HASH_DST_IPV6 |
|
|
|
+ MLX4_IB_RX_HASH_SRC_PORT_TCP |
|
|
|
+ MLX4_IB_RX_HASH_DST_PORT_TCP |
|
|
|
+ MLX4_IB_RX_HASH_SRC_PORT_UDP |
|
|
|
+ MLX4_IB_RX_HASH_DST_PORT_UDP)) {
|
|
|
+ pr_debug("RX Hash fields_mask has unsupported mask (0x%llx)\n",
|
|
|
+ ucmd->rx_hash_fields_mask);
|
|
|
+ return (-EOPNOTSUPP);
|
|
|
+ }
|
|
|
+
|
|
|
if ((ucmd->rx_hash_fields_mask & MLX4_IB_RX_HASH_SRC_IPV4) &&
|
|
|
(ucmd->rx_hash_fields_mask & MLX4_IB_RX_HASH_DST_IPV4)) {
|
|
|
rss_ctx->flags = MLX4_RSS_IPV4;
|
|
@@ -691,11 +704,11 @@ static int set_qp_rss(struct mlx4_ib_dev *dev, struct mlx4_ib_rss *rss_ctx,
|
|
|
return (-EOPNOTSUPP);
|
|
|
}
|
|
|
|
|
|
- if (rss_ctx->flags & MLX4_RSS_IPV4) {
|
|
|
+ if (rss_ctx->flags & MLX4_RSS_IPV4)
|
|
|
rss_ctx->flags |= MLX4_RSS_UDP_IPV4;
|
|
|
- } else if (rss_ctx->flags & MLX4_RSS_IPV6) {
|
|
|
+ if (rss_ctx->flags & MLX4_RSS_IPV6)
|
|
|
rss_ctx->flags |= MLX4_RSS_UDP_IPV6;
|
|
|
- } else {
|
|
|
+ if (!(rss_ctx->flags & (MLX4_RSS_IPV6 | MLX4_RSS_IPV4))) {
|
|
|
pr_debug("RX Hash fields_mask is not supported - UDP must be set with IPv4 or IPv6\n");
|
|
|
return (-EOPNOTSUPP);
|
|
|
}
|
|
@@ -707,15 +720,14 @@ static int set_qp_rss(struct mlx4_ib_dev *dev, struct mlx4_ib_rss *rss_ctx,
|
|
|
|
|
|
if ((ucmd->rx_hash_fields_mask & MLX4_IB_RX_HASH_SRC_PORT_TCP) &&
|
|
|
(ucmd->rx_hash_fields_mask & MLX4_IB_RX_HASH_DST_PORT_TCP)) {
|
|
|
- if (rss_ctx->flags & MLX4_RSS_IPV4) {
|
|
|
+ if (rss_ctx->flags & MLX4_RSS_IPV4)
|
|
|
rss_ctx->flags |= MLX4_RSS_TCP_IPV4;
|
|
|
- } else if (rss_ctx->flags & MLX4_RSS_IPV6) {
|
|
|
+ if (rss_ctx->flags & MLX4_RSS_IPV6)
|
|
|
rss_ctx->flags |= MLX4_RSS_TCP_IPV6;
|
|
|
- } else {
|
|
|
+ if (!(rss_ctx->flags & (MLX4_RSS_IPV6 | MLX4_RSS_IPV4))) {
|
|
|
pr_debug("RX Hash fields_mask is not supported - TCP must be set with IPv4 or IPv6\n");
|
|
|
return (-EOPNOTSUPP);
|
|
|
}
|
|
|
-
|
|
|
} else if ((ucmd->rx_hash_fields_mask & MLX4_IB_RX_HASH_SRC_PORT_TCP) ||
|
|
|
(ucmd->rx_hash_fields_mask & MLX4_IB_RX_HASH_DST_PORT_TCP)) {
|
|
|
pr_debug("RX Hash fields_mask is not supported - both TCP SRC and DST must be set\n");
|