svn commit: r277302 - in head/sys: conf modules modules/ibcore modules/ipoib modules/linuxapi modules/mlx4 modules/mlx4ib ofed/drivers/infiniband/core ofed/drivers/infiniband/hw/mlx4 ofed/drivers/i...

Hans Petter Selasky hselasky at FreeBSD.org
Sat Jan 17 16:36:44 UTC 2015


Author: hselasky
Date: Sat Jan 17 16:36:39 2015
New Revision: 277302
URL: https://svnweb.freebsd.org/changeset/base/277302

Log:
  Start importing the basic OFED linux compatibility layer changes made
  by dumbbell@ to be able to compile this layer as a dependency module.
  Clean up some Makefiles and remove the no longer used OFED define.
  Currently only i386 and amd64 targets are supported.
  
  MFC after:		1 month
  Sponsored by:		Mellanox Technologies

Added:
  head/sys/modules/linuxapi/
  head/sys/modules/linuxapi/Makefile   (contents, props changed)
  head/sys/ofed/include/linux/linux_kmod.c   (contents, props changed)
  head/sys/ofed/include/linux/linux_pci.c   (contents, props changed)
Modified:
  head/sys/conf/files
  head/sys/conf/options
  head/sys/modules/Makefile
  head/sys/modules/ibcore/Makefile
  head/sys/modules/ipoib/Makefile
  head/sys/modules/mlx4/Makefile
  head/sys/modules/mlx4ib/Makefile
  head/sys/ofed/drivers/infiniband/core/device.c
  head/sys/ofed/drivers/infiniband/hw/mlx4/main.c
  head/sys/ofed/drivers/infiniband/ulp/ipoib/ipoib_main.c
  head/sys/ofed/drivers/net/mlx4/en_main.c
  head/sys/ofed/drivers/net/mlx4/main.c
  head/sys/ofed/include/linux/linux_compat.c
  head/sys/ofed/include/linux/pci.h

Modified: head/sys/conf/files
==============================================================================
--- head/sys/conf/files	Sat Jan 17 15:19:18 2015	(r277301)
+++ head/sys/conf/files	Sat Jan 17 16:36:39 2015	(r277302)
@@ -3571,13 +3571,13 @@ nlm/nlm_prot_svc.c		optional nfslockd | 
 nlm/nlm_prot_xdr.c		optional nfslockd | nfsd
 nlm/sm_inter_xdr.c		optional nfslockd | nfsd
 
+# Linux Kernel Compatibility API
+ofed/include/linux/linux_kmod.c			optional ofed | compat_linuxapi
+ofed/include/linux/linux_compat.c		optional ofed | compat_linuxapi
+ofed/include/linux/linux_pci.c			optional ofed | compat_linuxapi
+ofed/include/linux/linux_idr.c			optional ofed | compat_linuxapi
+ofed/include/linux/linux_radix.c		optional ofed | compat_linuxapi
 # OpenFabrics Enterprise Distribution (Infiniband)
-ofed/include/linux/linux_compat.c		optional ofed		\
-	no-depend compile-with "${OFED_C}"
-ofed/include/linux/linux_idr.c			optional ofed		\
-	no-depend compile-with "${OFED_C}"
-ofed/include/linux/linux_radix.c		optional ofed		\
-	no-depend compile-with "${OFED_C}"
 ofed/drivers/infiniband/core/addr.c		optional ofed		\
 	no-depend							\
 	compile-with "${OFED_C} -I$S/ofed/drivers/infiniband/core/"

Modified: head/sys/conf/options
==============================================================================
--- head/sys/conf/options	Sat Jan 17 15:19:18 2015	(r277301)
+++ head/sys/conf/options	Sat Jan 17 16:36:39 2015	(r277302)
@@ -85,6 +85,7 @@ COMPAT_FREEBSD6	opt_compat.h
 COMPAT_FREEBSD7	opt_compat.h
 COMPAT_FREEBSD9	opt_compat.h
 COMPAT_FREEBSD10	opt_compat.h
+COMPAT_LINUXAPI	opt_compat.h
 COMPILING_LINT	opt_global.h
 COMPRESS_USER_CORES opt_core.h
 CY_PCI_FASTINTR
@@ -907,7 +908,6 @@ FDT		opt_platform.h
 FDT_DTB_STATIC	opt_platform.h
 
 # OFED Infiniband stack
-OFED		opt_ofed.h
 OFED_DEBUG_INIT	opt_ofed.h
 SDP		opt_ofed.h
 SDP_DEBUG	opt_ofed.h

Modified: head/sys/modules/Makefile
==============================================================================
--- head/sys/modules/Makefile	Sat Jan 17 15:19:18 2015	(r277301)
+++ head/sys/modules/Makefile	Sat Jan 17 16:36:39 2015	(r277302)
@@ -198,6 +198,7 @@ SUBDIR=	\
 	${_linprocfs} \
 	${_linsysfs} \
 	${_linux} \
+	${_linuxapi} \
 	lmc \
 	lpt \
 	mac_biba \
@@ -501,6 +502,7 @@ _ipoib=         ipoib
 _linprocfs=	linprocfs
 _linsysfs=	linsysfs
 _linux=		linux
+_linuxapi=	linuxapi
 _ndis=		ndis
 .if ${MK_CDDL} != "no" || defined(ALL_MODULES)
 _opensolaris=	opensolaris

Modified: head/sys/modules/ibcore/Makefile
==============================================================================
--- head/sys/modules/ibcore/Makefile	Sat Jan 17 15:19:18 2015	(r277301)
+++ head/sys/modules/ibcore/Makefile	Sat Jan 17 16:36:39 2015	(r277302)
@@ -2,19 +2,19 @@
 .PATH:  ${.CURDIR}/../../ofed/drivers/infiniband/core
 .PATH:  ${.CURDIR}/../../ofed/include/linux
 
-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 opt_inet6.h
+KMOD=	ibcore
+SRCS=	addr.c iwcm.c sa_query.c ucma.c uverbs_cmd.c \
+	agent.c local_sa.c multicast.c smi.c ud_header.c uverbs_main.c \
+	mad.c notice.c umem.c uverbs_marshall.c \
+	cache.c device.c packer.c sysfs.c user_mad.c verbs.c \
+	cm.c fmr_pool.c mad_rmpp.c ucm.c cma.c \
+	vnode_if.h device_if.h bus_if.h pci_if.h \
+	opt_inet.h opt_inet6.h
 
 CFLAGS+= -I${.CURDIR}/../../ofed/drivers/infiniband/core
 CFLAGS+= -I${.CURDIR}/../mlx4ib
 CFLAGS+= -I${.CURDIR}/../../ofed/include/
-CFLAGS+= -DINET6 -DINET -DOFED
+CFLAGS+= -DINET6 -DINET
 
 .include <bsd.kmod.mk>
 

Modified: head/sys/modules/ipoib/Makefile
==============================================================================
--- head/sys/modules/ipoib/Makefile	Sat Jan 17 15:19:18 2015	(r277301)
+++ head/sys/modules/ipoib/Makefile	Sat Jan 17 16:36:39 2015	(r277302)
@@ -2,15 +2,16 @@
 .PATH:  ${.CURDIR}/../../ofed/drivers/infiniband/ulp/ipoib
 .PATH:  ${.CURDIR}/../../ofed/include/linux
 
-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
+KMOD=	ipoib
+SRCS=	device_if.h bus_if.h vnode_if.h pci_if.h \
+	opt_inet.h opt_inet6.h opt_ofed.h \
+	ipoib_cm.c ipoib_ib.c ipoib_main.c \
+	ipoib_multicast.c ipoib_verbs.c
 
 CFLAGS+= -I${.CURDIR}/../../ofed/drivers/infiniband/ulp/ipoib
 CFLAGS+= -I${.CURDIR}/../ibcore
 CFLAGS+= -I${.CURDIR}/../../ofed/include/
-CFLAGS+= -DINET6 -DINET -DOFED
+CFLAGS+= -DINET6 -DINET
 
 .include <bsd.kmod.mk>
 

Added: head/sys/modules/linuxapi/Makefile
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/sys/modules/linuxapi/Makefile	Sat Jan 17 16:36:39 2015	(r277302)
@@ -0,0 +1,18 @@
+# $FreeBSD$
+.PATH:	${.CURDIR}/../../ofed/include/linux
+
+KMOD=	linuxapi
+SRCS=	linux_kmod.c \
+	linux_compat.c \
+	linux_pci.c \
+	linux_radix.c \
+	linux_idr.c
+
+SRCS+=	bus_if.h \
+	device_if.h \
+	pci_if.h \
+	vnode_if.h
+
+CFLAGS+= -I${.CURDIR}/../../ofed/include/
+
+.include <bsd.kmod.mk>

Modified: head/sys/modules/mlx4/Makefile
==============================================================================
--- head/sys/modules/mlx4/Makefile	Sat Jan 17 15:19:18 2015	(r277301)
+++ head/sys/modules/mlx4/Makefile	Sat Jan 17 16:36:39 2015	(r277302)
@@ -1,10 +1,14 @@
 # $FreeBSD$
 .PATH:  ${.CURDIR}/../../ofed/drivers/net/mlx4
 .PATH:  ${.CURDIR}/../../ofed/include/linux
-KMOD    = mlx4
-SRCS    = device_if.h bus_if.h pci_if.h vnode_if.h 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
+
+KMOD=	mlx4
+SRCS=	device_if.h bus_if.h vnode_if.h pci_if.h \
+	opt_inet.h opt_inet6.h \
+	alloc.c catas.c cmd.c cq.c eq.c \
+	fw.c icm.c intf.c main.c mcg.c mr.c \
+	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 Jan 17 15:19:18 2015	(r277301)
+++ head/sys/modules/mlx4ib/Makefile	Sat Jan 17 16:36:39 2015	(r277302)
@@ -2,18 +2,16 @@
 .PATH:  ${.CURDIR}/../../ofed/drivers/infiniband/hw/mlx4
 .PATH:  ${.CURDIR}/../../ofed/include/linux
 
-KMOD    = mlx4ib
-SRCS    = device_if.h bus_if.h pci_if.h vnode_if.h
-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
+KMOD=	mlx4ib
+SRCS=	device_if.h bus_if.h vnode_if.h pci_if.h \
+	opt_inet.h opt_inet6.h \
+	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
 
-#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
+CFLAGS+= -DINET6 -DINET
 CFLAGS+= -fms-extensions
 
 .include <bsd.kmod.mk>

Modified: head/sys/ofed/drivers/infiniband/core/device.c
==============================================================================
--- head/sys/ofed/drivers/infiniband/core/device.c	Sat Jan 17 15:19:18 2015	(r277301)
+++ head/sys/ofed/drivers/infiniband/core/device.c	Sat Jan 17 16:36:39 2015	(r277302)
@@ -768,4 +768,5 @@ static moduledata_t ibcore_mod = {
 };
 
 MODULE_VERSION(ibcore, 1);
+MODULE_DEPEND(ibcore, linuxapi, 1, 1, 1);
 DECLARE_MODULE(ibcore, ibcore_mod, SI_SUB_SMP, SI_ORDER_ANY);

Modified: head/sys/ofed/drivers/infiniband/hw/mlx4/main.c
==============================================================================
--- head/sys/ofed/drivers/infiniband/hw/mlx4/main.c	Sat Jan 17 15:19:18 2015	(r277301)
+++ head/sys/ofed/drivers/infiniband/hw/mlx4/main.c	Sat Jan 17 16:36:39 2015	(r277302)
@@ -2420,3 +2420,4 @@ static moduledata_t mlx4ib_mod = {
 DECLARE_MODULE(mlx4ib, mlx4ib_mod, SI_SUB_OFED_PREINIT, SI_ORDER_ANY);
 MODULE_DEPEND(mlx4ib, mlx4, 1, 1, 1);
 MODULE_DEPEND(mlx4ib, ibcore, 1, 1, 1);
+MODULE_DEPEND(mlx4ib, linuxapi, 1, 1, 1);

Modified: head/sys/ofed/drivers/infiniband/ulp/ipoib/ipoib_main.c
==============================================================================
--- head/sys/ofed/drivers/infiniband/ulp/ipoib/ipoib_main.c	Sat Jan 17 15:19:18 2015	(r277301)
+++ head/sys/ofed/drivers/infiniband/ulp/ipoib/ipoib_main.c	Sat Jan 17 16:36:39 2015	(r277302)
@@ -1542,4 +1542,4 @@ static moduledata_t ipoib_mod = {
 
 DECLARE_MODULE(ipoib, ipoib_mod, SI_SUB_SMP, SI_ORDER_ANY);
 MODULE_DEPEND(ipoib, ibcore, 1, 1, 1);
-
+MODULE_DEPEND(ipoib, linuxapi, 1, 1, 1);

Modified: head/sys/ofed/drivers/net/mlx4/en_main.c
==============================================================================
--- head/sys/ofed/drivers/net/mlx4/en_main.c	Sat Jan 17 15:19:18 2015	(r277301)
+++ head/sys/ofed/drivers/net/mlx4/en_main.c	Sat Jan 17 16:36:39 2015	(r277302)
@@ -349,3 +349,4 @@ static moduledata_t mlxen_mod = {
 };
 DECLARE_MODULE(mlxen, mlxen_mod, SI_SUB_OFED_PREINIT, SI_ORDER_ANY);
 MODULE_DEPEND(mlxen, mlx4, 1, 1, 1);
+MODULE_DEPEND(mlxen, linuxapi, 1, 1, 1);

Modified: head/sys/ofed/drivers/net/mlx4/main.c
==============================================================================
--- head/sys/ofed/drivers/net/mlx4/main.c	Sat Jan 17 15:19:18 2015	(r277301)
+++ head/sys/ofed/drivers/net/mlx4/main.c	Sat Jan 17 16:36:39 2015	(r277302)
@@ -3796,3 +3796,5 @@ static moduledata_t mlx4_mod = {
 };
 MODULE_VERSION(mlx4, 1);
 DECLARE_MODULE(mlx4, mlx4_mod, SI_SUB_OFED_PREINIT, SI_ORDER_ANY);
+MODULE_DEPEND(mlx4, linuxapi, 1, 1, 1);
+

Modified: head/sys/ofed/include/linux/linux_compat.c
==============================================================================
--- head/sys/ofed/include/linux/linux_compat.c	Sat Jan 17 15:19:18 2015	(r277301)
+++ head/sys/ofed/include/linux/linux_compat.c	Sat Jan 17 16:36:39 2015	(r277302)
@@ -343,7 +343,8 @@ linux_dev_read(struct cdev *dev, struct 
 		bytes = filp->f_op->read(filp, uio->uio_iov->iov_base,
 		    uio->uio_iov->iov_len, &uio->uio_offset);
 		if (bytes >= 0) {
-			uio->uio_iov->iov_base += bytes;
+			uio->uio_iov->iov_base =
+			    ((uint8_t *)uio->uio_iov->iov_base) + bytes;
 			uio->uio_iov->iov_len -= bytes;
 			uio->uio_resid -= bytes;
 		} else
@@ -377,7 +378,8 @@ linux_dev_write(struct cdev *dev, struct
 		bytes = filp->f_op->write(filp, uio->uio_iov->iov_base,
 		    uio->uio_iov->iov_len, &uio->uio_offset);
 		if (bytes >= 0) {
-			uio->uio_iov->iov_base += bytes;
+			uio->uio_iov->iov_base =
+			    ((uint8_t *)uio->uio_iov->iov_base) + bytes;
 			uio->uio_iov->iov_len -= bytes;
 			uio->uio_resid -= bytes;
 		} else
@@ -498,7 +500,8 @@ linux_file_read(struct file *file, struc
 		bytes = filp->f_op->read(filp, uio->uio_iov->iov_base,
 		    uio->uio_iov->iov_len, &uio->uio_offset);
 		if (bytes >= 0) {
-			uio->uio_iov->iov_base += bytes;
+			uio->uio_iov->iov_base =
+			    ((uint8_t *)uio->uio_iov->iov_base) + bytes;
 			uio->uio_iov->iov_len -= bytes;
 			uio->uio_resid -= bytes;
 		} else
@@ -736,7 +739,6 @@ linux_compat_init(void)
 	for (i = 0; i < VMMAP_HASH_SIZE; i++)
 		LIST_INIT(&vmmaphead[i]);
 }
-
 SYSINIT(linux_compat, SI_SUB_DRIVERS, SI_ORDER_SECOND, linux_compat_init, NULL);
 
 static void

Added: head/sys/ofed/include/linux/linux_kmod.c
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/sys/ofed/include/linux/linux_kmod.c	Sat Jan 17 16:36:39 2015	(r277302)
@@ -0,0 +1,33 @@
+/* $FreeBSD$ */
+/*-
+ * Copyright (c) 2015 Mellanox Technologies, Ltd.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice unmodified, this list of conditions, and the following
+ *    disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/param.h>
+#include <sys/module.h>
+
+MODULE_VERSION(linuxapi, 1);
+MODULE_DEPEND(linuxapi, pci, 1, 1, 1);
+

Added: head/sys/ofed/include/linux/linux_pci.c
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/sys/ofed/include/linux/linux_pci.c	Sat Jan 17 16:36:39 2015	(r277302)
@@ -0,0 +1,206 @@
+/* $FreeBSD$ */
+/*-
+ * Copyright (c) 2015 Mellanox Technologies, Ltd.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice unmodified, this list of conditions, and the following
+ *    disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/malloc.h>
+#include <sys/kernel.h>
+#include <sys/sysctl.h>
+#include <sys/lock.h>
+#include <sys/mutex.h>
+#include <sys/bus.h>
+#include <sys/fcntl.h>
+#include <sys/file.h>
+#include <sys/filio.h>
+#include <sys/rwlock.h>
+
+#include <vm/vm.h>
+#include <vm/pmap.h>
+
+#include <machine/stdarg.h>
+#include <machine/pmap.h>
+
+#include <linux/kobject.h>
+#include <linux/device.h>
+#include <linux/slab.h>
+#include <linux/module.h>
+#include <linux/cdev.h>
+#include <linux/file.h>
+#include <linux/sysfs.h>
+#include <linux/mm.h>
+#include <linux/io.h>
+#include <linux/vmalloc.h>
+#include <linux/pci.h>
+
+static device_probe_t linux_pci_probe;
+static device_attach_t linux_pci_attach;
+static device_detach_t linux_pci_detach;
+
+static device_method_t pci_methods[] = {
+	DEVMETHOD(device_probe, linux_pci_probe),
+	DEVMETHOD(device_attach, linux_pci_attach),
+	DEVMETHOD(device_detach, linux_pci_detach),
+	DEVMETHOD_END
+};
+
+static struct pci_driver *
+linux_pci_find(device_t dev, const struct pci_device_id **idp)
+{
+	const struct pci_device_id *id;
+	struct pci_driver *pdrv;
+	uint16_t vendor;
+	uint16_t device;
+
+	vendor = pci_get_vendor(dev);
+	device = pci_get_device(dev);
+
+	spin_lock(&pci_lock);
+	list_for_each_entry(pdrv, &pci_drivers, links) {
+		for (id = pdrv->id_table; id->vendor != 0; id++) {
+			if (vendor == id->vendor && device == id->device) {
+				*idp = id;
+				spin_unlock(&pci_lock);
+				return (pdrv);
+			}
+		}
+	}
+	spin_unlock(&pci_lock);
+	return (NULL);
+}
+
+static int
+linux_pci_probe(device_t dev)
+{
+	const struct pci_device_id *id;
+	struct pci_driver *pdrv;
+
+	if ((pdrv = linux_pci_find(dev, &id)) == NULL)
+		return (ENXIO);
+	if (device_get_driver(dev) != &pdrv->driver)
+		return (ENXIO);
+	device_set_desc(dev, pdrv->name);
+	return (0);
+}
+
+static int
+linux_pci_attach(device_t dev)
+{
+	struct resource_list_entry *rle;
+	struct pci_dev *pdev;
+	struct pci_driver *pdrv;
+	const struct pci_device_id *id;
+	int error;
+
+	pdrv = linux_pci_find(dev, &id);
+	pdev = device_get_softc(dev);
+	pdev->dev.parent = &linux_rootdev;
+	pdev->dev.bsddev = dev;
+	INIT_LIST_HEAD(&pdev->dev.irqents);
+	pdev->device = id->device;
+	pdev->vendor = id->vendor;
+	pdev->dev.dma_mask = &pdev->dma_mask;
+	pdev->pdrv = pdrv;
+	kobject_init(&pdev->dev.kobj, &dev_ktype);
+	kobject_set_name(&pdev->dev.kobj, device_get_nameunit(dev));
+	kobject_add(&pdev->dev.kobj, &linux_rootdev.kobj,
+	    kobject_name(&pdev->dev.kobj));
+	rle = _pci_get_rle(pdev, SYS_RES_IRQ, 0);
+	if (rle)
+		pdev->dev.irq = rle->start;
+	else
+		pdev->dev.irq = 0;
+	pdev->irq = pdev->dev.irq;
+	mtx_unlock(&Giant);
+	spin_lock(&pci_lock);
+	list_add(&pdev->links, &pci_devices);
+	spin_unlock(&pci_lock);
+	error = pdrv->probe(pdev, id);
+	mtx_lock(&Giant);
+	if (error) {
+		spin_lock(&pci_lock);
+		list_del(&pdev->links);
+		spin_unlock(&pci_lock);
+		put_device(&pdev->dev);
+		return (-error);
+	}
+	return (0);
+}
+
+static int
+linux_pci_detach(device_t dev)
+{
+	struct pci_dev *pdev;
+
+	pdev = device_get_softc(dev);
+	mtx_unlock(&Giant);
+	pdev->pdrv->remove(pdev);
+	mtx_lock(&Giant);
+	spin_lock(&pci_lock);
+	list_del(&pdev->links);
+	spin_unlock(&pci_lock);
+	put_device(&pdev->dev);
+
+	return (0);
+}
+
+int
+pci_register_driver(struct pci_driver *pdrv)
+{
+	devclass_t bus;
+	int error = 0;
+
+	bus = devclass_find("pci");
+
+	spin_lock(&pci_lock);
+	list_add(&pdrv->links, &pci_drivers);
+	spin_unlock(&pci_lock);
+	pdrv->driver.name = pdrv->name;
+	pdrv->driver.methods = pci_methods;
+	pdrv->driver.size = sizeof(struct pci_dev);
+	mtx_lock(&Giant);
+	if (bus != NULL) {
+		error = devclass_add_driver(bus, &pdrv->driver, BUS_PASS_DEFAULT,
+		    &pdrv->bsdclass);
+	}
+	mtx_unlock(&Giant);
+	return (-error);
+}
+
+void
+pci_unregister_driver(struct pci_driver *pdrv)
+{
+	devclass_t bus;
+
+	bus = devclass_find("pci");
+
+	list_del(&pdrv->links);
+	mtx_lock(&Giant);
+	if (bus != NULL)
+		devclass_delete_driver(bus, &pdrv->driver);
+	mtx_unlock(&Giant);
+}
+

Modified: head/sys/ofed/include/linux/pci.h
==============================================================================
--- head/sys/ofed/include/linux/pci.h	Sat Jan 17 15:19:18 2015	(r277301)
+++ head/sys/ofed/include/linux/pci.h	Sat Jan 17 16:36:39 2015	(r277302)
@@ -409,146 +409,8 @@ pci_write_config_dword(struct pci_dev *p
 	return (0);
 }
 
-static struct pci_driver *
-linux_pci_find(device_t dev, const struct pci_device_id **idp)
-{
-	const struct pci_device_id *id;
-	struct pci_driver *pdrv;
-	uint16_t vendor;
-	uint16_t device;
-
-	vendor = pci_get_vendor(dev);
-	device = pci_get_device(dev);
-
-	spin_lock(&pci_lock);
-	list_for_each_entry(pdrv, &pci_drivers, links) {
-		for (id = pdrv->id_table; id->vendor != 0; id++) {
-			if (vendor == id->vendor && device == id->device) {
-				*idp = id;
-				spin_unlock(&pci_lock);
-				return (pdrv);
-			}
-		}
-	}
-	spin_unlock(&pci_lock);
-	return (NULL);
-}
-
-static inline int
-linux_pci_probe(device_t dev)
-{
-	const struct pci_device_id *id;
-	struct pci_driver *pdrv;
-
-	if ((pdrv = linux_pci_find(dev, &id)) == NULL)
-		return (ENXIO);
-	if (device_get_driver(dev) != &pdrv->driver)
-		return (ENXIO);
-	device_set_desc(dev, pdrv->name);
-	return (0);
-}
-
-static inline int
-linux_pci_attach(device_t dev)
-{
-	struct resource_list_entry *rle;
-	struct pci_dev *pdev;
-	struct pci_driver *pdrv;
-	const struct pci_device_id *id;
-	int error;
-
-	pdrv = linux_pci_find(dev, &id);
-	pdev = device_get_softc(dev);
-	pdev->dev.parent = &linux_rootdev;
-	pdev->dev.bsddev = dev;
-	INIT_LIST_HEAD(&pdev->dev.irqents);
-	pdev->device = id->device;
-	pdev->vendor = id->vendor;
-	pdev->dev.dma_mask = &pdev->dma_mask;
-	pdev->pdrv = pdrv;
-	kobject_init(&pdev->dev.kobj, &dev_ktype);
-	kobject_set_name(&pdev->dev.kobj, device_get_nameunit(dev));
-	kobject_add(&pdev->dev.kobj, &linux_rootdev.kobj,
-	    kobject_name(&pdev->dev.kobj));
-	rle = _pci_get_rle(pdev, SYS_RES_IRQ, 0);
-	if (rle)
-		pdev->dev.irq = rle->start;
-	else
-		pdev->dev.irq = 0;
-	pdev->irq = pdev->dev.irq;
-	mtx_unlock(&Giant);
-	spin_lock(&pci_lock);
-	list_add(&pdev->links, &pci_devices);
-	spin_unlock(&pci_lock);
-	error = pdrv->probe(pdev, id);
-	mtx_lock(&Giant);
-	if (error) {
-		spin_lock(&pci_lock);
-		list_del(&pdev->links);
-		spin_unlock(&pci_lock);
-		put_device(&pdev->dev);
-		return (-error);
-	}
-	return (0);
-}
-
-static inline int
-linux_pci_detach(device_t dev)
-{
-	struct pci_dev *pdev;
-
-	pdev = device_get_softc(dev);
-	mtx_unlock(&Giant);
-	pdev->pdrv->remove(pdev);
-	mtx_lock(&Giant);
-	spin_lock(&pci_lock);
-	list_del(&pdev->links);
-	spin_unlock(&pci_lock);
-	put_device(&pdev->dev);
-
-	return (0);
-}
-
-static device_method_t pci_methods[] = {
-	DEVMETHOD(device_probe, linux_pci_probe),
-	DEVMETHOD(device_attach, linux_pci_attach),
-	DEVMETHOD(device_detach, linux_pci_detach),
-	{0, 0}
-};
-
-static inline int
-pci_register_driver(struct pci_driver *pdrv)
-{
-	devclass_t bus;
-	int error;
-
-	spin_lock(&pci_lock);
-	list_add(&pdrv->links, &pci_drivers);
-	spin_unlock(&pci_lock);
-	bus = devclass_find("pci");
-	pdrv->driver.name = pdrv->name;
-	pdrv->driver.methods = pci_methods;
-	pdrv->driver.size = sizeof(struct pci_dev);
-	mtx_lock(&Giant);
-	error = devclass_add_driver(bus, &pdrv->driver, BUS_PASS_DEFAULT,
-	    &pdrv->bsdclass);
-	mtx_unlock(&Giant);
-	if (error)
-		return (-error);
-	return (0);
-}
-
-static inline void
-pci_unregister_driver(struct pci_driver *pdrv)
-{
-	devclass_t bus;
-
-	list_del(&pdrv->links);
-	bus = devclass_find("pci");
-	mtx_lock(&Giant);
-	devclass_delete_driver(bus, &pdrv->driver);
-	mtx_unlock(&Giant);
-}
+extern int pci_register_driver(struct pci_driver *pdrv);
+extern void pci_unregister_driver(struct pci_driver *pdrv);
 
 struct msix_entry {
 	int entry;
@@ -837,5 +699,4 @@ static inline int pcie_capability_write_
         return pci_write_config_word(dev, pci_pcie_cap(dev) + pos, val);
 }
 
-
 #endif	/* _LINUX_PCI_H_ */


More information about the svn-src-head mailing list