summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Burnicki <martin.burnicki@meinberg.de>2011-03-29 12:01:00 +0200
committerMartin Burnicki <martin.burnicki@meinberg.de>2011-03-29 12:01:00 +0200
commite298aa8eae6cd5d53e7579ce9ac49c58d496b7e6 (patch)
tree122b309177b2dcc8424076f20444de5937f54fda
parent6876bb99175610e97837b5448e3aacddad83bfe3 (diff)
downloadmbgtools-nbsd-e298aa8eae6cd5d53e7579ce9ac49c58d496b7e6.tar.gz
mbgtools-nbsd-e298aa8eae6cd5d53e7579ce9ac49c58d496b7e6.zip
Update files from mbgtools-nbsd-20110329.tgzmbgtools-nbsd-20110329
-rw-r--r--[-rwxr-xr-x]src/external/bsd/meinberg/Makefile0
-rw-r--r--[-rwxr-xr-x]src/external/bsd/meinberg/Makefile.inc0
-rwxr-xr-xsrc/external/bsd/meinberg/dist/mbgclock/Makefile48
-rwxr-xr-xsrc/external/bsd/meinberg/dist/mbgclock/Makefile.nbsd48
-rwxr-xr-xsrc/external/bsd/meinberg/dist/mbgclock/mbgdrvr.c725
-rw-r--r--[-rwxr-xr-x]src/external/bsd/meinberg/mbgclock/Makefile0
-rw-r--r--[-rwxr-xr-x]src/external/bsd/meinberg/mbgclock/Makefile.kmod0
-rw-r--r--[-rwxr-xr-x]src/external/bsd/meinberg/mbgclock/files.mbgclock0
-rw-r--r--[-rwxr-xr-x]src/external/bsd/meinberg/mbgclock/mbgclockdrvr.c70
9 files changed, 883 insertions, 8 deletions
diff --git a/src/external/bsd/meinberg/Makefile b/src/external/bsd/meinberg/Makefile
index 346d99a..346d99a 100755..100644
--- a/src/external/bsd/meinberg/Makefile
+++ b/src/external/bsd/meinberg/Makefile
diff --git a/src/external/bsd/meinberg/Makefile.inc b/src/external/bsd/meinberg/Makefile.inc
index f169b5c..f169b5c 100755..100644
--- a/src/external/bsd/meinberg/Makefile.inc
+++ b/src/external/bsd/meinberg/Makefile.inc
diff --git a/src/external/bsd/meinberg/dist/mbgclock/Makefile b/src/external/bsd/meinberg/dist/mbgclock/Makefile
new file mode 100755
index 0000000..7dd2450
--- /dev/null
+++ b/src/external/bsd/meinberg/dist/mbgclock/Makefile
@@ -0,0 +1,48 @@
+
+#########################################################################
+#
+# $Id: Makefile 1.1.1.4 2011/02/03 14:10:39 martin TEST martin $
+#
+# Description:
+# Makefile for mbgclock driver to support Meinberg bus level
+# devices under FreeBSD.
+#
+# -----------------------------------------------------------------------
+# $Log: Makefile $
+# Revision 1.1.1.4 2011/02/03 14:10:39 martin
+# Revision 1.1.1.3 2011/01/26 17:38:58 martin
+# Add support for DEBUG build.
+# Revision 1.1.1.2 2011/01/26 16:36:37 martin
+# Enabled all required source files.
+# Revision 1.1.1.1 2011/01/26 14:12:02 martin
+# Started modifications to build mbgclock.
+# Revision 1.1 2011/01/26 13:56:32 martin
+# Initial skeleton based on FreeBSD's mypci.c sample program by Murray Stokely.
+#
+#########################################################################
+
+KMOD= mbgclock
+
+MBGLIB= ../mbglib
+MBGLIB_COMMON= $(MBGLIB)/common
+MBGLIB_BSD= $(MBGLIB)/bsd
+
+.PATH: $(MBGLIB_COMMON) $(MBGLIB_BSD)
+
+CFLAGS= -I$(MBGLIB_COMMON) -I$(MBGLIB_BSD)
+
+.ifdef DEBUG
+CFLAGS+= -D DEBUG=$(DEBUG)
+.endif
+
+SRCS= mbgdrvr.c
+SRCS+= pcpsdrvr.c
+SRCS+= identdec.c
+SRCS+= rsrc_bsd.c
+SRCS+= device_if.h bus_if.h pci_if.h
+
+CLEANFILES= *~
+CLEANFILES+= machine
+CLEANFILES+= @
+
+.include <bsd.kmod.mk>
diff --git a/src/external/bsd/meinberg/dist/mbgclock/Makefile.nbsd b/src/external/bsd/meinberg/dist/mbgclock/Makefile.nbsd
new file mode 100755
index 0000000..7dd2450
--- /dev/null
+++ b/src/external/bsd/meinberg/dist/mbgclock/Makefile.nbsd
@@ -0,0 +1,48 @@
+
+#########################################################################
+#
+# $Id: Makefile 1.1.1.4 2011/02/03 14:10:39 martin TEST martin $
+#
+# Description:
+# Makefile for mbgclock driver to support Meinberg bus level
+# devices under FreeBSD.
+#
+# -----------------------------------------------------------------------
+# $Log: Makefile $
+# Revision 1.1.1.4 2011/02/03 14:10:39 martin
+# Revision 1.1.1.3 2011/01/26 17:38:58 martin
+# Add support for DEBUG build.
+# Revision 1.1.1.2 2011/01/26 16:36:37 martin
+# Enabled all required source files.
+# Revision 1.1.1.1 2011/01/26 14:12:02 martin
+# Started modifications to build mbgclock.
+# Revision 1.1 2011/01/26 13:56:32 martin
+# Initial skeleton based on FreeBSD's mypci.c sample program by Murray Stokely.
+#
+#########################################################################
+
+KMOD= mbgclock
+
+MBGLIB= ../mbglib
+MBGLIB_COMMON= $(MBGLIB)/common
+MBGLIB_BSD= $(MBGLIB)/bsd
+
+.PATH: $(MBGLIB_COMMON) $(MBGLIB_BSD)
+
+CFLAGS= -I$(MBGLIB_COMMON) -I$(MBGLIB_BSD)
+
+.ifdef DEBUG
+CFLAGS+= -D DEBUG=$(DEBUG)
+.endif
+
+SRCS= mbgdrvr.c
+SRCS+= pcpsdrvr.c
+SRCS+= identdec.c
+SRCS+= rsrc_bsd.c
+SRCS+= device_if.h bus_if.h pci_if.h
+
+CLEANFILES= *~
+CLEANFILES+= machine
+CLEANFILES+= @
+
+.include <bsd.kmod.mk>
diff --git a/src/external/bsd/meinberg/dist/mbgclock/mbgdrvr.c b/src/external/bsd/meinberg/dist/mbgclock/mbgdrvr.c
new file mode 100755
index 0000000..e2f968c
--- /dev/null
+++ b/src/external/bsd/meinberg/dist/mbgclock/mbgdrvr.c
@@ -0,0 +1,725 @@
+
+/**************************************************************************
+ *
+ * $Id: mbgdrvr.c 1.1.1.11.1.3 2011/03/25 11:06:27 martin TRASH martin $
+ *
+ * Description:
+ * Main file for for mbgclock driver to support Meinberg bus level
+ * devices under FreeBSD.
+ *
+ * The binary is a loadable module called mbgclock which implements
+ * /dev/mbgclock* devices.
+ *
+ * Based on FreeBSD's mypci.c sample program by Murray Stokely.
+ *
+ * -----------------------------------------------------------------------
+ * $Log: mbgdrvr.c $
+ * Revision 1.1.1.11.1.3 2011/03/25 11:06:27 martin
+ * Fixed typo.
+ * Revision 1.1.1.11.1.2 2011/03/23 16:49:53 martin
+ * Syntax fix.
+ * Revision 1.1.1.11.1.1 2011/03/22 12:09:16 martin
+ * Started to support NetBSD.
+ * Revision 1.1.1.11 2011/02/04 14:44:19 martin
+ * Revision 1.1.1.10 2011/02/02 12:33:52 martin
+ * Revision 1.1.1.9 2011/02/01 17:11:38 martin
+ * Revision 1.1.1.8 2011/02/01 14:49:42 martin
+ * Revision 1.1.1.7 2011/02/01 12:12:17 martin
+ * Revision 1.1.1.6 2011/01/31 17:28:56 martin
+ * Modified resource handling.
+ * Revision 1.1.1.5 2011/01/28 09:31:21 martin
+ * Fixed debug/non-debug build.
+ * Revision 1.1.1.4 2011/01/27 15:15:23 martin
+ * Loads and unloads properly. Calls pcps_start_device() which
+ * properly reads some data from a card.
+ * Revision 1.1.1.3 2011/01/26 16:37:18 martin
+ * Ioctl support compiled in.
+ * Revision 1.1.1.2 2011/01/26 15:05:53 martin
+ * Revision 1.1.1.1 2011/01/26 14:34:33 martin
+ * Started modifications to build mbgclock.
+ * Revision 1.1 2011/01/26 13:56:32 martin
+ * Initial skeleton based on FreeBSD's mypci.c sample program by Murray Stokely.
+ *
+ **************************************************************************/
+
+#include <pcpsdrvr.h>
+#include <mbgddmsg.h>
+
+#include <sys/param.h> /* defines used in kernel.h */
+#include <sys/module.h>
+#include <sys/systm.h>
+#include <sys/errno.h>
+#include <sys/kernel.h> /* types used in module initialization */
+#include <sys/conf.h> /* cdevsw struct */
+#include <sys/uio.h> /* uio struct */
+#include <sys/malloc.h>
+#include <sys/bus.h> /* structs, prototypes for pci bus stuff */
+
+#if defined( MBG_TGT_FREEBSD )
+ #include <sys/rman.h>
+#endif
+
+#include <dev/pci/pcivar.h> /* For pci_get macros! */
+#include <dev/pci/pcireg.h>
+
+
+
+#if 1 //##++ move this elsewhere!
+
+#define REV_NUM 0x100
+#define REV_NUM_STR "1.00"
+
+#define MBG_COPYRIGHT "(c) Meinberg 2011"
+
+#define MBG_DRVR_NAME "mbgclock"
+#define MBGCLK_NAME "mbgclk"
+#define MBGNTP_NAME "mbgntp"
+
+const char pcps_driver_name[] = MBG_DRVR_NAME;
+
+static MBG_DBG_DATA mbg_dbg_data;
+static MBG_DBG_PORT mbg_dbg_port = 0x378 + 0; //##++
+static PCPS_IO_ADDR_MAPPED mbg_dbg_port_mapped; //##++
+
+static PCPS_DRVR_INFO drvr_info = { REV_NUM, 0, MBG_DRVR_NAME " radio clock driver" };
+
+#if defined( DEBUG )
+int debug = DEBUG;
+#endif
+
+MALLOC_DEFINE( M_MBGCLOCK, "short desc", "long desc" );
+
+#include <macioctl.h>
+
+#endif
+
+
+
+/* The softc holds our per-instance data. */
+struct mbgclock_softc
+{
+ device_t device;
+ struct cdev *cdev;
+ PCPS_DDEV *pddev;
+};
+
+
+/* Function prototypes */
+#if defined( MBG_TGT_NETBSD )
+ static int mbgclock_open( dev_t, int, int, struct proc * );
+ static int mbgclock_close( dev_t, int, int, struct proc * );
+ static int mbgclock_read( dev_t dev, struct uio *, int );
+#else // FreeBSD
+ static d_open_t mbgclock_open;
+ static d_close_t mbgclock_close;
+ static d_read_t mbgclock_read;
+ static d_write_t mbgclock_write;
+ static d_ioctl_t mbgclock_ioctl;
+#endif
+
+
+/* Character device entry points */
+
+static struct cdevsw mbgclock_cdevsw =
+{
+#if defined( MBG_TGT_NETBSD )
+
+#if 0 //##+++++++
+ .d_open = mbgclock_open,
+ .d_close = mbgclock_close,
+ .d_read = mbgclock_read,
+ .d_write = mbgclock_write,
+ .d_ioctl = mbgclock_ioctl,
+ .d_name = "mbgclock"
+#endif
+
+#else // FreeBSD
+ .d_version = D_VERSION,
+ .d_open = mbgclock_open,
+ .d_close = mbgclock_close,
+ .d_read = mbgclock_read,
+ .d_write = mbgclock_write,
+ .d_ioctl = mbgclock_ioctl,
+ .d_name = "mbgclock"
+#endif
+};
+
+
+
+static __mbg_inline
+void set_dev_connected( PCPS_DDEV *pddev, int state )
+{
+ _mbgddmsg_4( MBG_DBG_DETAIL, "%s: setting dev %s_%s connected state to %i",
+ pcps_driver_name, _pcps_ddev_type_name( pddev ), _pcps_ddev_sernum( pddev ),
+ state );
+ atomic_store_rel_int( &pddev->connected, state );
+
+} // set_dev_connected
+
+
+
+/*
+ * In the cdevsw routines, we find our softc by using the si_drv1 member
+ * of struct cdev. We set this variable to point to our softc in our
+ * attach routine when we create the /dev entry.
+ */
+#if defined( MBG_TGT_NETBSD )
+
+#if 0 //##++++
+int
+mbgclock_open( dev_t, int, int, struct proc * )
+{
+} // mbgclock_open
+#endif
+
+#else // FreeBSD
+
+int
+mbgclock_open( struct cdev *dev, int oflags, int devtype, d_thread_t *td )
+{
+ struct mbgclock_softc *psc = dev->si_drv1;
+ PCPS_DDEV *pddev = psc->pddev;
+
+ _mbgddmsg_3( MBG_DBG_INFO, "%s: dev %s_%s opened successfully.", pcps_driver_name,
+ _pcps_ddev_type_name( pddev ), _pcps_ddev_sernum( pddev ) );
+
+ atomic_add_int( &pddev->open_count, 1 );
+
+ return 0;
+
+} // mbgclock_open
+
+#endif
+
+
+#if defined( MBG_TGT_NETBSD )
+
+#else // FreeBSD
+
+int
+mbgclock_close( struct cdev *dev, int fflag, int devtype, d_thread_t *td )
+{
+ struct mbgclock_softc *psc = dev->si_drv1;
+ PCPS_DDEV *pddev = psc->pddev;
+
+ atomic_subtract_int( &pddev->open_count, 1 );
+
+ _mbgddmsg_3( MBG_DBG_INFO, "%s: dev %s_%s closed.", pcps_driver_name,
+ _pcps_ddev_type_name( pddev ), _pcps_ddev_sernum( pddev ) );
+
+ return 0;
+
+} // mbgclock_close
+
+#endif
+
+
+#if defined( MBG_TGT_NETBSD )
+
+#else // FreeBSD
+
+int
+mbgclock_read( struct cdev *dev, struct uio *uio, int ioflag )
+{
+ #if defined( DEBUG )
+ struct mbgclock_softc *psc = dev->si_drv1;
+ PCPS_DDEV *pddev = psc->pddev;
+
+ _mbgddmsg_4( MBG_DBG_INFO, "%s: dev %s_%s asked to read %li bytes",
+ pcps_driver_name, _pcps_ddev_type_name( pddev ),
+ _pcps_ddev_sernum( pddev ), (long) uio->uio_resid );
+ #endif
+
+ return 0;
+
+} // mbgclock_read
+
+#endif
+
+
+#if defined( MBG_TGT_NETBSD )
+
+#else // FreeBSD
+
+int
+mbgclock_write( struct cdev *dev, struct uio *uio, int ioflag )
+{
+ #if defined( DEBUG )
+ struct mbgclock_softc *psc = dev->si_drv1;
+ PCPS_DDEV *pddev = psc->pddev;
+
+ _mbgddmsg_4( MBG_DBG_INFO, "%s: dev %s_%s asked to write %li bytes",
+ pcps_driver_name, _pcps_ddev_type_name( pddev ),
+ _pcps_ddev_sernum( pddev ), (long) uio->uio_resid );
+ #endif
+
+ return 0;
+
+} // mbgclock_write
+
+#endif
+
+
+
+#if defined( MBG_TGT_NETBSD ) //##++++++++++++
+
+// Below there are some dummy declarations to make the IOCTL handler
+// for FreeBSD *compile* without errors under NetBSD.
+// This is mainly to see if ioctl_switch() compiles without errors.
+
+#define caddr_t void *
+
+struct thread
+{
+ int dummy;
+};
+
+#endif
+
+int
+mbgclock_ioctl( struct cdev *dev, u_long cmd, caddr_t data,
+ int32_t flag, struct thread *td )
+{
+#if defined( MBG_TGT_NETBSD )
+ struct mbgclock_softc *psc = NULL; //##++++ dummy, just to avoid build error
+#else // FreeBSD
+ struct mbgclock_softc *psc = dev->si_drv1;
+#endif
+ PCPS_DDEV *pddev = psc->pddev;
+ int rc;
+
+ rc = ioctl_switch( pddev, cmd, (void *) data, (void *) data );
+
+ // On success we return quickly.
+
+ if ( rc == MBG_SUCCESS )
+ {
+ _mbgddmsg_5( MBG_DBG_INFO, "%s: %p IOCTL 0x%02lX: success, dev %s_%s",
+ pcps_driver_name, dev, cmd, _pcps_ddev_type_name( pddev ), _pcps_ddev_sernum( pddev ) );
+ goto out;
+ }
+
+
+ // An error has occurred.
+ // Generate an appropriate debug/error message
+ // and return an error status.
+
+ switch ( rc )
+ {
+ case MBG_ERR_INV_DEV_REQUEST:
+ _mbgddmsg_6( MBG_DBG_WARN, "%s: %p ioctl 0x%02lX: invalid cmd %04lX, dev %s_%s",
+ pcps_driver_name, dev, cmd, IOCBASECMD( cmd ),
+ _pcps_ddev_type_name( pddev ), _pcps_ddev_sernum( pddev ) );
+ rc = -EINVAL;
+ break;
+
+
+ case MBG_ERR_NOT_SUPP_BY_DEV:
+ _mbgddmsg_5( MBG_DBG_WARN, "%s: %p ioctl 0x%02lX: not supported by dev %s_%s",
+ pcps_driver_name, dev, cmd, _pcps_ddev_type_name( pddev ), _pcps_ddev_sernum( pddev ) );
+ rc = -EIO;
+ break;
+
+
+ case MBG_ERR_NO_MEM:
+ _mbgddmsg_5( MBG_DBG_WARN, "%s: %p ioctl 0x%02lX: unable to allocate buffer for dev %s_%s",
+ pcps_driver_name, dev, cmd, _pcps_ddev_type_name( pddev ), _pcps_ddev_sernum( pddev ) );
+ rc = -EFAULT;
+ break;
+
+
+ case MBG_ERR_IRQ_UNSAFE:
+ _mbgddmsg_5( MBG_DBG_DETAIL, "%s: %p ioctl 0x%02lX: busy since unsafe IRQ enabled, dev %s_%s",
+ pcps_driver_name, dev, cmd, _pcps_ddev_type_name( pddev ), _pcps_ddev_sernum( pddev ) );
+ rc = -EBUSY;
+ break;
+
+
+ default: // any access error code returned by the low level routine
+ // or copying from or to user space
+ _mbgddmsg_6( MBG_DBG_WARN, "%s: %p ioctl 0x%02lX: error %i accessing dev %s_%s",
+ pcps_driver_name, dev, cmd, rc, _pcps_ddev_type_name( pddev ), _pcps_ddev_sernum( pddev ) );
+ rc = -EFAULT;
+
+ } // switch error rc
+
+
+out:
+ return rc;
+
+} // mbgclock_ioctl
+
+
+
+/* PCI Support Functions */
+
+static void
+mbg_deallocate_resource( device_t device, BSD_RSRC_INFO *p_ri, int type )
+{
+ if ( p_ri->res )
+ {
+#if defined( MBG_TGT_NETBSD )
+ //##++++++
+#else // FreeBSD
+ bus_deactivate_resource( device, type,
+ p_ri->rid, p_ri->res );
+ bus_release_resource( device, type,
+ p_ri->rid, p_ri->res );
+#endif
+ p_ri->res = NULL;
+ }
+
+} // mbg_deallocate_resource
+
+
+
+/*
+ * deallocate resources
+ */
+static void
+mbg_dealloc_rsrcs( device_t device )
+{
+#if defined( MBG_TGT_NETBSD )
+ //##++++++
+#else // FreeBSD
+ struct mbgclock_softc *psc = device_get_softc( device );
+ PCPS_DDEV *pddev = psc->pddev;
+ PCPS_RSRC_INFO *prsrci = &pddev->rsrc_info;
+ int i;
+
+// mbg_deallocate_resource( device, &prsrci->irq.bsd, SYS_RES_IRQ );
+
+ for ( i = 0; i < N_PCPS_MEM_RSRC; i++ )
+ mbg_deallocate_resource( device, &prsrci->mem[i].bsd, SYS_RES_MEMORY );
+
+ for ( i = 0; i < N_PCPS_PORT_RSRC; i++ )
+ mbg_deallocate_resource( device, &prsrci->port[i].bsd, SYS_RES_IOPORT );
+#endif
+
+} // mbg_dealloc_rsrcs
+
+
+
+static void
+mbg_alloc_rsrc( device_t device, int rid, BSD_RSRC_INFO *p_ri, int type, int flags )
+{
+#if defined( MBG_TGT_NETBSD )
+ //##++++++
+#else // FreeBSD
+ p_ri->rid = rid;
+
+ p_ri->res = bus_alloc_resource_any( device, type, &p_ri->rid, flags );
+
+ if ( p_ri->res )
+ {
+ p_ri->bst = rman_get_bustag( p_ri->res );
+ p_ri->bsh = rman_get_bushandle( p_ri->res );
+ }
+#endif
+
+} // mbg_alloc_rsrc
+
+
+
+static void
+mbg_alloc_rsrcs( device_t device )
+{
+#if defined( MBG_TGT_NETBSD )
+ //##++++++
+#else // FreeBSD
+ struct mbgclock_softc *psc = device_get_softc( device );
+ PCPS_DDEV *pddev = psc->pddev;
+ PCPS_RSRC_INFO *prsrci = &pddev->rsrc_info;
+ BSD_RSRC_INFO ri;
+ int bar;
+
+// _mbgddmsg_3( MBG_DBG_INIT_DEV, "%s: alloc I/O range %i: PCI device 0x%04X:0x%04X supported",
+// pcps_driver_name, vend_id, dev_id );
+
+ for ( bar = 0; bar < 5; bar ++ )
+ {
+ int rid = PCIR_BAR( bar );
+
+ if ( prsrci->num_rsrc_io < N_PCPS_PORT_RSRC )
+ {
+ mbg_alloc_rsrc( device, rid, &ri, SYS_RES_IOPORT, RF_ACTIVE );
+
+ if ( ri.res )
+ {
+ prsrci->port[prsrci->num_rsrc_io].bsd = ri;
+ pcps_add_rsrc_io( pddev, rman_get_start( ri.res ), rman_get_size( ri.res ) );
+ continue;
+ }
+ }
+
+ if ( prsrci->num_rsrc_mem < N_PCPS_MEM_RSRC )
+ {
+ mbg_alloc_rsrc( device, rid, &ri, SYS_RES_MEMORY, RF_ACTIVE );
+
+ if ( ri.res )
+ {
+ prsrci->mem[prsrci->num_rsrc_mem].bsd = ri;
+ pcps_add_rsrc_mem( pddev, rman_get_start( ri.res ), rman_get_size( ri.res ) );
+ continue;
+ }
+ }
+ }
+
+
+ // single IRQ resource
+#if 0 // currently not used / required
+ mbg_alloc_rsrc( device, 0, &ri, SYS_RES_IRQ, RF_SHAREABLE | RF_ACTIVE );
+
+ if ( ri.res )
+ {
+ prsrci->port[prsrci->num_rsrc_irq].bsd = ri;
+ pcps_add_rsrc_irq( pddev, rman_get_start( ri.res ) );
+ }
+#endif
+
+#endif
+
+} // mbg_alloc_rsrcs
+
+
+
+/*
+ * Probe: compare the device ID of this device against the IDs that this driver
+ * supports. If there is a match, set the description and return success.
+ */
+static int
+mbgclock_probe( device_t device )
+{
+#if defined( MBG_TGT_NETBSD )
+ //##++++++
+#else // FreeBSD
+ uint16_t vend_id = pci_get_vendor( device );
+ uint16_t dev_id = pci_get_device( device );
+ PCPS_DEV_TYPE *pdt;
+
+
+ if ( vend_id != PCI_VENDOR_MEINBERG )
+ goto fail;
+
+ pdt = pcps_get_dev_type( PCPS_BUS_PCI, dev_id );
+
+ if ( pdt == NULL )
+ goto fail;
+
+ device_set_desc( device, pdt->name );
+
+ _mbgddmsg_3( MBG_DBG_INIT_DEV, "%s: probe: PCI device 0x%04X:0x%04X supported",
+ pcps_driver_name, vend_id, dev_id );
+
+ return BUS_PROBE_DEFAULT;
+
+
+fail:
+ _mbgddmsg_3( MBG_DBG_INIT_DEV, "%s: probe: PCI device 0x%04X:0x%04X not supported",
+ pcps_driver_name, vend_id, dev_id );
+ return ENXIO;
+
+#endif
+
+} // mbgclock_probe
+
+
+
+/*
+ * Attach function is only called if the probe is successful.
+ */
+static int
+mbgclock_attach( device_t device )
+{
+#if defined( MBG_TGT_NETBSD )
+ //##++++++
+#else // FreeBSD
+ uint16_t dev_id = pci_get_device( device );
+ struct mbgclock_softc *psc = device_get_softc( device );
+ int rc;
+
+ _mbgddmsg_2( MBG_DBG_INIT_DEV, "%s: attach for device 0x%04X",
+ pcps_driver_name, dev_id );
+
+ psc->pddev = pcps_alloc_ddev();
+
+ if ( psc->pddev == NULL )
+ {
+ _mbgddmsg_2( MBG_DBG_INIT_DEV, "%s: attach device 0x%04X: pcps_alloc_ddev() failed",
+ pcps_driver_name, dev_id );
+ rc = ENOMEM;
+ goto fail;
+ }
+
+
+ rc = pcps_init_ddev( psc->pddev, PCPS_BUS_PCI, dev_id );
+
+ if ( rc != PCPS_SUCCESS )
+ {
+ _mbgddmsg_3( MBG_DBG_INIT_DEV, "%s: attach device 0x%04X: pcps_init_ddev() failed, rc: %i",
+ pcps_driver_name, dev_id, rc );
+ rc = ENXIO;
+ goto fail;
+ }
+
+
+ //##++++++ rc = pci_enable_device( dev );
+
+
+ mbg_alloc_rsrcs( device );
+
+ //##++++++ rc = pcps_start_device( pddev, device->bus->number, device->devfn );
+ rc = pcps_start_device( psc->pddev, 0, 0 );
+
+ if ( rc != PCPS_SUCCESS )
+ {
+ _mbgddmsg_3( MBG_DBG_INIT_DEV, "%s: attach device 0x%04X: pcps_start_device() failed, rc: %i",
+ pcps_driver_name, dev_id, rc );
+ rc = ENXIO;
+ goto fail;
+ }
+
+
+ set_dev_connected( psc->pddev, 1 );
+
+ /* Initialize our softc. */
+ psc->device = device;
+ /*
+ * Create a /dev entry for this device. The kernel will assign us
+ * a major number automatically. We use the unit number of this
+ * device as the minor number and name the character device
+ * "mbgclock<unit>".
+ */
+ psc->cdev = make_dev( &mbgclock_cdevsw, device_get_unit( device ),
+ UID_ROOT, GID_WHEEL, 0600, "mbgclock%u", device_get_unit( device ) );
+
+ psc->cdev->si_drv1 = psc;
+
+ _mbgddmsg_2( MBG_DBG_INIT_DEV, "%s: device 0x%04X attached successfully",
+ pcps_driver_name, dev_id );
+
+ return 0;
+
+
+fail:
+ mbg_dealloc_rsrcs( device );
+
+ if ( psc->pddev )
+ pcps_free_ddev( psc->pddev );
+
+ _mbgddmsg_2( MBG_DBG_INIT_DEV, "%s: failed to attach device 0x%04X",
+ pcps_driver_name, dev_id );
+ return rc;
+#endif
+
+} // mbgclock_attach
+
+
+
+/*
+ * Detach device.
+ */
+static int
+mbgclock_detach( device_t device )
+{
+#if defined( MBG_TGT_NETBSD )
+ //##++++++
+#else // FreeBSD
+ #if defined( DEBUG )
+ uint16_t dev_id = pci_get_device( device );
+ #endif
+ struct mbgclock_softc *psc;
+ PCPS_DDEV *pddev;
+
+ _mbgddmsg_2( MBG_DBG_INIT_DEV, "%s: detach for device 0x%04X",
+ pcps_driver_name, dev_id );
+
+ /* Teardown the state in our softc created in our attach routine. */
+ psc = device_get_softc( device );
+ pddev = psc->pddev;
+
+ set_dev_connected( pddev, 0 );
+
+// pcps_free_ddev( pddev ); //##++++++ should wait for outstanding requests
+
+ mbg_dealloc_rsrcs( device );
+
+ destroy_dev( psc->cdev );
+
+ _mbgddmsg_2( MBG_DBG_INIT_DEV, "%s: device 0x%04X detached",
+ pcps_driver_name, dev_id );
+#endif
+
+ return 0;
+
+} // mbgclock_detach
+
+
+
+/*
+ * Called during system shutdown after sync.
+ */
+static int
+mbgclock_shutdown( device_t device )
+{
+ printf( "mbgclock shutdown!\n" );
+
+ return 0;
+
+} // mbgclock_shutdown
+
+
+
+/*
+ * Device suspend routine.
+ */
+static int
+mbgclock_suspend( device_t device )
+{
+ printf( "mbgclock suspend!\n" );
+
+ return 0;
+
+} // mbgclock_suspend
+
+
+
+/*
+ * Device resume routine.
+ */
+static int
+mbgclock_resume( device_t device )
+{
+ printf( "mbgclock resume!\n" );
+
+ return 0;
+
+} // mbgclock_resume
+
+
+
+#if defined( MBG_TGT_NETBSD )
+ //##++++++
+#else // FreeBSD
+static device_method_t mbgclock_methods[] =
+{
+ /* Device interface */
+ DEVMETHOD( device_probe, mbgclock_probe ),
+ DEVMETHOD( device_attach, mbgclock_attach ),
+ DEVMETHOD( device_detach, mbgclock_detach ),
+ DEVMETHOD( device_shutdown, mbgclock_shutdown ),
+ DEVMETHOD( device_suspend, mbgclock_suspend ),
+ DEVMETHOD( device_resume, mbgclock_resume ),
+ { 0, 0 }
+};
+#endif
+
+
+#if defined( MBG_TGT_NETBSD )
+ //##++++++
+#else // FreeBSD
+static devclass_t mbgclock_devclass;
+
+DEFINE_CLASS_0( mbgclock, mbgclock_driver, mbgclock_methods, sizeof( struct mbgclock_softc ) );
+DRIVER_MODULE( mbgclock, pci, mbgclock_driver, mbgclock_devclass, 0, 0 );
+#endif
diff --git a/src/external/bsd/meinberg/mbgclock/Makefile b/src/external/bsd/meinberg/mbgclock/Makefile
index 85ad982..85ad982 100755..100644
--- a/src/external/bsd/meinberg/mbgclock/Makefile
+++ b/src/external/bsd/meinberg/mbgclock/Makefile
diff --git a/src/external/bsd/meinberg/mbgclock/Makefile.kmod b/src/external/bsd/meinberg/mbgclock/Makefile.kmod
index ab1d577..ab1d577 100755..100644
--- a/src/external/bsd/meinberg/mbgclock/Makefile.kmod
+++ b/src/external/bsd/meinberg/mbgclock/Makefile.kmod
diff --git a/src/external/bsd/meinberg/mbgclock/files.mbgclock b/src/external/bsd/meinberg/mbgclock/files.mbgclock
index 3a9f782..3a9f782 100755..100644
--- a/src/external/bsd/meinberg/mbgclock/files.mbgclock
+++ b/src/external/bsd/meinberg/mbgclock/files.mbgclock
diff --git a/src/external/bsd/meinberg/mbgclock/mbgclockdrvr.c b/src/external/bsd/meinberg/mbgclock/mbgclockdrvr.c
index 4d17032..fd32411 100755..100644
--- a/src/external/bsd/meinberg/mbgclock/mbgclockdrvr.c
+++ b/src/external/bsd/meinberg/mbgclock/mbgclockdrvr.c
@@ -1,5 +1,5 @@
/*
- * $Header: /repository/clkdrv/bsd/netbsd/soft/mbgtools-nbsd/mbgclock/rcs/mbgclockdrvr.c 1.1.1.1 2011/03/29 13:30:34 martin TRASH martin $
+ * $Header$
*
* NetBSD Meinberg mbgclock driver, Frank Kardel
*
@@ -232,10 +232,39 @@ MOD_DRV("mbgclock",
mbgclock_cfattachinit,
mbgclock_cfdata);
+static int
+mbgclock_lkmload(struct lkm_table *lkm, int cmd)
+{
+ int bmajor = -1;
+ int cmajor = -1;
+ int error;
+
+ error = devsw_attach("mbgclock", NULL, &bmajor,
+ &mbgclock_cdevsw, &cmajor);
+
+#ifdef DEBUG
+ if (error == 0) {
+ DPRINTF(DB_FOLLOW, ("%s: registered character major = %d\n",
+ mbgclock_cd.cd_name, cmajor));
+ } else {
+ DPRINTF(DB_FOLLOW, ("%s: device driver registry failed errno = %d\n",
+ mbgclock_cd.cd_name, error));
+ }
+#endif
+ return error;
+}
+
+static int
+mbgclock_lkmunload(struct lkm_table *lkm, int cmd)
+{
+ devsw_detach(NULL, &mbgclock_cdevsw);
+ return 0;
+}
+
int
mbgclock_lkmentry(struct lkm_table *lkmtp, int cmd, int ver)
{
- DISPATCH(lkmtp, cmd, ver, lkm_nofunc, lkm_nofunc, lkm_nofunc);
+ DISPATCH(lkmtp, cmd, ver, mbgclock_lkmload, mbgclock_lkmunload, lkm_nofunc);
}
#endif
@@ -519,8 +548,13 @@ mbgclock_activate(struct device *self, enum devact act)
static
int mbgclockopen(dev_t dev, int flags, int mode, struct lwp *l)
{
+ struct mbgclock_softc *psc = device_lookup_private(&mbgclock_cd, MBG_UNIT(dev));
+
_mbgddmsg_1( MBG_DBG_INIT_DEV, "%s: open called", pcps_driver_name );
DPRINTF(DB_FOLLOW, ("mbgclockopen(0x%"PRIx64", 0x%x, 0x%x, %p)\n", dev, flags, mode, l));
+
+ if (psc == NULL)
+ return ENXIO;
return 0;
}
@@ -528,27 +562,42 @@ int mbgclockopen(dev_t dev, int flags, int mode, struct lwp *l)
static
int mbgclockclose(dev_t dev, int flags, int mode, struct lwp *l)
{
+ struct mbgclock_softc *psc = device_lookup_private(&mbgclock_cd, MBG_UNIT(dev));
+
_mbgddmsg_1( MBG_DBG_INIT_DEV, "%s: close called", pcps_driver_name );
DPRINTF(DB_FOLLOW,("mbgclockclose(0x%"PRIx64", 0x%x, 0x%x, %p)\n", dev, flags, mode, l));
+ if (psc == NULL)
+ return ENXIO;
+
return 0;
}
static
int mbgclockread(dev_t dev, struct uio *uio, int flags)
{
+ struct mbgclock_softc *psc = device_lookup_private(&mbgclock_cd, MBG_UNIT(dev));
+
_mbgddmsg_1( MBG_DBG_INIT_DEV, "%s: read called", pcps_driver_name );
DPRINTF(DB_FOLLOW,("mbgclockread(0x%"PRIx64", %p)\n", dev, uio));
+ if (psc == NULL)
+ return ENXIO;
+
return 0;
}
static
int mbgclockwrite(dev_t dev, struct uio *uio, int flags)
{
+ struct mbgclock_softc *psc = device_lookup_private(&mbgclock_cd, MBG_UNIT(dev));
+
_mbgddmsg_1( MBG_DBG_INIT_DEV, "%s: write called", pcps_driver_name );
DPRINTF(DB_FOLLOW, ("mbgclockwrite(0x%"PRIx64", %p)\n", dev, uio));
+ if (psc == NULL)
+ return ENXIO;
+
return 0;
}
@@ -558,13 +607,18 @@ static
int mbgclockioctl(dev_t dev, u_long cmd, void *data, int flag, struct lwp *l)
{
struct mbgclock_softc *psc = device_lookup_private(&mbgclock_cd, MBG_UNIT(dev));
- PCPS_DDEV *pddev = psc->pddev;
+ PCPS_DDEV *pddev;
int rc;
_mbgddmsg_1( MBG_DBG_INIT_DEV, "%s: ioctl called", pcps_driver_name );
DPRINTF(DB_FOLLOW, ("mbgclockioctl(0x%"PRIx64", 0x%lx, %p, 0x%x, %p)\n",
dev, cmd, data, flag, l->l_proc));
+ if (psc == NULL)
+ return ENXIO;
+
+ pddev = psc->pddev;
+
rc = ioctl_switch( pddev, cmd, (void *) data, (void *) data );
/* On success we return quickly.*/
@@ -588,28 +642,28 @@ int mbgclockioctl(dev_t dev, u_long cmd, void *data, int flag, struct lwp *l)
_mbgddmsg_7( MBG_DBG_WARN, "%s: %d,%d ioctl 0x%04lX: invalid cmd %04lX, dev %s_%s",
pcps_driver_name, major(dev), minor(dev), cmd, IOCBASECMD( cmd ),
_pcps_ddev_type_name( pddev ), _pcps_ddev_sernum( pddev ) );
- rc = -EINVAL;
+ rc = EINVAL;
break;
case MBG_ERR_NOT_SUPP_BY_DEV:
_mbgddmsg_6( MBG_DBG_WARN, "%s: %d,%d ioctl 0x%02lX: not supported by dev %s_%s",
pcps_driver_name, major(dev), minor(dev), cmd, _pcps_ddev_type_name( pddev ), _pcps_ddev_sernum( pddev ) );
- rc = -EIO;
+ rc = EIO; /* XXX ENODEV */
break;
case MBG_ERR_NO_MEM:
_mbgddmsg_6( MBG_DBG_WARN, "%s: %d,%d ioctl 0x%02lX: unable to allocate buffer for dev %s_%s",
pcps_driver_name, major(dev), minor(dev), cmd, _pcps_ddev_type_name( pddev ), _pcps_ddev_sernum( pddev ) );
- rc = -EFAULT;
+ rc = EFAULT; /* XXX ENOMEM */
break;
case MBG_ERR_IRQ_UNSAFE:
_mbgddmsg_6( MBG_DBG_DETAIL, "%s: %d,%d ioctl 0x%02lX: busy since unsafe IRQ enabled, dev %s_%s",
pcps_driver_name, major(dev), minor(dev), cmd, _pcps_ddev_type_name( pddev ), _pcps_ddev_sernum( pddev ) );
- rc = -EBUSY;
+ rc = EBUSY;
break;
@@ -617,7 +671,7 @@ int mbgclockioctl(dev_t dev, u_long cmd, void *data, int flag, struct lwp *l)
/* or copying from or to user space */
_mbgddmsg_7( MBG_DBG_WARN, "%s: %d,%d ioctl 0x%02lX: error %i accessing dev %s_%s",
pcps_driver_name, major(dev), minor(dev), cmd, rc, _pcps_ddev_type_name( pddev ), _pcps_ddev_sernum( pddev ) );
- rc = EFAULT;
+ rc = EFAULT; /* XXX EFAULT is inappropriate */
}