svn commit: r255932 - in head/sys: conf contrib/rdma dev/cxgb/ulp/iw_cxgb modules modules/ibcore modules/ipoib modules/mlx4 modules/mlx4ib ofed/drivers/infiniband/core ofed/drivers/infiniband/hw/ml...

Alfred Perlstein alfred at FreeBSD.org
Sun Sep 29 00:35:07 UTC 2013


Author: alfred
Date: Sun Sep 29 00:35:03 2013
New Revision: 255932
URL: http://svnweb.freebsd.org/changeset/base/255932

Log:
  Update OFED to Linux 3.7 and update Mellanox drivers.
  
  Update the OFED Infiniband core to the version supplied in Linux
  version 3.7.
  
  The update to OFED is nearly all additional defines and functions
  with the exception of the addition of additional parameters to
  ib_register_device() and the reg_user_mr callback.
  
  In addition the ibcore (Infiniband core) and ipoib (IP over Infiniband)
  have both been made into completely loadable modules to facilitate
  testing of the OFED stack in FreeBSD.
  
  Finally the Mellanox Infiniband drivers are now updated to the
  latest version shipping with Linux 3.7.
  
  Submitted by: Mellanox FreeBSD driver team:
                  Oded Shanoon (odeds mellanox.com),
                  Meny Yossefi (menyy mellanox.com),
                  Orit Moskovich (oritm mellanox.com)
  
  Approved by: re

Added:
  head/sys/modules/ibcore/
  head/sys/modules/ibcore/Makefile   (contents, props changed)
  head/sys/modules/ipoib/
  head/sys/modules/ipoib/Makefile   (contents, props changed)
  head/sys/ofed/drivers/infiniband/hw/mlx4/alias_GUID.c   (contents, props changed)
  head/sys/ofed/drivers/infiniband/hw/mlx4/cm.c   (contents, props changed)
  head/sys/ofed/drivers/infiniband/hw/mlx4/mcg.c   (contents, props changed)
  head/sys/ofed/drivers/infiniband/hw/mlx4/sysfs.c   (contents, props changed)
  head/sys/ofed/drivers/net/mlx4/resource_tracker.c   (contents, props changed)
  head/sys/ofed/drivers/net/mlx4/sys_tune.c   (contents, props changed)
  head/sys/ofed/include/linux/atomic.h   (contents, props changed)
  head/sys/ofed/include/linux/clocksource.h   (contents, props changed)
  head/sys/ofed/include/rdma/ib_pma.h   (contents, props changed)
Modified:
  head/sys/conf/files
  head/sys/contrib/rdma/ib_umem.h
  head/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_provider.c
  head/sys/modules/Makefile
  head/sys/modules/mlx4/Makefile
  head/sys/modules/mlx4ib/Makefile
  head/sys/ofed/drivers/infiniband/core/addr.c
  head/sys/ofed/drivers/infiniband/core/cma.c
  head/sys/ofed/drivers/infiniband/core/core_priv.h
  head/sys/ofed/drivers/infiniband/core/device.c
  head/sys/ofed/drivers/infiniband/core/sa_query.c
  head/sys/ofed/drivers/infiniband/core/sysfs.c
  head/sys/ofed/drivers/infiniband/core/uverbs_cmd.c
  head/sys/ofed/drivers/infiniband/core/uverbs_main.c
  head/sys/ofed/drivers/infiniband/core/verbs.c
  head/sys/ofed/drivers/infiniband/hw/mlx4/Kconfig
  head/sys/ofed/drivers/infiniband/hw/mlx4/Makefile
  head/sys/ofed/drivers/infiniband/hw/mlx4/ah.c
  head/sys/ofed/drivers/infiniband/hw/mlx4/cq.c
  head/sys/ofed/drivers/infiniband/hw/mlx4/mad.c
  head/sys/ofed/drivers/infiniband/hw/mlx4/main.c
  head/sys/ofed/drivers/infiniband/hw/mlx4/mlx4_ib.h
  head/sys/ofed/drivers/infiniband/hw/mlx4/mr.c
  head/sys/ofed/drivers/infiniband/hw/mlx4/qp.c
  head/sys/ofed/drivers/infiniband/hw/mlx4/srq.c
  head/sys/ofed/drivers/infiniband/hw/mlx4/user.h
  head/sys/ofed/drivers/infiniband/hw/mlx4/wc.c
  head/sys/ofed/drivers/infiniband/hw/mthca/mthca_cmd.c
  head/sys/ofed/drivers/infiniband/hw/mthca/mthca_main.c
  head/sys/ofed/drivers/infiniband/hw/mthca/mthca_memfree.c
  head/sys/ofed/drivers/infiniband/hw/mthca/mthca_provider.c
  head/sys/ofed/drivers/infiniband/ulp/ipoib/ipoib.h
  head/sys/ofed/drivers/infiniband/ulp/ipoib/ipoib_main.c
  head/sys/ofed/drivers/net/mlx4/Makefile
  head/sys/ofed/drivers/net/mlx4/alloc.c
  head/sys/ofed/drivers/net/mlx4/catas.c
  head/sys/ofed/drivers/net/mlx4/cmd.c
  head/sys/ofed/drivers/net/mlx4/cq.c
  head/sys/ofed/drivers/net/mlx4/en_cq.c
  head/sys/ofed/drivers/net/mlx4/en_main.c
  head/sys/ofed/drivers/net/mlx4/en_netdev.c
  head/sys/ofed/drivers/net/mlx4/en_port.c
  head/sys/ofed/drivers/net/mlx4/en_port.h
  head/sys/ofed/drivers/net/mlx4/en_rx.c
  head/sys/ofed/drivers/net/mlx4/en_tx.c
  head/sys/ofed/drivers/net/mlx4/eq.c
  head/sys/ofed/drivers/net/mlx4/fw.c
  head/sys/ofed/drivers/net/mlx4/fw.h
  head/sys/ofed/drivers/net/mlx4/icm.c
  head/sys/ofed/drivers/net/mlx4/icm.h
  head/sys/ofed/drivers/net/mlx4/intf.c
  head/sys/ofed/drivers/net/mlx4/main.c
  head/sys/ofed/drivers/net/mlx4/mcg.c
  head/sys/ofed/drivers/net/mlx4/mlx4.h
  head/sys/ofed/drivers/net/mlx4/mlx4_en.h
  head/sys/ofed/drivers/net/mlx4/mr.c
  head/sys/ofed/drivers/net/mlx4/pd.c
  head/sys/ofed/drivers/net/mlx4/port.c
  head/sys/ofed/drivers/net/mlx4/profile.c
  head/sys/ofed/drivers/net/mlx4/qp.c
  head/sys/ofed/drivers/net/mlx4/reset.c
  head/sys/ofed/drivers/net/mlx4/sense.c
  head/sys/ofed/drivers/net/mlx4/srq.c
  head/sys/ofed/include/asm/atomic.h
  head/sys/ofed/include/asm/byteorder.h
  head/sys/ofed/include/linux/bitops.h
  head/sys/ofed/include/linux/compat.h
  head/sys/ofed/include/linux/device.h
  head/sys/ofed/include/linux/dma-mapping.h
  head/sys/ofed/include/linux/gfp.h
  head/sys/ofed/include/linux/idr.h
  head/sys/ofed/include/linux/if_ether.h
  head/sys/ofed/include/linux/in6.h
  head/sys/ofed/include/linux/kernel.h
  head/sys/ofed/include/linux/linux_compat.c
  head/sys/ofed/include/linux/list.h
  head/sys/ofed/include/linux/log2.h
  head/sys/ofed/include/linux/mlx4/cmd.h
  head/sys/ofed/include/linux/mlx4/cq.h
  head/sys/ofed/include/linux/mlx4/device.h
  head/sys/ofed/include/linux/mlx4/driver.h
  head/sys/ofed/include/linux/mlx4/qp.h
  head/sys/ofed/include/linux/mlx4/srq.h
  head/sys/ofed/include/linux/moduleparam.h
  head/sys/ofed/include/linux/pci.h
  head/sys/ofed/include/linux/sysfs.h
  head/sys/ofed/include/linux/types.h
  head/sys/ofed/include/linux/workqueue.h
  head/sys/ofed/include/rdma/ib_cm.h
  head/sys/ofed/include/rdma/ib_mad.h
  head/sys/ofed/include/rdma/ib_sa.h
  head/sys/ofed/include/rdma/ib_user_verbs.h
  head/sys/ofed/include/rdma/ib_verbs.h

Modified: head/sys/conf/files
==============================================================================
--- head/sys/conf/files	Sat Sep 28 23:03:40 2013	(r255931)
+++ head/sys/conf/files	Sun Sep 29 00:35:03 2013	(r255932)
@@ -3542,6 +3542,18 @@ ofed/drivers/infiniband/ulp/sdp/sdp_tx.c
 	no-depend							\
 	compile-with "${OFED_C} -I$S/ofed/drivers/infiniband/ulp/sdp/"
 
+ofed/drivers/infiniband/hw/mlx4/alias_GUID.c    optional mlx4ib         \
+        no-depend obj-prefix "mlx4ib_"                                  \
+        compile-with "${OFED_C_NOIMP} -I$S/ofed/drivers/infiniband/hw/mlx4/"
+ofed/drivers/infiniband/hw/mlx4/mcg.c           optional mlx4ib         \
+        no-depend obj-prefix "mlx4ib_"                                  \
+        compile-with "${OFED_C_NOIMP} -I$S/ofed/drivers/infiniband/hw/mlx4/"
+ofed/drivers/infiniband/hw/mlx4/sysfs.c         optional mlx4ib         \
+        no-depend obj-prefix "mlx4ib_"                                  \
+        compile-with "${OFED_C_NOIMP} -I$S/ofed/drivers/infiniband/hw/mlx4/"
+ofed/drivers/infiniband/hw/mlx4/cm.c            optional mlx4ib         \
+        no-depend obj-prefix "mlx4ib_"                                  \
+        compile-with "${OFED_C_NOIMP} -I$S/ofed/drivers/infiniband/hw/mlx4/"
 ofed/drivers/infiniband/hw/mlx4/ah.c		optional mlx4ib		\
 	no-depend obj-prefix "mlx4ib_"					\
 	compile-with "${OFED_C_NOIMP} -I$S/ofed/drivers/infiniband/hw/mlx4/"
@@ -3624,7 +3636,10 @@ ofed/drivers/net/mlx4/sense.c			optional
 ofed/drivers/net/mlx4/srq.c			optional mlx4ib | mlxen	\
 	no-depend obj-prefix "mlx4_"					\
 	compile-with "${OFED_C_NOIMP} -I$S/ofed/drivers/net/mlx4/"
-ofed/drivers/net/mlx4/xrcd.c			optional mlx4ib | mlxen	\
+ofed/drivers/net/mlx4/resource_tracker.c        optional mlx4ib | mlxen	\
+	no-depend obj-prefix "mlx4_"					\
+	compile-with "${OFED_C_NOIMP} -I$S/ofed/drivers/net/mlx4/"
+ofed/drivers/net/mlx4/sys_tune.c		optional mlx4ib | mlxen	\
 	no-depend obj-prefix "mlx4_"					\
 	compile-with "${OFED_C_NOIMP} -I$S/ofed/drivers/net/mlx4/"
 

Modified: head/sys/contrib/rdma/ib_umem.h
==============================================================================
--- head/sys/contrib/rdma/ib_umem.h	Sat Sep 28 23:03:40 2013	(r255931)
+++ head/sys/contrib/rdma/ib_umem.h	Sun Sep 29 00:35:03 2013	(r255932)
@@ -28,21 +28,17 @@
  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  * SOFTWARE.
- *
- * $FreeBSD$
  */
 
 #ifndef IB_UMEM_H
 #define IB_UMEM_H
 
-struct ib_ucontext;
+#include <linux/list.h>
+#include <linux/scatterlist.h>
+#include <linux/workqueue.h>
+#include <linux/dma-attrs.h>
 
-struct ib_umem_chunk {
-	TAILQ_ENTRY(ib_umem_chunk) entry;
-	int                     nents;
-	int                     nmap;
-	struct rdma_scatterlist page_list[0];
-};
+struct ib_ucontext;
 
 struct ib_umem {
 	struct ib_ucontext     *context;
@@ -50,28 +46,76 @@ struct ib_umem {
 	int			offset;
 	int			page_size;
 	int                     writable;
-	TAILQ_HEAD(, ib_umem_chunk) chunk_list;
-#ifdef notyet	
+	int                     hugetlb;
+	struct list_head	chunk_list;
 	struct work_struct	work;
 	struct mm_struct       *mm;
-#endif	
 	unsigned long		diff;
 };
 
+/* contiguous memory structure */
+struct ib_cmem {
+
+	struct ib_ucontext     *context;
+	size_t			length;
+	/* Link list of contiguous blocks being part of that cmem  */
+	struct list_head ib_cmem_block;
+
+	/* Order of cmem block,  2^ block_order will equal number
+	     of physical pages per block
+	*/
+	unsigned long    block_order;
+	/* Refernce counter for that memory area
+	  - When value became 0 pages will be returned to the kernel.
+	*/
+	struct kref refcount;
+};
+
+
+struct ib_cmem_block {
+
+	struct list_head	list;
+	/* page will point to the page struct of the head page
+	    in the current compound page.
+	    block order is saved once as part of ib_cmem.
+	*/
+	struct page            *page;
+};
+
+
+
+struct ib_umem_chunk {
+	struct list_head	list;
+	int                     nents;
+	int                     nmap;
+	struct dma_attrs	attrs;
+	struct scatterlist      page_list[0];
+};
+
 #ifdef CONFIG_INFINIBAND_USER_MEM
 
 struct ib_umem *ib_umem_get(struct ib_ucontext *context, unsigned long addr,
-			    size_t size, int access);
+			    size_t size, int access, int dmasync);
 void ib_umem_release(struct ib_umem *umem);
 int ib_umem_page_count(struct ib_umem *umem);
 
+int ib_cmem_map_contiguous_pages_to_vma(struct ib_cmem *ib_cmem,
+	struct vm_area_struct *vma);
+struct ib_cmem *ib_cmem_alloc_contiguous_pages(struct ib_ucontext *context,
+				unsigned long total_size,
+				unsigned long page_size_order);
+void ib_cmem_release_contiguous_pages(struct ib_cmem *cmem);
+int ib_umem_map_to_vma(struct ib_umem *umem,
+				struct vm_area_struct *vma);
+
 #else /* CONFIG_INFINIBAND_USER_MEM */
 
+#include <linux/err.h>
 
 static inline struct ib_umem *ib_umem_get(struct ib_ucontext *context,
 					  unsigned long addr, size_t size,
-					  int access) {
-	return ERR_PTR(EINVAL);
+					  int access, int dmasync) {
+	return ERR_PTR(-EINVAL);
 }
 static inline void ib_umem_release(struct ib_umem *umem) { }
 static inline int ib_umem_page_count(struct ib_umem *umem) { return 0; }

Modified: head/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_provider.c
==============================================================================
--- head/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_provider.c	Sat Sep 28 23:03:40 2013	(r255931)
+++ head/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_provider.c	Sun Sep 29 00:35:03 2013	(r255932)
@@ -541,7 +541,8 @@ static int iwch_reregister_phys_mem(stru
 
 
 static struct ib_mr *iwch_reg_user_mr(struct ib_pd *pd, u64 start, u64 length,
-				      u64 virt, int acc, struct ib_udata *udata)
+				      u64 virt, int acc, struct ib_udata *udata,
+				      int mr_id)
 {
 	__be64 *pages;
 	int shift, i, n;
@@ -1136,7 +1137,7 @@ int iwch_register_device(struct iwch_dev
 	dev->ibdev.iwcm->rem_ref = iwch_qp_rem_ref;
 	dev->ibdev.iwcm->get_qp = iwch_get_qp;
 
-	ret = ib_register_device(&dev->ibdev);
+	ret = ib_register_device(&dev->ibdev, NULL);
 	if (ret)
 		goto bail1;
 

Modified: head/sys/modules/Makefile
==============================================================================
--- head/sys/modules/Makefile	Sat Sep 28 23:03:40 2013	(r255931)
+++ head/sys/modules/Makefile	Sun Sep 29 00:35:03 2013	(r255932)
@@ -128,6 +128,7 @@ SUBDIR=	\
 	hwpmc \
 	${_hyperv} \
 	${_i2c} \
+        ${_ibcore} \
 	${_ibcs2} \
 	${_ichwd} \
 	${_ida} \
@@ -149,6 +150,7 @@ SUBDIR=	\
 	${_igb} \
 	${_iir} \
 	${_io} \
+        ${_ipoib} \
 	${_ipdivert} \
 	${_ipfilter} \
 	${_ipfw} \
@@ -499,11 +501,17 @@ _fe=		fe
 _glxiic=	glxiic
 _glxsb=		glxsb
 _i2c=		i2c
+.if ${MK_OFED} != "no" || defined(ALL_MODULES)
+_ibcore=        ibcore
+.endif
 _ibcs2=		ibcs2
 _ie=		ie
 _if_ndis=	if_ndis
 _igb=		igb
 _io=		io
+.if ${MK_OFED} != "no" || defined(ALL_MODULES)
+_ipoib=         ipoib
+.endif
 _lindev=	lindev
 _linprocfs=	linprocfs
 _linsysfs=	linsysfs
@@ -675,6 +683,9 @@ _hptrr=		hptrr
 .endif
 _hyperv=	hyperv
 _i2c=		i2c
+.if ${MK_OFED} != "no" || defined(ALL_MODULES)
+_ibcore=        ibcore
+.endif
 _ichwd=		ichwd
 _ida=		ida
 _if_ndis=	if_ndis
@@ -682,6 +693,9 @@ _igb=		igb
 _iir=		iir
 _io=		io
 _ipmi=		ipmi
+.if ${MK_OFED} != "no" || defined(ALL_MODULES)
+_ipoib=         ipoib
+.endif
 _ips=		ips
 _ipw=		ipw
 .if ${MK_SOURCELESS_UCODE} != "no"

Added: head/sys/modules/ibcore/Makefile
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/sys/modules/ibcore/Makefile	Sun Sep 29 00:35:03 2013	(r255932)
@@ -0,0 +1,23 @@
+# $FreeBSD$
+.PATH:  ${.CURDIR}/../../ofed/drivers/infiniband/core
+.PATH:  ${.CURDIR}/../../ofed/include/linux
+
+.include <bsd.own.mk>
+
+KMOD    = ibcore
+SRCS    = addr.c cm_msgs.h iwcm.c mad_rmpp.h sa_query.c ucma.c uverbs_cmd.c
+SRCS+= agent.c    local_sa.c iwcm.h multicast.c smi.c ud_header.c uverbs_main.c
+SRCS+= agent.h core_priv.h mad.c notice.c smi.h umem.c uverbs_marshall.c
+SRCS+= cache.c device.c mad_priv.h packer.c sysfs.c user_mad.c verbs.c
+SRCS+= cm.c fmr_pool.c mad_rmpp.c sa.h ucm.c uverbs.h cma.c
+SRCS+= linux_compat.c linux_radix.c linux_idr.c
+SRCS+= vnode_if.h device_if.h bus_if.h pci_if.h opt_inet.h
+
+CFLAGS+= -I${.CURDIR}/../../ofed/drivers/infiniband/core
+CFLAGS+= -I${.CURDIR}/../mlx4ib
+CFLAGS+= -I${.CURDIR}/../../ofed/include/
+CFLAGS+= -DINET6 -DINET -DOFED
+
+.include <bsd.kmod.mk>
+
+CFLAGS+= -Wno-cast-qual -Wno-pointer-arith -fms-extensions

Added: head/sys/modules/ipoib/Makefile
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/sys/modules/ipoib/Makefile	Sun Sep 29 00:35:03 2013	(r255932)
@@ -0,0 +1,31 @@
+# $FreeBSD$
+.PATH:  ${.CURDIR}/../../ofed/drivers/infiniband/ulp/ipoib
+.PATH:  ${.CURDIR}/../../ofed/include/linux
+
+.include <bsd.own.mk>
+
+KMOD    = ipoib
+SRCS    = device_if.h bus_if.h opt_ofed.h vnode_if.h opt_inet.h opt_inet6.h
+SRCS    += ipoib_cm.c ipoib_ib.c ipoib_main.c ipoib_multicast.c ipoib_verbs.c ipoib.h
+SRCS+=  linux_compat.c linux_radix.c linux_idr.c
+
+CFLAGS+= -I${.CURDIR}/../../ofed/drivers/infiniband/ulp/ipoib
+CFLAGS+= -I${.CURDIR}/../ibcore
+CFLAGS+= -I${.CURDIR}/../../ofed/include/
+CFLAGS+= -DINET6 -DINET -DOFED
+
+.if !defined(KERNBUILDDIR)
+.if ${MK_INET_SUPPORT} != "no"
+opt_inet.h:
+	@echo "#define INET 1" > ${.TARGET}
+.endif
+
+.if ${MK_INET6_SUPPORT} != "no"
+opt_inet6.h:
+	@echo "#define INET6 1" > ${.TARGET}
+.endif
+.endif
+
+.include <bsd.kmod.mk>
+
+CFLAGS+= -Wno-cast-qual -Wno-pointer-arith -fms-extensions

Modified: head/sys/modules/mlx4/Makefile
==============================================================================
--- head/sys/modules/mlx4/Makefile	Sat Sep 28 23:03:40 2013	(r255931)
+++ head/sys/modules/mlx4/Makefile	Sun Sep 29 00:35:03 2013	(r255932)
@@ -3,11 +3,11 @@
 
 .include <bsd.own.mk>
 
+.PATH:  ${.CURDIR}/../../ofed/include/linux
 KMOD    = mlx4
 SRCS    = device_if.h bus_if.h pci_if.h vnode_if.h
-SRCS+=	alloc.c catas.c cmd.c cq.c eq.c fw.c icm.c intf.c main.c mcg.c mr.c
-SRCS+=	pd.c port.c profile.c qp.c reset.c sense.c srq.c xrcd.c
-SRCS+=	opt_inet.h opt_inet6.h
+SRCS+= alloc.c catas.c cmd.c cq.c eq.c fw.c icm.c intf.c main.c mcg.c mr.c linux_compat.c linux_radix.c	linux_idr.c
+SRCS+=	pd.c port.c profile.c qp.c reset.c sense.c srq.c resource_tracker.c sys_tune.c
 
 CFLAGS+= -I${.CURDIR}/../../ofed/drivers/net/mlx4
 CFLAGS+= -I${.CURDIR}/../../ofed/include/

Modified: head/sys/modules/mlx4ib/Makefile
==============================================================================
--- head/sys/modules/mlx4ib/Makefile	Sat Sep 28 23:03:40 2013	(r255931)
+++ head/sys/modules/mlx4ib/Makefile	Sun Sep 29 00:35:03 2013	(r255932)
@@ -1,14 +1,21 @@
 # $FreeBSD$
 .PATH:  ${.CURDIR}/../../ofed/drivers/infiniband/hw/mlx4
+.PATH:  ${.CURDIR}/../../ofed/include/linux
 
 .include <bsd.own.mk>
 
 KMOD    = mlx4ib
 SRCS    = device_if.h bus_if.h pci_if.h vnode_if.h
-SRCS+=	ah.c cq.c doorbell.c mad.c main.c mr.c qp.c srq.c wc.c
+SRCS+= linux_compat.c linux_radix.c linux_idr.c 
+SRCS+=	alias_GUID.c mcg.c sysfs.c ah.c cq.c doorbell.c mad.c main.c mr.c qp.c srq.c wc.c cm.c
 SRCS+=	opt_inet.h opt_inet6.h
 
+#CFLAGS+= -I${.CURDIR}/../../ofed/include/
+#CFLAGS+= -I${.CURDIR}/../../../../include
+CFLAGS+= -I${.CURDIR}/../../ofed/drivers/infiniband/hw/mlx4
 CFLAGS+= -I${.CURDIR}/../../ofed/include/
+CFLAGS+= -DCONFIG_INFINIBAND_USER_MEM
+CFLAGS+= -DINET6 -DINET -DOFED
 
 .if !defined(KERNBUILDDIR)
 .if ${MK_INET_SUPPORT} != "no"

Modified: head/sys/ofed/drivers/infiniband/core/addr.c
==============================================================================
--- head/sys/ofed/drivers/infiniband/core/addr.c	Sat Sep 28 23:03:40 2013	(r255931)
+++ head/sys/ofed/drivers/infiniband/core/addr.c	Sun Sep 29 00:35:03 2013	(r255932)
@@ -356,7 +356,7 @@ static int addr_resolve(struct sockaddr 
 	u_char edst[MAX_ADDR_LEN];
 	int multi;
 	int bcast;
-	int error;
+	int error = 0;
 
 	/*
 	 * Determine whether the address is unicast, multicast, or broadcast

Modified: head/sys/ofed/drivers/infiniband/core/cma.c
==============================================================================
--- head/sys/ofed/drivers/infiniband/core/cma.c	Sat Sep 28 23:03:40 2013	(r255931)
+++ head/sys/ofed/drivers/infiniband/core/cma.c	Sun Sep 29 00:35:03 2013	(r255932)
@@ -2957,7 +2957,7 @@ static void cma_set_mgid(struct rdma_id_
 								 0xFF10A01B)) {
 		/* IPv6 address is an SA assigned MGID. */
 		memcpy(mgid, &sin6->sin6_addr, sizeof *mgid);
-	} else if ((addr->sa_family == AF_INET6)) {
+	} else if (addr->sa_family == AF_INET6) {
 		ipv6_ib_mc_map(&sin6->sin6_addr, dev_addr->broadcast, mc_map);
 		if (id_priv->id.ps == RDMA_PS_UDP)
 			mc_map[7] = 0x01;	/* Use RDMA CM signature */

Modified: head/sys/ofed/drivers/infiniband/core/core_priv.h
==============================================================================
--- head/sys/ofed/drivers/infiniband/core/core_priv.h	Sat Sep 28 23:03:40 2013	(r255931)
+++ head/sys/ofed/drivers/infiniband/core/core_priv.h	Sun Sep 29 00:35:03 2013	(r255932)
@@ -38,7 +38,8 @@
 
 #include <rdma/ib_verbs.h>
 
-int  ib_device_register_sysfs(struct ib_device *device);
+int  ib_device_register_sysfs(struct ib_device *device, int (*port_callback)(struct ib_device *,
+                                                  u8, struct kobject *));
 void ib_device_unregister_sysfs(struct ib_device *device);
 
 int  ib_sysfs_setup(void);

Modified: head/sys/ofed/drivers/infiniband/core/device.c
==============================================================================
--- head/sys/ofed/drivers/infiniband/core/device.c	Sat Sep 28 23:03:40 2013	(r255931)
+++ head/sys/ofed/drivers/infiniband/core/device.c	Sun Sep 29 00:35:03 2013	(r255932)
@@ -273,7 +273,9 @@ out:
  * callback for each device that is added. @device must be allocated
  * with ib_alloc_device().
  */
-int ib_register_device(struct ib_device *device)
+int ib_register_device(struct ib_device *device,
+		       int (*port_callback)(struct ib_device *,
+					    u8, struct kobject *))
 {
 	int ret;
 
@@ -294,8 +296,6 @@ int ib_register_device(struct ib_device 
 	INIT_LIST_HEAD(&device->client_data_list);
 	spin_lock_init(&device->event_handler_lock);
 	spin_lock_init(&device->client_data_lock);
-	device->ib_uverbs_xrcd_table = RB_ROOT;
-	mutex_init(&device->xrcd_table_mutex);
 
 	ret = read_port_table_lengths(device);
 	if (ret) {
@@ -304,7 +304,7 @@ int ib_register_device(struct ib_device 
 		goto out;
 	}
 
-	ret = ib_device_register_sysfs(device);
+	ret = ib_device_register_sysfs(device, port_callback);
 	if (ret) {
 		printk(KERN_WARNING "Couldn't register device %s with driver model\n",
 		       device->name);
@@ -752,3 +752,19 @@ static void __exit ib_core_cleanup(void)
 
 module_init(ib_core_init);
 module_exit(ib_core_cleanup);
+
+#undef MODULE_VERSION
+#include <sys/module.h>
+static int
+ibcore_evhand(module_t mod, int event, void *arg)
+{
+	return (0);
+}
+
+static moduledata_t ibcore_mod = {
+	.name = "ibcore",
+	.evhand = ibcore_evhand,
+};
+
+MODULE_VERSION(ibcore, 1);
+DECLARE_MODULE(ibcore, ibcore_mod, SI_SUB_SMP, SI_ORDER_ANY);

Modified: head/sys/ofed/drivers/infiniband/core/sa_query.c
==============================================================================
--- head/sys/ofed/drivers/infiniband/core/sa_query.c	Sat Sep 28 23:03:40 2013	(r255931)
+++ head/sys/ofed/drivers/infiniband/core/sa_query.c	Sun Sep 29 00:35:03 2013	(r255932)
@@ -1105,6 +1105,27 @@ static void ib_sa_inform_release(struct 
 	kfree(container_of(sa_query, struct ib_sa_inform_query, sa_query));
 }
 
+int ib_sa_guid_info_rec_query(struct ib_sa_client *client,
+			      struct ib_device *device, u8 port_num,
+			      struct ib_sa_guidinfo_rec *rec,
+			      ib_sa_comp_mask comp_mask, u8 method,
+			      int timeout_ms, gfp_t gfp_mask,
+			      void (*callback)(int status,
+					       struct ib_sa_guidinfo_rec *resp,
+					       void *context),
+			      void *context,
+			      struct ib_sa_query **sa_query)
+{
+	// stub function - 
+        // called originally from mad.c under mlx4_ib_init_sriov()
+        // which calls mlx4_ib_init_alias_guid_service() in alias_GUID.c
+        // which goes down to this function
+
+        printk("ERROR: function should be called only in SRIOV flow!!!");
+
+	return 0;
+}
+
 /**
  * ib_sa_informinfo_query - Start an InformInfo registration.
  * @client:SA client

Modified: head/sys/ofed/drivers/infiniband/core/sysfs.c
==============================================================================
--- head/sys/ofed/drivers/infiniband/core/sysfs.c	Sat Sep 28 23:03:40 2013	(r255931)
+++ head/sys/ofed/drivers/infiniband/core/sysfs.c	Sun Sep 29 00:35:03 2013	(r255932)
@@ -38,6 +38,7 @@
 #include <linux/string.h>
 
 #include <rdma/ib_mad.h>
+#include <rdma/ib_pma.h>
 
 struct ib_port {
 	struct kobject         kobj;
@@ -103,7 +104,7 @@ static ssize_t state_show(struct ib_port
 		return ret;
 
 	return sprintf(buf, "%d: %s\n", attr.state,
-		       attr.state >= 0 && attr.state < ARRAY_SIZE(state_name) ?
+		       attr.state < ARRAY_SIZE(state_name) ?
 		       state_name[attr.state] : "UNKNOWN");
 }
 
@@ -292,118 +293,124 @@ static ssize_t show_port_pkey(struct ib_
 	return sprintf(buf, "0x%04x\n", pkey);
 }
 
-#define PORT_PMA_ATTR(_name, _counter, _width, _offset)			\
-struct port_table_attribute port_pma_attr_##_name = {			\
-	.attr  = __ATTR(_name, S_IRUGO, show_pma_counter, NULL),	\
-	.index = (_offset) | ((_width) << 16) | ((_counter) << 24)	\
-}
-
-static ssize_t show_pma_counter(struct ib_port *p, struct port_attribute *attr,
-				char *buf)
+static ssize_t get_pma_counters(struct ib_port *p, struct port_attribute *attr,
+                                char *buf, int c_ext)
 {
-	struct port_table_attribute *tab_attr =
-		container_of(attr, struct port_table_attribute, attr);
-	int offset = tab_attr->index & 0xffff;
-	int width  = (tab_attr->index >> 16) & 0xff;
-	struct ib_mad *in_mad  = NULL;
-	struct ib_mad *out_mad = NULL;
-	ssize_t ret;
+        struct port_table_attribute *tab_attr =
+                container_of(attr, struct port_table_attribute, attr);
+        int offset = tab_attr->index & 0xffff;
+        int width  = (tab_attr->index >> 16) & 0xff;
+        struct ib_mad *in_mad  = NULL;
+        struct ib_mad *out_mad = NULL;
+        ssize_t ret;
+
+        if (!p->ibdev->process_mad)
+                return -ENXIO;
+
+        in_mad  = kzalloc(sizeof *in_mad, GFP_KERNEL);
+        out_mad = kmalloc(sizeof *out_mad, GFP_KERNEL);
+        if (!in_mad || !out_mad) {
+                ret = -ENOMEM;
+                goto out;
+        }
+
+        in_mad->mad_hdr.base_version  = 1;
+        in_mad->mad_hdr.mgmt_class    = IB_MGMT_CLASS_PERF_MGMT;
+        in_mad->mad_hdr.class_version = 1;
+        in_mad->mad_hdr.method        = IB_MGMT_METHOD_GET;
+        if (c_ext)
+                in_mad->mad_hdr.attr_id = IB_PMA_PORT_COUNTERS_EXT;
+        else
+                in_mad->mad_hdr.attr_id = IB_PMA_PORT_COUNTERS;
+
+        in_mad->data[41] = p->port_num; /* PortSelect field */
+
+        if ((p->ibdev->process_mad(p->ibdev, IB_MAD_IGNORE_MKEY,
+                 p->port_num, NULL, NULL, in_mad, out_mad) &
+             (IB_MAD_RESULT_SUCCESS | IB_MAD_RESULT_REPLY)) !=
+            (IB_MAD_RESULT_SUCCESS | IB_MAD_RESULT_REPLY)) {
+                ret = -EINVAL;
+                goto out;
+        }
+
+        switch (width) {
+        case 4:
+                ret = sprintf(buf, "%u\n", (out_mad->data[40 + offset / 8] >>
+                                            (4 - (offset % 8))) & 0xf);
+                break;
+        case 8:
+                ret = sprintf(buf, "%u\n", out_mad->data[40 + offset / 8]);
+                break;
+        case 16:
+                ret = sprintf(buf, "%u\n",
+                              be16_to_cpup((__be16 *)(out_mad->data + 40 + offset / 8)));
+                break;
+        case 32:
+                ret = sprintf(buf, "%u\n",
+                              be32_to_cpup((__be32 *)(out_mad->data + 40 + offset / 8)));
+                break;
+        case 64:
+                ret = sprintf(buf, "%llu\n", (unsigned long long)
+                              be64_to_cpup((__be64 *)(out_mad->data + 40 + offset / 8)));
+                break;
+        default:
+                ret = 0;
+        }
 
-	if (!p->ibdev->process_mad)
-		return sprintf(buf, "N/A (no PMA)\n");
-
-	in_mad  = kzalloc(sizeof *in_mad, GFP_KERNEL);
-	out_mad = kmalloc(sizeof *out_mad, GFP_KERNEL);
-	if (!in_mad || !out_mad) {
-		ret = -ENOMEM;
-		goto out;
-	}
+out:
+        kfree(in_mad);
+        kfree(out_mad);
 
-	in_mad->mad_hdr.base_version  = 1;
-	in_mad->mad_hdr.mgmt_class    = IB_MGMT_CLASS_PERF_MGMT;
-	in_mad->mad_hdr.class_version = 1;
-	in_mad->mad_hdr.method        = IB_MGMT_METHOD_GET;
-	in_mad->mad_hdr.attr_id       = cpu_to_be16(0x12); /* PortCounters */
-
-	in_mad->data[41] = p->port_num;	/* PortSelect field */
-
-	if ((p->ibdev->process_mad(p->ibdev, IB_MAD_IGNORE_MKEY,
-		 p->port_num, NULL, NULL, in_mad, out_mad) &
-	     (IB_MAD_RESULT_SUCCESS | IB_MAD_RESULT_REPLY)) !=
-	    (IB_MAD_RESULT_SUCCESS | IB_MAD_RESULT_REPLY)) {
-		ret = -EINVAL;
-		goto out;
-	}
-
-	switch (width) {
-	case 4:
-		ret = sprintf(buf, "%u\n", (out_mad->data[40 + offset / 8] >>
-					    (4 - (offset % 8))) & 0xf);
-		break;
-	case 8:
-		ret = sprintf(buf, "%u\n", out_mad->data[40 + offset / 8]);
-		break;
-	case 16:
-		ret = sprintf(buf, "%u\n",
-			      be16_to_cpup((__be16 *)(out_mad->data + 40 + offset / 8)));
-		break;
-	case 32:
-		ret = sprintf(buf, "%u\n",
-			      be32_to_cpup((__be32 *)(out_mad->data + 40 + offset / 8)));
-		break;
-	default:
-		ret = 0;
-	}
+        return ret;
+}
 
-out:
-	kfree(in_mad);
-	kfree(out_mad);
+#define PORT_PMA_ATTR(_name, _counter, _width, _offset)                 \
+struct port_table_attribute port_pma_attr_##_name = {                   \
+        .attr  = __ATTR(_name, S_IRUGO, show_pma_counter, NULL),        \
+        .index = (_offset) | ((_width) << 16) | ((_counter) << 24)      \
+}
 
-	return ret;
+static ssize_t show_pma_counter(struct ib_port *p, struct port_attribute *attr,
+                                char *buf)
+{
+        return get_pma_counters(p, attr, buf, 0);
 }
 
-static PORT_PMA_ATTR(symbol_error		    ,  0, 16,  32);
-static PORT_PMA_ATTR(link_error_recovery	    ,  1,  8,  48);
-static PORT_PMA_ATTR(link_downed		    ,  2,  8,  56);
-static PORT_PMA_ATTR(port_rcv_errors		    ,  3, 16,  64);
+static PORT_PMA_ATTR(symbol_error                   ,  0, 16,  32);
+static PORT_PMA_ATTR(link_error_recovery            ,  1,  8,  48);
+static PORT_PMA_ATTR(link_downed                    ,  2,  8,  56);
+static PORT_PMA_ATTR(port_rcv_errors                ,  3, 16,  64);
 static PORT_PMA_ATTR(port_rcv_remote_physical_errors,  4, 16,  80);
 static PORT_PMA_ATTR(port_rcv_switch_relay_errors   ,  5, 16,  96);
-static PORT_PMA_ATTR(port_xmit_discards		    ,  6, 16, 112);
+static PORT_PMA_ATTR(port_xmit_discards             ,  6, 16, 112);
 static PORT_PMA_ATTR(port_xmit_constraint_errors    ,  7,  8, 128);
-static PORT_PMA_ATTR(port_rcv_constraint_errors	    ,  8,  8, 136);
+static PORT_PMA_ATTR(port_rcv_constraint_errors     ,  8,  8, 136);
 static PORT_PMA_ATTR(local_link_integrity_errors    ,  9,  4, 152);
 static PORT_PMA_ATTR(excessive_buffer_overrun_errors, 10,  4, 156);
-static PORT_PMA_ATTR(VL15_dropped		    , 11, 16, 176);
-static PORT_PMA_ATTR(port_xmit_data		    , 12, 32, 192);
-static PORT_PMA_ATTR(port_rcv_data		    , 13, 32, 224);
-static PORT_PMA_ATTR(port_xmit_packets		    , 14, 32, 256);
-static PORT_PMA_ATTR(port_rcv_packets		    , 15, 32, 288);
-/*
- * There is no bit allocated for port_xmit_wait in the CounterSelect field
- * (IB spec). However, since this bit is ignored when reading
- * (show_pma_counter), the _counter field of port_xmit_wait can be set to zero.
- */
-static PORT_PMA_ATTR(port_xmit_wait		    ,  0, 32, 320);
+static PORT_PMA_ATTR(VL15_dropped                   , 11, 16, 176);
+static PORT_PMA_ATTR(port_xmit_data                 , 12, 32, 192);
+static PORT_PMA_ATTR(port_rcv_data                  , 13, 32, 224);
+static PORT_PMA_ATTR(port_xmit_packets              , 14, 32, 256);
+static PORT_PMA_ATTR(port_rcv_packets               , 15, 32, 288);
 
 static struct attribute *pma_attrs[] = {
-	&port_pma_attr_symbol_error.attr.attr,
-	&port_pma_attr_link_error_recovery.attr.attr,
-	&port_pma_attr_link_downed.attr.attr,
-	&port_pma_attr_port_rcv_errors.attr.attr,
-	&port_pma_attr_port_rcv_remote_physical_errors.attr.attr,
-	&port_pma_attr_port_rcv_switch_relay_errors.attr.attr,
-	&port_pma_attr_port_xmit_discards.attr.attr,
-	&port_pma_attr_port_xmit_constraint_errors.attr.attr,
-	&port_pma_attr_port_rcv_constraint_errors.attr.attr,
-	&port_pma_attr_local_link_integrity_errors.attr.attr,
-	&port_pma_attr_excessive_buffer_overrun_errors.attr.attr,
-	&port_pma_attr_VL15_dropped.attr.attr,
-	&port_pma_attr_port_xmit_data.attr.attr,
-	&port_pma_attr_port_rcv_data.attr.attr,
-	&port_pma_attr_port_xmit_packets.attr.attr,
-	&port_pma_attr_port_rcv_packets.attr.attr,
-	&port_pma_attr_port_xmit_wait.attr.attr,
-	NULL
+        &port_pma_attr_symbol_error.attr.attr,
+        &port_pma_attr_link_error_recovery.attr.attr,
+        &port_pma_attr_link_downed.attr.attr,
+        &port_pma_attr_port_rcv_errors.attr.attr,
+        &port_pma_attr_port_rcv_remote_physical_errors.attr.attr,
+        &port_pma_attr_port_rcv_switch_relay_errors.attr.attr,
+        &port_pma_attr_port_xmit_discards.attr.attr,
+        &port_pma_attr_port_xmit_constraint_errors.attr.attr,
+        &port_pma_attr_port_rcv_constraint_errors.attr.attr,
+        &port_pma_attr_local_link_integrity_errors.attr.attr,
+        &port_pma_attr_excessive_buffer_overrun_errors.attr.attr,
+        &port_pma_attr_VL15_dropped.attr.attr,
+        &port_pma_attr_port_xmit_data.attr.attr,
+        &port_pma_attr_port_rcv_data.attr.attr,
+        &port_pma_attr_port_xmit_packets.attr.attr,
+        &port_pma_attr_port_rcv_packets.attr.attr,
+        NULL
 };
 
 static struct attribute_group pma_group = {
@@ -411,6 +418,44 @@ static struct attribute_group pma_group 
 	.attrs  = pma_attrs
 };
 
+#define PORT_PMA_ATTR_EXT(_name, _counter, _width, _offset)             \
+struct port_table_attribute port_pma_attr_ext_##_name = {               \
+        .attr  = __ATTR(_name, S_IRUGO, show_pma_counter_ext, NULL),    \
+        .index = (_offset) | ((_width) << 16) | ((_counter) << 24)      \
+}
+
+static ssize_t show_pma_counter_ext(struct ib_port *p,
+                                    struct port_attribute *attr, char *buf)
+{
+        return get_pma_counters(p, attr, buf, 1);
+}
+
+static PORT_PMA_ATTR_EXT(port_xmit_data_64           ,  0, 64,  64);
+static PORT_PMA_ATTR_EXT(port_rcv_data_64            ,  0, 64,  128);
+static PORT_PMA_ATTR_EXT(port_xmit_packets_64        ,  0, 64,  192);
+static PORT_PMA_ATTR_EXT(port_rcv_packets_64         ,  0, 64,  256);
+static PORT_PMA_ATTR_EXT(port_unicast_xmit_packets   ,  0, 64,  320);
+static PORT_PMA_ATTR_EXT(port_unicast_rcv_packets    ,  0, 64,  384);
+static PORT_PMA_ATTR_EXT(port_multicast_xmit_packets ,  0, 64,  448);
+static PORT_PMA_ATTR_EXT(port_multicast_rcv_packets  ,  0, 64,  512);
+
+static struct attribute *pma_attrs_ext[] = {
+        &port_pma_attr_ext_port_xmit_data_64.attr.attr,
+        &port_pma_attr_ext_port_rcv_data_64.attr.attr,
+        &port_pma_attr_ext_port_xmit_packets_64.attr.attr,
+        &port_pma_attr_ext_port_rcv_packets_64.attr.attr,
+        &port_pma_attr_ext_port_unicast_xmit_packets.attr.attr,
+        &port_pma_attr_ext_port_unicast_rcv_packets.attr.attr,
+        &port_pma_attr_ext_port_multicast_xmit_packets.attr.attr,
+        &port_pma_attr_ext_port_multicast_rcv_packets.attr.attr,
+        NULL
+};
+
+static struct attribute_group pma_ext_group = {
+        .name  = "counters_ext",
+        .attrs  = pma_attrs_ext
+};
+
 static void ib_port_release(struct kobject *kobj)
 {
 	struct ib_port *p = container_of(kobj, struct ib_port, kobj);
@@ -503,7 +548,9 @@ err:
 	return NULL;
 }
 
-static int add_port(struct ib_device *device, int port_num)
+static int add_port(struct ib_device *device, int port_num,
+                    int (*port_callback)(struct ib_device *,
+                                         u8, struct kobject *))
 {
 	struct ib_port *p;
 	struct ib_port_attr attr;
@@ -522,7 +569,7 @@ static int add_port(struct ib_device *de
 	p->port_num   = port_num;
 
 	ret = kobject_init_and_add(&p->kobj, &port_type,
-				   device->ports_parent,
+				   kobject_get(device->ports_parent),
 				   "%d", port_num);
 	if (ret)
 		goto err_put;
@@ -531,10 +578,14 @@ static int add_port(struct ib_device *de
 	if (ret)
 		goto err_put;
 
+        ret = sysfs_create_group(&p->kobj, &pma_ext_group);
+        if (ret)
+                goto err_remove_pma;
+
 	p->gid_group.name  = "gids";
 	p->gid_group.attrs = alloc_group_attrs(show_port_gid, attr.gid_tbl_len);
 	if (!p->gid_group.attrs)
-		goto err_remove_pma;
+		goto err_remove_pma_ext;
 
 	ret = sysfs_create_group(&p->kobj, &p->gid_group);
 	if (ret)
@@ -550,6 +601,12 @@ static int add_port(struct ib_device *de
 	if (ret)
 		goto err_free_pkey;
 
+        if (port_callback) {
+                ret = port_callback(device, port_num, &p->kobj);
+                if (ret)
+                        goto err_remove_pkey;
+        }
+
 	list_add_tail(&p->kobj.entry, &device->port_list);
 
 #ifdef __linux__
@@ -557,6 +614,9 @@ static int add_port(struct ib_device *de
 #endif
 	return 0;
 
+err_remove_pkey:
+        sysfs_remove_group(&p->kobj, &p->pkey_group);
+
 err_free_pkey:
 	for (i = 0; i < attr.pkey_tbl_len; ++i)
 		kfree(p->pkey_group.attrs[i]);
@@ -572,6 +632,9 @@ err_free_gid:
 
 	kfree(p->gid_group.attrs);
 
+err_remove_pma_ext:
+        sysfs_remove_group(&p->kobj, &pma_ext_group);
+
 err_remove_pma:
 	sysfs_remove_group(&p->kobj, &pma_group);
 
@@ -786,16 +849,17 @@ static struct attribute_group iw_stats_g
 	.attrs	= iw_proto_stats_attrs,
 };
 
-int ib_device_register_sysfs(struct ib_device *device)
+int ib_device_register_sysfs(struct ib_device *device,
+                                int (*port_callback)(struct ib_device *, u8, struct kobject *))
 {
 	struct device *class_dev = &device->dev;
 	int ret;
 	int i;
 
 	class_dev->class      = &ib_class;
-	class_dev->driver_data = device;
 	class_dev->parent     = device->dma_device;
-	dev_set_name(class_dev, device->name);
+        dev_set_name(class_dev, device->name);
+        dev_set_drvdata(class_dev, device);
 
 	INIT_LIST_HEAD(&device->port_list);
 
@@ -810,19 +874,19 @@ int ib_device_register_sysfs(struct ib_d
 	}
 
 	device->ports_parent = kobject_create_and_add("ports",
-						      &class_dev->kobj);
-	if (!device->ports_parent) {
+                        	        kobject_get(&class_dev->kobj));
+        if (!device->ports_parent) {
 		ret = -ENOMEM;
 		goto err_put;
 	}
 
 	if (device->node_type == RDMA_NODE_IB_SWITCH) {
-		ret = add_port(device, 0);
+		ret = add_port(device, 0, port_callback);
 		if (ret)
 			goto err_put;
 	} else {
 		for (i = 1; i <= device->phys_port_cnt; ++i) {
-			ret = add_port(device, i);
+			ret = add_port(device, i, port_callback);
 			if (ret)
 				goto err_put;
 		}
@@ -864,10 +928,15 @@ void ib_device_unregister_sysfs(struct i
 {
 	struct kobject *p, *t;
 	struct ib_port *port;
+	int i;
 
 	/* Hold kobject until ib_dealloc_device() */
 	kobject_get(&device->dev.kobj);
 
+	for (i = 0; i < ARRAY_SIZE(ib_class_attributes); ++i) {
+			device_remove_file(&device->dev, ib_class_attributes[i]);
+	}
+
 	list_for_each_entry_safe(p, t, &device->port_list, entry) {
 		list_del(&p->entry);
 		port = container_of(p, struct ib_port, kobj);
@@ -891,7 +960,7 @@ void ib_sysfs_cleanup(void)
 	class_unregister(&ib_class);
 }
 
-int ib_sysfs_create_port_files(struct ib_device *device,
+/*int ib_sysfs_create_port_files(struct ib_device *device,
 			       int (*create)(struct ib_device *dev, u8 port_num,
 					     struct kobject *kobj))
 {
@@ -908,4 +977,4 @@ int ib_sysfs_create_port_files(struct ib
 
 	return ret;
 }
-EXPORT_SYMBOL(ib_sysfs_create_port_files);
+EXPORT_SYMBOL(ib_sysfs_create_port_files);*/

Modified: head/sys/ofed/drivers/infiniband/core/uverbs_cmd.c
==============================================================================
--- head/sys/ofed/drivers/infiniband/core/uverbs_cmd.c	Sat Sep 28 23:03:40 2013	(r255931)
+++ head/sys/ofed/drivers/infiniband/core/uverbs_cmd.c	Sun Sep 29 00:35:03 2013	(r255932)
@@ -312,7 +312,7 @@ ssize_t ib_uverbs_get_context(struct ib_
 	INIT_LIST_HEAD(&ucontext->qp_list);
 	INIT_LIST_HEAD(&ucontext->srq_list);
 	INIT_LIST_HEAD(&ucontext->ah_list);
-	INIT_LIST_HEAD(&ucontext->xrc_domain_list);
+	INIT_LIST_HEAD(&ucontext->xrcd_list);
 	ucontext->closing = 0;
 
 	resp.num_comp_vectors = file->device->num_comp_vectors;
@@ -633,7 +633,7 @@ ssize_t ib_uverbs_reg_mr(struct ib_uverb
 	}
 
 	mr = pd->device->reg_user_mr(pd, cmd.start, cmd.length, cmd.hca_va,
-				     cmd.access_flags, &udata);
+				     cmd.access_flags, &udata, 0);
 	if (IS_ERR(mr)) {
 		ret = PTR_ERR(mr);
 		goto err_put;
@@ -1087,7 +1087,7 @@ ssize_t ib_uverbs_create_qp(struct ib_uv
 	attr.srq           = srq;
 	attr.sq_sig_type   = cmd.sq_sig_all ? IB_SIGNAL_ALL_WR : IB_SIGNAL_REQ_WR;
 	attr.qp_type       = cmd.qp_type;
-	attr.xrc_domain    = xrcd;
+	attr.xrcd    = xrcd;
 	attr.create_flags  = 0;
 
 	attr.cap.max_send_wr     = cmd.max_send_wr;
@@ -1115,14 +1115,14 @@ ssize_t ib_uverbs_create_qp(struct ib_uv
 	qp->event_handler = attr.event_handler;
 	qp->qp_context    = attr.qp_context;
 	qp->qp_type	  = attr.qp_type;
-	qp->xrcd	  = attr.xrc_domain;
+	qp->xrcd	  = attr.xrcd;
 	atomic_inc(&pd->usecnt);
 	atomic_inc(&attr.send_cq->usecnt);
 	atomic_inc(&attr.recv_cq->usecnt);
 	if (attr.srq)
 		atomic_inc(&attr.srq->usecnt);
-	else if (attr.xrc_domain)
-		atomic_inc(&attr.xrc_domain->usecnt);
+	else if (attr.xrcd)
+		atomic_inc(&attr.xrcd->usecnt);
 
 	obj->uevent.uobject.object = qp;
 	ret = idr_add_uobj(&ib_uverbs_qp_idr, &obj->uevent.uobject);
@@ -2032,8 +2032,8 @@ ssize_t ib_uverbs_create_srq(struct ib_u
 	srq->uobject       = &obj->uobject;
 	srq->event_handler = attr.event_handler;
 	srq->srq_context   = attr.srq_context;
-	srq->xrc_cq = NULL;
-	srq->xrcd = NULL;
+	srq->ext.xrc.cq = NULL;
+	srq->ext.xrc.xrcd = NULL;
 	atomic_inc(&pd->usecnt);
 	atomic_set(&srq->usecnt, 0);
 
@@ -2083,7 +2083,7 @@ ssize_t ib_uverbs_create_xrc_srq(struct 
 			     const char __user *buf, int in_len,
 			     int out_len)
 {
-	struct ib_uverbs_create_xrc_srq  cmd;
+	struct ib_uverbs_create_xsrq  cmd;
 	struct ib_uverbs_create_srq_resp resp;
 	struct ib_udata			 udata;
 	struct ib_uevent_object		*obj;
@@ -2119,7 +2119,7 @@ ssize_t ib_uverbs_create_xrc_srq(struct 
 		goto err;
 	}
 
-	xrc_cq  = idr_read_cq(cmd.xrc_cq, file->ucontext, 0);
+	xrc_cq  = idr_read_cq(cmd.cq_handle, file->ucontext, 0);
 	if (!xrc_cq) {
 		ret = -EINVAL;
 		goto err_put_pd;
@@ -2152,8 +2152,8 @@ ssize_t ib_uverbs_create_xrc_srq(struct 
 	srq->uobject	   = &obj->uobject;
 	srq->event_handler = attr.event_handler;
 	srq->srq_context   = attr.srq_context;
-	srq->xrc_cq	   = xrc_cq;
-	srq->xrcd	   = xrcd;
+	srq->ext.xrc.cq	   = xrc_cq;
+	srq->ext.xrc.xrcd	   = xrcd;
 	atomic_inc(&pd->usecnt);
 	atomic_inc(&xrc_cq->usecnt);
 	atomic_inc(&xrcd->usecnt);
@@ -2528,7 +2528,7 @@ ssize_t ib_uverbs_open_xrc_domain(struct
 	INIT_LIST_HEAD(&xrcd_uobj->xrc_reg_qp_list);
 
 	mutex_lock(&file->mutex);
-	list_add_tail(&uobj->list, &file->ucontext->xrc_domain_list);
+	list_add_tail(&uobj->list, &file->ucontext->xrcd_list);
 	mutex_unlock(&file->mutex);
 
 	uobj->live = 1;
@@ -2598,7 +2598,7 @@ ssize_t ib_uverbs_close_xrc_domain(struc
 	if (!ret) {
 		list_for_each_entry(t_uobj, &file->ucontext->srq_list, list) {
 			struct ib_srq *srq = t_uobj->object;
-			if (srq->xrcd && srq->xrcd == uobj->object) {
+			if (srq->ext.xrc.xrcd && srq->ext.xrc.xrcd == uobj->object) {
 				ret = -EBUSY;
 				break;
 			}
@@ -2702,7 +2702,7 @@ ssize_t ib_uverbs_create_xrc_rcv_qp(stru
 	init_attr.sq_sig_type	=
 		cmd.sq_sig_all ? IB_SIGNAL_ALL_WR : IB_SIGNAL_REQ_WR;
 	init_attr.qp_type	= IB_QPT_XRC;
-	init_attr.xrc_domain	= xrcd;
+	init_attr.xrcd	= xrcd;
 
 	init_attr.cap.max_send_wr	= 1;
 	init_attr.cap.max_recv_wr	= 0;

Modified: head/sys/ofed/drivers/infiniband/core/uverbs_main.c
==============================================================================
--- head/sys/ofed/drivers/infiniband/core/uverbs_main.c	Sat Sep 28 23:03:40 2013	(r255931)
+++ head/sys/ofed/drivers/infiniband/core/uverbs_main.c	Sun Sep 29 00:35:03 2013	(r255932)
@@ -110,8 +110,8 @@ static ssize_t (*uverbs_cmd_table[])(str
 	[IB_USER_VERBS_CMD_QUERY_SRQ]     	= ib_uverbs_query_srq,
 	[IB_USER_VERBS_CMD_DESTROY_SRQ]   	= ib_uverbs_destroy_srq,
 	[IB_USER_VERBS_CMD_CREATE_XRC_SRQ]	= ib_uverbs_create_xrc_srq,
-	[IB_USER_VERBS_CMD_OPEN_XRC_DOMAIN]	= ib_uverbs_open_xrc_domain,
-	[IB_USER_VERBS_CMD_CLOSE_XRC_DOMAIN]	= ib_uverbs_close_xrc_domain,
+	[IB_USER_VERBS_CMD_OPEN_XRCD]	        = ib_uverbs_open_xrc_domain,
+	[IB_USER_VERBS_CMD_CLOSE_XRCD]	        = ib_uverbs_close_xrc_domain,
 	[IB_USER_VERBS_CMD_CREATE_XRC_RCV_QP]	= ib_uverbs_create_xrc_rcv_qp,
 	[IB_USER_VERBS_CMD_MODIFY_XRC_RCV_QP]	= ib_uverbs_modify_xrc_rcv_qp,
 	[IB_USER_VERBS_CMD_QUERY_XRC_RCV_QP]	= ib_uverbs_query_xrc_rcv_qp,
@@ -258,7 +258,7 @@ static int ib_uverbs_cleanup_ucontext(st
 	}

*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***


More information about the svn-src-all mailing list