[svn-commits] fjoe: freebsd/trunk r8718 - in /freebsd/trunk: drivers/dahdi/wcte12xp/ freebs...
SVN commits to the Digium repositories
svn-commits at lists.digium.com
Mon May 31 22:30:25 CDT 2010
Author: fjoe
Date: Mon May 31 22:30:24 2010
New Revision: 8718
URL: http://svnview.digium.com/svn/dahdi?view=rev&rev=8718
Log:
Initial FreeBSD port.
Modified:
freebsd/trunk/drivers/dahdi/wcte12xp/base.c
freebsd/trunk/freebsd/wcte12xp/Makefile
Modified: freebsd/trunk/drivers/dahdi/wcte12xp/base.c
URL: http://svnview.digium.com/svn/dahdi/freebsd/trunk/drivers/dahdi/wcte12xp/base.c?view=diff&rev=8718&r1=8717&r2=8718
==============================================================================
--- freebsd/trunk/drivers/dahdi/wcte12xp/base.c (original)
+++ freebsd/trunk/drivers/dahdi/wcte12xp/base.c Mon May 31 22:30:24 2010
@@ -27,6 +27,18 @@
* this program for more details.
*/
+#if defined(__FreeBSD__)
+#include <sys/param.h>
+#include <sys/bus.h>
+#include <sys/module.h>
+
+#include <vm/uma.h>
+
+#include <dev/pci/pcivar.h>
+
+typedef int bool;
+#define fatal_signal_pending(x) 0
+#else /* !__FreeBSD__ */
#include <linux/kernel.h>
#include <linux/errno.h>
#include <linux/module.h>
@@ -39,8 +51,9 @@
#include <linux/workqueue.h>
#include <linux/delay.h>
#include <linux/sched.h>
-
#include <stdbool.h>
+#endif /* !__FreeBSD__ */
+
#include <dahdi/kernel.h>
#include "wct4xxp/wct4xxp.h" /* For certain definitions */
@@ -88,8 +101,12 @@
.echocan_free = echocan_free,
};
+#if defined(__FreeBSD__)
+DEFINE_SPINLOCK(ifacelock);
+#else
static struct t1 *ifaces[WC_MAX_IFACES];
spinlock_t ifacelock = SPIN_LOCK_UNLOCKED;
+#endif /* !__FreeBSD__ */
struct t1_desc {
const char *name;
@@ -99,6 +116,25 @@
static const struct t1_desc te122 = {"Wildcard TE122"};
static const struct t1_desc te121 = {"Wildcard TE121"};
+#if defined(__FreeBSD__)
+static uma_zone_t cmd_cache;
+
+static struct command *get_free_cmd(struct t1 *wc)
+{
+ struct command *cmd;
+
+ cmd = uma_zalloc(cmd_cache, M_WAITOK | M_ZERO);
+ if (cmd) {
+ INIT_LIST_HEAD(&cmd->node);
+ }
+ return cmd;
+}
+
+static void free_cmd(struct t1 *wc, struct command *cmd)
+{
+ uma_zfree(cmd_cache, cmd);
+}
+#else /* !__FreeBSD__ */
#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 20)
static kmem_cache_t *cmd_cache;
#else
@@ -120,6 +156,7 @@
{
kmem_cache_free(cmd_cache, cmd);
}
+#endif /* !__FreeBSD__ */
static struct command *get_pending_cmd(struct t1 *wc)
{
@@ -223,7 +260,7 @@
spin_unlock_irqrestore(&wc->cmd_list_lock, flags);
}
-inline void cmd_decipher_vpmadt032(struct t1 *wc, const u8 *readchunk)
+static inline void cmd_decipher_vpmadt032(struct t1 *wc, const u8 *readchunk)
{
unsigned long flags;
struct vpmadt032 *vpm = wc->vpmadt032;
@@ -665,7 +702,7 @@
unsigned int x;
unsigned long flags;
struct command *cmd;
- LIST_HEAD(list);
+ _LIST_HEAD(list);
for (x = 0; x < (wc->spantype == TYPE_E1 ? 31 : 24); x++) {
kfree(wc->chans[x]);
@@ -681,7 +718,12 @@
list_del(&cmd->node);
free_cmd(wc, cmd);
}
+#if defined(__FreeBSD__)
+ spin_lock_destroy(&wc->reglock);
+ spin_lock_destroy(&wc->cmd_list_lock);
+#else /* !__FreeBSD__ */
kfree(wc);
+#endif /* !__FreeBSD__ */
}
static void t1_release(struct t1 *wc)
@@ -1245,6 +1287,7 @@
int num;
struct pci_dev *pdev = wc->vb.pdev;
+#if !defined(__FreeBSD__)
/* Find position */
for (x = 0; x < sizeof(ifaces) / sizeof(ifaces[0]); x++) {
if (ifaces[x] == wc) {
@@ -1255,6 +1298,7 @@
if (x == sizeof(ifaces) / sizeof(ifaces[0]))
return -1;
+#endif /* !__FreeBSD__ */
t4_serial_setup(wc);
@@ -1265,13 +1309,13 @@
set_span_devicetype(wc);
snprintf(wc->span.location, sizeof(wc->span.location) - 1,
- "PCI Bus %02d Slot %02d", pdev->bus->number,
- PCI_SLOT(pdev->devfn) + 1);
+ "PCI Bus %02d Slot %02d", dahdi_pci_get_bus(pdev),
+ dahdi_pci_get_slot(pdev) + 1);
wc->span.owner = THIS_MODULE;
wc->span.spanconfig = t1xxp_spanconfig;
wc->span.chanconfig = t1xxp_chanconfig;
- wc->span.irq = pdev->irq;
+ wc->span.irq = dahdi_pci_get_irq(pdev);
wc->span.startup = t1xxp_startup;
wc->span.shutdown = t1xxp_shutdown;
wc->span.rbsbits = t1xxp_rbsbits;
@@ -1787,7 +1831,7 @@
t1_receiveprep(wc, vbb->data);
}
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 20)
+#if !defined(__FreeBSD__) && LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 20)
static void timer_work_func(void *param)
{
struct t1 *wc = param;
@@ -1818,7 +1862,11 @@
.handle_transmit = t1_handle_transmit,
};
+#if defined(__FreeBSD__)
+static int te12xp_init_one(device_t dev, const struct pci_device_id *ent)
+#else
static int __devinit te12xp_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
+#endif
{
struct t1 *wc;
struct t1_desc *d = (struct t1_desc *) ent->driver_data;
@@ -1826,6 +1874,9 @@
int res;
unsigned int index = -1;
+#if defined(__FreeBSD__)
+ wc = device_get_softc(dev);
+#else /* !__FreeBSD__ */
for (x = 0; x < sizeof(ifaces) / sizeof(ifaces[0]); x++) {
if (!ifaces[x]) {
index = x;
@@ -1845,6 +1896,7 @@
ifaces[index] = wc;
memset(wc, 0, sizeof(*wc));
+#endif /* !__FreeBSD__ */
wc->ledstate = -1;
spin_lock_init(&wc->reglock);
spin_lock_init(&wc->cmd_list_lock);
@@ -1862,23 +1914,25 @@
setup_timer(&wc->timer, te12xp_timer, (unsigned long)wc);
# endif
-# if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 20)
+# if !defined(__FreeBSD__) && LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 20)
INIT_WORK(&wc->timer_work, timer_work_func, wc);
# else
INIT_WORK(&wc->timer_work, timer_work_func);
# endif
snprintf(wc->name, sizeof(wc->name)-1, "wcte12xp%d", index);
+ wc->vb.ops = &voicebus_operations;
+#if defined(__FreeBSD__)
+ wc->vb.pdev = &wc->vb._dev;
+ wc->vb.pdev->dev = dev;
+#else /* !__FreeBSD__ */
+ wc->vb.pdev = pdev;
pci_set_drvdata(pdev, wc);
- wc->vb.ops = &voicebus_operations;
- wc->vb.pdev = pdev;
+#endif /* !__FreeBSD__ */
wc->vb.debug = &debug;
res = voicebus_init(&wc->vb, wc->name);
- if (res) {
- free_wc(wc);
- ifaces[index] = NULL;
- return res;
- }
+ if (res)
+ goto err;
if (VOICEBUS_DEFAULT_LATENCY != latency) {
voicebus_set_minlatency(&wc->vb, latency);
@@ -1887,23 +1941,20 @@
voicebus_lock_latency(&wc->vb);
if (voicebus_start(&wc->vb)) {
- voicebus_release(&wc->vb);
- free_wc(wc);
- return -EIO;
+ res = -EIO;
+ goto err;
}
t1_hardware_post_init(wc);
for (x = 0; x < (wc->spantype == TYPE_E1 ? 31 : 24); x++) {
if (!(wc->chans[x] = kmalloc(sizeof(*wc->chans[x]), GFP_KERNEL))) {
- free_wc(wc);
- ifaces[index] = NULL;
- return -ENOMEM;
+ res = -ENOMEM;
+ goto err;
}
memset(wc->chans[x], 0, sizeof(*wc->chans[x]));
if (!(wc->ec[x] = kmalloc(sizeof(*wc->ec[x]), GFP_KERNEL))) {
- free_wc(wc);
- ifaces[index] = NULL;
- return -ENOMEM;
+ res = -ENOMEM;
+ goto err;
}
memset(wc->ec[x], 0, sizeof(*wc->ec[x]));
}
@@ -1913,11 +1964,27 @@
t1_info(wc, "Found a %s\n", wc->variety);
voicebus_unlock_latency(&wc->vb);
return 0;
-}
-
+
+err:
+ voicebus_release(&wc->vb);
+ free_wc(wc);
+#if !defined(__FreeBSD__)
+ ifaces[index] = NULL;
+#endif
+ return res;
+}
+
+#if defined(__FreeBSD__)
+static void te12xp_remove_one(device_t dev)
+#else
static void __devexit te12xp_remove_one(struct pci_dev *pdev)
-{
+#endif
+{
+#if defined(__FreeBSD__)
+ struct t1 *wc = device_get_softc(dev);
+#else
struct t1 *wc = pci_get_drvdata(pdev);
+#endif
#ifdef VPM_SUPPORT
unsigned long flags;
struct vpmadt032 *vpm = wc->vpmadt032;
@@ -1934,7 +2001,9 @@
#endif
clear_bit(INITIALIZED, &wc->bit_flags);
del_timer_sync(&wc->timer);
+#if !defined(__FreeBSD__)
flush_scheduled_work();
+#endif
del_timer_sync(&wc->timer);
voicebus_release(&wc->vb);
@@ -1956,6 +2025,104 @@
{ 0 }
};
+#if defined(__FreeBSD__)
+SYSCTL_NODE(_dahdi, OID_AUTO, wcte12xp, CTLFLAG_RW, 0, "DAHDI wcte12xp");
+#define MODULE_PARAM_PREFIX "dahdi.wcte12xp"
+#define MODULE_PARAM_PARENT _dahdi_wcte12xp
+
+static int
+te12xp_device_probe(device_t dev)
+{
+ struct pci_device_id *id;
+ struct t1_desc *wd;
+
+ id = dahdi_pci_device_id_lookup(dev, te12xp_pci_tbl);
+ if (id == NULL)
+ return (ENXIO);
+
+ /* found device */
+ device_printf(dev, "vendor=%x device=%x subvendor=%x\n",
+ id->vendor, id->device, id->subvendor);
+ wd = (struct t1_desc *) id->driver_data;
+ device_set_desc(dev, wd->name);
+ return (0);
+}
+
+static int
+te12xp_device_attach(device_t dev)
+{
+ int res;
+ struct pci_device_id *id;
+
+ id = dahdi_pci_device_id_lookup(dev, te12xp_pci_tbl);
+ if (id == NULL)
+ return (ENXIO);
+
+ res = te12xp_init_one(dev, id);
+ return (-res);
+}
+
+static int
+te12xp_device_detach(device_t dev)
+{
+ te12xp_remove_one(dev);
+ return (0);
+}
+
+static int
+te12xp_init(void)
+{
+ cmd_cache = uma_zcreate("wcte12xp", sizeof(struct command),
+ NULL, NULL, NULL, NULL, 0, 0);
+ if (cmd_cache == NULL) {
+ printf("wcte12xp: can not allocate UMA zone\n");
+ return (ENXIO);
+ }
+
+ return (0);
+}
+
+static void
+te12xp_cleanup(void)
+{
+ uma_zdestroy(cmd_cache);
+}
+
+static int
+te12xp_modevent(module_t mod __unused, int type, void *data __unused)
+{
+ switch (type) {
+ case MOD_LOAD:
+ return te12xp_init();
+ case MOD_UNLOAD:
+ te12xp_cleanup();
+ return (0);
+ default:
+ return (EOPNOTSUPP);
+ }
+}
+
+static device_method_t te12xp_methods[] = {
+ DEVMETHOD(device_probe, te12xp_device_probe),
+ DEVMETHOD(device_attach, te12xp_device_attach),
+ DEVMETHOD(device_detach, te12xp_device_detach),
+ { 0, 0 }
+};
+
+static driver_t te12xp_pci_driver = {
+ "te12xp",
+ te12xp_methods,
+ sizeof(struct t1)
+};
+
+static devclass_t te12xp_devclass;
+
+DRIVER_MODULE(te12xp, pci, te12xp_pci_driver, te12xp_devclass, te12xp_modevent, 0);
+MODULE_DEPEND(te12xp, pci, 1, 1, 1);
+MODULE_DEPEND(te12xp, dahdi, 1, 1, 1);
+MODULE_DEPEND(te12xp, dahdi_voicebus, 1, 1, 1);
+MODULE_DEPEND(te12xp, firmware, 1, 1, 1);
+#else /* !__FreeBSD__ */
MODULE_DEVICE_TABLE(pci, te12xp_pci_tbl);
static struct pci_driver te12xp_driver = {
@@ -1998,6 +2165,7 @@
pci_unregister_driver(&te12xp_driver);
kmem_cache_destroy(cmd_cache);
}
+#endif /* !__FreeBSD__ */
module_param(debug, int, S_IRUGO | S_IWUSR);
module_param(loopback, int, S_IRUGO | S_IWUSR);
@@ -2016,9 +2184,11 @@
module_param(vpmnlpmaxsupp, int, S_IRUGO);
#endif
+#if !defined(__FreeBSD__)
MODULE_DESCRIPTION("Wildcard VoiceBus Digital Card Driver");
MODULE_AUTHOR("Digium Incorporated <support at digium.com>");
MODULE_LICENSE("GPL v2");
module_init(te12xp_init);
module_exit(te12xp_cleanup);
+#endif /* !__FreeBSD__ */
Modified: freebsd/trunk/freebsd/wcte12xp/Makefile
URL: http://svnview.digium.com/svn/dahdi/freebsd/trunk/freebsd/wcte12xp/Makefile?view=diff&rev=8718&r1=8717&r2=8718
==============================================================================
--- freebsd/trunk/freebsd/wcte12xp/Makefile (original)
+++ freebsd/trunk/freebsd/wcte12xp/Makefile Mon May 31 22:30:24 2010
@@ -3,7 +3,8 @@
.PATH: ${.CURDIR}/../../drivers/dahdi/wcte12xp
KMOD= wcte12xp
-SRCS= wcte12xp.c
+SRCS= base.c
SRCS+= device_if.h bus_if.h pci_if.h
+CFLAGS= -I${.CURDIR}/../../drivers/dahdi
.include <bsd.kmod.mk>
More information about the svn-commits
mailing list