Skip to content

Commit 8c1a91f

Browse files
committed
Merge branch 'mlx4-802.1ad-accel'
Amir Vadai says: ==================== net/mlx4_en: Hardware accelerated 802.1ad This patchset by Hadar introduces support in Hardware accelerated 802.1ad, for ConnectX-3pro NIC's. In order to support existing deployment, and due to some hardware limitations, the feature is disabled by default, and needed to be enabled using a private flag in ethtool. Ofcourse user can enable the private flag only if hardware has support. After being enabled, the standard ethtool -k/-K can be used. Patchset was applied and tested over commit 71790a2 ("hv_netvsc: Add structs and handlers for VF messages") ==================== Signed-off-by: David S. Miller <[email protected]>
2 parents 0b42c28 + e38af4f commit 8c1a91f

File tree

13 files changed

+218
-29
lines changed

13 files changed

+218
-29
lines changed

drivers/infiniband/hw/mlx4/cq.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -871,7 +871,7 @@ static int mlx4_ib_poll_one(struct mlx4_ib_cq *cq,
871871
if (is_eth) {
872872
wc->sl = be16_to_cpu(cqe->sl_vid) >> 13;
873873
if (be32_to_cpu(cqe->vlan_my_qpn) &
874-
MLX4_CQE_VLAN_PRESENT_MASK) {
874+
MLX4_CQE_CVLAN_PRESENT_MASK) {
875875
wc->vlan_id = be16_to_cpu(cqe->sl_vid) &
876876
MLX4_CQE_VID_MASK;
877877
} else {

drivers/net/ethernet/mellanox/mlx4/en_ethtool.c

Lines changed: 33 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,7 @@ mlx4_en_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *drvinfo)
102102

103103
static const char mlx4_en_priv_flags[][ETH_GSTRING_LEN] = {
104104
"blueflame",
105+
"phv-bit"
105106
};
106107

107108
static const char main_strings[][ETH_GSTRING_LEN] = {
@@ -1797,35 +1798,49 @@ static int mlx4_en_get_ts_info(struct net_device *dev,
17971798
static int mlx4_en_set_priv_flags(struct net_device *dev, u32 flags)
17981799
{
17991800
struct mlx4_en_priv *priv = netdev_priv(dev);
1801+
struct mlx4_en_dev *mdev = priv->mdev;
18001802
bool bf_enabled_new = !!(flags & MLX4_EN_PRIV_FLAGS_BLUEFLAME);
18011803
bool bf_enabled_old = !!(priv->pflags & MLX4_EN_PRIV_FLAGS_BLUEFLAME);
1804+
bool phv_enabled_new = !!(flags & MLX4_EN_PRIV_FLAGS_PHV);
1805+
bool phv_enabled_old = !!(priv->pflags & MLX4_EN_PRIV_FLAGS_PHV);
18021806
int i;
1807+
int ret = 0;
18031808

1804-
if (bf_enabled_new == bf_enabled_old)
1805-
return 0; /* Nothing to do */
1809+
if (bf_enabled_new != bf_enabled_old) {
1810+
if (bf_enabled_new) {
1811+
bool bf_supported = true;
18061812

1807-
if (bf_enabled_new) {
1808-
bool bf_supported = true;
1813+
for (i = 0; i < priv->tx_ring_num; i++)
1814+
bf_supported &= priv->tx_ring[i]->bf_alloced;
18091815

1810-
for (i = 0; i < priv->tx_ring_num; i++)
1811-
bf_supported &= priv->tx_ring[i]->bf_alloced;
1816+
if (!bf_supported) {
1817+
en_err(priv, "BlueFlame is not supported\n");
1818+
return -EINVAL;
1819+
}
18121820

1813-
if (!bf_supported) {
1814-
en_err(priv, "BlueFlame is not supported\n");
1815-
return -EINVAL;
1821+
priv->pflags |= MLX4_EN_PRIV_FLAGS_BLUEFLAME;
1822+
} else {
1823+
priv->pflags &= ~MLX4_EN_PRIV_FLAGS_BLUEFLAME;
18161824
}
18171825

1818-
priv->pflags |= MLX4_EN_PRIV_FLAGS_BLUEFLAME;
1819-
} else {
1820-
priv->pflags &= ~MLX4_EN_PRIV_FLAGS_BLUEFLAME;
1821-
}
1822-
1823-
for (i = 0; i < priv->tx_ring_num; i++)
1824-
priv->tx_ring[i]->bf_enabled = bf_enabled_new;
1826+
for (i = 0; i < priv->tx_ring_num; i++)
1827+
priv->tx_ring[i]->bf_enabled = bf_enabled_new;
18251828

1826-
en_info(priv, "BlueFlame %s\n",
1827-
bf_enabled_new ? "Enabled" : "Disabled");
1829+
en_info(priv, "BlueFlame %s\n",
1830+
bf_enabled_new ? "Enabled" : "Disabled");
1831+
}
18281832

1833+
if (phv_enabled_new != phv_enabled_old) {
1834+
ret = set_phv_bit(mdev->dev, priv->port, (int)phv_enabled_new);
1835+
if (ret)
1836+
return ret;
1837+
else if (phv_enabled_new)
1838+
priv->pflags |= MLX4_EN_PRIV_FLAGS_PHV;
1839+
else
1840+
priv->pflags &= ~MLX4_EN_PRIV_FLAGS_PHV;
1841+
en_info(priv, "PHV bit %s\n",
1842+
phv_enabled_new ? "Enabled" : "Disabled");
1843+
}
18291844
return 0;
18301845
}
18311846

drivers/net/ethernet/mellanox/mlx4/en_netdev.c

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2184,6 +2184,25 @@ static int mlx4_en_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
21842184
}
21852185
}
21862186

2187+
static netdev_features_t mlx4_en_fix_features(struct net_device *netdev,
2188+
netdev_features_t features)
2189+
{
2190+
struct mlx4_en_priv *en_priv = netdev_priv(netdev);
2191+
struct mlx4_en_dev *mdev = en_priv->mdev;
2192+
2193+
/* Since there is no support for separate RX C-TAG/S-TAG vlan accel
2194+
* enable/disable make sure S-TAG flag is always in same state as
2195+
* C-TAG.
2196+
*/
2197+
if (features & NETIF_F_HW_VLAN_CTAG_RX &&
2198+
!(mdev->dev->caps.flags2 & MLX4_DEV_CAP_FLAG2_SKIP_OUTER_VLAN))
2199+
features |= NETIF_F_HW_VLAN_STAG_RX;
2200+
else
2201+
features &= ~NETIF_F_HW_VLAN_STAG_RX;
2202+
2203+
return features;
2204+
}
2205+
21872206
static int mlx4_en_set_features(struct net_device *netdev,
21882207
netdev_features_t features)
21892208
{
@@ -2218,6 +2237,10 @@ static int mlx4_en_set_features(struct net_device *netdev,
22182237
en_info(priv, "Turn %s TX vlan strip offload\n",
22192238
(features & NETIF_F_HW_VLAN_CTAG_TX) ? "ON" : "OFF");
22202239

2240+
if (DEV_FEATURE_CHANGED(netdev, features, NETIF_F_HW_VLAN_STAG_TX))
2241+
en_info(priv, "Turn %s TX S-VLAN strip offload\n",
2242+
(features & NETIF_F_HW_VLAN_STAG_TX) ? "ON" : "OFF");
2243+
22212244
if (DEV_FEATURE_CHANGED(netdev, features, NETIF_F_LOOPBACK)) {
22222245
en_info(priv, "Turn %s loopback\n",
22232246
(features & NETIF_F_LOOPBACK) ? "ON" : "OFF");
@@ -2460,6 +2483,7 @@ static const struct net_device_ops mlx4_netdev_ops = {
24602483
.ndo_poll_controller = mlx4_en_netpoll,
24612484
#endif
24622485
.ndo_set_features = mlx4_en_set_features,
2486+
.ndo_fix_features = mlx4_en_fix_features,
24632487
.ndo_setup_tc = mlx4_en_setup_tc,
24642488
#ifdef CONFIG_RFS_ACCEL
24652489
.ndo_rx_flow_steer = mlx4_en_filter_rfs,
@@ -2500,6 +2524,7 @@ static const struct net_device_ops mlx4_netdev_ops_master = {
25002524
.ndo_poll_controller = mlx4_en_netpoll,
25012525
#endif
25022526
.ndo_set_features = mlx4_en_set_features,
2527+
.ndo_fix_features = mlx4_en_fix_features,
25032528
.ndo_setup_tc = mlx4_en_setup_tc,
25042529
#ifdef CONFIG_RFS_ACCEL
25052530
.ndo_rx_flow_steer = mlx4_en_filter_rfs,
@@ -2931,6 +2956,27 @@ int mlx4_en_init_netdev(struct mlx4_en_dev *mdev, int port,
29312956
dev->hw_features |= NETIF_F_LOOPBACK |
29322957
NETIF_F_HW_VLAN_CTAG_TX | NETIF_F_HW_VLAN_CTAG_RX;
29332958

2959+
if (!(mdev->dev->caps.flags2 & MLX4_DEV_CAP_FLAG2_SKIP_OUTER_VLAN)) {
2960+
dev->features |= NETIF_F_HW_VLAN_STAG_RX |
2961+
NETIF_F_HW_VLAN_STAG_FILTER;
2962+
dev->hw_features |= NETIF_F_HW_VLAN_STAG_RX;
2963+
}
2964+
2965+
if (mlx4_is_slave(mdev->dev)) {
2966+
int phv;
2967+
2968+
err = get_phv_bit(mdev->dev, port, &phv);
2969+
if (!err && phv) {
2970+
dev->hw_features |= NETIF_F_HW_VLAN_STAG_TX;
2971+
priv->pflags |= MLX4_EN_PRIV_FLAGS_PHV;
2972+
}
2973+
} else {
2974+
if (mdev->dev->caps.flags2 & MLX4_DEV_CAP_FLAG2_PHV_EN &&
2975+
!(mdev->dev->caps.flags2 &
2976+
MLX4_DEV_CAP_FLAG2_SKIP_OUTER_VLAN))
2977+
dev->hw_features |= NETIF_F_HW_VLAN_STAG_TX;
2978+
}
2979+
29342980
if (mdev->dev->caps.flags & MLX4_DEV_CAP_FLAG_FCS_KEEP)
29352981
dev->hw_features |= NETIF_F_RXFCS;
29362982

drivers/net/ethernet/mellanox/mlx4/en_rx.c

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -726,7 +726,7 @@ static int check_csum(struct mlx4_cqe *cqe, struct sk_buff *skb, void *va,
726726

727727
hw_checksum = csum_unfold((__force __sum16)cqe->checksum);
728728

729-
if (cqe->vlan_my_qpn & cpu_to_be32(MLX4_CQE_VLAN_PRESENT_MASK) &&
729+
if (cqe->vlan_my_qpn & cpu_to_be32(MLX4_CQE_CVLAN_PRESENT_MASK) &&
730730
!(dev_features & NETIF_F_HW_VLAN_CTAG_RX)) {
731731
hw_checksum = get_fixed_vlan_csum(hw_checksum, hdr);
732732
hdr += sizeof(struct vlan_hdr);
@@ -907,11 +907,17 @@ int mlx4_en_process_rx_cq(struct net_device *dev, struct mlx4_en_cq *cq, int bud
907907
gro_skb->csum_level = 1;
908908

909909
if ((cqe->vlan_my_qpn &
910-
cpu_to_be32(MLX4_CQE_VLAN_PRESENT_MASK)) &&
910+
cpu_to_be32(MLX4_CQE_CVLAN_PRESENT_MASK)) &&
911911
(dev->features & NETIF_F_HW_VLAN_CTAG_RX)) {
912912
u16 vid = be16_to_cpu(cqe->sl_vid);
913913

914914
__vlan_hwaccel_put_tag(gro_skb, htons(ETH_P_8021Q), vid);
915+
} else if ((be32_to_cpu(cqe->vlan_my_qpn) &
916+
MLX4_CQE_SVLAN_PRESENT_MASK) &&
917+
(dev->features & NETIF_F_HW_VLAN_STAG_RX)) {
918+
__vlan_hwaccel_put_tag(gro_skb,
919+
htons(ETH_P_8021AD),
920+
be16_to_cpu(cqe->sl_vid));
915921
}
916922

917923
if (dev->features & NETIF_F_RXHASH)
@@ -970,9 +976,14 @@ int mlx4_en_process_rx_cq(struct net_device *dev, struct mlx4_en_cq *cq, int bud
970976
PKT_HASH_TYPE_L3);
971977

972978
if ((be32_to_cpu(cqe->vlan_my_qpn) &
973-
MLX4_CQE_VLAN_PRESENT_MASK) &&
979+
MLX4_CQE_CVLAN_PRESENT_MASK) &&
974980
(dev->features & NETIF_F_HW_VLAN_CTAG_RX))
975981
__vlan_hwaccel_put_tag(skb, htons(ETH_P_8021Q), be16_to_cpu(cqe->sl_vid));
982+
else if ((be32_to_cpu(cqe->vlan_my_qpn) &
983+
MLX4_CQE_SVLAN_PRESENT_MASK) &&
984+
(dev->features & NETIF_F_HW_VLAN_STAG_RX))
985+
__vlan_hwaccel_put_tag(skb, htons(ETH_P_8021AD),
986+
be16_to_cpu(cqe->sl_vid));
976987

977988
if (ring->hwtstamp_rx_filter == HWTSTAMP_FILTER_ALL) {
978989
timestamp = mlx4_en_get_cqe_ts(cqe);
@@ -1070,7 +1081,10 @@ static const int frag_sizes[] = {
10701081
void mlx4_en_calc_rx_buf(struct net_device *dev)
10711082
{
10721083
struct mlx4_en_priv *priv = netdev_priv(dev);
1073-
int eff_mtu = dev->mtu + ETH_HLEN + VLAN_HLEN;
1084+
/* VLAN_HLEN is added twice,to support skb vlan tagged with multiple
1085+
* headers. (For example: ETH_P_8021Q and ETH_P_8021AD).
1086+
*/
1087+
int eff_mtu = dev->mtu + ETH_HLEN + (2 * VLAN_HLEN);
10741088
int buf_size = 0;
10751089
int i = 0;
10761090

drivers/net/ethernet/mellanox/mlx4/en_tx.c

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -718,6 +718,7 @@ netdev_tx_t mlx4_en_xmit(struct sk_buff *skb, struct net_device *dev)
718718
u32 index, bf_index;
719719
__be32 op_own;
720720
u16 vlan_tag = 0;
721+
u16 vlan_proto = 0;
721722
int i_frag;
722723
int lso_header_size;
723724
void *fragptr = NULL;
@@ -750,9 +751,10 @@ netdev_tx_t mlx4_en_xmit(struct sk_buff *skb, struct net_device *dev)
750751
goto tx_drop;
751752
}
752753

753-
if (skb_vlan_tag_present(skb))
754+
if (skb_vlan_tag_present(skb)) {
754755
vlan_tag = skb_vlan_tag_get(skb);
755-
756+
vlan_proto = be16_to_cpu(skb->vlan_proto);
757+
}
756758

757759
netdev_txq_bql_enqueue_prefetchw(ring->tx_queue);
758760

@@ -958,8 +960,11 @@ netdev_tx_t mlx4_en_xmit(struct sk_buff *skb, struct net_device *dev)
958960
ring->bf.offset ^= ring->bf.buf_size;
959961
} else {
960962
tx_desc->ctrl.vlan_tag = cpu_to_be16(vlan_tag);
961-
tx_desc->ctrl.ins_vlan = MLX4_WQE_CTRL_INS_VLAN *
962-
!!skb_vlan_tag_present(skb);
963+
if (vlan_proto == ETH_P_8021AD)
964+
tx_desc->ctrl.ins_vlan = MLX4_WQE_CTRL_INS_SVLAN;
965+
else if (vlan_proto == ETH_P_8021Q)
966+
tx_desc->ctrl.ins_vlan = MLX4_WQE_CTRL_INS_CVLAN;
967+
963968
tx_desc->ctrl.fence_size = real_size;
964969

965970
/* Ensure new descriptor hits memory

drivers/net/ethernet/mellanox/mlx4/fw.c

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,7 @@ static void dump_dev_cap_flags2(struct mlx4_dev *dev, u64 flags)
154154
[26] = "Port ETS Scheduler support",
155155
[27] = "Port beacon support",
156156
[28] = "RX-ALL support",
157+
[29] = "802.1ad offload support",
157158
};
158159
int i;
159160

@@ -307,6 +308,7 @@ int mlx4_QUERY_FUNC_CAP_wrapper(struct mlx4_dev *dev, int slave,
307308

308309
#define QUERY_FUNC_CAP_FLAGS0_FORCE_PHY_WQE_GID 0x80
309310
#define QUERY_FUNC_CAP_SUPPORTS_NON_POWER_OF_2_NUM_EQS (1 << 31)
311+
#define QUERY_FUNC_CAP_PHV_BIT 0x40
310312

311313
if (vhcr->op_modifier == 1) {
312314
struct mlx4_active_ports actv_ports =
@@ -351,6 +353,12 @@ int mlx4_QUERY_FUNC_CAP_wrapper(struct mlx4_dev *dev, int slave,
351353
MLX4_PUT(outbox->buf, dev->caps.phys_port_id[vhcr->in_modifier],
352354
QUERY_FUNC_CAP_PHYS_PORT_ID);
353355

356+
if (dev->caps.phv_bit[port]) {
357+
field = QUERY_FUNC_CAP_PHV_BIT;
358+
MLX4_PUT(outbox->buf, field,
359+
QUERY_FUNC_CAP_FLAGS0_OFFSET);
360+
}
361+
354362
} else if (vhcr->op_modifier == 0) {
355363
struct mlx4_active_ports actv_ports =
356364
mlx4_get_active_ports(dev, slave);
@@ -600,6 +608,9 @@ int mlx4_QUERY_FUNC_CAP(struct mlx4_dev *dev, u8 gen_or_port,
600608
MLX4_GET(func_cap->phys_port_id, outbox,
601609
QUERY_FUNC_CAP_PHYS_PORT_ID);
602610

611+
MLX4_GET(field, outbox, QUERY_FUNC_CAP_FLAGS0_OFFSET);
612+
func_cap->flags |= (field & QUERY_FUNC_CAP_PHV_BIT);
613+
603614
/* All other resources are allocated by the master, but we still report
604615
* 'num' and 'reserved' capabilities as follows:
605616
* - num remains the maximum resource index
@@ -700,6 +711,7 @@ int mlx4_QUERY_DEV_CAP(struct mlx4_dev *dev, struct mlx4_dev_cap *dev_cap)
700711
#define QUERY_DEV_CAP_D_MPT_ENTRY_SZ_OFFSET 0x92
701712
#define QUERY_DEV_CAP_BMME_FLAGS_OFFSET 0x94
702713
#define QUERY_DEV_CAP_CONFIG_DEV_OFFSET 0x94
714+
#define QUERY_DEV_CAP_PHV_EN_OFFSET 0x96
703715
#define QUERY_DEV_CAP_RSVD_LKEY_OFFSET 0x98
704716
#define QUERY_DEV_CAP_MAX_ICM_SZ_OFFSET 0xa0
705717
#define QUERY_DEV_CAP_ETH_BACKPL_OFFSET 0x9c
@@ -898,6 +910,12 @@ int mlx4_QUERY_DEV_CAP(struct mlx4_dev *dev, struct mlx4_dev_cap *dev_cap)
898910
dev_cap->flags2 |= MLX4_DEV_CAP_FLAG2_CONFIG_DEV;
899911
if (field & (1 << 2))
900912
dev_cap->flags2 |= MLX4_DEV_CAP_FLAG2_IGNORE_FCS;
913+
MLX4_GET(field, outbox, QUERY_DEV_CAP_PHV_EN_OFFSET);
914+
if (field & 0x80)
915+
dev_cap->flags2 |= MLX4_DEV_CAP_FLAG2_PHV_EN;
916+
if (field & 0x40)
917+
dev_cap->flags2 |= MLX4_DEV_CAP_FLAG2_SKIP_OUTER_VLAN;
918+
901919
MLX4_GET(dev_cap->reserved_lkey, outbox,
902920
QUERY_DEV_CAP_RSVD_LKEY_OFFSET);
903921
MLX4_GET(field32, outbox, QUERY_DEV_CAP_ETH_BACKPL_OFFSET);
@@ -1992,6 +2010,10 @@ int mlx4_QUERY_HCA(struct mlx4_dev *dev,
19922010
MLX4_GET(param->uar_page_sz, outbox, INIT_HCA_UAR_PAGE_SZ_OFFSET);
19932011
MLX4_GET(param->log_uar_sz, outbox, INIT_HCA_LOG_UAR_SZ_OFFSET);
19942012

2013+
/* phv_check enable */
2014+
MLX4_GET(byte_field, outbox, INIT_HCA_CACHELINE_SZ_OFFSET);
2015+
if (byte_field & 0x2)
2016+
param->phv_check_en = 1;
19952017
out:
19962018
mlx4_free_cmd_mailbox(dev, mailbox);
19972019

@@ -2758,3 +2780,63 @@ int mlx4_ACCESS_REG_wrapper(struct mlx4_dev *dev, int slave,
27582780
0, MLX4_CMD_ACCESS_REG, MLX4_CMD_TIME_CLASS_C,
27592781
MLX4_CMD_NATIVE);
27602782
}
2783+
2784+
static int mlx4_SET_PORT_phv_bit(struct mlx4_dev *dev, u8 port, u8 phv_bit)
2785+
{
2786+
#define SET_PORT_GEN_PHV_VALID 0x10
2787+
#define SET_PORT_GEN_PHV_EN 0x80
2788+
2789+
struct mlx4_cmd_mailbox *mailbox;
2790+
struct mlx4_set_port_general_context *context;
2791+
u32 in_mod;
2792+
int err;
2793+
2794+
mailbox = mlx4_alloc_cmd_mailbox(dev);
2795+
if (IS_ERR(mailbox))
2796+
return PTR_ERR(mailbox);
2797+
context = mailbox->buf;
2798+
2799+
context->v_ignore_fcs |= SET_PORT_GEN_PHV_VALID;
2800+
if (phv_bit)
2801+
context->phv_en |= SET_PORT_GEN_PHV_EN;
2802+
2803+
in_mod = MLX4_SET_PORT_GENERAL << 8 | port;
2804+
err = mlx4_cmd(dev, mailbox->dma, in_mod, MLX4_SET_PORT_ETH_OPCODE,
2805+
MLX4_CMD_SET_PORT, MLX4_CMD_TIME_CLASS_B,
2806+
MLX4_CMD_NATIVE);
2807+
2808+
mlx4_free_cmd_mailbox(dev, mailbox);
2809+
return err;
2810+
}
2811+
2812+
int get_phv_bit(struct mlx4_dev *dev, u8 port, int *phv)
2813+
{
2814+
int err;
2815+
struct mlx4_func_cap func_cap;
2816+
2817+
memset(&func_cap, 0, sizeof(func_cap));
2818+
err = mlx4_QUERY_FUNC_CAP(dev, 1, &func_cap);
2819+
if (!err)
2820+
*phv = func_cap.flags & QUERY_FUNC_CAP_PHV_BIT;
2821+
return err;
2822+
}
2823+
EXPORT_SYMBOL(get_phv_bit);
2824+
2825+
int set_phv_bit(struct mlx4_dev *dev, u8 port, int new_val)
2826+
{
2827+
int ret;
2828+
2829+
if (mlx4_is_slave(dev))
2830+
return -EPERM;
2831+
2832+
if (dev->caps.flags2 & MLX4_DEV_CAP_FLAG2_PHV_EN &&
2833+
!(dev->caps.flags2 & MLX4_DEV_CAP_FLAG2_SKIP_OUTER_VLAN)) {
2834+
ret = mlx4_SET_PORT_phv_bit(dev, port, new_val);
2835+
if (!ret)
2836+
dev->caps.phv_bit[port] = new_val;
2837+
return ret;
2838+
}
2839+
2840+
return -EOPNOTSUPP;
2841+
}
2842+
EXPORT_SYMBOL(set_phv_bit);

drivers/net/ethernet/mellanox/mlx4/fw.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -204,6 +204,7 @@ struct mlx4_init_hca_param {
204204
u16 cqe_size; /* For use only when CQE stride feature enabled */
205205
u16 eqe_size; /* For use only when EQE stride feature enabled */
206206
u8 rss_ip_frags;
207+
u8 phv_check_en; /* for QUERY_HCA */
207208
};
208209

209210
struct mlx4_init_ib_param {

0 commit comments

Comments
 (0)