Merge tag 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/rdma/rdma
authorLinus Torvalds <torvalds@linux-foundation.org>
Sat, 1 May 2021 16:15:05 +0000 (09:15 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Sat, 1 May 2021 16:15:05 +0000 (09:15 -0700)
Pull rdma updates from Jason Gunthorpe:
 "This is significantly bug fixes and general cleanups. The noteworthy
  new features are fairly small:

   - XRC support for HNS and improves RQ operations

   - Bug fixes and updates for hns, mlx5, bnxt_re, hfi1, i40iw, rxe, siw
     and qib

   - Quite a few general cleanups on spelling, error handling, static
     checker detections, etc

   - Increase the number of device ports supported beyond 255. High port
     count software switches now exist

   - Several bug fixes for rtrs

   - mlx5 Device Memory support for host controlled atomics

   - Report SRQ tables through to rdma-tool"

* tag 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/rdma/rdma: (145 commits)
  IB/qib: Remove redundant assignment to ret
  RDMA/nldev: Add copy-on-fork attribute to get sys command
  RDMA/bnxt_re: Fix a double free in bnxt_qplib_alloc_res
  RDMA/siw: Fix a use after free in siw_alloc_mr
  IB/hfi1: Remove redundant variable rcd
  RDMA/nldev: Add QP numbers to SRQ information
  RDMA/nldev: Return SRQ information
  RDMA/restrack: Add support to get resource tracking for SRQ
  RDMA/nldev: Return context information
  RDMA/core: Add CM to restrack after successful attachment to a device
  RDMA/cma: Skip device which doesn't support CM
  RDMA/rxe: Fix a bug in rxe_fill_ip_info()
  RDMA/mlx5: Expose private query port
  RDMA/mlx4: Remove an unused variable
  RDMA/mlx5: Fix type assignment for ICM DM
  IB/mlx5: Set right RoCE l3 type and roce version while deleting GID
  RDMA/i40iw: Fix error unwinding when i40iw_hmc_sd_one fails
  RDMA/cxgb4: add missing qpid increment
  IB/ipoib: Remove unnecessary struct declaration
  RDMA/bnxt_re: Get rid of custom module reference counting
  ...

226 files changed:
Documentation/ABI/testing/sysfs-class-rtrs-client
Documentation/devicetree/bindings/infiniband/hisilicon-hns-roce.txt
MAINTAINERS
drivers/infiniband/core/cache.c
drivers/infiniband/core/cm.c
drivers/infiniband/core/cm_msgs.h
drivers/infiniband/core/cma.c
drivers/infiniband/core/cma_configfs.c
drivers/infiniband/core/cma_priv.h
drivers/infiniband/core/core_priv.h
drivers/infiniband/core/counters.c
drivers/infiniband/core/device.c
drivers/infiniband/core/iwpm_msg.c
drivers/infiniband/core/mad.c
drivers/infiniband/core/mad_rmpp.c
drivers/infiniband/core/multicast.c
drivers/infiniband/core/nldev.c
drivers/infiniband/core/opa_smi.h
drivers/infiniband/core/rdma_core.c
drivers/infiniband/core/restrack.c
drivers/infiniband/core/roce_gid_mgmt.c
drivers/infiniband/core/rw.c
drivers/infiniband/core/sa.h
drivers/infiniband/core/sa_query.c
drivers/infiniband/core/security.c
drivers/infiniband/core/smi.c
drivers/infiniband/core/smi.h
drivers/infiniband/core/sysfs.c
drivers/infiniband/core/ucma.c
drivers/infiniband/core/umem.c
drivers/infiniband/core/umem_dmabuf.c
drivers/infiniband/core/user_mad.c
drivers/infiniband/core/uverbs_cmd.c
drivers/infiniband/core/uverbs_ioctl.c
drivers/infiniband/core/verbs.c
drivers/infiniband/hw/bnxt_re/Kconfig
drivers/infiniband/hw/bnxt_re/bnxt_re.h
drivers/infiniband/hw/bnxt_re/hw_counters.c
drivers/infiniband/hw/bnxt_re/hw_counters.h
drivers/infiniband/hw/bnxt_re/ib_verbs.c
drivers/infiniband/hw/bnxt_re/ib_verbs.h
drivers/infiniband/hw/bnxt_re/main.c
drivers/infiniband/hw/bnxt_re/qplib_fp.c
drivers/infiniband/hw/bnxt_re/qplib_rcfw.c
drivers/infiniband/hw/bnxt_re/qplib_rcfw.h
drivers/infiniband/hw/bnxt_re/qplib_res.c
drivers/infiniband/hw/cxgb4/cm.c
drivers/infiniband/hw/cxgb4/iw_cxgb4.h
drivers/infiniband/hw/cxgb4/provider.c
drivers/infiniband/hw/cxgb4/resource.c
drivers/infiniband/hw/cxgb4/t4.h
drivers/infiniband/hw/efa/efa.h
drivers/infiniband/hw/efa/efa_main.c
drivers/infiniband/hw/efa/efa_verbs.c
drivers/infiniband/hw/hfi1/affinity.c
drivers/infiniband/hw/hfi1/chip.c
drivers/infiniband/hw/hfi1/chip.h
drivers/infiniband/hw/hfi1/driver.c
drivers/infiniband/hw/hfi1/exp_rcv.c
drivers/infiniband/hw/hfi1/firmware.c
drivers/infiniband/hw/hfi1/hfi.h
drivers/infiniband/hw/hfi1/init.c
drivers/infiniband/hw/hfi1/iowait.h
drivers/infiniband/hw/hfi1/ipoib.h
drivers/infiniband/hw/hfi1/ipoib_main.c
drivers/infiniband/hw/hfi1/ipoib_tx.c
drivers/infiniband/hw/hfi1/mad.c
drivers/infiniband/hw/hfi1/mad.h
drivers/infiniband/hw/hfi1/mmu_rb.c
drivers/infiniband/hw/hfi1/msix.c
drivers/infiniband/hw/hfi1/netdev.h
drivers/infiniband/hw/hfi1/netdev_rx.c
drivers/infiniband/hw/hfi1/sdma.c
drivers/infiniband/hw/hfi1/sdma.h
drivers/infiniband/hw/hfi1/sysfs.c
drivers/infiniband/hw/hfi1/trace_tx.h
drivers/infiniband/hw/hfi1/user_sdma.c
drivers/infiniband/hw/hfi1/user_sdma.h
drivers/infiniband/hw/hfi1/verbs.c
drivers/infiniband/hw/hfi1/verbs.h
drivers/infiniband/hw/hfi1/verbs_txreq.h
drivers/infiniband/hw/hfi1/vnic.h
drivers/infiniband/hw/hfi1/vnic_main.c
drivers/infiniband/hw/hns/hns_roce_alloc.c
drivers/infiniband/hw/hns/hns_roce_cmd.c
drivers/infiniband/hw/hns/hns_roce_common.h
drivers/infiniband/hw/hns/hns_roce_cq.c
drivers/infiniband/hw/hns/hns_roce_device.h
drivers/infiniband/hw/hns/hns_roce_hw_v1.c
drivers/infiniband/hw/hns/hns_roce_hw_v2.c
drivers/infiniband/hw/hns/hns_roce_hw_v2.h
drivers/infiniband/hw/hns/hns_roce_main.c
drivers/infiniband/hw/hns/hns_roce_pd.c
drivers/infiniband/hw/hns/hns_roce_qp.c
drivers/infiniband/hw/hns/hns_roce_srq.c
drivers/infiniband/hw/i40iw/i40iw.h
drivers/infiniband/hw/i40iw/i40iw_cm.c
drivers/infiniband/hw/i40iw/i40iw_hmc.c
drivers/infiniband/hw/i40iw/i40iw_main.c
drivers/infiniband/hw/i40iw/i40iw_osdep.h
drivers/infiniband/hw/i40iw/i40iw_pble.c
drivers/infiniband/hw/i40iw/i40iw_puda.c
drivers/infiniband/hw/i40iw/i40iw_utils.c
drivers/infiniband/hw/i40iw/i40iw_verbs.c
drivers/infiniband/hw/i40iw/i40iw_virtchnl.c
drivers/infiniband/hw/mlx4/alias_GUID.c
drivers/infiniband/hw/mlx4/mad.c
drivers/infiniband/hw/mlx4/main.c
drivers/infiniband/hw/mlx4/mlx4_ib.h
drivers/infiniband/hw/mlx4/qp.c
drivers/infiniband/hw/mlx5/Makefile
drivers/infiniband/hw/mlx5/cmd.c
drivers/infiniband/hw/mlx5/cmd.h
drivers/infiniband/hw/mlx5/cong.c
drivers/infiniband/hw/mlx5/counters.c
drivers/infiniband/hw/mlx5/counters.h
drivers/infiniband/hw/mlx5/devx.c
drivers/infiniband/hw/mlx5/dm.c [new file with mode: 0644]
drivers/infiniband/hw/mlx5/dm.h [new file with mode: 0644]
drivers/infiniband/hw/mlx5/fs.c
drivers/infiniband/hw/mlx5/ib_rep.c
drivers/infiniband/hw/mlx5/ib_rep.h
drivers/infiniband/hw/mlx5/ib_virt.c
drivers/infiniband/hw/mlx5/mad.c
drivers/infiniband/hw/mlx5/main.c
drivers/infiniband/hw/mlx5/mlx5_ib.h
drivers/infiniband/hw/mlx5/mr.c
drivers/infiniband/hw/mlx5/odp.c
drivers/infiniband/hw/mlx5/qp.c
drivers/infiniband/hw/mlx5/std_types.c
drivers/infiniband/hw/mthca/mthca_av.c
drivers/infiniband/hw/mthca/mthca_dev.h
drivers/infiniband/hw/mthca/mthca_mad.c
drivers/infiniband/hw/mthca/mthca_provider.c
drivers/infiniband/hw/mthca/mthca_qp.c
drivers/infiniband/hw/ocrdma/ocrdma_ah.c
drivers/infiniband/hw/ocrdma/ocrdma_ah.h
drivers/infiniband/hw/ocrdma/ocrdma_main.c
drivers/infiniband/hw/ocrdma/ocrdma_verbs.c
drivers/infiniband/hw/ocrdma/ocrdma_verbs.h
drivers/infiniband/hw/qedr/main.c
drivers/infiniband/hw/qedr/qedr_iw_cm.c
drivers/infiniband/hw/qedr/verbs.c
drivers/infiniband/hw/qedr/verbs.h
drivers/infiniband/hw/qib/qib.h
drivers/infiniband/hw/qib/qib_common.h
drivers/infiniband/hw/qib/qib_file_ops.c
drivers/infiniband/hw/qib/qib_iba6120.c
drivers/infiniband/hw/qib/qib_iba7220.c
drivers/infiniband/hw/qib/qib_iba7322.c
drivers/infiniband/hw/qib/qib_init.c
drivers/infiniband/hw/qib/qib_mad.c
drivers/infiniband/hw/qib/qib_qp.c
drivers/infiniband/hw/qib/qib_sd7220.c
drivers/infiniband/hw/qib/qib_sysfs.c
drivers/infiniband/hw/qib/qib_verbs.c
drivers/infiniband/hw/qib/qib_verbs.h
drivers/infiniband/hw/usnic/usnic_ib_main.c
drivers/infiniband/hw/usnic/usnic_ib_verbs.c
drivers/infiniband/hw/usnic/usnic_ib_verbs.h
drivers/infiniband/hw/vmw_pvrdma/pvrdma.h
drivers/infiniband/hw/vmw_pvrdma/pvrdma_main.c
drivers/infiniband/hw/vmw_pvrdma/pvrdma_qp.c
drivers/infiniband/hw/vmw_pvrdma/pvrdma_verbs.c
drivers/infiniband/hw/vmw_pvrdma/pvrdma_verbs.h
drivers/infiniband/sw/rdmavt/mad.c
drivers/infiniband/sw/rdmavt/mad.h
drivers/infiniband/sw/rdmavt/vt.c
drivers/infiniband/sw/rdmavt/vt.h
drivers/infiniband/sw/rxe/rxe_av.c
drivers/infiniband/sw/rxe/rxe_comp.c
drivers/infiniband/sw/rxe/rxe_hw_counters.c
drivers/infiniband/sw/rxe/rxe_hw_counters.h
drivers/infiniband/sw/rxe/rxe_loc.h
drivers/infiniband/sw/rxe/rxe_mr.c
drivers/infiniband/sw/rxe/rxe_pool.c
drivers/infiniband/sw/rxe/rxe_req.c
drivers/infiniband/sw/rxe/rxe_resp.c
drivers/infiniband/sw/rxe/rxe_verbs.c
drivers/infiniband/sw/rxe/rxe_verbs.h
drivers/infiniband/sw/siw/iwarp.h
drivers/infiniband/sw/siw/siw_cm.c
drivers/infiniband/sw/siw/siw_mem.c
drivers/infiniband/sw/siw/siw_mem.h
drivers/infiniband/sw/siw/siw_verbs.c
drivers/infiniband/sw/siw/siw_verbs.h
drivers/infiniband/ulp/ipoib/ipoib.h
drivers/infiniband/ulp/ipoib/ipoib_cm.c
drivers/infiniband/ulp/ipoib/ipoib_ib.c
drivers/infiniband/ulp/ipoib/ipoib_main.c
drivers/infiniband/ulp/iser/iscsi_iser.h
drivers/infiniband/ulp/isert/ib_isert.c
drivers/infiniband/ulp/rtrs/rtrs-clt-sysfs.c
drivers/infiniband/ulp/rtrs/rtrs-clt.c
drivers/infiniband/ulp/rtrs/rtrs-clt.h
drivers/infiniband/ulp/rtrs/rtrs-pri.h
drivers/infiniband/ulp/rtrs/rtrs-srv-sysfs.c
drivers/infiniband/ulp/rtrs/rtrs-srv.c
drivers/infiniband/ulp/rtrs/rtrs.c
drivers/infiniband/ulp/rtrs/rtrs.h
drivers/infiniband/ulp/srpt/ib_srpt.c
drivers/net/ethernet/broadcom/bnxt/bnxt.c
drivers/net/ethernet/broadcom/bnxt/bnxt.h
drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.c
drivers/net/ethernet/mellanox/mlx5/core/ipoib/ipoib.c
drivers/net/ethernet/mellanox/mlx5/core/lib/gid.c
include/linux/mlx5/driver.h
include/linux/mlx5/mlx5_ifc.h
include/rdma/ib_cache.h
include/rdma/ib_mad.h
include/rdma/ib_sa.h
include/rdma/ib_verbs.h
include/rdma/iw_cm.h
include/rdma/rdma_cm.h
include/rdma/rdma_counter.h
include/rdma/rdma_vt.h
include/rdma/restrack.h
include/rdma/rw.h
include/rdma/uverbs_ioctl.h
include/rdma/uverbs_named_ioctl.h
include/uapi/rdma/hns-abi.h
include/uapi/rdma/mlx5_user_ioctl_cmds.h
include/uapi/rdma/mlx5_user_ioctl_verbs.h
include/uapi/rdma/rdma_netlink.h
net/rds/ib_cm.c
net/rds/rdma_transport.c

index 0f7165aab25126de4fd4839943418cdae96b0d95..49a4157c7bf10c2d6cc367eb17e8abb34c06c48d 100644 (file)
@@ -34,6 +34,9 @@ Description:  Multipath policy specifies which path should be selected on each IO
                min-inflight (1):
                    select path with minimum inflights.
 
+               min-latency (2):
+                   select path with minimum latency.
+
 What:          /sys/class/rtrs-client/<session-name>/paths/
 Date:          Feb 2020
 KernelVersion: 5.7
@@ -95,6 +98,15 @@ KernelVersion:       5.7
 Contact:       Jack Wang <jinpu.wang@cloud.ionos.com> Danil Kipnis <danil.kipnis@cloud.ionos.com>
 Description:   RO, Contains the destination address of the path
 
+What:          /sys/class/rtrs-client/<session-name>/paths/<src@dst>/cur_latency
+Date:          Feb 2020
+KernelVersion: 5.7
+Contact:       Jack Wang <jinpu.wang@cloud.ionos.com> Danil Kipnis <danil.kipnis@cloud.ionos.com>
+Description:   RO, Contains the latency time calculated by the heart-beat messages.
+               Whenever the client sends heart-beat message, it checks the time gap
+               between sending the heart-beat message and receiving the ACK.
+               This value can be changed regularly.
+
 What:          /sys/class/rtrs-client/<session-name>/paths/<src@dst>/stats/reset_all
 Date:          Feb 2020
 KernelVersion: 5.7
index 84f1a1b505d25cede54d8689f4b51f4af497ca94..be31cf05cd2e5ee0a50549c366e566cefcd06631 100644 (file)
@@ -1,7 +1,7 @@
 Hisilicon RoCE DT description
 
 Hisilicon RoCE engine is a part of network subsystem.
-It works depending on other part of network wubsytem, such as, gmac and
+It works depending on other part of network subsystem, such as gmac and
 dsa fabric.
 
 Additional properties are described here:
index 5ce47bc4954efd73df1d93bc5c982a36bd5816c9..0204c82b765c79394b83c677942d6a8996cf11a0 100644 (file)
@@ -8226,7 +8226,6 @@ F:        drivers/crypto/hisilicon/zip/
 
 HISILICON ROCE DRIVER
 M:     Lijun Ou <oulijun@huawei.com>
-M:     Wei Hu(Xavier) <huwei87@hisilicon.com>
 M:     Weihang Li <liweihang@huawei.com>
 L:     linux-rdma@vger.kernel.org
 S:     Maintained
@@ -15826,8 +15825,8 @@ T:      git git://git.kernel.org/pub/scm/linux/kernel/git/jes/linux.git rtl8xxxu-deve
 F:     drivers/net/wireless/realtek/rtl8xxxu/
 
 RTRS TRANSPORT DRIVERS
-M:     Danil Kipnis <danil.kipnis@cloud.ionos.com>
-M:     Jack Wang <jinpu.wang@cloud.ionos.com>
+M:     Md. Haris Iqbal <haris.iqbal@ionos.com>
+M:     Jack Wang <jinpu.wang@ionos.com>
 L:     linux-rdma@vger.kernel.org
 S:     Maintained
 F:     drivers/infiniband/ulp/rtrs/
index 5c9fac7cf4203dc0576f12b4e11337d719a9169d..3b0991fedd81dcbe00cf186744785aa6d869fb5c 100644 (file)
@@ -121,7 +121,7 @@ struct ib_gid_table {
        u32                             default_gid_indices;
 };
 
-static void dispatch_gid_change_event(struct ib_device *ib_dev, u8 port)
+static void dispatch_gid_change_event(struct ib_device *ib_dev, u32 port)
 {
        struct ib_event event;
 
@@ -197,7 +197,7 @@ int ib_cache_gid_parse_type_str(const char *buf)
 }
 EXPORT_SYMBOL(ib_cache_gid_parse_type_str);
 
-static struct ib_gid_table *rdma_gid_table(struct ib_device *device, u8 port)
+static struct ib_gid_table *rdma_gid_table(struct ib_device *device, u32 port)
 {
        return device->port_data[port].cache.gid;
 }
@@ -237,10 +237,10 @@ static void put_gid_ndev(struct rcu_head *head)
 static void free_gid_entry_locked(struct ib_gid_table_entry *entry)
 {
        struct ib_device *device = entry->attr.device;
-       u8 port_num = entry->attr.port_num;
+       u32 port_num = entry->attr.port_num;
        struct ib_gid_table *table = rdma_gid_table(device, port_num);
 
-       dev_dbg(&device->dev, "%s port=%d index=%d gid %pI6\n", __func__,
+       dev_dbg(&device->dev, "%s port=%u index=%d gid %pI6\n", __func__,
                port_num, entry->attr.index, entry->attr.gid.raw);
 
        write_lock_irq(&table->rwlock);
@@ -282,7 +282,7 @@ static void free_gid_work(struct work_struct *work)
        struct ib_gid_table_entry *entry =
                container_of(work, struct ib_gid_table_entry, del_work);
        struct ib_device *device = entry->attr.device;
-       u8 port_num = entry->attr.port_num;
+       u32 port_num = entry->attr.port_num;
        struct ib_gid_table *table = rdma_gid_table(device, port_num);
 
        mutex_lock(&table->lock);
@@ -379,7 +379,7 @@ static int add_roce_gid(struct ib_gid_table_entry *entry)
  * @ix:                GID entry index to delete
  *
  */
-static void del_gid(struct ib_device *ib_dev, u8 port,
+static void del_gid(struct ib_device *ib_dev, u32 port,
                    struct ib_gid_table *table, int ix)
 {
        struct roce_gid_ndev_storage *ndev_storage;
@@ -387,7 +387,7 @@ static void del_gid(struct ib_device *ib_dev, u8 port,
 
        lockdep_assert_held(&table->lock);
 
-       dev_dbg(&ib_dev->dev, "%s port=%d index=%d gid %pI6\n", __func__, port,
+       dev_dbg(&ib_dev->dev, "%s port=%u index=%d gid %pI6\n", __func__, port,
                ix, table->data_vec[ix]->attr.gid.raw);
 
        write_lock_irq(&table->rwlock);
@@ -543,7 +543,7 @@ static void make_default_gid(struct  net_device *dev, union ib_gid *gid)
        addrconf_ifid_eui48(&gid->raw[8], dev);
 }
 
-static int __ib_cache_gid_add(struct ib_device *ib_dev, u8 port,
+static int __ib_cache_gid_add(struct ib_device *ib_dev, u32 port,
                              union ib_gid *gid, struct ib_gid_attr *attr,
                              unsigned long mask, bool default_gid)
 {
@@ -587,7 +587,7 @@ out_unlock:
        return ret;
 }
 
-int ib_cache_gid_add(struct ib_device *ib_dev, u8 port,
+int ib_cache_gid_add(struct ib_device *ib_dev, u32 port,
                     union ib_gid *gid, struct ib_gid_attr *attr)
 {
        unsigned long mask = GID_ATTR_FIND_MASK_GID |
@@ -598,7 +598,7 @@ int ib_cache_gid_add(struct ib_device *ib_dev, u8 port,
 }
 
 static int
-_ib_cache_gid_del(struct ib_device *ib_dev, u8 port,
+_ib_cache_gid_del(struct ib_device *ib_dev, u32 port,
                  union ib_gid *gid, struct ib_gid_attr *attr,
                  unsigned long mask, bool default_gid)
 {
@@ -627,7 +627,7 @@ out_unlock:
        return ret;
 }
 
-int ib_cache_gid_del(struct ib_device *ib_dev, u8 port,
+int ib_cache_gid_del(struct ib_device *ib_dev, u32 port,
                     union ib_gid *gid, struct ib_gid_attr *attr)
 {
        unsigned long mask = GID_ATTR_FIND_MASK_GID       |
@@ -638,7 +638,7 @@ int ib_cache_gid_del(struct ib_device *ib_dev, u8 port,
        return _ib_cache_gid_del(ib_dev, port, gid, attr, mask, false);
 }
 
-int ib_cache_gid_del_all_netdev_gids(struct ib_device *ib_dev, u8 port,
+int ib_cache_gid_del_all_netdev_gids(struct ib_device *ib_dev, u32 port,
                                     struct net_device *ndev)
 {
        struct ib_gid_table *table;
@@ -683,7 +683,7 @@ const struct ib_gid_attr *
 rdma_find_gid_by_port(struct ib_device *ib_dev,
                      const union ib_gid *gid,
                      enum ib_gid_type gid_type,
-                     u8 port, struct net_device *ndev)
+                     u32 port, struct net_device *ndev)
 {
        int local_index;
        struct ib_gid_table *table;
@@ -734,7 +734,7 @@ EXPORT_SYMBOL(rdma_find_gid_by_port);
  *
  */
 const struct ib_gid_attr *rdma_find_gid_by_filter(
-       struct ib_device *ib_dev, const union ib_gid *gid, u8 port,
+       struct ib_device *ib_dev, const union ib_gid *gid, u32 port,
        bool (*filter)(const union ib_gid *gid, const struct ib_gid_attr *,
                       void *),
        void *context)
@@ -818,7 +818,7 @@ static void release_gid_table(struct ib_device *device,
        kfree(table);
 }
 
-static void cleanup_gid_table_port(struct ib_device *ib_dev, u8 port,
+static void cleanup_gid_table_port(struct ib_device *ib_dev, u32 port,
                                   struct ib_gid_table *table)
 {
        int i;
@@ -834,7 +834,7 @@ static void cleanup_gid_table_port(struct ib_device *ib_dev, u8 port,
        mutex_unlock(&table->lock);
 }
 
-void ib_cache_gid_set_default_gid(struct ib_device *ib_dev, u8 port,
+void ib_cache_gid_set_default_gid(struct ib_device *ib_dev, u32 port,
                                  struct net_device *ndev,
                                  unsigned long gid_type_mask,
                                  enum ib_cache_gid_default_mode mode)
@@ -867,7 +867,7 @@ void ib_cache_gid_set_default_gid(struct ib_device *ib_dev, u8 port,
        }
 }
 
-static void gid_table_reserve_default(struct ib_device *ib_dev, u8 port,
+static void gid_table_reserve_default(struct ib_device *ib_dev, u32 port,
                                      struct ib_gid_table *table)
 {
        unsigned int i;
@@ -884,7 +884,7 @@ static void gid_table_reserve_default(struct ib_device *ib_dev, u8 port,
 
 static void gid_table_release_one(struct ib_device *ib_dev)
 {
-       unsigned int p;
+       u32 p;
 
        rdma_for_each_port (ib_dev, p) {
                release_gid_table(ib_dev, ib_dev->port_data[p].cache.gid);
@@ -895,7 +895,7 @@ static void gid_table_release_one(struct ib_device *ib_dev)
 static int _gid_table_setup_one(struct ib_device *ib_dev)
 {
        struct ib_gid_table *table;
-       unsigned int rdma_port;
+       u32 rdma_port;
 
        rdma_for_each_port (ib_dev, rdma_port) {
                table = alloc_gid_table(
@@ -915,7 +915,7 @@ rollback_table_setup:
 
 static void gid_table_cleanup_one(struct ib_device *ib_dev)
 {
-       unsigned int p;
+       u32 p;
 
        rdma_for_each_port (ib_dev, p)
                cleanup_gid_table_port(ib_dev, p,
@@ -950,7 +950,7 @@ static int gid_table_setup_one(struct ib_device *ib_dev)
  * Returns 0 on success or appropriate error code.
  *
  */
-int rdma_query_gid(struct ib_device *device, u8 port_num,
+int rdma_query_gid(struct ib_device *device, u32 port_num,
                   int index, union ib_gid *gid)
 {
        struct ib_gid_table *table;
@@ -1014,7 +1014,7 @@ const struct ib_gid_attr *rdma_find_gid(struct ib_device *device,
        unsigned long mask = GID_ATTR_FIND_MASK_GID |
                             GID_ATTR_FIND_MASK_GID_TYPE;
        struct ib_gid_attr gid_attr_val = {.ndev = ndev, .gid_type = gid_type};
-       unsigned int p;
+       u32 p;
 
        if (ndev)
                mask |= GID_ATTR_FIND_MASK_NETDEV;
@@ -1043,7 +1043,7 @@ const struct ib_gid_attr *rdma_find_gid(struct ib_device *device,
 EXPORT_SYMBOL(rdma_find_gid);
 
 int ib_get_cached_pkey(struct ib_device *device,
-                      u               port_num,
+                      u32               port_num,
                       int               index,
                       u16              *pkey)
 {
@@ -1069,9 +1069,8 @@ int ib_get_cached_pkey(struct ib_device *device,
 }
 EXPORT_SYMBOL(ib_get_cached_pkey);
 
-int ib_get_cached_subnet_prefix(struct ib_device *device,
-                               u8                port_num,
-                               u64              *sn_pfx)
+int ib_get_cached_subnet_prefix(struct ib_device *device, u32 port_num,
+                               u64 *sn_pfx)
 {
        unsigned long flags;
 
@@ -1086,10 +1085,8 @@ int ib_get_cached_subnet_prefix(struct ib_device *device,
 }
 EXPORT_SYMBOL(ib_get_cached_subnet_prefix);
 
-int ib_find_cached_pkey(struct ib_device *device,
-                       u8                port_num,
-                       u16               pkey,
-                       u16              *index)
+int ib_find_cached_pkey(struct ib_device *device, u32 port_num,
+                       u16 pkey, u16 *index)
 {
        struct ib_pkey_cache *cache;
        unsigned long flags;
@@ -1116,8 +1113,9 @@ int ib_find_cached_pkey(struct ib_device *device,
                                *index = i;
                                ret = 0;
                                break;
-                       } else
+                       } else {
                                partial_ix = i;
+                       }
                }
 
        if (ret && partial_ix >= 0) {
@@ -1132,10 +1130,8 @@ err:
 }
 EXPORT_SYMBOL(ib_find_cached_pkey);
 
-int ib_find_exact_cached_pkey(struct ib_device *device,
-                             u8                port_num,
-                             u16               pkey,
-                             u16              *index)
+int ib_find_exact_cached_pkey(struct ib_device *device, u32 port_num,
+                             u16 pkey, u16 *index)
 {
        struct ib_pkey_cache *cache;
        unsigned long flags;
@@ -1169,9 +1165,7 @@ err:
 }
 EXPORT_SYMBOL(ib_find_exact_cached_pkey);
 
-int ib_get_cached_lmc(struct ib_device *device,
-                     u8                port_num,
-                     u8                *lmc)
+int ib_get_cached_lmc(struct ib_device *device, u32 port_num, u8 *lmc)
 {
        unsigned long flags;
        int ret = 0;
@@ -1187,8 +1181,7 @@ int ib_get_cached_lmc(struct ib_device *device,
 }
 EXPORT_SYMBOL(ib_get_cached_lmc);
 
-int ib_get_cached_port_state(struct ib_device   *device,
-                            u8                  port_num,
+int ib_get_cached_port_state(struct ib_device *device, u32 port_num,
                             enum ib_port_state *port_state)
 {
        unsigned long flags;
@@ -1222,7 +1215,7 @@ EXPORT_SYMBOL(ib_get_cached_port_state);
  * code.
  */
 const struct ib_gid_attr *
-rdma_get_gid_attr(struct ib_device *device, u8 port_num, int index)
+rdma_get_gid_attr(struct ib_device *device, u32 port_num, int index)
 {
        const struct ib_gid_attr *attr = ERR_PTR(-ENODATA);
        struct ib_gid_table *table;
@@ -1263,7 +1256,7 @@ ssize_t rdma_query_gid_table(struct ib_device *device,
        const struct ib_gid_attr *gid_attr;
        ssize_t num_entries = 0, ret;
        struct ib_gid_table *table;
-       unsigned int port_num, i;
+       u32 port_num, i;
        struct net_device *ndev;
        unsigned long flags;
 
@@ -1361,7 +1354,7 @@ struct net_device *rdma_read_gid_attr_ndev_rcu(const struct ib_gid_attr *attr)
                        container_of(attr, struct ib_gid_table_entry, attr);
        struct ib_device *device = entry->attr.device;
        struct net_device *ndev = ERR_PTR(-EINVAL);
-       u8 port_num = entry->attr.port_num;
+       u32 port_num = entry->attr.port_num;
        struct ib_gid_table *table;
        unsigned long flags;
        bool valid;
@@ -1441,7 +1434,7 @@ int rdma_read_gid_l2_fields(const struct ib_gid_attr *attr,
 EXPORT_SYMBOL(rdma_read_gid_l2_fields);
 
 static int config_non_roce_gid_cache(struct ib_device *device,
-                                    u8 port, int gid_tbl_len)
+                                    u32 port, int gid_tbl_len)
 {
        struct ib_gid_attr gid_attr = {};
        struct ib_gid_table *table;
@@ -1472,7 +1465,7 @@ err:
 }
 
 static int
-ib_cache_update(struct ib_device *device, u8 port, bool enforce_security)
+ib_cache_update(struct ib_device *device, u32 port, bool enforce_security)
 {
        struct ib_port_attr       *tprops = NULL;
        struct ib_pkey_cache      *pkey_cache = NULL, *old_pkey_cache;
@@ -1621,7 +1614,7 @@ EXPORT_SYMBOL(ib_dispatch_event);
 
 int ib_cache_setup_one(struct ib_device *device)
 {
-       unsigned int p;
+       u32 p;
        int err;
 
        rwlock_init(&device->cache_lock);
@@ -1641,7 +1634,7 @@ int ib_cache_setup_one(struct ib_device *device)
 
 void ib_cache_release_one(struct ib_device *device)
 {
-       unsigned int p;
+       u32 p;
 
        /*
         * The release function frees all the cache elements.
index 3d194bb608405de1f8f925395311d13c46b9ba17..0ead0d223154011532402d16eb7a8e7b443e1cf6 100644 (file)
@@ -202,7 +202,7 @@ static struct attribute *cm_counter_default_attrs[] = {
 struct cm_port {
        struct cm_device *cm_dev;
        struct ib_mad_agent *mad_agent;
-       u8 port_num;
+       u32 port_num;
        struct list_head cm_priv_prim_list;
        struct list_head cm_priv_altr_list;
        struct cm_counter_group counter_group[CM_COUNTER_GROUPS];
@@ -255,7 +255,8 @@ struct cm_id_private {
        struct completion comp;
        refcount_t refcount;
        /* Number of clients sharing this ib_cm_id. Only valid for listeners.
-        * Protected by the cm.lock spinlock. */
+        * Protected by the cm.lock spinlock.
+        */
        int listen_sharecount;
        struct rcu_head rcu;
 
@@ -420,8 +421,7 @@ static int cm_alloc_response_msg(struct cm_port *port,
        return 0;
 }
 
-static void * cm_copy_private_data(const void *private_data,
-                                  u8 private_data_len)
+static void *cm_copy_private_data(const void *private_data, u8 private_data_len)
 {
        void *data;
 
@@ -680,8 +680,8 @@ static struct cm_id_private *cm_insert_listen(struct cm_id_private *cm_id_priv,
        return cm_id_priv;
 }
 
-static struct cm_id_private * cm_find_listen(struct ib_device *device,
-                                            __be64 service_id)
+static struct cm_id_private *cm_find_listen(struct ib_device *device,
+                                           __be64 service_id)
 {
        struct rb_node *node = cm.listen_service_table.rb_node;
        struct cm_id_private *cm_id_priv;
@@ -708,8 +708,8 @@ static struct cm_id_private * cm_find_listen(struct ib_device *device,
        return NULL;
 }
 
-static struct cm_timewait_info * cm_insert_remote_id(struct cm_timewait_info
-                                                    *timewait_info)
+static struct cm_timewait_info *
+cm_insert_remote_id(struct cm_timewait_info *timewait_info)
 {
        struct rb_node **link = &cm.remote_id_table.rb_node;
        struct rb_node *parent = NULL;
@@ -767,8 +767,8 @@ static struct cm_id_private *cm_find_remote_id(__be64 remote_ca_guid,
        return res;
 }
 
-static struct cm_timewait_info * cm_insert_remote_qpn(struct cm_timewait_info
-                                                     *timewait_info)
+static struct cm_timewait_info *
+cm_insert_remote_qpn(struct cm_timewait_info *timewait_info)
 {
        struct rb_node **link = &cm.remote_qp_table.rb_node;
        struct rb_node *parent = NULL;
@@ -797,8 +797,8 @@ static struct cm_timewait_info * cm_insert_remote_qpn(struct cm_timewait_info
        return NULL;
 }
 
-static struct cm_id_private * cm_insert_remote_sidr(struct cm_id_private
-                                                   *cm_id_priv)
+static struct cm_id_private *
+cm_insert_remote_sidr(struct cm_id_private *cm_id_priv)
 {
        struct rb_node **link = &cm.remote_sidr_table.rb_node;
        struct rb_node *parent = NULL;
@@ -897,7 +897,7 @@ struct ib_cm_id *ib_create_cm_id(struct ib_device *device,
 }
 EXPORT_SYMBOL(ib_create_cm_id);
 
-static struct cm_work * cm_dequeue_work(struct cm_id_private *cm_id_priv)
+static struct cm_work *cm_dequeue_work(struct cm_id_private *cm_id_priv)
 {
        struct cm_work *work;
 
@@ -986,7 +986,7 @@ static void cm_remove_remote(struct cm_id_private *cm_id_priv)
        }
 }
 
-static struct cm_timewait_info * cm_create_timewait_info(__be32 local_id)
+static struct cm_timewait_info *cm_create_timewait_info(__be32 local_id)
 {
        struct cm_timewait_info *timewait_info;
 
@@ -1631,7 +1631,7 @@ static bool cm_req_has_alt_path(struct cm_req_msg *req_msg)
                                               req_msg))));
 }
 
-static void cm_path_set_rec_type(struct ib_device *ib_device, u8 port_num,
+static void cm_path_set_rec_type(struct ib_device *ib_device, u32 port_num,
                                 struct sa_path_rec *path, union ib_gid *gid)
 {
        if (ib_is_opa_gid(gid) && rdma_cap_opa_ah(ib_device, port_num))
@@ -1750,7 +1750,7 @@ static void cm_format_paths_from_req(struct cm_req_msg *req_msg,
 static u16 cm_get_bth_pkey(struct cm_work *work)
 {
        struct ib_device *ib_dev = work->port->cm_dev->ib_device;
-       u8 port_num = work->port->port_num;
+       u32 port_num = work->port->port_num;
        u16 pkey_index = work->mad_recv_wc->wc->pkey_index;
        u16 pkey;
        int ret;
@@ -1778,7 +1778,7 @@ static void cm_opa_to_ib_sgid(struct cm_work *work,
                              struct sa_path_rec *path)
 {
        struct ib_device *dev = work->port->cm_dev->ib_device;
-       u8 port_num = work->port->port_num;
+       u32 port_num = work->port->port_num;
 
        if (rdma_cap_opa_ah(dev, port_num) &&
            (ib_is_opa_gid(&path->sgid))) {
@@ -1977,8 +1977,8 @@ unlock:   spin_unlock_irq(&cm_id_priv->lock);
 free:  cm_free_msg(msg);
 }
 
-static struct cm_id_private * cm_match_req(struct cm_work *work,
-                                          struct cm_id_private *cm_id_priv)
+static struct cm_id_private *cm_match_req(struct cm_work *work,
+                                         struct cm_id_private *cm_id_priv)
 {
        struct cm_id_private *listen_cm_id_priv, *cur_cm_id_priv;
        struct cm_timewait_info *timewait_info;
@@ -2138,20 +2138,17 @@ static int cm_req_handler(struct cm_work *work)
                goto destroy;
        }
 
-       cm_process_routed_req(req_msg, work->mad_recv_wc->wc);
-
        memset(&work->path[0], 0, sizeof(work->path[0]));
        if (cm_req_has_alt_path(req_msg))
                memset(&work->path[1], 0, sizeof(work->path[1]));
        grh = rdma_ah_read_grh(&cm_id_priv->av.ah_attr);
        gid_attr = grh->sgid_attr;
 
-       if (gid_attr &&
-           rdma_protocol_roce(work->port->cm_dev->ib_device,
-                              work->port->port_num)) {
+       if (cm_id_priv->av.ah_attr.type == RDMA_AH_ATTR_TYPE_ROCE) {
                work->path[0].rec_type =
                        sa_conv_gid_to_pathrec_type(gid_attr->gid_type);
        } else {
+               cm_process_routed_req(req_msg, work->mad_recv_wc->wc);
                cm_path_set_rec_type(
                        work->port->cm_dev->ib_device, work->port->port_num,
                        &work->path[0],
@@ -2993,7 +2990,7 @@ static void cm_format_rej_event(struct cm_work *work)
                IBA_GET_MEM_PTR(CM_REJ_PRIVATE_DATA, rej_msg);
 }
 
-static struct cm_id_private * cm_acquire_rejected_id(struct cm_rej_msg *rej_msg)
+static struct cm_id_private *cm_acquire_rejected_id(struct cm_rej_msg *rej_msg)
 {
        struct cm_id_private *cm_id_priv;
        __be32 remote_id;
@@ -3098,7 +3095,7 @@ int ib_send_cm_mra(struct ib_cm_id *cm_id,
        cm_id_priv = container_of(cm_id, struct cm_id_private, id);
 
        spin_lock_irqsave(&cm_id_priv->lock, flags);
-       switch(cm_id_priv->id.state) {
+       switch (cm_id_priv->id.state) {
        case IB_CM_REQ_RCVD:
                cm_state = IB_CM_MRA_REQ_SENT;
                lap_state = cm_id->lap_state;
@@ -3155,7 +3152,7 @@ error2:   spin_unlock_irqrestore(&cm_id_priv->lock, flags);
 }
 EXPORT_SYMBOL(ib_send_cm_mra);
 
-static struct cm_id_private * cm_acquire_mraed_id(struct cm_mra_msg *mra_msg)
+static struct cm_id_private *cm_acquire_mraed_id(struct cm_mra_msg *mra_msg)
 {
        switch (IBA_GET(CM_MRA_MESSAGE_MRAED, mra_msg)) {
        case CM_MSG_RESPONSE_REQ:
@@ -3917,8 +3914,7 @@ static int cm_establish(struct ib_cm_id *cm_id)
 
        cm_id_priv = container_of(cm_id, struct cm_id_private, id);
        spin_lock_irqsave(&cm_id_priv->lock, flags);
-       switch (cm_id->state)
-       {
+       switch (cm_id->state) {
        case IB_CM_REP_SENT:
        case IB_CM_MRA_REP_RCVD:
                cm_id->state = IB_CM_ESTABLISHED;
@@ -4334,7 +4330,7 @@ static int cm_add_one(struct ib_device *ib_device)
        unsigned long flags;
        int ret;
        int count = 0;
-       unsigned int i;
+       u32 i;
 
        cm_dev = kzalloc(struct_size(cm_dev, port, ib_device->phys_port_cnt),
                         GFP_KERNEL);
@@ -4432,7 +4428,7 @@ static void cm_remove_one(struct ib_device *ib_device, void *client_data)
                .clr_port_cap_mask = IB_PORT_CM_SUP
        };
        unsigned long flags;
-       unsigned int i;
+       u32 i;
 
        write_lock_irqsave(&cm.device_lock, flags);
        list_del(&cm_dev->list);
index 0cc40656b5c5f325b0ee36e95e63865a908cf1e6..8462de7ca26ebadcbdeae43a9b1be517bfb00763 100644 (file)
@@ -22,7 +22,7 @@
 static inline enum ib_qp_type cm_req_get_qp_type(struct cm_req_msg *req_msg)
 {
        u8 transport_type = IBA_GET(CM_REQ_TRANSPORT_SERVICE_TYPE, req_msg);
-       switch(transport_type) {
+       switch (transport_type) {
        case 0: return IB_QPT_RC;
        case 1: return IB_QPT_UC;
        case 3:
@@ -37,7 +37,7 @@ static inline enum ib_qp_type cm_req_get_qp_type(struct cm_req_msg *req_msg)
 static inline void cm_req_set_qp_type(struct cm_req_msg *req_msg,
                                      enum ib_qp_type qp_type)
 {
-       switch(qp_type) {
+       switch (qp_type) {
        case IB_QPT_UC:
                IBA_SET(CM_REQ_TRANSPORT_SERVICE_TYPE, req_msg, 1);
                break;
index 94096511599f04a07f41518a84ee058fd65dde6f..2b9ffc21cbc4ad4a3fbbd096f610c96284b8474c 100644 (file)
@@ -43,7 +43,6 @@ MODULE_DESCRIPTION("Generic RDMA CM Agent");
 MODULE_LICENSE("Dual BSD/GPL");
 
 #define CMA_CM_RESPONSE_TIMEOUT 20
-#define CMA_QUERY_CLASSPORT_INFO_TIMEOUT 3000
 #define CMA_MAX_CM_RETRIES 15
 #define CMA_CM_MRA_SETTING (IB_CM_MRA_FLAG_DELAY | 24)
 #define CMA_IBOE_PACKET_LIFETIME 18
@@ -219,14 +218,6 @@ struct rdma_bind_list {
        unsigned short          port;
 };
 
-struct class_port_info_context {
-       struct ib_class_port_info       *class_port_info;
-       struct ib_device                *device;
-       struct completion               done;
-       struct ib_sa_query              *sa_query;
-       u8                              port_num;
-};
-
 static int cma_ps_alloc(struct net *net, enum rdma_ucm_port_space ps,
                        struct rdma_bind_list *bind_list, int snum)
 {
@@ -287,7 +278,7 @@ struct cma_device *cma_enum_devices_by_ibdev(cma_device_filter      filter,
 }
 
 int cma_get_default_gid_type(struct cma_device *cma_dev,
-                            unsigned int port)
+                            u32 port)
 {
        if (!rdma_is_port_valid(cma_dev->device, port))
                return -EINVAL;
@@ -296,7 +287,7 @@ int cma_get_default_gid_type(struct cma_device *cma_dev,
 }
 
 int cma_set_default_gid_type(struct cma_device *cma_dev,
-                            unsigned int port,
+                            u32 port,
                             enum ib_gid_type default_gid_type)
 {
        unsigned long supported_gids;
@@ -319,7 +310,7 @@ int cma_set_default_gid_type(struct cma_device *cma_dev,
        return 0;
 }
 
-int cma_get_default_roce_tos(struct cma_device *cma_dev, unsigned int port)
+int cma_get_default_roce_tos(struct cma_device *cma_dev, u32 port)
 {
        if (!rdma_is_port_valid(cma_dev->device, port))
                return -EINVAL;
@@ -327,7 +318,7 @@ int cma_get_default_roce_tos(struct cma_device *cma_dev, unsigned int port)
        return cma_dev->default_roce_tos[port - rdma_start_port(cma_dev->device)];
 }
 
-int cma_set_default_roce_tos(struct cma_device *cma_dev, unsigned int port,
+int cma_set_default_roce_tos(struct cma_device *cma_dev, u32 port,
                             u8 default_roce_tos)
 {
        if (!rdma_is_port_valid(cma_dev->device, port))
@@ -463,7 +454,6 @@ static void _cma_attach_to_dev(struct rdma_id_private *id_priv,
        id_priv->id.route.addr.dev_addr.transport =
                rdma_node_get_transport(cma_dev->device->node_type);
        list_add_tail(&id_priv->list, &cma_dev->id_list);
-       rdma_restrack_add(&id_priv->res);
 
        trace_cm_id_attach(id_priv, cma_dev->device);
 }
@@ -562,7 +552,7 @@ static int cma_translate_addr(struct sockaddr *addr, struct rdma_dev_addr *dev_a
 }
 
 static const struct ib_gid_attr *
-cma_validate_port(struct ib_device *device, u8 port,
+cma_validate_port(struct ib_device *device, u32 port,
                  enum ib_gid_type gid_type,
                  union ib_gid *gid,
                  struct rdma_id_private *id_priv)
@@ -620,7 +610,7 @@ static int cma_acquire_dev_by_src_ip(struct rdma_id_private *id_priv)
        struct cma_device *cma_dev;
        enum ib_gid_type gid_type;
        int ret = -ENODEV;
-       unsigned int port;
+       u32 port;
 
        if (dev_addr->dev_type != ARPHRD_INFINIBAND &&
            id_priv->id.ps == RDMA_PS_IPOIB)
@@ -700,6 +690,7 @@ static int cma_ib_acquire_dev(struct rdma_id_private *id_priv,
        mutex_lock(&lock);
        cma_attach_to_dev(id_priv, listen_id_priv->cma_dev);
        mutex_unlock(&lock);
+       rdma_restrack_add(&id_priv->res);
        return 0;
 }
 
@@ -711,8 +702,8 @@ static int cma_iw_acquire_dev(struct rdma_id_private *id_priv,
        struct cma_device *cma_dev;
        enum ib_gid_type gid_type;
        int ret = -ENODEV;
-       unsigned int port;
        union ib_gid gid;
+       u32 port;
 
        if (dev_addr->dev_type != ARPHRD_INFINIBAND &&
            id_priv->id.ps == RDMA_PS_IPOIB)
@@ -754,8 +745,10 @@ static int cma_iw_acquire_dev(struct rdma_id_private *id_priv,
        }
 
 out:
-       if (!ret)
+       if (!ret) {
                cma_attach_to_dev(id_priv, cma_dev);
+               rdma_restrack_add(&id_priv->res);
+       }
 
        mutex_unlock(&lock);
        return ret;
@@ -816,6 +809,7 @@ static int cma_resolve_ib_dev(struct rdma_id_private *id_priv)
 
 found:
        cma_attach_to_dev(id_priv, cma_dev);
+       rdma_restrack_add(&id_priv->res);
        mutex_unlock(&lock);
        addr = (struct sockaddr_ib *)cma_src_addr(id_priv);
        memcpy(&addr->sib_addr, &sgid, sizeof(sgid));
@@ -852,6 +846,7 @@ __rdma_create_id(struct net *net, rdma_cm_event_handler event_handler,
        id_priv->id.qp_type = qp_type;
        id_priv->tos_set = false;
        id_priv->timeout_set = false;
+       id_priv->min_rnr_timer_set = false;
        id_priv->gid_type = IB_GID_TYPE_IB;
        spin_lock_init(&id_priv->lock);
        mutex_init(&id_priv->qp_mutex);
@@ -1135,12 +1130,16 @@ int rdma_init_qp_attr(struct rdma_cm_id *id, struct ib_qp_attr *qp_attr,
                                                 qp_attr_mask);
                qp_attr->port_num = id_priv->id.port_num;
                *qp_attr_mask |= IB_QP_PORT;
-       } else
+       } else {
                ret = -ENOSYS;
+       }
 
        if ((*qp_attr_mask & IB_QP_TIMEOUT) && id_priv->timeout_set)
                qp_attr->timeout = id_priv->timeout;
 
+       if ((*qp_attr_mask & IB_QP_MIN_RNR_TIMER) && id_priv->min_rnr_timer_set)
+               qp_attr->min_rnr_timer = id_priv->min_rnr_timer;
+
        return ret;
 }
 EXPORT_SYMBOL(rdma_init_qp_attr);
@@ -1581,7 +1580,7 @@ static bool cma_match_private_data(struct rdma_id_private *id_priv,
 static bool cma_protocol_roce(const struct rdma_cm_id *id)
 {
        struct ib_device *device = id->device;
-       const int port_num = id->port_num ?: rdma_start_port(device);
+       const u32 port_num = id->port_num ?: rdma_start_port(device);
 
        return rdma_protocol_roce(device, port_num);
 }
@@ -2474,6 +2473,7 @@ static int cma_iw_listen(struct rdma_id_private *id_priv, int backlog)
 
        id->tos = id_priv->tos;
        id->tos_set = id_priv->tos_set;
+       id->afonly = id_priv->afonly;
        id_priv->cm_id.iw = id;
 
        memcpy(&id_priv->cm_id.iw->local_addr, cma_src_addr(id_priv),
@@ -2529,6 +2529,7 @@ static int cma_listen_on_dev(struct rdma_id_private *id_priv,
               rdma_addr_size(cma_src_addr(id_priv)));
 
        _cma_attach_to_dev(dev_id_priv, cma_dev);
+       rdma_restrack_add(&dev_id_priv->res);
        cma_id_get(id_priv);
        dev_id_priv->internal_id = 1;
        dev_id_priv->afonly = id_priv->afonly;
@@ -2615,6 +2616,43 @@ int rdma_set_ack_timeout(struct rdma_cm_id *id, u8 timeout)
 }
 EXPORT_SYMBOL(rdma_set_ack_timeout);
 
+/**
+ * rdma_set_min_rnr_timer() - Set the minimum RNR Retry timer of the
+ *                           QP associated with a connection identifier.
+ * @id: Communication identifier to associated with service type.
+ * @min_rnr_timer: 5-bit value encoded as Table 45: "Encoding for RNR NAK
+ *                Timer Field" in the IBTA specification.
+ *
+ * This function should be called before rdma_connect() on active
+ * side, and on passive side before rdma_accept(). The timer value
+ * will be associated with the local QP. When it receives a send it is
+ * not read to handle, typically if the receive queue is empty, an RNR
+ * Retry NAK is returned to the requester with the min_rnr_timer
+ * encoded. The requester will then wait at least the time specified
+ * in the NAK before retrying. The default is zero, which translates
+ * to a minimum RNR Timer value of 655 ms.
+ *
+ * Return: 0 for success
+ */
+int rdma_set_min_rnr_timer(struct rdma_cm_id *id, u8 min_rnr_timer)
+{
+       struct rdma_id_private *id_priv;
+
+       /* It is a five-bit value */
+       if (min_rnr_timer & 0xe0)
+               return -EINVAL;
+
+       if (WARN_ON(id->qp_type != IB_QPT_RC && id->qp_type != IB_QPT_XRC_TGT))
+               return -EINVAL;
+
+       id_priv = container_of(id, struct rdma_id_private, id);
+       id_priv->min_rnr_timer = min_rnr_timer;
+       id_priv->min_rnr_timer_set = true;
+
+       return 0;
+}
+EXPORT_SYMBOL(rdma_set_min_rnr_timer);
+
 static void cma_query_handler(int status, struct sa_path_rec *path_rec,
                              void *context)
 {
@@ -3169,6 +3207,7 @@ port_found:
        ib_addr_set_pkey(&id_priv->id.route.addr.dev_addr, pkey);
        id_priv->id.port_num = p;
        cma_attach_to_dev(id_priv, cma_dev);
+       rdma_restrack_add(&id_priv->res);
        cma_set_loopback(cma_src_addr(id_priv));
 out:
        mutex_unlock(&lock);
@@ -3201,6 +3240,7 @@ static void addr_handler(int status, struct sockaddr *src_addr,
                if (status)
                        pr_debug_ratelimited("RDMA CM: ADDR_ERROR: failed to acquire device. status %d\n",
                                             status);
+               rdma_restrack_add(&id_priv->res);
        } else if (status) {
                pr_debug_ratelimited("RDMA CM: ADDR_ERROR: failed to resolve IP. status %d\n", status);
        }
@@ -3812,6 +3852,8 @@ int rdma_bind_addr(struct rdma_cm_id *id, struct sockaddr *addr)
        if (ret)
                goto err2;
 
+       if (!cma_any_addr(addr))
+               rdma_restrack_add(&id_priv->res);
        return 0;
 err2:
        if (id_priv->cma_dev)
@@ -4124,10 +4166,11 @@ int rdma_connect_locked(struct rdma_cm_id *id,
                        ret = cma_resolve_ib_udp(id_priv, conn_param);
                else
                        ret = cma_connect_ib(id_priv, conn_param);
-       } else if (rdma_cap_iw_cm(id->device, id->port_num))
+       } else if (rdma_cap_iw_cm(id->device, id->port_num)) {
                ret = cma_connect_iw(id_priv, conn_param);
-       else
+       } else {
                ret = -ENOSYS;
+       }
        if (ret)
                goto err_state;
        return 0;
@@ -4234,9 +4277,9 @@ static int cma_accept_iw(struct rdma_id_private *id_priv,
        iw_param.ird = conn_param->responder_resources;
        iw_param.private_data = conn_param->private_data;
        iw_param.private_data_len = conn_param->private_data_len;
-       if (id_priv->id.qp) {
+       if (id_priv->id.qp)
                iw_param.qpn = id_priv->qp_num;
-       else
+       else
                iw_param.qpn = conn_param->qp_num;
 
        return iw_cm_accept(id_priv->cm_id.iw, &iw_param);
@@ -4319,11 +4362,11 @@ int rdma_accept(struct rdma_cm_id *id, struct rdma_conn_param *conn_param)
                        else
                                ret = cma_rep_recv(id_priv);
                }
-       } else if (rdma_cap_iw_cm(id->device, id->port_num))
+       } else if (rdma_cap_iw_cm(id->device, id->port_num)) {
                ret = cma_accept_iw(id_priv, conn_param);
-       else
+       } else {
                ret = -ENOSYS;
-
+       }
        if (ret)
                goto reject;
 
@@ -4409,8 +4452,9 @@ int rdma_reject(struct rdma_cm_id *id, const void *private_data,
        } else if (rdma_cap_iw_cm(id->device, id->port_num)) {
                ret = iw_cm_reject(id_priv->cm_id.iw,
                                   private_data, private_data_len);
-       } else
+       } else {
                ret = -ENOSYS;
+       }
 
        return ret;
 }
@@ -4864,14 +4908,28 @@ static void cma_process_remove(struct cma_device *cma_dev)
        wait_for_completion(&cma_dev->comp);
 }
 
+static bool cma_supported(struct ib_device *device)
+{
+       u32 i;
+
+       rdma_for_each_port(device, i) {
+               if (rdma_cap_ib_cm(device, i) || rdma_cap_iw_cm(device, i))
+                       return true;
+       }
+       return false;
+}
+
 static int cma_add_one(struct ib_device *device)
 {
        struct rdma_id_private *to_destroy;
        struct cma_device *cma_dev;
        struct rdma_id_private *id_priv;
-       unsigned int i;
        unsigned long supported_gids = 0;
        int ret;
+       u32 i;
+
+       if (!cma_supported(device))
+               return -EOPNOTSUPP;
 
        cma_dev = kmalloc(sizeof(*cma_dev), GFP_KERNEL);
        if (!cma_dev)
index e0d5e3bae45838c8db194c52ae1e16c4d0afe82b..9ac16e0db7611757785f8a90f885cd14d20f9d02 100644 (file)
@@ -43,7 +43,7 @@ struct cma_device;
 struct cma_dev_group;
 
 struct cma_dev_port_group {
-       unsigned int            port_num;
+       u32                     port_num;
        struct cma_dev_group    *cma_dev_group;
        struct config_group     group;
 };
@@ -200,10 +200,10 @@ static const struct config_item_type cma_port_group_type = {
 static int make_cma_ports(struct cma_dev_group *cma_dev_group,
                          struct cma_device *cma_dev)
 {
-       struct ib_device *ibdev;
-       unsigned int i;
-       unsigned int ports_num;
        struct cma_dev_port_group *ports;
+       struct ib_device *ibdev;
+       u32 ports_num;
+       u32 i;
 
        ibdev = cma_get_ib_dev(cma_dev);
 
index caece96ebcf5fbfb5c53dd8631fe3d79e89c188e..5c463da9984536c6795ee7905fb08848235b4cb9 100644 (file)
@@ -86,9 +86,11 @@ struct rdma_id_private {
        u8                      tos;
        u8                      tos_set:1;
        u8                      timeout_set:1;
+       u8                      min_rnr_timer_set:1;
        u8                      reuseaddr;
        u8                      afonly;
        u8                      timeout;
+       u8                      min_rnr_timer;
        enum ib_gid_type        gid_type;
 
        /*
@@ -117,11 +119,11 @@ void cma_dev_put(struct cma_device *dev);
 typedef bool (*cma_device_filter)(struct ib_device *, void *);
 struct cma_device *cma_enum_devices_by_ibdev(cma_device_filter filter,
                                             void *cookie);
-int cma_get_default_gid_type(struct cma_device *dev, unsigned int port);
-int cma_set_default_gid_type(struct cma_device *dev, unsigned int port,
+int cma_get_default_gid_type(struct cma_device *dev, u32 port);
+int cma_set_default_gid_type(struct cma_device *dev, u32 port,
                             enum ib_gid_type default_gid_type);
-int cma_get_default_roce_tos(struct cma_device *dev, unsigned int port);
-int cma_set_default_roce_tos(struct cma_device *dev, unsigned int port,
+int cma_get_default_roce_tos(struct cma_device *dev, u32 port);
+int cma_set_default_roce_tos(struct cma_device *dev, u32 port,
                             u8 default_roce_tos);
 struct ib_device *cma_get_ib_dev(struct cma_device *dev);
 
index 315f7a297eee35e6c1ce0c840bb63c1312dacc90..29809dd300419fb3f4d36488912d593e69ad1ce9 100644 (file)
@@ -83,14 +83,14 @@ void ib_device_unregister_sysfs(struct ib_device *device);
 int ib_device_rename(struct ib_device *ibdev, const char *name);
 int ib_device_set_dim(struct ib_device *ibdev, u8 use_dim);
 
-typedef void (*roce_netdev_callback)(struct ib_device *device, u8 port,
+typedef void (*roce_netdev_callback)(struct ib_device *device, u32 port,
              struct net_device *idev, void *cookie);
 
-typedef bool (*roce_netdev_filter)(struct ib_device *device, u8 port,
+typedef bool (*roce_netdev_filter)(struct ib_device *device, u32 port,
                                   struct net_device *idev, void *cookie);
 
 struct net_device *ib_device_get_netdev(struct ib_device *ib_dev,
-                                       unsigned int port);
+                                       u32 port);
 
 void ib_enum_roce_netdev(struct ib_device *ib_dev,
                         roce_netdev_filter filter,
@@ -113,7 +113,7 @@ int ib_enum_all_devs(nldev_callback nldev_cb, struct sk_buff *skb,
 struct ib_client_nl_info {
        struct sk_buff *nl_msg;
        struct device *cdev;
-       unsigned int port;
+       u32 port;
        u64 abi;
 };
 int ib_get_client_nl_info(struct ib_device *ibdev, const char *client_name,
@@ -128,24 +128,24 @@ int ib_cache_gid_parse_type_str(const char *buf);
 
 const char *ib_cache_gid_type_str(enum ib_gid_type gid_type);
 
-void ib_cache_gid_set_default_gid(struct ib_device *ib_dev, u8 port,
+void ib_cache_gid_set_default_gid(struct ib_device *ib_dev, u32 port,
                                  struct net_device *ndev,
                                  unsigned long gid_type_mask,
                                  enum ib_cache_gid_default_mode mode);
 
-int ib_cache_gid_add(struct ib_device *ib_dev, u8 port,
+int ib_cache_gid_add(struct ib_device *ib_dev, u32 port,
                     union ib_gid *gid, struct ib_gid_attr *attr);
 
-int ib_cache_gid_del(struct ib_device *ib_dev, u8 port,
+int ib_cache_gid_del(struct ib_device *ib_dev, u32 port,
                     union ib_gid *gid, struct ib_gid_attr *attr);
 
-int ib_cache_gid_del_all_netdev_gids(struct ib_device *ib_dev, u8 port,
+int ib_cache_gid_del_all_netdev_gids(struct ib_device *ib_dev, u32 port,
                                     struct net_device *ndev);
 
 int roce_gid_mgmt_init(void);
 void roce_gid_mgmt_cleanup(void);
 
-unsigned long roce_gid_type_mask_support(struct ib_device *ib_dev, u8 port);
+unsigned long roce_gid_type_mask_support(struct ib_device *ib_dev, u32 port);
 
 int ib_cache_setup_one(struct ib_device *device);
 void ib_cache_cleanup_one(struct ib_device *device);
@@ -215,14 +215,14 @@ int ib_nl_handle_ip_res_resp(struct sk_buff *skb,
                             struct netlink_ext_ack *extack);
 
 int ib_get_cached_subnet_prefix(struct ib_device *device,
-                               u8                port_num,
-                               u64              *sn_pfx);
+                               u32 port_num,
+                               u64 *sn_pfx);
 
 #ifdef CONFIG_SECURITY_INFINIBAND
 void ib_security_release_port_pkey_list(struct ib_device *device);
 
 void ib_security_cache_change(struct ib_device *device,
-                             u8 port_num,
+                             u32 port_num,
                              u64 subnet_prefix);
 
 int ib_security_modify_qp(struct ib_qp *qp,
@@ -247,7 +247,7 @@ static inline void ib_security_release_port_pkey_list(struct ib_device *device)
 }
 
 static inline void ib_security_cache_change(struct ib_device *device,
-                                           u8 port_num,
+                                           u32 port_num,
                                            u64 subnet_prefix)
 {
 }
@@ -381,7 +381,7 @@ int ib_setup_port_attrs(struct ib_core_device *coredev);
 
 int rdma_compatdev_set(u8 enable);
 
-int ib_port_register_module_stat(struct ib_device *device, u8 port_num,
+int ib_port_register_module_stat(struct ib_device *device, u32 port_num,
                                 struct kobject *kobj, struct kobj_type *ktype,
                                 const char *name);
 void ib_port_unregister_module_stat(struct kobject *kobj);
index f3a7c1f404af8d79287e1d3f9779e8b43a10f21e..15493357cfef09bb8028f5d0b25ea6d2218043b8 100644 (file)
@@ -14,10 +14,12 @@ static int __counter_set_mode(struct rdma_port_counter *port_counter,
                              enum rdma_nl_counter_mode new_mode,
                              enum rdma_nl_counter_mask new_mask)
 {
-       if (new_mode == RDMA_COUNTER_MODE_AUTO && port_counter->num_counters)
-               if (new_mask & ~ALL_AUTO_MODE_MASKS ||
-                   port_counter->mode.mode != RDMA_COUNTER_MODE_NONE)
+       if (new_mode == RDMA_COUNTER_MODE_AUTO) {
+               if (new_mask & (~ALL_AUTO_MODE_MASKS))
                        return -EINVAL;
+               if (port_counter->num_counters)
+                       return -EBUSY;
+       }
 
        port_counter->mode.mode = new_mode;
        port_counter->mode.mask = new_mask;
@@ -32,14 +34,17 @@ static int __counter_set_mode(struct rdma_port_counter *port_counter,
  * @mask: Mask to configure
  * @extack: Message to the user
  *
- * Return 0 on success.
+ * Return 0 on success. If counter mode wasn't changed then it is considered
+ * as success as well.
+ * Return -EBUSY when changing to auto mode while there are bounded counters.
+ *
  */
-int rdma_counter_set_auto_mode(struct ib_device *dev, u8 port,
+int rdma_counter_set_auto_mode(struct ib_device *dev, u32 port,
                               enum rdma_nl_counter_mask mask,
                               struct netlink_ext_ack *extack)
 {
-       enum rdma_nl_counter_mode mode = RDMA_COUNTER_MODE_AUTO;
        struct rdma_port_counter *port_counter;
+       enum rdma_nl_counter_mode mode;
        int ret;
 
        port_counter = &dev->port_data[port].port_counter;
@@ -47,25 +52,26 @@ int rdma_counter_set_auto_mode(struct ib_device *dev, u8 port,
                return -EOPNOTSUPP;
 
        mutex_lock(&port_counter->lock);
-       if (mask) {
-               ret = __counter_set_mode(port_counter, mode, mask);
-               if (ret)
-                       NL_SET_ERR_MSG(
-                               extack,
-                               "Turning on auto mode is not allowed when there is bound QP");
+       if (mask)
+               mode = RDMA_COUNTER_MODE_AUTO;
+       else
+               mode = (port_counter->num_counters) ? RDMA_COUNTER_MODE_MANUAL :
+                                                     RDMA_COUNTER_MODE_NONE;
+
+       if (port_counter->mode.mode == mode &&
+           port_counter->mode.mask == mask) {
+               ret = 0;
                goto out;
        }
 
-       if (port_counter->mode.mode != RDMA_COUNTER_MODE_AUTO) {
-               ret = -EINVAL;
-               goto out;
-       }
+       ret = __counter_set_mode(port_counter, mode, mask);
 
-       mode = (port_counter->num_counters) ? RDMA_COUNTER_MODE_MANUAL :
-                                                   RDMA_COUNTER_MODE_NONE;
-       ret = __counter_set_mode(port_counter, mode, 0);
 out:
        mutex_unlock(&port_counter->lock);
+       if (ret == -EBUSY)
+               NL_SET_ERR_MSG(
+                       extack,
+                       "Modifying auto mode is not allowed when there is a bound QP");
        return ret;
 }
 
@@ -100,7 +106,7 @@ static int __rdma_counter_bind_qp(struct rdma_counter *counter,
        return ret;
 }
 
-static struct rdma_counter *alloc_and_bind(struct ib_device *dev, u8 port,
+static struct rdma_counter *alloc_and_bind(struct ib_device *dev, u32 port,
                                           struct ib_qp *qp,
                                           enum rdma_nl_counter_mode mode)
 {
@@ -238,7 +244,7 @@ static void counter_history_stat_update(struct rdma_counter *counter)
  * Return: The counter (with ref-count increased) if found
  */
 static struct rdma_counter *rdma_get_counter_auto_mode(struct ib_qp *qp,
-                                                      u8 port)
+                                                      u32 port)
 {
        struct rdma_port_counter *port_counter;
        struct rdma_counter *counter = NULL;
@@ -282,7 +288,7 @@ static void counter_release(struct kref *kref)
  * rdma_counter_bind_qp_auto - Check and bind the QP to a counter base on
  *   the auto-mode rule
  */
-int rdma_counter_bind_qp_auto(struct ib_qp *qp, u8 port)
+int rdma_counter_bind_qp_auto(struct ib_qp *qp, u32 port)
 {
        struct rdma_port_counter *port_counter;
        struct ib_device *dev = qp->device;
@@ -352,7 +358,7 @@ int rdma_counter_query_stats(struct rdma_counter *counter)
 }
 
 static u64 get_running_counters_hwstat_sum(struct ib_device *dev,
-                                          u8 port, u32 index)
+                                          u32 port, u32 index)
 {
        struct rdma_restrack_entry *res;
        struct rdma_restrack_root *rt;
@@ -388,7 +394,7 @@ next:
  * rdma_counter_get_hwstat_value() - Get the sum value of all counters on a
  *   specific port, including the running ones and history data
  */
-u64 rdma_counter_get_hwstat_value(struct ib_device *dev, u8 port, u32 index)
+u64 rdma_counter_get_hwstat_value(struct ib_device *dev, u32 port, u32 index)
 {
        struct rdma_port_counter *port_counter;
        u64 sum;
@@ -443,7 +449,7 @@ static struct rdma_counter *rdma_get_counter_by_id(struct ib_device *dev,
 /*
  * rdma_counter_bind_qpn() - Bind QP @qp_num to counter @counter_id
  */
-int rdma_counter_bind_qpn(struct ib_device *dev, u8 port,
+int rdma_counter_bind_qpn(struct ib_device *dev, u32 port,
                          u32 qp_num, u32 counter_id)
 {
        struct rdma_port_counter *port_counter;
@@ -493,7 +499,7 @@ err:
  * rdma_counter_bind_qpn_alloc() - Alloc a counter and bind QP @qp_num to it
  *   The id of new counter is returned in @counter_id
  */
-int rdma_counter_bind_qpn_alloc(struct ib_device *dev, u8 port,
+int rdma_counter_bind_qpn_alloc(struct ib_device *dev, u32 port,
                                u32 qp_num, u32 *counter_id)
 {
        struct rdma_port_counter *port_counter;
@@ -540,7 +546,7 @@ err:
 /*
  * rdma_counter_unbind_qpn() - Unbind QP @qp_num from a counter
  */
-int rdma_counter_unbind_qpn(struct ib_device *dev, u8 port,
+int rdma_counter_unbind_qpn(struct ib_device *dev, u32 port,
                            u32 qp_num, u32 counter_id)
 {
        struct rdma_port_counter *port_counter;
@@ -573,7 +579,7 @@ out:
        return ret;
 }
 
-int rdma_counter_get_mode(struct ib_device *dev, u8 port,
+int rdma_counter_get_mode(struct ib_device *dev, u32 port,
                          enum rdma_nl_counter_mode *mode,
                          enum rdma_nl_counter_mask *mask)
 {
index aac0fe14e1d9b9846de87cd8d69071cdb8398cf3..c660cef66ac6ca186694b298ee76c2c9d65d3dd5 100644 (file)
@@ -779,7 +779,7 @@ static void remove_client_context(struct ib_device *device,
 static int alloc_port_data(struct ib_device *device)
 {
        struct ib_port_data_rcu *pdata_rcu;
-       unsigned int port;
+       u32 port;
 
        if (device->port_data)
                return 0;
@@ -788,6 +788,10 @@ static int alloc_port_data(struct ib_device *device)
        if (WARN_ON(!device->phys_port_cnt))
                return -EINVAL;
 
+       /* Reserve U32_MAX so the logic to go over all the ports is sane */
+       if (WARN_ON(device->phys_port_cnt == U32_MAX))
+               return -EINVAL;
+
        /*
         * device->port_data is indexed directly by the port number to make
         * access to this data as efficient as possible.
@@ -819,7 +823,7 @@ static int alloc_port_data(struct ib_device *device)
        return 0;
 }
 
-static int verify_immutable(const struct ib_device *dev, u8 port)
+static int verify_immutable(const struct ib_device *dev, u32 port)
 {
        return WARN_ON(!rdma_cap_ib_mad(dev, port) &&
                            rdma_max_mad_size(dev, port) != 0);
@@ -827,7 +831,7 @@ static int verify_immutable(const struct ib_device *dev, u8 port)
 
 static int setup_port_data(struct ib_device *device)
 {
-       unsigned int port;
+       u32 port;
        int ret;
 
        ret = alloc_port_data(device);
@@ -2005,7 +2009,7 @@ void ib_dispatch_event_clients(struct ib_event *event)
 }
 
 static int iw_query_port(struct ib_device *device,
-                          u8 port_num,
+                          u32 port_num,
                           struct ib_port_attr *port_attr)
 {
        struct in_device *inetdev;
@@ -2044,7 +2048,7 @@ static int iw_query_port(struct ib_device *device,
 }
 
 static int __ib_query_port(struct ib_device *device,
-                          u8 port_num,
+                          u32 port_num,
                           struct ib_port_attr *port_attr)
 {
        union ib_gid gid = {};
@@ -2078,7 +2082,7 @@ static int __ib_query_port(struct ib_device *device,
  * @port_attr pointer.
  */
 int ib_query_port(struct ib_device *device,
-                 u8 port_num,
+                 u32 port_num,
                  struct ib_port_attr *port_attr)
 {
        if (!rdma_is_port_valid(device, port_num))
@@ -2130,7 +2134,7 @@ static void add_ndev_hash(struct ib_port_data *pdata)
  * NETDEV_UNREGISTER event.
  */
 int ib_device_set_netdev(struct ib_device *ib_dev, struct net_device *ndev,
-                        unsigned int port)
+                        u32 port)
 {
        struct net_device *old_ndev;
        struct ib_port_data *pdata;
@@ -2173,7 +2177,7 @@ EXPORT_SYMBOL(ib_device_set_netdev);
 static void free_netdevs(struct ib_device *ib_dev)
 {
        unsigned long flags;
-       unsigned int port;
+       u32 port;
 
        if (!ib_dev->port_data)
                return;
@@ -2204,7 +2208,7 @@ static void free_netdevs(struct ib_device *ib_dev)
 }
 
 struct net_device *ib_device_get_netdev(struct ib_device *ib_dev,
-                                       unsigned int port)
+                                       u32 port)
 {
        struct ib_port_data *pdata;
        struct net_device *res;
@@ -2291,7 +2295,7 @@ void ib_enum_roce_netdev(struct ib_device *ib_dev,
                         roce_netdev_callback cb,
                         void *cookie)
 {
-       unsigned int port;
+       u32 port;
 
        rdma_for_each_port (ib_dev, port)
                if (rdma_protocol_roce(ib_dev, port)) {
@@ -2369,7 +2373,7 @@ int ib_enum_all_devs(nldev_callback nldev_cb, struct sk_buff *skb,
  * ib_query_pkey() fetches the specified P_Key table entry.
  */
 int ib_query_pkey(struct ib_device *device,
-                 u8 port_num, u16 index, u16 *pkey)
+                 u32 port_num, u16 index, u16 *pkey)
 {
        if (!rdma_is_port_valid(device, port_num))
                return -EINVAL;
@@ -2414,7 +2418,7 @@ EXPORT_SYMBOL(ib_modify_device);
  * @port_modify_mask and @port_modify structure.
  */
 int ib_modify_port(struct ib_device *device,
-                  u8 port_num, int port_modify_mask,
+                  u32 port_num, int port_modify_mask,
                   struct ib_port_modify *port_modify)
 {
        int rc;
@@ -2446,10 +2450,10 @@ EXPORT_SYMBOL(ib_modify_port);
  *   parameter may be NULL.
  */
 int ib_find_gid(struct ib_device *device, union ib_gid *gid,
-               u8 *port_num, u16 *index)
+               u32 *port_num, u16 *index)
 {
        union ib_gid tmp_gid;
-       unsigned int port;
+       u32 port;
        int ret, i;
 
        rdma_for_each_port (device, port) {
@@ -2483,7 +2487,7 @@ EXPORT_SYMBOL(ib_find_gid);
  * @index: The index into the PKey table where the PKey was found.
  */
 int ib_find_pkey(struct ib_device *device,
-                u8 port_num, u16 pkey, u16 *index)
+                u32 port_num, u16 pkey, u16 *index)
 {
        int ret, i;
        u16 tmp_pkey;
@@ -2526,7 +2530,7 @@ EXPORT_SYMBOL(ib_find_pkey);
  *
  */
 struct net_device *ib_get_net_dev_by_params(struct ib_device *dev,
-                                           u8 port,
+                                           u32 port,
                                            u16 pkey,
                                            const union ib_gid *gid,
                                            const struct sockaddr *addr)
@@ -2696,7 +2700,6 @@ void ib_set_device_ops(struct ib_device *dev, const struct ib_device_ops *ops)
        SET_DEVICE_OP(dev_ops, reg_dm_mr);
        SET_DEVICE_OP(dev_ops, reg_user_mr);
        SET_DEVICE_OP(dev_ops, reg_user_mr_dmabuf);
-       SET_DEVICE_OP(dev_ops, req_ncomp_notif);
        SET_DEVICE_OP(dev_ops, req_notify_cq);
        SET_DEVICE_OP(dev_ops, rereg_user_mr);
        SET_DEVICE_OP(dev_ops, resize_cq);
index 30a0ff76b3327576bf050eef3475d0b7956d8b96..932b26f50d0328dcc6d1e52f4277934077598568 100644 (file)
@@ -528,7 +528,8 @@ add_mapping_response_exit:
 }
 
 /* netlink attribute policy for the response to add and query mapping request
- * and response with remote address info */
+ * and response with remote address info
+ */
 static const struct nla_policy resp_query_policy[IWPM_NLA_RQUERY_MAPPING_MAX] = {
        [IWPM_NLA_RQUERY_MAPPING_SEQ]     = { .type = NLA_U32 },
        [IWPM_NLA_RQUERY_LOCAL_ADDR]      = {
index 9355e521d9f4d7fdf40108bc9d1b50cd67b6c894..2081e4854fb026812206ed9461849de3e3ecf940 100644 (file)
@@ -61,7 +61,7 @@ static void create_mad_addr_info(struct ib_mad_send_wr_private *mad_send_wr,
 {
        u16 pkey;
        struct ib_device *dev = qp_info->port_priv->device;
-       u8 pnum = qp_info->port_priv->port_num;
+       u32 pnum = qp_info->port_priv->port_num;
        struct ib_ud_wr *wr = &mad_send_wr->send_wr;
        struct rdma_ah_attr attr = {};
 
@@ -118,7 +118,7 @@ static void ib_mad_send_done(struct ib_cq *cq, struct ib_wc *wc);
  * Assumes ib_mad_port_list_lock is being held
  */
 static inline struct ib_mad_port_private *
-__ib_get_mad_port(struct ib_device *device, int port_num)
+__ib_get_mad_port(struct ib_device *device, u32 port_num)
 {
        struct ib_mad_port_private *entry;
 
@@ -134,7 +134,7 @@ __ib_get_mad_port(struct ib_device *device, int port_num)
  * for a device/port
  */
 static inline struct ib_mad_port_private *
-ib_get_mad_port(struct ib_device *device, int port_num)
+ib_get_mad_port(struct ib_device *device, u32 port_num)
 {
        struct ib_mad_port_private *entry;
        unsigned long flags;
@@ -155,8 +155,7 @@ static inline u8 convert_mgmt_class(u8 mgmt_class)
 
 static int get_spl_qp_index(enum ib_qp_type qp_type)
 {
-       switch (qp_type)
-       {
+       switch (qp_type) {
        case IB_QPT_SMI:
                return 0;
        case IB_QPT_GSI:
@@ -222,7 +221,7 @@ EXPORT_SYMBOL(ib_response_mad);
  * Context: Process context.
  */
 struct ib_mad_agent *ib_register_mad_agent(struct ib_device *device,
-                                          u8 port_num,
+                                          u32 port_num,
                                           enum ib_qp_type qp_type,
                                           struct ib_mad_reg_req *mad_reg_req,
                                           u8 rmpp_version,
@@ -549,7 +548,7 @@ static void dequeue_mad(struct ib_mad_list_head *mad_list)
 }
 
 static void build_smp_wc(struct ib_qp *qp, struct ib_cqe *cqe, u16 slid,
-               u16 pkey_index, u8 port_num, struct ib_wc *wc)
+               u16 pkey_index, u32 port_num, struct ib_wc *wc)
 {
        memset(wc, 0, sizeof *wc);
        wc->wr_cqe = cqe;
@@ -608,7 +607,7 @@ static int handle_outgoing_dr_smp(struct ib_mad_agent_private *mad_agent_priv,
        struct ib_mad_port_private *port_priv;
        struct ib_mad_agent_private *recv_mad_agent = NULL;
        struct ib_device *device = mad_agent_priv->agent.device;
-       u8 port_num;
+       u32 port_num;
        struct ib_wc mad_wc;
        struct ib_ud_wr *send_wr = &mad_send_wr->send_wr;
        size_t mad_size = port_mad_size(mad_agent_priv->qp_info->port_priv);
@@ -707,8 +706,7 @@ static int handle_outgoing_dr_smp(struct ib_mad_agent_private *mad_agent_priv,
                                      (const struct ib_mad *)smp,
                                      (struct ib_mad *)mad_priv->mad, &mad_size,
                                      &out_mad_pkey_index);
-       switch (ret)
-       {
+       switch (ret) {
        case IB_MAD_RESULT_SUCCESS | IB_MAD_RESULT_REPLY:
                if (ib_response_mad((const struct ib_mad_hdr *)mad_priv->mad) &&
                    mad_agent_priv->agent.recv_handler) {
@@ -807,7 +805,7 @@ static int alloc_send_rmpp_list(struct ib_mad_send_wr_private *send_wr,
 
        /* Allocate data segments. */
        for (left = send_buf->data_len + pad; left > 0; left -= seg_size) {
-               seg = kmalloc(sizeof (*seg) + seg_size, gfp_mask);
+               seg = kmalloc(sizeof(*seg) + seg_size, gfp_mask);
                if (!seg) {
                        free_send_rmpp_list(send_wr);
                        return -ENOMEM;
@@ -837,12 +835,11 @@ int ib_mad_kernel_rmpp_agent(const struct ib_mad_agent *agent)
 }
 EXPORT_SYMBOL(ib_mad_kernel_rmpp_agent);
 
-struct ib_mad_send_buf * ib_create_send_mad(struct ib_mad_agent *mad_agent,
-                                           u32 remote_qpn, u16 pkey_index,
-                                           int rmpp_active,
-                                           int hdr_len, int data_len,
-                                           gfp_t gfp_mask,
-                                           u8 base_version)
+struct ib_mad_send_buf *ib_create_send_mad(struct ib_mad_agent *mad_agent,
+                                          u32 remote_qpn, u16 pkey_index,
+                                          int rmpp_active, int hdr_len,
+                                          int data_len, gfp_t gfp_mask,
+                                          u8 base_version)
 {
        struct ib_mad_agent_private *mad_agent_priv;
        struct ib_mad_send_wr_private *mad_send_wr;
@@ -1275,11 +1272,9 @@ static void remove_methods_mad_agent(struct ib_mad_mgmt_method_table *method,
        int i;
 
        /* Remove any methods for this mad agent */
-       for (i = 0; i < IB_MGMT_MAX_METHODS; i++) {
-               if (method->agent[i] == agent) {
+       for (i = 0; i < IB_MGMT_MAX_METHODS; i++)
+               if (method->agent[i] == agent)
                        method->agent[i] = NULL;
-               }
-       }
 }
 
 static int add_nonoui_reg_req(struct ib_mad_reg_req *mad_reg_req,
@@ -1454,9 +1449,8 @@ static void remove_mad_reg_req(struct ib_mad_agent_private *agent_priv)
         * Was MAD registration request supplied
         * with original registration ?
         */
-       if (!agent_priv->reg_req) {
+       if (!agent_priv->reg_req)
                goto out;
-       }
 
        port_priv = agent_priv->qp_info->port_priv;
        mgmt_class = convert_mgmt_class(agent_priv->reg_req->mgmt_class);
@@ -1613,7 +1607,7 @@ out:
 
        if (mad_agent && !mad_agent->agent.recv_handler) {
                dev_notice(&port_priv->device->dev,
-                          "No receive handler for client %p on port %d\n",
+                          "No receive handler for client %p on port %u\n",
                           &mad_agent->agent, port_priv->port_num);
                deref_mad_agent(mad_agent);
                mad_agent = NULL;
@@ -1677,15 +1671,16 @@ static inline int rcv_has_same_class(const struct ib_mad_send_wr_private *wr,
                rwc->recv_buf.mad->mad_hdr.mgmt_class;
 }
 
-static inline int rcv_has_same_gid(const struct ib_mad_agent_private *mad_agent_priv,
-                                  const struct ib_mad_send_wr_private *wr,
-                                  const struct ib_mad_recv_wc *rwc )
+static inline int
+rcv_has_same_gid(const struct ib_mad_agent_private *mad_agent_priv,
+                const struct ib_mad_send_wr_private *wr,
+                const struct ib_mad_recv_wc *rwc)
 {
        struct rdma_ah_attr attr;
        u8 send_resp, rcv_resp;
        union ib_gid sgid;
        struct ib_device *device = mad_agent_priv->agent.device;
-       u8 port_num = mad_agent_priv->agent.port_num;
+       u32 port_num = mad_agent_priv->agent.port_num;
        u8 lmc;
        bool has_grh;
 
@@ -1834,7 +1829,8 @@ static void ib_mad_complete_recv(struct ib_mad_agent_private *mad_agent_priv,
                                deref_mad_agent(mad_agent_priv);
                        } else {
                                /* not user rmpp, revert to normal behavior and
-                                * drop the mad */
+                                * drop the mad
+                                */
                                ib_free_recv_mad(mad_recv_wc);
                                deref_mad_agent(mad_agent_priv);
                                return;
@@ -1860,14 +1856,12 @@ static void ib_mad_complete_recv(struct ib_mad_agent_private *mad_agent_priv,
                                                   mad_recv_wc);
                deref_mad_agent(mad_agent_priv);
        }
-
-       return;
 }
 
 static enum smi_action handle_ib_smi(const struct ib_mad_port_private *port_priv,
                                     const struct ib_mad_qp_info *qp_info,
                                     const struct ib_wc *wc,
-                                    int port_num,
+                                    u32 port_num,
                                     struct ib_mad_private *recv,
                                     struct ib_mad_private *response)
 {
@@ -1954,7 +1948,7 @@ static enum smi_action
 handle_opa_smi(struct ib_mad_port_private *port_priv,
               struct ib_mad_qp_info *qp_info,
               struct ib_wc *wc,
-              int port_num,
+              u32 port_num,
               struct ib_mad_private *recv,
               struct ib_mad_private *response)
 {
@@ -2010,7 +2004,7 @@ static enum smi_action
 handle_smi(struct ib_mad_port_private *port_priv,
           struct ib_mad_qp_info *qp_info,
           struct ib_wc *wc,
-          int port_num,
+          u32 port_num,
           struct ib_mad_private *recv,
           struct ib_mad_private *response,
           bool opa)
@@ -2034,7 +2028,7 @@ static void ib_mad_recv_done(struct ib_cq *cq, struct ib_wc *wc)
        struct ib_mad_private_header *mad_priv_hdr;
        struct ib_mad_private *recv, *response = NULL;
        struct ib_mad_agent_private *mad_agent;
-       int port_num;
+       u32 port_num;
        int ret = IB_MAD_RESULT_SUCCESS;
        size_t mad_size;
        u16 resp_mad_pkey_index = 0;
@@ -2202,9 +2196,10 @@ static void wait_for_response(struct ib_mad_send_wr_private *mad_send_wr)
                                       temp_mad_send_wr->timeout))
                                break;
                }
-       }
-       else
+       } else {
                list_item = &mad_agent_priv->wait_list;
+       }
+
        list_add(&mad_send_wr->agent_list, list_item);
 
        /* Reschedule a work item if we have a shorter timeout */
@@ -2258,7 +2253,7 @@ void ib_mad_complete_send_wr(struct ib_mad_send_wr_private *mad_send_wr,
        adjust_timeout(mad_agent_priv);
        spin_unlock_irqrestore(&mad_agent_priv->lock, flags);
 
-       if (mad_send_wr->status != IB_WC_SUCCESS )
+       if (mad_send_wr->status != IB_WC_SUCCESS)
                mad_send_wc->status = mad_send_wr->status;
        if (ret == IB_RMPP_RESULT_INTERNAL)
                ib_rmpp_send_handler(mad_send_wc);
@@ -2947,7 +2942,7 @@ static void destroy_mad_qp(struct ib_mad_qp_info *qp_info)
  * Create the QP, PD, MR, and CQ if needed
  */
 static int ib_mad_port_open(struct ib_device *device,
-                           int port_num)
+                           u32 port_num)
 {
        int ret, cq_size;
        struct ib_mad_port_private *port_priv;
@@ -3002,7 +2997,7 @@ static int ib_mad_port_open(struct ib_device *device,
        if (ret)
                goto error7;
 
-       snprintf(name, sizeof name, "ib_mad%d", port_num);
+       snprintf(name, sizeof(name), "ib_mad%u", port_num);
        port_priv->wq = alloc_ordered_workqueue(name, WQ_MEM_RECLAIM);
        if (!port_priv->wq) {
                ret = -ENOMEM;
@@ -3048,7 +3043,7 @@ error3:
  * If there are no classes using the port, free the port
  * resources (CQ, MR, PD, QP) and remove the port's info structure
  */
-static int ib_mad_port_close(struct ib_device *device, int port_num)
+static int ib_mad_port_close(struct ib_device *device, u32 port_num)
 {
        struct ib_mad_port_private *port_priv;
        unsigned long flags;
@@ -3057,7 +3052,7 @@ static int ib_mad_port_close(struct ib_device *device, int port_num)
        port_priv = __ib_get_mad_port(device, port_num);
        if (port_priv == NULL) {
                spin_unlock_irqrestore(&ib_mad_port_list_lock, flags);
-               dev_err(&device->dev, "Port %d not found\n", port_num);
+               dev_err(&device->dev, "Port %u not found\n", port_num);
                return -ENODEV;
        }
        list_del_init(&port_priv->port_list);
index e0573e4d04040875c0a011b8368563d5c64c2c3b..8af0619a39cda6fc28bf05eec1e97d3c7d2a0f1f 100644 (file)
@@ -382,8 +382,8 @@ static inline int get_seg_num(struct ib_mad_recv_buf *seg)
        return be32_to_cpu(rmpp_mad->rmpp_hdr.seg_num);
 }
 
-static inline struct ib_mad_recv_buf * get_next_seg(struct list_head *rmpp_list,
-                                                   struct ib_mad_recv_buf *seg)
+static inline struct ib_mad_recv_buf *get_next_seg(struct list_head *rmpp_list,
+                                                  struct ib_mad_recv_buf *seg)
 {
        if (seg->list.next == rmpp_list)
                return NULL;
@@ -396,8 +396,8 @@ static inline int window_size(struct ib_mad_agent_private *agent)
        return max(agent->qp_info->recv_queue.max_active >> 3, 1);
 }
 
-static struct ib_mad_recv_buf * find_seg_location(struct list_head *rmpp_list,
-                                                 int seg_num)
+static struct ib_mad_recv_buf *find_seg_location(struct list_head *rmpp_list,
+                                                int seg_num)
 {
        struct ib_mad_recv_buf *seg_buf;
        int cur_seg_num;
@@ -449,7 +449,7 @@ static inline int get_mad_len(struct mad_rmpp_recv *rmpp_recv)
        return hdr_size + rmpp_recv->seg_num * data_size - pad;
 }
 
-static struct ib_mad_recv_wc * complete_rmpp(struct mad_rmpp_recv *rmpp_recv)
+static struct ib_mad_recv_wc *complete_rmpp(struct mad_rmpp_recv *rmpp_recv)
 {
        struct ib_mad_recv_wc *rmpp_wc;
 
index 57519ca6cd2c79417ae7c718e37f9e4b0d92dad0..a5dd4b7a74bc818d71ba46aafef8953067eb398d 100644 (file)
@@ -63,7 +63,7 @@ struct mcast_port {
        struct rb_root          table;
        atomic_t                refcount;
        struct completion       comp;
-       u                     port_num;
+       u32                     port_num;
 };
 
 struct mcast_device {
@@ -605,7 +605,7 @@ found:
  */
 struct ib_sa_multicast *
 ib_sa_join_multicast(struct ib_sa_client *client,
-                    struct ib_device *device, u8 port_num,
+                    struct ib_device *device, u32 port_num,
                     struct ib_sa_mcmember_rec *rec,
                     ib_sa_comp_mask comp_mask, gfp_t gfp_mask,
                     int (*callback)(int status,
@@ -690,7 +690,7 @@ void ib_sa_free_multicast(struct ib_sa_multicast *multicast)
 }
 EXPORT_SYMBOL(ib_sa_free_multicast);
 
-int ib_sa_get_mcmember_rec(struct ib_device *device, u8 port_num,
+int ib_sa_get_mcmember_rec(struct ib_device *device, u32 port_num,
                           union ib_gid *mgid, struct ib_sa_mcmember_rec *rec)
 {
        struct mcast_device *dev;
@@ -732,7 +732,7 @@ EXPORT_SYMBOL(ib_sa_get_mcmember_rec);
  * success or appropriate error code.
  *
  */
-int ib_init_ah_from_mcmember(struct ib_device *device, u8 port_num,
+int ib_init_ah_from_mcmember(struct ib_device *device, u32 port_num,
                             struct ib_sa_mcmember_rec *rec,
                             struct net_device *ndev,
                             enum ib_gid_type gid_type,
index d306049c22a28067d79230170e7af41735a47abc..34d0cc1a4147ffb921119865aaff959122d6aa63 100644 (file)
@@ -92,7 +92,9 @@ static const struct nla_policy nldev_policy[RDMA_NLDEV_ATTR_MAX] = {
        [RDMA_NLDEV_ATTR_RES_CQE]               = { .type = NLA_U32 },
        [RDMA_NLDEV_ATTR_RES_CQN]               = { .type = NLA_U32 },
        [RDMA_NLDEV_ATTR_RES_CQ_ENTRY]          = { .type = NLA_NESTED },
+       [RDMA_NLDEV_ATTR_RES_CTX]               = { .type = NLA_NESTED },
        [RDMA_NLDEV_ATTR_RES_CTXN]              = { .type = NLA_U32 },
+       [RDMA_NLDEV_ATTR_RES_CTX_ENTRY]         = { .type = NLA_NESTED },
        [RDMA_NLDEV_ATTR_RES_DST_ADDR]          = {
                        .len = sizeof(struct __kernel_sockaddr_storage) },
        [RDMA_NLDEV_ATTR_RES_IOVA]              = { .type = NLA_U64 },
@@ -130,6 +132,11 @@ static const struct nla_policy nldev_policy[RDMA_NLDEV_ATTR_MAX] = {
        [RDMA_NLDEV_ATTR_RES_TYPE]              = { .type = NLA_U8 },
        [RDMA_NLDEV_ATTR_RES_UNSAFE_GLOBAL_RKEY]= { .type = NLA_U32 },
        [RDMA_NLDEV_ATTR_RES_USECNT]            = { .type = NLA_U64 },
+       [RDMA_NLDEV_ATTR_RES_SRQ]               = { .type = NLA_NESTED },
+       [RDMA_NLDEV_ATTR_RES_SRQN]              = { .type = NLA_U32 },
+       [RDMA_NLDEV_ATTR_RES_SRQ_ENTRY]         = { .type = NLA_NESTED },
+       [RDMA_NLDEV_ATTR_MIN_RANGE]             = { .type = NLA_U32 },
+       [RDMA_NLDEV_ATTR_MAX_RANGE]             = { .type = NLA_U32 },
        [RDMA_NLDEV_ATTR_SM_LID]                = { .type = NLA_U32 },
        [RDMA_NLDEV_ATTR_SUBNET_PREFIX]         = { .type = NLA_U64 },
        [RDMA_NLDEV_ATTR_STAT_AUTO_MODE_MASK]   = { .type = NLA_U32 },
@@ -146,6 +153,7 @@ static const struct nla_policy nldev_policy[RDMA_NLDEV_ATTR_MAX] = {
        [RDMA_NLDEV_ATTR_UVERBS_DRIVER_ID]      = { .type = NLA_U32 },
        [RDMA_NLDEV_NET_NS_FD]                  = { .type = NLA_U32 },
        [RDMA_NLDEV_SYS_ATTR_NETNS_MODE]        = { .type = NLA_U8 },
+       [RDMA_NLDEV_SYS_ATTR_COPY_ON_FORK]      = { .type = NLA_U8 },
 };
 
 static int put_driver_name_print_type(struct sk_buff *msg, const char *name,
@@ -242,7 +250,7 @@ static int fill_dev_info(struct sk_buff *msg, struct ib_device *device)
 {
        char fw[IB_FW_VERSION_NAME_MAX];
        int ret = 0;
-       u8 port;
+       u32 port;
 
        if (fill_nldev_handle(msg, device))
                return -EMSGSIZE;
@@ -385,6 +393,7 @@ static int fill_res_info(struct sk_buff *msg, struct ib_device *device)
                [RDMA_RESTRACK_CM_ID] = "cm_id",
                [RDMA_RESTRACK_MR] = "mr",
                [RDMA_RESTRACK_CTX] = "ctx",
+               [RDMA_RESTRACK_SRQ] = "srq",
        };
 
        struct nlattr *table_attr;
@@ -703,6 +712,135 @@ static int fill_res_pd_entry(struct sk_buff *msg, bool has_cap_net_admin,
 err:   return -EMSGSIZE;
 }
 
+static int fill_res_ctx_entry(struct sk_buff *msg, bool has_cap_net_admin,
+                             struct rdma_restrack_entry *res, uint32_t port)
+{
+       struct ib_ucontext *ctx = container_of(res, struct ib_ucontext, res);
+
+       if (rdma_is_kernel_res(res))
+               return 0;
+
+       if (nla_put_u32(msg, RDMA_NLDEV_ATTR_RES_CTXN, ctx->res.id))
+               return -EMSGSIZE;
+
+       return fill_res_name_pid(msg, res);
+}
+
+static int fill_res_range_qp_entry(struct sk_buff *msg, uint32_t min_range,
+                                  uint32_t max_range)
+{
+       struct nlattr *entry_attr;
+
+       if (!min_range)
+               return 0;
+
+       entry_attr = nla_nest_start(msg, RDMA_NLDEV_ATTR_RES_QP_ENTRY);
+       if (!entry_attr)
+               return -EMSGSIZE;
+
+       if (min_range == max_range) {
+               if (nla_put_u32(msg, RDMA_NLDEV_ATTR_RES_LQPN, min_range))
+                       goto err;
+       } else {
+               if (nla_put_u32(msg, RDMA_NLDEV_ATTR_MIN_RANGE, min_range))
+                       goto err;
+               if (nla_put_u32(msg, RDMA_NLDEV_ATTR_MAX_RANGE, max_range))
+                       goto err;
+       }
+       nla_nest_end(msg, entry_attr);
+       return 0;
+
+err:
+       nla_nest_cancel(msg, entry_attr);
+       return -EMSGSIZE;
+}
+
+static int fill_res_srq_qps(struct sk_buff *msg, struct ib_srq *srq)
+{
+       uint32_t min_range = 0, prev = 0;
+       struct rdma_restrack_entry *res;
+       struct rdma_restrack_root *rt;
+       struct nlattr *table_attr;
+       struct ib_qp *qp = NULL;
+       unsigned long id = 0;
+
+       table_attr = nla_nest_start(msg, RDMA_NLDEV_ATTR_RES_QP);
+       if (!table_attr)
+               return -EMSGSIZE;
+
+       rt = &srq->device->res[RDMA_RESTRACK_QP];
+       xa_lock(&rt->xa);
+       xa_for_each(&rt->xa, id, res) {
+               if (!rdma_restrack_get(res))
+                       continue;
+
+               qp = container_of(res, struct ib_qp, res);
+               if (!qp->srq || (qp->srq->res.id != srq->res.id)) {
+                       rdma_restrack_put(res);
+                       continue;
+               }
+
+               if (qp->qp_num < prev)
+                       /* qp_num should be ascending */
+                       goto err_loop;
+
+               if (min_range == 0) {
+                       min_range = qp->qp_num;
+               } else if (qp->qp_num > (prev + 1)) {
+                       if (fill_res_range_qp_entry(msg, min_range, prev))
+                               goto err_loop;
+
+                       min_range = qp->qp_num;
+               }
+               prev = qp->qp_num;
+               rdma_restrack_put(res);
+       }
+
+       xa_unlock(&rt->xa);
+
+       if (fill_res_range_qp_entry(msg, min_range, prev))
+               goto err;
+
+       nla_nest_end(msg, table_attr);
+       return 0;
+
+err_loop:
+       rdma_restrack_put(res);
+       xa_unlock(&rt->xa);
+err:
+       nla_nest_cancel(msg, table_attr);
+       return -EMSGSIZE;
+}
+
+static int fill_res_srq_entry(struct sk_buff *msg, bool has_cap_net_admin,
+                             struct rdma_restrack_entry *res, uint32_t port)
+{
+       struct ib_srq *srq = container_of(res, struct ib_srq, res);
+
+       if (nla_put_u32(msg, RDMA_NLDEV_ATTR_RES_SRQN, srq->res.id))
+               goto err;
+
+       if (nla_put_u8(msg, RDMA_NLDEV_ATTR_RES_TYPE, srq->srq_type))
+               goto err;
+
+       if (nla_put_u32(msg, RDMA_NLDEV_ATTR_RES_PDN, srq->pd->res.id))
+               goto err;
+
+       if (ib_srq_has_cq(srq->srq_type)) {
+               if (nla_put_u32(msg, RDMA_NLDEV_ATTR_RES_CQN,
+                               srq->ext.cq->res.id))
+                       goto err;
+       }
+
+       if (fill_res_srq_qps(msg, srq))
+               goto err;
+
+       return fill_res_name_pid(msg, res);
+
+err:
+       return -EMSGSIZE;
+}
+
 static int fill_stat_counter_mode(struct sk_buff *msg,
                                  struct rdma_counter *counter)
 {
@@ -1236,6 +1374,19 @@ static const struct nldev_fill_res_entry fill_entries[RDMA_RESTRACK_MAX] = {
                .entry = RDMA_NLDEV_ATTR_STAT_COUNTER_ENTRY,
                .id = RDMA_NLDEV_ATTR_STAT_COUNTER_ID,
        },
+       [RDMA_RESTRACK_CTX] = {
+               .nldev_attr = RDMA_NLDEV_ATTR_RES_CTX,
+               .flags = NLDEV_PER_DEV,
+               .entry = RDMA_NLDEV_ATTR_RES_CTX_ENTRY,
+               .id = RDMA_NLDEV_ATTR_RES_CTXN,
+       },
+       [RDMA_RESTRACK_SRQ] = {
+               .nldev_attr = RDMA_NLDEV_ATTR_RES_SRQ,
+               .flags = NLDEV_PER_DEV,
+               .entry = RDMA_NLDEV_ATTR_RES_SRQ_ENTRY,
+               .id = RDMA_NLDEV_ATTR_RES_SRQN,
+       },
+
 };
 
 static int res_get_common_doit(struct sk_buff *skb, struct nlmsghdr *nlh,
@@ -1476,6 +1627,8 @@ RES_GET_FUNCS(pd, RDMA_RESTRACK_PD);
 RES_GET_FUNCS(mr, RDMA_RESTRACK_MR);
 RES_GET_FUNCS(mr_raw, RDMA_RESTRACK_MR);
 RES_GET_FUNCS(counter, RDMA_RESTRACK_COUNTER);
+RES_GET_FUNCS(ctx, RDMA_RESTRACK_CTX);
+RES_GET_FUNCS(srq, RDMA_RESTRACK_SRQ);
 
 static LIST_HEAD(link_ops);
 static DECLARE_RWSEM(link_ops_rwsem);
@@ -1697,6 +1850,19 @@ static int nldev_sys_get_doit(struct sk_buff *skb, struct nlmsghdr *nlh,
                nlmsg_free(msg);
                return err;
        }
+
+       /*
+        * Copy-on-fork is supported.
+        * See commits:
+        * 70e806e4e645 ("mm: Do early cow for pinned pages during fork() for ptes")
+        * 4eae4efa2c29 ("hugetlb: do early cow when page pinned on src mm")
+        * for more details. Don't backport this without them.
+        *
+        * Return value ignored on purpose, assume copy-on-fork is not
+        * supported in case of failure.
+        */
+       nla_put_u8(msg, RDMA_NLDEV_SYS_ATTR_COPY_ON_FORK, 1);
+
        nlmsg_end(msg, nlh);
        return rdma_nl_unicast(sock_net(skb->sk), msg, NETLINK_CB(skb).portid);
 }
@@ -2139,6 +2305,14 @@ static const struct rdma_nl_cbs nldev_cb_table[RDMA_NLDEV_NUM_OPS] = {
                .doit = nldev_res_get_pd_doit,
                .dump = nldev_res_get_pd_dumpit,
        },
+       [RDMA_NLDEV_CMD_RES_CTX_GET] = {
+               .doit = nldev_res_get_ctx_doit,
+               .dump = nldev_res_get_ctx_dumpit,
+       },
+       [RDMA_NLDEV_CMD_RES_SRQ_GET] = {
+               .doit = nldev_res_get_srq_doit,
+               .dump = nldev_res_get_srq_dumpit,
+       },
        [RDMA_NLDEV_CMD_SYS_GET] = {
                .doit = nldev_sys_get_doit,
        },
index af4879bdf3d6e786a08c093476fea241306e4d1c..64e2822af70fc7c2b4ac5e15c4275e1fd63cddb1 100644 (file)
 #include "smi.h"
 
 enum smi_action opa_smi_handle_dr_smp_recv(struct opa_smp *smp, bool is_switch,
-                                      int port_num, int phys_port_cnt);
+                                      u32 port_num, int phys_port_cnt);
 int opa_smi_get_fwd_port(struct opa_smp *smp);
 extern enum smi_forward_action opa_smi_check_forward_dr_smp(struct opa_smp *smp);
 extern enum smi_action opa_smi_handle_dr_smp_send(struct opa_smp *smp,
-                                             bool is_switch, int port_num);
+                                             bool is_switch, u32 port_num);
 
 /*
  * Return IB_SMI_HANDLE if the SMP should be handled by the local SMA/SM
index 75eafd9208aa346e3c30ea350cda3298b04d5a39..94d83b665a2fe00796bde088d712a6c2c5fd51ac 100644 (file)
@@ -112,7 +112,7 @@ static void assert_uverbs_usecnt(struct ib_uobject *uobj,
  * however the type's allocat_commit function cannot have been called and the
  * uobject cannot be on the uobjects_lists
  *
- * For RDMA_REMOVE_DESTROY the caller shold be holding a kref (eg via
+ * For RDMA_REMOVE_DESTROY the caller should be holding a kref (eg via
  * rdma_lookup_get_uobject) and the object is left in a state where the caller
  * needs to call rdma_lookup_put_uobject.
  *
@@ -916,7 +916,7 @@ static int __uverbs_cleanup_ufile(struct ib_uverbs_file *ufile,
 }
 
 /*
- * Destroy the uncontext and every uobject associated with it.
+ * Destroy the ucontext and every uobject associated with it.
  *
  * This is internally locked and can be called in parallel from multiple
  * contexts.
index ffabaf3272429ee78d2f5171e7c8f3f5eac6eb95..033207882c82ce6b269d1570f99f5a28c98d33eb 100644 (file)
@@ -47,6 +47,7 @@ static const char *type2str(enum rdma_restrack_type type)
                [RDMA_RESTRACK_MR] = "MR",
                [RDMA_RESTRACK_CTX] = "CTX",
                [RDMA_RESTRACK_COUNTER] = "COUNTER",
+               [RDMA_RESTRACK_SRQ] = "SRQ",
        };
 
        return names[type];
@@ -141,6 +142,8 @@ static struct ib_device *res_to_dev(struct rdma_restrack_entry *res)
                return container_of(res, struct ib_ucontext, res)->device;
        case RDMA_RESTRACK_COUNTER:
                return container_of(res, struct rdma_counter, res)->device;
+       case RDMA_RESTRACK_SRQ:
+               return container_of(res, struct ib_srq, res)->device;
        default:
                WARN_ONCE(true, "Wrong resource tracking type %u\n", res->type);
                return NULL;
index 34fff94eaa382301060020785db5388bb282b1e1..7b638d91a4ec2aecc05ac9f384180f4d04df4753 100644 (file)
@@ -70,7 +70,7 @@ struct netdev_event_work {
 };
 
 static const struct {
-       bool (*is_supported)(const struct ib_device *device, u8 port_num);
+       bool (*is_supported)(const struct ib_device *device, u32 port_num);
        enum ib_gid_type gid_type;
 } PORT_CAP_TO_GID_TYPE[] = {
        {rdma_protocol_roce_eth_encap, IB_GID_TYPE_ROCE},
@@ -79,7 +79,7 @@ static const struct {
 
 #define CAP_TO_GID_TABLE_SIZE  ARRAY_SIZE(PORT_CAP_TO_GID_TYPE)
 
-unsigned long roce_gid_type_mask_support(struct ib_device *ib_dev, u8 port)
+unsigned long roce_gid_type_mask_support(struct ib_device *ib_dev, u32 port)
 {
        int i;
        unsigned int ret_flags = 0;
@@ -96,7 +96,7 @@ unsigned long roce_gid_type_mask_support(struct ib_device *ib_dev, u8 port)
 EXPORT_SYMBOL(roce_gid_type_mask_support);
 
 static void update_gid(enum gid_op_type gid_op, struct ib_device *ib_dev,
-                      u8 port, union ib_gid *gid,
+                      u32 port, union ib_gid *gid,
                       struct ib_gid_attr *gid_attr)
 {
        int i;
@@ -144,7 +144,7 @@ static enum bonding_slave_state is_eth_active_slave_of_bonding_rcu(struct net_de
 #define REQUIRED_BOND_STATES           (BONDING_SLAVE_STATE_ACTIVE |   \
                                         BONDING_SLAVE_STATE_NA)
 static bool
-is_eth_port_of_netdev_filter(struct ib_device *ib_dev, u8 port,
+is_eth_port_of_netdev_filter(struct ib_device *ib_dev, u32 port,
                             struct net_device *rdma_ndev, void *cookie)
 {
        struct net_device *real_dev;
@@ -168,7 +168,7 @@ is_eth_port_of_netdev_filter(struct ib_device *ib_dev, u8 port,
 }
 
 static bool
-is_eth_port_inactive_slave_filter(struct ib_device *ib_dev, u8 port,
+is_eth_port_inactive_slave_filter(struct ib_device *ib_dev, u32 port,
                                  struct net_device *rdma_ndev, void *cookie)
 {
        struct net_device *master_dev;
@@ -197,7 +197,7 @@ is_eth_port_inactive_slave_filter(struct ib_device *ib_dev, u8 port,
  * considered for deriving default RoCE GID, returns false otherwise.
  */
 static bool
-is_ndev_for_default_gid_filter(struct ib_device *ib_dev, u8 port,
+is_ndev_for_default_gid_filter(struct ib_device *ib_dev, u32 port,
                               struct net_device *rdma_ndev, void *cookie)
 {
        struct net_device *cookie_ndev = cookie;
@@ -223,13 +223,13 @@ is_ndev_for_default_gid_filter(struct ib_device *ib_dev, u8 port,
        return res;
 }
 
-static bool pass_all_filter(struct ib_device *ib_dev, u8 port,
+static bool pass_all_filter(struct ib_device *ib_dev, u32 port,
                            struct net_device *rdma_ndev, void *cookie)
 {
        return true;
 }
 
-static bool upper_device_filter(struct ib_device *ib_dev, u8 port,
+static bool upper_device_filter(struct ib_device *ib_dev, u32 port,
                                struct net_device *rdma_ndev, void *cookie)
 {
        bool res;
@@ -260,7 +260,7 @@ static bool upper_device_filter(struct ib_device *ib_dev, u8 port,
  * not have been established as slave device yet.
  */
 static bool
-is_upper_ndev_bond_master_filter(struct ib_device *ib_dev, u8 port,
+is_upper_ndev_bond_master_filter(struct ib_device *ib_dev, u32 port,
                                 struct net_device *rdma_ndev,
                                 void *cookie)
 {
@@ -280,7 +280,7 @@ is_upper_ndev_bond_master_filter(struct ib_device *ib_dev, u8 port,
 
 static void update_gid_ip(enum gid_op_type gid_op,
                          struct ib_device *ib_dev,
-                         u8 port, struct net_device *ndev,
+                         u32 port, struct net_device *ndev,
                          struct sockaddr *addr)
 {
        union ib_gid gid;
@@ -294,7 +294,7 @@ static void update_gid_ip(enum gid_op_type gid_op,
 }
 
 static void bond_delete_netdev_default_gids(struct ib_device *ib_dev,
-                                           u8 port,
+                                           u32 port,
                                            struct net_device *rdma_ndev,
                                            struct net_device *event_ndev)
 {
@@ -328,7 +328,7 @@ static void bond_delete_netdev_default_gids(struct ib_device *ib_dev,
 }
 
 static void enum_netdev_ipv4_ips(struct ib_device *ib_dev,
-                                u8 port, struct net_device *ndev)
+                                u32 port, struct net_device *ndev)
 {
        const struct in_ifaddr *ifa;
        struct in_device *in_dev;
@@ -372,7 +372,7 @@ static void enum_netdev_ipv4_ips(struct ib_device *ib_dev,
 }
 
 static void enum_netdev_ipv6_ips(struct ib_device *ib_dev,
-                                u8 port, struct net_device *ndev)
+                                u32 port, struct net_device *ndev)
 {
        struct inet6_ifaddr *ifp;
        struct inet6_dev *in6_dev;
@@ -417,7 +417,7 @@ static void enum_netdev_ipv6_ips(struct ib_device *ib_dev,
        }
 }
 
-static void _add_netdev_ips(struct ib_device *ib_dev, u8 port,
+static void _add_netdev_ips(struct ib_device *ib_dev, u32 port,
                            struct net_device *ndev)
 {
        enum_netdev_ipv4_ips(ib_dev, port, ndev);
@@ -425,13 +425,13 @@ static void _add_netdev_ips(struct ib_device *ib_dev, u8 port,
                enum_netdev_ipv6_ips(ib_dev, port, ndev);
 }
 
-static void add_netdev_ips(struct ib_device *ib_dev, u8 port,
+static void add_netdev_ips(struct ib_device *ib_dev, u32 port,
                           struct net_device *rdma_ndev, void *cookie)
 {
        _add_netdev_ips(ib_dev, port, cookie);
 }
 
-static void del_netdev_ips(struct ib_device *ib_dev, u8 port,
+static void del_netdev_ips(struct ib_device *ib_dev, u32 port,
                           struct net_device *rdma_ndev, void *cookie)
 {
        ib_cache_gid_del_all_netdev_gids(ib_dev, port, cookie);
@@ -446,7 +446,7 @@ static void del_netdev_ips(struct ib_device *ib_dev, u8 port,
  *
  * del_default_gids() deletes the default GIDs of the event/cookie netdevice.
  */
-static void del_default_gids(struct ib_device *ib_dev, u8 port,
+static void del_default_gids(struct ib_device *ib_dev, u32 port,
                             struct net_device *rdma_ndev, void *cookie)
 {
        struct net_device *cookie_ndev = cookie;
@@ -458,7 +458,7 @@ static void del_default_gids(struct ib_device *ib_dev, u8 port,
                                     IB_CACHE_GID_DEFAULT_MODE_DELETE);
 }
 
-static void add_default_gids(struct ib_device *ib_dev, u8 port,
+static void add_default_gids(struct ib_device *ib_dev, u32 port,
                             struct net_device *rdma_ndev, void *cookie)
 {
        struct net_device *event_ndev = cookie;
@@ -470,7 +470,7 @@ static void add_default_gids(struct ib_device *ib_dev, u8 port,
 }
 
 static void enum_all_gids_of_dev_cb(struct ib_device *ib_dev,
-                                   u8 port,
+                                   u32 port,
                                    struct net_device *rdma_ndev,
                                    void *cookie)
 {
@@ -515,7 +515,7 @@ void rdma_roce_rescan_device(struct ib_device *ib_dev)
 EXPORT_SYMBOL(rdma_roce_rescan_device);
 
 static void callback_for_addr_gid_device_scan(struct ib_device *device,
-                                             u8 port,
+                                             u32 port,
                                              struct net_device *rdma_ndev,
                                              void *cookie)
 {
@@ -547,10 +547,10 @@ static int netdev_upper_walk(struct net_device *upper,
        return 0;
 }
 
-static void handle_netdev_upper(struct ib_device *ib_dev, u8 port,
+static void handle_netdev_upper(struct ib_device *ib_dev, u32 port,
                                void *cookie,
                                void (*handle_netdev)(struct ib_device *ib_dev,
-                                                     u8 port,
+                                                     u32 port,
                                                      struct net_device *ndev))
 {
        struct net_device *ndev = cookie;
@@ -574,25 +574,25 @@ static void handle_netdev_upper(struct ib_device *ib_dev, u8 port,
        }
 }
 
-static void _roce_del_all_netdev_gids(struct ib_device *ib_dev, u8 port,
+static void _roce_del_all_netdev_gids(struct ib_device *ib_dev, u32 port,
                                      struct net_device *event_ndev)
 {
        ib_cache_gid_del_all_netdev_gids(ib_dev, port, event_ndev);
 }
 
-static void del_netdev_upper_ips(struct ib_device *ib_dev, u8 port,
+static void del_netdev_upper_ips(struct ib_device *ib_dev, u32 port,
                                 struct net_device *rdma_ndev, void *cookie)
 {
        handle_netdev_upper(ib_dev, port, cookie, _roce_del_all_netdev_gids);
 }
 
-static void add_netdev_upper_ips(struct ib_device *ib_dev, u8 port,
+static void add_netdev_upper_ips(struct ib_device *ib_dev, u32 port,
                                 struct net_device *rdma_ndev, void *cookie)
 {
        handle_netdev_upper(ib_dev, port, cookie, _add_netdev_ips);
 }
 
-static void del_netdev_default_ips_join(struct ib_device *ib_dev, u8 port,
+static void del_netdev_default_ips_join(struct ib_device *ib_dev, u32 port,
                                        struct net_device *rdma_ndev,
                                        void *cookie)
 {
index 31156e22d3e7ef27d6c7025d187fa58afa26d6c9..a588c20384797b6f0e96624d495f883c825adb81 100644 (file)
@@ -25,7 +25,7 @@ MODULE_PARM_DESC(force_mr, "Force usage of MRs for RDMA READ/WRITE operations");
  * registration is also enabled if registering memory might yield better
  * performance than using multiple SGE entries, see rdma_rw_io_needs_mr()
  */
-static inline bool rdma_rw_can_use_mr(struct ib_device *dev, u8 port_num)
+static inline bool rdma_rw_can_use_mr(struct ib_device *dev, u32 port_num)
 {
        if (rdma_protocol_iwarp(dev, port_num))
                return true;
@@ -42,7 +42,7 @@ static inline bool rdma_rw_can_use_mr(struct ib_device *dev, u8 port_num)
  * optimization otherwise.  Additionally we have a debug option to force usage
  * of MRs to help testing this code path.
  */
-static inline bool rdma_rw_io_needs_mr(struct ib_device *dev, u8 port_num,
+static inline bool rdma_rw_io_needs_mr(struct ib_device *dev, u32 port_num,
                enum dma_data_direction dir, int dma_nents)
 {
        if (dir == DMA_FROM_DEVICE) {
@@ -87,7 +87,7 @@ static inline int rdma_rw_inv_key(struct rdma_rw_reg_ctx *reg)
 }
 
 /* Caller must have zero-initialized *reg. */
-static int rdma_rw_init_one_mr(struct ib_qp *qp, u8 port_num,
+static int rdma_rw_init_one_mr(struct ib_qp *qp, u32 port_num,
                struct rdma_rw_reg_ctx *reg, struct scatterlist *sg,
                u32 sg_cnt, u32 offset)
 {
@@ -121,7 +121,7 @@ static int rdma_rw_init_one_mr(struct ib_qp *qp, u8 port_num,
 }
 
 static int rdma_rw_init_mr_wrs(struct rdma_rw_ctx *ctx, struct ib_qp *qp,
-               u8 port_num, struct scatterlist *sg, u32 sg_cnt, u32 offset,
+               u32 port_num, struct scatterlist *sg, u32 sg_cnt, u32 offset,
                u64 remote_addr, u32 rkey, enum dma_data_direction dir)
 {
        struct rdma_rw_reg_ctx *prev = NULL;
@@ -308,7 +308,7 @@ static int rdma_rw_map_sg(struct ib_device *dev, struct scatterlist *sg,
  * Returns the number of WQEs that will be needed on the workqueue if
  * successful, or a negative error code.
  */
-int rdma_rw_ctx_init(struct rdma_rw_ctx *ctx, struct ib_qp *qp, u8 port_num,
+int rdma_rw_ctx_init(struct rdma_rw_ctx *ctx, struct ib_qp *qp, u32 port_num,
                struct scatterlist *sg, u32 sg_cnt, u32 sg_offset,
                u64 remote_addr, u32 rkey, enum dma_data_direction dir)
 {
@@ -377,7 +377,7 @@ EXPORT_SYMBOL(rdma_rw_ctx_init);
  * successful, or a negative error code.
  */
 int rdma_rw_ctx_signature_init(struct rdma_rw_ctx *ctx, struct ib_qp *qp,
-               u8 port_num, struct scatterlist *sg, u32 sg_cnt,
+               u32 port_num, struct scatterlist *sg, u32 sg_cnt,
                struct scatterlist *prot_sg, u32 prot_sg_cnt,
                struct ib_sig_attrs *sig_attrs,
                u64 remote_addr, u32 rkey, enum dma_data_direction dir)
@@ -505,7 +505,7 @@ static void rdma_rw_update_lkey(struct rdma_rw_reg_ctx *reg, bool need_inval)
  * completion notification.
  */
 struct ib_send_wr *rdma_rw_ctx_wrs(struct rdma_rw_ctx *ctx, struct ib_qp *qp,
-               u8 port_num, struct ib_cqe *cqe, struct ib_send_wr *chain_wr)
+               u32 port_num, struct ib_cqe *cqe, struct ib_send_wr *chain_wr)
 {
        struct ib_send_wr *first_wr, *last_wr;
        int i;
@@ -562,7 +562,7 @@ EXPORT_SYMBOL(rdma_rw_ctx_wrs);
  * is not set @cqe must be set so that the caller gets a completion
  * notification.
  */
-int rdma_rw_ctx_post(struct rdma_rw_ctx *ctx, struct ib_qp *qp, u8 port_num,
+int rdma_rw_ctx_post(struct rdma_rw_ctx *ctx, struct ib_qp *qp, u32 port_num,
                struct ib_cqe *cqe, struct ib_send_wr *chain_wr)
 {
        struct ib_send_wr *first_wr;
@@ -581,8 +581,9 @@ EXPORT_SYMBOL(rdma_rw_ctx_post);
  * @sg_cnt:    number of entries in @sg
  * @dir:       %DMA_TO_DEVICE for RDMA WRITE, %DMA_FROM_DEVICE for RDMA READ
  */
-void rdma_rw_ctx_destroy(struct rdma_rw_ctx *ctx, struct ib_qp *qp, u8 port_num,
-               struct scatterlist *sg, u32 sg_cnt, enum dma_data_direction dir)
+void rdma_rw_ctx_destroy(struct rdma_rw_ctx *ctx, struct ib_qp *qp,
+                        u32 port_num, struct scatterlist *sg, u32 sg_cnt,
+                        enum dma_data_direction dir)
 {
        int i;
 
@@ -620,7 +621,7 @@ EXPORT_SYMBOL(rdma_rw_ctx_destroy);
  * @dir:       %DMA_TO_DEVICE for RDMA WRITE, %DMA_FROM_DEVICE for RDMA READ
  */
 void rdma_rw_ctx_destroy_signature(struct rdma_rw_ctx *ctx, struct ib_qp *qp,
-               u8 port_num, struct scatterlist *sg, u32 sg_cnt,
+               u32 port_num, struct scatterlist *sg, u32 sg_cnt,
                struct scatterlist *prot_sg, u32 prot_sg_cnt,
                enum dma_data_direction dir)
 {
@@ -647,7 +648,7 @@ EXPORT_SYMBOL(rdma_rw_ctx_destroy_signature);
  * compute max_rdma_ctxts and the size of the transport's Send and
  * Send Completion Queues.
  */
-unsigned int rdma_rw_mr_factor(struct ib_device *device, u8 port_num,
+unsigned int rdma_rw_mr_factor(struct ib_device *device, u32 port_num,
                               unsigned int maxpages)
 {
        unsigned int mr_pages;
index cbaaaa92fff384eddf04ea2d05a0eca76ede688f..143de37ae598ed7114907078fd13fd555dfd053d 100644 (file)
@@ -49,7 +49,7 @@ static inline void ib_sa_client_put(struct ib_sa_client *client)
 }
 
 int ib_sa_mcmember_rec_query(struct ib_sa_client *client,
-                            struct ib_device *device, u8 port_num, u8 method,
+                            struct ib_device *device, u32 port_num, u8 method,
                             struct ib_sa_mcmember_rec *rec,
                             ib_sa_comp_mask comp_mask,
                             unsigned long timeout_ms, gfp_t gfp_mask,
index 9ef1a355131b34de9429311ecb5c31ed6fe5c381..8f1705c403b41bc69ca0b918eb7748a682b9eb90 100644 (file)
@@ -95,7 +95,7 @@ struct ib_sa_port {
        struct delayed_work ib_cpi_work;
        spinlock_t                   classport_lock; /* protects class port info set */
        spinlock_t           ah_lock;
-       u                  port_num;
+       u32                  port_num;
 };
 
 struct ib_sa_device {
@@ -1194,7 +1194,7 @@ void ib_sa_cancel_query(int id, struct ib_sa_query *query)
 }
 EXPORT_SYMBOL(ib_sa_cancel_query);
 
-static u8 get_src_path_mask(struct ib_device *device, u8 port_num)
+static u8 get_src_path_mask(struct ib_device *device, u32 port_num)
 {
        struct ib_sa_device *sa_dev;
        struct ib_sa_port   *port;
@@ -1213,7 +1213,7 @@ static u8 get_src_path_mask(struct ib_device *device, u8 port_num)
        return src_path_mask;
 }
 
-static int init_ah_attr_grh_fields(struct ib_device *device, u8 port_num,
+static int init_ah_attr_grh_fields(struct ib_device *device, u32 port_num,
                                   struct sa_path_rec *rec,
                                   struct rdma_ah_attr *ah_attr,
                                   const struct ib_gid_attr *gid_attr)
@@ -1251,7 +1251,7 @@ static int init_ah_attr_grh_fields(struct ib_device *device, u8 port_num,
  * User must invoke rdma_destroy_ah_attr() to release reference to SGID
  * attributes which are initialized using ib_init_ah_attr_from_path().
  */
-int ib_init_ah_attr_from_path(struct ib_device *device, u8 port_num,
+int ib_init_ah_attr_from_path(struct ib_device *device, u32 port_num,
                              struct sa_path_rec *rec,
                              struct rdma_ah_attr *ah_attr,
                              const struct ib_gid_attr *gid_attr)
@@ -1409,7 +1409,7 @@ EXPORT_SYMBOL(ib_sa_pack_path);
 
 static bool ib_sa_opa_pathrecord_support(struct ib_sa_client *client,
                                         struct ib_sa_device *sa_dev,
-                                        u8 port_num)
+                                        u32 port_num)
 {
        struct ib_sa_port *port;
        unsigned long flags;
@@ -1444,7 +1444,7 @@ enum opa_pr_supported {
  */
 static int opa_pr_query_possible(struct ib_sa_client *client,
                                 struct ib_sa_device *sa_dev,
-                                struct ib_device *device, u8 port_num,
+                                struct ib_device *device, u32 port_num,
                                 struct sa_path_rec *rec)
 {
        struct ib_port_attr port_attr;
@@ -1533,7 +1533,7 @@ static void ib_sa_path_rec_release(struct ib_sa_query *sa_query)
  * the query.
  */
 int ib_sa_path_rec_get(struct ib_sa_client *client,
-                      struct ib_device *device, u8 port_num,
+                      struct ib_device *device, u32 port_num,
                       struct sa_path_rec *rec,
                       ib_sa_comp_mask comp_mask,
                       unsigned long timeout_ms, gfp_t gfp_mask,
@@ -1688,7 +1688,7 @@ static void ib_sa_service_rec_release(struct ib_sa_query *sa_query)
  * the query.
  */
 int ib_sa_service_rec_query(struct ib_sa_client *client,
-                           struct ib_device *device, u8 port_num, u8 method,
+                           struct ib_device *device, u32 port_num, u8 method,
                            struct ib_sa_service_rec *rec,
                            ib_sa_comp_mask comp_mask,
                            unsigned long timeout_ms, gfp_t gfp_mask,
@@ -1784,7 +1784,7 @@ static void ib_sa_mcmember_rec_release(struct ib_sa_query *sa_query)
 }
 
 int ib_sa_mcmember_rec_query(struct ib_sa_client *client,
-                            struct ib_device *device, u8 port_num,
+                            struct ib_device *device, u32 port_num,
                             u8 method,
                             struct ib_sa_mcmember_rec *rec,
                             ib_sa_comp_mask comp_mask,
@@ -1876,7 +1876,7 @@ static void ib_sa_guidinfo_rec_release(struct ib_sa_query *sa_query)
 }
 
 int ib_sa_guid_info_rec_query(struct ib_sa_client *client,
-                             struct ib_device *device, u8 port_num,
+                             struct ib_device *device, u32 port_num,
                              struct ib_sa_guidinfo_rec *rec,
                              ib_sa_comp_mask comp_mask, u8 method,
                              unsigned long timeout_ms, gfp_t gfp_mask,
@@ -2265,7 +2265,7 @@ static void ib_sa_event(struct ib_event_handler *handler,
                unsigned long flags;
                struct ib_sa_device *sa_dev =
                        container_of(handler, typeof(*sa_dev), event_handler);
-               u8 port_num = event->element.port_num - sa_dev->start_port;
+               u32 port_num = event->element.port_num - sa_dev->start_port;
                struct ib_sa_port *port = &sa_dev->port[port_num];
 
                if (!rdma_cap_ib_sa(handler->device, port->port_num))
index 75e7ec017836104470c63a6dc7af70246840a352..e5a78d1a63c9c59b18f1b2b161b715754d395355 100644 (file)
@@ -193,7 +193,7 @@ static void qp_to_error(struct ib_qp_security *sec)
 
 static inline void check_pkey_qps(struct pkey_index_qp_list *pkey,
                                  struct ib_device *device,
-                                 u8 port_num,
+                                 u32 port_num,
                                  u64 subnet_prefix)
 {
        struct ib_port_pkey *pp, *tmp_pp;
@@ -245,7 +245,7 @@ static int port_pkey_list_insert(struct ib_port_pkey *pp)
        struct pkey_index_qp_list *tmp_pkey;
        struct pkey_index_qp_list *pkey;
        struct ib_device *dev;
-       u8 port_num = pp->port_num;
+       u32 port_num = pp->port_num;
        int ret = 0;
 
        if (pp->state != IB_PORT_PKEY_VALID)
@@ -538,7 +538,7 @@ void ib_destroy_qp_security_end(struct ib_qp_security *sec)
 }
 
 void ib_security_cache_change(struct ib_device *device,
-                             u8 port_num,
+                             u32 port_num,
                              u64 subnet_prefix)
 {
        struct pkey_index_qp_list *pkey;
@@ -649,7 +649,7 @@ int ib_security_modify_qp(struct ib_qp *qp,
 }
 
 static int ib_security_pkey_access(struct ib_device *dev,
-                                  u8 port_num,
+                                  u32 port_num,
                                   u16 pkey_index,
                                   void *sec)
 {
index f19b23817c2b49b3650f36077f00d67df801b3a7..45f09b75c893177a6c4942f5064a7bb0fd368d34 100644 (file)
@@ -41,7 +41,7 @@
 #include "smi.h"
 #include "opa_smi.h"
 
-static enum smi_action __smi_handle_dr_smp_send(bool is_switch, int port_num,
+static enum smi_action __smi_handle_dr_smp_send(bool is_switch, u32 port_num,
                                                u8 *hop_ptr, u8 hop_cnt,
                                                const u8 *initial_path,
                                                const u8 *return_path,
@@ -127,7 +127,7 @@ static enum smi_action __smi_handle_dr_smp_send(bool is_switch, int port_num,
  * Return IB_SMI_DISCARD if the SMP should be discarded
  */
 enum smi_action smi_handle_dr_smp_send(struct ib_smp *smp,
-                                      bool is_switch, int port_num)
+                                      bool is_switch, u32 port_num)
 {
        return __smi_handle_dr_smp_send(is_switch, port_num,
                                        &smp->hop_ptr, smp->hop_cnt,
@@ -139,7 +139,7 @@ enum smi_action smi_handle_dr_smp_send(struct ib_smp *smp,
 }
 
 enum smi_action opa_smi_handle_dr_smp_send(struct opa_smp *smp,
-                                      bool is_switch, int port_num)
+                                      bool is_switch, u32 port_num)
 {
        return __smi_handle_dr_smp_send(is_switch, port_num,
                                        &smp->hop_ptr, smp->hop_cnt,
@@ -152,7 +152,7 @@ enum smi_action opa_smi_handle_dr_smp_send(struct opa_smp *smp,
                                        OPA_LID_PERMISSIVE);
 }
 
-static enum smi_action __smi_handle_dr_smp_recv(bool is_switch, int port_num,
+static enum smi_action __smi_handle_dr_smp_recv(bool is_switch, u32 port_num,
                                                int phys_port_cnt,
                                                u8 *hop_ptr, u8 hop_cnt,
                                                const u8 *initial_path,
@@ -238,7 +238,7 @@ static enum smi_action __smi_handle_dr_smp_recv(bool is_switch, int port_num,
  * Return IB_SMI_DISCARD if the SMP should be dropped
  */
 enum smi_action smi_handle_dr_smp_recv(struct ib_smp *smp, bool is_switch,
-                                      int port_num, int phys_port_cnt)
+                                      u32 port_num, int phys_port_cnt)
 {
        return __smi_handle_dr_smp_recv(is_switch, port_num, phys_port_cnt,
                                        &smp->hop_ptr, smp->hop_cnt,
@@ -254,7 +254,7 @@ enum smi_action smi_handle_dr_smp_recv(struct ib_smp *smp, bool is_switch,
  * Return IB_SMI_DISCARD if the SMP should be dropped
  */
 enum smi_action opa_smi_handle_dr_smp_recv(struct opa_smp *smp, bool is_switch,
-                                          int port_num, int phys_port_cnt)
+                                          u32 port_num, int phys_port_cnt)
 {
        return __smi_handle_dr_smp_recv(is_switch, port_num, phys_port_cnt,
                                        &smp->hop_ptr, smp->hop_cnt,
index 91d9b353ab857d9565c4530de3d07a8a7096e4e9..e350ed623c45f81a972d0ff63463902061490d1a 100644 (file)
@@ -52,11 +52,11 @@ enum smi_forward_action {
 };
 
 enum smi_action smi_handle_dr_smp_recv(struct ib_smp *smp, bool is_switch,
-                                      int port_num, int phys_port_cnt);
+                                      u32 port_num, int phys_port_cnt);
 int smi_get_fwd_port(struct ib_smp *smp);
 extern enum smi_forward_action smi_check_forward_dr_smp(struct ib_smp *smp);
 extern enum smi_action smi_handle_dr_smp_send(struct ib_smp *smp,
-                                             bool is_switch, int port_num);
+                                             bool is_switch, u32 port_num);
 
 /*
  * Return IB_SMI_HANDLE if the SMP should be handled by the local SMA/SM
index b8abb30f80df5d0806fe8ca6f8deba3d99ae8a76..05b702de00e89be7a415180d11952a8a838d048c 100644 (file)
@@ -62,7 +62,7 @@ struct ib_port {
        const struct attribute_group *pma_table;
        struct attribute_group *hw_stats_ag;
        struct rdma_hw_stats   *hw_stats;
-       u8                     port_num;
+       u32                     port_num;
 };
 
 struct port_attribute {
@@ -94,7 +94,7 @@ struct hw_stats_attribute {
                                         const char *buf,
                                         size_t count);
        int                     index;
-       u                     port_num;
+       u32                     port_num;
 };
 
 static ssize_t port_attr_show(struct kobject *kobj,
@@ -297,7 +297,7 @@ static ssize_t rate_show(struct ib_port *p, struct port_attribute *unused,
 
 static const char *phys_state_to_str(enum ib_port_phys_state phys_state)
 {
-       static const char * phys_state_str[] = {
+       static const char *phys_state_str[] = {
                "<unknown>",
                "Sleep",
                "Polling",
@@ -470,14 +470,14 @@ static ssize_t show_port_pkey(struct ib_port *p, struct port_attribute *attr,
 struct port_table_attribute port_pma_attr_##_name = {                  \
        .attr  = __ATTR(_name, S_IRUGO, show_pma_counter, NULL),        \
        .index = (_offset) | ((_width) << 16) | ((_counter) << 24),     \
-       .attr_id = IB_PMA_PORT_COUNTERS ,                               \
+       .attr_id = IB_PMA_PORT_COUNTERS                               \
 }
 
 #define PORT_PMA_ATTR_EXT(_name, _width, _offset)                      \
 struct port_table_attribute port_pma_attr_ext_##_name = {              \
        .attr  = __ATTR(_name, S_IRUGO, show_pma_counter, NULL),        \
        .index = (_offset) | ((_width) << 16),                          \
-       .attr_id = IB_PMA_PORT_COUNTERS_EXT ,                           \
+       .attr_id = IB_PMA_PORT_COUNTERS_EXT                           \
 }
 
 /*
@@ -812,7 +812,7 @@ static const struct attribute_group *get_counter_table(struct ib_device *dev,
 }
 
 static int update_hw_stats(struct ib_device *dev, struct rdma_hw_stats *stats,
-                          u8 port_num, int index)
+                          u32 port_num, int index)
 {
        int ret;
 
@@ -938,7 +938,7 @@ static void free_hsag(struct kobject *kobj, struct attribute_group *attr_group)
        kfree(attr_group);
 }
 
-static struct attribute *alloc_hsa(int index, u8 port_num, const char *name)
+static struct attribute *alloc_hsa(int index, u32 port_num, const char *name)
 {
        struct hw_stats_attribute *hsa;
 
@@ -956,7 +956,7 @@ static struct attribute *alloc_hsa(int index, u8 port_num, const char *name)
        return &hsa->attr;
 }
 
-static struct attribute *alloc_hsa_lifespan(char *name, u8 port_num)
+static struct attribute *alloc_hsa_lifespan(char *name, u32 port_num)
 {
        struct hw_stats_attribute *hsa;
 
@@ -975,7 +975,7 @@ static struct attribute *alloc_hsa_lifespan(char *name, u8 port_num)
 }
 
 static void setup_hw_stats(struct ib_device *device, struct ib_port *port,
-                          u8 port_num)
+                          u32 port_num)
 {
        struct attribute_group *hsag;
        struct rdma_hw_stats *stats;
@@ -1049,7 +1049,6 @@ err_free_hsag:
        kfree(hsag);
 err_free_stats:
        kfree(stats);
-       return;
 }
 
 static int add_port(struct ib_core_device *coredev, int port_num)
@@ -1075,9 +1074,8 @@ static int add_port(struct ib_core_device *coredev, int port_num)
        ret = kobject_init_and_add(&p->kobj, &port_type,
                                   coredev->ports_kobj,
                                   "%d", port_num);
-       if (ret) {
+       if (ret)
                goto err_put;
-       }
 
        p->gid_attr_group = kzalloc(sizeof(*p->gid_attr_group), GFP_KERNEL);
        if (!p->gid_attr_group) {
@@ -1088,9 +1086,8 @@ static int add_port(struct ib_core_device *coredev, int port_num)
        p->gid_attr_group->port = p;
        ret = kobject_init_and_add(&p->gid_attr_group->kobj, &gid_attr_type,
                                   &p->kobj, "gid_attrs");
-       if (ret) {
+       if (ret)
                goto err_put_gid_attrs;
-       }
 
        if (device->ops.process_mad && is_full_dev) {
                p->pma_table = get_counter_table(device, port_num);
@@ -1383,7 +1380,7 @@ void ib_free_port_attrs(struct ib_core_device *coredev)
 int ib_setup_port_attrs(struct ib_core_device *coredev)
 {
        struct ib_device *device = rdma_device_to_ibdev(&coredev->dev);
-       unsigned int port;
+       u32 port;
        int ret;
 
        coredev->ports_kobj = kobject_create_and_add("ports",
@@ -1437,7 +1434,7 @@ void ib_device_unregister_sysfs(struct ib_device *device)
  * @ktype: pointer to the ktype for this kobject.
  * @name: the name of the kobject
  */
-int ib_port_register_module_stat(struct ib_device *device, u8 port_num,
+int ib_port_register_module_stat(struct ib_device *device, u32 port_num,
                                 struct kobject *kobj, struct kobj_type *ktype,
                                 const char *name)
 {
index da2512c30ffd5276c02e651638c3db89d403287f..15d57ba4d07aa99fe2d0a293e8b48f60fff43636 100644 (file)
@@ -231,7 +231,7 @@ static void ucma_copy_conn_event(struct rdma_ucm_conn_param *dst,
                memcpy(dst->private_data, src->private_data,
                       src->private_data_len);
        dst->private_data_len = src->private_data_len;
-       dst->responder_resources =src->responder_resources;
+       dst->responder_resources = src->responder_resources;
        dst->initiator_depth = src->initiator_depth;
        dst->flow_control = src->flow_control;
        dst->retry_count = src->retry_count;
@@ -1034,7 +1034,7 @@ static void ucma_copy_conn_param(struct rdma_cm_id *id,
 {
        dst->private_data = src->private_data;
        dst->private_data_len = src->private_data_len;
-       dst->responder_resources =src->responder_resources;
+       dst->responder_resources = src->responder_resources;
        dst->initiator_depth = src->initiator_depth;
        dst->flow_control = src->flow_control;
        dst->retry_count = src->retry_count;
@@ -1708,8 +1708,8 @@ static ssize_t ucma_write(struct file *filp, const char __user *buf,
        ssize_t ret;
 
        if (!ib_safe_file_access(filp)) {
-               pr_err_once("ucma_write: process %d (%s) changed security contexts after opening file descriptor, this is not allowed.\n",
-                           task_tgid_vnr(current), current->comm);
+               pr_err_once("%s: process %d (%s) changed security contexts after opening file descriptor, this is not allowed.\n",
+                           __func__, task_tgid_vnr(current), current->comm);
                return -EACCES;
        }
 
index 9b607013e2a2491d29d4e35e47b1ac6363360ffa..0eb40025075f533bc8dfe5ae8b68ab18d9acf7c3 100644 (file)
@@ -100,10 +100,6 @@ unsigned long ib_umem_find_best_pgsz(struct ib_umem *umem,
         */
        pgsz_bitmap &= GENMASK(BITS_PER_LONG - 1, PAGE_SHIFT);
 
-       /* At minimum, drivers must support PAGE_SIZE or smaller */
-       if (WARN_ON(!(pgsz_bitmap & GENMASK(PAGE_SHIFT, 0))))
-               return 0;
-
        umem->iova = va = virt;
        /* The best result is the smallest page size that results in the minimum
         * number of required pages. Compute the largest page size that could
@@ -309,8 +305,8 @@ int ib_umem_copy_from(void *dst, struct ib_umem *umem, size_t offset,
        int ret;
 
        if (offset > umem->length || length > umem->length - offset) {
-               pr_err("ib_umem_copy_from not in range. offset: %zd umem length: %zd end: %zd\n",
-                      offset, umem->length, end);
+               pr_err("%s not in range. offset: %zd umem length: %zd end: %zd\n",
+                      __func__, offset, umem->length, end);
                return -EINVAL;
        }
 
index f9b5162d9260e5ede3222fe858f76cee51739654..0d65ce146fc4d7b465362aba26c3636c2c2e1523 100644 (file)
@@ -168,6 +168,10 @@ void ib_umem_dmabuf_release(struct ib_umem_dmabuf *umem_dmabuf)
 {
        struct dma_buf *dmabuf = umem_dmabuf->attach->dmabuf;
 
+       dma_resv_lock(dmabuf->resv, NULL);
+       ib_umem_dmabuf_unmap_pages(umem_dmabuf);
+       dma_resv_unlock(dmabuf->resv);
+
        dma_buf_detach(dmabuf, umem_dmabuf->attach);
        dma_buf_put(dmabuf);
        kfree(umem_dmabuf);
index dd7f3b437c6be8332fac370a9884bdb8d346abf6..852efedda7980b47073fd2cc26d85e8a6e4d3e86 100644 (file)
@@ -101,7 +101,7 @@ struct ib_umad_port {
        struct ib_device      *ib_dev;
        struct ib_umad_device *umad_dev;
        int                    dev_num;
-       u8                     port_num;
+       u32                     port_num;
 };
 
 struct ib_umad_device {
@@ -165,8 +165,8 @@ static void ib_umad_dev_put(struct ib_umad_device *dev)
 
 static int hdr_size(struct ib_umad_file *file)
 {
-       return file->use_pkey_index ? sizeof (struct ib_user_mad_hdr) :
-               sizeof (struct ib_user_mad_hdr_old);
+       return file->use_pkey_index ? sizeof(struct ib_user_mad_hdr) :
+                                     sizeof(struct ib_user_mad_hdr_old);
 }
 
 /* caller must hold file->mutex */
@@ -688,8 +688,7 @@ static int ib_umad_reg_agent(struct ib_umad_file *file, void __user *arg,
        mutex_lock(&file->mutex);
 
        if (!file->port->ib_dev) {
-               dev_notice(&file->port->dev,
-                          "ib_umad_reg_agent: invalid device\n");
+               dev_notice(&file->port->dev, "%s: invalid device\n", __func__);
                ret = -EPIPE;
                goto out;
        }
@@ -701,7 +700,7 @@ static int ib_umad_reg_agent(struct ib_umad_file *file, void __user *arg,
 
        if (ureq.qpn != 0 && ureq.qpn != 1) {
                dev_notice(&file->port->dev,
-                          "ib_umad_reg_agent: invalid QPN %d specified\n",
+                          "%s: invalid QPN %d specified\n", __func__,
                           ureq.qpn);
                ret = -EINVAL;
                goto out;
@@ -711,9 +710,9 @@ static int ib_umad_reg_agent(struct ib_umad_file *file, void __user *arg,
                if (!__get_agent(file, agent_id))
                        goto found;
 
-       dev_notice(&file->port->dev,
-                  "ib_umad_reg_agent: Max Agents (%u) reached\n",
+       dev_notice(&file->port->dev, "%s: Max Agents (%u) reached\n", __func__,
                   IB_UMAD_MAX_AGENTS);
+
        ret = -ENOMEM;
        goto out;
 
@@ -790,8 +789,7 @@ static int ib_umad_reg_agent2(struct ib_umad_file *file, void __user *arg)
        mutex_lock(&file->mutex);
 
        if (!file->port->ib_dev) {
-               dev_notice(&file->port->dev,
-                          "ib_umad_reg_agent2: invalid device\n");
+               dev_notice(&file->port->dev, "%s: invalid device\n", __func__);
                ret = -EPIPE;
                goto out;
        }
@@ -802,17 +800,16 @@ static int ib_umad_reg_agent2(struct ib_umad_file *file, void __user *arg)
        }
 
        if (ureq.qpn != 0 && ureq.qpn != 1) {
-               dev_notice(&file->port->dev,
-                          "ib_umad_reg_agent2: invalid QPN %d specified\n",
-                          ureq.qpn);
+               dev_notice(&file->port->dev, "%s: invalid QPN %d specified\n",
+                          __func__, ureq.qpn);
                ret = -EINVAL;
                goto out;
        }
 
        if (ureq.flags & ~IB_USER_MAD_REG_FLAGS_CAP) {
                dev_notice(&file->port->dev,
-                          "ib_umad_reg_agent2 failed: invalid registration flags specified 0x%x; supported 0x%x\n",
-                          ureq.flags, IB_USER_MAD_REG_FLAGS_CAP);
+                          "%s failed: invalid registration flags specified 0x%x; supported 0x%x\n",
+                          __func__, ureq.flags, IB_USER_MAD_REG_FLAGS_CAP);
                ret = -EINVAL;
 
                if (put_user((u32)IB_USER_MAD_REG_FLAGS_CAP,
@@ -827,8 +824,7 @@ static int ib_umad_reg_agent2(struct ib_umad_file *file, void __user *arg)
                if (!__get_agent(file, agent_id))
                        goto found;
 
-       dev_notice(&file->port->dev,
-                  "ib_umad_reg_agent2: Max Agents (%u) reached\n",
+       dev_notice(&file->port->dev, "%s: Max Agents (%u) reached\n", __func__,
                   IB_UMAD_MAX_AGENTS);
        ret = -ENOMEM;
        goto out;
@@ -840,7 +836,7 @@ found:
                req.mgmt_class_version = ureq.mgmt_class_version;
                if (ureq.oui & 0xff000000) {
                        dev_notice(&file->port->dev,
-                                  "ib_umad_reg_agent2 failed: oui invalid 0x%08x\n",
+                                  "%s failed: oui invalid 0x%08x\n", __func__,
                                   ureq.oui);
                        ret = -EINVAL;
                        goto out;
@@ -1145,7 +1141,7 @@ static const struct file_operations umad_sm_fops = {
 
 static struct ib_umad_port *get_port(struct ib_device *ibdev,
                                     struct ib_umad_device *umad_dev,
-                                    unsigned int port)
+                                    u32 port)
 {
        if (!umad_dev)
                return ERR_PTR(-EOPNOTSUPP);
index f5b8be3bedde949ae9f949f384f50f4a76d8c6d2..d5e15a8c870d1240dddd17253c40d3fcf24814c1 100644 (file)
@@ -364,7 +364,7 @@ static void copy_query_dev_fields(struct ib_ucontext *ucontext,
        resp->max_srq_sge               = attr->max_srq_sge;
        resp->max_pkeys                 = attr->max_pkeys;
        resp->local_ca_ack_delay        = attr->local_ca_ack_delay;
-       resp->phys_port_cnt             = ib_dev->phys_port_cnt;
+       resp->phys_port_cnt = min_t(u32, ib_dev->phys_port_cnt, U8_MAX);
 }
 
 static int ib_uverbs_query_device(struct uverbs_attr_bundle *attrs)
@@ -2002,12 +2002,13 @@ static int ib_uverbs_destroy_qp(struct uverbs_attr_bundle *attrs)
 
 static void *alloc_wr(size_t wr_size, __u32 num_sge)
 {
-       if (num_sge >= (U32_MAX - ALIGN(wr_size, sizeof (struct ib_sge))) /
-                      sizeof (struct ib_sge))
+       if (num_sge >= (U32_MAX - ALIGN(wr_size, sizeof(struct ib_sge))) /
+                              sizeof(struct ib_sge))
                return NULL;
 
-       return kmalloc(ALIGN(wr_size, sizeof (struct ib_sge)) +
-                        num_sge * sizeof (struct ib_sge), GFP_KERNEL);
+       return kmalloc(ALIGN(wr_size, sizeof(struct ib_sge)) +
+                              num_sge * sizeof(struct ib_sge),
+                      GFP_KERNEL);
 }
 
 static int ib_uverbs_post_send(struct uverbs_attr_bundle *attrs)
@@ -2216,7 +2217,7 @@ ib_uverbs_unmarshall_recv(struct uverbs_req_iter *iter, u32 wr_count,
        const struct ib_sge __user *sgls;
        const void __user *wqes;
 
-       if (wqe_size < sizeof (struct ib_uverbs_recv_wr))
+       if (wqe_size < sizeof(struct ib_uverbs_recv_wr))
                return ERR_PTR(-EINVAL);
 
        wqes = uverbs_request_next_ptr(iter, wqe_size * wr_count);
@@ -2249,14 +2250,14 @@ ib_uverbs_unmarshall_recv(struct uverbs_req_iter *iter, u32 wr_count,
                }
 
                if (user_wr->num_sge >=
-                   (U32_MAX - ALIGN(sizeof *next, sizeof (struct ib_sge))) /
-                   sizeof (struct ib_sge)) {
+                   (U32_MAX - ALIGN(sizeof(*next), sizeof(struct ib_sge))) /
+                           sizeof(struct ib_sge)) {
                        ret = -EINVAL;
                        goto err;
                }
 
-               next = kmalloc(ALIGN(sizeof *next, sizeof (struct ib_sge)) +
-                              user_wr->num_sge * sizeof (struct ib_sge),
+               next = kmalloc(ALIGN(sizeof(*next), sizeof(struct ib_sge)) +
+                                      user_wr->num_sge * sizeof(struct ib_sge),
                               GFP_KERNEL);
                if (!next) {
                        ret = -ENOMEM;
@@ -2274,8 +2275,8 @@ ib_uverbs_unmarshall_recv(struct uverbs_req_iter *iter, u32 wr_count,
                next->num_sge    = user_wr->num_sge;
 
                if (next->num_sge) {
-                       next->sg_list = (void *) next +
-                               ALIGN(sizeof *next, sizeof (struct ib_sge));
+                       next->sg_list = (void *)next +
+                               ALIGN(sizeof(*next), sizeof(struct ib_sge));
                        if (copy_from_user(next->sg_list, sgls + sg_ind,
                                           next->num_sge *
                                                   sizeof(struct ib_sge))) {
index ff047eb024ab1a7549ff2eb8b2daaebcf13bf646..990f0724acc6b660ef2dfc2adeeb00b510e191f3 100644 (file)
@@ -752,9 +752,10 @@ int uverbs_output_written(const struct uverbs_attr_bundle *bundle, size_t idx)
        return uverbs_set_output(bundle, attr);
 }
 
-int _uverbs_get_const(s64 *to, const struct uverbs_attr_bundle *attrs_bundle,
-                     size_t idx, s64 lower_bound, u64 upper_bound,
-                     s64  *def_val)
+int _uverbs_get_const_signed(s64 *to,
+                            const struct uverbs_attr_bundle *attrs_bundle,
+                            size_t idx, s64 lower_bound, u64 upper_bound,
+                            s64  *def_val)
 {
        const struct uverbs_attr *attr;
 
@@ -773,7 +774,30 @@ int _uverbs_get_const(s64 *to, const struct uverbs_attr_bundle *attrs_bundle,
 
        return 0;
 }
-EXPORT_SYMBOL(_uverbs_get_const);
+EXPORT_SYMBOL(_uverbs_get_const_signed);
+
+int _uverbs_get_const_unsigned(u64 *to,
+                              const struct uverbs_attr_bundle *attrs_bundle,
+                              size_t idx, u64 upper_bound, u64 *def_val)
+{
+       const struct uverbs_attr *attr;
+
+       attr = uverbs_attr_get(attrs_bundle, idx);
+       if (IS_ERR(attr)) {
+               if ((PTR_ERR(attr) != -ENOENT) || !def_val)
+                       return PTR_ERR(attr);
+
+               *to = *def_val;
+       } else {
+               *to = attr->ptr_attr.data;
+       }
+
+       if (*to > upper_bound)
+               return -EINVAL;
+
+       return 0;
+}
+EXPORT_SYMBOL(_uverbs_get_const_unsigned);
 
 int uverbs_copy_to_struct_or_zero(const struct uverbs_attr_bundle *bundle,
                                  size_t idx, const void *from, size_t size)
index 28464c58738c247631ea2bf98a93fe9faa79e274..2b0798151fb7532df809b31166a9b725fee2ba62 100644 (file)
@@ -96,10 +96,10 @@ static const char * const wc_statuses[] = {
        [IB_WC_LOC_EEC_OP_ERR]          = "local EE context operation error",
        [IB_WC_LOC_PROT_ERR]            = "local protection error",
        [IB_WC_WR_FLUSH_ERR]            = "WR flushed",
-       [IB_WC_MW_BIND_ERR]             = "memory management operation error",
+       [IB_WC_MW_BIND_ERR]             = "memory bind operation error",
        [IB_WC_BAD_RESP_ERR]            = "bad response error",
        [IB_WC_LOC_ACCESS_ERR]          = "local access error",
-       [IB_WC_REM_INV_REQ_ERR]         = "invalid request error",
+       [IB_WC_REM_INV_REQ_ERR]         = "remote invalid request error",
        [IB_WC_REM_ACCESS_ERR]          = "remote access error",
        [IB_WC_REM_OP_ERR]              = "remote operation error",
        [IB_WC_RETRY_EXC_ERR]           = "transport retry counter exceeded",
@@ -227,7 +227,8 @@ rdma_node_get_transport(unsigned int node_type)
 }
 EXPORT_SYMBOL(rdma_node_get_transport);
 
-enum rdma_link_layer rdma_port_get_link_layer(struct ib_device *device, u8 port_num)
+enum rdma_link_layer rdma_port_get_link_layer(struct ib_device *device,
+                                             u32 port_num)
 {
        enum rdma_transport_type lt;
        if (device->ops.get_link_layer)
@@ -341,7 +342,8 @@ int ib_dealloc_pd_user(struct ib_pd *pd, struct ib_udata *udata)
        }
 
        /* uverbs manipulates usecnt with proper locking, while the kabi
-          requires the caller to guarantee we can't race here. */
+        * requires the caller to guarantee we can't race here.
+        */
        WARN_ON(atomic_read(&pd->usecnt));
 
        ret = pd->device->ops.dealloc_pd(pd, udata);
@@ -658,7 +660,7 @@ int ib_get_rdma_header_version(const union rdma_network_hdr *hdr)
 EXPORT_SYMBOL(ib_get_rdma_header_version);
 
 static enum rdma_network_type ib_get_net_type_by_grh(struct ib_device *device,
-                                                    u8 port_num,
+                                                    u32 port_num,
                                                     const struct ib_grh *grh)
 {
        int grh_version;
@@ -701,7 +703,7 @@ static bool find_gid_index(const union ib_gid *gid,
 }
 
 static const struct ib_gid_attr *
-get_sgid_attr_from_eth(struct ib_device *device, u8 port_num,
+get_sgid_attr_from_eth(struct ib_device *device, u32 port_num,
                       u16 vlan_id, const union ib_gid *sgid,
                       enum ib_gid_type gid_type)
 {
@@ -788,7 +790,7 @@ static int ib_resolve_unicast_gid_dmac(struct ib_device *device,
  * On success the caller is responsible to call rdma_destroy_ah_attr on the
  * attr.
  */
-int ib_init_ah_attr_from_wc(struct ib_device *device, u8 port_num,
+int ib_init_ah_attr_from_wc(struct ib_device *device, u32 port_num,
                            const struct ib_wc *wc, const struct ib_grh *grh,
                            struct rdma_ah_attr *ah_attr)
 {
@@ -919,7 +921,7 @@ void rdma_destroy_ah_attr(struct rdma_ah_attr *ah_attr)
 EXPORT_SYMBOL(rdma_destroy_ah_attr);
 
 struct ib_ah *ib_create_ah_from_wc(struct ib_pd *pd, const struct ib_wc *wc,
-                                  const struct ib_grh *grh, u8 port_num)
+                                  const struct ib_grh *grh, u32 port_num)
 {
        struct rdma_ah_attr ah_attr;
        struct ib_ah *ah;
@@ -1037,8 +1039,12 @@ struct ib_srq *ib_create_srq_user(struct ib_pd *pd,
        }
        atomic_inc(&pd->usecnt);
 
+       rdma_restrack_new(&srq->res, RDMA_RESTRACK_SRQ);
+       rdma_restrack_parent_name(&srq->res, &pd->res);
+
        ret = pd->device->ops.create_srq(srq, srq_init_attr, udata);
        if (ret) {
+               rdma_restrack_put(&srq->res);
                atomic_dec(&srq->pd->usecnt);
                if (srq->srq_type == IB_SRQT_XRC)
                        atomic_dec(&srq->ext.xrc.xrcd->usecnt);
@@ -1048,6 +1054,8 @@ struct ib_srq *ib_create_srq_user(struct ib_pd *pd,
                return ERR_PTR(ret);
        }
 
+       rdma_restrack_add(&srq->res);
+
        return srq;
 }
 EXPORT_SYMBOL(ib_create_srq_user);
@@ -1086,6 +1094,7 @@ int ib_destroy_srq_user(struct ib_srq *srq, struct ib_udata *udata)
                atomic_dec(&srq->ext.xrc.xrcd->usecnt);
        if (ib_srq_has_cq(srq->srq_type))
                atomic_dec(&srq->ext.cq->usecnt);
+       rdma_restrack_del(&srq->res);
        kfree(srq);
 
        return ret;
@@ -1673,7 +1682,7 @@ static bool is_qp_type_connected(const struct ib_qp *qp)
 static int _ib_modify_qp(struct ib_qp *qp, struct ib_qp_attr *attr,
                         int attr_mask, struct ib_udata *udata)
 {
-       u8 port = attr_mask & IB_QP_PORT ? attr->port_num : qp->port;
+       u32 port = attr_mask & IB_QP_PORT ? attr->port_num : qp->port;
        const struct ib_gid_attr *old_sgid_attr_av;
        const struct ib_gid_attr *old_sgid_attr_alt_av;
        int ret;
@@ -1801,7 +1810,7 @@ int ib_modify_qp_with_udata(struct ib_qp *ib_qp, struct ib_qp_attr *attr,
 }
 EXPORT_SYMBOL(ib_modify_qp_with_udata);
 
-int ib_get_eth_speed(struct ib_device *dev, u8 port_num, u16 *speed, u8 *width)
+int ib_get_eth_speed(struct ib_device *dev, u32 port_num, u16 *speed, u8 *width)
 {
        int rc;
        u32 netdev_speed;
@@ -2467,7 +2476,7 @@ int ib_check_mr_status(struct ib_mr *mr, u32 check_mask,
 }
 EXPORT_SYMBOL(ib_check_mr_status);
 
-int ib_set_vf_link_state(struct ib_device *device, int vf, u8 port,
+int ib_set_vf_link_state(struct ib_device *device, int vf, u32 port,
                         int state)
 {
        if (!device->ops.set_vf_link_state)
@@ -2477,7 +2486,7 @@ int ib_set_vf_link_state(struct ib_device *device, int vf, u8 port,
 }
 EXPORT_SYMBOL(ib_set_vf_link_state);
 
-int ib_get_vf_config(struct ib_device *device, int vf, u8 port,
+int ib_get_vf_config(struct ib_device *device, int vf, u32 port,
                     struct ifla_vf_info *info)
 {
        if (!device->ops.get_vf_config)
@@ -2487,7 +2496,7 @@ int ib_get_vf_config(struct ib_device *device, int vf, u8 port,
 }
 EXPORT_SYMBOL(ib_get_vf_config);
 
-int ib_get_vf_stats(struct ib_device *device, int vf, u8 port,
+int ib_get_vf_stats(struct ib_device *device, int vf, u32 port,
                    struct ifla_vf_stats *stats)
 {
        if (!device->ops.get_vf_stats)
@@ -2497,7 +2506,7 @@ int ib_get_vf_stats(struct ib_device *device, int vf, u8 port,
 }
 EXPORT_SYMBOL(ib_get_vf_stats);
 
-int ib_set_vf_guid(struct ib_device *device, int vf, u8 port, u64 guid,
+int ib_set_vf_guid(struct ib_device *device, int vf, u32 port, u64 guid,
                   int type)
 {
        if (!device->ops.set_vf_guid)
@@ -2507,7 +2516,7 @@ int ib_set_vf_guid(struct ib_device *device, int vf, u8 port, u64 guid,
 }
 EXPORT_SYMBOL(ib_set_vf_guid);
 
-int ib_get_vf_guid(struct ib_device *device, int vf, u8 port,
+int ib_get_vf_guid(struct ib_device *device, int vf, u32 port,
                   struct ifla_vf_guid *node_guid,
                   struct ifla_vf_guid *port_guid)
 {
@@ -2849,7 +2858,7 @@ void ib_drain_qp(struct ib_qp *qp)
 }
 EXPORT_SYMBOL(ib_drain_qp);
 
-struct net_device *rdma_alloc_netdev(struct ib_device *device, u8 port_num,
+struct net_device *rdma_alloc_netdev(struct ib_device *device, u32 port_num,
                                     enum rdma_netdev_t type, const char *name,
                                     unsigned char name_assign_type,
                                     void (*setup)(struct net_device *))
@@ -2875,7 +2884,7 @@ struct net_device *rdma_alloc_netdev(struct ib_device *device, u8 port_num,
 }
 EXPORT_SYMBOL(rdma_alloc_netdev);
 
-int rdma_init_netdev(struct ib_device *device, u8 port_num,
+int rdma_init_netdev(struct ib_device *device, u32 port_num,
                     enum rdma_netdev_t type, const char *name,
                     unsigned char name_assign_type,
                     void (*setup)(struct net_device *),
index 0feac5132ce16497056205a63d4623204103b1ac..6a17f5cdb0206211c0e1f64f7585c216b1842208 100644 (file)
@@ -2,9 +2,7 @@
 config INFINIBAND_BNXT_RE
        tristate "Broadcom Netxtreme HCA support"
        depends on 64BIT
-       depends on ETHERNET && NETDEVICES && PCI && INET && DCB
-       select NET_VENDOR_BROADCOM
-       select BNXT
+       depends on INET && DCB && BNXT
        help
          This driver supports Broadcom NetXtreme-E 10/25/40/50 gigabit
          RoCE HCAs.  To compile this driver as a module, choose M here:
index b930ea3dab7a4ff0febd425e7189cf98a98425fe..ba26d8e6a9c2ef256b5bbfe309f3edf24fa70d9e 100644 (file)
@@ -138,6 +138,7 @@ struct bnxt_re_dev {
 #define BNXT_RE_FLAG_QOS_WORK_REG              5
 #define BNXT_RE_FLAG_RESOURCES_ALLOCATED       7
 #define BNXT_RE_FLAG_RESOURCES_INITIALIZED     8
+#define BNXT_RE_FLAG_ERR_DEVICE_DETACHED       17
 #define BNXT_RE_FLAG_ISSUE_ROCE_STATS          29
        struct net_device               *netdev;
        unsigned int                    version, major, minor;
index 5f5408cdf008b9633c7a29fe3c1b890c41bb37fe..3e54e1ae75b499eaf641c13c17287ca930dc5510 100644 (file)
@@ -114,7 +114,7 @@ static const char * const bnxt_re_stat_name[] = {
 
 int bnxt_re_ib_get_hw_stats(struct ib_device *ibdev,
                            struct rdma_hw_stats *stats,
-                           u8 port, int index)
+                           u32 port, int index)
 {
        struct bnxt_re_dev *rdev = to_bnxt_re_dev(ibdev, ibdev);
        struct ctx_hw_stats *bnxt_re_stats = rdev->qplib_ctx.stats.dma;
@@ -235,7 +235,7 @@ int bnxt_re_ib_get_hw_stats(struct ib_device *ibdev,
 }
 
 struct rdma_hw_stats *bnxt_re_ib_alloc_hw_stats(struct ib_device *ibdev,
-                                               u8 port_num)
+                                               u32 port_num)
 {
        BUILD_BUG_ON(ARRAY_SIZE(bnxt_re_stat_name) != BNXT_RE_NUM_COUNTERS);
        /* We support only per port stats */
index 76399f477e5c8da4be9c02ed6ca6ae21d9a2c086..ede048607d6c0d938628418340951afa46bf33c0 100644 (file)
@@ -97,8 +97,8 @@ enum bnxt_re_hw_stats {
 };
 
 struct rdma_hw_stats *bnxt_re_ib_alloc_hw_stats(struct ib_device *ibdev,
-                                               u8 port_num);
+                                               u32 port_num);
 int bnxt_re_ib_get_hw_stats(struct ib_device *ibdev,
                            struct rdma_hw_stats *stats,
-                           u8 port, int index);
+                           u32 port, int index);
 #endif /* __BNXT_RE_HW_STATS_H__ */
index ba515efd4fdce907fa247b7036cccafb41fddeb1..2efaa80bfbd2d6a6d9a72edeb6beef89e87d3656 100644 (file)
@@ -189,7 +189,7 @@ int bnxt_re_query_device(struct ib_device *ibdev,
 }
 
 /* Port */
-int bnxt_re_query_port(struct ib_device *ibdev, u8 port_num,
+int bnxt_re_query_port(struct ib_device *ibdev, u32 port_num,
                       struct ib_port_attr *port_attr)
 {
        struct bnxt_re_dev *rdev = to_bnxt_re_dev(ibdev, ibdev);
@@ -229,7 +229,7 @@ int bnxt_re_query_port(struct ib_device *ibdev, u8 port_num,
        return 0;
 }
 
-int bnxt_re_get_port_immutable(struct ib_device *ibdev, u8 port_num,
+int bnxt_re_get_port_immutable(struct ib_device *ibdev, u32 port_num,
                               struct ib_port_immutable *immutable)
 {
        struct ib_port_attr port_attr;
@@ -254,7 +254,7 @@ void bnxt_re_query_fw_str(struct ib_device *ibdev, char *str)
                 rdev->dev_attr.fw_ver[2], rdev->dev_attr.fw_ver[3]);
 }
 
-int bnxt_re_query_pkey(struct ib_device *ibdev, u8 port_num,
+int bnxt_re_query_pkey(struct ib_device *ibdev, u32 port_num,
                       u16 index, u16 *pkey)
 {
        struct bnxt_re_dev *rdev = to_bnxt_re_dev(ibdev, ibdev);
@@ -266,7 +266,7 @@ int bnxt_re_query_pkey(struct ib_device *ibdev, u8 port_num,
                                   &rdev->qplib_res.pkey_tbl, index, pkey);
 }
 
-int bnxt_re_query_gid(struct ib_device *ibdev, u8 port_num,
+int bnxt_re_query_gid(struct ib_device *ibdev, u32 port_num,
                      int index, union ib_gid *gid)
 {
        struct bnxt_re_dev *rdev = to_bnxt_re_dev(ibdev, ibdev);
@@ -374,7 +374,7 @@ int bnxt_re_add_gid(const struct ib_gid_attr *attr, void **context)
 }
 
 enum rdma_link_layer bnxt_re_get_link_layer(struct ib_device *ibdev,
-                                           u8 port_num)
+                                           u32 port_num)
 {
        return IB_LINK_LAYER_ETHERNET;
 }
index 9a8130b79256ddaf4eddfcfade28d3c693189dea..d68671cc617382b114e6290ea1353ae48de0ec60 100644 (file)
@@ -149,19 +149,19 @@ static inline u16 bnxt_re_get_rwqe_size(int nsge)
 int bnxt_re_query_device(struct ib_device *ibdev,
                         struct ib_device_attr *ib_attr,
                         struct ib_udata *udata);
-int bnxt_re_query_port(struct ib_device *ibdev, u8 port_num,
+int bnxt_re_query_port(struct ib_device *ibdev, u32 port_num,
                       struct ib_port_attr *port_attr);
-int bnxt_re_get_port_immutable(struct ib_device *ibdev, u8 port_num,
+int bnxt_re_get_port_immutable(struct ib_device *ibdev, u32 port_num,
                               struct ib_port_immutable *immutable);
 void bnxt_re_query_fw_str(struct ib_device *ibdev, char *str);
-int bnxt_re_query_pkey(struct ib_device *ibdev, u8 port_num,
+int bnxt_re_query_pkey(struct ib_device *ibdev, u32 port_num,
                       u16 index, u16 *pkey);
 int bnxt_re_del_gid(const struct ib_gid_attr *attr, void **context);
 int bnxt_re_add_gid(const struct ib_gid_attr *attr, void **context);
-int bnxt_re_query_gid(struct ib_device *ibdev, u8 port_num,
+int bnxt_re_query_gid(struct ib_device *ibdev, u32 port_num,
                      int index, union ib_gid *gid);
 enum rdma_link_layer bnxt_re_get_link_layer(struct ib_device *ibdev,
-                                           u8 port_num);
+                                           u32 port_num);
 int bnxt_re_alloc_pd(struct ib_pd *pd, struct ib_udata *udata);
 int bnxt_re_dealloc_pd(struct ib_pd *pd, struct ib_udata *udata);
 int bnxt_re_create_ah(struct ib_ah *ah, struct rdma_ah_init_attr *init_attr,
index fdb8c247825855eeb03143923bd9de83e8704b66..8bfbf0231a9ef63201ccdc35aeba90d4c6eec8e7 100644 (file)
@@ -81,6 +81,7 @@ static struct workqueue_struct *bnxt_re_wq;
 static void bnxt_re_remove_device(struct bnxt_re_dev *rdev);
 static void bnxt_re_dealloc_driver(struct ib_device *ib_dev);
 static void bnxt_re_stop_irq(void *handle);
+static void bnxt_re_dev_stop(struct bnxt_re_dev *rdev);
 
 static void bnxt_re_set_drv_mode(struct bnxt_re_dev *rdev, u8 mode)
 {
@@ -221,6 +222,37 @@ static void bnxt_re_set_resource_limits(struct bnxt_re_dev *rdev)
 /* for handling bnxt_en callbacks later */
 static void bnxt_re_stop(void *p)
 {
+       struct bnxt_re_dev *rdev = p;
+       struct bnxt *bp;
+
+       if (!rdev)
+               return;
+       ASSERT_RTNL();
+
+       /* L2 driver invokes this callback during device error/crash or device
+        * reset. Current RoCE driver doesn't recover the device in case of
+        * error. Handle the error by dispatching fatal events to all qps
+        * ie. by calling bnxt_re_dev_stop and release the MSIx vectors as
+        * L2 driver want to modify the MSIx table.
+        */
+       bp = netdev_priv(rdev->netdev);
+
+       ibdev_info(&rdev->ibdev, "Handle device stop call from L2 driver");
+       /* Check the current device state from L2 structure and move the
+        * device to detached state if FW_FATAL_COND is set.
+        * This prevents more commands to HW during clean-up,
+        * in case the device is already in error.
+        */
+       if (test_bit(BNXT_STATE_FW_FATAL_COND, &bp->state))
+               set_bit(ERR_DEVICE_DETACHED, &rdev->rcfw.cmdq.flags);
+
+       bnxt_re_dev_stop(rdev);
+       bnxt_re_stop_irq(rdev);
+       /* Move the device states to detached and  avoid sending any more
+        * commands to HW
+        */
+       set_bit(BNXT_RE_FLAG_ERR_DEVICE_DETACHED, &rdev->flags);
+       set_bit(ERR_DEVICE_DETACHED, &rdev->rcfw.cmdq.flags);
 }
 
 static void bnxt_re_start(void *p)
@@ -234,6 +266,8 @@ static void bnxt_re_sriov_config(void *p, int num_vfs)
        if (!rdev)
                return;
 
+       if (test_bit(BNXT_RE_FLAG_ERR_DEVICE_DETACHED, &rdev->flags))
+               return;
        rdev->num_vfs = num_vfs;
        if (!bnxt_qplib_is_chip_gen_p5(rdev->chip_ctx)) {
                bnxt_re_set_resource_limits(rdev);
@@ -427,6 +461,9 @@ static int bnxt_re_net_ring_free(struct bnxt_re_dev *rdev,
        if (!en_dev)
                return rc;
 
+       if (test_bit(BNXT_RE_FLAG_ERR_DEVICE_DETACHED, &rdev->flags))
+               return 0;
+
        memset(&fw_msg, 0, sizeof(fw_msg));
 
        bnxt_re_init_hwrm_hdr(rdev, (void *)&req, HWRM_RING_FREE, -1, -1);
@@ -489,6 +526,9 @@ static int bnxt_re_net_stats_ctx_free(struct bnxt_re_dev *rdev,
        if (!en_dev)
                return rc;
 
+       if (test_bit(BNXT_RE_FLAG_ERR_DEVICE_DETACHED, &rdev->flags))
+               return 0;
+
        memset(&fw_msg, 0, sizeof(fw_msg));
 
        bnxt_re_init_hwrm_hdr(rdev, (void *)&req, HWRM_STAT_CTX_FREE, -1, -1);
@@ -561,24 +601,12 @@ static struct bnxt_re_dev *bnxt_re_from_netdev(struct net_device *netdev)
        return container_of(ibdev, struct bnxt_re_dev, ibdev);
 }
 
-static void bnxt_re_dev_unprobe(struct net_device *netdev,
-                               struct bnxt_en_dev *en_dev)
-{
-       dev_put(netdev);
-       module_put(en_dev->pdev->driver->driver.owner);
-}
-
 static struct bnxt_en_dev *bnxt_re_dev_probe(struct net_device *netdev)
 {
-       struct bnxt *bp = netdev_priv(netdev);
        struct bnxt_en_dev *en_dev;
        struct pci_dev *pdev;
 
-       /* Call bnxt_en's RoCE probe via indirect API */
-       if (!bp->ulp_probe)
-               return ERR_PTR(-EINVAL);
-
-       en_dev = bp->ulp_probe(netdev);
+       en_dev = bnxt_ulp_probe(netdev);
        if (IS_ERR(en_dev))
                return en_dev;
 
@@ -593,10 +621,6 @@ static struct bnxt_en_dev *bnxt_re_dev_probe(struct net_device *netdev)
                return ERR_PTR(-ENODEV);
        }
 
-       /* Bump net device reference count */
-       if (!try_module_get(pdev->driver->driver.owner))
-               return ERR_PTR(-ENODEV);
-
        dev_hold(netdev);
 
        return en_dev;
@@ -1523,13 +1547,12 @@ fail:
 
 static void bnxt_re_dev_unreg(struct bnxt_re_dev *rdev)
 {
-       struct bnxt_en_dev *en_dev = rdev->en_dev;
        struct net_device *netdev = rdev->netdev;
 
        bnxt_re_dev_remove(rdev);
 
        if (netdev)
-               bnxt_re_dev_unprobe(netdev, en_dev);
+               dev_put(netdev);
 }
 
 static int bnxt_re_dev_reg(struct bnxt_re_dev **rdev, struct net_device *netdev)
@@ -1551,7 +1574,7 @@ static int bnxt_re_dev_reg(struct bnxt_re_dev **rdev, struct net_device *netdev)
        *rdev = bnxt_re_dev_add(netdev, en_dev);
        if (!*rdev) {
                rc = -ENOMEM;
-               bnxt_re_dev_unprobe(netdev, en_dev);
+               dev_put(netdev);
                goto exit;
        }
 exit:
index 995d4633b0a1c7a6596f775516ebc86adb581cf0..d4d4959c2434ce47e2416c3eb859a6c3b867be16 100644 (file)
@@ -2784,6 +2784,7 @@ do_rq:
                dev_err(&cq->hwq.pdev->dev,
                        "FP: CQ Processed terminal reported rq_cons_idx 0x%x exceeds max 0x%x\n",
                        cqe_cons, rq->max_wqe);
+               rc = -EINVAL;
                goto done;
        }
 
index 441eb421e5e59a7d088611b52ad28c3bc44c8c94..5d384def5e5feaf569429cf731baf6bfc2338cc9 100644 (file)
@@ -212,6 +212,10 @@ int bnxt_qplib_rcfw_send_message(struct bnxt_qplib_rcfw *rcfw,
        u8 opcode, retry_cnt = 0xFF;
        int rc = 0;
 
+       /* Prevent posting if f/w is not in a state to process */
+       if (test_bit(ERR_DEVICE_DETACHED, &rcfw->cmdq.flags))
+               return 0;
+
        do {
                opcode = req->opcode;
                rc = __send_message(rcfw, req, resp, sb, is_block);
index 5f2f0a5a3560ff89902a04d3390f303c161e7e4a..9474c00465821a6ff92caf5e41c7a4558cc7fe2b 100644 (file)
@@ -138,6 +138,8 @@ struct bnxt_qplib_qp_node {
 #define FIRMWARE_INITIALIZED_FLAG      (0)
 #define FIRMWARE_FIRST_FLAG            (31)
 #define FIRMWARE_TIMED_OUT             (3)
+#define ERR_DEVICE_DETACHED             (4)
+
 struct bnxt_qplib_cmdq_mbox {
        struct bnxt_qplib_reg_desc      reg;
        void __iomem                    *prod;
index fa7878336100ac778bf726e59f04ea7de732a04b..3ca47004b752789f32764f8b5678bd488f264540 100644 (file)
@@ -854,6 +854,7 @@ static int bnxt_qplib_alloc_dpi_tbl(struct bnxt_qplib_res     *res,
 
 unmap_io:
        pci_iounmap(res->pdev, dpit->dbr_bar_reg_iomem);
+       dpit->dbr_bar_reg_iomem = NULL;
        return -ENOMEM;
 }
 
index e42c812e74c3c963bf9923d82a77c43bf0a357e1..291471d12197faed012d45f6bc2ad71333e8b2ae 100644 (file)
@@ -145,7 +145,7 @@ static void connect_reply_upcall(struct c4iw_ep *ep, int status);
 static int sched(struct c4iw_dev *dev, struct sk_buff *skb);
 
 static LIST_HEAD(timeout_list);
-static spinlock_t timeout_lock;
+static DEFINE_SPINLOCK(timeout_lock);
 
 static void deref_cm_id(struct c4iw_ep_common *epc)
 {
@@ -4452,7 +4452,6 @@ c4iw_handler_func c4iw_handlers[NUM_CPL_CMDS] = {
 
 int __init c4iw_cm_init(void)
 {
-       spin_lock_init(&timeout_lock);
        skb_queue_head_init(&rxq);
 
        workq = alloc_ordered_workqueue("iw_cxgb4", WQ_MEM_RECLAIM);
index f85477f3b037d22f2ba0e0b8e0edbd0f8e7e3d9e..cdec5deb37a1f8e3756a98034e25329dc9f62637 100644 (file)
@@ -341,11 +341,6 @@ static inline struct c4iw_dev *to_c4iw_dev(struct ib_device *ibdev)
        return container_of(ibdev, struct c4iw_dev, ibdev);
 }
 
-static inline struct c4iw_dev *rdev_to_c4iw_dev(struct c4iw_rdev *rdev)
-{
-       return container_of(rdev, struct c4iw_dev, rdev);
-}
-
 static inline struct c4iw_cq *get_chp(struct c4iw_dev *rhp, u32 cqid)
 {
        return xa_load(&rhp->cqs, cqid);
@@ -659,12 +654,6 @@ static inline u32 c4iw_ib_to_tpt_access(int a)
               FW_RI_MEM_ACCESS_LOCAL_READ;
 }
 
-static inline u32 c4iw_ib_to_tpt_bind_access(int acc)
-{
-       return (acc & IB_ACCESS_REMOTE_WRITE ? FW_RI_MEM_ACCESS_REM_WRITE : 0) |
-              (acc & IB_ACCESS_REMOTE_READ ? FW_RI_MEM_ACCESS_REM_READ : 0);
-}
-
 enum c4iw_mmid_state {
        C4IW_STAG_STATE_VALID,
        C4IW_STAG_STATE_INVALID
index 1f1f856f8715d11b0dd0f3d46a1fdb6f859b011c..3f1893e180ddf3151beaf3f85c0b8932924441ea 100644 (file)
@@ -237,12 +237,12 @@ static int c4iw_allocate_pd(struct ib_pd *pd, struct ib_udata *udata)
        return 0;
 }
 
-static int c4iw_query_gid(struct ib_device *ibdev, u8 port, int index,
+static int c4iw_query_gid(struct ib_device *ibdev, u32 port, int index,
                          union ib_gid *gid)
 {
        struct c4iw_dev *dev;
 
-       pr_debug("ibdev %p, port %d, index %d, gid %p\n",
+       pr_debug("ibdev %p, port %u, index %d, gid %p\n",
                 ibdev, port, index, gid);
        if (!port)
                return -EINVAL;
@@ -295,7 +295,7 @@ static int c4iw_query_device(struct ib_device *ibdev, struct ib_device_attr *pro
        return 0;
 }
 
-static int c4iw_query_port(struct ib_device *ibdev, u8 port,
+static int c4iw_query_port(struct ib_device *ibdev, u32 port,
                           struct ib_port_attr *props)
 {
        int ret = 0;
@@ -378,7 +378,7 @@ static const char * const names[] = {
 };
 
 static struct rdma_hw_stats *c4iw_alloc_stats(struct ib_device *ibdev,
-                                             u8 port_num)
+                                             u32 port_num)
 {
        BUILD_BUG_ON(ARRAY_SIZE(names) != NR_COUNTERS);
 
@@ -391,7 +391,7 @@ static struct rdma_hw_stats *c4iw_alloc_stats(struct ib_device *ibdev,
 
 static int c4iw_get_mib(struct ib_device *ibdev,
                        struct rdma_hw_stats *stats,
-                       u8 port, int index)
+                       u32 port, int index)
 {
        struct tp_tcp_stats v4, v6;
        struct c4iw_dev *c4iw_dev = to_c4iw_dev(ibdev);
@@ -420,7 +420,7 @@ static const struct attribute_group c4iw_attr_group = {
        .attrs = c4iw_class_attributes,
 };
 
-static int c4iw_port_immutable(struct ib_device *ibdev, u8 port_num,
+static int c4iw_port_immutable(struct ib_device *ibdev, u32 port_num,
                               struct ib_port_immutable *immutable)
 {
        struct ib_port_attr attr;
index 5c95c789f302dab389e529fbc926e3a0f3736a83..e800e8e8bed5aebcfcd662d6aa363c6f7343e592 100644 (file)
@@ -216,7 +216,7 @@ u32 c4iw_get_qpid(struct c4iw_rdev *rdev, struct c4iw_dev_ucontext *uctx)
                        goto out;
                entry->qid = qid;
                list_add_tail(&entry->entry, &uctx->cqids);
-               for (i = qid; i & rdev->qpmask; i++) {
+               for (i = qid + 1; i & rdev->qpmask; i++) {
                        entry = kmalloc(sizeof(*entry), GFP_KERNEL);
                        if (!entry)
                                goto out;
index b170817b27419f0d4c589facf55463d5ff7aba62..c3b0e2896475ecaaa16b924c16d309393f714a1e 100644 (file)
@@ -487,11 +487,6 @@ static inline int t4_rq_empty(struct t4_wq *wq)
        return wq->rq.in_use == 0;
 }
 
-static inline int t4_rq_full(struct t4_wq *wq)
-{
-       return wq->rq.in_use == (wq->rq.size - 1);
-}
-
 static inline u32 t4_rq_avail(struct t4_wq *wq)
 {
        return wq->rq.size - 1 - wq->rq.in_use;
@@ -534,11 +529,6 @@ static inline int t4_sq_empty(struct t4_wq *wq)
        return wq->sq.in_use == 0;
 }
 
-static inline int t4_sq_full(struct t4_wq *wq)
-{
-       return wq->sq.in_use == (wq->sq.size - 1);
-}
-
 static inline u32 t4_sq_avail(struct t4_wq *wq)
 {
        return wq->sq.size - 1 - wq->sq.in_use;
@@ -679,11 +669,6 @@ static inline void t4_enable_wq_db(struct t4_wq *wq)
        wq->rq.queue[wq->rq.size].status.db_off = 0;
 }
 
-static inline int t4_wq_db_enabled(struct t4_wq *wq)
-{
-       return !wq->rq.queue[wq->rq.size].status.db_off;
-}
-
 enum t4_cq_flags {
        CQ_ARMED        = 1,
 };
@@ -817,19 +802,6 @@ static inline int t4_next_hw_cqe(struct t4_cq *cq, struct t4_cqe **cqe)
        return ret;
 }
 
-static inline struct t4_cqe *t4_next_sw_cqe(struct t4_cq *cq)
-{
-       if (cq->sw_in_use == cq->size) {
-               pr_warn("%s cxgb4 sw cq overflow cqid %u\n",
-                       __func__, cq->cqid);
-               cq->error = 1;
-               return NULL;
-       }
-       if (cq->sw_in_use)
-               return &cq->sw_queue[cq->sw_cidx];
-       return NULL;
-}
-
 static inline int t4_next_cqe(struct t4_cq *cq, struct t4_cqe **cqe)
 {
        int ret = 0;
@@ -843,11 +815,6 @@ static inline int t4_next_cqe(struct t4_cq *cq, struct t4_cqe **cqe)
        return ret;
 }
 
-static inline int t4_cq_in_error(struct t4_cq *cq)
-{
-       return *cq->qp_errp;
-}
-
 static inline void t4_set_cq_in_error(struct t4_cq *cq)
 {
        *cq->qp_errp = 1;
index e5d9712e98c4a9447cf26d52330ee780daf16d4d..ea322cec27d230c4e4fa191f195c711ed6f26b9e 100644 (file)
@@ -120,14 +120,14 @@ struct efa_ah {
 int efa_query_device(struct ib_device *ibdev,
                     struct ib_device_attr *props,
                     struct ib_udata *udata);
-int efa_query_port(struct ib_device *ibdev, u8 port,
+int efa_query_port(struct ib_device *ibdev, u32 port,
                   struct ib_port_attr *props);
 int efa_query_qp(struct ib_qp *ibqp, struct ib_qp_attr *qp_attr,
                 int qp_attr_mask,
                 struct ib_qp_init_attr *qp_init_attr);
-int efa_query_gid(struct ib_device *ibdev, u8 port, int index,
+int efa_query_gid(struct ib_device *ibdev, u32 port, int index,
                  union ib_gid *gid);
-int efa_query_pkey(struct ib_device *ibdev, u8 port, u16 index,
+int efa_query_pkey(struct ib_device *ibdev, u32 port, u16 index,
                   u16 *pkey);
 int efa_alloc_pd(struct ib_pd *ibpd, struct ib_udata *udata);
 int efa_dealloc_pd(struct ib_pd *ibpd, struct ib_udata *udata);
@@ -142,7 +142,7 @@ struct ib_mr *efa_reg_mr(struct ib_pd *ibpd, u64 start, u64 length,
                         u64 virt_addr, int access_flags,
                         struct ib_udata *udata);
 int efa_dereg_mr(struct ib_mr *ibmr, struct ib_udata *udata);
-int efa_get_port_immutable(struct ib_device *ibdev, u8 port_num,
+int efa_get_port_immutable(struct ib_device *ibdev, u32 port_num,
                           struct ib_port_immutable *immutable);
 int efa_alloc_ucontext(struct ib_ucontext *ibucontext, struct ib_udata *udata);
 void efa_dealloc_ucontext(struct ib_ucontext *ibucontext);
@@ -156,9 +156,9 @@ int efa_destroy_ah(struct ib_ah *ibah, u32 flags);
 int efa_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *qp_attr,
                  int qp_attr_mask, struct ib_udata *udata);
 enum rdma_link_layer efa_port_link_layer(struct ib_device *ibdev,
-                                        u8 port_num);
-struct rdma_hw_stats *efa_alloc_hw_stats(struct ib_device *ibdev, u8 port_num);
+                                        u32 port_num);
+struct rdma_hw_stats *efa_alloc_hw_stats(struct ib_device *ibdev, u32 port_num);
 int efa_get_hw_stats(struct ib_device *ibdev, struct rdma_hw_stats *stats,
-                    u8 port_num, int index);
+                    u32 port_num, int index);
 
 #endif /* _EFA_H_ */
index 0f578734bddb60e34041c63081927ab9a388ba31..816cfd65b7ac8491d27925452c1564624f278bff 100644 (file)
@@ -1,6 +1,6 @@
 // SPDX-License-Identifier: GPL-2.0 OR BSD-2-Clause
 /*
- * Copyright 2018-2020 Amazon.com, Inc. or its affiliates. All rights reserved.
+ * Copyright 2018-2021 Amazon.com, Inc. or its affiliates. All rights reserved.
  */
 
 #include <linux/module.h>
@@ -209,11 +209,11 @@ static void efa_set_host_info(struct efa_dev *dev)
        if (!hinf)
                return;
 
-       strlcpy(hinf->os_dist_str, utsname()->release,
-               min(sizeof(hinf->os_dist_str), sizeof(utsname()->release)));
+       strscpy(hinf->os_dist_str, utsname()->release,
+               sizeof(hinf->os_dist_str));
        hinf->os_type = EFA_ADMIN_OS_LINUX;
-       strlcpy(hinf->kernel_ver_str, utsname()->version,
-               min(sizeof(hinf->kernel_ver_str), sizeof(utsname()->version)));
+       strscpy(hinf->kernel_ver_str, utsname()->version,
+               sizeof(hinf->kernel_ver_str));
        hinf->kernel_ver = LINUX_VERSION_CODE;
        EFA_SET(&hinf->driver_ver, EFA_ADMIN_HOST_INFO_DRIVER_MAJOR, 0);
        EFA_SET(&hinf->driver_ver, EFA_ADMIN_HOST_INFO_DRIVER_MINOR, 0);
index 479b604e533ad5121b86933dbc6c20caf93c1dbc..51572f1dc6111badbd76ed60920c0ac26bc197f5 100644 (file)
@@ -247,7 +247,7 @@ int efa_query_device(struct ib_device *ibdev,
        return 0;
 }
 
-int efa_query_port(struct ib_device *ibdev, u8 port,
+int efa_query_port(struct ib_device *ibdev, u32 port,
                   struct ib_port_attr *props)
 {
        struct efa_dev *dev = to_edev(ibdev);
@@ -319,7 +319,7 @@ int efa_query_qp(struct ib_qp *ibqp, struct ib_qp_attr *qp_attr,
        return 0;
 }
 
-int efa_query_gid(struct ib_device *ibdev, u8 port, int index,
+int efa_query_gid(struct ib_device *ibdev, u32 port, int index,
                  union ib_gid *gid)
 {
        struct efa_dev *dev = to_edev(ibdev);
@@ -329,7 +329,7 @@ int efa_query_gid(struct ib_device *ibdev, u8 port, int index,
        return 0;
 }
 
-int efa_query_pkey(struct ib_device *ibdev, u8 port, u16 index,
+int efa_query_pkey(struct ib_device *ibdev, u32 port, u16 index,
                   u16 *pkey)
 {
        if (index > 0)
@@ -1619,7 +1619,7 @@ int efa_dereg_mr(struct ib_mr *ibmr, struct ib_udata *udata)
        return 0;
 }
 
-int efa_get_port_immutable(struct ib_device *ibdev, u8 port_num,
+int efa_get_port_immutable(struct ib_device *ibdev, u32 port_num,
                           struct ib_port_immutable *immutable)
 {
        struct ib_port_attr attr;
@@ -1904,7 +1904,7 @@ int efa_destroy_ah(struct ib_ah *ibah, u32 flags)
        return 0;
 }
 
-struct rdma_hw_stats *efa_alloc_hw_stats(struct ib_device *ibdev, u8 port_num)
+struct rdma_hw_stats *efa_alloc_hw_stats(struct ib_device *ibdev, u32 port_num)
 {
        return rdma_alloc_hw_stats_struct(efa_stats_names,
                                          ARRAY_SIZE(efa_stats_names),
@@ -1912,7 +1912,7 @@ struct rdma_hw_stats *efa_alloc_hw_stats(struct ib_device *ibdev, u8 port_num)
 }
 
 int efa_get_hw_stats(struct ib_device *ibdev, struct rdma_hw_stats *stats,
-                    u8 port_num, int index)
+                    u32 port_num, int index)
 {
        struct efa_com_get_stats_params params = {};
        union efa_com_get_stats_result result;
@@ -1981,7 +1981,7 @@ int efa_get_hw_stats(struct ib_device *ibdev, struct rdma_hw_stats *stats,
 }
 
 enum rdma_link_layer efa_port_link_layer(struct ib_device *ibdev,
-                                        u8 port_num)
+                                        u32 port_num)
 {
        return IB_LINK_LAYER_UNSPECIFIED;
 }
index 04b1e8f021f642b1044a793e6c1babaca735c11f..16543f717527e40a26afd80ce7344a1356e3df37 100644 (file)
@@ -962,7 +962,6 @@ void hfi1_put_irq_affinity(struct hfi1_devdata *dd,
                           struct hfi1_msix_entry *msix)
 {
        struct cpu_mask_set *set = NULL;
-       struct hfi1_ctxtdata *rcd;
        struct hfi1_affinity_node *entry;
 
        mutex_lock(&node_affinity.lock);
@@ -976,14 +975,15 @@ void hfi1_put_irq_affinity(struct hfi1_devdata *dd,
        case IRQ_GENERAL:
                /* Don't do accounting for general contexts */
                break;
-       case IRQ_RCVCTXT:
-               rcd = (struct hfi1_ctxtdata *)msix->arg;
+       case IRQ_RCVCTXT: {
+               struct hfi1_ctxtdata *rcd = msix->arg;
+
                /* Don't do accounting for control contexts */
                if (rcd->ctxt != HFI1_CTRL_CTXT)
                        set = &entry->rcv_intr;
                break;
+       }
        case IRQ_NETDEVCTXT:
-               rcd = (struct hfi1_ctxtdata *)msix->arg;
                set = &entry->def_intr;
                break;
        default:
index 993cbf37e0b9e851be553bbe39cfa06234af363f..5eeae8df415ba66b43d68b3547d5851564ada3d9 100644 (file)
@@ -1322,7 +1322,7 @@ CNTR_ELEM(#name, \
          access_ibp_##cntr)
 
 /**
- * hfi_addr_from_offset - return addr for readq/writeq
+ * hfi1_addr_from_offset - return addr for readq/writeq
  * @dd: the dd device
  * @offset: the offset of the CSR within bar0
  *
@@ -8316,7 +8316,7 @@ static void is_interrupt(struct hfi1_devdata *dd, unsigned int source)
 }
 
 /**
- * gerneral_interrupt() -  General interrupt handler
+ * general_interrupt -  General interrupt handler
  * @irq: MSIx IRQ vector
  * @data: hfi1 devdata
  *
@@ -15243,8 +15243,8 @@ int hfi1_init_dd(struct hfi1_devdata *dd)
                 (dd->revision >> CCE_REVISION_SW_SHIFT)
                    & CCE_REVISION_SW_MASK);
 
-       /* alloc netdev data */
-       ret = hfi1_netdev_alloc(dd);
+       /* alloc VNIC/AIP rx data */
+       ret = hfi1_alloc_rx(dd);
        if (ret)
                goto bail_cleanup;
 
@@ -15348,7 +15348,7 @@ bail_clear_intr:
        hfi1_comp_vectors_clean_up(dd);
        msix_clean_up_interrupts(dd);
 bail_cleanup:
-       hfi1_netdev_free(dd);
+       hfi1_free_rx(dd);
        hfi1_pcie_ddcleanup(dd);
 bail_free:
        hfi1_free_devdata(dd);
index 2c6f2de74d4d65cfafef02e022337e29a833b0c6..ac26649d44636996dfb5c4858070ecb3ee66c33f 100644 (file)
@@ -822,11 +822,6 @@ int acquire_lcb_access(struct hfi1_devdata *dd, int sleep_ok);
 int release_lcb_access(struct hfi1_devdata *dd, int sleep_ok);
 #define LCB_START DC_LCB_CSRS
 #define LCB_END   DC_8051_CSRS /* next block is 8051 */
-static inline int is_lcb_offset(u32 offset)
-{
-       return (offset >= LCB_START && offset < LCB_END);
-}
-
 extern uint num_vls;
 
 extern uint disable_integrity;
index 0b64aa87ab73bc8ba1124dc81394ea5b15705a9d..f88bb4af245fef5c66f8e36709f835b2d39d4cb5 100644 (file)
@@ -1026,7 +1026,7 @@ static bool __set_armed_to_active(struct hfi1_packet *packet)
 }
 
 /**
- * armed to active - the fast path for armed to active
+ * set_armed_to_active  - the fast path for armed to active
  * @packet: the packet structure
  *
  * Return true if packet processing needs to bail.
index 91f13140ddf21605c93235a5081d35e98b4a72ef..a414214f60355434f6d73164d0e3b82983668697 100644 (file)
@@ -49,7 +49,7 @@
 #include "trace.h"
 
 /**
- * exp_tid_group_init - initialize exp_tid_set
+ * hfi1_exp_tid_set_init - initialize exp_tid_set
  * @set: the set
  */
 static void hfi1_exp_tid_set_init(struct exp_tid_set *set)
@@ -70,7 +70,7 @@ void hfi1_exp_tid_group_init(struct hfi1_ctxtdata *rcd)
 }
 
 /**
- * alloc_ctxt_rcv_groups - initialize expected receive groups
+ * hfi1_alloc_ctxt_rcv_groups - initialize expected receive groups
  * @rcd: the context to add the groupings to
  */
 int hfi1_alloc_ctxt_rcv_groups(struct hfi1_ctxtdata *rcd)
@@ -100,7 +100,7 @@ int hfi1_alloc_ctxt_rcv_groups(struct hfi1_ctxtdata *rcd)
 }
 
 /**
- * free_ctxt_rcv_groups - free  expected receive groups
+ * hfi1_free_ctxt_rcv_groups - free  expected receive groups
  * @rcd: the context to free
  *
  * The routine dismantles the expect receive linked
index 0e83d4b61e463eb3b4878c614e67747d6213a50d..2cf102b5abd44269c53b1d033ca13c30dd71477f 100644 (file)
@@ -1916,6 +1916,7 @@ int parse_platform_config(struct hfi1_devdata *dd)
                        dd_dev_err(dd, "%s: Failed CRC check at offset %ld\n",
                                   __func__, (ptr -
                                   (u32 *)dd->platform_config.data));
+                       ret = -EINVAL;
                        goto bail;
                }
                /* Jump the CRC DWORD */
index 2a9a040569ebb7b5220b17166e70847b2478123e..867ae0b1aa95938a677b4bc62cf68163afa63ed7 100644 (file)
@@ -69,7 +69,6 @@
 #include <rdma/ib_hdrs.h>
 #include <rdma/opa_addr.h>
 #include <linux/rhashtable.h>
-#include <linux/netdevice.h>
 #include <rdma/rdma_vt.h>
 
 #include "chip_registers.h"
@@ -717,12 +716,6 @@ static inline void incr_cntr64(u64 *cntr)
                (*cntr)++;
 }
 
-static inline void incr_cntr32(u32 *cntr)
-{
-       if (*cntr < (u32)-1LL)
-               (*cntr)++;
-}
-
 #define MAX_NAME_SIZE 64
 struct hfi1_msix_entry {
        enum irq_type type;
@@ -864,7 +857,7 @@ struct hfi1_pportdata {
        u8 rx_pol_inv;
 
        u8 hw_pidx;     /* physical port index */
-       u8 port;        /* IB port number and index into dd->pports - 1 */
+       u32 port;        /* IB port number and index into dd->pports - 1 */
        /* type of neighbor node */
        u8 neighbor_type;
        u8 neighbor_normal;
@@ -1066,6 +1059,7 @@ struct sdma_vl_map;
 #define SERIAL_MAX 16 /* length of the serial number */
 
 typedef int (*send_routine)(struct rvt_qp *, struct hfi1_pkt_state *, u64);
+struct hfi1_netdev_rx;
 struct hfi1_devdata {
        struct hfi1_ibdev verbs_dev;     /* must be first */
        /* pointers to related structs for this device */
@@ -1408,7 +1402,7 @@ struct hfi1_devdata {
        /* Lock to protect IRQ SRC register access */
        spinlock_t irq_src_lock;
        int vnic_num_vports;
-       struct net_device *dummy_netdev;
+       struct hfi1_netdev_rx *netdev_rx;
        struct hfi1_affinity_node *affinity_entry;
 
        /* Keeps track of IPoIB RSM rule users */
@@ -1480,7 +1474,7 @@ int hfi1_create_ctxtdata(struct hfi1_pportdata *ppd, int numa,
                         struct hfi1_ctxtdata **rcd);
 void hfi1_free_ctxt(struct hfi1_ctxtdata *rcd);
 void hfi1_init_pportdata(struct pci_dev *pdev, struct hfi1_pportdata *ppd,
-                        struct hfi1_devdata *dd, u8 hw_pidx, u8 port);
+                        struct hfi1_devdata *dd, u8 hw_pidx, u32 port);
 void hfi1_free_ctxtdata(struct hfi1_devdata *dd, struct hfi1_ctxtdata *rcd);
 int hfi1_rcd_put(struct hfi1_ctxtdata *rcd);
 int hfi1_rcd_get(struct hfi1_ctxtdata *rcd);
@@ -1976,10 +1970,10 @@ static inline struct hfi1_ibdev *dev_from_rdi(struct rvt_dev_info *rdi)
        return container_of(rdi, struct hfi1_ibdev, rdi);
 }
 
-static inline struct hfi1_ibport *to_iport(struct ib_device *ibdev, u8 port)
+static inline struct hfi1_ibport *to_iport(struct ib_device *ibdev, u32 port)
 {
        struct hfi1_devdata *dd = dd_from_ibdev(ibdev);
-       unsigned pidx = port - 1; /* IB number port from 1, hdw from 0 */
+       u32 pidx = port - 1; /* IB number port from 1, hdw from 0 */
 
        WARN_ON(pidx >= dd->num_pports);
        return &dd->pport[pidx].ibport_data;
@@ -2198,7 +2192,7 @@ extern const struct attribute_group ib_hfi1_attr_group;
 int hfi1_device_create(struct hfi1_devdata *dd);
 void hfi1_device_remove(struct hfi1_devdata *dd);
 
-int hfi1_create_port_files(struct ib_device *ibdev, u8 port_num,
+int hfi1_create_port_files(struct ib_device *ibdev, u32 port_num,
                           struct kobject *kobj);
 int hfi1_verbs_register_sysfs(struct hfi1_devdata *dd);
 void hfi1_verbs_unregister_sysfs(struct hfi1_devdata *dd);
index 786c6316273f74964e74650229d193a702dfeaba..e3a8a420c0455e0cebf221fe11eb9aefc20b1a9d 100644 (file)
@@ -627,7 +627,7 @@ static enum hrtimer_restart cca_timer_fn(struct hrtimer *t)
  * Common code for initializing the physical port structure.
  */
 void hfi1_init_pportdata(struct pci_dev *pdev, struct hfi1_pportdata *ppd,
-                        struct hfi1_devdata *dd, u8 hw_pidx, u8 port)
+                        struct hfi1_devdata *dd, u8 hw_pidx, u32 port)
 {
        int i;
        uint default_pkey_idx;
@@ -1775,7 +1775,7 @@ static void remove_one(struct pci_dev *pdev)
        hfi1_unregister_ib_device(dd);
 
        /* free netdev data */
-       hfi1_netdev_free(dd);
+       hfi1_free_rx(dd);
 
        /*
         * Disable the IB link, disable interrupts on the device,
@@ -1860,7 +1860,8 @@ bail:
 }
 
 /**
- * allocate eager buffers, both kernel and user contexts.
+ * hfi1_setup_eagerbufs - llocate eager buffers, both kernel and user
+ * contexts.
  * @rcd: the context we are setting up.
  *
  * Allocate the eager TID buffers and program them into hip.
index d580aa17ae3726c17f865433756a8866ae7db51d..cda81a7843c2452ff183422a1b4c1e4d2acde9e0 100644 (file)
@@ -321,7 +321,7 @@ static inline void iowait_drain_wakeup(struct iowait *wait)
 /**
  * iowait_get_txhead() - get packet off of iowait list
  *
- * @wait iowait_work struture
+ * @wait: iowait_work structure
  */
 static inline struct sdma_txreq *iowait_get_txhead(struct iowait_work *wait)
 {
index f650cac9d424c2c6fe2ca4f9f8f1ca62e151f5bf..2cff38b105ac32ff5d76142c5980a49c272a8a98 100644 (file)
@@ -52,8 +52,9 @@ union hfi1_ipoib_flow {
  * @producer_lock: producer sync lock
  * @consumer_lock: consumer sync lock
  */
+struct ipoib_txreq;
 struct hfi1_ipoib_circ_buf {
-       void **items;
+       struct ipoib_txreq **items;
        unsigned long head;
        unsigned long tail;
        unsigned long max_items;
@@ -125,10 +126,10 @@ hfi1_ipoib_priv(const struct net_device *dev)
        return &((struct hfi1_ipoib_rdma_netdev *)netdev_priv(dev))->dev_priv;
 }
 
-int hfi1_ipoib_send_dma(struct net_device *dev,
-                       struct sk_buff *skb,
-                       struct ib_ah *address,
-                       u32 dqpn);
+int hfi1_ipoib_send(struct net_device *dev,
+                   struct sk_buff *skb,
+                   struct ib_ah *address,
+                   u32 dqpn);
 
 int hfi1_ipoib_txreq_init(struct hfi1_ipoib_dev_priv *priv);
 void hfi1_ipoib_txreq_deinit(struct hfi1_ipoib_dev_priv *priv);
@@ -143,8 +144,10 @@ struct sk_buff *hfi1_ipoib_prepare_skb(struct hfi1_netdev_rxq *rxq,
                                       int size, void *data);
 
 int hfi1_ipoib_rn_get_params(struct ib_device *device,
-                            u8 port_num,
+                            u32 port_num,
                             enum rdma_netdev_t type,
                             struct rdma_netdev_alloc_params *params);
 
+void hfi1_ipoib_tx_timeout(struct net_device *dev, unsigned int q);
+
 #endif /* _IPOIB_H */
index 3242290eb6a7c895eb1e73dcec9aaffb59b03592..e594a961f513e2e4a4c3c77426e43f2c3addf0f5 100644 (file)
@@ -101,14 +101,6 @@ static const struct net_device_ops hfi1_ipoib_netdev_ops = {
        .ndo_get_stats64  = dev_get_tstats64,
 };
 
-static int hfi1_ipoib_send(struct net_device *dev,
-                          struct sk_buff *skb,
-                          struct ib_ah *address,
-                          u32 dqpn)
-{
-       return hfi1_ipoib_send_dma(dev, skb, address, dqpn);
-}
-
 static int hfi1_ipoib_mcast_attach(struct net_device *dev,
                                   struct ib_device *device,
                                   union ib_gid *mgid,
@@ -194,7 +186,7 @@ static void hfi1_ipoib_set_id(struct net_device *dev, int id)
 }
 
 static int hfi1_ipoib_setup_rn(struct ib_device *device,
-                              u8 port_num,
+                              u32 port_num,
                               struct net_device *netdev,
                               void *param)
 {
@@ -204,6 +196,7 @@ static int hfi1_ipoib_setup_rn(struct ib_device *device,
        int rc;
 
        rn->send = hfi1_ipoib_send;
+       rn->tx_timeout = hfi1_ipoib_tx_timeout;
        rn->attach_mcast = hfi1_ipoib_mcast_attach;
        rn->detach_mcast = hfi1_ipoib_mcast_detach;
        rn->set_id = hfi1_ipoib_set_id;
@@ -243,7 +236,7 @@ static int hfi1_ipoib_setup_rn(struct ib_device *device,
 }
 
 int hfi1_ipoib_rn_get_params(struct ib_device *device,
-                            u8 port_num,
+                            u32 port_num,
                             enum rdma_netdev_t type,
                             struct rdma_netdev_alloc_params *params)
 {
index edd4eeac8dd1dd42760d723ac7a5717ee22d709f..993f9838b6c8043fca15e4d420b1743f7984048f 100644 (file)
@@ -15,6 +15,7 @@
 #include "verbs.h"
 #include "trace_ibhdrs.h"
 #include "ipoib.h"
+#include "trace_tx.h"
 
 /* Add a convenience helper */
 #define CIRC_ADD(val, add, size) (((val) + (add)) & ((size) - 1))
@@ -63,12 +64,14 @@ static u64 hfi1_ipoib_used(struct hfi1_ipoib_txq *txq)
 
 static void hfi1_ipoib_stop_txq(struct hfi1_ipoib_txq *txq)
 {
+       trace_hfi1_txq_stop(txq);
        if (atomic_inc_return(&txq->stops) == 1)
                netif_stop_subqueue(txq->priv->netdev, txq->q_idx);
 }
 
 static void hfi1_ipoib_wake_txq(struct hfi1_ipoib_txq *txq)
 {
+       trace_hfi1_txq_wake(txq);
        if (atomic_dec_and_test(&txq->stops))
                netif_wake_subqueue(txq->priv->netdev, txq->q_idx);
 }
@@ -89,8 +92,10 @@ static void hfi1_ipoib_check_queue_depth(struct hfi1_ipoib_txq *txq)
 {
        ++txq->sent_txreqs;
        if (hfi1_ipoib_used(txq) >= hfi1_ipoib_ring_hwat(txq) &&
-           !atomic_xchg(&txq->ring_full, 1))
+           !atomic_xchg(&txq->ring_full, 1)) {
+               trace_hfi1_txq_full(txq);
                hfi1_ipoib_stop_txq(txq);
+       }
 }
 
 static void hfi1_ipoib_check_queue_stopped(struct hfi1_ipoib_txq *txq)
@@ -112,8 +117,10 @@ static void hfi1_ipoib_check_queue_stopped(struct hfi1_ipoib_txq *txq)
         * to protect against ring overflow.
         */
        if (hfi1_ipoib_used(txq) < hfi1_ipoib_ring_lwat(txq) &&
-           atomic_xchg(&txq->ring_full, 0))
+           atomic_xchg(&txq->ring_full, 0)) {
+               trace_hfi1_txq_xmit_unstopped(txq);
                hfi1_ipoib_wake_txq(txq);
+       }
 }
 
 static void hfi1_ipoib_free_tx(struct ipoib_txreq *tx, int budget)
@@ -202,7 +209,7 @@ static void hfi1_ipoib_add_tx(struct ipoib_txreq *tx)
 
                /* Finish storing txreq before incrementing head. */
                smp_store_release(&tx_ring->head, CIRC_ADD(head, 1, max_tx));
-               napi_schedule(tx->txq->napi);
+               napi_schedule_irqoff(tx->txq->napi);
        } else {
                struct hfi1_ipoib_txq *txq = tx->txq;
                struct hfi1_ipoib_dev_priv *priv = tx->priv;
@@ -405,6 +412,7 @@ static struct ipoib_txreq *hfi1_ipoib_send_dma_common(struct net_device *dev,
                                sdma_select_engine_sc(priv->dd,
                                                      txp->flow.tx_queue,
                                                      txp->flow.sc5);
+                       trace_hfi1_flow_switch(txp->txq);
                }
 
                return tx;
@@ -525,6 +533,7 @@ static int hfi1_ipoib_send_dma_list(struct net_device *dev,
        if (txq->flow.as_int != txp->flow.as_int) {
                int ret;
 
+               trace_hfi1_flow_flush(txq);
                ret = hfi1_ipoib_flush_tx_list(dev, txq);
                if (unlikely(ret)) {
                        if (ret == -EBUSY)
@@ -572,10 +581,10 @@ static u8 hfi1_ipoib_calc_entropy(struct sk_buff *skb)
        return (u8)skb_get_queue_mapping(skb);
 }
 
-int hfi1_ipoib_send_dma(struct net_device *dev,
-                       struct sk_buff *skb,
-                       struct ib_ah *address,
-                       u32 dqpn)
+int hfi1_ipoib_send(struct net_device *dev,
+                   struct sk_buff *skb,
+                   struct ib_ah *address,
+                   u32 dqpn)
 {
        struct hfi1_ipoib_dev_priv *priv = hfi1_ipoib_priv(dev);
        struct ipoib_txparms txp;
@@ -635,8 +644,10 @@ static int hfi1_ipoib_sdma_sleep(struct sdma_engine *sde,
                        /* came from non-list submit */
                        list_add_tail(&txreq->list, &txq->tx_list);
                if (list_empty(&txq->wait.list)) {
-                       if (!atomic_xchg(&txq->no_desc, 1))
+                       if (!atomic_xchg(&txq->no_desc, 1)) {
+                               trace_hfi1_txq_queued(txq);
                                hfi1_ipoib_stop_txq(txq);
+                       }
                        iowait_queue(pkts_sent, wait->iow, &sde->dmawait);
                }
 
@@ -659,6 +670,7 @@ static void hfi1_ipoib_sdma_wakeup(struct iowait *wait, int reason)
        struct hfi1_ipoib_txq *txq =
                container_of(wait, struct hfi1_ipoib_txq, wait);
 
+       trace_hfi1_txq_wakeup(txq);
        if (likely(txq->priv->netdev->reg_state == NETREG_REGISTERED))
                iowait_schedule(wait, system_highpri_wq, WORK_CPU_UNBOUND);
 }
@@ -702,14 +714,14 @@ int hfi1_ipoib_txreq_init(struct hfi1_ipoib_dev_priv *priv)
 
        priv->tx_napis = kcalloc_node(dev->num_tx_queues,
                                      sizeof(struct napi_struct),
-                                     GFP_ATOMIC,
+                                     GFP_KERNEL,
                                      priv->dd->node);
        if (!priv->tx_napis)
                goto free_txreq_cache;
 
        priv->txqs = kcalloc_node(dev->num_tx_queues,
                                  sizeof(struct hfi1_ipoib_txq),
-                                 GFP_ATOMIC,
+                                 GFP_KERNEL,
                                  priv->dd->node);
        if (!priv->txqs)
                goto free_tx_napis;
@@ -741,9 +753,9 @@ int hfi1_ipoib_txreq_init(struct hfi1_ipoib_dev_priv *priv)
                                             priv->dd->node);
 
                txq->tx_ring.items =
-                       vzalloc_node(array_size(tx_ring_size,
-                                               sizeof(struct ipoib_txreq)),
-                                    priv->dd->node);
+                       kcalloc_node(tx_ring_size,
+                                    sizeof(struct ipoib_txreq *),
+                                    GFP_KERNEL, priv->dd->node);
                if (!txq->tx_ring.items)
                        goto free_txqs;
 
@@ -764,7 +776,7 @@ free_txqs:
                struct hfi1_ipoib_txq *txq = &priv->txqs[i];
 
                netif_napi_del(txq->napi);
-               vfree(txq->tx_ring.items);
+               kfree(txq->tx_ring.items);
        }
 
        kfree(priv->txqs);
@@ -817,7 +829,7 @@ void hfi1_ipoib_txreq_deinit(struct hfi1_ipoib_dev_priv *priv)
                hfi1_ipoib_drain_tx_list(txq);
                netif_napi_del(txq->napi);
                (void)hfi1_ipoib_drain_tx_ring(txq, txq->tx_ring.max_items);
-               vfree(txq->tx_ring.items);
+               kfree(txq->tx_ring.items);
        }
 
        kfree(priv->txqs);
@@ -854,3 +866,32 @@ void hfi1_ipoib_napi_tx_disable(struct net_device *dev)
                (void)hfi1_ipoib_drain_tx_ring(txq, txq->tx_ring.max_items);
        }
 }
+
+void hfi1_ipoib_tx_timeout(struct net_device *dev, unsigned int q)
+{
+       struct hfi1_ipoib_dev_priv *priv = hfi1_ipoib_priv(dev);
+       struct hfi1_ipoib_txq *txq = &priv->txqs[q];
+       u64 completed = atomic64_read(&txq->complete_txreqs);
+
+       dd_dev_info(priv->dd, "timeout txq %llx q %u stopped %u stops %d no_desc %d ring_full %d\n",
+                   (unsigned long long)txq, q,
+                   __netif_subqueue_stopped(dev, txq->q_idx),
+                   atomic_read(&txq->stops),
+                   atomic_read(&txq->no_desc),
+                   atomic_read(&txq->ring_full));
+       dd_dev_info(priv->dd, "sde %llx engine %u\n",
+                   (unsigned long long)txq->sde,
+                   txq->sde ? txq->sde->this_idx : 0);
+       dd_dev_info(priv->dd, "flow %x\n", txq->flow.as_int);
+       dd_dev_info(priv->dd, "sent %llu completed %llu used %llu\n",
+                   txq->sent_txreqs, completed, hfi1_ipoib_used(txq));
+       dd_dev_info(priv->dd, "tx_queue_len %u max_items %lu\n",
+                   dev->tx_queue_len, txq->tx_ring.max_items);
+       dd_dev_info(priv->dd, "head %lu tail %lu\n",
+                   txq->tx_ring.head, txq->tx_ring.tail);
+       dd_dev_info(priv->dd, "wait queued %u\n",
+                   !list_empty(&txq->wait.list));
+       dd_dev_info(priv->dd, "tx_list empty %u\n",
+                   list_empty(&txq->tx_list));
+}
+
index e2f2f7847aedcd25a93b76ba736b14c56ea616d9..1fe5e702f31d2dadc8a52844b2f162a310784a9a 100644 (file)
@@ -108,7 +108,7 @@ static u16 hfi1_lookup_pkey_value(struct hfi1_ibport *ibp, int pkey_idx)
        return 0;
 }
 
-void hfi1_event_pkey_change(struct hfi1_devdata *dd, u8 port)
+void hfi1_event_pkey_change(struct hfi1_devdata *dd, u32 port)
 {
        struct ib_event event;
 
@@ -297,7 +297,7 @@ static struct ib_ah *hfi1_create_qp0_ah(struct hfi1_ibport *ibp, u32 dlid)
        struct rvt_qp *qp0;
        struct hfi1_pportdata *ppd = ppd_from_ibp(ibp);
        struct hfi1_devdata *dd = dd_from_ppd(ppd);
-       u8 port_num = ppd->port;
+       u32 port_num = ppd->port;
 
        memset(&attr, 0, sizeof(attr));
        attr.type = rdma_ah_find_type(&dd->verbs_dev.rdi.ibdev, port_num);
@@ -515,7 +515,7 @@ static void bad_mkey(struct hfi1_ibport *ibp, struct ib_mad_hdr *mad,
 /*
  * Send a Port Capability Mask Changed trap (ch. 14.3.11).
  */
-void hfi1_cap_mask_chg(struct rvt_dev_info *rdi, u8 port_num)
+void hfi1_cap_mask_chg(struct rvt_dev_info *rdi, u32 port_num)
 {
        struct trap_node *trap;
        struct hfi1_ibdev *verbs_dev = dev_from_rdi(rdi);
@@ -581,7 +581,7 @@ void hfi1_node_desc_chg(struct hfi1_ibport *ibp)
 
 static int __subn_get_opa_nodedesc(struct opa_smp *smp, u32 am,
                                   u8 *data, struct ib_device *ibdev,
-                                  u8 port, u32 *resp_len, u32 max_len)
+                                  u32 port, u32 *resp_len, u32 max_len)
 {
        struct opa_node_description *nd;
 
@@ -601,12 +601,12 @@ static int __subn_get_opa_nodedesc(struct opa_smp *smp, u32 am,
 }
 
 static int __subn_get_opa_nodeinfo(struct opa_smp *smp, u32 am, u8 *data,
-                                  struct ib_device *ibdev, u8 port,
+                                  struct ib_device *ibdev, u32 port,
                                   u32 *resp_len, u32 max_len)
 {
        struct opa_node_info *ni;
        struct hfi1_devdata *dd = dd_from_ibdev(ibdev);
-       unsigned pidx = port - 1; /* IB number port from 1, hw from 0 */
+       u32 pidx = port - 1; /* IB number port from 1, hw from 0 */
 
        ni = (struct opa_node_info *)data;
 
@@ -641,11 +641,11 @@ static int __subn_get_opa_nodeinfo(struct opa_smp *smp, u32 am, u8 *data,
 }
 
 static int subn_get_nodeinfo(struct ib_smp *smp, struct ib_device *ibdev,
-                            u8 port)
+                            u32 port)
 {
        struct ib_node_info *nip = (struct ib_node_info *)&smp->data;
        struct hfi1_devdata *dd = dd_from_ibdev(ibdev);
-       unsigned pidx = port - 1; /* IB number port from 1, hw from 0 */
+       u32 pidx = port - 1; /* IB number port from 1, hw from 0 */
 
        /* GUID 0 is illegal */
        if (smp->attr_mod || pidx >= dd->num_pports ||
@@ -794,7 +794,7 @@ void read_ltp_rtt(struct hfi1_devdata *dd)
 }
 
 static int __subn_get_opa_portinfo(struct opa_smp *smp, u32 am, u8 *data,
-                                  struct ib_device *ibdev, u8 port,
+                                  struct ib_device *ibdev, u32 port,
                                   u32 *resp_len, u32 max_len)
 {
        int i;
@@ -1009,7 +1009,7 @@ static int __subn_get_opa_portinfo(struct opa_smp *smp, u32 am, u8 *data,
  * @port: the IB port number
  * @pkeys: the pkey table is placed here
  */
-static int get_pkeys(struct hfi1_devdata *dd, u8 port, u16 *pkeys)
+static int get_pkeys(struct hfi1_devdata *dd, u32 port, u16 *pkeys)
 {
        struct hfi1_pportdata *ppd = dd->pport + port - 1;
 
@@ -1019,7 +1019,7 @@ static int get_pkeys(struct hfi1_devdata *dd, u8 port, u16 *pkeys)
 }
 
 static int __subn_get_opa_pkeytable(struct opa_smp *smp, u32 am, u8 *data,
-                                   struct ib_device *ibdev, u8 port,
+                                   struct ib_device *ibdev, u32 port,
                                    u32 *resp_len, u32 max_len)
 {
        struct hfi1_devdata *dd = dd_from_ibdev(ibdev);
@@ -1349,7 +1349,7 @@ static int set_port_states(struct hfi1_pportdata *ppd, struct opa_smp *smp,
  *
  */
 static int __subn_set_opa_portinfo(struct opa_smp *smp, u32 am, u8 *data,
-                                  struct ib_device *ibdev, u8 port,
+                                  struct ib_device *ibdev, u32 port,
                                   u32 *resp_len, u32 max_len, int local_mad)
 {
        struct opa_port_info *pi = (struct opa_port_info *)data;
@@ -1667,7 +1667,7 @@ get_only:
  * @port: the IB port number
  * @pkeys: the PKEY table
  */
-static int set_pkeys(struct hfi1_devdata *dd, u8 port, u16 *pkeys)
+static int set_pkeys(struct hfi1_devdata *dd, u32 port, u16 *pkeys)
 {
        struct hfi1_pportdata *ppd;
        int i;
@@ -1718,7 +1718,7 @@ static int set_pkeys(struct hfi1_devdata *dd, u8 port, u16 *pkeys)
 }
 
 static int __subn_set_opa_pkeytable(struct opa_smp *smp, u32 am, u8 *data,
-                                   struct ib_device *ibdev, u8 port,
+                                   struct ib_device *ibdev, u32 port,
                                    u32 *resp_len, u32 max_len)
 {
        struct hfi1_devdata *dd = dd_from_ibdev(ibdev);
@@ -1732,7 +1732,7 @@ static int __subn_set_opa_pkeytable(struct opa_smp *smp, u32 am, u8 *data,
        u32 size = 0;
 
        if (n_blocks_sent == 0) {
-               pr_warn("OPA Get PKey AM Invalid : P = %d; B = 0x%x; N = 0x%x\n",
+               pr_warn("OPA Get PKey AM Invalid : P = %u; B = 0x%x; N = 0x%x\n",
                        port, start_block, n_blocks_sent);
                smp->status |= IB_SMP_INVALID_FIELD;
                return reply((struct ib_mad_hdr *)smp);
@@ -1825,7 +1825,7 @@ static int get_sc2vlt_tables(struct hfi1_devdata *dd, void *data)
 }
 
 static int __subn_get_opa_sl_to_sc(struct opa_smp *smp, u32 am, u8 *data,
-                                  struct ib_device *ibdev, u8 port,
+                                  struct ib_device *ibdev, u32 port,
                                   u32 *resp_len, u32 max_len)
 {
        struct hfi1_ibport *ibp = to_iport(ibdev, port);
@@ -1848,7 +1848,7 @@ static int __subn_get_opa_sl_to_sc(struct opa_smp *smp, u32 am, u8 *data,
 }
 
 static int __subn_set_opa_sl_to_sc(struct opa_smp *smp, u32 am, u8 *data,
-                                  struct ib_device *ibdev, u8 port,
+                                  struct ib_device *ibdev, u32 port,
                                   u32 *resp_len, u32 max_len)
 {
        struct hfi1_ibport *ibp = to_iport(ibdev, port);
@@ -1877,7 +1877,7 @@ static int __subn_set_opa_sl_to_sc(struct opa_smp *smp, u32 am, u8 *data,
 }
 
 static int __subn_get_opa_sc_to_sl(struct opa_smp *smp, u32 am, u8 *data,
-                                  struct ib_device *ibdev, u8 port,
+                                  struct ib_device *ibdev, u32 port,
                                   u32 *resp_len, u32 max_len)
 {
        struct hfi1_ibport *ibp = to_iport(ibdev, port);
@@ -1900,7 +1900,7 @@ static int __subn_get_opa_sc_to_sl(struct opa_smp *smp, u32 am, u8 *data,
 }
 
 static int __subn_set_opa_sc_to_sl(struct opa_smp *smp, u32 am, u8 *data,
-                                  struct ib_device *ibdev, u8 port,
+                                  struct ib_device *ibdev, u32 port,
                                   u32 *resp_len, u32 max_len)
 {
        struct hfi1_ibport *ibp = to_iport(ibdev, port);
@@ -1921,7 +1921,7 @@ static int __subn_set_opa_sc_to_sl(struct opa_smp *smp, u32 am, u8 *data,
 }
 
 static int __subn_get_opa_sc_to_vlt(struct opa_smp *smp, u32 am, u8 *data,
-                                   struct ib_device *ibdev, u8 port,
+                                   struct ib_device *ibdev, u32 port,
                                    u32 *resp_len, u32 max_len)
 {
        u32 n_blocks = OPA_AM_NBLK(am);
@@ -1943,7 +1943,7 @@ static int __subn_get_opa_sc_to_vlt(struct opa_smp *smp, u32 am, u8 *data,
 }
 
 static int __subn_set_opa_sc_to_vlt(struct opa_smp *smp, u32 am, u8 *data,
-                                   struct ib_device *ibdev, u8 port,
+                                   struct ib_device *ibdev, u32 port,
                                    u32 *resp_len, u32 max_len)
 {
        u32 n_blocks = OPA_AM_NBLK(am);
@@ -1985,7 +1985,7 @@ static int __subn_set_opa_sc_to_vlt(struct opa_smp *smp, u32 am, u8 *data,
 }
 
 static int __subn_get_opa_sc_to_vlnt(struct opa_smp *smp, u32 am, u8 *data,
-                                    struct ib_device *ibdev, u8 port,
+                                    struct ib_device *ibdev, u32 port,
                                     u32 *resp_len, u32 max_len)
 {
        u32 n_blocks = OPA_AM_NPORT(am);
@@ -2010,7 +2010,7 @@ static int __subn_get_opa_sc_to_vlnt(struct opa_smp *smp, u32 am, u8 *data,
 }
 
 static int __subn_set_opa_sc_to_vlnt(struct opa_smp *smp, u32 am, u8 *data,
-                                    struct ib_device *ibdev, u8 port,
+                                    struct ib_device *ibdev, u32 port,
                                     u32 *resp_len, u32 max_len)
 {
        u32 n_blocks = OPA_AM_NPORT(am);
@@ -2042,7 +2042,7 @@ static int __subn_set_opa_sc_to_vlnt(struct opa_smp *smp, u32 am, u8 *data,
 }
 
 static int __subn_get_opa_psi(struct opa_smp *smp, u32 am, u8 *data,
-                             struct ib_device *ibdev, u8 port,
+                             struct ib_device *ibdev, u32 port,
                              u32 *resp_len, u32 max_len)
 {
        u32 nports = OPA_AM_NPORT(am);
@@ -2084,7 +2084,7 @@ static int __subn_get_opa_psi(struct opa_smp *smp, u32 am, u8 *data,
 }
 
 static int __subn_set_opa_psi(struct opa_smp *smp, u32 am, u8 *data,
-                             struct ib_device *ibdev, u8 port,
+                             struct ib_device *ibdev, u32 port,
                              u32 *resp_len, u32 max_len, int local_mad)
 {
        u32 nports = OPA_AM_NPORT(am);
@@ -2132,7 +2132,7 @@ static int __subn_set_opa_psi(struct opa_smp *smp, u32 am, u8 *data,
 }
 
 static int __subn_get_opa_cable_info(struct opa_smp *smp, u32 am, u8 *data,
-                                    struct ib_device *ibdev, u8 port,
+                                    struct ib_device *ibdev, u32 port,
                                     u32 *resp_len, u32 max_len)
 {
        struct hfi1_devdata *dd = dd_from_ibdev(ibdev);
@@ -2184,7 +2184,7 @@ static int __subn_get_opa_cable_info(struct opa_smp *smp, u32 am, u8 *data,
 }
 
 static int __subn_get_opa_bct(struct opa_smp *smp, u32 am, u8 *data,
-                             struct ib_device *ibdev, u8 port, u32 *resp_len,
+                             struct ib_device *ibdev, u32 port, u32 *resp_len,
                              u32 max_len)
 {
        u32 num_ports = OPA_AM_NPORT(am);
@@ -2208,7 +2208,7 @@ static int __subn_get_opa_bct(struct opa_smp *smp, u32 am, u8 *data,
 }
 
 static int __subn_set_opa_bct(struct opa_smp *smp, u32 am, u8 *data,
-                             struct ib_device *ibdev, u8 port, u32 *resp_len,
+                             struct ib_device *ibdev, u32 port, u32 *resp_len,
                              u32 max_len)
 {
        u32 num_ports = OPA_AM_NPORT(am);
@@ -2232,7 +2232,7 @@ static int __subn_set_opa_bct(struct opa_smp *smp, u32 am, u8 *data,
 }
 
 static int __subn_get_opa_vl_arb(struct opa_smp *smp, u32 am, u8 *data,
-                                struct ib_device *ibdev, u8 port,
+                                struct ib_device *ibdev, u32 port,
                                 u32 *resp_len, u32 max_len)
 {
        struct hfi1_pportdata *ppd = ppd_from_ibp(to_iport(ibdev, port));
@@ -2274,7 +2274,7 @@ static int __subn_get_opa_vl_arb(struct opa_smp *smp, u32 am, u8 *data,
 }
 
 static int __subn_set_opa_vl_arb(struct opa_smp *smp, u32 am, u8 *data,
-                                struct ib_device *ibdev, u8 port,
+                                struct ib_device *ibdev, u32 port,
                                 u32 *resp_len, u32 max_len)
 {
        struct hfi1_pportdata *ppd = ppd_from_ibp(to_iport(ibdev, port));
@@ -2722,7 +2722,7 @@ u64 get_xmit_wait_counters(struct hfi1_pportdata *ppd,
 
 static int pma_get_opa_portstatus(struct opa_pma_mad *pmp,
                                  struct ib_device *ibdev,
-                                 u8 port, u32 *resp_len)
+                                 u32 port, u32 *resp_len)
 {
        struct opa_port_status_req *req =
                (struct opa_port_status_req *)pmp->data;
@@ -2732,7 +2732,7 @@ static int pma_get_opa_portstatus(struct opa_pma_mad *pmp,
        unsigned long vl;
        size_t response_data_size;
        u32 nports = be32_to_cpu(pmp->mad_hdr.attr_mod) >> 24;
-       u8 port_num = req->port_num;
+       u32 port_num = req->port_num;
        u8 num_vls = hweight64(vl_select_mask);
        struct _vls_pctrs *vlinfo;
        struct hfi1_ibport *ibp = to_iport(ibdev, port);
@@ -2888,7 +2888,7 @@ static int pma_get_opa_portstatus(struct opa_pma_mad *pmp,
        return reply((struct ib_mad_hdr *)pmp);
 }
 
-static u64 get_error_counter_summary(struct ib_device *ibdev, u8 port,
+static u64 get_error_counter_summary(struct ib_device *ibdev, u32 port,
                                     u8 res_lli, u8 res_ler)
 {
        struct hfi1_devdata *dd = dd_from_ibdev(ibdev);
@@ -2973,7 +2973,7 @@ static void pma_get_opa_port_dctrs(struct ib_device *ibdev,
 
 static int pma_get_opa_datacounters(struct opa_pma_mad *pmp,
                                    struct ib_device *ibdev,
-                                   u8 port, u32 *resp_len)
+                                   u32 port, u32 *resp_len)
 {
        struct opa_port_data_counters_msg *req =
                (struct opa_port_data_counters_msg *)pmp->data;
@@ -2987,7 +2987,7 @@ static int pma_get_opa_datacounters(struct opa_pma_mad *pmp,
        u8 lq, num_vls;
        u8 res_lli, res_ler;
        u64 port_mask;
-       u8 port_num;
+       u32 port_num;
        unsigned long vl;
        unsigned long vl_select_mask;
        int vfi;
@@ -3123,7 +3123,7 @@ static int pma_get_opa_datacounters(struct opa_pma_mad *pmp,
 }
 
 static int pma_get_ib_portcounters_ext(struct ib_pma_mad *pmp,
-                                      struct ib_device *ibdev, u8 port)
+                                      struct ib_device *ibdev, u32 port)
 {
        struct ib_pma_portcounters_ext *p = (struct ib_pma_portcounters_ext *)
                                                pmp->data;
@@ -3151,7 +3151,7 @@ bail:
 }
 
 static void pma_get_opa_port_ectrs(struct ib_device *ibdev,
-                                  struct _port_ectrs *rsp, u8 port)
+                                  struct _port_ectrs *rsp, u32 port)
 {
        u64 tmp, tmp2;
        struct hfi1_devdata *dd = dd_from_ibdev(ibdev);
@@ -3194,11 +3194,11 @@ static void pma_get_opa_port_ectrs(struct ib_device *ibdev,
 
 static int pma_get_opa_porterrors(struct opa_pma_mad *pmp,
                                  struct ib_device *ibdev,
-                                 u8 port, u32 *resp_len)
+                                 u32 port, u32 *resp_len)
 {
        size_t response_data_size;
        struct _port_ectrs *rsp;
-       u8 port_num;
+       u32 port_num;
        struct opa_port_error_counters64_msg *req;
        struct hfi1_devdata *dd = dd_from_ibdev(ibdev);
        u32 num_ports;
@@ -3283,7 +3283,7 @@ static int pma_get_opa_porterrors(struct opa_pma_mad *pmp,
 }
 
 static int pma_get_ib_portcounters(struct ib_pma_mad *pmp,
-                                  struct ib_device *ibdev, u8 port)
+                                  struct ib_device *ibdev, u32 port)
 {
        struct ib_pma_portcounters *p = (struct ib_pma_portcounters *)
                pmp->data;
@@ -3369,7 +3369,7 @@ bail:
 
 static int pma_get_opa_errorinfo(struct opa_pma_mad *pmp,
                                 struct ib_device *ibdev,
-                                u8 port, u32 *resp_len)
+                                u32 port, u32 *resp_len)
 {
        size_t response_data_size;
        struct _port_ei *rsp;
@@ -3377,7 +3377,7 @@ static int pma_get_opa_errorinfo(struct opa_pma_mad *pmp,
        struct hfi1_devdata *dd = dd_from_ibdev(ibdev);
        u64 port_mask;
        u32 num_ports;
-       u8 port_num;
+       u32 port_num;
        u8 num_pslm;
        u64 reg;
 
@@ -3468,7 +3468,7 @@ static int pma_get_opa_errorinfo(struct opa_pma_mad *pmp,
 
 static int pma_set_opa_portstatus(struct opa_pma_mad *pmp,
                                  struct ib_device *ibdev,
-                                 u8 port, u32 *resp_len)
+                                 u32 port, u32 *resp_len)
 {
        struct opa_clear_port_status *req =
                (struct opa_clear_port_status *)pmp->data;
@@ -3620,14 +3620,14 @@ static int pma_set_opa_portstatus(struct opa_pma_mad *pmp,
 
 static int pma_set_opa_errorinfo(struct opa_pma_mad *pmp,
                                 struct ib_device *ibdev,
-                                u8 port, u32 *resp_len)
+                                u32 port, u32 *resp_len)
 {
        struct _port_ei *rsp;
        struct opa_port_error_info_msg *req;
        struct hfi1_devdata *dd = dd_from_ibdev(ibdev);
        u64 port_mask;
        u32 num_ports;
-       u8 port_num;
+       u32 port_num;
        u8 num_pslm;
        u32 error_info_select;
 
@@ -3702,7 +3702,7 @@ struct opa_congestion_info_attr {
 } __packed;
 
 static int __subn_get_opa_cong_info(struct opa_smp *smp, u32 am, u8 *data,
-                                   struct ib_device *ibdev, u8 port,
+                                   struct ib_device *ibdev, u32 port,
                                    u32 *resp_len, u32 max_len)
 {
        struct opa_congestion_info_attr *p =
@@ -3727,7 +3727,7 @@ static int __subn_get_opa_cong_info(struct opa_smp *smp, u32 am, u8 *data,
 
 static int __subn_get_opa_cong_setting(struct opa_smp *smp, u32 am,
                                       u8 *data, struct ib_device *ibdev,
-                                      u8 port, u32 *resp_len, u32 max_len)
+                                      u32 port, u32 *resp_len, u32 max_len)
 {
        int i;
        struct opa_congestion_setting_attr *p =
@@ -3819,7 +3819,7 @@ static void apply_cc_state(struct hfi1_pportdata *ppd)
 }
 
 static int __subn_set_opa_cong_setting(struct opa_smp *smp, u32 am, u8 *data,
-                                      struct ib_device *ibdev, u8 port,
+                                      struct ib_device *ibdev, u32 port,
                                       u32 *resp_len, u32 max_len)
 {
        struct opa_congestion_setting_attr *p =
@@ -3860,7 +3860,7 @@ static int __subn_set_opa_cong_setting(struct opa_smp *smp, u32 am, u8 *data,
 
 static int __subn_get_opa_hfi1_cong_log(struct opa_smp *smp, u32 am,
                                        u8 *data, struct ib_device *ibdev,
-                                       u8 port, u32 *resp_len, u32 max_len)
+                                       u32 port, u32 *resp_len, u32 max_len)
 {
        struct hfi1_ibport *ibp = to_iport(ibdev, port);
        struct hfi1_pportdata *ppd = ppd_from_ibp(ibp);
@@ -3925,7 +3925,7 @@ static int __subn_get_opa_hfi1_cong_log(struct opa_smp *smp, u32 am,
 }
 
 static int __subn_get_opa_cc_table(struct opa_smp *smp, u32 am, u8 *data,
-                                  struct ib_device *ibdev, u8 port,
+                                  struct ib_device *ibdev, u32 port,
                                   u32 *resp_len, u32 max_len)
 {
        struct ib_cc_table_attr *cc_table_attr =
@@ -3977,7 +3977,7 @@ static int __subn_get_opa_cc_table(struct opa_smp *smp, u32 am, u8 *data,
 }
 
 static int __subn_set_opa_cc_table(struct opa_smp *smp, u32 am, u8 *data,
-                                  struct ib_device *ibdev, u8 port,
+                                  struct ib_device *ibdev, u32 port,
                                   u32 *resp_len, u32 max_len)
 {
        struct ib_cc_table_attr *p = (struct ib_cc_table_attr *)data;
@@ -4036,7 +4036,7 @@ struct opa_led_info {
 #define OPA_LED_MASK   BIT(OPA_LED_SHIFT)
 
 static int __subn_get_opa_led_info(struct opa_smp *smp, u32 am, u8 *data,
-                                  struct ib_device *ibdev, u8 port,
+                                  struct ib_device *ibdev, u32 port,
                                   u32 *resp_len, u32 max_len)
 {
        struct hfi1_devdata *dd = dd_from_ibdev(ibdev);
@@ -4066,7 +4066,7 @@ static int __subn_get_opa_led_info(struct opa_smp *smp, u32 am, u8 *data,
 }
 
 static int __subn_set_opa_led_info(struct opa_smp *smp, u32 am, u8 *data,
-                                  struct ib_device *ibdev, u8 port,
+                                  struct ib_device *ibdev, u32 port,
                                   u32 *resp_len, u32 max_len)
 {
        struct hfi1_devdata *dd = dd_from_ibdev(ibdev);
@@ -4089,7 +4089,7 @@ static int __subn_set_opa_led_info(struct opa_smp *smp, u32 am, u8 *data,
 }
 
 static int subn_get_opa_sma(__be16 attr_id, struct opa_smp *smp, u32 am,
-                           u8 *data, struct ib_device *ibdev, u8 port,
+                           u8 *data, struct ib_device *ibdev, u32 port,
                            u32 *resp_len, u32 max_len)
 {
        int ret;
@@ -4179,7 +4179,7 @@ static int subn_get_opa_sma(__be16 attr_id, struct opa_smp *smp, u32 am,
 }
 
 static int subn_set_opa_sma(__be16 attr_id, struct opa_smp *smp, u32 am,
-                           u8 *data, struct ib_device *ibdev, u8 port,
+                           u8 *data, struct ib_device *ibdev, u32 port,
                            u32 *resp_len, u32 max_len, int local_mad)
 {
        int ret;
@@ -4254,7 +4254,7 @@ static inline void set_aggr_error(struct opa_aggregate *ag)
 }
 
 static int subn_get_opa_aggregate(struct opa_smp *smp,
-                                 struct ib_device *ibdev, u8 port,
+                                 struct ib_device *ibdev, u32 port,
                                  u32 *resp_len)
 {
        int i;
@@ -4303,7 +4303,7 @@ static int subn_get_opa_aggregate(struct opa_smp *smp,
 }
 
 static int subn_set_opa_aggregate(struct opa_smp *smp,
-                                 struct ib_device *ibdev, u8 port,
+                                 struct ib_device *ibdev, u32 port,
                                  u32 *resp_len, int local_mad)
 {
        int i;
@@ -4509,7 +4509,7 @@ static int hfi1_pkey_validation_pma(struct hfi1_ibport *ibp,
 }
 
 static int process_subn_opa(struct ib_device *ibdev, int mad_flags,
-                           u8 port, const struct opa_mad *in_mad,
+                           u32 port, const struct opa_mad *in_mad,
                            struct opa_mad *out_mad,
                            u32 *resp_len, int local_mad)
 {
@@ -4614,7 +4614,7 @@ static int process_subn_opa(struct ib_device *ibdev, int mad_flags,
 }
 
 static int process_subn(struct ib_device *ibdev, int mad_flags,
-                       u8 port, const struct ib_mad *in_mad,
+                       u32 port, const struct ib_mad *in_mad,
                        struct ib_mad *out_mad)
 {
        struct ib_smp *smp = (struct ib_smp *)out_mad;
@@ -4672,7 +4672,7 @@ static int process_subn(struct ib_device *ibdev, int mad_flags,
        return ret;
 }
 
-static int process_perf(struct ib_device *ibdev, u8 port,
+static int process_perf(struct ib_device *ibdev, u32 port,
                        const struct ib_mad *in_mad,
                        struct ib_mad *out_mad)
 {
@@ -4734,7 +4734,7 @@ static int process_perf(struct ib_device *ibdev, u8 port,
        return ret;
 }
 
-static int process_perf_opa(struct ib_device *ibdev, u8 port,
+static int process_perf_opa(struct ib_device *ibdev, u32 port,
                            const struct opa_mad *in_mad,
                            struct opa_mad *out_mad, u32 *resp_len)
 {
@@ -4816,7 +4816,7 @@ static int process_perf_opa(struct ib_device *ibdev, u8 port,
 }
 
 static int hfi1_process_opa_mad(struct ib_device *ibdev, int mad_flags,
-                               u8 port, const struct ib_wc *in_wc,
+                               u32 port, const struct ib_wc *in_wc,
                                const struct ib_grh *in_grh,
                                const struct opa_mad *in_mad,
                                struct opa_mad *out_mad, size_t *out_mad_size,
@@ -4869,7 +4869,7 @@ bail:
        return ret;
 }
 
-static int hfi1_process_ib_mad(struct ib_device *ibdev, int mad_flags, u8 port,
+static int hfi1_process_ib_mad(struct ib_device *ibdev, int mad_flags, u32 port,
                               const struct ib_wc *in_wc,
                               const struct ib_grh *in_grh,
                               const struct ib_mad *in_mad,
@@ -4914,7 +4914,7 @@ static int hfi1_process_ib_mad(struct ib_device *ibdev, int mad_flags, u8 port,
  *
  * This is called by the ib_mad module.
  */
-int hfi1_process_mad(struct ib_device *ibdev, int mad_flags, u8 port,
+int hfi1_process_mad(struct ib_device *ibdev, int mad_flags, u32 port,
                     const struct ib_wc *in_wc, const struct ib_grh *in_grh,
                     const struct ib_mad *in_mad, struct ib_mad *out_mad,
                     size_t *out_mad_size, u16 *out_mad_pkey_index)
index 889e63d3f2ccd087699ce699a1310195913e70e1..0205d308ef5e9beded85bcb1cf079e6659bf912e 100644 (file)
@@ -436,7 +436,7 @@ struct sc2vlnt {
                    COUNTER_MASK(1, 3) | \
                    COUNTER_MASK(1, 4))
 
-void hfi1_event_pkey_change(struct hfi1_devdata *dd, u8 port);
+void hfi1_event_pkey_change(struct hfi1_devdata *dd, u32 port);
 void hfi1_handle_trap_timer(struct timer_list *t);
 u16 tx_link_width(u16 link_width);
 u64 get_xmit_wait_counters(struct hfi1_pportdata *ppd, u16 link_width,
index f3fb28e3d5d74060f9d299df5870292f621fff79..d213f65d4cdd0ff5fe9a34d5617e3ccb149d94d9 100644 (file)
@@ -89,7 +89,7 @@ int hfi1_mmu_rb_register(void *ops_arg,
        struct mmu_rb_handler *h;
        int ret;
 
-       h = kmalloc(sizeof(*h), GFP_KERNEL);
+       h = kzalloc(sizeof(*h), GFP_KERNEL);
        if (!h)
                return -ENOMEM;
 
index cf3040bb177f6cd18cd9e2bf1813e65a93fc6e6f..57a5f02ebc777f5acf95cf99267d21b7552e2f86 100644 (file)
@@ -206,7 +206,7 @@ int msix_request_rcd_irq(struct hfi1_ctxtdata *rcd)
 }
 
 /**
- * msix_request_rcd_irq() - Helper function for RCVAVAIL IRQs
+ * msix_netdev_request_rcd_irq  - Helper function for RCVAVAIL IRQs
  * for netdev context
  * @rcd: valid netdev contexti
  */
@@ -221,7 +221,7 @@ int msix_netdev_request_rcd_irq(struct hfi1_ctxtdata *rcd)
 }
 
 /**
- * msix_request_smda_ira() - Helper for getting SDMA IRQ resources
+ * msix_request_sdma_irq  - Helper for getting SDMA IRQ resources
  * @sde: valid sdma engine
  *
  */
@@ -243,7 +243,7 @@ int msix_request_sdma_irq(struct sdma_engine *sde)
 }
 
 /**
- * msix_request_general_irq(void) - Helper for getting general IRQ
+ * msix_request_general_irq - Helper for getting general IRQ
  * resources
  * @dd: valid device data
  */
@@ -269,7 +269,7 @@ int msix_request_general_irq(struct hfi1_devdata *dd)
 }
 
 /**
- * enable_sdma_src() - Helper to enable SDMA IRQ srcs
+ * enable_sdma_srcs - Helper to enable SDMA IRQ srcs
  * @dd: valid devdata structure
  * @i: index of SDMA engine
  */
@@ -349,7 +349,7 @@ void msix_free_irq(struct hfi1_devdata *dd, u8 msix_intr)
 }
 
 /**
- * hfi1_clean_up_msix_interrupts() - Free all MSIx IRQ resources
+ * msix_clean_up_interrupts  - Free all MSIx IRQ resources
  * @dd: valid device data data structure
  *
  * Free the MSIx and associated PCI resources, if they have been allocated.
@@ -372,7 +372,7 @@ void msix_clean_up_interrupts(struct hfi1_devdata *dd)
 }
 
 /**
- * msix_netdev_syncrhonize_irq() - netdev IRQ synchronize
+ * msix_netdev_synchronize_irq - netdev IRQ synchronize
  * @dd: valid devdata
  */
 void msix_netdev_synchronize_irq(struct hfi1_devdata *dd)
index 947543a3e0c40cbe50e3dc4adbde5be33679dc35..8aa074670a9c8c44383e5d38d593afbb1f01a835 100644 (file)
 
 /**
  * struct hfi1_netdev_rxq - Receive Queue for HFI
- * dummy netdev. Both IPoIB and VNIC netdevices will be working on
- * top of this device.
+ * Both IPoIB and VNIC netdevices will be working on the rx abstraction.
  * @napi: napi object
- * @priv: ptr to netdev_priv
+ * @rx: ptr to netdev_rx
  * @rcd:  ptr to receive context data
  */
 struct hfi1_netdev_rxq {
        struct napi_struct napi;
-       struct hfi1_netdev_priv *priv;
+       struct hfi1_netdev_rx *rx;
        struct hfi1_ctxtdata *rcd;
 };
 
@@ -36,7 +35,8 @@ struct hfi1_netdev_rxq {
 #define NUM_NETDEV_MAP_ENTRIES HFI1_MAX_NETDEV_CTXTS
 
 /**
- * struct hfi1_netdev_priv: data required to setup and run HFI netdev.
+ * struct hfi1_netdev_rx: data required to setup and run HFI netdev.
+ * @rx_napi:   the dummy netdevice to support "polling" the receive contexts
  * @dd:                hfi1_devdata
  * @rxq:       pointer to dummy netdev receive queues.
  * @num_rx_q:  number of receive queues
@@ -48,7 +48,8 @@ struct hfi1_netdev_rxq {
  * @netdevs:   atomic counter of netdevs using dummy netdev.
  *             When 0 receive queues will be freed.
  */
-struct hfi1_netdev_priv {
+struct hfi1_netdev_rx {
+       struct net_device rx_napi;
        struct hfi1_devdata *dd;
        struct hfi1_netdev_rxq *rxq;
        int num_rx_q;
@@ -60,42 +61,28 @@ struct hfi1_netdev_priv {
        atomic_t netdevs;
 };
 
-static inline
-struct hfi1_netdev_priv *hfi1_netdev_priv(struct net_device *dev)
-{
-       return (struct hfi1_netdev_priv *)&dev[1];
-}
-
 static inline
 int hfi1_netdev_ctxt_count(struct hfi1_devdata *dd)
 {
-       struct hfi1_netdev_priv *priv = hfi1_netdev_priv(dd->dummy_netdev);
-
-       return priv->num_rx_q;
+       return dd->netdev_rx->num_rx_q;
 }
 
 static inline
 struct hfi1_ctxtdata *hfi1_netdev_get_ctxt(struct hfi1_devdata *dd, int ctxt)
 {
-       struct hfi1_netdev_priv *priv = hfi1_netdev_priv(dd->dummy_netdev);
-
-       return priv->rxq[ctxt].rcd;
+       return dd->netdev_rx->rxq[ctxt].rcd;
 }
 
 static inline
 int hfi1_netdev_get_free_rmt_idx(struct hfi1_devdata *dd)
 {
-       struct hfi1_netdev_priv *priv = hfi1_netdev_priv(dd->dummy_netdev);
-
-       return priv->rmt_start;
+       return dd->netdev_rx->rmt_start;
 }
 
 static inline
 void hfi1_netdev_set_free_rmt_idx(struct hfi1_devdata *dd, int rmt_idx)
 {
-       struct hfi1_netdev_priv *priv = hfi1_netdev_priv(dd->dummy_netdev);
-
-       priv->rmt_start = rmt_idx;
+       dd->netdev_rx->rmt_start = rmt_idx;
 }
 
 u32 hfi1_num_netdev_contexts(struct hfi1_devdata *dd, u32 available_contexts,
@@ -105,8 +92,8 @@ void hfi1_netdev_enable_queues(struct hfi1_devdata *dd);
 void hfi1_netdev_disable_queues(struct hfi1_devdata *dd);
 int hfi1_netdev_rx_init(struct hfi1_devdata *dd);
 int hfi1_netdev_rx_destroy(struct hfi1_devdata *dd);
-int hfi1_netdev_alloc(struct hfi1_devdata *dd);
-void hfi1_netdev_free(struct hfi1_devdata *dd);
+int hfi1_alloc_rx(struct hfi1_devdata *dd);
+void hfi1_free_rx(struct hfi1_devdata *dd);
 int hfi1_netdev_add_data(struct hfi1_devdata *dd, int id, void *data);
 void *hfi1_netdev_remove_data(struct hfi1_devdata *dd, int id);
 void *hfi1_netdev_get_data(struct hfi1_devdata *dd, int id);
index 1bcab992ac266dbb51e1a28740d6b9cd84b4d54f..03b098a494b539c41471b37ac149bf46c49a931e 100644 (file)
 #include <linux/etherdevice.h>
 #include <rdma/ib_verbs.h>
 
-static int hfi1_netdev_setup_ctxt(struct hfi1_netdev_priv *priv,
+static int hfi1_netdev_setup_ctxt(struct hfi1_netdev_rx *rx,
                                  struct hfi1_ctxtdata *uctxt)
 {
        unsigned int rcvctrl_ops;
-       struct hfi1_devdata *dd = priv->dd;
+       struct hfi1_devdata *dd = rx->dd;
        int ret;
 
        uctxt->rhf_rcv_function_map = netdev_rhf_rcv_functions;
@@ -118,11 +118,11 @@ static void hfi1_netdev_deallocate_ctxt(struct hfi1_devdata *dd,
        hfi1_free_ctxt(uctxt);
 }
 
-static int hfi1_netdev_allot_ctxt(struct hfi1_netdev_priv *priv,
+static int hfi1_netdev_allot_ctxt(struct hfi1_netdev_rx *rx,
                                  struct hfi1_ctxtdata **ctxt)
 {
        int rc;
-       struct hfi1_devdata *dd = priv->dd;
+       struct hfi1_devdata *dd = rx->dd;
 
        rc = hfi1_netdev_allocate_ctxt(dd, ctxt);
        if (rc) {
@@ -130,7 +130,7 @@ static int hfi1_netdev_allot_ctxt(struct hfi1_netdev_priv *priv,
                return rc;
        }
 
-       rc = hfi1_netdev_setup_ctxt(priv, *ctxt);
+       rc = hfi1_netdev_setup_ctxt(rx, *ctxt);
        if (rc) {
                dd_dev_err(dd, "netdev ctxt setup failed %d\n", rc);
                hfi1_netdev_deallocate_ctxt(dd, *ctxt);
@@ -183,31 +183,31 @@ u32 hfi1_num_netdev_contexts(struct hfi1_devdata *dd, u32 available_contexts,
                    (u32)HFI1_MAX_NETDEV_CTXTS);
 }
 
-static int hfi1_netdev_rxq_init(struct net_device *dev)
+static int hfi1_netdev_rxq_init(struct hfi1_netdev_rx *rx)
 {
        int i;
        int rc;
-       struct hfi1_netdev_priv *priv = hfi1_netdev_priv(dev);
-       struct hfi1_devdata *dd = priv->dd;
+       struct hfi1_devdata *dd = rx->dd;
+       struct net_device *dev = &rx->rx_napi;
 
-       priv->num_rx_q = dd->num_netdev_contexts;
-       priv->rxq = kcalloc_node(priv->num_rx_q, sizeof(struct hfi1_netdev_rxq),
-                                GFP_KERNEL, dd->node);
+       rx->num_rx_q = dd->num_netdev_contexts;
+       rx->rxq = kcalloc_node(rx->num_rx_q, sizeof(*rx->rxq),
+                              GFP_KERNEL, dd->node);
 
-       if (!priv->rxq) {
+       if (!rx->rxq) {
                dd_dev_err(dd, "Unable to allocate netdev queue data\n");
                return (-ENOMEM);
        }
 
-       for (i = 0; i < priv->num_rx_q; i++) {
-               struct hfi1_netdev_rxq *rxq = &priv->rxq[i];
+       for (i = 0; i < rx->num_rx_q; i++) {
+               struct hfi1_netdev_rxq *rxq = &rx->rxq[i];
 
-               rc = hfi1_netdev_allot_ctxt(priv, &rxq->rcd);
+               rc = hfi1_netdev_allot_ctxt(rx, &rxq->rcd);
                if (rc)
                        goto bail_context_irq_failure;
 
                hfi1_rcd_get(rxq->rcd);
-               rxq->priv = priv;
+               rxq->rx = rx;
                rxq->rcd->napi = &rxq->napi;
                dd_dev_info(dd, "Setting rcv queue %d napi to context %d\n",
                            i, rxq->rcd->ctxt);
@@ -227,7 +227,7 @@ static int hfi1_netdev_rxq_init(struct net_device *dev)
 bail_context_irq_failure:
        dd_dev_err(dd, "Unable to allot receive context\n");
        for (; i >= 0; i--) {
-               struct hfi1_netdev_rxq *rxq = &priv->rxq[i];
+               struct hfi1_netdev_rxq *rxq = &rx->rxq[i];
 
                if (rxq->rcd) {
                        hfi1_netdev_deallocate_ctxt(dd, rxq->rcd);
@@ -235,20 +235,19 @@ bail_context_irq_failure:
                        rxq->rcd = NULL;
                }
        }
-       kfree(priv->rxq);
-       priv->rxq = NULL;
+       kfree(rx->rxq);
+       rx->rxq = NULL;
 
        return rc;
 }
 
-static void hfi1_netdev_rxq_deinit(struct net_device *dev)
+static void hfi1_netdev_rxq_deinit(struct hfi1_netdev_rx *rx)
 {
        int i;
-       struct hfi1_netdev_priv *priv = hfi1_netdev_priv(dev);
-       struct hfi1_devdata *dd = priv->dd;
+       struct hfi1_devdata *dd = rx->dd;
 
-       for (i = 0; i < priv->num_rx_q; i++) {
-               struct hfi1_netdev_rxq *rxq = &priv->rxq[i];
+       for (i = 0; i < rx->num_rx_q; i++) {
+               struct hfi1_netdev_rxq *rxq = &rx->rxq[i];
 
                netif_napi_del(&rxq->napi);
                hfi1_netdev_deallocate_ctxt(dd, rxq->rcd);
@@ -256,41 +255,41 @@ static void hfi1_netdev_rxq_deinit(struct net_device *dev)
                rxq->rcd = NULL;
        }
 
-       kfree(priv->rxq);
-       priv->rxq = NULL;
-       priv->num_rx_q = 0;
+       kfree(rx->rxq);
+       rx->rxq = NULL;
+       rx->num_rx_q = 0;
 }
 
-static void enable_queues(struct hfi1_netdev_priv *priv)
+static void enable_queues(struct hfi1_netdev_rx *rx)
 {
        int i;
 
-       for (i = 0; i < priv->num_rx_q; i++) {
-               struct hfi1_netdev_rxq *rxq = &priv->rxq[i];
+       for (i = 0; i < rx->num_rx_q; i++) {
+               struct hfi1_netdev_rxq *rxq = &rx->rxq[i];
 
-               dd_dev_info(priv->dd, "enabling queue %d on context %d\n", i,
+               dd_dev_info(rx->dd, "enabling queue %d on context %d\n", i,
                            rxq->rcd->ctxt);
                napi_enable(&rxq->napi);
-               hfi1_rcvctrl(priv->dd,
+               hfi1_rcvctrl(rx->dd,
                             HFI1_RCVCTRL_CTXT_ENB | HFI1_RCVCTRL_INTRAVAIL_ENB,
                             rxq->rcd);
        }
 }
 
-static void disable_queues(struct hfi1_netdev_priv *priv)
+static void disable_queues(struct hfi1_netdev_rx *rx)
 {
        int i;
 
-       msix_netdev_synchronize_irq(priv->dd);
+       msix_netdev_synchronize_irq(rx->dd);
 
-       for (i = 0; i < priv->num_rx_q; i++) {
-               struct hfi1_netdev_rxq *rxq = &priv->rxq[i];
+       for (i = 0; i < rx->num_rx_q; i++) {
+               struct hfi1_netdev_rxq *rxq = &rx->rxq[i];
 
-               dd_dev_info(priv->dd, "disabling queue %d on context %d\n", i,
+               dd_dev_info(rx->dd, "disabling queue %d on context %d\n", i,
                            rxq->rcd->ctxt);
 
                /* wait for napi if it was scheduled */
-               hfi1_rcvctrl(priv->dd,
+               hfi1_rcvctrl(rx->dd,
                             HFI1_RCVCTRL_CTXT_DIS | HFI1_RCVCTRL_INTRAVAIL_DIS,
                             rxq->rcd);
                napi_synchronize(&rxq->napi);
@@ -307,15 +306,14 @@ static void disable_queues(struct hfi1_netdev_priv *priv)
  */
 int hfi1_netdev_rx_init(struct hfi1_devdata *dd)
 {
-       struct hfi1_netdev_priv *priv = hfi1_netdev_priv(dd->dummy_netdev);
+       struct hfi1_netdev_rx *rx = dd->netdev_rx;
        int res;
 
-       if (atomic_fetch_inc(&priv->netdevs))
+       if (atomic_fetch_inc(&rx->netdevs))
                return 0;
 
        mutex_lock(&hfi1_mutex);
-       init_dummy_netdev(dd->dummy_netdev);
-       res = hfi1_netdev_rxq_init(dd->dummy_netdev);
+       res = hfi1_netdev_rxq_init(rx);
        mutex_unlock(&hfi1_mutex);
        return res;
 }
@@ -328,12 +326,12 @@ int hfi1_netdev_rx_init(struct hfi1_devdata *dd)
  */
 int hfi1_netdev_rx_destroy(struct hfi1_devdata *dd)
 {
-       struct hfi1_netdev_priv *priv = hfi1_netdev_priv(dd->dummy_netdev);
+       struct hfi1_netdev_rx *rx = dd->netdev_rx;
 
        /* destroy the RX queues only if it is the last netdev going away */
-       if (atomic_fetch_add_unless(&priv->netdevs, -1, 0) == 1) {
+       if (atomic_fetch_add_unless(&rx->netdevs, -1, 0) == 1) {
                mutex_lock(&hfi1_mutex);
-               hfi1_netdev_rxq_deinit(dd->dummy_netdev);
+               hfi1_netdev_rxq_deinit(rx);
                mutex_unlock(&hfi1_mutex);
        }
 
@@ -341,39 +339,43 @@ int hfi1_netdev_rx_destroy(struct hfi1_devdata *dd)
 }
 
 /**
- * hfi1_netdev_alloc - Allocates netdev and private data. It is required
- * because RMT index and MSI-X interrupt can be set only
- * during driver initialization.
- *
+ * hfi1_alloc_rx - Allocates the rx support structure
  * @dd: hfi1 dev data
+ *
+ * Allocate the rx structure to support gathering the receive
+ * resources and the dummy netdev.
+ *
+ * Updates dd struct pointer upon success.
+ *
+ * Return: 0 (success) -error on failure
+ *
  */
-int hfi1_netdev_alloc(struct hfi1_devdata *dd)
+int hfi1_alloc_rx(struct hfi1_devdata *dd)
 {
-       struct hfi1_netdev_priv *priv;
-       const int netdev_size = sizeof(*dd->dummy_netdev) +
-               sizeof(struct hfi1_netdev_priv);
+       struct hfi1_netdev_rx *rx;
 
-       dd_dev_info(dd, "allocating netdev size %d\n", netdev_size);
-       dd->dummy_netdev = kcalloc_node(1, netdev_size, GFP_KERNEL, dd->node);
+       dd_dev_info(dd, "allocating rx size %ld\n", sizeof(*rx));
+       rx = kzalloc_node(sizeof(*rx), GFP_KERNEL, dd->node);
 
-       if (!dd->dummy_netdev)
+       if (!rx)
                return -ENOMEM;
+       rx->dd = dd;
+       init_dummy_netdev(&rx->rx_napi);
 
-       priv = hfi1_netdev_priv(dd->dummy_netdev);
-       priv->dd = dd;
-       xa_init(&priv->dev_tbl);
-       atomic_set(&priv->enabled, 0);
-       atomic_set(&priv->netdevs, 0);
+       xa_init(&rx->dev_tbl);
+       atomic_set(&rx->enabled, 0);
+       atomic_set(&rx->netdevs, 0);
+       dd->netdev_rx = rx;
 
        return 0;
 }
 
-void hfi1_netdev_free(struct hfi1_devdata *dd)
+void hfi1_free_rx(struct hfi1_devdata *dd)
 {
-       if (dd->dummy_netdev) {
-               dd_dev_info(dd, "hfi1 netdev freed\n");
-               kfree(dd->dummy_netdev);
-               dd->dummy_netdev = NULL;
+       if (dd->netdev_rx) {
+               dd_dev_info(dd, "hfi1 rx freed\n");
+               kfree(dd->netdev_rx);
+               dd->netdev_rx = NULL;
        }
 }
 
@@ -388,33 +390,33 @@ void hfi1_netdev_free(struct hfi1_devdata *dd)
  */
 void hfi1_netdev_enable_queues(struct hfi1_devdata *dd)
 {
-       struct hfi1_netdev_priv *priv;
+       struct hfi1_netdev_rx *rx;
 
-       if (!dd->dummy_netdev)
+       if (!dd->netdev_rx)
                return;
 
-       priv = hfi1_netdev_priv(dd->dummy_netdev);
-       if (atomic_fetch_inc(&priv->enabled))
+       rx = dd->netdev_rx;
+       if (atomic_fetch_inc(&rx->enabled))
                return;
 
        mutex_lock(&hfi1_mutex);
-       enable_queues(priv);
+       enable_queues(rx);
        mutex_unlock(&hfi1_mutex);
 }
 
 void hfi1_netdev_disable_queues(struct hfi1_devdata *dd)
 {
-       struct hfi1_netdev_priv *priv;
+       struct hfi1_netdev_rx *rx;
 
-       if (!dd->dummy_netdev)
+       if (!dd->netdev_rx)
                return;
 
-       priv = hfi1_netdev_priv(dd->dummy_netdev);
-       if (atomic_dec_if_positive(&priv->enabled))
+       rx = dd->netdev_rx;
+       if (atomic_dec_if_positive(&rx->enabled))
                return;
 
        mutex_lock(&hfi1_mutex);
-       disable_queues(priv);
+       disable_queues(rx);
        mutex_unlock(&hfi1_mutex);
 }
 
@@ -430,9 +432,9 @@ void hfi1_netdev_disable_queues(struct hfi1_devdata *dd)
  */
 int hfi1_netdev_add_data(struct hfi1_devdata *dd, int id, void *data)
 {
-       struct hfi1_netdev_priv *priv = hfi1_netdev_priv(dd->dummy_netdev);
+       struct hfi1_netdev_rx *rx = dd->netdev_rx;
 
-       return xa_insert(&priv->dev_tbl, id, data, GFP_NOWAIT);
+       return xa_insert(&rx->dev_tbl, id, data, GFP_NOWAIT);
 }
 
 /**
@@ -444,9 +446,9 @@ int hfi1_netdev_add_data(struct hfi1_devdata *dd, int id, void *data)
  */
 void *hfi1_netdev_remove_data(struct hfi1_devdata *dd, int id)
 {
-       struct hfi1_netdev_priv *priv = hfi1_netdev_priv(dd->dummy_netdev);
+       struct hfi1_netdev_rx *rx = dd->netdev_rx;
 
-       return xa_erase(&priv->dev_tbl, id);
+       return xa_erase(&rx->dev_tbl, id);
 }
 
 /**
@@ -457,24 +459,24 @@ void *hfi1_netdev_remove_data(struct hfi1_devdata *dd, int id)
  */
 void *hfi1_netdev_get_data(struct hfi1_devdata *dd, int id)
 {
-       struct hfi1_netdev_priv *priv = hfi1_netdev_priv(dd->dummy_netdev);
+       struct hfi1_netdev_rx *rx = dd->netdev_rx;
 
-       return xa_load(&priv->dev_tbl, id);
+       return xa_load(&rx->dev_tbl, id);
 }
 
 /**
- * hfi1_netdev_get_first_dat - Gets first entry with greater or equal id.
+ * hfi1_netdev_get_first_data - Gets first entry with greater or equal id.
  *
  * @dd: hfi1 dev data
  * @start_id: requested integer id up to INT_MAX
  */
 void *hfi1_netdev_get_first_data(struct hfi1_devdata *dd, int *start_id)
 {
-       struct hfi1_netdev_priv *priv = hfi1_netdev_priv(dd->dummy_netdev);
+       struct hfi1_netdev_rx *rx = dd->netdev_rx;
        unsigned long index = *start_id;
        void *ret;
 
-       ret = xa_find(&priv->dev_tbl, &index, UINT_MAX, XA_PRESENT);
+       ret = xa_find(&rx->dev_tbl, &index, UINT_MAX, XA_PRESENT);
        *start_id = (int)index;
        return ret;
 }
index 46b5290b2839ddadd6e8a25ae53aafc1750b12e0..1fcc6e9666e051796032d2989acea23b4ec2f4a4 100644 (file)
@@ -1285,7 +1285,7 @@ bail:
 }
 
 /**
- * sdma_clean()  Clean up allocated memory
+ * sdma_clean - Clean up allocated memory
  * @dd:          struct hfi1_devdata
  * @num_engines: num sdma engines
  *
index 7a851191f9870f496b2b43c4c19c73b210a73606..f57d55272dd25a87fec71a16178b53f5959a0245 100644 (file)
@@ -907,24 +907,6 @@ static inline unsigned sdma_progress(struct sdma_engine *sde, unsigned seq,
        return 0;
 }
 
-/**
- * sdma_iowait_schedule() - initialize wait structure
- * @sde: sdma_engine to schedule
- * @wait: wait struct to schedule
- *
- * This function initializes the iowait
- * structure embedded in the QP or PQ.
- *
- */
-static inline void sdma_iowait_schedule(
-       struct sdma_engine *sde,
-       struct iowait *wait)
-{
-       struct hfi1_pportdata *ppd = sde->dd->pport;
-
-       iowait_schedule(wait, ppd->hfi1_wq, sde->cpu);
-}
-
 /* for use by interrupt handling */
 void sdma_engine_error(struct sdma_engine *sde, u64 status);
 void sdma_engine_interrupt(struct sdma_engine *sde, u64 status);
index 5650130e68d439fa15ac94ec3f65dac2e348849e..eaf441ece25eb833893602dc6b1a49420c31ad4f 100644 (file)
@@ -649,7 +649,7 @@ const struct attribute_group ib_hfi1_attr_group = {
        .attrs = hfi1_attributes,
 };
 
-int hfi1_create_port_files(struct ib_device *ibdev, u8 port_num,
+int hfi1_create_port_files(struct ib_device *ibdev, u32 port_num,
                           struct kobject *kobj)
 {
        struct hfi1_pportdata *ppd;
index 769e5e4710c6499d7f38703062ffc97f077765ab..d44fc54858b90f8da8850c5653eb5673cce07502 100644 (file)
@@ -53,6 +53,8 @@
 #include "hfi.h"
 #include "mad.h"
 #include "sdma.h"
+#include "ipoib.h"
+#include "user_sdma.h"
 
 const char *parse_sdma_flags(struct trace_seq *p, u64 desc0, u64 desc1);
 
@@ -653,6 +655,80 @@ TRACE_EVENT(hfi1_sdma_user_completion,
                      __entry->code)
 );
 
+TRACE_EVENT(hfi1_usdma_defer,
+           TP_PROTO(struct hfi1_user_sdma_pkt_q *pq,
+                    struct sdma_engine *sde,
+                    struct iowait *wait),
+           TP_ARGS(pq, sde, wait),
+           TP_STRUCT__entry(DD_DEV_ENTRY(pq->dd)
+                            __field(struct hfi1_user_sdma_pkt_q *, pq)
+                            __field(struct sdma_engine *, sde)
+                            __field(struct iowait *, wait)
+                            __field(int, engine)
+                            __field(int, empty)
+                            ),
+            TP_fast_assign(DD_DEV_ASSIGN(pq->dd);
+                           __entry->pq = pq;
+                           __entry->sde = sde;
+                           __entry->wait = wait;
+                           __entry->engine = sde->this_idx;
+                           __entry->empty = list_empty(&__entry->wait->list);
+                           ),
+            TP_printk("[%s] pq %llx sde %llx wait %llx engine %d empty %d",
+                      __get_str(dev),
+                      (unsigned long long)__entry->pq,
+                      (unsigned long long)__entry->sde,
+                      (unsigned long long)__entry->wait,
+                      __entry->engine,
+                      __entry->empty
+               )
+);
+
+TRACE_EVENT(hfi1_usdma_activate,
+           TP_PROTO(struct hfi1_user_sdma_pkt_q *pq,
+                    struct iowait *wait,
+                    int reason),
+           TP_ARGS(pq, wait, reason),
+           TP_STRUCT__entry(DD_DEV_ENTRY(pq->dd)
+                            __field(struct hfi1_user_sdma_pkt_q *, pq)
+                            __field(struct iowait *, wait)
+                            __field(int, reason)
+                            ),
+            TP_fast_assign(DD_DEV_ASSIGN(pq->dd);
+                           __entry->pq = pq;
+                           __entry->wait = wait;
+                           __entry->reason = reason;
+                           ),
+            TP_printk("[%s] pq %llx wait %llx reason %d",
+                      __get_str(dev),
+                      (unsigned long long)__entry->pq,
+                      (unsigned long long)__entry->wait,
+                      __entry->reason
+               )
+);
+
+TRACE_EVENT(hfi1_usdma_we,
+           TP_PROTO(struct hfi1_user_sdma_pkt_q *pq,
+                    int we_ret),
+           TP_ARGS(pq, we_ret),
+           TP_STRUCT__entry(DD_DEV_ENTRY(pq->dd)
+                            __field(struct hfi1_user_sdma_pkt_q *, pq)
+                            __field(int, state)
+                            __field(int, we_ret)
+                            ),
+            TP_fast_assign(DD_DEV_ASSIGN(pq->dd);
+                           __entry->pq = pq;
+                           __entry->state = pq->state;
+                           __entry->we_ret = we_ret;
+                           ),
+            TP_printk("[%s] pq %llx state %d we_ret %d",
+                      __get_str(dev),
+                      (unsigned long long)__entry->pq,
+                      __entry->state,
+                      __entry->we_ret
+               )
+);
+
 const char *print_u32_array(struct trace_seq *, u32 *, int);
 #define __print_u32_hex(arr, len) print_u32_array(p, arr, len)
 
@@ -858,6 +934,109 @@ DEFINE_EVENT(
        TP_ARGS(qp, flag)
 );
 
+DECLARE_EVENT_CLASS(/* AIP  */
+       hfi1_ipoib_txq_template,
+       TP_PROTO(struct hfi1_ipoib_txq *txq),
+       TP_ARGS(txq),
+       TP_STRUCT__entry(/* entry */
+               DD_DEV_ENTRY(txq->priv->dd)
+               __field(struct hfi1_ipoib_txq *, txq)
+               __field(struct sdma_engine *, sde)
+               __field(ulong, head)
+               __field(ulong, tail)
+               __field(uint, used)
+               __field(uint, flow)
+               __field(int, stops)
+               __field(int, no_desc)
+               __field(u8, idx)
+               __field(u8, stopped)
+       ),
+       TP_fast_assign(/* assign */
+               DD_DEV_ASSIGN(txq->priv->dd)
+               __entry->txq = txq;
+               __entry->sde = txq->sde;
+               __entry->head = txq->tx_ring.head;
+               __entry->tail = txq->tx_ring.tail;
+               __entry->idx = txq->q_idx;
+               __entry->used =
+                       txq->sent_txreqs -
+                       atomic64_read(&txq->complete_txreqs);
+               __entry->flow = txq->flow.as_int;
+               __entry->stops = atomic_read(&txq->stops);
+               __entry->no_desc = atomic_read(&txq->no_desc);
+               __entry->stopped =
+                __netif_subqueue_stopped(txq->priv->netdev, txq->q_idx);
+       ),
+       TP_printk(/* print  */
+               "[%s] txq %llx idx %u sde %llx head %lx tail %lx flow %x used %u stops %d no_desc %d stopped %u",
+               __get_str(dev),
+               (unsigned long long)__entry->txq,
+               __entry->idx,
+               (unsigned long long)__entry->sde,
+               __entry->head,
+               __entry->tail,
+               __entry->flow,
+               __entry->used,
+               __entry->stops,
+               __entry->no_desc,
+               __entry->stopped
+       )
+);
+
+DEFINE_EVENT(/* queue stop */
+       hfi1_ipoib_txq_template, hfi1_txq_stop,
+       TP_PROTO(struct hfi1_ipoib_txq *txq),
+       TP_ARGS(txq)
+);
+
+DEFINE_EVENT(/* queue wake */
+       hfi1_ipoib_txq_template, hfi1_txq_wake,
+       TP_PROTO(struct hfi1_ipoib_txq *txq),
+       TP_ARGS(txq)
+);
+
+DEFINE_EVENT(/* flow flush */
+       hfi1_ipoib_txq_template, hfi1_flow_flush,
+       TP_PROTO(struct hfi1_ipoib_txq *txq),
+       TP_ARGS(txq)
+);
+
+DEFINE_EVENT(/* flow switch */
+       hfi1_ipoib_txq_template, hfi1_flow_switch,
+       TP_PROTO(struct hfi1_ipoib_txq *txq),
+       TP_ARGS(txq)
+);
+
+DEFINE_EVENT(/* wakeup */
+       hfi1_ipoib_txq_template, hfi1_txq_wakeup,
+       TP_PROTO(struct hfi1_ipoib_txq *txq),
+       TP_ARGS(txq)
+);
+
+DEFINE_EVENT(/* full */
+       hfi1_ipoib_txq_template, hfi1_txq_full,
+       TP_PROTO(struct hfi1_ipoib_txq *txq),
+       TP_ARGS(txq)
+);
+
+DEFINE_EVENT(/* queued */
+       hfi1_ipoib_txq_template, hfi1_txq_queued,
+       TP_PROTO(struct hfi1_ipoib_txq *txq),
+       TP_ARGS(txq)
+);
+
+DEFINE_EVENT(/* xmit_stopped */
+       hfi1_ipoib_txq_template, hfi1_txq_xmit_stopped,
+       TP_PROTO(struct hfi1_ipoib_txq *txq),
+       TP_ARGS(txq)
+);
+
+DEFINE_EVENT(/* xmit_unstopped */
+       hfi1_ipoib_txq_template, hfi1_txq_xmit_unstopped,
+       TP_PROTO(struct hfi1_ipoib_txq *txq),
+       TP_ARGS(txq)
+);
+
 #endif /* __HFI1_TRACE_TX_H */
 
 #undef TRACE_INCLUDE_PATH
index 4a4956f96a7ebccdc75bfa7ca5372874f3a6a03c..da5b2e37355ab3e7327959bfd27111fb7084ce43 100644 (file)
@@ -133,6 +133,7 @@ static int defer_packet_queue(
                container_of(wait->iow, struct hfi1_user_sdma_pkt_q, busy);
 
        write_seqlock(&sde->waitlock);
+       trace_hfi1_usdma_defer(pq, sde, &pq->busy);
        if (sdma_progress(sde, seq, txreq))
                goto eagain;
        /*
@@ -157,7 +158,8 @@ static void activate_packet_queue(struct iowait *wait, int reason)
 {
        struct hfi1_user_sdma_pkt_q *pq =
                container_of(wait, struct hfi1_user_sdma_pkt_q, busy);
-       pq->busy.lock = NULL;
+
+       trace_hfi1_usdma_activate(pq, wait, reason);
        xchg(&pq->state, SDMA_PKT_Q_ACTIVE);
        wake_up(&wait->wait_dma);
 };
@@ -599,13 +601,17 @@ int hfi1_user_sdma_process_request(struct hfi1_filedata *fd,
        while (req->seqsubmitted != req->info.npkts) {
                ret = user_sdma_send_pkts(req, pcount);
                if (ret < 0) {
+                       int we_ret;
+
                        if (ret != -EBUSY)
                                goto free_req;
-                       if (wait_event_interruptible_timeout(
+                       we_ret = wait_event_interruptible_timeout(
                                pq->busy.wait_dma,
                                pq->state == SDMA_PKT_Q_ACTIVE,
                                msecs_to_jiffies(
-                                       SDMA_IOWAIT_TIMEOUT)) <= 0)
+                                       SDMA_IOWAIT_TIMEOUT));
+                       trace_hfi1_usdma_we(pq, we_ret);
+                       if (we_ret <= 0)
                                flush_pq_iowait(pq);
                }
        }
index 1e8c02fe8ad1d8e6fc90dd2e53ca66d4ae99833e..fabe5813990684c15e7e8003c31877c4889d89c0 100644 (file)
@@ -53,6 +53,7 @@
 #include "common.h"
 #include "iowait.h"
 #include "user_exp_rcv.h"
+#include "mmu_rb.h"
 
 /* The maximum number of Data io vectors per message/request */
 #define MAX_VECTORS_PER_REQ 8
index 0dd4bb0a5a7e6734c195b2cc3dc1be3c23afe315..554294340caa282fb290ba36b296e70e66305f84 100644 (file)
@@ -1407,7 +1407,7 @@ static inline u16 opa_width_to_ib(u16 in)
        }
 }
 
-static int query_port(struct rvt_dev_info *rdi, u8 port_num,
+static int query_port(struct rvt_dev_info *rdi, u32 port_num,
                      struct ib_port_attr *props)
 {
        struct hfi1_ibdev *verbs_dev = dev_from_rdi(rdi);
@@ -1485,7 +1485,7 @@ bail:
        return ret;
 }
 
-static int shut_down_port(struct rvt_dev_info *rdi, u8 port_num)
+static int shut_down_port(struct rvt_dev_info *rdi, u32 port_num)
 {
        struct hfi1_ibdev *verbs_dev = dev_from_rdi(rdi);
        struct hfi1_devdata *dd = dd_from_dev(verbs_dev);
@@ -1694,7 +1694,7 @@ static int init_cntr_names(const char *names_in,
 }
 
 static struct rdma_hw_stats *alloc_hw_stats(struct ib_device *ibdev,
-                                           u8 port_num)
+                                           u32 port_num)
 {
        int i, err;
 
@@ -1758,7 +1758,7 @@ static u64 hfi1_sps_ints(void)
 }
 
 static int get_hw_stats(struct ib_device *ibdev, struct rdma_hw_stats *stats,
-                       u8 port, int index)
+                       u32 port, int index)
 {
        u64 *values;
        int count;
index d36e3e14896dd7b38a6a7c9edc6a89198f5e362d..420df17cd1848b127fc81ea87f34d54fabf1d7bf 100644 (file)
@@ -325,10 +325,10 @@ static inline struct rvt_qp *iowait_to_qp(struct iowait *s_iowait)
  */
 void hfi1_bad_pkey(struct hfi1_ibport *ibp, u32 key, u32 sl,
                   u32 qp1, u32 qp2, u32 lid1, u32 lid2);
-void hfi1_cap_mask_chg(struct rvt_dev_info *rdi, u8 port_num);
+void hfi1_cap_mask_chg(struct rvt_dev_info *rdi, u32 port_num);
 void hfi1_sys_guid_chg(struct hfi1_ibport *ibp);
 void hfi1_node_desc_chg(struct hfi1_ibport *ibp);
-int hfi1_process_mad(struct ib_device *ibdev, int mad_flags, u8 port,
+int hfi1_process_mad(struct ib_device *ibdev, int mad_flags, u32 port,
                     const struct ib_wc *in_wc, const struct ib_grh *in_grh,
                     const struct ib_mad *in_mad, struct ib_mad *out_mad,
                     size_t *out_mad_size, u16 *out_mad_pkey_index);
index d2d526c5a756090b9a013a0fbfed52a5a9e495d2..4bdfc79323768d4819c226fd19c33ec2430f3b4d 100644 (file)
@@ -99,11 +99,6 @@ static inline struct verbs_txreq *get_txreq(struct hfi1_ibdev *dev,
        return tx;
 }
 
-static inline struct sdma_txreq *get_sdma_txreq(struct verbs_txreq *tx)
-{
-       return &tx->txreq;
-}
-
 static inline struct verbs_txreq *get_waiting_verbs_txreq(struct iowait_work *w)
 {
        struct sdma_txreq *stx;
index 66150a13f37455acc0735d7e46a48900bf9118d4..a7a450e2cf2cc0e8fed2c50186a3e974d422ebbd 100644 (file)
@@ -156,7 +156,7 @@ bool hfi1_vnic_sdma_write_avail(struct hfi1_vnic_vport_info *vinfo,
 
 /* vnic rdma netdev operations */
 struct net_device *hfi1_vnic_alloc_rn(struct ib_device *device,
-                                     u8 port_num,
+                                     u32 port_num,
                                      enum rdma_netdev_t type,
                                      const char *name,
                                      unsigned char name_assign_type,
index a90824de0f5716b2bc9373633ce30dcdeb75eddf..7e79c0578ecf3478368ac1f2d8981470b8221745 100644 (file)
@@ -593,7 +593,7 @@ static void hfi1_vnic_free_rn(struct net_device *netdev)
 }
 
 struct net_device *hfi1_vnic_alloc_rn(struct ib_device *device,
-                                     u8 port_num,
+                                     u32 port_num,
                                      enum rdma_netdev_t type,
                                      const char *name,
                                      unsigned char name_assign_type,
index 4bcaaa0524b12776903bcc57ad1e8e1c83b3d807..5d389ed5537612bffc4bdfdc9fac83751810ab9b 100644 (file)
@@ -304,6 +304,9 @@ done:
 
 void hns_roce_cleanup_bitmap(struct hns_roce_dev *hr_dev)
 {
+       if (hr_dev->caps.flags & HNS_ROCE_CAP_FLAG_XRC)
+               hns_roce_cleanup_xrcd_table(hr_dev);
+
        if (hr_dev->caps.flags & HNS_ROCE_CAP_FLAG_SRQ)
                hns_roce_cleanup_srq_table(hr_dev);
        hns_roce_cleanup_qp_table(hr_dev);
index 339e3fd98b0b486fbbbcf9c64317ac8977ae5959..8f68cc3ff193f004ae594aa457c30d2055ea7fa9 100644 (file)
 
 #define CMD_POLL_TOKEN 0xffff
 #define CMD_MAX_NUM 32
-#define CMD_TOKEN_MASK 0x1f
 
 static int hns_roce_cmd_mbox_post_hw(struct hns_roce_dev *hr_dev, u64 in_param,
                                     u64 out_param, u32 in_modifier,
                                     u8 op_modifier, u16 op, u16 token,
                                     int event)
 {
-       struct hns_roce_cmdq *cmd = &hr_dev->cmd;
-       int ret;
-
-       mutex_lock(&cmd->hcr_mutex);
-       ret = hr_dev->hw->post_mbox(hr_dev, in_param, out_param, in_modifier,
-                                   op_modifier, op, token, event);
-       mutex_unlock(&cmd->hcr_mutex);
-
-       return ret;
+       return hr_dev->hw->post_mbox(hr_dev, in_param, out_param, in_modifier,
+                                    op_modifier, op, token, event);
 }
 
 /* this should be called with "poll_sem" */
@@ -62,18 +54,19 @@ static int __hns_roce_cmd_mbox_poll(struct hns_roce_dev *hr_dev, u64 in_param,
                                    u8 op_modifier, u16 op,
                                    unsigned int timeout)
 {
-       struct device *dev = hr_dev->dev;
        int ret;
 
        ret = hns_roce_cmd_mbox_post_hw(hr_dev, in_param, out_param,
                                        in_modifier, op_modifier, op,
                                        CMD_POLL_TOKEN, 0);
        if (ret) {
-               dev_err(dev, "[cmd_poll]hns_roce_cmd_mbox_post_hw failed\n");
+               dev_err_ratelimited(hr_dev->dev,
+                                   "failed to post mailbox %x in poll mode, ret = %d.\n",
+                                   op, ret);
                return ret;
        }
 
-       return hr_dev->hw->chk_mbox(hr_dev, timeout);
+       return hr_dev->hw->poll_mbox_done(hr_dev, timeout);
 }
 
 static int hns_roce_cmd_mbox_poll(struct hns_roce_dev *hr_dev, u64 in_param,
@@ -96,15 +89,18 @@ void hns_roce_cmd_event(struct hns_roce_dev *hr_dev, u16 token, u8 status,
        struct hns_roce_cmd_context *context =
                &hr_dev->cmd.context[token % hr_dev->cmd.max_cmds];
 
-       if (token != context->token)
+       if (unlikely(token != context->token)) {
+               dev_err_ratelimited(hr_dev->dev,
+                                   "[cmd] invalid ae token %x,context token is %x!\n",
+                                   token, context->token);
                return;
+       }
 
        context->result = (status == HNS_ROCE_CMD_SUCCESS) ? 0 : (-EIO);
        context->out_param = out_param;
        complete(&context->done);
 }
 
-/* this should be called with "use_events" */
 static int __hns_roce_cmd_mbox_wait(struct hns_roce_dev *hr_dev, u64 in_param,
                                    u64 out_param, unsigned long in_modifier,
                                    u8 op_modifier, u16 op,
@@ -116,44 +112,44 @@ static int __hns_roce_cmd_mbox_wait(struct hns_roce_dev *hr_dev, u64 in_param,
        int ret;
 
        spin_lock(&cmd->context_lock);
-       WARN_ON(cmd->free_head < 0);
-       context = &cmd->context[cmd->free_head];
-       context->token += cmd->token_mask + 1;
-       cmd->free_head = context->next;
+
+       do {
+               context = &cmd->context[cmd->free_head];
+               cmd->free_head = context->next;
+       } while (context->busy);
+
+       context->busy = 1;
+       context->token += cmd->max_cmds;
+
        spin_unlock(&cmd->context_lock);
 
-       init_completion(&context->done);
+       reinit_completion(&context->done);
 
        ret = hns_roce_cmd_mbox_post_hw(hr_dev, in_param, out_param,
                                        in_modifier, op_modifier, op,
                                        context->token, 1);
-       if (ret)
+       if (ret) {
+               dev_err_ratelimited(dev,
+                                   "failed to post mailbox %x in event mode, ret = %d.\n",
+                                   op, ret);
                goto out;
+       }
 
-       /*
-        * It is timeout when wait_for_completion_timeout return 0
-        * The return value is the time limit set in advance
-        * how many seconds showing
-        */
        if (!wait_for_completion_timeout(&context->done,
                                         msecs_to_jiffies(timeout))) {
-               dev_err(dev, "[cmd]wait_for_completion_timeout timeout\n");
+               dev_err_ratelimited(dev, "[cmd] token %x mailbox %x timeout.\n",
+                                   context->token, op);
                ret = -EBUSY;
                goto out;
        }
 
        ret = context->result;
-       if (ret) {
-               dev_err(dev, "[cmd]event mod cmd process error!err=%d\n", ret);
-               goto out;
-       }
+       if (ret)
+               dev_err_ratelimited(dev, "[cmd] token %x mailbox %x error %d\n",
+                                   context->token, op, ret);
 
 out:
-       spin_lock(&cmd->context_lock);
-       context->next = cmd->free_head;
-       cmd->free_head = context - cmd->context;
-       spin_unlock(&cmd->context_lock);
-
+       context->busy = 0;
        return ret;
 }
 
@@ -175,44 +171,28 @@ int hns_roce_cmd_mbox(struct hns_roce_dev *hr_dev, u64 in_param, u64 out_param,
                      unsigned long in_modifier, u8 op_modifier, u16 op,
                      unsigned int timeout)
 {
-       int ret;
+       bool is_busy;
 
-       if (hr_dev->hw->rst_prc_mbox) {
-               ret = hr_dev->hw->rst_prc_mbox(hr_dev);
-               if (ret == CMD_RST_PRC_SUCCESS)
-                       return 0;
-               else if (ret == CMD_RST_PRC_EBUSY)
-                       return -EBUSY;
-       }
+       if (hr_dev->hw->chk_mbox_avail)
+               if (!hr_dev->hw->chk_mbox_avail(hr_dev, &is_busy))
+                       return is_busy ? -EBUSY : 0;
 
        if (hr_dev->cmd.use_events)
-               ret = hns_roce_cmd_mbox_wait(hr_dev, in_param, out_param,
-                                            in_modifier, op_modifier, op,
-                                            timeout);
+               return hns_roce_cmd_mbox_wait(hr_dev, in_param, out_param,
+                                             in_modifier, op_modifier, op,
+                                             timeout);
        else
-               ret = hns_roce_cmd_mbox_poll(hr_dev, in_param, out_param,
-                                            in_modifier, op_modifier, op,
-                                            timeout);
-
-       if (ret == CMD_RST_PRC_EBUSY)
-               return -EBUSY;
-
-       if (ret && (hr_dev->hw->rst_prc_mbox &&
-                   hr_dev->hw->rst_prc_mbox(hr_dev) == CMD_RST_PRC_SUCCESS))
-               return 0;
-
-       return ret;
+               return hns_roce_cmd_mbox_poll(hr_dev, in_param, out_param,
+                                             in_modifier, op_modifier, op,
+                                             timeout);
 }
 
 int hns_roce_cmd_init(struct hns_roce_dev *hr_dev)
 {
-       struct device *dev = hr_dev->dev;
-
-       mutex_init(&hr_dev->cmd.hcr_mutex);
        sema_init(&hr_dev->cmd.poll_sem, 1);
        hr_dev->cmd.use_events = 0;
        hr_dev->cmd.max_cmds = CMD_MAX_NUM;
-       hr_dev->cmd.pool = dma_pool_create("hns_roce_cmd", dev,
+       hr_dev->cmd.pool = dma_pool_create("hns_roce_cmd", hr_dev->dev,
                                           HNS_ROCE_MAILBOX_SIZE,
                                           HNS_ROCE_MAILBOX_SIZE, 0);
        if (!hr_dev->cmd.pool)
@@ -239,16 +219,16 @@ int hns_roce_cmd_use_events(struct hns_roce_dev *hr_dev)
        for (i = 0; i < hr_cmd->max_cmds; ++i) {
                hr_cmd->context[i].token = i;
                hr_cmd->context[i].next = i + 1;
+               init_completion(&hr_cmd->context[i].done);
        }
-
-       hr_cmd->context[hr_cmd->max_cmds - 1].next = -1;
+       hr_cmd->context[hr_cmd->max_cmds - 1].next = 0;
        hr_cmd->free_head = 0;
 
        sema_init(&hr_cmd->event_sem, hr_cmd->max_cmds);
        spin_lock_init(&hr_cmd->context_lock);
 
-       hr_cmd->token_mask = CMD_TOKEN_MASK;
        hr_cmd->use_events = 1;
+       down(&hr_cmd->poll_sem);
 
        return 0;
 }
@@ -259,6 +239,8 @@ void hns_roce_cmd_use_polling(struct hns_roce_dev *hr_dev)
 
        kfree(hr_cmd->context);
        hr_cmd->use_events = 0;
+
+       up(&hr_cmd->poll_sem);
 }
 
 struct hns_roce_cmd_mailbox *
index 23c438cef40d0438588f610b52b44a7f3e5f0235..d5fe56c78394003e19bd6e6b9638324a254a2c2f 100644 (file)
@@ -48,7 +48,8 @@
 #define roce_set_field(origin, mask, shift, val)                               \
        do {                                                                   \
                (origin) &= ~cpu_to_le32(mask);                                \
-               (origin) |= cpu_to_le32(((u32)(val) << (u32)(shift)) & (mask));     \
+               (origin) |=                                                    \
+                       cpu_to_le32(((u32)(val) << (u32)(shift)) & (mask));    \
        } while (0)
 
 #define roce_set_bit(origin, shift, val)                                       \
@@ -59,9 +60,9 @@
 #define _hr_reg_enable(ptr, field_type, field_h, field_l)                      \
        ({                                                                     \
                const field_type *_ptr = ptr;                                  \
-               *((__le32 *)_ptr + (field_h) / 32) |=                          \
-                       cpu_to_le32(BIT((field_l) % 32)) +                     \
-                       BUILD_BUG_ON_ZERO((field_h) != (field_l))            \
+               *((__le32 *)_ptr + (field_h) / 32) |= cpu_to_le32(             \
+                       BIT((field_l) % 32) +                                  \
+                       BUILD_BUG_ON_ZERO((field_h) != (field_l)));            \
        })
 
 #define hr_reg_enable(ptr, field) _hr_reg_enable(ptr, field)
 #define _hr_reg_clear(ptr, field_type, field_h, field_l)                       \
        ({                                                                     \
                const field_type *_ptr = ptr;                                  \
+               BUILD_BUG_ON(((field_h) / 32) != ((field_l) / 32));            \
                *((__le32 *)_ptr + (field_h) / 32) &=                          \
-                       cpu_to_le32(                                           \
-                               ~GENMASK((field_h) % 32, (field_l) % 32)) +    \
-                       BUILD_BUG_ON_ZERO(((field_h) / 32) !=                  \
-                                         ((field_l) / 32));                   \
+                       ~cpu_to_le32(GENMASK((field_h) % 32, (field_l) % 32)); \
        })
 
 #define hr_reg_clear(ptr, field) _hr_reg_clear(ptr, field)
 
 #define hr_reg_write(ptr, field, val) _hr_reg_write(ptr, field, val)
 
+#define _hr_reg_read(ptr, field_type, field_h, field_l)                        \
+       ({                                                                     \
+               const field_type *_ptr = ptr;                                  \
+               BUILD_BUG_ON(((field_h) / 32) != ((field_l) / 32));            \
+               FIELD_GET(GENMASK((field_h) % 32, (field_l) % 32),             \
+                         le32_to_cpu(*((__le32 *)_ptr + (field_h) / 32)));    \
+       })
+
+#define hr_reg_read(ptr, field) _hr_reg_read(ptr, field)
+
 #define ROCEE_GLB_CFG_ROCEE_DB_SQ_MODE_S 3
 #define ROCEE_GLB_CFG_ROCEE_DB_OTH_MODE_S 4
 
index 74fc4940b03a7fd11eb75c02860b7c501ddca139..800884b074f25d64366784a6df6b3f4281da1004 100644 (file)
@@ -225,7 +225,7 @@ static int alloc_cq_db(struct hns_roce_dev *hr_dev, struct hns_roce_cq *hr_cq,
                       struct ib_udata *udata, unsigned long addr,
                       struct hns_roce_ib_create_cq_resp *resp)
 {
-       bool has_db = hr_dev->caps.flags & HNS_ROCE_CAP_FLAG_RECORD_DB;
+       bool has_db = hr_dev->caps.flags & HNS_ROCE_CAP_FLAG_CQ_RECORD_DB;
        struct hns_roce_ucontext *uctx;
        int err;
 
@@ -250,8 +250,8 @@ static int alloc_cq_db(struct hns_roce_dev *hr_dev, struct hns_roce_cq *hr_cq,
                        *hr_cq->set_ci_db = 0;
                        hr_cq->flags |= HNS_ROCE_CQ_FLAG_RECORD_DB;
                }
-               hr_cq->cq_db_l = hr_dev->reg_base + hr_dev->odb_offset +
-                                DB_REG_OFFSET * hr_dev->priv_uar.index;
+               hr_cq->db_reg = hr_dev->reg_base + hr_dev->odb_offset +
+                               DB_REG_OFFSET * hr_dev->priv_uar.index;
        }
 
        return 0;
@@ -276,6 +276,57 @@ static void free_cq_db(struct hns_roce_dev *hr_dev, struct hns_roce_cq *hr_cq,
        }
 }
 
+static int verify_cq_create_attr(struct hns_roce_dev *hr_dev,
+                                const struct ib_cq_init_attr *attr)
+{
+       struct ib_device *ibdev = &hr_dev->ib_dev;
+
+       if (!attr->cqe || attr->cqe > hr_dev->caps.max_cqes) {
+               ibdev_err(ibdev, "failed to check CQ count %u, max = %u.\n",
+                         attr->cqe, hr_dev->caps.max_cqes);
+               return -EINVAL;
+       }
+
+       if (attr->comp_vector >= hr_dev->caps.num_comp_vectors) {
+               ibdev_err(ibdev, "failed to check CQ vector = %u, max = %d.\n",
+                         attr->comp_vector, hr_dev->caps.num_comp_vectors);
+               return -EINVAL;
+       }
+
+       return 0;
+}
+
+static int get_cq_ucmd(struct hns_roce_cq *hr_cq, struct ib_udata *udata,
+                      struct hns_roce_ib_create_cq *ucmd)
+{
+       struct ib_device *ibdev = hr_cq->ib_cq.device;
+       int ret;
+
+       ret = ib_copy_from_udata(ucmd, udata, min(udata->inlen, sizeof(*ucmd)));
+       if (ret) {
+               ibdev_err(ibdev, "failed to copy CQ udata, ret = %d.\n", ret);
+               return ret;
+       }
+
+       return 0;
+}
+
+static void set_cq_param(struct hns_roce_cq *hr_cq, u32 cq_entries, int vector,
+                        struct hns_roce_ib_create_cq *ucmd)
+{
+       struct hns_roce_dev *hr_dev = to_hr_dev(hr_cq->ib_cq.device);
+
+       cq_entries = max(cq_entries, hr_dev->caps.min_cqes);
+       cq_entries = roundup_pow_of_two(cq_entries);
+       hr_cq->ib_cq.cqe = cq_entries - 1; /* used as cqe index */
+       hr_cq->cq_depth = cq_entries;
+       hr_cq->vector = vector;
+
+       spin_lock_init(&hr_cq->lock);
+       INIT_LIST_HEAD(&hr_cq->sq_list);
+       INIT_LIST_HEAD(&hr_cq->rq_list);
+}
+
 static void set_cqe_size(struct hns_roce_cq *hr_cq, struct ib_udata *udata,
                         struct hns_roce_ib_create_cq *ucmd)
 {
@@ -299,44 +350,23 @@ int hns_roce_create_cq(struct ib_cq *ib_cq, const struct ib_cq_init_attr *attr,
        struct hns_roce_cq *hr_cq = to_hr_cq(ib_cq);
        struct ib_device *ibdev = &hr_dev->ib_dev;
        struct hns_roce_ib_create_cq ucmd = {};
-       int vector = attr->comp_vector;
-       u32 cq_entries = attr->cqe;
        int ret;
 
        if (attr->flags)
                return -EOPNOTSUPP;
 
-       if (cq_entries < 1 || cq_entries > hr_dev->caps.max_cqes) {
-               ibdev_err(ibdev, "failed to check CQ count %u, max = %u.\n",
-                         cq_entries, hr_dev->caps.max_cqes);
-               return -EINVAL;
-       }
-
-       if (vector >= hr_dev->caps.num_comp_vectors) {
-               ibdev_err(ibdev, "failed to check CQ vector = %d, max = %d.\n",
-                         vector, hr_dev->caps.num_comp_vectors);
-               return -EINVAL;
-       }
-
-       cq_entries = max(cq_entries, hr_dev->caps.min_cqes);
-       cq_entries = roundup_pow_of_two(cq_entries);
-       hr_cq->ib_cq.cqe = cq_entries - 1; /* used as cqe index */
-       hr_cq->cq_depth = cq_entries;
-       hr_cq->vector = vector;
-       spin_lock_init(&hr_cq->lock);
-       INIT_LIST_HEAD(&hr_cq->sq_list);
-       INIT_LIST_HEAD(&hr_cq->rq_list);
+       ret = verify_cq_create_attr(hr_dev, attr);
+       if (ret)
+               return ret;
 
        if (udata) {
-               ret = ib_copy_from_udata(&ucmd, udata,
-                                        min(udata->inlen, sizeof(ucmd)));
-               if (ret) {
-                       ibdev_err(ibdev, "failed to copy CQ udata, ret = %d.\n",
-                                 ret);
+               ret = get_cq_ucmd(hr_cq, udata, &ucmd);
+               if (ret)
                        return ret;
-               }
        }
 
+       set_cq_param(hr_cq, attr->cqe, attr->comp_vector, &ucmd);
+
        set_cqe_size(hr_cq, udata, &ucmd);
 
        ret = alloc_cq_buf(hr_dev, hr_cq, udata, ucmd.buf_addr);
index 3d6b7a2db496c604726dcce3d55fac3e82442060..97800d2b9d39f9b65f2ab060dc949661ab589437 100644 (file)
@@ -137,6 +137,7 @@ enum {
        SERV_TYPE_UC,
        SERV_TYPE_RD,
        SERV_TYPE_UD,
+       SERV_TYPE_XRC = 5,
 };
 
 enum hns_roce_qp_state {
@@ -168,6 +169,8 @@ enum hns_roce_event {
        HNS_ROCE_EVENT_TYPE_DB_OVERFLOW               = 0x12,
        HNS_ROCE_EVENT_TYPE_MB                        = 0x13,
        HNS_ROCE_EVENT_TYPE_FLR                       = 0x15,
+       HNS_ROCE_EVENT_TYPE_XRCD_VIOLATION            = 0x16,
+       HNS_ROCE_EVENT_TYPE_INVALID_XRCETH            = 0x17,
 };
 
 #define HNS_ROCE_CAP_FLAGS_EX_SHIFT 12
@@ -176,9 +179,10 @@ enum {
        HNS_ROCE_CAP_FLAG_REREG_MR              = BIT(0),
        HNS_ROCE_CAP_FLAG_ROCE_V1_V2            = BIT(1),
        HNS_ROCE_CAP_FLAG_RQ_INLINE             = BIT(2),
-       HNS_ROCE_CAP_FLAG_RECORD_DB             = BIT(3),
-       HNS_ROCE_CAP_FLAG_SQ_RECORD_DB          = BIT(4),
+       HNS_ROCE_CAP_FLAG_CQ_RECORD_DB          = BIT(3),
+       HNS_ROCE_CAP_FLAG_QP_RECORD_DB          = BIT(4),
        HNS_ROCE_CAP_FLAG_SRQ                   = BIT(5),
+       HNS_ROCE_CAP_FLAG_XRC                   = BIT(6),
        HNS_ROCE_CAP_FLAG_MW                    = BIT(7),
        HNS_ROCE_CAP_FLAG_FRMR                  = BIT(8),
        HNS_ROCE_CAP_FLAG_QP_FLOW_CTRL          = BIT(9),
@@ -214,12 +218,6 @@ enum {
        HNS_ROCE_RST_DIRECT_RETURN              = 0,
 };
 
-enum {
-       CMD_RST_PRC_OTHERS,
-       CMD_RST_PRC_SUCCESS,
-       CMD_RST_PRC_EBUSY,
-};
-
 #define HNS_ROCE_CMD_SUCCESS                   1
 
 /* The minimum page size is 4K for hardware */
@@ -244,6 +242,11 @@ struct hns_roce_pd {
        unsigned long           pdn;
 };
 
+struct hns_roce_xrcd {
+       struct ib_xrcd ibxrcd;
+       u32 xrcdn;
+};
+
 struct hns_roce_bitmap {
        /* Bitmap Traversal last a bit which is 1 */
        unsigned long           last;
@@ -363,7 +366,7 @@ struct hns_roce_wq {
        int             wqe_shift;      /* WQE size */
        u32             head;
        u32             tail;
-       void __iomem    *db_reg_l;
+       void __iomem    *db_reg;
 };
 
 struct hns_roce_sge {
@@ -437,7 +440,7 @@ struct hns_roce_cq {
        u32                             cq_depth;
        u32                             cons_index;
        u32                             *set_ci_db;
-       void __iomem                    *cq_db_l;
+       void __iomem                    *db_reg;
        u16                             *tptr_addr;
        int                             arm_sn;
        int                             cqe_size;
@@ -467,7 +470,8 @@ struct hns_roce_srq {
        u32                     rsv_sge;
        int                     wqe_shift;
        u32                     cqn;
-       void __iomem            *db_reg_l;
+       u32                     xrcdn;
+       void __iomem            *db_reg;
 
        atomic_t                refcount;
        struct completion       free;
@@ -546,6 +550,7 @@ struct hns_roce_cmd_context {
        int                     next;
        u64                     out_param;
        u16                     token;
+       u16                     busy;
 };
 
 struct hns_roce_cmdq {
@@ -561,11 +566,6 @@ struct hns_roce_cmdq {
        spinlock_t              context_lock;
        int                     free_head;
        struct hns_roce_cmd_context *context;
-       /*
-        * Result of get integer part
-        * which max_comds compute according a power of 2
-        */
-       u16                     token_mask;
        /*
         * Process whether use event mode, init default non-zero
         * After the event queue of cmd event ready,
@@ -640,6 +640,8 @@ struct hns_roce_qp {
                                         enum hns_roce_event event_type);
        unsigned long           qpn;
 
+       u32                     xrcdn;
+
        atomic_t                refcount;
        struct completion       free;
 
@@ -695,7 +697,7 @@ struct hns_roce_aeqe {
 
 struct hns_roce_eq {
        struct hns_roce_dev             *hr_dev;
-       void __iomem                    *doorbell;
+       void __iomem                    *db_reg;
 
        int                             type_flag; /* Aeq:1 ceq:0 */
        int                             eqn;
@@ -723,6 +725,13 @@ struct hns_roce_eq_table {
        void __iomem            **eqc_base; /* only for hw v1 */
 };
 
+enum cong_type {
+       CONG_TYPE_DCQCN,
+       CONG_TYPE_LDCP,
+       CONG_TYPE_HC3,
+       CONG_TYPE_DIP,
+};
+
 struct hns_roce_caps {
        u64             fw_ver;
        u8              num_ports;
@@ -759,13 +768,14 @@ struct hns_roce_caps {
        int             num_other_vectors;
        u32             num_mtpts;
        u32             num_mtt_segs;
-       u32             num_cqe_segs;
        u32             num_srqwqe_segs;
        u32             num_idx_segs;
        int             reserved_mrws;
        int             reserved_uars;
        int             num_pds;
        int             reserved_pds;
+       u32             num_xrcds;
+       u32             reserved_xrcds;
        u32             mtt_entry_sz;
        u32             cqe_sz;
        u32             page_size_cap;
@@ -794,6 +804,9 @@ struct hns_roce_caps {
        u32             cqc_bt_num;
        u32             cqc_timer_bt_num;
        u32             mpt_bt_num;
+       u32             eqc_bt_num;
+       u32             smac_bt_num;
+       u32             sgid_bt_num;
        u32             sccc_bt_num;
        u32             gmv_bt_num;
        u32             qpc_ba_pg_sz;
@@ -851,6 +864,7 @@ struct hns_roce_caps {
        u16             default_aeq_period;
        u16             default_aeq_arm_st;
        u16             default_ceq_arm_st;
+       enum cong_type  cong_type;
 };
 
 struct hns_roce_dfx_hw {
@@ -874,9 +888,10 @@ struct hns_roce_hw {
        int (*post_mbox)(struct hns_roce_dev *hr_dev, u64 in_param,
                         u64 out_param, u32 in_modifier, u8 op_modifier, u16 op,
                         u16 token, int event);
-       int (*chk_mbox)(struct hns_roce_dev *hr_dev, unsigned int timeout);
-       int (*rst_prc_mbox)(struct hns_roce_dev *hr_dev);
-       int (*set_gid)(struct hns_roce_dev *hr_dev, u8 port, int gid_index,
+       int (*poll_mbox_done)(struct hns_roce_dev *hr_dev,
+                             unsigned int timeout);
+       bool (*chk_mbox_avail)(struct hns_roce_dev *hr_dev, bool *is_busy);
+       int (*set_gid)(struct hns_roce_dev *hr_dev, u32 port, int gid_index,
                       const union ib_gid *gid, const struct ib_gid_attr *attr);
        int (*set_mac)(struct hns_roce_dev *hr_dev, u8 phy_port, u8 *addr);
        void (*set_mtu)(struct hns_roce_dev *hr_dev, u8 phy_port,
@@ -897,33 +912,17 @@ struct hns_roce_hw {
        int (*clear_hem)(struct hns_roce_dev *hr_dev,
                         struct hns_roce_hem_table *table, int obj,
                         int step_idx);
-       int (*query_qp)(struct ib_qp *ibqp, struct ib_qp_attr *qp_attr,
-                       int qp_attr_mask, struct ib_qp_init_attr *qp_init_attr);
        int (*modify_qp)(struct ib_qp *ibqp, const struct ib_qp_attr *attr,
                         int attr_mask, enum ib_qp_state cur_state,
                         enum ib_qp_state new_state);
-       int (*destroy_qp)(struct ib_qp *ibqp, struct ib_udata *udata);
        int (*qp_flow_control_init)(struct hns_roce_dev *hr_dev,
                         struct hns_roce_qp *hr_qp);
-       int (*post_send)(struct ib_qp *ibqp, const struct ib_send_wr *wr,
-                        const struct ib_send_wr **bad_wr);
-       int (*post_recv)(struct ib_qp *qp, const struct ib_recv_wr *recv_wr,
-                        const struct ib_recv_wr **bad_recv_wr);
-       int (*req_notify_cq)(struct ib_cq *ibcq, enum ib_cq_notify_flags flags);
-       int (*poll_cq)(struct ib_cq *ibcq, int num_entries, struct ib_wc *wc);
        int (*dereg_mr)(struct hns_roce_dev *hr_dev, struct hns_roce_mr *mr,
                        struct ib_udata *udata);
        int (*destroy_cq)(struct ib_cq *ibcq, struct ib_udata *udata);
-       int (*modify_cq)(struct ib_cq *cq, u16 cq_count, u16 cq_period);
        int (*init_eq)(struct hns_roce_dev *hr_dev);
        void (*cleanup_eq)(struct hns_roce_dev *hr_dev);
        int (*write_srqc)(struct hns_roce_srq *srq, void *mb_buf);
-       int (*modify_srq)(struct ib_srq *ibsrq, struct ib_srq_attr *srq_attr,
-                      enum ib_srq_attr_mask srq_attr_mask,
-                      struct ib_udata *udata);
-       int (*query_srq)(struct ib_srq *ibsrq, struct ib_srq_attr *attr);
-       int (*post_srq_recv)(struct ib_srq *ibsrq, const struct ib_recv_wr *wr,
-                            const struct ib_recv_wr **bad_wr);
        const struct ib_device_ops *hns_roce_dev_ops;
        const struct ib_device_ops *hns_roce_dev_srq_ops;
 };
@@ -945,6 +944,8 @@ struct hns_roce_dev {
        enum hns_roce_device_state state;
        struct list_head        qp_list; /* list of all qps on this dev */
        spinlock_t              qp_list_lock; /* protect qp_list */
+       struct list_head        dip_list; /* list of all dest ips on this dev */
+       spinlock_t              dip_list_lock; /* protect dip_list */
 
        struct list_head        pgdir_list;
        struct mutex            pgdir_mutex;
@@ -963,6 +964,7 @@ struct hns_roce_dev {
 
        struct hns_roce_cmdq    cmd;
        struct hns_roce_bitmap    pd_bitmap;
+       struct hns_roce_bitmap xrcd_bitmap;
        struct hns_roce_uar_table uar_table;
        struct hns_roce_mr_table  mr_table;
        struct hns_roce_cq_table  cq_table;
@@ -986,6 +988,9 @@ struct hns_roce_dev {
        void                    *priv;
        struct workqueue_struct *irq_workq;
        const struct hns_roce_dfx_hw *dfx;
+       u32 func_num;
+       u32 is_vf;
+       u32 cong_algo_tmpl_id;
 };
 
 static inline struct hns_roce_dev *to_hr_dev(struct ib_device *ib_dev)
@@ -1004,6 +1009,11 @@ static inline struct hns_roce_pd *to_hr_pd(struct ib_pd *ibpd)
        return container_of(ibpd, struct hns_roce_pd, ibpd);
 }
 
+static inline struct hns_roce_xrcd *to_hr_xrcd(struct ib_xrcd *ibxrcd)
+{
+       return container_of(ibxrcd, struct hns_roce_xrcd, ibxrcd);
+}
+
 static inline struct hns_roce_ah *to_hr_ah(struct ib_ah *ibah)
 {
        return container_of(ibah, struct hns_roce_ah, ibah);
@@ -1136,6 +1146,7 @@ int hns_roce_init_mr_table(struct hns_roce_dev *hr_dev);
 void hns_roce_init_cq_table(struct hns_roce_dev *hr_dev);
 int hns_roce_init_qp_table(struct hns_roce_dev *hr_dev);
 int hns_roce_init_srq_table(struct hns_roce_dev *hr_dev);
+int hns_roce_init_xrcd_table(struct hns_roce_dev *hr_dev);
 
 void hns_roce_cleanup_pd_table(struct hns_roce_dev *hr_dev);
 void hns_roce_cleanup_mr_table(struct hns_roce_dev *hr_dev);
@@ -1143,6 +1154,7 @@ void hns_roce_cleanup_eq_table(struct hns_roce_dev *hr_dev);
 void hns_roce_cleanup_cq_table(struct hns_roce_dev *hr_dev);
 void hns_roce_cleanup_qp_table(struct hns_roce_dev *hr_dev);
 void hns_roce_cleanup_srq_table(struct hns_roce_dev *hr_dev);
+void hns_roce_cleanup_xrcd_table(struct hns_roce_dev *hr_dev);
 
 int hns_roce_bitmap_alloc(struct hns_roce_bitmap *bitmap, unsigned long *obj);
 void hns_roce_bitmap_free(struct hns_roce_bitmap *bitmap, unsigned long obj,
@@ -1207,6 +1219,9 @@ int hns_roce_modify_srq(struct ib_srq *ibsrq, struct ib_srq_attr *srq_attr,
                        struct ib_udata *udata);
 int hns_roce_destroy_srq(struct ib_srq *ibsrq, struct ib_udata *udata);
 
+int hns_roce_alloc_xrcd(struct ib_xrcd *ib_xrcd, struct ib_udata *udata);
+int hns_roce_dealloc_xrcd(struct ib_xrcd *ib_xrcd, struct ib_udata *udata);
+
 struct ib_qp *hns_roce_create_qp(struct ib_pd *ib_pd,
                                 struct ib_qp_init_attr *init_attr,
                                 struct ib_udata *udata);
@@ -1246,7 +1261,7 @@ void hns_roce_cq_completion(struct hns_roce_dev *hr_dev, u32 cqn);
 void hns_roce_cq_event(struct hns_roce_dev *hr_dev, u32 cqn, int event_type);
 void hns_roce_qp_event(struct hns_roce_dev *hr_dev, u32 qpn, int event_type);
 void hns_roce_srq_event(struct hns_roce_dev *hr_dev, u32 srqn, int event_type);
-u8 hns_get_gid_index(struct hns_roce_dev *hr_dev, u8 port, int gid_index);
+u8 hns_get_gid_index(struct hns_roce_dev *hr_dev, u32 port, int gid_index);
 void hns_roce_handle_device_err(struct hns_roce_dev *hr_dev);
 int hns_roce_init(struct hns_roce_dev *hr_dev);
 void hns_roce_exit(struct hns_roce_dev *hr_dev);
index 5346fdca9473919716e4a01670673a7ccbaa9541..620acf66b22cc3519e8490965ac42f3f0c99c430 100644 (file)
@@ -54,7 +54,7 @@
  *             GID[0][0], GID[1][0],.....GID[N - 1][0],
  *             And so on
  */
-u8 hns_get_gid_index(struct hns_roce_dev *hr_dev, u8 port, int gid_index)
+u8 hns_get_gid_index(struct hns_roce_dev *hr_dev, u32 port, int gid_index)
 {
        return gid_index * hr_dev->caps.num_ports + port;
 }
@@ -345,7 +345,7 @@ out:
                doorbell[0] = sq_db.u32_4;
                doorbell[1] = sq_db.u32_8;
 
-               hns_roce_write64_k(doorbell, qp->sq.db_reg_l);
+               hns_roce_write64_k(doorbell, qp->sq.db_reg);
        }
 
        spin_unlock_irqrestore(&qp->sq.lock, flags);
@@ -440,7 +440,7 @@ out:
                        doorbell[0] = rq_db.u32_4;
                        doorbell[1] = rq_db.u32_8;
 
-                       hns_roce_write64_k(doorbell, hr_qp->rq.db_reg_l);
+                       hns_roce_write64_k(doorbell, hr_qp->rq.db_reg);
                }
        }
        spin_unlock_irqrestore(&hr_qp->rq.lock, flags);
@@ -538,7 +538,7 @@ static void hns_roce_set_sdb_ext(struct hns_roce_dev *hr_dev, u32 ext_sdb_alept,
        /*
         * 44 = 32 + 12, When evaluating addr to hardware, shift 12 because of
         * using 4K page, and shift more 32 because of
-        * caculating the high 32 bit value evaluated to hardware.
+        * calculating the high 32 bit value evaluated to hardware.
         */
        roce_set_field(tmp, ROCEE_EXT_DB_SQ_H_EXT_DB_SQ_BA_H_M,
                       ROCEE_EXT_DB_SQ_H_EXT_DB_SQ_BA_H_S, sdb_dma_addr >> 44);
@@ -711,7 +711,7 @@ static int hns_roce_v1_rsv_lp_qp(struct hns_roce_dev *hr_dev)
        int i, j;
        u8 queue_en[HNS_ROCE_V1_RESV_QP] = { 0 };
        u8 phy_port;
-       u8 port = 0;
+       u32 port = 0;
        u8 sl;
 
        /* Reserved cq for loop qp */
@@ -1189,7 +1189,7 @@ static int hns_roce_raq_init(struct hns_roce_dev *hr_dev)
        /*
         * 44 = 32 + 12, When evaluating addr to hardware, shift 12 because of
         * using 4K page, and shift more 32 because of
-        * caculating the high 32 bit value evaluated to hardware.
+        * calculating the high 32 bit value evaluated to hardware.
         */
        roce_set_field(tmp, ROCEE_EXT_RAQ_H_EXT_RAQ_BA_H_M,
                       ROCEE_EXT_RAQ_H_EXT_RAQ_BA_H_S,
@@ -1382,7 +1382,6 @@ static int hns_roce_free_mr_init(struct hns_roce_dev *hr_dev)
        ret = hns_roce_v1_rsv_lp_qp(hr_dev);
        if (ret) {
                dev_err(dev, "Reserved loop qp failed(%d)!\n", ret);
-               flush_workqueue(free_mr->free_mr_wq);
                destroy_workqueue(free_mr->free_mr_wq);
        }
 
@@ -1394,7 +1393,6 @@ static void hns_roce_free_mr_free(struct hns_roce_dev *hr_dev)
        struct hns_roce_v1_priv *priv = hr_dev->priv;
        struct hns_roce_free_mr *free_mr = &priv->free_mr;
 
-       flush_workqueue(free_mr->free_mr_wq);
        destroy_workqueue(free_mr->free_mr_wq);
 
        hns_roce_v1_release_lp_qp(hr_dev);
@@ -1676,7 +1674,7 @@ static int hns_roce_v1_chk_mbox(struct hns_roce_dev *hr_dev,
        return 0;
 }
 
-static int hns_roce_v1_set_gid(struct hns_roce_dev *hr_dev, u8 port,
+static int hns_roce_v1_set_gid(struct hns_roce_dev *hr_dev, u32 port,
                               int gid_index, const union ib_gid *gid,
                               const struct ib_gid_attr *attr)
 {
@@ -1939,7 +1937,7 @@ static void hns_roce_v1_cq_set_ci(struct hns_roce_cq *hr_cq, u32 cons_index)
        roce_set_field(doorbell[1], ROCEE_DB_OTHERS_H_ROCEE_DB_OTH_INP_H_M,
                       ROCEE_DB_OTHERS_H_ROCEE_DB_OTH_INP_H_S, hr_cq->cqn);
 
-       hns_roce_write64_k(doorbell, hr_cq->cq_db_l);
+       hns_roce_write64_k(doorbell, hr_cq->db_reg);
 }
 
 static void __hns_roce_v1_cq_clean(struct hns_roce_cq *hr_cq, u32 qpn,
@@ -2041,7 +2039,7 @@ static void hns_roce_v1_write_cqc(struct hns_roce_dev *hr_dev,
        /**
         * 44 = 32 + 12, When evaluating addr to hardware, shift 12 because of
         * using 4K page, and shift more 32 because of
-        * caculating the high 32 bit value evaluated to hardware.
+        * calculating the high 32 bit value evaluated to hardware.
         */
        roce_set_field(cq_context->cqc_byte_20,
                       CQ_CONTEXT_CQC_BYTE_20_CQE_TPTR_ADDR_H_M,
@@ -2092,7 +2090,7 @@ static int hns_roce_v1_req_notify_cq(struct ib_cq *ibcq,
                       ROCEE_DB_OTHERS_H_ROCEE_DB_OTH_INP_H_S,
                       hr_cq->cqn | notification_flag);
 
-       hns_roce_write64_k(doorbell, hr_cq->cq_db_l);
+       hns_roce_write64_k(doorbell, hr_cq->db_reg);
 
        return 0;
 }
@@ -2673,8 +2671,8 @@ static int hns_roce_v1_m_qp(struct ib_qp *ibqp, const struct ib_qp_attr *attr,
        int ret = -EINVAL;
        u64 sq_ba = 0;
        u64 rq_ba = 0;
-       int port;
-       u8 port_num;
+       u32 port;
+       u32 port_num;
        u8 *dmac;
        u8 *smac;
 
@@ -3217,12 +3215,12 @@ static int hns_roce_v1_m_qp(struct ib_qp *ibqp, const struct ib_qp_attr *attr,
                roce_set_bit(doorbell[1], RQ_DOORBELL_U32_8_HW_SYNC_S, 1);
 
                if (ibqp->uobject) {
-                       hr_qp->rq.db_reg_l = hr_dev->reg_base +
+                       hr_qp->rq.db_reg = hr_dev->reg_base +
                                     hr_dev->odb_offset +
                                     DB_REG_OFFSET * hr_dev->priv_uar.index;
                }
 
-               hns_roce_write64_k(doorbell, hr_qp->rq.db_reg_l);
+               hns_roce_write64_k(doorbell, hr_qp->rq.db_reg);
        }
 
        hr_qp->state = new_state;
@@ -3449,8 +3447,7 @@ static int hns_roce_v1_q_qp(struct ib_qp *ibqp, struct ib_qp_attr *qp_attr,
                                   ((roce_get_bit(context->qpc_bytes_4,
                        QP_CONTEXT_QPC_BYTE_4_ATOMIC_OPERATION_ENABLE_S)) << 3);
 
-       if (hr_qp->ibqp.qp_type == IB_QPT_RC ||
-           hr_qp->ibqp.qp_type == IB_QPT_UC) {
+       if (hr_qp->ibqp.qp_type == IB_QPT_RC) {
                struct ib_global_route *grh =
                        rdma_ah_retrieve_grh(&qp_attr->ah_attr);
 
@@ -3604,7 +3601,7 @@ static int hns_roce_v1_destroy_cq(struct ib_cq *ibcq, struct ib_udata *udata)
 static void set_eq_cons_index_v1(struct hns_roce_eq *eq, u32 req_not)
 {
        roce_raw_write((eq->cons_index & HNS_ROCE_V1_CONS_IDX_M) |
-                      (req_not << eq->log_entries), eq->doorbell);
+                      (req_not << eq->log_entries), eq->db_reg);
 }
 
 static void hns_roce_v1_wq_catas_err_handle(struct hns_roce_dev *hr_dev,
@@ -4170,7 +4167,7 @@ static int hns_roce_v1_create_eq(struct hns_roce_dev *hr_dev,
         * Configure eq extended address 45~49 bit.
         * 44 = 32 + 12, When evaluating addr to hardware, shift 12 because of
         * using 4K page, and shift more 32 because of
-        * caculating the high 32 bit value evaluated to hardware.
+        * calculating the high 32 bit value evaluated to hardware.
         */
        roce_set_field(tmp1, ROCEE_CAEP_AEQE_CUR_IDX_CAEP_AEQ_BT_H_M,
                       ROCEE_CAEP_AEQE_CUR_IDX_CAEP_AEQ_BT_H_S,
@@ -4234,9 +4231,9 @@ static int hns_roce_v1_init_eq_table(struct hns_roce_dev *hr_dev)
                                                ROCEE_CAEP_CEQC_SHIFT_0_REG +
                                                CEQ_REG_OFFSET * i;
                        eq->type_flag = HNS_ROCE_CEQ;
-                       eq->doorbell = hr_dev->reg_base +
-                                      ROCEE_CAEP_CEQC_CONS_IDX_0_REG +
-                                      CEQ_REG_OFFSET * i;
+                       eq->db_reg = hr_dev->reg_base +
+                                    ROCEE_CAEP_CEQC_CONS_IDX_0_REG +
+                                    CEQ_REG_OFFSET * i;
                        eq->entries = hr_dev->caps.ceqe_depth;
                        eq->log_entries = ilog2(eq->entries);
                        eq->eqe_size = HNS_ROCE_CEQE_SIZE;
@@ -4245,8 +4242,8 @@ static int hns_roce_v1_init_eq_table(struct hns_roce_dev *hr_dev)
                        eq_table->eqc_base[i] = hr_dev->reg_base +
                                                ROCEE_CAEP_AEQC_AEQE_SHIFT_REG;
                        eq->type_flag = HNS_ROCE_AEQ;
-                       eq->doorbell = hr_dev->reg_base +
-                                      ROCEE_CAEP_AEQE_CONS_IDX_REG;
+                       eq->db_reg = hr_dev->reg_base +
+                                    ROCEE_CAEP_AEQE_CONS_IDX_REG;
                        eq->entries = hr_dev->caps.aeqe_depth;
                        eq->log_entries = ilog2(eq->entries);
                        eq->eqe_size = HNS_ROCE_AEQE_SIZE;
@@ -4349,7 +4346,7 @@ static const struct hns_roce_hw hns_roce_hw_v1 = {
        .hw_init = hns_roce_v1_init,
        .hw_exit = hns_roce_v1_exit,
        .post_mbox = hns_roce_v1_post_mbox,
-       .chk_mbox = hns_roce_v1_chk_mbox,
+       .poll_mbox_done = hns_roce_v1_chk_mbox,
        .set_gid = hns_roce_v1_set_gid,
        .set_mac = hns_roce_v1_set_mac,
        .set_mtu = hns_roce_v1_set_mtu,
@@ -4357,12 +4354,6 @@ static const struct hns_roce_hw hns_roce_hw_v1 = {
        .write_cqc = hns_roce_v1_write_cqc,
        .clear_hem = hns_roce_v1_clear_hem,
        .modify_qp = hns_roce_v1_modify_qp,
-       .query_qp = hns_roce_v1_query_qp,
-       .destroy_qp = hns_roce_v1_destroy_qp,
-       .post_send = hns_roce_v1_post_send,
-       .post_recv = hns_roce_v1_post_recv,
-       .req_notify_cq = hns_roce_v1_req_notify_cq,
-       .poll_cq = hns_roce_v1_poll_cq,
        .dereg_mr = hns_roce_v1_dereg_mr,
        .destroy_cq = hns_roce_v1_destroy_cq,
        .init_eq = hns_roce_v1_init_eq_table,
index ce26f97b2ca26cc8373e8153d27e374c3c2fe95b..7652dafe32eca61f9b7417f1101a1461514845f1 100644 (file)
 #include "hns_roce_hem.h"
 #include "hns_roce_hw_v2.h"
 
+enum {
+       CMD_RST_PRC_OTHERS,
+       CMD_RST_PRC_SUCCESS,
+       CMD_RST_PRC_EBUSY,
+};
+
 static inline void set_data_seg_v2(struct hns_roce_v2_wqe_data_seg *dseg,
                                   struct ib_sge *sg)
 {
@@ -632,24 +638,60 @@ static inline void update_sq_db(struct hns_roce_dev *hr_dev,
         * around the mailbox calls. Hence, use the deferred flush for
         * now.
         */
-       if (qp->state == IB_QPS_ERR) {
+       if (unlikely(qp->state == IB_QPS_ERR)) {
                if (!test_and_set_bit(HNS_ROCE_FLUSH_FLAG, &qp->flush_flag))
                        init_flush_work(hr_dev, qp);
        } else {
                struct hns_roce_v2_db sq_db = {};
 
-               roce_set_field(sq_db.byte_4, V2_DB_BYTE_4_TAG_M,
-                              V2_DB_BYTE_4_TAG_S, qp->doorbell_qpn);
-               roce_set_field(sq_db.byte_4, V2_DB_BYTE_4_CMD_M,
-                              V2_DB_BYTE_4_CMD_S, HNS_ROCE_V2_SQ_DB);
+               roce_set_field(sq_db.byte_4, V2_DB_TAG_M, V2_DB_TAG_S,
+                              qp->doorbell_qpn);
+               roce_set_field(sq_db.byte_4, V2_DB_CMD_M, V2_DB_CMD_S,
+                              HNS_ROCE_V2_SQ_DB);
+
                /* indicates data on new BAR, 0 : SQ doorbell, 1 : DWQE */
                roce_set_bit(sq_db.byte_4, V2_DB_FLAG_S, 0);
-               roce_set_field(sq_db.parameter, V2_DB_PARAMETER_IDX_M,
-                              V2_DB_PARAMETER_IDX_S, qp->sq.head);
-               roce_set_field(sq_db.parameter, V2_DB_PARAMETER_SL_M,
-                              V2_DB_PARAMETER_SL_S, qp->sl);
+               roce_set_field(sq_db.parameter, V2_DB_PRODUCER_IDX_M,
+                              V2_DB_PRODUCER_IDX_S, qp->sq.head);
+               roce_set_field(sq_db.parameter, V2_DB_SL_M, V2_DB_SL_S,
+                              qp->sl);
+
+               hns_roce_write64(hr_dev, (__le32 *)&sq_db, qp->sq.db_reg);
+       }
+}
+
+static inline void update_rq_db(struct hns_roce_dev *hr_dev,
+                               struct hns_roce_qp *qp)
+{
+       /*
+        * Hip08 hardware cannot flush the WQEs in RQ if the QP state
+        * gets into errored mode. Hence, as a workaround to this
+        * hardware limitation, driver needs to assist in flushing. But
+        * the flushing operation uses mailbox to convey the QP state to
+        * the hardware and which can sleep due to the mutex protection
+        * around the mailbox calls. Hence, use the deferred flush for
+        * now.
+        */
+       if (unlikely(qp->state == IB_QPS_ERR)) {
+               if (!test_and_set_bit(HNS_ROCE_FLUSH_FLAG, &qp->flush_flag))
+                       init_flush_work(hr_dev, qp);
+       } else {
+               if (likely(qp->en_flags & HNS_ROCE_QP_CAP_RQ_RECORD_DB)) {
+                       *qp->rdb.db_record =
+                                       qp->rq.head & V2_DB_PRODUCER_IDX_M;
+               } else {
+                       struct hns_roce_v2_db rq_db = {};
+
+                       roce_set_field(rq_db.byte_4, V2_DB_TAG_M, V2_DB_TAG_S,
+                                      qp->qpn);
+                       roce_set_field(rq_db.byte_4, V2_DB_CMD_M, V2_DB_CMD_S,
+                                      HNS_ROCE_V2_RQ_DB);
+                       roce_set_field(rq_db.parameter, V2_DB_PRODUCER_IDX_M,
+                                      V2_DB_PRODUCER_IDX_S, qp->rq.head);
 
-               hns_roce_write64(hr_dev, (__le32 *)&sq_db, qp->sq.db_reg_l);
+                       hns_roce_write64(hr_dev, (__le32 *)&rq_db,
+                                        qp->rq.db_reg);
+               }
        }
 }
 
@@ -681,8 +723,7 @@ static void write_dwqe(struct hns_roce_dev *hr_dev, struct hns_roce_qp *qp,
        roce_set_field(rc_sq_wqe->byte_4, V2_RC_SEND_WQE_BYTE_4_WQE_INDEX_M,
                       V2_RC_SEND_WQE_BYTE_4_WQE_INDEX_S, qp->sq.head);
 
-       hns_roce_write512(hr_dev, wqe, hr_dev->mem_base +
-                         HNS_ROCE_DWQE_SIZE * qp->ibqp.qp_num);
+       hns_roce_write512(hr_dev, wqe, qp->sq.db_reg);
 }
 
 static int hns_roce_v2_post_send(struct ib_qp *ibqp,
@@ -879,22 +920,7 @@ out:
        if (likely(nreq)) {
                hr_qp->rq.head += nreq;
 
-               /*
-                * Hip08 hardware cannot flush the WQEs in RQ if the QP state
-                * gets into errored mode. Hence, as a workaround to this
-                * hardware limitation, driver needs to assist in flushing. But
-                * the flushing operation uses mailbox to convey the QP state to
-                * the hardware and which can sleep due to the mutex protection
-                * around the mailbox calls. Hence, use the deferred flush for
-                * now.
-                */
-               if (hr_qp->state == IB_QPS_ERR) {
-                       if (!test_and_set_bit(HNS_ROCE_FLUSH_FLAG,
-                                             &hr_qp->flush_flag))
-                               init_flush_work(hr_dev, hr_qp);
-               } else {
-                       *hr_qp->rdb.db_record = hr_qp->rq.head & 0xffff;
-               }
+               update_rq_db(hr_dev, hr_qp);
        }
        spin_unlock_irqrestore(&hr_qp->rq.lock, flags);
 
@@ -1016,13 +1042,14 @@ static int hns_roce_v2_post_srq_recv(struct ib_srq *ibsrq,
        }
 
        if (likely(nreq)) {
-               srq_db.byte_4 =
-                       cpu_to_le32(HNS_ROCE_V2_SRQ_DB << V2_DB_BYTE_4_CMD_S |
-                                   (srq->srqn & V2_DB_BYTE_4_TAG_M));
-               srq_db.parameter =
-                       cpu_to_le32(srq->idx_que.head & V2_DB_PARAMETER_IDX_M);
+               roce_set_field(srq_db.byte_4, V2_DB_TAG_M, V2_DB_TAG_S,
+                              srq->srqn);
+               roce_set_field(srq_db.byte_4, V2_DB_CMD_M, V2_DB_CMD_S,
+                              HNS_ROCE_V2_SRQ_DB);
+               roce_set_field(srq_db.parameter, V2_DB_PRODUCER_IDX_M,
+                              V2_DB_PRODUCER_IDX_S, srq->idx_que.head);
 
-               hns_roce_write64(hr_dev, (__le32 *)&srq_db, srq->db_reg_l);
+               hns_roce_write64(hr_dev, (__le32 *)&srq_db, srq->db_reg);
        }
 
        spin_unlock_irqrestore(&srq->lock, flags);
@@ -1030,7 +1057,7 @@ static int hns_roce_v2_post_srq_recv(struct ib_srq *ibsrq,
        return ret;
 }
 
-static int hns_roce_v2_cmd_hw_reseted(struct hns_roce_dev *hr_dev,
+static u32 hns_roce_v2_cmd_hw_reseted(struct hns_roce_dev *hr_dev,
                                      unsigned long instance_stage,
                                      unsigned long reset_stage)
 {
@@ -1053,7 +1080,7 @@ static int hns_roce_v2_cmd_hw_reseted(struct hns_roce_dev *hr_dev,
        return CMD_RST_PRC_SUCCESS;
 }
 
-static int hns_roce_v2_cmd_hw_resetting(struct hns_roce_dev *hr_dev,
+static u32 hns_roce_v2_cmd_hw_resetting(struct hns_roce_dev *hr_dev,
                                        unsigned long instance_stage,
                                        unsigned long reset_stage)
 {
@@ -1081,7 +1108,7 @@ static int hns_roce_v2_cmd_hw_resetting(struct hns_roce_dev *hr_dev,
        return CMD_RST_PRC_SUCCESS;
 }
 
-static int hns_roce_v2_cmd_sw_resetting(struct hns_roce_dev *hr_dev)
+static u32 hns_roce_v2_cmd_sw_resetting(struct hns_roce_dev *hr_dev)
 {
        struct hns_roce_v2_priv *priv = hr_dev->priv;
        struct hnae3_handle *handle = priv->handle;
@@ -1098,10 +1125,9 @@ static int hns_roce_v2_cmd_sw_resetting(struct hns_roce_dev *hr_dev)
        return CMD_RST_PRC_EBUSY;
 }
 
-static int hns_roce_v2_rst_process_cmd(struct hns_roce_dev *hr_dev)
+static u32 check_aedev_reset_status(struct hns_roce_dev *hr_dev,
+                                   struct hnae3_handle *handle)
 {
-       struct hns_roce_v2_priv *priv = hr_dev->priv;
-       struct hnae3_handle *handle = priv->handle;
        const struct hnae3_ae_ops *ops = handle->ae_algo->ops;
        unsigned long instance_stage; /* the current instance stage */
        unsigned long reset_stage; /* the current reset stage */
@@ -1109,9 +1135,6 @@ static int hns_roce_v2_rst_process_cmd(struct hns_roce_dev *hr_dev)
        bool sw_resetting;
        bool hw_resetting;
 
-       if (hr_dev->is_reset)
-               return CMD_RST_PRC_SUCCESS;
-
        /* Get information about reset from NIC driver or RoCE driver itself,
         * the meaning of the following variables from NIC driver are described
         * as below:
@@ -1122,19 +1145,53 @@ static int hns_roce_v2_rst_process_cmd(struct hns_roce_dev *hr_dev)
        instance_stage = handle->rinfo.instance_state;
        reset_stage = handle->rinfo.reset_state;
        reset_cnt = ops->ae_dev_reset_cnt(handle);
-       hw_resetting = ops->get_cmdq_stat(handle);
-       sw_resetting = ops->ae_dev_resetting(handle);
-
        if (reset_cnt != hr_dev->reset_cnt)
                return hns_roce_v2_cmd_hw_reseted(hr_dev, instance_stage,
                                                  reset_stage);
-       else if (hw_resetting)
+
+       hw_resetting = ops->get_cmdq_stat(handle);
+       if (hw_resetting)
                return hns_roce_v2_cmd_hw_resetting(hr_dev, instance_stage,
                                                    reset_stage);
-       else if (sw_resetting && instance_stage == HNS_ROCE_STATE_INIT)
+
+       sw_resetting = ops->ae_dev_resetting(handle);
+       if (sw_resetting && instance_stage == HNS_ROCE_STATE_INIT)
                return hns_roce_v2_cmd_sw_resetting(hr_dev);
 
-       return 0;
+       return CMD_RST_PRC_OTHERS;
+}
+
+static bool check_device_is_in_reset(struct hns_roce_dev *hr_dev)
+{
+       struct hns_roce_v2_priv *priv = hr_dev->priv;
+       struct hnae3_handle *handle = priv->handle;
+       const struct hnae3_ae_ops *ops = handle->ae_algo->ops;
+
+       if (hr_dev->reset_cnt != ops->ae_dev_reset_cnt(handle))
+               return true;
+
+       if (ops->get_hw_reset_stat(handle))
+               return true;
+
+       if (ops->ae_dev_resetting(handle))
+               return true;
+
+       return false;
+}
+
+static bool v2_chk_mbox_is_avail(struct hns_roce_dev *hr_dev, bool *busy)
+{
+       struct hns_roce_v2_priv *priv = hr_dev->priv;
+       u32 status;
+
+       if (hr_dev->is_reset)
+               status = CMD_RST_PRC_SUCCESS;
+       else
+               status = check_aedev_reset_status(hr_dev, priv->handle);
+
+       *busy = (status == CMD_RST_PRC_EBUSY);
+
+       return status == CMD_RST_PRC_OTHERS;
 }
 
 static int hns_roce_alloc_cmq_desc(struct hns_roce_dev *hr_dev,
@@ -1152,6 +1209,9 @@ static int hns_roce_alloc_cmq_desc(struct hns_roce_dev *hr_dev,
                ring->desc_dma_addr = 0;
                kfree(ring->desc);
                ring->desc = NULL;
+
+               dev_err_ratelimited(hr_dev->dev,
+                                   "failed to map cmq desc addr.\n");
                return -ENOMEM;
        }
 
@@ -1228,14 +1288,16 @@ static int hns_roce_v2_cmq_init(struct hns_roce_dev *hr_dev)
        /* Init CSQ */
        ret = hns_roce_init_cmq_ring(hr_dev, TYPE_CSQ);
        if (ret) {
-               dev_err(hr_dev->dev, "Init CSQ error, ret = %d.\n", ret);
+               dev_err_ratelimited(hr_dev->dev,
+                                   "failed to init CSQ, ret = %d.\n", ret);
                return ret;
        }
 
        /* Init CRQ */
        ret = hns_roce_init_cmq_ring(hr_dev, TYPE_CRQ);
        if (ret) {
-               dev_err(hr_dev->dev, "Init CRQ error, ret = %d.\n", ret);
+               dev_err_ratelimited(hr_dev->dev,
+                                   "failed to init CRQ, ret = %d.\n", ret);
                goto err_crq;
        }
 
@@ -1352,27 +1414,36 @@ static int __hns_roce_cmq_send(struct hns_roce_dev *hr_dev,
 static int hns_roce_cmq_send(struct hns_roce_dev *hr_dev,
                             struct hns_roce_cmq_desc *desc, int num)
 {
-       int retval;
+       bool busy;
        int ret;
 
-       ret = hns_roce_v2_rst_process_cmd(hr_dev);
-       if (ret == CMD_RST_PRC_SUCCESS)
-               return 0;
-       if (ret == CMD_RST_PRC_EBUSY)
-               return -EBUSY;
+       if (!v2_chk_mbox_is_avail(hr_dev, &busy))
+               return busy ? -EBUSY : 0;
 
        ret = __hns_roce_cmq_send(hr_dev, desc, num);
        if (ret) {
-               retval = hns_roce_v2_rst_process_cmd(hr_dev);
-               if (retval == CMD_RST_PRC_SUCCESS)
-                       return 0;
-               else if (retval == CMD_RST_PRC_EBUSY)
-                       return -EBUSY;
+               if (!v2_chk_mbox_is_avail(hr_dev, &busy))
+                       return busy ? -EBUSY : 0;
        }
 
        return ret;
 }
 
+static int config_hem_ba_to_hw(struct hns_roce_dev *hr_dev, unsigned long obj,
+                              dma_addr_t base_addr, u16 op)
+{
+       struct hns_roce_cmd_mailbox *mbox = hns_roce_alloc_cmd_mailbox(hr_dev);
+       int ret;
+
+       if (IS_ERR(mbox))
+               return PTR_ERR(mbox);
+
+       ret = hns_roce_cmd_mbox(hr_dev, base_addr, mbox->dma, obj, 0, op,
+                               HNS_ROCE_CMD_TIMEOUT_MSECS);
+       hns_roce_free_cmd_mailbox(hr_dev, mbox);
+       return ret;
+}
+
 static int hns_roce_cmq_query_hw_info(struct hns_roce_dev *hr_dev)
 {
        struct hns_roce_query_version *resp;
@@ -1391,92 +1462,90 @@ static int hns_roce_cmq_query_hw_info(struct hns_roce_dev *hr_dev)
        return 0;
 }
 
-static bool hns_roce_func_clr_chk_rst(struct hns_roce_dev *hr_dev)
+static void func_clr_hw_resetting_state(struct hns_roce_dev *hr_dev,
+                                       struct hnae3_handle *handle)
 {
-       struct hns_roce_v2_priv *priv = hr_dev->priv;
-       struct hnae3_handle *handle = priv->handle;
        const struct hnae3_ae_ops *ops = handle->ae_algo->ops;
-       unsigned long reset_cnt;
-       bool sw_resetting;
-       bool hw_resetting;
+       unsigned long end;
 
-       reset_cnt = ops->ae_dev_reset_cnt(handle);
-       hw_resetting = ops->get_hw_reset_stat(handle);
-       sw_resetting = ops->ae_dev_resetting(handle);
+       hr_dev->dis_db = true;
 
-       if (reset_cnt != hr_dev->reset_cnt || hw_resetting || sw_resetting)
-               return true;
+       dev_warn(hr_dev->dev,
+                "Func clear is pending, device in resetting state.\n");
+       end = HNS_ROCE_V2_HW_RST_TIMEOUT;
+       while (end) {
+               if (!ops->get_hw_reset_stat(handle)) {
+                       hr_dev->is_reset = true;
+                       dev_info(hr_dev->dev,
+                                "Func clear success after reset.\n");
+                       return;
+               }
+               msleep(HNS_ROCE_V2_HW_RST_COMPLETION_WAIT);
+               end -= HNS_ROCE_V2_HW_RST_COMPLETION_WAIT;
+       }
 
-       return false;
+       dev_warn(hr_dev->dev, "Func clear failed.\n");
 }
 
-static void hns_roce_func_clr_rst_prc(struct hns_roce_dev *hr_dev, int retval,
-                                     int flag)
+static void func_clr_sw_resetting_state(struct hns_roce_dev *hr_dev,
+                                       struct hnae3_handle *handle)
 {
-       struct hns_roce_v2_priv *priv = hr_dev->priv;
-       struct hnae3_handle *handle = priv->handle;
        const struct hnae3_ae_ops *ops = handle->ae_algo->ops;
-       unsigned long instance_stage;
-       unsigned long reset_cnt;
        unsigned long end;
-       bool sw_resetting;
-       bool hw_resetting;
 
-       instance_stage = handle->rinfo.instance_state;
-       reset_cnt = ops->ae_dev_reset_cnt(handle);
-       hw_resetting = ops->get_hw_reset_stat(handle);
-       sw_resetting = ops->ae_dev_resetting(handle);
+       hr_dev->dis_db = true;
+
+       dev_warn(hr_dev->dev,
+                "Func clear is pending, device in resetting state.\n");
+       end = HNS_ROCE_V2_HW_RST_TIMEOUT;
+       while (end) {
+               if (ops->ae_dev_reset_cnt(handle) !=
+                   hr_dev->reset_cnt) {
+                       hr_dev->is_reset = true;
+                       dev_info(hr_dev->dev,
+                                "Func clear success after sw reset\n");
+                       return;
+               }
+               msleep(HNS_ROCE_V2_HW_RST_COMPLETION_WAIT);
+               end -= HNS_ROCE_V2_HW_RST_COMPLETION_WAIT;
+       }
+
+       dev_warn(hr_dev->dev, "Func clear failed because of unfinished sw reset\n");
+}
 
-       if (reset_cnt != hr_dev->reset_cnt) {
+static void hns_roce_func_clr_rst_proc(struct hns_roce_dev *hr_dev, int retval,
+                                      int flag)
+{
+       struct hns_roce_v2_priv *priv = hr_dev->priv;
+       struct hnae3_handle *handle = priv->handle;
+       const struct hnae3_ae_ops *ops = handle->ae_algo->ops;
+
+       if (ops->ae_dev_reset_cnt(handle) != hr_dev->reset_cnt) {
                hr_dev->dis_db = true;
                hr_dev->is_reset = true;
                dev_info(hr_dev->dev, "Func clear success after reset.\n");
-       } else if (hw_resetting) {
-               hr_dev->dis_db = true;
+               return;
+       }
 
-               dev_warn(hr_dev->dev,
-                        "Func clear is pending, device in resetting state.\n");
-               end = HNS_ROCE_V2_HW_RST_TIMEOUT;
-               while (end) {
-                       if (!ops->get_hw_reset_stat(handle)) {
-                               hr_dev->is_reset = true;
-                               dev_info(hr_dev->dev,
-                                        "Func clear success after reset.\n");
-                               return;
-                       }
-                       msleep(HNS_ROCE_V2_HW_RST_COMPLETION_WAIT);
-                       end -= HNS_ROCE_V2_HW_RST_COMPLETION_WAIT;
-               }
+       if (ops->get_hw_reset_stat(handle)) {
+               func_clr_hw_resetting_state(hr_dev, handle);
+               return;
+       }
 
-               dev_warn(hr_dev->dev, "Func clear failed.\n");
-       } else if (sw_resetting && instance_stage == HNS_ROCE_STATE_INIT) {
-               hr_dev->dis_db = true;
+       if (ops->ae_dev_resetting(handle) &&
+           handle->rinfo.instance_state == HNS_ROCE_STATE_INIT) {
+               func_clr_sw_resetting_state(hr_dev, handle);
+               return;
+       }
 
+       if (retval && !flag)
                dev_warn(hr_dev->dev,
-                        "Func clear is pending, device in resetting state.\n");
-               end = HNS_ROCE_V2_HW_RST_TIMEOUT;
-               while (end) {
-                       if (ops->ae_dev_reset_cnt(handle) !=
-                           hr_dev->reset_cnt) {
-                               hr_dev->is_reset = true;
-                               dev_info(hr_dev->dev,
-                                        "Func clear success after sw reset\n");
-                               return;
-                       }
-                       msleep(HNS_ROCE_V2_HW_RST_COMPLETION_WAIT);
-                       end -= HNS_ROCE_V2_HW_RST_COMPLETION_WAIT;
-               }
-
-               dev_warn(hr_dev->dev, "Func clear failed because of unfinished sw reset\n");
-       } else {
-               if (retval && !flag)
-                       dev_warn(hr_dev->dev,
-                                "Func clear read failed, ret = %d.\n", retval);
+                        "Func clear read failed, ret = %d.\n", retval);
 
-               dev_warn(hr_dev->dev, "Func clear failed.\n");
-       }
+       dev_warn(hr_dev->dev, "Func clear failed.\n");
 }
-static void hns_roce_function_clear(struct hns_roce_dev *hr_dev)
+
+static void __hns_roce_function_clear(struct hns_roce_dev *hr_dev, int vf_id)
 {
        bool fclr_write_fail_flag = false;
        struct hns_roce_func_clear *resp;
@@ -1484,11 +1553,12 @@ static void hns_roce_function_clear(struct hns_roce_dev *hr_dev)
        unsigned long end;
        int ret = 0;
 
-       if (hns_roce_func_clr_chk_rst(hr_dev))
+       if (check_device_is_in_reset(hr_dev))
                goto out;
 
        hns_roce_cmq_setup_basic_desc(&desc, HNS_ROCE_OPC_FUNC_CLEAR, false);
        resp = (struct hns_roce_func_clear *)desc.data;
+       resp->rst_funcid_en = cpu_to_le32(vf_id);
 
        ret = hns_roce_cmq_send(hr_dev, &desc, 1);
        if (ret) {
@@ -1501,7 +1571,7 @@ static void hns_roce_function_clear(struct hns_roce_dev *hr_dev)
        msleep(HNS_ROCE_V2_READ_FUNC_CLEAR_FLAG_INTERVAL);
        end = HNS_ROCE_V2_FUNC_CLEAR_TIMEOUT_MSECS;
        while (end) {
-               if (hns_roce_func_clr_chk_rst(hr_dev))
+               if (check_device_is_in_reset(hr_dev))
                        goto out;
                msleep(HNS_ROCE_V2_READ_FUNC_CLEAR_FLAG_FAIL_WAIT);
                end -= HNS_ROCE_V2_READ_FUNC_CLEAR_FLAG_FAIL_WAIT;
@@ -1509,18 +1579,45 @@ static void hns_roce_function_clear(struct hns_roce_dev *hr_dev)
                hns_roce_cmq_setup_basic_desc(&desc, HNS_ROCE_OPC_FUNC_CLEAR,
                                              true);
 
+               resp->rst_funcid_en = cpu_to_le32(vf_id);
                ret = hns_roce_cmq_send(hr_dev, &desc, 1);
                if (ret)
                        continue;
 
                if (roce_get_bit(resp->func_done, FUNC_CLEAR_RST_FUN_DONE_S)) {
-                       hr_dev->is_reset = true;
+                       if (vf_id == 0)
+                               hr_dev->is_reset = true;
                        return;
                }
        }
 
 out:
-       hns_roce_func_clr_rst_prc(hr_dev, ret, fclr_write_fail_flag);
+       hns_roce_func_clr_rst_proc(hr_dev, ret, fclr_write_fail_flag);
+}
+
+static void hns_roce_free_vf_resource(struct hns_roce_dev *hr_dev, int vf_id)
+{
+       enum hns_roce_opcode_type opcode = HNS_ROCE_OPC_ALLOC_VF_RES;
+       struct hns_roce_cmq_desc desc[2];
+       struct hns_roce_cmq_req *req_a;
+
+       req_a = (struct hns_roce_cmq_req *)desc[0].data;
+       hns_roce_cmq_setup_basic_desc(&desc[0], opcode, false);
+       desc[0].flag |= cpu_to_le16(HNS_ROCE_CMD_FLAG_NEXT);
+       hns_roce_cmq_setup_basic_desc(&desc[1], opcode, false);
+       hr_reg_write(req_a, FUNC_RES_A_VF_ID, vf_id);
+       hns_roce_cmq_send(hr_dev, desc, 2);
+}
+
+static void hns_roce_function_clear(struct hns_roce_dev *hr_dev)
+{
+       int i;
+
+       for (i = hr_dev->func_num - 1; i >= 0; i--) {
+               __hns_roce_function_clear(hr_dev, i);
+               if (i != 0)
+                       hns_roce_free_vf_resource(hr_dev, i);
+       }
 }
 
 static int hns_roce_query_fw_ver(struct hns_roce_dev *hr_dev)
@@ -1540,79 +1637,107 @@ static int hns_roce_query_fw_ver(struct hns_roce_dev *hr_dev)
        return 0;
 }
 
+static int hns_roce_query_func_info(struct hns_roce_dev *hr_dev)
+{
+       struct hns_roce_cmq_desc desc;
+       int ret;
+
+       if (hr_dev->pci_dev->revision < PCI_REVISION_ID_HIP09) {
+               hr_dev->func_num = 1;
+               return 0;
+       }
+
+       hns_roce_cmq_setup_basic_desc(&desc, HNS_ROCE_OPC_QUERY_FUNC_INFO,
+                                     true);
+       ret = hns_roce_cmq_send(hr_dev, &desc, 1);
+       if (ret) {
+               hr_dev->func_num = 1;
+               return ret;
+       }
+
+       hr_dev->func_num = le32_to_cpu(desc.func_info.own_func_num);
+       hr_dev->cong_algo_tmpl_id = le32_to_cpu(desc.func_info.own_mac_id);
+
+       return 0;
+}
+
 static int hns_roce_config_global_param(struct hns_roce_dev *hr_dev)
 {
-       struct hns_roce_cfg_global_param *req;
        struct hns_roce_cmq_desc desc;
+       struct hns_roce_cmq_req *req = (struct hns_roce_cmq_req *)desc.data;
 
        hns_roce_cmq_setup_basic_desc(&desc, HNS_ROCE_OPC_CFG_GLOBAL_PARAM,
                                      false);
 
-       req = (struct hns_roce_cfg_global_param *)desc.data;
-       memset(req, 0, sizeof(*req));
-       roce_set_field(req->time_cfg_udp_port,
-                      CFG_GLOBAL_PARAM_DATA_0_ROCEE_TIME_1US_CFG_M,
-                      CFG_GLOBAL_PARAM_DATA_0_ROCEE_TIME_1US_CFG_S, 0x3e8);
-       roce_set_field(req->time_cfg_udp_port,
-                      CFG_GLOBAL_PARAM_DATA_0_ROCEE_UDP_PORT_M,
-                      CFG_GLOBAL_PARAM_DATA_0_ROCEE_UDP_PORT_S,
-                      ROCE_V2_UDP_DPORT);
+       hr_reg_write(req, CFG_GLOBAL_PARAM_1US_CYCLES, 0x3e8);
+       hr_reg_write(req, CFG_GLOBAL_PARAM_UDP_PORT, ROCE_V2_UDP_DPORT);
 
        return hns_roce_cmq_send(hr_dev, &desc, 1);
 }
 
-static int hns_roce_query_pf_resource(struct hns_roce_dev *hr_dev)
+static int load_func_res_caps(struct hns_roce_dev *hr_dev, bool is_vf)
 {
        struct hns_roce_cmq_desc desc[2];
-       struct hns_roce_pf_res_a *req_a;
-       struct hns_roce_pf_res_b *req_b;
+       struct hns_roce_cmq_req *r_a = (struct hns_roce_cmq_req *)desc[0].data;
+       struct hns_roce_cmq_req *r_b = (struct hns_roce_cmq_req *)desc[1].data;
+       struct hns_roce_caps *caps = &hr_dev->caps;
+       enum hns_roce_opcode_type opcode;
+       u32 func_num;
        int ret;
 
-       hns_roce_cmq_setup_basic_desc(&desc[0], HNS_ROCE_OPC_QUERY_PF_RES,
-                                     true);
-       desc[0].flag |= cpu_to_le16(HNS_ROCE_CMD_FLAG_NEXT);
+       if (is_vf) {
+               opcode = HNS_ROCE_OPC_QUERY_VF_RES;
+               func_num = 1;
+       } else {
+               opcode = HNS_ROCE_OPC_QUERY_PF_RES;
+               func_num = hr_dev->func_num;
+       }
 
-       hns_roce_cmq_setup_basic_desc(&desc[1], HNS_ROCE_OPC_QUERY_PF_RES,
-                                     true);
+       hns_roce_cmq_setup_basic_desc(&desc[0], opcode, true);
+       desc[0].flag |= cpu_to_le16(HNS_ROCE_CMD_FLAG_NEXT);
+       hns_roce_cmq_setup_basic_desc(&desc[1], opcode, true);
 
        ret = hns_roce_cmq_send(hr_dev, desc, 2);
        if (ret)
                return ret;
 
-       req_a = (struct hns_roce_pf_res_a *)desc[0].data;
-       req_b = (struct hns_roce_pf_res_b *)desc[1].data;
-
-       hr_dev->caps.qpc_bt_num = roce_get_field(req_a->qpc_bt_idx_num,
-                                                PF_RES_DATA_1_PF_QPC_BT_NUM_M,
-                                                PF_RES_DATA_1_PF_QPC_BT_NUM_S);
-       hr_dev->caps.srqc_bt_num = roce_get_field(req_a->srqc_bt_idx_num,
-                                               PF_RES_DATA_2_PF_SRQC_BT_NUM_M,
-                                               PF_RES_DATA_2_PF_SRQC_BT_NUM_S);
-       hr_dev->caps.cqc_bt_num = roce_get_field(req_a->cqc_bt_idx_num,
-                                                PF_RES_DATA_3_PF_CQC_BT_NUM_M,
-                                                PF_RES_DATA_3_PF_CQC_BT_NUM_S);
-       hr_dev->caps.mpt_bt_num = roce_get_field(req_a->mpt_bt_idx_num,
-                                                PF_RES_DATA_4_PF_MPT_BT_NUM_M,
-                                                PF_RES_DATA_4_PF_MPT_BT_NUM_S);
-
-       hr_dev->caps.sl_num = roce_get_field(req_b->qid_idx_sl_num,
-                                            PF_RES_DATA_3_PF_SL_NUM_M,
-                                            PF_RES_DATA_3_PF_SL_NUM_S);
-       hr_dev->caps.sccc_bt_num = roce_get_field(req_b->sccc_bt_idx_num,
-                                            PF_RES_DATA_4_PF_SCCC_BT_NUM_M,
-                                            PF_RES_DATA_4_PF_SCCC_BT_NUM_S);
-
-       hr_dev->caps.gmv_bt_num = roce_get_field(req_b->gmv_idx_num,
-                                                PF_RES_DATA_5_PF_GMV_BT_NUM_M,
-                                                PF_RES_DATA_5_PF_GMV_BT_NUM_S);
+       caps->qpc_bt_num = hr_reg_read(r_a, FUNC_RES_A_QPC_BT_NUM) / func_num;
+       caps->srqc_bt_num = hr_reg_read(r_a, FUNC_RES_A_SRQC_BT_NUM) / func_num;
+       caps->cqc_bt_num = hr_reg_read(r_a, FUNC_RES_A_CQC_BT_NUM) / func_num;
+       caps->mpt_bt_num = hr_reg_read(r_a, FUNC_RES_A_MPT_BT_NUM) / func_num;
+       caps->eqc_bt_num = hr_reg_read(r_a, FUNC_RES_A_EQC_BT_NUM) / func_num;
+       caps->smac_bt_num = hr_reg_read(r_b, FUNC_RES_B_SMAC_NUM) / func_num;
+       caps->sgid_bt_num = hr_reg_read(r_b, FUNC_RES_B_SGID_NUM) / func_num;
+       caps->sccc_bt_num = hr_reg_read(r_b, FUNC_RES_B_SCCC_BT_NUM) / func_num;
+
+       if (is_vf) {
+               caps->sl_num = hr_reg_read(r_b, FUNC_RES_V_QID_NUM) / func_num;
+               caps->gmv_bt_num = hr_reg_read(r_b, FUNC_RES_V_GMV_BT_NUM) /
+                                              func_num;
+       } else {
+               caps->sl_num = hr_reg_read(r_b, FUNC_RES_B_QID_NUM) / func_num;
+               caps->gmv_bt_num = hr_reg_read(r_b, FUNC_RES_B_GMV_BT_NUM) /
+                                              func_num;
+       }
 
        return 0;
 }
 
+static int hns_roce_query_pf_resource(struct hns_roce_dev *hr_dev)
+{
+       return load_func_res_caps(hr_dev, false);
+}
+
+static int hns_roce_query_vf_resource(struct hns_roce_dev *hr_dev)
+{
+       return load_func_res_caps(hr_dev, true);
+}
+
 static int hns_roce_query_pf_timer_resource(struct hns_roce_dev *hr_dev)
 {
-       struct hns_roce_pf_timer_res_a *req_a;
        struct hns_roce_cmq_desc desc;
+       struct hns_roce_cmq_req *req = (struct hns_roce_cmq_req *)desc.data;
+       struct hns_roce_caps *caps = &hr_dev->caps;
        int ret;
 
        hns_roce_cmq_setup_basic_desc(&desc, HNS_ROCE_OPC_QUERY_PF_TIMER_RES,
@@ -1622,24 +1747,17 @@ static int hns_roce_query_pf_timer_resource(struct hns_roce_dev *hr_dev)
        if (ret)
                return ret;
 
-       req_a = (struct hns_roce_pf_timer_res_a *)desc.data;
-
-       hr_dev->caps.qpc_timer_bt_num =
-               roce_get_field(req_a->qpc_timer_bt_idx_num,
-                              PF_RES_DATA_1_PF_QPC_TIMER_BT_NUM_M,
-                              PF_RES_DATA_1_PF_QPC_TIMER_BT_NUM_S);
-       hr_dev->caps.cqc_timer_bt_num =
-               roce_get_field(req_a->cqc_timer_bt_idx_num,
-                              PF_RES_DATA_2_PF_CQC_TIMER_BT_NUM_M,
-                              PF_RES_DATA_2_PF_CQC_TIMER_BT_NUM_S);
+       caps->qpc_timer_bt_num = hr_reg_read(req, PF_TIMER_RES_QPC_ITEM_NUM);
+       caps->cqc_timer_bt_num = hr_reg_read(req, PF_TIMER_RES_CQC_ITEM_NUM);
 
        return 0;
 }
 
-static int hns_roce_set_vf_switch_param(struct hns_roce_dev *hr_dev, int vf_id)
+static int __hns_roce_set_vf_switch_param(struct hns_roce_dev *hr_dev,
+                                         u32 vf_id)
 {
-       struct hns_roce_cmq_desc desc;
        struct hns_roce_vf_switch *swt;
+       struct hns_roce_cmq_desc desc;
        int ret;
 
        swt = (struct hns_roce_vf_switch *)desc.data;
@@ -1661,153 +1779,127 @@ static int hns_roce_set_vf_switch_param(struct hns_roce_dev *hr_dev, int vf_id)
        return hns_roce_cmq_send(hr_dev, &desc, 1);
 }
 
-static int hns_roce_alloc_vf_resource(struct hns_roce_dev *hr_dev)
+static int hns_roce_set_vf_switch_param(struct hns_roce_dev *hr_dev)
 {
-       struct hns_roce_cmq_desc desc[2];
-       struct hns_roce_vf_res_a *req_a;
-       struct hns_roce_vf_res_b *req_b;
+       u32 vf_id;
+       int ret;
+
+       for (vf_id = 0; vf_id < hr_dev->func_num; vf_id++) {
+               ret = __hns_roce_set_vf_switch_param(hr_dev, vf_id);
+               if (ret)
+                       return ret;
+       }
+       return 0;
+}
 
-       req_a = (struct hns_roce_vf_res_a *)desc[0].data;
-       req_b = (struct hns_roce_vf_res_b *)desc[1].data;
+static int __hns_roce_alloc_vf_resource(struct hns_roce_dev *hr_dev, int vf_id)
+{
+       struct hns_roce_cmq_desc desc[2];
+       struct hns_roce_cmq_req *r_a = (struct hns_roce_cmq_req *)desc[0].data;
+       struct hns_roce_cmq_req *r_b = (struct hns_roce_cmq_req *)desc[1].data;
+       enum hns_roce_opcode_type opcode = HNS_ROCE_OPC_ALLOC_VF_RES;
+       struct hns_roce_caps *caps = &hr_dev->caps;
 
-       hns_roce_cmq_setup_basic_desc(&desc[0], HNS_ROCE_OPC_ALLOC_VF_RES,
-                                     false);
+       hns_roce_cmq_setup_basic_desc(&desc[0], opcode, false);
        desc[0].flag |= cpu_to_le16(HNS_ROCE_CMD_FLAG_NEXT);
+       hns_roce_cmq_setup_basic_desc(&desc[1], opcode, false);
 
-       hns_roce_cmq_setup_basic_desc(&desc[1], HNS_ROCE_OPC_ALLOC_VF_RES,
-                                     false);
+       hr_reg_write(r_a, FUNC_RES_A_VF_ID, vf_id);
+
+       hr_reg_write(r_a, FUNC_RES_A_QPC_BT_NUM, caps->qpc_bt_num);
+       hr_reg_write(r_a, FUNC_RES_A_QPC_BT_IDX, vf_id * caps->qpc_bt_num);
+       hr_reg_write(r_a, FUNC_RES_A_SRQC_BT_NUM, caps->srqc_bt_num);
+       hr_reg_write(r_a, FUNC_RES_A_SRQC_BT_IDX, vf_id * caps->srqc_bt_num);
+       hr_reg_write(r_a, FUNC_RES_A_CQC_BT_NUM, caps->cqc_bt_num);
+       hr_reg_write(r_a, FUNC_RES_A_CQC_BT_IDX, vf_id * caps->cqc_bt_num);
+       hr_reg_write(r_a, FUNC_RES_A_MPT_BT_NUM, caps->mpt_bt_num);
+       hr_reg_write(r_a, FUNC_RES_A_MPT_BT_IDX, vf_id * caps->mpt_bt_num);
+       hr_reg_write(r_a, FUNC_RES_A_EQC_BT_NUM, caps->eqc_bt_num);
+       hr_reg_write(r_a, FUNC_RES_A_EQC_BT_IDX, vf_id * caps->eqc_bt_num);
+       hr_reg_write(r_b, FUNC_RES_V_QID_NUM, caps->sl_num);
+       hr_reg_write(r_b, FUNC_RES_B_QID_IDX, vf_id * caps->sl_num);
+       hr_reg_write(r_b, FUNC_RES_B_SCCC_BT_NUM, caps->sccc_bt_num);
+       hr_reg_write(r_b, FUNC_RES_B_SCCC_BT_IDX, vf_id * caps->sccc_bt_num);
 
-       roce_set_field(req_a->vf_qpc_bt_idx_num,
-                      VF_RES_A_DATA_1_VF_QPC_BT_IDX_M,
-                      VF_RES_A_DATA_1_VF_QPC_BT_IDX_S, 0);
-       roce_set_field(req_a->vf_qpc_bt_idx_num,
-                      VF_RES_A_DATA_1_VF_QPC_BT_NUM_M,
-                      VF_RES_A_DATA_1_VF_QPC_BT_NUM_S, HNS_ROCE_VF_QPC_BT_NUM);
-
-       roce_set_field(req_a->vf_srqc_bt_idx_num,
-                      VF_RES_A_DATA_2_VF_SRQC_BT_IDX_M,
-                      VF_RES_A_DATA_2_VF_SRQC_BT_IDX_S, 0);
-       roce_set_field(req_a->vf_srqc_bt_idx_num,
-                      VF_RES_A_DATA_2_VF_SRQC_BT_NUM_M,
-                      VF_RES_A_DATA_2_VF_SRQC_BT_NUM_S,
-                      HNS_ROCE_VF_SRQC_BT_NUM);
-
-       roce_set_field(req_a->vf_cqc_bt_idx_num,
-                      VF_RES_A_DATA_3_VF_CQC_BT_IDX_M,
-                      VF_RES_A_DATA_3_VF_CQC_BT_IDX_S, 0);
-       roce_set_field(req_a->vf_cqc_bt_idx_num,
-                      VF_RES_A_DATA_3_VF_CQC_BT_NUM_M,
-                      VF_RES_A_DATA_3_VF_CQC_BT_NUM_S, HNS_ROCE_VF_CQC_BT_NUM);
-
-       roce_set_field(req_a->vf_mpt_bt_idx_num,
-                      VF_RES_A_DATA_4_VF_MPT_BT_IDX_M,
-                      VF_RES_A_DATA_4_VF_MPT_BT_IDX_S, 0);
-       roce_set_field(req_a->vf_mpt_bt_idx_num,
-                      VF_RES_A_DATA_4_VF_MPT_BT_NUM_M,
-                      VF_RES_A_DATA_4_VF_MPT_BT_NUM_S, HNS_ROCE_VF_MPT_BT_NUM);
-
-       roce_set_field(req_a->vf_eqc_bt_idx_num, VF_RES_A_DATA_5_VF_EQC_IDX_M,
-                      VF_RES_A_DATA_5_VF_EQC_IDX_S, 0);
-       roce_set_field(req_a->vf_eqc_bt_idx_num, VF_RES_A_DATA_5_VF_EQC_NUM_M,
-                      VF_RES_A_DATA_5_VF_EQC_NUM_S, HNS_ROCE_VF_EQC_NUM);
-
-       roce_set_field(req_b->vf_smac_idx_num, VF_RES_B_DATA_1_VF_SMAC_IDX_M,
-                      VF_RES_B_DATA_1_VF_SMAC_IDX_S, 0);
-       roce_set_field(req_b->vf_smac_idx_num, VF_RES_B_DATA_1_VF_SMAC_NUM_M,
-                      VF_RES_B_DATA_1_VF_SMAC_NUM_S, HNS_ROCE_VF_SMAC_NUM);
-
-       roce_set_field(req_b->vf_sgid_idx_num, VF_RES_B_DATA_2_VF_SGID_IDX_M,
-                      VF_RES_B_DATA_2_VF_SGID_IDX_S, 0);
-       roce_set_field(req_b->vf_sgid_idx_num, VF_RES_B_DATA_2_VF_SGID_NUM_M,
-                      VF_RES_B_DATA_2_VF_SGID_NUM_S, HNS_ROCE_VF_SGID_NUM);
-
-       roce_set_field(req_b->vf_qid_idx_sl_num, VF_RES_B_DATA_3_VF_QID_IDX_M,
-                      VF_RES_B_DATA_3_VF_QID_IDX_S, 0);
-       roce_set_field(req_b->vf_qid_idx_sl_num, VF_RES_B_DATA_3_VF_SL_NUM_M,
-                      VF_RES_B_DATA_3_VF_SL_NUM_S, HNS_ROCE_VF_SL_NUM);
-
-       roce_set_field(req_b->vf_sccc_idx_num, VF_RES_B_DATA_4_VF_SCCC_BT_IDX_M,
-                      VF_RES_B_DATA_4_VF_SCCC_BT_IDX_S, 0);
-       roce_set_field(req_b->vf_sccc_idx_num, VF_RES_B_DATA_4_VF_SCCC_BT_NUM_M,
-                      VF_RES_B_DATA_4_VF_SCCC_BT_NUM_S,
-                      HNS_ROCE_VF_SCCC_BT_NUM);
+       if (hr_dev->pci_dev->revision >= PCI_REVISION_ID_HIP09) {
+               hr_reg_write(r_b, FUNC_RES_V_GMV_BT_NUM, caps->gmv_bt_num);
+               hr_reg_write(r_b, FUNC_RES_B_GMV_BT_IDX,
+                            vf_id * caps->gmv_bt_num);
+       } else {
+               hr_reg_write(r_b, FUNC_RES_B_SGID_NUM, caps->sgid_bt_num);
+               hr_reg_write(r_b, FUNC_RES_B_SGID_IDX,
+                            vf_id * caps->sgid_bt_num);
+               hr_reg_write(r_b, FUNC_RES_B_SMAC_NUM, caps->smac_bt_num);
+               hr_reg_write(r_b, FUNC_RES_B_SMAC_IDX,
+                            vf_id * caps->smac_bt_num);
+       }
 
        return hns_roce_cmq_send(hr_dev, desc, 2);
 }
 
+static int hns_roce_alloc_vf_resource(struct hns_roce_dev *hr_dev)
+{
+       int vf_id;
+       int ret;
+
+       for (vf_id = 0; vf_id < hr_dev->func_num; vf_id++) {
+               ret = __hns_roce_alloc_vf_resource(hr_dev, vf_id);
+               if (ret)
+                       return ret;
+       }
+
+       return 0;
+}
+
 static int hns_roce_v2_set_bt(struct hns_roce_dev *hr_dev)
 {
-       u8 srqc_hop_num = hr_dev->caps.srqc_hop_num;
-       u8 qpc_hop_num = hr_dev->caps.qpc_hop_num;
-       u8 cqc_hop_num = hr_dev->caps.cqc_hop_num;
-       u8 mpt_hop_num = hr_dev->caps.mpt_hop_num;
-       u8 sccc_hop_num = hr_dev->caps.sccc_hop_num;
-       struct hns_roce_cfg_bt_attr *req;
        struct hns_roce_cmq_desc desc;
+       struct hns_roce_cmq_req *req = (struct hns_roce_cmq_req *)desc.data;
+       struct hns_roce_caps *caps = &hr_dev->caps;
 
        hns_roce_cmq_setup_basic_desc(&desc, HNS_ROCE_OPC_CFG_BT_ATTR, false);
-       req = (struct hns_roce_cfg_bt_attr *)desc.data;
-       memset(req, 0, sizeof(*req));
-
-       roce_set_field(req->vf_qpc_cfg, CFG_BT_ATTR_DATA_0_VF_QPC_BA_PGSZ_M,
-                      CFG_BT_ATTR_DATA_0_VF_QPC_BA_PGSZ_S,
-                      hr_dev->caps.qpc_ba_pg_sz + PG_SHIFT_OFFSET);
-       roce_set_field(req->vf_qpc_cfg, CFG_BT_ATTR_DATA_0_VF_QPC_BUF_PGSZ_M,
-                      CFG_BT_ATTR_DATA_0_VF_QPC_BUF_PGSZ_S,
-                      hr_dev->caps.qpc_buf_pg_sz + PG_SHIFT_OFFSET);
-       roce_set_field(req->vf_qpc_cfg, CFG_BT_ATTR_DATA_0_VF_QPC_HOPNUM_M,
-                      CFG_BT_ATTR_DATA_0_VF_QPC_HOPNUM_S,
-                      qpc_hop_num == HNS_ROCE_HOP_NUM_0 ? 0 : qpc_hop_num);
-
-       roce_set_field(req->vf_srqc_cfg, CFG_BT_ATTR_DATA_1_VF_SRQC_BA_PGSZ_M,
-                      CFG_BT_ATTR_DATA_1_VF_SRQC_BA_PGSZ_S,
-                      hr_dev->caps.srqc_ba_pg_sz + PG_SHIFT_OFFSET);
-       roce_set_field(req->vf_srqc_cfg, CFG_BT_ATTR_DATA_1_VF_SRQC_BUF_PGSZ_M,
-                      CFG_BT_ATTR_DATA_1_VF_SRQC_BUF_PGSZ_S,
-                      hr_dev->caps.srqc_buf_pg_sz + PG_SHIFT_OFFSET);
-       roce_set_field(req->vf_srqc_cfg, CFG_BT_ATTR_DATA_1_VF_SRQC_HOPNUM_M,
-                      CFG_BT_ATTR_DATA_1_VF_SRQC_HOPNUM_S,
-                      srqc_hop_num == HNS_ROCE_HOP_NUM_0 ? 0 : srqc_hop_num);
-
-       roce_set_field(req->vf_cqc_cfg, CFG_BT_ATTR_DATA_2_VF_CQC_BA_PGSZ_M,
-                      CFG_BT_ATTR_DATA_2_VF_CQC_BA_PGSZ_S,
-                      hr_dev->caps.cqc_ba_pg_sz + PG_SHIFT_OFFSET);
-       roce_set_field(req->vf_cqc_cfg, CFG_BT_ATTR_DATA_2_VF_CQC_BUF_PGSZ_M,
-                      CFG_BT_ATTR_DATA_2_VF_CQC_BUF_PGSZ_S,
-                      hr_dev->caps.cqc_buf_pg_sz + PG_SHIFT_OFFSET);
-       roce_set_field(req->vf_cqc_cfg, CFG_BT_ATTR_DATA_2_VF_CQC_HOPNUM_M,
-                      CFG_BT_ATTR_DATA_2_VF_CQC_HOPNUM_S,
-                      cqc_hop_num == HNS_ROCE_HOP_NUM_0 ? 0 : cqc_hop_num);
-
-       roce_set_field(req->vf_mpt_cfg, CFG_BT_ATTR_DATA_3_VF_MPT_BA_PGSZ_M,
-                      CFG_BT_ATTR_DATA_3_VF_MPT_BA_PGSZ_S,
-                      hr_dev->caps.mpt_ba_pg_sz + PG_SHIFT_OFFSET);
-       roce_set_field(req->vf_mpt_cfg, CFG_BT_ATTR_DATA_3_VF_MPT_BUF_PGSZ_M,
-                      CFG_BT_ATTR_DATA_3_VF_MPT_BUF_PGSZ_S,
-                      hr_dev->caps.mpt_buf_pg_sz + PG_SHIFT_OFFSET);
-       roce_set_field(req->vf_mpt_cfg, CFG_BT_ATTR_DATA_3_VF_MPT_HOPNUM_M,
-                      CFG_BT_ATTR_DATA_3_VF_MPT_HOPNUM_S,
-                      mpt_hop_num == HNS_ROCE_HOP_NUM_0 ? 0 : mpt_hop_num);
-
-       roce_set_field(req->vf_sccc_cfg,
-                      CFG_BT_ATTR_DATA_4_VF_SCCC_BA_PGSZ_M,
-                      CFG_BT_ATTR_DATA_4_VF_SCCC_BA_PGSZ_S,
-                      hr_dev->caps.sccc_ba_pg_sz + PG_SHIFT_OFFSET);
-       roce_set_field(req->vf_sccc_cfg,
-                      CFG_BT_ATTR_DATA_4_VF_SCCC_BUF_PGSZ_M,
-                      CFG_BT_ATTR_DATA_4_VF_SCCC_BUF_PGSZ_S,
-                      hr_dev->caps.sccc_buf_pg_sz + PG_SHIFT_OFFSET);
-       roce_set_field(req->vf_sccc_cfg,
-                      CFG_BT_ATTR_DATA_4_VF_SCCC_HOPNUM_M,
-                      CFG_BT_ATTR_DATA_4_VF_SCCC_HOPNUM_S,
-                      sccc_hop_num ==
-                             HNS_ROCE_HOP_NUM_0 ? 0 : sccc_hop_num);
+
+       hr_reg_write(req, CFG_BT_ATTR_QPC_BA_PGSZ,
+                    caps->qpc_ba_pg_sz + PG_SHIFT_OFFSET);
+       hr_reg_write(req, CFG_BT_ATTR_QPC_BUF_PGSZ,
+                    caps->qpc_buf_pg_sz + PG_SHIFT_OFFSET);
+       hr_reg_write(req, CFG_BT_ATTR_QPC_HOPNUM,
+                    to_hr_hem_hopnum(caps->qpc_hop_num, caps->num_qps));
+
+       hr_reg_write(req, CFG_BT_ATTR_SRQC_BA_PGSZ,
+                    caps->srqc_ba_pg_sz + PG_SHIFT_OFFSET);
+       hr_reg_write(req, CFG_BT_ATTR_SRQC_BUF_PGSZ,
+                    caps->srqc_buf_pg_sz + PG_SHIFT_OFFSET);
+       hr_reg_write(req, CFG_BT_ATTR_SRQC_HOPNUM,
+                    to_hr_hem_hopnum(caps->srqc_hop_num, caps->num_srqs));
+
+       hr_reg_write(req, CFG_BT_ATTR_CQC_BA_PGSZ,
+                    caps->cqc_ba_pg_sz + PG_SHIFT_OFFSET);
+       hr_reg_write(req, CFG_BT_ATTR_CQC_BUF_PGSZ,
+                    caps->cqc_buf_pg_sz + PG_SHIFT_OFFSET);
+       hr_reg_write(req, CFG_BT_ATTR_CQC_HOPNUM,
+                    to_hr_hem_hopnum(caps->cqc_hop_num, caps->num_cqs));
+
+       hr_reg_write(req, CFG_BT_ATTR_MPT_BA_PGSZ,
+                    caps->mpt_ba_pg_sz + PG_SHIFT_OFFSET);
+       hr_reg_write(req, CFG_BT_ATTR_MPT_BUF_PGSZ,
+                    caps->mpt_buf_pg_sz + PG_SHIFT_OFFSET);
+       hr_reg_write(req, CFG_BT_ATTR_MPT_HOPNUM,
+                    to_hr_hem_hopnum(caps->mpt_hop_num, caps->num_mtpts));
+
+       hr_reg_write(req, CFG_BT_ATTR_SCCC_BA_PGSZ,
+                    caps->sccc_ba_pg_sz + PG_SHIFT_OFFSET);
+       hr_reg_write(req, CFG_BT_ATTR_SCCC_BUF_PGSZ,
+                    caps->sccc_buf_pg_sz + PG_SHIFT_OFFSET);
+       hr_reg_write(req, CFG_BT_ATTR_SCCC_HOPNUM,
+                    to_hr_hem_hopnum(caps->sccc_hop_num, caps->num_qps));
 
        return hns_roce_cmq_send(hr_dev, &desc, 1);
 }
 
 static void set_default_caps(struct hns_roce_dev *hr_dev)
 {
+       struct hns_roce_v2_priv *priv = hr_dev->priv;
        struct hns_roce_caps *caps = &hr_dev->caps;
 
        caps->num_qps           = HNS_ROCE_V2_MAX_QP_NUM;
@@ -1819,24 +1911,24 @@ static void set_default_caps(struct hns_roce_dev *hr_dev)
        caps->max_sq_sg         = HNS_ROCE_V2_MAX_SQ_SGE_NUM;
        caps->max_extend_sg     = HNS_ROCE_V2_MAX_EXTEND_SGE_NUM;
        caps->max_rq_sg         = HNS_ROCE_V2_MAX_RQ_SGE_NUM;
-       caps->max_sq_inline     = HNS_ROCE_V2_MAX_SQ_INLINE;
        caps->num_uars          = HNS_ROCE_V2_UAR_NUM;
        caps->phy_num_uars      = HNS_ROCE_V2_PHY_UAR_NUM;
        caps->num_aeq_vectors   = HNS_ROCE_V2_AEQE_VEC_NUM;
-       caps->num_comp_vectors  = HNS_ROCE_V2_COMP_VEC_NUM;
+       caps->num_comp_vectors  =
+                       min_t(u32, caps->eqc_bt_num - 1,
+                             (u32)priv->handle->rinfo.num_vectors - 2);
        caps->num_other_vectors = HNS_ROCE_V2_ABNORMAL_VEC_NUM;
        caps->num_mtpts         = HNS_ROCE_V2_MAX_MTPT_NUM;
        caps->num_mtt_segs      = HNS_ROCE_V2_MAX_MTT_SEGS;
-       caps->num_cqe_segs      = HNS_ROCE_V2_MAX_CQE_SEGS;
        caps->num_srqwqe_segs   = HNS_ROCE_V2_MAX_SRQWQE_SEGS;
        caps->num_idx_segs      = HNS_ROCE_V2_MAX_IDX_SEGS;
        caps->num_pds           = HNS_ROCE_V2_MAX_PD_NUM;
+       caps->num_xrcds         = HNS_ROCE_V2_MAX_XRCD_NUM;
        caps->max_qp_init_rdma  = HNS_ROCE_V2_MAX_QP_INIT_RDMA;
        caps->max_qp_dest_rdma  = HNS_ROCE_V2_MAX_QP_DEST_RDMA;
        caps->max_sq_desc_sz    = HNS_ROCE_V2_MAX_SQ_DESC_SZ;
        caps->max_rq_desc_sz    = HNS_ROCE_V2_MAX_RQ_DESC_SZ;
        caps->max_srq_desc_sz   = HNS_ROCE_V2_MAX_SRQ_DESC_SZ;
-       caps->qpc_sz            = HNS_ROCE_V2_QPC_SZ;
        caps->irrl_entry_sz     = HNS_ROCE_V2_IRRL_ENTRY_SZ;
        caps->trrl_entry_sz     = HNS_ROCE_V2_EXT_ATOMIC_TRRL_ENTRY_SZ;
        caps->cqc_entry_sz      = HNS_ROCE_V2_CQC_ENTRY_SZ;
@@ -1844,56 +1936,39 @@ static void set_default_caps(struct hns_roce_dev *hr_dev)
        caps->mtpt_entry_sz     = HNS_ROCE_V2_MTPT_ENTRY_SZ;
        caps->mtt_entry_sz      = HNS_ROCE_V2_MTT_ENTRY_SZ;
        caps->idx_entry_sz      = HNS_ROCE_V2_IDX_ENTRY_SZ;
-       caps->cqe_sz            = HNS_ROCE_V2_CQE_SIZE;
        caps->page_size_cap     = HNS_ROCE_V2_PAGE_SIZE_SUPPORTED;
        caps->reserved_lkey     = 0;
        caps->reserved_pds      = 0;
+       caps->reserved_xrcds    = HNS_ROCE_V2_RSV_XRCD_NUM;
        caps->reserved_mrws     = 1;
        caps->reserved_uars     = 0;
        caps->reserved_cqs      = 0;
        caps->reserved_srqs     = 0;
        caps->reserved_qps      = HNS_ROCE_V2_RSV_QPS;
 
-       caps->qpc_ba_pg_sz      = 0;
-       caps->qpc_buf_pg_sz     = 0;
        caps->qpc_hop_num       = HNS_ROCE_CONTEXT_HOP_NUM;
-       caps->srqc_ba_pg_sz     = 0;
-       caps->srqc_buf_pg_sz    = 0;
        caps->srqc_hop_num      = HNS_ROCE_CONTEXT_HOP_NUM;
-       caps->cqc_ba_pg_sz      = 0;
-       caps->cqc_buf_pg_sz     = 0;
        caps->cqc_hop_num       = HNS_ROCE_CONTEXT_HOP_NUM;
-       caps->mpt_ba_pg_sz      = 0;
-       caps->mpt_buf_pg_sz     = 0;
        caps->mpt_hop_num       = HNS_ROCE_CONTEXT_HOP_NUM;
-       caps->mtt_ba_pg_sz      = 0;
-       caps->mtt_buf_pg_sz     = 0;
        caps->mtt_hop_num       = HNS_ROCE_MTT_HOP_NUM;
+       caps->pbl_hop_num       = HNS_ROCE_PBL_HOP_NUM;
        caps->wqe_sq_hop_num    = HNS_ROCE_SQWQE_HOP_NUM;
        caps->wqe_sge_hop_num   = HNS_ROCE_EXT_SGE_HOP_NUM;
        caps->wqe_rq_hop_num    = HNS_ROCE_RQWQE_HOP_NUM;
-       caps->cqe_ba_pg_sz      = HNS_ROCE_BA_PG_SZ_SUPPORTED_256K;
-       caps->cqe_buf_pg_sz     = 0;
        caps->cqe_hop_num       = HNS_ROCE_CQE_HOP_NUM;
-       caps->srqwqe_ba_pg_sz   = 0;
-       caps->srqwqe_buf_pg_sz  = 0;
        caps->srqwqe_hop_num    = HNS_ROCE_SRQWQE_HOP_NUM;
-       caps->idx_ba_pg_sz      = 0;
-       caps->idx_buf_pg_sz     = 0;
        caps->idx_hop_num       = HNS_ROCE_IDX_HOP_NUM;
-       caps->chunk_sz          = HNS_ROCE_V2_TABLE_CHUNK_SIZE;
+       caps->eqe_hop_num       = HNS_ROCE_EQE_HOP_NUM;
+       caps->chunk_sz          = HNS_ROCE_V2_TABLE_CHUNK_SIZE;
 
        caps->flags             = HNS_ROCE_CAP_FLAG_REREG_MR |
                                  HNS_ROCE_CAP_FLAG_ROCE_V1_V2 |
-                                 HNS_ROCE_CAP_FLAG_RECORD_DB |
-                                 HNS_ROCE_CAP_FLAG_SQ_RECORD_DB;
+                                 HNS_ROCE_CAP_FLAG_CQ_RECORD_DB |
+                                 HNS_ROCE_CAP_FLAG_QP_RECORD_DB;
 
        caps->pkey_table_len[0] = 1;
-       caps->gid_table_len[0]  = HNS_ROCE_V2_GID_INDEX_NUM;
        caps->ceqe_depth        = HNS_ROCE_V2_COMP_EQE_NUM;
        caps->aeqe_depth        = HNS_ROCE_V2_ASYNC_EQE_NUM;
-       caps->aeqe_size         = HNS_ROCE_AEQE_SIZE;
-       caps->ceqe_size         = HNS_ROCE_CEQE_SIZE;
        caps->local_ca_ack_delay = 0;
        caps->max_mtu = IB_MTU_4096;
 
@@ -1902,22 +1977,15 @@ static void set_default_caps(struct hns_roce_dev *hr_dev)
 
        caps->flags |= HNS_ROCE_CAP_FLAG_ATOMIC | HNS_ROCE_CAP_FLAG_MW |
                       HNS_ROCE_CAP_FLAG_SRQ | HNS_ROCE_CAP_FLAG_FRMR |
-                      HNS_ROCE_CAP_FLAG_QP_FLOW_CTRL;
+                      HNS_ROCE_CAP_FLAG_QP_FLOW_CTRL | HNS_ROCE_CAP_FLAG_XRC;
 
        caps->num_qpc_timer       = HNS_ROCE_V2_MAX_QPC_TIMER_NUM;
        caps->qpc_timer_entry_sz  = HNS_ROCE_V2_QPC_TIMER_ENTRY_SZ;
-       caps->qpc_timer_ba_pg_sz  = 0;
-       caps->qpc_timer_buf_pg_sz = 0;
        caps->qpc_timer_hop_num   = HNS_ROCE_HOP_NUM_0;
        caps->num_cqc_timer       = HNS_ROCE_V2_MAX_CQC_TIMER_NUM;
        caps->cqc_timer_entry_sz  = HNS_ROCE_V2_CQC_TIMER_ENTRY_SZ;
-       caps->cqc_timer_ba_pg_sz  = 0;
-       caps->cqc_timer_buf_pg_sz = 0;
        caps->cqc_timer_hop_num   = HNS_ROCE_HOP_NUM_0;
 
-       caps->sccc_sz = HNS_ROCE_V2_SCCC_SZ;
-       caps->sccc_ba_pg_sz       = 0;
-       caps->sccc_buf_pg_sz      = 0;
        caps->sccc_hop_num        = HNS_ROCE_SCCC_HOP_NUM;
 
        if (hr_dev->pci_dev->revision >= PCI_REVISION_ID_HIP09) {
@@ -1930,10 +1998,17 @@ static void set_default_caps(struct hns_roce_dev *hr_dev)
                caps->gmv_entry_num = caps->gmv_bt_num * (PAGE_SIZE /
                                                          caps->gmv_entry_sz);
                caps->gmv_hop_num = HNS_ROCE_HOP_NUM_0;
-               caps->gmv_ba_pg_sz = 0;
-               caps->gmv_buf_pg_sz = 0;
                caps->gid_table_len[0] = caps->gmv_bt_num * (HNS_HW_PAGE_SIZE /
                                         caps->gmv_entry_sz);
+               caps->max_sq_inline = HNS_ROCE_V2_MAX_SQ_INL_EXT;
+       } else {
+               caps->aeqe_size = HNS_ROCE_AEQE_SIZE;
+               caps->ceqe_size = HNS_ROCE_CEQE_SIZE;
+               caps->cqe_sz = HNS_ROCE_V2_CQE_SIZE;
+               caps->qpc_sz = HNS_ROCE_V2_QPC_SZ;
+               caps->sccc_sz = HNS_ROCE_V2_SCCC_SZ;
+               caps->gid_table_len[0] = HNS_ROCE_V2_GID_INDEX_NUM;
+               caps->max_sq_inline = HNS_ROCE_V2_MAX_SQ_INLINE;
        }
 }
 
@@ -1979,6 +2054,70 @@ static void calc_pg_sz(u32 obj_num, u32 obj_size, u32 hop_num, u32 ctx_bt_num,
                *buf_page_size = ilog2(DIV_ROUND_UP(obj_num, obj_per_chunk));
 }
 
+static void set_hem_page_size(struct hns_roce_dev *hr_dev)
+{
+       struct hns_roce_caps *caps = &hr_dev->caps;
+
+       /* EQ */
+       caps->eqe_ba_pg_sz = 0;
+       caps->eqe_buf_pg_sz = 0;
+
+       /* Link Table */
+       caps->tsq_buf_pg_sz = 0;
+
+       /* MR */
+       caps->pbl_ba_pg_sz = HNS_ROCE_BA_PG_SZ_SUPPORTED_16K;
+       caps->pbl_buf_pg_sz = 0;
+       calc_pg_sz(caps->num_mtpts, caps->mtpt_entry_sz, caps->mpt_hop_num,
+                  caps->mpt_bt_num, &caps->mpt_buf_pg_sz, &caps->mpt_ba_pg_sz,
+                  HEM_TYPE_MTPT);
+
+       /* QP */
+       caps->qpc_timer_ba_pg_sz  = 0;
+       caps->qpc_timer_buf_pg_sz = 0;
+       caps->mtt_ba_pg_sz = 0;
+       caps->mtt_buf_pg_sz = 0;
+       calc_pg_sz(caps->num_qps, caps->qpc_sz, caps->qpc_hop_num,
+                  caps->qpc_bt_num, &caps->qpc_buf_pg_sz, &caps->qpc_ba_pg_sz,
+                  HEM_TYPE_QPC);
+
+       if (caps->flags & HNS_ROCE_CAP_FLAG_QP_FLOW_CTRL)
+               calc_pg_sz(caps->num_qps, caps->sccc_sz, caps->sccc_hop_num,
+                          caps->sccc_bt_num, &caps->sccc_buf_pg_sz,
+                          &caps->sccc_ba_pg_sz, HEM_TYPE_SCCC);
+
+       /* CQ */
+       calc_pg_sz(caps->num_cqs, caps->cqc_entry_sz, caps->cqc_hop_num,
+                  caps->cqc_bt_num, &caps->cqc_buf_pg_sz, &caps->cqc_ba_pg_sz,
+                  HEM_TYPE_CQC);
+       calc_pg_sz(caps->max_cqes, caps->cqe_sz, caps->cqe_hop_num,
+                  1, &caps->cqe_buf_pg_sz, &caps->cqe_ba_pg_sz, HEM_TYPE_CQE);
+
+       if (caps->cqc_timer_entry_sz)
+               calc_pg_sz(caps->num_cqc_timer, caps->cqc_timer_entry_sz,
+                          caps->cqc_timer_hop_num, caps->cqc_timer_bt_num,
+                          &caps->cqc_timer_buf_pg_sz,
+                          &caps->cqc_timer_ba_pg_sz, HEM_TYPE_CQC_TIMER);
+
+       /* SRQ */
+       if (caps->flags & HNS_ROCE_CAP_FLAG_SRQ) {
+               calc_pg_sz(caps->num_srqs, caps->srqc_entry_sz,
+                          caps->srqc_hop_num, caps->srqc_bt_num,
+                          &caps->srqc_buf_pg_sz, &caps->srqc_ba_pg_sz,
+                          HEM_TYPE_SRQC);
+               calc_pg_sz(caps->num_srqwqe_segs, caps->mtt_entry_sz,
+                          caps->srqwqe_hop_num, 1, &caps->srqwqe_buf_pg_sz,
+                          &caps->srqwqe_ba_pg_sz, HEM_TYPE_SRQWQE);
+               calc_pg_sz(caps->num_idx_segs, caps->idx_entry_sz,
+                          caps->idx_hop_num, 1, &caps->idx_buf_pg_sz,
+                          &caps->idx_ba_pg_sz, HEM_TYPE_IDX);
+       }
+
+       /* GMV */
+       caps->gmv_ba_pg_sz = 0;
+       caps->gmv_buf_pg_sz = 0;
+}
+
 static int hns_roce_query_pf_caps(struct hns_roce_dev *hr_dev)
 {
        struct hns_roce_cmq_desc desc[HNS_ROCE_QUERY_PF_CAPS_CMD_NUM];
@@ -2062,6 +2201,9 @@ static int hns_roce_query_pf_caps(struct hns_roce_dev *hr_dev)
        caps->gid_table_len[0] = roce_get_field(resp_c->max_gid_num_cqs,
                                                V2_QUERY_PF_CAPS_C_MAX_GID_M,
                                                V2_QUERY_PF_CAPS_C_MAX_GID_S);
+
+       caps->gid_table_len[0] /= hr_dev->func_num;
+
        caps->max_cqes = 1 << roce_get_field(resp_c->cq_depth,
                                             V2_QUERY_PF_CAPS_C_CQ_DEPTH_M,
                                             V2_QUERY_PF_CAPS_C_CQ_DEPTH_S);
@@ -2079,13 +2221,18 @@ static int hns_roce_query_pf_caps(struct hns_roce_dev *hr_dev)
        caps->num_srqs = 1 << roce_get_field(resp_d->wq_hop_num_max_srqs,
                                             V2_QUERY_PF_CAPS_D_NUM_SRQS_M,
                                             V2_QUERY_PF_CAPS_D_NUM_SRQS_S);
+       caps->cong_type = roce_get_field(resp_d->wq_hop_num_max_srqs,
+                                        V2_QUERY_PF_CAPS_D_CONG_TYPE_M,
+                                        V2_QUERY_PF_CAPS_D_CONG_TYPE_S);
        caps->max_srq_wrs = 1 << le16_to_cpu(resp_d->srq_depth);
+
        caps->ceqe_depth = 1 << roce_get_field(resp_d->num_ceqs_ceq_depth,
                                               V2_QUERY_PF_CAPS_D_CEQ_DEPTH_M,
                                               V2_QUERY_PF_CAPS_D_CEQ_DEPTH_S);
        caps->num_comp_vectors = roce_get_field(resp_d->num_ceqs_ceq_depth,
                                                V2_QUERY_PF_CAPS_D_NUM_CEQS_M,
                                                V2_QUERY_PF_CAPS_D_NUM_CEQS_S);
+
        caps->aeqe_depth = 1 << roce_get_field(resp_d->arm_st_aeq_depth,
                                               V2_QUERY_PF_CAPS_D_AEQ_DEPTH_M,
                                               V2_QUERY_PF_CAPS_D_AEQ_DEPTH_S);
@@ -2133,8 +2280,8 @@ static int hns_roce_query_pf_caps(struct hns_roce_dev *hr_dev)
        caps->num_mtt_segs = HNS_ROCE_V2_MAX_MTT_SEGS;
        caps->ceqe_size = HNS_ROCE_CEQE_SIZE;
        caps->aeqe_size = HNS_ROCE_AEQE_SIZE;
-       caps->mtt_ba_pg_sz = 0;
-       caps->num_cqe_segs = HNS_ROCE_V2_MAX_CQE_SEGS;
+       caps->num_xrcds = HNS_ROCE_V2_MAX_XRCD_NUM;
+       caps->reserved_xrcds = HNS_ROCE_V2_RSV_XRCD_NUM;
        caps->num_srqwqe_segs = HNS_ROCE_V2_MAX_SRQWQE_SEGS;
        caps->num_idx_segs = HNS_ROCE_V2_MAX_IDX_SEGS;
 
@@ -2166,99 +2313,82 @@ static int hns_roce_query_pf_caps(struct hns_roce_dev *hr_dev)
                caps->gmv_entry_num = caps->gmv_bt_num * (PAGE_SIZE /
                                                    caps->gmv_entry_sz);
                caps->gmv_hop_num = HNS_ROCE_HOP_NUM_0;
-               caps->gmv_ba_pg_sz = 0;
-               caps->gmv_buf_pg_sz = 0;
                caps->gid_table_len[0] = caps->gmv_bt_num *
                                (HNS_HW_PAGE_SIZE / caps->gmv_entry_sz);
        }
 
-       calc_pg_sz(caps->num_qps, caps->qpc_sz, caps->qpc_hop_num,
-                  caps->qpc_bt_num, &caps->qpc_buf_pg_sz, &caps->qpc_ba_pg_sz,
-                  HEM_TYPE_QPC);
-       calc_pg_sz(caps->num_mtpts, caps->mtpt_entry_sz, caps->mpt_hop_num,
-                  caps->mpt_bt_num, &caps->mpt_buf_pg_sz, &caps->mpt_ba_pg_sz,
-                  HEM_TYPE_MTPT);
-       calc_pg_sz(caps->num_cqs, caps->cqc_entry_sz, caps->cqc_hop_num,
-                  caps->cqc_bt_num, &caps->cqc_buf_pg_sz, &caps->cqc_ba_pg_sz,
-                  HEM_TYPE_CQC);
-       calc_pg_sz(caps->num_srqs, caps->srqc_entry_sz, caps->srqc_hop_num,
-                  caps->srqc_bt_num, &caps->srqc_buf_pg_sz,
-                  &caps->srqc_ba_pg_sz, HEM_TYPE_SRQC);
-
-       caps->sccc_hop_num = ctx_hop_num;
        caps->qpc_timer_hop_num = HNS_ROCE_HOP_NUM_0;
        caps->cqc_timer_hop_num = HNS_ROCE_HOP_NUM_0;
 
-       calc_pg_sz(caps->num_qps, caps->sccc_sz,
-                  caps->sccc_hop_num, caps->sccc_bt_num,
-                  &caps->sccc_buf_pg_sz, &caps->sccc_ba_pg_sz,
-                  HEM_TYPE_SCCC);
-       calc_pg_sz(caps->num_cqc_timer, caps->cqc_timer_entry_sz,
-                  caps->cqc_timer_hop_num, caps->cqc_timer_bt_num,
-                  &caps->cqc_timer_buf_pg_sz,
-                  &caps->cqc_timer_ba_pg_sz, HEM_TYPE_CQC_TIMER);
-
-       calc_pg_sz(caps->num_cqe_segs, caps->mtt_entry_sz, caps->cqe_hop_num,
-                  1, &caps->cqe_buf_pg_sz, &caps->cqe_ba_pg_sz, HEM_TYPE_CQE);
-       calc_pg_sz(caps->num_srqwqe_segs, caps->mtt_entry_sz,
-                  caps->srqwqe_hop_num, 1, &caps->srqwqe_buf_pg_sz,
-                  &caps->srqwqe_ba_pg_sz, HEM_TYPE_SRQWQE);
-       calc_pg_sz(caps->num_idx_segs, caps->idx_entry_sz, caps->idx_hop_num,
-                  1, &caps->idx_buf_pg_sz, &caps->idx_ba_pg_sz, HEM_TYPE_IDX);
-
        return 0;
 }
 
-static int hns_roce_config_qpc_size(struct hns_roce_dev *hr_dev)
+static int config_hem_entry_size(struct hns_roce_dev *hr_dev, u32 type, u32 val)
 {
        struct hns_roce_cmq_desc desc;
-       struct hns_roce_cfg_entry_size *cfg_size =
-                                 (struct hns_roce_cfg_entry_size *)desc.data;
+       struct hns_roce_cmq_req *req = (struct hns_roce_cmq_req *)desc.data;
 
        hns_roce_cmq_setup_basic_desc(&desc, HNS_ROCE_OPC_CFG_ENTRY_SIZE,
                                      false);
 
-       cfg_size->type = cpu_to_le32(HNS_ROCE_CFG_QPC_SIZE);
-       cfg_size->size = cpu_to_le32(hr_dev->caps.qpc_sz);
-
-       return hns_roce_cmq_send(hr_dev, &desc, 1);
-}
-
-static int hns_roce_config_sccc_size(struct hns_roce_dev *hr_dev)
-{
-       struct hns_roce_cmq_desc desc;
-       struct hns_roce_cfg_entry_size *cfg_size =
-                                 (struct hns_roce_cfg_entry_size *)desc.data;
-
-       hns_roce_cmq_setup_basic_desc(&desc, HNS_ROCE_OPC_CFG_ENTRY_SIZE,
-                                     false);
-
-       cfg_size->type = cpu_to_le32(HNS_ROCE_CFG_SCCC_SIZE);
-       cfg_size->size = cpu_to_le32(hr_dev->caps.sccc_sz);
+       hr_reg_write(req, CFG_HEM_ENTRY_SIZE_TYPE, type);
+       hr_reg_write(req, CFG_HEM_ENTRY_SIZE_VALUE, val);
 
        return hns_roce_cmq_send(hr_dev, &desc, 1);
 }
 
 static int hns_roce_config_entry_size(struct hns_roce_dev *hr_dev)
 {
+       struct hns_roce_caps *caps = &hr_dev->caps;
        int ret;
 
        if (hr_dev->pci_dev->revision < PCI_REVISION_ID_HIP09)
                return 0;
 
-       ret = hns_roce_config_qpc_size(hr_dev);
+       ret = config_hem_entry_size(hr_dev, HNS_ROCE_CFG_QPC_SIZE,
+                                   caps->qpc_sz);
        if (ret) {
                dev_err(hr_dev->dev, "failed to cfg qpc sz, ret = %d.\n", ret);
                return ret;
        }
 
-       ret = hns_roce_config_sccc_size(hr_dev);
+       ret = config_hem_entry_size(hr_dev, HNS_ROCE_CFG_SCCC_SIZE,
+                                   caps->sccc_sz);
        if (ret)
                dev_err(hr_dev->dev, "failed to cfg sccc sz, ret = %d.\n", ret);
 
        return ret;
 }
 
+static int hns_roce_v2_vf_profile(struct hns_roce_dev *hr_dev)
+{
+       int ret;
+
+       hr_dev->vendor_part_id = hr_dev->pci_dev->device;
+       hr_dev->sys_image_guid = be64_to_cpu(hr_dev->ib_dev.node_guid);
+       hr_dev->func_num = 1;
+
+       ret = hns_roce_query_vf_resource(hr_dev);
+       if (ret) {
+               dev_err(hr_dev->dev,
+                       "Query the VF resource fail, ret = %d.\n", ret);
+               return ret;
+       }
+
+       set_default_caps(hr_dev);
+       set_hem_page_size(hr_dev);
+
+       ret = hns_roce_v2_set_bt(hr_dev);
+       if (ret) {
+               dev_err(hr_dev->dev,
+                       "Configure the VF bt attribute fail, ret = %d.\n",
+                       ret);
+               return ret;
+       }
+
+       return 0;
+}
+
 static int hns_roce_v2_profile(struct hns_roce_dev *hr_dev)
 {
        struct hns_roce_caps *caps = &hr_dev->caps;
@@ -2278,6 +2408,16 @@ static int hns_roce_v2_profile(struct hns_roce_dev *hr_dev)
                return ret;
        }
 
+       if (hr_dev->is_vf)
+               return hns_roce_v2_vf_profile(hr_dev);
+
+       ret = hns_roce_query_func_info(hr_dev);
+       if (ret) {
+               dev_err(hr_dev->dev, "Query function info fail, ret = %d.\n",
+                       ret);
+               return ret;
+       }
+
        ret = hns_roce_config_global_param(hr_dev);
        if (ret) {
                dev_err(hr_dev->dev, "Configure global param fail, ret = %d.\n",
@@ -2300,7 +2440,7 @@ static int hns_roce_v2_profile(struct hns_roce_dev *hr_dev)
                return ret;
        }
 
-       ret = hns_roce_set_vf_switch_param(hr_dev, 0);
+       ret = hns_roce_set_vf_switch_param(hr_dev);
        if (ret) {
                dev_err(hr_dev->dev,
                        "failed to set function switch param, ret = %d.\n",
@@ -2311,13 +2451,8 @@ static int hns_roce_v2_profile(struct hns_roce_dev *hr_dev)
        hr_dev->vendor_part_id = hr_dev->pci_dev->device;
        hr_dev->sys_image_guid = be64_to_cpu(hr_dev->ib_dev.node_guid);
 
-       caps->pbl_ba_pg_sz      = HNS_ROCE_BA_PG_SZ_SUPPORTED_16K;
-       caps->pbl_buf_pg_sz     = 0;
        caps->pbl_hop_num       = HNS_ROCE_PBL_HOP_NUM;
-       caps->eqe_ba_pg_sz      = 0;
-       caps->eqe_buf_pg_sz     = 0;
        caps->eqe_hop_num       = HNS_ROCE_EQE_HOP_NUM;
-       caps->tsq_buf_pg_sz     = 0;
 
        ret = hns_roce_query_pf_caps(hr_dev);
        if (ret)
@@ -2330,6 +2465,7 @@ static int hns_roce_v2_profile(struct hns_roce_dev *hr_dev)
                return ret;
        }
 
+       set_hem_page_size(hr_dev);
        ret = hns_roce_v2_set_bt(hr_dev);
        if (ret) {
                dev_err(hr_dev->dev,
@@ -2507,6 +2643,22 @@ static void hns_roce_free_link_table(struct hns_roce_dev *hr_dev,
                          link_tbl->table.map);
 }
 
+static void free_dip_list(struct hns_roce_dev *hr_dev)
+{
+       struct hns_roce_dip *hr_dip;
+       struct hns_roce_dip *tmp;
+       unsigned long flags;
+
+       spin_lock_irqsave(&hr_dev->dip_list_lock, flags);
+
+       list_for_each_entry_safe(hr_dip, tmp, &hr_dev->dip_list, node) {
+               list_del(&hr_dip->node);
+               kfree(hr_dip);
+       }
+
+       spin_unlock_irqrestore(&hr_dev->dip_list_lock, flags);
+}
+
 static int get_hem_table(struct hns_roce_dev *hr_dev)
 {
        unsigned int qpc_count;
@@ -2515,6 +2667,17 @@ static int get_hem_table(struct hns_roce_dev *hr_dev)
        int ret;
        int i;
 
+       /* Alloc memory for source address table buffer space chunk */
+       for (gmv_count = 0; gmv_count < hr_dev->caps.gmv_entry_num;
+            gmv_count++) {
+               ret = hns_roce_table_get(hr_dev, &hr_dev->gmv_table, gmv_count);
+               if (ret)
+                       goto err_gmv_failed;
+       }
+
+       if (hr_dev->is_vf)
+               return 0;
+
        /* Alloc memory for QPC Timer buffer space chunk */
        for (qpc_count = 0; qpc_count < hr_dev->caps.qpc_timer_bt_num;
             qpc_count++) {
@@ -2537,23 +2700,8 @@ static int get_hem_table(struct hns_roce_dev *hr_dev)
                }
        }
 
-       /* Alloc memory for GMV(GID/MAC/VLAN) table buffer space chunk */
-       for (gmv_count = 0; gmv_count < hr_dev->caps.gmv_entry_num;
-            gmv_count++) {
-               ret = hns_roce_table_get(hr_dev, &hr_dev->gmv_table, gmv_count);
-               if (ret) {
-                       dev_err(hr_dev->dev,
-                               "failed to get gmv table, ret = %d.\n", ret);
-                       goto err_gmv_failed;
-               }
-       }
-
        return 0;
 
-err_gmv_failed:
-       for (i = 0; i < gmv_count; i++)
-               hns_roce_table_put(hr_dev, &hr_dev->gmv_table, i);
-
 err_cqc_timer_failed:
        for (i = 0; i < cqc_count; i++)
                hns_roce_table_put(hr_dev, &hr_dev->cqc_timer_table, i);
@@ -2562,19 +2710,47 @@ err_qpc_timer_failed:
        for (i = 0; i < qpc_count; i++)
                hns_roce_table_put(hr_dev, &hr_dev->qpc_timer_table, i);
 
+err_gmv_failed:
+       for (i = 0; i < gmv_count; i++)
+               hns_roce_table_put(hr_dev, &hr_dev->gmv_table, i);
+
        return ret;
 }
 
+static void put_hem_table(struct hns_roce_dev *hr_dev)
+{
+       int i;
+
+       for (i = 0; i < hr_dev->caps.gmv_entry_num; i++)
+               hns_roce_table_put(hr_dev, &hr_dev->gmv_table, i);
+
+       if (hr_dev->is_vf)
+               return;
+
+       for (i = 0; i < hr_dev->caps.qpc_timer_bt_num; i++)
+               hns_roce_table_put(hr_dev, &hr_dev->qpc_timer_table, i);
+
+       for (i = 0; i < hr_dev->caps.cqc_timer_bt_num; i++)
+               hns_roce_table_put(hr_dev, &hr_dev->cqc_timer_table, i);
+}
+
 static int hns_roce_v2_init(struct hns_roce_dev *hr_dev)
 {
        struct hns_roce_v2_priv *priv = hr_dev->priv;
        int ret;
 
+       ret = get_hem_table(hr_dev);
+       if (ret)
+               return ret;
+
+       if (hr_dev->is_vf)
+               return 0;
+
        /* TSQ includes SQ doorbell and ack doorbell */
        ret = hns_roce_init_link_table(hr_dev, TSQ_LINK_TABLE);
        if (ret) {
                dev_err(hr_dev->dev, "failed to init TSQ, ret = %d.\n", ret);
-               return ret;
+               goto err_tsq_init_failed;
        }
 
        ret = hns_roce_init_link_table(hr_dev, TPQ_LINK_TABLE);
@@ -2583,17 +2759,13 @@ static int hns_roce_v2_init(struct hns_roce_dev *hr_dev)
                goto err_tpq_init_failed;
        }
 
-       ret = get_hem_table(hr_dev);
-       if (ret)
-               goto err_get_hem_table_failed;
-
        return 0;
 
-err_get_hem_table_failed:
-       hns_roce_free_link_table(hr_dev, &priv->tpq);
+err_tsq_init_failed:
+       put_hem_table(hr_dev);
 
 err_tpq_init_failed:
-       hns_roce_free_link_table(hr_dev, &priv->tsq);
+       hns_roce_free_link_table(hr_dev, &priv->tpq);
 
        return ret;
 }
@@ -2604,38 +2776,13 @@ static void hns_roce_v2_exit(struct hns_roce_dev *hr_dev)
 
        hns_roce_function_clear(hr_dev);
 
-       hns_roce_free_link_table(hr_dev, &priv->tpq);
-       hns_roce_free_link_table(hr_dev, &priv->tsq);
-}
-
-static int hns_roce_query_mbox_status(struct hns_roce_dev *hr_dev)
-{
-       struct hns_roce_cmq_desc desc;
-       struct hns_roce_mbox_status *mb_st =
-                                      (struct hns_roce_mbox_status *)desc.data;
-       int status;
-
-       hns_roce_cmq_setup_basic_desc(&desc, HNS_ROCE_OPC_QUERY_MB_ST, true);
-
-       status = hns_roce_cmq_send(hr_dev, &desc, 1);
-       if (status)
-               return status;
-
-       return le32_to_cpu(mb_st->mb_status_hw_run);
-}
-
-static int hns_roce_v2_cmd_pending(struct hns_roce_dev *hr_dev)
-{
-       u32 status = hns_roce_query_mbox_status(hr_dev);
-
-       return status >> HNS_ROCE_HW_RUN_BIT_SHIFT;
-}
-
-static int hns_roce_v2_cmd_complete(struct hns_roce_dev *hr_dev)
-{
-       u32 status = hns_roce_query_mbox_status(hr_dev);
+       if (!hr_dev->is_vf) {
+               hns_roce_free_link_table(hr_dev, &priv->tpq);
+               hns_roce_free_link_table(hr_dev, &priv->tsq);
+       }
 
-       return status & HNS_ROCE_HW_MB_STATUS_MASK;
+       if (hr_dev->pci_dev->revision == PCI_REVISION_ID_HIP09)
+               free_dip_list(hr_dev);
 }
 
 static int hns_roce_mbox_post(struct hns_roce_dev *hr_dev, u64 in_param,
@@ -2657,58 +2804,97 @@ static int hns_roce_mbox_post(struct hns_roce_dev *hr_dev, u64 in_param,
        return hns_roce_cmq_send(hr_dev, &desc, 1);
 }
 
-static int hns_roce_v2_post_mbox(struct hns_roce_dev *hr_dev, u64 in_param,
-                                u64 out_param, u32 in_modifier, u8 op_modifier,
-                                u16 op, u16 token, int event)
+static int v2_wait_mbox_complete(struct hns_roce_dev *hr_dev, u32 timeout,
+                                u8 *complete_status)
 {
-       struct device *dev = hr_dev->dev;
+       struct hns_roce_mbox_status *mb_st;
+       struct hns_roce_cmq_desc desc;
        unsigned long end;
-       int ret;
+       int ret = -EBUSY;
+       u32 status;
+       bool busy;
+
+       mb_st = (struct hns_roce_mbox_status *)desc.data;
+       end = msecs_to_jiffies(timeout) + jiffies;
+       while (v2_chk_mbox_is_avail(hr_dev, &busy)) {
+               status = 0;
+               hns_roce_cmq_setup_basic_desc(&desc, HNS_ROCE_OPC_QUERY_MB_ST,
+                                             true);
+               ret = __hns_roce_cmq_send(hr_dev, &desc, 1);
+               if (!ret) {
+                       status = le32_to_cpu(mb_st->mb_status_hw_run);
+                       /* No pending message exists in ROCEE mbox. */
+                       if (!(status & MB_ST_HW_RUN_M))
+                               break;
+               } else if (!v2_chk_mbox_is_avail(hr_dev, &busy)) {
+                       break;
+               }
 
-       end = msecs_to_jiffies(HNS_ROCE_V2_GO_BIT_TIMEOUT_MSECS) + jiffies;
-       while (hns_roce_v2_cmd_pending(hr_dev)) {
                if (time_after(jiffies, end)) {
-                       dev_dbg(dev, "jiffies=%d end=%d\n", (int)jiffies,
-                               (int)end);
-                       return -EAGAIN;
+                       dev_err_ratelimited(hr_dev->dev,
+                                           "failed to wait mbox status 0x%x\n",
+                                           status);
+                       return -ETIMEDOUT;
                }
+
                cond_resched();
+               ret = -EBUSY;
        }
 
-       ret = hns_roce_mbox_post(hr_dev, in_param, out_param, in_modifier,
-                                op_modifier, op, token, event);
-       if (ret)
-               dev_err(dev, "Post mailbox fail(%d)\n", ret);
+       if (!ret) {
+               *complete_status = (u8)(status & MB_ST_COMPLETE_M);
+       } else if (!v2_chk_mbox_is_avail(hr_dev, &busy)) {
+               /* Ignore all errors if the mbox is unavailable. */
+               ret = 0;
+               *complete_status = MB_ST_COMPLETE_M;
+       }
 
        return ret;
 }
 
-static int hns_roce_v2_chk_mbox(struct hns_roce_dev *hr_dev,
-                               unsigned int timeout)
+static int v2_post_mbox(struct hns_roce_dev *hr_dev, u64 in_param,
+                       u64 out_param, u32 in_modifier, u8 op_modifier,
+                       u16 op, u16 token, int event)
 {
-       struct device *dev = hr_dev->dev;
-       unsigned long end;
-       u32 status;
-
-       end = msecs_to_jiffies(timeout) + jiffies;
-       while (hns_roce_v2_cmd_pending(hr_dev) && time_before(jiffies, end))
-               cond_resched();
+       u8 status = 0;
+       int ret;
 
-       if (hns_roce_v2_cmd_pending(hr_dev)) {
-               dev_err(dev, "[cmd_poll]hw run cmd TIMEDOUT!\n");
-               return -ETIMEDOUT;
+       /* Waiting for the mbox to be idle */
+       ret = v2_wait_mbox_complete(hr_dev, HNS_ROCE_V2_GO_BIT_TIMEOUT_MSECS,
+                                   &status);
+       if (unlikely(ret)) {
+               dev_err_ratelimited(hr_dev->dev,
+                                   "failed to check post mbox status = 0x%x, ret = %d.\n",
+                                   status, ret);
+               return ret;
        }
 
-       status = hns_roce_v2_cmd_complete(hr_dev);
-       if (status != 0x1) {
-               if (status == CMD_RST_PRC_EBUSY)
-                       return status;
+       /* Post new message to mbox */
+       ret = hns_roce_mbox_post(hr_dev, in_param, out_param, in_modifier,
+                                op_modifier, op, token, event);
+       if (ret)
+               dev_err_ratelimited(hr_dev->dev,
+                                   "failed to post mailbox, ret = %d.\n", ret);
+
+       return ret;
+}
+
+static int v2_poll_mbox_done(struct hns_roce_dev *hr_dev, unsigned int timeout)
+{
+       u8 status = 0;
+       int ret;
 
-               dev_err(dev, "mailbox status 0x%x!\n", status);
-               return -EBUSY;
+       ret = v2_wait_mbox_complete(hr_dev, timeout, &status);
+       if (!ret) {
+               if (status != MB_ST_COMPLETE_SUCC)
+                       return -EBUSY;
+       } else {
+               dev_err_ratelimited(hr_dev->dev,
+                                   "failed to check mbox status = 0x%x, ret = %d.\n",
+                                   status, ret);
        }
 
-       return 0;
+       return ret;
 }
 
 static void copy_gid(void *dest, const union ib_gid *gid)
@@ -2790,7 +2976,7 @@ static int config_gmv_table(struct hns_roce_dev *hr_dev,
        return hns_roce_cmq_send(hr_dev, desc, 2);
 }
 
-static int hns_roce_v2_set_gid(struct hns_roce_dev *hr_dev, u8 port,
+static int hns_roce_v2_set_gid(struct hns_roce_dev *hr_dev, u32 port,
                               int gid_index, const union ib_gid *gid,
                               const struct ib_gid_attr *attr)
 {
@@ -3079,14 +3265,31 @@ static void *get_sw_cqe_v2(struct hns_roce_cq *hr_cq, unsigned int n)
                !!(n & hr_cq->cq_depth)) ? cqe : NULL;
 }
 
-static inline void hns_roce_v2_cq_set_ci(struct hns_roce_cq *hr_cq, u32 ci)
+static inline void update_cq_db(struct hns_roce_dev *hr_dev,
+                               struct hns_roce_cq *hr_cq)
 {
-       *hr_cq->set_ci_db = ci & V2_CQ_DB_PARAMETER_CONS_IDX_M;
+       if (likely(hr_cq->flags & HNS_ROCE_CQ_FLAG_RECORD_DB)) {
+               *hr_cq->set_ci_db = hr_cq->cons_index & V2_CQ_DB_CONS_IDX_M;
+       } else {
+               struct hns_roce_v2_db cq_db = {};
+
+               roce_set_field(cq_db.byte_4, V2_DB_TAG_M, V2_DB_TAG_S,
+                              hr_cq->cqn);
+               roce_set_field(cq_db.byte_4, V2_DB_CMD_M, V2_DB_CMD_S,
+                              HNS_ROCE_V2_CQ_DB);
+               roce_set_field(cq_db.parameter, V2_CQ_DB_CONS_IDX_M,
+                              V2_CQ_DB_CONS_IDX_S, hr_cq->cons_index);
+               roce_set_field(cq_db.parameter, V2_CQ_DB_CMD_SN_M,
+                              V2_CQ_DB_CMD_SN_S, 1);
+
+               hns_roce_write64(hr_dev, (__le32 *)&cq_db, hr_cq->db_reg);
+       }
 }
 
 static void __hns_roce_v2_cq_clean(struct hns_roce_cq *hr_cq, u32 qpn,
                                   struct hns_roce_srq *srq)
 {
+       struct hns_roce_dev *hr_dev = to_hr_dev(hr_cq->ib_cq.device);
        struct hns_roce_v2_cqe *cqe, *dest;
        u32 prod_index;
        int nfreed = 0;
@@ -3129,7 +3332,7 @@ static void __hns_roce_v2_cq_clean(struct hns_roce_cq *hr_cq, u32 qpn,
 
        if (nfreed) {
                hr_cq->cons_index += nfreed;
-               hns_roce_v2_cq_set_ci(hr_cq, hr_cq->cons_index);
+               update_cq_db(hr_dev, hr_cq);
        }
 }
 
@@ -3224,37 +3427,33 @@ static int hns_roce_v2_req_notify_cq(struct ib_cq *ibcq,
 {
        struct hns_roce_dev *hr_dev = to_hr_dev(ibcq->device);
        struct hns_roce_cq *hr_cq = to_hr_cq(ibcq);
-       u32 notification_flag;
-       __le32 doorbell[2];
+       struct hns_roce_v2_db cq_db = {};
+       u32 notify_flag;
 
-       doorbell[0] = 0;
-       doorbell[1] = 0;
-
-       notification_flag = (flags & IB_CQ_SOLICITED_MASK) == IB_CQ_SOLICITED ?
-                            V2_CQ_DB_REQ_NOT : V2_CQ_DB_REQ_NOT_SOL;
        /*
-        * flags = 0; Notification Flag = 1, next
-        * flags = 1; Notification Flag = 0, solocited
+        * flags = 0, then notify_flag : next
+        * flags = 1, then notify flag : solocited
         */
-       roce_set_field(doorbell[0], V2_CQ_DB_BYTE_4_TAG_M, V2_DB_BYTE_4_TAG_S,
-                      hr_cq->cqn);
-       roce_set_field(doorbell[0], V2_CQ_DB_BYTE_4_CMD_M, V2_DB_BYTE_4_CMD_S,
-                      HNS_ROCE_V2_CQ_DB_NTR);
-       roce_set_field(doorbell[1], V2_CQ_DB_PARAMETER_CONS_IDX_M,
-                      V2_CQ_DB_PARAMETER_CONS_IDX_S, hr_cq->cons_index);
-       roce_set_field(doorbell[1], V2_CQ_DB_PARAMETER_CMD_SN_M,
-                      V2_CQ_DB_PARAMETER_CMD_SN_S, hr_cq->arm_sn & 0x3);
-       roce_set_bit(doorbell[1], V2_CQ_DB_PARAMETER_NOTIFY_S,
-                    notification_flag);
-
-       hns_roce_write64(hr_dev, doorbell, hr_cq->cq_db_l);
+       notify_flag = (flags & IB_CQ_SOLICITED_MASK) == IB_CQ_SOLICITED ?
+                     V2_CQ_DB_REQ_NOT : V2_CQ_DB_REQ_NOT_SOL;
+
+       roce_set_field(cq_db.byte_4, V2_DB_TAG_M, V2_DB_TAG_S, hr_cq->cqn);
+       roce_set_field(cq_db.byte_4, V2_DB_CMD_M, V2_DB_CMD_S,
+                      HNS_ROCE_V2_CQ_DB_NOTIFY);
+       roce_set_field(cq_db.parameter, V2_CQ_DB_CONS_IDX_M,
+                      V2_CQ_DB_CONS_IDX_S, hr_cq->cons_index);
+       roce_set_field(cq_db.parameter, V2_CQ_DB_CMD_SN_M,
+                      V2_CQ_DB_CMD_SN_S, hr_cq->arm_sn);
+       roce_set_bit(cq_db.parameter, V2_CQ_DB_NOTIFY_TYPE_S, notify_flag);
+
+       hns_roce_write64(hr_dev, (__le32 *)&cq_db, hr_cq->db_reg);
 
        return 0;
 }
 
 static int hns_roce_handle_recv_inl_wqe(struct hns_roce_v2_cqe *cqe,
-                                                   struct hns_roce_qp **cur_qp,
-                                                   struct ib_wc *wc)
+                                       struct hns_roce_qp *qp,
+                                       struct ib_wc *wc)
 {
        struct hns_roce_rinl_sge *sge_list;
        u32 wr_num, wr_cnt, sge_num;
@@ -3263,11 +3462,11 @@ static int hns_roce_handle_recv_inl_wqe(struct hns_roce_v2_cqe *cqe,
 
        wr_num = roce_get_field(cqe->byte_4, V2_CQE_BYTE_4_WQE_INDX_M,
                                V2_CQE_BYTE_4_WQE_INDX_S) & 0xffff;
-       wr_cnt = wr_num & ((*cur_qp)->rq.wqe_cnt - 1);
+       wr_cnt = wr_num & (qp->rq.wqe_cnt - 1);
 
-       sge_list = (*cur_qp)->rq_inl_buf.wqe_list[wr_cnt].sg_list;
-       sge_num = (*cur_qp)->rq_inl_buf.wqe_list[wr_cnt].sge_cnt;
-       wqe_buf = hns_roce_get_recv_wqe(*cur_qp, wr_cnt);
+       sge_list = qp->rq_inl_buf.wqe_list[wr_cnt].sg_list;
+       sge_num = qp->rq_inl_buf.wqe_list[wr_cnt].sge_cnt;
+       wqe_buf = hns_roce_get_recv_wqe(qp, wr_cnt);
        data_len = wc->byte_len;
 
        for (sge_cnt = 0; (sge_cnt < sge_num) && (data_len); sge_cnt++) {
@@ -3401,21 +3600,205 @@ static void get_cqe_status(struct hns_roce_dev *hr_dev, struct hns_roce_qp *qp,
                init_flush_work(hr_dev, qp);
 }
 
+static int get_cur_qp(struct hns_roce_cq *hr_cq, struct hns_roce_v2_cqe *cqe,
+                     struct hns_roce_qp **cur_qp)
+{
+       struct hns_roce_dev *hr_dev = to_hr_dev(hr_cq->ib_cq.device);
+       struct hns_roce_qp *hr_qp = *cur_qp;
+       u32 qpn;
+
+       qpn = roce_get_field(cqe->byte_16, V2_CQE_BYTE_16_LCL_QPN_M,
+                            V2_CQE_BYTE_16_LCL_QPN_S) &
+             HNS_ROCE_V2_CQE_QPN_MASK;
+
+       if (!hr_qp || qpn != hr_qp->qpn) {
+               hr_qp = __hns_roce_qp_lookup(hr_dev, qpn);
+               if (unlikely(!hr_qp)) {
+                       ibdev_err(&hr_dev->ib_dev,
+                                 "CQ %06lx with entry for unknown QPN %06x\n",
+                                 hr_cq->cqn, qpn);
+                       return -EINVAL;
+               }
+               *cur_qp = hr_qp;
+       }
+
+       return 0;
+}
+
+/*
+ * mapped-value = 1 + real-value
+ * The ib wc opcode's real value is start from 0, In order to distinguish
+ * between initialized and uninitialized map values, we plus 1 to the actual
+ * value when defining the mapping, so that the validity can be identified by
+ * checking whether the mapped value is greater than 0.
+ */
+#define HR_WC_OP_MAP(hr_key, ib_key) \
+               [HNS_ROCE_V2_WQE_OP_ ## hr_key] = 1 + IB_WC_ ## ib_key
+
+static const u32 wc_send_op_map[] = {
+       HR_WC_OP_MAP(SEND,                      SEND),
+       HR_WC_OP_MAP(SEND_WITH_INV,             SEND),
+       HR_WC_OP_MAP(SEND_WITH_IMM,             SEND),
+       HR_WC_OP_MAP(RDMA_READ,                 RDMA_READ),
+       HR_WC_OP_MAP(RDMA_WRITE,                RDMA_WRITE),
+       HR_WC_OP_MAP(RDMA_WRITE_WITH_IMM,       RDMA_WRITE),
+       HR_WC_OP_MAP(LOCAL_INV,                 LOCAL_INV),
+       HR_WC_OP_MAP(ATOM_CMP_AND_SWAP,         COMP_SWAP),
+       HR_WC_OP_MAP(ATOM_FETCH_AND_ADD,        FETCH_ADD),
+       HR_WC_OP_MAP(ATOM_MSK_CMP_AND_SWAP,     MASKED_COMP_SWAP),
+       HR_WC_OP_MAP(ATOM_MSK_FETCH_AND_ADD,    MASKED_FETCH_ADD),
+       HR_WC_OP_MAP(FAST_REG_PMR,              REG_MR),
+       HR_WC_OP_MAP(BIND_MW,                   REG_MR),
+};
+
+static int to_ib_wc_send_op(u32 hr_opcode)
+{
+       if (hr_opcode >= ARRAY_SIZE(wc_send_op_map))
+               return -EINVAL;
+
+       return wc_send_op_map[hr_opcode] ? wc_send_op_map[hr_opcode] - 1 :
+                                          -EINVAL;
+}
+
+static const u32 wc_recv_op_map[] = {
+       HR_WC_OP_MAP(RDMA_WRITE_WITH_IMM,               WITH_IMM),
+       HR_WC_OP_MAP(SEND,                              RECV),
+       HR_WC_OP_MAP(SEND_WITH_IMM,                     WITH_IMM),
+       HR_WC_OP_MAP(SEND_WITH_INV,                     RECV),
+};
+
+static int to_ib_wc_recv_op(u32 hr_opcode)
+{
+       if (hr_opcode >= ARRAY_SIZE(wc_recv_op_map))
+               return -EINVAL;
+
+       return wc_recv_op_map[hr_opcode] ? wc_recv_op_map[hr_opcode] - 1 :
+                                          -EINVAL;
+}
+
+static void fill_send_wc(struct ib_wc *wc, struct hns_roce_v2_cqe *cqe)
+{
+       u32 hr_opcode;
+       int ib_opcode;
+
+       wc->wc_flags = 0;
+
+       hr_opcode = roce_get_field(cqe->byte_4, V2_CQE_BYTE_4_OPCODE_M,
+                                  V2_CQE_BYTE_4_OPCODE_S) & 0x1f;
+       switch (hr_opcode) {
+       case HNS_ROCE_V2_WQE_OP_RDMA_READ:
+               wc->byte_len = le32_to_cpu(cqe->byte_cnt);
+               break;
+       case HNS_ROCE_V2_WQE_OP_SEND_WITH_IMM:
+       case HNS_ROCE_V2_WQE_OP_RDMA_WRITE_WITH_IMM:
+               wc->wc_flags |= IB_WC_WITH_IMM;
+               break;
+       case HNS_ROCE_V2_WQE_OP_LOCAL_INV:
+               wc->wc_flags |= IB_WC_WITH_INVALIDATE;
+               break;
+       case HNS_ROCE_V2_WQE_OP_ATOM_CMP_AND_SWAP:
+       case HNS_ROCE_V2_WQE_OP_ATOM_FETCH_AND_ADD:
+       case HNS_ROCE_V2_WQE_OP_ATOM_MSK_CMP_AND_SWAP:
+       case HNS_ROCE_V2_WQE_OP_ATOM_MSK_FETCH_AND_ADD:
+               wc->byte_len  = 8;
+               break;
+       default:
+               break;
+       }
+
+       ib_opcode = to_ib_wc_send_op(hr_opcode);
+       if (ib_opcode < 0)
+               wc->status = IB_WC_GENERAL_ERR;
+       else
+               wc->opcode = ib_opcode;
+}
+
+static inline bool is_rq_inl_enabled(struct ib_wc *wc, u32 hr_opcode,
+                                    struct hns_roce_v2_cqe *cqe)
+{
+       return wc->qp->qp_type != IB_QPT_UD &&
+              wc->qp->qp_type != IB_QPT_GSI &&
+              (hr_opcode == HNS_ROCE_V2_OPCODE_SEND ||
+               hr_opcode == HNS_ROCE_V2_OPCODE_SEND_WITH_IMM ||
+               hr_opcode == HNS_ROCE_V2_OPCODE_SEND_WITH_INV) &&
+              roce_get_bit(cqe->byte_4, V2_CQE_BYTE_4_RQ_INLINE_S);
+}
+
+static int fill_recv_wc(struct ib_wc *wc, struct hns_roce_v2_cqe *cqe)
+{
+       struct hns_roce_qp *qp = to_hr_qp(wc->qp);
+       u32 hr_opcode;
+       int ib_opcode;
+       int ret;
+
+       wc->byte_len = le32_to_cpu(cqe->byte_cnt);
+
+       hr_opcode = roce_get_field(cqe->byte_4, V2_CQE_BYTE_4_OPCODE_M,
+                                  V2_CQE_BYTE_4_OPCODE_S) & 0x1f;
+       switch (hr_opcode) {
+       case HNS_ROCE_V2_OPCODE_RDMA_WRITE_IMM:
+       case HNS_ROCE_V2_OPCODE_SEND_WITH_IMM:
+               wc->wc_flags = IB_WC_WITH_IMM;
+               wc->ex.imm_data = cpu_to_be32(le32_to_cpu(cqe->immtdata));
+               break;
+       case HNS_ROCE_V2_OPCODE_SEND_WITH_INV:
+               wc->wc_flags = IB_WC_WITH_INVALIDATE;
+               wc->ex.invalidate_rkey = le32_to_cpu(cqe->rkey);
+               break;
+       default:
+               wc->wc_flags = 0;
+       }
+
+       ib_opcode = to_ib_wc_recv_op(hr_opcode);
+       if (ib_opcode < 0)
+               wc->status = IB_WC_GENERAL_ERR;
+       else
+               wc->opcode = ib_opcode;
+
+       if (is_rq_inl_enabled(wc, hr_opcode, cqe)) {
+               ret = hns_roce_handle_recv_inl_wqe(cqe, qp, wc);
+               if (unlikely(ret))
+                       return ret;
+       }
+
+       wc->sl = roce_get_field(cqe->byte_32, V2_CQE_BYTE_32_SL_M,
+                               V2_CQE_BYTE_32_SL_S);
+       wc->src_qp = roce_get_field(cqe->byte_32, V2_CQE_BYTE_32_RMT_QPN_M,
+                                   V2_CQE_BYTE_32_RMT_QPN_S);
+       wc->slid = 0;
+       wc->wc_flags |= roce_get_bit(cqe->byte_32, V2_CQE_BYTE_32_GRH_S) ?
+                                    IB_WC_GRH : 0;
+       wc->port_num = roce_get_field(cqe->byte_32, V2_CQE_BYTE_32_PORTN_M,
+                                     V2_CQE_BYTE_32_PORTN_S);
+       wc->pkey_index = 0;
+
+       if (roce_get_bit(cqe->byte_28, V2_CQE_BYTE_28_VID_VLD_S)) {
+               wc->vlan_id = roce_get_field(cqe->byte_28, V2_CQE_BYTE_28_VID_M,
+                                            V2_CQE_BYTE_28_VID_S);
+               wc->wc_flags |= IB_WC_WITH_VLAN;
+       } else {
+               wc->vlan_id = 0xffff;
+       }
+
+       wc->network_hdr_type = roce_get_field(cqe->byte_28,
+                                             V2_CQE_BYTE_28_PORT_TYPE_M,
+                                             V2_CQE_BYTE_28_PORT_TYPE_S);
+
+       return 0;
+}
+
 static int hns_roce_v2_poll_one(struct hns_roce_cq *hr_cq,
                                struct hns_roce_qp **cur_qp, struct ib_wc *wc)
 {
        struct hns_roce_dev *hr_dev = to_hr_dev(hr_cq->ib_cq.device);
+       struct hns_roce_qp *qp = *cur_qp;
        struct hns_roce_srq *srq = NULL;
        struct hns_roce_v2_cqe *cqe;
-       struct hns_roce_qp *hr_qp;
        struct hns_roce_wq *wq;
        int is_send;
-       u16 wqe_ctr;
-       u32 opcode;
-       u32 qpn;
+       u16 wqe_idx;
        int ret;
 
-       /* Find cqe according to consumer index */
        cqe = get_sw_cqe_v2(hr_cq, hr_cq->cons_index);
        if (!cqe)
                return -EAGAIN;
@@ -3424,189 +3807,50 @@ static int hns_roce_v2_poll_one(struct hns_roce_cq *hr_cq,
        /* Memory barrier */
        rmb();
 
-       /* 0->SQ, 1->RQ */
-       is_send = !roce_get_bit(cqe->byte_4, V2_CQE_BYTE_4_S_R_S);
-
-       qpn = roce_get_field(cqe->byte_16, V2_CQE_BYTE_16_LCL_QPN_M,
-                               V2_CQE_BYTE_16_LCL_QPN_S);
-
-       if (!*cur_qp || (qpn & HNS_ROCE_V2_CQE_QPN_MASK) != (*cur_qp)->qpn) {
-               hr_qp = __hns_roce_qp_lookup(hr_dev, qpn);
-               if (unlikely(!hr_qp)) {
-                       ibdev_err(&hr_dev->ib_dev,
-                                 "CQ %06lx with entry for unknown QPN %06x\n",
-                                 hr_cq->cqn, qpn & HNS_ROCE_V2_CQE_QPN_MASK);
-                       return -EINVAL;
-               }
-               *cur_qp = hr_qp;
-       }
+       ret = get_cur_qp(hr_cq, cqe, &qp);
+       if (ret)
+               return ret;
 
-       wc->qp = &(*cur_qp)->ibqp;
+       wc->qp = &qp->ibqp;
        wc->vendor_err = 0;
 
+       wqe_idx = roce_get_field(cqe->byte_4, V2_CQE_BYTE_4_WQE_INDX_M,
+                                V2_CQE_BYTE_4_WQE_INDX_S);
+
+       is_send = !roce_get_bit(cqe->byte_4, V2_CQE_BYTE_4_S_R_S);
        if (is_send) {
-               wq = &(*cur_qp)->sq;
-               if ((*cur_qp)->sq_signal_bits) {
-                       /*
-                        * If sg_signal_bit is 1,
-                        * firstly tail pointer updated to wqe
-                        * which current cqe correspond to
-                        */
-                       wqe_ctr = (u16)roce_get_field(cqe->byte_4,
-                                                     V2_CQE_BYTE_4_WQE_INDX_M,
-                                                     V2_CQE_BYTE_4_WQE_INDX_S);
-                       wq->tail += (wqe_ctr - (u16)wq->tail) &
+               wq = &qp->sq;
+
+               /* If sg_signal_bit is set, tail pointer will be updated to
+                * the WQE corresponding to the current CQE.
+                */
+               if (qp->sq_signal_bits)
+                       wq->tail += (wqe_idx - (u16)wq->tail) &
                                    (wq->wqe_cnt - 1);
-               }
 
                wc->wr_id = wq->wrid[wq->tail & (wq->wqe_cnt - 1)];
                ++wq->tail;
-       } else if ((*cur_qp)->ibqp.srq) {
-               srq = to_hr_srq((*cur_qp)->ibqp.srq);
-               wqe_ctr = (u16)roce_get_field(cqe->byte_4,
-                                             V2_CQE_BYTE_4_WQE_INDX_M,
-                                             V2_CQE_BYTE_4_WQE_INDX_S);
-               wc->wr_id = srq->wrid[wqe_ctr];
-               hns_roce_free_srq_wqe(srq, wqe_ctr);
-       } else {
-               /* Update tail pointer, record wr_id */
-               wq = &(*cur_qp)->rq;
-               wc->wr_id = wq->wrid[wq->tail & (wq->wqe_cnt - 1)];
-               ++wq->tail;
-       }
-
-       get_cqe_status(hr_dev, *cur_qp, hr_cq, cqe, wc);
-       if (unlikely(wc->status != IB_WC_SUCCESS))
-               return 0;
 
-       if (is_send) {
-               wc->wc_flags = 0;
-               /* SQ corresponding to CQE */
-               switch (roce_get_field(cqe->byte_4, V2_CQE_BYTE_4_OPCODE_M,
-                                      V2_CQE_BYTE_4_OPCODE_S) & 0x1f) {
-               case HNS_ROCE_V2_WQE_OP_SEND:
-                       wc->opcode = IB_WC_SEND;
-                       break;
-               case HNS_ROCE_V2_WQE_OP_SEND_WITH_INV:
-                       wc->opcode = IB_WC_SEND;
-                       break;
-               case HNS_ROCE_V2_WQE_OP_SEND_WITH_IMM:
-                       wc->opcode = IB_WC_SEND;
-                       wc->wc_flags |= IB_WC_WITH_IMM;
-                       break;
-               case HNS_ROCE_V2_WQE_OP_RDMA_READ:
-                       wc->opcode = IB_WC_RDMA_READ;
-                       wc->byte_len = le32_to_cpu(cqe->byte_cnt);
-                       break;
-               case HNS_ROCE_V2_WQE_OP_RDMA_WRITE:
-                       wc->opcode = IB_WC_RDMA_WRITE;
-                       break;
-               case HNS_ROCE_V2_WQE_OP_RDMA_WRITE_WITH_IMM:
-                       wc->opcode = IB_WC_RDMA_WRITE;
-                       wc->wc_flags |= IB_WC_WITH_IMM;
-                       break;
-               case HNS_ROCE_V2_WQE_OP_LOCAL_INV:
-                       wc->opcode = IB_WC_LOCAL_INV;
-                       wc->wc_flags |= IB_WC_WITH_INVALIDATE;
-                       break;
-               case HNS_ROCE_V2_WQE_OP_ATOM_CMP_AND_SWAP:
-                       wc->opcode = IB_WC_COMP_SWAP;
-                       wc->byte_len  = 8;
-                       break;
-               case HNS_ROCE_V2_WQE_OP_ATOM_FETCH_AND_ADD:
-                       wc->opcode = IB_WC_FETCH_ADD;
-                       wc->byte_len  = 8;
-                       break;
-               case HNS_ROCE_V2_WQE_OP_ATOM_MSK_CMP_AND_SWAP:
-                       wc->opcode = IB_WC_MASKED_COMP_SWAP;
-                       wc->byte_len  = 8;
-                       break;
-               case HNS_ROCE_V2_WQE_OP_ATOM_MSK_FETCH_AND_ADD:
-                       wc->opcode = IB_WC_MASKED_FETCH_ADD;
-                       wc->byte_len  = 8;
-                       break;
-               case HNS_ROCE_V2_WQE_OP_FAST_REG_PMR:
-                       wc->opcode = IB_WC_REG_MR;
-                       break;
-               case HNS_ROCE_V2_WQE_OP_BIND_MW:
-                       wc->opcode = IB_WC_REG_MR;
-                       break;
-               default:
-                       wc->status = IB_WC_GENERAL_ERR;
-                       break;
-               }
+               fill_send_wc(wc, cqe);
        } else {
-               /* RQ correspond to CQE */
-               wc->byte_len = le32_to_cpu(cqe->byte_cnt);
-
-               opcode = roce_get_field(cqe->byte_4, V2_CQE_BYTE_4_OPCODE_M,
-                                       V2_CQE_BYTE_4_OPCODE_S);
-               switch (opcode & 0x1f) {
-               case HNS_ROCE_V2_OPCODE_RDMA_WRITE_IMM:
-                       wc->opcode = IB_WC_RECV_RDMA_WITH_IMM;
-                       wc->wc_flags = IB_WC_WITH_IMM;
-                       wc->ex.imm_data =
-                               cpu_to_be32(le32_to_cpu(cqe->immtdata));
-                       break;
-               case HNS_ROCE_V2_OPCODE_SEND:
-                       wc->opcode = IB_WC_RECV;
-                       wc->wc_flags = 0;
-                       break;
-               case HNS_ROCE_V2_OPCODE_SEND_WITH_IMM:
-                       wc->opcode = IB_WC_RECV;
-                       wc->wc_flags = IB_WC_WITH_IMM;
-                       wc->ex.imm_data =
-                               cpu_to_be32(le32_to_cpu(cqe->immtdata));
-                       break;
-               case HNS_ROCE_V2_OPCODE_SEND_WITH_INV:
-                       wc->opcode = IB_WC_RECV;
-                       wc->wc_flags = IB_WC_WITH_INVALIDATE;
-                       wc->ex.invalidate_rkey = le32_to_cpu(cqe->rkey);
-                       break;
-               default:
-                       wc->status = IB_WC_GENERAL_ERR;
-                       break;
-               }
-
-               if ((wc->qp->qp_type == IB_QPT_RC ||
-                    wc->qp->qp_type == IB_QPT_UC) &&
-                   (opcode == HNS_ROCE_V2_OPCODE_SEND ||
-                   opcode == HNS_ROCE_V2_OPCODE_SEND_WITH_IMM ||
-                   opcode == HNS_ROCE_V2_OPCODE_SEND_WITH_INV) &&
-                   (roce_get_bit(cqe->byte_4, V2_CQE_BYTE_4_RQ_INLINE_S))) {
-                       ret = hns_roce_handle_recv_inl_wqe(cqe, cur_qp, wc);
-                       if (unlikely(ret))
-                               return -EAGAIN;
-               }
-
-               wc->sl = (u8)roce_get_field(cqe->byte_32, V2_CQE_BYTE_32_SL_M,
-                                           V2_CQE_BYTE_32_SL_S);
-               wc->src_qp = (u8)roce_get_field(cqe->byte_32,
-                                               V2_CQE_BYTE_32_RMT_QPN_M,
-                                               V2_CQE_BYTE_32_RMT_QPN_S);
-               wc->slid = 0;
-               wc->wc_flags |= (roce_get_bit(cqe->byte_32,
-                                             V2_CQE_BYTE_32_GRH_S) ?
-                                             IB_WC_GRH : 0);
-               wc->port_num = roce_get_field(cqe->byte_32,
-                               V2_CQE_BYTE_32_PORTN_M, V2_CQE_BYTE_32_PORTN_S);
-               wc->pkey_index = 0;
-
-               if (roce_get_bit(cqe->byte_28, V2_CQE_BYTE_28_VID_VLD_S)) {
-                       wc->vlan_id = (u16)roce_get_field(cqe->byte_28,
-                                                         V2_CQE_BYTE_28_VID_M,
-                                                         V2_CQE_BYTE_28_VID_S);
-                       wc->wc_flags |= IB_WC_WITH_VLAN;
+               if (qp->ibqp.srq) {
+                       srq = to_hr_srq(qp->ibqp.srq);
+                       wc->wr_id = srq->wrid[wqe_idx];
+                       hns_roce_free_srq_wqe(srq, wqe_idx);
                } else {
-                       wc->vlan_id = 0xffff;
+                       wq = &qp->rq;
+                       wc->wr_id = wq->wrid[wq->tail & (wq->wqe_cnt - 1)];
+                       ++wq->tail;
                }
 
-               wc->network_hdr_type = roce_get_field(cqe->byte_28,
-                                                   V2_CQE_BYTE_28_PORT_TYPE_M,
-                                                   V2_CQE_BYTE_28_PORT_TYPE_S);
+               ret = fill_recv_wc(wc, cqe);
        }
 
-       return 0;
+       get_cqe_status(hr_dev, qp, hr_cq, cqe, wc);
+       if (unlikely(wc->status != IB_WC_SUCCESS))
+               return 0;
+
+       return ret;
 }
 
 static int hns_roce_v2_poll_cq(struct ib_cq *ibcq, int num_entries,
@@ -3638,7 +3882,7 @@ static int hns_roce_v2_poll_cq(struct ib_cq *ibcq, int num_entries,
        }
 
        if (npolled)
-               hns_roce_v2_cq_set_ci(hr_cq, hr_cq->cons_index);
+               update_cq_db(hr_dev, hr_cq);
 
 out:
        spin_unlock_irqrestore(&hr_cq->lock, flags);
@@ -3647,12 +3891,9 @@ out:
 }
 
 static int get_op_for_set_hem(struct hns_roce_dev *hr_dev, u32 type,
-                             int step_idx)
+                             int step_idx, u16 *mbox_op)
 {
-       int op;
-
-       if (type == HEM_TYPE_SCCC && step_idx)
-               return -EINVAL;
+       u16 op;
 
        switch (type) {
        case HEM_TYPE_QPC:
@@ -3677,51 +3918,49 @@ static int get_op_for_set_hem(struct hns_roce_dev *hr_dev, u32 type,
                op = HNS_ROCE_CMD_WRITE_CQC_TIMER_BT0;
                break;
        default:
-               dev_warn(hr_dev->dev,
-                        "table %u not to be written by mailbox!\n", type);
+               dev_warn(hr_dev->dev, "failed to check hem type %u.\n", type);
                return -EINVAL;
        }
 
-       return op + step_idx;
+       *mbox_op = op + step_idx;
+
+       return 0;
 }
 
-static int set_hem_to_hw(struct hns_roce_dev *hr_dev, int obj, u64 bt_ba,
-                        u32 hem_type, int step_idx)
+static int config_gmv_ba_to_hw(struct hns_roce_dev *hr_dev, unsigned long obj,
+                              dma_addr_t base_addr)
 {
-       struct hns_roce_cmd_mailbox *mailbox;
        struct hns_roce_cmq_desc desc;
-       struct hns_roce_cfg_gmv_bt *gmv_bt =
-                               (struct hns_roce_cfg_gmv_bt *)desc.data;
-       int ret;
-       int op;
+       struct hns_roce_cmq_req *req = (struct hns_roce_cmq_req *)desc.data;
+       u32 idx = obj / (HNS_HW_PAGE_SIZE / hr_dev->caps.gmv_entry_sz);
+       u64 addr = to_hr_hw_page_addr(base_addr);
 
-       if (hem_type == HEM_TYPE_GMV) {
-               hns_roce_cmq_setup_basic_desc(&desc, HNS_ROCE_OPC_CFG_GMV_BT,
-                                             false);
+       hns_roce_cmq_setup_basic_desc(&desc, HNS_ROCE_OPC_CFG_GMV_BT, false);
 
-               gmv_bt->gmv_ba_l = cpu_to_le32(bt_ba >> HNS_HW_PAGE_SHIFT);
-               gmv_bt->gmv_ba_h = cpu_to_le32(bt_ba >> (HNS_HW_PAGE_SHIFT +
-                                                        32));
-               gmv_bt->gmv_bt_idx = cpu_to_le32(obj /
-                       (HNS_HW_PAGE_SIZE / hr_dev->caps.gmv_entry_sz));
+       hr_reg_write(req, CFG_GMV_BT_BA_L, lower_32_bits(addr));
+       hr_reg_write(req, CFG_GMV_BT_BA_H, upper_32_bits(addr));
+       hr_reg_write(req, CFG_GMV_BT_IDX, idx);
 
-               return hns_roce_cmq_send(hr_dev, &desc, 1);
-       }
+       return hns_roce_cmq_send(hr_dev, &desc, 1);
+}
 
-       op = get_op_for_set_hem(hr_dev, hem_type, step_idx);
-       if (op < 0)
-               return 0;
+static int set_hem_to_hw(struct hns_roce_dev *hr_dev, int obj,
+                        dma_addr_t base_addr, u32 hem_type, int step_idx)
+{
+       int ret;
+       u16 op;
 
-       mailbox = hns_roce_alloc_cmd_mailbox(hr_dev);
-       if (IS_ERR(mailbox))
-               return PTR_ERR(mailbox);
+       if (unlikely(hem_type == HEM_TYPE_GMV))
+               return config_gmv_ba_to_hw(hr_dev, obj, base_addr);
 
-       ret = hns_roce_cmd_mbox(hr_dev, bt_ba, mailbox->dma, obj,
-                               0, op, HNS_ROCE_CMD_TIMEOUT_MSECS);
+       if (unlikely(hem_type == HEM_TYPE_SCCC && step_idx))
+               return 0;
 
-       hns_roce_free_cmd_mailbox(hr_dev, mailbox);
+       ret = get_op_for_set_hem(hr_dev, hem_type, step_idx, &op);
+       if (ret < 0)
+               return ret;
 
-       return ret;
+       return config_hem_ba_to_hw(hr_dev, obj, base_addr, op);
 }
 
 static int hns_roce_v2_set_hem(struct hns_roce_dev *hr_dev,
@@ -3911,6 +4150,16 @@ static void set_qpc_wqe_cnt(struct hns_roce_qp *hr_qp,
                       ilog2(hr_qp->rq.wqe_cnt));
 }
 
+static inline int get_cqn(struct ib_cq *ib_cq)
+{
+       return ib_cq ? to_hr_cq(ib_cq)->cqn : 0;
+}
+
+static inline int get_pdn(struct ib_pd *ib_pd)
+{
+       return ib_pd ? to_hr_pd(ib_pd)->pdn : 0;
+}
+
 static void modify_qp_reset_to_init(struct ib_qp *ibqp,
                                    const struct ib_qp_attr *attr,
                                    int attr_mask,
@@ -3927,13 +4176,13 @@ static void modify_qp_reset_to_init(struct ib_qp *ibqp,
         * 0 at the same time, else set them to 0x1.
         */
        roce_set_field(context->byte_4_sqpn_tst, V2_QPC_BYTE_4_TST_M,
-                      V2_QPC_BYTE_4_TST_S, to_hr_qp_type(hr_qp->ibqp.qp_type));
+                      V2_QPC_BYTE_4_TST_S, to_hr_qp_type(ibqp->qp_type));
 
        roce_set_field(context->byte_4_sqpn_tst, V2_QPC_BYTE_4_SQPN_M,
                       V2_QPC_BYTE_4_SQPN_S, hr_qp->qpn);
 
        roce_set_field(context->byte_16_buf_ba_pg_sz, V2_QPC_BYTE_16_PD_M,
-                      V2_QPC_BYTE_16_PD_S, to_hr_pd(ibqp->pd)->pdn);
+                      V2_QPC_BYTE_16_PD_S, get_pdn(ibqp->pd));
 
        roce_set_field(context->byte_20_smac_sgid_idx, V2_QPC_BYTE_20_RQWS_M,
                       V2_QPC_BYTE_20_RQWS_S, ilog2(hr_qp->rq.max_gs));
@@ -3944,6 +4193,13 @@ static void modify_qp_reset_to_init(struct ib_qp *ibqp,
        roce_set_field(context->byte_24_mtu_tc, V2_QPC_BYTE_24_VLAN_ID_M,
                       V2_QPC_BYTE_24_VLAN_ID_S, 0xfff);
 
+       if (ibqp->qp_type == IB_QPT_XRC_TGT) {
+               context->qkey_xrcd = cpu_to_le32(hr_qp->xrcdn);
+
+               roce_set_bit(context->byte_80_rnr_rx_cqn,
+                            V2_QPC_BYTE_80_XRC_QP_TYPE_S, 1);
+       }
+
        if (hr_qp->en_flags & HNS_ROCE_QP_CAP_RQ_RECORD_DB)
                roce_set_bit(context->byte_68_rq_db,
                             V2_QPC_BYTE_68_RQ_RECORD_EN_S, 1);
@@ -3954,23 +4210,27 @@ static void modify_qp_reset_to_init(struct ib_qp *ibqp,
                       ((u32)hr_qp->rdb.dma) >> 1);
        context->rq_db_record_addr = cpu_to_le32(hr_qp->rdb.dma >> 32);
 
-       roce_set_bit(context->byte_76_srqn_op_en, V2_QPC_BYTE_76_RQIE_S,
-                   (hr_dev->caps.flags & HNS_ROCE_CAP_FLAG_RQ_INLINE) ? 1 : 0);
+       if (ibqp->qp_type != IB_QPT_UD && ibqp->qp_type != IB_QPT_GSI)
+               roce_set_bit(context->byte_76_srqn_op_en,
+                            V2_QPC_BYTE_76_RQIE_S,
+                            !!(hr_dev->caps.flags &
+                               HNS_ROCE_CAP_FLAG_RQ_INLINE));
 
        roce_set_field(context->byte_80_rnr_rx_cqn, V2_QPC_BYTE_80_RX_CQN_M,
-                      V2_QPC_BYTE_80_RX_CQN_S, to_hr_cq(ibqp->recv_cq)->cqn);
+                      V2_QPC_BYTE_80_RX_CQN_S, get_cqn(ibqp->recv_cq));
+
        if (ibqp->srq) {
+               roce_set_bit(context->byte_76_srqn_op_en,
+                            V2_QPC_BYTE_76_SRQ_EN_S, 1);
                roce_set_field(context->byte_76_srqn_op_en,
                               V2_QPC_BYTE_76_SRQN_M, V2_QPC_BYTE_76_SRQN_S,
                               to_hr_srq(ibqp->srq)->srqn);
-               roce_set_bit(context->byte_76_srqn_op_en,
-                            V2_QPC_BYTE_76_SRQ_EN_S, 1);
        }
 
        roce_set_bit(context->byte_172_sq_psn, V2_QPC_BYTE_172_FRE_S, 1);
 
        roce_set_field(context->byte_252_err_txcqn, V2_QPC_BYTE_252_TX_CQN_M,
-                      V2_QPC_BYTE_252_TX_CQN_S, to_hr_cq(ibqp->send_cq)->cqn);
+                      V2_QPC_BYTE_252_TX_CQN_S, get_cqn(ibqp->send_cq));
 
        if (hr_dev->caps.qpc_sz < HNS_ROCE_V3_QPC_SZ)
                return;
@@ -3993,22 +4253,23 @@ static void modify_qp_init_to_init(struct ib_qp *ibqp,
         * 0 at the same time, else set them to 0x1.
         */
        roce_set_field(context->byte_4_sqpn_tst, V2_QPC_BYTE_4_TST_M,
-                      V2_QPC_BYTE_4_TST_S, to_hr_qp_type(hr_qp->ibqp.qp_type));
+                      V2_QPC_BYTE_4_TST_S, to_hr_qp_type(ibqp->qp_type));
        roce_set_field(qpc_mask->byte_4_sqpn_tst, V2_QPC_BYTE_4_TST_M,
                       V2_QPC_BYTE_4_TST_S, 0);
 
        roce_set_field(context->byte_16_buf_ba_pg_sz, V2_QPC_BYTE_16_PD_M,
-                      V2_QPC_BYTE_16_PD_S, to_hr_pd(ibqp->pd)->pdn);
+                      V2_QPC_BYTE_16_PD_S, get_pdn(ibqp->pd));
+
        roce_set_field(qpc_mask->byte_16_buf_ba_pg_sz, V2_QPC_BYTE_16_PD_M,
                       V2_QPC_BYTE_16_PD_S, 0);
 
        roce_set_field(context->byte_80_rnr_rx_cqn, V2_QPC_BYTE_80_RX_CQN_M,
-                      V2_QPC_BYTE_80_RX_CQN_S, to_hr_cq(ibqp->recv_cq)->cqn);
+                      V2_QPC_BYTE_80_RX_CQN_S, get_cqn(ibqp->recv_cq));
        roce_set_field(qpc_mask->byte_80_rnr_rx_cqn, V2_QPC_BYTE_80_RX_CQN_M,
                       V2_QPC_BYTE_80_RX_CQN_S, 0);
 
        roce_set_field(context->byte_252_err_txcqn, V2_QPC_BYTE_252_TX_CQN_M,
-                      V2_QPC_BYTE_252_TX_CQN_S, to_hr_cq(ibqp->send_cq)->cqn);
+                      V2_QPC_BYTE_252_TX_CQN_S, get_cqn(ibqp->send_cq));
        roce_set_field(qpc_mask->byte_252_err_txcqn, V2_QPC_BYTE_252_TX_CQN_M,
                       V2_QPC_BYTE_252_TX_CQN_S, 0);
 
@@ -4133,17 +4394,6 @@ static int config_qp_rq_buf(struct hns_roce_dev *hr_dev,
                       V2_QPC_BYTE_104_RQ_NXT_BLK_ADDR_M,
                       V2_QPC_BYTE_104_RQ_NXT_BLK_ADDR_S, 0);
 
-       roce_set_field(context->byte_84_rq_ci_pi,
-                      V2_QPC_BYTE_84_RQ_PRODUCER_IDX_M,
-                      V2_QPC_BYTE_84_RQ_PRODUCER_IDX_S, hr_qp->rq.head);
-       roce_set_field(qpc_mask->byte_84_rq_ci_pi,
-                      V2_QPC_BYTE_84_RQ_PRODUCER_IDX_M,
-                      V2_QPC_BYTE_84_RQ_PRODUCER_IDX_S, 0);
-
-       roce_set_field(qpc_mask->byte_84_rq_ci_pi,
-                      V2_QPC_BYTE_84_RQ_CONSUMER_IDX_M,
-                      V2_QPC_BYTE_84_RQ_CONSUMER_IDX_S, 0);
-
        return 0;
 }
 
@@ -4240,7 +4490,7 @@ static int modify_qp_init_to_rtr(struct ib_qp *ibqp,
        u64 *mtts;
        u8 *dmac;
        u8 *smac;
-       int port;
+       u32 port;
        int ret;
 
        ret = config_qp_rq_buf(hr_dev, hr_qp, context, qpc_mask);
@@ -4454,6 +4704,143 @@ static inline u16 get_udp_sport(u32 fl, u32 lqpn, u32 rqpn)
        return rdma_flow_label_to_udp_sport(fl);
 }
 
+static int get_dip_ctx_idx(struct ib_qp *ibqp, const struct ib_qp_attr *attr,
+                          u32 *dip_idx)
+{
+       const struct ib_global_route *grh = rdma_ah_read_grh(&attr->ah_attr);
+       struct hns_roce_dev *hr_dev = to_hr_dev(ibqp->device);
+       struct hns_roce_dip *hr_dip;
+       unsigned long flags;
+       int ret = 0;
+
+       spin_lock_irqsave(&hr_dev->dip_list_lock, flags);
+
+       list_for_each_entry(hr_dip, &hr_dev->dip_list, node) {
+               if (!memcmp(grh->dgid.raw, hr_dip->dgid, 16))
+                       goto out;
+       }
+
+       /* If no dgid is found, a new dip and a mapping between dgid and
+        * dip_idx will be created.
+        */
+       hr_dip = kzalloc(sizeof(*hr_dip), GFP_ATOMIC);
+       if (!hr_dip) {
+               ret = -ENOMEM;
+               goto out;
+       }
+
+       memcpy(hr_dip->dgid, grh->dgid.raw, sizeof(grh->dgid.raw));
+       hr_dip->dip_idx = *dip_idx = ibqp->qp_num;
+       list_add_tail(&hr_dip->node, &hr_dev->dip_list);
+
+out:
+       spin_unlock_irqrestore(&hr_dev->dip_list_lock, flags);
+       return ret;
+}
+
+enum {
+       CONG_DCQCN,
+       CONG_WINDOW,
+};
+
+enum {
+       UNSUPPORT_CONG_LEVEL,
+       SUPPORT_CONG_LEVEL,
+};
+
+enum {
+       CONG_LDCP,
+       CONG_HC3,
+};
+
+enum {
+       DIP_INVALID,
+       DIP_VALID,
+};
+
+static int check_cong_type(struct ib_qp *ibqp,
+                          struct hns_roce_congestion_algorithm *cong_alg)
+{
+       struct hns_roce_dev *hr_dev = to_hr_dev(ibqp->device);
+
+       /* different congestion types match different configurations */
+       switch (hr_dev->caps.cong_type) {
+       case CONG_TYPE_DCQCN:
+               cong_alg->alg_sel = CONG_DCQCN;
+               cong_alg->alg_sub_sel = UNSUPPORT_CONG_LEVEL;
+               cong_alg->dip_vld = DIP_INVALID;
+               break;
+       case CONG_TYPE_LDCP:
+               cong_alg->alg_sel = CONG_WINDOW;
+               cong_alg->alg_sub_sel = CONG_LDCP;
+               cong_alg->dip_vld = DIP_INVALID;
+               break;
+       case CONG_TYPE_HC3:
+               cong_alg->alg_sel = CONG_WINDOW;
+               cong_alg->alg_sub_sel = CONG_HC3;
+               cong_alg->dip_vld = DIP_INVALID;
+               break;
+       case CONG_TYPE_DIP:
+               cong_alg->alg_sel = CONG_DCQCN;
+               cong_alg->alg_sub_sel = UNSUPPORT_CONG_LEVEL;
+               cong_alg->dip_vld = DIP_VALID;
+               break;
+       default:
+               ibdev_err(&hr_dev->ib_dev,
+                         "error type(%u) for congestion selection.\n",
+                         hr_dev->caps.cong_type);
+               return -EINVAL;
+       }
+
+       return 0;
+}
+
+static int fill_cong_field(struct ib_qp *ibqp, const struct ib_qp_attr *attr,
+                          struct hns_roce_v2_qp_context *context,
+                          struct hns_roce_v2_qp_context *qpc_mask)
+{
+       const struct ib_global_route *grh = rdma_ah_read_grh(&attr->ah_attr);
+       struct hns_roce_congestion_algorithm cong_field;
+       struct ib_device *ibdev = ibqp->device;
+       struct hns_roce_dev *hr_dev = to_hr_dev(ibdev);
+       u32 dip_idx = 0;
+       int ret;
+
+       if (hr_dev->pci_dev->revision == PCI_REVISION_ID_HIP08 ||
+           grh->sgid_attr->gid_type == IB_GID_TYPE_ROCE)
+               return 0;
+
+       ret = check_cong_type(ibqp, &cong_field);
+       if (ret)
+               return ret;
+
+       hr_reg_write(context, QPC_CONG_ALGO_TMPL_ID, hr_dev->cong_algo_tmpl_id +
+                    hr_dev->caps.cong_type * HNS_ROCE_CONG_SIZE);
+       hr_reg_write(qpc_mask, QPC_CONG_ALGO_TMPL_ID, 0);
+       hr_reg_write(&context->ext, QPCEX_CONG_ALG_SEL, cong_field.alg_sel);
+       hr_reg_write(&qpc_mask->ext, QPCEX_CONG_ALG_SEL, 0);
+       hr_reg_write(&context->ext, QPCEX_CONG_ALG_SUB_SEL,
+                    cong_field.alg_sub_sel);
+       hr_reg_write(&qpc_mask->ext, QPCEX_CONG_ALG_SUB_SEL, 0);
+       hr_reg_write(&context->ext, QPCEX_DIP_CTX_IDX_VLD, cong_field.dip_vld);
+       hr_reg_write(&qpc_mask->ext, QPCEX_DIP_CTX_IDX_VLD, 0);
+
+       /* if dip is disabled, there is no need to set dip idx */
+       if (cong_field.dip_vld == 0)
+               return 0;
+
+       ret = get_dip_ctx_idx(ibqp, attr, &dip_idx);
+       if (ret) {
+               ibdev_err(ibdev, "failed to fill cong field, ret = %d.\n", ret);
+               return ret;
+       }
+
+       hr_reg_write(&context->ext, QPCEX_DIP_CTX_IDX, dip_idx);
+       hr_reg_write(&qpc_mask->ext, QPCEX_DIP_CTX_IDX, 0);
+
+       return 0;
+}
+
 static int hns_roce_v2_set_path(struct ib_qp *ibqp,
                                const struct ib_qp_attr *attr,
                                int attr_mask,
@@ -4537,6 +4924,10 @@ static int hns_roce_v2_set_path(struct ib_qp *ibqp,
        roce_set_field(qpc_mask->byte_24_mtu_tc, V2_QPC_BYTE_24_HOP_LIMIT_M,
                       V2_QPC_BYTE_24_HOP_LIMIT_S, 0);
 
+       ret = fill_cong_field(ibqp, attr, context, qpc_mask);
+       if (ret)
+               return ret;
+
        roce_set_field(context->byte_24_mtu_tc, V2_QPC_BYTE_24_TC_M,
                       V2_QPC_BYTE_24_TC_S, get_tclass(&attr->ah_attr.grh));
        roce_set_field(qpc_mask->byte_24_mtu_tc, V2_QPC_BYTE_24_TC_M,
@@ -4687,7 +5078,6 @@ static int hns_roce_v2_set_opt_fields(struct ib_qp *ibqp,
                               V2_QPC_BYTE_244_RNR_CNT_S, 0);
        }
 
-       /* RC&UC&UD required attr */
        if (attr_mask & IB_QP_SQ_PSN) {
                roce_set_field(context->byte_172_sq_psn,
                               V2_QPC_BYTE_172_SQ_CUR_PSN_M,
@@ -4765,7 +5155,6 @@ static int hns_roce_v2_set_opt_fields(struct ib_qp *ibqp,
                               V2_QPC_BYTE_80_MIN_RNR_TIME_S, 0);
        }
 
-       /* RC&UC required attr */
        if (attr_mask & IB_QP_RQ_PSN) {
                roce_set_field(context->byte_108_rx_reqepsn,
                               V2_QPC_BYTE_108_RX_REQ_EPSN_M,
@@ -4808,6 +5197,29 @@ static void hns_roce_v2_record_opt_fields(struct ib_qp *ibqp,
        }
 }
 
+static void clear_qp(struct hns_roce_qp *hr_qp)
+{
+       struct ib_qp *ibqp = &hr_qp->ibqp;
+
+       if (ibqp->send_cq)
+               hns_roce_v2_cq_clean(to_hr_cq(ibqp->send_cq),
+                                    hr_qp->qpn, NULL);
+
+       if (ibqp->recv_cq  && ibqp->recv_cq != ibqp->send_cq)
+               hns_roce_v2_cq_clean(to_hr_cq(ibqp->recv_cq),
+                                    hr_qp->qpn, ibqp->srq ?
+                                    to_hr_srq(ibqp->srq) : NULL);
+
+       if (hr_qp->en_flags & HNS_ROCE_QP_CAP_RQ_RECORD_DB)
+               *hr_qp->rdb.db_record = 0;
+
+       hr_qp->rq.head = 0;
+       hr_qp->rq.tail = 0;
+       hr_qp->sq.head = 0;
+       hr_qp->sq.tail = 0;
+       hr_qp->next_sge = 0;
+}
+
 static int hns_roce_v2_modify_qp(struct ib_qp *ibqp,
                                 const struct ib_qp_attr *attr,
                                 int attr_mask, enum ib_qp_state cur_state,
@@ -4842,19 +5254,23 @@ static int hns_roce_v2_modify_qp(struct ib_qp *ibqp,
 
        /* When QP state is err, SQ and RQ WQE should be flushed */
        if (new_state == IB_QPS_ERR) {
-               spin_lock_irqsave(&hr_qp->sq.lock, sq_flag);
-               hr_qp->state = IB_QPS_ERR;
-               roce_set_field(context->byte_160_sq_ci_pi,
-                              V2_QPC_BYTE_160_SQ_PRODUCER_IDX_M,
-                              V2_QPC_BYTE_160_SQ_PRODUCER_IDX_S,
-                              hr_qp->sq.head);
-               roce_set_field(qpc_mask->byte_160_sq_ci_pi,
-                              V2_QPC_BYTE_160_SQ_PRODUCER_IDX_M,
-                              V2_QPC_BYTE_160_SQ_PRODUCER_IDX_S, 0);
-               spin_unlock_irqrestore(&hr_qp->sq.lock, sq_flag);
-
-               if (!ibqp->srq) {
+               if (ibqp->qp_type != IB_QPT_XRC_TGT) {
+                       spin_lock_irqsave(&hr_qp->sq.lock, sq_flag);
+                       hr_qp->state = IB_QPS_ERR;
+                       roce_set_field(context->byte_160_sq_ci_pi,
+                                      V2_QPC_BYTE_160_SQ_PRODUCER_IDX_M,
+                                      V2_QPC_BYTE_160_SQ_PRODUCER_IDX_S,
+                                      hr_qp->sq.head);
+                       roce_set_field(qpc_mask->byte_160_sq_ci_pi,
+                                      V2_QPC_BYTE_160_SQ_PRODUCER_IDX_M,
+                                      V2_QPC_BYTE_160_SQ_PRODUCER_IDX_S, 0);
+                       spin_unlock_irqrestore(&hr_qp->sq.lock, sq_flag);
+               }
+
+               if (!ibqp->srq && ibqp->qp_type != IB_QPT_XRC_INI &&
+                   ibqp->qp_type != IB_QPT_XRC_TGT) {
                        spin_lock_irqsave(&hr_qp->rq.lock, rq_flag);
+                       hr_qp->state = IB_QPS_ERR;
                        roce_set_field(context->byte_84_rq_ci_pi,
                               V2_QPC_BYTE_84_RQ_PRODUCER_IDX_M,
                               V2_QPC_BYTE_84_RQ_PRODUCER_IDX_S,
@@ -4873,7 +5289,8 @@ static int hns_roce_v2_modify_qp(struct ib_qp *ibqp,
                goto out;
 
        roce_set_bit(context->byte_108_rx_reqepsn, V2_QPC_BYTE_108_INV_CREDIT_S,
-                    ibqp->srq ? 1 : 0);
+                    ((to_hr_qp_type(hr_qp->ibqp.qp_type) == SERV_TYPE_XRC) ||
+                    ibqp->srq) ? 1 : 0);
        roce_set_bit(qpc_mask->byte_108_rx_reqepsn,
                     V2_QPC_BYTE_108_INV_CREDIT_S, 0);
 
@@ -4894,21 +5311,8 @@ static int hns_roce_v2_modify_qp(struct ib_qp *ibqp,
 
        hns_roce_v2_record_opt_fields(ibqp, attr, attr_mask);
 
-       if (new_state == IB_QPS_RESET && !ibqp->uobject) {
-               hns_roce_v2_cq_clean(to_hr_cq(ibqp->recv_cq), hr_qp->qpn,
-                                    ibqp->srq ? to_hr_srq(ibqp->srq) : NULL);
-               if (ibqp->send_cq != ibqp->recv_cq)
-                       hns_roce_v2_cq_clean(to_hr_cq(ibqp->send_cq),
-                                            hr_qp->qpn, NULL);
-
-               hr_qp->rq.head = 0;
-               hr_qp->rq.tail = 0;
-               hr_qp->sq.head = 0;
-               hr_qp->sq.tail = 0;
-               hr_qp->next_sge = 0;
-               if (hr_qp->rq.wqe_cnt)
-                       *hr_qp->rdb.db_record = 0;
-       }
+       if (new_state == IB_QPS_RESET && !ibqp->uobject)
+               clear_qp(hr_qp);
 
 out:
        return ret;
@@ -5019,7 +5423,8 @@ static int hns_roce_v2_query_qp(struct ib_qp *ibqp, struct ib_qp_attr *qp_attr,
                                    V2_QPC_BYTE_76_ATE_S)) << V2_QP_ATE_S);
 
        if (hr_qp->ibqp.qp_type == IB_QPT_RC ||
-           hr_qp->ibqp.qp_type == IB_QPT_UC) {
+           hr_qp->ibqp.qp_type == IB_QPT_XRC_INI ||
+           hr_qp->ibqp.qp_type == IB_QPT_XRC_TGT) {
                struct ib_global_route *grh =
                                rdma_ah_retrieve_grh(&qp_attr->ah_attr);
 
@@ -5051,6 +5456,7 @@ static int hns_roce_v2_query_qp(struct ib_qp *ibqp, struct ib_qp_attr *qp_attr,
        qp_attr->max_dest_rd_atomic = 1 << roce_get_field(context.byte_140_raq,
                                                     V2_QPC_BYTE_140_RR_MAX_M,
                                                     V2_QPC_BYTE_140_RR_MAX_S);
+
        qp_attr->min_rnr_timer = (u8)roce_get_field(context.byte_80_rnr_rx_cqn,
                                                 V2_QPC_BYTE_80_MIN_RNR_TIME_M,
                                                 V2_QPC_BYTE_80_MIN_RNR_TIME_S);
@@ -5068,6 +5474,7 @@ done:
        qp_attr->cur_qp_state = qp_attr->qp_state;
        qp_attr->cap.max_recv_wr = hr_qp->rq.wqe_cnt;
        qp_attr->cap.max_recv_sge = hr_qp->rq.max_gs - hr_qp->rq.rsv_sge;
+       qp_attr->cap.max_inline_data = hr_qp->max_inline_data;
 
        if (!ibqp->uobject) {
                qp_attr->cap.max_send_wr = hr_qp->sq.wqe_cnt;
@@ -5085,6 +5492,15 @@ out:
        return ret;
 }
 
+static inline int modify_qp_is_ok(struct hns_roce_qp *hr_qp)
+{
+       return ((hr_qp->ibqp.qp_type == IB_QPT_RC ||
+                hr_qp->ibqp.qp_type == IB_QPT_UD ||
+                hr_qp->ibqp.qp_type == IB_QPT_XRC_INI ||
+                hr_qp->ibqp.qp_type == IB_QPT_XRC_TGT) &&
+               hr_qp->state != IB_QPS_RESET);
+}
+
 static int hns_roce_v2_destroy_qp_common(struct hns_roce_dev *hr_dev,
                                         struct hns_roce_qp *hr_qp,
                                         struct ib_udata *udata)
@@ -5094,9 +5510,7 @@ static int hns_roce_v2_destroy_qp_common(struct hns_roce_dev *hr_dev,
        unsigned long flags;
        int ret = 0;
 
-       if ((hr_qp->ibqp.qp_type == IB_QPT_RC ||
-            hr_qp->ibqp.qp_type == IB_QPT_UD) &&
-          hr_qp->state != IB_QPS_RESET) {
+       if (modify_qp_is_ok(hr_qp)) {
                /* Modify qp to reset before destroying qp */
                ret = hns_roce_v2_modify_qp(&hr_qp->ibqp, NULL, 0,
                                            hr_qp->state, IB_QPS_RESET);
@@ -5275,9 +5689,11 @@ static int hns_roce_v2_write_srqc(struct hns_roce_srq *srq, void *mb_buf)
        }
 
        hr_reg_write(ctx, SRQC_SRQ_ST, 1);
+       hr_reg_write(ctx, SRQC_SRQ_TYPE,
+                    !!(srq->ibsrq.srq_type == IB_SRQT_XRC));
        hr_reg_write(ctx, SRQC_PD, to_hr_pd(srq->ibsrq.pd)->pdn);
        hr_reg_write(ctx, SRQC_SRQN, srq->srqn);
-       hr_reg_write(ctx, SRQC_XRCD, 0);
+       hr_reg_write(ctx, SRQC_XRCD, srq->xrcdn);
        hr_reg_write(ctx, SRQC_XRC_CQN, srq->cqn);
        hr_reg_write(ctx, SRQC_SHIFT, ilog2(srq->wqe_cnt));
        hr_reg_write(ctx, SRQC_RQWS,
@@ -5481,6 +5897,12 @@ static void hns_roce_irq_work_handle(struct work_struct *work)
        case HNS_ROCE_EVENT_TYPE_FLR:
                ibdev_warn(ibdev, "Function level reset.\n");
                break;
+       case HNS_ROCE_EVENT_TYPE_XRCD_VIOLATION:
+               ibdev_err(ibdev, "xrc domain violation error.\n");
+               break;
+       case HNS_ROCE_EVENT_TYPE_INVALID_XRCETH:
+               ibdev_err(ibdev, "invalid xrceth error.\n");
+               break;
        default:
                break;
        }
@@ -5505,33 +5927,30 @@ static void hns_roce_v2_init_irq_work(struct hns_roce_dev *hr_dev,
        queue_work(hr_dev->irq_workq, &(irq_work->work));
 }
 
-static void set_eq_cons_index_v2(struct hns_roce_eq *eq)
+static void update_eq_db(struct hns_roce_eq *eq)
 {
        struct hns_roce_dev *hr_dev = eq->hr_dev;
-       __le32 doorbell[2] = {};
+       struct hns_roce_v2_db eq_db = {};
 
        if (eq->type_flag == HNS_ROCE_AEQ) {
-               roce_set_field(doorbell[0], HNS_ROCE_V2_EQ_DB_CMD_M,
-                              HNS_ROCE_V2_EQ_DB_CMD_S,
+               roce_set_field(eq_db.byte_4, V2_EQ_DB_CMD_M, V2_EQ_DB_CMD_S,
                               eq->arm_st == HNS_ROCE_V2_EQ_ALWAYS_ARMED ?
                               HNS_ROCE_EQ_DB_CMD_AEQ :
                               HNS_ROCE_EQ_DB_CMD_AEQ_ARMED);
        } else {
-               roce_set_field(doorbell[0], HNS_ROCE_V2_EQ_DB_TAG_M,
-                              HNS_ROCE_V2_EQ_DB_TAG_S, eq->eqn);
+               roce_set_field(eq_db.byte_4, V2_EQ_DB_TAG_M, V2_EQ_DB_TAG_S,
+                              eq->eqn);
 
-               roce_set_field(doorbell[0], HNS_ROCE_V2_EQ_DB_CMD_M,
-                              HNS_ROCE_V2_EQ_DB_CMD_S,
+               roce_set_field(eq_db.byte_4, V2_EQ_DB_CMD_M, V2_EQ_DB_CMD_S,
                               eq->arm_st == HNS_ROCE_V2_EQ_ALWAYS_ARMED ?
                               HNS_ROCE_EQ_DB_CMD_CEQ :
                               HNS_ROCE_EQ_DB_CMD_CEQ_ARMED);
        }
 
-       roce_set_field(doorbell[1], HNS_ROCE_V2_EQ_DB_PARA_M,
-                      HNS_ROCE_V2_EQ_DB_PARA_S,
-                      (eq->cons_index & HNS_ROCE_V2_CONS_IDX_M));
+       roce_set_field(eq_db.parameter, V2_EQ_DB_CONS_IDX_M,
+                      V2_EQ_DB_CONS_IDX_S, eq->cons_index);
 
-       hns_roce_write64(hr_dev, doorbell, eq->doorbell);
+       hns_roce_write64(hr_dev, (__le32 *)&eq_db, eq->db_reg);
 }
 
 static struct hns_roce_aeqe *next_aeqe_sw_v2(struct hns_roce_eq *eq)
@@ -5581,6 +6000,8 @@ static int hns_roce_v2_aeq_int(struct hns_roce_dev *hr_dev,
                case HNS_ROCE_EVENT_TYPE_SRQ_LAST_WQE_REACH:
                case HNS_ROCE_EVENT_TYPE_INV_REQ_LOCAL_WQ_ERROR:
                case HNS_ROCE_EVENT_TYPE_LOCAL_WQ_ACCESS_ERROR:
+               case HNS_ROCE_EVENT_TYPE_XRCD_VIOLATION:
+               case HNS_ROCE_EVENT_TYPE_INVALID_XRCETH:
                        hns_roce_qp_event(hr_dev, queue_num, event_type);
                        break;
                case HNS_ROCE_EVENT_TYPE_SRQ_LIMIT_REACH:
@@ -5616,7 +6037,7 @@ static int hns_roce_v2_aeq_int(struct hns_roce_dev *hr_dev,
                aeqe = next_aeqe_sw_v2(eq);
        }
 
-       set_eq_cons_index_v2(eq);
+       update_eq_db(eq);
        return aeqe_found;
 }
 
@@ -5656,7 +6077,7 @@ static int hns_roce_v2_ceq_int(struct hns_roce_dev *hr_dev,
                ceqe = next_ceqe_sw_v2(eq);
        }
 
-       set_eq_cons_index_v2(eq);
+       update_eq_db(eq);
 
        return ceqe_found;
 }
@@ -5710,58 +6131,34 @@ static irqreturn_t hns_roce_v2_msix_interrupt_abn(int irq, void *dev_id)
                roce_write(hr_dev, ROCEE_VF_ABN_INT_EN_REG, int_en);
 
                int_work = 1;
-       } else if (int_st & BIT(HNS_ROCE_V2_VF_INT_ST_BUS_ERR_S)) {
-               dev_err(dev, "BUS ERR!\n");
-
-               int_st |= 1 << HNS_ROCE_V2_VF_INT_ST_BUS_ERR_S;
-               roce_write(hr_dev, ROCEE_VF_ABN_INT_ST_REG, int_st);
-
-               int_en |= 1 << HNS_ROCE_V2_VF_ABN_INT_EN_S;
-               roce_write(hr_dev, ROCEE_VF_ABN_INT_EN_REG, int_en);
-
-               int_work = 1;
-       } else if (int_st & BIT(HNS_ROCE_V2_VF_INT_ST_OTHER_ERR_S)) {
-               dev_err(dev, "OTHER ERR!\n");
+       } else if (int_st & BIT(HNS_ROCE_V2_VF_INT_ST_RAS_INT_S)) {
+               dev_err(dev, "RAS interrupt!\n");
 
-               int_st |= 1 << HNS_ROCE_V2_VF_INT_ST_OTHER_ERR_S;
+               int_st |= 1 << HNS_ROCE_V2_VF_INT_ST_RAS_INT_S;
                roce_write(hr_dev, ROCEE_VF_ABN_INT_ST_REG, int_st);
 
                int_en |= 1 << HNS_ROCE_V2_VF_ABN_INT_EN_S;
                roce_write(hr_dev, ROCEE_VF_ABN_INT_EN_REG, int_en);
 
                int_work = 1;
-       } else
+       } else {
                dev_err(dev, "There is no abnormal irq found!\n");
+       }
 
        return IRQ_RETVAL(int_work);
 }
 
 static void hns_roce_v2_int_mask_enable(struct hns_roce_dev *hr_dev,
-                                       int eq_num, int enable_flag)
+                                       int eq_num, u32 enable_flag)
 {
        int i;
 
-       if (enable_flag == EQ_ENABLE) {
-               for (i = 0; i < eq_num; i++)
-                       roce_write(hr_dev, ROCEE_VF_EVENT_INT_EN_REG +
-                                  i * EQ_REG_OFFSET,
-                                  HNS_ROCE_V2_VF_EVENT_INT_EN_M);
-
-               roce_write(hr_dev, ROCEE_VF_ABN_INT_EN_REG,
-                          HNS_ROCE_V2_VF_ABN_INT_EN_M);
-               roce_write(hr_dev, ROCEE_VF_ABN_INT_CFG_REG,
-                          HNS_ROCE_V2_VF_ABN_INT_CFG_M);
-       } else {
-               for (i = 0; i < eq_num; i++)
-                       roce_write(hr_dev, ROCEE_VF_EVENT_INT_EN_REG +
-                                  i * EQ_REG_OFFSET,
-                                  HNS_ROCE_V2_VF_EVENT_INT_EN_M & 0x0);
+       for (i = 0; i < eq_num; i++)
+               roce_write(hr_dev, ROCEE_VF_EVENT_INT_EN_REG +
+                          i * EQ_REG_OFFSET, enable_flag);
 
-               roce_write(hr_dev, ROCEE_VF_ABN_INT_EN_REG,
-                          HNS_ROCE_V2_VF_ABN_INT_EN_M & 0x0);
-               roce_write(hr_dev, ROCEE_VF_ABN_INT_CFG_REG,
-                          HNS_ROCE_V2_VF_ABN_INT_CFG_M & 0x0);
-       }
+       roce_write(hr_dev, ROCEE_VF_ABN_INT_EN_REG, enable_flag);
+       roce_write(hr_dev, ROCEE_VF_ABN_INT_CFG_REG, enable_flag);
 }
 
 static void hns_roce_v2_destroy_eqc(struct hns_roce_dev *hr_dev, int eqn)
@@ -5786,6 +6183,16 @@ static void free_eq_buf(struct hns_roce_dev *hr_dev, struct hns_roce_eq *eq)
        hns_roce_mtr_destroy(hr_dev, &eq->mtr);
 }
 
+static void init_eq_config(struct hns_roce_dev *hr_dev, struct hns_roce_eq *eq)
+{
+       eq->db_reg = hr_dev->reg_base + ROCEE_VF_EQ_DB_CFG0_REG;
+       eq->cons_index = 0;
+       eq->over_ignore = HNS_ROCE_V2_EQ_OVER_IGNORE_0;
+       eq->coalesce = HNS_ROCE_V2_EQ_COALESCE_0;
+       eq->arm_st = HNS_ROCE_V2_EQ_ALWAYS_ARMED;
+       eq->shift = ilog2((unsigned int)eq->entries);
+}
+
 static int config_eqc(struct hns_roce_dev *hr_dev, struct hns_roce_eq *eq,
                      void *mb_buf)
 {
@@ -5797,13 +6204,7 @@ static int config_eqc(struct hns_roce_dev *hr_dev, struct hns_roce_eq *eq,
        eqc = mb_buf;
        memset(eqc, 0, sizeof(struct hns_roce_eq_context));
 
-       /* init eqc */
-       eq->doorbell = hr_dev->reg_base + ROCEE_VF_EQ_DB_CFG0_REG;
-       eq->cons_index = 0;
-       eq->over_ignore = HNS_ROCE_V2_EQ_OVER_IGNORE_0;
-       eq->coalesce = HNS_ROCE_V2_EQ_COALESCE_0;
-       eq->arm_st = HNS_ROCE_V2_EQ_ALWAYS_ARMED;
-       eq->shift = ilog2((unsigned int)eq->entries);
+       init_eq_config(hr_dev, eq);
 
        /* if not multi-hop, eqe buffer only use one trunk */
        count = hns_roce_mtr_find(hr_dev, &eq->mtr, 0, eqe_ba, MTT_MIN_COUNT,
@@ -5813,102 +6214,34 @@ static int config_eqc(struct hns_roce_dev *hr_dev, struct hns_roce_eq *eq,
                return -ENOBUFS;
        }
 
-       /* set eqc state */
-       roce_set_field(eqc->byte_4, HNS_ROCE_EQC_EQ_ST_M, HNS_ROCE_EQC_EQ_ST_S,
-                      HNS_ROCE_V2_EQ_STATE_VALID);
-
-       /* set eqe hop num */
-       roce_set_field(eqc->byte_4, HNS_ROCE_EQC_HOP_NUM_M,
-                      HNS_ROCE_EQC_HOP_NUM_S, eq->hop_num);
-
-       /* set eqc over_ignore */
-       roce_set_field(eqc->byte_4, HNS_ROCE_EQC_OVER_IGNORE_M,
-                      HNS_ROCE_EQC_OVER_IGNORE_S, eq->over_ignore);
-
-       /* set eqc coalesce */
-       roce_set_field(eqc->byte_4, HNS_ROCE_EQC_COALESCE_M,
-                      HNS_ROCE_EQC_COALESCE_S, eq->coalesce);
-
-       /* set eqc arm_state */
-       roce_set_field(eqc->byte_4, HNS_ROCE_EQC_ARM_ST_M,
-                      HNS_ROCE_EQC_ARM_ST_S, eq->arm_st);
-
-       /* set eqn */
-       roce_set_field(eqc->byte_4, HNS_ROCE_EQC_EQN_M, HNS_ROCE_EQC_EQN_S,
-                      eq->eqn);
-
-       /* set eqe_cnt */
-       roce_set_field(eqc->byte_4, HNS_ROCE_EQC_EQE_CNT_M,
-                      HNS_ROCE_EQC_EQE_CNT_S, HNS_ROCE_EQ_INIT_EQE_CNT);
-
-       /* set eqe_ba_pg_sz */
-       roce_set_field(eqc->byte_8, HNS_ROCE_EQC_BA_PG_SZ_M,
-                      HNS_ROCE_EQC_BA_PG_SZ_S,
-                      to_hr_hw_page_shift(eq->mtr.hem_cfg.ba_pg_shift));
-
-       /* set eqe_buf_pg_sz */
-       roce_set_field(eqc->byte_8, HNS_ROCE_EQC_BUF_PG_SZ_M,
-                      HNS_ROCE_EQC_BUF_PG_SZ_S,
-                      to_hr_hw_page_shift(eq->mtr.hem_cfg.buf_pg_shift));
-
-       /* set eq_producer_idx */
-       roce_set_field(eqc->byte_8, HNS_ROCE_EQC_PROD_INDX_M,
-                      HNS_ROCE_EQC_PROD_INDX_S, HNS_ROCE_EQ_INIT_PROD_IDX);
-
-       /* set eq_max_cnt */
-       roce_set_field(eqc->byte_12, HNS_ROCE_EQC_MAX_CNT_M,
-                      HNS_ROCE_EQC_MAX_CNT_S, eq->eq_max_cnt);
-
-       /* set eq_period */
-       roce_set_field(eqc->byte_12, HNS_ROCE_EQC_PERIOD_M,
-                      HNS_ROCE_EQC_PERIOD_S, eq->eq_period);
-
-       /* set eqe_report_timer */
-       roce_set_field(eqc->eqe_report_timer, HNS_ROCE_EQC_REPORT_TIMER_M,
-                      HNS_ROCE_EQC_REPORT_TIMER_S,
-                      HNS_ROCE_EQ_INIT_REPORT_TIMER);
-
-       /* set bt_ba [34:3] */
-       roce_set_field(eqc->eqe_ba0, HNS_ROCE_EQC_EQE_BA_L_M,
-                      HNS_ROCE_EQC_EQE_BA_L_S, bt_ba >> 3);
-
-       /* set bt_ba [64:35] */
-       roce_set_field(eqc->eqe_ba1, HNS_ROCE_EQC_EQE_BA_H_M,
-                      HNS_ROCE_EQC_EQE_BA_H_S, bt_ba >> 35);
-
-       /* set eq shift */
-       roce_set_field(eqc->byte_28, HNS_ROCE_EQC_SHIFT_M, HNS_ROCE_EQC_SHIFT_S,
-                      eq->shift);
-
-       /* set eq MSI_IDX */
-       roce_set_field(eqc->byte_28, HNS_ROCE_EQC_MSI_INDX_M,
-                      HNS_ROCE_EQC_MSI_INDX_S, HNS_ROCE_EQ_INIT_MSI_IDX);
-
-       /* set cur_eqe_ba [27:12] */
-       roce_set_field(eqc->byte_28, HNS_ROCE_EQC_CUR_EQE_BA_L_M,
-                      HNS_ROCE_EQC_CUR_EQE_BA_L_S, eqe_ba[0] >> 12);
-
-       /* set cur_eqe_ba [59:28] */
-       roce_set_field(eqc->byte_32, HNS_ROCE_EQC_CUR_EQE_BA_M_M,
-                      HNS_ROCE_EQC_CUR_EQE_BA_M_S, eqe_ba[0] >> 28);
-
-       /* set cur_eqe_ba [63:60] */
-       roce_set_field(eqc->byte_36, HNS_ROCE_EQC_CUR_EQE_BA_H_M,
-                      HNS_ROCE_EQC_CUR_EQE_BA_H_S, eqe_ba[0] >> 60);
-
-       /* set eq consumer idx */
-       roce_set_field(eqc->byte_36, HNS_ROCE_EQC_CONS_INDX_M,
-                      HNS_ROCE_EQC_CONS_INDX_S, HNS_ROCE_EQ_INIT_CONS_IDX);
-
-       roce_set_field(eqc->byte_40, HNS_ROCE_EQC_NXT_EQE_BA_L_M,
-                      HNS_ROCE_EQC_NXT_EQE_BA_L_S, eqe_ba[1] >> 12);
-
-       roce_set_field(eqc->byte_44, HNS_ROCE_EQC_NXT_EQE_BA_H_M,
-                      HNS_ROCE_EQC_NXT_EQE_BA_H_S, eqe_ba[1] >> 44);
-
-       roce_set_field(eqc->byte_44, HNS_ROCE_EQC_EQE_SIZE_M,
-                      HNS_ROCE_EQC_EQE_SIZE_S,
-                      eq->eqe_size == HNS_ROCE_V3_EQE_SIZE ? 1 : 0);
+       hr_reg_write(eqc, EQC_EQ_ST, HNS_ROCE_V2_EQ_STATE_VALID);
+       hr_reg_write(eqc, EQC_EQE_HOP_NUM, eq->hop_num);
+       hr_reg_write(eqc, EQC_OVER_IGNORE, eq->over_ignore);
+       hr_reg_write(eqc, EQC_COALESCE, eq->coalesce);
+       hr_reg_write(eqc, EQC_ARM_ST, eq->arm_st);
+       hr_reg_write(eqc, EQC_EQN, eq->eqn);
+       hr_reg_write(eqc, EQC_EQE_CNT, HNS_ROCE_EQ_INIT_EQE_CNT);
+       hr_reg_write(eqc, EQC_EQE_BA_PG_SZ,
+                    to_hr_hw_page_shift(eq->mtr.hem_cfg.ba_pg_shift));
+       hr_reg_write(eqc, EQC_EQE_BUF_PG_SZ,
+                    to_hr_hw_page_shift(eq->mtr.hem_cfg.buf_pg_shift));
+       hr_reg_write(eqc, EQC_EQ_PROD_INDX, HNS_ROCE_EQ_INIT_PROD_IDX);
+       hr_reg_write(eqc, EQC_EQ_MAX_CNT, eq->eq_max_cnt);
+
+       hr_reg_write(eqc, EQC_EQ_PERIOD, eq->eq_period);
+       hr_reg_write(eqc, EQC_EQE_REPORT_TIMER, HNS_ROCE_EQ_INIT_REPORT_TIMER);
+       hr_reg_write(eqc, EQC_EQE_BA_L, bt_ba >> 3);
+       hr_reg_write(eqc, EQC_EQE_BA_H, bt_ba >> 35);
+       hr_reg_write(eqc, EQC_SHIFT, eq->shift);
+       hr_reg_write(eqc, EQC_MSI_INDX, HNS_ROCE_EQ_INIT_MSI_IDX);
+       hr_reg_write(eqc, EQC_CUR_EQE_BA_L, eqe_ba[0] >> 12);
+       hr_reg_write(eqc, EQC_CUR_EQE_BA_M, eqe_ba[0] >> 28);
+       hr_reg_write(eqc, EQC_CUR_EQE_BA_H, eqe_ba[0] >> 60);
+       hr_reg_write(eqc, EQC_EQ_CONS_INDX, HNS_ROCE_EQ_INIT_CONS_IDX);
+       hr_reg_write(eqc, EQC_NEX_EQE_BA_L, eqe_ba[1] >> 12);
+       hr_reg_write(eqc, EQC_NEX_EQE_BA_H, eqe_ba[1] >> 44);
+       hr_reg_write(eqc, EQC_EQE_SIZE,
+                    !!(eq->eqe_size == HNS_ROCE_V3_EQE_SIZE));
 
        return 0;
 }
@@ -6166,6 +6499,7 @@ static void hns_roce_v2_cleanup_eq_table(struct hns_roce_dev *hr_dev)
        hns_roce_v2_int_mask_enable(hr_dev, eq_num, EQ_DISABLE);
 
        __hns_roce_free_irq(hr_dev);
+       destroy_workqueue(hr_dev->irq_workq);
 
        for (i = 0; i < eq_num; i++) {
                hns_roce_v2_destroy_eqc(hr_dev, i);
@@ -6174,9 +6508,6 @@ static void hns_roce_v2_cleanup_eq_table(struct hns_roce_dev *hr_dev)
        }
 
        kfree(eq_table->eq);
-
-       flush_workqueue(hr_dev->irq_workq);
-       destroy_workqueue(hr_dev->irq_workq);
 }
 
 static const struct hns_roce_dfx_hw hns_roce_dfx_hw_v2 = {
@@ -6205,9 +6536,9 @@ static const struct hns_roce_hw hns_roce_hw_v2 = {
        .hw_profile = hns_roce_v2_profile,
        .hw_init = hns_roce_v2_init,
        .hw_exit = hns_roce_v2_exit,
-       .post_mbox = hns_roce_v2_post_mbox,
-       .chk_mbox = hns_roce_v2_chk_mbox,
-       .rst_prc_mbox = hns_roce_v2_rst_process_cmd,
+       .post_mbox = v2_post_mbox,
+       .poll_mbox_done = v2_poll_mbox_done,
+       .chk_mbox_avail = v2_chk_mbox_is_avail,
        .set_gid = hns_roce_v2_set_gid,
        .set_mac = hns_roce_v2_set_mac,
        .write_mtpt = hns_roce_v2_write_mtpt,
@@ -6218,20 +6549,10 @@ static const struct hns_roce_hw hns_roce_hw_v2 = {
        .set_hem = hns_roce_v2_set_hem,
        .clear_hem = hns_roce_v2_clear_hem,
        .modify_qp = hns_roce_v2_modify_qp,
-       .query_qp = hns_roce_v2_query_qp,
-       .destroy_qp = hns_roce_v2_destroy_qp,
        .qp_flow_control_init = hns_roce_v2_qp_flow_control_init,
-       .modify_cq = hns_roce_v2_modify_cq,
-       .post_send = hns_roce_v2_post_send,
-       .post_recv = hns_roce_v2_post_recv,
-       .req_notify_cq = hns_roce_v2_req_notify_cq,
-       .poll_cq = hns_roce_v2_poll_cq,
        .init_eq = hns_roce_v2_init_eq_table,
        .cleanup_eq = hns_roce_v2_cleanup_eq_table,
        .write_srqc = hns_roce_v2_write_srqc,
-       .modify_srq = hns_roce_v2_modify_srq,
-       .query_srq = hns_roce_v2_query_srq,
-       .post_srq_recv = hns_roce_v2_post_srq_recv,
        .hns_roce_dev_ops = &hns_roce_v2_dev_ops,
        .hns_roce_dev_srq_ops = &hns_roce_v2_dev_srq_ops,
 };
@@ -6243,6 +6564,8 @@ static const struct pci_device_id hns_roce_hw_v2_pci_tbl[] = {
        {PCI_VDEVICE(HUAWEI, HNAE3_DEV_ID_50GE_RDMA_MACSEC), 0},
        {PCI_VDEVICE(HUAWEI, HNAE3_DEV_ID_100G_RDMA_MACSEC), 0},
        {PCI_VDEVICE(HUAWEI, HNAE3_DEV_ID_200G_RDMA), 0},
+       {PCI_VDEVICE(HUAWEI, HNAE3_DEV_ID_RDMA_DCB_PFC_VF),
+        HNAE3_DEV_SUPPORT_ROCE_DCB_BITS},
        /* required last entry */
        {0, }
 };
@@ -6253,9 +6576,12 @@ static void hns_roce_hw_v2_get_cfg(struct hns_roce_dev *hr_dev,
                                  struct hnae3_handle *handle)
 {
        struct hns_roce_v2_priv *priv = hr_dev->priv;
+       const struct pci_device_id *id;
        int i;
 
        hr_dev->pci_dev = handle->pdev;
+       id = pci_match_id(hns_roce_hw_v2_pci_tbl, hr_dev->pci_dev);
+       hr_dev->is_vf = id->driver_data;
        hr_dev->dev = &handle->pdev->dev;
        hr_dev->hw = &hns_roce_hw_v2;
        hr_dev->dfx = &hns_roce_dfx_hw_v2;
@@ -6272,7 +6598,7 @@ static void hns_roce_hw_v2_get_cfg(struct hns_roce_dev *hr_dev,
        addrconf_addr_eui48((u8 *)&hr_dev->ib_dev.node_guid,
                            hr_dev->iboe.netdevs[0]->dev_addr);
 
-       for (i = 0; i < HNS_ROCE_V2_MAX_IRQ_NUM; i++)
+       for (i = 0; i < handle->rinfo.num_vectors; i++)
                hr_dev->irq[i] = pci_irq_vector(handle->pdev,
                                                i + handle->rinfo.base_vector);
 
@@ -6356,6 +6682,9 @@ static int hns_roce_hw_v2_init_instance(struct hnae3_handle *handle)
        if (!id)
                return 0;
 
+       if (id->driver_data && handle->pdev->revision < PCI_REVISION_ID_HIP09)
+               return 0;
+
        ret = __hns_roce_hw_v2_init_instance(handle);
        if (ret) {
                handle->rinfo.instance_state = HNS_ROCE_STATE_NON_INIT;
index 39621fb6ec160dbbfcfd7b4b97a81b5c481b1360..a2100a629859a1325924f608150e36190bfae337 100644 (file)
 #define HNS_ROCE_VF_SRQC_BT_NUM                        64
 #define HNS_ROCE_VF_CQC_BT_NUM                 64
 #define HNS_ROCE_VF_MPT_BT_NUM                 64
-#define HNS_ROCE_VF_EQC_NUM                    64
 #define HNS_ROCE_VF_SMAC_NUM                   32
-#define HNS_ROCE_VF_SGID_NUM                   32
 #define HNS_ROCE_VF_SL_NUM                     8
 #define HNS_ROCE_VF_GMV_BT_NUM                 256
 
-#define HNS_ROCE_V2_MAX_QP_NUM                 0x100000
+#define HNS_ROCE_V2_MAX_QP_NUM                 0x1000
 #define HNS_ROCE_V2_MAX_QPC_TIMER_NUM          0x200
 #define HNS_ROCE_V2_MAX_WQE_NUM                        0x8000
 #define        HNS_ROCE_V2_MAX_SRQ                     0x100000
@@ -61,6 +59,7 @@
 #define HNS_ROCE_V2_MAX_SQ_SGE_NUM             64
 #define HNS_ROCE_V2_MAX_EXTEND_SGE_NUM         0x200000
 #define HNS_ROCE_V2_MAX_SQ_INLINE              0x20
+#define HNS_ROCE_V2_MAX_SQ_INL_EXT             0x400
 #define HNS_ROCE_V2_MAX_RC_INL_INN_SZ          32
 #define HNS_ROCE_V2_UAR_NUM                    256
 #define HNS_ROCE_V2_PHY_UAR_NUM                        1
@@ -74,6 +73,8 @@
 #define HNS_ROCE_V2_MAX_SRQWQE_SEGS            0x1000000
 #define HNS_ROCE_V2_MAX_IDX_SEGS               0x1000000
 #define HNS_ROCE_V2_MAX_PD_NUM                 0x1000000
+#define HNS_ROCE_V2_MAX_XRCD_NUM               0x1000000
+#define HNS_ROCE_V2_RSV_XRCD_NUM               0
 #define HNS_ROCE_V2_MAX_QP_INIT_RDMA           128
 #define HNS_ROCE_V2_MAX_QP_DEST_RDMA           128
 #define HNS_ROCE_V2_MAX_SQ_DESC_SZ             64
 
 #define HNS_ROCE_BA_PG_SZ_SUPPORTED_256K       6
 #define HNS_ROCE_BA_PG_SZ_SUPPORTED_16K                2
-#define HNS_ROCE_V2_GID_INDEX_NUM              256
+#define HNS_ROCE_V2_GID_INDEX_NUM              16
 
 #define HNS_ROCE_V2_TABLE_CHUNK_SIZE           (1 << 18)
 
 
 #define HNS_ROCE_CMQ_SCC_CLR_DONE_CNT          5
 
+#define HNS_ROCE_CONG_SIZE 64
+
 #define check_whether_last_step(hop_num, step_idx) \
        ((step_idx == 0 && hop_num == HNS_ROCE_HOP_NUM_0) || \
        (step_idx == 1 && hop_num == 1) || \
@@ -195,11 +198,11 @@ enum {
 };
 
 enum {
-       HNS_ROCE_V2_SQ_DB       = 0x0,
-       HNS_ROCE_V2_RQ_DB       = 0x1,
-       HNS_ROCE_V2_SRQ_DB      = 0x2,
-       HNS_ROCE_V2_CQ_DB_PTR   = 0x3,
-       HNS_ROCE_V2_CQ_DB_NTR   = 0x4,
+       HNS_ROCE_V2_SQ_DB,
+       HNS_ROCE_V2_RQ_DB,
+       HNS_ROCE_V2_SRQ_DB,
+       HNS_ROCE_V2_CQ_DB,
+       HNS_ROCE_V2_CQ_DB_NOTIFY
 };
 
 enum {
@@ -233,6 +236,7 @@ enum hns_roce_opcode_type {
        HNS_ROCE_OPC_CFG_EXT_LLM                        = 0x8403,
        HNS_ROCE_OPC_CFG_TMOUT_LLM                      = 0x8404,
        HNS_ROCE_OPC_QUERY_PF_TIMER_RES                 = 0x8406,
+       HNS_ROCE_OPC_QUERY_FUNC_INFO                    = 0x8407,
        HNS_ROCE_OPC_QUERY_PF_CAPS_NUM                  = 0x8408,
        HNS_ROCE_OPC_CFG_ENTRY_SIZE                     = 0x8409,
        HNS_ROCE_OPC_CFG_SGID_TB                        = 0x8500,
@@ -244,6 +248,7 @@ enum hns_roce_opcode_type {
        HNS_ROCE_OPC_CLR_SCCC                           = 0x8509,
        HNS_ROCE_OPC_QUERY_SCCC                         = 0x850a,
        HNS_ROCE_OPC_RESET_SCCC                         = 0x850b,
+       HNS_ROCE_OPC_QUERY_VF_RES                       = 0x850e,
        HNS_ROCE_OPC_CFG_GMV_TBL                        = 0x850f,
        HNS_ROCE_OPC_CFG_GMV_BT                         = 0x8510,
        HNS_SWITCH_PARAMETER_CFG                        = 0x1033,
@@ -255,10 +260,20 @@ enum {
 };
 
 enum hns_roce_cmd_return_status {
-       CMD_EXEC_SUCCESS        = 0,
-       CMD_NO_AUTH             = 1,
-       CMD_NOT_EXEC            = 2,
-       CMD_QUEUE_FULL          = 3,
+       CMD_EXEC_SUCCESS,
+       CMD_NO_AUTH,
+       CMD_NOT_EXIST,
+       CMD_CRQ_FULL,
+       CMD_NEXT_ERR,
+       CMD_NOT_EXEC,
+       CMD_PARA_ERR,
+       CMD_RESULT_ERR,
+       CMD_TIMEOUT,
+       CMD_HILINK_ERR,
+       CMD_INFO_ILLEGAL,
+       CMD_INVALID,
+       CMD_ROH_CHECK_FAIL,
+       CMD_OTHER_ERR = 0xff
 };
 
 enum hns_roce_sgid_type {
@@ -399,7 +414,8 @@ struct hns_roce_srq_context {
 #define SRQC_CONSUMER_IDX SRQC_FIELD_LOC(127, 112)
 #define SRQC_WQE_BT_BA_L SRQC_FIELD_LOC(159, 128)
 #define SRQC_WQE_BT_BA_H SRQC_FIELD_LOC(188, 160)
-#define SRQC_RSV2 SRQC_FIELD_LOC(191, 189)
+#define SRQC_RSV2 SRQC_FIELD_LOC(190, 189)
+#define SRQC_SRQ_TYPE SRQC_FIELD_LOC(191, 191)
 #define SRQC_PD SRQC_FIELD_LOC(215, 192)
 #define SRQC_RQWS SRQC_FIELD_LOC(219, 216)
 #define SRQC_RSV3 SRQC_FIELD_LOC(223, 220)
@@ -572,6 +588,10 @@ struct hns_roce_v2_qp_context {
        struct hns_roce_v2_qp_context_ex ext;
 };
 
+#define QPC_FIELD_LOC(h, l) FIELD_LOC(struct hns_roce_v2_qp_context, h, l)
+
+#define QPC_CONG_ALGO_TMPL_ID QPC_FIELD_LOC(455, 448)
+
 #define        V2_QPC_BYTE_4_TST_S 0
 #define V2_QPC_BYTE_4_TST_M GENMASK(2, 0)
 
@@ -663,9 +683,6 @@ struct hns_roce_v2_qp_context {
 #define        V2_QPC_BYTE_56_LP_PKTN_INI_S 28
 #define V2_QPC_BYTE_56_LP_PKTN_INI_M GENMASK(31, 28)
 
-#define        V2_QPC_BYTE_60_TEMPID_S 0
-#define V2_QPC_BYTE_60_TEMPID_M GENMASK(7, 0)
-
 #define V2_QPC_BYTE_60_SCC_TOKEN_S 8
 #define V2_QPC_BYTE_60_SCC_TOKEN_M GENMASK(26, 8)
 
@@ -698,6 +715,8 @@ struct hns_roce_v2_qp_context {
 #define        V2_QPC_BYTE_80_RX_CQN_S 0
 #define V2_QPC_BYTE_80_RX_CQN_M GENMASK(23, 0)
 
+#define V2_QPC_BYTE_80_XRC_QP_TYPE_S 24
+
 #define        V2_QPC_BYTE_80_MIN_RNR_TIME_S 27
 #define V2_QPC_BYTE_80_MIN_RNR_TIME_M GENMASK(31, 27)
 
@@ -940,6 +959,10 @@ struct hns_roce_v2_qp_context {
 
 #define QPCEX_FIELD_LOC(h, l) FIELD_LOC(struct hns_roce_v2_qp_context_ex, h, l)
 
+#define QPCEX_CONG_ALG_SEL QPCEX_FIELD_LOC(0, 0)
+#define QPCEX_CONG_ALG_SUB_SEL QPCEX_FIELD_LOC(1, 1)
+#define QPCEX_DIP_CTX_IDX_VLD QPCEX_FIELD_LOC(2, 2)
+#define QPCEX_DIP_CTX_IDX QPCEX_FIELD_LOC(22, 3)
 #define QPCEX_STASH QPCEX_FIELD_LOC(82, 82)
 
 #define        V2_QP_RWE_S 1 /* rdma write enable */
@@ -1130,33 +1153,27 @@ struct hns_roce_v2_mpt_entry {
 #define V2_MPT_BYTE_64_PBL_BUF_PG_SZ_S 28
 #define V2_MPT_BYTE_64_PBL_BUF_PG_SZ_M GENMASK(31, 28)
 
-#define        V2_DB_BYTE_4_TAG_S 0
-#define V2_DB_BYTE_4_TAG_M GENMASK(23, 0)
+#define V2_DB_TAG_S 0
+#define V2_DB_TAG_M GENMASK(23, 0)
 
-#define        V2_DB_BYTE_4_CMD_S 24
-#define V2_DB_BYTE_4_CMD_M GENMASK(27, 24)
+#define V2_DB_CMD_S 24
+#define V2_DB_CMD_M GENMASK(27, 24)
 
 #define V2_DB_FLAG_S 31
 
-#define V2_DB_PARAMETER_IDX_S 0
-#define V2_DB_PARAMETER_IDX_M GENMASK(15, 0)
+#define V2_DB_PRODUCER_IDX_S 0
+#define V2_DB_PRODUCER_IDX_M GENMASK(15, 0)
 
-#define V2_DB_PARAMETER_SL_S 16
-#define V2_DB_PARAMETER_SL_M GENMASK(18, 16)
+#define V2_DB_SL_S 16
+#define V2_DB_SL_M GENMASK(18, 16)
 
-#define        V2_CQ_DB_BYTE_4_TAG_S 0
-#define V2_CQ_DB_BYTE_4_TAG_M GENMASK(23, 0)
+#define V2_CQ_DB_CONS_IDX_S 0
+#define V2_CQ_DB_CONS_IDX_M GENMASK(23, 0)
 
-#define        V2_CQ_DB_BYTE_4_CMD_S 24
-#define V2_CQ_DB_BYTE_4_CMD_M GENMASK(27, 24)
+#define V2_CQ_DB_NOTIFY_TYPE_S 24
 
-#define V2_CQ_DB_PARAMETER_CONS_IDX_S 0
-#define V2_CQ_DB_PARAMETER_CONS_IDX_M GENMASK(23, 0)
-
-#define V2_CQ_DB_PARAMETER_CMD_SN_S 25
-#define V2_CQ_DB_PARAMETER_CMD_SN_M GENMASK(26, 25)
-
-#define V2_CQ_DB_PARAMETER_NOTIFY_S 24
+#define V2_CQ_DB_CMD_SN_S 25
+#define V2_CQ_DB_CMD_SN_M GENMASK(26, 25)
 
 struct hns_roce_v2_ud_send_wqe {
        __le32  byte_4;
@@ -1359,194 +1376,44 @@ struct hns_roce_cfg_llm_b {
 #define CFG_LLM_TAIL_PTR_S 0
 #define CFG_LLM_TAIL_PTR_M GENMASK(11, 0)
 
-struct hns_roce_cfg_global_param {
-       __le32 time_cfg_udp_port;
-       __le32 rsv[5];
-};
-
-#define CFG_GLOBAL_PARAM_DATA_0_ROCEE_TIME_1US_CFG_S 0
-#define CFG_GLOBAL_PARAM_DATA_0_ROCEE_TIME_1US_CFG_M GENMASK(9, 0)
-
-#define CFG_GLOBAL_PARAM_DATA_0_ROCEE_UDP_PORT_S 16
-#define CFG_GLOBAL_PARAM_DATA_0_ROCEE_UDP_PORT_M GENMASK(31, 16)
-
-struct hns_roce_pf_res_a {
-       __le32  rsv;
-       __le32  qpc_bt_idx_num;
-       __le32  srqc_bt_idx_num;
-       __le32  cqc_bt_idx_num;
-       __le32  mpt_bt_idx_num;
-       __le32  eqc_bt_idx_num;
-};
-
-#define PF_RES_DATA_1_PF_QPC_BT_IDX_S 0
-#define PF_RES_DATA_1_PF_QPC_BT_IDX_M GENMASK(10, 0)
-
-#define PF_RES_DATA_1_PF_QPC_BT_NUM_S 16
-#define PF_RES_DATA_1_PF_QPC_BT_NUM_M GENMASK(27, 16)
-
-#define PF_RES_DATA_2_PF_SRQC_BT_IDX_S 0
-#define PF_RES_DATA_2_PF_SRQC_BT_IDX_M GENMASK(8, 0)
-
-#define PF_RES_DATA_2_PF_SRQC_BT_NUM_S 16
-#define PF_RES_DATA_2_PF_SRQC_BT_NUM_M GENMASK(25, 16)
-
-#define PF_RES_DATA_3_PF_CQC_BT_IDX_S 0
-#define PF_RES_DATA_3_PF_CQC_BT_IDX_M GENMASK(8, 0)
-
-#define PF_RES_DATA_3_PF_CQC_BT_NUM_S 16
-#define PF_RES_DATA_3_PF_CQC_BT_NUM_M GENMASK(25, 16)
-
-#define PF_RES_DATA_4_PF_MPT_BT_IDX_S 0
-#define PF_RES_DATA_4_PF_MPT_BT_IDX_M GENMASK(8, 0)
-
-#define PF_RES_DATA_4_PF_MPT_BT_NUM_S 16
-#define PF_RES_DATA_4_PF_MPT_BT_NUM_M GENMASK(25, 16)
-
-#define PF_RES_DATA_5_PF_EQC_BT_IDX_S 0
-#define PF_RES_DATA_5_PF_EQC_BT_IDX_M GENMASK(8, 0)
-
-#define PF_RES_DATA_5_PF_EQC_BT_NUM_S 16
-#define PF_RES_DATA_5_PF_EQC_BT_NUM_M GENMASK(25, 16)
-
-struct hns_roce_pf_res_b {
-       __le32  rsv0;
-       __le32  smac_idx_num;
-       __le32  sgid_idx_num;
-       __le32  qid_idx_sl_num;
-       __le32  sccc_bt_idx_num;
-       __le32  gmv_idx_num;
-};
-
-#define PF_RES_DATA_1_PF_SMAC_IDX_S 0
-#define PF_RES_DATA_1_PF_SMAC_IDX_M GENMASK(7, 0)
-
-#define PF_RES_DATA_1_PF_SMAC_NUM_S 8
-#define PF_RES_DATA_1_PF_SMAC_NUM_M GENMASK(16, 8)
-
-#define PF_RES_DATA_2_PF_SGID_IDX_S 0
-#define PF_RES_DATA_2_PF_SGID_IDX_M GENMASK(7, 0)
-
-#define PF_RES_DATA_2_PF_SGID_NUM_S 8
-#define PF_RES_DATA_2_PF_SGID_NUM_M GENMASK(16, 8)
-
-#define PF_RES_DATA_3_PF_QID_IDX_S 0
-#define PF_RES_DATA_3_PF_QID_IDX_M GENMASK(9, 0)
-
-#define PF_RES_DATA_3_PF_SL_NUM_S 16
-#define PF_RES_DATA_3_PF_SL_NUM_M GENMASK(26, 16)
-
-#define PF_RES_DATA_4_PF_SCCC_BT_IDX_S 0
-#define PF_RES_DATA_4_PF_SCCC_BT_IDX_M GENMASK(8, 0)
-
-#define PF_RES_DATA_4_PF_SCCC_BT_NUM_S 9
-#define PF_RES_DATA_4_PF_SCCC_BT_NUM_M GENMASK(17, 9)
-
-#define PF_RES_DATA_5_PF_GMV_BT_IDX_S 0
-#define PF_RES_DATA_5_PF_GMV_BT_IDX_M GENMASK(7, 0)
+/* Fields of HNS_ROCE_OPC_CFG_GLOBAL_PARAM */
+#define CFG_GLOBAL_PARAM_1US_CYCLES CMQ_REQ_FIELD_LOC(9, 0)
+#define CFG_GLOBAL_PARAM_UDP_PORT CMQ_REQ_FIELD_LOC(31, 16)
 
-#define PF_RES_DATA_5_PF_GMV_BT_NUM_S 8
-#define PF_RES_DATA_5_PF_GMV_BT_NUM_M GENMASK(16, 8)
-
-struct hns_roce_pf_timer_res_a {
-       __le32  rsv0;
-       __le32  qpc_timer_bt_idx_num;
-       __le32  cqc_timer_bt_idx_num;
-       __le32  rsv[3];
-};
-
-#define PF_RES_DATA_1_PF_QPC_TIMER_BT_IDX_S 0
-#define PF_RES_DATA_1_PF_QPC_TIMER_BT_IDX_M GENMASK(11, 0)
-
-#define PF_RES_DATA_1_PF_QPC_TIMER_BT_NUM_S 16
-#define PF_RES_DATA_1_PF_QPC_TIMER_BT_NUM_M GENMASK(28, 16)
-
-#define PF_RES_DATA_2_PF_CQC_TIMER_BT_IDX_S 0
-#define PF_RES_DATA_2_PF_CQC_TIMER_BT_IDX_M GENMASK(10, 0)
-
-#define PF_RES_DATA_2_PF_CQC_TIMER_BT_NUM_S 16
-#define PF_RES_DATA_2_PF_CQC_TIMER_BT_NUM_M GENMASK(27, 16)
-
-struct hns_roce_vf_res_a {
-       __le32 vf_id;
-       __le32 vf_qpc_bt_idx_num;
-       __le32 vf_srqc_bt_idx_num;
-       __le32 vf_cqc_bt_idx_num;
-       __le32 vf_mpt_bt_idx_num;
-       __le32 vf_eqc_bt_idx_num;
-};
-
-#define VF_RES_A_DATA_1_VF_QPC_BT_IDX_S 0
-#define VF_RES_A_DATA_1_VF_QPC_BT_IDX_M GENMASK(10, 0)
-
-#define VF_RES_A_DATA_1_VF_QPC_BT_NUM_S 16
-#define VF_RES_A_DATA_1_VF_QPC_BT_NUM_M GENMASK(27, 16)
-
-#define VF_RES_A_DATA_2_VF_SRQC_BT_IDX_S 0
-#define VF_RES_A_DATA_2_VF_SRQC_BT_IDX_M GENMASK(8, 0)
-
-#define VF_RES_A_DATA_2_VF_SRQC_BT_NUM_S 16
-#define VF_RES_A_DATA_2_VF_SRQC_BT_NUM_M GENMASK(25, 16)
-
-#define VF_RES_A_DATA_3_VF_CQC_BT_IDX_S 0
-#define VF_RES_A_DATA_3_VF_CQC_BT_IDX_M GENMASK(8, 0)
-
-#define VF_RES_A_DATA_3_VF_CQC_BT_NUM_S 16
-#define VF_RES_A_DATA_3_VF_CQC_BT_NUM_M GENMASK(25, 16)
-
-#define VF_RES_A_DATA_4_VF_MPT_BT_IDX_S 0
-#define VF_RES_A_DATA_4_VF_MPT_BT_IDX_M GENMASK(8, 0)
-
-#define VF_RES_A_DATA_4_VF_MPT_BT_NUM_S 16
-#define VF_RES_A_DATA_4_VF_MPT_BT_NUM_M GENMASK(25, 16)
-
-#define VF_RES_A_DATA_5_VF_EQC_IDX_S 0
-#define VF_RES_A_DATA_5_VF_EQC_IDX_M GENMASK(8, 0)
-
-#define VF_RES_A_DATA_5_VF_EQC_NUM_S 16
-#define VF_RES_A_DATA_5_VF_EQC_NUM_M GENMASK(25, 16)
-
-struct hns_roce_vf_res_b {
-       __le32 rsv0;
-       __le32 vf_smac_idx_num;
-       __le32 vf_sgid_idx_num;
-       __le32 vf_qid_idx_sl_num;
-       __le32 vf_sccc_idx_num;
-       __le32 vf_gmv_idx_num;
-};
-
-#define VF_RES_B_DATA_0_VF_ID_S 0
-#define VF_RES_B_DATA_0_VF_ID_M GENMASK(7, 0)
-
-#define VF_RES_B_DATA_1_VF_SMAC_IDX_S 0
-#define VF_RES_B_DATA_1_VF_SMAC_IDX_M GENMASK(7, 0)
-
-#define VF_RES_B_DATA_1_VF_SMAC_NUM_S 8
-#define VF_RES_B_DATA_1_VF_SMAC_NUM_M GENMASK(16, 8)
-
-#define VF_RES_B_DATA_2_VF_SGID_IDX_S 0
-#define VF_RES_B_DATA_2_VF_SGID_IDX_M GENMASK(7, 0)
-
-#define VF_RES_B_DATA_2_VF_SGID_NUM_S 8
-#define VF_RES_B_DATA_2_VF_SGID_NUM_M GENMASK(16, 8)
-
-#define VF_RES_B_DATA_3_VF_QID_IDX_S 0
-#define VF_RES_B_DATA_3_VF_QID_IDX_M GENMASK(9, 0)
-
-#define VF_RES_B_DATA_3_VF_SL_NUM_S 16
-#define VF_RES_B_DATA_3_VF_SL_NUM_M GENMASK(19, 16)
-
-#define VF_RES_B_DATA_4_VF_SCCC_BT_IDX_S 0
-#define VF_RES_B_DATA_4_VF_SCCC_BT_IDX_M GENMASK(8, 0)
-
-#define VF_RES_B_DATA_4_VF_SCCC_BT_NUM_S 9
-#define VF_RES_B_DATA_4_VF_SCCC_BT_NUM_M GENMASK(17, 9)
-
-#define VF_RES_B_DATA_5_VF_GMV_BT_IDX_S 0
-#define VF_RES_B_DATA_5_VF_GMV_BT_IDX_M GENMASK(7, 0)
-
-#define VF_RES_B_DATA_5_VF_GMV_BT_NUM_S 16
-#define VF_RES_B_DATA_5_VF_GMV_BT_NUM_M GENMASK(24, 16)
+/*
+ * Fields of HNS_ROCE_OPC_QUERY_PF_RES, HNS_ROCE_OPC_QUERY_VF_RES
+ * and HNS_ROCE_OPC_ALLOC_VF_RES
+ */
+#define FUNC_RES_A_VF_ID CMQ_REQ_FIELD_LOC(7, 0)
+#define FUNC_RES_A_QPC_BT_IDX CMQ_REQ_FIELD_LOC(42, 32)
+#define FUNC_RES_A_QPC_BT_NUM CMQ_REQ_FIELD_LOC(59, 48)
+#define FUNC_RES_A_SRQC_BT_IDX CMQ_REQ_FIELD_LOC(72, 64)
+#define FUNC_RES_A_SRQC_BT_NUM CMQ_REQ_FIELD_LOC(89, 80)
+#define FUNC_RES_A_CQC_BT_IDX CMQ_REQ_FIELD_LOC(104, 96)
+#define FUNC_RES_A_CQC_BT_NUM CMQ_REQ_FIELD_LOC(121, 112)
+#define FUNC_RES_A_MPT_BT_IDX CMQ_REQ_FIELD_LOC(136, 128)
+#define FUNC_RES_A_MPT_BT_NUM CMQ_REQ_FIELD_LOC(153, 144)
+#define FUNC_RES_A_EQC_BT_IDX CMQ_REQ_FIELD_LOC(168, 160)
+#define FUNC_RES_A_EQC_BT_NUM CMQ_REQ_FIELD_LOC(185, 176)
+#define FUNC_RES_B_SMAC_IDX CMQ_REQ_FIELD_LOC(39, 32)
+#define FUNC_RES_B_SMAC_NUM CMQ_REQ_FIELD_LOC(48, 40)
+#define FUNC_RES_B_SGID_IDX CMQ_REQ_FIELD_LOC(71, 64)
+#define FUNC_RES_B_SGID_NUM CMQ_REQ_FIELD_LOC(80, 72)
+#define FUNC_RES_B_QID_IDX CMQ_REQ_FIELD_LOC(105, 96)
+#define FUNC_RES_B_QID_NUM CMQ_REQ_FIELD_LOC(122, 112)
+#define FUNC_RES_V_QID_NUM CMQ_REQ_FIELD_LOC(115, 112)
+
+#define FUNC_RES_B_SCCC_BT_IDX CMQ_REQ_FIELD_LOC(136, 128)
+#define FUNC_RES_B_SCCC_BT_NUM CMQ_REQ_FIELD_LOC(145, 137)
+#define FUNC_RES_B_GMV_BT_IDX CMQ_REQ_FIELD_LOC(167, 160)
+#define FUNC_RES_B_GMV_BT_NUM CMQ_REQ_FIELD_LOC(176, 168)
+#define FUNC_RES_V_GMV_BT_NUM CMQ_REQ_FIELD_LOC(184, 176)
+
+/* Fields of HNS_ROCE_OPC_QUERY_PF_TIMER_RES */
+#define PF_TIMER_RES_QPC_ITEM_IDX CMQ_REQ_FIELD_LOC(43, 32)
+#define PF_TIMER_RES_QPC_ITEM_NUM CMQ_REQ_FIELD_LOC(60, 48)
+#define PF_TIMER_RES_CQC_ITEM_IDX CMQ_REQ_FIELD_LOC(74, 64)
+#define PF_TIMER_RES_CQC_ITEM_NUM CMQ_REQ_FIELD_LOC(91, 80)
 
 struct hns_roce_vf_switch {
        __le32 rocee_sel;
@@ -1578,59 +1445,43 @@ struct hns_roce_mbox_status {
        __le32  rsv[5];
 };
 
-struct hns_roce_cfg_bt_attr {
-       __le32 vf_qpc_cfg;
-       __le32 vf_srqc_cfg;
-       __le32 vf_cqc_cfg;
-       __le32 vf_mpt_cfg;
-       __le32 vf_sccc_cfg;
-       __le32 rsv;
+#define HNS_ROCE_V2_GO_BIT_TIMEOUT_MSECS 10000
+
+#define MB_ST_HW_RUN_M BIT(31)
+#define MB_ST_COMPLETE_M GENMASK(7, 0)
+
+#define MB_ST_COMPLETE_SUCC 1
+
+/* Fields of HNS_ROCE_OPC_CFG_BT_ATTR */
+#define CFG_BT_ATTR_QPC_BA_PGSZ CMQ_REQ_FIELD_LOC(3, 0)
+#define CFG_BT_ATTR_QPC_BUF_PGSZ CMQ_REQ_FIELD_LOC(7, 4)
+#define CFG_BT_ATTR_QPC_HOPNUM CMQ_REQ_FIELD_LOC(9, 8)
+#define CFG_BT_ATTR_SRQC_BA_PGSZ CMQ_REQ_FIELD_LOC(35, 32)
+#define CFG_BT_ATTR_SRQC_BUF_PGSZ CMQ_REQ_FIELD_LOC(39, 36)
+#define CFG_BT_ATTR_SRQC_HOPNUM CMQ_REQ_FIELD_LOC(41, 40)
+#define CFG_BT_ATTR_CQC_BA_PGSZ CMQ_REQ_FIELD_LOC(67, 64)
+#define CFG_BT_ATTR_CQC_BUF_PGSZ CMQ_REQ_FIELD_LOC(71, 68)
+#define CFG_BT_ATTR_CQC_HOPNUM CMQ_REQ_FIELD_LOC(73, 72)
+#define CFG_BT_ATTR_MPT_BA_PGSZ CMQ_REQ_FIELD_LOC(99, 96)
+#define CFG_BT_ATTR_MPT_BUF_PGSZ CMQ_REQ_FIELD_LOC(103, 100)
+#define CFG_BT_ATTR_MPT_HOPNUM CMQ_REQ_FIELD_LOC(105, 104)
+#define CFG_BT_ATTR_SCCC_BA_PGSZ CMQ_REQ_FIELD_LOC(131, 128)
+#define CFG_BT_ATTR_SCCC_BUF_PGSZ CMQ_REQ_FIELD_LOC(135, 132)
+#define CFG_BT_ATTR_SCCC_HOPNUM CMQ_REQ_FIELD_LOC(137, 136)
+
+/* Fields of HNS_ROCE_OPC_CFG_ENTRY_SIZE */
+#define CFG_HEM_ENTRY_SIZE_TYPE CMQ_REQ_FIELD_LOC(31, 0)
+enum {
+       HNS_ROCE_CFG_QPC_SIZE = BIT(0),
+       HNS_ROCE_CFG_SCCC_SIZE = BIT(1),
 };
 
-#define CFG_BT_ATTR_DATA_0_VF_QPC_BA_PGSZ_S 0
-#define CFG_BT_ATTR_DATA_0_VF_QPC_BA_PGSZ_M GENMASK(3, 0)
-
-#define CFG_BT_ATTR_DATA_0_VF_QPC_BUF_PGSZ_S 4
-#define CFG_BT_ATTR_DATA_0_VF_QPC_BUF_PGSZ_M GENMASK(7, 4)
-
-#define CFG_BT_ATTR_DATA_0_VF_QPC_HOPNUM_S 8
-#define CFG_BT_ATTR_DATA_0_VF_QPC_HOPNUM_M GENMASK(9, 8)
-
-#define CFG_BT_ATTR_DATA_1_VF_SRQC_BA_PGSZ_S 0
-#define CFG_BT_ATTR_DATA_1_VF_SRQC_BA_PGSZ_M GENMASK(3, 0)
-
-#define CFG_BT_ATTR_DATA_1_VF_SRQC_BUF_PGSZ_S 4
-#define CFG_BT_ATTR_DATA_1_VF_SRQC_BUF_PGSZ_M GENMASK(7, 4)
-
-#define CFG_BT_ATTR_DATA_1_VF_SRQC_HOPNUM_S 8
-#define CFG_BT_ATTR_DATA_1_VF_SRQC_HOPNUM_M GENMASK(9, 8)
-
-#define CFG_BT_ATTR_DATA_2_VF_CQC_BA_PGSZ_S 0
-#define CFG_BT_ATTR_DATA_2_VF_CQC_BA_PGSZ_M GENMASK(3, 0)
-
-#define CFG_BT_ATTR_DATA_2_VF_CQC_BUF_PGSZ_S 4
-#define CFG_BT_ATTR_DATA_2_VF_CQC_BUF_PGSZ_M GENMASK(7, 4)
-
-#define CFG_BT_ATTR_DATA_2_VF_CQC_HOPNUM_S 8
-#define CFG_BT_ATTR_DATA_2_VF_CQC_HOPNUM_M GENMASK(9, 8)
-
-#define CFG_BT_ATTR_DATA_3_VF_MPT_BA_PGSZ_S 0
-#define CFG_BT_ATTR_DATA_3_VF_MPT_BA_PGSZ_M GENMASK(3, 0)
-
-#define CFG_BT_ATTR_DATA_3_VF_MPT_BUF_PGSZ_S 4
-#define CFG_BT_ATTR_DATA_3_VF_MPT_BUF_PGSZ_M GENMASK(7, 4)
-
-#define CFG_BT_ATTR_DATA_3_VF_MPT_HOPNUM_S 8
-#define CFG_BT_ATTR_DATA_3_VF_MPT_HOPNUM_M GENMASK(9, 8)
-
-#define CFG_BT_ATTR_DATA_4_VF_SCCC_BA_PGSZ_S 0
-#define CFG_BT_ATTR_DATA_4_VF_SCCC_BA_PGSZ_M GENMASK(3, 0)
-
-#define CFG_BT_ATTR_DATA_4_VF_SCCC_BUF_PGSZ_S 4
-#define CFG_BT_ATTR_DATA_4_VF_SCCC_BUF_PGSZ_M GENMASK(7, 4)
+#define CFG_HEM_ENTRY_SIZE_VALUE CMQ_REQ_FIELD_LOC(191, 160)
 
-#define CFG_BT_ATTR_DATA_4_VF_SCCC_HOPNUM_S 8
-#define CFG_BT_ATTR_DATA_4_VF_SCCC_HOPNUM_M GENMASK(9, 8)
+/* Fields of HNS_ROCE_OPC_CFG_GMV_BT */
+#define CFG_GMV_BT_BA_L CMQ_REQ_FIELD_LOC(31, 0)
+#define CFG_GMV_BT_BA_H CMQ_REQ_FIELD_LOC(51, 32)
+#define CFG_GMV_BT_IDX CMQ_REQ_FIELD_LOC(95, 64)
 
 struct hns_roce_cfg_sgid_tb {
        __le32  table_idx_rsv;
@@ -1641,17 +1492,6 @@ struct hns_roce_cfg_sgid_tb {
        __le32  vf_sgid_type_rsv;
 };
 
-enum {
-       HNS_ROCE_CFG_QPC_SIZE = BIT(0),
-       HNS_ROCE_CFG_SCCC_SIZE = BIT(1),
-};
-
-struct hns_roce_cfg_entry_size {
-       __le32  type;
-       __le32  rsv[4];
-       __le32  size;
-};
-
 #define CFG_SGID_TB_TABLE_IDX_S 0
 #define CFG_SGID_TB_TABLE_IDX_M GENMASK(7, 0)
 
@@ -1670,16 +1510,6 @@ struct hns_roce_cfg_smac_tb {
 #define CFG_SMAC_TB_VF_SMAC_H_S 0
 #define CFG_SMAC_TB_VF_SMAC_H_M GENMASK(15, 0)
 
-struct hns_roce_cfg_gmv_bt {
-       __le32 gmv_ba_l;
-       __le32 gmv_ba_h;
-       __le32 gmv_bt_idx;
-       __le32 rsv[3];
-};
-
-#define CFG_GMV_BA_H_S 0
-#define CFG_GMV_BA_H_M GENMASK(19, 0)
-
 struct hns_roce_cfg_gmv_tb_a {
        __le32 vf_sgid_l;
        __le32 vf_sgid_ml;
@@ -1805,6 +1635,14 @@ struct hns_roce_query_pf_caps_d {
 #define V2_QUERY_PF_CAPS_D_SQWQE_HOP_NUM_S 24
 #define V2_QUERY_PF_CAPS_D_SQWQE_HOP_NUM_M GENMASK(25, 24)
 
+#define V2_QUERY_PF_CAPS_D_CONG_TYPE_S 26
+#define V2_QUERY_PF_CAPS_D_CONG_TYPE_M GENMASK(29, 26)
+
+struct hns_roce_congestion_algorithm {
+       u8 alg_sel;
+       u8 alg_sub_sel;
+       u8 dip_vld;
+};
 
 #define V2_QUERY_PF_CAPS_D_CEQ_DEPTH_S 0
 #define V2_QUERY_PF_CAPS_D_CEQ_DEPTH_M GENMASK(21, 0)
@@ -1859,18 +1697,27 @@ struct hns_roce_query_pf_caps_e {
 #define V2_QUERY_PF_CAPS_E_RSV_LKEYS_S 0
 #define V2_QUERY_PF_CAPS_E_RSV_LKEYS_M GENMASK(19, 0)
 
+struct hns_roce_cmq_req {
+       __le32 data[6];
+};
+
+#define CMQ_REQ_FIELD_LOC(h, l) FIELD_LOC(struct hns_roce_cmq_req, h, l)
+
 struct hns_roce_cmq_desc {
        __le16 opcode;
        __le16 flag;
        __le16 retval;
        __le16 rsv;
-       __le32 data[6];
-};
-
-#define HNS_ROCE_V2_GO_BIT_TIMEOUT_MSECS       10000
+       union {
+               __le32 data[6];
+               struct {
+                       __le32 own_func_num;
+                       __le32 own_mac_id;
+                       __le32 rsv[4];
+               } func_info;
+       };
 
-#define HNS_ROCE_HW_RUN_BIT_SHIFT      31
-#define HNS_ROCE_HW_MB_STATUS_MASK     0xFF
+};
 
 struct hns_roce_v2_cmq_ring {
        dma_addr_t desc_dma_addr;
@@ -1932,6 +1779,12 @@ struct hns_roce_eq_context {
        __le32  rsv[5];
 };
 
+struct hns_roce_dip {
+       u8 dgid[GID_LEN_V2];
+       u8 dip_idx;
+       struct list_head node;  /* all dips are on a list */
+};
+
 #define HNS_ROCE_AEQ_DEFAULT_BURST_NUM 0x0
 #define HNS_ROCE_AEQ_DEFAULT_INTERVAL  0x0
 #define HNS_ROCE_CEQ_DEFAULT_BURST_NUM 0x0
@@ -1966,8 +1819,7 @@ struct hns_roce_eq_context {
 #define HNS_ROCE_V2_ASYNC_EQE_NUM              0x1000
 
 #define HNS_ROCE_V2_VF_INT_ST_AEQ_OVERFLOW_S   0
-#define HNS_ROCE_V2_VF_INT_ST_BUS_ERR_S                1
-#define HNS_ROCE_V2_VF_INT_ST_OTHER_ERR_S      2
+#define HNS_ROCE_V2_VF_INT_ST_RAS_INT_S                1
 
 #define HNS_ROCE_EQ_DB_CMD_AEQ                 0x0
 #define HNS_ROCE_EQ_DB_CMD_AEQ_ARMED           0x1
@@ -1982,96 +1834,38 @@ struct hns_roce_eq_context {
 #define HNS_ROCE_INT_NAME_LEN                  32
 #define HNS_ROCE_V2_EQN_M GENMASK(23, 0)
 
-#define HNS_ROCE_V2_CONS_IDX_M GENMASK(23, 0)
-
 #define HNS_ROCE_V2_VF_ABN_INT_EN_S 0
 #define HNS_ROCE_V2_VF_ABN_INT_EN_M GENMASK(0, 0)
 #define HNS_ROCE_V2_VF_ABN_INT_ST_M GENMASK(2, 0)
 #define HNS_ROCE_V2_VF_ABN_INT_CFG_M GENMASK(2, 0)
 #define HNS_ROCE_V2_VF_EVENT_INT_EN_M GENMASK(0, 0)
 
-/* WORD0 */
-#define HNS_ROCE_EQC_EQ_ST_S 0
-#define HNS_ROCE_EQC_EQ_ST_M GENMASK(1, 0)
-
-#define HNS_ROCE_EQC_HOP_NUM_S 2
-#define HNS_ROCE_EQC_HOP_NUM_M GENMASK(3, 2)
-
-#define HNS_ROCE_EQC_OVER_IGNORE_S 4
-#define HNS_ROCE_EQC_OVER_IGNORE_M GENMASK(4, 4)
-
-#define HNS_ROCE_EQC_COALESCE_S 5
-#define HNS_ROCE_EQC_COALESCE_M GENMASK(5, 5)
-
-#define HNS_ROCE_EQC_ARM_ST_S 6
-#define HNS_ROCE_EQC_ARM_ST_M GENMASK(7, 6)
-
-#define HNS_ROCE_EQC_EQN_S 8
-#define HNS_ROCE_EQC_EQN_M GENMASK(15, 8)
-
-#define HNS_ROCE_EQC_EQE_CNT_S 16
-#define HNS_ROCE_EQC_EQE_CNT_M GENMASK(31, 16)
-
-/* WORD1 */
-#define HNS_ROCE_EQC_BA_PG_SZ_S 0
-#define HNS_ROCE_EQC_BA_PG_SZ_M GENMASK(3, 0)
-
-#define HNS_ROCE_EQC_BUF_PG_SZ_S 4
-#define HNS_ROCE_EQC_BUF_PG_SZ_M GENMASK(7, 4)
-
-#define HNS_ROCE_EQC_PROD_INDX_S 8
-#define HNS_ROCE_EQC_PROD_INDX_M GENMASK(31, 8)
-
-/* WORD2 */
-#define HNS_ROCE_EQC_MAX_CNT_S 0
-#define HNS_ROCE_EQC_MAX_CNT_M GENMASK(15, 0)
-
-#define HNS_ROCE_EQC_PERIOD_S 16
-#define HNS_ROCE_EQC_PERIOD_M GENMASK(31, 16)
-
-/* WORD3 */
-#define HNS_ROCE_EQC_REPORT_TIMER_S 0
-#define HNS_ROCE_EQC_REPORT_TIMER_M GENMASK(31, 0)
-
-/* WORD4 */
-#define HNS_ROCE_EQC_EQE_BA_L_S 0
-#define HNS_ROCE_EQC_EQE_BA_L_M GENMASK(31, 0)
-
-/* WORD5 */
-#define HNS_ROCE_EQC_EQE_BA_H_S 0
-#define HNS_ROCE_EQC_EQE_BA_H_M GENMASK(28, 0)
-
-/* WORD6 */
-#define HNS_ROCE_EQC_SHIFT_S 0
-#define HNS_ROCE_EQC_SHIFT_M GENMASK(7, 0)
-
-#define HNS_ROCE_EQC_MSI_INDX_S 8
-#define HNS_ROCE_EQC_MSI_INDX_M GENMASK(15, 8)
-
-#define HNS_ROCE_EQC_CUR_EQE_BA_L_S 16
-#define HNS_ROCE_EQC_CUR_EQE_BA_L_M GENMASK(31, 16)
-
-/* WORD7 */
-#define HNS_ROCE_EQC_CUR_EQE_BA_M_S 0
-#define HNS_ROCE_EQC_CUR_EQE_BA_M_M GENMASK(31, 0)
-
-/* WORD8 */
-#define HNS_ROCE_EQC_CUR_EQE_BA_H_S 0
-#define HNS_ROCE_EQC_CUR_EQE_BA_H_M GENMASK(3, 0)
-
-#define HNS_ROCE_EQC_CONS_INDX_S 8
-#define HNS_ROCE_EQC_CONS_INDX_M GENMASK(31, 8)
-
-/* WORD9 */
-#define HNS_ROCE_EQC_NXT_EQE_BA_L_S 0
-#define HNS_ROCE_EQC_NXT_EQE_BA_L_M GENMASK(31, 0)
-
-/* WORD10 */
-#define HNS_ROCE_EQC_NXT_EQE_BA_H_S 0
-#define HNS_ROCE_EQC_NXT_EQE_BA_H_M GENMASK(19, 0)
-
-#define HNS_ROCE_EQC_EQE_SIZE_S 20
-#define HNS_ROCE_EQC_EQE_SIZE_M GENMASK(21, 20)
+#define EQC_FIELD_LOC(h, l) FIELD_LOC(struct hns_roce_eq_context, h, l)
+
+#define EQC_EQ_ST EQC_FIELD_LOC(1, 0)
+#define EQC_EQE_HOP_NUM EQC_FIELD_LOC(3, 2)
+#define EQC_OVER_IGNORE EQC_FIELD_LOC(4, 4)
+#define EQC_COALESCE EQC_FIELD_LOC(5, 5)
+#define EQC_ARM_ST EQC_FIELD_LOC(7, 6)
+#define EQC_EQN EQC_FIELD_LOC(15, 8)
+#define EQC_EQE_CNT EQC_FIELD_LOC(31, 16)
+#define EQC_EQE_BA_PG_SZ EQC_FIELD_LOC(35, 32)
+#define EQC_EQE_BUF_PG_SZ EQC_FIELD_LOC(39, 36)
+#define EQC_EQ_PROD_INDX EQC_FIELD_LOC(63, 40)
+#define EQC_EQ_MAX_CNT EQC_FIELD_LOC(79, 64)
+#define EQC_EQ_PERIOD EQC_FIELD_LOC(95, 80)
+#define EQC_EQE_REPORT_TIMER EQC_FIELD_LOC(127, 96)
+#define EQC_EQE_BA_L EQC_FIELD_LOC(159, 128)
+#define EQC_EQE_BA_H EQC_FIELD_LOC(188, 160)
+#define EQC_SHIFT EQC_FIELD_LOC(199, 192)
+#define EQC_MSI_INDX EQC_FIELD_LOC(207, 200)
+#define EQC_CUR_EQE_BA_L EQC_FIELD_LOC(223, 208)
+#define EQC_CUR_EQE_BA_M EQC_FIELD_LOC(255, 224)
+#define EQC_CUR_EQE_BA_H EQC_FIELD_LOC(259, 256)
+#define EQC_EQ_CONS_INDX EQC_FIELD_LOC(287, 264)
+#define EQC_NEX_EQE_BA_L EQC_FIELD_LOC(319, 288)
+#define EQC_NEX_EQE_BA_H EQC_FIELD_LOC(339, 320)
+#define EQC_EQE_SIZE EQC_FIELD_LOC(341, 340)
 
 #define HNS_ROCE_V2_CEQE_COMP_CQN_S 0
 #define HNS_ROCE_V2_CEQE_COMP_CQN_M GENMASK(23, 0)
@@ -2082,14 +1876,14 @@ struct hns_roce_eq_context {
 #define HNS_ROCE_V2_AEQE_SUB_TYPE_S 8
 #define HNS_ROCE_V2_AEQE_SUB_TYPE_M GENMASK(15, 8)
 
-#define HNS_ROCE_V2_EQ_DB_CMD_S        16
-#define HNS_ROCE_V2_EQ_DB_CMD_M        GENMASK(17, 16)
+#define V2_EQ_DB_TAG_S 0
+#define V2_EQ_DB_TAG_M GENMASK(7, 0)
 
-#define HNS_ROCE_V2_EQ_DB_TAG_S        0
-#define HNS_ROCE_V2_EQ_DB_TAG_M        GENMASK(7, 0)
+#define V2_EQ_DB_CMD_S 16
+#define V2_EQ_DB_CMD_M GENMASK(17, 16)
 
-#define HNS_ROCE_V2_EQ_DB_PARA_S 0
-#define HNS_ROCE_V2_EQ_DB_PARA_M GENMASK(23, 0)
+#define V2_EQ_DB_CONS_IDX_S 0
+#define V2_EQ_DB_CONS_IDX_M GENMASK(23, 0)
 
 #define HNS_ROCE_V2_AEQE_EVENT_QUEUE_NUM_S 0
 #define HNS_ROCE_V2_AEQE_EVENT_QUEUE_NUM_M GENMASK(23, 0)
index c9c0836394a24c90c7ec56d8954c0f04aba80315..6c6e82b11d8bc081278bcb533607ecc4e50ba704 100644 (file)
@@ -42,7 +42,7 @@
 #include "hns_roce_device.h"
 #include "hns_roce_hem.h"
 
-static int hns_roce_set_mac(struct hns_roce_dev *hr_dev, u8 port, u8 *addr)
+static int hns_roce_set_mac(struct hns_roce_dev *hr_dev, u32 port, u8 *addr)
 {
        u8 phy_port;
        u32 i;
@@ -63,7 +63,7 @@ static int hns_roce_set_mac(struct hns_roce_dev *hr_dev, u8 port, u8 *addr)
 static int hns_roce_add_gid(const struct ib_gid_attr *attr, void **context)
 {
        struct hns_roce_dev *hr_dev = to_hr_dev(attr->device);
-       u8 port = attr->port_num - 1;
+       u32 port = attr->port_num - 1;
        int ret;
 
        if (port >= hr_dev->caps.num_ports)
@@ -77,7 +77,7 @@ static int hns_roce_add_gid(const struct ib_gid_attr *attr, void **context)
 static int hns_roce_del_gid(const struct ib_gid_attr *attr, void **context)
 {
        struct hns_roce_dev *hr_dev = to_hr_dev(attr->device);
-       u8 port = attr->port_num - 1;
+       u32 port = attr->port_num - 1;
        int ret;
 
        if (port >= hr_dev->caps.num_ports)
@@ -88,7 +88,7 @@ static int hns_roce_del_gid(const struct ib_gid_attr *attr, void **context)
        return ret;
 }
 
-static int handle_en_event(struct hns_roce_dev *hr_dev, u8 port,
+static int handle_en_event(struct hns_roce_dev *hr_dev, u32 port,
                           unsigned long event)
 {
        struct device *dev = hr_dev->dev;
@@ -128,7 +128,7 @@ static int hns_roce_netdev_event(struct notifier_block *self,
        struct hns_roce_ib_iboe *iboe = NULL;
        struct hns_roce_dev *hr_dev = NULL;
        int ret;
-       u8 port;
+       u32 port;
 
        hr_dev = container_of(self, struct hns_roce_dev, iboe.nb);
        iboe = &hr_dev->iboe;
@@ -207,10 +207,13 @@ static int hns_roce_query_device(struct ib_device *ib_dev,
                props->max_fast_reg_page_list_len = HNS_ROCE_FRMR_MAX_PA;
        }
 
+       if (hr_dev->caps.flags & HNS_ROCE_CAP_FLAG_XRC)
+               props->device_cap_flags |= IB_DEVICE_XRC;
+
        return 0;
 }
 
-static int hns_roce_query_port(struct ib_device *ib_dev, u8 port_num,
+static int hns_roce_query_port(struct ib_device *ib_dev, u32 port_num,
                               struct ib_port_attr *props)
 {
        struct hns_roce_dev *hr_dev = to_hr_dev(ib_dev);
@@ -218,7 +221,7 @@ static int hns_roce_query_port(struct ib_device *ib_dev, u8 port_num,
        struct net_device *net_dev;
        unsigned long flags;
        enum ib_mtu mtu;
-       u8 port;
+       u32 port;
 
        port = port_num - 1;
 
@@ -258,12 +261,12 @@ static int hns_roce_query_port(struct ib_device *ib_dev, u8 port_num,
 }
 
 static enum rdma_link_layer hns_roce_get_link_layer(struct ib_device *device,
-                                                   u8 port_num)
+                                                   u32 port_num)
 {
        return IB_LINK_LAYER_ETHERNET;
 }
 
-static int hns_roce_query_pkey(struct ib_device *ib_dev, u8 port, u16 index,
+static int hns_roce_query_pkey(struct ib_device *ib_dev, u32 port, u16 index,
                               u16 *pkey)
 {
        *pkey = PKEY_ID;
@@ -300,12 +303,14 @@ static int hns_roce_alloc_ucontext(struct ib_ucontext *uctx,
                return -EAGAIN;
 
        resp.qp_tab_size = hr_dev->caps.num_qps;
+       resp.srq_tab_size = hr_dev->caps.num_srqs;
 
        ret = hns_roce_uar_alloc(hr_dev, &context->uar);
        if (ret)
                goto error_fail_uar_alloc;
 
-       if (hr_dev->caps.flags & HNS_ROCE_CAP_FLAG_RECORD_DB) {
+       if (hr_dev->caps.flags & HNS_ROCE_CAP_FLAG_CQ_RECORD_DB ||
+           hr_dev->caps.flags & HNS_ROCE_CAP_FLAG_QP_RECORD_DB) {
                INIT_LIST_HEAD(&context->page_list);
                mutex_init(&context->page_mutex);
        }
@@ -365,7 +370,7 @@ static int hns_roce_mmap(struct ib_ucontext *context,
        }
 }
 
-static int hns_roce_port_immutable(struct ib_device *ib_dev, u8 port_num,
+static int hns_roce_port_immutable(struct ib_device *ib_dev, u32 port_num,
                                   struct ib_port_immutable *immutable)
 {
        struct ib_port_attr attr;
@@ -390,6 +395,19 @@ static void hns_roce_disassociate_ucontext(struct ib_ucontext *ibcontext)
 {
 }
 
+static void hns_roce_get_fw_ver(struct ib_device *device, char *str)
+{
+       u64 fw_ver = to_hr_dev(device)->caps.fw_ver;
+       unsigned int major, minor, sub_minor;
+
+       major = upper_32_bits(fw_ver);
+       minor = high_16_bits(lower_32_bits(fw_ver));
+       sub_minor = low_16_bits(fw_ver);
+
+       snprintf(str, IB_FW_VERSION_NAME_MAX, "%u.%u.%04u", major, minor,
+                sub_minor);
+}
+
 static void hns_roce_unregister_device(struct hns_roce_dev *hr_dev)
 {
        struct hns_roce_ib_iboe *iboe = &hr_dev->iboe;
@@ -405,6 +423,7 @@ static const struct ib_device_ops hns_roce_dev_ops = {
        .uverbs_abi_ver = 1,
        .uverbs_no_driver_id_binding = 1,
 
+       .get_dev_fw_str = hns_roce_get_fw_ver,
        .add_gid = hns_roce_add_gid,
        .alloc_pd = hns_roce_alloc_pd,
        .alloc_ucontext = hns_roce_alloc_ucontext,
@@ -461,6 +480,13 @@ static const struct ib_device_ops hns_roce_dev_srq_ops = {
        INIT_RDMA_OBJ_SIZE(ib_srq, hns_roce_srq, ibsrq),
 };
 
+static const struct ib_device_ops hns_roce_dev_xrcd_ops = {
+       .alloc_xrcd = hns_roce_alloc_xrcd,
+       .dealloc_xrcd = hns_roce_dealloc_xrcd,
+
+       INIT_RDMA_OBJ_SIZE(ib_xrcd, hns_roce_xrcd, ibxrcd),
+};
+
 static int hns_roce_register_device(struct hns_roce_dev *hr_dev)
 {
        int ret;
@@ -484,20 +510,20 @@ static int hns_roce_register_device(struct hns_roce_dev *hr_dev)
        if (hr_dev->caps.flags & HNS_ROCE_CAP_FLAG_REREG_MR)
                ib_set_device_ops(ib_dev, &hns_roce_dev_mr_ops);
 
-       /* MW */
        if (hr_dev->caps.flags & HNS_ROCE_CAP_FLAG_MW)
                ib_set_device_ops(ib_dev, &hns_roce_dev_mw_ops);
 
-       /* FRMR */
        if (hr_dev->caps.flags & HNS_ROCE_CAP_FLAG_FRMR)
                ib_set_device_ops(ib_dev, &hns_roce_dev_frmr_ops);
 
-       /* SRQ */
        if (hr_dev->caps.flags & HNS_ROCE_CAP_FLAG_SRQ) {
                ib_set_device_ops(ib_dev, &hns_roce_dev_srq_ops);
                ib_set_device_ops(ib_dev, hr_dev->hw->hns_roce_dev_srq_ops);
        }
 
+       if (hr_dev->caps.flags & HNS_ROCE_CAP_FLAG_XRC)
+               ib_set_device_ops(ib_dev, &hns_roce_dev_xrcd_ops);
+
        ib_set_device_ops(ib_dev, hr_dev->hw->hns_roce_dev_ops);
        ib_set_device_ops(ib_dev, &hns_roce_dev_ops);
        for (i = 0; i < hr_dev->caps.num_ports; i++) {
@@ -704,7 +730,8 @@ static int hns_roce_setup_hca(struct hns_roce_dev *hr_dev)
        spin_lock_init(&hr_dev->sm_lock);
        spin_lock_init(&hr_dev->bt_cmd_lock);
 
-       if (hr_dev->caps.flags & HNS_ROCE_CAP_FLAG_RECORD_DB) {
+       if (hr_dev->caps.flags & HNS_ROCE_CAP_FLAG_CQ_RECORD_DB ||
+           hr_dev->caps.flags & HNS_ROCE_CAP_FLAG_QP_RECORD_DB) {
                INIT_LIST_HEAD(&hr_dev->pgdir_list);
                mutex_init(&hr_dev->pgdir_mutex);
        }
@@ -727,10 +754,19 @@ static int hns_roce_setup_hca(struct hns_roce_dev *hr_dev)
                goto err_uar_alloc_free;
        }
 
+       if (hr_dev->caps.flags & HNS_ROCE_CAP_FLAG_XRC) {
+               ret = hns_roce_init_xrcd_table(hr_dev);
+               if (ret) {
+                       dev_err(dev, "failed to init xrcd table, ret = %d.\n",
+                               ret);
+                       goto err_pd_table_free;
+               }
+       }
+
        ret = hns_roce_init_mr_table(hr_dev);
        if (ret) {
                dev_err(dev, "Failed to init memory region table.\n");
-               goto err_pd_table_free;
+               goto err_xrcd_table_free;
        }
 
        hns_roce_init_cq_table(hr_dev);
@@ -759,6 +795,10 @@ err_cq_table_free:
        hns_roce_cleanup_cq_table(hr_dev);
        hns_roce_cleanup_mr_table(hr_dev);
 
+err_xrcd_table_free:
+       if (hr_dev->caps.flags & HNS_ROCE_CAP_FLAG_XRC)
+               hns_roce_cleanup_xrcd_table(hr_dev);
+
 err_pd_table_free:
        hns_roce_cleanup_pd_table(hr_dev);
 
@@ -886,6 +926,8 @@ int hns_roce_init(struct hns_roce_dev *hr_dev)
 
        INIT_LIST_HEAD(&hr_dev->qp_list);
        spin_lock_init(&hr_dev->qp_list_lock);
+       INIT_LIST_HEAD(&hr_dev->dip_list);
+       spin_lock_init(&hr_dev->dip_list_lock);
 
        ret = hns_roce_register_device(hr_dev);
        if (ret)
index cca818d05a8f76b3f039c629f1e1b6d99e15b0c2..a5813bf567b2a916af657152beda8cf4727b6ec1 100644 (file)
@@ -137,3 +137,62 @@ void hns_roce_cleanup_uar_table(struct hns_roce_dev *hr_dev)
 {
        hns_roce_bitmap_cleanup(&hr_dev->uar_table.bitmap);
 }
+
+static int hns_roce_xrcd_alloc(struct hns_roce_dev *hr_dev, u32 *xrcdn)
+{
+       unsigned long obj;
+       int ret;
+
+       ret = hns_roce_bitmap_alloc(&hr_dev->xrcd_bitmap, &obj);
+       if (ret)
+               return ret;
+
+       *xrcdn = obj;
+
+       return 0;
+}
+
+static void hns_roce_xrcd_free(struct hns_roce_dev *hr_dev,
+                              u32 xrcdn)
+{
+       hns_roce_bitmap_free(&hr_dev->xrcd_bitmap, xrcdn, BITMAP_NO_RR);
+}
+
+int hns_roce_init_xrcd_table(struct hns_roce_dev *hr_dev)
+{
+       return hns_roce_bitmap_init(&hr_dev->xrcd_bitmap,
+                                   hr_dev->caps.num_xrcds,
+                                   hr_dev->caps.num_xrcds - 1,
+                                   hr_dev->caps.reserved_xrcds, 0);
+}
+
+void hns_roce_cleanup_xrcd_table(struct hns_roce_dev *hr_dev)
+{
+       hns_roce_bitmap_cleanup(&hr_dev->xrcd_bitmap);
+}
+
+int hns_roce_alloc_xrcd(struct ib_xrcd *ib_xrcd, struct ib_udata *udata)
+{
+       struct hns_roce_dev *hr_dev = to_hr_dev(ib_xrcd->device);
+       struct hns_roce_xrcd *xrcd = to_hr_xrcd(ib_xrcd);
+       int ret;
+
+       if (!(hr_dev->caps.flags & HNS_ROCE_CAP_FLAG_XRC))
+               return -EINVAL;
+
+       ret = hns_roce_xrcd_alloc(hr_dev, &xrcd->xrcdn);
+       if (ret) {
+               dev_err(hr_dev->dev, "failed to alloc xrcdn, ret = %d.\n", ret);
+               return ret;
+       }
+
+       return 0;
+}
+
+int hns_roce_dealloc_xrcd(struct ib_xrcd *ib_xrcd, struct ib_udata *udata)
+{
+       hns_roce_xrcd_free(to_hr_dev(ib_xrcd->device),
+                          to_hr_xrcd(ib_xrcd)->xrcdn);
+
+       return 0;
+}
index 004aca9086ab3459bf728304d3cda6079a14ee9a..230a909ba9bcd196d2bd653ae6272aea5c11c8d5 100644 (file)
@@ -98,7 +98,9 @@ void hns_roce_qp_event(struct hns_roce_dev *hr_dev, u32 qpn, int event_type)
        if (hr_dev->hw_rev != HNS_ROCE_HW_VER1 &&
            (event_type == HNS_ROCE_EVENT_TYPE_WQ_CATAS_ERROR ||
             event_type == HNS_ROCE_EVENT_TYPE_INV_REQ_LOCAL_WQ_ERROR ||
-            event_type == HNS_ROCE_EVENT_TYPE_LOCAL_WQ_ACCESS_ERROR)) {
+            event_type == HNS_ROCE_EVENT_TYPE_LOCAL_WQ_ACCESS_ERROR ||
+            event_type == HNS_ROCE_EVENT_TYPE_XRCD_VIOLATION ||
+            event_type == HNS_ROCE_EVENT_TYPE_INVALID_XRCETH)) {
                qp->state = IB_QPS_ERR;
                if (!test_and_set_bit(HNS_ROCE_FLUSH_FLAG, &qp->flush_flag))
                        init_flush_work(hr_dev, qp);
@@ -142,6 +144,8 @@ static void hns_roce_ib_qp_event(struct hns_roce_qp *hr_qp,
                        event.event = IB_EVENT_QP_REQ_ERR;
                        break;
                case HNS_ROCE_EVENT_TYPE_LOCAL_WQ_ACCESS_ERROR:
+               case HNS_ROCE_EVENT_TYPE_XRCD_VIOLATION:
+               case HNS_ROCE_EVENT_TYPE_INVALID_XRCETH:
                        event.event = IB_EVENT_QP_ACCESS_ERR;
                        break;
                default:
@@ -366,8 +370,13 @@ void hns_roce_qp_remove(struct hns_roce_dev *hr_dev, struct hns_roce_qp *hr_qp)
        unsigned long flags;
 
        list_del(&hr_qp->node);
-       list_del(&hr_qp->sq_node);
-       list_del(&hr_qp->rq_node);
+
+       if (hr_qp->ibqp.qp_type != IB_QPT_XRC_TGT)
+               list_del(&hr_qp->sq_node);
+
+       if (hr_qp->ibqp.qp_type != IB_QPT_XRC_INI &&
+           hr_qp->ibqp.qp_type != IB_QPT_XRC_TGT)
+               list_del(&hr_qp->rq_node);
 
        xa_lock_irqsave(xa, flags);
        __xa_erase(xa, hr_qp->qpn & (hr_dev->caps.num_qps - 1));
@@ -478,7 +487,9 @@ static int set_rq_size(struct hns_roce_dev *hr_dev, struct ib_qp_cap *cap,
                                            hr_qp->rq.max_gs);
 
        hr_qp->rq.wqe_cnt = cnt;
-       if (hr_dev->caps.flags & HNS_ROCE_CAP_FLAG_RQ_INLINE)
+       if (hr_dev->caps.flags & HNS_ROCE_CAP_FLAG_RQ_INLINE &&
+           hr_qp->ibqp.qp_type != IB_QPT_UD &&
+           hr_qp->ibqp.qp_type != IB_QPT_GSI)
                hr_qp->rq_inl_buf.wqe_cnt = cnt;
        else
                hr_qp->rq_inl_buf.wqe_cnt = 0;
@@ -776,7 +787,7 @@ static inline bool user_qp_has_sdb(struct hns_roce_dev *hr_dev,
                                   struct hns_roce_ib_create_qp_resp *resp,
                                   struct hns_roce_ib_create_qp *ucmd)
 {
-       return ((hr_dev->caps.flags & HNS_ROCE_CAP_FLAG_SQ_RECORD_DB) &&
+       return ((hr_dev->caps.flags & HNS_ROCE_CAP_FLAG_QP_RECORD_DB) &&
                udata->outlen >= offsetofend(typeof(*resp), cap_flags) &&
                hns_roce_qp_has_sq(init_attr) &&
                udata->inlen >= offsetofend(typeof(*ucmd), sdb_addr));
@@ -787,7 +798,7 @@ static inline bool user_qp_has_rdb(struct hns_roce_dev *hr_dev,
                                   struct ib_udata *udata,
                                   struct hns_roce_ib_create_qp_resp *resp)
 {
-       return ((hr_dev->caps.flags & HNS_ROCE_CAP_FLAG_RECORD_DB) &&
+       return ((hr_dev->caps.flags & HNS_ROCE_CAP_FLAG_QP_RECORD_DB) &&
                udata->outlen >= offsetofend(typeof(*resp), cap_flags) &&
                hns_roce_qp_has_rq(init_attr));
 }
@@ -795,7 +806,7 @@ static inline bool user_qp_has_rdb(struct hns_roce_dev *hr_dev,
 static inline bool kernel_qp_has_rdb(struct hns_roce_dev *hr_dev,
                                     struct ib_qp_init_attr *init_attr)
 {
-       return ((hr_dev->caps.flags & HNS_ROCE_CAP_FLAG_RECORD_DB) &&
+       return ((hr_dev->caps.flags & HNS_ROCE_CAP_FLAG_QP_RECORD_DB) &&
                hns_roce_qp_has_rq(init_attr));
 }
 
@@ -840,11 +851,16 @@ static int alloc_qp_db(struct hns_roce_dev *hr_dev, struct hns_roce_qp *hr_qp,
                        resp->cap_flags |= HNS_ROCE_QP_CAP_RQ_RECORD_DB;
                }
        } else {
-               /* QP doorbell register address */
-               hr_qp->sq.db_reg_l = hr_dev->reg_base + hr_dev->sdb_offset +
-                                    DB_REG_OFFSET * hr_dev->priv_uar.index;
-               hr_qp->rq.db_reg_l = hr_dev->reg_base + hr_dev->odb_offset +
-                                    DB_REG_OFFSET * hr_dev->priv_uar.index;
+               if (hr_dev->pci_dev->revision >= PCI_REVISION_ID_HIP09)
+                       hr_qp->sq.db_reg = hr_dev->mem_base +
+                                          HNS_ROCE_DWQE_SIZE * hr_qp->qpn;
+               else
+                       hr_qp->sq.db_reg =
+                               hr_dev->reg_base + hr_dev->sdb_offset +
+                               DB_REG_OFFSET * hr_dev->priv_uar.index;
+
+               hr_qp->rq.db_reg = hr_dev->reg_base + hr_dev->odb_offset +
+                                  DB_REG_OFFSET * hr_dev->priv_uar.index;
 
                if (kernel_qp_has_rdb(hr_dev, init_attr)) {
                        ret = hns_roce_alloc_db(hr_dev, &hr_qp->rdb, 0);
@@ -1011,36 +1027,36 @@ static int hns_roce_create_qp_common(struct hns_roce_dev *hr_dev,
                }
        }
 
-       ret = alloc_qp_db(hr_dev, hr_qp, init_attr, udata, &ucmd, &resp);
-       if (ret) {
-               ibdev_err(ibdev, "failed to alloc QP doorbell, ret = %d.\n",
-                         ret);
-               goto err_wrid;
-       }
-
        ret = alloc_qp_buf(hr_dev, hr_qp, init_attr, udata, ucmd.buf_addr);
        if (ret) {
                ibdev_err(ibdev, "failed to alloc QP buffer, ret = %d.\n", ret);
-               goto err_db;
+               goto err_buf;
        }
 
        ret = alloc_qpn(hr_dev, hr_qp);
        if (ret) {
                ibdev_err(ibdev, "failed to alloc QPN, ret = %d.\n", ret);
-               goto err_buf;
+               goto err_qpn;
+       }
+
+       ret = alloc_qp_db(hr_dev, hr_qp, init_attr, udata, &ucmd, &resp);
+       if (ret) {
+               ibdev_err(ibdev, "failed to alloc QP doorbell, ret = %d.\n",
+                         ret);
+               goto err_db;
        }
 
        ret = alloc_qpc(hr_dev, hr_qp);
        if (ret) {
                ibdev_err(ibdev, "failed to alloc QP context, ret = %d.\n",
                          ret);
-               goto err_qpn;
+               goto err_qpc;
        }
 
        ret = hns_roce_qp_store(hr_dev, hr_qp, init_attr);
        if (ret) {
                ibdev_err(ibdev, "failed to store QP, ret = %d.\n", ret);
-               goto err_qpc;
+               goto err_store;
        }
 
        if (udata) {
@@ -1055,7 +1071,7 @@ static int hns_roce_create_qp_common(struct hns_roce_dev *hr_dev,
        if (hr_dev->caps.flags & HNS_ROCE_CAP_FLAG_QP_FLOW_CTRL) {
                ret = hr_dev->hw->qp_flow_control_init(hr_dev, hr_qp);
                if (ret)
-                       goto err_store;
+                       goto err_flow_ctrl;
        }
 
        hr_qp->ibqp.qp_num = hr_qp->qpn;
@@ -1065,17 +1081,17 @@ static int hns_roce_create_qp_common(struct hns_roce_dev *hr_dev,
 
        return 0;
 
-err_store:
+err_flow_ctrl:
        hns_roce_qp_remove(hr_dev, hr_qp);
-err_qpc:
+err_store:
        free_qpc(hr_dev, hr_qp);
-err_qpn:
+err_qpc:
+       free_qp_db(hr_dev, hr_qp, udata);
+err_db:
        free_qpn(hr_dev, hr_qp);
-err_buf:
+err_qpn:
        free_qp_buf(hr_dev, hr_qp);
-err_db:
-       free_qp_db(hr_dev, hr_qp, udata);
-err_wrid:
+err_buf:
        free_kernel_wrid(hr_qp);
        return ret;
 }
@@ -1100,11 +1116,16 @@ static int check_qp_type(struct hns_roce_dev *hr_dev, enum ib_qp_type type,
                         bool is_user)
 {
        switch (type) {
+       case IB_QPT_XRC_INI:
+       case IB_QPT_XRC_TGT:
+               if (!(hr_dev->caps.flags & HNS_ROCE_CAP_FLAG_XRC))
+                       goto out;
+               break;
        case IB_QPT_UD:
                if (hr_dev->pci_dev->revision <= PCI_REVISION_ID_HIP08 &&
                    is_user)
                        goto out;
-               fallthrough;
+               break;
        case IB_QPT_RC:
        case IB_QPT_GSI:
                break;
@@ -1124,8 +1145,8 @@ struct ib_qp *hns_roce_create_qp(struct ib_pd *pd,
                                 struct ib_qp_init_attr *init_attr,
                                 struct ib_udata *udata)
 {
-       struct hns_roce_dev *hr_dev = to_hr_dev(pd->device);
-       struct ib_device *ibdev = &hr_dev->ib_dev;
+       struct ib_device *ibdev = pd ? pd->device : init_attr->xrcd->device;
+       struct hns_roce_dev *hr_dev = to_hr_dev(ibdev);
        struct hns_roce_qp *hr_qp;
        int ret;
 
@@ -1137,6 +1158,15 @@ struct ib_qp *hns_roce_create_qp(struct ib_pd *pd,
        if (!hr_qp)
                return ERR_PTR(-ENOMEM);
 
+       if (init_attr->qp_type == IB_QPT_XRC_INI)
+               init_attr->recv_cq = NULL;
+
+       if (init_attr->qp_type == IB_QPT_XRC_TGT) {
+               hr_qp->xrcdn = to_hr_xrcd(init_attr->xrcd)->xrcdn;
+               init_attr->recv_cq = NULL;
+               init_attr->send_cq = NULL;
+       }
+
        if (init_attr->qp_type == IB_QPT_GSI) {
                hr_qp->port = init_attr->port_num - 1;
                hr_qp->phy_port = hr_dev->iboe.phy_port[hr_qp->port];
@@ -1156,20 +1186,18 @@ struct ib_qp *hns_roce_create_qp(struct ib_pd *pd,
 
 int to_hr_qp_type(int qp_type)
 {
-       int transport_type;
-
-       if (qp_type == IB_QPT_RC)
-               transport_type = SERV_TYPE_RC;
-       else if (qp_type == IB_QPT_UC)
-               transport_type = SERV_TYPE_UC;
-       else if (qp_type == IB_QPT_UD)
-               transport_type = SERV_TYPE_UD;
-       else if (qp_type == IB_QPT_GSI)
-               transport_type = SERV_TYPE_UD;
-       else
-               transport_type = -1;
-
-       return transport_type;
+       switch (qp_type) {
+       case IB_QPT_RC:
+               return SERV_TYPE_RC;
+       case IB_QPT_UD:
+       case IB_QPT_GSI:
+               return SERV_TYPE_UD;
+       case IB_QPT_XRC_INI:
+       case IB_QPT_XRC_TGT:
+               return SERV_TYPE_XRC;
+       default:
+               return -1;
+       }
 }
 
 static int check_mtu_validate(struct hns_roce_dev *hr_dev,
index d5a6de0e70956571198f12ce1e41d31a4994fc6c..546d182c577ac232b8e0aefd60984e5a1fb4d4c0 100644 (file)
@@ -314,6 +314,9 @@ static void set_srq_ext_param(struct hns_roce_srq *srq,
 {
        srq->cqn = ib_srq_has_cq(init_attr->srq_type) ?
                   to_hr_cq(init_attr->ext.cq)->cqn : 0;
+
+       srq->xrcdn = (init_attr->srq_type == IB_SRQT_XRC) ?
+                    to_hr_xrcd(init_attr->ext.xrc.xrcd)->xrcdn : 0;
 }
 
 static int set_srq_param(struct hns_roce_srq *srq,
@@ -412,7 +415,7 @@ int hns_roce_create_srq(struct ib_srq *ib_srq,
                }
        }
 
-       srq->db_reg_l = hr_dev->reg_base + SRQ_DB_REG;
+       srq->db_reg = hr_dev->reg_base + SRQ_DB_REG;
        srq->event = hns_roce_ib_srq_event;
        atomic_set(&srq->refcount, 1);
        init_completion(&srq->free);
index 6a79502c8b53cc77627f0b9a578a1d3bc564951e..be4094ac4fac2535ca8970832daf9388f4c7cddf 100644 (file)
@@ -504,15 +504,6 @@ static inline void i40iw_free_resource(struct i40iw_device *iwdev,
        spin_unlock_irqrestore(&iwdev->resource_lock, flags);
 }
 
-/**
- * to_iwhdl - Get the handler from the device pointer
- * @iwdev: device pointer
- **/
-static inline struct i40iw_handler *to_iwhdl(struct i40iw_device *iw_dev)
-{
-       return container_of(iw_dev, struct i40iw_handler, device);
-}
-
 struct i40iw_handler *i40iw_find_netdev(struct net_device *netdev);
 
 /**
index ac65c8237b2ed3eaf684537ae1741a9b3cf1bad1..2450b7dd51f6f56737503ad8341ee95f4d79f90c 100644 (file)
@@ -905,7 +905,7 @@ static int i40iw_send_mpa_reject(struct i40iw_cm_node *cm_node,
 }
 
 /**
- * recv_mpa - process an IETF MPA frame
+ * i40iw_parse_mpa - process an IETF MPA frame
  * @cm_node: connection's node
  * @buffer: Data pointer
  * @type: to return accept or reject
@@ -4360,7 +4360,7 @@ void i40iw_cm_teardown_connections(struct i40iw_device *iwdev, u32 *ipaddr,
 }
 
 /**
- * i40iw_ifdown_notify - process an ifdown on an interface
+ * i40iw_if_notify - process an ifdown on an interface
  * @iwdev: device pointer
  * @netdev: network interface device structure
  * @ipaddr: Pointer to IPv4 or IPv6 address
index 8bd72af9e09900865f39e3539c4988e4dc780d0a..b44bfc1d239b2391b84758ec1139c8ef50555d0b 100644 (file)
@@ -285,7 +285,7 @@ static enum i40iw_status_code i40iw_hmc_finish_add_sd_reg(struct i40iw_sc_dev *d
 }
 
 /**
- * i40iw_create_iw_hmc_obj - allocate backing store for hmc objects
+ * i40iw_sc_create_hmc_obj - allocate backing store for hmc objects
  * @dev: pointer to the device structure
  * @info: pointer to i40iw_hmc_iw_create_obj_info struct
  *
@@ -434,7 +434,7 @@ static enum i40iw_status_code i40iw_finish_del_sd_reg(struct i40iw_sc_dev *dev,
 }
 
 /**
- * i40iw_del_iw_hmc_obj - remove pe hmc objects
+ * i40iw_sc_del_hmc_obj - remove pe hmc objects
  * @dev: pointer to the device structure
  * @info: pointer to i40iw_hmc_del_obj_info struct
  * @reset: true if called before reset
index ab4cb11950dc11fbc339a60fa3ec051c1ec3f957..b496f30ce066740704144cc27175f88a452328f5 100644 (file)
@@ -78,7 +78,7 @@ static struct i40e_client i40iw_client;
 static char i40iw_client_name[I40E_CLIENT_STR_LENGTH] = "i40iw";
 
 static LIST_HEAD(i40iw_handlers);
-static spinlock_t i40iw_handler_lock;
+static DEFINE_SPINLOCK(i40iw_handler_lock);
 
 static enum i40iw_status_code i40iw_virtchnl_send(struct i40iw_sc_dev *dev,
                                                  u32 vf_id, u8 *msg, u16 len);
@@ -251,7 +251,7 @@ static void i40iw_destroy_cqp(struct i40iw_device *iwdev, bool free_hwcqp)
 }
 
 /**
- * i40iw_disable_irqs - disable device interrupts
+ * i40iw_disable_irq - disable device interrupts
  * @dev: hardware control device structure
  * @msix_vec: msix vector to disable irq
  * @dev_id: parameter to pass to free_irq (used during irq setup)
@@ -2043,7 +2043,6 @@ static int __init i40iw_init_module(void)
        i40iw_client.ops = &i40e_ops;
        memcpy(i40iw_client.name, i40iw_client_name, I40E_CLIENT_STR_LENGTH);
        i40iw_client.type = I40E_CLIENT_IWARP;
-       spin_lock_init(&i40iw_handler_lock);
        ret = i40e_register_client(&i40iw_client);
        i40iw_register_notifiers();
 
index d474aad62a81d44702680b8dd5327c1e3f0cf74c..d938ccb195b11c0a3e9737bba814f7bfac52a590 100644 (file)
@@ -50,17 +50,6 @@ static inline void set_64bit_val(u64 *wqe_words, u32 byte_index, u64 value)
        wqe_words[byte_index >> 3] = value;
 }
 
-/**
- * set_32bit_val - set 32 value to hw wqe
- * @wqe_words: wqe addr to write
- * @byte_index: index in wqe
- * @value: value to write
- **/
-static inline void set_32bit_val(u32 *wqe_words, u32 byte_index, u32 value)
-{
-       wqe_words[byte_index >> 2] = value;
-}
-
 /**
  * get_64bit_val - read 64 bit value from wqe
  * @wqe_words: wqe addr
@@ -72,17 +61,6 @@ static inline void get_64bit_val(u64 *wqe_words, u32 byte_index, u64 *value)
        *value = wqe_words[byte_index >> 3];
 }
 
-/**
- * get_32bit_val - read 32 bit value from wqe
- * @wqe_words: wqe addr
- * @byte_index: index to reaad from
- * @value: return 32 bit value
- **/
-static inline void get_32bit_val(u32 *wqe_words, u32 byte_index, u32 *value)
-{
-       *value = wqe_words[byte_index >> 2];
-}
-
 struct i40iw_dma_mem {
        void *va;
        dma_addr_t pa;
index 53e5cd1a2bd6e91880567b649c801552d0634c63..146a4148219ba8dccbac3db0cc7cfe946919aed6 100644 (file)
@@ -393,12 +393,9 @@ static enum i40iw_status_code add_pble_pool(struct i40iw_sc_dev *dev,
        i40iw_debug(dev, I40IW_DEBUG_PBLE, "next_fpm_addr = %llx chunk_size[%u] = 0x%x\n",
                    pble_rsrc->next_fpm_addr, chunk->size, chunk->size);
        pble_rsrc->unallocated_pble -= (chunk->size >> 3);
-       list_add(&chunk->list, &pble_rsrc->pinfo.clist);
        sd_reg_val = (sd_entry_type == I40IW_SD_TYPE_PAGED) ?
                        sd_entry->u.pd_table.pd_page_addr.pa : sd_entry->u.bp.addr.pa;
-       if (sd_entry->valid)
-               return 0;
-       if (dev->is_pf) {
+       if (dev->is_pf && !sd_entry->valid) {
                ret_code = i40iw_hmc_sd_one(dev, hmc_info->hmc_fn_id,
                                            sd_reg_val, idx->sd_idx,
                                            sd_entry->entry_type, true);
@@ -409,6 +406,7 @@ static enum i40iw_status_code add_pble_pool(struct i40iw_sc_dev *dev,
        }
 
        sd_entry->valid = true;
+       list_add(&chunk->list, &pble_rsrc->pinfo.clist);
        return 0;
  error:
        kfree(chunk);
index d1c8cc0a62365b9973ab1a0e014dc613414b757c..88fb68e866ba22225d280323128ff04822a62078 100644 (file)
@@ -1000,7 +1000,7 @@ static void i40iw_ilq_putback_rcvbuf(struct i40iw_sc_qp *qp, u32 wqe_idx)
 }
 
 /**
- * i40iw_ieq_get_fpdu - given length return fpdu length
+ * i40iw_ieq_get_fpdu_length - given length return fpdu length
  * @length: length if fpdu
  */
 static u16 i40iw_ieq_get_fpdu_length(u16 length)
index 76f052b12c1410144b0bc43d0580f5cdb1d1e5ff..9ff825f7860b9a1df4a75ebd4e87170955b0e06a 100644 (file)
@@ -890,7 +890,7 @@ void i40iw_terminate_done(struct i40iw_sc_qp *qp, int timeout_occurred)
 }
 
 /**
- * i40iw_terminate_imeout - timeout happened
+ * i40iw_terminate_timeout - timeout happened
  * @t: points to iwarp qp
  */
 static void i40iw_terminate_timeout(struct timer_list *t)
index f18d146a6079fda94837955d04e3378e92cd26dd..b876d722fcc88731a6bf1b3579474b6b5b86fb56 100644 (file)
@@ -94,7 +94,7 @@ static int i40iw_query_device(struct ib_device *ibdev,
  * @props: returning device attributes
  */
 static int i40iw_query_port(struct ib_device *ibdev,
-                           u8 port,
+                           u32 port,
                            struct ib_port_attr *props)
 {
        props->lid = 1;
@@ -647,7 +647,7 @@ error:
 }
 
 /**
- * i40iw_query - query qp attributes
+ * i40iw_query_qp - query qp attributes
  * @ibqp: qp pointer
  * @attr: attributes pointer
  * @attr_mask: Not used
@@ -1846,7 +1846,7 @@ static struct ib_mr *i40iw_get_dma_mr(struct ib_pd *pd, int acc)
 }
 
 /**
- * i40iw_del_mem_list - Deleting pbl list entries for CQ/QP
+ * i40iw_del_memlist - Deleting pbl list entries for CQ/QP
  * @iwmr: iwmr for IB's user page addresses
  * @ucontext: ptr to user context
  */
@@ -2347,7 +2347,7 @@ static int i40iw_req_notify_cq(struct ib_cq *ibcq,
  * @port_num: port number
  * @immutable: immutable data for the port return
  */
-static int i40iw_port_immutable(struct ib_device *ibdev, u8 port_num,
+static int i40iw_port_immutable(struct ib_device *ibdev, u32 port_num,
                                struct ib_port_immutable *immutable)
 {
        struct ib_port_attr attr;
@@ -2446,7 +2446,7 @@ static void i40iw_get_dev_fw_str(struct ib_device *dev, char *str)
  * @port_num: port number
  */
 static struct rdma_hw_stats *i40iw_alloc_hw_stats(struct ib_device *ibdev,
-                                                 u8 port_num)
+                                                 u32 port_num)
 {
        struct i40iw_device *iwdev = to_iwdev(ibdev);
        struct i40iw_sc_dev *dev = &iwdev->sc_dev;
@@ -2477,7 +2477,7 @@ static struct rdma_hw_stats *i40iw_alloc_hw_stats(struct ib_device *ibdev,
  */
 static int i40iw_get_hw_stats(struct ib_device *ibdev,
                              struct rdma_hw_stats *stats,
-                             u8 port_num, int index)
+                             u32 port_num, int index)
 {
        struct i40iw_device *iwdev = to_iwdev(ibdev);
        struct i40iw_sc_dev *dev = &iwdev->sc_dev;
@@ -2504,7 +2504,7 @@ static int i40iw_get_hw_stats(struct ib_device *ibdev,
  * @gid: Global ID
  */
 static int i40iw_query_gid(struct ib_device *ibdev,
-                          u8 port,
+                          u32 port,
                           int index,
                           union ib_gid *gid)
 {
index aca9061688ae09f9e693b82e833d4c1e64a15057..e34a1522132cf2f40557758cb47a4263209b6ed8 100644 (file)
@@ -333,7 +333,7 @@ static void pf_cqp_get_hmc_fcn_callback(struct i40iw_sc_dev *dev, void *callback
 }
 
 /**
- * pf_add_hmc_obj - Callback for Add HMC Object
+ * pf_add_hmc_obj_callback - Callback for Add HMC Object
  * @work_vf_dev: pointer to the VF Device
  */
 static void pf_add_hmc_obj_callback(void *work_vf_dev)
index cca414ecfcd5a0d31f179343f99da0da2aeeb6d9..571d9c542024c2b9aa6f5181eaafa5ee0d65fb37 100644 (file)
@@ -73,12 +73,12 @@ static int get_low_record_time_index(struct mlx4_ib_dev *dev, u8 port,
                                     int *resched_delay_sec);
 
 void mlx4_ib_update_cache_on_guid_change(struct mlx4_ib_dev *dev, int block_num,
-                                        u8 port_num, u8 *p_data)
+                                        u32 port_num, u8 *p_data)
 {
        int i;
        u64 guid_indexes;
        int slave_id;
-       int port_index = port_num - 1;
+       u32 port_index = port_num - 1;
 
        if (!mlx4_is_master(dev->dev))
                return;
@@ -86,7 +86,7 @@ void mlx4_ib_update_cache_on_guid_change(struct mlx4_ib_dev *dev, int block_num,
        guid_indexes = be64_to_cpu((__force __be64) dev->sriov.alias_guid.
                                   ports_guid[port_num - 1].
                                   all_rec_per_port[block_num].guid_indexes);
-       pr_debug("port: %d, guid_indexes: 0x%llx\n", port_num, guid_indexes);
+       pr_debug("port: %u, guid_indexes: 0x%llx\n", port_num, guid_indexes);
 
        for (i = 0; i < NUM_ALIAS_GUID_IN_REC; i++) {
                /* The location of the specific index starts from bit number 4
@@ -184,7 +184,7 @@ unlock:
  * port_number - 1 or 2
  */
 void mlx4_ib_notify_slaves_on_guid_change(struct mlx4_ib_dev *dev,
-                                         int block_num, u8 port_num,
+                                         int block_num, u32 port_num,
                                          u8 *p_data)
 {
        int i;
@@ -206,7 +206,7 @@ void mlx4_ib_notify_slaves_on_guid_change(struct mlx4_ib_dev *dev,
        guid_indexes = be64_to_cpu((__force __be64) dev->sriov.alias_guid.
                                   ports_guid[port_num - 1].
                                   all_rec_per_port[block_num].guid_indexes);
-       pr_debug("port: %d, guid_indexes: 0x%llx\n", port_num, guid_indexes);
+       pr_debug("port: %u, guid_indexes: 0x%llx\n", port_num, guid_indexes);
 
        /*calculate the slaves and notify them*/
        for (i = 0; i < NUM_ALIAS_GUID_IN_REC; i++) {
@@ -260,11 +260,11 @@ void mlx4_ib_notify_slaves_on_guid_change(struct mlx4_ib_dev *dev,
                        new_state = set_and_calc_slave_port_state(dev->dev, slave_id, port_num,
                                                                  MLX4_PORT_STATE_IB_PORT_STATE_EVENT_GID_VALID,
                                                                  &gen_event);
-                       pr_debug("slave: %d, port: %d prev_port_state: %d,"
+                       pr_debug("slave: %d, port: %u prev_port_state: %d,"
                                 " new_port_state: %d, gen_event: %d\n",
                                 slave_id, port_num, prev_state, new_state, gen_event);
                        if (gen_event == SLAVE_PORT_GEN_EVENT_UP) {
-                               pr_debug("sending PORT_UP event to slave: %d, port: %d\n",
+                               pr_debug("sending PORT_UP event to slave: %d, port: %u\n",
                                         slave_id, port_num);
                                mlx4_gen_port_state_change_eqe(dev->dev, slave_id,
                                                               port_num, MLX4_PORT_CHANGE_SUBTYPE_ACTIVE);
@@ -274,7 +274,7 @@ void mlx4_ib_notify_slaves_on_guid_change(struct mlx4_ib_dev *dev,
                                                      MLX4_PORT_STATE_IB_EVENT_GID_INVALID,
                                                      &gen_event);
                        if (gen_event == SLAVE_PORT_GEN_EVENT_DOWN) {
-                               pr_debug("sending PORT DOWN event to slave: %d, port: %d\n",
+                               pr_debug("sending PORT DOWN event to slave: %d, port: %u\n",
                                         slave_id, port_num);
                                mlx4_gen_port_state_change_eqe(dev->dev,
                                                               slave_id,
index f3ace85552f36b17e840326eb5cda325e00d327e..d13ecbdd439171f36103b6abded2307bfca5d61e 100644 (file)
@@ -88,8 +88,8 @@ struct mlx4_rcv_tunnel_mad {
        struct ib_mad mad;
 } __packed;
 
-static void handle_client_rereg_event(struct mlx4_ib_dev *dev, u8 port_num);
-static void handle_lid_change_event(struct mlx4_ib_dev *dev, u8 port_num);
+static void handle_client_rereg_event(struct mlx4_ib_dev *dev, u32 port_num);
+static void handle_lid_change_event(struct mlx4_ib_dev *dev, u32 port_num);
 static void __propagate_pkey_ev(struct mlx4_ib_dev *dev, int port_num,
                                int block, u32 change_bitmap);
 
@@ -186,7 +186,7 @@ int mlx4_MAD_IFC(struct mlx4_ib_dev *dev, int mad_ifc_flags,
        return err;
 }
 
-static void update_sm_ah(struct mlx4_ib_dev *dev, u8 port_num, u16 lid, u8 sl)
+static void update_sm_ah(struct mlx4_ib_dev *dev, u32 port_num, u16 lid, u8 sl)
 {
        struct ib_ah *new_ah;
        struct rdma_ah_attr ah_attr;
@@ -217,8 +217,8 @@ static void update_sm_ah(struct mlx4_ib_dev *dev, u8 port_num, u16 lid, u8 sl)
  * Snoop SM MADs for port info, GUID info, and  P_Key table sets, so we can
  * synthesize LID change, Client-Rereg, GID change, and P_Key change events.
  */
-static void smp_snoop(struct ib_device *ibdev, u8 port_num, const struct ib_mad *mad,
-                     u16 prev_lid)
+static void smp_snoop(struct ib_device *ibdev, u32 port_num,
+                     const struct ib_mad *mad, u16 prev_lid)
 {
        struct ib_port_info *pinfo;
        u16 lid;
@@ -274,7 +274,7 @@ static void smp_snoop(struct ib_device *ibdev, u8 port_num, const struct ib_mad
                                                be16_to_cpu(base[i]);
                                }
                        }
-                       pr_debug("PKEY Change event: port=%d, "
+                       pr_debug("PKEY Change event: port=%u, "
                                 "block=0x%x, change_bitmap=0x%x\n",
                                 port_num, bn, pkey_change_bitmap);
 
@@ -380,7 +380,8 @@ static void node_desc_override(struct ib_device *dev,
        }
 }
 
-static void forward_trap(struct mlx4_ib_dev *dev, u8 port_num, const struct ib_mad *mad)
+static void forward_trap(struct mlx4_ib_dev *dev, u32 port_num,
+                        const struct ib_mad *mad)
 {
        int qpn = mad->mad_hdr.mgmt_class != IB_MGMT_CLASS_SUBN_LID_ROUTED;
        struct ib_mad_send_buf *send_buf;
@@ -429,7 +430,7 @@ static int mlx4_ib_demux_sa_handler(struct ib_device *ibdev, int port, int slave
        return ret;
 }
 
-int mlx4_ib_find_real_gid(struct ib_device *ibdev, u8 port, __be64 guid)
+int mlx4_ib_find_real_gid(struct ib_device *ibdev, u32 port, __be64 guid)
 {
        struct mlx4_ib_dev *dev = to_mdev(ibdev);
        int i;
@@ -443,7 +444,7 @@ int mlx4_ib_find_real_gid(struct ib_device *ibdev, u8 port, __be64 guid)
 
 
 static int find_slave_port_pkey_ix(struct mlx4_ib_dev *dev, int slave,
-                                  u8 port, u16 pkey, u16 *ix)
+                                  u32 port, u16 pkey, u16 *ix)
 {
        int i, ret;
        u8 unassigned_pkey_ix, pkey_ix, partial_ix = 0xFF;
@@ -507,7 +508,7 @@ static int is_proxy_qp0(struct mlx4_ib_dev *dev, int qpn, int slave)
        return (qpn >= proxy_start && qpn <= proxy_start + 1);
 }
 
-int mlx4_ib_send_to_slave(struct mlx4_ib_dev *dev, int slave, u8 port,
+int mlx4_ib_send_to_slave(struct mlx4_ib_dev *dev, int slave, u32 port,
                          enum ib_qp_type dest_qpt, struct ib_wc *wc,
                          struct ib_grh *grh, struct ib_mad *mad)
 {
@@ -678,7 +679,7 @@ end:
        return ret;
 }
 
-static int mlx4_ib_demux_mad(struct ib_device *ibdev, u8 port,
+static int mlx4_ib_demux_mad(struct ib_device *ibdev, u32 port,
                        struct ib_wc *wc, struct ib_grh *grh,
                        struct ib_mad *mad)
 {
@@ -818,7 +819,7 @@ static int mlx4_ib_demux_mad(struct ib_device *ibdev, u8 port,
        return 0;
 }
 
-static int ib_process_mad(struct ib_device *ibdev, int mad_flags, u8 port_num,
+static int ib_process_mad(struct ib_device *ibdev, int mad_flags, u32 port_num,
                        const struct ib_wc *in_wc, const struct ib_grh *in_grh,
                        const struct ib_mad *in_mad, struct ib_mad *out_mad)
 {
@@ -932,9 +933,10 @@ static int iboe_process_mad_port_info(void *out_mad)
        return IB_MAD_RESULT_SUCCESS | IB_MAD_RESULT_REPLY;
 }
 
-static int iboe_process_mad(struct ib_device *ibdev, int mad_flags, u8 port_num,
-                       const struct ib_wc *in_wc, const struct ib_grh *in_grh,
-                       const struct ib_mad *in_mad, struct ib_mad *out_mad)
+static int iboe_process_mad(struct ib_device *ibdev, int mad_flags,
+                           u32 port_num, const struct ib_wc *in_wc,
+                           const struct ib_grh *in_grh,
+                           const struct ib_mad *in_mad, struct ib_mad *out_mad)
 {
        struct mlx4_counter counter_stats;
        struct mlx4_ib_dev *dev = to_mdev(ibdev);
@@ -979,7 +981,7 @@ static int iboe_process_mad(struct ib_device *ibdev, int mad_flags, u8 port_num,
        return err;
 }
 
-int mlx4_ib_process_mad(struct ib_device *ibdev, int mad_flags, u8 port_num,
+int mlx4_ib_process_mad(struct ib_device *ibdev, int mad_flags, u32 port_num,
                        const struct ib_wc *in_wc, const struct ib_grh *in_grh,
                        const struct ib_mad *in, struct ib_mad *out,
                        size_t *out_mad_size, u16 *out_mad_pkey_index)
@@ -1073,7 +1075,7 @@ void mlx4_ib_mad_cleanup(struct mlx4_ib_dev *dev)
        }
 }
 
-static void handle_lid_change_event(struct mlx4_ib_dev *dev, u8 port_num)
+static void handle_lid_change_event(struct mlx4_ib_dev *dev, u32 port_num)
 {
        mlx4_ib_dispatch_event(dev, port_num, IB_EVENT_LID_CHANGE);
 
@@ -1082,7 +1084,7 @@ static void handle_lid_change_event(struct mlx4_ib_dev *dev, u8 port_num)
                                            MLX4_EQ_PORT_INFO_LID_CHANGE_MASK);
 }
 
-static void handle_client_rereg_event(struct mlx4_ib_dev *dev, u8 port_num)
+static void handle_client_rereg_event(struct mlx4_ib_dev *dev, u32 port_num)
 {
        /* re-configure the alias-guid and mcg's */
        if (mlx4_is_master(dev->dev)) {
@@ -1121,7 +1123,7 @@ static void propagate_pkey_ev(struct mlx4_ib_dev *dev, int port_num,
                            GET_MASK_FROM_EQE(eqe));
 }
 
-static void handle_slaves_guid_change(struct mlx4_ib_dev *dev, u8 port_num,
+static void handle_slaves_guid_change(struct mlx4_ib_dev *dev, u32 port_num,
                                      u32 guid_tbl_blk_num, u32 change_bitmap)
 {
        struct ib_smp *in_mad  = NULL;
@@ -1177,7 +1179,7 @@ void handle_port_mgmt_change_event(struct work_struct *work)
        struct ib_event_work *ew = container_of(work, struct ib_event_work, work);
        struct mlx4_ib_dev *dev = ew->ib_dev;
        struct mlx4_eqe *eqe = &(ew->ib_eqe);
-       u8 port = eqe->event.port_mgmt_change.port;
+       u32 port = eqe->event.port_mgmt_change.port;
        u32 changed_attr;
        u32 tbl_block;
        u32 change_bitmap;
@@ -1274,7 +1276,7 @@ void handle_port_mgmt_change_event(struct work_struct *work)
        kfree(ew);
 }
 
-void mlx4_ib_dispatch_event(struct mlx4_ib_dev *dev, u8 port_num,
+void mlx4_ib_dispatch_event(struct mlx4_ib_dev *dev, u32 port_num,
                            enum ib_event_type type)
 {
        struct ib_event event;
@@ -1351,7 +1353,7 @@ static int mlx4_ib_multiplex_sa_handler(struct ib_device *ibdev, int port,
        return ret;
 }
 
-int mlx4_ib_send_to_wire(struct mlx4_ib_dev *dev, int slave, u8 port,
+int mlx4_ib_send_to_wire(struct mlx4_ib_dev *dev, int slave, u32 port,
                         enum ib_qp_type dest_qpt, u16 pkey_index,
                         u32 remote_qpn, u32 qkey, struct rdma_ah_attr *attr,
                         u8 *s_mac, u16 vlan_id, struct ib_mad *mad)
index f26a0d92084298e4a9a81c0a19cee477f5b88fba..22898d97ecbdac5f2457d5a9b508628719b139ba 100644 (file)
@@ -81,7 +81,7 @@ static const char mlx4_ib_version[] =
 
 static void do_slave_init(struct mlx4_ib_dev *ibdev, int slave, int do_init);
 static enum rdma_link_layer mlx4_ib_port_link_layer(struct ib_device *device,
-                                                   u8 port_num);
+                                                   u32 port_num);
 
 static struct workqueue_struct *wq;
 
@@ -129,7 +129,8 @@ static int num_ib_ports(struct mlx4_dev *dev)
        return ib_ports;
 }
 
-static struct net_device *mlx4_ib_get_netdev(struct ib_device *device, u8 port_num)
+static struct net_device *mlx4_ib_get_netdev(struct ib_device *device,
+                                            u32 port_num)
 {
        struct mlx4_ib_dev *ibdev = to_mdev(device);
        struct net_device *dev;
@@ -160,7 +161,7 @@ static struct net_device *mlx4_ib_get_netdev(struct ib_device *device, u8 port_n
 
 static int mlx4_ib_update_gids_v1(struct gid_entry *gids,
                                  struct mlx4_ib_dev *ibdev,
-                                 u8 port_num)
+                                 u32 port_num)
 {
        struct mlx4_cmd_mailbox *mailbox;
        int err;
@@ -193,7 +194,7 @@ static int mlx4_ib_update_gids_v1(struct gid_entry *gids,
 
 static int mlx4_ib_update_gids_v1_v2(struct gid_entry *gids,
                                     struct mlx4_ib_dev *ibdev,
-                                    u8 port_num)
+                                    u32 port_num)
 {
        struct mlx4_cmd_mailbox *mailbox;
        int err;
@@ -238,7 +239,7 @@ static int mlx4_ib_update_gids_v1_v2(struct gid_entry *gids,
 
 static int mlx4_ib_update_gids(struct gid_entry *gids,
                               struct mlx4_ib_dev *ibdev,
-                              u8 port_num)
+                              u32 port_num)
 {
        if (ibdev->dev->caps.flags2 & MLX4_DEV_CAP_FLAG2_ROCE_V1_V2)
                return mlx4_ib_update_gids_v1_v2(gids, ibdev, port_num);
@@ -407,7 +408,7 @@ int mlx4_ib_gid_index_to_real_index(struct mlx4_ib_dev *ibdev,
        int real_index = -EINVAL;
        int i;
        unsigned long flags;
-       u8 port_num = attr->port_num;
+       u32 port_num = attr->port_num;
 
        if (port_num > MLX4_MAX_PORTS)
                return -EINVAL;
@@ -649,7 +650,7 @@ out:
 }
 
 static enum rdma_link_layer
-mlx4_ib_port_link_layer(struct ib_device *device, u8 port_num)
+mlx4_ib_port_link_layer(struct ib_device *device, u32 port_num)
 {
        struct mlx4_dev *dev = to_mdev(device)->dev;
 
@@ -657,7 +658,7 @@ mlx4_ib_port_link_layer(struct ib_device *device, u8 port_num)
                IB_LINK_LAYER_INFINIBAND : IB_LINK_LAYER_ETHERNET;
 }
 
-static int ib_link_query_port(struct ib_device *ibdev, u8 port,
+static int ib_link_query_port(struct ib_device *ibdev, u32 port,
                              struct ib_port_attr *props, int netw_view)
 {
        struct ib_smp *in_mad  = NULL;
@@ -753,7 +754,7 @@ static u8 state_to_phys_state(enum ib_port_state state)
                IB_PORT_PHYS_STATE_LINK_UP : IB_PORT_PHYS_STATE_DISABLED;
 }
 
-static int eth_link_query_port(struct ib_device *ibdev, u8 port,
+static int eth_link_query_port(struct ib_device *ibdev, u32 port,
                               struct ib_port_attr *props)
 {
 
@@ -814,7 +815,7 @@ out:
        return err;
 }
 
-int __mlx4_ib_query_port(struct ib_device *ibdev, u8 port,
+int __mlx4_ib_query_port(struct ib_device *ibdev, u32 port,
                         struct ib_port_attr *props, int netw_view)
 {
        int err;
@@ -828,14 +829,14 @@ int __mlx4_ib_query_port(struct ib_device *ibdev, u8 port,
        return err;
 }
 
-static int mlx4_ib_query_port(struct ib_device *ibdev, u8 port,
+static int mlx4_ib_query_port(struct ib_device *ibdev, u32 port,
                              struct ib_port_attr *props)
 {
        /* returns host view */
        return __mlx4_ib_query_port(ibdev, port, props, 0);
 }
 
-int __mlx4_ib_query_gid(struct ib_device *ibdev, u8 port, int index,
+int __mlx4_ib_query_gid(struct ib_device *ibdev, u32 port, int index,
                        union ib_gid *gid, int netw_view)
 {
        struct ib_smp *in_mad  = NULL;
@@ -891,7 +892,7 @@ out:
        return err;
 }
 
-static int mlx4_ib_query_gid(struct ib_device *ibdev, u8 port, int index,
+static int mlx4_ib_query_gid(struct ib_device *ibdev, u32 port, int index,
                             union ib_gid *gid)
 {
        if (rdma_protocol_ib(ibdev, port))
@@ -899,7 +900,8 @@ static int mlx4_ib_query_gid(struct ib_device *ibdev, u8 port, int index,
        return 0;
 }
 
-static int mlx4_ib_query_sl2vl(struct ib_device *ibdev, u8 port, u64 *sl2vl_tbl)
+static int mlx4_ib_query_sl2vl(struct ib_device *ibdev, u32 port,
+                              u64 *sl2vl_tbl)
 {
        union sl2vl_tbl_to_u64 sl2vl64;
        struct ib_smp *in_mad  = NULL;
@@ -959,7 +961,7 @@ static void mlx4_init_sl2vl_tbl(struct mlx4_ib_dev *mdev)
        }
 }
 
-int __mlx4_ib_query_pkey(struct ib_device *ibdev, u8 port, u16 index,
+int __mlx4_ib_query_pkey(struct ib_device *ibdev, u32 port, u16 index,
                         u16 *pkey, int netw_view)
 {
        struct ib_smp *in_mad  = NULL;
@@ -992,7 +994,8 @@ out:
        return err;
 }
 
-static int mlx4_ib_query_pkey(struct ib_device *ibdev, u8 port, u16 index, u16 *pkey)
+static int mlx4_ib_query_pkey(struct ib_device *ibdev, u32 port, u16 index,
+                             u16 *pkey)
 {
        return __mlx4_ib_query_pkey(ibdev, port, index, pkey, 0);
 }
@@ -1033,8 +1036,8 @@ static int mlx4_ib_modify_device(struct ib_device *ibdev, int mask,
        return 0;
 }
 
-static int mlx4_ib_SET_PORT(struct mlx4_ib_dev *dev, u8 port, int reset_qkey_viols,
-                           u32 cap_mask)
+static int mlx4_ib_SET_PORT(struct mlx4_ib_dev *dev, u32 port,
+                           int reset_qkey_viols, u32 cap_mask)
 {
        struct mlx4_cmd_mailbox *mailbox;
        int err;
@@ -1059,7 +1062,7 @@ static int mlx4_ib_SET_PORT(struct mlx4_ib_dev *dev, u8 port, int reset_qkey_vio
        return err;
 }
 
-static int mlx4_ib_modify_port(struct ib_device *ibdev, u8 port, int mask,
+static int mlx4_ib_modify_port(struct ib_device *ibdev, u32 port, int mask,
                               struct ib_port_modify *props)
 {
        struct mlx4_ib_dev *mdev = to_mdev(ibdev);
@@ -2103,7 +2106,7 @@ static const struct diag_counter diag_device_only[] = {
 };
 
 static struct rdma_hw_stats *mlx4_ib_alloc_hw_stats(struct ib_device *ibdev,
-                                                   u8 port_num)
+                                                   u32 port_num)
 {
        struct mlx4_ib_dev *dev = to_mdev(ibdev);
        struct mlx4_ib_diag_counters *diag = dev->diag_counters;
@@ -2118,7 +2121,7 @@ static struct rdma_hw_stats *mlx4_ib_alloc_hw_stats(struct ib_device *ibdev,
 
 static int mlx4_ib_get_hw_stats(struct ib_device *ibdev,
                                struct rdma_hw_stats *stats,
-                               u8 port, int index)
+                               u32 port, int index)
 {
        struct mlx4_ib_dev *dev = to_mdev(ibdev);
        struct mlx4_ib_diag_counters *diag = dev->diag_counters;
@@ -2466,7 +2469,7 @@ static void mlx4_ib_free_eqs(struct mlx4_dev *dev, struct mlx4_ib_dev *ibdev)
        ibdev->eq_table = NULL;
 }
 
-static int mlx4_port_immutable(struct ib_device *ibdev, u8 port_num,
+static int mlx4_port_immutable(struct ib_device *ibdev, u32 port_num,
                               struct ib_port_immutable *immutable)
 {
        struct ib_port_attr attr;
index 78c9bb79ec75f787d79673092d255e042ca690a7..e856cf23a0a110ab0e37547306c0f848b8869ba0 100644 (file)
@@ -429,7 +429,7 @@ struct mlx4_sriov_alias_guid_port_rec_det {
        struct mlx4_sriov_alias_guid_info_rec_det all_rec_per_port[NUM_ALIAS_GUID_REC_IN_PORT];
        struct workqueue_struct *wq;
        struct delayed_work alias_guid_work;
-       u8 port;
+       u32 port;
        u32 state_flags;
        struct mlx4_sriov_alias_guid *parent;
        struct list_head cb_list;
@@ -657,7 +657,7 @@ struct mlx4_ib_qp_tunnel_init_attr {
        struct ib_qp_init_attr init_attr;
        int slave;
        enum ib_qp_type proxy_qp_type;
-       u8 port;
+       u32 port;
 };
 
 struct mlx4_uverbs_ex_query_device {
@@ -810,24 +810,24 @@ int mlx4_ib_post_recv(struct ib_qp *ibqp, const struct ib_recv_wr *wr,
 int mlx4_MAD_IFC(struct mlx4_ib_dev *dev, int mad_ifc_flags,
                 int port, const struct ib_wc *in_wc, const struct ib_grh *in_grh,
                 const void *in_mad, void *response_mad);
-int mlx4_ib_process_mad(struct ib_device *ibdev, int mad_flags, u8 port_num,
+int mlx4_ib_process_mad(struct ib_device *ibdev, int mad_flags, u32 port_num,
                        const struct ib_wc *in_wc, const struct ib_grh *in_grh,
                        const struct ib_mad *in, struct ib_mad *out,
                        size_t *out_mad_size, u16 *out_mad_pkey_index);
 int mlx4_ib_mad_init(struct mlx4_ib_dev *dev);
 void mlx4_ib_mad_cleanup(struct mlx4_ib_dev *dev);
 
-int __mlx4_ib_query_port(struct ib_device *ibdev, u8 port,
+int __mlx4_ib_query_port(struct ib_device *ibdev, u32 port,
                         struct ib_port_attr *props, int netw_view);
-int __mlx4_ib_query_pkey(struct ib_device *ibdev, u8 port, u16 index,
+int __mlx4_ib_query_pkey(struct ib_device *ibdev, u32 port, u16 index,
                         u16 *pkey, int netw_view);
 
-int __mlx4_ib_query_gid(struct ib_device *ibdev, u8 port, int index,
+int __mlx4_ib_query_gid(struct ib_device *ibdev, u32 port, int index,
                        union ib_gid *gid, int netw_view);
 
 static inline bool mlx4_ib_ah_grh_present(struct mlx4_ib_ah *ah)
 {
-       u8 port = be32_to_cpu(ah->av.ib.port_pd) >> 24 & 3;
+       u32 port = be32_to_cpu(ah->av.ib.port_pd) >> 24 & 3;
 
        if (rdma_port_get_link_layer(ah->ibah.device, port) == IB_LINK_LAYER_ETHERNET)
                return true;
@@ -841,7 +841,7 @@ void clean_vf_mcast(struct mlx4_ib_demux_ctx *ctx, int slave);
 int mlx4_ib_mcg_init(void);
 void mlx4_ib_mcg_destroy(void);
 
-int mlx4_ib_find_real_gid(struct ib_device *ibdev, u8 port, __be64 guid);
+int mlx4_ib_find_real_gid(struct ib_device *ibdev, u32 port, __be64 guid);
 
 int mlx4_ib_mcg_multiplex_handler(struct ib_device *ibdev, int port, int slave,
                                  struct ib_sa_mad *sa_mad);
@@ -851,16 +851,16 @@ int mlx4_ib_mcg_demux_handler(struct ib_device *ibdev, int port, int slave,
 int mlx4_ib_add_mc(struct mlx4_ib_dev *mdev, struct mlx4_ib_qp *mqp,
                   union ib_gid *gid);
 
-void mlx4_ib_dispatch_event(struct mlx4_ib_dev *dev, u8 port_num,
+void mlx4_ib_dispatch_event(struct mlx4_ib_dev *dev, u32 port_num,
                            enum ib_event_type type);
 
 void mlx4_ib_tunnels_update_work(struct work_struct *work);
 
-int mlx4_ib_send_to_slave(struct mlx4_ib_dev *dev, int slave, u8 port,
+int mlx4_ib_send_to_slave(struct mlx4_ib_dev *dev, int slave, u32 port,
                          enum ib_qp_type qpt, struct ib_wc *wc,
                          struct ib_grh *grh, struct ib_mad *mad);
 
-int mlx4_ib_send_to_wire(struct mlx4_ib_dev *dev, int slave, u8 port,
+int mlx4_ib_send_to_wire(struct mlx4_ib_dev *dev, int slave, u32 port,
                         enum ib_qp_type dest_qpt, u16 pkey_index, u32 remote_qpn,
                         u32 qkey, struct rdma_ah_attr *attr, u8 *s_mac,
                         u16 vlan_id, struct ib_mad *mad);
@@ -884,10 +884,10 @@ void mlx4_ib_invalidate_all_guid_record(struct mlx4_ib_dev *dev, int port);
 
 void mlx4_ib_notify_slaves_on_guid_change(struct mlx4_ib_dev *dev,
                                          int block_num,
-                                         u8 port_num, u8 *p_data);
+                                         u32 port_num, u8 *p_data);
 
 void mlx4_ib_update_cache_on_guid_change(struct mlx4_ib_dev *dev,
-                                        int block_num, u8 port_num,
+                                        int block_num, u32 port_num,
                                         u8 *p_data);
 
 int add_sysfs_port_mcg_attr(struct mlx4_ib_dev *device, int port_num,
index 651785bd57f2de0c1913fd7924eb36b896cbb378..92ddbcc00eb2a51672cf7dd7287e626a5296db6d 100644 (file)
@@ -3135,7 +3135,6 @@ static int build_mlx_header(struct mlx4_ib_qp *qp, const struct ib_ud_wr *wr,
        }
 
        if (is_eth) {
-               struct in6_addr in6;
                u16 ether_type;
                u16 pcp = (be32_to_cpu(ah->av.ib.sl_tclass_flowlabel) >> 29) << 13;
 
@@ -3148,8 +3147,6 @@ static int build_mlx_header(struct mlx4_ib_qp *qp, const struct ib_ud_wr *wr,
                memcpy(sqp->ud_header.eth.dmac_h, ah->av.eth.mac, 6);
                memcpy(&ctrl->srcrb_flags16[0], ah->av.eth.mac, 2);
                memcpy(&ctrl->imm, ah->av.eth.mac + 2, 4);
-               memcpy(&in6, sgid.raw, sizeof(in6));
-
 
                if (!memcmp(sqp->ud_header.eth.smac_h, sqp->ud_header.eth.dmac_h, 6))
                        mlx->flags |= cpu_to_be32(MLX4_WQE_CTRL_FORCE_LOOPBACK);
index b4c009bb0db69d26c47ce0adb79e6f8c8f98d723..f43380106bd02ec660ef7ecb6b58341ea255d077 100644 (file)
@@ -6,6 +6,7 @@ mlx5_ib-y := ah.o \
             cong.o \
             counters.o \
             cq.o \
+            dm.o \
             doorbell.o \
             gsi.o \
             ib_virt.o \
index 234f29912ba9f01cbf51a05417aea8b1d9feb49c..a8db8a051170e19c57b9182ddaaec523cf6bc762 100644 (file)
@@ -47,107 +47,6 @@ int mlx5_cmd_query_cong_params(struct mlx5_core_dev *dev, int cong_point,
        return mlx5_cmd_exec_inout(dev, query_cong_params, in, out);
 }
 
-int mlx5_cmd_alloc_memic(struct mlx5_dm *dm, phys_addr_t *addr,
-                        u64 length, u32 alignment)
-{
-       struct mlx5_core_dev *dev = dm->dev;
-       u64 num_memic_hw_pages = MLX5_CAP_DEV_MEM(dev, memic_bar_size)
-                                       >> PAGE_SHIFT;
-       u64 hw_start_addr = MLX5_CAP64_DEV_MEM(dev, memic_bar_start_addr);
-       u32 max_alignment = MLX5_CAP_DEV_MEM(dev, log_max_memic_addr_alignment);
-       u32 num_pages = DIV_ROUND_UP(length, PAGE_SIZE);
-       u32 out[MLX5_ST_SZ_DW(alloc_memic_out)] = {};
-       u32 in[MLX5_ST_SZ_DW(alloc_memic_in)] = {};
-       u32 mlx5_alignment;
-       u64 page_idx = 0;
-       int ret = 0;
-
-       if (!length || (length & MLX5_MEMIC_ALLOC_SIZE_MASK))
-               return -EINVAL;
-
-       /* mlx5 device sets alignment as 64*2^driver_value
-        * so normalizing is needed.
-        */
-       mlx5_alignment = (alignment < MLX5_MEMIC_BASE_ALIGN) ? 0 :
-                        alignment - MLX5_MEMIC_BASE_ALIGN;
-       if (mlx5_alignment > max_alignment)
-               return -EINVAL;
-
-       MLX5_SET(alloc_memic_in, in, opcode, MLX5_CMD_OP_ALLOC_MEMIC);
-       MLX5_SET(alloc_memic_in, in, range_size, num_pages * PAGE_SIZE);
-       MLX5_SET(alloc_memic_in, in, memic_size, length);
-       MLX5_SET(alloc_memic_in, in, log_memic_addr_alignment,
-                mlx5_alignment);
-
-       while (page_idx < num_memic_hw_pages) {
-               spin_lock(&dm->lock);
-               page_idx = bitmap_find_next_zero_area(dm->memic_alloc_pages,
-                                                     num_memic_hw_pages,
-                                                     page_idx,
-                                                     num_pages, 0);
-
-               if (page_idx < num_memic_hw_pages)
-                       bitmap_set(dm->memic_alloc_pages,
-                                  page_idx, num_pages);
-
-               spin_unlock(&dm->lock);
-
-               if (page_idx >= num_memic_hw_pages)
-                       break;
-
-               MLX5_SET64(alloc_memic_in, in, range_start_addr,
-                          hw_start_addr + (page_idx * PAGE_SIZE));
-
-               ret = mlx5_cmd_exec_inout(dev, alloc_memic, in, out);
-               if (ret) {
-                       spin_lock(&dm->lock);
-                       bitmap_clear(dm->memic_alloc_pages,
-                                    page_idx, num_pages);
-                       spin_unlock(&dm->lock);
-
-                       if (ret == -EAGAIN) {
-                               page_idx++;
-                               continue;
-                       }
-
-                       return ret;
-               }
-
-               *addr = dev->bar_addr +
-                       MLX5_GET64(alloc_memic_out, out, memic_start_addr);
-
-               return 0;
-       }
-
-       return -ENOMEM;
-}
-
-void mlx5_cmd_dealloc_memic(struct mlx5_dm *dm, phys_addr_t addr, u64 length)
-{
-       struct mlx5_core_dev *dev = dm->dev;
-       u64 hw_start_addr = MLX5_CAP64_DEV_MEM(dev, memic_bar_start_addr);
-       u32 num_pages = DIV_ROUND_UP(length, PAGE_SIZE);
-       u32 in[MLX5_ST_SZ_DW(dealloc_memic_in)] = {};
-       u64 start_page_idx;
-       int err;
-
-       addr -= dev->bar_addr;
-       start_page_idx = (addr - hw_start_addr) >> PAGE_SHIFT;
-
-       MLX5_SET(dealloc_memic_in, in, opcode, MLX5_CMD_OP_DEALLOC_MEMIC);
-       MLX5_SET64(dealloc_memic_in, in, memic_start_addr, addr);
-       MLX5_SET(dealloc_memic_in, in, memic_size, length);
-
-       err =  mlx5_cmd_exec_in(dev, dealloc_memic, in);
-       if (err)
-               return;
-
-       spin_lock(&dm->lock);
-       bitmap_clear(dm->memic_alloc_pages,
-                    start_page_idx, num_pages);
-       spin_unlock(&dm->lock);
-}
-
 void mlx5_cmd_destroy_tir(struct mlx5_core_dev *dev, u32 tirn, u16 uid)
 {
        u32 in[MLX5_ST_SZ_DW(destroy_tir_in)] = {};
index 88ea6ef8f2cbd297707694ac397fc85f24013649..66c96292ed432e54f711dcc74b20256cfd33179b 100644 (file)
@@ -41,9 +41,6 @@ int mlx5_cmd_dump_fill_mkey(struct mlx5_core_dev *dev, u32 *mkey);
 int mlx5_cmd_null_mkey(struct mlx5_core_dev *dev, u32 *null_mkey);
 int mlx5_cmd_query_cong_params(struct mlx5_core_dev *dev, int cong_point,
                               void *out);
-int mlx5_cmd_alloc_memic(struct mlx5_dm *dm, phys_addr_t *addr,
-                        u64 length, u32 alignment);
-void mlx5_cmd_dealloc_memic(struct mlx5_dm *dm, phys_addr_t addr, u64 length);
 int mlx5_cmd_dealloc_pd(struct mlx5_core_dev *dev, u32 pdn, u16 uid);
 void mlx5_cmd_destroy_tir(struct mlx5_core_dev *dev, u32 tirn, u16 uid);
 void mlx5_cmd_destroy_tis(struct mlx5_core_dev *dev, u32 tisn, u16 uid);
index b9291e482428221e26651bf8c83e4da79bf797d2..0b61df52332aa61b3a2e7e77bfeadd40b37cd6b8 100644 (file)
@@ -267,7 +267,7 @@ static void mlx5_ib_set_cc_param_mask_val(void *field, int offset,
        }
 }
 
-static int mlx5_ib_get_cc_params(struct mlx5_ib_dev *dev, u8 port_num,
+static int mlx5_ib_get_cc_params(struct mlx5_ib_dev *dev, u32 port_num,
                                 int offset, u32 *var)
 {
        int outlen = MLX5_ST_SZ_BYTES(query_cong_params_out);
@@ -304,7 +304,7 @@ alloc_err:
        return err;
 }
 
-static int mlx5_ib_set_cc_params(struct mlx5_ib_dev *dev, u8 port_num,
+static int mlx5_ib_set_cc_params(struct mlx5_ib_dev *dev, u32 port_num,
                                 int offset, u32 var)
 {
        int inlen = MLX5_ST_SZ_BYTES(modify_cong_params_in);
@@ -397,7 +397,7 @@ static const struct file_operations dbg_cc_fops = {
        .read   = get_param,
 };
 
-void mlx5_ib_cleanup_cong_debugfs(struct mlx5_ib_dev *dev, u8 port_num)
+void mlx5_ib_cleanup_cong_debugfs(struct mlx5_ib_dev *dev, u32 port_num)
 {
        if (!mlx5_debugfs_root ||
            !dev->port[port_num].dbg_cc_params ||
@@ -409,7 +409,7 @@ void mlx5_ib_cleanup_cong_debugfs(struct mlx5_ib_dev *dev, u8 port_num)
        dev->port[port_num].dbg_cc_params = NULL;
 }
 
-void mlx5_ib_init_cong_debugfs(struct mlx5_ib_dev *dev, u8 port_num)
+void mlx5_ib_init_cong_debugfs(struct mlx5_ib_dev *dev, u32 port_num)
 {
        struct mlx5_ib_dbg_cc_params *dbg_cc_params;
        struct mlx5_core_dev *mdev;
index 084652e2b15aa22098eeab35f2ae95510a06299d..e365341057cbe268d432e761a29921ac90bf4265 100644 (file)
@@ -139,7 +139,7 @@ static int mlx5_ib_create_counters(struct ib_counters *counters,
 
 
 static const struct mlx5_ib_counters *get_counters(struct mlx5_ib_dev *dev,
-                                                  u8 port_num)
+                                                  u32 port_num)
 {
        return is_mdev_switchdev_mode(dev->mdev) ? &dev->port[0].cnts :
                                                   &dev->port[port_num].cnts;
@@ -154,7 +154,7 @@ static const struct mlx5_ib_counters *get_counters(struct mlx5_ib_dev *dev,
  * device port combination in switchdev and non switchdev mode of the
  * parent device.
  */
-u16 mlx5_ib_get_counters_id(struct mlx5_ib_dev *dev, u8 port_num)
+u16 mlx5_ib_get_counters_id(struct mlx5_ib_dev *dev, u32 port_num)
 {
        const struct mlx5_ib_counters *cnts = get_counters(dev, port_num);
 
@@ -162,7 +162,7 @@ u16 mlx5_ib_get_counters_id(struct mlx5_ib_dev *dev, u8 port_num)
 }
 
 static struct rdma_hw_stats *mlx5_ib_alloc_hw_stats(struct ib_device *ibdev,
-                                                   u8 port_num)
+                                                   u32 port_num)
 {
        struct mlx5_ib_dev *dev = to_mdev(ibdev);
        const struct mlx5_ib_counters *cnts;
@@ -236,13 +236,13 @@ free:
 
 static int mlx5_ib_get_hw_stats(struct ib_device *ibdev,
                                struct rdma_hw_stats *stats,
-                               u8 port_num, int index)
+                               u32 port_num, int index)
 {
        struct mlx5_ib_dev *dev = to_mdev(ibdev);
        const struct mlx5_ib_counters *cnts = get_counters(dev, port_num - 1);
        struct mlx5_core_dev *mdev;
        int ret, num_counters;
-       u8 mdev_port_num;
+       u32 mdev_port_num;
 
        if (!stats)
                return -EINVAL;
index 1aa30c2f3f4ddd4f1523b9bd6ea8da95ed8054a5..6bcaaa52e2b2429e1144525814336751a9d7eeff 100644 (file)
@@ -13,5 +13,5 @@ void mlx5_ib_counters_cleanup(struct mlx5_ib_dev *dev);
 void mlx5_ib_counters_clear_description(struct ib_counters *counters);
 int mlx5_ib_flow_counters_set_data(struct ib_counters *ibcounters,
                                   struct mlx5_ib_create_flow *ucmd);
-u16 mlx5_ib_get_counters_id(struct mlx5_ib_dev *dev, u8 port_num);
+u16 mlx5_ib_get_counters_id(struct mlx5_ib_dev *dev, u32 port_num);
 #endif /* _MLX5_IB_COUNTERS_H */
index 07b8350929cd62dedf5c513cd43bdde3e72b09ba..a0b677accd96516cc748084fb630606711ea7e93 100644 (file)
@@ -2185,27 +2185,69 @@ static int devx_umem_get(struct mlx5_ib_dev *dev, struct ib_ucontext *ucontext,
        return 0;
 }
 
+static unsigned int devx_umem_find_best_pgsize(struct ib_umem *umem,
+                                              unsigned long pgsz_bitmap)
+{
+       unsigned long page_size;
+
+       /* Don't bother checking larger page sizes as offset must be zero and
+        * total DEVX umem length must be equal to total umem length.
+        */
+       pgsz_bitmap &= GENMASK_ULL(max_t(u64, order_base_2(umem->length),
+                                        PAGE_SHIFT),
+                                  MLX5_ADAPTER_PAGE_SHIFT);
+       if (!pgsz_bitmap)
+               return 0;
+
+       page_size = ib_umem_find_best_pgoff(umem, pgsz_bitmap, U64_MAX);
+       if (!page_size)
+               return 0;
+
+       /* If the page_size is less than the CPU page size then we can use the
+        * offset and create a umem which is a subset of the page list.
+        * For larger page sizes we can't be sure the DMA  list reflects the
+        * VA so we must ensure that the umem extent is exactly equal to the
+        * page list. Reduce the page size until one of these cases is true.
+        */
+       while ((ib_umem_dma_offset(umem, page_size) != 0 ||
+               (umem->length % page_size) != 0) &&
+               page_size > PAGE_SIZE)
+               page_size /= 2;
+
+       return page_size;
+}
+
 static int devx_umem_reg_cmd_alloc(struct mlx5_ib_dev *dev,
                                   struct uverbs_attr_bundle *attrs,
                                   struct devx_umem *obj,
                                   struct devx_umem_reg_cmd *cmd)
 {
+       unsigned long pgsz_bitmap;
        unsigned int page_size;
        __be64 *mtt;
        void *umem;
+       int ret;
 
        /*
-        * We don't know what the user intends to use this umem for, but the HW
-        * restrictions must be met. MR, doorbell records, QP, WQ and CQ all
-        * have different requirements. Since we have no idea how to sort this
-        * out, only support PAGE_SIZE with the expectation that userspace will
-        * provide the necessary alignments inside the known PAGE_SIZE and that
-        * FW will check everything.
+        * If the user does not pass in pgsz_bitmap then the user promises not
+        * to use umem_offset!=0 in any commands that allocate on top of the
+        * umem.
+        *
+        * If the user wants to use a umem_offset then it must pass in
+        * pgsz_bitmap which guides the maximum page size and thus maximum
+        * object alignment inside the umem. See the PRM.
+        *
+        * Users are not allowed to use IOVA here, mkeys are not supported on
+        * umem.
         */
-       page_size = ib_umem_find_best_pgoff(
-               obj->umem, PAGE_SIZE,
-               __mlx5_page_offset_to_bitmask(__mlx5_bit_sz(umem, page_offset),
-                                             0));
+       ret = uverbs_get_const_default(&pgsz_bitmap, attrs,
+                       MLX5_IB_ATTR_DEVX_UMEM_REG_PGSZ_BITMAP,
+                       GENMASK_ULL(63,
+                                   min(PAGE_SHIFT, MLX5_ADAPTER_PAGE_SHIFT)));
+       if (ret)
+               return ret;
+
+       page_size = devx_umem_find_best_pgsize(obj->umem, pgsz_bitmap);
        if (!page_size)
                return -EINVAL;
 
@@ -2791,6 +2833,8 @@ DECLARE_UVERBS_NAMED_METHOD(
                           UA_MANDATORY),
        UVERBS_ATTR_FLAGS_IN(MLX5_IB_ATTR_DEVX_UMEM_REG_ACCESS,
                             enum ib_access_flags),
+       UVERBS_ATTR_CONST_IN(MLX5_IB_ATTR_DEVX_UMEM_REG_PGSZ_BITMAP,
+                            u64),
        UVERBS_ATTR_PTR_OUT(MLX5_IB_ATTR_DEVX_UMEM_REG_OUT_ID,
                            UVERBS_ATTR_TYPE(u32),
                            UA_MANDATORY));
diff --git a/drivers/infiniband/hw/mlx5/dm.c b/drivers/infiniband/hw/mlx5/dm.c
new file mode 100644 (file)
index 0000000..094bf85
--- /dev/null
@@ -0,0 +1,587 @@
+// SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB
+/*
+ * Copyright (c) 2021, Mellanox Technologies inc. All rights reserved.
+ */
+
+#include <rdma/uverbs_std_types.h>
+#include "dm.h"
+
+#define UVERBS_MODULE_NAME mlx5_ib
+#include <rdma/uverbs_named_ioctl.h>
+
+static int mlx5_cmd_alloc_memic(struct mlx5_dm *dm, phys_addr_t *addr,
+                               u64 length, u32 alignment)
+{
+       struct mlx5_core_dev *dev = dm->dev;
+       u64 num_memic_hw_pages = MLX5_CAP_DEV_MEM(dev, memic_bar_size)
+                                       >> PAGE_SHIFT;
+       u64 hw_start_addr = MLX5_CAP64_DEV_MEM(dev, memic_bar_start_addr);
+       u32 max_alignment = MLX5_CAP_DEV_MEM(dev, log_max_memic_addr_alignment);
+       u32 num_pages = DIV_ROUND_UP(length, PAGE_SIZE);
+       u32 out[MLX5_ST_SZ_DW(alloc_memic_out)] = {};
+       u32 in[MLX5_ST_SZ_DW(alloc_memic_in)] = {};
+       u32 mlx5_alignment;
+       u64 page_idx = 0;
+       int ret = 0;
+
+       if (!length || (length & MLX5_MEMIC_ALLOC_SIZE_MASK))
+               return -EINVAL;
+
+       /* mlx5 device sets alignment as 64*2^driver_value
+        * so normalizing is needed.
+        */
+       mlx5_alignment = (alignment < MLX5_MEMIC_BASE_ALIGN) ? 0 :
+                        alignment - MLX5_MEMIC_BASE_ALIGN;
+       if (mlx5_alignment > max_alignment)
+               return -EINVAL;
+
+       MLX5_SET(alloc_memic_in, in, opcode, MLX5_CMD_OP_ALLOC_MEMIC);
+       MLX5_SET(alloc_memic_in, in, range_size, num_pages * PAGE_SIZE);
+       MLX5_SET(alloc_memic_in, in, memic_size, length);
+       MLX5_SET(alloc_memic_in, in, log_memic_addr_alignment,
+                mlx5_alignment);
+
+       while (page_idx < num_memic_hw_pages) {
+               spin_lock(&dm->lock);
+               page_idx = bitmap_find_next_zero_area(dm->memic_alloc_pages,
+                                                     num_memic_hw_pages,
+                                                     page_idx,
+                                                     num_pages, 0);
+
+               if (page_idx < num_memic_hw_pages)
+                       bitmap_set(dm->memic_alloc_pages,
+                                  page_idx, num_pages);
+
+               spin_unlock(&dm->lock);
+
+               if (page_idx >= num_memic_hw_pages)
+                       break;
+
+               MLX5_SET64(alloc_memic_in, in, range_start_addr,
+                          hw_start_addr + (page_idx * PAGE_SIZE));
+
+               ret = mlx5_cmd_exec_inout(dev, alloc_memic, in, out);
+               if (ret) {
+                       spin_lock(&dm->lock);
+                       bitmap_clear(dm->memic_alloc_pages,
+                                    page_idx, num_pages);
+                       spin_unlock(&dm->lock);
+
+                       if (ret == -EAGAIN) {
+                               page_idx++;
+                               continue;
+                       }
+
+                       return ret;
+               }
+
+               *addr = dev->bar_addr +
+                       MLX5_GET64(alloc_memic_out, out, memic_start_addr);
+
+               return 0;
+       }
+
+       return -ENOMEM;
+}
+
+void mlx5_cmd_dealloc_memic(struct mlx5_dm *dm, phys_addr_t addr,
+                           u64 length)
+{
+       struct mlx5_core_dev *dev = dm->dev;
+       u64 hw_start_addr = MLX5_CAP64_DEV_MEM(dev, memic_bar_start_addr);
+       u32 num_pages = DIV_ROUND_UP(length, PAGE_SIZE);
+       u32 in[MLX5_ST_SZ_DW(dealloc_memic_in)] = {};
+       u64 start_page_idx;
+       int err;
+
+       addr -= dev->bar_addr;
+       start_page_idx = (addr - hw_start_addr) >> PAGE_SHIFT;
+
+       MLX5_SET(dealloc_memic_in, in, opcode, MLX5_CMD_OP_DEALLOC_MEMIC);
+       MLX5_SET64(dealloc_memic_in, in, memic_start_addr, addr);
+       MLX5_SET(dealloc_memic_in, in, memic_size, length);
+
+       err =  mlx5_cmd_exec_in(dev, dealloc_memic, in);
+       if (err)
+               return;
+
+       spin_lock(&dm->lock);
+       bitmap_clear(dm->memic_alloc_pages,
+                    start_page_idx, num_pages);
+       spin_unlock(&dm->lock);
+}
+
+void mlx5_cmd_dealloc_memic_op(struct mlx5_dm *dm, phys_addr_t addr,
+                              u8 operation)
+{
+       u32 in[MLX5_ST_SZ_DW(modify_memic_in)] = {};
+       struct mlx5_core_dev *dev = dm->dev;
+
+       MLX5_SET(modify_memic_in, in, opcode, MLX5_CMD_OP_MODIFY_MEMIC);
+       MLX5_SET(modify_memic_in, in, op_mod, MLX5_MODIFY_MEMIC_OP_MOD_DEALLOC);
+       MLX5_SET(modify_memic_in, in, memic_operation_type, operation);
+       MLX5_SET64(modify_memic_in, in, memic_start_addr, addr - dev->bar_addr);
+
+       mlx5_cmd_exec_in(dev, modify_memic, in);
+}
+
+static int mlx5_cmd_alloc_memic_op(struct mlx5_dm *dm, phys_addr_t addr,
+                                  u8 operation, phys_addr_t *op_addr)
+{
+       u32 out[MLX5_ST_SZ_DW(modify_memic_out)] = {};
+       u32 in[MLX5_ST_SZ_DW(modify_memic_in)] = {};
+       struct mlx5_core_dev *dev = dm->dev;
+       int err;
+
+       MLX5_SET(modify_memic_in, in, opcode, MLX5_CMD_OP_MODIFY_MEMIC);
+       MLX5_SET(modify_memic_in, in, op_mod, MLX5_MODIFY_MEMIC_OP_MOD_ALLOC);
+       MLX5_SET(modify_memic_in, in, memic_operation_type, operation);
+       MLX5_SET64(modify_memic_in, in, memic_start_addr, addr - dev->bar_addr);
+
+       err = mlx5_cmd_exec_inout(dev, modify_memic, in, out);
+       if (err)
+               return err;
+
+       *op_addr = dev->bar_addr +
+                  MLX5_GET64(modify_memic_out, out, memic_operation_addr);
+       return 0;
+}
+
+static int add_dm_mmap_entry(struct ib_ucontext *context,
+                            struct mlx5_user_mmap_entry *mentry, u8 mmap_flag,
+                            size_t size, u64 address)
+{
+       mentry->mmap_flag = mmap_flag;
+       mentry->address = address;
+
+       return rdma_user_mmap_entry_insert_range(
+               context, &mentry->rdma_entry, size,
+               MLX5_IB_MMAP_DEVICE_MEM << 16,
+               (MLX5_IB_MMAP_DEVICE_MEM << 16) + (1UL << 16) - 1);
+}
+
+static void mlx5_ib_dm_memic_free(struct kref *kref)
+{
+       struct mlx5_ib_dm_memic *dm =
+               container_of(kref, struct mlx5_ib_dm_memic, ref);
+       struct mlx5_ib_dev *dev = to_mdev(dm->base.ibdm.device);
+
+       mlx5_cmd_dealloc_memic(&dev->dm, dm->base.dev_addr, dm->base.size);
+       kfree(dm);
+}
+
+static int copy_op_to_user(struct mlx5_ib_dm_op_entry *op_entry,
+                          struct uverbs_attr_bundle *attrs)
+{
+       u64 start_offset;
+       u16 page_idx;
+       int err;
+
+       page_idx = op_entry->mentry.rdma_entry.start_pgoff & 0xFFFF;
+       start_offset = op_entry->op_addr & ~PAGE_MASK;
+       err = uverbs_copy_to(attrs, MLX5_IB_ATTR_DM_MAP_OP_ADDR_RESP_PAGE_INDEX,
+                            &page_idx, sizeof(page_idx));
+       if (err)
+               return err;
+
+       return uverbs_copy_to(attrs,
+                             MLX5_IB_ATTR_DM_MAP_OP_ADDR_RESP_START_OFFSET,
+                             &start_offset, sizeof(start_offset));
+}
+
+static int map_existing_op(struct mlx5_ib_dm_memic *dm, u8 op,
+                          struct uverbs_attr_bundle *attrs)
+{
+       struct mlx5_ib_dm_op_entry *op_entry;
+
+       op_entry = xa_load(&dm->ops, op);
+       if (!op_entry)
+               return -ENOENT;
+
+       return copy_op_to_user(op_entry, attrs);
+}
+
+static int UVERBS_HANDLER(MLX5_IB_METHOD_DM_MAP_OP_ADDR)(
+       struct uverbs_attr_bundle *attrs)
+{
+       struct ib_uobject *uobj = uverbs_attr_get_uobject(
+               attrs, MLX5_IB_ATTR_DM_MAP_OP_ADDR_REQ_HANDLE);
+       struct mlx5_ib_dev *dev = to_mdev(uobj->context->device);
+       struct ib_dm *ibdm = uobj->object;
+       struct mlx5_ib_dm_memic *dm = to_memic(ibdm);
+       struct mlx5_ib_dm_op_entry *op_entry;
+       int err;
+       u8 op;
+
+       err = uverbs_copy_from(&op, attrs, MLX5_IB_ATTR_DM_MAP_OP_ADDR_REQ_OP);
+       if (err)
+               return err;
+
+       if (!(MLX5_CAP_DEV_MEM(dev->mdev, memic_operations) & BIT(op)))
+               return -EOPNOTSUPP;
+
+       mutex_lock(&dm->ops_xa_lock);
+       err = map_existing_op(dm, op, attrs);
+       if (!err || err != -ENOENT)
+               goto err_unlock;
+
+       op_entry = kzalloc(sizeof(*op_entry), GFP_KERNEL);
+       if (!op_entry)
+               goto err_unlock;
+
+       err = mlx5_cmd_alloc_memic_op(&dev->dm, dm->base.dev_addr, op,
+                                     &op_entry->op_addr);
+       if (err) {
+               kfree(op_entry);
+               goto err_unlock;
+       }
+       op_entry->op = op;
+       op_entry->dm = dm;
+
+       err = add_dm_mmap_entry(uobj->context, &op_entry->mentry,
+                               MLX5_IB_MMAP_TYPE_MEMIC_OP, dm->base.size,
+                               op_entry->op_addr & PAGE_MASK);
+       if (err) {
+               mlx5_cmd_dealloc_memic_op(&dev->dm, dm->base.dev_addr, op);
+               kfree(op_entry);
+               goto err_unlock;
+       }
+       /* From this point, entry will be freed by mmap_free */
+       kref_get(&dm->ref);
+
+       err = copy_op_to_user(op_entry, attrs);
+       if (err)
+               goto err_remove;
+
+       err = xa_insert(&dm->ops, op, op_entry, GFP_KERNEL);
+       if (err)
+               goto err_remove;
+       mutex_unlock(&dm->ops_xa_lock);
+
+       return 0;
+
+err_remove:
+       rdma_user_mmap_entry_remove(&op_entry->mentry.rdma_entry);
+err_unlock:
+       mutex_unlock(&dm->ops_xa_lock);
+
+       return err;
+}
+
+static struct ib_dm *handle_alloc_dm_memic(struct ib_ucontext *ctx,
+                                          struct ib_dm_alloc_attr *attr,
+                                          struct uverbs_attr_bundle *attrs)
+{
+       struct mlx5_dm *dm_db = &to_mdev(ctx->device)->dm;
+       struct mlx5_ib_dm_memic *dm;
+       u64 start_offset;
+       u16 page_idx;
+       int err;
+       u64 address;
+
+       if (!MLX5_CAP_DEV_MEM(dm_db->dev, memic))
+               return ERR_PTR(-EOPNOTSUPP);
+
+       dm = kzalloc(sizeof(*dm), GFP_KERNEL);
+       if (!dm)
+               return ERR_PTR(-ENOMEM);
+
+       dm->base.type = MLX5_IB_UAPI_DM_TYPE_MEMIC;
+       dm->base.size = roundup(attr->length, MLX5_MEMIC_BASE_SIZE);
+       dm->base.ibdm.device = ctx->device;
+
+       kref_init(&dm->ref);
+       xa_init(&dm->ops);
+       mutex_init(&dm->ops_xa_lock);
+       dm->req_length = attr->length;
+
+       err = mlx5_cmd_alloc_memic(dm_db, &dm->base.dev_addr,
+                                  dm->base.size, attr->alignment);
+       if (err) {
+               kfree(dm);
+               return ERR_PTR(err);
+       }
+
+       address = dm->base.dev_addr & PAGE_MASK;
+       err = add_dm_mmap_entry(ctx, &dm->mentry, MLX5_IB_MMAP_TYPE_MEMIC,
+                               dm->base.size, address);
+       if (err) {
+               mlx5_cmd_dealloc_memic(dm_db, dm->base.dev_addr, dm->base.size);
+               kfree(dm);
+               return ERR_PTR(err);
+       }
+
+       page_idx = dm->mentry.rdma_entry.start_pgoff & 0xFFFF;
+       err = uverbs_copy_to(attrs, MLX5_IB_ATTR_ALLOC_DM_RESP_PAGE_INDEX,
+                            &page_idx, sizeof(page_idx));
+       if (err)
+               goto err_copy;
+
+       start_offset = dm->base.dev_addr & ~PAGE_MASK;
+       err = uverbs_copy_to(attrs,
+                            MLX5_IB_ATTR_ALLOC_DM_RESP_START_OFFSET,
+                            &start_offset, sizeof(start_offset));
+       if (err)
+               goto err_copy;
+
+       return &dm->base.ibdm;
+
+err_copy:
+       rdma_user_mmap_entry_remove(&dm->mentry.rdma_entry);
+       return ERR_PTR(err);
+}
+
+static enum mlx5_sw_icm_type get_icm_type(int uapi_type)
+{
+       return uapi_type == MLX5_IB_UAPI_DM_TYPE_STEERING_SW_ICM ?
+                      MLX5_SW_ICM_TYPE_STEERING :
+                      MLX5_SW_ICM_TYPE_HEADER_MODIFY;
+}
+
+static struct ib_dm *handle_alloc_dm_sw_icm(struct ib_ucontext *ctx,
+                                           struct ib_dm_alloc_attr *attr,
+                                           struct uverbs_attr_bundle *attrs,
+                                           int type)
+{
+       struct mlx5_core_dev *dev = to_mdev(ctx->device)->mdev;
+       enum mlx5_sw_icm_type icm_type = get_icm_type(type);
+       struct mlx5_ib_dm_icm *dm;
+       u64 act_size;
+       int err;
+
+       dm = kzalloc(sizeof(*dm), GFP_KERNEL);
+       if (!dm)
+               return ERR_PTR(-ENOMEM);
+
+       dm->base.type = type;
+       dm->base.ibdm.device = ctx->device;
+
+       if (!capable(CAP_SYS_RAWIO) || !capable(CAP_NET_RAW)) {
+               err = -EPERM;
+               goto free;
+       }
+
+       if (!(MLX5_CAP_FLOWTABLE_NIC_RX(dev, sw_owner) ||
+             MLX5_CAP_FLOWTABLE_NIC_TX(dev, sw_owner) ||
+             MLX5_CAP_FLOWTABLE_NIC_RX(dev, sw_owner_v2) ||
+             MLX5_CAP_FLOWTABLE_NIC_TX(dev, sw_owner_v2))) {
+               err = -EOPNOTSUPP;
+               goto free;
+       }
+
+       /* Allocation size must a multiple of the basic block size
+        * and a power of 2.
+        */
+       act_size = round_up(attr->length, MLX5_SW_ICM_BLOCK_SIZE(dev));
+       act_size = roundup_pow_of_two(act_size);
+
+       dm->base.size = act_size;
+       err = mlx5_dm_sw_icm_alloc(dev, icm_type, act_size, attr->alignment,
+                                  to_mucontext(ctx)->devx_uid,
+                                  &dm->base.dev_addr, &dm->obj_id);
+       if (err)
+               goto free;
+
+       err = uverbs_copy_to(attrs, MLX5_IB_ATTR_ALLOC_DM_RESP_START_OFFSET,
+                            &dm->base.dev_addr, sizeof(dm->base.dev_addr));
+       if (err) {
+               mlx5_dm_sw_icm_dealloc(dev, icm_type, dm->base.size,
+                                      to_mucontext(ctx)->devx_uid,
+                                      dm->base.dev_addr, dm->obj_id);
+               goto free;
+       }
+       return &dm->base.ibdm;
+free:
+       kfree(dm);
+       return ERR_PTR(err);
+}
+
+struct ib_dm *mlx5_ib_alloc_dm(struct ib_device *ibdev,
+                              struct ib_ucontext *context,
+                              struct ib_dm_alloc_attr *attr,
+                              struct uverbs_attr_bundle *attrs)
+{
+       enum mlx5_ib_uapi_dm_type type;
+       int err;
+
+       err = uverbs_get_const_default(&type, attrs,
+                                      MLX5_IB_ATTR_ALLOC_DM_REQ_TYPE,
+                                      MLX5_IB_UAPI_DM_TYPE_MEMIC);
+       if (err)
+               return ERR_PTR(err);
+
+       mlx5_ib_dbg(to_mdev(ibdev), "alloc_dm req: dm_type=%d user_length=0x%llx log_alignment=%d\n",
+                   type, attr->length, attr->alignment);
+
+       switch (type) {
+       case MLX5_IB_UAPI_DM_TYPE_MEMIC:
+               return handle_alloc_dm_memic(context, attr, attrs);
+       case MLX5_IB_UAPI_DM_TYPE_STEERING_SW_ICM:
+               return handle_alloc_dm_sw_icm(context, attr, attrs, type);
+       case MLX5_IB_UAPI_DM_TYPE_HEADER_MODIFY_SW_ICM:
+               return handle_alloc_dm_sw_icm(context, attr, attrs, type);
+       default:
+               return ERR_PTR(-EOPNOTSUPP);
+       }
+}
+
+static void dm_memic_remove_ops(struct mlx5_ib_dm_memic *dm)
+{
+       struct mlx5_ib_dm_op_entry *entry;
+       unsigned long idx;
+
+       mutex_lock(&dm->ops_xa_lock);
+       xa_for_each(&dm->ops, idx, entry) {
+               xa_erase(&dm->ops, idx);
+               rdma_user_mmap_entry_remove(&entry->mentry.rdma_entry);
+       }
+       mutex_unlock(&dm->ops_xa_lock);
+}
+
+static void mlx5_dm_memic_dealloc(struct mlx5_ib_dm_memic *dm)
+{
+       dm_memic_remove_ops(dm);
+       rdma_user_mmap_entry_remove(&dm->mentry.rdma_entry);
+}
+
+static int mlx5_dm_icm_dealloc(struct mlx5_ib_ucontext *ctx,
+                              struct mlx5_ib_dm_icm *dm)
+{
+       enum mlx5_sw_icm_type type = get_icm_type(dm->base.type);
+       struct mlx5_core_dev *dev = to_mdev(dm->base.ibdm.device)->mdev;
+       int err;
+
+       err = mlx5_dm_sw_icm_dealloc(dev, type, dm->base.size, ctx->devx_uid,
+                                    dm->base.dev_addr, dm->obj_id);
+       if (!err)
+               kfree(dm);
+       return 0;
+}
+
+static int mlx5_ib_dealloc_dm(struct ib_dm *ibdm,
+                             struct uverbs_attr_bundle *attrs)
+{
+       struct mlx5_ib_ucontext *ctx = rdma_udata_to_drv_context(
+               &attrs->driver_udata, struct mlx5_ib_ucontext, ibucontext);
+       struct mlx5_ib_dm *dm = to_mdm(ibdm);
+
+       switch (dm->type) {
+       case MLX5_IB_UAPI_DM_TYPE_MEMIC:
+               mlx5_dm_memic_dealloc(to_memic(ibdm));
+               return 0;
+       case MLX5_IB_UAPI_DM_TYPE_STEERING_SW_ICM:
+       case MLX5_IB_UAPI_DM_TYPE_HEADER_MODIFY_SW_ICM:
+               return mlx5_dm_icm_dealloc(ctx, to_icm(ibdm));
+       default:
+               return -EOPNOTSUPP;
+       }
+}
+
+static int UVERBS_HANDLER(MLX5_IB_METHOD_DM_QUERY)(
+       struct uverbs_attr_bundle *attrs)
+{
+       struct ib_dm *ibdm =
+               uverbs_attr_get_obj(attrs, MLX5_IB_ATTR_QUERY_DM_REQ_HANDLE);
+       struct mlx5_ib_dm *dm = to_mdm(ibdm);
+       struct mlx5_ib_dm_memic *memic;
+       u64 start_offset;
+       u16 page_idx;
+       int err;
+
+       if (dm->type != MLX5_IB_UAPI_DM_TYPE_MEMIC)
+               return -EOPNOTSUPP;
+
+       memic = to_memic(ibdm);
+       page_idx = memic->mentry.rdma_entry.start_pgoff & 0xFFFF;
+       err = uverbs_copy_to(attrs, MLX5_IB_ATTR_QUERY_DM_RESP_PAGE_INDEX,
+                            &page_idx, sizeof(page_idx));
+       if (err)
+               return err;
+
+       start_offset = memic->base.dev_addr & ~PAGE_MASK;
+       err =  uverbs_copy_to(attrs, MLX5_IB_ATTR_QUERY_DM_RESP_START_OFFSET,
+                             &start_offset, sizeof(start_offset));
+       if (err)
+               return err;
+
+       return uverbs_copy_to(attrs, MLX5_IB_ATTR_QUERY_DM_RESP_LENGTH,
+                             &memic->req_length,
+                             sizeof(memic->req_length));
+}
+
+void mlx5_ib_dm_mmap_free(struct mlx5_ib_dev *dev,
+                         struct mlx5_user_mmap_entry *mentry)
+{
+       struct mlx5_ib_dm_op_entry *op_entry;
+       struct mlx5_ib_dm_memic *mdm;
+
+       switch (mentry->mmap_flag) {
+       case MLX5_IB_MMAP_TYPE_MEMIC:
+               mdm = container_of(mentry, struct mlx5_ib_dm_memic, mentry);
+               kref_put(&mdm->ref, mlx5_ib_dm_memic_free);
+               break;
+       case MLX5_IB_MMAP_TYPE_MEMIC_OP:
+               op_entry = container_of(mentry, struct mlx5_ib_dm_op_entry,
+                                       mentry);
+               mdm = op_entry->dm;
+               mlx5_cmd_dealloc_memic_op(&dev->dm, mdm->base.dev_addr,
+                                         op_entry->op);
+               kfree(op_entry);
+               kref_put(&mdm->ref, mlx5_ib_dm_memic_free);
+               break;
+       default:
+               WARN_ON(true);
+       }
+}
+
+DECLARE_UVERBS_NAMED_METHOD(
+       MLX5_IB_METHOD_DM_QUERY,
+       UVERBS_ATTR_IDR(MLX5_IB_ATTR_QUERY_DM_REQ_HANDLE, UVERBS_OBJECT_DM,
+                       UVERBS_ACCESS_READ, UA_MANDATORY),
+       UVERBS_ATTR_PTR_OUT(MLX5_IB_ATTR_QUERY_DM_RESP_START_OFFSET,
+                           UVERBS_ATTR_TYPE(u64), UA_MANDATORY),
+       UVERBS_ATTR_PTR_OUT(MLX5_IB_ATTR_QUERY_DM_RESP_PAGE_INDEX,
+                           UVERBS_ATTR_TYPE(u16), UA_MANDATORY),
+       UVERBS_ATTR_PTR_OUT(MLX5_IB_ATTR_QUERY_DM_RESP_LENGTH,
+                           UVERBS_ATTR_TYPE(u64), UA_MANDATORY));
+
+ADD_UVERBS_ATTRIBUTES_SIMPLE(
+       mlx5_ib_dm, UVERBS_OBJECT_DM, UVERBS_METHOD_DM_ALLOC,
+       UVERBS_ATTR_PTR_OUT(MLX5_IB_ATTR_ALLOC_DM_RESP_START_OFFSET,
+                           UVERBS_ATTR_TYPE(u64), UA_MANDATORY),
+       UVERBS_ATTR_PTR_OUT(MLX5_IB_ATTR_ALLOC_DM_RESP_PAGE_INDEX,
+                           UVERBS_ATTR_TYPE(u16), UA_OPTIONAL),
+       UVERBS_ATTR_CONST_IN(MLX5_IB_ATTR_ALLOC_DM_REQ_TYPE,
+                            enum mlx5_ib_uapi_dm_type, UA_OPTIONAL));
+
+DECLARE_UVERBS_NAMED_METHOD(
+       MLX5_IB_METHOD_DM_MAP_OP_ADDR,
+       UVERBS_ATTR_IDR(MLX5_IB_ATTR_DM_MAP_OP_ADDR_REQ_HANDLE,
+                       UVERBS_OBJECT_DM,
+                       UVERBS_ACCESS_READ,
+                       UA_MANDATORY),
+       UVERBS_ATTR_PTR_IN(MLX5_IB_ATTR_DM_MAP_OP_ADDR_REQ_OP,
+                          UVERBS_ATTR_TYPE(u8),
+                          UA_MANDATORY),
+       UVERBS_ATTR_PTR_OUT(MLX5_IB_ATTR_DM_MAP_OP_ADDR_RESP_START_OFFSET,
+                           UVERBS_ATTR_TYPE(u64),
+                           UA_MANDATORY),
+       UVERBS_ATTR_PTR_OUT(MLX5_IB_ATTR_DM_MAP_OP_ADDR_RESP_PAGE_INDEX,
+                           UVERBS_ATTR_TYPE(u16),
+                           UA_OPTIONAL));
+
+DECLARE_UVERBS_GLOBAL_METHODS(UVERBS_OBJECT_DM,
+                             &UVERBS_METHOD(MLX5_IB_METHOD_DM_MAP_OP_ADDR),
+                             &UVERBS_METHOD(MLX5_IB_METHOD_DM_QUERY));
+
+const struct uapi_definition mlx5_ib_dm_defs[] = {
+       UAPI_DEF_CHAIN_OBJ_TREE(UVERBS_OBJECT_DM, &mlx5_ib_dm),
+       UAPI_DEF_CHAIN_OBJ_TREE_NAMED(UVERBS_OBJECT_DM),
+       {},
+};
+
+const struct ib_device_ops mlx5_ib_dev_dm_ops = {
+       .alloc_dm = mlx5_ib_alloc_dm,
+       .dealloc_dm = mlx5_ib_dealloc_dm,
+       .reg_dm_mr = mlx5_ib_reg_dm_mr,
+};
diff --git a/drivers/infiniband/hw/mlx5/dm.h b/drivers/infiniband/hw/mlx5/dm.h
new file mode 100644 (file)
index 0000000..9674a80
--- /dev/null
@@ -0,0 +1,68 @@
+/* SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB */
+/*
+ * Copyright (c) 2021, Mellanox Technologies inc. All rights reserved.
+ */
+
+#ifndef _MLX5_IB_DM_H
+#define _MLX5_IB_DM_H
+
+#include "mlx5_ib.h"
+
+extern const struct ib_device_ops mlx5_ib_dev_dm_ops;
+extern const struct uapi_definition mlx5_ib_dm_defs[];
+
+struct mlx5_ib_dm {
+       struct ib_dm            ibdm;
+       u32                     type;
+       phys_addr_t             dev_addr;
+       size_t                  size;
+};
+
+struct mlx5_ib_dm_op_entry {
+       struct mlx5_user_mmap_entry     mentry;
+       phys_addr_t                     op_addr;
+       struct mlx5_ib_dm_memic         *dm;
+       u8                              op;
+};
+
+struct mlx5_ib_dm_memic {
+       struct mlx5_ib_dm           base;
+       struct mlx5_user_mmap_entry mentry;
+       struct xarray               ops;
+       struct mutex                ops_xa_lock;
+       struct kref                 ref;
+       size_t                      req_length;
+};
+
+struct mlx5_ib_dm_icm {
+       struct mlx5_ib_dm      base;
+       u32                    obj_id;
+};
+
+static inline struct mlx5_ib_dm *to_mdm(struct ib_dm *ibdm)
+{
+       return container_of(ibdm, struct mlx5_ib_dm, ibdm);
+}
+
+static inline struct mlx5_ib_dm_memic *to_memic(struct ib_dm *ibdm)
+{
+       return container_of(ibdm, struct mlx5_ib_dm_memic, base.ibdm);
+}
+
+static inline struct mlx5_ib_dm_icm *to_icm(struct ib_dm *ibdm)
+{
+       return container_of(ibdm, struct mlx5_ib_dm_icm, base.ibdm);
+}
+
+struct ib_dm *mlx5_ib_alloc_dm(struct ib_device *ibdev,
+                              struct ib_ucontext *context,
+                              struct ib_dm_alloc_attr *attr,
+                              struct uverbs_attr_bundle *attrs);
+void mlx5_ib_dm_mmap_free(struct mlx5_ib_dev *dev,
+                         struct mlx5_user_mmap_entry *mentry);
+void mlx5_cmd_dealloc_memic(struct mlx5_dm *dm, phys_addr_t addr,
+                           u64 length);
+void mlx5_cmd_dealloc_memic_op(struct mlx5_dm *dm, phys_addr_t addr,
+                              u8 operation);
+
+#endif /* _MLX5_IB_DM_H */
index 01370d9a871aa461faab6fe7c985c8f9a73dffed..2fc6a60c4e775e16b6e2164aaada2e9fdb9357e4 100644 (file)
@@ -1528,8 +1528,8 @@ static struct mlx5_ib_flow_handler *raw_fs_rule_add(
                dst_num++;
        }
 
-       handler = _create_raw_flow_rule(dev, ft_prio, dst, fs_matcher,
-                                       flow_context, flow_act,
+       handler = _create_raw_flow_rule(dev, ft_prio, dst_num ? dst : NULL,
+                                       fs_matcher, flow_context, flow_act,
                                        cmd_in, inlen, dst_num);
 
        if (IS_ERR(handler)) {
@@ -1885,8 +1885,9 @@ static int get_dests(struct uverbs_attr_bundle *attrs,
                else
                        *dest_id = mqp->raw_packet_qp.rq.tirn;
                *dest_type = MLX5_FLOW_DESTINATION_TYPE_TIR;
-       } else if (fs_matcher->ns_type == MLX5_FLOW_NAMESPACE_EGRESS ||
-                  fs_matcher->ns_type == MLX5_FLOW_NAMESPACE_RDMA_TX) {
+       } else if ((fs_matcher->ns_type == MLX5_FLOW_NAMESPACE_EGRESS ||
+                   fs_matcher->ns_type == MLX5_FLOW_NAMESPACE_RDMA_TX) &&
+                  !(*flags & MLX5_IB_ATTR_CREATE_FLOW_FLAGS_DROP)) {
                *dest_type = MLX5_FLOW_DESTINATION_TYPE_PORT;
        }
 
index db5de720bb12b958afadc817e2d7687c746c6b3a..b25e0b33a11ac794fe17f918b2805f675fbf8b15 100644 (file)
@@ -29,7 +29,7 @@ mlx5_ib_set_vport_rep(struct mlx5_core_dev *dev, struct mlx5_eswitch_rep *rep)
 static int
 mlx5_ib_vport_rep_load(struct mlx5_core_dev *dev, struct mlx5_eswitch_rep *rep)
 {
-       int num_ports = mlx5_eswitch_get_total_vports(dev);
+       u32 num_ports = mlx5_eswitch_get_total_vports(dev);
        const struct mlx5_ib_profile *profile;
        struct mlx5_ib_dev *ibdev;
        int vport_index;
@@ -110,7 +110,7 @@ struct net_device *mlx5_ib_get_rep_netdev(struct mlx5_eswitch *esw,
 
 struct mlx5_flow_handle *create_flow_rule_vport_sq(struct mlx5_ib_dev *dev,
                                                   struct mlx5_ib_sq *sq,
-                                                  u16 port)
+                                                  u32 port)
 {
        struct mlx5_eswitch *esw = dev->mdev->priv.eswitch;
        struct mlx5_eswitch_rep *rep;
index ce1dcb105dbd070a314e548d3852d5783449be0f..9c55e5c528b49f111afa2fb689c8a16eedc77912 100644 (file)
@@ -16,7 +16,7 @@ int mlx5r_rep_init(void);
 void mlx5r_rep_cleanup(void);
 struct mlx5_flow_handle *create_flow_rule_vport_sq(struct mlx5_ib_dev *dev,
                                                   struct mlx5_ib_sq *sq,
-                                                  u16 port);
+                                                  u32 port);
 struct net_device *mlx5_ib_get_rep_netdev(struct mlx5_eswitch *esw,
                                          u16 vport_num);
 #else /* CONFIG_MLX5_ESWITCH */
@@ -25,7 +25,7 @@ static inline void mlx5r_rep_cleanup(void) {}
 static inline
 struct mlx5_flow_handle *create_flow_rule_vport_sq(struct mlx5_ib_dev *dev,
                                                   struct mlx5_ib_sq *sq,
-                                                  u16 port)
+                                                  u32 port)
 {
        return NULL;
 }
index 46b2d370fb3fcca0f88c6c9102dc0f99db052334..f2f62875d072445d93b850133b74bd5cb8c845b1 100644 (file)
@@ -48,7 +48,7 @@ static inline u32 mlx_to_net_policy(enum port_state_policy mlx_policy)
        }
 }
 
-int mlx5_ib_get_vf_config(struct ib_device *device, int vf, u8 port,
+int mlx5_ib_get_vf_config(struct ib_device *device, int vf, u32 port,
                          struct ifla_vf_info *info)
 {
        struct mlx5_ib_dev *dev = to_mdev(device);
@@ -91,7 +91,7 @@ static inline enum port_state_policy net_to_mlx_policy(int policy)
 }
 
 int mlx5_ib_set_vf_link_state(struct ib_device *device, int vf,
-                             u8 port, int state)
+                             u32 port, int state)
 {
        struct mlx5_ib_dev *dev = to_mdev(device);
        struct mlx5_core_dev *mdev = dev->mdev;
@@ -119,7 +119,7 @@ out:
 }
 
 int mlx5_ib_get_vf_stats(struct ib_device *device, int vf,
-                        u8 port, struct ifla_vf_stats *stats)
+                        u32 port, struct ifla_vf_stats *stats)
 {
        int out_sz = MLX5_ST_SZ_BYTES(query_vport_counter_out);
        struct mlx5_core_dev *mdev;
@@ -149,7 +149,8 @@ ex:
        return err;
 }
 
-static int set_vf_node_guid(struct ib_device *device, int vf, u8 port, u64 guid)
+static int set_vf_node_guid(struct ib_device *device, int vf, u32 port,
+                           u64 guid)
 {
        struct mlx5_ib_dev *dev = to_mdev(device);
        struct mlx5_core_dev *mdev = dev->mdev;
@@ -172,7 +173,8 @@ static int set_vf_node_guid(struct ib_device *device, int vf, u8 port, u64 guid)
        return err;
 }
 
-static int set_vf_port_guid(struct ib_device *device, int vf, u8 port, u64 guid)
+static int set_vf_port_guid(struct ib_device *device, int vf, u32 port,
+                           u64 guid)
 {
        struct mlx5_ib_dev *dev = to_mdev(device);
        struct mlx5_core_dev *mdev = dev->mdev;
@@ -195,7 +197,7 @@ static int set_vf_port_guid(struct ib_device *device, int vf, u8 port, u64 guid)
        return err;
 }
 
-int mlx5_ib_set_vf_guid(struct ib_device *device, int vf, u8 port,
+int mlx5_ib_set_vf_guid(struct ib_device *device, int vf, u32 port,
                        u64 guid, int type)
 {
        if (type == IFLA_VF_IB_NODE_GUID)
@@ -206,7 +208,7 @@ int mlx5_ib_set_vf_guid(struct ib_device *device, int vf, u8 port,
        return -EINVAL;
 }
 
-int mlx5_ib_get_vf_guid(struct ib_device *device, int vf, u8 port,
+int mlx5_ib_get_vf_guid(struct ib_device *device, int vf, u32 port,
                        struct ifla_vf_guid *node_guid,
                        struct ifla_vf_guid *port_guid)
 {
index 652c6ccf188144700768b71f85011be01851d670..ec242a5a17a35ae8dbeb0720c8a475480de614a2 100644 (file)
@@ -42,7 +42,7 @@ enum {
        MLX5_IB_VENDOR_CLASS2 = 0xa
 };
 
-static bool can_do_mad_ifc(struct mlx5_ib_dev *dev, u8 port_num,
+static bool can_do_mad_ifc(struct mlx5_ib_dev *dev, u32 port_num,
                           struct ib_mad *in_mad)
 {
        if (in_mad->mad_hdr.mgmt_class != IB_MGMT_CLASS_SUBN_LID_ROUTED &&
@@ -52,7 +52,7 @@ static bool can_do_mad_ifc(struct mlx5_ib_dev *dev, u8 port_num,
 }
 
 static int mlx5_MAD_IFC(struct mlx5_ib_dev *dev, int ignore_mkey,
-                       int ignore_bkey, u8 port, const struct ib_wc *in_wc,
+                       int ignore_bkey, u32 port, const struct ib_wc *in_wc,
                        const struct ib_grh *in_grh, const void *in_mad,
                        void *response_mad)
 {
@@ -147,12 +147,12 @@ static void pma_cnt_assign(struct ib_pma_portcounters *pma_cnt,
                             vl_15_dropped);
 }
 
-static int process_pma_cmd(struct mlx5_ib_dev *dev, u8 port_num,
+static int process_pma_cmd(struct mlx5_ib_dev *dev, u32 port_num,
                           const struct ib_mad *in_mad, struct ib_mad *out_mad)
 {
        struct mlx5_core_dev *mdev;
        bool native_port = true;
-       u8 mdev_port_num;
+       u32 mdev_port_num;
        void *out_cnt;
        int err;
 
@@ -216,7 +216,7 @@ done:
        return err;
 }
 
-int mlx5_ib_process_mad(struct ib_device *ibdev, int mad_flags, u8 port_num,
+int mlx5_ib_process_mad(struct ib_device *ibdev, int mad_flags, u32 port_num,
                        const struct ib_wc *in_wc, const struct ib_grh *in_grh,
                        const struct ib_mad *in, struct ib_mad *out,
                        size_t *out_mad_size, u16 *out_mad_pkey_index)
@@ -444,7 +444,7 @@ out:
        return err;
 }
 
-int mlx5_query_mad_ifc_pkey(struct ib_device *ibdev, u8 port, u16 index,
+int mlx5_query_mad_ifc_pkey(struct ib_device *ibdev, u32 port, u16 index,
                            u16 *pkey)
 {
        struct ib_smp *in_mad  = NULL;
@@ -473,7 +473,7 @@ out:
        return err;
 }
 
-int mlx5_query_mad_ifc_gids(struct ib_device *ibdev, u8 port, int index,
+int mlx5_query_mad_ifc_gids(struct ib_device *ibdev, u32 port, int index,
                            union ib_gid *gid)
 {
        struct ib_smp *in_mad  = NULL;
@@ -513,7 +513,7 @@ out:
        return err;
 }
 
-int mlx5_query_mad_ifc_port(struct ib_device *ibdev, u8 port,
+int mlx5_query_mad_ifc_port(struct ib_device *ibdev, u32 port,
                            struct ib_port_attr *props)
 {
        struct mlx5_ib_dev *dev = to_mdev(ibdev);
index 7a7f6ccd02a54f88c8dde4ec0dd61dd9554c3b6f..6d1dd09a4388177be9a0fedae2c89d026ace1be4 100644 (file)
@@ -34,6 +34,7 @@
 #include "ib_rep.h"
 #include "cmd.h"
 #include "devx.h"
+#include "dm.h"
 #include "fs.h"
 #include "srq.h"
 #include "qp.h"
@@ -42,6 +43,7 @@
 #include "counters.h"
 #include <linux/mlx5/accel.h>
 #include <rdma/uverbs_std_types.h>
+#include <rdma/uverbs_ioctl.h>
 #include <rdma/mlx5_user_ioctl_verbs.h>
 #include <rdma/mlx5_user_ioctl_cmds.h>
 #include <rdma/ib_umem_odp.h>
@@ -100,7 +102,7 @@ mlx5_port_type_cap_to_rdma_ll(int port_type_cap)
 }
 
 static enum rdma_link_layer
-mlx5_ib_port_link_layer(struct ib_device *device, u8 port_num)
+mlx5_ib_port_link_layer(struct ib_device *device, u32 port_num)
 {
        struct mlx5_ib_dev *dev = to_mdev(device);
        int port_type_cap = MLX5_CAP_GEN(dev->mdev, port_type);
@@ -109,7 +111,7 @@ mlx5_ib_port_link_layer(struct ib_device *device, u8 port_num)
 }
 
 static int get_port_state(struct ib_device *ibdev,
-                         u8 port_num,
+                         u32 port_num,
                          enum ib_port_state *state)
 {
        struct ib_port_attr attr;
@@ -124,7 +126,7 @@ static int get_port_state(struct ib_device *ibdev,
 
 static struct mlx5_roce *mlx5_get_rep_roce(struct mlx5_ib_dev *dev,
                                           struct net_device *ndev,
-                                          u8 *port_num)
+                                          u32 *port_num)
 {
        struct net_device *rep_ndev;
        struct mlx5_ib_port *port;
@@ -154,7 +156,7 @@ static int mlx5_netdev_event(struct notifier_block *this,
 {
        struct mlx5_roce *roce = container_of(this, struct mlx5_roce, nb);
        struct net_device *ndev = netdev_notifier_info_to_dev(ptr);
-       u8 port_num = roce->native_port_num;
+       u32 port_num = roce->native_port_num;
        struct mlx5_core_dev *mdev;
        struct mlx5_ib_dev *ibdev;
 
@@ -233,7 +235,7 @@ done:
 }
 
 static struct net_device *mlx5_ib_get_netdev(struct ib_device *device,
-                                            u8 port_num)
+                                            u32 port_num)
 {
        struct mlx5_ib_dev *ibdev = to_mdev(device);
        struct net_device *ndev;
@@ -261,8 +263,8 @@ out:
 }
 
 struct mlx5_core_dev *mlx5_ib_get_native_port_mdev(struct mlx5_ib_dev *ibdev,
-                                                  u8 ib_port_num,
-                                                  u8 *native_port_num)
+                                                  u32 ib_port_num,
+                                                  u32 *native_port_num)
 {
        enum rdma_link_layer ll = mlx5_ib_port_link_layer(&ibdev->ib_dev,
                                                          ib_port_num);
@@ -296,7 +298,7 @@ struct mlx5_core_dev *mlx5_ib_get_native_port_mdev(struct mlx5_ib_dev *ibdev,
        return mdev;
 }
 
-void mlx5_ib_put_native_port_mdev(struct mlx5_ib_dev *ibdev, u8 port_num)
+void mlx5_ib_put_native_port_mdev(struct mlx5_ib_dev *ibdev, u32 port_num)
 {
        enum rdma_link_layer ll = mlx5_ib_port_link_layer(&ibdev->ib_dev,
                                                          port_num);
@@ -452,7 +454,7 @@ static int translate_eth_proto_oper(u32 eth_proto_oper, u16 *active_speed,
                                                active_width);
 }
 
-static int mlx5_query_port_roce(struct ib_device *device, u8 port_num,
+static int mlx5_query_port_roce(struct ib_device *device, u32 port_num,
                                struct ib_port_attr *props)
 {
        struct mlx5_ib_dev *dev = to_mdev(device);
@@ -462,7 +464,7 @@ static int mlx5_query_port_roce(struct ib_device *device, u8 port_num,
        enum ib_mtu ndev_ib_mtu;
        bool put_mdev = true;
        u32 eth_prot_oper;
-       u8 mdev_port_num;
+       u32 mdev_port_num;
        bool ext;
        int err;
 
@@ -498,7 +500,7 @@ static int mlx5_query_port_roce(struct ib_device *device, u8 port_num,
        translate_eth_proto_oper(eth_prot_oper, &props->active_speed,
                                 &props->active_width, ext);
 
-       if (!dev->is_rep && mlx5_is_roce_enabled(mdev)) {
+       if (!dev->is_rep && dev->mdev->roce.roce_en) {
                u16 qkey_viol_cntr;
 
                props->port_cap_flags |= IB_PORT_CM_SUP;
@@ -549,19 +551,19 @@ out:
        return err;
 }
 
-static int set_roce_addr(struct mlx5_ib_dev *dev, u8 port_num,
+static int set_roce_addr(struct mlx5_ib_dev *dev, u32 port_num,
                         unsigned int index, const union ib_gid *gid,
                         const struct ib_gid_attr *attr)
 {
-       enum ib_gid_type gid_type = IB_GID_TYPE_ROCE;
+       enum ib_gid_type gid_type;
        u16 vlan_id = 0xffff;
        u8 roce_version = 0;
        u8 roce_l3_type = 0;
        u8 mac[ETH_ALEN];
        int ret;
 
+       gid_type = attr->gid_type;
        if (gid) {
-               gid_type = attr->gid_type;
                ret = rdma_read_gid_l2_fields(attr, &vlan_id, &mac[0]);
                if (ret)
                        return ret;
@@ -573,7 +575,7 @@ static int set_roce_addr(struct mlx5_ib_dev *dev, u8 port_num,
                break;
        case IB_GID_TYPE_ROCE_UDP_ENCAP:
                roce_version = MLX5_ROCE_VERSION_2;
-               if (ipv6_addr_v4mapped((void *)gid))
+               if (gid && ipv6_addr_v4mapped((void *)gid))
                        roce_l3_type = MLX5_ROCE_L3_TYPE_IPV4;
                else
                        roce_l3_type = MLX5_ROCE_L3_TYPE_IPV6;
@@ -600,7 +602,7 @@ static int mlx5_ib_del_gid(const struct ib_gid_attr *attr,
                           __always_unused void **context)
 {
        return set_roce_addr(to_mdev(attr->device), attr->port_num,
-                            attr->index, NULL, NULL);
+                            attr->index, NULL, attr);
 }
 
 __be16 mlx5_get_roce_udp_sport_min(const struct mlx5_ib_dev *dev,
@@ -1267,7 +1269,7 @@ static int translate_max_vl_num(struct ib_device *ibdev, u8 vl_hw_cap,
        return 0;
 }
 
-static int mlx5_query_hca_port(struct ib_device *ibdev, u8 port,
+static int mlx5_query_hca_port(struct ib_device *ibdev, u32 port,
                               struct ib_port_attr *props)
 {
        struct mlx5_ib_dev *dev = to_mdev(ibdev);
@@ -1335,7 +1337,7 @@ out:
        return err;
 }
 
-int mlx5_ib_query_port(struct ib_device *ibdev, u8 port,
+int mlx5_ib_query_port(struct ib_device *ibdev, u32 port,
                       struct ib_port_attr *props)
 {
        unsigned int count;
@@ -1380,13 +1382,13 @@ int mlx5_ib_query_port(struct ib_device *ibdev, u8 port,
        return ret;
 }
 
-static int mlx5_ib_rep_query_port(struct ib_device *ibdev, u8 port,
+static int mlx5_ib_rep_query_port(struct ib_device *ibdev, u32 port,
                                  struct ib_port_attr *props)
 {
        return mlx5_query_port_roce(ibdev, port, props);
 }
 
-static int mlx5_ib_rep_query_pkey(struct ib_device *ibdev, u8 port, u16 index,
+static int mlx5_ib_rep_query_pkey(struct ib_device *ibdev, u32 port, u16 index,
                                  u16 *pkey)
 {
        /* Default special Pkey for representor device port as per the
@@ -1396,7 +1398,7 @@ static int mlx5_ib_rep_query_pkey(struct ib_device *ibdev, u8 port, u16 index,
        return 0;
 }
 
-static int mlx5_ib_query_gid(struct ib_device *ibdev, u8 port, int index,
+static int mlx5_ib_query_gid(struct ib_device *ibdev, u32 port, int index,
                             union ib_gid *gid)
 {
        struct mlx5_ib_dev *dev = to_mdev(ibdev);
@@ -1415,13 +1417,13 @@ static int mlx5_ib_query_gid(struct ib_device *ibdev, u8 port, int index,
 
 }
 
-static int mlx5_query_hca_nic_pkey(struct ib_device *ibdev, u8 port,
+static int mlx5_query_hca_nic_pkey(struct ib_device *ibdev, u32 port,
                                   u16 index, u16 *pkey)
 {
        struct mlx5_ib_dev *dev = to_mdev(ibdev);
        struct mlx5_core_dev *mdev;
        bool put_mdev = true;
-       u8 mdev_port_num;
+       u32 mdev_port_num;
        int err;
 
        mdev = mlx5_ib_get_native_port_mdev(dev, port, &mdev_port_num);
@@ -1442,7 +1444,7 @@ static int mlx5_query_hca_nic_pkey(struct ib_device *ibdev, u8 port,
        return err;
 }
 
-static int mlx5_ib_query_pkey(struct ib_device *ibdev, u8 port, u16 index,
+static int mlx5_ib_query_pkey(struct ib_device *ibdev, u32 port, u16 index,
                              u16 *pkey)
 {
        switch (mlx5_get_vport_access_method(ibdev)) {
@@ -1486,12 +1488,12 @@ static int mlx5_ib_modify_device(struct ib_device *ibdev, int mask,
        return err;
 }
 
-static int set_port_caps_atomic(struct mlx5_ib_dev *dev, u8 port_num, u32 mask,
+static int set_port_caps_atomic(struct mlx5_ib_dev *dev, u32 port_num, u32 mask,
                                u32 value)
 {
        struct mlx5_hca_vport_context ctx = {};
        struct mlx5_core_dev *mdev;
-       u8 mdev_port_num;
+       u32 mdev_port_num;
        int err;
 
        mdev = mlx5_ib_get_native_port_mdev(dev, port_num, &mdev_port_num);
@@ -1520,7 +1522,7 @@ out:
        return err;
 }
 
-static int mlx5_ib_modify_port(struct ib_device *ibdev, u8 port, int mask,
+static int mlx5_ib_modify_port(struct ib_device *ibdev, u32 port, int mask,
                               struct ib_port_modify *props)
 {
        struct mlx5_ib_dev *dev = to_mdev(ibdev);
@@ -1929,7 +1931,7 @@ uar_done:
        print_lib_caps(dev, context->lib_caps);
 
        if (mlx5_ib_lag_should_assign_affinity(dev)) {
-               u8 port = mlx5_core_native_port_num(dev->mdev) - 1;
+               u32 port = mlx5_core_native_port_num(dev->mdev) - 1;
 
                atomic_set(&context->tx_port_affinity,
                           atomic_add_return(
@@ -2087,14 +2089,11 @@ static void mlx5_ib_mmap_free(struct rdma_user_mmap_entry *entry)
        struct mlx5_user_mmap_entry *mentry = to_mmmap(entry);
        struct mlx5_ib_dev *dev = to_mdev(entry->ucontext->device);
        struct mlx5_var_table *var_table = &dev->var_table;
-       struct mlx5_ib_dm *mdm;
 
        switch (mentry->mmap_flag) {
        case MLX5_IB_MMAP_TYPE_MEMIC:
-               mdm = container_of(mentry, struct mlx5_ib_dm, mentry);
-               mlx5_cmd_dealloc_memic(&dev->dm, mdm->dev_addr,
-                                      mdm->size);
-               kfree(mdm);
+       case MLX5_IB_MMAP_TYPE_MEMIC_OP:
+               mlx5_ib_dm_mmap_free(dev, mentry);
                break;
        case MLX5_IB_MMAP_TYPE_VAR:
                mutex_lock(&var_table->bitmap_lock);
@@ -2219,19 +2218,6 @@ free_bfreg:
        return err;
 }
 
-static int add_dm_mmap_entry(struct ib_ucontext *context,
-                            struct mlx5_ib_dm *mdm,
-                            u64 address)
-{
-       mdm->mentry.mmap_flag = MLX5_IB_MMAP_TYPE_MEMIC;
-       mdm->mentry.address = address;
-       return rdma_user_mmap_entry_insert_range(
-                       context, &mdm->mentry.rdma_entry,
-                       mdm->size,
-                       MLX5_IB_MMAP_DEVICE_MEM << 16,
-                       (MLX5_IB_MMAP_DEVICE_MEM << 16) + (1UL << 16) - 1);
-}
-
 static unsigned long mlx5_vma_to_pgoff(struct vm_area_struct *vma)
 {
        unsigned long idx;
@@ -2333,206 +2319,6 @@ static int mlx5_ib_mmap(struct ib_ucontext *ibcontext, struct vm_area_struct *vm
        return 0;
 }
 
-static inline int check_dm_type_support(struct mlx5_ib_dev *dev,
-                                       u32 type)
-{
-       switch (type) {
-       case MLX5_IB_UAPI_DM_TYPE_MEMIC:
-               if (!MLX5_CAP_DEV_MEM(dev->mdev, memic))
-                       return -EOPNOTSUPP;
-               break;
-       case MLX5_IB_UAPI_DM_TYPE_STEERING_SW_ICM:
-       case MLX5_IB_UAPI_DM_TYPE_HEADER_MODIFY_SW_ICM:
-               if (!capable(CAP_SYS_RAWIO) ||
-                   !capable(CAP_NET_RAW))
-                       return -EPERM;
-
-               if (!(MLX5_CAP_FLOWTABLE_NIC_RX(dev->mdev, sw_owner) ||
-                     MLX5_CAP_FLOWTABLE_NIC_TX(dev->mdev, sw_owner) ||
-                     MLX5_CAP_FLOWTABLE_NIC_RX(dev->mdev, sw_owner_v2) ||
-                     MLX5_CAP_FLOWTABLE_NIC_TX(dev->mdev, sw_owner_v2)))
-                       return -EOPNOTSUPP;
-               break;
-       }
-
-       return 0;
-}
-
-static int handle_alloc_dm_memic(struct ib_ucontext *ctx,
-                                struct mlx5_ib_dm *dm,
-                                struct ib_dm_alloc_attr *attr,
-                                struct uverbs_attr_bundle *attrs)
-{
-       struct mlx5_dm *dm_db = &to_mdev(ctx->device)->dm;
-       u64 start_offset;
-       u16 page_idx;
-       int err;
-       u64 address;
-
-       dm->size = roundup(attr->length, MLX5_MEMIC_BASE_SIZE);
-
-       err = mlx5_cmd_alloc_memic(dm_db, &dm->dev_addr,
-                                  dm->size, attr->alignment);
-       if (err)
-               return err;
-
-       address = dm->dev_addr & PAGE_MASK;
-       err = add_dm_mmap_entry(ctx, dm, address);
-       if (err)
-               goto err_dealloc;
-
-       page_idx = dm->mentry.rdma_entry.start_pgoff & 0xFFFF;
-       err = uverbs_copy_to(attrs,
-                            MLX5_IB_ATTR_ALLOC_DM_RESP_PAGE_INDEX,
-                            &page_idx,
-                            sizeof(page_idx));
-       if (err)
-               goto err_copy;
-
-       start_offset = dm->dev_addr & ~PAGE_MASK;
-       err = uverbs_copy_to(attrs,
-                            MLX5_IB_ATTR_ALLOC_DM_RESP_START_OFFSET,
-                            &start_offset, sizeof(start_offset));
-       if (err)
-               goto err_copy;
-
-       return 0;
-
-err_copy:
-       rdma_user_mmap_entry_remove(&dm->mentry.rdma_entry);
-err_dealloc:
-       mlx5_cmd_dealloc_memic(dm_db, dm->dev_addr, dm->size);
-
-       return err;
-}
-
-static int handle_alloc_dm_sw_icm(struct ib_ucontext *ctx,
-                                 struct mlx5_ib_dm *dm,
-                                 struct ib_dm_alloc_attr *attr,
-                                 struct uverbs_attr_bundle *attrs,
-                                 int type)
-{
-       struct mlx5_core_dev *dev = to_mdev(ctx->device)->mdev;
-       u64 act_size;
-       int err;
-
-       /* Allocation size must a multiple of the basic block size
-        * and a power of 2.
-        */
-       act_size = round_up(attr->length, MLX5_SW_ICM_BLOCK_SIZE(dev));
-       act_size = roundup_pow_of_two(act_size);
-
-       dm->size = act_size;
-       err = mlx5_dm_sw_icm_alloc(dev, type, act_size, attr->alignment,
-                                  to_mucontext(ctx)->devx_uid, &dm->dev_addr,
-                                  &dm->icm_dm.obj_id);
-       if (err)
-               return err;
-
-       err = uverbs_copy_to(attrs,
-                            MLX5_IB_ATTR_ALLOC_DM_RESP_START_OFFSET,
-                            &dm->dev_addr, sizeof(dm->dev_addr));
-       if (err)
-               mlx5_dm_sw_icm_dealloc(dev, type, dm->size,
-                                      to_mucontext(ctx)->devx_uid, dm->dev_addr,
-                                      dm->icm_dm.obj_id);
-
-       return err;
-}
-
-struct ib_dm *mlx5_ib_alloc_dm(struct ib_device *ibdev,
-                              struct ib_ucontext *context,
-                              struct ib_dm_alloc_attr *attr,
-                              struct uverbs_attr_bundle *attrs)
-{
-       struct mlx5_ib_dm *dm;
-       enum mlx5_ib_uapi_dm_type type;
-       int err;
-
-       err = uverbs_get_const_default(&type, attrs,
-                                      MLX5_IB_ATTR_ALLOC_DM_REQ_TYPE,
-                                      MLX5_IB_UAPI_DM_TYPE_MEMIC);
-       if (err)
-               return ERR_PTR(err);
-
-       mlx5_ib_dbg(to_mdev(ibdev), "alloc_dm req: dm_type=%d user_length=0x%llx log_alignment=%d\n",
-                   type, attr->length, attr->alignment);
-
-       err = check_dm_type_support(to_mdev(ibdev), type);
-       if (err)
-               return ERR_PTR(err);
-
-       dm = kzalloc(sizeof(*dm), GFP_KERNEL);
-       if (!dm)
-               return ERR_PTR(-ENOMEM);
-
-       dm->type = type;
-
-       switch (type) {
-       case MLX5_IB_UAPI_DM_TYPE_MEMIC:
-               err = handle_alloc_dm_memic(context, dm,
-                                           attr,
-                                           attrs);
-               break;
-       case MLX5_IB_UAPI_DM_TYPE_STEERING_SW_ICM:
-               err = handle_alloc_dm_sw_icm(context, dm,
-                                            attr, attrs,
-                                            MLX5_SW_ICM_TYPE_STEERING);
-               break;
-       case MLX5_IB_UAPI_DM_TYPE_HEADER_MODIFY_SW_ICM:
-               err = handle_alloc_dm_sw_icm(context, dm,
-                                            attr, attrs,
-                                            MLX5_SW_ICM_TYPE_HEADER_MODIFY);
-               break;
-       default:
-               err = -EOPNOTSUPP;
-       }
-
-       if (err)
-               goto err_free;
-
-       return &dm->ibdm;
-
-err_free:
-       kfree(dm);
-       return ERR_PTR(err);
-}
-
-int mlx5_ib_dealloc_dm(struct ib_dm *ibdm, struct uverbs_attr_bundle *attrs)
-{
-       struct mlx5_ib_ucontext *ctx = rdma_udata_to_drv_context(
-               &attrs->driver_udata, struct mlx5_ib_ucontext, ibucontext);
-       struct mlx5_core_dev *dev = to_mdev(ibdm->device)->mdev;
-       struct mlx5_ib_dm *dm = to_mdm(ibdm);
-       int ret;
-
-       switch (dm->type) {
-       case MLX5_IB_UAPI_DM_TYPE_MEMIC:
-               rdma_user_mmap_entry_remove(&dm->mentry.rdma_entry);
-               return 0;
-       case MLX5_IB_UAPI_DM_TYPE_STEERING_SW_ICM:
-               ret = mlx5_dm_sw_icm_dealloc(dev, MLX5_SW_ICM_TYPE_STEERING,
-                                            dm->size, ctx->devx_uid, dm->dev_addr,
-                                            dm->icm_dm.obj_id);
-               if (ret)
-                       return ret;
-               break;
-       case MLX5_IB_UAPI_DM_TYPE_HEADER_MODIFY_SW_ICM:
-               ret = mlx5_dm_sw_icm_dealloc(dev, MLX5_SW_ICM_TYPE_HEADER_MODIFY,
-                                            dm->size, ctx->devx_uid, dm->dev_addr,
-                                            dm->icm_dm.obj_id);
-               if (ret)
-                       return ret;
-               break;
-       default:
-               return -EOPNOTSUPP;
-       }
-
-       kfree(dm);
-
-       return 0;
-}
-
 static int mlx5_ib_alloc_pd(struct ib_pd *ibpd, struct ib_udata *udata)
 {
        struct mlx5_ib_pd *pd = to_mpd(ibpd);
@@ -2779,7 +2565,7 @@ static void delay_drop_handler(struct work_struct *work)
 static void handle_general_event(struct mlx5_ib_dev *ibdev, struct mlx5_eqe *eqe,
                                 struct ib_event *ibev)
 {
-       u8 port = (eqe->data.port.port >> 4) & 0xf;
+       u32 port = (eqe->data.port.port >> 4) & 0xf;
 
        switch (eqe->sub_type) {
        case MLX5_GENERAL_SUBTYPE_DELAY_DROP_TIMEOUT:
@@ -2795,7 +2581,7 @@ static void handle_general_event(struct mlx5_ib_dev *ibdev, struct mlx5_eqe *eqe
 static int handle_port_change(struct mlx5_ib_dev *ibdev, struct mlx5_eqe *eqe,
                              struct ib_event *ibev)
 {
-       u8 port = (eqe->data.port.port >> 4) & 0xf;
+       u32 port = (eqe->data.port.port >> 4) & 0xf;
 
        ibev->element.port_num = port;
 
@@ -3152,7 +2938,7 @@ static u32 get_core_cap_flags(struct ib_device *ibdev,
        return ret;
 }
 
-static int mlx5_port_immutable(struct ib_device *ibdev, u8 port_num,
+static int mlx5_port_immutable(struct ib_device *ibdev, u32 port_num,
                               struct ib_port_immutable *immutable)
 {
        struct ib_port_attr attr;
@@ -3180,7 +2966,7 @@ static int mlx5_port_immutable(struct ib_device *ibdev, u8 port_num,
        return 0;
 }
 
-static int mlx5_port_rep_immutable(struct ib_device *ibdev, u8 port_num,
+static int mlx5_port_rep_immutable(struct ib_device *ibdev, u32 port_num,
                                   struct ib_port_immutable *immutable)
 {
        struct ib_port_attr attr;
@@ -3252,7 +3038,7 @@ static void mlx5_eth_lag_cleanup(struct mlx5_ib_dev *dev)
        }
 }
 
-static int mlx5_add_netdev_notifier(struct mlx5_ib_dev *dev, u8 port_num)
+static int mlx5_add_netdev_notifier(struct mlx5_ib_dev *dev, u32 port_num)
 {
        int err;
 
@@ -3266,7 +3052,7 @@ static int mlx5_add_netdev_notifier(struct mlx5_ib_dev *dev, u8 port_num)
        return 0;
 }
 
-static void mlx5_remove_netdev_notifier(struct mlx5_ib_dev *dev, u8 port_num)
+static void mlx5_remove_netdev_notifier(struct mlx5_ib_dev *dev, u32 port_num)
 {
        if (dev->port[port_num].roce.nb.notifier_call) {
                unregister_netdevice_notifier(&dev->port[port_num].roce.nb);
@@ -3300,7 +3086,7 @@ static void mlx5_disable_eth(struct mlx5_ib_dev *dev)
        mlx5_nic_vport_disable_roce(dev->mdev);
 }
 
-static int mlx5_ib_rn_get_params(struct ib_device *device, u8 port_num,
+static int mlx5_ib_rn_get_params(struct ib_device *device, u32 port_num,
                                 enum rdma_netdev_t type,
                                 struct rdma_netdev_alloc_params *params)
 {
@@ -3352,7 +3138,7 @@ static const struct file_operations fops_delay_drop_timeout = {
 static void mlx5_ib_unbind_slave_port(struct mlx5_ib_dev *ibdev,
                                      struct mlx5_ib_multiport_info *mpi)
 {
-       u8 port_num = mlx5_core_native_port_num(mpi->mdev) - 1;
+       u32 port_num = mlx5_core_native_port_num(mpi->mdev) - 1;
        struct mlx5_ib_port *port = &ibdev->port[port_num];
        int comps;
        int err;
@@ -3398,7 +3184,7 @@ static void mlx5_ib_unbind_slave_port(struct mlx5_ib_dev *ibdev,
 
        err = mlx5_nic_vport_unaffiliate_multiport(mpi->mdev);
 
-       mlx5_ib_dbg(ibdev, "unaffiliated port %d\n", port_num + 1);
+       mlx5_ib_dbg(ibdev, "unaffiliated port %u\n", port_num + 1);
        /* Log an error, still needed to cleanup the pointers and add
         * it back to the list.
         */
@@ -3412,14 +3198,14 @@ static void mlx5_ib_unbind_slave_port(struct mlx5_ib_dev *ibdev,
 static bool mlx5_ib_bind_slave_port(struct mlx5_ib_dev *ibdev,
                                    struct mlx5_ib_multiport_info *mpi)
 {
-       u8 port_num = mlx5_core_native_port_num(mpi->mdev) - 1;
+       u32 port_num = mlx5_core_native_port_num(mpi->mdev) - 1;
        int err;
 
        lockdep_assert_held(&mlx5_ib_multiport_mutex);
 
        spin_lock(&ibdev->port[port_num].mp.mpi_lock);
        if (ibdev->port[port_num].mp.mpi) {
-               mlx5_ib_dbg(ibdev, "port %d already affiliated.\n",
+               mlx5_ib_dbg(ibdev, "port %u already affiliated.\n",
                            port_num + 1);
                spin_unlock(&ibdev->port[port_num].mp.mpi_lock);
                return false;
@@ -3455,12 +3241,12 @@ unbind:
 
 static int mlx5_ib_init_multiport_master(struct mlx5_ib_dev *dev)
 {
-       int port_num = mlx5_core_native_port_num(dev->mdev) - 1;
+       u32 port_num = mlx5_core_native_port_num(dev->mdev) - 1;
        enum rdma_link_layer ll = mlx5_ib_port_link_layer(&dev->ib_dev,
                                                          port_num + 1);
        struct mlx5_ib_multiport_info *mpi;
        int err;
-       int i;
+       u32 i;
 
        if (!mlx5_core_is_mp_master(dev->mdev) || ll != IB_LINK_LAYER_ETHERNET)
                return 0;
@@ -3523,10 +3309,10 @@ static int mlx5_ib_init_multiport_master(struct mlx5_ib_dev *dev)
 
 static void mlx5_ib_cleanup_multiport_master(struct mlx5_ib_dev *dev)
 {
-       int port_num = mlx5_core_native_port_num(dev->mdev) - 1;
+       u32 port_num = mlx5_core_native_port_num(dev->mdev) - 1;
        enum rdma_link_layer ll = mlx5_ib_port_link_layer(&dev->ib_dev,
                                                          port_num + 1);
-       int i;
+       u32 i;
 
        if (!mlx5_core_is_mp_master(dev->mdev) || ll != IB_LINK_LAYER_ETHERNET)
                return;
@@ -3539,7 +3325,8 @@ static void mlx5_ib_cleanup_multiport_master(struct mlx5_ib_dev *dev)
                                kfree(dev->port[i].mp.mpi);
                                dev->port[i].mp.mpi = NULL;
                        } else {
-                               mlx5_ib_dbg(dev, "unbinding port_num: %d\n", i + 1);
+                               mlx5_ib_dbg(dev, "unbinding port_num: %u\n",
+                                           i + 1);
                                mlx5_ib_unbind_slave_port(dev, dev->port[i].mp.mpi);
                        }
                }
@@ -3815,20 +3602,6 @@ DECLARE_UVERBS_NAMED_OBJECT(MLX5_IB_OBJECT_UAR,
                            &UVERBS_METHOD(MLX5_IB_METHOD_UAR_OBJ_ALLOC),
                            &UVERBS_METHOD(MLX5_IB_METHOD_UAR_OBJ_DESTROY));
 
-ADD_UVERBS_ATTRIBUTES_SIMPLE(
-       mlx5_ib_dm,
-       UVERBS_OBJECT_DM,
-       UVERBS_METHOD_DM_ALLOC,
-       UVERBS_ATTR_PTR_OUT(MLX5_IB_ATTR_ALLOC_DM_RESP_START_OFFSET,
-                           UVERBS_ATTR_TYPE(u64),
-                           UA_MANDATORY),
-       UVERBS_ATTR_PTR_OUT(MLX5_IB_ATTR_ALLOC_DM_RESP_PAGE_INDEX,
-                           UVERBS_ATTR_TYPE(u16),
-                           UA_OPTIONAL),
-       UVERBS_ATTR_CONST_IN(MLX5_IB_ATTR_ALLOC_DM_REQ_TYPE,
-                            enum mlx5_ib_uapi_dm_type,
-                            UA_OPTIONAL));
-
 ADD_UVERBS_ATTRIBUTES_SIMPLE(
        mlx5_ib_flow_action,
        UVERBS_OBJECT_FLOW_ACTION,
@@ -3851,10 +3624,10 @@ static const struct uapi_definition mlx5_ib_defs[] = {
        UAPI_DEF_CHAIN(mlx5_ib_flow_defs),
        UAPI_DEF_CHAIN(mlx5_ib_qos_defs),
        UAPI_DEF_CHAIN(mlx5_ib_std_types_defs),
+       UAPI_DEF_CHAIN(mlx5_ib_dm_defs),
 
        UAPI_DEF_CHAIN_OBJ_TREE(UVERBS_OBJECT_FLOW_ACTION,
                                &mlx5_ib_flow_action),
-       UAPI_DEF_CHAIN_OBJ_TREE(UVERBS_OBJECT_DM, &mlx5_ib_dm),
        UAPI_DEF_CHAIN_OBJ_TREE(UVERBS_OBJECT_DEVICE, &mlx5_ib_query_context),
        UAPI_DEF_CHAIN_OBJ_TREE_NAMED(MLX5_IB_OBJECT_VAR,
                                UAPI_DEF_IS_OBJ_SUPPORTED(var_is_supported)),
@@ -3891,8 +3664,6 @@ static int mlx5_ib_stage_init_init(struct mlx5_ib_dev *dev)
                dev->port[i].roce.last_port_state = IB_PORT_DOWN;
        }
 
-       mlx5_ib_internal_fill_odp_caps(dev);
-
        err = mlx5_ib_init_multiport_master(dev);
        if (err)
                return err;
@@ -4032,12 +3803,6 @@ static const struct ib_device_ops mlx5_ib_dev_xrc_ops = {
        INIT_RDMA_OBJ_SIZE(ib_xrcd, mlx5_ib_xrcd, ibxrcd),
 };
 
-static const struct ib_device_ops mlx5_ib_dev_dm_ops = {
-       .alloc_dm = mlx5_ib_alloc_dm,
-       .dealloc_dm = mlx5_ib_dealloc_dm,
-       .reg_dm_mr = mlx5_ib_reg_dm_mr,
-};
-
 static int mlx5_ib_init_var_table(struct mlx5_ib_dev *dev)
 {
        struct mlx5_core_dev *mdev = dev->mdev;
@@ -4160,7 +3925,7 @@ static int mlx5_ib_roce_init(struct mlx5_ib_dev *dev)
        struct mlx5_core_dev *mdev = dev->mdev;
        enum rdma_link_layer ll;
        int port_type_cap;
-       u8 port_num = 0;
+       u32 port_num = 0;
        int err;
 
        port_type_cap = MLX5_CAP_GEN(mdev, port_type);
@@ -4173,7 +3938,7 @@ static int mlx5_ib_roce_init(struct mlx5_ib_dev *dev)
 
                /* Register only for native ports */
                err = mlx5_add_netdev_notifier(dev, port_num);
-               if (err || dev->is_rep || !mlx5_is_roce_enabled(mdev))
+               if (err || dev->is_rep || !mlx5_is_roce_init_enabled(mdev))
                        /*
                         * We don't enable ETH interface for
                         * 1. IB representors
@@ -4197,7 +3962,7 @@ static void mlx5_ib_roce_cleanup(struct mlx5_ib_dev *dev)
        struct mlx5_core_dev *mdev = dev->mdev;
        enum rdma_link_layer ll;
        int port_type_cap;
-       u8 port_num;
+       u32 port_num;
 
        port_type_cap = MLX5_CAP_GEN(mdev, port_type);
        ll = mlx5_port_type_cap_to_rdma_ll(port_type_cap);
@@ -4710,7 +4475,7 @@ static int mlx5r_probe(struct auxiliary_device *adev,
        dev->mdev = mdev;
        dev->num_ports = num_ports;
 
-       if (ll == IB_LINK_LAYER_ETHERNET && !mlx5_is_roce_enabled(mdev))
+       if (ll == IB_LINK_LAYER_ETHERNET && !mlx5_is_roce_init_enabled(mdev))
                profile = &raw_eth_profile;
        else
                profile = &pf_profile;
index 88cc26e008fce033da2d8553b683a871fab9f625..e9a3f34a30b8f26344e3553f7e973959e95c0f74 100644 (file)
@@ -166,6 +166,7 @@ enum mlx5_ib_mmap_type {
        MLX5_IB_MMAP_TYPE_VAR = 2,
        MLX5_IB_MMAP_TYPE_UAR_WC = 3,
        MLX5_IB_MMAP_TYPE_UAR_NC = 4,
+       MLX5_IB_MMAP_TYPE_MEMIC_OP = 5,
 };
 
 struct mlx5_bfreg_info {
@@ -406,7 +407,7 @@ struct mlx5_ib_qp_base {
 struct mlx5_ib_qp_trans {
        struct mlx5_ib_qp_base  base;
        u16                     xrcdn;
-       u                     alt_port;
+       u32                     alt_port;
        u8                      atomic_rd_en;
        u8                      resp_depth;
 };
@@ -453,7 +454,7 @@ struct mlx5_ib_dct {
 
 struct mlx5_ib_gsi_qp {
        struct ib_qp *rx_qp;
-       u8 port_num;
+       u32 port_num;
        struct ib_qp_cap cap;
        struct ib_cq *cq;
        struct mlx5_ib_gsi_wr *outstanding_wrs;
@@ -490,7 +491,7 @@ struct mlx5_ib_qp {
        struct mutex            mutex;
        /* cached variant of create_flags from struct ib_qp_init_attr */
        u32                     flags;
-       u                     port;
+       u32                     port;
        u8                      state;
        int                     max_inline_data;
        struct mlx5_bf          bf;
@@ -547,11 +548,6 @@ static inline const struct mlx5_umr_wr *umr_wr(const struct ib_send_wr *wr)
        return container_of(wr, struct mlx5_umr_wr, wr);
 }
 
-struct mlx5_shared_mr_info {
-       int mr_id;
-       struct ib_umem          *umem;
-};
-
 enum mlx5_ib_cq_pr_flags {
        MLX5_IB_CQ_PR_FLAGS_CQE_128_PAD = 1 << 0,
 };
@@ -623,20 +619,6 @@ struct mlx5_user_mmap_entry {
        u32 page_idx;
 };
 
-struct mlx5_ib_dm {
-       struct ib_dm            ibdm;
-       phys_addr_t             dev_addr;
-       u32                     type;
-       size_t                  size;
-       union {
-               struct {
-                       u32     obj_id;
-               } icm_dm;
-               /* other dm types specific params should be added here */
-       };
-       struct mlx5_user_mmap_entry mentry;
-};
-
 #define MLX5_IB_MTT_PRESENT (MLX5_IB_MTT_READ | MLX5_IB_MTT_WRITE)
 
 #define MLX5_IB_DM_MEMIC_ALLOWED_ACCESS (IB_ACCESS_LOCAL_WRITE   |\
@@ -654,47 +636,69 @@ struct mlx5_ib_dm {
        atomic64_add(value, &((mr)->odp_stats.counter_name))
 
 struct mlx5_ib_mr {
-       struct ib_mr            ibmr;
-       void                    *descs;
-       dma_addr_t              desc_map;
-       int                     ndescs;
-       int                     data_length;
-       int                     meta_ndescs;
-       int                     meta_length;
-       int                     max_descs;
-       int                     desc_size;
-       int                     access_mode;
-       unsigned int            page_shift;
-       struct mlx5_core_mkey   mmkey;
-       struct ib_umem         *umem;
-       struct mlx5_shared_mr_info      *smr_info;
-       struct list_head        list;
-       struct mlx5_cache_ent  *cache_ent;
-       u32 out[MLX5_ST_SZ_DW(create_mkey_out)];
-       struct mlx5_core_sig_ctx    *sig;
-       void                    *descs_alloc;
-       int                     access_flags; /* Needed for rereg MR */
-
-       struct mlx5_ib_mr      *parent;
-       /* Needed for IB_MR_TYPE_INTEGRITY */
-       struct mlx5_ib_mr      *pi_mr;
-       struct mlx5_ib_mr      *klm_mr;
-       struct mlx5_ib_mr      *mtt_mr;
-       u64                     data_iova;
-       u64                     pi_iova;
-
-       /* For ODP and implicit */
-       struct xarray           implicit_children;
+       struct ib_mr ibmr;
+       struct mlx5_core_mkey mmkey;
+
+       /* User MR data */
+       struct mlx5_cache_ent *cache_ent;
+       struct ib_umem *umem;
+
+       /* This is zero'd when the MR is allocated */
        union {
-               struct list_head elm;
-               struct work_struct work;
-       } odp_destroy;
-       struct ib_odp_counters  odp_stats;
-       bool                    is_odp_implicit;
+               /* Used only while the MR is in the cache */
+               struct {
+                       u32 out[MLX5_ST_SZ_DW(create_mkey_out)];
+                       struct mlx5_async_work cb_work;
+                       /* Cache list element */
+                       struct list_head list;
+               };
 
-       struct mlx5_async_work  cb_work;
+               /* Used only by kernel MRs (umem == NULL) */
+               struct {
+                       void *descs;
+                       void *descs_alloc;
+                       dma_addr_t desc_map;
+                       int max_descs;
+                       int ndescs;
+                       int desc_size;
+                       int access_mode;
+
+                       /* For Kernel IB_MR_TYPE_INTEGRITY */
+                       struct mlx5_core_sig_ctx *sig;
+                       struct mlx5_ib_mr *pi_mr;
+                       struct mlx5_ib_mr *klm_mr;
+                       struct mlx5_ib_mr *mtt_mr;
+                       u64 data_iova;
+                       u64 pi_iova;
+                       int meta_ndescs;
+                       int meta_length;
+                       int data_length;
+               };
+
+               /* Used only by User MRs (umem != NULL) */
+               struct {
+                       unsigned int page_shift;
+                       /* Current access_flags */
+                       int access_flags;
+
+                       /* For User ODP */
+                       struct mlx5_ib_mr *parent;
+                       struct xarray implicit_children;
+                       union {
+                               struct work_struct work;
+                       } odp_destroy;
+                       struct ib_odp_counters odp_stats;
+                       bool is_odp_implicit;
+               };
+       };
 };
 
+/* Zero the fields in the mr that are variant depending on usage */
+static inline void mlx5_clear_mr(struct mlx5_ib_mr *mr)
+{
+       memset(mr->out, 0, sizeof(*mr) - offsetof(struct mlx5_ib_mr, out));
+}
+
 static inline bool is_odp_mr(struct mlx5_ib_mr *mr)
 {
        return IS_ENABLED(CONFIG_INFINIBAND_ON_DEMAND_PAGING) && mr->umem &&
@@ -822,7 +826,7 @@ struct mlx5_roce {
        atomic_t                tx_port_affinity;
        enum ib_port_state last_port_state;
        struct mlx5_ib_dev      *dev;
-       u                     native_port_num;
+       u32                     native_port_num;
 };
 
 struct mlx5_ib_port {
@@ -837,7 +841,7 @@ struct mlx5_ib_dbg_param {
        int                     offset;
        struct mlx5_ib_dev      *dev;
        struct dentry           *dentry;
-       u                     port_num;
+       u32                     port_num;
 };
 
 enum mlx5_ib_dbg_cc_types {
@@ -1063,6 +1067,7 @@ struct mlx5_ib_dev {
        struct mutex                    slow_path_mutex;
        struct ib_odp_caps      odp_caps;
        u64                     odp_max_size;
+       struct mutex            odp_eq_mutex;
        struct mlx5_ib_pf_eq    odp_pf_eq;
 
        struct xarray           odp_mkeys;
@@ -1170,11 +1175,6 @@ static inline struct mlx5_ib_srq *to_mibsrq(struct mlx5_core_srq *msrq)
        return container_of(msrq, struct mlx5_ib_srq, msrq);
 }
 
-static inline struct mlx5_ib_dm *to_mdm(struct ib_dm *ibdm)
-{
-       return container_of(ibdm, struct mlx5_ib_dm, ibdm);
-}
-
 static inline struct mlx5_ib_mr *to_mmr(struct ib_mr *ibmr)
 {
        return container_of(ibmr, struct mlx5_ib_mr, ibmr);
@@ -1268,8 +1268,7 @@ struct mlx5_ib_mr *mlx5_ib_alloc_implicit_mr(struct mlx5_ib_pd *pd,
                                             struct ib_udata *udata,
                                             int access_flags);
 void mlx5_ib_free_implicit_mr(struct mlx5_ib_mr *mr);
-void mlx5_ib_fence_odp_mr(struct mlx5_ib_mr *mr);
-void mlx5_ib_fence_dmabuf_mr(struct mlx5_ib_mr *mr);
+void mlx5_ib_free_odp_mr(struct mlx5_ib_mr *mr);
 struct ib_mr *mlx5_ib_rereg_user_mr(struct ib_mr *ib_mr, int flags, u64 start,
                                    u64 length, u64 virt_addr, int access_flags,
                                    struct ib_pd *pd, struct ib_udata *udata);
@@ -1285,7 +1284,7 @@ int mlx5_ib_map_mr_sg_pi(struct ib_mr *ibmr, struct scatterlist *data_sg,
                         int data_sg_nents, unsigned int *data_sg_offset,
                         struct scatterlist *meta_sg, int meta_sg_nents,
                         unsigned int *meta_sg_offset);
-int mlx5_ib_process_mad(struct ib_device *ibdev, int mad_flags, u8 port_num,
+int mlx5_ib_process_mad(struct ib_device *ibdev, int mad_flags, u32 port_num,
                        const struct ib_wc *in_wc, const struct ib_grh *in_grh,
                        const struct ib_mad *in, struct ib_mad *out,
                        size_t *out_mad_size, u16 *out_mad_pkey_index);
@@ -1300,13 +1299,13 @@ int mlx5_query_mad_ifc_vendor_id(struct ib_device *ibdev,
                                 u32 *vendor_id);
 int mlx5_query_mad_ifc_node_desc(struct mlx5_ib_dev *dev, char *node_desc);
 int mlx5_query_mad_ifc_node_guid(struct mlx5_ib_dev *dev, __be64 *node_guid);
-int mlx5_query_mad_ifc_pkey(struct ib_device *ibdev, u8 port, u16 index,
+int mlx5_query_mad_ifc_pkey(struct ib_device *ibdev, u32 port, u16 index,
                            u16 *pkey);
-int mlx5_query_mad_ifc_gids(struct ib_device *ibdev, u8 port, int index,
+int mlx5_query_mad_ifc_gids(struct ib_device *ibdev, u32 port, int index,
                            union ib_gid *gid);
-int mlx5_query_mad_ifc_port(struct ib_device *ibdev, u8 port,
+int mlx5_query_mad_ifc_port(struct ib_device *ibdev, u32 port,
                            struct ib_port_attr *props);
-int mlx5_ib_query_port(struct ib_device *ibdev, u8 port,
+int mlx5_ib_query_port(struct ib_device *ibdev, u32 port,
                       struct ib_port_attr *props);
 void mlx5_ib_populate_pas(struct ib_umem *umem, size_t page_size, __be64 *pas,
                          u64 access_flags);
@@ -1317,8 +1316,6 @@ int mlx5_mr_cache_cleanup(struct mlx5_ib_dev *dev);
 
 struct mlx5_ib_mr *mlx5_mr_cache_alloc(struct mlx5_ib_dev *dev,
                                       unsigned int entry, int access_flags);
-void mlx5_mr_cache_free(struct mlx5_ib_dev *dev, struct mlx5_ib_mr *mr);
-int mlx5_mr_cache_invalidate(struct mlx5_ib_mr *mr);
 
 int mlx5_ib_check_mr_status(struct ib_mr *ibmr, u32 check_mask,
                            struct ib_mr_status *mr_status);
@@ -1332,18 +1329,13 @@ int mlx5_ib_create_rwq_ind_table(struct ib_rwq_ind_table *ib_rwq_ind_table,
                                 struct ib_rwq_ind_table_init_attr *init_attr,
                                 struct ib_udata *udata);
 int mlx5_ib_destroy_rwq_ind_table(struct ib_rwq_ind_table *wq_ind_table);
-struct ib_dm *mlx5_ib_alloc_dm(struct ib_device *ibdev,
-                              struct ib_ucontext *context,
-                              struct ib_dm_alloc_attr *attr,
-                              struct uverbs_attr_bundle *attrs);
-int mlx5_ib_dealloc_dm(struct ib_dm *ibdm, struct uverbs_attr_bundle *attrs);
 struct ib_mr *mlx5_ib_reg_dm_mr(struct ib_pd *pd, struct ib_dm *dm,
                                struct ib_dm_mr_attr *attr,
                                struct uverbs_attr_bundle *attrs);
 
 #ifdef CONFIG_INFINIBAND_ON_DEMAND_PAGING
-void mlx5_ib_internal_fill_odp_caps(struct mlx5_ib_dev *dev);
 int mlx5_ib_odp_init_one(struct mlx5_ib_dev *ibdev);
+int mlx5r_odp_create_eq(struct mlx5_ib_dev *dev, struct mlx5_ib_pf_eq *eq);
 void mlx5_ib_odp_cleanup_one(struct mlx5_ib_dev *ibdev);
 int __init mlx5_ib_odp_init(void);
 void mlx5_ib_odp_cleanup(void);
@@ -1357,12 +1349,12 @@ int mlx5_ib_advise_mr_prefetch(struct ib_pd *pd,
 int mlx5_ib_init_odp_mr(struct mlx5_ib_mr *mr);
 int mlx5_ib_init_dmabuf_mr(struct mlx5_ib_mr *mr);
 #else /* CONFIG_INFINIBAND_ON_DEMAND_PAGING */
-static inline void mlx5_ib_internal_fill_odp_caps(struct mlx5_ib_dev *dev)
+static inline int mlx5_ib_odp_init_one(struct mlx5_ib_dev *ibdev) { return 0; }
+static inline int mlx5r_odp_create_eq(struct mlx5_ib_dev *dev,
+                                     struct mlx5_ib_pf_eq *eq)
 {
-       return;
+       return 0;
 }
-
-static inline int mlx5_ib_odp_init_one(struct mlx5_ib_dev *ibdev) { return 0; }
 static inline void mlx5_ib_odp_cleanup_one(struct mlx5_ib_dev *ibdev) {}
 static inline int mlx5_ib_odp_init(void) { return 0; }
 static inline void mlx5_ib_odp_cleanup(void)                               {}
@@ -1397,22 +1389,22 @@ int __mlx5_ib_add(struct mlx5_ib_dev *dev,
                  const struct mlx5_ib_profile *profile);
 
 int mlx5_ib_get_vf_config(struct ib_device *device, int vf,
-                         u8 port, struct ifla_vf_info *info);
+                         u32 port, struct ifla_vf_info *info);
 int mlx5_ib_set_vf_link_state(struct ib_device *device, int vf,
-                             u8 port, int state);
+                             u32 port, int state);
 int mlx5_ib_get_vf_stats(struct ib_device *device, int vf,
-                        u8 port, struct ifla_vf_stats *stats);
-int mlx5_ib_get_vf_guid(struct ib_device *device, int vf, u8 port,
+                        u32 port, struct ifla_vf_stats *stats);
+int mlx5_ib_get_vf_guid(struct ib_device *device, int vf, u32 port,
                        struct ifla_vf_guid *node_guid,
                        struct ifla_vf_guid *port_guid);
-int mlx5_ib_set_vf_guid(struct ib_device *device, int vf, u8 port,
+int mlx5_ib_set_vf_guid(struct ib_device *device, int vf, u32 port,
                        u64 guid, int type);
 
 __be16 mlx5_get_roce_udp_sport_min(const struct mlx5_ib_dev *dev,
                                   const struct ib_gid_attr *attr);
 
-void mlx5_ib_cleanup_cong_debugfs(struct mlx5_ib_dev *dev, u8 port_num);
-void mlx5_ib_init_cong_debugfs(struct mlx5_ib_dev *dev, u8 port_num);
+void mlx5_ib_cleanup_cong_debugfs(struct mlx5_ib_dev *dev, u32 port_num);
+void mlx5_ib_init_cong_debugfs(struct mlx5_ib_dev *dev, u32 port_num);
 
 /* GSI QP helper functions */
 int mlx5_ib_create_gsi(struct ib_pd *pd, struct mlx5_ib_qp *mqp,
@@ -1435,10 +1427,10 @@ void mlx5_ib_free_bfreg(struct mlx5_ib_dev *dev, struct mlx5_bfreg_info *bfregi,
                        int bfregn);
 struct mlx5_ib_dev *mlx5_ib_get_ibdev_from_mpi(struct mlx5_ib_multiport_info *mpi);
 struct mlx5_core_dev *mlx5_ib_get_native_port_mdev(struct mlx5_ib_dev *dev,
-                                                  u8 ib_port_num,
-                                                  u8 *native_port_num);
+                                                  u32 ib_port_num,
+                                                  u32 *native_port_num);
 void mlx5_ib_put_native_port_mdev(struct mlx5_ib_dev *dev,
-                                 u8 port_num);
+                                 u32 port_num);
 
 extern const struct uapi_definition mlx5_ib_devx_defs[];
 extern const struct uapi_definition mlx5_ib_flow_defs[];
index db05b0e0a8d7a19c56aa6a545e670d6d3e5b9e88..4388afeff2512be8513779ef4126ecb74be9ab43 100644 (file)
@@ -42,6 +42,7 @@
 #include <rdma/ib_umem.h>
 #include <rdma/ib_umem_odp.h>
 #include <rdma/ib_verbs.h>
+#include "dm.h"
 #include "mlx5_ib.h"
 
 /*
@@ -119,8 +120,6 @@ mlx5_ib_create_mkey_cb(struct mlx5_ib_dev *dev,
                                create_mkey_callback, context);
 }
 
-static void clean_mr(struct mlx5_ib_dev *dev, struct mlx5_ib_mr *mr);
-static void dereg_mr(struct mlx5_ib_dev *dev, struct mlx5_ib_mr *mr);
 static int mr_cache_max_order(struct mlx5_ib_dev *dev);
 static void queue_adjust_cache_locked(struct mlx5_cache_ent *ent);
 
@@ -590,6 +589,8 @@ struct mlx5_ib_mr *mlx5_mr_cache_alloc(struct mlx5_ib_dev *dev,
                ent->available_mrs--;
                queue_adjust_cache_locked(ent);
                spin_unlock_irq(&ent->lock);
+
+               mlx5_clear_mr(mr);
        }
        mr->access_flags = access_flags;
        return mr;
@@ -615,42 +616,20 @@ static struct mlx5_ib_mr *get_cache_mr(struct mlx5_cache_ent *req_ent)
                        ent->available_mrs--;
                        queue_adjust_cache_locked(ent);
                        spin_unlock_irq(&ent->lock);
-                       break;
+                       mlx5_clear_mr(mr);
+                       return mr;
                }
                queue_adjust_cache_locked(ent);
                spin_unlock_irq(&ent->lock);
        }
-
-       if (!mr)
-               req_ent->miss++;
-
-       return mr;
-}
-
-static void detach_mr_from_cache(struct mlx5_ib_mr *mr)
-{
-       struct mlx5_cache_ent *ent = mr->cache_ent;
-
-       mr->cache_ent = NULL;
-       spin_lock_irq(&ent->lock);
-       ent->total_mrs--;
-       spin_unlock_irq(&ent->lock);
+       req_ent->miss++;
+       return NULL;
 }
 
-void mlx5_mr_cache_free(struct mlx5_ib_dev *dev, struct mlx5_ib_mr *mr)
+static void mlx5_mr_cache_free(struct mlx5_ib_dev *dev, struct mlx5_ib_mr *mr)
 {
        struct mlx5_cache_ent *ent = mr->cache_ent;
 
-       if (!ent)
-               return;
-
-       if (mlx5_mr_cache_invalidate(mr)) {
-               detach_mr_from_cache(mr);
-               destroy_mkey(dev, mr);
-               kfree(mr);
-               return;
-       }
-
        spin_lock_irq(&ent->lock);
        list_add_tail(&mr->list, &ent->head);
        ent->available_mrs++;
@@ -993,8 +972,6 @@ static struct mlx5_ib_mr *alloc_cacheable_mr(struct ib_pd *pd,
 
        mr->ibmr.pd = pd;
        mr->umem = umem;
-       mr->access_flags = access_flags;
-       mr->desc_size = sizeof(struct mlx5_mtt);
        mr->mmkey.iova = iova;
        mr->mmkey.size = umem->length;
        mr->mmkey.pd = to_mpd(pd)->pdn;
@@ -1028,7 +1005,7 @@ static void *mlx5_ib_alloc_xlt(size_t *nents, size_t ent_size, gfp_t gfp_mask)
         */
        might_sleep();
 
-       gfp_mask |= __GFP_ZERO;
+       gfp_mask |= __GFP_ZERO | __GFP_NORETRY;
 
        /*
         * If the system already has a suitable high order page then just use
@@ -1505,7 +1482,7 @@ static struct ib_mr *create_real_mr(struct ib_pd *pd, struct ib_umem *umem,
                 */
                err = mlx5_ib_update_mr_pas(mr, MLX5_IB_UPD_XLT_ENABLE);
                if (err) {
-                       dereg_mr(dev, mr);
+                       mlx5_ib_dereg_mr(&mr->ibmr, NULL);
                        return ERR_PTR(err);
                }
        }
@@ -1524,6 +1501,9 @@ static struct ib_mr *create_user_odp_mr(struct ib_pd *pd, u64 start, u64 length,
        if (!IS_ENABLED(CONFIG_INFINIBAND_ON_DEMAND_PAGING))
                return ERR_PTR(-EOPNOTSUPP);
 
+       err = mlx5r_odp_create_eq(dev, &dev->odp_pf_eq);
+       if (err)
+               return ERR_PTR(err);
        if (!start && length == U64_MAX) {
                if (iova != 0)
                        return ERR_PTR(-EINVAL);
@@ -1562,7 +1542,7 @@ static struct ib_mr *create_user_odp_mr(struct ib_pd *pd, u64 start, u64 length,
        return &mr->ibmr;
 
 err_dereg_mr:
-       dereg_mr(dev, mr);
+       mlx5_ib_dereg_mr(&mr->ibmr, NULL);
        return ERR_PTR(err);
 }
 
@@ -1659,19 +1639,19 @@ struct ib_mr *mlx5_ib_reg_user_mr_dmabuf(struct ib_pd *pd, u64 offset,
        return &mr->ibmr;
 
 err_dereg_mr:
-       dereg_mr(dev, mr);
+       mlx5_ib_dereg_mr(&mr->ibmr, NULL);
        return ERR_PTR(err);
 }
 
 /**
- * mlx5_mr_cache_invalidate - Fence all DMA on the MR
+ * revoke_mr - Fence all DMA on the MR
  * @mr: The MR to fence
  *
  * Upon return the NIC will not be doing any DMA to the pages under the MR,
- * and any DMA inprogress will be completed. Failure of this function
+ * and any DMA in progress will be completed. Failure of this function
  * indicates the HW has failed catastrophically.
  */
-int mlx5_mr_cache_invalidate(struct mlx5_ib_mr *mr)
+static int revoke_mr(struct mlx5_ib_mr *mr)
 {
        struct mlx5_umr_wr umrwr = {};
 
@@ -1765,7 +1745,7 @@ static int umr_rereg_pas(struct mlx5_ib_mr *mr, struct ib_pd *pd,
         * with it. This ensure the change is atomic relative to any use of the
         * MR.
         */
-       err = mlx5_mr_cache_invalidate(mr);
+       err = revoke_mr(mr);
        if (err)
                return err;
 
@@ -1844,7 +1824,7 @@ struct ib_mr *mlx5_ib_rereg_user_mr(struct ib_mr *ib_mr, int flags, u64 start,
                 * Only one active MR can refer to a umem at one time, revoke
                 * the old MR before assigning the umem to the new one.
                 */
-               err = mlx5_mr_cache_invalidate(mr);
+               err = revoke_mr(mr);
                if (err)
                        return ERR_PTR(err);
                umem = mr->umem;
@@ -1931,7 +1911,7 @@ err:
 static void
 mlx5_free_priv_descs(struct mlx5_ib_mr *mr)
 {
-       if (mr->descs) {
+       if (!mr->umem && mr->descs) {
                struct ib_device *device = mr->ibmr.device;
                int size = mr->max_descs * mr->desc_size;
                struct mlx5_ib_dev *dev = to_mdev(device);
@@ -1943,69 +1923,82 @@ mlx5_free_priv_descs(struct mlx5_ib_mr *mr)
        }
 }
 
-static void clean_mr(struct mlx5_ib_dev *dev, struct mlx5_ib_mr *mr)
+int mlx5_ib_dereg_mr(struct ib_mr *ibmr, struct ib_udata *udata)
 {
-       if (mr->sig) {
+       struct mlx5_ib_mr *mr = to_mmr(ibmr);
+       struct mlx5_ib_dev *dev = to_mdev(ibmr->device);
+       int rc;
+
+       /*
+        * Any async use of the mr must hold the refcount, once the refcount
+        * goes to zero no other thread, such as ODP page faults, prefetch, any
+        * UMR activity, etc can touch the mkey. Thus it is safe to destroy it.
+        */
+       if (IS_ENABLED(CONFIG_INFINIBAND_ON_DEMAND_PAGING) &&
+           refcount_read(&mr->mmkey.usecount) != 0 &&
+           xa_erase(&mr_to_mdev(mr)->odp_mkeys, mlx5_base_mkey(mr->mmkey.key)))
+               mlx5r_deref_wait_odp_mkey(&mr->mmkey);
+
+       if (ibmr->type == IB_MR_TYPE_INTEGRITY) {
+               xa_cmpxchg(&dev->sig_mrs, mlx5_base_mkey(mr->mmkey.key), ibmr,
+                          NULL, GFP_KERNEL);
+
+               if (mr->mtt_mr) {
+                       rc = mlx5_ib_dereg_mr(&mr->mtt_mr->ibmr, NULL);
+                       if (rc)
+                               return rc;
+                       mr->mtt_mr = NULL;
+               }
+               if (mr->klm_mr) {
+                       rc = mlx5_ib_dereg_mr(&mr->klm_mr->ibmr, NULL);
+                       if (rc)
+                               return rc;
+                       mr->klm_mr = NULL;
+               }
+
                if (mlx5_core_destroy_psv(dev->mdev,
                                          mr->sig->psv_memory.psv_idx))
                        mlx5_ib_warn(dev, "failed to destroy mem psv %d\n",
                                     mr->sig->psv_memory.psv_idx);
-               if (mlx5_core_destroy_psv(dev->mdev,
-                                         mr->sig->psv_wire.psv_idx))
+               if (mlx5_core_destroy_psv(dev->mdev, mr->sig->psv_wire.psv_idx))
                        mlx5_ib_warn(dev, "failed to destroy wire psv %d\n",
                                     mr->sig->psv_wire.psv_idx);
-               xa_erase(&dev->sig_mrs, mlx5_base_mkey(mr->mmkey.key));
                kfree(mr->sig);
                mr->sig = NULL;
        }
 
+       /* Stop DMA */
+       if (mr->cache_ent) {
+               if (revoke_mr(mr)) {
+                       spin_lock_irq(&mr->cache_ent->lock);
+                       mr->cache_ent->total_mrs--;
+                       spin_unlock_irq(&mr->cache_ent->lock);
+                       mr->cache_ent = NULL;
+               }
+       }
        if (!mr->cache_ent) {
-               destroy_mkey(dev, mr);
-               mlx5_free_priv_descs(mr);
+               rc = destroy_mkey(to_mdev(mr->ibmr.device), mr);
+               if (rc)
+                       return rc;
        }
-}
 
-static void dereg_mr(struct mlx5_ib_dev *dev, struct mlx5_ib_mr *mr)
-{
-       struct ib_umem *umem = mr->umem;
+       if (mr->umem) {
+               bool is_odp = is_odp_mr(mr);
 
-       /* Stop all DMA */
-       if (is_odp_mr(mr))
-               mlx5_ib_fence_odp_mr(mr);
-       else if (is_dmabuf_mr(mr))
-               mlx5_ib_fence_dmabuf_mr(mr);
-       else
-               clean_mr(dev, mr);
-
-       if (umem) {
-               if (!is_odp_mr(mr))
-                       atomic_sub(ib_umem_num_pages(umem),
+               if (!is_odp)
+                       atomic_sub(ib_umem_num_pages(mr->umem),
                                   &dev->mdev->priv.reg_pages);
-               ib_umem_release(umem);
+               ib_umem_release(mr->umem);
+               if (is_odp)
+                       mlx5_ib_free_odp_mr(mr);
        }
 
-       if (mr->cache_ent)
+       if (mr->cache_ent) {
                mlx5_mr_cache_free(dev, mr);
-       else
+       } else {
+               mlx5_free_priv_descs(mr);
                kfree(mr);
-}
-
-int mlx5_ib_dereg_mr(struct ib_mr *ibmr, struct ib_udata *udata)
-{
-       struct mlx5_ib_mr *mmr = to_mmr(ibmr);
-
-       if (ibmr->type == IB_MR_TYPE_INTEGRITY) {
-               dereg_mr(to_mdev(mmr->mtt_mr->ibmr.device), mmr->mtt_mr);
-               dereg_mr(to_mdev(mmr->klm_mr->ibmr.device), mmr->klm_mr);
        }
-
-       if (is_odp_mr(mmr) && to_ib_umem_odp(mmr->umem)->is_implicit_odp) {
-               mlx5_ib_free_implicit_mr(mmr);
-               return 0;
-       }
-
-       dereg_mr(to_mdev(ibmr->device), mmr);
-
        return 0;
 }
 
@@ -2177,10 +2170,10 @@ err_free_descs:
        destroy_mkey(dev, mr);
        mlx5_free_priv_descs(mr);
 err_free_mtt_mr:
-       dereg_mr(to_mdev(mr->mtt_mr->ibmr.device), mr->mtt_mr);
+       mlx5_ib_dereg_mr(&mr->mtt_mr->ibmr, NULL);
        mr->mtt_mr = NULL;
 err_free_klm_mr:
-       dereg_mr(to_mdev(mr->klm_mr->ibmr.device), mr->klm_mr);
+       mlx5_ib_dereg_mr(&mr->klm_mr->ibmr, NULL);
        mr->klm_mr = NULL;
 err_destroy_psv:
        if (mlx5_core_destroy_psv(dev->mdev, mr->sig->psv_memory.psv_idx))
index b103555b1f5d4cde00efb2e64c81be88379bd412..782b2af8f2116e3ec7c420cf835e2671c54941de 100644 (file)
@@ -181,64 +181,29 @@ void mlx5_odp_populate_xlt(void *xlt, size_t idx, size_t nentries,
        }
 }
 
-static void dma_fence_odp_mr(struct mlx5_ib_mr *mr)
-{
-       struct ib_umem_odp *odp = to_ib_umem_odp(mr->umem);
-
-       /* Ensure mlx5_ib_invalidate_range() will not touch the MR any more */
-       mutex_lock(&odp->umem_mutex);
-       if (odp->npages) {
-               mlx5_mr_cache_invalidate(mr);
-               ib_umem_odp_unmap_dma_pages(odp, ib_umem_start(odp),
-                                           ib_umem_end(odp));
-               WARN_ON(odp->npages);
-       }
-       odp->private = NULL;
-       mutex_unlock(&odp->umem_mutex);
-
-       if (!mr->cache_ent) {
-               mlx5_core_destroy_mkey(mr_to_mdev(mr)->mdev, &mr->mmkey);
-               WARN_ON(mr->descs);
-       }
-}
-
 /*
  * This must be called after the mr has been removed from implicit_children.
  * NOTE: The MR does not necessarily have to be
  * empty here, parallel page faults could have raced with the free process and
  * added pages to it.
  */
-static void free_implicit_child_mr(struct mlx5_ib_mr *mr, bool need_imr_xlt)
+static void free_implicit_child_mr_work(struct work_struct *work)
 {
+       struct mlx5_ib_mr *mr =
+               container_of(work, struct mlx5_ib_mr, odp_destroy.work);
        struct mlx5_ib_mr *imr = mr->parent;
        struct ib_umem_odp *odp_imr = to_ib_umem_odp(imr->umem);
        struct ib_umem_odp *odp = to_ib_umem_odp(mr->umem);
-       unsigned long idx = ib_umem_start(odp) >> MLX5_IMR_MTT_SHIFT;
 
        mlx5r_deref_wait_odp_mkey(&mr->mmkey);
 
-       if (need_imr_xlt) {
-               mutex_lock(&odp_imr->umem_mutex);
-               mlx5_ib_update_xlt(mr->parent, idx, 1, 0,
-                                  MLX5_IB_UPD_XLT_INDIRECT |
-                                  MLX5_IB_UPD_XLT_ATOMIC);
-               mutex_unlock(&odp_imr->umem_mutex);
-       }
-
-       dma_fence_odp_mr(mr);
-
-       mr->parent = NULL;
-       mlx5_mr_cache_free(mr_to_mdev(mr), mr);
-       ib_umem_odp_release(odp);
-}
-
-static void free_implicit_child_mr_work(struct work_struct *work)
-{
-       struct mlx5_ib_mr *mr =
-               container_of(work, struct mlx5_ib_mr, odp_destroy.work);
-       struct mlx5_ib_mr *imr = mr->parent;
+       mutex_lock(&odp_imr->umem_mutex);
+       mlx5_ib_update_xlt(mr->parent, ib_umem_start(odp) >> MLX5_IMR_MTT_SHIFT,
+                          1, 0,
+                          MLX5_IB_UPD_XLT_INDIRECT | MLX5_IB_UPD_XLT_ATOMIC);
+       mutex_unlock(&odp_imr->umem_mutex);
+       mlx5_ib_dereg_mr(&mr->ibmr, NULL);
 
-       free_implicit_child_mr(mr, true);
        mlx5r_deref_odp_mkey(&imr->mmkey);
 }
 
@@ -352,7 +317,7 @@ const struct mmu_interval_notifier_ops mlx5_mn_ops = {
        .invalidate = mlx5_ib_invalidate_range,
 };
 
-void mlx5_ib_internal_fill_odp_caps(struct mlx5_ib_dev *dev)
+static void internal_fill_odp_caps(struct mlx5_ib_dev *dev)
 {
        struct ib_odp_caps *caps = &dev->odp_caps;
 
@@ -455,8 +420,10 @@ static struct mlx5_ib_mr *implicit_get_child_mr(struct mlx5_ib_mr *imr,
 
        ret = mr = mlx5_mr_cache_alloc(
                mr_to_mdev(imr), MLX5_IMR_MTT_CACHE_ENTRY, imr->access_flags);
-       if (IS_ERR(mr))
-               goto out_umem;
+       if (IS_ERR(mr)) {
+               ib_umem_odp_release(odp);
+               return mr;
+       }
 
        mr->ibmr.pd = imr->ibmr.pd;
        mr->ibmr.device = &mr_to_mdev(imr)->ib_dev;
@@ -506,9 +473,7 @@ static struct mlx5_ib_mr *implicit_get_child_mr(struct mlx5_ib_mr *imr,
 out_lock:
        xa_unlock(&imr->implicit_children);
 out_mr:
-       mlx5_mr_cache_free(mr_to_mdev(imr), mr);
-out_umem:
-       ib_umem_odp_release(odp);
+       mlx5_ib_dereg_mr(&mr->ibmr, NULL);
        return ret;
 }
 
@@ -531,8 +496,8 @@ struct mlx5_ib_mr *mlx5_ib_alloc_implicit_mr(struct mlx5_ib_pd *pd,
 
        imr = mlx5_mr_cache_alloc(dev, MLX5_IMR_KSM_CACHE_ENTRY, access_flags);
        if (IS_ERR(imr)) {
-               err = PTR_ERR(imr);
-               goto out_umem;
+               ib_umem_odp_release(umem_odp);
+               return imr;
        }
 
        imr->ibmr.pd = &pd->ibpd;
@@ -562,93 +527,22 @@ struct mlx5_ib_mr *mlx5_ib_alloc_implicit_mr(struct mlx5_ib_pd *pd,
        return imr;
 out_mr:
        mlx5_ib_err(dev, "Failed to register MKEY %d\n", err);
-       mlx5_mr_cache_free(dev, imr);
-out_umem:
-       ib_umem_odp_release(umem_odp);
+       mlx5_ib_dereg_mr(&imr->ibmr, NULL);
        return ERR_PTR(err);
 }
 
-void mlx5_ib_free_implicit_mr(struct mlx5_ib_mr *imr)
+void mlx5_ib_free_odp_mr(struct mlx5_ib_mr *mr)
 {
-       struct ib_umem_odp *odp_imr = to_ib_umem_odp(imr->umem);
-       struct mlx5_ib_dev *dev = mr_to_mdev(imr);
        struct mlx5_ib_mr *mtt;
        unsigned long idx;
 
-       xa_erase(&dev->odp_mkeys, mlx5_base_mkey(imr->mmkey.key));
-       /*
-        * All work on the prefetch list must be completed, xa_erase() prevented
-        * new work from being created.
-        */
-       mlx5r_deref_wait_odp_mkey(&imr->mmkey);
-       /*
-        * At this point it is forbidden for any other thread to enter
-        * pagefault_mr() on this imr. It is already forbidden to call
-        * pagefault_mr() on an implicit child. Due to this additions to
-        * implicit_children are prevented.
-        * In addition, any new call to destroy_unused_implicit_child_mr()
-        * may return immediately.
-        */
-
        /*
-        * Fence the imr before we destroy the children. This allows us to
-        * skip updating the XLT of the imr during destroy of the child mkey
-        * the imr points to.
+        * If this is an implicit MR it is already invalidated so we can just
+        * delete the children mkeys.
         */
-       mlx5_mr_cache_invalidate(imr);
-
-       xa_for_each(&imr->implicit_children, idx, mtt) {
-               xa_erase(&imr->implicit_children, idx);
-               free_implicit_child_mr(mtt, false);
-       }
-
-       mlx5_mr_cache_free(dev, imr);
-       ib_umem_odp_release(odp_imr);
-}
-
-/**
- * mlx5_ib_fence_odp_mr - Stop all access to the ODP MR
- * @mr: to fence
- *
- * On return no parallel threads will be touching this MR and no DMA will be
- * active.
- */
-void mlx5_ib_fence_odp_mr(struct mlx5_ib_mr *mr)
-{
-       /* Prevent new page faults and prefetch requests from succeeding */
-       xa_erase(&mr_to_mdev(mr)->odp_mkeys, mlx5_base_mkey(mr->mmkey.key));
-
-       /* Wait for all running page-fault handlers to finish. */
-       mlx5r_deref_wait_odp_mkey(&mr->mmkey);
-
-       dma_fence_odp_mr(mr);
-}
-
-/**
- * mlx5_ib_fence_dmabuf_mr - Stop all access to the dmabuf MR
- * @mr: to fence
- *
- * On return no parallel threads will be touching this MR and no DMA will be
- * active.
- */
-void mlx5_ib_fence_dmabuf_mr(struct mlx5_ib_mr *mr)
-{
-       struct ib_umem_dmabuf *umem_dmabuf = to_ib_umem_dmabuf(mr->umem);
-
-       /* Prevent new page faults and prefetch requests from succeeding */
-       xa_erase(&mr_to_mdev(mr)->odp_mkeys, mlx5_base_mkey(mr->mmkey.key));
-
-       mlx5r_deref_wait_odp_mkey(&mr->mmkey);
-
-       dma_resv_lock(umem_dmabuf->attach->dmabuf->resv, NULL);
-       mlx5_mr_cache_invalidate(mr);
-       umem_dmabuf->private = NULL;
-       ib_umem_dmabuf_unmap_pages(umem_dmabuf);
-       dma_resv_unlock(umem_dmabuf->attach->dmabuf->resv);
-
-       if (!mr->cache_ent) {
-               mlx5_core_destroy_mkey(mr_to_mdev(mr)->mdev, &mr->mmkey);
-               WARN_ON(mr->descs);
+       xa_for_each(&mr->implicit_children, idx, mtt) {
+               xa_erase(&mr->implicit_children, idx);
+               mlx5_ib_dereg_mr(&mtt->ibmr, NULL);
        }
 }
 
@@ -1637,20 +1531,24 @@ enum {
        MLX5_IB_NUM_PF_DRAIN    = 64,
 };
 
-static int
-mlx5_ib_create_pf_eq(struct mlx5_ib_dev *dev, struct mlx5_ib_pf_eq *eq)
+int mlx5r_odp_create_eq(struct mlx5_ib_dev *dev, struct mlx5_ib_pf_eq *eq)
 {
        struct mlx5_eq_param param = {};
-       int err;
+       int err = 0;
 
+       mutex_lock(&dev->odp_eq_mutex);
+       if (eq->core)
+               goto unlock;
        INIT_WORK(&eq->work, mlx5_ib_eq_pf_action);
        spin_lock_init(&eq->lock);
        eq->dev = dev;
 
        eq->pool = mempool_create_kmalloc_pool(MLX5_IB_NUM_PF_DRAIN,
                                               sizeof(struct mlx5_pagefault));
-       if (!eq->pool)
-               return -ENOMEM;
+       if (!eq->pool) {
+               err = -ENOMEM;
+               goto unlock;
+       }
 
        eq->wq = alloc_workqueue("mlx5_ib_page_fault",
                                 WQ_HIGHPRI | WQ_UNBOUND | WQ_MEM_RECLAIM,
@@ -1661,7 +1559,7 @@ mlx5_ib_create_pf_eq(struct mlx5_ib_dev *dev, struct mlx5_ib_pf_eq *eq)
        }
 
        eq->irq_nb.notifier_call = mlx5_ib_eq_pf_int;
-       param = (struct mlx5_eq_param) {
+       param = (struct mlx5_eq_param){
                .irq_index = 0,
                .nent = MLX5_IB_NUM_PF_EQE,
        };
@@ -1677,21 +1575,27 @@ mlx5_ib_create_pf_eq(struct mlx5_ib_dev *dev, struct mlx5_ib_pf_eq *eq)
                goto err_eq;
        }
 
+       mutex_unlock(&dev->odp_eq_mutex);
        return 0;
 err_eq:
        mlx5_eq_destroy_generic(dev->mdev, eq->core);
 err_wq:
+       eq->core = NULL;
        destroy_workqueue(eq->wq);
 err_mempool:
        mempool_destroy(eq->pool);
+unlock:
+       mutex_unlock(&dev->odp_eq_mutex);
        return err;
 }
 
 static int
-mlx5_ib_destroy_pf_eq(struct mlx5_ib_dev *dev, struct mlx5_ib_pf_eq *eq)
+mlx5_ib_odp_destroy_eq(struct mlx5_ib_dev *dev, struct mlx5_ib_pf_eq *eq)
 {
        int err;
 
+       if (!eq->core)
+               return 0;
        mlx5_eq_disable(dev->mdev, eq->core, &eq->irq_nb);
        err = mlx5_eq_destroy_generic(dev->mdev, eq->core);
        cancel_work_sync(&eq->work);
@@ -1735,6 +1639,8 @@ int mlx5_ib_odp_init_one(struct mlx5_ib_dev *dev)
 {
        int ret = 0;
 
+       internal_fill_odp_caps(dev);
+
        if (!(dev->odp_caps.general_caps & IB_ODP_SUPPORT))
                return ret;
 
@@ -1748,8 +1654,7 @@ int mlx5_ib_odp_init_one(struct mlx5_ib_dev *dev)
                }
        }
 
-       ret = mlx5_ib_create_pf_eq(dev, &dev->odp_pf_eq);
-
+       mutex_init(&dev->odp_eq_mutex);
        return ret;
 }
 
@@ -1758,7 +1663,7 @@ void mlx5_ib_odp_cleanup_one(struct mlx5_ib_dev *dev)
        if (!(dev->odp_caps.general_caps & IB_ODP_SUPPORT))
                return;
 
-       mlx5_ib_destroy_pf_eq(dev, &dev->odp_pf_eq);
+       mlx5_ib_odp_destroy_eq(dev, &dev->odp_pf_eq);
 }
 
 int mlx5_ib_odp_init(void)
index f5a52a6fae4372c07c2d87fc74b0767cd3473f75..9282eb10bfaed2ff7cbee86ca0e51ac3da3af2df 100644 (file)
@@ -67,7 +67,7 @@ struct mlx5_modify_raw_qp_param {
        struct mlx5_rate_limit rl;
 
        u8 rq_q_ctr_id;
-       u16 port;
+       u32 port;
 };
 
 static void get_cqs(enum ib_qp_type qp_type,
@@ -3146,6 +3146,19 @@ enum {
        MLX5_PATH_FLAG_COUNTER  = 1 << 2,
 };
 
+static int mlx5_to_ib_rate_map(u8 rate)
+{
+       static const int rates[] = { IB_RATE_PORT_CURRENT, IB_RATE_56_GBPS,
+                                    IB_RATE_25_GBPS,      IB_RATE_100_GBPS,
+                                    IB_RATE_200_GBPS,     IB_RATE_50_GBPS,
+                                    IB_RATE_400_GBPS };
+
+       if (rate < ARRAY_SIZE(rates))
+               return rates[rate];
+
+       return rate - MLX5_STAT_RATE_OFFSET;
+}
+
 static int ib_to_mlx5_rate_map(u8 rate)
 {
        switch (rate) {
@@ -4485,7 +4498,7 @@ static void to_rdma_ah_attr(struct mlx5_ib_dev *ibdev,
        rdma_ah_set_path_bits(ah_attr, MLX5_GET(ads, path, mlid));
 
        static_rate = MLX5_GET(ads, path, stat_rate);
-       rdma_ah_set_static_rate(ah_attr, static_rate ? static_rate - 5 : 0);
+       rdma_ah_set_static_rate(ah_attr, mlx5_to_ib_rate_map(static_rate));
        if (MLX5_GET(ads, path, grh) ||
            ah_attr->type == RDMA_AH_ATTR_TYPE_ROCE) {
                rdma_ah_set_grh(ah_attr, NULL, MLX5_GET(ads, path, flow_label),
index 16145fda68d0d8e0ea0144151b0946f29460639f..c0ddf7b3c6e2ba27d8730604f26173d3de65a650 100644 (file)
@@ -7,6 +7,8 @@
 #include <rdma/mlx5_user_ioctl_cmds.h>
 #include <rdma/mlx5_user_ioctl_verbs.h>
 #include <linux/mlx5/driver.h>
+#include <linux/mlx5/eswitch.h>
+#include <linux/mlx5/vport.h>
 #include "mlx5_ib.h"
 
 #define UVERBS_MODULE_NAME mlx5_ib
@@ -23,6 +25,174 @@ static int UVERBS_HANDLER(MLX5_IB_METHOD_PD_QUERY)(
                              &mpd->pdn, sizeof(mpd->pdn));
 }
 
+static int fill_vport_icm_addr(struct mlx5_core_dev *mdev, u16 vport,
+                              struct mlx5_ib_uapi_query_port *info)
+{
+       u32 out[MLX5_ST_SZ_DW(query_esw_vport_context_out)] = {};
+       u32 in[MLX5_ST_SZ_DW(query_esw_vport_context_in)] = {};
+       bool sw_owner_supp;
+       u64 icm_rx;
+       u64 icm_tx;
+       int err;
+
+       sw_owner_supp = MLX5_CAP_ESW_FLOWTABLE_FDB(mdev, sw_owner) ||
+                       MLX5_CAP_ESW_FLOWTABLE_FDB(mdev, sw_owner_v2);
+
+       if (vport == MLX5_VPORT_UPLINK) {
+               icm_rx = MLX5_CAP64_ESW_FLOWTABLE(mdev,
+                       sw_steering_uplink_icm_address_rx);
+               icm_tx = MLX5_CAP64_ESW_FLOWTABLE(mdev,
+                       sw_steering_uplink_icm_address_tx);
+       } else {
+               MLX5_SET(query_esw_vport_context_in, in, opcode,
+                        MLX5_CMD_OP_QUERY_ESW_VPORT_CONTEXT);
+               MLX5_SET(query_esw_vport_context_in, in, vport_number, vport);
+               MLX5_SET(query_esw_vport_context_in, in, other_vport, true);
+
+               err = mlx5_cmd_exec_inout(mdev, query_esw_vport_context, in,
+                                         out);
+
+               if (err)
+                       return err;
+
+               icm_rx = MLX5_GET64(
+                       query_esw_vport_context_out, out,
+                       esw_vport_context.sw_steering_vport_icm_address_rx);
+
+               icm_tx = MLX5_GET64(
+                       query_esw_vport_context_out, out,
+                       esw_vport_context.sw_steering_vport_icm_address_tx);
+       }
+
+       if (sw_owner_supp && icm_rx) {
+               info->vport_steering_icm_rx = icm_rx;
+               info->flags |=
+                       MLX5_IB_UAPI_QUERY_PORT_VPORT_STEERING_ICM_RX;
+       }
+
+       if (sw_owner_supp && icm_tx) {
+               info->vport_steering_icm_tx = icm_tx;
+               info->flags |=
+                       MLX5_IB_UAPI_QUERY_PORT_VPORT_STEERING_ICM_TX;
+       }
+
+       return 0;
+}
+
+static int fill_vport_vhca_id(struct mlx5_core_dev *mdev, u16 vport,
+                             struct mlx5_ib_uapi_query_port *info)
+{
+       size_t out_sz = MLX5_ST_SZ_BYTES(query_hca_cap_out);
+       u32 in[MLX5_ST_SZ_DW(query_hca_cap_in)] = {};
+       void *out;
+       int err;
+
+       out = kzalloc(out_sz, GFP_KERNEL);
+       if (!out)
+               return -ENOMEM;
+
+       MLX5_SET(query_hca_cap_in, in, opcode, MLX5_CMD_OP_QUERY_HCA_CAP);
+       MLX5_SET(query_hca_cap_in, in, other_function, true);
+       MLX5_SET(query_hca_cap_in, in, function_id, vport);
+       MLX5_SET(query_hca_cap_in, in, op_mod,
+                MLX5_SET_HCA_CAP_OP_MOD_GENERAL_DEVICE |
+                HCA_CAP_OPMOD_GET_CUR);
+
+       err = mlx5_cmd_exec(mdev, in, sizeof(in), out, out_sz);
+       if (err)
+               goto out;
+
+       info->vport_vhca_id = MLX5_GET(query_hca_cap_out, out,
+                                      capability.cmd_hca_cap.vhca_id);
+
+       info->flags |= MLX5_IB_UAPI_QUERY_PORT_VPORT_VHCA_ID;
+out:
+       kfree(out);
+       return err;
+}
+
+static int fill_switchdev_info(struct mlx5_ib_dev *dev, u32 port_num,
+                              struct mlx5_ib_uapi_query_port *info)
+{
+       struct mlx5_core_dev *mdev = dev->mdev;
+       struct mlx5_eswitch_rep *rep;
+       int err;
+
+       rep = dev->port[port_num - 1].rep;
+       if (!rep)
+               return -EOPNOTSUPP;
+
+       info->vport = rep->vport;
+       info->flags |= MLX5_IB_UAPI_QUERY_PORT_VPORT;
+
+       if (rep->vport != MLX5_VPORT_UPLINK) {
+               err = fill_vport_vhca_id(mdev, rep->vport, info);
+               if (err)
+                       return err;
+       }
+
+       info->esw_owner_vhca_id = MLX5_CAP_GEN(mdev, vhca_id);
+       info->flags |= MLX5_IB_UAPI_QUERY_PORT_ESW_OWNER_VHCA_ID;
+
+       err = fill_vport_icm_addr(mdev, rep->vport, info);
+       if (err)
+               return err;
+
+       if (mlx5_eswitch_vport_match_metadata_enabled(mdev->priv.eswitch)) {
+               info->reg_c0.value = mlx5_eswitch_get_vport_metadata_for_match(
+                       mdev->priv.eswitch, rep->vport);
+               info->reg_c0.mask = mlx5_eswitch_get_vport_metadata_mask();
+               info->flags |= MLX5_IB_UAPI_QUERY_PORT_VPORT_REG_C0;
+       }
+
+       return 0;
+}
+
+static int UVERBS_HANDLER(MLX5_IB_METHOD_QUERY_PORT)(
+       struct uverbs_attr_bundle *attrs)
+{
+       struct mlx5_ib_uapi_query_port info = {};
+       struct mlx5_ib_ucontext *c;
+       struct mlx5_ib_dev *dev;
+       u32 port_num;
+       int ret;
+
+       if (uverbs_copy_from(&port_num, attrs,
+                            MLX5_IB_ATTR_QUERY_PORT_PORT_NUM))
+               return -EFAULT;
+
+       c = to_mucontext(ib_uverbs_get_ucontext(attrs));
+       if (IS_ERR(c))
+               return PTR_ERR(c);
+       dev = to_mdev(c->ibucontext.device);
+
+       if (!rdma_is_port_valid(&dev->ib_dev, port_num))
+               return -EINVAL;
+
+       if (mlx5_eswitch_mode(dev->mdev) == MLX5_ESWITCH_OFFLOADS) {
+               ret = fill_switchdev_info(dev, port_num, &info);
+               if (ret)
+                       return ret;
+       }
+
+       return uverbs_copy_to_struct_or_zero(attrs, MLX5_IB_ATTR_QUERY_PORT, &info,
+                                            sizeof(info));
+}
+
+DECLARE_UVERBS_NAMED_METHOD(
+       MLX5_IB_METHOD_QUERY_PORT,
+       UVERBS_ATTR_PTR_IN(MLX5_IB_ATTR_QUERY_PORT_PORT_NUM,
+                          UVERBS_ATTR_TYPE(u32), UA_MANDATORY),
+       UVERBS_ATTR_PTR_OUT(
+               MLX5_IB_ATTR_QUERY_PORT,
+               UVERBS_ATTR_STRUCT(struct mlx5_ib_uapi_query_port,
+                                  reg_c0),
+               UA_MANDATORY));
+
+ADD_UVERBS_METHODS(mlx5_ib_device,
+                  UVERBS_OBJECT_DEVICE,
+                  &UVERBS_METHOD(MLX5_IB_METHOD_QUERY_PORT));
+
 DECLARE_UVERBS_NAMED_METHOD(
        MLX5_IB_METHOD_PD_QUERY,
        UVERBS_ATTR_IDR(MLX5_IB_ATTR_QUERY_PD_HANDLE,
@@ -41,5 +211,8 @@ const struct uapi_definition mlx5_ib_std_types_defs[] = {
        UAPI_DEF_CHAIN_OBJ_TREE(
                UVERBS_OBJECT_PD,
                &mlx5_ib_pd),
+       UAPI_DEF_CHAIN_OBJ_TREE(
+               UVERBS_OBJECT_DEVICE,
+               &mlx5_ib_device),
        {},
 };
index f051f4e06b539c791c1d7211a7c5a5c95efe3a9d..3df1f5ff793241054f431924a384df7602d143d3 100644 (file)
@@ -91,7 +91,7 @@ static enum ib_rate tavor_rate_to_ib(u8 mthca_rate, u8 port_rate)
        }
 }
 
-enum ib_rate mthca_rate_to_ib(struct mthca_dev *dev, u8 mthca_rate, u8 port)
+enum ib_rate mthca_rate_to_ib(struct mthca_dev *dev, u8 mthca_rate, u32 port)
 {
        if (mthca_is_memfree(dev)) {
                /* Handle old Arbel FW */
@@ -131,7 +131,7 @@ static u8 ib_rate_to_tavor(u8 static_rate)
        }
 }
 
-u8 mthca_get_rate(struct mthca_dev *dev, int static_rate, u8 port)
+u8 mthca_get_rate(struct mthca_dev *dev, int static_rate, u32 port)
 {
        u8 rate;
 
@@ -293,7 +293,7 @@ int mthca_ah_query(struct ib_ah *ibah, struct rdma_ah_attr *attr)
 {
        struct mthca_ah *ah   = to_mah(ibah);
        struct mthca_dev *dev = to_mdev(ibah->device);
-       u8 port_num = be32_to_cpu(ah->av->port_pd) >> 24;
+       u32 port_num = be32_to_cpu(ah->av->port_pd) >> 24;
 
        /* Only implement for MAD and memfree ah for now. */
        if (ah->type == MTHCA_AH_ON_HCA)
index a445160de3e16c1f04a1ccc72141ffeed7248f72..a4a9d871d00eb0f70e8da8025a66260448a25b7a 100644 (file)
@@ -546,7 +546,7 @@ int mthca_alloc_sqp(struct mthca_dev *dev,
                    enum ib_sig_type send_policy,
                    struct ib_qp_cap *cap,
                    int qpn,
-                   int port,
+                   u32 port,
                    struct mthca_qp *qp,
                    struct ib_udata *udata);
 void mthca_free_qp(struct mthca_dev *dev, struct mthca_qp *qp);
@@ -559,13 +559,13 @@ int mthca_read_ah(struct mthca_dev *dev, struct mthca_ah *ah,
                  struct ib_ud_header *header);
 int mthca_ah_query(struct ib_ah *ibah, struct rdma_ah_attr *attr);
 int mthca_ah_grh_present(struct mthca_ah *ah);
-u8 mthca_get_rate(struct mthca_dev *dev, int static_rate, u8 port);
-enum ib_rate mthca_rate_to_ib(struct mthca_dev *dev, u8 mthca_rate, u8 port);
+u8 mthca_get_rate(struct mthca_dev *dev, int static_rate, u32 port);
+enum ib_rate mthca_rate_to_ib(struct mthca_dev *dev, u8 mthca_rate, u32 port);
 
 int mthca_multicast_attach(struct ib_qp *ibqp, union ib_gid *gid, u16 lid);
 int mthca_multicast_detach(struct ib_qp *ibqp, union ib_gid *gid, u16 lid);
 
-int mthca_process_mad(struct ib_device *ibdev, int mad_flags, u8 port_num,
+int mthca_process_mad(struct ib_device *ibdev, int mad_flags, u32 port_num,
                      const struct ib_wc *in_wc, const struct ib_grh *in_grh,
                      const struct ib_mad *in, struct ib_mad *out,
                      size_t *out_mad_size, u16 *out_mad_pkey_index);
index 99aa8183a7f2b590fe7581d82064b0c1e9c6d9fe..04252700790e11d14bc836005859edd4aa4e67fd 100644 (file)
@@ -162,7 +162,7 @@ static void node_desc_override(struct ib_device *dev,
 }
 
 static void forward_trap(struct mthca_dev *dev,
-                        u8 port_num,
+                        u32 port_num,
                         const struct ib_mad *mad)
 {
        int qpn = mad->mad_hdr.mgmt_class != IB_MGMT_CLASS_SUBN_LID_ROUTED;
@@ -196,7 +196,7 @@ static void forward_trap(struct mthca_dev *dev,
        }
 }
 
-int mthca_process_mad(struct ib_device *ibdev, int mad_flags, u8 port_num,
+int mthca_process_mad(struct ib_device *ibdev, int mad_flags, u32 port_num,
                      const struct ib_wc *in_wc, const struct ib_grh *in_grh,
                      const struct ib_mad *in, struct ib_mad *out,
                      size_t *out_mad_size, u16 *out_mad_pkey_index)
index 1a3dd07f993b3bbe521cf8850e0ea90142d82dc8..522bb606120e224bc02321c8ee96bb8b2c676568 100644 (file)
@@ -127,7 +127,7 @@ static int mthca_query_device(struct ib_device *ibdev, struct ib_device_attr *pr
 }
 
 static int mthca_query_port(struct ib_device *ibdev,
-                           u8 port, struct ib_port_attr *props)
+                           u32 port, struct ib_port_attr *props)
 {
        struct ib_smp *in_mad  = NULL;
        struct ib_smp *out_mad = NULL;
@@ -194,7 +194,7 @@ static int mthca_modify_device(struct ib_device *ibdev,
 }
 
 static int mthca_modify_port(struct ib_device *ibdev,
-                            u8 port, int port_modify_mask,
+                            u32 port, int port_modify_mask,
                             struct ib_port_modify *props)
 {
        struct mthca_set_ib_param set_ib;
@@ -223,7 +223,7 @@ out:
 }
 
 static int mthca_query_pkey(struct ib_device *ibdev,
-                           u8 port, u16 index, u16 *pkey)
+                           u32 port, u16 index, u16 *pkey)
 {
        struct ib_smp *in_mad  = NULL;
        struct ib_smp *out_mad = NULL;
@@ -251,7 +251,7 @@ static int mthca_query_pkey(struct ib_device *ibdev,
        return err;
 }
 
-static int mthca_query_gid(struct ib_device *ibdev, u8 port,
+static int mthca_query_gid(struct ib_device *ibdev, u32 port,
                           int index, union ib_gid *gid)
 {
        struct ib_smp *in_mad  = NULL;
@@ -1051,7 +1051,7 @@ out:
        return err;
 }
 
-static int mthca_port_immutable(struct ib_device *ibdev, u8 port_num,
+static int mthca_port_immutable(struct ib_device *ibdev, u32 port_num,
                                struct ib_port_immutable *immutable)
 {
        struct ib_port_attr attr;
index 07cfc0934b17d5efe8f812ffbb2f3452a741ea61..69bba0ef4a5dfe4748fabf5f688eb537cd6fbc85 100644 (file)
@@ -1370,7 +1370,7 @@ int mthca_alloc_sqp(struct mthca_dev *dev,
                    enum ib_sig_type send_policy,
                    struct ib_qp_cap *cap,
                    int qpn,
-                   int port,
+                   u32 port,
                    struct mthca_qp *qp,
                    struct ib_udata *udata)
 {
index 699a8b719ed6bcb4500d5d1c44a7d473082b1436..88c45928301faa6f421b5c19de82910e2db461c8 100644 (file)
@@ -250,7 +250,7 @@ int ocrdma_query_ah(struct ib_ah *ibah, struct rdma_ah_attr *attr)
 }
 
 int ocrdma_process_mad(struct ib_device *ibdev, int process_mad_flags,
-                      u8 port_num, const struct ib_wc *in_wc,
+                      u32 port_num, const struct ib_wc *in_wc,
                       const struct ib_grh *in_grh, const struct ib_mad *in,
                       struct ib_mad *out, size_t *out_mad_size,
                       u16 *out_mad_pkey_index)
index 35cf2e2ff391ccd2d63f35bf903deb5f4d5c734c..2626679df31dd2c9a66ef2feb112afe74b9d6f3b 100644 (file)
@@ -57,7 +57,7 @@ int ocrdma_destroy_ah(struct ib_ah *ah, u32 flags);
 int ocrdma_query_ah(struct ib_ah *ah, struct rdma_ah_attr *ah_attr);
 
 int ocrdma_process_mad(struct ib_device *dev, int process_mad_flags,
-                      u8 port_num, const struct ib_wc *in_wc,
+                      u32 port_num, const struct ib_wc *in_wc,
                       const struct ib_grh *in_grh, const struct ib_mad *in,
                       struct ib_mad *out, size_t *out_mad_size,
                       u16 *out_mad_pkey_index);
index 9a834a9cca0e814a12643f062a9515b58aa3c1b4..4882b3156edb75532af634a723a56809f2c60853 100644 (file)
@@ -77,12 +77,12 @@ void ocrdma_get_guid(struct ocrdma_dev *dev, u8 *guid)
        guid[7] = mac_addr[5];
 }
 static enum rdma_link_layer ocrdma_link_layer(struct ib_device *device,
-                                             u8 port_num)
+                                             u32 port_num)
 {
        return IB_LINK_LAYER_ETHERNET;
 }
 
-static int ocrdma_port_immutable(struct ib_device *ibdev, u8 port_num,
+static int ocrdma_port_immutable(struct ib_device *ibdev, u32 port_num,
                                 struct ib_port_immutable *immutable)
 {
        struct ib_port_attr attr;
index 3acb5c10b1553f03ab96a3336d9c0318e9edd966..58619ce64d0d3a055a32ba77144f19d4397b067a 100644 (file)
@@ -54,7 +54,7 @@
 #include "ocrdma_verbs.h"
 #include <rdma/ocrdma-abi.h>
 
-int ocrdma_query_pkey(struct ib_device *ibdev, u8 port, u16 index, u16 *pkey)
+int ocrdma_query_pkey(struct ib_device *ibdev, u32 port, u16 index, u16 *pkey)
 {
        if (index > 0)
                return -EINVAL;
@@ -150,7 +150,7 @@ static inline void get_link_speed_and_width(struct ocrdma_dev *dev,
 }
 
 int ocrdma_query_port(struct ib_device *ibdev,
-                     u8 port, struct ib_port_attr *props)
+                     u32 port, struct ib_port_attr *props)
 {
        enum ib_port_state port_state;
        struct ocrdma_dev *dev;
index 425d554e7f3f5fcb0b4f3340c183b7266bc9b463..b1c5fad816033946969009759a92844fa58839e0 100644 (file)
@@ -53,13 +53,14 @@ int ocrdma_arm_cq(struct ib_cq *, enum ib_cq_notify_flags flags);
 
 int ocrdma_query_device(struct ib_device *, struct ib_device_attr *props,
                        struct ib_udata *uhw);
-int ocrdma_query_port(struct ib_device *, u8 port, struct ib_port_attr *props);
+int ocrdma_query_port(struct ib_device *ibdev, u32 port,
+                     struct ib_port_attr *props);
 
 enum rdma_protocol_type
-ocrdma_query_protocol(struct ib_device *device, u8 port_num);
+ocrdma_query_protocol(struct ib_device *device, u32 port_num);
 
 void ocrdma_get_guid(struct ocrdma_dev *, u8 *guid);
-int ocrdma_query_pkey(struct ib_device *, u8 port, u16 index, u16 *pkey);
+int ocrdma_query_pkey(struct ib_device *ibdev, u32 port, u16 index, u16 *pkey);
 
 int ocrdma_alloc_ucontext(struct ib_ucontext *uctx, struct ib_udata *udata);
 void ocrdma_dealloc_ucontext(struct ib_ucontext *uctx);
index 8e7c069e1a2d46f28d964437aa6314338a0343de..8334a9850220be6eef3182d4d6b563d77be222e0 100644 (file)
@@ -53,7 +53,7 @@ MODULE_LICENSE("Dual BSD/GPL");
 
 #define QEDR_WQ_MULTIPLIER_DFT (3)
 
-static void qedr_ib_dispatch_event(struct qedr_dev *dev, u8 port_num,
+static void qedr_ib_dispatch_event(struct qedr_dev *dev, u32 port_num,
                                   enum ib_event_type type)
 {
        struct ib_event ibev;
@@ -66,7 +66,7 @@ static void qedr_ib_dispatch_event(struct qedr_dev *dev, u8 port_num,
 }
 
 static enum rdma_link_layer qedr_link_layer(struct ib_device *device,
-                                           u8 port_num)
+                                           u32 port_num)
 {
        return IB_LINK_LAYER_ETHERNET;
 }
@@ -81,7 +81,7 @@ static void qedr_get_dev_fw_str(struct ib_device *ibdev, char *str)
                 (fw_ver >> 8) & 0xFF, fw_ver & 0xFF);
 }
 
-static int qedr_roce_port_immutable(struct ib_device *ibdev, u8 port_num,
+static int qedr_roce_port_immutable(struct ib_device *ibdev, u32 port_num,
                                    struct ib_port_immutable *immutable)
 {
        struct ib_port_attr attr;
@@ -100,7 +100,7 @@ static int qedr_roce_port_immutable(struct ib_device *ibdev, u8 port_num,
        return 0;
 }
 
-static int qedr_iw_port_immutable(struct ib_device *ibdev, u8 port_num,
+static int qedr_iw_port_immutable(struct ib_device *ibdev, u32 port_num,
                                  struct ib_port_immutable *immutable)
 {
        struct ib_port_attr attr;
index c4bc58736e489ecfdf58cf629830c795cca441d2..1715fbe0719d85f27e1e7287435caa93b845858e 100644 (file)
@@ -636,8 +636,10 @@ int qedr_iw_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param)
        memcpy(in_params.local_mac_addr, dev->ndev->dev_addr, ETH_ALEN);
 
        if (test_and_set_bit(QEDR_IWARP_CM_WAIT_FOR_CONNECT,
-                            &qp->iwarp_cm_flags))
+                            &qp->iwarp_cm_flags)) {
+               rc = -ENODEV;
                goto err; /* QP already being destroyed */
+       }
 
        rc = dev->ops->iwarp_connect(dev->rdma_ctx, &in_params, &out_params);
        if (rc) {
index 9ea542270ed4a3ecbc518eb02b2981c8ac8e26b5..fdc47ef7d861fd0305dfedd9d4f2710b548f31c0 100644 (file)
@@ -72,7 +72,7 @@ static inline int qedr_ib_copy_to_udata(struct ib_udata *udata, void *src,
        return ib_copy_to_udata(udata, src, min_len);
 }
 
-int qedr_query_pkey(struct ib_device *ibdev, u8 port, u16 index, u16 *pkey)
+int qedr_query_pkey(struct ib_device *ibdev, u32 port, u16 index, u16 *pkey)
 {
        if (index >= QEDR_ROCE_PKEY_TABLE_LEN)
                return -EINVAL;
@@ -81,7 +81,7 @@ int qedr_query_pkey(struct ib_device *ibdev, u8 port, u16 index, u16 *pkey)
        return 0;
 }
 
-int qedr_iw_query_gid(struct ib_device *ibdev, u8 port,
+int qedr_iw_query_gid(struct ib_device *ibdev, u32 port,
                      int index, union ib_gid *sgid)
 {
        struct qedr_dev *dev = get_qedr_dev(ibdev);
@@ -210,7 +210,8 @@ static inline void get_link_speed_and_width(int speed, u16 *ib_speed,
        }
 }
 
-int qedr_query_port(struct ib_device *ibdev, u8 port, struct ib_port_attr *attr)
+int qedr_query_port(struct ib_device *ibdev, u32 port,
+                   struct ib_port_attr *attr)
 {
        struct qedr_dev *dev;
        struct qed_rdma_port *rdma_port;
@@ -4483,7 +4484,7 @@ int qedr_poll_cq(struct ib_cq *ibcq, int num_entries, struct ib_wc *wc)
 }
 
 int qedr_process_mad(struct ib_device *ibdev, int process_mad_flags,
-                    u8 port_num, const struct ib_wc *in_wc,
+                    u32 port_num, const struct ib_wc *in_wc,
                     const struct ib_grh *in_grh, const struct ib_mad *in,
                     struct ib_mad *out_mad, size_t *out_mad_size,
                     u16 *out_mad_pkey_index)
index 2672c32bc2f76db3bf671826ca91ad329efffa7c..34ad47515861a05e436e3837f44e707ba72d59f9 100644 (file)
 
 int qedr_query_device(struct ib_device *ibdev,
                      struct ib_device_attr *attr, struct ib_udata *udata);
-int qedr_query_port(struct ib_device *, u8 port, struct ib_port_attr *props);
+int qedr_query_port(struct ib_device *ibdev, u32 port,
+                   struct ib_port_attr *props);
 
-int qedr_iw_query_gid(struct ib_device *ibdev, u8 port,
+int qedr_iw_query_gid(struct ib_device *ibdev, u32 port,
                      int index, union ib_gid *gid);
 
-int qedr_query_pkey(struct ib_device *, u8 port, u16 index, u16 *pkey);
+int qedr_query_pkey(struct ib_device *ibdev, u32 port, u16 index, u16 *pkey);
 
 int qedr_alloc_ucontext(struct ib_ucontext *uctx, struct ib_udata *udata);
 void qedr_dealloc_ucontext(struct ib_ucontext *uctx);
@@ -92,11 +93,11 @@ int qedr_post_send(struct ib_qp *, const struct ib_send_wr *,
 int qedr_post_recv(struct ib_qp *, const struct ib_recv_wr *,
                   const struct ib_recv_wr **bad_wr);
 int qedr_process_mad(struct ib_device *ibdev, int process_mad_flags,
-                    u8 port_num, const struct ib_wc *in_wc,
+                    u32 port_num, const struct ib_wc *in_wc,
                     const struct ib_grh *in_grh, const struct ib_mad *in_mad,
                     struct ib_mad *out_mad, size_t *out_mad_size,
                     u16 *out_mad_pkey_index);
 
-int qedr_port_immutable(struct ib_device *ibdev, u8 port_num,
+int qedr_port_immutable(struct ib_device *ibdev, u32 port_num,
                        struct ib_port_immutable *immutable);
 #endif
index ee211423058a1eee60aefdaa5aba40ea69f05a11..88497739029e025347eb366aacab1fcf73bee67b 100644 (file)
@@ -630,7 +630,7 @@ struct qib_pportdata {
        u8 rx_pol_inv;
 
        u8 hw_pidx;     /* physical port index */
-       u8 port;        /* IB port number and index into dd->pports - 1 */
+       u32 port;        /* IB port number and index into dd->pports - 1 */
 
        u8 delay_mult;
 
@@ -1200,10 +1200,10 @@ static inline struct qib_pportdata *ppd_from_ibp(struct qib_ibport *ibp)
        return container_of(ibp, struct qib_pportdata, ibport_data);
 }
 
-static inline struct qib_ibport *to_iport(struct ib_device *ibdev, u8 port)
+static inline struct qib_ibport *to_iport(struct ib_device *ibdev, u32 port)
 {
        struct qib_devdata *dd = dd_from_ibdev(ibdev);
-       unsigned pidx = port - 1; /* IB number port from 1, hdw from 0 */
+       u32 pidx = port - 1; /* IB number port from 1, hdw from 0 */
 
        WARN_ON(pidx >= dd->num_pports);
        return &dd->pport[pidx].ibport_data;
@@ -1303,11 +1303,6 @@ int qib_sdma_verbs_send(struct qib_pportdata *, struct rvt_sge_state *,
 /* ppd->sdma_lock should be locked before calling this. */
 int qib_sdma_make_progress(struct qib_pportdata *dd);
 
-static inline int qib_sdma_empty(const struct qib_pportdata *ppd)
-{
-       return ppd->sdma_descq_added == ppd->sdma_descq_removed;
-}
-
 /* must be called under qib_sdma_lock */
 static inline u16 qib_sdma_descq_freecnt(const struct qib_pportdata *ppd)
 {
@@ -1364,27 +1359,6 @@ static inline u32 qib_get_rcvhdrtail(const struct qib_ctxtdata *rcd)
                *((volatile __le64 *)rcd->rcvhdrtail_kvaddr)); /* DMA'ed */
 }
 
-static inline u32 qib_get_hdrqtail(const struct qib_ctxtdata *rcd)
-{
-       const struct qib_devdata *dd = rcd->dd;
-       u32 hdrqtail;
-
-       if (dd->flags & QIB_NODMA_RTAIL) {
-               __le32 *rhf_addr;
-               u32 seq;
-
-               rhf_addr = (__le32 *) rcd->rcvhdrq +
-                       rcd->head + dd->rhf_offset;
-               seq = qib_hdrget_seq(rhf_addr);
-               hdrqtail = rcd->head;
-               if (seq == rcd->seq_cnt)
-                       hdrqtail++;
-       } else
-               hdrqtail = qib_get_rcvhdrtail(rcd);
-
-       return hdrqtail;
-}
-
 /*
  * sysfs interface.
  */
@@ -1395,7 +1369,7 @@ extern const struct attribute_group qib_attr_group;
 int qib_device_create(struct qib_devdata *);
 void qib_device_remove(struct qib_devdata *);
 
-int qib_create_port_files(struct ib_device *ibdev, u8 port_num,
+int qib_create_port_files(struct ib_device *ibdev, u32 port_num,
                          struct kobject *kobj);
 void qib_verbs_unregister_sysfs(struct qib_devdata *);
 /* Hook for sysfs read of QSFP */
index f91f23e02283f01c36be96431a528cfa291011bb..cf652831d8e79c1d9bc1662f570fc78f625e7f94 100644 (file)
@@ -795,11 +795,4 @@ static inline __u32 qib_hdrget_use_egr_buf(const __le32 *rbuf)
 {
        return __le32_to_cpu(rbuf[0]) & QLOGIC_IB_RHF_L_USE_EGR;
 }
-
-static inline __u32 qib_hdrget_qib_ver(__le32 hdrword)
-{
-       return (__le32_to_cpu(hdrword) >> QLOGIC_IB_I_VERS_SHIFT) &
-               QLOGIC_IB_I_VERS_MASK;
-}
-
 #endif                          /* _QIB_COMMON_H */
index ff87a67dd7b710137c13028d4ce82986fe225f8c..c60e79d214a175c6756c3509006f1d3658ea373d 100644 (file)
@@ -1758,7 +1758,8 @@ bail:
 }
 
 /**
- * unlock_exptid - unlock any expected TID entries context still had in use
+ * unlock_expected_tids - unlock any expected TID entries context still had
+ * in use
  * @rcd: ctxt
  *
  * We don't actually update the chip here, because we do a bulk update
@@ -2247,7 +2248,7 @@ static ssize_t qib_write_iter(struct kiocb *iocb, struct iov_iter *from)
 
        if (!iter_is_iovec(from) || !from->nr_segs || !pq)
                return -EINVAL;
-                        
+
        return qib_user_sdma_writev(rcd, pq, from->iov, from->nr_segs);
 }
 
index b35e1174be22f1be824dd32bbb35e56f8fac374b..a9b83bc13f4ac30eda8357063f6f9ac28c7b6766 100644 (file)
@@ -2609,7 +2609,7 @@ static void qib_chk_6120_errormask(struct qib_devdata *dd)
 }
 
 /**
- * qib_get_faststats - get word counters from chip before they overflow
+ * qib_get_6120_faststats - get word counters from chip before they overflow
  * @t: contains a pointer to the qlogic_ib device qib_devdata
  *
  * This needs more work; in particular, decision on whether we really
index 229dcd6ead95b24ab8240ce5be38941558852e8c..d1c0bc31869f67aa0f416c9b13f384c61da436ab 100644 (file)
@@ -2236,7 +2236,7 @@ static void qib_7220_tidtemplate(struct qib_devdata *dd)
 }
 
 /**
- * qib_init_7220_get_base_info - set chip-specific flags for user code
+ * qib_7220_get_base_info - set chip-specific flags for user code
  * @rcd: the qlogic_ib ctxt
  * @kinfo: qib_base_info pointer
  *
@@ -4411,7 +4411,7 @@ static void writescratch(struct qib_devdata *dd, u32 val)
 
 #define VALID_TS_RD_REG_MASK 0xBF
 /**
- * qib_7220_tempsense_read - read register of temp sensor via TWSI
+ * qib_7220_tempsense_rd - read register of temp sensor via TWSI
  * @dd: the qlogic_ib device
  * @regnum: register to read from
  *
index 9fe6ea75b45e5e206ddcc521182125e3a3444dba..ab98b6a3ae1e4a8f78eae9beed39d9dc0bb878a1 100644 (file)
@@ -790,28 +790,6 @@ static inline u32 qib_read_ureg32(const struct qib_devdata *dd,
                 (char __iomem *)dd->kregbase + dd->uregbase)));
 }
 
-/**
- * qib_read_ureg - read virtualized per-context register
- * @dd: device
- * @regno: register number
- * @ctxt: context number
- *
- * Return the contents of a register that is virtualized to be per context.
- * Returns -1 on errors (not distinguishable from valid contents at
- * runtime; we may add a separate error variable at some point).
- */
-static inline u64 qib_read_ureg(const struct qib_devdata *dd,
-                               enum qib_ureg regno, int ctxt)
-{
-
-       if (!dd->kregbase || !(dd->flags & QIB_PRESENT))
-               return 0;
-       return readq(regno + (u64 __iomem *)(
-               (dd->ureg_align * ctxt) + (dd->userbase ?
-                (char __iomem *)dd->userbase :
-                (char __iomem *)dd->kregbase + dd->uregbase)));
-}
-
 /**
  * qib_write_ureg - write virtualized per-context register
  * @dd: device
@@ -2513,7 +2491,7 @@ static int qib_7322_bringup_serdes(struct qib_pportdata *ppd)
 }
 
 /**
- * qib_7322_quiet_serdes - set serdes to txidle
+ * qib_7322_mini_quiet_serdes - set serdes to txidle
  * @ppd: the qlogic_ib device
  * Called when driver is being unloaded
  */
@@ -3859,7 +3837,7 @@ static void qib_7322_tidtemplate(struct qib_devdata *dd)
 }
 
 /**
- * qib_init_7322_get_base_info - set chip-specific flags for user code
+ * qib_7322_get_base_info - set chip-specific flags for user code
  * @rcd: the qlogic_ib ctxt
  * @kinfo: qib_base_info pointer
  *
index 43c8ee1f46e042a37e74973db87f86ccc566e47a..b5a78576c48bd79dbe5421882897aa162b9a5b7c 100644 (file)
@@ -1609,7 +1609,7 @@ bail:
 }
 
 /**
- * allocate eager buffers, both kernel and user contexts.
+ * qib_setup_eagerbufs - allocate eager buffers, both kernel and user contexts.
  * @rcd: the context we are setting up.
  *
  * Allocate the eager TID buffers and program them into hip.
index 44e2f813024a64a4543e8fb6baa10202999cb2fa..ef02f2bfddb2686e566e917a4d843f63dbc3b607 100644 (file)
@@ -203,7 +203,7 @@ static void qib_bad_mkey(struct qib_ibport *ibp, struct ib_smp *smp)
 /*
  * Send a Port Capability Mask Changed trap (ch. 14.3.11).
  */
-void qib_cap_mask_chg(struct rvt_dev_info *rdi, u8 port_num)
+void qib_cap_mask_chg(struct rvt_dev_info *rdi, u32 port_num)
 {
        struct qib_ibdev *ibdev = container_of(rdi, struct qib_ibdev, rdi);
        struct qib_devdata *dd = dd_from_dev(ibdev);
@@ -2360,7 +2360,7 @@ static int process_cc(struct ib_device *ibdev, int mad_flags,
  *
  * This is called by the ib_mad module.
  */
-int qib_process_mad(struct ib_device *ibdev, int mad_flags, u8 port,
+int qib_process_mad(struct ib_device *ibdev, int mad_flags, u32 port,
                    const struct ib_wc *in_wc, const struct ib_grh *in_grh,
                    const struct ib_mad *in, struct ib_mad *out,
                    size_t *out_mad_size, u16 *out_mad_pkey_index)
index ca39a029e4af8744ba6d91f3804f3dca0fc8fb23..1974ceb9d40584e4d355f04485fd6b52237b087e 100644 (file)
@@ -125,7 +125,7 @@ static void get_map_page(struct rvt_qpn_table *qpt, struct rvt_qpn_map *map)
  * zero/one for QP type IB_QPT_SMI/IB_QPT_GSI.
  */
 int qib_alloc_qpn(struct rvt_dev_info *rdi, struct rvt_qpn_table *qpt,
-                 enum ib_qp_type type, u8 port)
+                 enum ib_qp_type type, u32 port)
 {
        u32 i, offset, max_scan, qpn;
        struct rvt_qpn_map *map;
@@ -136,7 +136,7 @@ int qib_alloc_qpn(struct rvt_dev_info *rdi, struct rvt_qpn_table *qpt,
        u16 qpt_mask = dd->qpn_mask;
 
        if (type == IB_QPT_SMI || type == IB_QPT_GSI) {
-               unsigned n;
+               u32 n;
 
                ret = type == IB_QPT_GSI;
                n = 1 << (ret + 2 * (port - 1));
index 4f4a09c2dbcd31bd125e333a1357b9c8ee63c5bb..81b810d006c0a4e15e22cfa96370fc76e01a2f6f 100644 (file)
@@ -687,7 +687,6 @@ static int qib_sd7220_reg_mod(struct qib_devdata *dd, int sdnum, u32 loc,
                spin_unlock_irqrestore(&dd->cspec->sdepb_lock, flags);
                return -1;
        }
-       ret = 0;
        for (tries = EPB_TRANS_TRIES; tries; --tries) {
                transval = qib_read_kreg32(dd, trans);
                if (transval & EPB_TRANS_RDY)
index 62c179fc764ba45e3b370b460162f8905997173c..5e9e66f2706479fba56f216397032b334ffe7f72 100644 (file)
@@ -728,7 +728,7 @@ const struct attribute_group qib_attr_group = {
        .attrs = qib_attributes,
 };
 
-int qib_create_port_files(struct ib_device *ibdev, u8 port_num,
+int qib_create_port_files(struct ib_device *ibdev, u32 port_num,
                          struct kobject *kobj)
 {
        struct qib_pportdata *ppd;
index 8e0de265ad578567ce332384bc4718bc37b9cb9c..d17d034ecdfd9f4081c97c115ce1f7ce74701be5 100644 (file)
@@ -1188,7 +1188,7 @@ full:
        }
 }
 
-static int qib_query_port(struct rvt_dev_info *rdi, u8 port_num,
+static int qib_query_port(struct rvt_dev_info *rdi, u32 port_num,
                          struct ib_port_attr *props)
 {
        struct qib_ibdev *ibdev = container_of(rdi, struct qib_ibdev, rdi);
@@ -1273,7 +1273,7 @@ bail:
        return ret;
 }
 
-static int qib_shut_down_port(struct rvt_dev_info *rdi, u8 port_num)
+static int qib_shut_down_port(struct rvt_dev_info *rdi, u32 port_num)
 {
        struct qib_ibdev *ibdev = container_of(rdi, struct qib_ibdev, rdi);
        struct qib_devdata *dd = dd_from_dev(ibdev);
@@ -1342,7 +1342,7 @@ struct ib_ah *qib_create_qp0_ah(struct qib_ibport *ibp, u16 dlid)
        struct rvt_qp *qp0;
        struct qib_pportdata *ppd = ppd_from_ibp(ibp);
        struct qib_devdata *dd = dd_from_ppd(ppd);
-       u8 port_num = ppd->port;
+       u32 port_num = ppd->port;
 
        memset(&attr, 0, sizeof(attr));
        attr.type = rdma_ah_find_type(&dd->verbs_dev.rdi.ibdev, port_num);
index dc0e81f3b6f4f2533226f66d13842dfa55494c1a..07548fac1d8ea7d6f5d22587f7f1a301ab36ffa4 100644 (file)
@@ -239,10 +239,10 @@ static inline int qib_pkey_ok(u16 pkey1, u16 pkey2)
 
 void qib_bad_pkey(struct qib_ibport *ibp, u32 key, u32 sl,
                  u32 qp1, u32 qp2, __be16 lid1, __be16 lid2);
-void qib_cap_mask_chg(struct rvt_dev_info *rdi, u8 port_num);
+void qib_cap_mask_chg(struct rvt_dev_info *rdi, u32 port_num);
 void qib_sys_guid_chg(struct qib_ibport *ibp);
 void qib_node_desc_chg(struct qib_ibport *ibp);
-int qib_process_mad(struct ib_device *ibdev, int mad_flags, u8 port_num,
+int qib_process_mad(struct ib_device *ibdev, int mad_flags, u32 port_num,
                    const struct ib_wc *in_wc, const struct ib_grh *in_grh,
                    const struct ib_mad *in, struct ib_mad *out,
                    size_t *out_mad_size, u16 *out_mad_pkey_index);
@@ -273,7 +273,7 @@ void *qib_qp_priv_alloc(struct rvt_dev_info *rdi, struct rvt_qp *qp);
 void qib_qp_priv_free(struct rvt_dev_info *rdi, struct rvt_qp *qp);
 void qib_notify_qp_reset(struct rvt_qp *qp);
 int qib_alloc_qpn(struct rvt_dev_info *rdi, struct rvt_qpn_table *qpt,
-                 enum ib_qp_type type, u8 port);
+                 enum ib_qp_type type, u32 port);
 void qib_restart_rc(struct rvt_qp *qp, u32 psn, int wait);
 #ifdef CONFIG_DEBUG_FS
 
index 1b63a491fa72d565884128628ad56f9248e018ea..ff6a40e259d54db288da1057fd280bc5b54c743f 100644 (file)
@@ -303,7 +303,7 @@ static struct notifier_block usnic_ib_inetaddr_notifier = {
 };
 /* End of inet section*/
 
-static int usnic_port_immutable(struct ib_device *ibdev, u8 port_num,
+static int usnic_port_immutable(struct ib_device *ibdev, u32 port_num,
                                struct ib_port_immutable *immutable)
 {
        struct ib_port_attr attr;
index 3705c6b8b2237105997082ee0173e1130edae9fa..57d210ca855a5e3f9e1562baea80703b5b004619 100644 (file)
@@ -270,7 +270,7 @@ static int create_qp_validate_user_data(struct usnic_ib_create_qp_cmd cmd)
 /* Start of ib callback functions */
 
 enum rdma_link_layer usnic_ib_port_link_layer(struct ib_device *device,
-                                               u8 port_num)
+                                             u32 port_num)
 {
        return IB_LINK_LAYER_ETHERNET;
 }
@@ -332,7 +332,7 @@ int usnic_ib_query_device(struct ib_device *ibdev,
        return 0;
 }
 
-int usnic_ib_query_port(struct ib_device *ibdev, u8 port,
+int usnic_ib_query_port(struct ib_device *ibdev, u32 port,
                                struct ib_port_attr *props)
 {
        struct usnic_ib_dev *us_ibdev = to_usdev(ibdev);
@@ -420,7 +420,7 @@ err_out:
        return err;
 }
 
-int usnic_ib_query_gid(struct ib_device *ibdev, u8 port, int index,
+int usnic_ib_query_gid(struct ib_device *ibdev, u32 port, int index,
                                union ib_gid *gid)
 {
 
index 11fe1ba6bbc9a53363c055db7f239bc9e33714bd..6b82d0f2d184c809c1f29a967b2503294b54201f 100644 (file)
 #include "usnic_ib.h"
 
 enum rdma_link_layer usnic_ib_port_link_layer(struct ib_device *device,
-                                               u8 port_num);
+                                             u32 port_num);
 int usnic_ib_query_device(struct ib_device *ibdev,
                                struct ib_device_attr *props,
                          struct ib_udata *uhw);
-int usnic_ib_query_port(struct ib_device *ibdev, u8 port,
+int usnic_ib_query_port(struct ib_device *ibdev, u32 port,
                                struct ib_port_attr *props);
 int usnic_ib_query_qp(struct ib_qp *qp, struct ib_qp_attr *qp_attr,
                                int qp_attr_mask,
                                struct ib_qp_init_attr *qp_init_attr);
-int usnic_ib_query_gid(struct ib_device *ibdev, u8 port, int index,
+int usnic_ib_query_gid(struct ib_device *ibdev, u32 port, int index,
                                union ib_gid *gid);
 int usnic_ib_alloc_pd(struct ib_pd *ibpd, struct ib_udata *udata);
 int usnic_ib_dealloc_pd(struct ib_pd *pd, struct ib_udata *udata);
index de57f2fed743755b8d29ca4b7ae75563cd1c81ba..763ddc6f25d1ae9aca097bcc3de9f9d86425baf4 100644 (file)
@@ -344,11 +344,6 @@ static inline enum ib_port_state pvrdma_port_state_to_ib(
        return (enum ib_port_state)state;
 }
 
-static inline int ib_port_cap_flags_to_pvrdma(int flags)
-{
-       return flags & PVRDMA_MASK(PVRDMA_PORT_CAP_FLAGS_MAX);
-}
-
 static inline int pvrdma_port_cap_flags_to_ib(int flags)
 {
        return flags;
@@ -410,11 +405,6 @@ static inline enum pvrdma_qp_type ib_qp_type_to_pvrdma(enum ib_qp_type type)
        return (enum pvrdma_qp_type)type;
 }
 
-static inline enum ib_qp_type pvrdma_qp_type_to_ib(enum pvrdma_qp_type type)
-{
-       return (enum ib_qp_type)type;
-}
-
 static inline enum pvrdma_qp_state ib_qp_state_to_pvrdma(enum ib_qp_state state)
 {
        return (enum pvrdma_qp_state)state;
index 4b6019e7de679343120a5b9f5a4fabab9dda6d2a..6bf2d2e47d07ea16417d24cfa148e576aef7e7b5 100644 (file)
@@ -121,7 +121,7 @@ static int pvrdma_init_device(struct pvrdma_dev *dev)
        return 0;
 }
 
-static int pvrdma_port_immutable(struct ib_device *ibdev, u8 port_num,
+static int pvrdma_port_immutable(struct ib_device *ibdev, u32 port_num,
                                 struct ib_port_immutable *immutable)
 {
        struct pvrdma_dev *dev = to_vdev(ibdev);
index 1d3bdd7bb51d96086d4a599602bd7a35ae64b70a..67769b715126a21309e9d5b99ac8613575bca3d0 100644 (file)
@@ -882,7 +882,7 @@ out:
 }
 
 /**
- * pvrdma_post_receive - post receive work request entries on a QP
+ * pvrdma_post_recv - post receive work request entries on a QP
  * @ibqp: the QP
  * @wr: the work request list to post
  * @bad_wr: the first bad WR returned
index fc412cbfd042bde876098d6e349f91b8ceafb584..19176583dbde680e20d4da7ac11c2eb895f8e3a1 100644 (file)
@@ -125,7 +125,7 @@ int pvrdma_query_device(struct ib_device *ibdev,
  *
  * @return: 0 on success, otherwise negative errno
  */
-int pvrdma_query_port(struct ib_device *ibdev, u8 port,
+int pvrdma_query_port(struct ib_device *ibdev, u32 port,
                      struct ib_port_attr *props)
 {
        struct pvrdma_dev *dev = to_vdev(ibdev);
@@ -183,7 +183,7 @@ int pvrdma_query_port(struct ib_device *ibdev, u8 port,
  *
  * @return: 0 on success, otherwise negative errno
  */
-int pvrdma_query_gid(struct ib_device *ibdev, u8 port, int index,
+int pvrdma_query_gid(struct ib_device *ibdev, u32 port, int index,
                     union ib_gid *gid)
 {
        struct pvrdma_dev *dev = to_vdev(ibdev);
@@ -205,7 +205,7 @@ int pvrdma_query_gid(struct ib_device *ibdev, u8 port, int index,
  *
  * @return: 0 on success, otherwise negative errno
  */
-int pvrdma_query_pkey(struct ib_device *ibdev, u8 port, u16 index,
+int pvrdma_query_pkey(struct ib_device *ibdev, u32 port, u16 index,
                      u16 *pkey)
 {
        int err = 0;
@@ -232,7 +232,7 @@ int pvrdma_query_pkey(struct ib_device *ibdev, u8 port, u16 index,
 }
 
 enum rdma_link_layer pvrdma_port_link_layer(struct ib_device *ibdev,
-                                           u8 port)
+                                           u32 port)
 {
        return IB_LINK_LAYER_ETHERNET;
 }
@@ -274,7 +274,7 @@ int pvrdma_modify_device(struct ib_device *ibdev, int mask,
  *
  * @return: 0 on success, otherwise negative errno
  */
-int pvrdma_modify_port(struct ib_device *ibdev, u8 port, int mask,
+int pvrdma_modify_port(struct ib_device *ibdev, u32 port, int mask,
                       struct ib_port_modify *props)
 {
        struct ib_port_attr attr;
@@ -516,7 +516,7 @@ int pvrdma_create_ah(struct ib_ah *ibah, struct rdma_ah_init_attr *init_attr,
        struct pvrdma_dev *dev = to_vdev(ibah->device);
        struct pvrdma_ah *ah = to_vah(ibah);
        const struct ib_global_route *grh;
-       u8 port_num = rdma_ah_get_port_num(ah_attr);
+       u32 port_num = rdma_ah_get_port_num(ah_attr);
 
        if (!(rdma_ah_get_ah_flags(ah_attr) & IB_AH_GRH))
                return -EINVAL;
index 97ed8f952f6e94c750083333f4f17dfc03e764a0..544b94d97c3a25837fcb7d4a987dd786a83b738d 100644 (file)
@@ -70,30 +70,6 @@ enum pvrdma_mtu {
        PVRDMA_MTU_4096 = 5,
 };
 
-static inline int pvrdma_mtu_enum_to_int(enum pvrdma_mtu mtu)
-{
-       switch (mtu) {
-       case PVRDMA_MTU_256:    return  256;
-       case PVRDMA_MTU_512:    return  512;
-       case PVRDMA_MTU_1024:   return 1024;
-       case PVRDMA_MTU_2048:   return 2048;
-       case PVRDMA_MTU_4096:   return 4096;
-       default:                return   -1;
-       }
-}
-
-static inline enum pvrdma_mtu pvrdma_mtu_int_to_enum(int mtu)
-{
-       switch (mtu) {
-       case 256:       return PVRDMA_MTU_256;
-       case 512:       return PVRDMA_MTU_512;
-       case 1024:      return PVRDMA_MTU_1024;
-       case 2048:      return PVRDMA_MTU_2048;
-       case 4096:
-       default:        return PVRDMA_MTU_4096;
-       }
-}
-
 enum pvrdma_port_state {
        PVRDMA_PORT_NOP                 = 0,
        PVRDMA_PORT_DOWN                = 1,
@@ -138,17 +114,6 @@ enum pvrdma_port_width {
        PVRDMA_WIDTH_12X        = 8,
 };
 
-static inline int pvrdma_width_enum_to_int(enum pvrdma_port_width width)
-{
-       switch (width) {
-       case PVRDMA_WIDTH_1X:   return  1;
-       case PVRDMA_WIDTH_4X:   return  4;
-       case PVRDMA_WIDTH_8X:   return  8;
-       case PVRDMA_WIDTH_12X:  return 12;
-       default:                return -1;
-       }
-}
-
 enum pvrdma_port_speed {
        PVRDMA_SPEED_SDR        = 1,
        PVRDMA_SPEED_DDR        = 2,
@@ -383,17 +348,17 @@ enum pvrdma_access_flags {
 int pvrdma_query_device(struct ib_device *ibdev,
                        struct ib_device_attr *props,
                        struct ib_udata *udata);
-int pvrdma_query_port(struct ib_device *ibdev, u8 port,
+int pvrdma_query_port(struct ib_device *ibdev, u32 port,
                      struct ib_port_attr *props);
-int pvrdma_query_gid(struct ib_device *ibdev, u8 port,
+int pvrdma_query_gid(struct ib_device *ibdev, u32 port,
                     int index, union ib_gid *gid);
-int pvrdma_query_pkey(struct ib_device *ibdev, u8 port,
+int pvrdma_query_pkey(struct ib_device *ibdev, u32 port,
                      u16 index, u16 *pkey);
 enum rdma_link_layer pvrdma_port_link_layer(struct ib_device *ibdev,
-                                           u8 port);
+                                           u32 port);
 int pvrdma_modify_device(struct ib_device *ibdev, int mask,
                         struct ib_device_modify *props);
-int pvrdma_modify_port(struct ib_device *ibdev, u8 port,
+int pvrdma_modify_port(struct ib_device *ibdev, u32 port,
                       int mask, struct ib_port_modify *props);
 int pvrdma_mmap(struct ib_ucontext *context, struct vm_area_struct *vma);
 int pvrdma_alloc_ucontext(struct ib_ucontext *uctx, struct ib_udata *udata);
index fa5be13a439440e03269091e4369ae27ec6cc3da..207bc0ed96ff1a8d48d311e128521a12e87c6479 100644 (file)
@@ -70,7 +70,7 @@
  *
  * Return: IB_MAD_RESULT_SUCCESS or error
  */
-int rvt_process_mad(struct ib_device *ibdev, int mad_flags, u8 port_num,
+int rvt_process_mad(struct ib_device *ibdev, int mad_flags, u32 port_num,
                    const struct ib_wc *in_wc, const struct ib_grh *in_grh,
                    const struct ib_mad_hdr *in, size_t in_mad_size,
                    struct ib_mad_hdr *out, size_t *out_mad_size,
@@ -82,9 +82,6 @@ int rvt_process_mad(struct ib_device *ibdev, int mad_flags, u8 port_num,
         * future may choose to implement this but it should not be made into a
         * requirement.
         */
-       if (ibport_num_to_idx(ibdev, port_num) < 0)
-               return -EINVAL;
-
        return IB_MAD_RESULT_FAILURE;
 }
 
index a9d6eecc37238a0e06d3850b155581b1e75ffb88..1eae5efea4be6bd3b0afd27431d60f44fc3d6cfb 100644 (file)
@@ -50,7 +50,7 @@
 
 #include <rdma/rdma_vt.h>
 
-int rvt_process_mad(struct ib_device *ibdev, int mad_flags, u8 port_num,
+int rvt_process_mad(struct ib_device *ibdev, int mad_flags, u32 port_num,
                    const struct ib_wc *in_wc, const struct ib_grh *in_grh,
                    const struct ib_mad_hdr *in, size_t in_mad_size,
                    struct ib_mad_hdr *out, size_t *out_mad_size,
index 8fd0128a93360eabb967c67faa30119785c46bd2..12ebe041a5da9b67f934614a8da5c0617fb23b0a 100644 (file)
@@ -151,15 +151,12 @@ static int rvt_modify_device(struct ib_device *device,
  *
  * Return: 0 on success
  */
-static int rvt_query_port(struct ib_device *ibdev, u8 port_num,
+static int rvt_query_port(struct ib_device *ibdev, u32 port_num,
                          struct ib_port_attr *props)
 {
        struct rvt_dev_info *rdi = ib_to_rvt(ibdev);
        struct rvt_ibport *rvp;
-       int port_index = ibport_num_to_idx(ibdev, port_num);
-
-       if (port_index < 0)
-               return -EINVAL;
+       u32 port_index = ibport_num_to_idx(ibdev, port_num);
 
        rvp = rdi->ports[port_index];
        /* props being zeroed by the caller, avoid zeroing it here */
@@ -186,16 +183,13 @@ static int rvt_query_port(struct ib_device *ibdev, u8 port_num,
  *
  * Return: 0 on success
  */
-static int rvt_modify_port(struct ib_device *ibdev, u8 port_num,
+static int rvt_modify_port(struct ib_device *ibdev, u32 port_num,
                           int port_modify_mask, struct ib_port_modify *props)
 {
        struct rvt_dev_info *rdi = ib_to_rvt(ibdev);
        struct rvt_ibport *rvp;
        int ret = 0;
-       int port_index = ibport_num_to_idx(ibdev, port_num);
-
-       if (port_index < 0)
-               return -EINVAL;
+       u32 port_index = ibport_num_to_idx(ibdev, port_num);
 
        rvp = rdi->ports[port_index];
        if (port_modify_mask & IB_PORT_OPA_MASK_CHG) {
@@ -225,7 +219,7 @@ static int rvt_modify_port(struct ib_device *ibdev, u8 port_num,
  *
  * Return: 0 on failure pkey otherwise
  */
-static int rvt_query_pkey(struct ib_device *ibdev, u8 port_num, u16 index,
+static int rvt_query_pkey(struct ib_device *ibdev, u32 port_num, u16 index,
                          u16 *pkey)
 {
        /*
@@ -235,11 +229,9 @@ static int rvt_query_pkey(struct ib_device *ibdev, u8 port_num, u16 index,
         * no way to protect against that anyway.
         */
        struct rvt_dev_info *rdi = ib_to_rvt(ibdev);
-       int port_index;
+       u32 port_index;
 
        port_index = ibport_num_to_idx(ibdev, port_num);
-       if (port_index < 0)
-               return -EINVAL;
 
        if (index >= rvt_get_npkeys(rdi))
                return -EINVAL;
@@ -257,12 +249,12 @@ static int rvt_query_pkey(struct ib_device *ibdev, u8 port_num, u16 index,
  *
  * Return: 0 on success
  */
-static int rvt_query_gid(struct ib_device *ibdev, u8 port_num,
+static int rvt_query_gid(struct ib_device *ibdev, u32 port_num,
                         int guid_index, union ib_gid *gid)
 {
        struct rvt_dev_info *rdi;
        struct rvt_ibport *rvp;
-       int port_index;
+       u32 port_index;
 
        /*
         * Driver is responsible for updating the guid table. Which will be used
@@ -270,8 +262,6 @@ static int rvt_query_gid(struct ib_device *ibdev, u8 port_num,
         * is being done.
         */
        port_index = ibport_num_to_idx(ibdev, port_num);
-       if (port_index < 0)
-               return -EINVAL;
 
        rdi = ib_to_rvt(ibdev);
        rvp = rdi->ports[port_index];
@@ -301,16 +291,12 @@ static void rvt_dealloc_ucontext(struct ib_ucontext *context)
        return;
 }
 
-static int rvt_get_port_immutable(struct ib_device *ibdev, u8 port_num,
+static int rvt_get_port_immutable(struct ib_device *ibdev, u32 port_num,
                                  struct ib_port_immutable *immutable)
 {
        struct rvt_dev_info *rdi = ib_to_rvt(ibdev);
        struct ib_port_attr attr;
-       int err, port_index;
-
-       port_index = ibport_num_to_idx(ibdev, port_num);
-       if (port_index < 0)
-               return -EINVAL;
+       int err;
 
        immutable->core_cap_flags = rdi->dparms.core_cap_flags;
 
index d19ff817c2c716780521468c1a1832de18956e00..c0fed6510f0b94d3dbad67bedab1111f055d9b4c 100644 (file)
 #define __rvt_pr_err_ratelimited(pdev, name, fmt, ...) \
        dev_err_ratelimited(&(pdev)->dev, "%s: " fmt, name, ##__VA_ARGS__)
 
-static inline int ibport_num_to_idx(struct ib_device *ibdev, u8 port_num)
+static inline u32 ibport_num_to_idx(struct ib_device *ibdev, u32 port_num)
 {
-       struct rvt_dev_info *rdi = ib_to_rvt(ibdev);
-       int port_index;
-
-       port_index = port_num - 1; /* IB ports start at 1 our arrays at 0 */
-       if ((port_index < 0) || (port_index >= rdi->dparms.nports))
-               return -EINVAL;
-
-       return port_index;
+       return port_num - 1; /* IB ports start at 1 our arrays at 0 */
 }
 
 #endif          /* DEF_RDMAVT_H */
index df0d173d6acba6c8c8d461f4cb1d6b54918c15f0..da2e867a1ed93b2447e3e6cb0a3cc1e621c05458 100644 (file)
@@ -88,7 +88,7 @@ void rxe_av_fill_ip_info(struct rxe_av *av, struct rdma_ah_attr *attr)
                type = RXE_NETWORK_TYPE_IPV4;
                break;
        case RDMA_NETWORK_IPV6:
-               type = RXE_NETWORK_TYPE_IPV4;
+               type = RXE_NETWORK_TYPE_IPV6;
                break;
        default:
                /* not reached - checked in rxe_av_chk_attr */
index 17a361b8dbb161ac81d08f2ae5953e2a32969a81..2af26737d32dc80b12f117c069f3e826969bc012 100644 (file)
@@ -345,7 +345,7 @@ static inline enum comp_state do_read(struct rxe_qp *qp,
 
        ret = copy_data(qp->pd, IB_ACCESS_LOCAL_WRITE,
                        &wqe->dma, payload_addr(pkt),
-                       payload_size(pkt), to_mem_obj, NULL);
+                       payload_size(pkt), to_mr_obj, NULL);
        if (ret)
                return COMPST_ERROR;
 
@@ -365,7 +365,7 @@ static inline enum comp_state do_atomic(struct rxe_qp *qp,
 
        ret = copy_data(qp->pd, IB_ACCESS_LOCAL_WRITE,
                        &wqe->dma, &atomic_orig,
-                       sizeof(u64), to_mem_obj, NULL);
+                       sizeof(u64), to_mr_obj, NULL);
        if (ret)
                return COMPST_ERROR;
        else
@@ -676,7 +676,6 @@ int rxe_completer(void *arg)
 
                        /* there is nothing to retry in this case */
                        if (!wqe || (wqe->state == wqe_state_posted)) {
-                               pr_warn("Retry attempted without a valid wqe\n");
                                ret = -EAGAIN;
                                goto done;
                        }
index ac9154f0593d1ca6ca8420016c3f0e9d175d0563..f469fd1c753d99207cd3f7ade56deb879eaa4ebd 100644 (file)
@@ -26,7 +26,7 @@ static const char * const rxe_counter_name[] = {
 
 int rxe_ib_get_hw_stats(struct ib_device *ibdev,
                        struct rdma_hw_stats *stats,
-                       u8 port, int index)
+                       u32 port, int index)
 {
        struct rxe_dev *dev = to_rdev(ibdev);
        unsigned int cnt;
@@ -41,7 +41,7 @@ int rxe_ib_get_hw_stats(struct ib_device *ibdev,
 }
 
 struct rdma_hw_stats *rxe_ib_alloc_hw_stats(struct ib_device *ibdev,
-                                           u8 port_num)
+                                           u32 port_num)
 {
        BUILD_BUG_ON(ARRAY_SIZE(rxe_counter_name) != RXE_NUM_OF_COUNTERS);
        /* We support only per port stats */
index 49ee6f96656d0368c597d841b3017e2d60d66fc2..2f369acb46d79b00f1d8f1b04c3cf3ce6620b7fc 100644 (file)
@@ -30,8 +30,8 @@ enum rxe_counters {
 };
 
 struct rdma_hw_stats *rxe_ib_alloc_hw_stats(struct ib_device *ibdev,
-                                           u8 port_num);
+                                           u32 port_num);
 int rxe_ib_get_hw_stats(struct ib_device *ibdev,
                        struct rdma_hw_stats *stats,
-                       u8 port, int index);
+                       u32 port, int index);
 #endif /* RXE_HW_COUNTERS_H */
index 0d758760b9ae74c8c34f3abf3bf62b8fd27687df..ef8061d2fbe0f424e7a9c10e52f94b31bd27241e 100644 (file)
@@ -72,40 +72,37 @@ int rxe_mmap(struct ib_ucontext *context, struct vm_area_struct *vma);
 
 /* rxe_mr.c */
 enum copy_direction {
-       to_mem_obj,
-       from_mem_obj,
+       to_mr_obj,
+       from_mr_obj,
 };
 
-void rxe_mem_init_dma(struct rxe_pd *pd,
-                     int access, struct rxe_mem *mem);
+void rxe_mr_init_dma(struct rxe_pd *pd, int access, struct rxe_mr *mr);
 
-int rxe_mem_init_user(struct rxe_pd *pd, u64 start,
-                     u64 length, u64 iova, int access, struct ib_udata *udata,
-                     struct rxe_mem *mr);
+int rxe_mr_init_user(struct rxe_pd *pd, u64 start, u64 length, u64 iova,
+                    int access, struct ib_udata *udata, struct rxe_mr *mr);
 
-int rxe_mem_init_fast(struct rxe_pd *pd,
-                     int max_pages, struct rxe_mem *mem);
+int rxe_mr_init_fast(struct rxe_pd *pd, int max_pages, struct rxe_mr *mr);
 
-int rxe_mem_copy(struct rxe_mem *mem, u64 iova, void *addr,
-                int length, enum copy_direction dir, u32 *crcp);
+int rxe_mr_copy(struct rxe_mr *mr, u64 iova, void *addr, int length,
+               enum copy_direction dir, u32 *crcp);
 
 int copy_data(struct rxe_pd *pd, int access,
              struct rxe_dma_info *dma, void *addr, int length,
              enum copy_direction dir, u32 *crcp);
 
-void *iova_to_vaddr(struct rxe_mem *mem, u64 iova, int length);
+void *iova_to_vaddr(struct rxe_mr *mr, u64 iova, int length);
 
 enum lookup_type {
        lookup_local,
        lookup_remote,
 };
 
-struct rxe_mem *lookup_mem(struct rxe_pd *pd, int access, u32 key,
-                          enum lookup_type type);
+struct rxe_mr *lookup_mr(struct rxe_pd *pd, int access, u32 key,
+                        enum lookup_type type);
 
-int mem_check_range(struct rxe_mem *mem, u64 iova, size_t length);
+int mr_check_range(struct rxe_mr *mr, u64 iova, size_t length);
 
-void rxe_mem_cleanup(struct rxe_pool_entry *arg);
+void rxe_mr_cleanup(struct rxe_pool_entry *arg);
 
 int advance_dma_data(struct rxe_dma_info *dma, unsigned int length);
 
@@ -116,7 +113,6 @@ struct sk_buff *rxe_init_packet(struct rxe_dev *rxe, struct rxe_av *av,
                                int paylen, struct rxe_pkt_info *pkt);
 int rxe_prepare(struct rxe_pkt_info *pkt, struct sk_buff *skb, u32 *crc);
 const char *rxe_parent_name(struct rxe_dev *rxe, unsigned int port_num);
-struct device *rxe_dma_device(struct rxe_dev *rxe);
 int rxe_mcast_add(struct rxe_dev *rxe, union ib_gid *mgid);
 int rxe_mcast_delete(struct rxe_dev *rxe, union ib_gid *mgid);
 
index 6e8c41567ba08e13d0ca8515901e0206c8165ce6..9f63947bab1237fd23269b61f6349f0d6f5e960c 100644 (file)
@@ -24,16 +24,15 @@ static u8 rxe_get_key(void)
        return key;
 }
 
-int mem_check_range(struct rxe_mem *mem, u64 iova, size_t length)
+int mr_check_range(struct rxe_mr *mr, u64 iova, size_t length)
 {
-       switch (mem->type) {
-       case RXE_MEM_TYPE_DMA:
+       switch (mr->type) {
+       case RXE_MR_TYPE_DMA:
                return 0;
 
-       case RXE_MEM_TYPE_MR:
-               if (iova < mem->iova ||
-                   length > mem->length ||
-                   iova > mem->iova + mem->length - length)
+       case RXE_MR_TYPE_MR:
+               if (iova < mr->iova || length > mr->length ||
+                   iova > mr->iova + mr->length - length)
                        return -EFAULT;
                return 0;
 
@@ -46,85 +45,83 @@ int mem_check_range(struct rxe_mem *mem, u64 iova, size_t length)
                                | IB_ACCESS_REMOTE_WRITE        \
                                | IB_ACCESS_REMOTE_ATOMIC)
 
-static void rxe_mem_init(int access, struct rxe_mem *mem)
+static void rxe_mr_init(int access, struct rxe_mr *mr)
 {
-       u32 lkey = mem->pelem.index << 8 | rxe_get_key();
+       u32 lkey = mr->pelem.index << 8 | rxe_get_key();
        u32 rkey = (access & IB_ACCESS_REMOTE) ? lkey : 0;
 
-       mem->ibmr.lkey          = lkey;
-       mem->ibmr.rkey          = rkey;
-       mem->state              = RXE_MEM_STATE_INVALID;
-       mem->type               = RXE_MEM_TYPE_NONE;
-       mem->map_shift          = ilog2(RXE_BUF_PER_MAP);
+       mr->ibmr.lkey = lkey;
+       mr->ibmr.rkey = rkey;
+       mr->state = RXE_MR_STATE_INVALID;
+       mr->type = RXE_MR_TYPE_NONE;
+       mr->map_shift = ilog2(RXE_BUF_PER_MAP);
 }
 
-void rxe_mem_cleanup(struct rxe_pool_entry *arg)
+void rxe_mr_cleanup(struct rxe_pool_entry *arg)
 {
-       struct rxe_mem *mem = container_of(arg, typeof(*mem), pelem);
+       struct rxe_mr *mr = container_of(arg, typeof(*mr), pelem);
        int i;
 
-       ib_umem_release(mem->umem);
+       ib_umem_release(mr->umem);
 
-       if (mem->map) {
-               for (i = 0; i < mem->num_map; i++)
-                       kfree(mem->map[i]);
+       if (mr->map) {
+               for (i = 0; i < mr->num_map; i++)
+                       kfree(mr->map[i]);
 
-               kfree(mem->map);
+               kfree(mr->map);
        }
 }
 
-static int rxe_mem_alloc(struct rxe_mem *mem, int num_buf)
+static int rxe_mr_alloc(struct rxe_mr *mr, int num_buf)
 {
        int i;
        int num_map;
-       struct rxe_map **map = mem->map;
+       struct rxe_map **map = mr->map;
 
        num_map = (num_buf + RXE_BUF_PER_MAP - 1) / RXE_BUF_PER_MAP;
 
-       mem->map = kmalloc_array(num_map, sizeof(*map), GFP_KERNEL);
-       if (!mem->map)
+       mr->map = kmalloc_array(num_map, sizeof(*map), GFP_KERNEL);
+       if (!mr->map)
                goto err1;
 
        for (i = 0; i < num_map; i++) {
-               mem->map[i] = kmalloc(sizeof(**map), GFP_KERNEL);
-               if (!mem->map[i])
+               mr->map[i] = kmalloc(sizeof(**map), GFP_KERNEL);
+               if (!mr->map[i])
                        goto err2;
        }
 
        BUILD_BUG_ON(!is_power_of_2(RXE_BUF_PER_MAP));
 
-       mem->map_shift  = ilog2(RXE_BUF_PER_MAP);
-       mem->map_mask   = RXE_BUF_PER_MAP - 1;
+       mr->map_shift = ilog2(RXE_BUF_PER_MAP);
+       mr->map_mask = RXE_BUF_PER_MAP - 1;
 
-       mem->num_buf = num_buf;
-       mem->num_map = num_map;
-       mem->max_buf = num_map * RXE_BUF_PER_MAP;
+       mr->num_buf = num_buf;
+       mr->num_map = num_map;
+       mr->max_buf = num_map * RXE_BUF_PER_MAP;
 
        return 0;
 
 err2:
        for (i--; i >= 0; i--)
-               kfree(mem->map[i]);
+               kfree(mr->map[i]);
 
-       kfree(mem->map);
+       kfree(mr->map);
 err1:
        return -ENOMEM;
 }
 
-void rxe_mem_init_dma(struct rxe_pd *pd,
-                     int access, struct rxe_mem *mem)
+void rxe_mr_init_dma(struct rxe_pd *pd, int access, struct rxe_mr *mr)
 {
-       rxe_mem_init(access, mem);
+       rxe_mr_init(access, mr);
 
-       mem->ibmr.pd            = &pd->ibpd;
-       mem->access             = access;
-       mem->state              = RXE_MEM_STATE_VALID;
-       mem->type               = RXE_MEM_TYPE_DMA;
+       mr->ibmr.pd = &pd->ibpd;
+       mr->access = access;
+       mr->state = RXE_MR_STATE_VALID;
+       mr->type = RXE_MR_TYPE_DMA;
 }
 
-int rxe_mem_init_user(struct rxe_pd *pd, u64 start,
-                     u64 length, u64 iova, int access, struct ib_udata *udata,
-                     struct rxe_mem *mem)
+int rxe_mr_init_user(struct rxe_pd *pd, u64 start, u64 length, u64 iova,
+                    int access, struct ib_udata *udata, struct rxe_mr *mr)
 {
        struct rxe_map          **map;
        struct rxe_phys_buf     *buf = NULL;
@@ -142,23 +139,23 @@ int rxe_mem_init_user(struct rxe_pd *pd, u64 start,
                goto err1;
        }
 
-       mem->umem = umem;
+       mr->umem = umem;
        num_buf = ib_umem_num_pages(umem);
 
-       rxe_mem_init(access, mem);
+       rxe_mr_init(access, mr);
 
-       err = rxe_mem_alloc(mem, num_buf);
+       err = rxe_mr_alloc(mr, num_buf);
        if (err) {
-               pr_warn("err %d from rxe_mem_alloc\n", err);
+               pr_warn("err %d from rxe_mr_alloc\n", err);
                ib_umem_release(umem);
                goto err1;
        }
 
-       mem->page_shift         = PAGE_SHIFT;
-       mem->page_mask = PAGE_SIZE - 1;
+       mr->page_shift = PAGE_SHIFT;
+       mr->page_mask = PAGE_SIZE - 1;
 
        num_buf                 = 0;
-       map                     = mem->map;
+       map = mr->map;
        if (length > 0) {
                buf = map[0]->buf;
 
@@ -185,15 +182,15 @@ int rxe_mem_init_user(struct rxe_pd *pd, u64 start,
                }
        }
 
-       mem->ibmr.pd            = &pd->ibpd;
-       mem->umem               = umem;
-       mem->access             = access;
-       mem->length             = length;
-       mem->iova               = iova;
-       mem->va                 = start;
-       mem->offset             = ib_umem_offset(umem);
-       mem->state              = RXE_MEM_STATE_VALID;
-       mem->type               = RXE_MEM_TYPE_MR;
+       mr->ibmr.pd = &pd->ibpd;
+       mr->umem = umem;
+       mr->access = access;
+       mr->length = length;
+       mr->iova = iova;
+       mr->va = start;
+       mr->offset = ib_umem_offset(umem);
+       mr->state = RXE_MR_STATE_VALID;
+       mr->type = RXE_MR_TYPE_MR;
 
        return 0;
 
@@ -201,24 +198,23 @@ err1:
        return err;
 }
 
-int rxe_mem_init_fast(struct rxe_pd *pd,
-                     int max_pages, struct rxe_mem *mem)
+int rxe_mr_init_fast(struct rxe_pd *pd, int max_pages, struct rxe_mr *mr)
 {
        int err;
 
-       rxe_mem_init(0, mem);
+       rxe_mr_init(0, mr);
 
        /* In fastreg, we also set the rkey */
-       mem->ibmr.rkey = mem->ibmr.lkey;
+       mr->ibmr.rkey = mr->ibmr.lkey;
 
-       err = rxe_mem_alloc(mem, max_pages);
+       err = rxe_mr_alloc(mr, max_pages);
        if (err)
                goto err1;
 
-       mem->ibmr.pd            = &pd->ibpd;
-       mem->max_buf            = max_pages;
-       mem->state              = RXE_MEM_STATE_FREE;
-       mem->type               = RXE_MEM_TYPE_MR;
+       mr->ibmr.pd = &pd->ibpd;
+       mr->max_buf = max_pages;
+       mr->state = RXE_MR_STATE_FREE;
+       mr->type = RXE_MR_TYPE_MR;
 
        return 0;
 
@@ -226,28 +222,24 @@ err1:
        return err;
 }
 
-static void lookup_iova(
-       struct rxe_mem  *mem,
-       u64                     iova,
-       int                     *m_out,
-       int                     *n_out,
-       size_t                  *offset_out)
+static void lookup_iova(struct rxe_mr *mr, u64 iova, int *m_out, int *n_out,
+                       size_t *offset_out)
 {
-       size_t                  offset = iova - mem->iova + mem->offset;
+       size_t offset = iova - mr->iova + mr->offset;
        int                     map_index;
        int                     buf_index;
        u64                     length;
 
-       if (likely(mem->page_shift)) {
-               *offset_out = offset & mem->page_mask;
-               offset >>= mem->page_shift;
-               *n_out = offset & mem->map_mask;
-               *m_out = offset >> mem->map_shift;
+       if (likely(mr->page_shift)) {
+               *offset_out = offset & mr->page_mask;
+               offset >>= mr->page_shift;
+               *n_out = offset & mr->map_mask;
+               *m_out = offset >> mr->map_shift;
        } else {
                map_index = 0;
                buf_index = 0;
 
-               length = mem->map[map_index]->buf[buf_index].size;
+               length = mr->map[map_index]->buf[buf_index].size;
 
                while (offset >= length) {
                        offset -= length;
@@ -257,7 +249,7 @@ static void lookup_iova(
                                map_index++;
                                buf_index = 0;
                        }
-                       length = mem->map[map_index]->buf[buf_index].size;
+                       length = mr->map[map_index]->buf[buf_index].size;
                }
 
                *m_out = map_index;
@@ -266,49 +258,49 @@ static void lookup_iova(
        }
 }
 
-void *iova_to_vaddr(struct rxe_mem *mem, u64 iova, int length)
+void *iova_to_vaddr(struct rxe_mr *mr, u64 iova, int length)
 {
        size_t offset;
        int m, n;
        void *addr;
 
-       if (mem->state != RXE_MEM_STATE_VALID) {
-               pr_warn("mem not in valid state\n");
+       if (mr->state != RXE_MR_STATE_VALID) {
+               pr_warn("mr not in valid state\n");
                addr = NULL;
                goto out;
        }
 
-       if (!mem->map) {
+       if (!mr->map) {
                addr = (void *)(uintptr_t)iova;
                goto out;
        }
 
-       if (mem_check_range(mem, iova, length)) {
+       if (mr_check_range(mr, iova, length)) {
                pr_warn("range violation\n");
                addr = NULL;
                goto out;
        }
 
-       lookup_iova(mem, iova, &m, &n, &offset);
+       lookup_iova(mr, iova, &m, &n, &offset);
 
-       if (offset + length > mem->map[m]->buf[n].size) {
+       if (offset + length > mr->map[m]->buf[n].size) {
                pr_warn("crosses page boundary\n");
                addr = NULL;
                goto out;
        }
 
-       addr = (void *)(uintptr_t)mem->map[m]->buf[n].addr + offset;
+       addr = (void *)(uintptr_t)mr->map[m]->buf[n].addr + offset;
 
 out:
        return addr;
 }
 
 /* copy data from a range (vaddr, vaddr+length-1) to or from
- * a mem object starting at iova. Compute incremental value of
- * crc32 if crcp is not zero. caller must hold a reference to mem
+ * a mr object starting at iova. Compute incremental value of
+ * crc32 if crcp is not zero. caller must hold a reference to mr
  */
-int rxe_mem_copy(struct rxe_mem *mem, u64 iova, void *addr, int length,
-                enum copy_direction dir, u32 *crcp)
+int rxe_mr_copy(struct rxe_mr *mr, u64 iova, void *addr, int length,
+               enum copy_direction dir, u32 *crcp)
 {
        int                     err;
        int                     bytes;
@@ -323,43 +315,41 @@ int rxe_mem_copy(struct rxe_mem *mem, u64 iova, void *addr, int length,
        if (length == 0)
                return 0;
 
-       if (mem->type == RXE_MEM_TYPE_DMA) {
+       if (mr->type == RXE_MR_TYPE_DMA) {
                u8 *src, *dest;
 
-               src  = (dir == to_mem_obj) ?
-                       addr : ((void *)(uintptr_t)iova);
+               src = (dir == to_mr_obj) ? addr : ((void *)(uintptr_t)iova);
 
-               dest = (dir == to_mem_obj) ?
-                       ((void *)(uintptr_t)iova) : addr;
+               dest = (dir == to_mr_obj) ? ((void *)(uintptr_t)iova) : addr;
 
                memcpy(dest, src, length);
 
                if (crcp)
-                       *crcp = rxe_crc32(to_rdev(mem->ibmr.device),
-                                       *crcp, dest, length);
+                       *crcp = rxe_crc32(to_rdev(mr->ibmr.device), *crcp, dest,
+                                         length);
 
                return 0;
        }
 
-       WARN_ON_ONCE(!mem->map);
+       WARN_ON_ONCE(!mr->map);
 
-       err = mem_check_range(mem, iova, length);
+       err = mr_check_range(mr, iova, length);
        if (err) {
                err = -EFAULT;
                goto err1;
        }
 
-       lookup_iova(mem, iova, &m, &i, &offset);
+       lookup_iova(mr, iova, &m, &i, &offset);
 
-       map     = mem->map + m;
+       map = mr->map + m;
        buf     = map[0]->buf + i;
 
        while (length > 0) {
                u8 *src, *dest;
 
                va      = (u8 *)(uintptr_t)buf->addr + offset;
-               src  = (dir == to_mem_obj) ? addr : va;
-               dest = (dir == to_mem_obj) ? va : addr;
+               src = (dir == to_mr_obj) ? addr : va;
+               dest = (dir == to_mr_obj) ? va : addr;
 
                bytes   = buf->size - offset;
 
@@ -369,8 +359,8 @@ int rxe_mem_copy(struct rxe_mem *mem, u64 iova, void *addr, int length,
                memcpy(dest, src, bytes);
 
                if (crcp)
-                       crc = rxe_crc32(to_rdev(mem->ibmr.device),
-                                       crc, dest, bytes);
+                       crc = rxe_crc32(to_rdev(mr->ibmr.device), crc, dest,
+                                       bytes);
 
                length  -= bytes;
                addr    += bytes;
@@ -411,7 +401,7 @@ int copy_data(
        struct rxe_sge          *sge    = &dma->sge[dma->cur_sge];
        int                     offset  = dma->sge_offset;
        int                     resid   = dma->resid;
-       struct rxe_mem          *mem    = NULL;
+       struct rxe_mr           *mr     = NULL;
        u64                     iova;
        int                     err;
 
@@ -424,8 +414,8 @@ int copy_data(
        }
 
        if (sge->length && (offset < sge->length)) {
-               mem = lookup_mem(pd, access, sge->lkey, lookup_local);
-               if (!mem) {
+               mr = lookup_mr(pd, access, sge->lkey, lookup_local);
+               if (!mr) {
                        err = -EINVAL;
                        goto err1;
                }
@@ -435,9 +425,9 @@ int copy_data(
                bytes = length;
 
                if (offset >= sge->length) {
-                       if (mem) {
-                               rxe_drop_ref(mem);
-                               mem = NULL;
+                       if (mr) {
+                               rxe_drop_ref(mr);
+                               mr = NULL;
                        }
                        sge++;
                        dma->cur_sge++;
@@ -449,9 +439,9 @@ int copy_data(
                        }
 
                        if (sge->length) {
-                               mem = lookup_mem(pd, access, sge->lkey,
-                                                lookup_local);
-                               if (!mem) {
+                               mr = lookup_mr(pd, access, sge->lkey,
+                                              lookup_local);
+                               if (!mr) {
                                        err = -EINVAL;
                                        goto err1;
                                }
@@ -466,7 +456,7 @@ int copy_data(
                if (bytes > 0) {
                        iova = sge->addr + offset;
 
-                       err = rxe_mem_copy(mem, iova, addr, bytes, dir, crcp);
+                       err = rxe_mr_copy(mr, iova, addr, bytes, dir, crcp);
                        if (err)
                                goto err2;
 
@@ -480,14 +470,14 @@ int copy_data(
        dma->sge_offset = offset;
        dma->resid      = resid;
 
-       if (mem)
-               rxe_drop_ref(mem);
+       if (mr)
+               rxe_drop_ref(mr);
 
        return 0;
 
 err2:
-       if (mem)
-               rxe_drop_ref(mem);
+       if (mr)
+               rxe_drop_ref(mr);
 err1:
        return err;
 }
@@ -525,31 +515,30 @@ int advance_dma_data(struct rxe_dma_info *dma, unsigned int length)
        return 0;
 }
 
-/* (1) find the mem (mr or mw) corresponding to lkey/rkey
+/* (1) find the mr corresponding to lkey/rkey
  *     depending on lookup_type
- * (2) verify that the (qp) pd matches the mem pd
- * (3) verify that the mem can support the requested access
- * (4) verify that mem state is valid
+ * (2) verify that the (qp) pd matches the mr pd
+ * (3) verify that the mr can support the requested access
+ * (4) verify that mr state is valid
  */
-struct rxe_mem *lookup_mem(struct rxe_pd *pd, int access, u32 key,
-                          enum lookup_type type)
+struct rxe_mr *lookup_mr(struct rxe_pd *pd, int access, u32 key,
+                        enum lookup_type type)
 {
-       struct rxe_mem *mem;
+       struct rxe_mr *mr;
        struct rxe_dev *rxe = to_rdev(pd->ibpd.device);
        int index = key >> 8;
 
-       mem = rxe_pool_get_index(&rxe->mr_pool, index);
-       if (!mem)
+       mr = rxe_pool_get_index(&rxe->mr_pool, index);
+       if (!mr)
                return NULL;
 
-       if (unlikely((type == lookup_local && mr_lkey(mem) != key) ||
-                    (type == lookup_remote && mr_rkey(mem) != key) ||
-                    mr_pd(mem) != pd ||
-                    (access && !(access & mem->access)) ||
-                    mem->state != RXE_MEM_STATE_VALID)) {
-               rxe_drop_ref(mem);
-               mem = NULL;
+       if (unlikely((type == lookup_local && mr_lkey(mr) != key) ||
+                    (type == lookup_remote && mr_rkey(mr) != key) ||
+                    mr_pd(mr) != pd || (access && !(access & mr->access)) ||
+                    mr->state != RXE_MR_STATE_VALID)) {
+               rxe_drop_ref(mr);
+               mr = NULL;
        }
 
-       return mem;
+       return mr;
 }
index 307d8986e7c9b8724d90601140b288546927d169..d24901f2af3fba73537c2bc00f55300a97bd0f61 100644 (file)
@@ -8,8 +8,6 @@
 #include "rxe_loc.h"
 
 /* info about object pools
- * note that mr and mw share a single index space
- * so that one can map an lkey to the correct type of object
  */
 struct rxe_type_info rxe_type_info[RXE_NUM_TYPES] = {
        [RXE_TYPE_UC] = {
@@ -56,18 +54,18 @@ struct rxe_type_info rxe_type_info[RXE_NUM_TYPES] = {
        },
        [RXE_TYPE_MR] = {
                .name           = "rxe-mr",
-               .size           = sizeof(struct rxe_mem),
-               .elem_offset    = offsetof(struct rxe_mem, pelem),
-               .cleanup        = rxe_mem_cleanup,
+               .size           = sizeof(struct rxe_mr),
+               .elem_offset    = offsetof(struct rxe_mr, pelem),
+               .cleanup        = rxe_mr_cleanup,
                .flags          = RXE_POOL_INDEX,
                .max_index      = RXE_MAX_MR_INDEX,
                .min_index      = RXE_MIN_MR_INDEX,
        },
        [RXE_TYPE_MW] = {
                .name           = "rxe-mw",
-               .size           = sizeof(struct rxe_mem),
-               .elem_offset    = offsetof(struct rxe_mem, pelem),
-               .flags          = RXE_POOL_INDEX,
+               .size           = sizeof(struct rxe_mw),
+               .elem_offset    = offsetof(struct rxe_mw, pelem),
+               .flags          = RXE_POOL_INDEX | RXE_POOL_NO_ALLOC,
                .max_index      = RXE_MAX_MW_INDEX,
                .min_index      = RXE_MIN_MW_INDEX,
        },
index 889290793d75bef78b0013fde326afd73b80e079..3664cdae7e1f435c2519b2f3070e5d56ed0cc1f6 100644 (file)
@@ -464,7 +464,7 @@ static int fill_packet(struct rxe_qp *qp, struct rxe_send_wqe *wqe,
                } else {
                        err = copy_data(qp->pd, 0, &wqe->dma,
                                        payload_addr(pkt), paylen,
-                                       from_mem_obj,
+                                       from_mr_obj,
                                        &crc);
                        if (err)
                                return err;
@@ -596,7 +596,7 @@ next_wqe:
        if (wqe->mask & WR_REG_MASK) {
                if (wqe->wr.opcode == IB_WR_LOCAL_INV) {
                        struct rxe_dev *rxe = to_rdev(qp->ibqp.device);
-                       struct rxe_mem *rmr;
+                       struct rxe_mr *rmr;
 
                        rmr = rxe_pool_get_index(&rxe->mr_pool,
                                                 wqe->wr.ex.invalidate_rkey >> 8);
@@ -607,14 +607,14 @@ next_wqe:
                                wqe->status = IB_WC_MW_BIND_ERR;
                                goto exit;
                        }
-                       rmr->state = RXE_MEM_STATE_FREE;
+                       rmr->state = RXE_MR_STATE_FREE;
                        rxe_drop_ref(rmr);
                        wqe->state = wqe_state_done;
                        wqe->status = IB_WC_SUCCESS;
                } else if (wqe->wr.opcode == IB_WR_REG_MR) {
-                       struct rxe_mem *rmr = to_rmr(wqe->wr.wr.reg.mr);
+                       struct rxe_mr *rmr = to_rmr(wqe->wr.wr.reg.mr);
 
-                       rmr->state = RXE_MEM_STATE_VALID;
+                       rmr->state = RXE_MR_STATE_VALID;
                        rmr->access = wqe->wr.wr.reg.access;
                        rmr->ibmr.lkey = wqe->wr.wr.reg.key;
                        rmr->ibmr.rkey = wqe->wr.wr.reg.key;
index 142f3d8014d83877ca389893ed0994a82bf8d8e1..2b220659bddbfd668d811ec25a52cc69f64986fa 100644 (file)
@@ -391,7 +391,7 @@ static enum resp_states check_length(struct rxe_qp *qp,
 static enum resp_states check_rkey(struct rxe_qp *qp,
                                   struct rxe_pkt_info *pkt)
 {
-       struct rxe_mem *mem = NULL;
+       struct rxe_mr *mr = NULL;
        u64 va;
        u32 rkey;
        u32 resid;
@@ -430,18 +430,18 @@ static enum resp_states check_rkey(struct rxe_qp *qp,
        resid   = qp->resp.resid;
        pktlen  = payload_size(pkt);
 
-       mem = lookup_mem(qp->pd, access, rkey, lookup_remote);
-       if (!mem) {
+       mr = lookup_mr(qp->pd, access, rkey, lookup_remote);
+       if (!mr) {
                state = RESPST_ERR_RKEY_VIOLATION;
                goto err;
        }
 
-       if (unlikely(mem->state == RXE_MEM_STATE_FREE)) {
+       if (unlikely(mr->state == RXE_MR_STATE_FREE)) {
                state = RESPST_ERR_RKEY_VIOLATION;
                goto err;
        }
 
-       if (mem_check_range(mem, va, resid)) {
+       if (mr_check_range(mr, va, resid)) {
                state = RESPST_ERR_RKEY_VIOLATION;
                goto err;
        }
@@ -469,12 +469,12 @@ static enum resp_states check_rkey(struct rxe_qp *qp,
 
        WARN_ON_ONCE(qp->resp.mr);
 
-       qp->resp.mr = mem;
+       qp->resp.mr = mr;
        return RESPST_EXECUTE;
 
 err:
-       if (mem)
-               rxe_drop_ref(mem);
+       if (mr)
+               rxe_drop_ref(mr);
        return state;
 }
 
@@ -484,7 +484,7 @@ static enum resp_states send_data_in(struct rxe_qp *qp, void *data_addr,
        int err;
 
        err = copy_data(qp->pd, IB_ACCESS_LOCAL_WRITE, &qp->resp.wqe->dma,
-                       data_addr, data_len, to_mem_obj, NULL);
+                       data_addr, data_len, to_mr_obj, NULL);
        if (unlikely(err))
                return (err == -ENOSPC) ? RESPST_ERR_LENGTH
                                        : RESPST_ERR_MALFORMED_WQE;
@@ -499,8 +499,8 @@ static enum resp_states write_data_in(struct rxe_qp *qp,
        int     err;
        int data_len = payload_size(pkt);
 
-       err = rxe_mem_copy(qp->resp.mr, qp->resp.va, payload_addr(pkt),
-                          data_len, to_mem_obj, NULL);
+       err = rxe_mr_copy(qp->resp.mr, qp->resp.va, payload_addr(pkt), data_len,
+                         to_mr_obj, NULL);
        if (err) {
                rc = RESPST_ERR_RKEY_VIOLATION;
                goto out;
@@ -522,9 +522,9 @@ static enum resp_states process_atomic(struct rxe_qp *qp,
        u64 iova = atmeth_va(pkt);
        u64 *vaddr;
        enum resp_states ret;
-       struct rxe_mem *mr = qp->resp.mr;
+       struct rxe_mr *mr = qp->resp.mr;
 
-       if (mr->state != RXE_MEM_STATE_VALID) {
+       if (mr->state != RXE_MR_STATE_VALID) {
                ret = RESPST_ERR_RKEY_VIOLATION;
                goto out;
        }
@@ -700,8 +700,8 @@ static enum resp_states read_reply(struct rxe_qp *qp,
        if (!skb)
                return RESPST_ERR_RNR;
 
-       err = rxe_mem_copy(res->read.mr, res->read.va, payload_addr(&ack_pkt),
-                          payload, from_mem_obj, &icrc);
+       err = rxe_mr_copy(res->read.mr, res->read.va, payload_addr(&ack_pkt),
+                         payload, from_mr_obj, &icrc);
        if (err)
                pr_err("Failed copying memory\n");
 
@@ -816,8 +816,8 @@ static enum resp_states do_complete(struct rxe_qp *qp,
        struct rxe_recv_wqe *wqe = qp->resp.wqe;
        struct rxe_dev *rxe = to_rdev(qp->ibqp.device);
 
-       if (unlikely(!wqe))
-               return RESPST_CLEANUP;
+       if (!wqe)
+               goto finish;
 
        memset(&cqe, 0, sizeof(cqe));
 
@@ -883,7 +883,7 @@ static enum resp_states do_complete(struct rxe_qp *qp,
                        }
 
                        if (pkt->mask & RXE_IETH_MASK) {
-                               struct rxe_mem *rmr;
+                               struct rxe_mr *rmr;
 
                                wc->wc_flags |= IB_WC_WITH_INVALIDATE;
                                wc->ex.invalidate_rkey = ieth_rkey(pkt);
@@ -895,7 +895,7 @@ static enum resp_states do_complete(struct rxe_qp *qp,
                                               wc->ex.invalidate_rkey);
                                        return RESPST_ERROR;
                                }
-                               rmr->state = RXE_MEM_STATE_FREE;
+                               rmr->state = RXE_MR_STATE_FREE;
                                rxe_drop_ref(rmr);
                        }
 
@@ -917,12 +917,12 @@ static enum resp_states do_complete(struct rxe_qp *qp,
        if (rxe_cq_post(qp->rcq, &cqe, pkt ? bth_se(pkt) : 1))
                return RESPST_ERR_CQ_OVERFLOW;
 
-       if (qp->resp.state == QP_STATE_ERROR)
+finish:
+       if (unlikely(qp->resp.state == QP_STATE_ERROR))
                return RESPST_CHK_RESOURCE;
-
-       if (!pkt)
+       if (unlikely(!pkt))
                return RESPST_DONE;
-       else if (qp_type(qp) == IB_QPT_RC)
+       if (qp_type(qp) == IB_QPT_RC)
                return RESPST_ACKNOWLEDGE;
        else
                return RESPST_CLEANUP;
@@ -1056,10 +1056,8 @@ static enum resp_states duplicate_request(struct rxe_qp *qp,
        if (pkt->mask & RXE_SEND_MASK ||
            pkt->mask & RXE_WRITE_MASK) {
                /* SEND. Ack again and cleanup. C9-105. */
-               if (bth_ack(pkt))
-                       send_ack(qp, pkt, AETH_ACK_UNLIMITED, prev_psn);
-               rc = RESPST_CLEANUP;
-               goto out;
+               send_ack(qp, pkt, AETH_ACK_UNLIMITED, prev_psn);
+               return RESPST_CLEANUP;
        } else if (pkt->mask & RXE_READ_MASK) {
                struct resp_res *res;
 
index dee5e0e919d28c6cf1d68c0efdd4c4341ed40636..aeb5e232c19575919fabdcc96a6fa5cc2087c254 100644 (file)
@@ -26,7 +26,7 @@ static int rxe_query_device(struct ib_device *dev,
 }
 
 static int rxe_query_port(struct ib_device *dev,
-                         u8 port_num, struct ib_port_attr *attr)
+                         u32 port_num, struct ib_port_attr *attr)
 {
        struct rxe_dev *rxe = to_rdev(dev);
        struct rxe_port *port;
@@ -54,7 +54,7 @@ static int rxe_query_port(struct ib_device *dev,
 }
 
 static int rxe_query_pkey(struct ib_device *device,
-                         u8 port_num, u16 index, u16 *pkey)
+                         u32 port_num, u16 index, u16 *pkey)
 {
        if (index > 0)
                return -EINVAL;
@@ -84,7 +84,7 @@ static int rxe_modify_device(struct ib_device *dev,
 }
 
 static int rxe_modify_port(struct ib_device *dev,
-                          u8 port_num, int mask, struct ib_port_modify *attr)
+                          u32 port_num, int mask, struct ib_port_modify *attr)
 {
        struct rxe_dev *rxe = to_rdev(dev);
        struct rxe_port *port;
@@ -101,7 +101,7 @@ static int rxe_modify_port(struct ib_device *dev,
 }
 
 static enum rdma_link_layer rxe_get_link_layer(struct ib_device *dev,
-                                              u8 port_num)
+                                              u32 port_num)
 {
        return IB_LINK_LAYER_ETHERNET;
 }
@@ -121,7 +121,7 @@ static void rxe_dealloc_ucontext(struct ib_ucontext *ibuc)
        rxe_drop_ref(uc);
 }
 
-static int rxe_port_immutable(struct ib_device *dev, u8 port_num,
+static int rxe_port_immutable(struct ib_device *dev, u32 port_num,
                              struct ib_port_immutable *immutable)
 {
        int err;
@@ -865,7 +865,7 @@ static struct ib_mr *rxe_get_dma_mr(struct ib_pd *ibpd, int access)
 {
        struct rxe_dev *rxe = to_rdev(ibpd->device);
        struct rxe_pd *pd = to_rpd(ibpd);
-       struct rxe_mem *mr;
+       struct rxe_mr *mr;
 
        mr = rxe_alloc(&rxe->mr_pool);
        if (!mr)
@@ -873,7 +873,7 @@ static struct ib_mr *rxe_get_dma_mr(struct ib_pd *ibpd, int access)
 
        rxe_add_index(mr);
        rxe_add_ref(pd);
-       rxe_mem_init_dma(pd, access, mr);
+       rxe_mr_init_dma(pd, access, mr);
 
        return &mr->ibmr;
 }
@@ -887,7 +887,7 @@ static struct ib_mr *rxe_reg_user_mr(struct ib_pd *ibpd,
        int err;
        struct rxe_dev *rxe = to_rdev(ibpd->device);
        struct rxe_pd *pd = to_rpd(ibpd);
-       struct rxe_mem *mr;
+       struct rxe_mr *mr;
 
        mr = rxe_alloc(&rxe->mr_pool);
        if (!mr) {
@@ -899,8 +899,7 @@ static struct ib_mr *rxe_reg_user_mr(struct ib_pd *ibpd,
 
        rxe_add_ref(pd);
 
-       err = rxe_mem_init_user(pd, start, length, iova,
-                               access, udata, mr);
+       err = rxe_mr_init_user(pd, start, length, iova, access, udata, mr);
        if (err)
                goto err3;
 
@@ -916,9 +915,9 @@ err2:
 
 static int rxe_dereg_mr(struct ib_mr *ibmr, struct ib_udata *udata)
 {
-       struct rxe_mem *mr = to_rmr(ibmr);
+       struct rxe_mr *mr = to_rmr(ibmr);
 
-       mr->state = RXE_MEM_STATE_ZOMBIE;
+       mr->state = RXE_MR_STATE_ZOMBIE;
        rxe_drop_ref(mr_pd(mr));
        rxe_drop_index(mr);
        rxe_drop_ref(mr);
@@ -930,7 +929,7 @@ static struct ib_mr *rxe_alloc_mr(struct ib_pd *ibpd, enum ib_mr_type mr_type,
 {
        struct rxe_dev *rxe = to_rdev(ibpd->device);
        struct rxe_pd *pd = to_rpd(ibpd);
-       struct rxe_mem *mr;
+       struct rxe_mr *mr;
        int err;
 
        if (mr_type != IB_MR_TYPE_MEM_REG)
@@ -946,7 +945,7 @@ static struct ib_mr *rxe_alloc_mr(struct ib_pd *ibpd, enum ib_mr_type mr_type,
 
        rxe_add_ref(pd);
 
-       err = rxe_mem_init_fast(pd, max_num_sg, mr);
+       err = rxe_mr_init_fast(pd, max_num_sg, mr);
        if (err)
                goto err2;
 
@@ -962,7 +961,7 @@ err1:
 
 static int rxe_set_page(struct ib_mr *ibmr, u64 addr)
 {
-       struct rxe_mem *mr = to_rmr(ibmr);
+       struct rxe_mr *mr = to_rmr(ibmr);
        struct rxe_map *map;
        struct rxe_phys_buf *buf;
 
@@ -982,7 +981,7 @@ static int rxe_set_page(struct ib_mr *ibmr, u64 addr)
 static int rxe_map_mr_sg(struct ib_mr *ibmr, struct scatterlist *sg,
                         int sg_nents, unsigned int *sg_offset)
 {
-       struct rxe_mem *mr = to_rmr(ibmr);
+       struct rxe_mr *mr = to_rmr(ibmr);
        int n;
 
        mr->nbuf = 0;
@@ -1110,6 +1109,7 @@ static const struct ib_device_ops rxe_dev_ops = {
        INIT_RDMA_OBJ_SIZE(ib_pd, rxe_pd, ibpd),
        INIT_RDMA_OBJ_SIZE(ib_srq, rxe_srq, ibsrq),
        INIT_RDMA_OBJ_SIZE(ib_ucontext, rxe_ucontext, ibuc),
+       INIT_RDMA_OBJ_SIZE(ib_mw, rxe_mw, ibmw),
 };
 
 int rxe_register_device(struct rxe_dev *rxe, const char *ibdev_name)
index 79e0a5a878da35de5e5e4c0830aadd8a7ab1ce6d..11eba7a3ba8f40149fa3e2b390212e134e0ceeb1 100644 (file)
@@ -156,7 +156,7 @@ struct resp_res {
                        struct sk_buff  *skb;
                } atomic;
                struct {
-                       struct rxe_mem  *mr;
+                       struct rxe_m  *mr;
                        u64             va_org;
                        u32             rkey;
                        u32             length;
@@ -183,7 +183,7 @@ struct rxe_resp_info {
 
        /* RDMA read / atomic only */
        u64                     va;
-       struct rxe_mem          *mr;
+       struct rxe_m          *mr;
        u32                     resid;
        u32                     rkey;
        u32                     length;
@@ -262,18 +262,18 @@ struct rxe_qp {
        struct execute_work     cleanup_work;
 };
 
-enum rxe_mem_state {
-       RXE_MEM_STATE_ZOMBIE,
-       RXE_MEM_STATE_INVALID,
-       RXE_MEM_STATE_FREE,
-       RXE_MEM_STATE_VALID,
+enum rxe_mr_state {
+       RXE_MR_STATE_ZOMBIE,
+       RXE_MR_STATE_INVALID,
+       RXE_MR_STATE_FREE,
+       RXE_MR_STATE_VALID,
 };
 
-enum rxe_mem_type {
-       RXE_MEM_TYPE_NONE,
-       RXE_MEM_TYPE_DMA,
-       RXE_MEM_TYPE_MR,
-       RXE_MEM_TYPE_MW,
+enum rxe_mr_type {
+       RXE_MR_TYPE_NONE,
+       RXE_MR_TYPE_DMA,
+       RXE_MR_TYPE_MR,
+       RXE_MR_TYPE_MW,
 };
 
 #define RXE_BUF_PER_MAP                (PAGE_SIZE / sizeof(struct rxe_phys_buf))
@@ -287,17 +287,14 @@ struct rxe_map {
        struct rxe_phys_buf     buf[RXE_BUF_PER_MAP];
 };
 
-struct rxe_mem {
+struct rxe_mr {
        struct rxe_pool_entry   pelem;
-       union {
-               struct ib_mr            ibmr;
-               struct ib_mw            ibmw;
-       };
+       struct ib_mr            ibmr;
 
        struct ib_umem          *umem;
 
-       enum rxe_mem_state      state;
-       enum rxe_mem_type       type;
+       enum rxe_mr_state       state;
+       enum rxe_mr_type        type;
        u64                     va;
        u64                     iova;
        size_t                  length;
@@ -318,6 +315,17 @@ struct rxe_mem {
        struct rxe_map          **map;
 };
 
+enum rxe_mw_state {
+       RXE_MW_STATE_INVALID = RXE_MR_STATE_INVALID,
+       RXE_MW_STATE_FREE = RXE_MR_STATE_FREE,
+       RXE_MW_STATE_VALID = RXE_MR_STATE_VALID,
+};
+
+struct rxe_mw {
+       struct ib_mw ibmw;
+       struct rxe_pool_entry pelem;
+};
+
 struct rxe_mc_grp {
        struct rxe_pool_entry   pelem;
        spinlock_t              mcg_lock; /* guard group */
@@ -422,27 +430,27 @@ static inline struct rxe_cq *to_rcq(struct ib_cq *cq)
        return cq ? container_of(cq, struct rxe_cq, ibcq) : NULL;
 }
 
-static inline struct rxe_mem *to_rmr(struct ib_mr *mr)
+static inline struct rxe_mr *to_rmr(struct ib_mr *mr)
 {
-       return mr ? container_of(mr, struct rxe_mem, ibmr) : NULL;
+       return mr ? container_of(mr, struct rxe_mr, ibmr) : NULL;
 }
 
-static inline struct rxe_mem *to_rmw(struct ib_mw *mw)
+static inline struct rxe_mw *to_rmw(struct ib_mw *mw)
 {
-       return mw ? container_of(mw, struct rxe_mem, ibmw) : NULL;
+       return mw ? container_of(mw, struct rxe_mw, ibmw) : NULL;
 }
 
-static inline struct rxe_pd *mr_pd(struct rxe_mem *mr)
+static inline struct rxe_pd *mr_pd(struct rxe_mr *mr)
 {
        return to_rpd(mr->ibmr.pd);
 }
 
-static inline u32 mr_lkey(struct rxe_mem *mr)
+static inline u32 mr_lkey(struct rxe_mr *mr)
 {
        return mr->ibmr.lkey;
 }
 
-static inline u32 mr_rkey(struct rxe_mem *mr)
+static inline u32 mr_rkey(struct rxe_mr *mr)
 {
        return mr->ibmr.rkey;
 }
index e8a04d9c89cbcfa67f61085e416b7d32e0850b1e..3f1dedb50a0da75d0823b8f30465e820323e0528 100644 (file)
@@ -114,13 +114,6 @@ static inline u8 __ddp_get_version(struct iwarp_ctrl *ctrl)
        return be16_to_cpu(ctrl->ddp_rdmap_ctrl & DDP_MASK_VERSION) >> 8;
 }
 
-static inline void __ddp_set_version(struct iwarp_ctrl *ctrl, u8 version)
-{
-       ctrl->ddp_rdmap_ctrl =
-               (ctrl->ddp_rdmap_ctrl & ~DDP_MASK_VERSION) |
-               (cpu_to_be16((u16)version << 8) & DDP_MASK_VERSION);
-}
-
 static inline u8 __rdmap_get_version(struct iwarp_ctrl *ctrl)
 {
        __be16 ver = ctrl->ddp_rdmap_ctrl & RDMAP_MASK_VERSION;
@@ -128,12 +121,6 @@ static inline u8 __rdmap_get_version(struct iwarp_ctrl *ctrl)
        return be16_to_cpu(ver) >> 6;
 }
 
-static inline void __rdmap_set_version(struct iwarp_ctrl *ctrl, u8 version)
-{
-       ctrl->ddp_rdmap_ctrl = (ctrl->ddp_rdmap_ctrl & ~RDMAP_MASK_VERSION) |
-                              (cpu_to_be16(version << 6) & RDMAP_MASK_VERSION);
-}
-
 static inline u8 __rdmap_get_opcode(struct iwarp_ctrl *ctrl)
 {
        return be16_to_cpu(ctrl->ddp_rdmap_ctrl & RDMAP_MASK_OPCODE);
index 1f9e15b715048c6afd525729e6e88705341b972d..7a5ed86ffc9f94f30369797d8cb3fe7ddf4b6972 100644 (file)
@@ -1300,7 +1300,7 @@ static void siw_cm_llp_state_change(struct sock *sk)
 }
 
 static int kernel_bindconnect(struct socket *s, struct sockaddr *laddr,
-                             struct sockaddr *raddr)
+                             struct sockaddr *raddr, bool afonly)
 {
        int rv, flags = 0;
        size_t size = laddr->sa_family == AF_INET ?
@@ -1311,6 +1311,12 @@ static int kernel_bindconnect(struct socket *s, struct sockaddr *laddr,
         */
        sock_set_reuseaddr(s->sk);
 
+       if (afonly) {
+               rv = ip6_sock_set_v6only(s->sk);
+               if (rv)
+                       return rv;
+       }
+
        rv = s->ops->bind(s, laddr, size);
        if (rv < 0)
                return rv;
@@ -1371,7 +1377,7 @@ int siw_connect(struct iw_cm_id *id, struct iw_cm_conn_param *params)
         * mode. Might be reconsidered for async connection setup at
         * TCP level.
         */
-       rv = kernel_bindconnect(s, laddr, raddr);
+       rv = kernel_bindconnect(s, laddr, raddr, id->afonly);
        if (rv != 0) {
                siw_dbg_qp(qp, "kernel_bindconnect: error %d\n", rv);
                goto error;
@@ -1786,6 +1792,15 @@ int siw_create_listen(struct iw_cm_id *id, int backlog)
        } else {
                struct sockaddr_in6 *laddr = &to_sockaddr_in6(id->local_addr);
 
+               if (id->afonly) {
+                       rv = ip6_sock_set_v6only(s->sk);
+                       if (rv) {
+                               siw_dbg(id->device,
+                                       "ip6_sock_set_v6only erro: %d\n", rv);
+                               goto error;
+                       }
+               }
+
                /* For wildcard addr, limit binding to current device only */
                if (ipv6_addr_any(&laddr->sin6_addr))
                        s->sk->sk_bound_dev_if = sdev->netdev->ifindex;
index 34a910cf0edbdc682f0d45725394e18ecce88488..61c17db70d658a00cb4d041528924dc46ee71d21 100644 (file)
@@ -106,8 +106,6 @@ int siw_mr_add_mem(struct siw_mr *mr, struct ib_pd *pd, void *mem_obj,
        mem->perms = rights & IWARP_ACCESS_MASK;
        kref_init(&mem->ref);
 
-       mr->mem = mem;
-
        get_random_bytes(&next, 4);
        next &= 0x00ffffff;
 
@@ -116,6 +114,8 @@ int siw_mr_add_mem(struct siw_mr *mr, struct ib_pd *pd, void *mem_obj,
                kfree(mem);
                return -ENOMEM;
        }
+
+       mr->mem = mem;
        /* Set the STag index part */
        mem->stag = id << 8;
        mr->base_mr.lkey = mr->base_mr.rkey = mem->stag;
index db138c8423da547bd35e8737dfa15b04cfaa7c62..f911287576d1dba3dc6d5e4c101b202c98b534a8 100644 (file)
@@ -29,11 +29,6 @@ static inline void siw_mem_put(struct siw_mem *mem)
        kref_put(&mem->ref, siw_free_mem);
 }
 
-static inline struct siw_mr *siw_mem2mr(struct siw_mem *m)
-{
-       return container_of(m, struct siw_mr, mem);
-}
-
 static inline void siw_unref_mem_sgl(struct siw_mem **mem, unsigned int num_sge)
 {
        while (num_sge) {
index e389d44e5591d2814ac99d038704615f13f6bd9e..d2313efb26db833e4307683a3a8ca910254de635 100644 (file)
@@ -160,7 +160,7 @@ int siw_query_device(struct ib_device *base_dev, struct ib_device_attr *attr,
        return 0;
 }
 
-int siw_query_port(struct ib_device *base_dev, u8 port,
+int siw_query_port(struct ib_device *base_dev, u32 port,
                   struct ib_port_attr *attr)
 {
        struct siw_device *sdev = to_siw_dev(base_dev);
@@ -194,7 +194,7 @@ int siw_query_port(struct ib_device *base_dev, u8 port,
        return rv;
 }
 
-int siw_get_port_immutable(struct ib_device *base_dev, u8 port,
+int siw_get_port_immutable(struct ib_device *base_dev, u32 port,
                           struct ib_port_immutable *port_immutable)
 {
        struct ib_port_attr attr;
@@ -209,7 +209,7 @@ int siw_get_port_immutable(struct ib_device *base_dev, u8 port,
        return 0;
 }
 
-int siw_query_gid(struct ib_device *base_dev, u8 port, int idx,
+int siw_query_gid(struct ib_device *base_dev, u32 port, int idx,
                  union ib_gid *gid)
 {
        struct siw_device *sdev = to_siw_dev(base_dev);
@@ -1848,7 +1848,7 @@ void siw_srq_event(struct siw_srq *srq, enum ib_event_type etype)
        }
 }
 
-void siw_port_event(struct siw_device *sdev, u8 port, enum ib_event_type etype)
+void siw_port_event(struct siw_device *sdev, u32 port, enum ib_event_type etype)
 {
        struct ib_event event;
 
index 63745452935753ae44bac96f1a5c80713bb49de2..67ac08886a709fe3e75fc887ad8dcb471a241369 100644 (file)
@@ -36,17 +36,17 @@ static inline void siw_copy_sgl(struct ib_sge *sge, struct siw_sge *siw_sge,
 
 int siw_alloc_ucontext(struct ib_ucontext *base_ctx, struct ib_udata *udata);
 void siw_dealloc_ucontext(struct ib_ucontext *base_ctx);
-int siw_query_port(struct ib_device *base_dev, u8 port,
+int siw_query_port(struct ib_device *base_dev, u32 port,
                   struct ib_port_attr *attr);
-int siw_get_port_immutable(struct ib_device *base_dev, u8 port,
+int siw_get_port_immutable(struct ib_device *base_dev, u32 port,
                           struct ib_port_immutable *port_immutable);
 int siw_query_device(struct ib_device *base_dev, struct ib_device_attr *attr,
                     struct ib_udata *udata);
 int siw_create_cq(struct ib_cq *base_cq, const struct ib_cq_init_attr *attr,
                  struct ib_udata *udata);
-int siw_query_port(struct ib_device *base_dev, u8 port,
+int siw_query_port(struct ib_device *base_dev, u32 port,
                   struct ib_port_attr *attr);
-int siw_query_gid(struct ib_device *base_dev, u8 port, int idx,
+int siw_query_gid(struct ib_device *base_dev, u32 port, int idx,
                  union ib_gid *gid);
 int siw_alloc_pd(struct ib_pd *base_pd, struct ib_udata *udata);
 int siw_dealloc_pd(struct ib_pd *base_pd, struct ib_udata *udata);
@@ -86,6 +86,6 @@ void siw_mmap_free(struct rdma_user_mmap_entry *rdma_entry);
 void siw_qp_event(struct siw_qp *qp, enum ib_event_type type);
 void siw_cq_event(struct siw_cq *cq, enum ib_event_type type);
 void siw_srq_event(struct siw_srq *srq, enum ib_event_type type);
-void siw_port_event(struct siw_device *dev, u8 port, enum ib_event_type type);
+void siw_port_event(struct siw_device *dev, u32 port, enum ib_event_type type);
 
 #endif
index 179ff1d068e51c46da460f8bd6025e881f42b690..75cd44789661b4c113e3bd2e411fa5953b2be4ce 100644 (file)
@@ -501,9 +501,9 @@ void ipoib_reap_ah(struct work_struct *work);
 struct ipoib_path *__path_find(struct net_device *dev, void *gid);
 void ipoib_mark_paths_invalid(struct net_device *dev);
 void ipoib_flush_paths(struct net_device *dev);
-struct net_device *ipoib_intf_alloc(struct ib_device *hca, u8 port,
+struct net_device *ipoib_intf_alloc(struct ib_device *hca, u32 port,
                                    const char *format);
-int ipoib_intf_init(struct ib_device *hca, u8 port, const char *format,
+int ipoib_intf_init(struct ib_device *hca, u32 port, const char *format,
                    struct net_device *dev);
 void ipoib_ib_tx_timer_func(struct timer_list *t);
 void ipoib_ib_dev_flush_light(struct work_struct *work);
@@ -677,8 +677,6 @@ void ipoib_cm_handle_rx_wc(struct net_device *dev, struct ib_wc *wc);
 void ipoib_cm_handle_tx_wc(struct net_device *dev, struct ib_wc *wc);
 #else
 
-struct ipoib_cm_tx;
-
 #define ipoib_max_conn_qp 0
 
 static inline int ipoib_cm_admin_enabled(struct net_device *dev)
index d5d592bdab3585cd7e99a7eb00a3e22063ea2d50..9dbc85a6b702cc2bf9d5a37377aaf975508f0203 100644 (file)
@@ -1122,12 +1122,8 @@ static int ipoib_cm_modify_tx_init(struct net_device *dev,
        struct ipoib_dev_priv *priv = ipoib_priv(dev);
        struct ib_qp_attr qp_attr;
        int qp_attr_mask, ret;
-       ret = ib_find_pkey(priv->ca, priv->port, priv->pkey, &qp_attr.pkey_index);
-       if (ret) {
-               ipoib_warn(priv, "pkey 0x%x not found: %d\n", priv->pkey, ret);
-               return ret;
-       }
 
+       qp_attr.pkey_index = priv->pkey_index;
        qp_attr.qp_state = IB_QPS_INIT;
        qp_attr.qp_access_flags = IB_ACCESS_LOCAL_WRITE;
        qp_attr.port_num = priv->port;
index 494f413dc3c6c4872b0d8ebb5d2e00ded95ee9ac..ceabfb0b0a83c9deae0fdfcc9c06f16416b0deb1 100644 (file)
@@ -1060,7 +1060,7 @@ static bool ipoib_dev_addr_changed_valid(struct ipoib_dev_priv *priv)
        union ib_gid *netdev_gid;
        int err;
        u16 index;
-       u8 port;
+       u32 port;
        bool ret = false;
 
        netdev_gid = (union ib_gid *)(priv->dev->dev_addr + 4);
index e16b40c09f820836d76607616b1dbffd62bcb1e7..bbb18087fdab073b2d19c601a4bab5caf40e03d9 100644 (file)
@@ -90,7 +90,7 @@ static int ipoib_add_one(struct ib_device *device);
 static void ipoib_remove_one(struct ib_device *device, void *client_data);
 static void ipoib_neigh_reclaim(struct rcu_head *rp);
 static struct net_device *ipoib_get_net_dev_by_params(
-               struct ib_device *dev, u8 port, u16 pkey,
+               struct ib_device *dev, u32 port, u16 pkey,
                const union ib_gid *gid, const struct sockaddr *addr,
                void *client_data);
 static int ipoib_set_mac(struct net_device *dev, void *addr);
@@ -164,8 +164,13 @@ int ipoib_open(struct net_device *dev)
                        dev_change_flags(cpriv->dev, flags | IFF_UP, NULL);
                }
                up_read(&priv->vlan_rwsem);
-       }
+       } else if (priv->parent) {
+               struct ipoib_dev_priv *ppriv = ipoib_priv(priv->parent);
 
+               if (!test_bit(IPOIB_FLAG_ADMIN_UP, &ppriv->flags))
+                       ipoib_dbg(priv, "parent device %s is not up, so child device may be not functioning.\n",
+                                 ppriv->dev->name);
+       }
        netif_start_queue(dev);
 
        return 0;
@@ -438,7 +443,7 @@ static int ipoib_match_gid_pkey_addr(struct ipoib_dev_priv *priv,
 /* Returns the number of matching net_devs found (between 0 and 2). Also
  * return the matching net_device in the @net_dev parameter, holding a
  * reference to the net_device, if the number of matches >= 1 */
-static int __ipoib_get_net_dev_by_params(struct list_head *dev_list, u8 port,
+static int __ipoib_get_net_dev_by_params(struct list_head *dev_list, u32 port,
                                         u16 pkey_index,
                                         const union ib_gid *gid,
                                         const struct sockaddr *addr,
@@ -463,7 +468,7 @@ static int __ipoib_get_net_dev_by_params(struct list_head *dev_list, u8 port,
 }
 
 static struct net_device *ipoib_get_net_dev_by_params(
-               struct ib_device *dev, u8 port, u16 pkey,
+               struct ib_device *dev, u32 port, u16 pkey,
                const union ib_gid *gid, const struct sockaddr *addr,
                void *client_data)
 {
@@ -1181,7 +1186,12 @@ unref:
 static void ipoib_timeout(struct net_device *dev, unsigned int txqueue)
 {
        struct ipoib_dev_priv *priv = ipoib_priv(dev);
+       struct rdma_netdev *rn = netdev_priv(dev);
 
+       if (rn->tx_timeout) {
+               rn->tx_timeout(dev, txqueue);
+               return;
+       }
        ipoib_warn(priv, "transmit timeout: latency %d msecs\n",
                   jiffies_to_msecs(jiffies - dev_trans_start(dev)));
        ipoib_warn(priv,
@@ -2145,7 +2155,7 @@ static void ipoib_build_priv(struct net_device *dev)
        INIT_DELAYED_WORK(&priv->neigh_reap_task, ipoib_reap_neigh);
 }
 
-static struct net_device *ipoib_alloc_netdev(struct ib_device *hca, u8 port,
+static struct net_device *ipoib_alloc_netdev(struct ib_device *hca, u32 port,
                                             const char *name)
 {
        struct net_device *dev;
@@ -2162,7 +2172,7 @@ static struct net_device *ipoib_alloc_netdev(struct ib_device *hca, u8 port,
        return dev;
 }
 
-int ipoib_intf_init(struct ib_device *hca, u8 port, const char *name,
+int ipoib_intf_init(struct ib_device *hca, u32 port, const char *name,
                    struct net_device *dev)
 {
        struct rdma_netdev *rn = netdev_priv(dev);
@@ -2213,7 +2223,7 @@ out:
        return rc;
 }
 
-struct net_device *ipoib_intf_alloc(struct ib_device *hca, u8 port,
+struct net_device *ipoib_intf_alloc(struct ib_device *hca, u32 port,
                                    const char *name)
 {
        struct net_device *dev;
@@ -2456,7 +2466,7 @@ static int ipoib_intercept_dev_id_attr(struct net_device *dev)
 }
 
 static struct net_device *ipoib_add_port(const char *format,
-                                        struct ib_device *hca, u8 port)
+                                        struct ib_device *hca, u32 port)
 {
        struct rtnl_link_ops *ops = ipoib_get_link_ops();
        struct rdma_netdev_alloc_params params;
index 78ee9445f8019356cdd40706156a0311e6cb2e61..9f6ac0a09a78245c270b73319523ff1d66e38993 100644 (file)
@@ -297,7 +297,6 @@ struct iser_login_desc {
 
 struct iser_conn;
 struct ib_conn;
-struct iscsi_iser_task;
 
 /**
  * struct iser_device - iSER device handle
index 7305ed8976c2452c4a36be35d69f46bdbf089a57..18266f07c58d9c94caf05ea27401b6d19d970e9a 100644 (file)
@@ -438,23 +438,23 @@ isert_connect_request(struct rdma_cm_id *cma_id, struct rdma_cm_event *event)
        isert_init_conn(isert_conn);
        isert_conn->cm_id = cma_id;
 
-       ret = isert_alloc_login_buf(isert_conn, cma_id->device);
-       if (ret)
-               goto out;
-
        device = isert_device_get(cma_id);
        if (IS_ERR(device)) {
                ret = PTR_ERR(device);
-               goto out_rsp_dma_map;
+               goto out;
        }
        isert_conn->device = device;
 
+       ret = isert_alloc_login_buf(isert_conn, cma_id->device);
+       if (ret)
+               goto out_conn_dev;
+
        isert_set_nego_params(isert_conn, &event->param.conn);
 
        isert_conn->qp = isert_create_qp(isert_conn, cma_id);
        if (IS_ERR(isert_conn->qp)) {
                ret = PTR_ERR(isert_conn->qp);
-               goto out_conn_dev;
+               goto out_rsp_dma_map;
        }
 
        ret = isert_login_post_recv(isert_conn);
@@ -473,10 +473,10 @@ isert_connect_request(struct rdma_cm_id *cma_id, struct rdma_cm_event *event)
 
 out_destroy_qp:
        isert_destroy_qp(isert_conn);
-out_conn_dev:
-       isert_device_put(device);
 out_rsp_dma_map:
        isert_free_login_buf(isert_conn);
+out_conn_dev:
+       isert_device_put(device);
 out:
        kfree(isert_conn);
        rdma_reject(cma_id, NULL, 0, IB_CM_REJ_CONSUMER_DEFINED);
index b6a0abf40589ee4ef32e83133a67ed461c449c53..7d53d18a50044caa00309afb6a302624fe67eb1a 100644 (file)
@@ -101,6 +101,9 @@ static ssize_t mpath_policy_show(struct device *dev,
        case MP_POLICY_MIN_INFLIGHT:
                return sysfs_emit(page, "min-inflight (MI: %d)\n",
                                  clt->mp_policy);
+       case MP_POLICY_MIN_LATENCY:
+               return sysfs_emit(page, "min-latency (ML: %d)\n",
+                                 clt->mp_policy);
        default:
                return sysfs_emit(page, "Unknown (%d)\n", clt->mp_policy);
        }
@@ -114,22 +117,32 @@ static ssize_t mpath_policy_store(struct device *dev,
        struct rtrs_clt *clt;
        int value;
        int ret;
+       size_t len = 0;
 
        clt = container_of(dev, struct rtrs_clt, dev);
 
        ret = kstrtoint(buf, 10, &value);
        if (!ret && (value == MP_POLICY_RR ||
-                    value == MP_POLICY_MIN_INFLIGHT)) {
+                    value == MP_POLICY_MIN_INFLIGHT ||
+                    value == MP_POLICY_MIN_LATENCY)) {
                clt->mp_policy = value;
                return count;
        }
 
+       /* distinguish "mi" and "min-latency" with length */
+       len = strnlen(buf, NAME_MAX);
+       if (buf[len - 1] == '\n')
+               len--;
+
        if (!strncasecmp(buf, "round-robin", 11) ||
-           !strncasecmp(buf, "rr", 2))
+           (len == 2 && !strncasecmp(buf, "rr", 2)))
                clt->mp_policy = MP_POLICY_RR;
        else if (!strncasecmp(buf, "min-inflight", 12) ||
-                !strncasecmp(buf, "mi", 2))
+                (len == 2 && !strncasecmp(buf, "mi", 2)))
                clt->mp_policy = MP_POLICY_MIN_INFLIGHT;
+       else if (!strncasecmp(buf, "min-latency", 11) ||
+                (len == 2 && !strncasecmp(buf, "ml", 2)))
+               clt->mp_policy = MP_POLICY_MIN_LATENCY;
        else
                return -EINVAL;
 
@@ -342,6 +355,21 @@ static ssize_t rtrs_clt_hca_name_show(struct kobject *kobj,
 static struct kobj_attribute rtrs_clt_hca_name_attr =
        __ATTR(hca_name, 0444, rtrs_clt_hca_name_show, NULL);
 
+static ssize_t rtrs_clt_cur_latency_show(struct kobject *kobj,
+                                   struct kobj_attribute *attr,
+                                   char *page)
+{
+       struct rtrs_clt_sess *sess;
+
+       sess = container_of(kobj, struct rtrs_clt_sess, kobj);
+
+       return sysfs_emit(page, "%lld ns\n",
+                         ktime_to_ns(sess->s.hb_cur_latency));
+}
+
+static struct kobj_attribute rtrs_clt_cur_latency_attr =
+       __ATTR(cur_latency, 0444, rtrs_clt_cur_latency_show, NULL);
+
 static ssize_t rtrs_clt_src_addr_show(struct kobject *kobj,
                                       struct kobj_attribute *attr,
                                       char *page)
@@ -385,6 +413,7 @@ static struct attribute *rtrs_clt_sess_attrs[] = {
        &rtrs_clt_reconnect_attr.attr,
        &rtrs_clt_disconnect_attr.attr,
        &rtrs_clt_remove_path_attr.attr,
+       &rtrs_clt_cur_latency_attr.attr,
        NULL,
 };
 
@@ -396,14 +425,13 @@ int rtrs_clt_create_sess_files(struct rtrs_clt_sess *sess)
 {
        struct rtrs_clt *clt = sess->clt;
        char str[NAME_MAX];
-       int err, cnt;
-
-       cnt = sockaddr_to_str((struct sockaddr *)&sess->s.src_addr,
-                             str, sizeof(str));
-       cnt += scnprintf(str + cnt, sizeof(str) - cnt, "@");
-       sockaddr_to_str((struct sockaddr *)&sess->s.dst_addr,
-                       str + cnt, sizeof(str) - cnt);
+       int err;
+       struct rtrs_addr path = {
+               .src = &sess->s.src_addr,
+               .dst = &sess->s.dst_addr,
+       };
 
+       rtrs_addr_to_str(&path, str, sizeof(str));
        err = kobject_init_and_add(&sess->kobj, &ktype_sess, clt->kobj_paths,
                                   "%s", str);
        if (err) {
index b74a872387c4fd0b88cfada47b8ff6619634a23d..40f4383764debef9c20789640bf815529b2d996a 100644 (file)
@@ -325,7 +325,7 @@ static void rtrs_rdma_error_recovery(struct rtrs_clt_con *con)
 
 static void rtrs_clt_fast_reg_done(struct ib_cq *cq, struct ib_wc *wc)
 {
-       struct rtrs_clt_con *con = cq->cq_context;
+       struct rtrs_clt_con *con = to_clt_con(wc->qp->qp_context);
 
        if (unlikely(wc->status != IB_WC_SUCCESS)) {
                rtrs_err(con->c.sess, "Failed IB_WR_REG_MR: %s\n",
@@ -345,7 +345,7 @@ static void rtrs_clt_inv_rkey_done(struct ib_cq *cq, struct ib_wc *wc)
 {
        struct rtrs_clt_io_req *req =
                container_of(wc->wr_cqe, typeof(*req), inv_cqe);
-       struct rtrs_clt_con *con = cq->cq_context;
+       struct rtrs_clt_con *con = to_clt_con(wc->qp->qp_context);
 
        if (unlikely(wc->status != IB_WC_SUCCESS)) {
                rtrs_err(con->c.sess, "Failed IB_WR_LOCAL_INV: %s\n",
@@ -437,6 +437,13 @@ static void complete_rdma_req(struct rtrs_clt_io_req *req, int errno,
        req->in_use = false;
        req->con = NULL;
 
+       if (errno) {
+               rtrs_err_rl(con->c.sess,
+                           "IO request failed: error=%d path=%s [%s:%u]\n",
+                           errno, kobject_name(&sess->kobj), sess->hca_name,
+                           sess->hca_port);
+       }
+
        if (notify)
                req->conf(req->priv, errno);
 }
@@ -586,7 +593,7 @@ static int rtrs_post_recv_empty_x2(struct rtrs_con *con, struct ib_cqe *cqe)
 
 static void rtrs_clt_rdma_done(struct ib_cq *cq, struct ib_wc *wc)
 {
-       struct rtrs_clt_con *con = cq->cq_context;
+       struct rtrs_clt_con *con = to_clt_con(wc->qp->qp_context);
        struct rtrs_clt_sess *sess = to_clt_sess(con->c.sess);
        u32 imm_type, imm_payload;
        bool w_inval = false;
@@ -628,6 +635,8 @@ static void rtrs_clt_rdma_done(struct ib_cq *cq, struct ib_wc *wc)
                } else if (imm_type == RTRS_HB_ACK_IMM) {
                        WARN_ON(con->c.cid);
                        sess->s.hb_missed_cnt = 0;
+                       sess->s.hb_cur_latency =
+                               ktime_sub(ktime_get(), sess->s.hb_last_sent);
                        if (sess->flags & RTRS_MSG_NEW_RKEY_F)
                                return  rtrs_clt_recv_done(con, wc);
                } else {
@@ -826,6 +835,57 @@ static struct rtrs_clt_sess *get_next_path_min_inflight(struct path_it *it)
        return min_path;
 }
 
+/**
+ * get_next_path_min_latency() - Returns path with minimal latency.
+ * @it:        the path pointer
+ *
+ * Return: a path with the lowest latency or NULL if all paths are tried
+ *
+ * Locks:
+ *    rcu_read_lock() must be hold.
+ *
+ * Related to @MP_POLICY_MIN_LATENCY
+ *
+ * This DOES skip an already-tried path.
+ * There is a skip-list to skip a path if the path has tried but failed.
+ * It will try the minimum latency path and then the second minimum latency
+ * path and so on. Finally it will return NULL if all paths are tried.
+ * Therefore the caller MUST check the returned
+ * path is NULL and trigger the IO error.
+ */
+static struct rtrs_clt_sess *get_next_path_min_latency(struct path_it *it)
+{
+       struct rtrs_clt_sess *min_path = NULL;
+       struct rtrs_clt *clt = it->clt;
+       struct rtrs_clt_sess *sess;
+       ktime_t min_latency = INT_MAX;
+       ktime_t latency;
+
+       list_for_each_entry_rcu(sess, &clt->paths_list, s.entry) {
+               if (unlikely(READ_ONCE(sess->state) != RTRS_CLT_CONNECTED))
+                       continue;
+
+               if (unlikely(!list_empty(raw_cpu_ptr(sess->mp_skip_entry))))
+                       continue;
+
+               latency = sess->s.hb_cur_latency;
+
+               if (latency < min_latency) {
+                       min_latency = latency;
+                       min_path = sess;
+               }
+       }
+
+       /*
+        * add the path to the skip list, so that next time we can get
+        * a different one
+        */
+       if (min_path)
+               list_add(raw_cpu_ptr(min_path->mp_skip_entry), &it->skip_list);
+
+       return min_path;
+}
+
 static inline void path_it_init(struct path_it *it, struct rtrs_clt *clt)
 {
        INIT_LIST_HEAD(&it->skip_list);
@@ -834,8 +894,10 @@ static inline void path_it_init(struct path_it *it, struct rtrs_clt *clt)
 
        if (clt->mp_policy == MP_POLICY_RR)
                it->next_path = get_next_path_rr;
-       else
+       else if (clt->mp_policy == MP_POLICY_MIN_INFLIGHT)
                it->next_path = get_next_path_min_inflight;
+       else
+               it->next_path = get_next_path_min_latency;
 }
 
 static inline void path_it_deinit(struct path_it *it)
@@ -1020,7 +1082,10 @@ static int rtrs_clt_write_req(struct rtrs_clt_io_req *req)
                                       req->usr_len + sizeof(*msg),
                                       imm);
        if (unlikely(ret)) {
-               rtrs_err(s, "Write request failed: %d\n", ret);
+               rtrs_err_rl(s,
+                           "Write request failed: error=%d path=%s [%s:%u]\n",
+                           ret, kobject_name(&sess->kobj), sess->hca_name,
+                           sess->hca_port);
                if (sess->clt->mp_policy == MP_POLICY_MIN_INFLIGHT)
                        atomic_dec(&sess->stats->inflight);
                if (req->sg_cnt)
@@ -1052,7 +1117,7 @@ static int rtrs_clt_read_req(struct rtrs_clt_io_req *req)
        struct rtrs_sess *s = con->c.sess;
        struct rtrs_clt_sess *sess = to_clt_sess(s);
        struct rtrs_msg_rdma_read *msg;
-       struct rtrs_ib_dev *dev;
+       struct rtrs_ib_dev *dev = sess->s.dev;
 
        struct ib_reg_wr rwr;
        struct ib_send_wr *wr = NULL;
@@ -1062,9 +1127,6 @@ static int rtrs_clt_read_req(struct rtrs_clt_io_req *req)
 
        const size_t tsize = sizeof(*msg) + req->data_len + req->usr_len;
 
-       s = &sess->s;
-       dev = sess->s.dev;
-
        if (unlikely(tsize > sess->chunk_size)) {
                rtrs_wrn(s,
                          "Read request failed, message size is %zu, bigger than CHUNK_SIZE %d\n",
@@ -1141,7 +1203,10 @@ static int rtrs_clt_read_req(struct rtrs_clt_io_req *req)
        ret = rtrs_post_send_rdma(req->con, req, &sess->rbufs[buf_id],
                                   req->data_len, imm, wr);
        if (unlikely(ret)) {
-               rtrs_err(s, "Read request failed: %d\n", ret);
+               rtrs_err_rl(s,
+                           "Read request failed: error=%d path=%s [%s:%u]\n",
+                           ret, kobject_name(&sess->kobj), sess->hca_name,
+                           sess->hca_port);
                if (sess->clt->mp_policy == MP_POLICY_MIN_INFLIGHT)
                        atomic_dec(&sess->stats->inflight);
                req->need_inv = false;
@@ -1863,12 +1928,14 @@ static int rtrs_clt_rdma_cm_handler(struct rdma_cm_id *cm_id,
        case RDMA_CM_EVENT_UNREACHABLE:
        case RDMA_CM_EVENT_ADDR_CHANGE:
        case RDMA_CM_EVENT_TIMEWAIT_EXIT:
-               rtrs_wrn(s, "CM error event %d\n", ev->event);
+               rtrs_wrn(s, "CM error (CM event: %s, err: %d)\n",
+                        rdma_event_msg(ev->event), ev->status);
                cm_err = -ECONNRESET;
                break;
        case RDMA_CM_EVENT_ADDR_ERROR:
        case RDMA_CM_EVENT_ROUTE_ERROR:
-               rtrs_wrn(s, "CM error event %d\n", ev->event);
+               rtrs_wrn(s, "CM error (CM event: %s, err: %d)\n",
+                        rdma_event_msg(ev->event), ev->status);
                cm_err = -EHOSTUNREACH;
                break;
        case RDMA_CM_EVENT_DEVICE_REMOVAL:
@@ -1878,7 +1945,8 @@ static int rtrs_clt_rdma_cm_handler(struct rdma_cm_id *cm_id,
                rtrs_clt_close_conns(sess, false);
                return 0;
        default:
-               rtrs_err(s, "Unexpected RDMA CM event (%d)\n", ev->event);
+               rtrs_err(s, "Unexpected RDMA CM error (CM event: %s, err: %d)\n",
+                        rdma_event_msg(ev->event), ev->status);
                cm_err = -ECONNRESET;
                break;
        }
@@ -2251,7 +2319,7 @@ destroy:
 
 static void rtrs_clt_info_req_done(struct ib_cq *cq, struct ib_wc *wc)
 {
-       struct rtrs_clt_con *con = cq->cq_context;
+       struct rtrs_clt_con *con = to_clt_con(wc->qp->qp_context);
        struct rtrs_clt_sess *sess = to_clt_sess(con->c.sess);
        struct rtrs_iu *iu;
 
@@ -2333,7 +2401,7 @@ static int process_info_rsp(struct rtrs_clt_sess *sess,
 
 static void rtrs_clt_info_rsp_done(struct ib_cq *cq, struct ib_wc *wc)
 {
-       struct rtrs_clt_con *con = cq->cq_context;
+       struct rtrs_clt_con *con = to_clt_con(wc->qp->qp_context);
        struct rtrs_clt_sess *sess = to_clt_sess(con->c.sess);
        struct rtrs_msg_info_rsp *msg;
        enum rtrs_clt_state state;
@@ -2464,16 +2532,28 @@ out:
 static int init_sess(struct rtrs_clt_sess *sess)
 {
        int err;
+       char str[NAME_MAX];
+       struct rtrs_addr path = {
+               .src = &sess->s.src_addr,
+               .dst = &sess->s.dst_addr,
+       };
+
+       rtrs_addr_to_str(&path, str, sizeof(str));
 
        mutex_lock(&sess->init_mutex);
        err = init_conns(sess);
        if (err) {
-               rtrs_err(sess->clt, "init_conns(), err: %d\n", err);
+               rtrs_err(sess->clt,
+                        "init_conns() failed: err=%d path=%s [%s:%u]\n", err,
+                        str, sess->hca_name, sess->hca_port);
                goto out;
        }
        err = rtrs_send_sess_info(sess);
        if (err) {
-               rtrs_err(sess->clt, "rtrs_send_sess_info(), err: %d\n", err);
+               rtrs_err(
+                       sess->clt,
+                       "rtrs_send_sess_info() failed: err=%d path=%s [%s:%u]\n",
+                       err, str, sess->hca_name, sess->hca_port);
                goto out;
        }
        rtrs_clt_sess_up(sess);
@@ -2791,8 +2871,8 @@ int rtrs_clt_remove_path_from_sysfs(struct rtrs_clt_sess *sess,
        } while (!changed && old_state != RTRS_CLT_DEAD);
 
        if (likely(changed)) {
-               rtrs_clt_destroy_sess_files(sess, sysfs_self);
                rtrs_clt_remove_path_from_arr(sess);
+               rtrs_clt_destroy_sess_files(sess, sysfs_self);
                kobject_put(&sess->kobj);
        }
 
@@ -2933,9 +3013,9 @@ int rtrs_clt_query(struct rtrs_clt *clt, struct rtrs_attrs *attr)
                return -ECOMM;
 
        attr->queue_depth      = clt->queue_depth;
-       attr->max_io_size      = clt->max_io_size;
-       attr->sess_kobj        = &clt->dev.kobj;
-       strlcpy(attr->sessname, clt->sessname, sizeof(attr->sessname));
+       /* Cap max_io_size to min of remote buffer size and the fr pages */
+       attr->max_io_size = min_t(int, clt->max_io_size,
+                                 clt->max_segments * SZ_4K);
 
        return 0;
 }
index 98ba5d0a48b86c2fb6eab8ee62647e8d211aebfc..4c52f30e4da1fbadbd32b268fd0f0ea1df00270b 100644 (file)
@@ -29,6 +29,7 @@ enum rtrs_clt_state {
 enum rtrs_mp_policy {
        MP_POLICY_RR,
        MP_POLICY_MIN_INFLIGHT,
+       MP_POLICY_MIN_LATENCY,
 };
 
 /* see Documentation/ABI/testing/sysfs-class-rtrs-client for details */
index 00eb4505333926e984b4419408bf49fdbca3eae6..86e65cf30cab0640d416cac5d6280542df71097a 100644 (file)
@@ -91,6 +91,7 @@ struct rtrs_con {
        struct ib_cq            *cq;
        struct rdma_cm_id       *cm_id;
        unsigned int            cid;
+       u16                     cq_size;
 };
 
 struct rtrs_sess {
@@ -112,6 +113,8 @@ struct rtrs_sess {
        unsigned int            hb_interval_ms;
        unsigned int            hb_missed_cnt;
        unsigned int            hb_missed_max;
+       ktime_t                 hb_last_sent;
+       ktime_t                 hb_cur_latency;
 };
 
 /* rtrs information unit */
index 126a96e75c6217cb7f2032c132a4ae38bcb06e94..a9288175fbb54a17db2fb5db01aefdcd40341fa3 100644 (file)
@@ -176,7 +176,8 @@ static int rtrs_srv_create_once_sysfs_root_folders(struct rtrs_srv_sess *sess)
        err = device_add(&srv->dev);
        if (err) {
                pr_err("device_add(): %d\n", err);
-               goto put;
+               put_device(&srv->dev);
+               goto unlock;
        }
        srv->kobj_paths = kobject_create_and_add("paths", &srv->dev.kobj);
        if (!srv->kobj_paths) {
@@ -188,10 +189,6 @@ static int rtrs_srv_create_once_sysfs_root_folders(struct rtrs_srv_sess *sess)
        }
        dev_set_uevent_suppress(&srv->dev, false);
        kobject_uevent(&srv->dev.kobj, KOBJ_ADD);
-       goto unlock;
-
-put:
-       put_device(&srv->dev);
 unlock:
        mutex_unlock(&srv->paths_mutex);
 
@@ -262,14 +259,13 @@ int rtrs_srv_create_sess_files(struct rtrs_srv_sess *sess)
        struct rtrs_srv *srv = sess->srv;
        struct rtrs_sess *s = &sess->s;
        char str[NAME_MAX];
-       int err, cnt;
-
-       cnt = sockaddr_to_str((struct sockaddr *)&sess->s.dst_addr,
-                             str, sizeof(str));
-       cnt += scnprintf(str + cnt, sizeof(str) - cnt, "@");
-       sockaddr_to_str((struct sockaddr *)&sess->s.src_addr,
-                       str + cnt, sizeof(str) - cnt);
+       int err;
+       struct rtrs_addr path = {
+               .src = &sess->s.dst_addr,
+               .dst = &sess->s.src_addr,
+       };
 
+       rtrs_addr_to_str(&path, str, sizeof(str));
        err = rtrs_srv_create_once_sysfs_root_folders(sess);
        if (err)
                return err;
index f7aa2a7e744224b4004b81b5538681272b7281e9..0fa116cabc4453acf7430ab08b26facf5d91aa0c 100644 (file)
@@ -199,7 +199,7 @@ static void rtrs_srv_wait_ops_ids(struct rtrs_srv_sess *sess)
 
 static void rtrs_srv_reg_mr_done(struct ib_cq *cq, struct ib_wc *wc)
 {
-       struct rtrs_srv_con *con = cq->cq_context;
+       struct rtrs_srv_con *con = to_srv_con(wc->qp->qp_context);
        struct rtrs_sess *s = con->c.sess;
        struct rtrs_srv_sess *sess = to_srv_sess(s);
 
@@ -518,8 +518,9 @@ bool rtrs_srv_resp_rdma(struct rtrs_srv_op *id, int status)
 
        if (unlikely(sess->state != RTRS_SRV_CONNECTED)) {
                rtrs_err_rl(s,
-                            "Sending I/O response failed,  session is disconnected, sess state %s\n",
-                            rtrs_srv_state_str(sess->state));
+                           "Sending I/O response failed,  session %s is disconnected, sess state %s\n",
+                           kobject_name(&sess->kobj),
+                           rtrs_srv_state_str(sess->state));
                goto out;
        }
        if (always_invalidate) {
@@ -529,7 +530,9 @@ bool rtrs_srv_resp_rdma(struct rtrs_srv_op *id, int status)
        }
        if (unlikely(atomic_sub_return(1,
                                       &con->sq_wr_avail) < 0)) {
-               pr_err("IB send queue full\n");
+               rtrs_err(s, "IB send queue full: sess=%s cid=%d\n",
+                        kobject_name(&sess->kobj),
+                        con->c.cid);
                atomic_add(1, &con->sq_wr_avail);
                spin_lock(&con->rsp_wr_wait_lock);
                list_add_tail(&id->wait_list, &con->rsp_wr_wait_list);
@@ -543,7 +546,8 @@ bool rtrs_srv_resp_rdma(struct rtrs_srv_op *id, int status)
                err = rdma_write_sg(id);
 
        if (unlikely(err)) {
-               rtrs_err_rl(s, "IO response failed: %d\n", err);
+               rtrs_err_rl(s, "IO response failed: %d: sess=%s\n", err,
+                           kobject_name(&sess->kobj));
                close_sess(sess);
        }
 out:
@@ -720,7 +724,7 @@ static void rtrs_srv_stop_hb(struct rtrs_srv_sess *sess)
 
 static void rtrs_srv_info_rsp_done(struct ib_cq *cq, struct ib_wc *wc)
 {
-       struct rtrs_srv_con *con = cq->cq_context;
+       struct rtrs_srv_con *con = to_srv_con(wc->qp->qp_context);
        struct rtrs_sess *s = con->c.sess;
        struct rtrs_srv_sess *sess = to_srv_sess(s);
        struct rtrs_iu *iu;
@@ -862,7 +866,7 @@ rwr_free:
 
 static void rtrs_srv_info_req_done(struct ib_cq *cq, struct ib_wc *wc)
 {
-       struct rtrs_srv_con *con = cq->cq_context;
+       struct rtrs_srv_con *con = to_srv_con(wc->qp->qp_context);
        struct rtrs_sess *s = con->c.sess;
        struct rtrs_srv_sess *sess = to_srv_sess(s);
        struct rtrs_msg_info_req *msg;
@@ -1110,7 +1114,7 @@ static void rtrs_srv_inv_rkey_done(struct ib_cq *cq, struct ib_wc *wc)
 {
        struct rtrs_srv_mr *mr =
                container_of(wc->wr_cqe, typeof(*mr), inv_cqe);
-       struct rtrs_srv_con *con = cq->cq_context;
+       struct rtrs_srv_con *con = to_srv_con(wc->qp->qp_context);
        struct rtrs_sess *s = con->c.sess;
        struct rtrs_srv_sess *sess = to_srv_sess(s);
        struct rtrs_srv *srv = sess->srv;
@@ -1167,7 +1171,7 @@ static void rtrs_rdma_process_wr_wait_list(struct rtrs_srv_con *con)
 
 static void rtrs_srv_rdma_done(struct ib_cq *cq, struct ib_wc *wc)
 {
-       struct rtrs_srv_con *con = cq->cq_context;
+       struct rtrs_srv_con *con = to_srv_con(wc->qp->qp_context);
        struct rtrs_sess *s = con->c.sess;
        struct rtrs_srv_sess *sess = to_srv_sess(s);
        struct rtrs_srv *srv = sess->srv;
@@ -1683,6 +1687,8 @@ static struct rtrs_srv_sess *__alloc_sess(struct rtrs_srv *srv,
 {
        struct rtrs_srv_sess *sess;
        int err = -ENOMEM;
+       char str[NAME_MAX];
+       struct rtrs_addr path;
 
        if (srv->paths_num >= MAX_PATHS_NUM) {
                err = -ECONNRESET;
@@ -1717,6 +1723,13 @@ static struct rtrs_srv_sess *__alloc_sess(struct rtrs_srv *srv,
        sess->cur_cq_vector = -1;
        sess->s.dst_addr = cm_id->route.addr.dst_addr;
        sess->s.src_addr = cm_id->route.addr.src_addr;
+
+       /* temporary until receiving session-name from client */
+       path.src = &sess->s.src_addr;
+       path.dst = &sess->s.dst_addr;
+       rtrs_addr_to_str(&path, str, sizeof(str));
+       strlcpy(sess->s.sessname, str, sizeof(sess->s.sessname));
+
        sess->s.con_num = con_num;
        sess->s.recon_cnt = recon_cnt;
        uuid_copy(&sess->s.uuid, uuid);
@@ -1908,13 +1921,10 @@ static int rtrs_srv_rdma_cm_handler(struct rdma_cm_id *cm_id,
        case RDMA_CM_EVENT_UNREACHABLE:
                rtrs_err(s, "CM error (CM event: %s, err: %d)\n",
                          rdma_event_msg(ev->event), ev->status);
-               close_sess(sess);
-               break;
+               fallthrough;
        case RDMA_CM_EVENT_DISCONNECTED:
        case RDMA_CM_EVENT_ADDR_CHANGE:
        case RDMA_CM_EVENT_TIMEWAIT_EXIT:
-               close_sess(sess);
-               break;
        case RDMA_CM_EVENT_DEVICE_REMOVAL:
                close_sess(sess);
                break;
index d13aff0aa816551d5a1613ddb283647e026ca9e2..a7847282a2ebfeb2387363349e4d5b564629a072 100644 (file)
@@ -218,14 +218,14 @@ static int create_cq(struct rtrs_con *con, int cq_vector, u16 cq_size,
        struct rdma_cm_id *cm_id = con->cm_id;
        struct ib_cq *cq;
 
-       cq = ib_alloc_cq(cm_id->device, con, cq_size,
-                        cq_vector, poll_ctx);
+       cq = ib_cq_pool_get(cm_id->device, cq_size, cq_vector, poll_ctx);
        if (IS_ERR(cq)) {
                rtrs_err(con->sess, "Creating completion queue failed, errno: %ld\n",
                          PTR_ERR(cq));
                return PTR_ERR(cq);
        }
        con->cq = cq;
+       con->cq_size = cq_size;
 
        return 0;
 }
@@ -273,7 +273,7 @@ int rtrs_cq_qp_create(struct rtrs_sess *sess, struct rtrs_con *con,
        err = create_qp(con, sess->dev->ib_pd, max_send_wr, max_recv_wr,
                        max_send_sge);
        if (err) {
-               ib_free_cq(con->cq);
+               ib_cq_pool_put(con->cq, con->cq_size);
                con->cq = NULL;
                return err;
        }
@@ -290,7 +290,7 @@ void rtrs_cq_qp_destroy(struct rtrs_con *con)
                con->qp = NULL;
        }
        if (con->cq) {
-               ib_free_cq(con->cq);
+               ib_cq_pool_put(con->cq, con->cq_size);
                con->cq = NULL;
        }
 }
@@ -337,6 +337,9 @@ static void hb_work(struct work_struct *work)
                schedule_hb(sess);
                return;
        }
+
+       sess->hb_last_sent = ktime_get();
+
        imm = rtrs_to_imm(RTRS_HB_MSG_IMM, 0);
        err = rtrs_post_rdma_write_imm_empty(usr_con, sess->hb_cqe, imm,
                                             0, NULL);
@@ -463,6 +466,30 @@ int sockaddr_to_str(const struct sockaddr *addr, char *buf, size_t len)
 }
 EXPORT_SYMBOL(sockaddr_to_str);
 
+/**
+ * rtrs_addr_to_str() - convert rtrs_addr to a string "src@dst"
+ * @addr:      the rtrs_addr structure to be converted
+ * @buf:       string containing source and destination addr of a path
+ *             separated by '@' I.e. "ip:1.1.1.1@ip:1.1.1.2"
+ *             "ip:1.1.1.1@ip:1.1.1.2".
+ * @len:       string length
+ *
+ * The return value is the number of characters written into buf not
+ * including the trailing '\0'.
+ */
+int rtrs_addr_to_str(const struct rtrs_addr *addr, char *buf, size_t len)
+{
+       int cnt;
+
+       cnt = sockaddr_to_str((struct sockaddr *)addr->src,
+                             buf, len);
+       cnt += scnprintf(buf + cnt, len - cnt, "@");
+       sockaddr_to_str((struct sockaddr *)addr->dst,
+                       buf + cnt, len - cnt);
+       return cnt;
+}
+EXPORT_SYMBOL(rtrs_addr_to_str);
+
 /**
  * rtrs_addr_to_sockaddr() - convert path string "src,dst" or "src@dst"
  * to sockaddreses
index bebaa94c4728498418be51aec2b7f5a50b0a457d..dc3e1af1a85ba63b9b7d861b647a366a349141f0 100644 (file)
@@ -110,8 +110,6 @@ int rtrs_clt_rdma_cq_direct(struct rtrs_clt *clt, unsigned int index);
 struct rtrs_attrs {
        u32             queue_depth;
        u32             max_io_size;
-       u8              sessname[NAME_MAX];
-       struct kobject  *sess_kobj;
 };
 
 int rtrs_clt_query(struct rtrs_clt *sess, struct rtrs_attrs *attr);
@@ -185,4 +183,5 @@ int rtrs_addr_to_sockaddr(const char *str, size_t len, u16 port,
                          struct rtrs_addr *addr);
 
 int sockaddr_to_str(const struct sockaddr *addr, char *buf, size_t len);
+int rtrs_addr_to_str(const struct rtrs_addr *addr, char *buf, size_t len);
 #endif
index 51c386a215f5e47a508fefaa7dc8cbd3560a5597..ea447805d4eae1d97926ba03770e374730f6d5e9 100644 (file)
@@ -2382,6 +2382,7 @@ static int srpt_cm_req_recv(struct srpt_device *const sdev,
                pr_info("rejected SRP_LOGIN_REQ because target %s_%d is not enabled\n",
                        dev_name(&sdev->device->dev), port_num);
                mutex_unlock(&sport->mutex);
+               ret = -EINVAL;
                goto reject;
        }
 
@@ -3109,7 +3110,8 @@ static int srpt_add_one(struct ib_device *device)
 {
        struct srpt_device *sdev;
        struct srpt_port *sport;
-       int i, ret;
+       int ret;
+       u32 i;
 
        pr_debug("device = %p\n", device);
 
index 39ac9e2f51184aa0556c9668d33df0f1b6c78f42..e5d52288d0a481fb0de7f88d4a6aa47d994603ce 100644 (file)
@@ -12985,8 +12985,6 @@ static int bnxt_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
        if (!BNXT_CHIP_P4_PLUS(bp))
                bp->flags |= BNXT_FLAG_DOUBLE_DB;
 
-       bp->ulp_probe = bnxt_ulp_probe;
-
        rc = bnxt_init_mac_addr(bp);
        if (rc) {
                dev_err(&pdev->dev, "Unable to initialize mac address.\n");
index 24d2ad6a87407b48967d31cb1c77996045ba5b67..98e0cef4532cbacb90ef2e464b5c552d373e5aef 100644 (file)
@@ -1751,7 +1751,6 @@ struct bnxt {
        (BNXT_CHIP_P4(bp) || BNXT_CHIP_P5(bp))
 
        struct bnxt_en_dev      *edev;
-       struct bnxt_en_dev *    (*ulp_probe)(struct net_device *);
 
        struct bnxt_napi        **bnapi;
 
index 64dbbb04b04346719b46e5e4214ce095d7c9947d..a918e374f3c5c4f3714638332c45c0e24c4f3adc 100644 (file)
@@ -491,3 +491,4 @@ struct bnxt_en_dev *bnxt_ulp_probe(struct net_device *dev)
        }
        return bp->edev;
 }
+EXPORT_SYMBOL(bnxt_ulp_probe);
index 612a7f69366da7cc42e00fe745fea4de5c97b0b8..7d7ed025db0da7c72369346a7c422b6e5c9c6b38 100644 (file)
@@ -716,7 +716,7 @@ static const struct mlx5e_profile *mlx5_get_profile(struct mlx5_core_dev *mdev)
        return &mlx5i_nic_profile;
 }
 
-static int mlx5_rdma_setup_rn(struct ib_device *ibdev, u8 port_num,
+static int mlx5_rdma_setup_rn(struct ib_device *ibdev, u32 port_num,
                              struct net_device *netdev, void *param)
 {
        struct mlx5_core_dev *mdev = (struct mlx5_core_dev *)param;
index 3f9869c7e326c0cb35c42ad31a0a4c3c173a6bde..96ffc0a0e670d75b65f3dd46a80aa774cd2beac0 100644 (file)
@@ -137,10 +137,10 @@ int mlx5_core_roce_gid_set(struct mlx5_core_dev *dev, unsigned int index,
                }
 
                ether_addr_copy(addr_mac, mac);
-               MLX5_SET_RA(in_addr, roce_version, roce_version);
-               MLX5_SET_RA(in_addr, roce_l3_type, roce_l3_type);
                memcpy(addr_l3_addr, gid, gidsz);
        }
+       MLX5_SET_RA(in_addr, roce_version, roce_version);
+       MLX5_SET_RA(in_addr, roce_l3_type, roce_l3_type);
 
        if (MLX5_CAP_GEN(dev, num_vhca_ports) > 0)
                MLX5_SET(set_roce_address_in, in, vhca_port_num, port_num);
index 4e531c2aab5277c333c7d90799e15e407f4ac5b4..f8e8d7e9061608cd915c60ce293db7bd40e86ca8 100644 (file)
@@ -1236,7 +1236,7 @@ enum {
        MLX5_TRIGGERED_CMD_COMP = (u64)1 << 32,
 };
 
-static inline bool mlx5_is_roce_enabled(struct mlx5_core_dev *dev)
+static inline bool mlx5_is_roce_init_enabled(struct mlx5_core_dev *dev)
 {
        struct devlink *devlink = priv_to_devlink(dev);
        union devlink_param_value val;
index 52b7cabcde08ff64c1ea30a88812f978c4162b44..6d16eed6850e50687d61e1a8ec2adc83e6825c58 100644 (file)
@@ -133,6 +133,7 @@ enum {
        MLX5_CMD_OP_PAGE_FAULT_RESUME             = 0x204,
        MLX5_CMD_OP_ALLOC_MEMIC                   = 0x205,
        MLX5_CMD_OP_DEALLOC_MEMIC                 = 0x206,
+       MLX5_CMD_OP_MODIFY_MEMIC                  = 0x207,
        MLX5_CMD_OP_CREATE_EQ                     = 0x301,
        MLX5_CMD_OP_DESTROY_EQ                    = 0x302,
        MLX5_CMD_OP_QUERY_EQ                      = 0x303,
@@ -1031,7 +1032,11 @@ struct mlx5_ifc_device_mem_cap_bits {
 
        u8         header_modify_sw_icm_start_address[0x40];
 
-       u8         reserved_at_180[0x680];
+       u8         reserved_at_180[0x80];
+
+       u8         memic_operations[0x20];
+
+       u8         reserved_at_220[0x5e0];
 };
 
 struct mlx5_ifc_device_event_cap_bits {
@@ -10498,6 +10503,41 @@ struct mlx5_ifc_destroy_vport_lag_in_bits {
        u8         reserved_at_40[0x40];
 };
 
+enum {
+       MLX5_MODIFY_MEMIC_OP_MOD_ALLOC,
+       MLX5_MODIFY_MEMIC_OP_MOD_DEALLOC,
+};
+
+struct mlx5_ifc_modify_memic_in_bits {
+       u8         opcode[0x10];
+       u8         uid[0x10];
+
+       u8         reserved_at_20[0x10];
+       u8         op_mod[0x10];
+
+       u8         reserved_at_40[0x20];
+
+       u8         reserved_at_60[0x18];
+       u8         memic_operation_type[0x8];
+
+       u8         memic_start_addr[0x40];
+
+       u8         reserved_at_c0[0x140];
+};
+
+struct mlx5_ifc_modify_memic_out_bits {
+       u8         status[0x8];
+       u8         reserved_at_8[0x18];
+
+       u8         syndrome[0x20];
+
+       u8         reserved_at_40[0x40];
+
+       u8         memic_operation_addr[0x40];
+
+       u8         reserved_at_c0[0x140];
+};
+
 struct mlx5_ifc_alloc_memic_in_bits {
        u8         opcode[0x10];
        u8         reserved_at_10[0x10];
index bae29f50adffcd09197c449f5d5e0b8d5773bcbb..226ae3702d8a8e8ebd05e5cab9ceece3209a82b8 100644 (file)
@@ -10,7 +10,7 @@
 
 #include <rdma/ib_verbs.h>
 
-int rdma_query_gid(struct ib_device *device, u8 port_num, int index,
+int rdma_query_gid(struct ib_device *device, u32 port_num, int index,
                   union ib_gid *gid);
 void *rdma_read_gid_hw_context(const struct ib_gid_attr *attr);
 const struct ib_gid_attr *rdma_find_gid(struct ib_device *device,
@@ -20,10 +20,10 @@ const struct ib_gid_attr *rdma_find_gid(struct ib_device *device,
 const struct ib_gid_attr *rdma_find_gid_by_port(struct ib_device *ib_dev,
                                                const union ib_gid *gid,
                                                enum ib_gid_type gid_type,
-                                               u8 port,
+                                               u32 port,
                                                struct net_device *ndev);
 const struct ib_gid_attr *rdma_find_gid_by_filter(
-       struct ib_device *device, const union ib_gid *gid, u8 port_num,
+       struct ib_device *device, const union ib_gid *gid, u32 port_num,
        bool (*filter)(const union ib_gid *gid, const struct ib_gid_attr *,
                       void *),
        void *context);
@@ -43,7 +43,7 @@ struct net_device *rdma_read_gid_attr_ndev_rcu(const struct ib_gid_attr *attr);
  * the local software cache.
  */
 int ib_get_cached_pkey(struct ib_device    *device_handle,
-                      u                  port_num,
+                      u32                  port_num,
                       int                  index,
                       u16                 *pkey);
 
@@ -59,7 +59,7 @@ int ib_get_cached_pkey(struct ib_device    *device_handle,
  * the local software cache.
  */
 int ib_find_cached_pkey(struct ib_device    *device,
-                       u                  port_num,
+                       u32                  port_num,
                        u16                  pkey,
                        u16                 *index);
 
@@ -75,7 +75,7 @@ int ib_find_cached_pkey(struct ib_device    *device,
  * the local software cache.
  */
 int ib_find_exact_cached_pkey(struct ib_device    *device,
-                             u                  port_num,
+                             u32                  port_num,
                              u16                  pkey,
                              u16                 *index);
 
@@ -89,7 +89,7 @@ int ib_find_exact_cached_pkey(struct ib_device    *device,
  * the local software cache.
  */
 int ib_get_cached_lmc(struct ib_device *device,
-                     u               port_num,
+                     u32               port_num,
                      u8                *lmc);
 
 /**
@@ -102,12 +102,12 @@ int ib_get_cached_lmc(struct ib_device *device,
  * the local software cache.
  */
 int ib_get_cached_port_state(struct ib_device *device,
-                             u8                port_num,
+                            u32               port_num,
                              enum ib_port_state *port_active);
 
 bool rdma_is_zero_gid(const union ib_gid *gid);
 const struct ib_gid_attr *rdma_get_gid_attr(struct ib_device *device,
-                                           u8 port_num, int index);
+                                           u32 port_num, int index);
 void rdma_put_gid_attr(const struct ib_gid_attr *attr);
 void rdma_hold_gid_attr(const struct ib_gid_attr *attr);
 ssize_t rdma_query_gid_table(struct ib_device *device,
index 8dfb1ddf345a127b92c0dafe98fcc47adabebcb0..f1d34f06a68b8f4d502b930dd65bd159ac4634fa 100644 (file)
@@ -668,7 +668,7 @@ struct ib_mad_reg_req {
  * @registration_flags: Registration flags to set for this agent
  */
 struct ib_mad_agent *ib_register_mad_agent(struct ib_device *device,
-                                          u8 port_num,
+                                          u32 port_num,
                                           enum ib_qp_type qp_type,
                                           struct ib_mad_reg_req *mad_reg_req,
                                           u8 rmpp_version,
index 4c52c2fd22a175290b8d08313656a4eaadfba657..ba3c808a3789eaf9a43bac517c0459712689ba66 100644 (file)
@@ -423,7 +423,7 @@ struct ib_sa_query;
 void ib_sa_cancel_query(int id, struct ib_sa_query *query);
 
 int ib_sa_path_rec_get(struct ib_sa_client *client, struct ib_device *device,
-                      u8 port_num, struct sa_path_rec *rec,
+                      u32 port_num, struct sa_path_rec *rec,
                       ib_sa_comp_mask comp_mask, unsigned long timeout_ms,
                       gfp_t gfp_mask,
                       void (*callback)(int status, struct sa_path_rec *resp,
@@ -431,7 +431,7 @@ int ib_sa_path_rec_get(struct ib_sa_client *client, struct ib_device *device,
                       void *context, struct ib_sa_query **query);
 
 int ib_sa_service_rec_query(struct ib_sa_client *client,
-                           struct ib_device *device, u8 port_num, u8 method,
+                           struct ib_device *device, u32 port_num, u8 method,
                            struct ib_sa_service_rec *rec,
                            ib_sa_comp_mask comp_mask, unsigned long timeout_ms,
                            gfp_t gfp_mask,
@@ -477,7 +477,8 @@ struct ib_sa_multicast {
  *   group, and the user must rejoin the group to continue using it.
  */
 struct ib_sa_multicast *ib_sa_join_multicast(struct ib_sa_client *client,
-                                            struct ib_device *device, u8 port_num,
+                                            struct ib_device *device,
+                                            u32 port_num,
                                             struct ib_sa_mcmember_rec *rec,
                                             ib_sa_comp_mask comp_mask, gfp_t gfp_mask,
                                             int (*callback)(int status,
@@ -506,20 +507,20 @@ void ib_sa_free_multicast(struct ib_sa_multicast *multicast);
  * @mgid: MGID of multicast group.
  * @rec: Location to copy SA multicast member record.
  */
-int ib_sa_get_mcmember_rec(struct ib_device *device, u8 port_num,
+int ib_sa_get_mcmember_rec(struct ib_device *device, u32 port_num,
                           union ib_gid *mgid, struct ib_sa_mcmember_rec *rec);
 
 /**
  * ib_init_ah_from_mcmember - Initialize address handle attributes based on
  * an SA multicast member record.
  */
-int ib_init_ah_from_mcmember(struct ib_device *device, u8 port_num,
+int ib_init_ah_from_mcmember(struct ib_device *device, u32 port_num,
                             struct ib_sa_mcmember_rec *rec,
                             struct net_device *ndev,
                             enum ib_gid_type gid_type,
                             struct rdma_ah_attr *ah_attr);
 
-int ib_init_ah_attr_from_path(struct ib_device *device, u8 port_num,
+int ib_init_ah_attr_from_path(struct ib_device *device, u32 port_num,
                              struct sa_path_rec *rec,
                              struct rdma_ah_attr *ah_attr,
                              const struct ib_gid_attr *sgid_attr);
@@ -538,7 +539,7 @@ void ib_sa_unpack_path(void *attribute, struct sa_path_rec *rec);
 
 /* Support GuidInfoRecord */
 int ib_sa_guid_info_rec_query(struct ib_sa_client *client,
-                             struct ib_device *device, u8 port_num,
+                             struct ib_device *device, u32 port_num,
                              struct ib_sa_guidinfo_rec *rec,
                              ib_sa_comp_mask comp_mask, u8 method,
                              unsigned long timeout_ms, gfp_t gfp_mask,
index ca28fca5736b192b86ab80d1163349416c58e6fd..7e2f3699b8987bc97afbc4528392dc9eb87c8808 100644 (file)
@@ -152,7 +152,7 @@ struct ib_gid_attr {
        union ib_gid            gid;
        enum ib_gid_type        gid_type;
        u16                     index;
-       u                     port_num;
+       u32                     port_num;
 };
 
 enum {
@@ -736,7 +736,7 @@ struct ib_event {
                struct ib_qp    *qp;
                struct ib_srq   *srq;
                struct ib_wq    *wq;
-               u             port_num;
+               u32             port_num;
        } element;
        enum ib_event_type      event;
 };
@@ -919,7 +919,7 @@ struct rdma_ah_attr {
        struct ib_global_route  grh;
        u8                      sl;
        u8                      static_rate;
-       u                     port_num;
+       u32                     port_num;
        u8                      ah_flags;
        enum rdma_ah_attr_type type;
        union {
@@ -1006,7 +1006,7 @@ struct ib_wc {
        u16                     pkey_index;
        u8                      sl;
        u8                      dlid_path_bits;
-       u8                      port_num;       /* valid only for DR SMPs on switches */
+       u32 port_num; /* valid only for DR SMPs on switches */
        u8                      smac[ETH_ALEN];
        u16                     vlan_id;
        u8                      network_hdr_type;
@@ -1161,7 +1161,7 @@ struct ib_qp_init_attr {
        /*
         * Only needed for special QP types, or when using the RW API.
         */
-       u                     port_num;
+       u32                     port_num;
        struct ib_rwq_ind_table *rwq_ind_tbl;
        u32                     source_qpn;
 };
@@ -1280,11 +1280,11 @@ struct ib_qp_attr {
        u8                      max_rd_atomic;
        u8                      max_dest_rd_atomic;
        u8                      min_rnr_timer;
-       u                     port_num;
+       u32                     port_num;
        u8                      timeout;
        u8                      retry_cnt;
        u8                      rnr_retry;
-       u                     alt_port_num;
+       u32                     alt_port_num;
        u8                      alt_timeout;
        u32                     rate_limit;
        struct net_device       *xmit_slave;
@@ -1401,7 +1401,7 @@ struct ib_ud_wr {
        u32                     remote_qpn;
        u32                     remote_qkey;
        u16                     pkey_index; /* valid for GSI only */
-       u8                      port_num;   /* valid for DR SMPs on switch only */
+       u32                     port_num; /* valid for DR SMPs on switch only */
 };
 
 static inline const struct ib_ud_wr *ud_wr(const struct ib_send_wr *wr)
@@ -1610,6 +1610,11 @@ struct ib_srq {
                        } xrc;
                };
        } ext;
+
+       /*
+        * Implementation details of the RDMA core, don't use in drivers:
+        */
+       struct rdma_restrack_entry res;
 };
 
 enum ib_raw_packet_caps {
@@ -1708,7 +1713,7 @@ struct ib_qp_security;
 struct ib_port_pkey {
        enum port_pkey_state    state;
        u16                     pkey_index;
-       u                     port_num;
+       u32                     port_num;
        struct list_head        qp_list;
        struct list_head        to_error_list;
        struct ib_qp_security  *sec;
@@ -1769,7 +1774,7 @@ struct ib_qp {
        enum ib_qp_type         qp_type;
        struct ib_rwq_ind_table *rwq_ind_tbl;
        struct ib_qp_security  *qp_sec;
-       u                     port;
+       u32                     port;
 
        bool                    integrity_en;
        /*
@@ -2065,7 +2070,7 @@ struct ib_flow_attr {
        u16          priority;
        u32          flags;
        u8           num_of_specs;
-       u          port;
+       u32          port;
        union ib_flow_spec flows[];
 };
 
@@ -2194,7 +2199,7 @@ enum rdma_netdev_t {
 struct rdma_netdev {
        void              *clnt_priv;
        struct ib_device  *hca;
-       u                port_num;
+       u32                port_num;
        int                mtu;
 
        /*
@@ -2215,6 +2220,8 @@ struct rdma_netdev {
                            int set_qkey, u32 qkey);
        int (*detach_mcast)(struct net_device *dev, struct ib_device *hca,
                            union ib_gid *gid, u16 mlid);
+       /* timeout */
+       void (*tx_timeout)(struct net_device *dev, unsigned int txqueue);
 };
 
 struct rdma_netdev_alloc_params {
@@ -2223,7 +2230,7 @@ struct rdma_netdev_alloc_params {
        unsigned int rxqs;
        void *param;
 
-       int (*initialize_rdma_netdev)(struct ib_device *device, u8 port_num,
+       int (*initialize_rdma_netdev)(struct ib_device *device, u32 port_num,
                                      struct net_device *netdev, void *param);
 };
 
@@ -2301,12 +2308,11 @@ struct ib_device_ops {
        int (*poll_cq)(struct ib_cq *cq, int num_entries, struct ib_wc *wc);
        int (*peek_cq)(struct ib_cq *cq, int wc_cnt);
        int (*req_notify_cq)(struct ib_cq *cq, enum ib_cq_notify_flags flags);
-       int (*req_ncomp_notif)(struct ib_cq *cq, int wc_cnt);
        int (*post_srq_recv)(struct ib_srq *srq,
                             const struct ib_recv_wr *recv_wr,
                             const struct ib_recv_wr **bad_recv_wr);
        int (*process_mad)(struct ib_device *device, int process_mad_flags,
-                          u8 port_num, const struct ib_wc *in_wc,
+                          u32 port_num, const struct ib_wc *in_wc,
                           const struct ib_grh *in_grh,
                           const struct ib_mad *in_mad, struct ib_mad *out_mad,
                           size_t *out_mad_size, u16 *out_mad_pkey_index);
@@ -2318,9 +2324,9 @@ struct ib_device_ops {
        void (*get_dev_fw_str)(struct ib_device *device, char *str);
        const struct cpumask *(*get_vector_affinity)(struct ib_device *ibdev,
                                                     int comp_vector);
-       int (*query_port)(struct ib_device *device, u8 port_num,
+       int (*query_port)(struct ib_device *device, u32 port_num,
                          struct ib_port_attr *port_attr);
-       int (*modify_port)(struct ib_device *device, u8 port_num,
+       int (*modify_port)(struct ib_device *device, u32 port_num,
                           int port_modify_mask,
                           struct ib_port_modify *port_modify);
        /**
@@ -2329,10 +2335,10 @@ struct ib_device_ops {
         * structure to avoid cache line misses when accessing struct ib_device
         * in fast paths.
         */
-       int (*get_port_immutable)(struct ib_device *device, u8 port_num,
+       int (*get_port_immutable)(struct ib_device *device, u32 port_num,
                                  struct ib_port_immutable *immutable);
        enum rdma_link_layer (*get_link_layer)(struct ib_device *device,
-                                              u8 port_num);
+                                              u32 port_num);
        /**
         * When calling get_netdev, the HW vendor's driver should return the
         * net device of device @device at port @port_num or NULL if such
@@ -2341,7 +2347,8 @@ struct ib_device_ops {
         * that this function returns NULL before the net device has finished
         * NETDEV_UNREGISTER state.
         */
-       struct net_device *(*get_netdev)(struct ib_device *device, u8 port_num);
+       struct net_device *(*get_netdev)(struct ib_device *device,
+                                        u32 port_num);
        /**
         * rdma netdev operation
         *
@@ -2349,11 +2356,11 @@ struct ib_device_ops {
         * must return -EOPNOTSUPP if it doesn't support the specified type.
         */
        struct net_device *(*alloc_rdma_netdev)(
-               struct ib_device *device, u8 port_num, enum rdma_netdev_t type,
+               struct ib_device *device, u32 port_num, enum rdma_netdev_t type,
                const char *name, unsigned char name_assign_type,
                void (*setup)(struct net_device *));
 
-       int (*rdma_netdev_get_params)(struct ib_device *device, u8 port_num,
+       int (*rdma_netdev_get_params)(struct ib_device *device, u32 port_num,
                                      enum rdma_netdev_t type,
                                      struct rdma_netdev_alloc_params *params);
        /**
@@ -2361,7 +2368,7 @@ struct ib_device_ops {
         * link layer is either IB or iWarp. It is no-op if @port_num port
         * is RoCE link layer.
         */
-       int (*query_gid)(struct ib_device *device, u8 port_num, int index,
+       int (*query_gid)(struct ib_device *device, u32 port_num, int index,
                         union ib_gid *gid);
        /**
         * When calling add_gid, the HW vendor's driver should add the gid
@@ -2386,7 +2393,7 @@ struct ib_device_ops {
         * This function is only called when roce_gid_table is used.
         */
        int (*del_gid)(const struct ib_gid_attr *attr, void **context);
-       int (*query_pkey)(struct ib_device *device, u8 port_num, u16 index,
+       int (*query_pkey)(struct ib_device *device, u32 port_num, u16 index,
                          u16 *pkey);
        int (*alloc_ucontext)(struct ib_ucontext *context,
                              struct ib_udata *udata);
@@ -2475,16 +2482,16 @@ struct ib_device_ops {
                struct ib_flow_action *action,
                const struct ib_flow_action_attrs_esp *attr,
                struct uverbs_attr_bundle *attrs);
-       int (*set_vf_link_state)(struct ib_device *device, int vf, u8 port,
+       int (*set_vf_link_state)(struct ib_device *device, int vf, u32 port,
                                 int state);
-       int (*get_vf_config)(struct ib_device *device, int vf, u8 port,
+       int (*get_vf_config)(struct ib_device *device, int vf, u32 port,
                             struct ifla_vf_info *ivf);
-       int (*get_vf_stats)(struct ib_device *device, int vf, u8 port,
+       int (*get_vf_stats)(struct ib_device *device, int vf, u32 port,
                            struct ifla_vf_stats *stats);
-       int (*get_vf_guid)(struct ib_device *device, int vf, u8 port,
+       int (*get_vf_guid)(struct ib_device *device, int vf, u32 port,
                            struct ifla_vf_guid *node_guid,
                            struct ifla_vf_guid *port_guid);
-       int (*set_vf_guid)(struct ib_device *device, int vf, u8 port, u64 guid,
+       int (*set_vf_guid)(struct ib_device *device, int vf, u32 port, u64 guid,
                           int type);
        struct ib_wq *(*create_wq)(struct ib_pd *pd,
                                   struct ib_wq_init_attr *init_attr,
@@ -2522,7 +2529,7 @@ struct ib_device_ops {
         *   struct tells the core to set a default lifespan.
         */
        struct rdma_hw_stats *(*alloc_hw_stats)(struct ib_device *device,
-                                               u8 port_num);
+                                               u32 port_num);
        /**
         * get_hw_stats - Fill in the counter value(s) in the stats struct.
         * @index - The index in the value array we wish to have updated, or
@@ -2536,12 +2543,12 @@ struct ib_device_ops {
         *   one given in index at their option
         */
        int (*get_hw_stats)(struct ib_device *device,
-                           struct rdma_hw_stats *stats, u8 port, int index);
+                           struct rdma_hw_stats *stats, u32 port, int index);
        /*
         * This function is called once for each port when a ib device is
         * registered.
         */
-       int (*init_port)(struct ib_device *device, u8 port_num,
+       int (*init_port)(struct ib_device *device, u32 port_num,
                         struct kobject *port_sysfs);
        /**
         * Allows rdma drivers to add their own restrack attributes.
@@ -2685,7 +2692,7 @@ struct ib_device {
        /* CQ adaptive moderation (RDMA DIM) */
        u16                          use_cq_dim:1;
        u8                           node_type;
-       u                          phys_port_cnt;
+       u32                          phys_port_cnt;
        struct ib_device_attr        attrs;
        struct attribute_group       *hw_stats_ag;
        struct rdma_hw_stats         *hw_stats;
@@ -2751,7 +2758,7 @@ struct ib_client {
         * netdev. */
        struct net_device *(*get_net_dev_by_params)(
                        struct ib_device *dev,
-                       u8 port,
+                       u32 port,
                        u16 pkey,
                        const union ib_gid *gid,
                        const struct sockaddr *addr,
@@ -2932,10 +2939,10 @@ void ib_unregister_event_handler(struct ib_event_handler *event_handler);
 void ib_dispatch_event(const struct ib_event *event);
 
 int ib_query_port(struct ib_device *device,
-                 u8 port_num, struct ib_port_attr *port_attr);
+                 u32 port_num, struct ib_port_attr *port_attr);
 
 enum rdma_link_layer rdma_port_get_link_layer(struct ib_device *device,
-                                              u8 port_num);
+                                              u32 port_num);
 
 /**
  * rdma_cap_ib_switch - Check if the device is IB switch
@@ -2959,7 +2966,7 @@ static inline bool rdma_cap_ib_switch(const struct ib_device *device)
  *
  * Return start port number
  */
-static inline u8 rdma_start_port(const struct ib_device *device)
+static inline u32 rdma_start_port(const struct ib_device *device)
 {
        return rdma_cap_ib_switch(device) ? 0 : 1;
 }
@@ -2970,9 +2977,10 @@ static inline u8 rdma_start_port(const struct ib_device *device)
  * @iter - The unsigned int to store the port number
  */
 #define rdma_for_each_port(device, iter)                                       \
-       for (iter = rdma_start_port(device + BUILD_BUG_ON_ZERO(!__same_type(   \
-                                                    unsigned int, iter)));    \
-            iter <= rdma_end_port(device); (iter)++)
+       for (iter = rdma_start_port(device +                                   \
+                                   BUILD_BUG_ON_ZERO(!__same_type(u32,        \
+                                                                  iter)));    \
+            iter <= rdma_end_port(device); iter++)
 
 /**
  * rdma_end_port - Return the last valid port number for the device
@@ -2982,7 +2990,7 @@ static inline u8 rdma_start_port(const struct ib_device *device)
  *
  * Return last port number
  */
-static inline u8 rdma_end_port(const struct ib_device *device)
+static inline u32 rdma_end_port(const struct ib_device *device)
 {
        return rdma_cap_ib_switch(device) ? 0 : device->phys_port_cnt;
 }
@@ -2995,55 +3003,63 @@ static inline int rdma_is_port_valid(const struct ib_device *device,
 }
 
 static inline bool rdma_is_grh_required(const struct ib_device *device,
-                                       u8 port_num)
+                                       u32 port_num)
 {
        return device->port_data[port_num].immutable.core_cap_flags &
               RDMA_CORE_PORT_IB_GRH_REQUIRED;
 }
 
-static inline bool rdma_protocol_ib(const struct ib_device *device, u8 port_num)
+static inline bool rdma_protocol_ib(const struct ib_device *device,
+                                   u32 port_num)
 {
        return device->port_data[port_num].immutable.core_cap_flags &
               RDMA_CORE_CAP_PROT_IB;
 }
 
-static inline bool rdma_protocol_roce(const struct ib_device *device, u8 port_num)
+static inline bool rdma_protocol_roce(const struct ib_device *device,
+                                     u32 port_num)
 {
        return device->port_data[port_num].immutable.core_cap_flags &
               (RDMA_CORE_CAP_PROT_ROCE | RDMA_CORE_CAP_PROT_ROCE_UDP_ENCAP);
 }
 
-static inline bool rdma_protocol_roce_udp_encap(const struct ib_device *device, u8 port_num)
+static inline bool rdma_protocol_roce_udp_encap(const struct ib_device *device,
+                                               u32 port_num)
 {
        return device->port_data[port_num].immutable.core_cap_flags &
               RDMA_CORE_CAP_PROT_ROCE_UDP_ENCAP;
 }
 
-static inline bool rdma_protocol_roce_eth_encap(const struct ib_device *device, u8 port_num)
+static inline bool rdma_protocol_roce_eth_encap(const struct ib_device *device,
+                                               u32 port_num)
 {
        return device->port_data[port_num].immutable.core_cap_flags &
               RDMA_CORE_CAP_PROT_ROCE;
 }
 
-static inline bool rdma_protocol_iwarp(const struct ib_device *device, u8 port_num)
+static inline bool rdma_protocol_iwarp(const struct ib_device *device,
+                                      u32 port_num)
 {
        return device->port_data[port_num].immutable.core_cap_flags &
               RDMA_CORE_CAP_PROT_IWARP;
 }
 
-static inline bool rdma_ib_or_roce(const struct ib_device *device, u8 port_num)
+static inline bool rdma_ib_or_roce(const struct ib_device *device,
+                                  u32 port_num)
 {
        return rdma_protocol_ib(device, port_num) ||
                rdma_protocol_roce(device, port_num);
 }
 
-static inline bool rdma_protocol_raw_packet(const struct ib_device *device, u8 port_num)
+static inline bool rdma_protocol_raw_packet(const struct ib_device *device,
+                                           u32 port_num)
 {
        return device->port_data[port_num].immutable.core_cap_flags &
               RDMA_CORE_CAP_PROT_RAW_PACKET;
 }
 
-static inline bool rdma_protocol_usnic(const struct ib_device *device, u8 port_num)
+static inline bool rdma_protocol_usnic(const struct ib_device *device,
+                                      u32 port_num)
 {
        return device->port_data[port_num].immutable.core_cap_flags &
               RDMA_CORE_CAP_PROT_USNIC;
@@ -3061,7 +3077,7 @@ static inline bool rdma_protocol_usnic(const struct ib_device *device, u8 port_n
  *
  * Return: true if the port supports sending/receiving of MAD packets.
  */
-static inline bool rdma_cap_ib_mad(const struct ib_device *device, u8 port_num)
+static inline bool rdma_cap_ib_mad(const struct ib_device *device, u32 port_num)
 {
        return device->port_data[port_num].immutable.core_cap_flags &
               RDMA_CORE_CAP_IB_MAD;
@@ -3086,7 +3102,7 @@ static inline bool rdma_cap_ib_mad(const struct ib_device *device, u8 port_num)
  *
  * Return: true if the port supports OPA MAD packet formats.
  */
-static inline bool rdma_cap_opa_mad(struct ib_device *device, u8 port_num)
+static inline bool rdma_cap_opa_mad(struct ib_device *device, u32 port_num)
 {
        return device->port_data[port_num].immutable.core_cap_flags &
                RDMA_CORE_CAP_OPA_MAD;
@@ -3112,7 +3128,7 @@ static inline bool rdma_cap_opa_mad(struct ib_device *device, u8 port_num)
  *
  * Return: true if the port provides an SMI.
  */
-static inline bool rdma_cap_ib_smi(const struct ib_device *device, u8 port_num)
+static inline bool rdma_cap_ib_smi(const struct ib_device *device, u32 port_num)
 {
        return device->port_data[port_num].immutable.core_cap_flags &
               RDMA_CORE_CAP_IB_SMI;
@@ -3133,7 +3149,7 @@ static inline bool rdma_cap_ib_smi(const struct ib_device *device, u8 port_num)
  * Return: true if the port supports an IB CM (this does not guarantee that
  * a CM is actually running however).
  */
-static inline bool rdma_cap_ib_cm(const struct ib_device *device, u8 port_num)
+static inline bool rdma_cap_ib_cm(const struct ib_device *device, u32 port_num)
 {
        return device->port_data[port_num].immutable.core_cap_flags &
               RDMA_CORE_CAP_IB_CM;
@@ -3151,7 +3167,7 @@ static inline bool rdma_cap_ib_cm(const struct ib_device *device, u8 port_num)
  * Return: true if the port supports an iWARP CM (this does not guarantee that
  * a CM is actually running however).
  */
-static inline bool rdma_cap_iw_cm(const struct ib_device *device, u8 port_num)
+static inline bool rdma_cap_iw_cm(const struct ib_device *device, u32 port_num)
 {
        return device->port_data[port_num].immutable.core_cap_flags &
               RDMA_CORE_CAP_IW_CM;
@@ -3172,7 +3188,7 @@ static inline bool rdma_cap_iw_cm(const struct ib_device *device, u8 port_num)
  * Administration interface.  This does not imply that the SA service is
  * running locally.
  */
-static inline bool rdma_cap_ib_sa(const struct ib_device *device, u8 port_num)
+static inline bool rdma_cap_ib_sa(const struct ib_device *device, u32 port_num)
 {
        return device->port_data[port_num].immutable.core_cap_flags &
               RDMA_CORE_CAP_IB_SA;
@@ -3195,7 +3211,8 @@ static inline bool rdma_cap_ib_sa(const struct ib_device *device, u8 port_num)
  * overhead of registering/unregistering with the SM and tracking of the
  * total number of queue pairs attached to the multicast group.
  */
-static inline bool rdma_cap_ib_mcast(const struct ib_device *device, u8 port_num)
+static inline bool rdma_cap_ib_mcast(const struct ib_device *device,
+                                    u32 port_num)
 {
        return rdma_cap_ib_sa(device, port_num);
 }
@@ -3213,7 +3230,7 @@ static inline bool rdma_cap_ib_mcast(const struct ib_device *device, u8 port_num
  * Return: true if the port uses a GID address to identify devices on the
  * network.
  */
-static inline bool rdma_cap_af_ib(const struct ib_device *device, u8 port_num)
+static inline bool rdma_cap_af_ib(const struct ib_device *device, u32 port_num)
 {
        return device->port_data[port_num].immutable.core_cap_flags &
               RDMA_CORE_CAP_AF_IB;
@@ -3235,7 +3252,7 @@ static inline bool rdma_cap_af_ib(const struct ib_device *device, u8 port_num)
  * addition of a Global Route Header built from our Ethernet Address
  * Handle into our header list for connectionless packets.
  */
-static inline bool rdma_cap_eth_ah(const struct ib_device *device, u8 port_num)
+static inline bool rdma_cap_eth_ah(const struct ib_device *device, u32 port_num)
 {
        return device->port_data[port_num].immutable.core_cap_flags &
               RDMA_CORE_CAP_ETH_AH;
@@ -3250,7 +3267,7 @@ static inline bool rdma_cap_eth_ah(const struct ib_device *device, u8 port_num)
  * Return: true if we are running on an OPA device which supports
  * the extended OPA addressing.
  */
-static inline bool rdma_cap_opa_ah(struct ib_device *device, u8 port_num)
+static inline bool rdma_cap_opa_ah(struct ib_device *device, u32 port_num)
 {
        return (device->port_data[port_num].immutable.core_cap_flags &
                RDMA_CORE_CAP_OPA_AH) == RDMA_CORE_CAP_OPA_AH;
@@ -3268,7 +3285,8 @@ static inline bool rdma_cap_opa_ah(struct ib_device *device, u8 port_num)
  * Return the max MAD size required by the Port.  Will return 0 if the port
  * does not support MADs
  */
-static inline size_t rdma_max_mad_size(const struct ib_device *device, u8 port_num)
+static inline size_t rdma_max_mad_size(const struct ib_device *device,
+                                      u32 port_num)
 {
        return device->port_data[port_num].immutable.max_mad_size;
 }
@@ -3287,7 +3305,7 @@ static inline size_t rdma_max_mad_size(const struct ib_device *device, u8 port_n
  * its GIDs.
  */
 static inline bool rdma_cap_roce_gid_table(const struct ib_device *device,
-                                          u8 port_num)
+                                          u32 port_num)
 {
        return rdma_protocol_roce(device, port_num) &&
                device->ops.add_gid && device->ops.del_gid;
@@ -3328,7 +3346,7 @@ static inline bool rdma_core_cap_opa_port(struct ib_device *device,
  * Return the MTU size supported by the port as an integer value. Will return
  * -1 if enum value of mtu is not supported.
  */
-static inline int rdma_mtu_enum_to_int(struct ib_device *device, u8 port,
+static inline int rdma_mtu_enum_to_int(struct ib_device *device, u32 port,
                                       int mtu)
 {
        if (rdma_core_cap_opa_port(device, port))
@@ -3345,7 +3363,7 @@ static inline int rdma_mtu_enum_to_int(struct ib_device *device, u8 port,
  *
  * Return the MTU size supported by the port as an integer value.
  */
-static inline int rdma_mtu_from_attr(struct ib_device *device, u8 port,
+static inline int rdma_mtu_from_attr(struct ib_device *device, u32 port,
                                     struct ib_port_attr *attr)
 {
        if (rdma_core_cap_opa_port(device, port))
@@ -3354,34 +3372,34 @@ static inline int rdma_mtu_from_attr(struct ib_device *device, u8 port,
                return ib_mtu_enum_to_int(attr->max_mtu);
 }
 
-int ib_set_vf_link_state(struct ib_device *device, int vf, u8 port,
+int ib_set_vf_link_state(struct ib_device *device, int vf, u32 port,
                         int state);
-int ib_get_vf_config(struct ib_device *device, int vf, u8 port,
+int ib_get_vf_config(struct ib_device *device, int vf, u32 port,
                     struct ifla_vf_info *info);
-int ib_get_vf_stats(struct ib_device *device, int vf, u8 port,
+int ib_get_vf_stats(struct ib_device *device, int vf, u32 port,
                    struct ifla_vf_stats *stats);
-int ib_get_vf_guid(struct ib_device *device, int vf, u8 port,
+int ib_get_vf_guid(struct ib_device *device, int vf, u32 port,
                    struct ifla_vf_guid *node_guid,
                    struct ifla_vf_guid *port_guid);
-int ib_set_vf_guid(struct ib_device *device, int vf, u8 port, u64 guid,
+int ib_set_vf_guid(struct ib_device *device, int vf, u32 port, u64 guid,
                   int type);
 
 int ib_query_pkey(struct ib_device *device,
-                 u8 port_num, u16 index, u16 *pkey);
+                 u32 port_num, u16 index, u16 *pkey);
 
 int ib_modify_device(struct ib_device *device,
                     int device_modify_mask,
                     struct ib_device_modify *device_modify);
 
 int ib_modify_port(struct ib_device *device,
-                  u8 port_num, int port_modify_mask,
+                  u32 port_num, int port_modify_mask,
                   struct ib_port_modify *port_modify);
 
 int ib_find_gid(struct ib_device *device, union ib_gid *gid,
-               u8 *port_num, u16 *index);
+               u32 *port_num, u16 *index);
 
 int ib_find_pkey(struct ib_device *device,
-                u8 port_num, u16 pkey, u16 *index);
+                u32 port_num, u16 pkey, u16 *index);
 
 enum ib_pd_flags {
        /*
@@ -3496,7 +3514,7 @@ int ib_get_rdma_header_version(const union rdma_network_hdr *hdr);
  * attributes which are initialized using ib_init_ah_attr_from_wc().
  *
  */
-int ib_init_ah_attr_from_wc(struct ib_device *device, u8 port_num,
+int ib_init_ah_attr_from_wc(struct ib_device *device, u32 port_num,
                            const struct ib_wc *wc, const struct ib_grh *grh,
                            struct rdma_ah_attr *ah_attr);
 
@@ -3513,7 +3531,7 @@ int ib_init_ah_attr_from_wc(struct ib_device *device, u8 port_num,
  * in all UD QP post sends.
  */
 struct ib_ah *ib_create_ah_from_wc(struct ib_pd *pd, const struct ib_wc *wc,
-                                  const struct ib_grh *grh, u8 port_num);
+                                  const struct ib_grh *grh, u32 port_num);
 
 /**
  * rdma_modify_ah - Modifies the address vector associated with an address
@@ -3915,20 +3933,6 @@ struct ib_cq *ib_cq_pool_get(struct ib_device *dev, unsigned int nr_cqe,
 
 void ib_cq_pool_put(struct ib_cq *cq, unsigned int nr_cqe);
 
-/**
- * ib_req_ncomp_notif - Request completion notification when there are
- *   at least the specified number of unreaped completions on the CQ.
- * @cq: The CQ to generate an event for.
- * @wc_cnt: The number of unreaped completions that should be on the
- *   CQ before an event is generated.
- */
-static inline int ib_req_ncomp_notif(struct ib_cq *cq, int wc_cnt)
-{
-       return cq->device->ops.req_ncomp_notif ?
-               cq->device->ops.req_ncomp_notif(cq, wc_cnt) :
-               -ENOSYS;
-}
-
 /*
  * Drivers that don't need a DMA mapping at the RDMA layer, set dma_device to
  * NULL. This causes the ib_dma* helpers to just stash the kernel virtual
@@ -4272,12 +4276,12 @@ struct ib_device *ib_device_get_by_netdev(struct net_device *ndev,
                                          enum rdma_driver_id driver_id);
 struct ib_device *ib_device_get_by_name(const char *name,
                                        enum rdma_driver_id driver_id);
-struct net_device *ib_get_net_dev_by_params(struct ib_device *dev, u8 port,
+struct net_device *ib_get_net_dev_by_params(struct ib_device *dev, u32 port,
                                            u16 pkey, const union ib_gid *gid,
                                            const struct sockaddr *addr);
 int ib_device_set_netdev(struct ib_device *ib_dev, struct net_device *ndev,
                         unsigned int port);
-struct net_device *ib_device_netdev(struct ib_device *dev, u8 port);
+struct net_device *ib_device_netdev(struct ib_device *dev, u32 port);
 
 struct ib_wq *ib_create_wq(struct ib_pd *pd,
                           struct ib_wq_init_attr *init_attr);
@@ -4311,7 +4315,8 @@ void ib_drain_rq(struct ib_qp *qp);
 void ib_drain_sq(struct ib_qp *qp);
 void ib_drain_qp(struct ib_qp *qp);
 
-int ib_get_eth_speed(struct ib_device *dev, u8 port_num, u16 *speed, u8 *width);
+int ib_get_eth_speed(struct ib_device *dev, u32 port_num, u16 *speed,
+                    u8 *width);
 
 static inline u8 *rdma_ah_retrieve_dmac(struct rdma_ah_attr *attr)
 {
@@ -4379,12 +4384,12 @@ static inline bool rdma_ah_get_make_grd(const struct rdma_ah_attr *attr)
        return false;
 }
 
-static inline void rdma_ah_set_port_num(struct rdma_ah_attr *attr, u8 port_num)
+static inline void rdma_ah_set_port_num(struct rdma_ah_attr *attr, u32 port_num)
 {
        attr->port_num = port_num;
 }
 
-static inline u8 rdma_ah_get_port_num(const struct rdma_ah_attr *attr)
+static inline u32 rdma_ah_get_port_num(const struct rdma_ah_attr *attr)
 {
        return attr->port_num;
 }
@@ -4482,7 +4487,7 @@ void rdma_move_ah_attr(struct rdma_ah_attr *dest, struct rdma_ah_attr *src);
  * @port_num: Port number
  */
 static inline enum rdma_ah_attr_type rdma_ah_find_type(struct ib_device *dev,
-                                                      u8 port_num)
+                                                      u32 port_num)
 {
        if (rdma_protocol_roce(dev, port_num))
                return RDMA_AH_ATTR_TYPE_ROCE;
@@ -4554,12 +4559,12 @@ struct ib_ucontext *ib_uverbs_get_ucontext_file(struct ib_uverbs_file *ufile);
 
 int uverbs_destroy_def_handler(struct uverbs_attr_bundle *attrs);
 
-struct net_device *rdma_alloc_netdev(struct ib_device *device, u8 port_num,
+struct net_device *rdma_alloc_netdev(struct ib_device *device, u32 port_num,
                                     enum rdma_netdev_t type, const char *name,
                                     unsigned char name_assign_type,
                                     void (*setup)(struct net_device *));
 
-int rdma_init_netdev(struct ib_device *device, u8 port_num,
+int rdma_init_netdev(struct ib_device *device, u32 port_num,
                     enum rdma_netdev_t type, const char *name,
                     unsigned char name_assign_type,
                     void (*setup)(struct net_device *),
index 91975400e1b35d015c0f26ab6690bfa7cc4449c5..03abd30e6c8cacce00506dfd7f09140410833b3b 100644 (file)
@@ -70,6 +70,7 @@ struct iw_cm_id {
        u8  tos;
        bool tos_set:1;
        bool mapped:1;
+       bool afonly:1;
 };
 
 struct iw_cm_conn_param {
index 32a67af18415d6f5bad03fb25b04a48e0c340b79..d989f030fae0183d4bd19fe04de17f9119b24c5c 100644 (file)
@@ -107,7 +107,7 @@ struct rdma_cm_id {
        struct rdma_route        route;
        enum rdma_ucm_port_space ps;
        enum ib_qp_type          qp_type;
-       u                      port_num;
+       u32                      port_num;
 };
 
 struct rdma_cm_id *
@@ -331,6 +331,8 @@ int rdma_set_reuseaddr(struct rdma_cm_id *id, int reuse);
 int rdma_set_afonly(struct rdma_cm_id *id, int afonly);
 
 int rdma_set_ack_timeout(struct rdma_cm_id *id, u8 timeout);
+
+int rdma_set_min_rnr_timer(struct rdma_cm_id *id, u8 min_rnr_timer);
  /**
  * rdma_get_service_id - Return the IB service ID for a specified address.
  * @id: Communication identifier associated with the address.
index e75cf9742e0409a0531c7d4370c08912a446a036..0295b22cd1cd8e2fcab9b4f19ef896917277fea8 100644 (file)
@@ -40,26 +40,26 @@ struct rdma_counter {
        struct rdma_counter_mode        mode;
        struct mutex                    lock;
        struct rdma_hw_stats            *stats;
-       u                             port;
+       u32                             port;
 };
 
 void rdma_counter_init(struct ib_device *dev);
 void rdma_counter_release(struct ib_device *dev);
-int rdma_counter_set_auto_mode(struct ib_device *dev, u8 port,
+int rdma_counter_set_auto_mode(struct ib_device *dev, u32 port,
                               enum rdma_nl_counter_mask mask,
                               struct netlink_ext_ack *extack);
-int rdma_counter_bind_qp_auto(struct ib_qp *qp, u8 port);
+int rdma_counter_bind_qp_auto(struct ib_qp *qp, u32 port);
 int rdma_counter_unbind_qp(struct ib_qp *qp, bool force);
 
 int rdma_counter_query_stats(struct rdma_counter *counter);
-u64 rdma_counter_get_hwstat_value(struct ib_device *dev, u8 port, u32 index);
-int rdma_counter_bind_qpn(struct ib_device *dev, u8 port,
+u64 rdma_counter_get_hwstat_value(struct ib_device *dev, u32 port, u32 index);
+int rdma_counter_bind_qpn(struct ib_device *dev, u32 port,
                          u32 qp_num, u32 counter_id);
-int rdma_counter_bind_qpn_alloc(struct ib_device *dev, u8 port,
+int rdma_counter_bind_qpn_alloc(struct ib_device *dev, u32 port,
                                u32 qp_num, u32 *counter_id);
-int rdma_counter_unbind_qpn(struct ib_device *dev, u8 port,
+int rdma_counter_unbind_qpn(struct ib_device *dev, u32 port,
                            u32 qp_num, u32 counter_id);
-int rdma_counter_get_mode(struct ib_device *dev, u8 port,
+int rdma_counter_get_mode(struct ib_device *dev, u32 port,
                          enum rdma_nl_counter_mode *mode,
                          enum rdma_nl_counter_mask *mask);
 
index 9fd217b249167e03838bf0cf0057a45223bb8d4f..2dafd7dbe89304d4198d194b2f454bfc875cca26 100644 (file)
@@ -92,7 +92,7 @@ struct rvt_ibport {
        /*
         * The pkey table is allocated and maintained by the driver. Drivers
         * need to have access to this before registering with rdmav. However
-        * rdmavt will need access to it so drivers need to proviee this during
+        * rdmavt will need access to it so drivers need to provide this during
         * the attach port API call.
         */
        u16 *pkey_table;
@@ -230,7 +230,7 @@ struct rvt_driver_provided {
        void (*do_send)(struct rvt_qp *qp);
 
        /*
-        * Returns a pointer to the undelying hardware's PCI device. This is
+        * Returns a pointer to the underlying hardware's PCI device. This is
         * used to display information as to what hardware is being referenced
         * in an output message
         */
@@ -245,7 +245,7 @@ struct rvt_driver_provided {
        void * (*qp_priv_alloc)(struct rvt_dev_info *rdi, struct rvt_qp *qp);
 
        /*
-        * Init a struture allocated with qp_priv_alloc(). This should be
+        * Init a structure allocated with qp_priv_alloc(). This should be
         * called after all qp fields have been initialized in rdmavt.
         */
        int (*qp_priv_init)(struct rvt_dev_info *rdi, struct rvt_qp *qp,
@@ -257,7 +257,7 @@ struct rvt_driver_provided {
        void (*qp_priv_free)(struct rvt_dev_info *rdi, struct rvt_qp *qp);
 
        /*
-        * Inform the driver the particular qp in quesiton has been reset so
+        * Inform the driver the particular qp in question has been reset so
         * that it can clean up anything it needs to.
         */
        void (*notify_qp_reset)(struct rvt_qp *qp);
@@ -281,7 +281,7 @@ struct rvt_driver_provided {
        void (*stop_send_queue)(struct rvt_qp *qp);
 
        /*
-        * Have the drivr drain any in progress operations
+        * Have the driver drain any in progress operations
         */
        void (*quiesce_qp)(struct rvt_qp *qp);
 
@@ -309,16 +309,16 @@ struct rvt_driver_provided {
        /*
         * Query driver for the state of the port.
         */
-       int (*query_port_state)(struct rvt_dev_info *rdi, u8 port_num,
+       int (*query_port_state)(struct rvt_dev_info *rdi, u32 port_num,
                                struct ib_port_attr *props);
 
        /*
         * Tell driver to shutdown a port
         */
-       int (*shut_down_port)(struct rvt_dev_info *rdi, u8 port_num);
+       int (*shut_down_port)(struct rvt_dev_info *rdi, u32 port_num);
 
        /* Tell driver to send a trap for changed  port capabilities */
-       void (*cap_mask_chg)(struct rvt_dev_info *rdi, u8 port_num);
+       void (*cap_mask_chg)(struct rvt_dev_info *rdi, u32 port_num);
 
        /*
         * The following functions can be safely ignored completely. Any use of
@@ -338,7 +338,7 @@ struct rvt_driver_provided {
 
        /* Let the driver pick the next queue pair number*/
        int (*alloc_qpn)(struct rvt_dev_info *rdi, struct rvt_qpn_table *qpt,
-                        enum ib_qp_type type, u8 port_num);
+                        enum ib_qp_type type, u32 port_num);
 
        /* Determine if its safe or allowed to modify the qp */
        int (*check_modify_qp)(struct rvt_qp *qp, struct ib_qp_attr *attr,
index 05e18839eaffcdf1fa626481237c1deca7a1d7ce..79d109c472423188e2b8566122a4a6e06572ddab 100644 (file)
@@ -49,6 +49,10 @@ enum rdma_restrack_type {
         * @RDMA_RESTRACK_COUNTER: Statistic Counter
         */
        RDMA_RESTRACK_COUNTER,
+       /**
+        * @RDMA_RESTRACK_SRQ: Shared receive queue (SRQ)
+        */
+       RDMA_RESTRACK_SRQ,
        /**
         * @RDMA_RESTRACK_MAX: Last entry, used for array dclarations
         */
index 6ad9dc836c107c0bce8978de738f097d4c8c8b9d..d606cac482338b701d2594bc10bcb3e7ca75566f 100644 (file)
@@ -42,29 +42,29 @@ struct rdma_rw_ctx {
        };
 };
 
-int rdma_rw_ctx_init(struct rdma_rw_ctx *ctx, struct ib_qp *qp, u8 port_num,
+int rdma_rw_ctx_init(struct rdma_rw_ctx *ctx, struct ib_qp *qp, u32 port_num,
                struct scatterlist *sg, u32 sg_cnt, u32 sg_offset,
                u64 remote_addr, u32 rkey, enum dma_data_direction dir);
-void rdma_rw_ctx_destroy(struct rdma_rw_ctx *ctx, struct ib_qp *qp, u8 port_num,
-               struct scatterlist *sg, u32 sg_cnt,
-               enum dma_data_direction dir);
+void rdma_rw_ctx_destroy(struct rdma_rw_ctx *ctx, struct ib_qp *qp,
+                        u32 port_num, struct scatterlist *sg, u32 sg_cnt,
+                        enum dma_data_direction dir);
 
 int rdma_rw_ctx_signature_init(struct rdma_rw_ctx *ctx, struct ib_qp *qp,
-               u8 port_num, struct scatterlist *sg, u32 sg_cnt,
+               u32 port_num, struct scatterlist *sg, u32 sg_cnt,
                struct scatterlist *prot_sg, u32 prot_sg_cnt,
                struct ib_sig_attrs *sig_attrs, u64 remote_addr, u32 rkey,
                enum dma_data_direction dir);
 void rdma_rw_ctx_destroy_signature(struct rdma_rw_ctx *ctx, struct ib_qp *qp,
-               u8 port_num, struct scatterlist *sg, u32 sg_cnt,
+               u32 port_num, struct scatterlist *sg, u32 sg_cnt,
                struct scatterlist *prot_sg, u32 prot_sg_cnt,
                enum dma_data_direction dir);
 
 struct ib_send_wr *rdma_rw_ctx_wrs(struct rdma_rw_ctx *ctx, struct ib_qp *qp,
-               u8 port_num, struct ib_cqe *cqe, struct ib_send_wr *chain_wr);
-int rdma_rw_ctx_post(struct rdma_rw_ctx *ctx, struct ib_qp *qp, u8 port_num,
+               u32 port_num, struct ib_cqe *cqe, struct ib_send_wr *chain_wr);
+int rdma_rw_ctx_post(struct rdma_rw_ctx *ctx, struct ib_qp *qp, u32 port_num,
                struct ib_cqe *cqe, struct ib_send_wr *chain_wr);
 
-unsigned int rdma_rw_mr_factor(struct ib_device *device, u8 port_num,
+unsigned int rdma_rw_mr_factor(struct ib_device *device, u32 port_num,
                unsigned int maxpages);
 void rdma_rw_init_qp(struct ib_device *dev, struct ib_qp_init_attr *attr);
 int rdma_rw_init_mrs(struct ib_qp *qp, struct ib_qp_init_attr *attr);
index 39ef204753ec16b1a51c0c4fd69c1a3f60d2d176..23bb404aba12c05dada31f18afc9d922e6bf6f18 100644 (file)
@@ -875,9 +875,14 @@ static inline __malloc void *uverbs_kcalloc(struct uverbs_attr_bundle *bundle,
                return ERR_PTR(-EOVERFLOW);
        return uverbs_zalloc(bundle, bytes);
 }
-int _uverbs_get_const(s64 *to, const struct uverbs_attr_bundle *attrs_bundle,
-                     size_t idx, s64 lower_bound, u64 upper_bound,
-                     s64 *def_val);
+
+int _uverbs_get_const_signed(s64 *to,
+                            const struct uverbs_attr_bundle *attrs_bundle,
+                            size_t idx, s64 lower_bound, u64 upper_bound,
+                            s64 *def_val);
+int _uverbs_get_const_unsigned(u64 *to,
+                              const struct uverbs_attr_bundle *attrs_bundle,
+                              size_t idx, u64 upper_bound, u64 *def_val);
 int uverbs_copy_to_struct_or_zero(const struct uverbs_attr_bundle *bundle,
                                  size_t idx, const void *from, size_t size);
 #else
@@ -921,27 +926,77 @@ uverbs_copy_to_struct_or_zero(const struct uverbs_attr_bundle *bundle,
 {
        return -EINVAL;
 }
+static inline int
+_uverbs_get_const_signed(s64 *to,
+                        const struct uverbs_attr_bundle *attrs_bundle,
+                        size_t idx, s64 lower_bound, u64 upper_bound,
+                        s64 *def_val)
+{
+       return -EINVAL;
+}
+static inline int
+_uverbs_get_const_unsigned(u64 *to,
+                          const struct uverbs_attr_bundle *attrs_bundle,
+                          size_t idx, u64 upper_bound, u64 *def_val)
+{
+       return -EINVAL;
+}
 #endif
 
-#define uverbs_get_const(_to, _attrs_bundle, _idx)                             \
+#define uverbs_get_const_signed(_to, _attrs_bundle, _idx)                      \
        ({                                                                     \
                s64 _val;                                                      \
-               int _ret = _uverbs_get_const(&_val, _attrs_bundle, _idx,       \
-                                            type_min(typeof(*_to)),           \
-                                            type_max(typeof(*_to)), NULL);    \
-               (*_to) = _val;                                                 \
+               int _ret =                                                     \
+                       _uverbs_get_const_signed(&_val, _attrs_bundle, _idx,   \
+                                         type_min(typeof(*(_to))),            \
+                                         type_max(typeof(*(_to))), NULL);     \
+               (*(_to)) = _val;                                               \
                _ret;                                                          \
        })
 
-#define uverbs_get_const_default(_to, _attrs_bundle, _idx, _default)           \
+#define uverbs_get_const_unsigned(_to, _attrs_bundle, _idx)                    \
+       ({                                                                     \
+               u64 _val;                                                      \
+               int _ret =                                                     \
+                       _uverbs_get_const_unsigned(&_val, _attrs_bundle, _idx, \
+                                         type_max(typeof(*(_to))), NULL);     \
+               (*(_to)) = _val;                                               \
+               _ret;                                                          \
+       })
+
+#define uverbs_get_const_default_signed(_to, _attrs_bundle, _idx, _default)    \
        ({                                                                     \
                s64 _val;                                                      \
                s64 _def_val = _default;                                       \
                int _ret =                                                     \
-                       _uverbs_get_const(&_val, _attrs_bundle, _idx,          \
-                                         type_min(typeof(*_to)),              \
-                                         type_max(typeof(*_to)), &_def_val);  \
-               (*_to) = _val;                                                 \
+                       _uverbs_get_const_signed(&_val, _attrs_bundle, _idx,   \
+                               type_min(typeof(*(_to))),                      \
+                               type_max(typeof(*(_to))), &_def_val);          \
+               (*(_to)) = _val;                                               \
                _ret;                                                          \
        })
+
+#define uverbs_get_const_default_unsigned(_to, _attrs_bundle, _idx, _default)  \
+       ({                                                                     \
+               u64 _val;                                                      \
+               u64 _def_val = _default;                                       \
+               int _ret =                                                     \
+                       _uverbs_get_const_unsigned(&_val, _attrs_bundle, _idx, \
+                               type_max(typeof(*(_to))), &_def_val);          \
+               (*(_to)) = _val;                                               \
+               _ret;                                                          \
+       })
+
+#define uverbs_get_const(_to, _attrs_bundle, _idx)                             \
+       (is_signed_type(typeof(*(_to))) ?                                      \
+                uverbs_get_const_signed(_to, _attrs_bundle, _idx) :           \
+                uverbs_get_const_unsigned(_to, _attrs_bundle, _idx))          \
+
+#define uverbs_get_const_default(_to, _attrs_bundle, _idx, _default)           \
+       (is_signed_type(typeof(*(_to))) ?                                      \
+                uverbs_get_const_default_signed(_to, _attrs_bundle, _idx,     \
+                                                 _default) :                  \
+                uverbs_get_const_default_unsigned(_to, _attrs_bundle, _idx,   \
+                                                   _default))
+
 #endif
index f04f5126f61ebc498c8f4728f58799503aec23dc..ee7873f872c378aacc2006d2f75101ce92725551 100644 (file)
@@ -20,7 +20,7 @@
 
 /* These are static so they do not need to be qualified */
 #define UVERBS_METHOD_ATTRS(method_id) _method_attrs_##method_id
-#define UVERBS_OBJECT_METHODS(object_id) _object_methods_##object_id
+#define UVERBS_OBJECT_METHODS(object_id) _UVERBS_NAME(_object_methods_##object_id, __LINE__)
 
 #define DECLARE_UVERBS_NAMED_METHOD(_method_id, ...)                           \
        static const struct uverbs_attr_def *const UVERBS_METHOD_ATTRS(        \
index 90b739d05adfe7e4125223e404098cf83093aa5d..42b177655560edd739c42b08b8203af40a710ef0 100644 (file)
@@ -86,6 +86,8 @@ struct hns_roce_ib_create_qp_resp {
 struct hns_roce_ib_alloc_ucontext_resp {
        __u32   qp_tab_size;
        __u32   cqe_size;
+       __u32   srq_tab_size;
+       __u32   reserved;
 };
 
 struct hns_roce_ib_alloc_pd_resp {
index 3fd9b380a091202a1da4ca1f1a035714af7d1f02..ca2372864b70e961be3ac538597390d768a74db9 100644 (file)
@@ -41,6 +41,25 @@ enum mlx5_ib_create_flow_action_attrs {
        MLX5_IB_ATTR_CREATE_FLOW_ACTION_FLAGS = (1U << UVERBS_ID_NS_SHIFT),
 };
 
+enum mlx5_ib_dm_methods {
+       MLX5_IB_METHOD_DM_MAP_OP_ADDR  = (1U << UVERBS_ID_NS_SHIFT),
+       MLX5_IB_METHOD_DM_QUERY,
+};
+
+enum mlx5_ib_dm_map_op_addr_attrs {
+       MLX5_IB_ATTR_DM_MAP_OP_ADDR_REQ_HANDLE = (1U << UVERBS_ID_NS_SHIFT),
+       MLX5_IB_ATTR_DM_MAP_OP_ADDR_REQ_OP,
+       MLX5_IB_ATTR_DM_MAP_OP_ADDR_RESP_START_OFFSET,
+       MLX5_IB_ATTR_DM_MAP_OP_ADDR_RESP_PAGE_INDEX,
+};
+
+enum mlx5_ib_query_dm_attrs {
+       MLX5_IB_ATTR_QUERY_DM_REQ_HANDLE = (1U << UVERBS_ID_NS_SHIFT),
+       MLX5_IB_ATTR_QUERY_DM_RESP_START_OFFSET,
+       MLX5_IB_ATTR_QUERY_DM_RESP_PAGE_INDEX,
+       MLX5_IB_ATTR_QUERY_DM_RESP_LENGTH,
+};
+
 enum mlx5_ib_alloc_dm_attrs {
        MLX5_IB_ATTR_ALLOC_DM_RESP_START_OFFSET = (1U << UVERBS_ID_NS_SHIFT),
        MLX5_IB_ATTR_ALLOC_DM_RESP_PAGE_INDEX,
@@ -154,6 +173,7 @@ enum mlx5_ib_devx_umem_reg_attrs {
        MLX5_IB_ATTR_DEVX_UMEM_REG_LEN,
        MLX5_IB_ATTR_DEVX_UMEM_REG_ACCESS,
        MLX5_IB_ATTR_DEVX_UMEM_REG_OUT_ID,
+       MLX5_IB_ATTR_DEVX_UMEM_REG_PGSZ_BITMAP,
 };
 
 enum mlx5_ib_devx_umem_dereg_attrs {
@@ -300,4 +320,13 @@ enum mlx5_ib_pd_methods {
 
 };
 
+enum mlx5_ib_device_methods {
+       MLX5_IB_METHOD_QUERY_PORT = (1U << UVERBS_ID_NS_SHIFT),
+};
+
+enum mlx5_ib_query_port_attrs {
+       MLX5_IB_ATTR_QUERY_PORT_PORT_NUM = (1U << UVERBS_ID_NS_SHIFT),
+       MLX5_IB_ATTR_QUERY_PORT,
+};
+
 #endif
index 56b26eaea0832fed30a4937136dd7594d027d8a7..a21ca8ece8db19e06865638e5d86a57988d0125a 100644 (file)
@@ -83,5 +83,30 @@ enum mlx5_ib_uapi_uar_alloc_type {
        MLX5_IB_UAPI_UAR_ALLOC_TYPE_NC = 0x1,
 };
 
+enum mlx5_ib_uapi_query_port_flags {
+       MLX5_IB_UAPI_QUERY_PORT_VPORT                   = 1 << 0,
+       MLX5_IB_UAPI_QUERY_PORT_VPORT_VHCA_ID           = 1 << 1,
+       MLX5_IB_UAPI_QUERY_PORT_VPORT_STEERING_ICM_RX   = 1 << 2,
+       MLX5_IB_UAPI_QUERY_PORT_VPORT_STEERING_ICM_TX   = 1 << 3,
+       MLX5_IB_UAPI_QUERY_PORT_VPORT_REG_C0            = 1 << 4,
+       MLX5_IB_UAPI_QUERY_PORT_ESW_OWNER_VHCA_ID       = 1 << 5,
+};
+
+struct mlx5_ib_uapi_reg {
+       __u32 value;
+       __u32 mask;
+};
+
+struct mlx5_ib_uapi_query_port {
+       __aligned_u64 flags;
+       __u16 vport;
+       __u16 vport_vhca_id;
+       __u16 esw_owner_vhca_id;
+       __u16 rsvd0;
+       __aligned_u64 vport_steering_icm_rx;
+       __aligned_u64 vport_steering_icm_tx;
+       struct mlx5_ib_uapi_reg reg_c0;
+};
+
 #endif
 
index d2f5b839624320ffa1ce1cded227729cd4a57c49..75a1ae2311d86345bbcc096a26fc98319b9c327f 100644 (file)
@@ -293,6 +293,10 @@ enum rdma_nldev_command {
 
        RDMA_NLDEV_CMD_RES_MR_GET_RAW,
 
+       RDMA_NLDEV_CMD_RES_CTX_GET, /* can dump */
+
+       RDMA_NLDEV_CMD_RES_SRQ_GET, /* can dump */
+
        RDMA_NLDEV_NUM_OPS
 };
 
@@ -533,6 +537,18 @@ enum rdma_nldev_attr {
 
        RDMA_NLDEV_ATTR_RES_RAW,        /* binary */
 
+       RDMA_NLDEV_ATTR_RES_CTX,                /* nested table */
+       RDMA_NLDEV_ATTR_RES_CTX_ENTRY,          /* nested table */
+
+       RDMA_NLDEV_ATTR_RES_SRQ,                /* nested table */
+       RDMA_NLDEV_ATTR_RES_SRQ_ENTRY,          /* nested table */
+       RDMA_NLDEV_ATTR_RES_SRQN,               /* u32 */
+
+       RDMA_NLDEV_ATTR_MIN_RANGE,              /* u32 */
+       RDMA_NLDEV_ATTR_MAX_RANGE,              /* u32 */
+
+       RDMA_NLDEV_SYS_ATTR_COPY_ON_FORK,       /* u8 */
+
        /*
         * Always the end
         */
index f5cbe963cd8f781cdfbb99a59fb51cfae2bd0baf..26b069e1999df9682d6698817dbf66d2ee0c5c96 100644 (file)
@@ -67,31 +67,6 @@ static void rds_ib_set_flow_control(struct rds_connection *conn, u32 credits)
        }
 }
 
-/*
- * Tune RNR behavior. Without flow control, we use a rather
- * low timeout, but not the absolute minimum - this should
- * be tunable.
- *
- * We already set the RNR retry count to 7 (which is the
- * smallest infinite number :-) above.
- * If flow control is off, we want to change this back to 0
- * so that we learn quickly when our credit accounting is
- * buggy.
- *
- * Caller passes in a qp_attr pointer - don't waste stack spacv
- * by allocation this twice.
- */
-static void
-rds_ib_tune_rnr(struct rds_ib_connection *ic, struct ib_qp_attr *attr)
-{
-       int ret;
-
-       attr->min_rnr_timer = IB_RNR_TIMER_000_32;
-       ret = ib_modify_qp(ic->i_cm_id->qp, attr, IB_QP_MIN_RNR_TIMER);
-       if (ret)
-               printk(KERN_NOTICE "ib_modify_qp(IB_QP_MIN_RNR_TIMER): err=%d\n", -ret);
-}
-
 /*
  * Connection established.
  * We get here for both outgoing and incoming connection.
@@ -100,7 +75,6 @@ void rds_ib_cm_connect_complete(struct rds_connection *conn, struct rdma_cm_even
 {
        struct rds_ib_connection *ic = conn->c_transport_data;
        const union rds_ib_conn_priv *dp = NULL;
-       struct ib_qp_attr qp_attr;
        __be64 ack_seq = 0;
        __be32 credit = 0;
        u8 major = 0;
@@ -168,14 +142,6 @@ void rds_ib_cm_connect_complete(struct rds_connection *conn, struct rdma_cm_even
         * the posted credit count. */
        rds_ib_recv_refill(conn, 1, GFP_KERNEL);
 
-       /* Tune RNR behavior */
-       rds_ib_tune_rnr(ic, &qp_attr);
-
-       qp_attr.qp_state = IB_QPS_RTS;
-       err = ib_modify_qp(ic->i_cm_id->qp, &qp_attr, IB_QP_STATE);
-       if (err)
-               printk(KERN_NOTICE "ib_modify_qp(IB_QP_STATE, RTS): err=%d\n", err);
-
        /* update ib_device with this local ipaddr */
        err = rds_ib_update_ipaddr(ic->rds_ibdev, &conn->c_laddr);
        if (err)
@@ -947,6 +913,7 @@ int rds_ib_cm_handle_connect(struct rdma_cm_id *cm_id,
                                  event->param.conn.responder_resources,
                                  event->param.conn.initiator_depth, isv6);
 
+       rdma_set_min_rnr_timer(cm_id, IB_RNR_TIMER_000_32);
        /* rdma_accept() calls rdma_reject() internally if it fails */
        if (rdma_accept(cm_id, &conn_param))
                rds_ib_conn_error(conn, "rdma_accept failed\n");
index 5f741e51b4baa46f825b7a676969cde3159b2c21..a9e4ff948a7d69a4c9ade67c482e2f7df25eebdb 100644 (file)
@@ -87,6 +87,7 @@ static int rds_rdma_cm_event_handler_cmn(struct rdma_cm_id *cm_id,
 
        case RDMA_CM_EVENT_ADDR_RESOLVED:
                rdma_set_service_type(cm_id, conn->c_tos);
+               rdma_set_min_rnr_timer(cm_id, IB_RNR_TIMER_000_32);
                /* XXX do we need to clean up if this fails? */
                ret = rdma_resolve_route(cm_id,
                                         RDS_RDMA_RESOLVE_TIMEOUT_MS);