Merge tag 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dledford/rdma
authorLinus Torvalds <torvalds@linux-foundation.org>
Fri, 18 Mar 2016 16:39:22 +0000 (09:39 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Fri, 18 Mar 2016 16:39:22 +0000 (09:39 -0700)
Pull rdma updates from Doug Ledford:
 "Initial roundup of 4.6 merge window patches.

  This is the first of two pull requests.  It is the smaller request,
  but touches for more different things (this is everything but what is
  in or going into staging).  The pull request for the code in
  staging/rdma is on hold until after we decide what to do on the
  write/writev API issue and may be partially deferred until 4.7 as a
  result.

  Summary:

   - cxgb4 updates
   - nes updates
   - unification of iwarp portmapper code to core
   - add drain_cq API
   - various ib_core updates
   - minor ipoib updates
   - minor mlx4 updates
   - more significant mlx5 updates (including a minor merge conflict
     with net-next tree...merge is simple to resolve and Stephen's
     resolution was confirmed by Mellanox)
   - trivial net/9p rdma conversion
   - ocrdma RoCEv2 update
   - srpt updates"

* tag 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dledford/rdma: (85 commits)
  iwpm: crash fix for large connections test
  iw_cxgb3: support for iWARP port mapping
  iw_cxgb4: remove port mapper related code
  iw_nes: remove port mapper related code
  iwcm: common code for port mapper
  net/9p: convert to new CQ API
  IB/mlx5: Add support for don't trap rules
  net/mlx5_core: Introduce forward to next priority action
  net/mlx5_core: Create anchor of last flow table
  iser: Accept arbitrary sg lists mapping if the device supports it
  mlx5: Add arbitrary sg list support
  IB/core: Add arbitrary sg_list support
  IB/mlx5: Expose correct max_fast_reg_page_list_len
  IB/mlx5: Make coding style more consistent
  IB/mlx5: Convert UMR CQ to new CQ API
  IB/ocrdma: Skip using unneeded intermediate variable
  IB/ocrdma: Skip using unneeded intermediate variable
  IB/ocrdma: Delete unnecessary variable initialisations in 11 functions
  IB/core: Documentation fix in the MAD header file
  IB/core: trivial prink cleanup.
  ...

1  2 
drivers/infiniband/core/sa_query.c
drivers/net/ethernet/mellanox/mlx5/core/en.h
drivers/net/ethernet/mellanox/mlx5/core/en_main.c
include/linux/mlx5/mlx5_ifc.h

index 1e37f3515d98a7fba49a7cbd57975ba2b8492bd5,8e3bf6c8d3c3ef120e3e93145583af0006eba53e..b5656a2298ee0b1aa88f0cf50672f533b0a0fb6e
@@@ -864,13 -864,12 +864,12 @@@ static void update_sm_ah(struct work_st
        struct ib_ah_attr   ah_attr;
  
        if (ib_query_port(port->agent->device, port->port_num, &port_attr)) {
-               printk(KERN_WARNING "Couldn't query port\n");
+               pr_warn("Couldn't query port\n");
                return;
        }
  
        new_ah = kmalloc(sizeof *new_ah, GFP_KERNEL);
        if (!new_ah) {
-               printk(KERN_WARNING "Couldn't allocate new SM AH\n");
                return;
        }
  
        new_ah->pkey_index = 0;
        if (ib_find_pkey(port->agent->device, port->port_num,
                         IB_DEFAULT_PKEY_FULL, &new_ah->pkey_index))
-               printk(KERN_ERR "Couldn't find index for default PKey\n");
+               pr_err("Couldn't find index for default PKey\n");
  
        memset(&ah_attr, 0, sizeof ah_attr);
        ah_attr.dlid     = port_attr.sm_lid;
  
        new_ah->ah = ib_create_ah(port->agent->qp->pd, &ah_attr);
        if (IS_ERR(new_ah->ah)) {
-               printk(KERN_WARNING "Couldn't create new SM AH\n");
+               pr_warn("Couldn't create new SM AH\n");
                kfree(new_ah);
                return;
        }
@@@ -1071,7 -1070,7 +1070,7 @@@ int ib_init_ah_from_path(struct ib_devi
                }
        }
  
 -      if (rec->hop_limit > 1 || use_roce) {
 +      if (rec->hop_limit > 0 || use_roce) {
                ah_attr->ah_flags = IB_AH_GRH;
                ah_attr->grh.dgid = rec->dgid;
  
@@@ -1221,7 -1220,7 +1220,7 @@@ static void ib_sa_path_rec_callback(str
                rec.net = NULL;
                rec.ifindex = 0;
                rec.gid_type = IB_GID_TYPE_IB;
-               memset(rec.dmac, 0, ETH_ALEN);
+               eth_zero_addr(rec.dmac);
                query->callback(status, &rec, query->context);
        } else
                query->callback(status, NULL, query->context);
@@@ -1800,13 -1799,13 +1799,13 @@@ static int __init ib_sa_init(void
  
        ret = ib_register_client(&sa_client);
        if (ret) {
-               printk(KERN_ERR "Couldn't register ib_sa client\n");
+               pr_err("Couldn't register ib_sa client\n");
                goto err1;
        }
  
        ret = mcast_init();
        if (ret) {
-               printk(KERN_ERR "Couldn't initialize multicast handling\n");
+               pr_err("Couldn't initialize multicast handling\n");
                goto err2;
        }
  
index 5b1753233c5dd8c30c1dd110a952c6d9c4360e39,6ef0bfded2ba2f87fc4ad0ccdf54f8ca0556cbb5..81b2013ef968a7edc5e45d313f293f964b9feb92
@@@ -223,7 -223,6 +223,7 @@@ struct mlx5e_pport_stats 
  
  static const char rq_stats_strings[][ETH_GSTRING_LEN] = {
        "packets",
 +      "bytes",
        "csum_none",
        "csum_sw",
        "lro_packets",
  
  struct mlx5e_rq_stats {
        u64 packets;
 +      u64 bytes;
        u64 csum_none;
        u64 csum_sw;
        u64 lro_packets;
        u64 lro_bytes;
        u64 wqe_err;
 -#define NUM_RQ_STATS 6
 +#define NUM_RQ_STATS 7
  };
  
  static const char sq_stats_strings[][ETH_GSTRING_LEN] = {
        "packets",
 +      "bytes",
        "tso_packets",
        "tso_bytes",
        "csum_offload_none",
  
  struct mlx5e_sq_stats {
        u64 packets;
 +      u64 bytes;
        u64 tso_packets;
        u64 tso_bytes;
        u64 csum_offload_none;
        u64 wake;
        u64 dropped;
        u64 nop;
 -#define NUM_SQ_STATS 8
 +#define NUM_SQ_STATS 9
  };
  
  struct mlx5e_stats {
@@@ -308,9 -304,14 +308,9 @@@ enum 
        MLX5E_RQ_STATE_POST_WQES_ENABLE,
  };
  
 -enum cq_flags {
 -      MLX5E_CQ_HAS_CQES = 1,
 -};
 -
  struct mlx5e_cq {
        /* data path - accessed per cqe */
        struct mlx5_cqwq           wq;
 -      unsigned long              flags;
  
        /* data path - accessed per napi poll */
        struct napi_struct        *napi;
@@@ -451,8 -452,6 +451,8 @@@ enum mlx5e_traffic_types 
        MLX5E_NUM_TT,
  };
  
 +#define IS_HASHING_TT(tt) (tt != MLX5E_TT_ANY)
 +
  enum mlx5e_rqt_ix {
        MLX5E_INDIRECTION_RQT,
        MLX5E_SINGLE_RQ_RQT,
@@@ -516,7 -515,7 +516,7 @@@ struct mlx5e_priv 
        struct mlx5_uar            cq_uar;
        u32                        pdn;
        u32                        tdn;
-       struct mlx5_core_mr        mr;
+       struct mlx5_core_mkey      mkey;
        struct mlx5e_rq            drop_rq;
  
        struct mlx5e_channel     **channel;
@@@ -619,12 -618,9 +619,12 @@@ void mlx5e_enable_vlan_filter(struct ml
  void mlx5e_disable_vlan_filter(struct mlx5e_priv *priv);
  
  int mlx5e_redirect_rqt(struct mlx5e_priv *priv, enum mlx5e_rqt_ix rqt_ix);
 +void mlx5e_build_tir_ctx_hash(void *tirc, struct mlx5e_priv *priv);
  
  int mlx5e_open_locked(struct net_device *netdev);
  int mlx5e_close_locked(struct net_device *netdev);
 +void mlx5e_build_default_indir_rqt(u32 *indirection_rqt, int len,
 +                                 int num_channels);
  
  static inline void mlx5e_tx_notify_hw(struct mlx5e_sq *sq,
                                      struct mlx5e_tx_wqe *wqe, int bf_sz)
index 402994bf7e167d1ae23a8943789f712f82862f46,43a148939557b188d4fb9301d54be36342aa2688..0c49951606b6a664029b44becd8f454c1abc8885
@@@ -141,10 -141,6 +141,10 @@@ void mlx5e_update_stats(struct mlx5e_pr
                return;
  
        /* Collect firts the SW counters and then HW for consistency */
 +      s->rx_packets           = 0;
 +      s->rx_bytes             = 0;
 +      s->tx_packets           = 0;
 +      s->tx_bytes             = 0;
        s->tso_packets          = 0;
        s->tso_bytes            = 0;
        s->tx_queue_stopped     = 0;
        for (i = 0; i < priv->params.num_channels; i++) {
                rq_stats = &priv->channel[i]->rq.stats;
  
 +              s->rx_packets   += rq_stats->packets;
 +              s->rx_bytes     += rq_stats->bytes;
                s->lro_packets  += rq_stats->lro_packets;
                s->lro_bytes    += rq_stats->lro_bytes;
                s->rx_csum_none += rq_stats->csum_none;
                for (j = 0; j < priv->params.num_tc; j++) {
                        sq_stats = &priv->channel[i]->sq[j].stats;
  
 +                      s->tx_packets           += sq_stats->packets;
 +                      s->tx_bytes             += sq_stats->bytes;
                        s->tso_packets          += sq_stats->tso_packets;
                        s->tso_bytes            += sq_stats->tso_bytes;
                        s->tx_queue_stopped     += sq_stats->stopped;
        s->tx_broadcast_bytes   =
                MLX5_GET_CTR(out, transmitted_eth_broadcast.octets);
  
 -      s->rx_packets =
 -              s->rx_unicast_packets +
 -              s->rx_multicast_packets +
 -              s->rx_broadcast_packets;
 -      s->rx_bytes =
 -              s->rx_unicast_bytes +
 -              s->rx_multicast_bytes +
 -              s->rx_broadcast_bytes;
 -      s->tx_packets =
 -              s->tx_unicast_packets +
 -              s->tx_multicast_packets +
 -              s->tx_broadcast_packets;
 -      s->tx_bytes =
 -              s->tx_unicast_bytes +
 -              s->tx_multicast_bytes +
 -              s->tx_broadcast_bytes;
 -
        /* Update calculated offload counters */
        s->tx_csum_offload = s->tx_packets - tx_offload_none;
        s->rx_csum_good    = s->rx_packets - s->rx_csum_none -
@@@ -973,7 -982,7 +973,7 @@@ static int mlx5e_open_channel(struct ml
        c->cpu      = cpu;
        c->pdev     = &priv->mdev->pdev->dev;
        c->netdev   = priv->netdev;
-       c->mkey_be  = cpu_to_be32(priv->mr.key);
+       c->mkey_be  = cpu_to_be32(priv->mkey.key);
        c->num_tc   = priv->params.num_tc;
  
        mlx5e_build_channeltc_to_txq_map(priv, ix);
@@@ -1190,6 -1199,7 +1190,6 @@@ static void mlx5e_fill_indir_rqt_rqns(s
                        ix = mlx5e_bits_invert(i, MLX5E_LOG_INDIR_RQT_SIZE);
  
                ix = priv->params.indirection_rqt[ix];
 -              ix = ix % priv->params.num_channels;
                MLX5_SET(rqtc, rqtc, rq_num[i],
                         test_bit(MLX5E_STATE_OPENED, &priv->state) ?
                         priv->channel[ix]->rq.rqn :
@@@ -1307,22 -1317,7 +1307,22 @@@ static void mlx5e_build_tir_ctx_lro(voi
                              lro_timer_supported_periods[2]));
  }
  
 -static int mlx5e_modify_tir_lro(struct mlx5e_priv *priv, int tt)
 +void mlx5e_build_tir_ctx_hash(void *tirc, struct mlx5e_priv *priv)
 +{
 +      MLX5_SET(tirc, tirc, rx_hash_fn,
 +               mlx5e_rx_hash_fn(priv->params.rss_hfunc));
 +      if (priv->params.rss_hfunc == ETH_RSS_HASH_TOP) {
 +              void *rss_key = MLX5_ADDR_OF(tirc, tirc,
 +                                           rx_hash_toeplitz_key);
 +              size_t len = MLX5_FLD_SZ_BYTES(tirc,
 +                                             rx_hash_toeplitz_key);
 +
 +              MLX5_SET(tirc, tirc, rx_hash_symmetric, 1);
 +              memcpy(rss_key, priv->params.toeplitz_hash_key, len);
 +      }
 +}
 +
 +static int mlx5e_modify_tirs_lro(struct mlx5e_priv *priv)
  {
        struct mlx5_core_dev *mdev = priv->mdev;
  
        void *tirc;
        int inlen;
        int err;
 +      int tt;
  
        inlen = MLX5_ST_SZ_BYTES(modify_tir_in);
        in = mlx5_vzalloc(inlen);
  
        mlx5e_build_tir_ctx_lro(tirc, priv);
  
 -      err = mlx5_core_modify_tir(mdev, priv->tirn[tt], in, inlen);
 +      for (tt = 0; tt < MLX5E_NUM_TT; tt++) {
 +              err = mlx5_core_modify_tir(mdev, priv->tirn[tt], in, inlen);
 +              if (err)
 +                      break;
 +      }
  
        kvfree(in);
  
@@@ -1682,7 -1672,17 +1682,7 @@@ static void mlx5e_build_tir_ctx(struct 
        default:
                MLX5_SET(tirc, tirc, indirect_table,
                         priv->rqtn[MLX5E_INDIRECTION_RQT]);
 -              MLX5_SET(tirc, tirc, rx_hash_fn,
 -                       mlx5e_rx_hash_fn(priv->params.rss_hfunc));
 -              if (priv->params.rss_hfunc == ETH_RSS_HASH_TOP) {
 -                      void *rss_key = MLX5_ADDR_OF(tirc, tirc,
 -                                                   rx_hash_toeplitz_key);
 -                      size_t len = MLX5_FLD_SZ_BYTES(tirc,
 -                                                     rx_hash_toeplitz_key);
 -
 -                      MLX5_SET(tirc, tirc, rx_hash_symmetric, 1);
 -                      memcpy(rss_key, priv->params.toeplitz_hash_key, len);
 -              }
 +              mlx5e_build_tir_ctx_hash(tirc, priv);
                break;
        }
  
@@@ -1885,10 -1885,8 +1885,10 @@@ static int mlx5e_set_features(struct ne
                        mlx5e_close_locked(priv->netdev);
  
                priv->params.lro_en = !!(features & NETIF_F_LRO);
 -              mlx5e_modify_tir_lro(priv, MLX5E_TT_IPV4_TCP);
 -              mlx5e_modify_tir_lro(priv, MLX5E_TT_IPV6_TCP);
 +              err = mlx5e_modify_tirs_lro(priv);
 +              if (err)
 +                      mlx5_core_warn(priv->mdev, "lro modify failed, %d\n",
 +                                     err);
  
                if (was_opened)
                        err = mlx5e_open_locked(priv->netdev);
@@@ -2091,20 -2089,12 +2091,20 @@@ u16 mlx5e_get_max_inline_cap(struct mlx
               2 /*sizeof(mlx5e_tx_wqe.inline_hdr_start)*/;
  }
  
 +void mlx5e_build_default_indir_rqt(u32 *indirection_rqt, int len,
 +                                 int num_channels)
 +{
 +      int i;
 +
 +      for (i = 0; i < len; i++)
 +              indirection_rqt[i] = i % num_channels;
 +}
 +
  static void mlx5e_build_netdev_priv(struct mlx5_core_dev *mdev,
                                    struct net_device *netdev,
                                    int num_channels)
  {
        struct mlx5e_priv *priv = netdev_priv(netdev);
 -      int i;
  
        priv->params.log_sq_size           =
                MLX5E_PARAMS_DEFAULT_LOG_SQ_SIZE;
        netdev_rss_key_fill(priv->params.toeplitz_hash_key,
                            sizeof(priv->params.toeplitz_hash_key));
  
 -      for (i = 0; i < MLX5E_INDIR_RQT_SIZE; i++)
 -              priv->params.indirection_rqt[i] = i % num_channels;
 +      mlx5e_build_default_indir_rqt(priv->params.indirection_rqt,
 +                                    MLX5E_INDIR_RQT_SIZE, num_channels);
  
        priv->params.lro_wqe_sz            =
                MLX5E_PARAMS_DEFAULT_LRO_WQE_SZ;
@@@ -2204,7 -2194,7 +2204,7 @@@ static void mlx5e_build_netdev(struct n
  }
  
  static int mlx5e_create_mkey(struct mlx5e_priv *priv, u32 pdn,
-                            struct mlx5_core_mr *mr)
+                            struct mlx5_core_mkey *mkey)
  {
        struct mlx5_core_dev *mdev = priv->mdev;
        struct mlx5_create_mkey_mbox_in *in;
        in->seg.flags_pd = cpu_to_be32(pdn | MLX5_MKEY_LEN64);
        in->seg.qpn_mkey7_0 = cpu_to_be32(0xffffff << 8);
  
-       err = mlx5_core_create_mkey(mdev, mr, in, sizeof(*in), NULL, NULL,
+       err = mlx5_core_create_mkey(mdev, mkey, in, sizeof(*in), NULL, NULL,
                                    NULL);
  
        kvfree(in);
@@@ -2269,7 -2259,7 +2269,7 @@@ static void *mlx5e_create_netdev(struc
                goto err_dealloc_pd;
        }
  
-       err = mlx5e_create_mkey(priv, priv->pdn, &priv->mr);
+       err = mlx5e_create_mkey(priv, priv->pdn, &priv->mkey);
        if (err) {
                mlx5_core_err(mdev, "create mkey failed, %d\n", err);
                goto err_dealloc_transport_domain;
@@@ -2343,7 -2333,7 +2343,7 @@@ err_destroy_tises
        mlx5e_destroy_tises(priv);
  
  err_destroy_mkey:
-       mlx5_core_destroy_mkey(mdev, &priv->mr);
+       mlx5_core_destroy_mkey(mdev, &priv->mkey);
  
  err_dealloc_transport_domain:
        mlx5_core_dealloc_transport_domain(mdev, priv->tdn);
@@@ -2377,7 -2367,7 +2377,7 @@@ static void mlx5e_destroy_netdev(struc
        mlx5e_destroy_rqt(priv, MLX5E_INDIRECTION_RQT);
        mlx5e_close_drop_rq(priv);
        mlx5e_destroy_tises(priv);
-       mlx5_core_destroy_mkey(priv->mdev, &priv->mr);
+       mlx5_core_destroy_mkey(priv->mdev, &priv->mkey);
        mlx5_core_dealloc_transport_domain(priv->mdev, priv->tdn);
        mlx5_core_dealloc_pd(priv->mdev, priv->pdn);
        mlx5_unmap_free_uar(priv->mdev, &priv->cq_uar);
index 58eef02edc7e81ab2dcd14aace9c722b76a89623,a3cacab22849139596cd48dfc59d8644c8c2de3c..9b8a02b7880fd7c26e4ac058439c8c317bc04a4b
@@@ -458,7 -458,8 +458,8 @@@ struct mlx5_ifc_ads_bits 
  };
  
  struct mlx5_ifc_flow_table_nic_cap_bits {
-       u8         reserved_at_0[0x200];
+       u8         nic_rx_multi_path_tirs[0x1];
+       u8         reserved_at_1[0x1ff];
  
        struct mlx5_ifc_flow_table_prop_layout_bits flow_table_properties_nic_receive;
  
@@@ -736,7 -737,9 +737,9 @@@ struct mlx5_ifc_cmd_hca_cap_bits 
        u8         cqe_version[0x4];
  
        u8         compact_address_vector[0x1];
-       u8         reserved_at_200[0xe];
+       u8         reserved_at_200[0x3];
+       u8         ipoib_basic_offloads[0x1];
+       u8         reserved_at_204[0xa];
        u8         drain_sigerr[0x1];
        u8         cmdif_checksum[0x2];
        u8         sigerr_cqe[0x1];
        u8         cd[0x1];
        u8         reserved_at_22c[0x1];
        u8         apm[0x1];
-       u8         reserved_at_22e[0x7];
+       u8         reserved_at_22e[0x2];
+       u8         imaicl[0x1];
+       u8         reserved_at_231[0x4];
        u8         qkv[0x1];
        u8         pkv[0x1];
-       u8         reserved_at_237[0x4];
+       u8         set_deth_sqpn[0x1];
+       u8         reserved_at_239[0x3];
        u8         xrc[0x1];
        u8         ud[0x1];
        u8         uc[0x1];
@@@ -1208,6 -1214,36 +1214,36 @@@ struct mlx5_ifc_phys_layer_cntrs_bits 
        u8         reserved_at_640[0x180];
  };
  
+ struct mlx5_ifc_ib_port_cntrs_grp_data_layout_bits {
+       u8         symbol_error_counter[0x10];
+       u8         link_error_recovery_counter[0x8];
+       u8         link_downed_counter[0x8];
+       u8         port_rcv_errors[0x10];
+       u8         port_rcv_remote_physical_errors[0x10];
+       u8         port_rcv_switch_relay_errors[0x10];
+       u8         port_xmit_discards[0x10];
+       u8         port_xmit_constraint_errors[0x8];
+       u8         port_rcv_constraint_errors[0x8];
+       u8         reserved_at_70[0x8];
+       u8         link_overrun_errors[0x8];
+       u8         reserved_at_80[0x10];
+       u8         vl_15_dropped[0x10];
+       u8         reserved_at_a0[0xa0];
+ };
  struct mlx5_ifc_eth_per_traffic_grp_data_layout_bits {
        u8         transmit_queue_high[0x20];
  
@@@ -1780,7 -1816,7 +1816,7 @@@ struct mlx5_ifc_qpc_bits 
        u8         log_sq_size[0x4];
        u8         reserved_at_55[0x6];
        u8         rlky[0x1];
-       u8         reserved_at_5c[0x4];
+       u8         ulp_stateless_offload_mode[0x4];
  
        u8         counter_set_id[0x8];
        u8         uar_page[0x18];
@@@ -2618,6 -2654,7 +2654,7 @@@ union mlx5_ifc_eth_cntrs_grp_data_layou
        struct mlx5_ifc_eth_extended_cntrs_grp_data_layout_bits eth_extended_cntrs_grp_data_layout;
        struct mlx5_ifc_eth_per_prio_grp_data_layout_bits eth_per_prio_grp_data_layout;
        struct mlx5_ifc_eth_per_traffic_grp_data_layout_bits eth_per_traffic_grp_data_layout;
+       struct mlx5_ifc_ib_port_cntrs_grp_data_layout_bits ib_port_cntrs_grp_data_layout;
        struct mlx5_ifc_phys_layer_cntrs_bits phys_layer_cntrs;
        u8         reserved_at_0[0x7c0];
  };
@@@ -3126,7 -3163,8 +3163,8 @@@ struct mlx5_ifc_query_vport_counter_in_
        u8         op_mod[0x10];
  
        u8         other_vport[0x1];
-       u8         reserved_at_41[0xf];
+       u8         reserved_at_41[0xb];
+       u8         port_num[0x4];
        u8         vport_number[0x10];
  
        u8         reserved_at_60[0x60];
@@@ -4245,9 -4283,7 +4283,9 @@@ struct mlx5_ifc_modify_tir_bitmask_bit
  
        u8         reserved_at_20[0x1b];
        u8         self_lb_en[0x1];
 -      u8         reserved_at_3c[0x3];
 +      u8         reserved_at_3c[0x1];
 +      u8         hash[0x1];
 +      u8         reserved_at_3e[0x1];
        u8         lro[0x1];
  };
  
@@@ -6956,6 -6992,7 +6994,7 @@@ union mlx5_ifc_ports_control_registers_
        struct mlx5_ifc_peir_reg_bits peir_reg;
        struct mlx5_ifc_pelc_reg_bits pelc_reg;
        struct mlx5_ifc_pfcc_reg_bits pfcc_reg;
+       struct mlx5_ifc_ib_port_cntrs_grp_data_layout_bits ib_port_cntrs_grp_data_layout;
        struct mlx5_ifc_phys_layer_cntrs_bits phys_layer_cntrs;
        struct mlx5_ifc_pifr_reg_bits pifr_reg;
        struct mlx5_ifc_pipg_reg_bits pipg_reg;