diff options
author | Martin Burnicki <martin.burnicki@meinberg.de> | 2011-03-29 12:01:00 +0200 |
---|---|---|
committer | Martin Burnicki <martin.burnicki@meinberg.de> | 2011-03-29 12:01:00 +0200 |
commit | e298aa8eae6cd5d53e7579ce9ac49c58d496b7e6 (patch) | |
tree | 122b309177b2dcc8424076f20444de5937f54fda | |
parent | 6876bb99175610e97837b5448e3aacddad83bfe3 (diff) | |
download | mbgtools-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/Makefile | 0 | ||||
-rw-r--r--[-rwxr-xr-x] | src/external/bsd/meinberg/Makefile.inc | 0 | ||||
-rwxr-xr-x | src/external/bsd/meinberg/dist/mbgclock/Makefile | 48 | ||||
-rwxr-xr-x | src/external/bsd/meinberg/dist/mbgclock/Makefile.nbsd | 48 | ||||
-rwxr-xr-x | src/external/bsd/meinberg/dist/mbgclock/mbgdrvr.c | 725 | ||||
-rw-r--r--[-rwxr-xr-x] | src/external/bsd/meinberg/mbgclock/Makefile | 0 | ||||
-rw-r--r--[-rwxr-xr-x] | src/external/bsd/meinberg/mbgclock/Makefile.kmod | 0 | ||||
-rw-r--r--[-rwxr-xr-x] | src/external/bsd/meinberg/mbgclock/files.mbgclock | 0 | ||||
-rw-r--r--[-rwxr-xr-x] | src/external/bsd/meinberg/mbgclock/mbgclockdrvr.c | 70 |
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 */ } |